Merge "Snap for 8403122 from 753dcc47fc92ebbbc17edfa1c45ab6c4a7339f0b to emu-31-release" into emu-31-release
diff --git a/.prev-version b/.prev-version
index 4deff84..f280719 100644
--- a/.prev-version
+++ b/.prev-version
@@ -1 +1 @@
-3.4.92
+3.8.1
diff --git a/.tarball-version b/.tarball-version
index 5a95802..a08ffae 100644
--- a/.tarball-version
+++ b/.tarball-version
@@ -1 +1 @@
-3.5
+3.8.2
diff --git a/.version b/.version
index 5a95802..a08ffae 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-3.5
+3.8.2
diff --git a/AUTHORS b/AUTHORS
index 63946aa..b3d8d8e 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -24,7 +24,7 @@
 
 -----
 
-Copyright (C) 1998-2015, 2018-2019 Free Software Foundation, Inc.
+Copyright (C) 1998-2015, 2018-2021 Free Software Foundation, Inc.
 
 This file is part of Bison, the GNU Compiler Compiler.
 
@@ -39,4 +39,4 @@
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
+along with this program.  If not, see <https://www.gnu.org/licenses/>.
diff --git a/Android.bp b/Android.bp
index 512d590..07acaea 100644
--- a/Android.bp
+++ b/Android.bp
@@ -15,9 +15,11 @@
 cc_defaults {
     name: "bison_defaults",
 
+    c_std: "c17",
     cflags: [
         "-Wall",
         "-Werror",
+        "-Wno-unused-parameter",
 
         "-DEXEEXT=\"\"",
     ],
@@ -40,7 +42,10 @@
                 "linux_musl-lib",
                 "lib",
             ],
-            cflags: ["-DMUSL"],
+            cflags: [
+                "-Wno-error=unused-const-variable",
+                "-DMUSL_LIBC",
+            ],
         },
     },
 }
diff --git a/COPYING b/COPYING
index 94a9ed0..f288702 100644
--- a/COPYING
+++ b/COPYING
@@ -1,7 +1,7 @@
                     GNU GENERAL PUBLIC LICENSE
                        Version 3, 29 June 2007
 
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
@@ -645,7 +645,7 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 Also add information on how to contact you by electronic and paper mail.
 
@@ -664,11 +664,11 @@
   You should also get your employer (if you work as a programmer) or school,
 if any, to sign a "copyright disclaimer" for the program, if necessary.
 For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
+<https://www.gnu.org/licenses/>.
 
   The GNU General Public License does not permit incorporating your program
 into proprietary programs.  If your program is a subroutine library, you
 may consider it more useful to permit linking proprietary applications with
 the library.  If this is what you want to do, use the GNU Lesser General
 Public License instead of this License.  But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+<https://www.gnu.org/licenses/why-not-lgpl.html>.
diff --git a/ChangeLog b/ChangeLog
index e4200fd..f7f6237 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12476 @@
+2021-09-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.8.2
+	* NEWS: Record release date.
+
+2021-09-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: Apple clang issues warning on C++11 features
+	$ cat /tmp/foo.cc
+	using foo = int;
+	foo f;
+	$ clang++ -Wc++11-extensions -c /tmp/foo.cc
+	/tmp/foo.cc:1:13: warning: alias declarations are a C++11 extension [-Wc++11-extensions]
+	using foo = int;
+	            ^
+	1 warning generated.
+	$ clang++ --version
+	Apple clang version 11.0.0 (clang-1100.0.33.17)
+	Target: x86_64-apple-darwin18.7.0
+	Thread model: posix
+	InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
+
+	* tests/local.at (AT_COMPILE_CXX): Make sure -std=c++11 is passed when
+	running glr2.cc.  It may be overridden by another flag in CXXFLAGS
+	afterwards.
+
+2021-09-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	avoid using atoi
+	* cfg.mk: Disable sc_indent as auto indent is too invasive for now.
+	Enable sc_prohibit_atoi_atof, except where we don't care.
+	* src/location.c, src/muscle-tab.c: Use strtol instead of atoi.
+
+2021-09-24  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: update
+
+2021-09-18  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+	To get
+
+	commit 7818455627c5e54813ac89924b8b67d0bc869146
+	Author: Bruno Haible <bruno@clisp.org>
+	Date:   Fri Sep 17 22:22:50 2021 +0200
+
+	    threadlib: Avoid crashes in thread-related functions on Cygwin 3.2.0.
+
+	    Reported by Brian Inglis via Akim Demaille in
+	    <https://lists.gnu.org/archive/html/bug-gnulib/2021-09/msg00063.html>.
+
+	    * m4/threadlib.m4 (gl_WEAK_SYMBOLS): Force a "guessing no" result on
+	    Cygwin.
+
+2021-09-18  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: use YY_NOEXCEPT where it helps
+	Suggested by Don Macpherson.
+	<https://github.com/akimd/bison/issues/80>
+
+	* data/skeletons/c++.m4, data/skeletons/glr2.cc,
+	* data/skeletons/lalr1.cc, data/skeletons/stack.hh: Use YY_NOEXCEPT
+	where it helps constructors.
+
+2021-09-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2021-09-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: semantic_option: use a symbol
+	* data/skeletons/c++.m4 (basic_symbol): Add assignment operators.
+	* data/skeletons/glr2.cc (semantic_option): Replace yytoken, yyvalue
+	and yylocation by yyla.
+
+2021-09-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: don't publish move ctor to lalr1.cc
+	These operators were introduced in "c++: add move assignments to the
+	symbol type" (fdaedc780af0dd678a4f4fa3175a201a553be20a) for glr2.cc.
+
+	* data/skeletons/c++.m4: Define them for glr2.cc only.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: simplify semantic_option
+	* data/skeletons/glr2.cc (semantic_option): Simplify the rule-based
+	constructor.  This shows that it should be easy to use a symbol_kind,
+	instead of the kind/value/location triple.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: we require C++11
+	* data/skeletons/glr2.cc: So no need for C++98 compatibility.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: introduse b4_glr2_cc_if
+	* data/skeletons/bison.m4 (b4_glr2_cc_if): Intro.
+	* data/skeletons/c++.m4: use.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: don't pass %parse-param to destroy
+	I regret that %destructor and %printer give access to the %parse-param
+	in lalr1.cc, since that prevents them from being implemented as a
+	simple destructor and operator<<.  Let's not repeat the mistake in
+	glr2.cc.  In addition, fixes a name conflict we have currently in
+	tests 566 568 570 657:
+
+	     calc.cc:1395:85: error: declaration shadows a field of 'calc::parser' [-Werror,-Wshadow]
+	     void glr_state::destroy (char const* yymsg, calc::parser& yyparser, semantic_value *result, int *count, int *nerrs)
+	                                                                                         ^
+	     calc.hh:441:21: note: previous declaration is here
+	         semantic_value *result;
+	                         ^
+
+	With this commit, the whole test suite passes for glr2.cc.
+
+	* data/skeletons/glr2.cc (glr_state::destroy): Don't take the user
+	arguments.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: kill trailing white spaces
+	Fixes several calc tests.
+
+	Tests 566 568 570 657 still fail because of a name clash when using
+	%parse-param:
+
+	    calc.cc:1395:85: error: declaration shadows a field of 'calc::parser' [-Werror,-Wshadow]
+	    void glr_state::destroy (char const* yymsg, calc::parser& yyparser, semantic_value *result, int *count, int *nerrs)
+	                                                                                        ^
+	    calc.hh:441:21: note: previous declaration is here
+	        semantic_value *result;
+	                        ^
+
+	* data/skeletons/glr2.cc: Fix indentation/trailing spaces.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: check linking conflicts
+	* tests/headers.at (Several Headers): Link two glr2.cc parsers.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: move strong_index_alias into the unnamed namespace
+	* data/skeletons/glr2.cc: here.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: use only symbol_kind_type, not yysymbol_kind_t
+	* data/skeletons/glr2.cc: here.
+	And prefer the unnamed namespace to static.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: prefer using, and remove useless type aliases
+	* data/skeletons/glr2.cc: here.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: put glr_state_set and glr_stack_item in unnamed namespace
+	* data/skeletons/glr2.cc: here.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: move state_stack into the unnamed namespace
+	* data/skeletons/glr2.cc: here.
+	Prefer `using` to `typedef`, this is C++11.
+	Use the type alias we introduced.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: style: clarify control flow
+	* data/skeletons/glr2.cc (yypreference): Be more functional-style.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: move glr_stack and glr_state into the parser class
+	In order to be able to link several glr2.cc parser together, we cannot
+	have glr_stack and glr_state be in no namespace.  Putting them in the
+	unnamed namespace is not doable, since we need to fwd declare them in
+	the parser.  Putting them in the specified namespace is not enough
+	either, since some users would like to be able to put several parsers
+	in the same name, only differing by the class name.
+
+	* data/skeletons/glr2.cc (glr_state, glr_stack): Move into yy::parser.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: put create_state_set_index in unnamed namespace
+	* data/skeletons/glr2.cc: here.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: prefer unnamed namespace to 'static'
+	* data/skeletons/glr2.cc: here.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: put semantic_option into an unnamed namespace
+	If we link several glr2.cc parsers together, we get linking failures
+	because of duplicate symbols.
+
+	* data/skeletons/glr2.cc (semantic_option::indexIn)
+	(semantic_option::next): Remove the useless overloads.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: don't publish YY_EXCEPTIONS
+	We don't need them in the header file.
+
+	* data/skeletons/glr2.cc (YY_EXCEPTIONS): Define only in the
+	implementation file.
+	* tests/headers.at (Several Parsers): Also check glr2.cc.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: demonstrate custom error messages in the examples
+	Let's use c++/glr to demonstrate custom error messages in C++ (not
+	just in glr2.cc).
+
+	* examples/c++/glr/c++-types.yy (report_syntax_error): New.
+	* examples/c++/glr/c++-types.test: Adjust.
+	* examples/c/bistromathic/parse.y: Comment changes.
+	* tests/local.at (AT_YYERROR_DEFINE(c++)): Use a nicer way to print
+	the lookakead's name.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: custom error messages
+	Reported by Tom Shields <thomas.evans.shields@icloud.com>.
+	<https://lists.gnu.org/r/bug-bison/2021-08/msg00003.html>
+
+	* data/skeletons/glr2.cc (context): New.
+	Use it to generate the error messages.
+	Add support for custom error messages.
+	* tests/calc.at: Check support for custom error messages.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: start the transition to using symbol_type
+	Currently glr2.cc uses three variables/struct members to denote the
+	symbols' kind (or state), value and location.  lalr1.cc has two types
+	for "complete" symbols: symbol_type and stack_symbol_type.  Let's use
+	that model in glr2.cc too.
+
+	For a start use yyla (a symbol_type) to denote the lookahead, instead
+	of the triple yytoken, yylval and yylloc.  This will make easier the
+	introduction of the "context" subclass, used in parse.error=custom.
+
+	It simplifies the code in several places.  For instance from:
+
+	    symbol_kind_type yytoken_current = this->yytoken;]b4_variant_if([[
+	    value_type yylval_current;
+	    ]b4_symbol_variant([this->yytoken],
+	                       [yylval_current], [move], [this->yylval])], [[
+	    value_type yylval_current = this->yylval;]])[]b4_locations_if([
+	    location_type yylloc_current = this->yylloc;])[
+
+	to:
+
+	    symbol_type yyla_current = std::move (this->yyla);
+
+	* data/skeletons/glr2.cc (yytoken, yylval, yylloc): Replace by...
+	(yyla): this.
+	Adjust all dependencies.
+	(yyloc_default): Remove, unused.
+	* tests/c++.at, tests/glr-regression.at, tests/types.at: C++11 is
+	required for glr2.cc.
+	Adjust to changes in glr2.cc.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: add move assignments to the symbol type
+	This will be used in glr2.cc, which requires C++11.
+
+	* data/skeletons/c++.m4 (basic_symbol, by_kind): Add move assignment.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: avoid using the obsolete names
+	* data/skeletons/c++.m4: Don't define obsolete identifiers in the case
+	of glr2.cc.  Let's not start with technical debt.
+	* data/skeletons/glr2.cc, data/skeletons/lalr1.cc,
+	* data/skeletons/variant.hh: Use token_kind_type, not token_type.
+	* tests/c++.at, tests/local.at: Use value_type, not semantic_type.
+
+2021-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2021-09-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2021-09-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.8.1
+	* NEWS: Record release date.
+
+2021-09-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	portability: don't use strtof
+	It is not available on HP-UX 11i.
+	Reported by Larkin Nickle <me@larbob.org>.
+	<https://lists.gnu.org/r/bug-bison/2021-09/msg00012.html>
+
+	Gnulib provides no replacement, but anyway we should be using doubles,
+	since difftime uses doubles.
+
+	* bootstrap.conf: We want portability on stdtod.
+	* src/counterexample.c: Use double, not float, for time measurements.
+
+2021-09-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc: declare yyerror/yylex only when POSIXLY_CORRECT
+	The recent changes to comply with POSIX are breaking Automake's test
+	suite.
+	Reported by Kiyoshi Kanazawa.
+	<https://lists.gnu.org/r/bug-bison/2021-09/msg00005.html>
+
+	To limit the impact of POSIX changes, bind them to $POSIXLY_CORRECT.
+	Suggested by Karl Berry.
+	<https://lists.gnu.org/r/bug-bison/2021-09/msg00009.html>
+
+	The existing `maintainer-check-posix` Make target checks these
+	changes.
+
+	* src/getargs.h, src/getargs.c (set_yacc): New.
+	Use it.
+	* data/skeletons/bison.m4 (b4_posix_if): New.
+	* data/skeletons/yacc.c (b4_declare_yyerror_and_yylex): Use it.
+	* doc/bison.texi, tests/local.at: Adjust.
+
+2021-09-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2021-09-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.8
+	* NEWS: Record release date.
+
+2021-09-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: update
+
+2021-09-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2021-09-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.7.91
+	* NEWS: Record release date.
+
+2021-09-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: disable "Multistart reports"
+	For some reason this test fails on Solaris/x86.  But multistart is not
+	part of 3.8, so we can postpone the debugging of this issue.
+	Reported by Dagobert Michelsen.
+	<https://lists.gnu.org/r/bug-bison/2021-08/msg00027.html>
+
+	* tests/report.at (Multistart reports): Comment out.
+
+2021-08-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: c++: formatting changes
+	* data/skeletons/variant.hh, data/skeletons/glr2.cc: Fix space before
+	paren issue.
+
+2021-08-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: rename stmtMerge as stmt_merge
+	Follow the GNU Coding Style.
+
+	* doc/bison.texi, examples/c++/glr/c++-types.yy,
+	* examples/c/glr/c++-types.y, tests/cxx-type.at: s/stmtMerge/stmt_merge/g.
+
+2021-08-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: beware of Visual C++ limitations
+	Contrary to what commit d8cc6b073e2802d871a16dc62418a7eb62ed2216 "c++:
+	shorten the assertions that check whether tokens are correct"
+	believed, MS Visual C++'s preprocessor limitation is not on the input
+	line length, but on the size of the line holding the full C++
+	statement.
+
+	Reported by Vince Huffaker <vince@vincejulie.com>
+	<https://lists.gnu.org/r/help-bison/2021-08/msg00003.html>
+
+	* data/skeletons/variant.hh (_b4_symbol_constructor_define): Hide the
+	assertion from Visual C++.
+
+2021-08-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: don't postprocess stderr with sed
+	On Solaris, sed throws away the NUL bytes from the stream, even in C
+	locale.  So instead of postprocessing bison's stderr to neutralize
+	changes in value of `argv[0]`, use an envvar to actually neutralize
+	variations of `argv[0]` during tests.
+
+	Reported by Dagobert Michelsen.
+	<https://lists.gnu.org/r/bug-bison/2021-08/msg00025.html>
+
+	* src/main.c (main): Change `argv[0]` if BISON_PROGRAM_NAME is
+	defined.
+	* tests/bison.in: No longer mess with stderr, just pass
+	the expected BISON_PROGRAM_NAME value.
+
+2021-08-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	CI: don't require Autoconf 2.71
+
+2021-08-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: don't demonstrate multistart, which is not part of 3.8
+	Besides, for mysterious reasons, this fails on some environment.
+	Reported by Dagobert Michelsen.
+	<https://lists.gnu.org/archive/html/bug-bison/2021-08/msg00008.html>
+
+	* examples/c/lexcalc/lexcalc.test, examples/c/lexcalc/parse.y,
+	* examples/c/lexcalc/scan.l: Revert to a single-start example.
+
+2021-08-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: grep -E is not portable
+	Reported by Dagobert Michelsen.
+	<https://lists.gnu.org/r/bug-bison/2021-08/msg00008.html>
+
+	* tests/calc.at: Use $EGREP.
+
+2021-08-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: require C++11
+	Reported by Dagobert Michelsen.
+	https://lists.gnu.org/r/bug-bison/2021-08/msg00006.html
+
+	* m4/bison-cxx-std.m4 (_BISON_CXXSTD_98_snippet): We don't need
+	vector::data, it was only for glr2.cc, which is C++11 anyway.
+	(_BISON_CXXSTD_11_snippet): We need vector::data and std::swap on
+	arrays.
+	* m4/cxx.m4 (BISON_TEST_FOR_WORKING_CXX_COMPILER): We don't need
+	vector::data.
+	* tests/local.at (AT_COMPILE_CXX): Skip when glr2.cc and no support
+	for C++11.
+
+2021-08-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	readme: add D
+
+2021-08-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2021-08-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.7.90
+	* NEWS: Record release date.
+
+2021-08-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: ignore syntax-check's file_system check on Doxyfile
+	* cfg.mk: Here.
+
+2021-08-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: fix incorrect test case
+	In c2ba260487927a4cdf061fae10fdd1b387ca3d95 ("glr.c: fix signature
+	when using custom error messages"), I meant to add a test case for C,
+	not C++.  It does not work in C++.
+
+	* tests/calc.at: Run for glr.c, not glr.cc.
+
+2021-08-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2021-08-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: be clear that glr2.cc is C++11
+
+2021-08-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: modernize to newer Autoconf releases
+	* configure.ac: here.
+
+2021-08-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: reject C++ compilers that don't support std::vector::data
+	GCC 4.2 on macOS claims to support C++98, but does not feature it.
+
+	input.cc: In member function 'void state_stack::yycompressStack()':
+	input.cc:1774: error: 'class std::vector<glr_stack_item, std::allocator<glr_stack_item> >' has no member named 'data'
+
+	Reported by Christopher Nielsen <mascguy@github.com>.
+	<https://trac.macports.org/raw-attachment/ticket/59927/bison-test-results-20210811-95b72.log.xz>.
+
+	* m4/bison-cxx-std.m4 (_BISON_CXXSTD_98_snippet): Check for it.
+	* m4/cxx.m4 (BISON_TEST_FOR_WORKING_CXX_COMPILER): Ditto.
+
+2021-08-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: check for C++ 20 and 2b
+	C++20 is released.
+
+	* configure.ac, m4/bison-cxx-std.m4, tests/atlocal.in,
+	* tests/local.at: Replace 2a with 20, and add support for 2b.
+
+2021-08-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: remove obsolete checks
+	* tests/atlocal.in: It was an error for tests to depend on gnulib:
+	they must not, as gnulib would hide portability issues that we want to
+	catch.  So this piece of code is no longer useful, and must not be
+	useful.
+
+2021-08-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: be robust to old versions of xlstproc
+	Reported by Christopher Nielsen <mascguy@github.com>.
+	<https://trac.macports.org/raw-attachment/ticket/59927/bison-test-results-20210811-95b72.log.xz>
+
+	* tests/report.at (AT_CHECK_HTML): New.
+	Use it.
+
+2021-08-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: fix _Noreturn support detection
+	Reported by Christopher Nielsen <mascguy@github.com>.
+	<https://trac.macports.org/ticket/59927#comment:59> and
+	<https://trac.macports.org/ticket/59927#comment:62>.
+
+	* data/skeletons/c.m4: Fix typo.
+
+2021-08-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	lalr1.cc: style changes
+	* data/skeletons/lalr1.cc: Formatting changes.
+	Use more `const`, as in glr2.cc.
+
+2021-08-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: fix signature when using custom error messages
+	Reported by Tom Shields <thomas.evans.shields@icloud.com>.
+
+	* data/skeletons/glr.c (yypcontext_location): Fix return type.
+	* tests/calc.at: Check the case pure, location, custom error messages.
+
+2021-08-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: check symbol/token renumbering
+	In some extreme situations, with lots of useless tokens, Bison was
+	numbering them incorrectly, which resulted in a broken grammar.
+	<https://lists.gnu.org/r/bison-patches/2021-03/msg00001.html>
+	commit a774839ca873d1082f79ba3c4eecc1e242a28ce1.
+
+	* tests/regression.at (Useless Tokens): New.
+
+2021-08-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: rename b4_lex as b4_yylex
+	For consistency with b4_yyerror_formals, etc.
+
+	* data/skeletons/bison.m4, data/skeletons/c.m4, data/skeletons/d.m4,
+	* data/skeletons/glr.c, data/skeletons/glr2.cc,
+	* data/skeletons/java.m4, data/skeletons/lalr1.cc,
+	* data/skeletons/lalr1.d, data/skeletons/lalr1.java,
+	* data/skeletons/yacc.c
+	(b4_lex, b4_lex_formals): Rename as...
+	(b4_yylex, b4_yylex_formals): these.
+
+2021-08-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc: comply with recent POSIX updates: declare yyerror and yylex
+	In POSIX Yacc mode, declare yyerror and yylex unless already #defined,
+	or if YYERROR_IS_DECLARED/YYLEX_IS_DECLARED are defined (for
+	consistency with Bison's YYSTYPE_IS_DECLARED/YYLTYPE_IS_DECLARED).
+	See <https://austingroupbugs.net/view.php?id=1388#c5220>.
+
+	* data/skeletons/c.m4 (b4_function_declare): Resurect.
+	(b4_lex_formals): Since we will possibly expose this prototype
+	in the header, take the prefix into account.
+	* data/skeletons/yacc.c (b4_declare_yyerror_and_yylex): New.
+	(b4_shared_declarations): Use it.
+
+	* tests/local.at (AT_YACC_IF): New.
+	When in Yacc mode, set the `yacc` Autotest keyword.
+	(AT_YYERROR_DECLARE(c)): Don't declare in Yacc mode,
+	to avoid clashes (since this signature is static).
+	(AT_YYERROR_DEFINE(c)): Don't define as static in Yacc mode.
+	* tests/regression.at (Early token definitions with --yacc): Specify
+	that we are in Yacc mode.
+
+2021-08-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: enable -Wmismatched-dealloc
+	* configure.ac (warn_common): Here.
+
+2021-08-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2021-08-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	bistromathic: beware of portability issues with readline
+	In some cases readline emits a trailing spaces after the last
+	suggestion, which results in errors such as:
+
+	```
+	-(       -       atan    cos     exp     ln      number  sin     sqrt$
+	+(       -       atan    cos     exp     ln      number  sin     sqrt    $
+	```
+
+	Reported by Christopher Nielsen <mascguy@github.com>.
+	<https://trac.macports.org/ticket/59927#comment:48>
+	<https://trac.macports.org/attachment/ticket/59927/bison-3.7.6-test-10.13.test-suite.log>
+
+	* examples/test (run): Add support for -t.
+	* examples/c/bistromathic/bistromathic.test: Use it.
+
+2021-08-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	d: prepare to be able to run LAC tests
+	Unfortunately it seems to be quite difficult to have "LAC: Exploratory
+	stack" run for D.
+
+	* data/skeletons/lalr1.d: We need File when traces are enabled.
+	* tests/local.at (AT_YYLEX_DEFINE(d)): New.
+	* tests/regression.at: Prepare for D, but don't run it, it does not
+	work.
+
+2021-08-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: factor iterating over skeletons
+	* tests/local.at (AT_FOR_EACH_SKEL): New.
+	Use where appropriate.
+	* data/skeletons/lalr1.d: Reject -d.
+	* tests/input.at, tests/scanner.at: Also check D.
+
+2021-08-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	m4: catch suspicions of unevaluated macros
+	Check in m4's output if there are sequences such as m4_foo or b4_foo,
+	which are probably resulting from incorrect m4 processing.
+
+	It actually already is useful:
+
+	- it caught a leaking b4_lac_if leaking from glr.c, where LAC is not
+	  supported, hence b4_lac_if is not defined.
+
+	- it also caught references to location.hh in position.hh when
+	  location.hh does not exist.
+
+	- while making "Code injection" robust to these new warnings (it is
+	  its very purpose to let b4_canary pass unevaluated), I saw that it
+	  did not check lalr1.d, and when adding lalr1.d, it revealed it did
+	  underquote ocurrences of token value types.
+
+	* src/scan-skel.l (macro): New abbreviation.
+	Use it.
+	* data/skeletons/glr.c: Don't use b4_lac_if, we don't have it.
+	* data/skeletons/location.cc: Don't generate position.hh when we don't
+	generate location.hh.
+	* data/skeletons/d.m4 (b4_basic_symbol_constructor_define): Fix
+	underquotation.
+	* data/skeletons/bison.m4 (b4_canary): New.
+	* tests/input.at (Code injection): Use it, and check lalr1.d too.
+
+2021-08-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: formatting changes in scan-code.l
+	* src/scan-code.l: Fix indentation.
+
+2021-08-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: avoid #define YYDEBUG in C++
+	* doc/bison.texi (Enabling Traces): here.
+
+2021-08-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: extract AT_LOCATION_PRINT_DECLARE and AT_LOCATION_PRINT_DEFINE
+	* tests/local.at (AT_LOCATION_PRINT_DECLARE)
+	(AT_LOCATION_PRINT_DEFINE): New.
+
+2021-08-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: rename AT_YACC_IF as AT_YACC_C_IF
+	In data/, b4_yacc_if refers to %yacc, not yacc.c.
+
+	* tests/local.at (AT_YACC_IF): Rename as...
+	(AT_YACC_C_IF): this.
+
+2021-08-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: more pointers to the examples
+	* doc/bison.texi (Infix Calc): Here.
+
+2021-08-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	git: add diff patterns for Autotest and Texinfo
+
+2021-08-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	CI: fix the GCC 9 build
+
+2021-08-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: d: push and token ctors are done
+
+2021-08-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: refer to the examples
+	* doc/bison.texi: Point to rpcalc, mfcalc, simple.y, calc++, c/glr and
+	c++/glr.
+
+2021-08-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: modernize the example Makefiles
+	* examples/c++/Makefile, examples/c++/calc++/Makefile,
+	* examples/c++/glr/Makefile, examples/c/bistromathic/Makefile,
+	* examples/c/calc/Makefile, examples/c/glr/Makefile,
+	* examples/c/lexcalc/Makefile, examples/c/mfcalc/Makefile,
+	* examples/c/pushcalc/Makefile, examples/c/reccalc/Makefile,
+	* examples/c/rpcalc/Makefile, examples/d/calc/Makefile,
+	* examples/d/simple/Makefile, examples/java/calc/Makefile,
+	* examples/java/simple/Makefile:
+	Use --html to generate *.html directly.
+	No longer demonstrate --xml.
+	No longer show rules for xml to html.
+	Use --header, not --defines.
+	Use --graph without specifying the output file now that we
+	generate *.gv by default.
+
+2021-08-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: glr: document typed mergers
+	See <https://lists.gnu.org/r/help-bison/2020-12/msg00016.html>.
+
+	* doc/bison.texi (Merging GLR Parses): document typed mergers.
+	And avoid #define YYSTYPE.
+
+2021-08-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: tests: rebox comments
+	* tests/glr-regression.at: here.
+
+2021-08-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: update
+	In particular, announce lalr1.d.
+
+2021-08-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: fix spello
+	* doc/bison.texi (Multiple start-symbols): here.
+
+2021-08-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	scan: fix typo in UTF-8 escape
+	We had:
+
+	```
+	-mbchar    ...|\xF0[\x\90-\xBF]([\x80-\xBF]{2})|...
+	+mbchar    ...|\xF0[\x90-\xBF]([\x80-\xBF]{2})|...
+	```
+
+	so a precise sequence that matches the incorrect regex can let NUL
+	bytes pass through, which triggers an assertion violation downstream.
+	It is a pity that Flex does not report an error for such input.
+
+	Reported by Ahcheong Lee <ahcheong.lee@gmail.com>.
+	<https://lists.gnu.org/r/bug-bison/2021-04/msg00003.html>
+
+	* src/scan-gram.l (mbchar): Fix the bad regex.
+	* tests/input.at (Invalid inputs): Check that case.
+
+2021-08-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: POSIX yacc and prototypes
+
+2021-08-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: update Doxygen template file
+	* doc/Doxyfile.in: here.
+
+2021-08-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: a bit of editing
+	* doc/bison.texi: Use @samp{...}, not "..." for pieces of code.
+	Use @samp{...}, not @command{...} for command lines.
+	Promote %header/--header over %defines/--defines.
+	Spellcheck.
+
+2021-08-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2021-08-01  Alyssa Ross  <hi@alyssa.is>
+
+	getargs: don't translate first line of --version
+	<https://lists.gnu.org/r/bison-patches/2021-06/msg00002.html>
+
+	* src/getargs.c (version): here.
+
+2021-08-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	all: fix confusion between token ctor and symbol ctor
+	The symbol constructors are genuine constructors.  Token constructors
+	are plain functions that construct tokens.
+
+2021-07-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	d: minor clean up
+	* doc/bison.texi: Use @samp, not "...", around pieces of code.
+	* examples/d/calc/calc.y: Don't promote %union.
+
+2021-06-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2021-06-06  Adela Vais  <adela.vais99@gmail.com>
+
+	d: demonstrate the token constructors
+	* examples/d/calc/calc.y: Use the token constructors in the 'calc' example.
+
+2021-04-11  Adela Vais  <adela.vais99@gmail.com>
+
+	d: update documentation
+	* doc/bison.texi: Various fixes.
+	(D Push Parser Interface, D Complete Symbols): New sections.
+
+2021-04-11  Adela Vais  <adela.vais99@gmail.com>
+
+	d: demonstrate the push parser
+	* examples/d/calc/calc.y: Use a parser of type 'push' in the calc
+	example.
+
+2021-04-11  Adela Vais  <adela.vais99@gmail.com>
+
+	d: add push parser support
+	Support the push-pull directive with the options pull, push and both.
+	Pull remains the default option.
+
+	* data/skeletons/d.m4: Add user aliases for the push parser's return
+	values: PUSH_MORE, ABORT, ACCEPT.
+	* data/skeletons/lalr1.d: Add push parser support.
+	* tests/calc.at: Test it.
+
+2021-03-26  Adela Vais  <adela.vais99@gmail.com>
+
+	d: add token constructors support
+	The user can return from yylex() by calling the Symbol method of the
+	same name as the TokenKind reported, and adding the parameters for
+	value and location if necessary.  These methods generate compile-time
+	errors if the parameters are not correlated.  Token constructors work
+	with both %union and api.value.type union.
+
+	* data/skeletons/d.m4: Here.
+	* tests/calc.at: Test it.
+
+2021-03-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	d: add api.value.type union support
+	The union of the values is handled by the backend.
+	In D, unions can hold classes, structs, etc., so this is more similar
+	to the C++ api.value.type variant.
+
+	* data/skeletons/d.m4, data/skeletons/lalr1.d: Here.
+	* tests/calc.at, tests/local.at: Test it.
+
+2021-03-26  Adela Vais  <adela.vais99@gmail.com>
+
+	d: rewrite Symbol's constructors in M4
+	The D code was becoming too complex.
+	M4 is easier to maintain in the long run.
+
+	* data/skeletons/d.m4: Here.
+
+2021-03-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2021-03-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	files: please syntax-check
+	* src/files.c (string_free): syntax-check does not want us to cast
+	arguments to free.
+
+2021-03-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	Merge 3.7.6 into master
+	* maint:
+	  maint: post-release administrivia
+	  version 3.7.6
+	  yacc: fix push parser
+	  tables: fix again the handling of useless tokens
+
+2021-03-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2021-03-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.7.6
+	* NEWS: Record release date.
+
+2021-03-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: don't mention YY_LOCATION_PRINT
+	* doc/bison.texi (Syntax Error Reporting Function): Don't refer to
+	YY_LOCATION_PRINT, it is a private internal detail.
+
+2021-03-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc: fix push parser
+	When a pstate is used for multiple successive parses, some state may
+	leak from one run into the following one.  That was introduced in
+	330552ea499ca474f65967160e9d4e50265f9631 "yacc.c: push: don't clear
+	the parser state when accepting/rejecting".
+
+	Reported by Ryan <dev@splintermail.com>
+	https://lists.gnu.org/r/bug-bison/2021-03/msg00000.html
+
+	* data/skeletons/yacc.c (yypush_parse): We reusing a pstate from a
+	previous run, do behave as if it were the first run.
+	* tests/push.at (Pstate reuse): Check this.
+
+2021-03-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	tables: fix again the handling of useless tokens
+	The right-shift added in c22902e360e0fbbe9fd5657dcf107e03166da309
+	("tables: fix handling for useless tokens") is incorrect.  In
+	particular, we need to reset the "new" bits.
+
+	Reported by Balázs Scheidler.
+	https://github.com/akimd/bison/issues/74
+
+	* src/tables.c (pos_set_set): Fix the right-shift.
+
+2021-02-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	html: fix memory leak
+	* src/print-xml.c (print_html): Free allocated memory.
+
+2021-02-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	output: cache the mapped file names
+	Don't repeatedly call malloc/free for each call to map_file_name.
+
+	* bootstrap.conf: We need hash-map.
+	* src/files.h, src/files.c (map_file_name): The caller must not free
+	the result.
+	Adjust callers.
+	(mapped_dir_prefix, spec_mapped_header_file): Remove.
+	* src/files.c
+	(map_file_name): Rename as...
+	(map_file_name_alloc): this.
+	(mapped_files, map_file_name, string_equals, string_hash, string_free):
+	New.
+
+2021-02-26  Joshua Watt  <jpewhacker@gmail.com>
+
+	output: use mapped file name for symbols
+	Applies the file name mapping before exporting it as a symbol. This
+	allows the symbols to correctly respect the --file-prefix-map command
+	line option.
+
+2021-02-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: formatting changes
+	* src/files.c, src/files.h: Save horizontal space.
+	Prefer `res` for returned values.
+	Put the doc into the header.
+
+2021-02-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2021-02-25  Joshua Watt  <jpewhacker@gmail.com>
+
+	doc: fix documented function name
+	* data/README.md: Fix the name of a referenced function to match the
+	name in code.
+
+2021-02-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2021-02-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: printing locations
+	Document YYLOCATION_PRINT.
+
+	* doc/bison.texi (Printing Locations): New node.
+
+2021-02-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: improve some function prototypes
+	* examples/c/bistromathic/parse.y, examples/c/glr/c++-types.y,
+	* examples/c/lexcalc/parse.y: Use const where appropriate.
+	Avoid `yy` prefixes where it does not make sense.
+	Avoid the `p` prefix for pointers.
+
+2021-02-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: use YYLOCATION_PRINT
+	* examples/c/bistromathic/parse.y, examples/c/glr/c++-types.y,
+	* examples/c/lexcalc/parse.y: Don't use the private internal detail
+	`YY_LOCATION_PRINT`, use `YYLOCATION_PRINT`.
+
+2021-02-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: rename YY_LOCATION_PRINT as YYLOCATION_PRINT and make it public
+	It is very helpful to be able to look at the locations in the debug
+	traces, let's provide the users with (i) a means to do that for their
+	location types, and (ii) a public macro to print locations when debug
+	traces are enabled.
+
+	* data/skeletons/c.m4 (b4_yy_location_print_define): Rename as...
+	(b4_yylocation_print_define): this.
+	Define YYLOCATION_PRINT instead of YY_LOCATION_PRINT.
+	Ensure backward compatibility for those who might have defined/used
+	YY_LOCATION_PRINT in spite the warnings.
+	Adjust dependencies.
+	* data/skeletons/glr2.cc: We don't use YYLOCATION_PRINT here.
+
+2021-02-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: do not rely on YY_LOCATION_PRINT
+	* examples/c/bistromathic/parse.y (location_print): New.
+	Use it.
+
+2021-02-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: stop defining YY_LOCATION_PRINT when locations are not enabled
+	* data/skeletons/c.m4 (b4_yy_location_print_define): here.
+
+2021-02-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	graph: output foo.gv by default, instead of *.dot
+	That change was started in Bison 3.4.  The announcement for 3.7 stated
+	that in Bison 3.8 we would use *.gv by default.
+
+	* src/files.c (compute_output_file_names): spec_graph_file defaults
+	too *.gv.
+	* doc/bison.texi, examples/c++/calc++/local.mk, tests/output.at:
+	Adjust.
+
+2021-02-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: adjust to the removal of YYPRINT
+	* tests/regression.at: here.
+
+2021-02-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc: remove support for YYPRINT
+	Its removal was annonced several times in NEWS (for Bison 3.5, 3.6, 3.7).
+
+	* data/skeletons/c.m4, data/skeletons/yacc.c: Remove support for YYPRINT.
+	* NEWS: Fix the mess introduced by the merge.
+	Document the removal of YYPRINT.
+	* doc/bison.texi (The YYPRINT Macro): Remove.
+
+2021-02-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: issue a compile-time warning when #define YYSTYPE is used
+	Using #define YYSTYPE has always been strongly discouraged in C++.
+	Macros are dangerous and can result in subtle bugs.
+	https://lists.gnu.org/r/bug-bison/2020-12/msg00007.html
+
+	Maybe some people are currently using #define YYSTYPE.  Instead of
+	dropping support right now, first issue a warning.  Bison can "see" if
+	YYDEBUG is defined (it could even be on the command line), only the
+	compiler knows.  Unfortunately `#warning` is non-portable, and
+	actually GCC even dies on it when `-pedantic` is enabled.  So we need
+	to use `#pragma message`.  We must make it conditional as some
+	compilers might not support it, but it doesn't matter if only _some_
+	compilers emit the warning: it should be enough to catch the attention
+	of the developers.
+
+	* data/skeletons/c++.m4: Issue a warning when the user defined
+	YYSTYPE.
+	* tests/actions.at: Don't #define YYSTYPE.
+	* tests/headers.at (Several parsers): Ignore the YYSTYPE in the
+	warning.
+
+2021-02-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: make it clear that #define YYSTYPE is not supported
+	We have been accepting this for years, but it is deprecated: people
+	are expecting to define api.value.type instead.
+
+	* doc/bison.texi: Make it clear that YYSTYPE and YYLTYPE are for C
+	only.
+
+2021-02-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: stop referring to YYSTYPE in yylex
+	* data/skeletons/glr2.cc, data/skeletons/lalr1.cc (b4_lex): Don't
+	refer to YYSTYPE, but to value_type.
+	Note that this is "symbolic" in the sense that these values are never
+	used by b4_function_call.
+
+2021-02-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	CI: try GCC 11 and Clang 11
+
+2021-02-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2021-01-31  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: no longer be part of b4_glr_cc_if
+	We are fully independant of glr.c/glr.cc, we no longer need to pretend
+	we are glr.cc.
+
+	* data/skeletons/bison.m4: here.
+
+2021-01-31  Akim Demaille  <akim.demaille@gmail.com>
+
+	m4: provide macros for api.value.type=union
+	* data/skeletons/bison.m4 (b4_union_if): New.
+	Remove support for "%define variant", which was deprecated long ago.
+	* tests/local.at (AT_UNION_IF): New.
+
+2021-01-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	traces: display the Bison version
+	* src/main.c (main): When traces are enabled, display the Bison
+	version.
+	* tests/conflicts.at, tests/report.at, tests/sets.at:
+	Use AT_PACKAGE_VERSION (for package.m4) instead of post-processing the
+	output.
+
+2021-01-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: run the main test suite on "make check"
+	Automake appears to not recognize "check-local" when it is not a
+	isolated target.  Fixes 77a8b84fc8bbe39dc231a1f657fd56a50fac5855.
+
+	* tests/local.mk (check-local): Make it visible to Automake.
+
+2021-01-30  Adela Vais  <adela.vais99@gmail.com>
+
+	d: tests: various style fixes
+	* tests/calc.at, tests/scanner.at: Here.
+	(yylex): Report values directly, without storing them to the union
+	first.
+
+2021-01-30  Paul Eggert  <eggert@cs.ucla.edu>
+
+	Update URLs to prefer https: to http:
+	Also, fix a few http: URLs that were no longer working.
+
+2021-01-29  Paul Eggert  <eggert@cs.ucla.edu>
+
+	Update URLs to prefer https: to http:
+	Also, fix a few http: URLs that were no longer working.
+
+2021-01-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: provide check-examples and check-tests
+	* examples/local.mk (check-examples): New.
+	* tests/local.mk (check-tests): New.
+	* README-hacking.md: Document them.
+
+2021-01-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	bistromathic: use gettext for all the messages
+	* examples/c/bistromathic/parse.y: Add missing calls to _.
+
+2021-01-24  Adela Vais  <adela.vais99@gmail.com>
+
+	d: tests: avoid mixing output from reportSyntaxError and getExpectedTokens
+	Function reportSyntaxError buffers and prints the message at the end.
+
+	* tests/local.at: Here.
+
+2021-01-24  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: fix destructor support
+	Currently glr2.cc does not use 'symbol's everywhere, in various places
+	it also uses yykind, yyval and yyloc "by hand".  So we need two
+	different calls for user-defined constructors: once for ~symbol,
+	another for yy_destroy_.  Both need to call the user destructors with
+	different calling conventions.
+
+	* data/skeletons/glr2.cc (b4_symbol_action): Rename as...
+	(b4_symbol_action_for_yyval): this.
+	(b4_symbol_action): New, taken from lalr1.cc.
+	(yy_destroy_, yy_symbol_value_print_): Use b4_symbol_action_for_yyval.
+
+2021-01-24  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: beware of types with angle brackets
+	For C++98, avoid "yyval.as<std::list<int>>".
+
+	* data/skeletons/glr2.cc (b4_call_merger): Add spaces within "<...>".
+
+2021-01-24  Akim Demaille  <akim.demaille@gmail.com>
+
+	package: fix details after merge with 3.7.5
+	* TODO, cfg.mk: Update.
+	* src/parse-gram.c, src/parse-gram.h: Regen.
+
+2021-01-24  Akim Demaille  <akim.demaille@gmail.com>
+
+	Merge tag 'v3.7.5'
+	Three new commits:
+
+	commit 8358090292e21c61a583da542bad9099ad65f355
+	Author: Paul Eggert <eggert@cs.ucla.edu>
+	Date:   Wed Jan 20 18:30:16 2021 -0800
+
+	    c: port to HP-UX 11.23
+
+	commit 2c294c132528ede23d8ae4959783a67e9ff05ac5
+	Author: Vincent Imbimbo <vmi6@cornell.edu>
+	Date:   Sat Jan 23 13:25:18 2021 -0500
+
+	    cex: fix state-item pruning
+
+	commit c22902e360e0fbbe9fd5657dcf107e03166da309
+	Author: Akim Demaille <akim.demaille@gmail.com>
+	Date:   Sat Jan 23 18:40:15 2021 +0100
+
+	    tables: fix handling for useless tokens
+
+2021-01-24  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: fix typo
+	Reported by Kaz Kylheku.
+	https://lists.gnu.org/r/bison-patches/2020-11/msg00019.html
+
+	* doc/bison.texi (Versioning): here.
+
+2021-01-24  Kaz Kylheku  <kaz@kylheku.com>
+
+	doc: document best deployment practices.
+	* doc/bison.texi (Versioning): New node about practices
+	regarding dealing with multiple versions of Bison.
+
+2021-01-24  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2021-01-24  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.7.5
+	* NEWS: Record release date.
+
+2021-01-24  Akim Demaille  <akim.demaille@gmail.com>
+
+	tables: fix handling for useless tokens
+	In some rare conditions, the generated parser can be wrong when there
+	are useless tokens.
+
+	Reported by Balázs Scheidler.
+	https://github.com/akimd/bison/issues/72
+
+	Balázs managed to prove that the bug was introduced in
+
+	    commit af1c6f973a60a51c609903713ff8f7fce0887025
+	    Author: Theophile Ranquet <ranquet@lrde.epita.fr>
+	    Date:   Tue Nov 13 10:38:49 2012 +0000
+
+	    tables: use bitsets for a performance boost
+
+	    Suggested by Yuri at
+	    <http://lists.gnu.org/archive/html/bison-patches/2012-01/msg00000.html>.
+
+	    The improvement is marginal for most grammars, but notable for large
+	    grammars (e.g., PosgreSQL's postgre.y), and very large for the
+	    sample.y grammar submitted by Yuri in
+	    http://lists.gnu.org/archive/html/bison-patches/2012-01/msg00012.html.
+	    Measured with --trace=time -fsyntax-only.
+
+	    parser action tables    postgre.y     sample.y
+	    Before                 0,129 (44%)  37,095 (99%)
+	    After                  0,117 (42%)   5,046 (93%)
+
+	    * src/tables.c (pos): Replace this set of integer coded as an unsorted
+	    array of integers with...
+	    (pos_set): this bitset.
+
+	which was implemented long ago, but that I installed only recently
+	(March 2019), first published in v3.3.90.
+
+	That patch introduces a bitset to represent a set of integers.  It
+	managed negative integers by using a (fixed) base (the smallest
+	integer to represent).  It avoided negative accesses into the bitset
+	by ignoring integers smaller than the base, under the asumption that
+	these cases correspond to useless tokens that are ignored anyway.
+	While it turns out to be true for all the test cases in the test suite
+	(!), Balázs' use case demonstrates that it is not always the case.
+
+	So we need to be able to accept negative integers that are smaller
+	than the current base.
+
+	"Amusingly" enough, the aforementioned patch was visibly unsure about
+	itself:
+
+	    /* Store PLACE into POS_SET.  PLACE might not belong to the set
+	       of possible values for instance with useless tokens.  It
+	       would be more satisfying to eliminate the need for this
+	       'if'.  */
+
+	This commit needs several improvements in the future:
+	- support from bitset for bit assignment and shifts
+	- amortized resizing of pos_set
+	- test cases
+
+	* src/tables.c (pos_set_base, pos_set_dump, pos_set_set, pos_set_test):
+	New.
+	Use them instead of using bitset_set and bitset_test directly.
+
+2021-01-24  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: fix state-item pruning
+	There were several bugs in pruning that would leave the state-item
+	graph in an inconsistent state which could cause crashes later on:
+
+	- Pruning now happens in one pass instead of two.
+
+	- Disabled state-items no longer prune the state-items they transition
+	  to if that state-item has other states that transition to it.
+
+	- State-items that transition to disabled state-items are always
+	  pruned even if they have productions.
+
+	Reported by Michal Bartkowiak <michal.bartkowiak@nokia.com>
+	https://lists.gnu.org/r/bug-bison/2021-01/msg00000.html
+	and Zartaj Majeed
+	https://github.com/akimd/bison/issues/71
+
+	* src/state-item.c (prune_forward, prune_backward): Fuse into...
+	(prune_state_item): this.
+	Adjust callers.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	package: pacify syntax-check
+	* cfg.mk: Currently we cannot update gnulib because of portability
+	issues with ancient versions of clang
+	(https://lists.gnu.org/r/bug-gnulib/2021-01/msg00241.html).  So skip
+	the check about copyright date for gnulib.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: update
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	package: bump copyrights to 2021
+	Run 'make update-copyright'.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	%merge: associate it to its first definition, not the latest
+	Currently each time we meet %merge we record this location as the
+	defining location (and symbol).  Instead, record the first definition.
+
+	In the generated code we go from
+
+	    yy0->A = merge (*yy0, *yy1);
+
+	to
+
+	    yy0->S = merge (*yy0, *yy1);
+
+	where S was indeed the first symbol, and in the diagnostics we go from
+
+	    glr-regr18.y:30.18-24: error: result type clash on merge function 'merge': <type2> != <type1>
+	       30 | sym2: sym3 %merge<merge> { $$ = $1; } ;
+	          |                  ^~~~~~~
+	    glr-regr18.y:29.18-24: note: previous declaration
+	       29 | sym1: sym2 %merge<merge> { $$ = $1; } ;
+	          |                  ^~~~~~~
+	    glr-regr18.y:31.13-19: error: result type clash on merge function 'merge': <type3> != <type2>
+	       31 | sym3: %merge<merge> { $$ = 0; } ;
+	          |             ^~~~~~~
+	    glr-regr18.y:30.18-24: note: previous declaration
+	       30 | sym2: sym3 %merge<merge> { $$ = $1; } ;
+	          |                  ^~~~~~~
+
+	to
+
+	    glr-regr18.y:30.18-24: error: result type clash on merge function 'merge': <type2> != <type1>
+	       30 | sym2: sym3 %merge<merge> { $$ = $1; } ;
+	          |                  ^~~~~~~
+	    glr-regr18.y:29.18-24: note: previous declaration
+	       29 | sym1: sym2 %merge<merge> { $$ = $1; } ;
+	          |                  ^~~~~~~
+	    glr-regr18.y:31.13-19: error: result type clash on merge function 'merge': <type3> != <type1>
+	       31 | sym3: %merge<merge> { $$ = 0; } ;
+	          |             ^~~~~~~
+	    glr-regr18.y:29.18-24: note: previous declaration
+	       29 | sym1: sym2 %merge<merge> { $$ = $1; } ;
+	          |                  ^~~~~~~
+
+	where both duplicates are reported against definition 1, rather than
+	using definition 1 as a reference when diagnosing about definition 2,
+	and then 2 as a reference for 3.
+
+	* src/reader.c (record_merge_function_type): Keep the first definition.
+	* tests/glr-regression.at: Adjust.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	%merge: fix compatibility with api.value.type=union
+	Reported by Jot Dot.
+	https://lists.gnu.org/r/help-bison/2020-12/msg00014.html
+
+	* data/skeletons/glr.c, data/skeletons/glr2.cc (b4_call_merger): Use
+	the symbol's slot, not its type.
+	* examples/c/glr/c++-types.y: Use explicit per-symbol typing together
+	with api.value.type=union.
+	(yylex): Use yytoken_kind_t.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	%merge: delegate the generation of calls to mergers to m4
+	Don't generate C code from bison, leave that to the skeletons.
+
+	* src/output.c (merger_output): Emit invocations to b4_call_merger.
+	* data/skeletons/glr.c (b4_call_merger): New.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	%merge: let mergers record a typing-symbol, rather than a type
+	Symbols are richer than types, and in M4 it is my simpler (and more
+	common) to deal with symbols rather than types.  So let's associate
+	mergers to a symbol rather than a type name.
+
+	* src/reader.h (merger_list): Replace the 'type' member by a symbol
+	member.
+	* src/reader.c (record_merge_function_type): Take a symbol as
+	argument, rather than a type name.
+	* src/output.c (merger_output): Adjust.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	%merge: clearer tests on diagnostics
+	* tests/glr-regression.at: Use caret errors.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	skeletons: introduce "slot"s for symbols
+	Extracted from d9cf99b6a5cb0345e91dfb90fe6d6473024ea97a, in the master
+	branch.
+
+	* data/skeletons/bison.m4 (b4_symbol_slot): New, with safer semantics
+	than type and type_tag.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: YYUSE is private, make it YY_USE
+	This macro is not exposed to users, make start it with 'YY_'.
+
+	* data/skeletons/bison.m4, data/skeletons/c.m4, data/skeletons/glr.c,
+	* data/skeletons/glr.cc, data/skeletons/lalr1.cc,
+	* src/parse-gram.c, tests/actions.at, tests/c++.at, tests/headers.at,
+	* tests/local.at (YYUSE): Rename as...
+	(YY_USE): this.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	package: codespell
+	* src/parse-gram.y: Fix spelling.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: fix traces: fix display of disabled items
+	The display of disabled state items is incorrect.  The item is
+	stuttered, and lacks on end-of-line.
+
+	From
+
+	    State 7:
+	        1 exp: exp • "⊕" exp
+	        ->     1 exp: exp "⊕" • exp
+	        <-     1 exp: • exp "⊕" exp
+
+	        2 exp: exp • "+" exp    2 exp: exp • "+" exp DISABLED
+	        2 exp: exp "+" exp •
+	        <-     2 exp: exp "+" • exp
+
+	        3 exp: exp • "+" exp    3 exp: exp • "+" exp DISABLED
+	        3 exp: exp "+" exp •
+	        <-     3 exp: exp "+" • exp
+
+	to
+
+	    State 7:
+	        1 exp: exp • "⊕" exp
+	        ->     1 exp: exp "⊕" • exp
+	        <-     1 exp: • exp "⊕" exp
+
+	        2 exp: exp • "+" exp  DISABLED
+
+	        2 exp: exp "+" exp •
+	        <-     2 exp: exp "+" • exp
+
+	        3 exp: exp • "+" exp  DISABLED
+
+	        3 exp: exp "+" exp •
+	        <-     3 exp: exp "+" • exp
+
+	* src/state-item.c (state_items_report): Don't issue disabled items
+	twice, and issue two '\n' at their end.
+	* tests/conflicts.at: Check it.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: fix traces: add missing end-of-lines
+	In 430ca0fc632f5e8072fe468b8a99c640985f6926, I completely forgot that
+	`puts` adds a `\n`.
+
+	* src/lssi.c, src/state-item.c: Restore missing end-of-lines in the
+	output.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: add support for $TIME_LIMIT
+	* src/counterexample.c (TIME_LIMIT): Replace with...
+	(time_limit): this.
+	(counterexample_init): Check $TIME_LIMIT.
+	* src/scan-gram.l: Reorder includes.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: send traces to stderr, not stdout
+	When comparing traces from different machines, the mixture of
+	stdout/stderr in the output are making things uselessly difficult.
+
+	* src/lssi.c, src/state-item.c: Output debug traces on stderr.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: I'm tired of Flex's warnings
+	* doc/bison.texi: Disable another warning I'm tired to see.
+	New releases would be most welcome.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.cc: don't "leak" yyparse
+	When using glr.cc, the C function yyparse is an internal detail that
+	should not be exposed.  Users might call it by accident (I did).
+
+	* data/skeletons/glr.c (yyparse): When used for glr.cc, rename as yy_parse_impl.
+	* data/skeletons/glr.cc: Adjust.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	tables: avoid warnings and save bits
+	The yydefgoto table uses -1 as an invalid for an impossible case (we
+	never use yydefgoto[0], since it corresponds to the reduction to
+	$accept, which never happens).  Since yydefgoto is a table of state
+	numbers, this -1 forces a signed type uselessly, which (1) might
+	trigger compiler warnings when storing a value from yydefgoto into a
+	state number (nonnegative), and (2) wastes bits which might result in
+	using a int16 where a uint8 suffices.
+
+	Reported by Jot Dot <jotdot@shaw.ca>.
+	https://lists.gnu.org/r/bug-bison/2020-11/msg00027.html
+
+	* src/tables.c (default_goto): Use 0 rather than -1 as invalid value.
+	* tests/regression.at: Adjust.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: use noexcept where appropriate
+	Reported by Don Macpherson.
+	https://github.com/akimd/bison/issues/63
+	https://github.com/akimd/bison/issues/64
+
+	* data/skeletons/c++.m4, data/skeletons/lalr1.cc: here.
+
+2021-01-23  Martin Rehak  <martin.rehak@oracle.com>
+
+	examples: avoid "unbound variable" errors
+	When the shell option `nounset` is set, we may get "unbound variable"
+	errors.
+	https://lists.gnu.org/r/bug-bison/2020-11/msg00013.html
+
+	* examples/test (diff_opts): Be sure to initialize it.
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	autoconf: update
+
+2021-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: adjust _Noreturn to pedantic clang
+	Reported by Joe Nelson <joe@begriffs.com>.
+	https://lists.gnu.org/r/help-bison/2021-01/msg00004.html
+	Fixed by Paul Eggert in gnulib.
+	https://lists.gnu.org/r/bug-gnulib/2021-01/msg00156.html
+
+	* data/skeletons/c.m4 (b4_attribute_define): Adjust _Noreturn to
+	pedantic clang.
+
+2021-01-21  Paul Eggert  <eggert@cs.ucla.edu>
+
+	c: port to HP-UX 11.23
+	Problem reported by Albert Chin in:
+	https://lists.gnu.org/r/bug-bison/2021-01/msg00029.html
+	* data/skeletons/c.m4 (b4_c99_int_type_define):
+	Work around HP-UX bug.
+
+2021-01-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	d: examples: reduce scopes
+	* data/skeletons/lalr1.d (YYLocation.step): New.
+	* examples/d/calc/calc.y (Lexer): Reduce scopes to avoid uninitialized
+	varibles.
+	Factor the handling of locations.
+	We don't need lenChars.
+
+2021-01-17  Adela Vais  <adela.vais99@gmail.com>
+
+	d: examples: calc: remove Value from Lexer
+	The Symbol constructor does not use it, so it is easier to not use
+	Value at all.
+
+	* examples/d/calc/calc.y: Here.
+
+2021-01-17  Adela Vais  <adela.vais99@gmail.com>
+
+	d: examples: calc: use of std.conv.parse for location
+	From Dlang v2.095.0 onwards, std.conv.parse reports the number of
+	consumed characters.
+
+	* examples/d/calc/calc.y: Here.
+
+2021-01-17  Adela Vais  <adela.vais99@gmail.com>
+
+	d: examples: simple: fix style
+	* examples/d/simple/calc.y: Formatting changes.
+
+2021-01-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	CI: run D tests
+	* .travis.yml: here.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	package: codespell
+	* data/skeletons/glr2.cc, src/parse-gram.y: Fix spelling.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	package: fixes
+	* examples/c++/glr/local.mk, examples/c/glr/local.mk (CLEANFILES):
+	Complete to fix distcheck.
+	* src/output.c (merger_output): Obfuscate to pacify syntax-check's
+	sc_space_before_open_paren.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	package: bump copyrights to 2021
+	Run 'make update-copyright'.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+	* src/output.c, src/print-xml.c: Adjust.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	autoconf: update
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: fix traces
+	The display of disabled state items is incorrect.  The item is
+	stuttered, and lacks on end-of-line.
+
+	From
+
+	    State 7:
+	        1 exp: exp • "⊕" exp
+	        ->     1 exp: exp "⊕" • exp
+	        <-     1 exp: • exp "⊕" exp
+
+	        2 exp: exp • "+" exp    2 exp: exp • "+" exp DISABLED
+	        2 exp: exp "+" exp •
+	        <-     2 exp: exp "+" • exp
+
+	        3 exp: exp • "+" exp    3 exp: exp • "+" exp DISABLED
+	        3 exp: exp "+" exp •
+	        <-     3 exp: exp "+" • exp
+
+	to
+
+	    State 7:
+	        1 exp: exp • "⊕" exp
+	        ->     1 exp: exp "⊕" • exp
+	        <-     1 exp: • exp "⊕" exp
+
+	        2 exp: exp • "+" exp  DISABLED
+
+	        2 exp: exp "+" exp •
+	        <-     2 exp: exp "+" • exp
+
+	        3 exp: exp • "+" exp  DISABLED
+
+	        3 exp: exp "+" exp •
+	        <-     3 exp: exp "+" • exp
+
+	* src/state-item.c (state_items_report): Don't issue disabled items
+	twice, and issue two '\n' at their end.
+	* tests/conflicts.at: Check it.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: fix traces
+	In 430ca0fc632f5e8072fe468b8a99c640985f6926, I completely forgot that
+	`puts` adds a `\n`.
+
+	* src/lssi.c, src/state-item.c: Restore missing end-of-lines in the
+	output.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: add support for YYNOMEM
+	Suggested by Joe Nelson <joe@begriffs.com>.
+	https://lists.gnu.org/r/help-bison/2020-12/msg00020.html
+
+	* data/skeletons/glr.c, data/skeletons/yacc.c (YYNOMEM): New.
+	Use it.
+	(yyexhaustedlab): Rename as...
+	(yynomemlab): this.
+	* tests/calc.at: Check it.
+	* doc/bison.texi: Document it.
+	Fix incorrect statements about non-existing constants for YYERROR etc.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: spell check
+	Gettext uses "catalog", not "catalogue".
+
+	* doc/bison.texi, examples/c/README.md,
+	* examples/c/bistromathic/Makefile,
+	* examples/c/bistromathic/README.md,
+	* examples/c/bistromathic/parse.y:
+	Spell check.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c, glr.c: style: rename yyreturn and yyreturnlab
+	* data/skeletons/glr.c, data/skeletons/yacc.c: here.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: style: formatting changes
+	* data/skeletons/glr.c (YYCHK1): here.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: check YYACCEPT and YYABORT
+	There are some tests that cover them, but nothing for all the
+	skeletons.  Let's do that in the calculator tests.
+
+	* tests/calc.at: Check YYACCEPT and YYABORT.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: don't prepare for subclassing
+	I am not aware of people subclassing the parser class, and I fail to
+	see how this could be useful.  Rather than leaving a badly baked
+	feature (as in glr.cc currently), let's not support it at all, until
+	someone comes and explains why and how it would be useful.
+
+	* data/skeletons/glr2.cc (parser): We need no virtual function members.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: formatting changes
+	* data/skeletons/glr2.cc: here.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: move strong_index_alias into implementation file
+	* data/skeletons/glr2.cc: here.
+	Fix coding style issues.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: remove some useless qualifications
+	* data/skeletons/glr2.cc: Rely on the type-aliases provided by
+	glr_stack.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: more free functions about the automaton into glr_stack
+	* data/skeletons/glr2.cc (yypact_value_is_default)
+	(yytable_value_is_error, yyisShiftAction, yyisErrorAction)
+	(yyisDefaultedState, yydefaultAction):
+	Move into...
+	(glr_stack): here.
+	Fix naming conventions.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: move free-functions into glr_stack
+	* data/skeletons/glr2.cc (yypreference, yyLRgotoState): Move into...
+	(glr_stack): here.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: make yygetToken a member of glr_stack
+	It's on purpose that I keep the `this->` now.  We'll see later if we
+	want to remove them.
+
+	* data/skeletons/glr2.cc (yygetToken): Move into...
+	(glr_stack::yyget_token): this.
+	(b4_lex): Adjust.
+
+2021-01-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: move parser::parse into glr_stack
+	Currently we have two classes that actually should be fused together:
+	parser and glr_stack.  Both carry part of the parsing: (i) parser
+	contains `parse`, which is the top-level of the parsing process, it
+	uses yygetToken, etc., and (ii) glr_stack takes care of all the
+	details (dealing with the stack), and also calls yygetToken.
+
+	However if we fuse them together, we would get a large parser class,
+	in the header file.  So it is probably better to split this large
+	class using the pimpl idiom.  But then it appears that glr_stack is
+	very close from being the impl of parser.
+
+	Let's improve this.
+
+	For a start...
+
+	* data/skeletons/glr2.cc (parser::parse): Move to...
+	(glr_stack::parse): here.
+	(parser::parse): Use it.
+
+2021-01-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: add support for $TIME_LIMIT
+	* src/counterexample.c (TIME_LIMIT): Replace with...
+	(time_limit): this.
+	(counterexample_init): Check $TIME_LIMIT.
+	* src/scan-gram.l: Reorder includes.
+
+2021-01-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: adjust _Noreturn to pedantic clang
+	Reported by Joe Nelson <joe@begriffs.com>.
+	https://lists.gnu.org/r/help-bison/2021-01/msg00004.html
+	Fixed by Paul Eggert in gnulib.
+	https://lists.gnu.org/r/bug-gnulib/2021-01/msg00156.html
+
+	* data/skeletons/c.m4 (b4_attribute_define): Adjust _Noreturn to
+	pedantic clang.
+
+2021-01-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: send traces to stderr, not stdout
+	When comparing traces from different machines, the mixture of
+	stdout/stderr in the output are making things uselessly difficult.
+
+	* src/lssi.c, src/state-item.c: Output debug traces on stderr.
+
+2021-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: remove remains from glr.cc
+	* data/skeletons/glr2.cc: We no longer play dirty tricks with
+	parse-params, remove the now useless dance around them.
+	We now have genuine objects for locations, leave the initial action
+	alone.
+
+2021-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: add support for api.token.constructor
+	* data/skeletons/glr2.cc: Add support for api.token.constructor.
+	* examples/c++/glr/c++-types.yy: Use it.
+	* examples/c++/glr/c++-types.test: Adjust expectations for error
+	messages.
+
+2021-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: introduce the yytranslate_ member function
+	* data/skeletons/c++.m4 (b4_yytranslate_define): Use static_cast
+	rather than the YY_CAST macro.
+	Avoids the need to define YY_CAST in the header.
+	* data/skeletons/glr2.cc: Fix calls to b4_shared_declarations: pass
+	the type of file we are in.
+	Don't define YYTRANSLATE.
+	(parser::yytranslate_): New, as in lalr1.cc.
+	Adjust to use it.
+
+	* tests/glr-regression.at: Adjust.
+
+2021-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: tests: simplify
+	* tests/glr-regression.at: Remove useless qualification for tokens.
+
+2021-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: rely on symbol kinds rather than token kinds
+	Instead of tracking the lookahead with yychar, use yytoken.  This is
+	consistent with lalr1.cc, saves us from calls to YYTRANSLATE (except
+	when calling yylex), and makes it easier to migrate to using
+	symbol_type.
+
+	* data/skeletons/glr2.cc: Replace all uses of `int yychar` with
+	`symbol_kind_type yytoken`.
+	(yygetToken): Don't take/return the lookahead's token-kind and
+	symbol-kind, just work directly on yystack's `yytoken` member.
+
+	* tests/glr-regression.at (AT_PRINT_LOOKAHEAD_DECLARE)
+	(AT_PRINT_LOOKAHEAD_DEFINE): New.
+	Adjust to the fact that we have yytoken, not yychar, in glr2.cc.
+
+2021-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: example: style changes
+	* examples/c++/glr/c++-types.yy: We need C++ 11 (we use shared_ptr).
+
+2021-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: use references to print symbols
+	* data/skeletons/glr2.cc (b4_symbol_action): New, so that we use
+	`yyval` and `yyloc` rather than the `yyvaluep` and `yylocationp`
+	pointers.
+	(yy_symbol_value_print_, yy_symbol_print_, yy_destroy_): Use
+	references rather than pointers.
+	Drop support for the undocumented, obsolete, `yyoutput` variable.
+	Adjust callers.
+	(glr_state::destroy): Don't use yy_symbol_print_ when we don't have a
+	symbol.  Rather, write dedicated code.
+
+2021-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: fix memory leak
+	* data/skeletons/glr2.cc (glr_stack_item::setState): Free the previous
+	state before installing the new one.
+
+2021-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr: examples: fix locations
+	The locations are actually false: they should include the location of
+	the semicolon (we print statements), but they don't.
+
+	* examples/c++/glr/c++-types.test, examples/c++/glr/c++-types.yy,
+	* examples/c/glr/c++-types.test, examples/c/glr/c++-types.y,
+	* tests/cxx-type.at:
+	Fix locations and adjust expectations.
+
+2021-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr: tests: more macros
+	This will be useful to support changes in glr2.cc.
+
+	tests/glr-regression.at
+	(Incorrect lookahead during deterministic GLR)
+	(Incorrect lookahead during nondeterministc GLR):
+	Introduce and use PRINT_LOOKAHEAD.
+
+2021-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr: tests: formatting changes
+	* tests/glr-regression.at: here.
+	Use %empty where applicable.
+
+2021-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: fix definition for parser class name
+	* tests/local.at (AT_PARSER_CLASS): Fix it.
+	And use it.
+
+2021-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	CI: disable the installation of dmd
+	Currently all the builds fail:
+
+	    $ mkdir -p ~/dlang && wget https://dlang.org/install.sh -O ~/dlang/install.sh
+	    --2021-01-10 06:05:39--  https://dlang.org/install.sh
+	    Resolving dlang.org (dlang.org)... 162.217.114.56, 2607:fc50:1:ff02::5:0
+	    Connecting to dlang.org (dlang.org)|162.217.114.56|:443... connected.
+	    ERROR: cannot verify dlang.org's certificate, issued by ‘CN=R3,O=Let's Encrypt,C=US’:
+	      Unable to locally verify the issuer's authority.
+	    To connect to dlang.org insecurely, use `--no-check-certificate'.
+
+	* .travis.yml: Disable dmd.
+
+2021-01-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: remove some redundant tests
+	* tests/calc.at: Cut the CI some slack.
+
+2021-01-07  Adela Vais  <adela.vais99@gmail.com>
+
+	d: create getter for the number of errors from the parser
+	* data/skeletons/lalr1.d: Here.
+
+2021-01-07  Adela Vais  <adela.vais99@gmail.com>
+
+	d: remove support for parse.error verbose
+	Without the history, D should not support this option. Before the
+	removal, 'detailed' and 'verbose' options generated the same code.
+
+	* data/skeletons/lalr1.d: Here.
+	* doc/bison.texi: Adapt tests to use 'detailed' instead of 'verbose'.
+	* tests/calc.at: Document it.
+
+2021-01-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	d: add support for %printer
+	Currently we display the addresses of the semantic values.  Instead,
+	print the values.
+
+	Add support for YY_USE across languages.
+
+	* data/skeletons/c.m4, data/skeletons/d.m4 (b4_use): New.
+	* data/skeletons/bison.m4 (b4_symbol_actions): Use b4_use to be
+	portable to D.
+
+	Add support for %printer, and use it.
+
+	* data/skeletons/d.m4: Instead of duplicating what's already in
+	c-like.m4, include it.
+	(b4_symbol_action): New.
+	Differs from the one in bison.m4 in that it uses yyval/yyloc instead
+	of *yyvaluep and *yylocationp.
+
+	* data/skeletons/lalr1.d (yy_symbol_print): Avoid calls to formatting,
+	just call write directly.
+	Use the %printer.
+	* examples/d/calc/calc.y: Specify a printer.
+	Enable traces when $YYDEBUG is set.
+	* tests/calc.at: Fix the use of %printer with D.
+
+2021-01-06  Adela Vais  <adela.vais99@gmail.com>
+
+	d: remove unnecessary imports
+	* data/skeletons/lalr1.d: Here.
+
+2021-01-06  Adela Vais  <adela.vais99@gmail.com>
+
+	d: remove yytnamerr usage
+	It is a backwards-compatible feature for the other parsers.
+	D should not support this option.
+
+	* data/skeletons/d.m4: Here.
+
+2021-01-06  Adela Vais  <adela.vais99@gmail.com>
+
+	d: add internationalisation support
+	The D parser implements this feature similarly to the C parser,
+	by using Gettext. Functions gettext() and dgettext() are
+	imported using extern(C). The internationalisation uses yysymbol_name
+	to report the name of the SymbolKinds.
+
+	* data/skeletons/d.m4 (SymbolKind.toString.yytranslatable,
+	SymbolKind.toString.yysymbol_name: New), data/skeletons/lalr1.d: Here.
+	* doc/bison.texi: Document it.
+	* tests/calc.at: Test it.
+
+2021-01-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: add support for variants
+	(Bison) Variants are extremely picky, which makes them both
+	annoying (lots of micro-details must be taken care of) and
+	precious (all the micro-details must be taken care of, in particular
+	object lifetime).
+
+	So (i) each time a semantic value is stored, it must be stored in a
+	place that exists, and (ii) each time a semantic value is discarded,
+	its place must have been emptied.
+
+	Example of (i)
+
+	    - new (&yys.value ()) value_type (s->value ());
+	    + {]b4_variant_if([[
+	    +   new (&yys.value ()) value_type ();
+	    +   ]b4_symbol_variant([yy_accessing_symbol (s->yylrState)],
+	    +                      [yys.value ()], [copy], [s->value ()])], [[
+	    +   new (&yys.value ()) value_type (s->value ());]])[
+	    + }
+
+	Example of (ii)
+
+	      yyparser.yy_destroy_ ("Error: discarding",
+	    -                       yytoken, &yylval]b4_locations_if([, &yylloc])[);
+	    +                       yytoken, &yylval]b4_locations_if([, &yylloc])[);]b4_variant_if([[
+	    + // Value type destructor.
+	    + ]b4_symbol_variant([[YYTRANSLATE (this->yychar)]], [[yylval]], [[template destroy]])])[
+	      this->yychar = ]b4_namespace_ref[::]b4_parser_class[::token::]b4_symbol(empty, id)[;
+
+	However, in some places we must not be "pure".  In particular:
+
+	    glr_stack_item (const glr_stack_item& other) YY_NOEXCEPT YY_NOTHROW
+	      : is_state_ (other.is_state_)
+	    {
+	      std::memcpy (raw_, other.raw_, union_size);
+	    }
+
+	still must use memcpy, because the constructor would change pred, and
+	it must not.  This constructor is used only when resizing the stack,
+	in which case pred (which is relative) must not be "adjusted".
+
+	The result works, but is messy.  Its verbosity comes from at least two
+	factors:
+
+	- we don't have support for complete symbols (binding kind, value and
+	  location), and we should at least try to have it.  That simplified
+	  lalr1.cc a lot.
+
+	- I have not tried to be smart and use 'move' when possible.  As a
+	  consequence many places have 'copy' and then 'destroy'.  That kind
+	  of clean up can be done once everything appears to be solid.
+
+	* data/skeletons/glr2.cc: Be more rigorous in object lifetime.
+	In particular, don't forget to discard the lookahead when we're done
+	with it.
+	Call variant routines where needed.
+	Deal with plenty of details.
+	(b4_call_merger): Add support for variants.
+	Use references in mergers, rather than pointers.
+
+	* examples/c++/glr/c++-types.yy: Exercise variants.
+
+2021-01-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr: strengthen the tests
+	On some experimentation I was running, the test suite was passing, yet
+	the example crashed when run in verbose mode.  Let's add this case to
+	the test suite.
+
+	* tests/cxx-type.at: Run all these tests in verbose mode too.
+
+2021-01-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: I'm tired of Flex's warnings
+	* doc/bison.texi: Disable another warning I'm tired to see.
+	New releases would be most welcome.
+
+2021-01-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr: example: flush the output
+	* examples/c/glr/c++-types.y: Flush stdout so that the logs (on
+	stderr) and the effective output (on stdout) mix correctly.
+	While at it, be a bit more const-correct.
+
+2021-01-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: YYUSE is private, make it YY_USE
+	This macro is not exposed to users, make start it with 'YY_'.
+
+	* data/skeletons/bison.m4, data/skeletons/c.m4, data/skeletons/glr.c,
+	* data/skeletons/glr.cc, data/skeletons/glr2.cc, data/skeletons/lalr1.cc,
+	* src/parse-gram.c, tests/actions.at, tests/c++.at, tests/headers.at,
+	* tests/local.at (YYUSE): Rename as...
+	(YY_USE): this.
+
+2021-01-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: example: use a printer
+	* examples/c++/glr/c++-types.yy: Here.
+
+2021-01-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr: consistently use the same wording in traces
+	* data/skeletons/glr.c, data/skeletons/glr2.cc (yyglrReduce): Traces
+	refer to "state 42", not to "state #42".
+
+2021-01-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: also equip semantic_option with self check
+	* data/skeletons/glr2.cc (semantic_option): Add MAGIC_, magic_ and
+	check_ members.
+	Use it.
+
+2021-01-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: log the execution of deferred actions
+	See "glr.c: log the execution of deferred actions".
+
+	* data/skeletons/glr2.cc (yyuserAction): Take yyk as a new argument.
+	Rename argument yyn as yyrule for clarity.
+	Log before and after the user action.
+	Adjust callers to not call YY_REDUCE_PRINT and YY_SYMBOL_PRINT.
+
+2021-01-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: minor clean up
+	* data/skeletons/glr2.cc (YYUNDEFTOK): Now useless.
+	Formatting/coding style changes.
+
+2021-01-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: log the execution of deferred actions
+	Currently deferred reductions are not "verbose" at all: only immediate
+	reductions are displayed in the YYDEBUG traces.  I don't understand
+	why.  Besides it seems actually simpler the install the reduction
+	traces right around the user action inside yyuserAction rather that
+	around calls to yyuserAction.
+
+	This only trouble is that yyuserAction does not know the stack number
+	it works on, so we have to pass it.  And pass -1 when we are actually
+	running on a temporary stack.
+
+	The glr example, on "T(x) + y;" as input, adds these logs, which
+	allow to see when the `<cast>` is built:
+
+	     Stack 0 Entering state 26
+	     Reduced stack 0 by rule 7 (line 108); action deferred.  Now in state 7.
+	     Stack 0 Entering state 7
+	     Reading a token
+	     Next token is token '+' (1.6: )
+	     Stack 1 Entering state 27
+	     Reduced stack 1 by rule 13 (line 123); action deferred.  Now in state 12.
+	     Stack 1 Entering state 12
+	     Next token is token '+' (1.6: )
+	     Stack 1 dies.
+	     Removing dead stacks.
+	     On stack 0, shifting token '+' (1.6: )
+	     Stack 0 now in state #14
+	    +Reducing stack -1 by rule 6 (line 107):
+	    +   $1 = token identifier (1.3: x)
+	    +-> $$ = nterm expr (1.3: x)
+	    +Reducing stack -1 by rule 7 (line 108):
+	    +   $1 = token typename (1.0: T)
+	    +   $2 = token '(' (1.2: )
+	    +   $3 = nterm expr (1.3: x)
+	    +   $4 = token ')' (1.4: )
+	    +-> $$ = nterm expr (1.0-3: <cast>(x,T))
+	     Returning to deterministic operation.
+
+	* data/skeletons/glr.c (yyuserAction): Take yyk as a new argument.
+	Rename argument yyn as yyrule for clarity.
+	Log before and after the user action.
+	Adjust callers to not call YY_REDUCE_PRINT and YY_SYMBOL_PRINT.
+
+2021-01-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: reorder routines
+	The next commit wants to use YY_REDUCE_PRINT above its current
+	definition.  Move it higher.
+
+	* data/skeletons/glr.c (yylhsNonterm, YY_REDUCE_PRINT): Make available
+	earlier.
+
+2021-01-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: example: use the exact same display as in the C++ example
+	* examples/c/glr/c++-types.y: Add a space after the commas.
+	* examples/c/glr/c++-types.test: Adjust expectations.
+
+2021-01-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: example: several improvements
+	* examples/c/glr/c++-types.y (node_print): New.
+	Use YY_LOCATION_PRINT instead of duplicating it.
+	And actually use it in the action instead of badly duplicating it.
+	(main): Add proper option support.
+	* examples/c/glr/c++-types.test: Adjust expectations on locations.
+	* examples/c++/glr/c++-types.yy: Fix bad iteration.
+
+2020-12-31  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: the example requires Bison 3.8
+	This will save us from generating the position.hh file.
+
+	* src/parse-gram.y: Claim we are 3.8.
+	* examples/c++/glr/c++-types.yy: Require 3.8.
+
+2020-12-31  Akim Demaille  <akim.demaille@gmail.com>
+
+	%merge: associate it to its first definition, not the latest
+	Currently each time we meet %merge we record this location as the
+	defining location (and symbol).  Instead, record the first definition.
+
+	In the generated code we go from
+
+	    yy0->A = merge (*yy0, *yy1);
+
+	to
+
+	    yy0->S = merge (*yy0, *yy1);
+
+	where S was indeed the first symbol, and in the diagnostics we go from
+
+	    glr-regr18.y:30.18-24: error: result type clash on merge function 'merge': <type2> != <type1>
+	       30 | sym2: sym3 %merge<merge> { $$ = $1; } ;
+	          |                  ^~~~~~~
+	    glr-regr18.y:29.18-24: note: previous declaration
+	       29 | sym1: sym2 %merge<merge> { $$ = $1; } ;
+	          |                  ^~~~~~~
+	    glr-regr18.y:31.13-19: error: result type clash on merge function 'merge': <type3> != <type2>
+	       31 | sym3: %merge<merge> { $$ = 0; } ;
+	          |             ^~~~~~~
+	    glr-regr18.y:30.18-24: note: previous declaration
+	       30 | sym2: sym3 %merge<merge> { $$ = $1; } ;
+	          |                  ^~~~~~~
+
+	to
+
+	    glr-regr18.y:30.18-24: error: result type clash on merge function 'merge': <type2> != <type1>
+	       30 | sym2: sym3 %merge<merge> { $$ = $1; } ;
+	          |                  ^~~~~~~
+	    glr-regr18.y:29.18-24: note: previous declaration
+	       29 | sym1: sym2 %merge<merge> { $$ = $1; } ;
+	          |                  ^~~~~~~
+	    glr-regr18.y:31.13-19: error: result type clash on merge function 'merge': <type3> != <type1>
+	       31 | sym3: %merge<merge> { $$ = 0; } ;
+	          |             ^~~~~~~
+	    glr-regr18.y:29.18-24: note: previous declaration
+	       29 | sym1: sym2 %merge<merge> { $$ = $1; } ;
+	          |                  ^~~~~~~
+
+	where both duplicates are reported against definition 1, rather than
+	using definition 1 as a reference when diagnosing about definition 2,
+	and then 2 as a reference for 3.
+
+	* src/reader.c (record_merge_function_type): Keep the first definition.
+	* tests/glr-regression.at: Adjust.
+
+2020-12-31  Akim Demaille  <akim.demaille@gmail.com>
+
+	%merge: test support for api.value.type=union
+	* tests/glr-regression.at: here.
+
+2020-12-31  Akim Demaille  <akim.demaille@gmail.com>
+
+	%merge: fix compatibility with api.value.type=union
+	Reported by Jot Dot.
+	https://lists.gnu.org/r/help-bison/2020-12/msg00014.html
+
+	* data/skeletons/glr.c, data/skeletons/glr2.cc (b4_call_merger): Use
+	the symbol's slot, not its type.
+	* examples/c/glr/c++-types.y: Use explicit per-symbol typing together
+	with api.value.type=union.
+	(yylex): Use yytoken_kind_t.
+
+2020-12-31  Akim Demaille  <akim.demaille@gmail.com>
+
+	%merge: delegate the generation of calls to mergers to m4
+	Don't generate C code from bison, leave that to the skeletons.
+
+	* src/output.c (merger_output): Emit invocations to b4_call_merger.
+	* data/skeletons/glr.c, data/skeletons/glr2.cc (b4_call_merger): New.
+
+2020-12-31  Akim Demaille  <akim.demaille@gmail.com>
+
+	%merge: let mergers record a typing-symbol, rather than a type
+	Symbols are richer than types, and in M4 it is my simpler (and more
+	common) to deal with symbols rather than types.  So let's associate
+	mergers to a symbol rather than a type name.
+
+	* src/reader.h (merger_list): Replace the 'type' member by a symbol
+	member.
+	* src/reader.c (record_merge_function_type): Take a symbol as
+	argument, rather than a type name.
+	* src/output.c (merger_output): Adjust.
+
+2020-12-31  Akim Demaille  <akim.demaille@gmail.com>
+
+	%merge: clearer tests on diagnostics
+	* tests/glr-regression.at: Use caret errors.
+
+2020-12-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: style: quoting changes
+	* data/skeletons/glr2.cc: Use stricter quoting rules.
+
+2020-12-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	lalr1.cc: style: quoting changes
+	* data/skeletons/lalr1.cc: here.
+
+2020-12-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: use references to the stack rather than pointers
+	Now that the lookahead macros (that used yystackp) are out of the way,
+	there is no reason to continue using a pointer.
+
+	* data/skeletons/glr2.cc: Use yystack, a reference, rather that
+	yystackp, a pointer.
+	Fix tons of const-correctness issues.
+
+2020-12-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: simplify names
+	Now that we no longer play dangerous games with macros, we can give
+	the lookahead's token kind its proper name.  The content of yychar
+	_is_ raw (as opposed to yytoken), there's no reason to pleonasmicate
+	it (and thus to neologize).
+
+	* data/skeletons/glr2.cc (glr_stack::yyrawchar): Rename as...
+	(glr_stack::yychar): this.
+
+2020-12-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: get rid of the macros wrapping the lookahead
+	In glr.c, the macros yychar, yylval and yylloc allow to deal with
+	api.pure: sometimes they point to global variables (impure), sometimes
+	they point to the member variables (pure).
+
+	There's no room for globals in glr2.cc.  Besides, they map yychar to
+	yyrawchar, yylval to yyval, etc. which obfuscates what is actually
+	going on.
+
+	* data/skeletons/glr2.cc (glr_stack::yyval, glr_stack::yyloc): Rename
+	as...
+	(glr_stack::yylval, glr_stack::yylloc): these, for clarity.
+	(yynerrs, yychar, yylval, yylloc, yystackp): Remove these macros.
+	(b4_yygetToken_call): Remove.
+
+2020-12-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: reorganize the skeleton
+	Restore a more natural order: first define the macros and then use
+	them.  Currently, some macros were defined between the moment the
+	header is issued, and then the implementation file.  As a result, it
+	was possible for the header and the implementation to not use the same
+	versions of the macros.
+
+	* data/skeletons/glr2.cc: Define the macros first, then use them.
+	* data/skeletons/lalr1.cc: Minor comment and quoting changes.
+
+2020-12-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: example: simplify
+	* examples/c++/glr/c++-types.yy: Formatting changes.
+	Remove unused support for '@'.
+	* examples/c/glr/c++-types.y: Ditto.
+
+2020-12-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: make yyreportTree a member function of semantic_option
+	* data/skeletons/glr2.cc (yy_accessing_symbol, yylhsNonterm): Define
+	ealier.
+	(state_stack::yyreportTree): Move to...
+	(semantic_option::yyreportTree): here.
+	Adjust dependencies.
+
+2020-12-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: pass references to yyreportAmbiguity
+	* data/skeletons/glr2.cc (yyreportAmbiguity): Use references.
+
+2020-12-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: use yyval only, not yysval
+	* data/skeletons/glr.c, data/skeletons/glr2.cc: Use yyval, as in
+	the other skeletons.
+
+2020-12-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: pass location by const ref to yyglrShift
+	* data/skeletons/glr2.cc (glr_state.yyglrShift): Take the location by
+	const&.
+	Remove useless `inline`.
+
+2020-12-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: rename semanticVal as value
+	* data/skeletons/README-D.txt: Remove, now useless and obsolete.
+	* data/skeletons/glr2.cc, examples/d/calc/calc.y,
+	* tests/calc.at, tests/d.at, tests/scanner.at (semanticVal): Replace
+	with...
+	(value): this.
+
+2020-12-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: remove dead comments
+	* data/skeletons/glr2.cc: We no longer wrap glr.c here.
+
+2020-12-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: use YYCDEBUG, not YY_DEBUG_STREAM
+	* data/skeletons/glr2.cc (YY_DEBUG_STREAM): Rename as...
+	(YYCDEBUG): this, as in lalr1.cc.
+
+2020-12-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: formatting changes
+	* data/skeletons/glr2.cc: here.
+	Remove useless `inline`.
+
+2020-12-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: don't use YYSTYPE/YYLTYPE at all
+	* data/skeletons/glr2.cc: Define value_type and location_type where
+	needed, and use them only.
+	(yyuserMerge): Make it a member function of the glr_state class.
+
+2020-12-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: don't require YYSTYPE/YYLTYPE to be defined in C++
+	* tests/glr-regression.at: Use AT_YYSTYPE/AT_YYLTYPE to generate
+	yy::parser::value_type and yy::parser::location_type in C++.
+
+2020-12-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: rename semantic_type as value_type
+	We always refer to the triplet "kind, value, location".  All of them
+	are nouns, and we support api.value.type and api.location.type.  On
+	this regard, "semantic_type" was a poor choice.  Make it "value_type".
+
+	The test suite was not updated to use value_type, on purpose, to
+	enforce backward compatibility.
+
+	* data/skeletons/c++.m4, data/skeletons/glr.cc, data/skeletons/glr2.cc,
+	* data/skeletons/variant.hh, doc/bison.texi: Define value_type rather
+	than semantic_type.
+	Add a backward compatibility typedef.
+	* examples/c++/glr/c++-types.yy: Migrate.
+
+2020-12-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: more about sanitizers
+	* README-hacking.md: here.
+
+2020-12-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: simplify
+	* data/skeletons/glr2.cc (glr_state_set::yyremoveDeletes): Use
+	vector::resize rather than vector::erase.
+	(glr_state::copyFrom): Merge into...
+	(glr_state::operator=): here.
+	Valentin wanted each assignment to be explicit, hence copyFrom rather
+	that operator=.  But in 0a82316e54fead8c3f1cf41d2213c868ab88f508
+	(glr2.cc: example: use objects (not pointers) to represent the AST),
+	in order to get real objects to be processed correctly, we had to
+	introduce the assignment operator.  Afterward, we also introduced a
+	full implementation of the copy-ctor, independent of copyFrom.  As a
+	result, today the only invocation of copyFrom is from the assignment
+	operator.  Simplify this.
+
+2020-12-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: fix warnings about uninitialized locations
+	With GCC10, the CI shows tons of warnings such as
+	(327. actions.at:374: testing Initial location: glr2.cc):
+
+	    input.cc: In member function 'YYRESULTTAG glr_stack::yyglrReduce(state_set_index, rule_num, bool)':
+	    input.cc:1357:11: error: '<anonymous>.glr_state::yyloc' may be used uninitialized in this function [-Werror=maybe-uninitialized]
+	     1357 |     yyloc = other.yyloc;
+	          |     ~~~~~~^~~~~~~~~~~~~
+
+	This is because we don't have the constructors for locations.  But we
+	should have them!  That's only because of glr.cc that ctors were not
+	enabled by default.  In glr2.cc, they should.
+
+	That fixes all the warnings when Bison's locations are used.  However,
+	when user-defined locations without constructor are used, we still
+	have:
+
+	    550. calc.at:1409: testing Calculator glr2.cc %locations api.location.type={Span}  ...
+	    calc.cc: In member function 'YYRESULTTAG glr_stack::yyglrReduce(state_set_index, rule_num, bool)':
+	    calc.cc:1261:11: error: '<anonymous>.glr_state::yyloc' may be used uninitialized in this function [-Werror=maybe-uninitialized]
+	     1261 |     yyloc = other.yyloc;
+	          |     ~~~~~~^~~~~~~~~~~~~
+
+	To address this case, we need glr_state to explicily initialize its
+	yyloc member.
+
+	* data/skeletons/glr2.cc: Use genuine objects, with ctors, for position
+	and location.
+	(glr_state): Explicitly initialize yyloc in the constructors.
+
+2020-12-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: provide glr_state with a genuine copy-constructor
+	The copy constructor was (lazily) implemented by a call to copyFrom.
+	Unfortunately copyFrom reads yyresolved from the destination (and
+	source), and in the case of the copy-ctor this is random garbagge,
+	which UBSAN catches:
+
+	    glr-regr2a.cc:1072:10: runtime error: load of value 7, which is not a valid value for type 'bool'
+
+	Rather than defining yyresolved before calling copyFrom, let's just
+	provide a genuine cpy-ctor for glr_state.
+
+	* data/skeletons/glr2.cc (glr_state::glr_state): Implement properly.
+
+2020-12-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: beware of self-assignment
+	In yycompressStack:
+
+	    while (yyr != YY_NULLPTR)
+	      {
+	        nextFreeItem->check_ ();
+	        yyr->check_();
+	        nextFreeItem->setState(*yyr);
+	        glr_state& nextFreeState = nextFreeItem->getState();
+	        yyr = yyr->pred();
+	        nextFreeState.setPred(&(nextFreeItem - 1)->getState());
+	        setFirstTop(&nextFreeState);
+	        ++nextFreeItem;
+	      }
+
+	it is possible that nextFreeItem and yyr are actually the same state.
+	In which case `nextFreeItem->setState(*yyr)` does really bad things.
+
+	* data/skeletons/glr2.cc (glr_stack_item::setState): Beware of
+	self-assignment.
+
+2020-12-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr: comment changes
+	* data/skeletons/glr.c: A bit more doc.
+	(yypstates): Rename yyst (only occurrence) to yys (commonly used for
+	yyGLRState).
+	* data/skeletons/glr2.cc: Ditto.
+	Prefer '\n' to "\n".
+
+2020-12-21  Adela Vais  <adela.vais99@gmail.com>
+
+	d: remove unnecessary methods from the Lexer interface
+	The complete symbol approach in yylex removes the need for the methods
+	semanticVal, startPos and endPos, which were used when the values were
+	reported separately.
+
+	* data/skeletons/lalr1.d: Here.
+	* doc/bison.texi: Remove sections about the three methods.
+	* examples/d/calc/calc.y, examples/d/simple/calc.y: Remove the unused methods.
+	* tests/calc.at, tests/d.at, tests/scanner.at: Test it.
+
+2020-12-21  Adela Vais  <adela.vais99@gmail.com>
+
+	d: use Location and Position aliases in the backend
+	* data/skeletons/lalr1.d: Here.
+
+2020-12-21  Adela Vais  <adela.vais99@gmail.com>
+
+	d: remove unnecessary comparison from YYParser.parse()
+	* data/skeletons/lalr1.d: Here.
+
+2020-12-21  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: address syntax-check diagnostics
+	* examples/c/glr/c++-types.y: Formatting changes.
+	* po/POTFILES.in: Add missing files.
+	* src/reader.c: Remove useless include.
+	* tests/calc.at: Avoid magic values for exit.
+	Obfuscate calls to error.
+
+2020-12-21  Adela Vais  <adela.vais99@gmail.com>
+
+	d: create alias Position for YYPosition
+	* data/skeletons/d.m4 (b4_public_types_declare): Here.
+	* data/skeletons/lalr1.d: Adjust.
+	* doc/bison.texi: Document it.
+	* examples/d/calc/calc.y: Use it.
+	* tests/calc.at: Test it.
+
+2020-12-21  Adela Vais  <adela.vais99@gmail.com>
+
+	d: create alias Value for YYSemanticType
+	* data/skeletons/d.m4: Here.
+	* data/skeletons/lalr1.d, examples/d/calc/calc.y, examples/d/simple/calc.y: Adjust.
+	* tests/calc.at, tests/d.at, tests/scanner.at: Test it.
+
+2020-12-21  Adela Vais  <adela.vais99@gmail.com>
+
+	d: create alias Location for YYLocation
+	* data/skeletons/d.m4: Here.
+	* doc/bison.texi: Document it.
+	* examples/d/calc/calc.y: Adjust.
+	* tests/calc.at: Test it.
+
+2020-12-21  Adela Vais  <adela.vais99@gmail.com>
+
+	d: remove yychar from YYParse.parse()
+	The yychar variable was keeping the external form of the token (the
+	TokenKind).  As the D parser translates the token to its internal
+	form (the SymbolKind) inside the struct Symbol, there is no need for
+	yychar anymore.
+
+	* data/examples/lalr1.d (yychar): Remove.
+	Use only yytoken.
+
+2020-12-21  Adela Vais  <adela.vais99@gmail.com>
+
+	d: reduce verbosity for returning the location from yylex()
+	* examples/d/calc/calc.y (start, end): Replace by this...
+	(location): new member variable in the Lexer class.
+	Use it.
+	* tests/calc.at: Use the defined location variable.
+
+2020-12-21  Adela Vais  <adela.vais99@gmail.com>
+
+	d: m4 style consistency fix
+	* data/skeletons/lalr1.d: Here.
+
+2020-12-21  Adela Vais  <adela.vais99@gmail.com>
+
+	d: create alias Symbol for YYParse.Symbol
+	* data/skeletons/lalr1.d: Here.
+	* doc/bison.texi: Document it.
+	* examples/d/calc/calc.y, examples/d/simple/calc.y: Adjust.
+	* tests/calc.at, tests/d.at, tests/scanner.at: Test it.
+
+2020-12-21  Adela Vais  <adela.vais99@gmail.com>
+
+	d: change name of YYParser.Symbol's semanticValue() to value()
+	Member value was renamed to value_ to avoid the name clash.
+
+	* data/skeletons/d.m4: Change member names.
+	* data/skeletons/lalr1.d: Adjust.
+
+2020-12-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: formatting changes
+	* data/skeletons/glr2.cc (glr_state): here.
+	(glr_state::MAGIC): Make it easier to recognize in decimal.
+
+2020-12-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: call the destructor in a way that complies with clang
+	    examples/c++/glr/c++-types.cc:721:24: error:
+	      expected the class name after '~' to name a destructor
+	    yysval.YYSTYPE::~semantic_type ();
+	                    ^
+
+	Using a local typedef, for some reaon, result in clang complaining
+	about a useless local typedef.  Since anyway we don't want to keep on
+	using YYSTYPE and YYLTYPE, it is time to introduce proper typedefs to
+	reach these guys.  And to be slightly in advance of the other
+	skeletons: use value_type, not semantic_type.  This is much more
+	consistent with our use of the (kind, value, location) triplet.
+
+	* data/skeletons/glr2.cc (glr_state::value_type)
+	(glr_state::location_type): New.
+	(glr_state::~glr_state): Use value_type to name the dtor.
+
+2020-12-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: example: use objects (not pointers) to represent the AST
+	Currently we are using pointers.  The whole point of
+	glr2.cc (vs. glr.cc) is precisely to allow genuine C++ objects to be
+	semantic values.  Let's make that work.
+
+	* data/skeletons/glr2.cc (glr_state::glr_state): Be sure to initialize
+	yysval.
+	(glr_state): Add copy-ctor, assignment and dtor.
+	(glr_state::copyFrom): Be sure to initialize the destination if it was
+	not.
+	(glr_state::~glr_state): Destroy the semantic value.
+	* examples/c++/glr/ast.hh: Rewrite so that we use genuine objects,
+	rather than a traditional OOP hierarchy that requires to deal with
+	pointers.
+	With help from Bruno Belanyi <bruno.belanyi@epita.fr>.
+	* examples/c++/glr/c++-types.yy: Remove memory management.
+	Use true objects.
+	(main): Don't reach yydebug directly.
+
+	* examples/c++/glr/local.mk: We need C++11.
+
+2020-12-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: more checks
+	* data/skeletons/glr2.cc: Clarify use of magic numbers.
+	(glr_stack_item::getState): Check the returned state.
+
+2020-12-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: fix GLR stack expansion
+	When expanding the GLR stack, none of the pointers were updated to
+	reflect the new location of the displaced objects.
+
+	This fixes
+
+	    748: Incorrect lookahead during nondeterministic GLR: glr2.cc
+
+	* data/skeletons/glr2.cc (yyexpandGLRStack): Update the split point
+	and the stack tops.
+	(reduceToOneStack): Factor a bit.
+
+2020-12-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: factor the computation of the accessing symbol
+	* data/skeletons/glr2.cc (yy_accessing_symbol): New, as in glr.c.
+	Use it.
+
+2020-12-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: fix calling conventions for yyexpandGLRStackIfNeeded
+	This test fails:
+
+	748: Incorrect lookahead during nondeterministic GLR: glr2.cc
+
+	It consumes lots of stack space, so at some point we need to expand
+	it.  Because of Boolean logic mistakes, we then claim
+	memory-exhausted (first error).  Hence we jump to cleaning the
+	stack (popall_), calling all the destructors, and at some point we
+	crash with heap-use-after-free (second error).
+
+	This commit fixes the first error.  Unfortunately, even though we now
+	do expand the stack, we crash again with (another)
+	heap-use-after-free, not addressed here.
+
+	Eventually, we should make sure popall_() properly works.
+
+	* data/skeletons/glr2.cc (yyexpandGLRStackIfNeeded): Return true iff
+	success (i.e., memory not exhausted).
+
+2020-12-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: example: use streams and accept arguments
+	From a debugger, it is easier to pass a file name than working on
+	stdin.
+
+	* examples/c++/glr/c++-types.yy: Reduce scopes.
+	Avoid YYSTYPE/YYLTYPE: use the C++ types.
+	(input, process): New.
+	(main): Use them.
+
+2020-12-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr: formatting changes
+	* data/skeletons/glr.c: Formatting changes.
+	* data/skeletons/glr2.cc: Ditto.
+	(glr_state_set::INITIAL_NUMBER_STATES): Remove, unused (and useless:
+	let std::vector deal with that).
+
+2020-12-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	skeletons: better comments for some tables
+	And also, remove the incorrect indentation of these comments:
+
+	    -  /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
+	    +/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM.  */
+	     static const yytype_int8 yyr2[] =
+	     {
+	            0,     2,     4,     0,     2,     1,     1,     1,     3,     2,
+
+	I don't remember why this indentation was added (in
+	0991e29b75f192570b6fac1ba23657ab4f3509ee), but it seems wrong,
+	at least for yacc.c.  I suspect this was done with lalr1.cc (where
+	this is embeded in the class definition, so it should be indented),
+	but today lalr1.cc uses other routines to output these comments.
+
+	* data/skeletons/bison.m4 (b4_integral_parser_tables_map): Improve the
+	wording of the comments of some tables.
+	* data/skeletons/c.m4 (b4_integral_parser_table_define): Remove
+	indentation.
+
+2020-12-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: fix glr_stack_item::setState
+	A glr_stack_item has "raw" memory to store either a glr_state or a
+	semantic_option.  glr_stack_item::setState stores a state using a copy
+	assignment.  However, this is more like a construction: we are
+	starting from "raw" memory, so use the placement new operator instead.
+	While it probably makes no difference when parse.assert is disabled,
+	it does make one when it is: the constructor properly initialize the
+	magic number, the assignment does not.  So without these changes, the
+	next commit (which stores genuine objects in semantic values) fails
+	tests 712 and 730 because of incorrect magic numbers.
+
+	* data/skeletons/glr2.cc (glr_stack_item::setState): Build the state,
+	don't just copy it.
+
+2020-12-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: more self checks
+	* data/skeletons/glr2.cc: here.
+
+2020-12-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: style: s/Type/Kind/g
+	* data/skeletons/glr2.cc (YY_SYMBOL_PRINT): Use Kind, not Type.
+	As in the other skeletons.
+
+2020-12-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: example: style: add missing copyright headers
+	* examples/c++/glr/ast.hh, examples/c++/glr/c++-types.yy: here.
+	* examples/c++/glr/local.mk: Fix distribution of ast.hh.
+
+2020-12-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: example: address Clang warnings
+	    ast.hh:24:7: error: 'Node' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Werror,-Wweak-vtables]
+	    class Node
+	          ^
+	    ast.hh:57:7: error: 'Nterm' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Werror,-Wweak-vtables]
+	    class Nterm : public Node
+	          ^
+	    ast.hh:102:7: error: 'Term' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Werror,-Wweak-vtables]
+	    class Term : public Node
+	          ^
+
+	* examples/c++/glr/ast.hh: Define the destructors out of the class
+	definition.
+	This does not change anything, it is still in the header, but that
+	does pacify clang.
+
+2020-12-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr: tests: add support for the YYDEBUG envvar
+	When debugging these parsers, we really need debug traces.
+	Enable them, and bind them to $YYDEBUG.
+
+	* tests/glr-regression.at: Support the YYDEBUG envvar.
+	As a consequence, now that syntactic ambiguities are reported, adjust
+	the expected output.
+	(No users destructors if stack 0 deleted): Don't return 0 on memory
+	exhaustion, really return the parser's status, and adust expectations.
+
+2020-12-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: comment changes
+	* data/skeletons/glr.c (yycompressStack): Reduce scope, and import some
+	nice comments from glr2.cc.
+
+2020-12-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: make the example more C++
+	Currently the example really looks like C.  Instead of a union of
+	structs to implement the AST, use a hierarchy.  It would be nice to
+	feature a C++17 version with std variants.
+
+	* examples/c++/glr/c++-types.yy (Node, free_node, new_nterm)
+	(new_term): Move into...
+	* examples/c++/glr/ast.hh: here, a proper C++ hierarchy.
+
+2020-12-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: make yyparse a member function
+	Amusingly enough, glr2.cc still had its core function, yyparse, being
+	a free function instead of a member function.
+
+	* data/skeletons/glr2.cc (yyparse): Remove this free function called
+	from yyparser::parse.  Inline its body into...
+	(yyparser::parse): this member function.
+	This requires moving a bit the yychar, etc. macros.
+	Access to token can be simplified (the
+	b4_namespace_ref::b4_parser_class prefix is no longer needed).
+
+2020-12-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: being pure is not an option
+	Remove the useless conditional b4_pure_if: the skeleton is, of course,
+	pure (no global variables).  Make glr2.cc intrinsically pure.
+
+	* data/skeletons/glr2.cc (b4_pure_if): Remove definition and uses.
+	(b4_lex): New.
+	Stolen from lalr1.cc to avoid needing to use the one from c.m4.
+
+2020-12-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: fix yycompressStack
+	Currently, yycompressStack expects the free items to be states only.
+	That's not the case.
+
+	Fixes 712 and 730 pass.  748 still fails, but later and
+	differently (heap-use-after-free).
+
+	* data/skeletons/glr2.cc (glr_stack_item::setState): New.
+	(glr_stack_item::yycompressStack): Use it.
+	* tests/glr-regression.at: Adjust.
+
+2020-12-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: fix pointer arithmethics
+	A glr_state keeps tracks of its predecessor using an offset relative
+	to itself (i.e., pointer subtraction).  Unfortunately we sometimes
+	have to compute offsets for pointers that live in different
+	containers, in particular in yyfillin.  In that case there is no
+	reason for the distance between the two objects to be a multiple of
+	the object size (0x40 on my machine), and the resulting ptrdiff_t may
+	be "wrong", i.e., it does allow to recover one from the other.  We
+	cannot use "typed" pointer arithmetics here, the Euclidean division
+	has it wrong.  So use "plain" char* pointers.
+
+	Fixes 718 (Duplicate representation of merged trees: glr2.cc) and
+	examples/c++/glr/c++-types.
+
+	Still XFAIL:
+
+	    712: Improper handling of embedded actions and dollar(-N) in GLR parsers: glr2.cc
+	    730: Incorrectly initialized location for empty right-hand side in GLR: glr2.cc
+	    748: Incorrect lookahead during nondeterministic GLR: glr2.cc
+
+	* data/skeletons/glr2.cc (glr_state::as_pointer_): New.
+	(glr_state::pred): Use it.
+	* examples/c++/glr/c++-types.test: The test passes.
+	* tests/glr-regression.at (Duplicate representation of merged trees:
+	glr2.cc): Passes.
+
+2020-12-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: style fixes
+	* data/skeletons/glr2.cc: Formatting changes.
+
+2020-12-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: add sanity check in glr_state
+	The use of YY_IGNORE_NULL_DEREFERENCE_BEGIN/END in `check_` is to
+	please GCC 10:
+
+	    glr-regr8.cc: In member function 'YYRESULTTAG glr_stack::yyresolveValue(glr_state&)':
+	    glr-regr8.cc:1433:21: error: potential null pointer dereference [-Werror=null-dereference]
+	     1433 |     YYASSERT (this->magic_ == MAGIC);
+	          |               ~~~~~~^~~~~~
+	    glr-regr8.cc:905:40: note: in definition of macro 'YYASSERT'
+	      905 | # define YYASSERT(Condition) ((void) ((Condition) || (abort (), 0)))
+	          |                                        ^~~~~~~~~
+
+	* data/skeletons/glr2.cc (glr_state::check_): New.
+	Use it in the member functions.
+
+2020-12-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: add sanity checks in glr_stack_item
+	We obviously have broken pointer arithmetics that hands us
+	glr_stack_items that are not glr_stack_items.  Have a simple check for
+	this, to have earlier failures.
+
+	* data/skeletons/glr2.cc (glr_stack_item::check_): New.
+	Use it.
+	(glr_stack_item::contents): Avoid the useless struct.
+	Fix minor stylistic issues.
+
+2020-12-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: run the glr-regression tests
+	When installed on master as of 2020-12-05 (on top of "glr2.cc: fix
+	when the stack is not expandable", almost all the GLR regression tests
+	fail (with a SEGV):
+
+	    709: Badly Collapsed GLR States: glr2.cc             FAILED (glr-regression.at:130)
+	    712: Improper handling of embedded actions and dollar(-N) in GLR parsers: glr2.cc FAILED (glr-regression.at:275)
+	    715: Improper merging of GLR delayed action sets: glr2.cc FAILED (glr-regression.at:404)
+	    718: Duplicate representation of merged trees: glr2.cc FAILED (glr-regression.at:502)
+	    721: User destructor for unresolved GLR semantic value: glr2.cc FAILED (glr-regression.at:566)
+	    724: User destructor after an error during a split parse: glr2.cc FAILED (glr-regression.at:624)
+	    727: Duplicated user destructor for lookahead: glr2.cc FAILED (glr-regression.at:724)
+	    730: Incorrectly initialized location for empty right-hand side in GLR: glr2.cc FAILED (glr-regression.at:823)
+	    733: No users destructors if stack 0 deleted: glr2.cc FAILED (glr-regression.at:911)
+	    736: Corrupted semantic options if user action cuts parse: glr2.cc FAILED (glr-regression.at:974)
+	    739: Undesirable destructors if user action cuts parse: glr2.cc FAILED (glr-regression.at:1042)
+	    742: Leaked semantic values if user action cuts parse: glr2.cc FAILED (glr-regression.at:1173)
+	    748: Incorrect lookahead during nondeterministic GLR: glr2.cc FAILED (glr-regression.at:1546)
+	    751: Leaked semantic values when reporting ambiguity: glr2.cc FAILED (glr-regression.at:1639)
+	    754: Leaked lookahead after nondeterministic parse syntax error: glr2.cc FAILED (glr-regression.at:1710)
+	    757: Uninitialized location when reporting ambiguity: glr2.cc FAILED (glr-regression.at:1794)
+	    766: Predicates: glr2.cc                             FAILED (glr-regression.at:2045)
+
+	These pass:
+
+	    745: Incorrect lookahead during deterministic GLR: glr2.cc ok
+	    760: Missed %merge type warnings when LHS type is declared later: glr2.cc ok
+	    763: Ambiguity reports: glr2.cc ok
+
+	With Valentin Tolmer's "glr2.cc: Fix memory corruption bug" commit,
+	these test fail "gracefully":
+
+	    712: Improper handling of embedded actions and dollar(-N) in GLR parsers: glr2.cc FAILED (glr-regression.at:268)
+	    730: Incorrectly initialized location for empty right-hand side in GLR: glr2.cc FAILED (glr-regression.at:816)
+	    748: Incorrect lookahead during nondeterministic GLR: glr2.cc FAILED (glr-regression.at:1539)
+
+	And these do not end:
+
+	    709: Badly Collapsed GLR States: glr2.cc             FAILED (glr-regression.at:123)
+	    715: Improper merging of GLR delayed action sets: glr2.cc FAILED (glr-regression.at:397)
+	    718: Duplicate representation of merged trees: glr2.cc FAILED (glr-regression.at:495)
+	    751: Leaked semantic values when reporting ambiguity: glr2.cc FAILED (glr-regression.at:1632)
+
+	With "tests: glr2.cc: run the glr-regression tests", none loop, and
+	709, 715, and 751 pass.  Only 718 still fails.
+
+	* tests/glr-regression.at: Run all the tests with glr2.cc.
+	* tests/local.at (AT_GLR2_CC_IF): New.
+
+2020-12-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: use the same format for traces as glr.c
+	* data/skeletons/glr2.cc: here.
+	This allows to share the same expected output.
+
+2020-12-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: add support for parse.assert
+	* data/skeletons/glr2.cc: Fake support of parse.assert, so that the
+	tests can use it without failing.
+
+2020-12-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: fix yyresolveValue
+	When "tests: glr2.cc: run the glr-regression tests" tests are run,
+	before this commit the following tests used to loop endlessly:
+
+	    709: Badly Collapsed GLR States: glr2.cc             FAILED (glr-regression.at:123)
+	    715: Improper merging of GLR delayed action sets: glr2.cc FAILED (glr-regression.at:397)
+	    718: Duplicate representation of merged trees: glr2.cc FAILED (glr-regression.at:495)
+	    751: Leaked semantic values when reporting ambiguity: glr2.cc FAILED (glr-regression.at:1632)
+
+	After this commit, no test loops and 709, 715, and 751 pass.  Only 718
+	still fails.
+
+	* data/skeletons/glr2.cc (yyresolveValue): Add missing incrementation
+	of the iteration variable.
+
+2020-12-06  Valentin Tolmer  <valentin.tolmer@gmail.com>
+
+	glr2.cc: misc cleanups
+	* data/skeletons/glr2.cc: Use 'const' on variables and applicable
+	member functions.
+	Improve comments.
+	Use references where applicable.
+	Enforce names_like_this, notLikeThis.
+	Reduce scopes.
+
+2020-12-06  Valentin Tolmer  <valentin.tolmer@gmail.com>
+
+	glr2.cc: fix memory corruption bug
+	* data/skeletons/glr2.cc (yyremoveDeletes): Remove double-increment in
+	the loop.
+	(glr_state::copyFrom): Handle gracefully when other is resolved.
+
+2020-12-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: turn some pointers into references
+	* data/skeletons/glr2.cc: Prefer references to pointers.
+	Add a few more const.
+
+2020-12-06  Valentin Tolmer  <valentin.tolmer@gmail.com>
+
+	glr2.cc: use 'const' for some constant local variables
+	* data/skeletons/glr2.cc: here.
+
+2020-12-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: fix when the stack is not expandable
+	* data/skeletons/glr2.cc (yyexpandGLRStackIfNeeded): Fix the
+	implementation when !YYSTACKEXPANDABLE.
+
+2020-12-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: fix line numbers in logs
+	* data/skeletons/glr.c (yyglrReduce): Fix line numbers.
+	* tests/glr-regression.at: Fix expectations.
+
+2020-12-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: glr: run the glr regression tests with glr.cc
+	* tests/glr-regression.at: Adjust the tests to be more independent of
+	the language, and run them with glr.cc.
+	Some tests relied on yychar, yylval and yylloc being global variables:
+	pass arguments instead.
+
+2020-12-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: glr: prepare for more languages
+	* tests/glr-regression.at: Wrap each test in an AT_TEST.
+	Call it with glr.c.
+
+2020-12-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: glr: use AT_FULL_COMPILE
+	* tests/glr-regression.at: Instead of using AT_BISON_CHECK and
+	AT_COMPILE, use AT_FULL_COMPILE.  This is shorter, and makes it easier
+	to add support for other programming languages.
+
+2020-12-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: glr: prefer directives to warnings
+	* tests/glr-regression.at: Use %expect and %expect-rr in the grammar
+	files, rather than accepting diagnostics.
+	This will make it easier to support other programming languages.
+
+2020-12-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: factor the access to token kinds
+	* tests/local.at (AT_BISON_OPTION_PUSHDEFS): Define AT_TOKEN.
+	(AT_BISON_OPTION_POPDEFS): Undefine it.
+	* tests/actions.at, tests/c++.at, tests/calc.at: Use AT_TOKEN.
+
+2020-12-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: formatting changes
+	* tests/local.at: here.
+
+2020-12-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.cc: don't "leak" yyparse
+	When using glr.cc, the C function yyparse is an internal detail that
+	should not be exposed.  Users might call it by accident (I did).
+
+	* data/skeletons/glr.c (yyparse): When used for glr.cc, rename as yy_parse_impl.
+	* data/skeletons/glr.cc: Adjust.
+
+2020-12-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	portability: beware of GCC 4.6
+	    src/reader.c: In function 'grammar_start_symbols_add':
+	    src/reader.c:67:24: error: declaration of 'dup' shadows a global declaration [-Werror=shadow]
+
+	* src/reader.c (grammar_start_symbols_add): Rename dup as dupl.
+
+2020-12-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	tables: avoid warnings and save bits
+	The yydefgoto table uses -1 as an invalid for an impossible case (we
+	never use yydefgoto[0], since it corresponds to the reduction to
+	$accept, which never happens).  Since yydefgoto is a table of state
+	numbers, this -1 forces a signed type uselessly, which (1) might
+	trigger compiler warnings when storing a value from yydefgoto into a
+	state number (nonnegative), and (2) wastes bits which might result in
+	using a int16 where a uint8 suffices.
+
+	Reported by Jot Dot <jotdot@shaw.ca>.
+	https://lists.gnu.org/r/bug-bison/2020-11/msg00027.html
+
+	* src/tables.c (default_goto): Use 0 rather than -1 as invalid value.
+	* tests/regression.at: Adjust.
+
+2020-12-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: use noexcept where appropriate
+	Reported by Don Macpherson.
+	https://github.com/akimd/bison/issues/63
+	https://github.com/akimd/bison/issues/64
+
+	* data/skeletons/c++.m4, data/skeletons/lalr1.cc: here.
+
+2020-11-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-11-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	multistart: check duplicates
+	* src/symlist.h, src/symlist.c (symbol_list_find_symbol)
+	(symbol_list_last): New.
+	(symbol_list_append): Use symbol_list_last.
+	* src/reader.c (grammar_start_symbols_add): Check and discard duplicates.
+	* tests/input.at (Duplicate %start symbol): New.
+	* tests/reduce.at (Bad start symbols): Add the multistart keyword.
+
+2020-11-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: change the format of a debugging function
+	* src/symlist.c (symbol_list_syms_print): Use braces to make traces
+	easier to read.
+
+2020-11-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: rename grammar_start_symbols_set as grammar_start_symbols_add
+	* src/reader.h, src/reader.c (grammar_start_symbols_set): Rename as...
+	(grammar_start_symbols_add): this.
+	Adjust dependencies.
+
+2020-11-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	TODO: update
+
+2020-11-21  Akim Demaille  <akim.demaille@gmail.com>
+
+	multistart: also use the api.prefix in the implementation
+	We were declaring foo_parse_expr but implementing yyparse_expr.
+
+	* data/skeletons/yacc.c (_b4_define_sub_yyparse): Use api.prefix for
+	the parse function name.
+
+2020-11-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: using stow to set up a bison herd
+	* README-hacking.md (Stow): New.
+
+2020-11-20  Adela Vais  <adela.vais99@gmail.com>
+
+	d: change YYLocation's type from class to struct
+	This avoids heap allocation and gives minimal costs for the
+	creation and destruction of the YYParser.Symbol struct if
+	the location tracking is active.
+
+	Suggested by H. S. Teoh.
+
+	* data/skeletons/lalr1.d: Here.
+	* doc/bison.texi: Document it.
+	* examples/d/calc/calc.y: Adjust.
+	* tests/calc.at: Test it.
+
+2020-11-20  Adela Vais  <adela.vais99@gmail.com>
+
+	d: change the return value of yylex from TokenKind to YYParser.Symbol
+	The complete symbol approach was deemed to be the right approach for Dlang.
+	Now, the user can return from yylex() an instance of YYParser.Symbol structure,
+	which binds together the TokenKind, the semantic value and the location. Before,
+	the last two were reported separately to the parser.
+	Only the user API is changed, Bisons's internal structure is kept the same.
+
+	* data/skeletons/d.m4 (struct YYParser.Symbol): New.
+	* data/skeletons/lalr1.d: Change the return value.
+	* doc/bison.texi: Document it.
+	* examples/d/calc/calc.y, examples/d/simple/calc.y: Demonstrate it.
+	* tests/calc.at, tests/scanner.at: Test it.
+
+2020-11-20  Martin Rehak  <martin.rehak@oracle.com>
+
+	examples: avoid "unbound variable" errors
+	When the shell option `nounset` is set, we may get "unbound variable"
+	errors.
+	https://lists.gnu.org/r/bug-bison/2020-11/msg00013.html
+
+	* examples/test (diff_opts): Be sure to initialize it.
+
+2020-11-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+	* Makefile.am (gitsort): New.
+	Use it.
+
+2020-11-18  Adela Vais  <adela.vais@yahoo.com>
+
+	d: add support for lookahead correction
+	When using lookahead correction, the method YYParser.Context.getExpectedTokens
+	is not annotated with const, because the method calls yylacCheck, which is not
+	const. Also, because of yylacStack and yylacEstablished, yylacCheck needs to
+	be called from the context of the parser class, which is sent as parameter to
+	the Context's constructor.
+
+	* data/skeletons/lalr1.d (yylacCheck, yylacEstablish, yylacDiscard,
+	yylacStack, yylacEstablished): New.
+	(Context): Use it.
+	* doc/bison.texi: Document it.
+	* tests/calc.at: Check it.
+
+2020-11-18  Adela Vais  <adela.vais@yahoo.com>
+
+	d: change the name of the custom error message function to reportSyntaxError
+	Changed from syntax_error to reportSyntaxError to be similar to the Java parser.
+
+	* data/skeletons/lalr1.d: Change the function name.
+	* doc/bison.texi: Document it.
+	* tests/local.at: Adjust.
+
+2020-11-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	Merge branch 'maint'
+	* upstream/maint:
+	  maint: post-release administrivia
+	  version 3.7.4
+
+2020-11-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-11-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.7.4
+	* NEWS: Record release date.
+
+2020-11-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: prefer b4_symbol(empty, ...) to b4_symbol(-2, ...)
+	* data/skeletons/c.m4: here.
+
+2020-11-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	Merge branch 'maint'
+	* maint:
+	  c++: shorten the assertions that check whether tokens are correct
+	  c++: don't glue functions together
+	  lalr1.cc: YY_ASSERT should use api.prefix
+	  c++: don't use YY_ASSERT at all if parse.assert is disabled
+	  c++: style: follow the Bison m4 quoting pattern
+	  yacc.c: provide the Bison version as an integral macro
+	  regen
+	  style: make conversion of version string to int public
+	  %require: accept version numbers with three parts ("3.7.4")
+	  yacc.c: fix #definition of YYEMPTY
+	  gnulib: update
+	  doc: fix incorrect section title
+	  doc: minor grammar fixes in counterexamples section
+
+2020-11-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: shorten the assertions that check whether tokens are correct
+	Before:
+
+	    YY_ASSERT (tok == token::YYEOF || tok == token::YYerror || tok == token::YYUNDEF || tok == 120 || tok == 49 || tok == 50 || tok == 51 || tok == 52 || tok == 53 || tok == 54 || tok == 55 || tok == 56 || tok == 57 || tok == 97 || tok == 98);
+
+	After:
+
+	    YY_ASSERT (tok == token::YYEOF
+	               || (token::YYerror <= tok && tok <= token::YYUNDEF)
+	               || tok == 120
+	               || (49 <= tok && tok <= 57)
+	               || (97 <= tok && tok <= 98));
+
+	Clauses are now also wrapped on several lines.  This is nicer to read
+	and diff, but also avoids pushing Visual C++ to its arbitrary
+	limits (640K and lines of 16380 bytes ought to be enough for anybody,
+	otherwise make an C2026 error).
+
+	The useless parens are there for the dummy warnings about
+	precedence (in the future, will we also have to put parens in
+	`1+2*3`?).
+
+	* data/skeletons/variant.hh (_b4_filter_tokens, b4_tok_in, b4_tok_in):
+	New.
+	(_b4_token_constructor_define): Use them.
+
+2020-11-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: don't glue functions together
+	* data/skeletons/bison.m4 (b4_type_foreach): Accept a separator.
+	* data/skeletons/c++.m4: Use it.
+	And fix an incorrect comment.
+
+2020-11-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	lalr1.cc: YY_ASSERT should use api.prefix
+	Working on the previous commit I realized that YY_ASSERT was used in
+	the generated headers, so must follow api.prefix to avoid clashes when
+	multiple C++ parser with variants are used.
+
+	Actually many more macros should obey api.prefix (YY_CPLUSPLUS,
+	YY_COPY, etc.).  There was no complaint so far, so it's not urgent
+	enough for 3.7.4, but it should be addressed in 3.8.
+
+	* data/skeletons/variant.hh (b4_assert): New.
+	Use it.
+	* tests/local.at (AT_YYLEX_RETURN): Fix.
+	* tests/headers.at: Make sure variant-based C++ parsers are checked
+	too.
+	This test did find that YY_ASSERT escaped renaming (before the fix in
+	this commit).
+
+2020-11-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: don't use YY_ASSERT at all if parse.assert is disabled
+	In some extreme situations (about 800 tokens), we generate a
+	single-line assertion long enough for Visual C++ to discard the end of
+	the line, thus falling into parse ends for the missing `);`.  On a
+	shorter example:
+
+	    YY_ASSERT (tok == token::TOK_YYEOF || tok == token::TOK_YYerror || tok == token::TOK_YYUNDEF || tok == token::TOK_ASSIGN || tok == token::TOK_MINUS || tok == token::TOK_PLUS || tok == token::TOK_STAR || tok == token::TOK_SLASH || tok == token::TOK_LPAREN || tok == token::TOK_RPAREN);
+
+	Whether NDEBUG is used or not is irrelevant, the parser dies anyway.
+
+	Reported by Jot Dot <jotdot@shaw.ca>.
+	https://lists.gnu.org/r/bug-bison/2020-11/msg00002.html
+
+	We should avoid emitting lines so long.
+
+	We probably should also use a range-based assertion (with extraneous
+	parens to pacify fascist compilers):
+
+	    YY_ASSERT ((token::TOK_YYEOF <= tok && tok <= token::TOK_YYUNDEF)
+	               || (token::TOK_ASSIGN <= tok && ...)
+
+	But anyway, we should simply not emit this assertion at all when not
+	asked for.
+
+	* data/skeletons/variant.hh: Do not define, nor use, YY_ASSERT when it
+	is not enabled.
+
+2020-11-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: style: follow the Bison m4 quoting pattern
+	* data/skeletons/variant.hh: here.
+
+2020-11-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: more
+
+2020-11-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: provide the Bison version as an integral macro
+	Suggested by Balazs Scheidler.
+	https://github.com/akimd/bison/issues/55
+
+	* src/muscle-tab.c (muscle_init): Move/rename `b4_version` to/as...
+	* src/output.c (prepare): `b4_version_string`.
+	Also define `b4_version`.
+	* data/skeletons/bison.m4, data/skeletons/c.m4, data/skeletons/d.m4,
+	* data/skeletons/java.m4: Adjust.
+	* doc/bison.texi: Document it.
+
+2020-11-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-11-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: make conversion of version string to int public
+	* src/parse-gram.y (str_to_version): Rename as/move to...
+	* src/strversion.h, src/strversion.c (strversion_to_int): these new
+	files.
+
+2020-11-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	%require: accept version numbers with three parts ("3.7.4")
+	* src/parse-gram.y (str_to_version): Support three parts.
+	* data/skeletons/location.cc, data/skeletons/stack.hh:
+	Adjust.
+
+2020-11-11  Todd C. Miller  <Todd.Miller@sudo.ws>
+
+	yacc.c: fix #definition of YYEMPTY
+	When generating a C parser, YYEMPTY is present in enum yytokentype but
+	there is no corresponding #define like there is for the other values.
+	There is a special case for YYEMPTY in b4_token_enums but no
+	corresponding case in b4_token_defines.
+
+	* data/skeletons/c.m4 (b4_token_defines): Do define YYEMPTY.
+
+2020-11-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-11-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: enforce java coding style
+	* tests/scanner.at: here.
+
+2020-11-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	ielr: fix incorrect function call
+	* src/ielr.c: s/rule_is_accepting/rule_is_initial/.
+
+2020-11-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	ielr: more comments and logs
+	* src/ielr.c: More comments.
+	(state_list_print): New.
+
+2020-11-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	multistart: fix IELR computations
+	IELR needs to rule out the successors of the kernel items of the
+	initial state (`$accept: input • $end`).  In the case of multistart,
+	this condition must be expressed differently: the mere item index does
+	not suffice.
+
+	* src/ielr.c (ielr_item_has_lookahead, ielr_compute_lookaheads): Don't
+	rely on the item index to check whether is_successor_of_initial_item.
+	It is certainly more costly than just checking the item index, but (i)
+	we need to compute the rule anyway, so it's not very much more costly,
+	and (ii) in ielr_item_has_lookahead, this situation is actually
+	impossible, so an optimizing compiler reading the assertions should
+	actually avoid this computation.
+
+2020-11-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	ielr: make some conditions about items easier to understand
+	Checking that an item index is > 1 means ruling out `$accept: • input
+	$end` and `$accept: input • $end`.  But actually only the latter is
+	possible there, i.e., we're checking whether this item is about a
+	successor of a (kernel) item of the initial state ($accept: input •
+	$end).
+
+	* src/ielr.c (is_successor_of_initial_item): Use a variable to name
+	this condition.
+
+2020-11-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	multistart: introduce and use rule_is_initial
+	* src/gram.h (rule_is_initial): New.
+	* src/graphviz.c, src/print-xml.c, src/print.c, src/lalr.c: Use it.
+	Some of these occurrences were incorrect (checking whether this is
+	rule 0), and not behaving properly in the case of multistart.
+
+2020-11-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: comment and formatting changes, and fixes
+	* examples/c/lexcalc/parse.y: Fix option handling.
+	* src/gram.h: Clarify comments.
+	* src/ielr.c: Fix indentation.
+	* src/print.c, src/state.h: More comments.
+
+2020-11-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	lalr: add assertions
+	* src/lalr.c: Remove incorrect comment (subsumed anyway by the
+	(correct) one in the header.
+	(set_goto_map): More debug traces.
+	(map_goto): Add an assertion.
+
+2020-11-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: remove scaffolding for glr.c
+	* data/skeletons/glr2.cc (b4_glr_cc_setup, b4_glr_cc_cleanup): Remove.
+
+2020-11-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	d: remove dead comment
+	* data/skeletons/lalr1.d (reportSyntaxError): here.
+
+2020-11-07  Adela Vais  <adela.vais@yahoo.com>
+
+	d: add the custom error message feature
+	Parser.Context class returns a const YYLocation, so Lexer's method
+	yyerror() needs to receive the location as a const parameter.
+
+	Internal error reporting flow is changed to be similar to that of
+	the other skeletons. Before, case YYERRLAB was calling yyerror()
+	with the result of yysyntax_error() as the string parameter. As the
+	custom error message lets the user decide if they want to use
+	yyerror() or not, this flow needed to be changed. Now, case YYERRLAB
+	calls yyreportSyntaxError(), that builds the error message using
+	yysyntaxErrorArguments(). Then yyreportSyntaxError() passes the
+	error message to the user defined syntax_error() in case of a custom
+	message, or to yyerror() otherwise.
+
+	In the tests in tests/calc.at, the order of the tokens needs to be
+	changed in order of precedence, so that the D program outputs the
+	expected tokens in the same order as the other parsers.
+
+	* data/skeletons/lalr1.d: Add the custom error message feature.
+	* doc/bison.texi: Document it.
+	* examples/d/calc/calc.y: Adjust.
+	* tests/calc.at, tests/local.at: Test it.
+
+2020-11-07  Adela Vais  <adela.vais@yahoo.com>
+
+	d: examples: fix coding style
+	* examples/d/calc/calc.y, examples/d/simple/calc.y: Fix whitespace issues
+	and remove the @property attribute.
+
+2020-11-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: avoid explicit symbol numbers
+	This should have been part of commit "symbols: stop dealing with YYEMPTY
+	as b4_symbol(-2, ...)" (cd40ec9526df27d0e3e1c2d41e82a3e6a47254d1).
+	Give names to all the special symbols: "eof", "error" and "undef".
+
+	* data/skeletons/bison.m4 (b4_symbol): Let `b4_symbol(eof, ...)` mean
+	`b4_symbol(0, ...)`, `b4_symbol(error, ...)` mean `b4_symbol(1, ...)`,
+	and , `b4_symbol(undef, ...)` mean `b4_symbol(2, ...)`..
+
+	* data/skeletons/c.m4, data/skeletons/glr.c, data/skeletons/glr.cc,
+	* data/skeletons/glr2.cc, data/skeletons/lalr1.cc,
+	* data/skeletons/lalr1.d, data/skeletons/lalr1.java,
+	* data/skeletons/yacc.c:
+	Prefer symbols to numbers.
+
+2020-11-07  Adela Vais  <adela.vais@yahoo.com>
+
+	d: fix Context class
+	All methods are now declared as const. Method getExpectedTokens() has now the
+	functionality of reporting only the number of expected tokens.
+
+	* data/skeletons/lalr1.d: Fix Context class.
+
+2020-11-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: fix typo
+	Reported by Kaz Kylheku.
+	https://lists.gnu.org/r/bison-patches/2020-11/msg00019.html
+
+	* doc/bison.texi (Versioning): here.
+
+2020-11-07  Adela Vais  <adela.vais99@gmail.com>
+
+	d: doc: add D Action Features section
+	* doc/bison.texi (D Action Features section): New.
+
+2020-11-07  Adela Vais  <adela.vais99@gmail.com>
+
+	d: add yyerrok
+	In D's case, yyerrok() is a private method of the Parser class.
+	It can be called directly as `yyerrok()` from the grammar rules section.
+
+	* data/skeletons/lalr1.d: Add yyerrok().
+	* examples/d/calc/calc.y, examples/d/simple/calc.y: Demonstrate yyerrok().
+	* tests/calc.at: Update D tests to use yyerrok().
+
+2020-11-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: lac: a stronger test for the exploratory stack
+	* tests/local.at (AT_YYLEX_DEFINE(java)): Fix overquoting issue.
+	Style changes.
+	* tests/regression.at (LAC: Exploratory stack): Run for lalr1.java too.
+
+2020-11-05  Kaz Kylheku  <kaz@kylheku.com>
+
+	doc: document best deployment practices.
+	* doc/bison.texi (Versioning): New node about practices
+	regarding dealing with multiple versions of Bison.
+
+2020-11-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: lac: more tests, and some doc
+	* doc/bison.texi: C++ and Java support LAC.
+	* tests/input.at (LAC: Errors for %define): Generalize the test, and
+	apply it to Java.
+
+2020-11-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: avoid Integer(String), use parseInt
+	    examples/java/calc/Calc.java:1531: warning: [deprecation] Integer(String) in Integer has been deprecated
+	          yylval = new Integer(st.sval);
+	                   ^
+
+	* examples/java/calc/Calc.y, examples/java/simple/Calc.y,
+	* tests/calc.at, tests/scanner.at: Use Integer.parseInt.
+
+2020-11-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: prefer ArrayList to Vector
+	Vector is synchronized, which is completely useless in our case (and
+	not even relevant when concurrency matters).  No seasoned Java
+	programmer would use it.
+	Reported by Uxio Prego.
+
+	* data/skeletons/lalr1.java: Replace Vector with ArrayList.
+	Unfortunately its API is not as rich, and lacks lastElement and
+	setSize.
+
+2020-11-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: lac: check it
+	* tests/calc.at: Add tests for LAC in pull and push parsers.
+	Skip LAC: line from the logs.
+	* tests/local.at (reportSyntaxError): Output the error message in a
+	single call, to avoid having the error message on stderr be
+	interrupted by the debug traces of LAC in getExpectedTokens.
+
+2020-11-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: add support for lookahead correction
+	Shamelessly stolen from Adrian Vogelsgesang's implementation in
+	lalr1.cc.
+
+	* data/skeletons/lalr1.java (yycdebugNnl, yyLacCheck, yyLacEstablish)
+	(yyLacDiscard, yylacStack, yylacEstablished): New.
+	(Context): Use it.
+	* examples/java/calc/Calc.y: Enable LAC.
+
+2020-11-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: java: more style fixes
+	* data/skeletons/lalr1.java, tests/java.at: Avoid space before paren.
+	And use braces as is customary in the Java.
+
+2020-11-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: comment changes in the skeletons
+	* data/skeletons/lalr1.cc: Prepare for Java's LAC.
+	* data/skeletons/lalr1.java: Style fixes.
+
+2020-11-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: fix incorrect section title
+	Reported by Gaurav Singh <gaurav.singh199709@yahoo.com>.
+	https://lists.gnu.org/r/bug-bison/2020-11/msg00000.html
+
+	* doc/bison.texi (Rpcalc Expr): Rename as...
+	(Rpcalc Exp): this, as the nterm is named 'exp'.
+
+2020-11-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: fix incorrect section title
+	Reported by Gaurav Singh <gaurav.singh199709@yahoo.com>.
+	https://lists.gnu.org/r/bug-bison/2020-11/msg00000.html
+
+	* doc/bison.texi (Rpcalc Expr): Rename as...
+	(Rpcalc Exp): this, as the nterm is named 'exp'.
+
+2020-10-28  Nick Gasson  <nick@nickg.me.uk>
+
+	doc: minor grammar fixes in counterexamples section
+	* doc/bison.texi: Minor fixes in counterexamples section.
+
+2020-10-28  Nick Gasson  <nick@nickg.me.uk>
+
+	doc: minor grammar fixes in counterexamples section
+	* doc/bison.texi: Minor fixes in counterexamples section.
+
+2020-10-27  Adela Vais  <adela.vais99@gmail.com>
+
+	d: create the Parser.Context class
+	This will provide the user an interface for creating custom error messages.
+
+	* data/skeletons/lalr1.d: Add the Context class.
+	* doc/bison.texi: Document it.
+
+2020-10-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	Merge branch 'maint'
+	* upstream/maint:
+	  doc: fix typo
+	  maint: post-release administrivia
+	  version 3.7.3
+	  build: don't link bison against libreadline
+	  gnulib: update
+	  glr.cc: fix: use symbol_name
+	  build: fix a concurrent build issue in examples
+
+2020-10-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: fix typo
+	* README: here.
+
+2020-10-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-10-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.7.3
+	* NEWS: Record release date.
+
+2020-10-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: don't link bison against libreadline
+	Reported by Paul Smith <psmith@gnu.org>.
+	https://lists.gnu.org/r/bug-bison/2020-10/msg00001.html
+
+	* src/local.mk (src_bison_LDADD): here.
+
+2020-10-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-10-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: D comes before Java in alphabetical order
+	* doc/bison.texi: Keep languages sorted.
+
+2020-10-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	report: put the dot after %empty in items
+	When printing items, it is clearer to put the dot after %emtpy rather
+	than before:
+
+	     0 $accept: . unit "end of file"
+	     1 unit: . assignments exp
+	-    2 assignments: . %empty
+	+    2 assignments: %empty .
+	     3            | . assignments assignment
+
+	Also, use the Unicode characters if they are supported.
+
+	* src/gram.c (item_print): Put the dot after %emtpy.
+	* tests/conflicts.at, tests/reduce.at, tests/report.at: Adjust.
+
+2020-10-03  Adela Vais  <adela.vais99@gmail.com>
+
+	d: change api.token.raw default value to true
+	Generate consecutive values for enum TokenKind, as D's yylex()
+	returns TokenKind and collisions can't happen.
+
+	* data/skeletons/d.m4: Change default value.
+	* tests/scanner.at, tests/d.at: Check it.
+
+2020-10-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	m4: have b4_percent_define_if_define apply default values lazily
+	Currently `b4_percent_define_ifdef([foo])` assigns a default value to
+	`foo` when invoked.  As a consequence, skeletons such as lalr1.d
+	cannot specify their specific default values: `foo` was defined in
+	bison.m4.
+
+	Instead, provide `foo` with a default value when `b4_foo_if` is
+	invoked.
+
+	I could not measure a runtime difference between both cases.
+
+	* data/skeletons/bison.m4 (_b4_percent_define_define): New.
+	Helps getting rid of spurious indentation that resulted in spurious
+	white space in the output.
+	(b4_percent_define_if_define): Move the definition to...
+	(_b4_percent_define_if_define): when the defined macros is called.
+
+2020-10-02  Adela Vais  <adela.vais99@gmail.com>
+
+	d: don't trigger GC in void toString
+	* data/skeletons/d.m4 (b4_declare_symbol_enum): Here.
+
+2020-10-02  Adela Vais  <adela.vais@yahoo.com>
+
+	d: document support
+	* doc/bison.texi: Various fixes.
+	(D Parsers): New section.
+
+2020-10-02  Adela Vais  <adela.vais@yahoo.com>
+
+	d: remove the default prefix for SymbolKind's enum elements
+	This is not needed in D, since the kinds are "scoped".
+
+	* data/skeletons/d.m4: Remove the default prefix.
+	* doc/bison.text: Document it.
+
+2020-10-02  Adela Vais  <adela.vais@yahoo.com>
+
+	d: remove the @property attribute from interface Lexer
+	D best practices is to not use it.
+
+	* data/skeletons/lalr1.d: Remove attribute.
+
+2020-09-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	symbols: stop dealing with YYEMPTY as b4_symbol(-2, ...)
+	* data/skeletons/bison.m4 (b4_symbol): Redirect `b4_symbol(empty,
+	...)` to `b4_symbol(-2, ...)`.
+	Change all uses of the latter to the former.
+
+2020-09-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: remove useless prefix for EOF in D
+	* tests/calc.at (CALC_EOF): Rename as...
+	(EOF): this.
+	Since there is no risk of a clash with #define EOF here...
+
+2020-09-28  Adela Vais  <adela.vais99@gmail.com>
+
+	d: support api.symbol.prefix and api.token.prefix
+	The D skeleton was not properly supporting them.
+
+	* data/skeletons/d.m4, data/skeletons/lalr1.d: Fix it.
+	* tests/calc.at: Check it.
+
+2020-09-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	multistart: start more thorough testing
+	* tests/local.at (AT_MULTISTART_IF): New.
+	* tests/calc.at: Adjust to check multiple start symbols.
+	* data/skeletons/yacc.c (yy_parse_impl): Fix.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: style: reorder the calculator test macros
+	* tests/local.at (AT_TOKEN_TRANSLATE_IF): New, moved from...
+	* tests/calc.at: here.
+	Instead of sorting per feature (main, yylex, calc.y) and then by
+	language, do the converse, so that C bits are together, etc.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: shorten the generated file
+	* tests/synclines.at (_AT_SYNCLINES_COMPILE): Pull the comments out.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	multistart: also give access to yynerrs
+	This is something that has always bothered me: with pure parsers (and
+	they all should be) the user does not have an (easy) access to yynerrs
+	at the end of the parse.  In the case of error recovery, that's the
+	only direct means to know if there were errors.  The usual approach
+	being having the user maintain a counter incremented each time yyerror
+	is called.
+
+	So here, also capture yynerrs in the return value of the start-symbol
+	parsing functions.
+
+	* data/skeletons/yacc.c (yy_parse_impl_t): New.
+	(yy_parse_impl): Use it.
+	(b4_accept): Fill it.
+	* examples/c/lexcalc/parse.y, examples/c/lexcalc/scan.l: No longer
+	pass nerrs as lex- and parse-param, just use the resulting yynerrs.
+	bistromathic and reccalc both demonstrate %param.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: also count calls to YYERROR in yynerrs
+	* data/skeletons/yacc.c: here.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	multistart: allow tokens as start symbols
+	After all, why not?
+
+	* src/reader.c (switching_token): Use symbol_id_get.
+	(check_start_symbols): Require that the start symbol is a token only
+	if it's the only one.
+	* examples/c/lexcalc/parse.y: Let NUM be a start symbol.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	multistart: use b4_accept instead of action post-processing
+	For each start symbol, generate a parsing function with a richer
+	return value than the usual of yyparse.  Reserve a place for the
+	returned semantic value, in order to avoid having to pass a pointer as
+	argument to "return" that value.  This also makes the call to the
+	parsing function independent of whether a given start-symbol is typed.
+
+	For instance, if the grammar file contains:
+
+	    %type <int> expression
+	    %start input expression
+
+	(so "input" is valueless) we get
+
+	    typedef struct
+	    {
+	      int yystatus;
+	    } yyparse_input_t;
+
+	    yyparse_input_t yyparse_input (void);
+
+	    typedef struct
+	    {
+	      int yyvalue;
+	      int yystatus;
+	    } yyparse_expression_t;
+
+	    yyparse_expression_t yyparse_expression (void);
+
+	This commit also changes the implementation of the parser termination:
+	when there are multiple start symbols, it is the initial rules that
+	explicitly YYACCEPT.  They do that after having exported the
+	start-symbol's value (if it is typed):
+
+	  switch (yyn)
+	    {
+	  case 1: /* $accept: YY_EXPRESSION expression $end  */
+	  { ((*yyvalue).TOK_expression) = (yyvsp[-1].TOK_expression); YYACCEPT; }
+	    break;
+
+	  case 2: /* $accept: YY_INPUT input $end  */
+	  { YYACCEPT; }
+	    break;
+
+	I have tried several ways to deal with termination, and this is the
+	one that appears the best one to me.  It is also the most natural.
+
+	* src/scan-code.h, src/scan-code.l (obstack_for_actions): New.
+	* src/reader.c (grammar_rule_check_and_complete): Generate the actions
+	of the rules for each start symbol.
+
+	* data/skeletons/bison.m4 (b4_symbol_slot): New, with safer semantics
+	than type and type_tag.
+	* data/skeletons/yacc.c (b4_accept): New.
+	Generates the body of the action of the start rules.
+	(_b4_declare_sub_yyparse): For each start symbol define a dedicated
+	return type for its parsing function.
+	Adjust the declaration of its parsing function.
+	(_b4_define_sub_yyparse): Adjust the definition of the function.
+
+	* examples/c/lexcalc/parse.y: Check the case of valueless symbols.
+	* examples/c/lexcalc/lexcalc.test: Check start symbols.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	multistart: adjust reader checks for generated rules
+	So far we were not checking the generated rule 0 at all.  Now there
+	can be several of them.  Instead of not checking at all, let's be more
+	selective on the check to run on them.
+
+	* src/reader.c (grammar_rule_check_and_complete): Don't check for
+	value usage for generated rules, it is ok to have a valued start
+	symbol, in which case it is ok for the generated rule ("accept: start
+	$end {}") to not use $1.
+	(packgram): Call grammar_rule_check_and_complete for all the rules.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: more
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	multistart: toy with it in lexcalc
+	* examples/c/lexcalc/parse.y: Define several start symbols.
+	* examples/c/lexcalc/lexcalc.test: Check support.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	multistart: equip yacc.c
+	* data/skeletons/yacc.c: Add support for multiple start symbols.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	multistart: pass the list of start symbols to the backend
+	* src/output.c (start_symbols_output): New.
+	(muscles_output): Use it.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	multistart: also check the HTML report
+	We don't actually have checks for HTML, so let's do it for multistart.
+
+	* tests/report.at: here.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	multistart: adjust computation of initial core and adjust reports
+	Currently the core of the initial state is limited to the single rule
+	on $accept.
+
+	* src/lr0.c (generate_states): There may now be several rules on
+	$accept.
+
+	* src/graphviz.c (conclude_red): Recognize "final" transitions by the
+	fact that we reduce to "$accept".
+	* src/print.c (print_reduction): Likewise.
+	* src/print-xml.c (print_reduction): Likewise.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	multistart: turn start symbols into rules on $accept
+	Now that the parser can read several start symbols, let's process
+	them, and create the corresponding rules.
+
+	* src/parse-gram.y (grammar_declaration): Accept a list of start symbols.
+	* src/reader.h, src/reader.c (grammar_start_symbol_set): Rename as...
+	(grammar_start_symbols_set): this.
+
+	* src/reader.h, src/reader.c (start_flag): Replace with...
+	(start_symbols): this.
+	* src/reader.c (grammar_start_symbols_set): Build a list of start
+	symbols.
+	(switching_token, create_start_rules): New.
+	(check_and_convert_grammar): Use them to turn the list of start
+	symbols into a set of rules.
+	* src/reduce.c (nonterminals_reduce): Don't complain about $accept,
+	it's an internal detail.
+	(reduce_grammar): Complain about all the start symbols that don't
+	derive sentences.
+
+	* src/symtab.c (startsymbol, startsymbol_loc): Remove, replaced by
+	start_symbols.
+	symbols_pack): Move the check about the start symbols
+	to...
+	* src/symlist.c (check_start_symbols): here.
+	Adjust to multiple start symbols.
+	* tests/reduce.at (Empty Language): Generalize into...
+	(Bad start symbols): this.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	parser: expose a list of symbols
+	* src/parse-gram.y (%type): Also use current_class.
+	(symbol_decl.1): Rename as...
+	(symbols.1): this.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	reader: get ready to create several initial rules
+	* src/reader.c (create_start_rule): New.
+	Use it.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	gram: more debugging information
+	* src/gram.c (ritem_print): Show indices in ritem.
+
+2020-09-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.cc: fix: use symbol_name
+	* data/skeletons/glr.cc: here.
+
+2020-09-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: add an example
+	Currently this example crashes on input such as "T (x) + y;".
+	The same example with glr.c works properly.
+
+	* examples/c++/glr/Makefile, examples/c++/glr/README.md,
+	* examples/c++/glr/c++-types.test, examples/c++/glr/c++-types.yy,
+	* examples/c++/glr/local.mk, examples/c++/local.mk: New.
+	Based on examples/c/glr/c++-types.y.
+
+2020-09-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.cc: fix: use symbol_name
+	* data/skeletons/glr.cc: here.
+
+2020-09-26  Adela Vais  <adela.vais99@gmail.com>
+
+	d: change the return value of yylex from int to TokenKind
+	* data/skeletons/lalr1.d: Change the return value.
+	* examples/d/calc/calc.y, examples/d/simple/calc.y: Adjust.
+	* tests/scanner.at: Adjust.
+	* tests/calc.at (_AT_DATA_CALC_Y(d)): New, extracted from...
+	(_AT_DATA_CALC_Y(c)): here.
+	The two grammars have been sufficiently different to be separated.
+	Still trying to be them together results in a maintenance burden.  For
+	the same reason, instead of specifying the results for D and for the
+	rest, compute the expected results with D from the regular case.
+
+2020-09-24  Adela Vais  <adela.vais99@gmail.com>
+
+	d: support api.parser.extends and api.parser.implements
+	The D skeleton was not properly supporting them.
+
+	* data/skeletons/d.m4: Fix it.
+	* tests/d.at: Check it.
+	* tests/local.mk, tests/testsuite.at: Adjust.
+
+2020-09-21  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: also run all the calculator tests
+	This revealed issues with yy_symbol_print and yy_reduce_print.
+	These changes, in turn, reactivated GCC10 warnings:
+
+	    559. calc.at:1258: testing Calculator glr2.cc %locations %header parse.error=verbose %debug api.prefix={calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}  ...
+	    tests/calc.at:1258: COLUMNS=1000; export COLUMNS; NO_TERM_HYPERLINKS=1; export NO_TERM_HYPERLINKS;  bison --color=no -fno-caret -Wno-deprecated -o calc.cc calc.y
+	    tests/calc.at:1258: $CXX $CXXFLAGS $CPPFLAGS  $LDFLAGS -o calc calc.cc calc-lex.cc calc-main.cc $LIBS
+	    stderr:
+	    calc.cc: In function 'void glr_stack::yyresolveLocations(glr_state*, int)':
+	    calc.cc:2623:46: error: potential null pointer dereference [-Werror=null-dereference]
+	     2623 |                 yyrhsloc[0].getState().yyloc = yyoption->state()->yyloc;
+	          |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
+	    calc.cc:2623:46: error: potential null pointer dereference [-Werror=null-dereference]
+	     2623 |                 yyrhsloc[0].getState().yyloc = yyoption->state()->yyloc;
+	          |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
+	    calc.cc:2623:46: error: potential null pointer dereference [-Werror=null-dereference]
+	     2623 |                 yyrhsloc[0].getState().yyloc = yyoption->state()->yyloc;
+	          |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
+	    calc.cc:1177:10: error: potential null pointer dereference [-Werror=null-dereference]
+	     1177 |   return yypred ? &(asItem (this) - yypred)->getState () : YY_NULLPTR;
+	          |          ^~~~~~
+	    calc.cc:2623:46: error: potential null pointer dereference [-Werror=null-dereference]
+	     2623 |                 yyrhsloc[0].getState().yyloc = yyoption->state()->yyloc;
+	          |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
+	    calc.cc:2623:46: error: potential null pointer dereference [-Werror=null-dereference]
+	     2623 |                 yyrhsloc[0].getState().yyloc = yyoption->state()->yyloc;
+	          |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
+	    calc.cc: In member function 'YYRESULTTAG glr_stack::yyresolveValue(glr_state*)':
+	    calc.cc:2623:46: error: potential null pointer dereference [-Werror=null-dereference]
+	     2623 |                 yyrhsloc[0].getState().yyloc = yyoption->state()->yyloc;
+	          |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	* tests/calc.at (AT_CHECK_CALC_GLR_CC): Also check glr2.cc.
+	* data/skeletons/glr2.cc: Don't pass the user arguments to
+	yy_symbol_print and yy_reduce_print, since they have it in the parser
+	object.
+	(b4_user_formals_no_comma, b4_pure_args, b4_lpure_args)
+	(b4_locuser_formals, b4_locuser_args): Remove, useless.
+	(YY_IGNORE_NULL_DEREFERENCE_BEGIN): Enable for GCC >= 10 too.
+
+2020-09-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: check the location of the right-hand side symbols
+	The D skeleton was not properly supporting @1 etc.
+	Reported by Adela Vais.
+	https://lists.gnu.org/r/bison-patches/2020-09/msg00049.html
+
+	* data/skeletons/d.m4 (b4_rhs_location): Fix it.
+	* tests/calc.at: Check the support of @n for all the skeletons.
+
+2020-09-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: formatting changes
+	* src/scan-code.l: here.
+
+2020-09-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: introduce parse_positional_ref
+	* src/scan-code.l: here.
+
+2020-09-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: clarify the way state kernels (aka cores) are built
+	Use state_list_append in a more natural way.
+
+	* src/lr0.c (generate_states): Here.
+
+2020-09-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: reorder and comment
+	* src/reader.h: here.
+
+2020-09-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: add a demonstration of GLR parsers in C
+	Based on the test case 668 (cxx-type.at:437) "GLR: Merge conflicting
+	parses, pure, locations".
+
+	* examples/c/glr/Makefile, examples/c/glr/README.md,
+	* examples/c/glr/c++-types.test, examples/c/glr/c++-types.y,
+	* examples/c/glr/local.mk: New.
+
+2020-09-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr: support api.header.include
+	* data/skeletons/glr.c: here.
+
+2020-09-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	add support for --html
+	* bootstrap.conf: We need the "execute" module.
+	* src/files.h, src/files.c (spec_html_file, html_flag): New.
+	* src/getargs.h, src/getargs.c (--html): New.
+	* src/print-xml.h, src/print-xml.c (print_html): New.
+	* src/main.c: Use them.
+	* tests/output.at, tests/report.at: Check --html.
+
+2020-09-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-09-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	deprecate %defines in favor of %header
+	This is consistent with --defines being deprecated in favor of
+	--header.  The directive %defines is also too similar to %define.
+	And %header matches nicely with api.header.name.
+
+	* src/scan-gram.l (%defines): Deprecate to %header.
+	(%header): Scan it.
+	* src/parse-gram.y (PERCENT_DEFINES): Replace with...
+	(PERCENT_HEADER): this.
+	* data/skeletons/lalr1.java
+	* doc/bison.texi
+	* tests/actions.at, tests/c++.at, tests/calc.at, tests/conflicts.at,
+	* tests/input.at, tests/java.at, tests/local.at, tests/output.at,
+	* tests/synclines.at, tests/types.at:
+	Convert most tests to check %header instead of %defines.
+
+2020-09-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	options: rename --defines as --header
+	The name "defines" is incorrect, the generated file contains far more
+	than just #defines.
+
+	* src/getargs.h, src/getargs.c (-H, --header): New option.
+	With optional argument, just like --defines, --xml, etc.
+	(defines_flag): Rename as...
+	(header_flag): this.
+	Adjust dependencies.
+	* data/skeletons/bison.m4, data/skeletons/c.m4, data/skeletons/glr.c,
+	* data/skeletons/glr.cc, data/skeletons/glr2.cc, data/skeletons/lalr1.cc,
+	* data/skeletons/yacc.c:
+	Adjust.
+	* examples, doc/bison.texi: Adjust.
+	* tests/headers.at, tests/local.at, tests/output.at: Convert most
+	tests from using --defines to using --header.
+
+2020-09-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	CI: beware of time limits
+	* .travis.yml (GCC 8): Run only the part 1 of the tests.
+
+2020-09-17  Valentin Tolmer  <valentin.tolmer@gmail.com>
+
+	glr2.cc: replace refs to parser::symbol_kind_type with yysymbol_kind_t
+	* data/skeletons/glr2.cc: here.
+
+2020-09-17  Valentin Tolmer  <valentin.tolmer@gmail.com>
+
+	glr2.cc: fix container out-of-bounds access
+	Clang 10 with ASAN enabled reported errors in glr2.cc.
+
+	* data/skeletons/glr2.cc: here.
+
+2020-09-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: disable GCC 4.6 warning
+	    231. conflicts.at:1096: testing Syntax error in consistent error state: glr2.cc ...
+	    tests/conflicts.at:1096: $CXX $CXXFLAGS $CPPFLAGS  $LDFLAGS -o input input.cc $LIBS
+	    input.cc: In member function 'YYRESULTTAG glr_stack::yyresolveValue(glr_state*)':
+	    input.cc:2674:36: error: 'yysval' may be used uninitialized in this function [-Werror=uninitialized]
+
+	Do not initialize the variable: this way ASAN can really make sure we
+	do set it to a proper value.
+	If we initialize it, ASAN would report nothing.
+
+	* data/skeletons/c.m4 (YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN): Disable
+	GCC 4.6's -Wuninitialized.
+	* data/skeletons/glr2.cc: Disable the warning locally.
+
+2020-09-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: fix warning with GCC 4.7 and 4.8
+	    231. conflicts.at:1096: testing Syntax error in consistent error state: glr2.cc ...
+	    tests/conflicts.at:1096: $CXX $CXXFLAGS $CPPFLAGS  $LDFLAGS -o input input.cc $LIBS
+	    input.cc: In function 'int yyparse(yy::parser&)':
+	    input.cc:3147:41: error: 'yyarg' may be used uninitialized in this function [-Werror=maybe-uninitialized]
+	         return yytnamerr_ (yytname_[yysymbol]);
+	                                             ^
+	    input.cc:2058:34: note: 'yyarg' was declared here
+	         yy::parser::symbol_kind_type yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+	                                      ^
+
+	* data/skeletons/glr2.cc (yyreportSyntaxError): Initialize yyarg.
+
+2020-09-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: simplify symbol kinds
+	We emit code like
+
+	    if (yytoken != yy::parser::symbol_kind::symbol_kind::S_YYEMPTY)
+
+	* data/skeletons/glr2.cc: Use b4_symbol correctly.
+
+2020-09-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: fix warning about local variable vs. member
+	Fix a warning triggered in GCC (at least from 4.6 to 4.9):
+
+	    input.cc: In constructor 'glr_stack_item::glr_stack_item(bool)':
+	    input.cc:1371:5: error: declaration of 'is_state' shadows a member of 'this' [-Werror=shadow]
+	         : is_state_(is_state)
+	         ^
+
+	* data/skeletons/glr2.cc (glr_stack_item): Alpha-convert.
+
+2020-09-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: variants: minor simplification
+	Do as Valentin Tolmer did in glr2.cc.
+
+	* data/skeletons/variant.hh: The union does not need to be named.
+
+2020-09-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: avoid type-punning issues
+	On the CI, tests fail with GCC 4.6 to GCC 6 as follows:
+
+	    tests/synclines.at:440: COLUMNS=1000; export COLUMNS; NO_TERM_HYPERLINKS=1; export NO_TERM_HYPERLINKS;  bison --color=no -fno-caret  -o \"\\\"\".cc \"\\\"\".y
+	    tests/synclines.at:440: $CXX $CXXFLAGS $CPPFLAGS  $LDFLAGS -o \"\\\"\" \"\\\"\".cc $LIBS
+	    stderr:
+	    "\"".cc: In member function 'glr_state& glr_stack_item::getState()':
+	    "\"".cc:1404:47: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
+	         return *reinterpret_cast<glr_state*>(&raw_);
+	                                                   ^
+	    "\"".cc: In member function 'const glr_state& glr_stack_item::getState() const':
+	    "\"".cc:1408:53: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
+	         return *reinterpret_cast<const glr_state*>(&raw_);
+	                                                         ^
+	    "\"".cc: In member function 'semantic_option& glr_stack_item::getOption()':
+	    "\"".cc:1413:53: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
+	         return *reinterpret_cast<semantic_option*>(&raw_);
+	                                                         ^
+	    "\"".cc: In member function 'const semantic_option& glr_stack_item::getOption() const':
+	    "\"".cc:1417:59: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
+	         return *reinterpret_cast<const semantic_option*>(&raw_);
+	                                                           ^
+
+	See also be6fa942acae21a4a025bac5e339451be6ad136d.
+
+	* data/skeletons/glr2.cc (glr_stack_item): Use a temporary void*
+	variable to avoid type-punning issues with reinterpret_cast.
+
+2020-09-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.cc, glr2.cc: don't publish compiler pragmas
+	Currently the compiler attributes are defined in
+	b4_shared_declarations (that can in the header if it exists, otherwise
+	in the implementation file).  This is not needed, only the
+	implementation file needs them.
+
+	Besides, glr2.cc was also defining these macros in the implementation
+	file, so we had two definitions.
+
+	* data/skeletons/glr.cc, data/skeletons/glr2.cc: Define the compiler
+	attribute macros only in the implementation files.
+	* tests/regression.at (Lex and parse params): Generate a header, to
+	make it easy to check that the header is self-sufficient.
+
+2020-09-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: disable incorrect warnings from GCC6 to 9
+	For instance with GCC8:
+
+	    616. regression.at:1560: testing Lex and parse params: glr2.cc ...
+	    tests/regression.at:1560: COLUMNS=1000; export COLUMNS; NO_TERM_HYPERLINKS=1; export NO_TERM_HYPERLINKS;  bison --color=no -fno-caret  -o input.cc input.y
+	    tests/regression.at:1560: $CXX $CXXFLAGS $CPPFLAGS  $LDFLAGS -o input input.cc $LIBS
+	    stderr:
+	    input.cc: In member function 'YYRESULTTAG glr_stack::yyresolveValue(glr_state*)':
+	    input.cc:1796:10: error: potential null pointer dereference [-Werror=null-dereference]
+	       return yypred ? &(asItem(this) - yypred)->getState() : YY_NULLPTR;
+	              ^~~~~~
+	    input.cc:1796:10: error: potential null pointer dereference [-Werror=null-dereference]
+	       return yypred ? &(asItem(this) - yypred)->getState() : YY_NULLPTR;
+	              ^~~~~~
+	    cc1plus: all warnings being treated as errors
+
+	It complains that the implicit this in yypred might be null.  It fears
+	it because of loops such as
+
+	    for (glr_state* yys = firstTopState();
+	         yys != yystateStack.yysplitPoint;
+	         yys = yys->pred())
+	      yyn += 1;
+
+	that could possibly set yys to null, since yys->pred might return
+	null.  However, the warning is incorrect, since in C++ `this` cannot
+	be null.  GCC 10 no longer emits this warning.
+
+	GCC 7 also complains many times about glr_stack::yyresolveLocations
+	when NDEBUG is enabled (when it is not, YYASSERT (yyoption !=
+	YY_NULLPTR) is probably enough to pacify GCC):
+
+	    616. regression.at:1560: testing Lex and parse params: glr2.cc ...
+	    tests/regression.at:1560: COLUMNS=1000; export COLUMNS; NO_TERM_HYPERLINKS=1; export NO_TERM_HYPERLINKS;  bison --color=no -fno-caret  -o input.cc input.y
+	    tests/regression.at:1560: $CXX $CXXFLAGS $CPPFLAGS  $LDFLAGS -o input input.cc $LIBS
+	    stderr:
+	    input.cc: In member function 'void glr_stack::yyresolveLocations(glr_state*, int)':
+	    input.cc:3061:46: error: potential null pointer dereference [-Werror=null-dereference]
+	                     yyrhsloc[0].getState().yyloc = yyoption->state()->yyloc;
+	                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
+	    input.cc:3061:46: error: potential null pointer dereference [-Werror=null-dereference]
+	                     yyrhsloc[0].getState().yyloc = yyoption->state()->yyloc;
+	                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
+	    input.cc:3061:46: error: potential null pointer dereference [-Werror=null-dereference]
+	                     yyrhsloc[0].getState().yyloc = yyoption->state()->yyloc;
+	                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
+	    input.cc: In member function 'YYRESULTTAG glr_stack::yyresolveValue(glr_state*)':
+	    input.cc:3061:46: error: potential null pointer dereference [-Werror=null-dereference]
+	                     yyrhsloc[0].getState().yyloc = yyoption->state()->yyloc;
+	                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
+	    input.cc:3061:46: error: potential null pointer dereference [-Werror=null-dereference]
+	                     yyrhsloc[0].getState().yyloc = yyoption->state()->yyloc;
+	                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
+	    input.cc:3061:46: error: potential null pointer dereference [-Werror=null-dereference]
+	                     yyrhsloc[0].getState().yyloc = yyoption->state()->yyloc;
+	                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
+	    input.cc:3061:46: error: potential null pointer dereference [-Werror=null-dereference]
+	                     yyrhsloc[0].getState().yyloc = yyoption->state()->yyloc;
+	                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
+	    input.cc:3061:46: error: potential null pointer dereference [-Werror=null-dereference]
+	                     yyrhsloc[0].getState().yyloc = yyoption->state()->yyloc;
+	                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
+	    input.cc:3061:46: error: potential null pointer dereference [-Werror=null-dereference]
+	                     yyrhsloc[0].getState().yyloc = yyoption->state()->yyloc;
+	                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	* data/skeletons/glr2.cc (YY_IGNORE_NULL_DEREFERENCE_BEGIN)
+	(YY_IGNORE_NULL_DEREFERENCE_BEGIN): New.
+	(glr_state::pred, glr_stack::yyresolveLocations): Use them.
+
+2020-09-12  Adela Vais  <adela.vais99@gmail.com>
+
+	d: make enum SymbolKind idiomatic D
+	Taking into account comments from H. S. Teoh.
+	https://lists.gnu.org/r/bison-patches/2020-09/msg00021.html
+
+	* data/skeletons/d.m4, data/skeletons/lalr1.d (SymbolKind): Wrap the
+	enum in a structure that contains its string representation.
+
+2020-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: address warnings with G++ 4.8
+	input.cc: In constructor 'glr_stack_item::glr_stack_item(bool)':
+	input.cc:1423:5: error: declaration of 'isState' shadows a member of 'this' [-Werror=shadow]
+	     : isState_(isState) {
+	     ^
+	test.cc:1165:45: error: declaration of 'begin' shadows a member of 'this' [-Werror=shadow]
+	test.cc:1167:45: error: declaration of 'end' shadows a member of 'this' [-Werror=shadow]
+
+	* data/skeletons/glr2.cc (isState): Rename as...
+	(is_state): this.
+	Formatting changes.
+	(reduceToOneStack): Rename variables to avoid name clashes.
+
+2020-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: get rid of the C indirection for yy_symbol_print
+	* data/skeletons/glr2.cc (yy_symbol_print): Remove.
+	Just use yyparser.yy_symbol_print_ directly.
+
+2020-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: formatting changes
+	* data/skeletons/glr2.cc: here.
+
+2020-09-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: fix GCC10 warning
+	For instance on test 433: "glr2.cc api.value.type={double}"
+
+	    tests/types.at:138: $CXX $CXXFLAGS $CPPFLAGS  $LDFLAGS -o test test.cc $LIBS
+	    stderr:
+	    In file included from /opt/local/include/gcc10/c++/bits/stl_tempbuf.h:60,
+	                     from /opt/local/include/gcc10/c++/bits/stl_algo.h:62,
+	                     from /opt/local/include/gcc10/c++/algorithm:62,
+	                     from test.cc:82:
+	    /opt/local/include/gcc10/c++/bits/stl_construct.h: In instantiation of 'constexpr decltype (::new(void*(0)) _Tp) std::construct_at(_Tp*, _Args&& ...) [with _Tp = glr_stack_item; _Args = {glr_stack_item}; decltype (::new(void*(0)) _Tp) = glr_stack_item*]':
+	    /opt/local/include/gcc10/c++/bits/alloc_traits.h:514:21:   required from 'static constexpr void std::allocator_traits<std::allocator<_CharT> >::construct(std::allocator_traits<std::allocator<_CharT> >::allocator_type&, _Up*, _Args&& ...) [with _Up = glr_stack_item; _Args = {glr_stack_item}; _Tp = glr_stack_item; std::allocator_traits<std::allocator<_CharT> >::allocator_type = std::allocator<glr_stack_item>]'
+	    /opt/local/include/gcc10/c++/bits/vector.tcc:115:30:   required from 'std::vector<_Tp, _Alloc>::reference std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = {glr_stack_item}; _Tp = glr_stack_item; _Alloc = std::allocator<glr_stack_item>; std::vector<_Tp, _Alloc>::reference = glr_stack_item&]'
+	    /opt/local/include/gcc10/c++/bits/stl_vector.h:1204:21:   required from 'void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = glr_stack_item; _Alloc = std::allocator<glr_stack_item>; std::vector<_Tp, _Alloc>::value_type = glr_stack_item]'
+	    test.cc:1949:48:   required from here
+	    /opt/local/include/gcc10/c++/bits/stl_construct.h:95:14: error: noexcept-expression evaluates to 'false' because of a call to 'glr_stack_item::glr_stack_item(const glr_stack_item&)' [-Werror=noexcept]
+	       95 |     noexcept(noexcept(::new((void*)0) _Tp(std::declval<_Args>()...)))
+	          |              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+	    test.cc:1436:3: note: but 'glr_stack_item::glr_stack_item(const glr_stack_item&)' does not throw; perhaps it should be declared 'noexcept'
+	     1436 |   glr_stack_item(const glr_stack_item& other)
+	          |   ^~~~~~~~~~~~~~
+	    cc1plus: all warnings being treated as errors
+	    stdout:
+	    tests/types.at:138: exit code was 1, expected 0
+	    433. types.at:138: 433. glr2.cc api.value.type={double} (types.at:138): FAILED (types.at:138)
+
+	* data/skeletons/glr2.cc (glr_stack_item): Use YY_NOEXCEPT/YY_NOTHROW.
+
+2020-09-12  Valentin Tolmer  <valentin.tolmer@gmail.com>
+
+	glr2.cc: coding style changes
+	* data/skeletons/glr2.cc: Change some CamlCase to snake_case, and
+	remove some yy prefixes for classes inside the namespace.
+
+2020-09-12  Valentin Tolmer  <valentin.tolmer@gmail.com>
+
+	glr2.cc: move StrongIndexAlias into the namespace
+	* data/skeletons/glr2.cc: here.
+
+2020-09-12  Valentin Tolmer  <valentin.tolmer@gmail.com>
+
+	glr2.cc: remove usage of PTRDIFF_MAX
+	* data/skeletons/glr2.cc: Use std::ptrdiff_t and numeric_limits.
+
+2020-09-12  Valentin Tolmer  <valentin.tolmer@gmail.com>
+
+	glr2.cc: remove C-style casts
+	* data/skeletons/glr2.cc: here.
+
+2020-09-12  Valentin Tolmer  <valentin.tolmer@gmail.com>
+
+	glr2.cc: add copy constructor to yyGLRStackItem
+	This silences the clang warning -Wdeprecated-copy.
+
+	* data/skeletons/glr2.cc: here.
+
+2020-09-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: d: remove unused token
+	* examples/d/calc/calc.y, examples/d/simple/calc.y: Remove "=".
+
+2020-09-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	Merge branch 'maint' (i.e., Bison 3.7.2)
+	* upstream/maint:
+	  maint: post-release administrivia
+	  version 3.7.2
+	  build: disable syntax-check warning
+	  gnulib: update
+	  build: fix incorrect dependencies
+	  doc: updates
+	  gnulib: update
+	  tests: beware of sed portability issues
+
+2020-09-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: fix a concurrent build issue in examples
+	Reported by Thomas Deutschmann <whissi@gentoo.org>.
+	https://lists.gnu.org/r/bug-bison/2020-09/msg00010.html
+
+	* examples/c/lexcalc/local.mk: scan.o depends on parse.[ch].
+
+2020-09-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-09-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.7.2
+	* NEWS: Record release date.
+
+2020-09-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: disable syntax-check warning
+	error_message_uppercase
+	etc/bench.pl.in-419-static int yylex (@{[is_pure (@directive) ? "YYSTYPE *yylvalp" : "void"]});
+
+	* cfg.mk: here.
+
+2020-09-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-09-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: fix incorrect dependencies
+	Commit af000bab111768a04021bf5ffa4bbe91d44e231c ("doc: work around
+	Texinfo 6.7 bug"), published in 3.4.91, added a dependency on the
+	"all" target.
+
+	This is a super bad idea, since "make all" will run this
+	target *before* "all", which builds bison.  It turns out that this new
+	dependency actually needed bison to be built.  So all the regular
+	process (i) build $(BUILT_SOURCES) and then (ii) build bison, was
+	wrecked since some of the $(BUILT_SOURCES) depended on bison...
+
+	It was "easy" to see in the logs of "make V=1" because we were
+	building bison files (such as src/files.o) *before* displaying the
+	banner for "all-recursive".  With this fix, we finally get again the
+	proper sequence:
+
+	    rm -f examples/c/reccalc/scan.stamp examples/c/reccalc/scan.stamp.tmp
+	    /opt/local/libexec/gnubin/mkdir -p examples/c/reccalc
+	    touch examples/c/reccalc/scan.stamp.tmp
+	    flex   -oexamples/c/reccalc/scan.c --header=examples/c/reccalc/scan.h ./examples/c/reccalc/scan.l
+	    mv examples/c/reccalc/scan.stamp.tmp examples/c/reccalc/scan.stamp
+	    rm -f lib/fcntl.h-t lib/fcntl.h && \
+	    { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	      ...
+	    } > lib/fcntl.h-t && \
+	    mv lib/fcntl.h-t lib/fcntl.h
+	    ...
+	    mv -f lib/alloca.h-t lib/alloca.h
+	    make  all-recursive
+
+	Reported by Mingli Yu <mingli.yu@windriver.com>.
+	https://github.com/akimd/bison/issues/31
+	https://lists.gnu.org/r/bison-patches/2020-05/msg00055.html
+
+	Reported by Claudio Calvelli <bugb@w42.org>.
+	https://lists.gnu.org/r/bug-bison/2020-09/msg00001.html
+	https://bugs.gentoo.org/716516
+
+	* doc/local.mk (all): Rename as...
+	(all-local): this.
+	So that we don't compete with BUILT_SOURCES.
+
+2020-09-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: simplify the extraction of example snippets
+	* doc/bison.texi: Use qualified paths.
+	* examples/extexi: Comment changes.
+
+2020-09-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: style changes
+	* data/skeletons/glr2.cc: Remove stray comment.
+
+2020-09-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: get rid of the yyerror scaffolding
+	The yyerror stand-alone function was used to bounce from glr.c's call
+	to yyerror to glr.cc's parser.error.  Now that glr.c is out of the
+	way, just directly use parser.error.
+
+	* data/skeletons/glr2.cc (yyerror): Remove.
+	Adjust callers.
+	(b4_yyerror_args, b4_lyyerror_args, b4_pure_formals): Remove.
+	Now unused.
+
+2020-09-04  Valentin Tolmer  <valentin.tolmer@gmail.com>
+
+	glr2.cc: avoid warnings about printf and shadowing
+	* data/skeletons/glr2.cc: Migrate from using printf to std::cerr & co.
+	Since the yyGLRStack has the user params, no need to pass them around.
+
+2020-09-03  Adela Vais  <adela.vais99@gmail.com>
+
+	examples: d: demonstrate location tracking
+	* examples/d/calc/calc.y: Track locations.
+	* examples/d/calc/calc.test: Check locations.
+
+2020-09-03  Adela Vais  <adela.vais99@gmail.com>
+
+	examples: d: duplicate the example as "simple" and "calc"
+	* examples/d/Makefile, examples/d/calc.d, examples/d/calc.test,
+	examples/d/calc/local.mk: Move into...
+	* examples/d/calc, examples/d/simple: these new directories.
+
+2020-09-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: updates
+	* NEWS, TODO: here.
+
+2020-09-02  Adela Vais  <adela.vais99@gmail.com>
+
+	examples: d: fix the handling of unary +
+	It was interpreting "+exp" as "-exp".
+
+	* examples/d/calc.y: Fix.
+	* examples/d/calc.test: Check it.
+
+2020-09-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: always show ε/%empty in counterexamples
+	On a case such as
+	    %%
+	    exp
+	    : empty "a"
+	    | "a" empty
+
+	    empty
+	    : %empty
+
+	we used to display
+
+	    warning: shift/reduce conflict on token "a" [-Wcounterexamples]
+	    Example: • "a"
+	    Shift derivation
+	      exp
+	      ↳ 2: • "a" empty
+	                 ↳ 2: ε
+	    Example: • "a"
+	    Reduce derivation
+	      exp
+	      ↳ 1: empty  "a"
+	           ↳ 3: •
+
+	where the shift derivation shows an item "2: empty → ε", with an
+	explicit "ε", but the reduce derivation shows "3: empty → •", without
+	"ε".
+
+	For consistency, let's always show ε/%empty in rules with an empty
+	rhs:
+
+	    Reduce derivation
+	      exp
+	      ↳ 1: empty    "a"
+	           ↳ 3: ε •
+
+	* src/derivation.c (derivation_width, derivation_print_tree_impl):
+	Always show ε/%empty in counterexamples.
+	* tests/diagnostics.at: Check that case.
+	* tests/conflicts.at, tests/counterexample.at: Adjust.
+
+2020-08-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: avoid warnings about long long
+	* data/skeletons/glr2.cc: Disable the warning before triggering it.
+
+2020-08-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: display the rule numbers
+	From
+
+	    Example: "if" expr "then" "if" expr "then" stmt • "else" stmt
+	    Shift derivation
+	      if_stmt
+	      ↳ "if" expr "then" stmt
+	                         ↳ if_stmt
+	                           ↳ "if" expr "then" stmt • "else" stmt
+	    Reduce derivation
+	      if_stmt
+	      ↳ "if" expr "then" stmt                        "else" stmt
+	                         ↳ if_stmt
+	                           ↳ "if" expr "then" stmt •
+
+	to
+
+	    Example: "if" expr "then" "if" expr "then" stmt • "else" stmt
+	    Shift derivation
+	      if_stmt
+	      ↳ 3: "if" expr "then" stmt
+	                            ↳ 2: if_stmt
+	                                 ↳ 4: "if" expr "then" stmt • "else" stmt
+	    Example: "if" expr "then" "if" expr "then" stmt • "else" stmt
+	    Reduce derivation
+	      if_stmt
+	      ↳ 4: "if" expr "then" stmt                              "else" stmt
+	                            ↳ 2: if_stmt
+	                                 ↳ 3: "if" expr "then" stmt •
+
+	* src/state-item.h, src/state-item.c (state_item_rule): New.
+	* src/derivation.h, src/derivation.c (struct derivation): Add a rule
+	member.
+	Adjust dependencies.
+	* src/counterexample.c, src/parse-simulation.c: Pass the rule to
+	derivation_new.
+	* src/derivation.c (fprintf_if): New.
+	(derivation_width, derivation_print_tree_impl): Take the rule number
+	into account.
+
+	* tests/conflicts.at, tests/counterexample.at, tests/diagnostics.at,
+	* tests/report.at: Adjust.
+
+	* doc/bison.texi: Adjust.
+
+2020-08-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-08-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: beware of sed portability issues
+	Reported by David Laxer <davidl@softintel.com>.
+	https://lists.gnu.org/r/bug-bison/2020-08/msg00027.html
+
+	* tests/output.at: Don't use + with sed.
+	While at it, fix a quotation problem hidden by the use of '#'.
+
+2020-08-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-08-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: beware of sed portability issues
+	Reported by David Laxer <davidl@softintel.com>.
+	https://lists.gnu.org/r/bug-bison/2020-08/msg00027.html
+
+	* tests/output.at: Don't use + with sed.
+	While at it, fix a quotation problem hidden by the use of '#'.
+
+2020-08-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr2.cc: fix a few warnings
+	* data/skeletons/glr2.cc: Fix some documentation.
+	Be consistent between class/struct.
+	(yydoAction, yyresolveAction): Avoid passing yyparser where useless.
+
+2020-08-30  Valentin Tolmer  <valentin.tolmer@gmail.com>
+
+	glr2.cc: fork glr.cc to a c++ version
+	This is a fork of glr.cc to be c++-first instead of a wrapper around
+	glr.c.
+
+	* data/skeletons/glr2.cc: New.
+	* data/skeletons/bison.m4, data/skeletons/c++.m4: Adjust.
+	* data/skeletons/c.m4 (b4_user_args_no_comma): New.
+	* src/reader.c (grammar_rule_check_and_complete): glr2.cc is C++.
+	* tests/actions.at, tests/c++.at, tests/calc.at, tests/conflicts.at,
+	* tests/input.at, tests/local.at, tests/regression.at, tests/scanner.at,
+	* tests/synclines.at, tests/types.at: Also check glr2.cc.
+
+2020-08-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: always use YYMALLOC/YYFREE
+	Reported by Kovalex <kovalex.pro@gmail.com>.
+	https://lists.gnu.org/r/bug-bison/2020-08/msg00015.html
+
+	* data/skeletons/yacc.c: Don't make direct calls to malloc/free.
+	* tests/calc.at: Check it.
+
+2020-08-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: beware of POSIX mode
+	Reported by Dennis Clarke.
+	https://lists.gnu.org/r/bug-bison/2020-08/msg00013.html
+
+	* examples/d/local.mk, examples/java/calc/local.mk,
+	* examples/java/simple/local.mk: Pass bison's options before its
+	argument, in case we're in POSIX mode.
+
+2020-08-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: history of api.prefix
+	Reported by Matthew Fernandez <matthew.fernandez@gmail.com>.
+	https://lists.gnu.org/r/help-bison/2020-08/msg00015.html
+
+	* doc/bison.texi (api.prefix): We move to {} in 3.0.
+
+2020-08-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	CI: intel moved the script for ICC
+	* .travis.yml: Adjust.
+
+2020-08-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	fix: unterminated \-escape
+	An assertion failed when the last character is a '\' and we're in a
+	character or a string.
+	Reported by Agency for Defense Development.
+	https://lists.gnu.org/r/bug-bison/2020-08/msg00009.html
+
+	* src/scan-gram.l: Catch unterminated escapes.
+	* tests/input.at (Unexpected end of file): New.
+
+2020-08-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	fix: crash when redefining the EOF token
+	Reported by Agency for Defense Development.
+	https://lists.gnu.org/r/bug-bison/2020-08/msg00008.html
+
+	On an empty such as
+
+	    %token FOO
+	           BAR
+	           FOO 0
+	    %%
+	    input: %empty
+
+	we crash because when we find FOO 0, we decrement ntokens (since FOO
+	was discovered to be EOF, which is already known to be a token, so we
+	increment ntokens for it, and need to cancel this).  This "works well"
+	when EOF is properly defined in one go, but here it is first defined
+	and later only assign token code 0.  In the meanwhile BAR was given
+	the token number that we just decremented.
+
+	To fix this, assign symbol numbers after parsing, not during parsing,
+	so that we also saw all the explicit token codes.  To maintain the
+	current numbers (I'd like to keep no difference in the output, not
+	just equivalence), we need to make sure the symbols are numbered in
+	the same order: that of appearance in the source file.  So we need the
+	locations to be correct, which was almost the case, except for nterms
+	that appeared several times as LHS (i.e., several times as "foo:
+	...").  Fixing the use of location_of_lhs sufficed (it appears it was
+	intended for this use, but its implementation was unfinished: it was
+	always set to "false" only).
+
+	* src/symtab.c (symbol_location_as_lhs_set): Update location_of_lhs.
+	(symbol_code_set): Remove broken hack that decremented ntokens.
+	(symbol_class_set, dummy_symbol_get): Don't set number, ntokens and
+	nnterms.
+	(symbol_check_defined): Do it.
+	(symbols): Don't count nsyms here.
+	Actually, don't count nsyms at all: let it be done in...
+	* src/reader.c (check_and_convert_grammar): here.  Define nsyms from
+	ntokens and nnterms after parsing.
+	* tests/input.at (EOF redeclared): New.
+
+	* examples/c/bistromathic/bistromathic.test: Adjust the traces: in
+	"%nterm <double> exp %% input: ...", exp used to be numbered before
+	input.
+
+2020-08-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: fix missing space before paren
+	* cfg.mk (_space_before_paren_exempt): Be less laxist.
+	* src/output.c, src/reader.c: Fix space before paren issues.
+	Pacify the warnings where applicable.
+
+2020-08-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: fix comments and more debug trace
+	* src/location.c, src/symtab.h, src/symtab.c: here.
+
+2020-08-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: more uses of const
+	* src/symtab.c: here.
+
+2020-08-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: fix support for pure parser
+	* etc/bench.pl.in (is_pure): New.
+	(generate_grammar_calc): Use code provides where needed.
+	Use is_pure to call yylex properly.
+	Coding style fixes.
+
+2020-08-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	portability: multiple typedefs
+	Older versions of GCC (4.1.2 here) don't like repeated typedefs.
+
+	      CC       src/bison-parse-simulation.o
+	    src/parse-simulation.c:61: error: redefinition of typedef 'parse_state'
+	    src/parse-simulation.h:74: error: previous declaration of 'parse_state' was here
+	    make: *** [Makefile:7876: src/bison-parse-simulation.o] Error 1
+
+	Reported by Nelson H. F. Beebe.
+
+	* src/parse-simulation.c (parse_state): Don't typedef,
+	parse-simulation.h did it already.
+
+2020-08-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: revert "avoid warnings with GCC 4.6"
+	This reverts commit d0bec3175ff5cf6582ffbf584b73ea6aaea838d0 (which
+	should have read "We have a clash...", not "With have a clash...").
+	Now that `max()` was renamed `max_int()`, we can use `max` again, as
+	elsewhere in the code.
+
+	* src/counterexample.c (visited_hasher): Alpha reconversion.
+
+2020-08-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-08-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.7.1
+	* NEWS: Record release date.
+
+2020-08-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	portability: we use termios.h and sys/ioctl.h
+	Reported by Maarten De Braekeleer.
+	https://lists.gnu.org/r/bison-patches/2020-07/msg00079.html
+
+	* bootstrap.conf (gnulib_modules): Add termios and sys_ioctl.
+
+2020-08-02  Maarten De Braekeleer  <maarten.debraekeleer@gmail.com>
+
+	portability: rename accept to acceptsymbol because of MSVC
+	MSVC already defines this symbol.
+
+	* src/symtab.h, src/symtab.c (accept): Rename as...
+	(acceptsymbol): this.
+	Adjust dependencies.
+
+2020-08-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-08-02  Maarten De Braekeleer  <maarten.debraekeleer@gmail.com>
+
+	portability: use CHAR_LITERAL instead of CHAR because MSVC defines CHAR
+	* src/parse-gram.y, src/scan-gram.l: here.
+
+2020-08-02  Maarten De Braekeleer  <maarten.debraekeleer@gmail.com>
+
+	portability: use INT_LITERAL instead of INT because MSVC defines INT
+	It is defined as a typedef, not a macro.
+	https://lists.gnu.org/r/bison-patches/2020-08/msg00001.html
+
+	* src/parse-gram.y, src/scan-gram.l: here.
+
+2020-08-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	portability: beware of max () with MSVC
+	Reported by Maarten De Braekeleer.
+	https://lists.gnu.org/r/bison-patches/2020-07/msg00080.html
+
+	We don't want to use gnulib's min and max macros, since we use
+	function calls in min/max arguments.
+
+	* src/location.c (max_int, min_int): Move to...
+	* src/system.h: here.
+	* src/counterexample.c, src/derivation.c: Use max_int instead of max.
+
+2020-08-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	libtextstyle: be sure to have ostream_printf and hyperlink support
+	Older versions of libtextstyle do not support them, rule them out.
+
+	Reported by Lars Wendler
+	https://lists.gnu.org/r/bug-bison/2020-07/msg00030.html
+
+	and by Arnold Robbins
+	https://lists.gnu.org/r/bug-bison/2020-07/msg00041.html and
+	https://lists.gnu.org/mailman/private/gawk-devel/2020-July/003988.html
+
+	and by Nelson H. F. Beebe
+	https://lists.gnu.org/mailman/private/gawk-devel/2020-July/003993.html
+
+	With support from Bruno Haible in gnulib
+	https://lists.gnu.org/r/bug-gnulib/2020-08/msg00000.html
+	thread starting at
+	https://lists.gnu.org/r/bug-gnulib/2020-07/msg00148.html
+
+	* configure.ac: Require libtextstyle 0.20.5.
+	* gnulib: Update.
+
+2020-08-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	CI: comment changes
+
+2020-08-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-08-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	diagnostics: better location for type redeclarations
+	From
+
+	    foo.y:1.7-11: error: %type redeclaration for bar
+	        1 | %type <foo> bar bar
+	          |       ^~~~~
+	    foo.y:1.7-11: note: previous declaration
+	        1 | %type <foo> bar bar
+	          |       ^~~~~
+
+	to
+
+	    foo.y:1.17-19: error: %type redeclaration for bar
+	        1 | %type <foo> bar bar
+	          |                 ^~~
+	    foo.y:1.13-15: note: previous declaration
+	        1 | %type <foo> bar bar
+	          |             ^~~
+
+	* src/symlist.h, src/symlist.c (symbol_list_type_set): There's no need
+	for the tag's location, use that of the symbol.
+	* src/parse-gram.y: Adjust.
+	* tests/input.at: Adjust.
+
+2020-07-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: updates for D
+
+2020-07-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: style: comment changes
+	* src/parse-simulation.c: here.
+
+2020-07-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: style: prefer "res" for the returned value
+	* src/derivation.c (derivation_new): here.
+
+2020-07-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: style: prefer FOO_print to print_FOO
+	* src/state-item.h, src/state-item.c (print_state_item): Rename as...
+	(state_item_print): this.
+	* src/counterexample.c (print_counterexample): Rename as...
+	(counterexample_print): this.
+
+2020-07-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	scanner: don't crash on strings containing a NUL byte
+	We crash if the input contains a string containing a NUL byte.
+	Reported by Suhwan Song.
+	https://lists.gnu.org/r/bug-bison/2020-07/msg00051.html
+
+	* src/flex-scanner.h (STRING_FREE): Avoid accidental use of
+	last_string.
+	* src/scan-gram.l: Don't call STRING_FREE without calling
+	STRING_FINISH first.
+	* tests/input.at (Invalid inputs): Check that case.
+
+2020-07-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: refer to cex from sections dealing with conflicts
+	The documentation about -Wcex should be put forward.
+
+	* doc/bison.texi: Refer to -Wcex from the sections about conflicts.
+
+2020-07-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: factor ifnottex/iftex examples
+	* doc/bison.texi: Factor the common bits out of ifnottex/iftex.
+
+2020-07-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: fix colors
+	The original Texinfo macros introducing colors were made for
+	diagnostics, which are printed in bold.  So by copy-paste accident the
+	styles we introduced for counterexamples were also in bold.  They
+	should not.
+
+	* doc/bison.texi: Separate the styling of diagnostics from the styling
+	for counterexamples.
+	Don't use bold in the latter case.
+
+2020-07-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: fixes
+	* doc/bison.texi: Fix spello.
+	Fix missing colors, and factor.
+
+2020-07-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-07-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.7
+	* NEWS: Record release date.
+
+2020-07-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: avoid warnings with GCC 4.6
+	With have a clash with the "max" function.
+
+	    src/counterexample.c: In function 'visited_hasher':
+	    src/counterexample.c:720:48: error: declaration of 'max' shadows a global declaration [-Werror=shadow]
+	    src/counterexample.c:116:12: error: shadowed declaration is here [-Werror=shadow]
+
+	* src/counterexample.c (visited_hasher): Alpha conversion.
+
+2020-07-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: fix definition of -Wall
+	* doc/bison.texi (Diagnostics): here.
+
+2020-07-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+	* bootstrap.conf: We need stpncpy.
+
+2020-07-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: fixes
+	Fix 6b78e50cef3c2cd8e6f4e7938be987e8769f8eef, "cex: make "rerun with
+	'-Wcex'" a note instead of a warning"
+
+	* tests/conflicts.at (-W versus %expect and %expect-rr): Fix
+	expectations.
+
+2020-07-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: update NEWS for 3.7
+	* NEWS: Update to the current style of cex display.
+
+2020-07-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: catch up with the current display of cex
+	Unfortunately I found no way to use the ↳ glyph in Texinfo, so I used
+	@arrow{} instead, which has a different width, so we have to have all
+	the examples doubled, once for TeX, another for the rest of the world.
+
+	* doc/bison.texi: Use the current display in the examples.
+	* doc/calc.y, doc/ids.y, doc/if-then-else.y, doc/sequence.y: New.
+
+2020-07-21  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: make "rerun with '-Wcex'" a note instead of a warning
+	Currently the suggestion to rerun is a -Wother warning:
+
+	    warning: 2 shift/reduce conflicts [-Wconflicts-sr]
+	    warning: rerun with option '-Wcounterexamples' to generate conflict counterexamples [-Wother]
+
+	Instead, let's attach it as a subnote of the diagnostic (in the
+	current case, -Wconflicts-sr):
+
+	    warning: 2 shift/reduce conflicts [-Wconflicts-sr]
+	    note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
+
+	* src/conflicts.c (conflicts_print): Do that.
+	Adjust the test suite.
+
+2020-07-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-07-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.6.93
+	* NEWS: Record release date.
+
+2020-07-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: label all the derivations by their initial action
+	From
+
+	    input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples]
+	      Example: A b .
+	      First derivation
+	        a
+	        `-> A b .
+	      Second derivation
+	        a
+	        `-> A b
+	              `-> b .
+
+	to
+
+	    input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples]
+	      Example: A b .
+	      First reduce derivation
+	        a
+	        `-> A b .
+	      Second reduce derivation
+	        a
+	        `-> A b
+	              `-> b .
+
+	* src/counterexample.c (print_counterexample): here.
+	Compute the width of the labels to properly align the values.
+	* tests/conflicts.at, tests/counterexample.at, tests/diagnostics.at,
+	* tests/report.at: Adjust.
+
+2020-07-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: improve readability of the subsections
+	Now that the derivation is no longer printed on one line, aligning the
+	example and the derivation is no longer useful.  It can actually be
+	harmful, as it makes the overall structure less clear.
+
+	* src/derivation.h, src/derivation.c (derivation_print_leaves): Remove
+	the `prefix` argument.
+	* src/counterexample.c (print_counterexample): Put the example next to
+	its label.
+	* tests/conflicts.at, tests/counterexample.at, tests/diagnostics.at,
+	* tests/report.at: Adjust.
+
+2020-07-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: don't issue an empty line between counterexamples
+	Now that we use complain, the "sections" are clearer.
+
+	* src/counterexample.c (print_counterexample): Use the empty line only
+	in reports.
+	* tests/counterexample.at, tests/diagnostics.at, tests/report.at: Adjust.
+
+2020-07-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: use usual routines for diagnostics about S/R conflicts
+	See previous commit.  We go from
+
+	    input.y: warning: 3 reduce/reduce conflicts [-Wconflicts-rr]
+	    Shift/reduce conflict on token "⊕":
+	      Example              exp "+" exp • "⊕" exp
+	      Shift derivation
+	        exp
+	        ↳ exp "+" exp
+	                  ↳ exp • "⊕" exp
+
+	to
+
+	    input.y: warning: 3 reduce/reduce conflicts [-Wconflicts-rr]
+	    input.y: warning: shift/reduce conflict on token "⊕" [-Wcounterexamples]
+	      Example              exp "+" exp • "⊕" exp
+	      Shift derivation
+	        exp
+	        ↳ exp "+" exp
+	                  ↳ exp • "⊕" exp
+
+	with an hyperlink on -Wcounterexamples.
+
+	* src/counterexample.c (counterexample_report_shift_reduce):
+	Use complain.
+	* tests/counterexample.at, tests/diagnostics.at, tests/report.at:
+	Adjust.
+
+2020-07-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: use usual routines for diagnostics about R/R conflicts
+	This is more consistent, and brings benefits: users know that these
+	diagnostics are attached to -Wcounterexamples, and they can also click
+	on the hyperlink if permitted by their terminal.
+
+	We go from
+
+	    warning: 1 reduce/reduce conflict [-Wconflicts-rr]
+	    Reduce/reduce conflict on token $end:
+	      Example              A b .
+	      First derivation     a -> [ A b . ]
+	      Second derivation    a -> [ A b -> [ b . ] ]
+
+	to
+
+	    warning: 1 reduce/reduce conflict [-Wconflicts-rr]
+	    input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples]
+	      Example              A b .
+	      First derivation     a -> [ A b . ]
+	      Second derivation    a -> [ A b -> [ b . ] ]
+
+	with an hyperlink on -Wcounterexamples.
+
+	* src/counterexample.c (counterexample_report_reduce_reduce):
+	Use complain.
+	* tests/counterexample.at, tests/diagnostics.at, tests/report.at:
+	Adjust.
+
+2020-07-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	diagnostics: use hyperlinks to point to the only documentation
+	* src/complain.c (begin_hyperlink, end_hyperlink): New.
+	(warnings_print_categories): Use them.
+	* tests/local.at (AT_SET_ENV): Disable hyperlinks in the tests, they
+	contain random id's, and brackets (which is not so nice for M4).
+
+2020-07-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: add anchors for warnings
+	Unfortunately Texinfo somewhat mangles anchors such as `-Werror` into
+	`g_t_002dWerror`, so let's not include the dash.
+
+	* doc/bison.texi (Diagnostics): here.
+
+2020-07-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	glyphs: fix types
+	The code was written on top of buffers of `char[26]`, and then was
+	changed to use `char *`, yet was still using `sizeof buf`, which
+	became `sizeof (char *)` instead of `sizeof (char[26])`.
+
+	Reported by Dagobert Michelsen.
+	https://lists.gnu.org/r/bug-bison/2020-07/msg00023.html
+
+	* src/glyphs.h, src/glyphs.c: Get rid of uses of `char *`, use only
+	glyph_buffer_t.
+
+2020-07-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-07-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.6.92
+	* NEWS: Record release date.
+
+2020-07-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: avoid strncpy
+	syntax-check seems to dislike strncpy.  The GNU Coreutils replaced
+	their uses of strncpy with stpncpy.
+
+	strlcpy is not an option.
+	  http://sources.redhat.com/ml/libc-alpha/2002-01/msg00159.html
+	  http://sources.redhat.com/ml/libc-alpha/2002-01/msg00011.html
+	  http://lists.gnu.org/archive/html/bug-gnulib/2004-09/msg00181.html
+
+	* src/glyphs.c: Use stpncpy.
+
+2020-07-18  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: display derivations as trees
+	Sometimes, understanding the derivations is difficult, because they
+	are serialized to fit in one line.  For instance, the example taken
+	from the NEWS file:
+
+	    %token ID
+	    %%
+	    s: a ID
+	    a: expr
+	    expr: expr ID ',' | "expr"
+
+	gave
+
+	    First example        expr • ID ',' ID $end
+	    Shift derivation     $accept → [ s → [ a → [ expr → [ expr • ID ',' ] ] ID ] $end ]
+	    Second example       expr • ID $end
+	    Reduce derivation    $accept → [ s → [ a → [ expr • ] ID ] $end ]
+
+	Printing as trees, it gives:
+
+	    First example        expr • ID ',' ID $end
+	    Shift derivation
+	      $accept
+	      ↳ s                      $end
+	        ↳ a                 ID
+	          ↳ expr
+	            ↳ expr • ID ','
+	    Second example       expr • ID $end
+	    Reduce derivation
+	      $accept
+	      ↳ s             $end
+	        ↳ a        ID
+	          ↳ expr •
+
+	* src/glyphs.h, src/glyphs.c (down_arrow, empty, derivation_separator):
+	New.
+	* src/derivation.c (derivation_print, derivation_print_impl): Rename
+	as...
+	(derivation_print_flat, derivation_print_flat_impl): These.
+	(fputs_if, derivation_depth, derivation_width, derivation_print_tree)
+	(derivation_print_tree_impl, derivation_print): New.
+	* src/counterexample.c (print_counterexample): Adjust.
+	* tests/conflicts.at, tests/counterexample.at, tests/diagnostics.at,
+	* tests/report.at: Adjust.
+
+2020-07-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: use the glyphs
+	* src/derivation.c: here.
+	* src/gram.h, src/gram.c (print_arrow, print_dot, print_fallback):
+	Remove.
+
+2020-07-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: factor the handling of graphical symbols
+	* src/glyphs.h, src/glyphs.c: New.
+
+2020-07-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: style changes
+	* src/counterexample.c: here.
+
+2020-07-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: simplify tests
+	* tests/counterexample.at (AT_BISON_CHECK_CEX): Handle the keyword.
+	Simplify the signature.
+
+2020-07-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: more colors
+	Provided by Daniela Becker.
+
+	* data/bison-default.css: More colors.
+
+2020-07-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: comments changes
+	* src/print.c: here.
+
+2020-07-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: update GLR sections
+	Reported by Christian Schoenebeck.
+
+	* doc/bison.texi (GLR Parsers): Minor fixes.
+	(Compiler Requirements for GLR): Remove, quite useless today.
+
+2020-07-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: display shifts before reductions
+	When reporting counterexamples for s/r conflicts, put the shift first.
+	This is more natural, and displays the default resolution first, which
+	is also what happens for r/r conflicts where the smallest rule number
+	is displayed first, and "wins".
+
+	* src/counterexample.c (counterexample): Add a shift_reduce member.
+	(new_counterexample): Adjust.
+	Swap the derivations when this is a s/r conflict.
+	(print_counterexample): For s/r conflicts, prefer "Shift derivation"
+	and "Reduce derivation" rather than "First/Second derivation".
+
+	* tests/conflicts.at, tests/counterexample.at, tests/report.at: Adjust.
+	* NEWS, doc/bison.texi: Ditto.
+
+2020-07-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: s/lookahead_tokens/lookaheads/g
+	Currently we use both names.  Let's stick to the short one.
+
+	* src/AnnotationList.c, src/conflicts.c, src/counterexample.c,
+	* src/getargs.c, src/getargs.h, src/graphviz.c, src/ielr.c,
+	* src/lalr.c, src/print-graph.c, src/print-xml.c, src/print.c,
+	* src/state-item.c, src/state.c, src/state.h, src/tables.c:
+	s/lookahead_token/lookahead/gi.
+
+2020-07-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: factor memory allocation
+	* src/counterexample.c (counterexample_report_state): Allocate once
+	per conflicted state, instead of once per r/r conflict.
+
+2020-07-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: use state_item_number consistently
+	* src/counterexample.c, src/state-item.c: here.
+	(counterexample_report_state): While at it, prefer c2 to j/k, to match
+	c1.
+
+2020-07-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: more consistent memory allocation/copy
+	* src/counterexample.c, src/parse-simulation.c: It is more usual in
+	Bison to use sizeof on expressions than on types, especially for
+	allocation.
+	Let the compiler do it's job instead of calling memcpy ourselves.
+
+2020-07-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: minor renaming
+	* src/counterexample.c (has_common_prefix): Rename as...
+	(have_common_prefix): this.
+
+2020-07-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: use better type names
+	There are too many gl_list_t in there, it's hard to understand what is
+	going on.  Introduce and use more precise types.  I sure can be wrong
+	in some places, it's hard to tell without proper tool support.
+
+	* src/counterexample.c, src/lssi.c, src/lssi.h, src/parse-simulation.c,
+	* src/parse-simulation.h, src/state-item.c, src/state-item.h
+	(si_bfs_node_list, search_state_list, ssb_list, lssi_list)
+	(state_item_list): New.
+
+2020-07-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: minor style changes
+	* src/counterexample.h, src/derivation.h, src/derivation.c:
+	More comments.
+	Use `out` for FILE*, as elsewhere.
+
+2020-07-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: beware of version numbers from git describe
+	* tests/report.at: Be robust to version numbers such as
+	3.6.4.133-fbac-dirty.
+
+2020-07-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: fix expectations
+	Broken in ee86ea88399ed02243fbceb2704c9ea322a12bf9.
+
+	* tests/diagnostics.at: here.
+
+2020-07-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: makeinfo wants @arrow{}, not @arrow
+	* doc/bison.texi: here.
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: prefer → to ::=
+	It does not make a lot of sense to use ::= in our counterexamples,
+	that's not something that belongs to the Bison "vocabulary".  Using
+	the colon makes sense, but it's too discreet.  Let's use the arrow,
+	which we already use in some reports (HTML and Dot).
+
+	* src/gram.h (print_dot_fallback): Generalize into...
+	(print_fallback): this.
+	(print_arrow): New.
+	* src/derivation.c: Use it.
+
+	* NEWS, tests/conflicts.at, tests/counterexample.at,
+	* tests/diagnostics.at, tests/report.at: Adjust.
+	* doc/bison.texi: Ditto.
+	Unfortunately the literal `→` is output as `↦`.  So we need to use
+	@arrow.
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: cex: prefer the array notation
+	Prefer `&foos[i]` to `foos + i` when `foos` is an array.  IMHO, it
+	makes the semantics clearer.
+
+	* src/counterexample.c, src/lssi.c, src/parse-simulation.c,
+	* src/state-item.c: With arrays, prefer the array notation rather than
+	the pointer one.
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: cex: remove variables that don't make it simpler to read
+	* src/counterexample.c: With arrays, prefer the array notation rather
+	than the pointer one.
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	bistromathic: demonstrate caret-diagnostics
+	* examples/c/bistromathic/parse.y (user_context): We need the current
+	line.
+	(yyreport_syntax_error): Quote the guilty line, with squiggles.
+	* examples/c/bistromathic/bistromathic.test: Adjust.
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	bistromathic: do not display parse errors on completion
+	Currently autocompletion on a line with errors leaks the error
+	messages.  It can be useful to let the user know, but GNU Readline
+	does not provide us with an nice way to display the error.  So we
+	actually break into the current line of the user.
+
+	So instead, do not show these errors.
+
+	* examples/c/bistromathic/parse.y (user_context): New.
+	Use %param to pass it to the parser and scanner.
+	Keep quiet when in computing autocompletion.
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	bistromathic: don't stupidly reset the location for each token
+	That quite defeats the whole point of locations...  But anyway, we
+	should not see these messages at all.
+
+	* examples/c/bistromathic/parse.y (expected_tokens): Fix (useless)
+	location tracking.
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	bistromathic: promote yytoken_kind_t
+	* examples/c/bistromathic/parse.y: Use yytoken_kind_t rather than int.
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	html: capitalize titles
+	* data/xslt/xml2xhtml.xsl: Use "State 0", not "state 0".
+	As we do in text reports.
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	html: don't define several times the same anchors
+	Currently when we output useless rules, they appear before the
+	grammar, but using the same invocation.  As a result, the anchor is
+	defined twice, and the wrong one, being first, is honored.
+
+	* data/xslt/xml2xhtml.xsl (rule): Take a new 'anchor' parameter to
+	decide whether being an anchor, or a target.
+	Let it be true when output the grammar.
+	* tests/report.at: Adjust.
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	html: simplify
+	* data/xslt/xml2xhtml.xsl: Merge two identical when-clauses.
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	reports: let html reports catch up with --report and --graph
+	* data/xslt/xml2xhtml.xsl: Show the symbol types.
+	* tests/report.at: Adjust.
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	reports: let xml reports catch up with --report and --graph
+	The text and Dot reports are expected to be identical when generated
+	directly (--report, --graph) or indirectly (via XML).  The xml
+	testsuite had not be run for ages, let it catch up a bit.
+
+	* src/print-xml.c: Pass the type of the symbols.
+	* data/xslt/xml2text.xsl
+	Catch up with the new layout.
+	Display the symbol types.
+	Use '•', not '.'
+	* tests/local.at: Smash '•' to '.' when matching against the direct
+	text report.
+	* tests/report.at: Adjust XML expectations.
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	reports: update html ouput
+	* data/xslt/xml2xhtml.xsl: Improve indentation.
+	Use ul/li rather that pre.
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: check html
+	* tests/report.at: here.
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: factor complex expressions
+	* src/print-xml.c, src/print.c: Introduce a variable pointing to the
+	current symbol.
+
+2020-07-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: make it easier to update expectations
+	* tests/local.mk (update-tests): New.
+
+2020-07-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-07-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.6.91
+	* NEWS: Record release date.
+
+2020-07-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: update
+
+2020-07-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-07-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: add license headers
+	Prompted by Rici Lake.
+	https://stackoverflow.com/questions/62658368/#comment110853985_62661621
+	Discussed with Paul Eggert.
+
+	* doc/bison.texi, examples/c/bistromathic/parse.y,
+	* examples/c/lexcalc/parse.y, examples/c/lexcalc/scan.l,
+	* examples/c/pushcalc/calc.y, examples/c/reccalc/parse.y,
+	* examples/c/reccalc/scan.l, examples/d/calc.y,
+	* examples/java/calc/Calc.y, examples/java/simple/Calc.y:
+	Install the GPL3+ header.
+
+2020-07-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: update comments
+	* src/reader.c: action_obstack was removed in 2002...
+	* src/parse-gram.y: Better names.
+	* src/scan-code.h: More comments.
+
+2020-07-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: update comments in the skeletons
+	* data/skeletons/c++.m4, data/skeletons/glr.c, data/skeletons/lalr1.d,
+	* data/skeletons/lalr1.java, data/skeletons/yacc.c:
+	Be more accurate about yychar and yytoken.
+	Don't name local variables as if they were members.
+
+2020-07-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: more details about symbols in m4
+	* data/README.md: here.
+	* README-hacking.md (Vocabulary): More.
+
+2020-07-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-07-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: include the generated header
+	* examples/c/bistromathic/parse.y, examples/c/lexcalc/parse.y,
+	* examples/c/reccalc/parse.y: here.
+	Add some comments.
+
+	* src/parse-gram.y (api_version): Pull out of handle_require.
+	Bump to 3.7.
+
+2020-07-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-07-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.6.90
+	* NEWS: Record release date.
+
+2020-07-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: update
+
+2020-07-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	package: fix syntax-check errors
+	* examples/c/bistromathic/bistromathic.test, po/POTFILES.in: here.
+
+2020-07-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-07-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: give more details about -Wcex and -rcex
+	* data/bison-default.css: Cobalt does not seem to be supported.
+	* doc/bison.texi (Counterexamples): A new section.
+	(Understanding): Show the counterexamples as it shows in the report:
+	with its items.
+	(Bison Options): Document -Wcex and -rcex.
+
+2020-07-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: update
+
+2020-07-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	dot: also use a dot in the output
+	* src/print-graph.c (print_core): Use a dot instead of a point.
+	* doc/figs/example-reduce.gv, doc/figs/example-reduce.txt,
+	* doc/figs/example-shift.gv, doc/figs/example-shift.txt,
+	* doc/figs/example.gv: Update.
+	* tests/output.at, tests/report.at: Adjust.
+
+2020-07-02  Akim Demaille  <akim@lrde.epita.fr>
+
+	doc: improve a sentence
+	* doc/bison.texi: here.
+
+2020-07-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: formatting changes
+
+2020-07-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	news, todo: update
+
+2020-06-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: clarify that the pcontext interface is *.c only
+	Reported by Rici Lake.
+	https://lists.gnu.org/r/bug-bison/2020-06/msg00054.html
+
+	* doc/bison.texi (Syntax Error Reporting Function): Make it clear that
+	this is not exported.
+	Remove C++ details that landed in the C doc.
+
+2020-06-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: use color in the cex examples
+	* doc/bison.texi: here.
+	And use smallexample when it no longer fits in PDF.
+
+2020-06-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: repair the references to the Bibliography
+	In commit c80cdf2db2b302db4137fabd4ae11e578fa51fca ("doc: simplify
+	uses of @ref", Jan 27 2020, released in Bison 3.6), I broke the
+	references to the Bibliography.  For instance:
+
+	     For a more detailed exposition of the mysterious behavior in LALR parsers
+	    -and the benefits of IELR, @pxref{Bibliography,,Denny 2008 March}, and
+	    -@ref{Bibliography,,Denny 2010 November}.
+	    +and the benefits of IELR, @pxref{Bibliography}, and
+	    +@ref{Bibliography}.
+
+	which results in "see Bibliography" twice, instead of the more precise
+	reference.
+
+	* doc/bison.texi (@pcite, @tcite): New.
+	Use them instead of @ref to Bibliography.
+	Cite only the first author (that's what we did for the other entries).
+
+2020-06-30  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	doc: cex documentation
+	* NEWS, doc/bison.texi: Add documentation for conflict counterexample
+	generation.
+
+2020-06-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: update Doxygen template file
+	* doc/Doxyfile.in: here.
+
+2020-06-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: push: don't clear the parser state when accepting/rejecting
+	Currently when a push parser finishes its parsing (i.e., it did not
+	return YYPUSH_MORE), it also clears its state.  It is therefore
+	impossible to see if it had parse errors.
+
+	In the context of autocompletion, because error recovery might have
+	fired, the parser is actually already in a different state.  For
+	instance on `(1 + + <TAB>` in the bistromathic, because there's a
+	`exp: "(" error ")"` recovery rule, `1 + +` tokens have already been
+	popped, replaced by `error`, and autocompletions think we are ready
+	for the closing ")".  So here, we would like to see if there was a
+	syntax error, yet `yynerrs` was cleared.
+
+	In the case of a successful parse, we still have a problem: if error
+	recovery succeeded, we won't know it, since, again, `yynerrs` is
+	clearer.
+
+	It seems much more natural to leave the parser state available for
+	analysis when there is a failure.
+
+	To reuse the parser, we should either:
+
+	1. provide an explicit means to reinitialize a parser state for future
+	   parses.
+
+	2. automatically reset the parser state when it is used in a new
+	   parse.
+
+	Option 2 requires to check whether we need to reinitialize the parser
+	each time we call `yypush_parse`, i.e., each time we give a new token.
+	This seems expensive compared to Option 1, but benchmarks revealed no
+	difference.  Option 1 is incompatible with the documentation
+	("After `yypush_parse` returns a status other than `YYPUSH_MORE`, the
+	parser instance `yyps` may be reused for a new parse.").
+
+	So Option 2 wins, reusing the private `yynew` member to record that a
+	parse was finished, and therefore that the state must reset in the
+	next call to `yypull_parse`.
+
+	While at it, this implementation now reuses the previously enlarged
+	stacks from one parse to another.
+
+	* data/skeletons/yacc.c (yypstate_new): Set up the stacks in their
+	initial configurations (setting their bottom to the stack array), and
+	use yypstate_clear to reset them (moving their top to their bottom).
+	(yypstate_delete): Adjust.
+	(yypush_parse): At the beginning, clear yypstate if needed, and at the
+	end, record when yypstate needs to be clearer.
+
+	* examples/c/bistromathic/parse.y (expected_tokens): Do not propose
+	autocompletion when there are parse errors.
+	* examples/c/bistromathic/bistromathic.test: Check that case.
+
+2020-06-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	bistromathic: don't display undefined locations
+	Currently, completion when there is a syntax error shows broken
+	locations.
+
+	* examples/c/bistromathic/parse.y (expected_tokens): Initialize the
+	location.
+	* examples/c/bistromathic/bistromathic.test: Check that.
+
+2020-06-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: simplify initialization of push parsers
+	The previous commit ("yacc.c: declare and initialize and the same
+	time") made b4_initialize_parser_state_variables useless.
+
+	* data/skeletons/yacc.c (b4_initialize_parser_state_variables): Inline
+	into...
+	(yypstate_clear): here.
+
+2020-06-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-06-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: declare and initialize and the same time
+	In order to factor the code of push and pull parsers, the declaration
+	of the parser's state variable was common (being local variable in
+	pull parsers, and struct members in push parsers).  This result in
+	rather poor style in pull parser, with first variable declarations,
+	and then their initializations.
+
+	The initialization is about to differ between push and pull parsers,
+	so it is no longer worth keeping both cases together.
+
+	* data/skeletons/yacc.c (b4_declare_parser_state_variables): Accept an
+	argument, and when it is set, initialize the variables.
+	Adjust dependencies.
+
+2020-06-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: style changes in push mode
+	* data/skeletons/yacc.c: here.
+
+2020-06-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: simplify yypull_parse
+	Currently yypull_parse takes a yypstate* as argument, and accepts it
+	to be NULL.  This does not seem to make a lot of sense: rather it is
+	its callers that should do that.
+
+	I believe this is historical: yypull_parse was introduced
+	first (c3d503425f8014b432601a33b3398446d63b5963), with yyparse being a
+	macro.  So yyparse could hardly deal with memory allocation properly.
+	In 7172e23e8ffb95b8cafee24c4f36c46ca709507f that yyparse was turned
+	into a genuine function.  At that point, it should have allocated its
+	own yypstate*, which would have left yypull_parse deal with only one
+	single non-null ypstate* argument.
+
+	Fortunately, it is nowhere documented that it is valid to pass NULL to
+	yypull_parse.  It is now forbidden.
+
+	* data/skeletons/yacc.c (yypull_parse): Don't allocate a yypstate.
+	Needs a location to issue the error message.
+	(yyparse): Allocate the yypstate.
+
+2020-06-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: tidy the text files
+	* etc/README: Rename/reformat as...
+	* etc/README.md: this.
+	And ship it.
+
+2020-06-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: simplify the `rand` target
+	* etc/bench.pl.in: There is no need to recompile the bench cases
+	themselves.
+
+2020-06-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: make it easy to edit the generated files
+	* etc/bench.pl.in (&compile): Generate rules that compile the
+	generated files independently of the source files.
+
+2020-06-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: don't use $VERBOSE
+	It is used by the test suite itself, which results in this test
+	failing.
+
+	* tests/c++.at: Use $DEBUG, not $VERBOSE.
+
+2020-06-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: overhaul of the readmes
+	* README-hacking.md (Working from the Repository): Make it first to
+	make it easier to find the instructions to build from the repo.
+	(Implementation Notes): New.
+	* README: Provide more links.
+
+2020-06-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: rename package as api.package
+	* data/skeletons/lalr1.java: here.
+	* doc/bison.texi: Update.
+	* src/muscle-tab.c: Ensure backward compat.
+	* tests/java.at: Check it.
+
+2020-06-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: shift/reduce, not shift-reduce
+	* src/reader.c: here.
+
+2020-06-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: rename endtoken as eoftoken
+	* src/symtab.h, src/symtab.c (endtoken): Rename as...
+	(eoftoken): this.
+	Adjust dependencies.
+
+2020-06-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: fixes
+	Reported by Jacob L. Mandelson.
+
+	* NEWS: here.
+
+2020-06-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: use 'nonterminal' consistently
+	* doc/bison.texi: Formatting changes.
+	* src/gram.h, src/gram.c (nvars): Rename as...
+	(nnterms): this.
+	Adjust dependencies.
+	(section): New.  Use it.
+	Replace "non terminal" and "non-terminal" by "nonterminal".
+
+2020-06-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: parse.assert in C++ requires RTTI
+	* doc/bison.texi (%define Summary): Say it.
+
+2020-06-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: by default, use const std::string for file names
+	Reported by Martin Blais and Yuriy Solodkyy.
+	https://lists.gnu.org/r/help-bison/2020-05/msg00011.html
+	https://lists.gnu.org/r/bug-bison/2020-06/msg00038.html
+
+	While at it, modernize filename_type as api.filename.type and document
+	it properly.
+
+	* data/skeletons/c++.m4 (filename_type): Rename as...
+	(api.filename.type): this.
+	Default to const std::string.
+	* data/skeletons/location.cc (position, location): Expose the
+	filename_type type.
+	Use api.filename.type.
+	* doc/bison.texi (%define Summary): Document api.filename.type.
+	(C++ Location Values): Document position::filename_type.
+	* src/muscle-tab.c (muscle_percent_variable_update): Ensure backward
+	compatibility.
+	* tests/c++.at: Check that using const file names is ok.
+	tests/input.at: Check backward compat.
+
+2020-06-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	ielr: fix crash on memory management
+	Reported by Dwight Guth.
+	https://lists.gnu.org/r/bug-bison/2020-06/msg00037.html
+
+	* src/AnnotationList.c (AnnotationList__computePredecessorAnnotations):
+	Beware that SBITSET__FOR_EACH nests _two_ for-loops, so "break" does
+	not actually break out of it.
+	That was the only occurrence in the code.
+	* src/Sbitset.h (SBITSET__FOR_EACH): Warn passersby.
+
+2020-06-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: factor the access to a rule from its items
+	* src/counterexample.c (item_rule): Move to...
+	* src/counterexample.h: here.
+	* src/AnnotationList.c, src/counterexample.c, src/ielr.c: Use it.
+
+2020-06-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: clean up nullable
+	* src/nullable.c: Reduce scopes.
+	Prefer `r` to `rules_ruleno`, which is truly an ugly name.
+
+2020-06-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: clean up ielr
+	* src/AnnotationList.c, src/ielr.c: Fix include order.
+	Prefer `res` to `result`.
+	Reduce scopes.
+	Be free of the oldish 76 cols limitation when it clutters too much the
+	code.
+	Denest when possible (we're starving for horizontal width).
+
+2020-06-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	don't use strlen to compute visual width
+	* src/output.c (prepare_symbol_names): Use mbswidth.
+
+2020-06-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: use dot/'•' rather than point/'.'
+	AFAICT, "dotted rule" is a more frequent synonym of "item" than
+	"pointed rule".  So let's migrate to using "dot" only.
+
+	* doc/bison.texi: Use dot/'•' rather than point/'.'.
+
+	* src/print-xml.c (print_core): Use dot rather than point.  This is
+	not backward compatible, but AFAICT, we don't have actual user of the
+	XML output (but ourselves).  So...
+	* data/xslt/xml2dot.xsl, data/xslt/xml2text.xsl,
+	* data/xslt/xml2xhtml.xsl, tests/report.at: ... adjust.
+
+2020-06-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: display all the S/R conflicts, not just one per (state, rule)
+	Before this commit, on
+
+	    %%
+	    exp
+	    : "if" exp "then" exp
+	    | "if" exp "then" exp "else" exp
+	    | exp "+" exp
+	    | "num"
+
+	we used to not display the third counterexample below:
+
+	    Shift/reduce conflict on token "+":
+	      Example              exp "+" exp . "+" exp
+	      First derivation     exp ::=[ exp ::=[ exp "+" exp . ] "+" exp ]
+	      Second derivation    exp ::=[ exp "+" exp ::=[ exp . "+" exp ] ]
+
+	    Shift/reduce conflict on token "else":
+	      Example              "if" exp "then" "if" exp "then" exp . "else" exp
+	      First derivation     exp ::=[ "if" exp "then" exp ::=[ "if" exp "then" exp . ] "else" exp ]
+	      Second derivation    exp ::=[ "if" exp "then" exp ::=[ "if" exp "then" exp . "else" exp ] ]
+
+	    Shift/reduce conflict on token "+":
+	      Example              "if" exp "then" exp . "+" exp
+	      First derivation     exp ::=[ exp ::=[ "if" exp "then" exp . ] "+" exp ]
+	      Second derivation    exp ::=[ "if" exp "then" exp ::=[ exp . "+" exp ] ]
+
+	    Shift/reduce conflict on token "+":
+	      Example              "if" exp "then" exp "else" exp . "+" exp
+	      First derivation     exp ::=[ exp ::=[ "if" exp "then" exp "else" exp . ] "+" exp ]
+	      Second derivation    exp ::=[ "if" exp "then" exp "else" exp ::=[ exp . "+" exp ] ]
+
+	* src/counterexample.c (counterexample_report_state): Don't stop of
+	the first conflicts.
+	* tests/conflicts.at, tests/counterexample.at, tests/diagnostics.at,
+	* tests/report.at: Adjust.
+
+2020-06-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: don't display twice unifying examples if there is no color
+	It makes no sense, and is actually confusing, to display twice the
+	same example with no visible difference.
+
+	* src/complain.h, src/complain.c (is_styled): New.
+	* src/counterexample.c (print_counterexample): Display the unified
+	example a second time only if it makes a difference.
+	* tests/conflicts.at, tests/counterexample.at, tests/report.at: Adjust.
+	* tests/diagnostics.at: Make sure we do display the unifying examples
+	twice when colors are enabled.  And check those colors.
+
+2020-06-22  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: fix reporting of null nonterminals
+	I implemented this to print A ::= [ ], but A ::= [ %empty ] might be
+	clearer.
+
+	* src/parse-simulation.c (nullable_closure): Don't generate null
+	nonterminal derivations as leaves.
+	* src/derivation.c (derivation_print_impl): Don't print seperator
+	spaces for null nonterminal.
+	* tests/counterexample.at: Update test results.
+
+2020-06-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: use the bullet in HTML
+	* data/xslt/xml2xhtml.xsl: here.
+
+2020-06-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: style changes
+	* src/counterexample.c: Simplify a bit.
+	* src/parse-simulation.c, src/parse-simulation.h: Enforce coding style.
+
+2020-06-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: get rid of global_tokens_and_yystype
+	This was a hack to make it easier for people to migrate from yacc.c to
+	lalr1.cc and from glr.c to glr.cc: when set, YYSTYPE and YYLTYPE were
+	`#defined`.  It was never documented (just mentioned in NEWS for Bison
+	2.2, 2006-05-19), but was used to simplify the test suite.  Stop that:
+	adjust the test suite to the skeletons, not the converse.
+
+	In C++ use yy::parser::semantic_type, yy::parser::location_type, and
+	yy::parser::token::MY_TOKEN, instead of YYSTYPE, YYLTYPE and MY_TOKEN.
+
+	* data/skeletons/glr.cc, data/skeletons/lalr1.cc: Remove its support.
+	* tests/actions.at, tests/c++.at, tests/calc.at: Adjust.
+
+2020-06-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: don't assume the terminal supports "•"
+	Use of print_unicode_char suggested by Bruno Haible.
+	https://lists.gnu.org/r/bug-gettext/2020-06/msg00012.html
+
+	* src/gram.h (print_dot_fallback, print_dot): New.
+	* src/gram.c, src/derivation.c: Use it.
+	* tests/counterexample.at, tests/report.at: Adjust the test suite.
+	* .travis.yml, README-hacking.md: Adjust.
+
+2020-06-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: also include in the report on --report=counterexamples
+	And let --report=all include the counterexamples.
+
+	* src/getargs.h, src/getargs.c (report_cex): New.
+	* src/main.c: Compute counterexamples when -rcex is specified.
+	* src/print.c: Include the counterexamples when -rcex is specified.
+
+	* tests/conflicts.at, tests/existing.at, tests/local.at: Adjust.
+
+2020-06-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: also include the counterexamples in the report
+	The report is the best place to show the details about
+	counterexamples, since we have the state right under the nose.
+
+	For instance:
+
+	State 7
+
+	    1 exp: exp . "⊕" exp
+	    2    | exp . "+" exp
+	    2    | exp "+" exp .  [$end, "+", "⊕"]
+	    3    | exp . "+" exp
+	    3    | exp "+" exp .  [$end, "+", "⊕"]
+
+	    "⊕"  shift, and go to state 6
+
+	    $end      reduce using rule 2 (exp)
+	    $end      [reduce using rule 3 (exp)]
+	    "+"       reduce using rule 2 (exp)
+	    "+"       [reduce using rule 3 (exp)]
+	    "⊕"       [reduce using rule 2 (exp)]
+	    "⊕"       [reduce using rule 3 (exp)]
+	    $default  reduce using rule 2 (exp)
+
+	    Conflict between rule 2 and token "+" resolved as reduce (%left "+").
+
+	    Shift/reduce conflict on token "⊕":
+	        2 exp: exp "+" exp .
+	        1 exp: exp . "⊕" exp
+	      Example                  exp "+" exp • "⊕" exp
+	      First derivation         exp ::=[ exp ::=[ exp "+" exp • ] "⊕" exp ]
+	      Example                  exp "+" exp • "⊕" exp
+	      Second derivation        exp ::=[ exp "+" exp ::=[ exp • "⊕" exp ] ]
+
+	    Reduce/reduce conflict on tokens $end, "+", "⊕":
+	        2 exp: exp "+" exp .
+	        3 exp: exp "+" exp .
+	      Example                  exp "+" exp •
+	      First derivation         exp ::=[ exp "+" exp • ]
+	      Example                  exp "+" exp •
+	      Second derivation        exp ::=[ exp "+" exp • ]
+
+	    Shift/reduce conflict on token "⊕":
+	        3 exp: exp "+" exp .
+	        1 exp: exp . "⊕" exp
+	      Example                  exp "+" exp • "⊕" exp
+	      First derivation         exp ::=[ exp ::=[ exp "+" exp • ] "⊕" exp ]
+	      Example                  exp "+" exp • "⊕" exp
+	      Second derivation        exp ::=[ exp "+" exp ::=[ exp • "⊕" exp ] ]
+
+	* src/conflicts.h, src/conflicts.c (has_conflicts): New.
+	* src/counterexample.h, src/counterexample.c (print_counterexample):
+	Add a `prefix` argument.
+	(counterexample_report_shift_reduce)
+	(counterexample_report_reduce_reduce): Show the items when there's a
+	prefix.
+	* src/state-item.h, src/state-item.c (print_state_item):
+	Add a `prefix` argument.
+	* src/derivation.h, src/derivation.c (derivation_print)
+	(derivation_print_leaves): Add a prefix argument.
+	* src/print.c (print_state): When -Wcex is enabled, show the
+	conflicts.
+	* tests/report.at: Adjust.
+
+2020-06-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: indent the diagnostics to highlight the structure
+	Instead of
+
+	    Shift/reduce conflict on token D:
+	    Example              A a • D
+	    First derivation     s ::=[ A a a ::=[ b ::=[ c ::=[ • ] ] ] d ::=[ D ] ]
+	    Example              A a • D
+	    Second derivation    s ::=[ A a d ::=[ • D ] ]
+
+	display
+
+	    Shift/reduce conflict on token D:
+	      Example              A a • D
+	      First derivation     s ::=[ A a a ::=[ b ::=[ c ::=[ • ] ] ] d ::=[ D ] ]
+	      Example              A a • D
+	      Second derivation    s ::=[ A a d ::=[ • D ] ]
+
+	* src/counterexample.c (print_counterexample): Indent.
+	* tests/counterexample.at: Adjust.
+
+2020-06-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: don't report the items
+	Showing the items (with the state numbers) is really something we
+	should restrict to the report.
+
+	* src/counterexample.c (counterexample_report_shift_reduce)
+	(counterexample_report_reduce_reduce): Don't show the pointed rules,
+	we will do that in the report.
+	* tests/counterexample.at: Adjust.
+
+2020-06-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: make sure traces go to stderr
+	* src/parse-simulation.h, src/parse-simulation.c (print_parse_state):
+	here.
+
+2020-06-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: add an argument to the reporting functions to specify the stream
+	* src/conflicts.c (find_state_item_number, report_state_counterexamples):
+	Move to...
+	* src/counterexample.h, src/counterexample.c (find_state_item_number)
+	(counterexample_report_state): this.
+	Add support for `out` as an argument.
+	(counterexample_report_reduce_reduce, counterexample_report_shift_reduce):
+	Accept an `out` argument, and be static.
+
+2020-06-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: more uses of const
+	* src/print.c, src/state.h, src/state.c: here.
+
+2020-06-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	Merge 'maint'
+	* upstream/maint:
+	  maint: post-release administrivia
+	  version 3.6.4
+	  glr.cc: don't leak glr.c/glr.cc scaffolding to the user
+
+	Some fixes were needed to adjust to recent changes in glr.cc and
+	glr.c.
+
+	* data/skeletons/glr.cc: Stop messing with the user's epilogue to
+	insert glr.cc code.  We need that code to be inserted _before_ the
+	user's epilogue, not after.  So define b4_glr_cc_pre_epilogue.
+	* data/skeletons/glr.c: Use it.
+
+2020-06-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-06-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.6.4
+	* NEWS: Record release date.
+
+2020-06-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.cc: don't leak glr.c/glr.cc scaffolding to the user
+	Until we have a decent reimplementation of glr.cc, we have to use
+	tricks to shoehorn C++ symbols to the C engine of glr.c.  Some of them
+	are done via #define.  Unfortunately in Bison 3.6 some of these we
+	done in the header file, which broke valid user code.
+
+	Reported by Egor Pugin.
+	https://lists.gnu.org/r/bug-bison/2020-06/msg00003.html
+
+	* data/skeletons/glr.cc: Stop playing tricks with b4_pre_epilogue.
+	(b4_glr_cc_setup, b4_glr_cc_cleanup): New.
+	Much cleaner way to instal glr.cc's scaffolding around glr.c.
+	* data/skeletons/glr.c: Adjust to use them.
+
+2020-06-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	reports: the column width differs from the byte count
+	From
+
+	    "number"          shift, and go to state 1
+	    "Ñùṃéℝô"  shift, and go to state 2
+
+	to
+
+	    "number"  shift, and go to state 1
+	    "Ñùṃéℝô"  shift, and go to state 2
+
+	* src/print.c: Use mbswidth, not strlen, to compute visual columns.
+	* tests/report.at: Adjust.
+
+2020-06-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	reports: don't escape the labels
+	Currently we use "quotearg" to escape the strings output in Dot.  As a
+	result, if the user's locale is C for instance, all the non-ASCII are
+	escaped.  Unfortunately graphviz does not interpret this style of
+	escaping.
+
+	For instance:
+
+	    5 -> 2 [style=solid label="\"\303\221\303\271\341\271\203\303\251\342\204\235\303\264\""]
+
+	was displayed as a sequence of numbers.  We now output:
+
+	    5 -> 2 [style=solid label="\"Ñùṃéℝô\""]
+
+	independently of the user's locale.
+
+	* src/system.h (obstack_backslash): New.
+	* src/graphviz.h, src/graphviz.c (escape): Remove, use
+	obstack_backslash instead.
+	* src/print-graph.c: Likewise.
+	* tests/report.at: Adjust.
+
+2020-06-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-06-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	parser: keep string aliases as the user wrote it
+	Currently our scanner decodes all the escapes in the strings, and we
+	later reescape the strings when we emit them.
+
+	This is troublesome, as we do not respect the user input.  For
+	instance, when the user writes in UTF-8, we destroy her string when we
+	write it back.  And this shows everywhere: in the reports we show the
+	escaped string instead of the actual alias:
+
+	    0 $accept: . exp $end
+	    1 exp: . exp "\342\212\225" exp
+	    2    | . exp "+" exp
+	    3    | . exp "+" exp
+	    4    | . "number"
+	    5    | . "\303\221\303\271\341\271\203\303\251\342\204\235\303\264"
+
+	    "number"                                                    shift, and go to state 1
+	    "\303\221\303\271\341\271\203\303\251\342\204\235\303\264"  shift, and go to state 2
+
+	This commit preserves the user's exact spelling of the string aliases,
+	instead of interpreting the escapes and then reescaping.  The report
+	now shows:
+
+	    0 $accept: . exp $end
+	    1 exp: . exp "⊕" exp
+	    2    | . exp "+" exp
+	    3    | . exp "+" exp
+	    4    | . "number"
+	    5    | . "Ñùṃéℝô"
+
+	    "number"          shift, and go to state 1
+	    "Ñùṃéℝô"  shift, and go to state 2
+
+	Likewise, the XML (and therefore HTML) outputs are fixed.
+
+	* src/scan-gram.l (STRING, TSTRING): Do not interpret the escapes in
+	the resulting string.
+	* src/parse-gram.y (unquote, parser_init, parser_free, unquote_free)
+	(handle_defines, handle_language, obstack_for_unquote): New.
+	Use them to unquote where needed.
+	* tests/regression.at, tests/report.at: Update.
+
+2020-06-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: check reports with conflicts and UTF-8
+	This is to record the current state of the report, which escapes the
+	UTF-8 characters (as parse.error="verbose" does), but shouldn't (as
+	parse.error="detailed" does).
+
+	* tests/report.at: here.
+
+2020-06-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: factor common bits about string scanning
+	* src/scan-gram.l: here.
+
+2020-06-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: introduce & use STRING_1GROW
+	* src/flex-scanner.h (STRING_1GROW): New.
+	* src/scan-gram.l, src/scan-skel.l: Use it.
+
+2020-06-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: reduce scopes
+	* src/scan-gram.l (STRING_GROW_ESCAPE): Move the static_assert about
+	type sizes here.
+
+2020-06-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: prefer 'FOO ()' to 'FOO' for function-like macros
+	* src/flex-scanner.h (STRING_GROW, STRING_FINISH, STRING_FREE):
+	Make them function-like macros.
+	Adjust dependencies.
+
+2020-06-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-06-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: suggest -Wcounterexamples when there are unexpected conflicts
+	Suggesting -Wcounterexamples when there are conflicts is probably not
+	what the user wants.  If she knows her conflicts and has set
+	%expect/%expect-rr appropriately, we shouldn't warn.
+
+	The commit also swaps the counterexamples and the report of conflicts,
+	into, IMHO, a more natural order: from
+
+	    Shift/reduce conflict on token B:
+	    1:    3 a: A .
+	    1:    8 y: A . B
+	    Example              A • B C
+	    First derivation     s ::=[ a ::=[ A • ] x ::=[ B C ] ]
+	    Example              A • B C
+	    Second derivation    s ::=[ y ::=[ A • B ] c ::=[ C ] ]
+
+	    input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+	    input.y:4.4: warning: rule useless in parser due to conflicts [-Wother]
+
+	to
+
+	    input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+	    Shift/reduce conflict on token B:
+	    1:    3 a: A .
+	    1:    8 y: A . B
+	    Example              A • B C
+	    First derivation     s ::=[ a ::=[ A • ] x ::=[ B C ] ]
+	    Example              A • B C
+	    Second derivation    s ::=[ y ::=[ A • B ] c ::=[ C ] ]
+
+	    input.y:4.4: warning: rule useless in parser due to conflicts [-Wother]
+
+	* src/conflicts.c (rule_conflicts_print): Rename as...
+	(report_rule_expectation_mismatches): this.
+	Move the handling of report_counterexamples to...
+	(conflicts_print): Here.
+	Display this warning when applicable.
+
+2020-06-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: rename -Wcounterexample as -Wcounterexamples, and support -Wcex
+	Plural vs. singular is always a problem...
+
+	But we already have conflicts-sr and conflicts-rr, so counterexamples
+	makes more sense than counterexample.  Besides, -Wcounterexample will
+	still be accepted as an unambiguous prefix of -Wcounterexamples.
+
+	Add -Wcex as a convenient alias.
+
+	While at it, use only "counterexample", never "counter example".
+
+	* src/complain.h, src/complain.c
+	(Wcounterexample, warning_counterexample): Rename as...
+	(Wcounterexamples, warning_counterexamples): these.
+	(argmatch_warning_docs): Rename -Wcounterexample as -Wcounterexamples.
+	(argmatch_warning_args): Likewise.
+	Add support for -Wcex.
+	Adjust dependencies.
+
+2020-06-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	api.header.include: document it, and fix its default value
+	While defining api.header.include worked as expected, its default
+	value was incorrectly defined.  As a result, by default, the generated
+	parsers still duplicated the content of the generated header instead
+	of including it.
+
+	* data/skeletons/yacc.c (api.header.include): Fix its default value.
+	* tests/output.at: Check it.
+	* doc/bison.texi (%define Summary): Document api.header.include.
+	While at it, move the definition of api.namespace at the proper
+	place.
+
+2020-06-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: color the counterexamples
+	Use colors to show the counterexamples and the derivations in color,
+	to highlight their structure.  Align the outputs, and add i18n
+	support. Reduce width by using a one-space separator instead of
+	two-space.
+
+	From
+
+	    Example  A  •  B  C
+	    First  derivation  s ::=[ a ::=[ A  • ]  x ::=[ B  C ] ]
+	    Second derivation  s ::=[ y ::=[ A  •  B ]  c ::=[ C ] ]
+
+	to
+
+	    Example              A • B C
+	    First derivation     s ::=[ a ::=[ A • ] x ::=[ B C ] ]
+	    Example              A • B C
+	    Second derivation    s ::=[ y ::=[ A • B ] c ::=[ C ] ]
+
+	with colors.
+
+	* data/bison-default.css (cex-dot, cex-0, cex-1, cex-2, cex-3, cex-4)
+	(cex-5, cex-6, cex-7, cex-step, cex-leaf): New.
+	* src/derivation.c (derivation_print_styled_impl): New.
+	(derivation_print, derivation_print_leaves): Use it.
+	* src/counterexample.c: Reformat the output.
+	* tests/counterexample.at: Adjust.
+
+2020-06-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: enforce case for tokens/nonterminals
+	It's unfortunate that the traditions between formal language theory
+	and Yacc differs, but here, tokens should be upper case, and
+	nonterminals should be lower case.
+
+	* tests/counterexample.at: Comply with this.
+
+2020-06-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: reformat the s/r and r/r reports
+	In Bison we refer to "shift/reduce" conflicts, not "shift-reduce" (in
+	Bison 3.6.3 186 occurrences vs 15).  Enforce consistency on this.
+
+	Instead of "spending" a second line for each conflict to report the
+	lookaheads, put that on the same line as the type of conflict.  Also,
+	prefer "token" to "symbol".  Maybe we should even prefer "lookahead".
+	While at it, enable internationalization, with plurals where
+	appropriate.
+
+	As a consequence, instead of
+
+	    Shift-Reduce Conflict:
+	    6:    3 b: . %empty
+	    6:    6 d: c . A
+	    On Symbol: A
+
+	display
+
+	    Shift/reduce conflict on token A:
+	    6:    3 b: . %empty
+	    6:    6 d: c . A
+
+	* NEWS, doc/bison.texi, src/conflicts.c: Spell it "shift/reduce", not
+	"shift-reduce".
+	* src/counterexample.c (counterexample_report_shift_reduce)
+	(counterexample_report_reduce_reduce): Reformat and internationalize
+	output.
+	* tests/counterexample.at: Adjust expectations.
+
+2020-06-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: fix syntax-check issues
+	* src/counterexample.c, src/files.c, src/files.h, src/lssi.c,
+	* src/state-item.c: here.
+
+2020-06-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	all: show the rules in comments before the user actions
+	For instance, in the case of Bison's own parser:
+
+	    -  case 40:
+	    +  case 40:  /* grammar_declaration: "%code" "identifier" "{...}"  */
+	         {
+	           muscle_percent_code_grow ((yyvsp[-1].ID), (yylsp[-1]),
+	                                     translate_code_braceless ((yyvsp[0].BRACED_CODE), (yylsp[0])),
+	                                     (yylsp[0]));
+	           code_scanner_last_string_free ();
+	         }
+	         break;
+
+	* data/skeletons/c.m4: Modified.
+	* data/skeletons/d.m4: Modified.
+	* data/skeletons/java.m4: Modified.
+	* src/output.c (output_escaped): New.
+	(quoted_output): Use it, and rename as...
+	(output_quoted): this.
+	Adjust dependencies.
+	(rule_output): New.
+	(user_actions_output): Use it.
+	* data/skeletons/c.m4, data/skeletons/d.m4, data/skeletons/java.m4
+	(b4_case): Add support for $3, an optional comment.
+
+2020-06-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	CI: use GCC10 on ppc too
+	We were still using GCC9, because GCC10 was failing.
+
+	* .travis.yml (PPC64le): Use GCC10.
+	While at it, use -O2 instead of -O3: it's certainly nicer for the
+	CPUs, and allows to test different sets of compiler flags (we use -O3
+	in several other configurations).
+
+2020-06-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: fix missing includes
+	* examples/c/bistromathic/parse.y: Use abort rather than assert so
+	that the "unused result" warning is silenced even with -DNDEBUG.
+
+2020-06-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	warnings: fix -Wmissing-prototypes issues
+	* src/counterexample.c, src/lssi.c, src/parse-simulation.c,
+	* src/state-item.c:
+	Here.
+
+2020-06-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	Merge maint into HEAD
+	* upstream/maint:
+	  maint: post-release administrivia
+	  version 3.6.3
+	  build: check -Wmissing-prototypes
+	  tests: show logs
+	  c++: fix printing of state number on streams
+
+2020-06-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-06-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.6.3
+	* NEWS: Record release date.
+
+2020-06-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: check -Wstrict-aliasing
+	* configure.ac (warn_common): Add -Wstrict-aliasing.
+
+2020-06-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: using asan
+	* README-hacking.md: here.
+
+2020-06-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: fix includes
+	* src/fixits.c: Follow our usual pattern.
+	* src/scan-code.l, src/scan-gram.l, src/scan-skel.l: Prefer "" to
+	include src/ headers.
+	* README-hacking.md: Document the pattern.
+
+2020-06-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	lists: fix various issues with the use of gnulib's list
+	First, we should avoid code such as
+
+	    gl_list_iterator_t it = gl_list_iterator (deriv->children);
+	    derivation *child = NULL;
+	    while (gl_list_iterator_next (&it, (const void **) &child, NULL))
+	      {
+	        derivation_print (child, f);
+
+	because of -Wstrict-aliasing (whose job is to catch type-punning
+	issues).  See https://lists.gnu.org/r/bug-bison/2020-05/msg00039.html.
+
+	Rather we need
+
+	    gl_list_iterator_t it = gl_list_iterator (deriv->children);
+	    const void **p = NULL;
+	    while (gl_list_iterator_next (&it, &p, NULL))
+	      {
+	        derivation *child = (derivation *) p;
+	        derivation_print (child, f);
+
+	Second, list iterators actually have destructors.  Even though they
+	are noop in the case of linked-lists, we should use them.
+
+	Let's address both issues with typed wrappers (such as
+	derivation_list_next) that take care of both issues, and besides allow
+	to scope the iterators within the loop:
+
+	    derivation *child;
+	    for (gl_list_iterator_t it = gl_list_iterator (deriv->children);
+	         derivation_list_next (&it, &child);
+	         )
+	      {
+	        derivation_print (child, f);
+
+	* src/derivation.h, src/derivation.c (derivation_list_next): New.
+	Use it where appropriate.
+	* src/counterexample.c (search_state_list_next): New.
+	Use it where appropriate.
+	* src/parse-simulation.h, src/parse-simulation.c
+	* src/state-item.h (state_item_list_next): New.
+	Use it where appropriate.
+
+2020-06-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: check -Wmissing-prototypes
+	pstate_clear is lacking a prototype.
+	Reported by Ryan
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00101.html
+
+	Besides, none of the C examples were compiled with the warning flags.
+
+	* configure.ac (warn_c): Add -Wmissing-prototypes.
+	* data/skeletons/yacc.c (pstate_clear): Make it static.
+	* examples/local.mk (TEST_CFLAGS): New.
+	* examples/c/bistromathic/local.mk, examples/c/calc/local.mk,
+	* examples/c/lexcalc/local.mk, examples/c/mfcalc/local.mk,
+	* examples/c/pushcalc/local.mk, examples/c/reccalc/local.mk,
+	* examples/c/rpcalc/local.mk:
+	Use it.
+
+	GCC's warn_unused_result is not silenced by a cast to void, so we have
+	to "use" scanf's result.
+	https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25509
+	https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425
+
+	Flex generated code produces too many warnings, including things such
+	as, with ICC:
+
+	    examples/c/lexcalc/scan.c(1088): error #1682: implicit conversion
+	              of a 64-bit integral type to a smaller integral type (potential portability problem)
+	    2259                YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+	    2260                ^
+	    2261
+	    2262
+
+	I am tired of trying to fix Flex's output.  The project does not seem
+	maintained.  We ought to avoid it.  So, for the time being, don't try
+	to enable warnings with Flex.
+
+	* examples/c/bistromathic/parse.y, examples/c/reccalc/scan.l: Fix
+	warnings.
+	* doc/bison.texi: Discard scanf's return value to defeat
+	-Werror=unused-result.
+
+2020-05-31  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-05-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: make item_index a truly different type from item_number
+	See previous commit.
+
+	* src/gram.h (item_index): Make it unsigned.
+	Fix remaiming issues.
+
+2020-05-25  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	style: decouple different uses of item_number
+	item_number is used for elements of ritem as well as indices into
+	ritem which is fairly confusing.  Introduce item_index to represent
+	indices into ritem.
+
+	* src/gram.h (item_index): Introduce it for ritem indices.
+	* src/closure.h, src/closure.c, src/ielr.c, src/lr0.c,
+	* src/print-graph.c, src/state.h, src/state.h:
+	Replace uses of item_number with item_index where appropriate.
+
+2020-05-24  Joshua Watt  <jpewhacker@gmail.com>
+
+	bison: add command line option to map file prefixes
+	Teaches bison about a new command line option, --file-prefix-map OLD=NEW
+	(based on the -ffile-prefix-map option from GCC) which causes it to
+	replace and file path of OLD in the text of the output file with NEW,
+	mainly for header guards and comments. The primary use of this is to
+	make builds reproducible with different input paths, and in particular
+	the debugging information produced when the source code is compiled. For
+	example, a distro may know that the bison source code will be located at
+	"/usr/src/bison" and thus can generate bison files that are reproducible
+	with the following command:
+
+	    bison --output=/build/bison/parse.c -d --file-prefix-map=/build/bison/=/usr/src/bison/ parse.y
+
+	Importantly, this will change the header guards and #line directives
+	from:
+
+	    #ifndef YY_BUILD_BISON_PARSE_H
+	    #line 100 "/build/bison/parse.h"
+
+	to
+
+	    #ifndef YY_USR_SRC_BISON_PARSE_H
+	    #line 100 "/usr/src/bison/parse.h"
+
+	which is reproducible.
+
+	See https://lists.gnu.org/r/bison-patches/2020-05/msg00016.html
+
+	* src/files.h, src/files.c (spec_mapped_header_file)
+	(mapped_dir_prefix, map_file_name, add_prefix_map): New.
+	* src/getargs.c (-M, --file-prefix-map): New option.
+	* src/output.c (prepare): Define b4_mapped_dir_prefix and
+	b4_spec_header_file.
+	* src/scan-skel.l (@ofile@): Output the mapped file name.
+	* data/skeletons/glr.c, data/skeletons/glr.cc,
+	* data/skeletons/lalr1.cc, data/skeletons/location.cc,
+	* data/skeletons/yacc.c:
+	Adjust.
+	* doc/bison.texi: Document.
+	* tests/input.at, tests/output.at: Check.
+
+2020-05-24  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: fix expectations
+	Should have been part of 1ec93ca2a2b4718b5d94871475520a2688b4c5c8.
+
+	* tests/counterexample.at: here.
+
+2020-05-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: clean the display of conflicted symbols
+	Instead of `On Symbols: {b,c,}`, display `On Symbols: b, c`.
+
+	* src/counterexample.c (counterexample_report_reduce_reduce): We don't
+	need braces.
+	Use commas as a separator, not a terminator.
+	* tests/counterexample.at: Adjust.
+
+2020-05-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: show logs
+	* examples/c/bistromathic/bistromathic.test, examples/test: here.
+
+2020-05-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: fix printing of state number on streams
+	Avoid this kind of display:
+
+	    LAC: checking lookahead identifier: R4 R3 G^B S5
+
+	* data/skeletons/lalr1.cc: Convert state_t to int before printing it.
+
+2020-05-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: fix printing of state number on streams
+	Avoid this kind of display:
+
+	    LAC: checking lookahead identifier: R4 R3 G^B S5
+
+	* data/skeletons/lalr1.cc: Convert state_t to int before printing it.
+
+2020-05-23  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: fix pruning crash
+	Fixes a crash on Cim's grammar.
+	https://lists.gnu.org/r/bison-patches/2020-05/msg00107.html
+
+	* src/state-item.c (prune_disabled_paths): Prune forward and backwards
+	paths in seperate passes.
+	(prune_forward, prune_backward): New.
+	(disable_state_item): Change function argument from state_item_number
+	to state_item.
+	(state_items_report): Add disabling to graph print-out.
+	* src/conflicts.c (find_state_item_number,
+	report_state_counterexamples): Add SI_DISABLED checks.
+
+2020-05-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-05-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	kinds: use the symbol kinds where applicable
+	Instead of generating switch statements with numbers, let's use the
+	symbol kinds.  Not only is this more readable, it also makes reading
+	diff easier, as a change in symbol numbers won't have such a large
+	effect on the implementation of symbol actions.
+
+	* data/skeletons/bison.m4 (_b4_symbol_case): Use the symbol kind
+	rather than its number.
+
+2020-05-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	kinds: also define the possibly qualified symbol kinds
+	* data/skeletons/bison.m4 (b4_symbol_kind): Rename as...
+	(b4_symbol_kind_base): this.
+	(b4_symbol_kind): New, for fully qualified kind name.
+	* data/skeletons/lalr1.cc (b4_symbol_kind): New.
+	Adjust to use b4_symbol_kind where appropriate.
+	* src/parse-gram.h, src/parse-gram.c: regen.
+
+2020-05-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	m4: simplify useless quotation
+	* data/skeletons/bison.m4: The result of b4_symbol is "quoted"
+	already, no need for m4_expand.
+
+2020-05-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	m4: use m4_shift2 etc.
+	* data/skeletons/bison.m4 (m4_shift4): New.
+	Use them where applicable.
+
+2020-05-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: show logs
+	* examples/c/bistromathic/bistromathic.test, examples/test: here.
+
+2020-05-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: spell fixes
+	* Makefile.am (codespell): New.
+	* doc/bison.texi: Fixes.
+	Use @option for options.
+	* src/lssi.c, src/lssi.h, src/parse-simulation.h, src/state-item.c:
+	Fix spellos.
+
+2020-05-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: rename user_token_number as code
+	This should have been done in 3.6, but I wanted to avoid introducing
+	conflicts into Vincent's work on counterexamples.  It turns out it's
+	completely orthogonal.
+
+	* data/README.md, data/skeletons/bison.m4, data/skeletons/c++.m4,
+	* data/skeletons/c.m4, data/skeletons/glr.c, data/skeletons/java.m4,
+	* data/skeletons/lalr1.d, data/skeletons/lalr1.java,
+	* data/skeletons/variant.hh, data/skeletons/yacc.c, src/conflicts.c,
+	* src/derives.c, src/gram.c, src/gram.h, src/output.c,
+	* src/parse-gram.c, src/parse-gram.y, src/print-xml.c, src/print.c,
+	* src/reader.c, src/symtab.c, src/symtab.h, tests/input.at,
+	* tests/types.at:
+	s/user_token_number/code/g.
+	Plus minor changes.
+
+2020-05-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	Merge maint into master
+	* upstream/maint:
+	  fix generated comments
+	  traces: provide a means to get short m4 traces
+	  traces: show the full m4 invocation
+
+2020-05-22  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: replace state-item data structures
+	* src/state-item.h: Add trans, prods, and revs edges to state-item
+	struct.
+	(si_trans, si_revs, si_prods_lookup): Remove.
+	* src/state-item.c, src/lssi.c, src/parse-simulation.c,
+	* src/counterexample.c: Update state-item API usage accordingly.
+
+2020-05-22  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: fix bad reference counting
+	* src/counterexample.c (si_bfs_free): Fix reference_count
+	decrementing.
+
+2020-05-22  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: fix miscellaneous leaks
+	* src/counterexample.c (unifying_counterexample): Always free
+	stage3result when it exists.
+	* src/conflicts.c (report_state_counterexamples): free leaked bitset.
+	* src/state-item.c (prune_disabled_paths): free leaked queue.
+
+2020-05-22  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: fix counterexample leak
+	* src/counterexample.c (free_counterexample): New.
+	Free counterexamples after printing.
+
+2020-05-22  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: fix lssi leaks
+	* src/lssi.c (shortest_path_from_start): Free the root of
+	shortest_path_from_start search.
+	Free eligible bitset.
+
+2020-05-22  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: fix parse state leaks
+	* src/parse_simulation.c: Fix bug in parse_state_free.
+	Free new_root when simulate_reduction generates zero states.
+
+	* src/parse-simulation.c, src/parse-simulation.h
+	(parse_state_list, parse_state_list_append): New.
+	* src/parse-simulation.c, src/parse-simulation.h,
+	* src/counterexample.c: Replace all uses of lists of parse states and
+	appends to parse_state_lists with the new API.
+
+2020-05-22  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: derivation reference counting
+	* src/derivation.h, src/derivation.c: Make derivation struct opaque.
+	Add derivation_list type for clarity.
+	(derivation_list_new): New.
+	(derivation_list_append): New.
+	(derivation_list_prepend): New.
+	(derivation_new_leaf): New constructor for derivations with no
+	children.
+	* src/counterexample.c, src/parse-simulation.c,
+	* src/parse-simulation.h: Replace uses of gl_list_t containing
+	derivations with derivation_list and its API.
+	Replace calls of dervation_new using null children with
+	derivation_new_leaf.
+	* src/parse-simulation.c: replace ps_chunk and its API with typed
+	versions si_chunk and deriv_chunk.
+	* src/parse-simlation.h, src/parse-simulation.c: Remove
+	parse_state_retain_deriv in favor of derivation reference counting.
+	* src/counterexample.c: Remove search_state_retain_deriv.
+
+2020-05-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: style changes in parse-simulation
+	* src/parse-simulation.c: Formatting changes.
+	(parse_state_list_new): New.
+	Use it.
+
+2020-05-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: style: prefer res for returned value
+	* src/lssi.c, src/parse-simulation.c: here.
+
+2020-05-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: fix memory leaks when there are conflicts
+	* src/counterexample.c (production_step, reduction_step): Release
+	memory of temporary objects.
+
+2020-05-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: be sure to always reclaim memory put in hashes
+	One call to hash_initialize did not provide a function to free memory.
+
+	* src/state-item.c (hash_pair_table_create): New.
+	Use it.
+
+2020-05-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: properly reclaim hash's allocated memory
+	* src/state-item.c: Use hash_free where appropriate.
+
+2020-05-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: avoid gratuitous heap allocations
+	There's no need to go for the heap when using gnulib's hash module.
+
+	* src/state-item.c (hash_pair_lookup, hash_pair_remove,
+	state_sym_lookup): Use the heap Luke.
+	That removes a leak from hash_pair_lookup.
+	(init_prods): Use hash_pair_insert instead of duplicating it.
+
+2020-05-22  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: fix leaks
+	* src/state-item.c: Various functions were using heap allocated locals
+	and not freeing them.
+
+2020-05-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: use hash_xinsert
+	* gnulib: Update to get hash_xinsert.
+	Use it where appropriate.
+
+2020-05-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: style changes in state-item
+	* src/state-item.h, src/state-item.c (state_item): Make the state
+	const.
+	(state_item_set): Make it clearer that it works in the state_items
+	global array.
+
+2020-05-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: stylistic changes
+	* src/counterexample.c: Use 'res' as a variable name for returned
+	value, as elsewhere.
+	Avoid uninitialized variables, especially pointers.
+	Avoid assignment where possible.
+
+2020-05-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: avoid uninitialized variables
+	* src/counterexample.c (item_rule_bounds): Split into...
+	(item_rule_start, item_rule_end): these.
+	Adjust dependencies.
+	* src/conflicts.c (find_state_item_number): New.
+	Use it to avoid uninitialized variables.
+
+2020-05-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: isolate missing API from gl_list
+	* src/counterexample.c (list_get_end): New.
+	Use it.
+	Reduce scopes.
+
+2020-05-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: tests: be robust to variations in time limit reports
+	The CI has "failures" such as (253, "Null nonterminals"):
+
+	    @@ -21,7 +21,7 @@
+	     3:    3 b: . %empty
+	     3:    4 c: . %empty
+	     On Symbols: {A,}
+	    -time limit exceeded: 6.000000
+	    +time limit exceeded: 11.000000
+	     First  Example c  •  c  A  A  $end
+	     First  derivation  $accept ::=[ a ::=[ c  d ::=[ a ::=[ b ::=[ • ]  d ::=[ c  A  A ] ] ] ]  $end ]
+	     Second Example c  •  A  $end
+
+	* tests/counterexample.at (AT_BISON_CHECK_CEX): New.
+	Use it to neutralize differences in timeout values.
+
+2020-05-22  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: fix stack overflow
+	* src/parse-simulation.c: Replace reference counting with
+	parse_state_retain everywhere.
+	(free_parse_state): Make this function iterative instead of
+	recursive. Long parse_state chains were causing stack exhaustion.
+
+	* tests/counterexample.at: Fix expectations.
+
+2020-05-22  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: fix crash from zombie result
+	Fixes the SEGV in test 247 (counterexample.at:195): "S/R after first
+	token".
+
+	* src/counterexample.c: here.
+	* tests/counterexample.at: Fix expectations.
+
+2020-05-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: fixes, and enable tests
+	* src/counterexample.c, src/derivation.c:
+	Do not output diagnostics on stdout, that's the job of stderr, and the
+	testsuite heavily depend on this.
+	Do not leave trailing spaces in the output.
+	* tests/counterexample.at: Use AT_KEYWORDS.
+	Specify the expected outputs.
+	* tests/local.mk: Add counterexample.at.
+
+2020-05-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: fix a crash
+	* src/state-item.c (init_state_items): If the rule has no reductions
+	at all, don't read at all in its list of reduced rules.
+
+2020-05-22  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: add tests
+	* tests/counterexample.at: New.
+
+2020-05-22  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: bind counterexample generation
+	* src/complain.h, src/complain.c: Add support for -Wcounterexample.
+	* src/conflicts.c (report_counterexamples): New.
+	(rule_conflicts_print): Use it when -Wcounterexample is given.
+	* src/getargs.h, src/getargs.c: Add support for --trace=cex.
+	* src/main.c (main): Init and deinit counterexample generation.
+
+2020-05-22  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: introduce counterexample search
+	* src/counterexample.h, src/counterexample.c: New.
+
+2020-05-22  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: introduce the parse simulator
+	* src/derivation.h, src/derivation.c,
+	* src/parse-simulation.h, src/parse-simulation.c: New.
+
+2020-05-22  Vincent Imbimbo  <vmi6@cornell.edu>
+
+	cex: add support for state-item pair graph generation
+	* src/lssi.h, src/lssi.c, src/state-item.h, src/state-item.c: New.
+
+2020-05-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	cex: add gnulib dependencies
+	* bootstrap.conf (gnulib_modules): Add linked-list.
+
+2020-05-21  Akim Demaille  <akim.demaille@gmail.com>
+
+	fix generated comments
+	In Bison 3.6.2, the comments with brackets lose their brackets, for
+	improper m4 quotation.
+
+	* data/skeletons/bison.m4 (b4_gsub): New.
+	* data/skeletons/c-like.m4 (_b4_comment): Use it.
+	* tests/m4.at: Check b4_gsub.
+
+2020-05-21  Akim Demaille  <akim.demaille@gmail.com>
+
+	traces: provide a means to get short m4 traces
+	Let --trace=m4-early dump all the logs from the start (as --trace=m4
+	used to do), and have --trace=m4 now start traces only when actually
+	working of the user's grammar.
+
+	Can make a big difference in the case of small inputs.  E.g.
+
+	    $ bison -S tests/testsuite.dir/001/input.m4 tests/testsuite.dir/001/input.y --trace=m4 |& wc
+	       3952   19446  251068
+	    $ bison -S tests/testsuite.dir/001/input.m4 tests/testsuite.dir/001/input.y --trace=m4-early |& wc
+	      19491  131904 1830495
+
+	* data/skeletons/traceon.m4: New.
+	* src/getargs.h, src/getargs.c: Introduce --trace=m4-early.
+	* src/output.c (output_skeleton): Adjust for --trace=m4 and --trace=m4-early.
+
+2020-05-21  Akim Demaille  <akim.demaille@gmail.com>
+
+	traces: show the full m4 invocation
+	Unfortunately the effect of -dV is still position independent.
+
+	* src/output.c (output_skeleton): here.
+
+2020-05-20  Thomas Petazzoni  <thomas.petazzoni@bootlin.com>
+
+	src: make path to m4 relocatable
+	Commit a4ede8f85b0c9a254fcb01e5888cee1983095669 ("package: make bison
+	a relocatable package") made Bison relocatable, but in fact it still
+	contains one absolute reference: the M4 variable, which points to the
+	M4 program. Let's fix that by using relocate(), see if an M4 binary is
+	available at the relocated location, and otherwise fallback to the
+	original M4 location.
+
+	See https://lists.gnu.org/r/bison-patches/2020-05/msg00078.html,
+	and https://lists.gnu.org/r/bison-patches/2020-05/msg00087.html.
+
+	* src/files.h, src/files.c (m4path): New.
+	* src/output.c: Use it.
+
+2020-05-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	CI: fix PPC recipe
+
+2020-05-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	Merge branch 'maint'
+	* upstream/maint:
+	  maint: post-release administrivia
+	  version 3.6.2
+	  tests: improve update-test
+	  CI: add GCC 10 and Clang 10
+	  fix: do not emit nested comments
+	  todo: update
+	  examples: use markdown hyperlinks
+	  tests: don't use == to compare const char *...
+	  gnulib: update
+
+2020-05-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: more fixes for _Noreturn
+	The previous fix was insufficient.
+
+	    tests/types.at:366: $CXX $CXXFLAGS $CPPFLAGS  $LDFLAGS -o test test.cc $LIBS
+	    ++ ccache clang++-mp-9.0 -Qunused-arguments -ggdb -Wall -Wextra -Wcast-align -Wchar-subscripts -fparse-all-comments -Wdocumentation -Wformat -Wimplicit-fallthrough -Wnull-dereference -Wno-sign-compare -Wno-tautological-constant-out-of-range-compare -Wpointer-arith -Wshadow -Wwrite-strings -Wextra-semi -Wold-style-cast -Wundefined-func-template -Wweak-vtables -Wunreachable-code -Wundef -pedantic -Wconversion -Wdeprecated -Wsign-compare -Wsign-conversion -Wtautological-constant-out-of-range-compare -fno-color-diagnostics -Wno-keyword-macro -Werror -std=c++98 -I/Users/akim/src/gnu/bison/tests -isystem /opt/gostai/include -isystem /opt/local/include -L/opt/gostai/lib -L/opt/local/lib -o test test.cc /Users/akim/src/gnu/bison/_build/c9d/lib/libbison.a -lintl -Wl,-framework -Wl,CoreFoundation
+	    stderr:
+	    test.cc:955:1: error: _Noreturn functions are a C11-specific feature [-Werror,-Wc11-extensions]
+	    _Noreturn static void
+	    ^
+	    test.cc:963:1: error: _Noreturn functions are a C11-specific feature [-Werror,-Wc11-extensions]
+	    _Noreturn static void
+	    ^
+	    2 errors generated.
+
+	* data/skeletons/c.m4 (b4_attribute_define): Do not use _Noreturn at
+	all in C++, clang or not.
+
+2020-05-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-05-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.6.2
+	* NEWS: Record release date.
+
+2020-05-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: improve update-test
+	* build-aux/update-test: When given a directory, use the testsuite.log
+	which it contains.
+	Do not accept empty "from"s, as substituting the empty string with
+	something is rarely a good idea.
+
+2020-05-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	CI: add GCC 10 and Clang 10
+	* .travis.yml: Here.
+	* tests/input.at, tests/regression.at: Beware of clang's -Wdocumentation.
+
+2020-05-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	fix: do not emit nested comments
+	With input such as
+
+	    %token<fl> yVL_CLOCK "/*verilator sc_clock*/"
+
+	we generate
+
+	    yVL_CLOCK = 610,      /* "/*verilator sc_clock*/"  */
+
+	which is invalid since the comment will actually be closed on the
+	first "*/".  Let's turn "*/" into "*\/" to avoid this.  But GCC will
+	also warn about "/*" inside a comment, so let's "escape" it too.
+
+	Reported by Huang Rui.
+	https://github.com/akimd/bison/issues/38
+
+	* data/skeletons/c-like.m4 (_b4_comment): Escape comment delimiters in
+	comments.
+	* tests/input.at (Torturing the Scanner): Check thes cases.
+	* tests/m4.at: New.
+
+2020-05-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: restore definition of _Noreturn as [[noreturn]] in C++
+	c.m4 contains a definition of _Noreturn which is modeled after
+	gnulib's lib/_Noreturn.h.  The latter was recently
+	changed (b61bf2f0e8bdc1e522ae8e97d57d5625163b42ea) to not using
+	[[noreturn]] at all, because the uses of _Noreturn in gnulib are
+	sometimes incompatible with the rules of [[noreturn]].
+
+	As a result glr.cc started to use _Noreturn in C++, which clang
+	refuses (all the glr.cc tests currently fail with Clang++).
+
+	* data/skeletons/c.m4 (b4_attribute_define): Restore the definition of
+	_Noreturn as [[noreturn]] in modern C++.
+	The generated code uses _Noreturn in places where [[noreturn]] is
+	valid.
+
+2020-05-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: don't promote unchecked function calls
+	* etc/bench.pl.in, examples/c/bistromathic/parse.y,
+	* examples/c/calc/calc.y, examples/c/pushcalc/calc.y: Check scanf's
+	return value.
+	* doc/bison.texi: Likewise, but only for the second example, to avoid
+	cluttering the very simple case.
+
+2020-05-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-05-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: update
+
+2020-05-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: use markdown hyperlinks
+	* examples/c++/README.md, examples/c++/calc++/README.md,
+	* examples/c/README.md: here.
+
+2020-05-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: don't use == to compare const char *...
+	Reported by Dagobert Michelsen.
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00091.html
+
+	* tests/c++.at: here.
+
+2020-05-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-05-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: improve update-test
+	* build-aux/update-test: When given a directory, use the testsuite.log
+	which it contains.
+	Do not accept empty "from"s, as substituting the empty string with
+	something is rarely a good idea.
+
+2020-05-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	Merge branch maint
+	* maint:
+	  news: update
+	  maint: post-release administrivia
+	  version 3.6.1
+	  c++: style: reorder generated code
+	  c++: provide yy::parser::symbol_type::name
+	  c++: make parser::symbol_name public
+	  examples: beware of ~/.inputrc
+	  build: also provide lzip compressed tarballs
+	  style: minor fixes
+	  yacc.c: restore ansi-c compatibility
+
+2020-05-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: update
+
+2020-05-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-05-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.6.1
+	* NEWS: Record release date.
+
+2020-05-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: add support to randomize the order of execution
+	It's amazing how much the order matters.  To a point that many of
+	these benches are meaningless.  For instance (some of the benches
+	where run with `make -C benches/latest rand
+	BENCHFLAGS=--benchmark_min_time=3`):
+
+	    compiler: g++ -std=c++11 -O2
+	      0. %define nofinal
+	      1.
+	    --------------------------------------------------
+	    Benchmark           Time           CPU Iterations
+	    --------------------------------------------------
+	    BM_y0            1543 ns       1541 ns     441660
+	    BM_y1            1521 ns       1520 ns     456535
+	    --------------------------------------------------
+	    BM_y0            1531 ns       1530 ns     440584
+	    BM_y1            1512 ns       1511 ns     457591
+	    --------------------------------------------------
+	    BM_y0            1539 ns       1538 ns    2749330
+	    BM_y1            1516 ns       1515 ns    2771500
+	    --------------------------------------------------
+	    BM_y0            1571 ns       1570 ns    2600782
+	    BM_y1            1542 ns       1541 ns    2708349
+	    --------------------------------------------------
+	    BM_y0            1530 ns       1529 ns    2670363
+	    BM_y1            1519 ns       1518 ns    2764096
+
+	    --------------------------------------------------
+	    Benchmark           Time           CPU Iterations
+	    --------------------------------------------------
+	    BM_y1            1529 ns       1528 ns     451937
+	    BM_y0            1508 ns       1507 ns     453944
+	    --------------------------------------------------
+	    BM_y1            1525 ns       1524 ns    2750684
+	    BM_y0            1516 ns       1515 ns    2794034
+	    --------------------------------------------------
+	    BM_y1            1526 ns       1525 ns    2749620
+	    BM_y0            1515 ns       1514 ns    2808112
+	    --------------------------------------------------
+	    BM_y1            1524 ns       1523 ns    4475844
+	    BM_y0            1502 ns       1501 ns    4611665
+
+	* etc/bench.pl.in: here.
+
+2020-05-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: use a Makefile
+	This makes it much easier to toy with the benchs.
+
+	* etc/bench.pl.in: Generate a Makefile instead of directly compiling
+	the files.
+
+2020-05-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: use markdown hyperlinks
+	* examples/c++/README.md, examples/c++/calc++/README.md,
+	* examples/c/README.md: here.
+
+2020-05-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	don't use stdnoreturn
+	Reported by Paul Eggert.
+
+	* src/getargs.c: We don't need it anyway, since we use _Noreturn.
+	* data/skeletons/c.m4: While at it, update the definition of _Noreturn
+	stolen from gnulib.
+
+2020-05-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: style: reorder generated code
+	The implementation of yy::parser::symbol_name is emitted even before
+	the implementation of yy::parser::parser.  This makes little sense.
+
+	* data/skeletons/lalr1.cc (symbol_name): Move its implementation in
+	the same place as in the class definition: after "error" and before
+	"context".
+
+2020-05-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: provide yy::parser::symbol_type::name
+	* data/skeletons/c++.m4 (yy::parser::basic_symbol::name): New.
+	* data/skeletons/lalr1.cc (yy_print_): Use it.
+	* doc/bison.texi: Document.
+	* tests/c++.at: Check.
+
+2020-05-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: make parser::symbol_name public
+	Reported by Martin Blais <blais@furius.ca>.
+	https://lists.gnu.org/r/help-bison/2020-05/msg00005.html
+
+	* data/skeletons/lalr1.cc (symbol_name): Make it public.
+	Add a private hidden hook to enable testing of private parts.
+	* tests/local.at (AT_DATA_GRAMMAR_PROLOGUE): Help Emacs find the right
+	language mode.
+	* tests/c++.at (C++ Variant-based Symbols Unit Tests): Check that we
+	can read symbol_name.
+
+2020-05-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: beware of ~/.inputrc
+	* examples/c/bistromathic/bistromathic.test: here.
+
+2020-05-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: also provide lzip compressed tarballs
+	Suggested by Matias Fonzo <selk@dragora.org>.
+
+	* cfg.mk: Post announcements to bison-announce.
+	* configure.ac: Build lzip packages.
+	* .travis.yml: Build only xz, we don't care about the other formats
+	here.
+
+2020-05-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: minor fixes
+	* examples/c/README.md: here.
+
+2020-05-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: restore ansi-c compatibility
+	Reported by neok-m4700.
+	https://github.com/akimd/bison/issues/37
+
+	* data/skeletons/yacc.c: Don't use // comments.
+
+2020-05-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: use *.cc for C++
+	Using *.c is simpler, but triggers annoying warnings with Clang++.
+
+	* etc/bench.pl.in: Please the dictator.
+
+2020-05-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: minor fixes
+	* examples/c/README.md: here.
+
+2020-05-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-05-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update, and use the attribute module
+	* gnulib: Update.
+	* bootstrap.conf: Use attribute.
+	* src/system.h: Remove macros for attributes.
+	Adjust dependencies.
+	* src/scan-gram.l (DEPRECATED): Rename as...
+	(DEPRECATED_DIRECTIVE): this, to avoid the clash with the DEPRECATED macro.
+
+2020-05-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: also provide lzip compressed tarballs
+	Suggested by Matias Fonzo <selk@dragora.org>.
+
+	* cfg.mk: Post announcements to bison-announce.
+	* configure.ac: Build lzip packages.
+	* .travis.yml: Build only xz, we don't care about the other formats
+	here.
+
+2020-05-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-05-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.6
+	* NEWS: Record release date.
+
+2020-05-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: beware of portability issue on Windows
+	Reported by Jannick.
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00040.html
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00066.html
+
+	* examples/test (diff_opts): Use --strip-trailing-cr if supported, to
+	avoid \n vs. \r\n issues.
+	* examples/c/bistromathic/bistromathic.test: When on MSYS, don't try
+	to check autocompletion.
+
+2020-05-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-05-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: fix the generation of the man page
+	When there is no bison.1 at all, the procedure fails.
+
+	* doc/local.mk (bison.1): Be robust to cold starts.
+
+2020-05-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: prepare for 3.6
+
+2020-05-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: complete the table of symbols
+	* doc/bison.texi: Add YYEMPTY, YYEOF and YYUNDEF.
+
+2020-05-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: clarify the glossary item about kinds
+	* doc/bison.texi (Glossary): here.
+
+2020-05-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-05-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.5.94
+	* NEWS: Record release date.
+
+2020-05-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: document yypstate_expected_tokens
+	* doc/bison.texi (Push Parser Interface): Here.
+
+2020-05-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: restructure the push parser documentation
+	I don't think it's fair to have yypstate_new, yypstate_delete,
+	yypush_parse and yypull_parse to have their own section, on par with
+	yyparse and yylex.  Let them be in a single section about push
+	parsers.  And show new/delete first.
+
+	* doc/bison.texi (Push Parser Interface): New.
+	Fuse the aforementioned sections into it.
+
+2020-05-06  Akim Demaille  <akim@lrde.epita.fr>
+
+	all: fix the interface of yyexpected_tokens
+	The user gives yyexpected_tokens a limit: the max number of tokens she
+	wants to hear about.  That's because an error message that reports a
+	bazillion of possible tokens is useless.
+
+	In that case yyexpected_tokens returned 0, so the user would not know
+	if there are too many expected tokens or none (yes, that's possible).
+
+	There are several ways to tell the user in which situation she's in:
+
+	- return some E2MANY, a negative value.  Then it makes the pattern
+
+	    int argsize = yypcontext_expected_tokens (ctx, arg, ARGS_MAX);
+	    if (argsize < 0)
+	      return argsize;
+
+	  no longer valid, as for E2MANY (i) the user must generate the error
+	  message anyway, and (ii) she should not return E2MANY
+
+	- return ARGS_MAX + 1.  Then it makes it dangerous for the user, as
+	  she has to iterate update `min (ARGS_MAX, argsize)`.
+
+	Returning 0 is definitely simpler and safer for the user, as it tells
+	her "this is not an error, just generate your message without a list
+	of expecting tokens".  So let's still return 0, but set arg[0] to the
+	empty token when the list is really empty.
+
+	* data/skeletons/glr.c, data/skeletons/lalr1.cc, data/skeletons/lalr1.java
+	* data/skeletons/yacc.c (yyexpected_tokens): Put the empty symbol
+	first if there are no possible tokens at all.
+	* examples/c/bistromathic/parse.y: Demonstrate how to use that.
+
+2020-05-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: fix handling of syntax errors
+	The shell grammar does not allow empty statements in then/else part of
+	an if, but examples/test failed to catch the syntax errors from the
+	script it ran.  So exited with success anyway.
+
+	You would expect 'set -e' to suffice, but with bash 3.2 actually it
+	does not.  As a matter of fact, I could find a way to have this behave
+	properly:
+
+	    $ cat test.sh
+	    set -e
+	    cleanup ()
+	    {
+	      status=$?
+	      echo "cleanup: $status"
+	      exit $status
+	    }
+	    trap cleanup 0 1 2 13 15
+	    . $1
+	    s=$?
+	    echo "test.sh: $s"
+	    exit $s
+
+	    $ cat bistro.test
+	    if true; then
+	    fi
+
+	    $ /bin/sh ./test.sh ./bistro.test
+	    ./bistro.test: line 2: syntax error near unexpected token `fi'
+	    cleanup: 0
+	    $ echo $?
+	    0
+
+	Remove the set -e (or the trap), and tada, it works...  So we have to
+	deal with the error by hand.
+
+	* examples/test ($exit): Replace with...
+	($status): this.
+	Preserve the exit status of the test case.
+	* examples/c/bistromathic/bistromathic.test: Fix syntax error.
+
+2020-05-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: beware of timestamp issues on Haiku
+	On Haiku, help2man is fired on a freshly extracted tarball.
+	Reported by Bruno Haible.
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00055.html
+
+	* doc/local.mk (bison.1): Be robust to a missing help2man.
+
+2020-05-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: beware of wchar_t portability issues on AIX
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00050.html
+	Reported by Bruno Haible.
+
+	* tests/diagnostics.at: here.
+
+2020-05-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: beware of portability issues with PTRDIFF_MAX
+	For instance test 386, "glr.cc api.value.type={double}":
+
+	    types.at:366: $CXX $CXXFLAGS $CPPFLAGS  $LDFLAGS -o test test.cc $LIBS
+	    stderr:
+	    test.cc: In function 'ptrdiff_t yysplitStack(yyGLRStack*, ptrdiff_t)':
+	    test.cc:490:4: error: 'PTRDIFF_MAX' was not declared in this scope
+	       (PTRDIFF_MAX < SIZE_MAX ? PTRDIFF_MAX : YY_CAST (ptrdiff_t, SIZE_MAX))
+	        ^
+	    test.cc:1805:37: note: in expansion of macro 'YYSIZEMAX'
+	           ptrdiff_t half_max_capacity = YYSIZEMAX / 2 / state_size;
+	                                         ^~~~~~~~~
+	    test.cc:490:4: note: suggested alternative: '__PTRDIFF_MAX__'
+	       (PTRDIFF_MAX < SIZE_MAX ? PTRDIFF_MAX : YY_CAST (ptrdiff_t, SIZE_MAX))
+	        ^
+	    test.cc:1805:37: note: in expansion of macro 'YYSIZEMAX'
+	           ptrdiff_t half_max_capacity = YYSIZEMAX / 2 / state_size;
+	                                         ^~~~~~~~~
+
+	The failing tests are using glr.cc only, which I don't understand, the
+	problem is rather in glr.c, so I would expect glr.c tests to also fail.
+
+	Reported by Bruno Haible.
+	https://lists.gnu.org/archive/html/bug-bison/2020-05/msg00053.html
+
+	* data/skeletons/yacc.c: Move the block that defines
+	YYPTRDIFF_T/YYPTRDIFF_MAXIMUM, YYSIZE_T/YYSIZE_MAXIMUM, and
+	YYSIZEOF to...
+	* data/skeletons/c.m4 (b4_sizes_types_define): Here.
+	(b4_c99_int_type): Also take care of the #undefinition of short.
+	* data/skeletons/yacc.c, data/skeletons/glr.c: Use
+	b4_sizes_types_define.
+	* data/skeletons/glr.c: Adjust to use YYPTRDIFF_T/YYPTRDIFF_MAXIMUM,
+	YYSIZE_T/YYSIZE_MAXIMUM.
+
+2020-05-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: update
+
+2020-05-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: beware of strnlen portability issues
+	One function missing on Solaris 10 Sparc:
+
+	     CCLD     examples/c/bistromathic/bistromathic
+	    Undefined                       first referenced
+	    symbol                             in file
+	    strnlen                             examples/c/bistromathic/bistromathic-parse.o
+	    ld: fatal: symbol referencing errors. No output written to examples/c/bistromathic/bistromathic
+
+	Reported by Dagobert Michelsen.
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00048.html
+
+	* examples/c/bistromathic/parse.y (xstrndup): Don't use strnlen.
+	xstrndup is assembled from gnulib's xstrndup, strndup and strnlen...
+
+2020-05-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: beware of portability issues with sh's trap
+	On AIX 7.2, when invoking "exit 77", we actually exit with 127.  The
+	"cleanup" function, called via trap, received an incorrect exit
+	status, something described in Autoconf's doc.
+	Reported by Bruno Haible.
+	https://lists.gnu.org/archive/html/bug-bison/2020-05/msg00029.html
+	https://lists.gnu.org/archive/html/bug-bison/2020-05/msg00047.html
+
+	* examples/test (skip): New.
+	* examples/c/bistromathic/bistromathic.test,
+	* examples/c/reccalc/reccalc.test: Use it, to ensure $? is set to 77
+	when the trap is called.
+
+2020-05-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: beware of portability issues with diff -u
+	AIX 7.1 supports diff -u, but its output does not match the expected
+	one.
+	Reported by Bruno Haible.
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00049.html
+
+	* tests/atlocal.in (DIFF_U_WORKS): New.
+	* tests/local.at (AT_DIFF_U_CHECK): New.
+	* tests/existing.at (_AT_TEST_EXISTING_GRAMMAR): Use AT_DIFF_U_CHECK.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.5.93
+	* NEWS: Record release date.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: update for 3.5.93
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: really skip tricky multichar test on Cygwin
+	In Autotest, anything outside AT_SETUP/AT_CLEANUP is discarded.
+
+	* tests/diagnostics.at (AT_TEST): Accept a skip-if test.
+	Use it to skip on cygwin.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	bistromathic: beware of portability issues of readline on AIX
+	Readline may emit escape sequences before the prompt.
+	Reported by Bruno Haible.
+	https://lists.gnu.org/r/platform-testers/2020-05/msg00001.html.
+
+	* examples/c/bistromathic/bistromathic.test: Trust readline _only_ if
+	we get what we expect on some reference computation.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: beware of portability issues with cmp
+	As someone wrote nearly 20 years ago in Autoconf's documentation,
+	don't use cmp to compare text files, but diff.
+	https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=abad4f0576a7dc361e5385e19c7681449103cdb1
+	Reported by Jannick.
+
+	* examples/test: Use diff, not cmp.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: fix warnings (shown on IRIX)
+	Appearing on IRIX with gcc -mabi=n32.
+	Reported by Bruno Haible.
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00039.html
+
+	* examples/c++/variant-11.yy, examples/c/bistromathic/parse.y: Don't
+	give chars to isdigit, cast them to unsigned char before.
+	* src/complain.c: Use c_isdigit.
+	* src/fixits.c (fixits_run): Avoid casts.
+	* src/lalr.c (goto_print): Use %zu for a size_t.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: be compatible with the pre-3.6 way to get a symbol's kind
+	Reported by Pramod Kumbhar.
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00025.html
+
+	* data/skeletons/c++.m4: here.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	bistromathic: beware of portability issues with strndup
+	Reported by Dagobert Michelsen.
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00026.html
+
+	* examples/c/bistromathic/parse.y (xstrndup): New.
+	Use it.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	flex: fix incorrect use of Automake conditional
+	AM_CONDITIONAL does _not_ define a shell variable...
+	Reported privately by Denis Excoffier.
+
+	* configure.ac (LEX_CXX_WORKS): Fix its definition.
+
+2020-05-03  Bruno Haible  <bruno@clisp.org>
+
+	package: fix a link error on IRIX
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00035.html
+
+	* src/local.mk (src_bison_LDADD): Mention libbison.a before, not after, the
+	system libraries.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	bistromathic: beware of portability of readline
+	Don't try to build bistromathic if we don't have readline.
+	Reported by Bruno Haible.
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00028.html
+
+	* configure.ac (ENABLE_BISTROMATHIC): New.
+	* examples/c/bistromathic/local.mk: Use it.
+	* examples/c/bistromathic/bistromathic.test: Exit 77 for skip.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: beware of portability issues of sh
+	"foo || bar" does not invoke bar on AIX 7.2 when foo does not exist.
+	It just dies.
+	Reported by Bruno Haible.
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00029.html
+
+	* examples/c/reccalc/reccalc.test: Check for seq in a subshell.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.5.92
+	* NEWS: Record release date.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: update for 3.5.92
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: demonstrate push parsers
+	* data/skeletons/lalr1.java (Location): Make it a static class.
+	(Lexer.yylex, Lexer.getLVal, Lexer.getStartPos, Lexer.getEndPos):
+	These are not needed in push parsers.
+	* examples/java/calc/Calc.y: Demonstrate push parsers in the Java.
+	* doc/bison.texi: Push parsers have been supported for a long time,
+	remove incorrect statements stating the opposite.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: clarify what a location is
+	Reported by Arthur Schwarz <aschwarz1309@att.net>
+	https://lists.gnu.org/r/help-bison/2013-12/msg00009.html
+
+	* doc/bison.texi (Location Type): here.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: beware of mbswidth portability issues
+	Shy away from these issues on Cygwin.
+	Reported Denis Excoffier.
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00003.html
+
+	* tests/diagnostics.at (Tabulations and multibyte characters): Split
+	in two.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: beware of intl portability issues
+	Reported by Horst von Brand.
+	https://lists.gnu.org/r/bug-bison/2020-04/msg00033.html
+
+	* examples/c/bistromathic/Makefile: libintl might not be needed, but
+	libm probably is.
+	* examples/c/bistromathic/parse.y: Include locale.h.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: beware of portability issues with readline
+	On OpenBSD 6.5, the prompt is repeated, but not the actual command
+	line...  Don't try to cope with that.
+	Reported by Bruno Haible.
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00015.html
+
+	* examples/c/bistromathic/bistromathic.test: Skip when readline behave
+	this way.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: beware of the portability of flex --header-file
+	The option --header was introduced in version 2.5.6.
+	The option --header-file was introduced in version 2.6.4.
+	Reported by Bruno Haible.
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00013.html
+
+	So use --header, and do bother with versions that don't support it.
+
+	* m4/flex.m4: Check whether flex supports --header.
+	* configure.ac (FLEX_WORKS, FLEX_CXX_WORKS): Set to false if it doesn't.
+	* * examples/c/reccalc/local.mk, examples/c/reccalc/Makefile:
+	Use --header rather than --header-file.
+
+2020-05-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: provide backward compatibility on by_type
+	To write unit tests for their scanners, some users depended on
+	symbol_type::token():
+
+	    Lexer lex("12345");
+	    symbol_type t = lex.nextToken();
+	    assert(t.token() == token::INTLIT);
+	    assert(t.value.as<int>() == 12345);
+
+	But symbol_type::token() was removed in Bison 3.5 because it relied on
+	a conversion table.  So users had to find other patterns, such as
+
+	    assert(t.type_get() == by_type(token::INTLIT).type_get());
+
+	which relies on several private implementation details.
+
+	As part of transitioning from "token type" to "token kind", and making
+	this a public and documented interface, "by_type" was renamed
+	"by_kind" and "type_get()" was renamed as "kind()".  The latter had
+	backward compatibility mechanisms, not the former.
+
+	In Bison 3.6 none of this should be used, but rather
+
+	    assert(t.kind() == symbol_kind::S_INTLIT);
+
+	Reported by Pramod Kumbhar.
+	https://lists.gnu.org/r/bug-bison/2020-05/msg00012.html
+
+	* data/skeletons/c++.m4 (by_type): Make it an alias to by_kind.
+
+2020-05-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: improve formatting of the generated code
+	* data/skeletons/yacc.c (yy_reduce_print): here.
+
+2020-05-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: java supports push parsers since 3.0 (2013-07-25)
+	* doc/bison.texi: Clarify this.
+
+2020-05-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: fix coding style
+	I don't plan to fix everything in one go.  But this was in the way of
+	the next commit.
+
+	* data/skeletons/lalr1.java: Avoid space before parens.
+	* tests/java.at: Adjust.
+
+2020-05-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: comment changes
+	* tests/java.at: here.
+
+2020-05-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: more
+
+2020-05-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: more documentation about errs
+	Suggested by Angelo Borsotti.
+	https://lists.gnu.org/r/bug-bison/2014-02/msg00003.html
+
+	* src/state.h: here.
+
+2020-05-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: document the exit status
+	Suggested by Alexandre Duret-Lutz.
+	https://lists.gnu.org/r/bug-bison/2013-09/msg00015.html
+
+	* doc/bison.texi (Invocation): Here.
+
+2020-05-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: add missing i18n requests
+	* data/skeletons/lalr1.java (reportSyntaxError): Here.
+
+2020-05-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: style: fix coding style of yyerror/reportSyntaxError
+	* data/skeletons/lalr1.java: here.
+
+2020-05-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: avoid useless work
+	* data/skeletons/lalr1.java (yySymbolPrint): Avoid the computation of
+	the argument if useless.
+	While at it, fix Java coding style.
+
+2020-05-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: comment changes
+	* data/skeletons/lalr1.java, examples/java/calc/Calc.y: here.
+
+2020-05-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: make it more consistent
+	* NEWS: Use the same pattern for titles.
+
+2020-05-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: use modern idioms to make classes non-copyable
+	Reported by Don Macpherson.
+	https://lists.gnu.org/r/bug-bison/2019-05/msg00015.html
+	https://github.com/akimd/bison/issues/36
+
+	* data/skeletons/lalr1.cc, data/skeletons/stack.hh,
+	* data/skeletons/variant.hh: Delete the copy-ctor and the copy operator.
+
+2020-04-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: avoid the use of a temporary
+	* data/skeletons/yacc.c: Use YYLLOC_DEFAULT directly with the final
+	destination.
+
+2020-04-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-04-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.5.91
+	* NEWS: Record release date.
+
+2020-04-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: fix syntax-check issues
+	* cfg.mk: We do want to gettextize the examples.
+	* po/POTFILES.in: Adjust.
+
+2020-04-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-04-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: document YYEOF, YYUNDEF and YYerror
+	* doc/bison.texi (Special Tokens): New.
+	* examples/c/bistromathic/parse.y: Formatting changes.
+
+2020-04-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	package: fix distcheck
+	Bison emits strings to translate in the generated code, for builtin
+	tokens.  So they appear only in generated parsers, which are not
+	shipped, so they are not in the src tree, so we cannot use them in our
+	POTFILE.
+
+	Except src/parse-gram.c, which is in the source tree.  And even in the
+	git repo.  But to avoid useless diffs in the repo, we do not keep the
+	src/parse-gram.c _with_ the #lines.  This is done in a dist-hook which
+	regenerates src/parse-gram.c when we run "make dist".
+
+	Unfortunately, then, update-po traverses the whole tree and sees that
+	the location of the strings to translate in src/parse-gram.c have
+	changed, so the bison.pot is to be updated.  And that is not possible
+	in the "make dist" which is run within "make distcheck"
+	(not the one preparing the dist for distcheck, the one run by
+	distcheck to check that a distributed tarball can build a tarball)
+	because then the src tree is read-only.
+
+	So let's not put src/parse-gram.c in the POTFILE, and expose these
+	strings to gettextize by hand.
+
+	* src/i18n-strings.c: New.
+	* po/POTFILES.in: Add it, and remove src/parse-gram.c.
+
+2020-04-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: avoid gettextize warnings
+	* src/scan-gram.l, src/scan-skel.l: Help it see the start and end of
+	"character literals".
+
+2020-04-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: beware of portability of readline
+	* examples/test: here.
+
+2020-04-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: install backward compatibility for YYERRCODE
+	Some people have been using that symbol.  Some even have #defined it
+	themselves.
+	https://lists.gnu.org/r/bison-patches/2020-04/msg00138.html
+
+	Let's provide backward compatibility, having it point to YYUNDEF, so
+	that an error message is generated.
+
+	* data/skeletons/yacc.c (YYERRCODE): New, at the exact same location
+	it was defined before.
+
+2020-04-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: c++: s/type/kind/ where appropriate
+	These are internal details.  `type_get ()` is still there to ensure
+	backward compatibility, `kind ()` being the modern way.
+
+	* data/skeletons/c++.m4 (by_type, by_type::type): Rename as...
+	(by_kind, by_kind::kind_): this.
+	Adjust dependencies.
+
+2020-04-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: clean up the definition of token kinds
+	From
+
+	    public interface Lexer {
+	      /* Token kinds.  */
+	      /** Token number, to be returned by the scanner.  */
+	      static final int YYEOF = 0;
+	      /** Token number, to be returned by the scanner.  */
+	      static final int YYERRCODE = 256;
+	      /** Token number, to be returned by the scanner.  */
+	      static final int YYUNDEF = 257;
+	      /** Token number, to be returned by the scanner.  */
+	      static final int BANG = 258;
+	    ...
+	      /** Deprecated, use b4_symbol(0, id) instead.  */
+	      public static final int EOF = YYEOF;
+
+	to
+
+	    public interface Lexer {
+	      /* Token kinds.  */
+	      /** Token "end of file", to be returned by the scanner.  */
+	      static final int YYEOF = 0;
+	      /** Token error, to be returned by the scanner.  */
+	      static final int YYerror = 256;
+	      /** Token "invalid token", to be returned by the scanner.  */
+	      static final int YYUNDEF = 257;
+	      /** Token "!", to be returned by the scanner.  */
+	      static final int BANG = 258;
+	    ...
+	      /** Deprecated, use YYEOF instead.  */
+	      public static final int EOF = YYEOF;
+
+	* data/skeletons/java.m4 (b4_token_enum): Display the symbol's tag in
+	comment.
+	* data/skeletons/lalr1.java: Address overquotation issue.
+	* examples/java/calc/Calc.y, examples/java/simple/Calc.y: Use YYEOF,
+	not EOF.
+
+2020-04-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	error: rename the error token from YYERRCODE to YYerror
+	See https://lists.gnu.org/r/bison-patches/2020-04/msg00162.html.
+
+	* data/skeletons/bison.m4, data/skeletons/c.m4, data/skeletons/glr.cc,
+	* data/skeletons/lalr1.java, doc/bison.texi,
+	* examples/c/bistromathic/parse.y, src/scan-gram.l, src/symtab.c
+	(YYERRCODE): Rename as...
+	(YYerror): this.
+	Adjust dependencies.
+
+2020-04-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	dogfooding: use YYERRCODE in our scanner
+	* src/scan-gram.l: Use it.
+	* tests/input.at: Adjust.
+
+2020-04-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	scanner: avoid spurious errors about empty character literals
+	On an invalid character literal such as "'\777'" we used to produce
+	two errors:
+
+	    input.y:2.9-12: error: invalid number after \-escape: 777
+	    input.y:2.8-13: error: empty character literal
+
+	Get rid of the second one.
+
+	* src/scan-gram.l (STRING_GROW_ESCAPE): New.
+	* tests/input.at: Adjust.
+
+2020-04-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	scanner: bad character literals are errors
+	* src/scan-gram.l: These are errors, not warnings.
+	* tests/input.at: Adjust.
+
+2020-04-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-04-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: update
+
+2020-04-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	all: don't emit an error message when the scanner returns YYERRCODE
+	I'm quite pleased to see that the tricky case of glr.c was already
+	prepared by the changes to support syntax_error exceptions.  Better
+	yet, it is actually syntax_error that becomes a special case of the
+	general pattern: make yytoken be YYERRCODE.
+
+	* data/skeletons/glr.c (YYFAULTYTOK): Remove the now useless (Basil)
+	Faulty token.
+	Instead, use the error token.
+	* data/skeletons/lalr1.d, data/skeletons/lalr1.java: When computing
+	the action, first check the case of the error token.
+
+	* tests/calc.at: Check cases for the error token symbols before and
+	after it.
+
+2020-04-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: don't emit an error message when the scanner returns YYERRCODE
+	* data/skeletons/yacc.c (yyparse): When the scanner returns YYERRCODE,
+	go directly to error recovery (yyerrlab1).
+	However, don't keep the error token as lookahead, that token is too
+	special.
+	* data/skeletons/lalr1.cc: Likewise.
+
+	* examples/c/bistromathic/parse.y (yylex): Use that feature to report
+	nicely invalid characters.
+	* examples/c/bistromathic/bistromathic.test: Check that.
+	* examples/test: Neutralize gratuitous differences such as rule
+	position.
+
+	* tests/calc.at: Check that case in C only.
+	The other case seem to be working, but that's an illusion that the
+	next commit will address (in fact, they can enter endless loops, and
+	report the error several times anyway).
+
+2020-04-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: bistromathic: demonstrate error recovery
+	* examples/c/bistromathic/parse.y: here.
+	* examples/c/bistromathic/bistromathic.test: Check it.
+	Included a stupid case where the error is actually ignored.
+
+2020-04-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: bistromathic: when quitting, close the current line
+	When the user ctrl-d the line, we left the cursor not at col 0.
+	Let's fix that.
+	This revealed a few short-comings in the testing framework.
+
+	* examples/test (run): Also display the diffs.
+	And support -n.
+	* examples/c/bistromathic/bistromathic.test
+	* examples/c/bistromathic/parse.y
+
+2020-04-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: bistromathic: comment changes
+	* examples/c/bistromathic/parse.y: here.
+
+2020-04-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: hacking tricks
+	* README-hacking.md: Here.
+
+2020-04-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: make valid to print the empty symbol
+	* data/skeletons/lalr1.cc (yy_print_): here.
+
+2020-04-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: always define symbol_name
+	* data/skeletons/lalr1.cc (symbol_name): Always define it, even when
+	it's actually yytname which is used.
+
+2020-04-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: fix a few style issues
+	* data/skeletons/lalr1.cc (yystack_print_, yy_reduce_print_): Add
+	missing const.
+	(yystack_print_): Rename as...
+	(yy_stack_print_): this.
+	* data/skeletons/glr.cc (yy_symbol_value_print_, yy_symbol_print_):
+	Add missing const.
+
+2020-04-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	all: prefer YYERRCODE to YYERROR
+	We will not keep YYERRCODE anyway, it causes backward compatibility
+	issues.  So as a first step, let all the skeletons use that name,
+	until we have a better one.
+
+	* data/skeletons/bison.m4, data/skeletons/glr.c,
+	* data/skeletons/glr.cc, data/skeletons/lalr1.cc,
+	* data/skeletons/lalr1.d, data/skeletons/lalr1.java,
+	* data/skeletons/yacc.c, doc/bison.texi, tests/headers.at,
+	* tests/input.at:
+	here.
+
+2020-04-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: glr.c: clarify
+	* data/skeletons/glr.c: Make the code a bit clearer.
+
+2020-04-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: prefer b4_has_translations_if
+	* data/skeletons/glr.c, data/skeletons/yacc.c: here.
+
+2020-04-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: glr.c: fix indentation issue
+	* data/skeletons/glr.c (yyparse): here.
+
+2020-04-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: fix a few remaining 'type' instead of 'kind'
+	* data/skeletons/glr.c, data/skeletons/yacc.c (YY_SYMBOL_PRINT):
+	Here.
+
+2020-04-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	skeletons: make the warning about implementation details clearer
+	* data/skeletons/bison.m4 (b4_disclaimer): Here.
+	* data/skeletons/lalr1.d, data/skeletons/lalr1.java: Use it.
+
+2020-04-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: c: fix a few minor issues about indentation of cpp directives
+	* README-hacking.md: More about cpp.
+	* data/skeletons/c.m4, data/skeletons/yacc.c: Style changes.
+
+2020-04-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: store in benches/012 rather than in benches/12
+	* etc/bench.pl.in ($basedir): New.
+	Format $count with a least three digits.
+
+2020-04-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: minor improvements
+	* etc/bench.pl.in: Don't force parse.error=detailed
+	Use a simpler way to display the pseudo %bison directive.
+	(&bench_with_gbenchmark): Give details about the compiler.
+
+2020-04-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: clarify #endif
+	We could try to avoid the weird "#if 1", but then the indentation of
+	the inner #if would be wrong.  Let' keep it this way.
+
+	* data/skeletons/yacc.c: here.
+	Also, avoid sticking the comment to the directive.
+
+2020-04-25  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: minor fixes
+	* data/skeletons/bison.m4, doc/bison.texi: Spell check.
+	* examples/c/bistromathic/parse.y (N_): Remove, now useless.
+
+2020-04-24  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: bistromathic: shorten token description
+	* examples/c/bistromathic/parse.y: "number" is enough.
+	* doc/bison.texi: Likewise.
+
+2020-04-24  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: bistromathic: demonstrate internationalization
+	Currently it was only using stubs.  Let's actually translate the
+	strings using gettext.
+
+	* examples/c/bistromathic/local.mk: Define LOCALEDIR, BISON_LOCALEDIR
+	and link with libintl.
+	* examples/c/bistromathic/parse.y: Use them.
+	Remove useless includes.
+	Take ENABLE_NLS into account.
+	(error_format_string): New.
+	(yyreport_syntax_error): Rewrite to rely on a format string, which is
+	more appropriate for internationalization.
+	* examples/c/bistromathic/Makefile: We no longer use Flex.
+	We need readline and intl.
+
+	* doc/bison.texi: Point to bistromathic for a better option for
+	internationalization.
+	* po/POTFILES.in: Add bistromathic.
+
+2020-04-24  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: update for YYERRCODE
+
+2020-04-24  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-04-24  Akim Demaille  <akim.demaille@gmail.com>
+
+	diagnostics: fix a typo
+	* src/complain.c: here.
+
+2020-04-20  Akim Demaille  <akim.demaille@gmail.com>
+
+	c, c++: provide a default definition for N_
+	In C/C++, N_ is a no-op.  Define it if the user didn't.
+	Suggested by Frank Heckenbach.
+	https://lists.gnu.org/r/bug-bison/2020-04/msg00010.html
+
+	* src/output.c (prepare_symbol_names): Rename has_translations as
+	has_translations_flag.
+	* data/skeletons/bison.m4 (b4_has_translations_if): New.
+	* data/skeletons/java.m4 (b4_trans): Use it.
+
+	* data/skeletons/glr.c, data/skeletons/lalr1.cc, data/skeletons/yacc.c
+	(N_): Provide a default definition.
+
+2020-04-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	i18n: also look in src/parse-gram.c
+	Some strings appears in the generated file only, e.g., translation of
+	"end of file".  So don't forget to go and see there.
+
+2020-04-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: fix comments
+	* data/skeletons/glr.c, data/skeletons/lalr1.cc,
+	* data/skeletons/yacc.c: here.
+
+2020-04-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	tokens: clean up the translation of special symbols
+	* src/output.c (prepare_symbol_names): Don't play tricks with the
+	symbols, it's quite too late.
+	(has_translations): Move to...
+	* src/symtab.c: here.
+	(symbols_pack): Use it to enable translation for special symbols.
+
+2020-04-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: fix typo
+	Reported by Frank Heckenbach.
+
+2020-04-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: beware of portability issues with wc
+	On macOS, wc -l always prepends the result with a tab, even when fed
+	by stdin.  But anyway, we should have used `grep -c -v`, which appears
+	to be portable according to Autoconf's "Limitations of Usual Tools"
+	section.
+	Reported by Denis Excoffier.
+	https://lists.gnu.org/r/bug-bison/2020-04/msg00009.html
+
+	* tests/calc.at (_AT_CHECK_CALC): Use grep's -c instead.
+
+2020-04-18  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-04-18  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.5.90
+	* NEWS: Record release date.
+
+2020-04-18  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: beware of readline on macOS
+	macOS' version of readline does not repeat stdin on stdout in
+	non-interactive mode, contrary to the current version of GNU readline.
+
+	* examples/test: Add support for strip_prompt.
+	* examples/c/bistromathic/bistromathic.test (strip_prompt): Set it
+	when needed.
+	Early exit when needed.
+
+2020-04-18  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: give public access to the symbol kind
+	symbol_type::token () was removed: it returned the token kind of a
+	symbol.  To do that, one needs to convert from the symbol kind to the
+	token kind, which requires a table.
+
+	This broke some users' unit tests for scanners, see
+	https://lists.gnu.org/r/bug-bison/2020-01/msg00001.html
+	https://lists.gnu.org/r/bug-bison/2020-03/msg00020.html
+	https://lists.gnu.org/r/help-bison/2020-04/msg00005.html
+
+	Instead of making this possible again, let's check the symbol's kind
+	instead.  So give proper access to a symbol's kind.
+
+	That feature existed, undocumented, as 'type_get()'.  Let's rename
+	this as 'kind()'.
+
+	* data/skeletons/c++.m4, data/skeletons/glr.cc,
+	* data/skeletons/lalr1.cc (type_get): Rename as...
+	(kind): This.
+	(type_get): Install a backward compatibility alias.
+	* doc/bison.texi (Complete Symbols): Document symbol_type and
+	symbol_type::kind.
+
+2020-04-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: token_kind_type in C++
+	* data/skeletons/c++.m4: Define the old names in terms on the new
+	ones, instead of the converse.
+	* doc/bison.texi (C++ Parser Interface): Be more extensive about
+	token_kind_type.
+
+2020-04-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: updates for 3.6
+	* doc/bison.texi: More s/token type/token kind/.
+	* NEWS: Update.
+
+2020-04-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	skeletons: use symbol(-2, kind)
+	Not all the symbols have a fixed symbol code.  UNDEF's one is fixed:
+	-2.
+
+	* data/skeletons/glr.c, data/skeletons/lalr1.cc, data/skeletons/lalr1.d,
+	* data/skeletons/yacc.c: here.
+
+2020-04-16  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: comments changes about error handling
+	* data/skeletons/glr.c, data/skeletons/lalr1.cc, data/skeletons/lalr1.d,
+	* data/skeletons/lalr1.java, data/skeletons/yacc.c: here.
+	* data/skeletons/lalr1.cc: Reduce scope.
+
+2020-04-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: bistro: don't be lazy with switch
+	* examples/c/bistromathic/parse.y (yylex): Use the switch to
+	discriminate all the cases.
+
+2020-04-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: spell check
+	* doc/bison.texi, NEWS, README-hacking.md: here.
+	And elsewhere.
+
+2020-04-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-04-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: more about the coding style
+	* README-hacking.md: here.
+	(Troubleshooting): New.
+
+2020-04-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: promote YYEOF rather that Lexer.EOF
+	* doc/bison.texi: here.
+	* data/skeletons/lalr1.java: Use YYEOF.
+
+2020-04-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: fix names
+	* data/skeletons/lalr1.java (yySymbolPrint): There are no pointers
+	here, remove the `p` suffix.
+	Use the appropriate type for locations.
+
+2020-04-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: java: SymbolKind, etc.
+	Why didn't I think about this before???  symbolName should be a method
+	of SymbolKind.
+
+	* data/skeletons/lalr1.java (YYParser::yysymbolName): Move as...
+	* data/skeletons/java.m4 (SymbolKind::getName): this.
+	Make the table a static final table, not a local variable.
+	Adjust dependencies.
+	* doc/bison.texi (Java Parser Interface): Document i18n.
+	(Java Parser Context Interface): Document SymbolKind.
+	* examples/java/calc/Calc.y, tests/local.at: Adjust.
+
+2020-04-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: java: get closer to the Java style
+	* examples/java/calc/Calc.y, examples/java/simple/Calc.y: here.
+
+2020-04-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: c++: document parser::context
+	* doc/bison.texi (C++ Parser Context): New.
+
+	* data/skeletons/lalr1.cc (parser::yysymbol_name): Rename as...
+	(parser::symbol_name): this.
+	(A Complete C++ Example): Promote LAC, now that we have it.
+	Promote parse.error detailed over verbose.
+	* examples/c++/calc++/calc++.test, tests/local.at: Adjust.
+
+2020-04-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: promote YYEOF
+	* NEWS (Deep overhaul of the symbol and token kinds): New.
+	* doc/bison.texi: Promote YYEOF over "0" in scanners.
+	(Token Decl): No longer show YYEOF here, it now works by default.
+	(Token I18n): More details about YYEOF here.
+	(Calc++): Just use YYEOF.
+
+2020-04-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	d: put YYEMPTY in the TokenKind
+	* data/skeletons/d.m4, data/skeletons/lalr1.d (b4_token_enums): Rename
+	YYTokenType as TokenKind.
+	Define YYEMPTY.
+	* examples/d/calc.y, tests/calc.at, tests/scanner.at: Adjust.
+
+2020-04-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-04-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	c, c++: also define YYEMPTY in yytoken_kind_t
+	I have been hesitating a lot before doing it ---after all the user
+	must not use this kind, so what's the point of showing it in
+	yytoken_kind_t.  And eventually I chose to play it safe with the
+	typing system and make it possible to use yytoken_kind_t for all the
+	tokens, even the "empty token".
+
+	* data/skeletons/c.m4: Give an id and a tag to YYEMPTY.
+	(b4_token_enums): Define YYEMPTY.
+	* data/skeletons/c++.m4 (b4_token_enums): Define YYEMPTY.
+	* data/skeletons/glr.c, data/skeletons/glr.cc, data/skeletons/yacc.c:
+	(YYEMPTY): Remove.
+	Use b4_symbol(-2, id) instead.
+
+2020-04-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: use "code", not "number", for token (and symbol) kinds
+	"Number" is too much about arithmethics.  "Code" conveys better the
+	"enum" nature of token kinds.  And of symbol kinds.
+
+	* doc/bison.texi: Here.
+
+2020-04-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: promote yytoken_kind_t, not yytokentype
+	* data/skeletons/c.m4 (yytoken_kind_t): New.
+	* data/skeletons/c++.m4, data/skeletons/lalr1.cc (yysymbol_kind_type):
+	New.
+	* examples/c/lexcalc/parse.y, examples/c/reccalc/parse.y,
+	* tests/regression.at:
+	Use them.
+	* doc/bison.texi: Replace "enum yytokentype" by "yytoken_kind_t".
+	(api.token.raw): Explain that it forces "yytoken_kind_t" to coincide
+	with "yysymbol_kind_t".
+	(Calling Convention): Mention YYEOF.
+	(Table of Symbols): Add entries for "yytoken_kind_t" and
+	"yysymbol_kind_t".
+	(Glossary): Add entries for "Kind", "Token kind" and "Symbol kind".
+
+2020-04-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: document yypcontext_t, and api.symbol.prefix
+	* doc/bison.texi (%define Summary): Document api.symbol.prefix.
+	(Syntax Error Reporting Function): Document yypcontext_t,
+	yypcontext_location, yypcontext_token, yypcontext_expected_tokens, and
+	yysymbol_kind_t.
+
+2020-04-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: rename yyexpected_tokens as yypcontext_expected_tokens
+	The user should think of yypcontext fields as accessible only via
+	yypcontext_* functions.  So let's rename yyexpected_tokens to reflect
+	that.
+
+	Let's _not_ rename yyreport_syntax_error, as the user may define this
+	function, and is not allowed to access directly the fields of
+	yypcontext_t: she *must* use the "accessors".  This is comparable to
+	the case of C++/Java where the user defines
+	parser::report_syntax_error, not parser::context::report_syntax_error.
+
+	* data/skeletons/glr.c, data/skeletons/yacc.c (yyexpected_tokens):
+	Rename as...
+	(yypcontext_expected_tokens): this.
+	Adjust dependencies.
+
+2020-04-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	skeletons: clarify the tag of special tokens
+	From
+
+	    GRAM_EOF = 0,                  /* $end  */
+	    GRAM_ERRCODE = 1,              /* error  */
+	    GRAM_UNDEF = 2,                /* $undefined  */
+
+	to
+
+	    GRAM_EOF = 0,                  /* "end of file"  */
+	    GRAM_ERRCODE = 1,              /* error  */
+	    GRAM_UNDEF = 2,                /* "invalid token"  */
+
+	* src/output.c (symbol_tag): New.
+	Use it to pass the token names and the symbol tags to the skeletons.
+
+	* tests/input.at: Adjust.
+
+2020-04-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	skeletons: use "invalid token" instead of "$undefined"
+	* src/output.c (prepare_symbol_names): Also handle undeftoken.
+	* tests/actions.at, tests/calc.at, tests/regression.at: Adjust.
+
+2020-04-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	skeletons: make the eof token translatable if i18n is enabled
+	* src/output.c (has_translations): New.
+	(prepare_symbol_names): Translate endtoken if the user already
+	translated tokens.
+
+	* examples/c/bistromathic/parse.y, src/parse-gram.y: Simplify.
+
+2020-04-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	skeletons: use "end of file" instead of "$end"
+	The name "$end" is nice in the report, in particular it avoids that
+	pointed-rules (aka items) be too long.  It also helps keeping them
+	"standard".
+
+	But it is bad in error messages, we should report "end of file" (or
+	maybe "end of input", this is debatable).  So, unless the user already
+	defined the alias for the error token herself, make it "end of file".
+	It should even be translated if the user already translated some
+	tokens, so that there is now no strong reason to redefine the $end
+	token.
+
+	* src/output.c (prepare_symbol_names): Issue "end of file" instead of
+	"$end".
+
+	* data/skeletons/lalr1.java (yytnamerr_): Remove the renaming hack.
+
+	* build-aux/update-test: Accept files with names containing a "+",
+	such as c++.at.
+	* tests/actions.at, tests/c++.at, tests/conflicts.at,
+	* tests/glr-regression.at, tests/regression.at, tests/skeletons.at:
+	Adjust.
+
+2020-04-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	diagnostics: replace "user token number" by "token code"
+	Yet, don't change the structure identifier to avoid introducing
+	conflicts in Vincent Imbimbo's PR (which, amusingly enough, is about
+	conflicts).
+
+	* src/symtab.c: here.
+	* tests/diagnostics.at, tests/input.at: Adjust.
+
+2020-04-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: remove the yy prefix from some functions
+	yy::parser features a parse() function, not a yyparse() one.
+
+	* data/skeletons/lalr1.cc (yyreport_syntax_error)
+	(context::yyexpected_tokens): Rename as...
+	(report_syntax_error, context::expected_tokens): these.
+
+2020-04-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	tokens: properly define the YYEOF token kind
+	Currently EOF is handled in an adhoc way, with a #define YYEOF 0 in
+	the implementation file.  As a result, the user has to define her own
+	EOF token if she wants to use it, which is a pity.
+
+	Give the $end token a visible kind name, YYEOF.  Except that in C,
+	where enums are not scoped, we would have collisions between all the
+	definitions of YYEOFs in the header files, so in C, make it
+	<api.PREFIX>EOF.
+
+	* data/skeletons/c.m4 (YYEOF): Override its name to avoid collisions.
+	Unless the user already gave it a different name.
+	* data/skeletons/glr.c (YYEOF): Remove.
+	Use ]b4_symbol(0, [id])[ instead.
+	Add support for "pre_epilogue", for glr.cc.
+	* data/skeletons/glr.cc: Remove dead code (never emitted #undefs).
+	* data/skeletons/yacc.c
+	* src/parse-gram.c
+	* src/reader.c
+	* src/symtab.c
+	* tests/actions.at
+	* tests/input.at
+
+2020-04-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	tokens: define the "$undefined" token kind
+	* data/skeletons/bison.m4 (b4_symbol_token_kind): Give a definition to
+	$undefined.
+	(b4_token_visible_if): $undefined has an id.
+	* src/output.c (prepare_symbol_definitions): Stop lying: $undefined
+	_is_ a token.
+	* tests/input.at: Adjust.
+
+2020-04-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	tokens: properly define the "error" token kind
+	There are people out there that do use YYERRCODE (the token kind of
+	the error token).  See for instance
+	https://github.com/borbolla-automation/SPC_Machines/blob/3812012bb782bfdfe7b325950a35cd337925fcad/unixODBC-2.3.2/Drivers/nn/yylex.c.
+
+	Currently, YYERRCODE is defined by yacc.c in an adhoc way as a #define
+	in the *.c file only.  It belongs with the other token kinds.
+
+	YYERRCODE is not a nice name, it does not fit in our naming scheme.
+	YYERROR would be more logical, but it collides with the YYERROR macro.
+	Shall we keep the same name in all the skeletons?  Besides, to avoid
+	collisions in C, we need to apply the api prefix: YYERRCODE is
+	actually <PREFIX>ERRCODE.  This is not needed in the other languages.
+
+	* data/skeletons/bison.m4 (b4_symbol_token_kind): New.
+	Map the error token to "YYERRCODE".
+	* data/skeletons/yacc.c (YYERRCODE): Don't define it, it's handled by...
+	* src/output.c (prepare_symbol_definitions): this.
+	* tests/input.at (Redefining the error token): Check it.
+
+2020-04-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	tokens: style: minor fixes
+	* data/skeletons/bison.m4 (b4_symbol_kind): Dispatch on the UNDEF
+	token number rather than its name.
+	* data/skeletons/c++.m4, data/skeletons/c.m4, data/skeletons/java.m4:
+	Comment changes.
+
+2020-04-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.cc: remove dead code
+	* data/skeletons/glr.cc: here.
+
+2020-04-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: fix generated headers
+	A forthcoming commit (tokens: properly define the "error" token kind)
+	revealed a problem in the C++ generated headers: they are not
+	self-contained.  With this file:
+
+	    %language "c++"
+	    %define api.value.type variant
+
+	    %code {
+	      static int yylex (yy::parser::semantic_type *lvalp);
+	    }
+
+	    %token <int> X
+
+	    %%
+
+	    exp:
+	      X { printf ("x\n"); }
+	    ;
+
+	    %%
+
+	    void
+	    yy::parser::error (const std::string& m)
+	    {
+	      std::cerr << m << '\n';
+	    }
+
+	    static
+	    int yylex (yy::parser::semantic_type *lvalp)
+	    {
+	      static int const input[] = {yy::parser::token::X, 0};
+	      static int toknum = 0;
+	      return input[toknum++];
+	    }
+
+	    int
+	    main (int argc, char const* argv[])
+	    {
+	      yy::parser p;
+	      return p.parse ();
+	    }
+
+	the generated header fails to compile cleanly (foo.cc just #includes
+	the generated header):
+
+	    $ clang++-mp-9.0 -c -Wundefined-func-template foo.cc
+	    In file included from foo.cc:1:
+	    bar.tab.hh:550:12: warning: instantiation of function 'yy::parser::basic_symbol<yy::parser::by_type>::basic_symbol' required here, but no definition is available
+	          [-Wundefined-func-template]
+	        struct symbol_type : basic_symbol<by_type>
+	               ^
+	    bar.tab.hh:436:7: note: forward declaration of template entity is here
+	          basic_symbol (basic_symbol&& that);
+	          ^
+	    bar.tab.hh:550:12: note: add an explicit instantiation declaration to suppress this warning if 'yy::parser::basic_symbol<yy::parser::by_type>::basic_symbol' is explicitly instantiated
+	          in another translation unit
+	        struct symbol_type : basic_symbol<by_type>
+	               ^
+	    1 warning generated.
+
+	* data/skeletons/c++.m4 (b4_public_types_define): Move the
+	implementation of the basic_symbol move-ctor to...
+	(b4_public_types_define): here, its declaration.
+	* tests/headers.at (Sane headers): Use a declared token so that the
+	corresponding token constructor is declared.  Which triggers the
+	aforementioned issue.
+
+2020-04-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: rename YYNOMEM as YYENOMEM
+	This is clearer.
+
+	* data/skeletons/glr.c, data/skeletons/yacc.c (YYNOMEM): Rename as...
+	(YYENOMEM): here.
+
+2020-04-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: update
+
+2020-04-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: improvements on symbol kinds
+	Instead of
+
+	    /// (Internal) symbol kind.
+	    enum symbol_kind_type
+	    {
+	      YYNTOKENS = 5, ///< Number of tokens.
+	      YYSYMBOL_YYEMPTY = -2,
+	      YYSYMBOL_YYEOF = 0,                      // END_OF_FILE
+	      YYSYMBOL_YYERROR = 1,                    // error
+	      YYSYMBOL_YYUNDEF = 2,                    // $undefined
+	      YYSYMBOL_TEXT = 3,                       // TEXT
+	      YYSYMBOL_NUMBER = 4,                     // NUMBER
+	      YYSYMBOL_YYACCEPT = 5,                   // $accept
+	      YYSYMBOL_result = 6,                     // result
+	      YYSYMBOL_list = 7,                       // list
+	      YYSYMBOL_item = 8                        // item
+	    };
+
+	generate
+
+	    /// Symbol kinds.
+	    struct symbol_kind
+	    {
+	      enum symbol_kind_type
+	      {
+	        YYNTOKENS = 5, ///< Number of tokens.
+	        S_YYEMPTY = -2,
+	        S_YYEOF = 0,                             // END_OF_FILE
+	        S_YYERROR = 1,                           // error
+	        S_YYUNDEF = 2,                           // $undefined
+	        S_TEXT = 3,                              // TEXT
+	        S_NUMBER = 4,                            // NUMBER
+	        S_YYACCEPT = 5,                          // $accept
+	        S_result = 6,                            // result
+	        S_list = 7,                              // list
+	        S_item = 8                               // item
+	      };
+	    };
+
+	* data/skeletons/c++.m4 (api.symbol.prefix): Define to S_.
+	Adjust all the uses.
+	(b4_public_types_declare): Nest the enum inside 'struct symbol_kind'.
+	* data/skeletons/glr.cc, data/skeletons/lalr1.cc,
+	* tests/headers.at, tests/local.at: Adjust.
+
+2020-04-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	d: improvements on symbol kinds
+	    public enum SymbolKind
+	    {
+	      S_YYEMPTY = -2,    /* No symbol.  */
+	      S_YYEOF = 0,       /* $end  */
+	      S_YYERROR = 1,     /* error  */
+	      S_YYUNDEF = 2,     /* $undefined  */
+	      S_EQ = 3,          /* "="  */
+
+	* data/skeletons/d.m4 (api.symbol.prefix): Default to S_.
+	Output the symbol kind definitions with a comment.
+
+2020-04-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	symbols: minor fixes
+	* data/skeletons/bison.m4 (b4_symbol_kind): Series of _ are useless,
+	one is enough.
+	* data/skeletons/c.m4 (b4_token_enum): Fix overquoting.
+
+2020-04-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	skeletons: introduce api.symbol.prefix
+	* data/skeletons/bison.m4 (b4_symbol_prefix): New.
+	(b4_symbol_kind): Use it.
+	* data/skeletons/c++.m4, data/skeletons/c.m4, data/skeletons/d.m4
+	* data/skeletons/java.m4 (api.symbol.prefix): Provide a default value.
+
+	* data/skeletons/glr.c, data/skeletons/glr.cc, data/skeletons/lalr1.cc,
+	* data/skeletons/lalr1.d, data/skeletons/lalr1.java, data/skeletons/yacc.c:
+	Adjust: use b4_symbol_prefix instead of YYSYMBOL_.
+
+2020-04-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: also emit documenting comments for symbol kinds
+	* data/skeletons/java.m4 (b4_symbol_enum): here.
+	And stop defined YYSYMBOL_YYEMPTY, we no longer use it.
+
+2020-04-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: update
+	* TODO (YYERRCODE): Remove, handled by YYSYMBOL_ERROR.
+
+2020-04-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	skeletons: beware not to use yyarg when it's null
+	Reported by Adrian Vogelsgesang.
+
+	* data/skeletons/glr.c, data/skeletons/lalr1.cc,
+	* data/skeletons/lalr1.java, data/skeletons/yacc.c: Here.
+
+2020-04-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: document new features
+	* data/skeletons/lalr1.java: More comments.
+	(Context.EMPTY): Remove.
+	* doc/bison.texi (Java Parser Context Interface): New.
+
+2020-04-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: prefer null to YYSYMBOL_YYEMPTY
+	That's one nice benefit from using enums.
+
+	* data/skeletons/lalr1.java (YYSYMBOL_YYEMPTY): No longer define it.
+	Use 'null' instead.
+	* examples/java/calc/Calc.y, tests/local.at: Adjust.
+
+2020-04-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: rename Lexer.yyreportSyntaxError as reportSyntaxError
+	* data/skeletons/lalr1.java: here.
+	* examples/java/calc/Calc.y, tests/local.at: Adjust.
+
+2020-04-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: use getExpectedTokens, not yyexpectedTokens
+	* data/skeletons/lalr1.java, examples/java/calc/Calc.y, tests/local.at:
+	here.
+
+2020-04-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: style: fix coding style
+	* data/skeletons/java.m4: Indent by two.
+	* data/skeletons/lalr1.java (yynnts_): Remove.
+	(yyfinal_, yyntokens_, yylast_, yyempty_): Rename as...
+	(YYFINAL_, YYNTOKENS_, YYLAST_, YYEMPTY_): these, they are constants.
+
+2020-04-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: make the symbol kind definition nicer to read
+	From
+
+	    enum yysymbol_kind_t
+	    {
+	      YYSYMBOL_YYEMPTY = -2,
+	      YYSYMBOL_YYEOF = 0,
+	      YYSYMBOL_YYERROR = 1,
+	      YYSYMBOL_YYUNDEF = 2,
+
+	to
+
+	    enum yysymbol_kind_t
+	    {
+	      YYSYMBOL_YYEMPTY = -2,
+	      YYSYMBOL_YYEOF = 0,                      /* "end of file"  */
+	      YYSYMBOL_YYERROR = 1,                    /* error  */
+	      YYSYMBOL_YYUNDEF = 2,                    /* $undefined  */
+
+	* data/skeletons/bison.m4 (b4_last_symbol): New.
+	(b4_symbol_enum, b4_symbol_enums): Reformat the output.
+	* data/skeletons/c.m4
+
+2020-04-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: make the token kind definition nicer to read
+	From
+
+	    enum gram_tokentype
+	    {
+	      GRAM_EOF = 0,
+	      STRING = 3,
+	      TSTRING = 4,
+	      PERCENT_TOKEN = 5,
+
+	To
+
+	    enum gram_tokentype
+	    {
+	      GRAM_EOF = 0,                  /* "end of file"  */
+	      STRING = 3,                    /* "string"  */
+	      TSTRING = 4,                   /* "translatable string"  */
+	      PERCENT_TOKEN = 5,             /* "%token"  */
+
+	* data/skeletons/bison.m4 (b4_last_enum_token): New.
+	* data/skeletons/c.m4 (b4_token_enum, b4_token_enums): Show the
+	corresponding symbol.
+
+2020-04-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: make the generated YYSTYPE nicer to read
+	From
+
+	    union GRAM_STYPE
+	    {
+	      /* precedence_declarator  */
+	      assoc precedence_declarator;
+	      /* "string"  */
+	      char* STRING;
+	      /* "translatable string"  */
+	      char* TSTRING;
+	      /* "{...}"  */
+	      char* BRACED_CODE;
+	      /* "%?{...}"  */
+
+	to
+
+	    union GRAM_STYPE
+	    {
+	      assoc precedence_declarator;             /* precedence_declarator  */
+	      char* STRING;                            /* "string"  */
+	      char* TSTRING;                           /* "translatable string"  */
+	      char* BRACED_CODE;                       /* "{...}"  */
+
+	* data/skeletons/c.m4 (b4_symbol_type_register): Use m4_format to
+	align the comments.
+	* src/parse-gram.h: Regen.
+
+2020-04-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-04-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	bison: use consistently "token kind", not "token type"
+	* src/output.c, src/reader.c, src/scan-gram.l, src/tables.c: here.
+
+2020-04-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	skeletons: use consistently "kind" instead of "type" in the code
+	* data/skeletons/bison.m4, data/skeletons/c++.m4, data/skeletons/c.m4,
+	* data/skeletons/glr.cc, data/skeletons/lalr1.cc,
+	* data/skeletons/lalr1.d, data/skeletons/lalr1.java:
+	Refer to the "kind" of a symbol, not its "type", where appropriate.
+
+2020-04-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: refer to the token kind rather than the token type
+	* doc/bison.texi: Replace occurrences of "token type" with "token
+	kind".
+	Stop referring to the "macro definitions" of the token kinds, just
+	name them "definitions".
+
+2020-04-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	m4: we don't need undef_token_number
+	It's replaced by YYSYMBOL_YYUNDEF.
+
+2020-04-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	m4: rename b4_symbol_sid as b4_symbol_kind
+	* data/skeletons/bison.m4, data/skeletons/c++.m4, data/skeletons/c.m4,
+	* data/skeletons/d.m4, data/skeletons/java.m4
+	(b4_symbol_sid): Rename as...
+	(b4_symbol_kind): this.
+	Adjust dependencies.
+	* data/README.md: Document the kind.
+
+2020-04-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	d, java: rename SymbolType as SymbolKind
+	See https://lists.gnu.org/r/bison-patches/2020-04/msg00031.html.
+
+	* data/skeletons/d.m4, data/skeletons/lalr1.d,
+	* data/skeletons/java.m4, data/skeletons/lalr1.java
+	(SymbolType): Rename as...
+	(SymbolKind): this.
+	Adjust dependencies.
+
+2020-04-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	c, c++: rename yysymbol_type_t as yysymbol_kind_t
+	See https://lists.gnu.org/r/bison-patches/2020-04/msg00031.html
+
+	* data/skeletons/c.m4, data/skeletons/glr.c, data/skeletons/yacc.c
+	(yysymbol_type_t): Rename as...
+	(yysymbol_kind_t): this.
+	Adjust dependencies.
+	* data/skeletons/c++.m4, data/skeletons/glr.cc, data/skeletons/lalr1.cc
+	(symbol_type_type): Rename as...
+	(symbol_kind_type): this.
+	Adjust dependencies.
+
+2020-04-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: remove obsolete release instructions
+	* README-hacking.md: here.
+
+2020-04-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	Merge branch 'maint'
+	* maint:
+	  maint: post-release administrivia
+	  version 3.5.4
+	  examples: reccalc: really compile cleanly in C99
+	  news: announce that Bison 3.6 drops YYERROR_VERBOSE
+	  news: update for 3.5.4
+	  style: fix spellos
+	  typo: succesful -> successful
+	  package: improve the readme
+	  java: check and fix support for api.token.raw
+	  java: style: prefer 'int[] foo' to 'int foo[]'
+	  build: fix syntax-check issues
+	  tests: recheck: work properly when the test suite was interrupted
+	  doc: c++: promote api.token.raw
+	  build: fix compatibility with old compilers
+	  examples: reccalc: compile cleanly in C99
+
+2020-04-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-04-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.5.4
+	* NEWS: Record release date.
+
+2020-04-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: update the yyreport_syntax_error example
+	* examples/c/bistromathic/parse.y, tests/local.at
+	(yyreport_syntax_error): Fix use of YYSYMBOL_YYEMPTY.
+	* NEWS: Update.
+
+2020-04-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: update
+
+2020-04-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: rename yysyntax_error_arguments as yy_syntax_error_arguments
+	It's a private implementation detail.
+
+	* NEWS, data/skeletons/glr.c, data/skeletons/lalr1.cc,
+	* data/skeletons/yacc.c, doc/bison.texi: here.
+
+2020-04-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: reccalc: really compile cleanly in C99
+	The previous fix does not suffice, and actually managed to make things
+	worse by defining yyscan_t twice in parse.y...
+
+	Reported by kencu.
+	https://trac.macports.org/ticket/59927#comment:29
+
+	* examples/c/reccalc/parse.y (yyscan_t): Define it with the same
+	guards as used by Flex.
+
+2020-04-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: rename yyparse_context_t as yypcontext_t
+	The first name is too long.  We already have `yypstate`, so
+	`yypcontext` is ok.  We are also migrating to using `*_t` for our
+	types.
+
+	* NEWS, data/skeletons/glr.c, data/skeletons/yacc.c, doc/bison.texi,
+	* examples/c/bistromathic/parse.y, src/parse-gram.y, tests/local.at:
+	(yyparse_context_t, yyparse_context_location, yyparse_context_token):
+	Rename as...
+	(yypcontext_t, yypcontext_location, yypcontext_token): these.
+
+2020-04-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	readme: more about the coding style
+
+2020-04-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: fixes in SymbolType
+	Reported by Paolo Bonzini.
+	https://github.com/akimd/bison/pull/34#issuecomment-609029634
+
+	* data/skeletons/java.m4 (SymbolType): Use 'final' where possible.
+	(get): Rewrite on top of an array instead of a switch.
+
+2020-04-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: use SymbolType
+	The Java enums are very different from the C model.  As a consequence,
+	one cannot "build" an enum directly from an integer, we must retrieve
+	it.  That's the purpose of the SymbolType.get class method.
+
+	* data/skeletons/java.m4 (b4_symbol_enum, b4_case_code_symbol)
+	(b4_declare_symbol_enum): New.
+	* data/skeletons/lalr1.java: Use SymbolType,
+	SymbolType.YYSYMBOL_YYEMPTY, etc.
+	* examples/java/calc/Calc.y, tests/local.at: Adjust.
+
+2020-04-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: java: use explicit token identifiers
+	* examples/java/calc/Calc.y: Declare all the tokens, so that we are
+	compatibile with api.token.raw.
+	* examples/java/calc/Calc.test: Adjust.
+
+2020-04-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: announce that Bison 3.6 drops YYERROR_VERBOSE
+	* NEWS: here.
+
+2020-04-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: update for 3.5.4
+
+2020-04-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: fix spellos
+	* src/complain.c, src/print.c, src/print-xml.c, src/symtab.h: here.
+
+2020-04-04  Adrian Vogelsgesang  <avogelsgesang@tableau.com>
+
+	typo: succesful -> successful
+	* tests/calc.at: Here.
+
+2020-04-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	package: improve the readme
+	* README: Describe what Bison is.
+
+2020-04-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: check and fix support for api.token.raw
+	* tests/local.at (AT_LANG_MATCH, AT_YYERROR_DECLARE(java))
+	(AT_YYERROR_DECLARE_EXTERN(java), AT_PARSER_CLASS): New.
+	(AT_MAIN_DEFINE(java)): Use AT_PARSER_CLASS.
+	* tests/scanner.at: Add a test for Java.
+	* data/skeletons/lalr1.java (yytranslate_): Cast the result.
+
+2020-04-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	d: use the SymbolType enum for symbol kinds
+	* data/skeletons/d.m4 (b4_symbol_enum, b4_declare_symbol_enum): New.
+	* data/skeletons/lalr1.d: Use them.
+	Use SymbolType, SymbolType.YYSYMBOL_YYEMPTY etc. where appropriate.
+	(undef_token_, token_number_type, yy_error_token_): Remove.
+
+2020-04-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: style: prefer 'int[] foo' to 'int foo[]'
+	* data/skeletons/java.m4 (b4_typed_parser_table_define): Here.
+
+2020-04-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: fix syntax-check issues
+	* src/system.h, tests/local.mk: Fix indentation.
+
+2020-04-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: recheck: work properly when the test suite was interrupted
+	* tests/local.mk (recheck): Look at the per-test logs, not the overall
+	log, which, when interrupted, contains only information about... the
+	tests that passed.
+
+2020-04-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: c++: promote api.token.raw
+	* doc/bison.texi (Calc++ Parser): Here.
+
+2020-04-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: fix compatibility with old compilers
+	GCC 4.2 dies with
+
+	    src/InadequacyList.c: In function 'InadequacyList__new_conflict':
+	    src/InadequacyList.c:37: error: #pragma GCC diagnostic not allowed inside functions
+	    src/InadequacyList.c:37: error: #pragma GCC diagnostic not allowed inside functions
+	    src/InadequacyList.c:40: error: #pragma GCC diagnostic not allowed inside functions
+
+	Reported by Evan Lavelle.
+	See https://lists.gnu.org/r/bug-bison/2020-03/msg00021.html
+	and https://trac.macports.org/ticket/59927.
+
+	* src/system.h (GCC_VERSION): New.
+	Use it to control IGNORE_TYPE_LIMITS_BEGIN and
+	IGNORE_TYPE_LIMITS_END.
+
+2020-04-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: reccalc: compile cleanly in C99
+	See https://trac.macports.org/ticket/59927.
+
+	* examples/c/reccalc/parse.y: C99 does not allow multiple typedefs.
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: replace symbol_number_type with symbol_type_type
+	* data/skeletons/c++.m4, data/skeletons/glr.cc,
+	* data/skeletons/lalr1.cc: here.
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: also use symbol_type_type
+	Because of the insane current implementation of glr.cc, things are a
+	bit nasty.  We will rename symbol_number_type as symbol_type_type
+	later, to keep this commit small.
+
+	* data/skeletons/c++.m4 (b4_declare_symbol_enum): New.
+	Also define YYNTOKENS to avoid type clashes when yyntokens_ was
+	actually defined in another enum.
+	Use it.
+	(symbol_number_type): Be an alias of symbol_type_type.
+	Use YYSYMBOL_YYEMPTY and the like.
+	Use symbol_number_type where appropriate.
+	(empty_symbol): Remove.
+	(yytranslate_): Use symbol_number_type, not token_number_type.
+	* data/skeletons/lalr1.cc: Use symbol_number_type where appropriate.
+	Adjust to the replacement of empty_symbol by YYSYMBOL_YYEMPTY.
+	(yy_error_token_, yy_undef_token_, yyeof_, yyntokens_): Remove.
+	Adjust dependencies.
+
+	* data/skeletons/glr.cc: Use symbol_number_type where appropriate.
+	Forward definitions of YYSYMBOL_YYEMPTY, etc. to glr.c.
+
+	* tests/headers.at: Accept YYNTOKENS and other YYSYMBOL_*.
+	* tests/local.at (AT_YYERROR_DEFINE(c++)): Use symbol_number_type.
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: remove the yySymbol alias
+	* data/skeletons/glr.c: Use yysymbol_type_t only.
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c, yacc.c: propagate yysymbol_type_t
+	Now that yacc.c and glr.c both know yysymbol_type_t, convert the
+	common routines.
+
+	* data/skeletons/c.m4 (yydestruct, yy_symbol_value_print)
+	(yy_symbol_print): Use yysymbol_type_t instead of int.
+	* data/skeletons/glr.c: Use yySymbol where appropriate.
+	* data/skeletons/yacc.c (YY_ACCESSING_SYMBOL): New wrapper around
+	yystos.
+	Use it.
+	* tests/local.at (yyreport_syntax_error): Use yysymbol_type_t where
+	appropriate.
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: use yysymbol_type_t, YYSYMBOL_YYEOF etc.
+	Apply the same changes as in yacc.c.  Now yySymbol and yysymbol_type_t
+	are aliases.  We will remove the former later, to avoid cluttering
+	this commit.
+
+	* data/skeletons/glr.c: Use b4_declare_symbol_enum.
+	Use YYSYMBOL_YYEOF etc. where appropriate.
+	(YYUNDEFTOK, YYTERROR): Remove.
+	(YYTRANSLATE, yySymbol, yyexpected_tokens, yysyntax_error_arguments):
+	Adjust.
+	(yy_accessing_symbol): New.
+	Use it where appropriate.
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: fix more errors from make maintainer-check-g++
+	* data/skeletons/yacc.c (yyexpected_tokens): Use casts where needed.
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: revert to not using yysymbol_type_t in the yytranslate table
+	This triggers warnings with several compilers.  For instance ICC fills
+	the logs with pages and pages of
+
+	    input.c(477): error: a value of type "int" cannot be used to initialize an entity of type "const yysymbol_type_t={yysymbol_type_t}"
+	             0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+	             ^
+
+	    input.c(477): error: a value of type "int" cannot be used to initialize an entity of type "const yysymbol_type_t={yysymbol_type_t}"
+	             0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+	                    ^
+
+	And so does G++9 when compiling yacc.c's (C) output
+
+	    input.c:545:8: error: invalid conversion from 'int' to 'yysymbol_type_t' [-fpermissive]
+	      545 |        0,     5,     9,     2,     2,     2,     2,     2,     2,     2,
+	          |        ^
+	          |        |
+	          |        int
+	    input.c:545:15: error: invalid conversion from 'int' to 'yysymbol_type_t' [-fpermissive]
+	      545 |        0,     5,     9,     2,     2,     2,     2,     2,     2,     2,
+	          |               ^
+	          |               |
+	          |               int
+
+	Clang++ is no exception
+
+	    input.c:545:8: error: cannot initialize an array element of type 'const yysymbol_type_t' with an rvalue of type 'int'
+	           0,     5,     9,     2,     2,     2,     2,     2,     2,     2,
+	           ^
+	    input.c:545:15: error: cannot initialize an array element of type 'const yysymbol_type_t' with an rvalue of type 'int'
+	           0,     5,     9,     2,     2,     2,     2,     2,     2,     2,
+	                  ^
+
+	At some point we could use yysymbol_type_t's enumerators to define
+	yytranslate.  Meanwhile...
+
+	* data/skeletons/yacc.c (yytranslate): Use the original integral type
+	to define it.
+	(YYTRANSLATE): Cast the result into yysymbol_type_t.
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	yysymbol_type_t: always assign an enumerator
+	Currently we define enumerators only for symbols that have an
+	identifier.  That rules out tokens such as '+', and nonterminals such
+	as foo-bar and foo.bar.  As a consequence we are taking chances: the
+	compiler might compile yysymbol_type_t as too small an integral type
+	for some symbol codes.
+
+	* data/skeletons/bison.m4 (b4_symbol_sid): Forge a unique symbol
+	identifier for symbols that don't have an ID.
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	bistromathic: use symbol numbers instead of YYTRANSLATE
+	* examples/c/bistromathic/parse.y: here.
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: prefer YYSYMBOL_YYERROR to YYSYMBOL_error
+	* data/skeletons/bison.m4 (b4_symbol_sid): Map "error" to YYSYMBOL_YYERROR.
+	* data/skeletons/yacc.c: Adjust.
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: also define a symbol number for the empty token
+	This is not only cleaner, it also protects us from mixing signed
+	values (YYEMPTY is #defined as -2) with unsigned types (the
+	yysymbol_type_t enum is typically compiled as a small unsigned).
+	For instance GCC 9:
+
+	    input.c: In function 'yyparse':
+	    input.c:1107:7: error: conversion to 'unsigned int' from 'int'
+	                           may change the sign of the result
+	                           [-Werror=sign-conversion]
+	     1107 |   yyn += yytoken;
+	          |       ^~
+	    input.c:1107:10: error: conversion to 'int' from 'unsigned int'
+	                            may change the sign of the result
+	                            [-Werror=sign-conversion]
+	     1107 |   yyn += yytoken;
+	          |          ^~~~~~~
+	    input.c:1108:47: error: comparison of integer expressions of
+	                            different signedness:
+	                            'yytype_int8' {aka 'const signed char'} and
+	                            'yysymbol_type_t' {aka 'enum yysymbol_type_t'}
+	                            [-Werror=sign-compare]
+	     1108 |   if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+	          |                                               ^~
+	    input.c:702:25: error: operand of ?: changes signedness from 'int'
+	                           to 'unsigned int' due to unsignedness of
+	                           other operand [-Werror=sign-compare]
+	      702 | #define YYEMPTY         (-2)
+	          |                         ^~~~
+	    input.c:1220:33: note: in expansion of macro 'YYEMPTY'
+	     1220 |   yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
+	          |                                 ^~~~~~~
+	    input.c:1220:41: error: unsigned conversion from 'int' to
+	                            'unsigned int' changes value
+	                            from '-2' to '4294967294'
+	                            [-Werror=sign-conversion]
+	     1220 |   yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
+	          |                                         ^
+
+	Eventually, it might be interesting to move away from -2 (which is the
+	only possible negative symbol number) and use the next available
+	number, to save bits.  We could actually even simply use "0" and shift
+	the rest, which would allow to write "!yytoken" to mean really
+	"yytoken != YYEMPTY".
+
+	* data/skeletons/c.m4 (b4_declare_symbol_enum): Define YYSYMBOL_YYEMPTY.
+	* data/skeletons/yacc.c: Use it.
+
+	* src/parse-gram.y (yyreport_syntax_error): Use YYSYMBOL_YYEMPTY, not
+	YYEMPTY, when dealing with a symbol.
+
+	* tests/regression.at: Adjust.
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: use yysymbol_type_t instead of int for yytoken
+	Now that we have a proper type for internal symbol numbers, let's use
+	it.  More code needs conversion, e.g., printers and destructors, but
+	they are shared with glr.c, which is not ready yet for this change.
+
+	It will also help us deal with warnings such as (GCC9 on GNU/Linux):
+
+	    input.c: In function 'int yyparse()':
+	    input.c:475:37: error: enumeral and non-enumeral type in conditional expression [-Werror=extra]
+	      475 |   (0 <= (YYX) && (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYSYMBOL_YYUNDEF)
+	          |    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+	    input.c:1024:17: note: in expansion of macro 'YYTRANSLATE'
+	     1024 |       yytoken = YYTRANSLATE (yychar);
+	          |                 ^~~~~~~~~~~
+
+	* data/skeletons/yacc.c (yytranslate, yysymbol_name)
+	(yyparse_context_t, yyexpected_tokens, yypstate_expected_tokens)
+	(yysyntax_error_arguments):
+	Use yysymbol_type_t instead of int.
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-04-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: introduce an enum that defines the symbol's number
+	There's a number of advantage in exposing the symbol (internal)
+	numbers:
+
+	- custom error messages can use them to decide how to represent a
+	  given symbol, or a set of symbols.
+
+	- we need something similar in uses of yyexpected_tokens.  For
+	  instance, currently, bistromathic's completion() reads:
+
+	    int ntokens = expected_tokens (line, tokens, YYNTOKENS);
+	    [...]
+	    for (int i = 0; i < ntokens; ++i)
+	      if (tokens[i] == YYTRANSLATE (TOK_VAR))
+	      [...]
+	      else if (tokens[i] == YYTRANSLATE (TOK_FUN))
+	      [...]
+	      else
+	      [...]
+
+	- now that it's a compile-time expression, we can easily build static
+	  tables, switch, etc.
+
+	- some users depended on the ability to get the token number from a
+	  symbol to write test cases for their scanners.  But Bison 3.5
+	  removed the table this feature depended upon (a reverse
+	  yytranslate).  Now they can check against the actual symbol number,
+	  without having pay (space and time) a conversion.
+	  See https://lists.gnu.org/r/bug-bison/2020-01/msg00001.html, and
+	  https://lists.gnu.org/archive/html/bug-bison/2020-03/msg00015.html.
+
+	- it helps us clearly separate the internal symbol numbers from the
+	  external token numbers, whose difference is sometimes blurred in the
+	  code when values coincide (e.g. "yychar = yytoken = YYEOF").
+
+	- it allows us to get rid of ugly macros with inconsistent names such
+	  as YYUNDEFTOK and YYTERROR, and to group related definitions
+	  together.
+
+	- similarly it provides a clean access to the $accept symbol (which
+	  proves convenient in a current experimentation of mine with several
+	  %start symbols).
+
+	Let's declare this type as a private type (in the *.c file, not
+	the *.h one).  So it does not need to be influenced by the api prefix.
+
+	* data/skeletons/bison.m4 (b4_symbol_sid): New.
+	(b4_symbol): Use it.
+	* data/skeletons/c.m4 (b4_symbol_enum, b4_declare_symbol_enum): New.
+	* data/skeletons/yacc.c: Use b4_declare_symbol_enum.
+	(YYUNDEFTOK, YYTERROR): Remove.
+	Use the corresponding symbol enum instead.
+
+2020-03-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: comment changes about token numbers
+	* data/skeletons/bison.m4, data/skeletons/c.m4: here.
+
+2020-03-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: recheck: work properly when the test suite was interrupted
+	* tests/local.mk (recheck): Look at the per-test logs, not the overall
+	log, which, when interrupted, contains only information about... the
+	tests that passed.
+
+2020-03-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: move away from _ for internationalization
+	The "_" is becoming a keyword in Java, which causes tons of warnings
+	currently in our test suite.  GNU Gettext is now using "i18n" instead
+	of "_"
+	(https://git.savannah.gnu.org/gitweb/?p=gettext.git;a=commitdiff;h=e89fea36545f27487d9652a13e6a0adbea1117d0).
+
+	* data/skeletons/java.m4: Use "i18n", not "_".
+	* examples/java/calc/Calc.y, tests/calc.at: Adjust.
+
+2020-03-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-03-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: use YYNOMEM instead of -2
+	See 84b1972c96060866b4bd94a33b97711f8f7d0b6c.
+
+	* data/skeletons/glr.c, data/skeletons/yacc.c (YYNOMEM): New.
+	Use it.
+
+2020-03-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: update
+	* TODO (Token Number): We have to clean this.
+	(Naming conventions, Symbol numbers): New.
+	(Bad styling): Addressed in e21ff47f5d0b64da693a47b7dd200a1a44a5bbeb.
+
+2020-03-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-03-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: make yysyntaxErrorArguments a private detail
+	* data/skeletons/lalr1.java (yysyntaxErrorArguments): Move it from the
+	context, to the parser object.
+	Generate only for detailed and verbose error messages.
+	* tests/local.at (AT_YYERROR_DEFINE(java)): Use yyexpectedTokens
+	instead.
+
+2020-03-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	skeletons: make yysyntax_error_arguments a private detail
+	We could just "inline yysyntax_error_arguments back" in the routines
+	it was originally extracted from, but I think the code is nicer to
+	read this way.
+
+	* data/skeletons/glr.c (yysyntax_error_arguments): Generate only for
+	detailed and verbose error messages.
+	* data/skeletons/yacc.c: Likewise.
+	* data/skeletons/lalr1.cc (parser::context::yysyntax_error_arguments):
+	Move as...
+	(parser::yysyntax_error_arguments_): this.
+	And only for detailed and verbose error messages.
+
+2020-03-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	lalr1.cc: avoid using yysyntax_error_arguments
+	* data/skeletons/lalr1.cc (context::token): New.
+	* tests/local.at (yyreport_syntax_error): Don't use
+	yysyntax_error_arguments.
+
+2020-03-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	bison: avoid using yysyntax_error_arguments
+	* src/parse-gram.y (yyreport_syntax_error): Use yyparse_context_token
+	and yyexpected_tokens.
+
+2020-03-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: yacc.c: avoid yysyntax_error_arguments
+	Because glr.c shares the same testing routines, we also need to
+	convert it.
+
+	* data/skeletons/glr.c (yyparse_context_token): New.
+	* tests/local.at (yyreport_syntax_error): here.
+
+2020-03-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: don't use yysyntax_error_arguments
+	Suggested by Adrian Vogelsgesang.
+	https://lists.gnu.org/archive/html/bison-patches/2020-02/msg00069.html
+
+	* data/skeletons/lalr1.java (Context.EMPTY, Context.getToken): New.
+	(Context.yyntokens): Rename as...
+	(Context.NTOKENS): this.
+	Because (i) all the Java coding styles recommend upper case for
+	constants, and (ii) the Java Skeleton exposes Lexer.EOF, not
+	Lexer.YYEOF.
+	* data/skeletons/yacc.c (yyparse_context_token): New.
+	* examples/c/bistromathic/parse.y (yyreport_syntax_error): Don't use
+	yysyntax_error_arguments.
+	* examples/java/calc/Calc.y (yyreportSyntaxError): Likewise.
+
+2020-03-28  Akim Demaille  <akim.demaille@gmail.com>
+
+	skeletons: fix incorrect type for translatable tokens
+	* data/skeletons/glr.c, data/skeletons/lalr1.c, data/skeletons/yacc.c:
+	Fix confusion between the "translatable" and the "translate" tables.
+
+2020-03-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: use negative numbers for errors in auxiliary functions
+	yyparse returns 0, 1, 2 since ages (accept, reject, memory exhausted).
+	Some of our auxiliary functions such as yy_lac and
+	yyreport_syntax_error also need to return error codes and also use 0,
+	1, 2.  Because it uses yy_lac, yyexpected_tokens also needs to return
+	"problem", "memory exhausted", but in case of success, it needs to
+	return the number of tokens, so it cannot use 1 and 2 as error code.
+	Currently it uses -1 and -2, which is later converted into 1 and 2 as
+	yacc.c expects it.
+
+	Let's simplify this and use consistently -1 and -2 for auxiliary
+	functions that are not exposed (or not yet exposed) to the user.  In
+	particular this will save the user from having to convert
+	yyexpected_tokens's -2 into yyreport_syntax_error's 2: both return -1
+	or -2.
+
+	* data/skeletons/yacc.c (yy_lac, yyreport_syntax_error)
+	(yy_lac_stack_realloc): Return -1, -2 for errors instead of 1, 2.
+	Adjust callers.
+	* examples/c/bistromathic/parse.y (yyreport_syntax_error): Do take
+	error codes into account.
+	Issue a syntax error message even if we ran out of memory.
+	* src/parse-gram.y, tests/local.at (yyreport_syntax_error): Adjust.
+
+2020-03-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: reduce length of private constant
+	* data/skeletons/glr.c, data/skeletons/lalr1.cc, data/skeletons/yacc.c
+	(YYERROR_VERBOSE_ARGS_MAXIMUM): Rename as...
+	(YYARGS_MAX): this.
+	* src/parse-gram.y (YYERROR_VERBOSE_ARGS_MAXIMUM): Rename as...
+	(ARGS_MAX): this.
+
+2020-03-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: c++: promote api.token.raw
+	* doc/bison.texi (Calc++ Parser): Here.
+
+2020-03-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: calc: no need for super long inputs
+	* etc/bench.pl.in ($iterations): Restore initial value, -1, meaning
+	"at least one second".
+	($calc_input): There is no need to generate 400 lines.
+
+2020-03-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: calc: work on a string instead of a file
+	The cost of the file layer is large and makes benchmarks too coarse,
+	as seen for in following example, first with a file, then with a
+	literal string:
+
+	    0. %skeleton "yacc.c" %define parse.lac full
+	    1. %skeleton "yacc-v1.c" %define nofinal %define parse.lac full
+	    2. %skeleton "yacc-v2.c" %define nofinal %define parse.lac full
+	    3. %skeleton "yacc-v3.c" %define nofinal %define parse.lac full
+	    4. %skeleton "yacc.c"
+	    5. %skeleton "yacc-v1.c" %define nofinal
+	    6. %skeleton "yacc-v2.c" %define nofinal
+	    7. %skeleton "yacc-v3.c" %define nofinal
+	    --------------------------------------------------
+	    Benchmark           Time           CPU Iterations
+	    --------------------------------------------------
+	    BM_y0           32558 ns      32537 ns      21228
+	    BM_y1           32400 ns      32369 ns      21233
+	    BM_y2           33485 ns      33464 ns      20625
+	    BM_y3           32139 ns      32125 ns      21446
+	    BM_y4           31343 ns      31329 ns      21747
+	    BM_y5           31344 ns      31317 ns      22035
+	    BM_y6           31287 ns      31255 ns      22039
+	    BM_y7           31387 ns      31373 ns      22178
+	    --------------------------------------------------
+	    Benchmark           Time           CPU Iterations
+	    --------------------------------------------------
+	    BM_y0           10642 ns      10634 ns      63601
+	    BM_y1           10657 ns      10654 ns      63625
+	    BM_y2           10441 ns      10432 ns      65957
+	    BM_y3           10558 ns      10554 ns      64546
+	    BM_y4            9521 ns       9516 ns      72011
+	    BM_y5            9179 ns       9157 ns      75028
+	    BM_y6            9360 ns       9356 ns      73770
+	    BM_y7            9365 ns       9359 ns      72609
+
+	Of course, at the same time it is less realistic: most users read
+	files rather that strings, so it might lead to us to pay attention to
+	costs most people don't see.
+
+	* etc/bench.pl.in (&calc_input): Output into a file given as argument.
+	Output in C syntax.
+	(&generate_grammar_calc): Use it.
+	Simplify the grammar: remove operators we don't care about.
+	Rewrite the scanner to work on a char* instead of a FILE*.
+
+2020-03-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: add a "latest" symlink
+	* etc/bench.pl.in: here.
+
+2020-03-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: use the same prefix in both bench methods
+	* etc/bench.pl.in (&bench_with_timethese): Also use y$i, as in
+	&bench_with_gbenchmark.
+	(&generate_grammar_calc): Don't add a prefix, let the callers do it.
+
+2020-03-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: use a C++-11 compiler
+	See https://github.com/google/benchmark#a-faster-keeprunning-loop.
+
+	* etc/bench.pl.in ($cxx): Be C++11.
+	(&bench_with_gbenchmark): Adjust.
+
+2020-03-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: create a README file with benches
+	* etc/bench.pl.in (&bench_with_gbenchmark): Here.
+
+2020-03-21  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: calc: add support for google benchmark
+	* etc/bench.pl.in (&compiler): New, extracted from...
+	(&compile): here.
+	Don't link when using gbm.
+	(&calc_input): Don't make massive input for micro
+	benchmarks.
+	(&generate_grammar_calc): When using gbm, use api.prefix to avoid name
+	collisions.
+	Be ready to issue BENCHMARKS instead of a main.
+	(&bench): Rename as...
+	(&bench_with_timethese): this.
+	(&bench_with_gbenchmark): New.
+	(&bench): New.
+	Dispatch on these two.
+
+2020-03-21  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: better error messages on invalid input
+	* etc/bench.pl.in: here.
+
+2020-03-21  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: simplify the calc grammar
+	* etc/bench.pl.in (generate_grammar_calc): We don't need global_result
+	etc.
+
+2020-03-21  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench: die clearly on incorrect --grammar arguments
+	* etc/bench.pl.in (getopt): here.
+
+2020-03-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-03-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: style: prefer switch to if
+	* data/skeletons/yacc.c: Prefer switch to decode yy_lac's return value.
+
+2020-03-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: yypstate_expected_tokens
+	In push parsers, when asking for the list of expected tokens at some
+	point, it makes no sense to build a yyparse_context_t: the yypstate
+	alone suffices (the only difference being the lookahead).  Instead of
+	forcing the user to build a useless shell around yypstate, let's offer
+	yypstate_expected_tokens.
+
+	See https://lists.gnu.org/r/bison-patches/2020-03/msg00025.html.
+
+	* data/skeletons/yacc.c (yypstate): Declare earlier, so that we can
+	use it for...
+	(yypstate_expected_tokens): this new function, when in push parsers.
+	Adjust dependencies.
+	* examples/c/bistromathic/parse.y: Simplify: use
+	yypstate_expected_tokens.
+	Style fixes.
+	Reduce scopes (reported by Joel E. Denny).
+
+2020-03-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: bistromathic: simplify
+	* examples/c/bistromathic/parse.y (expected_tokens): Remove useless "break".
+
+2020-03-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	merge branch 'maint'
+	* upstream/maint:
+	  maint: post-release administrivia
+	  version 3.5.3
+	  news: update for 3.5.3
+	  yacc.c: make sure we properly propagated the user's number for error
+	  diagnostics: don't crash because of repeated definitions of error
+	  style: initialize some struct members
+	  diagnostics: beware of zero-width characters
+	  diagnostics: be sure to close the styling when lines are too short
+	  muscles: fix incorrect decoding of $
+	  code: be robust to reference with invalid tags
+	  build: fix typo
+	  doc: update recommandation for libtextstyle
+	  style: comment changes
+	  examples: use consistently the GFDL header for readmes
+	  style: remove useless declarations
+	  typo: succesful -> successful
+	  README: point to tests/bison, and document --trace
+	  gnulib: update
+	  maint: post-release administrivia
+
+2020-03-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-03-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.5.3
+	* NEWS: Record release date.
+
+2020-03-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: update for 3.5.3
+
+2020-03-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: make sure we properly propagated the user's number for error
+	* data/skeletons/yacc.c (YYERRCODE): Be truthful.
+	* tests/input.at (Redefining the error token): Check that.
+
+2020-03-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	diagnostics: don't crash because of repeated definitions of error
+	According to https://www.unix.com/man-page/POSIX/1posix/yacc/, the
+	user is allowed to specify her user number for the error token:
+
+	    The token error shall be reserved for error handling. The name
+	    error can be used in grammar rules. It indicates places where the
+	    parser can recover from a syntax error. The default value of error
+	    shall be 256. Its value can be changed using a %token
+	    declaration. The lexical analyzer should not return the value of
+	    error.
+
+	I think this feature is useless, the user should not have to deal with
+	that.  The intend is probably to give the user a means to use 256 if
+	she wants to, but provided "error" cleared the path first by being
+	assigned another number.  In the case of Bison, 256 is assigned to
+	"error" at the end if the user did not use it for a token of hers.  So
+	this feature is useless.
+
+	Yet it is valid, and if the user assigns twice a token number to
+	"error", then the second time we want to complain about it and want to
+	show the original definition.  At this point, we try to display the
+	built-in definition of "error", whose location is NULL, and we crash.
+
+	Rather, the location of the first user definition of "error" should
+	become its defining location.
+
+	Reported byg Ahcheong Lee.
+	https://lists.gnu.org/r/bug-bison/2020-03/msg00007.html
+
+	* src/symtab.c (symbol_class_set): If this is a declaration and the
+	symbol was not declared yet, keep this as defining location.
+	* tests/input.at (Redefining the error token): New.
+
+2020-03-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: initialize some struct members
+	* src/symtab.c (sym_content_new): Initialize all the location members.
+	Not needed by the code, but disturbing values when using a debugger.
+
+2020-03-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	diagnostics: beware of zero-width characters
+	Currenly we rely on (visual) width of the characters to decide where
+	to open and close the styling of the quoted lines.  This breaks when
+	we deal with zero-width characters: we cannot just rely on (visual)
+	columns, we need to know whether we are before, inside, or after the
+	highlighted portion.
+
+	* src/location.c (location_caret): col_end: no longer add 1, "regular"
+	characters have a width of 1, only 0-width characters have 0-width.
+	opened: replace with 'state', a three-valued enum.
+	Don't reopen the style if we already did.
+	* tests/diagnostics.at (Zero-width characters): New.
+
+2020-03-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	diagnostics: be sure to close the styling when lines are too short
+	     bar.y:4.12-17: <error>error:</error> redefining user token number of foo
+	    -    4 | %token foo <error>123
+	    +    4 | %token foo <error>123</error>
+	           |            <error>^~~~~~</error>
+
+	* src/location.c (location_caret): Be sure to close.
+	* tests/diagnostics.at (Line is too short, and then you die): New.
+
+2020-03-07  Akim Demaille  <akim.demaille@gmail.com>
+
+	muscles: fix incorrect decoding of $
+	Bug introduced in 458171e6df5a0110a35ee45ad8b2e9f6fb426f1d.
+	https://lists.gnu.org/archive/html/bison-patches/2013-11/msg00009.html
+
+	Reported by Ahcheong Lee.
+	https://lists.gnu.org/r/bug-bison/2020-03/msg00010.html
+
+	* src/muscle-tab.c (COMMON_DECODE): "$" is coded as "$][", not "$[][".
+	* tests/input.at ("%define" enum variables): Check that case.
+
+2020-03-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	code: be robust to reference with invalid tags
+	Because we want to support $<a->b>$, we must accept -> in type tags,
+	and reject $<->$, as it is unfinished.
+	Reported by Ahcheong Lee.
+
+	* src/scan-code.l (yylex): Make sure "tag" does not end with -, since
+	-> does not close the tag.
+	* tests/input.at (Stray $ or @): Check this.
+
+2020-03-06  Akimn Demaille  <akim.demaille@gmail.com>
+
+	build: fix typo
+	* build-aux/cross-options.pl: here.
+
+2020-03-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: update recommandation for libtextstyle
+	* README: here.
+
+2020-03-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: comment changes
+	* src/symtab.h, src/lr0.c: here.
+
+2020-03-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: use consistently the GFDL header for readmes
+	* examples/c++/README.md, examples/c++/calc++/README.md,
+	* examples/c/calc/README.md, examples/c/lexcalc/README.md,
+	* examples/c/reccalc/README.md:
+	Prefer the GFDL banner to the GPL one.
+
+2020-03-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: remove useless declarations
+	* src/reader.h: Don't duplicate what parse-gram.h already exposes.
+	* src/lr0.h: Remove useless include.
+
+2020-03-06  Adrian Vogelsgesang  <avogelsgesang@tableau.com>
+
+	typo: succesful -> successful
+	* data/skeletons/lalr1.cc: here
+	* etc/bench.pl.in: here
+	* src/location.c: and here.
+
+2020-03-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	README: point to tests/bison, and document --trace
+	Reported by Victor Morales Cayuela.
+
+	* README, README-hacking.md: here.
+
+2020-03-06  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-03-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	README: point to tests/bison, and document --trace
+	Reported by Victor Morales Cayuela.
+
+	* README, README-hacking.md: here.
+
+2020-03-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: simplify yyparse_context_t member names
+	* data/skeletons/yacc.c (yyparse_context_t): Rename yyes_p and
+	yyes_capacity_p as...
+	(yyes, yyes_capacity): These.
+
+2020-03-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: yyerror_range does not need to be preserved accross calls
+	* data/skeletons/yacc.c (b4_parse_state_variable_macros): Don't define
+	yyerror_range.
+	(yyparse): Add yyerror_range as local variable.
+
+2020-03-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: push: undefine the pstate macros for the epilogue
+	* data/skeletons/yacc.c (b4_macro_define, b4_macro_undef)
+	(b4_pstate_macro_define, b4_parse_state_variable_macros):
+	New.
+	Use them.
+	* examples/c/bistromathic/parse.y: Remove now useless undefs.
+
+2020-03-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: push: initialize the pstate variables in pstate_new
+	Currently pstate_new does not set up its variables, this task is left
+	to yypush_parse.  This was probably to share more code with usual pull
+	parsers, where these (local) variables are indeed initialized by
+	yyparse.
+
+	But as a consequence yyexpected_tokens crashes at the very beginning
+	of the parse, since, for instance, the stacks are not even set up.
+	See https://lists.gnu.org/r/bison-patches/2020-03/msg00001.html.
+
+	The fix could have very simple, but the documentation actually makes
+	it very clear that we can reuse a pstate for several parses:
+
+	    After yypush_parse returns a status other than YYPUSH_MORE, the
+	    parser instance yyps may be reused for a new parse.
+
+	so we need to restore the parser to its pristine state so that (i) it
+	is ready to run the next parse, (ii) it properly supports
+	yyexpected_tokens for the next run.
+
+	* data/skeletons/yacc.c (b4_initialize_parser_state_variables): New,
+	extracted from the top of yyparse/yypush_parse.
+	(yypstate_clear): New.
+	(yypstate_new): Use it when push parsers are enabled.
+	Define after the yyps macros so that we can use the same code as the
+	regular pull parsers.
+	(yyparse): Use it when push parsers are _not_ enabled.
+
+	* examples/c/bistromathic/bistromathic.test: Check the completion on
+	the beginning of the line.
+
+2020-03-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: formatting changes
+	* data/skeletons/yacc.c, tests/torture.at: here.
+
+2020-03-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	bistromathic: properly compute the lcp, as expected by readline
+	Currently completion on "at" proposes only "atan", but does not
+	actually complete "at" into "atan".
+
+	* examples/c/bistromathic/parse.y (completion): Install the lcp in
+	matches[0].
+	* examples/c/bistromathic/bistromathic.test: Check that case.
+
+2020-03-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	bistromathic: don't require spaces after operators for completion
+	Currently "(1+<TAB>" does not work as expected, because "+" is not a
+	word breaking character.
+
+	* examples/c/bistromathic/parse.y (init_readline): Specify our word
+	breaking characters.
+	* examples/c/bistromathic/bistromathic.test: Avoid trailing spaces.
+
+2020-03-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	bistromathic: check completion
+	* examples/c/bistromathic/bistromathic.test: here.
+	* examples/c/bistromathic/parse.y (expected_tokens): Fix a memory
+	leak.
+
+2020-03-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	m4: remove b4_function_define and b4_function_declare
+	* data/skeletons/c.m4: here.
+
+2020-03-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	m4: decommission b4_function_declare
+	* data/skeletons/glr.c, data/skeletons/glr.cc, data/skeletons/yacc.c:
+	Stop using b4_function_declare.
+
+2020-03-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	m4: decommission function generating macro
+	These macros have been extremely useful when we had to support K&R C,
+	which we dropped long ago.  Now, they merely make the code uselessly
+	hard to read.
+
+	* data/skeletons/c.m4, data/skeletons/glr.c, data/skeletons/glr.cc,
+	* data/skeletons/yacc.c:
+	Stop using b4_function_define.
+
+2020-03-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: bistromathic: demonstrate the use of yyexpected_tokens
+	Let's use GNU readline and its TAB autocompletion to demonstrate the
+	use of yyexpected_tokens.
+
+	This shows a number of weaknesses in our current approach:
+
+	- some macros (yyssp, etc.) from push parsers "leak" in user code, we
+	  need to undefine them
+
+	- the context needed by yyexpected_tokens does not need the token,
+	  yypstate actually suffices
+
+	- yypstate is not properly setup when first allocated, which results
+	  in a crash of yyexpected_tokens if fired before a first token was
+	  read.  We should move initialization from yypush_parse into
+	  yypstate_new.
+
+	* examples/c/bistromathic/parse.y (yylex): Take input as a string, not
+	a file.
+	(EXIT): New token.
+	(input): Adjust to work only on a line.
+	(line): Remove.
+	(symbol_count, process_line, expected_tokens, completion)
+	(init_readline): New.
+	* examples/c/bistromathic/bistromathic.test: Adjust expectations.
+
+2020-03-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: use consistently the GFDL header for readmes
+	* examples/c++/README.md, examples/c++/calc++/README.md,
+	* examples/c/calc/README.md, examples/c/lexcalc/README.md,
+	* examples/c/pushcalc/README.md, examples/c/reccalc/README.md:
+	Prefer the GFDL banner to the GPL one.
+
+2020-03-01  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: use readline
+
+2020-02-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: bistromathic: don't use Flex
+	This example will soon use GNU readline, so its scanner should be easy
+	to use (concurrently) on strings, not streams.  This is not a place
+	where Flex shines, and anyway, these are examples of Bison, not Flex.
+	There's already lexcalc and reccalc that demonstrate the use of Flex.
+
+	* examples/c/bistromathic/scan.l: Remove.
+	* examples/c/bistromathic/parse.y (yylex): New.
+	Adjust dependencies.
+
+2020-02-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: bistromathic: strengthen tests
+	* examples/c/bistromathic/bistromathic.test: here.
+	* examples/test: Be clearer on failing tests.
+
+2020-02-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: lexcalc: demonstrate location tracking
+	The bistromathic example should not use Flex, it makes it too complex.
+	But it was the only example to show location tracking with Flex.
+
+	* examples/c/lexcalc/lexcalc.test, examples/c/lexcalc/parse.y,
+	* examples/c/lexcalc/scan.l: Demonstrate location tracking as is done
+	in bistromathic.
+
+2020-02-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: don't copy the lookahead
+	The current implementation of parser::context keeps a copy of the
+	lookahead.  This is troublesome since we support move-only types.
+	Besides, while GCC is happy with the current implementation, Clang
+	complains that the ctor it needs to build the copy of the lookahead is
+	not yet available.
+
+	    461. calc.at:1120: testing Calculator C++ %defines %locations parse.error=verbose %name-prefix "calc" %verbose  ...
+	    calc.at:1120: COLUMNS=1000; export COLUMNS;  bison --color=no -fno-caret -Wno-deprecated -o calc.cc calc.y
+	    calc.at:1120: $CXX $CXXFLAGS $CPPFLAGS  $LDFLAGS -o calc calc.cc calc-lex.cc calc-main.cc $LIBS
+	    stderr:
+	    In file included from calc-lex.cc:7:
+	    calc.hh:351:12: error: instantiation of function 'calc::parser::basic_symbol<calc::parser::by_type>::basic_symbol' required here, but no definition is available [-Werror,-Wundefined-func-template]
+	        struct symbol_type : basic_symbol<by_type>
+	               ^
+	    calc.hh:273:7: note: forward declaration of template entity is here
+	          basic_symbol (const basic_symbol& that);
+	          ^
+	    calc.hh:351:12: note: add an explicit instantiation declaration to suppress this warning if 'calc::parser::basic_symbol<calc::parser::by_type>::basic_symbol' is explicitly instantiated in another translation unit
+	        struct symbol_type : basic_symbol<by_type>
+	               ^
+	    1 error generated.
+	    In file included from calc-main.cc:7:
+	    calc.hh:351:12: error: instantiation of function 'calc::parser::basic_symbol<calc::parser::by_type>::basic_symbol' required here, but no definition is available [-Werror,-Wundefined-func-template]
+	        struct symbol_type : basic_symbol<by_type>
+	               ^
+	    calc.hh:273:7: note: forward declaration of template entity is here
+	          basic_symbol (const basic_symbol& that);
+	          ^
+	    calc.hh:351:12: note: add an explicit instantiation declaration to suppress this warning if 'calc::parser::basic_symbol<calc::parser::by_type>::basic_symbol' is explicitly instantiated in another translation unit
+	        struct symbol_type : basic_symbol<by_type>
+	               ^
+	    1 error generated.
+	    stdout:
+	    calc.at:1120: exit code was 1, expected 0
+	    461. calc.at:1120: 461. Calculator C++ %defines %locations parse.error=verbose %name-prefix "calc" %verbose  (calc.at:1120): FAILED (calc.at:1120)
+
+	* data/skeletons/lalr1.cc (context::yyla_): Make it a const-ref.
+	Move the implementation out of the declaration.
+
+2020-02-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: minor fixes
+	Address compiler warnings such as
+
+	    warning: declaration of 'yyla' shadows a member of 'yy::parser::context' [-Wshadow]
+
+	* data/skeletons/lalr1.cc (context): Don't use the same names for
+	variables and members.
+	Use foo_ for private members, as in parser.
+	Also, use the + trick in array accesses to please ICC and provide it
+	with an int.
+
+2020-02-27  Adrian Vogelsgesang  <avogelsgesang@tableau.com>
+
+	c++: add support for parse.error=custom
+	* data/skeletons/lalr1.cc: added support here
+	* tests/calc.at: added test cases
+	* tests/local.at: added yyreport_syntax_error implementation
+	   for C++ test cases
+
+2020-02-27  Adrian Vogelsgesang  <avogelsgesang@tableau.com>
+
+	c++: add parser::context for syntax error handling
+	* data/skeletons/lalr1.cc: here
+
+2020-02-27  Adrian Vogelsgesang  <avogelsgesang@tableau.com>
+
+	c++: add support for parse.error=detailed
+	* data/skeletons/lalr1.cc: added support here
+	* tests/calc.at: added a test case
+
+2020-02-27  Adrian Vogelsgesang  <avogelsgesang@tableau.com>
+
+	skeletons: prefer b4_parse_error_{case,bmatch} over manual solution
+	Prefer b4_parse_error_case over the adhoc solution
+	`m4_case + b4_percent_define_get`. Same for b4_parse_error_bmatch.
+
+	* data/skeletons/glr.c: here
+	* data/skeletons/yacc.c: here
+
+2020-02-27  Adrian Vogelsgesang  <avogelsgesang@tableau.com>
+
+	typo: succesful -> successful
+	* data/skeletons/lalr1.cc: here
+	* etc/bench.pl.in: here
+	* src/location.c: here
+	* tests/calc.at: and here
+
+2020-02-24  Akim Demaille  <akim.demaille@gmail.com>
+
+	bench.pl: clean up the dust
+	* etc/bench.pl.in: Adjust to the current use of %define's values.
+	Don't use %error-verbose.
+	Prefer Bison to CPP (e.g., api.value.type).
+	Avoid returning characters directly, so that %define api.token.raw works.
+
+2020-02-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: comment changes
+	* src/symtab.h, src/lr0.c: here.
+
+2020-02-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: avoid using 'this' as an identifier
+	LLDB insists on parsing 'this' as a C++ keyword, even when debugging a
+	C program.
+
+	* src/symtab.c: Please the dictator.
+
+2020-02-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: remove useless declarations
+	* src/reader.h: Don't duplicate what parse-gram.h already exposes.
+	* src/lr0.h: Remove useless include.
+
+2020-02-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: fix c/calc
+	* examples/c/calc/calc.y: Remove experiment traces.
+
+2020-02-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: update
+
+2020-02-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: update recommandation for libtextstyle
+	* README: here.
+
+2020-02-15  Akimn Demaille  <akim.demaille@gmail.com>
+
+	build: fix typo
+	* build-aux/cross-options.pl: here.
+
+2020-02-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: simplify the cross references
+	* doc/bison.texi: here.
+
+2020-02-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: document token internationalization
+	* doc/bison.texi (Parser Internationalization): Move most of its
+	content into...
+	(Enabling I18n): this new node.
+	(Token I18n): New.
+	(Token Decl): Refer to token internationalization.
+	(Error Reporting Function): Promote parse.error detailed.
+
+2020-02-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-02-15  Victor Morales Cayuela  <victor.morales_cayuela@nokia-sbell.com>
+
+	diagnostics: modernize the display of submessages
+	Since Bison 2.7, output was indented four spaces for explanatory
+	statements.  For example:
+
+	    input.y:2.7-13: error: %type redeclaration for exp
+	    input.y:1.7-11:     previous declaration
+
+	Since the introduction of caret-diagnostics, it became less clear.
+	Remove the indentation and display submessages as in GCC:
+
+	    input.y:2.7-13: error: %type redeclaration for exp
+	        2 | %type <float> exp
+	          |       ^~~~~~~
+	    input.y:1.7-11: note: previous declaration
+	        1 | %type <int> exp
+	          |       ^~~~~
+
+	* src/complain.h (SUB_INDENT): Remove.
+	(warnings): Add "note" to the enum.
+	* src/complain.h, src/complain.c (complain_indent): Replace by...
+	(subcomplain): this.
+	Adjust all dependencies.
+	* tests/actions.at, tests/diagnostics.at, tests/glr-regression.at,
+	* tests/input.at, tests/named-refs.at, tests/regression.at:
+	Adjust expectations.
+
+2020-02-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: simplify uses of references
+	This reverts "doc: work around problems with PDF generation", commit
+	d810aa3d8f76b1a4d7d402072f45a0662152ffd4.  Upstream issue is fixed.
+	https://lists.gnu.org/r/bug-texinfo/2020-02/msg00006.html
+
+	* gnulib: Update.
+	* doc/bison.texi: Simplify.
+
+2020-02-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: provide a Context ctor
+	This is really a private auxiliary inner class, so it should not
+	matter.  But it's better style.
+
+	* data/skeletons/lalr1.java: here.
+
+2020-02-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	Merge tag 'v3.5.2'
+	bison 3.5.2
+
+	* tag 'v3.5.2':
+	  version 3.5.2
+	  news: 3.5.2
+	  gnulib: update
+	  doc: update Doxygen template
+	  java: avoid trailing white spaces
+	  m4: fix b4_token_format
+	  doc: clearly state that %yacc only makes sense with yacc.c
+	  doc: spell check
+	  examples: be more robust to spaces in paths
+	  larlr1.cc: Reject unsupported values for parse.lac
+
+2020-02-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-02-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.5.2
+	* NEWS: Record release date.
+
+2020-02-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: 3.5.2
+	* NEWS: Update.
+
+2020-02-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-02-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: update Doxygen template
+	* Doxyfile.in: Run doxygen -u on it.
+
+2020-02-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: avoid trailing white spaces
+	* data/skeletons/java.m4 (b4_maybe_throws): Issue a space before when needed.
+	* data/skeletons/lalr1.java: Avoid trailing spaces.
+
+2020-02-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	m4: fix b4_token_format
+	We used to emit:
+
+	    /** Token number,to be returned by the scanner.  */
+	    static final int NUM = 258;
+	    /** Token number,to be returned by the scanner.  */
+	    static final int NEG = 259;
+
+	with no space after the comma.  Fix that.
+
+	* data/skeletons/bison.m4 (b4_token_format): Quote where appropriate.
+
+2020-02-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: clearly state that %yacc only makes sense with yacc.c
+	* doc/bison.texi: here.
+
+2020-02-13  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: spell check
+	* doc/bison.texi: here.
+
+2020-02-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: bistromathic: demonstrate named references
+	* examples/c/bistromathic/parse.y: here.
+
+2020-02-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: simplify
+	* data/skeletons/stack.hh (ssize): Remove, same as size.
+
+2020-02-12  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: check calls to yyerror from the user actions
+	This revealed a number of things I had not realized:
+
+	- the Java location tracking was aliasing the same pair of positions
+	  for all the symbols (see previous commit).
+
+	- in impure parsers, it's quite easy to use incorrect locations for
+	  diagnostics, since yyerror uses yylloc, which is the location of the
+	  lookahead, not that of the current lhs.  So we need something like
+
+	    {
+	      YYLTYPE old_yylloc = yylloc;
+	      yylloc = @$;
+	      yyerror (]AT_PARAM_IF([result, count, nerrs, ])[buf);
+	      yylloc = old_yylloc;
+	    }
+
+	  Maybe we should do that little yylloc dance in the skeleton instead
+	  of leaving it to the user?  It might be costly...  But that's only
+	  for users of the impure parsers, which are asking for trouble
+	  anyway.
+
+	- in glr.cc invoking yyerror is somewhat cumbersome: the C++ interface
+	  is not available as we are in yyparse (which in C), and yyerror is
+	  used by glr.cc itself to bind it to the user's parser::error.  If we
+	  call yyerror, we need:
+
+	    yyerror (]AT_LOCATION_IF([[&@$, ]])[yyparser, ]AT_PARAM_IF([result, count, nerrs, ])[msg);
+
+	  However calling yy::parser::error is easier, once we know that the
+	  current parser object is available as 'yyparser'.  Which also saves
+	  us from having to pass the parse-params ourselves:
+
+	    yyparser.error (]AT_LOCATION_IF([[@$, ]])[msg);
+
+	* tests/calc.at: Invoke yyerror by hand, instead of using fprintf etc.
+	Adjust expectations.
+
+2020-02-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: beware not to alias the locations of the various symbols
+	* examples/java/calc/Calc.y, tests/calc.at, tests/local.at
+	(getStartPos, getEndPos): Always return a new object.
+	* doc/bison.texi: Clarify this.
+
+2020-02-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: check that parse.error custom|detailed work with push parsers
+	* tests/calc.at: here.
+
+2020-02-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: don't expose the Context's members
+	* data/skeletons/lalr1.java (Context): Make data members private.
+	(Context.getLocation): New.
+	* examples/java/calc/Calc.y, tests/java.at, tests/local.at: Adjust.
+
+2020-02-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: pacify syntax-check
+	* src/complain.c: Fix indentation.
+	* cfg.mk: Using strcmp is ok in the tests.
+	Test cases and examples don't need Bison's PO support.
+
+2020-02-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-02-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-02-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	build: prefer %D% and %C% to hard coded values
+	* doc/local.mk: here.
+
+2020-02-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	parse.error: document and diagnose the incompatibility with %token-table
+	* doc/bison.texi (Tokens from Literals): Move to code using
+	%token-table to...
+	(Decl Summary: %token-table): here.
+	* data/skeletons/bison.m4: Implement mutual exclusion.
+	* tests/input.at: Check it.
+	* doc/local.mk: Be robust to the removal of doc/.
+
+2020-02-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: spell check
+	* doc/bison.texi: here.
+
+2020-02-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: formatting changes
+	* doc/bison.texi: here.
+
+2020-02-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: work around problems with PDF generation
+	With texinfo.tex 2019-09-24.13, node names with + are not properly
+	handled.
+	https://lists.gnu.org/r/bug-texinfo/2020-02/msg00004.html
+
+	* doc/bison.texi: Always use the three-argument form for references to
+	node with a + in the name.
+
+2020-02-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: revert "style: avoid useless initializers"
+	This reverts commit ebab1ffca8a728158051481795ae798231cfd93d.
+	This commit removed "useless" initializers, going from
+
+	    /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+	       STATE-NUM.  */
+	    private static final byte yypact_[] = yypact_init ();
+	    private static final byte[] yypact_init ()
+	    {
+	      return new byte[]
+	      {
+	        25,    -7,    -8,    37,    -8,    40,    -8,    20,    -8,    61,
+	        -8,    -8,     3,     9,    51,    -8,    -8,    -2,    -2,    -2,
+	        -2,    -2,    -2,    -8,    -8,    -8,     1,    66,    66,     3,
+	         3,     3
+	      };
+	    }
+
+	to
+
+	    /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+	       STATE-NUM.  */
+	    private static final byte[] yypact_ =
+	    {
+	        25,    -7,    -8,    37,    -8,    40,    -8,    20,    -8,    61,
+	        -8,    -8,     3,     9,    51,    -8,    -8,    -2,    -2,    -2,
+	        -2,    -2,    -2,    -8,    -8,    -8,     1,    66,    66,     3,
+	         3,     3
+	    };
+
+	But it turns out that this was on purpose, to work around the 64KB
+	limitation in JVM methods.  It was introduced on the 2008-11-10 by
+	Di-an Jan in 09ccae9b18a7c09ebf7bb8df2a18c8c4a6def248: "Work around
+	Java's ``code too large'' problem for parser tables".  See
+	https://lists.gnu.org/r/help-bison/2008-11/msg00004.html.  A real
+	test, where we would hit the JVM limitation, would be nice.
+
+	To avoid further regressions, add comments.
+
+2020-02-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	skeletons: avoid b4_error_verbose_if, which is confusing
+	parse.error has more than two possible values.
+
+	* data/skeletons/bison.m4 (b4_error_verbose_if, b4_error_verbose_flag):
+	Remove.
+	(b4_parse_error_case, b4_parse_error_bmatch): New.
+	Adjust dependencies.
+
+2020-02-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	skeletons: decorelate %token-table from verbose error messages
+	Reported by Adrian Vogelsgesang.
+
+	* data/skeletons/bison.m4: Here.
+	* data/skeletons/lalr1.cc: Adjust.
+
+2020-02-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: formatting changes
+	* doc/bison.texi: here.
+
+2020-02-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: clearly state that %yacc only makes sense with yacc.c
+	* doc/bison.texi: here.
+	* tests/calc.at: Stop testing %yacc with non yacc.c skeletons.
+
+2020-02-09  Adrian Vogelsgesang  <avogelsgesang@tableau.com>
+
+	style: stylistic cleanups in the C skeletons
+	* data/skeletons/glr.c, data/skeletons/yacc.c:
+	Avoid duplicated declaration of yysymbol_name.
+
+2020-02-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: provide Context with a more OO interface
+	* data/skeletons/lalr1.java (yyexpectedTokens)
+	(yysyntaxErrorArguments): Make them methods of Context.
+	(Context.yysymbolName): New.
+	* tests/local.at: Adjust.
+
+2020-02-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: add support for parse.error custom
+	* data/skeletons/lalr1.java: Add support for custom parse errors.
+	(yyntokens_): Make it public.  Under...
+	(yyntokens): this name.
+	(Context): Capture the location too.
+	* examples/c/bistromathic/parse.y,
+	* examples/c/bistromathic/bistromathic.test:
+	Improve error message.
+	* examples/java/calc/Calc.test, examples/java/calc/Calc.y: Use custom
+	error messages.
+	* tests/calc.at, tests/local.at: Check custom error messages.
+
+2020-02-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: let the Context give access to yyntokens
+	* data/skeletons/lalr1.java (Context.yytokens): New.
+
+2020-02-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: make the syntax error format string translatable
+	The error format should be translated, but contrary to the case of
+	C/C++, we cannot just depend on macros to adapt on the
+	presence/absence of '_'.  Let's consider that the message format is to
+	be translated iff there are some internationalized tokens.
+
+	* src/output.c (prepare_symbol_names): Define b4_has_translations.
+	* data/skeletons/java.m4 (b4_trans): New.
+	* data/skeletons/lalr1.java: Use it to emit translatable or not the
+	format string.
+
+2020-02-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: introduce yyexpectedTokens
+	And allow syntax error messages for 'detailed' and 'verbose' to be
+	translated.
+
+	* data/skeletons/lalr1.java (Context, yyexpectedTokens)
+	(yysyntaxErrorArguments): New.
+	(yysyntax_error): Use it.
+
+2020-02-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: add support for parse.error=detailed
+	In Java there is no need for N_ and yytranslate_.  So instead of
+	hard-coding the use of N_ in the table of the symbol names, rely on
+	b4_symbol_translate.
+
+	* src/output.c (prepare_symbol_names): Use b4_symbol_translate instead
+	of N_.
+	* data/skeletons/c.m4 (b4_symbol_translate): New.
+	* data/skeletons/lalr1.java (yysymbolName): New.
+	Use it.
+	* examples/java/calc/Calc.y: Use parse.error=detailed.
+	* tests/calc.at: Check parse.error=detailed.
+
+2020-02-08  Akim Demaille  <akim.demaille@gmail.com>
+
+	m4: fix b4_token_format
+	We used to emit:
+
+	    /** Token number,to be returned by the scanner.  */
+	    static final int NUM = 258;
+	    /** Token number,to be returned by the scanner.  */
+	    static final int NEG = 259;
+
+	with no space after the comma.  Fix that.
+
+	* data/skeletons/bison.m4 (b4_token_format): Quote where appropriate.
+
+2020-02-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: tests: remove now redundant tests
+	* tests/javapush.at: here.
+
+2020-02-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: tests: check push parsers like the others
+	Currently in javapush.at.
+
+	* tests/calc.at: Here.
+
+2020-02-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: tests: remove now redundant tests
+	* tests/java.at: Calculator tests are now in calc.at.
+
+2020-02-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: tests: check location tracking in the calculator
+	Unfortunately in the Java skeleton the user cannot override the way
+	locations are displayed, and locations don't know the structure of the
+	positions.  So they cannot implement the tricks used in the C/C++
+	skeletons to display "1.1" instead of "1.1-1.2".
+
+	* tests/local.at (Java): Add support for column tracking in the
+	locations, as we did in examples/java/calc.
+	* tests/calc.at: Use AT_CALC_YYLEX.
+
+2020-02-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: tests: prepare the replacement of calculator tests
+	Soon calculator tests for Java will move from java.at to calc.at.
+	Which implies improving the Java testing infrastructure in
+	local.at (for instance really tracking columns in positions, not just
+	token number).  Detach java.at from local.at.
+
+	* tests/java.at (AT_JAVA_POSITION_DEFINE_OLD): New.
+	Use it.
+
+2020-02-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: style: avoid useless initializers
+	Instead of
+
+	      /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+	       STATE-NUM.  */
+	      private static final byte yypact_[] = yypact_init ();
+	      private static final byte[] yypact_init ()
+	      {
+	        return new byte[]
+	        {
+	          25,    -7,    -8,    37,    -8,    40,    -8,    20,    -8,    61,
+	          -8,    -8,     3,     9,    51,    -8,    -8,    -2,    -2,    -2,
+	          -2,    -2,    -2,    -8,    -8,    -8,     1,    66,    66,     3,
+	           3,     3
+	        };
+	      }
+
+	generate
+
+	    /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+	       STATE-NUM.  */
+	      private static final byte[] yypact_ =
+	      {
+	          25,    -7,    -8,    37,    -8,    40,    -8,    20,    -8,    61,
+	          -8,    -8,     3,     9,    51,    -8,    -8,    -2,    -2,    -2,
+	          -2,    -2,    -2,    -8,    -8,    -8,     1,    66,    66,     3,
+	           3,     3
+	      };
+
+	I have no idea what motivated the previous approach.
+
+	* data/skeletons/java.m4 (b4_typed_parser_table_define): Here.
+
+2020-02-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: style: prefer putting the square brackets on the type
+	* examples/java/calc/Calc.y, examples/java/simple/Calc.y,
+	* tests/calc.at, tests/local.at: here.
+
+2020-02-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: examples: fix the tracking of locations
+	* examples/java/calc/Calc.y: The StreamTokenizer cannot "peek" for the
+	next character, it reads it, and keeps it for the next call.  So the
+	current location is one passed the end of the current token.  To avoid
+	this, keep the previous position, and use it to end the current token.
+	* examples/java/calc/Calc.test: Adjust.
+
+2020-02-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: examples: prefer switch to chains of else-if
+	* examples/java/calc/Calc.y, examples/java/simple/Calc.y: here.
+	* examples/java/simple/Calc.y: Use the tokenizer's handling of blanks.
+
+2020-02-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: examples: split in two
+	* examples/java: Split in...
+	* examples/java/simple, examples/java/calc: these.
+
+2020-02-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	traces: don't print the stack before the gotos
+	The C, C++ and D skeletons used to show the stack right after popping
+	the stack during the reduction.  Now that the stack is printed after
+	reaching a new state, that has become useless:
+
+	    Entering state 1
+	    Stack now 0 1
+	    Reducing stack by rule 5 (line 83):
+	       $1 = token "number" (1)
+	    -> $$ = nterm exp (1)
+	    Stack now 0
+	    Entering state 8
+	    Stack now 0 8
+
+	Remove the "Stack now 0" line.
+
+	* data/skeletons/lalr1.cc, data/skeletons/lalr1.d,
+	* data/skeletons/lalr1.java, data/skeletons/yacc.c:
+	Here.
+
+2020-02-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	traces: show the stack after reading a token
+	Currently, if we have long rules and series of shift, we stack states
+	without showing stack.  Let's be more incremental, and do how the Java
+	skeleton does.
+
+	* data/skeletons/lalr1.cc, data/skeletons/lalr1.d,
+	* data/skeletons/yacc.c:
+	Here.
+	Adjust test cases.
+	* tests/torture.at (AT_DATA_STACK_TORTURE): Disable stack traces: this
+	test produces a very large stack, and showing the stack each time we
+	shift a token goes quadatric.
+
+2020-02-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	traces: write the "Reading a token" alone on its line
+	The Java skeleton displays
+
+	    Reading a token:
+	    Next token is token "number" (1)
+
+	while the other display
+
+	    Reading a token: Next token is token "number" (1)
+
+	When generating logs in the scanner, the first part is separated from
+	the second, and the end of the scanner logs have the second part
+	pasted in.  So let's propagate the Java way, but with the colon.
+
+	* data/skeletons/glr.c, data/skeletons/lalr1.cc, data/skeletons/lalr1.d,
+	* data/skeletons/lalr1.java, data/skeletons/yacc.c: Do it.
+	Adjust test cases and doc.
+
+2020-02-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: use the same calc tests as the other skeletons
+	* tests/local.at (AT_LANG_MATCH): New.
+	(AT_YYERROR_DECLARE(java), AT_YYERROR_DECLARE_EXTERN(java)): New.
+	* tests/calc.at: The grammar file for Java is quite different for the
+	others, and continuing to assemble it from pieces makes the grammar
+	file hard to understand.  Let's also dispatch on the language to
+	assemble it, and isolate Java from the others.
+	Most of this comes from java.at.
+
+2020-02-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: add access to the number of errors
+	* data/skeletons/lalr1.java (yynewrrs, getNumberOfErrors): New.
+	Formatting changes.
+
+2020-02-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: formatting changes
+	* data/skeletons/java.m4, data/skeletons/lalr1.java: here.
+
+2020-02-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: avoid trailing white spaces
+	* data/skeletons/java.m4 (b4_maybe_throws): Issue a space before when needed.
+	* data/skeletons/lalr1.java: Avoid trailing spaces.
+
+2020-02-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: example: properly track the locations
+	This example, so far, was tracking the current token number, not the
+	current column number.  This is not nice for an example...
+
+	* examples/java/Calc.y (PositionReader): New.
+	Use it.
+	* examples/java/Calc.test: Check the output.
+
+2020-02-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: example: improve
+	* examples/java/Calc.y: Propagate the exit status.
+	Support -p.
+
+2020-02-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	java: example: rely on autoboxing
+	AFAICT, autoboxing/unboxing was added in Java 5 (September 30, 2004).
+	I think we can afford to use it.  It should help us merge some Java
+	tests with the main ones.
+
+	However, beware that != does not unbox: it compares the object
+	addresses.
+
+	* examples/java/Calc.y, tests/java.at: Simplify.
+	* examples/java/Calc.test, tests/java.at: Improve tests.
+
+2020-02-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: comment changes
+	* tests/calc.at: Shorten titles and reduce redundancy.
+
+2020-02-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	skeletons: add support for %code epilogue
+	When building the test cases, emitting code in the epilogue is very
+	constraining.  Let's make it simpler thanks to %code epilogue.
+
+	However, I don't want to document this: it is bad style to use it (we
+	should avoid having too many ways to write the same thing,
+	TI!MTOWTDI), just put your code in the true epilogue section.
+
+	* data/skeletons/glr.c, data/skeletons/lalr1.d, data/skeletons/lalr1.java,
+	* data/skeletons/yacc.c: Implement support for %code epilogue.
+	Remove useless comments.
+	* tests/calc.at, tests/java.at: Simplify.
+
+2020-02-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: bistromathic: fix location tracking
+	* examples/c/bistromathic/scan.l (LOCATION_STEP): New.
+	Use to properly ignore blanks.
+	* examples/c/bistromathic/bistromathic.test: Check that case.
+
+2020-02-02  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: document new features of parse.error
+	* doc/bison.texi (Error Reporting): Rename as...
+	(Error Reporting Function): this.
+	Adjust dependencies.
+	Make it a subsection of this...
+	(Error Reporting): new section.
+	(Syntax Error Reporting Function): New.
+	(parse.error): Update description.
+
+2020-01-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: add support for parse.error=custom
+	* data/skeletons/glr.c (yyreportSyntaxError): Call the user's
+	yyreport_syntax_error in custom mode.
+	* tests/calc.at: Check it.
+
+2020-01-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: add support for parse.error=detailed
+	* data/skeletons/glr.c (yystrlen, yysymbol_name): New.
+	Implement parse.error detailed.
+	* tests/calc.at: Check it.
+
+2020-01-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: introduce yyexpected_tokens and yysyntax_error_arguments
+	Modeled after what was done in yacc.c, yet somewhat different since
+	yyGLRStack play the role of the full yyparse_context_t.  It will
+	probably be defined as a alias, to make interfaces compatible.
+
+	LAC is not supported here.  And is somewhat tricky.
+
+	* data/skeletons/glr.c (yyexpected_tokens, yysyntax_error_arguments): New.
+
+2020-01-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: move code around
+	* data/skeletons/glr.c: Move the handling of error messages after the
+	definition of types.  Especially after yyGLRStack, which we will need
+	in forthcoming patches.
+	Simplify: yyGLRStack is defined at this point.
+
+2020-01-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: rename yyStateNum as yy_state_t
+	* data/skeletons/glr.c: here.
+	For consistency with yacc.c.
+
+2020-01-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: fix misleading indentation
+	* data/skeletons/yacc.c: here.
+
+2020-01-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: simplify uses of @ref
+	The PDF output is more consistent: some nodes were not pointed to with
+	their title.  The HTML output becomes "see section Foo" instead of
+	"see Foo", but this should be addressed in the next Texinfo release.
+	Info output is simplified, as it uses only the node name and not its
+	title.  But it's considered easier to read this way.
+	See https://lists.gnu.org/r/help-texinfo/2020-01/msg00031.html.
+
+	* doc/bison.texi: Set @xrefautomaticsectiontitle on.
+	Simplify all uses of ref.
+
+2020-01-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: be more robust to spaces in paths
+	Reported by Nikki Valen.
+	https://lists.gnu.org/r/bug-bison/2020-01/msg00032.html
+
+	* examples/test ($prog): Remove, replaced by...
+	(prog): This new function, which pays attention to quoting shell
+	variables.
+
+2020-01-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: don't pretend trigonometry is part of arithmetics
+	* doc/bison.texi (arith_funs): Rename as...
+	(funs): this.
+
+2020-01-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: update Doxygen template
+	* Doxyfile.in: Run doxygen -u on it.
+
+2020-01-27  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: add a complete example with all the bells and whistles
+	* examples/c/bistromathic/Makefile,
+	* examples/c/bistromathic/README.md,
+	* examples/c/bistromathic/bistromathic.test,
+	* examples/c/bistromathic/local.mk,
+	* examples/c/bistromathic/parse.y,
+	* examples/c/bistromathic/scan.l:
+	New.
+
+	* Makefile.am (AM_YFLAGS_WITH_LINES): Add -Wdangling-alias.
+	* examples/test: Make failure errors easier to read.
+
+2020-01-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: add an example of a push parser
+	Add an example to demonstrate the use of push parser.  I'm pleasantly
+	surprised: parse.error=detailed works like a charm with push parsers.
+
+	* examples/c/local.mk, examples/c/pushcalc/Makefile
+	* examples/c/pushcalc/README.md, examples/c/pushcalc/calc.test,
+	* examples/c/pushcalc/calc.y, examples/c/pushcalc/local.mk:
+	New.
+
+2020-01-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: more tests
+	* examples/c/mfcalc/mfcalc.test: here.
+
+2020-01-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: clean up
+	* examples/c/calc/calc.y: Restore to its original state, with
+	parse.error=detailed instead of parse.error=custom (this example
+	should be simple).
+	* examples/c/calc/calc.test: Check syntax errors.
+	* examples/c/lexcalc/parse.y: Add comments.
+
+2020-01-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: check custom error messages and push parsers
+	* tests/local.at (AT_LAC_IF): New.
+	* tests/calc.at: And also check the suppot for LAC.
+
+2020-01-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: formatting changes
+	* data/skeletons/lalr1.java: here.
+
+2020-01-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: update
+
+2020-01-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	bison: pretend to 3.6 already
+	* src/parse-gram.y: here.
+
+2020-01-26  Akim Demaille  <akim.demaille@gmail.com>
+
+	git: update ignores
+	* lib/.gitignore: here.
+
+2020-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	diagnostics: modernize bison's syntax errors
+	We used to display the unexpected token first:
+
+	    $ bison foo.y
+	    foo.y:1.8-13: error: syntax error, unexpected %token, expecting character literal or identifier or <tag>
+	        1 | %token %token
+	          |        ^~~~~~
+
+	GCC uses a different format:
+
+	    $ gcc-mp-9 foo.c
+	    foo.c:1:5: error: expected identifier or '(' before ')' token
+	        1 | int()()()
+	          |     ^
+
+	and so does Clang:
+
+	    $ clang-mp-9.0 foo.c
+	    foo.c:1:5: error: expected identifier or '('
+	    int()()()
+	        ^
+	    1 error generated.
+
+	They display the unexpected token last (or not at all).  Also, they
+	don't waste width with "syntax error".  Let's try that.  It gives, for
+	the same example as above:
+
+	    $ bison foo.y
+	    foo.y:1.8-13: error: expected character literal or identifier or <tag> before %token
+	        1 | %token %token
+	          |        ^~~~~~
+
+	* src/complain.h, src/complain.c (syntax_error): New.
+	* src/parse-gram.y (yyreport_syntax_error): Use it.
+
+2020-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	diagnostics: report syntax errors in color
+	* src/parse-gram.y (parse.error): Set to 'custom'.
+	(yyreport_syntax_error): New.
+	* data/bison-default.css (.expected, .unexpected): New.
+	* tests/diagnostics.at: Adjust.
+
+2020-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-01-23  Akim Demaille  <akim.demaille@gmail.com>
+
+	diagnostics: translate bison's own tokens
+	As a test case, support translations in Bison itself.
+
+	* src/parse-gram.y: Mark the translatable tokens.
+	While at it, use clearer names.
+	* tests/input.at: Adjust expectations.
+
+2020-01-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	diagnostics: handle -fno-caret in the called functions
+	Don't force callers of location_caret to have to deal with flags that
+	disable it.
+
+	* src/location.h, src/location.c (location_caret)
+	(location_caret_suggestion): Early return if disabled.
+	* src/complain.c: Simplify.
+
+2020-01-22  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: fixes
+	* data/skeletons/yacc.c: Avoid warnings about unused functions.
+	Fix typo.
+
+2020-01-21  Akim Demaille  <akim.demaille@gmail.com>
+
+	examples: be more robust to spaces in paths
+	Reported by Nikki Valen.
+	https://lists.gnu.org/r/bug-bison/2020-01/msg00032.html
+
+	* examples/test ($prog): Remove, replaced by...
+	(prog): This new function, which pays attention to quoting shell
+	variables.
+
+2020-01-21  Adrian Vogelsgesang  <avogelsgesang@tableau.com>
+
+	larlr1.cc: Reject unsupported values for parse.lac
+	Just as the yacc.c skeleton, the lalr1.cc skeleton should reject
+	invalid values for parse.lac.
+
+	* data/skeletons/lalr1.cc: check validity of parse.lac
+	* tests/input.at: new test cases
+
+2020-01-21  Adrian Vogelsgesang  <avogelsgesang@tableau.com>
+
+	larlr1.cc: Reject unsupported values for parse.lac
+	Just as the yacc.c skeleton, the lalr1.cc skeleton should reject
+	invalid values for parse.lac.
+
+	* data/skeletons/lalr1.cc: check validity of parse.lac
+	* tests/input.at: new test cases
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	parsers: issue tname with i18n markup
+	Some users would like to avoid having to "parse" the *.y file to find
+	the strings to translate.  Let's issue the translatable tokens with N_
+	to allow "parsing" the generated parsers instead.
+
+	See
+	https://lists.gnu.org/archive/html/bison-patches/2019-01/msg00015.html
+
+	* src/output.c (prepare_symbol_names): Issue symbol_names with N_()
+	markup.
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: check token internationalization
+	* tests/calc.at: Check it.
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	parsers: support translatable token aliases
+	In addition to
+
+	    %token NUM "number"
+
+	accept
+
+	    %token NUM _("number")
+
+	in which case the token will be translated in error messages.
+	Do not use _() in the output if there are no translatable tokens.
+
+	* src/symtab.h, src/symtab.c (symbol): Add a 'translatable' member.
+	* src/parse-gram.y (TSTRING): New token.
+	(string_as_id.opt): Replace with...
+	(alias): this.
+	Use it.
+	* src/scan-gram.l (SC_ESCAPED_TSTRING): New start conditions, to match
+	TSTRINGs.
+	* src/output.c (prepare_symbols): Define b4_translatable if there are
+	translatable strings.
+
+	* data/skeletons/glr.c, data/skeletons/lalr1.cc,
+	* data/skeletons/yacc.c (yytnamerr): Receive b4_translatable, and use it.
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: check that detailed error messages preserve UTF-8 characters
+	* tests/regression.at: here.
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: escape trigraphs in detailed parse.error
+	* src/output.c (escape_trigraphs, xescape_trigraphs): New.
+	(prepare_symbol_names): Use it.
+	* tests/regression.at: Check the handling of trigraphs with
+	parse.error = detailed.
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	bison: use detailed error messages
+	* #: .
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: tests: check detailed error messages
+	* tests/local.at (AT_ERROR_DETAILED_IF): New.
+	(AT_ERROR_SIMPLE_IF): Adjust.
+	* tests/calc.at: Check parse.error=detailed.
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: add support for parse.error detailed
+	"detailed" error messages are almost like "verbose", except that we
+	don't double escape them, they don't get inner quotes, we don't use
+	yytnamerr, and we hide the table.
+
+	"custom" is exposed with the "detailed" tokens, not the "verbose"
+	ones: they are not double-quoted.
+
+	Because there's a risk that some people use yytname even without
+	"verbose", let's keep yytname (instead of yys_name) in "simple"
+	parse.error.
+
+	* src/output.c (prepare_symbol_names): Be ready to output symbol names
+	unquoted.
+	(prepare_symbol_names): Output both the old tname table, and the new
+	symbol_names one.
+	* data/skeletons/bison.m4: Accept 'detailed'.
+	* data/skeletons/yacc.c: When parse.error is 'detailed', don't emit
+	yytname and yytnamerr, just yysymbol_name with the table inside.
+	* tests/calc.at: Adjust.
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	c: use yysymbol_name in traces
+	Only parse.error verbose and simple will get the original yytname: the
+	other options will rely on a different table.  So let's move on top of
+	the yysymbol_name function.
+
+	* data/skeletons/c.m4 (yy_symbol_print): Use yysymbol_name.
+	* data/skeletons/glr.c (yytokenName): Rename as...
+	(yysymbol_name): this.
+	The change of naming scheme is unfortunate, but it's definitely glr.c
+	which is "wrong".
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: move some functions after the definition of types
+	Currently yy_symbol_print is defined before yytokenName, although it
+	should use it instead of read yytname directly.  Move blocks around to
+	avoid this.
+
+	* data/skeletons/glr.c (yy_symbol_print): Move its definition after
+	that of yytokenName.
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	Merge branch 'maint'
+	* maint:
+	  maint: post-release administrivia
+	  version 3.5.1
+	  news: update
+	  CI: use ICC again
+	  warnings: pacify ICC in lalr1.cc
+	  test: report.at: avoid tiny new failure
+	  git: update ignores
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	version 3.5.1
+	* NEWS: Record release date.
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	news: update
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	CI: use ICC again
+	See https://github.com/nemequ/icc-travis/issues/15.
+	Thanks to Jeff Hammond and Evan Nemerson for their help.
+
+	* configure.ac (warn_common): Disable dubious warnings.
+	* .travis.yml: Use ICC again.
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	warnings: pacify ICC in lalr1.cc
+	See 139d0655947c87f90af08718618feaaca0e558d7.
+
+	* data/skeletons/yacc.c: If I might be a char, write a[+I] instead of
+	a[I], so that ICC does not complain.
+
+2020-01-19  Jim Meyering  <meyering@fb.com>
+
+	test: report.at: avoid tiny new failure
+	Be robust to newer versions of Autoconf where the package URL defaults
+	to https instead of http.
+
+	* configure.ac (AC_INIT): Use https.
+	* tests/report.at: Adjust expected output s/http/https/
+	to match updated URL.
+
+2020-01-19  Akim Demaille  <akim.demaille@gmail.com>
+
+	git: update ignores
+
+2020-01-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-01-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: portability to G++ 4.8
+	Currently we get warnings with GCC 4.8 when running the
+	maintainer-check-g++ tests:
+
+	    143. skeletons.at:85: testing Installed skeleton file names ...
+	    ../../tests/skeletons.at:120: COLUMNS=1000; export COLUMNS;  bison --color=no -fno-caret --skeleton=yacc.c -o input-cmd-line.c input-cmd-line.y
+	    ../../tests/skeletons.at:121: $CC $CFLAGS $CPPFLAGS  $LDFLAGS -o input-cmd-line input-cmd-line.c $LIBS
+	    stderr:
+	    input-cmd-line.c: In function 'int yysyntax_error(long int*, char**, const yyparse_context_t*)':
+	    input-cmd-line.c:977:52: error: conversion to 'int' from 'long int' may alter its value [-Werror=conversion]
+	                                       YYSIZEOF (yyarg) / YYSIZEOF (*yyarg));
+	                                                        ^
+	    cc1plus: all warnings being treated as errors
+	    stdout:
+	    ../../tests/skeletons.at:121: exit code was 1, expected 0
+
+	and
+
+	    429. calc.at:823: testing Calculator parse.error=custom %locations api.prefix={calc}  ...
+	    ../../tests/calc.at:823: COLUMNS=1000; export COLUMNS;  bison --color=no -fno-caret -Wno-deprecated -o calc.c calc.y
+	    ../../tests/calc.at:823: $CC $CFLAGS $CPPFLAGS  $LDFLAGS -o calc calc.c $LIBS
+	    stderr:
+	    calc.y: In function 'int yyreport_syntax_error(const yyparse_context_t*)':
+	    calc.y:157:58: error: conversion to 'int' from 'long unsigned int' may alter its value [-Werror=conversion]
+	       int n = yysyntax_error_arguments (ctx, arg, sizeof arg / sizeof *arg);
+	                                                              ^
+	    cc1plus: all warnings being treated as errors
+	    stdout:
+	    ../../tests/calc.at:823: exit code was 1, expected 0
+
+	We could use a cast to avoid the warning, but it becomes too
+	cluttered.  We can also use YYPTRDIFF_T, but that forces the user to
+	use YYPTRDIFF_T too, although this is an array of tokens, which is
+	limited by YYNTOKENS, an int.  So let's completely avoid this warning.
+
+	* data/skeletons/yacc.c, tests/local.at (yyreport_syntax_error): Avoid
+	relying on sizeof to compute the array capacity.
+
+2020-01-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: pass the parse-params to yyreport_syntax_error
+	Enhance the calculator tests: show that passing arguments to yyerror
+	works.
+
+	* tests/calc.at: Add a new parse-param, nerrs, which counts the number
+	of syntax errors in a run.
+	* tests/local.at: Adjust to handle the new 'nerrs' argument, when
+	present.
+
+	The custom error reporting function show sees the user's additional
+	arguments.  Let's experiment with passing them as arguments to
+	yyreport_syntax_error, but maybe storing them in the context would be
+	a bettter alternative.
+
+	* data/skeletons/yacc.c (yyreport_syntax_error): Handle the
+	parse-params.
+	* tests/calc.at, tests/local.at: Adjust.
+
+2020-01-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: a clearer test for parse-params
+	Currently the parse-params are tested in calc.at by checking that the
+	global variable and the parse-params have the same value.  But it does
+	not check that value, that could remain being 0 just as well.
+
+	* tests/calc.at: Don't define the params when they are not used.
+	Check the final value of result and count.
+	Also, do count the number of line of logs.
+
+2020-01-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: check custom error messages with parse-params
+	* tests/calc.at: Check with prefix and parse-params.
+
+2020-01-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: let custom error messages see the location
+	* data/skeletons/yacc.c (yyparse_context_t): Add yylloc when
+	applicable.
+	(yyparse_context_location): New.
+	* tests/local.at (AT_YYERROR_DEFINE(c)): Handle the location.
+	* tests/calc.at: Check it.
+
+2020-01-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: isolate yyexpected_tokens
+	Provide users with a means to query for the currently allowed tokens.
+	Could be used for autocompletion for instance.
+
+	* data/skeletons/yacc.c (yyexpected_tokens): New, extracted from
+	yysyntax_error_arguments.
+	* examples/c/calc/calc.y (PRINT_EXPECTED_TOKENS): New.
+	Use it.
+
+2020-01-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: compute verbose error messages from the custom ones
+	We use a different format to check parse.error custom.  Compute the
+	"verbose" one from it instead of forcing the test author to provide
+	the various formats of expected error messages.
+
+	* tests/calc.at (_AT_CHECK_CALC_ERROR): Handle this transformation
+	when needed.
+	Simplify callers.
+
+2020-01-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: check custom error messages
+	* tests/local.at (AT_ERROR_CUSTOM_IF, AT_ERROR_VERBOSE_IF)
+	(AT_ERROR_SIMPLE_IF): New.
+	(AT_YYERROR_DEFINE(c)): Generate yyreport_syntax_error.
+	* tests/calc.at (_AT_CHECK_CALC_ERROR): Accept custom error messages
+	as additional test case.
+	Use it.
+	Add a new test case for %define parse.error custom.
+
+2020-01-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: add custom error message generation
+	When parse.error is custom, let users define a yyreport_syntax_error
+	function, and use it.
+
+	* data/skeletons/bison.m4 (b4_error_verbose_if): Accept 'custom'.
+	* data/skeletons/yacc.c: Implement it.
+	* examples/c/calc/calc.y: Experiment with it.
+
+2020-01-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: style: avoid macros
+	* data/skeletons/yacc.c (YYSYNTAX_ERROR): Remove, the call is now
+	sufficiently small so that we can afford to duplicate it.
+
+2020-01-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: store token numbers, not token strings
+	That allows users to cover more cases, such as easily filtering some
+	arguments they don't want to expose.  But they now have to call
+	yysymbol_name explicitly.
+
+	* data/skeletons/yacc.c (yysyntax_error_arguments, yysyntax_error):
+	Deal with symbol numbers instead of symbol names.
+
+2020-01-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: extract yyerror_message_arguments
+	Isolate a function that returns the list of expected and unexpected
+	tokens.  It will be exposed to users willing to customize their error
+	messages.
+
+	* data/skeletons/yacc.c (yyparse_context_t): New.
+	(yyerror_message_arguments): New, extracted from yysyntax_error.
+
+2020-01-17  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-01-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: make AT_PARSE_PARAMS usable at the end of arguments
+	When not empty, AT_PARSE_PARAMS was guaranteed to end with a comma.
+	Remove the trailing comma, so that we can use AT_PARSE_PARAMS at the
+	end of the arguments, not only at the beginning.
+
+	* tests/local.at: here.
+	Unfortunately, m4_append relies on the macro not being defined whereas
+	we would have preferred it to check for emptiness.  So use
+	m4_define/m4_undefine instead of m4_pushdef/m4_popdef.
+
+2020-01-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: fix AT_BISON_OPTION_PUSHDEFS, AT_BISON_OPTION_POPDEFS pairs
+	* tests/glr-regression.at, tests/java.at, tests/javapush.at:
+	Close properly what is opened.
+	Do not nest.
+
+2020-01-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	d, java: use traces more alike that of C
+	Same order, same places, same content.
+
+	* data/skeletons/lalr1.d, data/skeletons/lalr1.java: here.
+
+2020-01-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: report the stack at the same places as in C
+	Let's have C be the reference, and match it elsewhere.  Maybe C is too
+	verbose and some adjustments are needed, but then that would be done
+	in another batch of patches.
+
+	* data/skeletons/lalr1.cc: Print the stack once we popped after
+	YYERROR, and before emptying the stack at the end of parsing.
+
+2020-01-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	c++: display the stack in the same order as in C
+	Currently the C and C++ parse traces differ in the order in which the
+	stack is displayed: bottom up in C, top down in C++.  Let's stick to
+	the C order.
+
+	* data/skeletons/stack.hh (stack::iterator, stack::const_iterator)
+	(begin, end): Be forward, not backward.
+
+2020-01-15  Akim Demaille  <akim.demaille@gmail.com>
+
+	style: avoid redundancy in the tests
+	* tests/local.at (m4_rpatsubst): New.
+	Use it to handle %parse-params.
+	* tests/calc.at: Use %parse-params with several arguments.
+
+2020-01-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: comment changes
+	In particular, import Adrian Vogelsgesang's comments about LAC from
+	lalr1.cc.
+
+	* data/skeletons/yacc.c: here.
+
+2020-01-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: style: double-quote the argument of b4_percent_define_get
+	* data/skeletons/yacc.c: Here, for consistency.
+
+2020-01-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: introduce yysymbol_name
+	Provide the users with a public API to get the name of the tokens.  A
+	thin wrapper around yytname.
+
+	* data/skeletons/yacc.c (yysymbol_name): New.
+	Use it.
+
+2020-01-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	CI: check on PPC64le, ARM64 and s390x
+	I was hoping it would help us catch warnings when char is
+	unsigned (see 78bb152a63f711af65364881c434af4c198e1ee0), but it does
+	not seem to help.  It's a pity that the compiler is the same all over
+	the place, I would have preferred testing others.
+
+	* .travis.yml: here.
+
+2020-01-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	todo: update
+
+2020-01-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	Merge branch 'maint' into HEAD
+	* maint:
+	  gnulib: update
+	  lalr1.cc: avoid static_cast
+	  glr.c: add missing cast
+	  regen
+	  package: bump copyrights to 2020
+	  gitignore: update
+
+2020-01-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	gnulib: update
+
+2020-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	lalr1.cc: avoid static_cast
+	Reported by donmac703.
+	Fixes https://github.com/akimd/bison/issues/20.
+
+	* data/skeletons/lalr1.cc: here.
+
+2020-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: add missing cast
+	Reported by psjo.
+	Fixes https://github.com/akimd/bison/issues/19.
+
+	* data/skeletons/glr.c (yyprocessOneStack): Here.
+
+2020-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	package: bump copyrights to 2020
+	Run 'make update-copyright'.
+
+2020-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	gitignore: update
+
+2020-01-10  Akim Demaille  <akim.demaille@gmail.com>
+
+	regen
+
+2020-01-09  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: simplify use of YYDPRINTF
+	* data/skeletons/yacc.c (YYDPRINTF): Expand to no-op (instead of
+	nothing) when disabled.
+	Simplify callers.
+
+2020-01-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	package: bump copyrights to 2020
+	Run 'make update-copyright'.
+
+2020-01-05  Akim Demaille  <akim.demaille@gmail.com>
+
+	gitignore: update
+
+2020-01-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: YYERROR_VERBOSE is no longer supported
+	* doc/bison.texi (Table of Symbols): Remove last reference to it.
+	* NEWS: Be clear about that.
+
+2020-01-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: no longer support YYERROR_VERBOSE
+	* data/skeletons/glr.c: Rather, dispatch directly on parse.error's
+	value.
+
+2020-01-04  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: no longer support YYERROR_VERBOSE
+	Supporting YYERROR_VERBOSE via cpp is a nuisance: m4 is in charge of
+	handling alternatives.  When adding more options for %define
+	parse.error, supporting both CPP and M4 is too complex.  Anyway,
+	YYERROR_VERBOSE was deprecated long ago.
+
+	* data/skeletons/yacc.c: Use m4 only to handle verbose/simple error
+	messages.
+
+2020-01-03  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc.c: avoid negations
+	* data/skeletons/yacc.c (yyerrlab): here.
+
+2019-12-31  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.c: clarify yyreportSyntaxError
+	See the previous commit.
+
+	* data/skeletons/glr.c (yyreportSyntaxError): First compute the
+	arguments of the error message, _then_ th error message size.
+
+2019-12-31  Akim Demaille  <akim.demaille@gmail.com>
+
+	yacc: restructure and fix yysyntax_error
+	I would like to offer new ways to build the error message.  As a first
+	step, let's simplify yysyntax_error whose first loop does two things
+	at the same time: (i) collect the tokens to be reported in the error
+	message, and (ii) accumulate their sizes and possibly return
+	"overflow".  Let's pull (ii) in a second step.
+
+	Then test 525 (regression.at:1193: parse.error=verbose overflow)
+	failed.  This test checks that we correctly report "memory overflow"
+	when the error message is too large.  However the test is mistaken: it
+	is triggered in a place where there are five (large) expected tokens,
+	so anyway we would not display them, so there is no (memory) overflow
+	here!  Transform this test to (i) check that indeed there is no
+	overflow, and (ii) create syntax_error3 which does check the intended
+	behavior, but with four expected tokens.
+
+	* data/skeletons/yacc.c (yysyntax_error): First compute the list of
+	arguments, then compute yysize.
+	* tests/regression.at (parse.error=verbose overflow): Enhance and fix.
+
+2019-12-31  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: also check -Wchar-subscripts
+	GCC's -Wchar-subscripts may report issues on platforms where char is
+	unsigned.  Unfortunately the current CI does not reproduce the
+	problem.  But that would allow contributors to report issues if the
+	warning appears somewhere.
+
+	See 139d0655947c87f90af08718618feaaca0e558d7.
+	Problem reported by Andy Fiddaman in:
+	https://lists.gnu.org/r/bug-bison/2019-12/msg00021.html
+
+	* configure.ac (warn_common): Add -Wchar-subscripts.
+
+2019-12-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	CI: do not specify the language
+	When we give travis the langugage, it overrides our envvars.  Instead
+	of the MATRIX_EVAL trick, just stop specifying the language.
+
+2019-12-30  Akim Demaille  <akim.demaille@gmail.com>
+
+	CI: remove ICC support, we can no longer use it
+	https://github.com/nemequ/icc-travis/issues/15
+
+2019-12-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: clean up the description of YYDEBUG
+	* doc/bison.texi: Make it clearer that %define parse.trace is the
+	preferred options.
+	Fix a typo about api.prefix.
+
+2019-12-29  Akim Demaille  <akim.demaille@gmail.com>
+
+	glr.cc: avoid compiler warnings
+	    381. types.at:366: testing glr.cc api.value.type={double} ...
+	    test.cc:207:57: error: "__clang_major__" is not defined, evaluates to 0 [-Werror=undef]
+	      207 | #if defined __APPLE__ && YY_CPLUSPLUS < 201103L && 4 <= __clang_major__
+	          |                                                         ^~~~~~~~~~~~~~~
+
+	* data/skeletons/glr.cc: Check __clang_major__ before using it.
+
+2019-12-18  Paul Eggert  <eggert@cs.ucla.edu>
+
+	warnings: pacify ‘gcc -Wchar-subscripts’ in yacc.c
+	Problem reported by Andy Fiddaman in:
+	https://lists.gnu.org/r/bug-bison/2019-12/msg00021.html
+	* data/skeletons/yacc.c (yy_reduce_print, yy_lac, yysyntax_error)
+	(yyreturn): If I might be a char, write a[+I] instead of a[I],
+	so that ‘gcc -Wchar-subscripts’ does not complain.
+
+2019-12-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	doc: formatting changes
+	* doc/bison.texi: No output changes.
+
+2019-12-14  Akim Demaille  <akim.demaille@gmail.com>
+
+	tests: don't fail if seq is no available
+	As is the case on Solaris.
+	Reported by Dennis Clarke.
+	https://lists.gnu.org/archive/html/bug-bison/2019-12/msg00011.html
+
+	* examples/c/reccalc/reccalc.test: Skip if there is no seq.
+
+2019-12-11  Akim Demaille  <akim.demaille@gmail.com>
+
+	maint: post-release administrivia
+	* NEWS: Add header line for next release.
+	* .prev-version: Record previous version.
+	* cfg.mk (old_NEWS_hash): Auto-update.
+
 2019-12-11  Akim Demaille  <akim.demaille@gmail.com>
 
 	version 3.5
diff --git a/ChangeLog-2012 b/ChangeLog-2012
index c53408d..882818f 100644
--- a/ChangeLog-2012
+++ b/ChangeLog-2012
@@ -77,7 +77,7 @@
 	Empty unions are not accepted by the ISO C99 grammar or by at
 	least some versions of Sun Studio.  Reported by Wolfgang S. Kechel
 	at
-	<http://lists.gnu.org/archive/html/bug-bison/2011-08/msg00003.html>.
+	<https://lists.gnu.org/r/bug-bison/2011-08/msg00003.html>.
 	* NEWS (2.5.1): Document fix.
 	* THANKS (Wolfgang S. Kechel): Add.
 	* tests/existing.at (GNU Cim Grammar)
@@ -104,7 +104,7 @@
 	build: avoid YACC typo inherited from Autoconf.
 	The typo shows up in the `configure --help' output.  Reported by
 	W.C.A. Wijngaards and Paul Eggert at
-	<http://lists.gnu.org/archive/html/bug-bison/2011-07/msg00000.html>.
+	<https://lists.gnu.org/r/bug-bison/2011-07/msg00000.html>.
 	* README-hacking (Release Procedure): Remind about updating
 	maintainer tools before a release.
 	* THANKS (W.C.A. Wijngaards): Add.
@@ -115,7 +115,7 @@
 
 	build: create xz instead of bzip2 tarballs.
 	Suggested by Jim Meyering at
-	<http://lists.gnu.org/archive/html/bug-bison/2011-06/msg00012.html>.
+	<https://lists.gnu.org/r/bug-bison/2011-06/msg00012.html>.
 	* README-hacking (Release Procedure): Update example.
 	* configure.ac (AM_INIT_AUTOMAKE): Replace dist-bzip2 with
 	dist-xz.
@@ -153,7 +153,7 @@
 
 	doc: motivate named references.
 	Suggested by Hans Aberg at
-	<http://lists.gnu.org/archive/html/bug-bison/2011-05/msg00008.html>.
+	<https://lists.gnu.org/r/bug-bison/2011-05/msg00008.html>.
 	* doc/bison.texinfo (Named References): Explain briefly how
 	they're better than the traditional positional references.
 
@@ -161,7 +161,7 @@
 
 	doc: discuss named references after locations.
 	Reported by Hans Aberg at
-	<http://lists.gnu.org/archive/html/bug-bison/2011-05/msg00008.html>.
+	<https://lists.gnu.org/r/bug-bison/2011-05/msg00008.html>.
 	* NEWS (2.5.1): Document.
 	* doc/bison.texinfo (Named References): Because it discusses
 	locations in addition to semantic values, move this subsection out
@@ -187,7 +187,7 @@
 	configure with --enable-gcc-warnings) and the sources that Bison
 	users build.  Instead, use PACIFY_CC, which doesn't.  This change
 	fixes compiler warnings reported by Tys Lefering at
-	<http://lists.gnu.org/archive/html/bison-patches/2011-05/msg00004.html>.
+	<https://lists.gnu.org/r/bison-patches/2011-05/msg00004.html>.
 	* configure.ac: Don't AC_DEFINE lint regardless of the configure
 	options.  This change affects imported gnulib sources, where
 	IF_LINT still appears and depends on lint.
@@ -242,7 +242,7 @@
 
 	tests: pacify gcc 4.6.0's -Wunused-but-set-variable.
 	Reported by Jim Meyering at
-	<http://lists.gnu.org/archive/html/bug-bison/2011-04/msg00002.html>.
+	<https://lists.gnu.org/r/bug-bison/2011-04/msg00002.html>.
 	* tests/actions.at
 	(Default %printer and %destructor for mid-rule values): Define
 	YYLLOC_DEFAULT so that it uses its Rhs argument.
@@ -254,7 +254,7 @@
 	about yyresolveLocations's local yyrhsloc.  When locations are
 	enabled, there's no such warning because YYLLOC_DEFAULT then uses
 	yyrhsloc.  Reported by Jim Meyering at
-	<http://lists.gnu.org/archive/html/bug-bison/2011-04/msg00002.html>.
+	<https://lists.gnu.org/r/bug-bison/2011-04/msg00002.html>.
 	* data/glr.c (yyresolveLocations): Omit definition when locations
 	are disabled.
 	(yyresolveValue): Omit yyresolveLocations invocation when
@@ -282,7 +282,7 @@
 
 	Fix missing updates to GPLv3.
 	Reported by Tys Lefering at
-	<http://lists.gnu.org/archive/html/bison-patches/2011-04/msg00000.html>.
+	<https://lists.gnu.org/r/bison-patches/2011-04/msg00000.html>.
 	* src/print-xml.c, src/print-xml.h: In these files.
 
 2011-03-27  Joel E. Denny  <joeldenny@joeldenny.org>
@@ -291,7 +291,7 @@
 	Thus, conflict reports are now affected by -Werror and -Wnone
 	(unless %expect or %expect-rr is specified).  Reported by George
 	Neuner at
-	<http://lists.gnu.org/archive/html/bug-bison/2010-08/msg00002.html>.
+	<https://lists.gnu.org/r/bug-bison/2010-08/msg00002.html>.
 	* NEWS (2.5): Document.
 	* doc/bison.texinfo (Bison Options): Document.
 	* src/complain.c, src/complain.h (set_warning_issued): Export
@@ -327,7 +327,7 @@
 
 	Add -Wother so -Wnone suppresses all warnings.
 	Reported by George Neuner at
-	<http://lists.gnu.org/archive/html/bug-bison/2010-08/msg00002.html>.
+	<https://lists.gnu.org/r/bug-bison/2010-08/msg00002.html>.
 	* NEWS (2.5): Document.
 	* THANKS (George Neuner): Add.
 	* doc/bison.texinfo (Bison Options): Document.
@@ -356,7 +356,7 @@
 
 	Don't let -Wnone disable -Werror.
 	Discussed at
-	<http://lists.gnu.org/archive/html/bison-patches/2010-08/msg00009.html>.
+	<https://lists.gnu.org/r/bison-patches/2010-08/msg00009.html>.
 	* NEWS (2.5): Document.
 	* src/getargs.c (flags_argmatch): Accept a new argument that
 	specifies what flags "all" and thus "none" affect.
@@ -397,7 +397,7 @@
 	named references: fix double free.
 	In `rhs[name]: "a" | "b"', do not free "name" twice.
 	Reported by Tys Lefering.
-	<http://lists.gnu.org/archive/html/bug-bison/2010-06/msg00002.html>
+	<https://lists.gnu.org/r/bug-bison/2010-06/msg00002.html>
 	* src/named-ref.h, src/named-ref.c (named_ref_copy): New.
 	* src/parse-gram.y (current_lhs): Rename as...
 	(current_lhs_symbol): this.
@@ -432,7 +432,7 @@
 
 	java: fix parser stack popping bug.
 	Reported at
-	<http://lists.gnu.org/archive/html/bug-bison/2011-02/msg00005.html>.
+	<https://lists.gnu.org/r/bug-bison/2011-02/msg00005.html>.
 	* THANKS (Angelo Borsotti): Add.
 	* data/lalr1.java (YYParser::YYStack::pop): Fix off-by-one error
 	in clearing the value stack.  Previously, the top element of the
@@ -520,7 +520,7 @@
 
 	java: fix location handling bug.
 	Reported at
-	<http://lists.gnu.org/archive/html/bison-patches/2011-02/msg00005.html>.
+	<https://lists.gnu.org/r/bison-patches/2011-02/msg00005.html>.
 	* data/lalr1.java (YYParser::yylloc): For non-empty RHS, fix
 	reversed access to location stack.
 	* THANKS (Bernd Kiefer): Add.
@@ -548,7 +548,7 @@
 
 	doc: finish splitting apart the manual's Decl Summary section.
 	Suggested by Akim Demaille at
-	<http://lists.gnu.org/archive/html/bison-patches/2009-05/msg00013.html>.
+	<https://lists.gnu.org/r/bison-patches/2009-05/msg00013.html>.
 	* doc/bison.texinfo (Decl Summary): Extract most of the %define
 	entry into...
 	(%define Summary): ... this new subsection, and update all
@@ -562,7 +562,7 @@
 
 	doc: begin to split apart the manual's Decl Summary section.
 	Discussed in thread starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2009-05/msg00013.html>.
+	<https://lists.gnu.org/r/bison-patches/2009-05/msg00013.html>.
 	* doc/bison.texinfo (Decl Summary): Extract most of the %code
 	entry into...
 	(%code Summary): ... this new subsection, and update all
@@ -619,8 +619,8 @@
 	parses `%token ID -123' as `%token ID - 123' and handles `-' as an
 	identifier.  Now, `-' cannot be an identifier.  Discussed in
 	threads beginning at
-	<http://lists.gnu.org/archive/html/bug-bison/2011-01/msg00000.html>,
-	<http://lists.gnu.org/archive/html/bug-bison/2011-01/msg00004.html>.
+	<https://lists.gnu.org/r/bug-bison/2011-01/msg00000.html>,
+	<https://lists.gnu.org/r/bug-bison/2011-01/msg00004.html>.
 	* NEWS (2.5): Update entry describing the dash extension to
 	grammar symbol names.  Also, move that entry before the named
 	references entry because the latter mentions the former.
@@ -664,7 +664,7 @@
 	name.  In reality, this is a syntax error, so the reference is
 	invalid regardless of the symbols actually appearing in the
 	production.  Discussed at
-	<http://lists.gnu.org/archive/html/bison-patches/2011-01/msg00012.html>.
+	<https://lists.gnu.org/r/bison-patches/2011-01/msg00012.html>.
 	* src/scan-code.l (parse_ref): Report the above case as a syntax
 	error.  Other than that, continue to handle this case like any
 	other invalid reference that Bison manages to parse because
@@ -675,7 +675,7 @@
 
 	doc: don't use @acronym.
 	Lately, many GNU packages are dropping it.  See
-	<http://lists.gnu.org/archive/html/bison-patches/2011-01/msg00003.html>.
+	<https://lists.gnu.org/r/bison-patches/2011-01/msg00003.html>.
 	* doc/bison.texinfo: Remove all uses.
 
 2011-01-05  Alex Rozenman  <rozenman@gmail.com>
@@ -683,7 +683,7 @@
 	Do not allow identifiers that start with a negative number.
 	Reported by Paul Hilfinger as a side effect of named references
 	support at
-	<http://lists.gnu.org/archive/html/bug-bison/2011-01/msg00000.html>.
+	<https://lists.gnu.org/r/bug-bison/2011-01/msg00000.html>.
 	Suggested by Paul Eggert.
 	* src/scan-code.l ({letter}, {id}): Adjust lexical definitions.
 	* src/scan-gram.l ({letter}, {id}): Likewise.
@@ -711,7 +711,7 @@
 	maint: prepare to use year ranges in copyright notices.
 	* README (Copyright statements): New section explaining the range
 	notation.  The GNU maintainers document requires this explanation:
-	<http://www.gnu.org/prep/maintain/maintain.html#Copyright-Notices>.
+	<https://www.gnu.org/prep/maintain/maintain.html#Copyright-Notices>.
 	I copied our explanation from coreutils.
 	* build-aux/update-b4-copyright: Revert 2010-06-17 changes that
 	disabled Bison's automated use of ranges.
@@ -791,7 +791,7 @@
 
 	parse.lac: implement as %define variable.
 	LAC = lookahead correction.  See discussion at
-	<http://lists.gnu.org/archive/html/bison-patches/2009-09/msg00034.html>.
+	<https://lists.gnu.org/r/bison-patches/2009-09/msg00034.html>.
 	However, one point there must be corrected: because of %nonassoc,
 	LAC is *not* always redundant for lr.type=canonical-lr.
 	* data/yacc.c: Accept values of "none" (default) or "full" for
@@ -919,7 +919,7 @@
 	Fix portability problem on OpenBSD 4.7.
 
 	Jim Meyering reported this in
-	<http://lists.gnu.org/archive/html/bug-bison/2010-10/msg00007.html>.
+	<https://lists.gnu.org/r/bug-bison/2010-10/msg00007.html>.
 	* data/yacc.c: Use EXIT_SUCCESS as a witness for stdlib.h,
 	not _STDLIB_H.  EXIT_SUCCESS has been defined by the standard
 	for quite some time.
@@ -983,8 +983,8 @@
 
 	maint: add gettext version to release announcements.
 	Suggested by Paul Hilfinger at
-	<http://lists.gnu.org/archive/html/bison-patches/2010-07/msg00019.html>
-	<http://lists.gnu.org/archive/html/bison-patches/2010-08/msg00002.html>.
+	<https://lists.gnu.org/r/bison-patches/2010-07/msg00019.html>
+	<https://lists.gnu.org/r/bison-patches/2010-08/msg00002.html>.
 	* cfg.mk (bootstrap-tools): Add gettext.
 
 2010-08-04  Joel E. Denny  <joeldenny@joeldenny.org>
@@ -1112,10 +1112,10 @@
 	Update from GFDL GFDL 1.2 to 1.3.
 	* doc/bison.texinfo: Update GFDL version number.
 	* doc/fdl.texi: Update to version 1.3, taken from:
-	http://www.gnu.org/licenses/fdl.texi
+	https://www.gnu.org/licenses/fdl.texi
 
 	Do not use date ranges in copyright notices.
-	See http://www.gnu.org/prep/maintain/maintain.html#Copyright-Notices
+	See https://www.gnu.org/prep/maintain/maintain.html#Copyright-Notices
 
 	* HACKING, Makefile.am, NEWS, PACKAGING, README, README-alpha:
 	* TODO, bootstrap, bootstrap.conf:
@@ -1289,7 +1289,7 @@
 	That is, keep them as warnings because that should be sufficient
 	to satisfy POSIX without creating backward compatibility issues.
 	Suggested by Richard Stallman at
-	<http://lists.gnu.org/archive/html/bison-patches/2010-03/msg00033.html>.
+	<https://lists.gnu.org/r/bison-patches/2010-03/msg00033.html>.
 	* NEWS (2.5): Remove mention of complaint.
 	* src/reader.c (grammar_rule_check): Convert complaint back to
 	warning.
@@ -1299,7 +1299,7 @@
 
 	build: don't require src/bison during bootstrap.
 	Suggested by Eric Blake at
-	<http://lists.gnu.org/archive/html/bug-bison/2010-03/msg00003.html>.
+	<https://lists.gnu.org/r/bug-bison/2010-03/msg00003.html>.
 	* bootstrap.conf (bootstrap_epilogue): New function to make sure
 	src/parse-gram.[ch] are stamped later than src/parse-gram.y.
 
@@ -1307,7 +1307,7 @@
 
 	i18n: fix untranslatable string.
 	Reported by Goran Uddeborg at
-	<http://lists.gnu.org/archive/html/bug-bison/2010-03/msg00000.html>.
+	<https://lists.gnu.org/r/bug-bison/2010-03/msg00000.html>.
 	* src/muscle-tab.c (muscle_percent_define_insert): Here.
 
 2010-04-13  Akim Demaille  <demaille@gostai.com>
@@ -1366,7 +1366,7 @@
 
 	tests: fix for newer Sun Studio C++.
 	Reported by Dagobert Michelsen at
-	<http://lists.gnu.org/archive/html/bug-bison/2010-03/msg00023.html>.
+	<https://lists.gnu.org/r/bug-bison/2010-03/msg00023.html>.
 	* THANKS (Dagobert Michelsen): Add.
 	* configure.ac (AC_PREREQ): Set to 2.64 so we get the latest
 	Autoconf macro for handling the restrict keyword.
@@ -1377,7 +1377,7 @@
 
 	portability: fix pointer arithmetic to conform to C standard.
 	Reported by Tys Lefering at
-	<http://lists.gnu.org/archive/html/bug-bison/2010-03/msg00035.html>.
+	<https://lists.gnu.org/r/bug-bison/2010-03/msg00035.html>.
 	This fix is already implemented in glr.c and does not apply to
 	lalr1.java.
 	* data/lalr1.cc (yy::parser::parse): Increase size of
@@ -1401,7 +1401,7 @@
 
 	portability: fix test suite for GCC 4.5's new #error message.
 	Reported by Tys Lefering at
-	<http://lists.gnu.org/archive/html/bug-bison/2010-03/msg00030.html>.
+	<https://lists.gnu.org/r/bug-bison/2010-03/msg00030.html>.
 	* NEWS (2.4.3): Mention.
 	* tests/synclines.at (AT_TEST_SYNCLINE): Implement.
 
@@ -1421,7 +1421,7 @@
 
 	portability: fix for BSD make.
 	Reported by Johan van Selst at
-	<http://lists.gnu.org/archive/html/bug-bison/2010-03/msg00016.html>.
+	<https://lists.gnu.org/r/bug-bison/2010-03/msg00016.html>.
 	* tests/local.mk ($(TESTSUITE)): Qualify package.m4 in
 	this dependency list as in package.m4's target rule.
 
@@ -1429,7 +1429,7 @@
 
 	portability: fix spawning on at least FreeBSD 8 and FreeBSD 9.
 	Reported by Johan van Selst at
-	<http://lists.gnu.org/archive/html/bug-bison/2010-03/msg00014.html>.
+	<https://lists.gnu.org/r/bug-bison/2010-03/msg00014.html>.
 	* NEWS (2.4.3): New.
 	* THANKS (Johan van Selst): Add.
 	* etc/prefix-gnulib-mk (prefix): Adjust regex for makefile
@@ -1470,11 +1470,11 @@
 	then reported it.  However, there's some sort of race condition,
 	because the new test group occasionally succeeded.
 	Reported by Albert Chin at
-	<http://lists.gnu.org/archive/html/bug-bison/2010-02/msg00004.html>.
+	<https://lists.gnu.org/r/bug-bison/2010-02/msg00004.html>.
 
 	There were also problems with the test suite livelocking on
 	Tru64 5.1b.  Reported by Didier Godefroy at
-	<http://lists.gnu.org/archive/html/bug-bison/2009-05/msg00005.html>.
+	<https://lists.gnu.org/r/bug-bison/2009-05/msg00005.html>.
 	Switching to create_pipe_bidi suggested by Akim Demaille.
 
 	To attempt to solve both of these problems, switch to gnulib's
@@ -1603,7 +1603,7 @@
 
 	POSIX: warn if %prec's token was not defined.
 	Reported by Florian Krohm at
-	<http://lists.gnu.org/archive/html/bug-bison/2009-12/msg00005.html>.
+	<https://lists.gnu.org/r/bug-bison/2009-12/msg00005.html>.
 	* NEWS (2.4.2): Document.
 	* src/reader.c (grammar_rule_check): Implement.
 	(grammar_current_rule_prec_set): Add comments explaining that we
@@ -1755,9 +1755,9 @@
 
 	portability: use -DGNULIB_POSIXCHECK.
 	Reported by Eric Blake.  See discussions at
-	<http://lists.gnu.org/archive/html/bug-bison/2009-09/msg00008.html>
+	<https://lists.gnu.org/r/bug-bison/2009-09/msg00008.html>
 	and
-	<http://lists.gnu.org/archive/html/bug-gnulib/2009-10/msg00108.html>.
+	<https://lists.gnu.org/r/bug-gnulib/2009-10/msg00108.html>.
 	* HACKING (Release checks): Suggest -DGNULIB_POSIXCHECK.
 	* bootstrap.conf (gnulib_modules): Add all the printf modules
 	suggested by -DGNULIB_POSIXCHECK.  Add realloc-posix as
@@ -1785,7 +1785,7 @@
 
 	Expand GLR acronym in summary of Bison.
 	Based on discussion with Akim Demaille starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2009-04/msg00087.html>.
+	<https://lists.gnu.org/r/bison-patches/2009-04/msg00087.html>.
 	* doc/bison.texinfo (Introduction): Here.
 	* src/getargs.c (usage): Here.
 
@@ -1853,7 +1853,7 @@
 
 	tests: skip tests of file names that platform does not support.
 	Reported by Michael Raskin at
-	<http://lists.gnu.org/archive/html/bug-bison/2009-09/msg00001.html>.
+	<https://lists.gnu.org/r/bug-bison/2009-09/msg00001.html>.
 	* THANKS (Michael Raskin): Add.
 	* tests/output.at (AT_CHECK_OUTPUT_FILE_NAME): Fix.  Cygwin used
 	to fail at least for file names containing ":" or "\".
@@ -2155,7 +2155,7 @@
 
 	Fix gcc 3.4.4 shadowing warning reported by Eric Blake.
 	See
-	<http://lists.gnu.org/archive/html/bison-patches/2009-08/msg00093.html>.
+	<https://lists.gnu.org/r/bison-patches/2009-08/msg00093.html>.
 	* src/scan-code.h (code_props_rule_action_init): Rename
 	named_ref arg to name so it doesn't shadow named_ref type.  This
 	makes it consistent with the function definition in scan-code.l
@@ -2334,7 +2334,7 @@
 
 	Fix complaints about escape sequences.
 	Discussed starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2009-08/msg00036.html>.
+	<https://lists.gnu.org/r/bison-patches/2009-08/msg00036.html>.
 	* src/scan-gram.l (SC_ESCAPED_STRING, SC_ESCAPED_CHARACTER):
 	For a \0 and similar escape sequences meaning the null
 	character, report an invalid escape sequence instead of an
@@ -2368,7 +2368,7 @@
 	This patch simplifies "variables: rename namespace as
 	api.namespace", commit 67501061076ba46355cfd9f9361c7eed861b389c.
 	Suggested by Joel E. Denny in
-	http://lists.gnu.org/archive/html/bison-patches/2009-07/msg00006.html
+	https://lists.gnu.org/r/bison-patches/2009-07/msg00006.html
 
 	* src/muscle-tab.c (muscle_percent_variable_update): New.
 	(muscle_percent_define_insert): Use it in replacement of the
@@ -2432,7 +2432,7 @@
 	build: require gettext 0.17.
 
 	Suggested by Bruno Haible.
-	http://lists.gnu.org/archive/html/bug-bison/2009-08/msg00009.html
+	https://lists.gnu.org/r/bug-bison/2009-08/msg00009.html
 	* configure.ac: require gettext 0.17 to ensure compatibility with
 	gnulib.
 
@@ -2443,7 +2443,7 @@
 	Bison was uselessly requiring the formatstring macros from
 	gettext, which resulted in mo files not being installed on systems
 	that perfectly supported Bison mo files.  Lower the requirement.
-	http://lists.gnu.org/archive/html/bug-bison/2009-08/msg00006.html
+	https://lists.gnu.org/r/bug-bison/2009-08/msg00006.html
 
 	* configure.ac: Require need-ngettext instead of
 	need-formatstring-macros.
@@ -2698,7 +2698,7 @@
 
 	Some M4 cleanup in the testsuite.
 	Suggested by Eric Blake at
-	<http://lists.gnu.org/archive/html/bison-patches/2009-04/msg00083.html>.
+	<https://lists.gnu.org/r/bison-patches/2009-04/msg00083.html>.
 	* tests/existing.at (_AT_TEST_EXISTING_GRAMMAR): Do not
 	complicate the code by distinguishing between a missing value
 	and an empty string value for an optional argument.  This fix is
@@ -2718,7 +2718,7 @@
 
 	Revert unnecessary column realignment in --help output.
 	Reported by Akim Demaille at
-	<http://lists.gnu.org/archive/html/bison-patches/2009-06/msg00010.html>.
+	<https://lists.gnu.org/r/bison-patches/2009-06/msg00010.html>.
 	* src/getargs.c (usage): Here.
 
 2009-07-04  Alex Rozenman  <rozenman@gmail.com>
@@ -2813,7 +2813,7 @@
 
 	variables: rename namespace as api.namespace.
 	Discussed in
-	http://lists.gnu.org/archive/html/bison-patches/2009-04/msg00033.html
+	https://lists.gnu.org/r/bison-patches/2009-04/msg00033.html
 
 	* data/bison.m4 (b4_percent_define_copy_, b4_percent_define_copy):
 	New.
@@ -2867,7 +2867,7 @@
 	cases.
 	Avoid this.
 	Addresses another form of nondeterminism reported by Joel E. Denny.
-	http://lists.gnu.org/archive/html/bison-patches/2009-05/msg00023.html
+	https://lists.gnu.org/r/bison-patches/2009-05/msg00023.html
 
 	* tests/input.at (Numbered tokens): Split the hexadecimal/decimal
 	test in two.
@@ -2889,7 +2889,7 @@
 
 	deterministic user-token-number redeclaration errors.
 	Address nondeterminism reported by Joel E. Denny.
-	http://lists.gnu.org/archive/html/bison-patches/2009-05/msg00023.html
+	https://lists.gnu.org/r/bison-patches/2009-05/msg00023.html
 
 	* src/uniqstr.h: Comment changes.
 	* src/location.h (boundary_cmp, location_cmp): New.
@@ -2970,7 +2970,7 @@
 
 	Rename token.prefix as api.tokens.prefix.
 	Discussed here.
-	http://lists.gnu.org/archive/html/bison-patches/2009-05/msg00024.html.
+	https://lists.gnu.org/r/bison-patches/2009-05/msg00024.html.
 
 	* NEWS, data/bison.m4, data/c.m4, data/java.m4, doc/bison.texinfo,
 	* tests/c++.at, tests/calc.at, tests/java.at, tests/local.at
@@ -3088,7 +3088,7 @@
 
 	List accepted values for a %define enum variable with an invalid value.
 	Suggested by Akim Demaille at
-	<http://lists.gnu.org/archive/html/bison-patches/2009-04/msg00082.html>.
+	<https://lists.gnu.org/r/bison-patches/2009-04/msg00082.html>.
 	* data/bison.m4 (_b4_percent_define_check_values): Implement.
 	* src/muscle-tab.c (muscle_percent_define_check_values): Implement.
 	* tests/input.at (%define lr.default_reductions invalid values): Merge
@@ -3488,9 +3488,9 @@
 
 	Fix strange %define locations for default values.
 	Reported by Akim Demaille at
-	<http://lists.gnu.org/archive/html/bug-bison/2007-12/msg00001.html>
+	<https://lists.gnu.org/r/bug-bison/2007-12/msg00001.html>
 	and discussed again starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2008-11/msg00102.html>.
+	<https://lists.gnu.org/r/bison-patches/2008-11/msg00102.html>.
 	* data/bison.m4 (b4_percent_define_default): Leave syncline blank
 	because location information is bogus.
 	Use angle brackets to delimit fake file name because square brackets
@@ -4173,7 +4173,7 @@
 
 	Fix unexpanded macros in GLR defines file.
 	Reported by Csaba Raduly at
-	<http://lists.gnu.org/archive/html/bug-bison/2008-11/msg00048.html>.
+	<https://lists.gnu.org/r/bug-bison/2008-11/msg00048.html>.
 	* THANKS (Csaba Raduly): Add.
 	* data/glr.c: Fix overquoting on b4_prefix for yylval and yylloc.
 	* tests/calc.at (_AT_DATA_CALC_Y): If %defines is specified, generate
@@ -5376,7 +5376,7 @@
 
 	Fix user actions without a trailing semicolon.
 	Reported by Sergei Steshenko at
-	<http://lists.gnu.org/archive/html/bug-bison/2008-11/msg00001.html>.
+	<https://lists.gnu.org/r/bug-bison/2008-11/msg00001.html>.
 	* THANKS (Sergei Steshenko): Add.
 	* src/scan-code.l (SC_RULE_ACTION): Fix it.
 	* tests/regression.at (Fix user actions without a trailing semicolon):
@@ -5767,7 +5767,7 @@
 	Say %language is experimental.
 	We're thinking of extending it's effect on output file naming.  See the
 	thread at
-	<http://lists.gnu.org/archive/html/bison-patches/2008-10/msg00003.html>.
+	<https://lists.gnu.org/r/bison-patches/2008-10/msg00003.html>.
 	* NEWS: Say it's experimental.
 	* doc/bison.texinfo (Decl Summary): Say it's experimental, and so don't
 	recommend it over %skeleton for now.
@@ -5905,7 +5905,7 @@
 
 	Fix yyerror_range for user-defined location type in C++.  Reported by
 	Georg Sauthoff at
-	<http://lists.gnu.org/archive/html/bug-bison/2008-08/msg00008.html>.
+	<https://lists.gnu.org/r/bug-bison/2008-08/msg00008.html>.
 	* data/lalr1.cc (parse): Change type of yyerror_range to location_type.
 	* THANKS (Georg Sauthoff): Add.
 
@@ -6007,7 +6007,7 @@
 	* Makefile.am ($(top_srcdir)/.version): Declare configure as a
 	dependency, and add comments justifying this in more detail.  Discussed
 	starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2008-07/msg00022.html>.
+	<https://lists.gnu.org/r/bison-patches/2008-07/msg00022.html>.
 
 2008-08-06  Eric Blake  <ebb9@byu.net>
 
@@ -6052,7 +6052,7 @@
 	* configure.ac (AM_INIT_AUTOMAKE): Set gnu strictness during
 	development and gnits strictness for releases.  Based on Eric Blake's
 	suggestion at
-	<http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00019.html>.
+	<https://lists.gnu.org/r/bug-bison/2008-07/msg00019.html>.
 
 2008-07-31  Paolo Bonzini  <bonzini@gnu.org>
 
@@ -6139,7 +6139,7 @@
 
 	Fix untranslatable composition of sentences.  Reported by Goran
 	Uddeborg at
-	<http://lists.gnu.org/archive/html/bug-bison/2008-06/msg00000.html>.
+	<https://lists.gnu.org/r/bug-bison/2008-06/msg00000.html>.
 	* THANKS (Goran Uddeborg): Add.
 	* src/reduce.c (reduce_print): Report the number of nonterminals and
 	rules useless in the grammar in separate sentences.
@@ -6171,7 +6171,7 @@
 2008-07-15  Joel E. Denny  <jdenny@ces.clemson.edu>
 
 	Improve forward-compatibility with GNU M4.  Reported by Eric Blake at
-	<http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html>.
+	<https://lists.gnu.org/r/bug-bison/2008-07/msg00000.html>.
 	* bootstrap.conf (gnulib_modules): Add unsetenv.
 	* lib/.gitignore, lib/.cvsignore (/unsetenv.c): Add.
 	* m4/.gitignore, m4/.cvsignore (/environ.m4): Add.
@@ -6253,7 +6253,7 @@
 
 	Work-around an Autoconf 2.62 AT_SETUP bug that was not present in
 	2.61.  Reported by Juan Manuel Guerrero at
-	<http://lists.gnu.org/archive/html/bug-bison/2008-04/msg00011.html>.
+	<https://lists.gnu.org/r/bug-bison/2008-04/msg00011.html>.
 	* tests/output.at ("Output file name: ("): Comment out test case for
 	now.
 	("Output file name: )"): Likewise.
@@ -6286,7 +6286,7 @@
 2008-04-20  Joel E. Denny  <jdenny@ces.clemson.edu>
 
 	Fix make dist infinite loop reported by Juan Manuel Guerrero at
-	<http://lists.gnu.org/archive/html/bug-bison/2008-01/msg00009.html>.
+	<https://lists.gnu.org/r/bug-bison/2008-01/msg00009.html>.
 	* .cvsignore: Add .version.
 	* .version.in: New.
 	* bootstrap.conf (gnulib_modules): Add git-version-gen.
@@ -6359,7 +6359,7 @@
 2008-02-20  Joel E. Denny  <jdenny@ces.clemson.edu>
 
 	Fix impure push parser compile error reported by Bob Rossi at
-	<http://lists.gnu.org/archive/html/help-bison/2008-02/msg00023.html>.
+	<https://lists.gnu.org/r/help-bison/2008-02/msg00023.html>.
 	* data/yacc.c: Clean up whitespace in the output a little.
 	(yypstate_allocated): Define for impure push parsers regardless of
 	whether the pull interface is also requested.
@@ -6397,7 +6397,7 @@
 2008-02-16  Joel E. Denny  <jdenny@ces.clemson.edu>
 
 	Fix documentation problems reported by Tim Josling at
-	<http://lists.gnu.org/archive/html/bug-bison/2008-01/msg00013.html>.
+	<https://lists.gnu.org/r/bug-bison/2008-01/msg00013.html>.
 	* NEWS (2.3a+): Mention removal of --no-parser, -n, and %no-parser.
 	* doc/bison.texinfo (Token Decl): Token numbers are *nonnegative*
 	integers.  Explain the effect of literal string aliases on error
@@ -6408,7 +6408,7 @@
 
 	Accept a token number in a %left, %right, or %nonassoc for POSIX
 	conformance.  Reported by Tim Josling at
-	<http://lists.gnu.org/archive/html/bug-bison/2008-01/msg00010.html>.
+	<https://lists.gnu.org/r/bug-bison/2008-01/msg00010.html>.
 	* NEWS (2.3a+): Mention.
 	* doc/bison.texinfo (Precedence Decl): Describe how literal strings
 	and code numbers are treated by precedence declarations.
@@ -6450,7 +6450,7 @@
 
 	* data/yacc.c (yyparse): Correct the comment when locations aren't used.
 	Problem reported by Claudio Saavedra in
-	<http://lists.gnu.org/archive/html/bug-bison/2008-01/msg00003.html>.
+	<https://lists.gnu.org/r/bug-bison/2008-01/msg00003.html>.
 
 2008-01-05  Wojciech Polak  <polak@gnu.org>
 
@@ -6461,7 +6461,7 @@
 
 	Automate regression testing of the XML/XSLT implementation.  Discussed
 	starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2007-11/msg00021.html>.
+	<https://lists.gnu.org/r/bison-patches/2007-11/msg00021.html>.
 	* configure.ac (XSLTPROC): New substitution.
 	* Makefile.am (maintainer-xml-check): New phony target invoking...
 	* tests/Makefile.am (maintainer-xml-check): ... this new phony target
@@ -6521,7 +6521,7 @@
 	* src/print-xml.h (xml_indent): Prototype.
 
 	* tests/existing.at (GNU pic Grammar): Fix a rule miscopied from
-	<http://lists.gnu.org/archive/html/bug-bison/2003-04/msg00026.html>.
+	<https://lists.gnu.org/r/bug-bison/2003-04/msg00026.html>.
 
 2007-12-08  Joel E. Denny  <jdenny@ces.clemson.edu>
 
@@ -6535,7 +6535,7 @@
 
 	In the XML output, don't print the list of rules where symbols appear.
 	Compute it in XSLT instead.  Discussed at
-	<http://lists.gnu.org/archive/html/bison-patches/2007-09/msg00024.html>.
+	<https://lists.gnu.org/r/bison-patches/2007-09/msg00024.html>.
 	* data/xslt/bison.xsl (bison:ruleByLhs): New.
 	(bison:ruleByRhs): New.
 	* data/xslt/xml2text.xsl (xsl:template match="terminal"): Use
@@ -6559,7 +6559,7 @@
 
 	Don't let --report affect XML output; always print all information.
 	Discussed at
-	<http://lists.gnu.org/archive/html/bison-patches/2007-09/msg00020.html>.
+	<https://lists.gnu.org/r/bison-patches/2007-09/msg00020.html>.
 	* src/conflicts.c (log_resolution): Implement.
 	* src/print-xml.c (print_core): Implement.
 	(print_state): Implement.
@@ -6577,7 +6577,7 @@
 
 	In the XML output, list useless and unused symbols and rules with the
 	useful ones and add a "usefulness" attribute.  Discussed starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2007-09/msg00017.html>.
+	<https://lists.gnu.org/r/bison-patches/2007-09/msg00017.html>.
 	* src/gram.c (grammar_rules_partial_print_xml): Remove.
 	(grammar_rules_print_xml): Print all rules instead of just those
 	useful in the grammar, and add a "usefulness" attribute.
@@ -6639,7 +6639,7 @@
 	When reporting useless rules and nonterminals, say "useless in grammar"
 	instead of "useless", and say "useless in parser" instead of "never
 	reduced".  Discussed starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2007-10/msg00033.html>.
+	<https://lists.gnu.org/r/bison-patches/2007-10/msg00033.html>.
 	* NEWS (2.3a+): Mention this change.
 	* data/xslt/xml2text.xsl: Update output text and expected input XML
 	element names to match changes below.
@@ -6744,7 +6744,7 @@
 
 	Deprecate %pure-parser and add `%define api.pure'.  Discussed starting
 	at
-	<http://lists.gnu.org/archive/html/bison-patches/2007-09/msg00006.html>.
+	<https://lists.gnu.org/r/bison-patches/2007-09/msg00006.html>.
 	* NEWS (2.3a+): Mention.
 	* data/bison.m4 (b4_pure_if): Don't define it here.
 	* data/c.m4 (b4_identification): Depend on individual skeletons to
@@ -6788,7 +6788,7 @@
 2007-10-28  Joel E. Denny  <jdenny@ces.clemson.edu>
 
 	%define push_pull -> %define api.push_pull.  Discussed starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2007-09/msg00005.html>.
+	<https://lists.gnu.org/r/bison-patches/2007-09/msg00005.html>.
 	* data/push.c: Expect the new name.
 	* data/yacc.c: Likewise.
 	* doc/bison.texinfo (Push Decl): Update.
@@ -6813,7 +6813,7 @@
 	For the XML output's terminal element, rename @number to @token-number,
 	and add @symbol-number.  In the nonterminal element, rename @number to
 	@symbol-number.  Discussed starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2007-10/msg00040.html>.
+	<https://lists.gnu.org/r/bison-patches/2007-10/msg00040.html>.
 	* data/xslt/xml2text.xsl (xsl:template match="terminal"): Update for
 	renames.
 	(xsl:template match="nonterminal"): Likewise.
@@ -6947,7 +6947,7 @@
 2007-10-08  Joel E. Denny  <jdenny@ces.clemson.edu>
 
 	Improve C++ namespace support.  Discussed starting at
-	<http://lists.gnu.org/archive/html/help-bison/2007-09/msg00016.html>.
+	<https://lists.gnu.org/r/help-bison/2007-09/msg00016.html>.
 	* data/c++.m4: (b4_namespace_ref, b4_namespace_open,
 	b4_namespace_close): New macros that interpret the %define variable
 	"namespace" so its value can contain "::" to indicate nested
@@ -7302,7 +7302,7 @@
 	* data/yacc.c (yyexhaustedlab): Define it when YYERROR_VERBOSE is
 	true since it's then always used regardless of whether yyoverflow is
 	defined.  Reported by Christian Burger at
-	<http://lists.gnu.org/archive/html/bug-bison/2007-07/msg00031.html>.
+	<https://lists.gnu.org/r/bug-bison/2007-07/msg00031.html>.
 	* THANKS: Add Christian Burger.
 
 	* ChangeLog: For changes in doc/bison.texinfo, consistently reference
@@ -7319,7 +7319,7 @@
 2007-07-27  Joel E. Denny  <jdenny@ces.clemson.edu>
 
 	Fix push parsing memory leak reported by Brandon Lucia at
-	<http://lists.gnu.org/archive/html/bug-bison/2007-07/msg00032.html>.
+	<https://lists.gnu.org/r/bug-bison/2007-07/msg00032.html>.
 	* THANKS: Add Brandon Lucia.
 	* data/push.c (yypstate_delete): Free the stack if it was reallocated
 	but the parse never completed and thus freed it.
@@ -7376,7 +7376,7 @@
 2007-07-02  Joel E. Denny  <jdenny@ces.clemson.edu>
 
 	Fix C++ test cases after recent Gnulib changes.  Discussed starting at
-	<http://lists.gnu.org/archive/html/bug-bison/2007-07/msg00000.html>.
+	<https://lists.gnu.org/r/bug-bison/2007-07/msg00000.html>.
 	* examples/calc++/Makefile.am (DEFAULT_INCLUDES): Override Automake's
 	definition in order to avoid Gnulib headers since we don't use config.h
 	here.
@@ -7450,11 +7450,11 @@
 
 	* src/Makefile.am (yacc): Quote target action commands properly so
 	that the yacc script isn't corrupt.  Reported by Hans Aberg at
-	<http://lists.gnu.org/archive/html/bug-bison/2007-05/msg00003.html>.
+	<https://lists.gnu.org/r/bug-bison/2007-05/msg00003.html>.
 
 	* data/glr.c (yylval): As in yacc.c, don't extern in the header for
 	the case of pure parsers.  Reported by Frans Englich at
-	<http://lists.gnu.org/archive/html/help-bison/2007-05/msg00018.html>.
+	<https://lists.gnu.org/r/help-bison/2007-05/msg00018.html>.
 	* THANKS: Add Frans Englich.
 
 	* NEWS (2.3a+): In the %code entry, reference section `Bison
@@ -7664,7 +7664,7 @@
 
 	Use YYFPRINTF instead of fprintf where appropriate.  Reported by
 	Sebastien Fricker at
-	<http://lists.gnu.org/archive/html/bug-bison/2007-02/msg00035.html>.
+	<https://lists.gnu.org/r/bug-bison/2007-02/msg00035.html>.
 	* THANKS: Add Sebastien Fricker.
 	* data/glr.c, data/push.c, data/yacc.c (yy_reduce_print): Implement.
 	* doc/bison.texinfo (Tracing): Make it clearer that YYFPRINTF must
@@ -7699,7 +7699,7 @@
 
 	Enable the Java related testsuite tests when the only Java compiler
 	found is a gcj < 4.3.  Discussed at
-	<http://lists.gnu.org/archive/html/bug-bison/2007-02/msg00016.html>.
+	<https://lists.gnu.org/r/bug-bison/2007-02/msg00016.html>.
 	* configure.ac (gt_JAVACOMP): Don't specify a target_version.
 
 2007-02-11  Joel E. Denny  <jdenny@ces.clemson.edu>
@@ -7872,7 +7872,7 @@
 
 	Implement support for relative and absolute skeleton file names.
 	Discussed starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-12/msg00071.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-12/msg00071.html>.
 	* doc/bison.texinfo (Decl Summary): Document in %skeleton entry.
 	(Bison Options): Document in --skeleton entry.
 	* src/output.c (output_skeleton): Use strncpy rather than strcpy since
@@ -7990,7 +7990,7 @@
 
 	Ignore YYSTACK_USE_ALLOCA for push parsers since the stacks can't be
 	locals.  Reported by Juan Manuel Guerrero at
-	<http://lists.gnu.org/archive/html/bug-bison/2007-01/msg00000.html>.
+	<https://lists.gnu.org/r/bug-bison/2007-01/msg00000.html>.
 	* data/push.c: Enclose the #ifdef YYSTACK_USE_ALLOCA in b4_push_if.
 	Fix some indentation also.
 	* tests/torture.at (Exploding the Stack Size with Alloca): Add comment
@@ -8035,7 +8035,7 @@
 	qualifiers in %code directives, and restrict the characters that are
 	allowed in them to M4-friendly ones.  For %define, continue to support
 	the quoted form as a deprecated feature.  Discussed starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2007-01/msg00023.html>.
+	<https://lists.gnu.org/r/bison-patches/2007-01/msg00023.html>.
 	* NEWS (2.3a+): Add entry for the change to %define.  Update entry for
 	%code.
 	* doc/bison.texinfo (Prologue Alternatives): Update.
@@ -8206,7 +8206,7 @@
 	This provides more flexibility than m4_fatal, improves the error
 	message format, and captures messages for translation.  Discussed
 	starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-12/msg00063.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-12/msg00063.html>.
 	* data/bison.m4 (b4_error): New, invoked by...
 	(b4_warn, b4_complain, b4_fatal): ... these new macros to wrap the
 	skeleton scanner's new @warn(...@), @complain(...@), and @fatal(...@)
@@ -8256,7 +8256,7 @@
 	Consolidate the 4 prologue alternative directives (%code, %requires,
 	%provides, and %code-top) into a single %code directive with an
 	optional qualifier field.  Discussed at
-	<http://lists.gnu.org/archive/html/bison-patches/2007-01/msg00012.html>.
+	<https://lists.gnu.org/r/bison-patches/2007-01/msg00012.html>.
 	* NEWS (2.3a+): Rewrite the existing entry for the prologue
 	alternatives.
 	* doc/bison.texinfo (Prologue Alternatives): Update.
@@ -8370,7 +8370,7 @@
 	interface.  This patch merely implements code_props in scan-code.h and
 	scan-code.l.  Future patches will rewrite other modules to use it.
 	Discussed starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-11/msg00020.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-11/msg00020.html>.
 	* src/location.h (EMPTY_LOCATION_INIT): Define so that it's easier to
 	consistently initialize const structs that have an empty location
 	field.
@@ -8460,7 +8460,7 @@
 	instead of passing a yylexp argument to yypull_parse, and don't
 	generate yypull_parse or yyparse unless %push-pull-parser is declared.
 	Discussed starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-12/msg00163.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-12/msg00163.html>.
 	* data/bison.m4 (b4_pull_if): New.
 	* data/c.m4 (b4_identification): Define YYPULL similar to YYPUSH.
 	* data/push.c: Improve M4 quoting a little.
@@ -8752,7 +8752,7 @@
 2006-12-16  Joel E. Denny  <jdenny@ces.clemson.edu>
 
 	Make %push-parser imply %pure-parser.  This fixes several bugs; see
-	<http://lists.gnu.org/archive/html/bison-patches/2006-12/msg00148.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-12/msg00148.html>.
 	* src/parse-gram.y (prologue_declaration): For %push-parser, also set
 	pure_parser = true.
 	* data/push.c: Don't bother testing b4_push_if when deciding whether
@@ -8906,7 +8906,7 @@
 
 	Document Yacc prologue alternatives and default %destructor's and
 	%printer's as experimental.  Don't mention Java yet.  Discussed at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-12/msg00002.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-12/msg00002.html>.
 	* NEWS (2.3a+): Say they're experimental.  Remove any mention of Java.
 	(2.3a): Annotate this entry to say the old forms of these features were
 	also experimental.
@@ -8918,7 +8918,7 @@
 
 	Support a file name argument to %defines.  Deprecate `=' in
 	%file-prefix, %name-prefix, and %output.  Discussed at
-	<http://lists.gnu.org/archive/html/help-bison/2006-09/msg00001.html>.
+	<https://lists.gnu.org/r/help-bison/2006-09/msg00001.html>.
 	* NEWS (2.3a+): Mention.
 	* doc/bison.texinfo (Decl Summary, Table of Symbols): Add entry for new
 	form of %defines, and remove `=' from entries for %file-prefix,
@@ -8948,7 +8948,7 @@
 2006-11-20  Joel E. Denny  <jdenny@ces.clemson.edu>
 
 	Rename <!> to <>.  Discussed starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-11/msg00039.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-11/msg00039.html>.
 	* NEWS (2.3a+): Update.
 	* doc/bison.texinfo (Freeing Discarded Symbols, Table of Symbols):
 	Update.
@@ -8985,7 +8985,7 @@
 
 	Fix memory leaks in scanners generated by at least Flex 2.5.9 and
 	later.  Reported by Paul Eggert in
-	<http://lists.gnu.org/archive/html/bison-patches/2006-11/msg00014.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-11/msg00014.html>.
 	* src/flex-scanner.h (yylex_destroy): Define for Flex before 2.5.9.
 	* src/scan-code.l (translate_action): Don't bother invoking
 	yy_delete_buffer (YY_CURRENT_BUFFER) before creating the first buffer.
@@ -9079,7 +9079,7 @@
 
 	Disable unset/unused mid-rule value warnings by default, and recognize
 	--warnings=midrule-values to enable them.  Discussed starting at
-	<http://lists.gnu.org/archive/html/help-bison/2006-10/msg00030.html>.
+	<https://lists.gnu.org/r/help-bison/2006-10/msg00030.html>.
 	* NEWS (2.3a+): Mention.
 	* src/getargs.c, src/getargs.h (warnings_args, warnings_types, enum
 	warnings): Add entry for midrule-values subargument.
@@ -9122,7 +9122,7 @@
 
 	Split the default %destructor/%printer into two kinds: <*> and <!>.
 	Discussed starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-09/msg00060.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-09/msg00060.html>.
 	* NEWS (2.3a+): Mention.
 	* doc/bison.texinfo (Freeing Discarded Symbols): Document this and the
 	previous change today related to mid-rules.
@@ -9168,7 +9168,7 @@
 
 	Don't apply the default %destructor/%printer to an unreferenced midrule
 	value.  Mentioned at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-09/msg00104.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-09/msg00104.html>.
 	* src/symtab.c (dummy_symbol_get): Name all dummy symbols initially
 	like $@n instead of just @n so that the default %destructor/%printer
 	logic doesn't see them as user-defined symbols.
@@ -9206,7 +9206,7 @@
 
 	Similar to the recently removed %before-header, add %code-top as the
 	alternative to the pre-prologue.  Mentioned at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-10/msg00063.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-10/msg00063.html>.
 	Also, let the prologue alternatives appear in the grammar section.
 	* src/parse-gram.y (PERCENT_CODE_TOP): New token.
 	(prologue_declaration): Move the existing prologue alternatives to...
@@ -9234,7 +9234,7 @@
 2006-10-16  Paolo Bonzini  <bonzini@gnu.org>
 
 	Replace %*-header with %provides, %requires, %code.  See discussion at
-	http://lists.gnu.org/archive/html/bison-patches/2006-10/msg00002.html
+	https://lists.gnu.org/r/bison-patches/2006-10/msg00002.html
 
 	* data/bison.m4 (b4_user_requires, b4_user_provides): New.
 	(b4_user_start_header): Remove.
@@ -9346,7 +9346,7 @@
 	* doc/bison.texinfo (Understanding, Bison Options): Likewise.
 	* THANKS: Add Satya Kiran Popuri, who proposed the initial version
 	of this change in
-	<http://lists.gnu.org/archive/html/bison-patches/2006-09/msg00158.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-09/msg00158.html>.
 	* TODO: Remove Graphviz entry.
 	* src/Makefile.am (bison_SOURCES): Add graphviz.c and graphviz.h;
 	remove vcg.c, vcg.h, vcg_defaults.h.
@@ -9408,7 +9408,7 @@
 2006-10-05  Paul Eggert  <eggert@cs.ucla.edu>
 
 	Fix test failure reported by Tom Lane in
-	<http://lists.gnu.org/archive/html/bug-bison/2006-10/msg00000.html>
+	<https://lists.gnu.org/r/bug-bison/2006-10/msg00000.html>
 	and try to make such failures easier to catch in the future.
 	* data/glr.c (YYTRANSLATE): Don't check for nonpositive arg;
 	that's now the caller's responsibility.
@@ -9533,7 +9533,7 @@
 
 
 	Port to GCC 2.95.  First two problems reported by Michael Deutschmann in
-	<http://lists.gnu.org/archive/html/bug-bison/2006-09/msg00018.html>.
+	<https://lists.gnu.org/r/bug-bison/2006-09/msg00018.html>.
 
 	* src/parse-gram.y (symbol_declaration): Don't put statements
 	before declarations; it's not portable to C89.
@@ -9622,7 +9622,7 @@
 	* data/glr.c (b4_shared_declarations): Put start-header first,
 	before any #includes that we generate, so that feature-test
 	macros work.  Problem reported by Michael Deutschmann in
-	<http://lists.gnu.org/archive/html/bug-bison/2006-09/msg00004.html>.
+	<https://lists.gnu.org/r/bug-bison/2006-09/msg00004.html>.
 	* data/lalr1.cc: Likewise.
 	* doc/bison.texinfo (Prologue): Document that feature-test macros
 	should be defined before any Bison declarations.
@@ -9632,7 +9632,7 @@
 
 	* doc/bison.texinfo (Calc++ Parser): Fix memory leak reported by
 	Sander Brandenburg in
-	<http://lists.gnu.org/archive/html/bug-bison/2006-09/msg00002.html>.
+	<https://lists.gnu.org/r/bug-bison/2006-09/msg00002.html>.
 	Also, fix minor white space and comment issues.
 	(Prologue): Mention that it's better to define feature-test macros
 	before Bison declarations.  Problem reported by Michael Deutschmann.
@@ -9646,9 +9646,9 @@
 
 	Finish implementation of per-type %destructor/%printer.  Discussed
 	starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-02/msg00064.html>
+	<https://lists.gnu.org/r/bison-patches/2006-02/msg00064.html>
 	and
-	<http://lists.gnu.org/archive/html/bison-patches/2006-06/msg00091.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-06/msg00091.html>.
 	* NEWS (2.3+): Add a description of this feature to the default
 	%destructor/%printer description.
 	* doc/bison.texinfo (Freeing Discarded Symbols): Likewise.
@@ -9676,7 +9676,7 @@
 	Require default %destructor/%printer to be declared using
 	%symbol-default instead of an empty symbol list, and start working on
 	new per-type %destructor/%printer.  Discussed at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-09/msg00007.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-09/msg00007.html>.
 	* NEWS (2.3+): Add %symbol-default to example.
 	* bison.texinfo (Freeing Discarded Symbols): Likewise.
 	(Table of Symbols): Add entry for %symbol-default.
@@ -9881,10 +9881,10 @@
 	not declare a specific %printer/%destructor.  Thus, the parser uses it
 	for token 0 if the user declares it but not if Bison generates it as
 	$end.  Discussed starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-02/msg00064.html>,
-	<http://lists.gnu.org/archive/html/bison-patches/2006-06/msg00091.html>,
+	<https://lists.gnu.org/r/bison-patches/2006-02/msg00064.html>,
+	<https://lists.gnu.org/r/bison-patches/2006-06/msg00091.html>,
 	and
-	<http://lists.gnu.org/archive/html/bison-patches/2006-07/msg00019.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-07/msg00019.html>.
 	* NEWS (2.3+): Mention.
 	* doc/bison.texinfo (Actions in Mid-Rule): It's no longer impossible to
 	declare a %destructor for a mid-rule's semantic value.  It's just
@@ -9922,9 +9922,9 @@
 
 	Clean up handling of %destructor for the end token (token 0).
 	Discussed starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-07/msg00019.html>
+	<https://lists.gnu.org/r/bison-patches/2006-07/msg00019.html>
 	and
-	<http://lists.gnu.org/archive/html/help-bison/2006-07/msg00013.html>.
+	<https://lists.gnu.org/r/help-bison/2006-07/msg00013.html>.
 
 	Make the skeletons consistent in how they pop the end token and invoke
 	its %destructor.
@@ -10006,7 +10006,7 @@
 	rather than a for-loop that declares a local bool variable.  This
 	should work around a compatibility problem with a Cray x1e C++
 	compiler reported by Hung Nguyen in
-	<http://lists.gnu.org/archive/html/help-bison/2006-07/msg00022.html>.
+	<https://lists.gnu.org/r/help-bison/2006-07/msg00022.html>.
 	The for-loop was introduced in the 2004-11-17 change but I don't
 	know why it was needed.
 
@@ -10080,7 +10080,7 @@
 2006-07-09  Joel E. Denny  <jdenny@ces.clemson.edu>
 
 	Change %merge result type clash warnings to errors.  Discussed at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-07/msg00026.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-07/msg00026.html>.
 	* src/reader.c (record_merge_function_type): Use complain_at.
 	* tests/glr-regression.at (Missed %merge type warnings when LHS type is
 	declared later): Update test case results.
@@ -10211,9 +10211,9 @@
 
 	Get action warnings (grammar_rule_check) right even when symbol
 	declarations appear after the rules.  Discussed at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-06/msg00108.html>
+	<https://lists.gnu.org/r/bison-patches/2006-06/msg00108.html>
 	and
-	<http://lists.gnu.org/archive/html/bison-patches/2006-06/msg00151.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-06/msg00151.html>.
 	Don't mistake the type of $$ in a midrule to be that of its parent
 	rule's $$.
 	* src/reader.c (grammar_current_rule_end): Don't invoke
@@ -10280,7 +10280,7 @@
 
 	Fix bug that mistakes braced code in a declaration in the rules section
 	to be a rule action.  Mentioned at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-06/msg00105.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-06/msg00105.html>.
 	* src/scan-gram.l: Move midrule action detection from the start of the
 	scanning of any braced code to...
 	* src/parse-gram.y (rhs): ... the parsing of braced code as a rule
@@ -10308,7 +10308,7 @@
 	blocks from post-prologue blocks.  Add new order-independent
 	declarations %before-header and %after-header as alternatives to the
 	traditional Yacc pre-prologue and post-prologue blocks.  Discussed at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-06/msg00110.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-06/msg00110.html>.
 	* NEWS (2.3+): Update for these changes.
 	* data/glr.c (b4_before_definitions): Update to...
 	(b4_start_header): ... this.
@@ -10348,7 +10348,7 @@
 2006-06-22  Joel E. Denny  <jdenny@ces.clemson.edu>
 
 	Add comparison operators for C++ location classes.  Discussed at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-06/msg00092.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-06/msg00092.html>.
 	* data/c++.m4 (b4_define_location_comparison): New boolean %define
 	declaration indicating whether filename_type has an operator==.  If
 	filename_type is `std::string', it defaults to `1', `0' otherwise.
@@ -10371,10 +10371,10 @@
 	the token definitions.  Add new %before-definitions and
 	%after-definitions to declare code that will go in both the header file
 	and code file.  Discussed at
-	<http://lists.gnu.org/archive/html/bison-patches/2005-12/msg00000.html>,
-	<http://lists.gnu.org/archive/html/bison-patches/2006-01/msg00016.html>,
+	<https://lists.gnu.org/r/bison-patches/2005-12/msg00000.html>,
+	<https://lists.gnu.org/r/bison-patches/2006-01/msg00016.html>,
 	and
-	<http://lists.gnu.org/archive/html/bison-patches/2006-06/msg00055.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-06/msg00055.html>.
 	* NEWS (2.3+): Describe these changes.
 	* data/glr.c (b4_pre_prologue): Move from within to before...
 	(b4_shared_declarations): ... this.
@@ -10477,10 +10477,10 @@
 	For associating token numbers with token names for "yacc.c", don't use
 	#define statements unless `--yacc' is specified; always use enum
 	yytokentype.  Most important discussions start at:
-	<http://lists.gnu.org/archive/html/bison-patches/2005-09/msg00053.html>,
-	<http://lists.gnu.org/archive/html/bison-patches/2005-12/msg00052.html>,
+	<https://lists.gnu.org/r/bison-patches/2005-09/msg00053.html>,
+	<https://lists.gnu.org/r/bison-patches/2005-12/msg00052.html>,
 	and
-	<http://lists.gnu.org/archive/html/bison-patches/2006-06/msg00043.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-06/msg00043.html>.
 	* NEWS (2.3+): Mention.
 	* data/c.m4 (b4_yacc_if): New.
 	(b4_token_enums_defines): Use b4_yacc_if to decide whether to add the
@@ -10509,9 +10509,9 @@
 
 	For consistency, use `lookahead' instead of `look-ahead' or
 	`look_ahead'.  Discussed starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-01/msg00049.html>
+	<https://lists.gnu.org/r/bison-patches/2006-01/msg00049.html>
 	and then at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-06/msg00017.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-06/msg00017.html>.
 	* NEWS: For the next release, note the change to `--report'.
 	* TODO, doc/bison.1: Update English.
 	* doc/bison.texinfo: Update English.
@@ -10687,14 +10687,14 @@
 
 	* src/getargs.c (usage): Mention GLR not just LALR(1) in --help output.
 	Use Akim's wording from
-	<http://lists.gnu.org/archive/html/bison-patches/2006-05/msg00056.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-05/msg00056.html>.
 
 2006-06-06  Joel E. Denny  <jdenny@ces.clemson.edu>
 
 	Between Bison releases, manually append `+' to the previous Bison
 	release number, and use that as a signal to automatically print the
 	ChangeLog's CVS Id keyword from --version.  Discussed starting at
-	<http://lists.gnu.org/archive/html/bison-patches/2006-05/msg00028.html>.
+	<https://lists.gnu.org/r/bison-patches/2006-05/msg00028.html>.
 	* ChangeLog: Add Id header.
 	* configure.ac (AC_INIT): Append `+' to `2.3'.
 	* src/.cvsignore: Add revision.c.
@@ -10716,7 +10716,7 @@
 	* data/glr.c (YYRECOVERING): Define to be a function-like macro
 	with no arguments, not as an object-like macro.  This is for
 	compatibility with data/yacc.c.  Problem reported by John P. Hartmann in
-	<http://lists.gnu.org/archive/html/bug-bison/2006-05/msg00059.html>.
+	<https://lists.gnu.org/r/bug-bison/2006-05/msg00059.html>.
 	* doc/bison.texinfo (Action Features, Error Recovery, Table of Symbols):
 	Document this.
 
@@ -10739,7 +10739,7 @@
 
 	* data/yacc.c (yy_reduce_print): Omit trailing white space in
 	generated source code.  Problem reported by Frans Englich in
-	<http://lists.gnu.org/archive/html/bug-bison/2006-05/msg00049.html>.
+	<https://lists.gnu.org/r/bug-bison/2006-05/msg00049.html>.
 
 2006-05-22  Paul Eggert  <eggert@cs.ucla.edu>
 
@@ -10765,7 +10765,7 @@
 	state before an empty RHS is always resolved here.  Only the location
 	of that state is guaranteed to be resolved, and that's enough.  This
 	fixes the remaining bug reported by Derek M. Jones in
-	<http://lists.gnu.org/archive/html/bug-bison/2006-05/msg00027.html>.
+	<https://lists.gnu.org/r/bug-bison/2006-05/msg00027.html>.
 	* tests/glr-regression.at (Uninitialized location when reporting
 	ambiguity): Test the above case.
 	Also, the embedded comments in this test case claim it checks the case
@@ -10780,7 +10780,7 @@
 	(b4_yy_symbol_print_generate): Use 'YYSTYPE const' rather than
 	'const YYSTYPE', and similarly for YYLTYPE.  This fixes one
 	of the bugs reported today by Derek M Jones in
-	<http://lists.gnu.org/archive/html/bug-bison/2006-05/msg00027.html>.
+	<https://lists.gnu.org/r/bug-bison/2006-05/msg00027.html>.
 	* doc/bison.texinfo (Value Type): Document that YYSTYPE must be
 	defined to be a type name without parens or brackets.
 	(Location Type): Similarly for YYLTYPE.
@@ -10798,7 +10798,7 @@
 	* data/glr.c (yyreportTree): Make room in yystates for the state
 	preceding the RHS.  This fixes the segmentation fault reported by Derek
 	M. Jones in
-	<http://lists.gnu.org/archive/html/help-bison/2006-05/msg00035.html>.
+	<https://lists.gnu.org/r/help-bison/2006-05/msg00035.html>.
 	(yyreportTree, yypdumpstack): Subtract 1 from yyrule before printing
 	to the user.  Reported for yyreportTree by Derek M. Jones later in the
 	same thread.
@@ -10812,7 +10812,7 @@
 	checking against YYLAST that caused the parser to miss a potential
 	alternative in its diagnostic.
 	Problem reported by Maria Jose Moron Fernandez in
-	<http://lists.gnu.org/archive/html/bug-bison/2006-05/msg00024.html>.
+	<https://lists.gnu.org/r/bug-bison/2006-05/msg00024.html>.
 	* data/lalr1.cc (yysyntax_error_): Likewise.
 	* data/yacc.c (yysyntax_error): Likewise.
 	* tests/regression.at (_AT_DATA_DANCER_Y): Use static array for
@@ -11096,7 +11096,7 @@
 	declarations of malloc and free, to avoid problems with
 	incompatible declarations (using 'throw') C++'s stdlib.h.  This
 	should fix Debian bug 340012
-	<http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=340012>,
+	<https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=340012>,
 	reported by Guillaume Melquiond.
 
 2006-02-13  Paul Eggert  <eggert@cs.ucla.edu>
@@ -11168,7 +11168,7 @@
 2006-02-01  Paul Eggert  <eggert@cs.ucla.edu>
 
 	Work around portability problems summarized by Nelson H. F. Beebe in
-	<http://lists.gnu.org/archive/html/bug-bison/2005-09/msg00021.html>.
+	<https://lists.gnu.org/r/bug-bison/2005-09/msg00021.html>.
 
 	* m4/cxx.m4 (BISON_TEST_FOR_WORKING_CXX_COMPILER): Check
 	that '#include <string>' works.
@@ -12621,7 +12621,7 @@
 	* tests/glr-regression.at
 	(User destructor after an error during a split parse):  New test case.
 	Problem reported by Joel E. Denny in:
-	http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00029.html
+	https://lists.gnu.org/r/bison-patches/2005-08/msg00029.html
 
 2005-08-25  Paul Eggert  <eggert@cs.ucla.edu>
 
@@ -12648,7 +12648,7 @@
 	* tests/glr-regression.at
 	(User destructor for unresolved GLR semantic value): New test case.
 	Problem reported by Joel E. Denny in:
-	http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00016.html
+	https://lists.gnu.org/r/bison-patches/2005-08/msg00016.html
 
 2005-08-21  Paul Eggert  <eggert@cs.ucla.edu>
 
@@ -12660,7 +12660,7 @@
 	* data/glr.c (yyreturn): Use "Cleanup:" rather than "Error:"
 	in yydestruct diagnostic, since it might not be an error.
 	Problem reported by Joel Denny near end of
-	<http://lists.gnu.org/archive/html/help-bison/2005-07/msg00040.html>.
+	<https://lists.gnu.org/r/help-bison/2005-07/msg00040.html>.
 	* data/lalr1.cc (yyerturn): Likewise.
 	* data/yacc.c (yyreturn): Likewise.
 	* tests/calc.at (_AT_CHECK_CALC_ERROR): Adjust to the above change.
@@ -12670,18 +12670,18 @@
 	* data/glr.c (YY_SYMBOL_PRINT): Append a newline, for consistency
 	with the other templates, and to fix bogus run-on messages such
 	as the one reported at the end of
-	<http://lists.gnu.org/archive/html/help-bison/2005-07/msg00040.html>.
+	<https://lists.gnu.org/r/help-bison/2005-07/msg00040.html>.
 	All callers changed to avoid the newline.
 	(yyprocessOneStack): Output two lines rather than one, to accommodate
 	the above change.  This changes the debug output format slightly.
 
 	* data/glr.c (yyresolveValue): Fix redundant parse tree problem
 	reported by Joel E. Denny in
-	<http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00004.html>
+	<https://lists.gnu.org/r/bison-patches/2005-08/msg00004.html>
 	(trivial change).
 	* tests/glr-regression.at (Duplicate representation of merged trees):
 	New test, from Joel E. Denny in:
-	<http://lists.gnu.org/archive/html/help-bison/2005-07/msg00013.html>.
+	<https://lists.gnu.org/r/help-bison/2005-07/msg00013.html>.
 	* THANKS: Add Joel E. Denny.
 
 	* configure.ac (AC_INIT): Bump to 2.0c.
@@ -12705,7 +12705,7 @@
 	version of GCC, since the macro is used with non-GCC compilers.
 
 	Fix core dump reported by Pablo De Napoli in
-	<http://lists.gnu.org/archive/html/bug-bison/2005-07/msg00053.html>.
+	<https://lists.gnu.org/r/bug-bison/2005-07/msg00053.html>.
 	* tests/regression.at (Invalid inputs with {}): New test.
 	* src/parse-gram.y (token_name): Translate type before using
 	it as an index.
@@ -12949,7 +12949,7 @@
 	don't have to worry about garbage getting in that file.  We'll
 	make sure after the next official release that old msgids don't
 	get lost.  See
-	<http://lists.gnu.org/archive/html/bison-patches/2005-07/msg00119.html>.
+	<https://lists.gnu.org/r/bison-patches/2005-07/msg00119.html>.
 
 	* runtime-po/Makefile.in.in, runtime-po/bison-runtime.pot: Remove.
 	Now auto-generated.
@@ -13366,7 +13366,7 @@
 	* data/glr.c, data/lalr1.cc: Update copyright date.
 
 	Fix a destructor bug reported by Wolfgang Spraul in
-	<http://lists.gnu.org/archive/html/bug-bison/2005-05/msg00042.html>.
+	<https://lists.gnu.org/r/bug-bison/2005-05/msg00042.html>.
 	* data/yacc.c (yyabortlab): Don't call destructor, and
 	don't set yychar to EMPTY.
 	(yyoverflowlab): Don't call destructor.
@@ -13559,7 +13559,7 @@
 	(symbol_destructors_output, symbol_printers_output):
 	Escape symbol tags too.
 	Problem reported by Matyas Forstner in
-	<http://lists.gnu.org/archive/html/bug-bison/2005-03/msg00009.html>.
+	<https://lists.gnu.org/r/bug-bison/2005-03/msg00009.html>.
 
 	* src/muscle_tab.c (muscle_code_grow): Don't quote numbers; it's
 	not needed.
@@ -14145,7 +14145,7 @@
 
 	* doc/bison.texinfo (Language and Grammar): In example, "int" is a
 	keyword, not an identifier.  Problem reported by Baron Schwartz in
-	<http://lists.gnu.org/archive/html/bug-bison/2004-10/msg00017.html>.
+	<https://lists.gnu.org/r/bug-bison/2004-10/msg00017.html>.
 
 2004-10-11  Akim Demaille  <akim@epita.fr>
 
@@ -14441,7 +14441,7 @@
 
 	Fix bug with non-%union parsers that have printers or destructors,
 	which led to a Bison core dump.  Reported by Peter Fales in
-	<http://lists.gnu.org/archive/html/bug-bison/2004-07/msg00014.html>.
+	<https://lists.gnu.org/r/bug-bison/2004-07/msg00014.html>.
 
 	* data/c.m4 (b4_symbol_actions): Don't assume %union was used.
 	* data/lalr1.cc (yystype) [defined YYSTYPE]: Define to YYSTYPE,
@@ -14514,7 +14514,7 @@
 
 	Fix some "make check" problems with C++ reported by
 	Albert Chin-A-Young for Tru64 C++ in this thread:
-	http://lists.gnu.org/archive/html/bug-bison/2004-05/msg00049.html
+	https://lists.gnu.org/r/bug-bison/2004-05/msg00049.html
 
 	* m4/cxx.m4 (BISON_TEST_FOR_WORKING_CXX_COMPILER): Check for std::cerr.
 	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR):
@@ -14545,7 +14545,7 @@
 
 	* src/parse-gram.y (lloc_default): Rewrite to avoid compiler bug
 	in SGI MIPSpro 7.4.1m.  Problem reported by Albert Chin-A-Young in
-	<http://lists.gnu.org/archive/html/bug-bison/2004-05/msg00037.html>.
+	<https://lists.gnu.org/r/bug-bison/2004-05/msg00037.html>.
 
 	* configure.ac (AC_PREREQ): Bump to 2.58, since 2.57 doesn't work
 	(it fails with a Autoconf-without-aclocal-m4 diagnostic).
@@ -14596,7 +14596,7 @@
 	Ensure that the C++ compiler used for testing actually works on a
 	simple test program; if not, skip the C++-related tests.  Problem
 	reported by Vin Shelton in:
-	http://lists.gnu.org/archive/html/bug-bison/2004-05/msg00026.html
+	https://lists.gnu.org/r/bug-bison/2004-05/msg00026.html
 
 	* m4/cxx.m4: New file.
 	* configure.ac (BISON_TEST_FOR_WORKING_CXX_COMPILER): Add.
@@ -14607,8 +14607,7 @@
 
 	* data/glr.c (yylloc): Output this macro even if locations are not
 	being generated, as the GLR parser needs it even in that case.
-	Problem reported by Troy A. Johnson
-	<http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=195946>.
+	Problem reported by Troy A. Johnson <https://bugs.debian.org/195946>.
 
 	* configure.ac (AC_INIT): Update to 1.875e.
 
@@ -14883,7 +14882,7 @@
 2004-03-08  Paul Eggert  <eggert@gnu.org>
 
 	Add support for hex token numbers.  Suggested by Odd Arild Olsen in
-	<http://lists.gnu.org/archive/html/bison-patches/2004-03/msg00000.html>.
+	<https://lists.gnu.org/r/bison-patches/2004-03/msg00000.html>.
 
 	* NEWS: Document hexadecimal tokens, no NUL bytes, %destructor
 	in lalr1.cc.
@@ -14900,7 +14899,7 @@
 	* tests/local.at (AT_COMPILE, AT_COMPILE_CXX): Ignore stdout from
 	compilers.  This fixes a problem with Intel's C++ compiler being
 	chatty, reported by Guido Trentalancia in
-	<http://lists.gnu.org/archive/html/bug-bison/2004-02/msg00030.html>.
+	<https://lists.gnu.org/r/bug-bison/2004-02/msg00030.html>.
 
 2004-02-09  Alexandre Duret-Lutz  <adl@gnu.org>
 
@@ -15096,7 +15095,7 @@
 
 	Have lalr1.cc catch with Paul Eggert's patch to fix the infinite
 	error recovery loops.  This patch is based on
-	<http://lists.gnu.org/archive/html/bison-patches/2003-06/msg00000.html>.
+	<https://lists.gnu.org/r/bison-patches/2003-06/msg00000.html>.
 	Also, augment the similarity between lalr1.cc and yacc.c.
 	Note: the locations of error recovery rules are not correct yet.
 
@@ -15145,14 +15144,14 @@
 
 	* data/glr.c (yyglrReduce): Don't use C89 string concatenation,
 	for portability to K&R C (after ansi2knr, presumably).  See
-	<http://lists.gnu.org/archive/html/bison-patches/2003-06/msg00041.html>
+	<https://lists.gnu.org/r/bison-patches/2003-06/msg00041.html>
 	by Frank Heckenbach, though I have omitted the structure-initialization
 	part of his glr-knr.diff patch since I recall that the Portable
 	C Compiler didn't require that change.
 
 	Let the user specify how to allocate and free memory.
 	Derived from a suggestion by Frank Heckenbach in
-	<http://lists.gnu.org/archive/html/bison-patches/2003-06/msg00041.html>.
+	<https://lists.gnu.org/r/bison-patches/2003-06/msg00041.html>.
 	* data/glr.c (YYFREE, YYMALLOC, YYREALLOC): New macros.
 	All uses of free, malloc, realloc changed to use these macros,
 	and unnecessary casts removed.
@@ -15162,7 +15161,7 @@
 
 	* data/lalr1.cc (operator<<(std::ostream&, const Position&)):
 	use s.empty() rather than s == "" to test for empty string; see
-	<http://lists.gnu.org/archive/html/bison-patches/2003-07/msg00003.html>
+	<https://lists.gnu.org/r/bison-patches/2003-07/msg00003.html>
 	(trivial change)
 
 2003-06-25  Akim Demaille  <akim@epita.fr>
@@ -15185,7 +15184,7 @@
 	yyreportTree): Do not assume that size_t is the same width as int,
 	when printing sizes.  Print sizes using an unsigned format.
 	Problem reported by Frank Heckenbach in
-	<http://lists.gnu.org/archive/html/bison-patches/2003-06/msg00035.html>.
+	<https://lists.gnu.org/r/bison-patches/2003-06/msg00035.html>.
 
 	Port to Forte Developer 7 C compiler.
 	* data/glr.c (struct YYLTYPE): If locations are not being used,
@@ -15230,7 +15229,7 @@
 	(ATTRIBUTE_UNUSED): Define unconditionally.
 
 	Upgrade to 2003-06-08 libbitset, submitted by Michael Hayes in:
-	<http://lists.gnu.org/archive/html/bison-patches/2003-06/msg00005.html>
+	<https://lists.gnu.org/r/bison-patches/2003-06/msg00005.html>
 	* lib/Makefile.am (bitsets_sources): Add vbitset.c, vbitset.h.
 	* lib/vbitset.c, lib/vbitset.h: New files.
 	* lib/abitset.c, lib/bbitset.h, lib/bitset.c, lib/bitset.h,
@@ -15350,7 +15349,7 @@
 	* tests/local.at (AT_COMPILE_CXX): Use it instead of CFLAGS.
 
 	Fix a GLR parser bug I reported in February; see
-	<http://lists.gnu.org/archive/html/bison-patches/2003-02/msg00008.html>.
+	<https://lists.gnu.org/r/bison-patches/2003-02/msg00008.html>.
 	The problem was that GLR parsers did not conform to the C standard,
 	because actions like { $1 = $2 + $3; } expanded to expressions
 	that invoked YYFILL in separate subexpressions, and YYFILL assigned
@@ -15371,7 +15370,7 @@
 	parser can loop.  Provide a test case and a fix for yacc.c.  I
 	don't have a fix for lalr1.cc or for glr.c, unfortunately.
 	The original bug report is in:
-	<http://lists.gnu.org/archive/html/bison-patches/2003-02/msg00044.html>
+	<https://lists.gnu.org/r/bison-patches/2003-02/msg00044.html>
 
 	* data/yacc.c (YYERROR): Now just 'goto yyerrorlab', since the
 	macro's size was becoming unwieldy.
@@ -15504,14 +15503,14 @@
 	* lib/bitset.h (__INT_TO_PTR): Define to a value that presumes
 	C89.  This avoids a diagnostic on compilers that define __STDC__
 	to 0, fixing a problem with Tru64 cc reported by Martin Mokrejs in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-04/msg00041.html>.
+	<https://lists.gnu.org/r/bug-bison/2003-04/msg00041.html>.
 
 2003-05-03  Paul Eggert  <eggert@twinsun.com>
 
 	* lib/bitset.h (BITSET_FOR_EACH, BITSET_FOR_EACH_REVERSE):
 	Do not overrun array bounds.
 	This should fix a bug reported today by Olatunji Oluwabukunmi in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-05/msg00004.html>.
+	<https://lists.gnu.org/r/bug-bison/2003-05/msg00004.html>.
 
 2003-04-29  Akim Demaille  <akim@epita.fr>
 
@@ -15543,7 +15542,7 @@
 2003-04-27  Paul Eggert  <eggert@twinsun.com>
 
 	Avoid gcc -Wundef warnings reported by Gerald Pfeifer in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-04/msg00044.html>.
+	<https://lists.gnu.org/r/bug-bison/2003-04/msg00044.html>.
 	* data/yacc.c (YYSTACK_ALLOC): Don't evaluate YYSTACK_USE_ALLOCA
 	if it is not defined.
 	(YYMAXDEPTH): Don't evaluate YYMAXDEPTH if it is not defined.
@@ -15555,13 +15554,13 @@
 	type suitable for the corresponding table, since the latter might
 	be unsigned but the ninf value might be negative.  This fixes a
 	bug reported by Alexandre Duret-Lutz in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-04/msg00017.html>.
+	<https://lists.gnu.org/r/bug-bison/2003-04/msg00017.html>.
 
 	* configure.ac (AC_FUNC_ERROR_AT_LINE): Remove, since gl_ERROR
 	invokes it.  We shouldn't invoke it twice because it will attempt
 	to put error.o in the archive twice.  This fixes a glitch reported
 	by Martin Mokrejs in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-04/msg00041.html>.
+	<https://lists.gnu.org/r/bug-bison/2003-04/msg00041.html>.
 
 2003-04-21  Paul Eggert  <eggert@twinsun.com>
 
@@ -15588,7 +15587,7 @@
 	* src/conflicts.c (set_conflicts): Resolve all conflicts, not just
 	the first one.  This change is from Paul Hilfinger, and it fixes
 	regression reported by Werner Lemberg in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-04/msg00026.html>.
+	<https://lists.gnu.org/r/bug-bison/2003-04/msg00026.html>.
 
 	(resolve_sr_conflict): Don't invoke state_errs_set
 	unless one or more tokens have been explicitly made errors.
@@ -15637,7 +15636,7 @@
 	(<INITIAL><<EOF>>, <SC_PRE_CODE><<EOF>>): Set *loc to the scanner
 	cursor, instead of leaving it undefined.  This fixes a bug
 	reported by Tim Van Holder in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-03/msg00023.html>.
+	<https://lists.gnu.org/r/bug-bison/2003-03/msg00023.html>.
 	* tests/input.at (Torturing the Scanner): Test the scanner on
 	an empty input file, which was Tim Van Holder's test case.
 
@@ -15645,7 +15644,7 @@
 	<sys/resource.h> can be included, include sys/time.h and
 	sys/times.h first, if available.  This works around the SunOS
 	4.1.4 porting bug reported by Bruce Becker in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-03/msg00018.html>.
+	<https://lists.gnu.org/r/bug-bison/2003-03/msg00018.html>.
 
 	* m4/subpipe.m4 (BISON_PREREQ_SUBPIPE): Don't
 	AC_CHECK_HEADERS([sys/wait.h]), as this interferes with
@@ -15759,7 +15758,7 @@
 
 	* lib/mbswidth.c: Include <wchar.h> before "mbswidth.h", to work
 	around a UnixWare 7.1.1 porting bug reported by John Hughes in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-02/msg00030.html>.
+	<https://lists.gnu.org/r/bug-bison/2003-02/msg00030.html>.
 
 2003-02-26  Paul Eggert  <eggert@twinsun.com>
 
@@ -15774,7 +15773,7 @@
 	* data/glr.c (yy_reduce_print): yylineno -> yylno,
 	to avoid collision with flex use of yylineno.
 	Problem reported by Bruce Lilly in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-02/msg00016.html>.
+	<https://lists.gnu.org/r/bug-bison/2003-02/msg00016.html>.
 	* data/lalr1.cc (yy::]b4_parser_class_name[::parse): Likewise.
 	* data/yacc.c (yy_reduce_print): Likewise.
 
@@ -15844,13 +15843,13 @@
 	* tests/atlocal.in (LDFLAGS, LIBS): New vars.
 	* tests/testsuite.at (AT_COMPILE): Use them.
 	This fixes the testsuite problem reported by Robert Lentz in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-02/msg00011.html>.
+	<https://lists.gnu.org/r/bug-bison/2003-02/msg00011.html>.
 
 2003-02-12  Paul Eggert  <eggert@twinsun.com>
 
 	* data/yacc.c (yyerrlab) [YYERROR_VERBOSE]:
 	Avoid subscript error in yycheck.  Bug reported by Andrew Suffield in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-02/msg00003.html>.
+	<https://lists.gnu.org/r/bug-bison/2003-02/msg00003.html>.
 	* data/glr.c (yyreportSyntaxError) [YYERROR_VERBOSE]: Likewise.
 	Check for malloc failure, for consistency with yacc.c.
 	(yytname_size): Remove, for consistency with yacc.c.
@@ -15980,7 +15979,7 @@
 
 	Changes in response to error report by S. Eken: GLR mode does not
 	handle negative $ indices or $ indices in embedded rules correctly.
-	See <http://lists.gnu.org/archive/html/bug-bison/2003-01/msg00076.html>.
+	See <https://lists.gnu.org/r/bug-bison/2003-01/msg00076.html>.
 
 	* data/glr.c (b4_rhs_value): Change to use YYFILL macro.
 	(b4_rhs_location): Ditto.
@@ -16011,8 +16010,8 @@
 	* data/lalr1.cc: Do not use @output_header_name@ unless
 	b4_defines_flag is set.  This fixes two bugs reported by
 	Tim Van Holder in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-01/msg00071.html>
-	and <http://lists.gnu.org/archive/html/bug-bison/2003-01/msg00073.html>.
+	<https://lists.gnu.org/r/bug-bison/2003-01/msg00071.html>
+	and <https://lists.gnu.org/r/bug-bison/2003-01/msg00073.html>.
 
 2003-01-21  Paul Eggert  <eggert@twinsun.com>
 
@@ -16030,7 +16029,7 @@
 
 	* src/output.c (symbol_printers_output): Fix typo that led
 	to core dump.  Problem reported by Antonio Rus in
-	<http://lists.gnu.org/archive/html/bug-bison/2003-01/msg00058.html>.
+	<https://lists.gnu.org/r/bug-bison/2003-01/msg00058.html>.
 
 2003-01-13  Akim Demaille  <akim@epita.fr>,
 		Quoc Peyrot <chojin@lrde.epita.fr>,
@@ -16048,7 +16047,7 @@
 	* NEWS: %expect-violations are now just warnings, reverting
 	to Bison 1.30 and 1.75 behavior.  This fixes the GCC 3.2
 	bootstrapping problem reported by Matthias Klose; see
-	<http://lists.gnu.org/archive/html/bug-bison/2003-01/msg00053.html>.
+	<https://lists.gnu.org/r/bug-bison/2003-01/msg00053.html>.
 	* src/conflicts.c (conflicts_print): Likewise.
 	* tests/conflicts.at (%expect not enough, %expect too much,
 	%expect with reduce conflicts): Likewise.
@@ -16176,7 +16175,7 @@
 
 	Fix a bug where error locations were not being recorded correctly.
 	This problem was originally reported by Paul Hilfinger in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00086.html>.
+	<https://lists.gnu.org/r/bug-bison/2002-11/msg00086.html>.
 
 	* data/yacc.c (yyparse): New local var yylerrsp, to record the
 	top of the location stack's error locations.
@@ -16224,7 +16223,7 @@
 
 	Remove obsolete references to bison.simple and bison.hairy.
 	Problem mentioned by Aubin Mahe in
-	<http://lists.gnu.org/archive/html/help-bison/2002-12/msg00010.html>.
+	<https://lists.gnu.org/r/help-bison/2002-12/msg00010.html>.
 	* data/glr.c: Comment fix.
 	* doc/bison.1: Remove references.  Also, mention "yacc".
 
@@ -16359,7 +16358,7 @@
 	* config/install-sh: Sync with autotools.
 
 	Fix a bad interaction with flex 2.5.23 reported by Bruce Lilly in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00114.html>.
+	<https://lists.gnu.org/r/bug-bison/2002-11/msg00114.html>.
 	* data/yacc.c (YYLTYPE, struct yyltype): Do not define unless
 	locations are requested.
 	(union yyalloc): Do not depend on YYLTYPE_IS_TRIVIAL unless
@@ -16640,7 +16639,7 @@
 	sequences like "@" that are treated specially by src/scan-skel.l.
 	Instead, just use the file's basename.  This fixes the bug
 	reported by Martin Mokrejs in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-12/msg00007.html>.
+	<https://lists.gnu.org/r/bug-bison/2002-12/msg00007.html>.
 
 2002-12-06  Paul Eggert  <eggert@twinsun.com>
 
@@ -16738,7 +16737,7 @@
 	* configure.ac (AC_REPLACE_FUNCS): Add strtoul.
 	* lib/strtoul.c: New file, from gnulib.
 	This fixes a porting bug reported by Peter Klein in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-12/msg00000.html>.
+	<https://lists.gnu.org/r/bug-bison/2002-12/msg00000.html>.
 
 2002-11-30  Paul Eggert  <eggert@twinsun.com>
 
@@ -16790,7 +16789,7 @@
 
 	* data/c.m4 (b4_yysymprint_generate): yyout -> yyoutput,
 	to avoid collision with lex macro described by Bruce Lilly in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00114.html>.
+	<https://lists.gnu.org/r/bug-bison/2002-11/msg00114.html>.
 	* tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Likewise.
 	* doc/bison.texinfo (Prologue, Tracing): yyprint -> print_token_value.
 	* src/parse-gram.y (print_token_value): Renamed from yyprint.
@@ -16888,7 +16887,7 @@
 	* data/glr.c (yygetLRActions): Replace `yyindex' with
 	`yytable[yyindex]' to fix typo introduced in my 2002-11-09 patch.
 	This fixes the regression with Sun ONE Studio 7 cc that I reported in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00077.html>.
+	<https://lists.gnu.org/r/bug-bison/2002-11/msg00077.html>.
 
 2002-11-18  Akim Demaille  <akim@epita.fr>
 
@@ -17006,7 +17005,7 @@
 	duplicating xfopen's body.
 
 	Fix bugs reported by Nelson H. F. Beebe in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00078.html>.
+	<https://lists.gnu.org/r/bug-bison/2002-11/msg00078.html>.
 
 	* tests/headers.at (AT_TEST_CPP_GUARD_H): Don't assume that
 	"$CC -E foo.h" is allowed, as this doesn't work with the Portland
@@ -17049,7 +17048,7 @@
 2002-11-13  Paul Eggert  <eggert@twinsun.com>
 
 	Fix some bugs reported by Albert Chin-A-Young in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00066.html>.
+	<https://lists.gnu.org/r/bug-bison/2002-11/msg00066.html>.
 
 	* tests/input.at (Torturing the Scanner): Don't invoke "cc a.c b.c
 	-o c"; the HP C compiler chatters during compilation.
@@ -17078,7 +17077,7 @@
 	(yyglrReduce): Return yyok, not 0.
 	This should avoid the enumerated-type warnings reported
 	by Nelson H. F. Beebe in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00057.html>.
+	<https://lists.gnu.org/r/bug-bison/2002-11/msg00057.html>.
 
 	* lib/bbitset.h (BITSET_INLINE): Remove.
 	* lib/bitset.h [! BITSET_INLINE]: Remove.
@@ -17088,12 +17087,12 @@
 	* data/glr.c (inline): Remove #define.  It's the user's
 	responsibility to #define it away, just like 'const'.
 	This fixes one of the bugs reported by Nelson H. F. Beebe in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00058.html>.
+	<https://lists.gnu.org/r/bug-bison/2002-11/msg00058.html>.
 
 	* Makefile.maint (po-check): Scan .l and .y files instead of the
 	.c and the .h files that they generate.  This fixes the bug
 	reported by Tim Van Holder in:
-	<http://lists.gnu.org/archive/html/bison-patches/2002-11/msg00062.html>
+	<https://lists.gnu.org/r/bison-patches/2002-11/msg00062.html>
 	Look for N_ as well as for _.  Try to avoid matching #define for
 	N_ and _.
 	* po/POTFILES.in: Remove src/parse-gram.c, src/scan-gram.c,
@@ -17254,7 +17253,7 @@
 	Revamp to fix many (but not all) of the C- and M4-related quoting
 	problems.  Among other things, this fixes the Bison bug reported
 	by Jan Hubicka when processing the Bash grammar; see:
-	<http://lists.gnu.org/archive/html/bison-patches/2002-11/msg00039.html>
+	<https://lists.gnu.org/r/bison-patches/2002-11/msg00039.html>
 
 	Use new @ escapes consistently.  Represent brackets with @{ and @}
 	rather than @<:@ and @:>@, since this works a bit better with dumb
@@ -17322,7 +17321,7 @@
 2002-11-09  Paul Eggert  <eggert@twinsun.com>
 
 	Fix the test failure due to GCC warnings described in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-11/msg00000.html>.
+	<https://lists.gnu.org/r/bug-bison/2002-11/msg00000.html>.
 	* data/glr.c (yyis_pact_ninf, yyis_table_ninf): New macros, which
 	evaluate to 0 if it's impossible for NINF to be in the respective
 	table.
@@ -17674,8 +17673,8 @@
 	* data/glr.c (struct yyltype): Define members even when not
 	doing locations.  This is more consistent with yacc.c, and it
 	works around the following bug reports:
-	http://lists.gnu.org/archive/html/bug-bison/2002-10/msg00106.html
-	http://lists.gnu.org/archive/html/bug-bison/2002-10/msg00111.html
+	https://lists.gnu.org/r/bug-bison/2002-10/msg00106.html
+	https://lists.gnu.org/r/bug-bison/2002-10/msg00111.html
 
 	* doc/bison.texinfo: Minor spelling and typographical fixes.  Use
 	@acronym consistently.  Standardize on "Yacc" instead of "YACC",
@@ -18107,7 +18106,7 @@
 2002-10-13  Paul Eggert  <eggert@twinsun.com>
 
 	Fix problem reported by Henrik Grubbstroem in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-10/msg00098.html>:
+	<https://lists.gnu.org/r/bug-bison/2002-10/msg00098.html>:
 	"nonterm: { $$ = 123; } { $$ = $1; };" was wrongly rejected,
 	because the Bison parser reads the second action before reducing
 	the first one.
@@ -18124,7 +18123,7 @@
 	Include <sys/time.h> when checking for clock_t and struct tms.
 	Use same include order as source.
 	This is for the SunOS 4.1.4 porting bug reported by Peter Klein in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-10/msg00016.html>.
+	<https://lists.gnu.org/r/bug-bison/2002-10/msg00016.html>.
 
 	* lib/timevar.c: Update copyright date and clarify comments.
 	(get_time) [IN_GCC]: Keep the GCC version for reference.
@@ -18137,13 +18136,13 @@
 	* src/reader.c (grammar_current_rule_check):
 	Don't worry about the default action if $$ is untyped.
 	Prevents bogus warnings reported by Jim Gifford in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-10/msg00015.html>.
+	<https://lists.gnu.org/r/bug-bison/2002-10/msg00015.html>.
 
 	* data/c.m4 (b4_token_enum): Do not define YYTOKENTYPE.
 	* data/glr.c, data/lalr1.cc, data/yacc.c:
 	Output token definitions before the first part of user declarations.
 	Fixes compatibility problem reported by Jim Gifford for kbd in
-	<http://lists.gnu.org/archive/html/bug-bison/2002-10/msg00014.html>.
+	<https://lists.gnu.org/r/bug-bison/2002-10/msg00014.html>.
 
 2002-10-11  Paul Eggert  <eggert@twinsun.com>
 
@@ -18268,7 +18267,7 @@
 
 	* lib/bitset.h (bitset_reset): Do not assume that bitset_word is
 	the same width as int.  This reapplies a hunk of the 2002-08-12 patch
-	<http://lists.gnu.org/archive/html/bison-patches/2002-08/msg00007.html>,
+	<https://lists.gnu.org/r/bison-patches/2002-08/msg00007.html>,
 	which was inadvertently undone by the 2002-09-30 patch.
 	* lib/lbitset.c (debug_lbitset): Do not assume that bitset_word is
 	the same width as int.
@@ -26733,7 +26732,7 @@
 
 	-----
 
-	Copyright (C) 1987-1988, 1991-2015, 2018-2019 Free Software
+	Copyright (C) 1987-1988, 1991-2015, 2018-2021 Free Software
 	Foundation, Inc.
 
 	Copying and distribution of this file, with or without
diff --git a/GNUmakefile b/GNUmakefile
index da25113..0c99d58 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -5,7 +5,7 @@
 # It is necessary if you want to build targets usually of interest
 # only to the maintainer.
 
-# Copyright (C) 2001, 2003, 2006-2019 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2006-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -104,7 +104,7 @@
 
 abort-due-to-no-makefile:
 	@echo There seems to be no Makefile in this directory.   1>&2
-	@echo "You must run ./configure before running 'make'." 1>&2
+	@echo "You must run ./configure before running '$(MAKE)'." 1>&2
 	@exit 1
 
 endif
diff --git a/INSTALL b/INSTALL
index 8865734..e82fd21 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,8 +1,8 @@
 Installation Instructions
 *************************
 
-   Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software
-Foundation, Inc.
+   Copyright (C) 1994-1996, 1999-2002, 2004-2017, 2020-2021 Free
+Software Foundation, Inc.
 
    Copying and distribution of this file, with or without modification,
 are permitted in any medium without royalty provided the copyright
@@ -225,7 +225,7 @@
 
 and if that doesn't work, install pre-built binaries of GCC for HP-UX.
 
-   HP-UX 'make' updates targets which have the same time stamps as their
+   HP-UX 'make' updates targets which have the same timestamps as their
 prerequisites, which makes it generally unusable when shipped generated
 files such as 'configure' are involved.  Use GNU 'make' instead.
 
diff --git a/LICENSE b/LICENSE
new file mode 120000
index 0000000..d24842f
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1 @@
+COPYING
\ No newline at end of file
diff --git a/METADATA b/METADATA
index 7f2840e..92a6e58 100644
--- a/METADATA
+++ b/METADATA
@@ -7,9 +7,9 @@
   }
   url {
     type: ARCHIVE
-    value: "http://ftp.gnu.org/gnu/bison/bison-3.5.tar.gz"
+    value: "http://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.gz"
   }
-  version: "3.5"
-  last_upgrade_date { year: 2019 month: 12 day: 26 }
+  version: "3.8.2"
+  last_upgrade_date { year: 2022 month: 1 day: 28 }
   license_type: RESTRICTED
 }
diff --git a/Makefile.am b/Makefile.am
index eeb348e..18218b2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,6 +1,6 @@
 ## Process this file with automake to produce Makefile.in.
 
-# Copyright (C) 2001-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2001-2015, 2018-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AUTOMAKE_OPTIONS = subdir-objects
 ACLOCAL_AMFLAGS = -I m4
@@ -42,7 +42,7 @@
 BISON = $(top_builddir)/tests/bison
 BISON_IN = $(top_srcdir)/tests/bison.in
 YACC = $(BISON) -o y.tab.c
-AM_YFLAGS_WITH_LINES = --defines -Werror -Wall --report=all
+AM_YFLAGS_WITH_LINES = --defines -Werror -Wall,dangling-alias --report=all
 AM_YFLAGS = $(AM_YFLAGS_WITH_LINES) --no-lines
 
 # Initialization before completion by local.mk's.
@@ -76,6 +76,13 @@
 clean-local:
 	rm -rf $(CLEANDIRS)
 
+.PHONY: gitsort
+gitsort:
+	cd $(srcdir)							\
+	&& for i in $$(git ls-files '*.gitignore' | grep -v doc); do	\
+	  LC_ALL=C sort $$i -o $$i;					\
+	done
+
 # See comments in build-aux/git-version-gen.  However, we make .version depend
 # on configure so that .version and VERSION/PACKAGE_VERSION stay in sync in the
 # working copy (for example, when you run autoreconf && make).  Allowing these
@@ -127,3 +134,16 @@
 	    --since=$(gen_start_date) > $$cl.tmp &&	\
 	  mv -f $$cl.tmp $$cl;				\
 	fi
+
+# Useful to debug.
+.c.i:
+	$(CC) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -o $@ -E $<
+
+.PHONY: codespell
+CODESPELL = codespell
+codespell:
+	$(AM_V_GEN) cd $(srcdir) \
+	&& $(CODESPELL) \
+	     --regex "[\\w\\-'’\`]+\+*" \
+	     --ignore-words-list "ba,circularly,cloneable,copyable,define'd,dout,froms,iff,ifset,od,ois" \
+	     $$(git ls-files data doc lib src tests)
diff --git a/Makefile.in b/Makefile.in
index 6803e81..252ecea 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.4 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -14,7 +14,7 @@
 
 @SET_MAKE@
 
-# Copyright (C) 2001-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2001-2015, 2018-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -27,9 +27,9 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
-# Copyright (C) 2002-2019 Free Software Foundation, Inc.
+# Copyright (C) 2002-2021 Free Software Foundation, Inc.
 #
 # This file is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -68,6 +68,7 @@
 #  array-list \
 #  assert \
 #  assure \
+#  attribute \
 #  bitsetv \
 #  c-strcase \
 #  calloc-posix \
@@ -77,6 +78,7 @@
 #  configmake \
 #  dirname \
 #  error \
+#  execute \
 #  extensions \
 #  fdl \
 #  fopen-safer \
@@ -87,6 +89,7 @@
 #  git-version-gen \
 #  gitlog-to-changelog \
 #  gpl-3.0 \
+#  hash-map \
 #  intprops \
 #  inttypes \
 #  isnan \
@@ -94,6 +97,7 @@
 #  javaexec-script \
 #  ldexpl \
 #  libtextstyle-optional \
+#  linked-list \
 #  malloc-gnu \
 #  mbfile \
 #  mbswidth \
@@ -105,6 +109,8 @@
 #  progname \
 #  quote \
 #  quotearg \
+#  rbtreehash-list \
+#  readline \
 #  readme-release \
 #  realloc-posix \
 #  relocatable-prog \
@@ -115,10 +121,15 @@
 #  sprintf-posix \
 #  stdbool \
 #  stpcpy \
+#  stpncpy \
 #  strdup-posix \
 #  strerror \
+#  strtod \
 #  strverscmp \
+#  sys_ioctl \
+#  termios \
 #  timevar \
+#  unicodeio \
 #  unistd \
 #  unistd-safer \
 #  unlink \
@@ -136,6 +147,7 @@
 #  xconcat-filename \
 #  xhash \
 #  xlist \
+#  xmap \
 #  xmemdup0 \
 #  xstrndup
 
@@ -215,108 +227,149 @@
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-check_PROGRAMS = examples/c/calc/calc$(EXEEXT) $(am__EXEEXT_1) \
-	examples/c/mfcalc/mfcalc$(EXEEXT) $(am__EXEEXT_2) \
-	examples/c/rpcalc/rpcalc$(EXEEXT) $(am__EXEEXT_3) \
-	$(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6)
+check_PROGRAMS = $(am__EXEEXT_1) examples/c/calc/calc$(EXEEXT) \
+	examples/c/glr/c++-types$(EXEEXT) $(am__EXEEXT_2) \
+	examples/c/mfcalc/mfcalc$(EXEEXT) \
+	examples/c/pushcalc/calc$(EXEEXT) $(am__EXEEXT_3) \
+	examples/c/rpcalc/rpcalc$(EXEEXT) $(am__EXEEXT_4) \
+	$(am__EXEEXT_5) $(am__EXEEXT_6) $(am__EXEEXT_7) \
+	$(am__EXEEXT_8)
 @CROSS_COMPILING_FALSE@am__append_1 = $(top_srcdir)/doc/bison.help
-@FLEX_WORKS_TRUE@am__append_2 = examples/c/lexcalc/lexcalc
-@FLEX_WORKS_TRUE@am__append_3 = examples/c/lexcalc/lexcalc.test \
-@FLEX_WORKS_TRUE@	examples/c/reccalc/reccalc.test
-@FLEX_WORKS_TRUE@am__append_4 = examples/c/reccalc/reccalc
-@FLEX_WORKS_TRUE@am__append_5 = $(nodist_examples_c_reccalc_reccalc_SOURCES)
-@ENABLE_CXX_TRUE@@FLEX_CXX_WORKS_TRUE@am__append_6 = examples/c++/calc++/calc++
-@ENABLE_CXX_TRUE@@FLEX_CXX_WORKS_TRUE@am__append_7 = examples/c++/calc++/calc++.test
-@ENABLE_CXX14_TRUE@am__append_8 = examples/c++/simple
-@ENABLE_CXX14_TRUE@am__append_9 = examples/c++/simple.test
-@ENABLE_CXX_TRUE@am__append_10 = examples/c++/variant
-@ENABLE_CXX_TRUE@am__append_11 = examples/c++/variant.test
-@ENABLE_CXX11_TRUE@am__append_12 = examples/c++/variant-11
-@ENABLE_CXX11_TRUE@am__append_13 = examples/c++/variant-11.test
-@ENABLE_D_TRUE@am__append_14 = examples/d/calc
-@ENABLE_D_TRUE@am__append_15 = examples/d/calc.test
-@ENABLE_JAVA_TRUE@am__append_16 = examples/java/Calc.class
-@ENABLE_JAVA_TRUE@am__append_17 = examples/java/Calc.test
-@gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_TRUE@am__append_18 = lib/fd-hook.c
-@gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_TRUE@am__append_19 = lib/hard-locale.c
-@gl_GNULIB_ENABLED_malloca_TRUE@am__append_20 = lib/malloca.c
-@gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_TRUE@am__append_21 = lib/stat-time.c
-@gl_GNULIB_ENABLED_sys_stat_TRUE@am__append_22 = lib/sys/stat.h
-@gl_GNULIB_ENABLED_sys_stat_TRUE@am__append_23 = lib/sys/stat.h lib/sys/stat.h-t
-@gl_GNULIB_ENABLED_sys_stat_TRUE@am__append_24 = lib/sys
-@LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE@am__append_25 = lib/uniwidth/width.c
+@ENABLE_BISTROMATHIC_TRUE@am__append_2 = examples/c/bistromathic/bistromathic
+@ENABLE_BISTROMATHIC_TRUE@am__append_3 = examples/c/bistromathic/bistromathic.test
+@FLEX_WORKS_TRUE@am__append_4 = examples/c/lexcalc/lexcalc
+@FLEX_WORKS_TRUE@am__append_5 = examples/c/lexcalc/lexcalc.test
+@FLEX_WORKS_TRUE@am__append_6 = examples/c/reccalc/reccalc
+@FLEX_WORKS_TRUE@am__append_7 = examples/c/reccalc/reccalc.test
+@FLEX_WORKS_TRUE@am__append_8 = $(nodist_examples_c_reccalc_reccalc_SOURCES)
+@ENABLE_CXX_TRUE@@FLEX_CXX_WORKS_TRUE@am__append_9 = examples/c++/calc++/calc++
+@ENABLE_CXX_TRUE@@FLEX_CXX_WORKS_TRUE@am__append_10 = examples/c++/calc++/calc++.test
+@ENABLE_CXX14_TRUE@am__append_11 = examples/c++/glr/c++-types
+@ENABLE_CXX14_TRUE@am__append_12 = examples/c++/glr/c++-types.test
+@ENABLE_CXX11_TRUE@am__append_13 = examples/c++/simple
+@ENABLE_CXX11_TRUE@am__append_14 = examples/c++/simple.test
+@ENABLE_CXX_TRUE@am__append_15 = examples/c++/variant
+@ENABLE_CXX_TRUE@am__append_16 = examples/c++/variant.test
+@ENABLE_CXX11_TRUE@am__append_17 = examples/c++/variant-11
+@ENABLE_CXX11_TRUE@am__append_18 = examples/c++/variant-11.test
+@ENABLE_D_TRUE@am__append_19 = examples/d/calc/calc \
+@ENABLE_D_TRUE@	examples/d/simple/calc
+@ENABLE_D_TRUE@am__append_20 = examples/d/calc/calc.test \
+@ENABLE_D_TRUE@	examples/d/simple/calc.test
+@ENABLE_JAVA_TRUE@am__append_21 = examples/java/calc/Calc.class \
+@ENABLE_JAVA_TRUE@	examples/java/simple/Calc.class
+@ENABLE_JAVA_TRUE@am__append_22 = examples/java/calc/Calc.test \
+@ENABLE_JAVA_TRUE@	examples/java/simple/Calc.test
+@gl_GNULIB_ENABLED_260941c0e5dc67ec9e87d1fb321c300b_TRUE@am__append_23 = lib/openat-priv.h lib/openat-proc.c
+@gl_GNULIB_ENABLED_dirent_TRUE@am__append_24 = lib/dirent.h
+@gl_GNULIB_ENABLED_dirent_TRUE@am__append_25 = lib/dirent.h lib/dirent.h-t
+@gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_TRUE@am__append_26 = lib/fd-hook.c
+@gl_GNULIB_ENABLED_fca9852db2a43bb33f02f0fbdbc174f6_TRUE@am__append_27 = lib/filenamecat-lgpl.c
+@gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_TRUE@am__append_28 = lib/hard-locale.c
+@gl_GNULIB_ENABLED_locale_TRUE@am__append_29 = lib/locale.h
+@gl_GNULIB_ENABLED_locale_TRUE@am__append_30 = lib/locale.h lib/locale.h-t
+@gl_GNULIB_ENABLED_malloca_TRUE@am__append_31 = lib/malloca.c
+@gl_GNULIB_ENABLED_1840129d490f3a00c8a098316d0fa345_TRUE@am__append_32 = lib/openat-die.c
+@gl_GNULIB_ENABLED_d4850532688ba16d685f036076611f21_TRUE@am__append_33 = lib/save-cwd.c
+@gl_GNULIB_ENABLED_e7e881d32ca02f1c997b13c737c64bbd_TRUE@am__append_34 = lib/setlocale_null.c
+@gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_TRUE@am__append_35 = lib/stat-time.c
+@gl_GNULIB_ENABLED_strings_TRUE@am__append_36 = lib/strings.h
+@gl_GNULIB_ENABLED_strings_TRUE@am__append_37 = lib/strings.h lib/strings.h-t
+@LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_TRUE@am__append_38 = lib/unistr/u8-mbtoucr.c
+@LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE@am__append_39 = lib/unistr/u8-uctomb.c lib/unistr/u8-uctomb-aux.c
+@LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE@am__append_40 = lib/uniwidth/width.c
 bin_PROGRAMS = src/bison$(EXEEXT)
 subdir = .
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \
 	$(top_srcdir)/m4/__inline.m4 \
-	$(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/alloca.m4 \
-	$(top_srcdir)/m4/asm-underscore.m4 $(top_srcdir)/m4/assert.m4 \
+	$(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/access.m4 \
+	$(top_srcdir)/m4/alloca.m4 $(top_srcdir)/m4/asm-underscore.m4 \
+	$(top_srcdir)/m4/assert.m4 \
 	$(top_srcdir)/m4/bison-check-compiler-flag.m4 \
 	$(top_srcdir)/m4/bison-cxx-std.m4 \
-	$(top_srcdir)/m4/bison-i18n.m4 $(top_srcdir)/m4/c-working.m4 \
-	$(top_srcdir)/m4/calloc.m4 $(top_srcdir)/m4/canonicalize.m4 \
-	$(top_srcdir)/m4/clock_time.m4 $(top_srcdir)/m4/close.m4 \
+	$(top_srcdir)/m4/bison-i18n.m4 \
+	$(top_srcdir)/m4/builtin-expect.m4 \
+	$(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/calloc.m4 \
+	$(top_srcdir)/m4/canonicalize.m4 \
+	$(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/clock_time.m4 \
+	$(top_srcdir)/m4/close.m4 $(top_srcdir)/m4/closedir.m4 \
 	$(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/config-h.m4 \
 	$(top_srcdir)/m4/configmake.m4 $(top_srcdir)/m4/cxx.m4 \
-	$(top_srcdir)/m4/dirname.m4 \
-	$(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup2.m4 \
+	$(top_srcdir)/m4/d-ino.m4 $(top_srcdir)/m4/dirent_h.m4 \
+	$(top_srcdir)/m4/dirfd.m4 \
+	$(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup.m4 \
+	$(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eaccess.m4 \
 	$(top_srcdir)/m4/eealloc.m4 $(top_srcdir)/m4/environ.m4 \
 	$(top_srcdir)/m4/errno_h.m4 $(top_srcdir)/m4/error.m4 \
-	$(top_srcdir)/m4/exponentd.m4 $(top_srcdir)/m4/exponentf.m4 \
-	$(top_srcdir)/m4/exponentl.m4 $(top_srcdir)/m4/extensions.m4 \
+	$(top_srcdir)/m4/execute.m4 $(top_srcdir)/m4/exponentd.m4 \
+	$(top_srcdir)/m4/exponentf.m4 $(top_srcdir)/m4/exponentl.m4 \
+	$(top_srcdir)/m4/extensions.m4 \
 	$(top_srcdir)/m4/extern-inline.m4 \
-	$(top_srcdir)/m4/fatal-signal.m4 $(top_srcdir)/m4/fcntl-o.m4 \
-	$(top_srcdir)/m4/fcntl.m4 $(top_srcdir)/m4/fcntl_h.m4 \
-	$(top_srcdir)/m4/flex.m4 $(top_srcdir)/m4/float_h.m4 \
-	$(top_srcdir)/m4/fopen.m4 $(top_srcdir)/m4/fpending.m4 \
-	$(top_srcdir)/m4/fpieee.m4 $(top_srcdir)/m4/fprintf-posix.m4 \
+	$(top_srcdir)/m4/fatal-signal.m4 $(top_srcdir)/m4/fchdir.m4 \
+	$(top_srcdir)/m4/fcntl-o.m4 $(top_srcdir)/m4/fcntl.m4 \
+	$(top_srcdir)/m4/fcntl_h.m4 $(top_srcdir)/m4/fdopendir.m4 \
+	$(top_srcdir)/m4/ffs.m4 $(top_srcdir)/m4/ffsl.m4 \
+	$(top_srcdir)/m4/filenamecat.m4 \
+	$(top_srcdir)/m4/findprog-in.m4 $(top_srcdir)/m4/flex.m4 \
+	$(top_srcdir)/m4/float_h.m4 $(top_srcdir)/m4/fopen.m4 \
+	$(top_srcdir)/m4/fpending.m4 $(top_srcdir)/m4/fpieee.m4 \
+	$(top_srcdir)/m4/fprintf-posix.m4 $(top_srcdir)/m4/free.m4 \
 	$(top_srcdir)/m4/frexp.m4 $(top_srcdir)/m4/frexpl.m4 \
 	$(top_srcdir)/m4/fseterr.m4 $(top_srcdir)/m4/fstat.m4 \
-	$(top_srcdir)/m4/fsync.m4 $(top_srcdir)/m4/getdtablesize.m4 \
-	$(top_srcdir)/m4/gethrxtime.m4 $(top_srcdir)/m4/getopt.m4 \
+	$(top_srcdir)/m4/fstatat.m4 $(top_srcdir)/m4/fsync.m4 \
+	$(top_srcdir)/m4/getcwd-abort-bug.m4 \
+	$(top_srcdir)/m4/getcwd-path-max.m4 $(top_srcdir)/m4/getcwd.m4 \
+	$(top_srcdir)/m4/getdelim.m4 $(top_srcdir)/m4/getdtablesize.m4 \
+	$(top_srcdir)/m4/gethrxtime.m4 $(top_srcdir)/m4/getline.m4 \
+	$(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/getpagesize.m4 \
 	$(top_srcdir)/m4/getprogname.m4 $(top_srcdir)/m4/getrusage.m4 \
 	$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gettime.m4 \
 	$(top_srcdir)/m4/gettimeofday.m4 \
 	$(top_srcdir)/m4/gnulib-common.m4 \
 	$(top_srcdir)/m4/gnulib-comp.m4 \
 	$(top_srcdir)/m4/host-cpu-c-abi.m4 $(top_srcdir)/m4/iconv.m4 \
-	$(top_srcdir)/m4/include_next.m4 \
+	$(top_srcdir)/m4/iconv_h.m4 $(top_srcdir)/m4/iconv_open.m4 \
+	$(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/inline.m4 \
 	$(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax_t.m4 \
-	$(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \
-	$(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isnan.m4 \
-	$(top_srcdir)/m4/isnand.m4 $(top_srcdir)/m4/isnanf.m4 \
-	$(top_srcdir)/m4/isnanl.m4 $(top_srcdir)/m4/iswblank.m4 \
-	$(top_srcdir)/m4/javacomp.m4 $(top_srcdir)/m4/javaexec.m4 \
-	$(top_srcdir)/m4/jm-winsz1.m4 $(top_srcdir)/m4/jm-winsz2.m4 \
-	$(top_srcdir)/m4/largefile.m4 $(top_srcdir)/m4/ldexp.m4 \
-	$(top_srcdir)/m4/ldexpl.m4 $(top_srcdir)/m4/lib-ld.m4 \
-	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \
+	$(top_srcdir)/m4/isnan.m4 $(top_srcdir)/m4/isnand.m4 \
+	$(top_srcdir)/m4/isnanf.m4 $(top_srcdir)/m4/isnanl.m4 \
+	$(top_srcdir)/m4/iswblank.m4 $(top_srcdir)/m4/iswdigit.m4 \
+	$(top_srcdir)/m4/iswxdigit.m4 $(top_srcdir)/m4/javacomp.m4 \
+	$(top_srcdir)/m4/javaexec.m4 $(top_srcdir)/m4/jm-winsz1.m4 \
+	$(top_srcdir)/m4/jm-winsz2.m4 $(top_srcdir)/m4/largefile.m4 \
+	$(top_srcdir)/m4/ldexp.m4 $(top_srcdir)/m4/ldexpl.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 \
 	$(top_srcdir)/m4/libtextstyle-optional.m4 \
 	$(top_srcdir)/m4/libtextstyle.m4 \
 	$(top_srcdir)/m4/libunistring-base.m4 \
 	$(top_srcdir)/m4/limits-h.m4 $(top_srcdir)/m4/localcharset.m4 \
 	$(top_srcdir)/m4/locale-fr.m4 $(top_srcdir)/m4/locale-ja.m4 \
-	$(top_srcdir)/m4/locale-zh.m4 \
-	$(top_srcdir)/m4/localtime-buffer.m4 $(top_srcdir)/m4/lock.m4 \
-	$(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/lstat.m4 \
+	$(top_srcdir)/m4/locale-zh.m4 $(top_srcdir)/m4/locale_h.m4 \
+	$(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/lstat.m4 \
 	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/malloc.m4 \
 	$(top_srcdir)/m4/malloca.m4 $(top_srcdir)/m4/math_h.m4 \
 	$(top_srcdir)/m4/mbchar.m4 $(top_srcdir)/m4/mbfile.m4 \
 	$(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbsinit.m4 \
 	$(top_srcdir)/m4/mbstate_t.m4 $(top_srcdir)/m4/mbswidth.m4 \
-	$(top_srcdir)/m4/memchr.m4 $(top_srcdir)/m4/minmax.m4 \
+	$(top_srcdir)/m4/memchr.m4 $(top_srcdir)/m4/mempcpy.m4 \
+	$(top_srcdir)/m4/memrchr.m4 $(top_srcdir)/m4/minmax.m4 \
 	$(top_srcdir)/m4/mmap-anon.m4 $(top_srcdir)/m4/mode_t.m4 \
 	$(top_srcdir)/m4/msvc-inval.m4 \
 	$(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \
-	$(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/nocrash.m4 \
+	$(top_srcdir)/m4/musl.m4 $(top_srcdir)/m4/nls.m4 \
+	$(top_srcdir)/m4/nocrash.m4 \
 	$(top_srcdir)/m4/non-recursive-gnulib-prefix-hack.m4 \
 	$(top_srcdir)/m4/obstack-printf.m4 $(top_srcdir)/m4/obstack.m4 \
 	$(top_srcdir)/m4/off_t.m4 $(top_srcdir)/m4/open-cloexec.m4 \
 	$(top_srcdir)/m4/open-slash.m4 $(top_srcdir)/m4/open.m4 \
+	$(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/opendir.m4 \
 	$(top_srcdir)/m4/pathmax.m4 $(top_srcdir)/m4/perror.m4 \
-	$(top_srcdir)/m4/pipe2.m4 $(top_srcdir)/m4/po.m4 \
-	$(top_srcdir)/m4/posix_spawn.m4 \
+	$(top_srcdir)/m4/pipe.m4 $(top_srcdir)/m4/pipe2.m4 \
+	$(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/posix_spawn.m4 \
+	$(top_srcdir)/m4/posix_spawn_faction_addchdir.m4 \
 	$(top_srcdir)/m4/printf-frexp.m4 \
 	$(top_srcdir)/m4/printf-frexpl.m4 \
 	$(top_srcdir)/m4/printf-posix-rpl.m4 \
@@ -324,11 +377,15 @@
 	$(top_srcdir)/m4/pthread_rwlock_rdlock.m4 \
 	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
 	$(top_srcdir)/m4/raise.m4 $(top_srcdir)/m4/rawmemchr.m4 \
+	$(top_srcdir)/m4/readdir.m4 $(top_srcdir)/m4/readline.m4 \
 	$(top_srcdir)/m4/readlink.m4 $(top_srcdir)/m4/realloc.m4 \
+	$(top_srcdir)/m4/reallocarray.m4 \
 	$(top_srcdir)/m4/relocatable-lib.m4 \
 	$(top_srcdir)/m4/relocatable.m4 $(top_srcdir)/m4/rename.m4 \
-	$(top_srcdir)/m4/rmdir.m4 $(top_srcdir)/m4/sched_h.m4 \
-	$(top_srcdir)/m4/setenv.m4 $(top_srcdir)/m4/sh-filename.m4 \
+	$(top_srcdir)/m4/rewinddir.m4 $(top_srcdir)/m4/rmdir.m4 \
+	$(top_srcdir)/m4/save-cwd.m4 $(top_srcdir)/m4/sched_h.m4 \
+	$(top_srcdir)/m4/setenv.m4 $(top_srcdir)/m4/setlocale_null.m4 \
+	$(top_srcdir)/m4/sh-filename.m4 \
 	$(top_srcdir)/m4/sig_atomic_t.m4 $(top_srcdir)/m4/sigaction.m4 \
 	$(top_srcdir)/m4/signal_h.m4 \
 	$(top_srcdir)/m4/signalblocking.m4 $(top_srcdir)/m4/signbit.m4 \
@@ -337,28 +394,32 @@
 	$(top_srcdir)/m4/snprintf.m4 $(top_srcdir)/m4/spawn-pipe.m4 \
 	$(top_srcdir)/m4/spawn_h.m4 $(top_srcdir)/m4/sprintf-posix.m4 \
 	$(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stat-time.m4 \
-	$(top_srcdir)/m4/stat.m4 $(top_srcdir)/m4/std-gnu11.m4 \
+	$(top_srcdir)/m4/stat.m4 $(top_srcdir)/m4/stdalign.m4 \
 	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stddef_h.m4 \
 	$(top_srcdir)/m4/stdint.m4 $(top_srcdir)/m4/stdint_h.m4 \
 	$(top_srcdir)/m4/stdio_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \
-	$(top_srcdir)/m4/stpcpy.m4 $(top_srcdir)/m4/strchrnul.m4 \
-	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \
-	$(top_srcdir)/m4/strerror_r.m4 $(top_srcdir)/m4/string_h.m4 \
+	$(top_srcdir)/m4/stpcpy.m4 $(top_srcdir)/m4/stpncpy.m4 \
+	$(top_srcdir)/m4/strchrnul.m4 $(top_srcdir)/m4/strdup.m4 \
+	$(top_srcdir)/m4/strerror.m4 $(top_srcdir)/m4/strerror_r.m4 \
+	$(top_srcdir)/m4/string_h.m4 $(top_srcdir)/m4/strings_h.m4 \
 	$(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
-	$(top_srcdir)/m4/strverscmp.m4 \
+	$(top_srcdir)/m4/strtod.m4 $(top_srcdir)/m4/strverscmp.m4 \
+	$(top_srcdir)/m4/sys_ioctl_h.m4 \
 	$(top_srcdir)/m4/sys_resource_h.m4 \
 	$(top_srcdir)/m4/sys_socket_h.m4 \
 	$(top_srcdir)/m4/sys_stat_h.m4 $(top_srcdir)/m4/sys_time_h.m4 \
 	$(top_srcdir)/m4/sys_times_h.m4 \
 	$(top_srcdir)/m4/sys_types_h.m4 $(top_srcdir)/m4/sys_wait_h.m4 \
-	$(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/time_h.m4 \
-	$(top_srcdir)/m4/timespec.m4 $(top_srcdir)/m4/tls.m4 \
+	$(top_srcdir)/m4/termios_h.m4 $(top_srcdir)/m4/threadlib.m4 \
+	$(top_srcdir)/m4/time_h.m4 $(top_srcdir)/m4/timespec.m4 \
+	$(top_srcdir)/m4/tls.m4 $(top_srcdir)/m4/unicodeio.m4 \
 	$(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \
 	$(top_srcdir)/m4/unlink.m4 $(top_srcdir)/m4/unlocked-io.m4 \
 	$(top_srcdir)/m4/vasnprintf.m4 \
 	$(top_srcdir)/m4/vasprintf-posix.m4 \
 	$(top_srcdir)/m4/vasprintf.m4 \
 	$(top_srcdir)/m4/vfprintf-posix.m4 \
+	$(top_srcdir)/m4/visibility.m4 \
 	$(top_srcdir)/m4/vsnprintf-posix.m4 \
 	$(top_srcdir)/m4/vsnprintf.m4 \
 	$(top_srcdir)/m4/vsprintf-posix.m4 \
@@ -368,17 +429,21 @@
 	$(top_srcdir)/m4/wctype_h.m4 $(top_srcdir)/m4/wcwidth.m4 \
 	$(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xalloc.m4 \
 	$(top_srcdir)/m4/xsize.m4 $(top_srcdir)/m4/xstrndup.m4 \
+	$(top_srcdir)/m4/year2038.m4 $(top_srcdir)/m4/zzgnulib.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
 	$(am__configure_deps) $(dist_noinst_SCRIPTS) \
 	$(srcdir)/doc/version.texi $(srcdir)/doc/stamp-vti \
-	$(dist_c_DATA) $(dist_calc_DATA) $(dist_calcxx_DATA) \
-	$(dist_cxx_DATA) $(dist_d_DATA) $(dist_doc_DATA) \
-	$(dist_examples_DATA) $(dist_java_DATA) $(dist_lexcalc_DATA) \
-	$(dist_m4sugar_DATA) $(dist_mfcalc_DATA) $(dist_pkgdata_DATA) \
-	$(dist_reccalc_DATA) $(dist_rpcalc_DATA) \
+	$(dist_bistromathic_DATA) $(dist_c_DATA) $(dist_calc_DATA) \
+	$(dist_calcd_DATA) $(dist_calcxx_DATA) $(dist_cxx_DATA) \
+	$(dist_d_DATA) $(dist_doc_DATA) $(dist_examples_DATA) \
+	$(dist_glr_DATA) $(dist_java_DATA) $(dist_java_calc_DATA) \
+	$(dist_java_simple_DATA) $(dist_lexcalc_DATA) \
+	$(dist_m4sugar_DATA) $(dist_mfcalc_DATA) $(dist_noinst_DATA) \
+	$(dist_pkgdata_DATA) $(dist_pushcalc_DATA) \
+	$(dist_reccalc_DATA) $(dist_rpcalc_DATA) $(dist_simpled_DATA) \
 	$(dist_skeletons_DATA) $(dist_xslt_DATA) $(am__DIST_COMMON)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
  configure.lineno config.status.lineno
@@ -391,21 +456,27 @@
 	"$(DESTDIR)$(bindir)" "$(DESTDIR)$(infodir)" \
 	"$(DESTDIR)$(man1dir)" "$(DESTDIR)$(aclocaldir)" \
 	"$(DESTDIR)$(calcxxdir)" "$(DESTDIR)$(cxxdir)" \
-	"$(DESTDIR)$(cdir)" "$(DESTDIR)$(calcdir)" \
+	"$(DESTDIR)$(bistromathicdir)" "$(DESTDIR)$(cdir)" \
+	"$(DESTDIR)$(calcdir)" "$(DESTDIR)$(calcddir)" \
 	"$(DESTDIR)$(calcxxdir)" "$(DESTDIR)$(cxxdir)" \
 	"$(DESTDIR)$(ddir)" "$(DESTDIR)$(docdir)" \
-	"$(DESTDIR)$(examplesdir)" "$(DESTDIR)$(javadir)" \
-	"$(DESTDIR)$(lexcalcdir)" "$(DESTDIR)$(m4sugardir)" \
-	"$(DESTDIR)$(mfcalcdir)" "$(DESTDIR)$(pkgdatadir)" \
+	"$(DESTDIR)$(examplesdir)" "$(DESTDIR)$(glrdir)" \
+	"$(DESTDIR)$(javadir)" "$(DESTDIR)$(java_calcdir)" \
+	"$(DESTDIR)$(java_simpledir)" "$(DESTDIR)$(lexcalcdir)" \
+	"$(DESTDIR)$(m4sugardir)" "$(DESTDIR)$(mfcalcdir)" \
+	"$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(pushcalcdir)" \
 	"$(DESTDIR)$(reccalcdir)" "$(DESTDIR)$(rpcalcdir)" \
-	"$(DESTDIR)$(skeletonsdir)" "$(DESTDIR)$(xsltdir)" \
-	"$(DESTDIR)$(mfcalcdir)" "$(DESTDIR)$(rpcalcdir)"
-@FLEX_WORKS_TRUE@am__EXEEXT_1 = examples/c/lexcalc/lexcalc$(EXEEXT)
-@FLEX_WORKS_TRUE@am__EXEEXT_2 = examples/c/reccalc/reccalc$(EXEEXT)
-@ENABLE_CXX_TRUE@@FLEX_CXX_WORKS_TRUE@am__EXEEXT_3 = examples/c++/calc++/calc++$(EXEEXT)
-@ENABLE_CXX14_TRUE@am__EXEEXT_4 = examples/c++/simple$(EXEEXT)
-@ENABLE_CXX_TRUE@am__EXEEXT_5 = examples/c++/variant$(EXEEXT)
-@ENABLE_CXX11_TRUE@am__EXEEXT_6 = examples/c++/variant-11$(EXEEXT)
+	"$(DESTDIR)$(simpleddir)" "$(DESTDIR)$(skeletonsdir)" \
+	"$(DESTDIR)$(xsltdir)" "$(DESTDIR)$(mfcalcdir)" \
+	"$(DESTDIR)$(rpcalcdir)"
+@ENABLE_BISTROMATHIC_TRUE@am__EXEEXT_1 = examples/c/bistromathic/bistromathic$(EXEEXT)
+@FLEX_WORKS_TRUE@am__EXEEXT_2 = examples/c/lexcalc/lexcalc$(EXEEXT)
+@FLEX_WORKS_TRUE@am__EXEEXT_3 = examples/c/reccalc/reccalc$(EXEEXT)
+@ENABLE_CXX_TRUE@@FLEX_CXX_WORKS_TRUE@am__EXEEXT_4 = examples/c++/calc++/calc++$(EXEEXT)
+@ENABLE_CXX14_TRUE@am__EXEEXT_5 = examples/c++/glr/c++-types$(EXEEXT)
+@ENABLE_CXX11_TRUE@am__EXEEXT_6 = examples/c++/simple$(EXEEXT)
+@ENABLE_CXX_TRUE@am__EXEEXT_7 = examples/c++/variant$(EXEEXT)
+@ENABLE_CXX11_TRUE@am__EXEEXT_8 = examples/c++/variant-11$(EXEEXT)
 PROGRAMS = $(bin_PROGRAMS)
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
@@ -443,46 +514,78 @@
 am__DEPENDENCIES_1 =
 am__lib_libbison_a_SOURCES_DIST = lib/allocator.c lib/areadlink.c \
 	lib/argmatch.c lib/gl_array_list.h lib/gl_array_list.c \
+	lib/openat-priv.h lib/openat-proc.c lib/basename-lgpl.c \
 	lib/binary-io.h lib/binary-io.c lib/bitrotate.h \
 	lib/bitrotate.c lib/bitset.c lib/bitset/array.c \
 	lib/bitset/stats.c lib/bitset/table.c lib/bitset/list.c \
 	lib/bitset/vector.c lib/bitsetv.c lib/c-ctype.h lib/c-ctype.c \
 	lib/c-strcase.h lib/c-strcasecmp.c lib/c-strncasecmp.c \
-	lib/careadlinkat.c lib/cloexec.c lib/close-stream.c \
-	lib/closeout.c lib/concat-filename.c lib/diffseq.h \
-	lib/dirname.c lib/basename.c lib/dirname-lgpl.c \
-	lib/basename-lgpl.c lib/stripslash.c lib/exitfail.c \
+	lib/canonicalize.c lib/careadlinkat.c lib/cloexec.c \
+	lib/close-stream.c lib/closeout.c lib/concat-filename.c \
+	lib/diffseq.h lib/dirname.c lib/basename.c lib/dirname-lgpl.c \
+	lib/stripslash.c lib/execute.h lib/execute.c lib/exitfail.c \
 	lib/fatal-signal.h lib/fatal-signal.c lib/fd-hook.c \
-	lib/fd-safer-flag.c lib/dup-safer-flag.c lib/fopen-safer.c \
-	lib/fstrcmp.h lib/fstrcmp.c lib/gethrxtime.c lib/xtime.c \
-	lib/getprogname.h lib/getprogname.c lib/gettext.h \
-	lib/gettime.c lib/hard-locale.c lib/hash.c lib/gl_list.h \
-	lib/gl_list.c lib/localcharset.c lib/glthread/lock.h \
-	lib/glthread/lock.c lib/malloca.c lib/math.c lib/mbchar.c \
-	lib/mbfile.h lib/mbfile.c lib/mbswidth.h lib/mbswidth.c \
-	lib/minmax.h lib/pipe2.c lib/pipe2-safer.c lib/printf-frexp.c \
-	lib/printf-frexpl.c lib/progname.h lib/progname.c \
-	lib/quotearg.c lib/sig-handler.c lib/size_max.h \
-	lib/spawn-pipe.h lib/spawn-pipe.c lib/w32spawn.h \
-	lib/stat-time.c lib/glthread/threadlib.c lib/timespec.c \
-	lib/timevar.c lib/timevar.def lib/glthread/tls.h \
-	lib/glthread/tls.c lib/unistd.c lib/dup-safer.c lib/fd-safer.c \
-	lib/pipe-safer.c lib/uniwidth/width.c lib/wait-process.h \
-	lib/wait-process.c lib/wctype-h.c lib/xmalloc.c \
-	lib/xalloc-die.c lib/xconcat-filename.c lib/xhash.c \
-	lib/gl_xlist.h lib/gl_xlist.c lib/xreadlink.c lib/xsize.h \
-	lib/xsize.c lib/xstrndup.h lib/xstrndup.c lib/get-errno.h \
-	lib/get-errno.c lib/path-join.h lib/path-join.c
+	lib/fd-safer-flag.c lib/dup-safer-flag.c lib/file-set.c \
+	lib/filenamecat-lgpl.c lib/findprog.h lib/findprog-in.c \
+	lib/fopen-safer.c lib/fstrcmp.h lib/fstrcmp.c lib/gethrxtime.c \
+	lib/xtime.c lib/getprogname.h lib/getprogname.c lib/gettext.h \
+	lib/gettime.c lib/hard-locale.c lib/hash.c lib/gl_hash_map.h \
+	lib/gl_hash_map.c lib/gl_anyhash1.h lib/gl_anyhash2.h \
+	lib/gl_anyhash_primes.h lib/hash-pjw.h lib/hash-pjw.c \
+	lib/hash-triple-simple.c lib/ialloc.c lib/idx.h \
+	lib/integer_length.c lib/integer_length_l.c \
+	lib/gl_linked_list.h lib/gl_linked_list.c \
+	lib/gl_anylinked_list1.h lib/gl_anylinked_list2.h \
+	lib/gl_list.h lib/gl_list.c lib/localcharset.c \
+	lib/glthread/lock.h lib/glthread/lock.c lib/malloca.c \
+	lib/gl_map.h lib/gl_map.c lib/math.c lib/mbchar.c lib/mbfile.h \
+	lib/mbfile.c lib/mbswidth.h lib/mbswidth.c lib/minmax.h \
+	lib/openat-die.c lib/gl_oset.h lib/gl_oset.c lib/pipe2.c \
+	lib/pipe2-safer.c lib/printf-frexp.c lib/printf-frexpl.c \
+	lib/progname.h lib/progname.c lib/quotearg.c \
+	lib/gl_rbtree_oset.h lib/gl_rbtree_oset.c \
+	lib/gl_rbtree_ordered.h lib/gl_anytree_oset.h \
+	lib/gl_rbtreehash_list.h lib/gl_rbtreehash_list.c \
+	lib/gl_anyrbtree_list1.h lib/gl_anyrbtree_list2.h \
+	lib/gl_anytree_list1.h lib/gl_anytree_list2.h \
+	lib/gl_anytreehash_list1.h lib/gl_anytreehash_list2.h \
+	lib/save-cwd.c lib/malloc/scratch_buffer_dupfree.c \
+	lib/malloc/scratch_buffer_grow.c \
+	lib/malloc/scratch_buffer_grow_preserve.c \
+	lib/malloc/scratch_buffer_set_array_size.c \
+	lib/setlocale_null.c lib/sig-handler.c lib/size_max.h \
+	lib/spawn-pipe.h lib/spawn-pipe.c lib/stat-time.c \
+	lib/glthread/threadlib.c lib/timespec.c lib/timevar.c \
+	lib/timevar.def lib/glthread/tls.h lib/glthread/tls.c \
+	lib/unicodeio.h lib/unicodeio.c lib/unistd.c lib/dup-safer.c \
+	lib/fd-safer.c lib/pipe-safer.c lib/unistr/u8-mbtoucr.c \
+	lib/unistr/u8-uctomb.c lib/unistr/u8-uctomb-aux.c \
+	lib/uniwidth/width.c lib/wait-process.h lib/wait-process.c \
+	lib/wctype-h.c lib/xmalloc.c lib/xalloc-die.c \
+	lib/xconcat-filename.c lib/xhash.c lib/gl_xlist.h \
+	lib/gl_xlist.c lib/gl_xmap.h lib/gl_xmap.c lib/xmemdup0.h \
+	lib/xmemdup0.c lib/xreadlink.c lib/xsize.h lib/xsize.c \
+	lib/xstrndup.h lib/xstrndup.c lib/get-errno.h lib/get-errno.c \
+	lib/path-join.h lib/path-join.c
 am__dirstamp = $(am__leading_dot)dirstamp
-@gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_TRUE@am__objects_1 = lib/libbison_a-fd-hook.$(OBJEXT)
-@gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_TRUE@am__objects_2 = lib/libbison_a-hard-locale.$(OBJEXT)
-@gl_GNULIB_ENABLED_malloca_TRUE@am__objects_3 = lib/libbison_a-malloca.$(OBJEXT)
-@gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_TRUE@am__objects_4 = lib/libbison_a-stat-time.$(OBJEXT)
-@LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE@am__objects_5 = lib/uniwidth/libbison_a-width.$(OBJEXT)
+@gl_GNULIB_ENABLED_260941c0e5dc67ec9e87d1fb321c300b_TRUE@am__objects_1 = lib/libbison_a-openat-proc.$(OBJEXT)
+@gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_TRUE@am__objects_2 = lib/libbison_a-fd-hook.$(OBJEXT)
+@gl_GNULIB_ENABLED_fca9852db2a43bb33f02f0fbdbc174f6_TRUE@am__objects_3 = lib/libbison_a-filenamecat-lgpl.$(OBJEXT)
+@gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_TRUE@am__objects_4 = lib/libbison_a-hard-locale.$(OBJEXT)
+@gl_GNULIB_ENABLED_malloca_TRUE@am__objects_5 = lib/libbison_a-malloca.$(OBJEXT)
+@gl_GNULIB_ENABLED_1840129d490f3a00c8a098316d0fa345_TRUE@am__objects_6 = lib/libbison_a-openat-die.$(OBJEXT)
+@gl_GNULIB_ENABLED_d4850532688ba16d685f036076611f21_TRUE@am__objects_7 = lib/libbison_a-save-cwd.$(OBJEXT)
+@gl_GNULIB_ENABLED_e7e881d32ca02f1c997b13c737c64bbd_TRUE@am__objects_8 = lib/libbison_a-setlocale_null.$(OBJEXT)
+@gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_TRUE@am__objects_9 = lib/libbison_a-stat-time.$(OBJEXT)
+@LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_TRUE@am__objects_10 = lib/unistr/libbison_a-u8-mbtoucr.$(OBJEXT)
+@LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE@am__objects_11 = lib/unistr/libbison_a-u8-uctomb.$(OBJEXT) \
+@LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE@	lib/unistr/libbison_a-u8-uctomb-aux.$(OBJEXT)
+@LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE@am__objects_12 = lib/uniwidth/libbison_a-width.$(OBJEXT)
 am_lib_libbison_a_OBJECTS = lib/libbison_a-allocator.$(OBJEXT) \
 	lib/libbison_a-areadlink.$(OBJEXT) \
 	lib/libbison_a-argmatch.$(OBJEXT) \
-	lib/libbison_a-gl_array_list.$(OBJEXT) \
+	lib/libbison_a-gl_array_list.$(OBJEXT) $(am__objects_1) \
+	lib/libbison_a-basename-lgpl.$(OBJEXT) \
 	lib/libbison_a-binary-io.$(OBJEXT) \
 	lib/libbison_a-bitrotate.$(OBJEXT) \
 	lib/libbison_a-bitset.$(OBJEXT) \
@@ -495,6 +598,7 @@
 	lib/libbison_a-c-ctype.$(OBJEXT) \
 	lib/libbison_a-c-strcasecmp.$(OBJEXT) \
 	lib/libbison_a-c-strncasecmp.$(OBJEXT) \
+	lib/libbison_a-canonicalize.$(OBJEXT) \
 	lib/libbison_a-careadlinkat.$(OBJEXT) \
 	lib/libbison_a-cloexec.$(OBJEXT) \
 	lib/libbison_a-close-stream.$(OBJEXT) \
@@ -503,40 +607,60 @@
 	lib/libbison_a-dirname.$(OBJEXT) \
 	lib/libbison_a-basename.$(OBJEXT) \
 	lib/libbison_a-dirname-lgpl.$(OBJEXT) \
-	lib/libbison_a-basename-lgpl.$(OBJEXT) \
 	lib/libbison_a-stripslash.$(OBJEXT) \
+	lib/libbison_a-execute.$(OBJEXT) \
 	lib/libbison_a-exitfail.$(OBJEXT) \
-	lib/libbison_a-fatal-signal.$(OBJEXT) $(am__objects_1) \
+	lib/libbison_a-fatal-signal.$(OBJEXT) $(am__objects_2) \
 	lib/libbison_a-fd-safer-flag.$(OBJEXT) \
 	lib/libbison_a-dup-safer-flag.$(OBJEXT) \
+	lib/libbison_a-file-set.$(OBJEXT) $(am__objects_3) \
+	lib/libbison_a-findprog-in.$(OBJEXT) \
 	lib/libbison_a-fopen-safer.$(OBJEXT) \
 	lib/libbison_a-fstrcmp.$(OBJEXT) \
 	lib/libbison_a-gethrxtime.$(OBJEXT) \
 	lib/libbison_a-xtime.$(OBJEXT) \
 	lib/libbison_a-getprogname.$(OBJEXT) \
-	lib/libbison_a-gettime.$(OBJEXT) $(am__objects_2) \
-	lib/libbison_a-hash.$(OBJEXT) lib/libbison_a-gl_list.$(OBJEXT) \
+	lib/libbison_a-gettime.$(OBJEXT) $(am__objects_4) \
+	lib/libbison_a-hash.$(OBJEXT) \
+	lib/libbison_a-gl_hash_map.$(OBJEXT) \
+	lib/libbison_a-hash-pjw.$(OBJEXT) \
+	lib/libbison_a-hash-triple-simple.$(OBJEXT) \
+	lib/libbison_a-ialloc.$(OBJEXT) \
+	lib/libbison_a-integer_length.$(OBJEXT) \
+	lib/libbison_a-integer_length_l.$(OBJEXT) \
+	lib/libbison_a-gl_linked_list.$(OBJEXT) \
+	lib/libbison_a-gl_list.$(OBJEXT) \
 	lib/libbison_a-localcharset.$(OBJEXT) \
-	lib/glthread/libbison_a-lock.$(OBJEXT) $(am__objects_3) \
-	lib/libbison_a-math.$(OBJEXT) lib/libbison_a-mbchar.$(OBJEXT) \
+	lib/glthread/libbison_a-lock.$(OBJEXT) $(am__objects_5) \
+	lib/libbison_a-gl_map.$(OBJEXT) lib/libbison_a-math.$(OBJEXT) \
+	lib/libbison_a-mbchar.$(OBJEXT) \
 	lib/libbison_a-mbfile.$(OBJEXT) \
-	lib/libbison_a-mbswidth.$(OBJEXT) \
+	lib/libbison_a-mbswidth.$(OBJEXT) $(am__objects_6) \
+	lib/libbison_a-gl_oset.$(OBJEXT) \
 	lib/libbison_a-pipe2.$(OBJEXT) \
 	lib/libbison_a-pipe2-safer.$(OBJEXT) \
 	lib/libbison_a-printf-frexp.$(OBJEXT) \
 	lib/libbison_a-printf-frexpl.$(OBJEXT) \
 	lib/libbison_a-progname.$(OBJEXT) \
 	lib/libbison_a-quotearg.$(OBJEXT) \
-	lib/libbison_a-sig-handler.$(OBJEXT) \
-	lib/libbison_a-spawn-pipe.$(OBJEXT) $(am__objects_4) \
+	lib/libbison_a-gl_rbtree_oset.$(OBJEXT) \
+	lib/libbison_a-gl_rbtreehash_list.$(OBJEXT) $(am__objects_7) \
+	lib/malloc/libbison_a-scratch_buffer_dupfree.$(OBJEXT) \
+	lib/malloc/libbison_a-scratch_buffer_grow.$(OBJEXT) \
+	lib/malloc/libbison_a-scratch_buffer_grow_preserve.$(OBJEXT) \
+	lib/malloc/libbison_a-scratch_buffer_set_array_size.$(OBJEXT) \
+	$(am__objects_8) lib/libbison_a-sig-handler.$(OBJEXT) \
+	lib/libbison_a-spawn-pipe.$(OBJEXT) $(am__objects_9) \
 	lib/glthread/libbison_a-threadlib.$(OBJEXT) \
 	lib/libbison_a-timespec.$(OBJEXT) \
 	lib/libbison_a-timevar.$(OBJEXT) \
 	lib/glthread/libbison_a-tls.$(OBJEXT) \
+	lib/libbison_a-unicodeio.$(OBJEXT) \
 	lib/libbison_a-unistd.$(OBJEXT) \
 	lib/libbison_a-dup-safer.$(OBJEXT) \
 	lib/libbison_a-fd-safer.$(OBJEXT) \
-	lib/libbison_a-pipe-safer.$(OBJEXT) $(am__objects_5) \
+	lib/libbison_a-pipe-safer.$(OBJEXT) $(am__objects_10) \
+	$(am__objects_11) $(am__objects_12) \
 	lib/libbison_a-wait-process.$(OBJEXT) \
 	lib/libbison_a-wctype-h.$(OBJEXT) \
 	lib/libbison_a-xmalloc.$(OBJEXT) \
@@ -544,6 +668,8 @@
 	lib/libbison_a-xconcat-filename.$(OBJEXT) \
 	lib/libbison_a-xhash.$(OBJEXT) \
 	lib/libbison_a-gl_xlist.$(OBJEXT) \
+	lib/libbison_a-gl_xmap.$(OBJEXT) \
+	lib/libbison_a-xmemdup0.$(OBJEXT) \
 	lib/libbison_a-xreadlink.$(OBJEXT) \
 	lib/libbison_a-xsize.$(OBJEXT) \
 	lib/libbison_a-xstrndup.$(OBJEXT) \
@@ -556,23 +682,34 @@
 @ENABLE_YACC_TRUE@am_lib_liby_a_OBJECTS = lib/main.$(OBJEXT) \
 @ENABLE_YACC_TRUE@	lib/yyerror.$(OBJEXT)
 lib_liby_a_OBJECTS = $(am_lib_liby_a_OBJECTS)
-am__objects_6 = examples/c++/calc++/calc__-driver.$(OBJEXT) \
+am__objects_13 = examples/c++/calc++/calc__-driver.$(OBJEXT) \
 	examples/c++/calc++/calc__-scanner.$(OBJEXT) \
 	examples/c++/calc++/calc__-calc++.$(OBJEXT)
-am__objects_7 = examples/c++/calc++/calc__-parser.$(OBJEXT)
-am__objects_8 = $(am__objects_6) $(am__objects_7)
+am__objects_14 = examples/c++/calc++/calc__-parser.$(OBJEXT)
+am__objects_15 = $(am__objects_13) $(am__objects_14)
 @ENABLE_CXX_TRUE@@FLEX_CXX_WORKS_TRUE@nodist_examples_c___calc___calc___OBJECTS =  \
-@ENABLE_CXX_TRUE@@FLEX_CXX_WORKS_TRUE@	$(am__objects_8)
+@ENABLE_CXX_TRUE@@FLEX_CXX_WORKS_TRUE@	$(am__objects_15)
 examples_c___calc___calc___OBJECTS =  \
 	$(nodist_examples_c___calc___calc___OBJECTS)
 examples_c___calc___calc___LDADD = $(LDADD)
 examples_c___calc___calc___LINK = $(CXXLD) \
 	$(examples_c___calc___calc___CXXFLAGS) $(CXXFLAGS) \
 	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-am__objects_9 = examples/c++/simple-simple.$(OBJEXT)
-am__objects_10 = $(am__objects_9)
-@ENABLE_CXX14_TRUE@nodist_examples_c___simple_OBJECTS =  \
-@ENABLE_CXX14_TRUE@	$(am__objects_10)
+am__dist_examples_c___glr_c___types_SOURCES_DIST =  \
+	examples/c++/glr/ast.hh
+dist_examples_c___glr_c___types_OBJECTS =
+@ENABLE_CXX14_TRUE@nodist_examples_c___glr_c___types_OBJECTS = examples/c++/glr/examples_c___glr_c___types-c++-types.$(OBJEXT)
+examples_c___glr_c___types_OBJECTS =  \
+	$(dist_examples_c___glr_c___types_OBJECTS) \
+	$(nodist_examples_c___glr_c___types_OBJECTS)
+examples_c___glr_c___types_LDADD = $(LDADD)
+examples_c___glr_c___types_LINK = $(CXXLD) \
+	$(examples_c___glr_c___types_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+am__objects_16 = examples/c++/simple-simple.$(OBJEXT)
+am__objects_17 = $(am__objects_16)
+@ENABLE_CXX11_TRUE@nodist_examples_c___simple_OBJECTS =  \
+@ENABLE_CXX11_TRUE@	$(am__objects_17)
 examples_c___simple_OBJECTS = $(nodist_examples_c___simple_OBJECTS)
 examples_c___simple_LDADD = $(LDADD)
 examples_c___simple_LINK = $(CXXLD) $(examples_c___simple_CXXFLAGS) \
@@ -588,60 +725,101 @@
 examples_c___variant_11_LINK = $(CXXLD) \
 	$(examples_c___variant_11_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
 	$(LDFLAGS) -o $@
+@ENABLE_BISTROMATHIC_TRUE@nodist_examples_c_bistromathic_bistromathic_OBJECTS = examples/c/bistromathic/bistromathic-parse.$(OBJEXT)
+examples_c_bistromathic_bistromathic_OBJECTS =  \
+	$(nodist_examples_c_bistromathic_bistromathic_OBJECTS)
+@ENABLE_BISTROMATHIC_TRUE@examples_c_bistromathic_bistromathic_DEPENDENCIES =  \
+@ENABLE_BISTROMATHIC_TRUE@	$(am__DEPENDENCIES_1) \
+@ENABLE_BISTROMATHIC_TRUE@	$(am__DEPENDENCIES_1)
+examples_c_bistromathic_bistromathic_LINK = $(CCLD) \
+	$(examples_c_bistromathic_bistromathic_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 nodist_examples_c_calc_calc_OBJECTS =  \
-	examples/c/calc/calc-calc.$(OBJEXT)
+	examples/c/calc/examples_c_calc_calc-calc.$(OBJEXT)
 examples_c_calc_calc_OBJECTS = $(nodist_examples_c_calc_calc_OBJECTS)
 examples_c_calc_calc_LDADD = $(LDADD)
-@FLEX_WORKS_TRUE@nodist_examples_c_lexcalc_lexcalc_OBJECTS =  \
-@FLEX_WORKS_TRUE@	examples/c/lexcalc/lexcalc-parse.$(OBJEXT) \
-@FLEX_WORKS_TRUE@	examples/c/lexcalc/lexcalc-scan.$(OBJEXT)
+examples_c_calc_calc_LINK = $(CCLD) $(examples_c_calc_calc_CFLAGS) \
+	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+nodist_examples_c_glr_c___types_OBJECTS =  \
+	examples/c/glr/examples_c_glr_c___types-c++-types.$(OBJEXT)
+examples_c_glr_c___types_OBJECTS =  \
+	$(nodist_examples_c_glr_c___types_OBJECTS)
+examples_c_glr_c___types_LDADD = $(LDADD)
+examples_c_glr_c___types_LINK = $(CCLD) \
+	$(examples_c_glr_c___types_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+@FLEX_WORKS_TRUE@nodist_examples_c_lexcalc_lexcalc_OBJECTS = examples/c/lexcalc/examples_c_lexcalc_lexcalc-parse.$(OBJEXT) \
+@FLEX_WORKS_TRUE@	examples/c/lexcalc/examples_c_lexcalc_lexcalc-scan.$(OBJEXT)
 examples_c_lexcalc_lexcalc_OBJECTS =  \
 	$(nodist_examples_c_lexcalc_lexcalc_OBJECTS)
 examples_c_lexcalc_lexcalc_LDADD = $(LDADD)
-am__objects_11 = examples/c/mfcalc/mfcalc-mfcalc.$(OBJEXT)
-am__objects_12 = $(am__objects_11)
-nodist_examples_c_mfcalc_mfcalc_OBJECTS = $(am__objects_12)
+am__objects_18 =  \
+	examples/c/mfcalc/examples_c_mfcalc_mfcalc-mfcalc.$(OBJEXT)
+am__objects_19 = $(am__objects_18)
+nodist_examples_c_mfcalc_mfcalc_OBJECTS = $(am__objects_19)
 examples_c_mfcalc_mfcalc_OBJECTS =  \
 	$(nodist_examples_c_mfcalc_mfcalc_OBJECTS)
 examples_c_mfcalc_mfcalc_DEPENDENCIES =
-@FLEX_WORKS_TRUE@nodist_examples_c_reccalc_reccalc_OBJECTS =  \
-@FLEX_WORKS_TRUE@	examples/c/reccalc/reccalc-parse.$(OBJEXT) \
-@FLEX_WORKS_TRUE@	examples/c/reccalc/reccalc-scan.$(OBJEXT)
+examples_c_mfcalc_mfcalc_LINK = $(CCLD) \
+	$(examples_c_mfcalc_mfcalc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+nodist_examples_c_pushcalc_calc_OBJECTS =  \
+	examples/c/pushcalc/examples_c_pushcalc_calc-calc.$(OBJEXT)
+examples_c_pushcalc_calc_OBJECTS =  \
+	$(nodist_examples_c_pushcalc_calc_OBJECTS)
+examples_c_pushcalc_calc_LDADD = $(LDADD)
+examples_c_pushcalc_calc_LINK = $(CCLD) \
+	$(examples_c_pushcalc_calc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+@FLEX_WORKS_TRUE@nodist_examples_c_reccalc_reccalc_OBJECTS = examples/c/reccalc/examples_c_reccalc_reccalc-parse.$(OBJEXT) \
+@FLEX_WORKS_TRUE@	examples/c/reccalc/examples_c_reccalc_reccalc-scan.$(OBJEXT)
 examples_c_reccalc_reccalc_OBJECTS =  \
 	$(nodist_examples_c_reccalc_reccalc_OBJECTS)
 examples_c_reccalc_reccalc_LDADD = $(LDADD)
-am__objects_13 = examples/c/rpcalc/rpcalc-rpcalc.$(OBJEXT)
-am__objects_14 = $(am__objects_13)
-nodist_examples_c_rpcalc_rpcalc_OBJECTS = $(am__objects_14)
+am__objects_20 =  \
+	examples/c/rpcalc/examples_c_rpcalc_rpcalc-rpcalc.$(OBJEXT)
+am__objects_21 = $(am__objects_20)
+nodist_examples_c_rpcalc_rpcalc_OBJECTS = $(am__objects_21)
 examples_c_rpcalc_rpcalc_OBJECTS =  \
 	$(nodist_examples_c_rpcalc_rpcalc_OBJECTS)
 examples_c_rpcalc_rpcalc_DEPENDENCIES =
+examples_c_rpcalc_rpcalc_LINK = $(CCLD) \
+	$(examples_c_rpcalc_rpcalc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_src_bison_OBJECTS = src/bison-AnnotationList.$(OBJEXT) \
 	src/bison-InadequacyList.$(OBJEXT) src/bison-Sbitset.$(OBJEXT) \
 	src/bison-assoc.$(OBJEXT) src/bison-closure.$(OBJEXT) \
 	src/bison-complain.$(OBJEXT) src/bison-conflicts.$(OBJEXT) \
-	src/bison-derives.$(OBJEXT) src/bison-files.$(OBJEXT) \
-	src/bison-fixits.$(OBJEXT) src/bison-getargs.$(OBJEXT) \
+	src/bison-counterexample.$(OBJEXT) \
+	src/bison-derivation.$(OBJEXT) src/bison-derives.$(OBJEXT) \
+	src/bison-files.$(OBJEXT) src/bison-fixits.$(OBJEXT) \
+	src/bison-getargs.$(OBJEXT) src/bison-glyphs.$(OBJEXT) \
 	src/bison-gram.$(OBJEXT) src/bison-graphviz.$(OBJEXT) \
 	src/bison-ielr.$(OBJEXT) src/bison-lalr.$(OBJEXT) \
 	src/bison-location.$(OBJEXT) src/bison-lr0.$(OBJEXT) \
-	src/bison-main.$(OBJEXT) src/bison-muscle-tab.$(OBJEXT) \
-	src/bison-named-ref.$(OBJEXT) src/bison-nullable.$(OBJEXT) \
-	src/bison-output.$(OBJEXT) src/bison-parse-gram.$(OBJEXT) \
+	src/bison-lssi.$(OBJEXT) src/bison-main.$(OBJEXT) \
+	src/bison-muscle-tab.$(OBJEXT) src/bison-named-ref.$(OBJEXT) \
+	src/bison-nullable.$(OBJEXT) src/bison-output.$(OBJEXT) \
+	src/bison-parse-gram.$(OBJEXT) \
+	src/bison-parse-simulation.$(OBJEXT) \
 	src/bison-print-graph.$(OBJEXT) src/bison-print-xml.$(OBJEXT) \
 	src/bison-print.$(OBJEXT) src/bison-reader.$(OBJEXT) \
 	src/bison-reduce.$(OBJEXT) src/bison-relation.$(OBJEXT) \
 	src/bison-scan-code-c.$(OBJEXT) \
 	src/bison-scan-gram-c.$(OBJEXT) \
 	src/bison-scan-skel-c.$(OBJEXT) src/bison-state.$(OBJEXT) \
+	src/bison-state-item.$(OBJEXT) src/bison-strversion.$(OBJEXT) \
 	src/bison-symlist.$(OBJEXT) src/bison-symtab.$(OBJEXT) \
 	src/bison-tables.$(OBJEXT) src/bison-uniqstr.$(OBJEXT)
 src_bison_OBJECTS = $(am_src_bison_OBJECTS)
-src_bison_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+src_bison_DEPENDENCIES = lib/libbison.a $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) lib/libbison.a
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1)
 src_bison_LINK = $(CCLD) $(src_bison_CFLAGS) $(CFLAGS) \
 	$(src_bison_LDFLAGS) $(LDFLAGS) -o $@
 SCRIPTS = $(dist_noinst_SCRIPTS) $(nodist_bin_SCRIPTS) \
@@ -668,18 +846,24 @@
 	examples/c++/calc++/$(DEPDIR)/calc__-driver.Po \
 	examples/c++/calc++/$(DEPDIR)/calc__-parser.Po \
 	examples/c++/calc++/$(DEPDIR)/calc__-scanner.Po \
-	examples/c/calc/$(DEPDIR)/calc-calc.Po \
-	examples/c/lexcalc/$(DEPDIR)/lexcalc-parse.Po \
-	examples/c/lexcalc/$(DEPDIR)/lexcalc-scan.Po \
-	examples/c/mfcalc/$(DEPDIR)/mfcalc-mfcalc.Po \
-	examples/c/reccalc/$(DEPDIR)/reccalc-parse.Po \
-	examples/c/reccalc/$(DEPDIR)/reccalc-scan.Po \
-	examples/c/rpcalc/$(DEPDIR)/rpcalc-rpcalc.Po \
+	examples/c++/glr/$(DEPDIR)/examples_c___glr_c___types-c++-types.Po \
+	examples/c/bistromathic/$(DEPDIR)/bistromathic-parse.Po \
+	examples/c/calc/$(DEPDIR)/examples_c_calc_calc-calc.Po \
+	examples/c/glr/$(DEPDIR)/examples_c_glr_c___types-c++-types.Po \
+	examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-parse.Po \
+	examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-scan.Po \
+	examples/c/mfcalc/$(DEPDIR)/examples_c_mfcalc_mfcalc-mfcalc.Po \
+	examples/c/pushcalc/$(DEPDIR)/examples_c_pushcalc_calc-calc.Po \
+	examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-parse.Po \
+	examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-scan.Po \
+	examples/c/rpcalc/$(DEPDIR)/examples_c_rpcalc_rpcalc-rpcalc.Po \
+	lib/$(DEPDIR)/libbison_a-access.Po \
 	lib/$(DEPDIR)/libbison_a-allocator.Po \
 	lib/$(DEPDIR)/libbison_a-areadlink.Po \
 	lib/$(DEPDIR)/libbison_a-argmatch.Po \
 	lib/$(DEPDIR)/libbison_a-asnprintf.Po \
 	lib/$(DEPDIR)/libbison_a-asprintf.Po \
+	lib/$(DEPDIR)/libbison_a-at-func.Po \
 	lib/$(DEPDIR)/libbison_a-basename-lgpl.Po \
 	lib/$(DEPDIR)/libbison_a-basename.Po \
 	lib/$(DEPDIR)/libbison_a-binary-io.Po \
@@ -691,38 +875,57 @@
 	lib/$(DEPDIR)/libbison_a-c-strncasecmp.Po \
 	lib/$(DEPDIR)/libbison_a-calloc.Po \
 	lib/$(DEPDIR)/libbison_a-canonicalize-lgpl.Po \
+	lib/$(DEPDIR)/libbison_a-canonicalize.Po \
 	lib/$(DEPDIR)/libbison_a-careadlinkat.Po \
+	lib/$(DEPDIR)/libbison_a-chdir-long.Po \
 	lib/$(DEPDIR)/libbison_a-cloexec.Po \
 	lib/$(DEPDIR)/libbison_a-close-stream.Po \
 	lib/$(DEPDIR)/libbison_a-close.Po \
+	lib/$(DEPDIR)/libbison_a-closedir.Po \
 	lib/$(DEPDIR)/libbison_a-closeout.Po \
 	lib/$(DEPDIR)/libbison_a-concat-filename.Po \
+	lib/$(DEPDIR)/libbison_a-dirfd.Po \
 	lib/$(DEPDIR)/libbison_a-dirname-lgpl.Po \
 	lib/$(DEPDIR)/libbison_a-dirname.Po \
 	lib/$(DEPDIR)/libbison_a-dup-safer-flag.Po \
 	lib/$(DEPDIR)/libbison_a-dup-safer.Po \
+	lib/$(DEPDIR)/libbison_a-dup.Po \
 	lib/$(DEPDIR)/libbison_a-dup2.Po \
 	lib/$(DEPDIR)/libbison_a-error.Po \
+	lib/$(DEPDIR)/libbison_a-execute.Po \
 	lib/$(DEPDIR)/libbison_a-exitfail.Po \
 	lib/$(DEPDIR)/libbison_a-fatal-signal.Po \
+	lib/$(DEPDIR)/libbison_a-fchdir.Po \
 	lib/$(DEPDIR)/libbison_a-fcntl.Po \
 	lib/$(DEPDIR)/libbison_a-fd-hook.Po \
 	lib/$(DEPDIR)/libbison_a-fd-safer-flag.Po \
 	lib/$(DEPDIR)/libbison_a-fd-safer.Po \
+	lib/$(DEPDIR)/libbison_a-fdopendir.Po \
+	lib/$(DEPDIR)/libbison_a-ffs.Po \
+	lib/$(DEPDIR)/libbison_a-ffsl.Po \
+	lib/$(DEPDIR)/libbison_a-file-set.Po \
+	lib/$(DEPDIR)/libbison_a-filenamecat-lgpl.Po \
+	lib/$(DEPDIR)/libbison_a-findprog-in.Po \
 	lib/$(DEPDIR)/libbison_a-float.Po \
 	lib/$(DEPDIR)/libbison_a-fopen-safer.Po \
 	lib/$(DEPDIR)/libbison_a-fopen.Po \
 	lib/$(DEPDIR)/libbison_a-fpending.Po \
 	lib/$(DEPDIR)/libbison_a-fprintf.Po \
+	lib/$(DEPDIR)/libbison_a-free.Po \
 	lib/$(DEPDIR)/libbison_a-frexp.Po \
 	lib/$(DEPDIR)/libbison_a-frexpl.Po \
 	lib/$(DEPDIR)/libbison_a-fseterr.Po \
 	lib/$(DEPDIR)/libbison_a-fstat.Po \
+	lib/$(DEPDIR)/libbison_a-fstatat.Po \
 	lib/$(DEPDIR)/libbison_a-fstrcmp.Po \
 	lib/$(DEPDIR)/libbison_a-fsync.Po \
 	lib/$(DEPDIR)/libbison_a-get-errno.Po \
+	lib/$(DEPDIR)/libbison_a-getcwd-lgpl.Po \
+	lib/$(DEPDIR)/libbison_a-getcwd.Po \
+	lib/$(DEPDIR)/libbison_a-getdelim.Po \
 	lib/$(DEPDIR)/libbison_a-getdtablesize.Po \
 	lib/$(DEPDIR)/libbison_a-gethrxtime.Po \
+	lib/$(DEPDIR)/libbison_a-getline.Po \
 	lib/$(DEPDIR)/libbison_a-getopt.Po \
 	lib/$(DEPDIR)/libbison_a-getopt1.Po \
 	lib/$(DEPDIR)/libbison_a-getprogname.Po \
@@ -730,19 +933,36 @@
 	lib/$(DEPDIR)/libbison_a-gettime.Po \
 	lib/$(DEPDIR)/libbison_a-gettimeofday.Po \
 	lib/$(DEPDIR)/libbison_a-gl_array_list.Po \
+	lib/$(DEPDIR)/libbison_a-gl_hash_map.Po \
+	lib/$(DEPDIR)/libbison_a-gl_linked_list.Po \
 	lib/$(DEPDIR)/libbison_a-gl_list.Po \
+	lib/$(DEPDIR)/libbison_a-gl_map.Po \
+	lib/$(DEPDIR)/libbison_a-gl_oset.Po \
+	lib/$(DEPDIR)/libbison_a-gl_rbtree_oset.Po \
+	lib/$(DEPDIR)/libbison_a-gl_rbtreehash_list.Po \
 	lib/$(DEPDIR)/libbison_a-gl_xlist.Po \
+	lib/$(DEPDIR)/libbison_a-gl_xmap.Po \
 	lib/$(DEPDIR)/libbison_a-hard-locale.Po \
+	lib/$(DEPDIR)/libbison_a-hash-pjw.Po \
+	lib/$(DEPDIR)/libbison_a-hash-triple-simple.Po \
 	lib/$(DEPDIR)/libbison_a-hash.Po \
+	lib/$(DEPDIR)/libbison_a-ialloc.Po \
+	lib/$(DEPDIR)/libbison_a-iconv.Po \
+	lib/$(DEPDIR)/libbison_a-iconv_close.Po \
+	lib/$(DEPDIR)/libbison_a-iconv_open.Po \
+	lib/$(DEPDIR)/libbison_a-integer_length.Po \
+	lib/$(DEPDIR)/libbison_a-integer_length_l.Po \
 	lib/$(DEPDIR)/libbison_a-isnan.Po \
 	lib/$(DEPDIR)/libbison_a-isnand.Po \
 	lib/$(DEPDIR)/libbison_a-isnanf.Po \
 	lib/$(DEPDIR)/libbison_a-isnanl.Po \
 	lib/$(DEPDIR)/libbison_a-iswblank.Po \
+	lib/$(DEPDIR)/libbison_a-iswdigit.Po \
+	lib/$(DEPDIR)/libbison_a-iswxdigit.Po \
 	lib/$(DEPDIR)/libbison_a-itold.Po \
+	lib/$(DEPDIR)/libbison_a-lc-charset-dispatch.Po \
 	lib/$(DEPDIR)/libbison_a-ldexpl.Po \
 	lib/$(DEPDIR)/libbison_a-localcharset.Po \
-	lib/$(DEPDIR)/libbison_a-localtime-buffer.Po \
 	lib/$(DEPDIR)/libbison_a-lstat.Po \
 	lib/$(DEPDIR)/libbison_a-malloc.Po \
 	lib/$(DEPDIR)/libbison_a-malloca.Po \
@@ -752,15 +972,24 @@
 	lib/$(DEPDIR)/libbison_a-mbrtowc.Po \
 	lib/$(DEPDIR)/libbison_a-mbsinit.Po \
 	lib/$(DEPDIR)/libbison_a-mbswidth.Po \
+	lib/$(DEPDIR)/libbison_a-mbtowc-lock.Po \
 	lib/$(DEPDIR)/libbison_a-memchr.Po \
+	lib/$(DEPDIR)/libbison_a-mempcpy.Po \
+	lib/$(DEPDIR)/libbison_a-memrchr.Po \
 	lib/$(DEPDIR)/libbison_a-msvc-inval.Po \
 	lib/$(DEPDIR)/libbison_a-msvc-nothrow.Po \
 	lib/$(DEPDIR)/libbison_a-obstack.Po \
 	lib/$(DEPDIR)/libbison_a-obstack_printf.Po \
 	lib/$(DEPDIR)/libbison_a-open.Po \
+	lib/$(DEPDIR)/libbison_a-openat-die.Po \
+	lib/$(DEPDIR)/libbison_a-openat-proc.Po \
+	lib/$(DEPDIR)/libbison_a-openat.Po \
+	lib/$(DEPDIR)/libbison_a-opendir.Po \
+	lib/$(DEPDIR)/libbison_a-os2-spawn.Po \
 	lib/$(DEPDIR)/libbison_a-path-join.Po \
 	lib/$(DEPDIR)/libbison_a-perror.Po \
 	lib/$(DEPDIR)/libbison_a-pipe-safer.Po \
+	lib/$(DEPDIR)/libbison_a-pipe.Po \
 	lib/$(DEPDIR)/libbison_a-pipe2-safer.Po \
 	lib/$(DEPDIR)/libbison_a-pipe2.Po \
 	lib/$(DEPDIR)/libbison_a-printf-args.Po \
@@ -773,11 +1002,18 @@
 	lib/$(DEPDIR)/libbison_a-quotearg.Po \
 	lib/$(DEPDIR)/libbison_a-raise.Po \
 	lib/$(DEPDIR)/libbison_a-rawmemchr.Po \
+	lib/$(DEPDIR)/libbison_a-readdir.Po \
+	lib/$(DEPDIR)/libbison_a-readline.Po \
 	lib/$(DEPDIR)/libbison_a-readlink.Po \
 	lib/$(DEPDIR)/libbison_a-realloc.Po \
+	lib/$(DEPDIR)/libbison_a-reallocarray.Po \
 	lib/$(DEPDIR)/libbison_a-relocatable.Po \
 	lib/$(DEPDIR)/libbison_a-rename.Po \
+	lib/$(DEPDIR)/libbison_a-rewinddir.Po \
 	lib/$(DEPDIR)/libbison_a-rmdir.Po \
+	lib/$(DEPDIR)/libbison_a-save-cwd.Po \
+	lib/$(DEPDIR)/libbison_a-setlocale-lock.Po \
+	lib/$(DEPDIR)/libbison_a-setlocale_null.Po \
 	lib/$(DEPDIR)/libbison_a-sig-handler.Po \
 	lib/$(DEPDIR)/libbison_a-sigaction.Po \
 	lib/$(DEPDIR)/libbison_a-signbitd.Po \
@@ -786,6 +1022,8 @@
 	lib/$(DEPDIR)/libbison_a-sigprocmask.Po \
 	lib/$(DEPDIR)/libbison_a-snprintf.Po \
 	lib/$(DEPDIR)/libbison_a-spawn-pipe.Po \
+	lib/$(DEPDIR)/libbison_a-spawn.Po \
+	lib/$(DEPDIR)/libbison_a-spawn_faction_addchdir.Po \
 	lib/$(DEPDIR)/libbison_a-spawn_faction_addclose.Po \
 	lib/$(DEPDIR)/libbison_a-spawn_faction_adddup2.Po \
 	lib/$(DEPDIR)/libbison_a-spawn_faction_addopen.Po \
@@ -794,6 +1032,7 @@
 	lib/$(DEPDIR)/libbison_a-spawnattr_destroy.Po \
 	lib/$(DEPDIR)/libbison_a-spawnattr_init.Po \
 	lib/$(DEPDIR)/libbison_a-spawnattr_setflags.Po \
+	lib/$(DEPDIR)/libbison_a-spawnattr_setpgroup.Po \
 	lib/$(DEPDIR)/libbison_a-spawnattr_setsigmask.Po \
 	lib/$(DEPDIR)/libbison_a-spawni.Po \
 	lib/$(DEPDIR)/libbison_a-spawnp.Po \
@@ -802,6 +1041,7 @@
 	lib/$(DEPDIR)/libbison_a-stat-w32.Po \
 	lib/$(DEPDIR)/libbison_a-stat.Po \
 	lib/$(DEPDIR)/libbison_a-stpcpy.Po \
+	lib/$(DEPDIR)/libbison_a-stpncpy.Po \
 	lib/$(DEPDIR)/libbison_a-strchrnul.Po \
 	lib/$(DEPDIR)/libbison_a-strdup.Po \
 	lib/$(DEPDIR)/libbison_a-strerror-override.Po \
@@ -810,9 +1050,11 @@
 	lib/$(DEPDIR)/libbison_a-stripslash.Po \
 	lib/$(DEPDIR)/libbison_a-strndup.Po \
 	lib/$(DEPDIR)/libbison_a-strnlen.Po \
+	lib/$(DEPDIR)/libbison_a-strtod.Po \
 	lib/$(DEPDIR)/libbison_a-strverscmp.Po \
 	lib/$(DEPDIR)/libbison_a-timespec.Po \
 	lib/$(DEPDIR)/libbison_a-timevar.Po \
+	lib/$(DEPDIR)/libbison_a-unicodeio.Po \
 	lib/$(DEPDIR)/libbison_a-unistd.Po \
 	lib/$(DEPDIR)/libbison_a-unlink.Po \
 	lib/$(DEPDIR)/libbison_a-unsetenv.Po \
@@ -829,6 +1071,7 @@
 	lib/$(DEPDIR)/libbison_a-windows-once.Po \
 	lib/$(DEPDIR)/libbison_a-windows-recmutex.Po \
 	lib/$(DEPDIR)/libbison_a-windows-rwlock.Po \
+	lib/$(DEPDIR)/libbison_a-windows-spawn.Po \
 	lib/$(DEPDIR)/libbison_a-windows-tls.Po \
 	lib/$(DEPDIR)/libbison_a-xalloc-die.Po \
 	lib/$(DEPDIR)/libbison_a-xconcat-filename.Po \
@@ -848,21 +1091,32 @@
 	lib/glthread/$(DEPDIR)/libbison_a-lock.Po \
 	lib/glthread/$(DEPDIR)/libbison_a-threadlib.Po \
 	lib/glthread/$(DEPDIR)/libbison_a-tls.Po \
+	lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_dupfree.Po \
+	lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow.Po \
+	lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow_preserve.Po \
+	lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_set_array_size.Po \
+	lib/unistr/$(DEPDIR)/libbison_a-u8-mbtoucr.Po \
+	lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb-aux.Po \
+	lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb.Po \
 	lib/uniwidth/$(DEPDIR)/libbison_a-width.Po \
 	src/$(DEPDIR)/bison-AnnotationList.Po \
 	src/$(DEPDIR)/bison-InadequacyList.Po \
 	src/$(DEPDIR)/bison-Sbitset.Po src/$(DEPDIR)/bison-assoc.Po \
 	src/$(DEPDIR)/bison-closure.Po src/$(DEPDIR)/bison-complain.Po \
 	src/$(DEPDIR)/bison-conflicts.Po \
+	src/$(DEPDIR)/bison-counterexample.Po \
+	src/$(DEPDIR)/bison-derivation.Po \
 	src/$(DEPDIR)/bison-derives.Po src/$(DEPDIR)/bison-files.Po \
 	src/$(DEPDIR)/bison-fixits.Po src/$(DEPDIR)/bison-getargs.Po \
-	src/$(DEPDIR)/bison-gram.Po src/$(DEPDIR)/bison-graphviz.Po \
-	src/$(DEPDIR)/bison-ielr.Po src/$(DEPDIR)/bison-lalr.Po \
-	src/$(DEPDIR)/bison-location.Po src/$(DEPDIR)/bison-lr0.Po \
+	src/$(DEPDIR)/bison-glyphs.Po src/$(DEPDIR)/bison-gram.Po \
+	src/$(DEPDIR)/bison-graphviz.Po src/$(DEPDIR)/bison-ielr.Po \
+	src/$(DEPDIR)/bison-lalr.Po src/$(DEPDIR)/bison-location.Po \
+	src/$(DEPDIR)/bison-lr0.Po src/$(DEPDIR)/bison-lssi.Po \
 	src/$(DEPDIR)/bison-main.Po src/$(DEPDIR)/bison-muscle-tab.Po \
 	src/$(DEPDIR)/bison-named-ref.Po \
 	src/$(DEPDIR)/bison-nullable.Po src/$(DEPDIR)/bison-output.Po \
 	src/$(DEPDIR)/bison-parse-gram.Po \
+	src/$(DEPDIR)/bison-parse-simulation.Po \
 	src/$(DEPDIR)/bison-print-graph.Po \
 	src/$(DEPDIR)/bison-print-xml.Po src/$(DEPDIR)/bison-print.Po \
 	src/$(DEPDIR)/bison-reader.Po src/$(DEPDIR)/bison-reduce.Po \
@@ -872,7 +1126,9 @@
 	src/$(DEPDIR)/bison-scan-gram-c.Po \
 	src/$(DEPDIR)/bison-scan-gram.Po \
 	src/$(DEPDIR)/bison-scan-skel-c.Po \
-	src/$(DEPDIR)/bison-scan-skel.Po src/$(DEPDIR)/bison-state.Po \
+	src/$(DEPDIR)/bison-scan-skel.Po \
+	src/$(DEPDIR)/bison-state-item.Po src/$(DEPDIR)/bison-state.Po \
+	src/$(DEPDIR)/bison-strversion.Po \
 	src/$(DEPDIR)/bison-symlist.Po src/$(DEPDIR)/bison-symtab.Po \
 	src/$(DEPDIR)/bison-tables.Po src/$(DEPDIR)/bison-uniqstr.Po
 am__mv = mv -f
@@ -921,17 +1177,23 @@
 SOURCES = $(lib_libbison_a_SOURCES) $(EXTRA_lib_libbison_a_SOURCES) \
 	$(lib_liby_a_SOURCES) \
 	$(nodist_examples_c___calc___calc___SOURCES) \
+	$(dist_examples_c___glr_c___types_SOURCES) \
+	$(nodist_examples_c___glr_c___types_SOURCES) \
 	$(nodist_examples_c___simple_SOURCES) \
 	$(nodist_examples_c___variant_SOURCES) \
 	$(nodist_examples_c___variant_11_SOURCES) \
+	$(nodist_examples_c_bistromathic_bistromathic_SOURCES) \
 	$(nodist_examples_c_calc_calc_SOURCES) \
+	$(nodist_examples_c_glr_c___types_SOURCES) \
 	$(nodist_examples_c_lexcalc_lexcalc_SOURCES) \
 	$(nodist_examples_c_mfcalc_mfcalc_SOURCES) \
+	$(nodist_examples_c_pushcalc_calc_SOURCES) \
 	$(nodist_examples_c_reccalc_reccalc_SOURCES) \
 	$(nodist_examples_c_rpcalc_rpcalc_SOURCES) \
 	$(src_bison_SOURCES) $(EXTRA_src_bison_SOURCES)
 DIST_SOURCES = $(am__lib_libbison_a_SOURCES_DIST) \
 	$(EXTRA_lib_libbison_a_SOURCES) $(am__lib_liby_a_SOURCES_DIST) \
+	$(am__dist_examples_c___glr_c___types_SOURCES_DIST) \
 	$(src_bison_SOURCES) $(EXTRA_src_bison_SOURCES)
 AM_V_DVIPS = $(am__v_DVIPS_@AM_V@)
 am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@)
@@ -989,13 +1251,17 @@
 man1dir = $(mandir)/man1
 NROFF = nroff
 MANS = $(dist_man_MANS) $(nodist_man_MANS)
-DATA = $(aclocal_DATA) $(calcxx_DATA) $(cxx_DATA) $(dist_c_DATA) \
-	$(dist_calc_DATA) $(dist_calcxx_DATA) $(dist_cxx_DATA) \
+DATA = $(aclocal_DATA) $(calcxx_DATA) $(cxx_DATA) \
+	$(dist_bistromathic_DATA) $(dist_c_DATA) $(dist_calc_DATA) \
+	$(dist_calcd_DATA) $(dist_calcxx_DATA) $(dist_cxx_DATA) \
 	$(dist_d_DATA) $(dist_doc_DATA) $(dist_examples_DATA) \
-	$(dist_java_DATA) $(dist_lexcalc_DATA) $(dist_m4sugar_DATA) \
-	$(dist_mfcalc_DATA) $(dist_pkgdata_DATA) $(dist_reccalc_DATA) \
-	$(dist_rpcalc_DATA) $(dist_skeletons_DATA) $(dist_xslt_DATA) \
-	$(mfcalc_DATA) $(rpcalc_DATA)
+	$(dist_glr_DATA) $(dist_java_DATA) $(dist_java_calc_DATA) \
+	$(dist_java_simple_DATA) $(dist_lexcalc_DATA) \
+	$(dist_m4sugar_DATA) $(dist_mfcalc_DATA) $(dist_noinst_DATA) \
+	$(dist_pkgdata_DATA) $(dist_pushcalc_DATA) \
+	$(dist_reccalc_DATA) $(dist_rpcalc_DATA) $(dist_simpled_DATA) \
+	$(dist_skeletons_DATA) $(dist_xslt_DATA) $(mfcalc_DATA) \
+	$(rpcalc_DATA)
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
 am__recursive_targets = \
@@ -1022,9 +1288,6 @@
   unique=`for i in $$list; do \
     if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
   done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
-CSCOPE = cscope
 am__tty_colors_dummy = \
   mgn= red= grn= lgn= blu= brg= std=; \
   am__color_tests=no
@@ -1180,6 +1443,7 @@
   bases='$(TEST_LOGS)'; \
   bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
   bases=`echo $$bases`
+AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)'
 RECHECK_LOGS = $(TEST_LOGS)
 TEST_SUITE_LOG = test-suite.log
 TEST_EXTENSIONS = @EXEEXT@ .test
@@ -1204,17 +1468,27 @@
 	$(srcdir)/Makefile.in $(srcdir)/build-aux/local.mk \
 	$(srcdir)/data/local.mk $(srcdir)/doc/local.mk \
 	$(srcdir)/etc/local.mk $(srcdir)/examples/c++/calc++/local.mk \
+	$(srcdir)/examples/c++/glr/local.mk \
 	$(srcdir)/examples/c++/local.mk \
+	$(srcdir)/examples/c/bistromathic/local.mk \
 	$(srcdir)/examples/c/calc/local.mk \
+	$(srcdir)/examples/c/glr/local.mk \
 	$(srcdir)/examples/c/lexcalc/local.mk \
 	$(srcdir)/examples/c/local.mk \
 	$(srcdir)/examples/c/mfcalc/local.mk \
+	$(srcdir)/examples/c/pushcalc/local.mk \
 	$(srcdir)/examples/c/reccalc/local.mk \
 	$(srcdir)/examples/c/rpcalc/local.mk \
-	$(srcdir)/examples/d/local.mk $(srcdir)/examples/java/local.mk \
+	$(srcdir)/examples/d/calc/local.mk \
+	$(srcdir)/examples/d/local.mk \
+	$(srcdir)/examples/d/simple/local.mk \
+	$(srcdir)/examples/java/calc/local.mk \
+	$(srcdir)/examples/java/local.mk \
+	$(srcdir)/examples/java/simple/local.mk \
 	$(srcdir)/examples/local.mk $(srcdir)/lib/gnulib.mk \
 	$(srcdir)/lib/local.mk $(srcdir)/src/local.mk \
-	$(srcdir)/tests/local.mk $(top_srcdir)/build-aux/config.guess \
+	$(srcdir)/tests/local.mk $(top_srcdir)/build-aux/compile \
+	$(top_srcdir)/build-aux/config.guess \
 	$(top_srcdir)/build-aux/config.rpath \
 	$(top_srcdir)/build-aux/config.sub \
 	$(top_srcdir)/build-aux/depcomp \
@@ -1229,12 +1503,12 @@
 	$(top_srcdir)/etc/bench.pl.in $(top_srcdir)/lib/config.in.h \
 	$(top_srcdir)/src/yacc.in $(top_srcdir)/tests/atlocal.in \
 	$(top_srcdir)/tests/bison.in ABOUT-NLS AUTHORS COPYING \
-	ChangeLog INSTALL NEWS README THANKS TODO build-aux/compile \
-	build-aux/config.guess build-aux/config.rpath \
-	build-aux/config.sub build-aux/depcomp build-aux/install-sh \
-	build-aux/mdate-sh build-aux/missing build-aux/texinfo.tex \
-	build-aux/ylwrap src/parse-gram.c src/scan-code.c \
-	src/scan-gram.c src/scan-skel.c
+	ChangeLog INSTALL NEWS README README-alpha THANKS TODO \
+	build-aux/compile build-aux/config.guess \
+	build-aux/config.rpath build-aux/config.sub build-aux/depcomp \
+	build-aux/install-sh build-aux/mdate-sh build-aux/missing \
+	build-aux/texinfo.tex build-aux/ylwrap src/parse-gram.c \
+	src/scan-code.c src/scan-gram.c src/scan-skel.c
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
@@ -1270,9 +1544,11 @@
     dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
   done; \
   reldir="$$dir2"
-DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.xz
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.lz $(distdir).tar.xz
 GZIP_ENV = --best
-DIST_TARGETS = dist-xz dist-gzip
+DIST_TARGETS = dist-lzip dist-xz dist-gzip
+# Exists only to be overridden by the user if desired.
+AM_DISTCHECK_DVI_TARGET = dvi
 distuninstallcheck_listfiles = find . -type f -print
 am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
   | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
@@ -1303,6 +1579,7 @@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
+CFLAG_VISIBILITY = @CFLAG_VISIBILITY@
 CLASSPATH = @CLASSPATH@
 CLASSPATH_SEPARATOR = @CLASSPATH_SEPARATOR@
 CONFIG_INCLUDE = @CONFIG_INCLUDE@
@@ -1310,12 +1587,15 @@
 CONF_JAVAC = @CONF_JAVAC@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
 CXX = @CXX@
 CXX03_CXXFLAGS = @CXX03_CXXFLAGS@
 CXX11_CXXFLAGS = @CXX11_CXXFLAGS@
 CXX14_CXXFLAGS = @CXX14_CXXFLAGS@
 CXX17_CXXFLAGS = @CXX17_CXXFLAGS@
-CXX2A_CXXFLAGS = @CXX2A_CXXFLAGS@
+CXX20_CXXFLAGS = @CXX20_CXXFLAGS@
+CXX2B_CXXFLAGS = @CXX2B_CXXFLAGS@
 CXX98_CXXFLAGS = @CXX98_CXXFLAGS@
 CXXDEPMODE = @CXXDEPMODE@
 CXXFLAGS = @CXXFLAGS@
@@ -1338,6 +1618,7 @@
 EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@
 EOVERFLOW_VALUE = @EOVERFLOW_VALUE@
 ERRNO_H = @ERRNO_H@
+ETAGS = @ETAGS@
 EXEEXT = @EXEEXT@
 FLEX_SCANNER_CXXFLAGS = @FLEX_SCANNER_CXXFLAGS@
 FLOAT_H = @FLOAT_H@
@@ -1345,398 +1626,488 @@
 GETOPT_CDEFS_H = @GETOPT_CDEFS_H@
 GETOPT_H = @GETOPT_H@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GL_GNULIB_ACCESS = @GL_GNULIB_ACCESS@
+GL_GNULIB_ACOSF = @GL_GNULIB_ACOSF@
+GL_GNULIB_ACOSL = @GL_GNULIB_ACOSL@
+GL_GNULIB_ALIGNED_ALLOC = @GL_GNULIB_ALIGNED_ALLOC@
+GL_GNULIB_ALPHASORT = @GL_GNULIB_ALPHASORT@
+GL_GNULIB_ASINF = @GL_GNULIB_ASINF@
+GL_GNULIB_ASINL = @GL_GNULIB_ASINL@
+GL_GNULIB_ATAN2F = @GL_GNULIB_ATAN2F@
+GL_GNULIB_ATANF = @GL_GNULIB_ATANF@
+GL_GNULIB_ATANL = @GL_GNULIB_ATANL@
+GL_GNULIB_ATOLL = @GL_GNULIB_ATOLL@
+GL_GNULIB_BTOWC = @GL_GNULIB_BTOWC@
+GL_GNULIB_CALLOC_POSIX = @GL_GNULIB_CALLOC_POSIX@
+GL_GNULIB_CANONICALIZE_FILE_NAME = @GL_GNULIB_CANONICALIZE_FILE_NAME@
+GL_GNULIB_CBRT = @GL_GNULIB_CBRT@
+GL_GNULIB_CBRTF = @GL_GNULIB_CBRTF@
+GL_GNULIB_CBRTL = @GL_GNULIB_CBRTL@
+GL_GNULIB_CEIL = @GL_GNULIB_CEIL@
+GL_GNULIB_CEILF = @GL_GNULIB_CEILF@
+GL_GNULIB_CEILL = @GL_GNULIB_CEILL@
+GL_GNULIB_CHDIR = @GL_GNULIB_CHDIR@
+GL_GNULIB_CHOWN = @GL_GNULIB_CHOWN@
+GL_GNULIB_CLOSE = @GL_GNULIB_CLOSE@
+GL_GNULIB_CLOSEDIR = @GL_GNULIB_CLOSEDIR@
+GL_GNULIB_COPYSIGN = @GL_GNULIB_COPYSIGN@
+GL_GNULIB_COPYSIGNF = @GL_GNULIB_COPYSIGNF@
+GL_GNULIB_COPYSIGNL = @GL_GNULIB_COPYSIGNL@
+GL_GNULIB_COPY_FILE_RANGE = @GL_GNULIB_COPY_FILE_RANGE@
+GL_GNULIB_COSF = @GL_GNULIB_COSF@
+GL_GNULIB_COSHF = @GL_GNULIB_COSHF@
+GL_GNULIB_COSL = @GL_GNULIB_COSL@
+GL_GNULIB_CREAT = @GL_GNULIB_CREAT@
+GL_GNULIB_CTIME = @GL_GNULIB_CTIME@
+GL_GNULIB_DIRFD = @GL_GNULIB_DIRFD@
+GL_GNULIB_DPRINTF = @GL_GNULIB_DPRINTF@
+GL_GNULIB_DUP = @GL_GNULIB_DUP@
+GL_GNULIB_DUP2 = @GL_GNULIB_DUP2@
+GL_GNULIB_DUP3 = @GL_GNULIB_DUP3@
+GL_GNULIB_DUPLOCALE = @GL_GNULIB_DUPLOCALE@
+GL_GNULIB_ENVIRON = @GL_GNULIB_ENVIRON@
+GL_GNULIB_EUIDACCESS = @GL_GNULIB_EUIDACCESS@
+GL_GNULIB_EXECL = @GL_GNULIB_EXECL@
+GL_GNULIB_EXECLE = @GL_GNULIB_EXECLE@
+GL_GNULIB_EXECLP = @GL_GNULIB_EXECLP@
+GL_GNULIB_EXECV = @GL_GNULIB_EXECV@
+GL_GNULIB_EXECVE = @GL_GNULIB_EXECVE@
+GL_GNULIB_EXECVP = @GL_GNULIB_EXECVP@
+GL_GNULIB_EXECVPE = @GL_GNULIB_EXECVPE@
+GL_GNULIB_EXP2 = @GL_GNULIB_EXP2@
+GL_GNULIB_EXP2F = @GL_GNULIB_EXP2F@
+GL_GNULIB_EXP2L = @GL_GNULIB_EXP2L@
+GL_GNULIB_EXPF = @GL_GNULIB_EXPF@
+GL_GNULIB_EXPL = @GL_GNULIB_EXPL@
+GL_GNULIB_EXPLICIT_BZERO = @GL_GNULIB_EXPLICIT_BZERO@
+GL_GNULIB_EXPM1 = @GL_GNULIB_EXPM1@
+GL_GNULIB_EXPM1F = @GL_GNULIB_EXPM1F@
+GL_GNULIB_EXPM1L = @GL_GNULIB_EXPM1L@
+GL_GNULIB_FABSF = @GL_GNULIB_FABSF@
+GL_GNULIB_FABSL = @GL_GNULIB_FABSL@
+GL_GNULIB_FACCESSAT = @GL_GNULIB_FACCESSAT@
+GL_GNULIB_FCHDIR = @GL_GNULIB_FCHDIR@
+GL_GNULIB_FCHMODAT = @GL_GNULIB_FCHMODAT@
+GL_GNULIB_FCHOWNAT = @GL_GNULIB_FCHOWNAT@
+GL_GNULIB_FCLOSE = @GL_GNULIB_FCLOSE@
+GL_GNULIB_FCNTL = @GL_GNULIB_FCNTL@
+GL_GNULIB_FDATASYNC = @GL_GNULIB_FDATASYNC@
+GL_GNULIB_FDOPEN = @GL_GNULIB_FDOPEN@
+GL_GNULIB_FDOPENDIR = @GL_GNULIB_FDOPENDIR@
+GL_GNULIB_FFLUSH = @GL_GNULIB_FFLUSH@
+GL_GNULIB_FFS = @GL_GNULIB_FFS@
+GL_GNULIB_FFSL = @GL_GNULIB_FFSL@
+GL_GNULIB_FFSLL = @GL_GNULIB_FFSLL@
+GL_GNULIB_FGETC = @GL_GNULIB_FGETC@
+GL_GNULIB_FGETS = @GL_GNULIB_FGETS@
+GL_GNULIB_FLOOR = @GL_GNULIB_FLOOR@
+GL_GNULIB_FLOORF = @GL_GNULIB_FLOORF@
+GL_GNULIB_FLOORL = @GL_GNULIB_FLOORL@
+GL_GNULIB_FMA = @GL_GNULIB_FMA@
+GL_GNULIB_FMAF = @GL_GNULIB_FMAF@
+GL_GNULIB_FMAL = @GL_GNULIB_FMAL@
+GL_GNULIB_FMOD = @GL_GNULIB_FMOD@
+GL_GNULIB_FMODF = @GL_GNULIB_FMODF@
+GL_GNULIB_FMODL = @GL_GNULIB_FMODL@
+GL_GNULIB_FOPEN = @GL_GNULIB_FOPEN@
+GL_GNULIB_FPRINTF = @GL_GNULIB_FPRINTF@
+GL_GNULIB_FPRINTF_POSIX = @GL_GNULIB_FPRINTF_POSIX@
+GL_GNULIB_FPURGE = @GL_GNULIB_FPURGE@
+GL_GNULIB_FPUTC = @GL_GNULIB_FPUTC@
+GL_GNULIB_FPUTS = @GL_GNULIB_FPUTS@
+GL_GNULIB_FREAD = @GL_GNULIB_FREAD@
+GL_GNULIB_FREE_POSIX = @GL_GNULIB_FREE_POSIX@
+GL_GNULIB_FREOPEN = @GL_GNULIB_FREOPEN@
+GL_GNULIB_FREXP = @GL_GNULIB_FREXP@
+GL_GNULIB_FREXPF = @GL_GNULIB_FREXPF@
+GL_GNULIB_FREXPL = @GL_GNULIB_FREXPL@
+GL_GNULIB_FSCANF = @GL_GNULIB_FSCANF@
+GL_GNULIB_FSEEK = @GL_GNULIB_FSEEK@
+GL_GNULIB_FSEEKO = @GL_GNULIB_FSEEKO@
+GL_GNULIB_FSTAT = @GL_GNULIB_FSTAT@
+GL_GNULIB_FSTATAT = @GL_GNULIB_FSTATAT@
+GL_GNULIB_FSYNC = @GL_GNULIB_FSYNC@
+GL_GNULIB_FTELL = @GL_GNULIB_FTELL@
+GL_GNULIB_FTELLO = @GL_GNULIB_FTELLO@
+GL_GNULIB_FTRUNCATE = @GL_GNULIB_FTRUNCATE@
+GL_GNULIB_FUTIMENS = @GL_GNULIB_FUTIMENS@
+GL_GNULIB_FWRITE = @GL_GNULIB_FWRITE@
+GL_GNULIB_GETC = @GL_GNULIB_GETC@
+GL_GNULIB_GETCHAR = @GL_GNULIB_GETCHAR@
+GL_GNULIB_GETCWD = @GL_GNULIB_GETCWD@
+GL_GNULIB_GETDELIM = @GL_GNULIB_GETDELIM@
+GL_GNULIB_GETDOMAINNAME = @GL_GNULIB_GETDOMAINNAME@
+GL_GNULIB_GETDTABLESIZE = @GL_GNULIB_GETDTABLESIZE@
+GL_GNULIB_GETENTROPY = @GL_GNULIB_GETENTROPY@
+GL_GNULIB_GETGROUPS = @GL_GNULIB_GETGROUPS@
+GL_GNULIB_GETHOSTNAME = @GL_GNULIB_GETHOSTNAME@
+GL_GNULIB_GETLINE = @GL_GNULIB_GETLINE@
+GL_GNULIB_GETLOADAVG = @GL_GNULIB_GETLOADAVG@
+GL_GNULIB_GETLOGIN = @GL_GNULIB_GETLOGIN@
+GL_GNULIB_GETLOGIN_R = @GL_GNULIB_GETLOGIN_R@
+GL_GNULIB_GETOPT_POSIX = @GL_GNULIB_GETOPT_POSIX@
+GL_GNULIB_GETPAGESIZE = @GL_GNULIB_GETPAGESIZE@
+GL_GNULIB_GETPASS = @GL_GNULIB_GETPASS@
+GL_GNULIB_GETRUSAGE = @GL_GNULIB_GETRUSAGE@
+GL_GNULIB_GETSUBOPT = @GL_GNULIB_GETSUBOPT@
+GL_GNULIB_GETTIMEOFDAY = @GL_GNULIB_GETTIMEOFDAY@
+GL_GNULIB_GETUMASK = @GL_GNULIB_GETUMASK@
+GL_GNULIB_GETUSERSHELL = @GL_GNULIB_GETUSERSHELL@
+GL_GNULIB_GRANTPT = @GL_GNULIB_GRANTPT@
+GL_GNULIB_GROUP_MEMBER = @GL_GNULIB_GROUP_MEMBER@
+GL_GNULIB_HYPOT = @GL_GNULIB_HYPOT@
+GL_GNULIB_HYPOTF = @GL_GNULIB_HYPOTF@
+GL_GNULIB_HYPOTL = @GL_GNULIB_HYPOTL@
+GL_GNULIB_ICONV = @GL_GNULIB_ICONV@
+GL_GNULIB_ILOGB = @GL_GNULIB_ILOGB@
+GL_GNULIB_ILOGBF = @GL_GNULIB_ILOGBF@
+GL_GNULIB_ILOGBL = @GL_GNULIB_ILOGBL@
+GL_GNULIB_IMAXABS = @GL_GNULIB_IMAXABS@
+GL_GNULIB_IMAXDIV = @GL_GNULIB_IMAXDIV@
+GL_GNULIB_IOCTL = @GL_GNULIB_IOCTL@
+GL_GNULIB_ISATTY = @GL_GNULIB_ISATTY@
+GL_GNULIB_ISFINITE = @GL_GNULIB_ISFINITE@
+GL_GNULIB_ISINF = @GL_GNULIB_ISINF@
+GL_GNULIB_ISNAN = @GL_GNULIB_ISNAN@
+GL_GNULIB_ISNAND = @GL_GNULIB_ISNAND@
+GL_GNULIB_ISNANF = @GL_GNULIB_ISNANF@
+GL_GNULIB_ISNANL = @GL_GNULIB_ISNANL@
+GL_GNULIB_ISWBLANK = @GL_GNULIB_ISWBLANK@
+GL_GNULIB_ISWCTYPE = @GL_GNULIB_ISWCTYPE@
+GL_GNULIB_ISWDIGIT = @GL_GNULIB_ISWDIGIT@
+GL_GNULIB_ISWXDIGIT = @GL_GNULIB_ISWXDIGIT@
+GL_GNULIB_LCHMOD = @GL_GNULIB_LCHMOD@
+GL_GNULIB_LCHOWN = @GL_GNULIB_LCHOWN@
+GL_GNULIB_LDEXPF = @GL_GNULIB_LDEXPF@
+GL_GNULIB_LDEXPL = @GL_GNULIB_LDEXPL@
+GL_GNULIB_LINK = @GL_GNULIB_LINK@
+GL_GNULIB_LINKAT = @GL_GNULIB_LINKAT@
+GL_GNULIB_LOCALECONV = @GL_GNULIB_LOCALECONV@
+GL_GNULIB_LOCALENAME = @GL_GNULIB_LOCALENAME@
+GL_GNULIB_LOCALTIME = @GL_GNULIB_LOCALTIME@
+GL_GNULIB_LOG = @GL_GNULIB_LOG@
+GL_GNULIB_LOG10 = @GL_GNULIB_LOG10@
+GL_GNULIB_LOG10F = @GL_GNULIB_LOG10F@
+GL_GNULIB_LOG10L = @GL_GNULIB_LOG10L@
+GL_GNULIB_LOG1P = @GL_GNULIB_LOG1P@
+GL_GNULIB_LOG1PF = @GL_GNULIB_LOG1PF@
+GL_GNULIB_LOG1PL = @GL_GNULIB_LOG1PL@
+GL_GNULIB_LOG2 = @GL_GNULIB_LOG2@
+GL_GNULIB_LOG2F = @GL_GNULIB_LOG2F@
+GL_GNULIB_LOG2L = @GL_GNULIB_LOG2L@
+GL_GNULIB_LOGB = @GL_GNULIB_LOGB@
+GL_GNULIB_LOGBF = @GL_GNULIB_LOGBF@
+GL_GNULIB_LOGBL = @GL_GNULIB_LOGBL@
+GL_GNULIB_LOGF = @GL_GNULIB_LOGF@
+GL_GNULIB_LOGL = @GL_GNULIB_LOGL@
+GL_GNULIB_LSEEK = @GL_GNULIB_LSEEK@
+GL_GNULIB_LSTAT = @GL_GNULIB_LSTAT@
+GL_GNULIB_MALLOC_POSIX = @GL_GNULIB_MALLOC_POSIX@
+GL_GNULIB_MBRLEN = @GL_GNULIB_MBRLEN@
+GL_GNULIB_MBRTOWC = @GL_GNULIB_MBRTOWC@
+GL_GNULIB_MBSCASECMP = @GL_GNULIB_MBSCASECMP@
+GL_GNULIB_MBSCASESTR = @GL_GNULIB_MBSCASESTR@
+GL_GNULIB_MBSCHR = @GL_GNULIB_MBSCHR@
+GL_GNULIB_MBSCSPN = @GL_GNULIB_MBSCSPN@
+GL_GNULIB_MBSINIT = @GL_GNULIB_MBSINIT@
+GL_GNULIB_MBSLEN = @GL_GNULIB_MBSLEN@
+GL_GNULIB_MBSNCASECMP = @GL_GNULIB_MBSNCASECMP@
+GL_GNULIB_MBSNLEN = @GL_GNULIB_MBSNLEN@
+GL_GNULIB_MBSNRTOWCS = @GL_GNULIB_MBSNRTOWCS@
+GL_GNULIB_MBSPBRK = @GL_GNULIB_MBSPBRK@
+GL_GNULIB_MBSPCASECMP = @GL_GNULIB_MBSPCASECMP@
+GL_GNULIB_MBSRCHR = @GL_GNULIB_MBSRCHR@
+GL_GNULIB_MBSRTOWCS = @GL_GNULIB_MBSRTOWCS@
+GL_GNULIB_MBSSEP = @GL_GNULIB_MBSSEP@
+GL_GNULIB_MBSSPN = @GL_GNULIB_MBSSPN@
+GL_GNULIB_MBSSTR = @GL_GNULIB_MBSSTR@
+GL_GNULIB_MBSTOK_R = @GL_GNULIB_MBSTOK_R@
+GL_GNULIB_MBTOWC = @GL_GNULIB_MBTOWC@
+GL_GNULIB_MDA_ACCESS = @GL_GNULIB_MDA_ACCESS@
+GL_GNULIB_MDA_CHDIR = @GL_GNULIB_MDA_CHDIR@
+GL_GNULIB_MDA_CHMOD = @GL_GNULIB_MDA_CHMOD@
+GL_GNULIB_MDA_CLOSE = @GL_GNULIB_MDA_CLOSE@
+GL_GNULIB_MDA_CREAT = @GL_GNULIB_MDA_CREAT@
+GL_GNULIB_MDA_DUP = @GL_GNULIB_MDA_DUP@
+GL_GNULIB_MDA_DUP2 = @GL_GNULIB_MDA_DUP2@
+GL_GNULIB_MDA_ECVT = @GL_GNULIB_MDA_ECVT@
+GL_GNULIB_MDA_EXECL = @GL_GNULIB_MDA_EXECL@
+GL_GNULIB_MDA_EXECLE = @GL_GNULIB_MDA_EXECLE@
+GL_GNULIB_MDA_EXECLP = @GL_GNULIB_MDA_EXECLP@
+GL_GNULIB_MDA_EXECV = @GL_GNULIB_MDA_EXECV@
+GL_GNULIB_MDA_EXECVE = @GL_GNULIB_MDA_EXECVE@
+GL_GNULIB_MDA_EXECVP = @GL_GNULIB_MDA_EXECVP@
+GL_GNULIB_MDA_EXECVPE = @GL_GNULIB_MDA_EXECVPE@
+GL_GNULIB_MDA_FCLOSEALL = @GL_GNULIB_MDA_FCLOSEALL@
+GL_GNULIB_MDA_FCVT = @GL_GNULIB_MDA_FCVT@
+GL_GNULIB_MDA_FDOPEN = @GL_GNULIB_MDA_FDOPEN@
+GL_GNULIB_MDA_FILENO = @GL_GNULIB_MDA_FILENO@
+GL_GNULIB_MDA_GCVT = @GL_GNULIB_MDA_GCVT@
+GL_GNULIB_MDA_GETCWD = @GL_GNULIB_MDA_GETCWD@
+GL_GNULIB_MDA_GETPID = @GL_GNULIB_MDA_GETPID@
+GL_GNULIB_MDA_GETW = @GL_GNULIB_MDA_GETW@
+GL_GNULIB_MDA_ISATTY = @GL_GNULIB_MDA_ISATTY@
+GL_GNULIB_MDA_J0 = @GL_GNULIB_MDA_J0@
+GL_GNULIB_MDA_J1 = @GL_GNULIB_MDA_J1@
+GL_GNULIB_MDA_JN = @GL_GNULIB_MDA_JN@
+GL_GNULIB_MDA_LSEEK = @GL_GNULIB_MDA_LSEEK@
+GL_GNULIB_MDA_MEMCCPY = @GL_GNULIB_MDA_MEMCCPY@
+GL_GNULIB_MDA_MKDIR = @GL_GNULIB_MDA_MKDIR@
+GL_GNULIB_MDA_MKTEMP = @GL_GNULIB_MDA_MKTEMP@
+GL_GNULIB_MDA_OPEN = @GL_GNULIB_MDA_OPEN@
+GL_GNULIB_MDA_PUTENV = @GL_GNULIB_MDA_PUTENV@
+GL_GNULIB_MDA_PUTW = @GL_GNULIB_MDA_PUTW@
+GL_GNULIB_MDA_READ = @GL_GNULIB_MDA_READ@
+GL_GNULIB_MDA_RMDIR = @GL_GNULIB_MDA_RMDIR@
+GL_GNULIB_MDA_STRDUP = @GL_GNULIB_MDA_STRDUP@
+GL_GNULIB_MDA_SWAB = @GL_GNULIB_MDA_SWAB@
+GL_GNULIB_MDA_TEMPNAM = @GL_GNULIB_MDA_TEMPNAM@
+GL_GNULIB_MDA_TZSET = @GL_GNULIB_MDA_TZSET@
+GL_GNULIB_MDA_UMASK = @GL_GNULIB_MDA_UMASK@
+GL_GNULIB_MDA_UNLINK = @GL_GNULIB_MDA_UNLINK@
+GL_GNULIB_MDA_WCSDUP = @GL_GNULIB_MDA_WCSDUP@
+GL_GNULIB_MDA_WRITE = @GL_GNULIB_MDA_WRITE@
+GL_GNULIB_MDA_Y0 = @GL_GNULIB_MDA_Y0@
+GL_GNULIB_MDA_Y1 = @GL_GNULIB_MDA_Y1@
+GL_GNULIB_MDA_YN = @GL_GNULIB_MDA_YN@
+GL_GNULIB_MEMCHR = @GL_GNULIB_MEMCHR@
+GL_GNULIB_MEMMEM = @GL_GNULIB_MEMMEM@
+GL_GNULIB_MEMPCPY = @GL_GNULIB_MEMPCPY@
+GL_GNULIB_MEMRCHR = @GL_GNULIB_MEMRCHR@
+GL_GNULIB_MKDIR = @GL_GNULIB_MKDIR@
+GL_GNULIB_MKDIRAT = @GL_GNULIB_MKDIRAT@
+GL_GNULIB_MKDTEMP = @GL_GNULIB_MKDTEMP@
+GL_GNULIB_MKFIFO = @GL_GNULIB_MKFIFO@
+GL_GNULIB_MKFIFOAT = @GL_GNULIB_MKFIFOAT@
+GL_GNULIB_MKNOD = @GL_GNULIB_MKNOD@
+GL_GNULIB_MKNODAT = @GL_GNULIB_MKNODAT@
+GL_GNULIB_MKOSTEMP = @GL_GNULIB_MKOSTEMP@
+GL_GNULIB_MKOSTEMPS = @GL_GNULIB_MKOSTEMPS@
+GL_GNULIB_MKSTEMP = @GL_GNULIB_MKSTEMP@
+GL_GNULIB_MKSTEMPS = @GL_GNULIB_MKSTEMPS@
+GL_GNULIB_MKTIME = @GL_GNULIB_MKTIME@
+GL_GNULIB_MODF = @GL_GNULIB_MODF@
+GL_GNULIB_MODFF = @GL_GNULIB_MODFF@
+GL_GNULIB_MODFL = @GL_GNULIB_MODFL@
+GL_GNULIB_NANOSLEEP = @GL_GNULIB_NANOSLEEP@
+GL_GNULIB_NONBLOCKING = @GL_GNULIB_NONBLOCKING@
+GL_GNULIB_OBSTACK_PRINTF = @GL_GNULIB_OBSTACK_PRINTF@
+GL_GNULIB_OBSTACK_PRINTF_POSIX = @GL_GNULIB_OBSTACK_PRINTF_POSIX@
+GL_GNULIB_OPEN = @GL_GNULIB_OPEN@
+GL_GNULIB_OPENAT = @GL_GNULIB_OPENAT@
+GL_GNULIB_OPENDIR = @GL_GNULIB_OPENDIR@
+GL_GNULIB_OVERRIDES_STRUCT_STAT = @GL_GNULIB_OVERRIDES_STRUCT_STAT@
+GL_GNULIB_PCLOSE = @GL_GNULIB_PCLOSE@
+GL_GNULIB_PERROR = @GL_GNULIB_PERROR@
+GL_GNULIB_PIPE = @GL_GNULIB_PIPE@
+GL_GNULIB_PIPE2 = @GL_GNULIB_PIPE2@
+GL_GNULIB_POPEN = @GL_GNULIB_POPEN@
+GL_GNULIB_POSIX_MEMALIGN = @GL_GNULIB_POSIX_MEMALIGN@
+GL_GNULIB_POSIX_OPENPT = @GL_GNULIB_POSIX_OPENPT@
+GL_GNULIB_POSIX_SPAWN = @GL_GNULIB_POSIX_SPAWN@
+GL_GNULIB_POSIX_SPAWNATTR_DESTROY = @GL_GNULIB_POSIX_SPAWNATTR_DESTROY@
+GL_GNULIB_POSIX_SPAWNATTR_GETFLAGS = @GL_GNULIB_POSIX_SPAWNATTR_GETFLAGS@
+GL_GNULIB_POSIX_SPAWNATTR_GETPGROUP = @GL_GNULIB_POSIX_SPAWNATTR_GETPGROUP@
+GL_GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM = @GL_GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM@
+GL_GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY = @GL_GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY@
+GL_GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT = @GL_GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT@
+GL_GNULIB_POSIX_SPAWNATTR_GETSIGMASK = @GL_GNULIB_POSIX_SPAWNATTR_GETSIGMASK@
+GL_GNULIB_POSIX_SPAWNATTR_INIT = @GL_GNULIB_POSIX_SPAWNATTR_INIT@
+GL_GNULIB_POSIX_SPAWNATTR_SETFLAGS = @GL_GNULIB_POSIX_SPAWNATTR_SETFLAGS@
+GL_GNULIB_POSIX_SPAWNATTR_SETPGROUP = @GL_GNULIB_POSIX_SPAWNATTR_SETPGROUP@
+GL_GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM = @GL_GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM@
+GL_GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY = @GL_GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY@
+GL_GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT = @GL_GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT@
+GL_GNULIB_POSIX_SPAWNATTR_SETSIGMASK = @GL_GNULIB_POSIX_SPAWNATTR_SETSIGMASK@
+GL_GNULIB_POSIX_SPAWNP = @GL_GNULIB_POSIX_SPAWNP@
+GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY = @GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY@
+GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT = @GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT@
+GL_GNULIB_POWF = @GL_GNULIB_POWF@
+GL_GNULIB_PREAD = @GL_GNULIB_PREAD@
+GL_GNULIB_PRINTF = @GL_GNULIB_PRINTF@
+GL_GNULIB_PRINTF_POSIX = @GL_GNULIB_PRINTF_POSIX@
+GL_GNULIB_PTHREAD_SIGMASK = @GL_GNULIB_PTHREAD_SIGMASK@
+GL_GNULIB_PTSNAME = @GL_GNULIB_PTSNAME@
+GL_GNULIB_PTSNAME_R = @GL_GNULIB_PTSNAME_R@
+GL_GNULIB_PUTC = @GL_GNULIB_PUTC@
+GL_GNULIB_PUTCHAR = @GL_GNULIB_PUTCHAR@
+GL_GNULIB_PUTENV = @GL_GNULIB_PUTENV@
+GL_GNULIB_PUTS = @GL_GNULIB_PUTS@
+GL_GNULIB_PWRITE = @GL_GNULIB_PWRITE@
+GL_GNULIB_QSORT_R = @GL_GNULIB_QSORT_R@
+GL_GNULIB_RAISE = @GL_GNULIB_RAISE@
+GL_GNULIB_RANDOM = @GL_GNULIB_RANDOM@
+GL_GNULIB_RANDOM_R = @GL_GNULIB_RANDOM_R@
+GL_GNULIB_RAWMEMCHR = @GL_GNULIB_RAWMEMCHR@
+GL_GNULIB_READ = @GL_GNULIB_READ@
+GL_GNULIB_READDIR = @GL_GNULIB_READDIR@
+GL_GNULIB_READLINK = @GL_GNULIB_READLINK@
+GL_GNULIB_READLINKAT = @GL_GNULIB_READLINKAT@
+GL_GNULIB_REALLOCARRAY = @GL_GNULIB_REALLOCARRAY@
+GL_GNULIB_REALLOC_POSIX = @GL_GNULIB_REALLOC_POSIX@
+GL_GNULIB_REALPATH = @GL_GNULIB_REALPATH@
+GL_GNULIB_REMAINDER = @GL_GNULIB_REMAINDER@
+GL_GNULIB_REMAINDERF = @GL_GNULIB_REMAINDERF@
+GL_GNULIB_REMAINDERL = @GL_GNULIB_REMAINDERL@
+GL_GNULIB_REMOVE = @GL_GNULIB_REMOVE@
+GL_GNULIB_RENAME = @GL_GNULIB_RENAME@
+GL_GNULIB_RENAMEAT = @GL_GNULIB_RENAMEAT@
+GL_GNULIB_REWINDDIR = @GL_GNULIB_REWINDDIR@
+GL_GNULIB_RINT = @GL_GNULIB_RINT@
+GL_GNULIB_RINTF = @GL_GNULIB_RINTF@
+GL_GNULIB_RINTL = @GL_GNULIB_RINTL@
+GL_GNULIB_RMDIR = @GL_GNULIB_RMDIR@
+GL_GNULIB_ROUND = @GL_GNULIB_ROUND@
+GL_GNULIB_ROUNDF = @GL_GNULIB_ROUNDF@
+GL_GNULIB_ROUNDL = @GL_GNULIB_ROUNDL@
+GL_GNULIB_RPMATCH = @GL_GNULIB_RPMATCH@
+GL_GNULIB_SCANDIR = @GL_GNULIB_SCANDIR@
+GL_GNULIB_SCANF = @GL_GNULIB_SCANF@
+GL_GNULIB_SCHED_YIELD = @GL_GNULIB_SCHED_YIELD@
+GL_GNULIB_SECURE_GETENV = @GL_GNULIB_SECURE_GETENV@
+GL_GNULIB_SETENV = @GL_GNULIB_SETENV@
+GL_GNULIB_SETHOSTNAME = @GL_GNULIB_SETHOSTNAME@
+GL_GNULIB_SETLOCALE = @GL_GNULIB_SETLOCALE@
+GL_GNULIB_SETLOCALE_NULL = @GL_GNULIB_SETLOCALE_NULL@
+GL_GNULIB_SIGABBREV_NP = @GL_GNULIB_SIGABBREV_NP@
+GL_GNULIB_SIGACTION = @GL_GNULIB_SIGACTION@
+GL_GNULIB_SIGDESCR_NP = @GL_GNULIB_SIGDESCR_NP@
+GL_GNULIB_SIGNAL_H_SIGPIPE = @GL_GNULIB_SIGNAL_H_SIGPIPE@
+GL_GNULIB_SIGNBIT = @GL_GNULIB_SIGNBIT@
+GL_GNULIB_SIGPROCMASK = @GL_GNULIB_SIGPROCMASK@
+GL_GNULIB_SINF = @GL_GNULIB_SINF@
+GL_GNULIB_SINHF = @GL_GNULIB_SINHF@
+GL_GNULIB_SINL = @GL_GNULIB_SINL@
+GL_GNULIB_SLEEP = @GL_GNULIB_SLEEP@
+GL_GNULIB_SNPRINTF = @GL_GNULIB_SNPRINTF@
+GL_GNULIB_SPRINTF_POSIX = @GL_GNULIB_SPRINTF_POSIX@
+GL_GNULIB_SQRTF = @GL_GNULIB_SQRTF@
+GL_GNULIB_SQRTL = @GL_GNULIB_SQRTL@
+GL_GNULIB_STAT = @GL_GNULIB_STAT@
+GL_GNULIB_STDIO_H_NONBLOCKING = @GL_GNULIB_STDIO_H_NONBLOCKING@
+GL_GNULIB_STDIO_H_SIGPIPE = @GL_GNULIB_STDIO_H_SIGPIPE@
+GL_GNULIB_STPCPY = @GL_GNULIB_STPCPY@
+GL_GNULIB_STPNCPY = @GL_GNULIB_STPNCPY@
+GL_GNULIB_STRCASESTR = @GL_GNULIB_STRCASESTR@
+GL_GNULIB_STRCHRNUL = @GL_GNULIB_STRCHRNUL@
+GL_GNULIB_STRDUP = @GL_GNULIB_STRDUP@
+GL_GNULIB_STRERROR = @GL_GNULIB_STRERROR@
+GL_GNULIB_STRERRORNAME_NP = @GL_GNULIB_STRERRORNAME_NP@
+GL_GNULIB_STRERROR_R = @GL_GNULIB_STRERROR_R@
+GL_GNULIB_STRFTIME = @GL_GNULIB_STRFTIME@
+GL_GNULIB_STRNCAT = @GL_GNULIB_STRNCAT@
+GL_GNULIB_STRNDUP = @GL_GNULIB_STRNDUP@
+GL_GNULIB_STRNLEN = @GL_GNULIB_STRNLEN@
+GL_GNULIB_STRPBRK = @GL_GNULIB_STRPBRK@
+GL_GNULIB_STRPTIME = @GL_GNULIB_STRPTIME@
+GL_GNULIB_STRSEP = @GL_GNULIB_STRSEP@
+GL_GNULIB_STRSIGNAL = @GL_GNULIB_STRSIGNAL@
+GL_GNULIB_STRSTR = @GL_GNULIB_STRSTR@
+GL_GNULIB_STRTOD = @GL_GNULIB_STRTOD@
+GL_GNULIB_STRTOIMAX = @GL_GNULIB_STRTOIMAX@
+GL_GNULIB_STRTOK_R = @GL_GNULIB_STRTOK_R@
+GL_GNULIB_STRTOL = @GL_GNULIB_STRTOL@
+GL_GNULIB_STRTOLD = @GL_GNULIB_STRTOLD@
+GL_GNULIB_STRTOLL = @GL_GNULIB_STRTOLL@
+GL_GNULIB_STRTOUL = @GL_GNULIB_STRTOUL@
+GL_GNULIB_STRTOULL = @GL_GNULIB_STRTOULL@
+GL_GNULIB_STRTOUMAX = @GL_GNULIB_STRTOUMAX@
+GL_GNULIB_STRVERSCMP = @GL_GNULIB_STRVERSCMP@
+GL_GNULIB_SYMLINK = @GL_GNULIB_SYMLINK@
+GL_GNULIB_SYMLINKAT = @GL_GNULIB_SYMLINKAT@
+GL_GNULIB_SYSTEM_POSIX = @GL_GNULIB_SYSTEM_POSIX@
+GL_GNULIB_TANF = @GL_GNULIB_TANF@
+GL_GNULIB_TANHF = @GL_GNULIB_TANHF@
+GL_GNULIB_TANL = @GL_GNULIB_TANL@
+GL_GNULIB_TCGETSID = @GL_GNULIB_TCGETSID@
+GL_GNULIB_TIMEGM = @GL_GNULIB_TIMEGM@
+GL_GNULIB_TIMES = @GL_GNULIB_TIMES@
+GL_GNULIB_TIMESPEC_GET = @GL_GNULIB_TIMESPEC_GET@
+GL_GNULIB_TIME_R = @GL_GNULIB_TIME_R@
+GL_GNULIB_TIME_RZ = @GL_GNULIB_TIME_RZ@
+GL_GNULIB_TMPFILE = @GL_GNULIB_TMPFILE@
+GL_GNULIB_TOWCTRANS = @GL_GNULIB_TOWCTRANS@
+GL_GNULIB_TRUNC = @GL_GNULIB_TRUNC@
+GL_GNULIB_TRUNCATE = @GL_GNULIB_TRUNCATE@
+GL_GNULIB_TRUNCF = @GL_GNULIB_TRUNCF@
+GL_GNULIB_TRUNCL = @GL_GNULIB_TRUNCL@
+GL_GNULIB_TTYNAME_R = @GL_GNULIB_TTYNAME_R@
+GL_GNULIB_TZSET = @GL_GNULIB_TZSET@
+GL_GNULIB_UNISTD_H_GETOPT = @GL_GNULIB_UNISTD_H_GETOPT@
+GL_GNULIB_UNISTD_H_NONBLOCKING = @GL_GNULIB_UNISTD_H_NONBLOCKING@
+GL_GNULIB_UNISTD_H_SIGPIPE = @GL_GNULIB_UNISTD_H_SIGPIPE@
+GL_GNULIB_UNLINK = @GL_GNULIB_UNLINK@
+GL_GNULIB_UNLINKAT = @GL_GNULIB_UNLINKAT@
+GL_GNULIB_UNLOCKPT = @GL_GNULIB_UNLOCKPT@
+GL_GNULIB_UNSETENV = @GL_GNULIB_UNSETENV@
+GL_GNULIB_USLEEP = @GL_GNULIB_USLEEP@
+GL_GNULIB_UTIMENSAT = @GL_GNULIB_UTIMENSAT@
+GL_GNULIB_VASPRINTF = @GL_GNULIB_VASPRINTF@
+GL_GNULIB_VDPRINTF = @GL_GNULIB_VDPRINTF@
+GL_GNULIB_VFPRINTF = @GL_GNULIB_VFPRINTF@
+GL_GNULIB_VFPRINTF_POSIX = @GL_GNULIB_VFPRINTF_POSIX@
+GL_GNULIB_VFSCANF = @GL_GNULIB_VFSCANF@
+GL_GNULIB_VPRINTF = @GL_GNULIB_VPRINTF@
+GL_GNULIB_VPRINTF_POSIX = @GL_GNULIB_VPRINTF_POSIX@
+GL_GNULIB_VSCANF = @GL_GNULIB_VSCANF@
+GL_GNULIB_VSNPRINTF = @GL_GNULIB_VSNPRINTF@
+GL_GNULIB_VSPRINTF_POSIX = @GL_GNULIB_VSPRINTF_POSIX@
+GL_GNULIB_WAITPID = @GL_GNULIB_WAITPID@
+GL_GNULIB_WCPCPY = @GL_GNULIB_WCPCPY@
+GL_GNULIB_WCPNCPY = @GL_GNULIB_WCPNCPY@
+GL_GNULIB_WCRTOMB = @GL_GNULIB_WCRTOMB@
+GL_GNULIB_WCSCASECMP = @GL_GNULIB_WCSCASECMP@
+GL_GNULIB_WCSCAT = @GL_GNULIB_WCSCAT@
+GL_GNULIB_WCSCHR = @GL_GNULIB_WCSCHR@
+GL_GNULIB_WCSCMP = @GL_GNULIB_WCSCMP@
+GL_GNULIB_WCSCOLL = @GL_GNULIB_WCSCOLL@
+GL_GNULIB_WCSCPY = @GL_GNULIB_WCSCPY@
+GL_GNULIB_WCSCSPN = @GL_GNULIB_WCSCSPN@
+GL_GNULIB_WCSDUP = @GL_GNULIB_WCSDUP@
+GL_GNULIB_WCSFTIME = @GL_GNULIB_WCSFTIME@
+GL_GNULIB_WCSLEN = @GL_GNULIB_WCSLEN@
+GL_GNULIB_WCSNCASECMP = @GL_GNULIB_WCSNCASECMP@
+GL_GNULIB_WCSNCAT = @GL_GNULIB_WCSNCAT@
+GL_GNULIB_WCSNCMP = @GL_GNULIB_WCSNCMP@
+GL_GNULIB_WCSNCPY = @GL_GNULIB_WCSNCPY@
+GL_GNULIB_WCSNLEN = @GL_GNULIB_WCSNLEN@
+GL_GNULIB_WCSNRTOMBS = @GL_GNULIB_WCSNRTOMBS@
+GL_GNULIB_WCSPBRK = @GL_GNULIB_WCSPBRK@
+GL_GNULIB_WCSRCHR = @GL_GNULIB_WCSRCHR@
+GL_GNULIB_WCSRTOMBS = @GL_GNULIB_WCSRTOMBS@
+GL_GNULIB_WCSSPN = @GL_GNULIB_WCSSPN@
+GL_GNULIB_WCSSTR = @GL_GNULIB_WCSSTR@
+GL_GNULIB_WCSTOK = @GL_GNULIB_WCSTOK@
+GL_GNULIB_WCSWIDTH = @GL_GNULIB_WCSWIDTH@
+GL_GNULIB_WCSXFRM = @GL_GNULIB_WCSXFRM@
+GL_GNULIB_WCTOB = @GL_GNULIB_WCTOB@
+GL_GNULIB_WCTOMB = @GL_GNULIB_WCTOMB@
+GL_GNULIB_WCTRANS = @GL_GNULIB_WCTRANS@
+GL_GNULIB_WCTYPE = @GL_GNULIB_WCTYPE@
+GL_GNULIB_WCWIDTH = @GL_GNULIB_WCWIDTH@
+GL_GNULIB_WMEMCHR = @GL_GNULIB_WMEMCHR@
+GL_GNULIB_WMEMCMP = @GL_GNULIB_WMEMCMP@
+GL_GNULIB_WMEMCPY = @GL_GNULIB_WMEMCPY@
+GL_GNULIB_WMEMMOVE = @GL_GNULIB_WMEMMOVE@
+GL_GNULIB_WMEMPCPY = @GL_GNULIB_WMEMPCPY@
+GL_GNULIB_WMEMSET = @GL_GNULIB_WMEMSET@
+GL_GNULIB_WRITE = @GL_GNULIB_WRITE@
+GL_GNULIB__EXIT = @GL_GNULIB__EXIT@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
-GNULIB_ACCESS = @GNULIB_ACCESS@
-GNULIB_ACOSF = @GNULIB_ACOSF@
-GNULIB_ACOSL = @GNULIB_ACOSL@
-GNULIB_ASINF = @GNULIB_ASINF@
-GNULIB_ASINL = @GNULIB_ASINL@
-GNULIB_ATAN2F = @GNULIB_ATAN2F@
-GNULIB_ATANF = @GNULIB_ATANF@
-GNULIB_ATANL = @GNULIB_ATANL@
-GNULIB_ATOLL = @GNULIB_ATOLL@
-GNULIB_BTOWC = @GNULIB_BTOWC@
-GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@
-GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@
-GNULIB_CBRT = @GNULIB_CBRT@
-GNULIB_CBRTF = @GNULIB_CBRTF@
-GNULIB_CBRTL = @GNULIB_CBRTL@
-GNULIB_CEIL = @GNULIB_CEIL@
-GNULIB_CEILF = @GNULIB_CEILF@
-GNULIB_CEILL = @GNULIB_CEILL@
-GNULIB_CHDIR = @GNULIB_CHDIR@
-GNULIB_CHOWN = @GNULIB_CHOWN@
-GNULIB_CLOSE = @GNULIB_CLOSE@
-GNULIB_COPYSIGN = @GNULIB_COPYSIGN@
-GNULIB_COPYSIGNF = @GNULIB_COPYSIGNF@
-GNULIB_COPYSIGNL = @GNULIB_COPYSIGNL@
-GNULIB_COPY_FILE_RANGE = @GNULIB_COPY_FILE_RANGE@
-GNULIB_COSF = @GNULIB_COSF@
-GNULIB_COSHF = @GNULIB_COSHF@
-GNULIB_COSL = @GNULIB_COSL@
-GNULIB_CREAT = @GNULIB_CREAT@
-GNULIB_CTIME = @GNULIB_CTIME@
-GNULIB_DPRINTF = @GNULIB_DPRINTF@
-GNULIB_DUP = @GNULIB_DUP@
-GNULIB_DUP2 = @GNULIB_DUP2@
-GNULIB_DUP3 = @GNULIB_DUP3@
-GNULIB_ENVIRON = @GNULIB_ENVIRON@
-GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@
-GNULIB_EXP2 = @GNULIB_EXP2@
-GNULIB_EXP2F = @GNULIB_EXP2F@
-GNULIB_EXP2L = @GNULIB_EXP2L@
-GNULIB_EXPF = @GNULIB_EXPF@
-GNULIB_EXPL = @GNULIB_EXPL@
-GNULIB_EXPLICIT_BZERO = @GNULIB_EXPLICIT_BZERO@
-GNULIB_EXPM1 = @GNULIB_EXPM1@
-GNULIB_EXPM1F = @GNULIB_EXPM1F@
-GNULIB_EXPM1L = @GNULIB_EXPM1L@
-GNULIB_FABSF = @GNULIB_FABSF@
-GNULIB_FABSL = @GNULIB_FABSL@
-GNULIB_FACCESSAT = @GNULIB_FACCESSAT@
-GNULIB_FCHDIR = @GNULIB_FCHDIR@
-GNULIB_FCHMODAT = @GNULIB_FCHMODAT@
-GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@
-GNULIB_FCLOSE = @GNULIB_FCLOSE@
-GNULIB_FCNTL = @GNULIB_FCNTL@
-GNULIB_FDATASYNC = @GNULIB_FDATASYNC@
-GNULIB_FDOPEN = @GNULIB_FDOPEN@
-GNULIB_FFLUSH = @GNULIB_FFLUSH@
-GNULIB_FFSL = @GNULIB_FFSL@
-GNULIB_FFSLL = @GNULIB_FFSLL@
-GNULIB_FGETC = @GNULIB_FGETC@
-GNULIB_FGETS = @GNULIB_FGETS@
-GNULIB_FLOOR = @GNULIB_FLOOR@
-GNULIB_FLOORF = @GNULIB_FLOORF@
-GNULIB_FLOORL = @GNULIB_FLOORL@
-GNULIB_FMA = @GNULIB_FMA@
-GNULIB_FMAF = @GNULIB_FMAF@
-GNULIB_FMAL = @GNULIB_FMAL@
-GNULIB_FMOD = @GNULIB_FMOD@
-GNULIB_FMODF = @GNULIB_FMODF@
-GNULIB_FMODL = @GNULIB_FMODL@
-GNULIB_FOPEN = @GNULIB_FOPEN@
-GNULIB_FPRINTF = @GNULIB_FPRINTF@
-GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
-GNULIB_FPURGE = @GNULIB_FPURGE@
-GNULIB_FPUTC = @GNULIB_FPUTC@
-GNULIB_FPUTS = @GNULIB_FPUTS@
-GNULIB_FREAD = @GNULIB_FREAD@
-GNULIB_FREOPEN = @GNULIB_FREOPEN@
-GNULIB_FREXP = @GNULIB_FREXP@
-GNULIB_FREXPF = @GNULIB_FREXPF@
-GNULIB_FREXPL = @GNULIB_FREXPL@
-GNULIB_FSCANF = @GNULIB_FSCANF@
-GNULIB_FSEEK = @GNULIB_FSEEK@
-GNULIB_FSEEKO = @GNULIB_FSEEKO@
-GNULIB_FSTAT = @GNULIB_FSTAT@
-GNULIB_FSTATAT = @GNULIB_FSTATAT@
-GNULIB_FSYNC = @GNULIB_FSYNC@
-GNULIB_FTELL = @GNULIB_FTELL@
-GNULIB_FTELLO = @GNULIB_FTELLO@
-GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
-GNULIB_FUTIMENS = @GNULIB_FUTIMENS@
-GNULIB_FWRITE = @GNULIB_FWRITE@
-GNULIB_GETC = @GNULIB_GETC@
-GNULIB_GETCHAR = @GNULIB_GETCHAR@
-GNULIB_GETCWD = @GNULIB_GETCWD@
-GNULIB_GETDELIM = @GNULIB_GETDELIM@
-GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@
-GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@
-GNULIB_GETGROUPS = @GNULIB_GETGROUPS@
-GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@
-GNULIB_GETLINE = @GNULIB_GETLINE@
-GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@
-GNULIB_GETLOGIN = @GNULIB_GETLOGIN@
-GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
-GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@
-GNULIB_GETPASS = @GNULIB_GETPASS@
-GNULIB_GETRUSAGE = @GNULIB_GETRUSAGE@
-GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIBHEADERS_OVERRIDE_WINT_T = @GNULIBHEADERS_OVERRIDE_WINT_T@
 GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@
-GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@
-GNULIB_GL_UNISTD_H_GETOPT = @GNULIB_GL_UNISTD_H_GETOPT@
-GNULIB_GRANTPT = @GNULIB_GRANTPT@
-GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@
-GNULIB_HYPOT = @GNULIB_HYPOT@
-GNULIB_HYPOTF = @GNULIB_HYPOTF@
-GNULIB_HYPOTL = @GNULIB_HYPOTL@
-GNULIB_ILOGB = @GNULIB_ILOGB@
-GNULIB_ILOGBF = @GNULIB_ILOGBF@
-GNULIB_ILOGBL = @GNULIB_ILOGBL@
-GNULIB_IMAXABS = @GNULIB_IMAXABS@
-GNULIB_IMAXDIV = @GNULIB_IMAXDIV@
-GNULIB_ISATTY = @GNULIB_ISATTY@
-GNULIB_ISFINITE = @GNULIB_ISFINITE@
-GNULIB_ISINF = @GNULIB_ISINF@
-GNULIB_ISNAN = @GNULIB_ISNAN@
-GNULIB_ISNAND = @GNULIB_ISNAND@
-GNULIB_ISNANF = @GNULIB_ISNANF@
-GNULIB_ISNANL = @GNULIB_ISNANL@
-GNULIB_ISWBLANK = @GNULIB_ISWBLANK@
-GNULIB_ISWCTYPE = @GNULIB_ISWCTYPE@
-GNULIB_LCHMOD = @GNULIB_LCHMOD@
-GNULIB_LCHOWN = @GNULIB_LCHOWN@
-GNULIB_LDEXPF = @GNULIB_LDEXPF@
-GNULIB_LDEXPL = @GNULIB_LDEXPL@
-GNULIB_LINK = @GNULIB_LINK@
-GNULIB_LINKAT = @GNULIB_LINKAT@
-GNULIB_LOCALTIME = @GNULIB_LOCALTIME@
-GNULIB_LOG = @GNULIB_LOG@
-GNULIB_LOG10 = @GNULIB_LOG10@
-GNULIB_LOG10F = @GNULIB_LOG10F@
-GNULIB_LOG10L = @GNULIB_LOG10L@
-GNULIB_LOG1P = @GNULIB_LOG1P@
-GNULIB_LOG1PF = @GNULIB_LOG1PF@
-GNULIB_LOG1PL = @GNULIB_LOG1PL@
-GNULIB_LOG2 = @GNULIB_LOG2@
-GNULIB_LOG2F = @GNULIB_LOG2F@
-GNULIB_LOG2L = @GNULIB_LOG2L@
-GNULIB_LOGB = @GNULIB_LOGB@
-GNULIB_LOGBF = @GNULIB_LOGBF@
-GNULIB_LOGBL = @GNULIB_LOGBL@
-GNULIB_LOGF = @GNULIB_LOGF@
-GNULIB_LOGL = @GNULIB_LOGL@
-GNULIB_LSEEK = @GNULIB_LSEEK@
-GNULIB_LSTAT = @GNULIB_LSTAT@
-GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@
-GNULIB_MBRLEN = @GNULIB_MBRLEN@
-GNULIB_MBRTOWC = @GNULIB_MBRTOWC@
-GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
-GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
-GNULIB_MBSCHR = @GNULIB_MBSCHR@
-GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
-GNULIB_MBSINIT = @GNULIB_MBSINIT@
-GNULIB_MBSLEN = @GNULIB_MBSLEN@
-GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
-GNULIB_MBSNLEN = @GNULIB_MBSNLEN@
-GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@
-GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
-GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
-GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
-GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@
-GNULIB_MBSSEP = @GNULIB_MBSSEP@
-GNULIB_MBSSPN = @GNULIB_MBSSPN@
-GNULIB_MBSSTR = @GNULIB_MBSSTR@
-GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
-GNULIB_MBTOWC = @GNULIB_MBTOWC@
-GNULIB_MEMCHR = @GNULIB_MEMCHR@
-GNULIB_MEMMEM = @GNULIB_MEMMEM@
-GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
-GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
-GNULIB_MKDIRAT = @GNULIB_MKDIRAT@
-GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
-GNULIB_MKFIFO = @GNULIB_MKFIFO@
-GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@
-GNULIB_MKNOD = @GNULIB_MKNOD@
-GNULIB_MKNODAT = @GNULIB_MKNODAT@
-GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@
-GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@
-GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
-GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@
-GNULIB_MKTIME = @GNULIB_MKTIME@
-GNULIB_MODF = @GNULIB_MODF@
-GNULIB_MODFF = @GNULIB_MODFF@
-GNULIB_MODFL = @GNULIB_MODFL@
-GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@
-GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@
-GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@
-GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@
-GNULIB_OPEN = @GNULIB_OPEN@
-GNULIB_OPENAT = @GNULIB_OPENAT@
-GNULIB_OVERRIDES_STRUCT_STAT = @GNULIB_OVERRIDES_STRUCT_STAT@
-GNULIB_OVERRIDES_WINT_T = @GNULIB_OVERRIDES_WINT_T@
-GNULIB_PCLOSE = @GNULIB_PCLOSE@
-GNULIB_PERROR = @GNULIB_PERROR@
-GNULIB_PIPE = @GNULIB_PIPE@
-GNULIB_PIPE2 = @GNULIB_PIPE2@
-GNULIB_POPEN = @GNULIB_POPEN@
-GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@
-GNULIB_POSIX_SPAWN = @GNULIB_POSIX_SPAWN@
-GNULIB_POSIX_SPAWNATTR_DESTROY = @GNULIB_POSIX_SPAWNATTR_DESTROY@
-GNULIB_POSIX_SPAWNATTR_GETFLAGS = @GNULIB_POSIX_SPAWNATTR_GETFLAGS@
-GNULIB_POSIX_SPAWNATTR_GETPGROUP = @GNULIB_POSIX_SPAWNATTR_GETPGROUP@
-GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM@
-GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY@
-GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT@
-GNULIB_POSIX_SPAWNATTR_GETSIGMASK = @GNULIB_POSIX_SPAWNATTR_GETSIGMASK@
-GNULIB_POSIX_SPAWNATTR_INIT = @GNULIB_POSIX_SPAWNATTR_INIT@
-GNULIB_POSIX_SPAWNATTR_SETFLAGS = @GNULIB_POSIX_SPAWNATTR_SETFLAGS@
-GNULIB_POSIX_SPAWNATTR_SETPGROUP = @GNULIB_POSIX_SPAWNATTR_SETPGROUP@
-GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM@
-GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY@
-GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT@
-GNULIB_POSIX_SPAWNATTR_SETSIGMASK = @GNULIB_POSIX_SPAWNATTR_SETSIGMASK@
-GNULIB_POSIX_SPAWNP = @GNULIB_POSIX_SPAWNP@
-GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
-GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
-GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
-GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
-GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
-GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY@
-GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT@
-GNULIB_POWF = @GNULIB_POWF@
-GNULIB_PREAD = @GNULIB_PREAD@
-GNULIB_PRINTF = @GNULIB_PRINTF@
-GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
-GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@
-GNULIB_PTSNAME = @GNULIB_PTSNAME@
-GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@
-GNULIB_PUTC = @GNULIB_PUTC@
-GNULIB_PUTCHAR = @GNULIB_PUTCHAR@
-GNULIB_PUTENV = @GNULIB_PUTENV@
-GNULIB_PUTS = @GNULIB_PUTS@
-GNULIB_PWRITE = @GNULIB_PWRITE@
-GNULIB_QSORT_R = @GNULIB_QSORT_R@
-GNULIB_RAISE = @GNULIB_RAISE@
-GNULIB_RANDOM = @GNULIB_RANDOM@
-GNULIB_RANDOM_R = @GNULIB_RANDOM_R@
-GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@
-GNULIB_READ = @GNULIB_READ@
-GNULIB_READLINK = @GNULIB_READLINK@
-GNULIB_READLINKAT = @GNULIB_READLINKAT@
-GNULIB_REALLOCARRAY = @GNULIB_REALLOCARRAY@
-GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@
-GNULIB_REALPATH = @GNULIB_REALPATH@
-GNULIB_REMAINDER = @GNULIB_REMAINDER@
-GNULIB_REMAINDERF = @GNULIB_REMAINDERF@
-GNULIB_REMAINDERL = @GNULIB_REMAINDERL@
-GNULIB_REMOVE = @GNULIB_REMOVE@
-GNULIB_RENAME = @GNULIB_RENAME@
-GNULIB_RENAMEAT = @GNULIB_RENAMEAT@
-GNULIB_RINT = @GNULIB_RINT@
-GNULIB_RINTF = @GNULIB_RINTF@
-GNULIB_RINTL = @GNULIB_RINTL@
-GNULIB_RMDIR = @GNULIB_RMDIR@
-GNULIB_ROUND = @GNULIB_ROUND@
-GNULIB_ROUNDF = @GNULIB_ROUNDF@
-GNULIB_ROUNDL = @GNULIB_ROUNDL@
-GNULIB_RPMATCH = @GNULIB_RPMATCH@
-GNULIB_SCANF = @GNULIB_SCANF@
-GNULIB_SCHED_YIELD = @GNULIB_SCHED_YIELD@
-GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@
-GNULIB_SETENV = @GNULIB_SETENV@
-GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@
-GNULIB_SIGACTION = @GNULIB_SIGACTION@
-GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@
-GNULIB_SIGNBIT = @GNULIB_SIGNBIT@
-GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@
-GNULIB_SINF = @GNULIB_SINF@
-GNULIB_SINHF = @GNULIB_SINHF@
-GNULIB_SINL = @GNULIB_SINL@
-GNULIB_SLEEP = @GNULIB_SLEEP@
-GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
-GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
-GNULIB_SQRTF = @GNULIB_SQRTF@
-GNULIB_SQRTL = @GNULIB_SQRTL@
-GNULIB_STAT = @GNULIB_STAT@
-GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@
-GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@
-GNULIB_STPCPY = @GNULIB_STPCPY@
-GNULIB_STPNCPY = @GNULIB_STPNCPY@
-GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
-GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
-GNULIB_STRDUP = @GNULIB_STRDUP@
-GNULIB_STRERROR = @GNULIB_STRERROR@
-GNULIB_STRERROR_R = @GNULIB_STRERROR_R@
-GNULIB_STRFTIME = @GNULIB_STRFTIME@
-GNULIB_STRNCAT = @GNULIB_STRNCAT@
-GNULIB_STRNDUP = @GNULIB_STRNDUP@
-GNULIB_STRNLEN = @GNULIB_STRNLEN@
-GNULIB_STRPBRK = @GNULIB_STRPBRK@
-GNULIB_STRPTIME = @GNULIB_STRPTIME@
-GNULIB_STRSEP = @GNULIB_STRSEP@
-GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@
-GNULIB_STRSTR = @GNULIB_STRSTR@
-GNULIB_STRTOD = @GNULIB_STRTOD@
-GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@
-GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
-GNULIB_STRTOLD = @GNULIB_STRTOLD@
-GNULIB_STRTOLL = @GNULIB_STRTOLL@
-GNULIB_STRTOULL = @GNULIB_STRTOULL@
-GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@
-GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@
-GNULIB_SYMLINK = @GNULIB_SYMLINK@
-GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@
-GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@
-GNULIB_TANF = @GNULIB_TANF@
-GNULIB_TANHF = @GNULIB_TANHF@
-GNULIB_TANL = @GNULIB_TANL@
-GNULIB_TIMEGM = @GNULIB_TIMEGM@
-GNULIB_TIMES = @GNULIB_TIMES@
-GNULIB_TIME_R = @GNULIB_TIME_R@
-GNULIB_TIME_RZ = @GNULIB_TIME_RZ@
-GNULIB_TMPFILE = @GNULIB_TMPFILE@
-GNULIB_TOWCTRANS = @GNULIB_TOWCTRANS@
-GNULIB_TRUNC = @GNULIB_TRUNC@
-GNULIB_TRUNCATE = @GNULIB_TRUNCATE@
-GNULIB_TRUNCF = @GNULIB_TRUNCF@
-GNULIB_TRUNCL = @GNULIB_TRUNCL@
-GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@
-GNULIB_TZSET = @GNULIB_TZSET@
-GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@
-GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@
-GNULIB_UNLINK = @GNULIB_UNLINK@
-GNULIB_UNLINKAT = @GNULIB_UNLINKAT@
-GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@
-GNULIB_UNSETENV = @GNULIB_UNSETENV@
-GNULIB_USLEEP = @GNULIB_USLEEP@
-GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@
-GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
-GNULIB_VDPRINTF = @GNULIB_VDPRINTF@
-GNULIB_VFPRINTF = @GNULIB_VFPRINTF@
-GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
-GNULIB_VFSCANF = @GNULIB_VFSCANF@
-GNULIB_VPRINTF = @GNULIB_VPRINTF@
-GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
-GNULIB_VSCANF = @GNULIB_VSCANF@
-GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
-GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
-GNULIB_WAITPID = @GNULIB_WAITPID@
-GNULIB_WCPCPY = @GNULIB_WCPCPY@
-GNULIB_WCPNCPY = @GNULIB_WCPNCPY@
-GNULIB_WCRTOMB = @GNULIB_WCRTOMB@
-GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@
-GNULIB_WCSCAT = @GNULIB_WCSCAT@
-GNULIB_WCSCHR = @GNULIB_WCSCHR@
-GNULIB_WCSCMP = @GNULIB_WCSCMP@
-GNULIB_WCSCOLL = @GNULIB_WCSCOLL@
-GNULIB_WCSCPY = @GNULIB_WCSCPY@
-GNULIB_WCSCSPN = @GNULIB_WCSCSPN@
-GNULIB_WCSDUP = @GNULIB_WCSDUP@
-GNULIB_WCSFTIME = @GNULIB_WCSFTIME@
-GNULIB_WCSLEN = @GNULIB_WCSLEN@
-GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@
-GNULIB_WCSNCAT = @GNULIB_WCSNCAT@
-GNULIB_WCSNCMP = @GNULIB_WCSNCMP@
-GNULIB_WCSNCPY = @GNULIB_WCSNCPY@
-GNULIB_WCSNLEN = @GNULIB_WCSNLEN@
-GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@
-GNULIB_WCSPBRK = @GNULIB_WCSPBRK@
-GNULIB_WCSRCHR = @GNULIB_WCSRCHR@
-GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@
-GNULIB_WCSSPN = @GNULIB_WCSSPN@
-GNULIB_WCSSTR = @GNULIB_WCSSTR@
-GNULIB_WCSTOK = @GNULIB_WCSTOK@
-GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@
-GNULIB_WCSXFRM = @GNULIB_WCSXFRM@
-GNULIB_WCTOB = @GNULIB_WCTOB@
-GNULIB_WCTOMB = @GNULIB_WCTOMB@
-GNULIB_WCTRANS = @GNULIB_WCTRANS@
-GNULIB_WCTYPE = @GNULIB_WCTYPE@
-GNULIB_WCWIDTH = @GNULIB_WCWIDTH@
-GNULIB_WMEMCHR = @GNULIB_WMEMCHR@
-GNULIB_WMEMCMP = @GNULIB_WMEMCMP@
-GNULIB_WMEMCPY = @GNULIB_WMEMCPY@
-GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@
-GNULIB_WMEMSET = @GNULIB_WMEMSET@
-GNULIB_WRITE = @GNULIB_WRITE@
-GNULIB__EXIT = @GNULIB__EXIT@
 GREP = @GREP@
 HAVE_ACOSF = @HAVE_ACOSF@
 HAVE_ACOSL = @HAVE_ACOSL@
+HAVE_ALIGNED_ALLOC = @HAVE_ALIGNED_ALLOC@
 HAVE_ALLOCA_H = @HAVE_ALLOCA_H@
+HAVE_ALPHASORT = @HAVE_ALPHASORT@
 HAVE_ASINF = @HAVE_ASINF@
 HAVE_ASINL = @HAVE_ASINL@
 HAVE_ATAN2F = @HAVE_ATAN2F@
@@ -1750,6 +2121,7 @@
 HAVE_CBRTF = @HAVE_CBRTF@
 HAVE_CBRTL = @HAVE_CBRTL@
 HAVE_CHOWN = @HAVE_CHOWN@
+HAVE_CLOSEDIR = @HAVE_CLOSEDIR@
 HAVE_COPYSIGN = @HAVE_COPYSIGN@
 HAVE_COPYSIGNL = @HAVE_COPYSIGNL@
 HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@
@@ -1766,20 +2138,27 @@
 HAVE_DECL_CEILL = @HAVE_DECL_CEILL@
 HAVE_DECL_COPYSIGNF = @HAVE_DECL_COPYSIGNF@
 HAVE_DECL_COSL = @HAVE_DECL_COSL@
+HAVE_DECL_DIRFD = @HAVE_DECL_DIRFD@
+HAVE_DECL_ECVT = @HAVE_DECL_ECVT@
 HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@
+HAVE_DECL_EXECVPE = @HAVE_DECL_EXECVPE@
 HAVE_DECL_EXP2 = @HAVE_DECL_EXP2@
 HAVE_DECL_EXP2F = @HAVE_DECL_EXP2F@
 HAVE_DECL_EXP2L = @HAVE_DECL_EXP2L@
 HAVE_DECL_EXPL = @HAVE_DECL_EXPL@
 HAVE_DECL_EXPM1L = @HAVE_DECL_EXPM1L@
 HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@
+HAVE_DECL_FCLOSEALL = @HAVE_DECL_FCLOSEALL@
+HAVE_DECL_FCVT = @HAVE_DECL_FCVT@
 HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@
+HAVE_DECL_FDOPENDIR = @HAVE_DECL_FDOPENDIR@
 HAVE_DECL_FLOORF = @HAVE_DECL_FLOORF@
 HAVE_DECL_FLOORL = @HAVE_DECL_FLOORL@
 HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@
 HAVE_DECL_FREXPL = @HAVE_DECL_FREXPL@
 HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@
 HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@
+HAVE_DECL_GCVT = @HAVE_DECL_GCVT@
 HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@
 HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@
 HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@
@@ -1816,6 +2195,7 @@
 HAVE_DECL_SQRTL = @HAVE_DECL_SQRTL@
 HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
 HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@
+HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@
 HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
 HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
 HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@
@@ -1823,6 +2203,7 @@
 HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
 HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
 HAVE_DECL_TANL = @HAVE_DECL_TANL@
+HAVE_DECL_TCGETSID = @HAVE_DECL_TCGETSID@
 HAVE_DECL_TRUNC = @HAVE_DECL_TRUNC@
 HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@
 HAVE_DECL_TRUNCF = @HAVE_DECL_TRUNCF@
@@ -1830,12 +2211,15 @@
 HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@
 HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@
 HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DECL_WCSDUP = @HAVE_DECL_WCSDUP@
 HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@
 HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@
+HAVE_DIRENT_H = @HAVE_DIRENT_H@
 HAVE_DPRINTF = @HAVE_DPRINTF@
-HAVE_DUP2 = @HAVE_DUP2@
 HAVE_DUP3 = @HAVE_DUP3@
+HAVE_DUPLOCALE = @HAVE_DUPLOCALE@
 HAVE_EUIDACCESS = @HAVE_EUIDACCESS@
+HAVE_EXECVPE = @HAVE_EXECVPE@
 HAVE_EXPF = @HAVE_EXPF@
 HAVE_EXPL = @HAVE_EXPL@
 HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@
@@ -1849,7 +2233,9 @@
 HAVE_FCHOWNAT = @HAVE_FCHOWNAT@
 HAVE_FCNTL = @HAVE_FCNTL@
 HAVE_FDATASYNC = @HAVE_FDATASYNC@
+HAVE_FDOPENDIR = @HAVE_FDOPENDIR@
 HAVE_FEATURES_H = @HAVE_FEATURES_H@
+HAVE_FFS = @HAVE_FFS@
 HAVE_FFSL = @HAVE_FFSL@
 HAVE_FFSLL = @HAVE_FFSLL@
 HAVE_FMA = @HAVE_FMA@
@@ -1857,6 +2243,7 @@
 HAVE_FMAL = @HAVE_FMAL@
 HAVE_FMODF = @HAVE_FMODF@
 HAVE_FMODL = @HAVE_FMODL@
+HAVE_FREELOCALE = @HAVE_FREELOCALE@
 HAVE_FREXPF = @HAVE_FREXPF@
 HAVE_FSEEKO = @HAVE_FSEEKO@
 HAVE_FSTATAT = @HAVE_FSTATAT@
@@ -1867,6 +2254,7 @@
 HAVE_GCJ_C = @HAVE_GCJ_C@
 HAVE_GCJ_IN_PATH = @HAVE_GCJ_IN_PATH@
 HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@
+HAVE_GETENTROPY = @HAVE_GETENTROPY@
 HAVE_GETGROUPS = @HAVE_GETGROUPS@
 HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@
 HAVE_GETLOGIN = @HAVE_GETLOGIN@
@@ -1876,6 +2264,7 @@
 HAVE_GETRUSAGE = @HAVE_GETRUSAGE@
 HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
 HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@
+HAVE_GETUMASK = @HAVE_GETUMASK@
 HAVE_GIJ = @HAVE_GIJ@
 HAVE_GIJ_IN_PATH = @HAVE_GIJ_IN_PATH@
 HAVE_GRANTPT = @HAVE_GRANTPT@
@@ -1920,7 +2309,6 @@
 HAVE_LOGBL = @HAVE_LOGBL@
 HAVE_LOGF = @HAVE_LOGF@
 HAVE_LOGL = @HAVE_LOGL@
-HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@
 HAVE_LSTAT = @HAVE_LSTAT@
 HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@
 HAVE_MBRLEN = @HAVE_MBRLEN@
@@ -1930,7 +2318,6 @@
 HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@
 HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@
 HAVE_MBTOWC = @HAVE_MBTOWC@
-HAVE_MEMCHR = @HAVE_MEMCHR@
 HAVE_MEMPCPY = @HAVE_MEMPCPY@
 HAVE_MKDIRAT = @HAVE_MKDIRAT@
 HAVE_MKDTEMP = @HAVE_MKDTEMP@
@@ -1946,12 +2333,15 @@
 HAVE_MODFL = @HAVE_MODFL@
 HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@
 HAVE_NANOSLEEP = @HAVE_NANOSLEEP@
+HAVE_NEWLOCALE = @HAVE_NEWLOCALE@
 HAVE_OPENAT = @HAVE_OPENAT@
+HAVE_OPENDIR = @HAVE_OPENDIR@
 HAVE_OS_H = @HAVE_OS_H@
 HAVE_PCLOSE = @HAVE_PCLOSE@
 HAVE_PIPE = @HAVE_PIPE@
 HAVE_PIPE2 = @HAVE_PIPE2@
 HAVE_POPEN = @HAVE_POPEN@
+HAVE_POSIX_MEMALIGN = @HAVE_POSIX_MEMALIGN@
 HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@
 HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@
 HAVE_POSIX_SPAWN = @HAVE_POSIX_SPAWN@
@@ -1971,6 +2361,7 @@
 HAVE_RANDOM_H = @HAVE_RANDOM_H@
 HAVE_RANDOM_R = @HAVE_RANDOM_R@
 HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@
+HAVE_READDIR = @HAVE_READDIR@
 HAVE_READLINK = @HAVE_READLINK@
 HAVE_READLINKAT = @HAVE_READLINKAT@
 HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@
@@ -1978,17 +2369,21 @@
 HAVE_REMAINDER = @HAVE_REMAINDER@
 HAVE_REMAINDERF = @HAVE_REMAINDERF@
 HAVE_RENAMEAT = @HAVE_RENAMEAT@
+HAVE_REWINDDIR = @HAVE_REWINDDIR@
 HAVE_RINT = @HAVE_RINT@
 HAVE_RINTL = @HAVE_RINTL@
 HAVE_RPMATCH = @HAVE_RPMATCH@
 HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = @HAVE_SAME_LONG_DOUBLE_AS_DOUBLE@
+HAVE_SCANDIR = @HAVE_SCANDIR@
 HAVE_SCHED_H = @HAVE_SCHED_H@
 HAVE_SCHED_YIELD = @HAVE_SCHED_YIELD@
 HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@
 HAVE_SETENV = @HAVE_SETENV@
 HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@
 HAVE_SETSTATE = @HAVE_SETSTATE@
+HAVE_SIGABBREV_NP = @HAVE_SIGABBREV_NP@
 HAVE_SIGACTION = @HAVE_SIGACTION@
+HAVE_SIGDESCR_NP = @HAVE_SIGDESCR_NP@
 HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@
 HAVE_SIGINFO_T = @HAVE_SIGINFO_T@
 HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@
@@ -2005,14 +2400,19 @@
 HAVE_STDINT_H = @HAVE_STDINT_H@
 HAVE_STPCPY = @HAVE_STPCPY@
 HAVE_STPNCPY = @HAVE_STPNCPY@
+HAVE_STRCASECMP = @HAVE_STRCASECMP@
 HAVE_STRCASESTR = @HAVE_STRCASESTR@
 HAVE_STRCHRNUL = @HAVE_STRCHRNUL@
+HAVE_STRERRORNAME_NP = @HAVE_STRERRORNAME_NP@
+HAVE_STRINGS_H = @HAVE_STRINGS_H@
 HAVE_STRPBRK = @HAVE_STRPBRK@
 HAVE_STRPTIME = @HAVE_STRPTIME@
 HAVE_STRSEP = @HAVE_STRSEP@
 HAVE_STRTOD = @HAVE_STRTOD@
+HAVE_STRTOL = @HAVE_STRTOL@
 HAVE_STRTOLD = @HAVE_STRTOLD@
 HAVE_STRTOLL = @HAVE_STRTOLL@
+HAVE_STRTOUL = @HAVE_STRTOUL@
 HAVE_STRTOULL = @HAVE_STRTOULL@
 HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@
 HAVE_STRUCT_SCHED_PARAM = @HAVE_STRUCT_SCHED_PARAM@
@@ -2025,6 +2425,7 @@
 HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
 HAVE_SYS_CDEFS_H = @HAVE_SYS_CDEFS_H@
 HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_IOCTL_H = @HAVE_SYS_IOCTL_H@
 HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@
 HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@
 HAVE_SYS_RESOURCE_H = @HAVE_SYS_RESOURCE_H@
@@ -2034,19 +2435,20 @@
 HAVE_TANF = @HAVE_TANF@
 HAVE_TANHF = @HAVE_TANHF@
 HAVE_TANL = @HAVE_TANL@
+HAVE_TERMIOS_H = @HAVE_TERMIOS_H@
 HAVE_TIMEGM = @HAVE_TIMEGM@
 HAVE_TIMES = @HAVE_TIMES@
+HAVE_TIMESPEC_GET = @HAVE_TIMESPEC_GET@
 HAVE_TIMEZONE_T = @HAVE_TIMEZONE_T@
 HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@
-HAVE_TZSET = @HAVE_TZSET@
 HAVE_UNISTD_H = @HAVE_UNISTD_H@
 HAVE_UNLINKAT = @HAVE_UNLINKAT@
 HAVE_UNLOCKPT = @HAVE_UNLOCKPT@
-HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@
 HAVE_USLEEP = @HAVE_USLEEP@
 HAVE_UTIMENSAT = @HAVE_UTIMENSAT@
 HAVE_VASPRINTF = @HAVE_VASPRINTF@
 HAVE_VDPRINTF = @HAVE_VDPRINTF@
+HAVE_VISIBILITY = @HAVE_VISIBILITY@
 HAVE_WCHAR_H = @HAVE_WCHAR_H@
 HAVE_WCHAR_T = @HAVE_WCHAR_T@
 HAVE_WCPCPY = @HAVE_WCPCPY@
@@ -2085,10 +2487,14 @@
 HAVE_WMEMCMP = @HAVE_WMEMCMP@
 HAVE_WMEMCPY = @HAVE_WMEMCPY@
 HAVE_WMEMMOVE = @HAVE_WMEMMOVE@
+HAVE_WMEMPCPY = @HAVE_WMEMPCPY@
 HAVE_WMEMSET = @HAVE_WMEMSET@
+HAVE_XLOCALE_H = @HAVE_XLOCALE_H@
 HAVE__BOOL = @HAVE__BOOL@
 HAVE__EXIT = @HAVE__EXIT@
 HELP2MAN = @HELP2MAN@
+ICONV_CONST = @ICONV_CONST@
+ICONV_H = @ICONV_H@
 INCLUDE_NEXT = @INCLUDE_NEXT@
 INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@
 INSTALL = @INSTALL@
@@ -2120,17 +2526,26 @@
 LIBOBJS = @LIBOBJS@
 LIBPMULTITHREAD = @LIBPMULTITHREAD@
 LIBPTHREAD = @LIBPTHREAD@
+LIBREADLINE = @LIBREADLINE@
 LIBS = @LIBS@
+LIBSTDTHREAD = @LIBSTDTHREAD@
 LIBTEXTSTYLE = @LIBTEXTSTYLE@
 LIBTEXTSTYLE_PREFIX = @LIBTEXTSTYLE_PREFIX@
 LIBTHREAD = @LIBTHREAD@
+LIBUNISTRING_UNISTR_H = @LIBUNISTRING_UNISTR_H@
 LIBUNISTRING_UNITYPES_H = @LIBUNISTRING_UNITYPES_H@
 LIBUNISTRING_UNIWIDTH_H = @LIBUNISTRING_UNIWIDTH_H@
 LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
 LIB_GETHRXTIME = @LIB_GETHRXTIME@
+LIB_HARD_LOCALE = @LIB_HARD_LOCALE@
+LIB_MBRTOWC = @LIB_MBRTOWC@
 LIB_POSIX_SPAWN = @LIB_POSIX_SPAWN@
+LIB_SCHED_YIELD = @LIB_SCHED_YIELD@
+LIB_SETLOCALE_NULL = @LIB_SETLOCALE_NULL@
 LIMITS_H = @LIMITS_H@
 LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@
+LOCALENAME_ENHANCE_LOCALE_FUNCS = @LOCALENAME_ENHANCE_LOCALE_FUNCS@
+LOCALE_FR = @LOCALE_FR@
 LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@
 LOCALE_JA = @LOCALE_JA@
 LOCALE_ZH_CN = @LOCALE_ZH_CN@
@@ -2138,6 +2553,7 @@
 LTLIBINTL = @LTLIBINTL@
 LTLIBMULTITHREAD = @LTLIBMULTITHREAD@
 LTLIBOBJS = @LTLIBOBJS@
+LTLIBREADLINE = @LTLIBREADLINE@
 LTLIBTEXTSTYLE = @LTLIBTEXTSTYLE@
 LTLIBTHREAD = @LTLIBTHREAD@
 M4 = @M4@
@@ -2148,12 +2564,15 @@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
+NEXT_AS_FIRST_DIRECTIVE_DIRENT_H = @NEXT_AS_FIRST_DIRECTIVE_DIRENT_H@
 NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@
 NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@
 NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@
 NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@
+NEXT_AS_FIRST_DIRECTIVE_ICONV_H = @NEXT_AS_FIRST_DIRECTIVE_ICONV_H@
 NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H = @NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H@
 NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@
+NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@
 NEXT_AS_FIRST_DIRECTIVE_MATH_H = @NEXT_AS_FIRST_DIRECTIVE_MATH_H@
 NEXT_AS_FIRST_DIRECTIVE_SCHED_H = @NEXT_AS_FIRST_DIRECTIVE_SCHED_H@
 NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@
@@ -2162,23 +2581,29 @@
 NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@
 NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@
 NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@
+NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@
 NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H@
 NEXT_AS_FIRST_DIRECTIVE_SYS_RESOURCE_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_RESOURCE_H@
 NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@
 NEXT_AS_FIRST_DIRECTIVE_SYS_TIMES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIMES_H@
 NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@
 NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@
 NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H@
+NEXT_AS_FIRST_DIRECTIVE_TERMIOS_H = @NEXT_AS_FIRST_DIRECTIVE_TERMIOS_H@
 NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@
 NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@
 NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@
 NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@
+NEXT_DIRENT_H = @NEXT_DIRENT_H@
 NEXT_ERRNO_H = @NEXT_ERRNO_H@
 NEXT_FCNTL_H = @NEXT_FCNTL_H@
 NEXT_FLOAT_H = @NEXT_FLOAT_H@
 NEXT_GETOPT_H = @NEXT_GETOPT_H@
+NEXT_ICONV_H = @NEXT_ICONV_H@
 NEXT_INTTYPES_H = @NEXT_INTTYPES_H@
 NEXT_LIMITS_H = @NEXT_LIMITS_H@
+NEXT_LOCALE_H = @NEXT_LOCALE_H@
 NEXT_MATH_H = @NEXT_MATH_H@
 NEXT_SCHED_H = @NEXT_SCHED_H@
 NEXT_SIGNAL_H = @NEXT_SIGNAL_H@
@@ -2187,13 +2612,16 @@
 NEXT_STDINT_H = @NEXT_STDINT_H@
 NEXT_STDIO_H = @NEXT_STDIO_H@
 NEXT_STDLIB_H = @NEXT_STDLIB_H@
+NEXT_STRINGS_H = @NEXT_STRINGS_H@
 NEXT_STRING_H = @NEXT_STRING_H@
+NEXT_SYS_IOCTL_H = @NEXT_SYS_IOCTL_H@
 NEXT_SYS_RESOURCE_H = @NEXT_SYS_RESOURCE_H@
 NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@
 NEXT_SYS_TIMES_H = @NEXT_SYS_TIMES_H@
 NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@
 NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@
 NEXT_SYS_WAIT_H = @NEXT_SYS_WAIT_H@
+NEXT_TERMIOS_H = @NEXT_TERMIOS_H@
 NEXT_TIME_H = @NEXT_TIME_H@
 NEXT_UNISTD_H = @NEXT_UNISTD_H@
 NEXT_WCHAR_H = @NEXT_WCHAR_H@
@@ -2214,7 +2642,6 @@
 PRAGMA_COLUMNS = @PRAGMA_COLUMNS@
 PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@
 PRIPTR_PREFIX = @PRIPTR_PREFIX@
-PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@
 PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@
 PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
 RANLIB = @RANLIB@
@@ -2227,6 +2654,7 @@
 RELOCATABLE_STRIP = @RELOCATABLE_STRIP@
 REPLACE_ACCESS = @REPLACE_ACCESS@
 REPLACE_ACOSF = @REPLACE_ACOSF@
+REPLACE_ALIGNED_ALLOC = @REPLACE_ALIGNED_ALLOC@
 REPLACE_ASINF = @REPLACE_ASINF@
 REPLACE_ATAN2F = @REPLACE_ATAN2F@
 REPLACE_ATANF = @REPLACE_ATANF@
@@ -2240,13 +2668,23 @@
 REPLACE_CEILL = @REPLACE_CEILL@
 REPLACE_CHOWN = @REPLACE_CHOWN@
 REPLACE_CLOSE = @REPLACE_CLOSE@
+REPLACE_CLOSEDIR = @REPLACE_CLOSEDIR@
 REPLACE_COSF = @REPLACE_COSF@
 REPLACE_COSHF = @REPLACE_COSHF@
 REPLACE_CREAT = @REPLACE_CREAT@
 REPLACE_CTIME = @REPLACE_CTIME@
+REPLACE_DIRFD = @REPLACE_DIRFD@
 REPLACE_DPRINTF = @REPLACE_DPRINTF@
 REPLACE_DUP = @REPLACE_DUP@
 REPLACE_DUP2 = @REPLACE_DUP2@
+REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@
+REPLACE_EXECL = @REPLACE_EXECL@
+REPLACE_EXECLE = @REPLACE_EXECLE@
+REPLACE_EXECLP = @REPLACE_EXECLP@
+REPLACE_EXECV = @REPLACE_EXECV@
+REPLACE_EXECVE = @REPLACE_EXECVE@
+REPLACE_EXECVP = @REPLACE_EXECVP@
+REPLACE_EXECVPE = @REPLACE_EXECVPE@
 REPLACE_EXP2 = @REPLACE_EXP2@
 REPLACE_EXP2L = @REPLACE_EXP2L@
 REPLACE_EXPF = @REPLACE_EXPF@
@@ -2256,11 +2694,14 @@
 REPLACE_EXPM1L = @REPLACE_EXPM1L@
 REPLACE_FABSL = @REPLACE_FABSL@
 REPLACE_FACCESSAT = @REPLACE_FACCESSAT@
+REPLACE_FCHMODAT = @REPLACE_FCHMODAT@
 REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@
 REPLACE_FCLOSE = @REPLACE_FCLOSE@
 REPLACE_FCNTL = @REPLACE_FCNTL@
 REPLACE_FDOPEN = @REPLACE_FDOPEN@
+REPLACE_FDOPENDIR = @REPLACE_FDOPENDIR@
 REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FFSLL = @REPLACE_FFSLL@
 REPLACE_FLOOR = @REPLACE_FLOOR@
 REPLACE_FLOORF = @REPLACE_FLOORF@
 REPLACE_FLOORL = @REPLACE_FLOORL@
@@ -2273,6 +2714,8 @@
 REPLACE_FOPEN = @REPLACE_FOPEN@
 REPLACE_FPRINTF = @REPLACE_FPRINTF@
 REPLACE_FPURGE = @REPLACE_FPURGE@
+REPLACE_FREE = @REPLACE_FREE@
+REPLACE_FREELOCALE = @REPLACE_FREELOCALE@
 REPLACE_FREOPEN = @REPLACE_FREOPEN@
 REPLACE_FREXP = @REPLACE_FREXP@
 REPLACE_FREXPF = @REPLACE_FREXPF@
@@ -2300,21 +2743,28 @@
 REPLACE_HYPOT = @REPLACE_HYPOT@
 REPLACE_HYPOTF = @REPLACE_HYPOTF@
 REPLACE_HYPOTL = @REPLACE_HYPOTL@
+REPLACE_ICONV = @REPLACE_ICONV@
+REPLACE_ICONV_OPEN = @REPLACE_ICONV_OPEN@
+REPLACE_ICONV_UTF = @REPLACE_ICONV_UTF@
 REPLACE_ILOGB = @REPLACE_ILOGB@
 REPLACE_ILOGBF = @REPLACE_ILOGBF@
 REPLACE_ILOGBL = @REPLACE_ILOGBL@
 REPLACE_INITSTATE = @REPLACE_INITSTATE@
+REPLACE_IOCTL = @REPLACE_IOCTL@
 REPLACE_ISATTY = @REPLACE_ISATTY@
 REPLACE_ISFINITE = @REPLACE_ISFINITE@
 REPLACE_ISINF = @REPLACE_ISINF@
 REPLACE_ISNAN = @REPLACE_ISNAN@
 REPLACE_ISWBLANK = @REPLACE_ISWBLANK@
 REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@
+REPLACE_ISWDIGIT = @REPLACE_ISWDIGIT@
+REPLACE_ISWXDIGIT = @REPLACE_ISWXDIGIT@
 REPLACE_ITOLD = @REPLACE_ITOLD@
 REPLACE_LCHOWN = @REPLACE_LCHOWN@
 REPLACE_LDEXPL = @REPLACE_LDEXPL@
 REPLACE_LINK = @REPLACE_LINK@
 REPLACE_LINKAT = @REPLACE_LINKAT@
+REPLACE_LOCALECONV = @REPLACE_LOCALECONV@
 REPLACE_LOCALTIME = @REPLACE_LOCALTIME@
 REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@
 REPLACE_LOG = @REPLACE_LOG@
@@ -2346,7 +2796,9 @@
 REPLACE_MEMMEM = @REPLACE_MEMMEM@
 REPLACE_MKDIR = @REPLACE_MKDIR@
 REPLACE_MKFIFO = @REPLACE_MKFIFO@
+REPLACE_MKFIFOAT = @REPLACE_MKFIFOAT@
 REPLACE_MKNOD = @REPLACE_MKNOD@
+REPLACE_MKNODAT = @REPLACE_MKNODAT@
 REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
 REPLACE_MKTIME = @REPLACE_MKTIME@
 REPLACE_MODF = @REPLACE_MODF@
@@ -2354,12 +2806,15 @@
 REPLACE_MODFL = @REPLACE_MODFL@
 REPLACE_NAN = @REPLACE_NAN@
 REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@
+REPLACE_NEWLOCALE = @REPLACE_NEWLOCALE@
 REPLACE_NULL = @REPLACE_NULL@
 REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@
 REPLACE_OPEN = @REPLACE_OPEN@
 REPLACE_OPENAT = @REPLACE_OPENAT@
+REPLACE_OPENDIR = @REPLACE_OPENDIR@
 REPLACE_PERROR = @REPLACE_PERROR@
 REPLACE_POPEN = @REPLACE_POPEN@
+REPLACE_POSIX_MEMALIGN = @REPLACE_POSIX_MEMALIGN@
 REPLACE_POSIX_SPAWN = @REPLACE_POSIX_SPAWN@
 REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
 REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
@@ -2381,6 +2836,7 @@
 REPLACE_READLINK = @REPLACE_READLINK@
 REPLACE_READLINKAT = @REPLACE_READLINKAT@
 REPLACE_REALLOC = @REPLACE_REALLOC@
+REPLACE_REALLOCARRAY = @REPLACE_REALLOCARRAY@
 REPLACE_REALPATH = @REPLACE_REALPATH@
 REPLACE_REMAINDER = @REPLACE_REMAINDER@
 REPLACE_REMAINDERF = @REPLACE_REMAINDERF@
@@ -2395,9 +2851,10 @@
 REPLACE_ROUNDL = @REPLACE_ROUNDL@
 REPLACE_SCHED_YIELD = @REPLACE_SCHED_YIELD@
 REPLACE_SETENV = @REPLACE_SETENV@
+REPLACE_SETLOCALE = @REPLACE_SETLOCALE@
 REPLACE_SETSTATE = @REPLACE_SETSTATE@
 REPLACE_SIGNBIT = @REPLACE_SIGNBIT@
-REPLACE_SIGNBIT_USING_GCC = @REPLACE_SIGNBIT_USING_GCC@
+REPLACE_SIGNBIT_USING_BUILTINS = @REPLACE_SIGNBIT_USING_BUILTINS@
 REPLACE_SINF = @REPLACE_SINF@
 REPLACE_SINHF = @REPLACE_SINHF@
 REPLACE_SLEEP = @REPLACE_SLEEP@
@@ -2413,6 +2870,7 @@
 REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@
 REPLACE_STRDUP = @REPLACE_STRDUP@
 REPLACE_STRERROR = @REPLACE_STRERROR@
+REPLACE_STRERRORNAME_NP = @REPLACE_STRERRORNAME_NP@
 REPLACE_STRERROR_R = @REPLACE_STRERROR_R@
 REPLACE_STRFTIME = @REPLACE_STRFTIME@
 REPLACE_STRNCAT = @REPLACE_STRNCAT@
@@ -2423,8 +2881,13 @@
 REPLACE_STRTOD = @REPLACE_STRTOD@
 REPLACE_STRTOIMAX = @REPLACE_STRTOIMAX@
 REPLACE_STRTOK_R = @REPLACE_STRTOK_R@
+REPLACE_STRTOL = @REPLACE_STRTOL@
 REPLACE_STRTOLD = @REPLACE_STRTOLD@
+REPLACE_STRTOLL = @REPLACE_STRTOLL@
+REPLACE_STRTOUL = @REPLACE_STRTOUL@
+REPLACE_STRTOULL = @REPLACE_STRTOULL@
 REPLACE_STRTOUMAX = @REPLACE_STRTOUMAX@
+REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@
 REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@
 REPLACE_SYMLINK = @REPLACE_SYMLINK@
 REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@
@@ -2465,17 +2928,22 @@
 SHELL = @SHELL@
 SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
 SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDALIGN_H = @STDALIGN_H@
 STDBOOL_H = @STDBOOL_H@
 STDDEF_H = @STDDEF_H@
 STDINT_H = @STDINT_H@
 STRIP = @STRIP@
+SYS_IOCTL_H_HAVE_WINSOCK2_H = @SYS_IOCTL_H_HAVE_WINSOCK2_H@
+SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
 SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
 TEXTSTYLE_H = @TEXTSTYLE_H@
 TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
+TIME_H_DEFINES_TIME_UTC = @TIME_H_DEFINES_TIME_UTC@
 UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@
 UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@
 UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@
 UNISTD_H_DEFINES_STRUCT_TIMESPEC = @UNISTD_H_DEFINES_STRUCT_TIMESPEC@
+UNISTD_H_HAVE_SYS_RANDOM_H = @UNISTD_H_HAVE_SYS_RANDOM_H@
 UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@
 UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
 USE_NLS = @USE_NLS@
@@ -2597,31 +3065,42 @@
 	$(top_srcdir)/doc/bison.help $(dist_man_MANS:.1=.x) $(FIGS_GV) \
 	$(FIGS_GV:.gv=.txt) $(FIGS_GV:.gv=.eps) $(FIGS_GV:.gv=.pdf) \
 	$(FIGS_GV:.gv=.svg) doc/Doxyfile.in $(extracted) \
-	examples/extracted.stamp examples/c/calc/calc.test \
-	examples/c/lexcalc/lexcalc.test \
+	examples/extracted.stamp \
+	examples/c/bistromathic/bistromathic.test \
+	examples/c/calc/calc.test examples/c/glr/c++-types.test \
+	examples/c/lexcalc/lexcalc.test examples/c/pushcalc/calc.test \
 	examples/c/reccalc/reccalc.test examples/c/reccalc/scan.l \
-	examples/c++/calc++/calc++.test examples/c++/simple.test \
+	examples/c++/calc++/calc++.test examples/c++/glr/c++-types.yy \
+	examples/c++/glr/c++-types.test examples/c++/simple.test \
 	examples/c++/variant.test examples/c++/variant-11.test \
-	examples/d/calc.test examples/java/Calc.test lib/alignof.h \
-	lib/alloca.in.h lib/allocator.h \
+	examples/d/calc/calc.test examples/d/simple/calc.test \
+	examples/java/calc/Calc.test examples/java/simple/Calc.test \
+	lib/access.c lib/alignof.h lib/alloca.in.h lib/allocator.h \
 	$(top_srcdir)/build-aux/announce-gen lib/areadlink.h \
-	lib/argmatch.h lib/assure.h lib/bitset.h lib/bitset/array.h \
+	lib/argmatch.h lib/assure.h lib/attribute.h \
+	lib/basename-lgpl.h lib/bitset.h lib/bitset/array.h \
 	lib/bitset/base.h lib/bitset/list.h lib/bitset/stats.h \
 	lib/bitset/table.h lib/bitset/vector.h lib/bitsetv.h \
-	lib/c-strcaseeq.h lib/calloc.c lib/canonicalize-lgpl.c \
-	lib/careadlinkat.h lib/cloexec.h lib/close.c \
-	lib/close-stream.h lib/closeout.h lib/concat-filename.h \
+	lib/c-strcaseeq.h lib/calloc.c lib/calloc.c lib/canonicalize.h \
+	lib/canonicalize-lgpl.c lib/careadlinkat.h lib/chdir-long.c \
+	lib/chdir-long.h lib/cloexec.h lib/close.c lib/close-stream.h \
+	lib/closedir.c lib/dirent-private.h lib/closeout.h \
+	lib/concat-filename.h lib/dirent.in.h lib/dirfd.c \
 	lib/stripslash.c lib/dirname.h \
-	$(top_srcdir)/build-aux/do-release-commit-and-tag \
-	lib/dosname.h lib/dup2.c lib/errno.in.h lib/error.c \
-	lib/error.h lib/exitfail.h lib/fcntl.c lib/fcntl.in.h \
-	lib/fd-hook.h lib/filename.h lib/float.c lib/float.in.h \
-	lib/itold.c lib/fopen.c lib/stdio--.h lib/stdio-safer.h \
+	$(top_srcdir)/build-aux/do-release-commit-and-tag lib/dup.c \
+	lib/dup2.c lib/eloop-threshold.h lib/errno.in.h lib/error.c \
+	lib/error.h lib/exitfail.h lib/fchdir.c lib/fcntl.c \
+	lib/fcntl.in.h lib/fd-hook.h lib/fdopendir.c lib/ffs.c \
+	lib/ffsl.c lib/ffsl.h lib/file-set.h lib/filename.h \
+	lib/filenamecat.h lib/float.c lib/float.in.h lib/itold.c \
+	lib/fopen.c lib/fopen.c lib/stdio--.h lib/stdio-safer.h \
 	lib/fpending.c lib/fpending.h lib/stdio-impl.h lib/fprintf.c \
-	lib/fpucw.h lib/frexp.c lib/frexp.c lib/frexpl.c lib/fseterr.c \
-	lib/fseterr.h lib/stdio-impl.h lib/fstat.c lib/stat-w32.c \
-	lib/stat-w32.h lib/fsync.c $(top_srcdir)/build-aux/gendocs.sh \
-	lib/getdtablesize.c lib/gethrxtime.h lib/xtime.h \
+	lib/fpucw.h lib/free.c lib/frexp.c lib/frexp.c lib/frexpl.c \
+	lib/fseterr.c lib/fseterr.h lib/stdio-impl.h lib/fstat.c \
+	lib/stat-w32.c lib/stat-w32.h lib/at-func.c lib/fstatat.c \
+	lib/fsync.c $(top_srcdir)/build-aux/gendocs.sh lib/getcwd.c \
+	lib/getcwd-lgpl.c lib/getdelim.c lib/getdtablesize.c \
+	lib/gethrxtime.h lib/xtime.h lib/getline.c \
 	lib/getopt-cdefs.in.h lib/getopt-core.h lib/getopt-ext.h \
 	lib/getopt-pfx-core.h lib/getopt-pfx-ext.h lib/getopt.c \
 	lib/getopt.in.h lib/getopt1.c lib/getopt_int.h lib/getrusage.c \
@@ -2629,62 +3108,90 @@
 	$(top_srcdir)/build-aux/gitlog-to-changelog \
 	$(top_srcdir)/build-aux/gnu-web-doc-update \
 	$(top_srcdir)/GNUmakefile $(top_srcdir)/build-aux/gnupload \
-	lib/hard-locale.h lib/hash.h \
-	$(top_srcdir)/build-aux/config.rpath lib/intprops.h \
+	lib/hard-locale.h lib/hash.h lib/hash-triple.h \
+	$(top_srcdir)/build-aux/config.rpath lib/ialloc.h \
+	lib/iconv.in.h lib/iconv_open-aix.h lib/iconv_open-hpux.h \
+	lib/iconv_open-irix.h lib/iconv_open-osf.h \
+	lib/iconv_open-solaris.h lib/iconv_open-zos.h lib/iconv.c \
+	lib/iconv_close.c lib/iconv_open-aix.gperf \
+	lib/iconv_open-hpux.gperf lib/iconv_open-irix.gperf \
+	lib/iconv_open-osf.gperf lib/iconv_open-solaris.gperf \
+	lib/iconv_open-zos.gperf lib/iconv_open.c lib/float+.h \
+	lib/integer_length.h lib/integer_length.h lib/intprops.h \
 	lib/inttypes.in.h lib/float+.h lib/isnan.c lib/isnand.c \
 	lib/float+.h lib/isnan.c lib/isnand-nolibm.h lib/isnand.c \
 	lib/float+.h lib/isnan.c lib/isnanf.c lib/float+.h lib/isnan.c \
 	lib/isnanf-nolibm.h lib/isnanf.c lib/float+.h lib/isnan.c \
 	lib/isnanl.c lib/float+.h lib/isnan.c lib/isnanl-nolibm.h \
-	lib/isnanl.c lib/iswblank.c \
+	lib/isnanl.c lib/iswblank.c lib/iswdigit.c lib/iswxdigit.c \
 	$(top_srcdir)/build-aux/javacomp.sh.in \
 	$(top_srcdir)/build-aux/javaexec.sh.in lib/ldexpl.c \
 	lib/cdefs.h lib/libc-config.h lib/textstyle.in.h \
-	lib/limits.in.h lib/localcharset.h lib/localtime-buffer.c \
-	lib/localtime-buffer.h lib/lstat.c $(top_srcdir)/maint.mk \
-	lib/malloc.c lib/malloc.c lib/malloca.h lib/math.in.h \
-	lib/mbchar.h lib/mbrtowc.c lib/mbsinit.c lib/memchr.c \
-	lib/memchr.valgrind lib/msvc-inval.c lib/msvc-inval.h \
-	lib/msvc-nothrow.c lib/msvc-nothrow.h \
-	$(top_srcdir)/build-aux/prefix-gnulib-mk lib/obstack.c \
-	lib/obstack.h lib/obstack_printf.c lib/open.c lib/pathmax.h \
-	lib/perror.c lib/spawn_int.h lib/spawni.c \
-	lib/spawn_faction_addclose.c lib/spawn_int.h \
+	lib/limits.in.h lib/localcharset.h lib/locale.in.h lib/lstat.c \
+	$(top_srcdir)/maint.mk lib/malloc.c lib/malloc.c lib/malloca.h \
+	lib/math.in.h lib/mbchar.h lib/lc-charset-dispatch.c \
+	lib/lc-charset-dispatch.h lib/mbrtowc-impl-utf8.h \
+	lib/mbrtowc-impl.h lib/mbrtowc.c lib/mbtowc-lock.c \
+	lib/mbtowc-lock.h lib/windows-initguard.h lib/mbsinit.c \
+	lib/memchr.c lib/memchr.valgrind lib/mempcpy.c lib/memrchr.c \
+	lib/msvc-inval.c lib/msvc-inval.h lib/msvc-nothrow.c \
+	lib/msvc-nothrow.h $(top_srcdir)/build-aux/prefix-gnulib-mk \
+	lib/obstack.c lib/obstack.h lib/obstack_printf.c lib/open.c \
+	lib/openat.c lib/openat.h lib/dirent-private.h lib/opendir.c \
+	lib/pathmax.h lib/perror.c lib/pipe.c lib/spawn.c \
+	lib/spawn_int.h lib/spawni.c lib/spawn_faction_addchdir.c \
+	lib/spawn_int.h lib/spawn_faction_addclose.c lib/spawn_int.h \
 	lib/spawn_faction_adddup2.c lib/spawn_int.h \
 	lib/spawn_faction_addopen.c lib/spawn_int.h \
 	lib/spawn_faction_destroy.c lib/spawn_faction_init.c \
 	lib/spawn_int.h lib/spawnattr_destroy.c lib/spawnattr_init.c \
-	lib/spawnattr_setflags.c lib/spawnattr_setsigmask.c \
-	lib/spawnp.c lib/printf-frexp.h lib/printf-frexp.c \
-	lib/printf-frexpl.h lib/printf.c lib/quote.h lib/quote.h \
-	lib/quotearg.h lib/raise.c lib/rawmemchr.c \
-	lib/rawmemchr.valgrind lib/readlink.c lib/realloc.c \
-	lib/progreloc.c lib/relocatable.c lib/relocatable.h \
+	lib/spawnattr_setflags.c lib/spawnattr_setpgroup.c \
+	lib/spawnattr_setsigmask.c lib/spawnp.c lib/printf-frexp.h \
+	lib/printf-frexp.c lib/printf-frexpl.h lib/printf.c \
+	lib/quote.h lib/quote.h lib/quotearg.h lib/raise.c \
+	lib/rawmemchr.c lib/rawmemchr.valgrind lib/dirent-private.h \
+	lib/readdir.c lib/readline.c lib/readline.h lib/readlink.c \
+	lib/realloc.c lib/realloc.c lib/reallocarray.c lib/progreloc.c \
+	lib/relocatable.c lib/relocatable.h \
 	$(top_srcdir)/build-aux/config.libpath \
 	$(top_srcdir)/build-aux/reloc-ldflags \
 	$(top_srcdir)/build-aux/libtool-reloc lib/allocator.c \
 	lib/allocator.h lib/areadlink.c lib/areadlink.h lib/c-ctype.c \
 	lib/c-ctype.h lib/canonicalize-lgpl.c lib/careadlinkat.c \
-	lib/careadlinkat.h lib/lstat.c lib/malloca.c lib/malloca.h \
-	lib/progname.c lib/progname.h lib/progreloc.c lib/readlink.c \
+	lib/careadlinkat.h lib/free.c lib/malloc.c \
+	lib/malloc/scratch_buffer.h \
+	lib/malloc/scratch_buffer_dupfree.c \
+	lib/malloc/scratch_buffer_grow.c \
+	lib/malloc/scratch_buffer_grow_preserve.c \
+	lib/malloc/scratch_buffer_set_array_size.c lib/malloca.c \
+	lib/malloca.h lib/mempcpy.c lib/progname.c lib/progname.h \
+	lib/progreloc.c lib/rawmemchr.c lib/readlink.c lib/realloc.c \
 	lib/relocatable.c lib/relocatable.h lib/relocwrapper.c \
-	lib/setenv.c lib/stat.c $(top_srcdir)/build-aux/install-reloc \
+	lib/scratch_buffer.h lib/setenv.c lib/stat.c \
+	$(top_srcdir)/build-aux/install-reloc \
 	$(top_srcdir)/build-aux/relocatable.sh.in lib/rename.c \
-	lib/rmdir.c lib/same-inode.h lib/sched.in.h lib/sig-handler.h \
-	lib/sigaction.c lib/signal.in.h lib/float+.h lib/signbitd.c \
-	lib/signbitf.c lib/signbitl.c lib/sigprocmask.c \
-	lib/_Noreturn.h lib/arg-nonnull.h lib/c++defs.h \
-	lib/warn-on-use.h lib/snprintf.c lib/spawn.in.h lib/sprintf.c \
-	lib/stat-w32.c lib/stat-w32.h lib/stat.c lib/stat-time.h \
-	lib/stdbool.in.h lib/stddef.in.h lib/stdint.in.h \
-	lib/stdio.in.h lib/stdlib.in.h lib/stpcpy.c lib/strchrnul.c \
+	lib/dirent-private.h lib/rewinddir.c lib/rmdir.c \
+	lib/same-inode.h lib/save-cwd.h lib/sched.in.h \
+	lib/malloc/scratch_buffer.h lib/scratch_buffer.h \
+	lib/setlocale-lock.c lib/setlocale_null.h \
+	lib/windows-initguard.h lib/sig-handler.h lib/sigaction.c \
+	lib/signal.in.h lib/float+.h lib/signbitd.c lib/signbitf.c \
+	lib/signbitl.c lib/sigprocmask.c lib/_Noreturn.h \
+	lib/arg-nonnull.h lib/c++defs.h lib/warn-on-use.h \
+	lib/snprintf.c lib/spawn.in.h lib/os2-spawn.c lib/os2-spawn.h \
+	lib/sprintf.c lib/stat-w32.c lib/stat-w32.h lib/stat.c \
+	lib/stat-time.h lib/stdalign.in.h lib/stdbool.in.h \
+	lib/stddef.in.h lib/stdint.in.h lib/stdio.in.h lib/stdlib.in.h \
+	lib/stpcpy.c lib/stpncpy.c lib/strchrnul.c \
 	lib/strchrnul.valgrind lib/strdup.c lib/streq.h lib/strerror.c \
 	lib/strerror-override.c lib/strerror-override.h \
-	lib/strerror_r.c lib/string.in.h lib/strndup.c lib/strnlen.c \
-	lib/strverscmp.c lib/sys_resource.in.h lib/sys_stat.in.h \
+	lib/strerror_r.c lib/string.in.h lib/strings.in.h \
+	lib/strndup.c lib/strnlen.c lib/strtod.c lib/strverscmp.c \
+	lib/sys_ioctl.in.h lib/sys_resource.in.h lib/sys_stat.in.h \
 	lib/sys_time.in.h lib/sys_times.in.h lib/sys_types.in.h \
-	lib/sys_wait.in.h lib/time.in.h lib/timespec.h lib/timevar.h \
-	lib/unistd.in.h lib/unistd--.h lib/unistd-safer.h \
+	lib/sys_wait.in.h lib/termios.in.h lib/thread-optim.h \
+	lib/time.in.h lib/timespec.h lib/timevar.h lib/unistd.in.h \
+	lib/unistd--.h lib/unistd-safer.h lib/unistr.in.h \
 	lib/unitypes.in.h lib/localcharset.h lib/uniwidth.in.h \
 	lib/uniwidth/cjk.h lib/unlink.c lib/unlocked-io.h \
 	lib/unsetenv.c $(top_srcdir)/build-aux/update-copyright \
@@ -2699,10 +3206,11 @@
 	lib/windows-mutex.h lib/windows-once.c lib/windows-once.h \
 	lib/windows-initguard.h lib/windows-recmutex.c \
 	lib/windows-recmutex.h lib/windows-initguard.h \
-	lib/windows-rwlock.c lib/windows-rwlock.h lib/windows-tls.c \
-	lib/windows-tls.h lib/xalloc.h lib/xalloc-oversized.h \
-	lib/concat-filename.h lib/xmemdup0.c lib/xmemdup0.h \
-	lib/xreadlink.h tests/linear $(TESTSUITE_AT) tests/testsuite \
+	lib/windows-rwlock.c lib/windows-rwlock.h lib/windows-spawn.c \
+	lib/windows-spawn.h lib/windows-tls.c lib/windows-tls.h \
+	lib/xalloc.h lib/xalloc.h lib/xalloc-oversized.h \
+	lib/concat-filename.h lib/xreadlink.h src/i18n-strings.c \
+	tests/README.md tests/linear $(TESTSUITE_AT) tests/testsuite \
 	tests/testsuite.h
 dist_doc_DATA = AUTHORS COPYING NEWS README THANKS TODO
 
@@ -2714,7 +3222,7 @@
 dependencies = $(BISON_IN) $(src_bison_SOURCES) $(dist_skeletons_DATA)
 BISON = $(top_builddir)/tests/bison
 BISON_IN = $(top_srcdir)/tests/bison.in
-AM_YFLAGS_WITH_LINES = --defines -Werror -Wall --report=all
+AM_YFLAGS_WITH_LINES = --defines -Werror -Wall,dangling-alias --report=all
 AM_YFLAGS = $(AM_YFLAGS_WITH_LINES) --no-lines
 
 # Initialization before completion by local.mk's.
@@ -2732,67 +3240,96 @@
 # a developer might naively reference .version in a test case while the bison
 # executable still compiles with VERSION, and so the test case might fail or
 # pass incorrectly.
-BUILT_SOURCES = $(mfcalc_sources) $(am__append_5) $(rpcalc_sources) \
-	$(simple_sources) $(ALLOCA_H) lib/configmake.h $(ERRNO_H) \
-	lib/fcntl.h $(FLOAT_H) $(GETOPT_H) $(GETOPT_CDEFS_H) \
-	lib/inttypes.h $(TEXTSTYLE_H) $(LIMITS_H) lib/math.h \
-	lib/sched.h lib/signal.h lib/spawn.h $(STDBOOL_H) $(STDDEF_H) \
-	$(STDINT_H) lib/stdio.h lib/stdlib.h lib/string.h \
-	lib/sys/resource.h $(am__append_22) lib/sys/time.h \
-	lib/sys/times.h lib/sys/types.h lib/sys/wait.h lib/time.h \
-	lib/unistd.h $(LIBUNISTRING_UNITYPES_H) \
-	$(LIBUNISTRING_UNIWIDTH_H) lib/wchar.h lib/wctype.h \
-	src/parse-gram.c src/parse-gram.h src/scan-code.c \
-	src/scan-gram.c src/scan-skel.c $(top_srcdir)/.version
+BUILT_SOURCES = $(mfcalc_sources) $(am__append_8) $(rpcalc_sources) \
+	$(simple_sources) $(ALLOCA_H) lib/configmake.h \
+	$(am__append_24) $(ERRNO_H) lib/fcntl.h $(FLOAT_H) $(GETOPT_H) \
+	$(GETOPT_CDEFS_H) $(ICONV_H) lib/iconv_open-aix.h \
+	lib/iconv_open-hpux.h lib/iconv_open-irix.h \
+	lib/iconv_open-osf.h lib/iconv_open-solaris.h \
+	lib/iconv_open-zos.h lib/inttypes.h $(TEXTSTYLE_H) $(LIMITS_H) \
+	$(am__append_29) lib/math.h lib/sched.h \
+	lib/malloc/scratch_buffer.gl.h lib/signal.h lib/spawn.h \
+	$(STDALIGN_H) $(STDBOOL_H) $(STDDEF_H) $(STDINT_H) lib/stdio.h \
+	lib/stdlib.h lib/string.h $(am__append_36) lib/sys/ioctl.h \
+	lib/sys/resource.h lib/sys/stat.h lib/sys/time.h \
+	lib/sys/times.h lib/sys/types.h lib/sys/wait.h lib/termios.h \
+	lib/time.h lib/unistd.h $(LIBUNISTRING_UNISTR_H) \
+	$(LIBUNISTRING_UNITYPES_H) $(LIBUNISTRING_UNIWIDTH_H) \
+	lib/wchar.h lib/wctype.h src/parse-gram.c src/parse-gram.h \
+	src/scan-code.c src/scan-gram.c src/scan-skel.c \
+	$(top_srcdir)/.version
 CLEANDIRS = doc/bison.t2d doc/html examples/*.dSYM \
-	examples/c/calc/*.dSYM examples/c/lexcalc/*.dSYM \
-	examples/c/mfcalc/*.dSYM examples/c/reccalc/*.dSYM \
-	examples/c/rpcalc/*.dSYM examples/c++/calc++/*.dSYM \
+	examples/c/bistromathic/*.dSYM examples/c/calc/*.dSYM \
+	examples/c/glr/*.dSYM examples/c/lexcalc/*.dSYM \
+	examples/c/mfcalc/*.dSYM examples/c/pushcalc/*.dSYM \
+	examples/c/reccalc/*.dSYM examples/c/rpcalc/*.dSYM \
+	examples/c++/calc++/*.dSYM examples/c++/glr/*.dSYM \
 	examples/c++/*.dSYM src/*.dSYM
 CLEANFILES = doc/refcard.pdf $(FIGS_GV:.gv=.eps) $(FIGS_GV:.gv=.pdf) \
-	$(FIGS_GV:.gv=.svg) doc/Doxyfile examples/c/calc/calc.[ch] \
+	$(FIGS_GV:.gv=.svg) doc/Doxyfile \
+	examples/c/bistromathic/parse.[ch] \
+	examples/c/bistromathic/parse.output examples/c/calc/calc.[ch] \
 	examples/c/calc/calc.output examples/c/calc/scan.c \
+	examples/c/glr/c++-types.[ch] examples/c/glr/c++-types.output \
 	examples/c/lexcalc/parse.[ch] examples/c/lexcalc/scan.c \
 	examples/c/lexcalc/parse.output examples/c/mfcalc/mfcalc.[ch] \
-	examples/c/mfcalc/mfcalc.output examples/c/reccalc/parse.[ch] \
+	examples/c/mfcalc/mfcalc.output examples/c/pushcalc/calc.[ch] \
+	examples/c/pushcalc/calc.output examples/c/reccalc/parse.[ch] \
 	examples/c/reccalc/parse.output examples/c/reccalc/scan.[ch] \
 	examples/c/reccalc/*.stamp examples/c/rpcalc/rpcalc.[ch] \
 	examples/c/rpcalc/rpcalc.output $(calcxx_sources_generated) \
-	examples/c++/calc++/parser.dot \
+	examples/c++/calc++/parser.gv \
 	examples/c++/calc++/parser.output \
 	examples/c++/calc++/parser.stamp \
-	examples/c++/calc++/scanner.cc examples/c++/simple.[ch] \
-	examples/c++/simple.output examples/c++/simple.output \
-	examples/c++/variant.output examples/c++/variant-11.output \
-	examples/c++/simple.hh examples/c++/variant.hh \
-	examples/c++/variant-11.hh examples/d/calc \
-	examples/d/calc.[do] examples/java/*.class \
-	examples/java/Calc.java lib/configmake.h lib/configmake.h-t
+	examples/c++/calc++/scanner.cc \
+	$(nodist_examples_c___glr_c___types_SOURCES) \
+	examples/c++/glr/c++-types.stamp \
+	examples/c++/glr/c++-types.output examples/c++/glr/location.hh \
+	examples/c++/simple.[ch] examples/c++/simple.output \
+	examples/c++/simple.output examples/c++/variant.output \
+	examples/c++/variant-11.output examples/c++/simple.hh \
+	examples/c++/variant.hh examples/c++/variant-11.hh \
+	examples/d/calc/calc examples/d/calc/calc.[do] \
+	examples/d/simple/calc examples/d/simple/calc.[do] \
+	examples/java/calc/*.class examples/java/calc/Calc.java \
+	examples/java/simple/*.class examples/java/simple/Calc.java \
+	lib/configmake.h lib/configmake.h-t
 DISTCLEANFILES = tests/atconfig $(check_SCRIPTS)
-MOSTLYCLEANDIRS = lib/sys $(am__append_24) lib/sys lib/sys
+MOSTLYCLEANDIRS = lib/sys lib/sys lib/sys lib/sys lib/sys
 MOSTLYCLEANFILES = $(top_srcdir)/doc/*.tmp lib/core lib/*.stackdump \
-	lib/alloca.h lib/alloca.h-t lib/errno.h lib/errno.h-t \
-	lib/fcntl.h lib/fcntl.h-t lib/float.h lib/float.h-t \
-	lib/getopt.h lib/getopt.h-t lib/getopt-cdefs.h \
-	lib/getopt-cdefs.h-t lib/inttypes.h lib/inttypes.h-t \
-	lib/textstyle.h lib/textstyle.h-t lib/limits.h lib/limits.h-t \
-	lib/math.h lib/math.h-t lib/sched.h lib/sched.h-t lib/signal.h \
-	lib/signal.h-t lib/spawn.h lib/spawn.h-t lib/stdbool.h \
-	lib/stdbool.h-t lib/stddef.h lib/stddef.h-t lib/stdint.h \
-	lib/stdint.h-t lib/stdio.h lib/stdio.h-t lib/stdlib.h \
-	lib/stdlib.h-t lib/string.h lib/string.h-t lib/sys/resource.h \
-	lib/sys/resource.h-t $(am__append_23) lib/sys/time.h \
-	lib/sys/time.h-t lib/sys/times.h lib/sys/times.h-t \
-	lib/sys/types.h lib/sys/types.h-t lib/sys/wait.h \
-	lib/sys/wait.h-t lib/time.h lib/time.h-t lib/unistd.h \
-	lib/unistd.h-t lib/unitypes.h lib/unitypes.h-t lib/uniwidth.h \
+	lib/alloca.h lib/alloca.h-t $(am__append_25) lib/errno.h \
+	lib/errno.h-t lib/fcntl.h lib/fcntl.h-t lib/float.h \
+	lib/float.h-t lib/getopt.h lib/getopt.h-t lib/getopt-cdefs.h \
+	lib/getopt-cdefs.h-t lib/iconv.h lib/iconv.h-t \
+	lib/iconv_open-aix.h-t lib/iconv_open-hpux.h-t \
+	lib/iconv_open-irix.h-t lib/iconv_open-osf.h-t \
+	lib/iconv_open-solaris.h-t lib/iconv_open-zos.h-t \
+	lib/inttypes.h lib/inttypes.h-t lib/textstyle.h \
+	lib/textstyle.h-t lib/limits.h lib/limits.h-t $(am__append_30) \
+	lib/math.h lib/math.h-t lib/sched.h lib/sched.h-t \
+	lib/malloc/scratch_buffer.gl.h \
+	lib/malloc/scratch_buffer.gl.h-t lib/signal.h lib/signal.h-t \
+	lib/spawn.h lib/spawn.h-t lib/stdalign.h lib/stdalign.h-t \
+	lib/stdbool.h lib/stdbool.h-t lib/stddef.h lib/stddef.h-t \
+	lib/stdint.h lib/stdint.h-t lib/stdio.h lib/stdio.h-t \
+	lib/stdlib.h lib/stdlib.h-t lib/string.h lib/string.h-t \
+	$(am__append_37) lib/sys/ioctl.h lib/sys/ioctl.h-t \
+	lib/sys/resource.h lib/sys/resource.h-t lib/sys/stat.h \
+	lib/sys/stat.h-t lib/sys/time.h lib/sys/time.h-t \
+	lib/sys/times.h lib/sys/times.h-t lib/sys/types.h \
+	lib/sys/types.h-t lib/sys/wait.h lib/sys/wait.h-t \
+	lib/termios.h lib/termios.h-t lib/time.h lib/time.h-t \
+	lib/unistd.h lib/unistd.h-t lib/unistr.h lib/unistr.h-t \
+	lib/unitypes.h lib/unitypes.h-t lib/uniwidth.h \
 	lib/uniwidth.h-t lib/wchar.h lib/wchar.h-t lib/wctype.h \
 	lib/wctype.h-t src/yacc
 SUFFIXES = .gv .eps .pdf .svg .yy .stamp
-TESTS = $(dist_TESTS) examples/c/calc/calc.test $(am__append_3) \
-	$(am__append_7) $(am__append_9) $(am__append_11) \
-	$(am__append_13) $(am__append_15) $(am__append_17)
-check_SCRIPTS = $(am__append_14) $(am__append_16) $(BISON) \
+TESTS = $(dist_TESTS) $(am__append_3) examples/c/calc/calc.test \
+	examples/c/glr/c++-types.test $(am__append_5) \
+	examples/c/pushcalc/calc.test $(am__append_7) $(am__append_10) \
+	$(am__append_12) $(am__append_14) $(am__append_16) \
+	$(am__append_18) $(am__append_20) $(am__append_22)
+check_SCRIPTS = $(am__append_19) $(am__append_21) $(BISON) \
 	tests/atconfig tests/atlocal
 dist_TESTS = examples/c/mfcalc/mfcalc.test \
 	examples/c/rpcalc/rpcalc.test
@@ -2809,12 +3346,13 @@
 	data/skeletons/c++-skel.m4 data/skeletons/c++.m4 \
 	data/skeletons/c-like.m4 data/skeletons/c-skel.m4 \
 	data/skeletons/c.m4 data/skeletons/glr.c data/skeletons/glr.cc \
-	data/skeletons/java-skel.m4 data/skeletons/java.m4 \
-	data/skeletons/lalr1.cc data/skeletons/lalr1.java \
-	data/skeletons/location.cc data/skeletons/stack.hh \
+	data/skeletons/glr2.cc data/skeletons/java-skel.m4 \
+	data/skeletons/java.m4 data/skeletons/lalr1.cc \
+	data/skeletons/lalr1.java data/skeletons/location.cc \
+	data/skeletons/stack.hh data/skeletons/traceon.m4 \
 	data/skeletons/variant.hh data/skeletons/yacc.c \
-	data/skeletons/README-D.txt data/skeletons/d-skel.m4 \
-	data/skeletons/d.m4 data/skeletons/lalr1.d
+	data/skeletons/d-skel.m4 data/skeletons/d.m4 \
+	data/skeletons/lalr1.d
 m4sugardir = $(pkgdatadir)/m4sugar
 dist_m4sugar_DATA = \
   data/m4sugar/foreach.m4                       \
@@ -2850,10 +3388,12 @@
 MAINTAINERCLEANFILES = $(CROSS_OPTIONS_TEXI) \
 	$(srcdir)/$(doc_bison).info.bak $(am__append_1) \
 	$(dist_man_MANS) $(extracted) examples/extracted.stamp \
-	$(TESTSUITE)
+	lib/iconv_open-aix.h lib/iconv_open-hpux.h \
+	lib/iconv_open-irix.h lib/iconv_open-osf.h \
+	lib/iconv_open-solaris.h lib/iconv_open-zos.h $(TESTSUITE)
 dist_man_MANS = $(top_srcdir)/doc/bison.1
 
-# Differences to ignore when comparing the man page (the date).
+# Differences to ignore when comparing man pages (the date).
 remove_time_stamp = \
   sed 's/^\(\.TH[^"]*"[^"]*"[^"]*\)"[^"]*"/\1/'
 
@@ -2872,9 +3412,13 @@
 	   -e 's,@top_builddir\@,$(top_builddir),g' \
 	   -e 's,@top_srcdir\@,$(top_srcdir),g'
 
+dist_noinst_DATA = etc/README.md
 nodist_noinst_SCRIPTS = etc/bench.pl
 dist_noinst_SCRIPTS = examples/extexi examples/test
 TEST_LOG_COMPILER = $(SHELL) $(top_srcdir)/examples/test
+TEST_CFLAGS = \
+  $(WARN_CFLAGS) $(WARN_CFLAGS_TEST) $(WERROR_CFLAGS)
+
 AM_CXXFLAGS = \
   $(WARN_CXXFLAGS) $(WARN_CXXFLAGS_TEST) $(WERROR_CXXFLAGS)
 
@@ -2888,12 +3432,30 @@
 dist_examples_DATA = examples/README.md
 cdir = $(docdir)/examples/c
 dist_c_DATA = examples/c/README.md
+bistromathicdir = $(docdir)/examples/c/bistromathic
+@ENABLE_BISTROMATHIC_TRUE@nodist_examples_c_bistromathic_bistromathic_SOURCES = examples/c/bistromathic/parse.y
+@ENABLE_BISTROMATHIC_TRUE@examples_c_bistromathic_bistromathic_CPPFLAGS = \
+@ENABLE_BISTROMATHIC_TRUE@    -DBISON_LOCALEDIR='"$(localdir)"'		\
+@ENABLE_BISTROMATHIC_TRUE@    -DLOCALEDIR='"$(localdir)"'			\
+@ENABLE_BISTROMATHIC_TRUE@    -I$(top_srcdir)/examples/c/bistromathic -I$(top_builddir)/examples/c/bistromathic
+
+@ENABLE_BISTROMATHIC_TRUE@examples_c_bistromathic_bistromathic_CFLAGS = $(TEST_CFLAGS)
+@ENABLE_BISTROMATHIC_TRUE@examples_c_bistromathic_bistromathic_LDADD = -lm $(LIBREADLINE) $(LIBINTL)
+dist_bistromathic_DATA = examples/c/bistromathic/parse.y examples/c/bistromathic/Makefile examples/c/bistromathic/README.md
 calcdir = $(docdir)/examples/c/calc
 nodist_examples_c_calc_calc_SOURCES = examples/c/calc/calc.y
 
 # Don't use gnulib's system headers.
 examples_c_calc_calc_CPPFLAGS = -I$(top_srcdir)/examples/c/calc -I$(top_builddir)/examples/c/calc
+examples_c_calc_calc_CFLAGS = $(TEST_CFLAGS)
 dist_calc_DATA = examples/c/calc/calc.y examples/c/calc/Makefile examples/c/calc/README.md
+glrdir = $(docdir)/examples/c/glr
+nodist_examples_c_glr_c___types_SOURCES = examples/c/glr/c++-types.y
+
+# Don't use gnulib's system headers.
+examples_c_glr_c___types_CPPFLAGS = -I$(top_srcdir)/examples/c/glr -I$(top_builddir)/examples/c/glr
+examples_c_glr_c___types_CFLAGS = $(TEST_CFLAGS)
+dist_glr_DATA = examples/c/glr/c++-types.y examples/c/glr/Makefile examples/c/glr/README.md
 lexcalcdir = $(docdir)/examples/c/lexcalc
 @FLEX_WORKS_TRUE@nodist_examples_c_lexcalc_lexcalc_SOURCES = examples/c/lexcalc/parse.y examples/c/lexcalc/parse.h examples/c/lexcalc/scan.l
 @FLEX_WORKS_TRUE@examples_c_lexcalc_lexcalc_CPPFLAGS = -I$(top_srcdir)/examples/c/lexcalc -I$(top_builddir)/examples/c/lexcalc
@@ -2903,10 +3465,18 @@
 nodist_examples_c_mfcalc_mfcalc_SOURCES = $(mfcalc_sources)
 # Don't use gnulib's system headers.
 examples_c_mfcalc_mfcalc_CPPFLAGS = -I$(top_srcdir)/examples/c/mfcalc -I$(top_builddir)/examples/c/mfcalc
+examples_c_mfcalc_mfcalc_CFLAGS = $(TEST_CFLAGS)
 examples_c_mfcalc_mfcalc_LDADD = -lm
 mfcalcdir = $(docdir)/examples/c/mfcalc
 mfcalc_DATA = $(mfcalc_extracted)
 dist_mfcalc_DATA = examples/c/mfcalc/Makefile
+pushcalcdir = $(docdir)/examples/c/pushcalc
+nodist_examples_c_pushcalc_calc_SOURCES = examples/c/pushcalc/calc.y
+
+# Don't use gnulib's system headers.
+examples_c_pushcalc_calc_CPPFLAGS = -I$(top_srcdir)/examples/c/pushcalc -I$(top_builddir)/examples/c/pushcalc
+examples_c_pushcalc_calc_CFLAGS = $(TEST_CFLAGS)
+dist_pushcalc_DATA = examples/c/pushcalc/calc.y examples/c/pushcalc/Makefile examples/c/pushcalc/README.md
 reccalcdir = $(docdir)/examples/c/reccalc
 @FLEX_WORKS_TRUE@nodist_examples_c_reccalc_reccalc_SOURCES = examples/c/reccalc/parse.y examples/c/reccalc/scan.h examples/c/reccalc/scan.c
 @FLEX_WORKS_TRUE@examples_c_reccalc_reccalc_CPPFLAGS = -I$(top_srcdir)/examples/c/reccalc -I$(top_builddir)/examples/c/reccalc
@@ -2922,6 +3492,7 @@
 nodist_examples_c_rpcalc_rpcalc_SOURCES = $(rpcalc_sources)
 # Don't use gnulib's system headers.
 examples_c_rpcalc_rpcalc_CPPFLAGS = -I$(top_builddir)/examples/c/rpcalc
+examples_c_rpcalc_rpcalc_CFLAGS = $(TEST_CFLAGS)
 examples_c_rpcalc_rpcalc_LDADD = -lm
 rpcalcdir = $(docdir)/examples/c/rpcalc
 rpcalc_DATA = $(rpcalc_extracted)
@@ -2952,12 +3523,22 @@
 calcxxdir = $(docdir)/examples/c++/calc++
 calcxx_DATA = $(calcxx_extracted)
 dist_calcxx_DATA = examples/c++/calc++/README.md examples/c++/calc++/Makefile
+glrxxdir = $(docdir)/examples/c++/glr
+@ENABLE_CXX14_TRUE@dist_examples_c___glr_c___types_SOURCES = \
+@ENABLE_CXX14_TRUE@    examples/c++/glr/ast.hh
+
+@ENABLE_CXX14_TRUE@nodist_examples_c___glr_c___types_SOURCES = \
+@ENABLE_CXX14_TRUE@    examples/c++/glr/c++-types.cc				\
+@ENABLE_CXX14_TRUE@    examples/c++/glr/c++-types.hh
+
+@ENABLE_CXX14_TRUE@examples_c___glr_c___types_CPPFLAGS = -I$(top_srcdir)/examples/c++/glr -I$(top_builddir)/examples/c++/glr
+@ENABLE_CXX14_TRUE@examples_c___glr_c___types_CXXFLAGS = $(CXX14_CXXFLAGS) $(WARN_CXXFLAGS_TEST)
 cxx_DATA = $(simple_extracted)
 simple_extracted = examples/c++/simple.yy
 simple_sources = $(simple_extracted)
-@ENABLE_CXX14_TRUE@nodist_examples_c___simple_SOURCES = $(simple_sources)
-@ENABLE_CXX14_TRUE@examples_c___simple_CXXFLAGS = $(CXX11_CXXFLAGS) $(WARN_CXXFLAGS_TEST)
-@ENABLE_CXX14_TRUE@examples_c___simple_CPPFLAGS = -I$(top_builddir)
+@ENABLE_CXX11_TRUE@nodist_examples_c___simple_SOURCES = $(simple_sources)
+@ENABLE_CXX11_TRUE@examples_c___simple_CXXFLAGS = $(CXX11_CXXFLAGS) $(WARN_CXXFLAGS_TEST)
+@ENABLE_CXX11_TRUE@examples_c___simple_CPPFLAGS = -I$(top_builddir)
 @ENABLE_CXX_TRUE@nodist_examples_c___variant_SOURCES = examples/c++/variant.yy
 @ENABLE_CXX_TRUE@examples_c___variant_CPPFLAGS = -I$(top_builddir)
 @ENABLE_CXX11_TRUE@nodist_examples_c___variant_11_SOURCES = examples/c++/variant-11.yy
@@ -2965,82 +3546,129 @@
 @ENABLE_CXX11_TRUE@examples_c___variant_11_CPPFLAGS = -I$(top_builddir)
 dist_cxx_DATA = examples/c++/README.md examples/c++/Makefile examples/c++/variant.yy examples/c++/variant-11.yy
 ddir = $(docdir)/examples/d
-dist_d_DATA = examples/d/calc.y examples/d/Makefile examples/d/README.md
+dist_d_DATA = examples/d/README.md
+calcddir = $(docdir)/examples/d/calc
+dist_calcd_DATA = examples/d/calc/calc.y examples/d/calc/Makefile
+simpleddir = $(docdir)/examples/d/simple
+dist_simpled_DATA = examples/d/simple/calc.y examples/d/simple/Makefile
 javadir = $(docdir)/examples/java
-dist_java_DATA = examples/java/Calc.y examples/java/Makefile examples/java/README.md
+dist_java_DATA = examples/java/README.md
+java_calcdir = $(docdir)/examples/java/calc
+dist_java_calc_DATA = examples/java/calc/Calc.y examples/java/calc/Makefile
+java_simpledir = $(docdir)/examples/java/simple
+dist_java_simple_DATA = examples/java/simple/Calc.y examples/java/simple/Makefile
 
 # Non-gnulib sources in Bison's internal library.
 lib_libbison_a_SOURCES = lib/allocator.c lib/areadlink.c \
 	lib/argmatch.c lib/gl_array_list.h lib/gl_array_list.c \
-	lib/binary-io.h lib/binary-io.c lib/bitrotate.h \
-	lib/bitrotate.c lib/bitset.c lib/bitset/array.c \
-	lib/bitset/stats.c lib/bitset/table.c lib/bitset/list.c \
-	lib/bitset/vector.c lib/bitsetv.c lib/c-ctype.h lib/c-ctype.c \
-	lib/c-strcase.h lib/c-strcasecmp.c lib/c-strncasecmp.c \
-	lib/careadlinkat.c lib/cloexec.c lib/close-stream.c \
-	lib/closeout.c lib/concat-filename.c lib/diffseq.h \
-	lib/dirname.c lib/basename.c lib/dirname-lgpl.c \
-	lib/basename-lgpl.c lib/stripslash.c lib/exitfail.c \
-	lib/fatal-signal.h lib/fatal-signal.c $(am__append_18) \
-	lib/fd-safer-flag.c lib/dup-safer-flag.c lib/fopen-safer.c \
+	$(am__append_23) lib/basename-lgpl.c lib/binary-io.h \
+	lib/binary-io.c lib/bitrotate.h lib/bitrotate.c lib/bitset.c \
+	lib/bitset/array.c lib/bitset/stats.c lib/bitset/table.c \
+	lib/bitset/list.c lib/bitset/vector.c lib/bitsetv.c \
+	lib/c-ctype.h lib/c-ctype.c lib/c-strcase.h lib/c-strcasecmp.c \
+	lib/c-strncasecmp.c lib/canonicalize.c lib/careadlinkat.c \
+	lib/cloexec.c lib/close-stream.c lib/closeout.c \
+	lib/concat-filename.c lib/diffseq.h lib/dirname.c \
+	lib/basename.c lib/dirname-lgpl.c lib/stripslash.c \
+	lib/execute.h lib/execute.c lib/exitfail.c lib/fatal-signal.h \
+	lib/fatal-signal.c $(am__append_26) lib/fd-safer-flag.c \
+	lib/dup-safer-flag.c lib/file-set.c $(am__append_27) \
+	lib/findprog.h lib/findprog-in.c lib/fopen-safer.c \
 	lib/fstrcmp.h lib/fstrcmp.c lib/gethrxtime.c lib/xtime.c \
 	lib/getprogname.h lib/getprogname.c lib/gettext.h \
-	lib/gettime.c $(am__append_19) lib/hash.c lib/gl_list.h \
-	lib/gl_list.c lib/localcharset.c lib/glthread/lock.h \
-	lib/glthread/lock.c $(am__append_20) lib/math.c lib/mbchar.c \
-	lib/mbfile.h lib/mbfile.c lib/mbswidth.h lib/mbswidth.c \
-	lib/minmax.h lib/pipe2.c lib/pipe2-safer.c lib/printf-frexp.c \
-	lib/printf-frexpl.c lib/progname.h lib/progname.c \
-	lib/quotearg.c lib/sig-handler.c lib/size_max.h \
-	lib/spawn-pipe.h lib/spawn-pipe.c lib/w32spawn.h \
-	$(am__append_21) lib/glthread/threadlib.c lib/timespec.c \
-	lib/timevar.c lib/timevar.def lib/glthread/tls.h \
-	lib/glthread/tls.c lib/unistd.c lib/dup-safer.c lib/fd-safer.c \
-	lib/pipe-safer.c $(am__append_25) lib/wait-process.h \
-	lib/wait-process.c lib/wctype-h.c lib/xmalloc.c \
-	lib/xalloc-die.c lib/xconcat-filename.c lib/xhash.c \
-	lib/gl_xlist.h lib/gl_xlist.c lib/xreadlink.c lib/xsize.h \
-	lib/xsize.c lib/xstrndup.h lib/xstrndup.c lib/get-errno.h \
-	lib/get-errno.c lib/path-join.h lib/path-join.c
+	lib/gettime.c $(am__append_28) lib/hash.c lib/gl_hash_map.h \
+	lib/gl_hash_map.c lib/gl_anyhash1.h lib/gl_anyhash2.h \
+	lib/gl_anyhash_primes.h lib/hash-pjw.h lib/hash-pjw.c \
+	lib/hash-triple-simple.c lib/ialloc.c lib/idx.h \
+	lib/integer_length.c lib/integer_length_l.c \
+	lib/gl_linked_list.h lib/gl_linked_list.c \
+	lib/gl_anylinked_list1.h lib/gl_anylinked_list2.h \
+	lib/gl_list.h lib/gl_list.c lib/localcharset.c \
+	lib/glthread/lock.h lib/glthread/lock.c $(am__append_31) \
+	lib/gl_map.h lib/gl_map.c lib/math.c lib/mbchar.c lib/mbfile.h \
+	lib/mbfile.c lib/mbswidth.h lib/mbswidth.c lib/minmax.h \
+	$(am__append_32) lib/gl_oset.h lib/gl_oset.c lib/pipe2.c \
+	lib/pipe2-safer.c lib/printf-frexp.c lib/printf-frexpl.c \
+	lib/progname.h lib/progname.c lib/quotearg.c \
+	lib/gl_rbtree_oset.h lib/gl_rbtree_oset.c \
+	lib/gl_rbtree_ordered.h lib/gl_anytree_oset.h \
+	lib/gl_rbtreehash_list.h lib/gl_rbtreehash_list.c \
+	lib/gl_anyhash1.h lib/gl_anyhash2.h lib/gl_anyhash_primes.h \
+	lib/gl_anyrbtree_list1.h lib/gl_anyrbtree_list2.h \
+	lib/gl_anytree_list1.h lib/gl_anytree_list2.h \
+	lib/gl_anytreehash_list1.h lib/gl_anytreehash_list2.h \
+	$(am__append_33) lib/malloc/scratch_buffer_dupfree.c \
+	lib/malloc/scratch_buffer_grow.c \
+	lib/malloc/scratch_buffer_grow_preserve.c \
+	lib/malloc/scratch_buffer_set_array_size.c $(am__append_34) \
+	lib/sig-handler.c lib/size_max.h lib/spawn-pipe.h \
+	lib/spawn-pipe.c $(am__append_35) lib/glthread/threadlib.c \
+	lib/timespec.c lib/timevar.c lib/timevar.def \
+	lib/glthread/tls.h lib/glthread/tls.c lib/unicodeio.h \
+	lib/unicodeio.c lib/unistd.c lib/dup-safer.c lib/fd-safer.c \
+	lib/pipe-safer.c $(am__append_38) $(am__append_39) \
+	$(am__append_40) lib/wait-process.h lib/wait-process.c \
+	lib/wctype-h.c lib/xmalloc.c lib/xalloc-die.c \
+	lib/xconcat-filename.c lib/xhash.c lib/gl_xlist.h \
+	lib/gl_xlist.c lib/gl_xmap.h lib/gl_xmap.c lib/xmemdup0.h \
+	lib/xmemdup0.c lib/xreadlink.c lib/xsize.h lib/xsize.c \
+	lib/xstrndup.h lib/xstrndup.c lib/get-errno.h lib/get-errno.c \
+	lib/path-join.h lib/path-join.c
 lib_libbison_a_LIBADD = $(gl_LIBOBJS)
 lib_libbison_a_DEPENDENCIES = $(gl_LIBOBJS)
-EXTRA_lib_libbison_a_SOURCES = lib/calloc.c lib/canonicalize-lgpl.c \
-	lib/close.c lib/stripslash.c lib/dup2.c lib/error.c \
-	lib/fcntl.c lib/float.c lib/itold.c lib/fopen.c lib/fpending.c \
-	lib/fprintf.c lib/frexp.c lib/frexp.c lib/frexpl.c \
-	lib/fseterr.c lib/fstat.c lib/stat-w32.c lib/fsync.c \
-	lib/getdtablesize.c lib/getopt.c lib/getopt1.c lib/getrusage.c \
-	lib/gettimeofday.c lib/isnan.c lib/isnand.c lib/isnan.c \
-	lib/isnand.c lib/isnan.c lib/isnanf.c lib/isnan.c lib/isnanf.c \
-	lib/isnan.c lib/isnanl.c lib/isnan.c lib/isnanl.c \
-	lib/iswblank.c lib/ldexpl.c lib/localtime-buffer.c lib/lstat.c \
-	lib/malloc.c lib/malloc.c lib/mbrtowc.c lib/mbsinit.c \
-	lib/memchr.c lib/msvc-inval.c lib/msvc-nothrow.c lib/obstack.c \
-	lib/obstack_printf.c lib/open.c lib/perror.c lib/spawni.c \
-	lib/spawn_faction_addclose.c lib/spawn_faction_adddup2.c \
-	lib/spawn_faction_addopen.c lib/spawn_faction_destroy.c \
-	lib/spawn_faction_init.c lib/spawnattr_destroy.c \
-	lib/spawnattr_init.c lib/spawnattr_setflags.c \
+EXTRA_lib_libbison_a_SOURCES = lib/access.c lib/calloc.c lib/calloc.c \
+	lib/canonicalize-lgpl.c lib/chdir-long.c lib/close.c \
+	lib/closedir.c lib/dirfd.c lib/stripslash.c lib/dup.c \
+	lib/dup2.c lib/error.c lib/fchdir.c lib/fcntl.c \
+	lib/fdopendir.c lib/ffs.c lib/ffsl.c lib/float.c lib/itold.c \
+	lib/fopen.c lib/fopen.c lib/fpending.c lib/fprintf.c \
+	lib/free.c lib/frexp.c lib/frexp.c lib/frexpl.c lib/fseterr.c \
+	lib/fstat.c lib/stat-w32.c lib/at-func.c lib/fstatat.c \
+	lib/fsync.c lib/getcwd.c lib/getcwd-lgpl.c lib/getdelim.c \
+	lib/getdtablesize.c lib/getline.c lib/getopt.c lib/getopt1.c \
+	lib/getrusage.c lib/gettimeofday.c lib/iconv.c \
+	lib/iconv_close.c lib/iconv_open.c lib/isnan.c lib/isnand.c \
+	lib/isnan.c lib/isnand.c lib/isnan.c lib/isnanf.c lib/isnan.c \
+	lib/isnanf.c lib/isnan.c lib/isnanl.c lib/isnan.c lib/isnanl.c \
+	lib/iswblank.c lib/iswdigit.c lib/iswxdigit.c lib/ldexpl.c \
+	lib/lstat.c lib/malloc.c lib/malloc.c \
+	lib/lc-charset-dispatch.c lib/mbrtowc.c lib/mbtowc-lock.c \
+	lib/mbsinit.c lib/memchr.c lib/mempcpy.c lib/memrchr.c \
+	lib/msvc-inval.c lib/msvc-nothrow.c lib/obstack.c \
+	lib/obstack_printf.c lib/open.c lib/openat.c lib/opendir.c \
+	lib/perror.c lib/pipe.c lib/spawn.c lib/spawni.c \
+	lib/spawn_faction_addchdir.c lib/spawn_faction_addclose.c \
+	lib/spawn_faction_adddup2.c lib/spawn_faction_addopen.c \
+	lib/spawn_faction_destroy.c lib/spawn_faction_init.c \
+	lib/spawnattr_destroy.c lib/spawnattr_init.c \
+	lib/spawnattr_setflags.c lib/spawnattr_setpgroup.c \
 	lib/spawnattr_setsigmask.c lib/spawnp.c lib/printf-frexp.c \
-	lib/printf.c lib/raise.c lib/rawmemchr.c lib/readlink.c \
-	lib/realloc.c lib/progreloc.c lib/relocatable.c lib/rename.c \
-	lib/rmdir.c lib/sigaction.c lib/signbitd.c lib/signbitf.c \
-	lib/signbitl.c lib/sigprocmask.c lib/snprintf.c lib/sprintf.c \
-	lib/stat-w32.c lib/stat.c lib/stpcpy.c lib/strchrnul.c \
-	lib/strdup.c lib/strerror.c lib/strerror-override.c \
-	lib/strerror_r.c lib/strndup.c lib/strnlen.c lib/strverscmp.c \
-	lib/unlink.c lib/unsetenv.c lib/asnprintf.c lib/printf-args.c \
+	lib/printf.c lib/raise.c lib/rawmemchr.c lib/readdir.c \
+	lib/readline.c lib/readlink.c lib/realloc.c lib/realloc.c \
+	lib/reallocarray.c lib/progreloc.c lib/relocatable.c \
+	lib/rename.c lib/rewinddir.c lib/rmdir.c lib/setlocale-lock.c \
+	lib/sigaction.c lib/signbitd.c lib/signbitf.c lib/signbitl.c \
+	lib/sigprocmask.c lib/snprintf.c lib/os2-spawn.c lib/sprintf.c \
+	lib/stat-w32.c lib/stat.c lib/stpcpy.c lib/stpncpy.c \
+	lib/strchrnul.c lib/strdup.c lib/strerror.c \
+	lib/strerror-override.c lib/strerror_r.c lib/strndup.c \
+	lib/strnlen.c lib/strtod.c lib/strverscmp.c lib/unlink.c \
+	lib/unsetenv.c lib/asnprintf.c lib/printf-args.c \
 	lib/printf-parse.c lib/vasnprintf.c lib/asprintf.c \
 	lib/vasprintf.c lib/vfprintf.c lib/vsnprintf.c lib/vsprintf.c \
 	lib/waitpid.c lib/wcwidth.c lib/windows-mutex.c \
 	lib/windows-once.c lib/windows-recmutex.c lib/windows-rwlock.c \
-	lib/windows-tls.c lib/xmemdup0.c
+	lib/windows-spawn.c lib/windows-tls.c
 lib_libbison_a_CPPFLAGS = $(AM_CPPFLAGS) -DDEFAULT_TEXT_DOMAIN=\"bison-gnulib\"
 
 # Use this preprocessor expression to decide whether #include_next works.
 # Do not rely on a 'configure'-time test for this, since the expression
 # might appear in an installed header, which is used by some other compiler.
-HAVE_INCLUDE_NEXT = (__GNUC__ || 60000000 <= __DECC_VER)
+HAVE_INCLUDE_NEXT = (__GNUC__ || __clang__ || 60000000 <= __DECC_VER)
+GPERF = gperf
+V_GPERF = $(V_GPERF_@AM_V@)
+V_GPERF_ = $(V_GPERF_@AM_DEFAULT_V@)
+V_GPERF_0 = @echo "  GPERF   " $@;
 
 # Because this Makefile snippet defines a variable used by other
 # gnulib Makefile snippets, it must be present in all makefiles that
@@ -3086,6 +3714,10 @@
   src/complain.h                                \
   src/conflicts.c                               \
   src/conflicts.h                               \
+  src/counterexample.c                          \
+  src/counterexample.h                          \
+  src/derivation.c                              \
+  src/derivation.h                              \
   src/derives.c                                 \
   src/derives.h                                 \
   src/files.c                                   \
@@ -3095,6 +3727,8 @@
   src/flex-scanner.h                            \
   src/getargs.c                                 \
   src/getargs.h                                 \
+  src/glyphs.c                                  \
+  src/glyphs.h                                  \
   src/gram.c                                    \
   src/gram.h                                    \
   src/graphviz.c                                \
@@ -3107,6 +3741,8 @@
   src/location.h                                \
   src/lr0.c                                     \
   src/lr0.h                                     \
+  src/lssi.c                                    \
+  src/lssi.h                                    \
   src/main.c                                    \
   src/muscle-tab.c                              \
   src/muscle-tab.h                              \
@@ -3117,6 +3753,8 @@
   src/output.c                                  \
   src/output.h                                  \
   src/parse-gram.y                              \
+  src/parse-simulation.c                        \
+  src/parse-simulation.h                        \
   src/print-graph.c                             \
   src/print-graph.h                             \
   src/print-xml.c                               \
@@ -3137,6 +3775,10 @@
   src/scan-skel.h                               \
   src/state.c                                   \
   src/state.h                                   \
+  src/state-item.c                              \
+  src/state-item.h                              \
+  src/strversion.c                              \
+  src/strversion.h                              \
   src/symlist.c                                 \
   src/symlist.h                                 \
   src/symtab.c                                  \
@@ -3157,17 +3799,21 @@
 # definition of libbison, beware that they might expand as flags such as
 # `-lm`.  Keep them here.  Or use a Libtool convenience library.
 src_bison_LDADD = \
+  lib/libbison.a                                \
   $(ISNAND_LIBM)                                \
   $(ISNANF_LIBM)                                \
   $(ISNANL_LIBM)                                \
   $(LDEXPL_LIBM)                                \
   $(LDEXP_LIBM)                                 \
-  $(LIBINTL)                                    \
   $(LIBTHREAD)                                  \
   $(LIB_CLOCK_GETTIME)                          \
   $(LIB_GETHRXTIME)                             \
-  $(LIBTEXTSTYLE)                               \
-  lib/libbison.a
+  $(LIB_HARD_LOCALE)                            \
+  $(LIB_MBRTOWC)                                \
+  $(LIB_SETLOCALE_NULL)                         \
+  $(LIBICONV)                                   \
+  $(LIBINTL)                                    \
+  $(LIBTEXTSTYLE)
 
 @ENABLE_YACC_TRUE@nodist_bin_SCRIPTS = src/yacc
 EXTRA_SCRIPTS = src/yacc
@@ -3178,7 +3824,9 @@
   tests/c++.at                                  \
   tests/calc.at                                 \
   tests/conflicts.at                            \
+  tests/counterexample.at                       \
   tests/cxx-type.at                             \
+  tests/d.at                                    \
   tests/diagnostics.at                          \
   tests/existing.at                             \
   tests/glr-regression.at                       \
@@ -3187,6 +3835,7 @@
   tests/java.at                                 \
   tests/javapush.at                             \
   tests/local.at                                \
+  tests/m4.at                                   \
   tests/named-refs.at                           \
   tests/output.at                               \
   tests/package.m4                              \
@@ -3212,14 +3861,15 @@
   $(VALGRIND_OPTS_SUPPRESSION)
 
 gen_start_date = 2012-01-16
+CODESPELL = codespell
 all: $(BUILT_SOURCES)
 	$(MAKE) $(AM_MAKEFLAGS) all-recursive
 
 .SUFFIXES:
-.SUFFIXES: .gv .eps .pdf .svg .yy .stamp .c .cc .dvi .l .ll .log .o .obj .ps .test .test$(EXEEXT) .trs .y
+.SUFFIXES: .gv .eps .pdf .svg .yy .stamp .c .cc .dvi .i .l .ll .log .o .obj .ps .test .test$(EXEEXT) .trs .y
 am--refresh: Makefile
 	@:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/build-aux/local.mk $(srcdir)/data/local.mk $(srcdir)/doc/local.mk $(srcdir)/etc/local.mk $(srcdir)/examples/local.mk $(srcdir)/examples/c/local.mk $(srcdir)/examples/c/calc/local.mk $(srcdir)/examples/c/lexcalc/local.mk $(srcdir)/examples/c/mfcalc/local.mk $(srcdir)/examples/c/reccalc/local.mk $(srcdir)/examples/c/rpcalc/local.mk $(srcdir)/examples/c++/local.mk $(srcdir)/examples/c++/calc++/local.mk $(srcdir)/examples/d/local.mk $(srcdir)/examples/java/local.mk $(srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(srcdir)/src/local.mk $(srcdir)/tests/local.mk $(am__configure_deps)
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/build-aux/local.mk $(srcdir)/data/local.mk $(srcdir)/doc/local.mk $(srcdir)/etc/local.mk $(srcdir)/examples/local.mk $(srcdir)/examples/c/local.mk $(srcdir)/examples/c/bistromathic/local.mk $(srcdir)/examples/c/calc/local.mk $(srcdir)/examples/c/glr/local.mk $(srcdir)/examples/c/lexcalc/local.mk $(srcdir)/examples/c/mfcalc/local.mk $(srcdir)/examples/c/pushcalc/local.mk $(srcdir)/examples/c/reccalc/local.mk $(srcdir)/examples/c/rpcalc/local.mk $(srcdir)/examples/c++/local.mk $(srcdir)/examples/c++/calc++/local.mk $(srcdir)/examples/c++/glr/local.mk $(srcdir)/examples/d/local.mk $(srcdir)/examples/d/calc/local.mk $(srcdir)/examples/d/simple/local.mk $(srcdir)/examples/java/local.mk $(srcdir)/examples/java/calc/local.mk $(srcdir)/examples/java/simple/local.mk $(srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(srcdir)/src/local.mk $(srcdir)/tests/local.mk $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
@@ -3241,7 +3891,7 @@
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
 	esac;
-$(srcdir)/build-aux/local.mk $(srcdir)/data/local.mk $(srcdir)/doc/local.mk $(srcdir)/etc/local.mk $(srcdir)/examples/local.mk $(srcdir)/examples/c/local.mk $(srcdir)/examples/c/calc/local.mk $(srcdir)/examples/c/lexcalc/local.mk $(srcdir)/examples/c/mfcalc/local.mk $(srcdir)/examples/c/reccalc/local.mk $(srcdir)/examples/c/rpcalc/local.mk $(srcdir)/examples/c++/local.mk $(srcdir)/examples/c++/calc++/local.mk $(srcdir)/examples/d/local.mk $(srcdir)/examples/java/local.mk $(srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(srcdir)/src/local.mk $(srcdir)/tests/local.mk $(am__empty):
+$(srcdir)/build-aux/local.mk $(srcdir)/data/local.mk $(srcdir)/doc/local.mk $(srcdir)/etc/local.mk $(srcdir)/examples/local.mk $(srcdir)/examples/c/local.mk $(srcdir)/examples/c/bistromathic/local.mk $(srcdir)/examples/c/calc/local.mk $(srcdir)/examples/c/glr/local.mk $(srcdir)/examples/c/lexcalc/local.mk $(srcdir)/examples/c/mfcalc/local.mk $(srcdir)/examples/c/pushcalc/local.mk $(srcdir)/examples/c/reccalc/local.mk $(srcdir)/examples/c/rpcalc/local.mk $(srcdir)/examples/c++/local.mk $(srcdir)/examples/c++/calc++/local.mk $(srcdir)/examples/c++/glr/local.mk $(srcdir)/examples/d/local.mk $(srcdir)/examples/d/calc/local.mk $(srcdir)/examples/d/simple/local.mk $(srcdir)/examples/java/local.mk $(srcdir)/examples/java/calc/local.mk $(srcdir)/examples/java/simple/local.mk $(srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(srcdir)/src/local.mk $(srcdir)/tests/local.mk $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	$(SHELL) ./config.status --recheck
@@ -3389,6 +4039,10 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-gl_array_list.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-openat-proc.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-basename-lgpl.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-binary-io.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-bitrotate.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3419,6 +4073,8 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-c-strncasecmp.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-canonicalize.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-careadlinkat.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-cloexec.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3435,10 +4091,10 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-dirname-lgpl.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
-lib/libbison_a-basename-lgpl.$(OBJEXT): lib/$(am__dirstamp) \
-	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-stripslash.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-execute.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-exitfail.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-fatal-signal.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3449,6 +4105,12 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-dup-safer-flag.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-file-set.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-filenamecat-lgpl.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-findprog-in.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-fopen-safer.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-fstrcmp.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3465,6 +4127,20 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-hash.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-gl_hash_map.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-hash-pjw.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-hash-triple-simple.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-ialloc.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-integer_length.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-integer_length_l.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-gl_linked_list.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-gl_list.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-localcharset.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3479,6 +4155,8 @@
 	lib/glthread/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-malloca.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-gl_map.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-math.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-mbchar.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3487,6 +4165,10 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-mbswidth.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-openat-die.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-gl_oset.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-pipe2.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-pipe2-safer.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3499,6 +4181,32 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-quotearg.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-gl_rbtree_oset.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-gl_rbtreehash_list.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-save-cwd.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/malloc/$(am__dirstamp):
+	@$(MKDIR_P) lib/malloc
+	@: > lib/malloc/$(am__dirstamp)
+lib/malloc/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) lib/malloc/$(DEPDIR)
+	@: > lib/malloc/$(DEPDIR)/$(am__dirstamp)
+lib/malloc/libbison_a-scratch_buffer_dupfree.$(OBJEXT):  \
+	lib/malloc/$(am__dirstamp) \
+	lib/malloc/$(DEPDIR)/$(am__dirstamp)
+lib/malloc/libbison_a-scratch_buffer_grow.$(OBJEXT):  \
+	lib/malloc/$(am__dirstamp) \
+	lib/malloc/$(DEPDIR)/$(am__dirstamp)
+lib/malloc/libbison_a-scratch_buffer_grow_preserve.$(OBJEXT):  \
+	lib/malloc/$(am__dirstamp) \
+	lib/malloc/$(DEPDIR)/$(am__dirstamp)
+lib/malloc/libbison_a-scratch_buffer_set_array_size.$(OBJEXT):  \
+	lib/malloc/$(am__dirstamp) \
+	lib/malloc/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-setlocale_null.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-sig-handler.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-spawn-pipe.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3514,6 +4222,8 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/glthread/libbison_a-tls.$(OBJEXT): lib/glthread/$(am__dirstamp) \
 	lib/glthread/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-unicodeio.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-unistd.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-dup-safer.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3522,6 +4232,20 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-pipe-safer.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/unistr/$(am__dirstamp):
+	@$(MKDIR_P) lib/unistr
+	@: > lib/unistr/$(am__dirstamp)
+lib/unistr/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) lib/unistr/$(DEPDIR)
+	@: > lib/unistr/$(DEPDIR)/$(am__dirstamp)
+lib/unistr/libbison_a-u8-mbtoucr.$(OBJEXT):  \
+	lib/unistr/$(am__dirstamp) \
+	lib/unistr/$(DEPDIR)/$(am__dirstamp)
+lib/unistr/libbison_a-u8-uctomb.$(OBJEXT): lib/unistr/$(am__dirstamp) \
+	lib/unistr/$(DEPDIR)/$(am__dirstamp)
+lib/unistr/libbison_a-u8-uctomb-aux.$(OBJEXT):  \
+	lib/unistr/$(am__dirstamp) \
+	lib/unistr/$(DEPDIR)/$(am__dirstamp)
 lib/uniwidth/$(am__dirstamp):
 	@$(MKDIR_P) lib/uniwidth
 	@: > lib/uniwidth/$(am__dirstamp)
@@ -3544,6 +4268,10 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-gl_xlist.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-gl_xmap.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-xmemdup0.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-xreadlink.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-xsize.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3554,18 +4282,36 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-path-join.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-access.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-calloc.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-canonicalize-lgpl.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-chdir-long.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-close.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-closedir.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-dirfd.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-dup.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-dup2.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-error.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-fchdir.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-fcntl.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-fdopendir.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-ffs.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-ffsl.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-float.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-itold.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3576,6 +4322,8 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-fprintf.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-free.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-frexp.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-frexpl.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3586,10 +4334,22 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-stat-w32.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-at-func.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-fstatat.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-fsync.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-getcwd.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-getcwd-lgpl.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-getdelim.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-getdtablesize.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-getline.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-getopt.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-getopt1.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3598,6 +4358,12 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-gettimeofday.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-iconv.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-iconv_close.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-iconv_open.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-isnan.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-isnand.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3608,20 +4374,30 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-iswblank.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
-lib/libbison_a-ldexpl.$(OBJEXT): lib/$(am__dirstamp) \
+lib/libbison_a-iswdigit.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
-lib/libbison_a-localtime-buffer.$(OBJEXT): lib/$(am__dirstamp) \
+lib/libbison_a-iswxdigit.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-ldexpl.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-lstat.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-malloc.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-lc-charset-dispatch.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-mbrtowc.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-mbtowc-lock.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-mbsinit.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-memchr.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-mempcpy.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-memrchr.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-msvc-inval.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-msvc-nothrow.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3632,10 +4408,20 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-open.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-openat.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-opendir.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-perror.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-pipe.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-spawn.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-spawni.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-spawn_faction_addchdir.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-spawn_faction_addclose.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-spawn_faction_adddup2.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3652,6 +4438,8 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-spawnattr_setflags.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-spawnattr_setpgroup.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-spawnattr_setsigmask.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-spawnp.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3662,18 +4450,28 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-rawmemchr.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-readdir.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-readline.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-readlink.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-realloc.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-reallocarray.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-progreloc.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-relocatable.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-rename.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-rewinddir.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-rmdir.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-setlocale-lock.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-sigaction.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-signbitd.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3686,12 +4484,16 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-snprintf.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-os2-spawn.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-sprintf.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-stat.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-stpcpy.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-stpncpy.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-strchrnul.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-strdup.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3706,6 +4508,8 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-strnlen.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
+lib/libbison_a-strtod.$(OBJEXT): lib/$(am__dirstamp) \
+	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-strverscmp.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-unlink.$(OBJEXT): lib/$(am__dirstamp) \
@@ -3742,9 +4546,9 @@
 	lib/$(DEPDIR)/$(am__dirstamp)
 lib/libbison_a-windows-rwlock.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
-lib/libbison_a-windows-tls.$(OBJEXT): lib/$(am__dirstamp) \
+lib/libbison_a-windows-spawn.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
-lib/libbison_a-xmemdup0.$(OBJEXT): lib/$(am__dirstamp) \
+lib/libbison_a-windows-tls.$(OBJEXT): lib/$(am__dirstamp) \
 	lib/$(DEPDIR)/$(am__dirstamp)
 
 lib/libbison.a: $(lib_libbison_a_OBJECTS) $(lib_libbison_a_DEPENDENCIES) $(EXTRA_lib_libbison_a_DEPENDENCIES) lib/$(am__dirstamp)
@@ -3781,6 +4585,19 @@
 examples/c++/calc++/calc++$(EXEEXT): $(examples_c___calc___calc___OBJECTS) $(examples_c___calc___calc___DEPENDENCIES) $(EXTRA_examples_c___calc___calc___DEPENDENCIES) examples/c++/calc++/$(am__dirstamp)
 	@rm -f examples/c++/calc++/calc++$(EXEEXT)
 	$(AM_V_CXXLD)$(examples_c___calc___calc___LINK) $(examples_c___calc___calc___OBJECTS) $(examples_c___calc___calc___LDADD) $(LIBS)
+examples/c++/glr/$(am__dirstamp):
+	@$(MKDIR_P) examples/c++/glr
+	@: > examples/c++/glr/$(am__dirstamp)
+examples/c++/glr/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) examples/c++/glr/$(DEPDIR)
+	@: > examples/c++/glr/$(DEPDIR)/$(am__dirstamp)
+examples/c++/glr/examples_c___glr_c___types-c++-types.$(OBJEXT):  \
+	examples/c++/glr/$(am__dirstamp) \
+	examples/c++/glr/$(DEPDIR)/$(am__dirstamp)
+
+examples/c++/glr/c++-types$(EXEEXT): $(examples_c___glr_c___types_OBJECTS) $(examples_c___glr_c___types_DEPENDENCIES) $(EXTRA_examples_c___glr_c___types_DEPENDENCIES) examples/c++/glr/$(am__dirstamp)
+	@rm -f examples/c++/glr/c++-types$(EXEEXT)
+	$(AM_V_CXXLD)$(examples_c___glr_c___types_LINK) $(examples_c___glr_c___types_OBJECTS) $(examples_c___glr_c___types_LDADD) $(LIBS)
 examples/c++/$(am__dirstamp):
 	@$(MKDIR_P) examples/c++
 	@: > examples/c++/$(am__dirstamp)
@@ -3806,28 +4623,55 @@
 examples/c++/variant-11$(EXEEXT): $(examples_c___variant_11_OBJECTS) $(examples_c___variant_11_DEPENDENCIES) $(EXTRA_examples_c___variant_11_DEPENDENCIES) examples/c++/$(am__dirstamp)
 	@rm -f examples/c++/variant-11$(EXEEXT)
 	$(AM_V_CXXLD)$(examples_c___variant_11_LINK) $(examples_c___variant_11_OBJECTS) $(examples_c___variant_11_LDADD) $(LIBS)
+examples/c/bistromathic/$(am__dirstamp):
+	@$(MKDIR_P) examples/c/bistromathic
+	@: > examples/c/bistromathic/$(am__dirstamp)
+examples/c/bistromathic/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) examples/c/bistromathic/$(DEPDIR)
+	@: > examples/c/bistromathic/$(DEPDIR)/$(am__dirstamp)
+examples/c/bistromathic/bistromathic-parse.$(OBJEXT):  \
+	examples/c/bistromathic/$(am__dirstamp) \
+	examples/c/bistromathic/$(DEPDIR)/$(am__dirstamp)
+
+examples/c/bistromathic/bistromathic$(EXEEXT): $(examples_c_bistromathic_bistromathic_OBJECTS) $(examples_c_bistromathic_bistromathic_DEPENDENCIES) $(EXTRA_examples_c_bistromathic_bistromathic_DEPENDENCIES) examples/c/bistromathic/$(am__dirstamp)
+	@rm -f examples/c/bistromathic/bistromathic$(EXEEXT)
+	$(AM_V_CCLD)$(examples_c_bistromathic_bistromathic_LINK) $(examples_c_bistromathic_bistromathic_OBJECTS) $(examples_c_bistromathic_bistromathic_LDADD) $(LIBS)
 examples/c/calc/$(am__dirstamp):
 	@$(MKDIR_P) examples/c/calc
 	@: > examples/c/calc/$(am__dirstamp)
 examples/c/calc/$(DEPDIR)/$(am__dirstamp):
 	@$(MKDIR_P) examples/c/calc/$(DEPDIR)
 	@: > examples/c/calc/$(DEPDIR)/$(am__dirstamp)
-examples/c/calc/calc-calc.$(OBJEXT): examples/c/calc/$(am__dirstamp) \
+examples/c/calc/examples_c_calc_calc-calc.$(OBJEXT):  \
+	examples/c/calc/$(am__dirstamp) \
 	examples/c/calc/$(DEPDIR)/$(am__dirstamp)
 
 examples/c/calc/calc$(EXEEXT): $(examples_c_calc_calc_OBJECTS) $(examples_c_calc_calc_DEPENDENCIES) $(EXTRA_examples_c_calc_calc_DEPENDENCIES) examples/c/calc/$(am__dirstamp)
 	@rm -f examples/c/calc/calc$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(examples_c_calc_calc_OBJECTS) $(examples_c_calc_calc_LDADD) $(LIBS)
+	$(AM_V_CCLD)$(examples_c_calc_calc_LINK) $(examples_c_calc_calc_OBJECTS) $(examples_c_calc_calc_LDADD) $(LIBS)
+examples/c/glr/$(am__dirstamp):
+	@$(MKDIR_P) examples/c/glr
+	@: > examples/c/glr/$(am__dirstamp)
+examples/c/glr/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) examples/c/glr/$(DEPDIR)
+	@: > examples/c/glr/$(DEPDIR)/$(am__dirstamp)
+examples/c/glr/examples_c_glr_c___types-c++-types.$(OBJEXT):  \
+	examples/c/glr/$(am__dirstamp) \
+	examples/c/glr/$(DEPDIR)/$(am__dirstamp)
+
+examples/c/glr/c++-types$(EXEEXT): $(examples_c_glr_c___types_OBJECTS) $(examples_c_glr_c___types_DEPENDENCIES) $(EXTRA_examples_c_glr_c___types_DEPENDENCIES) examples/c/glr/$(am__dirstamp)
+	@rm -f examples/c/glr/c++-types$(EXEEXT)
+	$(AM_V_CCLD)$(examples_c_glr_c___types_LINK) $(examples_c_glr_c___types_OBJECTS) $(examples_c_glr_c___types_LDADD) $(LIBS)
 examples/c/lexcalc/$(am__dirstamp):
 	@$(MKDIR_P) examples/c/lexcalc
 	@: > examples/c/lexcalc/$(am__dirstamp)
 examples/c/lexcalc/$(DEPDIR)/$(am__dirstamp):
 	@$(MKDIR_P) examples/c/lexcalc/$(DEPDIR)
 	@: > examples/c/lexcalc/$(DEPDIR)/$(am__dirstamp)
-examples/c/lexcalc/lexcalc-parse.$(OBJEXT):  \
+examples/c/lexcalc/examples_c_lexcalc_lexcalc-parse.$(OBJEXT):  \
 	examples/c/lexcalc/$(am__dirstamp) \
 	examples/c/lexcalc/$(DEPDIR)/$(am__dirstamp)
-examples/c/lexcalc/lexcalc-scan.$(OBJEXT):  \
+examples/c/lexcalc/examples_c_lexcalc_lexcalc-scan.$(OBJEXT):  \
 	examples/c/lexcalc/$(am__dirstamp) \
 	examples/c/lexcalc/$(DEPDIR)/$(am__dirstamp)
 
@@ -3840,23 +4684,36 @@
 examples/c/mfcalc/$(DEPDIR)/$(am__dirstamp):
 	@$(MKDIR_P) examples/c/mfcalc/$(DEPDIR)
 	@: > examples/c/mfcalc/$(DEPDIR)/$(am__dirstamp)
-examples/c/mfcalc/mfcalc-mfcalc.$(OBJEXT):  \
+examples/c/mfcalc/examples_c_mfcalc_mfcalc-mfcalc.$(OBJEXT):  \
 	examples/c/mfcalc/$(am__dirstamp) \
 	examples/c/mfcalc/$(DEPDIR)/$(am__dirstamp)
 
 examples/c/mfcalc/mfcalc$(EXEEXT): $(examples_c_mfcalc_mfcalc_OBJECTS) $(examples_c_mfcalc_mfcalc_DEPENDENCIES) $(EXTRA_examples_c_mfcalc_mfcalc_DEPENDENCIES) examples/c/mfcalc/$(am__dirstamp)
 	@rm -f examples/c/mfcalc/mfcalc$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(examples_c_mfcalc_mfcalc_OBJECTS) $(examples_c_mfcalc_mfcalc_LDADD) $(LIBS)
+	$(AM_V_CCLD)$(examples_c_mfcalc_mfcalc_LINK) $(examples_c_mfcalc_mfcalc_OBJECTS) $(examples_c_mfcalc_mfcalc_LDADD) $(LIBS)
+examples/c/pushcalc/$(am__dirstamp):
+	@$(MKDIR_P) examples/c/pushcalc
+	@: > examples/c/pushcalc/$(am__dirstamp)
+examples/c/pushcalc/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) examples/c/pushcalc/$(DEPDIR)
+	@: > examples/c/pushcalc/$(DEPDIR)/$(am__dirstamp)
+examples/c/pushcalc/examples_c_pushcalc_calc-calc.$(OBJEXT):  \
+	examples/c/pushcalc/$(am__dirstamp) \
+	examples/c/pushcalc/$(DEPDIR)/$(am__dirstamp)
+
+examples/c/pushcalc/calc$(EXEEXT): $(examples_c_pushcalc_calc_OBJECTS) $(examples_c_pushcalc_calc_DEPENDENCIES) $(EXTRA_examples_c_pushcalc_calc_DEPENDENCIES) examples/c/pushcalc/$(am__dirstamp)
+	@rm -f examples/c/pushcalc/calc$(EXEEXT)
+	$(AM_V_CCLD)$(examples_c_pushcalc_calc_LINK) $(examples_c_pushcalc_calc_OBJECTS) $(examples_c_pushcalc_calc_LDADD) $(LIBS)
 examples/c/reccalc/$(am__dirstamp):
 	@$(MKDIR_P) examples/c/reccalc
 	@: > examples/c/reccalc/$(am__dirstamp)
 examples/c/reccalc/$(DEPDIR)/$(am__dirstamp):
 	@$(MKDIR_P) examples/c/reccalc/$(DEPDIR)
 	@: > examples/c/reccalc/$(DEPDIR)/$(am__dirstamp)
-examples/c/reccalc/reccalc-parse.$(OBJEXT):  \
+examples/c/reccalc/examples_c_reccalc_reccalc-parse.$(OBJEXT):  \
 	examples/c/reccalc/$(am__dirstamp) \
 	examples/c/reccalc/$(DEPDIR)/$(am__dirstamp)
-examples/c/reccalc/reccalc-scan.$(OBJEXT):  \
+examples/c/reccalc/examples_c_reccalc_reccalc-scan.$(OBJEXT):  \
 	examples/c/reccalc/$(am__dirstamp) \
 	examples/c/reccalc/$(DEPDIR)/$(am__dirstamp)
 
@@ -3869,13 +4726,13 @@
 examples/c/rpcalc/$(DEPDIR)/$(am__dirstamp):
 	@$(MKDIR_P) examples/c/rpcalc/$(DEPDIR)
 	@: > examples/c/rpcalc/$(DEPDIR)/$(am__dirstamp)
-examples/c/rpcalc/rpcalc-rpcalc.$(OBJEXT):  \
+examples/c/rpcalc/examples_c_rpcalc_rpcalc-rpcalc.$(OBJEXT):  \
 	examples/c/rpcalc/$(am__dirstamp) \
 	examples/c/rpcalc/$(DEPDIR)/$(am__dirstamp)
 
 examples/c/rpcalc/rpcalc$(EXEEXT): $(examples_c_rpcalc_rpcalc_OBJECTS) $(examples_c_rpcalc_rpcalc_DEPENDENCIES) $(EXTRA_examples_c_rpcalc_rpcalc_DEPENDENCIES) examples/c/rpcalc/$(am__dirstamp)
 	@rm -f examples/c/rpcalc/rpcalc$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(examples_c_rpcalc_rpcalc_OBJECTS) $(examples_c_rpcalc_rpcalc_LDADD) $(LIBS)
+	$(AM_V_CCLD)$(examples_c_rpcalc_rpcalc_LINK) $(examples_c_rpcalc_rpcalc_OBJECTS) $(examples_c_rpcalc_rpcalc_LDADD) $(LIBS)
 src/$(am__dirstamp):
 	@$(MKDIR_P) src
 	@: > src/$(am__dirstamp)
@@ -3896,6 +4753,10 @@
 	src/$(DEPDIR)/$(am__dirstamp)
 src/bison-conflicts.$(OBJEXT): src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
+src/bison-counterexample.$(OBJEXT): src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/bison-derivation.$(OBJEXT): src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
 src/bison-derives.$(OBJEXT): src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
 src/bison-files.$(OBJEXT): src/$(am__dirstamp) \
@@ -3904,6 +4765,8 @@
 	src/$(DEPDIR)/$(am__dirstamp)
 src/bison-getargs.$(OBJEXT): src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
+src/bison-glyphs.$(OBJEXT): src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
 src/bison-gram.$(OBJEXT): src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
 src/bison-graphviz.$(OBJEXT): src/$(am__dirstamp) \
@@ -3916,6 +4779,8 @@
 	src/$(DEPDIR)/$(am__dirstamp)
 src/bison-lr0.$(OBJEXT): src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
+src/bison-lssi.$(OBJEXT): src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
 src/bison-main.$(OBJEXT): src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
 src/bison-muscle-tab.$(OBJEXT): src/$(am__dirstamp) \
@@ -3928,6 +4793,8 @@
 	src/$(DEPDIR)/$(am__dirstamp)
 src/bison-parse-gram.$(OBJEXT): src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
+src/bison-parse-simulation.$(OBJEXT): src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
 src/bison-print-graph.$(OBJEXT): src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
 src/bison-print-xml.$(OBJEXT): src/$(am__dirstamp) \
@@ -3948,6 +4815,10 @@
 	src/$(DEPDIR)/$(am__dirstamp)
 src/bison-state.$(OBJEXT): src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
+src/bison-state-item.$(OBJEXT): src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/bison-strversion.$(OBJEXT): src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
 src/bison-symlist.$(OBJEXT): src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
 src/bison-symtab.$(OBJEXT): src/$(am__dirstamp) \
@@ -4021,14 +4892,20 @@
 	-rm -f *.$(OBJEXT)
 	-rm -f examples/c++/*.$(OBJEXT)
 	-rm -f examples/c++/calc++/*.$(OBJEXT)
+	-rm -f examples/c++/glr/*.$(OBJEXT)
+	-rm -f examples/c/bistromathic/*.$(OBJEXT)
 	-rm -f examples/c/calc/*.$(OBJEXT)
+	-rm -f examples/c/glr/*.$(OBJEXT)
 	-rm -f examples/c/lexcalc/*.$(OBJEXT)
 	-rm -f examples/c/mfcalc/*.$(OBJEXT)
+	-rm -f examples/c/pushcalc/*.$(OBJEXT)
 	-rm -f examples/c/reccalc/*.$(OBJEXT)
 	-rm -f examples/c/rpcalc/*.$(OBJEXT)
 	-rm -f lib/*.$(OBJEXT)
 	-rm -f lib/bitset/*.$(OBJEXT)
 	-rm -f lib/glthread/*.$(OBJEXT)
+	-rm -f lib/malloc/*.$(OBJEXT)
+	-rm -f lib/unistr/*.$(OBJEXT)
 	-rm -f lib/uniwidth/*.$(OBJEXT)
 	-rm -f src/*.$(OBJEXT)
 
@@ -4042,18 +4919,24 @@
 @AMDEP_TRUE@@am__include@ @am__quote@examples/c++/calc++/$(DEPDIR)/calc__-driver.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@examples/c++/calc++/$(DEPDIR)/calc__-parser.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@examples/c++/calc++/$(DEPDIR)/calc__-scanner.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@examples/c/calc/$(DEPDIR)/calc-calc.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@examples/c/lexcalc/$(DEPDIR)/lexcalc-parse.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@examples/c/lexcalc/$(DEPDIR)/lexcalc-scan.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@examples/c/mfcalc/$(DEPDIR)/mfcalc-mfcalc.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@examples/c/reccalc/$(DEPDIR)/reccalc-parse.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@examples/c/reccalc/$(DEPDIR)/reccalc-scan.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@examples/c/rpcalc/$(DEPDIR)/rpcalc-rpcalc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@examples/c++/glr/$(DEPDIR)/examples_c___glr_c___types-c++-types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@examples/c/bistromathic/$(DEPDIR)/bistromathic-parse.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@examples/c/calc/$(DEPDIR)/examples_c_calc_calc-calc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@examples/c/glr/$(DEPDIR)/examples_c_glr_c___types-c++-types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-parse.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-scan.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@examples/c/mfcalc/$(DEPDIR)/examples_c_mfcalc_mfcalc-mfcalc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@examples/c/pushcalc/$(DEPDIR)/examples_c_pushcalc_calc-calc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-parse.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-scan.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@examples/c/rpcalc/$(DEPDIR)/examples_c_rpcalc_rpcalc-rpcalc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-access.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-allocator.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-areadlink.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-argmatch.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-asnprintf.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-asprintf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-at-func.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-basename-lgpl.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-basename.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-binary-io.Po@am__quote@ # am--include-marker
@@ -4065,38 +4948,57 @@
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-c-strncasecmp.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-calloc.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-canonicalize-lgpl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-canonicalize.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-careadlinkat.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-chdir-long.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-cloexec.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-close-stream.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-close.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-closedir.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-closeout.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-concat-filename.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-dirfd.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-dirname-lgpl.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-dirname.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-dup-safer-flag.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-dup-safer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-dup.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-dup2.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-error.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-execute.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-exitfail.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-fatal-signal.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-fchdir.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-fcntl.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-fd-hook.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-fd-safer-flag.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-fd-safer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-fdopendir.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-ffs.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-ffsl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-file-set.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-filenamecat-lgpl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-findprog-in.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-float.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-fopen-safer.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-fopen.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-fpending.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-fprintf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-free.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-frexp.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-frexpl.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-fseterr.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-fstat.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-fstatat.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-fstrcmp.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-fsync.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-get-errno.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-getcwd-lgpl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-getcwd.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-getdelim.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-getdtablesize.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-gethrxtime.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-getline.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-getopt.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-getopt1.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-getprogname.Po@am__quote@ # am--include-marker
@@ -4104,19 +5006,36 @@
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-gettime.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-gettimeofday.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-gl_array_list.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-gl_hash_map.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-gl_linked_list.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-gl_list.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-gl_map.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-gl_oset.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-gl_rbtree_oset.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-gl_rbtreehash_list.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-gl_xlist.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-gl_xmap.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-hard-locale.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-hash-pjw.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-hash-triple-simple.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-hash.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-ialloc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-iconv.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-iconv_close.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-iconv_open.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-integer_length.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-integer_length_l.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-isnan.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-isnand.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-isnanf.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-isnanl.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-iswblank.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-iswdigit.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-iswxdigit.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-itold.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-lc-charset-dispatch.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-ldexpl.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-localcharset.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-localtime-buffer.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-lstat.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-malloc.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-malloca.Po@am__quote@ # am--include-marker
@@ -4126,15 +5045,24 @@
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-mbrtowc.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-mbsinit.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-mbswidth.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-mbtowc-lock.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-memchr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-mempcpy.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-memrchr.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-msvc-inval.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-msvc-nothrow.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-obstack.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-obstack_printf.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-open.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-openat-die.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-openat-proc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-openat.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-opendir.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-os2-spawn.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-path-join.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-perror.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-pipe-safer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-pipe.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-pipe2-safer.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-pipe2.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-printf-args.Po@am__quote@ # am--include-marker
@@ -4147,11 +5075,18 @@
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-quotearg.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-raise.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-rawmemchr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-readdir.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-readline.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-readlink.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-realloc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-reallocarray.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-relocatable.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-rename.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-rewinddir.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-rmdir.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-save-cwd.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-setlocale-lock.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-setlocale_null.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-sig-handler.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-sigaction.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-signbitd.Po@am__quote@ # am--include-marker
@@ -4160,6 +5095,8 @@
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-sigprocmask.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-snprintf.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-spawn-pipe.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-spawn.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-spawn_faction_addchdir.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-spawn_faction_addclose.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-spawn_faction_adddup2.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-spawn_faction_addopen.Po@am__quote@ # am--include-marker
@@ -4168,6 +5105,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-spawnattr_destroy.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-spawnattr_init.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-spawnattr_setflags.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-spawnattr_setpgroup.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-spawnattr_setsigmask.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-spawni.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-spawnp.Po@am__quote@ # am--include-marker
@@ -4176,6 +5114,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-stat-w32.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-stat.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-stpcpy.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-stpncpy.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-strchrnul.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-strdup.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-strerror-override.Po@am__quote@ # am--include-marker
@@ -4184,9 +5123,11 @@
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-stripslash.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-strndup.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-strnlen.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-strtod.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-strverscmp.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-timespec.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-timevar.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-unicodeio.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-unistd.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-unlink.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-unsetenv.Po@am__quote@ # am--include-marker
@@ -4203,6 +5144,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-windows-once.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-windows-recmutex.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-windows-rwlock.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-windows-spawn.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-windows-tls.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-xalloc-die.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/$(DEPDIR)/libbison_a-xconcat-filename.Po@am__quote@ # am--include-marker
@@ -4223,6 +5165,13 @@
 @AMDEP_TRUE@@am__include@ @am__quote@lib/glthread/$(DEPDIR)/libbison_a-lock.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/glthread/$(DEPDIR)/libbison_a-threadlib.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/glthread/$(DEPDIR)/libbison_a-tls.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_dupfree.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow_preserve.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_set_array_size.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/unistr/$(DEPDIR)/libbison_a-u8-mbtoucr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb-aux.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@lib/uniwidth/$(DEPDIR)/libbison_a-width.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-AnnotationList.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-InadequacyList.Po@am__quote@ # am--include-marker
@@ -4231,22 +5180,27 @@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-closure.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-complain.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-conflicts.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-counterexample.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-derivation.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-derives.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-files.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-fixits.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-getargs.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-glyphs.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-gram.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-graphviz.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-ielr.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-lalr.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-location.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-lr0.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-lssi.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-main.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-muscle-tab.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-named-ref.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-nullable.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-output.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-parse-gram.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-parse-simulation.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-print-graph.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-print-xml.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-print.Po@am__quote@ # am--include-marker
@@ -4259,7 +5213,9 @@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-scan-gram.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-scan-skel-c.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-scan-skel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-state-item.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-state.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-strversion.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-symlist.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-symtab.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/bison-tables.Po@am__quote@ # am--include-marker
@@ -4343,6 +5299,34 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gl_array_list.obj `if test -f 'lib/gl_array_list.c'; then $(CYGPATH_W) 'lib/gl_array_list.c'; else $(CYGPATH_W) '$(srcdir)/lib/gl_array_list.c'; fi`
 
+lib/libbison_a-openat-proc.o: lib/openat-proc.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-openat-proc.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-openat-proc.Tpo -c -o lib/libbison_a-openat-proc.o `test -f 'lib/openat-proc.c' || echo '$(srcdir)/'`lib/openat-proc.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-openat-proc.Tpo lib/$(DEPDIR)/libbison_a-openat-proc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/openat-proc.c' object='lib/libbison_a-openat-proc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-openat-proc.o `test -f 'lib/openat-proc.c' || echo '$(srcdir)/'`lib/openat-proc.c
+
+lib/libbison_a-openat-proc.obj: lib/openat-proc.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-openat-proc.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-openat-proc.Tpo -c -o lib/libbison_a-openat-proc.obj `if test -f 'lib/openat-proc.c'; then $(CYGPATH_W) 'lib/openat-proc.c'; else $(CYGPATH_W) '$(srcdir)/lib/openat-proc.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-openat-proc.Tpo lib/$(DEPDIR)/libbison_a-openat-proc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/openat-proc.c' object='lib/libbison_a-openat-proc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-openat-proc.obj `if test -f 'lib/openat-proc.c'; then $(CYGPATH_W) 'lib/openat-proc.c'; else $(CYGPATH_W) '$(srcdir)/lib/openat-proc.c'; fi`
+
+lib/libbison_a-basename-lgpl.o: lib/basename-lgpl.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-basename-lgpl.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-basename-lgpl.Tpo -c -o lib/libbison_a-basename-lgpl.o `test -f 'lib/basename-lgpl.c' || echo '$(srcdir)/'`lib/basename-lgpl.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-basename-lgpl.Tpo lib/$(DEPDIR)/libbison_a-basename-lgpl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/basename-lgpl.c' object='lib/libbison_a-basename-lgpl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-basename-lgpl.o `test -f 'lib/basename-lgpl.c' || echo '$(srcdir)/'`lib/basename-lgpl.c
+
+lib/libbison_a-basename-lgpl.obj: lib/basename-lgpl.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-basename-lgpl.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-basename-lgpl.Tpo -c -o lib/libbison_a-basename-lgpl.obj `if test -f 'lib/basename-lgpl.c'; then $(CYGPATH_W) 'lib/basename-lgpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/basename-lgpl.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-basename-lgpl.Tpo lib/$(DEPDIR)/libbison_a-basename-lgpl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/basename-lgpl.c' object='lib/libbison_a-basename-lgpl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-basename-lgpl.obj `if test -f 'lib/basename-lgpl.c'; then $(CYGPATH_W) 'lib/basename-lgpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/basename-lgpl.c'; fi`
+
 lib/libbison_a-binary-io.o: lib/binary-io.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-binary-io.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-binary-io.Tpo -c -o lib/libbison_a-binary-io.o `test -f 'lib/binary-io.c' || echo '$(srcdir)/'`lib/binary-io.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-binary-io.Tpo lib/$(DEPDIR)/libbison_a-binary-io.Po
@@ -4511,6 +5495,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-c-strncasecmp.obj `if test -f 'lib/c-strncasecmp.c'; then $(CYGPATH_W) 'lib/c-strncasecmp.c'; else $(CYGPATH_W) '$(srcdir)/lib/c-strncasecmp.c'; fi`
 
+lib/libbison_a-canonicalize.o: lib/canonicalize.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-canonicalize.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-canonicalize.Tpo -c -o lib/libbison_a-canonicalize.o `test -f 'lib/canonicalize.c' || echo '$(srcdir)/'`lib/canonicalize.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-canonicalize.Tpo lib/$(DEPDIR)/libbison_a-canonicalize.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/canonicalize.c' object='lib/libbison_a-canonicalize.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-canonicalize.o `test -f 'lib/canonicalize.c' || echo '$(srcdir)/'`lib/canonicalize.c
+
+lib/libbison_a-canonicalize.obj: lib/canonicalize.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-canonicalize.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-canonicalize.Tpo -c -o lib/libbison_a-canonicalize.obj `if test -f 'lib/canonicalize.c'; then $(CYGPATH_W) 'lib/canonicalize.c'; else $(CYGPATH_W) '$(srcdir)/lib/canonicalize.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-canonicalize.Tpo lib/$(DEPDIR)/libbison_a-canonicalize.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/canonicalize.c' object='lib/libbison_a-canonicalize.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-canonicalize.obj `if test -f 'lib/canonicalize.c'; then $(CYGPATH_W) 'lib/canonicalize.c'; else $(CYGPATH_W) '$(srcdir)/lib/canonicalize.c'; fi`
+
 lib/libbison_a-careadlinkat.o: lib/careadlinkat.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-careadlinkat.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-careadlinkat.Tpo -c -o lib/libbison_a-careadlinkat.o `test -f 'lib/careadlinkat.c' || echo '$(srcdir)/'`lib/careadlinkat.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-careadlinkat.Tpo lib/$(DEPDIR)/libbison_a-careadlinkat.Po
@@ -4623,20 +5621,6 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-dirname-lgpl.obj `if test -f 'lib/dirname-lgpl.c'; then $(CYGPATH_W) 'lib/dirname-lgpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/dirname-lgpl.c'; fi`
 
-lib/libbison_a-basename-lgpl.o: lib/basename-lgpl.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-basename-lgpl.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-basename-lgpl.Tpo -c -o lib/libbison_a-basename-lgpl.o `test -f 'lib/basename-lgpl.c' || echo '$(srcdir)/'`lib/basename-lgpl.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-basename-lgpl.Tpo lib/$(DEPDIR)/libbison_a-basename-lgpl.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/basename-lgpl.c' object='lib/libbison_a-basename-lgpl.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-basename-lgpl.o `test -f 'lib/basename-lgpl.c' || echo '$(srcdir)/'`lib/basename-lgpl.c
-
-lib/libbison_a-basename-lgpl.obj: lib/basename-lgpl.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-basename-lgpl.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-basename-lgpl.Tpo -c -o lib/libbison_a-basename-lgpl.obj `if test -f 'lib/basename-lgpl.c'; then $(CYGPATH_W) 'lib/basename-lgpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/basename-lgpl.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-basename-lgpl.Tpo lib/$(DEPDIR)/libbison_a-basename-lgpl.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/basename-lgpl.c' object='lib/libbison_a-basename-lgpl.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-basename-lgpl.obj `if test -f 'lib/basename-lgpl.c'; then $(CYGPATH_W) 'lib/basename-lgpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/basename-lgpl.c'; fi`
-
 lib/libbison_a-stripslash.o: lib/stripslash.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-stripslash.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-stripslash.Tpo -c -o lib/libbison_a-stripslash.o `test -f 'lib/stripslash.c' || echo '$(srcdir)/'`lib/stripslash.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-stripslash.Tpo lib/$(DEPDIR)/libbison_a-stripslash.Po
@@ -4651,6 +5635,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-stripslash.obj `if test -f 'lib/stripslash.c'; then $(CYGPATH_W) 'lib/stripslash.c'; else $(CYGPATH_W) '$(srcdir)/lib/stripslash.c'; fi`
 
+lib/libbison_a-execute.o: lib/execute.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-execute.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-execute.Tpo -c -o lib/libbison_a-execute.o `test -f 'lib/execute.c' || echo '$(srcdir)/'`lib/execute.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-execute.Tpo lib/$(DEPDIR)/libbison_a-execute.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/execute.c' object='lib/libbison_a-execute.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-execute.o `test -f 'lib/execute.c' || echo '$(srcdir)/'`lib/execute.c
+
+lib/libbison_a-execute.obj: lib/execute.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-execute.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-execute.Tpo -c -o lib/libbison_a-execute.obj `if test -f 'lib/execute.c'; then $(CYGPATH_W) 'lib/execute.c'; else $(CYGPATH_W) '$(srcdir)/lib/execute.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-execute.Tpo lib/$(DEPDIR)/libbison_a-execute.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/execute.c' object='lib/libbison_a-execute.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-execute.obj `if test -f 'lib/execute.c'; then $(CYGPATH_W) 'lib/execute.c'; else $(CYGPATH_W) '$(srcdir)/lib/execute.c'; fi`
+
 lib/libbison_a-exitfail.o: lib/exitfail.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-exitfail.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-exitfail.Tpo -c -o lib/libbison_a-exitfail.o `test -f 'lib/exitfail.c' || echo '$(srcdir)/'`lib/exitfail.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-exitfail.Tpo lib/$(DEPDIR)/libbison_a-exitfail.Po
@@ -4721,6 +5719,48 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-dup-safer-flag.obj `if test -f 'lib/dup-safer-flag.c'; then $(CYGPATH_W) 'lib/dup-safer-flag.c'; else $(CYGPATH_W) '$(srcdir)/lib/dup-safer-flag.c'; fi`
 
+lib/libbison_a-file-set.o: lib/file-set.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-file-set.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-file-set.Tpo -c -o lib/libbison_a-file-set.o `test -f 'lib/file-set.c' || echo '$(srcdir)/'`lib/file-set.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-file-set.Tpo lib/$(DEPDIR)/libbison_a-file-set.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/file-set.c' object='lib/libbison_a-file-set.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-file-set.o `test -f 'lib/file-set.c' || echo '$(srcdir)/'`lib/file-set.c
+
+lib/libbison_a-file-set.obj: lib/file-set.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-file-set.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-file-set.Tpo -c -o lib/libbison_a-file-set.obj `if test -f 'lib/file-set.c'; then $(CYGPATH_W) 'lib/file-set.c'; else $(CYGPATH_W) '$(srcdir)/lib/file-set.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-file-set.Tpo lib/$(DEPDIR)/libbison_a-file-set.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/file-set.c' object='lib/libbison_a-file-set.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-file-set.obj `if test -f 'lib/file-set.c'; then $(CYGPATH_W) 'lib/file-set.c'; else $(CYGPATH_W) '$(srcdir)/lib/file-set.c'; fi`
+
+lib/libbison_a-filenamecat-lgpl.o: lib/filenamecat-lgpl.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-filenamecat-lgpl.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-filenamecat-lgpl.Tpo -c -o lib/libbison_a-filenamecat-lgpl.o `test -f 'lib/filenamecat-lgpl.c' || echo '$(srcdir)/'`lib/filenamecat-lgpl.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-filenamecat-lgpl.Tpo lib/$(DEPDIR)/libbison_a-filenamecat-lgpl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/filenamecat-lgpl.c' object='lib/libbison_a-filenamecat-lgpl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-filenamecat-lgpl.o `test -f 'lib/filenamecat-lgpl.c' || echo '$(srcdir)/'`lib/filenamecat-lgpl.c
+
+lib/libbison_a-filenamecat-lgpl.obj: lib/filenamecat-lgpl.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-filenamecat-lgpl.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-filenamecat-lgpl.Tpo -c -o lib/libbison_a-filenamecat-lgpl.obj `if test -f 'lib/filenamecat-lgpl.c'; then $(CYGPATH_W) 'lib/filenamecat-lgpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/filenamecat-lgpl.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-filenamecat-lgpl.Tpo lib/$(DEPDIR)/libbison_a-filenamecat-lgpl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/filenamecat-lgpl.c' object='lib/libbison_a-filenamecat-lgpl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-filenamecat-lgpl.obj `if test -f 'lib/filenamecat-lgpl.c'; then $(CYGPATH_W) 'lib/filenamecat-lgpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/filenamecat-lgpl.c'; fi`
+
+lib/libbison_a-findprog-in.o: lib/findprog-in.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-findprog-in.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-findprog-in.Tpo -c -o lib/libbison_a-findprog-in.o `test -f 'lib/findprog-in.c' || echo '$(srcdir)/'`lib/findprog-in.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-findprog-in.Tpo lib/$(DEPDIR)/libbison_a-findprog-in.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/findprog-in.c' object='lib/libbison_a-findprog-in.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-findprog-in.o `test -f 'lib/findprog-in.c' || echo '$(srcdir)/'`lib/findprog-in.c
+
+lib/libbison_a-findprog-in.obj: lib/findprog-in.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-findprog-in.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-findprog-in.Tpo -c -o lib/libbison_a-findprog-in.obj `if test -f 'lib/findprog-in.c'; then $(CYGPATH_W) 'lib/findprog-in.c'; else $(CYGPATH_W) '$(srcdir)/lib/findprog-in.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-findprog-in.Tpo lib/$(DEPDIR)/libbison_a-findprog-in.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/findprog-in.c' object='lib/libbison_a-findprog-in.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-findprog-in.obj `if test -f 'lib/findprog-in.c'; then $(CYGPATH_W) 'lib/findprog-in.c'; else $(CYGPATH_W) '$(srcdir)/lib/findprog-in.c'; fi`
+
 lib/libbison_a-fopen-safer.o: lib/fopen-safer.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-fopen-safer.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-fopen-safer.Tpo -c -o lib/libbison_a-fopen-safer.o `test -f 'lib/fopen-safer.c' || echo '$(srcdir)/'`lib/fopen-safer.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-fopen-safer.Tpo lib/$(DEPDIR)/libbison_a-fopen-safer.Po
@@ -4833,6 +5873,104 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-hash.obj `if test -f 'lib/hash.c'; then $(CYGPATH_W) 'lib/hash.c'; else $(CYGPATH_W) '$(srcdir)/lib/hash.c'; fi`
 
+lib/libbison_a-gl_hash_map.o: lib/gl_hash_map.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-gl_hash_map.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-gl_hash_map.Tpo -c -o lib/libbison_a-gl_hash_map.o `test -f 'lib/gl_hash_map.c' || echo '$(srcdir)/'`lib/gl_hash_map.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-gl_hash_map.Tpo lib/$(DEPDIR)/libbison_a-gl_hash_map.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/gl_hash_map.c' object='lib/libbison_a-gl_hash_map.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gl_hash_map.o `test -f 'lib/gl_hash_map.c' || echo '$(srcdir)/'`lib/gl_hash_map.c
+
+lib/libbison_a-gl_hash_map.obj: lib/gl_hash_map.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-gl_hash_map.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-gl_hash_map.Tpo -c -o lib/libbison_a-gl_hash_map.obj `if test -f 'lib/gl_hash_map.c'; then $(CYGPATH_W) 'lib/gl_hash_map.c'; else $(CYGPATH_W) '$(srcdir)/lib/gl_hash_map.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-gl_hash_map.Tpo lib/$(DEPDIR)/libbison_a-gl_hash_map.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/gl_hash_map.c' object='lib/libbison_a-gl_hash_map.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gl_hash_map.obj `if test -f 'lib/gl_hash_map.c'; then $(CYGPATH_W) 'lib/gl_hash_map.c'; else $(CYGPATH_W) '$(srcdir)/lib/gl_hash_map.c'; fi`
+
+lib/libbison_a-hash-pjw.o: lib/hash-pjw.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-hash-pjw.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-hash-pjw.Tpo -c -o lib/libbison_a-hash-pjw.o `test -f 'lib/hash-pjw.c' || echo '$(srcdir)/'`lib/hash-pjw.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-hash-pjw.Tpo lib/$(DEPDIR)/libbison_a-hash-pjw.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/hash-pjw.c' object='lib/libbison_a-hash-pjw.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-hash-pjw.o `test -f 'lib/hash-pjw.c' || echo '$(srcdir)/'`lib/hash-pjw.c
+
+lib/libbison_a-hash-pjw.obj: lib/hash-pjw.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-hash-pjw.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-hash-pjw.Tpo -c -o lib/libbison_a-hash-pjw.obj `if test -f 'lib/hash-pjw.c'; then $(CYGPATH_W) 'lib/hash-pjw.c'; else $(CYGPATH_W) '$(srcdir)/lib/hash-pjw.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-hash-pjw.Tpo lib/$(DEPDIR)/libbison_a-hash-pjw.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/hash-pjw.c' object='lib/libbison_a-hash-pjw.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-hash-pjw.obj `if test -f 'lib/hash-pjw.c'; then $(CYGPATH_W) 'lib/hash-pjw.c'; else $(CYGPATH_W) '$(srcdir)/lib/hash-pjw.c'; fi`
+
+lib/libbison_a-hash-triple-simple.o: lib/hash-triple-simple.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-hash-triple-simple.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-hash-triple-simple.Tpo -c -o lib/libbison_a-hash-triple-simple.o `test -f 'lib/hash-triple-simple.c' || echo '$(srcdir)/'`lib/hash-triple-simple.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-hash-triple-simple.Tpo lib/$(DEPDIR)/libbison_a-hash-triple-simple.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/hash-triple-simple.c' object='lib/libbison_a-hash-triple-simple.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-hash-triple-simple.o `test -f 'lib/hash-triple-simple.c' || echo '$(srcdir)/'`lib/hash-triple-simple.c
+
+lib/libbison_a-hash-triple-simple.obj: lib/hash-triple-simple.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-hash-triple-simple.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-hash-triple-simple.Tpo -c -o lib/libbison_a-hash-triple-simple.obj `if test -f 'lib/hash-triple-simple.c'; then $(CYGPATH_W) 'lib/hash-triple-simple.c'; else $(CYGPATH_W) '$(srcdir)/lib/hash-triple-simple.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-hash-triple-simple.Tpo lib/$(DEPDIR)/libbison_a-hash-triple-simple.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/hash-triple-simple.c' object='lib/libbison_a-hash-triple-simple.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-hash-triple-simple.obj `if test -f 'lib/hash-triple-simple.c'; then $(CYGPATH_W) 'lib/hash-triple-simple.c'; else $(CYGPATH_W) '$(srcdir)/lib/hash-triple-simple.c'; fi`
+
+lib/libbison_a-ialloc.o: lib/ialloc.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-ialloc.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-ialloc.Tpo -c -o lib/libbison_a-ialloc.o `test -f 'lib/ialloc.c' || echo '$(srcdir)/'`lib/ialloc.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-ialloc.Tpo lib/$(DEPDIR)/libbison_a-ialloc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/ialloc.c' object='lib/libbison_a-ialloc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-ialloc.o `test -f 'lib/ialloc.c' || echo '$(srcdir)/'`lib/ialloc.c
+
+lib/libbison_a-ialloc.obj: lib/ialloc.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-ialloc.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-ialloc.Tpo -c -o lib/libbison_a-ialloc.obj `if test -f 'lib/ialloc.c'; then $(CYGPATH_W) 'lib/ialloc.c'; else $(CYGPATH_W) '$(srcdir)/lib/ialloc.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-ialloc.Tpo lib/$(DEPDIR)/libbison_a-ialloc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/ialloc.c' object='lib/libbison_a-ialloc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-ialloc.obj `if test -f 'lib/ialloc.c'; then $(CYGPATH_W) 'lib/ialloc.c'; else $(CYGPATH_W) '$(srcdir)/lib/ialloc.c'; fi`
+
+lib/libbison_a-integer_length.o: lib/integer_length.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-integer_length.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-integer_length.Tpo -c -o lib/libbison_a-integer_length.o `test -f 'lib/integer_length.c' || echo '$(srcdir)/'`lib/integer_length.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-integer_length.Tpo lib/$(DEPDIR)/libbison_a-integer_length.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/integer_length.c' object='lib/libbison_a-integer_length.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-integer_length.o `test -f 'lib/integer_length.c' || echo '$(srcdir)/'`lib/integer_length.c
+
+lib/libbison_a-integer_length.obj: lib/integer_length.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-integer_length.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-integer_length.Tpo -c -o lib/libbison_a-integer_length.obj `if test -f 'lib/integer_length.c'; then $(CYGPATH_W) 'lib/integer_length.c'; else $(CYGPATH_W) '$(srcdir)/lib/integer_length.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-integer_length.Tpo lib/$(DEPDIR)/libbison_a-integer_length.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/integer_length.c' object='lib/libbison_a-integer_length.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-integer_length.obj `if test -f 'lib/integer_length.c'; then $(CYGPATH_W) 'lib/integer_length.c'; else $(CYGPATH_W) '$(srcdir)/lib/integer_length.c'; fi`
+
+lib/libbison_a-integer_length_l.o: lib/integer_length_l.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-integer_length_l.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-integer_length_l.Tpo -c -o lib/libbison_a-integer_length_l.o `test -f 'lib/integer_length_l.c' || echo '$(srcdir)/'`lib/integer_length_l.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-integer_length_l.Tpo lib/$(DEPDIR)/libbison_a-integer_length_l.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/integer_length_l.c' object='lib/libbison_a-integer_length_l.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-integer_length_l.o `test -f 'lib/integer_length_l.c' || echo '$(srcdir)/'`lib/integer_length_l.c
+
+lib/libbison_a-integer_length_l.obj: lib/integer_length_l.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-integer_length_l.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-integer_length_l.Tpo -c -o lib/libbison_a-integer_length_l.obj `if test -f 'lib/integer_length_l.c'; then $(CYGPATH_W) 'lib/integer_length_l.c'; else $(CYGPATH_W) '$(srcdir)/lib/integer_length_l.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-integer_length_l.Tpo lib/$(DEPDIR)/libbison_a-integer_length_l.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/integer_length_l.c' object='lib/libbison_a-integer_length_l.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-integer_length_l.obj `if test -f 'lib/integer_length_l.c'; then $(CYGPATH_W) 'lib/integer_length_l.c'; else $(CYGPATH_W) '$(srcdir)/lib/integer_length_l.c'; fi`
+
+lib/libbison_a-gl_linked_list.o: lib/gl_linked_list.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-gl_linked_list.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-gl_linked_list.Tpo -c -o lib/libbison_a-gl_linked_list.o `test -f 'lib/gl_linked_list.c' || echo '$(srcdir)/'`lib/gl_linked_list.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-gl_linked_list.Tpo lib/$(DEPDIR)/libbison_a-gl_linked_list.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/gl_linked_list.c' object='lib/libbison_a-gl_linked_list.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gl_linked_list.o `test -f 'lib/gl_linked_list.c' || echo '$(srcdir)/'`lib/gl_linked_list.c
+
+lib/libbison_a-gl_linked_list.obj: lib/gl_linked_list.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-gl_linked_list.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-gl_linked_list.Tpo -c -o lib/libbison_a-gl_linked_list.obj `if test -f 'lib/gl_linked_list.c'; then $(CYGPATH_W) 'lib/gl_linked_list.c'; else $(CYGPATH_W) '$(srcdir)/lib/gl_linked_list.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-gl_linked_list.Tpo lib/$(DEPDIR)/libbison_a-gl_linked_list.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/gl_linked_list.c' object='lib/libbison_a-gl_linked_list.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gl_linked_list.obj `if test -f 'lib/gl_linked_list.c'; then $(CYGPATH_W) 'lib/gl_linked_list.c'; else $(CYGPATH_W) '$(srcdir)/lib/gl_linked_list.c'; fi`
+
 lib/libbison_a-gl_list.o: lib/gl_list.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-gl_list.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-gl_list.Tpo -c -o lib/libbison_a-gl_list.o `test -f 'lib/gl_list.c' || echo '$(srcdir)/'`lib/gl_list.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-gl_list.Tpo lib/$(DEPDIR)/libbison_a-gl_list.Po
@@ -4889,6 +6027,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-malloca.obj `if test -f 'lib/malloca.c'; then $(CYGPATH_W) 'lib/malloca.c'; else $(CYGPATH_W) '$(srcdir)/lib/malloca.c'; fi`
 
+lib/libbison_a-gl_map.o: lib/gl_map.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-gl_map.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-gl_map.Tpo -c -o lib/libbison_a-gl_map.o `test -f 'lib/gl_map.c' || echo '$(srcdir)/'`lib/gl_map.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-gl_map.Tpo lib/$(DEPDIR)/libbison_a-gl_map.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/gl_map.c' object='lib/libbison_a-gl_map.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gl_map.o `test -f 'lib/gl_map.c' || echo '$(srcdir)/'`lib/gl_map.c
+
+lib/libbison_a-gl_map.obj: lib/gl_map.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-gl_map.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-gl_map.Tpo -c -o lib/libbison_a-gl_map.obj `if test -f 'lib/gl_map.c'; then $(CYGPATH_W) 'lib/gl_map.c'; else $(CYGPATH_W) '$(srcdir)/lib/gl_map.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-gl_map.Tpo lib/$(DEPDIR)/libbison_a-gl_map.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/gl_map.c' object='lib/libbison_a-gl_map.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gl_map.obj `if test -f 'lib/gl_map.c'; then $(CYGPATH_W) 'lib/gl_map.c'; else $(CYGPATH_W) '$(srcdir)/lib/gl_map.c'; fi`
+
 lib/libbison_a-math.o: lib/math.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-math.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-math.Tpo -c -o lib/libbison_a-math.o `test -f 'lib/math.c' || echo '$(srcdir)/'`lib/math.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-math.Tpo lib/$(DEPDIR)/libbison_a-math.Po
@@ -4945,6 +6097,34 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-mbswidth.obj `if test -f 'lib/mbswidth.c'; then $(CYGPATH_W) 'lib/mbswidth.c'; else $(CYGPATH_W) '$(srcdir)/lib/mbswidth.c'; fi`
 
+lib/libbison_a-openat-die.o: lib/openat-die.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-openat-die.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-openat-die.Tpo -c -o lib/libbison_a-openat-die.o `test -f 'lib/openat-die.c' || echo '$(srcdir)/'`lib/openat-die.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-openat-die.Tpo lib/$(DEPDIR)/libbison_a-openat-die.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/openat-die.c' object='lib/libbison_a-openat-die.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-openat-die.o `test -f 'lib/openat-die.c' || echo '$(srcdir)/'`lib/openat-die.c
+
+lib/libbison_a-openat-die.obj: lib/openat-die.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-openat-die.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-openat-die.Tpo -c -o lib/libbison_a-openat-die.obj `if test -f 'lib/openat-die.c'; then $(CYGPATH_W) 'lib/openat-die.c'; else $(CYGPATH_W) '$(srcdir)/lib/openat-die.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-openat-die.Tpo lib/$(DEPDIR)/libbison_a-openat-die.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/openat-die.c' object='lib/libbison_a-openat-die.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-openat-die.obj `if test -f 'lib/openat-die.c'; then $(CYGPATH_W) 'lib/openat-die.c'; else $(CYGPATH_W) '$(srcdir)/lib/openat-die.c'; fi`
+
+lib/libbison_a-gl_oset.o: lib/gl_oset.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-gl_oset.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-gl_oset.Tpo -c -o lib/libbison_a-gl_oset.o `test -f 'lib/gl_oset.c' || echo '$(srcdir)/'`lib/gl_oset.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-gl_oset.Tpo lib/$(DEPDIR)/libbison_a-gl_oset.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/gl_oset.c' object='lib/libbison_a-gl_oset.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gl_oset.o `test -f 'lib/gl_oset.c' || echo '$(srcdir)/'`lib/gl_oset.c
+
+lib/libbison_a-gl_oset.obj: lib/gl_oset.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-gl_oset.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-gl_oset.Tpo -c -o lib/libbison_a-gl_oset.obj `if test -f 'lib/gl_oset.c'; then $(CYGPATH_W) 'lib/gl_oset.c'; else $(CYGPATH_W) '$(srcdir)/lib/gl_oset.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-gl_oset.Tpo lib/$(DEPDIR)/libbison_a-gl_oset.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/gl_oset.c' object='lib/libbison_a-gl_oset.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gl_oset.obj `if test -f 'lib/gl_oset.c'; then $(CYGPATH_W) 'lib/gl_oset.c'; else $(CYGPATH_W) '$(srcdir)/lib/gl_oset.c'; fi`
+
 lib/libbison_a-pipe2.o: lib/pipe2.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-pipe2.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-pipe2.Tpo -c -o lib/libbison_a-pipe2.o `test -f 'lib/pipe2.c' || echo '$(srcdir)/'`lib/pipe2.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-pipe2.Tpo lib/$(DEPDIR)/libbison_a-pipe2.Po
@@ -5029,6 +6209,118 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-quotearg.obj `if test -f 'lib/quotearg.c'; then $(CYGPATH_W) 'lib/quotearg.c'; else $(CYGPATH_W) '$(srcdir)/lib/quotearg.c'; fi`
 
+lib/libbison_a-gl_rbtree_oset.o: lib/gl_rbtree_oset.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-gl_rbtree_oset.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-gl_rbtree_oset.Tpo -c -o lib/libbison_a-gl_rbtree_oset.o `test -f 'lib/gl_rbtree_oset.c' || echo '$(srcdir)/'`lib/gl_rbtree_oset.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-gl_rbtree_oset.Tpo lib/$(DEPDIR)/libbison_a-gl_rbtree_oset.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/gl_rbtree_oset.c' object='lib/libbison_a-gl_rbtree_oset.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gl_rbtree_oset.o `test -f 'lib/gl_rbtree_oset.c' || echo '$(srcdir)/'`lib/gl_rbtree_oset.c
+
+lib/libbison_a-gl_rbtree_oset.obj: lib/gl_rbtree_oset.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-gl_rbtree_oset.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-gl_rbtree_oset.Tpo -c -o lib/libbison_a-gl_rbtree_oset.obj `if test -f 'lib/gl_rbtree_oset.c'; then $(CYGPATH_W) 'lib/gl_rbtree_oset.c'; else $(CYGPATH_W) '$(srcdir)/lib/gl_rbtree_oset.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-gl_rbtree_oset.Tpo lib/$(DEPDIR)/libbison_a-gl_rbtree_oset.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/gl_rbtree_oset.c' object='lib/libbison_a-gl_rbtree_oset.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gl_rbtree_oset.obj `if test -f 'lib/gl_rbtree_oset.c'; then $(CYGPATH_W) 'lib/gl_rbtree_oset.c'; else $(CYGPATH_W) '$(srcdir)/lib/gl_rbtree_oset.c'; fi`
+
+lib/libbison_a-gl_rbtreehash_list.o: lib/gl_rbtreehash_list.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-gl_rbtreehash_list.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-gl_rbtreehash_list.Tpo -c -o lib/libbison_a-gl_rbtreehash_list.o `test -f 'lib/gl_rbtreehash_list.c' || echo '$(srcdir)/'`lib/gl_rbtreehash_list.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-gl_rbtreehash_list.Tpo lib/$(DEPDIR)/libbison_a-gl_rbtreehash_list.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/gl_rbtreehash_list.c' object='lib/libbison_a-gl_rbtreehash_list.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gl_rbtreehash_list.o `test -f 'lib/gl_rbtreehash_list.c' || echo '$(srcdir)/'`lib/gl_rbtreehash_list.c
+
+lib/libbison_a-gl_rbtreehash_list.obj: lib/gl_rbtreehash_list.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-gl_rbtreehash_list.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-gl_rbtreehash_list.Tpo -c -o lib/libbison_a-gl_rbtreehash_list.obj `if test -f 'lib/gl_rbtreehash_list.c'; then $(CYGPATH_W) 'lib/gl_rbtreehash_list.c'; else $(CYGPATH_W) '$(srcdir)/lib/gl_rbtreehash_list.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-gl_rbtreehash_list.Tpo lib/$(DEPDIR)/libbison_a-gl_rbtreehash_list.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/gl_rbtreehash_list.c' object='lib/libbison_a-gl_rbtreehash_list.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gl_rbtreehash_list.obj `if test -f 'lib/gl_rbtreehash_list.c'; then $(CYGPATH_W) 'lib/gl_rbtreehash_list.c'; else $(CYGPATH_W) '$(srcdir)/lib/gl_rbtreehash_list.c'; fi`
+
+lib/libbison_a-save-cwd.o: lib/save-cwd.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-save-cwd.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-save-cwd.Tpo -c -o lib/libbison_a-save-cwd.o `test -f 'lib/save-cwd.c' || echo '$(srcdir)/'`lib/save-cwd.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-save-cwd.Tpo lib/$(DEPDIR)/libbison_a-save-cwd.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/save-cwd.c' object='lib/libbison_a-save-cwd.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-save-cwd.o `test -f 'lib/save-cwd.c' || echo '$(srcdir)/'`lib/save-cwd.c
+
+lib/libbison_a-save-cwd.obj: lib/save-cwd.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-save-cwd.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-save-cwd.Tpo -c -o lib/libbison_a-save-cwd.obj `if test -f 'lib/save-cwd.c'; then $(CYGPATH_W) 'lib/save-cwd.c'; else $(CYGPATH_W) '$(srcdir)/lib/save-cwd.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-save-cwd.Tpo lib/$(DEPDIR)/libbison_a-save-cwd.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/save-cwd.c' object='lib/libbison_a-save-cwd.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-save-cwd.obj `if test -f 'lib/save-cwd.c'; then $(CYGPATH_W) 'lib/save-cwd.c'; else $(CYGPATH_W) '$(srcdir)/lib/save-cwd.c'; fi`
+
+lib/malloc/libbison_a-scratch_buffer_dupfree.o: lib/malloc/scratch_buffer_dupfree.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/malloc/libbison_a-scratch_buffer_dupfree.o -MD -MP -MF lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_dupfree.Tpo -c -o lib/malloc/libbison_a-scratch_buffer_dupfree.o `test -f 'lib/malloc/scratch_buffer_dupfree.c' || echo '$(srcdir)/'`lib/malloc/scratch_buffer_dupfree.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_dupfree.Tpo lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_dupfree.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/malloc/scratch_buffer_dupfree.c' object='lib/malloc/libbison_a-scratch_buffer_dupfree.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/malloc/libbison_a-scratch_buffer_dupfree.o `test -f 'lib/malloc/scratch_buffer_dupfree.c' || echo '$(srcdir)/'`lib/malloc/scratch_buffer_dupfree.c
+
+lib/malloc/libbison_a-scratch_buffer_dupfree.obj: lib/malloc/scratch_buffer_dupfree.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/malloc/libbison_a-scratch_buffer_dupfree.obj -MD -MP -MF lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_dupfree.Tpo -c -o lib/malloc/libbison_a-scratch_buffer_dupfree.obj `if test -f 'lib/malloc/scratch_buffer_dupfree.c'; then $(CYGPATH_W) 'lib/malloc/scratch_buffer_dupfree.c'; else $(CYGPATH_W) '$(srcdir)/lib/malloc/scratch_buffer_dupfree.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_dupfree.Tpo lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_dupfree.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/malloc/scratch_buffer_dupfree.c' object='lib/malloc/libbison_a-scratch_buffer_dupfree.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/malloc/libbison_a-scratch_buffer_dupfree.obj `if test -f 'lib/malloc/scratch_buffer_dupfree.c'; then $(CYGPATH_W) 'lib/malloc/scratch_buffer_dupfree.c'; else $(CYGPATH_W) '$(srcdir)/lib/malloc/scratch_buffer_dupfree.c'; fi`
+
+lib/malloc/libbison_a-scratch_buffer_grow.o: lib/malloc/scratch_buffer_grow.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/malloc/libbison_a-scratch_buffer_grow.o -MD -MP -MF lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow.Tpo -c -o lib/malloc/libbison_a-scratch_buffer_grow.o `test -f 'lib/malloc/scratch_buffer_grow.c' || echo '$(srcdir)/'`lib/malloc/scratch_buffer_grow.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow.Tpo lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/malloc/scratch_buffer_grow.c' object='lib/malloc/libbison_a-scratch_buffer_grow.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/malloc/libbison_a-scratch_buffer_grow.o `test -f 'lib/malloc/scratch_buffer_grow.c' || echo '$(srcdir)/'`lib/malloc/scratch_buffer_grow.c
+
+lib/malloc/libbison_a-scratch_buffer_grow.obj: lib/malloc/scratch_buffer_grow.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/malloc/libbison_a-scratch_buffer_grow.obj -MD -MP -MF lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow.Tpo -c -o lib/malloc/libbison_a-scratch_buffer_grow.obj `if test -f 'lib/malloc/scratch_buffer_grow.c'; then $(CYGPATH_W) 'lib/malloc/scratch_buffer_grow.c'; else $(CYGPATH_W) '$(srcdir)/lib/malloc/scratch_buffer_grow.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow.Tpo lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/malloc/scratch_buffer_grow.c' object='lib/malloc/libbison_a-scratch_buffer_grow.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/malloc/libbison_a-scratch_buffer_grow.obj `if test -f 'lib/malloc/scratch_buffer_grow.c'; then $(CYGPATH_W) 'lib/malloc/scratch_buffer_grow.c'; else $(CYGPATH_W) '$(srcdir)/lib/malloc/scratch_buffer_grow.c'; fi`
+
+lib/malloc/libbison_a-scratch_buffer_grow_preserve.o: lib/malloc/scratch_buffer_grow_preserve.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/malloc/libbison_a-scratch_buffer_grow_preserve.o -MD -MP -MF lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow_preserve.Tpo -c -o lib/malloc/libbison_a-scratch_buffer_grow_preserve.o `test -f 'lib/malloc/scratch_buffer_grow_preserve.c' || echo '$(srcdir)/'`lib/malloc/scratch_buffer_grow_preserve.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow_preserve.Tpo lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow_preserve.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/malloc/scratch_buffer_grow_preserve.c' object='lib/malloc/libbison_a-scratch_buffer_grow_preserve.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/malloc/libbison_a-scratch_buffer_grow_preserve.o `test -f 'lib/malloc/scratch_buffer_grow_preserve.c' || echo '$(srcdir)/'`lib/malloc/scratch_buffer_grow_preserve.c
+
+lib/malloc/libbison_a-scratch_buffer_grow_preserve.obj: lib/malloc/scratch_buffer_grow_preserve.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/malloc/libbison_a-scratch_buffer_grow_preserve.obj -MD -MP -MF lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow_preserve.Tpo -c -o lib/malloc/libbison_a-scratch_buffer_grow_preserve.obj `if test -f 'lib/malloc/scratch_buffer_grow_preserve.c'; then $(CYGPATH_W) 'lib/malloc/scratch_buffer_grow_preserve.c'; else $(CYGPATH_W) '$(srcdir)/lib/malloc/scratch_buffer_grow_preserve.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow_preserve.Tpo lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow_preserve.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/malloc/scratch_buffer_grow_preserve.c' object='lib/malloc/libbison_a-scratch_buffer_grow_preserve.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/malloc/libbison_a-scratch_buffer_grow_preserve.obj `if test -f 'lib/malloc/scratch_buffer_grow_preserve.c'; then $(CYGPATH_W) 'lib/malloc/scratch_buffer_grow_preserve.c'; else $(CYGPATH_W) '$(srcdir)/lib/malloc/scratch_buffer_grow_preserve.c'; fi`
+
+lib/malloc/libbison_a-scratch_buffer_set_array_size.o: lib/malloc/scratch_buffer_set_array_size.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/malloc/libbison_a-scratch_buffer_set_array_size.o -MD -MP -MF lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_set_array_size.Tpo -c -o lib/malloc/libbison_a-scratch_buffer_set_array_size.o `test -f 'lib/malloc/scratch_buffer_set_array_size.c' || echo '$(srcdir)/'`lib/malloc/scratch_buffer_set_array_size.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_set_array_size.Tpo lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_set_array_size.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/malloc/scratch_buffer_set_array_size.c' object='lib/malloc/libbison_a-scratch_buffer_set_array_size.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/malloc/libbison_a-scratch_buffer_set_array_size.o `test -f 'lib/malloc/scratch_buffer_set_array_size.c' || echo '$(srcdir)/'`lib/malloc/scratch_buffer_set_array_size.c
+
+lib/malloc/libbison_a-scratch_buffer_set_array_size.obj: lib/malloc/scratch_buffer_set_array_size.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/malloc/libbison_a-scratch_buffer_set_array_size.obj -MD -MP -MF lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_set_array_size.Tpo -c -o lib/malloc/libbison_a-scratch_buffer_set_array_size.obj `if test -f 'lib/malloc/scratch_buffer_set_array_size.c'; then $(CYGPATH_W) 'lib/malloc/scratch_buffer_set_array_size.c'; else $(CYGPATH_W) '$(srcdir)/lib/malloc/scratch_buffer_set_array_size.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_set_array_size.Tpo lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_set_array_size.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/malloc/scratch_buffer_set_array_size.c' object='lib/malloc/libbison_a-scratch_buffer_set_array_size.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/malloc/libbison_a-scratch_buffer_set_array_size.obj `if test -f 'lib/malloc/scratch_buffer_set_array_size.c'; then $(CYGPATH_W) 'lib/malloc/scratch_buffer_set_array_size.c'; else $(CYGPATH_W) '$(srcdir)/lib/malloc/scratch_buffer_set_array_size.c'; fi`
+
+lib/libbison_a-setlocale_null.o: lib/setlocale_null.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-setlocale_null.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-setlocale_null.Tpo -c -o lib/libbison_a-setlocale_null.o `test -f 'lib/setlocale_null.c' || echo '$(srcdir)/'`lib/setlocale_null.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-setlocale_null.Tpo lib/$(DEPDIR)/libbison_a-setlocale_null.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/setlocale_null.c' object='lib/libbison_a-setlocale_null.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-setlocale_null.o `test -f 'lib/setlocale_null.c' || echo '$(srcdir)/'`lib/setlocale_null.c
+
+lib/libbison_a-setlocale_null.obj: lib/setlocale_null.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-setlocale_null.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-setlocale_null.Tpo -c -o lib/libbison_a-setlocale_null.obj `if test -f 'lib/setlocale_null.c'; then $(CYGPATH_W) 'lib/setlocale_null.c'; else $(CYGPATH_W) '$(srcdir)/lib/setlocale_null.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-setlocale_null.Tpo lib/$(DEPDIR)/libbison_a-setlocale_null.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/setlocale_null.c' object='lib/libbison_a-setlocale_null.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-setlocale_null.obj `if test -f 'lib/setlocale_null.c'; then $(CYGPATH_W) 'lib/setlocale_null.c'; else $(CYGPATH_W) '$(srcdir)/lib/setlocale_null.c'; fi`
+
 lib/libbison_a-sig-handler.o: lib/sig-handler.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-sig-handler.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-sig-handler.Tpo -c -o lib/libbison_a-sig-handler.o `test -f 'lib/sig-handler.c' || echo '$(srcdir)/'`lib/sig-handler.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-sig-handler.Tpo lib/$(DEPDIR)/libbison_a-sig-handler.Po
@@ -5127,6 +6419,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/glthread/libbison_a-tls.obj `if test -f 'lib/glthread/tls.c'; then $(CYGPATH_W) 'lib/glthread/tls.c'; else $(CYGPATH_W) '$(srcdir)/lib/glthread/tls.c'; fi`
 
+lib/libbison_a-unicodeio.o: lib/unicodeio.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-unicodeio.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-unicodeio.Tpo -c -o lib/libbison_a-unicodeio.o `test -f 'lib/unicodeio.c' || echo '$(srcdir)/'`lib/unicodeio.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-unicodeio.Tpo lib/$(DEPDIR)/libbison_a-unicodeio.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/unicodeio.c' object='lib/libbison_a-unicodeio.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-unicodeio.o `test -f 'lib/unicodeio.c' || echo '$(srcdir)/'`lib/unicodeio.c
+
+lib/libbison_a-unicodeio.obj: lib/unicodeio.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-unicodeio.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-unicodeio.Tpo -c -o lib/libbison_a-unicodeio.obj `if test -f 'lib/unicodeio.c'; then $(CYGPATH_W) 'lib/unicodeio.c'; else $(CYGPATH_W) '$(srcdir)/lib/unicodeio.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-unicodeio.Tpo lib/$(DEPDIR)/libbison_a-unicodeio.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/unicodeio.c' object='lib/libbison_a-unicodeio.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-unicodeio.obj `if test -f 'lib/unicodeio.c'; then $(CYGPATH_W) 'lib/unicodeio.c'; else $(CYGPATH_W) '$(srcdir)/lib/unicodeio.c'; fi`
+
 lib/libbison_a-unistd.o: lib/unistd.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-unistd.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-unistd.Tpo -c -o lib/libbison_a-unistd.o `test -f 'lib/unistd.c' || echo '$(srcdir)/'`lib/unistd.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-unistd.Tpo lib/$(DEPDIR)/libbison_a-unistd.Po
@@ -5183,6 +6489,48 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-pipe-safer.obj `if test -f 'lib/pipe-safer.c'; then $(CYGPATH_W) 'lib/pipe-safer.c'; else $(CYGPATH_W) '$(srcdir)/lib/pipe-safer.c'; fi`
 
+lib/unistr/libbison_a-u8-mbtoucr.o: lib/unistr/u8-mbtoucr.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/unistr/libbison_a-u8-mbtoucr.o -MD -MP -MF lib/unistr/$(DEPDIR)/libbison_a-u8-mbtoucr.Tpo -c -o lib/unistr/libbison_a-u8-mbtoucr.o `test -f 'lib/unistr/u8-mbtoucr.c' || echo '$(srcdir)/'`lib/unistr/u8-mbtoucr.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/unistr/$(DEPDIR)/libbison_a-u8-mbtoucr.Tpo lib/unistr/$(DEPDIR)/libbison_a-u8-mbtoucr.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/unistr/u8-mbtoucr.c' object='lib/unistr/libbison_a-u8-mbtoucr.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/unistr/libbison_a-u8-mbtoucr.o `test -f 'lib/unistr/u8-mbtoucr.c' || echo '$(srcdir)/'`lib/unistr/u8-mbtoucr.c
+
+lib/unistr/libbison_a-u8-mbtoucr.obj: lib/unistr/u8-mbtoucr.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/unistr/libbison_a-u8-mbtoucr.obj -MD -MP -MF lib/unistr/$(DEPDIR)/libbison_a-u8-mbtoucr.Tpo -c -o lib/unistr/libbison_a-u8-mbtoucr.obj `if test -f 'lib/unistr/u8-mbtoucr.c'; then $(CYGPATH_W) 'lib/unistr/u8-mbtoucr.c'; else $(CYGPATH_W) '$(srcdir)/lib/unistr/u8-mbtoucr.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/unistr/$(DEPDIR)/libbison_a-u8-mbtoucr.Tpo lib/unistr/$(DEPDIR)/libbison_a-u8-mbtoucr.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/unistr/u8-mbtoucr.c' object='lib/unistr/libbison_a-u8-mbtoucr.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/unistr/libbison_a-u8-mbtoucr.obj `if test -f 'lib/unistr/u8-mbtoucr.c'; then $(CYGPATH_W) 'lib/unistr/u8-mbtoucr.c'; else $(CYGPATH_W) '$(srcdir)/lib/unistr/u8-mbtoucr.c'; fi`
+
+lib/unistr/libbison_a-u8-uctomb.o: lib/unistr/u8-uctomb.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/unistr/libbison_a-u8-uctomb.o -MD -MP -MF lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb.Tpo -c -o lib/unistr/libbison_a-u8-uctomb.o `test -f 'lib/unistr/u8-uctomb.c' || echo '$(srcdir)/'`lib/unistr/u8-uctomb.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb.Tpo lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/unistr/u8-uctomb.c' object='lib/unistr/libbison_a-u8-uctomb.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/unistr/libbison_a-u8-uctomb.o `test -f 'lib/unistr/u8-uctomb.c' || echo '$(srcdir)/'`lib/unistr/u8-uctomb.c
+
+lib/unistr/libbison_a-u8-uctomb.obj: lib/unistr/u8-uctomb.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/unistr/libbison_a-u8-uctomb.obj -MD -MP -MF lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb.Tpo -c -o lib/unistr/libbison_a-u8-uctomb.obj `if test -f 'lib/unistr/u8-uctomb.c'; then $(CYGPATH_W) 'lib/unistr/u8-uctomb.c'; else $(CYGPATH_W) '$(srcdir)/lib/unistr/u8-uctomb.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb.Tpo lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/unistr/u8-uctomb.c' object='lib/unistr/libbison_a-u8-uctomb.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/unistr/libbison_a-u8-uctomb.obj `if test -f 'lib/unistr/u8-uctomb.c'; then $(CYGPATH_W) 'lib/unistr/u8-uctomb.c'; else $(CYGPATH_W) '$(srcdir)/lib/unistr/u8-uctomb.c'; fi`
+
+lib/unistr/libbison_a-u8-uctomb-aux.o: lib/unistr/u8-uctomb-aux.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/unistr/libbison_a-u8-uctomb-aux.o -MD -MP -MF lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb-aux.Tpo -c -o lib/unistr/libbison_a-u8-uctomb-aux.o `test -f 'lib/unistr/u8-uctomb-aux.c' || echo '$(srcdir)/'`lib/unistr/u8-uctomb-aux.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb-aux.Tpo lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb-aux.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/unistr/u8-uctomb-aux.c' object='lib/unistr/libbison_a-u8-uctomb-aux.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/unistr/libbison_a-u8-uctomb-aux.o `test -f 'lib/unistr/u8-uctomb-aux.c' || echo '$(srcdir)/'`lib/unistr/u8-uctomb-aux.c
+
+lib/unistr/libbison_a-u8-uctomb-aux.obj: lib/unistr/u8-uctomb-aux.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/unistr/libbison_a-u8-uctomb-aux.obj -MD -MP -MF lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb-aux.Tpo -c -o lib/unistr/libbison_a-u8-uctomb-aux.obj `if test -f 'lib/unistr/u8-uctomb-aux.c'; then $(CYGPATH_W) 'lib/unistr/u8-uctomb-aux.c'; else $(CYGPATH_W) '$(srcdir)/lib/unistr/u8-uctomb-aux.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb-aux.Tpo lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb-aux.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/unistr/u8-uctomb-aux.c' object='lib/unistr/libbison_a-u8-uctomb-aux.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/unistr/libbison_a-u8-uctomb-aux.obj `if test -f 'lib/unistr/u8-uctomb-aux.c'; then $(CYGPATH_W) 'lib/unistr/u8-uctomb-aux.c'; else $(CYGPATH_W) '$(srcdir)/lib/unistr/u8-uctomb-aux.c'; fi`
+
 lib/uniwidth/libbison_a-width.o: lib/uniwidth/width.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/uniwidth/libbison_a-width.o -MD -MP -MF lib/uniwidth/$(DEPDIR)/libbison_a-width.Tpo -c -o lib/uniwidth/libbison_a-width.o `test -f 'lib/uniwidth/width.c' || echo '$(srcdir)/'`lib/uniwidth/width.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/uniwidth/$(DEPDIR)/libbison_a-width.Tpo lib/uniwidth/$(DEPDIR)/libbison_a-width.Po
@@ -5295,6 +6643,34 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gl_xlist.obj `if test -f 'lib/gl_xlist.c'; then $(CYGPATH_W) 'lib/gl_xlist.c'; else $(CYGPATH_W) '$(srcdir)/lib/gl_xlist.c'; fi`
 
+lib/libbison_a-gl_xmap.o: lib/gl_xmap.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-gl_xmap.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-gl_xmap.Tpo -c -o lib/libbison_a-gl_xmap.o `test -f 'lib/gl_xmap.c' || echo '$(srcdir)/'`lib/gl_xmap.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-gl_xmap.Tpo lib/$(DEPDIR)/libbison_a-gl_xmap.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/gl_xmap.c' object='lib/libbison_a-gl_xmap.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gl_xmap.o `test -f 'lib/gl_xmap.c' || echo '$(srcdir)/'`lib/gl_xmap.c
+
+lib/libbison_a-gl_xmap.obj: lib/gl_xmap.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-gl_xmap.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-gl_xmap.Tpo -c -o lib/libbison_a-gl_xmap.obj `if test -f 'lib/gl_xmap.c'; then $(CYGPATH_W) 'lib/gl_xmap.c'; else $(CYGPATH_W) '$(srcdir)/lib/gl_xmap.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-gl_xmap.Tpo lib/$(DEPDIR)/libbison_a-gl_xmap.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/gl_xmap.c' object='lib/libbison_a-gl_xmap.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gl_xmap.obj `if test -f 'lib/gl_xmap.c'; then $(CYGPATH_W) 'lib/gl_xmap.c'; else $(CYGPATH_W) '$(srcdir)/lib/gl_xmap.c'; fi`
+
+lib/libbison_a-xmemdup0.o: lib/xmemdup0.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-xmemdup0.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-xmemdup0.Tpo -c -o lib/libbison_a-xmemdup0.o `test -f 'lib/xmemdup0.c' || echo '$(srcdir)/'`lib/xmemdup0.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-xmemdup0.Tpo lib/$(DEPDIR)/libbison_a-xmemdup0.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/xmemdup0.c' object='lib/libbison_a-xmemdup0.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-xmemdup0.o `test -f 'lib/xmemdup0.c' || echo '$(srcdir)/'`lib/xmemdup0.c
+
+lib/libbison_a-xmemdup0.obj: lib/xmemdup0.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-xmemdup0.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-xmemdup0.Tpo -c -o lib/libbison_a-xmemdup0.obj `if test -f 'lib/xmemdup0.c'; then $(CYGPATH_W) 'lib/xmemdup0.c'; else $(CYGPATH_W) '$(srcdir)/lib/xmemdup0.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-xmemdup0.Tpo lib/$(DEPDIR)/libbison_a-xmemdup0.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/xmemdup0.c' object='lib/libbison_a-xmemdup0.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-xmemdup0.obj `if test -f 'lib/xmemdup0.c'; then $(CYGPATH_W) 'lib/xmemdup0.c'; else $(CYGPATH_W) '$(srcdir)/lib/xmemdup0.c'; fi`
+
 lib/libbison_a-xreadlink.o: lib/xreadlink.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-xreadlink.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-xreadlink.Tpo -c -o lib/libbison_a-xreadlink.o `test -f 'lib/xreadlink.c' || echo '$(srcdir)/'`lib/xreadlink.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-xreadlink.Tpo lib/$(DEPDIR)/libbison_a-xreadlink.Po
@@ -5365,6 +6741,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-path-join.obj `if test -f 'lib/path-join.c'; then $(CYGPATH_W) 'lib/path-join.c'; else $(CYGPATH_W) '$(srcdir)/lib/path-join.c'; fi`
 
+lib/libbison_a-access.o: lib/access.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-access.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-access.Tpo -c -o lib/libbison_a-access.o `test -f 'lib/access.c' || echo '$(srcdir)/'`lib/access.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-access.Tpo lib/$(DEPDIR)/libbison_a-access.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/access.c' object='lib/libbison_a-access.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-access.o `test -f 'lib/access.c' || echo '$(srcdir)/'`lib/access.c
+
+lib/libbison_a-access.obj: lib/access.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-access.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-access.Tpo -c -o lib/libbison_a-access.obj `if test -f 'lib/access.c'; then $(CYGPATH_W) 'lib/access.c'; else $(CYGPATH_W) '$(srcdir)/lib/access.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-access.Tpo lib/$(DEPDIR)/libbison_a-access.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/access.c' object='lib/libbison_a-access.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-access.obj `if test -f 'lib/access.c'; then $(CYGPATH_W) 'lib/access.c'; else $(CYGPATH_W) '$(srcdir)/lib/access.c'; fi`
+
 lib/libbison_a-calloc.o: lib/calloc.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-calloc.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-calloc.Tpo -c -o lib/libbison_a-calloc.o `test -f 'lib/calloc.c' || echo '$(srcdir)/'`lib/calloc.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-calloc.Tpo lib/$(DEPDIR)/libbison_a-calloc.Po
@@ -5393,6 +6783,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-canonicalize-lgpl.obj `if test -f 'lib/canonicalize-lgpl.c'; then $(CYGPATH_W) 'lib/canonicalize-lgpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/canonicalize-lgpl.c'; fi`
 
+lib/libbison_a-chdir-long.o: lib/chdir-long.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-chdir-long.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-chdir-long.Tpo -c -o lib/libbison_a-chdir-long.o `test -f 'lib/chdir-long.c' || echo '$(srcdir)/'`lib/chdir-long.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-chdir-long.Tpo lib/$(DEPDIR)/libbison_a-chdir-long.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/chdir-long.c' object='lib/libbison_a-chdir-long.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-chdir-long.o `test -f 'lib/chdir-long.c' || echo '$(srcdir)/'`lib/chdir-long.c
+
+lib/libbison_a-chdir-long.obj: lib/chdir-long.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-chdir-long.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-chdir-long.Tpo -c -o lib/libbison_a-chdir-long.obj `if test -f 'lib/chdir-long.c'; then $(CYGPATH_W) 'lib/chdir-long.c'; else $(CYGPATH_W) '$(srcdir)/lib/chdir-long.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-chdir-long.Tpo lib/$(DEPDIR)/libbison_a-chdir-long.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/chdir-long.c' object='lib/libbison_a-chdir-long.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-chdir-long.obj `if test -f 'lib/chdir-long.c'; then $(CYGPATH_W) 'lib/chdir-long.c'; else $(CYGPATH_W) '$(srcdir)/lib/chdir-long.c'; fi`
+
 lib/libbison_a-close.o: lib/close.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-close.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-close.Tpo -c -o lib/libbison_a-close.o `test -f 'lib/close.c' || echo '$(srcdir)/'`lib/close.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-close.Tpo lib/$(DEPDIR)/libbison_a-close.Po
@@ -5407,6 +6811,48 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-close.obj `if test -f 'lib/close.c'; then $(CYGPATH_W) 'lib/close.c'; else $(CYGPATH_W) '$(srcdir)/lib/close.c'; fi`
 
+lib/libbison_a-closedir.o: lib/closedir.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-closedir.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-closedir.Tpo -c -o lib/libbison_a-closedir.o `test -f 'lib/closedir.c' || echo '$(srcdir)/'`lib/closedir.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-closedir.Tpo lib/$(DEPDIR)/libbison_a-closedir.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/closedir.c' object='lib/libbison_a-closedir.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-closedir.o `test -f 'lib/closedir.c' || echo '$(srcdir)/'`lib/closedir.c
+
+lib/libbison_a-closedir.obj: lib/closedir.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-closedir.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-closedir.Tpo -c -o lib/libbison_a-closedir.obj `if test -f 'lib/closedir.c'; then $(CYGPATH_W) 'lib/closedir.c'; else $(CYGPATH_W) '$(srcdir)/lib/closedir.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-closedir.Tpo lib/$(DEPDIR)/libbison_a-closedir.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/closedir.c' object='lib/libbison_a-closedir.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-closedir.obj `if test -f 'lib/closedir.c'; then $(CYGPATH_W) 'lib/closedir.c'; else $(CYGPATH_W) '$(srcdir)/lib/closedir.c'; fi`
+
+lib/libbison_a-dirfd.o: lib/dirfd.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-dirfd.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-dirfd.Tpo -c -o lib/libbison_a-dirfd.o `test -f 'lib/dirfd.c' || echo '$(srcdir)/'`lib/dirfd.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-dirfd.Tpo lib/$(DEPDIR)/libbison_a-dirfd.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/dirfd.c' object='lib/libbison_a-dirfd.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-dirfd.o `test -f 'lib/dirfd.c' || echo '$(srcdir)/'`lib/dirfd.c
+
+lib/libbison_a-dirfd.obj: lib/dirfd.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-dirfd.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-dirfd.Tpo -c -o lib/libbison_a-dirfd.obj `if test -f 'lib/dirfd.c'; then $(CYGPATH_W) 'lib/dirfd.c'; else $(CYGPATH_W) '$(srcdir)/lib/dirfd.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-dirfd.Tpo lib/$(DEPDIR)/libbison_a-dirfd.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/dirfd.c' object='lib/libbison_a-dirfd.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-dirfd.obj `if test -f 'lib/dirfd.c'; then $(CYGPATH_W) 'lib/dirfd.c'; else $(CYGPATH_W) '$(srcdir)/lib/dirfd.c'; fi`
+
+lib/libbison_a-dup.o: lib/dup.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-dup.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-dup.Tpo -c -o lib/libbison_a-dup.o `test -f 'lib/dup.c' || echo '$(srcdir)/'`lib/dup.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-dup.Tpo lib/$(DEPDIR)/libbison_a-dup.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/dup.c' object='lib/libbison_a-dup.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-dup.o `test -f 'lib/dup.c' || echo '$(srcdir)/'`lib/dup.c
+
+lib/libbison_a-dup.obj: lib/dup.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-dup.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-dup.Tpo -c -o lib/libbison_a-dup.obj `if test -f 'lib/dup.c'; then $(CYGPATH_W) 'lib/dup.c'; else $(CYGPATH_W) '$(srcdir)/lib/dup.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-dup.Tpo lib/$(DEPDIR)/libbison_a-dup.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/dup.c' object='lib/libbison_a-dup.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-dup.obj `if test -f 'lib/dup.c'; then $(CYGPATH_W) 'lib/dup.c'; else $(CYGPATH_W) '$(srcdir)/lib/dup.c'; fi`
+
 lib/libbison_a-dup2.o: lib/dup2.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-dup2.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-dup2.Tpo -c -o lib/libbison_a-dup2.o `test -f 'lib/dup2.c' || echo '$(srcdir)/'`lib/dup2.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-dup2.Tpo lib/$(DEPDIR)/libbison_a-dup2.Po
@@ -5435,6 +6881,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-error.obj `if test -f 'lib/error.c'; then $(CYGPATH_W) 'lib/error.c'; else $(CYGPATH_W) '$(srcdir)/lib/error.c'; fi`
 
+lib/libbison_a-fchdir.o: lib/fchdir.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-fchdir.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-fchdir.Tpo -c -o lib/libbison_a-fchdir.o `test -f 'lib/fchdir.c' || echo '$(srcdir)/'`lib/fchdir.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-fchdir.Tpo lib/$(DEPDIR)/libbison_a-fchdir.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/fchdir.c' object='lib/libbison_a-fchdir.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-fchdir.o `test -f 'lib/fchdir.c' || echo '$(srcdir)/'`lib/fchdir.c
+
+lib/libbison_a-fchdir.obj: lib/fchdir.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-fchdir.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-fchdir.Tpo -c -o lib/libbison_a-fchdir.obj `if test -f 'lib/fchdir.c'; then $(CYGPATH_W) 'lib/fchdir.c'; else $(CYGPATH_W) '$(srcdir)/lib/fchdir.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-fchdir.Tpo lib/$(DEPDIR)/libbison_a-fchdir.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/fchdir.c' object='lib/libbison_a-fchdir.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-fchdir.obj `if test -f 'lib/fchdir.c'; then $(CYGPATH_W) 'lib/fchdir.c'; else $(CYGPATH_W) '$(srcdir)/lib/fchdir.c'; fi`
+
 lib/libbison_a-fcntl.o: lib/fcntl.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-fcntl.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-fcntl.Tpo -c -o lib/libbison_a-fcntl.o `test -f 'lib/fcntl.c' || echo '$(srcdir)/'`lib/fcntl.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-fcntl.Tpo lib/$(DEPDIR)/libbison_a-fcntl.Po
@@ -5449,6 +6909,48 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-fcntl.obj `if test -f 'lib/fcntl.c'; then $(CYGPATH_W) 'lib/fcntl.c'; else $(CYGPATH_W) '$(srcdir)/lib/fcntl.c'; fi`
 
+lib/libbison_a-fdopendir.o: lib/fdopendir.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-fdopendir.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-fdopendir.Tpo -c -o lib/libbison_a-fdopendir.o `test -f 'lib/fdopendir.c' || echo '$(srcdir)/'`lib/fdopendir.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-fdopendir.Tpo lib/$(DEPDIR)/libbison_a-fdopendir.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/fdopendir.c' object='lib/libbison_a-fdopendir.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-fdopendir.o `test -f 'lib/fdopendir.c' || echo '$(srcdir)/'`lib/fdopendir.c
+
+lib/libbison_a-fdopendir.obj: lib/fdopendir.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-fdopendir.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-fdopendir.Tpo -c -o lib/libbison_a-fdopendir.obj `if test -f 'lib/fdopendir.c'; then $(CYGPATH_W) 'lib/fdopendir.c'; else $(CYGPATH_W) '$(srcdir)/lib/fdopendir.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-fdopendir.Tpo lib/$(DEPDIR)/libbison_a-fdopendir.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/fdopendir.c' object='lib/libbison_a-fdopendir.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-fdopendir.obj `if test -f 'lib/fdopendir.c'; then $(CYGPATH_W) 'lib/fdopendir.c'; else $(CYGPATH_W) '$(srcdir)/lib/fdopendir.c'; fi`
+
+lib/libbison_a-ffs.o: lib/ffs.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-ffs.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-ffs.Tpo -c -o lib/libbison_a-ffs.o `test -f 'lib/ffs.c' || echo '$(srcdir)/'`lib/ffs.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-ffs.Tpo lib/$(DEPDIR)/libbison_a-ffs.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/ffs.c' object='lib/libbison_a-ffs.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-ffs.o `test -f 'lib/ffs.c' || echo '$(srcdir)/'`lib/ffs.c
+
+lib/libbison_a-ffs.obj: lib/ffs.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-ffs.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-ffs.Tpo -c -o lib/libbison_a-ffs.obj `if test -f 'lib/ffs.c'; then $(CYGPATH_W) 'lib/ffs.c'; else $(CYGPATH_W) '$(srcdir)/lib/ffs.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-ffs.Tpo lib/$(DEPDIR)/libbison_a-ffs.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/ffs.c' object='lib/libbison_a-ffs.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-ffs.obj `if test -f 'lib/ffs.c'; then $(CYGPATH_W) 'lib/ffs.c'; else $(CYGPATH_W) '$(srcdir)/lib/ffs.c'; fi`
+
+lib/libbison_a-ffsl.o: lib/ffsl.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-ffsl.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-ffsl.Tpo -c -o lib/libbison_a-ffsl.o `test -f 'lib/ffsl.c' || echo '$(srcdir)/'`lib/ffsl.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-ffsl.Tpo lib/$(DEPDIR)/libbison_a-ffsl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/ffsl.c' object='lib/libbison_a-ffsl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-ffsl.o `test -f 'lib/ffsl.c' || echo '$(srcdir)/'`lib/ffsl.c
+
+lib/libbison_a-ffsl.obj: lib/ffsl.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-ffsl.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-ffsl.Tpo -c -o lib/libbison_a-ffsl.obj `if test -f 'lib/ffsl.c'; then $(CYGPATH_W) 'lib/ffsl.c'; else $(CYGPATH_W) '$(srcdir)/lib/ffsl.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-ffsl.Tpo lib/$(DEPDIR)/libbison_a-ffsl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/ffsl.c' object='lib/libbison_a-ffsl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-ffsl.obj `if test -f 'lib/ffsl.c'; then $(CYGPATH_W) 'lib/ffsl.c'; else $(CYGPATH_W) '$(srcdir)/lib/ffsl.c'; fi`
+
 lib/libbison_a-float.o: lib/float.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-float.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-float.Tpo -c -o lib/libbison_a-float.o `test -f 'lib/float.c' || echo '$(srcdir)/'`lib/float.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-float.Tpo lib/$(DEPDIR)/libbison_a-float.Po
@@ -5519,6 +7021,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-fprintf.obj `if test -f 'lib/fprintf.c'; then $(CYGPATH_W) 'lib/fprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/fprintf.c'; fi`
 
+lib/libbison_a-free.o: lib/free.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-free.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-free.Tpo -c -o lib/libbison_a-free.o `test -f 'lib/free.c' || echo '$(srcdir)/'`lib/free.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-free.Tpo lib/$(DEPDIR)/libbison_a-free.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/free.c' object='lib/libbison_a-free.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-free.o `test -f 'lib/free.c' || echo '$(srcdir)/'`lib/free.c
+
+lib/libbison_a-free.obj: lib/free.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-free.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-free.Tpo -c -o lib/libbison_a-free.obj `if test -f 'lib/free.c'; then $(CYGPATH_W) 'lib/free.c'; else $(CYGPATH_W) '$(srcdir)/lib/free.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-free.Tpo lib/$(DEPDIR)/libbison_a-free.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/free.c' object='lib/libbison_a-free.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-free.obj `if test -f 'lib/free.c'; then $(CYGPATH_W) 'lib/free.c'; else $(CYGPATH_W) '$(srcdir)/lib/free.c'; fi`
+
 lib/libbison_a-frexp.o: lib/frexp.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-frexp.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-frexp.Tpo -c -o lib/libbison_a-frexp.o `test -f 'lib/frexp.c' || echo '$(srcdir)/'`lib/frexp.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-frexp.Tpo lib/$(DEPDIR)/libbison_a-frexp.Po
@@ -5589,6 +7105,34 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-stat-w32.obj `if test -f 'lib/stat-w32.c'; then $(CYGPATH_W) 'lib/stat-w32.c'; else $(CYGPATH_W) '$(srcdir)/lib/stat-w32.c'; fi`
 
+lib/libbison_a-at-func.o: lib/at-func.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-at-func.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-at-func.Tpo -c -o lib/libbison_a-at-func.o `test -f 'lib/at-func.c' || echo '$(srcdir)/'`lib/at-func.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-at-func.Tpo lib/$(DEPDIR)/libbison_a-at-func.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/at-func.c' object='lib/libbison_a-at-func.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-at-func.o `test -f 'lib/at-func.c' || echo '$(srcdir)/'`lib/at-func.c
+
+lib/libbison_a-at-func.obj: lib/at-func.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-at-func.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-at-func.Tpo -c -o lib/libbison_a-at-func.obj `if test -f 'lib/at-func.c'; then $(CYGPATH_W) 'lib/at-func.c'; else $(CYGPATH_W) '$(srcdir)/lib/at-func.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-at-func.Tpo lib/$(DEPDIR)/libbison_a-at-func.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/at-func.c' object='lib/libbison_a-at-func.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-at-func.obj `if test -f 'lib/at-func.c'; then $(CYGPATH_W) 'lib/at-func.c'; else $(CYGPATH_W) '$(srcdir)/lib/at-func.c'; fi`
+
+lib/libbison_a-fstatat.o: lib/fstatat.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-fstatat.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-fstatat.Tpo -c -o lib/libbison_a-fstatat.o `test -f 'lib/fstatat.c' || echo '$(srcdir)/'`lib/fstatat.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-fstatat.Tpo lib/$(DEPDIR)/libbison_a-fstatat.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/fstatat.c' object='lib/libbison_a-fstatat.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-fstatat.o `test -f 'lib/fstatat.c' || echo '$(srcdir)/'`lib/fstatat.c
+
+lib/libbison_a-fstatat.obj: lib/fstatat.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-fstatat.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-fstatat.Tpo -c -o lib/libbison_a-fstatat.obj `if test -f 'lib/fstatat.c'; then $(CYGPATH_W) 'lib/fstatat.c'; else $(CYGPATH_W) '$(srcdir)/lib/fstatat.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-fstatat.Tpo lib/$(DEPDIR)/libbison_a-fstatat.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/fstatat.c' object='lib/libbison_a-fstatat.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-fstatat.obj `if test -f 'lib/fstatat.c'; then $(CYGPATH_W) 'lib/fstatat.c'; else $(CYGPATH_W) '$(srcdir)/lib/fstatat.c'; fi`
+
 lib/libbison_a-fsync.o: lib/fsync.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-fsync.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-fsync.Tpo -c -o lib/libbison_a-fsync.o `test -f 'lib/fsync.c' || echo '$(srcdir)/'`lib/fsync.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-fsync.Tpo lib/$(DEPDIR)/libbison_a-fsync.Po
@@ -5603,6 +7147,48 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-fsync.obj `if test -f 'lib/fsync.c'; then $(CYGPATH_W) 'lib/fsync.c'; else $(CYGPATH_W) '$(srcdir)/lib/fsync.c'; fi`
 
+lib/libbison_a-getcwd.o: lib/getcwd.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-getcwd.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-getcwd.Tpo -c -o lib/libbison_a-getcwd.o `test -f 'lib/getcwd.c' || echo '$(srcdir)/'`lib/getcwd.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-getcwd.Tpo lib/$(DEPDIR)/libbison_a-getcwd.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/getcwd.c' object='lib/libbison_a-getcwd.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-getcwd.o `test -f 'lib/getcwd.c' || echo '$(srcdir)/'`lib/getcwd.c
+
+lib/libbison_a-getcwd.obj: lib/getcwd.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-getcwd.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-getcwd.Tpo -c -o lib/libbison_a-getcwd.obj `if test -f 'lib/getcwd.c'; then $(CYGPATH_W) 'lib/getcwd.c'; else $(CYGPATH_W) '$(srcdir)/lib/getcwd.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-getcwd.Tpo lib/$(DEPDIR)/libbison_a-getcwd.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/getcwd.c' object='lib/libbison_a-getcwd.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-getcwd.obj `if test -f 'lib/getcwd.c'; then $(CYGPATH_W) 'lib/getcwd.c'; else $(CYGPATH_W) '$(srcdir)/lib/getcwd.c'; fi`
+
+lib/libbison_a-getcwd-lgpl.o: lib/getcwd-lgpl.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-getcwd-lgpl.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-getcwd-lgpl.Tpo -c -o lib/libbison_a-getcwd-lgpl.o `test -f 'lib/getcwd-lgpl.c' || echo '$(srcdir)/'`lib/getcwd-lgpl.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-getcwd-lgpl.Tpo lib/$(DEPDIR)/libbison_a-getcwd-lgpl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/getcwd-lgpl.c' object='lib/libbison_a-getcwd-lgpl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-getcwd-lgpl.o `test -f 'lib/getcwd-lgpl.c' || echo '$(srcdir)/'`lib/getcwd-lgpl.c
+
+lib/libbison_a-getcwd-lgpl.obj: lib/getcwd-lgpl.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-getcwd-lgpl.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-getcwd-lgpl.Tpo -c -o lib/libbison_a-getcwd-lgpl.obj `if test -f 'lib/getcwd-lgpl.c'; then $(CYGPATH_W) 'lib/getcwd-lgpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/getcwd-lgpl.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-getcwd-lgpl.Tpo lib/$(DEPDIR)/libbison_a-getcwd-lgpl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/getcwd-lgpl.c' object='lib/libbison_a-getcwd-lgpl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-getcwd-lgpl.obj `if test -f 'lib/getcwd-lgpl.c'; then $(CYGPATH_W) 'lib/getcwd-lgpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/getcwd-lgpl.c'; fi`
+
+lib/libbison_a-getdelim.o: lib/getdelim.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-getdelim.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-getdelim.Tpo -c -o lib/libbison_a-getdelim.o `test -f 'lib/getdelim.c' || echo '$(srcdir)/'`lib/getdelim.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-getdelim.Tpo lib/$(DEPDIR)/libbison_a-getdelim.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/getdelim.c' object='lib/libbison_a-getdelim.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-getdelim.o `test -f 'lib/getdelim.c' || echo '$(srcdir)/'`lib/getdelim.c
+
+lib/libbison_a-getdelim.obj: lib/getdelim.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-getdelim.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-getdelim.Tpo -c -o lib/libbison_a-getdelim.obj `if test -f 'lib/getdelim.c'; then $(CYGPATH_W) 'lib/getdelim.c'; else $(CYGPATH_W) '$(srcdir)/lib/getdelim.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-getdelim.Tpo lib/$(DEPDIR)/libbison_a-getdelim.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/getdelim.c' object='lib/libbison_a-getdelim.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-getdelim.obj `if test -f 'lib/getdelim.c'; then $(CYGPATH_W) 'lib/getdelim.c'; else $(CYGPATH_W) '$(srcdir)/lib/getdelim.c'; fi`
+
 lib/libbison_a-getdtablesize.o: lib/getdtablesize.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-getdtablesize.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-getdtablesize.Tpo -c -o lib/libbison_a-getdtablesize.o `test -f 'lib/getdtablesize.c' || echo '$(srcdir)/'`lib/getdtablesize.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-getdtablesize.Tpo lib/$(DEPDIR)/libbison_a-getdtablesize.Po
@@ -5617,6 +7203,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-getdtablesize.obj `if test -f 'lib/getdtablesize.c'; then $(CYGPATH_W) 'lib/getdtablesize.c'; else $(CYGPATH_W) '$(srcdir)/lib/getdtablesize.c'; fi`
 
+lib/libbison_a-getline.o: lib/getline.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-getline.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-getline.Tpo -c -o lib/libbison_a-getline.o `test -f 'lib/getline.c' || echo '$(srcdir)/'`lib/getline.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-getline.Tpo lib/$(DEPDIR)/libbison_a-getline.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/getline.c' object='lib/libbison_a-getline.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-getline.o `test -f 'lib/getline.c' || echo '$(srcdir)/'`lib/getline.c
+
+lib/libbison_a-getline.obj: lib/getline.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-getline.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-getline.Tpo -c -o lib/libbison_a-getline.obj `if test -f 'lib/getline.c'; then $(CYGPATH_W) 'lib/getline.c'; else $(CYGPATH_W) '$(srcdir)/lib/getline.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-getline.Tpo lib/$(DEPDIR)/libbison_a-getline.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/getline.c' object='lib/libbison_a-getline.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-getline.obj `if test -f 'lib/getline.c'; then $(CYGPATH_W) 'lib/getline.c'; else $(CYGPATH_W) '$(srcdir)/lib/getline.c'; fi`
+
 lib/libbison_a-getopt.o: lib/getopt.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-getopt.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-getopt.Tpo -c -o lib/libbison_a-getopt.o `test -f 'lib/getopt.c' || echo '$(srcdir)/'`lib/getopt.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-getopt.Tpo lib/$(DEPDIR)/libbison_a-getopt.Po
@@ -5673,6 +7273,48 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-gettimeofday.obj `if test -f 'lib/gettimeofday.c'; then $(CYGPATH_W) 'lib/gettimeofday.c'; else $(CYGPATH_W) '$(srcdir)/lib/gettimeofday.c'; fi`
 
+lib/libbison_a-iconv.o: lib/iconv.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-iconv.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-iconv.Tpo -c -o lib/libbison_a-iconv.o `test -f 'lib/iconv.c' || echo '$(srcdir)/'`lib/iconv.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-iconv.Tpo lib/$(DEPDIR)/libbison_a-iconv.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/iconv.c' object='lib/libbison_a-iconv.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-iconv.o `test -f 'lib/iconv.c' || echo '$(srcdir)/'`lib/iconv.c
+
+lib/libbison_a-iconv.obj: lib/iconv.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-iconv.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-iconv.Tpo -c -o lib/libbison_a-iconv.obj `if test -f 'lib/iconv.c'; then $(CYGPATH_W) 'lib/iconv.c'; else $(CYGPATH_W) '$(srcdir)/lib/iconv.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-iconv.Tpo lib/$(DEPDIR)/libbison_a-iconv.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/iconv.c' object='lib/libbison_a-iconv.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-iconv.obj `if test -f 'lib/iconv.c'; then $(CYGPATH_W) 'lib/iconv.c'; else $(CYGPATH_W) '$(srcdir)/lib/iconv.c'; fi`
+
+lib/libbison_a-iconv_close.o: lib/iconv_close.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-iconv_close.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-iconv_close.Tpo -c -o lib/libbison_a-iconv_close.o `test -f 'lib/iconv_close.c' || echo '$(srcdir)/'`lib/iconv_close.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-iconv_close.Tpo lib/$(DEPDIR)/libbison_a-iconv_close.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/iconv_close.c' object='lib/libbison_a-iconv_close.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-iconv_close.o `test -f 'lib/iconv_close.c' || echo '$(srcdir)/'`lib/iconv_close.c
+
+lib/libbison_a-iconv_close.obj: lib/iconv_close.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-iconv_close.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-iconv_close.Tpo -c -o lib/libbison_a-iconv_close.obj `if test -f 'lib/iconv_close.c'; then $(CYGPATH_W) 'lib/iconv_close.c'; else $(CYGPATH_W) '$(srcdir)/lib/iconv_close.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-iconv_close.Tpo lib/$(DEPDIR)/libbison_a-iconv_close.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/iconv_close.c' object='lib/libbison_a-iconv_close.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-iconv_close.obj `if test -f 'lib/iconv_close.c'; then $(CYGPATH_W) 'lib/iconv_close.c'; else $(CYGPATH_W) '$(srcdir)/lib/iconv_close.c'; fi`
+
+lib/libbison_a-iconv_open.o: lib/iconv_open.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-iconv_open.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-iconv_open.Tpo -c -o lib/libbison_a-iconv_open.o `test -f 'lib/iconv_open.c' || echo '$(srcdir)/'`lib/iconv_open.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-iconv_open.Tpo lib/$(DEPDIR)/libbison_a-iconv_open.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/iconv_open.c' object='lib/libbison_a-iconv_open.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-iconv_open.o `test -f 'lib/iconv_open.c' || echo '$(srcdir)/'`lib/iconv_open.c
+
+lib/libbison_a-iconv_open.obj: lib/iconv_open.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-iconv_open.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-iconv_open.Tpo -c -o lib/libbison_a-iconv_open.obj `if test -f 'lib/iconv_open.c'; then $(CYGPATH_W) 'lib/iconv_open.c'; else $(CYGPATH_W) '$(srcdir)/lib/iconv_open.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-iconv_open.Tpo lib/$(DEPDIR)/libbison_a-iconv_open.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/iconv_open.c' object='lib/libbison_a-iconv_open.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-iconv_open.obj `if test -f 'lib/iconv_open.c'; then $(CYGPATH_W) 'lib/iconv_open.c'; else $(CYGPATH_W) '$(srcdir)/lib/iconv_open.c'; fi`
+
 lib/libbison_a-isnan.o: lib/isnan.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-isnan.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-isnan.Tpo -c -o lib/libbison_a-isnan.o `test -f 'lib/isnan.c' || echo '$(srcdir)/'`lib/isnan.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-isnan.Tpo lib/$(DEPDIR)/libbison_a-isnan.Po
@@ -5743,6 +7385,34 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-iswblank.obj `if test -f 'lib/iswblank.c'; then $(CYGPATH_W) 'lib/iswblank.c'; else $(CYGPATH_W) '$(srcdir)/lib/iswblank.c'; fi`
 
+lib/libbison_a-iswdigit.o: lib/iswdigit.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-iswdigit.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-iswdigit.Tpo -c -o lib/libbison_a-iswdigit.o `test -f 'lib/iswdigit.c' || echo '$(srcdir)/'`lib/iswdigit.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-iswdigit.Tpo lib/$(DEPDIR)/libbison_a-iswdigit.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/iswdigit.c' object='lib/libbison_a-iswdigit.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-iswdigit.o `test -f 'lib/iswdigit.c' || echo '$(srcdir)/'`lib/iswdigit.c
+
+lib/libbison_a-iswdigit.obj: lib/iswdigit.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-iswdigit.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-iswdigit.Tpo -c -o lib/libbison_a-iswdigit.obj `if test -f 'lib/iswdigit.c'; then $(CYGPATH_W) 'lib/iswdigit.c'; else $(CYGPATH_W) '$(srcdir)/lib/iswdigit.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-iswdigit.Tpo lib/$(DEPDIR)/libbison_a-iswdigit.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/iswdigit.c' object='lib/libbison_a-iswdigit.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-iswdigit.obj `if test -f 'lib/iswdigit.c'; then $(CYGPATH_W) 'lib/iswdigit.c'; else $(CYGPATH_W) '$(srcdir)/lib/iswdigit.c'; fi`
+
+lib/libbison_a-iswxdigit.o: lib/iswxdigit.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-iswxdigit.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-iswxdigit.Tpo -c -o lib/libbison_a-iswxdigit.o `test -f 'lib/iswxdigit.c' || echo '$(srcdir)/'`lib/iswxdigit.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-iswxdigit.Tpo lib/$(DEPDIR)/libbison_a-iswxdigit.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/iswxdigit.c' object='lib/libbison_a-iswxdigit.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-iswxdigit.o `test -f 'lib/iswxdigit.c' || echo '$(srcdir)/'`lib/iswxdigit.c
+
+lib/libbison_a-iswxdigit.obj: lib/iswxdigit.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-iswxdigit.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-iswxdigit.Tpo -c -o lib/libbison_a-iswxdigit.obj `if test -f 'lib/iswxdigit.c'; then $(CYGPATH_W) 'lib/iswxdigit.c'; else $(CYGPATH_W) '$(srcdir)/lib/iswxdigit.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-iswxdigit.Tpo lib/$(DEPDIR)/libbison_a-iswxdigit.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/iswxdigit.c' object='lib/libbison_a-iswxdigit.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-iswxdigit.obj `if test -f 'lib/iswxdigit.c'; then $(CYGPATH_W) 'lib/iswxdigit.c'; else $(CYGPATH_W) '$(srcdir)/lib/iswxdigit.c'; fi`
+
 lib/libbison_a-ldexpl.o: lib/ldexpl.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-ldexpl.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-ldexpl.Tpo -c -o lib/libbison_a-ldexpl.o `test -f 'lib/ldexpl.c' || echo '$(srcdir)/'`lib/ldexpl.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-ldexpl.Tpo lib/$(DEPDIR)/libbison_a-ldexpl.Po
@@ -5757,20 +7427,6 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-ldexpl.obj `if test -f 'lib/ldexpl.c'; then $(CYGPATH_W) 'lib/ldexpl.c'; else $(CYGPATH_W) '$(srcdir)/lib/ldexpl.c'; fi`
 
-lib/libbison_a-localtime-buffer.o: lib/localtime-buffer.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-localtime-buffer.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-localtime-buffer.Tpo -c -o lib/libbison_a-localtime-buffer.o `test -f 'lib/localtime-buffer.c' || echo '$(srcdir)/'`lib/localtime-buffer.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-localtime-buffer.Tpo lib/$(DEPDIR)/libbison_a-localtime-buffer.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/localtime-buffer.c' object='lib/libbison_a-localtime-buffer.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-localtime-buffer.o `test -f 'lib/localtime-buffer.c' || echo '$(srcdir)/'`lib/localtime-buffer.c
-
-lib/libbison_a-localtime-buffer.obj: lib/localtime-buffer.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-localtime-buffer.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-localtime-buffer.Tpo -c -o lib/libbison_a-localtime-buffer.obj `if test -f 'lib/localtime-buffer.c'; then $(CYGPATH_W) 'lib/localtime-buffer.c'; else $(CYGPATH_W) '$(srcdir)/lib/localtime-buffer.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-localtime-buffer.Tpo lib/$(DEPDIR)/libbison_a-localtime-buffer.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/localtime-buffer.c' object='lib/libbison_a-localtime-buffer.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-localtime-buffer.obj `if test -f 'lib/localtime-buffer.c'; then $(CYGPATH_W) 'lib/localtime-buffer.c'; else $(CYGPATH_W) '$(srcdir)/lib/localtime-buffer.c'; fi`
-
 lib/libbison_a-lstat.o: lib/lstat.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-lstat.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-lstat.Tpo -c -o lib/libbison_a-lstat.o `test -f 'lib/lstat.c' || echo '$(srcdir)/'`lib/lstat.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-lstat.Tpo lib/$(DEPDIR)/libbison_a-lstat.Po
@@ -5799,6 +7455,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-malloc.obj `if test -f 'lib/malloc.c'; then $(CYGPATH_W) 'lib/malloc.c'; else $(CYGPATH_W) '$(srcdir)/lib/malloc.c'; fi`
 
+lib/libbison_a-lc-charset-dispatch.o: lib/lc-charset-dispatch.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-lc-charset-dispatch.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-lc-charset-dispatch.Tpo -c -o lib/libbison_a-lc-charset-dispatch.o `test -f 'lib/lc-charset-dispatch.c' || echo '$(srcdir)/'`lib/lc-charset-dispatch.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-lc-charset-dispatch.Tpo lib/$(DEPDIR)/libbison_a-lc-charset-dispatch.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/lc-charset-dispatch.c' object='lib/libbison_a-lc-charset-dispatch.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-lc-charset-dispatch.o `test -f 'lib/lc-charset-dispatch.c' || echo '$(srcdir)/'`lib/lc-charset-dispatch.c
+
+lib/libbison_a-lc-charset-dispatch.obj: lib/lc-charset-dispatch.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-lc-charset-dispatch.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-lc-charset-dispatch.Tpo -c -o lib/libbison_a-lc-charset-dispatch.obj `if test -f 'lib/lc-charset-dispatch.c'; then $(CYGPATH_W) 'lib/lc-charset-dispatch.c'; else $(CYGPATH_W) '$(srcdir)/lib/lc-charset-dispatch.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-lc-charset-dispatch.Tpo lib/$(DEPDIR)/libbison_a-lc-charset-dispatch.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/lc-charset-dispatch.c' object='lib/libbison_a-lc-charset-dispatch.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-lc-charset-dispatch.obj `if test -f 'lib/lc-charset-dispatch.c'; then $(CYGPATH_W) 'lib/lc-charset-dispatch.c'; else $(CYGPATH_W) '$(srcdir)/lib/lc-charset-dispatch.c'; fi`
+
 lib/libbison_a-mbrtowc.o: lib/mbrtowc.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-mbrtowc.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-mbrtowc.Tpo -c -o lib/libbison_a-mbrtowc.o `test -f 'lib/mbrtowc.c' || echo '$(srcdir)/'`lib/mbrtowc.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-mbrtowc.Tpo lib/$(DEPDIR)/libbison_a-mbrtowc.Po
@@ -5813,6 +7483,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-mbrtowc.obj `if test -f 'lib/mbrtowc.c'; then $(CYGPATH_W) 'lib/mbrtowc.c'; else $(CYGPATH_W) '$(srcdir)/lib/mbrtowc.c'; fi`
 
+lib/libbison_a-mbtowc-lock.o: lib/mbtowc-lock.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-mbtowc-lock.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-mbtowc-lock.Tpo -c -o lib/libbison_a-mbtowc-lock.o `test -f 'lib/mbtowc-lock.c' || echo '$(srcdir)/'`lib/mbtowc-lock.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-mbtowc-lock.Tpo lib/$(DEPDIR)/libbison_a-mbtowc-lock.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/mbtowc-lock.c' object='lib/libbison_a-mbtowc-lock.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-mbtowc-lock.o `test -f 'lib/mbtowc-lock.c' || echo '$(srcdir)/'`lib/mbtowc-lock.c
+
+lib/libbison_a-mbtowc-lock.obj: lib/mbtowc-lock.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-mbtowc-lock.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-mbtowc-lock.Tpo -c -o lib/libbison_a-mbtowc-lock.obj `if test -f 'lib/mbtowc-lock.c'; then $(CYGPATH_W) 'lib/mbtowc-lock.c'; else $(CYGPATH_W) '$(srcdir)/lib/mbtowc-lock.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-mbtowc-lock.Tpo lib/$(DEPDIR)/libbison_a-mbtowc-lock.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/mbtowc-lock.c' object='lib/libbison_a-mbtowc-lock.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-mbtowc-lock.obj `if test -f 'lib/mbtowc-lock.c'; then $(CYGPATH_W) 'lib/mbtowc-lock.c'; else $(CYGPATH_W) '$(srcdir)/lib/mbtowc-lock.c'; fi`
+
 lib/libbison_a-mbsinit.o: lib/mbsinit.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-mbsinit.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-mbsinit.Tpo -c -o lib/libbison_a-mbsinit.o `test -f 'lib/mbsinit.c' || echo '$(srcdir)/'`lib/mbsinit.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-mbsinit.Tpo lib/$(DEPDIR)/libbison_a-mbsinit.Po
@@ -5841,6 +7525,34 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-memchr.obj `if test -f 'lib/memchr.c'; then $(CYGPATH_W) 'lib/memchr.c'; else $(CYGPATH_W) '$(srcdir)/lib/memchr.c'; fi`
 
+lib/libbison_a-mempcpy.o: lib/mempcpy.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-mempcpy.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-mempcpy.Tpo -c -o lib/libbison_a-mempcpy.o `test -f 'lib/mempcpy.c' || echo '$(srcdir)/'`lib/mempcpy.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-mempcpy.Tpo lib/$(DEPDIR)/libbison_a-mempcpy.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/mempcpy.c' object='lib/libbison_a-mempcpy.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-mempcpy.o `test -f 'lib/mempcpy.c' || echo '$(srcdir)/'`lib/mempcpy.c
+
+lib/libbison_a-mempcpy.obj: lib/mempcpy.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-mempcpy.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-mempcpy.Tpo -c -o lib/libbison_a-mempcpy.obj `if test -f 'lib/mempcpy.c'; then $(CYGPATH_W) 'lib/mempcpy.c'; else $(CYGPATH_W) '$(srcdir)/lib/mempcpy.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-mempcpy.Tpo lib/$(DEPDIR)/libbison_a-mempcpy.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/mempcpy.c' object='lib/libbison_a-mempcpy.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-mempcpy.obj `if test -f 'lib/mempcpy.c'; then $(CYGPATH_W) 'lib/mempcpy.c'; else $(CYGPATH_W) '$(srcdir)/lib/mempcpy.c'; fi`
+
+lib/libbison_a-memrchr.o: lib/memrchr.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-memrchr.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-memrchr.Tpo -c -o lib/libbison_a-memrchr.o `test -f 'lib/memrchr.c' || echo '$(srcdir)/'`lib/memrchr.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-memrchr.Tpo lib/$(DEPDIR)/libbison_a-memrchr.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/memrchr.c' object='lib/libbison_a-memrchr.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-memrchr.o `test -f 'lib/memrchr.c' || echo '$(srcdir)/'`lib/memrchr.c
+
+lib/libbison_a-memrchr.obj: lib/memrchr.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-memrchr.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-memrchr.Tpo -c -o lib/libbison_a-memrchr.obj `if test -f 'lib/memrchr.c'; then $(CYGPATH_W) 'lib/memrchr.c'; else $(CYGPATH_W) '$(srcdir)/lib/memrchr.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-memrchr.Tpo lib/$(DEPDIR)/libbison_a-memrchr.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/memrchr.c' object='lib/libbison_a-memrchr.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-memrchr.obj `if test -f 'lib/memrchr.c'; then $(CYGPATH_W) 'lib/memrchr.c'; else $(CYGPATH_W) '$(srcdir)/lib/memrchr.c'; fi`
+
 lib/libbison_a-msvc-inval.o: lib/msvc-inval.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-msvc-inval.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-msvc-inval.Tpo -c -o lib/libbison_a-msvc-inval.o `test -f 'lib/msvc-inval.c' || echo '$(srcdir)/'`lib/msvc-inval.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-msvc-inval.Tpo lib/$(DEPDIR)/libbison_a-msvc-inval.Po
@@ -5911,6 +7623,34 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-open.obj `if test -f 'lib/open.c'; then $(CYGPATH_W) 'lib/open.c'; else $(CYGPATH_W) '$(srcdir)/lib/open.c'; fi`
 
+lib/libbison_a-openat.o: lib/openat.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-openat.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-openat.Tpo -c -o lib/libbison_a-openat.o `test -f 'lib/openat.c' || echo '$(srcdir)/'`lib/openat.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-openat.Tpo lib/$(DEPDIR)/libbison_a-openat.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/openat.c' object='lib/libbison_a-openat.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-openat.o `test -f 'lib/openat.c' || echo '$(srcdir)/'`lib/openat.c
+
+lib/libbison_a-openat.obj: lib/openat.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-openat.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-openat.Tpo -c -o lib/libbison_a-openat.obj `if test -f 'lib/openat.c'; then $(CYGPATH_W) 'lib/openat.c'; else $(CYGPATH_W) '$(srcdir)/lib/openat.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-openat.Tpo lib/$(DEPDIR)/libbison_a-openat.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/openat.c' object='lib/libbison_a-openat.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-openat.obj `if test -f 'lib/openat.c'; then $(CYGPATH_W) 'lib/openat.c'; else $(CYGPATH_W) '$(srcdir)/lib/openat.c'; fi`
+
+lib/libbison_a-opendir.o: lib/opendir.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-opendir.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-opendir.Tpo -c -o lib/libbison_a-opendir.o `test -f 'lib/opendir.c' || echo '$(srcdir)/'`lib/opendir.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-opendir.Tpo lib/$(DEPDIR)/libbison_a-opendir.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/opendir.c' object='lib/libbison_a-opendir.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-opendir.o `test -f 'lib/opendir.c' || echo '$(srcdir)/'`lib/opendir.c
+
+lib/libbison_a-opendir.obj: lib/opendir.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-opendir.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-opendir.Tpo -c -o lib/libbison_a-opendir.obj `if test -f 'lib/opendir.c'; then $(CYGPATH_W) 'lib/opendir.c'; else $(CYGPATH_W) '$(srcdir)/lib/opendir.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-opendir.Tpo lib/$(DEPDIR)/libbison_a-opendir.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/opendir.c' object='lib/libbison_a-opendir.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-opendir.obj `if test -f 'lib/opendir.c'; then $(CYGPATH_W) 'lib/opendir.c'; else $(CYGPATH_W) '$(srcdir)/lib/opendir.c'; fi`
+
 lib/libbison_a-perror.o: lib/perror.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-perror.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-perror.Tpo -c -o lib/libbison_a-perror.o `test -f 'lib/perror.c' || echo '$(srcdir)/'`lib/perror.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-perror.Tpo lib/$(DEPDIR)/libbison_a-perror.Po
@@ -5925,6 +7665,34 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-perror.obj `if test -f 'lib/perror.c'; then $(CYGPATH_W) 'lib/perror.c'; else $(CYGPATH_W) '$(srcdir)/lib/perror.c'; fi`
 
+lib/libbison_a-pipe.o: lib/pipe.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-pipe.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-pipe.Tpo -c -o lib/libbison_a-pipe.o `test -f 'lib/pipe.c' || echo '$(srcdir)/'`lib/pipe.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-pipe.Tpo lib/$(DEPDIR)/libbison_a-pipe.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/pipe.c' object='lib/libbison_a-pipe.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-pipe.o `test -f 'lib/pipe.c' || echo '$(srcdir)/'`lib/pipe.c
+
+lib/libbison_a-pipe.obj: lib/pipe.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-pipe.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-pipe.Tpo -c -o lib/libbison_a-pipe.obj `if test -f 'lib/pipe.c'; then $(CYGPATH_W) 'lib/pipe.c'; else $(CYGPATH_W) '$(srcdir)/lib/pipe.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-pipe.Tpo lib/$(DEPDIR)/libbison_a-pipe.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/pipe.c' object='lib/libbison_a-pipe.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-pipe.obj `if test -f 'lib/pipe.c'; then $(CYGPATH_W) 'lib/pipe.c'; else $(CYGPATH_W) '$(srcdir)/lib/pipe.c'; fi`
+
+lib/libbison_a-spawn.o: lib/spawn.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-spawn.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-spawn.Tpo -c -o lib/libbison_a-spawn.o `test -f 'lib/spawn.c' || echo '$(srcdir)/'`lib/spawn.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-spawn.Tpo lib/$(DEPDIR)/libbison_a-spawn.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/spawn.c' object='lib/libbison_a-spawn.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-spawn.o `test -f 'lib/spawn.c' || echo '$(srcdir)/'`lib/spawn.c
+
+lib/libbison_a-spawn.obj: lib/spawn.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-spawn.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-spawn.Tpo -c -o lib/libbison_a-spawn.obj `if test -f 'lib/spawn.c'; then $(CYGPATH_W) 'lib/spawn.c'; else $(CYGPATH_W) '$(srcdir)/lib/spawn.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-spawn.Tpo lib/$(DEPDIR)/libbison_a-spawn.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/spawn.c' object='lib/libbison_a-spawn.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-spawn.obj `if test -f 'lib/spawn.c'; then $(CYGPATH_W) 'lib/spawn.c'; else $(CYGPATH_W) '$(srcdir)/lib/spawn.c'; fi`
+
 lib/libbison_a-spawni.o: lib/spawni.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-spawni.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-spawni.Tpo -c -o lib/libbison_a-spawni.o `test -f 'lib/spawni.c' || echo '$(srcdir)/'`lib/spawni.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-spawni.Tpo lib/$(DEPDIR)/libbison_a-spawni.Po
@@ -5939,6 +7707,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-spawni.obj `if test -f 'lib/spawni.c'; then $(CYGPATH_W) 'lib/spawni.c'; else $(CYGPATH_W) '$(srcdir)/lib/spawni.c'; fi`
 
+lib/libbison_a-spawn_faction_addchdir.o: lib/spawn_faction_addchdir.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-spawn_faction_addchdir.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-spawn_faction_addchdir.Tpo -c -o lib/libbison_a-spawn_faction_addchdir.o `test -f 'lib/spawn_faction_addchdir.c' || echo '$(srcdir)/'`lib/spawn_faction_addchdir.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-spawn_faction_addchdir.Tpo lib/$(DEPDIR)/libbison_a-spawn_faction_addchdir.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/spawn_faction_addchdir.c' object='lib/libbison_a-spawn_faction_addchdir.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-spawn_faction_addchdir.o `test -f 'lib/spawn_faction_addchdir.c' || echo '$(srcdir)/'`lib/spawn_faction_addchdir.c
+
+lib/libbison_a-spawn_faction_addchdir.obj: lib/spawn_faction_addchdir.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-spawn_faction_addchdir.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-spawn_faction_addchdir.Tpo -c -o lib/libbison_a-spawn_faction_addchdir.obj `if test -f 'lib/spawn_faction_addchdir.c'; then $(CYGPATH_W) 'lib/spawn_faction_addchdir.c'; else $(CYGPATH_W) '$(srcdir)/lib/spawn_faction_addchdir.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-spawn_faction_addchdir.Tpo lib/$(DEPDIR)/libbison_a-spawn_faction_addchdir.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/spawn_faction_addchdir.c' object='lib/libbison_a-spawn_faction_addchdir.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-spawn_faction_addchdir.obj `if test -f 'lib/spawn_faction_addchdir.c'; then $(CYGPATH_W) 'lib/spawn_faction_addchdir.c'; else $(CYGPATH_W) '$(srcdir)/lib/spawn_faction_addchdir.c'; fi`
+
 lib/libbison_a-spawn_faction_addclose.o: lib/spawn_faction_addclose.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-spawn_faction_addclose.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-spawn_faction_addclose.Tpo -c -o lib/libbison_a-spawn_faction_addclose.o `test -f 'lib/spawn_faction_addclose.c' || echo '$(srcdir)/'`lib/spawn_faction_addclose.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-spawn_faction_addclose.Tpo lib/$(DEPDIR)/libbison_a-spawn_faction_addclose.Po
@@ -6051,6 +7833,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-spawnattr_setflags.obj `if test -f 'lib/spawnattr_setflags.c'; then $(CYGPATH_W) 'lib/spawnattr_setflags.c'; else $(CYGPATH_W) '$(srcdir)/lib/spawnattr_setflags.c'; fi`
 
+lib/libbison_a-spawnattr_setpgroup.o: lib/spawnattr_setpgroup.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-spawnattr_setpgroup.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-spawnattr_setpgroup.Tpo -c -o lib/libbison_a-spawnattr_setpgroup.o `test -f 'lib/spawnattr_setpgroup.c' || echo '$(srcdir)/'`lib/spawnattr_setpgroup.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-spawnattr_setpgroup.Tpo lib/$(DEPDIR)/libbison_a-spawnattr_setpgroup.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/spawnattr_setpgroup.c' object='lib/libbison_a-spawnattr_setpgroup.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-spawnattr_setpgroup.o `test -f 'lib/spawnattr_setpgroup.c' || echo '$(srcdir)/'`lib/spawnattr_setpgroup.c
+
+lib/libbison_a-spawnattr_setpgroup.obj: lib/spawnattr_setpgroup.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-spawnattr_setpgroup.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-spawnattr_setpgroup.Tpo -c -o lib/libbison_a-spawnattr_setpgroup.obj `if test -f 'lib/spawnattr_setpgroup.c'; then $(CYGPATH_W) 'lib/spawnattr_setpgroup.c'; else $(CYGPATH_W) '$(srcdir)/lib/spawnattr_setpgroup.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-spawnattr_setpgroup.Tpo lib/$(DEPDIR)/libbison_a-spawnattr_setpgroup.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/spawnattr_setpgroup.c' object='lib/libbison_a-spawnattr_setpgroup.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-spawnattr_setpgroup.obj `if test -f 'lib/spawnattr_setpgroup.c'; then $(CYGPATH_W) 'lib/spawnattr_setpgroup.c'; else $(CYGPATH_W) '$(srcdir)/lib/spawnattr_setpgroup.c'; fi`
+
 lib/libbison_a-spawnattr_setsigmask.o: lib/spawnattr_setsigmask.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-spawnattr_setsigmask.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-spawnattr_setsigmask.Tpo -c -o lib/libbison_a-spawnattr_setsigmask.o `test -f 'lib/spawnattr_setsigmask.c' || echo '$(srcdir)/'`lib/spawnattr_setsigmask.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-spawnattr_setsigmask.Tpo lib/$(DEPDIR)/libbison_a-spawnattr_setsigmask.Po
@@ -6121,6 +7917,34 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-rawmemchr.obj `if test -f 'lib/rawmemchr.c'; then $(CYGPATH_W) 'lib/rawmemchr.c'; else $(CYGPATH_W) '$(srcdir)/lib/rawmemchr.c'; fi`
 
+lib/libbison_a-readdir.o: lib/readdir.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-readdir.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-readdir.Tpo -c -o lib/libbison_a-readdir.o `test -f 'lib/readdir.c' || echo '$(srcdir)/'`lib/readdir.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-readdir.Tpo lib/$(DEPDIR)/libbison_a-readdir.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/readdir.c' object='lib/libbison_a-readdir.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-readdir.o `test -f 'lib/readdir.c' || echo '$(srcdir)/'`lib/readdir.c
+
+lib/libbison_a-readdir.obj: lib/readdir.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-readdir.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-readdir.Tpo -c -o lib/libbison_a-readdir.obj `if test -f 'lib/readdir.c'; then $(CYGPATH_W) 'lib/readdir.c'; else $(CYGPATH_W) '$(srcdir)/lib/readdir.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-readdir.Tpo lib/$(DEPDIR)/libbison_a-readdir.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/readdir.c' object='lib/libbison_a-readdir.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-readdir.obj `if test -f 'lib/readdir.c'; then $(CYGPATH_W) 'lib/readdir.c'; else $(CYGPATH_W) '$(srcdir)/lib/readdir.c'; fi`
+
+lib/libbison_a-readline.o: lib/readline.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-readline.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-readline.Tpo -c -o lib/libbison_a-readline.o `test -f 'lib/readline.c' || echo '$(srcdir)/'`lib/readline.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-readline.Tpo lib/$(DEPDIR)/libbison_a-readline.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/readline.c' object='lib/libbison_a-readline.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-readline.o `test -f 'lib/readline.c' || echo '$(srcdir)/'`lib/readline.c
+
+lib/libbison_a-readline.obj: lib/readline.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-readline.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-readline.Tpo -c -o lib/libbison_a-readline.obj `if test -f 'lib/readline.c'; then $(CYGPATH_W) 'lib/readline.c'; else $(CYGPATH_W) '$(srcdir)/lib/readline.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-readline.Tpo lib/$(DEPDIR)/libbison_a-readline.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/readline.c' object='lib/libbison_a-readline.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-readline.obj `if test -f 'lib/readline.c'; then $(CYGPATH_W) 'lib/readline.c'; else $(CYGPATH_W) '$(srcdir)/lib/readline.c'; fi`
+
 lib/libbison_a-readlink.o: lib/readlink.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-readlink.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-readlink.Tpo -c -o lib/libbison_a-readlink.o `test -f 'lib/readlink.c' || echo '$(srcdir)/'`lib/readlink.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-readlink.Tpo lib/$(DEPDIR)/libbison_a-readlink.Po
@@ -6149,6 +7973,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-realloc.obj `if test -f 'lib/realloc.c'; then $(CYGPATH_W) 'lib/realloc.c'; else $(CYGPATH_W) '$(srcdir)/lib/realloc.c'; fi`
 
+lib/libbison_a-reallocarray.o: lib/reallocarray.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-reallocarray.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-reallocarray.Tpo -c -o lib/libbison_a-reallocarray.o `test -f 'lib/reallocarray.c' || echo '$(srcdir)/'`lib/reallocarray.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-reallocarray.Tpo lib/$(DEPDIR)/libbison_a-reallocarray.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/reallocarray.c' object='lib/libbison_a-reallocarray.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-reallocarray.o `test -f 'lib/reallocarray.c' || echo '$(srcdir)/'`lib/reallocarray.c
+
+lib/libbison_a-reallocarray.obj: lib/reallocarray.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-reallocarray.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-reallocarray.Tpo -c -o lib/libbison_a-reallocarray.obj `if test -f 'lib/reallocarray.c'; then $(CYGPATH_W) 'lib/reallocarray.c'; else $(CYGPATH_W) '$(srcdir)/lib/reallocarray.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-reallocarray.Tpo lib/$(DEPDIR)/libbison_a-reallocarray.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/reallocarray.c' object='lib/libbison_a-reallocarray.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-reallocarray.obj `if test -f 'lib/reallocarray.c'; then $(CYGPATH_W) 'lib/reallocarray.c'; else $(CYGPATH_W) '$(srcdir)/lib/reallocarray.c'; fi`
+
 lib/libbison_a-progreloc.o: lib/progreloc.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-progreloc.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-progreloc.Tpo -c -o lib/libbison_a-progreloc.o `test -f 'lib/progreloc.c' || echo '$(srcdir)/'`lib/progreloc.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-progreloc.Tpo lib/$(DEPDIR)/libbison_a-progreloc.Po
@@ -6191,6 +8029,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-rename.obj `if test -f 'lib/rename.c'; then $(CYGPATH_W) 'lib/rename.c'; else $(CYGPATH_W) '$(srcdir)/lib/rename.c'; fi`
 
+lib/libbison_a-rewinddir.o: lib/rewinddir.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-rewinddir.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-rewinddir.Tpo -c -o lib/libbison_a-rewinddir.o `test -f 'lib/rewinddir.c' || echo '$(srcdir)/'`lib/rewinddir.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-rewinddir.Tpo lib/$(DEPDIR)/libbison_a-rewinddir.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/rewinddir.c' object='lib/libbison_a-rewinddir.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-rewinddir.o `test -f 'lib/rewinddir.c' || echo '$(srcdir)/'`lib/rewinddir.c
+
+lib/libbison_a-rewinddir.obj: lib/rewinddir.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-rewinddir.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-rewinddir.Tpo -c -o lib/libbison_a-rewinddir.obj `if test -f 'lib/rewinddir.c'; then $(CYGPATH_W) 'lib/rewinddir.c'; else $(CYGPATH_W) '$(srcdir)/lib/rewinddir.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-rewinddir.Tpo lib/$(DEPDIR)/libbison_a-rewinddir.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/rewinddir.c' object='lib/libbison_a-rewinddir.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-rewinddir.obj `if test -f 'lib/rewinddir.c'; then $(CYGPATH_W) 'lib/rewinddir.c'; else $(CYGPATH_W) '$(srcdir)/lib/rewinddir.c'; fi`
+
 lib/libbison_a-rmdir.o: lib/rmdir.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-rmdir.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-rmdir.Tpo -c -o lib/libbison_a-rmdir.o `test -f 'lib/rmdir.c' || echo '$(srcdir)/'`lib/rmdir.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-rmdir.Tpo lib/$(DEPDIR)/libbison_a-rmdir.Po
@@ -6205,6 +8057,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-rmdir.obj `if test -f 'lib/rmdir.c'; then $(CYGPATH_W) 'lib/rmdir.c'; else $(CYGPATH_W) '$(srcdir)/lib/rmdir.c'; fi`
 
+lib/libbison_a-setlocale-lock.o: lib/setlocale-lock.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-setlocale-lock.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-setlocale-lock.Tpo -c -o lib/libbison_a-setlocale-lock.o `test -f 'lib/setlocale-lock.c' || echo '$(srcdir)/'`lib/setlocale-lock.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-setlocale-lock.Tpo lib/$(DEPDIR)/libbison_a-setlocale-lock.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/setlocale-lock.c' object='lib/libbison_a-setlocale-lock.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-setlocale-lock.o `test -f 'lib/setlocale-lock.c' || echo '$(srcdir)/'`lib/setlocale-lock.c
+
+lib/libbison_a-setlocale-lock.obj: lib/setlocale-lock.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-setlocale-lock.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-setlocale-lock.Tpo -c -o lib/libbison_a-setlocale-lock.obj `if test -f 'lib/setlocale-lock.c'; then $(CYGPATH_W) 'lib/setlocale-lock.c'; else $(CYGPATH_W) '$(srcdir)/lib/setlocale-lock.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-setlocale-lock.Tpo lib/$(DEPDIR)/libbison_a-setlocale-lock.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/setlocale-lock.c' object='lib/libbison_a-setlocale-lock.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-setlocale-lock.obj `if test -f 'lib/setlocale-lock.c'; then $(CYGPATH_W) 'lib/setlocale-lock.c'; else $(CYGPATH_W) '$(srcdir)/lib/setlocale-lock.c'; fi`
+
 lib/libbison_a-sigaction.o: lib/sigaction.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-sigaction.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-sigaction.Tpo -c -o lib/libbison_a-sigaction.o `test -f 'lib/sigaction.c' || echo '$(srcdir)/'`lib/sigaction.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-sigaction.Tpo lib/$(DEPDIR)/libbison_a-sigaction.Po
@@ -6289,6 +8155,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-snprintf.obj `if test -f 'lib/snprintf.c'; then $(CYGPATH_W) 'lib/snprintf.c'; else $(CYGPATH_W) '$(srcdir)/lib/snprintf.c'; fi`
 
+lib/libbison_a-os2-spawn.o: lib/os2-spawn.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-os2-spawn.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-os2-spawn.Tpo -c -o lib/libbison_a-os2-spawn.o `test -f 'lib/os2-spawn.c' || echo '$(srcdir)/'`lib/os2-spawn.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-os2-spawn.Tpo lib/$(DEPDIR)/libbison_a-os2-spawn.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/os2-spawn.c' object='lib/libbison_a-os2-spawn.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-os2-spawn.o `test -f 'lib/os2-spawn.c' || echo '$(srcdir)/'`lib/os2-spawn.c
+
+lib/libbison_a-os2-spawn.obj: lib/os2-spawn.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-os2-spawn.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-os2-spawn.Tpo -c -o lib/libbison_a-os2-spawn.obj `if test -f 'lib/os2-spawn.c'; then $(CYGPATH_W) 'lib/os2-spawn.c'; else $(CYGPATH_W) '$(srcdir)/lib/os2-spawn.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-os2-spawn.Tpo lib/$(DEPDIR)/libbison_a-os2-spawn.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/os2-spawn.c' object='lib/libbison_a-os2-spawn.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-os2-spawn.obj `if test -f 'lib/os2-spawn.c'; then $(CYGPATH_W) 'lib/os2-spawn.c'; else $(CYGPATH_W) '$(srcdir)/lib/os2-spawn.c'; fi`
+
 lib/libbison_a-sprintf.o: lib/sprintf.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-sprintf.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-sprintf.Tpo -c -o lib/libbison_a-sprintf.o `test -f 'lib/sprintf.c' || echo '$(srcdir)/'`lib/sprintf.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-sprintf.Tpo lib/$(DEPDIR)/libbison_a-sprintf.Po
@@ -6331,6 +8211,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-stpcpy.obj `if test -f 'lib/stpcpy.c'; then $(CYGPATH_W) 'lib/stpcpy.c'; else $(CYGPATH_W) '$(srcdir)/lib/stpcpy.c'; fi`
 
+lib/libbison_a-stpncpy.o: lib/stpncpy.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-stpncpy.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-stpncpy.Tpo -c -o lib/libbison_a-stpncpy.o `test -f 'lib/stpncpy.c' || echo '$(srcdir)/'`lib/stpncpy.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-stpncpy.Tpo lib/$(DEPDIR)/libbison_a-stpncpy.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/stpncpy.c' object='lib/libbison_a-stpncpy.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-stpncpy.o `test -f 'lib/stpncpy.c' || echo '$(srcdir)/'`lib/stpncpy.c
+
+lib/libbison_a-stpncpy.obj: lib/stpncpy.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-stpncpy.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-stpncpy.Tpo -c -o lib/libbison_a-stpncpy.obj `if test -f 'lib/stpncpy.c'; then $(CYGPATH_W) 'lib/stpncpy.c'; else $(CYGPATH_W) '$(srcdir)/lib/stpncpy.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-stpncpy.Tpo lib/$(DEPDIR)/libbison_a-stpncpy.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/stpncpy.c' object='lib/libbison_a-stpncpy.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-stpncpy.obj `if test -f 'lib/stpncpy.c'; then $(CYGPATH_W) 'lib/stpncpy.c'; else $(CYGPATH_W) '$(srcdir)/lib/stpncpy.c'; fi`
+
 lib/libbison_a-strchrnul.o: lib/strchrnul.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-strchrnul.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-strchrnul.Tpo -c -o lib/libbison_a-strchrnul.o `test -f 'lib/strchrnul.c' || echo '$(srcdir)/'`lib/strchrnul.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-strchrnul.Tpo lib/$(DEPDIR)/libbison_a-strchrnul.Po
@@ -6429,6 +8323,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-strnlen.obj `if test -f 'lib/strnlen.c'; then $(CYGPATH_W) 'lib/strnlen.c'; else $(CYGPATH_W) '$(srcdir)/lib/strnlen.c'; fi`
 
+lib/libbison_a-strtod.o: lib/strtod.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-strtod.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-strtod.Tpo -c -o lib/libbison_a-strtod.o `test -f 'lib/strtod.c' || echo '$(srcdir)/'`lib/strtod.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-strtod.Tpo lib/$(DEPDIR)/libbison_a-strtod.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/strtod.c' object='lib/libbison_a-strtod.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-strtod.o `test -f 'lib/strtod.c' || echo '$(srcdir)/'`lib/strtod.c
+
+lib/libbison_a-strtod.obj: lib/strtod.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-strtod.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-strtod.Tpo -c -o lib/libbison_a-strtod.obj `if test -f 'lib/strtod.c'; then $(CYGPATH_W) 'lib/strtod.c'; else $(CYGPATH_W) '$(srcdir)/lib/strtod.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-strtod.Tpo lib/$(DEPDIR)/libbison_a-strtod.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/strtod.c' object='lib/libbison_a-strtod.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-strtod.obj `if test -f 'lib/strtod.c'; then $(CYGPATH_W) 'lib/strtod.c'; else $(CYGPATH_W) '$(srcdir)/lib/strtod.c'; fi`
+
 lib/libbison_a-strverscmp.o: lib/strverscmp.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-strverscmp.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-strverscmp.Tpo -c -o lib/libbison_a-strverscmp.o `test -f 'lib/strverscmp.c' || echo '$(srcdir)/'`lib/strverscmp.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-strverscmp.Tpo lib/$(DEPDIR)/libbison_a-strverscmp.Po
@@ -6681,6 +8589,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-windows-rwlock.obj `if test -f 'lib/windows-rwlock.c'; then $(CYGPATH_W) 'lib/windows-rwlock.c'; else $(CYGPATH_W) '$(srcdir)/lib/windows-rwlock.c'; fi`
 
+lib/libbison_a-windows-spawn.o: lib/windows-spawn.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-windows-spawn.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-windows-spawn.Tpo -c -o lib/libbison_a-windows-spawn.o `test -f 'lib/windows-spawn.c' || echo '$(srcdir)/'`lib/windows-spawn.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-windows-spawn.Tpo lib/$(DEPDIR)/libbison_a-windows-spawn.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/windows-spawn.c' object='lib/libbison_a-windows-spawn.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-windows-spawn.o `test -f 'lib/windows-spawn.c' || echo '$(srcdir)/'`lib/windows-spawn.c
+
+lib/libbison_a-windows-spawn.obj: lib/windows-spawn.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-windows-spawn.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-windows-spawn.Tpo -c -o lib/libbison_a-windows-spawn.obj `if test -f 'lib/windows-spawn.c'; then $(CYGPATH_W) 'lib/windows-spawn.c'; else $(CYGPATH_W) '$(srcdir)/lib/windows-spawn.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-windows-spawn.Tpo lib/$(DEPDIR)/libbison_a-windows-spawn.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/windows-spawn.c' object='lib/libbison_a-windows-spawn.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-windows-spawn.obj `if test -f 'lib/windows-spawn.c'; then $(CYGPATH_W) 'lib/windows-spawn.c'; else $(CYGPATH_W) '$(srcdir)/lib/windows-spawn.c'; fi`
+
 lib/libbison_a-windows-tls.o: lib/windows-tls.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-windows-tls.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-windows-tls.Tpo -c -o lib/libbison_a-windows-tls.o `test -f 'lib/windows-tls.c' || echo '$(srcdir)/'`lib/windows-tls.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-windows-tls.Tpo lib/$(DEPDIR)/libbison_a-windows-tls.Po
@@ -6695,117 +8617,145 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-windows-tls.obj `if test -f 'lib/windows-tls.c'; then $(CYGPATH_W) 'lib/windows-tls.c'; else $(CYGPATH_W) '$(srcdir)/lib/windows-tls.c'; fi`
 
-lib/libbison_a-xmemdup0.o: lib/xmemdup0.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-xmemdup0.o -MD -MP -MF lib/$(DEPDIR)/libbison_a-xmemdup0.Tpo -c -o lib/libbison_a-xmemdup0.o `test -f 'lib/xmemdup0.c' || echo '$(srcdir)/'`lib/xmemdup0.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-xmemdup0.Tpo lib/$(DEPDIR)/libbison_a-xmemdup0.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/xmemdup0.c' object='lib/libbison_a-xmemdup0.o' libtool=no @AMDEPBACKSLASH@
+examples/c/bistromathic/bistromathic-parse.o: examples/c/bistromathic/parse.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_bistromathic_bistromathic_CPPFLAGS) $(CPPFLAGS) $(examples_c_bistromathic_bistromathic_CFLAGS) $(CFLAGS) -MT examples/c/bistromathic/bistromathic-parse.o -MD -MP -MF examples/c/bistromathic/$(DEPDIR)/bistromathic-parse.Tpo -c -o examples/c/bistromathic/bistromathic-parse.o `test -f 'examples/c/bistromathic/parse.c' || echo '$(srcdir)/'`examples/c/bistromathic/parse.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/bistromathic/$(DEPDIR)/bistromathic-parse.Tpo examples/c/bistromathic/$(DEPDIR)/bistromathic-parse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/bistromathic/parse.c' object='examples/c/bistromathic/bistromathic-parse.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-xmemdup0.o `test -f 'lib/xmemdup0.c' || echo '$(srcdir)/'`lib/xmemdup0.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_bistromathic_bistromathic_CPPFLAGS) $(CPPFLAGS) $(examples_c_bistromathic_bistromathic_CFLAGS) $(CFLAGS) -c -o examples/c/bistromathic/bistromathic-parse.o `test -f 'examples/c/bistromathic/parse.c' || echo '$(srcdir)/'`examples/c/bistromathic/parse.c
 
-lib/libbison_a-xmemdup0.obj: lib/xmemdup0.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib/libbison_a-xmemdup0.obj -MD -MP -MF lib/$(DEPDIR)/libbison_a-xmemdup0.Tpo -c -o lib/libbison_a-xmemdup0.obj `if test -f 'lib/xmemdup0.c'; then $(CYGPATH_W) 'lib/xmemdup0.c'; else $(CYGPATH_W) '$(srcdir)/lib/xmemdup0.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) lib/$(DEPDIR)/libbison_a-xmemdup0.Tpo lib/$(DEPDIR)/libbison_a-xmemdup0.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib/xmemdup0.c' object='lib/libbison_a-xmemdup0.obj' libtool=no @AMDEPBACKSLASH@
+examples/c/bistromathic/bistromathic-parse.obj: examples/c/bistromathic/parse.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_bistromathic_bistromathic_CPPFLAGS) $(CPPFLAGS) $(examples_c_bistromathic_bistromathic_CFLAGS) $(CFLAGS) -MT examples/c/bistromathic/bistromathic-parse.obj -MD -MP -MF examples/c/bistromathic/$(DEPDIR)/bistromathic-parse.Tpo -c -o examples/c/bistromathic/bistromathic-parse.obj `if test -f 'examples/c/bistromathic/parse.c'; then $(CYGPATH_W) 'examples/c/bistromathic/parse.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/bistromathic/parse.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/bistromathic/$(DEPDIR)/bistromathic-parse.Tpo examples/c/bistromathic/$(DEPDIR)/bistromathic-parse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/bistromathic/parse.c' object='examples/c/bistromathic/bistromathic-parse.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib_libbison_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib/libbison_a-xmemdup0.obj `if test -f 'lib/xmemdup0.c'; then $(CYGPATH_W) 'lib/xmemdup0.c'; else $(CYGPATH_W) '$(srcdir)/lib/xmemdup0.c'; fi`
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_bistromathic_bistromathic_CPPFLAGS) $(CPPFLAGS) $(examples_c_bistromathic_bistromathic_CFLAGS) $(CFLAGS) -c -o examples/c/bistromathic/bistromathic-parse.obj `if test -f 'examples/c/bistromathic/parse.c'; then $(CYGPATH_W) 'examples/c/bistromathic/parse.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/bistromathic/parse.c'; fi`
 
-examples/c/calc/calc-calc.o: examples/c/calc/calc.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_calc_calc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/calc/calc-calc.o -MD -MP -MF examples/c/calc/$(DEPDIR)/calc-calc.Tpo -c -o examples/c/calc/calc-calc.o `test -f 'examples/c/calc/calc.c' || echo '$(srcdir)/'`examples/c/calc/calc.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/calc/$(DEPDIR)/calc-calc.Tpo examples/c/calc/$(DEPDIR)/calc-calc.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/calc/calc.c' object='examples/c/calc/calc-calc.o' libtool=no @AMDEPBACKSLASH@
+examples/c/calc/examples_c_calc_calc-calc.o: examples/c/calc/calc.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_calc_calc_CPPFLAGS) $(CPPFLAGS) $(examples_c_calc_calc_CFLAGS) $(CFLAGS) -MT examples/c/calc/examples_c_calc_calc-calc.o -MD -MP -MF examples/c/calc/$(DEPDIR)/examples_c_calc_calc-calc.Tpo -c -o examples/c/calc/examples_c_calc_calc-calc.o `test -f 'examples/c/calc/calc.c' || echo '$(srcdir)/'`examples/c/calc/calc.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/calc/$(DEPDIR)/examples_c_calc_calc-calc.Tpo examples/c/calc/$(DEPDIR)/examples_c_calc_calc-calc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/calc/calc.c' object='examples/c/calc/examples_c_calc_calc-calc.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_calc_calc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/calc/calc-calc.o `test -f 'examples/c/calc/calc.c' || echo '$(srcdir)/'`examples/c/calc/calc.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_calc_calc_CPPFLAGS) $(CPPFLAGS) $(examples_c_calc_calc_CFLAGS) $(CFLAGS) -c -o examples/c/calc/examples_c_calc_calc-calc.o `test -f 'examples/c/calc/calc.c' || echo '$(srcdir)/'`examples/c/calc/calc.c
 
-examples/c/calc/calc-calc.obj: examples/c/calc/calc.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_calc_calc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/calc/calc-calc.obj -MD -MP -MF examples/c/calc/$(DEPDIR)/calc-calc.Tpo -c -o examples/c/calc/calc-calc.obj `if test -f 'examples/c/calc/calc.c'; then $(CYGPATH_W) 'examples/c/calc/calc.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/calc/calc.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/calc/$(DEPDIR)/calc-calc.Tpo examples/c/calc/$(DEPDIR)/calc-calc.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/calc/calc.c' object='examples/c/calc/calc-calc.obj' libtool=no @AMDEPBACKSLASH@
+examples/c/calc/examples_c_calc_calc-calc.obj: examples/c/calc/calc.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_calc_calc_CPPFLAGS) $(CPPFLAGS) $(examples_c_calc_calc_CFLAGS) $(CFLAGS) -MT examples/c/calc/examples_c_calc_calc-calc.obj -MD -MP -MF examples/c/calc/$(DEPDIR)/examples_c_calc_calc-calc.Tpo -c -o examples/c/calc/examples_c_calc_calc-calc.obj `if test -f 'examples/c/calc/calc.c'; then $(CYGPATH_W) 'examples/c/calc/calc.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/calc/calc.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/calc/$(DEPDIR)/examples_c_calc_calc-calc.Tpo examples/c/calc/$(DEPDIR)/examples_c_calc_calc-calc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/calc/calc.c' object='examples/c/calc/examples_c_calc_calc-calc.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_calc_calc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/calc/calc-calc.obj `if test -f 'examples/c/calc/calc.c'; then $(CYGPATH_W) 'examples/c/calc/calc.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/calc/calc.c'; fi`
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_calc_calc_CPPFLAGS) $(CPPFLAGS) $(examples_c_calc_calc_CFLAGS) $(CFLAGS) -c -o examples/c/calc/examples_c_calc_calc-calc.obj `if test -f 'examples/c/calc/calc.c'; then $(CYGPATH_W) 'examples/c/calc/calc.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/calc/calc.c'; fi`
 
-examples/c/lexcalc/lexcalc-parse.o: examples/c/lexcalc/parse.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_lexcalc_lexcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/lexcalc/lexcalc-parse.o -MD -MP -MF examples/c/lexcalc/$(DEPDIR)/lexcalc-parse.Tpo -c -o examples/c/lexcalc/lexcalc-parse.o `test -f 'examples/c/lexcalc/parse.c' || echo '$(srcdir)/'`examples/c/lexcalc/parse.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/lexcalc/$(DEPDIR)/lexcalc-parse.Tpo examples/c/lexcalc/$(DEPDIR)/lexcalc-parse.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/lexcalc/parse.c' object='examples/c/lexcalc/lexcalc-parse.o' libtool=no @AMDEPBACKSLASH@
+examples/c/glr/examples_c_glr_c___types-c++-types.o: examples/c/glr/c++-types.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_glr_c___types_CPPFLAGS) $(CPPFLAGS) $(examples_c_glr_c___types_CFLAGS) $(CFLAGS) -MT examples/c/glr/examples_c_glr_c___types-c++-types.o -MD -MP -MF examples/c/glr/$(DEPDIR)/examples_c_glr_c___types-c++-types.Tpo -c -o examples/c/glr/examples_c_glr_c___types-c++-types.o `test -f 'examples/c/glr/c++-types.c' || echo '$(srcdir)/'`examples/c/glr/c++-types.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/glr/$(DEPDIR)/examples_c_glr_c___types-c++-types.Tpo examples/c/glr/$(DEPDIR)/examples_c_glr_c___types-c++-types.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/glr/c++-types.c' object='examples/c/glr/examples_c_glr_c___types-c++-types.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_lexcalc_lexcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/lexcalc/lexcalc-parse.o `test -f 'examples/c/lexcalc/parse.c' || echo '$(srcdir)/'`examples/c/lexcalc/parse.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_glr_c___types_CPPFLAGS) $(CPPFLAGS) $(examples_c_glr_c___types_CFLAGS) $(CFLAGS) -c -o examples/c/glr/examples_c_glr_c___types-c++-types.o `test -f 'examples/c/glr/c++-types.c' || echo '$(srcdir)/'`examples/c/glr/c++-types.c
 
-examples/c/lexcalc/lexcalc-parse.obj: examples/c/lexcalc/parse.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_lexcalc_lexcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/lexcalc/lexcalc-parse.obj -MD -MP -MF examples/c/lexcalc/$(DEPDIR)/lexcalc-parse.Tpo -c -o examples/c/lexcalc/lexcalc-parse.obj `if test -f 'examples/c/lexcalc/parse.c'; then $(CYGPATH_W) 'examples/c/lexcalc/parse.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/lexcalc/parse.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/lexcalc/$(DEPDIR)/lexcalc-parse.Tpo examples/c/lexcalc/$(DEPDIR)/lexcalc-parse.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/lexcalc/parse.c' object='examples/c/lexcalc/lexcalc-parse.obj' libtool=no @AMDEPBACKSLASH@
+examples/c/glr/examples_c_glr_c___types-c++-types.obj: examples/c/glr/c++-types.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_glr_c___types_CPPFLAGS) $(CPPFLAGS) $(examples_c_glr_c___types_CFLAGS) $(CFLAGS) -MT examples/c/glr/examples_c_glr_c___types-c++-types.obj -MD -MP -MF examples/c/glr/$(DEPDIR)/examples_c_glr_c___types-c++-types.Tpo -c -o examples/c/glr/examples_c_glr_c___types-c++-types.obj `if test -f 'examples/c/glr/c++-types.c'; then $(CYGPATH_W) 'examples/c/glr/c++-types.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/glr/c++-types.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/glr/$(DEPDIR)/examples_c_glr_c___types-c++-types.Tpo examples/c/glr/$(DEPDIR)/examples_c_glr_c___types-c++-types.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/glr/c++-types.c' object='examples/c/glr/examples_c_glr_c___types-c++-types.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_lexcalc_lexcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/lexcalc/lexcalc-parse.obj `if test -f 'examples/c/lexcalc/parse.c'; then $(CYGPATH_W) 'examples/c/lexcalc/parse.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/lexcalc/parse.c'; fi`
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_glr_c___types_CPPFLAGS) $(CPPFLAGS) $(examples_c_glr_c___types_CFLAGS) $(CFLAGS) -c -o examples/c/glr/examples_c_glr_c___types-c++-types.obj `if test -f 'examples/c/glr/c++-types.c'; then $(CYGPATH_W) 'examples/c/glr/c++-types.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/glr/c++-types.c'; fi`
 
-examples/c/lexcalc/lexcalc-scan.o: examples/c/lexcalc/scan.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_lexcalc_lexcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/lexcalc/lexcalc-scan.o -MD -MP -MF examples/c/lexcalc/$(DEPDIR)/lexcalc-scan.Tpo -c -o examples/c/lexcalc/lexcalc-scan.o `test -f 'examples/c/lexcalc/scan.c' || echo '$(srcdir)/'`examples/c/lexcalc/scan.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/lexcalc/$(DEPDIR)/lexcalc-scan.Tpo examples/c/lexcalc/$(DEPDIR)/lexcalc-scan.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/lexcalc/scan.c' object='examples/c/lexcalc/lexcalc-scan.o' libtool=no @AMDEPBACKSLASH@
+examples/c/lexcalc/examples_c_lexcalc_lexcalc-parse.o: examples/c/lexcalc/parse.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_lexcalc_lexcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/lexcalc/examples_c_lexcalc_lexcalc-parse.o -MD -MP -MF examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-parse.Tpo -c -o examples/c/lexcalc/examples_c_lexcalc_lexcalc-parse.o `test -f 'examples/c/lexcalc/parse.c' || echo '$(srcdir)/'`examples/c/lexcalc/parse.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-parse.Tpo examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-parse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/lexcalc/parse.c' object='examples/c/lexcalc/examples_c_lexcalc_lexcalc-parse.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_lexcalc_lexcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/lexcalc/lexcalc-scan.o `test -f 'examples/c/lexcalc/scan.c' || echo '$(srcdir)/'`examples/c/lexcalc/scan.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_lexcalc_lexcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/lexcalc/examples_c_lexcalc_lexcalc-parse.o `test -f 'examples/c/lexcalc/parse.c' || echo '$(srcdir)/'`examples/c/lexcalc/parse.c
 
-examples/c/lexcalc/lexcalc-scan.obj: examples/c/lexcalc/scan.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_lexcalc_lexcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/lexcalc/lexcalc-scan.obj -MD -MP -MF examples/c/lexcalc/$(DEPDIR)/lexcalc-scan.Tpo -c -o examples/c/lexcalc/lexcalc-scan.obj `if test -f 'examples/c/lexcalc/scan.c'; then $(CYGPATH_W) 'examples/c/lexcalc/scan.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/lexcalc/scan.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/lexcalc/$(DEPDIR)/lexcalc-scan.Tpo examples/c/lexcalc/$(DEPDIR)/lexcalc-scan.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/lexcalc/scan.c' object='examples/c/lexcalc/lexcalc-scan.obj' libtool=no @AMDEPBACKSLASH@
+examples/c/lexcalc/examples_c_lexcalc_lexcalc-parse.obj: examples/c/lexcalc/parse.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_lexcalc_lexcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/lexcalc/examples_c_lexcalc_lexcalc-parse.obj -MD -MP -MF examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-parse.Tpo -c -o examples/c/lexcalc/examples_c_lexcalc_lexcalc-parse.obj `if test -f 'examples/c/lexcalc/parse.c'; then $(CYGPATH_W) 'examples/c/lexcalc/parse.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/lexcalc/parse.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-parse.Tpo examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-parse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/lexcalc/parse.c' object='examples/c/lexcalc/examples_c_lexcalc_lexcalc-parse.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_lexcalc_lexcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/lexcalc/lexcalc-scan.obj `if test -f 'examples/c/lexcalc/scan.c'; then $(CYGPATH_W) 'examples/c/lexcalc/scan.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/lexcalc/scan.c'; fi`
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_lexcalc_lexcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/lexcalc/examples_c_lexcalc_lexcalc-parse.obj `if test -f 'examples/c/lexcalc/parse.c'; then $(CYGPATH_W) 'examples/c/lexcalc/parse.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/lexcalc/parse.c'; fi`
 
-examples/c/mfcalc/mfcalc-mfcalc.o: examples/c/mfcalc/mfcalc.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_mfcalc_mfcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/mfcalc/mfcalc-mfcalc.o -MD -MP -MF examples/c/mfcalc/$(DEPDIR)/mfcalc-mfcalc.Tpo -c -o examples/c/mfcalc/mfcalc-mfcalc.o `test -f 'examples/c/mfcalc/mfcalc.c' || echo '$(srcdir)/'`examples/c/mfcalc/mfcalc.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/mfcalc/$(DEPDIR)/mfcalc-mfcalc.Tpo examples/c/mfcalc/$(DEPDIR)/mfcalc-mfcalc.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/mfcalc/mfcalc.c' object='examples/c/mfcalc/mfcalc-mfcalc.o' libtool=no @AMDEPBACKSLASH@
+examples/c/lexcalc/examples_c_lexcalc_lexcalc-scan.o: examples/c/lexcalc/scan.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_lexcalc_lexcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/lexcalc/examples_c_lexcalc_lexcalc-scan.o -MD -MP -MF examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-scan.Tpo -c -o examples/c/lexcalc/examples_c_lexcalc_lexcalc-scan.o `test -f 'examples/c/lexcalc/scan.c' || echo '$(srcdir)/'`examples/c/lexcalc/scan.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-scan.Tpo examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-scan.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/lexcalc/scan.c' object='examples/c/lexcalc/examples_c_lexcalc_lexcalc-scan.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_mfcalc_mfcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/mfcalc/mfcalc-mfcalc.o `test -f 'examples/c/mfcalc/mfcalc.c' || echo '$(srcdir)/'`examples/c/mfcalc/mfcalc.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_lexcalc_lexcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/lexcalc/examples_c_lexcalc_lexcalc-scan.o `test -f 'examples/c/lexcalc/scan.c' || echo '$(srcdir)/'`examples/c/lexcalc/scan.c
 
-examples/c/mfcalc/mfcalc-mfcalc.obj: examples/c/mfcalc/mfcalc.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_mfcalc_mfcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/mfcalc/mfcalc-mfcalc.obj -MD -MP -MF examples/c/mfcalc/$(DEPDIR)/mfcalc-mfcalc.Tpo -c -o examples/c/mfcalc/mfcalc-mfcalc.obj `if test -f 'examples/c/mfcalc/mfcalc.c'; then $(CYGPATH_W) 'examples/c/mfcalc/mfcalc.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/mfcalc/mfcalc.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/mfcalc/$(DEPDIR)/mfcalc-mfcalc.Tpo examples/c/mfcalc/$(DEPDIR)/mfcalc-mfcalc.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/mfcalc/mfcalc.c' object='examples/c/mfcalc/mfcalc-mfcalc.obj' libtool=no @AMDEPBACKSLASH@
+examples/c/lexcalc/examples_c_lexcalc_lexcalc-scan.obj: examples/c/lexcalc/scan.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_lexcalc_lexcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/lexcalc/examples_c_lexcalc_lexcalc-scan.obj -MD -MP -MF examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-scan.Tpo -c -o examples/c/lexcalc/examples_c_lexcalc_lexcalc-scan.obj `if test -f 'examples/c/lexcalc/scan.c'; then $(CYGPATH_W) 'examples/c/lexcalc/scan.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/lexcalc/scan.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-scan.Tpo examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-scan.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/lexcalc/scan.c' object='examples/c/lexcalc/examples_c_lexcalc_lexcalc-scan.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_mfcalc_mfcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/mfcalc/mfcalc-mfcalc.obj `if test -f 'examples/c/mfcalc/mfcalc.c'; then $(CYGPATH_W) 'examples/c/mfcalc/mfcalc.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/mfcalc/mfcalc.c'; fi`
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_lexcalc_lexcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/lexcalc/examples_c_lexcalc_lexcalc-scan.obj `if test -f 'examples/c/lexcalc/scan.c'; then $(CYGPATH_W) 'examples/c/lexcalc/scan.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/lexcalc/scan.c'; fi`
 
-examples/c/reccalc/reccalc-parse.o: examples/c/reccalc/parse.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_reccalc_reccalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/reccalc/reccalc-parse.o -MD -MP -MF examples/c/reccalc/$(DEPDIR)/reccalc-parse.Tpo -c -o examples/c/reccalc/reccalc-parse.o `test -f 'examples/c/reccalc/parse.c' || echo '$(srcdir)/'`examples/c/reccalc/parse.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/reccalc/$(DEPDIR)/reccalc-parse.Tpo examples/c/reccalc/$(DEPDIR)/reccalc-parse.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/reccalc/parse.c' object='examples/c/reccalc/reccalc-parse.o' libtool=no @AMDEPBACKSLASH@
+examples/c/mfcalc/examples_c_mfcalc_mfcalc-mfcalc.o: examples/c/mfcalc/mfcalc.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_mfcalc_mfcalc_CPPFLAGS) $(CPPFLAGS) $(examples_c_mfcalc_mfcalc_CFLAGS) $(CFLAGS) -MT examples/c/mfcalc/examples_c_mfcalc_mfcalc-mfcalc.o -MD -MP -MF examples/c/mfcalc/$(DEPDIR)/examples_c_mfcalc_mfcalc-mfcalc.Tpo -c -o examples/c/mfcalc/examples_c_mfcalc_mfcalc-mfcalc.o `test -f 'examples/c/mfcalc/mfcalc.c' || echo '$(srcdir)/'`examples/c/mfcalc/mfcalc.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/mfcalc/$(DEPDIR)/examples_c_mfcalc_mfcalc-mfcalc.Tpo examples/c/mfcalc/$(DEPDIR)/examples_c_mfcalc_mfcalc-mfcalc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/mfcalc/mfcalc.c' object='examples/c/mfcalc/examples_c_mfcalc_mfcalc-mfcalc.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_reccalc_reccalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/reccalc/reccalc-parse.o `test -f 'examples/c/reccalc/parse.c' || echo '$(srcdir)/'`examples/c/reccalc/parse.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_mfcalc_mfcalc_CPPFLAGS) $(CPPFLAGS) $(examples_c_mfcalc_mfcalc_CFLAGS) $(CFLAGS) -c -o examples/c/mfcalc/examples_c_mfcalc_mfcalc-mfcalc.o `test -f 'examples/c/mfcalc/mfcalc.c' || echo '$(srcdir)/'`examples/c/mfcalc/mfcalc.c
 
-examples/c/reccalc/reccalc-parse.obj: examples/c/reccalc/parse.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_reccalc_reccalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/reccalc/reccalc-parse.obj -MD -MP -MF examples/c/reccalc/$(DEPDIR)/reccalc-parse.Tpo -c -o examples/c/reccalc/reccalc-parse.obj `if test -f 'examples/c/reccalc/parse.c'; then $(CYGPATH_W) 'examples/c/reccalc/parse.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/reccalc/parse.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/reccalc/$(DEPDIR)/reccalc-parse.Tpo examples/c/reccalc/$(DEPDIR)/reccalc-parse.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/reccalc/parse.c' object='examples/c/reccalc/reccalc-parse.obj' libtool=no @AMDEPBACKSLASH@
+examples/c/mfcalc/examples_c_mfcalc_mfcalc-mfcalc.obj: examples/c/mfcalc/mfcalc.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_mfcalc_mfcalc_CPPFLAGS) $(CPPFLAGS) $(examples_c_mfcalc_mfcalc_CFLAGS) $(CFLAGS) -MT examples/c/mfcalc/examples_c_mfcalc_mfcalc-mfcalc.obj -MD -MP -MF examples/c/mfcalc/$(DEPDIR)/examples_c_mfcalc_mfcalc-mfcalc.Tpo -c -o examples/c/mfcalc/examples_c_mfcalc_mfcalc-mfcalc.obj `if test -f 'examples/c/mfcalc/mfcalc.c'; then $(CYGPATH_W) 'examples/c/mfcalc/mfcalc.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/mfcalc/mfcalc.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/mfcalc/$(DEPDIR)/examples_c_mfcalc_mfcalc-mfcalc.Tpo examples/c/mfcalc/$(DEPDIR)/examples_c_mfcalc_mfcalc-mfcalc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/mfcalc/mfcalc.c' object='examples/c/mfcalc/examples_c_mfcalc_mfcalc-mfcalc.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_reccalc_reccalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/reccalc/reccalc-parse.obj `if test -f 'examples/c/reccalc/parse.c'; then $(CYGPATH_W) 'examples/c/reccalc/parse.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/reccalc/parse.c'; fi`
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_mfcalc_mfcalc_CPPFLAGS) $(CPPFLAGS) $(examples_c_mfcalc_mfcalc_CFLAGS) $(CFLAGS) -c -o examples/c/mfcalc/examples_c_mfcalc_mfcalc-mfcalc.obj `if test -f 'examples/c/mfcalc/mfcalc.c'; then $(CYGPATH_W) 'examples/c/mfcalc/mfcalc.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/mfcalc/mfcalc.c'; fi`
 
-examples/c/reccalc/reccalc-scan.o: examples/c/reccalc/scan.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_reccalc_reccalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/reccalc/reccalc-scan.o -MD -MP -MF examples/c/reccalc/$(DEPDIR)/reccalc-scan.Tpo -c -o examples/c/reccalc/reccalc-scan.o `test -f 'examples/c/reccalc/scan.c' || echo '$(srcdir)/'`examples/c/reccalc/scan.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/reccalc/$(DEPDIR)/reccalc-scan.Tpo examples/c/reccalc/$(DEPDIR)/reccalc-scan.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/reccalc/scan.c' object='examples/c/reccalc/reccalc-scan.o' libtool=no @AMDEPBACKSLASH@
+examples/c/pushcalc/examples_c_pushcalc_calc-calc.o: examples/c/pushcalc/calc.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_pushcalc_calc_CPPFLAGS) $(CPPFLAGS) $(examples_c_pushcalc_calc_CFLAGS) $(CFLAGS) -MT examples/c/pushcalc/examples_c_pushcalc_calc-calc.o -MD -MP -MF examples/c/pushcalc/$(DEPDIR)/examples_c_pushcalc_calc-calc.Tpo -c -o examples/c/pushcalc/examples_c_pushcalc_calc-calc.o `test -f 'examples/c/pushcalc/calc.c' || echo '$(srcdir)/'`examples/c/pushcalc/calc.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/pushcalc/$(DEPDIR)/examples_c_pushcalc_calc-calc.Tpo examples/c/pushcalc/$(DEPDIR)/examples_c_pushcalc_calc-calc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/pushcalc/calc.c' object='examples/c/pushcalc/examples_c_pushcalc_calc-calc.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_reccalc_reccalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/reccalc/reccalc-scan.o `test -f 'examples/c/reccalc/scan.c' || echo '$(srcdir)/'`examples/c/reccalc/scan.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_pushcalc_calc_CPPFLAGS) $(CPPFLAGS) $(examples_c_pushcalc_calc_CFLAGS) $(CFLAGS) -c -o examples/c/pushcalc/examples_c_pushcalc_calc-calc.o `test -f 'examples/c/pushcalc/calc.c' || echo '$(srcdir)/'`examples/c/pushcalc/calc.c
 
-examples/c/reccalc/reccalc-scan.obj: examples/c/reccalc/scan.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_reccalc_reccalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/reccalc/reccalc-scan.obj -MD -MP -MF examples/c/reccalc/$(DEPDIR)/reccalc-scan.Tpo -c -o examples/c/reccalc/reccalc-scan.obj `if test -f 'examples/c/reccalc/scan.c'; then $(CYGPATH_W) 'examples/c/reccalc/scan.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/reccalc/scan.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/reccalc/$(DEPDIR)/reccalc-scan.Tpo examples/c/reccalc/$(DEPDIR)/reccalc-scan.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/reccalc/scan.c' object='examples/c/reccalc/reccalc-scan.obj' libtool=no @AMDEPBACKSLASH@
+examples/c/pushcalc/examples_c_pushcalc_calc-calc.obj: examples/c/pushcalc/calc.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_pushcalc_calc_CPPFLAGS) $(CPPFLAGS) $(examples_c_pushcalc_calc_CFLAGS) $(CFLAGS) -MT examples/c/pushcalc/examples_c_pushcalc_calc-calc.obj -MD -MP -MF examples/c/pushcalc/$(DEPDIR)/examples_c_pushcalc_calc-calc.Tpo -c -o examples/c/pushcalc/examples_c_pushcalc_calc-calc.obj `if test -f 'examples/c/pushcalc/calc.c'; then $(CYGPATH_W) 'examples/c/pushcalc/calc.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/pushcalc/calc.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/pushcalc/$(DEPDIR)/examples_c_pushcalc_calc-calc.Tpo examples/c/pushcalc/$(DEPDIR)/examples_c_pushcalc_calc-calc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/pushcalc/calc.c' object='examples/c/pushcalc/examples_c_pushcalc_calc-calc.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_reccalc_reccalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/reccalc/reccalc-scan.obj `if test -f 'examples/c/reccalc/scan.c'; then $(CYGPATH_W) 'examples/c/reccalc/scan.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/reccalc/scan.c'; fi`
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_pushcalc_calc_CPPFLAGS) $(CPPFLAGS) $(examples_c_pushcalc_calc_CFLAGS) $(CFLAGS) -c -o examples/c/pushcalc/examples_c_pushcalc_calc-calc.obj `if test -f 'examples/c/pushcalc/calc.c'; then $(CYGPATH_W) 'examples/c/pushcalc/calc.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/pushcalc/calc.c'; fi`
 
-examples/c/rpcalc/rpcalc-rpcalc.o: examples/c/rpcalc/rpcalc.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_rpcalc_rpcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/rpcalc/rpcalc-rpcalc.o -MD -MP -MF examples/c/rpcalc/$(DEPDIR)/rpcalc-rpcalc.Tpo -c -o examples/c/rpcalc/rpcalc-rpcalc.o `test -f 'examples/c/rpcalc/rpcalc.c' || echo '$(srcdir)/'`examples/c/rpcalc/rpcalc.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/rpcalc/$(DEPDIR)/rpcalc-rpcalc.Tpo examples/c/rpcalc/$(DEPDIR)/rpcalc-rpcalc.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/rpcalc/rpcalc.c' object='examples/c/rpcalc/rpcalc-rpcalc.o' libtool=no @AMDEPBACKSLASH@
+examples/c/reccalc/examples_c_reccalc_reccalc-parse.o: examples/c/reccalc/parse.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_reccalc_reccalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/reccalc/examples_c_reccalc_reccalc-parse.o -MD -MP -MF examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-parse.Tpo -c -o examples/c/reccalc/examples_c_reccalc_reccalc-parse.o `test -f 'examples/c/reccalc/parse.c' || echo '$(srcdir)/'`examples/c/reccalc/parse.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-parse.Tpo examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-parse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/reccalc/parse.c' object='examples/c/reccalc/examples_c_reccalc_reccalc-parse.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_rpcalc_rpcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/rpcalc/rpcalc-rpcalc.o `test -f 'examples/c/rpcalc/rpcalc.c' || echo '$(srcdir)/'`examples/c/rpcalc/rpcalc.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_reccalc_reccalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/reccalc/examples_c_reccalc_reccalc-parse.o `test -f 'examples/c/reccalc/parse.c' || echo '$(srcdir)/'`examples/c/reccalc/parse.c
 
-examples/c/rpcalc/rpcalc-rpcalc.obj: examples/c/rpcalc/rpcalc.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_rpcalc_rpcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/rpcalc/rpcalc-rpcalc.obj -MD -MP -MF examples/c/rpcalc/$(DEPDIR)/rpcalc-rpcalc.Tpo -c -o examples/c/rpcalc/rpcalc-rpcalc.obj `if test -f 'examples/c/rpcalc/rpcalc.c'; then $(CYGPATH_W) 'examples/c/rpcalc/rpcalc.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/rpcalc/rpcalc.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/rpcalc/$(DEPDIR)/rpcalc-rpcalc.Tpo examples/c/rpcalc/$(DEPDIR)/rpcalc-rpcalc.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/rpcalc/rpcalc.c' object='examples/c/rpcalc/rpcalc-rpcalc.obj' libtool=no @AMDEPBACKSLASH@
+examples/c/reccalc/examples_c_reccalc_reccalc-parse.obj: examples/c/reccalc/parse.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_reccalc_reccalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/reccalc/examples_c_reccalc_reccalc-parse.obj -MD -MP -MF examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-parse.Tpo -c -o examples/c/reccalc/examples_c_reccalc_reccalc-parse.obj `if test -f 'examples/c/reccalc/parse.c'; then $(CYGPATH_W) 'examples/c/reccalc/parse.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/reccalc/parse.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-parse.Tpo examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-parse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/reccalc/parse.c' object='examples/c/reccalc/examples_c_reccalc_reccalc-parse.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_rpcalc_rpcalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/rpcalc/rpcalc-rpcalc.obj `if test -f 'examples/c/rpcalc/rpcalc.c'; then $(CYGPATH_W) 'examples/c/rpcalc/rpcalc.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/rpcalc/rpcalc.c'; fi`
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_reccalc_reccalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/reccalc/examples_c_reccalc_reccalc-parse.obj `if test -f 'examples/c/reccalc/parse.c'; then $(CYGPATH_W) 'examples/c/reccalc/parse.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/reccalc/parse.c'; fi`
+
+examples/c/reccalc/examples_c_reccalc_reccalc-scan.o: examples/c/reccalc/scan.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_reccalc_reccalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/reccalc/examples_c_reccalc_reccalc-scan.o -MD -MP -MF examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-scan.Tpo -c -o examples/c/reccalc/examples_c_reccalc_reccalc-scan.o `test -f 'examples/c/reccalc/scan.c' || echo '$(srcdir)/'`examples/c/reccalc/scan.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-scan.Tpo examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-scan.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/reccalc/scan.c' object='examples/c/reccalc/examples_c_reccalc_reccalc-scan.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_reccalc_reccalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/reccalc/examples_c_reccalc_reccalc-scan.o `test -f 'examples/c/reccalc/scan.c' || echo '$(srcdir)/'`examples/c/reccalc/scan.c
+
+examples/c/reccalc/examples_c_reccalc_reccalc-scan.obj: examples/c/reccalc/scan.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_reccalc_reccalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT examples/c/reccalc/examples_c_reccalc_reccalc-scan.obj -MD -MP -MF examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-scan.Tpo -c -o examples/c/reccalc/examples_c_reccalc_reccalc-scan.obj `if test -f 'examples/c/reccalc/scan.c'; then $(CYGPATH_W) 'examples/c/reccalc/scan.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/reccalc/scan.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-scan.Tpo examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-scan.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/reccalc/scan.c' object='examples/c/reccalc/examples_c_reccalc_reccalc-scan.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_reccalc_reccalc_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o examples/c/reccalc/examples_c_reccalc_reccalc-scan.obj `if test -f 'examples/c/reccalc/scan.c'; then $(CYGPATH_W) 'examples/c/reccalc/scan.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/reccalc/scan.c'; fi`
+
+examples/c/rpcalc/examples_c_rpcalc_rpcalc-rpcalc.o: examples/c/rpcalc/rpcalc.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_rpcalc_rpcalc_CPPFLAGS) $(CPPFLAGS) $(examples_c_rpcalc_rpcalc_CFLAGS) $(CFLAGS) -MT examples/c/rpcalc/examples_c_rpcalc_rpcalc-rpcalc.o -MD -MP -MF examples/c/rpcalc/$(DEPDIR)/examples_c_rpcalc_rpcalc-rpcalc.Tpo -c -o examples/c/rpcalc/examples_c_rpcalc_rpcalc-rpcalc.o `test -f 'examples/c/rpcalc/rpcalc.c' || echo '$(srcdir)/'`examples/c/rpcalc/rpcalc.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/rpcalc/$(DEPDIR)/examples_c_rpcalc_rpcalc-rpcalc.Tpo examples/c/rpcalc/$(DEPDIR)/examples_c_rpcalc_rpcalc-rpcalc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/rpcalc/rpcalc.c' object='examples/c/rpcalc/examples_c_rpcalc_rpcalc-rpcalc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_rpcalc_rpcalc_CPPFLAGS) $(CPPFLAGS) $(examples_c_rpcalc_rpcalc_CFLAGS) $(CFLAGS) -c -o examples/c/rpcalc/examples_c_rpcalc_rpcalc-rpcalc.o `test -f 'examples/c/rpcalc/rpcalc.c' || echo '$(srcdir)/'`examples/c/rpcalc/rpcalc.c
+
+examples/c/rpcalc/examples_c_rpcalc_rpcalc-rpcalc.obj: examples/c/rpcalc/rpcalc.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_rpcalc_rpcalc_CPPFLAGS) $(CPPFLAGS) $(examples_c_rpcalc_rpcalc_CFLAGS) $(CFLAGS) -MT examples/c/rpcalc/examples_c_rpcalc_rpcalc-rpcalc.obj -MD -MP -MF examples/c/rpcalc/$(DEPDIR)/examples_c_rpcalc_rpcalc-rpcalc.Tpo -c -o examples/c/rpcalc/examples_c_rpcalc_rpcalc-rpcalc.obj `if test -f 'examples/c/rpcalc/rpcalc.c'; then $(CYGPATH_W) 'examples/c/rpcalc/rpcalc.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/rpcalc/rpcalc.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) examples/c/rpcalc/$(DEPDIR)/examples_c_rpcalc_rpcalc-rpcalc.Tpo examples/c/rpcalc/$(DEPDIR)/examples_c_rpcalc_rpcalc-rpcalc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='examples/c/rpcalc/rpcalc.c' object='examples/c/rpcalc/examples_c_rpcalc_rpcalc-rpcalc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c_rpcalc_rpcalc_CPPFLAGS) $(CPPFLAGS) $(examples_c_rpcalc_rpcalc_CFLAGS) $(CFLAGS) -c -o examples/c/rpcalc/examples_c_rpcalc_rpcalc-rpcalc.obj `if test -f 'examples/c/rpcalc/rpcalc.c'; then $(CYGPATH_W) 'examples/c/rpcalc/rpcalc.c'; else $(CYGPATH_W) '$(srcdir)/examples/c/rpcalc/rpcalc.c'; fi`
 
 src/bison-AnnotationList.o: src/AnnotationList.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-AnnotationList.o -MD -MP -MF src/$(DEPDIR)/bison-AnnotationList.Tpo -c -o src/bison-AnnotationList.o `test -f 'src/AnnotationList.c' || echo '$(srcdir)/'`src/AnnotationList.c
@@ -6905,6 +8855,34 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-conflicts.obj `if test -f 'src/conflicts.c'; then $(CYGPATH_W) 'src/conflicts.c'; else $(CYGPATH_W) '$(srcdir)/src/conflicts.c'; fi`
 
+src/bison-counterexample.o: src/counterexample.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-counterexample.o -MD -MP -MF src/$(DEPDIR)/bison-counterexample.Tpo -c -o src/bison-counterexample.o `test -f 'src/counterexample.c' || echo '$(srcdir)/'`src/counterexample.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-counterexample.Tpo src/$(DEPDIR)/bison-counterexample.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/counterexample.c' object='src/bison-counterexample.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-counterexample.o `test -f 'src/counterexample.c' || echo '$(srcdir)/'`src/counterexample.c
+
+src/bison-counterexample.obj: src/counterexample.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-counterexample.obj -MD -MP -MF src/$(DEPDIR)/bison-counterexample.Tpo -c -o src/bison-counterexample.obj `if test -f 'src/counterexample.c'; then $(CYGPATH_W) 'src/counterexample.c'; else $(CYGPATH_W) '$(srcdir)/src/counterexample.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-counterexample.Tpo src/$(DEPDIR)/bison-counterexample.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/counterexample.c' object='src/bison-counterexample.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-counterexample.obj `if test -f 'src/counterexample.c'; then $(CYGPATH_W) 'src/counterexample.c'; else $(CYGPATH_W) '$(srcdir)/src/counterexample.c'; fi`
+
+src/bison-derivation.o: src/derivation.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-derivation.o -MD -MP -MF src/$(DEPDIR)/bison-derivation.Tpo -c -o src/bison-derivation.o `test -f 'src/derivation.c' || echo '$(srcdir)/'`src/derivation.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-derivation.Tpo src/$(DEPDIR)/bison-derivation.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/derivation.c' object='src/bison-derivation.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-derivation.o `test -f 'src/derivation.c' || echo '$(srcdir)/'`src/derivation.c
+
+src/bison-derivation.obj: src/derivation.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-derivation.obj -MD -MP -MF src/$(DEPDIR)/bison-derivation.Tpo -c -o src/bison-derivation.obj `if test -f 'src/derivation.c'; then $(CYGPATH_W) 'src/derivation.c'; else $(CYGPATH_W) '$(srcdir)/src/derivation.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-derivation.Tpo src/$(DEPDIR)/bison-derivation.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/derivation.c' object='src/bison-derivation.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-derivation.obj `if test -f 'src/derivation.c'; then $(CYGPATH_W) 'src/derivation.c'; else $(CYGPATH_W) '$(srcdir)/src/derivation.c'; fi`
+
 src/bison-derives.o: src/derives.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-derives.o -MD -MP -MF src/$(DEPDIR)/bison-derives.Tpo -c -o src/bison-derives.o `test -f 'src/derives.c' || echo '$(srcdir)/'`src/derives.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-derives.Tpo src/$(DEPDIR)/bison-derives.Po
@@ -6961,6 +8939,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-getargs.obj `if test -f 'src/getargs.c'; then $(CYGPATH_W) 'src/getargs.c'; else $(CYGPATH_W) '$(srcdir)/src/getargs.c'; fi`
 
+src/bison-glyphs.o: src/glyphs.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-glyphs.o -MD -MP -MF src/$(DEPDIR)/bison-glyphs.Tpo -c -o src/bison-glyphs.o `test -f 'src/glyphs.c' || echo '$(srcdir)/'`src/glyphs.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-glyphs.Tpo src/$(DEPDIR)/bison-glyphs.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/glyphs.c' object='src/bison-glyphs.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-glyphs.o `test -f 'src/glyphs.c' || echo '$(srcdir)/'`src/glyphs.c
+
+src/bison-glyphs.obj: src/glyphs.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-glyphs.obj -MD -MP -MF src/$(DEPDIR)/bison-glyphs.Tpo -c -o src/bison-glyphs.obj `if test -f 'src/glyphs.c'; then $(CYGPATH_W) 'src/glyphs.c'; else $(CYGPATH_W) '$(srcdir)/src/glyphs.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-glyphs.Tpo src/$(DEPDIR)/bison-glyphs.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/glyphs.c' object='src/bison-glyphs.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-glyphs.obj `if test -f 'src/glyphs.c'; then $(CYGPATH_W) 'src/glyphs.c'; else $(CYGPATH_W) '$(srcdir)/src/glyphs.c'; fi`
+
 src/bison-gram.o: src/gram.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-gram.o -MD -MP -MF src/$(DEPDIR)/bison-gram.Tpo -c -o src/bison-gram.o `test -f 'src/gram.c' || echo '$(srcdir)/'`src/gram.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-gram.Tpo src/$(DEPDIR)/bison-gram.Po
@@ -7045,6 +9037,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-lr0.obj `if test -f 'src/lr0.c'; then $(CYGPATH_W) 'src/lr0.c'; else $(CYGPATH_W) '$(srcdir)/src/lr0.c'; fi`
 
+src/bison-lssi.o: src/lssi.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-lssi.o -MD -MP -MF src/$(DEPDIR)/bison-lssi.Tpo -c -o src/bison-lssi.o `test -f 'src/lssi.c' || echo '$(srcdir)/'`src/lssi.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-lssi.Tpo src/$(DEPDIR)/bison-lssi.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/lssi.c' object='src/bison-lssi.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-lssi.o `test -f 'src/lssi.c' || echo '$(srcdir)/'`src/lssi.c
+
+src/bison-lssi.obj: src/lssi.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-lssi.obj -MD -MP -MF src/$(DEPDIR)/bison-lssi.Tpo -c -o src/bison-lssi.obj `if test -f 'src/lssi.c'; then $(CYGPATH_W) 'src/lssi.c'; else $(CYGPATH_W) '$(srcdir)/src/lssi.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-lssi.Tpo src/$(DEPDIR)/bison-lssi.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/lssi.c' object='src/bison-lssi.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-lssi.obj `if test -f 'src/lssi.c'; then $(CYGPATH_W) 'src/lssi.c'; else $(CYGPATH_W) '$(srcdir)/src/lssi.c'; fi`
+
 src/bison-main.o: src/main.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-main.o -MD -MP -MF src/$(DEPDIR)/bison-main.Tpo -c -o src/bison-main.o `test -f 'src/main.c' || echo '$(srcdir)/'`src/main.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-main.Tpo src/$(DEPDIR)/bison-main.Po
@@ -7129,6 +9135,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-parse-gram.obj `if test -f 'src/parse-gram.c'; then $(CYGPATH_W) 'src/parse-gram.c'; else $(CYGPATH_W) '$(srcdir)/src/parse-gram.c'; fi`
 
+src/bison-parse-simulation.o: src/parse-simulation.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-parse-simulation.o -MD -MP -MF src/$(DEPDIR)/bison-parse-simulation.Tpo -c -o src/bison-parse-simulation.o `test -f 'src/parse-simulation.c' || echo '$(srcdir)/'`src/parse-simulation.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-parse-simulation.Tpo src/$(DEPDIR)/bison-parse-simulation.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/parse-simulation.c' object='src/bison-parse-simulation.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-parse-simulation.o `test -f 'src/parse-simulation.c' || echo '$(srcdir)/'`src/parse-simulation.c
+
+src/bison-parse-simulation.obj: src/parse-simulation.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-parse-simulation.obj -MD -MP -MF src/$(DEPDIR)/bison-parse-simulation.Tpo -c -o src/bison-parse-simulation.obj `if test -f 'src/parse-simulation.c'; then $(CYGPATH_W) 'src/parse-simulation.c'; else $(CYGPATH_W) '$(srcdir)/src/parse-simulation.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-parse-simulation.Tpo src/$(DEPDIR)/bison-parse-simulation.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/parse-simulation.c' object='src/bison-parse-simulation.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-parse-simulation.obj `if test -f 'src/parse-simulation.c'; then $(CYGPATH_W) 'src/parse-simulation.c'; else $(CYGPATH_W) '$(srcdir)/src/parse-simulation.c'; fi`
+
 src/bison-print-graph.o: src/print-graph.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-print-graph.o -MD -MP -MF src/$(DEPDIR)/bison-print-graph.Tpo -c -o src/bison-print-graph.o `test -f 'src/print-graph.c' || echo '$(srcdir)/'`src/print-graph.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-print-graph.Tpo src/$(DEPDIR)/bison-print-graph.Po
@@ -7269,6 +9289,34 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-state.obj `if test -f 'src/state.c'; then $(CYGPATH_W) 'src/state.c'; else $(CYGPATH_W) '$(srcdir)/src/state.c'; fi`
 
+src/bison-state-item.o: src/state-item.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-state-item.o -MD -MP -MF src/$(DEPDIR)/bison-state-item.Tpo -c -o src/bison-state-item.o `test -f 'src/state-item.c' || echo '$(srcdir)/'`src/state-item.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-state-item.Tpo src/$(DEPDIR)/bison-state-item.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/state-item.c' object='src/bison-state-item.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-state-item.o `test -f 'src/state-item.c' || echo '$(srcdir)/'`src/state-item.c
+
+src/bison-state-item.obj: src/state-item.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-state-item.obj -MD -MP -MF src/$(DEPDIR)/bison-state-item.Tpo -c -o src/bison-state-item.obj `if test -f 'src/state-item.c'; then $(CYGPATH_W) 'src/state-item.c'; else $(CYGPATH_W) '$(srcdir)/src/state-item.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-state-item.Tpo src/$(DEPDIR)/bison-state-item.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/state-item.c' object='src/bison-state-item.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-state-item.obj `if test -f 'src/state-item.c'; then $(CYGPATH_W) 'src/state-item.c'; else $(CYGPATH_W) '$(srcdir)/src/state-item.c'; fi`
+
+src/bison-strversion.o: src/strversion.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-strversion.o -MD -MP -MF src/$(DEPDIR)/bison-strversion.Tpo -c -o src/bison-strversion.o `test -f 'src/strversion.c' || echo '$(srcdir)/'`src/strversion.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-strversion.Tpo src/$(DEPDIR)/bison-strversion.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/strversion.c' object='src/bison-strversion.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-strversion.o `test -f 'src/strversion.c' || echo '$(srcdir)/'`src/strversion.c
+
+src/bison-strversion.obj: src/strversion.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-strversion.obj -MD -MP -MF src/$(DEPDIR)/bison-strversion.Tpo -c -o src/bison-strversion.obj `if test -f 'src/strversion.c'; then $(CYGPATH_W) 'src/strversion.c'; else $(CYGPATH_W) '$(srcdir)/src/strversion.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-strversion.Tpo src/$(DEPDIR)/bison-strversion.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/strversion.c' object='src/bison-strversion.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -c -o src/bison-strversion.obj `if test -f 'src/strversion.c'; then $(CYGPATH_W) 'src/strversion.c'; else $(CYGPATH_W) '$(srcdir)/src/strversion.c'; fi`
+
 src/bison-symlist.o: src/symlist.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_bison_CPPFLAGS) $(CPPFLAGS) $(src_bison_CFLAGS) $(CFLAGS) -MT src/bison-symlist.o -MD -MP -MF src/$(DEPDIR)/bison-symlist.Tpo -c -o src/bison-symlist.o `test -f 'src/symlist.c' || echo '$(srcdir)/'`src/symlist.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/bison-symlist.Tpo src/$(DEPDIR)/bison-symlist.Po
@@ -7439,6 +9487,20 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c___calc___calc___CPPFLAGS) $(CPPFLAGS) $(examples_c___calc___calc___CXXFLAGS) $(CXXFLAGS) -c -o examples/c++/calc++/calc__-parser.obj `if test -f 'examples/c++/calc++/parser.cc'; then $(CYGPATH_W) 'examples/c++/calc++/parser.cc'; else $(CYGPATH_W) '$(srcdir)/examples/c++/calc++/parser.cc'; fi`
 
+examples/c++/glr/examples_c___glr_c___types-c++-types.o: examples/c++/glr/c++-types.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c___glr_c___types_CPPFLAGS) $(CPPFLAGS) $(examples_c___glr_c___types_CXXFLAGS) $(CXXFLAGS) -MT examples/c++/glr/examples_c___glr_c___types-c++-types.o -MD -MP -MF examples/c++/glr/$(DEPDIR)/examples_c___glr_c___types-c++-types.Tpo -c -o examples/c++/glr/examples_c___glr_c___types-c++-types.o `test -f 'examples/c++/glr/c++-types.cc' || echo '$(srcdir)/'`examples/c++/glr/c++-types.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) examples/c++/glr/$(DEPDIR)/examples_c___glr_c___types-c++-types.Tpo examples/c++/glr/$(DEPDIR)/examples_c___glr_c___types-c++-types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='examples/c++/glr/c++-types.cc' object='examples/c++/glr/examples_c___glr_c___types-c++-types.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c___glr_c___types_CPPFLAGS) $(CPPFLAGS) $(examples_c___glr_c___types_CXXFLAGS) $(CXXFLAGS) -c -o examples/c++/glr/examples_c___glr_c___types-c++-types.o `test -f 'examples/c++/glr/c++-types.cc' || echo '$(srcdir)/'`examples/c++/glr/c++-types.cc
+
+examples/c++/glr/examples_c___glr_c___types-c++-types.obj: examples/c++/glr/c++-types.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c___glr_c___types_CPPFLAGS) $(CPPFLAGS) $(examples_c___glr_c___types_CXXFLAGS) $(CXXFLAGS) -MT examples/c++/glr/examples_c___glr_c___types-c++-types.obj -MD -MP -MF examples/c++/glr/$(DEPDIR)/examples_c___glr_c___types-c++-types.Tpo -c -o examples/c++/glr/examples_c___glr_c___types-c++-types.obj `if test -f 'examples/c++/glr/c++-types.cc'; then $(CYGPATH_W) 'examples/c++/glr/c++-types.cc'; else $(CYGPATH_W) '$(srcdir)/examples/c++/glr/c++-types.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) examples/c++/glr/$(DEPDIR)/examples_c___glr_c___types-c++-types.Tpo examples/c++/glr/$(DEPDIR)/examples_c___glr_c___types-c++-types.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='examples/c++/glr/c++-types.cc' object='examples/c++/glr/examples_c___glr_c___types-c++-types.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c___glr_c___types_CPPFLAGS) $(CPPFLAGS) $(examples_c___glr_c___types_CXXFLAGS) $(CXXFLAGS) -c -o examples/c++/glr/examples_c___glr_c___types-c++-types.obj `if test -f 'examples/c++/glr/c++-types.cc'; then $(CYGPATH_W) 'examples/c++/glr/c++-types.cc'; else $(CYGPATH_W) '$(srcdir)/examples/c++/glr/c++-types.cc'; fi`
+
 examples/c++/simple-simple.o: examples/c++/simple.cc
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(examples_c___simple_CPPFLAGS) $(CPPFLAGS) $(examples_c___simple_CXXFLAGS) $(CXXFLAGS) -MT examples/c++/simple-simple.o -MD -MP -MF examples/c++/$(DEPDIR)/simple-simple.Tpo -c -o examples/c++/simple-simple.o `test -f 'examples/c++/simple.cc' || echo '$(srcdir)/'`examples/c++/simple.cc
 @am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) examples/c++/$(DEPDIR)/simple-simple.Tpo examples/c++/$(DEPDIR)/simple-simple.Po
@@ -7779,6 +9841,27 @@
 	@list='$(cxx_DATA)'; test -n "$(cxxdir)" || list=; \
 	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
 	dir='$(DESTDIR)$(cxxdir)'; $(am__uninstall_files_from_dir)
+install-dist_bistromathicDATA: $(dist_bistromathic_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(dist_bistromathic_DATA)'; test -n "$(bistromathicdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bistromathicdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bistromathicdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(bistromathicdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(bistromathicdir)" || exit $$?; \
+	done
+
+uninstall-dist_bistromathicDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(dist_bistromathic_DATA)'; test -n "$(bistromathicdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(bistromathicdir)'; $(am__uninstall_files_from_dir)
 install-dist_cDATA: $(dist_c_DATA)
 	@$(NORMAL_INSTALL)
 	@list='$(dist_c_DATA)'; test -n "$(cdir)" || list=; \
@@ -7821,6 +9904,27 @@
 	@list='$(dist_calc_DATA)'; test -n "$(calcdir)" || list=; \
 	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
 	dir='$(DESTDIR)$(calcdir)'; $(am__uninstall_files_from_dir)
+install-dist_calcdDATA: $(dist_calcd_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(dist_calcd_DATA)'; test -n "$(calcddir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(calcddir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(calcddir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(calcddir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(calcddir)" || exit $$?; \
+	done
+
+uninstall-dist_calcdDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(dist_calcd_DATA)'; test -n "$(calcddir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(calcddir)'; $(am__uninstall_files_from_dir)
 install-dist_calcxxDATA: $(dist_calcxx_DATA)
 	@$(NORMAL_INSTALL)
 	@list='$(dist_calcxx_DATA)'; test -n "$(calcxxdir)" || list=; \
@@ -7926,6 +10030,27 @@
 	@list='$(dist_examples_DATA)'; test -n "$(examplesdir)" || list=; \
 	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
 	dir='$(DESTDIR)$(examplesdir)'; $(am__uninstall_files_from_dir)
+install-dist_glrDATA: $(dist_glr_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(dist_glr_DATA)'; test -n "$(glrdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(glrdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(glrdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(glrdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(glrdir)" || exit $$?; \
+	done
+
+uninstall-dist_glrDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(dist_glr_DATA)'; test -n "$(glrdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(glrdir)'; $(am__uninstall_files_from_dir)
 install-dist_javaDATA: $(dist_java_DATA)
 	@$(NORMAL_INSTALL)
 	@list='$(dist_java_DATA)'; test -n "$(javadir)" || list=; \
@@ -7947,6 +10072,48 @@
 	@list='$(dist_java_DATA)'; test -n "$(javadir)" || list=; \
 	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
 	dir='$(DESTDIR)$(javadir)'; $(am__uninstall_files_from_dir)
+install-dist_java_calcDATA: $(dist_java_calc_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(dist_java_calc_DATA)'; test -n "$(java_calcdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(java_calcdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(java_calcdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(java_calcdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(java_calcdir)" || exit $$?; \
+	done
+
+uninstall-dist_java_calcDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(dist_java_calc_DATA)'; test -n "$(java_calcdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(java_calcdir)'; $(am__uninstall_files_from_dir)
+install-dist_java_simpleDATA: $(dist_java_simple_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(dist_java_simple_DATA)'; test -n "$(java_simpledir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(java_simpledir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(java_simpledir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(java_simpledir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(java_simpledir)" || exit $$?; \
+	done
+
+uninstall-dist_java_simpleDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(dist_java_simple_DATA)'; test -n "$(java_simpledir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(java_simpledir)'; $(am__uninstall_files_from_dir)
 install-dist_lexcalcDATA: $(dist_lexcalc_DATA)
 	@$(NORMAL_INSTALL)
 	@list='$(dist_lexcalc_DATA)'; test -n "$(lexcalcdir)" || list=; \
@@ -8031,6 +10198,27 @@
 	@list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
 	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
 	dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
+install-dist_pushcalcDATA: $(dist_pushcalc_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(dist_pushcalc_DATA)'; test -n "$(pushcalcdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pushcalcdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pushcalcdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pushcalcdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pushcalcdir)" || exit $$?; \
+	done
+
+uninstall-dist_pushcalcDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(dist_pushcalc_DATA)'; test -n "$(pushcalcdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pushcalcdir)'; $(am__uninstall_files_from_dir)
 install-dist_reccalcDATA: $(dist_reccalc_DATA)
 	@$(NORMAL_INSTALL)
 	@list='$(dist_reccalc_DATA)'; test -n "$(reccalcdir)" || list=; \
@@ -8073,6 +10261,27 @@
 	@list='$(dist_rpcalc_DATA)'; test -n "$(rpcalcdir)" || list=; \
 	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
 	dir='$(DESTDIR)$(rpcalcdir)'; $(am__uninstall_files_from_dir)
+install-dist_simpledDATA: $(dist_simpled_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(dist_simpled_DATA)'; test -n "$(simpleddir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(simpleddir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(simpleddir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(simpleddir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(simpleddir)" || exit $$?; \
+	done
+
+uninstall-dist_simpledDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(dist_simpled_DATA)'; test -n "$(simpleddir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(simpleddir)'; $(am__uninstall_files_from_dir)
 install-dist_skeletonsDATA: $(dist_skeletons_DATA)
 	@$(NORMAL_INSTALL)
 	@list='$(dist_skeletons_DATA)'; test -n "$(skeletonsdir)" || list=; \
@@ -8371,7 +10580,7 @@
 	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
 	fi;								\
 	echo "$${col}$$br$${std}"; 					\
-	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}";	\
 	echo "$${col}$$br$${std}"; 					\
 	create_testsuite_report --maybe-color;				\
 	echo "$$col$$br$$std";						\
@@ -8408,7 +10617,6 @@
 @am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
 @am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
 @am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
-
 distdir: $(BUILT_SOURCES)
 	$(MAKE) $(AM_MAKEFLAGS) distdir-am
 
@@ -8492,7 +10700,6 @@
 dist-bzip2: distdir
 	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
 	$(am__post_remove_distdir)
-
 dist-lzip: distdir
 	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
 	$(am__post_remove_distdir)
@@ -8500,6 +10707,10 @@
 	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
 	$(am__post_remove_distdir)
 
+dist-zstd: distdir
+	tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst
+	$(am__post_remove_distdir)
+
 dist-tarZ: distdir
 	@echo WARNING: "Support for distribution archives compressed with" \
 		       "legacy program 'compress' is deprecated." >&2
@@ -8542,6 +10753,8 @@
 	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
 	*.zip*) \
 	  unzip $(distdir).zip ;;\
+	*.tar.zst*) \
+	  zstd -dc $(distdir).tar.zst | $(am__untar) ;;\
 	esac
 	chmod -R a-w $(distdir)
 	chmod u+w $(distdir)
@@ -8557,7 +10770,7 @@
 	    $(DISTCHECK_CONFIGURE_FLAGS) \
 	    --srcdir=../.. --prefix="$$dc_install_base" \
 	  && $(MAKE) $(AM_MAKEFLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
 	  && $(MAKE) $(AM_MAKEFLAGS) check \
 	  && $(MAKE) $(AM_MAKEFLAGS) install \
 	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
@@ -8614,15 +10827,16 @@
 check: $(BUILT_SOURCES)
 	$(MAKE) $(AM_MAKEFLAGS) check-recursive
 all-am: Makefile $(INFO_DEPS) $(PROGRAMS) $(LIBRARIES) $(SCRIPTS) \
-		$(MANS) $(DATA)
+		$(MANS) $(DATA) all-local
 installdirs: installdirs-recursive
 installdirs-am:
-	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(aclocaldir)" "$(DESTDIR)$(calcxxdir)" "$(DESTDIR)$(cxxdir)" "$(DESTDIR)$(cdir)" "$(DESTDIR)$(calcdir)" "$(DESTDIR)$(calcxxdir)" "$(DESTDIR)$(cxxdir)" "$(DESTDIR)$(ddir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(examplesdir)" "$(DESTDIR)$(javadir)" "$(DESTDIR)$(lexcalcdir)" "$(DESTDIR)$(m4sugardir)" "$(DESTDIR)$(mfcalcdir)" "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(reccalcdir)" "$(DESTDIR)$(rpcalcdir)" "$(DESTDIR)$(skeletonsdir)" "$(DESTDIR)$(xsltdir)" "$(DESTDIR)$(mfcalcdir)" "$(DESTDIR)$(rpcalcdir)"; do \
+	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(aclocaldir)" "$(DESTDIR)$(calcxxdir)" "$(DESTDIR)$(cxxdir)" "$(DESTDIR)$(bistromathicdir)" "$(DESTDIR)$(cdir)" "$(DESTDIR)$(calcdir)" "$(DESTDIR)$(calcddir)" "$(DESTDIR)$(calcxxdir)" "$(DESTDIR)$(cxxdir)" "$(DESTDIR)$(ddir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(examplesdir)" "$(DESTDIR)$(glrdir)" "$(DESTDIR)$(javadir)" "$(DESTDIR)$(java_calcdir)" "$(DESTDIR)$(java_simpledir)" "$(DESTDIR)$(lexcalcdir)" "$(DESTDIR)$(m4sugardir)" "$(DESTDIR)$(mfcalcdir)" "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(pushcalcdir)" "$(DESTDIR)$(reccalcdir)" "$(DESTDIR)$(rpcalcdir)" "$(DESTDIR)$(simpleddir)" "$(DESTDIR)$(skeletonsdir)" "$(DESTDIR)$(xsltdir)" "$(DESTDIR)$(mfcalcdir)" "$(DESTDIR)$(rpcalcdir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
 install: $(BUILT_SOURCES)
 	$(MAKE) $(AM_MAKEFLAGS) install-recursive
-install-exec: install-exec-recursive
+install-exec: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-exec-recursive
 install-data: install-data-recursive
 uninstall: uninstall-recursive
 
@@ -8651,10 +10865,13 @@
 	-rm -f examples/c++/simple.cc
 	-rm -f examples/c++/variant-11.cc
 	-rm -f examples/c++/variant.cc
+	-rm -f examples/c/bistromathic/parse.c
 	-rm -f examples/c/calc/calc.c
+	-rm -f examples/c/glr/c++-types.c
 	-rm -f examples/c/lexcalc/parse.c
 	-rm -f examples/c/lexcalc/scan.c
 	-rm -f examples/c/mfcalc/mfcalc.c
+	-rm -f examples/c/pushcalc/calc.c
 	-rm -f examples/c/reccalc/parse.c
 	-rm -f examples/c/rpcalc/rpcalc.c
 	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
@@ -8667,12 +10884,20 @@
 	-rm -f examples/c++/$(am__dirstamp)
 	-rm -f examples/c++/calc++/$(DEPDIR)/$(am__dirstamp)
 	-rm -f examples/c++/calc++/$(am__dirstamp)
+	-rm -f examples/c++/glr/$(DEPDIR)/$(am__dirstamp)
+	-rm -f examples/c++/glr/$(am__dirstamp)
+	-rm -f examples/c/bistromathic/$(DEPDIR)/$(am__dirstamp)
+	-rm -f examples/c/bistromathic/$(am__dirstamp)
 	-rm -f examples/c/calc/$(DEPDIR)/$(am__dirstamp)
 	-rm -f examples/c/calc/$(am__dirstamp)
+	-rm -f examples/c/glr/$(DEPDIR)/$(am__dirstamp)
+	-rm -f examples/c/glr/$(am__dirstamp)
 	-rm -f examples/c/lexcalc/$(DEPDIR)/$(am__dirstamp)
 	-rm -f examples/c/lexcalc/$(am__dirstamp)
 	-rm -f examples/c/mfcalc/$(DEPDIR)/$(am__dirstamp)
 	-rm -f examples/c/mfcalc/$(am__dirstamp)
+	-rm -f examples/c/pushcalc/$(DEPDIR)/$(am__dirstamp)
+	-rm -f examples/c/pushcalc/$(am__dirstamp)
 	-rm -f examples/c/reccalc/$(DEPDIR)/$(am__dirstamp)
 	-rm -f examples/c/reccalc/$(am__dirstamp)
 	-rm -f examples/c/rpcalc/$(DEPDIR)/$(am__dirstamp)
@@ -8683,6 +10908,10 @@
 	-rm -f lib/bitset/$(am__dirstamp)
 	-rm -f lib/glthread/$(DEPDIR)/$(am__dirstamp)
 	-rm -f lib/glthread/$(am__dirstamp)
+	-rm -f lib/malloc/$(DEPDIR)/$(am__dirstamp)
+	-rm -f lib/malloc/$(am__dirstamp)
+	-rm -f lib/unistr/$(DEPDIR)/$(am__dirstamp)
+	-rm -f lib/unistr/$(am__dirstamp)
 	-rm -f lib/uniwidth/$(DEPDIR)/$(am__dirstamp)
 	-rm -f lib/uniwidth/$(am__dirstamp)
 	-rm -f src/$(DEPDIR)/$(am__dirstamp)
@@ -8714,18 +10943,24 @@
 	-rm -f examples/c++/calc++/$(DEPDIR)/calc__-driver.Po
 	-rm -f examples/c++/calc++/$(DEPDIR)/calc__-parser.Po
 	-rm -f examples/c++/calc++/$(DEPDIR)/calc__-scanner.Po
-	-rm -f examples/c/calc/$(DEPDIR)/calc-calc.Po
-	-rm -f examples/c/lexcalc/$(DEPDIR)/lexcalc-parse.Po
-	-rm -f examples/c/lexcalc/$(DEPDIR)/lexcalc-scan.Po
-	-rm -f examples/c/mfcalc/$(DEPDIR)/mfcalc-mfcalc.Po
-	-rm -f examples/c/reccalc/$(DEPDIR)/reccalc-parse.Po
-	-rm -f examples/c/reccalc/$(DEPDIR)/reccalc-scan.Po
-	-rm -f examples/c/rpcalc/$(DEPDIR)/rpcalc-rpcalc.Po
+	-rm -f examples/c++/glr/$(DEPDIR)/examples_c___glr_c___types-c++-types.Po
+	-rm -f examples/c/bistromathic/$(DEPDIR)/bistromathic-parse.Po
+	-rm -f examples/c/calc/$(DEPDIR)/examples_c_calc_calc-calc.Po
+	-rm -f examples/c/glr/$(DEPDIR)/examples_c_glr_c___types-c++-types.Po
+	-rm -f examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-parse.Po
+	-rm -f examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-scan.Po
+	-rm -f examples/c/mfcalc/$(DEPDIR)/examples_c_mfcalc_mfcalc-mfcalc.Po
+	-rm -f examples/c/pushcalc/$(DEPDIR)/examples_c_pushcalc_calc-calc.Po
+	-rm -f examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-parse.Po
+	-rm -f examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-scan.Po
+	-rm -f examples/c/rpcalc/$(DEPDIR)/examples_c_rpcalc_rpcalc-rpcalc.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-access.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-allocator.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-areadlink.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-argmatch.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-asnprintf.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-asprintf.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-at-func.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-basename-lgpl.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-basename.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-binary-io.Po
@@ -8737,38 +10972,57 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-c-strncasecmp.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-calloc.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-canonicalize-lgpl.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-canonicalize.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-careadlinkat.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-chdir-long.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-cloexec.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-close-stream.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-close.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-closedir.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-closeout.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-concat-filename.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-dirfd.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-dirname-lgpl.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-dirname.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-dup-safer-flag.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-dup-safer.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-dup.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-dup2.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-error.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-execute.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-exitfail.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fatal-signal.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-fchdir.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fcntl.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fd-hook.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fd-safer-flag.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fd-safer.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-fdopendir.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-ffs.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-ffsl.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-file-set.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-filenamecat-lgpl.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-findprog-in.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-float.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fopen-safer.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fopen.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fpending.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fprintf.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-free.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-frexp.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-frexpl.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fseterr.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fstat.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-fstatat.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fstrcmp.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fsync.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-get-errno.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-getcwd-lgpl.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-getcwd.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-getdelim.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-getdtablesize.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-gethrxtime.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-getline.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-getopt.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-getopt1.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-getprogname.Po
@@ -8776,19 +11030,36 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-gettime.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-gettimeofday.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-gl_array_list.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-gl_hash_map.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-gl_linked_list.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-gl_list.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-gl_map.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-gl_oset.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-gl_rbtree_oset.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-gl_rbtreehash_list.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-gl_xlist.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-gl_xmap.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-hard-locale.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-hash-pjw.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-hash-triple-simple.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-hash.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-ialloc.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-iconv.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-iconv_close.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-iconv_open.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-integer_length.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-integer_length_l.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-isnan.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-isnand.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-isnanf.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-isnanl.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-iswblank.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-iswdigit.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-iswxdigit.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-itold.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-lc-charset-dispatch.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-ldexpl.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-localcharset.Po
-	-rm -f lib/$(DEPDIR)/libbison_a-localtime-buffer.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-lstat.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-malloc.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-malloca.Po
@@ -8798,15 +11069,24 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-mbrtowc.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-mbsinit.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-mbswidth.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-mbtowc-lock.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-memchr.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-mempcpy.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-memrchr.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-msvc-inval.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-msvc-nothrow.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-obstack.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-obstack_printf.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-open.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-openat-die.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-openat-proc.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-openat.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-opendir.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-os2-spawn.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-path-join.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-perror.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-pipe-safer.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-pipe.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-pipe2-safer.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-pipe2.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-printf-args.Po
@@ -8819,11 +11099,18 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-quotearg.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-raise.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-rawmemchr.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-readdir.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-readline.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-readlink.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-realloc.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-reallocarray.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-relocatable.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-rename.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-rewinddir.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-rmdir.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-save-cwd.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-setlocale-lock.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-setlocale_null.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-sig-handler.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-sigaction.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-signbitd.Po
@@ -8832,6 +11119,8 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-sigprocmask.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-snprintf.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawn-pipe.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-spawn.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-spawn_faction_addchdir.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawn_faction_addclose.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawn_faction_adddup2.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawn_faction_addopen.Po
@@ -8840,6 +11129,7 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-spawnattr_destroy.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawnattr_init.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawnattr_setflags.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-spawnattr_setpgroup.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawnattr_setsigmask.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawni.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawnp.Po
@@ -8848,6 +11138,7 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-stat-w32.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-stat.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-stpcpy.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-stpncpy.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-strchrnul.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-strdup.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-strerror-override.Po
@@ -8856,9 +11147,11 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-stripslash.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-strndup.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-strnlen.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-strtod.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-strverscmp.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-timespec.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-timevar.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-unicodeio.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-unistd.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-unlink.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-unsetenv.Po
@@ -8875,6 +11168,7 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-windows-once.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-windows-recmutex.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-windows-rwlock.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-windows-spawn.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-windows-tls.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-xalloc-die.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-xconcat-filename.Po
@@ -8895,6 +11189,13 @@
 	-rm -f lib/glthread/$(DEPDIR)/libbison_a-lock.Po
 	-rm -f lib/glthread/$(DEPDIR)/libbison_a-threadlib.Po
 	-rm -f lib/glthread/$(DEPDIR)/libbison_a-tls.Po
+	-rm -f lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_dupfree.Po
+	-rm -f lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow.Po
+	-rm -f lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow_preserve.Po
+	-rm -f lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_set_array_size.Po
+	-rm -f lib/unistr/$(DEPDIR)/libbison_a-u8-mbtoucr.Po
+	-rm -f lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb-aux.Po
+	-rm -f lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb.Po
 	-rm -f lib/uniwidth/$(DEPDIR)/libbison_a-width.Po
 	-rm -f src/$(DEPDIR)/bison-AnnotationList.Po
 	-rm -f src/$(DEPDIR)/bison-InadequacyList.Po
@@ -8903,22 +11204,27 @@
 	-rm -f src/$(DEPDIR)/bison-closure.Po
 	-rm -f src/$(DEPDIR)/bison-complain.Po
 	-rm -f src/$(DEPDIR)/bison-conflicts.Po
+	-rm -f src/$(DEPDIR)/bison-counterexample.Po
+	-rm -f src/$(DEPDIR)/bison-derivation.Po
 	-rm -f src/$(DEPDIR)/bison-derives.Po
 	-rm -f src/$(DEPDIR)/bison-files.Po
 	-rm -f src/$(DEPDIR)/bison-fixits.Po
 	-rm -f src/$(DEPDIR)/bison-getargs.Po
+	-rm -f src/$(DEPDIR)/bison-glyphs.Po
 	-rm -f src/$(DEPDIR)/bison-gram.Po
 	-rm -f src/$(DEPDIR)/bison-graphviz.Po
 	-rm -f src/$(DEPDIR)/bison-ielr.Po
 	-rm -f src/$(DEPDIR)/bison-lalr.Po
 	-rm -f src/$(DEPDIR)/bison-location.Po
 	-rm -f src/$(DEPDIR)/bison-lr0.Po
+	-rm -f src/$(DEPDIR)/bison-lssi.Po
 	-rm -f src/$(DEPDIR)/bison-main.Po
 	-rm -f src/$(DEPDIR)/bison-muscle-tab.Po
 	-rm -f src/$(DEPDIR)/bison-named-ref.Po
 	-rm -f src/$(DEPDIR)/bison-nullable.Po
 	-rm -f src/$(DEPDIR)/bison-output.Po
 	-rm -f src/$(DEPDIR)/bison-parse-gram.Po
+	-rm -f src/$(DEPDIR)/bison-parse-simulation.Po
 	-rm -f src/$(DEPDIR)/bison-print-graph.Po
 	-rm -f src/$(DEPDIR)/bison-print-xml.Po
 	-rm -f src/$(DEPDIR)/bison-print.Po
@@ -8931,7 +11237,9 @@
 	-rm -f src/$(DEPDIR)/bison-scan-gram.Po
 	-rm -f src/$(DEPDIR)/bison-scan-skel-c.Po
 	-rm -f src/$(DEPDIR)/bison-scan-skel.Po
+	-rm -f src/$(DEPDIR)/bison-state-item.Po
 	-rm -f src/$(DEPDIR)/bison-state.Po
+	-rm -f src/$(DEPDIR)/bison-strversion.Po
 	-rm -f src/$(DEPDIR)/bison-symlist.Po
 	-rm -f src/$(DEPDIR)/bison-symtab.Po
 	-rm -f src/$(DEPDIR)/bison-tables.Po
@@ -8953,16 +11261,19 @@
 info-am: $(INFO_DEPS)
 
 install-data-am: install-aclocalDATA install-calcxxDATA \
-	install-cxxDATA install-dist_cDATA install-dist_calcDATA \
-	install-dist_calcxxDATA install-dist_cxxDATA \
-	install-dist_dDATA install-dist_docDATA \
-	install-dist_examplesDATA install-dist_javaDATA \
-	install-dist_lexcalcDATA install-dist_m4sugarDATA \
-	install-dist_mfcalcDATA install-dist_pkgdataDATA \
+	install-cxxDATA install-dist_bistromathicDATA \
+	install-dist_cDATA install-dist_calcDATA \
+	install-dist_calcdDATA install-dist_calcxxDATA \
+	install-dist_cxxDATA install-dist_dDATA install-dist_docDATA \
+	install-dist_examplesDATA install-dist_glrDATA \
+	install-dist_javaDATA install-dist_java_calcDATA \
+	install-dist_java_simpleDATA install-dist_lexcalcDATA \
+	install-dist_m4sugarDATA install-dist_mfcalcDATA \
+	install-dist_pkgdataDATA install-dist_pushcalcDATA \
 	install-dist_reccalcDATA install-dist_rpcalcDATA \
-	install-dist_skeletonsDATA install-dist_xsltDATA \
-	install-info-am install-man install-mfcalcDATA \
-	install-rpcalcDATA
+	install-dist_simpledDATA install-dist_skeletonsDATA \
+	install-dist_xsltDATA install-info-am install-man \
+	install-mfcalcDATA install-rpcalcDATA
 
 install-dvi: install-dvi-recursive
 
@@ -9093,18 +11404,24 @@
 	-rm -f examples/c++/calc++/$(DEPDIR)/calc__-driver.Po
 	-rm -f examples/c++/calc++/$(DEPDIR)/calc__-parser.Po
 	-rm -f examples/c++/calc++/$(DEPDIR)/calc__-scanner.Po
-	-rm -f examples/c/calc/$(DEPDIR)/calc-calc.Po
-	-rm -f examples/c/lexcalc/$(DEPDIR)/lexcalc-parse.Po
-	-rm -f examples/c/lexcalc/$(DEPDIR)/lexcalc-scan.Po
-	-rm -f examples/c/mfcalc/$(DEPDIR)/mfcalc-mfcalc.Po
-	-rm -f examples/c/reccalc/$(DEPDIR)/reccalc-parse.Po
-	-rm -f examples/c/reccalc/$(DEPDIR)/reccalc-scan.Po
-	-rm -f examples/c/rpcalc/$(DEPDIR)/rpcalc-rpcalc.Po
+	-rm -f examples/c++/glr/$(DEPDIR)/examples_c___glr_c___types-c++-types.Po
+	-rm -f examples/c/bistromathic/$(DEPDIR)/bistromathic-parse.Po
+	-rm -f examples/c/calc/$(DEPDIR)/examples_c_calc_calc-calc.Po
+	-rm -f examples/c/glr/$(DEPDIR)/examples_c_glr_c___types-c++-types.Po
+	-rm -f examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-parse.Po
+	-rm -f examples/c/lexcalc/$(DEPDIR)/examples_c_lexcalc_lexcalc-scan.Po
+	-rm -f examples/c/mfcalc/$(DEPDIR)/examples_c_mfcalc_mfcalc-mfcalc.Po
+	-rm -f examples/c/pushcalc/$(DEPDIR)/examples_c_pushcalc_calc-calc.Po
+	-rm -f examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-parse.Po
+	-rm -f examples/c/reccalc/$(DEPDIR)/examples_c_reccalc_reccalc-scan.Po
+	-rm -f examples/c/rpcalc/$(DEPDIR)/examples_c_rpcalc_rpcalc-rpcalc.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-access.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-allocator.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-areadlink.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-argmatch.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-asnprintf.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-asprintf.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-at-func.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-basename-lgpl.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-basename.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-binary-io.Po
@@ -9116,38 +11433,57 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-c-strncasecmp.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-calloc.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-canonicalize-lgpl.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-canonicalize.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-careadlinkat.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-chdir-long.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-cloexec.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-close-stream.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-close.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-closedir.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-closeout.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-concat-filename.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-dirfd.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-dirname-lgpl.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-dirname.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-dup-safer-flag.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-dup-safer.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-dup.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-dup2.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-error.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-execute.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-exitfail.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fatal-signal.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-fchdir.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fcntl.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fd-hook.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fd-safer-flag.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fd-safer.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-fdopendir.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-ffs.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-ffsl.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-file-set.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-filenamecat-lgpl.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-findprog-in.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-float.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fopen-safer.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fopen.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fpending.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fprintf.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-free.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-frexp.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-frexpl.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fseterr.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fstat.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-fstatat.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fstrcmp.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-fsync.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-get-errno.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-getcwd-lgpl.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-getcwd.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-getdelim.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-getdtablesize.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-gethrxtime.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-getline.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-getopt.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-getopt1.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-getprogname.Po
@@ -9155,19 +11491,36 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-gettime.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-gettimeofday.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-gl_array_list.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-gl_hash_map.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-gl_linked_list.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-gl_list.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-gl_map.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-gl_oset.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-gl_rbtree_oset.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-gl_rbtreehash_list.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-gl_xlist.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-gl_xmap.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-hard-locale.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-hash-pjw.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-hash-triple-simple.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-hash.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-ialloc.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-iconv.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-iconv_close.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-iconv_open.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-integer_length.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-integer_length_l.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-isnan.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-isnand.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-isnanf.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-isnanl.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-iswblank.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-iswdigit.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-iswxdigit.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-itold.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-lc-charset-dispatch.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-ldexpl.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-localcharset.Po
-	-rm -f lib/$(DEPDIR)/libbison_a-localtime-buffer.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-lstat.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-malloc.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-malloca.Po
@@ -9177,15 +11530,24 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-mbrtowc.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-mbsinit.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-mbswidth.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-mbtowc-lock.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-memchr.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-mempcpy.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-memrchr.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-msvc-inval.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-msvc-nothrow.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-obstack.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-obstack_printf.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-open.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-openat-die.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-openat-proc.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-openat.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-opendir.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-os2-spawn.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-path-join.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-perror.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-pipe-safer.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-pipe.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-pipe2-safer.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-pipe2.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-printf-args.Po
@@ -9198,11 +11560,18 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-quotearg.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-raise.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-rawmemchr.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-readdir.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-readline.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-readlink.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-realloc.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-reallocarray.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-relocatable.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-rename.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-rewinddir.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-rmdir.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-save-cwd.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-setlocale-lock.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-setlocale_null.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-sig-handler.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-sigaction.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-signbitd.Po
@@ -9211,6 +11580,8 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-sigprocmask.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-snprintf.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawn-pipe.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-spawn.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-spawn_faction_addchdir.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawn_faction_addclose.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawn_faction_adddup2.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawn_faction_addopen.Po
@@ -9219,6 +11590,7 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-spawnattr_destroy.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawnattr_init.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawnattr_setflags.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-spawnattr_setpgroup.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawnattr_setsigmask.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawni.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-spawnp.Po
@@ -9227,6 +11599,7 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-stat-w32.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-stat.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-stpcpy.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-stpncpy.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-strchrnul.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-strdup.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-strerror-override.Po
@@ -9235,9 +11608,11 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-stripslash.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-strndup.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-strnlen.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-strtod.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-strverscmp.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-timespec.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-timevar.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-unicodeio.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-unistd.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-unlink.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-unsetenv.Po
@@ -9254,6 +11629,7 @@
 	-rm -f lib/$(DEPDIR)/libbison_a-windows-once.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-windows-recmutex.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-windows-rwlock.Po
+	-rm -f lib/$(DEPDIR)/libbison_a-windows-spawn.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-windows-tls.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-xalloc-die.Po
 	-rm -f lib/$(DEPDIR)/libbison_a-xconcat-filename.Po
@@ -9274,6 +11650,13 @@
 	-rm -f lib/glthread/$(DEPDIR)/libbison_a-lock.Po
 	-rm -f lib/glthread/$(DEPDIR)/libbison_a-threadlib.Po
 	-rm -f lib/glthread/$(DEPDIR)/libbison_a-tls.Po
+	-rm -f lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_dupfree.Po
+	-rm -f lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow.Po
+	-rm -f lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_grow_preserve.Po
+	-rm -f lib/malloc/$(DEPDIR)/libbison_a-scratch_buffer_set_array_size.Po
+	-rm -f lib/unistr/$(DEPDIR)/libbison_a-u8-mbtoucr.Po
+	-rm -f lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb-aux.Po
+	-rm -f lib/unistr/$(DEPDIR)/libbison_a-u8-uctomb.Po
 	-rm -f lib/uniwidth/$(DEPDIR)/libbison_a-width.Po
 	-rm -f src/$(DEPDIR)/bison-AnnotationList.Po
 	-rm -f src/$(DEPDIR)/bison-InadequacyList.Po
@@ -9282,22 +11665,27 @@
 	-rm -f src/$(DEPDIR)/bison-closure.Po
 	-rm -f src/$(DEPDIR)/bison-complain.Po
 	-rm -f src/$(DEPDIR)/bison-conflicts.Po
+	-rm -f src/$(DEPDIR)/bison-counterexample.Po
+	-rm -f src/$(DEPDIR)/bison-derivation.Po
 	-rm -f src/$(DEPDIR)/bison-derives.Po
 	-rm -f src/$(DEPDIR)/bison-files.Po
 	-rm -f src/$(DEPDIR)/bison-fixits.Po
 	-rm -f src/$(DEPDIR)/bison-getargs.Po
+	-rm -f src/$(DEPDIR)/bison-glyphs.Po
 	-rm -f src/$(DEPDIR)/bison-gram.Po
 	-rm -f src/$(DEPDIR)/bison-graphviz.Po
 	-rm -f src/$(DEPDIR)/bison-ielr.Po
 	-rm -f src/$(DEPDIR)/bison-lalr.Po
 	-rm -f src/$(DEPDIR)/bison-location.Po
 	-rm -f src/$(DEPDIR)/bison-lr0.Po
+	-rm -f src/$(DEPDIR)/bison-lssi.Po
 	-rm -f src/$(DEPDIR)/bison-main.Po
 	-rm -f src/$(DEPDIR)/bison-muscle-tab.Po
 	-rm -f src/$(DEPDIR)/bison-named-ref.Po
 	-rm -f src/$(DEPDIR)/bison-nullable.Po
 	-rm -f src/$(DEPDIR)/bison-output.Po
 	-rm -f src/$(DEPDIR)/bison-parse-gram.Po
+	-rm -f src/$(DEPDIR)/bison-parse-simulation.Po
 	-rm -f src/$(DEPDIR)/bison-print-graph.Po
 	-rm -f src/$(DEPDIR)/bison-print-xml.Po
 	-rm -f src/$(DEPDIR)/bison-print.Po
@@ -9310,7 +11698,9 @@
 	-rm -f src/$(DEPDIR)/bison-scan-gram.Po
 	-rm -f src/$(DEPDIR)/bison-scan-skel-c.Po
 	-rm -f src/$(DEPDIR)/bison-scan-skel.Po
+	-rm -f src/$(DEPDIR)/bison-state-item.Po
 	-rm -f src/$(DEPDIR)/bison-state.Po
+	-rm -f src/$(DEPDIR)/bison-strversion.Po
 	-rm -f src/$(DEPDIR)/bison-symlist.Po
 	-rm -f src/$(DEPDIR)/bison-symtab.Po
 	-rm -f src/$(DEPDIR)/bison-tables.Po
@@ -9333,14 +11723,18 @@
 ps-am: $(PSS)
 
 uninstall-am: uninstall-aclocalDATA uninstall-binPROGRAMS \
-	uninstall-calcxxDATA uninstall-cxxDATA uninstall-dist_cDATA \
-	uninstall-dist_calcDATA uninstall-dist_calcxxDATA \
-	uninstall-dist_cxxDATA uninstall-dist_dDATA \
-	uninstall-dist_docDATA uninstall-dist_examplesDATA \
-	uninstall-dist_javaDATA uninstall-dist_lexcalcDATA \
+	uninstall-calcxxDATA uninstall-cxxDATA \
+	uninstall-dist_bistromathicDATA uninstall-dist_cDATA \
+	uninstall-dist_calcDATA uninstall-dist_calcdDATA \
+	uninstall-dist_calcxxDATA uninstall-dist_cxxDATA \
+	uninstall-dist_dDATA uninstall-dist_docDATA \
+	uninstall-dist_examplesDATA uninstall-dist_glrDATA \
+	uninstall-dist_javaDATA uninstall-dist_java_calcDATA \
+	uninstall-dist_java_simpleDATA uninstall-dist_lexcalcDATA \
 	uninstall-dist_m4sugarDATA uninstall-dist_mfcalcDATA \
-	uninstall-dist_pkgdataDATA uninstall-dist_reccalcDATA \
-	uninstall-dist_rpcalcDATA uninstall-dist_skeletonsDATA \
+	uninstall-dist_pkgdataDATA uninstall-dist_pushcalcDATA \
+	uninstall-dist_reccalcDATA uninstall-dist_rpcalcDATA \
+	uninstall-dist_simpledDATA uninstall-dist_skeletonsDATA \
 	uninstall-dist_xsltDATA uninstall-dvi-am uninstall-html-am \
 	uninstall-info-am uninstall-libLIBRARIES uninstall-man \
 	uninstall-mfcalcDATA uninstall-nodist_binSCRIPTS \
@@ -9350,32 +11744,35 @@
 uninstall-man: uninstall-man1
 
 .MAKE: $(am__recursive_targets) all check check-am install install-am \
-	install-strip uninstall-am
+	install-exec install-strip uninstall-am
 
-.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \
 	am--depfiles am--refresh check check-TESTS check-am \
 	check-local clean clean-aminfo clean-binPROGRAMS \
 	clean-checkPROGRAMS clean-cscope clean-generic \
 	clean-libLIBRARIES clean-local clean-noinstLIBRARIES cscope \
 	cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
 	dist-gzip dist-hook dist-info dist-lzip dist-shar dist-tarZ \
-	dist-xz dist-zip distcheck distclean distclean-compile \
-	distclean-generic distclean-hdr distclean-local distclean-tags \
-	distcleancheck distdir distuninstallcheck dvi dvi-am html \
-	html-am html-local info info-am install install-aclocalDATA \
-	install-am install-binPROGRAMS install-calcxxDATA \
-	install-cxxDATA install-data install-data-am \
+	dist-xz dist-zip dist-zstd distcheck distclean \
+	distclean-compile distclean-generic distclean-hdr \
+	distclean-local distclean-tags distcleancheck distdir \
+	distuninstallcheck dvi dvi-am html html-am html-local info \
+	info-am install install-aclocalDATA install-am \
+	install-binPROGRAMS install-calcxxDATA install-cxxDATA \
+	install-data install-data-am install-dist_bistromathicDATA \
 	install-dist_cDATA install-dist_calcDATA \
-	install-dist_calcxxDATA install-dist_cxxDATA \
-	install-dist_dDATA install-dist_docDATA \
-	install-dist_examplesDATA install-dist_javaDATA \
-	install-dist_lexcalcDATA install-dist_m4sugarDATA \
-	install-dist_mfcalcDATA install-dist_pkgdataDATA \
+	install-dist_calcdDATA install-dist_calcxxDATA \
+	install-dist_cxxDATA install-dist_dDATA install-dist_docDATA \
+	install-dist_examplesDATA install-dist_glrDATA \
+	install-dist_javaDATA install-dist_java_calcDATA \
+	install-dist_java_simpleDATA install-dist_lexcalcDATA \
+	install-dist_m4sugarDATA install-dist_mfcalcDATA \
+	install-dist_pkgdataDATA install-dist_pushcalcDATA \
 	install-dist_reccalcDATA install-dist_rpcalcDATA \
-	install-dist_skeletonsDATA install-dist_xsltDATA install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am \
-	install-libLIBRARIES install-man install-man1 \
+	install-dist_simpledDATA install-dist_skeletonsDATA \
+	install-dist_xsltDATA install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-libLIBRARIES install-man install-man1 \
 	install-mfcalcDATA install-nodist_binSCRIPTS install-pdf \
 	install-pdf-am install-ps install-ps-am install-rpcalcDATA \
 	install-strip installcheck installcheck-am \
@@ -9387,17 +11784,20 @@
 	mostlyclean-local mostlyclean-vti pdf pdf-am ps ps-am recheck \
 	tags tags-am uninstall uninstall-aclocalDATA uninstall-am \
 	uninstall-binPROGRAMS uninstall-calcxxDATA uninstall-cxxDATA \
-	uninstall-dist_cDATA uninstall-dist_calcDATA \
+	uninstall-dist_bistromathicDATA uninstall-dist_cDATA \
+	uninstall-dist_calcDATA uninstall-dist_calcdDATA \
 	uninstall-dist_calcxxDATA uninstall-dist_cxxDATA \
 	uninstall-dist_dDATA uninstall-dist_docDATA \
-	uninstall-dist_examplesDATA uninstall-dist_javaDATA \
-	uninstall-dist_lexcalcDATA uninstall-dist_m4sugarDATA \
-	uninstall-dist_mfcalcDATA uninstall-dist_pkgdataDATA \
+	uninstall-dist_examplesDATA uninstall-dist_glrDATA \
+	uninstall-dist_javaDATA uninstall-dist_java_calcDATA \
+	uninstall-dist_java_simpleDATA uninstall-dist_lexcalcDATA \
+	uninstall-dist_m4sugarDATA uninstall-dist_mfcalcDATA \
+	uninstall-dist_pkgdataDATA uninstall-dist_pushcalcDATA \
 	uninstall-dist_reccalcDATA uninstall-dist_rpcalcDATA \
-	uninstall-dist_skeletonsDATA uninstall-dist_xsltDATA \
-	uninstall-dvi-am uninstall-hook uninstall-html-am \
-	uninstall-info-am uninstall-libLIBRARIES uninstall-man \
-	uninstall-man1 uninstall-mfcalcDATA \
+	uninstall-dist_simpledDATA uninstall-dist_skeletonsDATA \
+	uninstall-dist_xsltDATA uninstall-dvi-am uninstall-hook \
+	uninstall-html-am uninstall-info-am uninstall-libLIBRARIES \
+	uninstall-man uninstall-man1 uninstall-mfcalcDATA \
 	uninstall-nodist_binSCRIPTS uninstall-pdf-am uninstall-ps-am \
 	uninstall-rpcalcDATA
 
@@ -9419,8 +11819,8 @@
 	$(AM_V_at)mv $@.tmp $@
 
 # Fix Info's @code in @deftype
-# https://lists.gnu.org/archive/html/help-texinfo/2019-11/msg00004.html
-all: $(srcdir)/$(doc_bison).info.bak
+# https://lists.gnu.org/r/help-texinfo/2019-11/msg00004.html
+all-local: $(srcdir)/$(doc_bison).info.bak
 $(srcdir)/$(doc_bison).info.bak: $(srcdir)/$(doc_bison).info
 	$(AM_V_GEN) $(PERL) -pi.bak -0777	\
 	  -e 's{(^ --.*\n(?: {10}.*\n)*)}'	\
@@ -9434,23 +11834,38 @@
 doc/refcard.pdf: doc/refcard.tex
 	$(AM_V_GEN) cd doc && pdftex $(abs_top_srcdir)/doc/refcard.tex
 @CROSS_COMPILING_FALSE@$(top_srcdir)/doc/bison.help: src/bison$(EXEEXT)
-@CROSS_COMPILING_FALSE@	$(AM_V_GEN)LC_ALL=C tests/bison --version >doc/bison.help.tmp
+@CROSS_COMPILING_FALSE@	$(AM_V_GEN)$(MKDIR_P) doc
+@CROSS_COMPILING_FALSE@	$(AM_V_at) LC_ALL=C tests/bison --version >doc/bison.help.tmp
 @CROSS_COMPILING_FALSE@	$(AM_V_at) LC_ALL=C tests/bison --help | \
 @CROSS_COMPILING_FALSE@	  sed -e 's,^Usage: .*/bison \[OPTION\],Usage: bison [OPTION],g' \
 @CROSS_COMPILING_FALSE@	      -e '/translation bugs/d'  >>doc/bison.help.tmp
 @CROSS_COMPILING_FALSE@	$(AM_V_at)$(top_srcdir)/build-aux/move-if-change doc/bison.help.tmp $@
 
+# If we don't have help2man, just touch the target.  Maintainers must
+# have the real thing, so if there's a .git directory, fail hard.
+#
+# We shouldn't need this, but on some OS the timestamps in the tarball
+# leave us no choice.  See
+# https://lists.gnu.org/r/bug-bison/2020-05/msg00055.html.
 $(top_srcdir)/doc/bison.1: $(MAN_DEPS)
-	$(AM_V_GEN)$(HELP2MAN)			\
-	    --include=$(top_srcdir)/doc/bison.x	\
-	    --output=$@.tmp tests/bison
-	$(AM_V_at)if $(remove_time_stamp) $@ >$@a.tmp 2>/dev/null &&		\
-	   $(remove_time_stamp) $@.tmp | cmp $@a.tmp - >/dev/null 2>&1; then	\
-	  touch $@;								\
-	else									\
-	  mv $@.tmp $@;								\
+	$(AM_V_GEN)if $(HELP2MAN) --version >/dev/null 2>&1; then	\
+	  $(HELP2MAN)							\
+	    --include=$(top_srcdir)/doc/bison.x				\
+	    --output=$@.tmp tests/bison &&				\
+	  { $(remove_time_stamp) $@     >$@a.tmp || true; } &&		\
+	    $(remove_time_stamp) $@.tmp >$@b.tmp &&			\
+	  if diff $@a.tmp $@b.tmp >/dev/null 2>&1; then			\
+	    touch $@;							\
+	  else								\
+	    mv $@.tmp $@;						\
+	  fi &&								\
+	  rm -f $@*.tmp;						\
+	elif test -d $(srcdir)/.git; then				\
+	  echo >&2 "ERROR: $@: help2man is needed";			\
+	  exit 1;							\
+	else								\
+	  touch $@;							\
 	fi
-	$(AM_V_at)rm -f $@*.tmp
 
 .gv.eps:
 	$(AM_V_GEN) $(MKDIR_P) `echo "./$@" | sed -e 's,/[^/]*$$,,'`
@@ -9496,12 +11911,32 @@
 examples-unline:
 	cd $(distdir) && \
 	  perl -pi -0777 -e 's/#line.*\n//g;s{^ /\*\*/\n}{}mg' $(extracted)
+
+.PHONY: check-examples
+check-examples: check-TESTS
+
+examples/c/bistromathic/parse.c: $(dependencies)
+
+@ENABLE_BISTROMATHIC_TRUE@  # Don't use gnulib's system headers.
 examples/c/calc/calc.c: $(dependencies)
+examples/c/glr/c++-types.c: $(dependencies)
 @FLEX_WORKS_TRUE@  # Don't use gnulib's system headers.
+@FLEX_WORKS_TRUE@  # Fighting warnings triggered by Flex is just too painful.
+@FLEX_WORKS_TRUE@  # examples_c_lexcalc_lexcalc_CFLAGS = $(TEST_CFLAGS)
 
 examples/c/lexcalc/parse.c: $(dependencies)
+
+# Tell Make scan.o depends on parse.h, except that Make sees only
+# parse.c, not parse.h.  We can't use BUILT_SOURCES to this end, since
+# we use the built bison.
+examples/c/lexcalc/lexcalc$(DASH)scan.o: examples/c/lexcalc/parse.c
+# Likewise, but for Automake before 1.16.
+examples/c/lexcalc/examples_c_lexcalc_lexcalc$(DASH)scan.o: examples/c/lexcalc/parse.c
 examples/c/mfcalc/mfcalc.c: $(dependencies)
+examples/c/pushcalc/calc.c: $(dependencies)
 @FLEX_WORKS_TRUE@  # Don't use gnulib's system headers.
+@FLEX_WORKS_TRUE@  # Fighting warnings triggered by Flex is just too painful.
+@FLEX_WORKS_TRUE@  # examples_c_reccalc_reccalc_CFLAGS = $(TEST_CFLAGS)
 
 examples/c/reccalc/parse.c: $(dependencies)
 examples/c/reccalc/reccalc$(DASH)parse.o: examples/c/reccalc/scan.h
@@ -9531,17 +11966,16 @@
 	$(AM_V_LEX)rm -f $@ $@.tmp
 	$(AM_V_at)$(MKDIR_P) examples/c/reccalc
 	$(AM_V_at)touch $@.tmp
-	$(AM_V_at)$(LEX) $(AM_LFLAGS) $(LFLAGS) -oexamples/c/reccalc/scan.c --header-file=examples/c/reccalc/scan.h $(srcdir)/examples/c/reccalc/scan.l
+	$(AM_V_at)$(LEX) $(AM_LFLAGS) $(LFLAGS) -oexamples/c/reccalc/scan.c --header=examples/c/reccalc/scan.h $(srcdir)/examples/c/reccalc/scan.l
 	$(AM_V_at)mv $@.tmp $@
 examples/c/rpcalc/rpcalc.c: $(dependencies)
-
-examples/c++/calc++/parser.stamp: $(dependencies)
 .yy.stamp:
 	$(AM_V_YACC)rm -f $@
 	$(AM_V_at)touch $@.tmp
 	$(AM_V_at)$(YACCCOMPILE) -o $*.cc $<
 	$(AM_V_at)mv -f $@.tmp $@
 
+examples/c++/calc++/parser.stamp: $(dependencies)
 $(calcxx_sources_generated): examples/c++/calc++/parser.stamp
 	@test -f $@ || rm -f examples/c++/calc++/parser.stamp
 	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) examples/c++/calc++/parser.stamp
@@ -9549,26 +11983,49 @@
 # Avoid using BUILT_SOURCES which is too global.
 $(examples_c___calc___calc___OBJECTS): $(calcxx_sources_generated)
 @ENABLE_CXX_TRUE@@FLEX_CXX_WORKS_TRUE@  # Don't use gnulib's system headers.
+
+examples/c++/glr/c++-types.stamp: $(dependencies)
+$(nodist_examples_c___glr_c___types_SOURCES): examples/c++/glr/c++-types.stamp
+	@test -f $@ || rm -f examples/c++/glr/c++-types.stamp
+	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) examples/c++/glr/c++-types.stamp
+
+# Avoid using BUILT_SOURCES which is too global.
+$(examples_c___glr_c___types_OBJECTS): $(cxx_types_sources_generated)
 @ENABLE_CXX14_TRUE@  # Don't use gnulib's system headers.
-@ENABLE_CXX14_TRUE@  examples/c++/simple.cc: $(dependencies)
+@ENABLE_CXX11_TRUE@  # Don't use gnulib's system headers.
+@ENABLE_CXX11_TRUE@  examples/c++/simple.cc: $(dependencies)
 @ENABLE_CXX_TRUE@  # Don't use gnulib's system headers.
 @ENABLE_CXX_TRUE@  examples/c++/variant.cc: $(dependencies)
 @ENABLE_CXX11_TRUE@  # Don't use gnulib's system headers.
 @ENABLE_CXX11_TRUE@  examples/c++/variant-11.cc: $(dependencies)
 
-examples/d/calc.d: examples/d/calc.y $(dependencies)
-	$(AM_V_GEN)$(MKDIR_P) examples/d
-	$(AM_V_at)$(BISON) $(srcdir)/examples/d/calc.y -o $@
+examples/d/calc/calc.d: examples/d/calc/calc.y $(dependencies)
+	$(AM_V_GEN)$(MKDIR_P) examples/d/calc
+	$(AM_V_at)$(BISON) -o $@ $(srcdir)/examples/d/calc/calc.y
 
-examples/d/calc: examples/d/calc.d
-	$(AM_V_GEN) $(DC) $(DCFLAGS) -of$@ examples/d/calc.d
+examples/d/calc/calc: examples/d/calc/calc.d
+	$(AM_V_GEN) $(DC) $(DCFLAGS) -of$@ examples/d/calc/calc.d
 
-examples/java/Calc.java: examples/java/Calc.y $(dependencies)
-	$(AM_V_GEN)$(MKDIR_P) examples/java
-	$(AM_V_at)$(BISON) $(srcdir)/examples/java/Calc.y -o $@
+examples/d/simple/calc.d: examples/d/simple/calc.y $(dependencies)
+	$(AM_V_GEN)$(MKDIR_P) examples/d/simple
+	$(AM_V_at)$(BISON) -o $@ $(srcdir)/examples/d/simple/calc.y
 
-examples/java/Calc.class: examples/java/Calc.java
-	$(AM_V_GEN) $(SHELL) $(top_builddir)/javacomp.sh examples/java/Calc.java
+examples/d/simple/calc: examples/d/simple/calc.d
+	$(AM_V_GEN) $(DC) $(DCFLAGS) -of$@ examples/d/simple/calc.d
+
+examples/java/calc/Calc.java: examples/java/calc/Calc.y $(dependencies)
+	$(AM_V_GEN)$(MKDIR_P) examples/java/calc
+	$(AM_V_at)$(BISON) -o $@ $(srcdir)/examples/java/calc/Calc.y
+
+examples/java/calc/Calc.class: examples/java/calc/Calc.java
+	$(AM_V_GEN) $(SHELL) $(top_builddir)/javacomp.sh examples/java/calc/Calc.java
+
+examples/java/simple/Calc.java: examples/java/simple/Calc.y $(dependencies)
+	$(AM_V_GEN)$(MKDIR_P) examples/java/simple
+	$(AM_V_at)$(BISON) -o $@ $(srcdir)/examples/java/simple/Calc.y
+
+examples/java/simple/Calc.class: examples/java/simple/Calc.java
+	$(AM_V_GEN) $(SHELL) $(top_builddir)/javacomp.sh examples/java/simple/Calc.java
 
 # We need the following in order to create <alloca.h> when the system
 # doesn't have one that works with the given compiler.
@@ -9622,6 +12079,45 @@
 	} | sed '/""/d' > $@-t && \
 	mv -f $@-t $@
 
+# We need the following in order to create <dirent.h> when the system
+# doesn't have one that works with the given compiler.
+@gl_GNULIB_ENABLED_dirent_TRUE@lib/dirent.h: lib/dirent.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+@gl_GNULIB_ENABLED_dirent_TRUE@	$(AM_V_GEN)rm -f $@-t $@ && \
+@gl_GNULIB_ENABLED_dirent_TRUE@	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+@gl_GNULIB_ENABLED_dirent_TRUE@	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's|@''HAVE_DIRENT_H''@|$(HAVE_DIRENT_H)|g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's|@''NEXT_DIRENT_H''@|$(NEXT_DIRENT_H)|g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's/@''GNULIB_OPENDIR''@/$(GL_GNULIB_OPENDIR)/g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's/@''GNULIB_READDIR''@/$(GL_GNULIB_READDIR)/g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's/@''GNULIB_REWINDDIR''@/$(GL_GNULIB_REWINDDIR)/g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's/@''GNULIB_CLOSEDIR''@/$(GL_GNULIB_CLOSEDIR)/g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's/@''GNULIB_DIRFD''@/$(GL_GNULIB_DIRFD)/g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's/@''GNULIB_FDOPENDIR''@/$(GL_GNULIB_FDOPENDIR)/g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's/@''GNULIB_SCANDIR''@/$(GL_GNULIB_SCANDIR)/g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's/@''GNULIB_ALPHASORT''@/$(GL_GNULIB_ALPHASORT)/g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's/@''HAVE_OPENDIR''@/$(HAVE_OPENDIR)/g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's/@''HAVE_READDIR''@/$(HAVE_READDIR)/g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's/@''HAVE_REWINDDIR''@/$(HAVE_REWINDDIR)/g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's/@''HAVE_CLOSEDIR''@/$(HAVE_CLOSEDIR)/g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's|@''HAVE_DECL_DIRFD''@|$(HAVE_DECL_DIRFD)|g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's|@''HAVE_DECL_FDOPENDIR''@|$(HAVE_DECL_FDOPENDIR)|g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's|@''HAVE_FDOPENDIR''@|$(HAVE_FDOPENDIR)|g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's|@''HAVE_SCANDIR''@|$(HAVE_SCANDIR)|g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's|@''HAVE_ALPHASORT''@|$(HAVE_ALPHASORT)|g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's|@''REPLACE_OPENDIR''@|$(REPLACE_OPENDIR)|g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's|@''REPLACE_CLOSEDIR''@|$(REPLACE_CLOSEDIR)|g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's|@''REPLACE_DIRFD''@|$(REPLACE_DIRFD)|g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e 's|@''REPLACE_FDOPENDIR''@|$(REPLACE_FDOPENDIR)|g' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+@gl_GNULIB_ENABLED_dirent_TRUE@	      < $(top_srcdir)/lib/dirent.in.h; \
+@gl_GNULIB_ENABLED_dirent_TRUE@	} > $@-t && \
+@gl_GNULIB_ENABLED_dirent_TRUE@	mv $@-t $@
+
 # We need the following in order to create <errno.h> when the system
 # doesn't have one that is POSIX compliant.
 @GL_GENERATE_ERRNO_H_TRUE@lib/errno.h: lib/errno.in.h $(top_builddir)/config.status
@@ -9654,11 +12150,13 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \
-	      -e 's/@''GNULIB_CREAT''@/$(GNULIB_CREAT)/g' \
-	      -e 's/@''GNULIB_FCNTL''@/$(GNULIB_FCNTL)/g' \
-	      -e 's/@''GNULIB_NONBLOCKING''@/$(GNULIB_NONBLOCKING)/g' \
-	      -e 's/@''GNULIB_OPEN''@/$(GNULIB_OPEN)/g' \
-	      -e 's/@''GNULIB_OPENAT''@/$(GNULIB_OPENAT)/g' \
+	      -e 's/@''GNULIB_CREAT''@/$(GL_GNULIB_CREAT)/g' \
+	      -e 's/@''GNULIB_FCNTL''@/$(GL_GNULIB_FCNTL)/g' \
+	      -e 's/@''GNULIB_NONBLOCKING''@/$(GL_GNULIB_NONBLOCKING)/g' \
+	      -e 's/@''GNULIB_OPEN''@/$(GL_GNULIB_OPEN)/g' \
+	      -e 's/@''GNULIB_OPENAT''@/$(GL_GNULIB_OPENAT)/g' \
+	      -e 's/@''GNULIB_MDA_CREAT''@/$(GL_GNULIB_MDA_CREAT)/g' \
+	      -e 's/@''GNULIB_MDA_OPEN''@/$(GL_GNULIB_MDA_OPEN)/g' \
 	      -e 's|@''HAVE_FCNTL''@|$(HAVE_FCNTL)|g' \
 	      -e 's|@''HAVE_OPENAT''@|$(HAVE_OPENAT)|g' \
 	      -e 's|@''REPLACE_CREAT''@|$(REPLACE_CREAT)|g' \
@@ -9716,6 +12214,49 @@
 clean-GNUmakefile:
 	test '$(srcdir)' = . || rm -f $(top_builddir)/GNUmakefile
 
+# We need the following in order to create <iconv.h> when the system
+# doesn't have one that works with the given compiler.
+@GL_GENERATE_ICONV_H_TRUE@lib/iconv.h: lib/iconv.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+@GL_GENERATE_ICONV_H_TRUE@	$(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_ICONV_H_TRUE@	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+@GL_GENERATE_ICONV_H_TRUE@	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_ICONV_H_TRUE@	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_ICONV_H_TRUE@	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_ICONV_H_TRUE@	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_ICONV_H_TRUE@	      -e 's|@''NEXT_ICONV_H''@|$(NEXT_ICONV_H)|g' \
+@GL_GENERATE_ICONV_H_TRUE@	      -e 's/@''GNULIB_ICONV''@/$(GL_GNULIB_ICONV)/g' \
+@GL_GENERATE_ICONV_H_TRUE@	      -e 's|@''ICONV_CONST''@|$(ICONV_CONST)|g' \
+@GL_GENERATE_ICONV_H_TRUE@	      -e 's|@''REPLACE_ICONV''@|$(REPLACE_ICONV)|g' \
+@GL_GENERATE_ICONV_H_TRUE@	      -e 's|@''REPLACE_ICONV_OPEN''@|$(REPLACE_ICONV_OPEN)|g' \
+@GL_GENERATE_ICONV_H_TRUE@	      -e 's|@''REPLACE_ICONV_UTF''@|$(REPLACE_ICONV_UTF)|g' \
+@GL_GENERATE_ICONV_H_TRUE@	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+@GL_GENERATE_ICONV_H_TRUE@	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+@GL_GENERATE_ICONV_H_TRUE@	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+@GL_GENERATE_ICONV_H_TRUE@	      < $(top_srcdir)/lib/iconv.in.h; \
+@GL_GENERATE_ICONV_H_TRUE@	} > $@-t && \
+@GL_GENERATE_ICONV_H_TRUE@	mv $@-t $@
+@GL_GENERATE_ICONV_H_FALSE@lib/iconv.h: $(top_builddir)/config.status
+@GL_GENERATE_ICONV_H_FALSE@	rm -f $@
+
+$(top_srcdir)/lib/iconv_open-aix.h: $(top_srcdir)/lib/iconv_open-aix.gperf
+	$(V_GPERF)$(GPERF) -m 10 $(top_srcdir)/lib/iconv_open-aix.gperf > $(top_srcdir)/lib/iconv_open-aix.h-t && \
+	mv $(top_srcdir)/lib/iconv_open-aix.h-t $(top_srcdir)/lib/iconv_open-aix.h
+$(top_srcdir)/lib/iconv_open-hpux.h: $(top_srcdir)/lib/iconv_open-hpux.gperf
+	$(V_GPERF)$(GPERF) -m 10 $(top_srcdir)/lib/iconv_open-hpux.gperf > $(top_srcdir)/lib/iconv_open-hpux.h-t && \
+	mv $(top_srcdir)/lib/iconv_open-hpux.h-t $(top_srcdir)/lib/iconv_open-hpux.h
+$(top_srcdir)/lib/iconv_open-irix.h: $(top_srcdir)/lib/iconv_open-irix.gperf
+	$(V_GPERF)$(GPERF) -m 10 $(top_srcdir)/lib/iconv_open-irix.gperf > $(top_srcdir)/lib/iconv_open-irix.h-t && \
+	mv $(top_srcdir)/lib/iconv_open-irix.h-t $(top_srcdir)/lib/iconv_open-irix.h
+$(top_srcdir)/lib/iconv_open-osf.h: $(top_srcdir)/lib/iconv_open-osf.gperf
+	$(V_GPERF)$(GPERF) -m 10 $(top_srcdir)/lib/iconv_open-osf.gperf > $(top_srcdir)/lib/iconv_open-osf.h-t && \
+	mv $(top_srcdir)/lib/iconv_open-osf.h-t $(top_srcdir)/lib/iconv_open-osf.h
+$(top_srcdir)/lib/iconv_open-solaris.h: $(top_srcdir)/lib/iconv_open-solaris.gperf
+	$(V_GPERF)$(GPERF) -m 10 $(top_srcdir)/lib/iconv_open-solaris.gperf > $(top_srcdir)/lib/iconv_open-solaris.h-t && \
+	mv $(top_srcdir)/lib/iconv_open-solaris.h-t $(top_srcdir)/lib/iconv_open-solaris.h
+$(top_srcdir)/lib/iconv_open-zos.h: $(top_srcdir)/lib/iconv_open-zos.gperf
+	$(V_GPERF)$(GPERF) -m 10 $(top_srcdir)/lib/iconv_open-zos.gperf > $(top_srcdir)/lib/iconv_open-zos.h-t && \
+	mv $(top_srcdir)/lib/iconv_open-zos.h-t $(top_srcdir)/lib/iconv_open-zos.h
+
 # We need the following in order to create <inttypes.h> when the system
 # doesn't have one that works with the given compiler.
 lib/inttypes.h: lib/inttypes.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H)
@@ -9726,15 +12267,12 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_INTTYPES_H''@|$(NEXT_INTTYPES_H)|g' \
-	      -e 's/@''PRI_MACROS_BROKEN''@/$(PRI_MACROS_BROKEN)/g' \
 	      -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
-	      -e 's/@''HAVE_LONG_LONG_INT''@/$(HAVE_LONG_LONG_INT)/g' \
-	      -e 's/@''HAVE_UNSIGNED_LONG_LONG_INT''@/$(HAVE_UNSIGNED_LONG_LONG_INT)/g' \
 	      -e 's/@''PRIPTR_PREFIX''@/$(PRIPTR_PREFIX)/g' \
-	      -e 's/@''GNULIB_IMAXABS''@/$(GNULIB_IMAXABS)/g' \
-	      -e 's/@''GNULIB_IMAXDIV''@/$(GNULIB_IMAXDIV)/g' \
-	      -e 's/@''GNULIB_STRTOIMAX''@/$(GNULIB_STRTOIMAX)/g' \
-	      -e 's/@''GNULIB_STRTOUMAX''@/$(GNULIB_STRTOUMAX)/g' \
+	      -e 's/@''GNULIB_IMAXABS''@/$(GL_GNULIB_IMAXABS)/g' \
+	      -e 's/@''GNULIB_IMAXDIV''@/$(GL_GNULIB_IMAXDIV)/g' \
+	      -e 's/@''GNULIB_STRTOIMAX''@/$(GL_GNULIB_STRTOIMAX)/g' \
+	      -e 's/@''GNULIB_STRTOUMAX''@/$(GL_GNULIB_STRTOUMAX)/g' \
 	      -e 's/@''HAVE_DECL_IMAXABS''@/$(HAVE_DECL_IMAXABS)/g' \
 	      -e 's/@''HAVE_DECL_IMAXDIV''@/$(HAVE_DECL_IMAXDIV)/g' \
 	      -e 's/@''HAVE_DECL_STRTOIMAX''@/$(HAVE_DECL_STRTOIMAX)/g' \
@@ -9780,6 +12318,39 @@
 @GL_GENERATE_LIMITS_H_FALSE@lib/limits.h: $(top_builddir)/config.status
 @GL_GENERATE_LIMITS_H_FALSE@	rm -f $@
 
+# We need the following in order to create <locale.h> when the system
+# doesn't have one that provides all definitions.
+@gl_GNULIB_ENABLED_locale_TRUE@lib/locale.h: lib/locale.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+@gl_GNULIB_ENABLED_locale_TRUE@	$(AM_V_GEN)rm -f $@-t $@ && \
+@gl_GNULIB_ENABLED_locale_TRUE@	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+@gl_GNULIB_ENABLED_locale_TRUE@	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's|@''NEXT_LOCALE_H''@|$(NEXT_LOCALE_H)|g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's/@''GNULIB_LOCALECONV''@/$(GL_GNULIB_LOCALECONV)/g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's/@''GNULIB_SETLOCALE''@/$(GL_GNULIB_SETLOCALE)/g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's/@''GNULIB_SETLOCALE_NULL''@/$(GL_GNULIB_SETLOCALE_NULL)/g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's/@''GNULIB_DUPLOCALE''@/$(GL_GNULIB_DUPLOCALE)/g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's/@''GNULIB_LOCALENAME''@/$(GL_GNULIB_LOCALENAME)/g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's|@''HAVE_NEWLOCALE''@|$(HAVE_NEWLOCALE)|g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's|@''HAVE_DUPLOCALE''@|$(HAVE_DUPLOCALE)|g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's|@''HAVE_FREELOCALE''@|$(HAVE_FREELOCALE)|g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's|@''HAVE_XLOCALE_H''@|$(HAVE_XLOCALE_H)|g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's|@''REPLACE_LOCALECONV''@|$(REPLACE_LOCALECONV)|g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's|@''REPLACE_SETLOCALE''@|$(REPLACE_SETLOCALE)|g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's|@''REPLACE_NEWLOCALE''@|$(REPLACE_NEWLOCALE)|g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's|@''REPLACE_DUPLOCALE''@|$(REPLACE_DUPLOCALE)|g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's|@''REPLACE_FREELOCALE''@|$(REPLACE_FREELOCALE)|g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's|@''REPLACE_STRUCT_LCONV''@|$(REPLACE_STRUCT_LCONV)|g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e 's|@''LOCALENAME_ENHANCE_LOCALE_FUNCS''@|$(LOCALENAME_ENHANCE_LOCALE_FUNCS)|g' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+@gl_GNULIB_ENABLED_locale_TRUE@	      < $(top_srcdir)/lib/locale.in.h; \
+@gl_GNULIB_ENABLED_locale_TRUE@	} > $@-t && \
+@gl_GNULIB_ENABLED_locale_TRUE@	mv $@-t $@
+
 # We need the following in order to create <math.h> when the system
 # doesn't have one that works with the given compiler.
 lib/math.h: lib/math.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
@@ -9790,102 +12361,108 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_AS_FIRST_DIRECTIVE_MATH_H''@|$(NEXT_AS_FIRST_DIRECTIVE_MATH_H)|g' \
-	      -e 's/@''GNULIB_ACOSF''@/$(GNULIB_ACOSF)/g' \
-	      -e 's/@''GNULIB_ACOSL''@/$(GNULIB_ACOSL)/g' \
-	      -e 's/@''GNULIB_ASINF''@/$(GNULIB_ASINF)/g' \
-	      -e 's/@''GNULIB_ASINL''@/$(GNULIB_ASINL)/g' \
-	      -e 's/@''GNULIB_ATANF''@/$(GNULIB_ATANF)/g' \
-	      -e 's/@''GNULIB_ATANL''@/$(GNULIB_ATANL)/g' \
-	      -e 's/@''GNULIB_ATAN2F''@/$(GNULIB_ATAN2F)/g' \
-	      -e 's/@''GNULIB_CBRT''@/$(GNULIB_CBRT)/g' \
-	      -e 's/@''GNULIB_CBRTF''@/$(GNULIB_CBRTF)/g' \
-	      -e 's/@''GNULIB_CBRTL''@/$(GNULIB_CBRTL)/g' \
-	      -e 's/@''GNULIB_CEIL''@/$(GNULIB_CEIL)/g' \
-	      -e 's/@''GNULIB_CEILF''@/$(GNULIB_CEILF)/g' \
-	      -e 's/@''GNULIB_CEILL''@/$(GNULIB_CEILL)/g' \
-	      -e 's/@''GNULIB_COPYSIGN''@/$(GNULIB_COPYSIGN)/g' \
-	      -e 's/@''GNULIB_COPYSIGNF''@/$(GNULIB_COPYSIGNF)/g' \
-	      -e 's/@''GNULIB_COPYSIGNL''@/$(GNULIB_COPYSIGNL)/g' \
-	      -e 's/@''GNULIB_COSF''@/$(GNULIB_COSF)/g' \
-	      -e 's/@''GNULIB_COSL''@/$(GNULIB_COSL)/g' \
-	      -e 's/@''GNULIB_COSHF''@/$(GNULIB_COSHF)/g' \
-	      -e 's/@''GNULIB_EXPF''@/$(GNULIB_EXPF)/g' \
-	      -e 's/@''GNULIB_EXPL''@/$(GNULIB_EXPL)/g' \
-	      -e 's/@''GNULIB_EXP2''@/$(GNULIB_EXP2)/g' \
-	      -e 's/@''GNULIB_EXP2F''@/$(GNULIB_EXP2F)/g' \
-	      -e 's/@''GNULIB_EXP2L''@/$(GNULIB_EXP2L)/g' \
-	      -e 's/@''GNULIB_EXPM1''@/$(GNULIB_EXPM1)/g' \
-	      -e 's/@''GNULIB_EXPM1F''@/$(GNULIB_EXPM1F)/g' \
-	      -e 's/@''GNULIB_EXPM1L''@/$(GNULIB_EXPM1L)/g' \
-	      -e 's/@''GNULIB_FABSF''@/$(GNULIB_FABSF)/g' \
-	      -e 's/@''GNULIB_FABSL''@/$(GNULIB_FABSL)/g' \
-	      -e 's/@''GNULIB_FLOOR''@/$(GNULIB_FLOOR)/g' \
-	      -e 's/@''GNULIB_FLOORF''@/$(GNULIB_FLOORF)/g' \
-	      -e 's/@''GNULIB_FLOORL''@/$(GNULIB_FLOORL)/g' \
-	      -e 's/@''GNULIB_FMA''@/$(GNULIB_FMA)/g' \
-	      -e 's/@''GNULIB_FMAF''@/$(GNULIB_FMAF)/g' \
-	      -e 's/@''GNULIB_FMAL''@/$(GNULIB_FMAL)/g' \
-	      -e 's/@''GNULIB_FMOD''@/$(GNULIB_FMOD)/g' \
-	      -e 's/@''GNULIB_FMODF''@/$(GNULIB_FMODF)/g' \
-	      -e 's/@''GNULIB_FMODL''@/$(GNULIB_FMODL)/g' \
-	      -e 's/@''GNULIB_FREXPF''@/$(GNULIB_FREXPF)/g' \
-	      -e 's/@''GNULIB_FREXP''@/$(GNULIB_FREXP)/g' \
-	      -e 's/@''GNULIB_FREXPL''@/$(GNULIB_FREXPL)/g' \
-	      -e 's/@''GNULIB_HYPOT''@/$(GNULIB_HYPOT)/g' \
-	      -e 's/@''GNULIB_HYPOTF''@/$(GNULIB_HYPOTF)/g' \
-	      -e 's/@''GNULIB_HYPOTL''@/$(GNULIB_HYPOTL)/g' \
+	      -e 's/@''GNULIB_ACOSF''@/$(GL_GNULIB_ACOSF)/g' \
+	      -e 's/@''GNULIB_ACOSL''@/$(GL_GNULIB_ACOSL)/g' \
+	      -e 's/@''GNULIB_ASINF''@/$(GL_GNULIB_ASINF)/g' \
+	      -e 's/@''GNULIB_ASINL''@/$(GL_GNULIB_ASINL)/g' \
+	      -e 's/@''GNULIB_ATANF''@/$(GL_GNULIB_ATANF)/g' \
+	      -e 's/@''GNULIB_ATANL''@/$(GL_GNULIB_ATANL)/g' \
+	      -e 's/@''GNULIB_ATAN2F''@/$(GL_GNULIB_ATAN2F)/g' \
+	      -e 's/@''GNULIB_CBRT''@/$(GL_GNULIB_CBRT)/g' \
+	      -e 's/@''GNULIB_CBRTF''@/$(GL_GNULIB_CBRTF)/g' \
+	      -e 's/@''GNULIB_CBRTL''@/$(GL_GNULIB_CBRTL)/g' \
+	      -e 's/@''GNULIB_CEIL''@/$(GL_GNULIB_CEIL)/g' \
+	      -e 's/@''GNULIB_CEILF''@/$(GL_GNULIB_CEILF)/g' \
+	      -e 's/@''GNULIB_CEILL''@/$(GL_GNULIB_CEILL)/g' \
+	      -e 's/@''GNULIB_COPYSIGN''@/$(GL_GNULIB_COPYSIGN)/g' \
+	      -e 's/@''GNULIB_COPYSIGNF''@/$(GL_GNULIB_COPYSIGNF)/g' \
+	      -e 's/@''GNULIB_COPYSIGNL''@/$(GL_GNULIB_COPYSIGNL)/g' \
+	      -e 's/@''GNULIB_COSF''@/$(GL_GNULIB_COSF)/g' \
+	      -e 's/@''GNULIB_COSL''@/$(GL_GNULIB_COSL)/g' \
+	      -e 's/@''GNULIB_COSHF''@/$(GL_GNULIB_COSHF)/g' \
+	      -e 's/@''GNULIB_EXPF''@/$(GL_GNULIB_EXPF)/g' \
+	      -e 's/@''GNULIB_EXPL''@/$(GL_GNULIB_EXPL)/g' \
+	      -e 's/@''GNULIB_EXP2''@/$(GL_GNULIB_EXP2)/g' \
+	      -e 's/@''GNULIB_EXP2F''@/$(GL_GNULIB_EXP2F)/g' \
+	      -e 's/@''GNULIB_EXP2L''@/$(GL_GNULIB_EXP2L)/g' \
+	      -e 's/@''GNULIB_EXPM1''@/$(GL_GNULIB_EXPM1)/g' \
+	      -e 's/@''GNULIB_EXPM1F''@/$(GL_GNULIB_EXPM1F)/g' \
+	      -e 's/@''GNULIB_EXPM1L''@/$(GL_GNULIB_EXPM1L)/g' \
+	      -e 's/@''GNULIB_FABSF''@/$(GL_GNULIB_FABSF)/g' \
+	      -e 's/@''GNULIB_FABSL''@/$(GL_GNULIB_FABSL)/g' \
+	      -e 's/@''GNULIB_FLOOR''@/$(GL_GNULIB_FLOOR)/g' \
+	      -e 's/@''GNULIB_FLOORF''@/$(GL_GNULIB_FLOORF)/g' \
+	      -e 's/@''GNULIB_FLOORL''@/$(GL_GNULIB_FLOORL)/g' \
+	      -e 's/@''GNULIB_FMA''@/$(GL_GNULIB_FMA)/g' \
+	      -e 's/@''GNULIB_FMAF''@/$(GL_GNULIB_FMAF)/g' \
+	      -e 's/@''GNULIB_FMAL''@/$(GL_GNULIB_FMAL)/g' \
+	      -e 's/@''GNULIB_FMOD''@/$(GL_GNULIB_FMOD)/g' \
+	      -e 's/@''GNULIB_FMODF''@/$(GL_GNULIB_FMODF)/g' \
+	      -e 's/@''GNULIB_FMODL''@/$(GL_GNULIB_FMODL)/g' \
+	      -e 's/@''GNULIB_FREXPF''@/$(GL_GNULIB_FREXPF)/g' \
+	      -e 's/@''GNULIB_FREXP''@/$(GL_GNULIB_FREXP)/g' \
+	      -e 's/@''GNULIB_FREXPL''@/$(GL_GNULIB_FREXPL)/g' \
+	      -e 's/@''GNULIB_HYPOT''@/$(GL_GNULIB_HYPOT)/g' \
+	      -e 's/@''GNULIB_HYPOTF''@/$(GL_GNULIB_HYPOTF)/g' \
+	      -e 's/@''GNULIB_HYPOTL''@/$(GL_GNULIB_HYPOTL)/g' \
 	      < $(top_srcdir)/lib/math.in.h | \
-	  sed -e 's/@''GNULIB_ILOGB''@/$(GNULIB_ILOGB)/g' \
-	      -e 's/@''GNULIB_ILOGBF''@/$(GNULIB_ILOGBF)/g' \
-	      -e 's/@''GNULIB_ILOGBL''@/$(GNULIB_ILOGBL)/g' \
-	      -e 's/@''GNULIB_ISFINITE''@/$(GNULIB_ISFINITE)/g' \
-	      -e 's/@''GNULIB_ISINF''@/$(GNULIB_ISINF)/g' \
-	      -e 's/@''GNULIB_ISNAN''@/$(GNULIB_ISNAN)/g' \
-	      -e 's/@''GNULIB_ISNANF''@/$(GNULIB_ISNANF)/g' \
-	      -e 's/@''GNULIB_ISNAND''@/$(GNULIB_ISNAND)/g' \
-	      -e 's/@''GNULIB_ISNANL''@/$(GNULIB_ISNANL)/g' \
-	      -e 's/@''GNULIB_LDEXPF''@/$(GNULIB_LDEXPF)/g' \
-	      -e 's/@''GNULIB_LDEXPL''@/$(GNULIB_LDEXPL)/g' \
-	      -e 's/@''GNULIB_LOG''@/$(GNULIB_LOG)/g' \
-	      -e 's/@''GNULIB_LOGF''@/$(GNULIB_LOGF)/g' \
-	      -e 's/@''GNULIB_LOGL''@/$(GNULIB_LOGL)/g' \
-	      -e 's/@''GNULIB_LOG10''@/$(GNULIB_LOG10)/g' \
-	      -e 's/@''GNULIB_LOG10F''@/$(GNULIB_LOG10F)/g' \
-	      -e 's/@''GNULIB_LOG10L''@/$(GNULIB_LOG10L)/g' \
-	      -e 's/@''GNULIB_LOG1P''@/$(GNULIB_LOG1P)/g' \
-	      -e 's/@''GNULIB_LOG1PF''@/$(GNULIB_LOG1PF)/g' \
-	      -e 's/@''GNULIB_LOG1PL''@/$(GNULIB_LOG1PL)/g' \
-	      -e 's/@''GNULIB_LOG2''@/$(GNULIB_LOG2)/g' \
-	      -e 's/@''GNULIB_LOG2F''@/$(GNULIB_LOG2F)/g' \
-	      -e 's/@''GNULIB_LOG2L''@/$(GNULIB_LOG2L)/g' \
-	      -e 's/@''GNULIB_LOGB''@/$(GNULIB_LOGB)/g' \
-	      -e 's/@''GNULIB_LOGBF''@/$(GNULIB_LOGBF)/g' \
-	      -e 's/@''GNULIB_LOGBL''@/$(GNULIB_LOGBL)/g' \
-	      -e 's/@''GNULIB_MODF''@/$(GNULIB_MODF)/g' \
-	      -e 's/@''GNULIB_MODFF''@/$(GNULIB_MODFF)/g' \
-	      -e 's/@''GNULIB_MODFL''@/$(GNULIB_MODFL)/g' \
-	      -e 's/@''GNULIB_POWF''@/$(GNULIB_POWF)/g' \
-	      -e 's/@''GNULIB_REMAINDER''@/$(GNULIB_REMAINDER)/g' \
-	      -e 's/@''GNULIB_REMAINDERF''@/$(GNULIB_REMAINDERF)/g' \
-	      -e 's/@''GNULIB_REMAINDERL''@/$(GNULIB_REMAINDERL)/g' \
-	      -e 's/@''GNULIB_RINT''@/$(GNULIB_RINT)/g' \
-	      -e 's/@''GNULIB_RINTF''@/$(GNULIB_RINTF)/g' \
-	      -e 's/@''GNULIB_RINTL''@/$(GNULIB_RINTL)/g' \
-	      -e 's/@''GNULIB_ROUND''@/$(GNULIB_ROUND)/g' \
-	      -e 's/@''GNULIB_ROUNDF''@/$(GNULIB_ROUNDF)/g' \
-	      -e 's/@''GNULIB_ROUNDL''@/$(GNULIB_ROUNDL)/g' \
-	      -e 's/@''GNULIB_SIGNBIT''@/$(GNULIB_SIGNBIT)/g' \
-	      -e 's/@''GNULIB_SINF''@/$(GNULIB_SINF)/g' \
-	      -e 's/@''GNULIB_SINL''@/$(GNULIB_SINL)/g' \
-	      -e 's/@''GNULIB_SINHF''@/$(GNULIB_SINHF)/g' \
-	      -e 's/@''GNULIB_SQRTF''@/$(GNULIB_SQRTF)/g' \
-	      -e 's/@''GNULIB_SQRTL''@/$(GNULIB_SQRTL)/g' \
-	      -e 's/@''GNULIB_TANF''@/$(GNULIB_TANF)/g' \
-	      -e 's/@''GNULIB_TANL''@/$(GNULIB_TANL)/g' \
-	      -e 's/@''GNULIB_TANHF''@/$(GNULIB_TANHF)/g' \
-	      -e 's/@''GNULIB_TRUNC''@/$(GNULIB_TRUNC)/g' \
-	      -e 's/@''GNULIB_TRUNCF''@/$(GNULIB_TRUNCF)/g' \
-	      -e 's/@''GNULIB_TRUNCL''@/$(GNULIB_TRUNCL)/g' \
+	  sed -e 's/@''GNULIB_ILOGB''@/$(GL_GNULIB_ILOGB)/g' \
+	      -e 's/@''GNULIB_ILOGBF''@/$(GL_GNULIB_ILOGBF)/g' \
+	      -e 's/@''GNULIB_ILOGBL''@/$(GL_GNULIB_ILOGBL)/g' \
+	      -e 's/@''GNULIB_ISFINITE''@/$(GL_GNULIB_ISFINITE)/g' \
+	      -e 's/@''GNULIB_ISINF''@/$(GL_GNULIB_ISINF)/g' \
+	      -e 's/@''GNULIB_ISNAN''@/$(GL_GNULIB_ISNAN)/g' \
+	      -e 's/@''GNULIB_ISNANF''@/$(GL_GNULIB_ISNANF)/g' \
+	      -e 's/@''GNULIB_ISNAND''@/$(GL_GNULIB_ISNAND)/g' \
+	      -e 's/@''GNULIB_ISNANL''@/$(GL_GNULIB_ISNANL)/g' \
+	      -e 's/@''GNULIB_LDEXPF''@/$(GL_GNULIB_LDEXPF)/g' \
+	      -e 's/@''GNULIB_LDEXPL''@/$(GL_GNULIB_LDEXPL)/g' \
+	      -e 's/@''GNULIB_LOG''@/$(GL_GNULIB_LOG)/g' \
+	      -e 's/@''GNULIB_LOGF''@/$(GL_GNULIB_LOGF)/g' \
+	      -e 's/@''GNULIB_LOGL''@/$(GL_GNULIB_LOGL)/g' \
+	      -e 's/@''GNULIB_LOG10''@/$(GL_GNULIB_LOG10)/g' \
+	      -e 's/@''GNULIB_LOG10F''@/$(GL_GNULIB_LOG10F)/g' \
+	      -e 's/@''GNULIB_LOG10L''@/$(GL_GNULIB_LOG10L)/g' \
+	      -e 's/@''GNULIB_LOG1P''@/$(GL_GNULIB_LOG1P)/g' \
+	      -e 's/@''GNULIB_LOG1PF''@/$(GL_GNULIB_LOG1PF)/g' \
+	      -e 's/@''GNULIB_LOG1PL''@/$(GL_GNULIB_LOG1PL)/g' \
+	      -e 's/@''GNULIB_LOG2''@/$(GL_GNULIB_LOG2)/g' \
+	      -e 's/@''GNULIB_LOG2F''@/$(GL_GNULIB_LOG2F)/g' \
+	      -e 's/@''GNULIB_LOG2L''@/$(GL_GNULIB_LOG2L)/g' \
+	      -e 's/@''GNULIB_LOGB''@/$(GL_GNULIB_LOGB)/g' \
+	      -e 's/@''GNULIB_LOGBF''@/$(GL_GNULIB_LOGBF)/g' \
+	      -e 's/@''GNULIB_LOGBL''@/$(GL_GNULIB_LOGBL)/g' \
+	      -e 's/@''GNULIB_MODF''@/$(GL_GNULIB_MODF)/g' \
+	      -e 's/@''GNULIB_MODFF''@/$(GL_GNULIB_MODFF)/g' \
+	      -e 's/@''GNULIB_MODFL''@/$(GL_GNULIB_MODFL)/g' \
+	      -e 's/@''GNULIB_POWF''@/$(GL_GNULIB_POWF)/g' \
+	      -e 's/@''GNULIB_REMAINDER''@/$(GL_GNULIB_REMAINDER)/g' \
+	      -e 's/@''GNULIB_REMAINDERF''@/$(GL_GNULIB_REMAINDERF)/g' \
+	      -e 's/@''GNULIB_REMAINDERL''@/$(GL_GNULIB_REMAINDERL)/g' \
+	      -e 's/@''GNULIB_RINT''@/$(GL_GNULIB_RINT)/g' \
+	      -e 's/@''GNULIB_RINTF''@/$(GL_GNULIB_RINTF)/g' \
+	      -e 's/@''GNULIB_RINTL''@/$(GL_GNULIB_RINTL)/g' \
+	      -e 's/@''GNULIB_ROUND''@/$(GL_GNULIB_ROUND)/g' \
+	      -e 's/@''GNULIB_ROUNDF''@/$(GL_GNULIB_ROUNDF)/g' \
+	      -e 's/@''GNULIB_ROUNDL''@/$(GL_GNULIB_ROUNDL)/g' \
+	      -e 's/@''GNULIB_SIGNBIT''@/$(GL_GNULIB_SIGNBIT)/g' \
+	      -e 's/@''GNULIB_SINF''@/$(GL_GNULIB_SINF)/g' \
+	      -e 's/@''GNULIB_SINL''@/$(GL_GNULIB_SINL)/g' \
+	      -e 's/@''GNULIB_SINHF''@/$(GL_GNULIB_SINHF)/g' \
+	      -e 's/@''GNULIB_SQRTF''@/$(GL_GNULIB_SQRTF)/g' \
+	      -e 's/@''GNULIB_SQRTL''@/$(GL_GNULIB_SQRTL)/g' \
+	      -e 's/@''GNULIB_TANF''@/$(GL_GNULIB_TANF)/g' \
+	      -e 's/@''GNULIB_TANL''@/$(GL_GNULIB_TANL)/g' \
+	      -e 's/@''GNULIB_TANHF''@/$(GL_GNULIB_TANHF)/g' \
+	      -e 's/@''GNULIB_TRUNC''@/$(GL_GNULIB_TRUNC)/g' \
+	      -e 's/@''GNULIB_TRUNCF''@/$(GL_GNULIB_TRUNCF)/g' \
+	      -e 's/@''GNULIB_TRUNCL''@/$(GL_GNULIB_TRUNCL)/g' \
+	      -e 's/@''GNULIB_MDA_J0''@/$(GL_GNULIB_MDA_J0)/g' \
+	      -e 's/@''GNULIB_MDA_J1''@/$(GL_GNULIB_MDA_J1)/g' \
+	      -e 's/@''GNULIB_MDA_JN''@/$(GL_GNULIB_MDA_JN)/g' \
+	      -e 's/@''GNULIB_MDA_Y0''@/$(GL_GNULIB_MDA_Y0)/g' \
+	      -e 's/@''GNULIB_MDA_Y1''@/$(GL_GNULIB_MDA_Y1)/g' \
+	      -e 's/@''GNULIB_MDA_YN''@/$(GL_GNULIB_MDA_YN)/g' \
 	  | \
 	  sed -e 's|@''HAVE_ACOSF''@|$(HAVE_ACOSF)|g' \
 	      -e 's|@''HAVE_ACOSL''@|$(HAVE_ACOSL)|g' \
@@ -10054,7 +12631,7 @@
 	      -e 's|@''REPLACE_ROUNDF''@|$(REPLACE_ROUNDF)|g' \
 	      -e 's|@''REPLACE_ROUNDL''@|$(REPLACE_ROUNDL)|g' \
 	      -e 's|@''REPLACE_SIGNBIT''@|$(REPLACE_SIGNBIT)|g' \
-	      -e 's|@''REPLACE_SIGNBIT_USING_GCC''@|$(REPLACE_SIGNBIT_USING_GCC)|g' \
+	      -e 's|@''REPLACE_SIGNBIT_USING_BUILTINS''@|$(REPLACE_SIGNBIT_USING_BUILTINS)|g' \
 	      -e 's|@''REPLACE_SINF''@|$(REPLACE_SINF)|g' \
 	      -e 's|@''REPLACE_SINHF''@|$(REPLACE_SINHF)|g' \
 	      -e 's|@''REPLACE_SQRTF''@|$(REPLACE_SQRTF)|g' \
@@ -10095,7 +12672,7 @@
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_SCHED_H''@|$(NEXT_SCHED_H)|g' \
 	      -e 's|@''HAVE_STRUCT_SCHED_PARAM''@|$(HAVE_STRUCT_SCHED_PARAM)|g' \
-	      -e 's/@''GNULIB_SCHED_YIELD''@/$(GNULIB_SCHED_YIELD)/g' \
+	      -e 's/@''GNULIB_SCHED_YIELD''@/$(GL_GNULIB_SCHED_YIELD)/g' \
 	      -e 's|@''HAVE_SCHED_YIELD''@|$(HAVE_SCHED_YIELD)|g' \
 	      -e 's|@''REPLACE_SCHED_YIELD''@|$(REPLACE_SCHED_YIELD)|g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
@@ -10104,6 +12681,18 @@
 	} > $@-t && \
 	mv $@-t $@
 
+lib/malloc/scratch_buffer.gl.h: lib/malloc/scratch_buffer.h
+	$(AM_V_at)$(MKDIR_P) lib/malloc
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  sed -e 's|__always_inline|inline _GL_ATTRIBUTE_ALWAYS_INLINE|g' \
+	      -e 's|__glibc_likely|_GL_LIKELY|g' \
+	      -e 's|__glibc_unlikely|_GL_UNLIKELY|g' \
+	      -e '/libc_hidden_proto/d' \
+	      < $(top_srcdir)/lib/malloc/scratch_buffer.h; \
+	} > $@-t && \
+	mv $@-t $@
+
 # We need the following in order to create <signal.h> when the system
 # doesn't have a complete one.
 lib/signal.h: lib/signal.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
@@ -10114,11 +12703,11 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_SIGNAL_H''@|$(NEXT_SIGNAL_H)|g' \
-	      -e 's/@''GNULIB_PTHREAD_SIGMASK''@/$(GNULIB_PTHREAD_SIGMASK)/g' \
-	      -e 's/@''GNULIB_RAISE''@/$(GNULIB_RAISE)/g' \
-	      -e 's/@''GNULIB_SIGNAL_H_SIGPIPE''@/$(GNULIB_SIGNAL_H_SIGPIPE)/g' \
-	      -e 's/@''GNULIB_SIGPROCMASK''@/$(GNULIB_SIGPROCMASK)/g' \
-	      -e 's/@''GNULIB_SIGACTION''@/$(GNULIB_SIGACTION)/g' \
+	      -e 's/@''GNULIB_PTHREAD_SIGMASK''@/$(GL_GNULIB_PTHREAD_SIGMASK)/g' \
+	      -e 's/@''GNULIB_RAISE''@/$(GL_GNULIB_RAISE)/g' \
+	      -e 's/@''GNULIB_SIGNAL_H_SIGPIPE''@/$(GL_GNULIB_SIGNAL_H_SIGPIPE)/g' \
+	      -e 's/@''GNULIB_SIGPROCMASK''@/$(GL_GNULIB_SIGPROCMASK)/g' \
+	      -e 's/@''GNULIB_SIGACTION''@/$(GL_GNULIB_SIGACTION)/g' \
 	      -e 's|@''HAVE_POSIX_SIGNALBLOCKING''@|$(HAVE_POSIX_SIGNALBLOCKING)|g' \
 	      -e 's|@''HAVE_PTHREAD_SIGMASK''@|$(HAVE_PTHREAD_SIGMASK)|g' \
 	      -e 's|@''HAVE_RAISE''@|$(HAVE_RAISE)|g' \
@@ -10148,29 +12737,29 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_SPAWN_H''@|$(NEXT_SPAWN_H)|g' \
-	      -e 's/@''GNULIB_POSIX_SPAWN''@/$(GNULIB_POSIX_SPAWN)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNP''@/$(GNULIB_POSIX_SPAWNP)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_INIT''@/$(GNULIB_POSIX_SPAWNATTR_INIT)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETFLAGS''@/$(GNULIB_POSIX_SPAWNATTR_GETFLAGS)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETFLAGS''@/$(GNULIB_POSIX_SPAWNATTR_SETFLAGS)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETPGROUP''@/$(GNULIB_POSIX_SPAWNATTR_GETPGROUP)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETPGROUP''@/$(GNULIB_POSIX_SPAWNATTR_SETPGROUP)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM''@/$(GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM''@/$(GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY''@/$(GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY''@/$(GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT''@/$(GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT''@/$(GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSIGMASK''@/$(GNULIB_POSIX_SPAWNATTR_GETSIGMASK)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSIGMASK''@/$(GNULIB_POSIX_SPAWNATTR_SETSIGMASK)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_DESTROY''@/$(GNULIB_POSIX_SPAWNATTR_DESTROY)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWN''@/$(GL_GNULIB_POSIX_SPAWN)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNP''@/$(GL_GNULIB_POSIX_SPAWNP)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT''@/$(GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR''@/$(GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE''@/$(GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2''@/$(GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR''@/$(GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN''@/$(GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY''@/$(GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_INIT''@/$(GL_GNULIB_POSIX_SPAWNATTR_INIT)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETFLAGS''@/$(GL_GNULIB_POSIX_SPAWNATTR_GETFLAGS)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETFLAGS''@/$(GL_GNULIB_POSIX_SPAWNATTR_SETFLAGS)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETPGROUP''@/$(GL_GNULIB_POSIX_SPAWNATTR_GETPGROUP)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETPGROUP''@/$(GL_GNULIB_POSIX_SPAWNATTR_SETPGROUP)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM''@/$(GL_GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM''@/$(GL_GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY''@/$(GL_GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY''@/$(GL_GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT''@/$(GL_GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT''@/$(GL_GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSIGMASK''@/$(GL_GNULIB_POSIX_SPAWNATTR_GETSIGMASK)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSIGMASK''@/$(GL_GNULIB_POSIX_SPAWNATTR_SETSIGMASK)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_DESTROY''@/$(GL_GNULIB_POSIX_SPAWNATTR_DESTROY)/g' \
 	      -e 's|@''HAVE_POSIX_SPAWN''@|$(HAVE_POSIX_SPAWN)|g' \
 	      -e 's|@''HAVE_POSIX_SPAWNATTR_T''@|$(HAVE_POSIX_SPAWNATTR_T)|g' \
 	      -e 's|@''HAVE_POSIX_SPAWN_FILE_ACTIONS_T''@|$(HAVE_POSIX_SPAWN_FILE_ACTIONS_T)|g' \
@@ -10189,6 +12778,17 @@
 	} > $@-t && \
 	mv $@-t $@
 
+# We need the following in order to create <stdalign.h> when the system
+# doesn't have one that works.
+@GL_GENERATE_STDALIGN_H_TRUE@lib/stdalign.h: lib/stdalign.in.h $(top_builddir)/config.status
+@GL_GENERATE_STDALIGN_H_TRUE@	$(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_STDALIGN_H_TRUE@	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+@GL_GENERATE_STDALIGN_H_TRUE@	  cat $(top_srcdir)/lib/stdalign.in.h; \
+@GL_GENERATE_STDALIGN_H_TRUE@	} > $@-t && \
+@GL_GENERATE_STDALIGN_H_TRUE@	mv $@-t $@
+@GL_GENERATE_STDALIGN_H_FALSE@lib/stdalign.h: $(top_builddir)/config.status
+@GL_GENERATE_STDALIGN_H_FALSE@	rm -f $@
+
 # We need the following in order to create <stdbool.h> when the system
 # doesn't have one that works.
 @GL_GENERATE_STDBOOL_H_TRUE@lib/stdbool.h: lib/stdbool.in.h $(top_builddir)/config.status
@@ -10236,8 +12836,6 @@
 @GL_GENERATE_STDINT_H_TRUE@	      -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \
 @GL_GENERATE_STDINT_H_TRUE@	      -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \
 @GL_GENERATE_STDINT_H_TRUE@	      -e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \
-@GL_GENERATE_STDINT_H_TRUE@	      -e 's/@''HAVE_LONG_LONG_INT''@/$(HAVE_LONG_LONG_INT)/g' \
-@GL_GENERATE_STDINT_H_TRUE@	      -e 's/@''HAVE_UNSIGNED_LONG_LONG_INT''@/$(HAVE_UNSIGNED_LONG_LONG_INT)/g' \
 @GL_GENERATE_STDINT_H_TRUE@	      -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
 @GL_GENERATE_STDINT_H_TRUE@	      -e 's/@''BITSIZEOF_PTRDIFF_T''@/$(BITSIZEOF_PTRDIFF_T)/g' \
 @GL_GENERATE_STDINT_H_TRUE@	      -e 's/@''PTRDIFF_T_SUFFIX''@/$(PTRDIFF_T_SUFFIX)/g' \
@@ -10252,7 +12850,7 @@
 @GL_GENERATE_STDINT_H_TRUE@	      -e 's/@''BITSIZEOF_WINT_T''@/$(BITSIZEOF_WINT_T)/g' \
 @GL_GENERATE_STDINT_H_TRUE@	      -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \
 @GL_GENERATE_STDINT_H_TRUE@	      -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \
-@GL_GENERATE_STDINT_H_TRUE@	      -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@	      -e 's/@''GNULIBHEADERS_OVERRIDE_WINT_T''@/$(GNULIBHEADERS_OVERRIDE_WINT_T)/g' \
 @GL_GENERATE_STDINT_H_TRUE@	      < $(top_srcdir)/lib/stdint.in.h; \
 @GL_GENERATE_STDINT_H_TRUE@	} > $@-t && \
 @GL_GENERATE_STDINT_H_TRUE@	mv $@-t $@
@@ -10269,61 +12867,68 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \
-	      -e 's/@''GNULIB_DPRINTF''@/$(GNULIB_DPRINTF)/g' \
-	      -e 's/@''GNULIB_FCLOSE''@/$(GNULIB_FCLOSE)/g' \
-	      -e 's/@''GNULIB_FDOPEN''@/$(GNULIB_FDOPEN)/g' \
-	      -e 's/@''GNULIB_FFLUSH''@/$(GNULIB_FFLUSH)/g' \
-	      -e 's/@''GNULIB_FGETC''@/$(GNULIB_FGETC)/g' \
-	      -e 's/@''GNULIB_FGETS''@/$(GNULIB_FGETS)/g' \
-	      -e 's/@''GNULIB_FOPEN''@/$(GNULIB_FOPEN)/g' \
-	      -e 's/@''GNULIB_FPRINTF''@/$(GNULIB_FPRINTF)/g' \
-	      -e 's/@''GNULIB_FPRINTF_POSIX''@/$(GNULIB_FPRINTF_POSIX)/g' \
-	      -e 's/@''GNULIB_FPURGE''@/$(GNULIB_FPURGE)/g' \
-	      -e 's/@''GNULIB_FPUTC''@/$(GNULIB_FPUTC)/g' \
-	      -e 's/@''GNULIB_FPUTS''@/$(GNULIB_FPUTS)/g' \
-	      -e 's/@''GNULIB_FREAD''@/$(GNULIB_FREAD)/g' \
-	      -e 's/@''GNULIB_FREOPEN''@/$(GNULIB_FREOPEN)/g' \
-	      -e 's/@''GNULIB_FSCANF''@/$(GNULIB_FSCANF)/g' \
-	      -e 's/@''GNULIB_FSEEK''@/$(GNULIB_FSEEK)/g' \
-	      -e 's/@''GNULIB_FSEEKO''@/$(GNULIB_FSEEKO)/g' \
-	      -e 's/@''GNULIB_FTELL''@/$(GNULIB_FTELL)/g' \
-	      -e 's/@''GNULIB_FTELLO''@/$(GNULIB_FTELLO)/g' \
-	      -e 's/@''GNULIB_FWRITE''@/$(GNULIB_FWRITE)/g' \
-	      -e 's/@''GNULIB_GETC''@/$(GNULIB_GETC)/g' \
-	      -e 's/@''GNULIB_GETCHAR''@/$(GNULIB_GETCHAR)/g' \
-	      -e 's/@''GNULIB_GETDELIM''@/$(GNULIB_GETDELIM)/g' \
-	      -e 's/@''GNULIB_GETLINE''@/$(GNULIB_GETLINE)/g' \
-	      -e 's/@''GNULIB_OBSTACK_PRINTF''@/$(GNULIB_OBSTACK_PRINTF)/g' \
-	      -e 's/@''GNULIB_OBSTACK_PRINTF_POSIX''@/$(GNULIB_OBSTACK_PRINTF_POSIX)/g' \
-	      -e 's/@''GNULIB_PCLOSE''@/$(GNULIB_PCLOSE)/g' \
-	      -e 's/@''GNULIB_PERROR''@/$(GNULIB_PERROR)/g' \
-	      -e 's/@''GNULIB_POPEN''@/$(GNULIB_POPEN)/g' \
-	      -e 's/@''GNULIB_PRINTF''@/$(GNULIB_PRINTF)/g' \
-	      -e 's/@''GNULIB_PRINTF_POSIX''@/$(GNULIB_PRINTF_POSIX)/g' \
-	      -e 's/@''GNULIB_PUTC''@/$(GNULIB_PUTC)/g' \
-	      -e 's/@''GNULIB_PUTCHAR''@/$(GNULIB_PUTCHAR)/g' \
-	      -e 's/@''GNULIB_PUTS''@/$(GNULIB_PUTS)/g' \
-	      -e 's/@''GNULIB_REMOVE''@/$(GNULIB_REMOVE)/g' \
-	      -e 's/@''GNULIB_RENAME''@/$(GNULIB_RENAME)/g' \
-	      -e 's/@''GNULIB_RENAMEAT''@/$(GNULIB_RENAMEAT)/g' \
-	      -e 's/@''GNULIB_SCANF''@/$(GNULIB_SCANF)/g' \
-	      -e 's/@''GNULIB_SNPRINTF''@/$(GNULIB_SNPRINTF)/g' \
-	      -e 's/@''GNULIB_SPRINTF_POSIX''@/$(GNULIB_SPRINTF_POSIX)/g' \
-	      -e 's/@''GNULIB_STDIO_H_NONBLOCKING''@/$(GNULIB_STDIO_H_NONBLOCKING)/g' \
-	      -e 's/@''GNULIB_STDIO_H_SIGPIPE''@/$(GNULIB_STDIO_H_SIGPIPE)/g' \
-	      -e 's/@''GNULIB_TMPFILE''@/$(GNULIB_TMPFILE)/g' \
-	      -e 's/@''GNULIB_VASPRINTF''@/$(GNULIB_VASPRINTF)/g' \
-	      -e 's/@''GNULIB_VDPRINTF''@/$(GNULIB_VDPRINTF)/g' \
-	      -e 's/@''GNULIB_VFPRINTF''@/$(GNULIB_VFPRINTF)/g' \
-	      -e 's/@''GNULIB_VFPRINTF_POSIX''@/$(GNULIB_VFPRINTF_POSIX)/g' \
-	      -e 's/@''GNULIB_VFSCANF''@/$(GNULIB_VFSCANF)/g' \
-	      -e 's/@''GNULIB_VSCANF''@/$(GNULIB_VSCANF)/g' \
-	      -e 's/@''GNULIB_VPRINTF''@/$(GNULIB_VPRINTF)/g' \
-	      -e 's/@''GNULIB_VPRINTF_POSIX''@/$(GNULIB_VPRINTF_POSIX)/g' \
-	      -e 's/@''GNULIB_VSNPRINTF''@/$(GNULIB_VSNPRINTF)/g' \
-	      -e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GNULIB_VSPRINTF_POSIX)/g' \
+	      -e 's/@''GNULIB_DPRINTF''@/$(GL_GNULIB_DPRINTF)/g' \
+	      -e 's/@''GNULIB_FCLOSE''@/$(GL_GNULIB_FCLOSE)/g' \
+	      -e 's/@''GNULIB_FDOPEN''@/$(GL_GNULIB_FDOPEN)/g' \
+	      -e 's/@''GNULIB_FFLUSH''@/$(GL_GNULIB_FFLUSH)/g' \
+	      -e 's/@''GNULIB_FGETC''@/$(GL_GNULIB_FGETC)/g' \
+	      -e 's/@''GNULIB_FGETS''@/$(GL_GNULIB_FGETS)/g' \
+	      -e 's/@''GNULIB_FOPEN''@/$(GL_GNULIB_FOPEN)/g' \
+	      -e 's/@''GNULIB_FPRINTF''@/$(GL_GNULIB_FPRINTF)/g' \
+	      -e 's/@''GNULIB_FPRINTF_POSIX''@/$(GL_GNULIB_FPRINTF_POSIX)/g' \
+	      -e 's/@''GNULIB_FPURGE''@/$(GL_GNULIB_FPURGE)/g' \
+	      -e 's/@''GNULIB_FPUTC''@/$(GL_GNULIB_FPUTC)/g' \
+	      -e 's/@''GNULIB_FPUTS''@/$(GL_GNULIB_FPUTS)/g' \
+	      -e 's/@''GNULIB_FREAD''@/$(GL_GNULIB_FREAD)/g' \
+	      -e 's/@''GNULIB_FREOPEN''@/$(GL_GNULIB_FREOPEN)/g' \
+	      -e 's/@''GNULIB_FSCANF''@/$(GL_GNULIB_FSCANF)/g' \
+	      -e 's/@''GNULIB_FSEEK''@/$(GL_GNULIB_FSEEK)/g' \
+	      -e 's/@''GNULIB_FSEEKO''@/$(GL_GNULIB_FSEEKO)/g' \
+	      -e 's/@''GNULIB_FTELL''@/$(GL_GNULIB_FTELL)/g' \
+	      -e 's/@''GNULIB_FTELLO''@/$(GL_GNULIB_FTELLO)/g' \
+	      -e 's/@''GNULIB_FWRITE''@/$(GL_GNULIB_FWRITE)/g' \
+	      -e 's/@''GNULIB_GETC''@/$(GL_GNULIB_GETC)/g' \
+	      -e 's/@''GNULIB_GETCHAR''@/$(GL_GNULIB_GETCHAR)/g' \
+	      -e 's/@''GNULIB_GETDELIM''@/$(GL_GNULIB_GETDELIM)/g' \
+	      -e 's/@''GNULIB_GETLINE''@/$(GL_GNULIB_GETLINE)/g' \
+	      -e 's/@''GNULIB_OBSTACK_PRINTF''@/$(GL_GNULIB_OBSTACK_PRINTF)/g' \
+	      -e 's/@''GNULIB_OBSTACK_PRINTF_POSIX''@/$(GL_GNULIB_OBSTACK_PRINTF_POSIX)/g' \
+	      -e 's/@''GNULIB_PCLOSE''@/$(GL_GNULIB_PCLOSE)/g' \
+	      -e 's/@''GNULIB_PERROR''@/$(GL_GNULIB_PERROR)/g' \
+	      -e 's/@''GNULIB_POPEN''@/$(GL_GNULIB_POPEN)/g' \
+	      -e 's/@''GNULIB_PRINTF''@/$(GL_GNULIB_PRINTF)/g' \
+	      -e 's/@''GNULIB_PRINTF_POSIX''@/$(GL_GNULIB_PRINTF_POSIX)/g' \
+	      -e 's/@''GNULIB_PUTC''@/$(GL_GNULIB_PUTC)/g' \
+	      -e 's/@''GNULIB_PUTCHAR''@/$(GL_GNULIB_PUTCHAR)/g' \
+	      -e 's/@''GNULIB_PUTS''@/$(GL_GNULIB_PUTS)/g' \
+	      -e 's/@''GNULIB_REMOVE''@/$(GL_GNULIB_REMOVE)/g' \
+	      -e 's/@''GNULIB_RENAME''@/$(GL_GNULIB_RENAME)/g' \
+	      -e 's/@''GNULIB_RENAMEAT''@/$(GL_GNULIB_RENAMEAT)/g' \
+	      -e 's/@''GNULIB_SCANF''@/$(GL_GNULIB_SCANF)/g' \
+	      -e 's/@''GNULIB_SNPRINTF''@/$(GL_GNULIB_SNPRINTF)/g' \
+	      -e 's/@''GNULIB_SPRINTF_POSIX''@/$(GL_GNULIB_SPRINTF_POSIX)/g' \
+	      -e 's/@''GNULIB_STDIO_H_NONBLOCKING''@/$(GL_GNULIB_STDIO_H_NONBLOCKING)/g' \
+	      -e 's/@''GNULIB_STDIO_H_SIGPIPE''@/$(GL_GNULIB_STDIO_H_SIGPIPE)/g' \
+	      -e 's/@''GNULIB_TMPFILE''@/$(GL_GNULIB_TMPFILE)/g' \
+	      -e 's/@''GNULIB_VASPRINTF''@/$(GL_GNULIB_VASPRINTF)/g' \
+	      -e 's/@''GNULIB_VDPRINTF''@/$(GL_GNULIB_VDPRINTF)/g' \
+	      -e 's/@''GNULIB_VFPRINTF''@/$(GL_GNULIB_VFPRINTF)/g' \
+	      -e 's/@''GNULIB_VFPRINTF_POSIX''@/$(GL_GNULIB_VFPRINTF_POSIX)/g' \
+	      -e 's/@''GNULIB_VFSCANF''@/$(GL_GNULIB_VFSCANF)/g' \
+	      -e 's/@''GNULIB_VSCANF''@/$(GL_GNULIB_VSCANF)/g' \
+	      -e 's/@''GNULIB_VPRINTF''@/$(GL_GNULIB_VPRINTF)/g' \
+	      -e 's/@''GNULIB_VPRINTF_POSIX''@/$(GL_GNULIB_VPRINTF_POSIX)/g' \
+	      -e 's/@''GNULIB_VSNPRINTF''@/$(GL_GNULIB_VSNPRINTF)/g' \
+	      -e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GL_GNULIB_VSPRINTF_POSIX)/g' \
+	      -e 's/@''GNULIB_MDA_FCLOSEALL''@/$(GL_GNULIB_MDA_FCLOSEALL)/g' \
+	      -e 's/@''GNULIB_MDA_FDOPEN''@/$(GL_GNULIB_MDA_FDOPEN)/g' \
+	      -e 's/@''GNULIB_MDA_FILENO''@/$(GL_GNULIB_MDA_FILENO)/g' \
+	      -e 's/@''GNULIB_MDA_GETW''@/$(GL_GNULIB_MDA_GETW)/g' \
+	      -e 's/@''GNULIB_MDA_PUTW''@/$(GL_GNULIB_MDA_PUTW)/g' \
+	      -e 's/@''GNULIB_MDA_TEMPNAM''@/$(GL_GNULIB_MDA_TEMPNAM)/g' \
 	      < $(top_srcdir)/lib/stdio.in.h | \
-	  sed -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \
+	  sed -e 's|@''HAVE_DECL_FCLOSEALL''@|$(HAVE_DECL_FCLOSEALL)|g' \
+	      -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \
 	      -e 's|@''HAVE_DECL_FSEEKO''@|$(HAVE_DECL_FSEEKO)|g' \
 	      -e 's|@''HAVE_DECL_FTELLO''@|$(HAVE_DECL_FTELLO)|g' \
 	      -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \
@@ -10389,45 +12994,59 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \
-	      -e 's/@''GNULIB__EXIT''@/$(GNULIB__EXIT)/g' \
-	      -e 's/@''GNULIB_ATOLL''@/$(GNULIB_ATOLL)/g' \
-	      -e 's/@''GNULIB_CALLOC_POSIX''@/$(GNULIB_CALLOC_POSIX)/g' \
-	      -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GNULIB_CANONICALIZE_FILE_NAME)/g' \
-	      -e 's/@''GNULIB_GETLOADAVG''@/$(GNULIB_GETLOADAVG)/g' \
-	      -e 's/@''GNULIB_GETSUBOPT''@/$(GNULIB_GETSUBOPT)/g' \
-	      -e 's/@''GNULIB_GRANTPT''@/$(GNULIB_GRANTPT)/g' \
-	      -e 's/@''GNULIB_MALLOC_POSIX''@/$(GNULIB_MALLOC_POSIX)/g' \
-	      -e 's/@''GNULIB_MBTOWC''@/$(GNULIB_MBTOWC)/g' \
-	      -e 's/@''GNULIB_MKDTEMP''@/$(GNULIB_MKDTEMP)/g' \
-	      -e 's/@''GNULIB_MKOSTEMP''@/$(GNULIB_MKOSTEMP)/g' \
-	      -e 's/@''GNULIB_MKOSTEMPS''@/$(GNULIB_MKOSTEMPS)/g' \
-	      -e 's/@''GNULIB_MKSTEMP''@/$(GNULIB_MKSTEMP)/g' \
-	      -e 's/@''GNULIB_MKSTEMPS''@/$(GNULIB_MKSTEMPS)/g' \
-	      -e 's/@''GNULIB_POSIX_OPENPT''@/$(GNULIB_POSIX_OPENPT)/g' \
-	      -e 's/@''GNULIB_PTSNAME''@/$(GNULIB_PTSNAME)/g' \
-	      -e 's/@''GNULIB_PTSNAME_R''@/$(GNULIB_PTSNAME_R)/g' \
-	      -e 's/@''GNULIB_PUTENV''@/$(GNULIB_PUTENV)/g' \
-	      -e 's/@''GNULIB_QSORT_R''@/$(GNULIB_QSORT_R)/g' \
-	      -e 's/@''GNULIB_RANDOM''@/$(GNULIB_RANDOM)/g' \
-	      -e 's/@''GNULIB_RANDOM_R''@/$(GNULIB_RANDOM_R)/g' \
-	      -e 's/@''GNULIB_REALLOC_POSIX''@/$(GNULIB_REALLOC_POSIX)/g' \
-	      -e 's/@''GNULIB_REALLOCARRAY''@/$(GNULIB_REALLOCARRAY)/g' \
-	      -e 's/@''GNULIB_REALPATH''@/$(GNULIB_REALPATH)/g' \
-	      -e 's/@''GNULIB_RPMATCH''@/$(GNULIB_RPMATCH)/g' \
-	      -e 's/@''GNULIB_SECURE_GETENV''@/$(GNULIB_SECURE_GETENV)/g' \
-	      -e 's/@''GNULIB_SETENV''@/$(GNULIB_SETENV)/g' \
-	      -e 's/@''GNULIB_STRTOD''@/$(GNULIB_STRTOD)/g' \
-	      -e 's/@''GNULIB_STRTOLD''@/$(GNULIB_STRTOLD)/g' \
-	      -e 's/@''GNULIB_STRTOLL''@/$(GNULIB_STRTOLL)/g' \
-	      -e 's/@''GNULIB_STRTOULL''@/$(GNULIB_STRTOULL)/g' \
-	      -e 's/@''GNULIB_SYSTEM_POSIX''@/$(GNULIB_SYSTEM_POSIX)/g' \
-	      -e 's/@''GNULIB_UNLOCKPT''@/$(GNULIB_UNLOCKPT)/g' \
-	      -e 's/@''GNULIB_UNSETENV''@/$(GNULIB_UNSETENV)/g' \
-	      -e 's/@''GNULIB_WCTOMB''@/$(GNULIB_WCTOMB)/g' \
+	      -e 's/@''GNULIB__EXIT''@/$(GL_GNULIB__EXIT)/g' \
+	      -e 's/@''GNULIB_ALIGNED_ALLOC''@/$(GL_GNULIB_ALIGNED_ALLOC)/g' \
+	      -e 's/@''GNULIB_ATOLL''@/$(GL_GNULIB_ATOLL)/g' \
+	      -e 's/@''GNULIB_CALLOC_POSIX''@/$(GL_GNULIB_CALLOC_POSIX)/g' \
+	      -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GL_GNULIB_CANONICALIZE_FILE_NAME)/g' \
+	      -e 's/@''GNULIB_FREE_POSIX''@/$(GL_GNULIB_FREE_POSIX)/g' \
+	      -e 's/@''GNULIB_GETLOADAVG''@/$(GL_GNULIB_GETLOADAVG)/g' \
+	      -e 's/@''GNULIB_GETSUBOPT''@/$(GL_GNULIB_GETSUBOPT)/g' \
+	      -e 's/@''GNULIB_GRANTPT''@/$(GL_GNULIB_GRANTPT)/g' \
+	      -e 's/@''GNULIB_MALLOC_POSIX''@/$(GL_GNULIB_MALLOC_POSIX)/g' \
+	      -e 's/@''GNULIB_MBTOWC''@/$(GL_GNULIB_MBTOWC)/g' \
+	      -e 's/@''GNULIB_MKDTEMP''@/$(GL_GNULIB_MKDTEMP)/g' \
+	      -e 's/@''GNULIB_MKOSTEMP''@/$(GL_GNULIB_MKOSTEMP)/g' \
+	      -e 's/@''GNULIB_MKOSTEMPS''@/$(GL_GNULIB_MKOSTEMPS)/g' \
+	      -e 's/@''GNULIB_MKSTEMP''@/$(GL_GNULIB_MKSTEMP)/g' \
+	      -e 's/@''GNULIB_MKSTEMPS''@/$(GL_GNULIB_MKSTEMPS)/g' \
+	      -e 's/@''GNULIB_POSIX_MEMALIGN''@/$(GL_GNULIB_POSIX_MEMALIGN)/g' \
+	      -e 's/@''GNULIB_POSIX_OPENPT''@/$(GL_GNULIB_POSIX_OPENPT)/g' \
+	      -e 's/@''GNULIB_PTSNAME''@/$(GL_GNULIB_PTSNAME)/g' \
+	      -e 's/@''GNULIB_PTSNAME_R''@/$(GL_GNULIB_PTSNAME_R)/g' \
+	      -e 's/@''GNULIB_PUTENV''@/$(GL_GNULIB_PUTENV)/g' \
+	      -e 's/@''GNULIB_QSORT_R''@/$(GL_GNULIB_QSORT_R)/g' \
+	      -e 's/@''GNULIB_RANDOM''@/$(GL_GNULIB_RANDOM)/g' \
+	      -e 's/@''GNULIB_RANDOM_R''@/$(GL_GNULIB_RANDOM_R)/g' \
+	      -e 's/@''GNULIB_REALLOC_POSIX''@/$(GL_GNULIB_REALLOC_POSIX)/g' \
+	      -e 's/@''GNULIB_REALLOCARRAY''@/$(GL_GNULIB_REALLOCARRAY)/g' \
+	      -e 's/@''GNULIB_REALPATH''@/$(GL_GNULIB_REALPATH)/g' \
+	      -e 's/@''GNULIB_RPMATCH''@/$(GL_GNULIB_RPMATCH)/g' \
+	      -e 's/@''GNULIB_SECURE_GETENV''@/$(GL_GNULIB_SECURE_GETENV)/g' \
+	      -e 's/@''GNULIB_SETENV''@/$(GL_GNULIB_SETENV)/g' \
+	      -e 's/@''GNULIB_STRTOD''@/$(GL_GNULIB_STRTOD)/g' \
+	      -e 's/@''GNULIB_STRTOL''@/$(GL_GNULIB_STRTOL)/g' \
+	      -e 's/@''GNULIB_STRTOLD''@/$(GL_GNULIB_STRTOLD)/g' \
+	      -e 's/@''GNULIB_STRTOLL''@/$(GL_GNULIB_STRTOLL)/g' \
+	      -e 's/@''GNULIB_STRTOUL''@/$(GL_GNULIB_STRTOUL)/g' \
+	      -e 's/@''GNULIB_STRTOULL''@/$(GL_GNULIB_STRTOULL)/g' \
+	      -e 's/@''GNULIB_SYSTEM_POSIX''@/$(GL_GNULIB_SYSTEM_POSIX)/g' \
+	      -e 's/@''GNULIB_UNLOCKPT''@/$(GL_GNULIB_UNLOCKPT)/g' \
+	      -e 's/@''GNULIB_UNSETENV''@/$(GL_GNULIB_UNSETENV)/g' \
+	      -e 's/@''GNULIB_WCTOMB''@/$(GL_GNULIB_WCTOMB)/g' \
+	      -e 's/@''GNULIB_MDA_ECVT''@/$(GL_GNULIB_MDA_ECVT)/g' \
+	      -e 's/@''GNULIB_MDA_FCVT''@/$(GL_GNULIB_MDA_FCVT)/g' \
+	      -e 's/@''GNULIB_MDA_GCVT''@/$(GL_GNULIB_MDA_GCVT)/g' \
+	      -e 's/@''GNULIB_MDA_MKTEMP''@/$(GL_GNULIB_MDA_MKTEMP)/g' \
+	      -e 's/@''GNULIB_MDA_PUTENV''@/$(GL_GNULIB_MDA_PUTENV)/g' \
 	      < $(top_srcdir)/lib/stdlib.in.h | \
 	  sed -e 's|@''HAVE__EXIT''@|$(HAVE__EXIT)|g' \
+	      -e 's|@''HAVE_ALIGNED_ALLOC''@|$(HAVE_ALIGNED_ALLOC)|g' \
 	      -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \
 	      -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \
+	      -e 's|@''HAVE_DECL_ECVT''@|$(HAVE_DECL_ECVT)|g' \
+	      -e 's|@''HAVE_DECL_FCVT''@|$(HAVE_DECL_FCVT)|g' \
+	      -e 's|@''HAVE_DECL_GCVT''@|$(HAVE_DECL_GCVT)|g' \
 	      -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \
 	      -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \
 	      -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \
@@ -10439,6 +13058,7 @@
 	      -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \
 	      -e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \
 	      -e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \
+	      -e 's|@''HAVE_POSIX_MEMALIGN''@|$(HAVE_POSIX_MEMALIGN)|g' \
 	      -e 's|@''HAVE_POSIX_OPENPT''@|$(HAVE_POSIX_OPENPT)|g' \
 	      -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \
 	      -e 's|@''HAVE_PTSNAME_R''@|$(HAVE_PTSNAME_R)|g' \
@@ -10454,19 +13074,24 @@
 	      -e 's|@''HAVE_SETSTATE''@|$(HAVE_SETSTATE)|g' \
 	      -e 's|@''HAVE_DECL_SETSTATE''@|$(HAVE_DECL_SETSTATE)|g' \
 	      -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \
+	      -e 's|@''HAVE_STRTOL''@|$(HAVE_STRTOL)|g' \
 	      -e 's|@''HAVE_STRTOLD''@|$(HAVE_STRTOLD)|g' \
 	      -e 's|@''HAVE_STRTOLL''@|$(HAVE_STRTOLL)|g' \
+	      -e 's|@''HAVE_STRTOUL''@|$(HAVE_STRTOUL)|g' \
 	      -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \
 	      -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \
 	      -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \
 	      -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \
 	      -e 's|@''HAVE_DECL_UNSETENV''@|$(HAVE_DECL_UNSETENV)|g' \
+	      -e 's|@''REPLACE_ALIGNED_ALLOC''@|$(REPLACE_ALIGNED_ALLOC)|g' \
 	      -e 's|@''REPLACE_CALLOC''@|$(REPLACE_CALLOC)|g' \
 	      -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \
+	      -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \
 	      -e 's|@''REPLACE_INITSTATE''@|$(REPLACE_INITSTATE)|g' \
 	      -e 's|@''REPLACE_MALLOC''@|$(REPLACE_MALLOC)|g' \
 	      -e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \
 	      -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \
+	      -e 's|@''REPLACE_POSIX_MEMALIGN''@|$(REPLACE_POSIX_MEMALIGN)|g' \
 	      -e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \
 	      -e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \
 	      -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \
@@ -10474,11 +13099,16 @@
 	      -e 's|@''REPLACE_RANDOM''@|$(REPLACE_RANDOM)|g' \
 	      -e 's|@''REPLACE_RANDOM_R''@|$(REPLACE_RANDOM_R)|g' \
 	      -e 's|@''REPLACE_REALLOC''@|$(REPLACE_REALLOC)|g' \
+	      -e 's|@''REPLACE_REALLOCARRAY''@|$(REPLACE_REALLOCARRAY)|g' \
 	      -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \
 	      -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \
 	      -e 's|@''REPLACE_SETSTATE''@|$(REPLACE_SETSTATE)|g' \
 	      -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \
+	      -e 's|@''REPLACE_STRTOL''@|$(REPLACE_STRTOL)|g' \
 	      -e 's|@''REPLACE_STRTOLD''@|$(REPLACE_STRTOLD)|g' \
+	      -e 's|@''REPLACE_STRTOLL''@|$(REPLACE_STRTOLL)|g' \
+	      -e 's|@''REPLACE_STRTOUL''@|$(REPLACE_STRTOUL)|g' \
+	      -e 's|@''REPLACE_STRTOULL''@|$(REPLACE_STRTOULL)|g' \
 	      -e 's|@''REPLACE_UNSETENV''@|$(REPLACE_UNSETENV)|g' \
 	      -e 's|@''REPLACE_WCTOMB''@|$(REPLACE_WCTOMB)|g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
@@ -10498,50 +13128,54 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \
-	      -e 's/@''GNULIB_EXPLICIT_BZERO''@/$(GNULIB_EXPLICIT_BZERO)/g' \
-	      -e 's/@''GNULIB_FFSL''@/$(GNULIB_FFSL)/g' \
-	      -e 's/@''GNULIB_FFSLL''@/$(GNULIB_FFSLL)/g' \
-	      -e 's/@''GNULIB_MBSLEN''@/$(GNULIB_MBSLEN)/g' \
-	      -e 's/@''GNULIB_MBSNLEN''@/$(GNULIB_MBSNLEN)/g' \
-	      -e 's/@''GNULIB_MBSCHR''@/$(GNULIB_MBSCHR)/g' \
-	      -e 's/@''GNULIB_MBSRCHR''@/$(GNULIB_MBSRCHR)/g' \
-	      -e 's/@''GNULIB_MBSSTR''@/$(GNULIB_MBSSTR)/g' \
-	      -e 's/@''GNULIB_MBSCASECMP''@/$(GNULIB_MBSCASECMP)/g' \
-	      -e 's/@''GNULIB_MBSNCASECMP''@/$(GNULIB_MBSNCASECMP)/g' \
-	      -e 's/@''GNULIB_MBSPCASECMP''@/$(GNULIB_MBSPCASECMP)/g' \
-	      -e 's/@''GNULIB_MBSCASESTR''@/$(GNULIB_MBSCASESTR)/g' \
-	      -e 's/@''GNULIB_MBSCSPN''@/$(GNULIB_MBSCSPN)/g' \
-	      -e 's/@''GNULIB_MBSPBRK''@/$(GNULIB_MBSPBRK)/g' \
-	      -e 's/@''GNULIB_MBSSPN''@/$(GNULIB_MBSSPN)/g' \
-	      -e 's/@''GNULIB_MBSSEP''@/$(GNULIB_MBSSEP)/g' \
-	      -e 's/@''GNULIB_MBSTOK_R''@/$(GNULIB_MBSTOK_R)/g' \
-	      -e 's/@''GNULIB_MEMCHR''@/$(GNULIB_MEMCHR)/g' \
-	      -e 's/@''GNULIB_MEMMEM''@/$(GNULIB_MEMMEM)/g' \
-	      -e 's/@''GNULIB_MEMPCPY''@/$(GNULIB_MEMPCPY)/g' \
-	      -e 's/@''GNULIB_MEMRCHR''@/$(GNULIB_MEMRCHR)/g' \
-	      -e 's/@''GNULIB_RAWMEMCHR''@/$(GNULIB_RAWMEMCHR)/g' \
-	      -e 's/@''GNULIB_STPCPY''@/$(GNULIB_STPCPY)/g' \
-	      -e 's/@''GNULIB_STPNCPY''@/$(GNULIB_STPNCPY)/g' \
-	      -e 's/@''GNULIB_STRCHRNUL''@/$(GNULIB_STRCHRNUL)/g' \
-	      -e 's/@''GNULIB_STRDUP''@/$(GNULIB_STRDUP)/g' \
-	      -e 's/@''GNULIB_STRNCAT''@/$(GNULIB_STRNCAT)/g' \
-	      -e 's/@''GNULIB_STRNDUP''@/$(GNULIB_STRNDUP)/g' \
-	      -e 's/@''GNULIB_STRNLEN''@/$(GNULIB_STRNLEN)/g' \
-	      -e 's/@''GNULIB_STRPBRK''@/$(GNULIB_STRPBRK)/g' \
-	      -e 's/@''GNULIB_STRSEP''@/$(GNULIB_STRSEP)/g' \
-	      -e 's/@''GNULIB_STRSTR''@/$(GNULIB_STRSTR)/g' \
-	      -e 's/@''GNULIB_STRCASESTR''@/$(GNULIB_STRCASESTR)/g' \
-	      -e 's/@''GNULIB_STRTOK_R''@/$(GNULIB_STRTOK_R)/g' \
-	      -e 's/@''GNULIB_STRERROR''@/$(GNULIB_STRERROR)/g' \
-	      -e 's/@''GNULIB_STRERROR_R''@/$(GNULIB_STRERROR_R)/g' \
-	      -e 's/@''GNULIB_STRSIGNAL''@/$(GNULIB_STRSIGNAL)/g' \
-	      -e 's/@''GNULIB_STRVERSCMP''@/$(GNULIB_STRVERSCMP)/g' \
+	      -e 's/@''GNULIB_EXPLICIT_BZERO''@/$(GL_GNULIB_EXPLICIT_BZERO)/g' \
+	      -e 's/@''GNULIB_FFSL''@/$(GL_GNULIB_FFSL)/g' \
+	      -e 's/@''GNULIB_FFSLL''@/$(GL_GNULIB_FFSLL)/g' \
+	      -e 's/@''GNULIB_MBSLEN''@/$(GL_GNULIB_MBSLEN)/g' \
+	      -e 's/@''GNULIB_MBSNLEN''@/$(GL_GNULIB_MBSNLEN)/g' \
+	      -e 's/@''GNULIB_MBSCHR''@/$(GL_GNULIB_MBSCHR)/g' \
+	      -e 's/@''GNULIB_MBSRCHR''@/$(GL_GNULIB_MBSRCHR)/g' \
+	      -e 's/@''GNULIB_MBSSTR''@/$(GL_GNULIB_MBSSTR)/g' \
+	      -e 's/@''GNULIB_MBSCASECMP''@/$(GL_GNULIB_MBSCASECMP)/g' \
+	      -e 's/@''GNULIB_MBSNCASECMP''@/$(GL_GNULIB_MBSNCASECMP)/g' \
+	      -e 's/@''GNULIB_MBSPCASECMP''@/$(GL_GNULIB_MBSPCASECMP)/g' \
+	      -e 's/@''GNULIB_MBSCASESTR''@/$(GL_GNULIB_MBSCASESTR)/g' \
+	      -e 's/@''GNULIB_MBSCSPN''@/$(GL_GNULIB_MBSCSPN)/g' \
+	      -e 's/@''GNULIB_MBSPBRK''@/$(GL_GNULIB_MBSPBRK)/g' \
+	      -e 's/@''GNULIB_MBSSPN''@/$(GL_GNULIB_MBSSPN)/g' \
+	      -e 's/@''GNULIB_MBSSEP''@/$(GL_GNULIB_MBSSEP)/g' \
+	      -e 's/@''GNULIB_MBSTOK_R''@/$(GL_GNULIB_MBSTOK_R)/g' \
+	      -e 's/@''GNULIB_MEMCHR''@/$(GL_GNULIB_MEMCHR)/g' \
+	      -e 's/@''GNULIB_MEMMEM''@/$(GL_GNULIB_MEMMEM)/g' \
+	      -e 's/@''GNULIB_MEMPCPY''@/$(GL_GNULIB_MEMPCPY)/g' \
+	      -e 's/@''GNULIB_MEMRCHR''@/$(GL_GNULIB_MEMRCHR)/g' \
+	      -e 's/@''GNULIB_RAWMEMCHR''@/$(GL_GNULIB_RAWMEMCHR)/g' \
+	      -e 's/@''GNULIB_STPCPY''@/$(GL_GNULIB_STPCPY)/g' \
+	      -e 's/@''GNULIB_STPNCPY''@/$(GL_GNULIB_STPNCPY)/g' \
+	      -e 's/@''GNULIB_STRCHRNUL''@/$(GL_GNULIB_STRCHRNUL)/g' \
+	      -e 's/@''GNULIB_STRDUP''@/$(GL_GNULIB_STRDUP)/g' \
+	      -e 's/@''GNULIB_STRNCAT''@/$(GL_GNULIB_STRNCAT)/g' \
+	      -e 's/@''GNULIB_STRNDUP''@/$(GL_GNULIB_STRNDUP)/g' \
+	      -e 's/@''GNULIB_STRNLEN''@/$(GL_GNULIB_STRNLEN)/g' \
+	      -e 's/@''GNULIB_STRPBRK''@/$(GL_GNULIB_STRPBRK)/g' \
+	      -e 's/@''GNULIB_STRSEP''@/$(GL_GNULIB_STRSEP)/g' \
+	      -e 's/@''GNULIB_STRSTR''@/$(GL_GNULIB_STRSTR)/g' \
+	      -e 's/@''GNULIB_STRCASESTR''@/$(GL_GNULIB_STRCASESTR)/g' \
+	      -e 's/@''GNULIB_STRTOK_R''@/$(GL_GNULIB_STRTOK_R)/g' \
+	      -e 's/@''GNULIB_STRERROR''@/$(GL_GNULIB_STRERROR)/g' \
+	      -e 's/@''GNULIB_STRERROR_R''@/$(GL_GNULIB_STRERROR_R)/g' \
+	      -e 's/@''GNULIB_STRERRORNAME_NP''@/$(GL_GNULIB_STRERRORNAME_NP)/g' \
+	      -e 's/@''GNULIB_SIGABBREV_NP''@/$(GL_GNULIB_SIGABBREV_NP)/g' \
+	      -e 's/@''GNULIB_SIGDESCR_NP''@/$(GL_GNULIB_SIGDESCR_NP)/g' \
+	      -e 's/@''GNULIB_STRSIGNAL''@/$(GL_GNULIB_STRSIGNAL)/g' \
+	      -e 's/@''GNULIB_STRVERSCMP''@/$(GL_GNULIB_STRVERSCMP)/g' \
+	      -e 's/@''GNULIB_MDA_MEMCCPY''@/$(GL_GNULIB_MDA_MEMCCPY)/g' \
+	      -e 's/@''GNULIB_MDA_STRDUP''@/$(GL_GNULIB_MDA_STRDUP)/g' \
 	      < $(top_srcdir)/lib/string.in.h | \
 	  sed -e 's|@''HAVE_EXPLICIT_BZERO''@|$(HAVE_EXPLICIT_BZERO)|g' \
 	      -e 's|@''HAVE_FFSL''@|$(HAVE_FFSL)|g' \
 	      -e 's|@''HAVE_FFSLL''@|$(HAVE_FFSLL)|g' \
 	      -e 's|@''HAVE_MBSLEN''@|$(HAVE_MBSLEN)|g' \
-	      -e 's|@''HAVE_MEMCHR''@|$(HAVE_MEMCHR)|g' \
 	      -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \
 	      -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \
 	      -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \
@@ -10557,10 +13191,15 @@
 	      -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \
 	      -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \
 	      -e 's|@''HAVE_DECL_STRERROR_R''@|$(HAVE_DECL_STRERROR_R)|g' \
+	      -e 's|@''HAVE_STRERRORNAME_NP''@|$(HAVE_STRERRORNAME_NP)|g' \
+	      -e 's|@''HAVE_SIGABBREV_NP''@|$(HAVE_SIGABBREV_NP)|g' \
+	      -e 's|@''HAVE_SIGDESCR_NP''@|$(HAVE_SIGDESCR_NP)|g' \
 	      -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \
 	      -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \
+	      -e 's|@''REPLACE_FFSLL''@|$(REPLACE_FFSLL)|g' \
 	      -e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \
 	      -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \
+	      -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \
 	      -e 's|@''REPLACE_STPNCPY''@|$(REPLACE_STPNCPY)|g' \
 	      -e 's|@''REPLACE_STRCHRNUL''@|$(REPLACE_STRCHRNUL)|g' \
 	      -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \
@@ -10572,6 +13211,7 @@
 	      -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \
 	      -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \
 	      -e 's|@''REPLACE_STRERROR_R''@|$(REPLACE_STRERROR_R)|g' \
+	      -e 's|@''REPLACE_STRERRORNAME_NP''@|$(REPLACE_STRERRORNAME_NP)|g' \
 	      -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \
 	      -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
@@ -10581,6 +13221,50 @@
 	} > $@-t && \
 	mv $@-t $@
 
+# We need the following in order to create <strings.h> when the system
+# doesn't have one that works with the given compiler.
+@gl_GNULIB_ENABLED_strings_TRUE@lib/strings.h: lib/strings.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+@gl_GNULIB_ENABLED_strings_TRUE@	$(AM_V_GEN)rm -f $@-t $@ && \
+@gl_GNULIB_ENABLED_strings_TRUE@	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+@gl_GNULIB_ENABLED_strings_TRUE@	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+@gl_GNULIB_ENABLED_strings_TRUE@	      -e 's|@''HAVE_STRINGS_H''@|$(HAVE_STRINGS_H)|g' \
+@gl_GNULIB_ENABLED_strings_TRUE@	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@gl_GNULIB_ENABLED_strings_TRUE@	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@gl_GNULIB_ENABLED_strings_TRUE@	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@gl_GNULIB_ENABLED_strings_TRUE@	      -e 's|@''NEXT_STRINGS_H''@|$(NEXT_STRINGS_H)|g' \
+@gl_GNULIB_ENABLED_strings_TRUE@	      -e 's/@''GNULIB_FFS''@/$(GL_GNULIB_FFS)/g' \
+@gl_GNULIB_ENABLED_strings_TRUE@	      -e 's|@''HAVE_FFS''@|$(HAVE_FFS)|g' \
+@gl_GNULIB_ENABLED_strings_TRUE@	      -e 's|@''HAVE_STRCASECMP''@|$(HAVE_STRCASECMP)|g' \
+@gl_GNULIB_ENABLED_strings_TRUE@	      -e 's|@''HAVE_DECL_STRNCASECMP''@|$(HAVE_DECL_STRNCASECMP)|g' \
+@gl_GNULIB_ENABLED_strings_TRUE@	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+@gl_GNULIB_ENABLED_strings_TRUE@	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+@gl_GNULIB_ENABLED_strings_TRUE@	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+@gl_GNULIB_ENABLED_strings_TRUE@	      < $(top_srcdir)/lib/strings.in.h; \
+@gl_GNULIB_ENABLED_strings_TRUE@	} > $@-t && \
+@gl_GNULIB_ENABLED_strings_TRUE@	mv $@-t $@
+
+# We need the following in order to create <sys/ioctl.h> when the system
+# does not have a complete one.
+lib/sys/ioctl.h: lib/sys_ioctl.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+	$(AM_V_at)$(MKDIR_P) lib/sys
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''HAVE_SYS_IOCTL_H''@|$(HAVE_SYS_IOCTL_H)|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_SYS_IOCTL_H''@|$(NEXT_SYS_IOCTL_H)|g' \
+	      -e 's/@''GNULIB_IOCTL''@/$(GL_GNULIB_IOCTL)/g' \
+	      -e 's|@''SYS_IOCTL_H_HAVE_WINSOCK2_H''@|$(SYS_IOCTL_H_HAVE_WINSOCK2_H)|g' \
+	      -e 's|@''SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \
+	      -e 's|@''REPLACE_IOCTL''@|$(REPLACE_IOCTL)|g' \
+	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+	      < $(top_srcdir)/lib/sys_ioctl.in.h; \
+	} > $@-t && \
+	mv $@-t $@
+
 # We need the following in order to create <sys/resource.h> when the system
 # doesn't have one.
 lib/sys/resource.h: lib/sys_resource.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
@@ -10593,7 +13277,7 @@
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_SYS_RESOURCE_H''@|$(NEXT_SYS_RESOURCE_H)|g' \
 	      -e 's|@''HAVE_SYS_RESOURCE_H''@|$(HAVE_SYS_RESOURCE_H)|g' \
-	      -e 's/@''GNULIB_GETRUSAGE''@/$(GNULIB_GETRUSAGE)/g' \
+	      -e 's/@''GNULIB_GETRUSAGE''@/$(GL_GNULIB_GETRUSAGE)/g' \
 	      -e 's/@''HAVE_GETRUSAGE''@/$(HAVE_GETRUSAGE)/g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
 	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
@@ -10604,57 +13288,66 @@
 
 # We need the following in order to create <sys/stat.h> when the system
 # has one that is incomplete.
-@gl_GNULIB_ENABLED_sys_stat_TRUE@lib/sys/stat.h: lib/sys_stat.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	$(AM_V_at)$(MKDIR_P) lib/sys
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	$(AM_V_GEN)rm -f $@-t $@ && \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''NEXT_SYS_STAT_H''@|$(NEXT_SYS_STAT_H)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''WINDOWS_64_BIT_ST_SIZE''@|$(WINDOWS_64_BIT_ST_SIZE)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''WINDOWS_STAT_TIMESPEC''@|$(WINDOWS_STAT_TIMESPEC)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's/@''GNULIB_FCHMODAT''@/$(GNULIB_FCHMODAT)/g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's/@''GNULIB_FSTAT''@/$(GNULIB_FSTAT)/g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's/@''GNULIB_FSTATAT''@/$(GNULIB_FSTATAT)/g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's/@''GNULIB_FUTIMENS''@/$(GNULIB_FUTIMENS)/g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's/@''GNULIB_LCHMOD''@/$(GNULIB_LCHMOD)/g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's/@''GNULIB_LSTAT''@/$(GNULIB_LSTAT)/g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's/@''GNULIB_MKDIRAT''@/$(GNULIB_MKDIRAT)/g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's/@''GNULIB_MKFIFO''@/$(GNULIB_MKFIFO)/g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's/@''GNULIB_MKFIFOAT''@/$(GNULIB_MKFIFOAT)/g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's/@''GNULIB_MKNOD''@/$(GNULIB_MKNOD)/g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's/@''GNULIB_MKNODAT''@/$(GNULIB_MKNODAT)/g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's/@''GNULIB_STAT''@/$(GNULIB_STAT)/g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's/@''GNULIB_UTIMENSAT''@/$(GNULIB_UTIMENSAT)/g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's/@''GNULIB_OVERRIDES_STRUCT_STAT''@/$(GNULIB_OVERRIDES_STRUCT_STAT)/g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''HAVE_FCHMODAT''@|$(HAVE_FCHMODAT)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''HAVE_FSTATAT''@|$(HAVE_FSTATAT)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''HAVE_FUTIMENS''@|$(HAVE_FUTIMENS)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''HAVE_LCHMOD''@|$(HAVE_LCHMOD)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''HAVE_LSTAT''@|$(HAVE_LSTAT)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''HAVE_MKDIRAT''@|$(HAVE_MKDIRAT)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''HAVE_MKFIFO''@|$(HAVE_MKFIFO)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''HAVE_MKFIFOAT''@|$(HAVE_MKFIFOAT)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''HAVE_MKNOD''@|$(HAVE_MKNOD)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''HAVE_MKNODAT''@|$(HAVE_MKNODAT)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''HAVE_UTIMENSAT''@|$(HAVE_UTIMENSAT)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''REPLACE_FSTAT''@|$(REPLACE_FSTAT)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''REPLACE_FSTATAT''@|$(REPLACE_FSTATAT)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''REPLACE_FUTIMENS''@|$(REPLACE_FUTIMENS)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''REPLACE_LSTAT''@|$(REPLACE_LSTAT)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''REPLACE_MKDIR''@|$(REPLACE_MKDIR)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''REPLACE_MKFIFO''@|$(REPLACE_MKFIFO)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''REPLACE_MKNOD''@|$(REPLACE_MKNOD)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''REPLACE_STAT''@|$(REPLACE_STAT)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e 's|@''REPLACE_UTIMENSAT''@|$(REPLACE_UTIMENSAT)|g' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	      < $(top_srcdir)/lib/sys_stat.in.h; \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	} > $@-t && \
-@gl_GNULIB_ENABLED_sys_stat_TRUE@	mv $@-t $@
+lib/sys/stat.h: lib/sys_stat.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+	$(AM_V_at)$(MKDIR_P) lib/sys
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_SYS_STAT_H''@|$(NEXT_SYS_STAT_H)|g' \
+	      -e 's|@''WINDOWS_64_BIT_ST_SIZE''@|$(WINDOWS_64_BIT_ST_SIZE)|g' \
+	      -e 's|@''WINDOWS_STAT_TIMESPEC''@|$(WINDOWS_STAT_TIMESPEC)|g' \
+	      -e 's/@''GNULIB_FCHMODAT''@/$(GL_GNULIB_FCHMODAT)/g' \
+	      -e 's/@''GNULIB_FSTAT''@/$(GL_GNULIB_FSTAT)/g' \
+	      -e 's/@''GNULIB_FSTATAT''@/$(GL_GNULIB_FSTATAT)/g' \
+	      -e 's/@''GNULIB_FUTIMENS''@/$(GL_GNULIB_FUTIMENS)/g' \
+	      -e 's/@''GNULIB_GETUMASK''@/$(GL_GNULIB_GETUMASK)/g' \
+	      -e 's/@''GNULIB_LCHMOD''@/$(GL_GNULIB_LCHMOD)/g' \
+	      -e 's/@''GNULIB_LSTAT''@/$(GL_GNULIB_LSTAT)/g' \
+	      -e 's/@''GNULIB_MKDIR''@/$(GL_GNULIB_MKDIR)/g' \
+	      -e 's/@''GNULIB_MKDIRAT''@/$(GL_GNULIB_MKDIRAT)/g' \
+	      -e 's/@''GNULIB_MKFIFO''@/$(GL_GNULIB_MKFIFO)/g' \
+	      -e 's/@''GNULIB_MKFIFOAT''@/$(GL_GNULIB_MKFIFOAT)/g' \
+	      -e 's/@''GNULIB_MKNOD''@/$(GL_GNULIB_MKNOD)/g' \
+	      -e 's/@''GNULIB_MKNODAT''@/$(GL_GNULIB_MKNODAT)/g' \
+	      -e 's/@''GNULIB_STAT''@/$(GL_GNULIB_STAT)/g' \
+	      -e 's/@''GNULIB_UTIMENSAT''@/$(GL_GNULIB_UTIMENSAT)/g' \
+	      -e 's/@''GNULIB_OVERRIDES_STRUCT_STAT''@/$(GL_GNULIB_OVERRIDES_STRUCT_STAT)/g' \
+	      -e 's/@''GNULIB_MDA_CHMOD''@/$(GL_GNULIB_MDA_CHMOD)/g' \
+	      -e 's/@''GNULIB_MDA_MKDIR''@/$(GL_GNULIB_MDA_MKDIR)/g' \
+	      -e 's/@''GNULIB_MDA_UMASK''@/$(GL_GNULIB_MDA_UMASK)/g' \
+	      -e 's|@''HAVE_FCHMODAT''@|$(HAVE_FCHMODAT)|g' \
+	      -e 's|@''HAVE_FSTATAT''@|$(HAVE_FSTATAT)|g' \
+	      -e 's|@''HAVE_FUTIMENS''@|$(HAVE_FUTIMENS)|g' \
+	      -e 's|@''HAVE_GETUMASK''@|$(HAVE_GETUMASK)|g' \
+	      -e 's|@''HAVE_LCHMOD''@|$(HAVE_LCHMOD)|g' \
+	      -e 's|@''HAVE_LSTAT''@|$(HAVE_LSTAT)|g' \
+	      -e 's|@''HAVE_MKDIRAT''@|$(HAVE_MKDIRAT)|g' \
+	      -e 's|@''HAVE_MKFIFO''@|$(HAVE_MKFIFO)|g' \
+	      -e 's|@''HAVE_MKFIFOAT''@|$(HAVE_MKFIFOAT)|g' \
+	      -e 's|@''HAVE_MKNOD''@|$(HAVE_MKNOD)|g' \
+	      -e 's|@''HAVE_MKNODAT''@|$(HAVE_MKNODAT)|g' \
+	      -e 's|@''HAVE_UTIMENSAT''@|$(HAVE_UTIMENSAT)|g' \
+	      -e 's|@''REPLACE_FCHMODAT''@|$(REPLACE_FCHMODAT)|g' \
+	      -e 's|@''REPLACE_FSTAT''@|$(REPLACE_FSTAT)|g' \
+	      -e 's|@''REPLACE_FSTATAT''@|$(REPLACE_FSTATAT)|g' \
+	      -e 's|@''REPLACE_FUTIMENS''@|$(REPLACE_FUTIMENS)|g' \
+	      -e 's|@''REPLACE_LSTAT''@|$(REPLACE_LSTAT)|g' \
+	      -e 's|@''REPLACE_MKDIR''@|$(REPLACE_MKDIR)|g' \
+	      -e 's|@''REPLACE_MKFIFO''@|$(REPLACE_MKFIFO)|g' \
+	      -e 's|@''REPLACE_MKFIFOAT''@|$(REPLACE_MKFIFOAT)|g' \
+	      -e 's|@''REPLACE_MKNOD''@|$(REPLACE_MKNOD)|g' \
+	      -e 's|@''REPLACE_MKNODAT''@|$(REPLACE_MKNODAT)|g' \
+	      -e 's|@''REPLACE_STAT''@|$(REPLACE_STAT)|g' \
+	      -e 's|@''REPLACE_UTIMENSAT''@|$(REPLACE_UTIMENSAT)|g' \
+	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+	      < $(top_srcdir)/lib/sys_stat.in.h; \
+	} > $@-t && \
+	mv $@-t $@
 
 # We need the following in order to create <sys/time.h> when the system
 # doesn't have one that works with the given compiler.
@@ -10668,7 +13361,7 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_SYS_TIME_H''@|$(NEXT_SYS_TIME_H)|g' \
-	      -e 's/@''GNULIB_GETTIMEOFDAY''@/$(GNULIB_GETTIMEOFDAY)/g' \
+	      -e 's/@''GNULIB_GETTIMEOFDAY''@/$(GL_GNULIB_GETTIMEOFDAY)/g' \
 	      -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \
 	      -e 's/@''HAVE_GETTIMEOFDAY''@/$(HAVE_GETTIMEOFDAY)/g' \
 	      -e 's/@''HAVE_STRUCT_TIMEVAL''@/$(HAVE_STRUCT_TIMEVAL)/g' \
@@ -10693,7 +13386,7 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_SYS_TIMES_H''@|$(NEXT_SYS_TIMES_H)|g' \
-	      -e 's/@''GNULIB_TIMES''@/$(GNULIB_TIMES)/g' \
+	      -e 's/@''GNULIB_TIMES''@/$(GL_GNULIB_TIMES)/g' \
 	      -e 's|@''HAVE_STRUCT_TMS''@|$(HAVE_STRUCT_TMS)|g' \
 	      -e 's|@''HAVE_TIMES''@|$(HAVE_TIMES)|g' \
 	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
@@ -10730,13 +13423,32 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_SYS_WAIT_H''@|$(NEXT_SYS_WAIT_H)|g' \
-	      -e 's/@''GNULIB_WAITPID''@/$(GNULIB_WAITPID)/g' \
+	      -e 's/@''GNULIB_WAITPID''@/$(GL_GNULIB_WAITPID)/g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
 	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
 	      < $(top_srcdir)/lib/sys_wait.in.h; \
 	} > $@-t && \
 	mv $@-t $@
 
+# We need the following in order to create <termios.h> when the system
+# version does not have all declarations.
+lib/termios.h: lib/termios.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_TERMIOS_H''@|$(NEXT_TERMIOS_H)|g' \
+	      -e 's/@''GNULIB_TCGETSID''@/$(GL_GNULIB_TCGETSID)/g' \
+	      -e 's|@''HAVE_DECL_TCGETSID''@|$(HAVE_DECL_TCGETSID)|g' \
+	      -e 's|@''HAVE_TERMIOS_H''@|$(HAVE_TERMIOS_H)|g' \
+	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+	    < $(top_srcdir)/lib/termios.in.h; \
+	} > $@-t && \
+	mv $@-t $@
+
 # We need the following in order to create <time.h> when the system
 # doesn't have one that works with the given compiler.
 lib/time.h: lib/time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
@@ -10747,22 +13459,24 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_TIME_H''@|$(NEXT_TIME_H)|g' \
-	      -e 's/@''GNULIB_CTIME''@/$(GNULIB_CTIME)/g' \
-	      -e 's/@''GNULIB_LOCALTIME''@/$(GNULIB_LOCALTIME)/g' \
-	      -e 's/@''GNULIB_MKTIME''@/$(GNULIB_MKTIME)/g' \
-	      -e 's/@''GNULIB_NANOSLEEP''@/$(GNULIB_NANOSLEEP)/g' \
-	      -e 's/@''GNULIB_STRFTIME''@/$(GNULIB_STRFTIME)/g' \
-	      -e 's/@''GNULIB_STRPTIME''@/$(GNULIB_STRPTIME)/g' \
-	      -e 's/@''GNULIB_TIMEGM''@/$(GNULIB_TIMEGM)/g' \
-	      -e 's/@''GNULIB_TIME_R''@/$(GNULIB_TIME_R)/g' \
-	      -e 's/@''GNULIB_TIME_RZ''@/$(GNULIB_TIME_RZ)/g' \
-	      -e 's/@''GNULIB_TZSET''@/$(GNULIB_TZSET)/g' \
+	      -e 's/@''GNULIB_CTIME''@/$(GL_GNULIB_CTIME)/g' \
+	      -e 's/@''GNULIB_LOCALTIME''@/$(GL_GNULIB_LOCALTIME)/g' \
+	      -e 's/@''GNULIB_MKTIME''@/$(GL_GNULIB_MKTIME)/g' \
+	      -e 's/@''GNULIB_NANOSLEEP''@/$(GL_GNULIB_NANOSLEEP)/g' \
+	      -e 's/@''GNULIB_STRFTIME''@/$(GL_GNULIB_STRFTIME)/g' \
+	      -e 's/@''GNULIB_STRPTIME''@/$(GL_GNULIB_STRPTIME)/g' \
+	      -e 's/@''GNULIB_TIMEGM''@/$(GL_GNULIB_TIMEGM)/g' \
+	      -e 's/@''GNULIB_TIMESPEC_GET''@/$(GL_GNULIB_TIMESPEC_GET)/g' \
+	      -e 's/@''GNULIB_TIME_R''@/$(GL_GNULIB_TIME_R)/g' \
+	      -e 's/@''GNULIB_TIME_RZ''@/$(GL_GNULIB_TIME_RZ)/g' \
+	      -e 's/@''GNULIB_TZSET''@/$(GL_GNULIB_TZSET)/g' \
+	      -e 's/@''GNULIB_MDA_TZSET''@/$(GL_GNULIB_MDA_TZSET)/g' \
 	      -e 's|@''HAVE_DECL_LOCALTIME_R''@|$(HAVE_DECL_LOCALTIME_R)|g' \
 	      -e 's|@''HAVE_NANOSLEEP''@|$(HAVE_NANOSLEEP)|g' \
 	      -e 's|@''HAVE_STRPTIME''@|$(HAVE_STRPTIME)|g' \
 	      -e 's|@''HAVE_TIMEGM''@|$(HAVE_TIMEGM)|g' \
+	      -e 's|@''HAVE_TIMESPEC_GET''@|$(HAVE_TIMESPEC_GET)|g' \
 	      -e 's|@''HAVE_TIMEZONE_T''@|$(HAVE_TIMEZONE_T)|g' \
-	      -e 's|@''HAVE_TZSET''@|$(HAVE_TZSET)|g' \
 	      -e 's|@''REPLACE_CTIME''@|$(REPLACE_CTIME)|g' \
 	      -e 's|@''REPLACE_GMTIME''@|$(REPLACE_GMTIME)|g' \
 	      -e 's|@''REPLACE_LOCALTIME''@|$(REPLACE_LOCALTIME)|g' \
@@ -10776,6 +13490,7 @@
 	      -e 's|@''SYS_TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(SYS_TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \
 	      -e 's|@''TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \
 	      -e 's|@''UNISTD_H_DEFINES_STRUCT_TIMESPEC''@|$(UNISTD_H_DEFINES_STRUCT_TIMESPEC)|g' \
+	      -e 's|@''TIME_H_DEFINES_TIME_UTC''@|$(TIME_H_DEFINES_TIME_UTC)|g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
 	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
 	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
@@ -10795,65 +13510,95 @@
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \
 	      -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \
-	      -e 's/@''GNULIB_ACCESS''@/$(GNULIB_ACCESS)/g' \
-	      -e 's/@''GNULIB_CHDIR''@/$(GNULIB_CHDIR)/g' \
-	      -e 's/@''GNULIB_CHOWN''@/$(GNULIB_CHOWN)/g' \
-	      -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \
-	      -e 's/@''GNULIB_COPY_FILE_RANGE''@/$(GNULIB_COPY_FILE_RANGE)/g' \
-	      -e 's/@''GNULIB_DUP''@/$(GNULIB_DUP)/g' \
-	      -e 's/@''GNULIB_DUP2''@/$(GNULIB_DUP2)/g' \
-	      -e 's/@''GNULIB_DUP3''@/$(GNULIB_DUP3)/g' \
-	      -e 's/@''GNULIB_ENVIRON''@/$(GNULIB_ENVIRON)/g' \
-	      -e 's/@''GNULIB_EUIDACCESS''@/$(GNULIB_EUIDACCESS)/g' \
-	      -e 's/@''GNULIB_FACCESSAT''@/$(GNULIB_FACCESSAT)/g' \
-	      -e 's/@''GNULIB_FCHDIR''@/$(GNULIB_FCHDIR)/g' \
-	      -e 's/@''GNULIB_FCHOWNAT''@/$(GNULIB_FCHOWNAT)/g' \
-	      -e 's/@''GNULIB_FDATASYNC''@/$(GNULIB_FDATASYNC)/g' \
-	      -e 's/@''GNULIB_FSYNC''@/$(GNULIB_FSYNC)/g' \
-	      -e 's/@''GNULIB_FTRUNCATE''@/$(GNULIB_FTRUNCATE)/g' \
-	      -e 's/@''GNULIB_GETCWD''@/$(GNULIB_GETCWD)/g' \
-	      -e 's/@''GNULIB_GETDOMAINNAME''@/$(GNULIB_GETDOMAINNAME)/g' \
-	      -e 's/@''GNULIB_GETDTABLESIZE''@/$(GNULIB_GETDTABLESIZE)/g' \
-	      -e 's/@''GNULIB_GETGROUPS''@/$(GNULIB_GETGROUPS)/g' \
-	      -e 's/@''GNULIB_GETHOSTNAME''@/$(GNULIB_GETHOSTNAME)/g' \
-	      -e 's/@''GNULIB_GETLOGIN''@/$(GNULIB_GETLOGIN)/g' \
-	      -e 's/@''GNULIB_GETLOGIN_R''@/$(GNULIB_GETLOGIN_R)/g' \
-	      -e 's/@''GNULIB_GETPAGESIZE''@/$(GNULIB_GETPAGESIZE)/g' \
-	      -e 's/@''GNULIB_GETPASS''@/$(GNULIB_GETPASS)/g' \
-	      -e 's/@''GNULIB_GETUSERSHELL''@/$(GNULIB_GETUSERSHELL)/g' \
-	      -e 's/@''GNULIB_GROUP_MEMBER''@/$(GNULIB_GROUP_MEMBER)/g' \
-	      -e 's/@''GNULIB_ISATTY''@/$(GNULIB_ISATTY)/g' \
-	      -e 's/@''GNULIB_LCHOWN''@/$(GNULIB_LCHOWN)/g' \
-	      -e 's/@''GNULIB_LINK''@/$(GNULIB_LINK)/g' \
-	      -e 's/@''GNULIB_LINKAT''@/$(GNULIB_LINKAT)/g' \
-	      -e 's/@''GNULIB_LSEEK''@/$(GNULIB_LSEEK)/g' \
-	      -e 's/@''GNULIB_PIPE''@/$(GNULIB_PIPE)/g' \
-	      -e 's/@''GNULIB_PIPE2''@/$(GNULIB_PIPE2)/g' \
-	      -e 's/@''GNULIB_PREAD''@/$(GNULIB_PREAD)/g' \
-	      -e 's/@''GNULIB_PWRITE''@/$(GNULIB_PWRITE)/g' \
-	      -e 's/@''GNULIB_READ''@/$(GNULIB_READ)/g' \
-	      -e 's/@''GNULIB_READLINK''@/$(GNULIB_READLINK)/g' \
-	      -e 's/@''GNULIB_READLINKAT''@/$(GNULIB_READLINKAT)/g' \
-	      -e 's/@''GNULIB_RMDIR''@/$(GNULIB_RMDIR)/g' \
-	      -e 's/@''GNULIB_SETHOSTNAME''@/$(GNULIB_SETHOSTNAME)/g' \
-	      -e 's/@''GNULIB_SLEEP''@/$(GNULIB_SLEEP)/g' \
-	      -e 's/@''GNULIB_SYMLINK''@/$(GNULIB_SYMLINK)/g' \
-	      -e 's/@''GNULIB_SYMLINKAT''@/$(GNULIB_SYMLINKAT)/g' \
-	      -e 's/@''GNULIB_TRUNCATE''@/$(GNULIB_TRUNCATE)/g' \
-	      -e 's/@''GNULIB_TTYNAME_R''@/$(GNULIB_TTYNAME_R)/g' \
-	      -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GNULIB_GL_UNISTD_H_GETOPT)/g' \
-	      -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GNULIB_UNISTD_H_NONBLOCKING)/g' \
-	      -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GNULIB_UNISTD_H_SIGPIPE)/g' \
-	      -e 's/@''GNULIB_UNLINK''@/$(GNULIB_UNLINK)/g' \
-	      -e 's/@''GNULIB_UNLINKAT''@/$(GNULIB_UNLINKAT)/g' \
-	      -e 's/@''GNULIB_USLEEP''@/$(GNULIB_USLEEP)/g' \
-	      -e 's/@''GNULIB_WRITE''@/$(GNULIB_WRITE)/g' \
+	      -e 's/@''GNULIB_ACCESS''@/$(GL_GNULIB_ACCESS)/g' \
+	      -e 's/@''GNULIB_CHDIR''@/$(GL_GNULIB_CHDIR)/g' \
+	      -e 's/@''GNULIB_CHOWN''@/$(GL_GNULIB_CHOWN)/g' \
+	      -e 's/@''GNULIB_CLOSE''@/$(GL_GNULIB_CLOSE)/g' \
+	      -e 's/@''GNULIB_COPY_FILE_RANGE''@/$(GL_GNULIB_COPY_FILE_RANGE)/g' \
+	      -e 's/@''GNULIB_DUP''@/$(GL_GNULIB_DUP)/g' \
+	      -e 's/@''GNULIB_DUP2''@/$(GL_GNULIB_DUP2)/g' \
+	      -e 's/@''GNULIB_DUP3''@/$(GL_GNULIB_DUP3)/g' \
+	      -e 's/@''GNULIB_ENVIRON''@/$(GL_GNULIB_ENVIRON)/g' \
+	      -e 's/@''GNULIB_EUIDACCESS''@/$(GL_GNULIB_EUIDACCESS)/g' \
+	      -e 's/@''GNULIB_EXECL''@/$(GL_GNULIB_EXECL)/g' \
+	      -e 's/@''GNULIB_EXECLE''@/$(GL_GNULIB_EXECLE)/g' \
+	      -e 's/@''GNULIB_EXECLP''@/$(GL_GNULIB_EXECLP)/g' \
+	      -e 's/@''GNULIB_EXECV''@/$(GL_GNULIB_EXECV)/g' \
+	      -e 's/@''GNULIB_EXECVE''@/$(GL_GNULIB_EXECVE)/g' \
+	      -e 's/@''GNULIB_EXECVP''@/$(GL_GNULIB_EXECVP)/g' \
+	      -e 's/@''GNULIB_EXECVPE''@/$(GL_GNULIB_EXECVPE)/g' \
+	      -e 's/@''GNULIB_FACCESSAT''@/$(GL_GNULIB_FACCESSAT)/g' \
+	      -e 's/@''GNULIB_FCHDIR''@/$(GL_GNULIB_FCHDIR)/g' \
+	      -e 's/@''GNULIB_FCHOWNAT''@/$(GL_GNULIB_FCHOWNAT)/g' \
+	      -e 's/@''GNULIB_FDATASYNC''@/$(GL_GNULIB_FDATASYNC)/g' \
+	      -e 's/@''GNULIB_FSYNC''@/$(GL_GNULIB_FSYNC)/g' \
+	      -e 's/@''GNULIB_FTRUNCATE''@/$(GL_GNULIB_FTRUNCATE)/g' \
+	      -e 's/@''GNULIB_GETCWD''@/$(GL_GNULIB_GETCWD)/g' \
+	      -e 's/@''GNULIB_GETDOMAINNAME''@/$(GL_GNULIB_GETDOMAINNAME)/g' \
+	      -e 's/@''GNULIB_GETDTABLESIZE''@/$(GL_GNULIB_GETDTABLESIZE)/g' \
+	      -e 's/@''GNULIB_GETENTROPY''@/$(GL_GNULIB_GETENTROPY)/g' \
+	      -e 's/@''GNULIB_GETGROUPS''@/$(GL_GNULIB_GETGROUPS)/g' \
+	      -e 's/@''GNULIB_GETHOSTNAME''@/$(GL_GNULIB_GETHOSTNAME)/g' \
+	      -e 's/@''GNULIB_GETLOGIN''@/$(GL_GNULIB_GETLOGIN)/g' \
+	      -e 's/@''GNULIB_GETLOGIN_R''@/$(GL_GNULIB_GETLOGIN_R)/g' \
+	      -e 's/@''GNULIB_GETOPT_POSIX''@/$(GL_GNULIB_GETOPT_POSIX)/g' \
+	      -e 's/@''GNULIB_GETPAGESIZE''@/$(GL_GNULIB_GETPAGESIZE)/g' \
+	      -e 's/@''GNULIB_GETPASS''@/$(GL_GNULIB_GETPASS)/g' \
+	      -e 's/@''GNULIB_GETUSERSHELL''@/$(GL_GNULIB_GETUSERSHELL)/g' \
+	      -e 's/@''GNULIB_GROUP_MEMBER''@/$(GL_GNULIB_GROUP_MEMBER)/g' \
+	      -e 's/@''GNULIB_ISATTY''@/$(GL_GNULIB_ISATTY)/g' \
+	      -e 's/@''GNULIB_LCHOWN''@/$(GL_GNULIB_LCHOWN)/g' \
+	      -e 's/@''GNULIB_LINK''@/$(GL_GNULIB_LINK)/g' \
+	      -e 's/@''GNULIB_LINKAT''@/$(GL_GNULIB_LINKAT)/g' \
+	      -e 's/@''GNULIB_LSEEK''@/$(GL_GNULIB_LSEEK)/g' \
+	      -e 's/@''GNULIB_PIPE''@/$(GL_GNULIB_PIPE)/g' \
+	      -e 's/@''GNULIB_PIPE2''@/$(GL_GNULIB_PIPE2)/g' \
+	      -e 's/@''GNULIB_PREAD''@/$(GL_GNULIB_PREAD)/g' \
+	      -e 's/@''GNULIB_PWRITE''@/$(GL_GNULIB_PWRITE)/g' \
+	      -e 's/@''GNULIB_READ''@/$(GL_GNULIB_READ)/g' \
+	      -e 's/@''GNULIB_READLINK''@/$(GL_GNULIB_READLINK)/g' \
+	      -e 's/@''GNULIB_READLINKAT''@/$(GL_GNULIB_READLINKAT)/g' \
+	      -e 's/@''GNULIB_RMDIR''@/$(GL_GNULIB_RMDIR)/g' \
+	      -e 's/@''GNULIB_SETHOSTNAME''@/$(GL_GNULIB_SETHOSTNAME)/g' \
+	      -e 's/@''GNULIB_SLEEP''@/$(GL_GNULIB_SLEEP)/g' \
+	      -e 's/@''GNULIB_SYMLINK''@/$(GL_GNULIB_SYMLINK)/g' \
+	      -e 's/@''GNULIB_SYMLINKAT''@/$(GL_GNULIB_SYMLINKAT)/g' \
+	      -e 's/@''GNULIB_TRUNCATE''@/$(GL_GNULIB_TRUNCATE)/g' \
+	      -e 's/@''GNULIB_TTYNAME_R''@/$(GL_GNULIB_TTYNAME_R)/g' \
+	      -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GL_GNULIB_UNISTD_H_GETOPT)/g' \
+	      -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GL_GNULIB_UNISTD_H_NONBLOCKING)/g' \
+	      -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GL_GNULIB_UNISTD_H_SIGPIPE)/g' \
+	      -e 's/@''GNULIB_UNLINK''@/$(GL_GNULIB_UNLINK)/g' \
+	      -e 's/@''GNULIB_UNLINKAT''@/$(GL_GNULIB_UNLINKAT)/g' \
+	      -e 's/@''GNULIB_USLEEP''@/$(GL_GNULIB_USLEEP)/g' \
+	      -e 's/@''GNULIB_WRITE''@/$(GL_GNULIB_WRITE)/g' \
+	      -e 's/@''GNULIB_MDA_ACCESS''@/$(GL_GNULIB_MDA_ACCESS)/g' \
+	      -e 's/@''GNULIB_MDA_CHDIR''@/$(GL_GNULIB_MDA_CHDIR)/g' \
+	      -e 's/@''GNULIB_MDA_CLOSE''@/$(GL_GNULIB_MDA_CLOSE)/g' \
+	      -e 's/@''GNULIB_MDA_DUP''@/$(GL_GNULIB_MDA_DUP)/g' \
+	      -e 's/@''GNULIB_MDA_DUP2''@/$(GL_GNULIB_MDA_DUP2)/g' \
+	      -e 's/@''GNULIB_MDA_EXECL''@/$(GL_GNULIB_MDA_EXECL)/g' \
+	      -e 's/@''GNULIB_MDA_EXECLE''@/$(GL_GNULIB_MDA_EXECLE)/g' \
+	      -e 's/@''GNULIB_MDA_EXECLP''@/$(GL_GNULIB_MDA_EXECLP)/g' \
+	      -e 's/@''GNULIB_MDA_EXECV''@/$(GL_GNULIB_MDA_EXECV)/g' \
+	      -e 's/@''GNULIB_MDA_EXECVE''@/$(GL_GNULIB_MDA_EXECVE)/g' \
+	      -e 's/@''GNULIB_MDA_EXECVP''@/$(GL_GNULIB_MDA_EXECVP)/g' \
+	      -e 's/@''GNULIB_MDA_EXECVPE''@/$(GL_GNULIB_MDA_EXECVPE)/g' \
+	      -e 's/@''GNULIB_MDA_GETCWD''@/$(GL_GNULIB_MDA_GETCWD)/g' \
+	      -e 's/@''GNULIB_MDA_GETPID''@/$(GL_GNULIB_MDA_GETPID)/g' \
+	      -e 's/@''GNULIB_MDA_ISATTY''@/$(GL_GNULIB_MDA_ISATTY)/g' \
+	      -e 's/@''GNULIB_MDA_LSEEK''@/$(GL_GNULIB_MDA_LSEEK)/g' \
+	      -e 's/@''GNULIB_MDA_READ''@/$(GL_GNULIB_MDA_READ)/g' \
+	      -e 's/@''GNULIB_MDA_RMDIR''@/$(GL_GNULIB_MDA_RMDIR)/g' \
+	      -e 's/@''GNULIB_MDA_SWAB''@/$(GL_GNULIB_MDA_SWAB)/g' \
+	      -e 's/@''GNULIB_MDA_UNLINK''@/$(GL_GNULIB_MDA_UNLINK)/g' \
+	      -e 's/@''GNULIB_MDA_WRITE''@/$(GL_GNULIB_MDA_WRITE)/g' \
 	      < $(top_srcdir)/lib/unistd.in.h | \
 	  sed -e 's|@''HAVE_CHOWN''@|$(HAVE_CHOWN)|g' \
 	      -e 's|@''HAVE_COPY_FILE_RANGE''@|$(HAVE_COPY_FILE_RANGE)|g' \
-	      -e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \
 	      -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \
 	      -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \
+	      -e 's|@''HAVE_EXECVPE''@|$(HAVE_EXECVPE)|g' \
 	      -e 's|@''HAVE_FACCESSAT''@|$(HAVE_FACCESSAT)|g' \
 	      -e 's|@''HAVE_FCHDIR''@|$(HAVE_FCHDIR)|g' \
 	      -e 's|@''HAVE_FCHOWNAT''@|$(HAVE_FCHOWNAT)|g' \
@@ -10861,6 +13606,7 @@
 	      -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \
 	      -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \
 	      -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \
+	      -e 's|@''HAVE_GETENTROPY''@|$(HAVE_GETENTROPY)|g' \
 	      -e 's|@''HAVE_GETGROUPS''@|$(HAVE_GETGROUPS)|g' \
 	      -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \
 	      -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \
@@ -10882,6 +13628,7 @@
 	      -e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \
 	      -e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \
 	      -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \
+	      -e 's|@''HAVE_DECL_EXECVPE''@|$(HAVE_DECL_EXECVPE)|g' \
 	      -e 's|@''HAVE_DECL_FCHDIR''@|$(HAVE_DECL_FCHDIR)|g' \
 	      -e 's|@''HAVE_DECL_FDATASYNC''@|$(HAVE_DECL_FDATASYNC)|g' \
 	      -e 's|@''HAVE_DECL_GETDOMAINNAME''@|$(HAVE_DECL_GETDOMAINNAME)|g' \
@@ -10900,6 +13647,13 @@
 	      -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \
 	      -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \
 	      -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \
+	      -e 's|@''REPLACE_EXECL''@|$(REPLACE_EXECL)|g' \
+	      -e 's|@''REPLACE_EXECLE''@|$(REPLACE_EXECLE)|g' \
+	      -e 's|@''REPLACE_EXECLP''@|$(REPLACE_EXECLP)|g' \
+	      -e 's|@''REPLACE_EXECV''@|$(REPLACE_EXECV)|g' \
+	      -e 's|@''REPLACE_EXECVE''@|$(REPLACE_EXECVE)|g' \
+	      -e 's|@''REPLACE_EXECVP''@|$(REPLACE_EXECVP)|g' \
+	      -e 's|@''REPLACE_EXECVPE''@|$(REPLACE_EXECVPE)|g' \
 	      -e 's|@''REPLACE_FACCESSAT''@|$(REPLACE_FACCESSAT)|g' \
 	      -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \
 	      -e 's|@''REPLACE_FTRUNCATE''@|$(REPLACE_FTRUNCATE)|g' \
@@ -10930,6 +13684,7 @@
 	      -e 's|@''REPLACE_UNLINKAT''@|$(REPLACE_UNLINKAT)|g' \
 	      -e 's|@''REPLACE_USLEEP''@|$(REPLACE_USLEEP)|g' \
 	      -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \
+	      -e 's|@''UNISTD_H_HAVE_SYS_RANDOM_H''@|$(UNISTD_H_HAVE_SYS_RANDOM_H)|g' \
 	      -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \
 	      -e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
@@ -10938,6 +13693,13 @@
 	} > $@-t && \
 	mv $@-t $@
 
+lib/unistr.h: lib/unistr.in.h
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  cat $(top_srcdir)/lib/unistr.in.h; \
+	} > $@-t && \
+	mv -f $@-t $@
+
 lib/unitypes.h: lib/unitypes.in.h
 	$(AM_V_GEN)rm -f $@-t $@ && \
 	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
@@ -10965,47 +13727,49 @@
 	      -e 's|@''NEXT_WCHAR_H''@|$(NEXT_WCHAR_H)|g' \
 	      -e 's|@''HAVE_WCHAR_H''@|$(HAVE_WCHAR_H)|g' \
 	      -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \
-	      -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \
-	      -e 's/@''GNULIB_BTOWC''@/$(GNULIB_BTOWC)/g' \
-	      -e 's/@''GNULIB_WCTOB''@/$(GNULIB_WCTOB)/g' \
-	      -e 's/@''GNULIB_MBSINIT''@/$(GNULIB_MBSINIT)/g' \
-	      -e 's/@''GNULIB_MBRTOWC''@/$(GNULIB_MBRTOWC)/g' \
-	      -e 's/@''GNULIB_MBRLEN''@/$(GNULIB_MBRLEN)/g' \
-	      -e 's/@''GNULIB_MBSRTOWCS''@/$(GNULIB_MBSRTOWCS)/g' \
-	      -e 's/@''GNULIB_MBSNRTOWCS''@/$(GNULIB_MBSNRTOWCS)/g' \
-	      -e 's/@''GNULIB_WCRTOMB''@/$(GNULIB_WCRTOMB)/g' \
-	      -e 's/@''GNULIB_WCSRTOMBS''@/$(GNULIB_WCSRTOMBS)/g' \
-	      -e 's/@''GNULIB_WCSNRTOMBS''@/$(GNULIB_WCSNRTOMBS)/g' \
-	      -e 's/@''GNULIB_WCWIDTH''@/$(GNULIB_WCWIDTH)/g' \
-	      -e 's/@''GNULIB_WMEMCHR''@/$(GNULIB_WMEMCHR)/g' \
-	      -e 's/@''GNULIB_WMEMCMP''@/$(GNULIB_WMEMCMP)/g' \
-	      -e 's/@''GNULIB_WMEMCPY''@/$(GNULIB_WMEMCPY)/g' \
-	      -e 's/@''GNULIB_WMEMMOVE''@/$(GNULIB_WMEMMOVE)/g' \
-	      -e 's/@''GNULIB_WMEMSET''@/$(GNULIB_WMEMSET)/g' \
-	      -e 's/@''GNULIB_WCSLEN''@/$(GNULIB_WCSLEN)/g' \
-	      -e 's/@''GNULIB_WCSNLEN''@/$(GNULIB_WCSNLEN)/g' \
-	      -e 's/@''GNULIB_WCSCPY''@/$(GNULIB_WCSCPY)/g' \
-	      -e 's/@''GNULIB_WCPCPY''@/$(GNULIB_WCPCPY)/g' \
-	      -e 's/@''GNULIB_WCSNCPY''@/$(GNULIB_WCSNCPY)/g' \
-	      -e 's/@''GNULIB_WCPNCPY''@/$(GNULIB_WCPNCPY)/g' \
-	      -e 's/@''GNULIB_WCSCAT''@/$(GNULIB_WCSCAT)/g' \
-	      -e 's/@''GNULIB_WCSNCAT''@/$(GNULIB_WCSNCAT)/g' \
-	      -e 's/@''GNULIB_WCSCMP''@/$(GNULIB_WCSCMP)/g' \
-	      -e 's/@''GNULIB_WCSNCMP''@/$(GNULIB_WCSNCMP)/g' \
-	      -e 's/@''GNULIB_WCSCASECMP''@/$(GNULIB_WCSCASECMP)/g' \
-	      -e 's/@''GNULIB_WCSNCASECMP''@/$(GNULIB_WCSNCASECMP)/g' \
-	      -e 's/@''GNULIB_WCSCOLL''@/$(GNULIB_WCSCOLL)/g' \
-	      -e 's/@''GNULIB_WCSXFRM''@/$(GNULIB_WCSXFRM)/g' \
-	      -e 's/@''GNULIB_WCSDUP''@/$(GNULIB_WCSDUP)/g' \
-	      -e 's/@''GNULIB_WCSCHR''@/$(GNULIB_WCSCHR)/g' \
-	      -e 's/@''GNULIB_WCSRCHR''@/$(GNULIB_WCSRCHR)/g' \
-	      -e 's/@''GNULIB_WCSCSPN''@/$(GNULIB_WCSCSPN)/g' \
-	      -e 's/@''GNULIB_WCSSPN''@/$(GNULIB_WCSSPN)/g' \
-	      -e 's/@''GNULIB_WCSPBRK''@/$(GNULIB_WCSPBRK)/g' \
-	      -e 's/@''GNULIB_WCSSTR''@/$(GNULIB_WCSSTR)/g' \
-	      -e 's/@''GNULIB_WCSTOK''@/$(GNULIB_WCSTOK)/g' \
-	      -e 's/@''GNULIB_WCSWIDTH''@/$(GNULIB_WCSWIDTH)/g' \
-	      -e 's/@''GNULIB_WCSFTIME''@/$(GNULIB_WCSFTIME)/g' \
+	      -e 's/@''GNULIBHEADERS_OVERRIDE_WINT_T''@/$(GNULIBHEADERS_OVERRIDE_WINT_T)/g' \
+	      -e 's/@''GNULIB_BTOWC''@/$(GL_GNULIB_BTOWC)/g' \
+	      -e 's/@''GNULIB_WCTOB''@/$(GL_GNULIB_WCTOB)/g' \
+	      -e 's/@''GNULIB_MBSINIT''@/$(GL_GNULIB_MBSINIT)/g' \
+	      -e 's/@''GNULIB_MBRTOWC''@/$(GL_GNULIB_MBRTOWC)/g' \
+	      -e 's/@''GNULIB_MBRLEN''@/$(GL_GNULIB_MBRLEN)/g' \
+	      -e 's/@''GNULIB_MBSRTOWCS''@/$(GL_GNULIB_MBSRTOWCS)/g' \
+	      -e 's/@''GNULIB_MBSNRTOWCS''@/$(GL_GNULIB_MBSNRTOWCS)/g' \
+	      -e 's/@''GNULIB_WCRTOMB''@/$(GL_GNULIB_WCRTOMB)/g' \
+	      -e 's/@''GNULIB_WCSRTOMBS''@/$(GL_GNULIB_WCSRTOMBS)/g' \
+	      -e 's/@''GNULIB_WCSNRTOMBS''@/$(GL_GNULIB_WCSNRTOMBS)/g' \
+	      -e 's/@''GNULIB_WCWIDTH''@/$(GL_GNULIB_WCWIDTH)/g' \
+	      -e 's/@''GNULIB_WMEMCHR''@/$(GL_GNULIB_WMEMCHR)/g' \
+	      -e 's/@''GNULIB_WMEMCMP''@/$(GL_GNULIB_WMEMCMP)/g' \
+	      -e 's/@''GNULIB_WMEMCPY''@/$(GL_GNULIB_WMEMCPY)/g' \
+	      -e 's/@''GNULIB_WMEMMOVE''@/$(GL_GNULIB_WMEMMOVE)/g' \
+	      -e 's/@''GNULIB_WMEMPCPY''@/$(GL_GNULIB_WMEMPCPY)/g' \
+	      -e 's/@''GNULIB_WMEMSET''@/$(GL_GNULIB_WMEMSET)/g' \
+	      -e 's/@''GNULIB_WCSLEN''@/$(GL_GNULIB_WCSLEN)/g' \
+	      -e 's/@''GNULIB_WCSNLEN''@/$(GL_GNULIB_WCSNLEN)/g' \
+	      -e 's/@''GNULIB_WCSCPY''@/$(GL_GNULIB_WCSCPY)/g' \
+	      -e 's/@''GNULIB_WCPCPY''@/$(GL_GNULIB_WCPCPY)/g' \
+	      -e 's/@''GNULIB_WCSNCPY''@/$(GL_GNULIB_WCSNCPY)/g' \
+	      -e 's/@''GNULIB_WCPNCPY''@/$(GL_GNULIB_WCPNCPY)/g' \
+	      -e 's/@''GNULIB_WCSCAT''@/$(GL_GNULIB_WCSCAT)/g' \
+	      -e 's/@''GNULIB_WCSNCAT''@/$(GL_GNULIB_WCSNCAT)/g' \
+	      -e 's/@''GNULIB_WCSCMP''@/$(GL_GNULIB_WCSCMP)/g' \
+	      -e 's/@''GNULIB_WCSNCMP''@/$(GL_GNULIB_WCSNCMP)/g' \
+	      -e 's/@''GNULIB_WCSCASECMP''@/$(GL_GNULIB_WCSCASECMP)/g' \
+	      -e 's/@''GNULIB_WCSNCASECMP''@/$(GL_GNULIB_WCSNCASECMP)/g' \
+	      -e 's/@''GNULIB_WCSCOLL''@/$(GL_GNULIB_WCSCOLL)/g' \
+	      -e 's/@''GNULIB_WCSXFRM''@/$(GL_GNULIB_WCSXFRM)/g' \
+	      -e 's/@''GNULIB_WCSDUP''@/$(GL_GNULIB_WCSDUP)/g' \
+	      -e 's/@''GNULIB_WCSCHR''@/$(GL_GNULIB_WCSCHR)/g' \
+	      -e 's/@''GNULIB_WCSRCHR''@/$(GL_GNULIB_WCSRCHR)/g' \
+	      -e 's/@''GNULIB_WCSCSPN''@/$(GL_GNULIB_WCSCSPN)/g' \
+	      -e 's/@''GNULIB_WCSSPN''@/$(GL_GNULIB_WCSSPN)/g' \
+	      -e 's/@''GNULIB_WCSPBRK''@/$(GL_GNULIB_WCSPBRK)/g' \
+	      -e 's/@''GNULIB_WCSSTR''@/$(GL_GNULIB_WCSSTR)/g' \
+	      -e 's/@''GNULIB_WCSTOK''@/$(GL_GNULIB_WCSTOK)/g' \
+	      -e 's/@''GNULIB_WCSWIDTH''@/$(GL_GNULIB_WCSWIDTH)/g' \
+	      -e 's/@''GNULIB_WCSFTIME''@/$(GL_GNULIB_WCSFTIME)/g' \
+	      -e 's/@''GNULIB_MDA_WCSDUP''@/$(GL_GNULIB_MDA_WCSDUP)/g' \
 	      < $(top_srcdir)/lib/wchar.in.h | \
 	  sed -e 's|@''HAVE_WINT_T''@|$(HAVE_WINT_T)|g' \
 	      -e 's|@''HAVE_BTOWC''@|$(HAVE_BTOWC)|g' \
@@ -11021,6 +13785,7 @@
 	      -e 's|@''HAVE_WMEMCMP''@|$(HAVE_WMEMCMP)|g' \
 	      -e 's|@''HAVE_WMEMCPY''@|$(HAVE_WMEMCPY)|g' \
 	      -e 's|@''HAVE_WMEMMOVE''@|$(HAVE_WMEMMOVE)|g' \
+	      -e 's|@''HAVE_WMEMPCPY''@|$(HAVE_WMEMPCPY)|g' \
 	      -e 's|@''HAVE_WMEMSET''@|$(HAVE_WMEMSET)|g' \
 	      -e 's|@''HAVE_WCSLEN''@|$(HAVE_WCSLEN)|g' \
 	      -e 's|@''HAVE_WCSNLEN''@|$(HAVE_WCSNLEN)|g' \
@@ -11047,11 +13812,13 @@
 	      -e 's|@''HAVE_WCSWIDTH''@|$(HAVE_WCSWIDTH)|g' \
 	      -e 's|@''HAVE_WCSFTIME''@|$(HAVE_WCSFTIME)|g' \
 	      -e 's|@''HAVE_DECL_WCTOB''@|$(HAVE_DECL_WCTOB)|g' \
+	      -e 's|@''HAVE_DECL_WCSDUP''@|$(HAVE_DECL_WCSDUP)|g' \
 	      -e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \
 	  | \
 	  sed -e 's|@''REPLACE_MBSTATE_T''@|$(REPLACE_MBSTATE_T)|g' \
 	      -e 's|@''REPLACE_BTOWC''@|$(REPLACE_BTOWC)|g' \
 	      -e 's|@''REPLACE_WCTOB''@|$(REPLACE_WCTOB)|g' \
+	      -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \
 	      -e 's|@''REPLACE_MBSINIT''@|$(REPLACE_MBSINIT)|g' \
 	      -e 's|@''REPLACE_MBRTOWC''@|$(REPLACE_MBRTOWC)|g' \
 	      -e 's|@''REPLACE_MBRLEN''@|$(REPLACE_MBRLEN)|g' \
@@ -11082,18 +13849,22 @@
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_WCTYPE_H''@|$(NEXT_WCTYPE_H)|g' \
 	      -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \
-	      -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \
-	      -e 's/@''GNULIB_ISWBLANK''@/$(GNULIB_ISWBLANK)/g' \
-	      -e 's/@''GNULIB_WCTYPE''@/$(GNULIB_WCTYPE)/g' \
-	      -e 's/@''GNULIB_ISWCTYPE''@/$(GNULIB_ISWCTYPE)/g' \
-	      -e 's/@''GNULIB_WCTRANS''@/$(GNULIB_WCTRANS)/g' \
-	      -e 's/@''GNULIB_TOWCTRANS''@/$(GNULIB_TOWCTRANS)/g' \
+	      -e 's/@''GNULIBHEADERS_OVERRIDE_WINT_T''@/$(GNULIBHEADERS_OVERRIDE_WINT_T)/g' \
+	      -e 's/@''GNULIB_ISWBLANK''@/$(GL_GNULIB_ISWBLANK)/g' \
+	      -e 's/@''GNULIB_ISWDIGIT''@/$(GL_GNULIB_ISWDIGIT)/g' \
+	      -e 's/@''GNULIB_ISWXDIGIT''@/$(GL_GNULIB_ISWXDIGIT)/g' \
+	      -e 's/@''GNULIB_WCTYPE''@/$(GL_GNULIB_WCTYPE)/g' \
+	      -e 's/@''GNULIB_ISWCTYPE''@/$(GL_GNULIB_ISWCTYPE)/g' \
+	      -e 's/@''GNULIB_WCTRANS''@/$(GL_GNULIB_WCTRANS)/g' \
+	      -e 's/@''GNULIB_TOWCTRANS''@/$(GL_GNULIB_TOWCTRANS)/g' \
 	      -e 's/@''HAVE_ISWBLANK''@/$(HAVE_ISWBLANK)/g' \
 	      -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \
 	      -e 's/@''HAVE_WCTYPE_T''@/$(HAVE_WCTYPE_T)/g' \
 	      -e 's/@''HAVE_WCTRANS_T''@/$(HAVE_WCTRANS_T)/g' \
 	      -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \
 	      -e 's/@''REPLACE_ISWBLANK''@/$(REPLACE_ISWBLANK)/g' \
+	      -e 's/@''REPLACE_ISWDIGIT''@/$(REPLACE_ISWDIGIT)/g' \
+	      -e 's/@''REPLACE_ISWXDIGIT''@/$(REPLACE_ISWXDIGIT)/g' \
 	      -e 's/@''REPLACE_ISWCNTRL''@/$(REPLACE_ISWCNTRL)/g' \
 	      -e 's/@''REPLACE_TOWLOWER''@/$(REPLACE_TOWLOWER)/g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
@@ -11121,6 +13892,13 @@
 	  echo 'm4_define([AT_PACKAGE_BUGREPORT], [$(PACKAGE_BUGREPORT)])'; \
 	} >$@.tmp
 	$(AM_V_at)mv $@.tmp $@
+
+# Update the test cases.  Consider the latest test results to be the
+# correct expectations, and change the test cases to match them.
+.PHONY: update-tests
+update-tests:
+	$(AM_V_GEN)cd $(top_srcdir) \
+	  && build-aux/update-test $(abs_builddir)/tests/testsuite.dir/*/testsuite.log
 $(TESTSUITE): $(TESTSUITE_AT)
 	$(AM_V_GEN) \
 	  $(AUTOTEST) $(AUTOTESTFLAGS) $(srcdir)/tests/testsuite.at -o $@.tmp
@@ -11133,12 +13911,15 @@
 
 .PHONY: recheck
 recheck: $(RUN_TESTSUITE_deps)
-	$(RUN_TESTSUITE)							\
-	  $$(perl -n								\
-	     -e 'if (/Summary of the failures/../Detailed failed tests/)'	\
-	     -e '{ /^ *[0-9]+:/ && s/:.*//s && print }' tests/testsuite.log)
+	$(RUN_TESTSUITE)					\
+	  $$(perl -n						\
+	     -e 'eof && /^(\d+).*: FAILED/ && print "$$1 "'	\
+		tests/testsuite.dir/*/testsuite.log)
 
-check-local: $(RUN_TESTSUITE_deps)
+check-local: check-tests
+
+.PHONY: check-tests
+check-tests: $(RUN_TESTSUITE_deps)
 	$(RUN_TESTSUITE)
 
 # Run the test suite on the *installed* tree.
@@ -11156,7 +13937,7 @@
 
 .PHONY: maintainer-check-valgrind
 maintainer-check-valgrind: $(RUN_TESTSUITE_deps)
-	test 'x$(VALGRIND)' == x ||					\
+	test 'x$(VALGRIND)' = x ||					\
 	  $(RUN_TESTSUITE)						\
 	    PREBISON='$(VALGRIND) -q' PREPARSER='$(VALGRIND) -q'	\
 	    VALGRIND_OPTS="$(VALGRIND_OPTS)"
@@ -11179,6 +13960,13 @@
 
 clean-local:
 	rm -rf $(CLEANDIRS)
+
+.PHONY: gitsort
+gitsort:
+	cd $(srcdir)							\
+	&& for i in $$(git ls-files '*.gitignore' | grep -v doc); do	\
+	  LC_ALL=C sort $$i -o $$i;					\
+	done
 $(top_srcdir)/.version: configure
 	echo $(VERSION) > $@-t && mv $@-t $@
 dist-hook: gen-ChangeLog gen-synclines
@@ -11219,6 +14007,18 @@
 	  mv -f $$cl.tmp $$cl;				\
 	fi
 
+# Useful to debug.
+.c.i:
+	$(CC) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -o $@ -E $<
+
+.PHONY: codespell
+codespell:
+	$(AM_V_GEN) cd $(srcdir) \
+	&& $(CODESPELL) \
+	     --regex "[\\w\\-'’\`]+\+*" \
+	     --ignore-words-list "ba,circularly,cloneable,copyable,define'd,dout,froms,iff,ifset,od,ois" \
+	     $$(git ls-files data doc lib src tests)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/NEWS b/NEWS
index 6c90e0c..3385e40 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,822 @@
 GNU Bison NEWS
 
+* Noteworthy changes in release 3.8.2 (2021-09-25) [stable]
+
+  Fixed portability issues of bison on Cygwin.
+
+  Improvements in glr2.cc: add support for custom error messages (`%define
+  parse.error custom`), allow linking several parsers together.
+
+* Noteworthy changes in release 3.8.1 (2021-09-11) [stable]
+
+  The generation of prototypes for yylex and yyerror in Yacc mode is
+  breaking existing grammar files.  To avoid breaking too many grammars, the
+  prototypes are now generated when `-y/--yacc` is used *and* the
+  `POSIXLY_CORRECT` environment variable is defined.
+
+  Avoid using `-y`/`--yacc` simply to comply with Yacc's file name
+  conventions, rather, use `-o y.tab.c`.  Autoconf's AC_PROG_YACC macro uses
+  `-y`.  Avoid it if possible, for instance by using gnulib's gl_PROG_BISON.
+
+* Noteworthy changes in release 3.8 (2021-09-07) [stable]
+
+** Backward incompatible changes
+
+  In conformance with the recommendations of the Graphviz team
+  (https://marc.info/?l=graphviz-devel&m=129418103126092), `-g`/`--graph`
+  now generates a *.gv file by default, instead of *.dot.  A transition
+  started in Bison 3.4.
+
+  To comply with the latest POSIX standard, in Yacc compatibility mode
+  (options `-y`/`--yacc`) Bison now generates prototypes for yyerror and
+  yylex.  In some situations, this is breaking compatibility: if the user
+  has already declared these functions but with some differences (e.g., to
+  declare them as static, or to use specific attributes), the generated
+  parser will fail to compile.  To disable these prototypes, #define yyerror
+  (to `yyerror`), and likewise for yylex.
+
+** Deprecated features
+
+  Support for the YYPRINT macro is removed. It worked only with yacc.c and
+  only for tokens.  It was obsoleted by %printer, introduced in Bison 1.50
+  (November 2002).
+
+  It has always been recommended to prefer `%define api.value.type foo` to
+  `#define YYSTYPE foo`.  The latter is supported in C for compatibility
+  with Yacc, but not in C++.  Warnings are now issued if `#define YYSTYPE`
+  is used in C++, and eventually support will be removed.
+
+  In C++ code, prefer value_type to semantic_type to denote the semantic
+  value type, which is specified by the `api.value.type` %define variable.
+
+** New features
+
+*** A skeleton for the D programming language
+
+  The "lalr1.d" skeleton is now officially part of Bison.
+
+  It was originally contributed by Oliver Mangold, based on Paolo Bonzini's
+  lalr1.java, and was improved by H. S. Teoh.  Adela Vais then took over
+  maintenance and invested a lot of efforts to complete, test and document
+  it.
+
+  It now supports all the bells and whistles of the other deterministic
+  parsers, which include: pull/push interfaces, verbose and custom error
+  messages, lookahead correction, token constructors, internationalization,
+  locations, printers, token and symbol prefixes, etc.
+
+  Two examples demonstrate the D parsers: a basic one (examples/d/simple),
+  and an advanced one (examples/d/calc).
+
+*** Option -H, --header and directive %header
+
+  The option `-H`/`--header` supersedes the option `--defines`, and the
+  directive %header supersedes %defines.  Both `--defines` and `%defines`
+  are, of course, maintained for backward compatibility.
+
+*** Option --html
+
+  Since version 2.4 Bison can be used to generate HTML reports.  However it
+  was a two-step process: first bison must be invoked with option `--xml`,
+  and then xsltproc must be run to the convert the XML reports into HTML.
+
+  The new option `--html` combines these steps.  The xsltproc program must
+  be available.
+
+*** A C++ native GLR parser
+
+  A new version of the C++ GLR parser was added: "glr2.cc".  It generates
+  "true C++11", instead of a C++ wrapper around a C parser as does the
+  existing "glr.cc" parser.  As a first significant consequence, it supports
+  `%define api.value.type variant`, contrary to glr.cc.
+
+  It should be upward compatible in terms of interface, feature and
+  performance to "glr.cc". To try it out, simply use
+
+  %skeleton "glr2.cc"
+
+  It will eventually replace "glr.cc".  However we need user feedback on
+  this skeleton.  _Please_ report your results and comments about it.
+
+*** Counterexamples
+
+  Counterexamples now show the rule numbers, and always show ε for rules
+  with an empty right-hand side.  For instance
+
+    exp
+    ↳ 1: e1       e2     "a"
+         ↳ 3: ε • ↳ 1: ε
+
+  instead of
+
+    exp
+    ↳ e1  e2  "a"
+      ↳ • ↳ ε
+
+*** Lookahead correction in Java
+
+  The Java skeleton (lalr1.java) now supports LAC, via the `parse.lac`
+  %define variable.
+
+*** Abort parsing for memory exhaustion (C)
+
+  User actions may now use `YYNOMEM` (similar to `YYACCEPT` and `YYABORT`)
+  to abort the current parse with memory exhaustion.
+
+*** Printing locations in debug traces (C)
+
+  The `YYLOCATION_PRINT(File, Loc)` macro prints a location.  It is defined
+  when (i) locations are enabled, (ii) the default type for locations is
+  used, (iii) debug traces are enabled, and (iv) `YYLOCATION_PRINT` is not
+  already defined.
+
+  Users may define `YYLOCATION_PRINT` to cover other cases.
+
+*** GLR traces
+
+  There were no debug traces for deferred calls to user actions.  They are
+  logged now.
+
+
+* Noteworthy changes in release 3.7.6 (2021-03-08) [stable]
+
+** Bug fixes
+
+*** Reused Push Parsers
+
+  When a push-parser state structure is used for multiple parses, it was
+  possible for some state to leak from one run into the following one.
+
+*** Fix Table Generation
+
+  In some very rare conditions, when there are many useless tokens, it was
+  possible to generate incorrect parsers.
+
+
+* Noteworthy changes in release 3.7.5 (2021-01-24) [stable]
+
+** Bug fixes
+
+*** Counterexample Generation
+
+  In some cases counterexample generation could crash.  This is fixed.
+
+*** Fix Table Generation
+
+  In some very rare conditions, when there are many useless tokens, it was
+  possible to generate incorrect parsers.
+
+*** GLR parsers now support %merge together with api.value.type=union.
+
+*** C++ parsers use noexcept in more places.
+
+*** Generated parsers avoid some warnings about signedness issues.
+
+*** C-language parsers now avoid warnings from pedantic clang.
+
+*** C-language parsers now work around quirks of HP-UX 11.23 (2003).
+
+
+* Noteworthy changes in release 3.7.4 (2020-11-14) [stable]
+
+** Bug fixes
+
+*** Bug fixes in yacc.c
+
+  In Yacc mode, all the tokens are defined twice: once as an enum, and then
+  as a macro.  YYEMPTY was missing its macro.
+
+*** Bug fixes in lalr1.cc
+
+  The lalr1.cc skeleton used to emit internal assertions (using YY_ASSERT)
+  even when the `parse.assert` %define variable is not enabled.  It no
+  longer does.
+
+  The private internal macro YY_ASSERT now obeys the `api.prefix` %define
+  variable.
+
+  When there is a very large number of tokens, some assertions could be long
+  enough to hit arbitrary limits in Visual C++.  They have been rewritten to
+  work around this limitation.
+
+** Changes
+
+  The YYBISON macro in generated "regular C parsers" (from the "yacc.c"
+  skeleton) used to be defined to 1.  It is now defined to the version of
+  Bison as an integer (e.g., 30704 for version 3.7.4).
+
+
+* Noteworthy changes in release 3.7.3 (2020-10-13) [stable]
+
+** Bug fixes
+
+  Fix concurrent build issues.
+
+  The bison executable is no longer linked uselessly against libreadline.
+
+  Fix incorrect use of yytname in glr.cc.
+
+
+* Noteworthy changes in release 3.7.2 (2020-09-05) [stable]
+
+  This release of Bison fixes all known bugs reported for Bison in MITRE's
+  Common Vulnerabilities and Exposures (CVE) system.  These vulnerabilities
+  are only about bison-the-program itself, not the generated code.
+
+  Although these bugs are typically irrelevant to how Bison is used, they
+  are worth fixing if only to give users peace of mind.
+
+  There is no known vulnerability in the generated parsers.
+
+** Bug fixes
+
+  Fix concurrent build issues (introduced in Bison 3.5).
+
+  Push parsers always use YYMALLOC/YYFREE (no direct calls to malloc/free).
+
+  Fix portability issues of the test suite, and of bison itself.
+
+  Some unlikely crashes found by fuzzing have been fixed.  This is only
+  about bison itself, not the generated parsers.
+
+
+* Noteworthy changes in release 3.7.1 (2020-08-02) [stable]
+
+** Bug fixes
+
+  Crash when a token alias contains a NUL byte.
+
+  Portability issues with libtextstyle.
+
+  Portability issues of Bison itself with MSVC.
+
+** Changes
+
+  Improvements and fixes in the documentation.
+
+  More precise location about symbol type redefinitions.
+
+
+* Noteworthy changes in release 3.7 (2020-07-23) [stable]
+
+** Deprecated features
+
+  The YYPRINT macro, which works only with yacc.c and only for tokens, was
+  obsoleted long ago by %printer, introduced in Bison 1.50 (November 2002).
+  It is deprecated and its support will be removed eventually.
+
+  In conformance with the recommendations of the Graphviz team, in the next
+  version Bison the option `--graph` will generate a *.gv file by default,
+  instead of *.dot.  A transition started in Bison 3.4.
+
+** New features
+
+*** Counterexample Generation
+
+  Contributed by Vincent Imbimbo.
+
+  When given `-Wcounterexamples`/`-Wcex`, bison will now output
+  counterexamples for conflicts.
+
+**** Unifying Counterexamples
+
+  Unifying counterexamples are strings which can be parsed in two ways due
+  to the conflict.  For example on a grammar that contains the usual
+  "dangling else" ambiguity:
+
+    $ bison else.y
+    else.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+    else.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
+
+    $ bison else.y -Wcex
+    else.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+    else.y: warning: shift/reduce conflict on token "else" [-Wcounterexamples]
+      Example: "if" exp "then" "if" exp "then" exp • "else" exp
+      Shift derivation
+        exp
+        ↳ "if" exp "then" exp
+                          ↳ "if" exp "then" exp • "else" exp
+      Example: "if" exp "then" "if" exp "then" exp • "else" exp
+      Reduce derivation
+        exp
+        ↳ "if" exp "then" exp                     "else" exp
+                          ↳ "if" exp "then" exp •
+
+  When text styling is enabled, colors are used in the examples and the
+  derivations to highlight the structure of both analyses.  In this case,
+
+    "if" exp "then" [ "if" exp "then" exp • ] "else" exp
+
+  vs.
+
+    "if" exp "then" [ "if" exp "then" exp • "else" exp ]
+
+
+  The counterexamples are "focused", in two different ways.  First, they do
+  not clutter the output with all the derivations from the start symbol,
+  rather they start on the "conflicted nonterminal". They go straight to the
+  point.  Second, they don't "expand" nonterminal symbols uselessly.
+
+**** Nonunifying Counterexamples
+
+  In the case of the dangling else, Bison found an example that can be
+  parsed in two ways (therefore proving that the grammar is ambiguous).
+  When it cannot find such an example, it instead generates two examples
+  that are the same up until the dot:
+
+    $ bison foo.y
+    foo.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+    foo.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
+    foo.y:4.4-7: warning: rule useless in parser due to conflicts [-Wother]
+        4 | a: expr
+          |    ^~~~
+
+    $ bison -Wcex foo.y
+    foo.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+    foo.y: warning: shift/reduce conflict on token ID [-Wcounterexamples]
+      First example: expr • ID ',' ID $end
+      Shift derivation
+        $accept
+        ↳ s                      $end
+          ↳ a                 ID
+            ↳ expr
+              ↳ expr • ID ','
+      Second example: expr • ID $end
+      Reduce derivation
+        $accept
+        ↳ s             $end
+          ↳ a        ID
+            ↳ expr •
+    foo.y:4.4-7: warning: rule useless in parser due to conflicts [-Wother]
+        4 | a: expr
+          |    ^~~~
+
+  In these cases, the parser usually doesn't have enough lookahead to
+  differentiate the two given examples.
+
+**** Reports
+
+  Counterexamples are also included in the report when given
+  `--report=counterexamples`/`-rcex` (or `--report=all`), with more
+  technical details:
+
+    State 7
+
+      1 exp: "if" exp "then" exp •  [$end, "then", "else"]
+      2    | "if" exp "then" exp • "else" exp
+
+      "else"  shift, and go to state 8
+
+      "else"    [reduce using rule 1 (exp)]
+      $default  reduce using rule 1 (exp)
+
+      shift/reduce conflict on token "else":
+          1 exp: "if" exp "then" exp •
+          2 exp: "if" exp "then" exp • "else" exp
+        Example: "if" exp "then" "if" exp "then" exp • "else" exp
+        Shift derivation
+          exp
+          ↳ "if" exp "then" exp
+                            ↳ "if" exp "then" exp • "else" exp
+        Example: "if" exp "then" "if" exp "then" exp • "else" exp
+        Reduce derivation
+          exp
+          ↳ "if" exp "then" exp                     "else" exp
+                            ↳ "if" exp "then" exp •
+
+*** File prefix mapping
+
+  Contributed by Joshua Watt.
+
+  Bison learned a new argument, `--file-prefix-map OLD=NEW`.  Any file path
+  in the output (specifically `#line` directives and `#ifdef` header guards)
+  that begins with the prefix OLD will have it replaced with the prefix NEW,
+  similar to the `-ffile-prefix-map` in GCC.  This option can be used to
+  make bison output reproducible.
+
+** Changes
+
+*** Diagnostics
+
+  When text styling is enabled and the terminal supports it, the warnings
+  now include hyperlinks to the documentation.
+
+*** Relocatable installation
+
+  When installed to be relocatable (via `configure --enable-relocatable`),
+  bison will now also look for a relocated m4.
+
+*** C++ file names
+
+  The `filename_type` %define variable was renamed `api.filename.type`.
+  Instead of
+
+    %define filename_type "symbol"
+
+  write
+
+    %define api.filename.type {symbol}
+
+  (Or let `bison --update` do it for you).
+
+  It now defaults to `const std::string` instead of `std::string`.
+
+*** Deprecated %define variable names
+
+  The following variables have been renamed for consistency.  Backward
+  compatibility is ensured, but upgrading is recommended.
+
+    filename_type       -> api.filename.type
+    package             -> api.package
+
+*** Push parsers no longer clear their state when parsing is finished
+
+  Previously push-parsers cleared their state when parsing was finished (on
+  success and on failure).  This made it impossible to check if there were
+  parse errors, since `yynerrs` was also reset.  This can be especially
+  troublesome when used in autocompletion, since a parser with error
+  recovery would suggest (irrelevant) expected tokens even if there were
+  failures.
+
+  Now the parser state can be examined when parsing is finished.  The parser
+  state is reset when starting a new parse.
+
+** Documentation
+
+*** Examples
+
+  The bistromathic demonstrates %param and how to quote sources in the error
+  messages:
+
+    > 123 456
+    1.5-7: syntax error: expected end of file or + or - or * or / or ^ before number
+        1 | 123 456
+          |     ^~~
+
+** Bug fixes
+
+*** Include the generated header (yacc.c)
+
+  Historically, when --defines was used, bison generated a header and pasted
+  an exact copy of it into the generated parser implementation file.  Since
+  Bison 3.4 it is possible to specify that the header should be `#include`d,
+  and how.  For instance
+
+    %define api.header.include {"parse.h"}
+
+  or
+
+    %define api.header.include {<parser/parse.h>}
+
+  Now api.header.include defaults to `"header-basename"`, as was intended in
+  Bison 3.4, where `header-basename` is the basename of the generated
+  header.  This is disabled when the generated header is `y.tab.h`, to
+  comply with Automake's ylwrap.
+
+*** String aliases are faithfully propagated
+
+  Bison used to interpret user strings (i.e., decoding backslash escapes)
+  when reading them, and to escape them (i.e., issue non-printable
+  characters as backslash escapes, taking the locale into account) when
+  outputting them.  As a consequence non-ASCII strings (say in UTF-8) ended
+  up "ciphered" as sequences of backslash escapes.  This happened not only
+  in the generated sources (where the compiler will reinterpret them), but
+  also in all the generated reports (text, xml, html, dot, etc.).  Reports
+  were therefore not readable when string aliases were not pure ASCII.
+  Worse yet: the output depended on the user's locale.
+
+  Now Bison faithfully treats the string aliases exactly the way the user
+  spelled them.  This fixes all the aforementioned problems.  However, now,
+  string aliases semantically equivalent but syntactically different (e.g.,
+  "A", "\x41", "\101") are considered to be different.
+
+*** Crash when generating IELR
+
+  An old, well hidden, bug in the generation of IELR parsers was fixed.
+
+
+* Noteworthy changes in release 3.6.4 (2020-06-15) [stable]
+
+** Bug fixes
+
+  In glr.cc some internal macros leaked in the user's code, and could damage
+  access to the token kinds.
+
+
+* Noteworthy changes in release 3.6.3 (2020-06-03) [stable]
+
+** Bug fixes
+
+  Incorrect comments in the generated parsers.
+
+  Warnings in push parsers (yacc.c).
+
+  Incorrect display of gotos in LAC traces (lalr1.cc).
+
+
+* Noteworthy changes in release 3.6.2 (2020-05-17) [stable]
+
+** Bug fixes
+
+  Some tests were fixed.
+
+  When token aliases contain comment delimiters:
+
+    %token FOO "/* foo */"
+
+  bison used to emit "nested" comments, which is invalid C.
+
+
+* Noteworthy changes in release 3.6.1 (2020-05-10) [stable]
+
+** Bug fixes
+
+  Restored ANSI-C compliance in yacc.c.
+
+  GNU readline portability issues.
+
+  In C++, yy::parser::symbol_name is now a public member, as was intended.
+
+** New features
+
+  In C++, yy::parser::symbol_type now has a public name() member function.
+
+
+* Noteworthy changes in release 3.6 (2020-05-08) [stable]
+
+** Backward incompatible changes
+
+  TL;DR: replace "#define YYERROR_VERBOSE 1" by "%define parse.error verbose".
+
+  The YYERROR_VERBOSE macro is no longer supported; the parsers that still
+  depend on it will now produce Yacc-like error messages (just "syntax
+  error").  It was superseded by the "%error-verbose" directive in Bison
+  1.875 (2003-01-01).  Bison 2.6 (2012-07-19) clearly announced that support
+  for YYERROR_VERBOSE would be removed.  Note that since Bison 3.0
+  (2013-07-25), "%error-verbose" is deprecated in favor of "%define
+  parse.error verbose".
+
+** Deprecated features
+
+  The YYPRINT macro, which works only with yacc.c and only for tokens, was
+  obsoleted long ago by %printer, introduced in Bison 1.50 (November 2002).
+  It is deprecated and its support will be removed eventually.
+
+** New features
+
+*** Improved syntax error messages
+
+  Two new values for the %define parse.error variable offer more control to
+  the user.  Available in all the skeletons (C, C++, Java).
+
+**** %define parse.error detailed
+
+  The behavior of "%define parse.error detailed" is closely resembling that
+  of "%define parse.error verbose" with a few exceptions.  First, it is safe
+  to use non-ASCII characters in token aliases (with 'verbose', the result
+  depends on the locale with which bison was run).  Second, a yysymbol_name
+  function is exposed to the user, instead of the yytnamerr function and the
+  yytname table.  Third, token internationalization is supported (see
+  below).
+
+**** %define parse.error custom
+
+  With this directive, the user forges and emits the syntax error message
+  herself by defining the yyreport_syntax_error function.  A new type,
+  yypcontext_t, captures the circumstances of the error, and provides the
+  user with functions to get details, such as yypcontext_expected_tokens to
+  get the list of expected token kinds.
+
+  A possible implementation of yyreport_syntax_error is:
+
+    int
+    yyreport_syntax_error (const yypcontext_t *ctx)
+    {
+      int res = 0;
+      YY_LOCATION_PRINT (stderr, *yypcontext_location (ctx));
+      fprintf (stderr, ": syntax error");
+      // Report the tokens expected at this point.
+      {
+        enum { TOKENMAX = 10 };
+        yysymbol_kind_t expected[TOKENMAX];
+        int n = yypcontext_expected_tokens (ctx, expected, TOKENMAX);
+        if (n < 0)
+          // Forward errors to yyparse.
+          res = n;
+        else
+          for (int i = 0; i < n; ++i)
+            fprintf (stderr, "%s %s",
+                     i == 0 ? ": expected" : " or", yysymbol_name (expected[i]));
+      }
+      // Report the unexpected token.
+      {
+        yysymbol_kind_t lookahead = yypcontext_token (ctx);
+        if (lookahead != YYSYMBOL_YYEMPTY)
+          fprintf (stderr, " before %s", yysymbol_name (lookahead));
+      }
+      fprintf (stderr, "\n");
+      return res;
+    }
+
+**** Token aliases internationalization
+
+  When the %define variable parse.error is set to `custom` or `detailed`,
+  one may specify which token aliases are to be translated using _().  For
+  instance
+
+    %token
+        PLUS   "+"
+        MINUS  "-"
+      <double>
+        NUM _("number")
+      <symrec*>
+        FUN _("function")
+        VAR _("variable")
+
+  In that case the user must define _() and N_(), and yysymbol_name returns
+  the translated symbol (i.e., it returns '_("variable")' rather that
+  '"variable"').  In Java, the user must provide an i18n() function.
+
+*** List of expected tokens (yacc.c)
+
+  Push parsers may invoke yypstate_expected_tokens at any point during
+  parsing (including even before submitting the first token) to get the list
+  of possible tokens.  This feature can be used to propose autocompletion
+  (see below the "bistromathic" example).
+
+  It makes little sense to use this feature without enabling LAC (lookahead
+  correction).
+
+*** Returning the error token
+
+  When the scanner returns an invalid token or the undefined token
+  (YYUNDEF), the parser generates an error message and enters error
+  recovery.  Because of that error message, most scanners that find lexical
+  errors generate an error message, and then ignore the invalid input
+  without entering the error-recovery.
+
+  The scanners may now return YYerror, the error token, to enter the
+  error-recovery mode without triggering an additional error message.  See
+  the bistromathic for an example.
+
+*** Deep overhaul of the symbol and token kinds
+
+  To avoid the confusion with types in programming languages, we now refer
+  to token and symbol "kinds" instead of token and symbol "types".  The
+  documentation and error messages have been revised.
+
+  All the skeletons have been updated to use dedicated enum types rather
+  than integral types.  Special symbols are now regular citizens, instead of
+  being declared in ad hoc ways.
+
+**** Token kinds
+
+  The "token kind" is what is returned by the scanner, e.g., PLUS, NUMBER,
+  LPAREN, etc.  While backward compatibility is of course ensured, users are
+  nonetheless invited to replace their uses of "enum yytokentype" by
+  "yytoken_kind_t".
+
+  This type now also includes tokens that were previously hidden: YYEOF (end
+  of input), YYUNDEF (undefined token), and YYerror (error token).  They
+  now have string aliases, internationalized when internationalization is
+  enabled.  Therefore, by default, error messages now refer to "end of file"
+  (internationalized) rather than the cryptic "$end", or to "invalid token"
+  rather than "$undefined".
+
+  Therefore in most cases it is now useless to define the end-of-line token
+  as follows:
+
+    %token T_EOF 0 "end of file"
+
+  Rather simply use "YYEOF" in your scanner.
+
+**** Symbol kinds
+
+  The "symbol kinds" is what the parser actually uses.  (Unless the
+  api.token.raw %define variable is used, the symbol kind of a terminal
+  differs from the corresponding token kind.)
+
+  They are now exposed as a enum, "yysymbol_kind_t".
+
+  This allows users to tailor the error messages the way they want, or to
+  process some symbols in a specific way in autocompletion (see the
+  bistromathic example below).
+
+*** Modernize display of explanatory statements in diagnostics
+
+  Since Bison 2.7, output was indented four spaces for explanatory
+  statements.  For example:
+
+    input.y:2.7-13: error: %type redeclaration for exp
+    input.y:1.7-11:     previous declaration
+
+  Since the introduction of caret-diagnostics, it became less clear.  This
+  indentation has been removed and submessages are displayed similarly as in
+  GCC:
+
+    input.y:2.7-13: error: %type redeclaration for exp
+        2 | %type <float> exp
+          |       ^~~~~~~
+    input.y:1.7-11: note: previous declaration
+        1 | %type <int> exp
+          |       ^~~~~
+
+  Contributed by Victor Morales Cayuela.
+
+*** C++
+
+  The token and symbol kinds are yy::parser::token_kind_type and
+  yy::parser::symbol_kind_type.
+
+  The symbol_type::kind() member function allows to get the kind of a
+  symbol.  This can be used to write unit tests for scanners, e.g.,
+
+    yy::parser::symbol_type t = make_NUMBER ("123");
+    assert (t.kind () == yy::parser::symbol_kind::S_NUMBER);
+    assert (t.value.as<int> () == 123);
+
+** Documentation
+
+*** User Manual
+
+  In order to avoid ambiguities with "type" as in "typing", we now refer to
+  the "token kind" (e.g., `PLUS`, `NUMBER`, etc.) rather than the "token
+  type".  We now also refer to the "symbol type" (e.g., `PLUS`, `expr`,
+  etc.).
+
+*** Examples
+
+  There are now examples/java: a very simple calculator, and a more complete
+  one (push-parser, location tracking, and debug traces).
+
+  The lexcalc example (a simple example in C based on Flex and Bison) now
+  also demonstrates location tracking.
+
+
+  A new C example, bistromathic, is a fully featured interactive calculator
+  using many Bison features: pure interface, push parser, autocompletion
+  based on the current parser state (using yypstate_expected_tokens),
+  location tracking, internationalized custom error messages, lookahead
+  correction, rich debug traces, etc.
+
+  It shows how to depend on the symbol kinds to tailor autocompletion.  For
+  instance it recognizes the symbol kind "VARIABLE" to propose
+  autocompletion on the existing variables, rather than of the word
+  "variable".
+
+
+* Noteworthy changes in release 3.5.4 (2020-04-05) [stable]
+
+** WARNING: Future backward-incompatibilities!
+
+  TL;DR: replace "#define YYERROR_VERBOSE 1" by "%define parse.error verbose".
+
+  Bison 3.6 will no longer support the YYERROR_VERBOSE macro; the parsers
+  that still depend on it will produce Yacc-like error messages (just
+  "syntax error").  It was superseded by the "%error-verbose" directive in
+  Bison 1.875 (2003-01-01).  Bison 2.6 (2012-07-19) clearly announced that
+  support for YYERROR_VERBOSE would be removed.  Note that since Bison 3.0
+  (2013-07-25), "%error-verbose" is deprecated in favor of "%define
+  parse.error verbose".
+
+** Bug fixes
+
+  Fix portability issues of the package itself on old compilers.
+
+  Fix api.token.raw support in Java.
+
+
+* Noteworthy changes in release 3.5.3 (2020-03-08) [stable]
+
+** Bug fixes
+
+  Error messages could quote lines containing zero-width characters (such as
+  \005) with incorrect styling.  Fixes for similar issues with unexpectedly
+  short lines (e.g., the file was changed between parsing and diagnosing).
+
+  Some unlikely crashes found by fuzzing have been fixed.  This is only
+  about bison itself, not the generated parsers.
+
+
+* Noteworthy changes in release 3.5.2 (2020-02-13) [stable]
+
+** Bug fixes
+
+  Portability issues and minor cosmetic issues.
+
+  The lalr1.cc skeleton properly rejects unsupported values for parse.lac
+  (as yacc.c does).
+
+
+* Noteworthy changes in release 3.5.1 (2020-01-19) [stable]
+
+** Bug fixes
+
+  Portability fixes.
+
+  Fix compiler warnings.
+
+
 * Noteworthy changes in release 3.5 (2019-12-11) [stable]
 
 ** Backward incompatible changes
@@ -100,7 +917,7 @@
   Also, because string aliases need not be defined, typos such as "baz"
   instead of "bar" will be not reported.
 
-  The option -Wdangling-alias catches these situations.  On
+  The option `-Wdangling-alias` catches these situations.  On
 
     %token BAR "bar"
     %type <ival> foo "foo"
@@ -116,7 +933,7 @@
           | foo: "baz" {}
           |      ^~~~~
 
-   The -Wall option does not (yet?) include -Wdangling-alias.
+   The `-Wall` option does not (yet?) include `-Wdangling-alias`.
 
 *** Better POSIX Yacc compatibility diagnostics
 
@@ -207,6 +1024,7 @@
 
   In Java, %define api.prefix was ignored.  It now behaves as expected.
 
+
 * Noteworthy changes in release 3.4.2 (2019-09-12) [stable]
 
 ** Bug fixes
@@ -224,12 +1042,14 @@
   When lone carriage-return characters appeared in the input file,
   diagnostics could hang forever.
 
+
 * Noteworthy changes in release 3.4.1 (2019-05-22) [stable]
 
 ** Bug fixes
 
   Portability fixes.
 
+
 * Noteworthy changes in release 3.4 (2019-05-19) [stable]
 
 ** Deprecated features
@@ -370,6 +1190,7 @@
   system, in December 1987.  See the NEWS of Bison 3.3 for the previous
   oldest bug.
 
+
 * Noteworthy changes in release 3.3.2 (2019-02-03) [stable]
 
 ** Bug fixes
@@ -377,6 +1198,7 @@
   Bison 3.3 failed to generate parsers for grammars with unused nonterminal
   symbols.
 
+
 * Noteworthy changes in release 3.3.1 (2019-01-27) [stable]
 
 ** Changes
@@ -384,6 +1206,7 @@
   The option -y/--yacc used to imply -Werror=yacc, which turns uses of Bison
   extensions into errors.  It now makes them simple warnings (-Wyacc).
 
+
 * Noteworthy changes in release 3.3 (2019-01-26) [stable]
 
   A new mailing list was created, Bison Announce.  It is low traffic, and is
@@ -526,11 +1349,11 @@
 
       ...
 
-  Looking at the output from -v, one can see that the shift-reduce conflict
+  Looking at the output from -v, one can see that the shift/reduce conflict
   here is due to the fact that the parser does not know whether to reduce
   arguments to argument_list until it sees the token _after_ the following
   ','.  By marking the rule with %expect 1 (because there is a conflict in
-  one state), we document the source of the 1 overall shift-reduce conflict.
+  one state), we document the source of the 1 overall shift/reduce conflict.
 
   In GLR parsers, we can use %expect-rr in a rule for reduce/reduce
   conflicts.  In this case, we mark each of the conflicting rules.  For
@@ -645,7 +1468,7 @@
 
 ** Bug fixes
 
-*** Incorrect number of reduce-reduce conflicts
+*** Incorrect number of reduce/reduce conflicts
 
   On a grammar such as
 
@@ -699,6 +1522,7 @@
   literal such as ‘"number"’.  The post-fix quantifiers are ‘?’ (zero or
   one), ‘*’ (zero or more) and ‘+’ (one or more).
 
+
 * Noteworthy changes in release 3.2.4 (2018-12-24) [stable]
 
 ** Bug fixes
@@ -707,6 +1531,7 @@
 
   Always provide a copy constructor for symbol_type, even in modern C++.
 
+
 * Noteworthy changes in release 3.2.3 (2018-12-18) [stable]
 
 ** Bug fixes
@@ -714,12 +1539,14 @@
   Properly support token constructors in C++ with types that include commas
   (e.g., std::pair<int, int>).  A regression introduced in Bison 3.2.
 
+
 * Noteworthy changes in release 3.2.2 (2018-11-21) [stable]
 
 ** Bug fixes
 
   C++ portability issues.
 
+
 * Noteworthy changes in release 3.2.1 (2018-11-09) [stable]
 
 ** Bug fixes
@@ -727,6 +1554,7 @@
   Several portability issues have been fixed in the build system, in the
   test suite, and in the generated parsers in C++.
 
+
 * Noteworthy changes in release 3.2 (2018-10-29) [stable]
 
 ** Backward incompatible changes
@@ -893,6 +1721,7 @@
 
   Portability/warning issues with Flex.
 
+
 * Noteworthy changes in release 3.1 (2018-08-27) [stable]
 
 ** Backward incompatible changes
@@ -1033,6 +1862,7 @@
   Useless code was removed from C++ parsers, and some of the generated
   constructors are more 'natural'.
 
+
 * Noteworthy changes in release 3.0.5 (2018-05-27) [stable]
 
 ** Bug fixes
@@ -1063,6 +1893,7 @@
 
   On some platforms, some Java and/or C++ tests were failing.
 
+
 * Noteworthy changes in release 3.0.4 (2015-01-23) [stable]
 
 ** Bug fixes
@@ -1075,6 +1906,7 @@
 
   Several portability issues in tests were fixed.
 
+
 * Noteworthy changes in release 3.0.3 (2015-01-15) [stable]
 
 ** Bug fixes
@@ -1131,6 +1963,7 @@
    - calc++
      a calculator in C++ using variant support and token constructors.
 
+
 * Noteworthy changes in release 3.0.2 (2013-12-05) [stable]
 
 ** Bug fixes
@@ -1155,6 +1988,7 @@
   When C++ variant support is enabled, an error triggered via YYERROR, but
   not caught via error recovery, resulted in a double deletion.
 
+
 * Noteworthy changes in release 3.0.1 (2013-11-12) [stable]
 
 ** Bug fixes
@@ -1186,6 +2020,7 @@
 
   Bugs and portability issues.
 
+
 * Noteworthy changes in release 3.0 (2013-07-25) [stable]
 
 ** WARNING: Future backward-incompatibilities!
@@ -1556,7 +2391,7 @@
   %error-verbose directive is deprecated in favor of "%define parse.error
   verbose".
 
-** Renamed %define variables
+** Deprecated %define variable names
 
   The following variables have been renamed for consistency.  Backward
   compatibility is ensured, but upgrading is recommended.
@@ -1782,6 +2617,7 @@
   There are operator- and operator-= for 'location'.  Negative line/column
   increments can no longer underflow the resulting value.
 
+
 * Noteworthy changes in release 2.7.1 (2013-04-15) [stable]
 
 ** Bug fixes
@@ -1792,6 +2628,7 @@
 
 *** Fix some compiler warnings (lalr1.cc)
 
+
 * Noteworthy changes in release 2.7 (2012-12-12) [stable]
 
 ** Bug fixes
@@ -1916,6 +2753,7 @@
 
   The translation of midrule actions is now described.
 
+
 * Noteworthy changes in release 2.6.5 (2012-11-07) [stable]
 
   We consider compiler warnings about Bison generated parsers to be bugs.
@@ -1935,10 +2773,12 @@
   When possible, yylloc is correctly initialized before calling yylex.  It
   is no longer necessary to initialize it in the %initial-action.
 
+
 * Noteworthy changes in release 2.6.4 (2012-10-23) [stable]
 
   Bison 2.6.3's --version was incorrect.  This release fixes this issue.
 
+
 * Noteworthy changes in release 2.6.3 (2012-10-22) [stable]
 
 ** Bug fixes
@@ -1983,6 +2823,7 @@
   "function declared 'noreturn' should not return") have also been
   addressed.
 
+
 * Noteworthy changes in release 2.6.2 (2012-08-03) [stable]
 
 ** Bug fixes
@@ -1999,6 +2840,7 @@
 
   The generated files no longer end (nor start) with empty lines.
 
+
 * Noteworthy changes in release 2.6.1 (2012-07-30) [stable]
 
  Bison no longer executes user-specified M4 code when processing a grammar.
@@ -2037,6 +2879,7 @@
   will display two values for each typed and untyped symbol (provided
   that YYSTYPE has both "ival" and "fval" fields).
 
+
 * Noteworthy changes in release 2.6 (2012-07-19) [stable]
 
 ** Future changes
@@ -2170,6 +3013,7 @@
 
     #endif /* !BAR_FOO_H  */            #endif /* !BAR_FOO_H  */
 
+
 * Noteworthy changes in release 2.5.1 (2012-06-05) [stable]
 
 ** Future changes:
@@ -2267,7 +3111,8 @@
   Running "make install-pdf" (or -dvi, -html, -info, and -ps) no longer
   halts in the middle of its course.
 
-* Changes in version 2.5 (2011-05-14):
+
+* Noteworthy changes in release 2.5 (2011-05-14)
 
 ** Grammar symbol names can now contain non-initial dashes:
 
@@ -2622,7 +3467,8 @@
 
   This bug has been fixed.
 
-* Changes in version 2.4.3 (2010-08-05):
+
+* Noteworthy changes in release 2.4.3 (2010-08-05)
 
 ** Bison now obeys -Werror and --warnings=error for warnings about
    grammar rules that are useless in the parser due to conflicts.
@@ -2642,7 +3488,8 @@
 
 ** Minor documentation fixes.
 
-* Changes in version 2.4.2 (2010-03-20):
+
+* Noteworthy changes in release 2.4.2 (2010-03-20)
 
 ** Some portability problems that resulted in failures and livelocks
    in the test suite on some versions of at least Solaris, AIX, HP-UX,
@@ -2708,7 +3555,7 @@
   inherent flaws when %error-verbose or "#define YYERROR_VERBOSE" is
   used.  For a more detailed discussion, see:
 
-    http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html
+    https://lists.gnu.org/r/bison-patches/2009-12/msg00024.html
 
   The upcoming Bison 2.5 will remove YYFAIL from Java parsers, but
   deterministic parsers in C will continue to implement it.  However,
@@ -2736,7 +3583,8 @@
   message translations were not installed although supported by the
   host system.
 
-* Changes in version 2.4.1 (2008-12-11):
+
+* Noteworthy changes in release 2.4.1 (2008-12-11)
 
 ** In the GLR defines file, unexpanded M4 macros in the yylval and yylloc
    declarations have been fixed.
@@ -2761,7 +3609,8 @@
 
 ** A few minor improvements to the Bison manual.
 
-* Changes in version 2.4 (2008-11-02):
+
+* Noteworthy changes in release 2.4 (2008-11-02)
 
 ** %language is an experimental feature.
 
@@ -2776,7 +3625,8 @@
 ** Several bugs in the C++ skeleton and the experimental Java skeleton have been
   fixed.
 
-* Changes in version 2.3b (2008-05-27):
+
+* Noteworthy changes in release 2.3b (2008-05-27)
 
 ** The quotes around NAME that used to be required in the following directive
   are now deprecated:
@@ -2962,7 +3812,8 @@
 ** The nonfunctional --no-parser, -n, and %no-parser options have been
   completely removed from Bison.
 
-* Changes in version 2.3a, 2006-09-13:
+
+* Noteworthy changes in release 2.3a (2006-09-13)
 
 ** Instead of %union, you can define and use your own union type
   YYSTYPE if your grammar contains at least one <type> tag.
@@ -3076,7 +3927,8 @@
   The old spelling still works, but is not documented and may be removed
   in a future release.
 
-* Changes in version 2.3, 2006-06-05:
+
+* Noteworthy changes in release 2.3 (2006-06-05)
 
 ** GLR grammars should now use "YYRECOVERING ()" instead of "YYRECOVERING",
   for compatibility with LALR(1) grammars.
@@ -3084,7 +3936,8 @@
 ** It is now documented that any definition of YYSTYPE or YYLTYPE should
   be to a type name that does not contain parentheses or brackets.
 
-* Changes in version 2.2, 2006-05-19:
+
+* Noteworthy changes in release 2.2 (2006-05-19)
 
 ** The distribution terms for all Bison-generated parsers now permit
   using the parsers in nonfree programs.  Previously, this permission
@@ -3166,7 +4019,8 @@
 
 ** DJGPP support added.
 
-* Changes in version 2.1, 2005-09-16:
+
+* Noteworthy changes in release 2.1 (2005-09-16)
 
 ** The C++ lalr1.cc skeleton supports %lex-param.
 
@@ -3192,7 +4046,8 @@
   print 'syntax error, unexpected number' instead of 'syntax error,
   unexpected "number"'.
 
-* Changes in version 2.0, 2004-12-25:
+
+* Noteworthy changes in release 2.0 (2004-12-25)
 
 ** Possibly-incompatible changes
 
@@ -3255,7 +4110,8 @@
 
   - Semicolons are now allowed before "|" in grammar rules, as POSIX requires.
 
-* Changes in version 1.875, 2003-01-01:
+
+* Noteworthy changes in release 1.875 (2003-01-01)
 
 ** The documentation license has been upgraded to version 1.2
   of the GNU Free Documentation License.
@@ -3375,7 +4231,8 @@
   ago, but nobody noticed until we recently asked someone to try
   building Bison with a K&R C compiler.
 
-* Changes in version 1.75, 2002-10-14:
+
+* Noteworthy changes in release 1.75 (2002-10-14)
 
 ** Bison should now work on 64-bit hosts.
 
@@ -3406,7 +4263,8 @@
   was incorrectly rejected: $1 is defined in the second midrule
   action, and is equal to the $$ of the first midrule action.
 
-* Changes in version 1.50, 2002-10-04:
+
+* Noteworthy changes in release 1.50 (2002-10-04)
 
 ** GLR parsing
   The declaration
@@ -3453,7 +4311,7 @@
   error token.  The new behavior has long been the documented behavior,
   and has long been required by POSIX.  For more details, please see
   Paul Eggert, "Reductions during Bison error handling" (2002-05-20)
-  <http://lists.gnu.org/archive/html/bug-bison/2002-05/msg00038.html>.
+  <https://lists.gnu.org/r/bug-bison/2002-05/msg00038.html>.
 
 ** Traces
   Popped tokens and nonterminals are now reported.
@@ -3550,7 +4408,8 @@
 
 ** GNU M4 is now required when using Bison.
 
-* Changes in version 1.35, 2002-03-25:
+
+* Noteworthy changes in release 1.35 (2002-03-25)
 
 ** C Skeleton
   Some projects use Bison's C parser with C++ compilers, and define
@@ -3565,7 +4424,8 @@
   This kludge also addresses some C++ problems when the stack was
   extended.
 
-* Changes in version 1.34, 2002-03-12:
+
+* Noteworthy changes in release 1.34 (2002-03-12)
 
 ** File name clashes are detected
   $ bison foo.y -d -o foo.x
@@ -3585,7 +4445,8 @@
 
 ** Fix test suite portability problems.
 
-* Changes in version 1.33, 2002-02-07:
+
+* Noteworthy changes in release 1.33 (2002-02-07)
 
 ** Fix C++ issues
   Groff could not be compiled for the definition of size_t was lacking
@@ -3594,7 +4455,8 @@
 ** Catch invalid @n
   As is done with $n.
 
-* Changes in version 1.32, 2002-01-23:
+
+* Noteworthy changes in release 1.32 (2002-01-23)
 
 ** Fix Yacc output file names
 
@@ -3602,7 +4464,8 @@
 
 ** Italian, Dutch translations
 
-* Changes in version 1.31, 2002-01-14:
+
+* Noteworthy changes in release 1.31 (2002-01-14)
 
 ** Many Bug Fixes
 
@@ -3689,7 +4552,8 @@
 ** --output
   New, aliasing "--output-file".
 
-* Changes in version 1.30, 2001-10-26:
+
+* Noteworthy changes in release 1.30 (2001-10-26)
 
 ** "--defines" and "--graph" have now an optional argument which is the
   output file name. "-d" and "-g" do not change; they do not take any
@@ -3700,7 +4564,8 @@
 
 ** Portability fixes.
 
-* Changes in version 1.29, 2001-09-07:
+
+* Noteworthy changes in release 1.29 (2001-09-07)
 
 ** The output file does not define const, as this caused problems when used
   with common autoconfiguration schemes.  If you still use ancient compilers
@@ -3735,7 +4600,8 @@
 ** @$
   Automatic location tracking.
 
-* Changes in version 1.28, 1999-07-06:
+
+* Noteworthy changes in release 1.28 (1999-07-06)
 
 ** Should compile better now with K&R compilers.
 
@@ -3745,12 +4611,14 @@
 
 ** There is now a FAQ.
 
-* Changes in version 1.27:
+
+* Noteworthy changes in release 1.27
 
 ** The make rule which prevented bison.simple from being created on
   some systems has been fixed.
 
-* Changes in version 1.26:
+
+* Noteworthy changes in release 1.26
 
 ** Bison now uses Automake.
 
@@ -3767,7 +4635,8 @@
 ** Generated parsers should now work even on operating systems which do
   not provide alloca().
 
-* Changes in version 1.25, 1995-10-16:
+
+* Noteworthy changes in release 1.25 (1995-10-16)
 
 ** Errors in the input grammar are not fatal; Bison keeps reading
 the grammar file, and reports all the errors found in it.
@@ -3792,7 +4661,8 @@
 The actions go into a separate file called NAME.act, in the form of
 a switch statement body.
 
-* Changes in version 1.23:
+
+* Noteworthy changes in release 1.23
 
 The user can define YYPARSE_PARAM as the name of an argument to be
 passed into yyparse.  The argument should have type void *.  It should
@@ -3801,68 +4671,71 @@
 
 Line numbers in output file corrected.
 
-* Changes in version 1.22:
+
+* Noteworthy changes in release 1.22
 
 --help option added.
 
-* Changes in version 1.20:
+
+* Noteworthy changes in release 1.20
 
 Output file does not redefine const for C++.
 
 -----
 
-Copyright (C) 1995-2015, 2018-2019 Free Software Foundation, Inc.
-
-This file is part of Bison, the GNU Parser Generator.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
- LocalWords:  yacc YYBACKUP glr GCC lalr ArrayIndexOutOfBoundsException nullptr
- LocalWords:  cplusplus liby rpl fprintf mfcalc Wyacc stmt cond expr mk sym lr
- LocalWords:  IELR ielr Lookahead YYERROR nonassoc LALR's api lookaheads yychar
- LocalWords:  destructor lookahead YYRHSLOC YYLLOC Rhs ifndef YYFAIL cpp sr rr
- LocalWords:  preprocessor initializer Wno Wnone Werror FreeBSD prec livelocks
- LocalWords:  Solaris AIX UX RHEL Tru LHS gcc's Wundef YYENABLE NLS YYLTYPE VCG
- LocalWords:  yyerror cpp's Wunused yylval yylloc prepend yyparse yylex yypush
- LocalWords:  Graphviz xml nonterminals midrule destructor's YYSTYPE typedef ly
- LocalWords:  CHR chr printf stdout namespace preprocessing enum pre include's
- LocalWords:  YYRECOVERING nonfree destructors YYABORT YYACCEPT params enums de
- LocalWords:  struct yystype DJGPP lex param Haible NUM alloca YYSTACK NUL goto
- LocalWords:  YYMAXDEPTH Unescaped UCNs YYLTYPE's yyltype typedefs inline Yaccs
- LocalWords:  Heriyanto Reenable dprec Hilfinger Eggert MYEOF Folle Menezes EOF
- LocalWords:  Lackovic define's itemset Groff Gettext malloc NEWS'ed YYDEBUG YY
- LocalWords:  namespaces strerror const autoconfiguration Dconst Autoconf's FDL
- LocalWords:  Automake TMPDIR LESSEQ ylwrap endif yydebug YYTOKEN YYLSP ival hh
- LocalWords:  extern YYTOKENTYPE TOKENTYPE yytokentype tokentype STYPE lval pdf
- LocalWords:  lang yyoutput dvi html ps POSIX lvalp llocp Wother nterm arg init
- LocalWords:  TOK calc yyo fval Wconflicts parsers yystackp yyval yynerrs
- LocalWords:  Théophile Ranquet Santet fno fnone stype associativity Tolmer
- LocalWords:  Wprecedence Rassoul Wempty Paolo Bonzini parser's Michiel loc
- LocalWords:  redeclaration sval fcaret reentrant XSLT xsl Wmaybe yyvsp Tedi
- LocalWords:  pragmas noreturn untyped Rozenman unexpanded Wojciech Polak
- LocalWords:  Alexandre MERCHANTABILITY yytype emplace ptr automove lvalues
- LocalWords:  nonterminal yy args Pragma dereference yyformat rhs docdir bw
- LocalWords:  Redeclarations rpcalc Autoconf YFLAGS Makefiles PROG DECL num
- LocalWords:  Heimbigner AST src ast Makefile srcdir MinGW xxlex XXSTYPE
- LocalWords:  XXLTYPE strictfp IDEs ffixit fdiagnostics parseable fixits
- LocalWords:  Wdeprecated yytext Variadic variadic yyrhs yyphrs RCS README
- LocalWords:  noexcept constexpr ispell american deprecations backend Teoh
- LocalWords:  YYPRINT Mangold Bonzini's Wdangling exVal baz checkable gcc
- LocalWords:  fsanitize Vogelsgesang lis redeclared stdint automata
+LocalWords:  yacc YYBACKUP glr GCC lalr ArrayIndexOutOfBoundsException nullptr
+LocalWords:  cplusplus liby rpl fprintf mfcalc Wyacc stmt cond expr mk sym lr
+LocalWords:  IELR ielr Lookahead YYERROR nonassoc LALR's api lookaheads yychar
+LocalWords:  destructor lookahead YYRHSLOC YYLLOC Rhs ifndef YYFAIL cpp sr rr
+LocalWords:  preprocessor initializer Wno Wnone Werror FreeBSD prec livelocks
+LocalWords:  Solaris AIX UX RHEL Tru LHS gcc's Wundef YYENABLE NLS YYLTYPE VCG
+LocalWords:  yyerror cpp's Wunused yylval yylloc prepend yyparse yylex yypush
+LocalWords:  Graphviz xml nonterminals midrule destructor's YYSTYPE typedef ly
+LocalWords:  CHR chr printf stdout namespace preprocessing enum pre include's
+LocalWords:  YYRECOVERING nonfree destructors YYABORT YYACCEPT params enums de
+LocalWords:  struct yystype DJGPP lex param Haible NUM alloca YYSTACK NUL goto
+LocalWords:  YYMAXDEPTH Unescaped UCNs YYLTYPE's yyltype typedefs inline Yaccs
+LocalWords:  Heriyanto Reenable dprec Hilfinger Eggert MYEOF Folle Menezes EOF
+LocalWords:  Lackovic define's itemset Groff Gettext malloc NEWS'ed YYDEBUG YY
+LocalWords:  namespaces strerror const autoconfiguration Dconst Autoconf's FDL
+LocalWords:  Automake TMPDIR LESSEQ ylwrap endif yydebug YYTOKEN YYLSP ival hh
+LocalWords:  extern YYTOKENTYPE TOKENTYPE yytokentype tokentype STYPE lval pdf
+LocalWords:  lang yyoutput dvi html ps POSIX lvalp llocp Wother nterm arg init
+LocalWords:  TOK calc yyo fval Wconflicts parsers yystackp yyval yynerrs
+LocalWords:  Théophile Ranquet Santet fno fnone stype associativity Tolmer
+LocalWords:  Wprecedence Rassoul Wempty Paolo Bonzini parser's Michiel loc
+LocalWords:  redeclaration sval fcaret reentrant XSLT xsl Wmaybe yyvsp Tedi
+LocalWords:  pragmas noreturn untyped Rozenman unexpanded Wojciech Polak
+LocalWords:  Alexandre MERCHANTABILITY yytype emplace ptr automove lvalues
+LocalWords:  nonterminal yy args Pragma dereference yyformat rhs docdir bw
+LocalWords:  Redeclarations rpcalc Autoconf YFLAGS Makefiles PROG DECL num
+LocalWords:  Heimbigner AST src ast Makefile srcdir MinGW xxlex XXSTYPE CVE
+LocalWords:  XXLTYPE strictfp IDEs ffixit fdiagnostics parseable fixits
+LocalWords:  Wdeprecated yytext Variadic variadic yyrhs yyphrs RCS README
+LocalWords:  noexcept constexpr ispell american deprecations backend Teoh
+LocalWords:  YYPRINT Mangold Bonzini's Wdangling exVal baz checkable gcc
+LocalWords:  fsanitize Vogelsgesang lis redeclared stdint automata yytname
+LocalWords:  yysymbol yytnamerr yyreport ctx ARGMAX yysyntax stderr LPAREN
+LocalWords:  symrec yypcontext TOKENMAX yyexpected YYEMPTY yypstate YYEOF
+LocalWords:  autocompletion bistromathic submessages Cayuela lexcalc hoc
+LocalWords:  yytoken YYUNDEF YYerror basename Automake's UTF ifdef ffile
+LocalWords:  gotos readline Imbimbo Wcounterexamples Wcex Nonunifying rcex
+LocalWords:  Vais xsltproc YYNOMEM YYLOCATION signedness YYBISON MITRE's
+LocalWords:  libreadline YYMALLOC YYFREE MSVC redefinitions POSIXLY
 
 Local Variables:
 ispell-dictionary: "american"
 mode: outline
 fill-column: 76
 End:
+
+Copyright (C) 1995-2015, 2018-2021 Free Software Foundation, Inc.
+
+This file is part of Bison, the GNU Parser Generator.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts.  A copy of the license is included in the "GNU Free
+Documentation License" file as part of this distribution.
diff --git a/PACKAGING b/PACKAGING
index 05489ba..ac4a210 100644
--- a/PACKAGING
+++ b/PACKAGING
@@ -36,7 +36,7 @@
 
 -----
 
-Copyright (C) 2002, 2005, 2009-2015, 2018-2019 Free Software Foundation,
+Copyright (C) 2002, 2005, 2009-2015, 2018-2021 Free Software Foundation,
 Inc.
 
 This file is part of Bison, the GNU Compiler Compiler.
@@ -52,4 +52,4 @@
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
+along with this program.  If not, see <https://www.gnu.org/licenses/>.
diff --git a/README b/README
index df2e763..b606440 100644
--- a/README
+++ b/README
@@ -1,29 +1,52 @@
-This package contains the GNU Bison parser generator.
+GNU Bison is a general-purpose parser generator that converts an annotated
+context-free grammar into a deterministic LR or generalized LR (GLR) parser
+employing LALR(1) parser tables.  Bison can also generate IELR(1) or
+canonical LR(1) parser tables.  Once you are proficient with Bison, you can
+use it to develop a wide range of language parsers, from those used in
+simple desk calculators to complex programming languages.
+
+Bison is upward compatible with Yacc: all properly-written Yacc grammars
+work with Bison with no change.  Anyone familiar with Yacc should be able to
+use Bison with little trouble.  You need to be fluent in C, C++, D or Java
+programming in order to use Bison.
+
+Bison and the parsers it generates are portable, they do not require any
+specific compilers.
+
+GNU Bison's home page is https://gnu.org/software/bison/.
 
 # Installation
 ## Build from git
-Here are basic installation instructions for a repository checkout:
+The [README-hacking.md file](README-hacking.md) is about building, modifying
+and checking Bison.  See its "Working from the Repository" section to build
+Bison from the git repo.  Roughly, run:
 
     $ git submodule update --init
     $ ./bootstrap
 
 then proceed with the usual `configure && make` steps.
 
-The file README-hacking.md is about building, modifying and checking Bison.
-
 ## Build from tarball
-See the file INSTALL for generic compilation and installation instructions.
+See the [INSTALL file](INSTALL) for generic compilation and installation
+instructions.
 
 Bison requires GNU m4 1.4.6 or later.  See
 https://ftp.gnu.org/gnu/m4/m4-1.4.6.tar.gz.
 
+## Running a non installed bison
+Once you ran `make`, you might want to toy with this fresh bison before
+installing it.  In that case, do not use `src/bison`: it would use the
+*installed* files (skeletons, etc.), not the local ones.  Use `tests/bison`.
+
 ## Colored diagnostics
 As an experimental feature, diagnostics are now colored, controlled by the
 `--color` and `--style` options.
 
-To use them, install the libtextstyle library before configuring Bison.  It
-is available from https://alpha.gnu.org/gnu/gettext/, for instance
-https://alpha.gnu.org/gnu/gettext/libtextstyle-0.8.tar.gz.
+To use them, install the libtextstyle library, 0.20.5 or newer, before
+configuring Bison.  It is available from https://alpha.gnu.org/gnu/gettext/,
+for instance https://alpha.gnu.org/gnu/gettext/libtextstyle-0.20.5.tar.gz,
+or as part of Gettext 0.21 or newer, for instance
+https://ftp.gnu.org/gnu/gettext/gettext-0.21.tar.gz.
 
 The option --color supports the following arguments:
 - always, yes: Enable colors.
@@ -40,6 +63,13 @@
 then invoke bison with `--style=bison-bw.css`, or set the `BISON_STYLE`
 environment variable to `bison-bw.css`.
 
+In some diagnostics, bison uses libtextstyle to emit special escapes to
+generate clickable hyperlinks.  The environment variable
+`NO_TERM_HYPERLINKS` can be used to suppress them.  This may be useful for
+terminal emulators which produce garbage output when they receive the escape
+sequence for a hyperlink. Currently (as of 2020), this affects some versions
+of emacs, guake, konsole, lxterminal, rxvt, yakuake.
+
 ## Relocatability
 If you pass `--enable-relocatable` to `configure`, Bison is relocatable.
 
@@ -57,7 +87,7 @@
 bison needs ngettext, the generated parsers do not.  To simplify the build
 system, neither are installed if ngettext is not supported, even if
 generated parsers could have been localized.  See
-http://lists.gnu.org/archive/html/bug-bison/2009-08/msg00006.html for more
+https://lists.gnu.org/r/bug-bison/2009-08/msg00006.html for more
 details.
 
 # Questions
@@ -80,23 +110,9 @@
 
 <!--
 
-Copyright (C) 1992, 1998-1999, 2003-2005, 2008-2015, 2018-2019 Free
-Software Foundation, Inc.
-
-This file is part of GNU bison, the GNU Compiler Compiler.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
+LocalWords:  parsers ngettext Texinfo pdf html YYYY ZZZZ ispell american md
+LocalWords:  MERCHANTABILITY GLR LALR IELR submodule init README src bw
+LocalWords:  Relocatability symlinks symlink
 
 Local Variables:
 mode: markdown
@@ -104,7 +120,16 @@
 ispell-dictionary: "american"
 End:
 
-LocalWords:  parsers ngettext Texinfo pdf html YYYY ZZZZ ispell american
-LocalWords:  MERCHANTABILITY
+Copyright (C) 1992, 1998-1999, 2003-2005, 2008-2015, 2018-2021 Free
+Software Foundation, Inc.
+
+This file is part of GNU bison, the GNU Compiler Compiler.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts.  A copy of the license is included in the "GNU Free
+Documentation License" file as part of this distribution.
 
 -->
diff --git a/README-alpha b/README-alpha
new file mode 100644
index 0000000..da7d264
--- /dev/null
+++ b/README-alpha
@@ -0,0 +1,31 @@
+-*- text -*-
+
+This is a test release of this package.  Using it more or less
+implicitly signs you up to help us find whatever problems you report.
+
+The documentation still needs more work.  Suggestions welcome.
+Patches even more welcome.
+
+Please send comments and problem reports about this test release to
+<bug-bison@gnu.org>.  This program will get better only if you report
+the problems you encounter.
+
+-----
+
+Copyright (C) 2002, 2004, 2009-2015, 2018-2021 Free Software Foundation,
+Inc.
+
+This file is part of GNU Bison.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <https://www.gnu.org/licenses/>.
diff --git a/THANKS b/THANKS
index 909192e..be743a2 100644
--- a/THANKS
+++ b/THANKS
@@ -4,8 +4,10 @@
 Aaro Koskinen             aaro.koskinen@iki.fi
 Аскар Сафин               safinaskar@mail.ru
 Adam Sampson              ats@offog.org
+Adrian Vogelsgesang       avogelsgesang@tableau.com
+Ahcheong Lee              dkcjd2000@gmail.com
 Airy Andre                Airy.Andre@edf.fr
-Akim Demaille             akim@lrde.epita.fr
+Akim Demaille             akim@gnu.org
 Albert Chin-A-Young       china@thewrittenword.com
 Alexander Belopolsky      alexb@rentec.com
 Alexandre Duret-Lutz      adl@lrde.epita.fr
@@ -18,6 +20,7 @@
 Antonio Silva Correia     amsilvacorreia@hotmail.com
 Arnold Robbins            arnold@skeeve.com
 Art Haas                  ahaas@neosoft.com
+Arthur Schwarz            aschwarz1309@att.net
 Askar Safin               safinaskar@mail.ru
 Balázs Scheidler          balazs.scheidler@oneidentity.com
 Baron Schwartz            baron@sequent.org
@@ -31,6 +34,7 @@
 Brandon Lucia             blucia@gmail.com
 Brooks Moses              bmoses@google.com
 Bruce Lilly               blilly@erols.com
+Bruno Belanyi             bruno.belanyi@epita.fr
 Bruno Haible              bruno@clisp.org
 Charles-Henri de Boysson  de-boy_c@epita.fr
 Christian Burger          cburger@sunysb.edu
@@ -42,6 +46,7 @@
 Dagobert Michelsen        dam@baltic-online.de
 Daniel Frużyński          daniel@poradnik-webmastera.com
 Daniel Galloway           dg1751@att.com
+Daniela Becker            daniela@lrde.epita.fr
 Daniel Hagerty            hag@gnu.org
 David Barto               david.barto@sparqlcity.com
 David J. MacKenzie        djm@gnu.org
@@ -55,11 +60,15 @@
 Di-an Jan                 dianj@freeshell.org
 Dick Streefland           dick.streefland@altium.nl
 Didier Godefroy           dg@ulysium.net
+Don Macpherson            donmac703@gmail.com
+Dwight Guth               dwight.guth@runtimeverification.com
 Efi Fogel                 efifogel@gmail.com
 Enrico Scholz             enrico.scholz@informatik.tu-chemnitz.de
 Eric Blake                ebb9@byu.net
 Eric S. Raymond           esr@thyrsus.com
 Étienne Renault           renault@lrde.epita.fr
+Evan Lavelle              eml-bison@cyconix.com
+Evan Nemerson             evan@nemerson.com
 Evgeny Stambulchik        fnevgeny@plasma-gate.weizmann.ac.il
 Fabrice Bauzac            noon@cote-dazur.com
 Ferdinand Thiessen        ferdinand@fthiessen.de
@@ -77,8 +86,10 @@
 H. Merijn Brand           h.m.brand@hccnet.nl
 Hans Åberg                haberg-1@telia.com
 Horst Von Brand           vonbrand@inf.utfsm.cl
+Jacob L. Mandelson        jlm-bbison@jlm.ofb.net
 Jan Nieuwenhuizen         janneke@gnu.org
 Jannick                   thirdedition@gmx.net
+Jeff Hammond              jeff_hammond@acm.org
 Jerry Quinn               jlquinn@optonline.net
 Jesse Thilo               jthilo@gnu.org
 Jim Kent                  jkent@arch.sel.sony.com
@@ -96,14 +107,17 @@
 Ken Moffat                zarniwhoop@ntlworld.com
 Kiyoshi Kanazawa          yoi_no_myoujou@yahoo.co.jp
 Lars Maier                lars.maier@tefax.net
+Lars Wendler              polynomial-c@gentoo.org
 László Várady             laszlo.varady93@gmail.com
 Laurent Mascherpa         laurent.mascherpa@epita.fr
 Lie Yan                   lie.yan@kaust.edu.sa
+Maarten De Braekeleer     maarten.debraekeleer@gmail.com
 Magnus Fromreide          magfr@lysator.liu.se
 Marc Autret               autret_m@epita.fr
 Marc Mendiola             mmendiol@usc.edu
 Marc Schönefeld           marc.schoenefeld@gmx.org
 Mark Boyall               wolfeinstein@gmail.com
+Martin Blais              blais@furius.ca
 Martin Jacobs             martin.jacobs@arcor.de
 Martin Mokrejs            mmokrejs@natur.cuni.cz
 Martin Nylin              martin.nylin@linuxmail.org
@@ -128,6 +142,7 @@
 Nicolas Bedon             nicolas.bedon@univ-rouen.fr
 Nicolas Burrus            nicolas.burrus@epita.fr
 Nicolas Tisserand         nicolas.tisserand@epita.fr
+Nikki Valen               nicolettavalencia.nv@gmail.com
 Noah Friedman             friedman@gnu.org
 Odd Arild Olsen           oao@fibula.no
 Oleg Smolsky              oleg.smolsky@pacific-simulators.co.nz
@@ -148,11 +163,13 @@
 Pho                       pho@cielonegro.org
 Piotr Gackiewicz          gacek@intertel.com.pl
 Piotr Marcińczyk          piomar123@gmail.com
+Pramod Kumbhar            pramod.s.kumbhar@gmail.com
 Quentin Hocquet           hocquet@gostai.com
 Quoc Peyrot               chojin@lrde.epita.fr
 R Blake                   blakers@mac.com
 Raja R Harinath           harinath@cs.umn.edu
 Ralf Wildenhues           Ralf.Wildenhues@gmx.de
+Ryan                      dev@splintermail.com
 Rich Wilson               richaw@gmail.com
 Richard Stallman          rms@gnu.org
 Rici Lake                 ricilake@gmail.com
@@ -171,6 +188,7 @@
 Stefano Lattarini         stefano.lattarini@gmail.com
 Stephen Cameron           stephenmcameron@gmail.com
 Steve Murphy              murf@parsetree.com
+Suhwan Song               prada960808@gmail.com
 Sum Wu                    sum@geekhouse.org
 Théophile Ranquet         theophile.ranquet@gmail.com
 Thiru Ramakrishnan        thiru.ramakrishnan@gmail.com
@@ -204,6 +222,7 @@
 Wwp                       subscript@free.fr
 xolodho                   xolodho@gmail.com
 Yuichiro Kaneko           spiketeika@gmail.com
+Yuriy Solodkyy            solodon@gmail.com
 Zack Weinberg             zack@codesourcery.com
 江 祖铭                    jjzuming@outlook.com
 長田偉伸                   cbh34680@iret.co.jp
@@ -219,7 +238,7 @@
 
 -----
 
-Copyright (C) 2000-2015, 2018-2019 Free Software Foundation, Inc.
+Copyright (C) 2000-2015, 2018-2021 Free Software Foundation, Inc.
 
 This file is part of Bison, the GNU Parser Generator.
 
@@ -234,4 +253,4 @@
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
+along with this program.  If not, see <https://www.gnu.org/licenses/>.
diff --git a/TODO b/TODO
index a6e5d04..d89894c 100644
--- a/TODO
+++ b/TODO
@@ -1,121 +1,230 @@
-* Bison 3.6
+* Soon
+** scan-code
+The default case is scanning char-per-char.
+
+    /* By default, grow the string obstack with the input.  */
+    .|\n        STRING_GROW ();
+
+make it more eager?
+
+** Missing tests
+commit 2c294c132528ede23d8ae4959783a67e9ff05ac5
+Author: Vincent Imbimbo <vmi6@cornell.edu>
+Date:   Sat Jan 23 13:25:18 2021 -0500
+
+    cex: fix state-item pruning
+
+See https://lists.gnu.org/r/bug-bison/2021-01/msg00002.html
+
+** pos_set_set
+The current approach is correct, but with poor performances.  Bitsets need
+to support 'assign' and 'shift'.  And instead of extending POS_SET just for
+the out-of-range new values, we need something like doubling the size.
+
+** glr
+There is no test with "Parse on stack %ld rejected by rule %d" in it.
+
+** yyrline etc.
+Clarify that rule numbers in the skeletons are 1-based.
+
+** Macros in C++
+There are many macros that should obey api.prefix: YY_CPLUSPLUS, YY_MOVE,
+etc.
+
+** yyerrok in Java
+And add tests in calc.at, to prepare work for D.
+
+** YYERROR and yynerrs
+We are missing some cases.  Write a test case, and check all the skeletons.
+
+** Cex
+*** Improve gnulib
+Don't do this (counterexample.c):
+
+// This is the fastest way to get the tail node from the gl_list API.
+gl_list_node_t
+list_get_end (gl_list_t list)
+{
+  gl_list_node_t sentinel = gl_list_add_last (list, NULL);
+  gl_list_node_t res = gl_list_previous_node (list, sentinel);
+  gl_list_remove_node (list, sentinel);
+  return res;
+}
+
+*** Ambiguous rewriting
+If the user is stupid enough to have equal rules, then the derivations are
+harder to read:
+
+    Reduce/reduce conflict on tokens $end, "+", "⊕":
+        2 exp: exp "+" exp .
+        3 exp: exp "+" exp .
+      Example                  exp "+" exp •
+      First derivation         exp ::=[ exp "+" exp • ]
+      Example                  exp "+" exp •
+      Second derivation        exp ::=[ exp "+" exp • ]
+
+Do we care about this?  In color, we use twice the same color here, but we
+could try to use the same color for the same rule.
+
+*** XML reports
+Show the counterexamples.  This is going to be really hard and/or painful.
+Unless we play it dumb (little structure).
+
+** Bistromathic
+- How about not evaluating incomplete lines when the text is not finished
+  (as shells do).
+
+** Questions
+*** Java
+- Should i18n be part of the Lexer?  Currently it's a static method of
+  Lexer.
+
+- is there a migration path that would allow to use TokenKinds in
+  yylex?
+
+- define the tokens as an enum too.
+
+- promote YYEOF rather than EOF.
+
+** YYerror
+https://git.savannah.gnu.org/gitweb/?p=gettext.git;a=blob;f=gettext-runtime/intl/plural.y;h=a712255af4f2f739c93336d4ff6556d932a426a5;hb=HEAD
+
+should be updated to not use YYERRCODE.  Returning an undef token is good
+enough.
+
+** Java
+*** calc.at
+Stop hard-coding "Calc".  Adjust local.at (look for FIXME).
+
 ** doc
-I feel its ugly to use the GNU style to declare functions in the doc.  It
+I feel it's ugly to use the GNU style to declare functions in the doc.  It
 generates tons of white space in the page, and may contribute to bad page
 breaks.
 
-Also, we seem to teach YYPRINT very early on, although it should be
-considered deprecated: %printer is superior.
-
-** improve syntax errors (UTF-8, internationalization)
-Bison depends on the current locale.  For instance:
-
-%define parse.error verbose
-%code top {
- #include <stdio.h>
- #include <stdlib.h>
- void yyerror(const char* msg) { fprintf(stderr, "%s\n", msg); }
- int yylex() { return 0; }
-}
-%%
-exp: "↦" | "🎅🐃" | '\n'
-%%
-int main() { return yyparse(); }
-
-gives different results with/without LC_ALL=C.
-
-$ LC_ALL=C /opt/local/bin/bison /tmp/mangle.y -o ascii.c
-$ /opt/local/bin/bison /tmp/mangle.y -o utf8.c
-$ diff -u ascii.c utf8.c -I#line
---- ascii.c     2019-01-12 08:15:35.878010093 +0100
-+++ utf8.c      2019-01-12 08:15:38.856495929 +0100
-@@ -415,9 +415,8 @@
-    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
- static const char *const yytname[] =
- {
--  "$end", "error", "$undefined", "\"\\342\\206\\246\"",
--  "\"\\360\\237\\216\\205\\360\\237\\220\\203\"", "'\\n'", "$accept",
--  "exp", YY_NULLPTR
-+  "$end", "error", "$undefined", "\"↦\"", "\"🎅🐃\"", "'\\n'",
-+  "$accept", "exp", YY_NULLPTR
- };
- #endif
-
-$ gcc ascii.c -o ascii && ./ascii
-syntax error, unexpected $end, expecting "\342\206\246" or "\360\237\216\205\360\237\220\203" or '\n'
-$ gcc utf8.c -o utf8 && ./utf8
-syntax error, unexpected $end, expecting ↦ or 🎅🐃 or '\n'
-
-
-While at it, we should stop using "$end" by default, in favor of "end of
-file", or "end of input", whatever.  See how lalr1.java does that.
-
 ** consistency
-token vs terminal, variable vs non terminal.
-
-** Stop indentation in diagnostics
-Before Bison 2.7, we printed "flatly" the dependencies in long diagnostics:
-
-    input.y:2.7-12: %type redeclaration for exp
-    input.y:1.7-12: previous declaration
-
-In Bison 2.7, we indented them
-
-    input.y:2.7-12: error: %type redeclaration for exp
-    input.y:1.7-12:     previous declaration
-
-Later we quoted the source in the diagnostics, and today we have:
-
-    /tmp/foo.y:1.12-14: warning: symbol FOO redeclared [-Wother]
-        1 | %token FOO FOO
-          |            ^~~
-    /tmp/foo.y:1.8-10:      previous declaration
-        1 | %token FOO FOO
-          |        ^~~
-
-The indentation is no longer helping.  We should probably get rid of it, or
-maybe keep it only when -fno-caret. GCC displays this as a "note":
-
-    $ g++-mp-9 -Wall /tmp/foo.c -c
-    /tmp/foo.c:1:10: error: redefinition of 'int foo'
-        1 | int foo, foo;
-          |          ^~~
-    /tmp/foo.c:1:5: note: 'int foo' previously declared here
-        1 | int foo, foo;
-          |     ^~~
-
-Likewise for Clang, contrary to what I believed (because "note:" is written
-in black, so it doesn't show in my terminal :-)
-
-    $ clang++-mp-8.0 -Wall /tmp/foo.c -c
-    clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated [-Wdeprecated]
-    /tmp/foo.c:1:10: error: redefinition of 'foo'
-    int foo, foo;
-             ^
-    /tmp/foo.c:1:5: note: previous definition is here
-    int foo, foo;
-        ^
-    1 error generated.
-
-See also the item "Complaint submessage indentation" below.
+token vs terminal.
 
 ** api.token.raw
-Maybe we should exhibit the YYUNDEFTOK token.  It could also be assigned a
-semantic value so that yyerror could be used to report invalid lexemes.
-See also the item "$undefined" below.
+The YYUNDEFTOK could be assigned a semantic value so that yyerror could be
+used to report invalid lexemes.
 
-** C++
-Move to int everywhere instead of unsigned?  stack_size, etc.  The parser
-itself uses int (for yylen for instance), yet stack is based on size_t.
+** push parsers
+Consider deprecating impure push parsers.  They add a lot of complexity, for
+a bad feature.  On the other hand, that would make it much harder to sit
+push parsers on top of pull parser.  Which is currently not relevant, since
+push parsers are measurably slower.
 
-Maybe locations should also move to ints.
+** %define parse.error formatted
+How about pushing Bistromathic's yyreport_syntax_error as another standard
+way to generate the error message, and leave to the user the task of
+providing the message formats?  Currently in bistro, it reads:
 
-Paul Eggert already covered most of this.  But before publishing these
-changes, we need to ask our C++ users if they agree with that change, or if
-we need some migration path.  Could be a %define variable, or simply
-%require "3.5".
+    const char *
+    error_format_string (int argc)
+    {
+      switch (argc)
+        {
+        default: /* Avoid compiler warnings. */
+        case 0: return _("%@: syntax error");
+        case 1: return _("%@: syntax error: unexpected %u");
+          // TRANSLATORS: '%@' is a location in a file, '%u' is an
+          // "unexpected token", and '%0e', '%1e'... are expected tokens
+          // at this point.
+          //
+          // For instance on the expression "1 + * 2", you'd get
+          //
+          // 1.5: syntax error: expected - or ( or number or function or variable before *
+        case 2: return _("%@: syntax error: expected %0e before %u");
+        case 3: return _("%@: syntax error: expected %0e or %1e before %u");
+        case 4: return _("%@: syntax error: expected %0e or %1e or %2e before %u");
+        case 5: return _("%@: syntax error: expected %0e or %1e or %2e or %3e before %u");
+        case 6: return _("%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u");
+        case 7: return _("%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u");
+        case 8: return _("%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e or %6e before %u");
+        }
+    }
 
-* Bison 3.7
+The message would have to be generated in a string, and pushed to yyerror.
+Which will be a pain in the neck in yacc.c.
+
+If we want to do that, we should think very carefully about the syntax of
+the format string.
+
+** yyclearin does not invoke the lookahead token's %destructor
+https://lists.gnu.org/r/bug-bison/2018-02/msg00000.html
+Rici:
+
+> Modifying yyclearin so that it calls yydestruct seems like the simplest
+> solution to this issue, but it is conceivable that such a change would
+> break programs which already perform some kind of workaround in order to
+> destruct the lookahead symbol. So it might be necessary to use some kind of
+> compatibility %define, or to create a new replacement macro with a
+> different name such as yydiscardin.
+>
+> At a minimum, the fact that yyclearin does not invoke the %destructor
+> should be highlighted in the documentation, since it is not at all obvious.
+
+** Issues in i18n
+
+Les catégories d'avertissements incluent :
+  conflicts-sr      conflits S/R (activé par défaut)
+  conflicts-rr      conflits R/R (activé par défaut)
+  dangling-alias    l'alias chaîne n'est pas attaché à un symbole
+  deprecated        construction obsolète
+  empty-rule        règle vide sans %empty
+  midrule-values    valeurs de règle intermédiaire non définies ou inutilisées
+  precedence        priorité et associativité inutiles
+  yacc              incompatibilités avec POSIX Yacc
+  other             tous les autres avertissements (activé par défaut)
+  all               tous les avertissements sauf « dangling-alias » et « yacc »
+  no-CATEGORY       désactiver les avertissements dans CATEGORIE
+  none              désactiver tous les avertissements
+  error[=CATEGORY]  traiter les avertissements comme des erreurs
+
+Line -1 and -3 should mention CATEGORIE, not CATEGORY.
+
+* Bison 3.9
+** Rewrite glr.cc (currently glr2.cc)
+*** custom error messages
+
+*** Remove jumps
+We can probably replace setjmp/longjmp with exceptions.  That would help
+tremendously other languages such as D and Java that probably have no
+similar feature.  If we remove jumps, we probably no longer need _Noreturn,
+so simplify `b4_attribute_define([noreturn])` into `b4_attribute_define`.
+
+After discussing with Valentin, it was decided that it's better to stay with
+jumps, since in some places exceptions are ruled out from C++.
+
+*** Coding style
+Move to our coding conventions.  In particular names such as yy_glr_stack,
+not yyGLRStack.
+
+*** yydebug
+It should be a member of the parser object, see lalr1.cc.  Let the parser
+object decide what the debug stream is, rather than open coding std::cerr.
+
+*** Avoid pointers
+There are many places where pointers should be replaced with references.
+Some occurrences were fixed, but now some have improper names:
+
+-yygetToken (int *yycharp, ]b4_namespace_ref[::]b4_parser_class[& yyparser][]b4_pure_if([, glr_stack* yystackp])[]b4_user_formals[)
++yygetToken (int& yycharp, ]b4_namespace_ref[::]b4_parser_class[& yyparser][]b4_pure_if([, glr_stack* yystackp])[]b4_user_formals[)
+
+yycharp is no longer a Pointer.  And yystackp should probably also be a reference.
+
+*** parse.assert
+Currently all the assertions are enabled.  Once we are confident in glr2.cc,
+let parse.assert use the same approach as in lalr1.cc.
+
+*** debug_stream
+Stop using std::cerr everywhere.
+
+*** glr.c
+When glr2.cc fully replaces glr.cc, get rid of the glr.cc scaffolding in
+glr.c.
+
+* Chains
 ** Unit rules / Injection rules (Akim Demaille)
 Maybe we could expand unit rules (or "injections", see
 https://homepages.cwi.nl/~daybuild/daily-books/syntax/2-sdf/sdf.html), i.e.,
@@ -158,18 +267,64 @@
 introduce lr(0) and lalr, just the way we have ielr categories.  The
 "closure" function is too verbose, it should probably have its own category.
 
-"set" can still be used for summariring the important sets.  That would make
+"set" can still be used for summarizing the important sets.  That would make
 tests easy to maintain.
 
 *** complain.*
 Rename these guys as "diagnostics.*" (or "diagnose.*"), since that's the
-name they have in gcc, clang, etc.  Likewise for the complain_* series of
+name they have in GCC, clang, etc.  Likewise for the complain_* series of
 functions.
 
 *** ritem
 states/nstates, rules/nrules, ..., ritem/nritems
 Fix the latter.
 
+*** m4: slot, type, type_tag
+The meaning of type_tag varies depending on api.value.type.  We should avoid
+that and using clear definitions with stable semantics.
+
+* D programming language
+There's a number of features that are missing, here sorted in _suggested_
+order of implementation.
+
+When copying code from other skeletons, keep the comments exactly as they
+are.  Keep the same variable names.  If you change the wording in one place,
+do it in the others too.  In other words: make sure to keep the
+maintenance *simple* by avoiding any gratuitous difference.
+
+** CI
+Check when gdc and ldc.
+
+** GLR Parser
+This is very ambitious.  That's the final boss.  There are currently no
+"clean" implementation to get inspiration from.
+
+glr.c is very clean but:
+- is low-level C
+- is a different skeleton from yacc.c
+
+glr.cc is (currently) an ugly hack: a C++ shell around glr.c.  Valentin
+Tolmer is currently rewriting glr.cc to be clean C++, but he is not
+finished.  There will be a lot a common code between lalr1.cc and glr.cc, so
+eventually I would like them to be fused into a single skeleton, supporting
+both deterministic and generalized parsing.
+
+It would be great for D to also support this.
+
+The basic ideas of GLR are explained here:
+
+https://www.codeproject.com/Articles/5259825/GLR-Parsing-in-Csharp-How-to-Use-The-Most-Powerful
+
+* Better error messages
+The users are not provided with enough tools to forge their error messages.
+See for instance "Is there an option to change the message produced by
+YYERROR_VERBOSE?" by Simon Sobisch, on bison-help.
+
+See also
+https://www.cs.tufts.edu/~nr/cs257/archive/clinton-jefferey/lr-error-messages.pdf
+https://research.swtch.com/yyerror
+http://gallium.inria.fr/~fpottier/publis/fpottier-reachability-cc2016.pdf
+
 * Modernization
 Fix data/skeletons/yacc.c so that it defines YYPTRDIFF_T properly for modern
 and older C++ compilers.  Currently the code defaults to defining it to
@@ -177,12 +332,11 @@
 define it to the same type as the C ptrdiff_t type.
 
 * Completion
-Several features are not available in all the backends.
+Several features are not available in all the back-ends.
 
-- push parsers: glr.cc, lalr1.cc
-- ielr: C++ and Java
-- glr: Java
-- token constructors: Java and C
+- push parsers: glr.c, glr.cc, lalr1.cc (not very difficult)
+- token constructors: Java, C, D (a bit difficult)
+- glr: D, Java (super difficult)
 
 * Bugs
 ** Autotest has quotation issues
@@ -194,12 +348,9 @@
   38: input.at:1730      errors
 
 * Short term
-** Get rid of YYPRINT and b4_toknum
-Besides yytoknum is wrong when api.token.raw is defined.
-
 ** Better design for diagnostics
-The current implementation of diagnostics is adhoc, it grew organically.  It
-works as a series of calls to several functions, with dependency of the
+The current implementation of diagnostics is ad hoc, it grew organically.
+It works as a series of calls to several functions, with dependency of the
 latter calls on the former.  For instance:
 
       complain (&sym->location,
@@ -247,7 +398,7 @@
 should be generic code.
 
 Little effort seems to have been given to factoring these files and their
-rint{,-xml} counterpart. We would very much like to re-use the pretty format
+print{,-xml} counterpart. We would very much like to re-use the pretty format
 of states from .output for the graphs, etc.
 
 Since graphviz dies on medium-to-big grammars, maybe consider an other tool?
@@ -314,68 +465,6 @@
 
 Valentin Tolmer is working on this.
 
-** YYERRCODE
-Defined to 256, but not used, not documented.  Probably the token
-number for the error token, which POSIX wants to be 256, but which
-Bison might renumber if the user used number 256.  Keep fix and doc?
-Throw away?
-
-Also, why don't we output the token name of the error token in the
-output?  It is explicitly skipped:
-
-      /* Skip error token and tokens without identifier.  */
-      if (sym != errtoken && id)
-
-Of course there are issues with name spaces, but if we disable we have
-something which seems to be more simpler and more consistent instead
-of the special case YYERRCODE.
-
-   enum yytokentype {
-     error = 256,
-     // ...
-   };
-
-
-We could (should?) also treat the case of the undef_token, which is
-numbered 257 for yylex, and 2 internal.  Both appear for instance in
-toknum:
-
-  const unsigned short
-  parser::yytoken_number_[] =
-  {
-       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
-
-while here
-
-   enum yytokentype {
-     TOK_EOF = 0,
-     TOK_EQ = 258,
-
-so both 256 and 257 are "mysterious".
-
-  const char*
-  const parser::yytname_[] =
-  {
-  "\"end of command\"", "error", "$undefined", "\"=\"", "\"break\"",
-
-
-** yychar == yyempty_
-The code in yyerrlab reads:
-
-      if (yychar <= YYEOF)
-        {
-          /* Return failure if at end of input.  */
-          if (yychar == YYEOF)
-            YYABORT;
-        }
-
-There are only two yychar that can be <= YYEOF: YYEMPTY and YYEOF.
-But I can't produce the situation where yychar is YYEMPTY here, is it
-really possible?  The test suite does not exercise this case.
-
-This shows that it would be interesting to manage to install skeleton
-coverage analysis to the test suite.
-
 * From lalr1.cc to yacc.c
 ** Single stack
 Merging the three stacks in lalr1.cc simplified the code, prompted for
@@ -391,14 +480,6 @@
 few things scattered around; we need to put them in the repo, and make them
 more useful.
 
-** yysyntax_error
-The code bw glr.c and yacc.c is really alike, we can certainly factor
-some parts.
-
-This should be worked on when we also address the expected improvements for
-error generation (e.g., i18n).
-
-
 * Report
 
 ** Figures
@@ -425,18 +506,20 @@
 presented too.  Shall we try to make a single grammar with all these
 features, or should we have several very small grammars?
 
-** --report=conflict-path
-Provide better assistance for understanding the conflicts by providing
-a sample text exhibiting the (LALR) ambiguity.  See the paper from
-DeRemer and Penello: they already provide the algorithm.
-
-** Statically check for potential ambiguities in GLR grammars
-See <http://www.lsv.fr/~schmitz/pub/expamb.pdf> for an approach.
-An Experimental Ambiguity Detection Tool ∗ Sylvain Schmitz
-LORIA, INRIA Nancy - Grand Est, Nancy, France
-
 * Extensions
+** More languages?
+Well, only if there is really some demand for it.
+
+*** PHP
+https://github.com/scfc/bison-php/blob/master/data/lalr1.php
+
+*** Python
+https://lists.gnu.org/r/bison-patches/2013-09/msg00000.html and following
+
 ** Multiple start symbols
+Revert a70e75b8a41755ab96ab211a0ea111ac68a4aadd.
+Revert tests: disable "Multistart reports".
+
 Would be very useful when parsing closely related languages.  The idea is to
 declare several start symbols, for instance
 
@@ -458,21 +541,27 @@
 initial token (YY_START_STMT, YY_START_EXPR) be shifted first in the
 corresponding parse function.
 
-** Better error messages
-The users are not provided with enough tools to forge their error messages.
-See for instance "Is there an option to change the message produced by
-YYERROR_VERBOSE?" by Simon Sobisch, on bison-help.
+*** Number of useless symbols
+AT_TEST(
+[[%start exp;
+exp: exp;]],
+[[input.y: warning: 2 nonterminals useless in grammar [-Wother]
+input.y: warning: 2 rules useless in grammar [-Wother]
+input.y:2.8-10: error: start symbol exp does not derive any sentence]])
 
-See also
-https://www.cs.tufts.edu/~nr/cs257/archive/clinton-jefferey/lr-error-messages.pdf
-and https://research.swtch.com/yyerror.
+We should say "1 nonterminal": the other one is $accept, which should not
+participate in the count.
+
+*** Tokens
+Do we want to disallow terminal start symbols?  The limitation is not
+technical.  Can it be useful to someone to "parse" a token?
 
 ** %include
 This is a popular demand.  We already made many changes in the parser that
 should make this reasonably easy to implement.
 
 Bruce Mardle <marblypup@yahoo.co.uk>
-https://lists.gnu.org/archive/html/bison-patches/2015-09/msg00000.html
+https://lists.gnu.org/r/bison-patches/2015-09/msg00000.html
 
 However, there are many other things to do before having such a feature,
 because I don't want a % equivalent to #include (which we all learned to
@@ -481,11 +570,11 @@
 name spaces.
 
 ** Push parsers
-There is demand for push parsers in Java and C++.  And GLR I guess.
+There is demand for push parsers in C++.
 
 ** Generate code instead of tables
 This is certainly quite a lot of work.  See
-http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.50.4539.
+https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.50.4539.
 
 ** $-1
 We should find a means to provide an access to values deep in the
@@ -525,13 +614,6 @@
 XML output for GNU Bison
    http://yaxx.sourceforge.net/
 
-** Counterexample generation
-https://lists.gnu.org/archive/html/bug-bison/2016-06/msg00000.html
-http://www.cs.cornell.edu/andru/papers/cupex/
-
-Andrew Myers and Vincent Imbimbo are working on this item, see
-https://github.com/akimd/bison/issues/12
-
 * Coding system independence
 Paul notes:
 
@@ -563,15 +645,6 @@
 
 This is a prerequisite for modules.
 
-* $undefined
-From Hans:
-- If the Bison generated parser experiences an undefined number in the
-character range, that character is written out in diagnostic messages, an
-addition to the $undefined value.
-
-Suggest: Change the name $undefined to undefined; looks better in outputs.
-
-
 * Pre and post actions.
 From: Florian Krohm <florian@edamail.fishkill.ibm.com>
 Subject: YYACT_EPILOGUE
@@ -604,28 +677,47 @@
 Equip the parser with a means to create the (visual) parse tree.
 
 
+-----
+
+# LocalWords:  Cex gnulib gl Bistromathic TokenKinds yylex enum YYEOF EOF
+# LocalWords:  YYerror gettext af hb YYERRCODE undef calc FIXME dev yyerror
+# LocalWords:  Autoconf YYUNDEFTOK lexemes parsers Bistromathic's yyreport
+# LocalWords:  const argc yacc yyclearin lookahead destructor Rici incluent
+# LocalWords:  yydestruct yydiscardin catégories d'avertissements sr activé
+# LocalWords:  conflits défaut rr l'alias chaîne n'est attaché un symbole
+# LocalWords:  obsolète règle vide midrule valeurs de intermédiaire ou avec
+# LocalWords:  définies inutilisées priorité associativité inutiles POSIX
+# LocalWords:  incompatibilités tous les autres avertissements sauf dans rp
+# LocalWords:  désactiver CATEGORIE traiter comme des erreurs glr Akim bool
+# LocalWords:  Demaille arith lalr goto struct pathlen nullable ntokens lr
+# LocalWords:  nterm bitsetv ielr ritem nstates nrules nritems yysymbol EQ
+# LocalWords:  SymbolKind YYEMPTY YYUNDEF YYTNAME NUM yyntokens yytname sed
+# LocalWords:  nonterminals yykind yycode YYNAMES yynames init getName conv
+# LocalWords:  TokenKind ival yychar yylval yylexer Tolmer hoc
+# LocalWords:  Sobisch YYPTRDIFF ptrdiff Autotest toknum yytoknum
+# LocalWords:  sym Wother stderr FP fixits xgettext fdiagnostics Graphviz
+# LocalWords:  graphviz VCG bitset xml bw maint yytoken YYABORT deps
+# LocalWords:  YYACCEPT yytranslate nonnegative destructors yyerrlab repo
+# LocalWords:  backends stmt expr yy Mardle baz qux Vadim Maslow CPP cpp
+# LocalWords:  yydebug gcc UCHAR EBCDIC gung PDP NUL Pre Florian Krohm utf
+# LocalWords:  YYACT YYLLOC YYLSP yyval yyvsp yylen yyloc yylsp endif
+# LocalWords:  ispell american
+
 Local Variables:
 mode: outline
 coding: utf-8
 fill-column: 76
+ispell-dictionary: "american"
 End:
 
------
-
-Copyright (C) 2001-2004, 2006, 2008-2015, 2018-2019 Free Software
+Copyright (C) 2001-2004, 2006, 2008-2015, 2018-2021 Free Software
 Foundation, Inc.
 
 This file is part of Bison, the GNU Compiler Compiler.
 
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts.  A copy of the license is included in the "GNU Free
+Documentation License" file as part of this distribution.
diff --git a/aclocal.m4 b/aclocal.m4
index 01802fc..57ed9d2 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.16.4 -*- Autoconf -*-
 
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -14,13 +14,13 @@
 m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
-[m4_warning([this file was generated for autoconf 2.69.
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],,
+[m4_warning([this file was generated for autoconf 2.71.
 You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically 'autoreconf'.])])
 
-# Copyright (C) 2002-2018 Free Software Foundation, Inc.
+# Copyright (C) 2002-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,7 @@
 [am__api_version='1.16'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.16.1], [],
+m4_if([$1], [1.16.4], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -51,14 +51,14 @@
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.16.1])dnl
+[AM_AUTOMAKE_VERSION([1.16.4])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -110,7 +110,7 @@
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+# Copyright (C) 1997-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -141,7 +141,7 @@
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -332,7 +332,7 @@
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -371,7 +371,9 @@
   done
   if test $am_rc -ne 0; then
     AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
-    for automatic dependency tracking.  Try re-running configure with the
+    for automatic dependency tracking.  If GNU make was not used, consider
+    re-running the configure script with MAKE="gmake" (or whatever is
+    necessary).  You can also try re-running configure with the
     '--disable-dependency-tracking' option to at least be able to build
     the package (albeit without support for automatic dependency tracking).])
   fi
@@ -398,7 +400,7 @@
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -462,7 +464,7 @@
 [_AM_SET_OPTIONS([$1])dnl
 dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
 m4_if(
-  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+  m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]),
   [ok:ok],,
   [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
  AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
@@ -514,6 +516,20 @@
 		  [m4_define([AC_PROG_OBJCXX],
 			     m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
 ])
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+  CTAGS=ctags
+fi
+AC_SUBST([CTAGS])
+if test -z "$ETAGS"; then
+  ETAGS=etags
+fi
+AC_SUBST([ETAGS])
+if test -z "$CSCOPE"; then
+  CSCOPE=cscope
+fi
+AC_SUBST([CSCOPE])
+
 AC_REQUIRE([AM_SILENT_RULES])dnl
 dnl The testsuite driver may need to know about EXEEXT, so add the
 dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This
@@ -595,7 +611,7 @@
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -616,7 +632,7 @@
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2018 Free Software Foundation, Inc.
+# Copyright (C) 2003-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -637,7 +653,7 @@
 
 # Check to see how 'make' treats includes.	            -*- Autoconf -*-
 
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -680,7 +696,7 @@
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+# Copyright (C) 1997-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -701,12 +717,7 @@
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
 AC_REQUIRE_AUX_FILE([missing])dnl
 if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
+  MISSING="\${SHELL} '$am_aux_dir/missing'"
 fi
 # Use eval to expand $SHELL
 if eval "$MISSING --is-lightweight"; then
@@ -719,7 +730,7 @@
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -748,7 +759,7 @@
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -795,7 +806,7 @@
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -814,7 +825,7 @@
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -895,7 +906,7 @@
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2018 Free Software Foundation, Inc.
+# Copyright (C) 2009-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -955,7 +966,7 @@
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -983,7 +994,7 @@
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2018 Free Software Foundation, Inc.
+# Copyright (C) 2006-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1002,7 +1013,7 @@
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2018 Free Software Foundation, Inc.
+# Copyright (C) 2004-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1136,51 +1147,74 @@
 m4_include([m4/00gnulib.m4])
 m4_include([m4/__inline.m4])
 m4_include([m4/absolute-header.m4])
+m4_include([m4/access.m4])
 m4_include([m4/alloca.m4])
 m4_include([m4/asm-underscore.m4])
 m4_include([m4/assert.m4])
 m4_include([m4/bison-check-compiler-flag.m4])
 m4_include([m4/bison-cxx-std.m4])
 m4_include([m4/bison-i18n.m4])
+m4_include([m4/builtin-expect.m4])
 m4_include([m4/c-working.m4])
 m4_include([m4/calloc.m4])
 m4_include([m4/canonicalize.m4])
+m4_include([m4/chdir-long.m4])
 m4_include([m4/clock_time.m4])
 m4_include([m4/close.m4])
+m4_include([m4/closedir.m4])
 m4_include([m4/codeset.m4])
 m4_include([m4/config-h.m4])
 m4_include([m4/configmake.m4])
 m4_include([m4/cxx.m4])
-m4_include([m4/dirname.m4])
+m4_include([m4/d-ino.m4])
+m4_include([m4/dirent_h.m4])
+m4_include([m4/dirfd.m4])
 m4_include([m4/double-slash-root.m4])
+m4_include([m4/dup.m4])
 m4_include([m4/dup2.m4])
+m4_include([m4/eaccess.m4])
 m4_include([m4/eealloc.m4])
 m4_include([m4/environ.m4])
 m4_include([m4/errno_h.m4])
 m4_include([m4/error.m4])
+m4_include([m4/execute.m4])
 m4_include([m4/exponentd.m4])
 m4_include([m4/exponentf.m4])
 m4_include([m4/exponentl.m4])
 m4_include([m4/extensions.m4])
 m4_include([m4/extern-inline.m4])
 m4_include([m4/fatal-signal.m4])
+m4_include([m4/fchdir.m4])
 m4_include([m4/fcntl-o.m4])
 m4_include([m4/fcntl.m4])
 m4_include([m4/fcntl_h.m4])
+m4_include([m4/fdopendir.m4])
+m4_include([m4/ffs.m4])
+m4_include([m4/ffsl.m4])
+m4_include([m4/filenamecat.m4])
+m4_include([m4/findprog-in.m4])
 m4_include([m4/flex.m4])
 m4_include([m4/float_h.m4])
 m4_include([m4/fopen.m4])
 m4_include([m4/fpending.m4])
 m4_include([m4/fpieee.m4])
 m4_include([m4/fprintf-posix.m4])
+m4_include([m4/free.m4])
 m4_include([m4/frexp.m4])
 m4_include([m4/frexpl.m4])
 m4_include([m4/fseterr.m4])
 m4_include([m4/fstat.m4])
+m4_include([m4/fstatat.m4])
 m4_include([m4/fsync.m4])
+m4_include([m4/getcwd-abort-bug.m4])
+m4_include([m4/getcwd-path-max.m4])
+m4_include([m4/getcwd.m4])
+m4_include([m4/getdelim.m4])
 m4_include([m4/getdtablesize.m4])
 m4_include([m4/gethrxtime.m4])
+m4_include([m4/getline.m4])
 m4_include([m4/getopt.m4])
+m4_include([m4/getpagesize.m4])
 m4_include([m4/getprogname.m4])
 m4_include([m4/getrusage.m4])
 m4_include([m4/gettext.m4])
@@ -1190,10 +1224,12 @@
 m4_include([m4/gnulib-comp.m4])
 m4_include([m4/host-cpu-c-abi.m4])
 m4_include([m4/iconv.m4])
+m4_include([m4/iconv_h.m4])
+m4_include([m4/iconv_open.m4])
 m4_include([m4/include_next.m4])
+m4_include([m4/inline.m4])
 m4_include([m4/intlmacosx.m4])
 m4_include([m4/intmax_t.m4])
-m4_include([m4/inttypes-pri.m4])
 m4_include([m4/inttypes.m4])
 m4_include([m4/inttypes_h.m4])
 m4_include([m4/isnan.m4])
@@ -1201,6 +1237,8 @@
 m4_include([m4/isnanf.m4])
 m4_include([m4/isnanl.m4])
 m4_include([m4/iswblank.m4])
+m4_include([m4/iswdigit.m4])
+m4_include([m4/iswxdigit.m4])
 m4_include([m4/javacomp.m4])
 m4_include([m4/javaexec.m4])
 m4_include([m4/jm-winsz1.m4])
@@ -1219,9 +1257,8 @@
 m4_include([m4/locale-fr.m4])
 m4_include([m4/locale-ja.m4])
 m4_include([m4/locale-zh.m4])
-m4_include([m4/localtime-buffer.m4])
+m4_include([m4/locale_h.m4])
 m4_include([m4/lock.m4])
-m4_include([m4/longlong.m4])
 m4_include([m4/lstat.m4])
 m4_include([m4/m4.m4])
 m4_include([m4/malloc.m4])
@@ -1234,12 +1271,15 @@
 m4_include([m4/mbstate_t.m4])
 m4_include([m4/mbswidth.m4])
 m4_include([m4/memchr.m4])
+m4_include([m4/mempcpy.m4])
+m4_include([m4/memrchr.m4])
 m4_include([m4/minmax.m4])
 m4_include([m4/mmap-anon.m4])
 m4_include([m4/mode_t.m4])
 m4_include([m4/msvc-inval.m4])
 m4_include([m4/msvc-nothrow.m4])
 m4_include([m4/multiarch.m4])
+m4_include([m4/musl.m4])
 m4_include([m4/nls.m4])
 m4_include([m4/nocrash.m4])
 m4_include([m4/non-recursive-gnulib-prefix-hack.m4])
@@ -1249,11 +1289,15 @@
 m4_include([m4/open-cloexec.m4])
 m4_include([m4/open-slash.m4])
 m4_include([m4/open.m4])
+m4_include([m4/openat.m4])
+m4_include([m4/opendir.m4])
 m4_include([m4/pathmax.m4])
 m4_include([m4/perror.m4])
+m4_include([m4/pipe.m4])
 m4_include([m4/pipe2.m4])
 m4_include([m4/po.m4])
 m4_include([m4/posix_spawn.m4])
+m4_include([m4/posix_spawn_faction_addchdir.m4])
 m4_include([m4/printf-frexp.m4])
 m4_include([m4/printf-frexpl.m4])
 m4_include([m4/printf-posix-rpl.m4])
@@ -1264,14 +1308,20 @@
 m4_include([m4/quotearg.m4])
 m4_include([m4/raise.m4])
 m4_include([m4/rawmemchr.m4])
+m4_include([m4/readdir.m4])
+m4_include([m4/readline.m4])
 m4_include([m4/readlink.m4])
 m4_include([m4/realloc.m4])
+m4_include([m4/reallocarray.m4])
 m4_include([m4/relocatable-lib.m4])
 m4_include([m4/relocatable.m4])
 m4_include([m4/rename.m4])
+m4_include([m4/rewinddir.m4])
 m4_include([m4/rmdir.m4])
+m4_include([m4/save-cwd.m4])
 m4_include([m4/sched_h.m4])
 m4_include([m4/setenv.m4])
+m4_include([m4/setlocale_null.m4])
 m4_include([m4/sh-filename.m4])
 m4_include([m4/sig_atomic_t.m4])
 m4_include([m4/sigaction.m4])
@@ -1287,7 +1337,7 @@
 m4_include([m4/ssize_t.m4])
 m4_include([m4/stat-time.m4])
 m4_include([m4/stat.m4])
-m4_include([m4/std-gnu11.m4])
+m4_include([m4/stdalign.m4])
 m4_include([m4/stdbool.m4])
 m4_include([m4/stddef_h.m4])
 m4_include([m4/stdint.m4])
@@ -1295,14 +1345,18 @@
 m4_include([m4/stdio_h.m4])
 m4_include([m4/stdlib_h.m4])
 m4_include([m4/stpcpy.m4])
+m4_include([m4/stpncpy.m4])
 m4_include([m4/strchrnul.m4])
 m4_include([m4/strdup.m4])
 m4_include([m4/strerror.m4])
 m4_include([m4/strerror_r.m4])
 m4_include([m4/string_h.m4])
+m4_include([m4/strings_h.m4])
 m4_include([m4/strndup.m4])
 m4_include([m4/strnlen.m4])
+m4_include([m4/strtod.m4])
 m4_include([m4/strverscmp.m4])
+m4_include([m4/sys_ioctl_h.m4])
 m4_include([m4/sys_resource_h.m4])
 m4_include([m4/sys_socket_h.m4])
 m4_include([m4/sys_stat_h.m4])
@@ -1310,10 +1364,12 @@
 m4_include([m4/sys_times_h.m4])
 m4_include([m4/sys_types_h.m4])
 m4_include([m4/sys_wait_h.m4])
+m4_include([m4/termios_h.m4])
 m4_include([m4/threadlib.m4])
 m4_include([m4/time_h.m4])
 m4_include([m4/timespec.m4])
 m4_include([m4/tls.m4])
+m4_include([m4/unicodeio.m4])
 m4_include([m4/unistd-safer.m4])
 m4_include([m4/unistd_h.m4])
 m4_include([m4/unlink.m4])
@@ -1322,6 +1378,7 @@
 m4_include([m4/vasprintf-posix.m4])
 m4_include([m4/vasprintf.m4])
 m4_include([m4/vfprintf-posix.m4])
+m4_include([m4/visibility.m4])
 m4_include([m4/vsnprintf-posix.m4])
 m4_include([m4/vsnprintf.m4])
 m4_include([m4/vsprintf-posix.m4])
@@ -1337,3 +1394,5 @@
 m4_include([m4/xalloc.m4])
 m4_include([m4/xsize.m4])
 m4_include([m4/xstrndup.m4])
+m4_include([m4/year2038.m4])
+m4_include([m4/zzgnulib.m4])
diff --git a/android_regen.sh b/android_regen.sh
index 6cad17f..e41a749 100755
--- a/android_regen.sh
+++ b/android_regen.sh
@@ -23,21 +23,27 @@
 UNAME=$(uname | tr 'A-Z' 'a-z')
 NAME=linux_glibc
 TARGET=glibc
+config_opts=()
 if [ $UNAME == "darwin" ]; then
   NAME=darwin
   TARGET=darwin
+  # vfork is deprecated on Mac, so always fallback to fork
+  config_opts+=("ac_cv_func_vfork=no")
+  # we'd need to link to libiconv
+  config_opts+=("am_cv_func_iconv=no")
+else
+  export CC="$ANDROID_BUILD_TOP/prebuilts/clang/host/linux-x86/$(cd $ANDROID_BUILD_TOP; build/soong/scripts/get_clang_version.py)/bin/clang"
 fi
 
-if [ "$1" = "--musl_sysroot" ]; then
+if [ "$1" = "--musl" ]; then
   NAME=linux_musl
   TARGET=musl
-  sysroot=$2
-  export CC="${sysroot}/bin/musl-clang"
+  sysroot="${ANDROID_BUILD_TOP}/prebuilts/build-tools/sysroots/x86_64-linux-musl"
+  export CFLAGS="--sysroot=${sysroot} -target x86_64-linux-musl -fuse-ld=lld"
   export LDFLAGS="--rtlib=compiler-rt"
 fi
 
 if [ $NAME == "linux_glibc" ]; then
-  export CC="$ANDROID_BUILD_TOP/prebuilts/clang/host/linux-x86/$(cd $ANDROID_BUILD_TOP; build/soong/scripts/get_clang_version.py)/bin/clang"
   export CFLAGS="--sysroot=$ANDROID_BUILD_TOP/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/sysroot"
   export LDFLAGS="--sysroot=$ANDROID_BUILD_TOP/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/sysroot -B$ANDROID_BUILD_TOP/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/lib/gcc/x86_64-linux/4.8.3 -L$ANDROID_BUILD_TOP/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/lib/gcc/x86_64-linux/4.8.3 -L$ANDROID_BUILD_TOP/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/x86_64-linux/lib64"
 fi
@@ -55,12 +61,26 @@
   --enable-relocatable \
   --prefix=/nonexistent \
   --exec-prefix=/nonexistent/$NAME-x86 \
-  --datarootdir=/nonexistent/common
+  --datarootdir=/nonexistent/common \
+  "${config_opts[@]}"
 
+# Don't try to use aclocal/automake/etc
+touch ../../aclocal.m4
+touch ../../configure
+touch ../../Makefile.in
+
+# Don't attempt to update source timestamps
+touch ../../doc/stamp-vti
+
+make -fMakefile Makefile
 echo 'gensrcs: $(BUILT_SOURCES)' >>Makefile
 make -fMakefile gensrcs
 make -fMakefile src/bison
+
+mkdir -p ../malloc
+rm -rf ../*.h ../malloc/*.h
 mv lib/*.h ../
+mv lib/malloc/*.h ../malloc/
 
 GENBP=../Android.bp
 rm -f $GENBP
diff --git a/build-aux/Darwin.valgrind b/build-aux/Darwin.valgrind
index c791147..23ab441 100644
--- a/build-aux/Darwin.valgrind
+++ b/build-aux/Darwin.valgrind
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2012-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -11,7 +11,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 # Valgrind suppression file for Bison.
 
diff --git a/build-aux/Linux.valgrind b/build-aux/Linux.valgrind
index 729dd5e..6b66920 100644
--- a/build-aux/Linux.valgrind
+++ b/build-aux/Linux.valgrind
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2012-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -11,7 +11,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 # Valgrind suppression file for Bison.
 
diff --git a/build-aux/announce-gen b/build-aux/announce-gen
index 8fe0cc8..f3b5461 100755
--- a/build-aux/announce-gen
+++ b/build-aux/announce-gen
@@ -3,7 +3,7 @@
 
 # Generate a release announcement message.
 
-# Copyright (C) 2002-2019 Free Software Foundation, Inc.
+# Copyright (C) 2002-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -31,16 +31,18 @@
 # are valid code in both sh and perl.  When executed by sh, they re-execute
 # the script through the perl program found in $PATH.  The '-x' option
 # is essential as well; without it, perl would re-execute the script
-# through /bin/sh.  When executed by  perl, the next two lines are a no-op.
+# through /bin/sh.  When executed by perl, the next two lines are a no-op.
 eval 'exec perl -wSx "$0" "$@"'
      if 0;
 
-my $VERSION = '2018-03-07 03:46'; # UTC
+my $VERSION = '2021-08-04 09:17'; # UTC
 # The definition above must lie within the first 8 lines in order
 # for the Emacs time-stamp write hook (at end) to update it.
 # If you change this file with Emacs, please let the write hook
 # do its job.  Otherwise, update this string manually.
 
+my $copyright_year = '2021';
+
 use strict;
 use Getopt::Long;
 use POSIX qw(strftime);
@@ -48,13 +50,7 @@
 (my $ME = $0) =~ s|.*/||;
 
 my %valid_release_types = map {$_ => 1} qw (alpha beta stable);
-my @archive_suffixes = ('tar.gz', 'tar.bz2', 'tar.lzma', 'tar.xz');
-my %digest_classes =
-  (
-   'md5' => (eval { require Digest::MD5; } and 'Digest::MD5'),
-   'sha1' => ((eval { require Digest::SHA; } and 'Digest::SHA')
-              or (eval { require Digest::SHA1; } and 'Digest::SHA1'))
-  );
+my @archive_suffixes = qw (tar.gz tar.bz2 tar.lz tar.lzma tar.xz);
 my $srcdir = '.';
 
 sub usage ($)
@@ -94,7 +90,7 @@
                                 VERSION is the result of running git describe
                                 in the gnulib source directory.
                                 required if gnulib is in TOOL_LIST.
-   --no-print-checksums         do not emit MD5 or SHA1 checksums
+   --no-print-checksums         do not emit SHA1 or SHA256 checksums
    --archive-suffix=SUF         add SUF to the list of archive suffixes
    --mail-headers=HEADERS       a space-separated list of mail headers, e.g.,
                                 To: x\@example.com Cc: y-announce\@example.com,...
@@ -161,7 +157,7 @@
 
 =item C<print_checksums (@file)
 
-Print the MD5 and SHA1 signature section for each C<@file>.
+Print the SHA1 and SHA256 signature section for each C<@file>.
 
 =cut
 
@@ -169,23 +165,18 @@
 {
   my (@file) = @_;
 
-  print "Here are the MD5 and SHA1 checksums:\n";
+  print "Here are the SHA1 and SHA256 checksums:\n";
   print "\n";
 
-  foreach my $meth (qw (md5 sha1))
+  use Digest::file qw(digest_file_hex digest_file_base64);
+
+  foreach my $f (@file)
     {
-      my $class = $digest_classes{$meth} or next;
-      foreach my $f (@file)
-        {
-          open IN, '<', $f
-            or die "$ME: $f: cannot open for reading: $!\n";
-          binmode IN;
-          my $dig = $class->new->addfile(*IN)->hexdigest;
-          close IN;
-          print "$dig  $f\n";
-        }
+      print digest_file_hex($f, "SHA-1"), "  $f\n";
+      print digest_file_base64($f, "SHA-256"), "  $f\n";
     }
-  print "\n";
+  print "\nThe SHA256 checksum is base64 encoded, instead of the\n";
+  print "hexadecimal encoding that most checksum tools default to.\n\n";
 }
 
 =item C<print_news_deltas ($news_file, $prev_version, $curr_version)
@@ -371,8 +362,8 @@
 }
 
 {
-  # Neutralize the locale, so that, for instance, "du" does not
-  # issue "1,2" instead of "1.2", what confuses our regexps.
+  # Use the C locale so that, for instance, "du" does not
+  # print "1,2" instead of "1.2", which would confuse our regexps.
   $ENV{LC_ALL} = "C";
 
   my $mail_headers;
@@ -413,7 +404,19 @@
      'archive-suffix=s'   => \@archive_suffixes,
 
      help => sub { usage 0 },
-     version => sub { print "$ME version $VERSION\n"; exit },
+     version =>
+       sub
+       {
+         print "$ME version $VERSION\n";
+         print "Copyright (C) $copyright_year Free Software Foundation, Inc.\n";
+         print "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.\n"
+             . "This is free software: you are free to change and redistribute it.\n"
+             . "There is NO WARRANTY, to the extent permitted by law.\n";
+         print "\n";
+         my $author = "Jim Meyering";
+         print "Written by $author.\n";
+         exit
+       },
     ) or usage 1;
 
   my $fail = 0;
diff --git a/build-aux/compile b/build-aux/compile
index 99e5052..df363c8 100755
--- a/build-aux/compile
+++ b/build-aux/compile
@@ -3,7 +3,7 @@
 
 scriptversion=2018-03-07.03; # UTC
 
-# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
 # Written by Tom Tromey <tromey@cygnus.com>.
 #
 # This program is free software; you can redistribute it and/or modify
@@ -53,7 +53,7 @@
 	  MINGW*)
 	    file_conv=mingw
 	    ;;
-	  CYGWIN*)
+	  CYGWIN* | MSYS*)
 	    file_conv=cygwin
 	    ;;
 	  *)
@@ -67,7 +67,7 @@
 	mingw/*)
 	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
 	  ;;
-	cygwin/*)
+	cygwin/* | msys/*)
 	  file=`cygpath -m "$file" || echo "$file"`
 	  ;;
 	wine/*)
diff --git a/build-aux/config.guess b/build-aux/config.guess
index 7f9ebbe..e81d3ae 100755
--- a/build-aux/config.guess
+++ b/build-aux/config.guess
@@ -1,8 +1,10 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright 1992-2019 Free Software Foundation, Inc.
+#   Copyright 1992-2021 Free Software Foundation, Inc.
 
-timestamp='2019-09-10'
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2021-06-03'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -27,11 +29,19 @@
 # Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 #
 # You can get the latest version of this script from:
-# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
 #
 # Please send patches to <config-patches@gnu.org>.
 
 
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX.  However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+
 me=`echo "$0" | sed -e 's,.*/,,'`
 
 usage="\
@@ -50,7 +60,7 @@
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright 1992-2019 Free Software Foundation, Inc.
+Copyright 1992-2021 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -84,6 +94,9 @@
   exit 1
 fi
 
+# Just in case it came from the environment.
+GUESS=
+
 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a
 # compiler to aid in system detection is discouraged as it requires
 # temporary files to be created and, as you can see below, it is a
@@ -99,8 +112,10 @@
 trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
 
 set_cc_for_build() {
+    # prevent multiple calls if $tmp is already set
+    test "$tmp" && return 0
     : "${TMPDIR=/tmp}"
-    # shellcheck disable=SC2039
+    # shellcheck disable=SC2039,SC3028
     { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
 	{ test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
 	{ tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
@@ -110,7 +125,7 @@
 	,,)    echo "int x;" > "$dummy.c"
 	       for driver in cc gcc c89 c99 ; do
 		   if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
-		       CC_FOR_BUILD="$driver"
+		       CC_FOR_BUILD=$driver
 		       break
 		   fi
 	       done
@@ -131,14 +146,12 @@
 
 UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
 UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
 UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
 
-case "$UNAME_SYSTEM" in
+case $UNAME_SYSTEM in
 Linux|GNU|GNU/*)
-	# If the system lacks a compiler, then just pick glibc.
-	# We could probably try harder.
-	LIBC=gnu
+	LIBC=unknown
 
 	set_cc_for_build
 	cat <<-EOF > "$dummy.c"
@@ -147,24 +160,37 @@
 	LIBC=uclibc
 	#elif defined(__dietlibc__)
 	LIBC=dietlibc
-	#else
+	#elif defined(__GLIBC__)
 	LIBC=gnu
+	#else
+	#include <stdarg.h>
+	/* First heuristic to detect musl libc.  */
+	#ifdef __DEFINED_va_list
+	LIBC=musl
+	#endif
 	#endif
 	EOF
-	eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`"
+	cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+	eval "$cc_set_libc"
 
-	# If ldd exists, use it to detect musl libc.
-	if command -v ldd >/dev/null && \
-		ldd --version 2>&1 | grep -q ^musl
-	then
-	    LIBC=musl
+	# Second heuristic to detect musl libc.
+	if [ "$LIBC" = unknown ] &&
+	   command -v ldd >/dev/null &&
+	   ldd --version 2>&1 | grep -q ^musl; then
+		LIBC=musl
+	fi
+
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	if [ "$LIBC" = unknown ]; then
+		LIBC=gnu
 	fi
 	;;
 esac
 
 # Note: order is significant - the case branches are not exclusive.
 
-case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
+case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in
     *:NetBSD:*:*)
 	# NetBSD (nbsd) targets should (where applicable) match one or
 	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
@@ -176,12 +202,12 @@
 	#
 	# Note: NetBSD doesn't particularly care about the vendor
 	# portion of the name.  We always set it to "unknown".
-	sysctl="sysctl -n hw.machine_arch"
 	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
-	    "/sbin/$sysctl" 2>/dev/null || \
-	    "/usr/sbin/$sysctl" 2>/dev/null || \
+	    /sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+	    /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \
 	    echo unknown)`
-	case "$UNAME_MACHINE_ARCH" in
+	case $UNAME_MACHINE_ARCH in
+	    aarch64eb) machine=aarch64_be-unknown ;;
 	    armeb) machine=armeb-unknown ;;
 	    arm*) machine=arm-unknown ;;
 	    sh3el) machine=shl-unknown ;;
@@ -190,13 +216,13 @@
 	    earmv*)
 		arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
 		endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
-		machine="${arch}${endian}"-unknown
+		machine=${arch}${endian}-unknown
 		;;
-	    *) machine="$UNAME_MACHINE_ARCH"-unknown ;;
+	    *) machine=$UNAME_MACHINE_ARCH-unknown ;;
 	esac
 	# The Operating System including object format, if it has switched
 	# to ELF recently (or will in the future) and ABI.
-	case "$UNAME_MACHINE_ARCH" in
+	case $UNAME_MACHINE_ARCH in
 	    earm*)
 		os=netbsdelf
 		;;
@@ -217,7 +243,7 @@
 		;;
 	esac
 	# Determine ABI tags.
-	case "$UNAME_MACHINE_ARCH" in
+	case $UNAME_MACHINE_ARCH in
 	    earm*)
 		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
 		abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
@@ -228,7 +254,7 @@
 	# thus, need a distinct triplet. However, they do not need
 	# kernel version information, so it can be replaced with a
 	# suitable tag, in the style of linux-gnu.
-	case "$UNAME_VERSION" in
+	case $UNAME_VERSION in
 	    Debian*)
 		release='-gnu'
 		;;
@@ -239,51 +265,57 @@
 	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
 	# contains redundant information, the shorter form:
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "$machine-${os}${release}${abi-}"
-	exit ;;
+	GUESS=$machine-${os}${release}${abi-}
+	;;
     *:Bitrig:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
-	echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE"
-	exit ;;
+	GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE
+	;;
     *:OpenBSD:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-	echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE"
-	exit ;;
+	GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE
+	;;
+    *:SecBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'`
+	GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE
+	;;
     *:LibertyBSD:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
-	echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE"
-	exit ;;
+	GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE
+	;;
     *:MidnightBSD:*:*)
-	echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE
+	;;
     *:ekkoBSD:*:*)
-	echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE
+	;;
     *:SolidBSD:*:*)
-	echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE
+	;;
     *:OS108:*:*)
-	echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE
+	;;
     macppc:MirBSD:*:*)
-	echo powerpc-unknown-mirbsd"$UNAME_RELEASE"
-	exit ;;
+	GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE
+	;;
     *:MirBSD:*:*)
-	echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE
+	;;
     *:Sortix:*:*)
-	echo "$UNAME_MACHINE"-unknown-sortix
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-sortix
+	;;
     *:Twizzler:*:*)
-	echo "$UNAME_MACHINE"-unknown-twizzler
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-twizzler
+	;;
     *:Redox:*:*)
-	echo "$UNAME_MACHINE"-unknown-redox
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-redox
+	;;
     mips:OSF1:*.*)
-	echo mips-dec-osf1
-	exit ;;
+	GUESS=mips-dec-osf1
+	;;
     alpha:OSF1:*:*)
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	trap '' 0
 	case $UNAME_RELEASE in
 	*4.0)
 		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
@@ -297,7 +329,7 @@
 	# covers most systems running today.  This code pipes the CPU
 	# types through head -n 1, so we only detect the type of CPU 0.
 	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
-	case "$ALPHA_CPU_TYPE" in
+	case $ALPHA_CPU_TYPE in
 	    "EV4 (21064)")
 		UNAME_MACHINE=alpha ;;
 	    "EV4.5 (21064)")
@@ -334,75 +366,76 @@
 	# A Tn.n version is a released field test version.
 	# A Xn.n version is an unreleased experimental baselevel.
 	# 1.2 uses "1.2" for uname -r.
-	echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`"
-	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
-	exitcode=$?
-	trap '' 0
-	exit $exitcode ;;
+	OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	GUESS=$UNAME_MACHINE-dec-osf$OSF_REL
+	;;
     Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-unknown-sysv4
-	exit ;;
+	GUESS=m68k-unknown-sysv4
+	;;
     *:[Aa]miga[Oo][Ss]:*:*)
-	echo "$UNAME_MACHINE"-unknown-amigaos
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-amigaos
+	;;
     *:[Mm]orph[Oo][Ss]:*:*)
-	echo "$UNAME_MACHINE"-unknown-morphos
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-morphos
+	;;
     *:OS/390:*:*)
-	echo i370-ibm-openedition
-	exit ;;
+	GUESS=i370-ibm-openedition
+	;;
     *:z/VM:*:*)
-	echo s390-ibm-zvmoe
-	exit ;;
+	GUESS=s390-ibm-zvmoe
+	;;
     *:OS400:*:*)
-	echo powerpc-ibm-os400
-	exit ;;
+	GUESS=powerpc-ibm-os400
+	;;
     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-	echo arm-acorn-riscix"$UNAME_RELEASE"
-	exit ;;
+	GUESS=arm-acorn-riscix$UNAME_RELEASE
+	;;
     arm*:riscos:*:*|arm*:RISCOS:*:*)
-	echo arm-unknown-riscos
-	exit ;;
+	GUESS=arm-unknown-riscos
+	;;
     SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-	echo hppa1.1-hitachi-hiuxmpp
-	exit ;;
+	GUESS=hppa1.1-hitachi-hiuxmpp
+	;;
     Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
 	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-	if test "`(/bin/universe) 2>/dev/null`" = att ; then
-		echo pyramid-pyramid-sysv3
-	else
-		echo pyramid-pyramid-bsd
-	fi
-	exit ;;
+	case `(/bin/universe) 2>/dev/null` in
+	    att) GUESS=pyramid-pyramid-sysv3 ;;
+	    *)   GUESS=pyramid-pyramid-bsd   ;;
+	esac
+	;;
     NILE*:*:*:dcosx)
-	echo pyramid-pyramid-svr4
-	exit ;;
+	GUESS=pyramid-pyramid-svr4
+	;;
     DRS?6000:unix:4.0:6*)
-	echo sparc-icl-nx6
-	exit ;;
+	GUESS=sparc-icl-nx6
+	;;
     DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
 	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7; exit ;;
-	esac ;;
+	    sparc) GUESS=sparc-icl-nx7 ;;
+	esac
+	;;
     s390x:SunOS:*:*)
-	echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
-	exit ;;
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL
+	;;
     sun4H:SunOS:5.*:*)
-	echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
-	exit ;;
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=sparc-hal-solaris2$SUN_REL
+	;;
     sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-	echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
-	exit ;;
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=sparc-sun-solaris2$SUN_REL
+	;;
     i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
-	echo i386-pc-auroraux"$UNAME_RELEASE"
-	exit ;;
+	GUESS=i386-pc-auroraux$UNAME_RELEASE
+	;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
 	set_cc_for_build
 	SUN_ARCH=i386
 	# If there is a compiler, see if it is configured for 64-bit objects.
 	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
 	# This test works for both compilers.
-	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+	if test "$CC_FOR_BUILD" != no_compiler_found; then
 	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
 		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
 		grep IS_64BIT_ARCH >/dev/null
@@ -410,41 +443,44 @@
 		SUN_ARCH=x86_64
 	    fi
 	fi
-	echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
-	exit ;;
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=$SUN_ARCH-pc-solaris2$SUN_REL
+	;;
     sun4*:SunOS:6*:*)
 	# According to config.sub, this is the proper way to canonicalize
 	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
 	# it's likely to be more like Solaris than SunOS4.
-	echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
-	exit ;;
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=sparc-sun-solaris3$SUN_REL
+	;;
     sun4*:SunOS:*:*)
-	case "`/usr/bin/arch -k`" in
+	case `/usr/bin/arch -k` in
 	    Series*|S4*)
 		UNAME_RELEASE=`uname -v`
 		;;
 	esac
 	# Japanese Language versions have a version number like `4.1.3-JL'.
-	echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`"
-	exit ;;
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'`
+	GUESS=sparc-sun-sunos$SUN_REL
+	;;
     sun3*:SunOS:*:*)
-	echo m68k-sun-sunos"$UNAME_RELEASE"
-	exit ;;
+	GUESS=m68k-sun-sunos$UNAME_RELEASE
+	;;
     sun*:*:4.2BSD:*)
 	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
 	test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
-	case "`/bin/arch`" in
+	case `/bin/arch` in
 	    sun3)
-		echo m68k-sun-sunos"$UNAME_RELEASE"
+		GUESS=m68k-sun-sunos$UNAME_RELEASE
 		;;
 	    sun4)
-		echo sparc-sun-sunos"$UNAME_RELEASE"
+		GUESS=sparc-sun-sunos$UNAME_RELEASE
 		;;
 	esac
-	exit ;;
+	;;
     aushp:SunOS:*:*)
-	echo sparc-auspex-sunos"$UNAME_RELEASE"
-	exit ;;
+	GUESS=sparc-auspex-sunos$UNAME_RELEASE
+	;;
     # The situation for MiNT is a little confusing.  The machine name
     # can be virtually everything (everything which is not
     # "atarist" or "atariste" at least should have a processor
@@ -454,41 +490,41 @@
     # MiNT.  But MiNT is downward compatible to TOS, so this should
     # be no problem.
     atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint"$UNAME_RELEASE"
-	exit ;;
+	GUESS=m68k-atari-mint$UNAME_RELEASE
+	;;
     atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint"$UNAME_RELEASE"
-	exit ;;
+	GUESS=m68k-atari-mint$UNAME_RELEASE
+	;;
     *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-	echo m68k-atari-mint"$UNAME_RELEASE"
-	exit ;;
+	GUESS=m68k-atari-mint$UNAME_RELEASE
+	;;
     milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-	echo m68k-milan-mint"$UNAME_RELEASE"
-	exit ;;
+	GUESS=m68k-milan-mint$UNAME_RELEASE
+	;;
     hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-	echo m68k-hades-mint"$UNAME_RELEASE"
-	exit ;;
+	GUESS=m68k-hades-mint$UNAME_RELEASE
+	;;
     *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-	echo m68k-unknown-mint"$UNAME_RELEASE"
-	exit ;;
+	GUESS=m68k-unknown-mint$UNAME_RELEASE
+	;;
     m68k:machten:*:*)
-	echo m68k-apple-machten"$UNAME_RELEASE"
-	exit ;;
+	GUESS=m68k-apple-machten$UNAME_RELEASE
+	;;
     powerpc:machten:*:*)
-	echo powerpc-apple-machten"$UNAME_RELEASE"
-	exit ;;
+	GUESS=powerpc-apple-machten$UNAME_RELEASE
+	;;
     RISC*:Mach:*:*)
-	echo mips-dec-mach_bsd4.3
-	exit ;;
+	GUESS=mips-dec-mach_bsd4.3
+	;;
     RISC*:ULTRIX:*:*)
-	echo mips-dec-ultrix"$UNAME_RELEASE"
-	exit ;;
+	GUESS=mips-dec-ultrix$UNAME_RELEASE
+	;;
     VAX*:ULTRIX*:*:*)
-	echo vax-dec-ultrix"$UNAME_RELEASE"
-	exit ;;
+	GUESS=vax-dec-ultrix$UNAME_RELEASE
+	;;
     2020:CLIX:*:* | 2430:CLIX:*:*)
-	echo clipper-intergraph-clix"$UNAME_RELEASE"
-	exit ;;
+	GUESS=clipper-intergraph-clix$UNAME_RELEASE
+	;;
     mips:*:*:UMIPS | mips:*:*:RISCos)
 	set_cc_for_build
 	sed 's/^	//' << EOF > "$dummy.c"
@@ -516,75 +552,76 @@
 	  dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&
 	  SYSTEM_NAME=`"$dummy" "$dummyarg"` &&
 	    { echo "$SYSTEM_NAME"; exit; }
-	echo mips-mips-riscos"$UNAME_RELEASE"
-	exit ;;
+	GUESS=mips-mips-riscos$UNAME_RELEASE
+	;;
     Motorola:PowerMAX_OS:*:*)
-	echo powerpc-motorola-powermax
-	exit ;;
+	GUESS=powerpc-motorola-powermax
+	;;
     Motorola:*:4.3:PL8-*)
-	echo powerpc-harris-powermax
-	exit ;;
+	GUESS=powerpc-harris-powermax
+	;;
     Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
-	echo powerpc-harris-powermax
-	exit ;;
+	GUESS=powerpc-harris-powermax
+	;;
     Night_Hawk:Power_UNIX:*:*)
-	echo powerpc-harris-powerunix
-	exit ;;
+	GUESS=powerpc-harris-powerunix
+	;;
     m88k:CX/UX:7*:*)
-	echo m88k-harris-cxux7
-	exit ;;
+	GUESS=m88k-harris-cxux7
+	;;
     m88k:*:4*:R4*)
-	echo m88k-motorola-sysv4
-	exit ;;
+	GUESS=m88k-motorola-sysv4
+	;;
     m88k:*:3*:R3*)
-	echo m88k-motorola-sysv3
-	exit ;;
+	GUESS=m88k-motorola-sysv3
+	;;
     AViiON:dgux:*:*)
 	# DG/UX returns AViiON for all architectures
 	UNAME_PROCESSOR=`/usr/bin/uname -p`
-	if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ]
+	if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
 	then
-	    if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \
-	       [ "$TARGET_BINARY_INTERFACE"x = x ]
+	    if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
+	       test "$TARGET_BINARY_INTERFACE"x = x
 	    then
-		echo m88k-dg-dgux"$UNAME_RELEASE"
+		GUESS=m88k-dg-dgux$UNAME_RELEASE
 	    else
-		echo m88k-dg-dguxbcs"$UNAME_RELEASE"
+		GUESS=m88k-dg-dguxbcs$UNAME_RELEASE
 	    fi
 	else
-	    echo i586-dg-dgux"$UNAME_RELEASE"
+	    GUESS=i586-dg-dgux$UNAME_RELEASE
 	fi
-	exit ;;
+	;;
     M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
-	echo m88k-dolphin-sysv3
-	exit ;;
+	GUESS=m88k-dolphin-sysv3
+	;;
     M88*:*:R3*:*)
 	# Delta 88k system running SVR3
-	echo m88k-motorola-sysv3
-	exit ;;
+	GUESS=m88k-motorola-sysv3
+	;;
     XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-	echo m88k-tektronix-sysv3
-	exit ;;
+	GUESS=m88k-tektronix-sysv3
+	;;
     Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-	echo m68k-tektronix-bsd
-	exit ;;
+	GUESS=m68k-tektronix-bsd
+	;;
     *:IRIX*:*:*)
-	echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`"
-	exit ;;
+	IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'`
+	GUESS=mips-sgi-irix$IRIX_REL
+	;;
     ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
-	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+	GUESS=romp-ibm-aix    # uname -m gives an 8 hex-code CPU id
+	;;                    # Note that: echo "'`uname -s`'" gives 'AIX '
     i*86:AIX:*:*)
-	echo i386-ibm-aix
-	exit ;;
+	GUESS=i386-ibm-aix
+	;;
     ia64:AIX:*:*)
-	if [ -x /usr/bin/oslevel ] ; then
+	if test -x /usr/bin/oslevel ; then
 		IBM_REV=`/usr/bin/oslevel`
 	else
-		IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
+		IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
 	fi
-	echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV"
-	exit ;;
+	GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV
+	;;
     *:AIX:2:3)
 	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
 		set_cc_for_build
@@ -601,16 +638,16 @@
 EOF
 		if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`
 		then
-			echo "$SYSTEM_NAME"
+			GUESS=$SYSTEM_NAME
 		else
-			echo rs6000-ibm-aix3.2.5
+			GUESS=rs6000-ibm-aix3.2.5
 		fi
 	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-		echo rs6000-ibm-aix3.2.4
+		GUESS=rs6000-ibm-aix3.2.4
 	else
-		echo rs6000-ibm-aix3.2
+		GUESS=rs6000-ibm-aix3.2
 	fi
-	exit ;;
+	;;
     *:AIX:*:[4567])
 	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
 	if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
@@ -618,56 +655,56 @@
 	else
 		IBM_ARCH=powerpc
 	fi
-	if [ -x /usr/bin/lslpp ] ; then
-		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+	if test -x /usr/bin/lslpp ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \
 			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
 	else
-		IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
+		IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
 	fi
-	echo "$IBM_ARCH"-ibm-aix"$IBM_REV"
-	exit ;;
+	GUESS=$IBM_ARCH-ibm-aix$IBM_REV
+	;;
     *:AIX:*:*)
-	echo rs6000-ibm-aix
-	exit ;;
+	GUESS=rs6000-ibm-aix
+	;;
     ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
-	echo romp-ibm-bsd4.4
-	exit ;;
+	GUESS=romp-ibm-bsd4.4
+	;;
     ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-	echo romp-ibm-bsd"$UNAME_RELEASE"   # 4.3 with uname added to
-	exit ;;                             # report: romp-ibm BSD 4.3
+	GUESS=romp-ibm-bsd$UNAME_RELEASE    # 4.3 with uname added to
+	;;                                  # report: romp-ibm BSD 4.3
     *:BOSX:*:*)
-	echo rs6000-bull-bosx
-	exit ;;
+	GUESS=rs6000-bull-bosx
+	;;
     DPX/2?00:B.O.S.:*:*)
-	echo m68k-bull-sysv3
-	exit ;;
+	GUESS=m68k-bull-sysv3
+	;;
     9000/[34]??:4.3bsd:1.*:*)
-	echo m68k-hp-bsd
-	exit ;;
+	GUESS=m68k-hp-bsd
+	;;
     hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-	echo m68k-hp-bsd4.4
-	exit ;;
+	GUESS=m68k-hp-bsd4.4
+	;;
     9000/[34678]??:HP-UX:*:*)
-	HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'`
-	case "$UNAME_MACHINE" in
+	HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+	case $UNAME_MACHINE in
 	    9000/31?)            HP_ARCH=m68000 ;;
 	    9000/[34]??)         HP_ARCH=m68k ;;
 	    9000/[678][0-9][0-9])
-		if [ -x /usr/bin/getconf ]; then
+		if test -x /usr/bin/getconf; then
 		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
 		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-		    case "$sc_cpu_version" in
+		    case $sc_cpu_version in
 		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
 		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
 		      532)                      # CPU_PA_RISC2_0
-			case "$sc_kernel_bits" in
+			case $sc_kernel_bits in
 			  32) HP_ARCH=hppa2.0n ;;
 			  64) HP_ARCH=hppa2.0w ;;
 			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
 			esac ;;
 		    esac
 		fi
-		if [ "$HP_ARCH" = "" ]; then
+		if test "$HP_ARCH" = ""; then
 		    set_cc_for_build
 		    sed 's/^		//' << EOF > "$dummy.c"
 
@@ -706,7 +743,7 @@
 		    test -z "$HP_ARCH" && HP_ARCH=hppa
 		fi ;;
 	esac
-	if [ "$HP_ARCH" = hppa2.0w ]
+	if test "$HP_ARCH" = hppa2.0w
 	then
 	    set_cc_for_build
 
@@ -727,12 +764,12 @@
 		HP_ARCH=hppa64
 	    fi
 	fi
-	echo "$HP_ARCH"-hp-hpux"$HPUX_REV"
-	exit ;;
+	GUESS=$HP_ARCH-hp-hpux$HPUX_REV
+	;;
     ia64:HP-UX:*:*)
-	HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'`
-	echo ia64-hp-hpux"$HPUX_REV"
-	exit ;;
+	HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+	GUESS=ia64-hp-hpux$HPUX_REV
+	;;
     3050*:HI-UX:*:*)
 	set_cc_for_build
 	sed 's/^	//' << EOF > "$dummy.c"
@@ -762,36 +799,36 @@
 EOF
 	$CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&
 		{ echo "$SYSTEM_NAME"; exit; }
-	echo unknown-hitachi-hiuxwe2
-	exit ;;
+	GUESS=unknown-hitachi-hiuxwe2
+	;;
     9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
-	echo hppa1.1-hp-bsd
-	exit ;;
+	GUESS=hppa1.1-hp-bsd
+	;;
     9000/8??:4.3bsd:*:*)
-	echo hppa1.0-hp-bsd
-	exit ;;
+	GUESS=hppa1.0-hp-bsd
+	;;
     *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-	echo hppa1.0-hp-mpeix
-	exit ;;
+	GUESS=hppa1.0-hp-mpeix
+	;;
     hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
-	echo hppa1.1-hp-osf
-	exit ;;
+	GUESS=hppa1.1-hp-osf
+	;;
     hp8??:OSF1:*:*)
-	echo hppa1.0-hp-osf
-	exit ;;
+	GUESS=hppa1.0-hp-osf
+	;;
     i*86:OSF1:*:*)
-	if [ -x /usr/sbin/sysversion ] ; then
-	    echo "$UNAME_MACHINE"-unknown-osf1mk
+	if test -x /usr/sbin/sysversion ; then
+	    GUESS=$UNAME_MACHINE-unknown-osf1mk
 	else
-	    echo "$UNAME_MACHINE"-unknown-osf1
+	    GUESS=$UNAME_MACHINE-unknown-osf1
 	fi
-	exit ;;
+	;;
     parisc*:Lites*:*:*)
-	echo hppa1.1-hp-lites
-	exit ;;
+	GUESS=hppa1.1-hp-lites
+	;;
     C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-	echo c1-convex-bsd
-	exit ;;
+	GUESS=c1-convex-bsd
+	;;
     C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
 	if getsysinfo -f scalar_acc
 	then echo c32-convex-bsd
@@ -799,17 +836,18 @@
 	fi
 	exit ;;
     C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-	echo c34-convex-bsd
-	exit ;;
+	GUESS=c34-convex-bsd
+	;;
     C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-	echo c38-convex-bsd
-	exit ;;
+	GUESS=c38-convex-bsd
+	;;
     C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-	echo c4-convex-bsd
-	exit ;;
+	GUESS=c4-convex-bsd
+	;;
     CRAY*Y-MP:*:*:*)
-	echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=ymp-cray-unicos$CRAY_REL
+	;;
     CRAY*[A-Z]90:*:*:*)
 	echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
 	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
@@ -817,114 +855,126 @@
 	      -e 's/\.[^.]*$/.X/'
 	exit ;;
     CRAY*TS:*:*:*)
-	echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=t90-cray-unicos$CRAY_REL
+	;;
     CRAY*T3E:*:*:*)
-	echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=alphaev5-cray-unicosmk$CRAY_REL
+	;;
     CRAY*SV1:*:*:*)
-	echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=sv1-cray-unicos$CRAY_REL
+	;;
     *:UNICOS/mp:*:*)
-	echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=craynv-cray-unicosmp$CRAY_REL
+	;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
 	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
 	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
 	FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`
-	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
+	GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+	;;
     5000:UNIX_System_V:4.*:*)
 	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
 	FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
-	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
+	GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+	;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-	echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE"
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE
+	;;
     sparc*:BSD/OS:*:*)
-	echo sparc-unknown-bsdi"$UNAME_RELEASE"
-	exit ;;
+	GUESS=sparc-unknown-bsdi$UNAME_RELEASE
+	;;
     *:BSD/OS:*:*)
-	echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE
+	;;
     arm:FreeBSD:*:*)
 	UNAME_PROCESSOR=`uname -p`
 	set_cc_for_build
 	if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
 	    | grep -q __ARM_PCS_VFP
 	then
-	    echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi
+	    FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	    GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi
 	else
-	    echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf
+	    FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	    GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf
 	fi
-	exit ;;
+	;;
     *:FreeBSD:*:*)
 	UNAME_PROCESSOR=`/usr/bin/uname -p`
-	case "$UNAME_PROCESSOR" in
+	case $UNAME_PROCESSOR in
 	    amd64)
 		UNAME_PROCESSOR=x86_64 ;;
 	    i386)
 		UNAME_PROCESSOR=i586 ;;
 	esac
-	echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"
-	exit ;;
+	FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL
+	;;
     i*:CYGWIN*:*)
-	echo "$UNAME_MACHINE"-pc-cygwin
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-cygwin
+	;;
     *:MINGW64*:*)
-	echo "$UNAME_MACHINE"-pc-mingw64
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-mingw64
+	;;
     *:MINGW*:*)
-	echo "$UNAME_MACHINE"-pc-mingw32
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-mingw32
+	;;
     *:MSYS*:*)
-	echo "$UNAME_MACHINE"-pc-msys
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-msys
+	;;
     i*:PW*:*)
-	echo "$UNAME_MACHINE"-pc-pw32
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-pw32
+	;;
     *:Interix*:*)
-	case "$UNAME_MACHINE" in
+	case $UNAME_MACHINE in
 	    x86)
-		echo i586-pc-interix"$UNAME_RELEASE"
-		exit ;;
+		GUESS=i586-pc-interix$UNAME_RELEASE
+		;;
 	    authenticamd | genuineintel | EM64T)
-		echo x86_64-unknown-interix"$UNAME_RELEASE"
-		exit ;;
+		GUESS=x86_64-unknown-interix$UNAME_RELEASE
+		;;
 	    IA64)
-		echo ia64-unknown-interix"$UNAME_RELEASE"
-		exit ;;
+		GUESS=ia64-unknown-interix$UNAME_RELEASE
+		;;
 	esac ;;
     i*:UWIN*:*)
-	echo "$UNAME_MACHINE"-pc-uwin
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-uwin
+	;;
     amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-	echo x86_64-pc-cygwin
-	exit ;;
+	GUESS=x86_64-pc-cygwin
+	;;
     prep*:SunOS:5.*:*)
-	echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
-	exit ;;
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=powerpcle-unknown-solaris2$SUN_REL
+	;;
     *:GNU:*:*)
 	# the GNU system
-	echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`"
-	exit ;;
+	GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'`
+	GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'`
+	GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL
+	;;
     *:GNU/*:*:*)
 	# other systems with GNU libc and userland
-	echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC"
-	exit ;;
+	GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"`
+	GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
+	;;
     *:Minix:*:*)
-	echo "$UNAME_MACHINE"-unknown-minix
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-minix
+	;;
     aarch64:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     aarch64_be:Linux:*:*)
 	UNAME_MACHINE=aarch64_be
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     alpha:Linux:*:*)
-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in
 	  EV5)   UNAME_MACHINE=alphaev5 ;;
 	  EV56)  UNAME_MACHINE=alphaev56 ;;
 	  PCA56) UNAME_MACHINE=alphapca56 ;;
@@ -935,60 +985,63 @@
 	esac
 	objdump --private-headers /bin/sh | grep -q ld.so.1
 	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
-    arc:Linux:*:* | arceb:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     arm*:Linux:*:*)
 	set_cc_for_build
 	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
 	    | grep -q __ARM_EABI__
 	then
-	    echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	    GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
 	else
 	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
 		| grep -q __ARM_PCS_VFP
 	    then
-		echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi
+		GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi
 	    else
-		echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf
+		GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf
 	    fi
 	fi
-	exit ;;
+	;;
     avr32*:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     cris:Linux:*:*)
-	echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+	;;
     crisv32:Linux:*:*)
-	echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+	;;
     e2k:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     frv:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     hexagon:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     i*86:Linux:*:*)
-	echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-linux-$LIBC
+	;;
     ia64:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     k1om:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     m32r*:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     m68*:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     mips:Linux:*:* | mips64:Linux:*:*)
 	set_cc_for_build
 	IS_GLIBC=0
@@ -1033,113 +1086,124 @@
 	#endif
 	#endif
 EOF
-	eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`"
+	cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`
+	eval "$cc_set_vars"
 	test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
 	;;
     mips64el:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     openrisc*:Linux:*:*)
-	echo or1k-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=or1k-unknown-linux-$LIBC
+	;;
     or32:Linux:*:* | or1k*:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     padre:Linux:*:*)
-	echo sparc-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=sparc-unknown-linux-$LIBC
+	;;
     parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=hppa64-unknown-linux-$LIBC
+	;;
     parisc:Linux:*:* | hppa:Linux:*:*)
 	# Look for CPU level
 	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;;
-	  PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;;
-	  *)    echo hppa-unknown-linux-"$LIBC" ;;
+	  PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;;
+	  PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;;
+	  *)    GUESS=hppa-unknown-linux-$LIBC ;;
 	esac
-	exit ;;
+	;;
     ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=powerpc64-unknown-linux-$LIBC
+	;;
     ppc:Linux:*:*)
-	echo powerpc-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=powerpc-unknown-linux-$LIBC
+	;;
     ppc64le:Linux:*:*)
-	echo powerpc64le-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=powerpc64le-unknown-linux-$LIBC
+	;;
     ppcle:Linux:*:*)
-	echo powerpcle-unknown-linux-"$LIBC"
-	exit ;;
-    riscv32:Linux:*:* | riscv64:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=powerpcle-unknown-linux-$LIBC
+	;;
+    riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     s390:Linux:*:* | s390x:Linux:*:*)
-	echo "$UNAME_MACHINE"-ibm-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-ibm-linux-$LIBC
+	;;
     sh64*:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     sh*:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     tile*:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     vax:Linux:*:*)
-	echo "$UNAME_MACHINE"-dec-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-dec-linux-$LIBC
+	;;
     x86_64:Linux:*:*)
-	echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
-	exit ;;
+	set_cc_for_build
+	LIBCABI=$LIBC
+	if test "$CC_FOR_BUILD" != no_compiler_found; then
+	    if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \
+		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_X32 >/dev/null
+	    then
+		LIBCABI=${LIBC}x32
+	    fi
+	fi
+	GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI
+	;;
     xtensa*:Linux:*:*)
-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     i*86:DYNIX/ptx:4*:*)
 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
 	# earlier versions are messed up and put the nodename in both
 	# sysname and nodename.
-	echo i386-sequent-sysv4
-	exit ;;
+	GUESS=i386-sequent-sysv4
+	;;
     i*86:UNIX_SV:4.2MP:2.*)
 	# Unixware is an offshoot of SVR4, but it has its own version
 	# number series starting with 2...
 	# I am not positive that other SVR4 systems won't match this,
 	# I just have to hope.  -- rms.
 	# Use sysv4.2uw... so that sysv4* matches it.
-	echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION"
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION
+	;;
     i*86:OS/2:*:*)
 	# If we were able to find `uname', then EMX Unix compatibility
 	# is probably installed.
-	echo "$UNAME_MACHINE"-pc-os2-emx
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-os2-emx
+	;;
     i*86:XTS-300:*:STOP)
-	echo "$UNAME_MACHINE"-unknown-stop
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-stop
+	;;
     i*86:atheos:*:*)
-	echo "$UNAME_MACHINE"-unknown-atheos
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-atheos
+	;;
     i*86:syllable:*:*)
-	echo "$UNAME_MACHINE"-pc-syllable
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-syllable
+	;;
     i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
-	echo i386-unknown-lynxos"$UNAME_RELEASE"
-	exit ;;
+	GUESS=i386-unknown-lynxos$UNAME_RELEASE
+	;;
     i*86:*DOS:*:*)
-	echo "$UNAME_MACHINE"-pc-msdosdjgpp
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-msdosdjgpp
+	;;
     i*86:*:4.*:*)
 	UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
 	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-		echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL"
+		GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL
 	else
-		echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL"
+		GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL
 	fi
-	exit ;;
+	;;
     i*86:*:5:[678]*)
 	# UnixWare 7.x, OpenUNIX and OpenServer 6.
 	case `/bin/uname -X | grep "^Machine"` in
@@ -1147,12 +1211,12 @@
 	    *Pentium)	     UNAME_MACHINE=i586 ;;
 	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
 	esac
-	echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	;;
     i*86:*:3.2:*)
 	if test -f /usr/options/cb.name; then
 		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-		echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL"
+		GUESS=$UNAME_MACHINE-pc-isc$UNAME_REL
 	elif /bin/uname -X 2>/dev/null >/dev/null ; then
 		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
 		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
@@ -1162,11 +1226,11 @@
 			&& UNAME_MACHINE=i686
 		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
 			&& UNAME_MACHINE=i686
-		echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL"
+		GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL
 	else
-		echo "$UNAME_MACHINE"-pc-sysv32
+		GUESS=$UNAME_MACHINE-pc-sysv32
 	fi
-	exit ;;
+	;;
     pc:*:*:*)
 	# Left here for compatibility:
 	# uname -m prints for DJGPP always 'pc', but it prints nothing about
@@ -1174,31 +1238,31 @@
 	# Note: whatever this is, it MUST be the same as what config.sub
 	# prints for the "djgpp" host, or else GDB configure will decide that
 	# this is a cross-build.
-	echo i586-pc-msdosdjgpp
-	exit ;;
+	GUESS=i586-pc-msdosdjgpp
+	;;
     Intel:Mach:3*:*)
-	echo i386-pc-mach3
-	exit ;;
+	GUESS=i386-pc-mach3
+	;;
     paragon:*:*:*)
-	echo i860-intel-osf1
-	exit ;;
+	GUESS=i860-intel-osf1
+	;;
     i860:*:4.*:*) # i860-SVR4
 	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-	  echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4
+	  GUESS=i860-stardent-sysv$UNAME_RELEASE    # Stardent Vistra i860-SVR4
 	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-unknown-sysv"$UNAME_RELEASE"  # Unknown i860-SVR4
+	  GUESS=i860-unknown-sysv$UNAME_RELEASE     # Unknown i860-SVR4
 	fi
-	exit ;;
+	;;
     mini*:CTIX:SYS*5:*)
 	# "miniframe"
-	echo m68010-convergent-sysv
-	exit ;;
+	GUESS=m68010-convergent-sysv
+	;;
     mc68k:UNIX:SYSTEM5:3.51m)
-	echo m68k-convergent-sysv
-	exit ;;
+	GUESS=m68k-convergent-sysv
+	;;
     M680?0:D-NIX:5.3:*)
-	echo m68k-diab-dnix
-	exit ;;
+	GUESS=m68k-diab-dnix
+	;;
     M68*:*:R3V[5678]*:*)
 	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
     3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
@@ -1223,113 +1287,116 @@
 	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
 	    && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
     m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-unknown-lynxos"$UNAME_RELEASE"
-	exit ;;
+	GUESS=m68k-unknown-lynxos$UNAME_RELEASE
+	;;
     mc68030:UNIX_System_V:4.*:*)
-	echo m68k-atari-sysv4
-	exit ;;
+	GUESS=m68k-atari-sysv4
+	;;
     TSUNAMI:LynxOS:2.*:*)
-	echo sparc-unknown-lynxos"$UNAME_RELEASE"
-	exit ;;
+	GUESS=sparc-unknown-lynxos$UNAME_RELEASE
+	;;
     rs6000:LynxOS:2.*:*)
-	echo rs6000-unknown-lynxos"$UNAME_RELEASE"
-	exit ;;
+	GUESS=rs6000-unknown-lynxos$UNAME_RELEASE
+	;;
     PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
-	echo powerpc-unknown-lynxos"$UNAME_RELEASE"
-	exit ;;
+	GUESS=powerpc-unknown-lynxos$UNAME_RELEASE
+	;;
     SM[BE]S:UNIX_SV:*:*)
-	echo mips-dde-sysv"$UNAME_RELEASE"
-	exit ;;
+	GUESS=mips-dde-sysv$UNAME_RELEASE
+	;;
     RM*:ReliantUNIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
+	GUESS=mips-sni-sysv4
+	;;
     RM*:SINIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
+	GUESS=mips-sni-sysv4
+	;;
     *:SINIX-*:*:*)
 	if uname -p 2>/dev/null >/dev/null ; then
 		UNAME_MACHINE=`(uname -p) 2>/dev/null`
-		echo "$UNAME_MACHINE"-sni-sysv4
+		GUESS=$UNAME_MACHINE-sni-sysv4
 	else
-		echo ns32k-sni-sysv
+		GUESS=ns32k-sni-sysv
 	fi
-	exit ;;
+	;;
     PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
 			# says <Richard.M.Bartel@ccMail.Census.GOV>
-	echo i586-unisys-sysv4
-	exit ;;
+	GUESS=i586-unisys-sysv4
+	;;
     *:UNIX_System_V:4*:FTX*)
 	# From Gerald Hewes <hewes@openmarket.com>.
 	# How about differentiating between stratus architectures? -djm
-	echo hppa1.1-stratus-sysv4
-	exit ;;
+	GUESS=hppa1.1-stratus-sysv4
+	;;
     *:*:*:FTX*)
 	# From seanf@swdc.stratus.com.
-	echo i860-stratus-sysv4
-	exit ;;
+	GUESS=i860-stratus-sysv4
+	;;
     i*86:VOS:*:*)
 	# From Paul.Green@stratus.com.
-	echo "$UNAME_MACHINE"-stratus-vos
-	exit ;;
+	GUESS=$UNAME_MACHINE-stratus-vos
+	;;
     *:VOS:*:*)
 	# From Paul.Green@stratus.com.
-	echo hppa1.1-stratus-vos
-	exit ;;
+	GUESS=hppa1.1-stratus-vos
+	;;
     mc68*:A/UX:*:*)
-	echo m68k-apple-aux"$UNAME_RELEASE"
-	exit ;;
+	GUESS=m68k-apple-aux$UNAME_RELEASE
+	;;
     news*:NEWS-OS:6*:*)
-	echo mips-sony-newsos6
-	exit ;;
+	GUESS=mips-sony-newsos6
+	;;
     R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-	if [ -d /usr/nec ]; then
-		echo mips-nec-sysv"$UNAME_RELEASE"
+	if test -d /usr/nec; then
+		GUESS=mips-nec-sysv$UNAME_RELEASE
 	else
-		echo mips-unknown-sysv"$UNAME_RELEASE"
+		GUESS=mips-unknown-sysv$UNAME_RELEASE
 	fi
-	exit ;;
+	;;
     BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
-	echo powerpc-be-beos
-	exit ;;
+	GUESS=powerpc-be-beos
+	;;
     BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
-	echo powerpc-apple-beos
-	exit ;;
+	GUESS=powerpc-apple-beos
+	;;
     BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
-	echo i586-pc-beos
-	exit ;;
+	GUESS=i586-pc-beos
+	;;
     BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
-	echo i586-pc-haiku
-	exit ;;
+	GUESS=i586-pc-haiku
+	;;
     x86_64:Haiku:*:*)
-	echo x86_64-unknown-haiku
-	exit ;;
+	GUESS=x86_64-unknown-haiku
+	;;
     SX-4:SUPER-UX:*:*)
-	echo sx4-nec-superux"$UNAME_RELEASE"
-	exit ;;
+	GUESS=sx4-nec-superux$UNAME_RELEASE
+	;;
     SX-5:SUPER-UX:*:*)
-	echo sx5-nec-superux"$UNAME_RELEASE"
-	exit ;;
+	GUESS=sx5-nec-superux$UNAME_RELEASE
+	;;
     SX-6:SUPER-UX:*:*)
-	echo sx6-nec-superux"$UNAME_RELEASE"
-	exit ;;
+	GUESS=sx6-nec-superux$UNAME_RELEASE
+	;;
     SX-7:SUPER-UX:*:*)
-	echo sx7-nec-superux"$UNAME_RELEASE"
-	exit ;;
+	GUESS=sx7-nec-superux$UNAME_RELEASE
+	;;
     SX-8:SUPER-UX:*:*)
-	echo sx8-nec-superux"$UNAME_RELEASE"
-	exit ;;
+	GUESS=sx8-nec-superux$UNAME_RELEASE
+	;;
     SX-8R:SUPER-UX:*:*)
-	echo sx8r-nec-superux"$UNAME_RELEASE"
-	exit ;;
+	GUESS=sx8r-nec-superux$UNAME_RELEASE
+	;;
     SX-ACE:SUPER-UX:*:*)
-	echo sxace-nec-superux"$UNAME_RELEASE"
-	exit ;;
+	GUESS=sxace-nec-superux$UNAME_RELEASE
+	;;
     Power*:Rhapsody:*:*)
-	echo powerpc-apple-rhapsody"$UNAME_RELEASE"
-	exit ;;
+	GUESS=powerpc-apple-rhapsody$UNAME_RELEASE
+	;;
     *:Rhapsody:*:*)
-	echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"
-	exit ;;
+	GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE
+	;;
+    arm64:Darwin:*:*)
+	GUESS=aarch64-apple-darwin$UNAME_RELEASE
+	;;
     *:Darwin:*:*)
 	UNAME_PROCESSOR=`uname -p`
 	case $UNAME_PROCESSOR in
@@ -1344,7 +1411,7 @@
 	else
 	    set_cc_for_build
 	fi
-	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+	if test "$CC_FOR_BUILD" != no_compiler_found; then
 	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
 		   (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
 		   grep IS_64BIT_ARCH >/dev/null
@@ -1365,109 +1432,116 @@
 	    # uname -m returns i386 or x86_64
 	    UNAME_PROCESSOR=$UNAME_MACHINE
 	fi
-	echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"
-	exit ;;
+	GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE
+	;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
 	UNAME_PROCESSOR=`uname -p`
 	if test "$UNAME_PROCESSOR" = x86; then
 		UNAME_PROCESSOR=i386
 		UNAME_MACHINE=pc
 	fi
-	echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE"
-	exit ;;
+	GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE
+	;;
     *:QNX:*:4*)
-	echo i386-pc-qnx
-	exit ;;
+	GUESS=i386-pc-qnx
+	;;
     NEO-*:NONSTOP_KERNEL:*:*)
-	echo neo-tandem-nsk"$UNAME_RELEASE"
-	exit ;;
+	GUESS=neo-tandem-nsk$UNAME_RELEASE
+	;;
     NSE-*:NONSTOP_KERNEL:*:*)
-	echo nse-tandem-nsk"$UNAME_RELEASE"
-	exit ;;
+	GUESS=nse-tandem-nsk$UNAME_RELEASE
+	;;
     NSR-*:NONSTOP_KERNEL:*:*)
-	echo nsr-tandem-nsk"$UNAME_RELEASE"
-	exit ;;
+	GUESS=nsr-tandem-nsk$UNAME_RELEASE
+	;;
     NSV-*:NONSTOP_KERNEL:*:*)
-	echo nsv-tandem-nsk"$UNAME_RELEASE"
-	exit ;;
+	GUESS=nsv-tandem-nsk$UNAME_RELEASE
+	;;
     NSX-*:NONSTOP_KERNEL:*:*)
-	echo nsx-tandem-nsk"$UNAME_RELEASE"
-	exit ;;
+	GUESS=nsx-tandem-nsk$UNAME_RELEASE
+	;;
     *:NonStop-UX:*:*)
-	echo mips-compaq-nonstopux
-	exit ;;
+	GUESS=mips-compaq-nonstopux
+	;;
     BS2000:POSIX*:*:*)
-	echo bs2000-siemens-sysv
-	exit ;;
+	GUESS=bs2000-siemens-sysv
+	;;
     DS/*:UNIX_System_V:*:*)
-	echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE"
-	exit ;;
+	GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE
+	;;
     *:Plan9:*:*)
 	# "uname -m" is not consistent, so use $cputype instead. 386
 	# is converted to i386 for consistency with other x86
 	# operating systems.
-	# shellcheck disable=SC2154
-	if test "$cputype" = 386; then
+	if test "${cputype-}" = 386; then
 	    UNAME_MACHINE=i386
-	else
-	    UNAME_MACHINE="$cputype"
+	elif test "x${cputype-}" != x; then
+	    UNAME_MACHINE=$cputype
 	fi
-	echo "$UNAME_MACHINE"-unknown-plan9
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-plan9
+	;;
     *:TOPS-10:*:*)
-	echo pdp10-unknown-tops10
-	exit ;;
+	GUESS=pdp10-unknown-tops10
+	;;
     *:TENEX:*:*)
-	echo pdp10-unknown-tenex
-	exit ;;
+	GUESS=pdp10-unknown-tenex
+	;;
     KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-	echo pdp10-dec-tops20
-	exit ;;
+	GUESS=pdp10-dec-tops20
+	;;
     XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-	echo pdp10-xkl-tops20
-	exit ;;
+	GUESS=pdp10-xkl-tops20
+	;;
     *:TOPS-20:*:*)
-	echo pdp10-unknown-tops20
-	exit ;;
+	GUESS=pdp10-unknown-tops20
+	;;
     *:ITS:*:*)
-	echo pdp10-unknown-its
-	exit ;;
+	GUESS=pdp10-unknown-its
+	;;
     SEI:*:*:SEIUX)
-	echo mips-sei-seiux"$UNAME_RELEASE"
-	exit ;;
+	GUESS=mips-sei-seiux$UNAME_RELEASE
+	;;
     *:DragonFly:*:*)
-	echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"
-	exit ;;
+	DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL
+	;;
     *:*VMS:*:*)
 	UNAME_MACHINE=`(uname -p) 2>/dev/null`
-	case "$UNAME_MACHINE" in
-	    A*) echo alpha-dec-vms ; exit ;;
-	    I*) echo ia64-dec-vms ; exit ;;
-	    V*) echo vax-dec-vms ; exit ;;
+	case $UNAME_MACHINE in
+	    A*) GUESS=alpha-dec-vms ;;
+	    I*) GUESS=ia64-dec-vms ;;
+	    V*) GUESS=vax-dec-vms ;;
 	esac ;;
     *:XENIX:*:SysV)
-	echo i386-pc-xenix
-	exit ;;
+	GUESS=i386-pc-xenix
+	;;
     i*86:skyos:*:*)
-	echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`"
-	exit ;;
+	SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`
+	GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL
+	;;
     i*86:rdos:*:*)
-	echo "$UNAME_MACHINE"-pc-rdos
-	exit ;;
-    i*86:AROS:*:*)
-	echo "$UNAME_MACHINE"-pc-aros
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-rdos
+	;;
+    *:AROS:*:*)
+	GUESS=$UNAME_MACHINE-unknown-aros
+	;;
     x86_64:VMkernel:*:*)
-	echo "$UNAME_MACHINE"-unknown-esx
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-esx
+	;;
     amd64:Isilon\ OneFS:*:*)
-	echo x86_64-unknown-onefs
-	exit ;;
+	GUESS=x86_64-unknown-onefs
+	;;
     *:Unleashed:*:*)
-	echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE"
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE
+	;;
 esac
 
+# Do we have a guess based on uname results?
+if test "x$GUESS" != x; then
+    echo "$GUESS"
+    exit
+fi
+
 # No uname command or uname output not recognized.
 set_cc_for_build
 cat > "$dummy.c" <<EOF
@@ -1599,7 +1673,7 @@
 }
 EOF
 
-$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` &&
 	{ echo "$SYSTEM_NAME"; exit; }
 
 # Apollos put the system type in the environment.
@@ -1607,7 +1681,7 @@
 
 echo "$0: unable to guess system type" >&2
 
-case "$UNAME_MACHINE:$UNAME_SYSTEM" in
+case $UNAME_MACHINE:$UNAME_SYSTEM in
     mips:Linux | mips64:Linux)
 	# If we got here on MIPS GNU/Linux, output extra information.
 	cat >&2 <<EOF
@@ -1624,9 +1698,17 @@
 operating system you are using. If your script is old, overwrite *all*
 copies of config.guess and config.sub with the latest versions from:
 
-  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+  https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
 and
-  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+  https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+EOF
+
+our_year=`echo $timestamp | sed 's,-.*,,'`
+thisyear=`date +%Y`
+# shellcheck disable=SC2003
+script_age=`expr "$thisyear" - "$our_year"`
+if test "$script_age" -lt 3 ; then
+   cat >&2 <<EOF
 
 If $0 has already been updated, send the following data and any
 information you think might be pertinent to config-patches@gnu.org to
@@ -1654,6 +1736,7 @@
 UNAME_SYSTEM  = "$UNAME_SYSTEM"
 UNAME_VERSION = "$UNAME_VERSION"
 EOF
+fi
 
 exit 1
 
diff --git a/build-aux/config.libpath b/build-aux/config.libpath
index d4fec2b..0823857 100755
--- a/build-aux/config.libpath
+++ b/build-aux/config.libpath
@@ -2,7 +2,7 @@
 # Output a system dependent set of variables, describing how to set the
 # run time search path of shared libraries in an executable at run time.
 #
-#   Copyright 1996-2019 Free Software Foundation, Inc.
+#   Copyright 1996-2021 Free Software Foundation, Inc.
 #   Taken from GNU libtool, 2003
 #   Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
 #
@@ -66,7 +66,7 @@
   dgux*)
     shlibpath_var=LD_LIBRARY_PATH
     ;;
-  freebsd* | dragonfly*)
+  freebsd* | dragonfly* | midnightbsd*)
     shlibpath_var=LD_LIBRARY_PATH
     ;;
   gnu*)
diff --git a/build-aux/config.rpath b/build-aux/config.rpath
index be202c1..4b7dc49 100755
--- a/build-aux/config.rpath
+++ b/build-aux/config.rpath
@@ -2,7 +2,7 @@
 # Output a system dependent set of variables, describing how to set the
 # run time search path of shared libraries in an executable.
 #
-#   Copyright 1996-2019 Free Software Foundation, Inc.
+#   Copyright 1996-2021 Free Software Foundation, Inc.
 #   Taken from GNU libtool, 2001
 #   Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
 #
@@ -371,7 +371,7 @@
       hardcode_direct=yes
       hardcode_minus_L=yes
       ;;
-    freebsd* | dragonfly*)
+    freebsd* | dragonfly* | midnightbsd*)
       hardcode_libdir_flag_spec='-R$libdir'
       hardcode_direct=yes
       ;;
@@ -547,7 +547,7 @@
   freebsd[23].*)
     library_names_spec='$libname$shrext$versuffix'
     ;;
-  freebsd* | dragonfly*)
+  freebsd* | dragonfly* | midnightbsd*)
     library_names_spec='$libname$shrext'
     ;;
   gnu*)
diff --git a/build-aux/config.sub b/build-aux/config.sub
index 0f2234c..d74fb6d 100755
--- a/build-aux/config.sub
+++ b/build-aux/config.sub
@@ -1,8 +1,10 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright 1992-2019 Free Software Foundation, Inc.
+#   Copyright 1992-2021 Free Software Foundation, Inc.
 
-timestamp='2019-06-30'
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2021-08-14'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -33,7 +35,7 @@
 # Otherwise, we print the canonical config type on stdout and succeed.
 
 # You can get the latest version of this script from:
-# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
 
 # This file is supposed to be the same for all GNU packages
 # and recognize all the CPU types, system types and aliases
@@ -50,6 +52,13 @@
 #	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
 # It is wrong to echo any other type of specification.
 
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX.  However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
 me=`echo "$0" | sed -e 's,.*/,,'`
 
 usage="\
@@ -67,7 +76,7 @@
 version="\
 GNU config.sub ($timestamp)
 
-Copyright 1992-2019 Free Software Foundation, Inc.
+Copyright 1992-2021 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -112,9 +121,11 @@
 
 # Split fields of configuration type
 # shellcheck disable=SC2162
+saved_IFS=$IFS
 IFS="-" read field1 field2 field3 field4 <<EOF
 $1
 EOF
+IFS=$saved_IFS
 
 # Separate into logical components for further validation
 case $1 in
@@ -124,28 +135,27 @@
 		;;
 	*-*-*-*)
 		basic_machine=$field1-$field2
-		os=$field3-$field4
+		basic_os=$field3-$field4
 		;;
 	*-*-*)
 		# Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
 		# parts
 		maybe_os=$field2-$field3
 		case $maybe_os in
-			nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \
-			| linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \
+			nto-qnx* | linux-* | uclinux-uclibc* \
 			| uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
 			| netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
 			| storm-chaos* | os2-emx* | rtmk-nova*)
 				basic_machine=$field1
-				os=$maybe_os
+				basic_os=$maybe_os
 				;;
 			android-linux)
 				basic_machine=$field1-unknown
-				os=linux-android
+				basic_os=linux-android
 				;;
 			*)
 				basic_machine=$field1-$field2
-				os=$field3
+				basic_os=$field3
 				;;
 		esac
 		;;
@@ -154,7 +164,7 @@
 		case $field1-$field2 in
 			decstation-3100)
 				basic_machine=mips-dec
-				os=
+				basic_os=
 				;;
 			*-*)
 				# Second component is usually, but not always the OS
@@ -162,7 +172,11 @@
 					# Prevent following clause from handling this valid os
 					sun*os*)
 						basic_machine=$field1
-						os=$field2
+						basic_os=$field2
+						;;
+					zephyr*)
+						basic_machine=$field1-unknown
+						basic_os=$field2
 						;;
 					# Manufacturers
 					dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
@@ -175,11 +189,11 @@
 					| microblaze* | sim | cisco \
 					| oki | wec | wrs | winbond)
 						basic_machine=$field1-$field2
-						os=
+						basic_os=
 						;;
 					*)
 						basic_machine=$field1
-						os=$field2
+						basic_os=$field2
 						;;
 				esac
 			;;
@@ -191,447 +205,451 @@
 		case $field1 in
 			386bsd)
 				basic_machine=i386-pc
-				os=bsd
+				basic_os=bsd
 				;;
 			a29khif)
 				basic_machine=a29k-amd
-				os=udi
+				basic_os=udi
 				;;
 			adobe68k)
 				basic_machine=m68010-adobe
-				os=scout
+				basic_os=scout
 				;;
 			alliant)
 				basic_machine=fx80-alliant
-				os=
+				basic_os=
 				;;
 			altos | altos3068)
 				basic_machine=m68k-altos
-				os=
+				basic_os=
 				;;
 			am29k)
 				basic_machine=a29k-none
-				os=bsd
+				basic_os=bsd
 				;;
 			amdahl)
 				basic_machine=580-amdahl
-				os=sysv
+				basic_os=sysv
 				;;
 			amiga)
 				basic_machine=m68k-unknown
-				os=
+				basic_os=
 				;;
 			amigaos | amigados)
 				basic_machine=m68k-unknown
-				os=amigaos
+				basic_os=amigaos
 				;;
 			amigaunix | amix)
 				basic_machine=m68k-unknown
-				os=sysv4
+				basic_os=sysv4
 				;;
 			apollo68)
 				basic_machine=m68k-apollo
-				os=sysv
+				basic_os=sysv
 				;;
 			apollo68bsd)
 				basic_machine=m68k-apollo
-				os=bsd
+				basic_os=bsd
 				;;
 			aros)
 				basic_machine=i386-pc
-				os=aros
+				basic_os=aros
 				;;
 			aux)
 				basic_machine=m68k-apple
-				os=aux
+				basic_os=aux
 				;;
 			balance)
 				basic_machine=ns32k-sequent
-				os=dynix
+				basic_os=dynix
 				;;
 			blackfin)
 				basic_machine=bfin-unknown
-				os=linux
+				basic_os=linux
 				;;
 			cegcc)
 				basic_machine=arm-unknown
-				os=cegcc
+				basic_os=cegcc
 				;;
 			convex-c1)
 				basic_machine=c1-convex
-				os=bsd
+				basic_os=bsd
 				;;
 			convex-c2)
 				basic_machine=c2-convex
-				os=bsd
+				basic_os=bsd
 				;;
 			convex-c32)
 				basic_machine=c32-convex
-				os=bsd
+				basic_os=bsd
 				;;
 			convex-c34)
 				basic_machine=c34-convex
-				os=bsd
+				basic_os=bsd
 				;;
 			convex-c38)
 				basic_machine=c38-convex
-				os=bsd
+				basic_os=bsd
 				;;
 			cray)
 				basic_machine=j90-cray
-				os=unicos
+				basic_os=unicos
 				;;
 			crds | unos)
 				basic_machine=m68k-crds
-				os=
+				basic_os=
 				;;
 			da30)
 				basic_machine=m68k-da30
-				os=
+				basic_os=
 				;;
 			decstation | pmax | pmin | dec3100 | decstatn)
 				basic_machine=mips-dec
-				os=
+				basic_os=
 				;;
 			delta88)
 				basic_machine=m88k-motorola
-				os=sysv3
+				basic_os=sysv3
 				;;
 			dicos)
 				basic_machine=i686-pc
-				os=dicos
+				basic_os=dicos
 				;;
 			djgpp)
 				basic_machine=i586-pc
-				os=msdosdjgpp
+				basic_os=msdosdjgpp
 				;;
 			ebmon29k)
 				basic_machine=a29k-amd
-				os=ebmon
+				basic_os=ebmon
 				;;
 			es1800 | OSE68k | ose68k | ose | OSE)
 				basic_machine=m68k-ericsson
-				os=ose
+				basic_os=ose
 				;;
 			gmicro)
 				basic_machine=tron-gmicro
-				os=sysv
+				basic_os=sysv
 				;;
 			go32)
 				basic_machine=i386-pc
-				os=go32
+				basic_os=go32
 				;;
 			h8300hms)
 				basic_machine=h8300-hitachi
-				os=hms
+				basic_os=hms
 				;;
 			h8300xray)
 				basic_machine=h8300-hitachi
-				os=xray
+				basic_os=xray
 				;;
 			h8500hms)
 				basic_machine=h8500-hitachi
-				os=hms
+				basic_os=hms
 				;;
 			harris)
 				basic_machine=m88k-harris
-				os=sysv3
+				basic_os=sysv3
 				;;
 			hp300 | hp300hpux)
 				basic_machine=m68k-hp
-				os=hpux
+				basic_os=hpux
 				;;
 			hp300bsd)
 				basic_machine=m68k-hp
-				os=bsd
+				basic_os=bsd
 				;;
 			hppaosf)
 				basic_machine=hppa1.1-hp
-				os=osf
+				basic_os=osf
 				;;
 			hppro)
 				basic_machine=hppa1.1-hp
-				os=proelf
+				basic_os=proelf
 				;;
 			i386mach)
 				basic_machine=i386-mach
-				os=mach
+				basic_os=mach
 				;;
 			isi68 | isi)
 				basic_machine=m68k-isi
-				os=sysv
+				basic_os=sysv
 				;;
 			m68knommu)
 				basic_machine=m68k-unknown
-				os=linux
+				basic_os=linux
 				;;
 			magnum | m3230)
 				basic_machine=mips-mips
-				os=sysv
+				basic_os=sysv
 				;;
 			merlin)
 				basic_machine=ns32k-utek
-				os=sysv
+				basic_os=sysv
 				;;
 			mingw64)
 				basic_machine=x86_64-pc
-				os=mingw64
+				basic_os=mingw64
 				;;
 			mingw32)
 				basic_machine=i686-pc
-				os=mingw32
+				basic_os=mingw32
 				;;
 			mingw32ce)
 				basic_machine=arm-unknown
-				os=mingw32ce
+				basic_os=mingw32ce
 				;;
 			monitor)
 				basic_machine=m68k-rom68k
-				os=coff
+				basic_os=coff
 				;;
 			morphos)
 				basic_machine=powerpc-unknown
-				os=morphos
+				basic_os=morphos
 				;;
 			moxiebox)
 				basic_machine=moxie-unknown
-				os=moxiebox
+				basic_os=moxiebox
 				;;
 			msdos)
 				basic_machine=i386-pc
-				os=msdos
+				basic_os=msdos
 				;;
 			msys)
 				basic_machine=i686-pc
-				os=msys
+				basic_os=msys
 				;;
 			mvs)
 				basic_machine=i370-ibm
-				os=mvs
+				basic_os=mvs
 				;;
 			nacl)
 				basic_machine=le32-unknown
-				os=nacl
+				basic_os=nacl
 				;;
 			ncr3000)
 				basic_machine=i486-ncr
-				os=sysv4
+				basic_os=sysv4
 				;;
 			netbsd386)
 				basic_machine=i386-pc
-				os=netbsd
+				basic_os=netbsd
 				;;
 			netwinder)
 				basic_machine=armv4l-rebel
-				os=linux
+				basic_os=linux
 				;;
 			news | news700 | news800 | news900)
 				basic_machine=m68k-sony
-				os=newsos
+				basic_os=newsos
 				;;
 			news1000)
 				basic_machine=m68030-sony
-				os=newsos
+				basic_os=newsos
 				;;
 			necv70)
 				basic_machine=v70-nec
-				os=sysv
+				basic_os=sysv
 				;;
 			nh3000)
 				basic_machine=m68k-harris
-				os=cxux
+				basic_os=cxux
 				;;
 			nh[45]000)
 				basic_machine=m88k-harris
-				os=cxux
+				basic_os=cxux
 				;;
 			nindy960)
 				basic_machine=i960-intel
-				os=nindy
+				basic_os=nindy
 				;;
 			mon960)
 				basic_machine=i960-intel
-				os=mon960
+				basic_os=mon960
 				;;
 			nonstopux)
 				basic_machine=mips-compaq
-				os=nonstopux
+				basic_os=nonstopux
 				;;
 			os400)
 				basic_machine=powerpc-ibm
-				os=os400
+				basic_os=os400
 				;;
 			OSE68000 | ose68000)
 				basic_machine=m68000-ericsson
-				os=ose
+				basic_os=ose
 				;;
 			os68k)
 				basic_machine=m68k-none
-				os=os68k
+				basic_os=os68k
 				;;
 			paragon)
 				basic_machine=i860-intel
-				os=osf
+				basic_os=osf
 				;;
 			parisc)
 				basic_machine=hppa-unknown
-				os=linux
+				basic_os=linux
+				;;
+			psp)
+				basic_machine=mipsallegrexel-sony
+				basic_os=psp
 				;;
 			pw32)
 				basic_machine=i586-unknown
-				os=pw32
+				basic_os=pw32
 				;;
 			rdos | rdos64)
 				basic_machine=x86_64-pc
-				os=rdos
+				basic_os=rdos
 				;;
 			rdos32)
 				basic_machine=i386-pc
-				os=rdos
+				basic_os=rdos
 				;;
 			rom68k)
 				basic_machine=m68k-rom68k
-				os=coff
+				basic_os=coff
 				;;
 			sa29200)
 				basic_machine=a29k-amd
-				os=udi
+				basic_os=udi
 				;;
 			sei)
 				basic_machine=mips-sei
-				os=seiux
+				basic_os=seiux
 				;;
 			sequent)
 				basic_machine=i386-sequent
-				os=
+				basic_os=
 				;;
 			sps7)
 				basic_machine=m68k-bull
-				os=sysv2
+				basic_os=sysv2
 				;;
 			st2000)
 				basic_machine=m68k-tandem
-				os=
+				basic_os=
 				;;
 			stratus)
 				basic_machine=i860-stratus
-				os=sysv4
+				basic_os=sysv4
 				;;
 			sun2)
 				basic_machine=m68000-sun
-				os=
+				basic_os=
 				;;
 			sun2os3)
 				basic_machine=m68000-sun
-				os=sunos3
+				basic_os=sunos3
 				;;
 			sun2os4)
 				basic_machine=m68000-sun
-				os=sunos4
+				basic_os=sunos4
 				;;
 			sun3)
 				basic_machine=m68k-sun
-				os=
+				basic_os=
 				;;
 			sun3os3)
 				basic_machine=m68k-sun
-				os=sunos3
+				basic_os=sunos3
 				;;
 			sun3os4)
 				basic_machine=m68k-sun
-				os=sunos4
+				basic_os=sunos4
 				;;
 			sun4)
 				basic_machine=sparc-sun
-				os=
+				basic_os=
 				;;
 			sun4os3)
 				basic_machine=sparc-sun
-				os=sunos3
+				basic_os=sunos3
 				;;
 			sun4os4)
 				basic_machine=sparc-sun
-				os=sunos4
+				basic_os=sunos4
 				;;
 			sun4sol2)
 				basic_machine=sparc-sun
-				os=solaris2
+				basic_os=solaris2
 				;;
 			sun386 | sun386i | roadrunner)
 				basic_machine=i386-sun
-				os=
+				basic_os=
 				;;
 			sv1)
 				basic_machine=sv1-cray
-				os=unicos
+				basic_os=unicos
 				;;
 			symmetry)
 				basic_machine=i386-sequent
-				os=dynix
+				basic_os=dynix
 				;;
 			t3e)
 				basic_machine=alphaev5-cray
-				os=unicos
+				basic_os=unicos
 				;;
 			t90)
 				basic_machine=t90-cray
-				os=unicos
+				basic_os=unicos
 				;;
 			toad1)
 				basic_machine=pdp10-xkl
-				os=tops20
+				basic_os=tops20
 				;;
 			tpf)
 				basic_machine=s390x-ibm
-				os=tpf
+				basic_os=tpf
 				;;
 			udi29k)
 				basic_machine=a29k-amd
-				os=udi
+				basic_os=udi
 				;;
 			ultra3)
 				basic_machine=a29k-nyu
-				os=sym1
+				basic_os=sym1
 				;;
 			v810 | necv810)
 				basic_machine=v810-nec
-				os=none
+				basic_os=none
 				;;
 			vaxv)
 				basic_machine=vax-dec
-				os=sysv
+				basic_os=sysv
 				;;
 			vms)
 				basic_machine=vax-dec
-				os=vms
+				basic_os=vms
 				;;
 			vsta)
 				basic_machine=i386-pc
-				os=vsta
+				basic_os=vsta
 				;;
 			vxworks960)
 				basic_machine=i960-wrs
-				os=vxworks
+				basic_os=vxworks
 				;;
 			vxworks68)
 				basic_machine=m68k-wrs
-				os=vxworks
+				basic_os=vxworks
 				;;
 			vxworks29k)
 				basic_machine=a29k-wrs
-				os=vxworks
+				basic_os=vxworks
 				;;
 			xbox)
 				basic_machine=i686-pc
-				os=mingw32
+				basic_os=mingw32
 				;;
 			ymp)
 				basic_machine=ymp-cray
-				os=unicos
+				basic_os=unicos
 				;;
 			*)
 				basic_machine=$1
-				os=
+				basic_os=
 				;;
 		esac
 		;;
@@ -683,17 +701,17 @@
 	bluegene*)
 		cpu=powerpc
 		vendor=ibm
-		os=cnk
+		basic_os=cnk
 		;;
 	decsystem10* | dec10*)
 		cpu=pdp10
 		vendor=dec
-		os=tops10
+		basic_os=tops10
 		;;
 	decsystem20* | dec20*)
 		cpu=pdp10
 		vendor=dec
-		os=tops20
+		basic_os=tops20
 		;;
 	delta | 3300 | motorola-3300 | motorola-delta \
 	      | 3300-motorola | delta-motorola)
@@ -703,7 +721,7 @@
 	dpx2*)
 		cpu=m68k
 		vendor=bull
-		os=sysv3
+		basic_os=sysv3
 		;;
 	encore | umax | mmax)
 		cpu=ns32k
@@ -712,7 +730,7 @@
 	elxsi)
 		cpu=elxsi
 		vendor=elxsi
-		os=${os:-bsd}
+		basic_os=${basic_os:-bsd}
 		;;
 	fx2800)
 		cpu=i860
@@ -725,7 +743,7 @@
 	h3050r* | hiux*)
 		cpu=hppa1.1
 		vendor=hitachi
-		os=hiuxwe2
+		basic_os=hiuxwe2
 		;;
 	hp3k9[0-9][0-9] | hp9[0-9][0-9])
 		cpu=hppa1.0
@@ -768,36 +786,36 @@
 	i*86v32)
 		cpu=`echo "$1" | sed -e 's/86.*/86/'`
 		vendor=pc
-		os=sysv32
+		basic_os=sysv32
 		;;
 	i*86v4*)
 		cpu=`echo "$1" | sed -e 's/86.*/86/'`
 		vendor=pc
-		os=sysv4
+		basic_os=sysv4
 		;;
 	i*86v)
 		cpu=`echo "$1" | sed -e 's/86.*/86/'`
 		vendor=pc
-		os=sysv
+		basic_os=sysv
 		;;
 	i*86sol2)
 		cpu=`echo "$1" | sed -e 's/86.*/86/'`
 		vendor=pc
-		os=solaris2
+		basic_os=solaris2
 		;;
 	j90 | j90-cray)
 		cpu=j90
 		vendor=cray
-		os=${os:-unicos}
+		basic_os=${basic_os:-unicos}
 		;;
 	iris | iris4d)
 		cpu=mips
 		vendor=sgi
-		case $os in
+		case $basic_os in
 		    irix*)
 			;;
 		    *)
-			os=irix4
+			basic_os=irix4
 			;;
 		esac
 		;;
@@ -808,26 +826,26 @@
 	*mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
 		cpu=m68k
 		vendor=atari
-		os=mint
+		basic_os=mint
 		;;
 	news-3600 | risc-news)
 		cpu=mips
 		vendor=sony
-		os=newsos
+		basic_os=newsos
 		;;
 	next | m*-next)
 		cpu=m68k
 		vendor=next
-		case $os in
+		case $basic_os in
 		    openstep*)
 		        ;;
 		    nextstep*)
 			;;
 		    ns2*)
-		      os=nextstep2
+		      basic_os=nextstep2
 			;;
 		    *)
-		      os=nextstep3
+		      basic_os=nextstep3
 			;;
 		esac
 		;;
@@ -838,12 +856,12 @@
 	op50n-* | op60c-*)
 		cpu=hppa1.1
 		vendor=oki
-		os=proelf
+		basic_os=proelf
 		;;
 	pa-hitachi)
 		cpu=hppa1.1
 		vendor=hitachi
-		os=hiuxwe2
+		basic_os=hiuxwe2
 		;;
 	pbd)
 		cpu=sparc
@@ -880,12 +898,12 @@
 	sde)
 		cpu=mipsisa32
 		vendor=sde
-		os=${os:-elf}
+		basic_os=${basic_os:-elf}
 		;;
 	simso-wrs)
 		cpu=sparclite
 		vendor=wrs
-		os=vxworks
+		basic_os=vxworks
 		;;
 	tower | tower-32)
 		cpu=m68k
@@ -902,7 +920,7 @@
 	w89k-*)
 		cpu=hppa1.1
 		vendor=winbond
-		os=proelf
+		basic_os=proelf
 		;;
 	none)
 		cpu=none
@@ -919,9 +937,11 @@
 
 	*-*)
 		# shellcheck disable=SC2162
+		saved_IFS=$IFS
 		IFS="-" read cpu vendor <<EOF
 $basic_machine
 EOF
+		IFS=$saved_IFS
 		;;
 	# We use `pc' rather than `unknown'
 	# because (1) that's what they normally are, and
@@ -955,11 +975,11 @@
 	# some cases the only manufacturer, in others, it is the most popular.
 	craynv-unknown)
 		vendor=cray
-		os=${os:-unicosmp}
+		basic_os=${basic_os:-unicosmp}
 		;;
 	c90-unknown | c90-cray)
 		vendor=cray
-		os=${os:-unicos}
+		basic_os=${Basic_os:-unicos}
 		;;
 	fx80-unknown)
 		vendor=alliant
@@ -1003,7 +1023,7 @@
 	dpx20-unknown | dpx20-bull)
 		cpu=rs6000
 		vendor=bull
-		os=${os:-bosx}
+		basic_os=${basic_os:-bosx}
 		;;
 
 	# Here we normalize CPU types irrespective of the vendor
@@ -1012,7 +1032,7 @@
 		;;
 	blackfin-*)
 		cpu=bfin
-		os=linux
+		basic_os=linux
 		;;
 	c54x-*)
 		cpu=tic54x
@@ -1025,7 +1045,7 @@
 		;;
 	e500v[12]-*)
 		cpu=powerpc
-		os=$os"spe"
+		basic_os=${basic_os}"spe"
 		;;
 	mips3*-*)
 		cpu=mips64
@@ -1035,7 +1055,7 @@
 		;;
 	m68knommu-*)
 		cpu=m68k
-		os=linux
+		basic_os=linux
 		;;
 	m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
 		cpu=s12z
@@ -1045,7 +1065,7 @@
 		;;
 	parisc-*)
 		cpu=hppa
-		os=linux
+		basic_os=linux
 		;;
 	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
 		cpu=i586
@@ -1101,11 +1121,14 @@
 	xscale-* | xscalee[bl]-*)
 		cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
 		;;
+	arm64-*)
+		cpu=aarch64
+		;;
 
 	# Recognize the canonical CPU Types that limit and/or modify the
 	# company names they are paired with.
 	cr16-*)
-		os=${os:-elf}
+		basic_os=${basic_os:-elf}
 		;;
 	crisv32-* | etraxfs*-*)
 		cpu=crisv32
@@ -1116,7 +1139,7 @@
 		vendor=axis
 		;;
 	crx-*)
-		os=${os:-elf}
+		basic_os=${basic_os:-elf}
 		;;
 	neo-tandem)
 		cpu=neo
@@ -1138,16 +1161,12 @@
 		cpu=nsx
 		vendor=tandem
 		;;
-	s390-*)
-		cpu=s390
-		vendor=ibm
-		;;
-	s390x-*)
-		cpu=s390x
-		vendor=ibm
+	mipsallegrexel-sony)
+		cpu=mipsallegrexel
+		vendor=sony
 		;;
 	tile*-*)
-		os=${os:-linux-gnu}
+		basic_os=${basic_os:-linux-gnu}
 		;;
 
 	*)
@@ -1163,8 +1182,8 @@
 			| alphapca5[67] | alpha64pca5[67] \
 			| am33_2.0 \
 			| amdgcn \
-			| arc | arceb \
-			| arm  | arm[lb]e | arme[lb] | armv* \
+			| arc | arceb | arc32 | arc64 \
+			| arm | arm[lb]e | arme[lb] | armv* \
 			| avr | avr32 \
 			| asmjs \
 			| ba \
@@ -1183,6 +1202,7 @@
 			| k1om \
 			| le32 | le64 \
 			| lm32 \
+			| loongarch32 | loongarch64 | loongarchx32 \
 			| m32c | m32r | m32rle \
 			| m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
 			| m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
@@ -1201,9 +1221,13 @@
 			| mips64vr5900 | mips64vr5900el \
 			| mipsisa32 | mipsisa32el \
 			| mipsisa32r2 | mipsisa32r2el \
+			| mipsisa32r3 | mipsisa32r3el \
+			| mipsisa32r5 | mipsisa32r5el \
 			| mipsisa32r6 | mipsisa32r6el \
 			| mipsisa64 | mipsisa64el \
 			| mipsisa64r2 | mipsisa64r2el \
+			| mipsisa64r3 | mipsisa64r3el \
+			| mipsisa64r5 | mipsisa64r5el \
 			| mipsisa64r6 | mipsisa64r6el \
 			| mipsisa64sb1 | mipsisa64sb1el \
 			| mipsisa64sr71k | mipsisa64sr71kel \
@@ -1227,8 +1251,9 @@
 			| powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
 			| pru \
 			| pyramid \
-			| riscv | riscv32 | riscv64 \
+			| riscv | riscv32 | riscv32be | riscv64 | riscv64be \
 			| rl78 | romp | rs6000 | rx \
+			| s390 | s390x \
 			| score \
 			| sh | shl \
 			| sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
@@ -1238,6 +1263,7 @@
 			| sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
 			| spu \
 			| tahoe \
+			| thumbv7* \
 			| tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
 			| tron \
 			| ubicom32 \
@@ -1275,8 +1301,49 @@
 
 # Decode manufacturer-specific aliases for certain operating systems.
 
-if [ x$os != x ]
+if test x$basic_os != x
 then
+
+# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just
+# set os.
+case $basic_os in
+	gnu/linux*)
+		kernel=linux
+		os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'`
+		;;
+	os2-emx)
+		kernel=os2
+		os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'`
+		;;
+	nto-qnx*)
+		kernel=nto
+		os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'`
+		;;
+	*-*)
+		# shellcheck disable=SC2162
+		saved_IFS=$IFS
+		IFS="-" read kernel os <<EOF
+$basic_os
+EOF
+		IFS=$saved_IFS
+		;;
+	# Default OS when just kernel was specified
+	nto*)
+		kernel=nto
+		os=`echo "$basic_os" | sed -e 's|nto|qnx|'`
+		;;
+	linux*)
+		kernel=linux
+		os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
+		;;
+	*)
+		kernel=
+		os=$basic_os
+		;;
+esac
+
+# Now, normalize the OS (knowing we just have one component, it's not a kernel,
+# etc.)
 case $os in
 	# First match some system type aliases that might get confused
 	# with valid system types.
@@ -1288,7 +1355,7 @@
 		os=cnk
 		;;
 	solaris1 | solaris1.*)
-		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		os=`echo "$os" | sed -e 's|solaris1|sunos4|'`
 		;;
 	solaris)
 		os=solaris2
@@ -1296,9 +1363,6 @@
 	unixware*)
 		os=sysv4.2uw
 		;;
-	gnu/linux*)
-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-		;;
 	# es1800 is here to avoid being matched by es* (a different OS)
 	es1800*)
 		os=ose
@@ -1320,12 +1384,9 @@
 		os=sco3.2v4
 		;;
 	sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		os=`echo "$os" | sed -e 's/sco3.2./sco3.2v/'`
 		;;
-	sco3.2v[4-9]* | sco5v6*)
-		# Don't forget version if it is 3.2v4 or newer.
-		;;
-	scout)
+	sco*v* | scout)
 		# Don't match below
 		;;
 	sco*)
@@ -1334,78 +1395,25 @@
 	psos*)
 		os=psos
 		;;
-	# Now accept the basic system types.
-	# The portable systems comes first.
-	# Each alternative MUST end in a * to match a version number.
-	# sysv* is not here because it comes later, after sysvr4.
-	gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
-	     | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\
-	     | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
-	     | sym* | kopensolaris* | plan9* \
-	     | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
-	     | aos* | aros* | cloudabi* | sortix* | twizzler* \
-	     | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
-	     | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
-	     | knetbsd* | mirbsd* | netbsd* \
-	     | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \
-	     | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \
-	     | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
-	     | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
-	     | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \
-	     | chorusrdb* | cegcc* | glidix* \
-	     | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
-	     | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \
-	     | linux-newlib* | linux-musl* | linux-uclibc* \
-	     | uxpv* | beos* | mpeix* | udk* | moxiebox* \
-	     | interix* | uwin* | mks* | rhapsody* | darwin* \
-	     | openstep* | oskit* | conix* | pw32* | nonstopux* \
-	     | storm-chaos* | tops10* | tenex* | tops20* | its* \
-	     | os2* | vos* | palmos* | uclinux* | nucleus* \
-	     | morphos* | superux* | rtmk* | windiss* \
-	     | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
-	     | skyos* | haiku* | rdos* | toppers* | drops* | es* \
-	     | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
-	     | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
-	     | nsk* | powerunix)
-	# Remember, each alternative MUST END IN *, to match a version number.
-		;;
 	qnx*)
-		case $cpu in
-		    x86 | i*86)
-			;;
-		    *)
-			os=nto-$os
-			;;
-		esac
+		os=qnx
 		;;
 	hiux*)
 		os=hiuxwe2
 		;;
-	nto-qnx*)
-		;;
-	nto*)
-		os=`echo $os | sed -e 's|nto|nto-qnx|'`
-		;;
-	sim | xray | os68k* | v88r* \
-	    | windows* | osx | abug | netware* | os9* \
-	    | macos* | mpw* | magic* | mmixware* | mon960* | lnews*)
-		;;
-	linux-dietlibc)
-		os=linux-dietlibc
-		;;
-	linux*)
-		os=`echo $os | sed -e 's|linux|linux-gnu|'`
-		;;
 	lynx*178)
 		os=lynxos178
 		;;
 	lynx*5)
 		os=lynxos5
 		;;
+	lynxos*)
+		# don't get caught up in next wildcard
+		;;
 	lynx*)
 		os=lynxos
 		;;
-	mac*)
+	mac[0-9]*)
 		os=`echo "$os" | sed -e 's|mac|macos|'`
 		;;
 	opened*)
@@ -1452,7 +1460,7 @@
 		;;
 	# Preserve the version number of sinix5.
 	sinix5.*)
-		os=`echo $os | sed -e 's|sinix|sysv|'`
+		os=`echo "$os" | sed -e 's|sinix|sysv|'`
 		;;
 	sinix*)
 		os=sysv4
@@ -1475,18 +1483,12 @@
 	sysvr4)
 		os=sysv4
 		;;
-	# This must come after sysvr4.
-	sysv*)
-		;;
 	ose*)
 		os=ose
 		;;
 	*mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
 		os=mint
 		;;
-	zvmoe)
-		os=zvmoe
-		;;
 	dicos*)
 		os=dicos
 		;;
@@ -1503,19 +1505,11 @@
 			;;
 		esac
 		;;
-	nacl*)
-		;;
-	ios)
-		;;
-	none)
-		;;
-	*-eabi)
-		;;
 	*)
-		echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2
-		exit 1
+		# No normalization, but not necessarily accepted, that comes below.
 		;;
 esac
+
 else
 
 # Here we handle the default operating systems that come with various machines.
@@ -1528,6 +1522,7 @@
 # will signal an error saying that MANUFACTURER isn't an operating
 # system, and we'll never get to this point.
 
+kernel=
 case $cpu-$vendor in
 	score-*)
 		os=elf
@@ -1539,7 +1534,8 @@
 		os=riscix1.2
 		;;
 	arm*-rebel)
-		os=linux
+		kernel=linux
+		os=gnu
 		;;
 	arm*-semi)
 		os=aout
@@ -1705,84 +1701,179 @@
 		os=none
 		;;
 esac
+
 fi
 
+# Now, validate our (potentially fixed-up) OS.
+case $os in
+	# Sometimes we do "kernel-libc", so those need to count as OSes.
+	musl* | newlib* | relibc* | uclibc*)
+		;;
+	# Likewise for "kernel-abi"
+	eabi* | gnueabi*)
+		;;
+	# VxWorks passes extra cpu info in the 4th filed.
+	simlinux | simwindows | spe)
+		;;
+	# Now accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST end in a * to match a version number.
+	gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+	     | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
+	     | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+	     | sym* |  plan9* | psp* | sim* | xray* | os68k* | v88r* \
+	     | hiux* | abug | nacl* | netware* | windows* \
+	     | os9* | macos* | osx* | ios* \
+	     | mpw* | magic* | mmixware* | mon960* | lnews* \
+	     | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+	     | aos* | aros* | cloudabi* | sortix* | twizzler* \
+	     | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+	     | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+	     | mirbsd* | netbsd* | dicos* | openedition* | ose* \
+	     | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
+	     | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
+	     | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+	     | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+	     | udi* | lites* | ieee* | go32* | aux* | hcos* \
+	     | chorusrdb* | cegcc* | glidix* | serenity* \
+	     | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+	     | midipix* | mingw32* | mingw64* | mint* \
+	     | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+	     | interix* | uwin* | mks* | rhapsody* | darwin* \
+	     | openstep* | oskit* | conix* | pw32* | nonstopux* \
+	     | storm-chaos* | tops10* | tenex* | tops20* | its* \
+	     | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
+	     | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
+	     | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+	     | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+	     | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+	     | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
+	     | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr*)
+		;;
+	# This one is extra strict with allowed versions
+	sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		;;
+	none)
+		;;
+	*)
+		echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# As a final step for OS-related things, validate the OS-kernel combination
+# (given a valid OS), if there is a kernel.
+case $kernel-$os in
+	linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \
+		   | linux-musl* | linux-relibc* | linux-uclibc* )
+		;;
+	uclinux-uclibc* )
+		;;
+	-dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* )
+		# These are just libc implementations, not actual OSes, and thus
+		# require a kernel.
+		echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
+		exit 1
+		;;
+	kfreebsd*-gnu* | kopensolaris*-gnu*)
+		;;
+	vxworks-simlinux | vxworks-simwindows | vxworks-spe)
+		;;
+	nto-qnx*)
+		;;
+	os2-emx)
+		;;
+	*-eabi* | *-gnueabi*)
+		;;
+	-*)
+		# Blank kernel with real OS is always fine.
+		;;
+	*-*)
+		echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
+		exit 1
+		;;
+esac
+
 # Here we handle the case where we know the os, and the CPU type, but not the
 # manufacturer.  We pick the logical manufacturer.
 case $vendor in
 	unknown)
-		case $os in
-			riscix*)
+		case $cpu-$os in
+			*-riscix*)
 				vendor=acorn
 				;;
-			sunos*)
+			*-sunos*)
 				vendor=sun
 				;;
-			cnk*|-aix*)
+			*-cnk* | *-aix*)
 				vendor=ibm
 				;;
-			beos*)
+			*-beos*)
 				vendor=be
 				;;
-			hpux*)
+			*-hpux*)
 				vendor=hp
 				;;
-			mpeix*)
+			*-mpeix*)
 				vendor=hp
 				;;
-			hiux*)
+			*-hiux*)
 				vendor=hitachi
 				;;
-			unos*)
+			*-unos*)
 				vendor=crds
 				;;
-			dgux*)
+			*-dgux*)
 				vendor=dg
 				;;
-			luna*)
+			*-luna*)
 				vendor=omron
 				;;
-			genix*)
+			*-genix*)
 				vendor=ns
 				;;
-			clix*)
+			*-clix*)
 				vendor=intergraph
 				;;
-			mvs* | opened*)
+			*-mvs* | *-opened*)
 				vendor=ibm
 				;;
-			os400*)
+			*-os400*)
 				vendor=ibm
 				;;
-			ptx*)
+			s390-* | s390x-*)
+				vendor=ibm
+				;;
+			*-ptx*)
 				vendor=sequent
 				;;
-			tpf*)
+			*-tpf*)
 				vendor=ibm
 				;;
-			vxsim* | vxworks* | windiss*)
+			*-vxsim* | *-vxworks* | *-windiss*)
 				vendor=wrs
 				;;
-			aux*)
+			*-aux*)
 				vendor=apple
 				;;
-			hms*)
+			*-hms*)
 				vendor=hitachi
 				;;
-			mpw* | macos*)
+			*-mpw* | *-macos*)
 				vendor=apple
 				;;
-			*mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+			*-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
 				vendor=atari
 				;;
-			vos*)
+			*-vos*)
 				vendor=stratus
 				;;
 		esac
 		;;
 esac
 
-echo "$cpu-$vendor-$os"
+echo "$cpu-$vendor-${kernel:+$kernel-}$os"
 exit
 
 # Local variables:
diff --git a/build-aux/cross-options.pl b/build-aux/cross-options.pl
index 9552c27..754b4ee 100755
--- a/build-aux/cross-options.pl
+++ b/build-aux/cross-options.pl
@@ -1,5 +1,24 @@
 #! /usr/bin/env perl
 
+# Generate a release announcement message.
+
+# Copyright (C) 2007-2021 Free Software Foundation, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+#
+# Written by Akim Demaille.
+
 use warnings;
 use 5.005;
 use strict;
diff --git a/build-aux/depcomp b/build-aux/depcomp
index 3f27387..715e343 100755
--- a/build-aux/depcomp
+++ b/build-aux/depcomp
@@ -3,7 +3,7 @@
 
 scriptversion=2018-03-07.03; # UTC
 
-# Copyright (C) 1999-2019 Free Software Foundation, Inc.
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/build-aux/do-release-commit-and-tag b/build-aux/do-release-commit-and-tag
index 339c5df..5605f42 100755
--- a/build-aux/do-release-commit-and-tag
+++ b/build-aux/do-release-commit-and-tag
@@ -7,7 +7,7 @@
 
 # Note: this is a bash script (could be zsh or dash)
 
-# Copyright (C) 2009-2019 Free Software Foundation, Inc.
+# Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/build-aux/gendocs.sh b/build-aux/gendocs.sh
index fd6a4b8..1241ee3 100755
--- a/build-aux/gendocs.sh
+++ b/build-aux/gendocs.sh
@@ -2,9 +2,9 @@
 # gendocs.sh -- generate a GNU manual in many formats.  This script is
 #   mentioned in maintain.texi.  See the help message below for usage details.
 
-scriptversion=2019-01-01.00
+scriptversion=2021-07-19.18
 
-# Copyright 2003-2019 Free Software Foundation, Inc.
+# Copyright 2003-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -58,7 +58,7 @@
 commonarg= # passed to all makeinfo/texi2html invcations.
 dirargs=   # passed to all tools (-I dir).
 dirs=      # -I directories.
-htmlarg="--css-ref=/software/gnulib/manual.css -c TOP_NODE_UP_URL=/manual"
+htmlarg="--css-ref=https://www.gnu.org/software/gnulib/manual.css -c TOP_NODE_UP_URL=/manual"
 default_htmlarg=true
 infoarg=--no-split
 generate_ascii=true
@@ -73,7 +73,7 @@
 
 version="gendocs.sh $scriptversion
 
-Copyright 2019 Free Software Foundation, Inc.
+Copyright 2021 Free Software Foundation, Inc.
 There is NO warranty.  You may redistribute this software
 under the terms of the GNU General Public License.
 For more information about these matters, see the files named COPYING."
@@ -202,7 +202,7 @@
 
 if $default_htmlarg && test -n "$use_texi2html"; then
   # The legacy texi2html doesn't support TOP_NODE_UP_URL
-  htmlarg="--css-ref=/software/gnulib/manual.css"
+  htmlarg="--css-ref=https://www.gnu.org/software/gnulib/manual.css"
 fi
 
 if test -n "$srcfile"; then
diff --git a/build-aux/git-version-gen b/build-aux/git-version-gen
index d855645..da525aa 100755
--- a/build-aux/git-version-gen
+++ b/build-aux/git-version-gen
@@ -1,8 +1,8 @@
 #!/bin/sh
 # Print a version string.
-scriptversion=2018-03-07.03; # UTC
+scriptversion=2019-10-13.15; # UTC
 
-# Copyright (C) 2007-2019 Free Software Foundation, Inc.
+# Copyright (C) 2007-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -75,10 +75,10 @@
 year=`expr "$scriptversion" : '\([^-]*\)'`
 version="git-version-gen $scriptversion
 
-Copyright $year Free Software Foundation, Inc.
-There is NO warranty.  You may redistribute this software
-under the terms of the GNU General Public License.
-For more information about these matters, see the files named COPYING."
+Copyright (C) ${year} Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law."
 
 usage="\
 Usage: $me [OPTION]... \$srcdir/.tarball-version [TAG-NORMALIZATION-SED-SCRIPT]
diff --git a/build-aux/gitlog-to-changelog b/build-aux/gitlog-to-changelog
index 163c48c..9ff15f6 100755
--- a/build-aux/gitlog-to-changelog
+++ b/build-aux/gitlog-to-changelog
@@ -3,7 +3,7 @@
 
 # Convert git log output to ChangeLog format.
 
-# Copyright (C) 2008-2019 Free Software Foundation, Inc.
+# Copyright (C) 2008-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -31,11 +31,11 @@
 # are valid code in both sh and perl.  When executed by sh, they re-execute
 # the script through the perl program found in $PATH.  The '-x' option
 # is essential as well; without it, perl would re-execute the script
-# through /bin/sh.  When executed by  perl, the next two lines are a no-op.
+# through /bin/sh.  When executed by perl, the next two lines are a no-op.
 eval 'exec perl -wSx "$0" "$@"'
      if 0;
 
-my $VERSION = '2018-03-07 03:47'; # UTC
+my $VERSION = '2021-02-24 23:42'; # UTC
 # The definition above must lie within the first 8 lines in order
 # for the Emacs time-stamp write hook (at end) to update it.
 # If you change this file with Emacs, please let the write hook
@@ -455,7 +455,8 @@
           # If there were any lines
           if (@line == 0)
             {
-              warn "$ME: warning: empty commit message:\n  $date_line\n";
+              warn "$ME: warning: empty commit message:\n"
+                   . "  commit $sha\n  $date_line\n";
             }
           else
             {
diff --git a/build-aux/gnu-web-doc-update b/build-aux/gnu-web-doc-update
index 0d52171..cc553f9 100755
--- a/build-aux/gnu-web-doc-update
+++ b/build-aux/gnu-web-doc-update
@@ -2,9 +2,9 @@
 # Run this after each non-alpha release, to update the web documentation at
 # https://www.gnu.org/software/$pkg/manual/
 
-VERSION=2018-03-07.03; # UTC
+VERSION=2021-01-09.09; # UTC
 
-# Copyright (C) 2009-2019 Free Software Foundation, Inc.
+# Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -41,6 +41,7 @@
   -C, --builddir=DIR  location of (configured) Makefile (default: .)
   -n, --dry-run       don't actually commit anything
   -m, --mirror        remove out of date files from document server
+  -u, --user          the name of the CVS user on Savannah
   --help              print this help, then exit
   --version           print version number, then exit
 
@@ -109,6 +110,7 @@
 builddir=.
 dryrun=
 rm_stale='echo'
+cvs_user="$USER"
 while test $# != 0
 do
   # Handle --option=value by splitting apart and putting back on argv.
@@ -126,6 +128,7 @@
     -C|--builddir) shift; builddir=$1; shift ;;
     -n|--dry-run) dryrun=echo; shift;;
     -m|--mirror) rm_stale=''; shift;;
+    -u|--user) shift; cvs_user=$1; shift ;;
     --*) die "unrecognized option: $1";;
     *) break;;
   esac
@@ -172,7 +175,7 @@
 
 tmp=$(mktemp -d web-doc-update.XXXXXX) || exit 1
 ( cd $tmp \
-    && $CVS -d $USER@cvs.sv.gnu.org:/webcvs/$pkg co $pkg )
+    && $CVS -d $cvs_user@cvs.sv.gnu.org:/webcvs/$pkg co $pkg )
 $RSYNC -avP "$builddir"/doc/manual/ $tmp/$pkg/manual
 
 (
diff --git a/build-aux/gnupload b/build-aux/gnupload
index afbafa9..e7822ae 100755
--- a/build-aux/gnupload
+++ b/build-aux/gnupload
@@ -1,13 +1,13 @@
 #!/bin/sh
 # Sign files and upload them.
 
-scriptversion=2018-05-19.18; # UTC
+scriptversion=2021-04-11.09; # UTC
 
-# Copyright (C) 2004-2019 Free Software Foundation, Inc.
+# Copyright (C) 2004-2021 Free Software Foundation, Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
+# the Free Software Foundation; either version 2, or (at your option)
 # any later version.
 #
 # This program is distributed in the hope that it will be useful,
@@ -27,8 +27,8 @@
 GPG=gpg
 # Choose the proper version of gpg, so as to avoid a
 # "gpg-agent is not available in this session" error
-# when gpg-agent is version 3 but gpg is still version 1.
-# FIXME-2020: remove, once all major distros ship gpg version 3 as /usr/bin/gpg
+# when gpg-agent is version 2 but gpg is still version 1.
+# FIXME-2020: remove, once all major distros ship gpg version 2 as /usr/bin/gpg
 gpg_agent_version=`(gpg-agent --version) 2>/dev/null | sed -e '2,$d' -e 's/^[^0-9]*//'`
 case "$gpg_agent_version" in
   2.*)
@@ -145,6 +145,12 @@
 
 Send patches and bug reports to <bug-gnulib@gnu.org>."
 
+copyright_year=`echo "$scriptversion" | sed -e 's/[^0-9].*//'`
+copyright="Copyright (C) ${copyright_year} Free Software Foundation, Inc.
+License GPLv2+: GNU GPL version 2 or later <https://gnu.org/licenses/gpl.html>.
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law."
+
 # Read local configuration file
 if test -r "$conffile"; then
   echo "$0: Reading configuration file $conffile"
@@ -209,7 +215,8 @@
       ;;
     --version)
       echo "gnupload $scriptversion"
-      exit $?
+      echo "$copyright"
+      exit 0
       ;;
     --)
       shift
diff --git a/build-aux/install-reloc b/build-aux/install-reloc
index aa17a60..f77b0d1 100755
--- a/build-aux/install-reloc
+++ b/build-aux/install-reloc
@@ -1,6 +1,6 @@
 #!/bin/sh
 # install-reloc - install a program including a relocating wrapper
-# Copyright (C) 2003-2019 Free Software Foundation, Inc.
+# Copyright (C) 2003-2021 Free Software Foundation, Inc.
 # Written by Bruno Haible <bruno@clisp.org>, 2003.
 #
 # This program is free software: you can redistribute it and/or modify
@@ -237,8 +237,16 @@
                "$srcdir"/readlink.c \
                "$srcdir"/stat.c \
                "$srcdir"/canonicalize-lgpl.c \
+               "$srcdir"/malloc/scratch_buffer_dupfree.c \
+               "$srcdir"/malloc/scratch_buffer_grow.c \
+               "$srcdir"/malloc/scratch_buffer_grow_preserve.c \
+               "$srcdir"/malloc/scratch_buffer_set_array_size.c \
+               "$srcdir"/malloc.c \
+               "$srcdir"/realloc.c \
+               "$srcdir"/free.c \
+               "$srcdir"/mempcpy.c \
+               "$srcdir"/rawmemchr.c \
                "$srcdir"/malloca.c \
-               "$srcdir"/lstat.c \
                "$srcdir"/relocatable.c \
                "$srcdir"/setenv.c \
                "$srcdir"/c-ctype.c \
@@ -255,8 +263,16 @@
         readlink.o \
         stat.o \
         canonicalize-lgpl.o \
+        scratch_buffer_dupfree.o \
+        scratch_buffer_grow.o \
+        scratch_buffer_grow_preserve.o \
+        scratch_buffer_set_array_size.o \
+        malloc.o \
+        realloc.o \
+        free.o \
+        mempcpy.o \
+        rawmemchr.o \
         malloca.o \
-        lstat.o \
         relocatable.o \
         setenv.o \
         c-ctype.o
diff --git a/build-aux/install-sh b/build-aux/install-sh
index 20d8b2e..ec298b5 100755
--- a/build-aux/install-sh
+++ b/build-aux/install-sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2018-03-11.20; # UTC
+scriptversion=2020-11-14.01; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -69,6 +69,11 @@
 # Desired mode of installed file.
 mode=0755
 
+# Create dirs (including intermediate dirs) using mode 755.
+# This is like GNU 'install' as of coreutils 8.32 (2020).
+mkdir_umask=22
+
+backupsuffix=
 chgrpcmd=
 chmodcmd=$chmodprog
 chowncmd=
@@ -99,18 +104,28 @@
      --version  display version info and exit.
 
   -c            (ignored)
-  -C            install only if different (preserve the last data modification time)
+  -C            install only if different (preserve data modification time)
   -d            create directories instead of installing files.
   -g GROUP      $chgrpprog installed files to GROUP.
   -m MODE       $chmodprog installed files to MODE.
   -o USER       $chownprog installed files to USER.
+  -p            pass -p to $cpprog.
   -s            $stripprog installed files.
+  -S SUFFIX     attempt to back up existing files, with suffix SUFFIX.
   -t DIRECTORY  install into DIRECTORY.
   -T            report an error if DSTFILE is a directory.
 
 Environment variables override the default commands:
   CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
   RMPROG STRIPPROG
+
+By default, rm is invoked with -f; when overridden with RMPROG,
+it's up to you to specify -f if you want it.
+
+If -S is not specified, no backups are attempted.
+
+Email bug reports to bug-automake@gnu.org.
+Automake home page: https://www.gnu.org/software/automake/
 "
 
 while test $# -ne 0; do
@@ -137,8 +152,13 @@
     -o) chowncmd="$chownprog $2"
         shift;;
 
+    -p) cpprog="$cpprog -p";;
+
     -s) stripcmd=$stripprog;;
 
+    -S) backupsuffix="$2"
+        shift;;
+
     -t)
         is_target_a_directory=always
         dst_arg=$2
@@ -255,6 +275,10 @@
     dstdir=$dst
     test -d "$dstdir"
     dstdir_status=$?
+    # Don't chown directories that already exist.
+    if test $dstdir_status = 0; then
+      chowncmd=""
+    fi
   else
 
     # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
@@ -301,22 +325,6 @@
   if test $dstdir_status != 0; then
     case $posix_mkdir in
       '')
-        # Create intermediate dirs using mode 755 as modified by the umask.
-        # This is like FreeBSD 'install' as of 1997-10-28.
-        umask=`umask`
-        case $stripcmd.$umask in
-          # Optimize common cases.
-          *[2367][2367]) mkdir_umask=$umask;;
-          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-          *[0-7])
-            mkdir_umask=`expr $umask + 22 \
-              - $umask % 100 % 40 + $umask % 20 \
-              - $umask % 10 % 4 + $umask % 2
-            `;;
-          *) mkdir_umask=$umask,go-w;;
-        esac
-
         # With -d, create the new directory with the user-specified mode.
         # Otherwise, rely on $mkdir_umask.
         if test -n "$dir_arg"; then
@@ -326,52 +334,49 @@
         fi
 
         posix_mkdir=false
-        case $umask in
-          *[123567][0-7][0-7])
-            # POSIX mkdir -p sets u+wx bits regardless of umask, which
-            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-            ;;
-          *)
-            # Note that $RANDOM variable is not portable (e.g. dash);  Use it
-            # here however when possible just to lower collision chance.
-            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	# The $RANDOM variable is not portable (e.g., dash).  Use it
+	# here however when possible just to lower collision chance.
+	tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
 
-            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
+	trap '
+	  ret=$?
+	  rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
+	  exit $ret
+	' 0
 
-            # Because "mkdir -p" follows existing symlinks and we likely work
-            # directly in world-writeable /tmp, make sure that the '$tmpdir'
-            # directory is successfully created first before we actually test
-            # 'mkdir -p' feature.
-            if (umask $mkdir_umask &&
-                $mkdirprog $mkdir_mode "$tmpdir" &&
-                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
-            then
-              if test -z "$dir_arg" || {
-                   # Check for POSIX incompatibilities with -m.
-                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-                   # other-writable bit of parent directory when it shouldn't.
-                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-                   test_tmpdir="$tmpdir/a"
-                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
-                   case $ls_ld_tmpdir in
-                     d????-?r-*) different_mode=700;;
-                     d????-?--*) different_mode=755;;
-                     *) false;;
-                   esac &&
-                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
-                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
-                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-                   }
-                 }
-              then posix_mkdir=:
-              fi
-              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
-            else
-              # Remove any dirs left behind by ancient mkdir implementations.
-              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
-            fi
-            trap '' 0;;
-        esac;;
+	# Because "mkdir -p" follows existing symlinks and we likely work
+	# directly in world-writeable /tmp, make sure that the '$tmpdir'
+	# directory is successfully created first before we actually test
+	# 'mkdir -p'.
+	if (umask $mkdir_umask &&
+	    $mkdirprog $mkdir_mode "$tmpdir" &&
+	    exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+	then
+	  if test -z "$dir_arg" || {
+	       # Check for POSIX incompatibilities with -m.
+	       # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+	       # other-writable bit of parent directory when it shouldn't.
+	       # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+	       test_tmpdir="$tmpdir/a"
+	       ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+	       case $ls_ld_tmpdir in
+		 d????-?r-*) different_mode=700;;
+		 d????-?--*) different_mode=755;;
+		 *) false;;
+	       esac &&
+	       $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+		 ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+		 test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+	       }
+	     }
+	  then posix_mkdir=:
+	  fi
+	  rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+	else
+	  # Remove any dirs left behind by ancient mkdir implementations.
+	  rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+	fi
+	trap '' 0;;
     esac
 
     if
@@ -382,7 +387,7 @@
     then :
     else
 
-      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # mkdir does not conform to POSIX,
       # or it failed possibly due to a race condition.  Create the
       # directory the slow way, step by step, checking for races as we go.
 
@@ -411,7 +416,7 @@
           prefixes=
         else
           if $posix_mkdir; then
-            (umask=$mkdir_umask &&
+            (umask $mkdir_umask &&
              $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
             # Don't fail if two instances are running concurrently.
             test -d "$prefix" || exit 1
@@ -488,6 +493,13 @@
     then
       rm -f "$dsttmp"
     else
+      # If $backupsuffix is set, and the file being installed
+      # already exists, attempt a backup.  Don't worry if it fails,
+      # e.g., if mv doesn't support -f.
+      if test -n "$backupsuffix" && test -f "$dst"; then
+        $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
+      fi
+
       # Rename the file to the real destination.
       $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
 
@@ -502,9 +514,9 @@
         # file should still install successfully.
         {
           test ! -f "$dst" ||
-          $doit $rmcmd -f "$dst" 2>/dev/null ||
+          $doit $rmcmd "$dst" 2>/dev/null ||
           { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+            { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
           } ||
           { echo "$0: cannot unlink or rename $dst" >&2
             (exit 1); exit 1
diff --git a/build-aux/javacomp.sh.in b/build-aux/javacomp.sh.in
index 0f610dd..7352592 100644
--- a/build-aux/javacomp.sh.in
+++ b/build-aux/javacomp.sh.in
@@ -1,7 +1,7 @@
 #!/bin/sh
 # Compile a Java program.
 
-# Copyright (C) 2001-2019 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
 # Written by Bruno Haible <haible@clisp.cons.org>, 2001.
 #
 # This program is free software: you can redistribute it and/or modify
diff --git a/build-aux/javaexec.sh.in b/build-aux/javaexec.sh.in
index 2f9eecd..f3c60f0 100644
--- a/build-aux/javaexec.sh.in
+++ b/build-aux/javaexec.sh.in
@@ -1,7 +1,7 @@
 #!/bin/sh
 # Execute a Java program.
 
-# Copyright (C) 2001-2019 Free Software Foundation, Inc.
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
 # Written by Bruno Haible <haible@clisp.cons.org>, 2001.
 #
 # This program is free software: you can redistribute it and/or modify
diff --git a/build-aux/libtool-reloc b/build-aux/libtool-reloc
index 9d899ab..f574c3a 100755
--- a/build-aux/libtool-reloc
+++ b/build-aux/libtool-reloc
@@ -1,6 +1,6 @@
 #!/bin/sh
 # libtool-reloc - libtool wrapper with support for relocatable programs
-# Copyright (C) 2019 Free Software Foundation, Inc.
+# Copyright (C) 2019-2021 Free Software Foundation, Inc.
 # Written by Bruno Haible <bruno@clisp.org>, 2019.
 #
 # This program is free software: you can redistribute it and/or modify
diff --git a/build-aux/local.mk b/build-aux/local.mk
index b9cb25a..cc0a5d7 100644
--- a/build-aux/local.mk
+++ b/build-aux/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2000-2015, 2018-2019 Free Software Foundation, Inc.
+## Copyright (C) 2000-2015, 2018-2021 Free Software Foundation, Inc.
 ##
 ## This program is free software: you can redistribute it and/or modify
 ## it under the terms of the GNU General Public License as published by
@@ -11,7 +11,7 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 EXTRA_DIST +=					\
   build-aux/Darwin.valgrind			\
diff --git a/build-aux/mdate-sh b/build-aux/mdate-sh
index 79687f7..e6d572d 100755
--- a/build-aux/mdate-sh
+++ b/build-aux/mdate-sh
@@ -3,7 +3,7 @@
 
 scriptversion=2018-03-07.03; # UTC
 
-# Copyright (C) 1995-2019 Free Software Foundation, Inc.
+# Copyright (C) 1995-2021 Free Software Foundation, Inc.
 # written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
 #
 # This program is free software; you can redistribute it and/or modify
diff --git a/build-aux/missing b/build-aux/missing
index 625aeb1..1fe1611 100755
--- a/build-aux/missing
+++ b/build-aux/missing
@@ -3,7 +3,7 @@
 
 scriptversion=2018-03-07.03; # UTC
 
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
 # Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
 
 # This program is free software; you can redistribute it and/or modify
diff --git a/build-aux/move-if-change b/build-aux/move-if-change
index 9073f1a..e85e90a 100755
--- a/build-aux/move-if-change
+++ b/build-aux/move-if-change
@@ -8,7 +8,7 @@
 # If you change this file with Emacs, please let the write hook
 # do its job.  Otherwise, update this string manually.
 
-# Copyright (C) 2002-2019 Free Software Foundation, Inc.
+# Copyright (C) 2002-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/build-aux/prefix-gnulib-mk b/build-aux/prefix-gnulib-mk
index 445d916..347ddcd 100755
--- a/build-aux/prefix-gnulib-mk
+++ b/build-aux/prefix-gnulib-mk
@@ -3,20 +3,11 @@
 
 # Rewrite a gnulib.mk, adding prefixes to work with automake's subdir-objects.
 
-# Copyright (C) 2012-2019 Free Software Foundation, Inc.
+# Copyright (C) 2012-2021 Free Software Foundation, Inc.
 #
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 #
 # Written by Jim Meyering
 
@@ -31,11 +22,11 @@
 # are valid code in both sh and perl.  When executed by sh, they re-execute
 # the script through the perl program found in $PATH.  The '-x' option
 # is essential as well; without it, perl would re-execute the script
-# through /bin/sh.  When executed by  perl, the next two lines are a no-op.
+# through /bin/sh.  When executed by perl, the next two lines are a no-op.
 eval 'exec perl -wSx "$0" "$@"'
      if 0;
 
-my $VERSION = '2012-01-21 17:13'; # UTC
+my $VERSION = '2020-04-04 15:07'; # UTC
 # The definition above must lie within the first 8 lines in order
 # for the Emacs time-stamp write hook (at end) to update it.
 # If you change this file with Emacs, please let the write hook
diff --git a/build-aux/reloc-ldflags b/build-aux/reloc-ldflags
index 625fef2..ff748fe 100755
--- a/build-aux/reloc-ldflags
+++ b/build-aux/reloc-ldflags
@@ -2,7 +2,7 @@
 # Output a system dependent linker command for putting a relocatable library
 # search path into an executable.
 #
-#   Copyright 2003-2019 Free Software Foundation, Inc.
+#   Copyright 2003-2021 Free Software Foundation, Inc.
 #   Written by Bruno Haible <bruno@clisp.org>, 2003.
 #
 #   This program is free software: you can redistribute it and/or modify
@@ -56,7 +56,7 @@
 origin_token=
 case "$host_os" in
   linux* | gnu* | kfreebsd* | \
-  freebsd* | dragonfly* | \
+  freebsd* | dragonfly* | midnightbsd* | \
   netbsd* | \
   openbsd* | \
   solaris* | \
@@ -68,7 +68,9 @@
     ;;
 esac
 if test -n "$origin_token"; then
-  rpath=
+  # We are not on AIX, HP-UX, or IRIX. Therefore the -rpath options are
+  # cumulative.
+  rpath_options=
   save_IFS="$IFS"; IFS=":"
   for dir in $library_path_value; do
     IFS="$save_IFS"
@@ -89,8 +91,8 @@
           idir=`echo "$idir" | sed -e 's,^//*[^/]*,,'`
         done
         dir="$origin_token"`echo "$idir" | sed -e 's,//*[^/]*,/..,g'`"$dir"
-        # Add dir to rpath.
-        rpath="${rpath}${rpath:+ }$dir"
+        # Augment rpath_options with dir.
+        rpath_options="${rpath_options}${rpath_options:+ }-Wl,-rpath,$dir"
         ;;
       *)
         if test -n "$dir"; then
@@ -101,15 +103,14 @@
   done
   IFS="$save_IFS"
   # Output it.
-  if test -n "$rpath"; then
+  if test -n "$rpath_options"; then
     case "$host_os" in
       # At least some versions of FreeBSD, DragonFly, and OpenBSD need the
       # linker option "-z origin". See <https://lekensteyn.nl/rpath.html>.
       freebsd* | dragonfly* | openbsd*)
-        echo "-Wl,-z,origin -Wl,-rpath,$rpath" ;;
-      *)
-        echo "-Wl,-rpath,$rpath" ;;
+        rpath_options="-Wl,-z,origin $rpath_options" ;;
     esac
+    echo "$rpath_options"
   fi
 else
   echo "relocation via rpath not supported on this system: $host" 1>&2
diff --git a/build-aux/relocatable.sh.in b/build-aux/relocatable.sh.in
index 1bbc15f..d2d569d 100644
--- a/build-aux/relocatable.sh.in
+++ b/build-aux/relocatable.sh.in
@@ -6,7 +6,7 @@
 # package by hand; see doc/relocatable-maint.texi (in Gnulib) for
 # details.
 #
-# Copyright (C) 2003-2019 Free Software Foundation, Inc.
+# Copyright (C) 2003-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/build-aux/test-driver b/build-aux/test-driver
index b8521a4..be73b80 100755
--- a/build-aux/test-driver
+++ b/build-aux/test-driver
@@ -3,7 +3,7 @@
 
 scriptversion=2018-03-07.03; # UTC
 
-# Copyright (C) 2011-2018 Free Software Foundation, Inc.
+# Copyright (C) 2011-2021 Free Software Foundation, Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -42,11 +42,13 @@
 {
   cat <<END
 Usage:
-  test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
-              [--expect-failure={yes|no}] [--color-tests={yes|no}]
-              [--enable-hard-errors={yes|no}] [--]
+  test-driver --test-name NAME --log-file PATH --trs-file PATH
+              [--expect-failure {yes|no}] [--color-tests {yes|no}]
+              [--enable-hard-errors {yes|no}] [--]
               TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
+
 The '--test-name', '--log-file' and '--trs-file' options are mandatory.
+See the GNU Automake documentation for information.
 END
 }
 
@@ -103,8 +105,11 @@
 trap "st=141; $do_exit" 13
 trap "st=143; $do_exit" 15
 
-# Test script is run here.
-"$@" >$log_file 2>&1
+# Test script is run here. We create the file first, then append to it,
+# to ameliorate tests themselves also writing to the log file. Our tests
+# don't, but others can (automake bug#35762).
+: >"$log_file"
+"$@" >>"$log_file" 2>&1
 estatus=$?
 
 if test $enable_hard_errors = no && test $estatus -eq 99; then
@@ -126,7 +131,7 @@
 # know whether the test passed or failed simply by looking at the '.log'
 # file, without the need of also peaking into the corresponding '.trs'
 # file (automake bug#11814).
-echo "$res $test_name (exit status: $estatus)" >>$log_file
+echo "$res $test_name (exit status: $estatus)" >>"$log_file"
 
 # Report outcome to console.
 echo "${col}${res}${std}: $test_name"
diff --git a/build-aux/texinfo.tex b/build-aux/texinfo.tex
index 1ea515b..e48383d 100644
--- a/build-aux/texinfo.tex
+++ b/build-aux/texinfo.tex
@@ -3,9 +3,9 @@
 % Load plain if necessary, i.e., if running under initex.
 \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
 %
-\def\texinfoversion{2019-09-24.13}
+\def\texinfoversion{2021-04-25.21}
 %
-% Copyright 1985, 1986, 1988, 1990-2019 Free Software Foundation, Inc.
+% Copyright 1985, 1986, 1988, 1990-2021 Free Software Foundation, Inc.
 %
 % This texinfo.tex file is free software: you can redistribute it and/or
 % modify it under the terms of the GNU General Public License as
@@ -33,7 +33,7 @@
 % The texinfo.tex in any given distribution could well be out
 % of date, so if that's what you're using, please check.
 %
-% Send bug reports to bug-texinfo@gnu.org.  Please include including a
+% Send bug reports to bug-texinfo@gnu.org.  Please include a
 % complete document in each bug report with which we can reproduce the
 % problem.  Patches are, of course, greatly appreciated.
 %
@@ -349,36 +349,21 @@
   \ifodd\pageno  \advance\hoffset by \bindingoffset
   \else \advance\hoffset by -\bindingoffset\fi
   %
+  \checkchapterpage
+  %
   % Retrieve the information for the headings from the marks in the page,
   % and call Plain TeX's \makeheadline and \makefootline, which use the
   % values in \headline and \footline.
   %
-  % This is used to check if we are on the first page of a chapter.
-  \ifcase1\the\savedtopmark\fi
-  \let\prevchaptername\thischaptername
-  \ifcase0\firstmark\fi
-  \let\curchaptername\thischaptername
-  %
-  \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
-  %
-  \ifx\curchaptername\prevchaptername
-    \let\thischapterheading\thischapter
-  \else
-    % \thischapterheading is the same as \thischapter except it is blank
-    % for the first page of a chapter.  This is to prevent the chapter name
-    % being shown twice.
-    \def\thischapterheading{}%
-  \fi
-  %
   % Common context changes for both heading and footing.
   % Do this outside of the \shipout so @code etc. will be expanded in
   % the headline as they should be, not taken literally (outputting ''code).
-  \def\commmonheadfootline{\let\hsize=\txipagewidth \texinfochars}
+  \def\commonheadfootline{\let\hsize=\txipagewidth \texinfochars}
   %
-  \global\setbox\headlinebox = \vbox{\commmonheadfootline \makeheadline}%
-  %
+  \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
+  \global\setbox\headlinebox = \vbox{\commonheadfootline \makeheadline}%
   \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
-  \global\setbox\footlinebox = \vbox{\commmonheadfootline \makefootline}%
+  \global\setbox\footlinebox = \vbox{\commonheadfootline \makefootline}%
   %
   {%
     % Set context for writing to auxiliary files like index files.
@@ -423,6 +408,22 @@
 \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
 }
 
+% Check if we are on the first page of a chapter.  Used for printing headings.
+\newif\ifchapterpage
+\def\checkchapterpage{%
+  % Get the chapter that was current at the end of the last page
+  \ifcase1\the\savedtopmark\fi
+  \let\prevchaptername\thischaptername
+  %
+  \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
+  \let\curchaptername\thischaptername
+  %
+  \ifx\curchaptername\prevchaptername
+    \chapterpagefalse
+  \else
+    \chapterpagetrue
+  \fi
+}
 
 % Argument parsing
 
@@ -571,9 +572,8 @@
   \fi
 }
 
-% @end foo executes the definition of \Efoo.
-% But first, it executes a specialized version of \checkenv
-%
+
+% @end foo calls \checkenv and executes the definition of \Efoo.
 \parseargdef\end{%
   \if 1\csname iscond.#1\endcsname
   \else
@@ -1002,6 +1002,14 @@
   \global\everypar = {}%
 }
 
+% leave vertical mode without cancelling any first paragraph indent
+\gdef\imageindent{%
+  \toks0=\everypar
+  \everypar={}%
+  \ptexnoindent
+  \global\everypar=\toks0
+}
+
 
 % @refill is a no-op.
 \let\refill=\relax
@@ -1010,7 +1018,7 @@
 \let\setfilename=\comment
 
 % @bye.
-\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+\outer\def\bye{\chappager\pagelabels\tracingstats=1\ptexend}
 
 
 \message{pdf,}
@@ -1137,6 +1145,45 @@
 \fi
 
 
+% Output page labels information.
+% See PDF reference v.1.7 p.594, section 8.3.1.
+\ifpdf
+\def\pagelabels{%
+  \def\title{0 << /P (T-) /S /D >>}%
+  \edef\roman{\the\romancount << /S /r >>}%
+  \edef\arabic{\the\arabiccount << /S /D >>}%
+  %
+  % Page label ranges must be increasing.  Remove any duplicates.
+  % (There is a slight chance of this being wrong if e.g. there is
+  % a @contents but no @titlepage, etc.)
+  %
+  \ifnum\romancount=0 \def\roman{}\fi
+  \ifnum\arabiccount=0 \def\title{}%
+  \else
+    \ifnum\romancount=\arabiccount \def\roman{}\fi
+  \fi
+  %
+  \ifnum\romancount<\arabiccount
+    \pdfcatalog{/PageLabels << /Nums [\title \roman \arabic ] >> }\relax
+  \else
+    \pdfcatalog{/PageLabels << /Nums [\title \arabic \roman ] >> }\relax
+  \fi
+}
+\else
+  \let\pagelabels\relax
+\fi
+
+\newcount\pagecount \pagecount=0
+\newcount\romancount \romancount=0
+\newcount\arabiccount \arabiccount=0
+\ifpdf
+  \let\ptxadvancepageno\advancepageno
+  \def\advancepageno{%
+    \ptxadvancepageno\global\advance\pagecount by 1
+  }
+\fi
+
+
 % PDF uses PostScript string constants for the names of xref targets,
 % for display in the outlines, and in other places.  Thus, we have to
 % double any backslashes.  Otherwise, a name like "\node" will be
@@ -1427,7 +1474,13 @@
       % subentries, which we calculated on our first read of the .toc above.
       %
       % We use the node names as the destinations.
+      %
+      % Currently we prefix the section name with the section number
+      % for chapter and appendix headings only in order to avoid too much
+      % horizontal space being required in the PDF viewer.
       \def\numchapentry##1##2##3##4{%
+        \dopdfoutline{##2 ##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+      \def\unnchapentry##1##2##3##4{%
         \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
       \def\numsecentry##1##2##3##4{%
         \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
@@ -1669,9 +1722,13 @@
       % Therefore, we read toc only once.
       %
       % We use node names as destinations.
+      %
+      % Currently we prefix the section name with the section number
+      % for chapter and appendix headings only in order to avoid too much
+      % horizontal space being required in the PDF viewer.
       \def\partentry##1##2##3##4{}% ignore parts in the outlines
       \def\numchapentry##1##2##3##4{%
-        \dopdfoutline{##1}{1}{##3}{##4}}%
+        \dopdfoutline{##2 ##1}{1}{##3}{##4}}%
       \def\numsecentry##1##2##3##4{%
         \dopdfoutline{##1}{2}{##3}{##4}}%
       \def\numsubsecentry##1##2##3##4{%
@@ -1683,7 +1740,8 @@
       \let\appsecentry\numsecentry%
       \let\appsubsecentry\numsubsecentry%
       \let\appsubsubsecentry\numsubsubsecentry%
-      \let\unnchapentry\numchapentry%
+      \def\unnchapentry##1##2##3##4{%
+        \dopdfoutline{##1}{1}{##3}{##4}}%
       \let\unnsecentry\numsecentry%
       \let\unnsubsecentry\numsubsecentry%
       \let\unnsubsubsecentry\numsubsubsecentry%
@@ -1812,19 +1870,23 @@
       \closein 1
     \endgroup
     %
-    \def\xetexpdfext{pdf}%
-    \ifx\xeteximgext\xetexpdfext
-      \XeTeXpdffile "#1".\xeteximgext ""
-    \else
-      \def\xetexpdfext{PDF}%
+    % Putting an \hbox around the image can prevent an over-long line
+    % after the image.
+    \hbox\bgroup
+      \def\xetexpdfext{pdf}%
       \ifx\xeteximgext\xetexpdfext
         \XeTeXpdffile "#1".\xeteximgext ""
       \else
-        \XeTeXpicfile "#1".\xeteximgext ""
+        \def\xetexpdfext{PDF}%
+        \ifx\xeteximgext\xetexpdfext
+          \XeTeXpdffile "#1".\xeteximgext ""
+        \else
+          \XeTeXpicfile "#1".\xeteximgext ""
+        \fi
       \fi
-    \fi
-    \ifdim \wd0 >0pt width \xeteximagewidth \fi
-    \ifdim \wd2 >0pt height \xeteximageheight \fi \relax
+      \ifdim \wd0 >0pt width \xeteximagewidth \fi
+      \ifdim \wd2 >0pt height \xeteximageheight \fi \relax
+    \egroup
   }
 \fi
 
@@ -2496,7 +2558,7 @@
 \def\it{\fam=\itfam \setfontstyle{it}}
 \def\sl{\fam=\slfam \setfontstyle{sl}}
 \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
-\def\tt{\fam=\ttfam \setfontstyle{tt}}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}\def\ttstylename{tt}
 
 % Texinfo sort of supports the sans serif font style, which plain TeX does not.
 % So we set up a \sf.
@@ -2622,8 +2684,6 @@
 \definetextfontsizexi
 
 
-\message{markup,}
-
 % Check if we are currently using a typewriter font.  Since all the
 % Computer Modern typewriter fonts have zero interword stretch (and
 % shrink), and it is reasonable to expect all typewriter fonts to have
@@ -2631,68 +2691,14 @@
 %
 \def\ifmonospace{\ifdim\fontdimen3\font=0pt }
 
-% Markup style infrastructure.  \defmarkupstylesetup\INITMACRO will
-% define and register \INITMACRO to be called on markup style changes.
-% \INITMACRO can check \currentmarkupstyle for the innermost
-% style.
-
-\let\currentmarkupstyle\empty
-
-\def\setupmarkupstyle#1{%
-  \def\currentmarkupstyle{#1}%
-  \markupstylesetup
-}
-
-\let\markupstylesetup\empty
-
-\def\defmarkupstylesetup#1{%
-  \expandafter\def\expandafter\markupstylesetup
-    \expandafter{\markupstylesetup #1}%
-  \def#1%
-}
-
-% Markup style setup for left and right quotes.
-\defmarkupstylesetup\markupsetuplq{%
-  \expandafter\let\expandafter \temp
-    \csname markupsetuplq\currentmarkupstyle\endcsname
-  \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
-}
-
-\defmarkupstylesetup\markupsetuprq{%
-  \expandafter\let\expandafter \temp
-    \csname markupsetuprq\currentmarkupstyle\endcsname
-  \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
-}
-
 {
 \catcode`\'=\active
 \catcode`\`=\active
 
-\gdef\markupsetuplqdefault{\let`\lq}
-\gdef\markupsetuprqdefault{\let'\rq}
-
-\gdef\markupsetcodequoteleft{\let`\codequoteleft}
-\gdef\markupsetcodequoteright{\let'\codequoteright}
+\gdef\setcodequotes{\let`\codequoteleft \let'\codequoteright}
+\gdef\setregularquotes{\let`\lq \let'\rq}
 }
 
-\let\markupsetuplqcode \markupsetcodequoteleft
-\let\markupsetuprqcode \markupsetcodequoteright
-%
-\let\markupsetuplqexample \markupsetcodequoteleft
-\let\markupsetuprqexample \markupsetcodequoteright
-%
-\let\markupsetuplqkbd     \markupsetcodequoteleft
-\let\markupsetuprqkbd     \markupsetcodequoteright
-%
-\let\markupsetuplqsamp \markupsetcodequoteleft
-\let\markupsetuprqsamp \markupsetcodequoteright
-%
-\let\markupsetuplqverb \markupsetcodequoteleft
-\let\markupsetuprqverb \markupsetcodequoteright
-%
-\let\markupsetuplqverbatim \markupsetcodequoteleft
-\let\markupsetuprqverbatim \markupsetcodequoteright
-
 % Allow an option to not use regular directed right quote/apostrophe
 % (char 0x27), but instead the undirected quote from cmtt (char 0x0d).
 % The undirected quote is ugly, so don't make it the default, but it
@@ -2855,7 +2861,7 @@
 }
 
 % @samp.
-\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}
+\def\samp#1{{\setcodequotes\lq\tclose{#1}\rq\null}}
 
 % @indicateurl is \samp, that is, with quotes.
 \let\indicateurl=\samp
@@ -2898,8 +2904,7 @@
   \global\let'=\rq \global\let`=\lq  % default definitions
   %
   \global\def\code{\begingroup
-    \setupmarkupstyle{code}%
-    % The following should really be moved into \setupmarkupstyle handlers.
+    \setcodequotes
     \catcode\dashChar=\active  \catcode\underChar=\active
     \ifallowcodebreaks
      \let-\codedash
@@ -2987,10 +2992,18 @@
 % arg (if given), and not the url (which is then just the link target).
 \newif\ifurefurlonlylink
 
+% The default \pretolerance setting stops the penalty inserted in
+% \urefallowbreak being a discouragement to line breaking.  Set it to
+% a negative value for this paragraph only.  Hopefully this does not
+% conflict with redefinitions of \par done elsewhere.
+\def\nopretolerance{%
+\pretolerance=-1
+\def\par{\endgraf\pretolerance=100 \let\par\endgraf}%
+}
+
 % The main macro is \urefbreak, which allows breaking at expected
-% places within the url.  (There used to be another version, which
-% didn't support automatic breaking.)
-\def\urefbreak{\begingroup \urefcatcodes \dourefbreak}
+% places within the url.
+\def\urefbreak{\nopretolerance \begingroup \urefcatcodes \dourefbreak}
 \let\uref=\urefbreak
 %
 \def\dourefbreak#1{\urefbreakfinish #1,,,\finish}
@@ -3045,7 +3058,7 @@
   \urefcatcodes
   %
   \global\def\urefcode{\begingroup
-    \setupmarkupstyle{code}%
+    \setcodequotes
     \urefcatcodes
     \let&\urefcodeamp
     \let.\urefcodedot
@@ -3101,15 +3114,15 @@
 
 % Allow a ragged right output to aid breaking long URL's.  There can
 % be a break at the \allowbreak with no extra glue (if the existing stretch in
-% the line is sufficent), a break at the \penalty100 with extra glue added
+% the line is sufficient), a break at the \penalty with extra glue added
 % at the end of the line, or no break at all here.
 %   Changing the value of the penalty and/or the amount of stretch affects how
-% preferrable one choice is over the other.
+% preferable one choice is over the other.
 \def\urefallowbreak{%
-  \allowbreak
-  \hskip 0pt plus 4 em\relax
-  \penalty100
-  \hskip 0pt plus -4 em\relax
+  \penalty0\relax
+  \hskip 0pt plus 2 em\relax
+  \penalty1000\relax
+  \hskip 0pt plus -2 em\relax
 }
 
 \urefbreakstyle after
@@ -3166,8 +3179,8 @@
 \def\kbdsub#1#2#3\par{%
   \def\one{#1}\def\three{#3}\def\threex{??}%
   \ifx\one\xkey\ifx\threex\three \key{#2}%
-  \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
-  \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
+  \else{\tclose{\kbdfont\setcodequotes\look}}\fi
+  \else{\tclose{\kbdfont\setcodequotes\look}}\fi
 }
 
 % definition of @key that produces a lozenge.  Doesn't adjust to text size.
@@ -3184,7 +3197,7 @@
 % monospace, don't change it; that way, we respect @kbdinputstyle.  But
 % if it isn't monospace, then use \tt.
 %
-\def\key#1{{\setupmarkupstyle{key}%
+\def\key#1{{\setregularquotes
   \nohyphenation
   \ifmonospace\else\tt\fi
   #1}\null}
@@ -3305,6 +3318,29 @@
 \def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi}
 \def\finishsup#1{$\ptexsp{\hbox{\switchtolllsize #1}}$}%
 
+% provide this command from LaTeX as it is very common
+\def\frac#1#2{{{#1}\over{#2}}}
+
+% @displaymath.
+% \globaldefs is needed to recognize the end lines in \tex and
+% \end tex.  Set \thisenv as @end displaymath is seen before @end tex.
+{\obeylines
+\globaldefs=1
+\envdef\displaymath{%
+\tex%
+\def\thisenv{\displaymath}%
+\begingroup\let\end\displaymathend%
+$$%
+}
+
+\def\displaymathend{$$\endgroup\end}%
+
+\def\Edisplaymath{%
+\def\thisenv{\tex}%
+\end tex
+}}
+
+
 % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}.
 % Ignore unless FMTNAME == tex; then it is like @iftex and @tex,
 % except specified as a normal braced arg, so no newlines to worry about.
@@ -3509,7 +3545,7 @@
 
 % @pounds{} is a sterling sign, which Knuth put in the CM italic font.
 %
-\def\pounds{{\it\$}}
+\def\pounds{\ifmonospace{\ecfont\char"BF}\else{\it\$}\fi}
 
 % @euro{} comes from a separate font, depending on the current style.
 % We use the free feym* fonts from the eurosym package by Henrik
@@ -3658,11 +3694,19 @@
 \fi
 
 % Quotes.
-\chardef\quotedblleft="5C
-\chardef\quotedblright=`\"
 \chardef\quoteleft=`\`
 \chardef\quoteright=`\'
 
+% only change font for tt for correct kerning and to avoid using
+% \ecfont unless necessary.
+\def\quotedblleft{%
+  \ifmonospace{\ecfont\char"10}\else{\char"5C}\fi
+}
+
+\def\quotedblright{%
+  \ifmonospace{\ecfont\char"11}\else{\char`\"}\fi
+}
+
 
 \message{page headings,}
 
@@ -3784,12 +3828,19 @@
 
 \newtoks\evenheadline    % headline on even pages
 \newtoks\oddheadline     % headline on odd pages
+\newtoks\evenchapheadline% headline on even pages with a new chapter
+\newtoks\oddchapheadline % headline on odd pages with a new chapter
 \newtoks\evenfootline    % footline on even pages
 \newtoks\oddfootline     % footline on odd pages
 
 % Now make \makeheadline and \makefootline in Plain TeX use those variables
-\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
-                            \else \the\evenheadline \fi}}
+\headline={{\textfonts\rm
+            \ifchapterpage
+              \ifodd\pageno\the\oddchapheadline\else\the\evenchapheadline\fi
+            \else
+              \ifodd\pageno\the\oddheadline\else\the\evenheadline\fi
+            \fi}}
+
 \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
                             \else \the\evenfootline \fi}\HEADINGShook}
 \let\HEADINGShook=\relax
@@ -3805,12 +3856,14 @@
 \def\evenheading{\parsearg\evenheadingxxx}
 \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
 \def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
-\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+  \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
+  \global\evenchapheadline=\evenheadline}
 
 \def\oddheading{\parsearg\oddheadingxxx}
 \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
 \def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
-\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+  \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+  \global\oddchapheadline=\oddheadline}
 
 \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
 
@@ -3877,37 +3930,34 @@
 \parseargdef\headings{\csname HEADINGS#1\endcsname}
 
 \def\headingsoff{% non-global headings elimination
-  \evenheadline={\hfil}\evenfootline={\hfil}%
-   \oddheadline={\hfil}\oddfootline={\hfil}%
+  \evenheadline={\hfil}\evenfootline={\hfil}\evenchapheadline={\hfil}%
+   \oddheadline={\hfil}\oddfootline={\hfil}\oddchapheadline={\hfil}%
 }
 
 \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting
 \HEADINGSoff  % it's the default
 
 % When we turn headings on, set the page number to 1.
+\def\pageone{
+  \global\pageno=1
+  \global\arabiccount = \pagecount
+}
+
 % For double-sided printing, put current file name in lower left corner,
 % chapter name on inside top of right hand pages, document
 % title on inside top of left hand pages, and page numbers on outside top
 % edge of all pages.
 \def\HEADINGSdouble{%
-\global\pageno=1
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapterheading\hfil\folio}}
-\global\let\contentsalignmacro = \chapoddpage
+\pageone
+\HEADINGSdoublex
 }
 \let\contentsalignmacro = \chappager
 
 % For single-sided printing, chapter title goes across top left of page,
 % page number on top right.
 \def\HEADINGSsingle{%
-\global\pageno=1
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapterheading\hfil\folio}}
-\global\oddheadline={\line{\thischapterheading\hfil\folio}}
-\global\let\contentsalignmacro = \chappager
+\pageone
+\HEADINGSsinglex
 }
 \def\HEADINGSon{\HEADINGSdouble}
 
@@ -3917,7 +3967,9 @@
 \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}
 \global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\evenchapheadline={\line{\folio\hfil}}
+\global\oddchapheadline={\line{\hfil\folio}}
 \global\let\contentsalignmacro = \chapoddpage
 }
 
@@ -3925,8 +3977,22 @@
 \def\HEADINGSsinglex{%
 \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapterheading\hfil\folio}}
-\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\evenchapheadline={\line{\hfil\folio}}
+\global\oddchapheadline={\line{\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% for @setchapternewpage off
+\def\HEADINGSsinglechapoff{%
+\pageone
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\evenchapheadline=\evenheadline
+\global\oddchapheadline=\oddheadline
 \global\let\contentsalignmacro = \chappager
 }
 
@@ -4235,82 +4301,8 @@
   \doitemize{#1.}\flushcr
 }
 
-% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
-% to @enumerate.
-%
-\def\alphaenumerate{\enumerate{a}}
-\def\capsenumerate{\enumerate{A}}
-\def\Ealphaenumerate{\Eenumerate}
-\def\Ecapsenumerate{\Eenumerate}
-
 
 % @multitable macros
-% Amy Hendrickson, 8/18/94, 3/6/96
-%
-% @multitable ... @end multitable will make as many columns as desired.
-% Contents of each column will wrap at width given in preamble.  Width
-% can be specified either with sample text given in a template line,
-% or in percent of \hsize, the current width of text on page.
-
-% Table can continue over pages but will only break between lines.
-
-% To make preamble:
-%
-% Either define widths of columns in terms of percent of \hsize:
-%   @multitable @columnfractions .25 .3 .45
-%   @item ...
-%
-%   Numbers following @columnfractions are the percent of the total
-%   current hsize to be used for each column. You may use as many
-%   columns as desired.
-
-
-% Or use a template:
-%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
-%   @item ...
-%   using the widest term desired in each column.
-
-% Each new table line starts with @item, each subsequent new column
-% starts with @tab. Empty columns may be produced by supplying @tab's
-% with nothing between them for as many times as empty columns are needed,
-% ie, @tab@tab@tab will produce two empty columns.
-
-% @item, @tab do not need to be on their own lines, but it will not hurt
-% if they are.
-
-% Sample multitable:
-
-%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
-%   @item first col stuff @tab second col stuff @tab third col
-%   @item
-%   first col stuff
-%   @tab
-%   second col stuff
-%   @tab
-%   third col
-%   @item first col stuff @tab second col stuff
-%   @tab Many paragraphs of text may be used in any column.
-%
-%         They will wrap at the width determined by the template.
-%   @item@tab@tab This will be in third column.
-%   @end multitable
-
-% Default dimensions may be reset by user.
-% @multitableparskip is vertical space between paragraphs in table.
-% @multitableparindent is paragraph indent in table.
-% @multitablecolmargin is horizontal space to be left between columns.
-% @multitablelinespace is space to leave between table items, baseline
-%                                                            to baseline.
-%   0pt means it depends on current normal line spacing.
-%
-\newskip\multitableparskip
-\newskip\multitableparindent
-\newdimen\multitablecolspace
-\newskip\multitablelinespace
-\multitableparskip=0pt
-\multitableparindent=6pt
-\multitablecolspace=12pt
-\multitablelinespace=0pt
 
 % Macros used to set up halign preamble:
 %
@@ -4358,8 +4350,6 @@
   \go
 }
 
-% multitable-only commands.
-%
 % @headitem starts a heading row, which we typeset in bold.  Assignments
 % have to be global since we are inside the implicit group of an
 % alignment entry.  \everycr below resets \everytab so we don't have to
@@ -4376,14 +4366,8 @@
 % default for tables with no headings.
 \let\headitemcrhook=\relax
 %
-% A \tab used to include \hskip1sp.  But then the space in a template
-% line is not enough.  That is bad.  So let's go back to just `&' until
-% we again encounter the problem the 1sp was intended to solve.
-%					--karl, nathan@acm.org, 20apr99.
 \def\tab{\checkenv\multitable &\the\everytab}%
 
-% @multitable ... @end multitable definitions:
-%
 \newtoks\everytab  % insert after every tab.
 %
 \envdef\multitable{%
@@ -4398,9 +4382,8 @@
   %
   \tolerance=9500
   \hbadness=9500
-  \setmultitablespacing
-  \parskip=\multitableparskip
-  \parindent=\multitableparindent
+  \parskip=0pt
+  \parindent=6pt
   \overfullrule=0pt
   \global\colcount=0
   %
@@ -4430,47 +4413,24 @@
   % continue for many paragraphs if desired.
   \halign\bgroup &%
     \global\advance\colcount by 1
-    \multistrut
+    \strut
     \vtop{%
-      % Use the current \colcount to find the correct column width:
+      \advance\hsize by -1\leftskip
+      % Find the correct column width
       \hsize=\expandafter\csname col\the\colcount\endcsname
       %
-      % In order to keep entries from bumping into each other
-      % we will add a \leftskip of \multitablecolspace to all columns after
-      % the first one.
-      %
-      % If a template has been used, we will add \multitablecolspace
-      % to the width of each template entry.
-      %
-      % If the user has set preamble in terms of percent of \hsize we will
-      % use that dimension as the width of the column, and the \leftskip
-      % will keep entries from bumping into each other.  Table will start at
-      % left margin and final column will justify at right margin.
-      %
-      % Make sure we don't inherit \rightskip from the outer environment.
       \rightskip=0pt
       \ifnum\colcount=1
-	% The first column will be indented with the surrounding text.
-	\advance\hsize by\leftskip
+        \advance\hsize by\leftskip % Add indent of surrounding text
       \else
-	\ifsetpercent \else
-	  % If user has not set preamble in terms of percent of \hsize
-	  % we will advance \hsize by \multitablecolspace.
-	  \advance\hsize by \multitablecolspace
-	\fi
-       % In either case we will make \leftskip=\multitablecolspace:
-      \leftskip=\multitablecolspace
+        % In order to keep entries from bumping into each other.
+        \leftskip=12pt
+        \ifsetpercent \else
+          % If a template has been used
+          \advance\hsize by \leftskip
+        \fi
       \fi
-      % Ignoring space at the beginning and end avoids an occasional spurious
-      % blank line, when TeX decides to break the line at the space before the
-      % box from the multistrut, so the strut ends up on a line by itself.
-      % For example:
-      % @multitable @columnfractions .11 .89
-      % @item @code{#}
-      % @tab Legal holiday which is valid in major parts of the whole country.
-      % Is automatically provided with highlighting sequences respectively
-      % marking characters.
-      \noindent\ignorespaces##\unskip\multistrut
+      \noindent\ignorespaces##\unskip\strut
     }\cr
 }
 \def\Emultitable{%
@@ -4479,31 +4439,6 @@
   \global\setpercentfalse
 }
 
-\def\setmultitablespacing{%
-  \def\multistrut{\strut}% just use the standard line spacing
-  %
-  % Compute \multitablelinespace (if not defined by user) for use in
-  % \multitableparskip calculation.  We used define \multistrut based on
-  % this, but (ironically) that caused the spacing to be off.
-  % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
-\ifdim\multitablelinespace=0pt
-\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
-\global\advance\multitablelinespace by-\ht0
-\fi
-% Test to see if parskip is larger than space between lines of
-% table. If not, do nothing.
-%        If so, set to same dimension as multitablelinespace.
-\ifdim\multitableparskip>\multitablelinespace
-\global\multitableparskip=\multitablelinespace
-\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
-                                      % than skip between lines in the table.
-\fi%
-\ifdim\multitableparskip=0pt
-\global\multitableparskip=\multitablelinespace
-\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
-                                      % than skip between lines in the table.
-\fi}
-
 
 \message{conditionals,}
 
@@ -4841,7 +4776,7 @@
 
 % like the previous two, but they put @code around the argument.
 \def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx}
-\def\docodeindexxxx #1{\doind{\indexname}{\code{#1}}}
+\def\docodeindexxxx #1{\docind{\indexname}{#1}}
 
 
 % Used for the aux, toc and index files to prevent expansion of Texinfo
@@ -5138,43 +5073,44 @@
   \def\ss{ss}%
   \def\th{th}%
   %
-  \def\LaTeX{LaTeX}%
-  \def\TeX{TeX}%
+  \let\do\indexnofontsdef
   %
-  % Assorted special characters.  \defglyph gives the control sequence a
-  % definition that removes the {} that follows its use.
-  \defglyph\atchar{@}%
-  \defglyph\arrow{->}%
-  \defglyph\bullet{bullet}%
-  \defglyph\comma{,}%
-  \defglyph\copyright{copyright}%
-  \defglyph\dots{...}%
-  \defglyph\enddots{...}%
-  \defglyph\equiv{==}%
-  \defglyph\error{error}%
-  \defglyph\euro{euro}%
-  \defglyph\expansion{==>}%
-  \defglyph\geq{>=}%
-  \defglyph\guillemetleft{<<}%
-  \defglyph\guillemetright{>>}%
-  \defglyph\guilsinglleft{<}%
-  \defglyph\guilsinglright{>}%
-  \defglyph\leq{<=}%
-  \defglyph\lbracechar{\{}%
-  \defglyph\minus{-}%
-  \defglyph\point{.}%
-  \defglyph\pounds{pounds}%
-  \defglyph\print{-|}%
-  \defglyph\quotedblbase{"}%
-  \defglyph\quotedblleft{"}%
-  \defglyph\quotedblright{"}%
-  \defglyph\quoteleft{`}%
-  \defglyph\quoteright{'}%
-  \defglyph\quotesinglbase{,}%
-  \defglyph\rbracechar{\}}%
-  \defglyph\registeredsymbol{R}%
-  \defglyph\result{=>}%
-  \defglyph\textdegree{o}%
+  \do\LaTeX{LaTeX}%
+  \do\TeX{TeX}%
+  %
+  % Assorted special characters.
+  \do\atchar{@}%
+  \do\arrow{->}%
+  \do\bullet{bullet}%
+  \do\comma{,}%
+  \do\copyright{copyright}%
+  \do\dots{...}%
+  \do\enddots{...}%
+  \do\equiv{==}%
+  \do\error{error}%
+  \do\euro{euro}%
+  \do\expansion{==>}%
+  \do\geq{>=}%
+  \do\guillemetleft{<<}%
+  \do\guillemetright{>>}%
+  \do\guilsinglleft{<}%
+  \do\guilsinglright{>}%
+  \do\leq{<=}%
+  \do\lbracechar{\{}%
+  \do\minus{-}%
+  \do\point{.}%
+  \do\pounds{pounds}%
+  \do\print{-|}%
+  \do\quotedblbase{"}%
+  \do\quotedblleft{"}%
+  \do\quotedblright{"}%
+  \do\quoteleft{`}%
+  \do\quoteright{'}%
+  \do\quotesinglbase{,}%
+  \do\rbracechar{\}}%
+  \do\registeredsymbol{R}%
+  \do\result{=>}%
+  \do\textdegree{o}%
   %
   % We need to get rid of all macros, leaving only the arguments (if present).
   % Of course this is not nearly correct, but it is the best we can do for now.
@@ -5189,7 +5125,10 @@
   \macrolist
   \let\value\indexnofontsvalue
 }
-\def\defglyph#1#2{\def#1##1{#2}} % see above
+
+% Give the control sequence a definition that removes the {} that follows
+% its use, e.g. @AA{} -> AA
+\def\indexnofontsdef#1#2{\def#1##1{#2}}%
 
 
 
@@ -5208,6 +5147,20 @@
   \fi
 }
 
+% Same as \doind, but for code indices
+\def\docind#1#2{%
+  \iflinks
+  {%
+    %
+    \requireopenindexfile{#1}%
+    \edef\writeto{\csname#1indfile\endcsname}%
+    %
+    \def\indextext{#2}%
+    \safewhatsit\docindwrite
+  }%
+  \fi
+}
+
 % Check if an index file has been opened, and if not, open it.
 \def\requireopenindexfile#1{%
 \ifnum\csname #1indfile\endcsname=0
@@ -5274,6 +5227,9 @@
     % trim spaces.
     \edef\trimmed{\segment}%
     \edef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}%
+    \ifincodeindex
+      \edef\trimmed{\noexpand\code{\trimmed}}%
+    \fi
     %
     \xdef\bracedtext{\bracedtext{\trimmed}}%
     %
@@ -5339,7 +5295,12 @@
 
 % Write the entry in \indextext to the index file.
 %
-\def\doindwrite{%
+
+\newif\ifincodeindex
+\def\doindwrite{\incodeindexfalse\doindwritex}
+\def\docindwrite{\incodeindextrue\doindwritex}
+
+\def\doindwritex{%
   \maybemarginindex
   %
   \atdummies
@@ -5559,7 +5520,11 @@
   \else
     \begindoublecolumns
     \catcode`\\=0\relax
-    \catcode`\@=12\relax
+    %
+    % Make @ an escape character to give macros a chance to work.  This
+    % should work because we (hopefully) don't otherwise use @ in index files.
+    %\catcode`\@=12\relax
+    \catcode`\@=0\relax
     \input \jobname.\indexname s
     \enddoublecolumns
   \fi
@@ -6401,18 +6366,16 @@
 \def\CHAPPAGoff{%
 \global\let\contentsalignmacro = \chappager
 \global\let\pchapsepmacro=\chapbreak
-\global\let\pagealignmacro=\chappager}
+\global\def\HEADINGSon{\HEADINGSsinglechapoff}}
 
 \def\CHAPPAGon{%
 \global\let\contentsalignmacro = \chappager
 \global\let\pchapsepmacro=\chappager
-\global\let\pagealignmacro=\chappager
 \global\def\HEADINGSon{\HEADINGSsingle}}
 
 \def\CHAPPAGodd{%
 \global\let\contentsalignmacro = \chapoddpage
 \global\let\pchapsepmacro=\chapoddpage
-\global\let\pagealignmacro=\chapoddpage
 \global\def\HEADINGSon{\HEADINGSdouble}}
 
 \CHAPPAGon
@@ -6777,9 +6740,7 @@
 %
 \def\startcontents#1{%
   % If @setchapternewpage on, and @headings double, the contents should
-  % start on an odd page, unlike chapters.  Thus, we maintain
-  % \contentsalignmacro in parallel with \pagealignmacro.
-  % From: Torbjorn Granlund <tege@matematik.su.se>
+  % start on an odd page, unlike chapters.
   \contentsalignmacro
   \immediate\closeout\tocfile
   %
@@ -6794,6 +6755,9 @@
     %
     % Roman numerals for page numbers.
     \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+    \def\thistitle{}% no title in double-sided headings
+    % Record where the Roman numerals started.
+    \ifnum\romancount=0 \global\romancount=\pagecount \fi
 }
 
 % redefined for the two-volume lispref.  We always output on
@@ -6816,8 +6780,7 @@
     \fi
     \closein 1
   \endgroup
-  \lastnegativepageno = \pageno
-  \global\pageno = \savepageno
+  \contentsendroman
 }
 
 % And just the chapters.
@@ -6852,11 +6815,21 @@
     \vfill \eject
     \contentsalignmacro % in case @setchapternewpage odd is in effect
   \endgroup
-  \lastnegativepageno = \pageno
-  \global\pageno = \savepageno
+  \contentsendroman
 }
 \let\shortcontents = \summarycontents
 
+% Get ready to use Arabic numerals again
+\def\contentsendroman{%
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
+  %
+  % If \romancount > \arabiccount, the contents are at the end of the
+  % document.  Otherwise, advance where the Arabic numerals start for
+  % the page numbers.
+  \ifnum\romancount>\arabiccount\else\global\arabiccount=\pagecount\fi
+}
+
 % Typeset the label for a chapter or appendix for the short contents.
 % The arg is, e.g., `A' for an appendix, or `3' for a chapter.
 %
@@ -6997,7 +6970,7 @@
 % But \@ or @@ will get a plain @ character.
 
 \envdef\tex{%
-  \setupmarkupstyle{tex}%
+  \setregularquotes
   \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
   \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
   \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
@@ -7223,7 +7196,7 @@
 % If you want all examples etc. small: @set dispenvsize small.
 % If you want even small examples the full size: @set dispenvsize nosmall.
 % This affects the following displayed environments:
-%    @example, @display, @format, @lisp
+%    @example, @display, @format, @lisp, @verbatim
 %
 \def\smallword{small}
 \def\nosmallword{nosmall}
@@ -7269,9 +7242,9 @@
 %
 \maketwodispenvdef{lisp}{example}{%
   \nonfillstart
-  \tt\setupmarkupstyle{example}%
+  \tt\setcodequotes
   \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
-  \gobble % eat return
+  \parsearg\gobble
 }
 % @display/@smalldisplay: same as @lisp except keep current font.
 %
@@ -7429,7 +7402,7 @@
 \def\setupverb{%
   \tt  % easiest (and conventionally used) font for verbatim
   \def\par{\leavevmode\endgraf}%
-  \setupmarkupstyle{verb}%
+  \setcodequotes
   \tabeightspaces
   % Respect line breaks,
   % print special symbols as themselves, and
@@ -7444,13 +7417,9 @@
 \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
 %
 % We typeset each line of the verbatim in an \hbox, so we can handle
-% tabs.  The \global is in case the verbatim line starts with an accent,
-% or some other command that starts with a begin-group.  Otherwise, the
-% entire \verbbox would disappear at the corresponding end-group, before
-% it is typeset.  Meanwhile, we can't have nested verbatim commands
-% (can we?), so the \global won't be overwriting itself.
+% tabs.
 \newbox\verbbox
-\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup}
+\def\starttabbox{\setbox\verbbox=\hbox\bgroup}
 %
 \begingroup
   \catcode`\^^I=\active
@@ -7461,7 +7430,8 @@
       \divide\dimen\verbbox by\tabw
       \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw
       \advance\dimen\verbbox by\tabw  % advance to next multiple of \tabw
-      \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox
+      \wd\verbbox=\dimen\verbbox
+      \leavevmode\box\verbbox \starttabbox
     }%
   }
 \endgroup
@@ -7471,17 +7441,14 @@
   \let\nonarrowing = t%
   \nonfillstart
   \tt % easiest (and conventionally used) font for verbatim
-  % The \leavevmode here is for blank lines.  Otherwise, we would
-  % never \starttabbox and the \egroup would end verbatim mode.
-  \def\par{\leavevmode\egroup\box\verbbox\endgraf}%
+  \def\par{\egroup\leavevmode\box\verbbox\endgraf\starttabbox}%
   \tabexpand
-  \setupmarkupstyle{verbatim}%
+  \setcodequotes
   % Respect line breaks,
   % print special symbols as themselves, and
   % make each space count.
   % Must do in this order:
   \obeylines \uncatcodespecials \sepspaces
-  \everypar{\starttabbox}%
 }
 
 % Do the @verb magic: verbatim text is quoted by unique
@@ -7516,13 +7483,16 @@
   % ignore everything up to the first ^^M, that's the newline at the end
   % of the @verbatim input line itself.  Otherwise we get an extra blank
   % line in the output.
-  \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+  \xdef\doverbatim#1^^M#2@end verbatim{%
+    \starttabbox#2\egroup\noexpand\end\gobble verbatim}%
   % We really want {...\end verbatim} in the body of the macro, but
   % without the active space; thus we have to use \xdef and \gobble.
+  % The \egroup ends the \verbbox started at the end of the last line in
+  % the block.
 \endgroup
 %
 \envdef\verbatim{%
-    \setupverbatim\doverbatim
+    \setnormaldispenv\setupverbatim\doverbatim
 }
 \let\Everbatim = \afterenvbreak
 
@@ -7540,7 +7510,7 @@
       \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}%
       \edef\tmp{\noexpand\input #1 }
       \expandafter
-    }\tmp
+    }\expandafter\starttabbox\tmp\egroup
     \afterenvbreak
   }%
 }
@@ -7892,7 +7862,7 @@
   % leave the code in, but it's strange for @var to lead to typewriter.
   % Nowadays we recommend @code, since the difference between a ttsl hyphen
   % and a tt hyphen is pretty tiny.  @code also disables ?` !`.
-  \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}%
+  \def\var##1{{\setregularquotes\ttslanted{##1}}}%
   #1%
   \sl\hyphenchar\font=45
 }
@@ -8001,11 +7971,18 @@
   }
 \fi
 
+\let\E=\expandafter
+
 % Used at the time of macro expansion.
 % Argument is macro body with arguments substituted
 \def\scanmacro#1{%
   \newlinechar`\^^M
-  \def\xeatspaces{\eatspaces}%
+  % expand the expansion of \eatleadingcr twice to maybe remove a leading
+  % newline (and \else and \fi tokens), then call \eatspaces on the result.
+  \def\xeatspaces##1{%
+    \E\E\E\E\E\E\E\eatspaces\E\E\E\E\E\E\E{\eatleadingcr##1%
+  }}%
+  \def\xempty##1{}%
   %
   % Process the macro body under the current catcode regime.
   \scantokens{#1@comment}%
@@ -8058,6 +8035,11 @@
 \unbrace{\gdef\trim@@@ #1 } #2@{#1}
 }
 
+{\catcode`\^^M=\other%
+\gdef\eatleadingcr#1{\if\noexpand#1\noexpand^^M\else\E#1\fi}}%
+% Warning: this won't work for a delimited argument
+% or for an empty argument
+
 % Trim a single trailing ^^M off a string.
 {\catcode`\^^M=\other \catcode`\Q=3%
 \gdef\eatcr #1{\eatcra #1Q^^MQ}%
@@ -8224,6 +8206,7 @@
   \let\hash\relax
   % \hash is redefined to `#' later to get it into definitions
   \let\xeatspaces\relax
+  \let\xempty\relax
   \parsemargdefxxx#1,;,%
   \ifnum\paramno<10\relax\else
     \paramno0\relax
@@ -8235,9 +8218,11 @@
   \else \let\next=\parsemargdefxxx
     \advance\paramno by 1
     \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
-        {\xeatspaces{\hash\the\paramno}}%
+        {\xeatspaces{\hash\the\paramno\noexpand\xempty{}}}%
     \edef\paramlist{\paramlist\hash\the\paramno,}%
   \fi\next}
+% the \xempty{} is to give \eatleadingcr an argument in the case of an
+% empty macro argument.
 
 % \parsemacbody, \parsermacbody
 %
@@ -8826,7 +8811,7 @@
       \else
         \ifhavexrefs
           % We (should) know the real title if we have the xref values.
-          \def\printedrefname{\refx{#1-title}{}}%
+          \def\printedrefname{\refx{#1-title}}%
         \else
           % Otherwise just copy the Info node name.
           \def\printedrefname{\ignorespaces #1}%
@@ -8920,7 +8905,7 @@
     % If the user specified the print name (third arg) to the ref,
     % print it instead of our usual "Figure 1.2".
     \ifdim\wd\printedrefnamebox = 0pt
-      \refx{#1-snt}{}%
+      \refx{#1-snt}%
     \else
       \printedrefname
     \fi
@@ -8955,34 +8940,30 @@
     \else
       % Reference within this manual.
       %
-      % _ (for example) has to be the character _ for the purposes of the
-      % control sequence corresponding to the node, but it has to expand
-      % into the usual \leavevmode...\vrule stuff for purposes of
-      % printing. So we \turnoffactive for the \refx-snt, back on for the
-      % printing, back off for the \refx-pg.
-      {\turnoffactive
-       % Only output a following space if the -snt ref is nonempty; for
-       % @unnumbered and @anchor, it won't be.
-       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
-       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
-      }%
+      % Only output a following space if the -snt ref is nonempty, as the ref
+      % will be empty for @unnumbered and @anchor.
+      \setbox2 = \hbox{\ignorespaces \refx{#1-snt}}%
+      \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+      %
       % output the `[mynode]' via the macro below so it can be overridden.
       \xrefprintnodename\printedrefname
       %
-      % But we always want a comma and a space:
-      ,\space
-      %
-      % output the `page 3'.
-      \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
-      % Add a , if xref followed by a space
-      \if\space\noexpand\tokenafterxref ,%
-      \else\ifx\	\tokenafterxref ,% @TAB
-      \else\ifx\*\tokenafterxref ,%   @*
-      \else\ifx\ \tokenafterxref ,%   @SPACE
-      \else\ifx\
-                \tokenafterxref ,%    @NL
-      \else\ifx\tie\tokenafterxref ,% @tie
-      \fi\fi\fi\fi\fi\fi
+      \expandafter\ifx\csname SETtxiomitxrefpg\endcsname\relax
+        % But we always want a comma and a space:
+        ,\space
+        %
+        % output the `page 3'.
+        \turnoffactive \putwordpage\tie\refx{#1-pg}%
+        % Add a , if xref followed by a space
+        \if\space\noexpand\tokenafterxref ,%
+        \else\ifx\	\tokenafterxref ,% @TAB
+        \else\ifx\*\tokenafterxref ,%   @*
+        \else\ifx\ \tokenafterxref ,%   @SPACE
+        \else\ifx\
+                  \tokenafterxref ,%    @NL
+        \else\ifx\tie\tokenafterxref ,% @tie
+        \fi\fi\fi\fi\fi\fi
+      \fi
     \fi\fi
   \fi
   \endlink
@@ -9049,13 +9030,12 @@
   \fi\fi\fi
 }
 
-% \refx{NAME}{SUFFIX} - reference a cross-reference string named NAME.  SUFFIX
-% is output afterwards if non-empty.
-\def\refx#1#2{%
+% \refx{NAME} - reference a cross-reference string named NAME.
+\def\refx#1{%
   \requireauxfile
   {%
     \indexnofonts
-    \otherbackslash
+    \turnoffactive
     \def\value##1{##1}%
     \expandafter\global\expandafter\let\expandafter\thisrefX
       \csname XR#1\endcsname
@@ -9078,7 +9058,6 @@
     % It's defined, so just use it.
     \thisrefX
   \fi
-  #2% Output the suffix in any case.
 }
 
 % This is the macro invoked by entries in the aux file.  Define a control
@@ -9188,10 +9167,10 @@
   \catcode`\[=\other
   \catcode`\]=\other
   \catcode`\"=\other
-  \catcode`\_=\other
-  \catcode`\|=\other
-  \catcode`\<=\other
-  \catcode`\>=\other
+  \catcode`\_=\active
+  \catcode`\|=\active
+  \catcode`\<=\active
+  \catcode`\>=\active
   \catcode`\$=\other
   \catcode`\#=\other
   \catcode`\&=\other
@@ -9412,7 +9391,7 @@
 \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
   \catcode`\^^M = 5     % in case we're inside an example
   \normalturnoffactive  % allow _ et al. in names
-  \def\xprocessmacroarg{\eatspaces}% in case we are being used via a macro
+  \makevalueexpandable
   % If the image is by itself, center it.
   \ifvmode
     \imagevmodetrue
@@ -9438,7 +9417,7 @@
   % On the other hand, if we are in the case of @center @image, we don't
   %  want to start a paragraph, which will create a hsize-width box and
   %  eradicate the centering.
-  \ifx\centersub\centerV\else \noindent \fi
+  \ifx\centersub\centerV \else \imageindent \fi
   %
   % Output the image.
   \ifpdf
@@ -10712,6 +10691,8 @@
   \DeclareUnicodeCharacter{0233}{\=y}%
   \DeclareUnicodeCharacter{0237}{\dotless{j}}%
   %
+  \DeclareUnicodeCharacter{02BC}{'}%
+  %
   \DeclareUnicodeCharacter{02DB}{\ogonek{ }}%
   %
   % Greek letters upper case
@@ -11346,6 +11327,18 @@
   \globaldefs = 0
 }}
 
+\def\bsixpaper{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{140mm}{100mm}%
+                    {-6.35mm}{-12.7mm}%
+                    {\bindingoffset}{14pt}%
+                    {176mm}{125mm}%
+  \let\SETdispenvsize=\smallword
+  \lispnarrowing = 0.2in
+  \globaldefs = 0
+}}
+
+
 % @pagesizes TEXTHEIGHT[,TEXTWIDTH]
 % Perhaps we should allow setting the margins, \topskip, \parskip,
 % and/or leading, also. Or perhaps we should compute them somehow.
@@ -11359,12 +11352,12 @@
   \setleading{\textleading}%
   %
   \dimen0 = #1\relax
-  \advance\dimen0 by \voffset
-  \advance\dimen0 by 1in % reference point for DVI is 1 inch from top of page
+  \advance\dimen0 by 2.5in % default 1in margin above heading line
+                           % and 1.5in to include heading, footing and
+                           % bottom margin
   %
   \dimen2 = \hsize
-  \advance\dimen2 by \normaloffset
-  \advance\dimen2 by 1in % reference point is 1 inch from left edge of page
+  \advance\dimen2 by 2in % default to 1 inch margin on each side
   %
   \internalpagesizes{#1}{\hsize}%
                     {\voffset}{\normaloffset}%
@@ -11451,7 +11444,7 @@
   \let> = \activegtr
   \let~ = \activetilde
   \let^ = \activehat
-  \markupsetuplqdefault \markupsetuprqdefault
+  \setregularquotes
   \let\b = \strong
   \let\i = \smartitalic
   % in principle, all other definitions in \tex have to be undone too.
@@ -11510,8 +11503,7 @@
    @let|=@normalverticalbar
    @let~=@normaltilde
    @let\=@ttbackslash
-   @markupsetuplqdefault
-   @markupsetuprqdefault
+   @setregularquotes
    @unsepspaces
  }
 }
@@ -11604,8 +11596,7 @@
 @c Do this last of all since we use ` in the previous @catcode assignments.
 @catcode`@'=@active
 @catcode`@`=@active
-@markupsetuplqdefault
-@markupsetuprqdefault
+@setregularquotes
 
 @c Local variables:
 @c eval: (add-hook 'before-save-hook 'time-stamp)
@@ -11618,3 +11609,4 @@
 @c vim:sw=2:
 
 @enablebackslashhack
+
diff --git a/build-aux/update-b4-copyright b/build-aux/update-b4-copyright
index 744592f..d83b807 100755
--- a/build-aux/update-b4-copyright
+++ b/build-aux/update-b4-copyright
@@ -3,7 +3,7 @@
 # Update b4_copyright invocations or b4_copyright_years definitions to
 # include the current year.
 
-# Copyright (C) 2009-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,7 +16,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 use strict;
 use warnings;
diff --git a/build-aux/update-copyright b/build-aux/update-copyright
index e4809f6..fae3a5f 100755
--- a/build-aux/update-copyright
+++ b/build-aux/update-copyright
@@ -3,7 +3,7 @@
 
 # Update an FSF copyright year list to include the current year.
 
-# Copyright (C) 2009-2019 Free Software Foundation, Inc.
+# Copyright (C) 2009-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -133,11 +133,11 @@
 # are valid code in both sh and perl.  When executed by sh, they re-execute
 # the script through the perl program found in $PATH.  The '-x' option
 # is essential as well; without it, perl would re-execute the script
-# through /bin/sh.  When executed by  perl, the next two lines are a no-op.
+# through /bin/sh.  When executed by perl, the next two lines are a no-op.
 eval 'exec perl -wSx -0777 -pi "$0" "$@"'
      if 0;
 
-my $VERSION = '2018-03-07.03:47'; # UTC
+my $VERSION = '2020-04-04.15:07'; # UTC
 # The definition above must lie within the first 8 lines in order
 # for the Emacs time-stamp write hook (at end) to update it.
 # If you change this file with Emacs, please let the write hook
diff --git a/build-aux/useless-if-before-free b/build-aux/useless-if-before-free
index 6ac8aa9..5bbbc44 100755
--- a/build-aux/useless-if-before-free
+++ b/build-aux/useless-if-before-free
@@ -4,7 +4,7 @@
 # Detect instances of "if (p) free (p);".
 # Likewise "if (p != 0)", "if (0 != p)", or with NULL; and with braces.
 
-# Copyright (C) 2008-2019 Free Software Foundation, Inc.
+# Copyright (C) 2008-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -32,16 +32,18 @@
 # are valid code in both sh and perl.  When executed by sh, they re-execute
 # the script through the perl program found in $PATH.  The '-x' option
 # is essential as well; without it, perl would re-execute the script
-# through /bin/sh.  When executed by  perl, the next two lines are a no-op.
+# through /bin/sh.  When executed by perl, the next two lines are a no-op.
 eval 'exec perl -wSx "$0" "$@"'
      if 0;
 
-my $VERSION = '2018-03-07 03:47'; # UTC
+my $VERSION = '2021-04-11 10:11'; # UTC
 # The definition above must lie within the first 8 lines in order
 # for the Emacs time-stamp write hook (at end) to update it.
 # If you change this file with Emacs, please let the write hook
 # do its job.  Otherwise, update this string manually.
 
+my $copyright_year = '2021';
+
 use strict;
 use warnings;
 use Getopt::Long;
@@ -118,7 +120,19 @@
   GetOptions
     (
      help => sub { usage 0 },
-     version => sub { print "$ME version $VERSION\n"; exit },
+     version =>
+       sub
+       {
+         print "$ME version $VERSION\n";
+         print "Copyright (C) $copyright_year Free Software Foundation, Inc.\n";
+         print "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.\n"
+             . "This is free software: you are free to change and redistribute it.\n"
+             . "There is NO WARRANTY, to the extent permitted by law.\n";
+         print "\n";
+         my $author = "Jim Meyering";
+         print "Written by $author.\n";
+         exit
+       },
      list => \$list,
      'name=s@' => \@name,
     ) or usage 1;
diff --git a/build-aux/vc-list-files b/build-aux/vc-list-files
index 6eafd8c..cf168ea 100755
--- a/build-aux/vc-list-files
+++ b/build-aux/vc-list-files
@@ -4,7 +4,7 @@
 # Print a version string.
 scriptversion=2018-03-07.03; # UTC
 
-# Copyright (C) 2006-2019 Free Software Foundation, Inc.
+# Copyright (C) 2006-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/build-aux/ylwrap b/build-aux/ylwrap
index 5943168..e8ec109 100755
--- a/build-aux/ylwrap
+++ b/build-aux/ylwrap
@@ -3,7 +3,7 @@
 
 scriptversion=2018-03-07.03; # UTC
 
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
 #
 # Written by Tom Tromey <tromey@cygnus.com>.
 #
diff --git a/cfg.mk b/cfg.mk
index 48c5494..9c3f334 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -1,5 +1,5 @@
 ## Customize maint.mk                           -*- makefile -*-
-## Copyright (C) 2008-2015, 2018-2019 Free Software Foundation, Inc.
+## Copyright (C) 2008-2015, 2018-2021 Free Software Foundation, Inc.
 
 ## This program is free software: you can redistribute it and/or modify
 ## it under the terms of the GNU General Public License as published by
@@ -12,7 +12,7 @@
 ## GNU General Public License for more details.
 
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 # Update version, then recompile so that tests/bison --version be
 # up-to-date, then compile our parser again with our up-to-date bison.
@@ -42,7 +42,7 @@
 # Tests not to run as part of "make distcheck".
 local-checks-to-skip =			\
   sc_immutable_NEWS			\
-  sc_prohibit_atoi_atof
+  sc_indent
 
 # The local directory containing the checked-out copy of gnulib used in
 # this release.  Used solely to get a date for the "announcement" target.
@@ -51,7 +51,7 @@
 bootstrap-tools = autoconf,automake,flex,gettext,gnulib
 
 announcement_Cc_ = \
-  bug-bison@gnu.org, help-bison@gnu.org, bison-patches@gnu.org, \
+  bug-bison@gnu.org, bison-announce@gnu.org, \
   coordinator@translationproject.org
 
 update-copyright: update-b4-copyright update-package-copyright-year
@@ -126,7 +126,7 @@
 
 _space_before_paren_exempt =? \\n\\$$
 _space_before_paren_exempt = \
-  (^ *\#|(LA)?LR\([01]\)|percent_(code|define)|b4_syncline|m4_(define|init)|symbol)
+  (^ *\#|(LA)?LR\([01]\)|percent_(code|define)|b4_syncline|m4_(define|init))
 # Ensure that there is a space before each open parenthesis in C code.
 sc_space_before_open_paren:
 	@if $(VC_LIST_EXCEPT) | grep -l '\.[ch]$$' > /dev/null; then	\
@@ -156,16 +156,19 @@
 $(call exclude,                                                                 \
   bindtextdomain=^lib/main.c$$                                                  \
   cast_of_argument_to_free=^src/muscle-tab.c$$                                  \
-  po_check=(^po/POTFILES.in|.md)$$		                                \
+  error_message_uppercase=etc/bench.pl.in$$                                     \
+  file_system=^doc/Doxyfile.in$$                                                \
+  po_check=^tests|(^po/POTFILES.in|.md)$$                                       \
   preprocessor_indentation=^data/|^lib/|^src/parse-gram.[ch]$$                  \
   program_name=^lib/main.c$$                                                    \
   prohibit_always-defined_macros=^data/skeletons/yacc.c$$                       \
   prohibit_always-defined_macros+=?|^src/(parse-gram.c|system.h)$$              \
   prohibit_always-defined_macros+=?|^tests/regression.at$$                      \
+  prohibit_atoi_atof=^(doc|etc|examples|tests)/                                 \
   prohibit_doubled_word=^tests/named-refs.at$$                                  \
   prohibit_magic_number_exit=^doc/bison.texi$$                                  \
   prohibit_magic_number_exit+=?|^tests/(conflicts|regression).at$$              \
-  prohibit_strcmp=^doc/bison\.texi|examples|tests/local\.at$$                   \
+  prohibit_strcmp=^doc/bison\.texi|examples|tests                               \
   prohibit_tab_based_indentation=install-icc.sh|\.(am|mk)$$|^\.git|tests/input.at|Makefile$$   \
   require_config_h=^(lib/yyerror|data/skeletons/(glr|yacc))\.c$$                \
   require_config_h_first=^(lib/yyerror|data/skeletons/(glr|yacc))\.c$$          \
diff --git a/configure b/configure
index 52befaa..c8c4cfe 100755
--- a/configure
+++ b/configure
@@ -1,11 +1,12 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for GNU Bison 3.5.
+# Generated by GNU Autoconf 2.71 for GNU Bison 3.8.2.
 #
 # Report bugs to <bug-bison@gnu.org>.
 #
 #
-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+# Inc.
 #
 #
 # This configure script is free software; the Free Software Foundation
@@ -16,14 +17,16 @@
 
 # Be more Bourne compatible
 DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
   emulate sh
   NULLCMD=:
   # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
-else
+else $as_nop
   case `(set -o) 2>/dev/null` in #(
   *posix*) :
     set -o posix ;; #(
@@ -33,46 +36,46 @@
 fi
 
 
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
 as_nl='
 '
 export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" ""	$as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh).  This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2)            ; then :; else exec 2>/dev/null; fi
 
 # The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
   PATH_SEPARATOR=:
   (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
     (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -81,13 +84,6 @@
 fi
 
 
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
 # Find who we are.  Look in the path if we contain no directory separator.
 as_myself=
 case $0 in #((
@@ -96,8 +92,12 @@
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    test -r "$as_dir$0" && as_myself=$as_dir$0 && break
   done
 IFS=$as_save_IFS
 
@@ -109,30 +109,10 @@
   as_myself=$0
 fi
 if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
   exit 1
 fi
 
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
 # Use a proper internal environment variable to ensure we don't fall
   # into an infinite loop, continuously re-executing ourselves.
@@ -154,20 +134,22 @@
 exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
 # Admittedly, this is quite paranoid, since all the known shells bail
 # out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-as_fn_exit 255
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
   fi
   # We don't want this to propagate to other subprocesses.
           { _as_can_reexec=; unset _as_can_reexec;}
 if test "x$CONFIG_SHELL" = x; then
-  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
   emulate sh
   NULLCMD=:
   # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '\${1+\"\$@\"}'='\"\$@\"'
   setopt NO_GLOB_SUBST
-else
+else \$as_nop
   case \`(set -o) 2>/dev/null\` in #(
   *posix*) :
     set -o posix ;; #(
@@ -187,42 +169,53 @@
 as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
 as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
 as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
 
-else
+else \$as_nop
   exitcode=1; echo positional parameters were not saved.
 fi
 test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
 test -x / || exit 1"
   as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
   as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
   eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
   test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
 test \$(( 1 + 1 )) = 2 || exit 1"
-  if (eval "$as_required") 2>/dev/null; then :
+  if (eval "$as_required") 2>/dev/null
+then :
   as_have_required=yes
-else
+else $as_nop
   as_have_required=no
 fi
-  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
 
-else
+else $as_nop
   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 as_found=false
 for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
   as_found=:
   case $as_dir in #(
 	 /*)
 	   for as_base in sh bash ksh sh5; do
 	     # Try only shells that exist, to save several forks.
-	     as_shell=$as_dir/$as_base
+	     as_shell=$as_dir$as_base
 	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
-		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+		    as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
   CONFIG_SHELL=$as_shell as_have_required=yes
-		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+		   if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
   break 2
 fi
 fi
@@ -230,14 +223,21 @@
        esac
   as_found=false
 done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
-	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
-  CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
 IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+  if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
 
 
-      if test "x$CONFIG_SHELL" != x; then :
+      if test "x$CONFIG_SHELL" != x
+then :
   export CONFIG_SHELL
              # We cannot yet assume a decent shell, so we have to provide a
 # neutralization value for shells without unset; and this also
@@ -255,18 +255,19 @@
 exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
 # Admittedly, this is quite paranoid, since all the known shells bail
 # out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
 exit 255
 fi
 
-    if test x$as_have_required = xno; then :
-  $as_echo "$0: This script requires a shell more modern than all"
-  $as_echo "$0: the shells that I found on your system."
-  if test x${ZSH_VERSION+set} = xset ; then
-    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
-    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+    if test x$as_have_required = xno
+then :
+  printf "%s\n" "$0: This script requires a shell more modern than all"
+  printf "%s\n" "$0: the shells that I found on your system."
+  if test ${ZSH_VERSION+y} ; then
+    printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
   else
-    $as_echo "$0: Please tell bug-autoconf@gnu.org and bug-bison@gnu.org
+    printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and bug-bison@gnu.org
 $0: about your system, including any error possibly output
 $0: before this message. Then install a modern shell, or
 $0: manually run the script under such a shell if you do
@@ -294,6 +295,7 @@
 }
 as_unset=as_fn_unset
 
+
 # as_fn_set_status STATUS
 # -----------------------
 # Set $? to STATUS, without forking.
@@ -311,6 +313,14 @@
   as_fn_set_status $1
   exit $1
 } # as_fn_exit
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+  return $?
+}
+as_nop=as_fn_nop
 
 # as_fn_mkdir_p
 # -------------
@@ -325,7 +335,7 @@
     as_dirs=
     while :; do
       case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
       *) as_qdir=$as_dir;;
       esac
       as_dirs="'$as_qdir' $as_dirs"
@@ -334,7 +344,7 @@
 	 X"$as_dir" : 'X\(//\)[^/]' \| \
 	 X"$as_dir" : 'X\(//\)$' \| \
 	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -373,12 +383,13 @@
 # advantage of any shell optimizations that allow amortized linear growth over
 # repeated appends, instead of the typical quadratic growth present in naive
 # implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
   eval 'as_fn_append ()
   {
     eval $1+=\$2
   }'
-else
+else $as_nop
   as_fn_append ()
   {
     eval $1=\$$1\$2
@@ -390,18 +401,27 @@
 # Perform arithmetic evaluation on the ARGs, and store the result in the
 # global $as_val. Take advantage of shells that can avoid forks. The arguments
 # must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
   eval 'as_fn_arith ()
   {
     as_val=$(( $* ))
   }'
-else
+else $as_nop
   as_fn_arith ()
   {
     as_val=`expr "$@" || test $? -eq 1`
   }
 fi # as_fn_arith
 
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+  return $?
+}
+as_nop=as_fn_nop
 
 # as_fn_error STATUS ERROR [LINENO LOG_FD]
 # ----------------------------------------
@@ -413,9 +433,9 @@
   as_status=$1; test $as_status -eq 0 && as_status=1
   if test "$4"; then
     as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
   fi
-  $as_echo "$as_me: error: $2" >&2
+  printf "%s\n" "$as_me: error: $2" >&2
   as_fn_exit $as_status
 } # as_fn_error
 
@@ -442,7 +462,7 @@
 $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
 	 X"$0" : 'X\(//\)$' \| \
 	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
     sed '/^.*\/\([^/][^/]*\)\/*$/{
 	    s//\1/
 	    q
@@ -486,7 +506,7 @@
       s/-\n.*//
     ' >$as_me.lineno &&
   chmod +x "$as_me.lineno" ||
-    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+    { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
 
   # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
   # already done that, so ensure we don't try to do so again and fall
@@ -500,6 +520,10 @@
   exit
 }
 
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
 ECHO_C= ECHO_N= ECHO_T=
 case `echo -n x` in #(((((
 -n*)
@@ -513,6 +537,13 @@
   ECHO_N='-n';;
 esac
 
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n.  New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
 rm -f conf$$ conf$$.exe conf$$.file
 if test -d conf$$.dir; then
   rm -f conf$$.dir/conf$$.file
@@ -580,51 +611,47 @@
 # Identity of this package.
 PACKAGE_NAME='GNU Bison'
 PACKAGE_TARNAME='bison'
-PACKAGE_VERSION='3.5'
-PACKAGE_STRING='GNU Bison 3.5'
+PACKAGE_VERSION='3.8.2'
+PACKAGE_STRING='GNU Bison 3.8.2'
 PACKAGE_BUGREPORT='bug-bison@gnu.org'
-PACKAGE_URL='http://www.gnu.org/software/bison/'
+PACKAGE_URL='https://www.gnu.org/software/bison/'
 
 # Factoring default headers for most tests.
 ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
 #endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
+#ifdef HAVE_STDLIB_H
 # include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-#  include <stdlib.h>
-# endif
 #endif
 #ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-#  include <memory.h>
-# endif
 # include <string.h>
 #endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
 #ifdef HAVE_INTTYPES_H
 # include <inttypes.h>
 #endif
 #ifdef HAVE_STDINT_H
 # include <stdint.h>
 #endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
 #ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif"
 
+ac_header_c_list=
 gl_use_threads_default=
 gl_use_winpthreads_default=
-ac_header_list=
-ac_func_list=
+gl_libtextstyle_minversion=' 0.20 '
+ac_func_c_list=
 gl_getopt_required=POSIX
 gt_needs=
 ac_config_libobj_dir=lib
@@ -639,6 +666,8 @@
 LIBOBJS
 GCC
 AUTOM4TE
+ENABLE_BISTROMATHIC_FALSE
+ENABLE_BISTROMATHIC_TRUE
 CROSS_COMPILING_FALSE
 CROSS_COMPILING_TRUE
 VALGRIND_OPTS_SUPPRESSION
@@ -647,8 +676,6 @@
 BISON_LOCALEDIR
 POSUB
 INTLLIBS
-LTLIBICONV
-LIBICONV
 INTL_MACOSX_LIBS
 XGETTEXT_EXTRA_OPTIONS
 MSGMERGE
@@ -675,10 +702,10 @@
 gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_TRUE
 gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_FALSE
 gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_TRUE
-gl_GNULIB_ENABLED_sys_stat_FALSE
-gl_GNULIB_ENABLED_sys_stat_TRUE
 gl_GNULIB_ENABLED_strnlen_FALSE
 gl_GNULIB_ENABLED_strnlen_TRUE
+gl_GNULIB_ENABLED_strings_FALSE
+gl_GNULIB_ENABLED_strings_TRUE
 gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_FALSE
 gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_TRUE
 gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_FALSE
@@ -687,111 +714,207 @@
 gl_GNULIB_ENABLED_strchrnul_TRUE
 gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_FALSE
 gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_TRUE
-gl_GNULIB_ENABLED_stat_FALSE
-gl_GNULIB_ENABLED_stat_TRUE
 gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_FALSE
 gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_TRUE
-gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62_FALSE
-gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62_TRUE
+gl_GNULIB_ENABLED_e7e881d32ca02f1c997b13c737c64bbd_FALSE
+gl_GNULIB_ENABLED_e7e881d32ca02f1c997b13c737c64bbd_TRUE
+gl_GNULIB_ENABLED_d4850532688ba16d685f036076611f21_FALSE
+gl_GNULIB_ENABLED_d4850532688ba16d685f036076611f21_TRUE
 gl_GNULIB_ENABLED_rmdir_FALSE
 gl_GNULIB_ENABLED_rmdir_TRUE
-gl_GNULIB_ENABLED_rawmemchr_FALSE
-gl_GNULIB_ENABLED_rawmemchr_TRUE
+gl_GNULIB_ENABLED_rewinddir_FALSE
+gl_GNULIB_ENABLED_rewinddir_TRUE
+gl_GNULIB_ENABLED_readdir_FALSE
+gl_GNULIB_ENABLED_readdir_TRUE
 gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_FALSE
 gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_TRUE
+gl_GNULIB_ENABLED_opendir_FALSE
+gl_GNULIB_ENABLED_opendir_TRUE
+gl_GNULIB_ENABLED_03e0aaad4cb89ca757653bd367a6ccb7_FALSE
+gl_GNULIB_ENABLED_03e0aaad4cb89ca757653bd367a6ccb7_TRUE
+gl_GNULIB_ENABLED_1840129d490f3a00c8a098316d0fa345_FALSE
+gl_GNULIB_ENABLED_1840129d490f3a00c8a098316d0fa345_TRUE
+gl_GNULIB_ENABLED_openat_FALSE
+gl_GNULIB_ENABLED_openat_TRUE
+gl_GNULIB_ENABLED_memrchr_FALSE
+gl_GNULIB_ENABLED_memrchr_TRUE
 gl_GNULIB_ENABLED_malloca_FALSE
 gl_GNULIB_ENABLED_malloca_TRUE
 gl_GNULIB_ENABLED_lstat_FALSE
 gl_GNULIB_ENABLED_lstat_TRUE
-gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9_FALSE
-gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9_TRUE
-gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467_FALSE
-gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467_TRUE
+gl_GNULIB_ENABLED_locale_FALSE
+gl_GNULIB_ENABLED_locale_TRUE
 gl_GNULIB_ENABLED_ldexp_FALSE
 gl_GNULIB_ENABLED_ldexp_TRUE
 gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_FALSE
 gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_TRUE
 gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_FALSE
 gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_TRUE
+gl_GNULIB_ENABLED_getline_FALSE
+gl_GNULIB_ENABLED_getline_TRUE
 gl_GNULIB_ENABLED_getdtablesize_FALSE
 gl_GNULIB_ENABLED_getdtablesize_TRUE
+gl_GNULIB_ENABLED_getdelim_FALSE
+gl_GNULIB_ENABLED_getdelim_TRUE
+gl_GNULIB_ENABLED_3d094ef542bfdd238a5194e172bfe5f6_FALSE
+gl_GNULIB_ENABLED_3d094ef542bfdd238a5194e172bfe5f6_TRUE
+gl_GNULIB_ENABLED_fstatat_FALSE
+gl_GNULIB_ENABLED_fstatat_TRUE
 gl_GNULIB_ENABLED_fstat_FALSE
 gl_GNULIB_ENABLED_fstat_TRUE
 gl_GNULIB_ENABLED_fseterr_FALSE
 gl_GNULIB_ENABLED_fseterr_TRUE
+gl_GNULIB_ENABLED_fca9852db2a43bb33f02f0fbdbc174f6_FALSE
+gl_GNULIB_ENABLED_fca9852db2a43bb33f02f0fbdbc174f6_TRUE
+gl_GNULIB_ENABLED_ffs_FALSE
+gl_GNULIB_ENABLED_ffs_TRUE
+gl_GNULIB_ENABLED_fdopendir_FALSE
+gl_GNULIB_ENABLED_fdopendir_TRUE
 gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_FALSE
 gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_TRUE
+gl_GNULIB_ENABLED_fchdir_FALSE
+gl_GNULIB_ENABLED_fchdir_TRUE
+gl_GNULIB_ENABLED_dup_FALSE
+gl_GNULIB_ENABLED_dup_TRUE
+gl_GNULIB_ENABLED_dirfd_FALSE
+gl_GNULIB_ENABLED_dirfd_TRUE
+gl_GNULIB_ENABLED_dirent_FALSE
+gl_GNULIB_ENABLED_dirent_TRUE
+gl_GNULIB_ENABLED_75c65a2c014cf8235dd95289676302a4_FALSE
+gl_GNULIB_ENABLED_75c65a2c014cf8235dd95289676302a4_TRUE
+gl_GNULIB_ENABLED_closedir_FALSE
+gl_GNULIB_ENABLED_closedir_TRUE
+gl_GNULIB_ENABLED_8198daae261b932d64a998f8586f5005_FALSE
+gl_GNULIB_ENABLED_8198daae261b932d64a998f8586f5005_TRUE
 gl_GNULIB_ENABLED_chdir_FALSE
 gl_GNULIB_ENABLED_chdir_TRUE
-WINDOWS_64_BIT_ST_SIZE
-WINDOWS_STAT_TIMESPEC
-NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H
-NEXT_SYS_STAT_H
-REPLACE_UTIMENSAT
-REPLACE_STAT
-REPLACE_MKNOD
-REPLACE_MKFIFO
-REPLACE_MKDIR
-REPLACE_LSTAT
-REPLACE_FUTIMENS
-REPLACE_FSTATAT
-REPLACE_FSTAT
-HAVE_UTIMENSAT
-HAVE_MKNODAT
-HAVE_MKNOD
-HAVE_MKFIFOAT
-HAVE_MKFIFO
-HAVE_MKDIRAT
-HAVE_LSTAT
-HAVE_LCHMOD
-HAVE_FUTIMENS
-HAVE_FSTATAT
-HAVE_FCHMODAT
-GNULIB_OVERRIDES_STRUCT_STAT
-GNULIB_UTIMENSAT
-GNULIB_STAT
-GNULIB_MKNODAT
-GNULIB_MKNOD
-GNULIB_MKFIFOAT
-GNULIB_MKFIFO
-GNULIB_MKDIRAT
-GNULIB_LSTAT
-GNULIB_LCHMOD
-GNULIB_FUTIMENS
-GNULIB_FSTATAT
-GNULIB_FSTAT
-GNULIB_FCHMODAT
+gl_GNULIB_ENABLED_260941c0e5dc67ec9e87d1fb321c300b_FALSE
+gl_GNULIB_ENABLED_260941c0e5dc67ec9e87d1fb321c300b_TRUE
+HAVE_STRINGS_H
+NEXT_AS_FIRST_DIRECTIVE_STRINGS_H
+NEXT_STRINGS_H
+GL_GNULIB_LOCALENAME
+GL_GNULIB_DUPLOCALE
+GL_GNULIB_SETLOCALE_NULL
+GL_GNULIB_SETLOCALE
+GL_GNULIB_LOCALECONV
+NEXT_AS_FIRST_DIRECTIVE_LOCALE_H
+NEXT_LOCALE_H
+HAVE_XLOCALE_H
+LOCALENAME_ENHANCE_LOCALE_FUNCS
+REPLACE_STRUCT_LCONV
+REPLACE_FREELOCALE
+REPLACE_DUPLOCALE
+REPLACE_NEWLOCALE
+REPLACE_SETLOCALE
+REPLACE_LOCALECONV
+HAVE_FREELOCALE
+HAVE_DUPLOCALE
+HAVE_NEWLOCALE
+LIB_HARD_LOCALE
+LIB_SETLOCALE_NULL
+GL_GNULIB_FFS
+HAVE_DECL_STRNCASECMP
+HAVE_STRCASECMP
+HAVE_FFS
+HAVE_DIRENT_H
+NEXT_AS_FIRST_DIRECTIVE_DIRENT_H
+NEXT_DIRENT_H
+GL_GNULIB_ALPHASORT
+GL_GNULIB_SCANDIR
+GL_GNULIB_FDOPENDIR
+GL_GNULIB_DIRFD
+GL_GNULIB_CLOSEDIR
+GL_GNULIB_REWINDDIR
+GL_GNULIB_READDIR
+GL_GNULIB_OPENDIR
+REPLACE_FDOPENDIR
+REPLACE_DIRFD
+REPLACE_CLOSEDIR
+REPLACE_OPENDIR
+HAVE_ALPHASORT
+HAVE_SCANDIR
+HAVE_FDOPENDIR
+HAVE_DECL_FDOPENDIR
+HAVE_DECL_DIRFD
+HAVE_CLOSEDIR
+HAVE_REWINDDIR
+HAVE_READDIR
+HAVE_OPENDIR
 NEXT_AS_FIRST_DIRECTIVE_WCHAR_H
 NEXT_WCHAR_H
 LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE
 LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE
 LIBUNISTRING_UNIWIDTH_H
 LIBUNISTRING_UNITYPES_H
+LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_FALSE
+LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE
+LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_FALSE
+LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_TRUE
+LIBUNISTRING_UNISTR_H
 HAVE_UNISTD_H
 NEXT_AS_FIRST_DIRECTIVE_UNISTD_H
 NEXT_UNISTD_H
+GL_GNULIB_MDA_TZSET
+GL_GNULIB_TZSET
+GL_GNULIB_TIME_RZ
+GL_GNULIB_TIME_R
+GL_GNULIB_TIMESPEC_GET
+GL_GNULIB_TIMEGM
+GL_GNULIB_STRPTIME
+GL_GNULIB_STRFTIME
+GL_GNULIB_NANOSLEEP
+GL_GNULIB_LOCALTIME
+GL_GNULIB_MKTIME
+GL_GNULIB_CTIME
+TIME_H_DEFINES_TIME_UTC
 UNISTD_H_DEFINES_STRUCT_TIMESPEC
 PTHREAD_H_DEFINES_STRUCT_TIMESPEC
 SYS_TIME_H_DEFINES_STRUCT_TIMESPEC
 TIME_H_DEFINES_STRUCT_TIMESPEC
 NEXT_AS_FIRST_DIRECTIVE_TIME_H
 NEXT_TIME_H
+REPLACE_LOCALTIME
+REPLACE_GMTIME
+GNULIB_GETTIMEOFDAY
+REPLACE_TZSET
+REPLACE_TIMEGM
+REPLACE_STRFTIME
+REPLACE_NANOSLEEP
+REPLACE_MKTIME
+REPLACE_LOCALTIME_R
+REPLACE_CTIME
+HAVE_TIMEZONE_T
+HAVE_TIMESPEC_GET
+HAVE_TIMEGM
+HAVE_STRPTIME
+HAVE_NANOSLEEP
+HAVE_DECL_LOCALTIME_R
+GL_GNULIB_TCGETSID
+NEXT_AS_FIRST_DIRECTIVE_TERMIOS_H
+NEXT_TERMIOS_H
+HAVE_TERMIOS_H
+HAVE_DECL_TCGETSID
+GL_GNULIB_WAITPID
 NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H
 NEXT_SYS_WAIT_H
-GNULIB_WAITPID
 WINDOWS_STAT_INODES
 WINDOWS_64_BIT_OFF_T
 NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H
 NEXT_SYS_TYPES_H
+GL_GNULIB_TIMES
 HAVE_SYS_TIMES_H
 NEXT_AS_FIRST_DIRECTIVE_SYS_TIMES_H
 NEXT_SYS_TIMES_H
 HAVE_TIMES
 HAVE_STRUCT_TMS
-GNULIB_TIMES
 HAVE_SYS_RESOURCE_H
 NEXT_AS_FIRST_DIRECTIVE_SYS_RESOURCE_H
 NEXT_SYS_RESOURCE_H
+GL_GNULIB_IOCTL
+NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H
+NEXT_SYS_IOCTL_H
+HAVE_SYS_IOCTL_H
 NEXT_AS_FIRST_DIRECTIVE_STRING_H
 NEXT_STRING_H
 NEXT_AS_FIRST_DIRECTIVE_STDLIB_H
@@ -810,18 +933,68 @@
 GL_GENERATE_STDBOOL_H_FALSE
 GL_GENERATE_STDBOOL_H_TRUE
 STDBOOL_H
+GL_GENERATE_STDALIGN_H_FALSE
+GL_GENERATE_STDALIGN_H_TRUE
+STDALIGN_H
+GL_GNULIB_MDA_UMASK
+GL_GNULIB_MDA_MKDIR
+GL_GNULIB_MDA_CHMOD
+GL_GNULIB_OVERRIDES_STRUCT_STAT
+GL_GNULIB_UTIMENSAT
+GL_GNULIB_STAT
+GL_GNULIB_MKNODAT
+GL_GNULIB_MKNOD
+GL_GNULIB_MKFIFOAT
+GL_GNULIB_MKFIFO
+GL_GNULIB_MKDIRAT
+GL_GNULIB_MKDIR
+GL_GNULIB_LSTAT
+GL_GNULIB_LCHMOD
+GL_GNULIB_GETUMASK
+GL_GNULIB_FUTIMENS
+GL_GNULIB_FSTATAT
+GL_GNULIB_FSTAT
+GL_GNULIB_FCHMODAT
+WINDOWS_64_BIT_ST_SIZE
+WINDOWS_STAT_TIMESPEC
+NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H
+NEXT_SYS_STAT_H
+REPLACE_UTIMENSAT
+REPLACE_STAT
+REPLACE_MKNODAT
+REPLACE_MKNOD
+REPLACE_MKFIFOAT
+REPLACE_MKFIFO
+REPLACE_MKDIR
+REPLACE_LSTAT
+REPLACE_FUTIMENS
+REPLACE_FSTATAT
+REPLACE_FSTAT
+REPLACE_FCHMODAT
+HAVE_UTIMENSAT
+HAVE_MKNODAT
+HAVE_MKNOD
+HAVE_MKFIFOAT
+HAVE_MKFIFO
+HAVE_MKDIRAT
+HAVE_LSTAT
+HAVE_LCHMOD
+HAVE_GETUMASK
+HAVE_FUTIMENS
+HAVE_FSTATAT
+HAVE_FCHMODAT
 HAVE_SPAWN_H
 NEXT_AS_FIRST_DIRECTIVE_SPAWN_H
 NEXT_SPAWN_H
 NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H
 NEXT_SIGNAL_H
+GL_GNULIB_SCHED_YIELD
 HAVE_STRUCT_SCHED_PARAM
 HAVE_SCHED_H
 NEXT_AS_FIRST_DIRECTIVE_SCHED_H
 NEXT_SCHED_H
 REPLACE_SCHED_YIELD
 HAVE_SCHED_YIELD
-GNULIB_SCHED_YIELD
 RELOCATABLE_STRIP
 RELOCATABLE_BUILD_DIR
 RELOCATABLE_SRC_DIR
@@ -834,6 +1007,13 @@
 INSTALL_PROGRAM_ENV
 RELOCATABLE_LDFLAGS
 RELOCATABLE
+LTLIBREADLINE
+LIBREADLINE
+GL_GNULIB_SIGACTION
+GL_GNULIB_SIGPROCMASK
+GL_GNULIB_SIGNAL_H_SIGPIPE
+GL_GNULIB_RAISE
+GL_GNULIB_PTHREAD_SIGMASK
 REPLACE_RAISE
 REPLACE_PTHREAD_SIGMASK
 HAVE_SIGHANDLER_T
@@ -845,12 +1025,30 @@
 HAVE_RAISE
 HAVE_PTHREAD_SIGMASK
 HAVE_POSIX_SIGNALBLOCKING
-GNULIB_SIGACTION
-GNULIB_SIGPROCMASK
-GNULIB_SIGNAL_H_SIGPIPE
-GNULIB_RAISE
-GNULIB_PTHREAD_SIGMASK
 ASM_SYMBOL_PREFIX
+GL_GNULIB_POSIX_SPAWNATTR_DESTROY
+GL_GNULIB_POSIX_SPAWNATTR_SETSIGMASK
+GL_GNULIB_POSIX_SPAWNATTR_GETSIGMASK
+GL_GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT
+GL_GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT
+GL_GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY
+GL_GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY
+GL_GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM
+GL_GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM
+GL_GNULIB_POSIX_SPAWNATTR_SETPGROUP
+GL_GNULIB_POSIX_SPAWNATTR_GETPGROUP
+GL_GNULIB_POSIX_SPAWNATTR_SETFLAGS
+GL_GNULIB_POSIX_SPAWNATTR_GETFLAGS
+GL_GNULIB_POSIX_SPAWNATTR_INIT
+GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY
+GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN
+GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR
+GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2
+GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE
+GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR
+GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT
+GL_GNULIB_POSIX_SPAWNP
+GL_GNULIB_POSIX_SPAWN
 LIB_POSIX_SPAWN
 REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN
 REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR
@@ -863,107 +1061,51 @@
 HAVE_POSIX_SPAWN_FILE_ACTIONS_T
 HAVE_POSIX_SPAWNATTR_T
 HAVE_POSIX_SPAWN
-GNULIB_POSIX_SPAWNATTR_DESTROY
-GNULIB_POSIX_SPAWNATTR_SETSIGMASK
-GNULIB_POSIX_SPAWNATTR_GETSIGMASK
-GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT
-GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT
-GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY
-GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY
-GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM
-GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM
-GNULIB_POSIX_SPAWNATTR_SETPGROUP
-GNULIB_POSIX_SPAWNATTR_GETPGROUP
-GNULIB_POSIX_SPAWNATTR_SETFLAGS
-GNULIB_POSIX_SPAWNATTR_GETFLAGS
-GNULIB_POSIX_SPAWNATTR_INIT
-GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY
-GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN
-GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR
-GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2
-GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE
-GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR
-GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT
-GNULIB_POSIX_SPAWNP
-GNULIB_POSIX_SPAWN
-UNDEFINE_STRTOK_R
-REPLACE_STRSIGNAL
-REPLACE_STRERROR_R
-REPLACE_STRERROR
-REPLACE_STRTOK_R
-REPLACE_STRCASESTR
-REPLACE_STRSTR
-REPLACE_STRNLEN
-REPLACE_STRNDUP
-REPLACE_STRNCAT
-REPLACE_STRDUP
-REPLACE_STRCHRNUL
-REPLACE_STPNCPY
-REPLACE_MEMMEM
-REPLACE_MEMCHR
-HAVE_STRVERSCMP
-HAVE_DECL_STRSIGNAL
-HAVE_DECL_STRERROR_R
-HAVE_DECL_STRTOK_R
-HAVE_STRCASESTR
-HAVE_STRSEP
-HAVE_STRPBRK
-HAVE_DECL_STRNLEN
-HAVE_DECL_STRNDUP
-HAVE_DECL_STRDUP
-HAVE_STRCHRNUL
-HAVE_STPNCPY
-HAVE_STPCPY
-HAVE_RAWMEMCHR
-HAVE_DECL_MEMRCHR
-HAVE_MEMPCPY
-HAVE_DECL_MEMMEM
-HAVE_MEMCHR
-HAVE_FFSLL
-HAVE_FFSL
-HAVE_EXPLICIT_BZERO
-HAVE_MBSLEN
-GNULIB_STRVERSCMP
-GNULIB_STRSIGNAL
-GNULIB_STRERROR_R
-GNULIB_STRERROR
-GNULIB_MBSTOK_R
-GNULIB_MBSSEP
-GNULIB_MBSSPN
-GNULIB_MBSPBRK
-GNULIB_MBSCSPN
-GNULIB_MBSCASESTR
-GNULIB_MBSPCASECMP
-GNULIB_MBSNCASECMP
-GNULIB_MBSCASECMP
-GNULIB_MBSSTR
-GNULIB_MBSRCHR
-GNULIB_MBSCHR
-GNULIB_MBSNLEN
-GNULIB_MBSLEN
-GNULIB_STRTOK_R
-GNULIB_STRCASESTR
-GNULIB_STRSTR
-GNULIB_STRSEP
-GNULIB_STRPBRK
-GNULIB_STRNLEN
-GNULIB_STRNDUP
-GNULIB_STRNCAT
-GNULIB_STRDUP
-GNULIB_STRCHRNUL
-GNULIB_STPNCPY
-GNULIB_STPCPY
-GNULIB_RAWMEMCHR
-GNULIB_MEMRCHR
-GNULIB_MEMPCPY
-GNULIB_MEMMEM
-GNULIB_MEMCHR
-GNULIB_FFSLL
-GNULIB_FFSL
-GNULIB_EXPLICIT_BZERO
-LOCALE_ZH_CN
-LOCALE_FR_UTF8
-LOCALE_JA
+GL_GNULIB_MDA_WCSDUP
+GL_GNULIB_WCSFTIME
+GL_GNULIB_WCSWIDTH
+GL_GNULIB_WCSTOK
+GL_GNULIB_WCSSTR
+GL_GNULIB_WCSPBRK
+GL_GNULIB_WCSSPN
+GL_GNULIB_WCSCSPN
+GL_GNULIB_WCSRCHR
+GL_GNULIB_WCSCHR
+GL_GNULIB_WCSDUP
+GL_GNULIB_WCSXFRM
+GL_GNULIB_WCSCOLL
+GL_GNULIB_WCSNCASECMP
+GL_GNULIB_WCSCASECMP
+GL_GNULIB_WCSNCMP
+GL_GNULIB_WCSCMP
+GL_GNULIB_WCSNCAT
+GL_GNULIB_WCSCAT
+GL_GNULIB_WCPNCPY
+GL_GNULIB_WCSNCPY
+GL_GNULIB_WCPCPY
+GL_GNULIB_WCSCPY
+GL_GNULIB_WCSNLEN
+GL_GNULIB_WCSLEN
+GL_GNULIB_WMEMSET
+GL_GNULIB_WMEMPCPY
+GL_GNULIB_WMEMMOVE
+GL_GNULIB_WMEMCPY
+GL_GNULIB_WMEMCMP
+GL_GNULIB_WMEMCHR
+GL_GNULIB_WCWIDTH
+GL_GNULIB_WCSNRTOMBS
+GL_GNULIB_WCSRTOMBS
+GL_GNULIB_WCRTOMB
+GL_GNULIB_MBSNRTOWCS
+GL_GNULIB_MBSRTOWCS
+GL_GNULIB_MBRLEN
+GL_GNULIB_MBRTOWC
+GL_GNULIB_MBSINIT
+GL_GNULIB_WCTOB
+GL_GNULIB_BTOWC
+HAVE_VISIBILITY
+CFLAG_VISIBILITY
+LIB_MBRTOWC
 REPLACE_WCSTOK
 REPLACE_WCSFTIME
 REPLACE_WCSWIDTH
@@ -980,6 +1122,7 @@
 REPLACE_BTOWC
 REPLACE_MBSTATE_T
 HAVE_DECL_WCWIDTH
+HAVE_DECL_WCSDUP
 HAVE_DECL_WCTOB
 HAVE_WCSFTIME
 HAVE_WCSWIDTH
@@ -1006,6 +1149,7 @@
 HAVE_WCSNLEN
 HAVE_WCSLEN
 HAVE_WMEMSET
+HAVE_WMEMPCPY
 HAVE_WMEMMOVE
 HAVE_WMEMCPY
 HAVE_WMEMCMP
@@ -1019,46 +1163,6 @@
 HAVE_MBRTOWC
 HAVE_MBSINIT
 HAVE_BTOWC
-GNULIB_WCSFTIME
-GNULIB_WCSWIDTH
-GNULIB_WCSTOK
-GNULIB_WCSSTR
-GNULIB_WCSPBRK
-GNULIB_WCSSPN
-GNULIB_WCSCSPN
-GNULIB_WCSRCHR
-GNULIB_WCSCHR
-GNULIB_WCSDUP
-GNULIB_WCSXFRM
-GNULIB_WCSCOLL
-GNULIB_WCSNCASECMP
-GNULIB_WCSCASECMP
-GNULIB_WCSNCMP
-GNULIB_WCSCMP
-GNULIB_WCSNCAT
-GNULIB_WCSCAT
-GNULIB_WCPNCPY
-GNULIB_WCSNCPY
-GNULIB_WCPCPY
-GNULIB_WCSCPY
-GNULIB_WCSNLEN
-GNULIB_WCSLEN
-GNULIB_WMEMSET
-GNULIB_WMEMMOVE
-GNULIB_WMEMCPY
-GNULIB_WMEMCMP
-GNULIB_WMEMCHR
-GNULIB_WCWIDTH
-GNULIB_WCSNRTOMBS
-GNULIB_WCSRTOMBS
-GNULIB_WCRTOMB
-GNULIB_MBSNRTOWCS
-GNULIB_MBSRTOWCS
-GNULIB_MBRLEN
-GNULIB_MBRTOWC
-GNULIB_MBSINIT
-GNULIB_WCTOB
-GNULIB_BTOWC
 NEXT_AS_FIRST_DIRECTIVE_MATH_H
 NEXT_MATH_H
 SED
@@ -1066,18 +1170,24 @@
 LIBMULTITHREAD
 LTLIBTHREAD
 LIBTHREAD
+LIBSTDTHREAD
+LIB_SCHED_YIELD
 LIBPMULTITHREAD
 LIBPTHREAD
 LOCALCHARSET_TESTS_ENVIRONMENT
-GL_GENERATE_TEXTSTYLE_H_FALSE
-GL_GENERATE_TEXTSTYLE_H_TRUE
-TEXTSTYLE_H
-LIBTEXTSTYLE_PREFIX
-LTLIBTEXTSTYLE
-LIBTEXTSTYLE
-HAVE_LIBTEXTSTYLE
 LDEXPL_LIBM
 LDEXP_LIBM
+LOCALE_ZH_CN
+LOCALE_FR_UTF8
+LOCALE_JA
+LOCALE_FR
+GL_GNULIB_TOWCTRANS
+GL_GNULIB_WCTRANS
+GL_GNULIB_ISWCTYPE
+GL_GNULIB_WCTYPE
+GL_GNULIB_ISWXDIGIT
+GL_GNULIB_ISWDIGIT
+GL_GNULIB_ISWBLANK
 REPLACE_TOWLOWER
 REPLACE_ISWCNTRL
 HAVE_WCTYPE_H
@@ -1086,25 +1196,25 @@
 HAVE_CRTDEFS_H
 HAVE_WINT_T
 HAVE_ISWCNTRL
+REPLACE_ISWXDIGIT
+REPLACE_ISWDIGIT
 REPLACE_ISWBLANK
 HAVE_WCTRANS_T
 HAVE_WCTYPE_T
 HAVE_ISWBLANK
-GNULIB_TOWCTRANS
-GNULIB_WCTRANS
-GNULIB_ISWCTYPE
-GNULIB_WCTYPE
-GNULIB_ISWBLANK
 ISNAN_LIBM
 ISNANL_LIBM
 ISNAND_LIBM
 ISNANF_LIBM
+GL_GNULIB_STRTOUMAX
+GL_GNULIB_STRTOIMAX
+GL_GNULIB_IMAXDIV
+GL_GNULIB_IMAXABS
 NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H
 NEXT_INTTYPES_H
 UINT64_MAX_EQ_ULONG_MAX
 UINT32_MAX_LT_UINTMAX_MAX
 PRIPTR_PREFIX
-PRI_MACROS_BROKEN
 INT64_MAX_EQ_LONG_MAX
 INT32_MAX_LT_INTMAX_MAX
 REPLACE_STRTOUMAX
@@ -1114,10 +1224,6 @@
 HAVE_DECL_STRTOIMAX
 HAVE_DECL_IMAXDIV
 HAVE_DECL_IMAXABS
-GNULIB_STRTOUMAX
-GNULIB_STRTOIMAX
-GNULIB_IMAXDIV
-GNULIB_IMAXABS
 GL_GENERATE_STDINT_H_FALSE
 GL_GENERATE_STDINT_H_TRUE
 STDINT_H
@@ -1143,38 +1249,24 @@
 HAVE_SYS_TYPES_H
 HAVE_INTTYPES_H
 HAVE_WCHAR_H
-HAVE_UNSIGNED_LONG_LONG_INT
-HAVE_LONG_LONG_INT
 GL_GENERATE_LIMITS_H_FALSE
 GL_GENERATE_LIMITS_H_TRUE
 LIMITS_H
 NEXT_AS_FIRST_DIRECTIVE_LIMITS_H
 NEXT_LIMITS_H
-REPLACE_LOCALTIME
-REPLACE_GMTIME
-REPLACE_TZSET
-REPLACE_TIMEGM
-REPLACE_STRFTIME
-REPLACE_NANOSLEEP
-REPLACE_MKTIME
-REPLACE_LOCALTIME_R
-REPLACE_CTIME
-HAVE_TIMEZONE_T
-HAVE_TZSET
-HAVE_TIMEGM
-HAVE_STRPTIME
-HAVE_NANOSLEEP
-HAVE_DECL_LOCALTIME_R
-GNULIB_TZSET
-GNULIB_TIME_RZ
-GNULIB_TIME_R
-GNULIB_TIMEGM
-GNULIB_STRPTIME
-GNULIB_STRFTIME
-GNULIB_NANOSLEEP
-GNULIB_LOCALTIME
-GNULIB_MKTIME
-GNULIB_CTIME
+NEXT_AS_FIRST_DIRECTIVE_ICONV_H
+NEXT_ICONV_H
+GL_GNULIB_ICONV
+GL_GENERATE_ICONV_H_FALSE
+GL_GENERATE_ICONV_H_TRUE
+ICONV_H
+REPLACE_ICONV_UTF
+REPLACE_ICONV_OPEN
+REPLACE_ICONV
+ICONV_CONST
+LTLIBICONV
+LIBICONV
+GL_GNULIB_GETTIMEOFDAY
 NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H
 NEXT_SYS_TIME_H
 REPLACE_STRUCT_TIMEVAL
@@ -1182,12 +1274,10 @@
 HAVE_SYS_TIME_H
 HAVE_STRUCT_TIMEVAL
 HAVE_GETTIMEOFDAY
-GNULIB_GETTIMEOFDAY
 LTLIBINTL
 LIBINTL
+GL_GNULIB_GETRUSAGE
 HAVE_GETRUSAGE
-GNULIB_GETRUSAGE
-GNULIB_GL_UNISTD_H_GETOPT
 GETOPT_CDEFS_H
 GETOPT_H
 HAVE_SYS_CDEFS_H
@@ -1195,6 +1285,107 @@
 NEXT_AS_FIRST_DIRECTIVE_GETOPT_H
 NEXT_GETOPT_H
 LIB_GETHRXTIME
+GL_GNULIB_MDA_YN
+GL_GNULIB_MDA_Y1
+GL_GNULIB_MDA_Y0
+GL_GNULIB_MDA_JN
+GL_GNULIB_MDA_J1
+GL_GNULIB_MDA_J0
+GL_GNULIB_TRUNCL
+GL_GNULIB_TRUNCF
+GL_GNULIB_TRUNC
+GL_GNULIB_TANHF
+GL_GNULIB_TANL
+GL_GNULIB_TANF
+GL_GNULIB_SQRTL
+GL_GNULIB_SQRTF
+GL_GNULIB_SINHF
+GL_GNULIB_SINL
+GL_GNULIB_SINF
+GL_GNULIB_SIGNBIT
+GL_GNULIB_ROUNDL
+GL_GNULIB_ROUNDF
+GL_GNULIB_ROUND
+GL_GNULIB_RINTL
+GL_GNULIB_RINTF
+GL_GNULIB_RINT
+GL_GNULIB_REMAINDERL
+GL_GNULIB_REMAINDERF
+GL_GNULIB_REMAINDER
+GL_GNULIB_POWF
+GL_GNULIB_MODFL
+GL_GNULIB_MODFF
+GL_GNULIB_MODF
+GL_GNULIB_LOGBL
+GL_GNULIB_LOGBF
+GL_GNULIB_LOGB
+GL_GNULIB_LOG2L
+GL_GNULIB_LOG2F
+GL_GNULIB_LOG2
+GL_GNULIB_LOG1PL
+GL_GNULIB_LOG1PF
+GL_GNULIB_LOG1P
+GL_GNULIB_LOG10L
+GL_GNULIB_LOG10F
+GL_GNULIB_LOG10
+GL_GNULIB_LOGL
+GL_GNULIB_LOGF
+GL_GNULIB_LOG
+GL_GNULIB_LDEXPL
+GL_GNULIB_LDEXPF
+GL_GNULIB_ISNANL
+GL_GNULIB_ISNAND
+GL_GNULIB_ISNANF
+GL_GNULIB_ISNAN
+GL_GNULIB_ISINF
+GL_GNULIB_ISFINITE
+GL_GNULIB_ILOGBL
+GL_GNULIB_ILOGBF
+GL_GNULIB_ILOGB
+GL_GNULIB_HYPOTL
+GL_GNULIB_HYPOTF
+GL_GNULIB_HYPOT
+GL_GNULIB_FREXPL
+GL_GNULIB_FREXP
+GL_GNULIB_FREXPF
+GL_GNULIB_FMODL
+GL_GNULIB_FMODF
+GL_GNULIB_FMOD
+GL_GNULIB_FMAL
+GL_GNULIB_FMAF
+GL_GNULIB_FMA
+GL_GNULIB_FLOORL
+GL_GNULIB_FLOORF
+GL_GNULIB_FLOOR
+GL_GNULIB_FABSL
+GL_GNULIB_FABSF
+GL_GNULIB_EXPM1L
+GL_GNULIB_EXPM1F
+GL_GNULIB_EXPM1
+GL_GNULIB_EXP2L
+GL_GNULIB_EXP2F
+GL_GNULIB_EXP2
+GL_GNULIB_EXPL
+GL_GNULIB_EXPF
+GL_GNULIB_COSHF
+GL_GNULIB_COSL
+GL_GNULIB_COSF
+GL_GNULIB_COPYSIGNL
+GL_GNULIB_COPYSIGNF
+GL_GNULIB_COPYSIGN
+GL_GNULIB_CEILL
+GL_GNULIB_CEILF
+GL_GNULIB_CEIL
+GL_GNULIB_CBRTL
+GL_GNULIB_CBRTF
+GL_GNULIB_CBRT
+GL_GNULIB_ATAN2F
+GL_GNULIB_ATANL
+GL_GNULIB_ATANF
+GL_GNULIB_ASINL
+GL_GNULIB_ASINF
+GL_GNULIB_ACOSL
+GL_GNULIB_ACOSF
 REPLACE_TRUNCL
 REPLACE_TRUNCF
 REPLACE_TRUNC
@@ -1204,7 +1395,7 @@
 REPLACE_SQRTF
 REPLACE_SINHF
 REPLACE_SINF
-REPLACE_SIGNBIT_USING_GCC
+REPLACE_SIGNBIT_USING_BUILTINS
 REPLACE_SIGNBIT
 REPLACE_ROUNDL
 REPLACE_ROUNDF
@@ -1370,105 +1561,69 @@
 HAVE_ASINF
 HAVE_ACOSL
 HAVE_ACOSF
-GNULIB_TRUNCL
-GNULIB_TRUNCF
-GNULIB_TRUNC
-GNULIB_TANHF
-GNULIB_TANL
-GNULIB_TANF
-GNULIB_SQRTL
-GNULIB_SQRTF
-GNULIB_SINHF
-GNULIB_SINL
-GNULIB_SINF
-GNULIB_SIGNBIT
-GNULIB_ROUNDL
-GNULIB_ROUNDF
-GNULIB_ROUND
-GNULIB_RINTL
-GNULIB_RINTF
-GNULIB_RINT
-GNULIB_REMAINDERL
-GNULIB_REMAINDERF
-GNULIB_REMAINDER
-GNULIB_POWF
-GNULIB_MODFL
-GNULIB_MODFF
-GNULIB_MODF
-GNULIB_LOGBL
-GNULIB_LOGBF
-GNULIB_LOGB
-GNULIB_LOG2L
-GNULIB_LOG2F
-GNULIB_LOG2
-GNULIB_LOG1PL
-GNULIB_LOG1PF
-GNULIB_LOG1P
-GNULIB_LOG10L
-GNULIB_LOG10F
-GNULIB_LOG10
-GNULIB_LOGL
-GNULIB_LOGF
-GNULIB_LOG
-GNULIB_LDEXPL
-GNULIB_LDEXPF
-GNULIB_ISNANL
-GNULIB_ISNAND
-GNULIB_ISNANF
-GNULIB_ISNAN
-GNULIB_ISINF
-GNULIB_ISFINITE
-GNULIB_ILOGBL
-GNULIB_ILOGBF
-GNULIB_ILOGB
-GNULIB_HYPOTL
-GNULIB_HYPOTF
-GNULIB_HYPOT
-GNULIB_FREXPL
-GNULIB_FREXP
-GNULIB_FREXPF
-GNULIB_FMODL
-GNULIB_FMODF
-GNULIB_FMOD
-GNULIB_FMAL
-GNULIB_FMAF
-GNULIB_FMA
-GNULIB_FLOORL
-GNULIB_FLOORF
-GNULIB_FLOOR
-GNULIB_FABSL
-GNULIB_FABSF
-GNULIB_EXPM1L
-GNULIB_EXPM1F
-GNULIB_EXPM1
-GNULIB_EXP2L
-GNULIB_EXP2F
-GNULIB_EXP2
-GNULIB_EXPL
-GNULIB_EXPF
-GNULIB_COSHF
-GNULIB_COSL
-GNULIB_COSF
-GNULIB_COPYSIGNL
-GNULIB_COPYSIGNF
-GNULIB_COPYSIGN
-GNULIB_CEILL
-GNULIB_CEILF
-GNULIB_CEIL
-GNULIB_CBRTL
-GNULIB_CBRTF
-GNULIB_CBRT
-GNULIB_ATAN2F
-GNULIB_ATANL
-GNULIB_ATANF
-GNULIB_ASINL
-GNULIB_ASINF
-GNULIB_ACOSL
-GNULIB_ACOSF
 HAVE_FEATURES_H
-GNULIB_OVERRIDES_WINT_T
+GNULIBHEADERS_OVERRIDE_WINT_T
 APPLE_UNIVERSAL_BUILD
 HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+GL_GNULIB_MDA_TEMPNAM
+GL_GNULIB_MDA_PUTW
+GL_GNULIB_MDA_GETW
+GL_GNULIB_MDA_FILENO
+GL_GNULIB_MDA_FDOPEN
+GL_GNULIB_MDA_FCLOSEALL
+GL_GNULIB_VSPRINTF_POSIX
+GL_GNULIB_VSNPRINTF
+GL_GNULIB_VPRINTF_POSIX
+GL_GNULIB_VPRINTF
+GL_GNULIB_VFPRINTF_POSIX
+GL_GNULIB_VFPRINTF
+GL_GNULIB_VDPRINTF
+GL_GNULIB_VSCANF
+GL_GNULIB_VFSCANF
+GL_GNULIB_VASPRINTF
+GL_GNULIB_TMPFILE
+GL_GNULIB_STDIO_H_SIGPIPE
+GL_GNULIB_STDIO_H_NONBLOCKING
+GL_GNULIB_SPRINTF_POSIX
+GL_GNULIB_SNPRINTF
+GL_GNULIB_SCANF
+GL_GNULIB_RENAMEAT
+GL_GNULIB_RENAME
+GL_GNULIB_REMOVE
+GL_GNULIB_PUTS
+GL_GNULIB_PUTCHAR
+GL_GNULIB_PUTC
+GL_GNULIB_PRINTF_POSIX
+GL_GNULIB_PRINTF
+GL_GNULIB_POPEN
+GL_GNULIB_PERROR
+GL_GNULIB_PCLOSE
+GL_GNULIB_OBSTACK_PRINTF_POSIX
+GL_GNULIB_OBSTACK_PRINTF
+GL_GNULIB_GETLINE
+GL_GNULIB_GETDELIM
+GL_GNULIB_GETCHAR
+GL_GNULIB_GETC
+GL_GNULIB_FWRITE
+GL_GNULIB_FTELLO
+GL_GNULIB_FTELL
+GL_GNULIB_FSEEKO
+GL_GNULIB_FSEEK
+GL_GNULIB_FSCANF
+GL_GNULIB_FREOPEN
+GL_GNULIB_FREAD
+GL_GNULIB_FPUTS
+GL_GNULIB_FPUTC
+GL_GNULIB_FPURGE
+GL_GNULIB_FPRINTF_POSIX
+GL_GNULIB_FPRINTF
+GL_GNULIB_FOPEN
+GL_GNULIB_FGETS
+GL_GNULIB_FGETC
+GL_GNULIB_FFLUSH
+GL_GNULIB_FDOPEN
+GL_GNULIB_FCLOSE
+GL_GNULIB_DPRINTF
 REPLACE_VSPRINTF
 REPLACE_VSNPRINTF
 REPLACE_VPRINTF
@@ -1517,78 +1672,112 @@
 HAVE_DECL_FTELLO
 HAVE_DECL_FSEEKO
 HAVE_DECL_FPURGE
-GNULIB_VSPRINTF_POSIX
-GNULIB_VSNPRINTF
-GNULIB_VPRINTF_POSIX
-GNULIB_VPRINTF
-GNULIB_VFPRINTF_POSIX
-GNULIB_VFPRINTF
-GNULIB_VDPRINTF
-GNULIB_VSCANF
-GNULIB_VFSCANF
-GNULIB_VASPRINTF
-GNULIB_TMPFILE
-GNULIB_STDIO_H_SIGPIPE
-GNULIB_STDIO_H_NONBLOCKING
-GNULIB_SPRINTF_POSIX
-GNULIB_SNPRINTF
-GNULIB_SCANF
-GNULIB_RENAMEAT
-GNULIB_RENAME
-GNULIB_REMOVE
-GNULIB_PUTS
-GNULIB_PUTCHAR
-GNULIB_PUTC
-GNULIB_PRINTF_POSIX
-GNULIB_PRINTF
-GNULIB_POPEN
-GNULIB_PERROR
-GNULIB_PCLOSE
-GNULIB_OBSTACK_PRINTF_POSIX
-GNULIB_OBSTACK_PRINTF
-GNULIB_GETLINE
-GNULIB_GETDELIM
-GNULIB_GETCHAR
-GNULIB_GETC
-GNULIB_FWRITE
-GNULIB_FTELLO
-GNULIB_FTELL
-GNULIB_FSEEKO
-GNULIB_FSEEK
-GNULIB_FSCANF
-GNULIB_FREOPEN
-GNULIB_FREAD
-GNULIB_FPUTS
-GNULIB_FPUTC
-GNULIB_FPURGE
-GNULIB_FPRINTF_POSIX
-GNULIB_FPRINTF
-GNULIB_FOPEN
-GNULIB_FGETS
-GNULIB_FGETC
-GNULIB_FFLUSH
-GNULIB_FDOPEN
-GNULIB_FCLOSE
-GNULIB_DPRINTF
+HAVE_DECL_FCLOSEALL
 REPLACE_ITOLD
 GL_GENERATE_FLOAT_H_FALSE
 GL_GENERATE_FLOAT_H_TRUE
 FLOAT_H
 NEXT_AS_FIRST_DIRECTIVE_FLOAT_H
 NEXT_FLOAT_H
+GL_GNULIB_MDA_STRDUP
+GL_GNULIB_MDA_MEMCCPY
+GL_GNULIB_STRVERSCMP
+GL_GNULIB_STRSIGNAL
+GL_GNULIB_SIGDESCR_NP
+GL_GNULIB_SIGABBREV_NP
+GL_GNULIB_STRERRORNAME_NP
+GL_GNULIB_STRERROR_R
+GL_GNULIB_STRERROR
+GL_GNULIB_MBSTOK_R
+GL_GNULIB_MBSSEP
+GL_GNULIB_MBSSPN
+GL_GNULIB_MBSPBRK
+GL_GNULIB_MBSCSPN
+GL_GNULIB_MBSCASESTR
+GL_GNULIB_MBSPCASECMP
+GL_GNULIB_MBSNCASECMP
+GL_GNULIB_MBSCASECMP
+GL_GNULIB_MBSSTR
+GL_GNULIB_MBSRCHR
+GL_GNULIB_MBSCHR
+GL_GNULIB_MBSNLEN
+GL_GNULIB_MBSLEN
+GL_GNULIB_STRTOK_R
+GL_GNULIB_STRCASESTR
+GL_GNULIB_STRSTR
+GL_GNULIB_STRSEP
+GL_GNULIB_STRPBRK
+GL_GNULIB_STRNLEN
+GL_GNULIB_STRNDUP
+GL_GNULIB_STRNCAT
+GL_GNULIB_STRDUP
+GL_GNULIB_STRCHRNUL
+GL_GNULIB_STPNCPY
+GL_GNULIB_STPCPY
+GL_GNULIB_RAWMEMCHR
+GL_GNULIB_MEMRCHR
+GL_GNULIB_MEMPCPY
+GL_GNULIB_MEMMEM
+GL_GNULIB_MEMCHR
+GL_GNULIB_FFSLL
+GL_GNULIB_FFSL
+GL_GNULIB_EXPLICIT_BZERO
+UNDEFINE_STRTOK_R
+REPLACE_STRSIGNAL
+REPLACE_STRERRORNAME_NP
+REPLACE_STRERROR_R
+REPLACE_STRERROR
+REPLACE_STRTOK_R
+REPLACE_STRCASESTR
+REPLACE_STRSTR
+REPLACE_STRNLEN
+REPLACE_STRNDUP
+REPLACE_STRNCAT
+REPLACE_STRDUP
+REPLACE_STRCHRNUL
+REPLACE_STPNCPY
+REPLACE_MEMMEM
+REPLACE_MEMCHR
+REPLACE_FFSLL
+HAVE_STRVERSCMP
+HAVE_DECL_STRSIGNAL
+HAVE_SIGDESCR_NP
+HAVE_SIGABBREV_NP
+HAVE_STRERRORNAME_NP
+HAVE_DECL_STRERROR_R
+HAVE_DECL_STRTOK_R
+HAVE_STRCASESTR
+HAVE_STRSEP
+HAVE_STRPBRK
+HAVE_DECL_STRNLEN
+HAVE_DECL_STRNDUP
+HAVE_DECL_STRDUP
+HAVE_STRCHRNUL
+HAVE_STPNCPY
+HAVE_STPCPY
+HAVE_RAWMEMCHR
+HAVE_DECL_MEMRCHR
+HAVE_MEMPCPY
+HAVE_DECL_MEMMEM
+HAVE_FFSLL
+HAVE_FFSL
+HAVE_EXPLICIT_BZERO
+HAVE_MBSLEN
 NEXT_AS_FIRST_DIRECTIVE_FCNTL_H
 NEXT_FCNTL_H
+GL_GNULIB_MDA_OPEN
+GL_GNULIB_MDA_CREAT
+GL_GNULIB_OPENAT
+GL_GNULIB_OPEN
+GL_GNULIB_NONBLOCKING
+GL_GNULIB_FCNTL
+GL_GNULIB_CREAT
 REPLACE_OPENAT
 REPLACE_OPEN
 REPLACE_FCNTL
 REPLACE_CREAT
 HAVE_OPENAT
 HAVE_FCNTL
-GNULIB_OPENAT
-GNULIB_OPEN
-GNULIB_NONBLOCKING
-GNULIB_FCNTL
-GNULIB_CREAT
 EOVERFLOW_VALUE
 EOVERFLOW_HIDDEN
 ENOLINK_VALUE
@@ -1605,12 +1794,221 @@
 INCLUDE_NEXT_AS_FIRST_DIRECTIVE
 INCLUDE_NEXT
 pkglibexecdir
-runstatedir
 lispdir
 HAVE_WINSOCK2_H
+REPLACE_IOCTL
+SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS
+SYS_IOCTL_H_HAVE_WINSOCK2_H
 HAVE_MSVC_INVALID_PARAMETER_HANDLER
+LIB_CLOCK_GETTIME
+GL_GNULIB_MDA_PUTENV
+GL_GNULIB_MDA_MKTEMP
+GL_GNULIB_MDA_GCVT
+GL_GNULIB_MDA_FCVT
+GL_GNULIB_MDA_ECVT
+GL_GNULIB_WCTOMB
+GL_GNULIB_UNSETENV
+GL_GNULIB_UNLOCKPT
+GL_GNULIB_SYSTEM_POSIX
+GL_GNULIB_STRTOULL
+GL_GNULIB_STRTOUL
+GL_GNULIB_STRTOLL
+GL_GNULIB_STRTOLD
+GL_GNULIB_STRTOL
+GL_GNULIB_STRTOD
+GL_GNULIB_SETENV
+GL_GNULIB_SECURE_GETENV
+GL_GNULIB_RPMATCH
+GL_GNULIB_REALPATH
+GL_GNULIB_REALLOC_POSIX
+GL_GNULIB_REALLOCARRAY
+GL_GNULIB_RANDOM_R
+GL_GNULIB_RANDOM
+GL_GNULIB_QSORT_R
+GL_GNULIB_PUTENV
+GL_GNULIB_PTSNAME_R
+GL_GNULIB_PTSNAME
+GL_GNULIB_POSIX_OPENPT
+GL_GNULIB_POSIX_MEMALIGN
+GL_GNULIB_MKSTEMPS
+GL_GNULIB_MKSTEMP
+GL_GNULIB_MKOSTEMPS
+GL_GNULIB_MKOSTEMP
+GL_GNULIB_MKDTEMP
+GL_GNULIB_MBTOWC
+GL_GNULIB_MALLOC_POSIX
+GL_GNULIB_GRANTPT
+GL_GNULIB_GETSUBOPT
+GL_GNULIB_GETLOADAVG
+GL_GNULIB_FREE_POSIX
+GL_GNULIB_CANONICALIZE_FILE_NAME
+GL_GNULIB_CALLOC_POSIX
+GL_GNULIB_ATOLL
+GL_GNULIB_ALIGNED_ALLOC
+GL_GNULIB__EXIT
+REPLACE_WCTOMB
+REPLACE_UNSETENV
+REPLACE_STRTOULL
+REPLACE_STRTOUL
+REPLACE_STRTOLL
+REPLACE_STRTOLD
+REPLACE_STRTOL
+REPLACE_STRTOD
+REPLACE_SETSTATE
+REPLACE_SETENV
+REPLACE_REALPATH
+REPLACE_REALLOCARRAY
+REPLACE_REALLOC
+REPLACE_RANDOM_R
+REPLACE_RANDOM
+REPLACE_QSORT_R
+REPLACE_PUTENV
+REPLACE_PTSNAME_R
+REPLACE_PTSNAME
+REPLACE_POSIX_MEMALIGN
+REPLACE_MKSTEMP
+REPLACE_MBTOWC
+REPLACE_MALLOC
+REPLACE_INITSTATE
+REPLACE_FREE
+REPLACE_CANONICALIZE_FILE_NAME
+REPLACE_CALLOC
+REPLACE_ALIGNED_ALLOC
+HAVE_DECL_UNSETENV
+HAVE_UNLOCKPT
+HAVE_SYS_LOADAVG_H
+HAVE_STRUCT_RANDOM_DATA
+HAVE_STRTOULL
+HAVE_STRTOUL
+HAVE_STRTOLL
+HAVE_STRTOLD
+HAVE_STRTOL
+HAVE_STRTOD
+HAVE_DECL_SETSTATE
+HAVE_SETSTATE
+HAVE_DECL_SETENV
+HAVE_SETENV
+HAVE_SECURE_GETENV
+HAVE_RPMATCH
+HAVE_REALPATH
+HAVE_REALLOCARRAY
+HAVE_RANDOM_R
+HAVE_RANDOM_H
+HAVE_RANDOM
+HAVE_QSORT_R
+HAVE_PTSNAME_R
+HAVE_PTSNAME
+HAVE_POSIX_OPENPT
+HAVE_POSIX_MEMALIGN
+HAVE_MKSTEMPS
+HAVE_MKSTEMP
+HAVE_MKOSTEMPS
+HAVE_MKOSTEMP
+HAVE_MKDTEMP
+HAVE_MBTOWC
+HAVE_DECL_INITSTATE
+HAVE_INITSTATE
+HAVE_GRANTPT
+HAVE_GETSUBOPT
+HAVE_DECL_GETLOADAVG
+HAVE_DECL_GCVT
+HAVE_DECL_FCVT
+HAVE_DECL_ECVT
+HAVE_CANONICALIZE_FILE_NAME
+HAVE_ATOLL
+HAVE_ALIGNED_ALLOC
+HAVE__EXIT
+HAVE_ALLOCA_H
+GL_GENERATE_ALLOCA_H_FALSE
+GL_GENERATE_ALLOCA_H_TRUE
+ALLOCA_H
+ALLOCA
+GL_GNULIB_MDA_WRITE
+GL_GNULIB_MDA_UNLINK
+GL_GNULIB_MDA_SWAB
+GL_GNULIB_MDA_RMDIR
+GL_GNULIB_MDA_READ
+GL_GNULIB_MDA_LSEEK
+GL_GNULIB_MDA_ISATTY
+GL_GNULIB_MDA_GETPID
+GL_GNULIB_MDA_GETCWD
+GL_GNULIB_MDA_EXECVPE
+GL_GNULIB_MDA_EXECVP
+GL_GNULIB_MDA_EXECVE
+GL_GNULIB_MDA_EXECV
+GL_GNULIB_MDA_EXECLP
+GL_GNULIB_MDA_EXECLE
+GL_GNULIB_MDA_EXECL
+GL_GNULIB_MDA_DUP2
+GL_GNULIB_MDA_DUP
+GL_GNULIB_MDA_CLOSE
+GL_GNULIB_MDA_CHDIR
+GL_GNULIB_MDA_ACCESS
+GL_GNULIB_WRITE
+GL_GNULIB_USLEEP
+GL_GNULIB_UNLINKAT
+GL_GNULIB_UNLINK
+GL_GNULIB_UNISTD_H_SIGPIPE
+GL_GNULIB_UNISTD_H_NONBLOCKING
+GL_GNULIB_UNISTD_H_GETOPT
+GL_GNULIB_TTYNAME_R
+GL_GNULIB_TRUNCATE
+GL_GNULIB_SYMLINKAT
+GL_GNULIB_SYMLINK
+GL_GNULIB_SLEEP
+GL_GNULIB_SETHOSTNAME
+GL_GNULIB_RMDIR
+GL_GNULIB_READLINKAT
+GL_GNULIB_READLINK
+GL_GNULIB_READ
+GL_GNULIB_PWRITE
+GL_GNULIB_PREAD
+GL_GNULIB_PIPE2
+GL_GNULIB_PIPE
+GL_GNULIB_LSEEK
+GL_GNULIB_LINKAT
+GL_GNULIB_LINK
+GL_GNULIB_LCHOWN
+GL_GNULIB_ISATTY
+GL_GNULIB_GROUP_MEMBER
+GL_GNULIB_GETUSERSHELL
+GL_GNULIB_GETPASS
+GL_GNULIB_GETPAGESIZE
+GL_GNULIB_GETOPT_POSIX
+GL_GNULIB_GETLOGIN_R
+GL_GNULIB_GETLOGIN
+GL_GNULIB_GETHOSTNAME
+GL_GNULIB_GETGROUPS
+GL_GNULIB_GETENTROPY
+GL_GNULIB_GETDTABLESIZE
+GL_GNULIB_GETDOMAINNAME
+GL_GNULIB_GETCWD
+GL_GNULIB_FTRUNCATE
+GL_GNULIB_FSYNC
+GL_GNULIB_FDATASYNC
+GL_GNULIB_FCHOWNAT
+GL_GNULIB_FCHDIR
+GL_GNULIB_FACCESSAT
+GL_GNULIB_EXECVPE
+GL_GNULIB_EXECVP
+GL_GNULIB_EXECVE
+GL_GNULIB_EXECV
+GL_GNULIB_EXECLP
+GL_GNULIB_EXECLE
+GL_GNULIB_EXECL
+GL_GNULIB_EUIDACCESS
+GL_GNULIB_ENVIRON
+GL_GNULIB_DUP3
+GL_GNULIB_DUP2
+GL_GNULIB_DUP
+GL_GNULIB_COPY_FILE_RANGE
+GL_GNULIB_CLOSE
+GL_GNULIB_CHOWN
+GL_GNULIB_CHDIR
+GL_GNULIB_ACCESS
 UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS
 UNISTD_H_HAVE_WINSOCK2_H
+UNISTD_H_HAVE_SYS_RANDOM_H
 REPLACE_WRITE
 REPLACE_USLEEP
 REPLACE_UNLINKAT
@@ -1641,6 +2039,13 @@
 REPLACE_FTRUNCATE
 REPLACE_FCHOWNAT
 REPLACE_FACCESSAT
+REPLACE_EXECVPE
+REPLACE_EXECVP
+REPLACE_EXECVE
+REPLACE_EXECV
+REPLACE_EXECLP
+REPLACE_EXECLE
+REPLACE_EXECL
 REPLACE_DUP2
 REPLACE_DUP
 REPLACE_CLOSE
@@ -1658,6 +2063,7 @@
 HAVE_DECL_GETDOMAINNAME
 HAVE_DECL_FDATASYNC
 HAVE_DECL_FCHDIR
+HAVE_DECL_EXECVPE
 HAVE_DECL_ENVIRON
 HAVE_USLEEP
 HAVE_UNLINKAT
@@ -1680,6 +2086,7 @@
 HAVE_GETLOGIN
 HAVE_GETHOSTNAME
 HAVE_GETGROUPS
+HAVE_GETENTROPY
 HAVE_GETDTABLESIZE
 HAVE_FTRUNCATE
 HAVE_FSYNC
@@ -1687,161 +2094,11 @@
 HAVE_FCHOWNAT
 HAVE_FCHDIR
 HAVE_FACCESSAT
+HAVE_EXECVPE
 HAVE_EUIDACCESS
 HAVE_DUP3
-HAVE_DUP2
 HAVE_COPY_FILE_RANGE
 HAVE_CHOWN
-GNULIB_WRITE
-GNULIB_USLEEP
-GNULIB_UNLINKAT
-GNULIB_UNLINK
-GNULIB_UNISTD_H_SIGPIPE
-GNULIB_UNISTD_H_NONBLOCKING
-GNULIB_TTYNAME_R
-GNULIB_TRUNCATE
-GNULIB_SYMLINKAT
-GNULIB_SYMLINK
-GNULIB_SLEEP
-GNULIB_SETHOSTNAME
-GNULIB_RMDIR
-GNULIB_READLINKAT
-GNULIB_READLINK
-GNULIB_READ
-GNULIB_PWRITE
-GNULIB_PREAD
-GNULIB_PIPE2
-GNULIB_PIPE
-GNULIB_LSEEK
-GNULIB_LINKAT
-GNULIB_LINK
-GNULIB_LCHOWN
-GNULIB_ISATTY
-GNULIB_GROUP_MEMBER
-GNULIB_GETUSERSHELL
-GNULIB_GETPASS
-GNULIB_GETPAGESIZE
-GNULIB_GETLOGIN_R
-GNULIB_GETLOGIN
-GNULIB_GETHOSTNAME
-GNULIB_GETGROUPS
-GNULIB_GETDTABLESIZE
-GNULIB_GETDOMAINNAME
-GNULIB_GETCWD
-GNULIB_FTRUNCATE
-GNULIB_FSYNC
-GNULIB_FDATASYNC
-GNULIB_FCHOWNAT
-GNULIB_FCHDIR
-GNULIB_FACCESSAT
-GNULIB_EUIDACCESS
-GNULIB_ENVIRON
-GNULIB_DUP3
-GNULIB_DUP2
-GNULIB_DUP
-GNULIB_COPY_FILE_RANGE
-GNULIB_CLOSE
-GNULIB_CHOWN
-GNULIB_CHDIR
-GNULIB_ACCESS
-LIB_CLOCK_GETTIME
-REPLACE_WCTOMB
-REPLACE_UNSETENV
-REPLACE_STRTOLD
-REPLACE_STRTOD
-REPLACE_SETSTATE
-REPLACE_SETENV
-REPLACE_REALPATH
-REPLACE_REALLOC
-REPLACE_RANDOM_R
-REPLACE_RANDOM
-REPLACE_QSORT_R
-REPLACE_PUTENV
-REPLACE_PTSNAME_R
-REPLACE_PTSNAME
-REPLACE_MKSTEMP
-REPLACE_MBTOWC
-REPLACE_MALLOC
-REPLACE_INITSTATE
-REPLACE_CANONICALIZE_FILE_NAME
-REPLACE_CALLOC
-HAVE_DECL_UNSETENV
-HAVE_UNLOCKPT
-HAVE_SYS_LOADAVG_H
-HAVE_STRUCT_RANDOM_DATA
-HAVE_STRTOULL
-HAVE_STRTOLL
-HAVE_STRTOLD
-HAVE_STRTOD
-HAVE_DECL_SETSTATE
-HAVE_SETSTATE
-HAVE_DECL_SETENV
-HAVE_SETENV
-HAVE_SECURE_GETENV
-HAVE_RPMATCH
-HAVE_REALPATH
-HAVE_REALLOCARRAY
-HAVE_RANDOM_R
-HAVE_RANDOM_H
-HAVE_RANDOM
-HAVE_QSORT_R
-HAVE_PTSNAME_R
-HAVE_PTSNAME
-HAVE_POSIX_OPENPT
-HAVE_MKSTEMPS
-HAVE_MKSTEMP
-HAVE_MKOSTEMPS
-HAVE_MKOSTEMP
-HAVE_MKDTEMP
-HAVE_MBTOWC
-HAVE_DECL_INITSTATE
-HAVE_INITSTATE
-HAVE_GRANTPT
-HAVE_GETSUBOPT
-HAVE_DECL_GETLOADAVG
-HAVE_CANONICALIZE_FILE_NAME
-HAVE_ATOLL
-HAVE__EXIT
-GNULIB_WCTOMB
-GNULIB_UNSETENV
-GNULIB_UNLOCKPT
-GNULIB_SYSTEM_POSIX
-GNULIB_STRTOULL
-GNULIB_STRTOLL
-GNULIB_STRTOLD
-GNULIB_STRTOD
-GNULIB_SETENV
-GNULIB_SECURE_GETENV
-GNULIB_RPMATCH
-GNULIB_REALPATH
-GNULIB_REALLOC_POSIX
-GNULIB_REALLOCARRAY
-GNULIB_RANDOM_R
-GNULIB_RANDOM
-GNULIB_QSORT_R
-GNULIB_PUTENV
-GNULIB_PTSNAME_R
-GNULIB_PTSNAME
-GNULIB_POSIX_OPENPT
-GNULIB_MKSTEMPS
-GNULIB_MKSTEMP
-GNULIB_MKOSTEMPS
-GNULIB_MKOSTEMP
-GNULIB_MKDTEMP
-GNULIB_MBTOWC
-GNULIB_MALLOC_POSIX
-GNULIB_GRANTPT
-GNULIB_GETSUBOPT
-GNULIB_GETLOADAVG
-GNULIB_CANONICALIZE_FILE_NAME
-GNULIB_CALLOC_POSIX
-GNULIB_ATOLL
-GNULIB__EXIT
-HAVE_ALLOCA_H
-GL_GENERATE_ALLOCA_H_FALSE
-GL_GENERATE_ALLOCA_H_TRUE
-ALLOCA_H
-ALLOCA
 GL_COND_LIBTOOL_FALSE
 GL_COND_LIBTOOL_TRUE
 XSLTPROC
@@ -1909,13 +2166,27 @@
 ENABLE_CXX14_TRUE
 ENABLE_CXX11_FALSE
 ENABLE_CXX11_TRUE
-CXX2A_CXXFLAGS
+CXX2B_CXXFLAGS
+CXX20_CXXFLAGS
 CXX17_CXXFLAGS
 CXX14_CXXFLAGS
 CXX11_CXXFLAGS
 CXX03_CXXFLAGS
 CXX98_CXXFLAGS
 NO_EXCEPTIONS_CXXFLAGS
+GL_GENERATE_TEXTSTYLE_H_FALSE
+GL_GENERATE_TEXTSTYLE_H_TRUE
+TEXTSTYLE_H
+LIBTEXTSTYLE_PREFIX
+LTLIBTEXTSTYLE
+LIBTEXTSTYLE
+HAVE_LIBTEXTSTYLE
+RANLIB
+ARFLAGS
+AR
+EGREP
+GREP
+CPP
 host_os
 host_vendor
 host_cpu
@@ -1924,12 +2195,6 @@
 build_vendor
 build_cpu
 build
-RANLIB
-ARFLAGS
-AR
-EGREP
-GREP
-CPP
 am__fastdepCXX_FALSE
 am__fastdepCXX_TRUE
 CXXDEPMODE
@@ -1956,6 +2221,9 @@
 AM_DEFAULT_VERBOSITY
 AM_DEFAULT_V
 AM_V
+CSCOPE
+ETAGS
+CTAGS
 am__untar
 am__tar
 AMTAR
@@ -1999,6 +2267,7 @@
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -2025,17 +2294,19 @@
 enable_silent_rules
 enable_dependency_tracking
 enable_largefile
+enable_year2038
 enable_threads
+with_gnu_ld
+enable_rpath
+with_libtextstyle_prefix
 enable_gcc_warnings
 enable_yacc
 enable_cross_guesses
 enable_assert
-with_gnu_ld
-enable_rpath
-with_libtextstyle_prefix
+with_libiconv_prefix
+with_libreadline_prefix
 enable_relocatable
 enable_nls
-with_libiconv_prefix
 with_libintl_prefix
 '
       ac_precious_vars='build_alias
@@ -2091,6 +2362,7 @@
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -2120,8 +2392,6 @@
   *)    ac_optarg=yes ;;
   esac
 
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
   case $ac_dashdash$ac_option in
   --)
     ac_dashdash=yes ;;
@@ -2162,9 +2432,9 @@
     ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
     # Reject names that are not valid shell variable names.
     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid feature name: $ac_useropt"
+      as_fn_error $? "invalid feature name: \`$ac_useropt'"
     ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
     case $ac_user_opts in
       *"
 "enable_$ac_useropt"
@@ -2188,9 +2458,9 @@
     ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid feature name: $ac_useropt"
+      as_fn_error $? "invalid feature name: \`$ac_useropt'"
     ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
     case $ac_user_opts in
       *"
 "enable_$ac_useropt"
@@ -2343,6 +2613,15 @@
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -2392,9 +2671,9 @@
     ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid package name: $ac_useropt"
+      as_fn_error $? "invalid package name: \`$ac_useropt'"
     ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
     case $ac_user_opts in
       *"
 "with_$ac_useropt"
@@ -2408,9 +2687,9 @@
     ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
     # Reject names that are not valid shell variable names.
     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid package name: $ac_useropt"
+      as_fn_error $? "invalid package name: \`$ac_useropt'"
     ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
     case $ac_user_opts in
       *"
 "with_$ac_useropt"
@@ -2454,9 +2733,9 @@
 
   *)
     # FIXME: should be removed in autoconf 3.0.
-    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
     expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+      printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
     : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
     ;;
 
@@ -2472,7 +2751,7 @@
   case $enable_option_checking in
     no) ;;
     fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
-    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+    *)     printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
   esac
 fi
 
@@ -2480,7 +2759,7 @@
 for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
 		datadir sysconfdir sharedstatedir localstatedir includedir \
 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
+		libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -2536,7 +2815,7 @@
 	 X"$as_myself" : 'X\(//\)[^/]' \| \
 	 X"$as_myself" : 'X\(//\)$' \| \
 	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
+printf "%s\n" X"$as_myself" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -2593,7 +2872,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures GNU Bison 3.5 to adapt to many kinds of systems.
+\`configure' configures GNU Bison 3.8.2 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -2633,6 +2912,7 @@
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -2663,7 +2943,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of GNU Bison 3.5:";;
+     short | recursive ) echo "Configuration of GNU Bison 3.8.2:";;
    esac
   cat <<\_ACEOF
 
@@ -2678,9 +2958,11 @@
   --disable-dependency-tracking
                           speeds up one-time build
   --disable-largefile     omit support for large files
+  --disable-year2038      omit support for timestamps past the year 2038
   --enable-threads={isoc|posix|isoc+posix|windows}
                           specify multithreading API
   --disable-threads       build without multithread safety
+  --disable-rpath         do not hardcode runtime library paths
   --enable-gcc-warnings   turn on lots of GCC warnings (not recommended).
                            Also, issue synclines from the examples/ to
                            the corresponding source in the Texinfo doc.
@@ -2688,7 +2970,6 @@
   --enable-cross-guesses={conservative|risky}
                           specify policy for cross-compilation guesses
   --disable-assert        turn off assertions
-  --disable-rpath         do not hardcode runtime library paths
   --enable-relocatable    install a package that can be moved in the file
                           system
   --disable-nls           do not use Native Language Support
@@ -2701,6 +2982,8 @@
   --without-libtextstyle-prefix     don't search for libtextstyle in includedir and libdir
   --with-libiconv-prefix[=DIR]  search for libiconv in DIR/include and DIR/lib
   --without-libiconv-prefix     don't search for libiconv in includedir and libdir
+  --with-libreadline-prefix[=DIR]  search for libreadline in DIR/include and DIR/lib
+  --without-libreadline-prefix     don't search for libreadline in includedir and libdir
   --with-libintl-prefix[=DIR]  search for libintl in DIR/include and DIR/lib
   --without-libintl-prefix     don't search for libintl in includedir and libdir
 
@@ -2728,8 +3011,8 @@
 it to find libraries and programs with nonstandard names/locations.
 
 Report bugs to <bug-bison@gnu.org>.
-GNU Bison home page: <http://www.gnu.org/software/bison/>.
-General help using GNU software: <http://www.gnu.org/gethelp/>.
+GNU Bison home page: <https://www.gnu.org/software/bison/>.
+General help using GNU software: <https://www.gnu.org/gethelp/>.
 _ACEOF
 ac_status=$?
 fi
@@ -2745,9 +3028,9 @@
 case "$ac_dir" in
 .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
 *)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
   # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
   case $ac_top_builddir_sub in
   "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
   *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -2775,7 +3058,8 @@
 ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
 
     cd "$ac_dir" || { ac_status=$?; continue; }
-    # Check for guested configure.
+    # Check for configure.gnu first; this name is used for a wrapper for
+    # Metaconfig's "Configure" on case-insensitive file systems.
     if test -f "$ac_srcdir/configure.gnu"; then
       echo &&
       $SHELL "$ac_srcdir/configure.gnu" --help=recursive
@@ -2783,7 +3067,7 @@
       echo &&
       $SHELL "$ac_srcdir/configure" --help=recursive
     else
-      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+      printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
     fi || ac_status=$?
     cd "$ac_pwd" || { ac_status=$?; break; }
   done
@@ -2792,10 +3076,10 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-GNU Bison configure 3.5
-generated by GNU Autoconf 2.69
+GNU Bison configure 3.8.2
+generated by GNU Autoconf 2.71
 
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
@@ -2812,14 +3096,14 @@
 ac_fn_c_try_compile ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
+  rm -f conftest.$ac_objext conftest.beam
   if { { ac_try="$ac_compile"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
   (eval "$ac_compile") 2>conftest.err
   ac_status=$?
   if test -s conftest.err; then
@@ -2827,14 +3111,15 @@
     cat conftest.er1 >&5
     mv -f conftest.er1 conftest.err
   fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
+       } && test -s conftest.$ac_objext
+then :
   ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+  printf "%s\n" "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_retval=1
@@ -2850,14 +3135,14 @@
 ac_fn_cxx_try_compile ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
+  rm -f conftest.$ac_objext conftest.beam
   if { { ac_try="$ac_compile"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
   (eval "$ac_compile") 2>conftest.err
   ac_status=$?
   if test -s conftest.err; then
@@ -2865,14 +3150,15 @@
     cat conftest.er1 >&5
     mv -f conftest.er1 conftest.err
   fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; } && {
 	 test -z "$ac_cxx_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
+       } && test -s conftest.$ac_objext
+then :
   ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+  printf "%s\n" "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_retval=1
@@ -2882,6 +3168,39 @@
 
 } # ac_fn_cxx_try_compile
 
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  eval "$3=yes"
+else $as_nop
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
 # ac_fn_c_try_cpp LINENO
 # ----------------------
 # Try to preprocess conftest.$ac_ext, and return whether this succeeded.
@@ -2894,7 +3213,7 @@
   *) ac_try_echo=$ac_try;;
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
   ac_status=$?
   if test -s conftest.err; then
@@ -2902,14 +3221,15 @@
     cat conftest.er1 >&5
     mv -f conftest.er1 conftest.err
   fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; } > conftest.i && {
 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       }; then :
+       }
+then :
   ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+  printf "%s\n" "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
     ac_retval=1
@@ -2919,230 +3239,20 @@
 
 } # ac_fn_c_try_cpp
 
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if eval \${$3+:} false; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_header_compiler=yes
-else
-  ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  ac_header_preproc=yes
-else
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
-  yes:no: )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-    ;;
-  no:yes:* )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## -------------------------------- ##
-## Report this to bug-bison@gnu.org ##
-## -------------------------------- ##"
-     ) | sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_mongrel
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-       $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-       ac_retval=$ac_status
-fi
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_run
-
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_compile
-
-# ac_fn_cxx_try_link LINENO
-# -------------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 test -x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_link
-
 # ac_fn_c_try_link LINENO
 # -----------------------
 # Try to link conftest.$ac_ext, and return whether this succeeded.
 ac_fn_c_try_link ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
+  rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
   if { { ac_try="$ac_link"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
   (eval "$ac_link") 2>conftest.err
   ac_status=$?
   if test -s conftest.err; then
@@ -3150,17 +3260,18 @@
     cat conftest.er1 >&5
     mv -f conftest.er1 conftest.err
   fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest$ac_exeext && {
 	 test "$cross_compiling" = yes ||
 	 test -x conftest$ac_exeext
-       }; then :
+       }
+then :
   ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+  printf "%s\n" "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_retval=1
@@ -3175,71 +3286,18 @@
 
 } # ac_fn_c_try_link
 
-# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
-# -------------------------------------------
-# Tests whether TYPE exists after having included INCLUDES, setting cache
-# variable VAR accordingly.
-ac_fn_c_check_type ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=no"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof ($2))
-	 return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof (($2)))
-	    return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  eval "$3=yes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_type
-
 # ac_fn_c_check_func LINENO FUNC VAR
 # ----------------------------------
 # Tests whether FUNC exists, setting the cache variable VAR accordingly
 ac_fn_c_check_func ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 /* Define $2 to an innocuous variant, in case <limits.h> declares $2.
@@ -3247,16 +3305,9 @@
 #define $2 innocuous_$2
 
 /* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $2 (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
+   which can conflict with char $2 (); below.  */
 
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
+#include <limits.h>
 #undef $2
 
 /* Override any GCC internal prototype to avoid an error.
@@ -3274,28 +3325,176 @@
 #endif
 
 int
-main ()
+main (void)
 {
 return $2 ();
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
   eval "$3=yes"
-else
+else $as_nop
   eval "$3=no"
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
 fi
 eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_c_check_func
 
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }
+then :
+  ac_retval=0
+else $as_nop
+  printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  eval "$3=no"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main (void)
+{
+if (sizeof ($2))
+	 return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main (void)
+{
+if (sizeof (($2)))
+	    return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+  eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that
+# executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+then :
+  ac_retval=0
+else $as_nop
+  printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+       printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
 # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
 # --------------------------------------------
 # Tries to find the compile-time value of EXPR in a program that includes
@@ -3310,7 +3509,7 @@
 /* end confdefs.h.  */
 $4
 int
-main ()
+main (void)
 {
 static int test_array [1 - 2 * !(($2) >= 0)];
 test_array [0] = 0;
@@ -3320,14 +3519,15 @@
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   ac_lo=0 ac_mid=0
   while :; do
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 $4
 int
-main ()
+main (void)
 {
 static int test_array [1 - 2 * !(($2) <= $ac_mid)];
 test_array [0] = 0;
@@ -3337,9 +3537,10 @@
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   ac_hi=$ac_mid; break
-else
+else $as_nop
   as_fn_arith $ac_mid + 1 && ac_lo=$as_val
 			if test $ac_lo -le $ac_mid; then
 			  ac_lo= ac_hi=
@@ -3347,14 +3548,14 @@
 			fi
 			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   done
-else
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 $4
 int
-main ()
+main (void)
 {
 static int test_array [1 - 2 * !(($2) < 0)];
 test_array [0] = 0;
@@ -3364,14 +3565,15 @@
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   ac_hi=-1 ac_mid=-1
   while :; do
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 $4
 int
-main ()
+main (void)
 {
 static int test_array [1 - 2 * !(($2) >= $ac_mid)];
 test_array [0] = 0;
@@ -3381,9 +3583,10 @@
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   ac_lo=$ac_mid; break
-else
+else $as_nop
   as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
 			if test $ac_mid -le $ac_hi; then
 			  ac_lo= ac_hi=
@@ -3391,14 +3594,14 @@
 			fi
 			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   done
-else
+else $as_nop
   ac_lo= ac_hi=
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 # Binary search between lo and hi bounds.
 while test "x$ac_lo" != "x$ac_hi"; do
   as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
@@ -3406,7 +3609,7 @@
 /* end confdefs.h.  */
 $4
 int
-main ()
+main (void)
 {
 static int test_array [1 - 2 * !(($2) <= $ac_mid)];
 test_array [0] = 0;
@@ -3416,12 +3619,13 @@
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   ac_hi=$ac_mid
-else
+else $as_nop
   as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 done
 case $ac_lo in #((
 ?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
@@ -3431,12 +3635,12 @@
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 $4
-static long int longval () { return $2; }
-static unsigned long int ulongval () { return $2; }
+static long int longval (void) { return $2; }
+static unsigned long int ulongval (void) { return $2; }
 #include <stdio.h>
 #include <stdlib.h>
 int
-main ()
+main (void)
 {
 
   FILE *f = fopen ("conftest.val", "w");
@@ -3464,9 +3668,10 @@
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+if ac_fn_c_try_run "$LINENO"
+then :
   echo >>conftest.val; read $3 <conftest.val; ac_retval=0
-else
+else $as_nop
   ac_retval=1
 fi
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
@@ -3479,25 +3684,32 @@
 
 } # ac_fn_c_compute_int
 
-# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
-# ---------------------------------------------
+# ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR
+# ------------------------------------------------------------------
 # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
-# accordingly.
-ac_fn_c_check_decl ()
+# accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR.
+ac_fn_check_decl ()
 {
+  ac_save_ac_compile="$ac_compile"
+  if test -n "$ac_compile_for_check_decl"; then
+    ac_compile="$ac_compile_for_check_decl"
+  fi
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
   as_decl_name=`echo $2|sed 's/ *(.*//'`
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+printf %s "checking whether $as_decl_name is declared... " >&6; }
+if eval test \${$3+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
-$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  eval ac_save_FLAGS=\$$6
+  as_fn_append $6 " $5"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 $4
 int
-main ()
+main (void)
 {
 #ifndef $as_decl_name
 #ifdef __cplusplus
@@ -3511,19 +3723,23 @@
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   eval "$3=yes"
-else
+else $as_nop
   eval "$3=no"
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+  eval $6=\$ac_save_FLAGS
+
 fi
 eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  ac_compile="$ac_save_ac_compile"
 
-} # ac_fn_c_check_decl
+} # ac_fn_check_decl
 
 # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
 # ----------------------------------------------------
@@ -3532,16 +3748,17 @@
 ac_fn_c_check_member ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
-$as_echo_n "checking for $2.$3... " >&6; }
-if eval \${$4+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+printf %s "checking for $2.$3... " >&6; }
+if eval test \${$4+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 $5
 int
-main ()
+main (void)
 {
 static $2 ac_aggr;
 if (ac_aggr.$3)
@@ -3550,14 +3767,15 @@
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   eval "$4=yes"
-else
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 $5
 int
-main ()
+main (void)
 {
 static $2 ac_aggr;
 if (sizeof ac_aggr.$3)
@@ -3566,29 +3784,50 @@
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   eval "$4=yes"
-else
+else $as_nop
   eval "$4=no"
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 eval ac_res=\$$4
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_c_check_member
+ac_configure_args_raw=
+for ac_arg
+do
+  case $ac_arg in
+  *\'*)
+    ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+  esac
+  as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+  *$as_nl*)
+    ac_safe_unquote= ;;
+  *)
+    ac_unsafe_z='|&;<>()$`\\"*?[ ''	' # This string ends in space, tab.
+    ac_unsafe_a="$ac_unsafe_z#~"
+    ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+    ac_configure_args_raw=`      printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
 cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by GNU Bison $as_me 3.5, which was
-generated by GNU Autoconf 2.69.  Invocation command line was
+It was created by GNU Bison $as_me 3.8.2, which was
+generated by GNU Autoconf 2.71.  Invocation command line was
 
-  $ $0 $@
+  $ $0$ac_configure_args_raw
 
 _ACEOF
 exec 5>>config.log
@@ -3621,8 +3860,12 @@
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    $as_echo "PATH: $as_dir"
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    printf "%s\n" "PATH: $as_dir"
   done
 IFS=$as_save_IFS
 
@@ -3657,7 +3900,7 @@
     | -silent | --silent | --silen | --sile | --sil)
       continue ;;
     *\'*)
-      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+      ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
     esac
     case $ac_pass in
     1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
@@ -3692,11 +3935,13 @@
 # WARNING: Use '\'' to represent an apostrophe within the trap.
 # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
 trap 'exit_status=$?
+  # Sanitize IFS.
+  IFS=" ""	$as_nl"
   # Save into config.log some information that might help in debugging.
   {
     echo
 
-    $as_echo "## ---------------- ##
+    printf "%s\n" "## ---------------- ##
 ## Cache variables. ##
 ## ---------------- ##"
     echo
@@ -3707,8 +3952,8 @@
     case $ac_val in #(
     *${as_nl}*)
       case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
       esac
       case $ac_var in #(
       _ | IFS | as_nl) ;; #(
@@ -3732,7 +3977,7 @@
 )
     echo
 
-    $as_echo "## ----------------- ##
+    printf "%s\n" "## ----------------- ##
 ## Output variables. ##
 ## ----------------- ##"
     echo
@@ -3740,14 +3985,14 @@
     do
       eval ac_val=\$$ac_var
       case $ac_val in
-      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
       esac
-      $as_echo "$ac_var='\''$ac_val'\''"
+      printf "%s\n" "$ac_var='\''$ac_val'\''"
     done | sort
     echo
 
     if test -n "$ac_subst_files"; then
-      $as_echo "## ------------------- ##
+      printf "%s\n" "## ------------------- ##
 ## File substitutions. ##
 ## ------------------- ##"
       echo
@@ -3755,15 +4000,15 @@
       do
 	eval ac_val=\$$ac_var
 	case $ac_val in
-	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	*\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
 	esac
-	$as_echo "$ac_var='\''$ac_val'\''"
+	printf "%s\n" "$ac_var='\''$ac_val'\''"
       done | sort
       echo
     fi
 
     if test -s confdefs.h; then
-      $as_echo "## ----------- ##
+      printf "%s\n" "## ----------- ##
 ## confdefs.h. ##
 ## ----------- ##"
       echo
@@ -3771,8 +4016,8 @@
       echo
     fi
     test "$ac_signal" != 0 &&
-      $as_echo "$as_me: caught signal $ac_signal"
-    $as_echo "$as_me: exit $exit_status"
+      printf "%s\n" "$as_me: caught signal $ac_signal"
+    printf "%s\n" "$as_me: exit $exit_status"
   } >&5
   rm -f core *.core core.conftest.* &&
     rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
@@ -3786,63 +4031,48 @@
 # confdefs.h avoids OS command line length limits that DEFS can exceed.
 rm -f -r conftest* confdefs.h
 
-$as_echo "/* confdefs.h */" > confdefs.h
+printf "%s\n" "/* confdefs.h */" > confdefs.h
 
 # Predefined preprocessor variables.
 
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
 
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
 
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
 
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
 
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
 
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
 
 
 # Let the site file select an alternate cache file if it wants to.
 # Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
 if test -n "$CONFIG_SITE"; then
-  # We do not want a PATH search for config.site.
-  case $CONFIG_SITE in #((
-    -*)  ac_site_file1=./$CONFIG_SITE;;
-    */*) ac_site_file1=$CONFIG_SITE;;
-    *)   ac_site_file1=./$CONFIG_SITE;;
-  esac
+  ac_site_files="$CONFIG_SITE"
 elif test "x$prefix" != xNONE; then
-  ac_site_file1=$prefix/share/config.site
-  ac_site_file2=$prefix/etc/config.site
+  ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
 else
-  ac_site_file1=$ac_default_prefix/share/config.site
-  ac_site_file2=$ac_default_prefix/etc/config.site
+  ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
 fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+
+for ac_site_file in $ac_site_files
 do
-  test "x$ac_site_file" = xNONE && continue
-  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+  case $ac_site_file in #(
+  */*) :
+     ;; #(
+  *) :
+    ac_site_file=./$ac_site_file ;;
+esac
+  if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
     sed 's/^/| /' "$ac_site_file" >&5
     . "$ac_site_file" \
-      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+      || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "failed to load site script $ac_site_file
 See \`config.log' for more details" "$LINENO" 5; }
   fi
@@ -3852,87 +4082,730 @@
   # Some versions of bash will fail to source /dev/null (special files
   # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
   if test /dev/null != "$cache_file" && test -f "$cache_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
     case $cache_file in
       [\\/]* | ?:[\\/]* ) . "$cache_file";;
       *)                      . "./$cache_file";;
     esac
   fi
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
   >$cache_file
 fi
 
-as_fn_append ac_header_list " locale.h"
-as_fn_append ac_func_list " canonicalize_file_name"
-as_fn_append ac_func_list " getcwd"
-as_fn_append ac_func_list " readlink"
-as_fn_append ac_func_list " realpath"
-as_fn_append ac_header_list " sys/param.h"
-as_fn_append ac_func_list " readlinkat"
-as_fn_append ac_func_list " _set_invalid_parameter_handler"
-as_fn_append ac_header_list " sys/socket.h"
-as_fn_append ac_header_list " unistd.h"
-as_fn_append ac_func_list " fcntl"
-as_fn_append ac_func_list " symlink"
-as_fn_append ac_header_list " stdio_ext.h"
-as_fn_append ac_func_list " vasnprintf"
-as_fn_append ac_header_list " features.h"
-as_fn_append ac_func_list " snprintf"
-as_fn_append ac_func_list " fsync"
-as_fn_append ac_func_list " microuptime"
-as_fn_append ac_func_list " nanouptime"
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+   Do not test the value of __STDC__, because some compilers set it to 0
+   while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh.  */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not \xHH hex character constants.
+   These do not provoke an error unfortunately, instead are silently treated
+   as an "x".  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously \x00 != x always comes out true, for an
+   array size at least.  It is necessary to write \x00 == 0 to get something
+   that is true only with -std.  */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+               int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros.  These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+  int x = 1234;
+  int y = 5678;
+  debug ("Flag");
+  debug ("X = %d\n", x);
+  showlist (The first, second, and third items.);
+  report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+  #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+  #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+  int datasize;
+  double data[];
+};
+
+struct named_init {
+  int number;
+  const wchar_t *name;
+  double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+  // See if C++-style comments work.
+  // Iterate through items via the restricted pointer.
+  // Also check for declarations in for loops.
+  for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+    continue;
+  return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+  va_list args_copy;
+  va_copy (args_copy, args);
+
+  const char *str = "";
+  int number = 0;
+  float fnumber = 0;
+
+  while (*format)
+    {
+      switch (*format++)
+	{
+	case '\''s'\'': // string
+	  str = va_arg (args_copy, const char *);
+	  break;
+	case '\''d'\'': // int
+	  number = va_arg (args_copy, int);
+	  break;
+	case '\''f'\'': // float
+	  fnumber = va_arg (args_copy, double);
+	  break;
+	default:
+	  break;
+	}
+    }
+  va_end (args_copy);
+  va_end (args);
+
+  return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+  // Check bool.
+  _Bool success = false;
+  success |= (argc != 0);
+
+  // Check restrict.
+  if (test_restrict ("String literal") == 0)
+    success = true;
+  char *restrict newvar = "Another string";
+
+  // Check varargs.
+  success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+  test_varargs_macros ();
+
+  // Check flexible array members.
+  struct incomplete_array *ia =
+    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+  ia->datasize = 10;
+  for (int i = 0; i < ia->datasize; ++i)
+    ia->data[i] = i * 1.234;
+
+  // Check named initializers.
+  struct named_init ni = {
+    .number = 34,
+    .name = L"Test wide string",
+    .average = 543.34343,
+  };
+
+  ni.number = 58;
+
+  int dynamic_array[ni.number];
+  dynamic_array[0] = argv[0][0];
+  dynamic_array[ni.number - 1] = 543;
+
+  // work around unused variable warnings
+  ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+	 || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+  int_alignment = _Alignof (int),
+  int_array_alignment = _Alignof (int[100]),
+  char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+  int x;
+  _Static_assert (sizeof (int) <= sizeof (long int),
+                  "_Static_assert does not work in struct");
+  long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+  union {
+    struct { int i; int j; };
+    struct { int k; long int l; } w;
+  };
+  int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+  _Static_assert ((offsetof (struct anonymous, i)
+		   == offsetof (struct anonymous, w.k)),
+		  "Anonymous union alignment botch");
+  v1.i = 2;
+  v1.w.k = 5;
+  ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+  int ok = 0;
+  ${ac_c_conftest_c89_main}
+  ${ac_c_conftest_c99_main}
+  ${ac_c_conftest_c11_main}
+  return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+  int ok = 0;
+  ${ac_c_conftest_c89_main}
+  ${ac_c_conftest_c99_main}
+  return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+  int ok = 0;
+  ${ac_c_conftest_c89_main}
+  return ok;
+}
+"
+
+# Test code for whether the C++ compiler supports C++98 (global declarations)
+ac_cxx_conftest_cxx98_globals='
+// Does the compiler advertise C++98 conformance?
+#if !defined __cplusplus || __cplusplus < 199711L
+# error "Compiler does not advertise C++98 conformance"
+#endif
+
+// These inclusions are to reject old compilers that
+// lack the unsuffixed header files.
+#include <cstdlib>
+#include <exception>
+
+// <cassert> and <cstring> are *not* freestanding headers in C++98.
+extern void assert (int);
+namespace std {
+  extern int strcmp (const char *, const char *);
+}
+
+// Namespaces, exceptions, and templates were all added after "C++ 2.0".
+using std::exception;
+using std::strcmp;
+
+namespace {
+
+void test_exception_syntax()
+{
+  try {
+    throw "test";
+  } catch (const char *s) {
+    // Extra parentheses suppress a warning when building autoconf itself,
+    // due to lint rules shared with more typical C programs.
+    assert (!(strcmp) (s, "test"));
+  }
+}
+
+template <typename T> struct test_template
+{
+  T const val;
+  explicit test_template(T t) : val(t) {}
+  template <typename U> T add(U u) { return static_cast<T>(u) + val; }
+};
+
+} // anonymous namespace
+'
+
+# Test code for whether the C++ compiler supports C++98 (body of main)
+ac_cxx_conftest_cxx98_main='
+  assert (argc);
+  assert (! argv[0]);
+{
+  test_exception_syntax ();
+  test_template<double> tt (2.0);
+  assert (tt.add (4) == 6.0);
+  assert (true && !false);
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (global declarations)
+ac_cxx_conftest_cxx11_globals='
+// Does the compiler advertise C++ 2011 conformance?
+#if !defined __cplusplus || __cplusplus < 201103L
+# error "Compiler does not advertise C++11 conformance"
+#endif
+
+namespace cxx11test
+{
+  constexpr int get_val() { return 20; }
+
+  struct testinit
+  {
+    int i;
+    double d;
+  };
+
+  class delegate
+  {
+  public:
+    delegate(int n) : n(n) {}
+    delegate(): delegate(2354) {}
+
+    virtual int getval() { return this->n; };
+  protected:
+    int n;
+  };
+
+  class overridden : public delegate
+  {
+  public:
+    overridden(int n): delegate(n) {}
+    virtual int getval() override final { return this->n * 2; }
+  };
+
+  class nocopy
+  {
+  public:
+    nocopy(int i): i(i) {}
+    nocopy() = default;
+    nocopy(const nocopy&) = delete;
+    nocopy & operator=(const nocopy&) = delete;
+  private:
+    int i;
+  };
+
+  // for testing lambda expressions
+  template <typename Ret, typename Fn> Ret eval(Fn f, Ret v)
+  {
+    return f(v);
+  }
+
+  // for testing variadic templates and trailing return types
+  template <typename V> auto sum(V first) -> V
+  {
+    return first;
+  }
+  template <typename V, typename... Args> auto sum(V first, Args... rest) -> V
+  {
+    return first + sum(rest...);
+  }
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (body of main)
+ac_cxx_conftest_cxx11_main='
+{
+  // Test auto and decltype
+  auto a1 = 6538;
+  auto a2 = 48573953.4;
+  auto a3 = "String literal";
+
+  int total = 0;
+  for (auto i = a3; *i; ++i) { total += *i; }
+
+  decltype(a2) a4 = 34895.034;
+}
+{
+  // Test constexpr
+  short sa[cxx11test::get_val()] = { 0 };
+}
+{
+  // Test initializer lists
+  cxx11test::testinit il = { 4323, 435234.23544 };
+}
+{
+  // Test range-based for
+  int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3,
+                 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
+  for (auto &x : array) { x += 23; }
+}
+{
+  // Test lambda expressions
+  using cxx11test::eval;
+  assert (eval ([](int x) { return x*2; }, 21) == 42);
+  double d = 2.0;
+  assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0);
+  assert (d == 5.0);
+  assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0);
+  assert (d == 5.0);
+}
+{
+  // Test use of variadic templates
+  using cxx11test::sum;
+  auto a = sum(1);
+  auto b = sum(1, 2);
+  auto c = sum(1.0, 2.0, 3.0);
+}
+{
+  // Test constructor delegation
+  cxx11test::delegate d1;
+  cxx11test::delegate d2();
+  cxx11test::delegate d3(45);
+}
+{
+  // Test override and final
+  cxx11test::overridden o1(55464);
+}
+{
+  // Test nullptr
+  char *c = nullptr;
+}
+{
+  // Test template brackets
+  test_template<::test_template<int>> v(test_template<int>(12));
+}
+{
+  // Unicode literals
+  char const *utf8 = u8"UTF-8 string \u2500";
+  char16_t const *utf16 = u"UTF-8 string \u2500";
+  char32_t const *utf32 = U"UTF-32 string \u2500";
+}
+'
+
+# Test code for whether the C compiler supports C++11 (complete).
+ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals}
+${ac_cxx_conftest_cxx11_globals}
+
+int
+main (int argc, char **argv)
+{
+  int ok = 0;
+  ${ac_cxx_conftest_cxx98_main}
+  ${ac_cxx_conftest_cxx11_main}
+  return ok;
+}
+"
+
+# Test code for whether the C compiler supports C++98 (complete).
+ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals}
+int
+main (int argc, char **argv)
+{
+  int ok = 0;
+  ${ac_cxx_conftest_cxx98_main}
+  return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H"
+as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H"
+gl_libtextstyle_minversion="$gl_libtextstyle_minversion 0.20.5 "
+as_fn_append ac_func_c_list " tcdrain HAVE_TCDRAIN"
+as_fn_append ac_header_c_list " locale.h locale_h HAVE_LOCALE_H"
+as_fn_append ac_func_c_list " canonicalize_file_name HAVE_CANONICALIZE_FILE_NAME"
+as_fn_append ac_func_c_list " faccessat HAVE_FACCESSAT"
+as_fn_append ac_func_c_list " realpath HAVE_REALPATH"
+as_fn_append ac_func_c_list " lstat HAVE_LSTAT"
+as_fn_append ac_header_c_list " sys/param.h sys_param_h HAVE_SYS_PARAM_H"
+as_fn_append ac_func_c_list " readlinkat HAVE_READLINKAT"
+as_fn_append ac_func_c_list " _set_invalid_parameter_handler HAVE__SET_INVALID_PARAMETER_HANDLER"
+as_fn_append ac_header_c_list " sys/socket.h sys_socket_h HAVE_SYS_SOCKET_H"
+as_fn_append ac_func_c_list " fchdir HAVE_FCHDIR"
+as_fn_append ac_func_c_list " fcntl HAVE_FCNTL"
+as_fn_append ac_func_c_list " symlink HAVE_SYMLINK"
+as_fn_append ac_func_c_list " ffsl HAVE_FFSL"
+as_fn_append ac_header_c_list " stdio_ext.h stdio_ext_h HAVE_STDIO_EXT_H"
+as_fn_append ac_func_c_list " vasnprintf HAVE_VASNPRINTF"
+as_fn_append ac_header_c_list " features.h features_h HAVE_FEATURES_H"
+as_fn_append ac_func_c_list " snprintf HAVE_SNPRINTF"
+as_fn_append ac_func_c_list " fsync HAVE_FSYNC"
+as_fn_append ac_func_c_list " microuptime HAVE_MICROUPTIME"
+as_fn_append ac_func_c_list " nanouptime HAVE_NANOUPTIME"
 gl_getopt_required=GNU
-as_fn_append ac_header_list " getopt.h"
-as_fn_append ac_header_list " sys/cdefs.h"
-as_fn_append ac_func_list " getprogname"
-as_fn_append ac_func_list " getexecname"
-as_fn_append ac_func_list " getrusage"
-as_fn_append ac_func_list " gettimeofday"
-as_fn_append ac_header_list " sys/time.h"
-as_fn_append ac_header_list " limits.h"
-as_fn_append ac_header_list " wchar.h"
-as_fn_append ac_header_list " stdint.h"
-as_fn_append ac_header_list " inttypes.h"
-as_fn_append ac_func_list " iswcntrl"
-as_fn_append ac_header_list " crtdefs.h"
-as_fn_append ac_header_list " wctype.h"
-as_fn_append ac_func_list " iswblank"
-as_fn_append ac_func_list " tcdrain"
-as_fn_append ac_header_list " threads.h"
-as_fn_append ac_header_list " math.h"
-as_fn_append ac_func_list " mbsinit"
-as_fn_append ac_func_list " mbrtowc"
-as_fn_append ac_func_list " isascii"
-as_fn_append ac_header_list " sys/mman.h"
-as_fn_append ac_func_list " mprotect"
-as_fn_append ac_func_list " obstack_printf"
-as_fn_append ac_func_list " lstat"
-as_fn_append ac_func_list " strerror_r"
-as_fn_append ac_func_list " __xpg_strerror_r"
-as_fn_append ac_func_list " pipe2"
+as_fn_append ac_header_c_list " getopt.h getopt_h HAVE_GETOPT_H"
+as_fn_append ac_header_c_list " sys/cdefs.h sys_cdefs_h HAVE_SYS_CDEFS_H"
+as_fn_append ac_func_c_list " getprogname HAVE_GETPROGNAME"
+as_fn_append ac_func_c_list " getexecname HAVE_GETEXECNAME"
+as_fn_append ac_func_c_list " getrusage HAVE_GETRUSAGE"
+as_fn_append ac_func_c_list " gettimeofday HAVE_GETTIMEOFDAY"
+as_fn_append ac_header_c_list " sys/time.h sys_time_h HAVE_SYS_TIME_H"
+as_fn_append ac_header_c_list " iconv.h iconv_h HAVE_ICONV_H"
+as_fn_append ac_header_c_list " limits.h limits_h HAVE_LIMITS_H"
+as_fn_append ac_func_c_list " iswcntrl HAVE_ISWCNTRL"
+as_fn_append ac_header_c_list " crtdefs.h crtdefs_h HAVE_CRTDEFS_H"
+as_fn_append ac_header_c_list " wctype.h wctype_h HAVE_WCTYPE_H"
+as_fn_append ac_func_c_list " iswblank HAVE_ISWBLANK"
+as_fn_append ac_header_c_list " threads.h threads_h HAVE_THREADS_H"
+as_fn_append ac_header_c_list " math.h math_h HAVE_MATH_H"
+as_fn_append ac_func_c_list " mbsinit HAVE_MBSINIT"
+as_fn_append ac_func_c_list " mbrtowc HAVE_MBRTOWC"
+as_fn_append ac_func_c_list " isascii HAVE_ISASCII"
+as_fn_append ac_header_c_list " sys/mman.h sys_mman_h HAVE_SYS_MMAN_H"
+as_fn_append ac_func_c_list " mprotect HAVE_MPROTECT"
+as_fn_append ac_func_c_list " obstack_printf HAVE_OBSTACK_PRINTF"
+as_fn_append ac_func_c_list " strerror_r HAVE_STRERROR_R"
+as_fn_append ac_func_c_list " __xpg_strerror_r HAVE___XPG_STRERROR_R"
+as_fn_append ac_func_c_list " pipe HAVE_PIPE"
+as_fn_append ac_func_c_list " pipe2 HAVE_PIPE2"
+as_fn_append ac_func_c_list " posix_spawn_file_actions_addchdir_np HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR_NP"
+as_fn_append ac_func_c_list " posix_spawn_file_actions_addchdir HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR"
 gl_printf_safe=yes
-as_fn_append ac_func_list " setenv"
-as_fn_append ac_func_list " link"
-as_fn_append ac_func_list " sigaction"
-as_fn_append ac_func_list " sigaltstack"
-as_fn_append ac_func_list " siginterrupt"
-as_fn_append ac_header_list " spawn.h"
-as_fn_append ac_func_list " strdup"
-as_fn_append ac_func_list " strndup"
-as_fn_append ac_header_list " sys/resource.h"
-as_fn_append ac_header_list " sys/times.h"
-as_fn_append ac_header_list " sys/wait.h"
-as_fn_append ac_func_list " pipe"
-as_fn_append ac_func_list " wcwidth"
-as_fn_append ac_func_list " __fseterr"
-as_fn_append ac_header_list " sys/stat.h"
-as_fn_append ac_func_list " getdtablesize"
-as_fn_append ac_func_list " catgets"
-as_fn_append ac_func_list " setlocale"
+as_fn_append ac_func_c_list " readlink HAVE_READLINK"
+as_fn_append ac_func_c_list " setenv HAVE_SETENV"
+as_fn_append ac_func_c_list " link HAVE_LINK"
+as_fn_append ac_func_c_list " sigaction HAVE_SIGACTION"
+as_fn_append ac_func_c_list " sigaltstack HAVE_SIGALTSTACK"
+as_fn_append ac_func_c_list " siginterrupt HAVE_SIGINTERRUPT"
+as_fn_append ac_header_c_list " spawn.h spawn_h HAVE_SPAWN_H"
+as_fn_append ac_func_c_list " stpncpy HAVE_STPNCPY"
+as_fn_append ac_func_c_list " strndup HAVE_STRNDUP"
+as_fn_append ac_header_c_list " sys/ioctl.h sys_ioctl_h HAVE_SYS_IOCTL_H"
+as_fn_append ac_header_c_list " sys/resource.h sys_resource_h HAVE_SYS_RESOURCE_H"
+as_fn_append ac_header_c_list " sys/times.h sys_times_h HAVE_SYS_TIMES_H"
+as_fn_append ac_header_c_list " sys/wait.h sys_wait_h HAVE_SYS_WAIT_H"
+as_fn_append ac_header_c_list " termios.h termios_h HAVE_TERMIOS_H"
+as_fn_append ac_func_c_list " wcwidth HAVE_WCWIDTH"
+as_fn_append ac_header_c_list " dirent.h dirent_h HAVE_DIRENT_H"
+as_fn_append ac_func_c_list " fdopendir HAVE_FDOPENDIR"
+as_fn_append ac_func_c_list " mempcpy HAVE_MEMPCPY"
+as_fn_append ac_func_c_list " __fseterr HAVE___FSETERR"
+as_fn_append ac_func_c_list " fstatat HAVE_FSTATAT"
+as_fn_append ac_func_c_list " getdelim HAVE_GETDELIM"
+as_fn_append ac_func_c_list " getdtablesize HAVE_GETDTABLESIZE"
+as_fn_append ac_header_c_list " xlocale.h xlocale_h HAVE_XLOCALE_H"
+as_fn_append ac_func_c_list " openat HAVE_OPENAT"
+as_fn_append ac_func_c_list " catgets HAVE_CATGETS"
+as_fn_append ac_func_c_list " setlocale HAVE_SETLOCALE"
 gt_needs="$gt_needs need-ngettext"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="config.rpath config.guess config.sub compile missing install-sh"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${srcdir}/build-aux"
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+  as_found=:
+
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}:  trying $as_dir" >&5
+  ac_aux_dir_found=yes
+  ac_install_sh=
+  for ac_aux in $ac_aux_files
+  do
+    # As a special case, if "install-sh" is required, that requirement
+    # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+    # and $ac_install_sh is set appropriately for whichever one is found.
+    if test x"$ac_aux" = x"install-sh"
+    then
+      if test -f "${as_dir}install-sh"; then
+        printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ${as_dir}install-sh found" >&5
+        ac_install_sh="${as_dir}install-sh -c"
+      elif test -f "${as_dir}install.sh"; then
+        printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ${as_dir}install.sh found" >&5
+        ac_install_sh="${as_dir}install.sh -c"
+      elif test -f "${as_dir}shtool"; then
+        printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ${as_dir}shtool found" >&5
+        ac_install_sh="${as_dir}shtool install -c"
+      else
+        ac_aux_dir_found=no
+        if $ac_first_candidate; then
+          ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+        else
+          break
+        fi
+      fi
+    else
+      if test -f "${as_dir}${ac_aux}"; then
+        printf "%s\n" "$as_me:${as_lineno-$LINENO}:   ${as_dir}${ac_aux} found" >&5
+      else
+        ac_aux_dir_found=no
+        if $ac_first_candidate; then
+          ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+        else
+          break
+        fi
+      fi
+    fi
+  done
+  if test "$ac_aux_dir_found" = yes; then
+    ac_aux_dir="$as_dir"
+    break
+  fi
+  ac_first_candidate=false
+
+  as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+  as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+  ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+  ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+  ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
 # Check that the precious variables saved in the cache have kept the same
 # value.
 ac_cache_corrupted=false
@@ -3943,12 +4816,12 @@
   eval ac_new_val=\$ac_env_${ac_var}_value
   case $ac_old_set,$ac_new_set in
     set,)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
       ac_cache_corrupted=: ;;
     ,set)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
       ac_cache_corrupted=: ;;
     ,);;
     *)
@@ -3957,24 +4830,24 @@
 	ac_old_val_w=`echo x $ac_old_val`
 	ac_new_val_w=`echo x $ac_new_val`
 	if test "$ac_old_val_w" != "$ac_new_val_w"; then
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
 	  ac_cache_corrupted=:
 	else
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
 	  eval $ac_var=\$ac_old_val
 	fi
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
-$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
-$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+printf "%s\n" "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me:   current value: \`$ac_new_val'" >&2;}
       fi;;
   esac
   # Pass precious variables to config.status.
   if test "$ac_new_set" = set; then
     case $ac_new_val in
-    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
     *) ac_arg=$ac_var=$ac_new_val ;;
     esac
     case " $ac_configure_args " in
@@ -3984,11 +4857,12 @@
   fi
 done
 if $ac_cache_corrupted; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+	    and start over" "$LINENO" 5
 fi
 ## -------------------- ##
 ## Main body of script. ##
@@ -4001,49 +4875,17 @@
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-PACKAGE_COPYRIGHT_YEAR=2019
+PACKAGE_COPYRIGHT_YEAR=2021
 
 
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_COPYRIGHT_YEAR $PACKAGE_COPYRIGHT_YEAR
-_ACEOF
-
-
-ac_aux_dir=
-for ac_dir in build-aux "$srcdir"/build-aux; do
-  if test -f "$ac_dir/install-sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f "$ac_dir/install.sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  elif test -f "$ac_dir/shtool"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/shtool install -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
-  as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+printf "%s\n" "#define PACKAGE_COPYRIGHT_YEAR $PACKAGE_COPYRIGHT_YEAR" >>confdefs.h
 
 
 
 
-# We use Automake 1.14's %D% and %C%.
-#
+
 # When we move to Automake 1.16, simplify examples/c/reccalc/local.mk.
-# Our CI runs on Xenial, which has only Automake 1.15.
+# Our CI build the packages on Bionic, which has only Automake 1.15.
 #
 # We want gnits strictness only when rolling a stable release.  For
 # release candidates, we use version strings like 2.4.3_rc1, but gnits
@@ -4053,7 +4895,9 @@
 # automatically contains a dash, which we also let disable gnits.
 am__api_version='1.16'
 
-# Find a good install program.  We prefer a C program (faster),
+
+
+  # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
 # incompatible versions:
 # SysV /etc/install, /usr/sbin/install
@@ -4067,20 +4911,25 @@
 # OS/2's system install, which has a completely different semantic
 # ./install, which can be erroneously created by make from ./install.sh.
 # Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+printf %s "checking for a BSD-compatible install... " >&6; }
 if test -z "$INSTALL"; then
-if ${ac_cv_path_install+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+if test ${ac_cv_path_install+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
-  ./ | .// | /[cC]/* | \
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    # Account for fact that we put trailing slashes in our PATH walk.
+case $as_dir in #((
+  ./ | /[cC]/* | \
   /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
   ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
   /usr/ucb/* ) ;;
@@ -4090,13 +4939,13 @@
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-	if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then
 	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
 	    # AIX install.  It has an incompatible calling convention.
 	    :
 	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
 	    # program-specific install script used by HP pwplus--don't use.
 	    :
 	  else
@@ -4104,12 +4953,12 @@
 	    echo one > conftest.one
 	    echo two > conftest.two
 	    mkdir conftest.dir
-	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	    if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" &&
 	      test -s conftest.one && test -s conftest.two &&
 	      test -s conftest.dir/conftest.one &&
 	      test -s conftest.dir/conftest.two
 	    then
-	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c"
 	      break 3
 	    fi
 	  fi
@@ -4125,7 +4974,7 @@
 rm -rf conftest.one conftest.two conftest.dir
 
 fi
-  if test "${ac_cv_path_install+set}" = set; then
+  if test ${ac_cv_path_install+y}; then
     INSTALL=$ac_cv_path_install
   else
     # As a last resort, use the slow shell script.  Don't cache a
@@ -4135,8 +4984,8 @@
     INSTALL=$ac_install_sh
   fi
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+printf "%s\n" "$INSTALL" >&6; }
 
 # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
 # It thinks the first close brace ends the variable substitution.
@@ -4146,8 +4995,8 @@
 
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
-$as_echo_n "checking whether build environment is sane... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+printf %s "checking whether build environment is sane... " >&6; }
 # Reject unsafe characters in $srcdir or the absolute working directory
 # name.  Accept space and tab only in the latter.
 am_lf='
@@ -4201,8 +5050,8 @@
    as_fn_error $? "newly created file is older than distributed files!
 Check your system clock" "$LINENO" 5
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
 # If we didn't sleep, we still need to ensure time stamps of config.status and
 # generated files are strictly newer.
 am_sleep_pid=
@@ -4221,26 +5070,23 @@
 # Double any \ or $.
 # By default was `s,x,x', remove it if useless.
 ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
-program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"`
+
 
 # Expand $ac_aux_dir to an absolute path.
 am_aux_dir=`cd "$ac_aux_dir" && pwd`
 
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
+
+  if test x"${MISSING+set}" != xset; then
+  MISSING="\${SHELL} '$am_aux_dir/missing'"
 fi
 # Use eval to expand $SHELL
 if eval "$MISSING --is-lightweight"; then
   am_missing_run="$MISSING "
 else
   am_missing_run=
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
 fi
 
 if test x"${install_sh+set}" != xset; then
@@ -4260,11 +5106,12 @@
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
 set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_STRIP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$STRIP"; then
   ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
 else
@@ -4272,11 +5119,15 @@
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -4287,11 +5138,11 @@
 fi
 STRIP=$ac_cv_prog_STRIP
 if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -4300,11 +5151,12 @@
   ac_ct_STRIP=$STRIP
   # Extract the first word of "strip", so it can be a program name with args.
 set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$ac_ct_STRIP"; then
   ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
 else
@@ -4312,11 +5164,15 @@
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -4327,11 +5183,11 @@
 fi
 ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
 if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
   if test "x$ac_ct_STRIP" = x; then
@@ -4339,8 +5195,8 @@
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     STRIP=$ac_ct_STRIP
@@ -4352,25 +5208,31 @@
 fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
-$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5
+printf %s "checking for a race-free mkdir -p... " >&6; }
 if test -z "$MKDIR_P"; then
-  if ${ac_cv_path_mkdir+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  if test ${ac_cv_path_mkdir+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_prog in mkdir gmkdir; do
 	 for ac_exec_ext in '' $ac_executable_extensions; do
-	   as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
-	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
-	     'mkdir (GNU coreutils) '* | \
-	     'mkdir (coreutils) '* | \
+	   as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue
+	   case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir ('*'coreutils) '* | \
+	     'BusyBox '* | \
 	     'mkdir (fileutils) '4.1*)
-	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext
 	       break 3;;
 	   esac
 	 done
@@ -4381,7 +5243,7 @@
 fi
 
   test -d ./--version && rmdir ./--version
-  if test "${ac_cv_path_mkdir+set}" = set; then
+  if test ${ac_cv_path_mkdir+y}; then
     MKDIR_P="$ac_cv_path_mkdir -p"
   else
     # As a last resort, use the slow shell script.  Don't cache a
@@ -4391,18 +5253,19 @@
     MKDIR_P="$ac_install_sh -d"
   fi
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
-$as_echo "$MKDIR_P" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+printf "%s\n" "$MKDIR_P" >&6; }
 
 for ac_prog in gawk mawk nawk awk
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AWK+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AWK+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$AWK"; then
   ac_cv_prog_AWK="$AWK" # Let the user override the test.
 else
@@ -4410,11 +5273,15 @@
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_AWK="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -4425,24 +5292,25 @@
 fi
 AWK=$ac_cv_prog_AWK
 if test -n "$AWK"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+printf "%s\n" "$AWK" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
   test -n "$AWK" && break
 done
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
 set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval test \${ac_cv_prog_make_${ac_make}_set+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat >conftest.make <<\_ACEOF
 SHELL = /bin/sh
 all:
@@ -4458,12 +5326,12 @@
 rm -f conftest.make
 fi
 if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
   SET_MAKE=
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
   SET_MAKE="MAKE=${MAKE-make}"
 fi
 
@@ -4477,7 +5345,8 @@
 rmdir .tst 2>/dev/null
 
 # Check whether --enable-silent-rules was given.
-if test "${enable_silent_rules+set}" = set; then :
+if test ${enable_silent_rules+y}
+then :
   enableval=$enable_silent_rules;
 fi
 
@@ -4487,12 +5356,13 @@
     *) AM_DEFAULT_VERBOSITY=1;;
 esac
 am_make=${MAKE-make}
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
-$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
-if ${am_cv_make_support_nested_variables+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if $as_echo 'TRUE=$(BAR$(V))
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+printf %s "checking whether $am_make supports nested variables... " >&6; }
+if test ${am_cv_make_support_nested_variables+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if printf "%s\n" 'TRUE=$(BAR$(V))
 BAR0=false
 BAR1=true
 V=1
@@ -4504,8 +5374,8 @@
   am_cv_make_support_nested_variables=no
 fi
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
-$as_echo "$am_cv_make_support_nested_variables" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+printf "%s\n" "$am_cv_make_support_nested_variables" >&6; }
 if test $am_cv_make_support_nested_variables = yes; then
     AM_V='$(V)'
   AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
@@ -4537,17 +5407,13 @@
 
 # Define the identity of the package.
  PACKAGE='bison'
- VERSION='3.5'
+ VERSION='3.8.2'
 
 
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
+printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
 
 
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
+printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h
 
 # Some tools Automake needs.
 
@@ -4587,6 +5453,20 @@
 
 
 
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+  CTAGS=ctags
+fi
+
+if test -z "$ETAGS"; then
+  ETAGS=etags
+fi
+
+if test -z "$CSCOPE"; then
+  CSCOPE=cscope
+fi
+
+
 
 # POSIX will say in a future version that running "rm -f" with no argument
 # is OK; and we want to be able to make that assumption in our Makefile
@@ -4631,7 +5511,8 @@
 fi
 
 # Check whether --enable-silent-rules was given.
-if test "${enable_silent_rules+set}" = set; then :
+if test ${enable_silent_rules+y}
+then :
   enableval=$enable_silent_rules;
 fi
 
@@ -4641,12 +5522,13 @@
     *) AM_DEFAULT_VERBOSITY=0;;
 esac
 am_make=${MAKE-make}
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
-$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
-if ${am_cv_make_support_nested_variables+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if $as_echo 'TRUE=$(BAR$(V))
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+printf %s "checking whether $am_make supports nested variables... " >&6; }
+if test ${am_cv_make_support_nested_variables+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if printf "%s\n" 'TRUE=$(BAR$(V))
 BAR0=false
 BAR1=true
 V=1
@@ -4658,8 +5540,8 @@
   am_cv_make_support_nested_variables=no
 fi
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
-$as_echo "$am_cv_make_support_nested_variables" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+printf "%s\n" "$am_cv_make_support_nested_variables" >&6; }
 if test $am_cv_make_support_nested_variables = yes; then
     AM_V='$(V)'
   AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
@@ -4673,12 +5555,1145 @@
 
 
 # Checks for the compiler.
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}clang"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="clang"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion -version; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else $as_nop
+  ac_file=''
+fi
+if test -z "$ac_file"
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else $as_nop
+  { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main (void)
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else $as_nop
+  printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_compiler_gnu=yes
+else $as_nop
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+y}
+ac_save_CFLAGS=$CFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_prog_cc_g=yes
+else $as_nop
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_cv_prog_cc_c11=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+  test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+  if test "x$ac_cv_prog_cc_c11" = x
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+     CC="$CC $ac_cv_prog_cc_c11"
+fi
+  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+  ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+  test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+  if test "x$ac_cv_prog_cc_c99" = x
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+     CC="$CC $ac_cv_prog_cc_c99"
+fi
+  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+  ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_c_conftest_c89_program
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+  if test "x$ac_cv_prog_cc_c89" = x
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+     CC="$CC $ac_cv_prog_cc_c89"
+fi
+  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+  ac_prog_cc_stdc=c89
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+printf %s "checking whether $CC understands -c and -o together... " >&6; }
+if test ${am_cv_prog_cc_c_o+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+printf "%s\n" "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler is clang" >&5
+printf %s "checking whether the compiler is clang... " >&6; }
+if test ${gl_cv_compiler_clang+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+                 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+           #ifdef __clang__
+           barfbarf
+           #endif
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_compiler_clang=no
+else $as_nop
+  gl_cv_compiler_clang=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_clang" >&5
+printf "%s\n" "$gl_cv_compiler_clang" >&6; }
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler option needed when checking for declarations" >&5
+printf %s "checking for compiler option needed when checking for declarations... " >&6; }
+if test ${gl_cv_compiler_check_decl_option+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test $gl_cv_compiler_clang = yes; then
+                     save_ac_compile="$ac_compile"
+       ac_compile="$ac_compile -Werror=implicit-function-declaration"
+                     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration'
+else $as_nop
+  gl_cv_compiler_check_decl_option=none
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+       ac_compile="$save_ac_compile"
+     else
+       gl_cv_compiler_check_decl_option=none
+     fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_check_decl_option" >&5
+printf "%s\n" "$gl_cv_compiler_check_decl_option" >&6; }
+  if test "x$gl_cv_compiler_check_decl_option" != xnone; then
+    ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option"
+  else
+    ac_compile_for_check_decl="$ac_compile"
+  fi
+
 DEPDIR="${am__leading_dot}deps"
 
 ac_config_commands="$ac_config_commands depfiles"
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
-$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; }
 cat > confinc.mk << 'END'
 am__doit:
 	@echo this is the am__doit target >confinc.out
@@ -4714,11 +6729,12 @@
   fi
 done
 rm -f confinc.* confmf.*
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
-$as_echo "${_am_result}" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+printf "%s\n" "${_am_result}" >&6; }
 
 # Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
+if test ${enable_dependency_tracking+y}
+then :
   enableval=$enable_dependency_tracking;
 fi
 
@@ -4736,1318 +6752,15 @@
 fi
 
 
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-          if test -n "$ac_tool_prefix"; then
-    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  fi
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl.exe
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl.exe
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CC" && break
-done
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-fi
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
-set dummy ${ac_tool_prefix}clang; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}clang"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "clang", so it can be a program name with args.
-set dummy clang; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="clang"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion -version; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-  fi
-  rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
-  esac
-done
-rm -f $ac_rmfiles
-
-if { { ac_try="$ac_link_default"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link_default") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile.  We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
-	then :; else
-	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	fi
-	# We set ac_cv_exeext here because the later test for it is not
-	# safe: cross compilers may not add the suffix if given an `-o'
-	# argument, so we may need to know it at that point already.
-	# Even if this section looks crufty: it has the advantage of
-	# actually working.
-	break;;
-    * )
-	break;;
-  esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
-  ac_file=''
-fi
-if test -z "$ac_file"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "C compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-ac_exeext=$ac_cv_exeext
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-FILE *f = fopen ("conftest.out", "w");
- return ferror (f) || fclose (f) != 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files="$ac_clean_files conftest.out"
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-if test "$cross_compiling" != yes; then
-  { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-  if { ac_try='./conftest$ac_cv_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5; }
-    fi
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  for ac_file in conftest.o conftest.obj conftest.*; do
-  test -f "$ac_file" || continue;
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GCC=yes
-else
-  GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_c_werror_flag=$ac_c_werror_flag
-   ac_c_werror_flag=yes
-   ac_cv_prog_cc_g=no
-   CFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-else
-  CFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  ac_c_werror_flag=$ac_save_c_werror_flag
-	 CFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
-$as_echo_n "checking for $CC option to enable C11 features... " >&6; }
-if ${ac_cv_prog_cc_c11+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cc_c11=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <wchar.h>
-#include <stdio.h>
-
-// Check varargs macros.  These examples are taken from C99 6.10.3.5.
-#define debug(...) fprintf (stderr, __VA_ARGS__)
-#define showlist(...) puts (#__VA_ARGS__)
-#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
-static void
-test_varargs_macros (void)
-{
-  int x = 1234;
-  int y = 5678;
-  debug ("Flag");
-  debug ("X = %d\n", x);
-  showlist (The first, second, and third items.);
-  report (x>y, "x is %d but y is %d", x, y);
-}
-
-// Check long long types.
-#define BIG64 18446744073709551615ull
-#define BIG32 4294967295ul
-#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
-#if !BIG_OK
-  your preprocessor is broken;
-#endif
-#if BIG_OK
-#else
-  your preprocessor is broken;
-#endif
-static long long int bignum = -9223372036854775807LL;
-static unsigned long long int ubignum = BIG64;
-
-struct incomplete_array
-{
-  int datasize;
-  double data[];
-};
-
-struct named_init {
-  int number;
-  const wchar_t *name;
-  double average;
-};
-
-typedef const char *ccp;
-
-static inline int
-test_restrict (ccp restrict text)
-{
-  // See if C++-style comments work.
-  // Iterate through items via the restricted pointer.
-  // Also check for declarations in for loops.
-  for (unsigned int i = 0; *(text+i) != '\0'; ++i)
-    continue;
-  return 0;
-}
-
-// Check varargs and va_copy.
-static bool
-test_varargs (const char *format, ...)
-{
-  va_list args;
-  va_start (args, format);
-  va_list args_copy;
-  va_copy (args_copy, args);
-
-  const char *str = "";
-  int number = 0;
-  float fnumber = 0;
-
-  while (*format)
-    {
-      switch (*format++)
-	{
-	case 's': // string
-	  str = va_arg (args_copy, const char *);
-	  break;
-	case 'd': // int
-	  number = va_arg (args_copy, int);
-	  break;
-	case 'f': // float
-	  fnumber = va_arg (args_copy, double);
-	  break;
-	default:
-	  break;
-	}
-    }
-  va_end (args_copy);
-  va_end (args);
-
-  return *str && number && fnumber;
-}
-// Check _Alignas.
-char _Alignas (double) aligned_as_double;
-char _Alignas (0) no_special_alignment;
-extern char aligned_as_int;
-char _Alignas (0) _Alignas (int) aligned_as_int;
-
-// Check _Alignof.
-enum
-{
-  int_alignment = _Alignof (int),
-  int_array_alignment = _Alignof (int[100]),
-  char_alignment = _Alignof (char)
-};
-_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
-
-// Check _Noreturn.
-int _Noreturn does_not_return (void) { for (;;) continue; }
-
-// Check _Static_assert.
-struct test_static_assert
-{
-  int x;
-  _Static_assert (sizeof (int) <= sizeof (long int),
-                  "_Static_assert does not work in struct");
-  long int y;
-};
-
-// Check UTF-8 literals.
-#define u8 syntax error!
-char const utf8_literal[] = u8"happens to be ASCII" "another string";
-
-// Check duplicate typedefs.
-typedef long *long_ptr;
-typedef long int *long_ptr;
-typedef long_ptr long_ptr;
-
-// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
-struct anonymous
-{
-  union {
-    struct { int i; int j; };
-    struct { int k; long int l; } w;
-  };
-  int m;
-} v1;
-
-int
-main ()
-{
-
-  // Check bool.
-  _Bool success = false;
-
-  // Check restrict.
-  if (test_restrict ("String literal") == 0)
-    success = true;
-  char *restrict newvar = "Another string";
-
-  // Check varargs.
-  success &= test_varargs ("s, d' f .", "string", 65, 34.234);
-  test_varargs_macros ();
-
-  // Check flexible array members.
-  struct incomplete_array *ia =
-    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
-  ia->datasize = 10;
-  for (int i = 0; i < ia->datasize; ++i)
-    ia->data[i] = i * 1.234;
-
-  // Check named initializers.
-  struct named_init ni = {
-    .number = 34,
-    .name = L"Test wide string",
-    .average = 543.34343,
-  };
-
-  ni.number = 58;
-
-  int dynamic_array[ni.number];
-  dynamic_array[ni.number - 1] = 543;
-
-  // work around unused variable warnings
-  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
-	  || dynamic_array[ni.number - 1] != 543);
-
-  v1.i = 2;
-  v1.w.k = 5;
-  _Static_assert ((offsetof (struct anonymous, i)
-		   == offsetof (struct anonymous, w.k)),
-		  "Anonymous union alignment botch");
-
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -std=gnu11
-do
-  CC="$ac_save_CC $ac_arg"
-  if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_c11=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c11" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-ac_prog_cc_stdc_options=
-case "x$ac_cv_prog_cc_c11" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c11"
-    CC=$CC$ac_prog_cc_stdc_options
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
-$as_echo "$ac_cv_prog_cc_c11" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c11" != xno; then :
-  ac_prog_cc_stdc=c11
-		 ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
-$as_echo_n "checking for $CC option to enable C99 features... " >&6; }
-if ${ac_cv_prog_cc_c99+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cc_c99=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <wchar.h>
-#include <stdio.h>
-
-// Check varargs macros.  These examples are taken from C99 6.10.3.5.
-#define debug(...) fprintf (stderr, __VA_ARGS__)
-#define showlist(...) puts (#__VA_ARGS__)
-#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
-static void
-test_varargs_macros (void)
-{
-  int x = 1234;
-  int y = 5678;
-  debug ("Flag");
-  debug ("X = %d\n", x);
-  showlist (The first, second, and third items.);
-  report (x>y, "x is %d but y is %d", x, y);
-}
-
-// Check long long types.
-#define BIG64 18446744073709551615ull
-#define BIG32 4294967295ul
-#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
-#if !BIG_OK
-  your preprocessor is broken;
-#endif
-#if BIG_OK
-#else
-  your preprocessor is broken;
-#endif
-static long long int bignum = -9223372036854775807LL;
-static unsigned long long int ubignum = BIG64;
-
-struct incomplete_array
-{
-  int datasize;
-  double data[];
-};
-
-struct named_init {
-  int number;
-  const wchar_t *name;
-  double average;
-};
-
-typedef const char *ccp;
-
-static inline int
-test_restrict (ccp restrict text)
-{
-  // See if C++-style comments work.
-  // Iterate through items via the restricted pointer.
-  // Also check for declarations in for loops.
-  for (unsigned int i = 0; *(text+i) != '\0'; ++i)
-    continue;
-  return 0;
-}
-
-// Check varargs and va_copy.
-static bool
-test_varargs (const char *format, ...)
-{
-  va_list args;
-  va_start (args, format);
-  va_list args_copy;
-  va_copy (args_copy, args);
-
-  const char *str = "";
-  int number = 0;
-  float fnumber = 0;
-
-  while (*format)
-    {
-      switch (*format++)
-	{
-	case 's': // string
-	  str = va_arg (args_copy, const char *);
-	  break;
-	case 'd': // int
-	  number = va_arg (args_copy, int);
-	  break;
-	case 'f': // float
-	  fnumber = va_arg (args_copy, double);
-	  break;
-	default:
-	  break;
-	}
-    }
-  va_end (args_copy);
-  va_end (args);
-
-  return *str && number && fnumber;
-}
-int
-main ()
-{
-
-  // Check bool.
-  _Bool success = false;
-
-  // Check restrict.
-  if (test_restrict ("String literal") == 0)
-    success = true;
-  char *restrict newvar = "Another string";
-
-  // Check varargs.
-  success &= test_varargs ("s, d' f .", "string", 65, 34.234);
-  test_varargs_macros ();
-
-  // Check flexible array members.
-  struct incomplete_array *ia =
-    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
-  ia->datasize = 10;
-  for (int i = 0; i < ia->datasize; ++i)
-    ia->data[i] = i * 1.234;
-
-  // Check named initializers.
-  struct named_init ni = {
-    .number = 34,
-    .name = L"Test wide string",
-    .average = 543.34343,
-  };
-
-  ni.number = 58;
-
-  int dynamic_array[ni.number];
-  dynamic_array[ni.number - 1] = 543;
-
-  // work around unused variable warnings
-  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
-	  || dynamic_array[ni.number - 1] != 543);
-
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc1x -qlanglvl=extc99
-do
-  CC="$ac_save_CC $ac_arg"
-  if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_c99=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c99" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-ac_prog_cc_stdc_options=
-case "x$ac_cv_prog_cc_c99" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c99"
-    CC=$CC$ac_prog_cc_stdc_options
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
-$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c99" != xno; then :
-  ac_prog_cc_stdc=c99
-		    ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
-$as_echo_n "checking for $CC option to enable C89 features... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-struct stat;
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
-   inside strings and character constants.  */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-ac_prog_cc_stdc_options=
-case "x$ac_cv_prog_cc_c89" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c89"
-    CC=$CC$ac_prog_cc_stdc_options
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-  ac_prog_cc_stdc=c89
-		       ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
-else
-  ac_prog_cc_stdc=no
-		       ac_cv_prog_cc_stdc=no
-fi
-
-fi
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 depcc="$CC"   am_compiler_list=
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if ${am_cv_CC_dependencies_compiler_type+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CC_dependencies_compiler_type+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
   # We make a subdir and do the tests there.  Otherwise we can end up
   # making bogus files that we don't know about and never remove.  For
@@ -6154,8 +6867,8 @@
 fi
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; }
 CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
 
  if
@@ -6170,6 +6883,11 @@
 
 
 
+
+
+
+
+
 ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -6184,11 +6902,12 @@
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CXX+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$CXX"; then
   ac_cv_prog_CXX="$CXX" # Let the user override the test.
 else
@@ -6196,11 +6915,15 @@
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -6211,11 +6934,11 @@
 fi
 CXX=$ac_cv_prog_CXX
 if test -n "$CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
-$as_echo "$CXX" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+printf "%s\n" "$CXX" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -6228,11 +6951,12 @@
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CXX+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$ac_ct_CXX"; then
   ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
 else
@@ -6240,11 +6964,15 @@
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CXX="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -6255,11 +6983,11 @@
 fi
 ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
 if test -n "$ac_ct_CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
-$as_echo "$ac_ct_CXX" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+printf "%s\n" "$ac_ct_CXX" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -6271,8 +6999,8 @@
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     CXX=$ac_ct_CXX
@@ -6282,7 +7010,7 @@
   fi
 fi
 # Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
 set X $ac_compile
 ac_compiler=$2
 for ac_option in --version -v -V -qversion; do
@@ -6292,7 +7020,7 @@
   *) ac_try_echo=$ac_try;;
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
   (eval "$ac_compiler $ac_option >&5") 2>conftest.err
   ac_status=$?
   if test -s conftest.err; then
@@ -6302,20 +7030,21 @@
     cat conftest.er1 >&5
   fi
   rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
 done
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
-$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
-if ${ac_cv_cxx_compiler_gnu+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5
+printf %s "checking whether the compiler supports GNU C++... " >&6; }
+if test ${ac_cv_cxx_compiler_gnu+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 #ifndef __GNUC__
        choke me
@@ -6325,29 +7054,33 @@
   return 0;
 }
 _ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
   ac_compiler_gnu=yes
-else
+else $as_nop
   ac_compiler_gnu=no
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
-$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
 if test $ac_compiler_gnu = yes; then
   GXX=yes
 else
   GXX=
 fi
-ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_test_CXXFLAGS=${CXXFLAGS+y}
 ac_save_CXXFLAGS=$CXXFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
-$as_echo_n "checking whether $CXX accepts -g... " >&6; }
-if ${ac_cv_prog_cxx_g+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+printf %s "checking whether $CXX accepts -g... " >&6; }
+if test ${ac_cv_prog_cxx_g+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   ac_save_cxx_werror_flag=$ac_cxx_werror_flag
    ac_cxx_werror_flag=yes
    ac_cv_prog_cxx_g=no
@@ -6356,57 +7089,60 @@
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
   ac_cv_prog_cxx_g=yes
-else
+else $as_nop
   CXXFLAGS=""
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
 
-else
+else $as_nop
   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
 	 CXXFLAGS="-g"
 	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
-main ()
+main (void)
 {
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
   ac_cv_prog_cxx_g=yes
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
    ac_cxx_werror_flag=$ac_save_cxx_werror_flag
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
-$as_echo "$ac_cv_prog_cxx_g" >&6; }
-if test "$ac_test_CXXFLAGS" = set; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+printf "%s\n" "$ac_cv_prog_cxx_g" >&6; }
+if test $ac_test_CXXFLAGS; then
   CXXFLAGS=$ac_save_CXXFLAGS
 elif test $ac_cv_prog_cxx_g = yes; then
   if test "$GXX" = yes; then
@@ -6421,419 +7157,98 @@
     CXXFLAGS=
   fi
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5
-$as_echo_n "checking for $CXX option to enable C++11 features... " >&6; }
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if ${ac_cv_prog_cxx_cxx11+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cxx_cxx11=no
+ac_prog_cxx_stdcxx=no
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5
+printf %s "checking for $CXX option to enable C++11 features... " >&6; }
+if test ${ac_cv_prog_cxx_11+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_cv_prog_cxx_11=no
 ac_save_CXX=$CXX
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-#include <deque>
-#include <functional>
-#include <memory>
-#include <tuple>
-#include <array>
-#include <regex>
-#include <iostream>
-
-namespace cxx11test
-{
-  typedef std::shared_ptr<std::string> sptr;
-  typedef std::weak_ptr<std::string> wptr;
-
-  typedef std::tuple<std::string,int,double> tp;
-  typedef std::array<int, 20> int_array;
-
-  constexpr int get_val() { return 20; }
-
-  struct testinit
-  {
-    int i;
-    double d;
-  };
-
-  class delegate  {
-  public:
-    delegate(int n) : n(n) {}
-    delegate(): delegate(2354) {}
-
-    virtual int getval() { return this->n; };
-  protected:
-    int n;
-  };
-
-  class overridden : public delegate {
-  public:
-    overridden(int n): delegate(n) {}
-    virtual int getval() override final { return this->n * 2; }
-  };
-
-  class nocopy {
-  public:
-    nocopy(int i): i(i) {}
-    nocopy() = default;
-    nocopy(const nocopy&) = delete;
-    nocopy & operator=(const nocopy&) = delete;
-  private:
-    int i;
-  };
-}
-
-
-#include <algorithm>
-#include <cstdlib>
-#include <fstream>
-#include <iomanip>
-#include <iostream>
-#include <list>
-#include <map>
-#include <set>
-#include <sstream>
-#include <stdexcept>
-#include <string>
-#include <utility>
-#include <vector>
-
-namespace test {
-  typedef std::vector<std::string> string_vec;
-  typedef std::pair<int,bool> map_value;
-  typedef std::map<std::string,map_value> map_type;
-  typedef std::set<int> set_type;
-
-  template<typename T>
-  class printer {
-  public:
-    printer(std::ostringstream& os): os(os) {}
-    void operator() (T elem) { os << elem << std::endl; }
-  private:
-    std::ostringstream& os;
-  };
-}
-
-int
-main ()
-{
-
-{
-  // Test auto and decltype
-  std::deque<int> d;
-  d.push_front(43);
-  d.push_front(484);
-  d.push_front(3);
-  d.push_front(844);
-  int total = 0;
-  for (auto i = d.begin(); i != d.end(); ++i) { total += *i; }
-
-  auto a1 = 6538;
-  auto a2 = 48573953.4;
-  auto a3 = "String literal";
-
-  decltype(a2) a4 = 34895.034;
-}
-{
-  // Test constexpr
-  short sa[cxx11test::get_val()] = { 0 };
-}
-{
-  // Test initializer lists
-  cxx11test::testinit il = { 4323, 435234.23544 };
-}
-{
-  // Test range-based for and lambda
-  cxx11test::int_array array = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
-  for (int &x : array) { x += 23; }
-  std::for_each(array.begin(), array.end(), [](int v1){ std::cout << v1; });
-}
-{
-  using cxx11test::sptr;
-  using cxx11test::wptr;
-
-  sptr sp(new std::string("ASCII string"));
-  wptr wp(sp);
-  sptr sp2(wp);
-}
-{
-  cxx11test::tp tuple("test", 54, 45.53434);
-  double d = std::get<2>(tuple);
-  std::string s;
-  int i;
-  std::tie(s,i,d) = tuple;
-}
-{
-  static std::regex filename_regex("^_?([a-z0-9_.]+-)+[a-z0-9]+$");
-  std::string testmatch("Test if this string matches");
-  bool match = std::regex_search(testmatch, filename_regex);
-}
-{
-  cxx11test::int_array array = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
-  cxx11test::int_array::size_type size = array.size();
-}
-{
-  // Test constructor delegation
-  cxx11test::delegate d1;
-  cxx11test::delegate d2();
-  cxx11test::delegate d3(45);
-}
-{
-  // Test override and final
-  cxx11test::overridden o1(55464);
-}
-{
-  // Test nullptr
-  char *c = nullptr;
-}
-{
-  // Test template brackets
-  std::vector<std::pair<int,char*>> v1;
-}
-{
-  // Unicode literals
-  char const *utf8 = u8"UTF-8 string \u2500";
-  char16_t const *utf16 = u"UTF-8 string \u2500";
-  char32_t const *utf32 = U"UTF-32 string \u2500";
-}
-
-
-
-try {
-  // Basic string.
-  std::string teststr("ASCII text");
-  teststr += " string";
-
-  // Simple vector.
-  test::string_vec testvec;
-  testvec.push_back(teststr);
-  testvec.push_back("foo");
-  testvec.push_back("bar");
-  if (testvec.size() != 3) {
-    throw std::runtime_error("vector size is not 1");
-  }
-
-  // Dump vector into stringstream and obtain string.
-  std::ostringstream os;
-  for (test::string_vec::const_iterator i = testvec.begin();
-       i != testvec.end(); ++i) {
-    if (i + 1 != testvec.end()) {
-      os << teststr << '\n';
-    }
-  }
-  // Check algorithms work.
-  std::for_each(testvec.begin(), testvec.end(), test::printer<std::string>(os));
-  std::string os_out = os.str();
-
-  // Test pair and map.
-  test::map_type testmap;
-  testmap.insert(std::make_pair(std::string("key"),
-                                std::make_pair(53,false)));
-
-  // Test set.
-  int values[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
-  test::set_type testset(values, values + sizeof(values)/sizeof(values[0]));
-  std::list<int> testlist(testset.begin(), testset.end());
-  std::copy(testset.begin(), testset.end(), std::back_inserter(testlist));
-} catch (const std::exception& e) {
-  std::cerr << "Caught exception: " << e.what() << std::endl;
-
-  // Test fstream
-  std::ofstream of("test.txt");
-  of << "Test ASCII text\n" << std::flush;
-  of << "N= " << std::hex << std::setw(8) << std::left << 534 << std::endl;
-  of.close();
-}
-std::exit(0);
-
-  ;
-  return 0;
-}
+$ac_cxx_conftest_cxx11_program
 _ACEOF
-for ac_arg in '' -std=gnu++11 -std=c++11 -std=gnu++0x -std=c++0x -qlanglvl=extended0x -AA
+for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA
 do
   CXX="$ac_save_CXX $ac_arg"
-  if ac_fn_cxx_try_compile "$LINENO"; then :
+  if ac_fn_cxx_try_compile "$LINENO"
+then :
   ac_cv_prog_cxx_cxx11=$ac_arg
 fi
-rm -f core conftest.err conftest.$ac_objext
+rm -f core conftest.err conftest.$ac_objext conftest.beam
   test "x$ac_cv_prog_cxx_cxx11" != "xno" && break
 done
 rm -f conftest.$ac_ext
 CXX=$ac_save_CXX
-
 fi
-# AC_CACHE_VAL
-ac_prog_cxx_stdcxx_options=
-case "x$ac_cv_prog_cxx_cxx11" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    ac_prog_cxx_stdcxx_options=" $ac_cv_prog_cxx_cxx11"
-    CXX=$CXX$ac_prog_cxx_stdcxx_options
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5
-$as_echo "$ac_cv_prog_cxx_cxx11" >&6; } ;;
-esac
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test "x$ac_cv_prog_cxx_cxx11" != xno; then :
+
+if test "x$ac_cv_prog_cxx_cxx11" = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+  if test "x$ac_cv_prog_cxx_cxx11" = x
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; }
+     CXX="$CXX $ac_cv_prog_cxx_cxx11"
+fi
+  ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11
   ac_prog_cxx_stdcxx=cxx11
-		    ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11
-		    ac_cv_prog_cxx_cxx98=$ac_cv_prog_cxx_cxx11
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5
-$as_echo_n "checking for $CXX option to enable C++98 features... " >&6; }
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if ${ac_cv_prog_cxx_cxx98+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cxx_cxx98=no
+fi
+fi
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5
+printf %s "checking for $CXX option to enable C++98 features... " >&6; }
+if test ${ac_cv_prog_cxx_98+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_cv_prog_cxx_98=no
 ac_save_CXX=$CXX
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-#include <algorithm>
-#include <cstdlib>
-#include <fstream>
-#include <iomanip>
-#include <iostream>
-#include <list>
-#include <map>
-#include <set>
-#include <sstream>
-#include <stdexcept>
-#include <string>
-#include <utility>
-#include <vector>
-
-namespace test {
-  typedef std::vector<std::string> string_vec;
-  typedef std::pair<int,bool> map_value;
-  typedef std::map<std::string,map_value> map_type;
-  typedef std::set<int> set_type;
-
-  template<typename T>
-  class printer {
-  public:
-    printer(std::ostringstream& os): os(os) {}
-    void operator() (T elem) { os << elem << std::endl; }
-  private:
-    std::ostringstream& os;
-  };
-}
-
-int
-main ()
-{
-
-
-try {
-  // Basic string.
-  std::string teststr("ASCII text");
-  teststr += " string";
-
-  // Simple vector.
-  test::string_vec testvec;
-  testvec.push_back(teststr);
-  testvec.push_back("foo");
-  testvec.push_back("bar");
-  if (testvec.size() != 3) {
-    throw std::runtime_error("vector size is not 1");
-  }
-
-  // Dump vector into stringstream and obtain string.
-  std::ostringstream os;
-  for (test::string_vec::const_iterator i = testvec.begin();
-       i != testvec.end(); ++i) {
-    if (i + 1 != testvec.end()) {
-      os << teststr << '\n';
-    }
-  }
-  // Check algorithms work.
-  std::for_each(testvec.begin(), testvec.end(), test::printer<std::string>(os));
-  std::string os_out = os.str();
-
-  // Test pair and map.
-  test::map_type testmap;
-  testmap.insert(std::make_pair(std::string("key"),
-                                std::make_pair(53,false)));
-
-  // Test set.
-  int values[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
-  test::set_type testset(values, values + sizeof(values)/sizeof(values[0]));
-  std::list<int> testlist(testset.begin(), testset.end());
-  std::copy(testset.begin(), testset.end(), std::back_inserter(testlist));
-} catch (const std::exception& e) {
-  std::cerr << "Caught exception: " << e.what() << std::endl;
-
-  // Test fstream
-  std::ofstream of("test.txt");
-  of << "Test ASCII text\n" << std::flush;
-  of << "N= " << std::hex << std::setw(8) << std::left << 534 << std::endl;
-  of.close();
-}
-std::exit(0);
-
-  ;
-  return 0;
-}
+$ac_cxx_conftest_cxx98_program
 _ACEOF
 for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA
 do
   CXX="$ac_save_CXX $ac_arg"
-  if ac_fn_cxx_try_compile "$LINENO"; then :
+  if ac_fn_cxx_try_compile "$LINENO"
+then :
   ac_cv_prog_cxx_cxx98=$ac_arg
 fi
-rm -f core conftest.err conftest.$ac_objext
+rm -f core conftest.err conftest.$ac_objext conftest.beam
   test "x$ac_cv_prog_cxx_cxx98" != "xno" && break
 done
 rm -f conftest.$ac_ext
 CXX=$ac_save_CXX
-
 fi
-# AC_CACHE_VAL
-ac_prog_cxx_stdcxx_options=
-case "x$ac_cv_prog_cxx_cxx98" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    ac_prog_cxx_stdcxx_options=" $ac_cv_prog_cxx_cxx98"
-    CXX=$CXX$ac_prog_cxx_stdcxx_options
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5
-$as_echo "$ac_cv_prog_cxx_cxx98" >&6; } ;;
-esac
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test "x$ac_cv_prog_cxx_cxx98" != xno; then :
+
+if test "x$ac_cv_prog_cxx_cxx98" = xno
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+  if test "x$ac_cv_prog_cxx_cxx98" = x
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; }
+     CXX="$CXX $ac_cv_prog_cxx_cxx98"
+fi
+  ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98
   ac_prog_cxx_stdcxx=cxx98
-		        ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98
-else
-  ac_prog_cxx_stdcxx=no
-		        ac_cv_prog_cxx_stdcxx=no
 fi
-
 fi
 
 ac_ext=c
@@ -6844,11 +7259,12 @@
 
 depcc="$CXX"  am_compiler_list=
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CXX_dependencies_compiler_type+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
   # We make a subdir and do the tests there.  Otherwise we can end up
   # making bogus files that we don't know about and never remove.  For
@@ -6955,8 +7371,8 @@
 fi
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; }
 CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
 
  if
@@ -6973,45 +7389,298 @@
 
 # Gnulib (early checks).
 
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
+do
+  if test $ac_cache; then
+    ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+    if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+      printf "%s\n" "#define $ac_item 1" >> confdefs.h
+    fi
+    ac_header= ac_cache=
+  elif test $ac_header; then
+    ac_cache=$ac_item
+  else
+    ac_header=$ac_item
+  fi
+done
+
+
+
+
+
+
+
+
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
+
+printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
+printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; }
+if test ${ac_cv_safe_to_define___extensions__+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#         define __EXTENSIONS__ 1
+          $ac_includes_default
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_safe_to_define___extensions__=yes
+else $as_nop
+  ac_cv_safe_to_define___extensions__=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
+printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; }
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5
+printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; }
+if test ${ac_cv_should_define__xopen_source+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_cv_should_define__xopen_source=no
+    if test $ac_cv_header_wchar_h = yes
+then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+          #include <wchar.h>
+          mbstate_t x;
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+            #define _XOPEN_SOURCE 500
+            #include <wchar.h>
+            mbstate_t x;
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_should_define__xopen_source=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5
+printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; }
+
+  printf "%s\n" "#define _ALL_SOURCE 1" >>confdefs.h
+
+  printf "%s\n" "#define _DARWIN_C_SOURCE 1" >>confdefs.h
+
+  printf "%s\n" "#define _GNU_SOURCE 1" >>confdefs.h
+
+  printf "%s\n" "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h
+
+  printf "%s\n" "#define _NETBSD_SOURCE 1" >>confdefs.h
+
+  printf "%s\n" "#define _OPENBSD_SOURCE 1" >>confdefs.h
+
+  printf "%s\n" "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
+
+  printf "%s\n" "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h
+
+  printf "%s\n" "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h
+
+  printf "%s\n" "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h
+
+  printf "%s\n" "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h
+
+  printf "%s\n" "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h
+
+  printf "%s\n" "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h
+
+  printf "%s\n" "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h
+
+  printf "%s\n" "#define _TANDEM_SOURCE 1" >>confdefs.h
+
+  if test $ac_cv_header_minix_config_h = yes
+then :
+  MINIX=yes
+    printf "%s\n" "#define _MINIX 1" >>confdefs.h
+
+    printf "%s\n" "#define _POSIX_SOURCE 1" >>confdefs.h
+
+    printf "%s\n" "#define _POSIX_1_SOURCE 2" >>confdefs.h
+
+else $as_nop
+  MINIX=
+fi
+  if test $ac_cv_safe_to_define___extensions__ = yes
+then :
+  printf "%s\n" "#define __EXTENSIONS__ 1" >>confdefs.h
+
+fi
+  if test $ac_cv_should_define__xopen_source = yes
+then :
+  printf "%s\n" "#define _XOPEN_SOURCE 500" >>confdefs.h
+
+fi
+
+
+
+  # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+
+
+
+  case "$host_os" in
+    openbsd*)
+
+printf "%s\n" "#define _ISOC11_SOURCE 1" >>confdefs.h
+
+      ;;
+  esac
+
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+printf %s "checking how to run the C preprocessor... " >&6; }
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
 fi
 if test -z "$CPP"; then
-  if ${ac_cv_prog_CPP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+  if test ${ac_cv_prog_CPP+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+      # Double quotes because $CC needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp
     do
       ac_preproc_ok=false
 for ac_c_preproc_warn_flag in '' yes
 do
   # Use a header file that comes with gcc, so configuring glibc
   # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp. "Syntax error" is here to catch this case.
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+#include <limits.h>
 		     Syntax error
 _ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
 
-else
+else $as_nop
   # Broken: fails on valid input.
 continue
 fi
@@ -7023,10 +7692,11 @@
 /* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
   # Broken: success on invalid input.
 continue
-else
+else $as_nop
   # Passes both tests.
 ac_preproc_ok=:
 break
@@ -7036,7 +7706,8 @@
 done
 # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
 rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
+if $ac_preproc_ok
+then :
   break
 fi
 
@@ -7048,29 +7719,24 @@
 else
   ac_cv_prog_CPP=$CPP
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+printf "%s\n" "$CPP" >&6; }
 ac_preproc_ok=false
 for ac_c_preproc_warn_flag in '' yes
 do
   # Use a header file that comes with gcc, so configuring glibc
   # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp. "Syntax error" is here to catch this case.
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+#include <limits.h>
 		     Syntax error
 _ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
 
-else
+else $as_nop
   # Broken: fails on valid input.
 continue
 fi
@@ -7082,10 +7748,11 @@
 /* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
   # Broken: success on invalid input.
 continue
-else
+else $as_nop
   # Passes both tests.
 ac_preproc_ok=:
 break
@@ -7095,11 +7762,12 @@
 done
 # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
 rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
+if $ac_preproc_ok
+then :
 
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+else $as_nop
+  { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
 See \`config.log' for more details" "$LINENO" 5; }
 fi
@@ -7111,11 +7779,12 @@
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+printf %s "checking for grep that handles long lines and -e... " >&6; }
+if test ${ac_cv_path_GREP+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -z "$GREP"; then
   ac_path_GREP_found=false
   # Loop through the user's path and test for each of PROGNAME-LIST
@@ -7123,10 +7792,15 @@
 for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in grep ggrep; do
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_prog in grep ggrep
+   do
     for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      ac_path_GREP="$as_dir$ac_prog$ac_exec_ext"
       as_fn_executable_p "$ac_path_GREP" || continue
 # Check for GNU ac_path_GREP and select it if it is found.
   # Check for GNU $ac_path_GREP
@@ -7135,13 +7809,13 @@
   ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
 *)
   ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
+  printf %s 0123456789 >"conftest.in"
   while :
   do
     cat "conftest.in" "conftest.in" >"conftest.tmp"
     mv "conftest.tmp" "conftest.in"
     cp "conftest.in" "conftest.nl"
-    $as_echo 'GREP' >> "conftest.nl"
+    printf "%s\n" 'GREP' >> "conftest.nl"
     "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
     diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
     as_fn_arith $ac_count + 1 && ac_count=$as_val
@@ -7169,16 +7843,17 @@
 fi
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+printf "%s\n" "$ac_cv_path_GREP" >&6; }
  GREP="$ac_cv_path_GREP"
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
    then ac_cv_path_EGREP="$GREP -E"
    else
@@ -7189,10 +7864,15 @@
 for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in egrep; do
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_prog in egrep
+   do
     for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
       as_fn_executable_p "$ac_path_EGREP" || continue
 # Check for GNU ac_path_EGREP and select it if it is found.
   # Check for GNU $ac_path_EGREP
@@ -7201,13 +7881,13 @@
   ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
 *)
   ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
+  printf %s 0123456789 >"conftest.in"
   while :
   do
     cat "conftest.in" "conftest.in" >"conftest.tmp"
     mv "conftest.tmp" "conftest.in"
     cp "conftest.in" "conftest.nl"
-    $as_echo 'EGREP' >> "conftest.nl"
+    printf "%s\n" 'EGREP' >> "conftest.nl"
     "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
     diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
     as_fn_arith $ac_count + 1 && ac_count=$as_val
@@ -7236,288 +7916,20 @@
 
    fi
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
  EGREP="$ac_cv_path_EGREP"
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
 
-int
-main ()
-{
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-
-  ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default"
-if test "x$ac_cv_header_minix_config_h" = xyes; then :
-  MINIX=yes
-else
-  MINIX=
-fi
-
-
-  if test "$MINIX" = yes; then
-
-$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h
-
-
-$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h
-
-
-$as_echo "#define _MINIX 1" >>confdefs.h
-
-
-$as_echo "#define _NETBSD_SOURCE 1" >>confdefs.h
-
-  fi
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
-$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; }
-if ${ac_cv_safe_to_define___extensions__+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#         define __EXTENSIONS__ 1
-          $ac_includes_default
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_safe_to_define___extensions__=yes
-else
-  ac_cv_safe_to_define___extensions__=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
-$as_echo "$ac_cv_safe_to_define___extensions__" >&6; }
-  test $ac_cv_safe_to_define___extensions__ = yes &&
-    $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h
-
-  $as_echo "#define _ALL_SOURCE 1" >>confdefs.h
-
-  $as_echo "#define _DARWIN_C_SOURCE 1" >>confdefs.h
-
-  $as_echo "#define _GNU_SOURCE 1" >>confdefs.h
-
-  $as_echo "#define _NETBSD_SOURCE 1" >>confdefs.h
-
-  $as_echo "#define _OPENBSD_SOURCE 1" >>confdefs.h
-
-  $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
-
-  $as_echo "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h
-
-  $as_echo "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h
-
-  $as_echo "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h
-
-  $as_echo "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h
-
-  $as_echo "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h
-
-  $as_echo "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h
-
-  $as_echo "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h
-
-  $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5
-$as_echo_n "checking whether _XOPEN_SOURCE should be defined... " >&6; }
-if ${ac_cv_should_define__xopen_source+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_should_define__xopen_source=no
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-          #include <wchar.h>
-          mbstate_t x;
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-             #define _XOPEN_SOURCE 500
-             #include <wchar.h>
-             mbstate_t x;
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_should_define__xopen_source=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5
-$as_echo "$ac_cv_should_define__xopen_source" >&6; }
-  test $ac_cv_should_define__xopen_source = yes &&
-    $as_echo "#define _XOPEN_SOURCE 500" >>confdefs.h
-
-  $as_echo "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Minix Amsterdam compiler" >&5
-$as_echo_n "checking for Minix Amsterdam compiler... " >&6; }
-if ${gl_cv_c_amsterdam_compiler+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Minix Amsterdam compiler" >&5
+printf %s "checking for Minix Amsterdam compiler... " >&6; }
+if test ${gl_cv_c_amsterdam_compiler+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
@@ -7528,17 +7940,18 @@
 
 _ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Amsterdam" >/dev/null 2>&1; then :
+  $EGREP "Amsterdam" >/dev/null 2>&1
+then :
   gl_cv_c_amsterdam_compiler=yes
-else
+else $as_nop
   gl_cv_c_amsterdam_compiler=no
 fi
-rm -f conftest*
+rm -rf conftest*
 
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_amsterdam_compiler" >&5
-$as_echo "$gl_cv_c_amsterdam_compiler" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_amsterdam_compiler" >&5
+printf "%s\n" "$gl_cv_c_amsterdam_compiler" >&6; }
 
       if test $gl_cv_c_amsterdam_compiler = yes; then
     if test -z "$AR"; then
@@ -7554,11 +7967,12 @@
         if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AR+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AR+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$AR"; then
   ac_cv_prog_AR="$AR" # Let the user override the test.
 else
@@ -7566,11 +7980,15 @@
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_AR="${ac_tool_prefix}ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -7581,11 +7999,11 @@
 fi
 AR=$ac_cv_prog_AR
 if test -n "$AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+printf "%s\n" "$AR" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -7594,11 +8012,12 @@
   ac_ct_AR=$AR
   # Extract the first word of "ar", so it can be a program name with args.
 set dummy ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_AR+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_AR+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$ac_ct_AR"; then
   ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
 else
@@ -7606,11 +8025,15 @@
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_AR="ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -7621,11 +8044,11 @@
 fi
 ac_ct_AR=$ac_cv_prog_ac_ct_AR
 if test -n "$ac_ct_AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+printf "%s\n" "$ac_ct_AR" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
   if test "x$ac_ct_AR" = x; then
@@ -7633,8 +8056,8 @@
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     AR=$ac_ct_AR
@@ -7656,11 +8079,12 @@
             if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_RANLIB+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$RANLIB"; then
   ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
 else
@@ -7668,11 +8092,15 @@
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -7683,11 +8111,11 @@
 fi
 RANLIB=$ac_cv_prog_RANLIB
 if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -7696,11 +8124,12 @@
   ac_ct_RANLIB=$RANLIB
   # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$ac_ct_RANLIB"; then
   ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
 else
@@ -7708,11 +8137,15 @@
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -7723,11 +8156,11 @@
 fi
 ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
 if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
   if test "x$ac_ct_RANLIB" = x; then
@@ -7735,8 +8168,8 @@
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     RANLIB=$ac_ct_RANLIB
@@ -7750,77 +8183,6 @@
 
 
 
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
 
 
 
@@ -7851,17 +8213,19 @@
   esac
 
 # Check whether --enable-largefile was given.
-if test "${enable_largefile+set}" = set; then :
+if test ${enable_largefile+y}
+then :
   enableval=$enable_largefile;
 fi
 
-if test "$enable_largefile" != no; then
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
-$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
-if ${ac_cv_sys_largefile_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+if test "$enable_largefile" != no
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+printf %s "checking for special C compiler options needed for large files... " >&6; }
+if test ${ac_cv_sys_largefile_CC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   ac_cv_sys_largefile_CC=no
      if test "$GCC" != yes; then
        ac_save_CC=$CC
@@ -7875,44 +8239,47 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
-                       && LARGE_OFF_T % 2147483647 == 1)
-                      ? 1 : -1];
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
 int
-main ()
+main (void)
 {
 
   ;
   return 0;
 }
 _ACEOF
-         if ac_fn_c_try_compile "$LINENO"; then :
+         if ac_fn_c_try_compile "$LINENO"
+then :
   break
 fi
-rm -f core conftest.err conftest.$ac_objext
+rm -f core conftest.err conftest.$ac_objext conftest.beam
          CC="$CC -n32"
-         if ac_fn_c_try_compile "$LINENO"; then :
+         if ac_fn_c_try_compile "$LINENO"
+then :
   ac_cv_sys_largefile_CC=' -n32'; break
 fi
-rm -f core conftest.err conftest.$ac_objext
+rm -f core conftest.err conftest.$ac_objext conftest.beam
          break
        done
        CC=$ac_save_CC
        rm -f conftest.$ac_ext
     fi
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
-$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; }
   if test "$ac_cv_sys_largefile_CC" != no; then
     CC=$CC$ac_cv_sys_largefile_CC
   fi
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
-$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
-if ${ac_cv_sys_file_offset_bits+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if test ${ac_cv_sys_file_offset_bits+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   while :; do
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
@@ -7921,67 +8288,70 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
-                       && LARGE_OFF_T % 2147483647 == 1)
-                      ? 1 : -1];
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
 int
-main ()
+main (void)
 {
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   ac_cv_sys_file_offset_bits=no; break
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
+#undef _FILE_OFFSET_BITS
 #define _FILE_OFFSET_BITS 64
 #include <sys/types.h>
  /* Check that off_t can represent 2**63 - 1 correctly.
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
-                       && LARGE_OFF_T % 2147483647 == 1)
-                      ? 1 : -1];
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
 int
-main ()
+main (void)
 {
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   ac_cv_sys_file_offset_bits=64; break
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ac_cv_sys_file_offset_bits=unknown
   break
 done
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
-$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; }
 case $ac_cv_sys_file_offset_bits in #(
   no | unknown) ;;
   *)
-cat >>confdefs.h <<_ACEOF
-#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
-_ACEOF
+printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h
 ;;
 esac
 rm -rf conftest*
-  if test $ac_cv_sys_file_offset_bits = unknown; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
-$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
-if ${ac_cv_sys_large_files+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  case $ac_cv_sys_file_offset_bits in #(
+  unknown) :
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+printf %s "checking for _LARGE_FILES value needed for large files... " >&6; }
+if test ${ac_cv_sys_large_files+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   while :; do
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
@@ -7990,67 +8360,198 @@
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
-                       && LARGE_OFF_T % 2147483647 == 1)
-                      ? 1 : -1];
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
 int
-main ()
+main (void)
 {
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   ac_cv_sys_large_files=no; break
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
+#undef _LARGE_FILES
 #define _LARGE_FILES 1
 #include <sys/types.h>
  /* Check that off_t can represent 2**63 - 1 correctly.
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
-                       && LARGE_OFF_T % 2147483647 == 1)
-                      ? 1 : -1];
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
 int
-main ()
+main (void)
 {
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   ac_cv_sys_large_files=1; break
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
   ac_cv_sys_large_files=unknown
   break
 done
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
-$as_echo "$ac_cv_sys_large_files" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+printf "%s\n" "$ac_cv_sys_large_files" >&6; }
 case $ac_cv_sys_large_files in #(
   no | unknown) ;;
   *)
-cat >>confdefs.h <<_ACEOF
-#define _LARGE_FILES $ac_cv_sys_large_files
-_ACEOF
+printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h
 ;;
 esac
-rm -rf conftest*
-  fi
+rm -rf conftest* ;; #(
+  64) :
 
+ # Check whether --enable-year2038 was given.
+if test ${enable_year2038+y}
+then :
+  enableval=$enable_year2038;
+fi
 
-$as_echo "#define _DARWIN_USE_64_BIT_INODE 1" >>confdefs.h
+ if test "$enable_year2038" != no
+then :
+
+                            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for time_t past the year 2038" >&5
+printf %s "checking for time_t past the year 2038... " >&6; }
+if test ${gl_cv_type_time_t_y2038+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+  #include <time.h>
+  /* Check that time_t can represent 2**32 - 1 correctly.  */
+  #define LARGE_TIME_T \\
+    ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30)))
+  int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535
+                           && LARGE_TIME_T % 65537 == 0)
+                          ? 1 : -1];
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_type_time_t_y2038=yes
+else $as_nop
+  gl_cv_type_time_t_y2038=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 
 fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_time_t_y2038" >&5
+printf "%s\n" "$gl_cv_type_time_t_y2038" >&6; }
+  if test "$gl_cv_type_time_t_y2038" = no; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit time_t with _TIME_BITS=64" >&5
+printf %s "checking for 64-bit time_t with _TIME_BITS=64... " >&6; }
+if test ${gl_cv_type_time_t_bits_macro+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _TIME_BITS 64
+                           #define _FILE_OFFSET_BITS 64
+
+  #include <time.h>
+  /* Check that time_t can represent 2**32 - 1 correctly.  */
+  #define LARGE_TIME_T \\
+    ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30)))
+  int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535
+                           && LARGE_TIME_T % 65537 == 0)
+                          ? 1 : -1];
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_type_time_t_bits_macro=yes
+else $as_nop
+  gl_cv_type_time_t_bits_macro=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_time_t_bits_macro" >&5
+printf "%s\n" "$gl_cv_type_time_t_bits_macro" >&6; }
+    if test "$gl_cv_type_time_t_bits_macro" = yes; then
+
+printf "%s\n" "#define _TIME_BITS 64" >>confdefs.h
+
+
+printf "%s\n" "#define _FILE_OFFSET_BITS 64" >>confdefs.h
+
+      gl_cv_type_time_t_y2038=yes
+    fi
+  fi
+  if test $gl_cv_type_time_t_y2038 = no; then
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef _USE_32BIT_TIME_T
+             int ok;
+           #else
+             error fail
+           #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The 'time_t' type stops working after January 2038.
+          Remove _USE_32BIT_TIME_T from the compiler flags.
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+  # If not cross-compiling and  says we should check,
+       # and 'touch' works with a large timestamp, then evidently wider time_t
+       # is desired and supported, so fail and ask the builder to fix the
+       # problem.  Otherwise, just warn the builder.
+
+       if test "$gl_warned_about_y2038" != yes; then
+         { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: The 'time_t' type stops working after January 2038,
+            and this package needs a wider 'time_t' type
+            if there is any way to access timestamps after that.
+            Configure with 'CC=\"${CC} -m64\"' perhaps?" >&5
+printf "%s\n" "$as_me: WARNING: The 'time_t' type stops working after January 2038,
+            and this package needs a wider 'time_t' type
+            if there is any way to access timestamps after that.
+            Configure with 'CC=\"${CC} -m64\"' perhaps?" >&2;}
+         gl_warned_about_y2038=yes
+       fi
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+  fi
+fi
+ ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+
+  case "$host_os" in
+    mingw*)
+
+printf "%s\n" "#define __MINGW_USE_VC2005_COMPAT 1" >>confdefs.h
+
+      ;;
+  esac
 
 
 
@@ -8059,9 +8560,10 @@
 
 
   # Check whether --enable-threads was given.
-if test "${enable_threads+set}" = set; then :
+if test ${enable_threads+y}
+then :
   enableval=$enable_threads; gl_use_threads=$enableval
-else
+else $as_nop
   if test -n "$gl_use_threads_default"; then
        gl_use_threads="$gl_use_threads_default"
      else
@@ -8125,6 +8627,7 @@
 
 
   # Code from module absolute-header:
+  # Code from module access:
   # Code from module alignof:
   # Code from module alloca-opt:
   # Code from module allocator:
@@ -8134,63 +8637,90 @@
   # Code from module array-list:
   # Code from module assert:
   # Code from module assure:
+  # Code from module at-internal:
+  # Code from module attribute:
+  # Code from module basename-lgpl:
   # Code from module binary-io:
   # Code from module bitrotate:
   # Code from module bitset:
   # Code from module bitsetv:
+  # Code from module builtin-expect:
   # Code from module c-ctype:
   # Code from module c-strcase:
   # Code from module c-strcaseeq:
   # Code from module c99:
+  # Code from module calloc-gnu:
   # Code from module calloc-posix:
+  # Code from module canonicalize:
   # Code from module canonicalize-lgpl:
   # Code from module careadlinkat:
   # Code from module chdir:
+  # Code from module chdir-long:
   # Code from module clock-time:
   # Code from module cloexec:
   # Code from module close:
   # Code from module close-stream:
+  # Code from module closedir:
   # Code from module closeout:
   # Code from module concat-filename:
   # Code from module config-h:
   # Code from module configmake:
+  # Code from module d-ino:
   # Code from module diffseq:
+  # Code from module dirent:
+  # Code from module dirfd:
   # Code from module dirname:
   # Code from module dirname-lgpl:
   # Code from module do-release-commit-and-tag:
-  # Code from module dosname:
   # Code from module double-slash-root:
+  # Code from module dup:
   # Code from module dup2:
+  # Code from module eloop-threshold:
   # Code from module environ:
   # Code from module errno:
   # Code from module error:
+  # Code from module execute:
   # Code from module exitfail:
   # Code from module extensions:
   # Code from module extern-inline:
   # Code from module fatal-signal:
+  # Code from module fchdir:
   # Code from module fcntl:
   # Code from module fcntl-h:
   # Code from module fd-hook:
   # Code from module fd-safer-flag:
   # Code from module fdl:
+  # Code from module fdopendir:
+  # Code from module ffs:
+  # Code from module ffsl:
+  # Code from module file-set:
   # Code from module filename:
+  # Code from module filenamecat-lgpl:
+  # Code from module findprog-in:
   # Code from module float:
   # Code from module fopen:
+  # Code from module fopen-gnu:
   # Code from module fopen-safer:
   # Code from module fpending:
   # Code from module fpieee:
 
   # Code from module fprintf-posix:
   # Code from module fpucw:
+  # Code from module free-posix:
   # Code from module frexp-nolibm:
   # Code from module frexpl-nolibm:
   # Code from module fseterr:
   # Code from module fstat:
+  # Code from module fstatat:
   # Code from module fstrcmp:
   # Code from module fsync:
   # Code from module gendocs:
+  # Code from module getcwd:
+  # Code from module getcwd-lgpl:
+  # Code from module getdelim:
   # Code from module getdtablesize:
   # Code from module gethrxtime:
+  # Code from module getline:
   # Code from module getopt-gnu:
   # Code from module getopt-posix:
   # Code from module getprogname:
@@ -8203,11 +8733,23 @@
   # Code from module gnu-web-doc-update:
   # Code from module gnumakefile:
   # Code from module gnupload:
+  # Code from module gperf:
   # Code from module gpl-3.0:
   # Code from module hard-locale:
   # Code from module hash:
+  # Code from module hash-map:
+  # Code from module hash-pjw:
+  # Code from module hash-triple-simple:
   # Code from module havelib:
+  # Code from module ialloc:
+  # Code from module iconv:
+  # Code from module iconv-h:
+  # Code from module iconv_open:
+  # Code from module idx:
   # Code from module include_next:
+  # Code from module inline:
+  # Code from module integer_length:
+  # Code from module integer_length_l:
   # Code from module intprops:
   # Code from module inttypes:
   # Code from module inttypes-incomplete:
@@ -8219,25 +8761,30 @@
   # Code from module isnanl:
   # Code from module isnanl-nolibm:
   # Code from module iswblank:
+  # Code from module iswdigit:
+  # Code from module iswxdigit:
   # Code from module javacomp-script:
   # Code from module javaexec-script:
   # Code from module largefile:
 
+
   # Code from module ldexp:
   # Code from module ldexpl:
   # Code from module libc-config:
   # Code from module libtextstyle:
   # Code from module libtextstyle-optional:
   # Code from module limits-h:
+  # Code from module linked-list:
   # Code from module list:
   # Code from module localcharset:
-  # Code from module localtime-buffer:
+  # Code from module locale:
   # Code from module lock:
   # Code from module lstat:
   # Code from module maintainer-makefile:
   # Code from module malloc-gnu:
   # Code from module malloc-posix:
   # Code from module malloca:
+  # Code from module map:
   # Code from module math:
   # Code from module mbchar:
   # Code from module mbfile:
@@ -8245,6 +8792,8 @@
   # Code from module mbsinit:
   # Code from module mbswidth:
   # Code from module memchr:
+  # Code from module mempcpy:
+  # Code from module memrchr:
   # Code from module minmax:
   # Code from module msvc-inval:
   # Code from module msvc-nothrow:
@@ -8254,11 +8803,19 @@
   # Code from module obstack:
   # Code from module obstack-printf:
   # Code from module open:
+  # Code from module openat:
+  # Code from module openat-die:
+  # Code from module openat-h:
+  # Code from module opendir:
+  # Code from module oset:
   # Code from module pathmax:
   # Code from module perror:
+  # Code from module pipe-posix:
   # Code from module pipe2:
   # Code from module pipe2-safer:
+  # Code from module posix_spawn:
   # Code from module posix_spawn-internal:
+  # Code from module posix_spawn_file_actions_addchdir:
   # Code from module posix_spawn_file_actions_addclose:
   # Code from module posix_spawn_file_actions_adddup2:
   # Code from module posix_spawn_file_actions_addopen:
@@ -8267,6 +8824,7 @@
   # Code from module posix_spawnattr_destroy:
   # Code from module posix_spawnattr_init:
   # Code from module posix_spawnattr_setflags:
+  # Code from module posix_spawnattr_setpgroup:
   # Code from module posix_spawnattr_setsigmask:
   # Code from module posix_spawnp:
   # Code from module printf-frexp:
@@ -8279,16 +8837,27 @@
   # Code from module quotearg-simple:
   # Code from module raise:
   # Code from module rawmemchr:
+  # Code from module rbtree-oset:
+  # Code from module rbtreehash-list:
+  # Code from module readdir:
+  # Code from module readline:
   # Code from module readlink:
   # Code from module readme-release:
+  # Code from module realloc-gnu:
   # Code from module realloc-posix:
+  # Code from module reallocarray:
   # Code from module relocatable-prog:
   # Code from module relocatable-prog-wrapper:
+
   # Code from module relocatable-script:
   # Code from module rename:
+  # Code from module rewinddir:
   # Code from module rmdir:
   # Code from module same-inode:
+  # Code from module save-cwd:
   # Code from module sched:
+  # Code from module scratch_buffer:
+  # Code from module setlocale-null:
   # Code from module sh-filename:
   # Code from module sigaction:
   # Code from module signal-h:
@@ -8308,12 +8877,14 @@
   # Code from module stat:
   # Code from module stat-time:
   # Code from module std-gnu11:
+  # Code from module stdalign:
   # Code from module stdbool:
   # Code from module stddef:
   # Code from module stdint:
   # Code from module stdio:
   # Code from module stdlib:
   # Code from module stpcpy:
+  # Code from module stpncpy:
   # Code from module strchrnul:
   # Code from module strdup-posix:
   # Code from module streq:
@@ -8321,15 +8892,20 @@
   # Code from module strerror-override:
   # Code from module strerror_r-posix:
   # Code from module string:
+  # Code from module strings:
   # Code from module strndup:
   # Code from module strnlen:
+  # Code from module strtod:
   # Code from module strverscmp:
+  # Code from module sys_ioctl:
   # Code from module sys_resource:
   # Code from module sys_stat:
   # Code from module sys_time:
   # Code from module sys_times:
   # Code from module sys_types:
   # Code from module sys_wait:
+  # Code from module termios:
+  # Code from module thread-optim:
   # Code from module threadlib:
 
 
@@ -8338,13 +8914,18 @@
   # Code from module timespec:
   # Code from module timevar:
   # Code from module tls:
+  # Code from module unicodeio:
   # Code from module unistd:
   # Code from module unistd-safer:
+  # Code from module unistr/base:
+  # Code from module unistr/u8-mbtoucr:
+  # Code from module unistr/u8-uctomb:
   # Code from module unitypes:
   # Code from module uniwidth/base:
   # Code from module uniwidth/width:
   # Code from module unlink:
   # Code from module unlocked-io:
+  # Code from module unlocked-io-internal:
   # Code from module unsetenv:
   # Code from module update-copyright:
   # Code from module useless-if-before-free:
@@ -8367,6 +8948,7 @@
   # Code from module windows-once:
   # Code from module windows-recmutex:
   # Code from module windows-rwlock:
+  # Code from module windows-spawn:
   # Code from module windows-tls:
   # Code from module winsz-ioctl:
   # Code from module winsz-termios:
@@ -8376,11338 +8958,15 @@
   # Code from module xconcat-filename:
   # Code from module xhash:
   # Code from module xlist:
+  # Code from module xmap:
   # Code from module xmemdup0:
   # Code from module xreadlink:
   # Code from module xsize:
   # Code from module xstrndup:
 
 
-# Gnulib uses '#pragma GCC diagnostic push' to silence some
-# warnings, but older gcc doesn't support this.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pragma GCC diagnostic push works" >&5
-$as_echo_n "checking whether pragma GCC diagnostic push works... " >&6; }
-if ${lv_cv_gcc_pragma_push_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  save_CFLAGS=$CFLAGS
-  CFLAGS='-Wunknown-pragmas -Werror'
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-    #pragma GCC diagnostic push
-    #pragma GCC diagnostic pop
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  lv_cv_gcc_pragma_push_works=yes
-else
-  lv_cv_gcc_pragma_push_works=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CFLAGS=$save_CFLAGS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lv_cv_gcc_pragma_push_works" >&5
-$as_echo "$lv_cv_gcc_pragma_push_works" >&6; }
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-
-  ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Werror -Wunknown-warning-option" >&5
-$as_echo_n "checking whether C++ compiler handles -Werror -Wunknown-warning-option... " >&6; }
-if ${gl_cv_warn_cxx__Werror__Wunknown_warning_option+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CXXFLAGS"
-  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Werror -Wunknown-warning-option"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  gl_cv_warn_cxx__Werror__Wunknown_warning_option=yes
-else
-  gl_cv_warn_cxx__Werror__Wunknown_warning_option=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Werror__Wunknown_warning_option" >&5
-$as_echo "$gl_cv_warn_cxx__Werror__Wunknown_warning_option" >&6; }
-if test "x$gl_cv_warn_cxx__Werror__Wunknown_warning_option" = xyes; then :
-  gl_unknown_warnings_are_errors='-Wunknown-warning-option -Werror'
-else
-  gl_unknown_warnings_are_errors=
-fi
-
-  ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -fno-exceptions" >&5
-$as_echo_n "checking whether C++ compiler handles -fno-exceptions... " >&6; }
-if ${gl_cv_warn_cxx__fno_exceptions+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CXXFLAGS"
-  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -fno-exceptions"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  gl_cv_warn_cxx__fno_exceptions=yes
-else
-  gl_cv_warn_cxx__fno_exceptions=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__fno_exceptions" >&5
-$as_echo "$gl_cv_warn_cxx__fno_exceptions" >&6; }
-if test "x$gl_cv_warn_cxx__fno_exceptions" = xyes; then :
-  as_fn_append NO_EXCEPTIONS_CXXFLAGS " -fno-exceptions"
-fi
-
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-for f in '-std=c++98' '-std=c++98 -stdlib=libc++'
-do
-  as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$f" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
-$as_echo_n "checking whether C++ compiler accepts $f... " >&6; }
-if eval \${$as_CACHEVAR+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  ax_check_save_flags=$CXXFLAGS
-  CXXFLAGS="$CXXFLAGS  $f"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <vector>
-
-typedef std::vector<int> ints;
-
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  eval "$as_CACHEVAR=yes"
-else
-  eval "$as_CACHEVAR=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS=$ax_check_save_flags
-fi
-eval ac_res=\$$as_CACHEVAR
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
-  CXX98_CXXFLAGS=$f
- break
-fi
-
-done
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-for f in '-std=c++03' '-std=c++03 -stdlib=libc++'
-do
-  as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$f" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
-$as_echo_n "checking whether C++ compiler accepts $f... " >&6; }
-if eval \${$as_CACHEVAR+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  ax_check_save_flags=$CXXFLAGS
-  CXXFLAGS="$CXXFLAGS  $f"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <vector>
-
-typedef std::vector<int> ints;
-
-
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  eval "$as_CACHEVAR=yes"
-else
-  eval "$as_CACHEVAR=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS=$ax_check_save_flags
-fi
-eval ac_res=\$$as_CACHEVAR
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
-  CXX03_CXXFLAGS=$f
- break
-fi
-
-done
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-for f in '-std=c++11' '-std=c++11 -stdlib=libc++'
-do
-  as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$f" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
-$as_echo_n "checking whether C++ compiler accepts $f... " >&6; }
-if eval \${$as_CACHEVAR+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  ax_check_save_flags=$CXXFLAGS
-  CXXFLAGS="$CXXFLAGS  $f"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <vector>
-
-typedef std::vector<int> ints;
-
-
-#include <algorithm>
-#include <memory>
-#include <set>
-#include <sstream>
-#include <string>
-
-  // C++11
-  template <typename T>
-  struct check
-  {
-    static_assert(sizeof(int) <= sizeof(T), "not big enough");
-  };
-
-  using right_angle_brackets = check<check<bool>>;
-
-  auto f = std::make_shared<std::string>("shared_ptr");
-
-  int a;
-  decltype(a) b;
-
-  typedef check<int> check_type;
-  check_type c;
-  check_type&& cr = static_cast<check_type&&>(c);
-
-  auto d = a;
-
-  // Some versions of libstdc++ do not support std::set::emplace.
-  void foo()
-  {
-    std::set<int> is;
-    is.emplace(42);
-  }
-
-  // Clang++ 3.5, for a while, was unable to process properly
-  // the for-loop because its variable, r, is a typedef...
-  // It failed as follows:
-  //
-  // error: unexpected ':' in nested name specifier; did you mean '::'?
-  //    for (auto r: std::set<int>{1, 2})
-  //               ^
-  //               ::
-  using r = std::set<int>;
-  void bar()
-  {
-    for (int r: std::set<int>{1, 2})
-      continue;
-  }
-
-  // GCC 4.8.2 on Solaris 11.3 does not support to_string.
-  auto e = std::to_string(42);
-
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  eval "$as_CACHEVAR=yes"
-else
-  eval "$as_CACHEVAR=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS=$ax_check_save_flags
-fi
-eval ac_res=\$$as_CACHEVAR
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
-  CXX11_CXXFLAGS=$f
- break
-fi
-
-done
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-for f in '-std=c++14' '-std=c++14 -stdlib=libc++'
-do
-  as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$f" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
-$as_echo_n "checking whether C++ compiler accepts $f... " >&6; }
-if eval \${$as_CACHEVAR+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  ax_check_save_flags=$CXXFLAGS
-  CXXFLAGS="$CXXFLAGS  $f"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <vector>
-
-typedef std::vector<int> ints;
-
-
-#include <algorithm>
-#include <memory>
-#include <set>
-#include <sstream>
-#include <string>
-
-  // C++11
-  template <typename T>
-  struct check
-  {
-    static_assert(sizeof(int) <= sizeof(T), "not big enough");
-  };
-
-  using right_angle_brackets = check<check<bool>>;
-
-  auto f = std::make_shared<std::string>("shared_ptr");
-
-  int a;
-  decltype(a) b;
-
-  typedef check<int> check_type;
-  check_type c;
-  check_type&& cr = static_cast<check_type&&>(c);
-
-  auto d = a;
-
-  // Some versions of libstdc++ do not support std::set::emplace.
-  void foo()
-  {
-    std::set<int> is;
-    is.emplace(42);
-  }
-
-  // Clang++ 3.5, for a while, was unable to process properly
-  // the for-loop because its variable, r, is a typedef...
-  // It failed as follows:
-  //
-  // error: unexpected ':' in nested name specifier; did you mean '::'?
-  //    for (auto r: std::set<int>{1, 2})
-  //               ^
-  //               ::
-  using r = std::set<int>;
-  void bar()
-  {
-    for (int r: std::set<int>{1, 2})
-      continue;
-  }
-
-  // GCC 4.8.2 on Solaris 11.3 does not support to_string.
-  auto e = std::to_string(42);
-
-  // C++14
-  void mismatch()
-  {
-    using ints = std::vector<int>;
-    auto v1 = ints{1, 2, 3};
-    auto v2 = ints{1, 2};
-    std::mismatch(std::begin(v1), std::end(v1),
-                  std::begin(v2), std::end(v2));
-  }
-
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  eval "$as_CACHEVAR=yes"
-else
-  eval "$as_CACHEVAR=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS=$ax_check_save_flags
-fi
-eval ac_res=\$$as_CACHEVAR
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
-  CXX14_CXXFLAGS=$f
- break
-fi
-
-done
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-for f in '-std=c++17' '-std=c++17 -stdlib=libc++'
-do
-  as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$f" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
-$as_echo_n "checking whether C++ compiler accepts $f... " >&6; }
-if eval \${$as_CACHEVAR+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  ax_check_save_flags=$CXXFLAGS
-  CXXFLAGS="$CXXFLAGS  $f"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <vector>
-
-typedef std::vector<int> ints;
-
-
-#include <algorithm>
-#include <memory>
-#include <set>
-#include <sstream>
-#include <string>
-
-  // C++11
-  template <typename T>
-  struct check
-  {
-    static_assert(sizeof(int) <= sizeof(T), "not big enough");
-  };
-
-  using right_angle_brackets = check<check<bool>>;
-
-  auto f = std::make_shared<std::string>("shared_ptr");
-
-  int a;
-  decltype(a) b;
-
-  typedef check<int> check_type;
-  check_type c;
-  check_type&& cr = static_cast<check_type&&>(c);
-
-  auto d = a;
-
-  // Some versions of libstdc++ do not support std::set::emplace.
-  void foo()
-  {
-    std::set<int> is;
-    is.emplace(42);
-  }
-
-  // Clang++ 3.5, for a while, was unable to process properly
-  // the for-loop because its variable, r, is a typedef...
-  // It failed as follows:
-  //
-  // error: unexpected ':' in nested name specifier; did you mean '::'?
-  //    for (auto r: std::set<int>{1, 2})
-  //               ^
-  //               ::
-  using r = std::set<int>;
-  void bar()
-  {
-    for (int r: std::set<int>{1, 2})
-      continue;
-  }
-
-  // GCC 4.8.2 on Solaris 11.3 does not support to_string.
-  auto e = std::to_string(42);
-
-  // C++14
-  void mismatch()
-  {
-    using ints = std::vector<int>;
-    auto v1 = ints{1, 2, 3};
-    auto v2 = ints{1, 2};
-    std::mismatch(std::begin(v1), std::end(v1),
-                  std::begin(v2), std::end(v2));
-  }
-
-  // C++17
-  namespace ns1::ns2::ns3 {}
-
-#include <optional>
-  auto opt_string = std::optional<std::string>{};
-  auto out = std::ostringstream{};
-
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  eval "$as_CACHEVAR=yes"
-else
-  eval "$as_CACHEVAR=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS=$ax_check_save_flags
-fi
-eval ac_res=\$$as_CACHEVAR
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
-  CXX17_CXXFLAGS=$f
- break
-fi
-
-done
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-for f in '-std=c++2a' '-std=c++2a -stdlib=libc++'
-do
-  as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$f" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
-$as_echo_n "checking whether C++ compiler accepts $f... " >&6; }
-if eval \${$as_CACHEVAR+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  ax_check_save_flags=$CXXFLAGS
-  CXXFLAGS="$CXXFLAGS  $f"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <vector>
-
-typedef std::vector<int> ints;
-
-
-#include <algorithm>
-#include <memory>
-#include <set>
-#include <sstream>
-#include <string>
-
-  // C++11
-  template <typename T>
-  struct check
-  {
-    static_assert(sizeof(int) <= sizeof(T), "not big enough");
-  };
-
-  using right_angle_brackets = check<check<bool>>;
-
-  auto f = std::make_shared<std::string>("shared_ptr");
-
-  int a;
-  decltype(a) b;
-
-  typedef check<int> check_type;
-  check_type c;
-  check_type&& cr = static_cast<check_type&&>(c);
-
-  auto d = a;
-
-  // Some versions of libstdc++ do not support std::set::emplace.
-  void foo()
-  {
-    std::set<int> is;
-    is.emplace(42);
-  }
-
-  // Clang++ 3.5, for a while, was unable to process properly
-  // the for-loop because its variable, r, is a typedef...
-  // It failed as follows:
-  //
-  // error: unexpected ':' in nested name specifier; did you mean '::'?
-  //    for (auto r: std::set<int>{1, 2})
-  //               ^
-  //               ::
-  using r = std::set<int>;
-  void bar()
-  {
-    for (int r: std::set<int>{1, 2})
-      continue;
-  }
-
-  // GCC 4.8.2 on Solaris 11.3 does not support to_string.
-  auto e = std::to_string(42);
-
-  // C++14
-  void mismatch()
-  {
-    using ints = std::vector<int>;
-    auto v1 = ints{1, 2, 3};
-    auto v2 = ints{1, 2};
-    std::mismatch(std::begin(v1), std::end(v1),
-                  std::begin(v2), std::end(v2));
-  }
-
-  // C++17
-  namespace ns1::ns2::ns3 {}
-
-#include <optional>
-  auto opt_string = std::optional<std::string>{};
-  auto out = std::ostringstream{};
-
-  // C++2A
-
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  eval "$as_CACHEVAR=yes"
-else
-  eval "$as_CACHEVAR=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS=$ax_check_save_flags
-fi
-eval ac_res=\$$as_CACHEVAR
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
-  CXX2A_CXXFLAGS=$f
- break
-fi
-
-done
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
- if test x"$CXX11_CXXFLAGS" != x; then
-  ENABLE_CXX11_TRUE=
-  ENABLE_CXX11_FALSE='#'
-else
-  ENABLE_CXX11_TRUE='#'
-  ENABLE_CXX11_FALSE=
-fi
-
- if test x"$CXX14_CXXFLAGS" != x; then
-  ENABLE_CXX14_TRUE=
-  ENABLE_CXX14_FALSE='#'
-else
-  ENABLE_CXX14_TRUE='#'
-  ENABLE_CXX14_FALSE=
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-# Check whether --enable-gcc-warnings was given.
-if test "${enable_gcc_warnings+set}" = set; then :
-  enableval=$enable_gcc_warnings; case $enable_gcc_warnings in
-   yes|no) ;;
-   *)  as_fn_error $? "invalid value for --gcc-warnings: $enable_gcc_warnings" "$LINENO" 5;;
- esac
-else
-  enable_gcc_warnings=no
-fi
-
- if test "$enable_gcc_warnings" = yes; then
-  ENABLE_GCC_WARNINGS_TRUE=
-  ENABLE_GCC_WARNINGS_FALSE='#'
-else
-  ENABLE_GCC_WARNINGS_TRUE='#'
-  ENABLE_GCC_WARNINGS_FALSE=
-fi
-
-if test "$enable_gcc_warnings" = yes; then
-  # -Wno-tautological-constant-out-of-range-compare for Clang 3.3 and
-  # 3.4 on GNU/Linux that choke on intprops.h's INT_MULTIPLY_WRAPV,
-  # etc.
-  warn_common='-Wall -Wextra -Wcast-align
-    -fparse-all-comments -Wdocumentation
-    -Wformat -Wimplicit-fallthrough -Wnull-dereference
-    -Wno-sign-compare -Wno-tautological-constant-out-of-range-compare
-    -Wpointer-arith -Wshadow
-    -Wwrite-strings'
-  warn_c='-Wbad-function-cast -Wstrict-prototypes'
-  warn_cxx='-Wextra-semi -Wnoexcept -Wold-style-cast -Wundefined-func-template
-    -Wweak-vtables'
-  # Warnings for the test suite only.
-  #
-  # -fno-color-diagnostics: Clang's use of colors in the error
-  # messages is confusing the tests looking at the compiler's output
-  # (e.g., synclines.at).
-  #
-  # -Wno-keyword-macro: We use the "#define private public" dirty
-  # trick in the test suite to check some private implementation
-  # details for lalr1.cc.
-  warn_tests='-Wundef -pedantic -Wconversion
-    -Wdeprecated -Wsign-compare -Wsign-conversion
-    -Wtautological-constant-out-of-range-compare
-    -fno-color-diagnostics
-    -Wno-keyword-macro'
-
-
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-  # Clang supports many of GCC's -W options, but only issues warnings
-  # on the ones it does not recognize.  In that case, gl_WARN_ADD
-  # thinks the option is supported, and unknown options are then added
-  # to CFLAGS.  But then, when -Werror is added in the test suite for
-  # instance, the warning about the unknown option turns into an
-  # error.
-  #
-  # This should be addressed by gnulib's gl_WARN_ADD, but in the
-  # meanwhile, turn warnings about unknown options into errors in
-  # CFLAGS, and restore CFLAGS after the tests.
-  save_CFLAGS=$CFLAGS
-
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Werror -Wunknown-warning-option" >&5
-$as_echo_n "checking whether C compiler handles -Werror -Wunknown-warning-option... " >&6; }
-if ${gl_cv_warn_c__Werror__Wunknown_warning_option+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CFLAGS"
-  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Werror -Wunknown-warning-option"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_warn_c__Werror__Wunknown_warning_option=yes
-else
-  gl_cv_warn_c__Werror__Wunknown_warning_option=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Werror__Wunknown_warning_option" >&5
-$as_echo "$gl_cv_warn_c__Werror__Wunknown_warning_option" >&6; }
-if test "x$gl_cv_warn_c__Werror__Wunknown_warning_option" = xyes; then :
-  gl_unknown_warnings_are_errors='-Wunknown-warning-option -Werror'
-else
-  gl_unknown_warnings_are_errors=
-fi
-
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Werror=unknown-warning-option" >&5
-$as_echo_n "checking whether C compiler handles -Werror=unknown-warning-option... " >&6; }
-if ${gl_cv_warn_c__Werror_unknown_warning_option+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CFLAGS"
-  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Werror=unknown-warning-option"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_warn_c__Werror_unknown_warning_option=yes
-else
-  gl_cv_warn_c__Werror_unknown_warning_option=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Werror_unknown_warning_option" >&5
-$as_echo "$gl_cv_warn_c__Werror_unknown_warning_option" >&6; }
-if test "x$gl_cv_warn_c__Werror_unknown_warning_option" = xyes; then :
-  as_fn_append CFLAGS " -Werror=unknown-warning-option"
-fi
-
-
-  # Accept this warning only if it is not too touchy (e.g., clang 3.3
-  # and 3.4).
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Wunreachable-code" >&5
-$as_echo_n "checking whether C compiler handles -Wunreachable-code... " >&6; }
-if ${gl_cv_warn_c__Wunreachable_code+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CFLAGS"
-  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Wunreachable-code"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-if (sizeof (long) < sizeof (int)) return 1;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_warn_c__Wunreachable_code=yes
-else
-  gl_cv_warn_c__Wunreachable_code=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Wunreachable_code" >&5
-$as_echo "$gl_cv_warn_c__Wunreachable_code" >&6; }
-if test "x$gl_cv_warn_c__Wunreachable_code" = xyes; then :
-  as_fn_append WARN_CFLAGS " -Wunreachable-code"
-fi
-
-
-  for i in $warn_common $warn_c;
-  do
-
-
-as_gl_Warn=`$as_echo "gl_cv_warn_c_$i" | $as_tr_sh`
-gl_positive="$i"
-case $gl_positive in
-  -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles $i" >&5
-$as_echo_n "checking whether C compiler handles $i... " >&6; }
-if eval \${$as_gl_Warn+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CFLAGS"
-  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors $gl_positive"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  eval "$as_gl_Warn=yes"
-else
-  eval "$as_gl_Warn=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-eval ac_res=\$$as_gl_Warn
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_gl_Warn"\" = x"yes"; then :
-  as_fn_append WARN_CFLAGS " $i"
-fi
-
-
-  done
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Werror" >&5
-$as_echo_n "checking whether C compiler handles -Werror... " >&6; }
-if ${gl_cv_warn_c__Werror+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CFLAGS"
-  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Werror"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_warn_c__Werror=yes
-else
-  gl_cv_warn_c__Werror=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Werror" >&5
-$as_echo "$gl_cv_warn_c__Werror" >&6; }
-if test "x$gl_cv_warn_c__Werror" = xyes; then :
-  as_fn_append WERROR_CFLAGS " -Werror"
-fi
-
-
-
-  # Warnings for the test suite, and maybe for bison if GCC is modern
-  # enough.
-  test $lv_cv_gcc_pragma_push_works = yes &&
-    as_fn_append WARN_CFLAGS " $WARN_CFLAGS_TEST"
-
-  # Warnings for the test suite only.
-  for i in $warn_tests -Wincompatible-pointer-types;
-  do
-
-
-as_gl_Warn=`$as_echo "gl_cv_warn_c_$i" | $as_tr_sh`
-gl_positive="$i"
-case $gl_positive in
-  -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles $i" >&5
-$as_echo_n "checking whether C compiler handles $i... " >&6; }
-if eval \${$as_gl_Warn+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CFLAGS"
-  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors $gl_positive"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  eval "$as_gl_Warn=yes"
-else
-  eval "$as_gl_Warn=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-eval ac_res=\$$as_gl_Warn
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_gl_Warn"\" = x"yes"; then :
-  as_fn_append WARN_CFLAGS_TEST " $i"
-fi
-
-
-  done
-  CFLAGS=$save_CFLAGS
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-  ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-  save_CXXFLAGS=$CXXFLAGS
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Werror=unknown-warning-option" >&5
-$as_echo_n "checking whether C++ compiler handles -Werror=unknown-warning-option... " >&6; }
-if ${gl_cv_warn_cxx__Werror_unknown_warning_option+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CXXFLAGS"
-  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Werror=unknown-warning-option"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  gl_cv_warn_cxx__Werror_unknown_warning_option=yes
-else
-  gl_cv_warn_cxx__Werror_unknown_warning_option=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Werror_unknown_warning_option" >&5
-$as_echo "$gl_cv_warn_cxx__Werror_unknown_warning_option" >&6; }
-if test "x$gl_cv_warn_cxx__Werror_unknown_warning_option" = xyes; then :
-  as_fn_append CXXFLAGS " -Werror=unknown-warning-option"
-fi
-
-
-  for i in $warn_common $warn_cxx;
-  do
-
-
-as_gl_Warn=`$as_echo "gl_cv_warn_cxx_$i" | $as_tr_sh`
-gl_positive="$i"
-case $gl_positive in
-  -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles $i" >&5
-$as_echo_n "checking whether C++ compiler handles $i... " >&6; }
-if eval \${$as_gl_Warn+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CXXFLAGS"
-  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors $gl_positive"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  eval "$as_gl_Warn=yes"
-else
-  eval "$as_gl_Warn=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-eval ac_res=\$$as_gl_Warn
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_gl_Warn"\" = x"yes"; then :
-  as_fn_append WARN_CXXFLAGS " $i"
-fi
-
-
-  done
-  # Accept this warning only if it is not too touchy (e.g., clang 3.3
-  # and 3.4).
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Wunreachable-code" >&5
-$as_echo_n "checking whether C++ compiler handles -Wunreachable-code... " >&6; }
-if ${gl_cv_warn_cxx__Wunreachable_code+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CXXFLAGS"
-  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Wunreachable-code"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-if (sizeof (long) < sizeof (int)) return 1;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  gl_cv_warn_cxx__Wunreachable_code=yes
-else
-  gl_cv_warn_cxx__Wunreachable_code=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Wunreachable_code" >&5
-$as_echo "$gl_cv_warn_cxx__Wunreachable_code" >&6; }
-if test "x$gl_cv_warn_cxx__Wunreachable_code" = xyes; then :
-  as_fn_append WARN_CXXFLAGS " -Wunreachable-code"
-fi
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Wzero-as-null-pointer-constant" >&5
-$as_echo_n "checking whether C++ compiler handles -Wzero-as-null-pointer-constant... " >&6; }
-if ${gl_cv_warn_cxx__Wzero_as_null_pointer_constant+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CXXFLAGS"
-  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Wzero-as-null-pointer-constant"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-nullptr
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  gl_cv_warn_cxx__Wzero_as_null_pointer_constant=yes
-else
-  gl_cv_warn_cxx__Wzero_as_null_pointer_constant=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Wzero_as_null_pointer_constant" >&5
-$as_echo "$gl_cv_warn_cxx__Wzero_as_null_pointer_constant" >&6; }
-if test "x$gl_cv_warn_cxx__Wzero_as_null_pointer_constant" = xyes; then :
-  as_fn_append WARN_CXXFLAGS " -Wzero-as-null-pointer-constant"
-fi
-
-
-  # Before GCC6, the pragmas don't work well enough to neutralize
-  # this warning.
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Wuseless-cast" >&5
-$as_echo_n "checking whether C++ compiler handles -Wuseless-cast... " >&6; }
-if ${gl_cv_warn_cxx__Wuseless_cast+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CXXFLAGS"
-  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Wuseless-cast"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-              #if defined __GNUC__ && ! defined __ICC && ! defined __clang__ && __GNUC__ < 6
-              syntax error
-              #endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  gl_cv_warn_cxx__Wuseless_cast=yes
-else
-  gl_cv_warn_cxx__Wuseless_cast=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Wuseless_cast" >&5
-$as_echo "$gl_cv_warn_cxx__Wuseless_cast" >&6; }
-if test "x$gl_cv_warn_cxx__Wuseless_cast" = xyes; then :
-  as_fn_append WARN_CXXFLAGS " -Wuseless-cast"
-fi
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Werror" >&5
-$as_echo_n "checking whether C++ compiler handles -Werror... " >&6; }
-if ${gl_cv_warn_cxx__Werror+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CXXFLAGS"
-  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Werror"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  gl_cv_warn_cxx__Werror=yes
-else
-  gl_cv_warn_cxx__Werror=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Werror" >&5
-$as_echo "$gl_cv_warn_cxx__Werror" >&6; }
-if test "x$gl_cv_warn_cxx__Werror" = xyes; then :
-  as_fn_append WERROR_CXXFLAGS " -Werror"
-fi
-
-
-  # Warnings for the test suite only.
-  for i in $warn_tests;
-  do
-
-
-as_gl_Warn=`$as_echo "gl_cv_warn_cxx_$i" | $as_tr_sh`
-gl_positive="$i"
-case $gl_positive in
-  -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles $i" >&5
-$as_echo_n "checking whether C++ compiler handles $i... " >&6; }
-if eval \${$as_gl_Warn+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CXXFLAGS"
-  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors $gl_positive"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  eval "$as_gl_Warn=yes"
-else
-  eval "$as_gl_Warn=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-eval ac_res=\$$as_gl_Warn
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_gl_Warn"\" = x"yes"; then :
-  as_fn_append WARN_CXXFLAGS_TEST " $i"
-fi
-
-
-  done
-  # Too many compilers complain about Flex generated code.
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Wno-error" >&5
-$as_echo_n "checking whether C++ compiler handles -Wno-error... " >&6; }
-if ${gl_cv_warn_cxx__Wno_error+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CXXFLAGS"
-  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Werror"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  gl_cv_warn_cxx__Wno_error=yes
-else
-  gl_cv_warn_cxx__Wno_error=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Wno_error" >&5
-$as_echo "$gl_cv_warn_cxx__Wno_error" >&6; }
-if test "x$gl_cv_warn_cxx__Wno_error" = xyes; then :
-  as_fn_append FLEX_SCANNER_CXXFLAGS " -Wno-error"
-fi
-
-
-  # Clang++ deprecates compiling C.
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Wno-deprecated" >&5
-$as_echo_n "checking whether C++ compiler handles -Wno-deprecated... " >&6; }
-if ${gl_cv_warn_cxx__Wno_deprecated+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  gl_save_compiler_FLAGS="$CXXFLAGS"
-  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Wdeprecated"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  gl_cv_warn_cxx__Wno_deprecated=yes
-else
-  gl_cv_warn_cxx__Wno_deprecated=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CXXFLAGS="$gl_save_compiler_FLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Wno_deprecated" >&5
-$as_echo "$gl_cv_warn_cxx__Wno_deprecated" >&6; }
-if test "x$gl_cv_warn_cxx__Wno_deprecated" = xyes; then :
-  as_fn_append WNO_DEPRECATED_CXXFLAGS " -Wno-deprecated"
-fi
-
-
-  CXXFLAGS=$save_CXXFLAGS
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
-         int test_array[CHAR_BIT];
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compile a simple C program
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   BISON_C_WORKS=:
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports POSIXLY_CORRECT=1" >&5
-$as_echo_n "checking whether $CC supports POSIXLY_CORRECT=1... " >&6; }
-if ${bison_cv_c_supports_posixly_correct+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }'
-case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" </dev/null` in
-  xx) gl_had_POSIXLY_CORRECT=exported ;;
-  x)  gl_had_POSIXLY_CORRECT=yes      ;;
-  *)  gl_had_POSIXLY_CORRECT=         ;;
-esac
-POSIXLY_CORRECT=1
-export POSIXLY_CORRECT
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  bison_cv_c_supports_posixly_correct=yes
-else
-  bison_cv_c_supports_posixly_correct=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-case $gl_had_POSIXLY_CORRECT in
-  exported) ;;
-  yes) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;}; POSIXLY_CORRECT=1 ;;
-  *) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;} ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $bison_cv_c_supports_posixly_correct" >&5
-$as_echo "$bison_cv_c_supports_posixly_correct" >&6; }
-case $bison_cv_c_supports_posixly_correct in
-  yes) C_COMPILER_POSIXLY_CORRECT=true
- ;;
-  no)  C_COMPILER_POSIXLY_CORRECT=false
-;;
-esac
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX builds executables that work" >&5
-$as_echo_n "checking whether $CXX builds executables that work... " >&6; }
-if ${bison_cv_cxx_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-    bison_cv_cxx_works=no
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <cstdlib>
-          #include <iostream>
-          #include <map>
-          #include <string>
-          using namespace std;
-int
-main ()
-{
-std::cerr << "";
-          cout << "";
-          typedef std::pair<unsigned, int> uipair;
-          std::map<unsigned, int> m;
-          std::map<unsigned, int>::iterator i;
-          m.insert (uipair (4, -4));
-          for (i = m.begin (); i != m.end (); ++i)
-            if (i->first != 4)
-              return 1;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  if { ac_try='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_objext $LIBS >&5'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  if test "$cross_compiling" = yes; then :
-  bison_cv_cxx_works=cross
-else
-  if { ac_try='./conftest$ac_exeext'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  bison_cv_cxx_works=yes
-fi
-fi
-fi
-       rm -f conftest$ac_exeext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $bison_cv_cxx_works" >&5
-$as_echo "$bison_cv_cxx_works" >&6; }
-
- case $bison_cv_cxx_works in
-   yes)        BISON_CXX_WORKS=':';;
-   no | cross) BISON_CXX_WORKS='false';;
- esac
-
-
-  if test $bison_cv_cxx_works = yes; then
-  ENABLE_CXX_TRUE=
-  ENABLE_CXX_FALSE='#'
-else
-  ENABLE_CXX_TRUE='#'
-  ENABLE_CXX_FALSE=
-fi
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports POSIXLY_CORRECT=1" >&5
-$as_echo_n "checking whether $CXX supports POSIXLY_CORRECT=1... " >&6; }
-if ${bison_cv_cxx_supports_posixly_correct+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }'
-case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" </dev/null` in
-  xx) gl_had_POSIXLY_CORRECT=exported ;;
-  x)  gl_had_POSIXLY_CORRECT=yes      ;;
-  *)  gl_had_POSIXLY_CORRECT=         ;;
-esac
-POSIXLY_CORRECT=1
-export POSIXLY_CORRECT
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  bison_cv_cxx_supports_posixly_correct=yes
-else
-  bison_cv_cxx_supports_posixly_correct=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-case $gl_had_POSIXLY_CORRECT in
-  exported) ;;
-  yes) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;}; POSIXLY_CORRECT=1 ;;
-  *) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;} ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $bison_cv_cxx_supports_posixly_correct" >&5
-$as_echo "$bison_cv_cxx_supports_posixly_correct" >&6; }
-case $bison_cv_cxx_supports_posixly_correct in
-  yes) CXX_COMPILER_POSIXLY_CORRECT=true
- ;;
-  no)  CXX_COMPILER_POSIXLY_CORRECT=false
-;;
-esac
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-# D.
-for ac_prog in dmd
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DC"; then
-  ac_cv_prog_DC="$DC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_DC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DC=$ac_cv_prog_DC
-if test -n "$DC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DC" >&5
-$as_echo "$DC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$DC" && break
-done
-
-for ac_prog in -g
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DCFLAGS+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DCFLAGS"; then
-  ac_cv_prog_DCFLAGS="$DCFLAGS" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_DCFLAGS="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DCFLAGS=$ac_cv_prog_DCFLAGS
-if test -n "$DCFLAGS"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DCFLAGS" >&5
-$as_echo "$DCFLAGS" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$DCFLAGS" && break
-done
-
- if test x"$DC" != x; then
-  ENABLE_D_TRUE=
-  ENABLE_D_FALSE='#'
-else
-  ENABLE_D_TRUE='#'
-  ENABLE_D_FALSE=
-fi
-
-
-# Java.
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#if defined _WIN32 || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
-  yes
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "yes" >/dev/null 2>&1; then :
-  CLASSPATH_SEPARATOR=';'
-else
-  CLASSPATH_SEPARATOR=':'
-fi
-rm -f conftest*
-
-  source_version=1.7
-  test -n "$source_version" || {
-    as_fn_error $? "missing source-version argument to gt_JAVACOMP" "$LINENO" 5
-  }
-  target_version=1.7
-  case "$source_version" in
-    1.3) goodcode='class conftest {}'
-         failcode='class conftestfail { static { assert(true); } }' ;;
-    1.4) goodcode='class conftest     { static { assert(true); } }'
-         failcode='class conftestfail<T> { T foo() { return null; } }' ;;
-    1.5) goodcode='class conftest<T>     { T foo() { return null; } }'
-         failcode='class conftestfail { void foo () { switch ("A") {} } }' ;;
-    1.7) goodcode='class conftest     { void foo () { switch ("A") {} } }'
-         failcode='class conftestfail { void foo () { Runnable r = () -> {}; } }' ;;
-    1.8) goodcode='class conftest     { void foo () { Runnable r = () -> {}; } }'
-         failcode='interface conftestfail { private void foo () {} }' ;;
-    9)   goodcode='interface conftest     { private void foo () {} }'
-         failcode='class conftestfail { public void m() { var i = new Integer(0); } }' ;;
-    10)  goodcode='class conftest     { public void m() { var i = new Integer(0); } }'
-         failcode='class conftestfail { Readable r = (var b) -> 0; }' ;;
-    11)  goodcode='class conftest     { Readable r = (var b) -> 0; }'
-         failcode='class conftestfail syntax error' ;;
-    *) as_fn_error $? "invalid source-version argument to gt_JAVACOMP: $source_version" "$LINENO" 5 ;;
-  esac
-  case "$target_version" in
-    1.1) cfversion=45 ;;
-    1.2) cfversion=46 ;;
-    1.3) cfversion=47 ;;
-    1.4) cfversion=48 ;;
-    1.5) cfversion=49 ;;
-    1.6) cfversion=50 ;;
-    1.7) cfversion=51 ;;
-    1.8) cfversion=52 ;;
-    9)   cfversion=53 ;;
-    10)  cfversion=54 ;;
-    11)  cfversion=55 ;;
-    *) as_fn_error $? "invalid target-version argument to gt_JAVACOMP: $target_version" "$LINENO" 5 ;;
-  esac
-  # Function to output the classfile version of a file (8th byte) in decimal.
-  if od -A x < /dev/null >/dev/null 2>/dev/null; then
-    # Use POSIX od.
-    func_classfile_version ()
-    {
-      od -A n -t d1 -j 7 -N 1 "$1"
-    }
-  else
-    # Use BSD hexdump.
-    func_classfile_version ()
-    {
-      dd if="$1" bs=1 count=1 skip=7 2>/dev/null | hexdump -e '1/1 "%3d "'
-      echo
-    }
-  fi
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Java compiler" >&5
-$as_echo_n "checking for Java compiler... " >&6; }
-                                                                                                                                                                  CONF_JAVAC=
-  HAVE_JAVAC_ENVVAR=
-  HAVE_GCJ_C=
-  HAVE_JAVAC=
-  HAVE_JIKES=
-  HAVE_JAVACOMP=
-  cat > conftestlib.java <<EOF
-public class conftestlib {
-  public static void main (String[] args) {
-  }
-}
-EOF
-  echo "$goodcode" > conftest.java
-  echo "$failcode" > conftestfail.java
-        if test -n "$JAVAC"; then
-        if $JAVAC --version 2>/dev/null | sed -e 1q | grep gcj > /dev/null; then
-            if $JAVAC --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^4\.[012]/d' | grep '^[4-9]' >/dev/null; then
-                        rm -f conftest.class
-        if { echo "$as_me:10295: $JAVAC -d . conftest.java" >&5
-             $JAVAC -d . conftest.java >&5 2>&1
-           } \
-           && test -f conftest.class \
-           && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
-                    rm -f conftest.class
-          rm -f conftestfail.class
-          if { echo "$as_me:10302: $JAVAC -fsource=$source_version -d . conftest.java" >&5
-               $JAVAC -fsource="$source_version" -d . conftest.java >&5 2>&1
-             } \
-             && test -f conftest.class \
-             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
-             && { echo "$as_me:10307: $JAVAC -d . conftestfail.java" >&5
-                  $JAVAC -d . conftestfail.java >&5 2>&1
-                } \
-             && test -f conftestfail.class \
-             && ! { echo "$as_me:10311: $JAVAC -fsource=$source_version -d . conftestfail.java" >&5
-                    $JAVAC -fsource="$source_version" -d . conftestfail.java >&5 2>&1
-                  }; then
-            CONF_JAVAC="$JAVAC -fsource=$source_version"
-            HAVE_JAVAC_ENVVAR=1
-            HAVE_JAVACOMP=1
-          else
-            CONF_JAVAC="$JAVAC"
-            HAVE_JAVAC_ENVVAR=1
-            HAVE_JAVACOMP=1
-          fi
-        else
-                    rm -f conftest.class
-          rm -f conftestfail.class
-          if { echo "$as_me:10325: $JAVAC -fsource=$source_version -ftarget=$target_version -d . conftest.java" >&5
-               $JAVAC -fsource="$source_version" -ftarget="$target_version" -d . conftest.java >&5 2>&1
-             } \
-             && test -f conftest.class \
-             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
-            CONF_JAVAC="$JAVAC -fsource=$source_version -ftarget=$target_version"
-            HAVE_JAVAC_ENVVAR=1
-            HAVE_JAVACOMP=1
-          fi
-        fi
-      else
-                if test "$target_version" = 1.4 && test "$source_version" = 1.4; then
-                    rm -f conftest.class
-          if { echo "$as_me:10338: $JAVAC -d . conftest.java" >&5
-               $JAVAC -d . conftest.java >&5 2>&1
-             } \
-             && test -f conftest.class; then
-            CONF_JAVAC="$JAVAC"
-            HAVE_JAVAC_ENVVAR=1
-            HAVE_JAVACOMP=1
-          fi
-        else
-          if test "$target_version" = 1.4 && test "$source_version" = 1.3; then
-                                    javac_works=
-            rm -f conftest.class
-            if { echo "$as_me:10350: $JAVAC -d . conftest.java" >&5
-                 $JAVAC -d . conftest.java >&5 2>&1
-               } \
-               && test -f conftest.class; then
-              javac_works=1
-            fi
-            javac_noassert_works=
-            rm -f conftest.class
-            if { echo "$as_me:10358: $JAVAC -fno-assert -d . conftest.java" >&5
-                 $JAVAC -fno-assert -d . conftest.java >&5 2>&1
-               } \
-               && test -f conftest.class; then
-              javac_noassert_works=1
-            fi
-            if test -n "$javac_works" && test -n "$javac_noassert_works"; then
-              rm -f conftestfail.class
-              if { echo "$as_me:10366: $JAVAC -d . conftestfail.java" >&5
-                   $JAVAC -d . conftestfail.java >&5 2>&1
-                 } \
-                 && test -f conftestfail.class \
-                 && ! { echo "$as_me:10370: $JAVAC -fno-assert -d . conftestfail.java" >&5
-                        $JAVAC -fno-assert -d . conftestfail.java >&5 2>&1
-                      }; then
-                                javac_works=
-              fi
-            fi
-            if test -n "$javac_works"; then
-              CONF_JAVAC="$JAVAC"
-              HAVE_JAVAC_ENVVAR=1
-              HAVE_JAVACOMP=1
-            else
-              if test -n "$javac_noassert_works"; then
-                CONF_JAVAC="$JAVAC -fno-assert"
-                HAVE_JAVAC_ENVVAR=1
-                HAVE_JAVACOMP=1
-              fi
-            fi
-          fi
-        fi
-      fi
-    else
-                                    if test "$source_version" = 1.5; then
-        case "$target_version" in
-          1.1 | 1.2 | 1.3 | 1.4 | 1.5) ;;
-          *) source_version='1.6' ;;
-        esac
-      fi
-      rm -f conftest.class
-      if { echo "$as_me:10398: $JAVAC -d . conftest.java" >&5
-           $JAVAC -d . conftest.java >&5 2>&1
-         } \
-         && test -f conftest.class \
-         && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
-                rm -f conftest.class
-        rm -f conftestfail.class
-        if { echo "$as_me:10405: $JAVAC -source $source_version -d . conftest.java" >&5
-             $JAVAC -source "$source_version" -d . conftest.java >&5 2>&1
-           } \
-           && test -f conftest.class \
-           && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
-           && { echo "$as_me:10410: $JAVAC -d . conftestfail.java" >&5
-                $JAVAC -d . conftestfail.java >&5 2>&1
-              } \
-           && test -f conftestfail.class \
-           && ! { echo "$as_me:10414: $JAVAC -source $source_version -d . conftestfail.java" >&5
-                  $JAVAC -source "$source_version" -d . conftestfail.java >&5 2>&1
-                }; then
-          CONF_JAVAC="$JAVAC -source $source_version"
-          HAVE_JAVAC_ENVVAR=1
-          HAVE_JAVACOMP=1
-        else
-          CONF_JAVAC="$JAVAC"
-          HAVE_JAVAC_ENVVAR=1
-          HAVE_JAVACOMP=1
-        fi
-      else
-                        rm -f conftest.class
-        if { echo "$as_me:10427: $JAVAC -target $target_version -d . conftest.java" >&5
-             $JAVAC -target "$target_version" -d . conftest.java >&5 2>&1
-           } \
-           && test -f conftest.class \
-           && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
-                    rm -f conftest.class
-          rm -f conftestfail.class
-          if { echo "$as_me:10434: $JAVAC -target $target_version -source $source_version -d . conftest.java" >&5
-               $JAVAC -target "$target_version" -source "$source_version" -d . conftest.java >&5 2>&1
-             } \
-             && test -f conftest.class \
-             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
-             && { echo "$as_me:10439: $JAVAC -target $target_version -d . conftestfail.java" >&5
-                  $JAVAC -target "$target_version" -d . conftestfail.java >&5 2>&1
-                } \
-             && test -f conftestfail.class \
-             && ! { echo "$as_me:10443: $JAVAC -target $target_version -source $source_version -d . conftestfail.java" >&5
-                    $JAVAC -target "$target_version" -source "$source_version" -d . conftestfail.java >&5 2>&1
-                  }; then
-            CONF_JAVAC="$JAVAC -target $target_version -source $source_version"
-            HAVE_JAVAC_ENVVAR=1
-            HAVE_JAVACOMP=1
-          else
-            CONF_JAVAC="$JAVAC -target $target_version"
-            HAVE_JAVAC_ENVVAR=1
-            HAVE_JAVACOMP=1
-          fi
-        else
-                                        rm -f conftest.class
-          if { echo "$as_me:10456: $JAVAC -target $target_version -source $source_version -d . conftest.java" >&5
-               $JAVAC -target "$target_version" -source "$source_version" -d . conftest.java >&5 2>&1
-             } \
-             && test -f conftest.class \
-             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
-            CONF_JAVAC="$JAVAC -target $target_version -source $source_version"
-            HAVE_JAVAC_ENVVAR=1
-            HAVE_JAVACOMP=1
-          fi
-        fi
-      fi
-    fi
-  fi
-  if test -z "$HAVE_JAVACOMP"; then
-                # Extract the first word of "gcj", so it can be a program name with args.
-set dummy gcj; ac_word=$2
-:
-if ${ac_cv_prog_HAVE_GCJ_IN_PATH+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$HAVE_GCJ_IN_PATH"; then
-  ac_cv_prog_HAVE_GCJ_IN_PATH="$HAVE_GCJ_IN_PATH" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_HAVE_GCJ_IN_PATH="yes"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-HAVE_GCJ_IN_PATH=$ac_cv_prog_HAVE_GCJ_IN_PATH
-if test -n "$HAVE_GCJ_IN_PATH"; then
-  :
-else
-  :
-fi
-
-
-    # Extract the first word of "javac", so it can be a program name with args.
-set dummy javac; ac_word=$2
-:
-if ${ac_cv_prog_HAVE_JAVAC_IN_PATH+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$HAVE_JAVAC_IN_PATH"; then
-  ac_cv_prog_HAVE_JAVAC_IN_PATH="$HAVE_JAVAC_IN_PATH" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_HAVE_JAVAC_IN_PATH="yes"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-HAVE_JAVAC_IN_PATH=$ac_cv_prog_HAVE_JAVAC_IN_PATH
-if test -n "$HAVE_JAVAC_IN_PATH"; then
-  :
-else
-  :
-fi
-
-
-    # Extract the first word of "jikes", so it can be a program name with args.
-set dummy jikes; ac_word=$2
-:
-if ${ac_cv_prog_HAVE_JIKES_IN_PATH+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$HAVE_JIKES_IN_PATH"; then
-  ac_cv_prog_HAVE_JIKES_IN_PATH="$HAVE_JIKES_IN_PATH" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_HAVE_JIKES_IN_PATH="yes"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-HAVE_JIKES_IN_PATH=$ac_cv_prog_HAVE_JIKES_IN_PATH
-if test -n "$HAVE_JIKES_IN_PATH"; then
-  :
-else
-  :
-fi
-
-
-                if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_GCJ_IN_PATH"; then
-            if gcj --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^3\.[01]/d' | grep '^[3-9]' >/dev/null; then
-                if { echo "$as_me:10574: gcj -C -d . conftestlib.java" >&5
-             gcj -C -d . conftestlib.java >&5 2>&1
-           }; then
-                    if gcj --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^4\.[012]/d' | grep '^[4-9]' >/dev/null; then
-                                    rm -f conftest.class
-            if { echo "$as_me:10579: gcj -C -d . conftest.java" >&5
-                 gcj -C -d . conftest.java >&5 2>&1
-               } \
-               && test -f conftest.class \
-               && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
-                            rm -f conftest.class
-              rm -f conftestfail.class
-              if { echo "$as_me:10586: gcj -C -fsource=$source_version -d . conftest.java" >&5
-                   gcj -C -fsource="$source_version" -d . conftest.java >&5 2>&1
-                 } \
-                 && test -f conftest.class \
-                 && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
-                 && { echo "$as_me:10591: gcj -C -d . conftestfail.java" >&5
-                      gcj -C -d . conftestfail.java >&5 2>&1
-                    } \
-                 && test -f conftestfail.class \
-                 && ! { echo "$as_me:10595: gcj -C -fsource=$source_version -d . conftestfail.java" >&5
-                        gcj -C -fsource="$source_version" -d . conftestfail.java >&5 2>&1
-                      }; then
-                CONF_JAVAC="gcj -C -fsource=$source_version"
-                HAVE_JAVAC_ENVVAR=1
-                HAVE_JAVACOMP=1
-              else
-                CONF_JAVAC="gcj -C"
-                HAVE_JAVAC_ENVVAR=1
-                HAVE_JAVACOMP=1
-              fi
-            else
-                            rm -f conftest.class
-              rm -f conftestfail.class
-              if { echo "$as_me:10609: gcj -C -fsource=$source_version -ftarget=$target_version -d . conftest.java" >&5
-                   gcj -C -fsource="$source_version" -ftarget="$target_version" -d . conftest.java >&5 2>&1
-                 } \
-                 && test -f conftest.class \
-                 && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
-                CONF_JAVAC="gcj -C -fsource=$source_version -ftarget=$target_version"
-                HAVE_JAVAC_ENVVAR=1
-                HAVE_JAVACOMP=1
-              fi
-            fi
-          else
-                                                if test "$target_version" = 1.4 && test "$source_version" = 1.4; then
-              rm -f conftest.class
-              if { echo "$as_me:10622: gcj -C -d . conftest.java" >&5
-                   gcj -C -d . conftest.java >&5 2>&1
-                 } \
-                 && test -f conftest.class; then
-                CONF_JAVAC="gcj -C"
-                HAVE_GCJ_C=1
-                HAVE_JAVACOMP=1
-              fi
-            else
-              if test "$target_version" = 1.4 && test "$source_version" = 1.3; then
-                                                rm -f conftest.class
-                if { echo "$as_me:10633: gcj -C -fno-assert -d . conftest.java" >&5
-                     gcj -C -fno-assert -d . conftest.java >&5 2>&1
-                   } \
-                   && test -f conftest.class; then
-                  CONF_JAVAC="gcj -C -fno-assert"
-                  HAVE_GCJ_C=1
-                  HAVE_JAVACOMP=1
-                else
-                  rm -f conftest.class
-                  if { echo "$as_me:10642: gcj -C -d . conftest.java" >&5
-                       gcj -C -d . conftest.java >&5 2>&1
-                     } \
-                     && test -f conftest.class; then
-                    CONF_JAVAC="gcj -C"
-                    HAVE_GCJ_C=1
-                    HAVE_JAVACOMP=1
-                  fi
-                fi
-              fi
-            fi
-          fi
-        fi
-      fi
-    fi
-    if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_JAVAC_IN_PATH"; then
-            if { javac -version >/dev/null 2>/dev/null || test $? -le 2; } \
-         && ( if javac -help 2>&1 >/dev/null | grep at.dms.kjc.Main >/dev/null && javac -help 2>/dev/null | grep 'released.*2000' >/dev/null ; then exit 1; else exit 0; fi ); then
-                                        if test "$source_version" = 1.5; then
-          case "$target_version" in
-            1.1 | 1.2 | 1.3 | 1.4 | 1.5) ;;
-            *) source_version='1.6' ;;
-          esac
-        fi
-                        rm -f conftest.class
-        if { echo "$as_me:10667: javac -d . conftest.java" >&5
-             javac -d . conftest.java >&5 2>&1
-           } \
-           && test -f conftest.class \
-           && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
-                    rm -f conftest.class
-          rm -f conftestfail.class
-          if { echo "$as_me:10674: javac -source $source_version -d . conftest.java" >&5
-               javac -source "$source_version" -d . conftest.java >&5 2>&1
-             } \
-             && test -f conftest.class \
-             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
-             && { echo "$as_me:10679: javac -d . conftestfail.java" >&5
-                  javac -d . conftestfail.java >&5 2>&1
-                } \
-             && test -f conftestfail.class \
-             && ! { echo "$as_me:10683: javac -source $source_version -d . conftestfail.java" >&5
-                    javac -source "$source_version" -d . conftestfail.java >&5 2>&1
-                  }; then
-            CONF_JAVAC="javac -source $source_version"
-            HAVE_JAVAC=1
-            HAVE_JAVACOMP=1
-          else
-            CONF_JAVAC="javac"
-            HAVE_JAVAC=1
-            HAVE_JAVACOMP=1
-          fi
-        else
-                              rm -f conftest.class
-          if { echo "$as_me:10696: javac -target $target_version -d . conftest.java" >&5
-               javac -target "$target_version" -d . conftest.java >&5 2>&1
-             } \
-             && test -f conftest.class \
-             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
-                        rm -f conftest.class
-            rm -f conftestfail.class
-            if { echo "$as_me:10703: javac -target $target_version -source $source_version -d . conftest.java" >&5
-                 javac -target "$target_version" -source "$source_version" -d . conftest.java >&5 2>&1
-               } \
-               && test -f conftest.class \
-               && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
-               && { echo "$as_me:10708: javac -target $target_version -d . conftestfail.java" >&5
-                    javac -target "$target_version" -d . conftestfail.java >&5 2>&1
-                  } \
-               && test -f conftestfail.class \
-               && ! { echo "$as_me:10712: javac -target $target_version -source $source_version -d . conftestfail.java" >&5
-                      javac -target "$target_version" -source "$source_version" -d . conftestfail.java >&5 2>&1
-                    }; then
-              CONF_JAVAC="javac -target $target_version -source $source_version"
-              HAVE_JAVAC=1
-              HAVE_JAVACOMP=1
-            else
-              CONF_JAVAC="javac -target $target_version"
-              HAVE_JAVAC=1
-              HAVE_JAVACOMP=1
-            fi
-          else
-                                                rm -f conftest.class
-            if { echo "$as_me:10725: javac -target $target_version -source $source_version -d . conftest.java" >&5
-                 javac -target "$target_version" -source "$source_version" -d . conftest.java >&5 2>&1
-               } \
-               && test -f conftest.class \
-               && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
-              CONF_JAVAC="javac -target $target_version -source $source_version"
-              HAVE_JAVAC=1
-              HAVE_JAVACOMP=1
-            fi
-          fi
-        fi
-      fi
-    fi
-    if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_JIKES_IN_PATH"; then
-            if { jikes >/dev/null 2>/dev/null || test $? = 1; } \
-         && (
-              # See if the existing CLASSPATH is sufficient to make jikes work.
-              unset JAVA_HOME
-              jikes conftestlib.java >&5 2>&1
-              error=$?
-              rm -f conftestlib.class
-              exit $error
-            ); then
-                                if test "$source_version" = 1.3; then
-          CONF_JAVAC="jikes"
-          HAVE_JIKES=1
-          HAVE_JAVACOMP=1
-        fi
-      fi
-    fi
-  fi
-  rm -f conftest*.java conftest*.class
-  if test -n "$HAVE_JAVACOMP"; then
-    ac_result="$CONF_JAVAC"
-  else
-    ac_result="no"
-  fi
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_result" >&5
-$as_echo "$ac_result" >&6; }
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Java virtual machine" >&5
-$as_echo_n "checking for Java virtual machine... " >&6; }
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#if defined _WIN32 || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
-  yes
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "yes" >/dev/null 2>&1; then :
-  CLASSPATH_SEPARATOR=';'
-else
-  CLASSPATH_SEPARATOR=':'
-fi
-rm -f conftest*
-
-  CONF_JAVA=
-  HAVE_JAVA_ENVVAR=
-  HAVE_GIJ=
-  HAVE_JAVA=
-  HAVE_JRE=
-  HAVE_JVIEW=
-  HAVE_JAVAEXEC=1
-  if test -n "$JAVA"; then
-    HAVE_JAVA_ENVVAR=1
-    CONF_JAVA="$JAVA"
-  else
-                # Extract the first word of "gij", so it can be a program name with args.
-set dummy gij; ac_word=$2
-:
-if ${ac_cv_prog_HAVE_GIJ_IN_PATH+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$HAVE_GIJ_IN_PATH"; then
-  ac_cv_prog_HAVE_GIJ_IN_PATH="$HAVE_GIJ_IN_PATH" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_HAVE_GIJ_IN_PATH="yes"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-HAVE_GIJ_IN_PATH=$ac_cv_prog_HAVE_GIJ_IN_PATH
-if test -n "$HAVE_GIJ_IN_PATH"; then
-  :
-else
-  :
-fi
-
-
-    # Extract the first word of "java", so it can be a program name with args.
-set dummy java; ac_word=$2
-:
-if ${ac_cv_prog_HAVE_JAVA_IN_PATH+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$HAVE_JAVA_IN_PATH"; then
-  ac_cv_prog_HAVE_JAVA_IN_PATH="$HAVE_JAVA_IN_PATH" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_HAVE_JAVA_IN_PATH="yes"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-HAVE_JAVA_IN_PATH=$ac_cv_prog_HAVE_JAVA_IN_PATH
-if test -n "$HAVE_JAVA_IN_PATH"; then
-  :
-else
-  :
-fi
-
-
-    # Extract the first word of "jre", so it can be a program name with args.
-set dummy jre; ac_word=$2
-:
-if ${ac_cv_prog_HAVE_JRE_IN_PATH+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$HAVE_JRE_IN_PATH"; then
-  ac_cv_prog_HAVE_JRE_IN_PATH="$HAVE_JRE_IN_PATH" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_HAVE_JRE_IN_PATH="yes"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-HAVE_JRE_IN_PATH=$ac_cv_prog_HAVE_JRE_IN_PATH
-if test -n "$HAVE_JRE_IN_PATH"; then
-  :
-else
-  :
-fi
-
-
-    # Extract the first word of "jview", so it can be a program name with args.
-set dummy jview; ac_word=$2
-:
-if ${ac_cv_prog_HAVE_JVIEW_IN_PATH+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$HAVE_JVIEW_IN_PATH"; then
-  ac_cv_prog_HAVE_JVIEW_IN_PATH="$HAVE_JVIEW_IN_PATH" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_HAVE_JVIEW_IN_PATH="yes"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-HAVE_JVIEW_IN_PATH=$ac_cv_prog_HAVE_JVIEW_IN_PATH
-if test -n "$HAVE_JVIEW_IN_PATH"; then
-  :
-else
-  :
-fi
-
-
-
-    export CLASSPATH
-    if test -n "$HAVE_GIJ_IN_PATH" \
-       && gij --version >/dev/null 2>/dev/null \
-       ; then
-      HAVE_GIJ=1
-      CONF_JAVA="gij"
-    else
-      if test -n "$HAVE_JAVA_IN_PATH" \
-         && java -version >/dev/null 2>/dev/null \
-         ; then
-        HAVE_JAVA=1
-        CONF_JAVA="java"
-      else
-        if test -n "$HAVE_JRE_IN_PATH" \
-           && (jre >/dev/null 2>/dev/null || test $? = 1) \
-           ; then
-          HAVE_JRE=1
-          CONF_JAVA="jre"
-        else
-          if test -n "$HAVE_JVIEW_IN_PATH" \
-             && (jview -? >/dev/null 2>/dev/null || test $? = 1) \
-             ; then
-            HAVE_JVIEW=1
-            CONF_JAVA="jview"
-          else
-            HAVE_JAVAEXEC=
-          fi
-        fi
-      fi
-    fi
-
-  fi
-  if test -n "$HAVE_JAVAEXEC"; then
-    ac_result="$CONF_JAVA"
-  else
-    ac_result="no"
-  fi
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_result" >&5
-$as_echo "$ac_result" >&6; }
-
-
-
-
-
-
-
-
-
- if test x"$CONF_JAVAC" != x && test x"$CONF_JAVA" != x; then
-  ENABLE_JAVA_TRUE=
-  ENABLE_JAVA_FALSE='#'
-else
-  ENABLE_JAVA_TRUE='#'
-  ENABLE_JAVA_FALSE=
-fi
-
-
-
-# Check whether --enable-yacc was given.
-if test "${enable_yacc+set}" = set; then :
-  enableval=$enable_yacc;
-else
-  enable_yacc=yes
-fi
-
- if test "$enable_yacc" = yes; then
-  ENABLE_YACC_TRUE=
-  ENABLE_YACC_FALSE='#'
-else
-  ENABLE_YACC_TRUE='#'
-  ENABLE_YACC_FALSE=
-fi
-
-ac_config_files="$ac_config_files src/yacc"
-
-
-# Checks for programs.
-
-DOT=${DOT-"${am_missing_run}dot"}
-
-for ac_prog in flex lex
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_LEX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$LEX"; then
-  ac_cv_prog_LEX="$LEX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_LEX="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-LEX=$ac_cv_prog_LEX
-if test -n "$LEX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5
-$as_echo "$LEX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$LEX" && break
-done
-test -n "$LEX" || LEX=":"
-
-if test "x$LEX" != "x:"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lex is flex" >&5
-$as_echo_n "checking whether lex is flex... " >&6; }
-if ${ac_cv_prog_lex_is_flex+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.l <<_ACEOF
-%option debug nodefault noinput nounput noyywrap never-interactive
-%x SC_CONF_TEST
-%%
-a { BEGIN SC_CONF_TEST; }
-_ACEOF
-if { { ac_try="$LEX conftest.l"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$LEX conftest.l") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  ac_cv_prog_lex_is_flex=yes
-else
-  ac_cv_prog_lex_is_flex=no
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_is_flex" >&5
-$as_echo "$ac_cv_prog_lex_is_flex" >&6; }
-
-cat >conftest.l <<_ACEOF
-%%
-a { ECHO; }
-b { REJECT; }
-c { yymore (); }
-d { yyless (1); }
-e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument.  */
-    yyless ((input () != 0)); }
-f { unput (yytext[0]); }
-. { BEGIN INITIAL; }
-%%
-#ifdef YYTEXT_POINTER
-extern char *yytext;
-#endif
-int
-main (void)
-{
-  return ! yylex () + ! yywrap ();
-}
-_ACEOF
-{ { ac_try="$LEX conftest.l"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$LEX conftest.l") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5
-$as_echo_n "checking lex output file root... " >&6; }
-if ${ac_cv_prog_lex_root+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-if test -f lex.yy.c; then
-  ac_cv_prog_lex_root=lex.yy
-elif test -f lexyy.c; then
-  ac_cv_prog_lex_root=lexyy
-else
-  as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5
-$as_echo "$ac_cv_prog_lex_root" >&6; }
-LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root
-
-if test -z "${LEXLIB+set}"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5
-$as_echo_n "checking lex library... " >&6; }
-if ${ac_cv_lib_lex+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-    ac_save_LIBS=$LIBS
-    ac_cv_lib_lex='none needed'
-    for ac_lib in '' -lfl -ll; do
-      LIBS="$ac_lib $ac_save_LIBS"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-`cat $LEX_OUTPUT_ROOT.c`
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_lex=$ac_lib
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-      test "$ac_cv_lib_lex" != 'none needed' && break
-    done
-    LIBS=$ac_save_LIBS
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5
-$as_echo "$ac_cv_lib_lex" >&6; }
-  test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5
-$as_echo_n "checking whether yytext is a pointer... " >&6; }
-if ${ac_cv_prog_lex_yytext_pointer+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  # POSIX says lex can declare yytext either as a pointer or an array; the
-# default is implementation-dependent.  Figure out which it is, since
-# not all implementations provide the %pointer and %array declarations.
-ac_cv_prog_lex_yytext_pointer=no
-ac_save_LIBS=$LIBS
-LIBS="$LEXLIB $ac_save_LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-  #define YYTEXT_POINTER 1
-`cat $LEX_OUTPUT_ROOT.c`
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_prog_lex_yytext_pointer=yes
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_save_LIBS
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5
-$as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; }
-if test $ac_cv_prog_lex_yytext_pointer = yes; then
-
-$as_echo "#define YYTEXT_POINTER 1" >>confdefs.h
-
-fi
-rm -f conftest.l $LEX_OUTPUT_ROOT.c
-
-fi
-LEX_IS_FLEX=`test "$ac_cv_prog_lex_is_flex" = yes && echo true || echo false`
-
-if ! "$LEX_IS_FLEX" || test "X$LEX" = X:; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: bypassing lex because flex is required" >&5
-$as_echo "$as_me: WARNING: bypassing lex because flex is required" >&2;}
-  LEX=:
-fi
- if $LEX_IS_FLEX; then
-  FLEX_WORKS_TRUE=
-  FLEX_WORKS_FALSE='#'
-else
-  FLEX_WORKS_TRUE='#'
-  FLEX_WORKS_FALSE=
-fi
-
- if $LEX_IS_FLEX && test $bison_cv_cxx_works = yes; then
-  FLEX_CXX_WORKS_TRUE=
-  FLEX_CXX_WORKS_FALSE='#'
-else
-  FLEX_CXX_WORKS_TRUE='#'
-  FLEX_CXX_WORKS_FALSE=
-fi
-
-for ac_prog in 'bison -y' byacc
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_YACC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$YACC"; then
-  ac_cv_prog_YACC="$YACC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_YACC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-YACC=$ac_cv_prog_YACC
-if test -n "$YACC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5
-$as_echo "$YACC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$YACC" && break
-done
-test -n "$YACC" || YACC="yacc"
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_RANLIB+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU M4 that supports accurate traces" >&5
-$as_echo_n "checking for GNU M4 that supports accurate traces... " >&6; }
-if ${ac_cv_path_M4+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -f conftest.m4f
-ac_had_posixly_correct=${POSIXLY_CORRECT:+yes}
-{ POSIXLY_CORRECT=; unset POSIXLY_CORRECT;}
-if test -z "$M4"; then
-  ac_path_M4_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in m4 gm4 gnum4; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_M4="$as_dir/$ac_prog$ac_exec_ext"
-      as_fn_executable_p "$ac_path_M4" || continue
-      # Root out GNU M4 1.4.5, as well as non-GNU m4 that ignore -t, -F.
-      # Root out GNU M4 1.4.15 with buggy false negative replacement strstr.
-      # Root out Glibc 2.9 - 2.12 and GNU M4 1.4.11 - 1.4.15 with buggy
-      # false positive strstr.
-      ac_snippet=change'quote(<,>)in''dir(<if''def>,mac,bug)'
-      ac_snippet=${ac_snippet}pat'subst(a,\(b\)\|\(a\),\1)d'nl
-      ac_snippet=${ac_snippet}${as_nl}if'else(in''dex(..wi.d.,.d.),-1,bug)'
-      ac_snippet=${ac_snippet}${as_nl}if'else(in''dex(;:11-:12-:12-:12-:12-:12-:12-:12-:12.:12.:12.:12.:12.:12.:12.:12.:12-,:12-:12-:12-:12-:12-:12-:12-:12-),-1,,strstr-bug2)'
-      test -z "`$ac_path_M4 -F conftest.m4f </dev/null 2>&1`" \
-      && test -z "`$as_echo $ac_snippet | $ac_path_M4 --trace=mac 2>&1`" \
-      && test -f conftest.m4f \
-      && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:
-      rm -f conftest.m4f
-      $ac_path_M4_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_M4"; then
-    as_fn_error $? "no acceptable m4 could be found in \$PATH.
-GNU M4 1.4.6 or later is required; 1.4.16 or newer is recommended.
-GNU M4 1.4.15 uses a buggy replacement strstr on some systems.
-Glibc 2.9 - 2.12 and GNU M4 1.4.11 - 1.4.15 have another strstr bug." "$LINENO" 5
-  fi
-else
-  ac_cv_path_M4=$M4
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_M4" >&5
-$as_echo "$ac_cv_path_M4" >&6; }
-  M4=$ac_cv_path_M4
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $ac_cv_path_M4 accepts --gnu" >&5
-$as_echo_n "checking whether $ac_cv_path_M4 accepts --gnu... " >&6; }
-if ${ac_cv_prog_gnu_m4_gnu+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case `$M4 --help < /dev/null 2>&1` in
-      *--gnu*) ac_cv_prog_gnu_m4_gnu=yes ;;
-      *) ac_cv_prog_gnu_m4_gnu=no ;;
-    esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gnu_m4_gnu" >&5
-$as_echo "$ac_cv_prog_gnu_m4_gnu" >&6; }
-  if test "$ac_cv_prog_gnu_m4_gnu" = yes; then
-    M4_GNU=--gnu
-  else
-    M4_GNU=
-  fi
-
-  if test x$ac_had_posixly_correct = xyes; then
-    POSIXLY_CORRECT=:
-    if test $ac_cv_prog_gnu_m4_gnu = no; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: the version of M4 that was found does not support -g" >&5
-$as_echo "$as_me: WARNING: the version of M4 that was found does not support -g" >&2;}
-      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using it with POSIXLY_CORRECT set may cause problems" >&5
-$as_echo "$as_me: WARNING: using it with POSIXLY_CORRECT set may cause problems" >&2;}
-    fi
-  fi
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how m4 supports trace files" >&5
-$as_echo_n "checking how m4 supports trace files... " >&6; }
-if ${ac_cv_prog_gnu_m4_debugfile+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case `$M4 --help < /dev/null 2>&1` in
-      *debugfile*) ac_cv_prog_gnu_m4_debugfile=--debugfile ;;
-      *) ac_cv_prog_gnu_m4_debugfile=--error-output ;;
-    esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gnu_m4_debugfile" >&5
-$as_echo "$ac_cv_prog_gnu_m4_debugfile" >&6; }
-  M4_DEBUGFILE=$ac_cv_prog_gnu_m4_debugfile
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define M4 "$M4"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define M4_GNU_OPTION "$M4_GNU"
-_ACEOF
-
-# Extract the first word of "perl", so it can be a program name with args.
-set dummy perl; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_PERL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $PERL in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-  ;;
-esac
-fi
-PERL=$ac_cv_path_PERL
-if test -n "$PERL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
-$as_echo "$PERL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-HELP2MAN=${HELP2MAN-"${am_missing_run}help2man"}
-
-# Extract the first word of "xsltproc", so it can be a program name with args.
-set dummy xsltproc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_XSLTPROC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $XSLTPROC in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_XSLTPROC="$XSLTPROC" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_XSLTPROC="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-  ;;
-esac
-fi
-XSLTPROC=$ac_cv_path_XSLTPROC
-if test -n "$XSLTPROC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XSLTPROC" >&5
-$as_echo "$XSLTPROC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-
-# Checks for header files.
-
-
-
-  for ac_header in $ac_header_list
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-
-
-
-# Checks for compiler characteristics.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
-$as_echo_n "checking for inline... " >&6; }
-if ${ac_cv_c_inline+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_c_inline=no
-for ac_kw in inline __inline__ __inline; do
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifndef __cplusplus
-typedef int foo_t;
-static $ac_kw foo_t static_foo () {return 0; }
-$ac_kw foo_t foo () {return 0; }
-#endif
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_inline=$ac_kw
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  test "$ac_cv_c_inline" != no && break
-done
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
-$as_echo "$ac_cv_c_inline" >&6; }
-
-case $ac_cv_c_inline in
-  inline | yes) ;;
-  *)
-    case $ac_cv_c_inline in
-      no) ac_val=;;
-      *) ac_val=$ac_cv_c_inline;;
-    esac
-    cat >>confdefs.h <<_ACEOF
-#ifndef __cplusplus
-#define inline $ac_val
-#endif
-_ACEOF
-    ;;
-esac
-
-
-# Gnulib (later checks).  Putting them here rather than right after
-# gl_EARLY avoids some redundant checks.
-
-
-
-
-
-
-                        # Check whether --enable-cross-guesses was given.
-if test "${enable_cross_guesses+set}" = set; then :
-  enableval=$enable_cross_guesses; if test "x$enableval" != xconservative && test "x$enableval" != xrisky; then
-       { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-cross-guesses" >&5
-$as_echo "$as_me: WARNING: invalid argument supplied to --enable-cross-guesses" >&2;}
-       enableval=conservative
-     fi
-     gl_cross_guesses="$enableval"
-else
-  gl_cross_guesses=conservative
-fi
-
-  if test $gl_cross_guesses = risky; then
-    gl_cross_guess_normal="guessing yes"
-    gl_cross_guess_inverted="guessing no"
-  else
-    gl_cross_guess_normal="guessing no"
-    gl_cross_guess_inverted="guessing yes"
-  fi
-          LIBC_FATAL_STDERR_=1
-  export LIBC_FATAL_STDERR_
-
-ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
-if test "x$ac_cv_type_size_t" = xyes; then :
-
-else
-
-cat >>confdefs.h <<_ACEOF
-#define size_t unsigned int
-_ACEOF
-
-fi
-
-# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
-# for constant arguments.  Useless!
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
-$as_echo_n "checking for working alloca.h... " >&6; }
-if ${ac_cv_working_alloca_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <alloca.h>
-int
-main ()
-{
-char *p = (char *) alloca (2 * sizeof (int));
-			  if (p) return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_working_alloca_h=yes
-else
-  ac_cv_working_alloca_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
-$as_echo "$ac_cv_working_alloca_h" >&6; }
-if test $ac_cv_working_alloca_h = yes; then
-
-$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
-$as_echo_n "checking for alloca... " >&6; }
-if ${ac_cv_func_alloca_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __GNUC__
-# define alloca __builtin_alloca
-#else
-# ifdef _MSC_VER
-#  include <malloc.h>
-#  define alloca _alloca
-# else
-#  ifdef HAVE_ALLOCA_H
-#   include <alloca.h>
-#  else
-#   ifdef _AIX
- #pragma alloca
-#   else
-#    ifndef alloca /* predefined by HP cc +Olibcalls */
-void *alloca (size_t);
-#    endif
-#   endif
-#  endif
-# endif
-#endif
-
-int
-main ()
-{
-char *p = (char *) alloca (1);
-				    if (p) return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_func_alloca_works=yes
-else
-  ac_cv_func_alloca_works=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
-$as_echo "$ac_cv_func_alloca_works" >&6; }
-
-if test $ac_cv_func_alloca_works = yes; then
-
-$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h
-
-else
-  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
-# that cause trouble.  Some versions do not even contain alloca or
-# contain a buggy version.  If you still want to use their alloca,
-# use ar to extract alloca.o from them instead of compiling alloca.c.
-
-
-
-
-
-ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
-
-$as_echo "#define C_ALLOCA 1" >>confdefs.h
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5
-$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
-if ${ac_cv_os_cray+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#if defined CRAY && ! defined CRAY2
-webecray
-#else
-wenotbecray
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "webecray" >/dev/null 2>&1; then :
-  ac_cv_os_cray=yes
-else
-  ac_cv_os_cray=no
-fi
-rm -f conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5
-$as_echo "$ac_cv_os_cray" >&6; }
-if test $ac_cv_os_cray = yes; then
-  for ac_func in _getb67 GETB67 getb67; do
-    as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-
-cat >>confdefs.h <<_ACEOF
-#define CRAY_STACKSEG_END $ac_func
-_ACEOF
-
-    break
-fi
-
-  done
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
-$as_echo_n "checking stack direction for C alloca... " >&6; }
-if ${ac_cv_c_stack_direction+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ac_cv_c_stack_direction=0
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-int
-find_stack_direction (int *addr, int depth)
-{
-  int dir, dummy = 0;
-  if (! addr)
-    addr = &dummy;
-  *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
-  dir = depth ? find_stack_direction (addr, depth - 1) : 0;
-  return dir + dummy;
-}
-
-int
-main (int argc, char **argv)
-{
-  return find_stack_direction (0, argc + !argv + 20) < 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_c_stack_direction=1
-else
-  ac_cv_c_stack_direction=-1
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
-$as_echo "$ac_cv_c_stack_direction" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define STACK_DIRECTION $ac_cv_c_stack_direction
-_ACEOF
-
-
-fi
-
-
-  GNULIB__EXIT=0;
-  GNULIB_ATOLL=0;
-  GNULIB_CALLOC_POSIX=0;
-  GNULIB_CANONICALIZE_FILE_NAME=0;
-  GNULIB_GETLOADAVG=0;
-  GNULIB_GETSUBOPT=0;
-  GNULIB_GRANTPT=0;
-  GNULIB_MALLOC_POSIX=0;
-  GNULIB_MBTOWC=0;
-  GNULIB_MKDTEMP=0;
-  GNULIB_MKOSTEMP=0;
-  GNULIB_MKOSTEMPS=0;
-  GNULIB_MKSTEMP=0;
-  GNULIB_MKSTEMPS=0;
-  GNULIB_POSIX_OPENPT=0;
-  GNULIB_PTSNAME=0;
-  GNULIB_PTSNAME_R=0;
-  GNULIB_PUTENV=0;
-  GNULIB_QSORT_R=0;
-  GNULIB_RANDOM=0;
-  GNULIB_RANDOM_R=0;
-  GNULIB_REALLOCARRAY=0;
-  GNULIB_REALLOC_POSIX=0;
-  GNULIB_REALPATH=0;
-  GNULIB_RPMATCH=0;
-  GNULIB_SECURE_GETENV=0;
-  GNULIB_SETENV=0;
-  GNULIB_STRTOD=0;
-  GNULIB_STRTOLD=0;
-  GNULIB_STRTOLL=0;
-  GNULIB_STRTOULL=0;
-  GNULIB_SYSTEM_POSIX=0;
-  GNULIB_UNLOCKPT=0;
-  GNULIB_UNSETENV=0;
-  GNULIB_WCTOMB=0;
-    HAVE__EXIT=1;
-  HAVE_ATOLL=1;
-  HAVE_CANONICALIZE_FILE_NAME=1;
-  HAVE_DECL_GETLOADAVG=1;
-  HAVE_GETSUBOPT=1;
-  HAVE_GRANTPT=1;
-  HAVE_INITSTATE=1;
-  HAVE_DECL_INITSTATE=1;
-  HAVE_MBTOWC=1;
-  HAVE_MKDTEMP=1;
-  HAVE_MKOSTEMP=1;
-  HAVE_MKOSTEMPS=1;
-  HAVE_MKSTEMP=1;
-  HAVE_MKSTEMPS=1;
-  HAVE_POSIX_OPENPT=1;
-  HAVE_PTSNAME=1;
-  HAVE_PTSNAME_R=1;
-  HAVE_QSORT_R=1;
-  HAVE_RANDOM=1;
-  HAVE_RANDOM_H=1;
-  HAVE_RANDOM_R=1;
-  HAVE_REALLOCARRAY=1;
-  HAVE_REALPATH=1;
-  HAVE_RPMATCH=1;
-  HAVE_SECURE_GETENV=1;
-  HAVE_SETENV=1;
-  HAVE_DECL_SETENV=1;
-  HAVE_SETSTATE=1;
-  HAVE_DECL_SETSTATE=1;
-  HAVE_STRTOD=1;
-  HAVE_STRTOLD=1;
-  HAVE_STRTOLL=1;
-  HAVE_STRTOULL=1;
-  HAVE_STRUCT_RANDOM_DATA=1;
-  HAVE_SYS_LOADAVG_H=0;
-  HAVE_UNLOCKPT=1;
-  HAVE_DECL_UNSETENV=1;
-  REPLACE_CALLOC=0;
-  REPLACE_CANONICALIZE_FILE_NAME=0;
-  REPLACE_INITSTATE=0;
-  REPLACE_MALLOC=0;
-  REPLACE_MBTOWC=0;
-  REPLACE_MKSTEMP=0;
-  REPLACE_PTSNAME=0;
-  REPLACE_PTSNAME_R=0;
-  REPLACE_PUTENV=0;
-  REPLACE_QSORT_R=0;
-  REPLACE_RANDOM=0;
-  REPLACE_RANDOM_R=0;
-  REPLACE_REALLOC=0;
-  REPLACE_REALPATH=0;
-  REPLACE_SETENV=0;
-  REPLACE_SETSTATE=0;
-  REPLACE_STRTOD=0;
-  REPLACE_STRTOLD=0;
-  REPLACE_UNSETENV=0;
-  REPLACE_WCTOMB=0;
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether malloc, realloc, calloc are POSIX compliant" >&5
-$as_echo_n "checking whether malloc, realloc, calloc are POSIX compliant... " >&6; }
-if ${gl_cv_func_malloc_posix+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-                        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#if defined _WIN32 && ! defined __CYGWIN__
-             choke me
-             #endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_func_malloc_posix=yes
-else
-  gl_cv_func_malloc_posix=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_malloc_posix" >&5
-$as_echo "$gl_cv_func_malloc_posix" >&6; }
-
-
-
-
-  for ac_func in $ac_func_list
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether // is distinct from /" >&5
-$as_echo_n "checking whether // is distinct from /... " >&6; }
-if ${gl_cv_double_slash_root+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-   if test x"$cross_compiling" = xyes ; then
-        # When cross-compiling, there is no way to tell whether // is special
-        # short of a list of hosts.  However, the only known hosts to date
-        # that have a distinct // are Apollo DomainOS (too old to port to),
-        # Cygwin, and z/OS.  If anyone knows of another system for which // has
-        # special semantics and is distinct from /, please report it to
-        # <bug-gnulib@gnu.org>.
-        case $host in
-          *-cygwin | i370-ibm-openedition)
-            gl_cv_double_slash_root=yes ;;
-          *)
-            # Be optimistic and assume that / and // are the same when we
-            # don't know.
-            gl_cv_double_slash_root='unknown, assuming no' ;;
-        esac
-      else
-        set x `ls -di / // 2>/dev/null`
-        if test "$2" = "$4" && wc //dev/null >/dev/null 2>&1; then
-          gl_cv_double_slash_root=no
-        else
-          gl_cv_double_slash_root=yes
-        fi
-      fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_double_slash_root" >&5
-$as_echo "$gl_cv_double_slash_root" >&6; }
-  if test "$gl_cv_double_slash_root" = yes; then
-
-$as_echo "#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether realpath works" >&5
-$as_echo_n "checking whether realpath works... " >&6; }
-if ${gl_cv_func_realpath_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-    touch conftest.a
-    mkdir conftest.d
-    if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                       # Guess yes on glibc systems.
-        *-gnu* | gnu*) gl_cv_func_realpath_works="guessing yes" ;;
-                       # Guess yes on musl systems.
-        *-musl*)       gl_cv_func_realpath_works="guessing yes" ;;
-                       # Guess no on native Windows.
-        mingw*)        gl_cv_func_realpath_works="guessing no" ;;
-                       # If we don't know, obey --enable-cross-guesses.
-        *)             gl_cv_func_realpath_works="$gl_cross_guess_normal" ;;
-      esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-
-#include <stdlib.h>
-#if defined __MACH__ && defined __APPLE__
-/* Avoid a crash on Mac OS X.  */
-#include <mach/mach.h>
-#include <mach/mach_error.h>
-#include <mach/thread_status.h>
-#include <mach/exception.h>
-#include <mach/task.h>
-#include <pthread.h>
-/* The exception port on which our thread listens.  */
-static mach_port_t our_exception_port;
-/* The main function of the thread listening for exceptions of type
-   EXC_BAD_ACCESS.  */
-static void *
-mach_exception_thread (void *arg)
-{
-  /* Buffer for a message to be received.  */
-  struct {
-    mach_msg_header_t head;
-    mach_msg_body_t msgh_body;
-    char data[1024];
-  } msg;
-  mach_msg_return_t retval;
-  /* Wait for a message on the exception port.  */
-  retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
-                     our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
-  if (retval != MACH_MSG_SUCCESS)
-    abort ();
-  exit (1);
-}
-static void
-nocrash_init (void)
-{
-  mach_port_t self = mach_task_self ();
-  /* Allocate a port on which the thread shall listen for exceptions.  */
-  if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
-      == KERN_SUCCESS) {
-    /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html.  */
-    if (mach_port_insert_right (self, our_exception_port, our_exception_port,
-                                MACH_MSG_TYPE_MAKE_SEND)
-        == KERN_SUCCESS) {
-      /* The exceptions we want to catch.  Only EXC_BAD_ACCESS is interesting
-         for us.  */
-      exception_mask_t mask = EXC_MASK_BAD_ACCESS;
-      /* Create the thread listening on the exception port.  */
-      pthread_attr_t attr;
-      pthread_t thread;
-      if (pthread_attr_init (&attr) == 0
-          && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
-          && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
-        pthread_attr_destroy (&attr);
-        /* Replace the exception port info for these exceptions with our own.
-           Note that we replace the exception port for the entire task, not only
-           for a particular thread.  This has the effect that when our exception
-           port gets the message, the thread specific exception port has already
-           been asked, and we don't need to bother about it.
-           See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html.  */
-        task_set_exception_ports (self, mask, our_exception_port,
-                                  EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
-      }
-    }
-  }
-}
-#elif defined _WIN32 && ! defined __CYGWIN__
-/* Avoid a crash on native Windows.  */
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <winerror.h>
-static LONG WINAPI
-exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
-{
-  switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
-    {
-    case EXCEPTION_ACCESS_VIOLATION:
-    case EXCEPTION_IN_PAGE_ERROR:
-    case EXCEPTION_STACK_OVERFLOW:
-    case EXCEPTION_GUARD_PAGE:
-    case EXCEPTION_PRIV_INSTRUCTION:
-    case EXCEPTION_ILLEGAL_INSTRUCTION:
-    case EXCEPTION_DATATYPE_MISALIGNMENT:
-    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
-    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
-      exit (1);
-    }
-  return EXCEPTION_CONTINUE_SEARCH;
-}
-static void
-nocrash_init (void)
-{
-  SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
-}
-#else
-/* Avoid a crash on POSIX systems.  */
-#include <signal.h>
-#include <unistd.h>
-/* A POSIX signal handler.  */
-static void
-exception_handler (int sig)
-{
-  _exit (1);
-}
-static void
-nocrash_init (void)
-{
-#ifdef SIGSEGV
-  signal (SIGSEGV, exception_handler);
-#endif
-#ifdef SIGBUS
-  signal (SIGBUS, exception_handler);
-#endif
-}
-#endif
-
-        #include <stdlib.h>
-        #include <string.h>
-
-int
-main ()
-{
-
-        int result = 0;
-        {
-          char *name = realpath ("conftest.a", NULL);
-          if (!(name && *name == '/'))
-            result |= 1;
-          free (name);
-        }
-        {
-          char *name = realpath ("conftest.b/../conftest.a", NULL);
-          if (name != NULL)
-            result |= 2;
-          free (name);
-        }
-        {
-          char *name = realpath ("conftest.a/", NULL);
-          if (name != NULL)
-            result |= 4;
-          free (name);
-        }
-        {
-          char *name1 = realpath (".", NULL);
-          char *name2 = realpath ("conftest.d//./..", NULL);
-          if (! name1 || ! name2 || strcmp (name1, name2))
-            result |= 8;
-          free (name1);
-          free (name2);
-        }
-        return result;
-
-  ;
-  return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_realpath_works=yes
-else
-  gl_cv_func_realpath_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-    rm -rf conftest.a conftest.d
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_realpath_works" >&5
-$as_echo "$gl_cv_func_realpath_works" >&6; }
-  case "$gl_cv_func_realpath_works" in
-    *yes)
-
-$as_echo "#define FUNC_REALPATH_WORKS 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-  GNULIB_ACCESS=0;
-  GNULIB_CHDIR=0;
-  GNULIB_CHOWN=0;
-  GNULIB_CLOSE=0;
-  GNULIB_COPY_FILE_RANGE=0;
-  GNULIB_DUP=0;
-  GNULIB_DUP2=0;
-  GNULIB_DUP3=0;
-  GNULIB_ENVIRON=0;
-  GNULIB_EUIDACCESS=0;
-  GNULIB_FACCESSAT=0;
-  GNULIB_FCHDIR=0;
-  GNULIB_FCHOWNAT=0;
-  GNULIB_FDATASYNC=0;
-  GNULIB_FSYNC=0;
-  GNULIB_FTRUNCATE=0;
-  GNULIB_GETCWD=0;
-  GNULIB_GETDOMAINNAME=0;
-  GNULIB_GETDTABLESIZE=0;
-  GNULIB_GETGROUPS=0;
-  GNULIB_GETHOSTNAME=0;
-  GNULIB_GETLOGIN=0;
-  GNULIB_GETLOGIN_R=0;
-  GNULIB_GETPAGESIZE=0;
-  GNULIB_GETPASS=0;
-  GNULIB_GETUSERSHELL=0;
-  GNULIB_GROUP_MEMBER=0;
-  GNULIB_ISATTY=0;
-  GNULIB_LCHOWN=0;
-  GNULIB_LINK=0;
-  GNULIB_LINKAT=0;
-  GNULIB_LSEEK=0;
-  GNULIB_PIPE=0;
-  GNULIB_PIPE2=0;
-  GNULIB_PREAD=0;
-  GNULIB_PWRITE=0;
-  GNULIB_READ=0;
-  GNULIB_READLINK=0;
-  GNULIB_READLINKAT=0;
-  GNULIB_RMDIR=0;
-  GNULIB_SETHOSTNAME=0;
-  GNULIB_SLEEP=0;
-  GNULIB_SYMLINK=0;
-  GNULIB_SYMLINKAT=0;
-  GNULIB_TRUNCATE=0;
-  GNULIB_TTYNAME_R=0;
-  GNULIB_UNISTD_H_NONBLOCKING=0;
-  GNULIB_UNISTD_H_SIGPIPE=0;
-  GNULIB_UNLINK=0;
-  GNULIB_UNLINKAT=0;
-  GNULIB_USLEEP=0;
-  GNULIB_WRITE=0;
-    HAVE_CHOWN=1;
-  HAVE_COPY_FILE_RANGE=1;
-  HAVE_DUP2=1;
-  HAVE_DUP3=1;
-  HAVE_EUIDACCESS=1;
-  HAVE_FACCESSAT=1;
-  HAVE_FCHDIR=1;
-  HAVE_FCHOWNAT=1;
-  HAVE_FDATASYNC=1;
-  HAVE_FSYNC=1;
-  HAVE_FTRUNCATE=1;
-  HAVE_GETDTABLESIZE=1;
-  HAVE_GETGROUPS=1;
-  HAVE_GETHOSTNAME=1;
-  HAVE_GETLOGIN=1;
-  HAVE_GETPAGESIZE=1;
-  HAVE_GETPASS=1;
-  HAVE_GROUP_MEMBER=1;
-  HAVE_LCHOWN=1;
-  HAVE_LINK=1;
-  HAVE_LINKAT=1;
-  HAVE_PIPE=1;
-  HAVE_PIPE2=1;
-  HAVE_PREAD=1;
-  HAVE_PWRITE=1;
-  HAVE_READLINK=1;
-  HAVE_READLINKAT=1;
-  HAVE_SETHOSTNAME=1;
-  HAVE_SLEEP=1;
-  HAVE_SYMLINK=1;
-  HAVE_SYMLINKAT=1;
-  HAVE_UNLINKAT=1;
-  HAVE_USLEEP=1;
-  HAVE_DECL_ENVIRON=1;
-  HAVE_DECL_FCHDIR=1;
-  HAVE_DECL_FDATASYNC=1;
-  HAVE_DECL_GETDOMAINNAME=1;
-  HAVE_DECL_GETLOGIN=1;
-  HAVE_DECL_GETLOGIN_R=1;
-  HAVE_DECL_GETPAGESIZE=1;
-  HAVE_DECL_GETUSERSHELL=1;
-  HAVE_DECL_SETHOSTNAME=1;
-  HAVE_DECL_TRUNCATE=1;
-  HAVE_DECL_TTYNAME_R=1;
-  HAVE_OS_H=0;
-  HAVE_SYS_PARAM_H=0;
-  REPLACE_ACCESS=0;
-  REPLACE_CHOWN=0;
-  REPLACE_CLOSE=0;
-  REPLACE_DUP=0;
-  REPLACE_DUP2=0;
-  REPLACE_FACCESSAT=0;
-  REPLACE_FCHOWNAT=0;
-  REPLACE_FTRUNCATE=0;
-  REPLACE_GETCWD=0;
-  REPLACE_GETDOMAINNAME=0;
-  REPLACE_GETDTABLESIZE=0;
-  REPLACE_GETLOGIN_R=0;
-  REPLACE_GETGROUPS=0;
-  REPLACE_GETPAGESIZE=0;
-  REPLACE_GETPASS=0;
-  REPLACE_ISATTY=0;
-  REPLACE_LCHOWN=0;
-  REPLACE_LINK=0;
-  REPLACE_LINKAT=0;
-  REPLACE_LSEEK=0;
-  REPLACE_PREAD=0;
-  REPLACE_PWRITE=0;
-  REPLACE_READ=0;
-  REPLACE_READLINK=0;
-  REPLACE_READLINKAT=0;
-  REPLACE_RMDIR=0;
-  REPLACE_SLEEP=0;
-  REPLACE_SYMLINK=0;
-  REPLACE_SYMLINKAT=0;
-  REPLACE_TRUNCATE=0;
-  REPLACE_TTYNAME_R=0;
-  REPLACE_UNLINK=0;
-  REPLACE_UNLINKAT=0;
-  REPLACE_USLEEP=0;
-  REPLACE_WRITE=0;
-  UNISTD_H_HAVE_WINSOCK2_H=0;
-  UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
-
-
-
-
-
-
-  if test $ac_cv_func__set_invalid_parameter_handler = yes; then
-    HAVE_MSVC_INVALID_PARAMETER_HANDLER=1
-
-$as_echo "#define HAVE_MSVC_INVALID_PARAMETER_HANDLER 1" >>confdefs.h
-
-  else
-    HAVE_MSVC_INVALID_PARAMETER_HANDLER=0
-  fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if environ is properly declared" >&5
-$as_echo_n "checking if environ is properly declared... " >&6; }
-if ${gt_cv_var_environ_declaration+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#if HAVE_UNISTD_H
-     #include <unistd.h>
-     #endif
-     /* mingw, BeOS, Haiku declare environ in <stdlib.h>, not in <unistd.h>.  */
-     #include <stdlib.h>
-
-            extern struct { int foo; } environ;
-int
-main ()
-{
-environ.foo = 1;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gt_cv_var_environ_declaration=no
-else
-  gt_cv_var_environ_declaration=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_var_environ_declaration" >&5
-$as_echo "$gt_cv_var_environ_declaration" >&6; }
-  if test $gt_cv_var_environ_declaration = yes; then
-
-$as_echo "#define HAVE_ENVIRON_DECL 1" >>confdefs.h
-
-  fi
-
-
-  if test $gt_cv_var_environ_declaration != yes; then
-    HAVE_DECL_ENVIRON=0
-  fi
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the preprocessor supports include_next" >&5
-$as_echo_n "checking whether the preprocessor supports include_next... " >&6; }
-if ${gl_cv_have_include_next+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -rf conftestd1a conftestd1b conftestd2
-     mkdir conftestd1a conftestd1b conftestd2
-                                                  cat <<EOF > conftestd1a/conftest.h
-#define DEFINED_IN_CONFTESTD1
-#include_next <conftest.h>
-#ifdef DEFINED_IN_CONFTESTD2
-int foo;
-#else
-#error "include_next doesn't work"
-#endif
-EOF
-     cat <<EOF > conftestd1b/conftest.h
-#define DEFINED_IN_CONFTESTD1
-#include <stdio.h>
-#include_next <conftest.h>
-#ifdef DEFINED_IN_CONFTESTD2
-int foo;
-#else
-#error "include_next doesn't work"
-#endif
-EOF
-     cat <<EOF > conftestd2/conftest.h
-#ifndef DEFINED_IN_CONFTESTD1
-#error "include_next test doesn't work"
-#endif
-#define DEFINED_IN_CONFTESTD2
-EOF
-     gl_save_CPPFLAGS="$CPPFLAGS"
-     CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2"
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <conftest.h>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_have_include_next=yes
-else
-  CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2"
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <conftest.h>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_have_include_next=buggy
-else
-  gl_cv_have_include_next=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-     CPPFLAGS="$gl_save_CPPFLAGS"
-     rm -rf conftestd1a conftestd1b conftestd2
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_include_next" >&5
-$as_echo "$gl_cv_have_include_next" >&6; }
-  PRAGMA_SYSTEM_HEADER=
-  if test $gl_cv_have_include_next = yes; then
-    INCLUDE_NEXT=include_next
-    INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
-    if test -n "$GCC"; then
-      PRAGMA_SYSTEM_HEADER='#pragma GCC system_header'
-    fi
-  else
-    if test $gl_cv_have_include_next = buggy; then
-      INCLUDE_NEXT=include
-      INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
-    else
-      INCLUDE_NEXT=include
-      INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include
-    fi
-  fi
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether system header files limit the line length" >&5
-$as_echo_n "checking whether system header files limit the line length... " >&6; }
-if ${gl_cv_pragma_columns+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef __TANDEM
-choke me
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "choke me" >/dev/null 2>&1; then :
-  gl_cv_pragma_columns=yes
-else
-  gl_cv_pragma_columns=no
-fi
-rm -f conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_pragma_columns" >&5
-$as_echo "$gl_cv_pragma_columns" >&6; }
-  if test $gl_cv_pragma_columns = yes; then
-    PRAGMA_COLUMNS="#pragma COLUMNS 10000"
-  else
-    PRAGMA_COLUMNS=
-  fi
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for complete errno.h" >&5
-$as_echo_n "checking for complete errno.h... " >&6; }
-if ${gl_cv_header_errno_h_complete+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <errno.h>
-#if !defined ETXTBSY
-booboo
-#endif
-#if !defined ENOMSG
-booboo
-#endif
-#if !defined EIDRM
-booboo
-#endif
-#if !defined ENOLINK
-booboo
-#endif
-#if !defined EPROTO
-booboo
-#endif
-#if !defined EMULTIHOP
-booboo
-#endif
-#if !defined EBADMSG
-booboo
-#endif
-#if !defined EOVERFLOW
-booboo
-#endif
-#if !defined ENOTSUP
-booboo
-#endif
-#if !defined ENETRESET
-booboo
-#endif
-#if !defined ECONNABORTED
-booboo
-#endif
-#if !defined ESTALE
-booboo
-#endif
-#if !defined EDQUOT
-booboo
-#endif
-#if !defined ECANCELED
-booboo
-#endif
-#if !defined EOWNERDEAD
-booboo
-#endif
-#if !defined ENOTRECOVERABLE
-booboo
-#endif
-#if !defined EILSEQ
-booboo
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "booboo" >/dev/null 2>&1; then :
-  gl_cv_header_errno_h_complete=no
-else
-  gl_cv_header_errno_h_complete=yes
-fi
-rm -f conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_complete" >&5
-$as_echo "$gl_cv_header_errno_h_complete" >&6; }
-  if test $gl_cv_header_errno_h_complete = yes; then
-    ERRNO_H=''
-  else
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_errno_h='<'errno.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <errno.h>" >&5
-$as_echo_n "checking absolute name of <errno.h>... " >&6; }
-if ${gl_cv_next_errno_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <errno.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'errno.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_errno_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_errno_h
-           gl_cv_next_errno_h='"'$gl_header'"'
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_errno_h" >&5
-$as_echo "$gl_cv_next_errno_h" >&6; }
-     fi
-     NEXT_ERRNO_H=$gl_cv_next_errno_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'errno.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_errno_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_ERRNO_H=$gl_next_as_first_directive
-
-
-
-
-    ERRNO_H='errno.h'
-  fi
-
-   if test -n "$ERRNO_H"; then
-  GL_GENERATE_ERRNO_H_TRUE=
-  GL_GENERATE_ERRNO_H_FALSE='#'
-else
-  GL_GENERATE_ERRNO_H_TRUE='#'
-  GL_GENERATE_ERRNO_H_FALSE=
-fi
-
-
-  if test -n "$ERRNO_H"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EMULTIHOP value" >&5
-$as_echo_n "checking for EMULTIHOP value... " >&6; }
-if ${gl_cv_header_errno_h_EMULTIHOP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <errno.h>
-#ifdef EMULTIHOP
-yes
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "yes" >/dev/null 2>&1; then :
-  gl_cv_header_errno_h_EMULTIHOP=yes
-else
-  gl_cv_header_errno_h_EMULTIHOP=no
-fi
-rm -f conftest*
-
-      if test $gl_cv_header_errno_h_EMULTIHOP = no; then
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#define _XOPEN_SOURCE_EXTENDED 1
-#include <errno.h>
-#ifdef EMULTIHOP
-yes
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "yes" >/dev/null 2>&1; then :
-  gl_cv_header_errno_h_EMULTIHOP=hidden
-fi
-rm -f conftest*
-
-        if test $gl_cv_header_errno_h_EMULTIHOP = hidden; then
-                              if ac_fn_c_compute_int "$LINENO" "EMULTIHOP" "gl_cv_header_errno_h_EMULTIHOP"        "
-#define _XOPEN_SOURCE_EXTENDED 1
-#include <errno.h>
-/* The following two lines are a workaround against an autoconf-2.52 bug.  */
-#include <stdio.h>
-#include <stdlib.h>
-"; then :
-
-fi
-
-        fi
-      fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EMULTIHOP" >&5
-$as_echo "$gl_cv_header_errno_h_EMULTIHOP" >&6; }
-    case $gl_cv_header_errno_h_EMULTIHOP in
-      yes | no)
-        EMULTIHOP_HIDDEN=0; EMULTIHOP_VALUE=
-        ;;
-      *)
-        EMULTIHOP_HIDDEN=1; EMULTIHOP_VALUE="$gl_cv_header_errno_h_EMULTIHOP"
-        ;;
-    esac
-
-
-  fi
-
-
-  if test -n "$ERRNO_H"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ENOLINK value" >&5
-$as_echo_n "checking for ENOLINK value... " >&6; }
-if ${gl_cv_header_errno_h_ENOLINK+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <errno.h>
-#ifdef ENOLINK
-yes
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "yes" >/dev/null 2>&1; then :
-  gl_cv_header_errno_h_ENOLINK=yes
-else
-  gl_cv_header_errno_h_ENOLINK=no
-fi
-rm -f conftest*
-
-      if test $gl_cv_header_errno_h_ENOLINK = no; then
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#define _XOPEN_SOURCE_EXTENDED 1
-#include <errno.h>
-#ifdef ENOLINK
-yes
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "yes" >/dev/null 2>&1; then :
-  gl_cv_header_errno_h_ENOLINK=hidden
-fi
-rm -f conftest*
-
-        if test $gl_cv_header_errno_h_ENOLINK = hidden; then
-                              if ac_fn_c_compute_int "$LINENO" "ENOLINK" "gl_cv_header_errno_h_ENOLINK"        "
-#define _XOPEN_SOURCE_EXTENDED 1
-#include <errno.h>
-/* The following two lines are a workaround against an autoconf-2.52 bug.  */
-#include <stdio.h>
-#include <stdlib.h>
-"; then :
-
-fi
-
-        fi
-      fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_ENOLINK" >&5
-$as_echo "$gl_cv_header_errno_h_ENOLINK" >&6; }
-    case $gl_cv_header_errno_h_ENOLINK in
-      yes | no)
-        ENOLINK_HIDDEN=0; ENOLINK_VALUE=
-        ;;
-      *)
-        ENOLINK_HIDDEN=1; ENOLINK_VALUE="$gl_cv_header_errno_h_ENOLINK"
-        ;;
-    esac
-
-
-  fi
-
-
-  if test -n "$ERRNO_H"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EOVERFLOW value" >&5
-$as_echo_n "checking for EOVERFLOW value... " >&6; }
-if ${gl_cv_header_errno_h_EOVERFLOW+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <errno.h>
-#ifdef EOVERFLOW
-yes
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "yes" >/dev/null 2>&1; then :
-  gl_cv_header_errno_h_EOVERFLOW=yes
-else
-  gl_cv_header_errno_h_EOVERFLOW=no
-fi
-rm -f conftest*
-
-      if test $gl_cv_header_errno_h_EOVERFLOW = no; then
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#define _XOPEN_SOURCE_EXTENDED 1
-#include <errno.h>
-#ifdef EOVERFLOW
-yes
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "yes" >/dev/null 2>&1; then :
-  gl_cv_header_errno_h_EOVERFLOW=hidden
-fi
-rm -f conftest*
-
-        if test $gl_cv_header_errno_h_EOVERFLOW = hidden; then
-                              if ac_fn_c_compute_int "$LINENO" "EOVERFLOW" "gl_cv_header_errno_h_EOVERFLOW"        "
-#define _XOPEN_SOURCE_EXTENDED 1
-#include <errno.h>
-/* The following two lines are a workaround against an autoconf-2.52 bug.  */
-#include <stdio.h>
-#include <stdlib.h>
-"; then :
-
-fi
-
-        fi
-      fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EOVERFLOW" >&5
-$as_echo "$gl_cv_header_errno_h_EOVERFLOW" >&6; }
-    case $gl_cv_header_errno_h_EOVERFLOW in
-      yes | no)
-        EOVERFLOW_HIDDEN=0; EOVERFLOW_VALUE=
-        ;;
-      *)
-        EOVERFLOW_HIDDEN=1; EOVERFLOW_VALUE="$gl_cv_header_errno_h_EOVERFLOW"
-        ;;
-    esac
-
-
-  fi
-
-
-ac_fn_c_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default"
-if test "x$ac_cv_have_decl_strerror_r" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRERROR_R $ac_have_decl
-_ACEOF
-
-for ac_func in strerror_r
-do :
-  ac_fn_c_check_func "$LINENO" "strerror_r" "ac_cv_func_strerror_r"
-if test "x$ac_cv_func_strerror_r" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_STRERROR_R 1
-_ACEOF
-
-fi
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5
-$as_echo_n "checking whether strerror_r returns char *... " >&6; }
-if ${ac_cv_func_strerror_r_char_p+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-    ac_cv_func_strerror_r_char_p=no
-    if test $ac_cv_have_decl_strerror_r = yes; then
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-
-	  char buf[100];
-	  char x = *strerror_r (0, buf, sizeof buf);
-	  char *p = strerror_r (0, buf, sizeof buf);
-	  return !p || x;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_func_strerror_r_char_p=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    else
-      # strerror_r is not declared.  Choose between
-      # systems that have relatively inaccessible declarations for the
-      # function.  BeOS and DEC UNIX 4.0 fall in this category, but the
-      # former has a strerror_r that returns char*, while the latter
-      # has a strerror_r that returns `int'.
-      # This test should segfault on the DEC system.
-      if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-	extern char *strerror_r ();
-int
-main ()
-{
-char buf[100];
-	  char x = *strerror_r (0, buf, sizeof buf);
-	  return ! isalpha (x);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_func_strerror_r_char_p=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-    fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_char_p" >&5
-$as_echo "$ac_cv_func_strerror_r_char_p" >&6; }
-if test $ac_cv_func_strerror_r_char_p = yes; then
-
-$as_echo "#define STRERROR_R_CHAR_P 1" >>confdefs.h
-
-fi
-
-
-  XGETTEXT_EXTRA_OPTIONS=
-
-
-
-
-
-  ac_fn_c_check_type "$LINENO" "sig_atomic_t" "ac_cv_type_sig_atomic_t" "#include <signal.h>
-"
-if test "x$ac_cv_type_sig_atomic_t" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_SIG_ATOMIC_T 1
-_ACEOF
-
-
-else
-
-$as_echo "#define sig_atomic_t int" >>confdefs.h
-
-fi
-
-
-
-  GNULIB_CREAT=0;
-  GNULIB_FCNTL=0;
-  GNULIB_NONBLOCKING=0;
-  GNULIB_OPEN=0;
-  GNULIB_OPENAT=0;
-    HAVE_FCNTL=1;
-  HAVE_OPENAT=1;
-  REPLACE_CREAT=0;
-  REPLACE_FCNTL=0;
-  REPLACE_OPEN=0;
-  REPLACE_OPENAT=0;
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fcntl.h" >&5
-$as_echo_n "checking for working fcntl.h... " >&6; }
-if ${gl_cv_header_working_fcntl_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                  # Guess 'no' on native Windows.
-          mingw*) gl_cv_header_working_fcntl_h='no' ;;
-          *)      gl_cv_header_working_fcntl_h=cross-compiling ;;
-        esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-           #include <sys/stat.h>
-           #if HAVE_UNISTD_H
-           # include <unistd.h>
-           #else /* on Windows with MSVC */
-           # include <io.h>
-           # include <stdlib.h>
-           # defined sleep(n) _sleep ((n) * 1000)
-           #endif
-           #include <fcntl.h>
-           #ifndef O_NOATIME
-            #define O_NOATIME 0
-           #endif
-           #ifndef O_NOFOLLOW
-            #define O_NOFOLLOW 0
-           #endif
-           static int const constants[] =
-            {
-              O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND,
-              O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
-            };
-
-int
-main ()
-{
-
-            int result = !constants;
-            #if HAVE_SYMLINK
-            {
-              static char const sym[] = "conftest.sym";
-              if (symlink ("/dev/null", sym) != 0)
-                result |= 2;
-              else
-                {
-                  int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0);
-                  if (fd >= 0)
-                    {
-                      close (fd);
-                      result |= 4;
-                    }
-                }
-              if (unlink (sym) != 0 || symlink (".", sym) != 0)
-                result |= 2;
-              else
-                {
-                  int fd = open (sym, O_RDONLY | O_NOFOLLOW);
-                  if (fd >= 0)
-                    {
-                      close (fd);
-                      result |= 4;
-                    }
-                }
-              unlink (sym);
-            }
-            #endif
-            {
-              static char const file[] = "confdefs.h";
-              int fd = open (file, O_RDONLY | O_NOATIME);
-              if (fd < 0)
-                result |= 8;
-              else
-                {
-                  struct stat st0;
-                  if (fstat (fd, &st0) != 0)
-                    result |= 16;
-                  else
-                    {
-                      char c;
-                      sleep (1);
-                      if (read (fd, &c, 1) != 1)
-                        result |= 24;
-                      else
-                        {
-                          if (close (fd) != 0)
-                            result |= 32;
-                          else
-                            {
-                              struct stat st1;
-                              if (stat (file, &st1) != 0)
-                                result |= 40;
-                              else
-                                if (st0.st_atime != st1.st_atime)
-                                  result |= 64;
-                            }
-                        }
-                    }
-                }
-            }
-            return result;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_header_working_fcntl_h=yes
-else
-  case $? in #(
-        4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
-        64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
-        68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
-         *) gl_cv_header_working_fcntl_h='no';;
-        esac
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_fcntl_h" >&5
-$as_echo "$gl_cv_header_working_fcntl_h" >&6; }
-
-  case $gl_cv_header_working_fcntl_h in #(
-  *O_NOATIME* | no | cross-compiling) ac_val=0;; #(
-  *) ac_val=1;;
-  esac
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_WORKING_O_NOATIME $ac_val
-_ACEOF
-
-
-  case $gl_cv_header_working_fcntl_h in #(
-  *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
-  *) ac_val=1;;
-  esac
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_WORKING_O_NOFOLLOW $ac_val
-_ACEOF
-
-
-ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
-if test "x$ac_cv_type_pid_t" = xyes; then :
-
-else
-
-cat >>confdefs.h <<_ACEOF
-#define pid_t int
-_ACEOF
-
-fi
-
-ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default"
-if test "x$ac_cv_type_mode_t" = xyes; then :
-
-else
-
-cat >>confdefs.h <<_ACEOF
-#define mode_t int
-_ACEOF
-
-fi
-
-
-  GNULIB_DPRINTF=0;
-  GNULIB_FCLOSE=0;
-  GNULIB_FDOPEN=0;
-  GNULIB_FFLUSH=0;
-  GNULIB_FGETC=0;
-  GNULIB_FGETS=0;
-  GNULIB_FOPEN=0;
-  GNULIB_FPRINTF=0;
-  GNULIB_FPRINTF_POSIX=0;
-  GNULIB_FPURGE=0;
-  GNULIB_FPUTC=0;
-  GNULIB_FPUTS=0;
-  GNULIB_FREAD=0;
-  GNULIB_FREOPEN=0;
-  GNULIB_FSCANF=0;
-  GNULIB_FSEEK=0;
-  GNULIB_FSEEKO=0;
-  GNULIB_FTELL=0;
-  GNULIB_FTELLO=0;
-  GNULIB_FWRITE=0;
-  GNULIB_GETC=0;
-  GNULIB_GETCHAR=0;
-  GNULIB_GETDELIM=0;
-  GNULIB_GETLINE=0;
-  GNULIB_OBSTACK_PRINTF=0;
-  GNULIB_OBSTACK_PRINTF_POSIX=0;
-  GNULIB_PCLOSE=0;
-  GNULIB_PERROR=0;
-  GNULIB_POPEN=0;
-  GNULIB_PRINTF=0;
-  GNULIB_PRINTF_POSIX=0;
-  GNULIB_PUTC=0;
-  GNULIB_PUTCHAR=0;
-  GNULIB_PUTS=0;
-  GNULIB_REMOVE=0;
-  GNULIB_RENAME=0;
-  GNULIB_RENAMEAT=0;
-  GNULIB_SCANF=0;
-  GNULIB_SNPRINTF=0;
-  GNULIB_SPRINTF_POSIX=0;
-  GNULIB_STDIO_H_NONBLOCKING=0;
-  GNULIB_STDIO_H_SIGPIPE=0;
-  GNULIB_TMPFILE=0;
-  GNULIB_VASPRINTF=0;
-  GNULIB_VFSCANF=0;
-  GNULIB_VSCANF=0;
-  GNULIB_VDPRINTF=0;
-  GNULIB_VFPRINTF=0;
-  GNULIB_VFPRINTF_POSIX=0;
-  GNULIB_VPRINTF=0;
-  GNULIB_VPRINTF_POSIX=0;
-  GNULIB_VSNPRINTF=0;
-  GNULIB_VSPRINTF_POSIX=0;
-    HAVE_DECL_FPURGE=1;
-  HAVE_DECL_FSEEKO=1;
-  HAVE_DECL_FTELLO=1;
-  HAVE_DECL_GETDELIM=1;
-  HAVE_DECL_GETLINE=1;
-  HAVE_DECL_OBSTACK_PRINTF=1;
-  HAVE_DECL_SNPRINTF=1;
-  HAVE_DECL_VSNPRINTF=1;
-  HAVE_DPRINTF=1;
-  HAVE_FSEEKO=1;
-  HAVE_FTELLO=1;
-  HAVE_PCLOSE=1;
-  HAVE_POPEN=1;
-  HAVE_RENAMEAT=1;
-  HAVE_VASPRINTF=1;
-  HAVE_VDPRINTF=1;
-  REPLACE_DPRINTF=0;
-  REPLACE_FCLOSE=0;
-  REPLACE_FDOPEN=0;
-  REPLACE_FFLUSH=0;
-  REPLACE_FOPEN=0;
-  REPLACE_FPRINTF=0;
-  REPLACE_FPURGE=0;
-  REPLACE_FREOPEN=0;
-  REPLACE_FSEEK=0;
-  REPLACE_FSEEKO=0;
-  REPLACE_FTELL=0;
-  REPLACE_FTELLO=0;
-  REPLACE_GETDELIM=0;
-  REPLACE_GETLINE=0;
-  REPLACE_OBSTACK_PRINTF=0;
-  REPLACE_PERROR=0;
-  REPLACE_POPEN=0;
-  REPLACE_PRINTF=0;
-  REPLACE_REMOVE=0;
-  REPLACE_RENAME=0;
-  REPLACE_RENAMEAT=0;
-  REPLACE_SNPRINTF=0;
-  REPLACE_SPRINTF=0;
-  REPLACE_STDIO_READ_FUNCS=0;
-  REPLACE_STDIO_WRITE_FUNCS=0;
-  REPLACE_TMPFILE=0;
-  REPLACE_VASPRINTF=0;
-  REPLACE_VDPRINTF=0;
-  REPLACE_VFPRINTF=0;
-  REPLACE_VPRINTF=0;
-  REPLACE_VSNPRINTF=0;
-  REPLACE_VSPRINTF=0;
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint.h" >&5
-$as_echo_n "checking for stdint.h... " >&6; }
-if ${gl_cv_header_stdint_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-            #include <stdint.h>
-int
-main ()
-{
-uintmax_t i = (uintmax_t) -1; return !i;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_header_stdint_h=yes
-else
-  gl_cv_header_stdint_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_h" >&5
-$as_echo "$gl_cv_header_stdint_h" >&6; }
-  if test $gl_cv_header_stdint_h = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_STDINT_H_WITH_UINTMAX 1
-_ACEOF
-
-  fi
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5
-$as_echo_n "checking for inttypes.h... " >&6; }
-if ${gl_cv_header_inttypes_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <sys/types.h>
-#include <inttypes.h>
-
-int
-main ()
-{
-uintmax_t i = (uintmax_t) -1; return !i;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_header_inttypes_h=yes
-else
-  gl_cv_header_inttypes_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_inttypes_h" >&5
-$as_echo "$gl_cv_header_inttypes_h" >&6; }
-  if test $gl_cv_header_inttypes_h = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_INTTYPES_H_WITH_UINTMAX 1
-_ACEOF
-
-  fi
-
-
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports size specifiers as in C99" >&5
-$as_echo_n "checking whether printf supports size specifiers as in C99... " >&6; }
-if ${gl_cv_func_printf_sizes_c99+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-                                 # Guess yes on glibc systems.
-           *-gnu* | gnu*)        gl_cv_func_printf_sizes_c99="guessing yes";;
-                                 # Guess yes on musl systems.
-           *-musl*)              gl_cv_func_printf_sizes_c99="guessing yes";;
-                                 # Guess yes on FreeBSD >= 5.
-           freebsd[1-4].*)       gl_cv_func_printf_sizes_c99="guessing no";;
-           freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
-                                 # Guess yes on Mac OS X >= 10.3.
-           darwin[1-6].*)        gl_cv_func_printf_sizes_c99="guessing no";;
-           darwin*)              gl_cv_func_printf_sizes_c99="guessing yes";;
-                                 # Guess yes on OpenBSD >= 3.9.
-           openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
-                                 gl_cv_func_printf_sizes_c99="guessing no";;
-           openbsd*)             gl_cv_func_printf_sizes_c99="guessing yes";;
-                                 # Guess yes on Solaris >= 2.10.
-           solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
-           solaris*)             gl_cv_func_printf_sizes_c99="guessing no";;
-                                 # Guess yes on NetBSD >= 3.
-           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
-                                 gl_cv_func_printf_sizes_c99="guessing no";;
-           netbsd*)              gl_cv_func_printf_sizes_c99="guessing yes";;
-                                 # Guess yes on Android.
-           linux*-android*)      gl_cv_func_printf_sizes_c99="guessing yes";;
-                                 # Guess yes on MSVC, no on mingw.
-           mingw*)               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef _MSC_VER
- Known
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Known" >/dev/null 2>&1; then :
-  gl_cv_func_printf_sizes_c99="guessing yes"
-else
-  gl_cv_func_printf_sizes_c99="guessing no"
-fi
-rm -f conftest*
-
-                                 ;;
-                                 # If we don't know, obey --enable-cross-guesses.
-           *)                    gl_cv_func_printf_sizes_c99="$gl_cross_guess_normal";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#if HAVE_STDINT_H_WITH_UINTMAX
-# include <stdint.h>
-#endif
-#if HAVE_INTTYPES_H_WITH_UINTMAX
-# include <inttypes.h>
-#endif
-static char buf[100];
-int main ()
-{
-  int result = 0;
-#if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX
-  buf[0] = '\0';
-  if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0
-      || strcmp (buf, "12345671 33") != 0)
-    result |= 1;
-#else
-  result |= 1;
-#endif
-  buf[0] = '\0';
-  if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0
-      || strcmp (buf, "12345672 33") != 0)
-    result |= 2;
-  buf[0] = '\0';
-  if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0
-      || strcmp (buf, "12345673 33") != 0)
-    result |= 4;
-  buf[0] = '\0';
-  if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0
-      || strcmp (buf, "1.5 33") != 0)
-    result |= 8;
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_printf_sizes_c99=yes
-else
-  gl_cv_func_printf_sizes_c99=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_sizes_c99" >&5
-$as_echo "$gl_cv_func_printf_sizes_c99" >&6; }
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports 'long double' arguments" >&5
-$as_echo_n "checking whether printf supports 'long double' arguments... " >&6; }
-if ${gl_cv_func_printf_long_double+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                            # Guess no on BeOS.
-           beos*)           gl_cv_func_printf_long_double="guessing no";;
-                            # Guess yes on Android.
-           linux*-android*) gl_cv_func_printf_long_double="guessing yes";;
-                            # Guess yes on MSVC, no on mingw.
-           mingw*)          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef _MSC_VER
- Known
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Known" >/dev/null 2>&1; then :
-  gl_cv_func_printf_long_double="guessing yes"
-else
-  gl_cv_func_printf_long_double="guessing no"
-fi
-rm -f conftest*
-
-                            ;;
-           *)               gl_cv_func_printf_long_double="guessing yes";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <string.h>
-static char buf[10000];
-int main ()
-{
-  int result = 0;
-  buf[0] = '\0';
-  if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0
-      || strcmp (buf, "1.750000 33") != 0)
-    result |= 1;
-  buf[0] = '\0';
-  if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0
-      || strcmp (buf, "1.750000e+00 33") != 0)
-    result |= 2;
-  buf[0] = '\0';
-  if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0
-      || strcmp (buf, "1.75 33") != 0)
-    result |= 4;
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_printf_long_double=yes
-else
-  gl_cv_func_printf_long_double=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_long_double" >&5
-$as_echo "$gl_cv_func_printf_long_double" >&6; }
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports infinite 'double' arguments" >&5
-$as_echo_n "checking whether printf supports infinite 'double' arguments... " >&6; }
-if ${gl_cv_func_printf_infinite+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-                                 # Guess yes on glibc systems.
-           *-gnu* | gnu*)        gl_cv_func_printf_infinite="guessing yes";;
-                                 # Guess yes on musl systems.
-           *-musl*)              gl_cv_func_printf_infinite="guessing yes";;
-                                 # Guess yes on FreeBSD >= 6.
-           freebsd[1-5].*)       gl_cv_func_printf_infinite="guessing no";;
-           freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";;
-                                 # Guess yes on Mac OS X >= 10.3.
-           darwin[1-6].*)        gl_cv_func_printf_infinite="guessing no";;
-           darwin*)              gl_cv_func_printf_infinite="guessing yes";;
-                                 # Guess yes on HP-UX >= 11.
-           hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";;
-           hpux*)                gl_cv_func_printf_infinite="guessing yes";;
-                                 # Guess yes on NetBSD >= 3.
-           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
-                                 gl_cv_func_printf_infinite="guessing no";;
-           netbsd*)              gl_cv_func_printf_infinite="guessing yes";;
-                                 # Guess yes on BeOS.
-           beos*)                gl_cv_func_printf_infinite="guessing yes";;
-                                 # Guess no on Android.
-           linux*-android*)      gl_cv_func_printf_infinite="guessing no";;
-                                 # Guess yes on MSVC, no on mingw.
-           mingw*)               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef _MSC_VER
- Known
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Known" >/dev/null 2>&1; then :
-  gl_cv_func_printf_infinite="guessing yes"
-else
-  gl_cv_func_printf_infinite="guessing no"
-fi
-rm -f conftest*
-
-                                 ;;
-                                 # If we don't know, obey --enable-cross-guesses.
-           *)                    gl_cv_func_printf_infinite="$gl_cross_guess_normal";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <string.h>
-static int
-strisnan (const char *string, size_t start_index, size_t end_index)
-{
-  if (start_index < end_index)
-    {
-      if (string[start_index] == '-')
-        start_index++;
-      if (start_index + 3 <= end_index
-          && memcmp (string + start_index, "nan", 3) == 0)
-        {
-          start_index += 3;
-          if (start_index == end_index
-              || (string[start_index] == '(' && string[end_index - 1] == ')'))
-            return 1;
-        }
-    }
-  return 0;
-}
-static int
-have_minus_zero ()
-{
-  static double plus_zero = 0.0;
-  double minus_zero = - plus_zero;
-  return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
-}
-static char buf[10000];
-static double zero = 0.0;
-int main ()
-{
-  int result = 0;
-  if (sprintf (buf, "%f", 1.0 / zero) < 0
-      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
-    result |= 1;
-  if (sprintf (buf, "%f", -1.0 / zero) < 0
-      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
-    result |= 1;
-  if (sprintf (buf, "%f", zero / zero) < 0
-      || !strisnan (buf, 0, strlen (buf)))
-    result |= 2;
-  if (sprintf (buf, "%e", 1.0 / zero) < 0
-      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
-    result |= 4;
-  if (sprintf (buf, "%e", -1.0 / zero) < 0
-      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
-    result |= 4;
-  if (sprintf (buf, "%e", zero / zero) < 0
-      || !strisnan (buf, 0, strlen (buf)))
-    result |= 8;
-  if (sprintf (buf, "%g", 1.0 / zero) < 0
-      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
-    result |= 16;
-  if (sprintf (buf, "%g", -1.0 / zero) < 0
-      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
-    result |= 16;
-  if (sprintf (buf, "%g", zero / zero) < 0
-      || !strisnan (buf, 0, strlen (buf)))
-    result |= 32;
-  /* This test fails on HP-UX 10.20.  */
-  if (have_minus_zero ())
-    if (sprintf (buf, "%g", - zero) < 0
-        || strcmp (buf, "-0") != 0)
-    result |= 64;
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_printf_infinite=yes
-else
-  gl_cv_func_printf_infinite=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_infinite" >&5
-$as_echo "$gl_cv_func_printf_infinite" >&6; }
-
-
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
-$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
-if ${ac_cv_c_bigendian+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_c_bigendian=unknown
-    # See if we're dealing with a universal compiler.
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifndef __APPLE_CC__
-	       not a universal capable compiler
-	     #endif
-	     typedef int dummy;
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-	# Check for potential -arch flags.  It is not universal unless
-	# there are at least two -arch flags with different values.
-	ac_arch=
-	ac_prev=
-	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
-	 if test -n "$ac_prev"; then
-	   case $ac_word in
-	     i?86 | x86_64 | ppc | ppc64)
-	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
-		 ac_arch=$ac_word
-	       else
-		 ac_cv_c_bigendian=universal
-		 break
-	       fi
-	       ;;
-	   esac
-	   ac_prev=
-	 elif test "x$ac_word" = "x-arch"; then
-	   ac_prev=arch
-	 fi
-       done
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    if test $ac_cv_c_bigendian = unknown; then
-      # See if sys/param.h defines the BYTE_ORDER macro.
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-	     #include <sys/param.h>
-
-int
-main ()
-{
-#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
-		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
-		     && LITTLE_ENDIAN)
-	      bogus endian macros
-	     #endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  # It does; now see whether it defined to BIG_ENDIAN or not.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-		#include <sys/param.h>
-
-int
-main ()
-{
-#if BYTE_ORDER != BIG_ENDIAN
-		 not big endian
-		#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_bigendian=yes
-else
-  ac_cv_c_bigendian=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    fi
-    if test $ac_cv_c_bigendian = unknown; then
-      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
-
-int
-main ()
-{
-#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
-	      bogus endian macros
-	     #endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  # It does; now see whether it defined to _BIG_ENDIAN or not.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
-
-int
-main ()
-{
-#ifndef _BIG_ENDIAN
-		 not big endian
-		#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_bigendian=yes
-else
-  ac_cv_c_bigendian=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    fi
-    if test $ac_cv_c_bigendian = unknown; then
-      # Compile a test program.
-      if test "$cross_compiling" = yes; then :
-  # Try to guess by grepping values from an object file.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-short int ascii_mm[] =
-		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
-		short int ascii_ii[] =
-		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
-		int use_ascii (int i) {
-		  return ascii_mm[i] + ascii_ii[i];
-		}
-		short int ebcdic_ii[] =
-		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
-		short int ebcdic_mm[] =
-		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
-		int use_ebcdic (int i) {
-		  return ebcdic_mm[i] + ebcdic_ii[i];
-		}
-		extern int foo;
-
-int
-main ()
-{
-return use_ascii (foo) == use_ebcdic (foo);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
-	      ac_cv_c_bigendian=yes
-	    fi
-	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
-	      if test "$ac_cv_c_bigendian" = unknown; then
-		ac_cv_c_bigendian=no
-	      else
-		# finding both strings is unlikely to happen, but who knows?
-		ac_cv_c_bigendian=unknown
-	      fi
-	    fi
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-
-	     /* Are we little or big endian?  From Harbison&Steele.  */
-	     union
-	     {
-	       long int l;
-	       char c[sizeof (long int)];
-	     } u;
-	     u.l = 1;
-	     return u.c[sizeof (long int) - 1] == 1;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_c_bigendian=no
-else
-  ac_cv_c_bigendian=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-    fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
-$as_echo "$ac_cv_c_bigendian" >&6; }
- case $ac_cv_c_bigendian in #(
-   yes)
-     $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
-;; #(
-   no)
-      ;; #(
-   universal)
-
-$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
-
-     ;; #(
-   *)
-     as_fn_error $? "unknown endianness
- presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
- esac
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether long double and double are the same" >&5
-$as_echo_n "checking whether long double and double are the same... " >&6; }
-if ${gl_cv_long_double_equals_double+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <float.h>
-int
-main ()
-{
-typedef int check[sizeof (long double) == sizeof (double)
-                              && LDBL_MANT_DIG == DBL_MANT_DIG
-                              && LDBL_MAX_EXP == DBL_MAX_EXP
-                              && LDBL_MIN_EXP == DBL_MIN_EXP
-                              ? 1 : -1];
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_long_double_equals_double=yes
-else
-  gl_cv_long_double_equals_double=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_long_double_equals_double" >&5
-$as_echo "$gl_cv_long_double_equals_double" >&6; }
-  if test $gl_cv_long_double_equals_double = yes; then
-
-$as_echo "#define HAVE_SAME_LONG_DOUBLE_AS_DOUBLE 1" >>confdefs.h
-
-    HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=1
-  else
-    HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=0
-  fi
-
-
-
-
-
-
-
-         if test -n "$gl_printf_safe"; then
-
-$as_echo "#define CHECK_PRINTF_SAFE 1" >>confdefs.h
-
-  fi
-  case "$gl_cv_func_printf_long_double" in
-    *yes)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports infinite 'long double' arguments" >&5
-$as_echo_n "checking whether printf supports infinite 'long double' arguments... " >&6; }
-if ${gl_cv_func_printf_infinite_long_double+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-          if test "$cross_compiling" = yes; then :
-  case "$host_cpu" in
-                                     # Guess no on ia64, x86_64, i386.
-               ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";;
-               *)
-                 case "$host_os" in
-                                         # Guess yes on glibc systems.
-                   *-gnu* | gnu*)        gl_cv_func_printf_infinite_long_double="guessing yes";;
-                                         # Guess yes on musl systems.
-                   *-musl*)              gl_cv_func_printf_infinite_long_double="guessing yes";;
-                                         # Guess yes on FreeBSD >= 6.
-                   freebsd[1-5].*)       gl_cv_func_printf_infinite_long_double="guessing no";;
-                   freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
-                                         # Guess yes on HP-UX >= 11.
-                   hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";;
-                   hpux*)                gl_cv_func_printf_infinite_long_double="guessing yes";;
-                                         # Guess no on Android.
-                   linux*-android*)      gl_cv_func_printf_infinite_long_double="guessing no";;
-                                         # Guess yes on MSVC, no on mingw.
-                   mingw*)               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef _MSC_VER
- Known
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Known" >/dev/null 2>&1; then :
-  gl_cv_func_printf_infinite_long_double="guessing yes"
-else
-  gl_cv_func_printf_infinite_long_double="guessing no"
-fi
-rm -f conftest*
-
-                                         ;;
-                                         # If we don't know, obey --enable-cross-guesses.
-                   *)                    gl_cv_func_printf_infinite_long_double="$gl_cross_guess_normal";;
-                 esac
-                 ;;
-             esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-#include <stdlib.h>
-#if defined __MACH__ && defined __APPLE__
-/* Avoid a crash on Mac OS X.  */
-#include <mach/mach.h>
-#include <mach/mach_error.h>
-#include <mach/thread_status.h>
-#include <mach/exception.h>
-#include <mach/task.h>
-#include <pthread.h>
-/* The exception port on which our thread listens.  */
-static mach_port_t our_exception_port;
-/* The main function of the thread listening for exceptions of type
-   EXC_BAD_ACCESS.  */
-static void *
-mach_exception_thread (void *arg)
-{
-  /* Buffer for a message to be received.  */
-  struct {
-    mach_msg_header_t head;
-    mach_msg_body_t msgh_body;
-    char data[1024];
-  } msg;
-  mach_msg_return_t retval;
-  /* Wait for a message on the exception port.  */
-  retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
-                     our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
-  if (retval != MACH_MSG_SUCCESS)
-    abort ();
-  exit (1);
-}
-static void
-nocrash_init (void)
-{
-  mach_port_t self = mach_task_self ();
-  /* Allocate a port on which the thread shall listen for exceptions.  */
-  if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
-      == KERN_SUCCESS) {
-    /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html.  */
-    if (mach_port_insert_right (self, our_exception_port, our_exception_port,
-                                MACH_MSG_TYPE_MAKE_SEND)
-        == KERN_SUCCESS) {
-      /* The exceptions we want to catch.  Only EXC_BAD_ACCESS is interesting
-         for us.  */
-      exception_mask_t mask = EXC_MASK_BAD_ACCESS;
-      /* Create the thread listening on the exception port.  */
-      pthread_attr_t attr;
-      pthread_t thread;
-      if (pthread_attr_init (&attr) == 0
-          && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
-          && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
-        pthread_attr_destroy (&attr);
-        /* Replace the exception port info for these exceptions with our own.
-           Note that we replace the exception port for the entire task, not only
-           for a particular thread.  This has the effect that when our exception
-           port gets the message, the thread specific exception port has already
-           been asked, and we don't need to bother about it.
-           See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html.  */
-        task_set_exception_ports (self, mask, our_exception_port,
-                                  EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
-      }
-    }
-  }
-}
-#elif defined _WIN32 && ! defined __CYGWIN__
-/* Avoid a crash on native Windows.  */
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <winerror.h>
-static LONG WINAPI
-exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
-{
-  switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
-    {
-    case EXCEPTION_ACCESS_VIOLATION:
-    case EXCEPTION_IN_PAGE_ERROR:
-    case EXCEPTION_STACK_OVERFLOW:
-    case EXCEPTION_GUARD_PAGE:
-    case EXCEPTION_PRIV_INSTRUCTION:
-    case EXCEPTION_ILLEGAL_INSTRUCTION:
-    case EXCEPTION_DATATYPE_MISALIGNMENT:
-    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
-    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
-      exit (1);
-    }
-  return EXCEPTION_CONTINUE_SEARCH;
-}
-static void
-nocrash_init (void)
-{
-  SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
-}
-#else
-/* Avoid a crash on POSIX systems.  */
-#include <signal.h>
-#include <unistd.h>
-/* A POSIX signal handler.  */
-static void
-exception_handler (int sig)
-{
-  _exit (1);
-}
-static void
-nocrash_init (void)
-{
-#ifdef SIGSEGV
-  signal (SIGSEGV, exception_handler);
-#endif
-#ifdef SIGBUS
-  signal (SIGBUS, exception_handler);
-#endif
-}
-#endif
-
-#include <float.h>
-#include <stdio.h>
-#include <string.h>
-static int
-strisnan (const char *string, size_t start_index, size_t end_index)
-{
-  if (start_index < end_index)
-    {
-      if (string[start_index] == '-')
-        start_index++;
-      if (start_index + 3 <= end_index
-          && memcmp (string + start_index, "nan", 3) == 0)
-        {
-          start_index += 3;
-          if (start_index == end_index
-              || (string[start_index] == '(' && string[end_index - 1] == ')'))
-            return 1;
-        }
-    }
-  return 0;
-}
-static char buf[10000];
-static long double zeroL = 0.0L;
-int main ()
-{
-  int result = 0;
-  nocrash_init();
-  if (sprintf (buf, "%Lf", 1.0L / zeroL) < 0
-      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
-    result |= 1;
-  if (sprintf (buf, "%Lf", -1.0L / zeroL) < 0
-      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
-    result |= 1;
-  if (sprintf (buf, "%Lf", zeroL / zeroL) < 0
-      || !strisnan (buf, 0, strlen (buf)))
-    result |= 1;
-  if (sprintf (buf, "%Le", 1.0L / zeroL) < 0
-      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
-    result |= 1;
-  if (sprintf (buf, "%Le", -1.0L / zeroL) < 0
-      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
-    result |= 1;
-  if (sprintf (buf, "%Le", zeroL / zeroL) < 0
-      || !strisnan (buf, 0, strlen (buf)))
-    result |= 1;
-  if (sprintf (buf, "%Lg", 1.0L / zeroL) < 0
-      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
-    result |= 1;
-  if (sprintf (buf, "%Lg", -1.0L / zeroL) < 0
-      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
-    result |= 1;
-  if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
-      || !strisnan (buf, 0, strlen (buf)))
-    result |= 1;
-#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
-/* Representation of an 80-bit 'long double' as an initializer for a sequence
-   of 'unsigned int' words.  */
-# ifdef WORDS_BIGENDIAN
-#  define LDBL80_WORDS(exponent,manthi,mantlo) \
-     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
-       ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16),   \
-       (unsigned int) (mantlo) << 16                                        \
-     }
-# else
-#  define LDBL80_WORDS(exponent,manthi,mantlo) \
-     { mantlo, manthi, exponent }
-# endif
-  { /* Quiet NaN.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
-    if (sprintf (buf, "%Lf", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
-      result |= 2;
-    if (sprintf (buf, "%Le", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
-      result |= 2;
-    if (sprintf (buf, "%Lg", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
-      result |= 2;
-  }
-  {
-    /* Signalling NaN.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
-    if (sprintf (buf, "%Lf", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
-      result |= 2;
-    if (sprintf (buf, "%Le", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
-      result |= 2;
-    if (sprintf (buf, "%Lg", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
-      result |= 2;
-  }
-  { /* Pseudo-NaN.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    if (sprintf (buf, "%Lf", x.value) <= 0)
-      result |= 4;
-    if (sprintf (buf, "%Le", x.value) <= 0)
-      result |= 4;
-    if (sprintf (buf, "%Lg", x.value) <= 0)
-      result |= 4;
-  }
-  { /* Pseudo-Infinity.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    if (sprintf (buf, "%Lf", x.value) <= 0)
-      result |= 8;
-    if (sprintf (buf, "%Le", x.value) <= 0)
-      result |= 8;
-    if (sprintf (buf, "%Lg", x.value) <= 0)
-      result |= 8;
-  }
-  { /* Pseudo-Zero.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    if (sprintf (buf, "%Lf", x.value) <= 0)
-      result |= 16;
-    if (sprintf (buf, "%Le", x.value) <= 0)
-      result |= 16;
-    if (sprintf (buf, "%Lg", x.value) <= 0)
-      result |= 16;
-  }
-  { /* Unnormalized number.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    if (sprintf (buf, "%Lf", x.value) <= 0)
-      result |= 32;
-    if (sprintf (buf, "%Le", x.value) <= 0)
-      result |= 32;
-    if (sprintf (buf, "%Lg", x.value) <= 0)
-      result |= 32;
-  }
-  { /* Pseudo-Denormal.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    if (sprintf (buf, "%Lf", x.value) <= 0)
-      result |= 64;
-    if (sprintf (buf, "%Le", x.value) <= 0)
-      result |= 64;
-    if (sprintf (buf, "%Lg", x.value) <= 0)
-      result |= 64;
-  }
-#endif
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_printf_infinite_long_double=yes
-else
-  gl_cv_func_printf_infinite_long_double=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_infinite_long_double" >&5
-$as_echo "$gl_cv_func_printf_infinite_long_double" >&6; }
-      ;;
-    *)
-      gl_cv_func_printf_infinite_long_double="irrelevant"
-      ;;
-  esac
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'a' and 'A' directives" >&5
-$as_echo_n "checking whether printf supports the 'a' and 'A' directives... " >&6; }
-if ${gl_cv_func_printf_directive_a+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-                                 # Guess yes on glibc >= 2.5 systems.
-           *-gnu* | gnu*)
-             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-               #include <features.h>
-               #ifdef __GNU_LIBRARY__
-                #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__
-                 BZ2908
-                #endif
-               #endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "BZ2908" >/dev/null 2>&1; then :
-  gl_cv_func_printf_directive_a="guessing yes"
-else
-  gl_cv_func_printf_directive_a="guessing no"
-fi
-rm -f conftest*
-
-             ;;
-                                 # Guess yes on musl systems.
-           *-musl*)              gl_cv_func_printf_directive_a="guessing yes";;
-                                 # Guess no on Android.
-           linux*-android*)      gl_cv_func_printf_directive_a="guessing no";;
-                                 # Guess no on native Windows.
-           mingw*)               gl_cv_func_printf_directive_a="guessing no";;
-                                 # If we don't know, obey --enable-cross-guesses.
-           *)                    gl_cv_func_printf_directive_a="$gl_cross_guess_normal";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <string.h>
-static char buf[100];
-static double zero = 0.0;
-int main ()
-{
-  int result = 0;
-  if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0
-      || (strcmp (buf, "0x1.922p+1 33") != 0
-          && strcmp (buf, "0x3.244p+0 33") != 0
-          && strcmp (buf, "0x6.488p-1 33") != 0
-          && strcmp (buf, "0xc.91p-2 33") != 0))
-    result |= 1;
-  if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0
-      || (strcmp (buf, "-0X1.922P+1 33") != 0
-          && strcmp (buf, "-0X3.244P+0 33") != 0
-          && strcmp (buf, "-0X6.488P-1 33") != 0
-          && strcmp (buf, "-0XC.91P-2 33") != 0))
-    result |= 2;
-  /* This catches a FreeBSD 6.1 bug: it doesn't round.  */
-  if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0
-      || (strcmp (buf, "0x1.83p+0 33") != 0
-          && strcmp (buf, "0x3.05p-1 33") != 0
-          && strcmp (buf, "0x6.0ap-2 33") != 0
-          && strcmp (buf, "0xc.14p-3 33") != 0))
-    result |= 4;
-  /* This catches a Mac OS X 10.12.4 (Darwin 16.5) bug: it doesn't round.  */
-  if (sprintf (buf, "%.0a %d", 1.51, 33, 44, 55) < 0
-      || (strcmp (buf, "0x2p+0 33") != 0
-          && strcmp (buf, "0x3p-1 33") != 0
-          && strcmp (buf, "0x6p-2 33") != 0
-          && strcmp (buf, "0xcp-3 33") != 0))
-    result |= 4;
-  /* This catches a FreeBSD 6.1 bug.  See
-     <https://lists.gnu.org/r/bug-gnulib/2007-04/msg00107.html> */
-  if (sprintf (buf, "%010a %d", 1.0 / zero, 33, 44, 55) < 0
-      || buf[0] == '0')
-    result |= 8;
-  /* This catches a Mac OS X 10.3.9 (Darwin 7.9) bug.  */
-  if (sprintf (buf, "%.1a", 1.999) < 0
-      || (strcmp (buf, "0x1.0p+1") != 0
-          && strcmp (buf, "0x2.0p+0") != 0
-          && strcmp (buf, "0x4.0p-1") != 0
-          && strcmp (buf, "0x8.0p-2") != 0))
-    result |= 16;
-  /* This catches the same Mac OS X 10.3.9 (Darwin 7.9) bug and also a
-     glibc 2.4 bug <https://sourceware.org/bugzilla/show_bug.cgi?id=2908>.  */
-  if (sprintf (buf, "%.1La", 1.999L) < 0
-      || (strcmp (buf, "0x1.0p+1") != 0
-          && strcmp (buf, "0x2.0p+0") != 0
-          && strcmp (buf, "0x4.0p-1") != 0
-          && strcmp (buf, "0x8.0p-2") != 0))
-    result |= 32;
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_printf_directive_a=yes
-else
-  gl_cv_func_printf_directive_a=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_a" >&5
-$as_echo "$gl_cv_func_printf_directive_a" >&6; }
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'F' directive" >&5
-$as_echo_n "checking whether printf supports the 'F' directive... " >&6; }
-if ${gl_cv_func_printf_directive_f+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-                                 # Guess yes on glibc systems.
-           *-gnu* | gnu*)        gl_cv_func_printf_directive_f="guessing yes";;
-                                 # Guess yes on musl systems.
-           *-musl*)              gl_cv_func_printf_directive_f="guessing yes";;
-                                 # Guess yes on FreeBSD >= 6.
-           freebsd[1-5].*)       gl_cv_func_printf_directive_f="guessing no";;
-           freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
-                                 # Guess yes on Mac OS X >= 10.3.
-           darwin[1-6].*)        gl_cv_func_printf_directive_f="guessing no";;
-           darwin*)              gl_cv_func_printf_directive_f="guessing yes";;
-                                 # Guess yes on Solaris >= 2.10.
-           solaris2.[1-9][0-9]*) gl_cv_func_printf_directive_f="guessing yes";;
-           solaris*)             gl_cv_func_printf_directive_f="guessing no";;
-                                 # Guess no on Android.
-           linux*-android*)      gl_cv_func_printf_directive_f="guessing no";;
-                                 # Guess yes on MSVC, no on mingw.
-           mingw*)               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef _MSC_VER
- Known
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Known" >/dev/null 2>&1; then :
-  gl_cv_func_printf_directive_f="guessing yes"
-else
-  gl_cv_func_printf_directive_f="guessing no"
-fi
-rm -f conftest*
-
-                                 ;;
-                                 # If we don't know, obey --enable-cross-guesses.
-           *)                    gl_cv_func_printf_directive_f="$gl_cross_guess_normal";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <string.h>
-static char buf[100];
-static double zero = 0.0;
-int main ()
-{
-  int result = 0;
-  if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
-      || strcmp (buf, "1234567.000000 33") != 0)
-    result |= 1;
-  if (sprintf (buf, "%F", 1.0 / zero) < 0
-      || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
-    result |= 2;
-  /* This catches a Cygwin 1.5.x bug.  */
-  if (sprintf (buf, "%.F", 1234.0) < 0
-      || strcmp (buf, "1234") != 0)
-    result |= 4;
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_printf_directive_f=yes
-else
-  gl_cv_func_printf_directive_f=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_f" >&5
-$as_echo "$gl_cv_func_printf_directive_f" >&6; }
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'n' directive" >&5
-$as_echo_n "checking whether printf supports the 'n' directive... " >&6; }
-if ${gl_cv_func_printf_directive_n+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                            # Guess no on Android.
-           linux*-android*) gl_cv_func_printf_directive_n="guessing no";;
-                            # Guess no on native Windows.
-           mingw*)          gl_cv_func_printf_directive_n="guessing no";;
-           *)               gl_cv_func_printf_directive_n="guessing yes";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#ifdef _MSC_VER
-/* See page about "Parameter Validation" on msdn.microsoft.com.  */
-static void cdecl
-invalid_parameter_handler (const wchar_t *expression,
-                           const wchar_t *function,
-                           const wchar_t *file, unsigned int line,
-                           uintptr_t dummy)
-{
-  exit (1);
-}
-#endif
-static char fmtstring[10];
-static char buf[100];
-int main ()
-{
-  int count = -1;
-#ifdef _MSC_VER
-  _set_invalid_parameter_handler (invalid_parameter_handler);
-#endif
-  /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
-     support %n in format strings in read-only memory but not in writable
-     memory.  */
-  strcpy (fmtstring, "%d %n");
-  if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
-      || strcmp (buf, "123 ") != 0
-      || count != 4)
-    return 1;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_printf_directive_n=yes
-else
-  gl_cv_func_printf_directive_n=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_n" >&5
-$as_echo "$gl_cv_func_printf_directive_n" >&6; }
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'ls' directive" >&5
-$as_echo_n "checking whether printf supports the 'ls' directive... " >&6; }
-if ${gl_cv_func_printf_directive_ls+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-           openbsd*)        gl_cv_func_printf_directive_ls="guessing no";;
-           irix*)           gl_cv_func_printf_directive_ls="guessing no";;
-           solaris*)        gl_cv_func_printf_directive_ls="guessing no";;
-           cygwin*)         gl_cv_func_printf_directive_ls="guessing no";;
-           beos* | haiku*)  gl_cv_func_printf_directive_ls="guessing no";;
-                            # Guess no on Android.
-           linux*-android*) gl_cv_func_printf_directive_ls="guessing no";;
-                            # Guess yes on native Windows.
-           mingw*)          gl_cv_func_printf_directive_ls="guessing yes";;
-           *)               gl_cv_func_printf_directive_ls="guessing yes";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-#include <string.h>
-int main ()
-{
-  int result = 0;
-  char buf[100];
-  /* Test whether %ls works at all.
-     This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on
-     Cygwin 1.5.  */
-  {
-    static const wchar_t wstring[] = { 'a', 'b', 'c', 0 };
-    buf[0] = '\0';
-    if (sprintf (buf, "%ls", wstring) < 0
-        || strcmp (buf, "abc") != 0)
-      result |= 1;
-  }
-  /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an
-     assertion failure inside libc), but not on OpenBSD 4.0.  */
-  {
-    static const wchar_t wstring[] = { 'a', 0 };
-    buf[0] = '\0';
-    if (sprintf (buf, "%ls", wstring) < 0
-        || strcmp (buf, "a") != 0)
-      result |= 2;
-  }
-  /* Test whether precisions in %ls are supported as specified in ISO C 99
-     section 7.19.6.1:
-       "If a precision is specified, no more than that many bytes are written
-        (including shift sequences, if any), and the array shall contain a
-        null wide character if, to equal the multibyte character sequence
-        length given by the precision, the function would need to access a
-        wide character one past the end of the array."
-     This test fails on Solaris 10.  */
-  {
-    static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 };
-    buf[0] = '\0';
-    if (sprintf (buf, "%.2ls", wstring) < 0
-        || strcmp (buf, "ab") != 0)
-      result |= 8;
-  }
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_printf_directive_ls=yes
-else
-  gl_cv_func_printf_directive_ls=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_ls" >&5
-$as_echo "$gl_cv_func_printf_directive_ls" >&6; }
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5
-$as_echo_n "checking whether printf supports POSIX/XSI format strings with positions... " >&6; }
-if ${gl_cv_func_printf_positions+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-           netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
-                            gl_cv_func_printf_positions="guessing no";;
-           beos*)           gl_cv_func_printf_positions="guessing no";;
-                            # Guess yes on Android.
-           linux*-android*) gl_cv_func_printf_positions="guessing yes";;
-                            # Guess no on native Windows.
-           mingw* | pw*)    gl_cv_func_printf_positions="guessing no";;
-           *)               gl_cv_func_printf_positions="guessing yes";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <string.h>
-/* The string "%2$d %1$d", with dollar characters protected from the shell's
-   dollar expansion (possibly an autoconf bug).  */
-static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
-static char buf[100];
-int main ()
-{
-  sprintf (buf, format, 33, 55);
-  return (strcmp (buf, "55 33") != 0);
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_printf_positions=yes
-else
-  gl_cv_func_printf_positions=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5
-$as_echo "$gl_cv_func_printf_positions" >&6; }
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the grouping flag" >&5
-$as_echo_n "checking whether printf supports the grouping flag... " >&6; }
-if ${gl_cv_func_printf_flag_grouping+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-           cygwin*)         gl_cv_func_printf_flag_grouping="guessing no";;
-           netbsd*)         gl_cv_func_printf_flag_grouping="guessing no";;
-                            # Guess no on Android.
-           linux*-android*) gl_cv_func_printf_flag_grouping="guessing no";;
-                            # Guess no on native Windows.
-           mingw* | pw*)    gl_cv_func_printf_flag_grouping="guessing no";;
-           *)               gl_cv_func_printf_flag_grouping="guessing yes";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <string.h>
-static char buf[100];
-int main ()
-{
-  if (sprintf (buf, "%'d %d", 1234567, 99) < 0
-      || buf[strlen (buf) - 1] != '9')
-    return 1;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_printf_flag_grouping=yes
-else
-  gl_cv_func_printf_flag_grouping=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_grouping" >&5
-$as_echo "$gl_cv_func_printf_flag_grouping" >&6; }
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the left-adjust flag correctly" >&5
-$as_echo_n "checking whether printf supports the left-adjust flag correctly... " >&6; }
-if ${gl_cv_func_printf_flag_leftadjust+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-                            # Guess yes on HP-UX 11.
-           hpux11*)         gl_cv_func_printf_flag_leftadjust="guessing yes";;
-                            # Guess no on HP-UX 10 and older.
-           hpux*)           gl_cv_func_printf_flag_leftadjust="guessing no";;
-                            # Guess yes on Android.
-           linux*-android*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
-                            # Guess yes on native Windows.
-           mingw*)          gl_cv_func_printf_flag_leftadjust="guessing yes";;
-                            # Guess yes otherwise.
-           *)               gl_cv_func_printf_flag_leftadjust="guessing yes";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <string.h>
-static char buf[100];
-int main ()
-{
-  /* Check that a '-' flag is not annihilated by a negative width.  */
-  if (sprintf (buf, "a%-*sc", -3, "b") < 0
-      || strcmp (buf, "ab  c") != 0)
-    return 1;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_printf_flag_leftadjust=yes
-else
-  gl_cv_func_printf_flag_leftadjust=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_leftadjust" >&5
-$as_echo "$gl_cv_func_printf_flag_leftadjust" >&6; }
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the zero flag correctly" >&5
-$as_echo_n "checking whether printf supports the zero flag correctly... " >&6; }
-if ${gl_cv_func_printf_flag_zero+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-                            # Guess yes on glibc systems.
-           *-gnu* | gnu*)   gl_cv_func_printf_flag_zero="guessing yes";;
-                            # Guess yes on musl systems.
-           *-musl*)         gl_cv_func_printf_flag_zero="guessing yes";;
-                            # Guess yes on BeOS.
-           beos*)           gl_cv_func_printf_flag_zero="guessing yes";;
-                            # Guess no on Android.
-           linux*-android*) gl_cv_func_printf_flag_zero="guessing no";;
-                            # Guess no on native Windows.
-           mingw*)          gl_cv_func_printf_flag_zero="guessing no";;
-                            # If we don't know, obey --enable-cross-guesses.
-           *)               gl_cv_func_printf_flag_zero="$gl_cross_guess_normal";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <string.h>
-static char buf[100];
-static double zero = 0.0;
-int main ()
-{
-  if (sprintf (buf, "%010f", 1.0 / zero, 33, 44, 55) < 0
-      || (strcmp (buf, "       inf") != 0
-          && strcmp (buf, "  infinity") != 0))
-    return 1;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_printf_flag_zero=yes
-else
-  gl_cv_func_printf_flag_zero=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_zero" >&5
-$as_echo "$gl_cv_func_printf_flag_zero" >&6; }
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports large precisions" >&5
-$as_echo_n "checking whether printf supports large precisions... " >&6; }
-if ${gl_cv_func_printf_precision+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-           # Guess no only on Solaris, native Windows, and BeOS systems.
-           solaris*)        gl_cv_func_printf_precision="guessing no" ;;
-           mingw* | pw*)    gl_cv_func_printf_precision="guessing no" ;;
-           beos*)           gl_cv_func_printf_precision="guessing no" ;;
-                            # Guess yes on Android.
-           linux*-android*) gl_cv_func_printf_precision="guessing yes" ;;
-           *)               gl_cv_func_printf_precision="guessing yes" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <string.h>
-static char buf[5000];
-int main ()
-{
-  int result = 0;
-#ifdef __BEOS__
-  /* On BeOS, this would crash and show a dialog box.  Avoid the crash.  */
-  return 1;
-#endif
-  if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3)
-    result |= 1;
-  if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5)
-    result |= 2;
-  if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5
-      || buf[0] != '1')
-    result |= 4;
-  if (sprintf (buf, "%.999f %d", 1.0, 33, 44) < 999 + 5
-      || buf[0] != '1')
-    result |= 4;
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_printf_precision=yes
-else
-  gl_cv_func_printf_precision=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_precision" >&5
-$as_echo "$gl_cv_func_printf_precision" >&6; }
-
-
-    gl_cv_c_multiarch=no
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifndef __APPLE_CC__
-         not a universal capable compiler
-        #endif
-        typedef int dummy;
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-               arch=
-     prev=
-     for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do
-       if test -n "$prev"; then
-         case $word in
-           i?86 | x86_64 | ppc | ppc64)
-             if test -z "$arch" || test "$arch" = "$word"; then
-               arch="$word"
-             else
-               gl_cv_c_multiarch=yes
-             fi
-             ;;
-         esac
-         prev=
-       else
-         if test "x$word" = "x-arch"; then
-           prev=arch
-         fi
-       fi
-     done
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  if test $gl_cv_c_multiarch = yes; then
-    APPLE_UNIVERSAL_BUILD=1
-  else
-    APPLE_UNIVERSAL_BUILD=0
-  fi
-
-
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf survives out-of-memory conditions" >&5
-$as_echo_n "checking whether printf survives out-of-memory conditions... " >&6; }
-if ${gl_cv_func_printf_enomem+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      gl_cv_func_printf_enomem="guessing no"
-      if test "$cross_compiling" = no; then
-        if test $APPLE_UNIVERSAL_BUILD = 0; then
-          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-#include <stdlib.h>
-#if defined __MACH__ && defined __APPLE__
-/* Avoid a crash on Mac OS X.  */
-#include <mach/mach.h>
-#include <mach/mach_error.h>
-#include <mach/thread_status.h>
-#include <mach/exception.h>
-#include <mach/task.h>
-#include <pthread.h>
-/* The exception port on which our thread listens.  */
-static mach_port_t our_exception_port;
-/* The main function of the thread listening for exceptions of type
-   EXC_BAD_ACCESS.  */
-static void *
-mach_exception_thread (void *arg)
-{
-  /* Buffer for a message to be received.  */
-  struct {
-    mach_msg_header_t head;
-    mach_msg_body_t msgh_body;
-    char data1024;
-  } msg;
-  mach_msg_return_t retval;
-  /* Wait for a message on the exception port.  */
-  retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
-                     our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
-  if (retval != MACH_MSG_SUCCESS)
-    abort ();
-  exit (1);
-}
-static void
-nocrash_init (void)
-{
-  mach_port_t self = mach_task_self ();
-  /* Allocate a port on which the thread shall listen for exceptions.  */
-  if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
-      == KERN_SUCCESS) {
-    /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html.  */
-    if (mach_port_insert_right (self, our_exception_port, our_exception_port,
-                                MACH_MSG_TYPE_MAKE_SEND)
-        == KERN_SUCCESS) {
-      /* The exceptions we want to catch.  Only EXC_BAD_ACCESS is interesting
-         for us.  */
-      exception_mask_t mask = EXC_MASK_BAD_ACCESS;
-      /* Create the thread listening on the exception port.  */
-      pthread_attr_t attr;
-      pthread_t thread;
-      if (pthread_attr_init (&attr) == 0
-          && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
-          && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
-        pthread_attr_destroy (&attr);
-        /* Replace the exception port info for these exceptions with our own.
-           Note that we replace the exception port for the entire task, not only
-           for a particular thread.  This has the effect that when our exception
-           port gets the message, the thread specific exception port has already
-           been asked, and we don't need to bother about it.
-           See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html.  */
-        task_set_exception_ports (self, mask, our_exception_port,
-                                  EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
-      }
-    }
-  }
-}
-#elif defined _WIN32 && ! defined __CYGWIN__
-/* Avoid a crash on native Windows.  */
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <winerror.h>
-static LONG WINAPI
-exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
-{
-  switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
-    {
-    case EXCEPTION_ACCESS_VIOLATION:
-    case EXCEPTION_IN_PAGE_ERROR:
-    case EXCEPTION_STACK_OVERFLOW:
-    case EXCEPTION_GUARD_PAGE:
-    case EXCEPTION_PRIV_INSTRUCTION:
-    case EXCEPTION_ILLEGAL_INSTRUCTION:
-    case EXCEPTION_DATATYPE_MISALIGNMENT:
-    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
-    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
-      exit (1);
-    }
-  return EXCEPTION_CONTINUE_SEARCH;
-}
-static void
-nocrash_init (void)
-{
-  SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
-}
-#else
-/* Avoid a crash on POSIX systems.  */
-#include <signal.h>
-#include <unistd.h>
-/* A POSIX signal handler.  */
-static void
-exception_handler (int sig)
-{
-  _exit (1);
-}
-static void
-nocrash_init (void)
-{
-#ifdef SIGSEGV
-  signal (SIGSEGV, exception_handler);
-#endif
-#ifdef SIGBUS
-  signal (SIGBUS, exception_handler);
-#endif
-}
-#endif
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <errno.h>
-int main()
-{
-  struct rlimit limit;
-  int ret;
-  nocrash_init ();
-  /* Some printf implementations allocate temporary space with malloc.  */
-  /* On BSD systems, malloc() is limited by RLIMIT_DATA.  */
-#ifdef RLIMIT_DATA
-  if (getrlimit (RLIMIT_DATA, &limit) < 0)
-    return 77;
-  if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
-    limit.rlim_max = 5000000;
-  limit.rlim_cur = limit.rlim_max;
-  if (setrlimit (RLIMIT_DATA, &limit) < 0)
-    return 77;
-#endif
-  /* On Linux systems, malloc() is limited by RLIMIT_AS.  */
-#ifdef RLIMIT_AS
-  if (getrlimit (RLIMIT_AS, &limit) < 0)
-    return 77;
-  if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
-    limit.rlim_max = 5000000;
-  limit.rlim_cur = limit.rlim_max;
-  if (setrlimit (RLIMIT_AS, &limit) < 0)
-    return 77;
-#endif
-  /* Some printf implementations allocate temporary space on the stack.  */
-#ifdef RLIMIT_STACK
-  if (getrlimit (RLIMIT_STACK, &limit) < 0)
-    return 77;
-  if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
-    limit.rlim_max = 5000000;
-  limit.rlim_cur = limit.rlim_max;
-  if (setrlimit (RLIMIT_STACK, &limit) < 0)
-    return 77;
-#endif
-  ret = printf ("%.5000000f", 1.0);
-  return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
-}
-
-_ACEOF
-          if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest$ac_exeext; then
-            (./conftest 2>&5
-             result=$?
-             $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $result" >&5
-             if test $result != 0 && test $result != 77; then result=1; fi
-             exit $result
-            ) >/dev/null 2>/dev/null
-            case $? in
-              0) gl_cv_func_printf_enomem="yes" ;;
-              77) gl_cv_func_printf_enomem="guessing no" ;;
-              *) gl_cv_func_printf_enomem="no" ;;
-            esac
-          else
-            gl_cv_func_printf_enomem="guessing no"
-          fi
-          rm -fr conftest*
-        else
-                                        gl_cv_func_printf_enomem="guessing no"
-        fi
-      fi
-      if test "$gl_cv_func_printf_enomem" = "guessing no"; then
-        case "$host_os" in
-                           # Guess yes on glibc systems.
-          *-gnu* | gnu*)   gl_cv_func_printf_enomem="guessing yes";;
-                           # Guess yes on Solaris.
-          solaris*)        gl_cv_func_printf_enomem="guessing yes";;
-                           # Guess yes on AIX.
-          aix*)            gl_cv_func_printf_enomem="guessing yes";;
-                           # Guess yes on HP-UX/hppa.
-          hpux*)           case "$host_cpu" in
-                             hppa*) gl_cv_func_printf_enomem="guessing yes";;
-                             *)     gl_cv_func_printf_enomem="guessing no";;
-                           esac
-                           ;;
-                           # Guess yes on IRIX.
-          irix*)           gl_cv_func_printf_enomem="guessing yes";;
-                           # Guess yes on OSF/1.
-          osf*)            gl_cv_func_printf_enomem="guessing yes";;
-                           # Guess yes on BeOS.
-          beos*)           gl_cv_func_printf_enomem="guessing yes";;
-                           # Guess yes on Haiku.
-          haiku*)          gl_cv_func_printf_enomem="guessing yes";;
-                           # Guess no on Android.
-          linux*-android*) gl_cv_func_printf_enomem="guessing no";;
-                           # If we don't know, obey --enable-cross-guesses.
-          *)               gl_cv_func_printf_enomem="$gl_cross_guess_normal";;
-        esac
-      fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_enomem" >&5
-$as_echo "$gl_cv_func_printf_enomem" >&6; }
-
-
-
-  case "$gl_cv_func_printf_long_double" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long int" >&5
-$as_echo_n "checking for unsigned long long int... " >&6; }
-if ${ac_cv_type_unsigned_long_long_int+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_type_unsigned_long_long_int=yes
-     if test "x${ac_cv_prog_cc_c99-no}" = xno; then
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-  /* For now, do not test the preprocessor; as of 2007 there are too many
-         implementations with broken preprocessors.  Perhaps this can
-         be revisited in 2012.  In the meantime, code should not expect
-         #if to work with literals wider than 32 bits.  */
-      /* Test literals.  */
-      long long int ll = 9223372036854775807ll;
-      long long int nll = -9223372036854775807LL;
-      unsigned long long int ull = 18446744073709551615ULL;
-      /* Test constant expressions.   */
-      typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
-                     ? 1 : -1)];
-      typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
-                     ? 1 : -1)];
-      int i = 63;
-int
-main ()
-{
-/* Test availability of runtime routines for shift and division.  */
-      long long int llmax = 9223372036854775807ll;
-      unsigned long long int ullmax = 18446744073709551615ull;
-      return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
-              | (llmax / ll) | (llmax % ll)
-              | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
-              | (ullmax / ull) | (ullmax % ull));
-  ;
-  return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-else
-  ac_cv_type_unsigned_long_long_int=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-     fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long_int" >&5
-$as_echo "$ac_cv_type_unsigned_long_long_int" >&6; }
-  if test $ac_cv_type_unsigned_long_long_int = yes; then
-
-$as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h
-
-  fi
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5
-$as_echo_n "checking for long long int... " >&6; }
-if ${ac_cv_type_long_long_int+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_type_long_long_int=yes
-      if test "x${ac_cv_prog_cc_c99-no}" = xno; then
-        ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int
-        if test $ac_cv_type_long_long_int = yes; then
-                                        if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
-                 #ifndef LLONG_MAX
-                 # define HALF \
-                          (1LL << (sizeof (long long int) * CHAR_BIT - 2))
-                 # define LLONG_MAX (HALF - 1 + HALF)
-                 #endif
-int
-main ()
-{
-long long int n = 1;
-                 int i;
-                 for (i = 0; ; i++)
-                   {
-                     long long int m = n << i;
-                     if (m >> i != n)
-                       return 1;
-                     if (LLONG_MAX / 2 < m)
-                       break;
-                   }
-                 return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  ac_cv_type_long_long_int=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-        fi
-      fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long_int" >&5
-$as_echo "$ac_cv_type_long_long_int" >&6; }
-  if test $ac_cv_type_long_long_int = yes; then
-
-$as_echo "#define HAVE_LONG_LONG_INT 1" >>confdefs.h
-
-  fi
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5
-$as_echo_n "checking for wchar_t... " >&6; }
-if ${gt_cv_c_wchar_t+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stddef.h>
-            wchar_t foo = (wchar_t)'\0';
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gt_cv_c_wchar_t=yes
-else
-  gt_cv_c_wchar_t=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5
-$as_echo "$gt_cv_c_wchar_t" >&6; }
-  if test $gt_cv_c_wchar_t = yes; then
-
-$as_echo "#define HAVE_WCHAR_T 1" >>confdefs.h
-
-  fi
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5
-$as_echo_n "checking for wint_t... " >&6; }
-if ${gt_cv_c_wint_t+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
-   before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-            wint_t foo = (wchar_t)'\0';
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gt_cv_c_wint_t=yes
-else
-  gt_cv_c_wint_t=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5
-$as_echo "$gt_cv_c_wint_t" >&6; }
-  if test $gt_cv_c_wint_t = yes; then
-
-$as_echo "#define HAVE_WINT_T 1" >>confdefs.h
-
-
-            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wint_t is too small" >&5
-$as_echo_n "checking whether wint_t is too small... " >&6; }
-if ${gl_cv_type_wint_t_too_small+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#if !(defined __GLIBC__ && !defined __UCLIBC__)
-# include <stddef.h>
-# include <stdio.h>
-# include <time.h>
-#endif
-#include <wchar.h>
-              int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1];
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_type_wint_t_too_small=no
-else
-  gl_cv_type_wint_t_too_small=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wint_t_too_small" >&5
-$as_echo "$gl_cv_type_wint_t_too_small" >&6; }
-    if test $gl_cv_type_wint_t_too_small = yes; then
-      GNULIB_OVERRIDES_WINT_T=1
-    else
-      GNULIB_OVERRIDES_WINT_T=0
-    fi
-  else
-    GNULIB_OVERRIDES_WINT_T=0
-  fi
-
-
-
-
-
-
-  if test $ac_cv_header_features_h = yes; then
-    HAVE_FEATURES_H=1
-  else
-    HAVE_FEATURES_H=0
-  fi
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intmax_t" >&5
-$as_echo_n "checking for intmax_t... " >&6; }
-if ${gt_cv_c_intmax_t+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stddef.h>
-#include <stdlib.h>
-#if HAVE_STDINT_H_WITH_UINTMAX
-#include <stdint.h>
-#endif
-#if HAVE_INTTYPES_H_WITH_UINTMAX
-#include <inttypes.h>
-#endif
-
-int
-main ()
-{
-intmax_t x = -1; return !x;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gt_cv_c_intmax_t=yes
-else
-  gt_cv_c_intmax_t=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_intmax_t" >&5
-$as_echo "$gt_cv_c_intmax_t" >&6; }
-  if test $gt_cv_c_intmax_t = yes; then
-
-$as_echo "#define HAVE_INTMAX_T 1" >>confdefs.h
-
-  else
-
-    test $ac_cv_type_long_long_int = yes \
-      && ac_type='long long' \
-      || ac_type='long'
-
-cat >>confdefs.h <<_ACEOF
-#define intmax_t $ac_type
-_ACEOF
-
-  fi
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'double'" >&5
-$as_echo_n "checking where to find the exponent in a 'double'... " >&6; }
-if ${gl_cv_cc_double_expbit0+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-                                                                      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#if defined arm || defined __arm || defined __arm__
-  mixed_endianness
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "mixed_endianness" >/dev/null 2>&1; then :
-  gl_cv_cc_double_expbit0="unknown"
-else
-
-                                                         :
-if ${ac_cv_c_bigendian+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_c_bigendian=unknown
-    # See if we're dealing with a universal compiler.
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifndef __APPLE_CC__
-	       not a universal capable compiler
-	     #endif
-	     typedef int dummy;
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-	# Check for potential -arch flags.  It is not universal unless
-	# there are at least two -arch flags with different values.
-	ac_arch=
-	ac_prev=
-	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
-	 if test -n "$ac_prev"; then
-	   case $ac_word in
-	     i?86 | x86_64 | ppc | ppc64)
-	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
-		 ac_arch=$ac_word
-	       else
-		 ac_cv_c_bigendian=universal
-		 break
-	       fi
-	       ;;
-	   esac
-	   ac_prev=
-	 elif test "x$ac_word" = "x-arch"; then
-	   ac_prev=arch
-	 fi
-       done
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    if test $ac_cv_c_bigendian = unknown; then
-      # See if sys/param.h defines the BYTE_ORDER macro.
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-	     #include <sys/param.h>
-
-int
-main ()
-{
-#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
-		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
-		     && LITTLE_ENDIAN)
-	      bogus endian macros
-	     #endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  # It does; now see whether it defined to BIG_ENDIAN or not.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-		#include <sys/param.h>
-
-int
-main ()
-{
-#if BYTE_ORDER != BIG_ENDIAN
-		 not big endian
-		#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_bigendian=yes
-else
-  ac_cv_c_bigendian=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    fi
-    if test $ac_cv_c_bigendian = unknown; then
-      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
-
-int
-main ()
-{
-#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
-	      bogus endian macros
-	     #endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  # It does; now see whether it defined to _BIG_ENDIAN or not.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
-
-int
-main ()
-{
-#ifndef _BIG_ENDIAN
-		 not big endian
-		#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_bigendian=yes
-else
-  ac_cv_c_bigendian=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    fi
-    if test $ac_cv_c_bigendian = unknown; then
-      # Compile a test program.
-      if test "$cross_compiling" = yes; then :
-  # Try to guess by grepping values from an object file.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-short int ascii_mm[] =
-		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
-		short int ascii_ii[] =
-		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
-		int use_ascii (int i) {
-		  return ascii_mm[i] + ascii_ii[i];
-		}
-		short int ebcdic_ii[] =
-		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
-		short int ebcdic_mm[] =
-		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
-		int use_ebcdic (int i) {
-		  return ebcdic_mm[i] + ebcdic_ii[i];
-		}
-		extern int foo;
-
-int
-main ()
-{
-return use_ascii (foo) == use_ebcdic (foo);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
-	      ac_cv_c_bigendian=yes
-	    fi
-	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
-	      if test "$ac_cv_c_bigendian" = unknown; then
-		ac_cv_c_bigendian=no
-	      else
-		# finding both strings is unlikely to happen, but who knows?
-		ac_cv_c_bigendian=unknown
-	      fi
-	    fi
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-
-	     /* Are we little or big endian?  From Harbison&Steele.  */
-	     union
-	     {
-	       long int l;
-	       char c[sizeof (long int)];
-	     } u;
-	     u.l = 1;
-	     return u.c[sizeof (long int) - 1] == 1;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_c_bigendian=no
-else
-  ac_cv_c_bigendian=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-    fi
-fi
-:
- case $ac_cv_c_bigendian in #(
-   yes)
-     gl_cv_cc_double_expbit0="word 0 bit 20";; #(
-   no)
-     gl_cv_cc_double_expbit0="word 1 bit 20" ;; #(
-   universal)
-
-$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
-
-     ;; #(
-   *)
-     gl_cv_cc_double_expbit0="unknown" ;;
- esac
-
-
-fi
-rm -f conftest*
-
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <float.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#define NWORDS \
-  ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-typedef union { double value; unsigned int word[NWORDS]; } memory_double;
-static unsigned int ored_words[NWORDS];
-static unsigned int anded_words[NWORDS];
-static void add_to_ored_words (double x)
-{
-  memory_double m;
-  size_t i;
-  /* Clear it first, in case sizeof (double) < sizeof (memory_double).  */
-  memset (&m, 0, sizeof (memory_double));
-  m.value = x;
-  for (i = 0; i < NWORDS; i++)
-    {
-      ored_words[i] |= m.word[i];
-      anded_words[i] &= m.word[i];
-    }
-}
-int main ()
-{
-  size_t j;
-  FILE *fp = fopen ("conftest.out", "w");
-  if (fp == NULL)
-    return 1;
-  for (j = 0; j < NWORDS; j++)
-    anded_words[j] = ~ (unsigned int) 0;
-  add_to_ored_words (0.25);
-  add_to_ored_words (0.5);
-  add_to_ored_words (1.0);
-  add_to_ored_words (2.0);
-  add_to_ored_words (4.0);
-  /* Remove bits that are common (e.g. if representation of the first mantissa
-     bit is explicit).  */
-  for (j = 0; j < NWORDS; j++)
-    ored_words[j] &= ~anded_words[j];
-  /* Now find the nonzero word.  */
-  for (j = 0; j < NWORDS; j++)
-    if (ored_words[j] != 0)
-      break;
-  if (j < NWORDS)
-    {
-      size_t i;
-      for (i = j + 1; i < NWORDS; i++)
-        if (ored_words[i] != 0)
-          {
-            fprintf (fp, "unknown");
-            return (fclose (fp) != 0);
-          }
-      for (i = 0; ; i++)
-        if ((ored_words[j] >> i) & 1)
-          {
-            fprintf (fp, "word %d bit %d", (int) j, (int) i);
-            return (fclose (fp) != 0);
-          }
-    }
-  fprintf (fp, "unknown");
-  return (fclose (fp) != 0);
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_cc_double_expbit0=`cat conftest.out`
-else
-  gl_cv_cc_double_expbit0="unknown"
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      rm -f conftest.out
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_expbit0" >&5
-$as_echo "$gl_cv_cc_double_expbit0" >&6; }
-  case "$gl_cv_cc_double_expbit0" in
-    word*bit*)
-      word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
-      bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'`
-
-cat >>confdefs.h <<_ACEOF
-#define DBL_EXPBIT0_WORD $word
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define DBL_EXPBIT0_BIT $bit
-_ACEOF
-
-      ;;
-  esac
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf returns a byte count as in C99" >&5
-$as_echo_n "checking whether snprintf returns a byte count as in C99... " >&6; }
-if ${gl_cv_func_snprintf_retval_c99+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                                 # Guess yes on glibc systems.
-           *-gnu* | gnu*)        gl_cv_func_snprintf_retval_c99="guessing yes";;
-                                 # Guess yes on musl systems.
-           *-musl*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
-                                 # Guess yes on FreeBSD >= 5.
-           freebsd[1-4].*)       gl_cv_func_snprintf_retval_c99="guessing no";;
-           freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
-                                 # Guess yes on Mac OS X >= 10.3.
-           darwin[1-6].*)        gl_cv_func_snprintf_retval_c99="guessing no";;
-           darwin*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
-                                 # Guess yes on OpenBSD >= 3.9.
-           openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
-                                 gl_cv_func_snprintf_retval_c99="guessing no";;
-           openbsd*)             gl_cv_func_snprintf_retval_c99="guessing yes";;
-                                 # Guess yes on Solaris >= 2.10.
-           solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
-           solaris*)             gl_cv_func_printf_sizes_c99="guessing no";;
-                                 # Guess yes on AIX >= 4.
-           aix[1-3]*)            gl_cv_func_snprintf_retval_c99="guessing no";;
-           aix*)                 gl_cv_func_snprintf_retval_c99="guessing yes";;
-                                 # Guess yes on NetBSD >= 3.
-           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
-                                 gl_cv_func_snprintf_retval_c99="guessing no";;
-           netbsd*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
-                                 # Guess yes on BeOS.
-           beos*)                gl_cv_func_snprintf_retval_c99="guessing yes";;
-                                 # Guess yes on Android.
-           linux*-android*)      gl_cv_func_snprintf_retval_c99="guessing yes";;
-                                 # Guess yes on MSVC, no on mingw.
-           mingw*)               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef _MSC_VER
- Known
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Known" >/dev/null 2>&1; then :
-  gl_cv_func_snprintf_retval_c99="guessing yes"
-else
-  gl_cv_func_snprintf_retval_c99="guessing no"
-fi
-rm -f conftest*
-
-                                 ;;
-                                 # If we don't know, obey --enable-cross-guesses.
-           *)                    gl_cv_func_snprintf_retval_c99="$gl_cross_guess_normal";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <string.h>
-#if HAVE_SNPRINTF
-# define my_snprintf snprintf
-#else
-# include <stdarg.h>
-static int my_snprintf (char *buf, int size, const char *format, ...)
-{
-  va_list args;
-  int ret;
-  va_start (args, format);
-  ret = vsnprintf (buf, size, format, args);
-  va_end (args);
-  return ret;
-}
-#endif
-static char buf[100];
-int main ()
-{
-  strcpy (buf, "ABCDEF");
-  if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7)
-    return 1;
-  if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7)
-    return 2;
-  if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7)
-    return 3;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_snprintf_retval_c99=yes
-else
-  gl_cv_func_snprintf_retval_c99=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_retval_c99" >&5
-$as_echo "$gl_cv_func_snprintf_retval_c99" >&6; }
-
-
-
-
-
-
-  for ac_func in snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-      ac_fn_c_check_decl "$LINENO" "_snprintf" "ac_cv_have_decl__snprintf" "#include <stdio.h>
-"
-if test "x$ac_cv_have_decl__snprintf" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL__SNPRINTF $ac_have_decl
-_ACEOF
-
-
-
-  case "$gl_cv_func_snprintf_retval_c99" in
-    *yes)
-
-$as_echo "#define HAVE_SNPRINTF_RETVAL_C99 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-  GNULIB_ACOSF=0;
-  GNULIB_ACOSL=0;
-  GNULIB_ASINF=0;
-  GNULIB_ASINL=0;
-  GNULIB_ATANF=0;
-  GNULIB_ATANL=0;
-  GNULIB_ATAN2F=0;
-  GNULIB_CBRT=0;
-  GNULIB_CBRTF=0;
-  GNULIB_CBRTL=0;
-  GNULIB_CEIL=0;
-  GNULIB_CEILF=0;
-  GNULIB_CEILL=0;
-  GNULIB_COPYSIGN=0;
-  GNULIB_COPYSIGNF=0;
-  GNULIB_COPYSIGNL=0;
-  GNULIB_COSF=0;
-  GNULIB_COSL=0;
-  GNULIB_COSHF=0;
-  GNULIB_EXPF=0;
-  GNULIB_EXPL=0;
-  GNULIB_EXP2=0;
-  GNULIB_EXP2F=0;
-  GNULIB_EXP2L=0;
-  GNULIB_EXPM1=0;
-  GNULIB_EXPM1F=0;
-  GNULIB_EXPM1L=0;
-  GNULIB_FABSF=0;
-  GNULIB_FABSL=0;
-  GNULIB_FLOOR=0;
-  GNULIB_FLOORF=0;
-  GNULIB_FLOORL=0;
-  GNULIB_FMA=0;
-  GNULIB_FMAF=0;
-  GNULIB_FMAL=0;
-  GNULIB_FMOD=0;
-  GNULIB_FMODF=0;
-  GNULIB_FMODL=0;
-  GNULIB_FREXPF=0;
-  GNULIB_FREXP=0;
-  GNULIB_FREXPL=0;
-  GNULIB_HYPOT=0;
-  GNULIB_HYPOTF=0;
-  GNULIB_HYPOTL=0;
-  GNULIB_ILOGB=0;
-  GNULIB_ILOGBF=0;
-  GNULIB_ILOGBL=0;
-  GNULIB_ISFINITE=0;
-  GNULIB_ISINF=0;
-  GNULIB_ISNAN=0;
-  GNULIB_ISNANF=0;
-  GNULIB_ISNAND=0;
-  GNULIB_ISNANL=0;
-  GNULIB_LDEXPF=0;
-  GNULIB_LDEXPL=0;
-  GNULIB_LOG=0;
-  GNULIB_LOGF=0;
-  GNULIB_LOGL=0;
-  GNULIB_LOG10=0;
-  GNULIB_LOG10F=0;
-  GNULIB_LOG10L=0;
-  GNULIB_LOG1P=0;
-  GNULIB_LOG1PF=0;
-  GNULIB_LOG1PL=0;
-  GNULIB_LOG2=0;
-  GNULIB_LOG2F=0;
-  GNULIB_LOG2L=0;
-  GNULIB_LOGB=0;
-  GNULIB_LOGBF=0;
-  GNULIB_LOGBL=0;
-  GNULIB_MODF=0;
-  GNULIB_MODFF=0;
-  GNULIB_MODFL=0;
-  GNULIB_POWF=0;
-  GNULIB_REMAINDER=0;
-  GNULIB_REMAINDERF=0;
-  GNULIB_REMAINDERL=0;
-  GNULIB_RINT=0;
-  GNULIB_RINTF=0;
-  GNULIB_RINTL=0;
-  GNULIB_ROUND=0;
-  GNULIB_ROUNDF=0;
-  GNULIB_ROUNDL=0;
-  GNULIB_SIGNBIT=0;
-  GNULIB_SINF=0;
-  GNULIB_SINL=0;
-  GNULIB_SINHF=0;
-  GNULIB_SQRTF=0;
-  GNULIB_SQRTL=0;
-  GNULIB_TANF=0;
-  GNULIB_TANL=0;
-  GNULIB_TANHF=0;
-  GNULIB_TRUNC=0;
-  GNULIB_TRUNCF=0;
-  GNULIB_TRUNCL=0;
-    HAVE_ACOSF=1;
-  HAVE_ACOSL=1;
-  HAVE_ASINF=1;
-  HAVE_ASINL=1;
-  HAVE_ATANF=1;
-  HAVE_ATANL=1;
-  HAVE_ATAN2F=1;
-  HAVE_CBRT=1;
-  HAVE_CBRTF=1;
-  HAVE_CBRTL=1;
-  HAVE_COPYSIGN=1;
-  HAVE_COPYSIGNL=1;
-  HAVE_COSF=1;
-  HAVE_COSL=1;
-  HAVE_COSHF=1;
-  HAVE_EXPF=1;
-  HAVE_EXPL=1;
-  HAVE_EXPM1=1;
-  HAVE_EXPM1F=1;
-  HAVE_FABSF=1;
-  HAVE_FABSL=1;
-  HAVE_FMA=1;
-  HAVE_FMAF=1;
-  HAVE_FMAL=1;
-  HAVE_FMODF=1;
-  HAVE_FMODL=1;
-  HAVE_FREXPF=1;
-  HAVE_HYPOTF=1;
-  HAVE_HYPOTL=1;
-  HAVE_ILOGB=1;
-  HAVE_ILOGBF=1;
-  HAVE_ILOGBL=1;
-  HAVE_ISNANF=1;
-  HAVE_ISNAND=1;
-  HAVE_ISNANL=1;
-  HAVE_LDEXPF=1;
-  HAVE_LOGF=1;
-  HAVE_LOGL=1;
-  HAVE_LOG10F=1;
-  HAVE_LOG10L=1;
-  HAVE_LOG1P=1;
-  HAVE_LOG1PF=1;
-  HAVE_LOG1PL=1;
-  HAVE_LOGBF=1;
-  HAVE_LOGBL=1;
-  HAVE_MODFF=1;
-  HAVE_MODFL=1;
-  HAVE_POWF=1;
-  HAVE_REMAINDER=1;
-  HAVE_REMAINDERF=1;
-  HAVE_RINT=1;
-  HAVE_RINTL=1;
-  HAVE_SINF=1;
-  HAVE_SINL=1;
-  HAVE_SINHF=1;
-  HAVE_SQRTF=1;
-  HAVE_SQRTL=1;
-  HAVE_TANF=1;
-  HAVE_TANL=1;
-  HAVE_TANHF=1;
-  HAVE_DECL_ACOSL=1;
-  HAVE_DECL_ASINL=1;
-  HAVE_DECL_ATANL=1;
-  HAVE_DECL_CBRTF=1;
-  HAVE_DECL_CBRTL=1;
-  HAVE_DECL_CEILF=1;
-  HAVE_DECL_CEILL=1;
-  HAVE_DECL_COPYSIGNF=1;
-  HAVE_DECL_COSL=1;
-  HAVE_DECL_EXPL=1;
-  HAVE_DECL_EXP2=1;
-  HAVE_DECL_EXP2F=1;
-  HAVE_DECL_EXP2L=1;
-  HAVE_DECL_EXPM1L=1;
-  HAVE_DECL_FLOORF=1;
-  HAVE_DECL_FLOORL=1;
-  HAVE_DECL_FREXPL=1;
-  HAVE_DECL_LDEXPL=1;
-  HAVE_DECL_LOGL=1;
-  HAVE_DECL_LOG10L=1;
-  HAVE_DECL_LOG2=1;
-  HAVE_DECL_LOG2F=1;
-  HAVE_DECL_LOG2L=1;
-  HAVE_DECL_LOGB=1;
-  HAVE_DECL_REMAINDER=1;
-  HAVE_DECL_REMAINDERL=1;
-  HAVE_DECL_RINTF=1;
-  HAVE_DECL_ROUND=1;
-  HAVE_DECL_ROUNDF=1;
-  HAVE_DECL_ROUNDL=1;
-  HAVE_DECL_SINL=1;
-  HAVE_DECL_SQRTL=1;
-  HAVE_DECL_TANL=1;
-  HAVE_DECL_TRUNC=1;
-  HAVE_DECL_TRUNCF=1;
-  HAVE_DECL_TRUNCL=1;
-  REPLACE_ACOSF=0;
-  REPLACE_ASINF=0;
-  REPLACE_ATANF=0;
-  REPLACE_ATAN2F=0;
-  REPLACE_CBRTF=0;
-  REPLACE_CBRTL=0;
-  REPLACE_CEIL=0;
-  REPLACE_CEILF=0;
-  REPLACE_CEILL=0;
-  REPLACE_COSF=0;
-  REPLACE_COSHF=0;
-  REPLACE_EXPF=0;
-  REPLACE_EXPL=0;
-  REPLACE_EXPM1=0;
-  REPLACE_EXPM1F=0;
-  REPLACE_EXPM1L=0;
-  REPLACE_EXP2=0;
-  REPLACE_EXP2L=0;
-  REPLACE_FABSL=0;
-  REPLACE_FLOOR=0;
-  REPLACE_FLOORF=0;
-  REPLACE_FLOORL=0;
-  REPLACE_FMA=0;
-  REPLACE_FMAF=0;
-  REPLACE_FMAL=0;
-  REPLACE_FMOD=0;
-  REPLACE_FMODF=0;
-  REPLACE_FMODL=0;
-  REPLACE_FREXPF=0;
-  REPLACE_FREXP=0;
-  REPLACE_FREXPL=0;
-  REPLACE_HUGE_VAL=0;
-  REPLACE_HYPOT=0;
-  REPLACE_HYPOTF=0;
-  REPLACE_HYPOTL=0;
-  REPLACE_ILOGB=0;
-  REPLACE_ILOGBF=0;
-  REPLACE_ILOGBL=0;
-  REPLACE_ISFINITE=0;
-  REPLACE_ISINF=0;
-  REPLACE_ISNAN=0;
-  REPLACE_LDEXPL=0;
-  REPLACE_LOG=0;
-  REPLACE_LOGF=0;
-  REPLACE_LOGL=0;
-  REPLACE_LOG10=0;
-  REPLACE_LOG10F=0;
-  REPLACE_LOG10L=0;
-  REPLACE_LOG1P=0;
-  REPLACE_LOG1PF=0;
-  REPLACE_LOG1PL=0;
-  REPLACE_LOG2=0;
-  REPLACE_LOG2F=0;
-  REPLACE_LOG2L=0;
-  REPLACE_LOGB=0;
-  REPLACE_LOGBF=0;
-  REPLACE_LOGBL=0;
-  REPLACE_MODF=0;
-  REPLACE_MODFF=0;
-  REPLACE_MODFL=0;
-  REPLACE_NAN=0;
-  REPLACE_REMAINDER=0;
-  REPLACE_REMAINDERF=0;
-  REPLACE_REMAINDERL=0;
-  REPLACE_RINTL=0;
-  REPLACE_ROUND=0;
-  REPLACE_ROUNDF=0;
-  REPLACE_ROUNDL=0;
-  REPLACE_SIGNBIT=0;
-  REPLACE_SIGNBIT_USING_GCC=0;
-  REPLACE_SINF=0;
-  REPLACE_SINHF=0;
-  REPLACE_SQRTF=0;
-  REPLACE_SQRTL=0;
-  REPLACE_TANF=0;
-  REPLACE_TANHF=0;
-  REPLACE_TRUNC=0;
-  REPLACE_TRUNCF=0;
-  REPLACE_TRUNCL=0;
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexp() can be used without linking with libm" >&5
-$as_echo_n "checking whether frexp() can be used without linking with libm... " >&6; }
-if ${gl_cv_func_frexp_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             double x;
-int
-main ()
-{
-int e; return frexp (x, &e) > 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_frexp_no_libm=yes
-else
-  gl_cv_func_frexp_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_no_libm" >&5
-$as_echo "$gl_cv_func_frexp_no_libm" >&6; }
-
-ac_fn_c_check_decl "$LINENO" "alarm" "ac_cv_have_decl_alarm" "$ac_includes_default"
-if test "x$ac_cv_have_decl_alarm" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_ALARM $ac_have_decl
-_ACEOF
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for arithmetic hrtime_t" >&5
-$as_echo_n "checking for arithmetic hrtime_t... " >&6; }
-if ${gl_cv_arithmetic_hrtime_t+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <time.h>
-int
-main ()
-{
-hrtime_t x = 0; return x/x;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_arithmetic_hrtime_t=yes
-else
-  gl_cv_arithmetic_hrtime_t=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_arithmetic_hrtime_t" >&5
-$as_echo "$gl_cv_arithmetic_hrtime_t" >&6; }
-  if test $gl_cv_arithmetic_hrtime_t = yes; then
-
-$as_echo "#define HAVE_ARITHMETIC_HRTIME_T 1" >>confdefs.h
-
-  fi
-
-
-
-  :
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_getopt_h='<'getopt.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <getopt.h>" >&5
-$as_echo_n "checking absolute name of <getopt.h>... " >&6; }
-if ${gl_cv_next_getopt_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-             if test $ac_cv_header_getopt_h = yes; then
-
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <getopt.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'getopt.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_getopt_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_getopt_h
-           gl_cv_next_getopt_h='"'$gl_header'"'
-          else
-               gl_cv_next_getopt_h='<'getopt.h'>'
-             fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_getopt_h" >&5
-$as_echo "$gl_cv_next_getopt_h" >&6; }
-     fi
-     NEXT_GETOPT_H=$gl_cv_next_getopt_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'getopt.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_getopt_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_GETOPT_H=$gl_next_as_first_directive
-
-
-
-
-  if test $ac_cv_header_getopt_h = yes; then
-    HAVE_GETOPT_H=1
-  else
-    HAVE_GETOPT_H=0
-  fi
-
-
-  gl_replace_getopt=
-
-    if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
-    for ac_header in getopt.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default"
-if test "x$ac_cv_header_getopt_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_GETOPT_H 1
-_ACEOF
-
-else
-  gl_replace_getopt=yes
-fi
-
-done
-
-  fi
-
-    if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
-    for ac_func in getopt_long_only
-do :
-  ac_fn_c_check_func "$LINENO" "getopt_long_only" "ac_cv_func_getopt_long_only"
-if test "x$ac_cv_func_getopt_long_only" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_GETOPT_LONG_ONLY 1
-_ACEOF
-
-else
-  gl_replace_getopt=yes
-fi
-done
-
-  fi
-
-          if test -z "$gl_replace_getopt"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getopt is POSIX compatible" >&5
-$as_echo_n "checking whether getopt is POSIX compatible... " >&6; }
-if ${gl_cv_func_getopt_posix+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-                                                if test $cross_compiling = no; then
-                              if test "$cross_compiling" = yes; then :
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run test program while cross compiling
-See \`config.log' for more details" "$LINENO" 5; }
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-
-int
-main ()
-{
-  static char program[] = "program";
-  static char a[] = "-a";
-  static char foo[] = "foo";
-  static char bar[] = "bar";
-  char *argv[] = { program, a, foo, bar, NULL };
-  int c;
-
-  c = getopt (4, argv, "ab");
-  if (!(c == 'a'))
-    return 1;
-  c = getopt (4, argv, "ab");
-  if (!(c == -1))
-    return 2;
-  if (!(optind == 2))
-    return 3;
-  return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_getopt_posix=maybe
-else
-  gl_cv_func_getopt_posix=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-          if test $gl_cv_func_getopt_posix = maybe; then
-                                    if test "$cross_compiling" = yes; then :
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run test program while cross compiling
-See \`config.log' for more details" "$LINENO" 5; }
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-
-int
-main ()
-{
-  static char program[] = "program";
-  static char donald[] = "donald";
-  static char p[] = "-p";
-  static char billy[] = "billy";
-  static char duck[] = "duck";
-  static char a[] = "-a";
-  static char bar[] = "bar";
-  char *argv[] = { program, donald, p, billy, duck, a, bar, NULL };
-  int c;
-
-  c = getopt (7, argv, "+abp:q:");
-  if (!(c == -1))
-    return 4;
-  if (!(strcmp (argv[0], "program") == 0))
-    return 5;
-  if (!(strcmp (argv[1], "donald") == 0))
-    return 6;
-  if (!(strcmp (argv[2], "-p") == 0))
-    return 7;
-  if (!(strcmp (argv[3], "billy") == 0))
-    return 8;
-  if (!(strcmp (argv[4], "duck") == 0))
-    return 9;
-  if (!(strcmp (argv[5], "-a") == 0))
-    return 10;
-  if (!(strcmp (argv[6], "bar") == 0))
-    return 11;
-  if (!(optind == 1))
-    return 12;
-  return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_getopt_posix=maybe
-else
-  gl_cv_func_getopt_posix=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-          fi
-          if test $gl_cv_func_getopt_posix = maybe; then
-                        if test "$cross_compiling" = yes; then :
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run test program while cross compiling
-See \`config.log' for more details" "$LINENO" 5; }
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-
-int
-main ()
-{
-  static char program[] = "program";
-  static char ab[] = "-ab";
-  char *argv[3] = { program, ab, NULL };
-  if (getopt (2, argv, "ab:") != 'a')
-    return 13;
-  if (getopt (2, argv, "ab:") != '?')
-    return 14;
-  if (optopt != 'b')
-    return 15;
-  if (optind != 2)
-    return 16;
-  return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_getopt_posix=yes
-else
-  gl_cv_func_getopt_posix=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-          fi
-        else
-          case "$host_os" in
-            darwin* | aix* | mingw*) gl_cv_func_getopt_posix="guessing no";;
-            *)                       gl_cv_func_getopt_posix="guessing yes";;
-          esac
-        fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_posix" >&5
-$as_echo "$gl_cv_func_getopt_posix" >&6; }
-    case "$gl_cv_func_getopt_posix" in
-      *no) gl_replace_getopt=yes ;;
-    esac
-  fi
-
-  if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working GNU getopt function" >&5
-$as_echo_n "checking for working GNU getopt function... " >&6; }
-if ${gl_cv_func_getopt_gnu+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  # Even with POSIXLY_CORRECT, the GNU extension of leading '-' in the
-       # optstring is necessary for programs like m4 that have POSIX-mandated
-       # semantics for supporting options interspersed with files.
-       # Also, since getopt_long is a GNU extension, we require optind=0.
-       # Bash ties 'set -o posix' to a non-exported POSIXLY_CORRECT;
-       # so take care to revert to the correct (non-)export state.
-       gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }'
-       case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" </dev/null` in
-         xx) gl_had_POSIXLY_CORRECT=exported ;;
-         x)  gl_had_POSIXLY_CORRECT=yes      ;;
-         *)  gl_had_POSIXLY_CORRECT=         ;;
-       esac
-       POSIXLY_CORRECT=1
-       export POSIXLY_CORRECT
-       if test "$cross_compiling" = yes; then :
-                             gl_cv_func_getopt_gnu="$gl_cross_guess_normal"
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <getopt.h>
-                           #include <stddef.h>
-                           #include <string.h>
-
-#include <stdlib.h>
-#if defined __MACH__ && defined __APPLE__
-/* Avoid a crash on Mac OS X.  */
-#include <mach/mach.h>
-#include <mach/mach_error.h>
-#include <mach/thread_status.h>
-#include <mach/exception.h>
-#include <mach/task.h>
-#include <pthread.h>
-/* The exception port on which our thread listens.  */
-static mach_port_t our_exception_port;
-/* The main function of the thread listening for exceptions of type
-   EXC_BAD_ACCESS.  */
-static void *
-mach_exception_thread (void *arg)
-{
-  /* Buffer for a message to be received.  */
-  struct {
-    mach_msg_header_t head;
-    mach_msg_body_t msgh_body;
-    char data[1024];
-  } msg;
-  mach_msg_return_t retval;
-  /* Wait for a message on the exception port.  */
-  retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
-                     our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
-  if (retval != MACH_MSG_SUCCESS)
-    abort ();
-  exit (1);
-}
-static void
-nocrash_init (void)
-{
-  mach_port_t self = mach_task_self ();
-  /* Allocate a port on which the thread shall listen for exceptions.  */
-  if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
-      == KERN_SUCCESS) {
-    /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html.  */
-    if (mach_port_insert_right (self, our_exception_port, our_exception_port,
-                                MACH_MSG_TYPE_MAKE_SEND)
-        == KERN_SUCCESS) {
-      /* The exceptions we want to catch.  Only EXC_BAD_ACCESS is interesting
-         for us.  */
-      exception_mask_t mask = EXC_MASK_BAD_ACCESS;
-      /* Create the thread listening on the exception port.  */
-      pthread_attr_t attr;
-      pthread_t thread;
-      if (pthread_attr_init (&attr) == 0
-          && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
-          && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
-        pthread_attr_destroy (&attr);
-        /* Replace the exception port info for these exceptions with our own.
-           Note that we replace the exception port for the entire task, not only
-           for a particular thread.  This has the effect that when our exception
-           port gets the message, the thread specific exception port has already
-           been asked, and we don't need to bother about it.
-           See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html.  */
-        task_set_exception_ports (self, mask, our_exception_port,
-                                  EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
-      }
-    }
-  }
-}
-#elif defined _WIN32 && ! defined __CYGWIN__
-/* Avoid a crash on native Windows.  */
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <winerror.h>
-static LONG WINAPI
-exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
-{
-  switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
-    {
-    case EXCEPTION_ACCESS_VIOLATION:
-    case EXCEPTION_IN_PAGE_ERROR:
-    case EXCEPTION_STACK_OVERFLOW:
-    case EXCEPTION_GUARD_PAGE:
-    case EXCEPTION_PRIV_INSTRUCTION:
-    case EXCEPTION_ILLEGAL_INSTRUCTION:
-    case EXCEPTION_DATATYPE_MISALIGNMENT:
-    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
-    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
-      exit (1);
-    }
-  return EXCEPTION_CONTINUE_SEARCH;
-}
-static void
-nocrash_init (void)
-{
-  SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
-}
-#else
-/* Avoid a crash on POSIX systems.  */
-#include <signal.h>
-#include <unistd.h>
-/* A POSIX signal handler.  */
-static void
-exception_handler (int sig)
-{
-  _exit (1);
-}
-static void
-nocrash_init (void)
-{
-#ifdef SIGSEGV
-  signal (SIGSEGV, exception_handler);
-#endif
-#ifdef SIGBUS
-  signal (SIGBUS, exception_handler);
-#endif
-}
-#endif
-
-
-int
-main ()
-{
-
-             int result = 0;
-
-             nocrash_init();
-
-             /* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw,
-                and fails on Mac OS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5,
-                OSF/1 5.1, Solaris 10.  */
-             {
-               static char conftest[] = "conftest";
-               static char plus[] = "-+";
-               char *argv[3] = { conftest, plus, NULL };
-               opterr = 0;
-               if (getopt (2, argv, "+a") != '?')
-                 result |= 1;
-             }
-             /* This code succeeds on glibc 2.8, mingw,
-                and fails on Mac OS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11,
-                IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x.  */
-             {
-               static char program[] = "program";
-               static char p[] = "-p";
-               static char foo[] = "foo";
-               static char bar[] = "bar";
-               char *argv[] = { program, p, foo, bar, NULL };
-
-               optind = 1;
-               if (getopt (4, argv, "p::") != 'p')
-                 result |= 2;
-               else if (optarg != NULL)
-                 result |= 4;
-               else if (getopt (4, argv, "p::") != -1)
-                 result |= 6;
-               else if (optind != 2)
-                 result |= 8;
-             }
-             /* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0.  */
-             {
-               static char program[] = "program";
-               static char foo[] = "foo";
-               static char p[] = "-p";
-               char *argv[] = { program, foo, p, NULL };
-               optind = 0;
-               if (getopt (3, argv, "-p") != 1)
-                 result |= 16;
-               else if (getopt (3, argv, "-p") != 'p')
-                 result |= 16;
-             }
-             /* This code fails on glibc 2.11.  */
-             {
-               static char program[] = "program";
-               static char b[] = "-b";
-               static char a[] = "-a";
-               char *argv[] = { program, b, a, NULL };
-               optind = opterr = 0;
-               if (getopt (3, argv, "+:a:b") != 'b')
-                 result |= 32;
-               else if (getopt (3, argv, "+:a:b") != ':')
-                 result |= 32;
-             }
-             /* This code dumps core on glibc 2.14.  */
-             {
-               static char program[] = "program";
-               static char w[] = "-W";
-               static char dummy[] = "dummy";
-               char *argv[] = { program, w, dummy, NULL };
-               optind = opterr = 1;
-               if (getopt (3, argv, "W;") != 'W')
-                 result |= 64;
-             }
-             return result;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_getopt_gnu=yes
-else
-  gl_cv_func_getopt_gnu=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-       case $gl_had_POSIXLY_CORRECT in
-         exported) ;;
-         yes) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;}; POSIXLY_CORRECT=1 ;;
-         *) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;} ;;
-       esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_gnu" >&5
-$as_echo "$gl_cv_func_getopt_gnu" >&6; }
-    if test "$gl_cv_func_getopt_gnu" != yes; then
-      gl_replace_getopt=yes
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working GNU getopt_long function" >&5
-$as_echo_n "checking for working GNU getopt_long function... " >&6; }
-if ${gl_cv_func_getopt_long_gnu+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-              case "$host_os" in
-              openbsd*) gl_cv_func_getopt_long_gnu="guessing no";;
-              *)        gl_cv_func_getopt_long_gnu="guessing yes";;
-            esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <getopt.h>
-                #include <stddef.h>
-                #include <string.h>
-
-int
-main ()
-{
-static const struct option long_options[] =
-                  {
-                    { "xtremely-",no_argument,       NULL, 1003 },
-                    { "xtra",     no_argument,       NULL, 1001 },
-                    { "xtreme",   no_argument,       NULL, 1002 },
-                    { "xtremely", no_argument,       NULL, 1003 },
-                    { NULL,       0,                 NULL, 0 }
-                  };
-                /* This code fails on OpenBSD 5.0.  */
-                {
-                  static char program[] = "program";
-                  static char xtremel[] = "--xtremel";
-                  char *argv[] = { program, xtremel, NULL };
-                  int option_index;
-                  optind = 1; opterr = 0;
-                  if (getopt_long (2, argv, "", long_options, &option_index) != 1003)
-                    return 1;
-                }
-                return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_getopt_long_gnu=yes
-else
-  gl_cv_func_getopt_long_gnu=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_long_gnu" >&5
-$as_echo "$gl_cv_func_getopt_long_gnu" >&6; }
-      case "$gl_cv_func_getopt_long_gnu" in
-        *yes) ;;
-        *) gl_replace_getopt=yes ;;
-      esac
-    fi
-  fi
-
-
-
-
-
-
-
-
-  GNULIB_GETRUSAGE=0;
-    HAVE_GETRUSAGE=1;
-
-
-
-:
-
-
-
-  GNULIB_GETTIMEOFDAY=0;
-    HAVE_GETTIMEOFDAY=1;
-  HAVE_STRUCT_TIMEVAL=1;
-  HAVE_SYS_TIME_H=1;
-  REPLACE_GETTIMEOFDAY=0;
-  REPLACE_STRUCT_TIMEVAL=0;
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5
-$as_echo_n "checking for C/C++ restrict keyword... " >&6; }
-if ${ac_cv_c_restrict+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_c_restrict=no
-   # The order here caters to the fact that C++ does not require restrict.
-   for ac_kw in __restrict __restrict__ _Restrict restrict; do
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-typedef int *int_ptr;
-           int foo (int_ptr $ac_kw ip) { return ip[0]; }
-           int bar (int [$ac_kw]); /* Catch GCC bug 14050.  */
-           int bar (int ip[$ac_kw]) { return ip[0]; }
-
-int
-main ()
-{
-int s[1];
-           int *$ac_kw t = s;
-           t[0] = 0;
-           return foo (t) + bar (t);
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_restrict=$ac_kw
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-     test "$ac_cv_c_restrict" != no && break
-   done
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5
-$as_echo "$ac_cv_c_restrict" >&6; }
-
- case $ac_cv_c_restrict in
-   restrict) ;;
-   no) $as_echo "#define restrict /**/" >>confdefs.h
- ;;
-   *)  cat >>confdefs.h <<_ACEOF
-#define restrict $ac_cv_c_restrict
-_ACEOF
- ;;
- esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_sys_time_h='<'sys/time.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/time.h>" >&5
-$as_echo_n "checking absolute name of <sys/time.h>... " >&6; }
-if ${gl_cv_next_sys_time_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-             if test $ac_cv_header_sys_time_h = yes; then
-
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/time.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'sys/time.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_sys_time_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_sys_time_h
-           gl_cv_next_sys_time_h='"'$gl_header'"'
-          else
-               gl_cv_next_sys_time_h='<'sys/time.h'>'
-             fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_time_h" >&5
-$as_echo "$gl_cv_next_sys_time_h" >&6; }
-     fi
-     NEXT_SYS_TIME_H=$gl_cv_next_sys_time_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'sys/time.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_sys_time_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H=$gl_next_as_first_directive
-
-
-
-
-
-  if test $ac_cv_header_sys_time_h != yes; then
-    HAVE_SYS_TIME_H=0
-  fi
-
-
-
-
-
-  if test $ac_cv_header_sys_socket_h != yes; then
-                    for ac_header in winsock2.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
-if test "x$ac_cv_header_winsock2_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_WINSOCK2_H 1
-_ACEOF
-
-fi
-
-done
-
-  fi
-  if test "$ac_cv_header_winsock2_h" = yes; then
-    HAVE_WINSOCK2_H=1
-    UNISTD_H_HAVE_WINSOCK2_H=1
-    SYS_IOCTL_H_HAVE_WINSOCK2_H=1
-  else
-    HAVE_WINSOCK2_H=0
-  fi
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timeval" >&5
-$as_echo_n "checking for struct timeval... " >&6; }
-if ${gl_cv_sys_struct_timeval+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#if HAVE_SYS_TIME_H
-             #include <sys/time.h>
-            #endif
-            #include <time.h>
-            #if HAVE_WINSOCK2_H
-            # include <winsock2.h>
-            #endif
-
-int
-main ()
-{
-static struct timeval x; x.tv_sec = x.tv_usec;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_sys_struct_timeval=yes
-else
-  gl_cv_sys_struct_timeval=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timeval" >&5
-$as_echo "$gl_cv_sys_struct_timeval" >&6; }
-  if test $gl_cv_sys_struct_timeval != yes; then
-    HAVE_STRUCT_TIMEVAL=0
-  else
-                            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wide-enough struct timeval.tv_sec member" >&5
-$as_echo_n "checking for wide-enough struct timeval.tv_sec member... " >&6; }
-if ${gl_cv_sys_struct_timeval_tv_sec+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#if HAVE_SYS_TIME_H
-               #include <sys/time.h>
-              #endif
-              #include <time.h>
-              #if HAVE_WINSOCK2_H
-              # include <winsock2.h>
-              #endif
-
-int
-main ()
-{
-static struct timeval x;
-              typedef int verify_tv_sec_type[
-                sizeof (time_t) <= sizeof x.tv_sec ? 1 : -1
-              ];
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_sys_struct_timeval_tv_sec=yes
-else
-  gl_cv_sys_struct_timeval_tv_sec=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timeval_tv_sec" >&5
-$as_echo "$gl_cv_sys_struct_timeval_tv_sec" >&6; }
-    if test $gl_cv_sys_struct_timeval_tv_sec != yes; then
-      REPLACE_STRUCT_TIMEVAL=1
-    fi
-  fi
-
-
-
-
-
-
-
-
-
-  NEED_LOCALTIME_BUFFER=0
-
-
-  GNULIB_CTIME=0;
-  GNULIB_MKTIME=0;
-  GNULIB_LOCALTIME=0;
-  GNULIB_NANOSLEEP=0;
-  GNULIB_STRFTIME=0;
-  GNULIB_STRPTIME=0;
-  GNULIB_TIMEGM=0;
-  GNULIB_TIME_R=0;
-  GNULIB_TIME_RZ=0;
-  GNULIB_TZSET=0;
-    HAVE_DECL_LOCALTIME_R=1;
-  HAVE_NANOSLEEP=1;
-  HAVE_STRPTIME=1;
-  HAVE_TIMEGM=1;
-  HAVE_TZSET=1;
-    HAVE_TIMEZONE_T=0;
-        REPLACE_CTIME=GNULIB_PORTCHECK;
-  REPLACE_LOCALTIME_R=GNULIB_PORTCHECK;
-  REPLACE_MKTIME=GNULIB_PORTCHECK;
-  REPLACE_NANOSLEEP=GNULIB_PORTCHECK;
-  REPLACE_STRFTIME=GNULIB_PORTCHECK;
-  REPLACE_TIMEGM=GNULIB_PORTCHECK;
-  REPLACE_TZSET=GNULIB_PORTCHECK;
-
-      : ${GNULIB_GETTIMEOFDAY=0};
-        REPLACE_GMTIME=0;
-  REPLACE_LOCALTIME=0;
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_limits_h='<'limits.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <limits.h>" >&5
-$as_echo_n "checking absolute name of <limits.h>... " >&6; }
-if ${gl_cv_next_limits_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-             if test $ac_cv_header_limits_h = yes; then
-
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'limits.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_limits_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_limits_h
-           gl_cv_next_limits_h='"'$gl_header'"'
-          else
-               gl_cv_next_limits_h='<'limits.h'>'
-             fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_limits_h" >&5
-$as_echo "$gl_cv_next_limits_h" >&6; }
-     fi
-     NEXT_LIMITS_H=$gl_cv_next_limits_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'limits.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_limits_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_LIMITS_H=$gl_next_as_first_directive
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether limits.h has LLONG_MAX, WORD_BIT, ULLONG_WIDTH etc." >&5
-$as_echo_n "checking whether limits.h has LLONG_MAX, WORD_BIT, ULLONG_WIDTH etc.... " >&6; }
-if ${gl_cv_header_limits_width+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
-             #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
-            #endif
-            #include <limits.h>
-            long long llm = LLONG_MAX;
-            int wb = WORD_BIT;
-            int ullw = ULLONG_WIDTH;
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_header_limits_width=yes
-else
-  gl_cv_header_limits_width=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_limits_width" >&5
-$as_echo "$gl_cv_header_limits_width" >&6; }
-  if test "$gl_cv_header_limits_width" = yes; then
-    LIMITS_H=
-  else
-    LIMITS_H=limits.h
-  fi
-
-   if test -n "$LIMITS_H"; then
-  GL_GENERATE_LIMITS_H_TRUE=
-  GL_GENERATE_LIMITS_H_FALSE='#'
-else
-  GL_GENERATE_LIMITS_H_TRUE='#'
-  GL_GENERATE_LIMITS_H_FALSE=
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-  if test $ac_cv_type_long_long_int = yes; then
-    HAVE_LONG_LONG_INT=1
-  else
-    HAVE_LONG_LONG_INT=0
-  fi
-
-
-  if test $ac_cv_type_unsigned_long_long_int = yes; then
-    HAVE_UNSIGNED_LONG_LONG_INT=1
-  else
-    HAVE_UNSIGNED_LONG_LONG_INT=0
-  fi
-
-
-
-  if test $ac_cv_header_wchar_h = yes; then
-    HAVE_WCHAR_H=1
-  else
-    HAVE_WCHAR_H=0
-  fi
-
-
-      if test $ac_cv_header_inttypes_h = yes; then
-    HAVE_INTTYPES_H=1
-  else
-    HAVE_INTTYPES_H=0
-  fi
-
-
-      if test $ac_cv_header_sys_types_h = yes; then
-    HAVE_SYS_TYPES_H=1
-  else
-    HAVE_SYS_TYPES_H=0
-  fi
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_stdint_h='<'stdint.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdint.h>" >&5
-$as_echo_n "checking absolute name of <stdint.h>... " >&6; }
-if ${gl_cv_next_stdint_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-             if test $ac_cv_header_stdint_h = yes; then
-
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdint.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'stdint.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_stdint_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_stdint_h
-           gl_cv_next_stdint_h='"'$gl_header'"'
-          else
-               gl_cv_next_stdint_h='<'stdint.h'>'
-             fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdint_h" >&5
-$as_echo "$gl_cv_next_stdint_h" >&6; }
-     fi
-     NEXT_STDINT_H=$gl_cv_next_stdint_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'stdint.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_stdint_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_STDINT_H=$gl_next_as_first_directive
-
-
-
-
-  if test $ac_cv_header_stdint_h = yes; then
-    HAVE_STDINT_H=1
-  else
-    HAVE_STDINT_H=0
-  fi
-
-
-    if test $ac_cv_header_stdint_h = yes; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdint.h conforms to C99" >&5
-$as_echo_n "checking whether stdint.h conforms to C99... " >&6; }
-if ${gl_cv_header_working_stdint_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gl_cv_header_working_stdint_h=no
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
-#define __STDC_CONSTANT_MACROS 1
-#define __STDC_LIMIT_MACROS 1
-#include <stdint.h>
-/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in <wchar.h>.  */
-#if !(defined WCHAR_MIN && defined WCHAR_MAX)
-#error "WCHAR_MIN, WCHAR_MAX not defined in <stdint.h>"
-#endif
-
-
-  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-     included before <wchar.h>.  */
-  #include <stddef.h>
-  #include <signal.h>
-  #if HAVE_WCHAR_H
-  # include <stdio.h>
-  # include <time.h>
-  # include <wchar.h>
-  #endif
-
-
-#ifdef INT8_MAX
-int8_t a1 = INT8_MAX;
-int8_t a1min = INT8_MIN;
-#endif
-#ifdef INT16_MAX
-int16_t a2 = INT16_MAX;
-int16_t a2min = INT16_MIN;
-#endif
-#ifdef INT32_MAX
-int32_t a3 = INT32_MAX;
-int32_t a3min = INT32_MIN;
-#endif
-#ifdef INT64_MAX
-int64_t a4 = INT64_MAX;
-int64_t a4min = INT64_MIN;
-#endif
-#ifdef UINT8_MAX
-uint8_t b1 = UINT8_MAX;
-#else
-typedef int b1[(unsigned char) -1 != 255 ? 1 : -1];
-#endif
-#ifdef UINT16_MAX
-uint16_t b2 = UINT16_MAX;
-#endif
-#ifdef UINT32_MAX
-uint32_t b3 = UINT32_MAX;
-#endif
-#ifdef UINT64_MAX
-uint64_t b4 = UINT64_MAX;
-#endif
-int_least8_t c1 = INT8_C (0x7f);
-int_least8_t c1max = INT_LEAST8_MAX;
-int_least8_t c1min = INT_LEAST8_MIN;
-int_least16_t c2 = INT16_C (0x7fff);
-int_least16_t c2max = INT_LEAST16_MAX;
-int_least16_t c2min = INT_LEAST16_MIN;
-int_least32_t c3 = INT32_C (0x7fffffff);
-int_least32_t c3max = INT_LEAST32_MAX;
-int_least32_t c3min = INT_LEAST32_MIN;
-int_least64_t c4 = INT64_C (0x7fffffffffffffff);
-int_least64_t c4max = INT_LEAST64_MAX;
-int_least64_t c4min = INT_LEAST64_MIN;
-uint_least8_t d1 = UINT8_C (0xff);
-uint_least8_t d1max = UINT_LEAST8_MAX;
-uint_least16_t d2 = UINT16_C (0xffff);
-uint_least16_t d2max = UINT_LEAST16_MAX;
-uint_least32_t d3 = UINT32_C (0xffffffff);
-uint_least32_t d3max = UINT_LEAST32_MAX;
-uint_least64_t d4 = UINT64_C (0xffffffffffffffff);
-uint_least64_t d4max = UINT_LEAST64_MAX;
-int_fast8_t e1 = INT_FAST8_MAX;
-int_fast8_t e1min = INT_FAST8_MIN;
-int_fast16_t e2 = INT_FAST16_MAX;
-int_fast16_t e2min = INT_FAST16_MIN;
-int_fast32_t e3 = INT_FAST32_MAX;
-int_fast32_t e3min = INT_FAST32_MIN;
-int_fast64_t e4 = INT_FAST64_MAX;
-int_fast64_t e4min = INT_FAST64_MIN;
-uint_fast8_t f1 = UINT_FAST8_MAX;
-uint_fast16_t f2 = UINT_FAST16_MAX;
-uint_fast32_t f3 = UINT_FAST32_MAX;
-uint_fast64_t f4 = UINT_FAST64_MAX;
-#ifdef INTPTR_MAX
-intptr_t g = INTPTR_MAX;
-intptr_t gmin = INTPTR_MIN;
-#endif
-#ifdef UINTPTR_MAX
-uintptr_t h = UINTPTR_MAX;
-#endif
-intmax_t i = INTMAX_MAX;
-uintmax_t j = UINTMAX_MAX;
-
-/* Check that SIZE_MAX has the correct type, if possible.  */
-#if 201112 <= __STDC_VERSION__
-int k = _Generic (SIZE_MAX, size_t: 0);
-#elif (2 <= __GNUC__ || defined __IBM__TYPEOF__ \
-       || (0x5110 <= __SUNPRO_C && !__STDC__))
-extern size_t k;
-extern __typeof__ (SIZE_MAX) k;
-#endif
-
-#include <limits.h> /* for CHAR_BIT */
-#define TYPE_MINIMUM(t) \
-  ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t)))
-#define TYPE_MAXIMUM(t) \
-  ((t) ((t) 0 < (t) -1 \
-        ? (t) -1 \
-        : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
-struct s {
-  int check_PTRDIFF:
-      PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t)
-      && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t)
-      ? 1 : -1;
-  /* Detect bug in FreeBSD 6.0 / ia64.  */
-  int check_SIG_ATOMIC:
-      SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t)
-      && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t)
-      ? 1 : -1;
-  int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1;
-  int check_WCHAR:
-      WCHAR_MIN == TYPE_MINIMUM (wchar_t)
-      && WCHAR_MAX == TYPE_MAXIMUM (wchar_t)
-      ? 1 : -1;
-  /* Detect bug in mingw.  */
-  int check_WINT:
-      WINT_MIN == TYPE_MINIMUM (wint_t)
-      && WINT_MAX == TYPE_MAXIMUM (wint_t)
-      ? 1 : -1;
-
-  /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others.  */
-  int check_UINT8_C:
-        (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1;
-  int check_UINT16_C:
-        (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1;
-
-  /* Detect bugs in OpenBSD 3.9 stdint.h.  */
-#ifdef UINT8_MAX
-  int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1;
-#endif
-#ifdef UINT16_MAX
-  int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1;
-#endif
-#ifdef UINT32_MAX
-  int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1;
-#endif
-#ifdef UINT64_MAX
-  int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1;
-#endif
-  int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1;
-  int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1;
-  int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1;
-  int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1;
-  int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1;
-  int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1;
-  int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1;
-  int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1;
-  int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1;
-  int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1;
-  int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1;
-};
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-                                                    if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                         # Guess yes on native Windows.
-                 mingw*) gl_cv_header_working_stdint_h="guessing yes" ;;
-                         # In general, assume it works.
-                 *)      gl_cv_header_working_stdint_h="guessing yes" ;;
-               esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
-#define __STDC_CONSTANT_MACROS 1
-#define __STDC_LIMIT_MACROS 1
-#include <stdint.h>
-
-
-  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-     included before <wchar.h>.  */
-  #include <stddef.h>
-  #include <signal.h>
-  #if HAVE_WCHAR_H
-  # include <stdio.h>
-  # include <time.h>
-  # include <wchar.h>
-  #endif
-
-
-#include <stdio.h>
-#include <string.h>
-#define MVAL(macro) MVAL1(macro)
-#define MVAL1(expression) #expression
-static const char *macro_values[] =
-  {
-#ifdef INT8_MAX
-    MVAL (INT8_MAX),
-#endif
-#ifdef INT16_MAX
-    MVAL (INT16_MAX),
-#endif
-#ifdef INT32_MAX
-    MVAL (INT32_MAX),
-#endif
-#ifdef INT64_MAX
-    MVAL (INT64_MAX),
-#endif
-#ifdef UINT8_MAX
-    MVAL (UINT8_MAX),
-#endif
-#ifdef UINT16_MAX
-    MVAL (UINT16_MAX),
-#endif
-#ifdef UINT32_MAX
-    MVAL (UINT32_MAX),
-#endif
-#ifdef UINT64_MAX
-    MVAL (UINT64_MAX),
-#endif
-    NULL
-  };
-
-int
-main ()
-{
-
-  const char **mv;
-  for (mv = macro_values; *mv != NULL; mv++)
-    {
-      const char *value = *mv;
-      /* Test whether it looks like a cast expression.  */
-      if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0
-          || strncmp (value, "((unsigned short)"/*)*/, 17) == 0
-          || strncmp (value, "((unsigned char)"/*)*/, 16) == 0
-          || strncmp (value, "((int)"/*)*/, 6) == 0
-          || strncmp (value, "((signed short)"/*)*/, 15) == 0
-          || strncmp (value, "((signed char)"/*)*/, 14) == 0)
-        return mv - macro_values + 1;
-    }
-  return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_header_working_stdint_h=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_stdint_h" >&5
-$as_echo "$gl_cv_header_working_stdint_h" >&6; }
-  fi
-
-  HAVE_C99_STDINT_H=0
-  HAVE_SYS_BITYPES_H=0
-  HAVE_SYS_INTTYPES_H=0
-  STDINT_H=stdint.h
-  case "$gl_cv_header_working_stdint_h" in
-    *yes)
-      HAVE_C99_STDINT_H=1
-                  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdint.h predates C++11" >&5
-$as_echo_n "checking whether stdint.h predates C++11... " >&6; }
-if ${gl_cv_header_stdint_predates_cxx11_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gl_cv_header_stdint_predates_cxx11_h=yes
-         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
-#include <stdint.h>
-
-
-  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-     included before <wchar.h>.  */
-  #include <stddef.h>
-  #include <signal.h>
-  #if HAVE_WCHAR_H
-  # include <stdio.h>
-  # include <time.h>
-  # include <wchar.h>
-  #endif
-
-
-intmax_t im = INTMAX_MAX;
-int32_t i32 = INT32_C (0x7fffffff);
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_header_stdint_predates_cxx11_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_predates_cxx11_h" >&5
-$as_echo "$gl_cv_header_stdint_predates_cxx11_h" >&6; }
-
-      if test "$gl_cv_header_stdint_predates_cxx11_h" = yes; then
-
-$as_echo "#define __STDC_CONSTANT_MACROS 1" >>confdefs.h
-
-
-$as_echo "#define __STDC_LIMIT_MACROS 1" >>confdefs.h
-
-      fi
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdint.h has UINTMAX_WIDTH etc." >&5
-$as_echo_n "checking whether stdint.h has UINTMAX_WIDTH etc.... " >&6; }
-if ${gl_cv_header_stdint_width+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gl_cv_header_stdint_width=no
-         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-              /* Work if build is not clean.  */
-              #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1
-              #ifndef __STDC_WANT_IEC_60559_BFP_EXT__
-               #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
-              #endif
-              #include <stdint.h>
-
-  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-     included before <wchar.h>.  */
-  #include <stddef.h>
-  #include <signal.h>
-  #if HAVE_WCHAR_H
-  # include <stdio.h>
-  # include <time.h>
-  # include <wchar.h>
-  #endif
-
-              int iw = UINTMAX_WIDTH;
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_header_stdint_width=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_width" >&5
-$as_echo "$gl_cv_header_stdint_width" >&6; }
-      if test "$gl_cv_header_stdint_width" = yes; then
-        STDINT_H=
-      fi
-      ;;
-    *)
-                  for ac_header in sys/inttypes.h sys/bitypes.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-      if test $ac_cv_header_sys_inttypes_h = yes; then
-        HAVE_SYS_INTTYPES_H=1
-      fi
-      if test $ac_cv_header_sys_bitypes_h = yes; then
-        HAVE_SYS_BITYPES_H=1
-      fi
-
-
-  if test $APPLE_UNIVERSAL_BUILD = 0; then
-
-
-  for gltype in ptrdiff_t size_t ; do
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5
-$as_echo_n "checking for bit size of $gltype... " >&6; }
-if eval \${gl_cv_bitsizeof_${gltype}+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result"        "
-  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-     included before <wchar.h>.  */
-  #include <stddef.h>
-  #include <signal.h>
-  #if HAVE_WCHAR_H
-  # include <stdio.h>
-  # include <time.h>
-  # include <wchar.h>
-  #endif
-
-#include <limits.h>"; then :
-
-else
-  result=unknown
-fi
-
-       eval gl_cv_bitsizeof_${gltype}=\$result
-
-fi
-eval ac_res=\$gl_cv_bitsizeof_${gltype}
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-    eval result=\$gl_cv_bitsizeof_${gltype}
-    if test $result = unknown; then
-                                                result=0
-    fi
-    GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
-    cat >>confdefs.h <<_ACEOF
-#define BITSIZEOF_${GLTYPE} $result
-_ACEOF
-
-    eval BITSIZEOF_${GLTYPE}=\$result
-  done
-
-
-  fi
-
-
-  for gltype in sig_atomic_t wchar_t wint_t ; do
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5
-$as_echo_n "checking for bit size of $gltype... " >&6; }
-if eval \${gl_cv_bitsizeof_${gltype}+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result"        "
-  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-     included before <wchar.h>.  */
-  #include <stddef.h>
-  #include <signal.h>
-  #if HAVE_WCHAR_H
-  # include <stdio.h>
-  # include <time.h>
-  # include <wchar.h>
-  #endif
-
-#include <limits.h>"; then :
-
-else
-  result=unknown
-fi
-
-       eval gl_cv_bitsizeof_${gltype}=\$result
-
-fi
-eval ac_res=\$gl_cv_bitsizeof_${gltype}
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-    eval result=\$gl_cv_bitsizeof_${gltype}
-    if test $result = unknown; then
-                                                result=0
-    fi
-    GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
-    cat >>confdefs.h <<_ACEOF
-#define BITSIZEOF_${GLTYPE} $result
-_ACEOF
-
-    eval BITSIZEOF_${GLTYPE}=\$result
-  done
-
-
-
-
-  for gltype in sig_atomic_t wchar_t wint_t ; do
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gltype is signed" >&5
-$as_echo_n "checking whether $gltype is signed... " >&6; }
-if eval \${gl_cv_type_${gltype}_signed+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-     included before <wchar.h>.  */
-  #include <stddef.h>
-  #include <signal.h>
-  #if HAVE_WCHAR_H
-  # include <stdio.h>
-  # include <time.h>
-  # include <wchar.h>
-  #endif
-
-            int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  result=yes
-else
-  result=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-       eval gl_cv_type_${gltype}_signed=\$result
-
-fi
-eval ac_res=\$gl_cv_type_${gltype}_signed
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-    eval result=\$gl_cv_type_${gltype}_signed
-    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
-    if test "$result" = yes; then
-      cat >>confdefs.h <<_ACEOF
-#define HAVE_SIGNED_${GLTYPE} 1
-_ACEOF
-
-      eval HAVE_SIGNED_${GLTYPE}=1
-    else
-      eval HAVE_SIGNED_${GLTYPE}=0
-    fi
-  done
-
-
-  gl_cv_type_ptrdiff_t_signed=yes
-  gl_cv_type_size_t_signed=no
-  if test $APPLE_UNIVERSAL_BUILD = 0; then
-
-
-  for gltype in ptrdiff_t size_t ; do
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5
-$as_echo_n "checking for $gltype integer literal suffix... " >&6; }
-if eval \${gl_cv_type_${gltype}_suffix+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval gl_cv_type_${gltype}_suffix=no
-       eval result=\$gl_cv_type_${gltype}_signed
-       if test "$result" = yes; then
-         glsufu=
-       else
-         glsufu=u
-       fi
-       for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
-         case $glsuf in
-           '')  gltype1='int';;
-           l)   gltype1='long int';;
-           ll)  gltype1='long long int';;
-           i64) gltype1='__int64';;
-           u)   gltype1='unsigned int';;
-           ul)  gltype1='unsigned long int';;
-           ull) gltype1='unsigned long long int';;
-           ui64)gltype1='unsigned __int64';;
-         esac
-         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-     included before <wchar.h>.  */
-  #include <stddef.h>
-  #include <signal.h>
-  #if HAVE_WCHAR_H
-  # include <stdio.h>
-  # include <time.h>
-  # include <wchar.h>
-  #endif
-
-              extern $gltype foo;
-              extern $gltype1 foo;
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval gl_cv_type_${gltype}_suffix=\$glsuf
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-         eval result=\$gl_cv_type_${gltype}_suffix
-         test "$result" != no && break
-       done
-fi
-eval ac_res=\$gl_cv_type_${gltype}_suffix
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
-    eval result=\$gl_cv_type_${gltype}_suffix
-    test "$result" = no && result=
-    eval ${GLTYPE}_SUFFIX=\$result
-    cat >>confdefs.h <<_ACEOF
-#define ${GLTYPE}_SUFFIX $result
-_ACEOF
-
-  done
-
-
-  fi
-
-
-  for gltype in sig_atomic_t wchar_t wint_t ; do
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5
-$as_echo_n "checking for $gltype integer literal suffix... " >&6; }
-if eval \${gl_cv_type_${gltype}_suffix+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval gl_cv_type_${gltype}_suffix=no
-       eval result=\$gl_cv_type_${gltype}_signed
-       if test "$result" = yes; then
-         glsufu=
-       else
-         glsufu=u
-       fi
-       for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
-         case $glsuf in
-           '')  gltype1='int';;
-           l)   gltype1='long int';;
-           ll)  gltype1='long long int';;
-           i64) gltype1='__int64';;
-           u)   gltype1='unsigned int';;
-           ul)  gltype1='unsigned long int';;
-           ull) gltype1='unsigned long long int';;
-           ui64)gltype1='unsigned __int64';;
-         esac
-         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-     included before <wchar.h>.  */
-  #include <stddef.h>
-  #include <signal.h>
-  #if HAVE_WCHAR_H
-  # include <stdio.h>
-  # include <time.h>
-  # include <wchar.h>
-  #endif
-
-              extern $gltype foo;
-              extern $gltype1 foo;
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval gl_cv_type_${gltype}_suffix=\$glsuf
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-         eval result=\$gl_cv_type_${gltype}_suffix
-         test "$result" != no && break
-       done
-fi
-eval ac_res=\$gl_cv_type_${gltype}_suffix
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
-    eval result=\$gl_cv_type_${gltype}_suffix
-    test "$result" = no && result=
-    eval ${GLTYPE}_SUFFIX=\$result
-    cat >>confdefs.h <<_ACEOF
-#define ${GLTYPE}_SUFFIX $result
-_ACEOF
-
-  done
-
-
-
-          if test $GNULIB_OVERRIDES_WINT_T = 1; then
-    BITSIZEOF_WINT_T=32
-  fi
-
-      ;;
-  esac
-
-
-
-  LIMITS_H='limits.h'
-   if test -n "$LIMITS_H"; then
-  GL_GENERATE_LIMITS_H_TRUE=
-  GL_GENERATE_LIMITS_H_FALSE='#'
-else
-  GL_GENERATE_LIMITS_H_TRUE='#'
-  GL_GENERATE_LIMITS_H_FALSE=
-fi
-
-
-
-
-
-
-
-   if test -n "$STDINT_H"; then
-  GL_GENERATE_STDINT_H_TRUE=
-  GL_GENERATE_STDINT_H_FALSE='#'
-else
-  GL_GENERATE_STDINT_H_TRUE='#'
-  GL_GENERATE_STDINT_H_FALSE=
-fi
-
-
-
-
-
-  GNULIB_IMAXABS=0;
-  GNULIB_IMAXDIV=0;
-  GNULIB_STRTOIMAX=0;
-  GNULIB_STRTOUMAX=0;
-    HAVE_DECL_IMAXABS=1;
-  HAVE_DECL_IMAXDIV=1;
-  HAVE_DECL_STRTOIMAX=1;
-  HAVE_DECL_STRTOUMAX=1;
-  HAVE_IMAXDIV_T=1;
-  REPLACE_STRTOIMAX=0;
-  REPLACE_STRTOUMAX=0;
-  INT32_MAX_LT_INTMAX_MAX=1;
-  INT64_MAX_EQ_LONG_MAX='defined _LP64';
-  PRI_MACROS_BROKEN=0;
-  PRIPTR_PREFIX=__PRIPTR_PREFIX;
-  UINT32_MAX_LT_UINTMAX_MAX=1;
-  UINT64_MAX_EQ_ULONG_MAX='defined _LP64';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_inttypes_h='<'inttypes.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <inttypes.h>" >&5
-$as_echo_n "checking absolute name of <inttypes.h>... " >&6; }
-if ${gl_cv_next_inttypes_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-             if test $ac_cv_header_inttypes_h = yes; then
-
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <inttypes.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'inttypes.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_inttypes_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_inttypes_h
-           gl_cv_next_inttypes_h='"'$gl_header'"'
-          else
-               gl_cv_next_inttypes_h='<'inttypes.h'>'
-             fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_inttypes_h" >&5
-$as_echo "$gl_cv_next_inttypes_h" >&6; }
-     fi
-     NEXT_INTTYPES_H=$gl_cv_next_inttypes_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'inttypes.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_inttypes_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H=$gl_next_as_first_directive
-
-
-
-
-
-
-
-
-
-
-
-
-  for ac_header in inttypes.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "inttypes.h" "ac_cv_header_inttypes_h" "$ac_includes_default"
-if test "x$ac_cv_header_inttypes_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_INTTYPES_H 1
-_ACEOF
-
-fi
-
-done
-
-  if test $ac_cv_header_inttypes_h = yes; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the inttypes.h PRIxNN macros are broken" >&5
-$as_echo_n "checking whether the inttypes.h PRIxNN macros are broken... " >&6; }
-if ${gt_cv_inttypes_pri_broken+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <inttypes.h>
-#ifdef PRId32
-char *p = PRId32;
-#endif
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gt_cv_inttypes_pri_broken=no
-else
-  gt_cv_inttypes_pri_broken=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_inttypes_pri_broken" >&5
-$as_echo "$gt_cv_inttypes_pri_broken" >&6; }
-  fi
-  if test "$gt_cv_inttypes_pri_broken" = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define PRI_MACROS_BROKEN 1
-_ACEOF
-
-    PRI_MACROS_BROKEN=1
-  else
-    PRI_MACROS_BROKEN=0
-  fi
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5
-$as_echo_n "checking where to find the exponent in a 'float'... " >&6; }
-if ${gl_cv_cc_float_expbit0+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  gl_cv_cc_float_expbit0="word 0 bit 23"
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <float.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#define NWORDS \
-  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-typedef union { float value; unsigned int word[NWORDS]; } memory_float;
-static unsigned int ored_words[NWORDS];
-static unsigned int anded_words[NWORDS];
-static void add_to_ored_words (float x)
-{
-  memory_float m;
-  size_t i;
-  /* Clear it first, in case
-     sizeof (float) < sizeof (memory_float).  */
-  memset (&m, 0, sizeof (memory_float));
-  m.value = x;
-  for (i = 0; i < NWORDS; i++)
-    {
-      ored_words[i] |= m.word[i];
-      anded_words[i] &= m.word[i];
-    }
-}
-int main ()
-{
-  size_t j;
-  FILE *fp = fopen ("conftest.out", "w");
-  if (fp == NULL)
-    return 1;
-  for (j = 0; j < NWORDS; j++)
-    anded_words[j] = ~ (unsigned int) 0;
-  add_to_ored_words (0.25f);
-  add_to_ored_words (0.5f);
-  add_to_ored_words (1.0f);
-  add_to_ored_words (2.0f);
-  add_to_ored_words (4.0f);
-  /* Remove bits that are common (e.g. if representation of the first mantissa
-     bit is explicit).  */
-  for (j = 0; j < NWORDS; j++)
-    ored_words[j] &= ~anded_words[j];
-  /* Now find the nonzero word.  */
-  for (j = 0; j < NWORDS; j++)
-    if (ored_words[j] != 0)
-      break;
-  if (j < NWORDS)
-    {
-      size_t i;
-      for (i = j + 1; i < NWORDS; i++)
-        if (ored_words[i] != 0)
-          {
-            fprintf (fp, "unknown");
-            return (fclose (fp) != 0);
-          }
-      for (i = 0; ; i++)
-        if ((ored_words[j] >> i) & 1)
-          {
-            fprintf (fp, "word %d bit %d", (int) j, (int) i);
-            return (fclose (fp) != 0);
-          }
-    }
-  fprintf (fp, "unknown");
-  return (fclose (fp) != 0);
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_cc_float_expbit0=`cat conftest.out`
-else
-  gl_cv_cc_float_expbit0="unknown"
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      rm -f conftest.out
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5
-$as_echo "$gl_cv_cc_float_expbit0" >&6; }
-  case "$gl_cv_cc_float_expbit0" in
-    word*bit*)
-      word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
-      bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'`
-
-cat >>confdefs.h <<_ACEOF
-#define FLT_EXPBIT0_WORD $word
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define FLT_EXPBIT0_BIT $bit
-_ACEOF
-
-      ;;
-  esac
-
-
-
-  ISNANF_LIBM=
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used without linking with libm" >&5
-$as_echo_n "checking whether isnan(float) can be used without linking with libm... " >&6; }
-if ${gl_cv_func_isnanf_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             #if __GNUC__ >= 4
-             # undef isnanf
-             # define isnanf(x) __builtin_isnanf ((float)(x))
-             #elif defined isnan
-             # undef isnanf
-             # define isnanf(x) isnan ((float)(x))
-             #endif
-             float x;
-int
-main ()
-{
-return isnanf (x);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_isnanf_no_libm=yes
-else
-  gl_cv_func_isnanf_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_no_libm" >&5
-$as_echo "$gl_cv_func_isnanf_no_libm" >&6; }
-
-  if test $gl_cv_func_isnanf_no_libm = no; then
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used with libm" >&5
-$as_echo_n "checking whether isnan(float) can be used with libm... " >&6; }
-if ${gl_cv_func_isnanf_in_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      save_LIBS="$LIBS"
-      LIBS="$LIBS -lm"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             #if __GNUC__ >= 4
-             # undef isnanf
-             # define isnanf(x) __builtin_isnanf ((float)(x))
-             #elif defined isnan
-             # undef isnanf
-             # define isnanf(x) isnan ((float)(x))
-             #endif
-             float x;
-int
-main ()
-{
-return isnanf (x);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_isnanf_in_libm=yes
-else
-  gl_cv_func_isnanf_in_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-      LIBS="$save_LIBS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_in_libm" >&5
-$as_echo "$gl_cv_func_isnanf_in_libm" >&6; }
-
-    if test $gl_cv_func_isnanf_in_libm = yes; then
-      ISNANF_LIBM=-lm
-    fi
-  fi
-    if test $gl_cv_func_isnanf_no_libm = yes \
-     || test $gl_cv_func_isnanf_in_libm = yes; then
-    save_LIBS="$LIBS"
-    LIBS="$LIBS $ISNANF_LIBM"
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) works" >&5
-$as_echo_n "checking whether isnan(float) works... " >&6; }
-if ${gl_cv_func_isnanf_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-           irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;;
-           mingw*) # Guess yes on mingw, no on MSVC.
-             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef __MINGW32__
- Known
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Known" >/dev/null 2>&1; then :
-  gl_cv_func_isnanf_works="guessing yes"
-else
-  gl_cv_func_isnanf_works="guessing no"
-fi
-rm -f conftest*
-
-             ;;
-           *) gl_cv_func_isnanf_works="guessing yes" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <math.h>
-#if __GNUC__ >= 4
-# undef isnanf
-# define isnanf(x) __builtin_isnanf ((float)(x))
-#elif defined isnan
-# undef isnanf
-# define isnanf(x) isnan ((float)(x))
-#endif
-/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0.  */
-#ifdef __DECC
-static float
-NaN ()
-{
-  static float zero = 0.0f;
-  return zero / zero;
-}
-#else
-# define NaN() (0.0f / 0.0f)
-#endif
-#define NWORDS \
-  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-typedef union { unsigned int word[NWORDS]; float value; } memory_float;
-int main()
-{
-  int result = 0;
-
-  if (isnanf (1.0f / 0.0f))
-    result |= 1;
-
-  if (!isnanf (NaN ()))
-    result |= 2;
-
-#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
-  /* The isnanf function should be immune against changes in the sign bit and
-     in the mantissa bits.  The xor operation twiddles a bit that can only be
-     a sign bit or a mantissa bit.  */
-  if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0)
-    {
-      memory_float m;
-
-      m.value = NaN ();
-      /* Set the bits below the exponent to 01111...111.  */
-      m.word[0] &= -1U << FLT_EXPBIT0_BIT;
-      m.word[0] |= 1U << (FLT_EXPBIT0_BIT - 1) - 1;
-      if (!isnanf (m.value))
-        result |= 4;
-    }
-#endif
-
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_isnanf_works=yes
-else
-  gl_cv_func_isnanf_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_works" >&5
-$as_echo "$gl_cv_func_isnanf_works" >&6; }
-
-    LIBS="$save_LIBS"
-    case "$gl_cv_func_isnanf_works" in
-      *yes) gl_func_isnanf=yes ;;
-      *)    gl_func_isnanf=no; ISNANF_LIBM= ;;
-    esac
-  else
-    gl_func_isnanf=no
-  fi
-  if test $gl_func_isnanf != yes; then
-    HAVE_ISNANF=0
-  fi
-
-
-
-
-  ISNAND_LIBM=
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used without linking with libm" >&5
-$as_echo_n "checking whether isnan(double) can be used without linking with libm... " >&6; }
-if ${gl_cv_func_isnand_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             #if __GNUC__ >= 4
-             # undef isnand
-             # define isnand(x) __builtin_isnan ((double)(x))
-             #else
-             # undef isnand
-             # define isnand(x) isnan ((double)(x))
-             #endif
-             double x;
-int
-main ()
-{
-return isnand (x);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_isnand_no_libm=yes
-else
-  gl_cv_func_isnand_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_no_libm" >&5
-$as_echo "$gl_cv_func_isnand_no_libm" >&6; }
-
-  if test $gl_cv_func_isnand_no_libm = no; then
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used with libm" >&5
-$as_echo_n "checking whether isnan(double) can be used with libm... " >&6; }
-if ${gl_cv_func_isnand_in_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      save_LIBS="$LIBS"
-      LIBS="$LIBS -lm"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             #if __GNUC__ >= 4
-             # undef isnand
-             # define isnand(x) __builtin_isnan ((double)(x))
-             #elif defined isnan
-             # undef isnand
-             # define isnand(x) isnan ((double)(x))
-             #endif
-             double x;
-int
-main ()
-{
-return isnand (x);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_isnand_in_libm=yes
-else
-  gl_cv_func_isnand_in_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-      LIBS="$save_LIBS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_in_libm" >&5
-$as_echo "$gl_cv_func_isnand_in_libm" >&6; }
-
-    if test $gl_cv_func_isnand_in_libm = yes; then
-      ISNAND_LIBM=-lm
-    fi
-  fi
-    if test $gl_cv_func_isnand_no_libm = yes \
-     || test $gl_cv_func_isnand_in_libm = yes; then
-    gl_func_isnand=yes
-  else
-    gl_func_isnand=no
-    HAVE_ISNAND=0
-  fi
-
-
-
-
-  ISNANL_LIBM=
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used without linking with libm" >&5
-$as_echo_n "checking whether isnan(long double) can be used without linking with libm... " >&6; }
-if ${gl_cv_func_isnanl_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             #if __GNUC__ >= 4
-             # undef isnanl
-             # define isnanl(x) __builtin_isnanl ((long double)(x))
-             #elif defined isnan
-             # undef isnanl
-             # define isnanl(x) isnan ((long double)(x))
-             #endif
-             long double x;
-int
-main ()
-{
-return isnanl (x);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_isnanl_no_libm=yes
-else
-  gl_cv_func_isnanl_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_no_libm" >&5
-$as_echo "$gl_cv_func_isnanl_no_libm" >&6; }
-
-  if test $gl_cv_func_isnanl_no_libm = no; then
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used with libm" >&5
-$as_echo_n "checking whether isnan(long double) can be used with libm... " >&6; }
-if ${gl_cv_func_isnanl_in_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      save_LIBS="$LIBS"
-      LIBS="$LIBS -lm"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             #if __GNUC__ >= 4
-             # undef isnanl
-             # define isnanl(x) __builtin_isnanl ((long double)(x))
-             #elif defined isnan
-             # undef isnanl
-             # define isnanl(x) isnan ((long double)(x))
-             #endif
-             long double x;
-int
-main ()
-{
-return isnanl (x);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_isnanl_in_libm=yes
-else
-  gl_cv_func_isnanl_in_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-      LIBS="$save_LIBS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_in_libm" >&5
-$as_echo "$gl_cv_func_isnanl_in_libm" >&6; }
-
-    if test $gl_cv_func_isnanl_in_libm = yes; then
-      ISNANL_LIBM=-lm
-    fi
-  fi
-    if test $gl_cv_func_isnanl_no_libm = yes \
-     || test $gl_cv_func_isnanl_in_libm = yes; then
-    save_LIBS="$LIBS"
-    LIBS="$LIBS $ISNANL_LIBM"
-
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnanl works" >&5
-$as_echo_n "checking whether isnanl works... " >&6; }
-if ${gl_cv_func_isnanl_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-           mingw*) # Guess yes on mingw, no on MSVC.
-             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef __MINGW32__
- Known
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Known" >/dev/null 2>&1; then :
-  gl_cv_func_isnanl_works="guessing yes"
-else
-  gl_cv_func_isnanl_works="guessing no"
-fi
-rm -f conftest*
-
-             ;;
-           *) gl_cv_func_isnanl_works="guessing yes" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <float.h>
-#include <limits.h>
-#include <math.h>
-#if __GNUC__ >= 4
-# undef isnanl
-# define isnanl(x) __builtin_isnanl ((long double)(x))
-#elif defined isnan
-# undef isnanl
-# define isnanl(x) isnan ((long double)(x))
-#endif
-#define NWORDS \
-  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-typedef union { unsigned int word[NWORDS]; long double value; }
-        memory_long_double;
-/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
-   runtime type conversion.  */
-#ifdef __sgi
-static long double NaNl ()
-{
-  double zero = 0.0;
-  return zero / zero;
-}
-#else
-# define NaNl() (0.0L / 0.0L)
-#endif
-int main ()
-{
-  int result = 0;
-
-  if (!isnanl (NaNl ()))
-    result |= 1;
-
-  {
-    memory_long_double m;
-    unsigned int i;
-
-    /* The isnanl function should be immune against changes in the sign bit and
-       in the mantissa bits.  The xor operation twiddles a bit that can only be
-       a sign bit or a mantissa bit (since the exponent never extends to
-       bit 31).  */
-    m.value = NaNl ();
-    m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
-    for (i = 0; i < NWORDS; i++)
-      m.word[i] |= 1;
-    if (!isnanl (m.value))
-      result |= 1;
-  }
-
-#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
-/* Representation of an 80-bit 'long double' as an initializer for a sequence
-   of 'unsigned int' words.  */
-# ifdef WORDS_BIGENDIAN
-#  define LDBL80_WORDS(exponent,manthi,mantlo) \
-     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
-       ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16),   \
-       (unsigned int) (mantlo) << 16                                        \
-     }
-# else
-#  define LDBL80_WORDS(exponent,manthi,mantlo) \
-     { mantlo, manthi, exponent }
-# endif
-  { /* Quiet NaN.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
-    if (!isnanl (x.value))
-      result |= 2;
-  }
-  {
-    /* Signalling NaN.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
-    if (!isnanl (x.value))
-      result |= 2;
-  }
-  /* isnanl should return something even for noncanonical values.  */
-  { /* Pseudo-NaN.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    if (isnanl (x.value) && !isnanl (x.value))
-      result |= 4;
-  }
-  { /* Pseudo-Infinity.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    if (isnanl (x.value) && !isnanl (x.value))
-      result |= 8;
-  }
-  { /* Pseudo-Zero.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    if (isnanl (x.value) && !isnanl (x.value))
-      result |= 16;
-  }
-  { /* Unnormalized number.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    if (isnanl (x.value) && !isnanl (x.value))
-      result |= 32;
-  }
-  { /* Pseudo-Denormal.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    if (isnanl (x.value) && !isnanl (x.value))
-      result |= 64;
-  }
-#endif
-
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_isnanl_works=yes
-else
-  gl_cv_func_isnanl_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_works" >&5
-$as_echo "$gl_cv_func_isnanl_works" >&6; }
-
-    LIBS="$save_LIBS"
-    case "$gl_cv_func_isnanl_works" in
-      *yes) gl_func_isnanl=yes ;;
-      *)    gl_func_isnanl=no; ISNANL_LIBM= ;;
-    esac
-  else
-    gl_func_isnanl=no
-  fi
-  if test $gl_func_isnanl != yes; then
-    HAVE_ISNANL=0
-  fi
-
-
-
-  GNULIB_ISWBLANK=0;
-  GNULIB_WCTYPE=0;
-  GNULIB_ISWCTYPE=0;
-  GNULIB_WCTRANS=0;
-  GNULIB_TOWCTRANS=0;
-    HAVE_ISWBLANK=1;
-  HAVE_WCTYPE_T=1;
-  HAVE_WCTRANS_T=1;
-  REPLACE_ISWBLANK=0;
-
-
-
-
-
-
-
-  if test $ac_cv_header_crtdefs_h = yes; then
-    HAVE_CRTDEFS_H=1
-  else
-    HAVE_CRTDEFS_H=0
-  fi
-
-
-
-
-
-
-
-
-
-  if test $ac_cv_func_iswcntrl = yes; then
-    HAVE_ISWCNTRL=1
-  else
-    HAVE_ISWCNTRL=0
-  fi
-
-
-
-  if test $gt_cv_c_wint_t = yes; then
-    HAVE_WINT_T=1
-  else
-    HAVE_WINT_T=0
-  fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_wctype_h='<'wctype.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <wctype.h>" >&5
-$as_echo_n "checking absolute name of <wctype.h>... " >&6; }
-if ${gl_cv_next_wctype_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-             if test $ac_cv_header_wctype_h = yes; then
-
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <wctype.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'wctype.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_wctype_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_wctype_h
-           gl_cv_next_wctype_h='"'$gl_header'"'
-          else
-               gl_cv_next_wctype_h='<'wctype.h'>'
-             fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wctype_h" >&5
-$as_echo "$gl_cv_next_wctype_h" >&6; }
-     fi
-     NEXT_WCTYPE_H=$gl_cv_next_wctype_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'wctype.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_wctype_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H=$gl_next_as_first_directive
-
-
-
-
-  if test $ac_cv_header_wctype_h = yes; then
-    if test $ac_cv_func_iswcntrl = yes; then
-                  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iswcntrl works" >&5
-$as_echo_n "checking whether iswcntrl works... " >&6; }
-if ${gl_cv_func_iswcntrl_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-          if test "$cross_compiling" = yes; then :
-               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-                          #if __GNU_LIBRARY__ == 1
-                          Linux libc5 i18n is broken.
-                          #endif
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_func_iswcntrl_works="guessing yes"
-else
-  gl_cv_func_iswcntrl_works="guessing no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-               /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
-                  included before <wchar.h>.
-                  BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
-                  must be included before <wchar.h>.  */
-               #include <stddef.h>
-               #include <stdio.h>
-               #include <time.h>
-               #include <wchar.h>
-               #include <wctype.h>
-               int main () { return iswprint ('x') == 0; }
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_iswcntrl_works=yes
-else
-  gl_cv_func_iswcntrl_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswcntrl_works" >&5
-$as_echo "$gl_cv_func_iswcntrl_works" >&6; }
-    fi
-    HAVE_WCTYPE_H=1
-  else
-    HAVE_WCTYPE_H=0
-  fi
-
-
-  if test $GNULIB_OVERRIDES_WINT_T = 1; then
-    REPLACE_ISWCNTRL=1
-  else
-    case "$gl_cv_func_iswcntrl_works" in
-      *yes) REPLACE_ISWCNTRL=0 ;;
-      *)    REPLACE_ISWCNTRL=1 ;;
-    esac
-  fi
-
-
-  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
-        :
-  fi
-
-  if test $REPLACE_ISWCNTRL = 1; then
-    REPLACE_TOWLOWER=1
-  else
-    for ac_func in towlower
-do :
-  ac_fn_c_check_func "$LINENO" "towlower" "ac_cv_func_towlower"
-if test "x$ac_cv_func_towlower" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_TOWLOWER 1
-_ACEOF
-
-fi
-done
-
-    if test $ac_cv_func_towlower = yes; then
-      REPLACE_TOWLOWER=0
-    else
-      ac_fn_c_check_decl "$LINENO" "towlower" "ac_cv_have_decl_towlower" "/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
-             included before <wchar.h>.
-             BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
-             must be included before <wchar.h>.  */
-          #include <stddef.h>
-          #include <stdio.h>
-          #include <time.h>
-          #include <wchar.h>
-          #if HAVE_WCTYPE_H
-          # include <wctype.h>
-          #endif
-
-"
-if test "x$ac_cv_have_decl_towlower" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_TOWLOWER $ac_have_decl
-_ACEOF
-
-      if test $ac_cv_have_decl_towlower = yes; then
-                                REPLACE_TOWLOWER=1
-      else
-        REPLACE_TOWLOWER=0
-      fi
-    fi
-  fi
-
-
-  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then
-        :
-  fi
-
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wctype_t" >&5
-$as_echo_n "checking for wctype_t... " >&6; }
-if ${gl_cv_type_wctype_t+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
-               included before <wchar.h>.
-               BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
-               must be included before <wchar.h>.  */
-            #include <stddef.h>
-            #include <stdio.h>
-            #include <time.h>
-            #include <wchar.h>
-            #if HAVE_WCTYPE_H
-            # include <wctype.h>
-            #endif
-            wctype_t a;
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_type_wctype_t=yes
-else
-  gl_cv_type_wctype_t=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctype_t" >&5
-$as_echo "$gl_cv_type_wctype_t" >&6; }
-  if test $gl_cv_type_wctype_t = no; then
-    HAVE_WCTYPE_T=0
-  fi
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wctrans_t" >&5
-$as_echo_n "checking for wctrans_t... " >&6; }
-if ${gl_cv_type_wctrans_t+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
-               included before <wchar.h>.
-               BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
-               must be included before <wchar.h>.  */
-            #include <stddef.h>
-            #include <stdio.h>
-            #include <time.h>
-            #include <wchar.h>
-            #include <wctype.h>
-            wctrans_t a;
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_type_wctrans_t=yes
-else
-  gl_cv_type_wctrans_t=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctrans_t" >&5
-$as_echo "$gl_cv_type_wctrans_t" >&6; }
-  if test $gl_cv_type_wctrans_t = no; then
-    HAVE_WCTRANS_T=0
-  fi
-
-
-
-
-
-
-
-
-
-  case "$host_os" in
-    mingw*)
-                        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit off_t" >&5
-$as_echo_n "checking for 64-bit off_t... " >&6; }
-if ${gl_cv_type_off_t_64+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-                int verify_off_t_size[sizeof (off_t) >= 8 ? 1 : -1];
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_type_off_t_64=yes
-else
-  gl_cv_type_off_t_64=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_off_t_64" >&5
-$as_echo "$gl_cv_type_off_t_64" >&6; }
-      if test $gl_cv_type_off_t_64 = no; then
-        WINDOWS_64_BIT_OFF_T=1
-      else
-        WINDOWS_64_BIT_OFF_T=0
-      fi
-                        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit st_size" >&5
-$as_echo_n "checking for 64-bit st_size... " >&6; }
-if ${gl_cv_member_st_size_64+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-                struct stat buf;
-                int verify_st_size_size[sizeof (buf.st_size) >= 8 ? 1 : -1];
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_member_st_size_64=yes
-else
-  gl_cv_member_st_size_64=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_member_st_size_64" >&5
-$as_echo "$gl_cv_member_st_size_64" >&6; }
-      if test $gl_cv_member_st_size_64 = no; then
-        WINDOWS_64_BIT_ST_SIZE=1
-      else
-        WINDOWS_64_BIT_ST_SIZE=0
-      fi
-      ;;
-    *)
-                                                      WINDOWS_64_BIT_OFF_T=0
-      WINDOWS_64_BIT_ST_SIZE=0
-      ;;
-  esac
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexp() can be used without linking with libm" >&5
-$as_echo_n "checking whether ldexp() can be used without linking with libm... " >&6; }
-if ${gl_cv_func_ldexp_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifndef __NO_MATH_INLINES
-                           # define __NO_MATH_INLINES 1 /* for glibc */
-                           #endif
-                           #include <math.h>
-                           double (*funcptr) (double, int) = ldexp;
-                           double x;
-int
-main ()
-{
-return ldexp (x, -1) > 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_ldexp_no_libm=yes
-else
-  gl_cv_func_ldexp_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_no_libm" >&5
-$as_echo "$gl_cv_func_ldexp_no_libm" >&6; }
-
-
-
-  LDEXP_LIBM=
-  if test $gl_cv_func_ldexp_no_libm = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexp() can be used with libm" >&5
-$as_echo_n "checking whether ldexp() can be used with libm... " >&6; }
-if ${gl_cv_func_ldexp_in_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-        save_LIBS="$LIBS"
-        LIBS="$LIBS -lm"
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifndef __NO_MATH_INLINES
-                             # define __NO_MATH_INLINES 1 /* for glibc */
-                             #endif
-                             #include <math.h>
-                             double (*funcptr) (double, int) = ldexp;
-                             double x;
-int
-main ()
-{
-return ldexp (x, -1) > 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_ldexp_in_libm=yes
-else
-  gl_cv_func_ldexp_in_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-        LIBS="$save_LIBS"
+# We want ostream_printf and hyperlink support.
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_in_libm" >&5
-$as_echo "$gl_cv_func_ldexp_in_libm" >&6; }
-    if test $gl_cv_func_ldexp_in_libm = yes; then
-      LDEXP_LIBM=-lm
-    fi
-  fi
 
 
 
@@ -19729,9 +8988,10 @@
 
 
 # Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
+if test ${with_gnu_ld+y}
+then :
   withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
+else $as_nop
   with_gnu_ld=no
 fi
 
@@ -19749,25 +9009,26 @@
 fi
 
 if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld" >&5
-$as_echo_n "checking for ld... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld" >&5
+printf %s "checking for ld... " >&6; }
 elif test "$GCC" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "checking for ld used by $CC... " >&6; }
 elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
 fi
 if test -n "$LD"; then
   # Let the user override the test with a path.
   :
 else
-  if ${acl_cv_path_LD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  if test ${acl_cv_path_LD+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
     acl_cv_path_LD= # Final result of this test
     ac_prog=ld # Program to search in $PATH
@@ -19829,14 +9090,15 @@
       *-*-aix*)
         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#if defined __powerpc64__ || defined _ARCH_PPC64
+#if defined __powerpc64__ || defined __LP64__
                 int ok;
                #else
                 error fail
                #endif
 
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   # The compiler produces 64-bit code. Add option '-b64' so that the
            # linker groks 64-bit object files.
            case "$acl_cv_path_LD " in
@@ -19845,7 +9107,7 @@
            esac
 
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
         ;;
       sparc64-*-netbsd*)
         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -19857,9 +9119,10 @@
                #endif
 
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
 
-else
+else $as_nop
   # The compiler produces 32-bit code. Add option '-m elf32_sparc'
            # so that the linker groks 32-bit object files.
            case "$acl_cv_path_LD " in
@@ -19868,7 +9131,7 @@
            esac
 
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
         ;;
     esac
 
@@ -19877,18 +9140,19 @@
   LD="$acl_cv_path_LD"
 fi
 if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
   as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if ${acl_cv_prog_gnu_ld+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${acl_cv_prog_gnu_ld+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   # I'd rather use --version here, but apparently some GNU lds only accept -v.
 case `$LD -v 2>&1 </dev/null` in
 *GNU* | *'with BFD'*)
@@ -19899,18 +9163,20 @@
   ;;
 esac
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5
-$as_echo "$acl_cv_prog_gnu_ld" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5
+printf "%s\n" "$acl_cv_prog_gnu_ld" >&6; }
 with_gnu_ld=$acl_cv_prog_gnu_ld
 
 
 
 
-                                                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5
-$as_echo_n "checking for shared library run path origin... " >&6; }
-if ${acl_cv_rpath+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+
+                                                { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5
+printf %s "checking for shared library run path origin... " >&6; }
+if test ${acl_cv_rpath+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
     CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
     ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
@@ -19919,8 +9185,8 @@
     acl_cv_rpath=done
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5
-$as_echo "$acl_cv_rpath" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5
+printf "%s\n" "$acl_cv_rpath" >&6; }
   wl="$acl_cv_wl"
   acl_libext="$acl_cv_libext"
   acl_shlibext="$acl_cv_shlibext"
@@ -19931,20 +9197,22 @@
   acl_hardcode_direct="$acl_cv_hardcode_direct"
   acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
     # Check whether --enable-rpath was given.
-if test "${enable_rpath+set}" = set; then :
+if test ${enable_rpath+y}
+then :
   enableval=$enable_rpath; :
-else
+else $as_nop
   enable_rpath=yes
 fi
 
 
 
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking 32-bit host C ABI" >&5
-$as_echo_n "checking 32-bit host C ABI... " >&6; }
-if ${gl_cv_host_cpu_c_abi_32bit+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking 32-bit host C ABI" >&5
+printf %s "checking 32-bit host C ABI... " >&6; }
+if test ${gl_cv_host_cpu_c_abi_32bit+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$gl_cv_host_cpu_c_abi"; then
        case "$gl_cv_host_cpu_c_abi" in
          i386 | x86_64-x32 | arm | armhf | arm64-ilp32 | hppa | ia64-ilp32 | mips | mipsn32 | powerpc | riscv*-ilp32* | s390 | sparc)
@@ -20006,12 +9274,13 @@
                   #endif
 
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   gl_cv_host_cpu_c_abi_32bit=no
-else
+else $as_nop
   gl_cv_host_cpu_c_abi_32bit=yes
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
            ;;
 
          arm* | aarch64 )
@@ -20030,12 +9299,13 @@
                   #endif
 
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   gl_cv_host_cpu_c_abi_32bit=no
-else
+else $as_nop
   gl_cv_host_cpu_c_abi_32bit=yes
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
            ;;
 
          hppa1.0 | hppa1.1 | hppa2.0* | hppa64 )
@@ -20050,12 +9320,13 @@
                   #endif
 
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   gl_cv_host_cpu_c_abi_32bit=no
-else
+else $as_nop
   gl_cv_host_cpu_c_abi_32bit=yes
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
            ;;
 
          ia64* )
@@ -20070,12 +9341,13 @@
                   #endif
 
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   gl_cv_host_cpu_c_abi_32bit=yes
-else
+else $as_nop
   gl_cv_host_cpu_c_abi_32bit=no
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
            ;;
 
          mips* )
@@ -20090,12 +9362,13 @@
                   #endif
 
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   gl_cv_host_cpu_c_abi_32bit=no
-else
+else $as_nop
   gl_cv_host_cpu_c_abi_32bit=yes
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
            ;;
 
          powerpc* )
@@ -20107,19 +9380,20 @@
            # be generating 64-bit code.
            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#if defined __powerpc64__ || defined _ARCH_PPC64
+#if defined __powerpc64__ || defined __LP64__
                    int ok;
                   #else
                    error fail
                   #endif
 
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   gl_cv_host_cpu_c_abi_32bit=no
-else
+else $as_nop
   gl_cv_host_cpu_c_abi_32bit=yes
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
            ;;
 
          rs6000 )
@@ -20138,12 +9412,13 @@
                   #endif
 
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   gl_cv_host_cpu_c_abi_32bit=no
-else
+else $as_nop
   gl_cv_host_cpu_c_abi_32bit=yes
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
            ;;
 
          s390* )
@@ -20158,12 +9433,13 @@
                   #endif
 
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   gl_cv_host_cpu_c_abi_32bit=no
-else
+else $as_nop
   gl_cv_host_cpu_c_abi_32bit=yes
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
            ;;
 
          sparc | sparc64 )
@@ -20178,12 +9454,13 @@
                   #endif
 
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
   gl_cv_host_cpu_c_abi_32bit=no
-else
+else $as_nop
   gl_cv_host_cpu_c_abi_32bit=yes
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
            ;;
 
          *)
@@ -20193,8 +9470,8 @@
      fi
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_host_cpu_c_abi_32bit" >&5
-$as_echo "$gl_cv_host_cpu_c_abi_32bit" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_host_cpu_c_abi_32bit" >&5
+printf "%s\n" "$gl_cv_host_cpu_c_abi_32bit" >&6; }
 
   HOST_CPU_C_ABI_32BIT="$gl_cv_host_cpu_c_abi_32bit"
 
@@ -20202,11 +9479,12 @@
 
 
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ELF binary format" >&5
-$as_echo_n "checking for ELF binary format... " >&6; }
-if ${gl_cv_elf+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ELF binary format" >&5
+printf %s "checking for ELF binary format... " >&6; }
+if test ${gl_cv_elf+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #ifdef __ELF__
@@ -20215,18 +9493,19 @@
 
 _ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Extensible Linking Format" >/dev/null 2>&1; then :
+  $EGREP "Extensible Linking Format" >/dev/null 2>&1
+then :
   gl_cv_elf=yes
-else
+else $as_nop
   gl_cv_elf=no
 fi
-rm -f conftest*
+rm -rf conftest*
 
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_elf" >&5
-$as_echo "$gl_cv_elf" >&6; }
-  if test $gl_cv_elf; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_elf" >&5
+printf "%s\n" "$gl_cv_elf" >&6; }
+  if test $gl_cv_elf = yes; then
     # Extract the ELF class of a file (5th byte) in decimal.
     # Cf. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header
     if od -A x < /dev/null >/dev/null 2>/dev/null; then
@@ -20243,19 +9522,22 @@
         echo
       }
     fi
+    # Use 'expr', not 'test', to compare the values of func_elfclass, because on
+    # Solaris 11 OpenIndiana and Solaris 11 OmniOS, the result is 001 or 002,
+    # not 1 or 2.
     case $HOST_CPU_C_ABI_32BIT in
       yes)
         # 32-bit ABI.
         acl_is_expected_elfclass ()
         {
-          test "`func_elfclass | sed -e 's/[ 	]//g'`" = 1
+          expr "`func_elfclass | sed -e 's/[ 	]//g'`" = 1 > /dev/null
         }
         ;;
       no)
         # 64-bit ABI.
         acl_is_expected_elfclass ()
         {
-          test "`func_elfclass | sed -e 's/[ 	]//g'`" = 2
+          expr "`func_elfclass | sed -e 's/[ 	]//g'`" = 2 > /dev/null
         }
         ;;
       *)
@@ -20273,11 +9555,12 @@
     }
   fi
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the common suffixes of directories in the library search path" >&5
-$as_echo_n "checking for the common suffixes of directories in the library search path... " >&6; }
-if ${acl_cv_libdirstems+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the common suffixes of directories in the library search path" >&5
+printf %s "checking for the common suffixes of directories in the library search path... " >&6; }
+if test ${acl_cv_libdirstems+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
             acl_libdirstem=lib
      acl_libdirstem2=
      acl_libdirstem3=
@@ -20341,1557 +9624,20 @@
      acl_cv_libdirstems="$acl_libdirstem,$acl_libdirstem2,$acl_libdirstem3"
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_libdirstems" >&5
-$as_echo "$acl_cv_libdirstems" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_libdirstems" >&5
+printf "%s\n" "$acl_cv_libdirstems" >&6; }
       acl_libdirstem=`echo "$acl_cv_libdirstems" | sed -e 's/,.*//'`
   acl_libdirstem2=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,//' -e 's/,.*//'`
   acl_libdirstem3=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,[^,]*,//' -e 's/,.*//'`
 
 
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5
-$as_echo_n "checking for nl_langinfo and CODESET... " >&6; }
-if ${am_cv_langinfo_codeset+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <langinfo.h>
-int
-main ()
-{
-char* cs = nl_langinfo(CODESET); return !cs;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  am_cv_langinfo_codeset=yes
-else
-  am_cv_langinfo_codeset=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5
-$as_echo "$am_cv_langinfo_codeset" >&6; }
-  if test $am_cv_langinfo_codeset = yes; then
-
-$as_echo "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-  gl_threads_api=none
-  LIBTHREAD=
-  LTLIBTHREAD=
-  LIBMULTITHREAD=
-  LTLIBMULTITHREAD=
-  if test "$gl_use_threads" != no; then
-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5
-$as_echo_n "checking whether imported symbols can be declared weak... " >&6; }
-if ${gl_cv_have_weak+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gl_cv_have_weak=no
-              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-extern void xyzzy ();
-#pragma weak xyzzy
-int
-main ()
-{
-xyzzy();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_have_weak=maybe
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-       if test $gl_cv_have_weak = maybe; then
-                           if test "$cross_compiling" = yes; then :
-                          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __ELF__
-               Extensible Linking Format
-               #endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Extensible Linking Format" >/dev/null 2>&1; then :
-  gl_cv_have_weak="guessing yes"
-else
-  gl_cv_have_weak="guessing no"
-fi
-rm -f conftest*
-
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#pragma weak fputs
-int main ()
-{
-  return (fputs == NULL);
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_have_weak=yes
-else
-  gl_cv_have_weak=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-       fi
-              case " $LDFLAGS " in
-         *" -static "*) gl_cv_have_weak=no ;;
-       esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5
-$as_echo "$gl_cv_have_weak" >&6; }
-    if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
-
-      :
-    fi
-    if test "$gl_use_threads" = isoc || test "$gl_use_threads" = isoc+posix; then
-
-      if test $ac_cv_header_threads_h = yes; then
-        gl_have_isoc_threads=
-        # Test whether both mtx_lock and cnd_timedwait exist in libc.
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <threads.h>
-               #include <stddef.h>
-               mtx_t m;
-               cnd_t c;
-
-int
-main ()
-{
-mtx_lock (&m);
-               cnd_timedwait (&c, &m, NULL);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_have_isoc_threads=yes
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-      fi
-    fi
-    if test "$gl_use_threads" = yes \
-       || test "$gl_use_threads" = posix \
-       || test "$gl_use_threads" = isoc+posix; then
-
-
-  if test -z "$gl_threadlib_body_done"; then
-    gl_pthread_api=no
-    LIBPTHREAD=
-    LIBPMULTITHREAD=
-    # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
-    # it groks <pthread.h>. It's added above, in gl_ANYTHREADLIB_EARLY.
-    ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
-if test "x$ac_cv_header_pthread_h" = xyes; then :
-  gl_have_pthread_h=yes
-else
-  gl_have_pthread_h=no
-fi
-
-
-    if test "$gl_have_pthread_h" = yes; then
-      # Other possible tests:
-      #   -lpthreads (FSU threads, PCthreads)
-      #   -lgthreads
-      # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
-      # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
-      # the second one only in libpthread, and lock.c needs it.
-      #
-      # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04
-      # needs -pthread for some reason.  See:
-      # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html
-      save_LIBS=$LIBS
-      for gl_pthread in '' '-pthread'; do
-        LIBS="$LIBS $gl_pthread"
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <pthread.h>
-               pthread_mutex_t m;
-               pthread_mutexattr_t ma;
-
-int
-main ()
-{
-pthread_mutex_lock (&m);
-               pthread_mutexattr_init (&ma);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_pthread_api=yes
-           LIBPTHREAD=$gl_pthread
-           LIBPMULTITHREAD=$gl_pthread
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-        LIBS=$save_LIBS
-        test $gl_pthread_api = yes && break
-      done
-
-      # Test for libpthread by looking for pthread_kill. (Not pthread_self,
-      # since it is defined as a macro on OSF/1.)
-      if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then
-        # The program links fine without libpthread. But it may actually
-        # need to link with libpthread in order to create multiple threads.
-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5
-$as_echo_n "checking for pthread_kill in -lpthread... " >&6; }
-if ${ac_cv_lib_pthread_pthread_kill+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lpthread  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char pthread_kill ();
-int
-main ()
-{
-return pthread_kill ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_pthread_pthread_kill=yes
-else
-  ac_cv_lib_pthread_pthread_kill=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5
-$as_echo "$ac_cv_lib_pthread_pthread_kill" >&6; }
-if test "x$ac_cv_lib_pthread_pthread_kill" = xyes; then :
-  LIBPMULTITHREAD=-lpthread
-           # On Solaris and HP-UX, most pthread functions exist also in libc.
-           # Therefore pthread_in_use() needs to actually try to create a
-           # thread: pthread_create from libc will fail, whereas
-           # pthread_create will actually create a thread.
-           # On Solaris 10 or newer, this test is no longer needed, because
-           # libc contains the fully functional pthread functions.
-           case "$host_os" in
-             solaris | solaris2.1-9 | solaris2.1-9.* | hpux*)
-
-$as_echo "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h
-
-           esac
-
-fi
-
-      elif test $gl_pthread_api != yes; then
-        # Some library is needed. Try libpthread and libc_r.
-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5
-$as_echo_n "checking for pthread_kill in -lpthread... " >&6; }
-if ${ac_cv_lib_pthread_pthread_kill+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lpthread  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char pthread_kill ();
-int
-main ()
-{
-return pthread_kill ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_pthread_pthread_kill=yes
-else
-  ac_cv_lib_pthread_pthread_kill=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5
-$as_echo "$ac_cv_lib_pthread_pthread_kill" >&6; }
-if test "x$ac_cv_lib_pthread_pthread_kill" = xyes; then :
-  gl_pthread_api=yes
-           LIBPTHREAD=-lpthread
-           LIBPMULTITHREAD=-lpthread
-fi
-
-        if test $gl_pthread_api != yes; then
-          # For FreeBSD 4.
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lc_r" >&5
-$as_echo_n "checking for pthread_kill in -lc_r... " >&6; }
-if ${ac_cv_lib_c_r_pthread_kill+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lc_r  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char pthread_kill ();
-int
-main ()
-{
-return pthread_kill ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_c_r_pthread_kill=yes
-else
-  ac_cv_lib_c_r_pthread_kill=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_kill" >&5
-$as_echo "$ac_cv_lib_c_r_pthread_kill" >&6; }
-if test "x$ac_cv_lib_c_r_pthread_kill" = xyes; then :
-  gl_pthread_api=yes
-             LIBPTHREAD=-lc_r
-             LIBPMULTITHREAD=-lc_r
-fi
-
-        fi
-      fi
-    fi
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether POSIX threads API is available" >&5
-$as_echo_n "checking whether POSIX threads API is available... " >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_pthread_api" >&5
-$as_echo "$gl_pthread_api" >&6; }
-
-
-    gl_threadlib_body_done=done
-  fi
-
-      LIBTHREAD=$LIBPTHREAD LTLIBTHREAD=$LIBPTHREAD
-      LIBMULTITHREAD=$LIBPMULTITHREAD LTLIBMULTITHREAD=$LIBPMULTITHREAD
-      if test $gl_pthread_api = yes; then
-        if test "$gl_use_threads" = isoc+posix && test "$gl_have_isoc_threads" = yes; then
-          gl_threads_api='isoc+posix'
-
-$as_echo "#define USE_ISOC_AND_POSIX_THREADS 1" >>confdefs.h
-
-          LIBTHREAD= LTLIBTHREAD=
-        else
-          gl_threads_api=posix
-
-$as_echo "#define USE_POSIX_THREADS 1" >>confdefs.h
-
-          if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
-            if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
-
-$as_echo "#define USE_POSIX_THREADS_WEAK 1" >>confdefs.h
-
-              LIBTHREAD= LTLIBTHREAD=
-            fi
-          fi
-        fi
-      fi
-    fi
-    if test $gl_threads_api = none; then
-      if test "$gl_use_threads" = isoc && test "$gl_have_isoc_threads" = yes; then
-        gl_threads_api=isoc
-
-$as_echo "#define USE_ISOC_THREADS 1" >>confdefs.h
-
-      fi
-    fi
-    if test $gl_threads_api = none; then
-      case "$gl_use_threads" in
-        yes | windows | win32) # The 'win32' is for backward compatibility.
-          if { case "$host_os" in
-                 mingw*) true;;
-                 *) false;;
-               esac
-             }; then
-            gl_threads_api=windows
-
-$as_echo "#define USE_WINDOWS_THREADS 1" >>confdefs.h
-
-          fi
-          ;;
-      esac
-    fi
-  fi
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for multithread API to use" >&5
-$as_echo_n "checking for multithread API to use... " >&6; }
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_threads_api" >&5
-$as_echo "$gl_threads_api" >&6; }
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if ${ac_cv_path_SED+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
-     for ac_i in 1 2 3 4 5 6 7; do
-       ac_script="$ac_script$as_nl$ac_script"
-     done
-     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
-     { ac_script=; unset ac_script;}
-     if test -z "$SED"; then
-  ac_path_SED_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      as_fn_executable_p "$ac_path_SED" || continue
-# Check for GNU ac_path_SED and select it if it is found.
-  # Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
-*GNU*)
-  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo '' >> "conftest.nl"
-    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_SED_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_SED="$ac_path_SED"
-      ac_path_SED_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_SED_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_SED"; then
-    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
-  fi
-else
-  ac_cv_path_SED=$SED
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
- SED="$ac_cv_path_SED"
-  rm -f conftest.sed
-
-
-
-
-
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mbstate_t" >&5
-$as_echo_n "checking for mbstate_t... " >&6; }
-if ${ac_cv_type_mbstate_t+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-int
-main ()
-{
-mbstate_t x; return sizeof x;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_type_mbstate_t=yes
-else
-  ac_cv_type_mbstate_t=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_mbstate_t" >&5
-$as_echo "$ac_cv_type_mbstate_t" >&6; }
-   if test $ac_cv_type_mbstate_t = yes; then
-
-$as_echo "#define HAVE_MBSTATE_T 1" >>confdefs.h
-
-   else
-
-$as_echo "#define mbstate_t int" >>confdefs.h
-
-   fi
-
-
-  GNULIB_BTOWC=0;
-  GNULIB_WCTOB=0;
-  GNULIB_MBSINIT=0;
-  GNULIB_MBRTOWC=0;
-  GNULIB_MBRLEN=0;
-  GNULIB_MBSRTOWCS=0;
-  GNULIB_MBSNRTOWCS=0;
-  GNULIB_WCRTOMB=0;
-  GNULIB_WCSRTOMBS=0;
-  GNULIB_WCSNRTOMBS=0;
-  GNULIB_WCWIDTH=0;
-  GNULIB_WMEMCHR=0;
-  GNULIB_WMEMCMP=0;
-  GNULIB_WMEMCPY=0;
-  GNULIB_WMEMMOVE=0;
-  GNULIB_WMEMSET=0;
-  GNULIB_WCSLEN=0;
-  GNULIB_WCSNLEN=0;
-  GNULIB_WCSCPY=0;
-  GNULIB_WCPCPY=0;
-  GNULIB_WCSNCPY=0;
-  GNULIB_WCPNCPY=0;
-  GNULIB_WCSCAT=0;
-  GNULIB_WCSNCAT=0;
-  GNULIB_WCSCMP=0;
-  GNULIB_WCSNCMP=0;
-  GNULIB_WCSCASECMP=0;
-  GNULIB_WCSNCASECMP=0;
-  GNULIB_WCSCOLL=0;
-  GNULIB_WCSXFRM=0;
-  GNULIB_WCSDUP=0;
-  GNULIB_WCSCHR=0;
-  GNULIB_WCSRCHR=0;
-  GNULIB_WCSCSPN=0;
-  GNULIB_WCSSPN=0;
-  GNULIB_WCSPBRK=0;
-  GNULIB_WCSSTR=0;
-  GNULIB_WCSTOK=0;
-  GNULIB_WCSWIDTH=0;
-  GNULIB_WCSFTIME=0;
-    HAVE_BTOWC=1;
-  HAVE_MBSINIT=1;
-  HAVE_MBRTOWC=1;
-  HAVE_MBRLEN=1;
-  HAVE_MBSRTOWCS=1;
-  HAVE_MBSNRTOWCS=1;
-  HAVE_WCRTOMB=1;
-  HAVE_WCSRTOMBS=1;
-  HAVE_WCSNRTOMBS=1;
-  HAVE_WMEMCHR=1;
-  HAVE_WMEMCMP=1;
-  HAVE_WMEMCPY=1;
-  HAVE_WMEMMOVE=1;
-  HAVE_WMEMSET=1;
-  HAVE_WCSLEN=1;
-  HAVE_WCSNLEN=1;
-  HAVE_WCSCPY=1;
-  HAVE_WCPCPY=1;
-  HAVE_WCSNCPY=1;
-  HAVE_WCPNCPY=1;
-  HAVE_WCSCAT=1;
-  HAVE_WCSNCAT=1;
-  HAVE_WCSCMP=1;
-  HAVE_WCSNCMP=1;
-  HAVE_WCSCASECMP=1;
-  HAVE_WCSNCASECMP=1;
-  HAVE_WCSCOLL=1;
-  HAVE_WCSXFRM=1;
-  HAVE_WCSDUP=1;
-  HAVE_WCSCHR=1;
-  HAVE_WCSRCHR=1;
-  HAVE_WCSCSPN=1;
-  HAVE_WCSSPN=1;
-  HAVE_WCSPBRK=1;
-  HAVE_WCSSTR=1;
-  HAVE_WCSTOK=1;
-  HAVE_WCSWIDTH=1;
-  HAVE_WCSFTIME=1;
-  HAVE_DECL_WCTOB=1;
-  HAVE_DECL_WCWIDTH=1;
-  REPLACE_MBSTATE_T=0;
-  REPLACE_BTOWC=0;
-  REPLACE_WCTOB=0;
-  REPLACE_MBSINIT=0;
-  REPLACE_MBRTOWC=0;
-  REPLACE_MBRLEN=0;
-  REPLACE_MBSRTOWCS=0;
-  REPLACE_MBSNRTOWCS=0;
-  REPLACE_WCRTOMB=0;
-  REPLACE_WCSRTOMBS=0;
-  REPLACE_WCSNRTOMBS=0;
-  REPLACE_WCWIDTH=0;
-  REPLACE_WCSWIDTH=0;
-  REPLACE_WCSFTIME=0;
-  REPLACE_WCSTOK=0;
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a traditional japanese locale" >&5
-$as_echo_n "checking for a traditional japanese locale... " >&6; }
-if ${gt_cv_locale_ja+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <locale.h>
-#include <time.h>
-#if HAVE_LANGINFO_CODESET
-# include <langinfo.h>
-#endif
-#include <stdlib.h>
-#include <string.h>
-struct tm t;
-char buf[16];
-int main ()
-{
-  /* On BeOS and Haiku, locales are not implemented in libc.  Rather, libintl
-     imitates locale dependent behaviour by looking at the environment
-     variables, and all locales use the UTF-8 encoding.  */
-#if defined __BEOS__ || defined __HAIKU__
-  return 1;
-#else
-  /* Check whether the given locale name is recognized by the system.  */
-# if defined _WIN32 && !defined __CYGWIN__
-  /* On native Windows, setlocale(category, "") looks at the system settings,
-     not at the environment variables.  Also, when an encoding suffix such
-     as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
-     category of the locale to "C".  */
-  if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
-      || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
-    return 1;
-# else
-  if (setlocale (LC_ALL, "") == NULL) return 1;
-# endif
-  /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
-     On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
-     is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
-     On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
-     succeeds but then nl_langinfo(CODESET) is "646". In this situation,
-     some unit tests fail.
-     On MirBSD 10, when an unsupported locale is specified, setlocale()
-     succeeds but then nl_langinfo(CODESET) is "UTF-8".  */
-# if HAVE_LANGINFO_CODESET
-  {
-    const char *cs = nl_langinfo (CODESET);
-    if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0
-        || strcmp (cs, "UTF-8") == 0)
-      return 1;
-  }
-# endif
-# ifdef __CYGWIN__
-  /* On Cygwin, avoid locale names without encoding suffix, because the
-     locale_charset() function relies on the encoding suffix.  Note that
-     LC_ALL is set on the command line.  */
-  if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
-# endif
-  /* Check whether MB_CUR_MAX is > 1.  This excludes the dysfunctional locales
-     on Cygwin 1.5.x.  */
-  if (MB_CUR_MAX == 1)
-    return 1;
-  /* Check whether in a month name, no byte in the range 0x80..0x9F occurs.
-     This excludes the UTF-8 encoding (except on MirBSD).  */
-  {
-    const char *p;
-    t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
-    if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1;
-    for (p = buf; *p != '\0'; p++)
-      if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0)
-        return 1;
-  }
-  return 0;
-#endif
-}
-
-_ACEOF
-    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest$ac_exeext; then
-      case "$host_os" in
-        # Handle native Windows specially, because there setlocale() interprets
-        # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
-        # "fr" or "fra" as "French" or "French_France.1252",
-        # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
-        # "ja" as "Japanese" or "Japanese_Japan.932",
-        # and similar.
-        mingw*)
-          # Note that on native Windows, the Japanese locale is
-          # Japanese_Japan.932, and CP932 is very different from EUC-JP, so we
-          # cannot use it here.
-          gt_cv_locale_ja=none
-          ;;
-        *)
-          # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
-          # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
-          # configure script would override the LC_ALL setting. Likewise for
-          # LC_CTYPE, which is also set at the beginning of the configure script.
-          # Test for the AIX locale name.
-          if (LC_ALL=ja_JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
-            gt_cv_locale_ja=ja_JP
-          else
-            # Test for the locale name with explicit encoding suffix.
-            if (LC_ALL=ja_JP.EUC-JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
-              gt_cv_locale_ja=ja_JP.EUC-JP
-            else
-              # Test for the HP-UX, OSF/1, NetBSD locale name.
-              if (LC_ALL=ja_JP.eucJP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
-                gt_cv_locale_ja=ja_JP.eucJP
-              else
-                # Test for the IRIX, FreeBSD locale name.
-                if (LC_ALL=ja_JP.EUC LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
-                  gt_cv_locale_ja=ja_JP.EUC
-                else
-                  # Test for the Solaris 7 locale name.
-                  if (LC_ALL=ja LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
-                    gt_cv_locale_ja=ja
-                  else
-                    # Special test for NetBSD 1.6.
-                    if test -f /usr/share/locale/ja_JP.eucJP/LC_CTYPE; then
-                      gt_cv_locale_ja=ja_JP.eucJP
-                    else
-                      # None found.
-                      gt_cv_locale_ja=none
-                    fi
-                  fi
-                fi
-              fi
-            fi
-          fi
-          ;;
-      esac
-    fi
-    rm -fr conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_ja" >&5
-$as_echo "$gt_cv_locale_ja" >&6; }
-  LOCALE_JA=$gt_cv_locale_ja
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a french Unicode locale" >&5
-$as_echo_n "checking for a french Unicode locale... " >&6; }
-if ${gt_cv_locale_fr_utf8+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <locale.h>
-#include <time.h>
-#if HAVE_LANGINFO_CODESET
-# include <langinfo.h>
-#endif
-#include <stdlib.h>
-#include <string.h>
-struct tm t;
-char buf[16];
-int main () {
-  /* On BeOS and Haiku, locales are not implemented in libc.  Rather, libintl
-     imitates locale dependent behaviour by looking at the environment
-     variables, and all locales use the UTF-8 encoding.  */
-#if !(defined __BEOS__ || defined __HAIKU__)
-  /* Check whether the given locale name is recognized by the system.  */
-# if defined _WIN32 && !defined __CYGWIN__
-  /* On native Windows, setlocale(category, "") looks at the system settings,
-     not at the environment variables.  Also, when an encoding suffix such
-     as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
-     category of the locale to "C".  */
-  if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
-      || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
-    return 1;
-# else
-  if (setlocale (LC_ALL, "") == NULL) return 1;
-# endif
-  /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
-     On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
-     is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
-     On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
-     succeeds but then nl_langinfo(CODESET) is "646". In this situation,
-     some unit tests fail.  */
-# if HAVE_LANGINFO_CODESET
-  {
-    const char *cs = nl_langinfo (CODESET);
-    if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0)
-      return 1;
-  }
-# endif
-# ifdef __CYGWIN__
-  /* On Cygwin, avoid locale names without encoding suffix, because the
-     locale_charset() function relies on the encoding suffix.  Note that
-     LC_ALL is set on the command line.  */
-  if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
-# endif
-  /* Check whether in the abbreviation of the second month, the second
-     character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is
-     two bytes long, with UTF-8 encoding.  */
-  t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
-  if (strftime (buf, sizeof (buf), "%b", &t) < 4
-      || buf[1] != (char) 0xc3 || buf[2] != (char) 0xa9 || buf[3] != 'v')
-    return 1;
-#endif
-#if !defined __BIONIC__ /* Bionic libc's 'struct lconv' is just a dummy.  */
-  /* Check whether the decimal separator is a comma.
-     On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point
-     are nl_langinfo(RADIXCHAR) are both ".".  */
-  if (localeconv () ->decimal_point[0] != ',') return 1;
-#endif
-  return 0;
-}
-
-_ACEOF
-    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest$ac_exeext; then
-      case "$host_os" in
-        # Handle native Windows specially, because there setlocale() interprets
-        # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
-        # "fr" or "fra" as "French" or "French_France.1252",
-        # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
-        # "ja" as "Japanese" or "Japanese_Japan.932",
-        # and similar.
-        mingw*)
-          # Test for the hypothetical native Windows locale name.
-          if (LC_ALL=French_France.65001 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
-            gt_cv_locale_fr_utf8=French_France.65001
-          else
-            # None found.
-            gt_cv_locale_fr_utf8=none
-          fi
-          ;;
-        *)
-          # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
-          # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
-          # configure script would override the LC_ALL setting. Likewise for
-          # LC_CTYPE, which is also set at the beginning of the configure script.
-          # Test for the usual locale name.
-          if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
-            gt_cv_locale_fr_utf8=fr_FR
-          else
-            # Test for the locale name with explicit encoding suffix.
-            if (LC_ALL=fr_FR.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
-              gt_cv_locale_fr_utf8=fr_FR.UTF-8
-            else
-              # Test for the Solaris 7 locale name.
-              if (LC_ALL=fr.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
-                gt_cv_locale_fr_utf8=fr.UTF-8
-              else
-                # None found.
-                gt_cv_locale_fr_utf8=none
-              fi
-            fi
-          fi
-          ;;
-      esac
-    fi
-    rm -fr conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_fr_utf8" >&5
-$as_echo "$gt_cv_locale_fr_utf8" >&6; }
-  LOCALE_FR_UTF8=$gt_cv_locale_fr_utf8
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a transitional chinese locale" >&5
-$as_echo_n "checking for a transitional chinese locale... " >&6; }
-if ${gt_cv_locale_zh_CN+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <locale.h>
-#include <stdlib.h>
-#include <time.h>
-#if HAVE_LANGINFO_CODESET
-# include <langinfo.h>
-#endif
-#include <stdlib.h>
-#include <string.h>
-struct tm t;
-char buf[16];
-int main ()
-{
-  /* On BeOS and Haiku, locales are not implemented in libc.  Rather, libintl
-     imitates locale dependent behaviour by looking at the environment
-     variables, and all locales use the UTF-8 encoding.  */
-#if defined __BEOS__ || defined __HAIKU__
-  return 1;
-#else
-  /* Check whether the given locale name is recognized by the system.  */
-# if defined _WIN32 && !defined __CYGWIN__
-  /* On native Windows, setlocale(category, "") looks at the system settings,
-     not at the environment variables.  Also, when an encoding suffix such
-     as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
-     category of the locale to "C".  */
-  if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
-      || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
-    return 1;
-# else
-  if (setlocale (LC_ALL, "") == NULL) return 1;
-# endif
-  /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
-     On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
-     is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
-     On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
-     succeeds but then nl_langinfo(CODESET) is "646". In this situation,
-     some unit tests fail.
-     On MirBSD 10, when an unsupported locale is specified, setlocale()
-     succeeds but then nl_langinfo(CODESET) is "UTF-8".  */
-# if HAVE_LANGINFO_CODESET
-  {
-    const char *cs = nl_langinfo (CODESET);
-    if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0
-        || strcmp (cs, "UTF-8") == 0)
-      return 1;
-  }
-# endif
-# ifdef __CYGWIN__
-  /* On Cygwin, avoid locale names without encoding suffix, because the
-     locale_charset() function relies on the encoding suffix.  Note that
-     LC_ALL is set on the command line.  */
-  if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
-# endif
-  /* Check whether in a month name, no byte in the range 0x80..0x9F occurs.
-     This excludes the UTF-8 encoding (except on MirBSD).  */
-  {
-    const char *p;
-    t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
-    if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1;
-    for (p = buf; *p != '\0'; p++)
-      if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0)
-        return 1;
-  }
-  /* Check whether a typical GB18030 multibyte sequence is recognized as a
-     single wide character.  This excludes the GB2312 and GBK encodings.  */
-  if (mblen ("\203\062\332\066", 5) != 4)
-    return 1;
-  return 0;
-#endif
-}
-
-_ACEOF
-    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest$ac_exeext; then
-      case "$host_os" in
-        # Handle native Windows specially, because there setlocale() interprets
-        # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
-        # "fr" or "fra" as "French" or "French_France.1252",
-        # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
-        # "ja" as "Japanese" or "Japanese_Japan.932",
-        # and similar.
-        mingw*)
-          # Test for the hypothetical native Windows locale name.
-          if (LC_ALL=Chinese_China.54936 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
-            gt_cv_locale_zh_CN=Chinese_China.54936
-          else
-            # None found.
-            gt_cv_locale_zh_CN=none
-          fi
-          ;;
-        solaris2.8)
-          # On Solaris 8, the locales zh_CN.GB18030, zh_CN.GBK, zh.GBK are
-          # broken. One witness is the test case in gl_MBRTOWC_SANITYCHECK.
-          # Another witness is that "LC_ALL=zh_CN.GB18030 bash -c true" dumps core.
-          gt_cv_locale_zh_CN=none
-          ;;
-        *)
-          # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
-          # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
-          # configure script would override the LC_ALL setting. Likewise for
-          # LC_CTYPE, which is also set at the beginning of the configure script.
-          # Test for the locale name without encoding suffix.
-          if (LC_ALL=zh_CN LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
-            gt_cv_locale_zh_CN=zh_CN
-          else
-            # Test for the locale name with explicit encoding suffix.
-            if (LC_ALL=zh_CN.GB18030 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
-              gt_cv_locale_zh_CN=zh_CN.GB18030
-            else
-              # None found.
-              gt_cv_locale_zh_CN=none
-            fi
-          fi
-          ;;
-      esac
-    else
-      # If there was a link error, due to mblen(), the system is so old that
-      # it certainly doesn't have a chinese locale.
-      gt_cv_locale_zh_CN=none
-    fi
-    rm -fr conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_zh_CN" >&5
-$as_echo "$gt_cv_locale_zh_CN" >&6; }
-  LOCALE_ZH_CN=$gt_cv_locale_zh_CN
-
-
-
-
-
-
-
-
-
-  GNULIB_EXPLICIT_BZERO=0;
-  GNULIB_FFSL=0;
-  GNULIB_FFSLL=0;
-  GNULIB_MEMCHR=0;
-  GNULIB_MEMMEM=0;
-  GNULIB_MEMPCPY=0;
-  GNULIB_MEMRCHR=0;
-  GNULIB_RAWMEMCHR=0;
-  GNULIB_STPCPY=0;
-  GNULIB_STPNCPY=0;
-  GNULIB_STRCHRNUL=0;
-  GNULIB_STRDUP=0;
-  GNULIB_STRNCAT=0;
-  GNULIB_STRNDUP=0;
-  GNULIB_STRNLEN=0;
-  GNULIB_STRPBRK=0;
-  GNULIB_STRSEP=0;
-  GNULIB_STRSTR=0;
-  GNULIB_STRCASESTR=0;
-  GNULIB_STRTOK_R=0;
-  GNULIB_MBSLEN=0;
-  GNULIB_MBSNLEN=0;
-  GNULIB_MBSCHR=0;
-  GNULIB_MBSRCHR=0;
-  GNULIB_MBSSTR=0;
-  GNULIB_MBSCASECMP=0;
-  GNULIB_MBSNCASECMP=0;
-  GNULIB_MBSPCASECMP=0;
-  GNULIB_MBSCASESTR=0;
-  GNULIB_MBSCSPN=0;
-  GNULIB_MBSPBRK=0;
-  GNULIB_MBSSPN=0;
-  GNULIB_MBSSEP=0;
-  GNULIB_MBSTOK_R=0;
-  GNULIB_STRERROR=0;
-  GNULIB_STRERROR_R=0;
-  GNULIB_STRSIGNAL=0;
-  GNULIB_STRVERSCMP=0;
-  HAVE_MBSLEN=0;
-    HAVE_EXPLICIT_BZERO=1;
-  HAVE_FFSL=1;
-  HAVE_FFSLL=1;
-  HAVE_MEMCHR=1;
-  HAVE_DECL_MEMMEM=1;
-  HAVE_MEMPCPY=1;
-  HAVE_DECL_MEMRCHR=1;
-  HAVE_RAWMEMCHR=1;
-  HAVE_STPCPY=1;
-  HAVE_STPNCPY=1;
-  HAVE_STRCHRNUL=1;
-  HAVE_DECL_STRDUP=1;
-  HAVE_DECL_STRNDUP=1;
-  HAVE_DECL_STRNLEN=1;
-  HAVE_STRPBRK=1;
-  HAVE_STRSEP=1;
-  HAVE_STRCASESTR=1;
-  HAVE_DECL_STRTOK_R=1;
-  HAVE_DECL_STRERROR_R=1;
-  HAVE_DECL_STRSIGNAL=1;
-  HAVE_STRVERSCMP=1;
-  REPLACE_MEMCHR=0;
-  REPLACE_MEMMEM=0;
-  REPLACE_STPNCPY=0;
-  REPLACE_STRCHRNUL=0;
-  REPLACE_STRDUP=0;
-  REPLACE_STRNCAT=0;
-  REPLACE_STRNDUP=0;
-  REPLACE_STRNLEN=0;
-  REPLACE_STRSTR=0;
-  REPLACE_STRCASESTR=0;
-  REPLACE_STRTOK_R=0;
-  REPLACE_STRERROR=0;
-  REPLACE_STRERROR_R=0;
-  REPLACE_STRSIGNAL=0;
-  UNDEFINE_STRTOK_R=0;
-
-
-
-
-
-
-  # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it
-  # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is
-  # irrelevant for anonymous mappings.
-  ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap"
-if test "x$ac_cv_func_mmap" = xyes; then :
-  gl_have_mmap=yes
-else
-  gl_have_mmap=no
-fi
-
-
-  # Try to allow MAP_ANONYMOUS.
-  gl_have_mmap_anonymous=no
-  if test $gl_have_mmap = yes; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAP_ANONYMOUS" >&5
-$as_echo_n "checking for MAP_ANONYMOUS... " >&6; }
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <sys/mman.h>
-#ifdef MAP_ANONYMOUS
-    I cannot identify this map
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "I cannot identify this map" >/dev/null 2>&1; then :
-  gl_have_mmap_anonymous=yes
-fi
-rm -f conftest*
-
-    if test $gl_have_mmap_anonymous != yes; then
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <sys/mman.h>
-#ifdef MAP_ANON
-    I cannot identify this map
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "I cannot identify this map" >/dev/null 2>&1; then :
-
-$as_echo "#define MAP_ANONYMOUS MAP_ANON" >>confdefs.h
-
-         gl_have_mmap_anonymous=yes
-fi
-rm -f conftest*
-
-    fi
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_have_mmap_anonymous" >&5
-$as_echo "$gl_have_mmap_anonymous" >&6; }
-    if test $gl_have_mmap_anonymous = yes; then
-
-$as_echo "#define HAVE_MAP_ANONYMOUS 1" >>confdefs.h
-
-    fi
-  fi
-
-
-
-
-
-
-  if test $HAVE_MEMCHR = 1; then
-    # Detect platform-specific bugs in some versions of glibc:
-    # memchr should not dereference anything with length 0
-    #   https://bugzilla.redhat.com/show_bug.cgi?id=499689
-    # memchr should not dereference overestimated length after a match
-    #   https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737
-    #   https://sourceware.org/bugzilla/show_bug.cgi?id=10162
-    # memchr should cast the second argument to 'unsigned char'.
-    #   This bug exists in Android 4.3.
-    # Assume that memchr works on platforms that lack mprotect.
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether memchr works" >&5
-$as_echo_n "checking whether memchr works... " >&6; }
-if ${gl_cv_func_memchr_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                             # Guess no on Android.
-            linux*-android*) gl_cv_func_memchr_works="guessing no" ;;
-                             # Guess yes on native Windows.
-            mingw*)          gl_cv_func_memchr_works="guessing yes" ;;
-                             # If we don't know, obey --enable-cross-guesses.
-            *)               gl_cv_func_memchr_works="$gl_cross_guess_normal" ;;
-          esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <string.h>
-#if HAVE_SYS_MMAN_H
-# include <fcntl.h>
-# include <unistd.h>
-# include <sys/types.h>
-# include <sys/mman.h>
-# ifndef MAP_FILE
-#  define MAP_FILE 0
-# endif
-#endif
-
-int
-main ()
-{
-
-  int result = 0;
-  char *fence = NULL;
-#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
-# if HAVE_MAP_ANONYMOUS
-  const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
-  const int fd = -1;
-# else /* !HAVE_MAP_ANONYMOUS */
-  const int flags = MAP_FILE | MAP_PRIVATE;
-  int fd = open ("/dev/zero", O_RDONLY, 0666);
-  if (fd >= 0)
-# endif
-    {
-      int pagesize = getpagesize ();
-      char *two_pages =
-        (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
-                       flags, fd, 0);
-      if (two_pages != (char *)(-1)
-          && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
-        fence = two_pages + pagesize;
-    }
-#endif
-  if (fence)
-    {
-      if (memchr (fence, 0, 0))
-        result |= 1;
-      strcpy (fence - 9, "12345678");
-      if (memchr (fence - 9, 0, 79) != fence - 1)
-        result |= 2;
-      if (memchr (fence - 1, 0, 3) != fence - 1)
-        result |= 4;
-    }
-  /* Test against bug on Android 4.3.  */
-  {
-    char input[3];
-    input[0] = 'a';
-    input[1] = 'b';
-    input[2] = 'c';
-    if (memchr (input, 0x789abc00 | 'b', 3) != input + 1)
-      result |= 8;
-  }
-  return result;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_memchr_works=yes
-else
-  gl_cv_func_memchr_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_memchr_works" >&5
-$as_echo "$gl_cv_func_memchr_works" >&6; }
-    case "$gl_cv_func_memchr_works" in
-      *yes) ;;
-      *) REPLACE_MEMCHR=1 ;;
-    esac
-  fi
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether <limits.h> defines MIN and MAX" >&5
-$as_echo_n "checking whether <limits.h> defines MIN and MAX... " >&6; }
-if ${gl_cv_minmax_in_limits_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
-            int x = MIN (42, 17);
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_minmax_in_limits_h=yes
-else
-  gl_cv_minmax_in_limits_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_minmax_in_limits_h" >&5
-$as_echo "$gl_cv_minmax_in_limits_h" >&6; }
-  if test $gl_cv_minmax_in_limits_h = yes; then
-
-$as_echo "#define HAVE_MINMAX_IN_LIMITS_H 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether <sys/param.h> defines MIN and MAX" >&5
-$as_echo_n "checking whether <sys/param.h> defines MIN and MAX... " >&6; }
-if ${gl_cv_minmax_in_sys_param_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/param.h>
-            int x = MIN (42, 17);
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_minmax_in_sys_param_h=yes
-else
-  gl_cv_minmax_in_sys_param_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_minmax_in_sys_param_h" >&5
-$as_echo "$gl_cv_minmax_in_sys_param_h" >&6; }
-  if test $gl_cv_minmax_in_sys_param_h = yes; then
-
-$as_echo "#define HAVE_MINMAX_IN_SYS_PARAM_H 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-
-
-
-
-ac_fn_c_check_decl "$LINENO" "obstack_printf" "ac_cv_have_decl_obstack_printf" "$ac_includes_default"
-if test "x$ac_cv_have_decl_obstack_printf" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_OBSTACK_PRINTF $ac_have_decl
-_ACEOF
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for O_CLOEXEC" >&5
-$as_echo_n "checking for O_CLOEXEC... " >&6; }
-if ${gl_cv_macro_O_CLOEXEC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <fcntl.h>
-                          #ifndef O_CLOEXEC
-                            choke me;
-                          #endif
-
-int
-main ()
-{
-return O_CLOEXEC;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_macro_O_CLOEXEC=yes
-else
-  gl_cv_macro_O_CLOEXEC=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_macro_O_CLOEXEC" >&5
-$as_echo "$gl_cv_macro_O_CLOEXEC" >&6; }
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for promoted mode_t type" >&5
-$as_echo_n "checking for promoted mode_t type... " >&6; }
-if ${gl_cv_promoted_mode_t+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-                cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-int
-main ()
-{
-typedef int array[2 * (sizeof (mode_t) < sizeof (int)) - 1];
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_promoted_mode_t='int'
-else
-  gl_cv_promoted_mode_t='mode_t'
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_promoted_mode_t" >&5
-$as_echo "$gl_cv_promoted_mode_t" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define PROMOTED_MODE_T $gl_cv_promoted_mode_t
-_ACEOF
-
-
-
-     REPLACE_STRERROR_0=0
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror(0) succeeds" >&5
-$as_echo_n "checking whether strerror(0) succeeds... " >&6; }
-if ${gl_cv_func_strerror_0_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                        # Guess yes on glibc systems.
-         *-gnu* | gnu*) gl_cv_func_strerror_0_works="guessing yes" ;;
-                        # Guess yes on musl systems.
-         *-musl*)       gl_cv_func_strerror_0_works="guessing yes" ;;
-                        # Guess yes on native Windows.
-         mingw*)        gl_cv_func_strerror_0_works="guessing yes" ;;
-                        # If we don't know, obey --enable-cross-guesses.
-         *)             gl_cv_func_strerror_0_works="$gl_cross_guess_normal" ;;
-       esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-           #include <errno.h>
-
-int
-main ()
-{
-int result = 0;
-           char *str;
-           errno = 0;
-           str = strerror (0);
-           if (!*str) result |= 1;
-           if (errno) result |= 2;
-           if (strstr (str, "nknown") || strstr (str, "ndefined"))
-             result |= 4;
-           return result;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_strerror_0_works=yes
-else
-  gl_cv_func_strerror_0_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_0_works" >&5
-$as_echo "$gl_cv_func_strerror_0_works" >&6; }
-  case "$gl_cv_func_strerror_0_works" in
-    *yes) ;;
-    *)
-      REPLACE_STRERROR_0=1
-
-$as_echo "#define REPLACE_STRERROR_0 1" >>confdefs.h
-
+      case "$gl_libtextstyle_minversion" in
+    *" 0.20.5 "*)
+      snippet='styled_ostream_t s = term_styled_ostream_create(1,"",TTYCTL_AUTO,"");
+               ostream_printf(s,"%d",42);'
+      ;;
+    *" 0.20 "*)
+      snippet='term_styled_ostream_create(1,"",TTYCTL_AUTO,"");'
       ;;
   esac
 
@@ -21904,7141 +9650,6 @@
 
 
 
-  if test $ac_cv_func_strerror_r = yes; then
-    if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
-                        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strerror_r with POSIX signature" >&5
-$as_echo_n "checking for strerror_r with POSIX signature... " >&6; }
-if ${gl_cv_func_strerror_r_posix_signature+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-                int strerror_r (int, char *, size_t);
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_func_strerror_r_posix_signature=yes
-else
-  gl_cv_func_strerror_r_posix_signature=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_r_posix_signature" >&5
-$as_echo "$gl_cv_func_strerror_r_posix_signature" >&6; }
-      if test $gl_cv_func_strerror_r_posix_signature = yes; then
-                                                        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror_r works" >&5
-$as_echo_n "checking whether strerror_r works... " >&6; }
-if ${gl_cv_func_strerror_r_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-
-              case "$host_os" in
-                       # Guess no on AIX.
-                aix*)  gl_cv_func_strerror_r_works="guessing no";;
-                       # Guess no on HP-UX.
-                hpux*) gl_cv_func_strerror_r_works="guessing no";;
-                       # Guess no on BSD variants.
-                *bsd*)  gl_cv_func_strerror_r_works="guessing no";;
-                       # Guess yes otherwise.
-                *)     gl_cv_func_strerror_r_works="guessing yes";;
-              esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <errno.h>
-                  #include <string.h>
-
-int
-main ()
-{
-int result = 0;
-                  char buf[79];
-                  if (strerror_r (EACCES, buf, 0) < 0)
-                    result |= 1;
-                  errno = 0;
-                  if (strerror_r (EACCES, buf, sizeof buf) != 0)
-                    result |= 2;
-                  strcpy (buf, "Unknown");
-                  if (strerror_r (0, buf, sizeof buf) != 0)
-                    result |= 4;
-                  if (errno)
-                    result |= 8;
-                  if (strstr (buf, "nknown") || strstr (buf, "ndefined"))
-                    result |= 0x10;
-                  errno = 0;
-                  *buf = 0;
-                  if (strerror_r (-3, buf, sizeof buf) < 0)
-                    result |= 0x20;
-                  if (errno)
-                    result |= 0x40;
-                  if (!*buf)
-                    result |= 0x80;
-                  return result;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_strerror_r_works=yes
-else
-  gl_cv_func_strerror_r_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_r_works" >&5
-$as_echo "$gl_cv_func_strerror_r_works" >&6; }
-      else
-
-                        if test $ac_cv_func___xpg_strerror_r = yes; then
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __xpg_strerror_r works" >&5
-$as_echo_n "checking whether __xpg_strerror_r works... " >&6; }
-if ${gl_cv_func_strerror_r_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-                                  gl_cv_func_strerror_r_works="$gl_cross_guess_normal"
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <errno.h>
-                    #include <string.h>
-                    extern
-                    #ifdef __cplusplus
-                    "C"
-                    #endif
-                    int __xpg_strerror_r(int, char *, size_t);
-
-int
-main ()
-{
-int result = 0;
-                    char buf[256] = "^";
-                    char copy[256];
-                    char *str = strerror (-1);
-                    strcpy (copy, str);
-                    if (__xpg_strerror_r (-2, buf, 1) == 0)
-                      result |= 1;
-                    if (*buf)
-                      result |= 2;
-                    __xpg_strerror_r (-2, buf, 256);
-                    if (strcmp (str, copy))
-                      result |= 4;
-                    return result;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_strerror_r_works=yes
-else
-  gl_cv_func_strerror_r_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_r_works" >&5
-$as_echo "$gl_cv_func_strerror_r_works" >&6; }
-        fi
-      fi
-    fi
-  fi
-
-ac_fn_c_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default"
-if test "x$ac_cv_have_decl_strerror_r" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRERROR_R $ac_have_decl
-_ACEOF
-
-
-
-
-
-
-
-
-  if test $ac_cv_have_decl_strerror_r = no; then
-    HAVE_DECL_STRERROR_R=0
-  fi
-
-  if test $ac_cv_func_strerror_r = yes; then
-    if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
-      if test $gl_cv_func_strerror_r_posix_signature = yes; then
-        case "$gl_cv_func_strerror_r_works" in
-                    *no) REPLACE_STRERROR_R=1 ;;
-        esac
-      else
-                REPLACE_STRERROR_R=1
-      fi
-    else
-                  REPLACE_STRERROR_R=1
-    fi
-  fi
-
-
-
-
-  GNULIB_POSIX_SPAWN=0;
-  GNULIB_POSIX_SPAWNP=0;
-  GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT=0;
-  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=0;
-  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=0;
-  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=0;
-  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR=0;
-  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=0;
-  GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY=0;
-  GNULIB_POSIX_SPAWNATTR_INIT=0;
-  GNULIB_POSIX_SPAWNATTR_GETFLAGS=0;
-  GNULIB_POSIX_SPAWNATTR_SETFLAGS=0;
-  GNULIB_POSIX_SPAWNATTR_GETPGROUP=0;
-  GNULIB_POSIX_SPAWNATTR_SETPGROUP=0;
-  GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM=0;
-  GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM=0;
-  GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY=0;
-  GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY=0;
-  GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT=0;
-  GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT=0;
-  GNULIB_POSIX_SPAWNATTR_GETSIGMASK=0;
-  GNULIB_POSIX_SPAWNATTR_SETSIGMASK=0;
-  GNULIB_POSIX_SPAWNATTR_DESTROY=0;
-    HAVE_POSIX_SPAWN=1;
-  HAVE_POSIX_SPAWNATTR_T=1;
-  HAVE_POSIX_SPAWN_FILE_ACTIONS_T=1;
-
-  HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=1;
-
-  HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR=1;
-
-  REPLACE_POSIX_SPAWN=0;
-  REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=0;
-
-  REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=0;
-
-  REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=0;
-
-  REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR=0;
-
-  REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=0;
-
-
-
-
-
-  LIB_POSIX_SPAWN=
-
-  gl_saved_libs=$LIBS
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing posix_spawn" >&5
-$as_echo_n "checking for library containing posix_spawn... " >&6; }
-if ${ac_cv_search_posix_spawn+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_func_search_save_LIBS=$LIBS
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char posix_spawn ();
-int
-main ()
-{
-return posix_spawn ();
-  ;
-  return 0;
-}
-_ACEOF
-for ac_lib in '' rt; do
-  if test -z "$ac_lib"; then
-    ac_res="none required"
-  else
-    ac_res=-l$ac_lib
-    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-  fi
-  if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_search_posix_spawn=$ac_res
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext
-  if ${ac_cv_search_posix_spawn+:} false; then :
-  break
-fi
-done
-if ${ac_cv_search_posix_spawn+:} false; then :
-
-else
-  ac_cv_search_posix_spawn=no
-fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_posix_spawn" >&5
-$as_echo "$ac_cv_search_posix_spawn" >&6; }
-ac_res=$ac_cv_search_posix_spawn
-if test "$ac_res" != no; then :
-  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-  test "$ac_cv_search_posix_spawn" = "none required" ||
-                    LIB_POSIX_SPAWN=$ac_cv_search_posix_spawn
-fi
-
-    for ac_func in posix_spawn
-do :
-  ac_fn_c_check_func "$LINENO" "posix_spawn" "ac_cv_func_posix_spawn"
-if test "x$ac_cv_func_posix_spawn" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_POSIX_SPAWN 1
-_ACEOF
-
-fi
-done
-
-  LIBS=$gl_saved_libs
-
-  if test $ac_cv_func_posix_spawn != yes; then
-    HAVE_POSIX_SPAWN=0
-  fi
-
-
-
-
-                                      if test $ac_cv_func_posix_spawn = yes; then
-
-
-    if test $REPLACE_POSIX_SPAWN = 0; then
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn works" >&5
-$as_echo_n "checking whether posix_spawn works... " >&6; }
-if ${gl_cv_func_posix_spawn_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test $cross_compiling = no; then
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <spawn.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-
-extern char **environ;
-
-#ifndef STDIN_FILENO
-# define STDIN_FILENO 0
-#endif
-#ifndef STDOUT_FILENO
-# define STDOUT_FILENO 1
-#endif
-#ifndef STDERR_FILENO
-# define STDERR_FILENO 2
-#endif
-
-#ifndef WTERMSIG
-# define WTERMSIG(x) ((x) & 0x7f)
-#endif
-#ifndef WIFEXITED
-# define WIFEXITED(x) (WTERMSIG (x) == 0)
-#endif
-#ifndef WEXITSTATUS
-# define WEXITSTATUS(x) (((x) >> 8) & 0xff)
-#endif
-
-#define CHILD_PROGRAM_FILENAME "/non/exist/ent"
-
-static int
-fd_safer (int fd)
-{
-  if (0 <= fd && fd <= 2)
-    {
-      int f = fd_safer (dup (fd));
-      int e = errno;
-      close (fd);
-      errno = e;
-      fd = f;
-    }
-
-  return fd;
-}
-
-int
-main ()
-{
-  char *argv[2] = { CHILD_PROGRAM_FILENAME, NULL };
-  int ofd[2];
-  sigset_t blocked_signals;
-  sigset_t fatal_signal_set;
-  posix_spawn_file_actions_t actions;
-  bool actions_allocated;
-  posix_spawnattr_t attrs;
-  bool attrs_allocated;
-  int err;
-  pid_t child;
-  int status;
-  int exitstatus;
-
-  setvbuf (stdout, NULL, _IOFBF, 0);
-  puts ("This should be seen only once.");
-  if (pipe (ofd) < 0 || (ofd[1] = fd_safer (ofd[1])) < 0)
-    {
-      perror ("cannot create pipe");
-      exit (1);
-    }
-  sigprocmask (SIG_SETMASK, NULL, &blocked_signals);
-  sigemptyset (&fatal_signal_set);
-  sigaddset (&fatal_signal_set, SIGINT);
-  sigaddset (&fatal_signal_set, SIGTERM);
-  sigaddset (&fatal_signal_set, SIGHUP);
-  sigaddset (&fatal_signal_set, SIGPIPE);
-  sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL);
-  actions_allocated = false;
-  attrs_allocated = false;
-  if ((err = posix_spawn_file_actions_init (&actions)) != 0
-      || (actions_allocated = true,
-          (err = posix_spawn_file_actions_adddup2 (&actions, ofd[0], STDIN_FILENO)) != 0
-          || (err = posix_spawn_file_actions_addclose (&actions, ofd[0])) != 0
-          || (err = posix_spawn_file_actions_addclose (&actions, ofd[1])) != 0
-          || (err = posix_spawnattr_init (&attrs)) != 0
-          || (attrs_allocated = true,
-              (err = posix_spawnattr_setsigmask (&attrs, &blocked_signals)) != 0
-              || (err = posix_spawnattr_setflags (&attrs, POSIX_SPAWN_SETSIGMASK)) != 0)
-          || (err = posix_spawnp (&child, CHILD_PROGRAM_FILENAME, &actions, &attrs, argv, environ)) != 0))
-    {
-      if (actions_allocated)
-        posix_spawn_file_actions_destroy (&actions);
-      if (attrs_allocated)
-        posix_spawnattr_destroy (&attrs);
-      sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
-      if (err == ENOENT)
-        return 0;
-      else
-        {
-          errno = err;
-          perror ("subprocess failed");
-          exit (1);
-        }
-    }
-  posix_spawn_file_actions_destroy (&actions);
-  posix_spawnattr_destroy (&attrs);
-  sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
-  close (ofd[0]);
-  close (ofd[1]);
-  status = 0;
-  while (waitpid (child, &status, 0) != child)
-    ;
-  if (!WIFEXITED (status))
-    {
-      fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status);
-      exit (1);
-    }
-  exitstatus = WEXITSTATUS (status);
-  if (exitstatus != 127)
-    {
-      fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus);
-      exit (1);
-    }
-  return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  if test -s conftest$ac_exeext \
-             && ./conftest$ac_exeext > conftest.out \
-             && echo 'This should be seen only once.' > conftest.ok \
-             && cmp conftest.out conftest.ok >/dev/null 2>&1; then
-            gl_cv_func_posix_spawn_works=yes
-          else
-            gl_cv_func_posix_spawn_works=no
-          fi
-else
-  gl_cv_func_posix_spawn_works=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-       if test $gl_cv_func_posix_spawn_works = yes; then
-         if test "$cross_compiling" = yes; then :
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run test program while cross compiling
-See \`config.log' for more details" "$LINENO" 5; }
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Test whether posix_spawn_file_actions_addopen supports filename arguments
-   that contain special characters such as '*'.  */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <spawn.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-
-extern char **environ;
-
-#ifndef STDIN_FILENO
-# define STDIN_FILENO 0
-#endif
-#ifndef STDOUT_FILENO
-# define STDOUT_FILENO 1
-#endif
-#ifndef STDERR_FILENO
-# define STDERR_FILENO 2
-#endif
-
-#ifndef WTERMSIG
-# define WTERMSIG(x) ((x) & 0x7f)
-#endif
-#ifndef WIFEXITED
-# define WIFEXITED(x) (WTERMSIG (x) == 0)
-#endif
-#ifndef WEXITSTATUS
-# define WEXITSTATUS(x) (((x) >> 8) & 0xff)
-#endif
-
-#define CHILD_PROGRAM_FILENAME "conftest"
-#define DATA_FILENAME "conftest%=*#?"
-
-static int
-parent_main (void)
-{
-  FILE *fp;
-  char *argv[3] = { CHILD_PROGRAM_FILENAME, "-child", NULL };
-  posix_spawn_file_actions_t actions;
-  bool actions_allocated;
-  int err;
-  pid_t child;
-  int status;
-  int exitstatus;
-
-  /* Create a data file with specific contents.  */
-  fp = fopen (DATA_FILENAME, "wb");
-  if (fp == NULL)
-    {
-      perror ("cannot create data file");
-      return 1;
-    }
-  fwrite ("Halle Potta", 1, 11, fp);
-  if (fflush (fp) || fclose (fp))
-    {
-      perror ("cannot prepare data file");
-      return 2;
-    }
-
-  /* Avoid reading from our stdin, as it could block.  */
-  freopen ("/dev/null", "rb", stdin);
-
-  /* Test whether posix_spawn_file_actions_addopen with this file name
-     actually works, but spawning a child that reads from this file.  */
-  actions_allocated = false;
-  if ((err = posix_spawn_file_actions_init (&actions)) != 0
-      || (actions_allocated = true,
-          (err = posix_spawn_file_actions_addopen (&actions, STDIN_FILENO, DATA_FILENAME, O_RDONLY, 0600)) != 0
-          || (err = posix_spawn (&child, CHILD_PROGRAM_FILENAME, &actions, NULL, argv, environ)) != 0))
-    {
-      if (actions_allocated)
-        posix_spawn_file_actions_destroy (&actions);
-      errno = err;
-      perror ("subprocess failed");
-      return 3;
-    }
-  posix_spawn_file_actions_destroy (&actions);
-  status = 0;
-  while (waitpid (child, &status, 0) != child)
-    ;
-  if (!WIFEXITED (status))
-    {
-      fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status);
-      return 4;
-    }
-  exitstatus = WEXITSTATUS (status);
-  if (exitstatus != 0)
-    {
-      fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus);
-      return 5;
-    }
-  return 0;
-}
-
-static int
-child_main (void)
-{
-  char buf[1024];
-
-  /* See if reading from STDIN_FILENO yields the expected contents.  */
-  if (fread (buf, 1, sizeof (buf), stdin) == 11
-      && memcmp (buf, "Halle Potta", 11) == 0)
-    return 0;
-  else
-    return 8;
-}
-
-static void
-cleanup_then_die (int sig)
-{
-  /* Clean up data file.  */
-  unlink (DATA_FILENAME);
-
-  /* Re-raise the signal and die from it.  */
-  signal (sig, SIG_DFL);
-  raise (sig);
-}
-
-int
-main (int argc, char *argv[])
-{
-  int exitstatus;
-
-  if (!(argc > 1 && strcmp (argv[1], "-child") == 0))
-    {
-      /* This is the parent process.  */
-      signal (SIGINT, cleanup_then_die);
-      signal (SIGTERM, cleanup_then_die);
-      #ifdef SIGHUP
-      signal (SIGHUP, cleanup_then_die);
-      #endif
-
-      exitstatus = parent_main ();
-    }
-  else
-    {
-      /* This is the child process.  */
-
-      exitstatus = child_main ();
-    }
-  unlink (DATA_FILENAME);
-  return exitstatus;
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  gl_cv_func_posix_spawn_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-       fi
-     else
-       case "$host_os" in
-         aix*) gl_cv_func_posix_spawn_works="guessing no";;
-         *)    gl_cv_func_posix_spawn_works="guessing yes";;
-       esac
-     fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_works" >&5
-$as_echo "$gl_cv_func_posix_spawn_works" >&6; }
-
-      case "$gl_cv_func_posix_spawn_works" in
-        *yes)
-                                                  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether posix_spawnattr_setschedpolicy is supported" >&5
-$as_echo_n "checking whether posix_spawnattr_setschedpolicy is supported... " >&6; }
-if ${gl_cv_func_spawnattr_setschedpolicy+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <spawn.h>
-#if POSIX_SPAWN_SETSCHEDULER
- POSIX scheduling supported
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "POSIX scheduling supported" >/dev/null 2>&1; then :
-  gl_cv_func_spawnattr_setschedpolicy=yes
-else
-  gl_cv_func_spawnattr_setschedpolicy=no
-fi
-rm -f conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_spawnattr_setschedpolicy" >&5
-$as_echo "$gl_cv_func_spawnattr_setschedpolicy" >&6; }
-                                                  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether posix_spawnattr_setschedparam is supported" >&5
-$as_echo_n "checking whether posix_spawnattr_setschedparam is supported... " >&6; }
-if ${gl_cv_func_spawnattr_setschedparam+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <spawn.h>
-#if POSIX_SPAWN_SETSCHEDPARAM
- POSIX scheduling supported
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "POSIX scheduling supported" >/dev/null 2>&1; then :
-  gl_cv_func_spawnattr_setschedparam=yes
-else
-  gl_cv_func_spawnattr_setschedparam=no
-fi
-rm -f conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_spawnattr_setschedparam" >&5
-$as_echo "$gl_cv_func_spawnattr_setschedparam" >&6; }
-          ;;
-        *) REPLACE_POSIX_SPAWN=1 ;;
-      esac
-    fi
-  fi
-  if test $ac_cv_func_posix_spawn != yes || test $REPLACE_POSIX_SPAWN = 1; then
-
-$as_echo "#define REPLACE_POSIX_SPAWN 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_cv_func_vfprintf_posix=no
-  case "$gl_cv_func_printf_sizes_c99" in
-    *yes)
-      case "$gl_cv_func_printf_long_double" in
-        *yes)
-          case "$gl_cv_func_printf_infinite" in
-            *yes)
-              case "$gl_cv_func_printf_infinite_long_double" in
-                *yes)
-                  case "$gl_cv_func_printf_directive_a" in
-                    *yes)
-                      case "$gl_cv_func_printf_directive_f" in
-                        *yes)
-                          case "$gl_cv_func_printf_directive_n" in
-                            *yes)
-                              case "$gl_cv_func_printf_directive_ls" in
-                                *yes)
-                                  case "$gl_cv_func_printf_positions" in
-                                    *yes)
-                                      case "$gl_cv_func_printf_flag_grouping" in
-                                        *yes)
-                                          case "$gl_cv_func_printf_flag_leftadjust" in
-                                            *yes)
-                                              case "$gl_cv_func_printf_flag_zero" in
-                                                *yes)
-                                                  case "$gl_cv_func_printf_precision" in
-                                                    *yes)
-                                                      case "$gl_cv_func_printf_enomem" in
-                                                        *yes)
-                                                          # vfprintf exists and is
-                                                          # already POSIX compliant.
-                                                          gl_cv_func_vfprintf_posix=yes
-                                                          ;;
-                                                      esac
-                                                      ;;
-                                                  esac
-                                                  ;;
-                                              esac
-                                              ;;
-                                          esac
-                                          ;;
-                                      esac
-                                      ;;
-                                  esac
-                                  ;;
-                              esac
-                              ;;
-                          esac
-                          ;;
-                      esac
-                      ;;
-                  esac
-                  ;;
-              esac
-              ;;
-          esac
-          ;;
-      esac
-      ;;
-  esac
-  if test $gl_cv_func_vfprintf_posix = no; then
-
-
-
-  case "$gl_cv_func_printf_infinite" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-  case "$gl_cv_func_printf_long_double" in
-    *yes)
-      case "$gl_cv_func_printf_infinite_long_double" in
-        *yes)
-          ;;
-        *)
-
-$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
-
-          ;;
-      esac
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_a" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
-
-      for ac_func in nl_langinfo
-do :
-  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
-if test "x$ac_cv_func_nl_langinfo" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_NL_LANGINFO 1
-_ACEOF
-
-fi
-done
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_f" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_ls" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_grouping" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_leftadjust" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_zero" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_precision" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_enomem" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
-
-  if test $ac_cv_func_vasnprintf = yes; then
-
-$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-
-
-
-
-
-
-  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
-if test "x$ac_cv_type_ptrdiff_t" = xyes; then :
-
-else
-
-$as_echo "#define ptrdiff_t long" >>confdefs.h
-
-
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS vfprintf.$ac_objext"
-
-  REPLACE_VFPRINTF=1
-
-$as_echo "#define REPLACE_VFPRINTF_POSIX 1" >>confdefs.h
-
-  :
-
-  fi
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef _MSC_VER
-MicrosoftCompiler
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "MicrosoftCompiler" >/dev/null 2>&1; then :
-  gl_asmext='asm'
-     gl_c_asm_opt='-c -Fa'
-
-else
-  gl_asmext='s'
-     gl_c_asm_opt='-S'
-
-fi
-rm -f conftest*
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C symbols are prefixed with underscore at the linker level" >&5
-$as_echo_n "checking whether C symbols are prefixed with underscore at the linker level... " >&6; }
-if ${gl_cv_prog_as_underscore+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat > conftest.c <<EOF
-#ifdef __cplusplus
-extern "C" int foo (void);
-#endif
-int foo(void) { return 0; }
-EOF
-     # Look for the assembly language name in the .s file.
-     { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; } >/dev/null 2>&1
-     if LC_ALL=C $EGREP '(^|[^a-zA-Z0-9_])_foo([^a-zA-Z0-9_]|$)' conftest.$gl_asmext >/dev/null; then
-       gl_cv_prog_as_underscore=yes
-     else
-       gl_cv_prog_as_underscore=no
-     fi
-     rm -f conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_prog_as_underscore" >&5
-$as_echo "$gl_cv_prog_as_underscore" >&6; }
-  if test $gl_cv_prog_as_underscore = yes; then
-    USER_LABEL_PREFIX=_
-  else
-    USER_LABEL_PREFIX=
-  fi
-
-cat >>confdefs.h <<_ACEOF
-#define USER_LABEL_PREFIX $USER_LABEL_PREFIX
-_ACEOF
-
-  ASM_SYMBOL_PREFIX='"'${USER_LABEL_PREFIX}'"'
-
-
-
-  GNULIB_PTHREAD_SIGMASK=0;
-  GNULIB_RAISE=0;
-  GNULIB_SIGNAL_H_SIGPIPE=0;
-  GNULIB_SIGPROCMASK=0;
-  GNULIB_SIGACTION=0;
-    HAVE_POSIX_SIGNALBLOCKING=1;
-  HAVE_PTHREAD_SIGMASK=1;
-  HAVE_RAISE=1;
-  HAVE_SIGSET_T=1;
-  HAVE_SIGINFO_T=1;
-  HAVE_SIGACTION=1;
-  HAVE_STRUCT_SIGACTION_SA_SIGACTION=1;
-
-  HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=1;
-
-  HAVE_SIGHANDLER_T=1;
-  REPLACE_PTHREAD_SIGMASK=0;
-  REPLACE_RAISE=0;
-
-
-  ac_fn_c_check_type "$LINENO" "sigset_t" "ac_cv_type_sigset_t" "
-      #include <signal.h>
-      /* Mingw defines sigset_t not in <signal.h>, but in <sys/types.h>.  */
-      #include <sys/types.h>
-
-"
-if test "x$ac_cv_type_sigset_t" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_SIGSET_T 1
-_ACEOF
-
-gl_cv_type_sigset_t=yes
-else
-  gl_cv_type_sigset_t=no
-fi
-
-  if test $gl_cv_type_sigset_t != yes; then
-    HAVE_SIGSET_T=0
-  fi
-
-
-                              { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library path variable" >&5
-$as_echo_n "checking for shared library path variable... " >&6; }
-if ${acl_cv_libpath+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-    LD="$LD" \
-    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.libpath" "$host" > conftest.sh
-    . ./conftest.sh
-    rm -f ./conftest.sh
-    acl_cv_libpath=${acl_cv_shlibpath_var:-none}
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_libpath" >&5
-$as_echo "$acl_cv_libpath" >&6; }
-  shlibpath_var="$acl_cv_shlibpath_var"
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to activate relocatable installation" >&5
-$as_echo_n "checking whether to activate relocatable installation... " >&6; }
-  # Check whether --enable-relocatable was given.
-if test "${enable_relocatable+set}" = set; then :
-  enableval=$enable_relocatable; if test "$enableval" != no; then
-       RELOCATABLE=yes
-     else
-       RELOCATABLE=no
-     fi
-
-else
-  RELOCATABLE=no
-fi
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RELOCATABLE" >&5
-$as_echo "$RELOCATABLE" >&6; }
-
-
-
-    if test "X$prefix" = "XNONE"; then
-    reloc_final_prefix="$ac_default_prefix"
-  else
-    reloc_final_prefix="$prefix"
-  fi
-
-cat >>confdefs.h <<_ACEOF
-#define INSTALLPREFIX "${reloc_final_prefix}"
-_ACEOF
-
-  if test $RELOCATABLE = yes; then
-
-$as_echo "#define ENABLE_RELOCATABLE 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-
-
-
-  is_noop=no
-  use_elf_origin_trick=no
-  use_macos_tools=no
-  use_wrapper=no
-  if test $RELOCATABLE = yes; then
-    # --enable-relocatable implies --disable-rpath
-    enable_rpath=no
-    for ac_header in mach-o/dyld.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "mach-o/dyld.h" "ac_cv_header_mach_o_dyld_h" "$ac_includes_default"
-if test "x$ac_cv_header_mach_o_dyld_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_MACH_O_DYLD_H 1
-_ACEOF
-
-fi
-
-done
-
-    for ac_func in _NSGetExecutablePath
-do :
-  ac_fn_c_check_func "$LINENO" "_NSGetExecutablePath" "ac_cv_func__NSGetExecutablePath"
-if test "x$ac_cv_func__NSGetExecutablePath" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE__NSGETEXECUTABLEPATH 1
-_ACEOF
-
-fi
-done
-
-    case "$host_os" in
-      mingw*) is_noop=yes ;;
-      # For the platforms that support $ORIGIN, see
-      # <https://lekensteyn.nl/rpath.html>.
-      # glibc systems, Linux with musl libc: yes. Android: no.
-      linux*-android*) ;;
-      linux* | kfreebsd*) use_elf_origin_trick=yes ;;
-      # Hurd: <https://lists.gnu.org/r/bug-hurd/2019-02/msg00049.html>
-      # only after the glibc commit from 2018-01-08
-      # <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=311ba8dc4416467947eff2ab327854f124226309>
-      gnu*)
-        # Test for a glibc version >= 2.27.
-        for ac_func in copy_file_range
-do :
-  ac_fn_c_check_func "$LINENO" "copy_file_range" "ac_cv_func_copy_file_range"
-if test "x$ac_cv_func_copy_file_range" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_COPY_FILE_RANGE 1
-_ACEOF
-
-fi
-done
-
-        if test $ac_cv_func_copy_file_range = yes; then
-          use_elf_origin_trick=yes
-        fi
-        ;;
-      # FreeBSD >= 7.3, DragonFly >= 3.0: yes.
-      freebsd | freebsd[1-7] | freebsd[1-6].* | freebsd7.[0-2]) ;;
-      dragonfly | dragonfly[1-2] | dragonfly[1-2].*) ;;
-      freebsd* | dragonfly*) use_elf_origin_trick=yes ;;
-      # NetBSD >= 8.0: yes.
-      netbsd | netbsd[1-7] | netbsd[1-7].*) ;;
-      netbsdelf | netbsdelf[1-7] | netbsdelf[1-7].*) ;;
-      netbsd*) use_elf_origin_trick=yes ;;
-      # OpenBSD >= 5.4: yes.
-      openbsd | openbsd[1-5] | openbsd[1-4].* | openbsd5.[0-3]) ;;
-      openbsd*) use_elf_origin_trick=yes ;;
-      # Solaris >= 10: yes.
-      solaris | solaris2.[1-9] | solaris2.[1-9].*) ;;
-      solaris*) use_elf_origin_trick=yes ;;
-      # Haiku: yes.
-      haiku*) use_elf_origin_trick=yes ;;
-      # On Mac OS X 10.4 or newer, use Mac OS X tools. See
-      # <https://wincent.com/wiki/@executable_path,_@load_path_and_@rpath>.
-      darwin | darwin[1-7].*) ;;
-      darwin*) use_macos_tools=yes ;;
-    esac
-    if test $is_noop = yes; then
-      RELOCATABLE_LDFLAGS=:
-
-    else
-      if test $use_elf_origin_trick = yes || test $use_macos_tools = yes; then
-                case "$ac_aux_dir" in
-          /*) reloc_ldflags="$ac_aux_dir/reloc-ldflags" ;;
-          *) reloc_ldflags="\$(top_builddir)/$ac_aux_dir/reloc-ldflags" ;;
-        esac
-        RELOCATABLE_LDFLAGS="\"$reloc_ldflags\" \"\$(host)\" \"\$(RELOCATABLE_LIBRARY_PATH)\""
-
-        if test $use_macos_tools = yes; then
-                    case "$ac_aux_dir" in
-            /*) LIBTOOL="${CONFIG_SHELL-$SHELL} $ac_aux_dir/libtool-reloc $LIBTOOL" ;;
-            *) LIBTOOL="${CONFIG_SHELL-$SHELL} \$(top_builddir)/$ac_aux_dir/libtool-reloc $LIBTOOL" ;;
-          esac
-        fi
-      else
-        use_wrapper=yes
-                                        INSTALL_PROGRAM_ENV="RELOC_LIBRARY_PATH_VAR=\"$shlibpath_var\" RELOC_LIBRARY_PATH_VALUE=\"\$(RELOCATABLE_LIBRARY_PATH)\" RELOC_PREFIX=\"\$(prefix)\" RELOC_DESTDIR=\"\$(DESTDIR)\" RELOC_COMPILE_COMMAND=\"\$(CC) \$(CPPFLAGS) \$(CFLAGS) \$(LDFLAGS)\" RELOC_SRCDIR=\"\$(RELOCATABLE_SRC_DIR)\" RELOC_BUILDDIR=\"\$(RELOCATABLE_BUILD_DIR)\" RELOC_CONFIG_H_DIR=\"\$(RELOCATABLE_CONFIG_H_DIR)\" RELOC_EXEEXT=\"\$(EXEEXT)\" RELOC_STRIP_PROG=\"\$(RELOCATABLE_STRIP)\" RELOC_INSTALL_PROG=\"$INSTALL_PROGRAM\""
-
-        case "$ac_aux_dir" in
-          /*) INSTALL_PROGRAM="$ac_aux_dir/install-reloc" ;;
-          *) INSTALL_PROGRAM="\$(top_builddir)/$ac_aux_dir/install-reloc" ;;
-        esac
-      fi
-    fi
-  fi
-   if test $is_noop = yes || test $use_elf_origin_trick = yes || test $use_macos_tools = yes; then
-  RELOCATABLE_VIA_LD_TRUE=
-  RELOCATABLE_VIA_LD_FALSE='#'
-else
-  RELOCATABLE_VIA_LD_TRUE='#'
-  RELOCATABLE_VIA_LD_FALSE=
-fi
-
-   if test $use_wrapper = yes; then
-  RELOCATABLE_VIA_WRAPPER_TRUE=
-  RELOCATABLE_VIA_WRAPPER_FALSE='#'
-else
-  RELOCATABLE_VIA_WRAPPER_TRUE='#'
-  RELOCATABLE_VIA_WRAPPER_FALSE=
-fi
-
-
-
-
-
-
-
-
-      RELOCATABLE_STRIP=':'
-
-
-
-
-      for ac_header in stdlib.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
-if test "x$ac_cv_header_stdlib_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_STDLIB_H 1
-_ACEOF
-
-fi
-
-done
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5
-$as_echo_n "checking for GNU libc compatible malloc... " >&6; }
-if ${ac_cv_func_malloc_0_nonnull+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-          # Guess yes on platforms where we know the result.
-          *-gnu* | gnu* | *-musl* | freebsd* | netbsd* | openbsd* \
-          | hpux* | solaris* | cygwin* | mingw*)
-            ac_cv_func_malloc_0_nonnull="guessing yes" ;;
-          # If we don't know, obey --enable-cross-guesses.
-          *) ac_cv_func_malloc_0_nonnull="$gl_cross_guess_normal" ;;
-        esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#if defined STDC_HEADERS || defined HAVE_STDLIB_H
-            # include <stdlib.h>
-            #else
-            char *malloc ();
-            #endif
-
-int
-main ()
-{
-char *p = malloc (0);
-            int result = !p;
-            free (p);
-            return result;
-  ;
-  return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_func_malloc_0_nonnull=yes
-else
-  ac_cv_func_malloc_0_nonnull=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5
-$as_echo "$ac_cv_func_malloc_0_nonnull" >&6; }
-  case "$ac_cv_func_malloc_0_nonnull" in
-    *yes)
-      gl_cv_func_malloc_0_nonnull=1
-      ;;
-    *)
-      gl_cv_func_malloc_0_nonnull=0
-      ;;
-  esac
-
-
-cat >>confdefs.h <<_ACEOF
-#define MALLOC_0_IS_NONNULL $gl_cv_func_malloc_0_nonnull
-_ACEOF
-
-
-ac_fn_c_check_decl "$LINENO" "setenv" "ac_cv_have_decl_setenv" "$ac_includes_default"
-if test "x$ac_cv_have_decl_setenv" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_SETENV $ac_have_decl
-_ACEOF
-
-
-
-
-
-
-  GNULIB_SCHED_YIELD=0;
-    HAVE_SCHED_YIELD=1;
-  REPLACE_SCHED_YIELD=0;
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5
-$as_echo_n "checking for uid_t in sys/types.h... " >&6; }
-if ${ac_cv_type_uid_t+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "uid_t" >/dev/null 2>&1; then :
-  ac_cv_type_uid_t=yes
-else
-  ac_cv_type_uid_t=no
-fi
-rm -f conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5
-$as_echo "$ac_cv_type_uid_t" >&6; }
-if test $ac_cv_type_uid_t = no; then
-
-$as_echo "#define uid_t int" >>confdefs.h
-
-
-$as_echo "#define gid_t int" >>confdefs.h
-
-fi
-
-
-
-
-
-ac_fn_c_check_decl "$LINENO" "snprintf" "ac_cv_have_decl_snprintf" "$ac_includes_default"
-if test "x$ac_cv_have_decl_snprintf" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_SNPRINTF $ac_have_decl
-_ACEOF
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5
-$as_echo_n "checking for stdbool.h that conforms to C99... " >&6; }
-if ${ac_cv_header_stdbool_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-             #include <stdbool.h>
-
-             #ifdef __cplusplus
-              typedef bool Bool;
-             #else
-              typedef _Bool Bool;
-              #ifndef bool
-               "error: bool is not defined"
-              #endif
-              #ifndef false
-               "error: false is not defined"
-              #endif
-              #if false
-               "error: false is not 0"
-              #endif
-              #ifndef true
-               "error: true is not defined"
-              #endif
-              #if true != 1
-               "error: true is not 1"
-              #endif
-             #endif
-
-             #ifndef __bool_true_false_are_defined
-              "error: __bool_true_false_are_defined is not defined"
-             #endif
-
-             struct s { Bool s: 1; Bool t; bool u: 1; bool v; } s;
-
-             char a[true == 1 ? 1 : -1];
-             char b[false == 0 ? 1 : -1];
-             char c[__bool_true_false_are_defined == 1 ? 1 : -1];
-             char d[(bool) 0.5 == true ? 1 : -1];
-             /* See body of main program for 'e'.  */
-             char f[(Bool) 0.0 == false ? 1 : -1];
-             char g[true];
-             char h[sizeof (Bool)];
-             char i[sizeof s.t];
-             enum { j = false, k = true, l = false * true, m = true * 256 };
-             /* The following fails for
-                HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
-             Bool n[m];
-             char o[sizeof n == m * sizeof n[0] ? 1 : -1];
-             char p[-1 - (Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
-             /* Catch a bug in an HP-UX C compiler.  See
-                https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
-                https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html
-              */
-             Bool q = true;
-             Bool *pq = &q;
-             bool *qq = &q;
-
-int
-main ()
-{
-
-             bool e = &s;
-             *pq |= q; *pq |= ! q;
-             *qq |= q; *qq |= ! q;
-             /* Refer to every declared value, to avoid compiler optimizations.  */
-             return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
-                     + !m + !n + !o + !p + !q + !pq + !qq);
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdbool_h=yes
-else
-  ac_cv_header_stdbool_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5
-$as_echo "$ac_cv_header_stdbool_h" >&6; }
-   ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
-if test "x$ac_cv_type__Bool" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE__BOOL 1
-_ACEOF
-
-
-fi
-
-
-
-    REPLACE_NULL=0;
-  HAVE_MAX_ALIGN_T=1;
-  HAVE_WCHAR_T=1;
-
-
-
-ac_fn_c_check_decl "$LINENO" "strdup" "ac_cv_have_decl_strdup" "$ac_includes_default"
-if test "x$ac_cv_have_decl_strdup" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRDUP $ac_have_decl
-_ACEOF
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_string_h='<'string.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <string.h>" >&5
-$as_echo_n "checking absolute name of <string.h>... " >&6; }
-if ${gl_cv_next_string_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'string.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_string_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_string_h
-           gl_cv_next_string_h='"'$gl_header'"'
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_string_h" >&5
-$as_echo "$gl_cv_next_string_h" >&6; }
-     fi
-     NEXT_STRING_H=$gl_cv_next_string_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'string.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_string_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_STRING_H=$gl_next_as_first_directive
-
-
-
-
-
-
-
-
-
-ac_fn_c_check_decl "$LINENO" "strndup" "ac_cv_have_decl_strndup" "$ac_includes_default"
-if test "x$ac_cv_have_decl_strndup" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRNDUP $ac_have_decl
-_ACEOF
-
-
-
-
-
-
-  GNULIB_TIMES=0;
-  HAVE_STRUCT_TMS=1;
-  HAVE_TIMES=1;
-
-
-
-
-
-
-
-
-
-
-
-
-
-$as_echo "#define _USE_STD_STAT 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_sys_types_h='<'sys/types.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/types.h>" >&5
-$as_echo_n "checking absolute name of <sys/types.h>... " >&6; }
-if ${gl_cv_next_sys_types_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'sys/types.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_sys_types_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_sys_types_h
-           gl_cv_next_sys_types_h='"'$gl_header'"'
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_types_h" >&5
-$as_echo "$gl_cv_next_sys_types_h" >&6; }
-     fi
-     NEXT_SYS_TYPES_H=$gl_cv_next_sys_types_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'sys/types.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_sys_types_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H=$gl_next_as_first_directive
-
-
-
-
-
-
-
-
-
-
-
-
-    WINDOWS_STAT_INODES=0
-
-
-
-
-  GNULIB_WAITPID=0;
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timespec in <time.h>" >&5
-$as_echo_n "checking for struct timespec in <time.h>... " >&6; }
-if ${gl_cv_sys_struct_timespec_in_time_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <time.h>
-
-int
-main ()
-{
-static struct timespec x; x.tv_sec = x.tv_nsec;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_sys_struct_timespec_in_time_h=yes
-else
-  gl_cv_sys_struct_timespec_in_time_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_time_h" >&5
-$as_echo "$gl_cv_sys_struct_timespec_in_time_h" >&6; }
-
-  TIME_H_DEFINES_STRUCT_TIMESPEC=0
-  SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=0
-  PTHREAD_H_DEFINES_STRUCT_TIMESPEC=0
-  UNISTD_H_DEFINES_STRUCT_TIMESPEC=0
-  if test $gl_cv_sys_struct_timespec_in_time_h = yes; then
-    TIME_H_DEFINES_STRUCT_TIMESPEC=1
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timespec in <sys/time.h>" >&5
-$as_echo_n "checking for struct timespec in <sys/time.h>... " >&6; }
-if ${gl_cv_sys_struct_timespec_in_sys_time_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/time.h>
-
-int
-main ()
-{
-static struct timespec x; x.tv_sec = x.tv_nsec;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_sys_struct_timespec_in_sys_time_h=yes
-else
-  gl_cv_sys_struct_timespec_in_sys_time_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_sys_time_h" >&5
-$as_echo "$gl_cv_sys_struct_timespec_in_sys_time_h" >&6; }
-    if test $gl_cv_sys_struct_timespec_in_sys_time_h = yes; then
-      SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timespec in <pthread.h>" >&5
-$as_echo_n "checking for struct timespec in <pthread.h>... " >&6; }
-if ${gl_cv_sys_struct_timespec_in_pthread_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <pthread.h>
-
-int
-main ()
-{
-static struct timespec x; x.tv_sec = x.tv_nsec;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_sys_struct_timespec_in_pthread_h=yes
-else
-  gl_cv_sys_struct_timespec_in_pthread_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_pthread_h" >&5
-$as_echo "$gl_cv_sys_struct_timespec_in_pthread_h" >&6; }
-      if test $gl_cv_sys_struct_timespec_in_pthread_h = yes; then
-        PTHREAD_H_DEFINES_STRUCT_TIMESPEC=1
-      else
-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timespec in <unistd.h>" >&5
-$as_echo_n "checking for struct timespec in <unistd.h>... " >&6; }
-if ${gl_cv_sys_struct_timespec_in_unistd_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <unistd.h>
-
-int
-main ()
-{
-static struct timespec x; x.tv_sec = x.tv_nsec;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_sys_struct_timespec_in_unistd_h=yes
-else
-  gl_cv_sys_struct_timespec_in_unistd_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_unistd_h" >&5
-$as_echo "$gl_cv_sys_struct_timespec_in_unistd_h" >&6; }
-        if test $gl_cv_sys_struct_timespec_in_unistd_h = yes; then
-          UNISTD_H_DEFINES_STRUCT_TIMESPEC=1
-        fi
-      fi
-    fi
-  fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_time_h='<'time.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <time.h>" >&5
-$as_echo_n "checking absolute name of <time.h>... " >&6; }
-if ${gl_cv_next_time_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <time.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'time.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_time_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_time_h
-           gl_cv_next_time_h='"'$gl_header'"'
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_time_h" >&5
-$as_echo "$gl_cv_next_time_h" >&6; }
-     fi
-     NEXT_TIME_H=$gl_cv_next_time_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'time.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_time_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_TIME_H=$gl_next_as_first_directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-gl_libunistring_sed_extract_major='/^[0-9]/{s/^\([0-9]*\).*/\1/p;q;}
-i\
-0
-q
-'
-gl_libunistring_sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{s/^[0-9]*[.]\([0-9]*\).*/\1/p;q;}
-i\
-0
-q
-'
-gl_libunistring_sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p;q;}
-i\
-0
-q
-'
-
-
-  if test "$HAVE_LIBUNISTRING" = yes; then
-    LIBUNISTRING_VERSION_MAJOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_major"`
-    LIBUNISTRING_VERSION_MINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_minor"`
-    LIBUNISTRING_VERSION_SUBMINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_subminor"`
-  fi
-
-ac_fn_c_check_decl "$LINENO" "clearerr_unlocked" "ac_cv_have_decl_clearerr_unlocked" "$ac_includes_default"
-if test "x$ac_cv_have_decl_clearerr_unlocked" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_CLEARERR_UNLOCKED $ac_have_decl
-_ACEOF
-
-ac_fn_c_check_decl "$LINENO" "feof_unlocked" "ac_cv_have_decl_feof_unlocked" "$ac_includes_default"
-if test "x$ac_cv_have_decl_feof_unlocked" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FEOF_UNLOCKED $ac_have_decl
-_ACEOF
-
-ac_fn_c_check_decl "$LINENO" "ferror_unlocked" "ac_cv_have_decl_ferror_unlocked" "$ac_includes_default"
-if test "x$ac_cv_have_decl_ferror_unlocked" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FERROR_UNLOCKED $ac_have_decl
-_ACEOF
-
-ac_fn_c_check_decl "$LINENO" "fflush_unlocked" "ac_cv_have_decl_fflush_unlocked" "$ac_includes_default"
-if test "x$ac_cv_have_decl_fflush_unlocked" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FFLUSH_UNLOCKED $ac_have_decl
-_ACEOF
-
-ac_fn_c_check_decl "$LINENO" "fgets_unlocked" "ac_cv_have_decl_fgets_unlocked" "$ac_includes_default"
-if test "x$ac_cv_have_decl_fgets_unlocked" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FGETS_UNLOCKED $ac_have_decl
-_ACEOF
-
-ac_fn_c_check_decl "$LINENO" "fputc_unlocked" "ac_cv_have_decl_fputc_unlocked" "$ac_includes_default"
-if test "x$ac_cv_have_decl_fputc_unlocked" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FPUTC_UNLOCKED $ac_have_decl
-_ACEOF
-
-ac_fn_c_check_decl "$LINENO" "fputs_unlocked" "ac_cv_have_decl_fputs_unlocked" "$ac_includes_default"
-if test "x$ac_cv_have_decl_fputs_unlocked" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FPUTS_UNLOCKED $ac_have_decl
-_ACEOF
-
-ac_fn_c_check_decl "$LINENO" "fread_unlocked" "ac_cv_have_decl_fread_unlocked" "$ac_includes_default"
-if test "x$ac_cv_have_decl_fread_unlocked" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FREAD_UNLOCKED $ac_have_decl
-_ACEOF
-
-ac_fn_c_check_decl "$LINENO" "fwrite_unlocked" "ac_cv_have_decl_fwrite_unlocked" "$ac_includes_default"
-if test "x$ac_cv_have_decl_fwrite_unlocked" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FWRITE_UNLOCKED $ac_have_decl
-_ACEOF
-
-ac_fn_c_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default"
-if test "x$ac_cv_have_decl_getc_unlocked" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_GETC_UNLOCKED $ac_have_decl
-_ACEOF
-
-ac_fn_c_check_decl "$LINENO" "getchar_unlocked" "ac_cv_have_decl_getchar_unlocked" "$ac_includes_default"
-if test "x$ac_cv_have_decl_getchar_unlocked" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_GETCHAR_UNLOCKED $ac_have_decl
-_ACEOF
-
-ac_fn_c_check_decl "$LINENO" "putc_unlocked" "ac_cv_have_decl_putc_unlocked" "$ac_includes_default"
-if test "x$ac_cv_have_decl_putc_unlocked" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_PUTC_UNLOCKED $ac_have_decl
-_ACEOF
-
-ac_fn_c_check_decl "$LINENO" "putchar_unlocked" "ac_cv_have_decl_putchar_unlocked" "$ac_includes_default"
-if test "x$ac_cv_have_decl_putchar_unlocked" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_PUTCHAR_UNLOCKED $ac_have_decl
-_ACEOF
-
-ac_fn_c_check_decl "$LINENO" "unsetenv" "ac_cv_have_decl_unsetenv" "$ac_includes_default"
-if test "x$ac_cv_have_decl_unsetenv" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_UNSETENV $ac_have_decl
-_ACEOF
-
-ac_fn_c_check_decl "$LINENO" "vsnprintf" "ac_cv_have_decl_vsnprintf" "$ac_includes_default"
-if test "x$ac_cv_have_decl_vsnprintf" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_VSNPRINTF $ac_have_decl
-_ACEOF
-
-
-            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether <wchar.h> uses 'inline' correctly" >&5
-$as_echo_n "checking whether <wchar.h> uses 'inline' correctly... " >&6; }
-if ${gl_cv_header_wchar_h_correct_inline+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gl_cv_header_wchar_h_correct_inline=yes
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-       #define wcstod renamed_wcstod
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-extern int zero (void);
-int main () { return zero(); }
-
-_ACEOF
-                              save_ac_compile="$ac_compile"
-     ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/`
-     if echo '#include "conftest.c"' >conftest1.c &&
-        { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-         #define wcstod renamed_wcstod
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-int zero (void) { return 0; }
-
-_ACEOF
-              ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/`
-       if echo '#include "conftest.c"' >conftest2.c &&
-          { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-         if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&5 2>&1; then
-           :
-         else
-           gl_cv_header_wchar_h_correct_inline=no
-         fi
-       fi
-     fi
-     ac_compile="$save_ac_compile"
-     rm -f conftest12.c conftest12.$ac_objext conftest$ac_exeext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_wchar_h_correct_inline" >&5
-$as_echo "$gl_cv_header_wchar_h_correct_inline" >&6; }
-  if test $gl_cv_header_wchar_h_correct_inline = no; then
-    as_fn_error $? "<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
-This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
-C99 mode. You have four options:
-  - Add the flag -fgnu89-inline to CC and reconfigure, or
-  - Fix your include files, using parts of
-    <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
-  - Use a gcc version older than 4.3, or
-  - Don't use the flags -std=c99 or -std=gnu99.
-Configuration aborted." "$LINENO" 5
-  fi
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking POSIX termios" >&5
-$as_echo_n "checking POSIX termios... " >&6; }
-if ${ac_cv_sys_posix_termios+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-#include <unistd.h>
-#include <termios.h>
-
-int
-main ()
-{
-/* SunOS 4.0.3 has termios.h but not the library calls.  */
-   tcgetattr(0, 0);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_sys_posix_termios=yes
-else
-  ac_cv_sys_posix_termios=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_posix_termios" >&5
-$as_echo "$ac_cv_sys_posix_termios" >&6; }
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether use of TIOCGWINSZ requires termios.h" >&5
-$as_echo_n "checking whether use of TIOCGWINSZ requires termios.h... " >&6; }
-if ${gl_cv_sys_tiocgwinsz_needs_termios_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gl_cv_sys_tiocgwinsz_needs_termios_h=no
-
-   if test $ac_cv_sys_posix_termios = yes; then
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-#      include <termios.h>
-#      ifdef TIOCGWINSZ
-         yes
-#      endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "yes" >/dev/null 2>&1; then :
-  gl_cv_sys_tiocgwinsz_needs_termios_h=yes
-fi
-rm -f conftest*
-
-   fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_tiocgwinsz_needs_termios_h" >&5
-$as_echo "$gl_cv_sys_tiocgwinsz_needs_termios_h" >&6; }
-
-
-
-
-     GNULIB_FCHMODAT=0;
-  GNULIB_FSTAT=0;
-  GNULIB_FSTATAT=0;
-  GNULIB_FUTIMENS=0;
-  GNULIB_LCHMOD=0;
-  GNULIB_LSTAT=0;
-  GNULIB_MKDIRAT=0;
-  GNULIB_MKFIFO=0;
-  GNULIB_MKFIFOAT=0;
-  GNULIB_MKNOD=0;
-  GNULIB_MKNODAT=0;
-  GNULIB_STAT=0;
-  GNULIB_UTIMENSAT=0;
-  GNULIB_OVERRIDES_STRUCT_STAT=0;
-    HAVE_FCHMODAT=1;
-  HAVE_FSTATAT=1;
-  HAVE_FUTIMENS=1;
-  HAVE_LCHMOD=1;
-  HAVE_LSTAT=1;
-  HAVE_MKDIRAT=1;
-  HAVE_MKFIFO=1;
-  HAVE_MKFIFOAT=1;
-  HAVE_MKNOD=1;
-  HAVE_MKNODAT=1;
-  HAVE_UTIMENSAT=1;
-  REPLACE_FSTAT=0;
-  REPLACE_FSTATAT=0;
-  REPLACE_FUTIMENS=0;
-  REPLACE_LSTAT=0;
-  REPLACE_MKDIR=0;
-  REPLACE_MKFIFO=0;
-  REPLACE_MKNOD=0;
-  REPLACE_STAT=0;
-  REPLACE_UTIMENSAT=0;
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5
-$as_echo_n "checking whether stat file-mode macros are broken... " >&6; }
-if ${ac_cv_header_stat_broken+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#if defined S_ISBLK && defined S_IFDIR
-extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1];
-#endif
-
-#if defined S_ISBLK && defined S_IFCHR
-extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1];
-#endif
-
-#if defined S_ISLNK && defined S_IFREG
-extern char c3[S_ISLNK (S_IFREG) ? -1 : 1];
-#endif
-
-#if defined S_ISSOCK && defined S_IFREG
-extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1];
-#endif
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stat_broken=no
-else
-  ac_cv_header_stat_broken=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5
-$as_echo "$ac_cv_header_stat_broken" >&6; }
-if test $ac_cv_header_stat_broken = yes; then
-
-$as_echo "#define STAT_MACROS_BROKEN 1" >>confdefs.h
-
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_sys_stat_h='<'sys/stat.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/stat.h>" >&5
-$as_echo_n "checking absolute name of <sys/stat.h>... " >&6; }
-if ${gl_cv_next_sys_stat_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-             if test $ac_cv_header_sys_stat_h = yes; then
-
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/stat.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'sys/stat.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_sys_stat_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_sys_stat_h
-           gl_cv_next_sys_stat_h='"'$gl_header'"'
-          else
-               gl_cv_next_sys_stat_h='<'sys/stat.h'>'
-             fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_stat_h" >&5
-$as_echo "$gl_cv_next_sys_stat_h" >&6; }
-     fi
-     NEXT_SYS_STAT_H=$gl_cv_next_sys_stat_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'sys/stat.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_sys_stat_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H=$gl_next_as_first_directive
-
-
-
-
-
-
-
-
-    WINDOWS_STAT_TIMESPEC=0
-
-
-
-
-
-
-
-
-      ac_fn_c_check_type "$LINENO" "nlink_t" "ac_cv_type_nlink_t" "#include <sys/types.h>
-     #include <sys/stat.h>
-"
-if test "x$ac_cv_type_nlink_t" = xyes; then :
-
-else
-
-$as_echo "#define nlink_t int" >>confdefs.h
-
-fi
-
-
-
-
-
-
-
-
-ac_fn_c_check_decl "$LINENO" "getdtablesize" "ac_cv_have_decl_getdtablesize" "$ac_includes_default"
-if test "x$ac_cv_have_decl_getdtablesize" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_GETDTABLESIZE $ac_have_decl
-_ACEOF
-
-
-         { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5
-$as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; }
-if ${gl_cv_func_lstat_dereferences_slashed_symlink+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -f conftest.sym conftest.file
-     echo >conftest.file
-     if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-          linux-* | linux)
-            # Guess yes on Linux systems.
-            gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;;
-          *-gnu* | gnu*)
-            # Guess yes on glibc systems.
-            gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;;
-          mingw*)
-            # Guess no on native Windows.
-            gl_cv_func_lstat_dereferences_slashed_symlink="guessing no" ;;
-          *)
-            # If we don't know, obey --enable-cross-guesses.
-            gl_cv_func_lstat_dereferences_slashed_symlink="$gl_cross_guess_normal" ;;
-        esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-struct stat sbuf;
-            if (symlink ("conftest.file", "conftest.sym") != 0)
-              return 1;
-            /* Linux will dereference the symlink and fail, as required by
-               POSIX.  That is better in the sense that it means we will not
-               have to compile and use the lstat wrapper.  */
-            return lstat ("conftest.sym/", &sbuf) == 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_lstat_dereferences_slashed_symlink=yes
-else
-  gl_cv_func_lstat_dereferences_slashed_symlink=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-     rm -f conftest.sym conftest.file
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_lstat_dereferences_slashed_symlink" >&5
-$as_echo "$gl_cv_func_lstat_dereferences_slashed_symlink" >&6; }
-  case "$gl_cv_func_lstat_dereferences_slashed_symlink" in
-    *yes)
-
-cat >>confdefs.h <<_ACEOF
-#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1
-_ACEOF
-
-      ;;
-  esac
-
-
-
-ac_fn_c_check_decl "$LINENO" "strnlen" "ac_cv_have_decl_strnlen" "$ac_includes_default"
-if test "x$ac_cv_have_decl_strnlen" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRNLEN $ac_have_decl
-_ACEOF
-
-
-   if false; then
-  GL_COND_LIBTOOL_TRUE=
-  GL_COND_LIBTOOL_FALSE='#'
-else
-  GL_COND_LIBTOOL_TRUE='#'
-  GL_COND_LIBTOOL_FALSE=
-fi
-
-  gl_cond_libtool=false
-  gl_libdeps=
-  gl_ltlibdeps=
-  gl_m4_base='m4'
-
-
-
-
-
-
-
-
-
-  gl_source_base='lib'
-
-
-  if test $ac_cv_func_alloca_works = no; then
-    :
-  fi
-
-  # Define an additional variable used in the Makefile substitution.
-  if test $ac_cv_working_alloca_h = yes; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca as a compiler built-in" >&5
-$as_echo_n "checking for alloca as a compiler built-in... " >&6; }
-if ${gl_cv_rpl_alloca+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#if defined __GNUC__ || defined _AIX || defined _MSC_VER
-        Need own alloca
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Need own alloca" >/dev/null 2>&1; then :
-  gl_cv_rpl_alloca=yes
-else
-  gl_cv_rpl_alloca=no
-fi
-rm -f conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_rpl_alloca" >&5
-$as_echo "$gl_cv_rpl_alloca" >&6; }
-    if test $gl_cv_rpl_alloca = yes; then
-
-$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h
-
-      ALLOCA_H=alloca.h
-    else
-                  ALLOCA_H=
-    fi
-  else
-    ALLOCA_H=alloca.h
-  fi
-
-   if test -n "$ALLOCA_H"; then
-  GL_GENERATE_ALLOCA_H_TRUE=
-  GL_GENERATE_ALLOCA_H_FALSE='#'
-else
-  GL_GENERATE_ALLOCA_H_TRUE='#'
-  GL_GENERATE_ALLOCA_H_FALSE=
-fi
-
-
-  if test $ac_cv_working_alloca_h = yes; then
-    HAVE_ALLOCA_H=1
-  else
-    HAVE_ALLOCA_H=0
-  fi
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable assertions" >&5
-$as_echo_n "checking whether to enable assertions... " >&6; }
-  # Check whether --enable-assert was given.
-if test "${enable_assert+set}" = set; then :
-  enableval=$enable_assert; if test "x$enableval" = xno; then :
-
-$as_echo "#define NDEBUG 1" >>confdefs.h
-
-elif test "x$enableval" != xyes; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-assert" >&5
-$as_echo "$as_me: WARNING: invalid argument supplied to --enable-assert" >&2;}
-      enable_assert=yes
-fi
-else
-  enable_assert=yes
-fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_assert" >&5
-$as_echo "$enable_assert" >&6; }
-
-
-
-
-  if test $gl_cv_func_malloc_posix = yes; then
-
-$as_echo "#define HAVE_CALLOC_POSIX 1" >>confdefs.h
-
-  else
-    REPLACE_CALLOC=1
-  fi
-
-  if test $REPLACE_CALLOC = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS calloc.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_CALLOC_POSIX=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_CALLOC_POSIX 1" >>confdefs.h
-
-
-
-
-
-
-  if test $ac_cv_func_canonicalize_file_name = no; then
-    HAVE_CANONICALIZE_FILE_NAME=0
-    if test $ac_cv_func_realpath = no; then
-      HAVE_REALPATH=0
-    else
-      case "$gl_cv_func_realpath_works" in
-        *yes) ;;
-        *)    REPLACE_REALPATH=1 ;;
-      esac
-    fi
-  else
-    case "$gl_cv_func_realpath_works" in
-      *yes)
-        ;;
-      *)
-        REPLACE_CANONICALIZE_FILE_NAME=1
-        REPLACE_REALPATH=1
-        ;;
-    esac
-  fi
-
-  if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS canonicalize-lgpl.$ac_objext"
-
-  fi
-
-
-cat >>confdefs.h <<_ACEOF
-#define GNULIB_CANONICALIZE_LGPL 1
-_ACEOF
-
-
-
-
-
-
-
-          GNULIB_CANONICALIZE_FILE_NAME=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_CANONICALIZE_FILE_NAME 1" >>confdefs.h
-
-
-
-
-
-
-
-
-          GNULIB_REALPATH=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_REALPATH 1" >>confdefs.h
-
-
-
-
-
-
-
-  # Solaris 2.5.1 needs -lposix4 to get the clock_gettime function.
-  # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4.
-
-  # Save and restore LIBS so e.g., -lrt, isn't added to it.  Otherwise, *all*
-  # programs in the package would end up linked with that potentially-shared
-  # library, inducing unnecessary run-time overhead.
-  LIB_CLOCK_GETTIME=
-
-  gl_saved_libs=$LIBS
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5
-$as_echo_n "checking for library containing clock_gettime... " >&6; }
-if ${ac_cv_search_clock_gettime+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_func_search_save_LIBS=$LIBS
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char clock_gettime ();
-int
-main ()
-{
-return clock_gettime ();
-  ;
-  return 0;
-}
-_ACEOF
-for ac_lib in '' rt posix4; do
-  if test -z "$ac_lib"; then
-    ac_res="none required"
-  else
-    ac_res=-l$ac_lib
-    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-  fi
-  if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_search_clock_gettime=$ac_res
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext
-  if ${ac_cv_search_clock_gettime+:} false; then :
-  break
-fi
-done
-if ${ac_cv_search_clock_gettime+:} false; then :
-
-else
-  ac_cv_search_clock_gettime=no
-fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
-$as_echo "$ac_cv_search_clock_gettime" >&6; }
-ac_res=$ac_cv_search_clock_gettime
-if test "$ac_res" != no; then :
-  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-  test "$ac_cv_search_clock_gettime" = "none required" ||
-                    LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime
-fi
-
-    for ac_func in clock_gettime clock_settime
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-  LIBS=$gl_saved_libs
-
-
-
-$as_echo "#define GNULIB_TEST_CLOEXEC 1" >>confdefs.h
-
-
-
-
-
-
-    if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
-      REPLACE_CLOSE=1
-    fi
-
-
-
-
-
-
-  if test $ac_cv_header_sys_socket_h != yes; then
-                    for ac_header in winsock2.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
-if test "x$ac_cv_header_winsock2_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_WINSOCK2_H 1
-_ACEOF
-
-fi
-
-done
-
-  fi
-  if test "$ac_cv_header_winsock2_h" = yes; then
-    HAVE_WINSOCK2_H=1
-    UNISTD_H_HAVE_WINSOCK2_H=1
-    SYS_IOCTL_H_HAVE_WINSOCK2_H=1
-  else
-    HAVE_WINSOCK2_H=0
-  fi
-
-
-    if test $UNISTD_H_HAVE_WINSOCK2_H = 1; then
-                        REPLACE_CLOSE=1
-    fi
-
-
-
-  if test $REPLACE_CLOSE = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS close.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_CLOSE=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_CLOSE 1" >>confdefs.h
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define GNULIB_CLOSE_STREAM 1
-_ACEOF
-
-
-
-
-  if test "x$lispdir" = x; then
-    lispdir='${datarootdir}/emacs/site-lisp'
-
-  fi
-    if test "x$runstatedir" = x; then
-    runstatedir='${localstatedir}/run'
-
-  fi
-
-      pkglibexecdir='${libexecdir}/${PACKAGE}'
-
-
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define GNULIB_DIRNAME 1
-_ACEOF
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether // is distinct from /" >&5
-$as_echo_n "checking whether // is distinct from /... " >&6; }
-if ${gl_cv_double_slash_root+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-   if test x"$cross_compiling" = xyes ; then
-        # When cross-compiling, there is no way to tell whether // is special
-        # short of a list of hosts.  However, the only known hosts to date
-        # that have a distinct // are Apollo DomainOS (too old to port to),
-        # Cygwin, and z/OS.  If anyone knows of another system for which // has
-        # special semantics and is distinct from /, please report it to
-        # <bug-gnulib@gnu.org>.
-        case $host in
-          *-cygwin | i370-ibm-openedition)
-            gl_cv_double_slash_root=yes ;;
-          *)
-            # Be optimistic and assume that / and // are the same when we
-            # don't know.
-            gl_cv_double_slash_root='unknown, assuming no' ;;
-        esac
-      else
-        set x `ls -di / // 2>/dev/null`
-        if test "$2" = "$4" && wc //dev/null >/dev/null 2>&1; then
-          gl_cv_double_slash_root=no
-        else
-          gl_cv_double_slash_root=yes
-        fi
-      fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_double_slash_root" >&5
-$as_echo "$gl_cv_double_slash_root" >&6; }
-  if test "$gl_cv_double_slash_root" = yes; then
-
-$as_echo "#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-
-$as_echo "#define HAVE_DUP2 1" >>confdefs.h
-
-
-  if test $HAVE_DUP2 = 1; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether dup2 works" >&5
-$as_echo_n "checking whether dup2 works... " >&6; }
-if ${gl_cv_func_dup2_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-           mingw*) # on this platform, dup2 always returns 0 for success
-             gl_cv_func_dup2_works="guessing no" ;;
-           cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0
-             gl_cv_func_dup2_works="guessing no" ;;
-           aix* | freebsd*)
-                   # on AIX 7.1 and FreeBSD 6.1, dup2 (1,toobig) gives EMFILE,
-                   # not EBADF.
-             gl_cv_func_dup2_works="guessing no" ;;
-           haiku*) # on Haiku alpha 2, dup2(1, 1) resets FD_CLOEXEC.
-             gl_cv_func_dup2_works="guessing no" ;;
-           *-android*) # implemented using dup3(), which fails if oldfd == newfd
-             gl_cv_func_dup2_works="guessing no" ;;
-           os2*) # on OS/2 kLIBC, dup2() does not work on a directory fd.
-             gl_cv_func_dup2_works="guessing no" ;;
-           *) gl_cv_func_dup2_works="guessing yes" ;;
-         esac
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-         #include <errno.h>
-             #include <fcntl.h>
-             #include <limits.h>
-             #include <sys/resource.h>
-             #include <unistd.h>
-             #ifndef RLIM_SAVED_CUR
-             # define RLIM_SAVED_CUR RLIM_INFINITY
-             #endif
-             #ifndef RLIM_SAVED_MAX
-             # define RLIM_SAVED_MAX RLIM_INFINITY
-             #endif
-
-int
-main ()
-{
-int result = 0;
-             int bad_fd = INT_MAX;
-             struct rlimit rlim;
-             if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
-                 && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX
-                 && rlim.rlim_cur != RLIM_INFINITY
-                 && rlim.rlim_cur != RLIM_SAVED_MAX
-                 && rlim.rlim_cur != RLIM_SAVED_CUR)
-               bad_fd = rlim.rlim_cur;
-             #ifdef FD_CLOEXEC
-               if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1)
-                 result |= 1;
-             #endif
-             if (dup2 (1, 1) != 1)
-               result |= 2;
-             #ifdef FD_CLOEXEC
-               if (fcntl (1, F_GETFD) != FD_CLOEXEC)
-                 result |= 4;
-             #endif
-             close (0);
-             if (dup2 (0, 0) != -1)
-               result |= 8;
-             /* Many gnulib modules require POSIX conformance of EBADF.  */
-             if (dup2 (2, bad_fd) == -1 && errno != EBADF)
-               result |= 16;
-             /* Flush out some cygwin core dumps.  */
-             if (dup2 (2, -1) != -1 || errno != EBADF)
-               result |= 32;
-             dup2 (2, 255);
-             dup2 (2, 256);
-             /* On OS/2 kLIBC, dup2() does not work on a directory fd.  */
-             {
-               int fd = open (".", O_RDONLY);
-               if (fd == -1)
-                 result |= 64;
-               else if (dup2 (fd, fd + 1) == -1)
-                 result |= 128;
-
-               close (fd);
-             }
-             return result;
-  ;
-  return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_dup2_works=yes
-else
-  gl_cv_func_dup2_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_dup2_works" >&5
-$as_echo "$gl_cv_func_dup2_works" >&6; }
-    case "$gl_cv_func_dup2_works" in
-      *yes) ;;
-      *)
-        REPLACE_DUP2=1
-        for ac_func in setdtablesize
-do :
-  ac_fn_c_check_func "$LINENO" "setdtablesize" "ac_cv_func_setdtablesize"
-if test "x$ac_cv_func_setdtablesize" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_SETDTABLESIZE 1
-_ACEOF
-
-fi
-done
-
-        ;;
-    esac
-  fi
-
-
-  if test $HAVE_DUP2 = 0 || test $REPLACE_DUP2 = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS dup2.$ac_objext"
-
-
-  fi
-
-
-
-
-
-          GNULIB_DUP2=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_DUP2 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-          GNULIB_ENVIRON=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_ENVIRON 1" >>confdefs.h
-
-
-
-
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5
-$as_echo_n "checking for error_at_line... " >&6; }
-if ${ac_cv_lib_error_at_line+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <error.h>
-int
-main ()
-{
-error_at_line (0, 0, "", 0, "an error occurred");
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_error_at_line=yes
-else
-  ac_cv_lib_error_at_line=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_error_at_line" >&5
-$as_echo "$ac_cv_lib_error_at_line" >&6; }
-
-  if test $ac_cv_lib_error_at_line = no; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS error.$ac_objext"
-
-
-
-  :
-
-  fi
-
-
-  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error:3:c-format"
-
-
-
-  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error_at_line:5:c-format"
-
-
-
-
-
-  :
-
-
-
-
-
-
-  if test $ac_cv_func_fcntl = no; then
-
-
-
-  if test $ac_cv_func_fcntl = no; then
-    HAVE_FCNTL=0
-  else
-    REPLACE_FCNTL=1
-  fi
-
-  else
-            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fcntl handles F_DUPFD correctly" >&5
-$as_echo_n "checking whether fcntl handles F_DUPFD correctly... " >&6; }
-if ${gl_cv_func_fcntl_f_dupfd_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  case $host_os in
-            aix* | cygwin* | haiku*)
-               gl_cv_func_fcntl_f_dupfd_works="guessing no" ;;
-            *) gl_cv_func_fcntl_f_dupfd_works="guessing yes" ;;
-          esac
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <errno.h>
-              #include <fcntl.h>
-              #include <limits.h>
-              #include <sys/resource.h>
-              #include <unistd.h>
-              #ifndef RLIM_SAVED_CUR
-              # define RLIM_SAVED_CUR RLIM_INFINITY
-              #endif
-              #ifndef RLIM_SAVED_MAX
-              # define RLIM_SAVED_MAX RLIM_INFINITY
-              #endif
-
-int
-main ()
-{
-int result = 0;
-              int bad_fd = INT_MAX;
-              struct rlimit rlim;
-              if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
-                  && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX
-                  && rlim.rlim_cur != RLIM_INFINITY
-                  && rlim.rlim_cur != RLIM_SAVED_MAX
-                  && rlim.rlim_cur != RLIM_SAVED_CUR)
-                bad_fd = rlim.rlim_cur;
-              if (fcntl (0, F_DUPFD, -1) != -1) result |= 1;
-              if (errno != EINVAL) result |= 2;
-              if (fcntl (0, F_DUPFD, bad_fd) != -1) result |= 4;
-              if (errno != EINVAL) result |= 8;
-              /* On OS/2 kLIBC, F_DUPFD does not work on a directory fd */
-              {
-                int fd;
-                fd = open (".", O_RDONLY);
-                if (fd == -1)
-                  result |= 16;
-                else if (fcntl (fd, F_DUPFD, STDERR_FILENO + 1) == -1)
-                  result |= 32;
-
-                close (fd);
-              }
-              return result;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_fcntl_f_dupfd_works=yes
-else
-  gl_cv_func_fcntl_f_dupfd_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fcntl_f_dupfd_works" >&5
-$as_echo "$gl_cv_func_fcntl_f_dupfd_works" >&6; }
-    case $gl_cv_func_fcntl_f_dupfd_works in
-      *yes) ;;
-      *)
-
-
-  if test $ac_cv_func_fcntl = no; then
-    HAVE_FCNTL=0
-  else
-    REPLACE_FCNTL=1
-  fi
-
-
-$as_echo "#define FCNTL_DUPFD_BUGGY 1" >>confdefs.h
- ;;
-    esac
-
-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fcntl understands F_DUPFD_CLOEXEC" >&5
-$as_echo_n "checking whether fcntl understands F_DUPFD_CLOEXEC... " >&6; }
-if ${gl_cv_func_fcntl_f_dupfd_cloexec+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <fcntl.h>
-#ifndef F_DUPFD_CLOEXEC
-choke me
-#endif
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef __linux__
-/* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace
-   it to support the semantics on older kernels that failed with EINVAL.  */
-choke me
-#endif
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_func_fcntl_f_dupfd_cloexec=yes
-else
-  gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-else
-  gl_cv_func_fcntl_f_dupfd_cloexec=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fcntl_f_dupfd_cloexec" >&5
-$as_echo "$gl_cv_func_fcntl_f_dupfd_cloexec" >&6; }
-    if test "$gl_cv_func_fcntl_f_dupfd_cloexec" != yes; then
-
-
-
-  if test $ac_cv_func_fcntl = no; then
-    HAVE_FCNTL=0
-  else
-    REPLACE_FCNTL=1
-  fi
-
-          fi
-  fi
-
-
-  if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS fcntl.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_FCNTL=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_FCNTL 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_fcntl_h='<'fcntl.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <fcntl.h>" >&5
-$as_echo_n "checking absolute name of <fcntl.h>... " >&6; }
-if ${gl_cv_next_fcntl_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <fcntl.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'fcntl.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_fcntl_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_fcntl_h
-           gl_cv_next_fcntl_h='"'$gl_header'"'
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_fcntl_h" >&5
-$as_echo "$gl_cv_next_fcntl_h" >&6; }
-     fi
-     NEXT_FCNTL_H=$gl_cv_next_fcntl_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'fcntl.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_fcntl_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_FCNTL_H=$gl_next_as_first_directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define GNULIB_FD_SAFER_FLAG 1
-_ACEOF
-
-
-
-
-
-  FLOAT_H=
-  REPLACE_FLOAT_LDBL=0
-  case "$host_os" in
-    aix* | beos* | openbsd* | mirbsd* | irix*)
-      FLOAT_H=float.h
-      ;;
-    freebsd* | dragonfly*)
-      case "$host_cpu" in
-        i[34567]86 )
-          FLOAT_H=float.h
-          ;;
-        x86_64 )
-          # On x86_64 systems, the C compiler may still be generating
-          # 32-bit code.
-          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#if defined __LP64__ || defined __x86_64__ || defined __amd64__
-                  int ok;
-                 #else
-                  error fail
-                 #endif
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  FLOAT_H=float.h
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-          ;;
-      esac
-      ;;
-    linux*)
-      case "$host_cpu" in
-        powerpc*)
-          FLOAT_H=float.h
-          ;;
-      esac
-      ;;
-  esac
-  case "$host_os" in
-    aix* | freebsd* | dragonfly* | linux*)
-      if test -n "$FLOAT_H"; then
-        REPLACE_FLOAT_LDBL=1
-      fi
-      ;;
-  esac
-
-    REPLACE_ITOLD=0
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether conversion from 'int' to 'long double' works" >&5
-$as_echo_n "checking whether conversion from 'int' to 'long double' works... " >&6; }
-if ${gl_cv_func_itold_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host" in
-           sparc*-*-linux*)
-             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#if defined __LP64__ || defined __arch64__
-                    int ok;
-                   #else
-                    error fail
-                   #endif
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_func_itold_works="guessing no"
-else
-  gl_cv_func_itold_works="guessing yes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-             ;;
-                   # Guess yes on native Windows.
-           mingw*) gl_cv_func_itold_works="guessing yes" ;;
-           *)      gl_cv_func_itold_works="guessing yes" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int i = -1;
-volatile long double ld;
-int main ()
-{
-  ld += i * 1.0L;
-  if (ld > 0)
-    return 1;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_itold_works=yes
-else
-  gl_cv_func_itold_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_itold_works" >&5
-$as_echo "$gl_cv_func_itold_works" >&6; }
-  case "$gl_cv_func_itold_works" in
-    *no)
-      REPLACE_ITOLD=1
-                  FLOAT_H=float.h
-      ;;
-  esac
-
-  if test -n "$FLOAT_H"; then
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_float_h='<'float.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <float.h>" >&5
-$as_echo_n "checking absolute name of <float.h>... " >&6; }
-if ${gl_cv_next_float_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <float.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'float.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_float_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_float_h
-           gl_cv_next_float_h='"'$gl_header'"'
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_float_h" >&5
-$as_echo "$gl_cv_next_float_h" >&6; }
-     fi
-     NEXT_FLOAT_H=$gl_cv_next_float_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'float.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_float_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_FLOAT_H=$gl_next_as_first_directive
-
-
-
-
-  fi
-
-   if test -n "$FLOAT_H"; then
-  GL_GENERATE_FLOAT_H_TRUE=
-  GL_GENERATE_FLOAT_H_FALSE='#'
-else
-  GL_GENERATE_FLOAT_H_TRUE='#'
-  GL_GENERATE_FLOAT_H_FALSE=
-fi
-
-
-
-  if test $REPLACE_FLOAT_LDBL = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS float.$ac_objext"
-
-  fi
-  if test $REPLACE_ITOLD = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS itold.$ac_objext"
-
-  fi
-
-
-
-  case "$host_os" in
-    mingw* | pw*)
-            REPLACE_FOPEN=1
-            gl_cv_func_fopen_slash="guessing no"
-      ;;
-    *)
-                  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fopen recognizes a trailing slash" >&5
-$as_echo_n "checking whether fopen recognizes a trailing slash... " >&6; }
-if ${gl_cv_func_fopen_slash+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-          if test "$cross_compiling" = yes; then :
-
-             case "$host_os" in
-               aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*)
-                 gl_cv_func_fopen_slash="guessing no" ;;
-               *)
-                 gl_cv_func_fopen_slash="guessing yes" ;;
-             esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stddef.h>
-#include <stdio.h>
-int main ()
-{
-  FILE *fp = fopen ("conftest.sl/", "w");
-  int result = (fp != NULL);
-  if (fp != NULL)
-    fclose (fp);
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_fopen_slash=yes
-else
-  gl_cv_func_fopen_slash=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-          rm -f conftest.sl
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fopen_slash" >&5
-$as_echo "$gl_cv_func_fopen_slash" >&6; }
-      ;;
-  esac
-  case "$gl_cv_func_fopen_slash" in
-    *no)
-
-$as_echo "#define FOPEN_TRAILING_SLASH_BUG 1" >>confdefs.h
-
-      REPLACE_FOPEN=1
-      ;;
-  esac
-
-  if test $REPLACE_FOPEN = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS fopen.$ac_objext"
-
-    :
-  fi
-
-
-
-
-
-          GNULIB_FOPEN=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_FOPEN 1" >>confdefs.h
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define GNULIB_FOPEN_SAFER 1
-_ACEOF
-
-
-
-
-  fp_headers='
-    #include <stdio.h>
-    #if HAVE_STDIO_EXT_H
-    # include <stdio_ext.h>
-    #endif
-  '
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __fpending" >&5
-$as_echo_n "checking for __fpending... " >&6; }
-if ${gl_cv_func___fpending+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$fp_headers
-int
-main ()
-{
-return ! __fpending (stdin);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func___fpending=yes
-else
-  gl_cv_func___fpending=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func___fpending" >&5
-$as_echo "$gl_cv_func___fpending" >&6; }
-  if test $gl_cv_func___fpending = yes; then
-    ac_fn_c_check_decl "$LINENO" "__fpending" "ac_cv_have_decl___fpending" "$fp_headers
-"
-if test "x$ac_cv_have_decl___fpending" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL___FPENDING $ac_have_decl
-_ACEOF
-
-  fi
-
-  if test $gl_cv_func___fpending = no; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS fpending.$ac_objext"
-
-  fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_cv_func_fprintf_posix=no
-  case "$gl_cv_func_printf_sizes_c99" in
-    *yes)
-      case "$gl_cv_func_printf_long_double" in
-        *yes)
-          case "$gl_cv_func_printf_infinite" in
-            *yes)
-              case "$gl_cv_func_printf_infinite_long_double" in
-                *yes)
-                  case "$gl_cv_func_printf_directive_a" in
-                    *yes)
-                      case "$gl_cv_func_printf_directive_f" in
-                        *yes)
-                          case "$gl_cv_func_printf_directive_n" in
-                            *yes)
-                              case "$gl_cv_func_printf_directive_ls" in
-                                *yes)
-                                  case "$gl_cv_func_printf_positions" in
-                                    *yes)
-                                      case "$gl_cv_func_printf_flag_grouping" in
-                                        *yes)
-                                          case "$gl_cv_func_printf_flag_leftadjust" in
-                                            *yes)
-                                              case "$gl_cv_func_printf_flag_zero" in
-                                                *yes)
-                                                  case "$gl_cv_func_printf_precision" in
-                                                    *yes)
-                                                      case "$gl_cv_func_printf_enomem" in
-                                                        *yes)
-                                                          # fprintf exists and is
-                                                          # already POSIX compliant.
-                                                          gl_cv_func_fprintf_posix=yes
-                                                          ;;
-                                                      esac
-                                                      ;;
-                                                  esac
-                                                  ;;
-                                              esac
-                                              ;;
-                                          esac
-                                          ;;
-                                      esac
-                                      ;;
-                                  esac
-                                  ;;
-                              esac
-                              ;;
-                          esac
-                          ;;
-                      esac
-                      ;;
-                  esac
-                  ;;
-              esac
-              ;;
-          esac
-          ;;
-      esac
-      ;;
-  esac
-  if test $gl_cv_func_fprintf_posix = no; then
-
-
-
-  case "$gl_cv_func_printf_infinite" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-  case "$gl_cv_func_printf_long_double" in
-    *yes)
-      case "$gl_cv_func_printf_infinite_long_double" in
-        *yes)
-          ;;
-        *)
-
-$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
-
-          ;;
-      esac
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_a" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
-
-      for ac_func in nl_langinfo
-do :
-  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
-if test "x$ac_cv_func_nl_langinfo" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_NL_LANGINFO 1
-_ACEOF
-
-fi
-done
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_f" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_ls" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_grouping" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_leftadjust" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_zero" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_precision" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_enomem" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
-
-  if test $ac_cv_func_vasnprintf = yes; then
-
-$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-
-
-
-
-
-
-  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
-if test "x$ac_cv_type_ptrdiff_t" = xyes; then :
-
-else
-
-$as_echo "#define ptrdiff_t long" >>confdefs.h
-
-
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS fprintf.$ac_objext"
-
-  REPLACE_FPRINTF=1
-
-$as_echo "#define REPLACE_FPRINTF_POSIX 1" >>confdefs.h
-
-  :
-
-  fi
-
-
-
-
-
-
-          GNULIB_FPRINTF_POSIX=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_FPRINTF_POSIX 1" >>confdefs.h
-
-
-
-
-
-
-  if test $gl_cv_func_frexp_no_libm = yes; then
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexp works" >&5
-$as_echo_n "checking whether frexp works... " >&6; }
-if ${gl_cv_func_frexp_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-           netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;;
-           mingw*) # Guess yes with MSVC, no with mingw.
-             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef _MSC_VER
- Good
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Good" >/dev/null 2>&1; then :
-  gl_cv_func_frexp_works="guessing yes"
-else
-  gl_cv_func_frexp_works="guessing no"
-fi
-rm -f conftest*
-
-             ;;
-           *) gl_cv_func_frexp_works="guessing yes" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <float.h>
-#include <math.h>
-#include <string.h>
-#if HAVE_DECL_ALARM
-# include <signal.h>
-# include <unistd.h>
-#endif
-/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
-   ICC 10.0 has a bug when optimizing the expression -zero.
-   The expression -DBL_MIN * DBL_MIN does not work when cross-compiling
-   to PowerPC on Mac OS X 10.5.  */
-#if defined __hpux || defined __sgi || defined __ICC
-static double
-compute_minus_zero (void)
-{
-  return -DBL_MIN * DBL_MIN;
-}
-# define minus_zero compute_minus_zero ()
-#else
-double minus_zero = -0.0;
-#endif
-int main()
-{
-  int result = 0;
-  int i;
-  volatile double x;
-  double zero = 0.0;
-#if HAVE_DECL_ALARM
-  /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite
-     number.  Let the test fail in this case.  */
-  signal (SIGALRM, SIG_DFL);
-  alarm (5);
-#endif
-  /* Test on denormalized numbers.  */
-  for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
-    ;
-  if (x > 0.0)
-    {
-      int exp;
-      double y = frexp (x, &exp);
-      /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022.
-         On NetBSD: y = 0.75. Correct: y = 0.5.  */
-      if (y != 0.5)
-        result |= 1;
-    }
-  /* Test on infinite numbers.  */
-  x = 1.0 / zero;
-  {
-    int exp;
-    double y = frexp (x, &exp);
-    if (y != x)
-      result |= 2;
-  }
-  /* Test on negative zero.  */
-  x = minus_zero;
-  {
-    int exp;
-    double y = frexp (x, &exp);
-    if (memcmp (&y, &x, sizeof x))
-      result |= 4;
-  }
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_frexp_works=yes
-else
-  gl_cv_func_frexp_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_works" >&5
-$as_echo "$gl_cv_func_frexp_works" >&6; }
-
-    case "$gl_cv_func_frexp_works" in
-      *yes) gl_func_frexp_no_libm=yes ;;
-      *)    gl_func_frexp_no_libm=no; REPLACE_FREXP=1 ;;
-    esac
-  else
-    gl_func_frexp_no_libm=no
-        REPLACE_FREXP=1
-  fi
-  if test $gl_func_frexp_no_libm = yes; then
-
-$as_echo "#define HAVE_FREXP_IN_LIBC 1" >>confdefs.h
-
-  fi
-
-  if test $gl_func_frexp_no_libm != yes; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS frexp.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_FREXP=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_FREXP 1" >>confdefs.h
-
-
-
-
-
-
-      ac_fn_c_check_decl "$LINENO" "frexpl" "ac_cv_have_decl_frexpl" "#include <math.h>
-"
-if test "x$ac_cv_have_decl_frexpl" = xyes; then :
-
-else
-  HAVE_DECL_FREXPL=0
-fi
-
-  if test $HAVE_DECL_FREXPL = 1; then
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl() can be used without linking with libm" >&5
-$as_echo_n "checking whether frexpl() can be used without linking with libm... " >&6; }
-if ${gl_cv_func_frexpl_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             long double x;
-int
-main ()
-{
-int e; return frexpl (x, &e) > 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_frexpl_no_libm=yes
-else
-  gl_cv_func_frexpl_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_no_libm" >&5
-$as_echo "$gl_cv_func_frexpl_no_libm" >&6; }
-
-    if test $gl_cv_func_frexpl_no_libm = yes; then
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl works" >&5
-$as_echo_n "checking whether frexpl works... " >&6; }
-if ${gl_cv_func_frexpl_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-           aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*)
-              gl_cv_func_frexpl_works="guessing no";;
-           *) gl_cv_func_frexpl_works="guessing yes";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <float.h>
-#include <math.h>
-/* Override the values of <float.h>, like done in float.in.h.  */
-#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
-# undef LDBL_MIN_EXP
-# define LDBL_MIN_EXP    (-16381)
-#endif
-#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
-# undef LDBL_MIN_EXP
-# define LDBL_MIN_EXP    (-16381)
-#endif
-#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
-# undef LDBL_MIN_EXP
-# define LDBL_MIN_EXP DBL_MIN_EXP
-#endif
-#if defined __sgi && (LDBL_MANT_DIG >= 106)
-# if defined __GNUC__
-#  undef LDBL_MIN_EXP
-#  define LDBL_MIN_EXP DBL_MIN_EXP
-# endif
-#endif
-extern
-#ifdef __cplusplus
-"C"
-#endif
-long double frexpl (long double, int *);
-int main()
-{
-  int result = 0;
-  volatile long double x;
-  /* Test on finite numbers that fails on AIX 5.1.  */
-  x = 16.0L;
-  {
-    int exp = -9999;
-    frexpl (x, &exp);
-    if (exp != 5)
-      result |= 1;
-  }
-  /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl
-     function returns an invalid (incorrectly normalized) value: it returns
-               y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
-     but the correct result is
-          0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 }  */
-  x = 1.01L;
-  {
-    int exp = -9999;
-    long double y = frexpl (x, &exp);
-    if (!(exp == 1 && y == 0.505L))
-      result |= 2;
-  }
-  /* Test on large finite numbers.  This fails on BeOS at i = 16322, while
-     LDBL_MAX_EXP = 16384.
-     In the loop end test, we test x against Infinity, rather than comparing
-     i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP.  */
-  {
-    int i;
-    for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
-      {
-        int exp = -9999;
-        frexpl (x, &exp);
-        if (exp != i)
-          {
-            result |= 4;
-            break;
-          }
-      }
-  }
-  /* Test on denormalized numbers.  */
-  {
-    int i;
-    for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
-      ;
-    if (x > 0.0L)
-      {
-        int exp;
-        long double y = frexpl (x, &exp);
-        /* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
-           exp = -16382, y = 0.5.  On Mac OS X 10.5: exp = -16384, y = 0.5.  */
-        if (exp != LDBL_MIN_EXP - 1)
-          result |= 8;
-      }
-  }
-  /* Test on infinite numbers.  */
-  x = 1.0L / 0.0L;
-  {
-    int exp;
-    long double y = frexpl (x, &exp);
-    if (y != x)
-      result |= 16;
-  }
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_frexpl_works=yes
-else
-  gl_cv_func_frexpl_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_works" >&5
-$as_echo "$gl_cv_func_frexpl_works" >&6; }
-
-      case "$gl_cv_func_frexpl_works" in
-        *yes) gl_func_frexpl_no_libm=yes ;;
-        *)    gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;;
-      esac
-    else
-      gl_func_frexpl_no_libm=no
-            REPLACE_FREXPL=1
-    fi
-    if test $gl_func_frexpl_no_libm = yes; then
-
-$as_echo "#define HAVE_FREXPL_IN_LIBC 1" >>confdefs.h
-
-    fi
-  fi
-
-  if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl_no_libm = no; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS frexpl.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_FREXPL=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_FREXPL 1" >>confdefs.h
-
-
-
-
-
-
-  if test $ac_cv_func_fsync = no; then
-    HAVE_FSYNC=0
-  fi
-
-  if test $HAVE_FSYNC = 0; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS fsync.$ac_objext"
-
-    :
-  fi
-
-
-
-
-
-          GNULIB_FSYNC=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_FSYNC 1" >>confdefs.h
-
-
-
-
-
-
-
-  ac_fn_c_check_decl "$LINENO" "gethrtime" "ac_cv_have_decl_gethrtime" "#include <time.h>
-"
-if test "x$ac_cv_have_decl_gethrtime" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_GETHRTIME $ac_have_decl
-_ACEOF
-
-  LIB_GETHRXTIME=
-  if test $ac_cv_have_decl_gethrtime = no \
-     || test $gl_cv_arithmetic_hrtime_t = no; then
-
-
-
-    if test $ac_cv_func_nanouptime != yes \
-       && { test $ac_cv_have_decl_gethrtime = no \
-            || test $gl_cv_arithmetic_hrtime_t = no; }; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CLOCK_MONOTONIC or CLOCK_REALTIME is defined" >&5
-$as_echo_n "checking whether CLOCK_MONOTONIC or CLOCK_REALTIME is defined... " >&6; }
-if ${gl_cv_have_clock_gettime_macro+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#          include <time.h>
-#          if defined CLOCK_MONOTONIC || defined CLOCK_REALTIME
-            have_clock_gettime_macro
-#          endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "have_clock_gettime_macro" >/dev/null 2>&1; then :
-  gl_cv_have_clock_gettime_macro=yes
-else
-  gl_cv_have_clock_gettime_macro=no
-fi
-rm -f conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_clock_gettime_macro" >&5
-$as_echo "$gl_cv_have_clock_gettime_macro" >&6; }
-      if test $gl_cv_have_clock_gettime_macro = yes; then
-        LIB_GETHRXTIME=$LIB_CLOCK_GETTIME
-      fi
-    fi
-  fi
-
-
-
-
-
-
-
-
-
-
-
-    REPLACE_GETOPT=0
-    if test -n "$gl_replace_getopt"; then
-      REPLACE_GETOPT=1
-    fi
-
-  if test $REPLACE_GETOPT = 1; then
-
-
-  if test $ac_cv_header_sys_cdefs_h = yes; then
-    HAVE_SYS_CDEFS_H=1
-  else
-    HAVE_SYS_CDEFS_H=0
-  fi
-
-
-
-$as_echo "#define __GETOPT_PREFIX rpl_" >>confdefs.h
-
-  GETOPT_H=getopt.h
-  GETOPT_CDEFS_H=getopt-cdefs.h
-
-
-
-  fi
-
-  if test $REPLACE_GETOPT = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS getopt.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS getopt1.$ac_objext"
-
-        GNULIB_GL_UNISTD_H_GETOPT=1
-  fi
-
-
-
-
-  ac_found=0
-  ac_fn_c_check_decl "$LINENO" "program_invocation_name" "ac_cv_have_decl_program_invocation_name" "#include <errno.h>
-"
-if test "x$ac_cv_have_decl_program_invocation_name" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_PROGRAM_INVOCATION_NAME $ac_have_decl
-_ACEOF
-if test $ac_have_decl = 1; then :
-  ac_found=1
-fi
-
-  ac_fn_c_check_decl "$LINENO" "program_invocation_short_name" "ac_cv_have_decl_program_invocation_short_name" "#include <errno.h>
-"
-if test "x$ac_cv_have_decl_program_invocation_short_name" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME $ac_have_decl
-_ACEOF
-if test $ac_have_decl = 1; then :
-  ac_found=1
-fi
-
-  ac_fn_c_check_decl "$LINENO" "__argv" "ac_cv_have_decl___argv" "#include <stdlib.h>
-"
-if test "x$ac_cv_have_decl___argv" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL___ARGV $ac_have_decl
-_ACEOF
-if test $ac_have_decl = 1; then :
-  ac_found=1
-fi
-
-
-  # Incur the cost of this test only if none of the above worked.
-  if test $ac_found = 0; then
-    # On OpenBSD 5.1, using the global __progname variable appears to be
-    # the only way to implement getprogname.
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __progname is defined in default libraries" >&5
-$as_echo_n "checking whether __progname is defined in default libraries... " >&6; }
-if ${gl_cv_var___progname+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-        gl_cv_var___progname=
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-extern char *__progname;
-int
-main ()
-{
-return *__progname;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_var___progname=yes
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_var___progname" >&5
-$as_echo "$gl_cv_var___progname" >&6; }
-    if test "$gl_cv_var___progname" = yes; then
-
-$as_echo "#define HAVE_VAR___PROGNAME 1" >>confdefs.h
-
-    fi
-  fi
-
-
-
-
-  if test $ac_cv_func_getrusage = no; then
-    HAVE_GETRUSAGE=0
-  fi
-
-  if test $HAVE_GETRUSAGE = 0; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS getrusage.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_GETRUSAGE=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_GETRUSAGE 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_gettimeofday_timezone=void
-  if test $ac_cv_func_gettimeofday != yes; then
-    HAVE_GETTIMEOFDAY=0
-  else
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gettimeofday clobbers localtime buffer" >&5
-$as_echo_n "checking whether gettimeofday clobbers localtime buffer... " >&6; }
-if ${gl_cv_func_gettimeofday_clobber+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  # When cross-compiling:
-      case "$host_os" in
-                       # Guess all is fine on glibc systems.
-        *-gnu* | gnu*) gl_cv_func_gettimeofday_clobber="guessing no" ;;
-                       # Guess all is fine on musl systems.
-        *-musl*)       gl_cv_func_gettimeofday_clobber="guessing no" ;;
-                       # Guess no on native Windows.
-        mingw*)        gl_cv_func_gettimeofday_clobber="guessing no" ;;
-                       # If we don't know, obey --enable-cross-guesses.
-        *)             gl_cv_func_gettimeofday_clobber="$gl_cross_guess_inverted" ;;
-      esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-          #include <sys/time.h>
-          #include <time.h>
-          #include <stdlib.h>
-
-int
-main ()
-{
-
-          time_t t = 0;
-          struct tm *lt;
-          struct tm saved_lt;
-          struct timeval tv;
-          lt = localtime (&t);
-          saved_lt = *lt;
-          gettimeofday (&tv, NULL);
-          return memcmp (lt, &saved_lt, sizeof (struct tm)) != 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_gettimeofday_clobber=no
-else
-  gl_cv_func_gettimeofday_clobber=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_gettimeofday_clobber" >&5
-$as_echo "$gl_cv_func_gettimeofday_clobber" >&6; }
-
- case "$gl_cv_func_gettimeofday_clobber" in
-   *yes)
-     REPLACE_GETTIMEOFDAY=1
-
-$as_echo "#define GETTIMEOFDAY_CLOBBERS_LOCALTIME 1" >>confdefs.h
-
-
-
-
-  NEED_LOCALTIME_BUFFER=1
-  REPLACE_GMTIME=1
-  REPLACE_LOCALTIME=1
-
-     ;;
- esac
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettimeofday with POSIX signature" >&5
-$as_echo_n "checking for gettimeofday with POSIX signature... " >&6; }
-if ${gl_cv_func_gettimeofday_posix_signature+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/time.h>
-              struct timeval c;
-              int gettimeofday (struct timeval *restrict, void *restrict);
-
-int
-main ()
-{
-/* glibc uses struct timezone * rather than the POSIX void *
-                 if _GNU_SOURCE is defined.  However, since the only portable
-                 use of gettimeofday uses NULL as the second parameter, and
-                 since the glibc definition is actually more typesafe, it is
-                 not worth wrapping this to get a compliant signature.  */
-              int (*f) (struct timeval *restrict, void *restrict)
-                = gettimeofday;
-              int x = f (&c, 0);
-              return !(x | c.tv_sec | c.tv_usec);
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_func_gettimeofday_posix_signature=yes
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/time.h>
-int gettimeofday (struct timeval *restrict, struct timezone *restrict);
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_func_gettimeofday_posix_signature=almost
-else
-  gl_cv_func_gettimeofday_posix_signature=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_gettimeofday_posix_signature" >&5
-$as_echo "$gl_cv_func_gettimeofday_posix_signature" >&6; }
-    if test $gl_cv_func_gettimeofday_posix_signature = almost; then
-      gl_gettimeofday_timezone='struct timezone'
-    elif test $gl_cv_func_gettimeofday_posix_signature != yes; then
-      REPLACE_GETTIMEOFDAY=1
-    fi
-        if test $REPLACE_STRUCT_TIMEVAL = 1; then
-      REPLACE_GETTIMEOFDAY=1
-    fi
-            case "$host_os" in
-      mingw*) REPLACE_GETTIMEOFDAY=1 ;;
-    esac
-  fi
-
-cat >>confdefs.h <<_ACEOF
-#define GETTIMEOFDAY_TIMEZONE $gl_gettimeofday_timezone
-_ACEOF
-
-
-  if test $HAVE_GETTIMEOFDAY = 0 || test $REPLACE_GETTIMEOFDAY = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS gettimeofday.$ac_objext"
-
-    :
-  fi
-
-
-
-
-
-          GNULIB_GETTIMEOFDAY=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_GETTIMEOFDAY 1" >>confdefs.h
-
-
-
-  # Autoconf 2.61a.99 and earlier don't support linking a file only
-  # in VPATH builds.  But since GNUmakefile is for maintainer use
-  # only, it does not matter if we skip the link with older autoconf.
-  # Automake 1.10.1 and earlier try to remove GNUmakefile in non-VPATH
-  # builds, so use a shell variable to bypass this.
-  GNUmakefile=GNUmakefile
-  ac_config_links="$ac_config_links $GNUmakefile:$GNUmakefile"
-
-
-
-
-
-
-  PRIPTR_PREFIX=
-  if test -n "$STDINT_H"; then
-        PRIPTR_PREFIX='"l"'
-  else
-        for glpfx in '' l ll I64; do
-      case $glpfx in
-        '')  gltype1='int';;
-        l)   gltype1='long int';;
-        ll)  gltype1='long long int';;
-        I64) gltype1='__int64';;
-      esac
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdint.h>
-           extern intptr_t foo;
-           extern $gltype1 foo;
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  PRIPTR_PREFIX='"'$glpfx'"'
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      test -n "$PRIPTR_PREFIX" && break
-    done
-  fi
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether INT32_MAX < INTMAX_MAX" >&5
-$as_echo_n "checking whether INT32_MAX < INTMAX_MAX... " >&6; }
-if ${gl_cv_test_INT32_MAX_LT_INTMAX_MAX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Work also in C++ mode.  */
-            #define __STDC_LIMIT_MACROS 1
-
-            /* Work if build is not clean.  */
-            #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H
-
-            #include <limits.h>
-            #if HAVE_STDINT_H
-             #include <stdint.h>
-            #endif
-
-            #if defined INT32_MAX && defined INTMAX_MAX
-             #define CONDITION (INT32_MAX < INTMAX_MAX)
-            #elif HAVE_LONG_LONG_INT
-             #define CONDITION (sizeof (int) < sizeof (long long int))
-            #else
-             #define CONDITION 0
-            #endif
-            int test[CONDITION ? 1 : -1];
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_test_INT32_MAX_LT_INTMAX_MAX=yes
-else
-  gl_cv_test_INT32_MAX_LT_INTMAX_MAX=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_test_INT32_MAX_LT_INTMAX_MAX" >&5
-$as_echo "$gl_cv_test_INT32_MAX_LT_INTMAX_MAX" >&6; }
-  if test $gl_cv_test_INT32_MAX_LT_INTMAX_MAX = yes; then
-    INT32_MAX_LT_INTMAX_MAX=1;
-  else
-    INT32_MAX_LT_INTMAX_MAX=0;
-  fi
-
-
-  if test $APPLE_UNIVERSAL_BUILD = 0; then
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether INT64_MAX == LONG_MAX" >&5
-$as_echo_n "checking whether INT64_MAX == LONG_MAX... " >&6; }
-if ${gl_cv_test_INT64_MAX_EQ_LONG_MAX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Work also in C++ mode.  */
-            #define __STDC_LIMIT_MACROS 1
-
-            /* Work if build is not clean.  */
-            #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H
-
-            #include <limits.h>
-            #if HAVE_STDINT_H
-             #include <stdint.h>
-            #endif
-
-            #if defined INT64_MAX
-             #define CONDITION (INT64_MAX == LONG_MAX)
-            #elif HAVE_LONG_LONG_INT
-             #define CONDITION (sizeof (long long int) == sizeof (long int))
-            #else
-             #define CONDITION 0
-            #endif
-            int test[CONDITION ? 1 : -1];
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_test_INT64_MAX_EQ_LONG_MAX=yes
-else
-  gl_cv_test_INT64_MAX_EQ_LONG_MAX=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_test_INT64_MAX_EQ_LONG_MAX" >&5
-$as_echo "$gl_cv_test_INT64_MAX_EQ_LONG_MAX" >&6; }
-  if test $gl_cv_test_INT64_MAX_EQ_LONG_MAX = yes; then
-    INT64_MAX_EQ_LONG_MAX=1;
-  else
-    INT64_MAX_EQ_LONG_MAX=0;
-  fi
-
-
-  else
-    INT64_MAX_EQ_LONG_MAX=-1
-  fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UINT32_MAX < UINTMAX_MAX" >&5
-$as_echo_n "checking whether UINT32_MAX < UINTMAX_MAX... " >&6; }
-if ${gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Work also in C++ mode.  */
-            #define __STDC_LIMIT_MACROS 1
-
-            /* Work if build is not clean.  */
-            #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H
-
-            #include <limits.h>
-            #if HAVE_STDINT_H
-             #include <stdint.h>
-            #endif
-
-            #if defined UINT32_MAX && defined UINTMAX_MAX
-             #define CONDITION (UINT32_MAX < UINTMAX_MAX)
-            #elif HAVE_LONG_LONG_INT
-             #define CONDITION (sizeof (unsigned int) < sizeof (unsigned long long int))
-            #else
-             #define CONDITION 0
-            #endif
-            int test[CONDITION ? 1 : -1];
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX=yes
-else
-  gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX" >&5
-$as_echo "$gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX" >&6; }
-  if test $gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX = yes; then
-    UINT32_MAX_LT_UINTMAX_MAX=1;
-  else
-    UINT32_MAX_LT_UINTMAX_MAX=0;
-  fi
-
-
-  if test $APPLE_UNIVERSAL_BUILD = 0; then
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UINT64_MAX == ULONG_MAX" >&5
-$as_echo_n "checking whether UINT64_MAX == ULONG_MAX... " >&6; }
-if ${gl_cv_test_UINT64_MAX_EQ_ULONG_MAX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Work also in C++ mode.  */
-            #define __STDC_LIMIT_MACROS 1
-
-            /* Work if build is not clean.  */
-            #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H
-
-            #include <limits.h>
-            #if HAVE_STDINT_H
-             #include <stdint.h>
-            #endif
-
-            #if defined UINT64_MAX
-             #define CONDITION (UINT64_MAX == ULONG_MAX)
-            #elif HAVE_LONG_LONG_INT
-             #define CONDITION (sizeof (unsigned long long int) == sizeof (unsigned long int))
-            #else
-             #define CONDITION 0
-            #endif
-            int test[CONDITION ? 1 : -1];
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_test_UINT64_MAX_EQ_ULONG_MAX=yes
-else
-  gl_cv_test_UINT64_MAX_EQ_ULONG_MAX=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_test_UINT64_MAX_EQ_ULONG_MAX" >&5
-$as_echo "$gl_cv_test_UINT64_MAX_EQ_ULONG_MAX" >&6; }
-  if test $gl_cv_test_UINT64_MAX_EQ_ULONG_MAX = yes; then
-    UINT64_MAX_EQ_ULONG_MAX=1;
-  else
-    UINT64_MAX_EQ_ULONG_MAX=0;
-  fi
-
-
-  else
-    UINT64_MAX_EQ_ULONG_MAX=-1
-  fi
-
-
-
-
-
-
-
-
-
-  # If we replaced any of the underlying isnan* functions, replace
-  # the isnan macro; it undoubtedly suffers from the same flaws.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan macro works" >&5
-$as_echo_n "checking whether isnan macro works... " >&6; }
-  if test $gl_func_isnanf = yes \
-     && test $gl_func_isnand = yes \
-     && test $gl_func_isnanl = yes; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-    ISNAN_LIBM=
-        case " $ISNAN_LIBM " in
-      *" $ISNANF_LIBM "*) ;;
-      *) ISNAN_LIBM="$ISNAN_LIBM $ISNANF_LIBM" ;;
-    esac
-        case " $ISNAN_LIBM " in
-      *" $ISNAND_LIBM "*) ;;
-      *) ISNAN_LIBM="$ISNAN_LIBM $ISNAND_LIBM" ;;
-    esac
-        case " $ISNAN_LIBM " in
-      *" $ISNANL_LIBM "*) ;;
-      *) ISNAN_LIBM="$ISNAN_LIBM $ISNANL_LIBM" ;;
-    esac
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-        REPLACE_ISNAN=1
-    ISNAN_LIBM=
-  fi
-
-
-
-
-
-
-
-          GNULIB_ISNAN=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_ISNAN 1" >>confdefs.h
-
-
-
-
-
-  ISNAND_LIBM=
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used without linking with libm" >&5
-$as_echo_n "checking whether isnan(double) can be used without linking with libm... " >&6; }
-if ${gl_cv_func_isnand_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             #if __GNUC__ >= 4
-             # undef isnand
-             # define isnand(x) __builtin_isnan ((double)(x))
-             #else
-             # undef isnand
-             # define isnand(x) isnan ((double)(x))
-             #endif
-             double x;
-int
-main ()
-{
-return isnand (x);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_isnand_no_libm=yes
-else
-  gl_cv_func_isnand_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_no_libm" >&5
-$as_echo "$gl_cv_func_isnand_no_libm" >&6; }
-
-  if test $gl_cv_func_isnand_no_libm = no; then
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used with libm" >&5
-$as_echo_n "checking whether isnan(double) can be used with libm... " >&6; }
-if ${gl_cv_func_isnand_in_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      save_LIBS="$LIBS"
-      LIBS="$LIBS -lm"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             #if __GNUC__ >= 4
-             # undef isnand
-             # define isnand(x) __builtin_isnan ((double)(x))
-             #elif defined isnan
-             # undef isnand
-             # define isnand(x) isnan ((double)(x))
-             #endif
-             double x;
-int
-main ()
-{
-return isnand (x);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_isnand_in_libm=yes
-else
-  gl_cv_func_isnand_in_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-      LIBS="$save_LIBS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_in_libm" >&5
-$as_echo "$gl_cv_func_isnand_in_libm" >&6; }
-
-    if test $gl_cv_func_isnand_in_libm = yes; then
-      ISNAND_LIBM=-lm
-    fi
-  fi
-    if test $gl_cv_func_isnand_no_libm = yes \
-     || test $gl_cv_func_isnand_in_libm = yes; then
-    gl_func_isnand=yes
-  else
-    gl_func_isnand=no
-    HAVE_ISNAND=0
-  fi
-
-
-
-
-
-  if test $HAVE_ISNAND = 0 || test $REPLACE_ISNAN = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS isnand.$ac_objext"
-
-
-
-
-  fi
-
-
-
-
-
-          GNULIB_ISNAND=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_ISNAND 1" >>confdefs.h
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used without linking with libm" >&5
-$as_echo_n "checking whether isnan(double) can be used without linking with libm... " >&6; }
-if ${gl_cv_func_isnand_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             #if __GNUC__ >= 4
-             # undef isnand
-             # define isnand(x) __builtin_isnan ((double)(x))
-             #else
-             # undef isnand
-             # define isnand(x) isnan ((double)(x))
-             #endif
-             double x;
-int
-main ()
-{
-return isnand (x);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_isnand_no_libm=yes
-else
-  gl_cv_func_isnand_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_no_libm" >&5
-$as_echo "$gl_cv_func_isnand_no_libm" >&6; }
-
-  gl_func_isnand_no_libm=$gl_cv_func_isnand_no_libm
-  if test $gl_cv_func_isnand_no_libm = yes; then
-
-$as_echo "#define HAVE_ISNAND_IN_LIBC 1" >>confdefs.h
-
-  fi
-
-  if test $gl_func_isnand_no_libm != yes; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS isnand.$ac_objext"
-
-
-
-
-  fi
-
-
-  ISNANF_LIBM=
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used without linking with libm" >&5
-$as_echo_n "checking whether isnan(float) can be used without linking with libm... " >&6; }
-if ${gl_cv_func_isnanf_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             #if __GNUC__ >= 4
-             # undef isnanf
-             # define isnanf(x) __builtin_isnanf ((float)(x))
-             #elif defined isnan
-             # undef isnanf
-             # define isnanf(x) isnan ((float)(x))
-             #endif
-             float x;
-int
-main ()
-{
-return isnanf (x);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_isnanf_no_libm=yes
-else
-  gl_cv_func_isnanf_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_no_libm" >&5
-$as_echo "$gl_cv_func_isnanf_no_libm" >&6; }
-
-  if test $gl_cv_func_isnanf_no_libm = no; then
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used with libm" >&5
-$as_echo_n "checking whether isnan(float) can be used with libm... " >&6; }
-if ${gl_cv_func_isnanf_in_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      save_LIBS="$LIBS"
-      LIBS="$LIBS -lm"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             #if __GNUC__ >= 4
-             # undef isnanf
-             # define isnanf(x) __builtin_isnanf ((float)(x))
-             #elif defined isnan
-             # undef isnanf
-             # define isnanf(x) isnan ((float)(x))
-             #endif
-             float x;
-int
-main ()
-{
-return isnanf (x);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_isnanf_in_libm=yes
-else
-  gl_cv_func_isnanf_in_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-      LIBS="$save_LIBS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_in_libm" >&5
-$as_echo "$gl_cv_func_isnanf_in_libm" >&6; }
-
-    if test $gl_cv_func_isnanf_in_libm = yes; then
-      ISNANF_LIBM=-lm
-    fi
-  fi
-    if test $gl_cv_func_isnanf_no_libm = yes \
-     || test $gl_cv_func_isnanf_in_libm = yes; then
-    save_LIBS="$LIBS"
-    LIBS="$LIBS $ISNANF_LIBM"
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) works" >&5
-$as_echo_n "checking whether isnan(float) works... " >&6; }
-if ${gl_cv_func_isnanf_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-           irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;;
-           mingw*) # Guess yes on mingw, no on MSVC.
-             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef __MINGW32__
- Known
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Known" >/dev/null 2>&1; then :
-  gl_cv_func_isnanf_works="guessing yes"
-else
-  gl_cv_func_isnanf_works="guessing no"
-fi
-rm -f conftest*
-
-             ;;
-           *) gl_cv_func_isnanf_works="guessing yes" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <math.h>
-#if __GNUC__ >= 4
-# undef isnanf
-# define isnanf(x) __builtin_isnanf ((float)(x))
-#elif defined isnan
-# undef isnanf
-# define isnanf(x) isnan ((float)(x))
-#endif
-/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0.  */
-#ifdef __DECC
-static float
-NaN ()
-{
-  static float zero = 0.0f;
-  return zero / zero;
-}
-#else
-# define NaN() (0.0f / 0.0f)
-#endif
-#define NWORDS \
-  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-typedef union { unsigned int word[NWORDS]; float value; } memory_float;
-int main()
-{
-  int result = 0;
-
-  if (isnanf (1.0f / 0.0f))
-    result |= 1;
-
-  if (!isnanf (NaN ()))
-    result |= 2;
-
-#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
-  /* The isnanf function should be immune against changes in the sign bit and
-     in the mantissa bits.  The xor operation twiddles a bit that can only be
-     a sign bit or a mantissa bit.  */
-  if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0)
-    {
-      memory_float m;
-
-      m.value = NaN ();
-      /* Set the bits below the exponent to 01111...111.  */
-      m.word[0] &= -1U << FLT_EXPBIT0_BIT;
-      m.word[0] |= 1U << (FLT_EXPBIT0_BIT - 1) - 1;
-      if (!isnanf (m.value))
-        result |= 4;
-    }
-#endif
-
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_isnanf_works=yes
-else
-  gl_cv_func_isnanf_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_works" >&5
-$as_echo "$gl_cv_func_isnanf_works" >&6; }
-
-    LIBS="$save_LIBS"
-    case "$gl_cv_func_isnanf_works" in
-      *yes) gl_func_isnanf=yes ;;
-      *)    gl_func_isnanf=no; ISNANF_LIBM= ;;
-    esac
-  else
-    gl_func_isnanf=no
-  fi
-  if test $gl_func_isnanf != yes; then
-    HAVE_ISNANF=0
-  fi
-
-
-
-
-
-  if test $HAVE_ISNANF = 0 || test $REPLACE_ISNAN = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS isnanf.$ac_objext"
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5
-$as_echo_n "checking where to find the exponent in a 'float'... " >&6; }
-if ${gl_cv_cc_float_expbit0+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  gl_cv_cc_float_expbit0="word 0 bit 23"
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <float.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#define NWORDS \
-  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-typedef union { float value; unsigned int word[NWORDS]; } memory_float;
-static unsigned int ored_words[NWORDS];
-static unsigned int anded_words[NWORDS];
-static void add_to_ored_words (float x)
-{
-  memory_float m;
-  size_t i;
-  /* Clear it first, in case
-     sizeof (float) < sizeof (memory_float).  */
-  memset (&m, 0, sizeof (memory_float));
-  m.value = x;
-  for (i = 0; i < NWORDS; i++)
-    {
-      ored_words[i] |= m.word[i];
-      anded_words[i] &= m.word[i];
-    }
-}
-int main ()
-{
-  size_t j;
-  FILE *fp = fopen ("conftest.out", "w");
-  if (fp == NULL)
-    return 1;
-  for (j = 0; j < NWORDS; j++)
-    anded_words[j] = ~ (unsigned int) 0;
-  add_to_ored_words (0.25f);
-  add_to_ored_words (0.5f);
-  add_to_ored_words (1.0f);
-  add_to_ored_words (2.0f);
-  add_to_ored_words (4.0f);
-  /* Remove bits that are common (e.g. if representation of the first mantissa
-     bit is explicit).  */
-  for (j = 0; j < NWORDS; j++)
-    ored_words[j] &= ~anded_words[j];
-  /* Now find the nonzero word.  */
-  for (j = 0; j < NWORDS; j++)
-    if (ored_words[j] != 0)
-      break;
-  if (j < NWORDS)
-    {
-      size_t i;
-      for (i = j + 1; i < NWORDS; i++)
-        if (ored_words[i] != 0)
-          {
-            fprintf (fp, "unknown");
-            return (fclose (fp) != 0);
-          }
-      for (i = 0; ; i++)
-        if ((ored_words[j] >> i) & 1)
-          {
-            fprintf (fp, "word %d bit %d", (int) j, (int) i);
-            return (fclose (fp) != 0);
-          }
-    }
-  fprintf (fp, "unknown");
-  return (fclose (fp) != 0);
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_cc_float_expbit0=`cat conftest.out`
-else
-  gl_cv_cc_float_expbit0="unknown"
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      rm -f conftest.out
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5
-$as_echo "$gl_cv_cc_float_expbit0" >&6; }
-  case "$gl_cv_cc_float_expbit0" in
-    word*bit*)
-      word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
-      bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'`
-
-cat >>confdefs.h <<_ACEOF
-#define FLT_EXPBIT0_WORD $word
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define FLT_EXPBIT0_BIT $bit
-_ACEOF
-
-      ;;
-  esac
-
-
-  fi
-
-
-
-
-
-          GNULIB_ISNANF=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_ISNANF 1" >>confdefs.h
-
-
-
-
-
-  ISNANL_LIBM=
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used without linking with libm" >&5
-$as_echo_n "checking whether isnan(long double) can be used without linking with libm... " >&6; }
-if ${gl_cv_func_isnanl_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             #if __GNUC__ >= 4
-             # undef isnanl
-             # define isnanl(x) __builtin_isnanl ((long double)(x))
-             #elif defined isnan
-             # undef isnanl
-             # define isnanl(x) isnan ((long double)(x))
-             #endif
-             long double x;
-int
-main ()
-{
-return isnanl (x);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_isnanl_no_libm=yes
-else
-  gl_cv_func_isnanl_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_no_libm" >&5
-$as_echo "$gl_cv_func_isnanl_no_libm" >&6; }
-
-  if test $gl_cv_func_isnanl_no_libm = no; then
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used with libm" >&5
-$as_echo_n "checking whether isnan(long double) can be used with libm... " >&6; }
-if ${gl_cv_func_isnanl_in_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      save_LIBS="$LIBS"
-      LIBS="$LIBS -lm"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             #if __GNUC__ >= 4
-             # undef isnanl
-             # define isnanl(x) __builtin_isnanl ((long double)(x))
-             #elif defined isnan
-             # undef isnanl
-             # define isnanl(x) isnan ((long double)(x))
-             #endif
-             long double x;
-int
-main ()
-{
-return isnanl (x);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_isnanl_in_libm=yes
-else
-  gl_cv_func_isnanl_in_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-      LIBS="$save_LIBS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_in_libm" >&5
-$as_echo "$gl_cv_func_isnanl_in_libm" >&6; }
-
-    if test $gl_cv_func_isnanl_in_libm = yes; then
-      ISNANL_LIBM=-lm
-    fi
-  fi
-    if test $gl_cv_func_isnanl_no_libm = yes \
-     || test $gl_cv_func_isnanl_in_libm = yes; then
-    save_LIBS="$LIBS"
-    LIBS="$LIBS $ISNANL_LIBM"
-
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnanl works" >&5
-$as_echo_n "checking whether isnanl works... " >&6; }
-if ${gl_cv_func_isnanl_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-           mingw*) # Guess yes on mingw, no on MSVC.
-             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef __MINGW32__
- Known
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Known" >/dev/null 2>&1; then :
-  gl_cv_func_isnanl_works="guessing yes"
-else
-  gl_cv_func_isnanl_works="guessing no"
-fi
-rm -f conftest*
-
-             ;;
-           *) gl_cv_func_isnanl_works="guessing yes" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <float.h>
-#include <limits.h>
-#include <math.h>
-#if __GNUC__ >= 4
-# undef isnanl
-# define isnanl(x) __builtin_isnanl ((long double)(x))
-#elif defined isnan
-# undef isnanl
-# define isnanl(x) isnan ((long double)(x))
-#endif
-#define NWORDS \
-  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-typedef union { unsigned int word[NWORDS]; long double value; }
-        memory_long_double;
-/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
-   runtime type conversion.  */
-#ifdef __sgi
-static long double NaNl ()
-{
-  double zero = 0.0;
-  return zero / zero;
-}
-#else
-# define NaNl() (0.0L / 0.0L)
-#endif
-int main ()
-{
-  int result = 0;
-
-  if (!isnanl (NaNl ()))
-    result |= 1;
-
-  {
-    memory_long_double m;
-    unsigned int i;
-
-    /* The isnanl function should be immune against changes in the sign bit and
-       in the mantissa bits.  The xor operation twiddles a bit that can only be
-       a sign bit or a mantissa bit (since the exponent never extends to
-       bit 31).  */
-    m.value = NaNl ();
-    m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
-    for (i = 0; i < NWORDS; i++)
-      m.word[i] |= 1;
-    if (!isnanl (m.value))
-      result |= 1;
-  }
-
-#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
-/* Representation of an 80-bit 'long double' as an initializer for a sequence
-   of 'unsigned int' words.  */
-# ifdef WORDS_BIGENDIAN
-#  define LDBL80_WORDS(exponent,manthi,mantlo) \
-     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
-       ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16),   \
-       (unsigned int) (mantlo) << 16                                        \
-     }
-# else
-#  define LDBL80_WORDS(exponent,manthi,mantlo) \
-     { mantlo, manthi, exponent }
-# endif
-  { /* Quiet NaN.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
-    if (!isnanl (x.value))
-      result |= 2;
-  }
-  {
-    /* Signalling NaN.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
-    if (!isnanl (x.value))
-      result |= 2;
-  }
-  /* isnanl should return something even for noncanonical values.  */
-  { /* Pseudo-NaN.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    if (isnanl (x.value) && !isnanl (x.value))
-      result |= 4;
-  }
-  { /* Pseudo-Infinity.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    if (isnanl (x.value) && !isnanl (x.value))
-      result |= 8;
-  }
-  { /* Pseudo-Zero.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    if (isnanl (x.value) && !isnanl (x.value))
-      result |= 16;
-  }
-  { /* Unnormalized number.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    if (isnanl (x.value) && !isnanl (x.value))
-      result |= 32;
-  }
-  { /* Pseudo-Denormal.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    if (isnanl (x.value) && !isnanl (x.value))
-      result |= 64;
-  }
-#endif
-
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_isnanl_works=yes
-else
-  gl_cv_func_isnanl_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_works" >&5
-$as_echo "$gl_cv_func_isnanl_works" >&6; }
-
-    LIBS="$save_LIBS"
-    case "$gl_cv_func_isnanl_works" in
-      *yes) gl_func_isnanl=yes ;;
-      *)    gl_func_isnanl=no; ISNANL_LIBM= ;;
-    esac
-  else
-    gl_func_isnanl=no
-  fi
-  if test $gl_func_isnanl != yes; then
-    HAVE_ISNANL=0
-  fi
-
-
-
-
-
-  if test $HAVE_ISNANL = 0 || test $REPLACE_ISNAN = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS isnanl.$ac_objext"
-
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'long double'" >&5
-$as_echo_n "checking where to find the exponent in a 'long double'... " >&6; }
-if ${gl_cv_cc_long_double_expbit0+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-                              gl_cv_cc_long_double_expbit0="unknown"
-          case "$host_os" in
-            mingw*) # On native Windows (little-endian), we know the result
-                    # in two cases: mingw, MSVC.
-              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef __MINGW32__
- Known
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Known" >/dev/null 2>&1; then :
-  gl_cv_cc_long_double_expbit0="word 2 bit 0"
-fi
-rm -f conftest*
-
-              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef _MSC_VER
- Known
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Known" >/dev/null 2>&1; then :
-  gl_cv_cc_long_double_expbit0="word 1 bit 20"
-fi
-rm -f conftest*
-
-              ;;
-          esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <float.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#define NWORDS \
-  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-typedef union { long double value; unsigned int word[NWORDS]; }
-        memory_long_double;
-static unsigned int ored_words[NWORDS];
-static unsigned int anded_words[NWORDS];
-static void add_to_ored_words (long double x)
-{
-  memory_long_double m;
-  size_t i;
-  /* Clear it first, in case
-     sizeof (long double) < sizeof (memory_long_double).  */
-  memset (&m, 0, sizeof (memory_long_double));
-  m.value = x;
-  for (i = 0; i < NWORDS; i++)
-    {
-      ored_words[i] |= m.word[i];
-      anded_words[i] &= m.word[i];
-    }
-}
-int main ()
-{
-  size_t j;
-  FILE *fp = fopen ("conftest.out", "w");
-  if (fp == NULL)
-    return 1;
-  for (j = 0; j < NWORDS; j++)
-    anded_words[j] = ~ (unsigned int) 0;
-  add_to_ored_words (0.25L);
-  add_to_ored_words (0.5L);
-  add_to_ored_words (1.0L);
-  add_to_ored_words (2.0L);
-  add_to_ored_words (4.0L);
-  /* Remove bits that are common (e.g. if representation of the first mantissa
-     bit is explicit).  */
-  for (j = 0; j < NWORDS; j++)
-    ored_words[j] &= ~anded_words[j];
-  /* Now find the nonzero word.  */
-  for (j = 0; j < NWORDS; j++)
-    if (ored_words[j] != 0)
-      break;
-  if (j < NWORDS)
-    {
-      size_t i;
-      for (i = j + 1; i < NWORDS; i++)
-        if (ored_words[i] != 0)
-          {
-            fprintf (fp, "unknown");
-            return (fclose (fp) != 0);
-          }
-      for (i = 0; ; i++)
-        if ((ored_words[j] >> i) & 1)
-          {
-            fprintf (fp, "word %d bit %d", (int) j, (int) i);
-            return (fclose (fp) != 0);
-          }
-    }
-  fprintf (fp, "unknown");
-  return (fclose (fp) != 0);
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_cc_long_double_expbit0=`cat conftest.out`
-else
-  gl_cv_cc_long_double_expbit0="unknown"
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      rm -f conftest.out
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_expbit0" >&5
-$as_echo "$gl_cv_cc_long_double_expbit0" >&6; }
-  case "$gl_cv_cc_long_double_expbit0" in
-    word*bit*)
-      word=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
-      bit=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word.*bit //'`
-
-cat >>confdefs.h <<_ACEOF
-#define LDBL_EXPBIT0_WORD $word
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define LDBL_EXPBIT0_BIT $bit
-_ACEOF
-
-      ;;
-  esac
-
-
-
-  fi
-
-
-
-
-
-          GNULIB_ISNANL=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_ISNANL 1" >>confdefs.h
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used without linking with libm" >&5
-$as_echo_n "checking whether isnan(long double) can be used without linking with libm... " >&6; }
-if ${gl_cv_func_isnanl_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             #if __GNUC__ >= 4
-             # undef isnanl
-             # define isnanl(x) __builtin_isnanl ((long double)(x))
-             #elif defined isnan
-             # undef isnanl
-             # define isnanl(x) isnan ((long double)(x))
-             #endif
-             long double x;
-int
-main ()
-{
-return isnanl (x);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_isnanl_no_libm=yes
-else
-  gl_cv_func_isnanl_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_no_libm" >&5
-$as_echo "$gl_cv_func_isnanl_no_libm" >&6; }
-
-  gl_func_isnanl_no_libm=$gl_cv_func_isnanl_no_libm
-  if test $gl_func_isnanl_no_libm = yes; then
-
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnanl works" >&5
-$as_echo_n "checking whether isnanl works... " >&6; }
-if ${gl_cv_func_isnanl_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-           mingw*) # Guess yes on mingw, no on MSVC.
-             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef __MINGW32__
- Known
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Known" >/dev/null 2>&1; then :
-  gl_cv_func_isnanl_works="guessing yes"
-else
-  gl_cv_func_isnanl_works="guessing no"
-fi
-rm -f conftest*
-
-             ;;
-           *) gl_cv_func_isnanl_works="guessing yes" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <float.h>
-#include <limits.h>
-#include <math.h>
-#if __GNUC__ >= 4
-# undef isnanl
-# define isnanl(x) __builtin_isnanl ((long double)(x))
-#elif defined isnan
-# undef isnanl
-# define isnanl(x) isnan ((long double)(x))
-#endif
-#define NWORDS \
-  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-typedef union { unsigned int word[NWORDS]; long double value; }
-        memory_long_double;
-/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
-   runtime type conversion.  */
-#ifdef __sgi
-static long double NaNl ()
-{
-  double zero = 0.0;
-  return zero / zero;
-}
-#else
-# define NaNl() (0.0L / 0.0L)
-#endif
-int main ()
-{
-  int result = 0;
-
-  if (!isnanl (NaNl ()))
-    result |= 1;
-
-  {
-    memory_long_double m;
-    unsigned int i;
-
-    /* The isnanl function should be immune against changes in the sign bit and
-       in the mantissa bits.  The xor operation twiddles a bit that can only be
-       a sign bit or a mantissa bit (since the exponent never extends to
-       bit 31).  */
-    m.value = NaNl ();
-    m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
-    for (i = 0; i < NWORDS; i++)
-      m.word[i] |= 1;
-    if (!isnanl (m.value))
-      result |= 1;
-  }
-
-#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
-/* Representation of an 80-bit 'long double' as an initializer for a sequence
-   of 'unsigned int' words.  */
-# ifdef WORDS_BIGENDIAN
-#  define LDBL80_WORDS(exponent,manthi,mantlo) \
-     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
-       ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16),   \
-       (unsigned int) (mantlo) << 16                                        \
-     }
-# else
-#  define LDBL80_WORDS(exponent,manthi,mantlo) \
-     { mantlo, manthi, exponent }
-# endif
-  { /* Quiet NaN.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
-    if (!isnanl (x.value))
-      result |= 2;
-  }
-  {
-    /* Signalling NaN.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
-    if (!isnanl (x.value))
-      result |= 2;
-  }
-  /* isnanl should return something even for noncanonical values.  */
-  { /* Pseudo-NaN.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    if (isnanl (x.value) && !isnanl (x.value))
-      result |= 4;
-  }
-  { /* Pseudo-Infinity.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    if (isnanl (x.value) && !isnanl (x.value))
-      result |= 8;
-  }
-  { /* Pseudo-Zero.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    if (isnanl (x.value) && !isnanl (x.value))
-      result |= 16;
-  }
-  { /* Unnormalized number.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    if (isnanl (x.value) && !isnanl (x.value))
-      result |= 32;
-  }
-  { /* Pseudo-Denormal.  */
-    static memory_long_double x =
-      { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    if (isnanl (x.value) && !isnanl (x.value))
-      result |= 64;
-  }
-#endif
-
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_isnanl_works=yes
-else
-  gl_cv_func_isnanl_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_works" >&5
-$as_echo "$gl_cv_func_isnanl_works" >&6; }
-
-    case "$gl_cv_func_isnanl_works" in
-      *yes) ;;
-      *)    gl_func_isnanl_no_libm=no ;;
-    esac
-  fi
-  if test $gl_func_isnanl_no_libm = yes; then
-
-$as_echo "#define HAVE_ISNANL_IN_LIBC 1" >>confdefs.h
-
-  fi
-
-  if test $gl_func_isnanl_no_libm != yes; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS isnanl.$ac_objext"
-
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'long double'" >&5
-$as_echo_n "checking where to find the exponent in a 'long double'... " >&6; }
-if ${gl_cv_cc_long_double_expbit0+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-                              gl_cv_cc_long_double_expbit0="unknown"
-          case "$host_os" in
-            mingw*) # On native Windows (little-endian), we know the result
-                    # in two cases: mingw, MSVC.
-              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef __MINGW32__
- Known
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Known" >/dev/null 2>&1; then :
-  gl_cv_cc_long_double_expbit0="word 2 bit 0"
-fi
-rm -f conftest*
-
-              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef _MSC_VER
- Known
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Known" >/dev/null 2>&1; then :
-  gl_cv_cc_long_double_expbit0="word 1 bit 20"
-fi
-rm -f conftest*
-
-              ;;
-          esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <float.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#define NWORDS \
-  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-typedef union { long double value; unsigned int word[NWORDS]; }
-        memory_long_double;
-static unsigned int ored_words[NWORDS];
-static unsigned int anded_words[NWORDS];
-static void add_to_ored_words (long double x)
-{
-  memory_long_double m;
-  size_t i;
-  /* Clear it first, in case
-     sizeof (long double) < sizeof (memory_long_double).  */
-  memset (&m, 0, sizeof (memory_long_double));
-  m.value = x;
-  for (i = 0; i < NWORDS; i++)
-    {
-      ored_words[i] |= m.word[i];
-      anded_words[i] &= m.word[i];
-    }
-}
-int main ()
-{
-  size_t j;
-  FILE *fp = fopen ("conftest.out", "w");
-  if (fp == NULL)
-    return 1;
-  for (j = 0; j < NWORDS; j++)
-    anded_words[j] = ~ (unsigned int) 0;
-  add_to_ored_words (0.25L);
-  add_to_ored_words (0.5L);
-  add_to_ored_words (1.0L);
-  add_to_ored_words (2.0L);
-  add_to_ored_words (4.0L);
-  /* Remove bits that are common (e.g. if representation of the first mantissa
-     bit is explicit).  */
-  for (j = 0; j < NWORDS; j++)
-    ored_words[j] &= ~anded_words[j];
-  /* Now find the nonzero word.  */
-  for (j = 0; j < NWORDS; j++)
-    if (ored_words[j] != 0)
-      break;
-  if (j < NWORDS)
-    {
-      size_t i;
-      for (i = j + 1; i < NWORDS; i++)
-        if (ored_words[i] != 0)
-          {
-            fprintf (fp, "unknown");
-            return (fclose (fp) != 0);
-          }
-      for (i = 0; ; i++)
-        if ((ored_words[j] >> i) & 1)
-          {
-            fprintf (fp, "word %d bit %d", (int) j, (int) i);
-            return (fclose (fp) != 0);
-          }
-    }
-  fprintf (fp, "unknown");
-  return (fclose (fp) != 0);
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_cc_long_double_expbit0=`cat conftest.out`
-else
-  gl_cv_cc_long_double_expbit0="unknown"
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      rm -f conftest.out
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_expbit0" >&5
-$as_echo "$gl_cv_cc_long_double_expbit0" >&6; }
-  case "$gl_cv_cc_long_double_expbit0" in
-    word*bit*)
-      word=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
-      bit=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word.*bit //'`
-
-cat >>confdefs.h <<_ACEOF
-#define LDBL_EXPBIT0_WORD $word
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define LDBL_EXPBIT0_BIT $bit
-_ACEOF
-
-      ;;
-  esac
-
-
-
-  fi
-
-
-
-
-
-  ac_fn_c_check_decl "$LINENO" "iswblank" "ac_cv_have_decl_iswblank" "
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
-   before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-#include <wctype.h>
-
-"
-if test "x$ac_cv_have_decl_iswblank" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_ISWBLANK $ac_have_decl
-_ACEOF
-
-  if test $ac_cv_func_iswblank = no; then
-    HAVE_ISWBLANK=0
-    if test $ac_cv_have_decl_iswblank = yes; then
-      REPLACE_ISWBLANK=1
-    fi
-  fi
-  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
-        :
-  else
-    if test $HAVE_ISWBLANK = 0 || test $REPLACE_ISWBLANK = 1; then
-            :
-    fi
-  fi
-
-
-  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
-    :
-  else
-    if test $HAVE_ISWBLANK = 0 || test $REPLACE_ISWBLANK = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS iswblank.$ac_objext"
-
-    fi
-  fi
-
-
-
-
-
-          GNULIB_ISWBLANK=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_ISWBLANK 1" >>confdefs.h
-
-
-
-  # You need to invoke gt_JAVACOMP yourself, possibly with arguments.
-  ac_config_files="$ac_config_files javacomp.sh:build-aux/javacomp.sh.in"
-
-  # You need to invoke gt_JAVAEXEC yourself, possibly with arguments.
-  ac_config_files="$ac_config_files javaexec.sh:build-aux/javaexec.sh.in"
-
-
-
-
-
-
-
-
-      ac_fn_c_check_decl "$LINENO" "ldexpl" "ac_cv_have_decl_ldexpl" "#include <math.h>
-"
-if test "x$ac_cv_have_decl_ldexpl" = xyes; then :
-
-else
-  HAVE_DECL_LDEXPL=0
-fi
-
-
-  LDEXPL_LIBM=
-  if test $HAVE_DECL_LDEXPL = 1; then
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexpl() can be used without linking with libm" >&5
-$as_echo_n "checking whether ldexpl() can be used without linking with libm... " >&6; }
-if ${gl_cv_func_ldexpl_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             long double x;
-int
-main ()
-{
-return ldexpl (x, -1) > 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_ldexpl_no_libm=yes
-else
-  gl_cv_func_ldexpl_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_no_libm" >&5
-$as_echo "$gl_cv_func_ldexpl_no_libm" >&6; }
-
-    if test $gl_cv_func_ldexpl_no_libm = no; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexpl() can be used with libm" >&5
-$as_echo_n "checking whether ldexpl() can be used with libm... " >&6; }
-if ${gl_cv_func_ldexpl_in_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-          save_LIBS="$LIBS"
-          LIBS="$LIBS -lm"
-          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-                 long double x;
-int
-main ()
-{
-return ldexpl (x, -1) > 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_ldexpl_in_libm=yes
-else
-  gl_cv_func_ldexpl_in_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-          LIBS="$save_LIBS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_in_libm" >&5
-$as_echo "$gl_cv_func_ldexpl_in_libm" >&6; }
-      if test $gl_cv_func_ldexpl_in_libm = yes; then
-        LDEXPL_LIBM=-lm
-      fi
-    fi
-    if test $gl_cv_func_ldexpl_no_libm = yes \
-       || test $gl_cv_func_ldexpl_in_libm = yes; then
-      save_LIBS="$LIBS"
-      LIBS="$LIBS $LDEXPL_LIBM"
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexpl works" >&5
-$as_echo_n "checking whether ldexpl works... " >&6; }
-if ${gl_cv_func_ldexpl_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-           aix | aix[3-6]*) gl_cv_func_ldexpl_works="guessing no" ;;
-                            # Guess yes on native Windows.
-           mingw*)          gl_cv_func_ldexpl_works="guessing yes" ;;
-           *)               gl_cv_func_ldexpl_works="guessing yes" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <math.h>
-extern
-#ifdef __cplusplus
-"C"
-#endif
-long double ldexpl (long double, int);
-int main()
-{
-  int result = 0;
-  {
-    volatile long double x = 1.0;
-    volatile long double y = ldexpl (x, -1);
-    if (y != 0.5L)
-      result |= 1;
-  }
-  {
-    volatile long double x = 1.73205L;
-    volatile long double y = ldexpl (x, 0);
-    if (y != x)
-      result |= 2;
-  }
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_ldexpl_works=yes
-else
-  gl_cv_func_ldexpl_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_works" >&5
-$as_echo "$gl_cv_func_ldexpl_works" >&6; }
-
-      LIBS="$save_LIBS"
-      case "$gl_cv_func_ldexpl_works" in
-        *yes) gl_func_ldexpl=yes ;;
-        *)    gl_func_ldexpl=no; REPLACE_LDEXPL=1 ;;
-      esac
-    else
-      gl_func_ldexpl=no
-    fi
-    if test $gl_func_ldexpl = yes; then
-
-$as_echo "#define HAVE_LDEXPL 1" >>confdefs.h
-
-    fi
-  fi
-  if test $HAVE_DECL_LDEXPL = 0 || test $gl_func_ldexpl = no; then
-        if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
-
-      LDEXPL_LIBM="$LDEXP_LIBM"
-    else
-      LDEXPL_LIBM="$ISNANL_LIBM"
-    fi
-  fi
-
-
-  if test $HAVE_DECL_LDEXPL = 0 || test $gl_func_ldexpl = no; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS ldexpl.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_LDEXPL=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_LDEXPL 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 
 
     use_additional=yes
@@ -29058,7 +9669,8 @@
 
 
 # Check whether --with-libtextstyle-prefix was given.
-if test "${with_libtextstyle_prefix+set}" = set; then :
+if test ${with_libtextstyle_prefix+y}
+then :
   withval=$with_libtextstyle_prefix;
     if test "X$withval" = "Xno"; then
       use_additional=no
@@ -29467,7 +10079,14 @@
                     fi
                     ;;
                   -l*)
-                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                                                                                                                                                                dep=`echo "X$dep" | sed -e 's/^X-l//'`
+                    if test "X$dep" != Xc \
+                       || case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) false ;;
+                            *)                          true ;;
+                          esac; then
+                      names_next_round="$names_next_round $dep"
+                    fi
                     ;;
                   *.la)
                                                                                 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
@@ -29544,11 +10163,12 @@
   done
 
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libtextstyle" >&5
-$as_echo_n "checking for libtextstyle... " >&6; }
-if ${ac_cv_libtextstyle+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libtextstyle" >&5
+printf %s "checking for libtextstyle... " >&6; }
+if test ${ac_cv_libtextstyle+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
     ac_save_LIBS="$LIBS"
                                 case " $LIBTEXTSTYLE" in
@@ -29559,34 +10179,35 @@
 /* end confdefs.h.  */
 #include <textstyle.h>
 int
-main ()
+main (void)
 {
-term_styled_ostream_create(1,"",TTYCTL_AUTO,"");
+$snippet
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
   ac_cv_libtextstyle=yes
-else
+else $as_nop
   ac_cv_libtextstyle='no'
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
     LIBS="$ac_save_LIBS"
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libtextstyle" >&5
-$as_echo "$ac_cv_libtextstyle" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libtextstyle" >&5
+printf "%s\n" "$ac_cv_libtextstyle" >&6; }
   if test "$ac_cv_libtextstyle" = yes; then
     HAVE_LIBTEXTSTYLE=yes
 
-$as_echo "#define HAVE_LIBTEXTSTYLE 1" >>confdefs.h
+printf "%s\n" "#define HAVE_LIBTEXTSTYLE 1" >>confdefs.h
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libtextstyle" >&5
-$as_echo_n "checking how to link with libtextstyle... " >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBTEXTSTYLE" >&5
-$as_echo "$LIBTEXTSTYLE" >&6; }
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libtextstyle" >&5
+printf %s "checking how to link with libtextstyle... " >&6; }
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBTEXTSTYLE" >&5
+printf "%s\n" "$LIBTEXTSTYLE" >&6; }
   else
     HAVE_LIBTEXTSTYLE=no
             CPPFLAGS="$ac_save_CPPFLAGS"
@@ -29602,6 +10223,70 @@
 
 
 
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+printf %s "checking for inline... " >&6; }
+if test ${ac_cv_c_inline+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo (void) {return 0; }
+$ac_kw foo_t foo (void) {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+  test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+printf "%s\n" "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  *)
+    case $ac_cv_c_inline in
+      no) ac_val=;;
+      *) ac_val=$ac_cv_c_inline;;
+    esac
+    cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+    ;;
+esac
+
+ac_func=
+for ac_item in $ac_func_c_list
+do
+  if test $ac_func; then
+    ac_fn_c_check_func "$LINENO" $ac_func ac_cv_func_$ac_func
+    if eval test \"x\$ac_cv_func_$ac_func\" = xyes; then
+      echo "#define $ac_item 1" >> confdefs.h
+    fi
+    ac_func=
+  else
+    ac_func=$ac_item
+  fi
+done
+
+
+
+
+
+
+
 
 
   if test $HAVE_LIBTEXTSTYLE = yes; then
@@ -29622,5894 +10307,5416 @@
 
 
 
+# Gnulib uses '#pragma GCC diagnostic push' to silence some
+# warnings, but older gcc doesn't support this.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pragma GCC diagnostic push works" >&5
+printf %s "checking whether pragma GCC diagnostic push works... " >&6; }
+if test ${lv_cv_gcc_pragma_push_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
-
-
-    LOCALCHARSET_TESTS_ENVIRONMENT=
-
-
-
-  if test "$gl_threads_api" = posix; then
-    # OSF/1 4.0 and Mac OS X 10.1 lack the pthread_rwlock_t type and the
-    # pthread_rwlock_* functions.
-    has_rwlock=false
-    ac_fn_c_check_type "$LINENO" "pthread_rwlock_t" "ac_cv_type_pthread_rwlock_t" "#include <pthread.h>
-"
-if test "x$ac_cv_type_pthread_rwlock_t" = xyes; then :
-  has_rwlock=true
-
-$as_echo "#define HAVE_PTHREAD_RWLOCK 1" >>confdefs.h
-
-fi
-
-    if $has_rwlock; then
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthread_rwlock_rdlock prefers a writer to a reader" >&5
-$as_echo_n "checking whether pthread_rwlock_rdlock prefers a writer to a reader... " >&6; }
-if ${gl_cv_pthread_rwlock_rdlock_prefer_writer+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  save_LIBS="$LIBS"
-     LIBS="$LIBS $LIBMULTITHREAD"
-     if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                         # Guess no on glibc systems.
-          *-gnu* | gnu*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;;
-                         # Guess no on musl systems.
-          *-musl*)       gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;;
-                         # Guess no on bionic systems.
-          *-android*)    gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;;
-                         # Guess yes on native Windows with the mingw-w64 winpthreads library.
-                         # Guess no on native Windows with the gnulib windows-rwlock module.
-          mingw*)        if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
-                           gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing yes"
-                         else
-                           gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no"
-                         fi
-                         ;;
-                         # If we don't know, obey --enable-cross-guesses.
-          *)             gl_cv_pthread_rwlock_rdlock_prefer_writer="$gl_cross_guess_normal" ;;
-         esac
-
-else
+  save_CFLAGS=$CFLAGS
+  CFLAGS='-Wunknown-pragmas -Werror'
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-#include <errno.h>
-#include <pthread.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#define SUCCEED() exit (0)
-#define FAILURE() exit (1)
-#define UNEXPECTED(n) (exit (10 + (n)))
-
-/* The main thread creates the waiting writer and the requesting reader threads
-   in the default way; this guarantees that they have the same priority.
-   We can reuse the main thread as first reader thread.  */
-
-static pthread_rwlock_t lock;
-static pthread_t reader1;
-static pthread_t writer;
-static pthread_t reader2;
-static pthread_t timer;
-/* Used to pass control from writer to reader2 and from reader2 to timer,
-   as in a relay race.
-   Passing control from one running thread to another running thread
-   is most likely faster than to create the second thread.  */
-static pthread_mutex_t baton;
-
-static void *
-timer_func (void *ignored)
-{
-  /* Step 13 (can be before or after step 12):
-     The timer thread takes the baton, then waits a moment to make sure
-     it can tell whether the second reader thread is blocked at step 12.  */
-  if (pthread_mutex_lock (&baton))
-    UNEXPECTED (13);
-  usleep (100000);
-  /* By the time we get here, it's clear that the second reader thread is
-     blocked at step 12.  This is the desired behaviour.  */
-  SUCCEED ();
-}
-
-static void *
-reader2_func (void *ignored)
-{
-  int err;
-
-  /* Step 8 (can be before or after step 7):
-     The second reader thread takes the baton, then waits a moment to make sure
-     the writer thread has reached step 7.  */
-  if (pthread_mutex_lock (&baton))
-    UNEXPECTED (8);
-  usleep (100000);
-  /* Step 9: The second reader thread requests the lock.  */
-  err = pthread_rwlock_tryrdlock (&lock);
-  if (err == 0)
-    FAILURE ();
-  else if (err != EBUSY)
-    UNEXPECTED (9);
-  /* Step 10: Launch a timer, to test whether the next call blocks.  */
-  if (pthread_create (&timer, NULL, timer_func, NULL))
-    UNEXPECTED (10);
-  /* Step 11: Release the baton.  */
-  if (pthread_mutex_unlock (&baton))
-    UNEXPECTED (11);
-  /* Step 12: The second reader thread requests the lock.  */
-  err = pthread_rwlock_rdlock (&lock);
-  if (err == 0)
-    FAILURE ();
-  else
-    UNEXPECTED (12);
-}
-
-static void *
-writer_func (void *ignored)
-{
-  /* Step 4: Take the baton, so that the second reader thread does not go ahead
-     too early.  */
-  if (pthread_mutex_lock (&baton))
-    UNEXPECTED (4);
-  /* Step 5: Create the second reader thread.  */
-  if (pthread_create (&reader2, NULL, reader2_func, NULL))
-    UNEXPECTED (5);
-  /* Step 6: Release the baton.  */
-  if (pthread_mutex_unlock (&baton))
-    UNEXPECTED (6);
-  /* Step 7: The writer thread requests the lock.  */
-  if (pthread_rwlock_wrlock (&lock))
-    UNEXPECTED (7);
-  return NULL;
-}
+    #pragma GCC diagnostic push
+    #pragma GCC diagnostic pop
 
 int
-main ()
+main (void)
 {
-  reader1 = pthread_self ();
-
-  /* Step 1: The main thread initializes the lock and the baton.  */
-  if (pthread_rwlock_init (&lock, NULL))
-    UNEXPECTED (1);
-  if (pthread_mutex_init (&baton, NULL))
-    UNEXPECTED (1);
-  /* Step 2: The main thread acquires the lock as a reader.  */
-  if (pthread_rwlock_rdlock (&lock))
-    UNEXPECTED (2);
-  /* Step 3: Create the writer thread.  */
-  if (pthread_create (&writer, NULL, writer_func, NULL))
-    UNEXPECTED (3);
-  /* Job done.  Go to sleep.  */
-  for (;;)
-    {
-      sleep (1);
-    }
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_pthread_rwlock_rdlock_prefer_writer=yes
-else
-  gl_cv_pthread_rwlock_rdlock_prefer_writer=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-     LIBS="$save_LIBS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_pthread_rwlock_rdlock_prefer_writer" >&5
-$as_echo "$gl_cv_pthread_rwlock_rdlock_prefer_writer" >&6; }
-  case "$gl_cv_pthread_rwlock_rdlock_prefer_writer" in
-    *yes)
-
-$as_echo "#define HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER 1" >>confdefs.h
-
-      ;;
-  esac
-
-    fi
-    # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro.
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-      #include <pthread.h>
-int
-main ()
-{
-
-#if __FreeBSD__ == 4
-error "No, in FreeBSD 4.0 recursive mutexes actually don't work."
-#elif (defined __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ \
-       && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)
-error "No, in Mac OS X < 10.7 recursive mutexes actually don't work."
-#else
-int x = (int)PTHREAD_MUTEX_RECURSIVE;
-return !x;
-#endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
+  lv_cv_gcc_pragma_push_works=yes
+else $as_nop
+  lv_cv_gcc_pragma_push_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+  CFLAGS=$save_CFLAGS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lv_cv_gcc_pragma_push_works" >&5
+printf "%s\n" "$lv_cv_gcc_pragma_push_works" >&6; }
 
-$as_echo "#define HAVE_PTHREAD_MUTEX_RECURSIVE 1" >>confdefs.h
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Werror -Wunknown-warning-option" >&5
+printf %s "checking whether C++ compiler handles -Werror -Wunknown-warning-option... " >&6; }
+if test ${gl_cv_warn_cxx__Werror__Wunknown_warning_option+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CXXFLAGS"
+  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Werror -Wunknown-warning-option"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  gl_cv_warn_cxx__Werror__Wunknown_warning_option=yes
+else $as_nop
+  gl_cv_warn_cxx__Werror__Wunknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS="$gl_save_compiler_FLAGS"
 
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  fi
-  :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Werror__Wunknown_warning_option" >&5
+printf "%s\n" "$gl_cv_warn_cxx__Werror__Wunknown_warning_option" >&6; }
+if test "x$gl_cv_warn_cxx__Werror__Wunknown_warning_option" = xyes
+then :
+  gl_unknown_warnings_are_errors='-Wunknown-warning-option -Werror'
+else $as_nop
+  gl_unknown_warnings_are_errors=
+fi
+
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
 
 
-cat >>confdefs.h <<_ACEOF
-#define GNULIB_LOCK 1
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -fno-exceptions" >&5
+printf %s "checking whether C++ compiler handles -fno-exceptions... " >&6; }
+if test ${gl_cv_warn_cxx__fno_exceptions+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CXXFLAGS"
+  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -fno-exceptions"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
 _ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  gl_cv_warn_cxx__fno_exceptions=yes
+else $as_nop
+  gl_cv_warn_cxx__fno_exceptions=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__fno_exceptions" >&5
+printf "%s\n" "$gl_cv_warn_cxx__fno_exceptions" >&6; }
+if test "x$gl_cv_warn_cxx__fno_exceptions" = xyes
+then :
+  as_fn_append NO_EXCEPTIONS_CXXFLAGS " -fno-exceptions"
+fi
 
 
 
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+for f in '-std=c++98' '-std=c++98 -stdlib=libc++'
+do
+  as_CACHEVAR=`printf "%s\n" "ax_cv_check_cxxflags__$f" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
+printf %s "checking whether C++ compiler accepts $f... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  ax_check_save_flags=$CXXFLAGS
+  CXXFLAGS="$CXXFLAGS  $f"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
 
 
+int
+main (void)
+{
 
-
-      for ac_header in stdlib.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
-if test "x$ac_cv_header_stdlib_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_STDLIB_H 1
+  ;
+  return 0;
+}
 _ACEOF
-
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  eval "$as_CACHEVAR=yes"
+else $as_nop
+  eval "$as_CACHEVAR=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS=$ax_check_save_flags
+fi
+eval ac_res=\$$as_CACHEVAR
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes
+then :
+  CXX98_CXXFLAGS=$f
+ break
 fi
 
 done
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5
-$as_echo_n "checking for GNU libc compatible malloc... " >&6; }
-if ${ac_cv_func_malloc_0_nonnull+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-          # Guess yes on platforms where we know the result.
-          *-gnu* | gnu* | *-musl* | freebsd* | netbsd* | openbsd* \
-          | hpux* | solaris* | cygwin* | mingw*)
-            ac_cv_func_malloc_0_nonnull="guessing yes" ;;
-          # If we don't know, obey --enable-cross-guesses.
-          *) ac_cv_func_malloc_0_nonnull="$gl_cross_guess_normal" ;;
-        esac
 
-else
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+for f in '-std=c++03' '-std=c++03 -stdlib=libc++'
+do
+  as_CACHEVAR=`printf "%s\n" "ax_cv_check_cxxflags__$f" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
+printf %s "checking whether C++ compiler accepts $f... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  ax_check_save_flags=$CXXFLAGS
+  CXXFLAGS="$CXXFLAGS  $f"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#if defined STDC_HEADERS || defined HAVE_STDLIB_H
-            # include <stdlib.h>
-            #else
-            char *malloc ();
-            #endif
+
+
+
 
 int
-main ()
+main (void)
 {
-char *p = malloc (0);
-            int result = !p;
-            free (p);
-            return result;
+
   ;
   return 0;
 }
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  eval "$as_CACHEVAR=yes"
+else $as_nop
+  eval "$as_CACHEVAR=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS=$ax_check_save_flags
+fi
+eval ac_res=\$$as_CACHEVAR
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes
+then :
+  CXX03_CXXFLAGS=$f
+ break
+fi
+
+done
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+for f in '-std=c++11' '-std=c++11 -stdlib=libc++'
+do
+  as_CACHEVAR=`printf "%s\n" "ax_cv_check_cxxflags__$f" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
+printf %s "checking whether C++ compiler accepts $f... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  ax_check_save_flags=$CXXFLAGS
+  CXXFLAGS="$CXXFLAGS  $f"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+
+  // C++11
+#include <algorithm>
+#include <cassert>
+#include <memory>
+#include <set>
+#include <sstream>
+#include <string>
+#include <utility> // std::swap
+#include <vector>
+
+  template <typename T>
+  struct check
+  {
+    static_assert(sizeof(int) <= sizeof(T), "not big enough");
+  };
+
+  using right_angle_brackets = check<check<bool>>;
+
+  auto f = std::make_shared<std::string>("shared_ptr");
+
+  int a;
+  decltype(a) b;
+
+  typedef check<int> check_type;
+  check_type c;
+  check_type&& cr = static_cast<check_type&&>(c);
+
+  auto d = a;
+
+  // Some versions of libstdc++ do not support std::set::emplace.
+  void foo()
+  {
+    std::set<int> is;
+    is.emplace(42);
+  }
+
+  // Clang++ 3.5, for a while, was unable to process properly
+  // the for-loop because its variable, r, is a typedef...
+  // It failed as follows:
+  //
+  // error: unexpected ':' in nested name specifier; did you mean '::'?
+  //    for (auto r: std::set<int>{1, 2})
+  //               ^
+  //               ::
+  using r = std::set<int>;
+  void bar()
+  {
+    for (int r: std::set<int>{1, 2})
+      continue;
+  }
+
+  // GCC 4.8.2 on Solaris 11.3 does not support to_string.
+  auto e = std::to_string(42);
+
+  // Needed by glr2.cc.
+  void cxx11_vector_data ()
+  {
+    std::vector<int> ints;
+    ints.emplace_back (42);
+    assert (ints.data () == &ints[0]);
+  }
+
+  // Needed by glr2.cc.
+  void cxx11_array_swap ()
+  {
+    int i0[4] = { 1, 2, 3, 4 };
+    int i1[4] = { 5, 6, 7, 8 };
+    std::swap (i0, i1);
+  }
+
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  eval "$as_CACHEVAR=yes"
+else $as_nop
+  eval "$as_CACHEVAR=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS=$ax_check_save_flags
+fi
+eval ac_res=\$$as_CACHEVAR
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes
+then :
+  CXX11_CXXFLAGS=$f
+ break
+fi
+
+done
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+for f in '-std=c++14' '-std=c++14 -stdlib=libc++'
+do
+  as_CACHEVAR=`printf "%s\n" "ax_cv_check_cxxflags__$f" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
+printf %s "checking whether C++ compiler accepts $f... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  ax_check_save_flags=$CXXFLAGS
+  CXXFLAGS="$CXXFLAGS  $f"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+
+  // C++11
+#include <algorithm>
+#include <cassert>
+#include <memory>
+#include <set>
+#include <sstream>
+#include <string>
+#include <utility> // std::swap
+#include <vector>
+
+  template <typename T>
+  struct check
+  {
+    static_assert(sizeof(int) <= sizeof(T), "not big enough");
+  };
+
+  using right_angle_brackets = check<check<bool>>;
+
+  auto f = std::make_shared<std::string>("shared_ptr");
+
+  int a;
+  decltype(a) b;
+
+  typedef check<int> check_type;
+  check_type c;
+  check_type&& cr = static_cast<check_type&&>(c);
+
+  auto d = a;
+
+  // Some versions of libstdc++ do not support std::set::emplace.
+  void foo()
+  {
+    std::set<int> is;
+    is.emplace(42);
+  }
+
+  // Clang++ 3.5, for a while, was unable to process properly
+  // the for-loop because its variable, r, is a typedef...
+  // It failed as follows:
+  //
+  // error: unexpected ':' in nested name specifier; did you mean '::'?
+  //    for (auto r: std::set<int>{1, 2})
+  //               ^
+  //               ::
+  using r = std::set<int>;
+  void bar()
+  {
+    for (int r: std::set<int>{1, 2})
+      continue;
+  }
+
+  // GCC 4.8.2 on Solaris 11.3 does not support to_string.
+  auto e = std::to_string(42);
+
+  // Needed by glr2.cc.
+  void cxx11_vector_data ()
+  {
+    std::vector<int> ints;
+    ints.emplace_back (42);
+    assert (ints.data () == &ints[0]);
+  }
+
+  // Needed by glr2.cc.
+  void cxx11_array_swap ()
+  {
+    int i0[4] = { 1, 2, 3, 4 };
+    int i1[4] = { 5, 6, 7, 8 };
+    std::swap (i0, i1);
+  }
+
+  // C++14
+  void mismatch()
+  {
+    using ints = std::vector<int>;
+    auto v1 = ints{1, 2, 3};
+    auto v2 = ints{1, 2};
+    std::mismatch(std::begin(v1), std::end(v1),
+                  std::begin(v2), std::end(v2));
+  }
+
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  eval "$as_CACHEVAR=yes"
+else $as_nop
+  eval "$as_CACHEVAR=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS=$ax_check_save_flags
+fi
+eval ac_res=\$$as_CACHEVAR
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes
+then :
+  CXX14_CXXFLAGS=$f
+ break
+fi
+
+done
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+for f in '-std=c++17' '-std=c++17 -stdlib=libc++'
+do
+  as_CACHEVAR=`printf "%s\n" "ax_cv_check_cxxflags__$f" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
+printf %s "checking whether C++ compiler accepts $f... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  ax_check_save_flags=$CXXFLAGS
+  CXXFLAGS="$CXXFLAGS  $f"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+
+  // C++11
+#include <algorithm>
+#include <cassert>
+#include <memory>
+#include <set>
+#include <sstream>
+#include <string>
+#include <utility> // std::swap
+#include <vector>
+
+  template <typename T>
+  struct check
+  {
+    static_assert(sizeof(int) <= sizeof(T), "not big enough");
+  };
+
+  using right_angle_brackets = check<check<bool>>;
+
+  auto f = std::make_shared<std::string>("shared_ptr");
+
+  int a;
+  decltype(a) b;
+
+  typedef check<int> check_type;
+  check_type c;
+  check_type&& cr = static_cast<check_type&&>(c);
+
+  auto d = a;
+
+  // Some versions of libstdc++ do not support std::set::emplace.
+  void foo()
+  {
+    std::set<int> is;
+    is.emplace(42);
+  }
+
+  // Clang++ 3.5, for a while, was unable to process properly
+  // the for-loop because its variable, r, is a typedef...
+  // It failed as follows:
+  //
+  // error: unexpected ':' in nested name specifier; did you mean '::'?
+  //    for (auto r: std::set<int>{1, 2})
+  //               ^
+  //               ::
+  using r = std::set<int>;
+  void bar()
+  {
+    for (int r: std::set<int>{1, 2})
+      continue;
+  }
+
+  // GCC 4.8.2 on Solaris 11.3 does not support to_string.
+  auto e = std::to_string(42);
+
+  // Needed by glr2.cc.
+  void cxx11_vector_data ()
+  {
+    std::vector<int> ints;
+    ints.emplace_back (42);
+    assert (ints.data () == &ints[0]);
+  }
+
+  // Needed by glr2.cc.
+  void cxx11_array_swap ()
+  {
+    int i0[4] = { 1, 2, 3, 4 };
+    int i1[4] = { 5, 6, 7, 8 };
+    std::swap (i0, i1);
+  }
+
+  // C++14
+  void mismatch()
+  {
+    using ints = std::vector<int>;
+    auto v1 = ints{1, 2, 3};
+    auto v2 = ints{1, 2};
+    std::mismatch(std::begin(v1), std::end(v1),
+                  std::begin(v2), std::end(v2));
+  }
+
+  // C++17
+  namespace ns1::ns2::ns3 {}
+
+#include <optional>
+  auto opt_string = std::optional<std::string>{};
+  auto out = std::ostringstream{};
+
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  eval "$as_CACHEVAR=yes"
+else $as_nop
+  eval "$as_CACHEVAR=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS=$ax_check_save_flags
+fi
+eval ac_res=\$$as_CACHEVAR
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes
+then :
+  CXX17_CXXFLAGS=$f
+ break
+fi
+
+done
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+for f in '-std=c++20' '-std=c++20 -stdlib=libc++'
+do
+  as_CACHEVAR=`printf "%s\n" "ax_cv_check_cxxflags__$f" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
+printf %s "checking whether C++ compiler accepts $f... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  ax_check_save_flags=$CXXFLAGS
+  CXXFLAGS="$CXXFLAGS  $f"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+
+  // C++11
+#include <algorithm>
+#include <cassert>
+#include <memory>
+#include <set>
+#include <sstream>
+#include <string>
+#include <utility> // std::swap
+#include <vector>
+
+  template <typename T>
+  struct check
+  {
+    static_assert(sizeof(int) <= sizeof(T), "not big enough");
+  };
+
+  using right_angle_brackets = check<check<bool>>;
+
+  auto f = std::make_shared<std::string>("shared_ptr");
+
+  int a;
+  decltype(a) b;
+
+  typedef check<int> check_type;
+  check_type c;
+  check_type&& cr = static_cast<check_type&&>(c);
+
+  auto d = a;
+
+  // Some versions of libstdc++ do not support std::set::emplace.
+  void foo()
+  {
+    std::set<int> is;
+    is.emplace(42);
+  }
+
+  // Clang++ 3.5, for a while, was unable to process properly
+  // the for-loop because its variable, r, is a typedef...
+  // It failed as follows:
+  //
+  // error: unexpected ':' in nested name specifier; did you mean '::'?
+  //    for (auto r: std::set<int>{1, 2})
+  //               ^
+  //               ::
+  using r = std::set<int>;
+  void bar()
+  {
+    for (int r: std::set<int>{1, 2})
+      continue;
+  }
+
+  // GCC 4.8.2 on Solaris 11.3 does not support to_string.
+  auto e = std::to_string(42);
+
+  // Needed by glr2.cc.
+  void cxx11_vector_data ()
+  {
+    std::vector<int> ints;
+    ints.emplace_back (42);
+    assert (ints.data () == &ints[0]);
+  }
+
+  // Needed by glr2.cc.
+  void cxx11_array_swap ()
+  {
+    int i0[4] = { 1, 2, 3, 4 };
+    int i1[4] = { 5, 6, 7, 8 };
+    std::swap (i0, i1);
+  }
+
+  // C++14
+  void mismatch()
+  {
+    using ints = std::vector<int>;
+    auto v1 = ints{1, 2, 3};
+    auto v2 = ints{1, 2};
+    std::mismatch(std::begin(v1), std::end(v1),
+                  std::begin(v2), std::end(v2));
+  }
+
+  // C++17
+  namespace ns1::ns2::ns3 {}
+
+#include <optional>
+  auto opt_string = std::optional<std::string>{};
+  auto out = std::ostringstream{};
+
+  // C++20
+
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  eval "$as_CACHEVAR=yes"
+else $as_nop
+  eval "$as_CACHEVAR=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS=$ax_check_save_flags
+fi
+eval ac_res=\$$as_CACHEVAR
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes
+then :
+  CXX20_CXXFLAGS=$f
+ break
+fi
+
+done
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+for f in '-std=c++2b' '-std=c++2b -stdlib=libc++'
+do
+  as_CACHEVAR=`printf "%s\n" "ax_cv_check_cxxflags__$f" | $as_tr_sh`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
+printf %s "checking whether C++ compiler accepts $f... " >&6; }
+if eval test \${$as_CACHEVAR+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  ax_check_save_flags=$CXXFLAGS
+  CXXFLAGS="$CXXFLAGS  $f"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+
+  // C++11
+#include <algorithm>
+#include <cassert>
+#include <memory>
+#include <set>
+#include <sstream>
+#include <string>
+#include <utility> // std::swap
+#include <vector>
+
+  template <typename T>
+  struct check
+  {
+    static_assert(sizeof(int) <= sizeof(T), "not big enough");
+  };
+
+  using right_angle_brackets = check<check<bool>>;
+
+  auto f = std::make_shared<std::string>("shared_ptr");
+
+  int a;
+  decltype(a) b;
+
+  typedef check<int> check_type;
+  check_type c;
+  check_type&& cr = static_cast<check_type&&>(c);
+
+  auto d = a;
+
+  // Some versions of libstdc++ do not support std::set::emplace.
+  void foo()
+  {
+    std::set<int> is;
+    is.emplace(42);
+  }
+
+  // Clang++ 3.5, for a while, was unable to process properly
+  // the for-loop because its variable, r, is a typedef...
+  // It failed as follows:
+  //
+  // error: unexpected ':' in nested name specifier; did you mean '::'?
+  //    for (auto r: std::set<int>{1, 2})
+  //               ^
+  //               ::
+  using r = std::set<int>;
+  void bar()
+  {
+    for (int r: std::set<int>{1, 2})
+      continue;
+  }
+
+  // GCC 4.8.2 on Solaris 11.3 does not support to_string.
+  auto e = std::to_string(42);
+
+  // Needed by glr2.cc.
+  void cxx11_vector_data ()
+  {
+    std::vector<int> ints;
+    ints.emplace_back (42);
+    assert (ints.data () == &ints[0]);
+  }
+
+  // Needed by glr2.cc.
+  void cxx11_array_swap ()
+  {
+    int i0[4] = { 1, 2, 3, 4 };
+    int i1[4] = { 5, 6, 7, 8 };
+    std::swap (i0, i1);
+  }
+
+  // C++14
+  void mismatch()
+  {
+    using ints = std::vector<int>;
+    auto v1 = ints{1, 2, 3};
+    auto v2 = ints{1, 2};
+    std::mismatch(std::begin(v1), std::end(v1),
+                  std::begin(v2), std::end(v2));
+  }
+
+  // C++17
+  namespace ns1::ns2::ns3 {}
+
+#include <optional>
+  auto opt_string = std::optional<std::string>{};
+  auto out = std::ostringstream{};
+
+  // C++20
+
+  // C++2B
+
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  eval "$as_CACHEVAR=yes"
+else $as_nop
+  eval "$as_CACHEVAR=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS=$ax_check_save_flags
+fi
+eval ac_res=\$$as_CACHEVAR
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes
+then :
+  CXX2B_CXXFLAGS=$f
+ break
+fi
+
+done
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+ if test x"$CXX11_CXXFLAGS" != x; then
+  ENABLE_CXX11_TRUE=
+  ENABLE_CXX11_FALSE='#'
+else
+  ENABLE_CXX11_TRUE='#'
+  ENABLE_CXX11_FALSE=
+fi
+
+ if test x"$CXX14_CXXFLAGS" != x; then
+  ENABLE_CXX14_TRUE=
+  ENABLE_CXX14_FALSE='#'
+else
+  ENABLE_CXX14_TRUE='#'
+  ENABLE_CXX14_FALSE=
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Check whether --enable-gcc-warnings was given.
+if test ${enable_gcc_warnings+y}
+then :
+  enableval=$enable_gcc_warnings; case $enable_gcc_warnings in
+   yes|no) ;;
+   *)  as_fn_error $? "invalid value for --gcc-warnings: $enable_gcc_warnings" "$LINENO" 5;;
+ esac
+else $as_nop
+  enable_gcc_warnings=no
+fi
+
+ if test "$enable_gcc_warnings" = yes; then
+  ENABLE_GCC_WARNINGS_TRUE=
+  ENABLE_GCC_WARNINGS_FALSE='#'
+else
+  ENABLE_GCC_WARNINGS_TRUE='#'
+  ENABLE_GCC_WARNINGS_FALSE=
+fi
+
+if test "$enable_gcc_warnings" = yes; then
+  # -Wno-tautological-constant-out-of-range-compare for Clang 3.3 and
+  # 3.4 on GNU/Linux that choke on intprops.h's INT_MULTIPLY_WRAPV,
+  # etc.
+  #
+  # ICC: -wr188
+  #
+  # 1669  warnings warnings_default =
+  # ../src/complain.c(318): error #188: enumerated type mixed with another type
+  # 1670      Wconflicts_sr | Wconflicts_rr | Wdeprecated | Wother;
+  # 1671      ^
+  # 1672
+  # 1673../src/complain.c(393): error #188: enumerated type mixed with another type
+  # 1674          warnings w = 1 << wbit;
+  # 1675                       ^
+  #
+  # ICC: -wr3179
+  #
+  # char const *usefulness
+  #   = rule_useless_in_grammar_p (&rules[r]) ? "useless-in-grammar"
+  #   : rule_useless_in_parser_p (&rules[r])  ? "useless-in-parser"
+  #   :                                         "useful";
+  #
+  # gives
+  #
+  # error #3179: deprecated conversion of string literal to char* (should be const char*)
+  #
+  # ICC: -wr2259 (that's in C, in spite of what the error messages which seems to be about C++).
+  # error #2259: non-pointer conversion from "int" to "yybool={signed char}" may lose significant bits
+  #   yybool yynormal YY_ATTRIBUTE_UNUSED = yystackp->yysplitPoint == YY_NULLPTR;
+  #                                         ^
+  warn_common='-Wall -Wextra
+    -Wcast-align -Wchar-subscripts
+    -fparse-all-comments -Wdocumentation
+    -Wformat -Wimplicit-fallthrough -Wmismatched-dealloc -Wnull-dereference
+    -Wno-sign-compare -Wno-tautological-constant-out-of-range-compare
+    -Wpointer-arith -Wshadow -Wstrict-aliasing
+    -Wwrite-strings
+    -wr188 -wr2259 -wr3179'
+  warn_c='-Wbad-function-cast
+    -Wmissing-prototypes
+    -Wstrict-prototypes'
+  warn_cxx='-Wextra-semi -Wnoexcept -Wold-style-cast -Wundefined-func-template
+    -Wweak-vtables'
+  # Warnings for the test suite only.
+  #
+  # -fno-color-diagnostics: Clang's use of colors in the error
+  # messages is confusing the tests looking at the compiler's output
+  # (e.g., synclines.at).
+  #
+  # -Wno-keyword-macro: We use the "#define private public" dirty
+  # trick in the test suite to check some private implementation
+  # details for lalr1.cc.
+  warn_tests='-Wundef -pedantic -Wconversion
+    -Wdeprecated -Wsign-compare -Wsign-conversion
+    -Wtautological-constant-out-of-range-compare
+    -fno-color-diagnostics
+    -Wno-keyword-macro'
+
+
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+  # Clang supports many of GCC's -W options, but only issues warnings
+  # on the ones it does not recognize.  In that case, gl_WARN_ADD
+  # thinks the option is supported, and unknown options are then added
+  # to CFLAGS.  But then, when -Werror is added in the test suite for
+  # instance, the warning about the unknown option turns into an
+  # error.
+  #
+  # This should be addressed by gnulib's gl_WARN_ADD, but in the
+  # meanwhile, turn warnings about unknown options into errors in
+  # CFLAGS, and restore CFLAGS after the tests.
+  save_CFLAGS=$CFLAGS
+
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Werror -Wunknown-warning-option" >&5
+printf %s "checking whether C compiler handles -Werror -Wunknown-warning-option... " >&6; }
+if test ${gl_cv_warn_c__Werror__Wunknown_warning_option+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CFLAGS"
+  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Werror -Wunknown-warning-option"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_warn_c__Werror__Wunknown_warning_option=yes
+else $as_nop
+  gl_cv_warn_c__Werror__Wunknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Werror__Wunknown_warning_option" >&5
+printf "%s\n" "$gl_cv_warn_c__Werror__Wunknown_warning_option" >&6; }
+if test "x$gl_cv_warn_c__Werror__Wunknown_warning_option" = xyes
+then :
+  gl_unknown_warnings_are_errors='-Wunknown-warning-option -Werror'
+else $as_nop
+  gl_unknown_warnings_are_errors=
+fi
+
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Werror=unknown-warning-option" >&5
+printf %s "checking whether C compiler handles -Werror=unknown-warning-option... " >&6; }
+if test ${gl_cv_warn_c__Werror_unknown_warning_option+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CFLAGS"
+  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Werror=unknown-warning-option"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_warn_c__Werror_unknown_warning_option=yes
+else $as_nop
+  gl_cv_warn_c__Werror_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Werror_unknown_warning_option" >&5
+printf "%s\n" "$gl_cv_warn_c__Werror_unknown_warning_option" >&6; }
+if test "x$gl_cv_warn_c__Werror_unknown_warning_option" = xyes
+then :
+  as_fn_append CFLAGS " -Werror=unknown-warning-option"
+fi
+
+
+  # Accept this warning only if it is not too touchy (e.g., clang 3.3
+  # and 3.4).
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Wunreachable-code" >&5
+printf %s "checking whether C compiler handles -Wunreachable-code... " >&6; }
+if test ${gl_cv_warn_c__Wunreachable_code+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CFLAGS"
+  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Wunreachable-code"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+if (sizeof (long) < sizeof (int)) return 1;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_warn_c__Wunreachable_code=yes
+else $as_nop
+  gl_cv_warn_c__Wunreachable_code=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Wunreachable_code" >&5
+printf "%s\n" "$gl_cv_warn_c__Wunreachable_code" >&6; }
+if test "x$gl_cv_warn_c__Wunreachable_code" = xyes
+then :
+  as_fn_append WARN_CFLAGS " -Wunreachable-code"
+fi
+
+
+  for i in $warn_common $warn_c;
+  do
+
+
+as_gl_Warn=`printf "%s\n" "gl_cv_warn_c_$i" | $as_tr_sh`
+gl_positive="$i"
+case $gl_positive in
+  -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles $i" >&5
+printf %s "checking whether C compiler handles $i... " >&6; }
+if eval test \${$as_gl_Warn+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CFLAGS"
+  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors $gl_positive"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  eval "$as_gl_Warn=yes"
+else $as_nop
+  eval "$as_gl_Warn=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+eval ac_res=\$$as_gl_Warn
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_gl_Warn"\" = x"yes"
+then :
+  as_fn_append WARN_CFLAGS " $i"
+fi
+
+
+  done
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Werror" >&5
+printf %s "checking whether C compiler handles -Werror... " >&6; }
+if test ${gl_cv_warn_c__Werror+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CFLAGS"
+  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Werror"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_warn_c__Werror=yes
+else $as_nop
+  gl_cv_warn_c__Werror=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Werror" >&5
+printf "%s\n" "$gl_cv_warn_c__Werror" >&6; }
+if test "x$gl_cv_warn_c__Werror" = xyes
+then :
+  as_fn_append WERROR_CFLAGS " -Werror"
+fi
+
+
+
+  # Warnings for the test suite, and maybe for bison if GCC is modern
+  # enough.
+  test $lv_cv_gcc_pragma_push_works = yes &&
+    as_fn_append WARN_CFLAGS " $WARN_CFLAGS_TEST"
+
+  # Warnings for the test suite only.
+  for i in $warn_tests -Wincompatible-pointer-types;
+  do
+
+
+as_gl_Warn=`printf "%s\n" "gl_cv_warn_c_$i" | $as_tr_sh`
+gl_positive="$i"
+case $gl_positive in
+  -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles $i" >&5
+printf %s "checking whether C compiler handles $i... " >&6; }
+if eval test \${$as_gl_Warn+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CFLAGS"
+  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors $gl_positive"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  eval "$as_gl_Warn=yes"
+else $as_nop
+  eval "$as_gl_Warn=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+eval ac_res=\$$as_gl_Warn
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_gl_Warn"\" = x"yes"
+then :
+  as_fn_append WARN_CFLAGS_TEST " $i"
+fi
+
+
+  done
+  CFLAGS=$save_CFLAGS
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  save_CXXFLAGS=$CXXFLAGS
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Werror=unknown-warning-option" >&5
+printf %s "checking whether C++ compiler handles -Werror=unknown-warning-option... " >&6; }
+if test ${gl_cv_warn_cxx__Werror_unknown_warning_option+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CXXFLAGS"
+  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Werror=unknown-warning-option"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  gl_cv_warn_cxx__Werror_unknown_warning_option=yes
+else $as_nop
+  gl_cv_warn_cxx__Werror_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Werror_unknown_warning_option" >&5
+printf "%s\n" "$gl_cv_warn_cxx__Werror_unknown_warning_option" >&6; }
+if test "x$gl_cv_warn_cxx__Werror_unknown_warning_option" = xyes
+then :
+  as_fn_append CXXFLAGS " -Werror=unknown-warning-option"
+fi
+
+
+  for i in $warn_common $warn_cxx;
+  do
+
+
+as_gl_Warn=`printf "%s\n" "gl_cv_warn_cxx_$i" | $as_tr_sh`
+gl_positive="$i"
+case $gl_positive in
+  -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles $i" >&5
+printf %s "checking whether C++ compiler handles $i... " >&6; }
+if eval test \${$as_gl_Warn+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CXXFLAGS"
+  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors $gl_positive"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  eval "$as_gl_Warn=yes"
+else $as_nop
+  eval "$as_gl_Warn=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+eval ac_res=\$$as_gl_Warn
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_gl_Warn"\" = x"yes"
+then :
+  as_fn_append WARN_CXXFLAGS " $i"
+fi
+
+
+  done
+  # Accept this warning only if it is not too touchy (e.g., clang 3.3
+  # and 3.4).
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Wunreachable-code" >&5
+printf %s "checking whether C++ compiler handles -Wunreachable-code... " >&6; }
+if test ${gl_cv_warn_cxx__Wunreachable_code+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CXXFLAGS"
+  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Wunreachable-code"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+if (sizeof (long) < sizeof (int)) return 1;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  gl_cv_warn_cxx__Wunreachable_code=yes
+else $as_nop
+  gl_cv_warn_cxx__Wunreachable_code=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Wunreachable_code" >&5
+printf "%s\n" "$gl_cv_warn_cxx__Wunreachable_code" >&6; }
+if test "x$gl_cv_warn_cxx__Wunreachable_code" = xyes
+then :
+  as_fn_append WARN_CXXFLAGS " -Wunreachable-code"
+fi
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Wzero-as-null-pointer-constant" >&5
+printf %s "checking whether C++ compiler handles -Wzero-as-null-pointer-constant... " >&6; }
+if test ${gl_cv_warn_cxx__Wzero_as_null_pointer_constant+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CXXFLAGS"
+  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Wzero-as-null-pointer-constant"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+nullptr
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  gl_cv_warn_cxx__Wzero_as_null_pointer_constant=yes
+else $as_nop
+  gl_cv_warn_cxx__Wzero_as_null_pointer_constant=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Wzero_as_null_pointer_constant" >&5
+printf "%s\n" "$gl_cv_warn_cxx__Wzero_as_null_pointer_constant" >&6; }
+if test "x$gl_cv_warn_cxx__Wzero_as_null_pointer_constant" = xyes
+then :
+  as_fn_append WARN_CXXFLAGS " -Wzero-as-null-pointer-constant"
+fi
+
+
+  # Before GCC6, the pragmas don't work well enough to neutralize
+  # this warning.
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Wuseless-cast" >&5
+printf %s "checking whether C++ compiler handles -Wuseless-cast... " >&6; }
+if test ${gl_cv_warn_cxx__Wuseless_cast+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CXXFLAGS"
+  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Wuseless-cast"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+              #if defined __GNUC__ && ! defined __ICC && ! defined __clang__ && __GNUC__ < 6
+              syntax error
+              #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  gl_cv_warn_cxx__Wuseless_cast=yes
+else $as_nop
+  gl_cv_warn_cxx__Wuseless_cast=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Wuseless_cast" >&5
+printf "%s\n" "$gl_cv_warn_cxx__Wuseless_cast" >&6; }
+if test "x$gl_cv_warn_cxx__Wuseless_cast" = xyes
+then :
+  as_fn_append WARN_CXXFLAGS " -Wuseless-cast"
+fi
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Werror" >&5
+printf %s "checking whether C++ compiler handles -Werror... " >&6; }
+if test ${gl_cv_warn_cxx__Werror+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CXXFLAGS"
+  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Werror"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  gl_cv_warn_cxx__Werror=yes
+else $as_nop
+  gl_cv_warn_cxx__Werror=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Werror" >&5
+printf "%s\n" "$gl_cv_warn_cxx__Werror" >&6; }
+if test "x$gl_cv_warn_cxx__Werror" = xyes
+then :
+  as_fn_append WERROR_CXXFLAGS " -Werror"
+fi
+
+
+  # Warnings for the test suite only.
+  for i in $warn_tests;
+  do
+
+
+as_gl_Warn=`printf "%s\n" "gl_cv_warn_cxx_$i" | $as_tr_sh`
+gl_positive="$i"
+case $gl_positive in
+  -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;;
+esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles $i" >&5
+printf %s "checking whether C++ compiler handles $i... " >&6; }
+if eval test \${$as_gl_Warn+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CXXFLAGS"
+  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors $gl_positive"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  eval "$as_gl_Warn=yes"
+else $as_nop
+  eval "$as_gl_Warn=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+eval ac_res=\$$as_gl_Warn
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+if eval test \"x\$"$as_gl_Warn"\" = x"yes"
+then :
+  as_fn_append WARN_CXXFLAGS_TEST " $i"
+fi
+
+
+  done
+  # Too many compilers complain about Flex generated code.
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Wno-error" >&5
+printf %s "checking whether C++ compiler handles -Wno-error... " >&6; }
+if test ${gl_cv_warn_cxx__Wno_error+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CXXFLAGS"
+  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Werror"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  gl_cv_warn_cxx__Wno_error=yes
+else $as_nop
+  gl_cv_warn_cxx__Wno_error=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Wno_error" >&5
+printf "%s\n" "$gl_cv_warn_cxx__Wno_error" >&6; }
+if test "x$gl_cv_warn_cxx__Wno_error" = xyes
+then :
+  as_fn_append FLEX_SCANNER_CXXFLAGS " -Wno-error"
+fi
+
+
+  # Clang++ deprecates compiling C.
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Wno-deprecated" >&5
+printf %s "checking whether C++ compiler handles -Wno-deprecated... " >&6; }
+if test ${gl_cv_warn_cxx__Wno_deprecated+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+  gl_save_compiler_FLAGS="$CXXFLAGS"
+  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Wdeprecated"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  gl_cv_warn_cxx__Wno_deprecated=yes
+else $as_nop
+  gl_cv_warn_cxx__Wno_deprecated=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+  CXXFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Wno_deprecated" >&5
+printf "%s\n" "$gl_cv_warn_cxx__Wno_deprecated" >&6; }
+if test "x$gl_cv_warn_cxx__Wno_deprecated" = xyes
+then :
+  as_fn_append WNO_DEPRECATED_CXXFLAGS " -Wno-deprecated"
+fi
+
+
+  CXXFLAGS=$save_CXXFLAGS
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+         int test_array[CHAR_BIT];
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+  { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compile a simple C program
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+   BISON_C_WORKS=:
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports POSIXLY_CORRECT=1" >&5
+printf %s "checking whether $CC supports POSIXLY_CORRECT=1... " >&6; }
+if test ${bison_cv_c_supports_posixly_correct+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }'
+case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" </dev/null` in
+  xx) gl_had_POSIXLY_CORRECT=exported ;;
+  x)  gl_had_POSIXLY_CORRECT=yes      ;;
+  *)  gl_had_POSIXLY_CORRECT=         ;;
+esac
+POSIXLY_CORRECT=1
+export POSIXLY_CORRECT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  bison_cv_c_supports_posixly_correct=yes
+else $as_nop
+  bison_cv_c_supports_posixly_correct=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+case $gl_had_POSIXLY_CORRECT in
+  exported) ;;
+  yes) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;}; POSIXLY_CORRECT=1 ;;
+  *) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;} ;;
+esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bison_cv_c_supports_posixly_correct" >&5
+printf "%s\n" "$bison_cv_c_supports_posixly_correct" >&6; }
+case $bison_cv_c_supports_posixly_correct in
+  yes) C_COMPILER_POSIXLY_CORRECT=true
+ ;;
+  no)  C_COMPILER_POSIXLY_CORRECT=false
+;;
+esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX builds executables that work" >&5
+printf %s "checking whether $CXX builds executables that work... " >&6; }
+if test ${bison_cv_cxx_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+    bison_cv_cxx_works=no
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+          #include <cstdlib>
+          #include <iostream>
+          #include <map>
+          #include <string>
+          using namespace std;
+int
+main (void)
+{
+std::cerr << "";
+          cout << "";
+          typedef std::pair<unsigned, int> uipair;
+          std::map<unsigned, int> m;
+          std::map<unsigned, int>::iterator i;
+          m.insert (uipair (4, -4));
+          for (i = m.begin (); i != m.end (); ++i)
+            if (i->first != 4)
+              return 1;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+  if { ac_try='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_objext $LIBS >&5'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+then :
+  if test "$cross_compiling" = yes
+then :
+  bison_cv_cxx_works=cross
+else $as_nop
+  if { ac_try='./conftest$ac_exeext'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+then :
+  bison_cv_cxx_works=yes
+fi
+fi
+fi
+       rm -f conftest$ac_exeext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+    ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bison_cv_cxx_works" >&5
+printf "%s\n" "$bison_cv_cxx_works" >&6; }
+
+ case $bison_cv_cxx_works in
+   yes)        BISON_CXX_WORKS=':';;
+   no | cross) BISON_CXX_WORKS='false';;
+ esac
+
+
+  if test $bison_cv_cxx_works = yes; then
+  ENABLE_CXX_TRUE=
+  ENABLE_CXX_FALSE='#'
+else
+  ENABLE_CXX_TRUE='#'
+  ENABLE_CXX_FALSE=
+fi
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports POSIXLY_CORRECT=1" >&5
+printf %s "checking whether $CXX supports POSIXLY_CORRECT=1... " >&6; }
+if test ${bison_cv_cxx_supports_posixly_correct+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }'
+case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" </dev/null` in
+  xx) gl_had_POSIXLY_CORRECT=exported ;;
+  x)  gl_had_POSIXLY_CORRECT=yes      ;;
+  *)  gl_had_POSIXLY_CORRECT=         ;;
+esac
+POSIXLY_CORRECT=1
+export POSIXLY_CORRECT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"
+then :
+  bison_cv_cxx_supports_posixly_correct=yes
+else $as_nop
+  bison_cv_cxx_supports_posixly_correct=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+case $gl_had_POSIXLY_CORRECT in
+  exported) ;;
+  yes) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;}; POSIXLY_CORRECT=1 ;;
+  *) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;} ;;
+esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bison_cv_cxx_supports_posixly_correct" >&5
+printf "%s\n" "$bison_cv_cxx_supports_posixly_correct" >&6; }
+case $bison_cv_cxx_supports_posixly_correct in
+  yes) CXX_COMPILER_POSIXLY_CORRECT=true
+ ;;
+  no)  CXX_COMPILER_POSIXLY_CORRECT=false
+;;
+esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+# D.
+for ac_prog in dmd
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$DC"; then
+  ac_cv_prog_DC="$DC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DC="$ac_prog"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DC=$ac_cv_prog_DC
+if test -n "$DC"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DC" >&5
+printf "%s\n" "$DC" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+  test -n "$DC" && break
+done
+
+for ac_prog in -g
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DCFLAGS+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$DCFLAGS"; then
+  ac_cv_prog_DCFLAGS="$DCFLAGS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DCFLAGS="$ac_prog"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DCFLAGS=$ac_cv_prog_DCFLAGS
+if test -n "$DCFLAGS"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DCFLAGS" >&5
+printf "%s\n" "$DCFLAGS" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+  test -n "$DCFLAGS" && break
+done
+
+ if test x"$DC" != x; then
+  ENABLE_D_TRUE=
+  ENABLE_D_FALSE='#'
+else
+  ENABLE_D_TRUE='#'
+  ENABLE_D_FALSE=
+fi
+
+
+# Java.
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#if defined _WIN32 || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+  yes
+#endif
 
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_func_malloc_0_nonnull=yes
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1
+then :
+  CLASSPATH_SEPARATOR=';'
+else $as_nop
+  CLASSPATH_SEPARATOR=':'
+fi
+rm -rf conftest*
+
+  source_version=1.7
+  test -n "$source_version" || {
+    as_fn_error $? "missing source-version argument to gt_JAVACOMP" "$LINENO" 5
+  }
+  target_version=1.7
+  case "$source_version" in
+    1.3) goodcode='class conftest {}'
+         failcode='class conftestfail { static { assert(true); } }' ;;
+    1.4) goodcode='class conftest     { static { assert(true); } }'
+         failcode='class conftestfail<T> { T foo() { return null; } }' ;;
+    1.5) goodcode='class conftest<T>     { T foo() { return null; } }'
+         failcode='class conftestfail { void foo () { switch ("A") {} } }' ;;
+    1.7) goodcode='class conftest     { void foo () { switch ("A") {} } }'
+         failcode='class conftestfail { void foo () { Runnable r = () -> {}; } }' ;;
+    1.8) goodcode='class conftest     { void foo () { Runnable r = () -> {}; } }'
+         failcode='interface conftestfail { private void foo () {} }' ;;
+    9)   goodcode='interface conftest     { private void foo () {} }'
+         failcode='class conftestfail { public void m() { var i = new Integer(0); } }' ;;
+    10)  goodcode='class conftest     { public void m() { var i = new Integer(0); } }'
+         failcode='class conftestfail { Readable r = (var b) -> 0; }' ;;
+    11)  goodcode='class conftest     { Readable r = (var b) -> 0; }'
+         failcode='class conftestfail syntax error' ;;
+    *) as_fn_error $? "invalid source-version argument to gt_JAVACOMP: $source_version" "$LINENO" 5 ;;
+  esac
+  case "$target_version" in
+    1.1) cfversion=45 ;;
+    1.2) cfversion=46 ;;
+    1.3) cfversion=47 ;;
+    1.4) cfversion=48 ;;
+    1.5) cfversion=49 ;;
+    1.6) cfversion=50 ;;
+    1.7) cfversion=51 ;;
+    1.8) cfversion=52 ;;
+    9)   cfversion=53 ;;
+    10)  cfversion=54 ;;
+    11)  cfversion=55 ;;
+    *) as_fn_error $? "invalid target-version argument to gt_JAVACOMP: $target_version" "$LINENO" 5 ;;
+  esac
+  # Function to output the classfile version of a file (8th byte) in decimal.
+  if od -A x < /dev/null >/dev/null 2>/dev/null; then
+    # Use POSIX od.
+    func_classfile_version ()
+    {
+      od -A n -t d1 -j 7 -N 1 "$1"
+    }
+  else
+    # Use BSD hexdump.
+    func_classfile_version ()
+    {
+      dd if="$1" bs=1 count=1 skip=7 2>/dev/null | hexdump -e '1/1 "%3d "'
+      echo
+    }
+  fi
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Java compiler" >&5
+printf %s "checking for Java compiler... " >&6; }
+                                                                                                                                                                  CONF_JAVAC=
+  HAVE_JAVAC_ENVVAR=
+  HAVE_GCJ_C=
+  HAVE_JAVAC=
+  HAVE_JIKES=
+  HAVE_JAVACOMP=
+  cat > conftestlib.java <<EOF
+public class conftestlib {
+  public static void main (String[] args) {
+  }
+}
+EOF
+  echo "$goodcode" > conftest.java
+  echo "$failcode" > conftestfail.java
+        if test -n "$JAVAC"; then
+        if $JAVAC --version 2>/dev/null | sed -e 1q | grep gcj > /dev/null; then
+            if $JAVAC --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^4\.[012]/d' | grep '^[4-9]' >/dev/null; then
+                        rm -f conftest.class
+        if { echo "$as_me:12554: $JAVAC -d . conftest.java" >&5
+             $JAVAC -d . conftest.java >&5 2>&1
+           } \
+           && test -f conftest.class \
+           && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
+                    rm -f conftest.class
+          rm -f conftestfail.class
+          if { echo "$as_me:12561: $JAVAC -fsource=$source_version -d . conftest.java" >&5
+               $JAVAC -fsource="$source_version" -d . conftest.java >&5 2>&1
+             } \
+             && test -f conftest.class \
+             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
+             && { echo "$as_me:12566: $JAVAC -d . conftestfail.java" >&5
+                  $JAVAC -d . conftestfail.java >&5 2>&1
+                } \
+             && test -f conftestfail.class \
+             && ! { echo "$as_me:12570: $JAVAC -fsource=$source_version -d . conftestfail.java" >&5
+                    $JAVAC -fsource="$source_version" -d . conftestfail.java >&5 2>&1
+                  }; then
+            CONF_JAVAC="$JAVAC -fsource=$source_version"
+            HAVE_JAVAC_ENVVAR=1
+            HAVE_JAVACOMP=1
+          else
+            CONF_JAVAC="$JAVAC"
+            HAVE_JAVAC_ENVVAR=1
+            HAVE_JAVACOMP=1
+          fi
+        else
+                    rm -f conftest.class
+          rm -f conftestfail.class
+          if { echo "$as_me:12584: $JAVAC -fsource=$source_version -ftarget=$target_version -d . conftest.java" >&5
+               $JAVAC -fsource="$source_version" -ftarget="$target_version" -d . conftest.java >&5 2>&1
+             } \
+             && test -f conftest.class \
+             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
+            CONF_JAVAC="$JAVAC -fsource=$source_version -ftarget=$target_version"
+            HAVE_JAVAC_ENVVAR=1
+            HAVE_JAVACOMP=1
+          fi
+        fi
+      else
+                if test "$target_version" = 1.4 && test "$source_version" = 1.4; then
+                    rm -f conftest.class
+          if { echo "$as_me:12597: $JAVAC -d . conftest.java" >&5
+               $JAVAC -d . conftest.java >&5 2>&1
+             } \
+             && test -f conftest.class; then
+            CONF_JAVAC="$JAVAC"
+            HAVE_JAVAC_ENVVAR=1
+            HAVE_JAVACOMP=1
+          fi
+        else
+          if test "$target_version" = 1.4 && test "$source_version" = 1.3; then
+                                    javac_works=
+            rm -f conftest.class
+            if { echo "$as_me:12609: $JAVAC -d . conftest.java" >&5
+                 $JAVAC -d . conftest.java >&5 2>&1
+               } \
+               && test -f conftest.class; then
+              javac_works=1
+            fi
+            javac_noassert_works=
+            rm -f conftest.class
+            if { echo "$as_me:12617: $JAVAC -fno-assert -d . conftest.java" >&5
+                 $JAVAC -fno-assert -d . conftest.java >&5 2>&1
+               } \
+               && test -f conftest.class; then
+              javac_noassert_works=1
+            fi
+            if test -n "$javac_works" && test -n "$javac_noassert_works"; then
+              rm -f conftestfail.class
+              if { echo "$as_me:12625: $JAVAC -d . conftestfail.java" >&5
+                   $JAVAC -d . conftestfail.java >&5 2>&1
+                 } \
+                 && test -f conftestfail.class \
+                 && ! { echo "$as_me:12629: $JAVAC -fno-assert -d . conftestfail.java" >&5
+                        $JAVAC -fno-assert -d . conftestfail.java >&5 2>&1
+                      }; then
+                                javac_works=
+              fi
+            fi
+            if test -n "$javac_works"; then
+              CONF_JAVAC="$JAVAC"
+              HAVE_JAVAC_ENVVAR=1
+              HAVE_JAVACOMP=1
+            else
+              if test -n "$javac_noassert_works"; then
+                CONF_JAVAC="$JAVAC -fno-assert"
+                HAVE_JAVAC_ENVVAR=1
+                HAVE_JAVACOMP=1
+              fi
+            fi
+          fi
+        fi
+      fi
+    else
+                                    if test "$source_version" = 1.5; then
+        case "$target_version" in
+          1.1 | 1.2 | 1.3 | 1.4 | 1.5) ;;
+          *) source_version='1.6' ;;
+        esac
+      fi
+      rm -f conftest.class
+      if { echo "$as_me:12657: $JAVAC -d . conftest.java" >&5
+           $JAVAC -d . conftest.java >&5 2>&1
+         } \
+         && test -f conftest.class \
+         && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
+                rm -f conftest.class
+        rm -f conftestfail.class
+        if { echo "$as_me:12664: $JAVAC -source $source_version -d . conftest.java" >&5
+             $JAVAC -source "$source_version" -d . conftest.java >&5 2>&1
+           } \
+           && test -f conftest.class \
+           && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
+           && { echo "$as_me:12669: $JAVAC -d . conftestfail.java" >&5
+                $JAVAC -d . conftestfail.java >&5 2>&1
+              } \
+           && test -f conftestfail.class \
+           && ! { echo "$as_me:12673: $JAVAC -source $source_version -d . conftestfail.java" >&5
+                  $JAVAC -source "$source_version" -d . conftestfail.java >&5 2>&1
+                }; then
+          CONF_JAVAC="$JAVAC -source $source_version"
+          HAVE_JAVAC_ENVVAR=1
+          HAVE_JAVACOMP=1
+        else
+          CONF_JAVAC="$JAVAC"
+          HAVE_JAVAC_ENVVAR=1
+          HAVE_JAVACOMP=1
+        fi
+      else
+                        rm -f conftest.class
+        if { echo "$as_me:12686: $JAVAC -target $target_version -d . conftest.java" >&5
+             $JAVAC -target "$target_version" -d . conftest.java >&5 2>&1
+           } \
+           && test -f conftest.class \
+           && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
+                    rm -f conftest.class
+          rm -f conftestfail.class
+          if { echo "$as_me:12693: $JAVAC -target $target_version -source $source_version -d . conftest.java" >&5
+               $JAVAC -target "$target_version" -source "$source_version" -d . conftest.java >&5 2>&1
+             } \
+             && test -f conftest.class \
+             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
+             && { echo "$as_me:12698: $JAVAC -target $target_version -d . conftestfail.java" >&5
+                  $JAVAC -target "$target_version" -d . conftestfail.java >&5 2>&1
+                } \
+             && test -f conftestfail.class \
+             && ! { echo "$as_me:12702: $JAVAC -target $target_version -source $source_version -d . conftestfail.java" >&5
+                    $JAVAC -target "$target_version" -source "$source_version" -d . conftestfail.java >&5 2>&1
+                  }; then
+            CONF_JAVAC="$JAVAC -target $target_version -source $source_version"
+            HAVE_JAVAC_ENVVAR=1
+            HAVE_JAVACOMP=1
+          else
+            CONF_JAVAC="$JAVAC -target $target_version"
+            HAVE_JAVAC_ENVVAR=1
+            HAVE_JAVACOMP=1
+          fi
+        else
+                                        rm -f conftest.class
+          if { echo "$as_me:12715: $JAVAC -target $target_version -source $source_version -d . conftest.java" >&5
+               $JAVAC -target "$target_version" -source "$source_version" -d . conftest.java >&5 2>&1
+             } \
+             && test -f conftest.class \
+             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
+            CONF_JAVAC="$JAVAC -target $target_version -source $source_version"
+            HAVE_JAVAC_ENVVAR=1
+            HAVE_JAVACOMP=1
+          fi
+        fi
+      fi
+    fi
+  fi
+  if test -z "$HAVE_JAVACOMP"; then
+                # Extract the first word of "gcj", so it can be a program name with args.
+set dummy gcj; ac_word=$2
+:
+if test ${ac_cv_prog_HAVE_GCJ_IN_PATH+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$HAVE_GCJ_IN_PATH"; then
+  ac_cv_prog_HAVE_GCJ_IN_PATH="$HAVE_GCJ_IN_PATH" # Let the user override the test.
 else
-  ac_cv_func_malloc_0_nonnull=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_HAVE_GCJ_IN_PATH="yes"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+HAVE_GCJ_IN_PATH=$ac_cv_prog_HAVE_GCJ_IN_PATH
+if test -n "$HAVE_GCJ_IN_PATH"; then
+  :
+else
+  :
+fi
+
+
+    # Extract the first word of "javac", so it can be a program name with args.
+set dummy javac; ac_word=$2
+:
+if test ${ac_cv_prog_HAVE_JAVAC_IN_PATH+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$HAVE_JAVAC_IN_PATH"; then
+  ac_cv_prog_HAVE_JAVAC_IN_PATH="$HAVE_JAVAC_IN_PATH" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_HAVE_JAVAC_IN_PATH="yes"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+HAVE_JAVAC_IN_PATH=$ac_cv_prog_HAVE_JAVAC_IN_PATH
+if test -n "$HAVE_JAVAC_IN_PATH"; then
+  :
+else
+  :
+fi
+
+
+    # Extract the first word of "jikes", so it can be a program name with args.
+set dummy jikes; ac_word=$2
+:
+if test ${ac_cv_prog_HAVE_JIKES_IN_PATH+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$HAVE_JIKES_IN_PATH"; then
+  ac_cv_prog_HAVE_JIKES_IN_PATH="$HAVE_JIKES_IN_PATH" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_HAVE_JIKES_IN_PATH="yes"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+HAVE_JIKES_IN_PATH=$ac_cv_prog_HAVE_JIKES_IN_PATH
+if test -n "$HAVE_JIKES_IN_PATH"; then
+  :
+else
+  :
+fi
+
+
+                if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_GCJ_IN_PATH"; then
+            if gcj --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^3\.[01]/d' | grep '^[3-9]' >/dev/null; then
+                if { echo "$as_me:12848: gcj -C -d . conftestlib.java" >&5
+             gcj -C -d . conftestlib.java >&5 2>&1
+           }; then
+                    if gcj --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^4\.[012]/d' | grep '^[4-9]' >/dev/null; then
+                                    rm -f conftest.class
+            if { echo "$as_me:12853: gcj -C -d . conftest.java" >&5
+                 gcj -C -d . conftest.java >&5 2>&1
+               } \
+               && test -f conftest.class \
+               && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
+                            rm -f conftest.class
+              rm -f conftestfail.class
+              if { echo "$as_me:12860: gcj -C -fsource=$source_version -d . conftest.java" >&5
+                   gcj -C -fsource="$source_version" -d . conftest.java >&5 2>&1
+                 } \
+                 && test -f conftest.class \
+                 && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
+                 && { echo "$as_me:12865: gcj -C -d . conftestfail.java" >&5
+                      gcj -C -d . conftestfail.java >&5 2>&1
+                    } \
+                 && test -f conftestfail.class \
+                 && ! { echo "$as_me:12869: gcj -C -fsource=$source_version -d . conftestfail.java" >&5
+                        gcj -C -fsource="$source_version" -d . conftestfail.java >&5 2>&1
+                      }; then
+                CONF_JAVAC="gcj -C -fsource=$source_version"
+                HAVE_JAVAC_ENVVAR=1
+                HAVE_JAVACOMP=1
+              else
+                CONF_JAVAC="gcj -C"
+                HAVE_JAVAC_ENVVAR=1
+                HAVE_JAVACOMP=1
+              fi
+            else
+                            rm -f conftest.class
+              rm -f conftestfail.class
+              if { echo "$as_me:12883: gcj -C -fsource=$source_version -ftarget=$target_version -d . conftest.java" >&5
+                   gcj -C -fsource="$source_version" -ftarget="$target_version" -d . conftest.java >&5 2>&1
+                 } \
+                 && test -f conftest.class \
+                 && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
+                CONF_JAVAC="gcj -C -fsource=$source_version -ftarget=$target_version"
+                HAVE_JAVAC_ENVVAR=1
+                HAVE_JAVACOMP=1
+              fi
+            fi
+          else
+                                                if test "$target_version" = 1.4 && test "$source_version" = 1.4; then
+              rm -f conftest.class
+              if { echo "$as_me:12896: gcj -C -d . conftest.java" >&5
+                   gcj -C -d . conftest.java >&5 2>&1
+                 } \
+                 && test -f conftest.class; then
+                CONF_JAVAC="gcj -C"
+                HAVE_GCJ_C=1
+                HAVE_JAVACOMP=1
+              fi
+            else
+              if test "$target_version" = 1.4 && test "$source_version" = 1.3; then
+                                                rm -f conftest.class
+                if { echo "$as_me:12907: gcj -C -fno-assert -d . conftest.java" >&5
+                     gcj -C -fno-assert -d . conftest.java >&5 2>&1
+                   } \
+                   && test -f conftest.class; then
+                  CONF_JAVAC="gcj -C -fno-assert"
+                  HAVE_GCJ_C=1
+                  HAVE_JAVACOMP=1
+                else
+                  rm -f conftest.class
+                  if { echo "$as_me:12916: gcj -C -d . conftest.java" >&5
+                       gcj -C -d . conftest.java >&5 2>&1
+                     } \
+                     && test -f conftest.class; then
+                    CONF_JAVAC="gcj -C"
+                    HAVE_GCJ_C=1
+                    HAVE_JAVACOMP=1
+                  fi
+                fi
+              fi
+            fi
+          fi
+        fi
+      fi
+    fi
+    if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_JAVAC_IN_PATH"; then
+            if { javac -version >/dev/null 2>/dev/null || test $? -le 2; } \
+         && ( if javac -help 2>&1 >/dev/null | grep at.dms.kjc.Main >/dev/null && javac -help 2>/dev/null | grep 'released.*2000' >/dev/null ; then exit 1; else exit 0; fi ); then
+                                        if test "$source_version" = 1.5; then
+          case "$target_version" in
+            1.1 | 1.2 | 1.3 | 1.4 | 1.5) ;;
+            *) source_version='1.6' ;;
+          esac
+        fi
+                        rm -f conftest.class
+        if { echo "$as_me:12941: javac -d . conftest.java" >&5
+             javac -d . conftest.java >&5 2>&1
+           } \
+           && test -f conftest.class \
+           && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
+                    rm -f conftest.class
+          rm -f conftestfail.class
+          if { echo "$as_me:12948: javac -source $source_version -d . conftest.java" >&5
+               javac -source "$source_version" -d . conftest.java >&5 2>&1
+             } \
+             && test -f conftest.class \
+             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
+             && { echo "$as_me:12953: javac -d . conftestfail.java" >&5
+                  javac -d . conftestfail.java >&5 2>&1
+                } \
+             && test -f conftestfail.class \
+             && ! { echo "$as_me:12957: javac -source $source_version -d . conftestfail.java" >&5
+                    javac -source "$source_version" -d . conftestfail.java >&5 2>&1
+                  }; then
+            CONF_JAVAC="javac -source $source_version"
+            HAVE_JAVAC=1
+            HAVE_JAVACOMP=1
+          else
+            CONF_JAVAC="javac"
+            HAVE_JAVAC=1
+            HAVE_JAVACOMP=1
+          fi
+        else
+                              rm -f conftest.class
+          if { echo "$as_me:12970: javac -target $target_version -d . conftest.java" >&5
+               javac -target "$target_version" -d . conftest.java >&5 2>&1
+             } \
+             && test -f conftest.class \
+             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
+                        rm -f conftest.class
+            rm -f conftestfail.class
+            if { echo "$as_me:12977: javac -target $target_version -source $source_version -d . conftest.java" >&5
+                 javac -target "$target_version" -source "$source_version" -d . conftest.java >&5 2>&1
+               } \
+               && test -f conftest.class \
+               && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
+               && { echo "$as_me:12982: javac -target $target_version -d . conftestfail.java" >&5
+                    javac -target "$target_version" -d . conftestfail.java >&5 2>&1
+                  } \
+               && test -f conftestfail.class \
+               && ! { echo "$as_me:12986: javac -target $target_version -source $source_version -d . conftestfail.java" >&5
+                      javac -target "$target_version" -source "$source_version" -d . conftestfail.java >&5 2>&1
+                    }; then
+              CONF_JAVAC="javac -target $target_version -source $source_version"
+              HAVE_JAVAC=1
+              HAVE_JAVACOMP=1
+            else
+              CONF_JAVAC="javac -target $target_version"
+              HAVE_JAVAC=1
+              HAVE_JAVACOMP=1
+            fi
+          else
+                                                rm -f conftest.class
+            if { echo "$as_me:12999: javac -target $target_version -source $source_version -d . conftest.java" >&5
+                 javac -target "$target_version" -source "$source_version" -d . conftest.java >&5 2>&1
+               } \
+               && test -f conftest.class \
+               && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
+              CONF_JAVAC="javac -target $target_version -source $source_version"
+              HAVE_JAVAC=1
+              HAVE_JAVACOMP=1
+            fi
+          fi
+        fi
+      fi
+    fi
+    if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_JIKES_IN_PATH"; then
+            if { jikes >/dev/null 2>/dev/null || test $? = 1; } \
+         && (
+              # See if the existing CLASSPATH is sufficient to make jikes work.
+              unset JAVA_HOME
+              jikes conftestlib.java >&5 2>&1
+              error=$?
+              rm -f conftestlib.class
+              exit $error
+            ); then
+                                if test "$source_version" = 1.3; then
+          CONF_JAVAC="jikes"
+          HAVE_JIKES=1
+          HAVE_JAVACOMP=1
+        fi
+      fi
+    fi
+  fi
+  rm -f conftest*.java conftest*.class
+  if test -n "$HAVE_JAVACOMP"; then
+    ac_result="$CONF_JAVAC"
+  else
+    ac_result="no"
+  fi
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_result" >&5
+printf "%s\n" "$ac_result" >&6; }
+
+
+
+
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Java virtual machine" >&5
+printf %s "checking for Java virtual machine... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#if defined _WIN32 || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+  yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1
+then :
+  CLASSPATH_SEPARATOR=';'
+else $as_nop
+  CLASSPATH_SEPARATOR=':'
+fi
+rm -rf conftest*
+
+  CONF_JAVA=
+  HAVE_JAVA_ENVVAR=
+  HAVE_GIJ=
+  HAVE_JAVA=
+  HAVE_JRE=
+  HAVE_JVIEW=
+  HAVE_JAVAEXEC=1
+  if test -n "$JAVA"; then
+    HAVE_JAVA_ENVVAR=1
+    CONF_JAVA="$JAVA"
+  else
+                # Extract the first word of "gij", so it can be a program name with args.
+set dummy gij; ac_word=$2
+:
+if test ${ac_cv_prog_HAVE_GIJ_IN_PATH+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$HAVE_GIJ_IN_PATH"; then
+  ac_cv_prog_HAVE_GIJ_IN_PATH="$HAVE_GIJ_IN_PATH" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_HAVE_GIJ_IN_PATH="yes"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+HAVE_GIJ_IN_PATH=$ac_cv_prog_HAVE_GIJ_IN_PATH
+if test -n "$HAVE_GIJ_IN_PATH"; then
+  :
+else
+  :
+fi
+
+
+    # Extract the first word of "java", so it can be a program name with args.
+set dummy java; ac_word=$2
+:
+if test ${ac_cv_prog_HAVE_JAVA_IN_PATH+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$HAVE_JAVA_IN_PATH"; then
+  ac_cv_prog_HAVE_JAVA_IN_PATH="$HAVE_JAVA_IN_PATH" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_HAVE_JAVA_IN_PATH="yes"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+HAVE_JAVA_IN_PATH=$ac_cv_prog_HAVE_JAVA_IN_PATH
+if test -n "$HAVE_JAVA_IN_PATH"; then
+  :
+else
+  :
+fi
+
+
+    # Extract the first word of "jre", so it can be a program name with args.
+set dummy jre; ac_word=$2
+:
+if test ${ac_cv_prog_HAVE_JRE_IN_PATH+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$HAVE_JRE_IN_PATH"; then
+  ac_cv_prog_HAVE_JRE_IN_PATH="$HAVE_JRE_IN_PATH" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_HAVE_JRE_IN_PATH="yes"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+HAVE_JRE_IN_PATH=$ac_cv_prog_HAVE_JRE_IN_PATH
+if test -n "$HAVE_JRE_IN_PATH"; then
+  :
+else
+  :
+fi
+
+
+    # Extract the first word of "jview", so it can be a program name with args.
+set dummy jview; ac_word=$2
+:
+if test ${ac_cv_prog_HAVE_JVIEW_IN_PATH+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$HAVE_JVIEW_IN_PATH"; then
+  ac_cv_prog_HAVE_JVIEW_IN_PATH="$HAVE_JVIEW_IN_PATH" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_HAVE_JVIEW_IN_PATH="yes"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+HAVE_JVIEW_IN_PATH=$ac_cv_prog_HAVE_JVIEW_IN_PATH
+if test -n "$HAVE_JVIEW_IN_PATH"; then
+  :
+else
+  :
+fi
+
+
+
+    export CLASSPATH
+    if test -n "$HAVE_GIJ_IN_PATH" \
+       && gij --version >/dev/null 2>/dev/null \
+       ; then
+      HAVE_GIJ=1
+      CONF_JAVA="gij"
+    else
+      if test -n "$HAVE_JAVA_IN_PATH" \
+         && java -version >/dev/null 2>/dev/null \
+         ; then
+        HAVE_JAVA=1
+        CONF_JAVA="java"
+      else
+        if test -n "$HAVE_JRE_IN_PATH" \
+           && (jre >/dev/null 2>/dev/null || test $? = 1) \
+           ; then
+          HAVE_JRE=1
+          CONF_JAVA="jre"
+        else
+          if test -n "$HAVE_JVIEW_IN_PATH" \
+             && (jview -? >/dev/null 2>/dev/null || test $? = 1) \
+             ; then
+            HAVE_JVIEW=1
+            CONF_JAVA="jview"
+          else
+            HAVE_JAVAEXEC=
+          fi
+        fi
+      fi
+    fi
+
+  fi
+  if test -n "$HAVE_JAVAEXEC"; then
+    ac_result="$CONF_JAVA"
+  else
+    ac_result="no"
+  fi
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_result" >&5
+printf "%s\n" "$ac_result" >&6; }
+
+
+
+
+
+
+
+
+
+ if test x"$CONF_JAVAC" != x && test x"$CONF_JAVA" != x; then
+  ENABLE_JAVA_TRUE=
+  ENABLE_JAVA_FALSE='#'
+else
+  ENABLE_JAVA_TRUE='#'
+  ENABLE_JAVA_FALSE=
+fi
+
+
+
+# Check whether --enable-yacc was given.
+if test ${enable_yacc+y}
+then :
+  enableval=$enable_yacc;
+else $as_nop
+  enable_yacc=yes
+fi
+
+ if test "$enable_yacc" = yes; then
+  ENABLE_YACC_TRUE=
+  ENABLE_YACC_FALSE='#'
+else
+  ENABLE_YACC_TRUE='#'
+  ENABLE_YACC_FALSE=
+fi
+
+ac_config_files="$ac_config_files src/yacc"
+
+
+# Checks for programs.
+
+DOT=${DOT-"${am_missing_run}dot"}
+
+for ac_prog in flex lex
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LEX+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$LEX"; then
+  ac_cv_prog_LEX="$LEX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_LEX="$ac_prog"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LEX=$ac_cv_prog_LEX
+if test -n "$LEX"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5
+printf "%s\n" "$LEX" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+  test -n "$LEX" && break
+done
+test -n "$LEX" || LEX=":"
+
+if test "x$LEX" != "x:"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether lex is flex" >&5
+printf %s "checking whether lex is flex... " >&6; }
+if test ${ac_cv_prog_lex_is_flex+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat >conftest.l <<_ACEOF
+%option debug nodefault noinput nounput noyywrap never-interactive
+%x SC_CONF_TEST
+%%
+a { BEGIN SC_CONF_TEST; }
+_ACEOF
+if { { ac_try="$LEX conftest.l"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+  (eval "$LEX conftest.l") 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  ac_cv_prog_lex_is_flex=yes
+else
+  ac_cv_prog_lex_is_flex=no
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_is_flex" >&5
+printf "%s\n" "$ac_cv_prog_lex_is_flex" >&6; }
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether flex supports --header=FILE" >&5
+printf %s "checking whether flex supports --header=FILE... " >&6; }
+if test ${ac_cv_prog_lex_supports_header_opt+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if { { ac_try="$LEX --header=conftest.h conftest.l"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+  (eval "$LEX --header=conftest.h conftest.l") 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  ac_cv_prog_lex_supports_header_opt=yes
+else
+  ac_cv_prog_lex_supports_header_opt=no
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_supports_header_opt" >&5
+printf "%s\n" "$ac_cv_prog_lex_supports_header_opt" >&6; }
+if test "$ac_cv_prog_lex_supports_header_opt" = yes; then
+  FLEX_SUPPORTS_HEADER_OPT=true
+else
+  FLEX_SUPPORTS_HEADER_OPT=false
+fi
+
+
+cat >conftest.l <<_ACEOF
+%%
+a { ECHO; }
+b { REJECT; }
+c { yymore (); }
+d { yyless (1); }
+e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument.  */
+    yyless ((input () != 0)); }
+f { unput (yytext[0]); }
+. { BEGIN INITIAL; }
+%%
+#ifdef YYTEXT_POINTER
+extern char *yytext;
+#endif
+int
+main (void)
+{
+  return ! yylex () + ! yywrap ();
+}
+_ACEOF
+{ { ac_try="$LEX conftest.l"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+  (eval "$LEX conftest.l") 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5
+printf %s "checking lex output file root... " >&6; }
+if test ${ac_cv_prog_lex_root+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+if test -f lex.yy.c; then
+  ac_cv_prog_lex_root=lex.yy
+elif test -f lexyy.c; then
+  ac_cv_prog_lex_root=lexyy
+else
+  as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5
+printf "%s\n" "$ac_cv_prog_lex_root" >&6; }
+LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root
+
+if test -z "${LEXLIB+set}"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking lex library" >&5
+printf %s "checking lex library... " >&6; }
+if test ${ac_cv_lib_lex+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+    ac_save_LIBS=$LIBS
+    ac_cv_lib_lex='none needed'
+    for ac_lib in '' -lfl -ll; do
+      LIBS="$ac_lib $ac_save_LIBS"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+`cat $LEX_OUTPUT_ROOT.c`
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_lex=$ac_lib
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+      test "$ac_cv_lib_lex" != 'none needed' && break
+    done
+    LIBS=$ac_save_LIBS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5
+printf "%s\n" "$ac_cv_lib_lex" >&6; }
+  test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex
+fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5
+printf %s "checking whether yytext is a pointer... " >&6; }
+if test ${ac_cv_prog_lex_yytext_pointer+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  # POSIX says lex can declare yytext either as a pointer or an array; the
+# default is implementation-dependent.  Figure out which it is, since
+# not all implementations provide the %pointer and %array declarations.
+ac_cv_prog_lex_yytext_pointer=no
+ac_save_LIBS=$LIBS
+LIBS="$LEXLIB $ac_save_LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+  #define YYTEXT_POINTER 1
+`cat $LEX_OUTPUT_ROOT.c`
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_prog_lex_yytext_pointer=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_save_LIBS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5
+printf "%s\n" "$ac_cv_prog_lex_yytext_pointer" >&6; }
+if test $ac_cv_prog_lex_yytext_pointer = yes; then
+
+printf "%s\n" "#define YYTEXT_POINTER 1" >>confdefs.h
+
+fi
+rm -f conftest.l $LEX_OUTPUT_ROOT.c
+
+fi
+LEX_IS_FLEX=`test "$ac_cv_prog_lex_is_flex" = yes && echo true || echo false`
+
+if ! "$LEX_IS_FLEX" || test "X$LEX" = X:; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: bypassing lex because flex is required" >&5
+printf "%s\n" "$as_me: WARNING: bypassing lex because flex is required" >&2;}
+  LEX=:
+fi
+ if $LEX_IS_FLEX && $FLEX_SUPPORTS_HEADER_OPT; then
+  FLEX_WORKS_TRUE=
+  FLEX_WORKS_FALSE='#'
+else
+  FLEX_WORKS_TRUE='#'
+  FLEX_WORKS_FALSE=
+fi
+
+ if $LEX_IS_FLEX && $FLEX_SUPPORTS_HEADER_OPT && test $bison_cv_cxx_works = yes; then
+  FLEX_CXX_WORKS_TRUE=
+  FLEX_CXX_WORKS_FALSE='#'
+else
+  FLEX_CXX_WORKS_TRUE='#'
+  FLEX_CXX_WORKS_FALSE=
+fi
+
+for ac_prog in 'bison -y' byacc
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_YACC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$YACC"; then
+  ac_cv_prog_YACC="$YACC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_YACC="$ac_prog"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+YACC=$ac_cv_prog_YACC
+if test -n "$YACC"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5
+printf "%s\n" "$YACC" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+  test -n "$YACC" && break
+done
+test -n "$YACC" || YACC="yacc"
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU M4 that supports accurate traces" >&5
+printf %s "checking for GNU M4 that supports accurate traces... " >&6; }
+if test ${ac_cv_path_M4+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  rm -f conftest.m4f
+ac_had_posixly_correct=${POSIXLY_CORRECT:+yes}
+{ POSIXLY_CORRECT=; unset POSIXLY_CORRECT;}
+if test -z "$M4"; then
+  ac_path_M4_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_prog in m4 gm4 gnum4
+   do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_M4="$as_dir$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_M4" || continue
+      # Root out GNU M4 1.4.5, as well as non-GNU m4 that ignore -t, -F.
+      # Root out GNU M4 1.4.15 with buggy false negative replacement strstr.
+      # Root out Glibc 2.9 - 2.12 and GNU M4 1.4.11 - 1.4.15 with buggy
+      # false positive strstr.
+      ac_snippet=change'quote(<,>)in''dir(<if''def>,mac,bug)'
+      ac_snippet=${ac_snippet}pat'subst(a,\(b\)\|\(a\),\1)d'nl
+      ac_snippet=${ac_snippet}${as_nl}if'else(in''dex(..wi.d.,.d.),-1,bug)'
+      ac_snippet=${ac_snippet}${as_nl}if'else(in''dex(;:11-:12-:12-:12-:12-:12-:12-:12-:12.:12.:12.:12.:12.:12.:12.:12.:12-,:12-:12-:12-:12-:12-:12-:12-:12-),-1,,strstr-bug2)'
+      test -z "`$ac_path_M4 -F conftest.m4f </dev/null 2>&1`" \
+      && test -z "`printf "%s\n" $ac_snippet | $ac_path_M4 --trace=mac 2>&1`" \
+      && test -f conftest.m4f \
+      && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:
+      rm -f conftest.m4f
+      $ac_path_M4_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_M4"; then
+    as_fn_error $? "no acceptable m4 could be found in \$PATH.
+GNU M4 1.4.6 or later is required; 1.4.16 or newer is recommended.
+GNU M4 1.4.15 uses a buggy replacement strstr on some systems.
+Glibc 2.9 - 2.12 and GNU M4 1.4.11 - 1.4.15 have another strstr bug." "$LINENO" 5
+  fi
+else
+  ac_cv_path_M4=$M4
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_M4" >&5
+printf "%s\n" "$ac_cv_path_M4" >&6; }
+  M4=$ac_cv_path_M4
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $ac_cv_path_M4 accepts --gnu" >&5
+printf %s "checking whether $ac_cv_path_M4 accepts --gnu... " >&6; }
+if test ${ac_cv_prog_gnu_m4_gnu+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case `$M4 --help < /dev/null 2>&1` in
+      *--gnu*) ac_cv_prog_gnu_m4_gnu=yes ;;
+      *) ac_cv_prog_gnu_m4_gnu=no ;;
+    esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gnu_m4_gnu" >&5
+printf "%s\n" "$ac_cv_prog_gnu_m4_gnu" >&6; }
+  if test "$ac_cv_prog_gnu_m4_gnu" = yes; then
+    M4_GNU=--gnu
+  else
+    M4_GNU=
+  fi
+
+  if test x$ac_had_posixly_correct = xyes; then
+    POSIXLY_CORRECT=:
+    if test $ac_cv_prog_gnu_m4_gnu = no; then
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: the version of M4 that was found does not support -g" >&5
+printf "%s\n" "$as_me: WARNING: the version of M4 that was found does not support -g" >&2;}
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using it with POSIXLY_CORRECT set may cause problems" >&5
+printf "%s\n" "$as_me: WARNING: using it with POSIXLY_CORRECT set may cause problems" >&2;}
+    fi
+  fi
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how m4 supports trace files" >&5
+printf %s "checking how m4 supports trace files... " >&6; }
+if test ${ac_cv_prog_gnu_m4_debugfile+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case `$M4 --help < /dev/null 2>&1` in
+      *debugfile*) ac_cv_prog_gnu_m4_debugfile=--debugfile ;;
+      *) ac_cv_prog_gnu_m4_debugfile=--error-output ;;
+    esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gnu_m4_debugfile" >&5
+printf "%s\n" "$ac_cv_prog_gnu_m4_debugfile" >&6; }
+  M4_DEBUGFILE=$ac_cv_prog_gnu_m4_debugfile
+
+
+
+printf "%s\n" "#define M4 \"$M4\"" >>confdefs.h
+
+
+printf "%s\n" "#define M4_GNU_OPTION \"$M4_GNU\"" >>confdefs.h
+
+# Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_PERL+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case $PERL in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_path_PERL="$as_dir$ac_word$ac_exec_ext"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+if test -n "$PERL"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
+printf "%s\n" "$PERL" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+
+HELP2MAN=${HELP2MAN-"${am_missing_run}help2man"}
+
+# Extract the first word of "xsltproc", so it can be a program name with args.
+set dummy xsltproc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_XSLTPROC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case $XSLTPROC in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_XSLTPROC="$XSLTPROC" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_path_XSLTPROC="$as_dir$ac_word$ac_exec_ext"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+XSLTPROC=$ac_cv_path_XSLTPROC
+if test -n "$XSLTPROC"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $XSLTPROC" >&5
+printf "%s\n" "$XSLTPROC" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+
+
+# Checks for header files.
+
+
+
+# Checks for compiler characteristics.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+printf %s "checking for inline... " >&6; }
+if test ${ac_cv_c_inline+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo (void) {return 0; }
+$ac_kw foo_t foo (void) {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+  test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+printf "%s\n" "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  *)
+    case $ac_cv_c_inline in
+      no) ac_val=;;
+      *) ac_val=$ac_cv_c_inline;;
+    esac
+    cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+    ;;
+esac
+
+
+# Gnulib (later checks).  Putting them here rather than right after
+# gl_EARLY avoids some redundant checks.
+
+
+
+
+
+
+
+
+                        # Check whether --enable-cross-guesses was given.
+if test ${enable_cross_guesses+y}
+then :
+  enableval=$enable_cross_guesses; if test "x$enableval" != xconservative && test "x$enableval" != xrisky; then
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-cross-guesses" >&5
+printf "%s\n" "$as_me: WARNING: invalid argument supplied to --enable-cross-guesses" >&2;}
+       enableval=conservative
+     fi
+     gl_cross_guesses="$enableval"
+else $as_nop
+  gl_cross_guesses=conservative
+fi
+
+  if test $gl_cross_guesses = risky; then
+    gl_cross_guess_normal="guessing yes"
+    gl_cross_guess_inverted="guessing no"
+  else
+    gl_cross_guess_normal="guessing no"
+    gl_cross_guess_inverted="guessing yes"
+  fi
+          LIBC_FATAL_STDERR_=1
+  export LIBC_FATAL_STDERR_
+
+
+
+    HAVE_CHOWN=1;
+  HAVE_COPY_FILE_RANGE=1;
+  HAVE_DUP3=1;
+  HAVE_EUIDACCESS=1;
+  HAVE_EXECVPE=1;
+  HAVE_FACCESSAT=1;
+  HAVE_FCHDIR=1;
+  HAVE_FCHOWNAT=1;
+  HAVE_FDATASYNC=1;
+  HAVE_FSYNC=1;
+  HAVE_FTRUNCATE=1;
+  HAVE_GETDTABLESIZE=1;
+  HAVE_GETENTROPY=1;
+  HAVE_GETGROUPS=1;
+  HAVE_GETHOSTNAME=1;
+  HAVE_GETLOGIN=1;
+  HAVE_GETPAGESIZE=1;
+  HAVE_GETPASS=1;
+  HAVE_GROUP_MEMBER=1;
+  HAVE_LCHOWN=1;
+  HAVE_LINK=1;
+  HAVE_LINKAT=1;
+  HAVE_PIPE=1;
+  HAVE_PIPE2=1;
+  HAVE_PREAD=1;
+  HAVE_PWRITE=1;
+  HAVE_READLINK=1;
+  HAVE_READLINKAT=1;
+  HAVE_SETHOSTNAME=1;
+  HAVE_SLEEP=1;
+  HAVE_SYMLINK=1;
+  HAVE_SYMLINKAT=1;
+  HAVE_UNLINKAT=1;
+  HAVE_USLEEP=1;
+  HAVE_DECL_ENVIRON=1;
+  HAVE_DECL_EXECVPE=1;
+  HAVE_DECL_FCHDIR=1;
+  HAVE_DECL_FDATASYNC=1;
+  HAVE_DECL_GETDOMAINNAME=1;
+  HAVE_DECL_GETLOGIN=1;
+  HAVE_DECL_GETLOGIN_R=1;
+  HAVE_DECL_GETPAGESIZE=1;
+  HAVE_DECL_GETUSERSHELL=1;
+  HAVE_DECL_SETHOSTNAME=1;
+  HAVE_DECL_TRUNCATE=1;
+  HAVE_DECL_TTYNAME_R=1;
+  HAVE_OS_H=0;
+  HAVE_SYS_PARAM_H=0;
+  REPLACE_ACCESS=0;
+  REPLACE_CHOWN=0;
+  REPLACE_CLOSE=0;
+  REPLACE_DUP=0;
+  REPLACE_DUP2=0;
+  REPLACE_EXECL=0;
+  REPLACE_EXECLE=0;
+  REPLACE_EXECLP=0;
+  REPLACE_EXECV=0;
+  REPLACE_EXECVE=0;
+  REPLACE_EXECVP=0;
+  REPLACE_EXECVPE=0;
+  REPLACE_FACCESSAT=0;
+  REPLACE_FCHOWNAT=0;
+  REPLACE_FTRUNCATE=0;
+  REPLACE_GETCWD=0;
+  REPLACE_GETDOMAINNAME=0;
+  REPLACE_GETDTABLESIZE=0;
+  REPLACE_GETLOGIN_R=0;
+  REPLACE_GETGROUPS=0;
+  REPLACE_GETPAGESIZE=0;
+  REPLACE_GETPASS=0;
+  REPLACE_ISATTY=0;
+  REPLACE_LCHOWN=0;
+  REPLACE_LINK=0;
+  REPLACE_LINKAT=0;
+  REPLACE_LSEEK=0;
+  REPLACE_PREAD=0;
+  REPLACE_PWRITE=0;
+  REPLACE_READ=0;
+  REPLACE_READLINK=0;
+  REPLACE_READLINKAT=0;
+  REPLACE_RMDIR=0;
+  REPLACE_SLEEP=0;
+  REPLACE_SYMLINK=0;
+  REPLACE_SYMLINKAT=0;
+  REPLACE_TRUNCATE=0;
+  REPLACE_TTYNAME_R=0;
+  REPLACE_UNLINK=0;
+  REPLACE_UNLINKAT=0;
+  REPLACE_USLEEP=0;
+  REPLACE_WRITE=0;
+  UNISTD_H_HAVE_SYS_RANDOM_H=0;
+  UNISTD_H_HAVE_WINSOCK2_H=0;
+  UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
+
+
+
+
+  GL_GNULIB_ACCESS=0
+
+
+
+  GL_GNULIB_CHDIR=0
+
+
+
+  GL_GNULIB_CHOWN=0
+
+
+
+  GL_GNULIB_CLOSE=0
+
+
+
+  GL_GNULIB_COPY_FILE_RANGE=0
+
+
+
+  GL_GNULIB_DUP=0
+
+
+
+  GL_GNULIB_DUP2=0
+
+
+
+  GL_GNULIB_DUP3=0
+
+
+
+  GL_GNULIB_ENVIRON=0
+
+
+
+  GL_GNULIB_EUIDACCESS=0
+
+
+
+  GL_GNULIB_EXECL=0
+
+
+
+  GL_GNULIB_EXECLE=0
+
+
+
+  GL_GNULIB_EXECLP=0
+
+
+
+  GL_GNULIB_EXECV=0
+
+
+
+  GL_GNULIB_EXECVE=0
+
+
+
+  GL_GNULIB_EXECVP=0
+
+
+
+  GL_GNULIB_EXECVPE=0
+
+
+
+  GL_GNULIB_FACCESSAT=0
+
+
+
+  GL_GNULIB_FCHDIR=0
+
+
+
+  GL_GNULIB_FCHOWNAT=0
+
+
+
+  GL_GNULIB_FDATASYNC=0
+
+
+
+  GL_GNULIB_FSYNC=0
+
+
+
+  GL_GNULIB_FTRUNCATE=0
+
+
+
+  GL_GNULIB_GETCWD=0
+
+
+
+  GL_GNULIB_GETDOMAINNAME=0
+
+
+
+  GL_GNULIB_GETDTABLESIZE=0
+
+
+
+  GL_GNULIB_GETENTROPY=0
+
+
+
+  GL_GNULIB_GETGROUPS=0
+
+
+
+  GL_GNULIB_GETHOSTNAME=0
+
+
+
+  GL_GNULIB_GETLOGIN=0
+
+
+
+  GL_GNULIB_GETLOGIN_R=0
+
+
+
+  GL_GNULIB_GETOPT_POSIX=0
+
+
+
+  GL_GNULIB_GETPAGESIZE=0
+
+
+
+  GL_GNULIB_GETPASS=0
+
+
+
+  GL_GNULIB_GETUSERSHELL=0
+
+
+
+  GL_GNULIB_GROUP_MEMBER=0
+
+
+
+  GL_GNULIB_ISATTY=0
+
+
+
+  GL_GNULIB_LCHOWN=0
+
+
+
+  GL_GNULIB_LINK=0
+
+
+
+  GL_GNULIB_LINKAT=0
+
+
+
+  GL_GNULIB_LSEEK=0
+
+
+
+  GL_GNULIB_PIPE=0
+
+
+
+  GL_GNULIB_PIPE2=0
+
+
+
+  GL_GNULIB_PREAD=0
+
+
+
+  GL_GNULIB_PWRITE=0
+
+
+
+  GL_GNULIB_READ=0
+
+
+
+  GL_GNULIB_READLINK=0
+
+
+
+  GL_GNULIB_READLINKAT=0
+
+
+
+  GL_GNULIB_RMDIR=0
+
+
+
+  GL_GNULIB_SETHOSTNAME=0
+
+
+
+  GL_GNULIB_SLEEP=0
+
+
+
+  GL_GNULIB_SYMLINK=0
+
+
+
+  GL_GNULIB_SYMLINKAT=0
+
+
+
+  GL_GNULIB_TRUNCATE=0
+
+
+
+  GL_GNULIB_TTYNAME_R=0
+
+
+
+  GL_GNULIB_UNISTD_H_GETOPT=0
+
+
+
+  GL_GNULIB_UNISTD_H_NONBLOCKING=0
+
+
+
+  GL_GNULIB_UNISTD_H_SIGPIPE=0
+
+
+
+  GL_GNULIB_UNLINK=0
+
+
+
+  GL_GNULIB_UNLINKAT=0
+
+
+
+  GL_GNULIB_USLEEP=0
+
+
+
+  GL_GNULIB_WRITE=0
+
+
+
+  GL_GNULIB_MDA_ACCESS=1
+
+
+
+  GL_GNULIB_MDA_CHDIR=1
+
+
+
+  GL_GNULIB_MDA_CLOSE=1
+
+
+
+  GL_GNULIB_MDA_DUP=1
+
+
+
+  GL_GNULIB_MDA_DUP2=1
+
+
+
+  GL_GNULIB_MDA_EXECL=1
+
+
+
+  GL_GNULIB_MDA_EXECLE=1
+
+
+
+  GL_GNULIB_MDA_EXECLP=1
+
+
+
+  GL_GNULIB_MDA_EXECV=1
+
+
+
+  GL_GNULIB_MDA_EXECVE=1
+
+
+
+  GL_GNULIB_MDA_EXECVP=1
+
+
+
+  GL_GNULIB_MDA_EXECVPE=1
+
+
+
+  GL_GNULIB_MDA_GETCWD=1
+
+
+
+  GL_GNULIB_MDA_GETPID=1
+
+
+
+  GL_GNULIB_MDA_ISATTY=1
+
+
+
+  GL_GNULIB_MDA_LSEEK=1
+
+
+
+  GL_GNULIB_MDA_READ=1
+
+
+
+  GL_GNULIB_MDA_RMDIR=1
+
+
+
+  GL_GNULIB_MDA_SWAB=1
+
+
+
+  GL_GNULIB_MDA_UNLINK=1
+
+
+
+  GL_GNULIB_MDA_WRITE=1
+
+
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define size_t unsigned int" >>confdefs.h
+
+fi
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments.  Useless!
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
+printf %s "checking for working alloca.h... " >&6; }
+if test ${ac_cv_working_alloca_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <alloca.h>
+int
+main (void)
+{
+char *p = (char *) alloca (2 * sizeof (int));
+			  if (p) return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_working_alloca_h=yes
+else $as_nop
+  ac_cv_working_alloca_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
+printf "%s\n" "$ac_cv_working_alloca_h" >&6; }
+if test $ac_cv_working_alloca_h = yes; then
+
+printf "%s\n" "#define HAVE_ALLOCA_H 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
+printf %s "checking for alloca... " >&6; }
+if test ${ac_cv_func_alloca_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test $ac_cv_working_alloca_h = yes; then
+  ac_cv_func_alloca_works=yes
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stddef.h>
+#ifndef alloca
+# ifdef __GNUC__
+#  define alloca __builtin_alloca
+# elif defined _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  ifdef  __cplusplus
+extern "C"
+#  endif
+void *alloca (size_t);
+# endif
+#endif
+
+int
+main (void)
+{
+char *p = (char *) alloca (1);
+				    if (p) return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_func_alloca_works=yes
+else $as_nop
+  ac_cv_func_alloca_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
+printf "%s\n" "$ac_cv_func_alloca_works" >&6; }
+fi
+
+if test $ac_cv_func_alloca_works = yes; then
+
+printf "%s\n" "#define HAVE_ALLOCA 1" >>confdefs.h
+
+else
+  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble.  Some versions do not even contain alloca or
+# contain a buggy version.  If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+
+
+
+
+
+ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
+
+printf "%s\n" "#define C_ALLOCA 1" >>confdefs.h
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
+printf %s "checking stack direction for C alloca... " >&6; }
+if test ${ac_cv_c_stack_direction+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  ac_cv_c_stack_direction=0
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+find_stack_direction (int *addr, int depth)
+{
+  int dir, dummy = 0;
+  if (! addr)
+    addr = &dummy;
+  *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
+  dir = depth ? find_stack_direction (addr, depth - 1) : 0;
+  return dir + dummy;
+}
+
+int
+main (int argc, char **argv)
+{
+  return find_stack_direction (0, argc + !argv + 20) < 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  ac_cv_c_stack_direction=1
+else $as_nop
+  ac_cv_c_stack_direction=-1
 fi
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
   conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
+printf "%s\n" "$ac_cv_c_stack_direction" >&6; }
+printf "%s\n" "#define STACK_DIRECTION $ac_cv_c_stack_direction" >>confdefs.h
+
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5
-$as_echo "$ac_cv_func_malloc_0_nonnull" >&6; }
-  case "$ac_cv_func_malloc_0_nonnull" in
-    *yes)
-
-$as_echo "#define HAVE_MALLOC_GNU 1" >>confdefs.h
-
-      ;;
-    *)
-      $as_echo "#define HAVE_MALLOC_GNU 0" >>confdefs.h
-
-     REPLACE_MALLOC=1
-
-      ;;
-  esac
 
 
-  if test $REPLACE_MALLOC = 1; then
+    HAVE__EXIT=1;
+  HAVE_ALIGNED_ALLOC=1;
+  HAVE_ATOLL=1;
+  HAVE_CANONICALIZE_FILE_NAME=1;
+  HAVE_DECL_ECVT=1;
+  HAVE_DECL_FCVT=1;
+  HAVE_DECL_GCVT=1;
+  HAVE_DECL_GETLOADAVG=1;
+  HAVE_GETSUBOPT=1;
+  HAVE_GRANTPT=1;
+  HAVE_INITSTATE=1;
+  HAVE_DECL_INITSTATE=1;
+  HAVE_MBTOWC=1;
+  HAVE_MKDTEMP=1;
+  HAVE_MKOSTEMP=1;
+  HAVE_MKOSTEMPS=1;
+  HAVE_MKSTEMP=1;
+  HAVE_MKSTEMPS=1;
+  HAVE_POSIX_MEMALIGN=1;
+  HAVE_POSIX_OPENPT=1;
+  HAVE_PTSNAME=1;
+  HAVE_PTSNAME_R=1;
+  HAVE_QSORT_R=1;
+  HAVE_RANDOM=1;
+  HAVE_RANDOM_H=1;
+  HAVE_RANDOM_R=1;
+  HAVE_REALLOCARRAY=1;
+  HAVE_REALPATH=1;
+  HAVE_RPMATCH=1;
+  HAVE_SECURE_GETENV=1;
+  HAVE_SETENV=1;
+  HAVE_DECL_SETENV=1;
+  HAVE_SETSTATE=1;
+  HAVE_DECL_SETSTATE=1;
+  HAVE_STRTOD=1;
+  HAVE_STRTOL=1;
+  HAVE_STRTOLD=1;
+  HAVE_STRTOLL=1;
+  HAVE_STRTOUL=1;
+  HAVE_STRTOULL=1;
+  HAVE_STRUCT_RANDOM_DATA=1;
+  HAVE_SYS_LOADAVG_H=0;
+  HAVE_UNLOCKPT=1;
+  HAVE_DECL_UNSETENV=1;
+  REPLACE_ALIGNED_ALLOC=0;
+  REPLACE_CALLOC=0;
+  REPLACE_CANONICALIZE_FILE_NAME=0;
+  REPLACE_FREE=0;
+  REPLACE_INITSTATE=0;
+  REPLACE_MALLOC=0;
+  REPLACE_MBTOWC=0;
+  REPLACE_MKSTEMP=0;
+  REPLACE_POSIX_MEMALIGN=0;
+  REPLACE_PTSNAME=0;
+  REPLACE_PTSNAME_R=0;
+  REPLACE_PUTENV=0;
+  REPLACE_QSORT_R=0;
+  REPLACE_RANDOM=0;
+  REPLACE_RANDOM_R=0;
+  REPLACE_REALLOC=0;
+  REPLACE_REALLOCARRAY=0;
+  REPLACE_REALPATH=0;
+  REPLACE_SETENV=0;
+  REPLACE_SETSTATE=0;
+  REPLACE_STRTOD=0;
+  REPLACE_STRTOL=0;
+  REPLACE_STRTOLD=0;
+  REPLACE_STRTOLL=0;
+  REPLACE_STRTOUL=0;
+  REPLACE_STRTOULL=0;
+  REPLACE_UNSETENV=0;
+  REPLACE_WCTOMB=0;
 
 
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether malloc is ptrdiff_t safe" >&5
+printf %s "checking whether malloc is ptrdiff_t safe... " >&6; }
+if test ${gl_cv_malloc_ptrdiff+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdint.h>
 
+int
+main (void)
+{
+/* 64-bit ptrdiff_t is so wide that no practical platform
+               can exceed it.  */
+            #define WIDE_PTRDIFF (PTRDIFF_MAX >> 31 >> 31 != 0)
 
+            /* On rare machines where size_t fits in ptrdiff_t there
+               is no problem.  */
+            #define NARROW_SIZE (SIZE_MAX <= PTRDIFF_MAX)
 
+            /* glibc 2.30 and later malloc refuses to exceed ptrdiff_t
+               bounds even on 32-bit platforms.  We don't know which
+               non-glibc systems are safe.  */
+            #define KNOWN_SAFE (2 < __GLIBC__ + (30 <= __GLIBC_MINOR__))
 
+            #if WIDE_PTRDIFF || NARROW_SIZE || KNOWN_SAFE
+              return 0;
+            #else
+              #error "malloc might not be ptrdiff_t safe"
+              syntax error
+            #endif
 
-
-  gl_LIBOBJS="$gl_LIBOBJS malloc.$ac_objext"
-
-  fi
-
-
-cat >>confdefs.h <<_ACEOF
-#define GNULIB_MALLOC_GNU 1
+  ;
+  return 0;
+}
 _ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_malloc_ptrdiff=yes
+else $as_nop
+  gl_cv_malloc_ptrdiff=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_malloc_ptrdiff" >&5
+printf "%s\n" "$gl_cv_malloc_ptrdiff" >&6; }
+
+
+
+
+  test "$gl_cv_malloc_ptrdiff" = yes || REPLACE_MALLOC=1
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether malloc, realloc, calloc set errno on failure" >&5
+printf %s "checking whether malloc, realloc, calloc set errno on failure... " >&6; }
+if test ${gl_cv_func_malloc_posix+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+                                    case "$host_os" in
+        mingw*)
+          gl_cv_func_malloc_posix=no ;;
+        irix* | solaris*)
+
+          gl_cv_func_malloc_posix=no ;;
+        *)
+          gl_cv_func_malloc_posix=yes ;;
+      esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_malloc_posix" >&5
+printf "%s\n" "$gl_cv_func_malloc_posix" >&6; }
 
 
 
 
 
-  if test $gl_cv_func_malloc_posix = yes; then
+  if test "$gl_cv_func_malloc_posix" = yes; then
 
-$as_echo "#define HAVE_MALLOC_POSIX 1" >>confdefs.h
+printf "%s\n" "#define HAVE_MALLOC_POSIX 1" >>confdefs.h
 
   else
     REPLACE_MALLOC=1
   fi
 
+
+
+
   if test $REPLACE_MALLOC = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS malloc.$ac_objext"
-
+    REPLACE_CALLOC=1
   fi
 
 
 
+  GL_GNULIB__EXIT=0
 
 
-          GNULIB_MALLOC_POSIX=1
+
+  GL_GNULIB_ALIGNED_ALLOC=0
+
+
+
+  GL_GNULIB_ATOLL=0
+
+
+
+  GL_GNULIB_CALLOC_POSIX=0
+
+
+
+  GL_GNULIB_CANONICALIZE_FILE_NAME=0
+
+
+
+  GL_GNULIB_FREE_POSIX=0
+
+
+
+  GL_GNULIB_GETLOADAVG=0
+
+
+
+  GL_GNULIB_GETSUBOPT=0
+
+
+
+  GL_GNULIB_GRANTPT=0
+
+
+
+  GL_GNULIB_MALLOC_POSIX=0
+
+
+
+  GL_GNULIB_MBTOWC=0
+
+
+
+  GL_GNULIB_MKDTEMP=0
+
+
+
+  GL_GNULIB_MKOSTEMP=0
+
+
+
+  GL_GNULIB_MKOSTEMPS=0
+
+
+
+  GL_GNULIB_MKSTEMP=0
+
+
+
+  GL_GNULIB_MKSTEMPS=0
+
+
+
+  GL_GNULIB_POSIX_MEMALIGN=0
+
+
+
+  GL_GNULIB_POSIX_OPENPT=0
+
+
+
+  GL_GNULIB_PTSNAME=0
+
+
+
+  GL_GNULIB_PTSNAME_R=0
+
+
+
+  GL_GNULIB_PUTENV=0
+
+
+
+  GL_GNULIB_QSORT_R=0
+
+
+
+  GL_GNULIB_RANDOM=0
+
+
+
+  GL_GNULIB_RANDOM_R=0
+
+
+
+  GL_GNULIB_REALLOCARRAY=0
+
+
+
+  GL_GNULIB_REALLOC_POSIX=0
+
+
+
+  GL_GNULIB_REALPATH=0
+
+
+
+  GL_GNULIB_RPMATCH=0
+
+
+
+  GL_GNULIB_SECURE_GETENV=0
+
+
+
+  GL_GNULIB_SETENV=0
+
+
+
+  GL_GNULIB_STRTOD=0
+
+
+
+  GL_GNULIB_STRTOL=0
+
+
+
+  GL_GNULIB_STRTOLD=0
+
+
+
+  GL_GNULIB_STRTOLL=0
+
+
+
+  GL_GNULIB_STRTOUL=0
+
+
+
+  GL_GNULIB_STRTOULL=0
+
+
+
+  GL_GNULIB_SYSTEM_POSIX=0
+
+
+
+  GL_GNULIB_UNLOCKPT=0
+
+
+
+  GL_GNULIB_UNSETENV=0
+
+
+
+  GL_GNULIB_WCTOMB=0
+
+
+
+  GL_GNULIB_MDA_ECVT=1
+
+
+
+  GL_GNULIB_MDA_FCVT=1
+
+
+
+  GL_GNULIB_MDA_GCVT=1
+
+
+
+  GL_GNULIB_MDA_MKTEMP=1
+
+
+
+  GL_GNULIB_MDA_PUTENV=1
 
 
 
 
-
-$as_echo "#define GNULIB_TEST_MALLOC_POSIX 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_math_h='<'math.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <math.h>" >&5
-$as_echo_n "checking absolute name of <math.h>... " >&6; }
-if ${gl_cv_next_math_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-             if test $ac_cv_header_math_h = yes; then
-
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
+         { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5
+printf %s "checking whether lstat correctly handles trailing slash... " >&6; }
+if test ${gl_cv_func_lstat_dereferences_slashed_symlink+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  rm -f conftest.sym conftest.file
+     echo >conftest.file
+     if test "$cross_compiling" = yes
+then :
   case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'math.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
+          linux-* | linux)
+            # Guess yes on Linux systems.
+            gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;;
+          *-gnu* | gnu*)
+            # Guess yes on glibc systems.
+            gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;;
+          mingw*)
+            # Guess no on native Windows.
+            gl_cv_func_lstat_dereferences_slashed_symlink="guessing no" ;;
+          *)
+            # If we don't know, obey --enable-cross-guesses.
+            gl_cv_func_lstat_dereferences_slashed_symlink="$gl_cross_guess_normal" ;;
+        esac
 
-        gl_cv_absolute_math_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_math_h
-           gl_cv_next_math_h='"'$gl_header'"'
-          else
-               gl_cv_next_math_h='<'math.h'>'
-             fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_math_h" >&5
-$as_echo "$gl_cv_next_math_h" >&6; }
-     fi
-     NEXT_MATH_H=$gl_cv_next_math_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'math.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_math_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_MATH_H=$gl_next_as_first_directive
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NAN macro works" >&5
-$as_echo_n "checking whether NAN macro works... " >&6; }
-if ${gl_cv_header_math_nan_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-int
-main ()
-{
-/* Solaris 10 has a broken definition of NAN.  Other platforms
-        fail to provide NAN, or provide it only in C99 mode; this
-        test only needs to fail when NAN is provided but wrong.  */
-         float f = 1.0f;
-#ifdef NAN
-         f = NAN;
-#endif
-         return f == 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_header_math_nan_works=yes
-else
-  gl_cv_header_math_nan_works=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_math_nan_works" >&5
-$as_echo "$gl_cv_header_math_nan_works" >&6; }
-  if test $gl_cv_header_math_nan_works = no; then
-    REPLACE_NAN=1
-  fi
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether HUGE_VAL works" >&5
-$as_echo_n "checking whether HUGE_VAL works... " >&6; }
-if ${gl_cv_header_math_huge_val_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-int
-main ()
-{
-/* Solaris 10 has a broken definition of HUGE_VAL.  */
-         double d = HUGE_VAL;
-         return d == 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_header_math_huge_val_works=yes
-else
-  gl_cv_header_math_huge_val_works=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_math_huge_val_works" >&5
-$as_echo "$gl_cv_header_math_huge_val_works" >&6; }
-  if test $gl_cv_header_math_huge_val_works = no; then
-    REPLACE_HUGE_VAL=1
-  fi
-
-
-
-
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-
-
-
-
-
-  if test $ac_cv_func_mbsinit = yes && test $ac_cv_func_mbrtowc = yes; then
-
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5
-$as_echo_n "checking whether mbrtowc handles incomplete characters... " >&6; }
-if ${gl_cv_func_mbrtowc_incomplete_state+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-                  case "$host_os" in
-                     # Guess no on AIX and OSF/1.
-        aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;;
-                     # Guess yes otherwise.
-        *)           gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;;
-      esac
-      if test $LOCALE_JA != none; then
-        if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <locale.h>
-#include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-int main ()
-{
-  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
-    {
-      const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
-      mbstate_t state;
-      wchar_t wc;
-
-      memset (&state, '\0', sizeof (mbstate_t));
-      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
-        if (mbsinit (&state))
-          return 2;
-    }
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_mbrtowc_incomplete_state=yes
-else
-  gl_cv_func_mbrtowc_incomplete_state=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      else
-        if test $LOCALE_FR_UTF8 != none; then
-          if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <locale.h>
-#include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-int main ()
-{
-  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
-    {
-      const char input[] = "B\303\274\303\237er"; /* "Büßer" */
-      mbstate_t state;
-      wchar_t wc;
-
-      memset (&state, '\0', sizeof (mbstate_t));
-      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
-        if (mbsinit (&state))
-          return 2;
-    }
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_mbrtowc_incomplete_state=yes
-else
-  gl_cv_func_mbrtowc_incomplete_state=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-        fi
-      fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5
-$as_echo "$gl_cv_func_mbrtowc_incomplete_state" >&6; }
-
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5
-$as_echo_n "checking whether mbrtowc works as well as mbtowc... " >&6; }
-if ${gl_cv_func_mbrtowc_sanitycheck+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-                  case "$host_os" in
-                    # Guess no on Solaris 8.
-        solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;;
-                    # Guess yes otherwise.
-        *)          gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;;
-      esac
-      if test $LOCALE_ZH_CN != none; then
-        if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <locale.h>
-#include <stdlib.h>
-#include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-int main ()
-{
-  /* This fails on Solaris 8:
-     mbrtowc returns 2, and sets wc to 0x00F0.
-     mbtowc returns 4 (correct) and sets wc to 0x5EDC.  */
-  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
-    {
-      char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
-      mbstate_t state;
-      wchar_t wc;
-
-      memset (&state, '\0', sizeof (mbstate_t));
-      if (mbrtowc (&wc, input + 3, 6, &state) != 4
-          && mbtowc (&wc, input + 3, 6) == 4)
-        return 2;
-    }
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_mbrtowc_sanitycheck=yes
-else
-  gl_cv_func_mbrtowc_sanitycheck=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5
-$as_echo "$gl_cv_func_mbrtowc_sanitycheck" >&6; }
-
-    REPLACE_MBSTATE_T=0
-    case "$gl_cv_func_mbrtowc_incomplete_state" in
-      *yes) ;;
-      *) REPLACE_MBSTATE_T=1 ;;
-    esac
-    case "$gl_cv_func_mbrtowc_sanitycheck" in
-      *yes) ;;
-      *) REPLACE_MBSTATE_T=1 ;;
-    esac
-  else
-    REPLACE_MBSTATE_T=1
-  fi
-
-
-
-  if test $ac_cv_func_mbrtowc = no; then
-    HAVE_MBRTOWC=0
-    ac_fn_c_check_decl "$LINENO" "mbrtowc" "ac_cv_have_decl_mbrtowc" "
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-
-"
-if test "x$ac_cv_have_decl_mbrtowc" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_MBRTOWC $ac_have_decl
-_ACEOF
-
-    if test $ac_cv_have_decl_mbrtowc = yes; then
-                        REPLACE_MBRTOWC=1
-    fi
-  else
-    if test $REPLACE_MBSTATE_T = 1; then
-      REPLACE_MBRTOWC=1
-    else
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles a NULL pwc argument" >&5
-$as_echo_n "checking whether mbrtowc handles a NULL pwc argument... " >&6; }
-if ${gl_cv_func_mbrtowc_null_arg1+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-                  case "$host_os" in
-                  # Guess no on Solaris.
-        solaris*) gl_cv_func_mbrtowc_null_arg1="guessing no" ;;
-                  # Guess yes otherwise.
-        *)        gl_cv_func_mbrtowc_null_arg1="guessing yes" ;;
-      esac
-      if test $LOCALE_FR_UTF8 != none; then
-        if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <locale.h>
-#include <stdlib.h>
-#include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-int main ()
-{
-  int result = 0;
-
-  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
-    {
-      char input[] = "\303\237er";
-      mbstate_t state;
-      wchar_t wc;
-      size_t ret;
-
-      memset (&state, '\0', sizeof (mbstate_t));
-      wc = (wchar_t) 0xBADFACE;
-      ret = mbrtowc (&wc, input, 5, &state);
-      if (ret != 2)
-        result |= 1;
-      if (!mbsinit (&state))
-        result |= 2;
-
-      memset (&state, '\0', sizeof (mbstate_t));
-      ret = mbrtowc (NULL, input, 5, &state);
-      if (ret != 2) /* Solaris 7 fails here: ret is -1.  */
-        result |= 4;
-      if (!mbsinit (&state))
-        result |= 8;
-    }
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_mbrtowc_null_arg1=yes
-else
-  gl_cv_func_mbrtowc_null_arg1=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_null_arg1" >&5
-$as_echo "$gl_cv_func_mbrtowc_null_arg1" >&6; }
-
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles a NULL string argument" >&5
-$as_echo_n "checking whether mbrtowc handles a NULL string argument... " >&6; }
-if ${gl_cv_func_mbrtowc_null_arg2+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-                  case "$host_os" in
-              # Guess no on OSF/1.
-        osf*) gl_cv_func_mbrtowc_null_arg2="guessing no" ;;
-              # Guess yes otherwise.
-        *)    gl_cv_func_mbrtowc_null_arg2="guessing yes" ;;
-      esac
-      if test $LOCALE_FR_UTF8 != none; then
-        if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <locale.h>
-#include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-int main ()
-{
-  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
-    {
-      mbstate_t state;
-      wchar_t wc;
-      int ret;
-
-      memset (&state, '\0', sizeof (mbstate_t));
-      wc = (wchar_t) 0xBADFACE;
-      mbrtowc (&wc, NULL, 5, &state);
-      /* Check that wc was not modified.  */
-      if (wc != (wchar_t) 0xBADFACE)
-        return 2;
-    }
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_mbrtowc_null_arg2=yes
-else
-  gl_cv_func_mbrtowc_null_arg2=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_null_arg2" >&5
-$as_echo "$gl_cv_func_mbrtowc_null_arg2" >&6; }
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc has a correct return value" >&5
-$as_echo_n "checking whether mbrtowc has a correct return value... " >&6; }
-if ${gl_cv_func_mbrtowc_retval+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-                  case "$host_os" in
-                                   # Guess no on HP-UX, Solaris, native Windows.
-        hpux* | solaris* | mingw*) gl_cv_func_mbrtowc_retval="guessing no" ;;
-                                   # Guess yes otherwise.
-        *)                         gl_cv_func_mbrtowc_retval="guessing yes" ;;
-      esac
-      if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none \
-         || { case "$host_os" in mingw*) true;; *) false;; esac; }; then
-        if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <locale.h>
-#include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-int main ()
-{
-  int result = 0;
-  int found_some_locale = 0;
-  /* This fails on Solaris.  */
-  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
-    {
-      char input[] = "B\303\274\303\237er"; /* "Büßer" */
-      mbstate_t state;
-      wchar_t wc;
-
-      memset (&state, '\0', sizeof (mbstate_t));
-      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
-        {
-          input[1] = '\0';
-          if (mbrtowc (&wc, input + 2, 5, &state) != 1)
-            result |= 1;
-        }
-      found_some_locale = 1;
-    }
-  /* This fails on HP-UX 11.11.  */
-  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
-    {
-      char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
-      mbstate_t state;
-      wchar_t wc;
-
-      memset (&state, '\0', sizeof (mbstate_t));
-      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
-        {
-          input[1] = '\0';
-          if (mbrtowc (&wc, input + 2, 5, &state) != 2)
-            result |= 2;
-        }
-      found_some_locale = 1;
-    }
-  /* This fails on native Windows.  */
-  if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL)
-    {
-      char input[] = "<\223\372\226\173\214\352>"; /* "<日本語>" */
-      mbstate_t state;
-      wchar_t wc;
-
-      memset (&state, '\0', sizeof (mbstate_t));
-      if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
-        {
-          input[3] = '\0';
-          if (mbrtowc (&wc, input + 4, 4, &state) != 1)
-            result |= 4;
-        }
-      found_some_locale = 1;
-    }
-  if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL)
-    {
-      char input[] = "<\244\351\245\273\273\171>"; /* "<日本語>" */
-      mbstate_t state;
-      wchar_t wc;
-
-      memset (&state, '\0', sizeof (mbstate_t));
-      if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
-        {
-          input[3] = '\0';
-          if (mbrtowc (&wc, input + 4, 4, &state) != 1)
-            result |= 8;
-        }
-      found_some_locale = 1;
-    }
-  if (setlocale (LC_ALL, "Chinese_China.936") != NULL)
-    {
-      char input[] = "<\310\325\261\276\325\132>"; /* "<日本語>" */
-      mbstate_t state;
-      wchar_t wc;
-
-      memset (&state, '\0', sizeof (mbstate_t));
-      if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
-        {
-          input[3] = '\0';
-          if (mbrtowc (&wc, input + 4, 4, &state) != 1)
-            result |= 16;
-        }
-      found_some_locale = 1;
-    }
-  return (found_some_locale ? result : 77);
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_mbrtowc_retval=yes
-else
-  if test $? != 77; then
-             gl_cv_func_mbrtowc_retval=no
-           fi
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_retval" >&5
-$as_echo "$gl_cv_func_mbrtowc_retval" >&6; }
-
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc returns 0 when parsing a NUL character" >&5
-$as_echo_n "checking whether mbrtowc returns 0 when parsing a NUL character... " >&6; }
-if ${gl_cv_func_mbrtowc_nul_retval+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-                  case "$host_os" in
-                       # Guess no on Solaris 8 and 9.
-        solaris2.[89]) gl_cv_func_mbrtowc_nul_retval="guessing no" ;;
-                       # Guess yes otherwise.
-        *)             gl_cv_func_mbrtowc_nul_retval="guessing yes" ;;
-      esac
-      if test $LOCALE_ZH_CN != none; then
-        if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <locale.h>
-#include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-int main ()
-{
-  /* This fails on Solaris 8 and 9.  */
-  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
-    {
-      mbstate_t state;
-      wchar_t wc;
-
-      memset (&state, '\0', sizeof (mbstate_t));
-      if (mbrtowc (&wc, "", 1, &state) != 0)
-        return 2;
-    }
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_mbrtowc_nul_retval=yes
-else
-  gl_cv_func_mbrtowc_nul_retval=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_nul_retval" >&5
-$as_echo "$gl_cv_func_mbrtowc_nul_retval" >&6; }
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works on empty input" >&5
-$as_echo_n "checking whether mbrtowc works on empty input... " >&6; }
-if ${gl_cv_func_mbrtowc_empty_input+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-                  case "$host_os" in
-                              # Guess no on AIX and glibc systems.
-        aix* | *-gnu* | gnu*) gl_cv_func_mbrtowc_empty_input="guessing no" ;;
-                              # Guess yes on native Windows.
-        mingw*)               gl_cv_func_mbrtowc_empty_input="guessing yes" ;;
-        *)                    gl_cv_func_mbrtowc_empty_input="guessing yes" ;;
-      esac
-      if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-           #include <wchar.h>
-           static wchar_t wc;
-           static mbstate_t mbs;
-           int
-           main (void)
-           {
-             return mbrtowc (&wc, "", 0, &mbs) != (size_t) -2;
-           }
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_mbrtowc_empty_input=yes
-else
-  gl_cv_func_mbrtowc_empty_input=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_empty_input" >&5
-$as_echo "$gl_cv_func_mbrtowc_empty_input" >&6; }
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C locale is free of encoding errors" >&5
-$as_echo_n "checking whether the C locale is free of encoding errors... " >&6; }
-if ${gl_cv_C_locale_sans_EILSEQ+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-               gl_cv_C_locale_sans_EILSEQ="$gl_cross_guess_normal"
-
-     if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                 # Guess yes on native Windows.
-         mingw*) gl_cv_C_locale_sans_EILSEQ="guessing yes" ;;
-       esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
-            #include <locale.h>
-            #include <wchar.h>
-
-int
-main ()
-{
-
-            int i;
-            char *locale = setlocale (LC_ALL, "C");
-            if (! locale)
-              return 2;
-            for (i = CHAR_MIN; i <= CHAR_MAX; i++)
-              {
-                char c = i;
-                wchar_t wc;
-                mbstate_t mbs = { 0, };
-                size_t ss = mbrtowc (&wc, &c, 1, &mbs);
-                if (1 < ss)
-                  return 3;
-              }
-            return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_C_locale_sans_EILSEQ=yes
-else
-  gl_cv_C_locale_sans_EILSEQ=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_C_locale_sans_EILSEQ" >&5
-$as_echo "$gl_cv_C_locale_sans_EILSEQ" >&6; }
-
-      case "$gl_cv_func_mbrtowc_null_arg1" in
-        *yes) ;;
-        *)
-$as_echo "#define MBRTOWC_NULL_ARG1_BUG 1" >>confdefs.h
-
-           REPLACE_MBRTOWC=1
-           ;;
-      esac
-      case "$gl_cv_func_mbrtowc_null_arg2" in
-        *yes) ;;
-        *)
-$as_echo "#define MBRTOWC_NULL_ARG2_BUG 1" >>confdefs.h
-
-           REPLACE_MBRTOWC=1
-           ;;
-      esac
-      case "$gl_cv_func_mbrtowc_retval" in
-        *yes) ;;
-        *)
-$as_echo "#define MBRTOWC_RETVAL_BUG 1" >>confdefs.h
-
-           REPLACE_MBRTOWC=1
-           ;;
-      esac
-      case "$gl_cv_func_mbrtowc_nul_retval" in
-        *yes) ;;
-        *)
-$as_echo "#define MBRTOWC_NUL_RETVAL_BUG 1" >>confdefs.h
-
-           REPLACE_MBRTOWC=1
-           ;;
-      esac
-      case "$gl_cv_func_mbrtowc_empty_input" in
-        *yes) ;;
-        *)
-$as_echo "#define MBRTOWC_EMPTY_INPUT_BUG 1" >>confdefs.h
-
-           REPLACE_MBRTOWC=1
-           ;;
-      esac
-      case $gl_cv_C_locale_sans_EILSEQ in
-        *yes) ;;
-        *)
-$as_echo "#define C_LOCALE_MAYBE_EILSEQ 1" >>confdefs.h
-
-           REPLACE_MBRTOWC=1
-           ;;
-      esac
-    fi
-  fi
-
-  if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS mbrtowc.$ac_objext"
-
-
-
-  :
-
-  fi
-
-
-
-
-
-          GNULIB_MBRTOWC=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_MBRTOWC 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  if test $ac_cv_func_mbsinit = yes && test $ac_cv_func_mbrtowc = yes; then
-
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5
-$as_echo_n "checking whether mbrtowc handles incomplete characters... " >&6; }
-if ${gl_cv_func_mbrtowc_incomplete_state+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-                  case "$host_os" in
-                     # Guess no on AIX and OSF/1.
-        aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;;
-                     # Guess yes otherwise.
-        *)           gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;;
-      esac
-      if test $LOCALE_JA != none; then
-        if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <locale.h>
-#include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-int main ()
-{
-  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
-    {
-      const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
-      mbstate_t state;
-      wchar_t wc;
-
-      memset (&state, '\0', sizeof (mbstate_t));
-      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
-        if (mbsinit (&state))
-          return 2;
-    }
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_mbrtowc_incomplete_state=yes
-else
-  gl_cv_func_mbrtowc_incomplete_state=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      else
-        if test $LOCALE_FR_UTF8 != none; then
-          if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <locale.h>
-#include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-int main ()
-{
-  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
-    {
-      const char input[] = "B\303\274\303\237er"; /* "Büßer" */
-      mbstate_t state;
-      wchar_t wc;
-
-      memset (&state, '\0', sizeof (mbstate_t));
-      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
-        if (mbsinit (&state))
-          return 2;
-    }
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_mbrtowc_incomplete_state=yes
-else
-  gl_cv_func_mbrtowc_incomplete_state=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-        fi
-      fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5
-$as_echo "$gl_cv_func_mbrtowc_incomplete_state" >&6; }
-
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5
-$as_echo_n "checking whether mbrtowc works as well as mbtowc... " >&6; }
-if ${gl_cv_func_mbrtowc_sanitycheck+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-                  case "$host_os" in
-                    # Guess no on Solaris 8.
-        solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;;
-                    # Guess yes otherwise.
-        *)          gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;;
-      esac
-      if test $LOCALE_ZH_CN != none; then
-        if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <locale.h>
-#include <stdlib.h>
-#include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-int main ()
-{
-  /* This fails on Solaris 8:
-     mbrtowc returns 2, and sets wc to 0x00F0.
-     mbtowc returns 4 (correct) and sets wc to 0x5EDC.  */
-  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
-    {
-      char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
-      mbstate_t state;
-      wchar_t wc;
-
-      memset (&state, '\0', sizeof (mbstate_t));
-      if (mbrtowc (&wc, input + 3, 6, &state) != 4
-          && mbtowc (&wc, input + 3, 6) == 4)
-        return 2;
-    }
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_mbrtowc_sanitycheck=yes
-else
-  gl_cv_func_mbrtowc_sanitycheck=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5
-$as_echo "$gl_cv_func_mbrtowc_sanitycheck" >&6; }
-
-    REPLACE_MBSTATE_T=0
-    case "$gl_cv_func_mbrtowc_incomplete_state" in
-      *yes) ;;
-      *) REPLACE_MBSTATE_T=1 ;;
-    esac
-    case "$gl_cv_func_mbrtowc_sanitycheck" in
-      *yes) ;;
-      *) REPLACE_MBSTATE_T=1 ;;
-    esac
-  else
-    REPLACE_MBSTATE_T=1
-  fi
-
-
-
-  if test $ac_cv_func_mbsinit = no; then
-    HAVE_MBSINIT=0
-    ac_fn_c_check_decl "$LINENO" "mbsinit" "ac_cv_have_decl_mbsinit" "
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-
-"
-if test "x$ac_cv_have_decl_mbsinit" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_MBSINIT $ac_have_decl
-_ACEOF
-
-    if test $ac_cv_have_decl_mbsinit = yes; then
-                        REPLACE_MBSINIT=1
-    fi
-  else
-    if test $REPLACE_MBSTATE_T = 1; then
-      REPLACE_MBSINIT=1
-    else
-                        case "$host_os" in
-        mingw*) REPLACE_MBSINIT=1 ;;
-      esac
-    fi
-  fi
-
-  if test $HAVE_MBSINIT = 0 || test $REPLACE_MBSINIT = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS mbsinit.$ac_objext"
-
-
-  :
-
-  fi
-
-
-
-
-
-          GNULIB_MBSINIT=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_MBSINIT 1" >>confdefs.h
-
-
-
-
-
-
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbswidth is declared in <wchar.h>" >&5
-$as_echo_n "checking whether mbswidth is declared in <wchar.h>... " >&6; }
-if ${ac_cv_have_decl_mbswidth+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
-   before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-
-int
-main ()
-{
-
-  char *p = (char *) mbswidth;
-  return !p;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_have_decl_mbswidth=yes
-else
-  ac_cv_have_decl_mbswidth=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_mbswidth" >&5
-$as_echo "$ac_cv_have_decl_mbswidth" >&6; }
-  if test $ac_cv_have_decl_mbswidth = yes; then
-    ac_val=1
-  else
-    ac_val=0
-  fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_MBSWIDTH_IN_WCHAR_H $ac_val
-_ACEOF
-
-
-
-
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mbstate_t" >&5
-$as_echo_n "checking for mbstate_t... " >&6; }
-if ${ac_cv_type_mbstate_t+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 $ac_includes_default
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
 int
-main ()
+main (void)
 {
-mbstate_t x; return sizeof x;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_type_mbstate_t=yes
-else
-  ac_cv_type_mbstate_t=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_mbstate_t" >&5
-$as_echo "$ac_cv_type_mbstate_t" >&6; }
-   if test $ac_cv_type_mbstate_t = yes; then
-
-$as_echo "#define HAVE_MBSTATE_T 1" >>confdefs.h
-
-   else
-
-$as_echo "#define mbstate_t int" >>confdefs.h
-
-   fi
-
-
-
-  if test $HAVE_MEMCHR = 0 || test $REPLACE_MEMCHR = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS memchr.$ac_objext"
-
-
-  for ac_header in bp-sym.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "bp-sym.h" "ac_cv_header_bp_sym_h" "$ac_includes_default"
-if test "x$ac_cv_header_bp_sym_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_BP_SYM_H 1
-_ACEOF
-
-fi
-
-done
-
-
-  fi
-
-
-
-
-
-          GNULIB_MEMCHR=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_MEMCHR 1" >>confdefs.h
-
-
-
-
-
-
-
-  if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS msvc-inval.$ac_objext"
-
-  fi
-
-  if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS msvc-nothrow.$ac_objext"
-
-  fi
-
-
-cat >>confdefs.h <<_ACEOF
-#define GNULIB_MSVC_NOTHROW 1
-_ACEOF
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for obstacks that work with any size object" >&5
-$as_echo_n "checking for obstacks that work with any size object... " >&6; }
-if ${ac_cv_func_obstack+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include "obstack.h"
-             void *obstack_chunk_alloc (size_t n) { return 0; }
-             void obstack_chunk_free (void *p) { }
-             /* Check that an internal function returns size_t, not int.  */
-             size_t _obstack_memory_used (struct obstack *);
-
-int
-main ()
-{
-struct obstack mem;
-             obstack_init (&mem);
-             obstack_free (&mem, 0);
+struct stat sbuf;
+            if (symlink ("conftest.file", "conftest.sym") != 0)
+              return 1;
+            /* Linux will dereference the symlink and fail, as required by
+               POSIX.  That is better in the sense that it means we will not
+               have to compile and use the lstat wrapper.  */
+            return lstat ("conftest.sym/", &sbuf) == 0;
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_func_obstack=yes
-else
-  ac_cv_func_obstack=no
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_lstat_dereferences_slashed_symlink=yes
+else $as_nop
+  gl_cv_func_lstat_dereferences_slashed_symlink=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_obstack" >&5
-$as_echo "$ac_cv_func_obstack" >&6; }
-   if test "$ac_cv_func_obstack" = yes; then
 
-$as_echo "#define HAVE_OBSTACK 1" >>confdefs.h
+     rm -f conftest.sym conftest.file
 
-   else
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_lstat_dereferences_slashed_symlink" >&5
+printf "%s\n" "$gl_cv_func_lstat_dereferences_slashed_symlink" >&6; }
+  case "$gl_cv_func_lstat_dereferences_slashed_symlink" in
+    *yes)
 
+printf "%s\n" "#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1" >>confdefs.h
 
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS obstack.$ac_objext"
-
-   fi
-
-
-
-
-
-
-  if test $ac_cv_func_obstack_printf = no ; then
-
-
-  if test $ac_cv_func_obstack_printf = yes; then
-    REPLACE_OBSTACK_PRINTF=1
-  fi
-
-  fi
-
-
-
-  if test $ac_cv_have_decl_obstack_printf = no; then
-    HAVE_DECL_OBSTACK_PRINTF=0
-  fi
-
-
-  if test $ac_cv_func_obstack_printf = no || test $REPLACE_OBSTACK_PRINTF = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS obstack_printf.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_OBSTACK_PRINTF=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_OBSTACK_PRINTF 1" >>confdefs.h
-
-
-
-
-
-
-  case "$host_os" in
-    mingw* | pw*)
-      REPLACE_OPEN=1
       ;;
-    *)
-
-      if test "$gl_cv_macro_O_CLOEXEC" != yes; then
-        REPLACE_OPEN=1
-      fi
+  esac
 
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether open recognizes a trailing slash" >&5
-$as_echo_n "checking whether open recognizes a trailing slash... " >&6; }
-if ${gl_cv_func_open_slash+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  # Assume that if we have lstat, we can also check symlinks.
-     if test $ac_cv_func_lstat = yes; then
-       touch conftest.tmp
-       ln -s conftest.tmp conftest.lnk
-     fi
-     if test "$cross_compiling" = yes; then :
 
-        case "$host_os" in
-          freebsd* | aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*)
-            gl_cv_func_open_slash="guessing no" ;;
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether // is distinct from /" >&5
+printf %s "checking whether // is distinct from /... " >&6; }
+if test ${gl_cv_double_slash_root+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+   if test x"$cross_compiling" = xyes ; then
+        # When cross-compiling, there is no way to tell whether // is special
+        # short of a list of hosts.  However, the only known hosts to date
+        # that have a distinct // are Apollo DomainOS (too old to port to),
+        # Cygwin, and z/OS.  If anyone knows of another system for which // has
+        # special semantics and is distinct from /, please report it to
+        # <bug-gnulib@gnu.org>.
+        case $host in
+          *-cygwin | i370-ibm-openedition)
+            gl_cv_double_slash_root=yes ;;
           *)
-            gl_cv_func_open_slash="guessing yes" ;;
+            # Be optimistic and assume that / and // are the same when we
+            # don't know.
+            gl_cv_double_slash_root='unknown, assuming no' ;;
         esac
+      else
+        set x `ls -di / // 2>/dev/null`
+        if test "$2" = "$4" && wc //dev/null >/dev/null 2>&1; then
+          gl_cv_double_slash_root=no
+        else
+          gl_cv_double_slash_root=yes
+        fi
+      fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_double_slash_root" >&5
+printf "%s\n" "$gl_cv_double_slash_root" >&6; }
+  if test "$gl_cv_double_slash_root" = yes; then
 
-else
+printf "%s\n" "#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether realpath works" >&5
+printf %s "checking whether realpath works... " >&6; }
+if test ${gl_cv_func_realpath_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+    rm -rf conftest.a conftest.d
+    touch conftest.a
+    # Assume that if we have lstat, we can also check symlinks.
+    if test $ac_cv_func_lstat = yes; then
+      ln -s conftest.a conftest.l
+    fi
+    mkdir conftest.d
+    if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                       # Guess yes on glibc systems.
+        *-gnu* | gnu*) gl_cv_func_realpath_works="guessing yes" ;;
+                       # Guess 'nearly' on musl systems.
+        *-musl*)       gl_cv_func_realpath_works="guessing nearly" ;;
+                       # Guess no on Cygwin.
+        cygwin*)       gl_cv_func_realpath_works="guessing no" ;;
+                       # Guess no on native Windows.
+        mingw*)        gl_cv_func_realpath_works="guessing no" ;;
+                       # If we don't know, obey --enable-cross-guesses.
+        *)             gl_cv_func_realpath_works="$gl_cross_guess_normal" ;;
+      esac
+
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-#include <fcntl.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-int main ()
+
+
+#include <stdlib.h>
+#if defined __MACH__ && defined __APPLE__
+/* Avoid a crash on Mac OS X.  */
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+#include <mach/thread_status.h>
+#include <mach/exception.h>
+#include <mach/task.h>
+#include <pthread.h>
+/* The exception port on which our thread listens.  */
+static mach_port_t our_exception_port;
+/* The main function of the thread listening for exceptions of type
+   EXC_BAD_ACCESS.  */
+static void *
+mach_exception_thread (void *arg)
 {
-  int result = 0;
-#if HAVE_LSTAT
-  if (open ("conftest.lnk/", O_RDONLY) != -1)
-    result |= 1;
-#endif
-  if (open ("conftest.sl/", O_CREAT, 0600) >= 0)
-    result |= 2;
-  return result;
+  /* Buffer for a message to be received.  */
+  struct {
+    mach_msg_header_t head;
+    mach_msg_body_t msgh_body;
+    char data[1024];
+  } msg;
+  mach_msg_return_t retval;
+  /* Wait for a message on the exception port.  */
+  retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
+                     our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+  if (retval != MACH_MSG_SUCCESS)
+    abort ();
+  exit (1);
 }
+static void
+nocrash_init (void)
+{
+  mach_port_t self = mach_task_self ();
+  /* Allocate a port on which the thread shall listen for exceptions.  */
+  if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
+      == KERN_SUCCESS) {
+    /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html.  */
+    if (mach_port_insert_right (self, our_exception_port, our_exception_port,
+                                MACH_MSG_TYPE_MAKE_SEND)
+        == KERN_SUCCESS) {
+      /* The exceptions we want to catch.  Only EXC_BAD_ACCESS is interesting
+         for us.  */
+      exception_mask_t mask = EXC_MASK_BAD_ACCESS;
+      /* Create the thread listening on the exception port.  */
+      pthread_attr_t attr;
+      pthread_t thread;
+      if (pthread_attr_init (&attr) == 0
+          && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
+          && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
+        pthread_attr_destroy (&attr);
+        /* Replace the exception port info for these exceptions with our own.
+           Note that we replace the exception port for the entire task, not only
+           for a particular thread.  This has the effect that when our exception
+           port gets the message, the thread specific exception port has already
+           been asked, and we don't need to bother about it.
+           See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html.  */
+        task_set_exception_ports (self, mask, our_exception_port,
+                                  EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
+      }
+    }
+  }
+}
+#elif defined _WIN32 && ! defined __CYGWIN__
+/* Avoid a crash on native Windows.  */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winerror.h>
+static LONG WINAPI
+exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
+{
+  switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
+    {
+    case EXCEPTION_ACCESS_VIOLATION:
+    case EXCEPTION_IN_PAGE_ERROR:
+    case EXCEPTION_STACK_OVERFLOW:
+    case EXCEPTION_GUARD_PAGE:
+    case EXCEPTION_PRIV_INSTRUCTION:
+    case EXCEPTION_ILLEGAL_INSTRUCTION:
+    case EXCEPTION_DATATYPE_MISALIGNMENT:
+    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
+    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
+      exit (1);
+    }
+  return EXCEPTION_CONTINUE_SEARCH;
+}
+static void
+nocrash_init (void)
+{
+  SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
+}
+#else
+/* Avoid a crash on POSIX systems.  */
+#include <signal.h>
+#include <unistd.h>
+/* A POSIX signal handler.  */
+static void
+exception_handler (int sig)
+{
+  _exit (1);
+}
+static void
+nocrash_init (void)
+{
+#ifdef SIGSEGV
+  signal (SIGSEGV, exception_handler);
+#endif
+#ifdef SIGBUS
+  signal (SIGBUS, exception_handler);
+#endif
+}
+#endif
+
+        #include <errno.h>
+        #include <stdlib.h>
+        #include <string.h>
+
+int
+main (void)
+{
+
+        int result = 0;
+        /* This test fails on Solaris 10.  */
+        {
+          char *name = realpath ("conftest.a", NULL);
+          if (!(name && *name == '/'))
+            result |= 1;
+          free (name);
+        }
+        /* This test fails on older versions of Cygwin.  */
+        {
+          char *name = realpath ("conftest.b/../conftest.a", NULL);
+          if (name != NULL)
+            result |= 2;
+          free (name);
+        }
+        /* This test fails on Cygwin 2.9.  */
+        #if HAVE_LSTAT
+        {
+          char *name = realpath ("conftest.l/../conftest.a", NULL);
+          if (name != NULL || errno != ENOTDIR)
+            result |= 4;
+          free (name);
+        }
+        #endif
+        /* This test fails on Mac OS X 10.13, OpenBSD 6.0.  */
+        {
+          char *name = realpath ("conftest.a/", NULL);
+          if (name != NULL)
+            result |= 8;
+          free (name);
+        }
+        /* This test fails on AIX 7, Solaris 10.  */
+        {
+          char *name1 = realpath (".", NULL);
+          char *name2 = realpath ("conftest.d//./..", NULL);
+          if (! name1 || ! name2 || strcmp (name1, name2))
+            result |= 16;
+          free (name1);
+          free (name2);
+        }
+        #ifdef __linux__
+        /* On Linux, // is the same as /. See also double-slash-root.m4.
+           realpath() should respect this.
+           This test fails on musl libc 1.2.2.  */
+        {
+          char *name = realpath ("//", NULL);
+          if (! name || strcmp (name, "/"))
+            result |= 32;
+          free (name);
+        }
+        #endif
+        return result;
+
+  ;
+  return 0;
+}
+
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_open_slash=yes
-else
-  gl_cv_func_open_slash=no
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_realpath_works=yes
+else $as_nop
+  case $? in
+        32) gl_cv_func_realpath_works=nearly ;;
+        *)  gl_cv_func_realpath_works=no ;;
+      esac
+
 fi
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
   conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
-     rm -f conftest.sl conftest.tmp conftest.lnk
+    rm -rf conftest.a conftest.l conftest.d
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_open_slash" >&5
-$as_echo "$gl_cv_func_open_slash" >&6; }
-  case "$gl_cv_func_open_slash" in
-    *no)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_realpath_works" >&5
+printf "%s\n" "$gl_cv_func_realpath_works" >&6; }
+  case "$gl_cv_func_realpath_works" in
+    *yes)
 
-$as_echo "#define OPEN_TRAILING_SLASH_BUG 1" >>confdefs.h
+printf "%s\n" "#define FUNC_REALPATH_WORKS 1" >>confdefs.h
 
       ;;
-  esac
+    *nearly)
 
-      case "$gl_cv_func_open_slash" in
-        *no)
-          REPLACE_OPEN=1
-          ;;
-      esac
+printf "%s\n" "#define FUNC_REALPATH_NEARLY_WORKS 1" >>confdefs.h
+
       ;;
   esac
 
 
 
-  if test $REPLACE_OPEN = 1; then
 
 
 
 
 
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS open.$ac_objext"
-
-
-
-  :
-
-  fi
-
-
-
-
-
-          GNULIB_OPEN=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_OPEN 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-
-
-             if test "$ERRNO_H:$REPLACE_STRERROR_0" != :0; then
-            REPLACE_PERROR=1
-  fi
-  case ${gl_cv_func_strerror_r_works-unset} in
-    unset|*yes)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether perror matches strerror" >&5
-$as_echo_n "checking whether perror matches strerror... " >&6; }
-if ${gl_cv_func_perror_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
   case "$host_os" in
-                       # Guess yes on musl systems.
-              *-musl*) gl_cv_func_perror_works="guessing yes" ;;
-                       # Guess yes on native Windows.
-              mingw*)  gl_cv_func_perror_works="guessing yes" ;;
-                       # Otherwise obey --enable-cross-guesses.
-              *)       gl_cv_func_perror_works="$gl_cross_guess_normal" ;;
-            esac
+    mingw*) ;;
+    *)      ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd"
+if test "x$ac_cv_func_getcwd" = xyes
+then :
+  printf "%s\n" "#define HAVE_GETCWD 1" >>confdefs.h
 
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+fi
+ ;;
+  esac
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5
+printf %s "checking for C/C++ restrict keyword... " >&6; }
+if test ${ac_cv_c_restrict+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_cv_c_restrict=no
+   # Put '__restrict__' first, to avoid problems with glibc and non-GCC; see:
+   # https://lists.gnu.org/archive/html/bug-autoconf/2016-02/msg00006.html
+   # Put 'restrict' last, because C++ lacks it.
+   for ac_kw in __restrict__ __restrict _Restrict restrict; do
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <errno.h>
-                #include <stdio.h>
-                #include <stdlib.h>
-                #include <string.h>
+typedef int *int_ptr;
+	   int foo (int_ptr $ac_kw ip) { return ip[0]; }
+	   int bar (int [$ac_kw]); /* Catch GCC bug 14050.  */
+	   int bar (int ip[$ac_kw]) { return ip[0]; }
 
 int
-main ()
+main (void)
 {
-char *str = strerror (-1);
-                if (!getenv("CONFTEST_OUTPUT")) return 0;
-                if (!str) str = "";
-                puts (str);
-                errno = -1;
-                perror ("");
-                return 0;
+int s[1];
+	   int *$ac_kw t = s;
+	   t[0] = 0;
+	   return foo (t) + bar (t);
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  if CONFTEST_OUTPUT=1 ./conftest$EXEEXT >conftest.txt1 2>conftest.txt2 \
-               && cmp conftest.txt1 conftest.txt2 >/dev/null; then
-              gl_cv_func_perror_works=yes
-            else
-              gl_cv_func_perror_works=no
-            fi
-            rm -rf conftest.txt1 conftest.txt2
-else
-  gl_cv_func_perror_works=no
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_c_restrict=$ac_kw
 fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+     test "$ac_cv_c_restrict" != no && break
+   done
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_perror_works" >&5
-$as_echo "$gl_cv_func_perror_works" >&6; }
-      case "$gl_cv_func_perror_works" in
-        *yes) ;;
-        *) REPLACE_PERROR=1 ;;
-      esac
-      ;;
-    *)
-                  REPLACE_PERROR=1
-      ;;
-  esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5
+printf "%s\n" "$ac_cv_c_restrict" >&6; }
 
-  if test $REPLACE_PERROR = 1; then
+ case $ac_cv_c_restrict in
+   restrict) ;;
+   no) printf "%s\n" "#define restrict /**/" >>confdefs.h
+ ;;
+   *)  printf "%s\n" "#define restrict $ac_cv_c_restrict" >>confdefs.h
+ ;;
+ esac
 
 
 
 
 
+  if test $ac_cv_func__set_invalid_parameter_handler = yes; then
+    HAVE_MSVC_INVALID_PARAMETER_HANDLER=1
 
+printf "%s\n" "#define HAVE_MSVC_INVALID_PARAMETER_HANDLER 1" >>confdefs.h
 
-
-  gl_LIBOBJS="$gl_LIBOBJS perror.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_PERROR=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_PERROR 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-  if test $ac_cv_func_pipe2 != yes; then
-    HAVE_PIPE2=0
-  fi
-
-
-
-
-
-
-          GNULIB_PIPE2=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_PIPE2 1" >>confdefs.h
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define GNULIB_PIPE2_SAFER 1
-_ACEOF
-
-
-
-
-
-
-
-
-  if test $REPLACE_POSIX_SPAWN = 1; then
-    REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=1
   else
-            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn_file_actions_addclose works" >&5
-$as_echo_n "checking whether posix_spawn_file_actions_addclose works... " >&6; }
-if ${gl_cv_func_posix_spawn_file_actions_addclose_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  # Guess no on musl libc and Solaris, yes otherwise.
-          case "$host_os" in
-            *-musl*)  gl_cv_func_posix_spawn_file_actions_addclose_works="guessing no" ;;
-            solaris*) gl_cv_func_posix_spawn_file_actions_addclose_works="guessing no" ;;
-                      # Guess no on native Windows.
-            mingw*)   gl_cv_func_posix_spawn_file_actions_addclose_works="guessing no" ;;
-            *)        gl_cv_func_posix_spawn_file_actions_addclose_works="guessing yes" ;;
-          esac
+    HAVE_MSVC_INVALID_PARAMETER_HANDLER=0
+  fi
 
-else
+
+
+    SYS_IOCTL_H_HAVE_WINSOCK2_H=0;
+  SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
+
+  REPLACE_IOCTL=0;
+
+
+
+gl_mda_defines='
+#if defined _WIN32 && !defined __CYGWIN__
+#define access    _access
+#define chdir     _chdir
+#define chmod     _chmod
+#define close     _close
+#define creat     _creat
+#define dup       _dup
+#define dup2      _dup2
+#define ecvt      _ecvt
+#define execl     _execl
+#define execle    _execle
+#define execlp    _execlp
+#define execv     _execv
+#define execve    _execve
+#define execvp    _execvp
+#define execvpe   _execvpe
+#define fcloseall _fcloseall
+#define fcvt      _fcvt
+#define fdopen    _fdopen
+#define fileno    _fileno
+#define gcvt      _gcvt
+#define getcwd    _getcwd
+#define getpid    _getpid
+#define getw      _getw
+#define isatty    _isatty
+#define j0        _j0
+#define j1        _j1
+#define jn        _jn
+#define lfind     _lfind
+#define lsearch   _lsearch
+#define lseek     _lseek
+#define memccpy   _memccpy
+#define mkdir     _mkdir
+#define mktemp    _mktemp
+#define open      _open
+#define putenv    _putenv
+#define putw      _putw
+#define read      _read
+#define rmdir     _rmdir
+#define strdup    _strdup
+#define swab      _swab
+#define tempnam   _tempnam
+#define tzset     _tzset
+#define umask     _umask
+#define unlink    _unlink
+#define utime     _utime
+#define wcsdup    _wcsdup
+#define write     _write
+#define y0        _y0
+#define y1        _y1
+#define yn        _yn
+#endif
+'
+
+
+
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if environ is properly declared" >&5
+printf %s "checking if environ is properly declared... " >&6; }
+if test ${gt_cv_var_environ_declaration+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
+#if HAVE_UNISTD_H
+     #include <unistd.h>
+     #endif
+     /* mingw, BeOS, Haiku declare environ in <stdlib.h>, not in <unistd.h>.  */
+     #include <stdlib.h>
 
-#include <spawn.h>
-int main ()
+            typedef struct { int foo; } foo_t;
+            extern foo_t environ;
+int
+main (void)
 {
-  posix_spawn_file_actions_t actions;
-  if (posix_spawn_file_actions_init (&actions) != 0)
-    return 1;
-  if (posix_spawn_file_actions_addclose (&actions, 10000000) == 0)
-    return 2;
+environ.foo = 1;
+  ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_posix_spawn_file_actions_addclose_works=yes
-else
-  gl_cv_func_posix_spawn_file_actions_addclose_works=no
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gt_cv_var_environ_declaration=no
+else $as_nop
+  gt_cv_var_environ_declaration=yes
 fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_var_environ_declaration" >&5
+printf "%s\n" "$gt_cv_var_environ_declaration" >&6; }
+  if test $gt_cv_var_environ_declaration = yes; then
 
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_file_actions_addclose_works" >&5
-$as_echo "$gl_cv_func_posix_spawn_file_actions_addclose_works" >&6; }
-    case "$gl_cv_func_posix_spawn_file_actions_addclose_works" in
-      *yes) ;;
-      *) REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=1 ;;
-    esac
-  fi
-
-  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS spawn_faction_addclose.$ac_objext"
+printf "%s\n" "#define HAVE_ENVIRON_DECL 1" >>confdefs.h
 
   fi
 
 
+  if test $gt_cv_var_environ_declaration != yes; then
+    HAVE_DECL_ENVIRON=0
+  fi
 
 
 
-          GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=1
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the preprocessor supports include_next" >&5
+printf %s "checking whether the preprocessor supports include_next... " >&6; }
+if test ${gl_cv_have_include_next+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  rm -rf conftestd1a conftestd1b conftestd2
+     mkdir conftestd1a conftestd1b conftestd2
+                                                  cat <<EOF > conftestd1a/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+     cat <<EOF > conftestd1b/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include <stdio.h>
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+     cat <<EOF > conftestd2/conftest.h
+#ifndef DEFINED_IN_CONFTESTD1
+#error "include_next test doesn't work"
+#endif
+#define DEFINED_IN_CONFTESTD2
+EOF
+     gl_save_CPPFLAGS="$CPPFLAGS"
+     CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2"
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <conftest.h>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_have_include_next=yes
+else $as_nop
+  CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <conftest.h>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_have_include_next=buggy
+else $as_nop
+  gl_cv_have_include_next=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+     CPPFLAGS="$gl_save_CPPFLAGS"
+     rm -rf conftestd1a conftestd1b conftestd2
 
-
-
-
-$as_echo "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-  if test $REPLACE_POSIX_SPAWN = 1; then
-    REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=1
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_include_next" >&5
+printf "%s\n" "$gl_cv_have_include_next" >&6; }
+  PRAGMA_SYSTEM_HEADER=
+  if test $gl_cv_have_include_next = yes; then
+    INCLUDE_NEXT=include_next
+    INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+    if test -n "$GCC"; then
+      PRAGMA_SYSTEM_HEADER='#pragma GCC system_header'
+    fi
   else
-            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn_file_actions_adddup2 works" >&5
-$as_echo_n "checking whether posix_spawn_file_actions_adddup2 works... " >&6; }
-if ${gl_cv_func_posix_spawn_file_actions_adddup2_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  # Guess no on musl libc and Solaris, yes otherwise.
-          case "$host_os" in
-            *-musl*)  gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing no";;
-            solaris*) gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing no";;
-                      # Guess no on native Windows.
-            mingw*)   gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing no" ;;
-            *)        gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing yes";;
-          esac
+    if test $gl_cv_have_include_next = buggy; then
+      INCLUDE_NEXT=include
+      INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+    else
+      INCLUDE_NEXT=include
+      INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include
+    fi
+  fi
 
-else
+
+
+
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether source code line length is unlimited" >&5
+printf %s "checking whether source code line length is unlimited... " >&6; }
+if test ${gl_cv_source_line_length_unlimited+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-#include <spawn.h>
-int main ()
-{
-  posix_spawn_file_actions_t actions;
-  if (posix_spawn_file_actions_init (&actions) != 0)
-    return 1;
-  if (posix_spawn_file_actions_adddup2 (&actions, 10000000, 2) == 0)
-    return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_posix_spawn_file_actions_adddup2_works=yes
-else
-  gl_cv_func_posix_spawn_file_actions_adddup2_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_file_actions_adddup2_works" >&5
-$as_echo "$gl_cv_func_posix_spawn_file_actions_adddup2_works" >&6; }
-    case "$gl_cv_func_posix_spawn_file_actions_adddup2_works" in
-      *yes) ;;
-      *) REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=1 ;;
-    esac
-  fi
-
-  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS spawn_faction_adddup2.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-  if test $REPLACE_POSIX_SPAWN = 1; then
-    REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=1
-  else
-            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn_file_actions_addopen works" >&5
-$as_echo_n "checking whether posix_spawn_file_actions_addopen works... " >&6; }
-if ${gl_cv_func_posix_spawn_file_actions_addopen_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  # Guess no on musl libc and Solaris, yes otherwise.
-          case "$host_os" in
-            *-musl*)  gl_cv_func_posix_spawn_file_actions_addopen_works="guessing no";;
-            solaris*) gl_cv_func_posix_spawn_file_actions_addopen_works="guessing no";;
-                      # Guess no on native Windows.
-            mingw*)   gl_cv_func_posix_spawn_file_actions_addopen_works="guessing no" ;;
-            *)        gl_cv_func_posix_spawn_file_actions_addopen_works="guessing yes";;
-          esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <spawn.h>
-#include <fcntl.h>
-int main ()
-{
-  posix_spawn_file_actions_t actions;
-  if (posix_spawn_file_actions_init (&actions) != 0)
-    return 1;
-  if (posix_spawn_file_actions_addopen (&actions, 10000000, "foo", 0, O_RDONLY)
-      == 0)
-    return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_posix_spawn_file_actions_addopen_works=yes
-else
-  gl_cv_func_posix_spawn_file_actions_addopen_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_file_actions_addopen_works" >&5
-$as_echo "$gl_cv_func_posix_spawn_file_actions_addopen_works" >&6; }
-    case "$gl_cv_func_posix_spawn_file_actions_addopen_works" in
-      *yes) ;;
-      *) REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=1 ;;
-    esac
-  fi
-
-  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS spawn_faction_addopen.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN 1" >>confdefs.h
-
-
-
-
-
-
-  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS spawn_faction_destroy.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_DESTROY 1" >>confdefs.h
-
-
-
-
-
-
-  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS spawn_faction_init.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_INIT 1" >>confdefs.h
-
-
-
-
-
-
-  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS spawnattr_destroy.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_POSIX_SPAWNATTR_DESTROY=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_POSIX_SPAWNATTR_DESTROY 1" >>confdefs.h
-
-
-
-
-
-
-  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS spawnattr_init.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_POSIX_SPAWNATTR_INIT=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_POSIX_SPAWNATTR_INIT 1" >>confdefs.h
-
-
-
-
-
-
-  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS spawnattr_setflags.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_POSIX_SPAWNATTR_SETFLAGS=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_POSIX_SPAWNATTR_SETFLAGS 1" >>confdefs.h
-
-
-
-
-
-
-  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS spawnattr_setsigmask.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_POSIX_SPAWNATTR_SETSIGMASK=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_POSIX_SPAWNATTR_SETSIGMASK 1" >>confdefs.h
-
-
-
-
-
-
-  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS spawnp.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_POSIX_SPAWNP=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_POSIX_SPAWNP 1" >>confdefs.h
-
-
-
-
-
-  if test $gl_cv_func_frexp_no_libm = yes; then
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexp works" >&5
-$as_echo_n "checking whether frexp works... " >&6; }
-if ${gl_cv_func_frexp_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-           netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;;
-           mingw*) # Guess yes with MSVC, no with mingw.
-             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef _MSC_VER
- Good
+#ifdef __TANDEM
+choke me
 #endif
 
 _ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Good" >/dev/null 2>&1; then :
-  gl_cv_func_frexp_works="guessing yes"
-else
-  gl_cv_func_frexp_works="guessing no"
+  $EGREP "choke me" >/dev/null 2>&1
+then :
+  gl_cv_source_line_length_unlimited=no
+else $as_nop
+  gl_cv_source_line_length_unlimited=yes
 fi
-rm -f conftest*
-
-             ;;
-           *) gl_cv_func_frexp_works="guessing yes" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <float.h>
-#include <math.h>
-#include <string.h>
-#if HAVE_DECL_ALARM
-# include <signal.h>
-# include <unistd.h>
-#endif
-/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
-   ICC 10.0 has a bug when optimizing the expression -zero.
-   The expression -DBL_MIN * DBL_MIN does not work when cross-compiling
-   to PowerPC on Mac OS X 10.5.  */
-#if defined __hpux || defined __sgi || defined __ICC
-static double
-compute_minus_zero (void)
-{
-  return -DBL_MIN * DBL_MIN;
-}
-# define minus_zero compute_minus_zero ()
-#else
-double minus_zero = -0.0;
-#endif
-int main()
-{
-  int result = 0;
-  int i;
-  volatile double x;
-  double zero = 0.0;
-#if HAVE_DECL_ALARM
-  /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite
-     number.  Let the test fail in this case.  */
-  signal (SIGALRM, SIG_DFL);
-  alarm (5);
-#endif
-  /* Test on denormalized numbers.  */
-  for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
-    ;
-  if (x > 0.0)
-    {
-      int exp;
-      double y = frexp (x, &exp);
-      /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022.
-         On NetBSD: y = 0.75. Correct: y = 0.5.  */
-      if (y != 0.5)
-        result |= 1;
-    }
-  /* Test on infinite numbers.  */
-  x = 1.0 / zero;
-  {
-    int exp;
-    double y = frexp (x, &exp);
-    if (y != x)
-      result |= 2;
-  }
-  /* Test on negative zero.  */
-  x = minus_zero;
-  {
-    int exp;
-    double y = frexp (x, &exp);
-    if (memcmp (&y, &x, sizeof x))
-      result |= 4;
-  }
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_frexp_works=yes
-else
-  gl_cv_func_frexp_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
+rm -rf conftest*
 
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_works" >&5
-$as_echo "$gl_cv_func_frexp_works" >&6; }
-
-    case "$gl_cv_func_frexp_works" in
-      *yes)
-
-$as_echo "#define HAVE_FREXP_IN_LIBC 1" >>confdefs.h
-
-        ;;
-    esac
-  fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexp can be used without linking with libm" >&5
-$as_echo_n "checking whether ldexp can be used without linking with libm... " >&6; }
-if ${gl_cv_func_ldexp_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             double x;
-             int y;
-int
-main ()
-{
-return ldexp (x, y) < 1;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_ldexp_no_libm=yes
-else
-  gl_cv_func_ldexp_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_no_libm" >&5
-$as_echo "$gl_cv_func_ldexp_no_libm" >&6; }
-  if test $gl_cv_func_ldexp_no_libm = yes; then
-
-$as_echo "#define HAVE_LDEXP_IN_LIBC 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl() can be used without linking with libm" >&5
-$as_echo_n "checking whether frexpl() can be used without linking with libm... " >&6; }
-if ${gl_cv_func_frexpl_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             long double x;
-int
-main ()
-{
-int e; return frexpl (x, &e) > 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_frexpl_no_libm=yes
-else
-  gl_cv_func_frexpl_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_no_libm" >&5
-$as_echo "$gl_cv_func_frexpl_no_libm" >&6; }
-
-  if test $gl_cv_func_frexpl_no_libm = yes; then
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl works" >&5
-$as_echo_n "checking whether frexpl works... " >&6; }
-if ${gl_cv_func_frexpl_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-           aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*)
-              gl_cv_func_frexpl_works="guessing no";;
-           *) gl_cv_func_frexpl_works="guessing yes";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <float.h>
-#include <math.h>
-/* Override the values of <float.h>, like done in float.in.h.  */
-#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
-# undef LDBL_MIN_EXP
-# define LDBL_MIN_EXP    (-16381)
-#endif
-#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
-# undef LDBL_MIN_EXP
-# define LDBL_MIN_EXP    (-16381)
-#endif
-#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
-# undef LDBL_MIN_EXP
-# define LDBL_MIN_EXP DBL_MIN_EXP
-#endif
-#if defined __sgi && (LDBL_MANT_DIG >= 106)
-# if defined __GNUC__
-#  undef LDBL_MIN_EXP
-#  define LDBL_MIN_EXP DBL_MIN_EXP
-# endif
-#endif
-extern
-#ifdef __cplusplus
-"C"
-#endif
-long double frexpl (long double, int *);
-int main()
-{
-  int result = 0;
-  volatile long double x;
-  /* Test on finite numbers that fails on AIX 5.1.  */
-  x = 16.0L;
-  {
-    int exp = -9999;
-    frexpl (x, &exp);
-    if (exp != 5)
-      result |= 1;
-  }
-  /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl
-     function returns an invalid (incorrectly normalized) value: it returns
-               y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
-     but the correct result is
-          0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 }  */
-  x = 1.01L;
-  {
-    int exp = -9999;
-    long double y = frexpl (x, &exp);
-    if (!(exp == 1 && y == 0.505L))
-      result |= 2;
-  }
-  /* Test on large finite numbers.  This fails on BeOS at i = 16322, while
-     LDBL_MAX_EXP = 16384.
-     In the loop end test, we test x against Infinity, rather than comparing
-     i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP.  */
-  {
-    int i;
-    for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
-      {
-        int exp = -9999;
-        frexpl (x, &exp);
-        if (exp != i)
-          {
-            result |= 4;
-            break;
-          }
-      }
-  }
-  /* Test on denormalized numbers.  */
-  {
-    int i;
-    for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
-      ;
-    if (x > 0.0L)
-      {
-        int exp;
-        long double y = frexpl (x, &exp);
-        /* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
-           exp = -16382, y = 0.5.  On Mac OS X 10.5: exp = -16384, y = 0.5.  */
-        if (exp != LDBL_MIN_EXP - 1)
-          result |= 8;
-      }
-  }
-  /* Test on infinite numbers.  */
-  x = 1.0L / 0.0L;
-  {
-    int exp;
-    long double y = frexpl (x, &exp);
-    if (y != x)
-      result |= 16;
-  }
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_frexpl_works=yes
-else
-  gl_cv_func_frexpl_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_works" >&5
-$as_echo "$gl_cv_func_frexpl_works" >&6; }
-
-    case "$gl_cv_func_frexpl_works" in
-      *yes) gl_func_frexpl_no_libm=yes ;;
-      *)    gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;;
-    esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_source_line_length_unlimited" >&5
+printf "%s\n" "$gl_cv_source_line_length_unlimited" >&6; }
+  if test $gl_cv_source_line_length_unlimited = no; then
+    PRAGMA_COLUMNS="#pragma COLUMNS 10000"
   else
-    gl_func_frexpl_no_libm=no
-        REPLACE_FREXPL=1
-  fi
-  if test $gl_func_frexpl_no_libm = yes; then
-
-$as_echo "#define HAVE_FREXPL_IN_LIBC 1" >>confdefs.h
-
-            ac_fn_c_check_decl "$LINENO" "frexpl" "ac_cv_have_decl_frexpl" "#include <math.h>
-"
-if test "x$ac_cv_have_decl_frexpl" = xyes; then :
-
-else
-  HAVE_DECL_FREXPL=0
-fi
-
-  fi
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexpl() can be used without linking with libm" >&5
-$as_echo_n "checking whether ldexpl() can be used without linking with libm... " >&6; }
-if ${gl_cv_func_ldexpl_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-             long double x;
-int
-main ()
-{
-return ldexpl (x, -1) > 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_ldexpl_no_libm=yes
-else
-  gl_cv_func_ldexpl_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_no_libm" >&5
-$as_echo "$gl_cv_func_ldexpl_no_libm" >&6; }
-
-  if test $gl_cv_func_ldexpl_no_libm = yes; then
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexpl works" >&5
-$as_echo_n "checking whether ldexpl works... " >&6; }
-if ${gl_cv_func_ldexpl_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-           aix | aix[3-6]*) gl_cv_func_ldexpl_works="guessing no" ;;
-                            # Guess yes on native Windows.
-           mingw*)          gl_cv_func_ldexpl_works="guessing yes" ;;
-           *)               gl_cv_func_ldexpl_works="guessing yes" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <math.h>
-extern
-#ifdef __cplusplus
-"C"
-#endif
-long double ldexpl (long double, int);
-int main()
-{
-  int result = 0;
-  {
-    volatile long double x = 1.0;
-    volatile long double y = ldexpl (x, -1);
-    if (y != 0.5L)
-      result |= 1;
-  }
-  {
-    volatile long double x = 1.73205L;
-    volatile long double y = ldexpl (x, 0);
-    if (y != x)
-      result |= 2;
-  }
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_ldexpl_works=yes
-else
-  gl_cv_func_ldexpl_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_works" >&5
-$as_echo "$gl_cv_func_ldexpl_works" >&6; }
-
-    case "$gl_cv_func_ldexpl_works" in
-      *yes)
-
-$as_echo "#define HAVE_LDEXPL_IN_LIBC 1" >>confdefs.h
-
-                        ac_fn_c_check_decl "$LINENO" "ldexpl" "ac_cv_have_decl_ldexpl" "#include <math.h>
-"
-if test "x$ac_cv_have_decl_ldexpl" = xyes; then :
-
-else
-  HAVE_DECL_LDEXPL=0
-fi
-
-        ;;
-    esac
-  fi
-
-
-
-  if test $gl_cv_func_vfprintf_posix = no; then
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf.$ac_objext"
-
-  REPLACE_PRINTF=1
-
-$as_echo "#define REPLACE_PRINTF_POSIX 1" >>confdefs.h
-
-  :
-
+    PRAGMA_COLUMNS=
   fi
 
 
 
 
-
-
-          GNULIB_PRINTF_POSIX=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_PRINTF_POSIX 1" >>confdefs.h
-
-
-
-
-  ac_fn_c_check_decl "$LINENO" "program_invocation_name" "ac_cv_have_decl_program_invocation_name" "#include <errno.h>
-"
-if test "x$ac_cv_have_decl_program_invocation_name" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_PROGRAM_INVOCATION_NAME $ac_have_decl
-_ACEOF
-
-  ac_fn_c_check_decl "$LINENO" "program_invocation_short_name" "ac_cv_have_decl_program_invocation_short_name" "#include <errno.h>
-"
-if test "x$ac_cv_have_decl_program_invocation_short_name" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME $ac_have_decl
-_ACEOF
-
-
-      :
-
-
-  :
-
-
-
-
-  for ac_func in raise
-do :
-  ac_fn_c_check_func "$LINENO" "raise" "ac_cv_func_raise"
-if test "x$ac_cv_func_raise" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_RAISE 1
-_ACEOF
-
-fi
-done
-
-  if test $ac_cv_func_raise = no; then
-    HAVE_RAISE=0
-  else
-
-
-      if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
-        REPLACE_RAISE=1
-      fi
-
-
-
-
-
-  if test $gl_cv_type_sigset_t = yes; then
-    ac_fn_c_check_func "$LINENO" "sigprocmask" "ac_cv_func_sigprocmask"
-if test "x$ac_cv_func_sigprocmask" = xyes; then :
-  gl_cv_func_sigprocmask=1
-fi
-
-  fi
-  if test -z "$gl_cv_func_sigprocmask"; then
-    HAVE_POSIX_SIGNALBLOCKING=0
-  fi
-
-      if test $HAVE_POSIX_SIGNALBLOCKING = 0; then
-        :
-      fi
-
-  fi
-
-  if test $HAVE_RAISE = 0 || test $REPLACE_RAISE = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS raise.$ac_objext"
-
-    :
-  fi
-
-
-
-
-
-          GNULIB_RAISE=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_RAISE 1" >>confdefs.h
-
-
-
-
-
-
-  if test $ac_cv_func_readlink = no; then
-    HAVE_READLINK=0
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether readlink signature is correct" >&5
-$as_echo_n "checking whether readlink signature is correct... " >&6; }
-if ${gl_cv_decl_readlink_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <unistd.h>
-      /* Cause compilation failure if original declaration has wrong type.  */
-      ssize_t readlink (const char *, char *, size_t);
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_decl_readlink_works=yes
-else
-  gl_cv_decl_readlink_works=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_readlink_works" >&5
-$as_echo "$gl_cv_decl_readlink_works" >&6; }
-            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether readlink handles trailing slash correctly" >&5
-$as_echo_n "checking whether readlink handles trailing slash correctly... " >&6; }
-if ${gl_cv_func_readlink_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  # We have readlink, so assume ln -s works.
-       ln -s conftest.no-such conftest.link
-       ln -s conftest.link conftest.lnk2
-       if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                             # Guess yes on Linux systems.
-            linux-* | linux) gl_cv_func_readlink_works="guessing yes" ;;
-                             # Guess yes on glibc systems.
-            *-gnu* | gnu*)   gl_cv_func_readlink_works="guessing yes" ;;
-                             # If we don't know, obey --enable-cross-guesses.
-            *)               gl_cv_func_readlink_works="$gl_cross_guess_normal" ;;
-          esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <unistd.h>
-
-int
-main ()
-{
-char buf[20];
-      return readlink ("conftest.lnk2/", buf, sizeof buf) != -1;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_readlink_works=yes
-else
-  gl_cv_func_readlink_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      rm -f conftest.link conftest.lnk2
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_readlink_works" >&5
-$as_echo "$gl_cv_func_readlink_works" >&6; }
-    case "$gl_cv_func_readlink_works" in
-      *yes)
-        if test "$gl_cv_decl_readlink_works" != yes; then
-          REPLACE_READLINK=1
-        fi
-        ;;
-      *)
-
-$as_echo "#define READLINK_TRAILING_SLASH_BUG 1" >>confdefs.h
-
-        REPLACE_READLINK=1
-        ;;
-    esac
-  fi
-
-  if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS readlink.$ac_objext"
-
-
-  :
-
-  fi
-
-
-
-
-
-          GNULIB_READLINK=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_READLINK 1" >>confdefs.h
-
-
-
-
-
-
-  if test $gl_cv_func_malloc_posix = yes; then
-
-$as_echo "#define HAVE_REALLOC_POSIX 1" >>confdefs.h
-
-  else
-    REPLACE_REALLOC=1
-  fi
-
-  if test $REPLACE_REALLOC = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS realloc.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_REALLOC_POSIX=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_REALLOC_POSIX 1" >>confdefs.h
-
-
-
-
-
-
-
-
-  : ${RELOCATABLE_CONFIG_H_DIR='$(top_builddir)'}
-  RELOCATABLE_SRC_DIR="\$(top_srcdir)/$gl_source_base"
-  RELOCATABLE_BUILD_DIR="\$(top_builddir)/$gl_source_base"
-
-  if test $RELOCATABLE = yes; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS progreloc.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS relocatable.$ac_objext"
-
-  fi
-
-
-
-  :
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  if test $ac_cv_have_decl_setenv = no; then
-    HAVE_DECL_SETENV=0
-  fi
-
-
-
-
-
-  for ac_header in search.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "search.h" "ac_cv_header_search_h" "$ac_includes_default"
-if test "x$ac_cv_header_search_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_SEARCH_H 1
-_ACEOF
-
-fi
-
-done
-
-  for ac_func in tsearch
-do :
-  ac_fn_c_check_func "$LINENO" "tsearch" "ac_cv_func_tsearch"
-if test "x$ac_cv_func_tsearch" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_TSEARCH 1
-_ACEOF
-
-fi
-done
-
-
-
-
-  relocatable_sh=$ac_aux_dir/relocatable.sh.in
-
-
-
-
-
-
-                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rename honors trailing slash on destination" >&5
-$as_echo_n "checking whether rename honors trailing slash on destination... " >&6; }
-if ${gl_cv_func_rename_slash_dst_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -rf conftest.f conftest.f1 conftest.f2 conftest.d1 conftest.d2 conftest.lnk
-    touch conftest.f && touch conftest.f1 && mkdir conftest.d1 ||
-      as_fn_error $? "cannot create temporary files" "$LINENO" 5
-    # Assume that if we have lstat, we can also check symlinks.
-    if test $ac_cv_func_lstat = yes; then
-      ln -s conftest.f conftest.lnk
-    fi
-    if test "$cross_compiling" = yes; then :
-        case "$host_os" in
-                          # Guess yes on Linux systems.
-         linux-* | linux) gl_cv_func_rename_slash_dst_works="guessing yes" ;;
-                          # Guess yes on glibc systems.
-         *-gnu*)          gl_cv_func_rename_slash_dst_works="guessing yes" ;;
-                          # Guess no on native Windows.
-         mingw*)          gl_cv_func_rename_slash_dst_works="guessing no" ;;
-                          # If we don't know, obey --enable-cross-guesses.
-         *)               gl_cv_func_rename_slash_dst_works="$gl_cross_guess_normal" ;;
-       esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#        include <stdio.h>
-#        include <stdlib.h>
-
-int
-main ()
-{
-int result = 0;
-           if (rename ("conftest.f1", "conftest.f2/") == 0)
-             result |= 1;
-           if (rename ("conftest.d1", "conftest.d2/") != 0)
-             result |= 2;
-#if HAVE_LSTAT
-           if (rename ("conftest.f", "conftest.lnk/") == 0)
-             result |= 4;
-#endif
-           return result;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_rename_slash_dst_works=yes
-else
-  gl_cv_func_rename_slash_dst_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-    rm -rf conftest.f conftest.f1 conftest.f2 conftest.d1 conftest.d2 conftest.lnk
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rename_slash_dst_works" >&5
-$as_echo "$gl_cv_func_rename_slash_dst_works" >&6; }
-  case "$gl_cv_func_rename_slash_dst_works" in
-    *yes) ;;
-    *)
-      REPLACE_RENAME=1
-
-$as_echo "#define RENAME_TRAILING_SLASH_DEST_BUG 1" >>confdefs.h
-
-      ;;
-  esac
-
-            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rename honors trailing slash on source" >&5
-$as_echo_n "checking whether rename honors trailing slash on source... " >&6; }
-if ${gl_cv_func_rename_slash_src_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.d3 conftest.lnk
-    touch conftest.f && touch conftest.f1 && mkdir conftest.d1 ||
-      as_fn_error $? "cannot create temporary files" "$LINENO" 5
-    # Assume that if we have lstat, we can also check symlinks.
-    if test $ac_cv_func_lstat = yes; then
-      ln -s conftest.f conftest.lnk
-    fi
-    if test "$cross_compiling" = yes; then :
-        case "$host_os" in
-                          # Guess yes on Linux systems.
-         linux-* | linux) gl_cv_func_rename_slash_src_works="guessing yes" ;;
-                          # Guess yes on glibc systems.
-         *-gnu*)          gl_cv_func_rename_slash_src_works="guessing yes" ;;
-                          # Guess yes on native Windows.
-         mingw*)          gl_cv_func_rename_slash_src_works="guessing yes" ;;
-                          # If we don't know, obey --enable-cross-guesses.
-         *)               gl_cv_func_rename_slash_src_works="$gl_cross_guess_normal" ;;
-       esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#        include <stdio.h>
-#        include <stdlib.h>
-
-int
-main ()
-{
-int result = 0;
-           if (rename ("conftest.f1/", "conftest.d3") == 0)
-             result |= 1;
-           if (rename ("conftest.d1/", "conftest.d2") != 0)
-             result |= 2;
-#if HAVE_LSTAT
-           if (rename ("conftest.lnk/", "conftest.f") == 0)
-             result |= 4;
-#endif
-           return result;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_rename_slash_src_works=yes
-else
-  gl_cv_func_rename_slash_src_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-    rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.d3 conftest.lnk
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rename_slash_src_works" >&5
-$as_echo "$gl_cv_func_rename_slash_src_works" >&6; }
-  case "$gl_cv_func_rename_slash_src_works" in
-    *yes) ;;
-    *)
-      REPLACE_RENAME=1
-
-$as_echo "#define RENAME_TRAILING_SLASH_SOURCE_BUG 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rename manages hard links correctly" >&5
-$as_echo_n "checking whether rename manages hard links correctly... " >&6; }
-if ${gl_cv_func_rename_link_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test $ac_cv_func_link = yes; then
-       if test $cross_compiling != yes; then
-         rm -rf conftest.f conftest.f1 conftest.f2
-         if touch conftest.f conftest.f2 && ln conftest.f conftest.f1 &&
-             set x `ls -i conftest.f conftest.f1` && test "" = ""; then
-           if test "$cross_compiling" = yes; then :
-                :
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#               include <errno.h>
-#               include <stdio.h>
-#               include <stdlib.h>
-#               include <unistd.h>
-
-int
-main ()
-{
-int result = 0;
-                  if (rename ("conftest.f", "conftest.f1"))
-                    result |= 1;
-                  if (unlink ("conftest.f1"))
-                    result |= 2;
-
-                  /* Allow either the POSIX-required behavior, where the
-                     previous rename kept conftest.f, or the (better) NetBSD
-                     behavior, where it removed conftest.f.  */
-                  if (rename ("conftest.f", "conftest.f") != 0
-                      && errno != ENOENT)
-                    result |= 4;
-
-                  if (rename ("conftest.f1", "conftest.f1") == 0)
-                    result |= 8;
-                  if (rename ("conftest.f2", "conftest.f2") != 0)
-                    result |= 16;
-                  return result;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_rename_link_works=yes
-else
-  gl_cv_func_rename_link_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-         else
-           gl_cv_func_rename_link_works="guessing no"
-         fi
-         rm -rf conftest.f conftest.f1 conftest.f2
-       else
-                  case "$host_os" in
-                            # Guess yes on Linux systems.
-           linux-* | linux) gl_cv_func_rename_link_works="guessing yes" ;;
-                            # Guess yes on glibc systems.
-           *-gnu*)          gl_cv_func_rename_link_works="guessing yes" ;;
-                            # Guess yes on native Windows.
-           mingw*)          gl_cv_func_rename_link_works="guessing yes" ;;
-                            # If we don't know, obey --enable-cross-guesses.
-           *)               gl_cv_func_rename_link_works="$gl_cross_guess_normal" ;;
-         esac
-       fi
-     else
-       gl_cv_func_rename_link_works=yes
-     fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rename_link_works" >&5
-$as_echo "$gl_cv_func_rename_link_works" >&6; }
-  case "$gl_cv_func_rename_link_works" in
-    *yes) ;;
-    *)
-      REPLACE_RENAME=1
-
-$as_echo "#define RENAME_HARD_LINK_BUG 1" >>confdefs.h
-
-      ;;
-  esac
-
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rename manages existing destinations correctly" >&5
-$as_echo_n "checking whether rename manages existing destinations correctly... " >&6; }
-if ${gl_cv_func_rename_dest_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -rf conftest.f conftest.d1 conftest.d2
-    touch conftest.f && mkdir conftest.d1 conftest.d2 ||
-      as_fn_error $? "cannot create temporary files" "$LINENO" 5
-    if test "$cross_compiling" = yes; then :
-        case "$host_os" in
-                          # Guess yes on Linux systems.
-         linux-* | linux) gl_cv_func_rename_dest_works="guessing yes" ;;
-                          # Guess yes on glibc systems.
-         *-gnu*)          gl_cv_func_rename_dest_works="guessing yes" ;;
-                          # Guess no on native Windows.
-         mingw*)          gl_cv_func_rename_dest_works="guessing no" ;;
-                          # If we don't know, obey --enable-cross-guesses.
-         *)               gl_cv_func_rename_dest_works="$gl_cross_guess_normal" ;;
-       esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#        include <stdio.h>
-#        include <stdlib.h>
-
-int
-main ()
-{
-int result = 0;
-           if (rename ("conftest.d1", "conftest.d2") != 0)
-             result |= 1;
-           if (rename ("conftest.d2", "conftest.f") == 0)
-             result |= 2;
-           return result;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_rename_dest_works=yes
-else
-  gl_cv_func_rename_dest_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-    rm -rf conftest.f conftest.d1 conftest.d2
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rename_dest_works" >&5
-$as_echo "$gl_cv_func_rename_dest_works" >&6; }
-  case "$gl_cv_func_rename_dest_works" in
-    *yes) ;;
-    *)
-      REPLACE_RENAME=1
-
-$as_echo "#define RENAME_DEST_EXISTS_BUG 1" >>confdefs.h
-
-      ;;
-  esac
-
-  if test $REPLACE_RENAME = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS rename.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_RENAME=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_RENAME 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-  for ac_header in sched.h
-do :
-  ac_fn_c_check_header_compile "$LINENO" "sched.h" "ac_cv_header_sched_h" "#if HAVE_SYS_CDEFS_H
-       #include <sys/cdefs.h>
-      #endif
-
-"
-if test "x$ac_cv_header_sched_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_SCHED_H 1
-_ACEOF
-
-fi
-
-done
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_sched_h='<'sched.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sched.h>" >&5
-$as_echo_n "checking absolute name of <sched.h>... " >&6; }
-if ${gl_cv_next_sched_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sched.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'sched.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_sched_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_sched_h
-           gl_cv_next_sched_h='"'$gl_header'"'
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sched_h" >&5
-$as_echo "$gl_cv_next_sched_h" >&6; }
-     fi
-     NEXT_SCHED_H=$gl_cv_next_sched_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'sched.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_sched_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_SCHED_H=$gl_next_as_first_directive
-
-
-
-
-
-  if test "$ac_cv_header_sched_h" = yes; then
-    HAVE_SCHED_H=1
-  else
-    HAVE_SCHED_H=0
-  fi
-
-
-  if test "$HAVE_SCHED_H" = 1; then
-    ac_fn_c_check_type "$LINENO" "struct sched_param" "ac_cv_type_struct_sched_param" "#if HAVE_SYS_CDEFS_H
-         #include <sys/cdefs.h>
-        #endif
-        #include <sched.h>
-
-"
-if test "x$ac_cv_type_struct_sched_param" = xyes; then :
-  HAVE_STRUCT_SCHED_PARAM=1
-else
-  HAVE_STRUCT_SCHED_PARAM=0
-fi
-
-  else
-    HAVE_STRUCT_SCHED_PARAM=0
-    case "$host_os" in
-      os2*)
-                ac_fn_c_check_type "$LINENO" "struct sched_param" "ac_cv_type_struct_sched_param" "#include <spawn.h>
-"
-if test "x$ac_cv_type_struct_sched_param" = xyes; then :
-  HAVE_STRUCT_SCHED_PARAM=1
-fi
-
-        ;;
-      vms)
-                ac_fn_c_check_type "$LINENO" "struct sched_param" "ac_cv_type_struct_sched_param" "#include <pthread.h>
-"
-if test "x$ac_cv_type_struct_sched_param" = xyes; then :
-  HAVE_STRUCT_SCHED_PARAM=1
-fi
-
-        ;;
-    esac
-  fi
-
-
-  if test "$ac_cv_header_sys_cdefs_h" = yes; then
-    HAVE_SYS_CDEFS_H=1
-  else
-    HAVE_SYS_CDEFS_H=0
-  fi
-
-
-
-
-
-
-
-
-
-
-
-  if test $ac_cv_func_sigaction = yes; then
-    ac_fn_c_check_member "$LINENO" "struct sigaction" "sa_sigaction" "ac_cv_member_struct_sigaction_sa_sigaction" "#include <signal.h>
-"
-if test "x$ac_cv_member_struct_sigaction_sa_sigaction" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_STRUCT_SIGACTION_SA_SIGACTION 1
-_ACEOF
-
-
-fi
-
-    if test $ac_cv_member_struct_sigaction_sa_sigaction = no; then
-      HAVE_STRUCT_SIGACTION_SA_SIGACTION=0
-    fi
-  else
-    HAVE_SIGACTION=0
-  fi
-
-  if test $HAVE_SIGACTION = 0; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS sigaction.$ac_objext"
-
-
-
-
-
-
-
-  ac_fn_c_check_type "$LINENO" "siginfo_t" "ac_cv_type_siginfo_t" "
-#include <signal.h>
-
-"
-if test "x$ac_cv_type_siginfo_t" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_SIGINFO_T 1
-_ACEOF
-
-
-fi
-
-  if test $ac_cv_type_siginfo_t = no; then
-    HAVE_SIGINFO_T=0
-  fi
-
-  fi
-
-
-
-
-
-          GNULIB_SIGACTION=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_SIGACTION 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_signal_h='<'signal.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <signal.h>" >&5
-$as_echo_n "checking absolute name of <signal.h>... " >&6; }
-if ${gl_cv_next_signal_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <signal.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'signal.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_signal_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_signal_h
-           gl_cv_next_signal_h='"'$gl_header'"'
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_signal_h" >&5
-$as_echo "$gl_cv_next_signal_h" >&6; }
-     fi
-     NEXT_SIGNAL_H=$gl_cv_next_signal_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'signal.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_signal_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H=$gl_next_as_first_directive
-
-
-
-
-
-# AIX declares sig_atomic_t to already include volatile, and C89 compilers
-# then choke on 'volatile sig_atomic_t'.  C99 requires that it compile.
-  ac_fn_c_check_type "$LINENO" "volatile sig_atomic_t" "ac_cv_type_volatile_sig_atomic_t" "
-#include <signal.h>
-
-"
-if test "x$ac_cv_type_volatile_sig_atomic_t" = xyes; then :
-
-else
-  HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=0
-fi
-
-
-
-
-
-
-
-  ac_fn_c_check_type "$LINENO" "sighandler_t" "ac_cv_type_sighandler_t" "
-#include <signal.h>
-
-"
-if test "x$ac_cv_type_sighandler_t" = xyes; then :
-
-else
-  HAVE_SIGHANDLER_T=0
-fi
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signbit macro" >&5
-$as_echo_n "checking for signbit macro... " >&6; }
-if ${gl_cv_func_signbit+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                          # Guess yes on glibc systems.
-           *-gnu* | gnu*) gl_cv_func_signbit="guessing yes" ;;
-                          # Guess yes on musl systems.
-           *-musl*)       gl_cv_func_signbit="guessing yes" ;;
-                          # Guess yes on native Windows.
-           mingw*)        gl_cv_func_signbit="guessing yes" ;;
-                          # If we don't know, obey --enable-cross-guesses.
-           *)             gl_cv_func_signbit="$gl_cross_guess_normal" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <math.h>
-/* If signbit is defined as a function, don't use it, since calling it for
-   'float' or 'long double' arguments would involve conversions.
-   If signbit is not declared at all but exists as a library function, don't
-   use it, since the prototype may not match.
-   If signbit is not declared at all but exists as a compiler built-in, don't
-   use it, since it's preferable to use __builtin_signbit* (no warnings,
-   no conversions).  */
-#ifndef signbit
-# error "signbit should be a macro"
-#endif
-#include <string.h>
-
-/* Global variables.
-   Needed because GCC 4 constant-folds __builtin_signbitl (literal)
-   but cannot constant-fold            __builtin_signbitl (variable).  */
-float vf;
-double vd;
-long double vl;
-int main ()
-{
-/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
-   So we use -p0f and -p0d instead.  */
-float p0f = 0.0f;
-float m0f = -p0f;
-double p0d = 0.0;
-double m0d = -p0d;
-/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
-   So we use another constant expression instead.
-   But that expression does not work on other platforms, such as when
-   cross-compiling to PowerPC on Mac OS X 10.5.  */
-long double p0l = 0.0L;
-#if defined __hpux || defined __sgi
-long double m0l = -LDBL_MIN * LDBL_MIN;
-#else
-long double m0l = -p0l;
-#endif
-  int result = 0;
-  if (signbit (vf)) /* link check */
-    vf++;
-  {
-    float plus_inf = 1.0f / p0f;
-    float minus_inf = -1.0f / p0f;
-    if (!(!signbit (255.0f)
-          && signbit (-255.0f)
-          && !signbit (p0f)
-          && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f))
-          && !signbit (plus_inf)
-          && signbit (minus_inf)))
-      result |= 1;
-  }
-  if (signbit (vd)) /* link check */
-    vd++;
-  {
-    double plus_inf = 1.0 / p0d;
-    double minus_inf = -1.0 / p0d;
-    if (!(!signbit (255.0)
-          && signbit (-255.0)
-          && !signbit (p0d)
-          && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d))
-          && !signbit (plus_inf)
-          && signbit (minus_inf)))
-      result |= 2;
-  }
-  if (signbit (vl)) /* link check */
-    vl++;
-  {
-    long double plus_inf = 1.0L / p0l;
-    long double minus_inf = -1.0L / p0l;
-    if (signbit (255.0L))
-      result |= 4;
-    if (!signbit (-255.0L))
-      result |= 4;
-    if (signbit (p0l))
-      result |= 8;
-    if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l)))
-      result |= 16;
-    if (signbit (plus_inf))
-      result |= 32;
-    if (!signbit (minus_inf))
-      result |= 64;
-  }
-  return result;
-}
-
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_signbit=yes
-else
-  gl_cv_func_signbit=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_signbit" >&5
-$as_echo "$gl_cv_func_signbit" >&6; }
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signbit compiler built-ins" >&5
-$as_echo_n "checking for signbit compiler built-ins... " >&6; }
-if ${gl_cv_func_signbit_gcc+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                          # Guess yes on glibc systems.
-           *-gnu* | gnu*) gl_cv_func_signbit_gcc="guessing yes" ;;
-                          # Guess yes on musl systems.
-           *-musl*)       gl_cv_func_signbit_gcc="guessing yes" ;;
-                          # Guess yes on mingw, no on MSVC.
-           mingw*)        if test -n "$GCC"; then
-                            gl_cv_func_signbit_gcc="guessing yes"
-                          else
-                            gl_cv_func_signbit_gcc="guessing no"
-                          fi
-                          ;;
-                          # If we don't know, obey --enable-cross-guesses.
-           *)             gl_cv_func_signbit_gcc="$gl_cross_guess_normal" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#if __GNUC__ >= 4
-# define signbit(x) \
-   (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
-    sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
-    __builtin_signbitf (x))
-#else
-# error "signbit should be three compiler built-ins"
-#endif
-#include <string.h>
-
-/* Global variables.
-   Needed because GCC 4 constant-folds __builtin_signbitl (literal)
-   but cannot constant-fold            __builtin_signbitl (variable).  */
-float vf;
-double vd;
-long double vl;
-int main ()
-{
-/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
-   So we use -p0f and -p0d instead.  */
-float p0f = 0.0f;
-float m0f = -p0f;
-double p0d = 0.0;
-double m0d = -p0d;
-/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
-   So we use another constant expression instead.
-   But that expression does not work on other platforms, such as when
-   cross-compiling to PowerPC on Mac OS X 10.5.  */
-long double p0l = 0.0L;
-#if defined __hpux || defined __sgi
-long double m0l = -LDBL_MIN * LDBL_MIN;
-#else
-long double m0l = -p0l;
-#endif
-  int result = 0;
-  if (signbit (vf)) /* link check */
-    vf++;
-  {
-    float plus_inf = 1.0f / p0f;
-    float minus_inf = -1.0f / p0f;
-    if (!(!signbit (255.0f)
-          && signbit (-255.0f)
-          && !signbit (p0f)
-          && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f))
-          && !signbit (plus_inf)
-          && signbit (minus_inf)))
-      result |= 1;
-  }
-  if (signbit (vd)) /* link check */
-    vd++;
-  {
-    double plus_inf = 1.0 / p0d;
-    double minus_inf = -1.0 / p0d;
-    if (!(!signbit (255.0)
-          && signbit (-255.0)
-          && !signbit (p0d)
-          && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d))
-          && !signbit (plus_inf)
-          && signbit (minus_inf)))
-      result |= 2;
-  }
-  if (signbit (vl)) /* link check */
-    vl++;
-  {
-    long double plus_inf = 1.0L / p0l;
-    long double minus_inf = -1.0L / p0l;
-    if (signbit (255.0L))
-      result |= 4;
-    if (!signbit (-255.0L))
-      result |= 4;
-    if (signbit (p0l))
-      result |= 8;
-    if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l)))
-      result |= 16;
-    if (signbit (plus_inf))
-      result |= 32;
-    if (!signbit (minus_inf))
-      result |= 64;
-  }
-  return result;
-}
-
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_signbit_gcc=yes
-else
-  gl_cv_func_signbit_gcc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_signbit_gcc" >&5
-$as_echo "$gl_cv_func_signbit_gcc" >&6; }
-      case "$gl_cv_func_signbit_gcc" in
-    *yes)
-      REPLACE_SIGNBIT_USING_GCC=1
-      ;;
-    *)
-      case "$gl_cv_func_signbit" in
-        *yes) ;;
-        *)
-                    REPLACE_SIGNBIT=1
-          ;;
-      esac
-      ;;
-  esac
-          case "$host_os" in
-    solaris*)
-      REPLACE_SIGNBIT=1
-      ;;
-  esac
-  if test $REPLACE_SIGNBIT = 1; then
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'float'" >&5
-$as_echo_n "checking where to find the sign bit in a 'float'... " >&6; }
-if ${gl_cv_cc_float_signbit+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-                              gl_cv_cc_float_signbit="unknown"
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stddef.h>
-#include <stdio.h>
-#define NWORDS \
-  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-typedef union { float value; unsigned int word[NWORDS]; }
-        memory_float;
-static memory_float plus = { 1.0f };
-static memory_float minus = { -1.0f };
-int main ()
-{
-  size_t j, k, i;
-  unsigned int m;
-  FILE *fp = fopen ("conftest.out", "w");
-  if (fp == NULL)
-    return 1;
-  /* Find the different bit.  */
-  k = 0; m = 0;
-  for (j = 0; j < NWORDS; j++)
-    {
-      unsigned int x = plus.word[j] ^ minus.word[j];
-      if ((x & (x - 1)) || (x && m))
-        {
-          /* More than one bit difference.  */
-          fprintf (fp, "unknown");
-          fclose (fp);
-          return 2;
-        }
-      if (x)
-        {
-          k = j;
-          m = x;
-        }
-    }
-  if (m == 0)
-    {
-      /* No difference.  */
-      fprintf (fp, "unknown");
-      fclose (fp);
-      return 3;
-    }
-  /* Now m = plus.word[k] ^ ~minus.word[k].  */
-  if (plus.word[k] & ~minus.word[k])
-    {
-      /* Oh? The sign bit is set in the positive and cleared in the negative
-         numbers?  */
-      fprintf (fp, "unknown");
-      fclose (fp);
-      return 4;
-    }
-  for (i = 0; ; i++)
-    if ((m >> i) & 1)
-      break;
-  fprintf (fp, "word %d bit %d", (int) k, (int) i);
-  if (fclose (fp) != 0)
-    return 5;
-  return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_cc_float_signbit=`cat conftest.out`
-else
-  gl_cv_cc_float_signbit="unknown"
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      rm -f conftest.out
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_signbit" >&5
-$as_echo "$gl_cv_cc_float_signbit" >&6; }
-  case "$gl_cv_cc_float_signbit" in
-    word*bit*)
-      word=`echo "$gl_cv_cc_float_signbit" | sed -e 's/word //' -e 's/ bit.*//'`
-      bit=`echo "$gl_cv_cc_float_signbit" | sed -e 's/word.*bit //'`
-
-cat >>confdefs.h <<_ACEOF
-#define FLT_SIGNBIT_WORD $word
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define FLT_SIGNBIT_BIT $bit
-_ACEOF
-
-      ;;
-  esac
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'double'" >&5
-$as_echo_n "checking where to find the sign bit in a 'double'... " >&6; }
-if ${gl_cv_cc_double_signbit+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-                              gl_cv_cc_double_signbit="unknown"
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stddef.h>
-#include <stdio.h>
-#define NWORDS \
-  ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-typedef union { double value; unsigned int word[NWORDS]; }
-        memory_float;
-static memory_float plus = { 1.0 };
-static memory_float minus = { -1.0 };
-int main ()
-{
-  size_t j, k, i;
-  unsigned int m;
-  FILE *fp = fopen ("conftest.out", "w");
-  if (fp == NULL)
-    return 1;
-  /* Find the different bit.  */
-  k = 0; m = 0;
-  for (j = 0; j < NWORDS; j++)
-    {
-      unsigned int x = plus.word[j] ^ minus.word[j];
-      if ((x & (x - 1)) || (x && m))
-        {
-          /* More than one bit difference.  */
-          fprintf (fp, "unknown");
-          fclose (fp);
-          return 2;
-        }
-      if (x)
-        {
-          k = j;
-          m = x;
-        }
-    }
-  if (m == 0)
-    {
-      /* No difference.  */
-      fprintf (fp, "unknown");
-      fclose (fp);
-      return 3;
-    }
-  /* Now m = plus.word[k] ^ ~minus.word[k].  */
-  if (plus.word[k] & ~minus.word[k])
-    {
-      /* Oh? The sign bit is set in the positive and cleared in the negative
-         numbers?  */
-      fprintf (fp, "unknown");
-      fclose (fp);
-      return 4;
-    }
-  for (i = 0; ; i++)
-    if ((m >> i) & 1)
-      break;
-  fprintf (fp, "word %d bit %d", (int) k, (int) i);
-  if (fclose (fp) != 0)
-    return 5;
-  return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_cc_double_signbit=`cat conftest.out`
-else
-  gl_cv_cc_double_signbit="unknown"
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      rm -f conftest.out
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_signbit" >&5
-$as_echo "$gl_cv_cc_double_signbit" >&6; }
-  case "$gl_cv_cc_double_signbit" in
-    word*bit*)
-      word=`echo "$gl_cv_cc_double_signbit" | sed -e 's/word //' -e 's/ bit.*//'`
-      bit=`echo "$gl_cv_cc_double_signbit" | sed -e 's/word.*bit //'`
-
-cat >>confdefs.h <<_ACEOF
-#define DBL_SIGNBIT_WORD $word
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define DBL_SIGNBIT_BIT $bit
-_ACEOF
-
-      ;;
-  esac
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'long double'" >&5
-$as_echo_n "checking where to find the sign bit in a 'long double'... " >&6; }
-if ${gl_cv_cc_long_double_signbit+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-                              gl_cv_cc_long_double_signbit="unknown"
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stddef.h>
-#include <stdio.h>
-#define NWORDS \
-  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-typedef union { long double value; unsigned int word[NWORDS]; }
-        memory_float;
-static memory_float plus = { 1.0L };
-static memory_float minus = { -1.0L };
-int main ()
-{
-  size_t j, k, i;
-  unsigned int m;
-  FILE *fp = fopen ("conftest.out", "w");
-  if (fp == NULL)
-    return 1;
-  /* Find the different bit.  */
-  k = 0; m = 0;
-  for (j = 0; j < NWORDS; j++)
-    {
-      unsigned int x = plus.word[j] ^ minus.word[j];
-      if ((x & (x - 1)) || (x && m))
-        {
-          /* More than one bit difference.  */
-          fprintf (fp, "unknown");
-          fclose (fp);
-          return 2;
-        }
-      if (x)
-        {
-          k = j;
-          m = x;
-        }
-    }
-  if (m == 0)
-    {
-      /* No difference.  */
-      fprintf (fp, "unknown");
-      fclose (fp);
-      return 3;
-    }
-  /* Now m = plus.word[k] ^ ~minus.word[k].  */
-  if (plus.word[k] & ~minus.word[k])
-    {
-      /* Oh? The sign bit is set in the positive and cleared in the negative
-         numbers?  */
-      fprintf (fp, "unknown");
-      fclose (fp);
-      return 4;
-    }
-  for (i = 0; ; i++)
-    if ((m >> i) & 1)
-      break;
-  fprintf (fp, "word %d bit %d", (int) k, (int) i);
-  if (fclose (fp) != 0)
-    return 5;
-  return 0;
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_cc_long_double_signbit=`cat conftest.out`
-else
-  gl_cv_cc_long_double_signbit="unknown"
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-      rm -f conftest.out
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_signbit" >&5
-$as_echo "$gl_cv_cc_long_double_signbit" >&6; }
-  case "$gl_cv_cc_long_double_signbit" in
-    word*bit*)
-      word=`echo "$gl_cv_cc_long_double_signbit" | sed -e 's/word //' -e 's/ bit.*//'`
-      bit=`echo "$gl_cv_cc_long_double_signbit" | sed -e 's/word.*bit //'`
-
-cat >>confdefs.h <<_ACEOF
-#define LDBL_SIGNBIT_WORD $word
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define LDBL_SIGNBIT_BIT $bit
-_ACEOF
-
-      ;;
-  esac
-
-
-    if test "$gl_cv_cc_float_signbit" = unknown; then
-            ac_fn_c_check_decl "$LINENO" "copysignf" "ac_cv_have_decl_copysignf" "#include <math.h>
-"
-if test "x$ac_cv_have_decl_copysignf" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_COPYSIGNF $ac_have_decl
-_ACEOF
-
-      if test "$ac_cv_have_decl_copysignf" = yes; then
-                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether copysignf can be used without linking with libm" >&5
-$as_echo_n "checking whether copysignf can be used without linking with libm... " >&6; }
-if ${gl_cv_func_copysignf_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-                   float x, y;
-int
-main ()
-{
-return copysignf (x, y) < 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_copysignf_no_libm=yes
-else
-  gl_cv_func_copysignf_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysignf_no_libm" >&5
-$as_echo "$gl_cv_func_copysignf_no_libm" >&6; }
-        if test $gl_cv_func_copysignf_no_libm = yes; then
-
-$as_echo "#define HAVE_COPYSIGNF_IN_LIBC 1" >>confdefs.h
-
-        fi
-      fi
-    fi
-    if test "$gl_cv_cc_double_signbit" = unknown; then
-            ac_fn_c_check_decl "$LINENO" "copysign" "ac_cv_have_decl_copysign" "#include <math.h>
-"
-if test "x$ac_cv_have_decl_copysign" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_COPYSIGN $ac_have_decl
-_ACEOF
-
-      if test "$ac_cv_have_decl_copysign" = yes; then
-                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether copysign can be used without linking with libm" >&5
-$as_echo_n "checking whether copysign can be used without linking with libm... " >&6; }
-if ${gl_cv_func_copysign_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-                   double x, y;
-int
-main ()
-{
-return copysign (x, y) < 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_copysign_no_libm=yes
-else
-  gl_cv_func_copysign_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysign_no_libm" >&5
-$as_echo "$gl_cv_func_copysign_no_libm" >&6; }
-        if test $gl_cv_func_copysign_no_libm = yes; then
-
-$as_echo "#define HAVE_COPYSIGN_IN_LIBC 1" >>confdefs.h
-
-        fi
-      fi
-    fi
-    if test "$gl_cv_cc_long_double_signbit" = unknown; then
-            ac_fn_c_check_decl "$LINENO" "copysignl" "ac_cv_have_decl_copysignl" "#include <math.h>
-"
-if test "x$ac_cv_have_decl_copysignl" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_COPYSIGNL $ac_have_decl
-_ACEOF
-
-      if test "$ac_cv_have_decl_copysignl" = yes; then
-                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether copysignl can be used without linking with libm" >&5
-$as_echo_n "checking whether copysignl can be used without linking with libm... " >&6; }
-if ${gl_cv_func_copysignl_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <math.h>
-                   long double x, y;
-int
-main ()
-{
-return copysignl (x, y) < 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_copysignl_no_libm=yes
-else
-  gl_cv_func_copysignl_no_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysignl_no_libm" >&5
-$as_echo "$gl_cv_func_copysignl_no_libm" >&6; }
-        if test $gl_cv_func_copysignl_no_libm = yes; then
-
-$as_echo "#define HAVE_COPYSIGNL_IN_LIBC 1" >>confdefs.h
-
-        fi
-      fi
-    fi
-  fi
-
-  if test $REPLACE_SIGNBIT = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS signbitf.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS signbitd.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS signbitl.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_SIGNBIT=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_SIGNBIT 1" >>confdefs.h
-
-
-
-
-
-
-  if test $gl_cv_type_sigset_t = yes; then
-    ac_fn_c_check_func "$LINENO" "sigprocmask" "ac_cv_func_sigprocmask"
-if test "x$ac_cv_func_sigprocmask" = xyes; then :
-  gl_cv_func_sigprocmask=1
-fi
-
-  fi
-  if test -z "$gl_cv_func_sigprocmask"; then
-    HAVE_POSIX_SIGNALBLOCKING=0
-  fi
-
-  if test $HAVE_POSIX_SIGNALBLOCKING = 0; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS sigprocmask.$ac_objext"
-
-    :
-  fi
-
-
-
-
-
-          GNULIB_SIGPROCMASK=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_SIGPROCMASK 1" >>confdefs.h
-
-
-
-
-  for ac_header in stdint.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default"
-if test "x$ac_cv_header_stdint_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_STDINT_H 1
-_ACEOF
-
-fi
-
-done
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SIZE_MAX" >&5
-$as_echo_n "checking for SIZE_MAX... " >&6; }
-if ${gl_cv_size_max+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for complete errno.h" >&5
+printf %s "checking for complete errno.h... " >&6; }
+if test ${gl_cv_header_errno_h_complete+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
-    gl_cv_size_max=
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-#include <limits.h>
-#if HAVE_STDINT_H
-#include <stdint.h>
+#include <errno.h>
+#if !defined ETXTBSY
+booboo
 #endif
-#ifdef SIZE_MAX
-Found it
+#if !defined ENOMSG
+booboo
+#endif
+#if !defined EIDRM
+booboo
+#endif
+#if !defined ENOLINK
+booboo
+#endif
+#if !defined EPROTO
+booboo
+#endif
+#if !defined EMULTIHOP
+booboo
+#endif
+#if !defined EBADMSG
+booboo
+#endif
+#if !defined EOVERFLOW
+booboo
+#endif
+#if !defined ENOTSUP
+booboo
+#endif
+#if !defined ENETRESET
+booboo
+#endif
+#if !defined ECONNABORTED
+booboo
+#endif
+#if !defined ESTALE
+booboo
+#endif
+#if !defined EDQUOT
+booboo
+#endif
+#if !defined ECANCELED
+booboo
+#endif
+#if !defined EOWNERDEAD
+booboo
+#endif
+#if !defined ENOTRECOVERABLE
+booboo
+#endif
+#if !defined EILSEQ
+booboo
 #endif
 
 _ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Found it" >/dev/null 2>&1; then :
-  gl_cv_size_max=yes
+  $EGREP "booboo" >/dev/null 2>&1
+then :
+  gl_cv_header_errno_h_complete=no
+else $as_nop
+  gl_cv_header_errno_h_complete=yes
 fi
-rm -f conftest*
-
-    if test -z "$gl_cv_size_max"; then
-                        if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) * CHAR_BIT - 1" "size_t_bits_minus_1"        "#include <stddef.h>
-#include <limits.h>"; then :
-
-else
-  size_t_bits_minus_1=
-fi
-
-      if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) <= sizeof (unsigned int)" "fits_in_uint"        "#include <stddef.h>"; then :
-
-else
-  fits_in_uint=
-fi
-
-      if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then
-        if test $fits_in_uint = 1; then
-                              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stddef.h>
-                 extern size_t foo;
-                 extern unsigned long foo;
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  fits_in_uint=0
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-        fi
-                                if test $fits_in_uint = 1; then
-          gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)"
-        else
-          gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)"
-        fi
-      else
-                gl_cv_size_max='((size_t)~(size_t)0)'
-      fi
-    fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_size_max" >&5
-$as_echo "$gl_cv_size_max" >&6; }
-  if test "$gl_cv_size_max" != yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define SIZE_MAX $gl_cv_size_max
-_ACEOF
-
-  fi
-
-
-
-
-  gl_cv_func_snprintf_usable=no
-  for ac_func in snprintf
-do :
-  ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf"
-if test "x$ac_cv_func_snprintf" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_SNPRINTF 1
-_ACEOF
-
-fi
-done
-
-  if test $ac_cv_func_snprintf = yes; then
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5
-$as_echo_n "checking whether snprintf respects a size of 1... " >&6; }
-if ${gl_cv_func_snprintf_size1+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                            # Guess yes on Android.
-           linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
-                            # Guess yes on native Windows.
-           mingw*)          gl_cv_func_snprintf_size1="guessing yes" ;;
-           *)               gl_cv_func_snprintf_size1="guessing yes" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#if HAVE_SNPRINTF
-# define my_snprintf snprintf
-#else
-# include <stdarg.h>
-static int my_snprintf (char *buf, int size, const char *format, ...)
-{
-  va_list args;
-  int ret;
-  va_start (args, format);
-  ret = vsnprintf (buf, size, format, args);
-  va_end (args);
-  return ret;
-}
-#endif
-int main()
-{
-  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
-  my_snprintf (buf, 1, "%d", 12345);
-  return buf[1] != 'E';
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_snprintf_size1=yes
-else
-  gl_cv_func_snprintf_size1=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
+rm -rf conftest*
 
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5
-$as_echo "$gl_cv_func_snprintf_size1" >&6; }
-
-    case "$gl_cv_func_snprintf_size1" in
-      *yes)
-
-        case "$gl_cv_func_snprintf_retval_c99" in
-          *yes)
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5
-$as_echo_n "checking whether printf supports POSIX/XSI format strings with positions... " >&6; }
-if ${gl_cv_func_printf_positions+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-           netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
-                            gl_cv_func_printf_positions="guessing no";;
-           beos*)           gl_cv_func_printf_positions="guessing no";;
-                            # Guess yes on Android.
-           linux*-android*) gl_cv_func_printf_positions="guessing yes";;
-                            # Guess no on native Windows.
-           mingw* | pw*)    gl_cv_func_printf_positions="guessing no";;
-           *)               gl_cv_func_printf_positions="guessing yes";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <string.h>
-/* The string "%2$d %1$d", with dollar characters protected from the shell's
-   dollar expansion (possibly an autoconf bug).  */
-static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
-static char buf[100];
-int main ()
-{
-  sprintf (buf, format, 33, 55);
-  return (strcmp (buf, "55 33") != 0);
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_printf_positions=yes
-else
-  gl_cv_func_printf_positions=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5
-$as_echo "$gl_cv_func_printf_positions" >&6; }
-
-            case "$gl_cv_func_printf_positions" in
-              *yes)
-                gl_cv_func_snprintf_usable=yes
-                ;;
-            esac
-            ;;
-        esac
-        ;;
-    esac
-  fi
-  if test $gl_cv_func_snprintf_usable = no; then
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS snprintf.$ac_objext"
-
-  if test $ac_cv_func_snprintf = yes; then
-    REPLACE_SNPRINTF=1
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_complete" >&5
+printf "%s\n" "$gl_cv_header_errno_h_complete" >&6; }
+  if test $gl_cv_header_errno_h_complete = yes; then
+    ERRNO_H=''
   else
 
-    if test $ac_cv_have_decl_snprintf = yes; then
-                        REPLACE_SNPRINTF=1
-    fi
-  fi
-  :
-
-  fi
-
-  if test $ac_cv_have_decl_snprintf = no; then
-    HAVE_DECL_SNPRINTF=0
-  fi
-
-
-
-
-
-
-          GNULIB_SNPRINTF=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_SNPRINTF 1" >>confdefs.h
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define GNULIB_SNPRINTF 1
-_ACEOF
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_cv_func_snprintf_posix=no
-  for ac_func in snprintf
-do :
-  ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf"
-if test "x$ac_cv_func_snprintf" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_SNPRINTF 1
-_ACEOF
-
-fi
-done
-
-  if test $ac_cv_func_snprintf = yes; then
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf truncates the result as in C99" >&5
-$as_echo_n "checking whether snprintf truncates the result as in C99... " >&6; }
-if ${gl_cv_func_snprintf_truncation_c99+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-                                 # Guess yes on glibc systems.
-           *-gnu* | gnu*)        gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on musl systems.
-           *-musl*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on FreeBSD >= 5.
-           freebsd[1-4].*)       gl_cv_func_snprintf_truncation_c99="guessing no";;
-           freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on Mac OS X >= 10.3.
-           darwin[1-6].*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
-           darwin*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on OpenBSD >= 3.9.
-           openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
-                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
-           openbsd*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on Solaris >= 2.6.
-           solaris2.[0-5] | solaris2.[0-5].*)
-                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
-           solaris*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on AIX >= 4.
-           aix[1-3]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
-           aix*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on HP-UX >= 11.
-           hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
-           hpux*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on IRIX >= 6.5.
-           irix6.5)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on OSF/1 >= 5.
-           osf[3-4]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
-           osf*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on NetBSD >= 3.
-           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
-                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
-           netbsd*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on BeOS.
-           beos*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on Android.
-           linux*-android*)      gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess no on native Windows.
-           mingw*)               gl_cv_func_snprintf_truncation_c99="guessing no";;
-                                 # If we don't know, obey --enable-cross-guesses.
-           *)                    gl_cv_func_snprintf_truncation_c99="$gl_cross_guess_normal";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <string.h>
-#if HAVE_SNPRINTF
-# define my_snprintf snprintf
-#else
-# include <stdarg.h>
-static int my_snprintf (char *buf, int size, const char *format, ...)
-{
-  va_list args;
-  int ret;
-  va_start (args, format);
-  ret = vsnprintf (buf, size, format, args);
-  va_end (args);
-  return ret;
-}
-#endif
-static char buf[100];
-int main ()
-{
-  strcpy (buf, "ABCDEF");
-  my_snprintf (buf, 3, "%d %d", 4567, 89);
-  if (memcmp (buf, "45\0DEF", 6) != 0)
-    return 1;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_snprintf_truncation_c99=yes
-else
-  gl_cv_func_snprintf_truncation_c99=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_truncation_c99" >&5
-$as_echo "$gl_cv_func_snprintf_truncation_c99" >&6; }
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf fully supports the 'n' directive" >&5
-$as_echo_n "checking whether snprintf fully supports the 'n' directive... " >&6; }
-if ${gl_cv_func_snprintf_directive_n+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-                                 # Guess yes on glibc systems.
-           *-gnu* | gnu*)        gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on musl systems.
-           *-musl*)              gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on FreeBSD >= 5.
-           freebsd[1-4].*)       gl_cv_func_snprintf_directive_n="guessing no";;
-           freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on Mac OS X >= 10.3.
-           darwin[1-6].*)        gl_cv_func_snprintf_directive_n="guessing no";;
-           darwin*)              gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on Solaris >= 2.6.
-           solaris2.[0-5] | solaris2.[0-5].*)
-                                 gl_cv_func_snprintf_directive_n="guessing no";;
-           solaris*)             gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on AIX >= 4.
-           aix[1-3]*)            gl_cv_func_snprintf_directive_n="guessing no";;
-           aix*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on IRIX >= 6.5.
-           irix6.5)              gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on OSF/1 >= 5.
-           osf[3-4]*)            gl_cv_func_snprintf_directive_n="guessing no";;
-           osf*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on NetBSD >= 3.
-           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
-                                 gl_cv_func_snprintf_directive_n="guessing no";;
-           netbsd*)              gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on BeOS.
-           beos*)                gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess no on Android.
-           linux*-android*)      gl_cv_func_snprintf_directive_n="guessing no";;
-                                 # Guess no on native Windows.
-           mingw*)               gl_cv_func_snprintf_directive_n="guessing no";;
-                                 # If we don't know, obey --enable-cross-guesses.
-           *)                    gl_cv_func_snprintf_directive_n="$gl_cross_guess_normal";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <string.h>
-#if HAVE_SNPRINTF
-# define my_snprintf snprintf
-#else
-# include <stdarg.h>
-static int my_snprintf (char *buf, int size, const char *format, ...)
-{
-  va_list args;
-  int ret;
-  va_start (args, format);
-  ret = vsnprintf (buf, size, format, args);
-  va_end (args);
-  return ret;
-}
-#endif
-static char fmtstring[10];
-static char buf[100];
-int main ()
-{
-  int count = -1;
-  /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
-     support %n in format strings in read-only memory but not in writable
-     memory.  */
-  strcpy (fmtstring, "%d %n");
-  my_snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
-  if (count != 6)
-    return 1;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_snprintf_directive_n=yes
-else
-  gl_cv_func_snprintf_directive_n=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_directive_n" >&5
-$as_echo "$gl_cv_func_snprintf_directive_n" >&6; }
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5
-$as_echo_n "checking whether snprintf respects a size of 1... " >&6; }
-if ${gl_cv_func_snprintf_size1+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                            # Guess yes on Android.
-           linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
-                            # Guess yes on native Windows.
-           mingw*)          gl_cv_func_snprintf_size1="guessing yes" ;;
-           *)               gl_cv_func_snprintf_size1="guessing yes" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#if HAVE_SNPRINTF
-# define my_snprintf snprintf
-#else
-# include <stdarg.h>
-static int my_snprintf (char *buf, int size, const char *format, ...)
-{
-  va_list args;
-  int ret;
-  va_start (args, format);
-  ret = vsnprintf (buf, size, format, args);
-  va_end (args);
-  return ret;
-}
-#endif
-int main()
-{
-  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
-  my_snprintf (buf, 1, "%d", 12345);
-  return buf[1] != 'E';
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_snprintf_size1=yes
-else
-  gl_cv_func_snprintf_size1=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5
-$as_echo "$gl_cv_func_snprintf_size1" >&6; }
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vsnprintf respects a zero size as in C99" >&5
-$as_echo_n "checking whether vsnprintf respects a zero size as in C99... " >&6; }
-if ${gl_cv_func_vsnprintf_zerosize_c99+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-                                 # Guess yes on glibc systems.
-           *-gnu* | gnu*)        gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on musl systems.
-           *-musl*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on FreeBSD >= 5.
-           freebsd[1-4].*)       gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
-           freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on Mac OS X >= 10.3.
-           darwin[1-6].*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
-           darwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on Cygwin.
-           cygwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on Solaris >= 2.6.
-           solaris2.[0-5] | solaris2.[0-5].*)
-                                 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
-           solaris*)             gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on AIX >= 4.
-           aix[1-3]*)            gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
-           aix*)                 gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on IRIX >= 6.5.
-           irix6.5)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on NetBSD >= 3.
-           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
-                                 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
-           netbsd*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on BeOS.
-           beos*)                gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on Android.
-           linux*-android*)      gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on native Windows.
-           mingw* | pw*)         gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # If we don't know, obey --enable-cross-guesses.
-           *)                    gl_cv_func_vsnprintf_zerosize_c99="$gl_cross_guess_normal";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdarg.h>
-#include <stdio.h>
-static int my_snprintf (char *buf, int size, const char *format, ...)
-{
-  va_list args;
-  int ret;
-  va_start (args, format);
-  ret = vsnprintf (buf, size, format, args);
-  va_end (args);
-  return ret;
-}
-int main()
-{
-  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
-  my_snprintf (buf, 0, "%d", 12345);
-  return buf[0] != 'D';
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_vsnprintf_zerosize_c99=yes
-else
-  gl_cv_func_vsnprintf_zerosize_c99=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_vsnprintf_zerosize_c99" >&5
-$as_echo "$gl_cv_func_vsnprintf_zerosize_c99" >&6; }
-
-    case "$gl_cv_func_printf_sizes_c99" in
-      *yes)
-        case "$gl_cv_func_printf_long_double" in
-          *yes)
-            case "$gl_cv_func_printf_infinite" in
-              *yes)
-                case "$gl_cv_func_printf_infinite_long_double" in
-                  *yes)
-                    case "$gl_cv_func_printf_directive_a" in
-                      *yes)
-                        case "$gl_cv_func_printf_directive_f" in
-                          *yes)
-                            case "$gl_cv_func_printf_directive_n" in
-                              *yes)
-                                case "$gl_cv_func_printf_directive_ls" in
-                                  *yes)
-                                    case "$gl_cv_func_printf_positions" in
-                                      *yes)
-                                        case "$gl_cv_func_printf_flag_grouping" in
-                                          *yes)
-                                            case "$gl_cv_func_printf_flag_leftadjust" in
-                                              *yes)
-                                                case "$gl_cv_func_printf_flag_zero" in
-                                                  *yes)
-                                                    case "$gl_cv_func_printf_precision" in
-                                                      *yes)
-                                                        case "$gl_cv_func_printf_enomem" in
-                                                          *yes)
-                                                            case "$gl_cv_func_snprintf_truncation_c99" in
-                                                              *yes)
-                                                                case "$gl_cv_func_snprintf_retval_c99" in
-                                                                  *yes)
-                                                                    case "$gl_cv_func_snprintf_directive_n" in
-                                                                      *yes)
-                                                                        case "$gl_cv_func_snprintf_size1" in
-                                                                          *yes)
-                                                                            case "$gl_cv_func_vsnprintf_zerosize_c99" in
-                                                                              *yes)
-                                                                                # snprintf exists and is
-                                                                                # already POSIX compliant.
-                                                                                gl_cv_func_snprintf_posix=yes
-                                                                                ;;
-                                                                            esac
-                                                                            ;;
-                                                                        esac
-                                                                        ;;
-                                                                    esac
-                                                                    ;;
-                                                                esac
-                                                                ;;
-                                                            esac
-                                                            ;;
-                                                        esac
-                                                        ;;
-                                                    esac
-                                                    ;;
-                                                esac
-                                                ;;
-                                            esac
-                                            ;;
-                                        esac
-                                        ;;
-                                    esac
-                                    ;;
-                                esac
-                                ;;
-                            esac
-                            ;;
-                        esac
-                        ;;
-                    esac
-                    ;;
-                esac
-                ;;
-            esac
-            ;;
-        esac
-        ;;
-    esac
-  fi
-  if test $gl_cv_func_snprintf_posix = no; then
-
-
-
-  case "$gl_cv_func_printf_infinite" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-  case "$gl_cv_func_printf_long_double" in
-    *yes)
-      case "$gl_cv_func_printf_infinite_long_double" in
-        *yes)
-          ;;
-        *)
-
-$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
-
-          ;;
-      esac
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_a" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
-
-      for ac_func in nl_langinfo
-do :
-  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
-if test "x$ac_cv_func_nl_langinfo" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_NL_LANGINFO 1
-_ACEOF
-
-fi
-done
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_f" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_ls" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_grouping" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_leftadjust" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_zero" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_precision" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_enomem" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
-
-  if test $ac_cv_func_vasnprintf = yes; then
-
-$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-
-
-
-
-
-
-  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
-if test "x$ac_cv_type_ptrdiff_t" = xyes; then :
-
-else
-
-$as_echo "#define ptrdiff_t long" >>confdefs.h
-
-
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS snprintf.$ac_objext"
-
-  if test $ac_cv_func_snprintf = yes; then
-    REPLACE_SNPRINTF=1
-  else
-
-    if test $ac_cv_have_decl_snprintf = yes; then
-                        REPLACE_SNPRINTF=1
-    fi
-  fi
-  :
-
-  fi
-
-
-
-
-
-
 
 
 
@@ -35518,22 +15725,20 @@
 
 
      if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_spawn_h='<'spawn.h'>'
+       gl_cv_next_errno_h='<'errno.h'>'
      else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <spawn.h>" >&5
-$as_echo_n "checking absolute name of <spawn.h>... " >&6; }
-if ${gl_cv_next_spawn_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-             if test $ac_cv_header_spawn_h = yes; then
-
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <errno.h>" >&5
+printf %s "checking absolute name of <errno.h>... " >&6; }
+if test ${gl_cv_next_errno_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
 
 
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <spawn.h>
+#include <errno.h>
 _ACEOF
                 case "$host_os" in
     aix*) gl_absname_cpp="$ac_cpp -C" ;;
@@ -35549,7 +15754,7 @@
       ;;
   esac
       gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'spawn.h' \
+  gl_header_literal_regex=`echo 'errno.h' \
                            | sed -e "$gl_make_literal_regex_sed"`
   gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
       s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
@@ -35558,4967 +15763,1457 @@
       q
     }'
 
-        gl_cv_absolute_spawn_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+        gl_cv_absolute_errno_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
   sed -n "$gl_absolute_header_sed"`
 
-           gl_header=$gl_cv_absolute_spawn_h
-           gl_cv_next_spawn_h='"'$gl_header'"'
-          else
-               gl_cv_next_spawn_h='<'spawn.h'>'
-             fi
+           gl_header=$gl_cv_absolute_errno_h
+           gl_cv_next_errno_h='"'$gl_header'"'
 
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_spawn_h" >&5
-$as_echo "$gl_cv_next_spawn_h" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_errno_h" >&5
+printf "%s\n" "$gl_cv_next_errno_h" >&6; }
      fi
-     NEXT_SPAWN_H=$gl_cv_next_spawn_h
+     NEXT_ERRNO_H=$gl_cv_next_errno_h
 
      if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
        # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'spawn.h'>'
+       gl_next_as_first_directive='<'errno.h'>'
      else
        # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_spawn_h
+       gl_next_as_first_directive=$gl_cv_next_errno_h
      fi
-     NEXT_AS_FIRST_DIRECTIVE_SPAWN_H=$gl_next_as_first_directive
+     NEXT_AS_FIRST_DIRECTIVE_ERRNO_H=$gl_next_as_first_directive
 
 
 
 
-
-  if test $ac_cv_header_spawn_h = yes; then
-    HAVE_SPAWN_H=1
-    ac_fn_c_check_type "$LINENO" "posix_spawnattr_t" "ac_cv_type_posix_spawnattr_t" "
-#include <spawn.h>
-
-"
-if test "x$ac_cv_type_posix_spawnattr_t" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_POSIX_SPAWNATTR_T 1
-_ACEOF
-
-
-else
-  HAVE_POSIX_SPAWNATTR_T=0
-fi
-
-    ac_fn_c_check_type "$LINENO" "posix_spawn_file_actions_t" "ac_cv_type_posix_spawn_file_actions_t" "
-#include <spawn.h>
-
-"
-if test "x$ac_cv_type_posix_spawn_file_actions_t" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_POSIX_SPAWN_FILE_ACTIONS_T 1
-_ACEOF
-
-
-else
-  HAVE_POSIX_SPAWN_FILE_ACTIONS_T=0
-fi
-
-  else
-    HAVE_SPAWN_H=0
-    HAVE_POSIX_SPAWNATTR_T=0
-    HAVE_POSIX_SPAWN_FILE_ACTIONS_T=0
+    ERRNO_H='errno.h'
   fi
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_cv_func_sprintf_posix=no
-  case "$gl_cv_func_printf_sizes_c99" in
-    *yes)
-      case "$gl_cv_func_printf_long_double" in
-        *yes)
-          case "$gl_cv_func_printf_infinite" in
-            *yes)
-              case "$gl_cv_func_printf_infinite_long_double" in
-                *yes)
-                  case "$gl_cv_func_printf_directive_a" in
-                    *yes)
-                      case "$gl_cv_func_printf_directive_f" in
-                        *yes)
-                          case "$gl_cv_func_printf_directive_n" in
-                            *yes)
-                              case "$gl_cv_func_printf_directive_ls" in
-                                *yes)
-                                  case "$gl_cv_func_printf_positions" in
-                                    *yes)
-                                      case "$gl_cv_func_printf_flag_grouping" in
-                                        *yes)
-                                          case "$gl_cv_func_printf_flag_leftadjust" in
-                                            *yes)
-                                              case "$gl_cv_func_printf_flag_zero" in
-                                                *yes)
-                                                  case "$gl_cv_func_printf_precision" in
-                                                    *yes)
-                                                      case "$gl_cv_func_printf_enomem" in
-                                                        *yes)
-                                                          # sprintf exists and is
-                                                          # already POSIX compliant.
-                                                          gl_cv_func_sprintf_posix=yes
-                                                          ;;
-                                                      esac
-                                                      ;;
-                                                  esac
-                                                  ;;
-                                              esac
-                                              ;;
-                                          esac
-                                          ;;
-                                      esac
-                                      ;;
-                                  esac
-                                  ;;
-                              esac
-                              ;;
-                          esac
-                          ;;
-                      esac
-                      ;;
-                  esac
-                  ;;
-              esac
-              ;;
-          esac
-          ;;
-      esac
-      ;;
-  esac
-  if test $gl_cv_func_sprintf_posix = no; then
-
-
-
-  case "$gl_cv_func_printf_infinite" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-  case "$gl_cv_func_printf_long_double" in
-    *yes)
-      case "$gl_cv_func_printf_infinite_long_double" in
-        *yes)
-          ;;
-        *)
-
-$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
-
-          ;;
-      esac
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_a" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
-
-      for ac_func in nl_langinfo
-do :
-  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
-if test "x$ac_cv_func_nl_langinfo" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_NL_LANGINFO 1
-_ACEOF
-
-fi
-done
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_f" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_ls" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_grouping" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_leftadjust" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_zero" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_precision" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_enomem" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
-
-  if test $ac_cv_func_vasnprintf = yes; then
-
-$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-
-
-
-
-
-
-  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
-if test "x$ac_cv_type_ptrdiff_t" = xyes; then :
-
+   if test -n "$ERRNO_H"; then
+  GL_GENERATE_ERRNO_H_TRUE=
+  GL_GENERATE_ERRNO_H_FALSE='#'
 else
-
-$as_echo "#define ptrdiff_t long" >>confdefs.h
-
-
+  GL_GENERATE_ERRNO_H_TRUE='#'
+  GL_GENERATE_ERRNO_H_FALSE=
 fi
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS sprintf.$ac_objext"
-
-  REPLACE_SPRINTF=1
-  :
-
-  fi
-
-
-
-
-
-
-          GNULIB_SPRINTF_POSIX=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_SPRINTF_POSIX 1" >>confdefs.h
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ssize_t" >&5
-$as_echo_n "checking for ssize_t... " >&6; }
-if ${gt_cv_ssize_t+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-int
-main ()
-{
-int x = sizeof (ssize_t *) + sizeof (ssize_t);
-            return !x;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gt_cv_ssize_t=yes
-else
-  gt_cv_ssize_t=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_ssize_t" >&5
-$as_echo "$gt_cv_ssize_t" >&6; }
-  if test $gt_cv_ssize_t = no; then
-
-$as_echo "#define ssize_t int" >>confdefs.h
-
-  fi
-
-
-
-
-  # Define two additional variables used in the Makefile substitution.
-
-  if test "$ac_cv_header_stdbool_h" = yes; then
-    STDBOOL_H=''
-  else
-    STDBOOL_H='stdbool.h'
-  fi
-
-   if test -n "$STDBOOL_H"; then
-  GL_GENERATE_STDBOOL_H_TRUE=
-  GL_GENERATE_STDBOOL_H_FALSE='#'
-else
-  GL_GENERATE_STDBOOL_H_TRUE='#'
-  GL_GENERATE_STDBOOL_H_FALSE=
-fi
-
-
-  if test "$ac_cv_type__Bool" = yes; then
-    HAVE__BOOL=1
-  else
-    HAVE__BOOL=0
-  fi
-
-
-
-
-
-  STDDEF_H=
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for good max_align_t" >&5
-$as_echo_n "checking for good max_align_t... " >&6; }
-if ${gl_cv_type_max_align_t+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stddef.h>
-            unsigned int s = sizeof (max_align_t);
-            #if defined __GNUC__ || defined __IBM__ALIGNOF__
-            int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1];
-            int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1];
-            #endif
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_type_max_align_t=yes
-else
-  gl_cv_type_max_align_t=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_max_align_t" >&5
-$as_echo "$gl_cv_type_max_align_t" >&6; }
-  if test $gl_cv_type_max_align_t = no; then
-    HAVE_MAX_ALIGN_T=0
-    STDDEF_H=stddef.h
-  fi
-
-  if test $gt_cv_c_wchar_t = no; then
-    HAVE_WCHAR_T=0
-    STDDEF_H=stddef.h
-  fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NULL can be used in arbitrary expressions" >&5
-$as_echo_n "checking whether NULL can be used in arbitrary expressions... " >&6; }
-if ${gl_cv_decl_null_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stddef.h>
-      int test[2 * (sizeof NULL == sizeof (void *)) -1];
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_decl_null_works=yes
-else
-  gl_cv_decl_null_works=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_null_works" >&5
-$as_echo "$gl_cv_decl_null_works" >&6; }
-  if test $gl_cv_decl_null_works = no; then
-    REPLACE_NULL=1
-    STDDEF_H=stddef.h
-  fi
-
-
-   if test -n "$STDDEF_H"; then
-  GL_GENERATE_STDDEF_H_TRUE=
-  GL_GENERATE_STDDEF_H_FALSE='#'
-else
-  GL_GENERATE_STDDEF_H_TRUE='#'
-  GL_GENERATE_STDDEF_H_FALSE=
-fi
-
-  if test -n "$STDDEF_H"; then
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_stddef_h='<'stddef.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <stddef.h>" >&5
-$as_echo_n "checking absolute name of <stddef.h>... " >&6; }
-if ${gl_cv_next_stddef_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stddef.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'stddef.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_stddef_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_stddef_h
-           gl_cv_next_stddef_h='"'$gl_header'"'
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stddef_h" >&5
-$as_echo "$gl_cv_next_stddef_h" >&6; }
-     fi
-     NEXT_STDDEF_H=$gl_cv_next_stddef_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'stddef.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_stddef_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_STDDEF_H=$gl_next_as_first_directive
-
-
-
-
-  fi
-
-
-
-
-  $as_echo "#define __USE_MINGW_ANSI_STDIO 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_stdio_h='<'stdio.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdio.h>" >&5
-$as_echo_n "checking absolute name of <stdio.h>... " >&6; }
-if ${gl_cv_next_stdio_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'stdio.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_stdio_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_stdio_h
-           gl_cv_next_stdio_h='"'$gl_header'"'
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdio_h" >&5
-$as_echo "$gl_cv_next_stdio_h" >&6; }
-     fi
-     NEXT_STDIO_H=$gl_cv_next_stdio_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'stdio.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_stdio_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_STDIO_H=$gl_next_as_first_directive
-
-
-
-
-
-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking which flavor of printf attribute matches inttypes macros" >&5
-$as_echo_n "checking which flavor of printf attribute matches inttypes macros... " >&6; }
-if ${gl_cv_func_printf_attribute_flavor+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-       #define __STDC_FORMAT_MACROS 1
-       #include <stdio.h>
-       #include <inttypes.h>
-       /* For non-mingw systems, compilation will trivially succeed.
-          For mingw, compilation will succeed for older mingw (system
-          printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */
-       #if (defined _WIN32 && ! defined __CYGWIN__) && \
-         (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
-       extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1];
-       #endif
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_func_printf_attribute_flavor=system
-else
-  gl_cv_func_printf_attribute_flavor=gnu
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_attribute_flavor" >&5
-$as_echo "$gl_cv_func_printf_attribute_flavor" >&6; }
-  if test "$gl_cv_func_printf_attribute_flavor" = gnu; then
-
-$as_echo "#define GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU 1" >>confdefs.h
-
-  fi
-
-      GNULIB_FSCANF=1
-
-
-cat >>confdefs.h <<_ACEOF
-#define GNULIB_FSCANF 1
-_ACEOF
-
-
-  GNULIB_SCANF=1
-
-
-cat >>confdefs.h <<_ACEOF
-#define GNULIB_SCANF 1
-_ACEOF
-
-
-  GNULIB_FGETC=1
-  GNULIB_GETC=1
-  GNULIB_GETCHAR=1
-  GNULIB_FGETS=1
-  GNULIB_FREAD=1
-
-
-      GNULIB_FPRINTF=1
-  GNULIB_PRINTF=1
-  GNULIB_VFPRINTF=1
-  GNULIB_VPRINTF=1
-  GNULIB_FPUTC=1
-  GNULIB_PUTC=1
-  GNULIB_PUTCHAR=1
-  GNULIB_FPUTS=1
-  GNULIB_PUTS=1
-  GNULIB_FWRITE=1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_stdlib_h='<'stdlib.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdlib.h>" >&5
-$as_echo_n "checking absolute name of <stdlib.h>... " >&6; }
-if ${gl_cv_next_stdlib_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'stdlib.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_stdlib_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_stdlib_h
-           gl_cv_next_stdlib_h='"'$gl_header'"'
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdlib_h" >&5
-$as_echo "$gl_cv_next_stdlib_h" >&6; }
-     fi
-     NEXT_STDLIB_H=$gl_cv_next_stdlib_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'stdlib.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_stdlib_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_STDLIB_H=$gl_next_as_first_directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  for ac_func in stpcpy
-do :
-  ac_fn_c_check_func "$LINENO" "stpcpy" "ac_cv_func_stpcpy"
-if test "x$ac_cv_func_stpcpy" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_STPCPY 1
-_ACEOF
-
-fi
-done
-
-  if test $ac_cv_func_stpcpy = no; then
-    HAVE_STPCPY=0
-  fi
-
-  if test $HAVE_STPCPY = 0; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS stpcpy.$ac_objext"
-
-
-  :
-
-  fi
-
-
-
-
-
-          GNULIB_STPCPY=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_STPCPY 1" >>confdefs.h
-
-
-
-
-
-
-
-  if test $ac_cv_func_strdup = yes; then
-    if test $gl_cv_func_malloc_posix != yes; then
-      REPLACE_STRDUP=1
-    fi
-  fi
-
-  if test $ac_cv_have_decl_strdup = no; then
-    HAVE_DECL_STRDUP=0
-  fi
-
-  if test $ac_cv_func_strdup = no || test $REPLACE_STRDUP = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS strdup.$ac_objext"
-
-    :
-  fi
-
-
-
-
-
-          GNULIB_STRDUP=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_STRDUP 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-
-  if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strerror function" >&5
-$as_echo_n "checking for working strerror function... " >&6; }
-if ${gl_cv_func_working_strerror+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                          # Guess yes on glibc systems.
-           *-gnu* | gnu*) gl_cv_func_working_strerror="guessing yes" ;;
-                          # Guess yes on musl systems.
-           *-musl*)       gl_cv_func_working_strerror="guessing yes" ;;
-                          # If we don't know, obey --enable-cross-guesses.
-           *)             gl_cv_func_working_strerror="$gl_cross_guess_normal" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-int
-main ()
-{
-if (!*strerror (-2)) return 1;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_working_strerror=yes
-else
-  gl_cv_func_working_strerror=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_strerror" >&5
-$as_echo "$gl_cv_func_working_strerror" >&6; }
-    case "$gl_cv_func_working_strerror" in
-      *yes) ;;
-      *)
-                        REPLACE_STRERROR=1
-        ;;
-    esac
-
-                  case "$gl_cv_func_strerror_r_works" in
-        *no) REPLACE_STRERROR=1 ;;
-      esac
-
-  else
-            REPLACE_STRERROR=1
-  fi
-
-  if test $REPLACE_STRERROR = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS strerror.$ac_objext"
-
-  fi
-
-
-cat >>confdefs.h <<_ACEOF
-#define GNULIB_STRERROR 1
-_ACEOF
-
-
-
-
-
-
-
-          GNULIB_STRERROR=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_STRERROR 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-
-
-
-  if test $ac_cv_have_decl_strndup = no; then
-    HAVE_DECL_STRNDUP=0
-  fi
-
-  if test $ac_cv_func_strndup = yes; then
-    HAVE_STRNDUP=1
-    # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'.
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strndup" >&5
-$as_echo_n "checking for working strndup... " >&6; }
-if ${gl_cv_func_strndup_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-
-          case $host_os in
-            aix | aix[3-6]*) gl_cv_func_strndup_works="guessing no";;
-            *)               gl_cv_func_strndup_works="guessing yes";;
-          esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-         #include <string.h>
-                           #include <stdlib.h>
-int
-main ()
-{
-
-#if !HAVE_DECL_STRNDUP
-  extern
-  #ifdef __cplusplus
-  "C"
-  #endif
-  char *strndup (const char *, size_t);
-#endif
-  int result;
-  char *s;
-  s = strndup ("some longer string", 15);
-  free (s);
-  s = strndup ("shorter string", 13);
-  result = s[13] != '\0';
-  free (s);
-  return result;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_strndup_works=yes
-else
-  gl_cv_func_strndup_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strndup_works" >&5
-$as_echo "$gl_cv_func_strndup_works" >&6; }
-    case $gl_cv_func_strndup_works in
-      *no) REPLACE_STRNDUP=1 ;;
-    esac
-  else
-    HAVE_STRNDUP=0
-  fi
-
-  if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS strndup.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_STRNDUP=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_STRNDUP 1" >>confdefs.h
-
-
-
-
-
-
-
-  for ac_func in strverscmp
-do :
-  ac_fn_c_check_func "$LINENO" "strverscmp" "ac_cv_func_strverscmp"
-if test "x$ac_cv_func_strverscmp" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_STRVERSCMP 1
-_ACEOF
-
-fi
-done
-
-  if test $ac_cv_func_strverscmp = no; then
-    HAVE_STRVERSCMP=0
-  fi
-
-  if test $HAVE_STRVERSCMP = 0; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS strverscmp.$ac_objext"
-
-
-  :
-
-  fi
-
-
-
-
-
-          GNULIB_STRVERSCMP=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_STRVERSCMP 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_sys_resource_h='<'sys/resource.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/resource.h>" >&5
-$as_echo_n "checking absolute name of <sys/resource.h>... " >&6; }
-if ${gl_cv_next_sys_resource_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-             if test $ac_cv_header_sys_resource_h = yes; then
-
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/resource.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'sys/resource.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_sys_resource_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_sys_resource_h
-           gl_cv_next_sys_resource_h='"'$gl_header'"'
-          else
-               gl_cv_next_sys_resource_h='<'sys/resource.h'>'
-             fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_resource_h" >&5
-$as_echo "$gl_cv_next_sys_resource_h" >&6; }
-     fi
-     NEXT_SYS_RESOURCE_H=$gl_cv_next_sys_resource_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'sys/resource.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_sys_resource_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_SYS_RESOURCE_H=$gl_next_as_first_directive
-
-
-
-
-  if test $ac_cv_header_sys_resource_h = yes; then
-    HAVE_SYS_RESOURCE_H=1
-  else
-    HAVE_SYS_RESOURCE_H=0
-  fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_sys_times_h='<'sys/times.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/times.h>" >&5
-$as_echo_n "checking absolute name of <sys/times.h>... " >&6; }
-if ${gl_cv_next_sys_times_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-             if test $ac_cv_header_sys_times_h = yes; then
-
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/times.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'sys/times.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_sys_times_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_sys_times_h
-           gl_cv_next_sys_times_h='"'$gl_header'"'
-          else
-               gl_cv_next_sys_times_h='<'sys/times.h'>'
-             fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_times_h" >&5
-$as_echo "$gl_cv_next_sys_times_h" >&6; }
-     fi
-     NEXT_SYS_TIMES_H=$gl_cv_next_sys_times_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'sys/times.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_sys_times_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_SYS_TIMES_H=$gl_next_as_first_directive
-
-
-
-
-  if test $ac_cv_header_sys_times_h = yes; then
-    HAVE_SYS_TIMES_H=1
-    ac_fn_c_check_type "$LINENO" "struct tms" "ac_cv_type_struct_tms" "
-#include <sys/times.h>
-
-"
-if test "x$ac_cv_type_struct_tms" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_STRUCT_TMS 1
-_ACEOF
-
-
-else
-  HAVE_STRUCT_TMS=0
-fi
-
-  else
-    HAVE_SYS_TIMES_H=0
-    HAVE_STRUCT_TMS=0
-  fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_sys_wait_h='<'sys/wait.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/wait.h>" >&5
-$as_echo_n "checking absolute name of <sys/wait.h>... " >&6; }
-if ${gl_cv_next_sys_wait_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-             if test $ac_cv_header_sys_wait_h = yes; then
-
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/wait.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'sys/wait.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_sys_wait_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_sys_wait_h
-           gl_cv_next_sys_wait_h='"'$gl_header'"'
-          else
-               gl_cv_next_sys_wait_h='<'sys/wait.h'>'
-             fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_wait_h" >&5
-$as_echo "$gl_cv_next_sys_wait_h" >&6; }
-     fi
-     NEXT_SYS_WAIT_H=$gl_cv_next_sys_wait_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'sys/wait.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_sys_wait_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H=$gl_next_as_first_directive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  :
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_unistd_h='<'unistd.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <unistd.h>" >&5
-$as_echo_n "checking absolute name of <unistd.h>... " >&6; }
-if ${gl_cv_next_unistd_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-             if test $ac_cv_header_unistd_h = yes; then
-
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <unistd.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'unistd.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_unistd_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_unistd_h
-           gl_cv_next_unistd_h='"'$gl_header'"'
-          else
-               gl_cv_next_unistd_h='<'unistd.h'>'
-             fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_unistd_h" >&5
-$as_echo "$gl_cv_next_unistd_h" >&6; }
-     fi
-     NEXT_UNISTD_H=$gl_cv_next_unistd_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'unistd.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_unistd_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_UNISTD_H=$gl_next_as_first_directive
-
-
-
-
-  if test $ac_cv_header_unistd_h = yes; then
-    HAVE_UNISTD_H=1
-  else
-    HAVE_UNISTD_H=0
-  fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      if  { test "$HAVE_LIBUNISTRING" != yes \
-    || {
-
-
-
-            test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
-            || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
-                 && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
-                      || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
-                           && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4
-                         }
-                    }
-               }
-
-
-
-
-       }
-  }; then
-    LIBUNISTRING_UNITYPES_H='unitypes.h'
-  else
-    LIBUNISTRING_UNITYPES_H=
-  fi
-
-
-
-
-      if  { test "$HAVE_LIBUNISTRING" != yes \
-    || {
-
-
-
-            test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
-            || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
-                 && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
-                      || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
-                           && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4
-                         }
-                    }
-               }
-
-
-
-
-       }
-  }; then
-    LIBUNISTRING_UNIWIDTH_H='uniwidth.h'
-  else
-    LIBUNISTRING_UNIWIDTH_H=
-  fi
-
-
-
-
-       if  { test "$HAVE_LIBUNISTRING" != yes \
-    || {
-
-
-
-            test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
-            || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
-                 && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
-                      || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
-                           && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8
-                         }
-                    }
-               }
-
-
-
-
-       }
-  }; then
-  LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE=
-  LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE='#'
-else
-  LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE='#'
-  LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE=
-fi
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether unlink honors trailing slashes" >&5
-$as_echo_n "checking whether unlink honors trailing slashes... " >&6; }
-if ${gl_cv_func_unlink_honors_slashes+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  touch conftest.file
-     # Assume that if we have lstat, we can also check symlinks.
-     if test $ac_cv_func_lstat = yes; then
-       ln -s conftest.file conftest.lnk
-     fi
-     if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                          # Guess yes on Linux systems.
-         linux-* | linux) gl_cv_func_unlink_honors_slashes="guessing yes" ;;
-                          # Guess yes on glibc systems.
-         *-gnu*)          gl_cv_func_unlink_honors_slashes="guessing yes" ;;
-                          # Guess no on native Windows.
-         mingw*)          gl_cv_func_unlink_honors_slashes="guessing no" ;;
-                          # If we don't know, obey --enable-cross-guesses.
-         *)               gl_cv_func_unlink_honors_slashes="$gl_cross_guess_normal" ;;
-       esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#if HAVE_UNISTD_H
-           # include <unistd.h>
-           #else /* on Windows with MSVC */
-           # include <io.h>
-           #endif
-           #include <errno.h>
-
-int
-main ()
-{
-int result = 0;
-           if (!unlink ("conftest.file/"))
-             result |= 1;
-           else if (errno != ENOTDIR)
-             result |= 2;
-#if HAVE_LSTAT
-           if (!unlink ("conftest.lnk/"))
-             result |= 4;
-           else if (errno != ENOTDIR)
-             result |= 8;
-#endif
-           return result;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_unlink_honors_slashes=yes
-else
-  gl_cv_func_unlink_honors_slashes=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-     rm -f conftest.file conftest.lnk
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_unlink_honors_slashes" >&5
-$as_echo "$gl_cv_func_unlink_honors_slashes" >&6; }
-  case "$gl_cv_func_unlink_honors_slashes" in
-    *no)
-      REPLACE_UNLINK=1
-      ;;
-  esac
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether unlink of a parent directory fails as it should" >&5
-$as_echo_n "checking whether unlink of a parent directory fails as it should... " >&6; }
-if ${gl_cv_func_unlink_parent_fails+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case "$host_os" in
-       darwin*)
-                                                      if {
-              # Use the mktemp program if available. If not available, hide the error
-              # message.
-              tmp=`(umask 077 && mktemp -d /tmp/gtXXXXXX) 2>/dev/null` &&
-              test -n "$tmp" && test -d "$tmp"
-            } ||
-            {
-              # Use a simple mkdir command. It is guaranteed to fail if the directory
-              # already exists.  $RANDOM is bash specific and expands to empty in shells
-              # other than bash, ksh and zsh.  Its use does not increase security;
-              # rather, it minimizes the probability of failure in a very cluttered /tmp
-              # directory.
-              tmp=/tmp/gt$$-$RANDOM
-              (umask 077 && mkdir "$tmp")
-            }; then
-           mkdir "$tmp/subdir"
-           GL_SUBDIR_FOR_UNLINK="$tmp/subdir"
-           export GL_SUBDIR_FOR_UNLINK
-           if test "$cross_compiling" = yes; then :
-  # If we don't know, obey --enable-cross-guesses.
-              gl_cv_func_unlink_parent_fails="$gl_cross_guess_normal"
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-                #include <stdlib.h>
-                #if HAVE_UNISTD_H
-                # include <unistd.h>
-                #else /* on Windows with MSVC */
-                # include <direct.h>
-                # include <io.h>
-                #endif
-                int main ()
-                {
-                  int result = 0;
-                  if (chdir (getenv ("GL_SUBDIR_FOR_UNLINK")) != 0)
-                    result |= 1;
-                  else if (unlink ("..") == 0)
-                    result |= 2;
-                  return result;
-                }
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_unlink_parent_fails=yes
-else
-  gl_cv_func_unlink_parent_fails=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-           unset GL_SUBDIR_FOR_UNLINK
-           rm -rf "$tmp"
-         else
-           gl_cv_func_unlink_parent_fails="guessing no"
-         fi
-         ;;
-       *)
-         gl_cv_func_unlink_parent_fails="guessing yes"
-         ;;
-     esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_unlink_parent_fails" >&5
-$as_echo "$gl_cv_func_unlink_parent_fails" >&6; }
-  case "$gl_cv_func_unlink_parent_fails" in
-    *no)
-      REPLACE_UNLINK=1
-
-$as_echo "#define UNLINK_PARENT_BUG 1" >>confdefs.h
-
-      ;;
-  esac
-
-  if test $REPLACE_UNLINK = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS unlink.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_UNLINK=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_UNLINK 1" >>confdefs.h
-
-
-
-
-
-$as_echo "#define USE_UNLOCKED_IO 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  if test $ac_cv_have_decl_unsetenv = no; then
-    HAVE_DECL_UNSETENV=0
-  fi
-  for ac_func in unsetenv
-do :
-  ac_fn_c_check_func "$LINENO" "unsetenv" "ac_cv_func_unsetenv"
-if test "x$ac_cv_func_unsetenv" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_UNSETENV 1
-_ACEOF
-
-fi
-done
-
-  if test $ac_cv_func_unsetenv = no; then
-    HAVE_UNSETENV=0
-  else
-    HAVE_UNSETENV=1
-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsetenv() return type" >&5
-$as_echo_n "checking for unsetenv() return type... " >&6; }
-if ${gt_cv_func_unsetenv_ret+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#undef _BSD
-#define _BSD 1 /* unhide unsetenv declaration in OSF/1 5.1 <stdlib.h> */
-#include <stdlib.h>
-extern
-#ifdef __cplusplus
-"C"
-#endif
-int unsetenv (const char *name);
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gt_cv_func_unsetenv_ret='int'
-else
-  gt_cv_func_unsetenv_ret='void'
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_unsetenv_ret" >&5
-$as_echo "$gt_cv_func_unsetenv_ret" >&6; }
-    if test $gt_cv_func_unsetenv_ret = 'void'; then
-
-$as_echo "#define VOID_UNSETENV 1" >>confdefs.h
-
-      REPLACE_UNSETENV=1
-    fi
-
-                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether unsetenv obeys POSIX" >&5
-$as_echo_n "checking whether unsetenv obeys POSIX... " >&6; }
-if ${gl_cv_func_unsetenv_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                 # Guess yes on glibc systems.
-         *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;;
-                 # If we don't know, obey --enable-cross-guesses.
-         *)      gl_cv_func_unsetenv_works="$gl_cross_guess_normal" ;;
-       esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-       #include <stdlib.h>
-       #include <errno.h>
-       extern char **environ;
-
-int
-main ()
-{
-
-       char entry1[] = "a=1";
-       char entry2[] = "b=2";
-       char *env[] = { entry1, entry2, NULL };
-       if (putenv ((char *) "a=1")) return 1;
-       if (putenv (entry2)) return 2;
-       entry2[0] = 'a';
-       unsetenv ("a");
-       if (getenv ("a")) return 3;
-       if (!unsetenv ("") || errno != EINVAL) return 4;
-       entry2[0] = 'b';
-       environ = env;
-       if (!getenv ("a")) return 5;
-       entry2[0] = 'a';
-       unsetenv ("a");
-       if (getenv ("a")) return 6;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_unsetenv_works=yes
-else
-  gl_cv_func_unsetenv_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_unsetenv_works" >&5
-$as_echo "$gl_cv_func_unsetenv_works" >&6; }
-    case "$gl_cv_func_unsetenv_works" in
-      *yes) ;;
-      *)
-        REPLACE_UNSETENV=1
-        ;;
-    esac
-  fi
-
-  if test $HAVE_UNSETENV = 0 || test $REPLACE_UNSETENV = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS unsetenv.$ac_objext"
-
-
-
-
-
-  fi
-
-
-
-
-
-          GNULIB_UNSETENV=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_UNSETENV 1" >>confdefs.h
-
-
-
-
-
-  if test $ac_cv_func_vasnprintf = no; then
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
-
-  if test $ac_cv_func_vasnprintf = yes; then
-
-$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-
-
-
-
-
-
-  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
-if test "x$ac_cv_type_ptrdiff_t" = xyes; then :
-
-else
-
-$as_echo "#define ptrdiff_t long" >>confdefs.h
-
-
-fi
-
-
-
-
-
-
-
-  fi
-
-
-  for ac_func in vasprintf
-do :
-  ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf"
-if test "x$ac_cv_func_vasprintf" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_VASPRINTF 1
-_ACEOF
-
-fi
-done
-
-  if test $ac_cv_func_vasprintf = no; then
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS vasprintf.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS asprintf.$ac_objext"
-
-
-  if test $ac_cv_func_vasprintf = yes; then
-    REPLACE_VASPRINTF=1
-  else
-    HAVE_VASPRINTF=0
-  fi
-
-
-
-
-
-
-
-
-  fi
-
-
-
-
-
-
-          GNULIB_VASPRINTF=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_VASPRINTF 1" >>confdefs.h
-
-
-
-
-
-  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=asprintf:2:c-format"
-
-
-
-  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=vasprintf:2:c-format"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_cv_func_vasprintf_posix=no
-  for ac_func in vasprintf
-do :
-  ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf"
-if test "x$ac_cv_func_vasprintf" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_VASPRINTF 1
-_ACEOF
-
-fi
-done
-
-  case "$gl_cv_func_printf_sizes_c99" in
-    *yes)
-      case "$gl_cv_func_printf_long_double" in
-        *yes)
-          case "$gl_cv_func_printf_infinite" in
-            *yes)
-              case "$gl_cv_func_printf_infinite_long_double" in
-                *yes)
-                  case "$gl_cv_func_printf_directive_a" in
-                    *yes)
-                      case "$gl_cv_func_printf_directive_f" in
-                        *yes)
-                          case "$gl_cv_func_printf_directive_n" in
-                            *yes)
-                              case "$gl_cv_func_printf_directive_ls" in
-                                *yes)
-                                  case "$gl_cv_func_printf_positions" in
-                                    *yes)
-                                      case "$gl_cv_func_printf_flag_grouping" in
-                                        *yes)
-                                          case "$gl_cv_func_printf_flag_leftadjust" in
-                                            *yes)
-                                              case "$gl_cv_func_printf_flag_zero" in
-                                                *yes)
-                                                  case "$gl_cv_func_printf_precision" in
-                                                    *yes)
-                                                      case "$gl_cv_func_printf_enomem" in
-                                                        *yes)
-                                                          if test $ac_cv_func_vasprintf = yes; then
-                                                            # vasprintf exists and is
-                                                            # already POSIX compliant.
-                                                            gl_cv_func_vasprintf_posix=yes
-                                                          fi
-                                                          ;;
-                                                      esac
-                                                      ;;
-                                                  esac
-                                                  ;;
-                                              esac
-                                              ;;
-                                          esac
-                                          ;;
-                                      esac
-                                      ;;
-                                  esac
-                                  ;;
-                              esac
-                              ;;
-                          esac
-                          ;;
-                      esac
-                      ;;
-                  esac
-                  ;;
-              esac
-              ;;
-          esac
-          ;;
-      esac
-      ;;
-  esac
-  if test $gl_cv_func_vasprintf_posix = no; then
-
-
-
-  case "$gl_cv_func_printf_infinite" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-  case "$gl_cv_func_printf_long_double" in
-    *yes)
-      case "$gl_cv_func_printf_infinite_long_double" in
-        *yes)
-          ;;
-        *)
-
-$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
-
-          ;;
-      esac
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_a" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
-
-      for ac_func in nl_langinfo
-do :
-  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
-if test "x$ac_cv_func_nl_langinfo" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_NL_LANGINFO 1
-_ACEOF
-
-fi
-done
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_f" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_ls" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_grouping" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_leftadjust" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_zero" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_precision" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_enomem" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
-
-  if test $ac_cv_func_vasnprintf = yes; then
-
-$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-
-
-
-
-
-
-  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
-if test "x$ac_cv_type_ptrdiff_t" = xyes; then :
-
-else
-
-$as_echo "#define ptrdiff_t long" >>confdefs.h
-
-
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS vasprintf.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS asprintf.$ac_objext"
-
-
-  if test $ac_cv_func_vasprintf = yes; then
-    REPLACE_VASPRINTF=1
-  else
-    HAVE_VASPRINTF=0
-  fi
-
-
-
-
-
-
-
-
-  fi
-
-
-
-  gl_cv_func_vsnprintf_usable=no
-  for ac_func in vsnprintf
-do :
-  ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf"
-if test "x$ac_cv_func_vsnprintf" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_VSNPRINTF 1
-_ACEOF
-
-fi
-done
-
-  if test $ac_cv_func_vsnprintf = yes; then
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5
-$as_echo_n "checking whether snprintf respects a size of 1... " >&6; }
-if ${gl_cv_func_snprintf_size1+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                            # Guess yes on Android.
-           linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
-                            # Guess yes on native Windows.
-           mingw*)          gl_cv_func_snprintf_size1="guessing yes" ;;
-           *)               gl_cv_func_snprintf_size1="guessing yes" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#if HAVE_SNPRINTF
-# define my_snprintf snprintf
-#else
-# include <stdarg.h>
-static int my_snprintf (char *buf, int size, const char *format, ...)
-{
-  va_list args;
-  int ret;
-  va_start (args, format);
-  ret = vsnprintf (buf, size, format, args);
-  va_end (args);
-  return ret;
-}
-#endif
-int main()
-{
-  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
-  my_snprintf (buf, 1, "%d", 12345);
-  return buf[1] != 'E';
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_snprintf_size1=yes
-else
-  gl_cv_func_snprintf_size1=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5
-$as_echo "$gl_cv_func_snprintf_size1" >&6; }
-
-    case "$gl_cv_func_snprintf_size1" in
-      *yes)
-
-        case "$gl_cv_func_snprintf_retval_c99" in
-          *yes)
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5
-$as_echo_n "checking whether printf supports POSIX/XSI format strings with positions... " >&6; }
-if ${gl_cv_func_printf_positions+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-           netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
-                            gl_cv_func_printf_positions="guessing no";;
-           beos*)           gl_cv_func_printf_positions="guessing no";;
-                            # Guess yes on Android.
-           linux*-android*) gl_cv_func_printf_positions="guessing yes";;
-                            # Guess no on native Windows.
-           mingw* | pw*)    gl_cv_func_printf_positions="guessing no";;
-           *)               gl_cv_func_printf_positions="guessing yes";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <string.h>
-/* The string "%2$d %1$d", with dollar characters protected from the shell's
-   dollar expansion (possibly an autoconf bug).  */
-static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
-static char buf[100];
-int main ()
-{
-  sprintf (buf, format, 33, 55);
-  return (strcmp (buf, "55 33") != 0);
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_printf_positions=yes
-else
-  gl_cv_func_printf_positions=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5
-$as_echo "$gl_cv_func_printf_positions" >&6; }
-
-            case "$gl_cv_func_printf_positions" in
-              *yes)
-                gl_cv_func_vsnprintf_usable=yes
-                ;;
-            esac
-            ;;
-        esac
-        ;;
-    esac
-  fi
-  if test $gl_cv_func_vsnprintf_usable = no; then
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS vsnprintf.$ac_objext"
-
-  if test $ac_cv_func_vsnprintf = yes; then
-    REPLACE_VSNPRINTF=1
-  else
-
-    if test $ac_cv_have_decl_vsnprintf = yes; then
-                        REPLACE_VSNPRINTF=1
-    fi
-  fi
-  :
-
-  fi
-
-  if test $ac_cv_have_decl_vsnprintf = no; then
-    HAVE_DECL_VSNPRINTF=0
-  fi
-
-
-
-
-
-
-          GNULIB_VSNPRINTF=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_VSNPRINTF 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_cv_func_vsnprintf_posix=no
-  for ac_func in vsnprintf
-do :
-  ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf"
-if test "x$ac_cv_func_vsnprintf" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_VSNPRINTF 1
-_ACEOF
-
-fi
-done
-
-  if test $ac_cv_func_vsnprintf = yes; then
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf truncates the result as in C99" >&5
-$as_echo_n "checking whether snprintf truncates the result as in C99... " >&6; }
-if ${gl_cv_func_snprintf_truncation_c99+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-                                 # Guess yes on glibc systems.
-           *-gnu* | gnu*)        gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on musl systems.
-           *-musl*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on FreeBSD >= 5.
-           freebsd[1-4].*)       gl_cv_func_snprintf_truncation_c99="guessing no";;
-           freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on Mac OS X >= 10.3.
-           darwin[1-6].*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
-           darwin*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on OpenBSD >= 3.9.
-           openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
-                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
-           openbsd*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on Solaris >= 2.6.
-           solaris2.[0-5] | solaris2.[0-5].*)
-                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
-           solaris*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on AIX >= 4.
-           aix[1-3]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
-           aix*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on HP-UX >= 11.
-           hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
-           hpux*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on IRIX >= 6.5.
-           irix6.5)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on OSF/1 >= 5.
-           osf[3-4]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
-           osf*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on NetBSD >= 3.
-           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
-                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
-           netbsd*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on BeOS.
-           beos*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess yes on Android.
-           linux*-android*)      gl_cv_func_snprintf_truncation_c99="guessing yes";;
-                                 # Guess no on native Windows.
-           mingw*)               gl_cv_func_snprintf_truncation_c99="guessing no";;
-                                 # If we don't know, obey --enable-cross-guesses.
-           *)                    gl_cv_func_snprintf_truncation_c99="$gl_cross_guess_normal";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <string.h>
-#if HAVE_SNPRINTF
-# define my_snprintf snprintf
-#else
-# include <stdarg.h>
-static int my_snprintf (char *buf, int size, const char *format, ...)
-{
-  va_list args;
-  int ret;
-  va_start (args, format);
-  ret = vsnprintf (buf, size, format, args);
-  va_end (args);
-  return ret;
-}
-#endif
-static char buf[100];
-int main ()
-{
-  strcpy (buf, "ABCDEF");
-  my_snprintf (buf, 3, "%d %d", 4567, 89);
-  if (memcmp (buf, "45\0DEF", 6) != 0)
-    return 1;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_snprintf_truncation_c99=yes
-else
-  gl_cv_func_snprintf_truncation_c99=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_truncation_c99" >&5
-$as_echo "$gl_cv_func_snprintf_truncation_c99" >&6; }
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf fully supports the 'n' directive" >&5
-$as_echo_n "checking whether snprintf fully supports the 'n' directive... " >&6; }
-if ${gl_cv_func_snprintf_directive_n+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-                                 # Guess yes on glibc systems.
-           *-gnu* | gnu*)        gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on musl systems.
-           *-musl*)              gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on FreeBSD >= 5.
-           freebsd[1-4].*)       gl_cv_func_snprintf_directive_n="guessing no";;
-           freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on Mac OS X >= 10.3.
-           darwin[1-6].*)        gl_cv_func_snprintf_directive_n="guessing no";;
-           darwin*)              gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on Solaris >= 2.6.
-           solaris2.[0-5] | solaris2.[0-5].*)
-                                 gl_cv_func_snprintf_directive_n="guessing no";;
-           solaris*)             gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on AIX >= 4.
-           aix[1-3]*)            gl_cv_func_snprintf_directive_n="guessing no";;
-           aix*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on IRIX >= 6.5.
-           irix6.5)              gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on OSF/1 >= 5.
-           osf[3-4]*)            gl_cv_func_snprintf_directive_n="guessing no";;
-           osf*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on NetBSD >= 3.
-           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
-                                 gl_cv_func_snprintf_directive_n="guessing no";;
-           netbsd*)              gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess yes on BeOS.
-           beos*)                gl_cv_func_snprintf_directive_n="guessing yes";;
-                                 # Guess no on Android.
-           linux*-android*)      gl_cv_func_snprintf_directive_n="guessing no";;
-                                 # Guess no on native Windows.
-           mingw*)               gl_cv_func_snprintf_directive_n="guessing no";;
-                                 # If we don't know, obey --enable-cross-guesses.
-           *)                    gl_cv_func_snprintf_directive_n="$gl_cross_guess_normal";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#include <string.h>
-#if HAVE_SNPRINTF
-# define my_snprintf snprintf
-#else
-# include <stdarg.h>
-static int my_snprintf (char *buf, int size, const char *format, ...)
-{
-  va_list args;
-  int ret;
-  va_start (args, format);
-  ret = vsnprintf (buf, size, format, args);
-  va_end (args);
-  return ret;
-}
-#endif
-static char fmtstring[10];
-static char buf[100];
-int main ()
-{
-  int count = -1;
-  /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
-     support %n in format strings in read-only memory but not in writable
-     memory.  */
-  strcpy (fmtstring, "%d %n");
-  my_snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
-  if (count != 6)
-    return 1;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_snprintf_directive_n=yes
-else
-  gl_cv_func_snprintf_directive_n=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_directive_n" >&5
-$as_echo "$gl_cv_func_snprintf_directive_n" >&6; }
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5
-$as_echo_n "checking whether snprintf respects a size of 1... " >&6; }
-if ${gl_cv_func_snprintf_size1+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                            # Guess yes on Android.
-           linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
-                            # Guess yes on native Windows.
-           mingw*)          gl_cv_func_snprintf_size1="guessing yes" ;;
-           *)               gl_cv_func_snprintf_size1="guessing yes" ;;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdio.h>
-#if HAVE_SNPRINTF
-# define my_snprintf snprintf
-#else
-# include <stdarg.h>
-static int my_snprintf (char *buf, int size, const char *format, ...)
-{
-  va_list args;
-  int ret;
-  va_start (args, format);
-  ret = vsnprintf (buf, size, format, args);
-  va_end (args);
-  return ret;
-}
-#endif
-int main()
-{
-  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
-  my_snprintf (buf, 1, "%d", 12345);
-  return buf[1] != 'E';
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_snprintf_size1=yes
-else
-  gl_cv_func_snprintf_size1=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5
-$as_echo "$gl_cv_func_snprintf_size1" >&6; }
-
-
-
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vsnprintf respects a zero size as in C99" >&5
-$as_echo_n "checking whether vsnprintf respects a zero size as in C99... " >&6; }
-if ${gl_cv_func_vsnprintf_zerosize_c99+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-                                 # Guess yes on glibc systems.
-           *-gnu* | gnu*)        gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on musl systems.
-           *-musl*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on FreeBSD >= 5.
-           freebsd[1-4].*)       gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
-           freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on Mac OS X >= 10.3.
-           darwin[1-6].*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
-           darwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on Cygwin.
-           cygwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on Solaris >= 2.6.
-           solaris2.[0-5] | solaris2.[0-5].*)
-                                 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
-           solaris*)             gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on AIX >= 4.
-           aix[1-3]*)            gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
-           aix*)                 gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on IRIX >= 6.5.
-           irix6.5)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on NetBSD >= 3.
-           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
-                                 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
-           netbsd*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on BeOS.
-           beos*)                gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on Android.
-           linux*-android*)      gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # Guess yes on native Windows.
-           mingw* | pw*)         gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
-                                 # If we don't know, obey --enable-cross-guesses.
-           *)                    gl_cv_func_vsnprintf_zerosize_c99="$gl_cross_guess_normal";;
-         esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <stdarg.h>
-#include <stdio.h>
-static int my_snprintf (char *buf, int size, const char *format, ...)
-{
-  va_list args;
-  int ret;
-  va_start (args, format);
-  ret = vsnprintf (buf, size, format, args);
-  va_end (args);
-  return ret;
-}
-int main()
-{
-  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
-  my_snprintf (buf, 0, "%d", 12345);
-  return buf[0] != 'D';
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_vsnprintf_zerosize_c99=yes
-else
-  gl_cv_func_vsnprintf_zerosize_c99=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_vsnprintf_zerosize_c99" >&5
-$as_echo "$gl_cv_func_vsnprintf_zerosize_c99" >&6; }
-
-    case "$gl_cv_func_printf_sizes_c99" in
-      *yes)
-        case "$gl_cv_func_printf_long_double" in
-          *yes)
-            case "$gl_cv_func_printf_infinite" in
-              *yes)
-                case "$gl_cv_func_printf_infinite_long_double" in
-                  *yes)
-                    case "$gl_cv_func_printf_directive_a" in
-                      *yes)
-                        case "$gl_cv_func_printf_directive_f" in
-                          *yes)
-                            case "$gl_cv_func_printf_directive_n" in
-                              *yes)
-                                case "$gl_cv_func_printf_directive_ls" in
-                                  *yes)
-                                    case "$gl_cv_func_printf_positions" in
-                                      *yes)
-                                        case "$gl_cv_func_printf_flag_grouping" in
-                                          *yes)
-                                            case "$gl_cv_func_printf_flag_leftadjust" in
-                                              *yes)
-                                                case "$gl_cv_func_printf_flag_zero" in
-                                                  *yes)
-                                                    case "$gl_cv_func_printf_precision" in
-                                                      *yes)
-                                                        case "$gl_cv_func_printf_enomem" in
-                                                          *yes)
-                                                            case "$gl_cv_func_snprintf_truncation_c99" in
-                                                              *yes)
-                                                                case "$gl_cv_func_snprintf_retval_c99" in
-                                                                  *yes)
-                                                                    case "$gl_cv_func_snprintf_directive_n" in
-                                                                      *yes)
-                                                                        case "$gl_cv_func_snprintf_size1" in
-                                                                          *yes)
-                                                                            case "$gl_cv_func_vsnprintf_zerosize_c99" in
-                                                                              *yes)
-                                                                                # vsnprintf exists and is
-                                                                                # already POSIX compliant.
-                                                                                gl_cv_func_vsnprintf_posix=yes
-                                                                                ;;
-                                                                            esac
-                                                                            ;;
-                                                                        esac
-                                                                        ;;
-                                                                    esac
-                                                                    ;;
-                                                                esac
-                                                                ;;
-                                                            esac
-                                                            ;;
-                                                        esac
-                                                        ;;
-                                                    esac
-                                                    ;;
-                                                esac
-                                                ;;
-                                            esac
-                                            ;;
-                                        esac
-                                        ;;
-                                    esac
-                                    ;;
-                                esac
-                                ;;
-                            esac
-                            ;;
-                        esac
-                        ;;
-                    esac
-                    ;;
-                esac
-                ;;
-            esac
-            ;;
-        esac
-        ;;
-    esac
-  fi
-  if test $gl_cv_func_vsnprintf_posix = no; then
-
-
-
-  case "$gl_cv_func_printf_infinite" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-  case "$gl_cv_func_printf_long_double" in
-    *yes)
-      case "$gl_cv_func_printf_infinite_long_double" in
-        *yes)
-          ;;
-        *)
-
-$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
-
-          ;;
-      esac
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_a" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
-
-      for ac_func in nl_langinfo
-do :
-  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
-if test "x$ac_cv_func_nl_langinfo" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_NL_LANGINFO 1
-_ACEOF
-
-fi
-done
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_f" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_ls" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_grouping" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_leftadjust" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_zero" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_precision" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_enomem" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
-
-  if test $ac_cv_func_vasnprintf = yes; then
-
-$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-
-
-
-
-
-
-  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
-if test "x$ac_cv_type_ptrdiff_t" = xyes; then :
-
-else
-
-$as_echo "#define ptrdiff_t long" >>confdefs.h
-
-
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS vsnprintf.$ac_objext"
-
-  if test $ac_cv_func_vsnprintf = yes; then
-    REPLACE_VSNPRINTF=1
-  else
-
-    if test $ac_cv_have_decl_vsnprintf = yes; then
-                        REPLACE_VSNPRINTF=1
-    fi
-  fi
-  :
-
-  fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_cv_func_vsprintf_posix=no
-  case "$gl_cv_func_printf_sizes_c99" in
-    *yes)
-      case "$gl_cv_func_printf_long_double" in
-        *yes)
-          case "$gl_cv_func_printf_infinite" in
-            *yes)
-              case "$gl_cv_func_printf_infinite_long_double" in
-                *yes)
-                  case "$gl_cv_func_printf_directive_a" in
-                    *yes)
-                      case "$gl_cv_func_printf_directive_f" in
-                        *yes)
-                          case "$gl_cv_func_printf_directive_n" in
-                            *yes)
-                              case "$gl_cv_func_printf_directive_ls" in
-                                *yes)
-                                  case "$gl_cv_func_printf_positions" in
-                                    *yes)
-                                      case "$gl_cv_func_printf_flag_grouping" in
-                                        *yes)
-                                          case "$gl_cv_func_printf_flag_leftadjust" in
-                                            *yes)
-                                              case "$gl_cv_func_printf_flag_zero" in
-                                                *yes)
-                                                  case "$gl_cv_func_printf_precision" in
-                                                    *yes)
-                                                      case "$gl_cv_func_printf_enomem" in
-                                                        *yes)
-                                                          # vsprintf exists and is
-                                                          # already POSIX compliant.
-                                                          gl_cv_func_vsprintf_posix=yes
-                                                          ;;
-                                                      esac
-                                                      ;;
-                                                  esac
-                                                  ;;
-                                              esac
-                                              ;;
-                                          esac
-                                          ;;
-                                      esac
-                                      ;;
-                                  esac
-                                  ;;
-                              esac
-                              ;;
-                          esac
-                          ;;
-                      esac
-                      ;;
-                  esac
-                  ;;
-              esac
-              ;;
-          esac
-          ;;
-      esac
-      ;;
-  esac
-  if test $gl_cv_func_vsprintf_posix = no; then
-
-
-
-  case "$gl_cv_func_printf_infinite" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-  case "$gl_cv_func_printf_long_double" in
-    *yes)
-      case "$gl_cv_func_printf_infinite_long_double" in
-        *yes)
-          ;;
-        *)
-
-$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
-
-          ;;
-      esac
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_a" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
-
-      for ac_func in nl_langinfo
-do :
-  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
-if test "x$ac_cv_func_nl_langinfo" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_NL_LANGINFO 1
-_ACEOF
-
-fi
-done
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_f" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_ls" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_grouping" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_leftadjust" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_zero" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_precision" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_enomem" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
-
-  if test $ac_cv_func_vasnprintf = yes; then
-
-$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-
-
-
-
-
-
-  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
-if test "x$ac_cv_type_ptrdiff_t" = xyes; then :
-
-else
-
-$as_echo "#define ptrdiff_t long" >>confdefs.h
-
-
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS vsprintf.$ac_objext"
-
-  REPLACE_VSPRINTF=1
-  :
-
-  fi
-
-
-
-
-
-
-          GNULIB_VSPRINTF_POSIX=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_VSPRINTF_POSIX 1" >>confdefs.h
-
-
-
-
-
-  for ac_func in waitid
-do :
-  ac_fn_c_check_func "$LINENO" "waitid" "ac_cv_func_waitid"
-if test "x$ac_cv_func_waitid" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_WAITID 1
-_ACEOF
-
-fi
-done
-
-
-
-
-  HAVE_WAITPID=1
-  case $host_os in
-    mingw*) HAVE_WAITPID=0 ;;
-  esac
-
-  if test $HAVE_WAITPID = 0; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS waitpid.$ac_objext"
-
-  fi
-
-
-
-
-
-          GNULIB_WAITPID=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_WAITPID 1" >>confdefs.h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_wchar_h='<'wchar.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <wchar.h>" >&5
-$as_echo_n "checking absolute name of <wchar.h>... " >&6; }
-if ${gl_cv_next_wchar_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-             if test $ac_cv_header_wchar_h = yes; then
-
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <wchar.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'wchar.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_wchar_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_wchar_h
-           gl_cv_next_wchar_h='"'$gl_header'"'
-          else
-               gl_cv_next_wchar_h='<'wchar.h'>'
-             fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wchar_h" >&5
-$as_echo "$gl_cv_next_wchar_h" >&6; }
-     fi
-     NEXT_WCHAR_H=$gl_cv_next_wchar_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'wchar.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_wchar_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_WCHAR_H=$gl_next_as_first_directive
-
-
-
-
-  if test $ac_cv_header_wchar_h = yes; then
-    HAVE_WCHAR_H=1
-  else
-    HAVE_WCHAR_H=0
-  fi
-
-
-
-
-
-  if test $gt_cv_c_wint_t = yes; then
-    HAVE_WINT_T=1
-  else
-    HAVE_WINT_T=0
-  fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-  if test $ac_cv_func_iswcntrl = yes; then
-    HAVE_ISWCNTRL=1
-  else
-    HAVE_ISWCNTRL=0
-  fi
-
-
-
-  if test $gt_cv_c_wint_t = yes; then
-    HAVE_WINT_T=1
-  else
-    HAVE_WINT_T=0
-  fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-     if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_wctype_h='<'wctype.h'>'
-     else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <wctype.h>" >&5
-$as_echo_n "checking absolute name of <wctype.h>... " >&6; }
-if ${gl_cv_next_wctype_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-             if test $ac_cv_header_wctype_h = yes; then
-
-
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <wctype.h>
-_ACEOF
-                case "$host_os" in
-    aix*) gl_absname_cpp="$ac_cpp -C" ;;
-    *)    gl_absname_cpp="$ac_cpp" ;;
-  esac
-
-  case "$host_os" in
-    mingw*)
-                                          gl_dirsep_regex='[/\\]'
-      ;;
-    *)
-      gl_dirsep_regex='\/'
-      ;;
-  esac
-      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'wctype.h' \
-                           | sed -e "$gl_make_literal_regex_sed"`
-  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
-      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
-      s|^/[^/]|//&|
-      p
-      q
-    }'
-
-        gl_cv_absolute_wctype_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
-  sed -n "$gl_absolute_header_sed"`
-
-           gl_header=$gl_cv_absolute_wctype_h
-           gl_cv_next_wctype_h='"'$gl_header'"'
-          else
-               gl_cv_next_wctype_h='<'wctype.h'>'
-             fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wctype_h" >&5
-$as_echo "$gl_cv_next_wctype_h" >&6; }
-     fi
-     NEXT_WCTYPE_H=$gl_cv_next_wctype_h
-
-     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'wctype.h'>'
-     else
-       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_wctype_h
-     fi
-     NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H=$gl_next_as_first_directive
-
-
-
-
-  if test $ac_cv_header_wctype_h = yes; then
-    if test $ac_cv_func_iswcntrl = yes; then
-                  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iswcntrl works" >&5
-$as_echo_n "checking whether iswcntrl works... " >&6; }
-if ${gl_cv_func_iswcntrl_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-          if test "$cross_compiling" = yes; then :
-               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-                          #if __GNU_LIBRARY__ == 1
-                          Linux libc5 i18n is broken.
-                          #endif
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_func_iswcntrl_works="guessing yes"
-else
-  gl_cv_func_iswcntrl_works="guessing no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-               /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
-                  included before <wchar.h>.
-                  BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
-                  must be included before <wchar.h>.  */
-               #include <stddef.h>
-               #include <stdio.h>
-               #include <time.h>
-               #include <wchar.h>
-               #include <wctype.h>
-               int main () { return iswprint ('x') == 0; }
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_iswcntrl_works=yes
-else
-  gl_cv_func_iswcntrl_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswcntrl_works" >&5
-$as_echo "$gl_cv_func_iswcntrl_works" >&6; }
-    fi
-    HAVE_WCTYPE_H=1
-  else
-    HAVE_WCTYPE_H=0
-  fi
-
-
-  if test $GNULIB_OVERRIDES_WINT_T = 1; then
-    REPLACE_ISWCNTRL=1
-  else
-    case "$gl_cv_func_iswcntrl_works" in
-      *yes) REPLACE_ISWCNTRL=0 ;;
-      *)    REPLACE_ISWCNTRL=1 ;;
-    esac
-  fi
-
-
-  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
-        :
-  fi
-
-  if test $REPLACE_ISWCNTRL = 1; then
-    REPLACE_TOWLOWER=1
-  else
-    for ac_func in towlower
-do :
-  ac_fn_c_check_func "$LINENO" "towlower" "ac_cv_func_towlower"
-if test "x$ac_cv_func_towlower" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_TOWLOWER 1
-_ACEOF
-
-fi
-done
-
-    if test $ac_cv_func_towlower = yes; then
-      REPLACE_TOWLOWER=0
-    else
-      ac_fn_c_check_decl "$LINENO" "towlower" "ac_cv_have_decl_towlower" "/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
-             included before <wchar.h>.
-             BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
-             must be included before <wchar.h>.  */
-          #include <stddef.h>
-          #include <stdio.h>
-          #include <time.h>
-          #include <wchar.h>
-          #if HAVE_WCTYPE_H
-          # include <wctype.h>
-          #endif
-
-"
-if test "x$ac_cv_have_decl_towlower" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_TOWLOWER $ac_have_decl
-_ACEOF
-
-      if test $ac_cv_have_decl_towlower = yes; then
-                                REPLACE_TOWLOWER=1
-      else
-        REPLACE_TOWLOWER=0
-      fi
-    fi
-  fi
-
-
-  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then
-        :
-  fi
-
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wctype_t" >&5
-$as_echo_n "checking for wctype_t... " >&6; }
-if ${gl_cv_type_wctype_t+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
-               included before <wchar.h>.
-               BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
-               must be included before <wchar.h>.  */
-            #include <stddef.h>
-            #include <stdio.h>
-            #include <time.h>
-            #include <wchar.h>
-            #if HAVE_WCTYPE_H
-            # include <wctype.h>
-            #endif
-            wctype_t a;
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_type_wctype_t=yes
-else
-  gl_cv_type_wctype_t=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctype_t" >&5
-$as_echo "$gl_cv_type_wctype_t" >&6; }
-  if test $gl_cv_type_wctype_t = no; then
-    HAVE_WCTYPE_T=0
-  fi
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wctrans_t" >&5
-$as_echo_n "checking for wctrans_t... " >&6; }
-if ${gl_cv_type_wctrans_t+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
-               included before <wchar.h>.
-               BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
-               must be included before <wchar.h>.  */
-            #include <stddef.h>
-            #include <stdio.h>
-            #include <time.h>
-            #include <wchar.h>
-            #include <wctype.h>
-            wctrans_t a;
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_type_wctrans_t=yes
-else
-  gl_cv_type_wctrans_t=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctrans_t" >&5
-$as_echo "$gl_cv_type_wctrans_t" >&6; }
-  if test $gl_cv_type_wctrans_t = no; then
-    HAVE_WCTRANS_T=0
-  fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  ac_fn_c_check_decl "$LINENO" "wcwidth" "ac_cv_have_decl_wcwidth" "
-/* AIX 3.2.5 declares wcwidth in <string.h>. */
-#include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
-   before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-
-"
-if test "x$ac_cv_have_decl_wcwidth" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_WCWIDTH $ac_have_decl
-_ACEOF
-
-  if test $ac_cv_have_decl_wcwidth != yes; then
-    HAVE_DECL_WCWIDTH=0
-  fi
-
-  if test $ac_cv_func_wcwidth != yes; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wcwidth is a macro" >&5
-$as_echo_n "checking whether wcwidth is a macro... " >&6; }
-if ${gl_cv_func_wcwidth_macro+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <wchar.h>
-#ifdef wcwidth
- wchar_header_defines_wcwidth
-#endif
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "wchar_header_defines_wcwidth" >/dev/null 2>&1; then :
-  gl_cv_func_wcwidth_macro=yes
-else
-  gl_cv_func_wcwidth_macro=no
-fi
-rm -f conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_macro" >&5
-$as_echo "$gl_cv_func_wcwidth_macro" >&6; }
-  fi
-
-  if test $ac_cv_func_wcwidth = yes || test $gl_cv_func_wcwidth_macro = yes; then
-    HAVE_WCWIDTH=1
-                                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wcwidth works reasonably in UTF-8 locales" >&5
-$as_echo_n "checking whether wcwidth works reasonably in UTF-8 locales... " >&6; }
-if ${gl_cv_func_wcwidth_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-        if test "$cross_compiling" = yes; then :
-
-           case "$host_os" in
-                            # Guess yes on glibc systems.
-             *-gnu* | gnu*) gl_cv_func_wcwidth_works="guessing yes";;
-                            # Guess yes on musl systems.
-             *-musl*)       gl_cv_func_wcwidth_works="guessing yes";;
-                            # Guess yes on AIX 7 systems.
-             aix[7-9]*)     gl_cv_func_wcwidth_works="guessing yes";;
-             *)             gl_cv_func_wcwidth_works="$gl_cross_guess_normal";;
-           esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <locale.h>
-/* AIX 3.2.5 declares wcwidth in <string.h>. */
-#include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
-   before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-#if !HAVE_DECL_WCWIDTH
-extern
-# ifdef __cplusplus
-"C"
-# endif
-int wcwidth (int);
-#endif
-int main ()
-{
-  int result = 0;
-  if (setlocale (LC_ALL, "en_US.UTF-8") != NULL)
-    {
-      if (wcwidth (0x0301) > 0)
-        result |= 1;
-      if (wcwidth (0x05B0) > 0)
-        result |= 2;
-      if (wcwidth (0x200B) > 0)
-        result |= 4;
-      if (wcwidth (0xFF1A) == 0)
-        result |= 8;
-      if (wcwidth (0x2202) > 1)
-        result |= 16;
-    }
-  return result;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_wcwidth_works=yes
-else
-  gl_cv_func_wcwidth_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_works" >&5
-$as_echo "$gl_cv_func_wcwidth_works" >&6; }
-    case "$gl_cv_func_wcwidth_works" in
-      *yes) ;;
-      *no) REPLACE_WCWIDTH=1 ;;
-    esac
-  else
-    HAVE_WCWIDTH=0
-  fi
-
-  if test $HAVE_WCWIDTH = 0 || test $REPLACE_WCWIDTH = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS wcwidth.$ac_objext"
-
-
-
-  :
-
-  fi
-
-
-
-
-
-          GNULIB_WCWIDTH=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_WCWIDTH 1" >>confdefs.h
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether use of TIOCGWINSZ requires sys/ioctl.h" >&5
-$as_echo_n "checking whether use of TIOCGWINSZ requires sys/ioctl.h... " >&6; }
-if ${gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h=no
-
-   if test $gl_cv_sys_tiocgwinsz_needs_termios_h = no; then
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-#        include <sys/ioctl.h>
-#        ifdef TIOCGWINSZ
-           yes
-#        endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "yes" >/dev/null 2>&1; then :
-  gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h=yes
-fi
-rm -f conftest*
-
-   fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h" >&5
-$as_echo "$gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h" >&6; }
-  if test $gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h = yes; then
-
-$as_echo "#define GWINSZ_IN_SYS_IOCTL 1" >>confdefs.h
-
-  fi
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether use of TIOCGWINSZ requires termios.h" >&5
-$as_echo_n "checking whether use of TIOCGWINSZ requires termios.h... " >&6; }
-if ${gl_cv_sys_tiocgwinsz_needs_termios_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gl_cv_sys_tiocgwinsz_needs_termios_h=no
-
-   if test $ac_cv_sys_posix_termios = yes; then
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-#      include <termios.h>
-#      ifdef TIOCGWINSZ
-         yes
-#      endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "yes" >/dev/null 2>&1; then :
-  gl_cv_sys_tiocgwinsz_needs_termios_h=yes
-fi
-rm -f conftest*
-
-   fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_tiocgwinsz_needs_termios_h" >&5
-$as_echo "$gl_cv_sys_tiocgwinsz_needs_termios_h" >&6; }
-
-
-
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether use of struct winsize requires sys/ptem.h" >&5
-$as_echo_n "checking whether use of struct winsize requires sys/ptem.h... " >&6; }
-if ${gl_cv_sys_struct_winsize_needs_sys_ptem_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  gl_cv_sys_struct_winsize_needs_sys_ptem_h=yes
-      if test $ac_cv_sys_posix_termios = yes; then
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <termios.h>
-int
-main ()
-{
-struct winsize x;
-            if (sizeof x > 0) return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_sys_struct_winsize_needs_sys_ptem_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      fi
-      if test $gl_cv_sys_struct_winsize_needs_sys_ptem_h = yes; then
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/ptem.h>
-int
-main ()
-{
-struct winsize x;
-            if (sizeof x > 0) return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  gl_cv_sys_struct_winsize_needs_sys_ptem_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_winsize_needs_sys_ptem_h" >&5
-$as_echo "$gl_cv_sys_struct_winsize_needs_sys_ptem_h" >&6; }
-   if test $gl_cv_sys_struct_winsize_needs_sys_ptem_h = yes; then
-
-$as_echo "#define WINSIZE_IN_PTEM 1" >>confdefs.h
-
-   fi
-
-  :
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS xmemdup0.$ac_objext"
-
-
-
-  for ac_header in stdint.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default"
-if test "x$ac_cv_header_stdint_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_STDINT_H 1
-_ACEOF
-
-fi
-
-done
-
-
-
-
-  :
-
-
-  gl_gnulib_enabled_chdir=false
-  gl_gnulib_enabled_43fe87a341d9b4b93c47c3ad819a5239=false
-  gl_gnulib_enabled_fseterr=false
-  gl_gnulib_enabled_fstat=false
-  gl_gnulib_enabled_getdtablesize=false
-  gl_gnulib_enabled_30838f5439487421042f2225bed3af76=false
-  gl_gnulib_enabled_3f0e593033d1fc2c127581960f641b66=false
-  gl_gnulib_enabled_ldexp=false
-  gl_gnulib_enabled_21ee726a3540c09237a8e70c0baf7467=false
-  gl_gnulib_enabled_2049e887c7e5308faad27b3f894bb8c9=false
-  gl_gnulib_enabled_lstat=false
-  gl_gnulib_enabled_malloca=false
-  gl_gnulib_enabled_332607f759618fb73dfc3076748afea7=false
-  gl_gnulib_enabled_rawmemchr=false
-  gl_gnulib_enabled_rmdir=false
-  gl_gnulib_enabled_9bc5f216d57e231e4834049d67d0db62=false
-  gl_gnulib_enabled_cdeb0f2aaf9d280baa6526bfa1b07f70=false
-  gl_gnulib_enabled_stat=false
-  gl_gnulib_enabled_0137e3d3638b33e5819d132d0b23165c=false
-  gl_gnulib_enabled_strchrnul=false
-  gl_gnulib_enabled_dbb57f49352be8fb86869629a254fb72=false
-  gl_gnulib_enabled_1f32594a85e6221ba15f884daeee8c2a=false
-  gl_gnulib_enabled_strnlen=false
-  gl_gnulib_enabled_sys_stat=false
-  gl_gnulib_enabled_ed5616be3593d355b981ffab56b9f37b=false
-  gl_gnulib_enabled_503a4cb75d69c787103d0aa2ab7d8440=false
-  gl_gnulib_enabled_68a4501daeca58988392c7e60b4917ab=false
-  gl_gnulib_enabled_f0efff84a70f4afba30902bb8ffe9354=false
-  gl_gnulib_enabled_8bb827fe37eaccf1b97feb0c87bc92ef=false
-  gl_gnulib_enabled_48b2271240803e4879464b755748a89d=false
-  func_gl_gnulib_m4code_chdir ()
-  {
-    if ! $gl_gnulib_enabled_chdir; then
-
-
-
-
-
-          GNULIB_CHDIR=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_CHDIR 1" >>confdefs.h
-
-
-
-      gl_gnulib_enabled_chdir=true
-    fi
-  }
-  func_gl_gnulib_m4code_43fe87a341d9b4b93c47c3ad819a5239 ()
-  {
-    if ! $gl_gnulib_enabled_43fe87a341d9b4b93c47c3ad819a5239; then
-      gl_gnulib_enabled_43fe87a341d9b4b93c47c3ad819a5239=true
-    fi
-  }
-  func_gl_gnulib_m4code_fseterr ()
-  {
-    if ! $gl_gnulib_enabled_fseterr; then
-
-
-
-      if test $ac_cv_func___fseterr = no; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS fseterr.$ac_objext"
-
-      fi
-      gl_gnulib_enabled_fseterr=true
-    fi
-  }
-  func_gl_gnulib_m4code_fstat ()
-  {
-    if ! $gl_gnulib_enabled_fstat; then
-
-
-
-
-  case "$host_os" in
-    mingw* | solaris*)
-                        REPLACE_FSTAT=1
-      ;;
-  esac
-
-
-
-      if test $REPLACE_FSTAT = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS fstat.$ac_objext"
-
-        case "$host_os" in
-          mingw*)
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS stat-w32.$ac_objext"
-
-            ;;
-        esac
-
-
-  :
-
-      fi
-
-
-
-
-
-          GNULIB_FSTAT=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_FSTAT 1" >>confdefs.h
-
-
-
-      gl_gnulib_enabled_fstat=true
-      if test $REPLACE_FSTAT = 1; then
-        func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c
-      fi
-      func_gl_gnulib_m4code_sys_stat
-    fi
-  }
-  func_gl_gnulib_m4code_getdtablesize ()
-  {
-    if ! $gl_gnulib_enabled_getdtablesize; then
-
-
-
-
-
-  if test $ac_cv_func_getdtablesize = yes &&
-     test $ac_cv_have_decl_getdtablesize = yes; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getdtablesize works" >&5
-$as_echo_n "checking whether getdtablesize works... " >&6; }
-if ${gl_cv_func_getdtablesize_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-                                                   case "$host_os" in
-         vms*) gl_cv_func_getdtablesize_works="no (limitation)" ;;
-         *)
-                                                       if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                cygwin*) # on cygwin 1.5.25, getdtablesize() automatically grows
-                  gl_cv_func_getdtablesize_works="guessing no" ;;
-                *) gl_cv_func_getdtablesize_works="guessing yes" ;;
-              esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-             #include <unistd.h>
-int
-main ()
-{
-int size = getdtablesize();
-                if (dup2 (0, getdtablesize()) != -1)
-                  return 1;
-                if (size != getdtablesize())
-                  return 2;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_getdtablesize_works=yes
-else
-  gl_cv_func_getdtablesize_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-           ;;
-       esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getdtablesize_works" >&5
-$as_echo "$gl_cv_func_getdtablesize_works" >&6; }
-    case "$gl_cv_func_getdtablesize_works" in
-      *yes | "no (limitation)") ;;
-      *) REPLACE_GETDTABLESIZE=1 ;;
-    esac
-  else
-    HAVE_GETDTABLESIZE=0
-  fi
-
-      if test $HAVE_GETDTABLESIZE = 0 || test $REPLACE_GETDTABLESIZE = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS getdtablesize.$ac_objext"
-
-        :
-      fi
-
-
-
-
-
-          GNULIB_GETDTABLESIZE=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_GETDTABLESIZE 1" >>confdefs.h
-
-
-
-      gl_gnulib_enabled_getdtablesize=true
-    fi
-  }
-  func_gl_gnulib_m4code_30838f5439487421042f2225bed3af76 ()
-  {
-    if ! $gl_gnulib_enabled_30838f5439487421042f2225bed3af76; then
-      gl_gnulib_enabled_30838f5439487421042f2225bed3af76=true
-    fi
-  }
-  func_gl_gnulib_m4code_3f0e593033d1fc2c127581960f641b66 ()
-  {
-    if ! $gl_gnulib_enabled_3f0e593033d1fc2c127581960f641b66; then
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used without linking with libm" >&5
-$as_echo_n "checking whether isnan(float) can be used without linking with libm... " >&6; }
-if ${gl_cv_func_isnanf_no_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  if test -n "$ERRNO_H"; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for EMULTIHOP value" >&5
+printf %s "checking for EMULTIHOP value... " >&6; }
+if test ${gl_cv_header_errno_h_EMULTIHOP+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <math.h>
-             #if __GNUC__ >= 4
-             # undef isnanf
-             # define isnanf(x) __builtin_isnanf ((float)(x))
-             #elif defined isnan
-             # undef isnanf
-             # define isnanf(x) isnan ((float)(x))
-             #endif
-             float x;
+
+#include <errno.h>
+#ifdef EMULTIHOP
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1
+then :
+  gl_cv_header_errno_h_EMULTIHOP=yes
+else $as_nop
+  gl_cv_header_errno_h_EMULTIHOP=no
+fi
+rm -rf conftest*
+
+      if test $gl_cv_header_errno_h_EMULTIHOP = no; then
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef EMULTIHOP
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1
+then :
+  gl_cv_header_errno_h_EMULTIHOP=hidden
+fi
+rm -rf conftest*
+
+        if test $gl_cv_header_errno_h_EMULTIHOP = hidden; then
+                              if ac_fn_c_compute_int "$LINENO" "EMULTIHOP" "gl_cv_header_errno_h_EMULTIHOP"        "
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+/* The following two lines are a workaround against an autoconf-2.52 bug.  */
+#include <stdio.h>
+#include <stdlib.h>
+"
+then :
+
+fi
+
+        fi
+      fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EMULTIHOP" >&5
+printf "%s\n" "$gl_cv_header_errno_h_EMULTIHOP" >&6; }
+    case $gl_cv_header_errno_h_EMULTIHOP in
+      yes | no)
+        EMULTIHOP_HIDDEN=0; EMULTIHOP_VALUE=
+        ;;
+      *)
+        EMULTIHOP_HIDDEN=1; EMULTIHOP_VALUE="$gl_cv_header_errno_h_EMULTIHOP"
+        ;;
+    esac
+
+
+  fi
+
+
+  if test -n "$ERRNO_H"; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ENOLINK value" >&5
+printf %s "checking for ENOLINK value... " >&6; }
+if test ${gl_cv_header_errno_h_ENOLINK+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <errno.h>
+#ifdef ENOLINK
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1
+then :
+  gl_cv_header_errno_h_ENOLINK=yes
+else $as_nop
+  gl_cv_header_errno_h_ENOLINK=no
+fi
+rm -rf conftest*
+
+      if test $gl_cv_header_errno_h_ENOLINK = no; then
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef ENOLINK
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1
+then :
+  gl_cv_header_errno_h_ENOLINK=hidden
+fi
+rm -rf conftest*
+
+        if test $gl_cv_header_errno_h_ENOLINK = hidden; then
+                              if ac_fn_c_compute_int "$LINENO" "ENOLINK" "gl_cv_header_errno_h_ENOLINK"        "
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+/* The following two lines are a workaround against an autoconf-2.52 bug.  */
+#include <stdio.h>
+#include <stdlib.h>
+"
+then :
+
+fi
+
+        fi
+      fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_ENOLINK" >&5
+printf "%s\n" "$gl_cv_header_errno_h_ENOLINK" >&6; }
+    case $gl_cv_header_errno_h_ENOLINK in
+      yes | no)
+        ENOLINK_HIDDEN=0; ENOLINK_VALUE=
+        ;;
+      *)
+        ENOLINK_HIDDEN=1; ENOLINK_VALUE="$gl_cv_header_errno_h_ENOLINK"
+        ;;
+    esac
+
+
+  fi
+
+
+  if test -n "$ERRNO_H"; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for EOVERFLOW value" >&5
+printf %s "checking for EOVERFLOW value... " >&6; }
+if test ${gl_cv_header_errno_h_EOVERFLOW+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <errno.h>
+#ifdef EOVERFLOW
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1
+then :
+  gl_cv_header_errno_h_EOVERFLOW=yes
+else $as_nop
+  gl_cv_header_errno_h_EOVERFLOW=no
+fi
+rm -rf conftest*
+
+      if test $gl_cv_header_errno_h_EOVERFLOW = no; then
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef EOVERFLOW
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1
+then :
+  gl_cv_header_errno_h_EOVERFLOW=hidden
+fi
+rm -rf conftest*
+
+        if test $gl_cv_header_errno_h_EOVERFLOW = hidden; then
+                              if ac_fn_c_compute_int "$LINENO" "EOVERFLOW" "gl_cv_header_errno_h_EOVERFLOW"        "
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+/* The following two lines are a workaround against an autoconf-2.52 bug.  */
+#include <stdio.h>
+#include <stdlib.h>
+"
+then :
+
+fi
+
+        fi
+      fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EOVERFLOW" >&5
+printf "%s\n" "$gl_cv_header_errno_h_EOVERFLOW" >&6; }
+    case $gl_cv_header_errno_h_EOVERFLOW in
+      yes | no)
+        EOVERFLOW_HIDDEN=0; EOVERFLOW_VALUE=
+        ;;
+      *)
+        EOVERFLOW_HIDDEN=1; EOVERFLOW_VALUE="$gl_cv_header_errno_h_EOVERFLOW"
+        ;;
+    esac
+
+
+  fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5
+printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; }
+if test ${ac_cv_c_undeclared_builtin_options+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_save_CFLAGS=$CFLAGS
+   ac_cv_c_undeclared_builtin_options='cannot detect'
+   for ac_arg in '' -fno-builtin; do
+     CFLAGS="$ac_save_CFLAGS $ac_arg"
+     # This test program should *not* compile successfully.
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
 int
-main ()
+main (void)
 {
-return isnanf (x);
+(void) strchr;
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_isnanf_no_libm=yes
-else
-  gl_cv_func_isnanf_no_libm=no
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+  # This test program should compile successfully.
+        # No library function is consistently available on
+        # freestanding implementations, so test against a dummy
+        # declaration.  Include always-available headers on the
+        # off chance that they somehow elicit warnings.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <float.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stddef.h>
+extern void ac_decl (int, char *);
+
+int
+main (void)
+{
+(void) ac_decl (0, (char *) 0);
+  (void) ac_decl;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  if test x"$ac_arg" = x
+then :
+  ac_cv_c_undeclared_builtin_options='none needed'
+else $as_nop
+  ac_cv_c_undeclared_builtin_options=$ac_arg
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
+          break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+    done
+    CFLAGS=$ac_save_CFLAGS
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_no_libm" >&5
-$as_echo "$gl_cv_func_isnanf_no_libm" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5
+printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; }
+  case $ac_cv_c_undeclared_builtin_options in #(
+  'cannot detect') :
+    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot make $CC report undeclared builtins
+See \`config.log' for more details" "$LINENO" 5; } ;; #(
+  'none needed') :
+    ac_c_undeclared_builtin_options='' ;; #(
+  *) :
+    ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;;
+esac
 
-  if test $gl_cv_func_isnanf_no_libm = yes; then
+ac_fn_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_strerror_r" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_STRERROR_R $ac_have_decl" >>confdefs.h
+
+
+if test $ac_cv_have_decl_strerror_r = yes; then
+  # For backward compatibility's sake, define HAVE_STRERROR_R.
+  # (We used to run AC_CHECK_FUNCS_ONCE for strerror_r, as well
+  # as AC_CHECK_DECLS_ONCE.)
+
+printf "%s\n" "#define HAVE_STRERROR_R 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5
+printf %s "checking whether strerror_r returns char *... " >&6; }
+if test ${ac_cv_func_strerror_r_char_p+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+    ac_cv_func_strerror_r_char_p=no
+    if test $ac_cv_have_decl_strerror_r = yes; then
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+int
+main (void)
+{
+
+	  char buf[100];
+	  char x = *strerror_r (0, buf, sizeof buf);
+	  char *p = strerror_r (0, buf, sizeof buf);
+	  return !p || x;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_func_strerror_r_char_p=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+    fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_char_p" >&5
+printf "%s\n" "$ac_cv_func_strerror_r_char_p" >&6; }
+if test $ac_cv_func_strerror_r_char_p = yes; then
+
+printf "%s\n" "#define STRERROR_R_CHAR_P 1" >>confdefs.h
+
+fi
+
+
+  XGETTEXT_EXTRA_OPTIONS=
+
+ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default"
+if test "x$ac_cv_type_mode_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define mode_t int" >>confdefs.h
+
+fi
 
 
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) works" >&5
-$as_echo_n "checking whether isnan(float) works... " >&6; }
-if ${gl_cv_func_isnanf_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
 
-      if test "$cross_compiling" = yes; then :
+
+  ac_fn_c_check_type "$LINENO" "sig_atomic_t" "ac_cv_type_sig_atomic_t" "#include <signal.h>
+"
+if test "x$ac_cv_type_sig_atomic_t" = xyes
+then :
+
+printf "%s\n" "#define HAVE_SIG_ATOMIC_T 1" >>confdefs.h
+
+
+else $as_nop
+
+printf "%s\n" "#define sig_atomic_t int" >>confdefs.h
+
+fi
+
+
+
+    HAVE_FCNTL=1;
+  HAVE_OPENAT=1;
+  REPLACE_CREAT=0;
+  REPLACE_FCNTL=0;
+  REPLACE_OPEN=0;
+  REPLACE_OPENAT=0;
+
+
+
+
+  GL_GNULIB_CREAT=0
+
+
+
+  GL_GNULIB_FCNTL=0
+
+
+
+  GL_GNULIB_NONBLOCKING=0
+
+
+
+  GL_GNULIB_OPEN=0
+
+
+
+  GL_GNULIB_OPENAT=0
+
+
+
+  GL_GNULIB_MDA_CREAT=1
+
+
+
+  GL_GNULIB_MDA_OPEN=1
+
+
+
+
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working fcntl.h" >&5
+printf %s "checking for working fcntl.h... " >&6; }
+if test ${gl_cv_header_working_fcntl_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
   case "$host_os" in
-           irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;;
-           mingw*) # Guess yes on mingw, no on MSVC.
-             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+                  # Guess 'no' on native Windows.
+          mingw*) gl_cv_header_working_fcntl_h='no' ;;
+          *)      gl_cv_header_working_fcntl_h=cross-compiling ;;
+        esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+           #include <sys/stat.h>
+           #if HAVE_UNISTD_H
+           # include <unistd.h>
+           #else /* on Windows with MSVC */
+           # include <io.h>
+           # include <stdlib.h>
+           # defined sleep(n) _sleep ((n) * 1000)
+           #endif
+           #include <fcntl.h>
+
+
+$gl_mda_defines
+
+           #ifndef O_NOATIME
+            #define O_NOATIME 0
+           #endif
+           #ifndef O_NOFOLLOW
+            #define O_NOFOLLOW 0
+           #endif
+           static int const constants[] =
+            {
+              O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND,
+              O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
+            };
+
+int
+main (void)
+{
+
+            int result = !constants;
+            #if HAVE_SYMLINK
+            {
+              static char const sym[] = "conftest.sym";
+              if (symlink ("/dev/null", sym) != 0)
+                result |= 2;
+              else
+                {
+                  int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0);
+                  if (fd >= 0)
+                    {
+                      close (fd);
+                      result |= 4;
+                    }
+                }
+              if (unlink (sym) != 0 || symlink (".", sym) != 0)
+                result |= 2;
+              else
+                {
+                  int fd = open (sym, O_RDONLY | O_NOFOLLOW);
+                  if (fd >= 0)
+                    {
+                      close (fd);
+                      result |= 4;
+                    }
+                }
+              unlink (sym);
+            }
+            #endif
+            {
+              static char const file[] = "confdefs.h";
+              int fd = open (file, O_RDONLY | O_NOATIME);
+              if (fd < 0)
+                result |= 8;
+              else
+                {
+                  struct stat st0;
+                  if (fstat (fd, &st0) != 0)
+                    result |= 16;
+                  else
+                    {
+                      char c;
+                      sleep (1);
+                      if (read (fd, &c, 1) != 1)
+                        result |= 24;
+                      else
+                        {
+                          if (close (fd) != 0)
+                            result |= 32;
+                          else
+                            {
+                              struct stat st1;
+                              if (stat (file, &st1) != 0)
+                                result |= 40;
+                              else
+                                if (st0.st_atime != st1.st_atime)
+                                  result |= 64;
+                            }
+                        }
+                    }
+                }
+            }
+            return result;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_header_working_fcntl_h=yes
+else $as_nop
+  case $? in #(
+        4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
+        64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
+        68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
+         *) gl_cv_header_working_fcntl_h='no';;
+        esac
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_fcntl_h" >&5
+printf "%s\n" "$gl_cv_header_working_fcntl_h" >&6; }
+
+  case $gl_cv_header_working_fcntl_h in #(
+  *O_NOATIME* | no | cross-compiling) ac_val=0;; #(
+  *) ac_val=1;;
+  esac
+
+printf "%s\n" "#define HAVE_WORKING_O_NOATIME $ac_val" >>confdefs.h
+
+
+  case $gl_cv_header_working_fcntl_h in #(
+  *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
+  *) ac_val=1;;
+  esac
+
+printf "%s\n" "#define HAVE_WORKING_O_NOFOLLOW $ac_val" >>confdefs.h
+
+
+
+  ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default
+"
+if test "x$ac_cv_type_pid_t" = xyes
+then :
+
+else $as_nop
+                                          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-#ifdef __MINGW32__
+          #if defined _WIN64 && !defined __CYGWIN__
+          LLP64
+          #endif
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_pid_type='int'
+else $as_nop
+  ac_pid_type='__int64'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+printf "%s\n" "#define pid_t $ac_pid_type" >>confdefs.h
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_fcntl_h='<'fcntl.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <fcntl.h>" >&5
+printf %s "checking absolute name of <fcntl.h>... " >&6; }
+if test ${gl_cv_next_fcntl_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <fcntl.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'fcntl.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_fcntl_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_fcntl_h
+           gl_cv_next_fcntl_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_fcntl_h" >&5
+printf "%s\n" "$gl_cv_next_fcntl_h" >&6; }
+     fi
+     NEXT_FCNTL_H=$gl_cv_next_fcntl_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'fcntl.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_fcntl_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_FCNTL_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  HAVE_MBSLEN=0;
+    HAVE_EXPLICIT_BZERO=1;
+  HAVE_FFSL=1;
+  HAVE_FFSLL=1;
+  HAVE_DECL_MEMMEM=1;
+  HAVE_MEMPCPY=1;
+  HAVE_DECL_MEMRCHR=1;
+  HAVE_RAWMEMCHR=1;
+  HAVE_STPCPY=1;
+  HAVE_STPNCPY=1;
+  HAVE_STRCHRNUL=1;
+  HAVE_DECL_STRDUP=1;
+  HAVE_DECL_STRNDUP=1;
+  HAVE_DECL_STRNLEN=1;
+  HAVE_STRPBRK=1;
+  HAVE_STRSEP=1;
+  HAVE_STRCASESTR=1;
+  HAVE_DECL_STRTOK_R=1;
+  HAVE_DECL_STRERROR_R=1;
+  HAVE_STRERRORNAME_NP=1;
+  HAVE_SIGABBREV_NP=1;
+  HAVE_SIGDESCR_NP=1;
+  HAVE_DECL_STRSIGNAL=1;
+  HAVE_STRVERSCMP=1;
+  REPLACE_FFSLL=0;
+  REPLACE_MEMCHR=0;
+  REPLACE_MEMMEM=0;
+  REPLACE_STPNCPY=0;
+  REPLACE_STRCHRNUL=0;
+  REPLACE_STRDUP=0;
+  REPLACE_STRNCAT=0;
+  REPLACE_STRNDUP=0;
+  REPLACE_STRNLEN=0;
+  REPLACE_STRSTR=0;
+  REPLACE_STRCASESTR=0;
+  REPLACE_STRTOK_R=0;
+  REPLACE_STRERROR=0;
+  REPLACE_STRERROR_R=0;
+  REPLACE_STRERRORNAME_NP=0;
+  REPLACE_STRSIGNAL=0;
+  UNDEFINE_STRTOK_R=0;
+
+
+
+
+  GL_GNULIB_EXPLICIT_BZERO=0
+
+
+
+  GL_GNULIB_FFSL=0
+
+
+
+  GL_GNULIB_FFSLL=0
+
+
+
+  GL_GNULIB_MEMCHR=0
+
+
+
+  GL_GNULIB_MEMMEM=0
+
+
+
+  GL_GNULIB_MEMPCPY=0
+
+
+
+  GL_GNULIB_MEMRCHR=0
+
+
+
+  GL_GNULIB_RAWMEMCHR=0
+
+
+
+  GL_GNULIB_STPCPY=0
+
+
+
+  GL_GNULIB_STPNCPY=0
+
+
+
+  GL_GNULIB_STRCHRNUL=0
+
+
+
+  GL_GNULIB_STRDUP=0
+
+
+
+  GL_GNULIB_STRNCAT=0
+
+
+
+  GL_GNULIB_STRNDUP=0
+
+
+
+  GL_GNULIB_STRNLEN=0
+
+
+
+  GL_GNULIB_STRPBRK=0
+
+
+
+  GL_GNULIB_STRSEP=0
+
+
+
+  GL_GNULIB_STRSTR=0
+
+
+
+  GL_GNULIB_STRCASESTR=0
+
+
+
+  GL_GNULIB_STRTOK_R=0
+
+
+
+  GL_GNULIB_MBSLEN=0
+
+
+
+  GL_GNULIB_MBSNLEN=0
+
+
+
+  GL_GNULIB_MBSCHR=0
+
+
+
+  GL_GNULIB_MBSRCHR=0
+
+
+
+  GL_GNULIB_MBSSTR=0
+
+
+
+  GL_GNULIB_MBSCASECMP=0
+
+
+
+  GL_GNULIB_MBSNCASECMP=0
+
+
+
+  GL_GNULIB_MBSPCASECMP=0
+
+
+
+  GL_GNULIB_MBSCASESTR=0
+
+
+
+  GL_GNULIB_MBSCSPN=0
+
+
+
+  GL_GNULIB_MBSPBRK=0
+
+
+
+  GL_GNULIB_MBSSPN=0
+
+
+
+  GL_GNULIB_MBSSEP=0
+
+
+
+  GL_GNULIB_MBSTOK_R=0
+
+
+
+  GL_GNULIB_STRERROR=0
+
+
+
+  GL_GNULIB_STRERROR_R=0
+
+
+
+  GL_GNULIB_STRERRORNAME_NP=0
+
+
+
+  GL_GNULIB_SIGABBREV_NP=0
+
+
+
+  GL_GNULIB_SIGDESCR_NP=0
+
+
+
+  GL_GNULIB_STRSIGNAL=0
+
+
+
+  GL_GNULIB_STRVERSCMP=0
+
+
+
+  GL_GNULIB_MDA_MEMCCPY=1
+
+
+
+  GL_GNULIB_MDA_STRDUP=1
+
+
+
+
+  ac_fn_c_check_func "$LINENO" "eaccess" "ac_cv_func_eaccess"
+if test "x$ac_cv_func_eaccess" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define eaccess access" >>confdefs.h
+
+fi
+
+
+
+    HAVE_DECL_FCLOSEALL=1;
+  HAVE_DECL_FPURGE=1;
+  HAVE_DECL_FSEEKO=1;
+  HAVE_DECL_FTELLO=1;
+  HAVE_DECL_GETDELIM=1;
+  HAVE_DECL_GETLINE=1;
+  HAVE_DECL_OBSTACK_PRINTF=1;
+  HAVE_DECL_SNPRINTF=1;
+  HAVE_DECL_VSNPRINTF=1;
+  HAVE_DPRINTF=1;
+  HAVE_FSEEKO=1;
+  HAVE_FTELLO=1;
+  HAVE_PCLOSE=1;
+  HAVE_POPEN=1;
+  HAVE_RENAMEAT=1;
+  HAVE_VASPRINTF=1;
+  HAVE_VDPRINTF=1;
+  REPLACE_DPRINTF=0;
+  REPLACE_FCLOSE=0;
+  REPLACE_FDOPEN=0;
+  REPLACE_FFLUSH=0;
+  REPLACE_FOPEN=0;
+  REPLACE_FPRINTF=0;
+  REPLACE_FPURGE=0;
+  REPLACE_FREOPEN=0;
+  REPLACE_FSEEK=0;
+  REPLACE_FSEEKO=0;
+  REPLACE_FTELL=0;
+  REPLACE_FTELLO=0;
+  REPLACE_GETDELIM=0;
+  REPLACE_GETLINE=0;
+  REPLACE_OBSTACK_PRINTF=0;
+  REPLACE_PERROR=0;
+  REPLACE_POPEN=0;
+  REPLACE_PRINTF=0;
+  REPLACE_REMOVE=0;
+  REPLACE_RENAME=0;
+  REPLACE_RENAMEAT=0;
+  REPLACE_SNPRINTF=0;
+  REPLACE_SPRINTF=0;
+  REPLACE_STDIO_READ_FUNCS=0;
+  REPLACE_STDIO_WRITE_FUNCS=0;
+  REPLACE_TMPFILE=0;
+  REPLACE_VASPRINTF=0;
+  REPLACE_VDPRINTF=0;
+  REPLACE_VFPRINTF=0;
+  REPLACE_VPRINTF=0;
+  REPLACE_VSNPRINTF=0;
+  REPLACE_VSPRINTF=0;
+
+
+
+  GL_GNULIB_DPRINTF=0
+
+
+
+  GL_GNULIB_FCLOSE=0
+
+
+
+  GL_GNULIB_FDOPEN=0
+
+
+
+  GL_GNULIB_FFLUSH=0
+
+
+
+  GL_GNULIB_FGETC=0
+
+
+
+  GL_GNULIB_FGETS=0
+
+
+
+  GL_GNULIB_FOPEN=0
+
+
+
+  GL_GNULIB_FPRINTF=0
+
+
+
+  GL_GNULIB_FPRINTF_POSIX=0
+
+
+
+  GL_GNULIB_FPURGE=0
+
+
+
+  GL_GNULIB_FPUTC=0
+
+
+
+  GL_GNULIB_FPUTS=0
+
+
+
+  GL_GNULIB_FREAD=0
+
+
+
+  GL_GNULIB_FREOPEN=0
+
+
+
+  GL_GNULIB_FSCANF=0
+
+
+
+  GL_GNULIB_FSEEK=0
+
+
+
+  GL_GNULIB_FSEEKO=0
+
+
+
+  GL_GNULIB_FTELL=0
+
+
+
+  GL_GNULIB_FTELLO=0
+
+
+
+  GL_GNULIB_FWRITE=0
+
+
+
+  GL_GNULIB_GETC=0
+
+
+
+  GL_GNULIB_GETCHAR=0
+
+
+
+  GL_GNULIB_GETDELIM=0
+
+
+
+  GL_GNULIB_GETLINE=0
+
+
+
+  GL_GNULIB_OBSTACK_PRINTF=0
+
+
+
+  GL_GNULIB_OBSTACK_PRINTF_POSIX=0
+
+
+
+  GL_GNULIB_PCLOSE=0
+
+
+
+  GL_GNULIB_PERROR=0
+
+
+
+  GL_GNULIB_POPEN=0
+
+
+
+  GL_GNULIB_PRINTF=0
+
+
+
+  GL_GNULIB_PRINTF_POSIX=0
+
+
+
+  GL_GNULIB_PUTC=0
+
+
+
+  GL_GNULIB_PUTCHAR=0
+
+
+
+  GL_GNULIB_PUTS=0
+
+
+
+  GL_GNULIB_REMOVE=0
+
+
+
+  GL_GNULIB_RENAME=0
+
+
+
+  GL_GNULIB_RENAMEAT=0
+
+
+
+  GL_GNULIB_SCANF=0
+
+
+
+  GL_GNULIB_SNPRINTF=0
+
+
+
+  GL_GNULIB_SPRINTF_POSIX=0
+
+
+
+  GL_GNULIB_STDIO_H_NONBLOCKING=0
+
+
+
+  GL_GNULIB_STDIO_H_SIGPIPE=0
+
+
+
+  GL_GNULIB_TMPFILE=0
+
+
+
+  GL_GNULIB_VASPRINTF=0
+
+
+
+  GL_GNULIB_VFSCANF=0
+
+
+
+  GL_GNULIB_VSCANF=0
+
+
+
+  GL_GNULIB_VDPRINTF=0
+
+
+
+  GL_GNULIB_VFPRINTF=0
+
+
+
+  GL_GNULIB_VFPRINTF_POSIX=0
+
+
+
+  GL_GNULIB_VPRINTF=0
+
+
+
+  GL_GNULIB_VPRINTF_POSIX=0
+
+
+
+  GL_GNULIB_VSNPRINTF=0
+
+
+
+  GL_GNULIB_VSPRINTF_POSIX=0
+
+
+
+  GL_GNULIB_MDA_FCLOSEALL=1
+
+
+
+  GL_GNULIB_MDA_FDOPEN=1
+
+
+
+  GL_GNULIB_MDA_FILENO=1
+
+
+
+  GL_GNULIB_MDA_GETW=1
+
+
+
+  GL_GNULIB_MDA_PUTW=1
+
+
+
+  GL_GNULIB_MDA_TEMPNAM=1
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdint.h" >&5
+printf %s "checking for stdint.h... " >&6; }
+if test ${gl_cv_header_stdint_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+            #include <stdint.h>
+int
+main (void)
+{
+uintmax_t i = (uintmax_t) -1; return !i;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_header_stdint_h=yes
+else $as_nop
+  gl_cv_header_stdint_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_h" >&5
+printf "%s\n" "$gl_cv_header_stdint_h" >&6; }
+  if test $gl_cv_header_stdint_h = yes; then
+
+printf "%s\n" "#define HAVE_STDINT_H_WITH_UINTMAX 1" >>confdefs.h
+
+  fi
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5
+printf %s "checking for inttypes.h... " >&6; }
+if test ${gl_cv_header_inttypes_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <sys/types.h>
+#include <inttypes.h>
+
+int
+main (void)
+{
+uintmax_t i = (uintmax_t) -1; return !i;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_header_inttypes_h=yes
+else $as_nop
+  gl_cv_header_inttypes_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_inttypes_h" >&5
+printf "%s\n" "$gl_cv_header_inttypes_h" >&6; }
+  if test $gl_cv_header_inttypes_h = yes; then
+
+printf "%s\n" "#define HAVE_INTTYPES_H_WITH_UINTMAX 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports size specifiers as in C99" >&5
+printf %s "checking whether printf supports size specifiers as in C99... " >&6; }
+if test ${gl_cv_func_printf_sizes_c99+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+                                 # Guess yes on glibc systems.
+           *-gnu* | gnu*)        gl_cv_func_printf_sizes_c99="guessing yes";;
+                                 # Guess yes on musl systems.
+           *-musl*)              gl_cv_func_printf_sizes_c99="guessing yes";;
+                                 # Guess yes on FreeBSD >= 5.
+           freebsd[1-4].*)       gl_cv_func_printf_sizes_c99="guessing no";;
+           freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
+           midnightbsd*)         gl_cv_func_printf_sizes_c99="guessing yes";;
+                                 # Guess yes on Mac OS X >= 10.3.
+           darwin[1-6].*)        gl_cv_func_printf_sizes_c99="guessing no";;
+           darwin*)              gl_cv_func_printf_sizes_c99="guessing yes";;
+                                 # Guess yes on OpenBSD >= 3.9.
+           openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+                                 gl_cv_func_printf_sizes_c99="guessing no";;
+           openbsd*)             gl_cv_func_printf_sizes_c99="guessing yes";;
+                                 # Guess yes on Solaris >= 2.10.
+           solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
+           solaris*)             gl_cv_func_printf_sizes_c99="guessing no";;
+                                 # Guess yes on NetBSD >= 3.
+           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+                                 gl_cv_func_printf_sizes_c99="guessing no";;
+           netbsd*)              gl_cv_func_printf_sizes_c99="guessing yes";;
+                                 # Guess yes on Android.
+           linux*-android*)      gl_cv_func_printf_sizes_c99="guessing yes";;
+                                 # Guess yes on MSVC, no on mingw.
+           mingw*)               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef _MSC_VER
  Known
 #endif
 
 _ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Known" >/dev/null 2>&1; then :
-  gl_cv_func_isnanf_works="guessing yes"
-else
-  gl_cv_func_isnanf_works="guessing no"
+  $EGREP "Known" >/dev/null 2>&1
+then :
+  gl_cv_func_printf_sizes_c99="guessing yes"
+else $as_nop
+  gl_cv_func_printf_sizes_c99="guessing no"
 fi
-rm -f conftest*
+rm -rf conftest*
 
-             ;;
-           *) gl_cv_func_isnanf_works="guessing yes" ;;
+                                 ;;
+                                 # If we don't know, obey --enable-cross-guesses.
+           *)                    gl_cv_func_printf_sizes_c99="$gl_cross_guess_normal";;
          esac
 
-else
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-#include <math.h>
-#if __GNUC__ >= 4
-# undef isnanf
-# define isnanf(x) __builtin_isnanf ((float)(x))
-#elif defined isnan
-# undef isnanf
-# define isnanf(x) isnan ((float)(x))
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+# include <stdint.h>
 #endif
-/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0.  */
-#ifdef __DECC
-static float
-NaN ()
-{
-  static float zero = 0.0f;
-  return zero / zero;
-}
-#else
-# define NaN() (0.0f / 0.0f)
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+# include <inttypes.h>
 #endif
-#define NWORDS \
-  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-typedef union { unsigned int word[NWORDS]; float value; } memory_float;
-int main()
+static char buf[100];
+int main ()
 {
   int result = 0;
-
-  if (isnanf (1.0f / 0.0f))
+#if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX
+  buf[0] = '\0';
+  if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0
+      || strcmp (buf, "12345671 33") != 0)
     result |= 1;
-
-  if (!isnanf (NaN ()))
-    result |= 2;
-
-#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
-  /* The isnanf function should be immune against changes in the sign bit and
-     in the mantissa bits.  The xor operation twiddles a bit that can only be
-     a sign bit or a mantissa bit.  */
-  if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0)
-    {
-      memory_float m;
-
-      m.value = NaN ();
-      /* Set the bits below the exponent to 01111...111.  */
-      m.word[0] &= -1U << FLT_EXPBIT0_BIT;
-      m.word[0] |= 1U << (FLT_EXPBIT0_BIT - 1) - 1;
-      if (!isnanf (m.value))
-        result |= 4;
-    }
+#else
+  result |= 1;
 #endif
-
+  buf[0] = '\0';
+  if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0
+      || strcmp (buf, "12345672 33") != 0)
+    result |= 2;
+  buf[0] = '\0';
+  if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0
+      || strcmp (buf, "12345673 33") != 0)
+    result |= 4;
+  buf[0] = '\0';
+  if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0
+      || strcmp (buf, "1.5 33") != 0)
+    result |= 8;
   return result;
 }
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_isnanf_works=yes
-else
-  gl_cv_func_isnanf_works=no
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_printf_sizes_c99=yes
+else $as_nop
+  gl_cv_func_printf_sizes_c99=no
 fi
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
   conftest.$ac_objext conftest.beam conftest.$ac_ext
@@ -40526,46 +17221,2272 @@
 
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_works" >&5
-$as_echo "$gl_cv_func_isnanf_works" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_sizes_c99" >&5
+printf "%s\n" "$gl_cv_func_printf_sizes_c99" >&6; }
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports 'long double' arguments" >&5
+printf %s "checking whether printf supports 'long double' arguments... " >&6; }
+if test ${gl_cv_func_printf_long_double+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                            # Guess no on BeOS.
+           beos*)           gl_cv_func_printf_long_double="guessing no";;
+                            # Guess yes on Android.
+           linux*-android*) gl_cv_func_printf_long_double="guessing yes";;
+                            # Guess yes on MSVC, no on mingw.
+           mingw*)          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef _MSC_VER
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Known" >/dev/null 2>&1
+then :
+  gl_cv_func_printf_long_double="guessing yes"
+else $as_nop
+  gl_cv_func_printf_long_double="guessing no"
+fi
+rm -rf conftest*
+
+                            ;;
+           *)               gl_cv_func_printf_long_double="guessing yes";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <string.h>
+static char buf[10000];
+int main ()
+{
+  int result = 0;
+  buf[0] = '\0';
+  if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0
+      || strcmp (buf, "1.750000 33") != 0)
+    result |= 1;
+  buf[0] = '\0';
+  if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0
+      || strcmp (buf, "1.750000e+00 33") != 0)
+    result |= 2;
+  buf[0] = '\0';
+  if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0
+      || strcmp (buf, "1.75 33") != 0)
+    result |= 4;
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_printf_long_double=yes
+else $as_nop
+  gl_cv_func_printf_long_double=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_long_double" >&5
+printf "%s\n" "$gl_cv_func_printf_long_double" >&6; }
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports infinite 'double' arguments" >&5
+printf %s "checking whether printf supports infinite 'double' arguments... " >&6; }
+if test ${gl_cv_func_printf_infinite+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+                                 # Guess yes on glibc systems.
+           *-gnu* | gnu*)        gl_cv_func_printf_infinite="guessing yes";;
+                                 # Guess yes on musl systems.
+           *-musl*)              gl_cv_func_printf_infinite="guessing yes";;
+                                 # Guess yes on FreeBSD >= 6.
+           freebsd[1-5].*)       gl_cv_func_printf_infinite="guessing no";;
+           freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";;
+           midnightbsd*)         gl_cv_func_printf_infinite="guessing yes";;
+                                 # Guess yes on Mac OS X >= 10.3.
+           darwin[1-6].*)        gl_cv_func_printf_infinite="guessing no";;
+           darwin*)              gl_cv_func_printf_infinite="guessing yes";;
+                                 # Guess yes on HP-UX >= 11.
+           hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";;
+           hpux*)                gl_cv_func_printf_infinite="guessing yes";;
+                                 # Guess yes on NetBSD >= 3.
+           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+                                 gl_cv_func_printf_infinite="guessing no";;
+           netbsd*)              gl_cv_func_printf_infinite="guessing yes";;
+                                 # Guess yes on OpenBSD >= 6.0.
+           openbsd[1-5].*)       gl_cv_func_printf_infinite="guessing no";;
+           openbsd*)             gl_cv_func_printf_infinite="guessing yes";;
+                                 # Guess yes on BeOS.
+           beos*)                gl_cv_func_printf_infinite="guessing yes";;
+                                 # Guess no on Android.
+           linux*-android*)      gl_cv_func_printf_infinite="guessing no";;
+                                 # Guess yes on MSVC, no on mingw.
+           mingw*)               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef _MSC_VER
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Known" >/dev/null 2>&1
+then :
+  gl_cv_func_printf_infinite="guessing yes"
+else $as_nop
+  gl_cv_func_printf_infinite="guessing no"
+fi
+rm -rf conftest*
+
+                                 ;;
+                                 # If we don't know, obey --enable-cross-guesses.
+           *)                    gl_cv_func_printf_infinite="$gl_cross_guess_normal";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <string.h>
+static int
+strisnan (const char *string, size_t start_index, size_t end_index)
+{
+  if (start_index < end_index)
+    {
+      if (string[start_index] == '-')
+        start_index++;
+      if (start_index + 3 <= end_index
+          && memcmp (string + start_index, "nan", 3) == 0)
+        {
+          start_index += 3;
+          if (start_index == end_index
+              || (string[start_index] == '(' && string[end_index - 1] == ')'))
+            return 1;
+        }
+    }
+  return 0;
+}
+static int
+have_minus_zero ()
+{
+  static double plus_zero = 0.0;
+  double minus_zero = - plus_zero;
+  return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
+}
+static char buf[10000];
+static double zero = 0.0;
+int main ()
+{
+  int result = 0;
+  if (sprintf (buf, "%f", 1.0 / zero) < 0
+      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+    result |= 1;
+  if (sprintf (buf, "%f", -1.0 / zero) < 0
+      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+    result |= 1;
+  if (sprintf (buf, "%f", zero / zero) < 0
+      || !strisnan (buf, 0, strlen (buf)))
+    result |= 2;
+  if (sprintf (buf, "%e", 1.0 / zero) < 0
+      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+    result |= 4;
+  if (sprintf (buf, "%e", -1.0 / zero) < 0
+      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+    result |= 4;
+  if (sprintf (buf, "%e", zero / zero) < 0
+      || !strisnan (buf, 0, strlen (buf)))
+    result |= 8;
+  if (sprintf (buf, "%g", 1.0 / zero) < 0
+      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+    result |= 16;
+  if (sprintf (buf, "%g", -1.0 / zero) < 0
+      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+    result |= 16;
+  if (sprintf (buf, "%g", zero / zero) < 0
+      || !strisnan (buf, 0, strlen (buf)))
+    result |= 32;
+  /* This test fails on HP-UX 10.20.  */
+  if (have_minus_zero ())
+    if (sprintf (buf, "%g", - zero) < 0
+        || strcmp (buf, "-0") != 0)
+    result |= 64;
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_printf_infinite=yes
+else $as_nop
+  gl_cv_func_printf_infinite=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_infinite" >&5
+printf "%s\n" "$gl_cv_func_printf_infinite" >&6; }
+
+
+   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+printf %s "checking whether byte ordering is bigendian... " >&6; }
+if test ${ac_cv_c_bigendian+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_cv_c_bigendian=unknown
+    # See if we're dealing with a universal compiler.
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __APPLE_CC__
+	       not a universal capable compiler
+	     #endif
+	     typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+	# Check for potential -arch flags.  It is not universal unless
+	# there are at least two -arch flags with different values.
+	ac_arch=
+	ac_prev=
+	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+	 if test -n "$ac_prev"; then
+	   case $ac_word in
+	     i?86 | x86_64 | ppc | ppc64)
+	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+		 ac_arch=$ac_word
+	       else
+		 ac_cv_c_bigendian=universal
+		 break
+	       fi
+	       ;;
+	   esac
+	   ac_prev=
+	 elif test "x$ac_word" = "x-arch"; then
+	   ac_prev=arch
+	 fi
+       done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if sys/param.h defines the BYTE_ORDER macro.
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+	     #include <sys/param.h>
+
+int
+main (void)
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+		     && LITTLE_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  # It does; now see whether it defined to BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+		#include <sys/param.h>
+
+int
+main (void)
+{
+#if BYTE_ORDER != BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_c_bigendian=yes
+else $as_nop
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main (void)
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  # It does; now see whether it defined to _BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main (void)
+{
+#ifndef _BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_c_bigendian=yes
+else $as_nop
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # Compile a test program.
+      if test "$cross_compiling" = yes
+then :
+  # Try to guess by grepping values from an object file.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+unsigned short int ascii_mm[] =
+		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+		unsigned short int ascii_ii[] =
+		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+		int use_ascii (int i) {
+		  return ascii_mm[i] + ascii_ii[i];
+		}
+		unsigned short int ebcdic_ii[] =
+		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+		unsigned short int ebcdic_mm[] =
+		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+		int use_ebcdic (int i) {
+		  return ebcdic_mm[i] + ebcdic_ii[i];
+		}
+		extern int foo;
+
+int
+main (void)
+{
+return use_ascii (foo) == use_ebcdic (foo);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+	      ac_cv_c_bigendian=yes
+	    fi
+	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+	      if test "$ac_cv_c_bigendian" = unknown; then
+		ac_cv_c_bigendian=no
+	      else
+		# finding both strings is unlikely to happen, but who knows?
+		ac_cv_c_bigendian=unknown
+	      fi
+	    fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main (void)
+{
+
+	     /* Are we little or big endian?  From Harbison&Steele.  */
+	     union
+	     {
+	       long int l;
+	       char c[sizeof (long int)];
+	     } u;
+	     u.l = 1;
+	     return u.c[sizeof (long int) - 1] == 1;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  ac_cv_c_bigendian=no
+else $as_nop
+  ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+    fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+printf "%s\n" "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+   yes)
+     printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h
+;; #(
+   no)
+      ;; #(
+   universal)
+
+printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+     ;; #(
+   *)
+     as_fn_error $? "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether long double and double are the same" >&5
+printf %s "checking whether long double and double are the same... " >&6; }
+if test ${gl_cv_long_double_equals_double+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <float.h>
+int
+main (void)
+{
+typedef int check[sizeof (long double) == sizeof (double)
+                              && LDBL_MANT_DIG == DBL_MANT_DIG
+                              && LDBL_MAX_EXP == DBL_MAX_EXP
+                              && LDBL_MIN_EXP == DBL_MIN_EXP
+                              ? 1 : -1];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_long_double_equals_double=yes
+else $as_nop
+  gl_cv_long_double_equals_double=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_long_double_equals_double" >&5
+printf "%s\n" "$gl_cv_long_double_equals_double" >&6; }
+  if test $gl_cv_long_double_equals_double = yes; then
+
+printf "%s\n" "#define HAVE_SAME_LONG_DOUBLE_AS_DOUBLE 1" >>confdefs.h
+
+    HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=1
+  else
+    HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=0
+  fi
+
+
+
+
+
+
+
+         if test -n "$gl_printf_safe"; then
+
+printf "%s\n" "#define CHECK_PRINTF_SAFE 1" >>confdefs.h
 
   fi
-  if test $gl_cv_func_isnanf_no_libm = yes \
-     && { case "$gl_cv_func_isnanf_works" in
-            *yes) true;;
-            *) false;;
-          esac
-        }; then
-    gl_func_isnanf_no_libm=yes
+  case "$gl_cv_func_printf_long_double" in
+    *yes)
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports infinite 'long double' arguments" >&5
+printf %s "checking whether printf supports infinite 'long double' arguments... " >&6; }
+if test ${gl_cv_func_printf_infinite_long_double+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
-$as_echo "#define HAVE_ISNANF_IN_LIBC 1" >>confdefs.h
+          if test "$cross_compiling" = yes
+then :
+  case "$host_cpu" in
+                                     # Guess no on ia64, x86_64, i386.
+               ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";;
+               *)
+                 case "$host_os" in
+                                         # Guess yes on glibc systems.
+                   *-gnu* | gnu*)        gl_cv_func_printf_infinite_long_double="guessing yes";;
+                                         # Guess yes on musl systems.
+                   *-musl*)              gl_cv_func_printf_infinite_long_double="guessing yes";;
+                                         # Guess yes on FreeBSD >= 6.
+                   freebsd[1-5].*)       gl_cv_func_printf_infinite_long_double="guessing no";;
+                   freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+                   midnightbsd*)         gl_cv_func_printf_infinite_long_double="guessing yes";;
+                                         # Guess yes on HP-UX >= 11.
+                   hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";;
+                   hpux*)                gl_cv_func_printf_infinite_long_double="guessing yes";;
+                                         # Guess yes on OpenBSD >= 6.0.
+                   openbsd[1-5].*)       gl_cv_func_printf_infinite_long_double="guessing no";;
+                   openbsd*)             gl_cv_func_printf_infinite_long_double="guessing yes";;
+                                         # Guess no on Android.
+                   linux*-android*)      gl_cv_func_printf_infinite_long_double="guessing no";;
+                                         # Guess yes on MSVC, no on mingw.
+                   mingw*)               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef _MSC_VER
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Known" >/dev/null 2>&1
+then :
+  gl_cv_func_printf_infinite_long_double="guessing yes"
+else $as_nop
+  gl_cv_func_printf_infinite_long_double="guessing no"
+fi
+rm -rf conftest*
+
+                                         ;;
+                                         # If we don't know, obey --enable-cross-guesses.
+                   *)                    gl_cv_func_printf_infinite_long_double="$gl_cross_guess_normal";;
+                 esac
+                 ;;
+             esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#include <stdlib.h>
+#if defined __MACH__ && defined __APPLE__
+/* Avoid a crash on Mac OS X.  */
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+#include <mach/thread_status.h>
+#include <mach/exception.h>
+#include <mach/task.h>
+#include <pthread.h>
+/* The exception port on which our thread listens.  */
+static mach_port_t our_exception_port;
+/* The main function of the thread listening for exceptions of type
+   EXC_BAD_ACCESS.  */
+static void *
+mach_exception_thread (void *arg)
+{
+  /* Buffer for a message to be received.  */
+  struct {
+    mach_msg_header_t head;
+    mach_msg_body_t msgh_body;
+    char data[1024];
+  } msg;
+  mach_msg_return_t retval;
+  /* Wait for a message on the exception port.  */
+  retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
+                     our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+  if (retval != MACH_MSG_SUCCESS)
+    abort ();
+  exit (1);
+}
+static void
+nocrash_init (void)
+{
+  mach_port_t self = mach_task_self ();
+  /* Allocate a port on which the thread shall listen for exceptions.  */
+  if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
+      == KERN_SUCCESS) {
+    /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html.  */
+    if (mach_port_insert_right (self, our_exception_port, our_exception_port,
+                                MACH_MSG_TYPE_MAKE_SEND)
+        == KERN_SUCCESS) {
+      /* The exceptions we want to catch.  Only EXC_BAD_ACCESS is interesting
+         for us.  */
+      exception_mask_t mask = EXC_MASK_BAD_ACCESS;
+      /* Create the thread listening on the exception port.  */
+      pthread_attr_t attr;
+      pthread_t thread;
+      if (pthread_attr_init (&attr) == 0
+          && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
+          && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
+        pthread_attr_destroy (&attr);
+        /* Replace the exception port info for these exceptions with our own.
+           Note that we replace the exception port for the entire task, not only
+           for a particular thread.  This has the effect that when our exception
+           port gets the message, the thread specific exception port has already
+           been asked, and we don't need to bother about it.
+           See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html.  */
+        task_set_exception_ports (self, mask, our_exception_port,
+                                  EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
+      }
+    }
+  }
+}
+#elif defined _WIN32 && ! defined __CYGWIN__
+/* Avoid a crash on native Windows.  */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winerror.h>
+static LONG WINAPI
+exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
+{
+  switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
+    {
+    case EXCEPTION_ACCESS_VIOLATION:
+    case EXCEPTION_IN_PAGE_ERROR:
+    case EXCEPTION_STACK_OVERFLOW:
+    case EXCEPTION_GUARD_PAGE:
+    case EXCEPTION_PRIV_INSTRUCTION:
+    case EXCEPTION_ILLEGAL_INSTRUCTION:
+    case EXCEPTION_DATATYPE_MISALIGNMENT:
+    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
+    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
+      exit (1);
+    }
+  return EXCEPTION_CONTINUE_SEARCH;
+}
+static void
+nocrash_init (void)
+{
+  SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
+}
+#else
+/* Avoid a crash on POSIX systems.  */
+#include <signal.h>
+#include <unistd.h>
+/* A POSIX signal handler.  */
+static void
+exception_handler (int sig)
+{
+  _exit (1);
+}
+static void
+nocrash_init (void)
+{
+#ifdef SIGSEGV
+  signal (SIGSEGV, exception_handler);
+#endif
+#ifdef SIGBUS
+  signal (SIGBUS, exception_handler);
+#endif
+}
+#endif
+
+#include <float.h>
+#include <stdio.h>
+#include <string.h>
+static int
+strisnan (const char *string, size_t start_index, size_t end_index)
+{
+  if (start_index < end_index)
+    {
+      if (string[start_index] == '-')
+        start_index++;
+      if (start_index + 3 <= end_index
+          && memcmp (string + start_index, "nan", 3) == 0)
+        {
+          start_index += 3;
+          if (start_index == end_index
+              || (string[start_index] == '(' && string[end_index - 1] == ')'))
+            return 1;
+        }
+    }
+  return 0;
+}
+static char buf[10000];
+static long double zeroL = 0.0L;
+int main ()
+{
+  int result = 0;
+  nocrash_init();
+  if (sprintf (buf, "%Lf", 1.0L / zeroL) < 0
+      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+    result |= 1;
+  if (sprintf (buf, "%Lf", -1.0L / zeroL) < 0
+      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+    result |= 1;
+  if (sprintf (buf, "%Lf", zeroL / zeroL) < 0
+      || !strisnan (buf, 0, strlen (buf)))
+    result |= 1;
+  if (sprintf (buf, "%Le", 1.0L / zeroL) < 0
+      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+    result |= 1;
+  if (sprintf (buf, "%Le", -1.0L / zeroL) < 0
+      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+    result |= 1;
+  if (sprintf (buf, "%Le", zeroL / zeroL) < 0
+      || !strisnan (buf, 0, strlen (buf)))
+    result |= 1;
+  if (sprintf (buf, "%Lg", 1.0L / zeroL) < 0
+      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+    result |= 1;
+  if (sprintf (buf, "%Lg", -1.0L / zeroL) < 0
+      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+    result |= 1;
+  if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
+      || !strisnan (buf, 0, strlen (buf)))
+    result |= 1;
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+   of 'unsigned int' words.  */
+# ifdef WORDS_BIGENDIAN
+#  define LDBL80_WORDS(exponent,manthi,mantlo) \
+     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+       ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16),   \
+       (unsigned int) (mantlo) << 16                                        \
+     }
+# else
+#  define LDBL80_WORDS(exponent,manthi,mantlo) \
+     { mantlo, manthi, exponent }
+# endif
+  { /* Quiet NaN.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+    if (sprintf (buf, "%Lf", x.value) < 0
+        || !strisnan (buf, 0, strlen (buf)))
+      result |= 2;
+    if (sprintf (buf, "%Le", x.value) < 0
+        || !strisnan (buf, 0, strlen (buf)))
+      result |= 2;
+    if (sprintf (buf, "%Lg", x.value) < 0
+        || !strisnan (buf, 0, strlen (buf)))
+      result |= 2;
+  }
+  {
+    /* Signalling NaN.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+    if (sprintf (buf, "%Lf", x.value) < 0
+        || !strisnan (buf, 0, strlen (buf)))
+      result |= 2;
+    if (sprintf (buf, "%Le", x.value) < 0
+        || !strisnan (buf, 0, strlen (buf)))
+      result |= 2;
+    if (sprintf (buf, "%Lg", x.value) < 0
+        || !strisnan (buf, 0, strlen (buf)))
+      result |= 2;
+  }
+  { /* Pseudo-NaN.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+    if (sprintf (buf, "%Lf", x.value) <= 0)
+      result |= 4;
+    if (sprintf (buf, "%Le", x.value) <= 0)
+      result |= 4;
+    if (sprintf (buf, "%Lg", x.value) <= 0)
+      result |= 4;
+  }
+  { /* Pseudo-Infinity.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+    if (sprintf (buf, "%Lf", x.value) <= 0)
+      result |= 8;
+    if (sprintf (buf, "%Le", x.value) <= 0)
+      result |= 8;
+    if (sprintf (buf, "%Lg", x.value) <= 0)
+      result |= 8;
+  }
+  { /* Pseudo-Zero.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+    if (sprintf (buf, "%Lf", x.value) <= 0)
+      result |= 16;
+    if (sprintf (buf, "%Le", x.value) <= 0)
+      result |= 16;
+    if (sprintf (buf, "%Lg", x.value) <= 0)
+      result |= 16;
+  }
+  { /* Unnormalized number.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+    if (sprintf (buf, "%Lf", x.value) <= 0)
+      result |= 32;
+    if (sprintf (buf, "%Le", x.value) <= 0)
+      result |= 32;
+    if (sprintf (buf, "%Lg", x.value) <= 0)
+      result |= 32;
+  }
+  { /* Pseudo-Denormal.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+    if (sprintf (buf, "%Lf", x.value) <= 0)
+      result |= 64;
+    if (sprintf (buf, "%Le", x.value) <= 0)
+      result |= 64;
+    if (sprintf (buf, "%Lg", x.value) <= 0)
+      result |= 64;
+  }
+#endif
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_printf_infinite_long_double=yes
+else $as_nop
+  gl_cv_func_printf_infinite_long_double=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_infinite_long_double" >&5
+printf "%s\n" "$gl_cv_func_printf_infinite_long_double" >&6; }
+      ;;
+    *)
+      gl_cv_func_printf_infinite_long_double="irrelevant"
+      ;;
+  esac
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'a' and 'A' directives" >&5
+printf %s "checking whether printf supports the 'a' and 'A' directives... " >&6; }
+if test ${gl_cv_func_printf_directive_a+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+                                 # Guess yes on glibc >= 2.5 systems.
+           *-gnu* | gnu*)
+             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+               #include <features.h>
+               #ifdef __GNU_LIBRARY__
+                #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__
+                 BZ2908
+                #endif
+               #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "BZ2908" >/dev/null 2>&1
+then :
+  gl_cv_func_printf_directive_a="guessing yes"
+else $as_nop
+  gl_cv_func_printf_directive_a="guessing no"
+fi
+rm -rf conftest*
+
+             ;;
+                                 # Guess yes on musl systems.
+           *-musl*)              gl_cv_func_printf_directive_a="guessing yes";;
+                                 # Guess no on Android.
+           linux*-android*)      gl_cv_func_printf_directive_a="guessing no";;
+                                 # Guess no on native Windows.
+           mingw*)               gl_cv_func_printf_directive_a="guessing no";;
+                                 # If we don't know, obey --enable-cross-guesses.
+           *)                    gl_cv_func_printf_directive_a="$gl_cross_guess_normal";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+static double zero = 0.0;
+int main ()
+{
+  int result = 0;
+  if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0
+      || (strcmp (buf, "0x1.922p+1 33") != 0
+          && strcmp (buf, "0x3.244p+0 33") != 0
+          && strcmp (buf, "0x6.488p-1 33") != 0
+          && strcmp (buf, "0xc.91p-2 33") != 0))
+    result |= 1;
+  if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0
+      || (strcmp (buf, "-0X1.922P+1 33") != 0
+          && strcmp (buf, "-0X3.244P+0 33") != 0
+          && strcmp (buf, "-0X6.488P-1 33") != 0
+          && strcmp (buf, "-0XC.91P-2 33") != 0))
+    result |= 2;
+  /* This catches a FreeBSD 13.0 bug: it doesn't round.  */
+  if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0
+      || (strcmp (buf, "0x1.83p+0 33") != 0
+          && strcmp (buf, "0x3.05p-1 33") != 0
+          && strcmp (buf, "0x6.0ap-2 33") != 0
+          && strcmp (buf, "0xc.14p-3 33") != 0))
+    result |= 4;
+  /* This catches a Mac OS X 10.12.4 (Darwin 16.5) bug: it doesn't round.  */
+  if (sprintf (buf, "%.0a %d", 1.51, 33, 44, 55) < 0
+      || (strcmp (buf, "0x2p+0 33") != 0
+          && strcmp (buf, "0x3p-1 33") != 0
+          && strcmp (buf, "0x6p-2 33") != 0
+          && strcmp (buf, "0xcp-3 33") != 0))
+    result |= 4;
+  /* This catches a FreeBSD 6.1 bug.  See
+     <https://lists.gnu.org/r/bug-gnulib/2007-04/msg00107.html> */
+  if (sprintf (buf, "%010a %d", 1.0 / zero, 33, 44, 55) < 0
+      || buf[0] == '0')
+    result |= 8;
+  /* This catches a Mac OS X 10.3.9 (Darwin 7.9) bug.  */
+  if (sprintf (buf, "%.1a", 1.999) < 0
+      || (strcmp (buf, "0x1.0p+1") != 0
+          && strcmp (buf, "0x2.0p+0") != 0
+          && strcmp (buf, "0x4.0p-1") != 0
+          && strcmp (buf, "0x8.0p-2") != 0))
+    result |= 16;
+  /* This catches the same Mac OS X 10.3.9 (Darwin 7.9) bug and also a
+     glibc 2.4 bug <https://sourceware.org/bugzilla/show_bug.cgi?id=2908>.  */
+  if (sprintf (buf, "%.1La", 1.999L) < 0
+      || (strcmp (buf, "0x1.0p+1") != 0
+          && strcmp (buf, "0x2.0p+0") != 0
+          && strcmp (buf, "0x4.0p-1") != 0
+          && strcmp (buf, "0x8.0p-2") != 0))
+    result |= 32;
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_printf_directive_a=yes
+else $as_nop
+  gl_cv_func_printf_directive_a=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_a" >&5
+printf "%s\n" "$gl_cv_func_printf_directive_a" >&6; }
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'F' directive" >&5
+printf %s "checking whether printf supports the 'F' directive... " >&6; }
+if test ${gl_cv_func_printf_directive_f+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+                                 # Guess yes on glibc systems.
+           *-gnu* | gnu*)        gl_cv_func_printf_directive_f="guessing yes";;
+                                 # Guess yes on musl systems.
+           *-musl*)              gl_cv_func_printf_directive_f="guessing yes";;
+                                 # Guess yes on FreeBSD >= 6.
+           freebsd[1-5].*)       gl_cv_func_printf_directive_f="guessing no";;
+           freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
+           midnightbsd*)         gl_cv_func_printf_directive_f="guessing yes";;
+                                 # Guess yes on Mac OS X >= 10.3.
+           darwin[1-6].*)        gl_cv_func_printf_directive_f="guessing no";;
+           darwin*)              gl_cv_func_printf_directive_f="guessing yes";;
+                                 # Guess yes on OpenBSD >= 6.0.
+           openbsd[1-5].*)       gl_cv_func_printf_directive_f="guessing no";;
+           openbsd*)             gl_cv_func_printf_directive_f="guessing yes";;
+                                 # Guess yes on Solaris >= 2.10.
+           solaris2.[1-9][0-9]*) gl_cv_func_printf_directive_f="guessing yes";;
+           solaris*)             gl_cv_func_printf_directive_f="guessing no";;
+                                 # Guess no on Android.
+           linux*-android*)      gl_cv_func_printf_directive_f="guessing no";;
+                                 # Guess yes on MSVC, no on mingw.
+           mingw*)               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef _MSC_VER
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Known" >/dev/null 2>&1
+then :
+  gl_cv_func_printf_directive_f="guessing yes"
+else $as_nop
+  gl_cv_func_printf_directive_f="guessing no"
+fi
+rm -rf conftest*
+
+                                 ;;
+                                 # If we don't know, obey --enable-cross-guesses.
+           *)                    gl_cv_func_printf_directive_f="$gl_cross_guess_normal";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+static double zero = 0.0;
+int main ()
+{
+  int result = 0;
+  if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
+      || strcmp (buf, "1234567.000000 33") != 0)
+    result |= 1;
+  if (sprintf (buf, "%F", 1.0 / zero) < 0
+      || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
+    result |= 2;
+  /* This catches a Cygwin 1.5.x bug.  */
+  if (sprintf (buf, "%.F", 1234.0) < 0
+      || strcmp (buf, "1234") != 0)
+    result |= 4;
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_printf_directive_f=yes
+else $as_nop
+  gl_cv_func_printf_directive_f=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_f" >&5
+printf "%s\n" "$gl_cv_func_printf_directive_f" >&6; }
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'n' directive" >&5
+printf %s "checking whether printf supports the 'n' directive... " >&6; }
+if test ${gl_cv_func_printf_directive_n+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                            # Guess no on glibc when _FORTIFY_SOURCE >= 2.
+           *-gnu* | gnu*)   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if _FORTIFY_SOURCE >= 2
+                                    error fail
+                                   #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_func_printf_directive_n="guessing yes"
+else $as_nop
+  gl_cv_func_printf_directive_n="guessing no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+                            ;;
+                            # Guess no on Android.
+           linux*-android*) gl_cv_func_printf_directive_n="guessing no";;
+                            # Guess no on native Windows.
+           mingw*)          gl_cv_func_printf_directive_n="guessing no";;
+           *)               gl_cv_func_printf_directive_n="guessing yes";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef _MSC_VER
+#include <inttypes.h>
+/* See page about "Parameter Validation" on msdn.microsoft.com.
+   <https://docs.microsoft.com/en-us/cpp/c-runtime-library/parameter-validation>
+   <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/set-invalid-parameter-handler-set-thread-local-invalid-parameter-handler>  */
+static void cdecl
+invalid_parameter_handler (const wchar_t *expression,
+                           const wchar_t *function,
+                           const wchar_t *file, unsigned int line,
+                           uintptr_t dummy)
+{
+  exit (1);
+}
+#endif
+static char fmtstring[10];
+static char buf[100];
+int main ()
+{
+  int count = -1;
+#ifdef _MSC_VER
+  _set_invalid_parameter_handler (invalid_parameter_handler);
+#endif
+  /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
+     support %n in format strings in read-only memory but not in writable
+     memory.  */
+  strcpy (fmtstring, "%d %n");
+  if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
+      || strcmp (buf, "123 ") != 0
+      || count != 4)
+    return 1;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_printf_directive_n=yes
+else $as_nop
+  gl_cv_func_printf_directive_n=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_n" >&5
+printf "%s\n" "$gl_cv_func_printf_directive_n" >&6; }
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'ls' directive" >&5
+printf %s "checking whether printf supports the 'ls' directive... " >&6; }
+if test ${gl_cv_func_printf_directive_ls+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+                            # Guess yes on OpenBSD >= 6.0.
+           openbsd[1-5].*)  gl_cv_func_printf_directive_ls="guessing no";;
+           openbsd*)        gl_cv_func_printf_directive_ls="guessing yes";;
+           irix*)           gl_cv_func_printf_directive_ls="guessing no";;
+           solaris*)        gl_cv_func_printf_directive_ls="guessing no";;
+           cygwin*)         gl_cv_func_printf_directive_ls="guessing no";;
+           beos* | haiku*)  gl_cv_func_printf_directive_ls="guessing no";;
+                            # Guess no on Android.
+           linux*-android*) gl_cv_func_printf_directive_ls="guessing no";;
+                            # Guess yes on native Windows.
+           mingw*)          gl_cv_func_printf_directive_ls="guessing yes";;
+           *)               gl_cv_func_printf_directive_ls="guessing yes";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <wchar.h>
+#include <string.h>
+int main ()
+{
+  int result = 0;
+  char buf[100];
+  /* Test whether %ls works at all.
+     This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on
+     Cygwin 1.5.  */
+  {
+    static const wchar_t wstring[] = { 'a', 'b', 'c', 0 };
+    buf[0] = '\0';
+    if (sprintf (buf, "%ls", wstring) < 0
+        || strcmp (buf, "abc") != 0)
+      result |= 1;
+  }
+  /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an
+     assertion failure inside libc), but not on OpenBSD 4.0.  */
+  {
+    static const wchar_t wstring[] = { 'a', 0 };
+    buf[0] = '\0';
+    if (sprintf (buf, "%ls", wstring) < 0
+        || strcmp (buf, "a") != 0)
+      result |= 2;
+  }
+  /* Test whether precisions in %ls are supported as specified in ISO C 99
+     section 7.19.6.1:
+       "If a precision is specified, no more than that many bytes are written
+        (including shift sequences, if any), and the array shall contain a
+        null wide character if, to equal the multibyte character sequence
+        length given by the precision, the function would need to access a
+        wide character one past the end of the array."
+     This test fails on Solaris 10.  */
+  {
+    static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 };
+    buf[0] = '\0';
+    if (sprintf (buf, "%.2ls", wstring) < 0
+        || strcmp (buf, "ab") != 0)
+      result |= 8;
+  }
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_printf_directive_ls=yes
+else $as_nop
+  gl_cv_func_printf_directive_ls=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_ls" >&5
+printf "%s\n" "$gl_cv_func_printf_directive_ls" >&6; }
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5
+printf %s "checking whether printf supports POSIX/XSI format strings with positions... " >&6; }
+if test ${gl_cv_func_printf_positions+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+           netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
+                            gl_cv_func_printf_positions="guessing no";;
+           beos*)           gl_cv_func_printf_positions="guessing no";;
+                            # Guess yes on Android.
+           linux*-android*) gl_cv_func_printf_positions="guessing yes";;
+                            # Guess no on native Windows.
+           mingw* | pw*)    gl_cv_func_printf_positions="guessing no";;
+           *)               gl_cv_func_printf_positions="guessing yes";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+   dollar expansion (possibly an autoconf bug).  */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+  sprintf (buf, format, 33, 55);
+  return (strcmp (buf, "55 33") != 0);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_printf_positions=yes
+else $as_nop
+  gl_cv_func_printf_positions=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5
+printf "%s\n" "$gl_cv_func_printf_positions" >&6; }
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the grouping flag" >&5
+printf %s "checking whether printf supports the grouping flag... " >&6; }
+if test ${gl_cv_func_printf_flag_grouping+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+           cygwin*)         gl_cv_func_printf_flag_grouping="guessing no";;
+           netbsd*)         gl_cv_func_printf_flag_grouping="guessing no";;
+                            # Guess no on Android.
+           linux*-android*) gl_cv_func_printf_flag_grouping="guessing no";;
+                            # Guess no on native Windows.
+           mingw* | pw*)    gl_cv_func_printf_flag_grouping="guessing no";;
+           *)               gl_cv_func_printf_flag_grouping="guessing yes";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+int main ()
+{
+  if (sprintf (buf, "%'d %d", 1234567, 99) < 0
+      || buf[strlen (buf) - 1] != '9')
+    return 1;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_printf_flag_grouping=yes
+else $as_nop
+  gl_cv_func_printf_flag_grouping=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_grouping" >&5
+printf "%s\n" "$gl_cv_func_printf_flag_grouping" >&6; }
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the left-adjust flag correctly" >&5
+printf %s "checking whether printf supports the left-adjust flag correctly... " >&6; }
+if test ${gl_cv_func_printf_flag_leftadjust+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+                            # Guess yes on HP-UX 11.
+           hpux11*)         gl_cv_func_printf_flag_leftadjust="guessing yes";;
+                            # Guess no on HP-UX 10 and older.
+           hpux*)           gl_cv_func_printf_flag_leftadjust="guessing no";;
+                            # Guess yes on Android.
+           linux*-android*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
+                            # Guess yes on native Windows.
+           mingw*)          gl_cv_func_printf_flag_leftadjust="guessing yes";;
+                            # Guess yes otherwise.
+           *)               gl_cv_func_printf_flag_leftadjust="guessing yes";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+int main ()
+{
+  /* Check that a '-' flag is not annihilated by a negative width.  */
+  if (sprintf (buf, "a%-*sc", -3, "b") < 0
+      || strcmp (buf, "ab  c") != 0)
+    return 1;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_printf_flag_leftadjust=yes
+else $as_nop
+  gl_cv_func_printf_flag_leftadjust=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_leftadjust" >&5
+printf "%s\n" "$gl_cv_func_printf_flag_leftadjust" >&6; }
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports the zero flag correctly" >&5
+printf %s "checking whether printf supports the zero flag correctly... " >&6; }
+if test ${gl_cv_func_printf_flag_zero+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+                            # Guess yes on glibc systems.
+           *-gnu* | gnu*)   gl_cv_func_printf_flag_zero="guessing yes";;
+                            # Guess yes on musl systems.
+           *-musl*)         gl_cv_func_printf_flag_zero="guessing yes";;
+                            # Guess yes on BeOS.
+           beos*)           gl_cv_func_printf_flag_zero="guessing yes";;
+                            # Guess no on Android.
+           linux*-android*) gl_cv_func_printf_flag_zero="guessing no";;
+                            # Guess no on native Windows.
+           mingw*)          gl_cv_func_printf_flag_zero="guessing no";;
+                            # If we don't know, obey --enable-cross-guesses.
+           *)               gl_cv_func_printf_flag_zero="$gl_cross_guess_normal";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+static double zero = 0.0;
+int main ()
+{
+  if (sprintf (buf, "%010f", 1.0 / zero, 33, 44, 55) < 0
+      || (strcmp (buf, "       inf") != 0
+          && strcmp (buf, "  infinity") != 0))
+    return 1;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_printf_flag_zero=yes
+else $as_nop
+  gl_cv_func_printf_flag_zero=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_zero" >&5
+printf "%s\n" "$gl_cv_func_printf_flag_zero" >&6; }
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports large precisions" >&5
+printf %s "checking whether printf supports large precisions... " >&6; }
+if test ${gl_cv_func_printf_precision+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+           # Guess no only on Solaris, native Windows, and BeOS systems.
+           solaris*)        gl_cv_func_printf_precision="guessing no" ;;
+           mingw* | pw*)    gl_cv_func_printf_precision="guessing no" ;;
+           beos*)           gl_cv_func_printf_precision="guessing no" ;;
+                            # Guess yes on Android.
+           linux*-android*) gl_cv_func_printf_precision="guessing yes" ;;
+           *)               gl_cv_func_printf_precision="guessing yes" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <string.h>
+static char buf[5000];
+int main ()
+{
+  int result = 0;
+#ifdef __BEOS__
+  /* On BeOS, this would crash and show a dialog box.  Avoid the crash.  */
+  return 1;
+#endif
+  if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3)
+    result |= 1;
+  if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5)
+    result |= 2;
+  if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5
+      || buf[0] != '1')
+    result |= 4;
+  if (sprintf (buf, "%.999f %d", 1.0, 33, 44) < 999 + 5
+      || buf[0] != '1')
+    result |= 4;
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_printf_precision=yes
+else $as_nop
+  gl_cv_func_printf_precision=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_precision" >&5
+printf "%s\n" "$gl_cv_func_printf_precision" >&6; }
+
+
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler produces multi-arch binaries" >&5
+printf %s "checking whether the compiler produces multi-arch binaries... " >&6; }
+if test ${gl_cv_c_multiarch+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  gl_cv_c_multiarch=no
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __APPLE_CC__
+            not a universal capable compiler
+           #endif
+           typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+                        arch=
+        prev=
+        for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do
+          if test -n "$prev"; then
+            case $word in
+              i?86 | x86_64 | ppc | ppc64 | arm | arm64)
+                if test -z "$arch" || test "$arch" = "$word"; then
+                  arch="$word"
+                else
+                  gl_cv_c_multiarch=yes
+                fi
+                ;;
+            esac
+            prev=
+          else
+            if test "x$word" = "x-arch"; then
+              prev=arch
+            fi
+          fi
+        done
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_multiarch" >&5
+printf "%s\n" "$gl_cv_c_multiarch" >&6; }
+  if test $gl_cv_c_multiarch = yes; then
+    APPLE_UNIVERSAL_BUILD=1
+  else
+    APPLE_UNIVERSAL_BUILD=0
+  fi
+
+
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf survives out-of-memory conditions" >&5
+printf %s "checking whether printf survives out-of-memory conditions... " >&6; }
+if test ${gl_cv_func_printf_enomem+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      gl_cv_func_printf_enomem="guessing no"
+      if test "$cross_compiling" = no; then
+        if test $APPLE_UNIVERSAL_BUILD = 0; then
+          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#include <stdlib.h>
+#if defined __MACH__ && defined __APPLE__
+/* Avoid a crash on Mac OS X.  */
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+#include <mach/thread_status.h>
+#include <mach/exception.h>
+#include <mach/task.h>
+#include <pthread.h>
+/* The exception port on which our thread listens.  */
+static mach_port_t our_exception_port;
+/* The main function of the thread listening for exceptions of type
+   EXC_BAD_ACCESS.  */
+static void *
+mach_exception_thread (void *arg)
+{
+  /* Buffer for a message to be received.  */
+  struct {
+    mach_msg_header_t head;
+    mach_msg_body_t msgh_body;
+    char data[1024];
+  } msg;
+  mach_msg_return_t retval;
+  /* Wait for a message on the exception port.  */
+  retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
+                     our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+  if (retval != MACH_MSG_SUCCESS)
+    abort ();
+  exit (1);
+}
+static void
+nocrash_init (void)
+{
+  mach_port_t self = mach_task_self ();
+  /* Allocate a port on which the thread shall listen for exceptions.  */
+  if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
+      == KERN_SUCCESS) {
+    /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html.  */
+    if (mach_port_insert_right (self, our_exception_port, our_exception_port,
+                                MACH_MSG_TYPE_MAKE_SEND)
+        == KERN_SUCCESS) {
+      /* The exceptions we want to catch.  Only EXC_BAD_ACCESS is interesting
+         for us.  */
+      exception_mask_t mask = EXC_MASK_BAD_ACCESS;
+      /* Create the thread listening on the exception port.  */
+      pthread_attr_t attr;
+      pthread_t thread;
+      if (pthread_attr_init (&attr) == 0
+          && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
+          && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
+        pthread_attr_destroy (&attr);
+        /* Replace the exception port info for these exceptions with our own.
+           Note that we replace the exception port for the entire task, not only
+           for a particular thread.  This has the effect that when our exception
+           port gets the message, the thread specific exception port has already
+           been asked, and we don't need to bother about it.
+           See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html.  */
+        task_set_exception_ports (self, mask, our_exception_port,
+                                  EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
+      }
+    }
+  }
+}
+#elif defined _WIN32 && ! defined __CYGWIN__
+/* Avoid a crash on native Windows.  */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winerror.h>
+static LONG WINAPI
+exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
+{
+  switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
+    {
+    case EXCEPTION_ACCESS_VIOLATION:
+    case EXCEPTION_IN_PAGE_ERROR:
+    case EXCEPTION_STACK_OVERFLOW:
+    case EXCEPTION_GUARD_PAGE:
+    case EXCEPTION_PRIV_INSTRUCTION:
+    case EXCEPTION_ILLEGAL_INSTRUCTION:
+    case EXCEPTION_DATATYPE_MISALIGNMENT:
+    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
+    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
+      exit (1);
+    }
+  return EXCEPTION_CONTINUE_SEARCH;
+}
+static void
+nocrash_init (void)
+{
+  SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
+}
+#else
+/* Avoid a crash on POSIX systems.  */
+#include <signal.h>
+#include <unistd.h>
+/* A POSIX signal handler.  */
+static void
+exception_handler (int sig)
+{
+  _exit (1);
+}
+static void
+nocrash_init (void)
+{
+#ifdef SIGSEGV
+  signal (SIGSEGV, exception_handler);
+#endif
+#ifdef SIGBUS
+  signal (SIGBUS, exception_handler);
+#endif
+}
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <errno.h>
+int main()
+{
+  struct rlimit limit;
+  int ret;
+  nocrash_init ();
+  /* Some printf implementations allocate temporary space with malloc.  */
+  /* On BSD systems, malloc() is limited by RLIMIT_DATA.  */
+#ifdef RLIMIT_DATA
+  if (getrlimit (RLIMIT_DATA, &limit) < 0)
+    return 77;
+  if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+    limit.rlim_max = 5000000;
+  limit.rlim_cur = limit.rlim_max;
+  if (setrlimit (RLIMIT_DATA, &limit) < 0)
+    return 77;
+#endif
+  /* On Linux systems, malloc() is limited by RLIMIT_AS.  */
+#ifdef RLIMIT_AS
+  if (getrlimit (RLIMIT_AS, &limit) < 0)
+    return 77;
+  if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+    limit.rlim_max = 5000000;
+  limit.rlim_cur = limit.rlim_max;
+  if (setrlimit (RLIMIT_AS, &limit) < 0)
+    return 77;
+#endif
+  /* Some printf implementations allocate temporary space on the stack.  */
+#ifdef RLIMIT_STACK
+  if (getrlimit (RLIMIT_STACK, &limit) < 0)
+    return 77;
+  if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+    limit.rlim_max = 5000000;
+  limit.rlim_cur = limit.rlim_max;
+  if (setrlimit (RLIMIT_STACK, &limit) < 0)
+    return 77;
+#endif
+  ret = printf ("%.5000000f", 1.0);
+  return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
+}
+
+_ACEOF
+          if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest$ac_exeext; then
+            (./conftest 2>&5
+             result=$?
+             printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $result" >&5
+             if test $result != 0 && test $result != 77; then result=1; fi
+             exit $result
+            ) >/dev/null 2>/dev/null
+            case $? in
+              0) gl_cv_func_printf_enomem="yes" ;;
+              77) gl_cv_func_printf_enomem="guessing no" ;;
+              *) gl_cv_func_printf_enomem="no" ;;
+            esac
+          else
+            gl_cv_func_printf_enomem="guessing no"
+          fi
+          rm -fr conftest*
+        else
+                                        gl_cv_func_printf_enomem="guessing no"
+        fi
+      fi
+      if test "$gl_cv_func_printf_enomem" = "guessing no"; then
+        case "$host_os" in
+                           # Guess yes on glibc systems.
+          *-gnu* | gnu*)   gl_cv_func_printf_enomem="guessing yes";;
+                           # Guess yes on Solaris.
+          solaris*)        gl_cv_func_printf_enomem="guessing yes";;
+                           # Guess yes on AIX.
+          aix*)            gl_cv_func_printf_enomem="guessing yes";;
+                           # Guess yes on HP-UX/hppa.
+          hpux*)           case "$host_cpu" in
+                             hppa*) gl_cv_func_printf_enomem="guessing yes";;
+                             *)     gl_cv_func_printf_enomem="guessing no";;
+                           esac
+                           ;;
+                           # Guess yes on IRIX.
+          irix*)           gl_cv_func_printf_enomem="guessing yes";;
+                           # Guess yes on OSF/1.
+          osf*)            gl_cv_func_printf_enomem="guessing yes";;
+                           # Guess yes on BeOS.
+          beos*)           gl_cv_func_printf_enomem="guessing yes";;
+                           # Guess yes on Haiku.
+          haiku*)          gl_cv_func_printf_enomem="guessing yes";;
+                           # Guess no on Android.
+          linux*-android*) gl_cv_func_printf_enomem="guessing no";;
+                           # If we don't know, obey --enable-cross-guesses.
+          *)               gl_cv_func_printf_enomem="$gl_cross_guess_normal";;
+        esac
+      fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_enomem" >&5
+printf "%s\n" "$gl_cv_func_printf_enomem" >&6; }
+
+
+
+  case "$gl_cv_func_printf_long_double" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5
+printf %s "checking for wchar_t... " >&6; }
+if test ${gt_cv_c_wchar_t+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stddef.h>
+            wchar_t foo = (wchar_t)'\0';
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gt_cv_c_wchar_t=yes
+else $as_nop
+  gt_cv_c_wchar_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5
+printf "%s\n" "$gt_cv_c_wchar_t" >&6; }
+  if test $gt_cv_c_wchar_t = yes; then
+
+printf "%s\n" "#define HAVE_WCHAR_T 1" >>confdefs.h
+
+  fi
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5
+printf %s "checking for wint_t... " >&6; }
+if test ${gt_cv_c_wint_t+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <wchar.h>
+            wint_t foo = (wchar_t)'\0';
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gt_cv_c_wint_t=yes
+else $as_nop
+  gt_cv_c_wint_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5
+printf "%s\n" "$gt_cv_c_wint_t" >&6; }
+  if test $gt_cv_c_wint_t = yes; then
+
+printf "%s\n" "#define HAVE_WINT_T 1" >>confdefs.h
+
+
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wint_t is large enough" >&5
+printf %s "checking whether wint_t is large enough... " >&6; }
+if test ${gl_cv_type_wint_t_large_enough+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <wchar.h>
+              int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1];
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_type_wint_t_large_enough=yes
+else $as_nop
+  gl_cv_type_wint_t_large_enough=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wint_t_large_enough" >&5
+printf "%s\n" "$gl_cv_type_wint_t_large_enough" >&6; }
+    if test $gl_cv_type_wint_t_large_enough = no; then
+      GNULIBHEADERS_OVERRIDE_WINT_T=1
+    else
+      GNULIBHEADERS_OVERRIDE_WINT_T=0
+    fi
+  else
+    GNULIBHEADERS_OVERRIDE_WINT_T=0
+  fi
+
+
+
+
+
+  if test $ac_cv_header_features_h = yes; then
+    HAVE_FEATURES_H=1
+  else
+    HAVE_FEATURES_H=0
+  fi
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for intmax_t" >&5
+printf %s "checking for intmax_t... " >&6; }
+if test ${gt_cv_c_intmax_t+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stddef.h>
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+
+int
+main (void)
+{
+intmax_t x = -1; return !x;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gt_cv_c_intmax_t=yes
+else $as_nop
+  gt_cv_c_intmax_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_intmax_t" >&5
+printf "%s\n" "$gt_cv_c_intmax_t" >&6; }
+  if test $gt_cv_c_intmax_t = yes; then
+
+printf "%s\n" "#define HAVE_INTMAX_T 1" >>confdefs.h
 
   else
-    gl_func_isnanf_no_libm=no
+
+printf "%s\n" "#define intmax_t long long" >>confdefs.h
+
   fi
 
-      if test $gl_func_isnanf_no_libm != yes; then
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'double'" >&5
+printf %s "checking where to find the exponent in a 'double'... " >&6; }
+if test ${gl_cv_cc_double_expbit0+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+                                                                      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#if defined arm || defined __arm || defined __arm__
+  mixed_endianness
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "mixed_endianness" >/dev/null 2>&1
+then :
+  gl_cv_cc_double_expbit0="unknown"
+else $as_nop
+
+                                                         :
+if test ${ac_cv_c_bigendian+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_cv_c_bigendian=unknown
+    # See if we're dealing with a universal compiler.
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __APPLE_CC__
+	       not a universal capable compiler
+	     #endif
+	     typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+	# Check for potential -arch flags.  It is not universal unless
+	# there are at least two -arch flags with different values.
+	ac_arch=
+	ac_prev=
+	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+	 if test -n "$ac_prev"; then
+	   case $ac_word in
+	     i?86 | x86_64 | ppc | ppc64)
+	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+		 ac_arch=$ac_word
+	       else
+		 ac_cv_c_bigendian=universal
+		 break
+	       fi
+	       ;;
+	   esac
+	   ac_prev=
+	 elif test "x$ac_word" = "x-arch"; then
+	   ac_prev=arch
+	 fi
+       done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if sys/param.h defines the BYTE_ORDER macro.
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+	     #include <sys/param.h>
+
+int
+main (void)
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+		     && LITTLE_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  # It does; now see whether it defined to BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+		#include <sys/param.h>
+
+int
+main (void)
+{
+#if BYTE_ORDER != BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_c_bigendian=yes
+else $as_nop
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main (void)
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  # It does; now see whether it defined to _BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main (void)
+{
+#ifndef _BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_c_bigendian=yes
+else $as_nop
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # Compile a test program.
+      if test "$cross_compiling" = yes
+then :
+  # Try to guess by grepping values from an object file.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+unsigned short int ascii_mm[] =
+		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+		unsigned short int ascii_ii[] =
+		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+		int use_ascii (int i) {
+		  return ascii_mm[i] + ascii_ii[i];
+		}
+		unsigned short int ebcdic_ii[] =
+		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+		unsigned short int ebcdic_mm[] =
+		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+		int use_ebcdic (int i) {
+		  return ebcdic_mm[i] + ebcdic_ii[i];
+		}
+		extern int foo;
+
+int
+main (void)
+{
+return use_ascii (foo) == use_ebcdic (foo);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+	      ac_cv_c_bigendian=yes
+	    fi
+	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+	      if test "$ac_cv_c_bigendian" = unknown; then
+		ac_cv_c_bigendian=no
+	      else
+		# finding both strings is unlikely to happen, but who knows?
+		ac_cv_c_bigendian=unknown
+	      fi
+	    fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main (void)
+{
+
+	     /* Are we little or big endian?  From Harbison&Steele.  */
+	     union
+	     {
+	       long int l;
+	       char c[sizeof (long int)];
+	     } u;
+	     u.l = 1;
+	     return u.c[sizeof (long int) - 1] == 1;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  ac_cv_c_bigendian=no
+else $as_nop
+  ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+    fi
+fi
+:
+ case $ac_cv_c_bigendian in #(
+   yes)
+     gl_cv_cc_double_expbit0="word 0 bit 20";; #(
+   no)
+     gl_cv_cc_double_expbit0="word 1 bit 20" ;; #(
+   universal)
+
+printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+     ;; #(
+   *)
+     gl_cv_cc_double_expbit0="unknown" ;;
+ esac
 
 
+fi
+rm -rf conftest*
 
 
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS isnanf.$ac_objext"
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5
-$as_echo_n "checking where to find the exponent in a 'float'... " >&6; }
-if ${gl_cv_cc_float_expbit0+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      if test "$cross_compiling" = yes; then :
-  gl_cv_cc_float_expbit0="word 0 bit 23"
-else
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -40574,17 +19495,16 @@
 #include <stdio.h>
 #include <string.h>
 #define NWORDS \
-  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-typedef union { float value; unsigned int word[NWORDS]; } memory_float;
+  ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { double value; unsigned int word[NWORDS]; } memory_double;
 static unsigned int ored_words[NWORDS];
 static unsigned int anded_words[NWORDS];
-static void add_to_ored_words (float x)
+static void add_to_ored_words (double x)
 {
-  memory_float m;
+  memory_double m;
   size_t i;
-  /* Clear it first, in case
-     sizeof (float) < sizeof (memory_float).  */
-  memset (&m, 0, sizeof (memory_float));
+  /* Clear it first, in case sizeof (double) < sizeof (memory_double).  */
+  memset (&m, 0, sizeof (memory_double));
   m.value = x;
   for (i = 0; i < NWORDS; i++)
     {
@@ -40600,11 +19520,11 @@
     return 1;
   for (j = 0; j < NWORDS; j++)
     anded_words[j] = ~ (unsigned int) 0;
-  add_to_ored_words (0.25f);
-  add_to_ored_words (0.5f);
-  add_to_ored_words (1.0f);
-  add_to_ored_words (2.0f);
-  add_to_ored_words (4.0f);
+  add_to_ored_words (0.25);
+  add_to_ored_words (0.5);
+  add_to_ored_words (1.0);
+  add_to_ored_words (2.0);
+  add_to_ored_words (4.0);
   /* Remove bits that are common (e.g. if representation of the first mantissa
      bit is explicit).  */
   for (j = 0; j < NWORDS; j++)
@@ -40634,10 +19554,11 @@
 }
 
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_cc_float_expbit0=`cat conftest.out`
-else
-  gl_cv_cc_float_expbit0="unknown"
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_cc_double_expbit0=`cat conftest.out`
+else $as_nop
+  gl_cv_cc_double_expbit0="unknown"
 fi
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
   conftest.$ac_objext conftest.beam conftest.$ac_ext
@@ -40646,775 +19567,128 @@
       rm -f conftest.out
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5
-$as_echo "$gl_cv_cc_float_expbit0" >&6; }
-  case "$gl_cv_cc_float_expbit0" in
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_expbit0" >&5
+printf "%s\n" "$gl_cv_cc_double_expbit0" >&6; }
+  case "$gl_cv_cc_double_expbit0" in
     word*bit*)
-      word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
-      bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'`
+      word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+      bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'`
 
-cat >>confdefs.h <<_ACEOF
-#define FLT_EXPBIT0_WORD $word
-_ACEOF
+printf "%s\n" "#define DBL_EXPBIT0_WORD $word" >>confdefs.h
 
 
-cat >>confdefs.h <<_ACEOF
-#define FLT_EXPBIT0_BIT $bit
-_ACEOF
+printf "%s\n" "#define DBL_EXPBIT0_BIT $bit" >>confdefs.h
 
       ;;
   esac
 
 
-      fi
-      gl_gnulib_enabled_3f0e593033d1fc2c127581960f641b66=true
-    fi
-  }
-  func_gl_gnulib_m4code_ldexp ()
-  {
-    if ! $gl_gnulib_enabled_ldexp; then
 
 
-  LDEXP_LIBM=
-  if test $gl_cv_func_ldexp_no_libm = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexp() can be used with libm" >&5
-$as_echo_n "checking whether ldexp() can be used with libm... " >&6; }
-if ${gl_cv_func_ldexp_in_libm+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
 
-        save_LIBS="$LIBS"
-        LIBS="$LIBS -lm"
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifndef __NO_MATH_INLINES
-                             # define __NO_MATH_INLINES 1 /* for glibc */
-                             #endif
-                             #include <math.h>
-                             double (*funcptr) (double, int) = ldexp;
-                             double x;
-int
-main ()
-{
-return ldexp (x, -1) > 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gl_cv_func_ldexp_in_libm=yes
-else
-  gl_cv_func_ldexp_in_libm=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-        LIBS="$save_LIBS"
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_in_libm" >&5
-$as_echo "$gl_cv_func_ldexp_in_libm" >&6; }
-    if test $gl_cv_func_ldexp_in_libm = yes; then
-      LDEXP_LIBM=-lm
-    fi
-  fi
 
 
-      gl_gnulib_enabled_ldexp=true
-    fi
-  }
-  func_gl_gnulib_m4code_21ee726a3540c09237a8e70c0baf7467 ()
-  {
-    if ! $gl_gnulib_enabled_21ee726a3540c09237a8e70c0baf7467; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf returns a byte count as in C99" >&5
+printf %s "checking whether snprintf returns a byte count as in C99... " >&6; }
+if test ${gl_cv_func_snprintf_retval_c99+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the __inline keyword" >&5
-$as_echo_n "checking whether the compiler supports the __inline keyword... " >&6; }
-if ${gl_cv_c___inline+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-typedef int foo_t;
-           static __inline foo_t foo (void) { return 0; }
-int
-main ()
-{
-return foo ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gl_cv_c___inline=yes
-else
-  gl_cv_c___inline=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c___inline" >&5
-$as_echo "$gl_cv_c___inline" >&6; }
-  if test $gl_cv_c___inline = yes; then
-
-$as_echo "#define HAVE___INLINE 1" >>confdefs.h
-
-  fi
-
-      gl_gnulib_enabled_21ee726a3540c09237a8e70c0baf7467=true
-    fi
-  }
-  func_gl_gnulib_m4code_2049e887c7e5308faad27b3f894bb8c9 ()
-  {
-    if ! $gl_gnulib_enabled_2049e887c7e5308faad27b3f894bb8c9; then
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS localtime-buffer.$ac_objext"
-
-      gl_gnulib_enabled_2049e887c7e5308faad27b3f894bb8c9=true
-    fi
-  }
-  func_gl_gnulib_m4code_lstat ()
-  {
-    if ! $gl_gnulib_enabled_lstat; then
-
-
-
-
-  if test $ac_cv_func_lstat = yes; then
-
-    case $host_os,$gl_cv_func_lstat_dereferences_slashed_symlink in
-      solaris* | *no)
-        REPLACE_LSTAT=1
-        ;;
-    esac
-  else
-    HAVE_LSTAT=0
-  fi
-
-      if test $REPLACE_LSTAT = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS lstat.$ac_objext"
-
-        :
-      fi
-
-
-
-
-
-          GNULIB_LSTAT=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_LSTAT 1" >>confdefs.h
-
-
-
-      gl_gnulib_enabled_lstat=true
-      if test $REPLACE_LSTAT = 1; then
-        func_gl_gnulib_m4code_stat
-      fi
-      if test $REPLACE_LSTAT = 1; then
-        func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c
-      fi
-      func_gl_gnulib_m4code_sys_stat
-    fi
-  }
-  func_gl_gnulib_m4code_malloca ()
-  {
-    if ! $gl_gnulib_enabled_malloca; then
-
-
-
-
-      gl_gnulib_enabled_malloca=true
-    fi
-  }
-  func_gl_gnulib_m4code_332607f759618fb73dfc3076748afea7 ()
-  {
-    if ! $gl_gnulib_enabled_332607f759618fb73dfc3076748afea7; then
-
-
-
-      if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS spawni.$ac_objext"
-
-
-  for ac_header in paths.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "paths.h" "ac_cv_header_paths_h" "$ac_includes_default"
-if test "x$ac_cv_header_paths_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_PATHS_H 1
-_ACEOF
-
-fi
-
-done
-
-  for ac_func in confstr sched_setparam sched_setscheduler setegid seteuid vfork
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-      fi
-      gl_gnulib_enabled_332607f759618fb73dfc3076748afea7=true
-      func_gl_gnulib_m4code_cdeb0f2aaf9d280baa6526bfa1b07f70
-      func_gl_gnulib_m4code_strchrnul
-    fi
-  }
-  func_gl_gnulib_m4code_rawmemchr ()
-  {
-    if ! $gl_gnulib_enabled_rawmemchr; then
-
-
-
-
-  for ac_func in rawmemchr
-do :
-  ac_fn_c_check_func "$LINENO" "rawmemchr" "ac_cv_func_rawmemchr"
-if test "x$ac_cv_func_rawmemchr" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_RAWMEMCHR 1
-_ACEOF
-
-fi
-done
-
-  if test $ac_cv_func_rawmemchr = no; then
-    HAVE_RAWMEMCHR=0
-  fi
-
-      if test $HAVE_RAWMEMCHR = 0; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS rawmemchr.$ac_objext"
-
-        :
-      fi
-
-
-
-
-
-          GNULIB_RAWMEMCHR=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_RAWMEMCHR 1" >>confdefs.h
-
-
-
-      gl_gnulib_enabled_rawmemchr=true
-    fi
-  }
-  func_gl_gnulib_m4code_rmdir ()
-  {
-    if ! $gl_gnulib_enabled_rmdir; then
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rmdir works" >&5
-$as_echo_n "checking whether rmdir works... " >&6; }
-if ${gl_cv_func_rmdir_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  mkdir conftest.dir
-     touch conftest.file
-     if test "$cross_compiling" = yes; then :
+      if test "$cross_compiling" = yes
+then :
   case "$host_os" in
-                           # Guess yes on Linux systems.
-          linux-* | linux) gl_cv_func_rmdir_works="guessing yes" ;;
-                           # Guess yes on glibc systems.
-          *-gnu* | gnu*)   gl_cv_func_rmdir_works="guessing yes" ;;
-                           # Guess no on native Windows.
-          mingw*)          gl_cv_func_rmdir_works="guessing no" ;;
-                           # If we don't know, obey --enable-cross-guesses.
-          *)               gl_cv_func_rmdir_works="$gl_cross_guess_normal" ;;
-        esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-           #include <errno.h>
-           #if HAVE_UNISTD_H
-           # include <unistd.h>
-           #else /* on Windows with MSVC */
-           # include <direct.h>
-           #endif
-
-int
-main ()
-{
-int result = 0;
-      if (!rmdir ("conftest.file/"))
-        result |= 1;
-      else if (errno != ENOTDIR)
-        result |= 2;
-      if (!rmdir ("conftest.dir/./"))
-        result |= 4;
-      return result;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_rmdir_works=yes
-else
-  gl_cv_func_rmdir_works=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-     rm -rf conftest.dir conftest.file
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rmdir_works" >&5
-$as_echo "$gl_cv_func_rmdir_works" >&6; }
-  case "$gl_cv_func_rmdir_works" in
-    *yes) ;;
-    *)
-      REPLACE_RMDIR=1
-      ;;
-  esac
-
-      if test $REPLACE_RMDIR = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS rmdir.$ac_objext"
-
-      fi
-
-
-
-
-
-          GNULIB_RMDIR=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_RMDIR 1" >>confdefs.h
-
-
-
-      gl_gnulib_enabled_rmdir=true
-      if test $REPLACE_RMDIR = 1; then
-        func_gl_gnulib_m4code_sys_stat
-      fi
-    fi
-  }
-  func_gl_gnulib_m4code_9bc5f216d57e231e4834049d67d0db62 ()
-  {
-    if ! $gl_gnulib_enabled_9bc5f216d57e231e4834049d67d0db62; then
-      gl_gnulib_enabled_9bc5f216d57e231e4834049d67d0db62=true
-    fi
-  }
-  func_gl_gnulib_m4code_cdeb0f2aaf9d280baa6526bfa1b07f70 ()
-  {
-    if ! $gl_gnulib_enabled_cdeb0f2aaf9d280baa6526bfa1b07f70; then
-
-
-
-      gl_gnulib_enabled_cdeb0f2aaf9d280baa6526bfa1b07f70=true
-    fi
-  }
-  func_gl_gnulib_m4code_stat ()
-  {
-    if ! $gl_gnulib_enabled_stat; then
-
-
-
-
-  case "$host_os" in
-    mingw*)
-                  REPLACE_STAT=1
-      ;;
-    *)
-                        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat handles trailing slashes on files" >&5
-$as_echo_n "checking whether stat handles trailing slashes on files... " >&6; }
-if ${gl_cv_func_stat_file_slash+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  touch conftest.tmp
-         # Assume that if we have lstat, we can also check symlinks.
-         if test $ac_cv_func_lstat = yes; then
-           ln -s conftest.tmp conftest.lnk
-         fi
-         if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-                               # Guess yes on Linux systems.
-              linux-* | linux) gl_cv_func_stat_file_slash="guessing yes" ;;
-                               # Guess yes on glibc systems.
-              *-gnu* | gnu*)   gl_cv_func_stat_file_slash="guessing yes" ;;
-                               # If we don't know, obey --enable-cross-guesses.
-              *)               gl_cv_func_stat_file_slash="$gl_cross_guess_normal" ;;
-            esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/stat.h>
-
-int
-main ()
-{
-int result = 0;
-               struct stat st;
-               if (!stat ("conftest.tmp/", &st))
-                 result |= 1;
-#if HAVE_LSTAT
-               if (!stat ("conftest.lnk/", &st))
-                 result |= 2;
-#endif
-               return result;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_stat_file_slash=yes
-else
-  gl_cv_func_stat_file_slash=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-         rm -f conftest.tmp conftest.lnk
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_stat_file_slash" >&5
-$as_echo "$gl_cv_func_stat_file_slash" >&6; }
-      case $gl_cv_func_stat_file_slash in
-        *no)
-          REPLACE_STAT=1
-
-$as_echo "#define REPLACE_FUNC_STAT_FILE 1" >>confdefs.h
-;;
-      esac
-      case $host_os in
-                solaris*)
-          REPLACE_FSTAT=1 ;;
-      esac
-      ;;
-  esac
-
-      if test $REPLACE_STAT = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS stat.$ac_objext"
-
-        case "$host_os" in
-          mingw*)
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS stat-w32.$ac_objext"
-
-            ;;
-        esac
-
-
-  :
-
-      fi
-
-
-
-
-
-          GNULIB_STAT=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_STAT 1" >>confdefs.h
-
-
-
-      gl_gnulib_enabled_stat=true
-      if test $REPLACE_STAT = 1; then
-        func_gl_gnulib_m4code_malloca
-      fi
-      if test $REPLACE_STAT = 1; then
-        func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c
-      fi
-      func_gl_gnulib_m4code_sys_stat
-    fi
-  }
-  func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c ()
-  {
-    if ! $gl_gnulib_enabled_0137e3d3638b33e5819d132d0b23165c; then
-
-
-
-
-  ac_fn_c_check_member "$LINENO" "struct stat" "st_atim.tv_nsec" "ac_cv_member_struct_stat_st_atim_tv_nsec" "#include <sys/types.h>
-     #include <sys/stat.h>
-"
-if test "x$ac_cv_member_struct_stat_st_atim_tv_nsec" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC 1
-_ACEOF
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct stat.st_atim is of type struct timespec" >&5
-$as_echo_n "checking whether struct stat.st_atim is of type struct timespec... " >&6; }
-if ${ac_cv_typeof_struct_stat_st_atim_is_struct_timespec+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+                                 # Guess yes on glibc systems.
+           *-gnu* | gnu*)        gl_cv_func_snprintf_retval_c99="guessing yes";;
+                                 # Guess yes on musl systems.
+           *-musl*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
+                                 # Guess yes on FreeBSD >= 5.
+           freebsd[1-4].*)       gl_cv_func_snprintf_retval_c99="guessing no";;
+           freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+           midnightbsd*)         gl_cv_func_snprintf_retval_c99="guessing yes";;
+                                 # Guess yes on Mac OS X >= 10.3.
+           darwin[1-6].*)        gl_cv_func_snprintf_retval_c99="guessing no";;
+           darwin*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
+                                 # Guess yes on OpenBSD >= 3.9.
+           openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+                                 gl_cv_func_snprintf_retval_c99="guessing no";;
+           openbsd*)             gl_cv_func_snprintf_retval_c99="guessing yes";;
+                                 # Guess yes on Solaris >= 2.10.
+           solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
+           solaris*)             gl_cv_func_printf_sizes_c99="guessing no";;
+                                 # Guess yes on AIX >= 4.
+           aix[1-3]*)            gl_cv_func_snprintf_retval_c99="guessing no";;
+           aix*)                 gl_cv_func_snprintf_retval_c99="guessing yes";;
+                                 # Guess yes on NetBSD >= 3.
+           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+                                 gl_cv_func_snprintf_retval_c99="guessing no";;
+           netbsd*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
+                                 # Guess yes on BeOS.
+           beos*)                gl_cv_func_snprintf_retval_c99="guessing yes";;
+                                 # Guess yes on Android.
+           linux*-android*)      gl_cv_func_snprintf_retval_c99="guessing yes";;
+                                 # Guess yes on MSVC, no on mingw.
+           mingw*)               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-            #include <sys/types.h>
-            #include <sys/stat.h>
-            #if HAVE_SYS_TIME_H
-            # include <sys/time.h>
-            #endif
-            #include <time.h>
-            struct timespec ts;
-            struct stat st;
-
-int
-main ()
-{
-
-            st.st_atim = ts;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=yes
-else
-  ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec" >&5
-$as_echo "$ac_cv_typeof_struct_stat_st_atim_is_struct_timespec" >&6; }
-     if test $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec = yes; then
-
-$as_echo "#define TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC 1" >>confdefs.h
-
-     fi
-else
-  ac_fn_c_check_member "$LINENO" "struct stat" "st_atimespec.tv_nsec" "ac_cv_member_struct_stat_st_atimespec_tv_nsec" "#include <sys/types.h>
-        #include <sys/stat.h>
-"
-if test "x$ac_cv_member_struct_stat_st_atimespec_tv_nsec" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC 1
-_ACEOF
-
-
-else
-  ac_fn_c_check_member "$LINENO" "struct stat" "st_atimensec" "ac_cv_member_struct_stat_st_atimensec" "#include <sys/types.h>
-           #include <sys/stat.h>
-"
-if test "x$ac_cv_member_struct_stat_st_atimensec" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_STRUCT_STAT_ST_ATIMENSEC 1
-_ACEOF
-
-
-else
-  ac_fn_c_check_member "$LINENO" "struct stat" "st_atim.st__tim.tv_nsec" "ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec" "#include <sys/types.h>
-              #include <sys/stat.h>
-"
-if test "x$ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC 1
-_ACEOF
-
-
-fi
-
-fi
-
-fi
-
-fi
-
-
-
-
-
-  ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimespec.tv_nsec" "ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" "#include <sys/types.h>
-     #include <sys/stat.h>
-"
-if test "x$ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC 1
-_ACEOF
-
-
-else
-  ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimensec" "ac_cv_member_struct_stat_st_birthtimensec" "#include <sys/types.h>
-        #include <sys/stat.h>
-"
-if test "x$ac_cv_member_struct_stat_st_birthtimensec" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC 1
-_ACEOF
-
-
-else
-  ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtim.tv_nsec" "ac_cv_member_struct_stat_st_birthtim_tv_nsec" "#include <sys/types.h>
-          #include <sys/stat.h>
-"
-if test "x$ac_cv_member_struct_stat_st_birthtim_tv_nsec" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC 1
-_ACEOF
-
-
-fi
-
-fi
-
-fi
-
-
-      gl_gnulib_enabled_0137e3d3638b33e5819d132d0b23165c=true
-    fi
-  }
-  func_gl_gnulib_m4code_strchrnul ()
-  {
-    if ! $gl_gnulib_enabled_strchrnul; then
-
-
-
-
-  for ac_func in strchrnul
-do :
-  ac_fn_c_check_func "$LINENO" "strchrnul" "ac_cv_func_strchrnul"
-if test "x$ac_cv_func_strchrnul" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_STRCHRNUL 1
-_ACEOF
-
-fi
-done
-
-  if test $ac_cv_func_strchrnul = no; then
-    HAVE_STRCHRNUL=0
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strchrnul works" >&5
-$as_echo_n "checking whether strchrnul works... " >&6; }
-if ${gl_cv_func_strchrnul_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#if defined __CYGWIN__
- #include <cygwin/version.h>
- #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 9)
-  Lucky user
- #endif
-#else
-  Lucky user
+#ifdef _MSC_VER
+ Known
 #endif
 
 _ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Lucky user" >/dev/null 2>&1; then :
-  gl_cv_func_strchrnul_works="guessing yes"
-else
-  gl_cv_func_strchrnul_works="guessing no"
+  $EGREP "Known" >/dev/null 2>&1
+then :
+  gl_cv_func_snprintf_retval_c99="guessing yes"
+else $as_nop
+  gl_cv_func_snprintf_retval_c99="guessing no"
 fi
-rm -f conftest*
+rm -rf conftest*
 
+                                 ;;
+                                 # If we don't know, obey --enable-cross-guesses.
+           *)                    gl_cv_func_snprintf_retval_c99="$gl_cross_guess_normal";;
+         esac
 
-else
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-#include <string.h> /* for strchrnul */
-
-int
-main ()
+#include <stdio.h>
+#include <string.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
 {
-const char *buf = "a";
-      return strchrnul (buf, 'b') != buf + 1;
-
-  ;
+  va_list args;
+  int ret;
+  va_start (args, format);
+  ret = vsnprintf (buf, size, format, args);
+  va_end (args);
+  return ret;
+}
+#endif
+static char buf[100];
+int main ()
+{
+  strcpy (buf, "ABCDEF");
+  if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7)
+    return 1;
+  if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7)
+    return 2;
+  if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7)
+    return 3;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  gl_cv_func_strchrnul_works=yes
-else
-  gl_cv_func_strchrnul_works=no
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_snprintf_retval_c99=yes
+else $as_nop
+  gl_cv_func_snprintf_retval_c99=no
 fi
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
   conftest.$ac_objext conftest.beam conftest.$ac_ext
@@ -41422,240 +19696,1047 @@
 
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strchrnul_works" >&5
-$as_echo "$gl_cv_func_strchrnul_works" >&6; }
-    case "$gl_cv_func_strchrnul_works" in
-      *yes) ;;
-      *) REPLACE_STRCHRNUL=1 ;;
-    esac
-  fi
-
-      if test $HAVE_STRCHRNUL = 0 || test $REPLACE_STRCHRNUL = 1; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_retval_c99" >&5
+printf "%s\n" "$gl_cv_func_snprintf_retval_c99" >&6; }
 
 
 
 
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf truncates the result as in C99" >&5
+printf %s "checking whether snprintf truncates the result as in C99... " >&6; }
+if test ${gl_cv_func_snprintf_truncation_c99+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
+      if test "$cross_compiling" = yes
+then :
 
+         case "$host_os" in
+                                 # Guess yes on glibc systems.
+           *-gnu* | gnu*)        gl_cv_func_snprintf_truncation_c99="guessing yes";;
+                                 # Guess yes on musl systems.
+           *-musl*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
+                                 # Guess yes on FreeBSD >= 5.
+           freebsd[1-4].*)       gl_cv_func_snprintf_truncation_c99="guessing no";;
+           freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+           midnightbsd*)         gl_cv_func_snprintf_truncation_c99="guessing yes";;
+                                 # Guess yes on Mac OS X >= 10.3.
+           darwin[1-6].*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
+           darwin*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
+                                 # Guess yes on OpenBSD >= 3.9.
+           openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
+           openbsd*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
+                                 # Guess yes on Solaris >= 2.6.
+           solaris2.[0-5] | solaris2.[0-5].*)
+                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
+           solaris*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
+                                 # Guess yes on AIX >= 4.
+           aix[1-3]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
+           aix*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
+                                 # Guess yes on HP-UX >= 11.
+           hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+           hpux*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
+                                 # Guess yes on IRIX >= 6.5.
+           irix6.5)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
+                                 # Guess yes on OSF/1 >= 5.
+           osf[3-4]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
+           osf*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
+                                 # Guess yes on NetBSD >= 3.
+           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
+           netbsd*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
+                                 # Guess yes on BeOS.
+           beos*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
+                                 # Guess yes on Android.
+           linux*-android*)      gl_cv_func_snprintf_truncation_c99="guessing yes";;
+                                 # Guess no on native Windows.
+           mingw*)               gl_cv_func_snprintf_truncation_c99="guessing no";;
+                                 # If we don't know, obey --enable-cross-guesses.
+           *)                    gl_cv_func_snprintf_truncation_c99="$gl_cross_guess_normal";;
+         esac
 
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-  gl_LIBOBJS="$gl_LIBOBJS strchrnul.$ac_objext"
-
-        :
-      fi
-
-
-
-
-
-          GNULIB_STRCHRNUL=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_STRCHRNUL 1" >>confdefs.h
-
-
-
-      gl_gnulib_enabled_strchrnul=true
-      if test $HAVE_STRCHRNUL = 0 || test $REPLACE_STRCHRNUL = 1; then
-        func_gl_gnulib_m4code_rawmemchr
-      fi
-    fi
-  }
-  func_gl_gnulib_m4code_dbb57f49352be8fb86869629a254fb72 ()
-  {
-    if ! $gl_gnulib_enabled_dbb57f49352be8fb86869629a254fb72; then
-
-
-      if test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS strerror-override.$ac_objext"
-
-
-
-
-
-  if test $ac_cv_header_sys_socket_h != yes; then
-                    for ac_header in winsock2.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
-if test "x$ac_cv_header_winsock2_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_WINSOCK2_H 1
+#include <stdio.h>
+#include <string.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+  va_list args;
+  int ret;
+  va_start (args, format);
+  ret = vsnprintf (buf, size, format, args);
+  va_end (args);
+  return ret;
+}
+#endif
+static char buf[100];
+int main ()
+{
+  strcpy (buf, "ABCDEF");
+  my_snprintf (buf, 3, "%d %d", 4567, 89);
+  if (memcmp (buf, "45\0DEF", 6) != 0)
+    return 1;
+  return 0;
+}
 _ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_snprintf_truncation_c99=yes
+else $as_nop
+  gl_cv_func_snprintf_truncation_c99=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_truncation_c99" >&5
+printf "%s\n" "$gl_cv_func_snprintf_truncation_c99" >&6; }
+
+
+
+
+
+  ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf"
+if test "x$ac_cv_func_snprintf" = xyes
+then :
+  printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "strnlen" "ac_cv_func_strnlen"
+if test "x$ac_cv_func_strnlen" = xyes
+then :
+  printf "%s\n" "#define HAVE_STRNLEN 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "wcslen" "ac_cv_func_wcslen"
+if test "x$ac_cv_func_wcslen" = xyes
+then :
+  printf "%s\n" "#define HAVE_WCSLEN 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "wcsnlen" "ac_cv_func_wcsnlen"
+if test "x$ac_cv_func_wcsnlen" = xyes
+then :
+  printf "%s\n" "#define HAVE_WCSNLEN 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "mbrtowc" "ac_cv_func_mbrtowc"
+if test "x$ac_cv_func_mbrtowc" = xyes
+then :
+  printf "%s\n" "#define HAVE_MBRTOWC 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "wcrtomb" "ac_cv_func_wcrtomb"
+if test "x$ac_cv_func_wcrtomb" = xyes
+then :
+  printf "%s\n" "#define HAVE_WCRTOMB 1" >>confdefs.h
 
 fi
 
-done
-
-  fi
-  if test "$ac_cv_header_winsock2_h" = yes; then
-    HAVE_WINSOCK2_H=1
-    UNISTD_H_HAVE_WINSOCK2_H=1
-    SYS_IOCTL_H_HAVE_WINSOCK2_H=1
-  else
-    HAVE_WINSOCK2_H=0
-  fi
-
-
-      fi
-      gl_gnulib_enabled_dbb57f49352be8fb86869629a254fb72=true
-    fi
-  }
-  func_gl_gnulib_m4code_1f32594a85e6221ba15f884daeee8c2a ()
-  {
-    if ! $gl_gnulib_enabled_1f32594a85e6221ba15f884daeee8c2a; then
+      ac_fn_check_decl "$LINENO" "_snprintf" "ac_cv_have_decl__snprintf" "#include <stdio.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl__snprintf" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL__SNPRINTF $ac_have_decl" >>confdefs.h
 
 
 
+  case "$gl_cv_func_snprintf_retval_c99" in
+    *yes)
+
+printf "%s\n" "#define HAVE_SNPRINTF_RETVAL_C99 1" >>confdefs.h
+
+      ;;
+  esac
+
+  case "$gl_cv_func_snprintf_truncation_c99" in
+    *yes)
+
+printf "%s\n" "#define HAVE_SNPRINTF_TRUNCATION_C99 1" >>confdefs.h
+
+      ;;
+  esac
 
 
+    HAVE_ACOSF=1;
+  HAVE_ACOSL=1;
+  HAVE_ASINF=1;
+  HAVE_ASINL=1;
+  HAVE_ATANF=1;
+  HAVE_ATANL=1;
+  HAVE_ATAN2F=1;
+  HAVE_CBRT=1;
+  HAVE_CBRTF=1;
+  HAVE_CBRTL=1;
+  HAVE_COPYSIGN=1;
+  HAVE_COPYSIGNL=1;
+  HAVE_COSF=1;
+  HAVE_COSL=1;
+  HAVE_COSHF=1;
+  HAVE_EXPF=1;
+  HAVE_EXPL=1;
+  HAVE_EXPM1=1;
+  HAVE_EXPM1F=1;
+  HAVE_FABSF=1;
+  HAVE_FABSL=1;
+  HAVE_FMA=1;
+  HAVE_FMAF=1;
+  HAVE_FMAL=1;
+  HAVE_FMODF=1;
+  HAVE_FMODL=1;
+  HAVE_FREXPF=1;
+  HAVE_HYPOTF=1;
+  HAVE_HYPOTL=1;
+  HAVE_ILOGB=1;
+  HAVE_ILOGBF=1;
+  HAVE_ILOGBL=1;
+  HAVE_ISNANF=1;
+  HAVE_ISNAND=1;
+  HAVE_ISNANL=1;
+  HAVE_LDEXPF=1;
+  HAVE_LOGF=1;
+  HAVE_LOGL=1;
+  HAVE_LOG10F=1;
+  HAVE_LOG10L=1;
+  HAVE_LOG1P=1;
+  HAVE_LOG1PF=1;
+  HAVE_LOG1PL=1;
+  HAVE_LOGBF=1;
+  HAVE_LOGBL=1;
+  HAVE_MODFF=1;
+  HAVE_MODFL=1;
+  HAVE_POWF=1;
+  HAVE_REMAINDER=1;
+  HAVE_REMAINDERF=1;
+  HAVE_RINT=1;
+  HAVE_RINTL=1;
+  HAVE_SINF=1;
+  HAVE_SINL=1;
+  HAVE_SINHF=1;
+  HAVE_SQRTF=1;
+  HAVE_SQRTL=1;
+  HAVE_TANF=1;
+  HAVE_TANL=1;
+  HAVE_TANHF=1;
+  HAVE_DECL_ACOSL=1;
+  HAVE_DECL_ASINL=1;
+  HAVE_DECL_ATANL=1;
+  HAVE_DECL_CBRTF=1;
+  HAVE_DECL_CBRTL=1;
+  HAVE_DECL_CEILF=1;
+  HAVE_DECL_CEILL=1;
+  HAVE_DECL_COPYSIGNF=1;
+  HAVE_DECL_COSL=1;
+  HAVE_DECL_EXPL=1;
+  HAVE_DECL_EXP2=1;
+  HAVE_DECL_EXP2F=1;
+  HAVE_DECL_EXP2L=1;
+  HAVE_DECL_EXPM1L=1;
+  HAVE_DECL_FLOORF=1;
+  HAVE_DECL_FLOORL=1;
+  HAVE_DECL_FREXPL=1;
+  HAVE_DECL_LDEXPL=1;
+  HAVE_DECL_LOGL=1;
+  HAVE_DECL_LOG10L=1;
+  HAVE_DECL_LOG2=1;
+  HAVE_DECL_LOG2F=1;
+  HAVE_DECL_LOG2L=1;
+  HAVE_DECL_LOGB=1;
+  HAVE_DECL_REMAINDER=1;
+  HAVE_DECL_REMAINDERL=1;
+  HAVE_DECL_RINTF=1;
+  HAVE_DECL_ROUND=1;
+  HAVE_DECL_ROUNDF=1;
+  HAVE_DECL_ROUNDL=1;
+  HAVE_DECL_SINL=1;
+  HAVE_DECL_SQRTL=1;
+  HAVE_DECL_TANL=1;
+  HAVE_DECL_TRUNC=1;
+  HAVE_DECL_TRUNCF=1;
+  HAVE_DECL_TRUNCL=1;
+  REPLACE_ACOSF=0;
+  REPLACE_ASINF=0;
+  REPLACE_ATANF=0;
+  REPLACE_ATAN2F=0;
+  REPLACE_CBRTF=0;
+  REPLACE_CBRTL=0;
+  REPLACE_CEIL=0;
+  REPLACE_CEILF=0;
+  REPLACE_CEILL=0;
+  REPLACE_COSF=0;
+  REPLACE_COSHF=0;
+  REPLACE_EXPF=0;
+  REPLACE_EXPL=0;
+  REPLACE_EXPM1=0;
+  REPLACE_EXPM1F=0;
+  REPLACE_EXPM1L=0;
+  REPLACE_EXP2=0;
+  REPLACE_EXP2L=0;
+  REPLACE_FABSL=0;
+  REPLACE_FLOOR=0;
+  REPLACE_FLOORF=0;
+  REPLACE_FLOORL=0;
+  REPLACE_FMA=0;
+  REPLACE_FMAF=0;
+  REPLACE_FMAL=0;
+  REPLACE_FMOD=0;
+  REPLACE_FMODF=0;
+  REPLACE_FMODL=0;
+  REPLACE_FREXPF=0;
+  REPLACE_FREXP=0;
+  REPLACE_FREXPL=0;
+  REPLACE_HUGE_VAL=0;
+  REPLACE_HYPOT=0;
+  REPLACE_HYPOTF=0;
+  REPLACE_HYPOTL=0;
+  REPLACE_ILOGB=0;
+  REPLACE_ILOGBF=0;
+  REPLACE_ILOGBL=0;
+  REPLACE_ISFINITE=0;
+  REPLACE_ISINF=0;
+  REPLACE_ISNAN=0;
+  REPLACE_LDEXPL=0;
+  REPLACE_LOG=0;
+  REPLACE_LOGF=0;
+  REPLACE_LOGL=0;
+  REPLACE_LOG10=0;
+  REPLACE_LOG10F=0;
+  REPLACE_LOG10L=0;
+  REPLACE_LOG1P=0;
+  REPLACE_LOG1PF=0;
+  REPLACE_LOG1PL=0;
+  REPLACE_LOG2=0;
+  REPLACE_LOG2F=0;
+  REPLACE_LOG2L=0;
+  REPLACE_LOGB=0;
+  REPLACE_LOGBF=0;
+  REPLACE_LOGBL=0;
+  REPLACE_MODF=0;
+  REPLACE_MODFF=0;
+  REPLACE_MODFL=0;
+  REPLACE_NAN=0;
+  REPLACE_REMAINDER=0;
+  REPLACE_REMAINDERF=0;
+  REPLACE_REMAINDERL=0;
+  REPLACE_RINTL=0;
+  REPLACE_ROUND=0;
+  REPLACE_ROUNDF=0;
+  REPLACE_ROUNDL=0;
+  REPLACE_SIGNBIT=0;
+  REPLACE_SIGNBIT_USING_BUILTINS=0;
+  REPLACE_SINF=0;
+  REPLACE_SINHF=0;
+  REPLACE_SQRTF=0;
+  REPLACE_SQRTL=0;
+  REPLACE_TANF=0;
+  REPLACE_TANHF=0;
+  REPLACE_TRUNC=0;
+  REPLACE_TRUNCF=0;
+  REPLACE_TRUNCL=0;
 
 
-  if test $ac_cv_have_decl_strerror_r = no; then
-    HAVE_DECL_STRERROR_R=0
-  fi
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexp() can be used without linking with libm" >&5
+printf %s "checking whether frexp() can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_frexp_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
-  if test $ac_cv_func_strerror_r = yes; then
-    if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
-      if test $gl_cv_func_strerror_r_posix_signature = yes; then
-        case "$gl_cv_func_strerror_r_works" in
-                    *no) REPLACE_STRERROR_R=1 ;;
-        esac
-      else
-                REPLACE_STRERROR_R=1
-      fi
-    else
-                  REPLACE_STRERROR_R=1
-    fi
-  fi
-
-      if test $HAVE_DECL_STRERROR_R = 0 || test $REPLACE_STRERROR_R = 1; then
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS strerror_r.$ac_objext"
-
-
-
-
-
-
-      fi
-
-
-
-
-
-          GNULIB_STRERROR_R=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_STRERROR_R 1" >>confdefs.h
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define GNULIB_STRERROR_R_POSIX 1
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             double x;
+int
+main (void)
+{
+int e; return frexp (x, &e) > 0;
+  ;
+  return 0;
+}
 _ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_frexp_no_libm=yes
+else $as_nop
+  gl_cv_func_frexp_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_no_libm" >&5
+printf "%s\n" "$gl_cv_func_frexp_no_libm" >&6; }
+
+ac_fn_check_decl "$LINENO" "alarm" "ac_cv_have_decl_alarm" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_alarm" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_ALARM $ac_have_decl" >>confdefs.h
 
 
-      gl_gnulib_enabled_1f32594a85e6221ba15f884daeee8c2a=true
-      if test $HAVE_DECL_STRERROR_R = 0 || test $REPLACE_STRERROR_R = 1; then
-        func_gl_gnulib_m4code_dbb57f49352be8fb86869629a254fb72
-      fi
-    fi
-  }
-  func_gl_gnulib_m4code_strnlen ()
-  {
-    if ! $gl_gnulib_enabled_strnlen; then
+
+  GL_GNULIB_ACOSF=0
+
+
+
+  GL_GNULIB_ACOSL=0
+
+
+
+  GL_GNULIB_ASINF=0
+
+
+
+  GL_GNULIB_ASINL=0
+
+
+
+  GL_GNULIB_ATANF=0
+
+
+
+  GL_GNULIB_ATANL=0
+
+
+
+  GL_GNULIB_ATAN2F=0
+
+
+
+  GL_GNULIB_CBRT=0
+
+
+
+  GL_GNULIB_CBRTF=0
+
+
+
+  GL_GNULIB_CBRTL=0
+
+
+
+  GL_GNULIB_CEIL=0
+
+
+
+  GL_GNULIB_CEILF=0
+
+
+
+  GL_GNULIB_CEILL=0
+
+
+
+  GL_GNULIB_COPYSIGN=0
+
+
+
+  GL_GNULIB_COPYSIGNF=0
+
+
+
+  GL_GNULIB_COPYSIGNL=0
+
+
+
+  GL_GNULIB_COSF=0
+
+
+
+  GL_GNULIB_COSL=0
+
+
+
+  GL_GNULIB_COSHF=0
+
+
+
+  GL_GNULIB_EXPF=0
+
+
+
+  GL_GNULIB_EXPL=0
+
+
+
+  GL_GNULIB_EXP2=0
+
+
+
+  GL_GNULIB_EXP2F=0
+
+
+
+  GL_GNULIB_EXP2L=0
+
+
+
+  GL_GNULIB_EXPM1=0
+
+
+
+  GL_GNULIB_EXPM1F=0
+
+
+
+  GL_GNULIB_EXPM1L=0
+
+
+
+  GL_GNULIB_FABSF=0
+
+
+
+  GL_GNULIB_FABSL=0
+
+
+
+  GL_GNULIB_FLOOR=0
+
+
+
+  GL_GNULIB_FLOORF=0
+
+
+
+  GL_GNULIB_FLOORL=0
+
+
+
+  GL_GNULIB_FMA=0
+
+
+
+  GL_GNULIB_FMAF=0
+
+
+
+  GL_GNULIB_FMAL=0
+
+
+
+  GL_GNULIB_FMOD=0
+
+
+
+  GL_GNULIB_FMODF=0
+
+
+
+  GL_GNULIB_FMODL=0
+
+
+
+  GL_GNULIB_FREXPF=0
+
+
+
+  GL_GNULIB_FREXP=0
+
+
+
+  GL_GNULIB_FREXPL=0
+
+
+
+  GL_GNULIB_HYPOT=0
+
+
+
+  GL_GNULIB_HYPOTF=0
+
+
+
+  GL_GNULIB_HYPOTL=0
+
+
+
+  GL_GNULIB_ILOGB=0
+
+
+
+  GL_GNULIB_ILOGBF=0
+
+
+
+  GL_GNULIB_ILOGBL=0
+
+
+
+  GL_GNULIB_ISFINITE=0
+
+
+
+  GL_GNULIB_ISINF=0
+
+
+
+  GL_GNULIB_ISNAN=0
+
+
+
+  GL_GNULIB_ISNANF=0
+
+
+
+  GL_GNULIB_ISNAND=0
+
+
+
+  GL_GNULIB_ISNANL=0
+
+
+
+  GL_GNULIB_LDEXPF=0
+
+
+
+  GL_GNULIB_LDEXPL=0
+
+
+
+  GL_GNULIB_LOG=0
+
+
+
+  GL_GNULIB_LOGF=0
+
+
+
+  GL_GNULIB_LOGL=0
+
+
+
+  GL_GNULIB_LOG10=0
+
+
+
+  GL_GNULIB_LOG10F=0
+
+
+
+  GL_GNULIB_LOG10L=0
+
+
+
+  GL_GNULIB_LOG1P=0
+
+
+
+  GL_GNULIB_LOG1PF=0
+
+
+
+  GL_GNULIB_LOG1PL=0
+
+
+
+  GL_GNULIB_LOG2=0
+
+
+
+  GL_GNULIB_LOG2F=0
+
+
+
+  GL_GNULIB_LOG2L=0
+
+
+
+  GL_GNULIB_LOGB=0
+
+
+
+  GL_GNULIB_LOGBF=0
+
+
+
+  GL_GNULIB_LOGBL=0
+
+
+
+  GL_GNULIB_MODF=0
+
+
+
+  GL_GNULIB_MODFF=0
+
+
+
+  GL_GNULIB_MODFL=0
+
+
+
+  GL_GNULIB_POWF=0
+
+
+
+  GL_GNULIB_REMAINDER=0
+
+
+
+  GL_GNULIB_REMAINDERF=0
+
+
+
+  GL_GNULIB_REMAINDERL=0
+
+
+
+  GL_GNULIB_RINT=0
+
+
+
+  GL_GNULIB_RINTF=0
+
+
+
+  GL_GNULIB_RINTL=0
+
+
+
+  GL_GNULIB_ROUND=0
+
+
+
+  GL_GNULIB_ROUNDF=0
+
+
+
+  GL_GNULIB_ROUNDL=0
+
+
+
+  GL_GNULIB_SIGNBIT=0
+
+
+
+  GL_GNULIB_SINF=0
+
+
+
+  GL_GNULIB_SINL=0
+
+
+
+  GL_GNULIB_SINHF=0
+
+
+
+  GL_GNULIB_SQRTF=0
+
+
+
+  GL_GNULIB_SQRTL=0
+
+
+
+  GL_GNULIB_TANF=0
+
+
+
+  GL_GNULIB_TANL=0
+
+
+
+  GL_GNULIB_TANHF=0
+
+
+
+  GL_GNULIB_TRUNC=0
+
+
+
+  GL_GNULIB_TRUNCF=0
+
+
+
+  GL_GNULIB_TRUNCL=0
+
+
+
+  GL_GNULIB_MDA_J0=1
+
+
+
+  GL_GNULIB_MDA_J1=1
+
+
+
+  GL_GNULIB_MDA_JN=1
+
+
+
+  GL_GNULIB_MDA_Y0=1
+
+
+
+  GL_GNULIB_MDA_Y1=1
+
+
+
+  GL_GNULIB_MDA_YN=1
 
 
 
 
 
 
-  if test $ac_cv_have_decl_strnlen = no; then
-    HAVE_DECL_STRNLEN=0
-  else
+   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getcwd (NULL, 0) allocates memory for result" >&5
+printf %s "checking whether getcwd (NULL, 0) allocates memory for result... " >&6; }
+if test ${gl_cv_func_getcwd_null+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                           # Guess yes on glibc systems.
+            *-gnu* | gnu*) gl_cv_func_getcwd_null="guessing yes";;
+                           # Guess yes on musl systems.
+            *-musl*)       gl_cv_func_getcwd_null="guessing yes";;
+                           # Guess yes on Cygwin.
+            cygwin*)       gl_cv_func_getcwd_null="guessing yes";;
+                           # If we don't know, obey --enable-cross-guesses.
+            *)             gl_cv_func_getcwd_null="$gl_cross_guess_normal";;
+          esac
 
-         { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strnlen" >&5
-$as_echo_n "checking for working strnlen... " >&6; }
-if ${ac_cv_func_strnlen_working+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  # Guess no on AIX systems, yes otherwise.
-		case "$host_os" in
-		  aix*) ac_cv_func_strnlen_working=no;;
-		  *)    ac_cv_func_strnlen_working=yes;;
-		esac
-else
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-$ac_includes_default
+
+#	 include <stdlib.h>
+#        if HAVE_UNISTD_H
+#         include <unistd.h>
+#        else /* on Windows with MSVC */
+#         include <direct.h>
+#        endif
+
+
+$gl_mda_defines
+
+#        ifndef getcwd
+         char *getcwd ();
+#        endif
+
 int
-main ()
+main (void)
 {
 
-#define S "foobar"
-#define S_LEN (sizeof S - 1)
-
-  /* At least one implementation is buggy: that of AIX 4.3 would
-     give strnlen (S, 1) == 3.  */
-
-  int i;
-  for (i = 0; i < S_LEN + 1; ++i)
-    {
-      int expected = i <= S_LEN ? i : S_LEN;
-      if (strnlen (S, i) != expected)
-	return 1;
-    }
-  return 0;
+#if defined _WIN32 && ! defined __CYGWIN__
+/* mingw cwd does not start with '/', but _getcwd does allocate.
+   However, mingw fails to honor non-zero size.  */
+#else
+           if (chdir ("/") != 0)
+             return 1;
+           else
+             {
+               char *f = getcwd (NULL, 0);
+               if (! f)
+                 return 2;
+               if (f[0] != '/')
+                 { free (f); return 3; }
+               if (f[1] != '\0')
+                 { free (f); return 4; }
+               free (f);
+               return 0;
+             }
+#endif
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_func_strnlen_working=yes
-else
-  ac_cv_func_strnlen_working=no
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_getcwd_null=yes
+else $as_nop
+  gl_cv_func_getcwd_null=no
 fi
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
   conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strnlen_working" >&5
-$as_echo "$ac_cv_func_strnlen_working" >&6; }
-test $ac_cv_func_strnlen_working = no && :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getcwd_null" >&5
+printf "%s\n" "$gl_cv_func_getcwd_null" >&6; }
 
 
-    if test $ac_cv_func_strnlen_working = no; then
-      REPLACE_STRNLEN=1
-    fi
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getcwd with POSIX signature" >&5
+printf %s "checking for getcwd with POSIX signature... " >&6; }
+if test ${gl_cv_func_getcwd_posix_signature+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <unistd.h>
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+extern
+           #ifdef __cplusplus
+           "C"
+           #endif
+           char *getcwd (char *, size_t);
+
+  ;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_func_getcwd_posix_signature=yes
+else $as_nop
+  gl_cv_func_getcwd_posix_signature=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getcwd_posix_signature" >&5
+printf "%s\n" "$gl_cv_func_getcwd_posix_signature" >&6; }
+
+ac_fn_check_decl "$LINENO" "getcwd" "ac_cv_have_decl_getcwd" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_getcwd" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_GETCWD $ac_have_decl" >>confdefs.h
+
+
+
+
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for d_ino member in directory struct" >&5
+printf %s "checking for d_ino member in directory struct... " >&6; }
+if test ${gl_cv_struct_dirent_d_ino+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                            # Guess yes on glibc systems with Linux kernel.
+              linux*-gnu*)  gl_cv_struct_dirent_d_ino="guessing yes" ;;
+                            # Guess yes on musl systems with Linux kernel.
+              linux*-musl*) gl_cv_struct_dirent_d_ino="guessing yes" ;;
+                            # Guess no on native Windows.
+              mingw*)       gl_cv_struct_dirent_d_ino="guessing no" ;;
+                            # If we don't know, obey --enable-cross-guesses.
+              *)            gl_cv_struct_dirent_d_ino="$gl_cross_guess_normal" ;;
+            esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+             #include <sys/stat.h>
+             #include <dirent.h>
+
+int
+main (void)
+{
+DIR *dp = opendir (".");
+             struct dirent *e;
+             struct stat st;
+             if (! dp)
+               return 1;
+             e = readdir (dp);
+             if (! e)
+               { closedir (dp); return 2; }
+             if (lstat (e->d_name, &st) != 0)
+               { closedir (dp); return 3; }
+             if (e->d_ino != st.st_ino)
+               { closedir (dp); return 4; }
+             closedir (dp);
+             return 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_struct_dirent_d_ino=yes
+else $as_nop
+  gl_cv_struct_dirent_d_ino=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_struct_dirent_d_ino" >&5
+printf "%s\n" "$gl_cv_struct_dirent_d_ino" >&6; }
+   case "$gl_cv_struct_dirent_d_ino" in
+     *yes)
+
+printf "%s\n" "#define D_INO_IN_DIRENT 1" >>confdefs.h
+
+       ;;
+   esac
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for arithmetic hrtime_t" >&5
+printf %s "checking for arithmetic hrtime_t... " >&6; }
+if test ${gl_cv_arithmetic_hrtime_t+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <time.h>
+int
+main (void)
+{
+hrtime_t x = 0; return x/x;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_arithmetic_hrtime_t=yes
+else $as_nop
+  gl_cv_arithmetic_hrtime_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_arithmetic_hrtime_t" >&5
+printf "%s\n" "$gl_cv_arithmetic_hrtime_t" >&6; }
+  if test $gl_cv_arithmetic_hrtime_t = yes; then
+
+printf "%s\n" "#define HAVE_ARITHMETIC_HRTIME_T 1" >>confdefs.h
+
   fi
 
-      if test $HAVE_DECL_STRNLEN = 0 || test $REPLACE_STRNLEN = 1; then
+
+  :
 
 
 
@@ -41664,36 +20745,6 @@
 
 
 
-  gl_LIBOBJS="$gl_LIBOBJS strnlen.$ac_objext"
-
-        :
-      fi
-
-
-
-
-
-          GNULIB_STRNLEN=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_STRNLEN 1" >>confdefs.h
-
-
-
-      gl_gnulib_enabled_strnlen=true
-    fi
-  }
-  func_gl_gnulib_m4code_sys_stat ()
-  {
-    if ! $gl_gnulib_enabled_sys_stat; then
-
-
-
-
-
 
 
 
@@ -41704,22 +20755,23 @@
 
 
      if test $gl_cv_have_include_next = yes; then
-       gl_cv_next_sys_stat_h='<'sys/stat.h'>'
+       gl_cv_next_getopt_h='<'getopt.h'>'
      else
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/stat.h>" >&5
-$as_echo_n "checking absolute name of <sys/stat.h>... " >&6; }
-if ${gl_cv_next_sys_stat_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <getopt.h>" >&5
+printf %s "checking absolute name of <getopt.h>... " >&6; }
+if test ${gl_cv_next_getopt_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
-             if test $ac_cv_header_sys_stat_h = yes; then
+             if test $ac_cv_header_getopt_h = yes; then
 
 
 
 
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <sys/stat.h>
+#include <getopt.h>
 _ACEOF
                 case "$host_os" in
     aix*) gl_absname_cpp="$ac_cpp -C" ;;
@@ -41735,7 +20787,7 @@
       ;;
   esac
       gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
-  gl_header_literal_regex=`echo 'sys/stat.h' \
+  gl_header_literal_regex=`echo 'getopt.h' \
                            | sed -e "$gl_make_literal_regex_sed"`
   gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
       s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
@@ -41744,1203 +20796,788 @@
       q
     }'
 
-        gl_cv_absolute_sys_stat_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+        gl_cv_absolute_getopt_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
   sed -n "$gl_absolute_header_sed"`
 
-           gl_header=$gl_cv_absolute_sys_stat_h
-           gl_cv_next_sys_stat_h='"'$gl_header'"'
+           gl_header=$gl_cv_absolute_getopt_h
+           gl_cv_next_getopt_h='"'$gl_header'"'
           else
-               gl_cv_next_sys_stat_h='<'sys/stat.h'>'
+               gl_cv_next_getopt_h='<'getopt.h'>'
              fi
 
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_stat_h" >&5
-$as_echo "$gl_cv_next_sys_stat_h" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_getopt_h" >&5
+printf "%s\n" "$gl_cv_next_getopt_h" >&6; }
      fi
-     NEXT_SYS_STAT_H=$gl_cv_next_sys_stat_h
+     NEXT_GETOPT_H=$gl_cv_next_getopt_h
 
      if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
        # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
-       gl_next_as_first_directive='<'sys/stat.h'>'
+       gl_next_as_first_directive='<'getopt.h'>'
      else
        # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=$gl_cv_next_sys_stat_h
+       gl_next_as_first_directive=$gl_cv_next_getopt_h
      fi
-     NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H=$gl_next_as_first_directive
+     NEXT_AS_FIRST_DIRECTIVE_GETOPT_H=$gl_next_as_first_directive
 
 
 
 
+  if test $ac_cv_header_getopt_h = yes; then
+    HAVE_GETOPT_H=1
+  else
+    HAVE_GETOPT_H=0
+  fi
 
 
+  gl_replace_getopt=
 
-
-    WINDOWS_STAT_TIMESPEC=0
-
-
-
-
-
-
-
-
-      ac_fn_c_check_type "$LINENO" "nlink_t" "ac_cv_type_nlink_t" "#include <sys/types.h>
-     #include <sys/stat.h>
-"
-if test "x$ac_cv_type_nlink_t" = xyes; then :
-
-else
-
-$as_echo "#define nlink_t int" >>confdefs.h
-
-fi
-
-
-
-
-
-
-
-      gl_gnulib_enabled_sys_stat=true
-    fi
-  }
-  func_gl_gnulib_m4code_ed5616be3593d355b981ffab56b9f37b ()
-  {
-    if ! $gl_gnulib_enabled_ed5616be3593d355b981ffab56b9f37b; then
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_cv_func_vfprintf_posix=no
-  case "$gl_cv_func_printf_sizes_c99" in
-    *yes)
-      case "$gl_cv_func_printf_long_double" in
-        *yes)
-          case "$gl_cv_func_printf_infinite" in
-            *yes)
-              case "$gl_cv_func_printf_infinite_long_double" in
-                *yes)
-                  case "$gl_cv_func_printf_directive_a" in
-                    *yes)
-                      case "$gl_cv_func_printf_directive_f" in
-                        *yes)
-                          case "$gl_cv_func_printf_directive_n" in
-                            *yes)
-                              case "$gl_cv_func_printf_directive_ls" in
-                                *yes)
-                                  case "$gl_cv_func_printf_positions" in
-                                    *yes)
-                                      case "$gl_cv_func_printf_flag_grouping" in
-                                        *yes)
-                                          case "$gl_cv_func_printf_flag_leftadjust" in
-                                            *yes)
-                                              case "$gl_cv_func_printf_flag_zero" in
-                                                *yes)
-                                                  case "$gl_cv_func_printf_precision" in
-                                                    *yes)
-                                                      case "$gl_cv_func_printf_enomem" in
-                                                        *yes)
-                                                          # vfprintf exists and is
-                                                          # already POSIX compliant.
-                                                          gl_cv_func_vfprintf_posix=yes
-                                                          ;;
-                                                      esac
-                                                      ;;
-                                                  esac
-                                                  ;;
-                                              esac
-                                              ;;
-                                          esac
-                                          ;;
-                                      esac
-                                      ;;
-                                  esac
-                                  ;;
-                              esac
-                              ;;
-                          esac
-                          ;;
-                      esac
-                      ;;
-                  esac
-                  ;;
-              esac
-              ;;
-          esac
-          ;;
-      esac
-      ;;
-  esac
-  if test $gl_cv_func_vfprintf_posix = no; then
-
-
-
-  case "$gl_cv_func_printf_infinite" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-  case "$gl_cv_func_printf_long_double" in
-    *yes)
-      case "$gl_cv_func_printf_infinite_long_double" in
-        *yes)
-          ;;
-        *)
-
-$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
-
-          ;;
-      esac
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_a" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
-
-      for ac_func in nl_langinfo
+    if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
+           for ac_header in getopt.h
 do :
-  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
-if test "x$ac_cv_func_nl_langinfo" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_NL_LANGINFO 1
+  ac_fn_c_check_header_compile "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default"
+if test "x$ac_cv_header_getopt_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_GETOPT_H 1" >>confdefs.h
+
+else $as_nop
+  gl_replace_getopt=yes
+fi
+
+done
+  fi
+
+    if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
+
+  for ac_func in getopt_long_only
+do :
+  ac_fn_c_check_func "$LINENO" "getopt_long_only" "ac_cv_func_getopt_long_only"
+if test "x$ac_cv_func_getopt_long_only" = xyes
+then :
+  printf "%s\n" "#define HAVE_GETOPT_LONG_ONLY 1" >>confdefs.h
+
+else $as_nop
+  gl_replace_getopt=yes
+fi
+
+done
+  fi
+
+          if test -z "$gl_replace_getopt"; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getopt is POSIX compatible" >&5
+printf %s "checking whether getopt is POSIX compatible... " >&6; }
+if test ${gl_cv_func_getopt_posix+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+                                                if test $cross_compiling = no; then
+                              if test "$cross_compiling" = yes
+then :
+  { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+int
+main ()
+{
+  static char program[] = "program";
+  static char a[] = "-a";
+  static char foo[] = "foo";
+  static char bar[] = "bar";
+  char *argv[] = { program, a, foo, bar, NULL };
+  int c;
+
+  c = getopt (4, argv, "ab");
+  if (!(c == 'a'))
+    return 1;
+  c = getopt (4, argv, "ab");
+  if (!(c == -1))
+    return 2;
+  if (!(optind == 2))
+    return 3;
+  return 0;
+}
+
 _ACEOF
-
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_getopt_posix=maybe
+else $as_nop
+  gl_cv_func_getopt_posix=no
 fi
-done
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_f" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_directive_ls" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_grouping" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_leftadjust" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_flag_zero" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_precision" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-  case "$gl_cv_func_printf_enomem" in
-    *yes)
-      ;;
-    *)
-
-$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
-
-
-$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
-
-      ;;
-  esac
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
-
-  if test $ac_cv_func_vasnprintf = yes; then
-
-$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h
-
-  fi
-
-
-
-
-
-
-
-
-
-
-
-  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
-if test "x$ac_cv_type_ptrdiff_t" = xyes; then :
-
-else
-
-$as_echo "#define ptrdiff_t long" >>confdefs.h
-
-
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
+          if test $gl_cv_func_getopt_posix = maybe; then
+                                    if test "$cross_compiling" = yes
+then :
+  { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
 
+int
+main ()
+{
+  static char program[] = "program";
+  static char donald[] = "donald";
+  static char p[] = "-p";
+  static char billy[] = "billy";
+  static char duck[] = "duck";
+  static char a[] = "-a";
+  static char bar[] = "bar";
+  char *argv[] = { program, donald, p, billy, duck, a, bar, NULL };
+  int c;
 
+  c = getopt (7, argv, "+abp:q:");
+  if (!(c == -1))
+    return 4;
+  if (!(strcmp (argv[0], "program") == 0))
+    return 5;
+  if (!(strcmp (argv[1], "donald") == 0))
+    return 6;
+  if (!(strcmp (argv[2], "-p") == 0))
+    return 7;
+  if (!(strcmp (argv[3], "billy") == 0))
+    return 8;
+  if (!(strcmp (argv[4], "duck") == 0))
+    return 9;
+  if (!(strcmp (argv[5], "-a") == 0))
+    return 10;
+  if (!(strcmp (argv[6], "bar") == 0))
+    return 11;
+  if (!(optind == 1))
+    return 12;
+  return 0;
+}
 
-
-
-
-
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS vfprintf.$ac_objext"
-
-  REPLACE_VFPRINTF=1
-
-$as_echo "#define REPLACE_VFPRINTF_POSIX 1" >>confdefs.h
-
-  :
-
-  fi
-
-
-
-
-
-
-          GNULIB_VFPRINTF_POSIX=1
-
-
-
-
-
-$as_echo "#define GNULIB_TEST_VFPRINTF_POSIX 1" >>confdefs.h
-
-
-
-      gl_gnulib_enabled_ed5616be3593d355b981ffab56b9f37b=true
-      if test $REPLACE_VFPRINTF = 1; then
-        func_gl_gnulib_m4code_fseterr
-      fi
-    fi
-  }
-  func_gl_gnulib_m4code_503a4cb75d69c787103d0aa2ab7d8440 ()
-  {
-    if ! $gl_gnulib_enabled_503a4cb75d69c787103d0aa2ab7d8440; then
-
-      case "$host_os" in
-        mingw*)
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS windows-mutex.$ac_objext"
-
-          ;;
-      esac
-      gl_gnulib_enabled_503a4cb75d69c787103d0aa2ab7d8440=true
-    fi
-  }
-  func_gl_gnulib_m4code_68a4501daeca58988392c7e60b4917ab ()
-  {
-    if ! $gl_gnulib_enabled_68a4501daeca58988392c7e60b4917ab; then
-
-      case "$host_os" in
-        mingw*)
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS windows-once.$ac_objext"
-
-          ;;
-      esac
-      gl_gnulib_enabled_68a4501daeca58988392c7e60b4917ab=true
-    fi
-  }
-  func_gl_gnulib_m4code_f0efff84a70f4afba30902bb8ffe9354 ()
-  {
-    if ! $gl_gnulib_enabled_f0efff84a70f4afba30902bb8ffe9354; then
-
-      case "$host_os" in
-        mingw*)
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS windows-recmutex.$ac_objext"
-
-          ;;
-      esac
-      gl_gnulib_enabled_f0efff84a70f4afba30902bb8ffe9354=true
-    fi
-  }
-  func_gl_gnulib_m4code_8bb827fe37eaccf1b97feb0c87bc92ef ()
-  {
-    if ! $gl_gnulib_enabled_8bb827fe37eaccf1b97feb0c87bc92ef; then
-
-      case "$host_os" in
-        mingw*)
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS windows-rwlock.$ac_objext"
-
-          ;;
-      esac
-      gl_gnulib_enabled_8bb827fe37eaccf1b97feb0c87bc92ef=true
-    fi
-  }
-  func_gl_gnulib_m4code_48b2271240803e4879464b755748a89d ()
-  {
-    if ! $gl_gnulib_enabled_48b2271240803e4879464b755748a89d; then
-
-      case "$host_os" in
-        mingw*)
-
-
-
-
-
-
-
-
-  gl_LIBOBJS="$gl_LIBOBJS windows-tls.$ac_objext"
-
-          ;;
-      esac
-      gl_gnulib_enabled_48b2271240803e4879464b755748a89d=true
-      func_gl_gnulib_m4code_68a4501daeca58988392c7e60b4917ab
-    fi
-  }
-  if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then
-    func_gl_gnulib_m4code_lstat
-  fi
-  if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then
-    func_gl_gnulib_m4code_malloca
-  fi
-  if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then
-    func_gl_gnulib_m4code_sys_stat
-  fi
-  if test $REPLACE_CLOSE = 1; then
-    func_gl_gnulib_m4code_43fe87a341d9b4b93c47c3ad819a5239
-  fi
-  if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then
-    func_gl_gnulib_m4code_getdtablesize
-  fi
-  if test $REPLACE_FOPEN = 1; then
-    func_gl_gnulib_m4code_fstat
-  fi
-  if test $REPLACE_FPRINTF = 1; then
-    func_gl_gnulib_m4code_fseterr
-  fi
-  if test $NEED_LOCALTIME_BUFFER = 1; then
-    func_gl_gnulib_m4code_2049e887c7e5308faad27b3f894bb8c9
-  fi
-  if { test $HAVE_DECL_LDEXPL = 0 || test $gl_func_ldexpl = no; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
-    func_gl_gnulib_m4code_ldexp
-  fi
-  if test $gl_threads_api = windows; then
-    func_gl_gnulib_m4code_503a4cb75d69c787103d0aa2ab7d8440
-  fi
-  if test $gl_threads_api = windows; then
-    func_gl_gnulib_m4code_68a4501daeca58988392c7e60b4917ab
-  fi
-  if test $gl_threads_api = windows; then
-    func_gl_gnulib_m4code_f0efff84a70f4afba30902bb8ffe9354
-  fi
-  if test $gl_threads_api = windows; then
-    func_gl_gnulib_m4code_8bb827fe37eaccf1b97feb0c87bc92ef
-  fi
-  if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then
-    func_gl_gnulib_m4code_30838f5439487421042f2225bed3af76
-  fi
-  if test $REPLACE_OPEN = 1; then
-    func_gl_gnulib_m4code_fstat
-  fi
-  if test $REPLACE_OPEN = 1; then
-    func_gl_gnulib_m4code_stat
-  fi
-  if test $REPLACE_PERROR = 1; then
-    func_gl_gnulib_m4code_dbb57f49352be8fb86869629a254fb72
-  fi
-  if test $REPLACE_PERROR = 1; then
-    func_gl_gnulib_m4code_1f32594a85e6221ba15f884daeee8c2a
-  fi
-  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = 1; then
-    func_gl_gnulib_m4code_getdtablesize
-  fi
-  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = 1; then
-    func_gl_gnulib_m4code_getdtablesize
-  fi
-  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = 1; then
-    func_gl_gnulib_m4code_getdtablesize
-  fi
-  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
-    func_gl_gnulib_m4code_332607f759618fb73dfc3076748afea7
-  fi
-  if test $REPLACE_PRINTF = 1; then
-    func_gl_gnulib_m4code_ed5616be3593d355b981ffab56b9f37b
-  fi
-  if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then
-    func_gl_gnulib_m4code_stat
-  fi
-  if test $REPLACE_RENAME = 1; then
-    func_gl_gnulib_m4code_chdir
-  fi
-  if test $REPLACE_RENAME = 1; then
-    func_gl_gnulib_m4code_lstat
-  fi
-  if test $REPLACE_RENAME = 1; then
-    func_gl_gnulib_m4code_rmdir
-  fi
-  if test $REPLACE_RENAME = 1; then
-    func_gl_gnulib_m4code_9bc5f216d57e231e4834049d67d0db62
-  fi
-  if test $REPLACE_SIGNBIT = 1; then
-    func_gl_gnulib_m4code_3f0e593033d1fc2c127581960f641b66
-  fi
-  if test $REPLACE_STRERROR = 1; then
-    func_gl_gnulib_m4code_dbb57f49352be8fb86869629a254fb72
-  fi
-  if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then
-    func_gl_gnulib_m4code_strnlen
-  fi
-  if test $HAVE_STRVERSCMP = 0; then
-    func_gl_gnulib_m4code_21ee726a3540c09237a8e70c0baf7467
-  fi
-  if test $gl_threads_api = windows; then
-    func_gl_gnulib_m4code_48b2271240803e4879464b755748a89d
-  fi
-  if test $REPLACE_UNLINK = 1; then
-    func_gl_gnulib_m4code_lstat
-  fi
-
-   if $gl_gnulib_enabled_chdir; then
-  gl_GNULIB_ENABLED_chdir_TRUE=
-  gl_GNULIB_ENABLED_chdir_FALSE='#'
-else
-  gl_GNULIB_ENABLED_chdir_TRUE='#'
-  gl_GNULIB_ENABLED_chdir_FALSE=
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_getopt_posix=maybe
+else $as_nop
+  gl_cv_func_getopt_posix=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
-   if $gl_gnulib_enabled_43fe87a341d9b4b93c47c3ad819a5239; then
-  gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_TRUE=
-  gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_FALSE='#'
-else
-  gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_TRUE='#'
-  gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_FALSE=
-fi
-
-   if $gl_gnulib_enabled_fseterr; then
-  gl_GNULIB_ENABLED_fseterr_TRUE=
-  gl_GNULIB_ENABLED_fseterr_FALSE='#'
-else
-  gl_GNULIB_ENABLED_fseterr_TRUE='#'
-  gl_GNULIB_ENABLED_fseterr_FALSE=
-fi
-
-   if $gl_gnulib_enabled_fstat; then
-  gl_GNULIB_ENABLED_fstat_TRUE=
-  gl_GNULIB_ENABLED_fstat_FALSE='#'
-else
-  gl_GNULIB_ENABLED_fstat_TRUE='#'
-  gl_GNULIB_ENABLED_fstat_FALSE=
-fi
-
-   if $gl_gnulib_enabled_getdtablesize; then
-  gl_GNULIB_ENABLED_getdtablesize_TRUE=
-  gl_GNULIB_ENABLED_getdtablesize_FALSE='#'
-else
-  gl_GNULIB_ENABLED_getdtablesize_TRUE='#'
-  gl_GNULIB_ENABLED_getdtablesize_FALSE=
-fi
-
-   if $gl_gnulib_enabled_30838f5439487421042f2225bed3af76; then
-  gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_TRUE=
-  gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_FALSE='#'
-else
-  gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_TRUE='#'
-  gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_FALSE=
-fi
-
-   if $gl_gnulib_enabled_3f0e593033d1fc2c127581960f641b66; then
-  gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_TRUE=
-  gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_FALSE='#'
-else
-  gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_TRUE='#'
-  gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_FALSE=
-fi
-
-   if $gl_gnulib_enabled_ldexp; then
-  gl_GNULIB_ENABLED_ldexp_TRUE=
-  gl_GNULIB_ENABLED_ldexp_FALSE='#'
-else
-  gl_GNULIB_ENABLED_ldexp_TRUE='#'
-  gl_GNULIB_ENABLED_ldexp_FALSE=
-fi
-
-   if $gl_gnulib_enabled_21ee726a3540c09237a8e70c0baf7467; then
-  gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467_TRUE=
-  gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467_FALSE='#'
-else
-  gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467_TRUE='#'
-  gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467_FALSE=
-fi
-
-   if $gl_gnulib_enabled_2049e887c7e5308faad27b3f894bb8c9; then
-  gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9_TRUE=
-  gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9_FALSE='#'
-else
-  gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9_TRUE='#'
-  gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9_FALSE=
-fi
-
-   if $gl_gnulib_enabled_lstat; then
-  gl_GNULIB_ENABLED_lstat_TRUE=
-  gl_GNULIB_ENABLED_lstat_FALSE='#'
-else
-  gl_GNULIB_ENABLED_lstat_TRUE='#'
-  gl_GNULIB_ENABLED_lstat_FALSE=
-fi
-
-   if $gl_gnulib_enabled_malloca; then
-  gl_GNULIB_ENABLED_malloca_TRUE=
-  gl_GNULIB_ENABLED_malloca_FALSE='#'
-else
-  gl_GNULIB_ENABLED_malloca_TRUE='#'
-  gl_GNULIB_ENABLED_malloca_FALSE=
-fi
-
-   if $gl_gnulib_enabled_332607f759618fb73dfc3076748afea7; then
-  gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_TRUE=
-  gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_FALSE='#'
-else
-  gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_TRUE='#'
-  gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_FALSE=
-fi
-
-   if $gl_gnulib_enabled_rawmemchr; then
-  gl_GNULIB_ENABLED_rawmemchr_TRUE=
-  gl_GNULIB_ENABLED_rawmemchr_FALSE='#'
-else
-  gl_GNULIB_ENABLED_rawmemchr_TRUE='#'
-  gl_GNULIB_ENABLED_rawmemchr_FALSE=
-fi
-
-   if $gl_gnulib_enabled_rmdir; then
-  gl_GNULIB_ENABLED_rmdir_TRUE=
-  gl_GNULIB_ENABLED_rmdir_FALSE='#'
-else
-  gl_GNULIB_ENABLED_rmdir_TRUE='#'
-  gl_GNULIB_ENABLED_rmdir_FALSE=
-fi
-
-   if $gl_gnulib_enabled_9bc5f216d57e231e4834049d67d0db62; then
-  gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62_TRUE=
-  gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62_FALSE='#'
-else
-  gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62_TRUE='#'
-  gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62_FALSE=
-fi
-
-   if $gl_gnulib_enabled_cdeb0f2aaf9d280baa6526bfa1b07f70; then
-  gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_TRUE=
-  gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_FALSE='#'
-else
-  gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_TRUE='#'
-  gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_FALSE=
-fi
-
-   if $gl_gnulib_enabled_stat; then
-  gl_GNULIB_ENABLED_stat_TRUE=
-  gl_GNULIB_ENABLED_stat_FALSE='#'
-else
-  gl_GNULIB_ENABLED_stat_TRUE='#'
-  gl_GNULIB_ENABLED_stat_FALSE=
-fi
-
-   if $gl_gnulib_enabled_0137e3d3638b33e5819d132d0b23165c; then
-  gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_TRUE=
-  gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_FALSE='#'
-else
-  gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_TRUE='#'
-  gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_FALSE=
-fi
-
-   if $gl_gnulib_enabled_strchrnul; then
-  gl_GNULIB_ENABLED_strchrnul_TRUE=
-  gl_GNULIB_ENABLED_strchrnul_FALSE='#'
-else
-  gl_GNULIB_ENABLED_strchrnul_TRUE='#'
-  gl_GNULIB_ENABLED_strchrnul_FALSE=
-fi
-
-   if $gl_gnulib_enabled_dbb57f49352be8fb86869629a254fb72; then
-  gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_TRUE=
-  gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_FALSE='#'
-else
-  gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_TRUE='#'
-  gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_FALSE=
-fi
-
-   if $gl_gnulib_enabled_1f32594a85e6221ba15f884daeee8c2a; then
-  gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_TRUE=
-  gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_FALSE='#'
-else
-  gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_TRUE='#'
-  gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_FALSE=
-fi
-
-   if $gl_gnulib_enabled_strnlen; then
-  gl_GNULIB_ENABLED_strnlen_TRUE=
-  gl_GNULIB_ENABLED_strnlen_FALSE='#'
-else
-  gl_GNULIB_ENABLED_strnlen_TRUE='#'
-  gl_GNULIB_ENABLED_strnlen_FALSE=
-fi
-
-   if $gl_gnulib_enabled_sys_stat; then
-  gl_GNULIB_ENABLED_sys_stat_TRUE=
-  gl_GNULIB_ENABLED_sys_stat_FALSE='#'
-else
-  gl_GNULIB_ENABLED_sys_stat_TRUE='#'
-  gl_GNULIB_ENABLED_sys_stat_FALSE=
-fi
-
-   if $gl_gnulib_enabled_ed5616be3593d355b981ffab56b9f37b; then
-  gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_TRUE=
-  gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_FALSE='#'
-else
-  gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_TRUE='#'
-  gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_FALSE=
-fi
-
-   if $gl_gnulib_enabled_503a4cb75d69c787103d0aa2ab7d8440; then
-  gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_TRUE=
-  gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_FALSE='#'
-else
-  gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_TRUE='#'
-  gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_FALSE=
-fi
-
-   if $gl_gnulib_enabled_68a4501daeca58988392c7e60b4917ab; then
-  gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab_TRUE=
-  gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab_FALSE='#'
-else
-  gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab_TRUE='#'
-  gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab_FALSE=
-fi
-
-   if $gl_gnulib_enabled_f0efff84a70f4afba30902bb8ffe9354; then
-  gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354_TRUE=
-  gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354_FALSE='#'
-else
-  gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354_TRUE='#'
-  gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354_FALSE=
-fi
-
-   if $gl_gnulib_enabled_8bb827fe37eaccf1b97feb0c87bc92ef; then
-  gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef_TRUE=
-  gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef_FALSE='#'
-else
-  gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef_TRUE='#'
-  gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef_FALSE=
-fi
-
-   if $gl_gnulib_enabled_48b2271240803e4879464b755748a89d; then
-  gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d_TRUE=
-  gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d_FALSE='#'
-else
-  gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d_TRUE='#'
-  gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d_FALSE=
-fi
-
-  # End of code from modules
-
-
-
-
-
-
-
-
-
-  gltests_libdeps=
-  gltests_ltlibdeps=
-
-
-
-
-
-
-
-
-
-  gl_source_base='tests'
-  gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS
-
-  gl_module_indicator_condition=$gltests_WITNESS
-
-
-
-
-
-
-
-
-
-
-  LIBBISON_LIBDEPS="$gl_libdeps"
-
-  LIBBISON_LTLIBDEPS="$gl_ltlibdeps"
-
-
-
-# Checks for library functions.
-
-
-
-
-# Gettext.
-# We use gnulib, which is only guaranteed to work properly with the
-# latest Gettext.
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5
-$as_echo_n "checking whether NLS is requested... " >&6; }
-    # Check whether --enable-nls was given.
-if test "${enable_nls+set}" = set; then :
-  enableval=$enable_nls; USE_NLS=$enableval
-else
-  USE_NLS=yes
-fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
-$as_echo "$USE_NLS" >&6; }
-
-
-
-
-      GETTEXT_MACRO_VERSION=0.19
-
-
-
-
-# Prepare PATH_SEPARATOR.
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
-  # contains only /bin. Note that ksh looks also at the FPATH variable,
-  # so we have to set that as well for the test.
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-           || PATH_SEPARATOR=';'
-       }
-fi
-
-# Find out how to test for executable files. Don't use a zero-byte file,
-# as systems may use methods other than mode bits to determine executability.
-cat >conf$$.file <<_ASEOF
-#! /bin/sh
-exit 0
-_ASEOF
-chmod +x conf$$.file
-if test -x conf$$.file >/dev/null 2>&1; then
-  ac_executable_p="test -x"
-else
-  ac_executable_p="test -f"
-fi
-rm -f conf$$.file
-
-# Extract the first word of "msgfmt", so it can be a program name with args.
-set dummy msgfmt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_MSGFMT+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case "$MSGFMT" in
-  [\\/]* | ?:[\\/]*)
-    ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
-    ;;
-  *)
-    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH; do
-      IFS="$ac_save_IFS"
-      test -z "$ac_dir" && ac_dir=.
-      for ac_exec_ext in '' $ac_executable_extensions; do
-        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
-          echo "$as_me: trying $ac_dir/$ac_word..." >&5
-          if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 &&
-     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
-            ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext"
-            break 2
           fi
-        fi
-      done
-    done
-    IFS="$ac_save_IFS"
-  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
-    ;;
-esac
+          if test $gl_cv_func_getopt_posix = maybe; then
+                        if test "$cross_compiling" = yes
+then :
+  { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+int
+main ()
+{
+  static char program[] = "program";
+  static char ab[] = "-ab";
+  char *argv[3] = { program, ab, NULL };
+  if (getopt (2, argv, "ab:") != 'a')
+    return 13;
+  if (getopt (2, argv, "ab:") != '?')
+    return 14;
+  if (optopt != 'b')
+    return 15;
+  if (optind != 2)
+    return 16;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_getopt_posix=yes
+else $as_nop
+  gl_cv_func_getopt_posix=no
 fi
-MSGFMT="$ac_cv_path_MSGFMT"
-if test "$MSGFMT" != ":"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
-$as_echo "$MSGFMT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
-  # Extract the first word of "gmsgfmt", so it can be a program name with args.
-set dummy gmsgfmt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_GMSGFMT+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $GMSGFMT in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
+          fi
+        else
+          case "$host_os" in
+            darwin* | aix* | mingw*) gl_cv_func_getopt_posix="guessing no";;
+            *)                       gl_cv_func_getopt_posix="guessing yes";;
+          esac
+        fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_posix" >&5
+printf "%s\n" "$gl_cv_func_getopt_posix" >&6; }
+    case "$gl_cv_func_getopt_posix" in
+      *no) gl_replace_getopt=yes ;;
+    esac
   fi
-done
-  done
-IFS=$as_save_IFS
 
-  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
-  ;;
-esac
+  if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working GNU getopt function" >&5
+printf %s "checking for working GNU getopt function... " >&6; }
+if test ${gl_cv_func_getopt_gnu+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  # Even with POSIXLY_CORRECT, the GNU extension of leading '-' in the
+       # optstring is necessary for programs like m4 that have POSIX-mandated
+       # semantics for supporting options interspersed with files.
+       # Also, since getopt_long is a GNU extension, we require optind=0.
+       # Bash ties 'set -o posix' to a non-exported POSIXLY_CORRECT;
+       # so take care to revert to the correct (non-)export state.
+       gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }'
+       case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" </dev/null` in
+         xx) gl_had_POSIXLY_CORRECT=exported ;;
+         x)  gl_had_POSIXLY_CORRECT=yes      ;;
+         *)  gl_had_POSIXLY_CORRECT=         ;;
+       esac
+       POSIXLY_CORRECT=1
+       export POSIXLY_CORRECT
+       if test "$cross_compiling" = yes
+then :
+                             gl_cv_func_getopt_gnu="$gl_cross_guess_normal"
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <getopt.h>
+                           #include <stddef.h>
+                           #include <string.h>
+
+#include <stdlib.h>
+#if defined __MACH__ && defined __APPLE__
+/* Avoid a crash on Mac OS X.  */
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+#include <mach/thread_status.h>
+#include <mach/exception.h>
+#include <mach/task.h>
+#include <pthread.h>
+/* The exception port on which our thread listens.  */
+static mach_port_t our_exception_port;
+/* The main function of the thread listening for exceptions of type
+   EXC_BAD_ACCESS.  */
+static void *
+mach_exception_thread (void *arg)
+{
+  /* Buffer for a message to be received.  */
+  struct {
+    mach_msg_header_t head;
+    mach_msg_body_t msgh_body;
+    char data[1024];
+  } msg;
+  mach_msg_return_t retval;
+  /* Wait for a message on the exception port.  */
+  retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
+                     our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+  if (retval != MACH_MSG_SUCCESS)
+    abort ();
+  exit (1);
+}
+static void
+nocrash_init (void)
+{
+  mach_port_t self = mach_task_self ();
+  /* Allocate a port on which the thread shall listen for exceptions.  */
+  if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
+      == KERN_SUCCESS) {
+    /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html.  */
+    if (mach_port_insert_right (self, our_exception_port, our_exception_port,
+                                MACH_MSG_TYPE_MAKE_SEND)
+        == KERN_SUCCESS) {
+      /* The exceptions we want to catch.  Only EXC_BAD_ACCESS is interesting
+         for us.  */
+      exception_mask_t mask = EXC_MASK_BAD_ACCESS;
+      /* Create the thread listening on the exception port.  */
+      pthread_attr_t attr;
+      pthread_t thread;
+      if (pthread_attr_init (&attr) == 0
+          && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
+          && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
+        pthread_attr_destroy (&attr);
+        /* Replace the exception port info for these exceptions with our own.
+           Note that we replace the exception port for the entire task, not only
+           for a particular thread.  This has the effect that when our exception
+           port gets the message, the thread specific exception port has already
+           been asked, and we don't need to bother about it.
+           See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html.  */
+        task_set_exception_ports (self, mask, our_exception_port,
+                                  EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
+      }
+    }
+  }
+}
+#elif defined _WIN32 && ! defined __CYGWIN__
+/* Avoid a crash on native Windows.  */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winerror.h>
+static LONG WINAPI
+exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
+{
+  switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
+    {
+    case EXCEPTION_ACCESS_VIOLATION:
+    case EXCEPTION_IN_PAGE_ERROR:
+    case EXCEPTION_STACK_OVERFLOW:
+    case EXCEPTION_GUARD_PAGE:
+    case EXCEPTION_PRIV_INSTRUCTION:
+    case EXCEPTION_ILLEGAL_INSTRUCTION:
+    case EXCEPTION_DATATYPE_MISALIGNMENT:
+    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
+    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
+      exit (1);
+    }
+  return EXCEPTION_CONTINUE_SEARCH;
+}
+static void
+nocrash_init (void)
+{
+  SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
+}
+#else
+/* Avoid a crash on POSIX systems.  */
+#include <signal.h>
+#include <unistd.h>
+/* A POSIX signal handler.  */
+static void
+exception_handler (int sig)
+{
+  _exit (1);
+}
+static void
+nocrash_init (void)
+{
+#ifdef SIGSEGV
+  signal (SIGSEGV, exception_handler);
+#endif
+#ifdef SIGBUS
+  signal (SIGBUS, exception_handler);
+#endif
+}
+#endif
+
+
+int
+main (void)
+{
+
+             int result = 0;
+
+             nocrash_init();
+
+             /* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw,
+                and fails on Mac OS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5,
+                OSF/1 5.1, Solaris 10.  */
+             {
+               static char conftest[] = "conftest";
+               static char plus[] = "-+";
+               char *argv[3] = { conftest, plus, NULL };
+               opterr = 0;
+               if (getopt (2, argv, "+a") != '?')
+                 result |= 1;
+             }
+             /* This code succeeds on glibc 2.8, mingw,
+                and fails on Mac OS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11,
+                IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x.  */
+             {
+               static char program[] = "program";
+               static char p[] = "-p";
+               static char foo[] = "foo";
+               static char bar[] = "bar";
+               char *argv[] = { program, p, foo, bar, NULL };
+
+               optind = 1;
+               if (getopt (4, argv, "p::") != 'p')
+                 result |= 2;
+               else if (optarg != NULL)
+                 result |= 4;
+               else if (getopt (4, argv, "p::") != -1)
+                 result |= 6;
+               else if (optind != 2)
+                 result |= 8;
+             }
+             /* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0.  */
+             {
+               static char program[] = "program";
+               static char foo[] = "foo";
+               static char p[] = "-p";
+               char *argv[] = { program, foo, p, NULL };
+               optind = 0;
+               if (getopt (3, argv, "-p") != 1)
+                 result |= 16;
+               else if (getopt (3, argv, "-p") != 'p')
+                 result |= 16;
+             }
+             /* This code fails on glibc 2.11.  */
+             {
+               static char program[] = "program";
+               static char b[] = "-b";
+               static char a[] = "-a";
+               char *argv[] = { program, b, a, NULL };
+               optind = opterr = 0;
+               if (getopt (3, argv, "+:a:b") != 'b')
+                 result |= 32;
+               else if (getopt (3, argv, "+:a:b") != ':')
+                 result |= 32;
+             }
+             /* This code dumps core on glibc 2.14.  */
+             {
+               static char program[] = "program";
+               static char w[] = "-W";
+               static char dummy[] = "dummy";
+               char *argv[] = { program, w, dummy, NULL };
+               optind = opterr = 1;
+               if (getopt (3, argv, "W;") != 'W')
+                 result |= 64;
+             }
+             return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_getopt_gnu=yes
+else $as_nop
+  gl_cv_func_getopt_gnu=no
 fi
-GMSGFMT=$ac_cv_path_GMSGFMT
-if test -n "$GMSGFMT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
-$as_echo "$GMSGFMT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+       case $gl_had_POSIXLY_CORRECT in
+         exported) ;;
+         yes) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;}; POSIXLY_CORRECT=1 ;;
+         *) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;} ;;
+       esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_gnu" >&5
+printf "%s\n" "$gl_cv_func_getopt_gnu" >&6; }
+    if test "$gl_cv_func_getopt_gnu" != yes; then
+      gl_replace_getopt=yes
+    else
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working GNU getopt_long function" >&5
+printf %s "checking for working GNU getopt_long function... " >&6; }
+if test ${gl_cv_func_getopt_long_gnu+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+              case "$host_os" in
+              openbsd*) gl_cv_func_getopt_long_gnu="guessing no";;
+              *)        gl_cv_func_getopt_long_gnu="guessing yes";;
+            esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <getopt.h>
+                #include <stddef.h>
+                #include <string.h>
+
+int
+main (void)
+{
+static const struct option long_options[] =
+                  {
+                    { "xtremely-",no_argument,       NULL, 1003 },
+                    { "xtra",     no_argument,       NULL, 1001 },
+                    { "xtreme",   no_argument,       NULL, 1002 },
+                    { "xtremely", no_argument,       NULL, 1003 },
+                    { NULL,       0,                 NULL, 0 }
+                  };
+                /* This code fails on OpenBSD 5.0.  */
+                {
+                  static char program[] = "program";
+                  static char xtremel[] = "--xtremel";
+                  char *argv[] = { program, xtremel, NULL };
+                  int option_index;
+                  optind = 1; opterr = 0;
+                  if (getopt_long (2, argv, "", long_options, &option_index) != 1003)
+                    return 1;
+                }
+                return 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_getopt_long_gnu=yes
+else $as_nop
+  gl_cv_func_getopt_long_gnu=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
 
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_long_gnu" >&5
+printf "%s\n" "$gl_cv_func_getopt_long_gnu" >&6; }
+      case "$gl_cv_func_getopt_long_gnu" in
+        *yes) ;;
+        *) gl_replace_getopt=yes ;;
+      esac
+    fi
+  fi
 
-    case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
-    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
-    *) MSGFMT_015=$MSGFMT ;;
+
+
+
+
+    HAVE_GETRUSAGE=1;
+
+
+
+
+  GL_GNULIB_GETRUSAGE=0
+
+
+
+:
+
+
+    HAVE_GETTIMEOFDAY=1;
+  HAVE_STRUCT_TIMEVAL=1;
+  HAVE_SYS_TIME_H=1;
+  REPLACE_GETTIMEOFDAY=0;
+  REPLACE_STRUCT_TIMEVAL=0;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_sys_time_h='<'sys/time.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/time.h>" >&5
+printf %s "checking absolute name of <sys/time.h>... " >&6; }
+if test ${gl_cv_next_sys_time_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_sys_time_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/time.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
   esac
 
-  case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
-    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
-    *) GMSGFMT_015=$GMSGFMT ;;
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
   esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'sys/time.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_sys_time_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_sys_time_h
+           gl_cv_next_sys_time_h='"'$gl_header'"'
+          else
+               gl_cv_next_sys_time_h='<'sys/time.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_time_h" >&5
+printf "%s\n" "$gl_cv_next_sys_time_h" >&6; }
+     fi
+     NEXT_SYS_TIME_H=$gl_cv_next_sys_time_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'sys/time.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_sys_time_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H=$gl_next_as_first_directive
 
 
 
-# Prepare PATH_SEPARATOR.
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
-  # contains only /bin. Note that ksh looks also at the FPATH variable,
-  # so we have to set that as well for the test.
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-           || PATH_SEPARATOR=';'
-       }
+
+
+  if test $ac_cv_header_sys_time_h != yes; then
+    HAVE_SYS_TIME_H=0
+  fi
+
+
+
+
+
+  if test $ac_cv_header_sys_socket_h != yes; then
+                    ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h
+
 fi
 
-# Find out how to test for executable files. Don't use a zero-byte file,
-# as systems may use methods other than mode bits to determine executability.
-cat >conf$$.file <<_ASEOF
-#! /bin/sh
-exit 0
-_ASEOF
-chmod +x conf$$.file
-if test -x conf$$.file >/dev/null 2>&1; then
-  ac_executable_p="test -x"
-else
-  ac_executable_p="test -f"
+  fi
+  if test "$ac_cv_header_winsock2_h" = yes; then
+    HAVE_WINSOCK2_H=1
+    UNISTD_H_HAVE_WINSOCK2_H=1
+    SYS_IOCTL_H_HAVE_WINSOCK2_H=1
+  else
+    HAVE_WINSOCK2_H=0
+  fi
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timeval" >&5
+printf %s "checking for struct timeval... " >&6; }
+if test ${gl_cv_sys_struct_timeval+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if HAVE_SYS_TIME_H
+             #include <sys/time.h>
+            #endif
+            #include <time.h>
+            #if HAVE_WINSOCK2_H
+            # include <winsock2.h>
+            #endif
+
+int
+main (void)
+{
+static struct timeval x; x.tv_sec = x.tv_usec;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_sys_struct_timeval=yes
+else $as_nop
+  gl_cv_sys_struct_timeval=no
 fi
-rm -f conf$$.file
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 
-# Extract the first word of "xgettext", so it can be a program name with args.
-set dummy xgettext; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_XGETTEXT+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case "$XGETTEXT" in
-  [\\/]* | ?:[\\/]*)
-    ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
-    ;;
-  *)
-    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH; do
-      IFS="$ac_save_IFS"
-      test -z "$ac_dir" && ac_dir=.
-      for ac_exec_ext in '' $ac_executable_extensions; do
-        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
-          echo "$as_me: trying $ac_dir/$ac_word..." >&5
-          if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 &&
-     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
-            ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
-            break 2
-          fi
-        fi
-      done
-    done
-    IFS="$ac_save_IFS"
-  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
-    ;;
-esac
 fi
-XGETTEXT="$ac_cv_path_XGETTEXT"
-if test "$XGETTEXT" != ":"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
-$as_echo "$XGETTEXT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timeval" >&5
+printf "%s\n" "$gl_cv_sys_struct_timeval" >&6; }
+  if test $gl_cv_sys_struct_timeval != yes; then
+    HAVE_STRUCT_TIMEVAL=0
+  else
+                            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wide-enough struct timeval.tv_sec member" >&5
+printf %s "checking for wide-enough struct timeval.tv_sec member... " >&6; }
+if test ${gl_cv_sys_struct_timeval_tv_sec+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if HAVE_SYS_TIME_H
+               #include <sys/time.h>
+              #endif
+              #include <time.h>
+              #if HAVE_WINSOCK2_H
+              # include <winsock2.h>
+              #endif
+
+int
+main (void)
+{
+static struct timeval x;
+              typedef int verify_tv_sec_type[
+                sizeof (time_t) <= sizeof x.tv_sec ? 1 : -1
+              ];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_sys_struct_timeval_tv_sec=yes
+else $as_nop
+  gl_cv_sys_struct_timeval_tv_sec=no
 fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
 
-    rm -f messages.po
-
-    case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
-    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
-    *) XGETTEXT_015=$XGETTEXT ;;
-  esac
-
-
-
-# Prepare PATH_SEPARATOR.
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
-  # contains only /bin. Note that ksh looks also at the FPATH variable,
-  # so we have to set that as well for the test.
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-           || PATH_SEPARATOR=';'
-       }
 fi
-
-# Find out how to test for executable files. Don't use a zero-byte file,
-# as systems may use methods other than mode bits to determine executability.
-cat >conf$$.file <<_ASEOF
-#! /bin/sh
-exit 0
-_ASEOF
-chmod +x conf$$.file
-if test -x conf$$.file >/dev/null 2>&1; then
-  ac_executable_p="test -x"
-else
-  ac_executable_p="test -f"
-fi
-rm -f conf$$.file
-
-# Extract the first word of "msgmerge", so it can be a program name with args.
-set dummy msgmerge; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_MSGMERGE+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case "$MSGMERGE" in
-  [\\/]* | ?:[\\/]*)
-    ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
-    ;;
-  *)
-    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH; do
-      IFS="$ac_save_IFS"
-      test -z "$ac_dir" && ac_dir=.
-      for ac_exec_ext in '' $ac_executable_extensions; do
-        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
-          echo "$as_me: trying $ac_dir/$ac_word..." >&5
-          if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then
-            ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
-            break 2
-          fi
-        fi
-      done
-    done
-    IFS="$ac_save_IFS"
-  test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
-    ;;
-esac
-fi
-MSGMERGE="$ac_cv_path_MSGMERGE"
-if test "$MSGMERGE" != ":"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
-$as_echo "$MSGMERGE" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timeval_tv_sec" >&5
+printf "%s\n" "$gl_cv_sys_struct_timeval_tv_sec" >&6; }
+    if test $gl_cv_sys_struct_timeval_tv_sec != yes; then
+      REPLACE_STRUCT_TIMEVAL=1
+    fi
+  fi
 
 
-        test -n "$localedir" || localedir='${datadir}/locale'
 
 
-    test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
 
 
-  ac_config_commands="$ac_config_commands po-directories"
+
+  GL_GNULIB_GETTIMEOFDAY=0
+
 
 
 
@@ -42970,7 +21607,8 @@
 
 
 # Check whether --with-libiconv-prefix was given.
-if test "${with_libiconv_prefix+set}" = set; then :
+if test ${with_libiconv_prefix+y}
+then :
   withval=$with_libiconv_prefix;
     if test "X$withval" = "Xno"; then
       use_additional=no
@@ -43379,7 +22017,14 @@
                     fi
                     ;;
                   -l*)
-                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                                                                                                                                                                dep=`echo "X$dep" | sed -e 's/^X-l//'`
+                    if test "X$dep" != Xc \
+                       || case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) false ;;
+                            *)                          true ;;
+                          esac; then
+                      names_next_round="$names_next_round $dep"
+                    fi
                     ;;
                   *.la)
                                                                                 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
@@ -43433,94 +22078,33482 @@
 
 
 
+    ICONV_CONST=;
+  REPLACE_ICONV=0;
+  REPLACE_ICONV_OPEN=0;
+  REPLACE_ICONV_UTF=0;
+  ICONV_H='';
+  if false; then
+              ICONV_H='iconv.h'
+     fi
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5
-$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; }
-if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then :
-  $as_echo_n "(cached) " >&6
+   if test -n "$ICONV_H"; then
+  GL_GENERATE_ICONV_H_TRUE=
+  GL_GENERATE_ICONV_H_FALSE='#'
 else
+  GL_GENERATE_ICONV_H_TRUE='#'
+  GL_GENERATE_ICONV_H_FALSE=
+fi
+
+
+
+
+
+
+
+          am_save_CPPFLAGS="$CPPFLAGS"
+
+  for element in $INCICONV; do
+    haveit=
+    for x in $CPPFLAGS; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
+printf %s "checking for iconv... " >&6; }
+if test ${am_cv_func_iconv+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main (void)
+{
+iconv_t cd = iconv_open("","");
+           iconv(cd,NULL,NULL,NULL,NULL);
+           iconv_close(cd);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main (void)
+{
+iconv_t cd = iconv_open("","");
+             iconv(cd,NULL,NULL,NULL,NULL);
+             iconv_close(cd);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  am_cv_lib_iconv=yes
+        am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+      LIBS="$am_save_LIBS"
+    fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
+printf "%s\n" "$am_cv_func_iconv" >&6; }
+  if test "$am_cv_func_iconv" = yes; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5
+printf %s "checking for working iconv... " >&6; }
+if test ${am_cv_func_iconv_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+                  am_save_LIBS="$LIBS"
+      if test $am_cv_lib_iconv = yes; then
+        LIBS="$LIBS $LIBICONV"
+      fi
+      am_cv_func_iconv_works=no
+      for ac_iconv_const in '' 'const'; do
+        if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+             aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+             *)            am_cv_func_iconv_works="guessing yes" ;;
+           esac
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <iconv.h>
+#include <string.h>
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+
+int
+main (void)
+{
+int result = 0;
+  /* Test against AIX 5.1...7.2 bug: Failures are not distinguishable from
+     successful returns.  This is even documented in
+     <https://www.ibm.com/support/knowledgecenter/ssw_aix_72/i_bostechref/iconv.html> */
+  {
+    iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+    if (cd_utf8_to_88591 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
+        char buf[10];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_utf8_to_88591,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          result |= 1;
+        iconv_close (cd_utf8_to_88591);
+      }
+  }
+  /* Test against Solaris 10 bug: Failures are not distinguishable from
+     successful returns.  */
+  {
+    iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+    if (cd_ascii_to_88591 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\263";
+        char buf[10];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_ascii_to_88591,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          result |= 2;
+        iconv_close (cd_ascii_to_88591);
+      }
+  }
+  /* Test against AIX 6.1..7.1 bug: Buffer overrun.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\304";
+        static char buf[2] = { (char)0xDE, (char)0xAD };
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = 1;
+        char *outptr = buf;
+        size_t outbytesleft = 1;
+        size_t res = iconv (cd_88591_to_utf8,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+          result |= 4;
+        iconv_close (cd_88591_to_utf8);
+      }
+  }
+#if 0 /* This bug could be worked around by the caller.  */
+  /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+        char buf[50];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_88591_to_utf8,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if ((int)res > 0)
+          result |= 8;
+        iconv_close (cd_88591_to_utf8);
+      }
+  }
+#endif
+  /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+     provided.  */
+  {
+    /* Try standardized names.  */
+    iconv_t cd1 = iconv_open ("UTF-8", "EUC-JP");
+    /* Try IRIX, OSF/1 names.  */
+    iconv_t cd2 = iconv_open ("UTF-8", "eucJP");
+    /* Try AIX names.  */
+    iconv_t cd3 = iconv_open ("UTF-8", "IBM-eucJP");
+    /* Try HP-UX names.  */
+    iconv_t cd4 = iconv_open ("utf8", "eucJP");
+    if (cd1 == (iconv_t)(-1) && cd2 == (iconv_t)(-1)
+        && cd3 == (iconv_t)(-1) && cd4 == (iconv_t)(-1))
+      result |= 16;
+    if (cd1 != (iconv_t)(-1))
+      iconv_close (cd1);
+    if (cd2 != (iconv_t)(-1))
+      iconv_close (cd2);
+    if (cd3 != (iconv_t)(-1))
+      iconv_close (cd3);
+    if (cd4 != (iconv_t)(-1))
+      iconv_close (cd4);
+  }
+  return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  am_cv_func_iconv_works=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+        test "$am_cv_func_iconv_works" = no || break
+      done
+      LIBS="$am_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5
+printf "%s\n" "$am_cv_func_iconv_works" >&6; }
+    case "$am_cv_func_iconv_works" in
+      *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+      *)   am_func_iconv=yes ;;
+    esac
+  else
+    am_func_iconv=no am_cv_lib_iconv=no
+  fi
+  if test "$am_func_iconv" = yes; then
+
+printf "%s\n" "#define HAVE_ICONV 1" >>confdefs.h
+
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
+printf %s "checking how to link with libiconv... " >&6; }
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
+printf "%s\n" "$LIBICONV" >&6; }
+  else
+            CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+
+
+
+  if test "$am_cv_func_iconv" = yes; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether iconv is compatible with its POSIX signature" >&5
+printf %s "checking whether iconv is compatible with its POSIX signature... " >&6; }
+if test ${gl_cv_iconv_nonconst+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_iconv_nonconst=yes
+else $as_nop
+  gl_cv_iconv_nonconst=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_iconv_nonconst" >&5
+printf "%s\n" "$gl_cv_iconv_nonconst" >&6; }
+  else
+            gl_cv_iconv_nonconst=yes
+  fi
+  if test $gl_cv_iconv_nonconst = yes; then
+    iconv_arg1=""
+  else
+    iconv_arg1="const"
+  fi
+
+printf "%s\n" "#define ICONV_CONST $iconv_arg1" >>confdefs.h
+
+
+     if test $gl_cv_iconv_nonconst != yes; then
+       ICONV_CONST="const"
+     fi
+
+
+
+
+  GL_GNULIB_ICONV=0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_iconv_h='<'iconv.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <iconv.h>" >&5
+printf %s "checking absolute name of <iconv.h>... " >&6; }
+if test ${gl_cv_next_iconv_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_iconv_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <iconv.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'iconv.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_iconv_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_iconv_h
+           gl_cv_next_iconv_h='"'$gl_header'"'
+          else
+               gl_cv_next_iconv_h='<'iconv.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_iconv_h" >&5
+printf "%s\n" "$gl_cv_next_iconv_h" >&6; }
+     fi
+     NEXT_ICONV_H=$gl_cv_next_iconv_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'iconv.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_iconv_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_ICONV_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_limits_h='<'limits.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <limits.h>" >&5
+printf %s "checking absolute name of <limits.h>... " >&6; }
+if test ${gl_cv_next_limits_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_limits_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'limits.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_limits_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_limits_h
+           gl_cv_next_limits_h='"'$gl_header'"'
+          else
+               gl_cv_next_limits_h='<'limits.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_limits_h" >&5
+printf "%s\n" "$gl_cv_next_limits_h" >&6; }
+     fi
+     NEXT_LIMITS_H=$gl_cv_next_limits_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'limits.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_limits_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_LIMITS_H=$gl_next_as_first_directive
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether limits.h has WORD_BIT, BOOL_WIDTH etc." >&5
+printf %s "checking whether limits.h has WORD_BIT, BOOL_WIDTH etc.... " >&6; }
+if test ${gl_cv_header_limits_width+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+             #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+            #endif
+            #include <limits.h>
+            long long llm = LLONG_MAX;
+            int wb = WORD_BIT;
+            int ullw = ULLONG_WIDTH;
+            int bw = BOOL_WIDTH;
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_header_limits_width=yes
+else $as_nop
+  gl_cv_header_limits_width=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_limits_width" >&5
+printf "%s\n" "$gl_cv_header_limits_width" >&6; }
+  if test "$gl_cv_header_limits_width" = yes; then
+    LIMITS_H=
+  else
+    LIMITS_H=limits.h
+  fi
+
+   if test -n "$LIMITS_H"; then
+  GL_GENERATE_LIMITS_H_TRUE=
+  GL_GENERATE_LIMITS_H_FALSE='#'
+else
+  GL_GENERATE_LIMITS_H_TRUE='#'
+  GL_GENERATE_LIMITS_H_FALSE=
+fi
+
+
+
+
+
+
+
+
+printf "%s\n" "#define HAVE_LONG_LONG_INT 1" >>confdefs.h
+
+
+printf "%s\n" "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h
+
+
+
+  if test $ac_cv_header_wchar_h = yes; then
+    HAVE_WCHAR_H=1
+  else
+    HAVE_WCHAR_H=0
+  fi
+
+
+
+  if test $ac_cv_header_inttypes_h = yes; then
+    HAVE_INTTYPES_H=1
+  else
+    HAVE_INTTYPES_H=0
+  fi
+
+
+
+  if test $ac_cv_header_sys_types_h = yes; then
+    HAVE_SYS_TYPES_H=1
+  else
+    HAVE_SYS_TYPES_H=0
+  fi
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_stdint_h='<'stdint.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdint.h>" >&5
+printf %s "checking absolute name of <stdint.h>... " >&6; }
+if test ${gl_cv_next_stdint_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_stdint_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdint.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'stdint.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_stdint_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_stdint_h
+           gl_cv_next_stdint_h='"'$gl_header'"'
+          else
+               gl_cv_next_stdint_h='<'stdint.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdint_h" >&5
+printf "%s\n" "$gl_cv_next_stdint_h" >&6; }
+     fi
+     NEXT_STDINT_H=$gl_cv_next_stdint_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'stdint.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_stdint_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_STDINT_H=$gl_next_as_first_directive
+
+
+
+
+  if test $ac_cv_header_stdint_h = yes; then
+    HAVE_STDINT_H=1
+  else
+    HAVE_STDINT_H=0
+  fi
+
+
+    if test $ac_cv_header_stdint_h = yes; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stdint.h conforms to C99" >&5
+printf %s "checking whether stdint.h conforms to C99... " >&6; }
+if test ${gl_cv_header_working_stdint_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  gl_cv_header_working_stdint_h=no
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#include <stdint.h>
+/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in <wchar.h>.  */
+#if !(defined WCHAR_MIN && defined WCHAR_MAX)
+#error "WCHAR_MIN, WCHAR_MAX not defined in <stdint.h>"
+#endif
+
+
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <wchar.h>
+  #endif
+
+
+#ifdef INT8_MAX
+int8_t a1 = INT8_MAX;
+int8_t a1min = INT8_MIN;
+#endif
+#ifdef INT16_MAX
+int16_t a2 = INT16_MAX;
+int16_t a2min = INT16_MIN;
+#endif
+#ifdef INT32_MAX
+int32_t a3 = INT32_MAX;
+int32_t a3min = INT32_MIN;
+#endif
+#ifdef INT64_MAX
+int64_t a4 = INT64_MAX;
+int64_t a4min = INT64_MIN;
+#endif
+#ifdef UINT8_MAX
+uint8_t b1 = UINT8_MAX;
+#else
+typedef int b1[(unsigned char) -1 != 255 ? 1 : -1];
+#endif
+#ifdef UINT16_MAX
+uint16_t b2 = UINT16_MAX;
+#endif
+#ifdef UINT32_MAX
+uint32_t b3 = UINT32_MAX;
+#endif
+#ifdef UINT64_MAX
+uint64_t b4 = UINT64_MAX;
+#endif
+int_least8_t c1 = INT8_C (0x7f);
+int_least8_t c1max = INT_LEAST8_MAX;
+int_least8_t c1min = INT_LEAST8_MIN;
+int_least16_t c2 = INT16_C (0x7fff);
+int_least16_t c2max = INT_LEAST16_MAX;
+int_least16_t c2min = INT_LEAST16_MIN;
+int_least32_t c3 = INT32_C (0x7fffffff);
+int_least32_t c3max = INT_LEAST32_MAX;
+int_least32_t c3min = INT_LEAST32_MIN;
+int_least64_t c4 = INT64_C (0x7fffffffffffffff);
+int_least64_t c4max = INT_LEAST64_MAX;
+int_least64_t c4min = INT_LEAST64_MIN;
+uint_least8_t d1 = UINT8_C (0xff);
+uint_least8_t d1max = UINT_LEAST8_MAX;
+uint_least16_t d2 = UINT16_C (0xffff);
+uint_least16_t d2max = UINT_LEAST16_MAX;
+uint_least32_t d3 = UINT32_C (0xffffffff);
+uint_least32_t d3max = UINT_LEAST32_MAX;
+uint_least64_t d4 = UINT64_C (0xffffffffffffffff);
+uint_least64_t d4max = UINT_LEAST64_MAX;
+int_fast8_t e1 = INT_FAST8_MAX;
+int_fast8_t e1min = INT_FAST8_MIN;
+int_fast16_t e2 = INT_FAST16_MAX;
+int_fast16_t e2min = INT_FAST16_MIN;
+int_fast32_t e3 = INT_FAST32_MAX;
+int_fast32_t e3min = INT_FAST32_MIN;
+int_fast64_t e4 = INT_FAST64_MAX;
+int_fast64_t e4min = INT_FAST64_MIN;
+uint_fast8_t f1 = UINT_FAST8_MAX;
+uint_fast16_t f2 = UINT_FAST16_MAX;
+uint_fast32_t f3 = UINT_FAST32_MAX;
+uint_fast64_t f4 = UINT_FAST64_MAX;
+#ifdef INTPTR_MAX
+intptr_t g = INTPTR_MAX;
+intptr_t gmin = INTPTR_MIN;
+#endif
+#ifdef UINTPTR_MAX
+uintptr_t h = UINTPTR_MAX;
+#endif
+intmax_t i = INTMAX_MAX;
+uintmax_t j = UINTMAX_MAX;
+
+/* Check that SIZE_MAX has the correct type, if possible.  */
+#if 201112 <= __STDC_VERSION__
+int k = _Generic (SIZE_MAX, size_t: 0);
+#elif (2 <= __GNUC__ || 4 <= __clang_major__ || defined __IBM__TYPEOF__ \
+       || (0x5110 <= __SUNPRO_C && !__STDC__))
+extern size_t k;
+extern __typeof__ (SIZE_MAX) k;
+#endif
+
+#include <limits.h> /* for CHAR_BIT */
+#define TYPE_MINIMUM(t) \
+  ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t)))
+#define TYPE_MAXIMUM(t) \
+  ((t) ((t) 0 < (t) -1 \
+        ? (t) -1 \
+        : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
+struct s {
+  int check_PTRDIFF:
+      PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t)
+      && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t)
+      ? 1 : -1;
+  /* Detect bug in FreeBSD 6.0/ia64 and FreeBSD 13.0/arm64.  */
+  int check_SIG_ATOMIC:
+      SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t)
+      && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t)
+      ? 1 : -1;
+  int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1;
+  int check_WCHAR:
+      WCHAR_MIN == TYPE_MINIMUM (wchar_t)
+      && WCHAR_MAX == TYPE_MAXIMUM (wchar_t)
+      ? 1 : -1;
+  /* Detect bug in mingw.  */
+  int check_WINT:
+      WINT_MIN == TYPE_MINIMUM (wint_t)
+      && WINT_MAX == TYPE_MAXIMUM (wint_t)
+      ? 1 : -1;
+
+  /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others.  */
+  int check_UINT8_C:
+        (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1;
+  int check_UINT16_C:
+        (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1;
+
+  /* Detect bugs in OpenBSD 3.9 stdint.h.  */
+#ifdef UINT8_MAX
+  int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1;
+#endif
+#ifdef UINT16_MAX
+  int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1;
+#endif
+#ifdef UINT32_MAX
+  int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1;
+#endif
+#ifdef UINT64_MAX
+  int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1;
+#endif
+  int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1;
+  int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1;
+  int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1;
+  int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1;
+  int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1;
+  int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1;
+  int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1;
+  int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1;
+  int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1;
+  int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1;
+  int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1;
+};
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+                                                    if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                         # Guess yes on native Windows.
+                 mingw*) gl_cv_header_working_stdint_h="guessing yes" ;;
+                         # In general, assume it works.
+                 *)      gl_cv_header_working_stdint_h="guessing yes" ;;
+               esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#include <stdint.h>
+
+
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <wchar.h>
+  #endif
+
+
+#include <stdio.h>
+#include <string.h>
+#define MVAL(macro) MVAL1(macro)
+#define MVAL1(expression) #expression
+static const char *macro_values[] =
+  {
+#ifdef INT8_MAX
+    MVAL (INT8_MAX),
+#endif
+#ifdef INT16_MAX
+    MVAL (INT16_MAX),
+#endif
+#ifdef INT32_MAX
+    MVAL (INT32_MAX),
+#endif
+#ifdef INT64_MAX
+    MVAL (INT64_MAX),
+#endif
+#ifdef UINT8_MAX
+    MVAL (UINT8_MAX),
+#endif
+#ifdef UINT16_MAX
+    MVAL (UINT16_MAX),
+#endif
+#ifdef UINT32_MAX
+    MVAL (UINT32_MAX),
+#endif
+#ifdef UINT64_MAX
+    MVAL (UINT64_MAX),
+#endif
+    NULL
+  };
+
+int
+main (void)
+{
+
+  const char **mv;
+  for (mv = macro_values; *mv != NULL; mv++)
+    {
+      const char *value = *mv;
+      /* Test whether it looks like a cast expression.  */
+      if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0
+          || strncmp (value, "((unsigned short)"/*)*/, 17) == 0
+          || strncmp (value, "((unsigned char)"/*)*/, 16) == 0
+          || strncmp (value, "((int)"/*)*/, 6) == 0
+          || strncmp (value, "((signed short)"/*)*/, 15) == 0
+          || strncmp (value, "((signed char)"/*)*/, 14) == 0)
+        return mv - macro_values + 1;
+    }
+  return 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_header_working_stdint_h=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_stdint_h" >&5
+printf "%s\n" "$gl_cv_header_working_stdint_h" >&6; }
+  fi
+
+  HAVE_C99_STDINT_H=0
+  HAVE_SYS_BITYPES_H=0
+  HAVE_SYS_INTTYPES_H=0
+  STDINT_H=stdint.h
+  case "$gl_cv_header_working_stdint_h" in
+    *yes)
+      HAVE_C99_STDINT_H=1
+                        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stdint.h works without ISO C predefines" >&5
+printf %s "checking whether stdint.h works without ISO C predefines... " >&6; }
+if test ${gl_cv_header_stdint_without_STDC_macros+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  gl_cv_header_stdint_without_STDC_macros=no
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#include <stdint.h>
+
+
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <wchar.h>
+  #endif
+
+
+intmax_t im = INTMAX_MAX;
+int32_t i32 = INT32_C (0x7fffffff);
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_header_stdint_without_STDC_macros=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_without_STDC_macros" >&5
+printf "%s\n" "$gl_cv_header_stdint_without_STDC_macros" >&6; }
+
+      if test $gl_cv_header_stdint_without_STDC_macros = no; then
+
+printf "%s\n" "#define __STDC_CONSTANT_MACROS 1" >>confdefs.h
+
+
+printf "%s\n" "#define __STDC_LIMIT_MACROS 1" >>confdefs.h
+
+      fi
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stdint.h has UINTMAX_WIDTH etc." >&5
+printf %s "checking whether stdint.h has UINTMAX_WIDTH etc.... " >&6; }
+if test ${gl_cv_header_stdint_width+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  gl_cv_header_stdint_width=no
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+              /* Work if build is not clean.  */
+              #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1
+              #ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+               #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+              #endif
+              #include <stdint.h>
+
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <wchar.h>
+  #endif
+
+              int iw = UINTMAX_WIDTH;
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_header_stdint_width=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_width" >&5
+printf "%s\n" "$gl_cv_header_stdint_width" >&6; }
+      if test "$gl_cv_header_stdint_width" = yes; then
+        STDINT_H=
+      fi
+      ;;
+    *)
+                  ac_fn_c_check_header_compile "$LINENO" "sys/inttypes.h" "ac_cv_header_sys_inttypes_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_inttypes_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_SYS_INTTYPES_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/bitypes.h" "ac_cv_header_sys_bitypes_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_bitypes_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_SYS_BITYPES_H 1" >>confdefs.h
+
+fi
+
+      if test $ac_cv_header_sys_inttypes_h = yes; then
+        HAVE_SYS_INTTYPES_H=1
+      fi
+      if test $ac_cv_header_sys_bitypes_h = yes; then
+        HAVE_SYS_BITYPES_H=1
+      fi
+
+
+  if test $APPLE_UNIVERSAL_BUILD = 0; then
+
+
+  for gltype in ptrdiff_t size_t ; do
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5
+printf %s "checking for bit size of $gltype... " >&6; }
+if eval test \${gl_cv_bitsizeof_${gltype}+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result"        "
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <wchar.h>
+  #endif
+
+#include <limits.h>"
+then :
+
+else $as_nop
+  result=unknown
+fi
+
+       eval gl_cv_bitsizeof_${gltype}=\$result
+
+fi
+eval ac_res=\$gl_cv_bitsizeof_${gltype}
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+    eval result=\$gl_cv_bitsizeof_${gltype}
+    if test $result = unknown; then
+                                                result=0
+    fi
+    GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+    printf "%s\n" "#define BITSIZEOF_${GLTYPE} $result" >>confdefs.h
+
+    eval BITSIZEOF_${GLTYPE}=\$result
+  done
+
+
+  fi
+
+
+  for gltype in sig_atomic_t wchar_t wint_t ; do
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5
+printf %s "checking for bit size of $gltype... " >&6; }
+if eval test \${gl_cv_bitsizeof_${gltype}+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result"        "
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <wchar.h>
+  #endif
+
+#include <limits.h>"
+then :
+
+else $as_nop
+  result=unknown
+fi
+
+       eval gl_cv_bitsizeof_${gltype}=\$result
+
+fi
+eval ac_res=\$gl_cv_bitsizeof_${gltype}
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+    eval result=\$gl_cv_bitsizeof_${gltype}
+    if test $result = unknown; then
+                                                result=0
+    fi
+    GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+    printf "%s\n" "#define BITSIZEOF_${GLTYPE} $result" >>confdefs.h
+
+    eval BITSIZEOF_${GLTYPE}=\$result
+  done
+
+
+
+
+  for gltype in sig_atomic_t wchar_t wint_t ; do
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $gltype is signed" >&5
+printf %s "checking whether $gltype is signed... " >&6; }
+if eval test \${gl_cv_type_${gltype}_signed+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <wchar.h>
+  #endif
+
+            int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  result=yes
+else $as_nop
+  result=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+       eval gl_cv_type_${gltype}_signed=\$result
+
+fi
+eval ac_res=\$gl_cv_type_${gltype}_signed
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+    eval result=\$gl_cv_type_${gltype}_signed
+    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+    if test "$result" = yes; then
+      printf "%s\n" "#define HAVE_SIGNED_${GLTYPE} 1" >>confdefs.h
+
+      eval HAVE_SIGNED_${GLTYPE}=1
+    else
+      eval HAVE_SIGNED_${GLTYPE}=0
+    fi
+  done
+
+
+  gl_cv_type_ptrdiff_t_signed=yes
+  gl_cv_type_size_t_signed=no
+  if test $APPLE_UNIVERSAL_BUILD = 0; then
+
+
+  for gltype in ptrdiff_t size_t ; do
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5
+printf %s "checking for $gltype integer literal suffix... " >&6; }
+if eval test \${gl_cv_type_${gltype}_suffix+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  eval gl_cv_type_${gltype}_suffix=no
+       eval result=\$gl_cv_type_${gltype}_signed
+       if test "$result" = yes; then
+         glsufu=
+       else
+         glsufu=u
+       fi
+       for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
+         case $glsuf in
+           '')  gltype1='int';;
+           l)   gltype1='long int';;
+           ll)  gltype1='long long int';;
+           i64) gltype1='__int64';;
+           u)   gltype1='unsigned int';;
+           ul)  gltype1='unsigned long int';;
+           ull) gltype1='unsigned long long int';;
+           ui64)gltype1='unsigned __int64';;
+         esac
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <wchar.h>
+  #endif
+
+              extern $gltype foo;
+              extern $gltype1 foo;
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  eval gl_cv_type_${gltype}_suffix=\$glsuf
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+         eval result=\$gl_cv_type_${gltype}_suffix
+         test "$result" != no && break
+       done
+fi
+eval ac_res=\$gl_cv_type_${gltype}_suffix
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+    eval result=\$gl_cv_type_${gltype}_suffix
+    test "$result" = no && result=
+    eval ${GLTYPE}_SUFFIX=\$result
+    printf "%s\n" "#define ${GLTYPE}_SUFFIX $result" >>confdefs.h
+
+  done
+
+
+  fi
+
+
+  for gltype in sig_atomic_t wchar_t wint_t ; do
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5
+printf %s "checking for $gltype integer literal suffix... " >&6; }
+if eval test \${gl_cv_type_${gltype}_suffix+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  eval gl_cv_type_${gltype}_suffix=no
+       eval result=\$gl_cv_type_${gltype}_signed
+       if test "$result" = yes; then
+         glsufu=
+       else
+         glsufu=u
+       fi
+       for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
+         case $glsuf in
+           '')  gltype1='int';;
+           l)   gltype1='long int';;
+           ll)  gltype1='long long int';;
+           i64) gltype1='__int64';;
+           u)   gltype1='unsigned int';;
+           ul)  gltype1='unsigned long int';;
+           ull) gltype1='unsigned long long int';;
+           ui64)gltype1='unsigned __int64';;
+         esac
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <wchar.h>
+  #endif
+
+              extern $gltype foo;
+              extern $gltype1 foo;
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  eval gl_cv_type_${gltype}_suffix=\$glsuf
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+         eval result=\$gl_cv_type_${gltype}_suffix
+         test "$result" != no && break
+       done
+fi
+eval ac_res=\$gl_cv_type_${gltype}_suffix
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+    eval result=\$gl_cv_type_${gltype}_suffix
+    test "$result" = no && result=
+    eval ${GLTYPE}_SUFFIX=\$result
+    printf "%s\n" "#define ${GLTYPE}_SUFFIX $result" >>confdefs.h
+
+  done
+
+
+
+          if test $GNULIBHEADERS_OVERRIDE_WINT_T = 1; then
+    BITSIZEOF_WINT_T=32
+  fi
+
+      ;;
+  esac
+
+
+
+  LIMITS_H='limits.h'
+   if test -n "$LIMITS_H"; then
+  GL_GENERATE_LIMITS_H_TRUE=
+  GL_GENERATE_LIMITS_H_FALSE='#'
+else
+  GL_GENERATE_LIMITS_H_TRUE='#'
+  GL_GENERATE_LIMITS_H_FALSE=
+fi
+
+
+
+
+
+
+
+   if test -n "$STDINT_H"; then
+  GL_GENERATE_STDINT_H_TRUE=
+  GL_GENERATE_STDINT_H_FALSE='#'
+else
+  GL_GENERATE_STDINT_H_TRUE='#'
+  GL_GENERATE_STDINT_H_FALSE=
+fi
+
+
+
+    HAVE_DECL_IMAXABS=1;
+  HAVE_DECL_IMAXDIV=1;
+  HAVE_DECL_STRTOIMAX=1;
+  HAVE_DECL_STRTOUMAX=1;
+  HAVE_IMAXDIV_T=1;
+  REPLACE_STRTOIMAX=0;
+  REPLACE_STRTOUMAX=0;
+  INT32_MAX_LT_INTMAX_MAX=1;
+  INT64_MAX_EQ_LONG_MAX='defined _LP64';
+  PRIPTR_PREFIX=__PRIPTR_PREFIX;
+  UINT32_MAX_LT_UINTMAX_MAX=1;
+  UINT64_MAX_EQ_ULONG_MAX='defined _LP64';
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_inttypes_h='<'inttypes.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <inttypes.h>" >&5
+printf %s "checking absolute name of <inttypes.h>... " >&6; }
+if test ${gl_cv_next_inttypes_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_inttypes_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <inttypes.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'inttypes.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_inttypes_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_inttypes_h
+           gl_cv_next_inttypes_h='"'$gl_header'"'
+          else
+               gl_cv_next_inttypes_h='<'inttypes.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_inttypes_h" >&5
+printf "%s\n" "$gl_cv_next_inttypes_h" >&6; }
+     fi
+     NEXT_INTTYPES_H=$gl_cv_next_inttypes_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'inttypes.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_inttypes_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  PRIPTR_PREFIX=
+  if test -n "$STDINT_H"; then
+            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+         #ifdef _WIN64
+         LLP64
+         #endif
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  PRIPTR_PREFIX='"l"'
+else $as_nop
+  PRIPTR_PREFIX='"ll"'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+  else
+        for glpfx in '' l ll I64; do
+      case $glpfx in
+        '')  gltype1='int';;
+        l)   gltype1='long int';;
+        ll)  gltype1='long long int';;
+        I64) gltype1='__int64';;
+      esac
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdint.h>
+           extern intptr_t foo;
+           extern $gltype1 foo;
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  PRIPTR_PREFIX='"'$glpfx'"'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+      test -n "$PRIPTR_PREFIX" && break
+    done
+  fi
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether INT32_MAX < INTMAX_MAX" >&5
+printf %s "checking whether INT32_MAX < INTMAX_MAX... " >&6; }
+if test ${gl_cv_test_INT32_MAX_LT_INTMAX_MAX+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Work also in C++ mode.  */
+            #define __STDC_LIMIT_MACROS 1
+
+            /* Work if build is not clean.  */
+            #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+
+            #include <limits.h>
+            #if HAVE_STDINT_H
+             #include <stdint.h>
+            #endif
+
+            #if defined INT32_MAX && defined INTMAX_MAX
+             #define CONDITION (INT32_MAX < INTMAX_MAX)
+            #else
+             #define CONDITION (sizeof (int) < sizeof (long long int))
+            #endif
+            int test[CONDITION ? 1 : -1];
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_test_INT32_MAX_LT_INTMAX_MAX=yes
+else $as_nop
+  gl_cv_test_INT32_MAX_LT_INTMAX_MAX=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_test_INT32_MAX_LT_INTMAX_MAX" >&5
+printf "%s\n" "$gl_cv_test_INT32_MAX_LT_INTMAX_MAX" >&6; }
+  if test $gl_cv_test_INT32_MAX_LT_INTMAX_MAX = yes; then
+    INT32_MAX_LT_INTMAX_MAX=1;
+  else
+    INT32_MAX_LT_INTMAX_MAX=0;
+  fi
+
+
+  if test $APPLE_UNIVERSAL_BUILD = 0; then
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether INT64_MAX == LONG_MAX" >&5
+printf %s "checking whether INT64_MAX == LONG_MAX... " >&6; }
+if test ${gl_cv_test_INT64_MAX_EQ_LONG_MAX+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Work also in C++ mode.  */
+            #define __STDC_LIMIT_MACROS 1
+
+            /* Work if build is not clean.  */
+            #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+
+            #include <limits.h>
+            #if HAVE_STDINT_H
+             #include <stdint.h>
+            #endif
+
+            #if defined INT64_MAX
+             #define CONDITION (INT64_MAX == LONG_MAX)
+            #else
+             #define CONDITION (sizeof (long long int) == sizeof (long int))
+            #endif
+            int test[CONDITION ? 1 : -1];
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_test_INT64_MAX_EQ_LONG_MAX=yes
+else $as_nop
+  gl_cv_test_INT64_MAX_EQ_LONG_MAX=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_test_INT64_MAX_EQ_LONG_MAX" >&5
+printf "%s\n" "$gl_cv_test_INT64_MAX_EQ_LONG_MAX" >&6; }
+  if test $gl_cv_test_INT64_MAX_EQ_LONG_MAX = yes; then
+    INT64_MAX_EQ_LONG_MAX=1;
+  else
+    INT64_MAX_EQ_LONG_MAX=0;
+  fi
+
+
+  else
+    INT64_MAX_EQ_LONG_MAX=-1
+  fi
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether UINT32_MAX < UINTMAX_MAX" >&5
+printf %s "checking whether UINT32_MAX < UINTMAX_MAX... " >&6; }
+if test ${gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Work also in C++ mode.  */
+            #define __STDC_LIMIT_MACROS 1
+
+            /* Work if build is not clean.  */
+            #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+
+            #include <limits.h>
+            #if HAVE_STDINT_H
+             #include <stdint.h>
+            #endif
+
+            #if defined UINT32_MAX && defined UINTMAX_MAX
+             #define CONDITION (UINT32_MAX < UINTMAX_MAX)
+            #else
+             #define CONDITION (sizeof (unsigned int) < sizeof (unsigned long long int))
+            #endif
+            int test[CONDITION ? 1 : -1];
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX=yes
+else $as_nop
+  gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX" >&5
+printf "%s\n" "$gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX" >&6; }
+  if test $gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX = yes; then
+    UINT32_MAX_LT_UINTMAX_MAX=1;
+  else
+    UINT32_MAX_LT_UINTMAX_MAX=0;
+  fi
+
+
+  if test $APPLE_UNIVERSAL_BUILD = 0; then
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether UINT64_MAX == ULONG_MAX" >&5
+printf %s "checking whether UINT64_MAX == ULONG_MAX... " >&6; }
+if test ${gl_cv_test_UINT64_MAX_EQ_ULONG_MAX+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Work also in C++ mode.  */
+            #define __STDC_LIMIT_MACROS 1
+
+            /* Work if build is not clean.  */
+            #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+
+            #include <limits.h>
+            #if HAVE_STDINT_H
+             #include <stdint.h>
+            #endif
+
+            #if defined UINT64_MAX
+             #define CONDITION (UINT64_MAX == ULONG_MAX)
+            #else
+             #define CONDITION (sizeof (unsigned long long int) == sizeof (unsigned long int))
+            #endif
+            int test[CONDITION ? 1 : -1];
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_test_UINT64_MAX_EQ_ULONG_MAX=yes
+else $as_nop
+  gl_cv_test_UINT64_MAX_EQ_ULONG_MAX=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_test_UINT64_MAX_EQ_ULONG_MAX" >&5
+printf "%s\n" "$gl_cv_test_UINT64_MAX_EQ_ULONG_MAX" >&6; }
+  if test $gl_cv_test_UINT64_MAX_EQ_ULONG_MAX = yes; then
+    UINT64_MAX_EQ_ULONG_MAX=1;
+  else
+    UINT64_MAX_EQ_ULONG_MAX=0;
+  fi
+
+
+  else
+    UINT64_MAX_EQ_ULONG_MAX=-1
+  fi
+
+
+
+
+  GL_GNULIB_IMAXABS=0
+
+
+
+  GL_GNULIB_IMAXDIV=0
+
+
+
+  GL_GNULIB_STRTOIMAX=0
+
+
+
+  GL_GNULIB_STRTOUMAX=0
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5
+printf %s "checking where to find the exponent in a 'float'... " >&6; }
+if test ${gl_cv_cc_float_expbit0+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  gl_cv_cc_float_expbit0="word 0 bit 23"
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { float value; unsigned int word[NWORDS]; } memory_float;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (float x)
+{
+  memory_float m;
+  size_t i;
+  /* Clear it first, in case
+     sizeof (float) < sizeof (memory_float).  */
+  memset (&m, 0, sizeof (memory_float));
+  m.value = x;
+  for (i = 0; i < NWORDS; i++)
+    {
+      ored_words[i] |= m.word[i];
+      anded_words[i] &= m.word[i];
+    }
+}
+int main ()
+{
+  size_t j;
+  FILE *fp = fopen ("conftest.out", "w");
+  if (fp == NULL)
+    return 1;
+  for (j = 0; j < NWORDS; j++)
+    anded_words[j] = ~ (unsigned int) 0;
+  add_to_ored_words (0.25f);
+  add_to_ored_words (0.5f);
+  add_to_ored_words (1.0f);
+  add_to_ored_words (2.0f);
+  add_to_ored_words (4.0f);
+  /* Remove bits that are common (e.g. if representation of the first mantissa
+     bit is explicit).  */
+  for (j = 0; j < NWORDS; j++)
+    ored_words[j] &= ~anded_words[j];
+  /* Now find the nonzero word.  */
+  for (j = 0; j < NWORDS; j++)
+    if (ored_words[j] != 0)
+      break;
+  if (j < NWORDS)
+    {
+      size_t i;
+      for (i = j + 1; i < NWORDS; i++)
+        if (ored_words[i] != 0)
+          {
+            fprintf (fp, "unknown");
+            return (fclose (fp) != 0);
+          }
+      for (i = 0; ; i++)
+        if ((ored_words[j] >> i) & 1)
+          {
+            fprintf (fp, "word %d bit %d", (int) j, (int) i);
+            return (fclose (fp) != 0);
+          }
+    }
+  fprintf (fp, "unknown");
+  return (fclose (fp) != 0);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_cc_float_expbit0=`cat conftest.out`
+else $as_nop
+  gl_cv_cc_float_expbit0="unknown"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      rm -f conftest.out
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5
+printf "%s\n" "$gl_cv_cc_float_expbit0" >&6; }
+  case "$gl_cv_cc_float_expbit0" in
+    word*bit*)
+      word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+      bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'`
+
+printf "%s\n" "#define FLT_EXPBIT0_WORD $word" >>confdefs.h
+
+
+printf "%s\n" "#define FLT_EXPBIT0_BIT $bit" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  ISNANF_LIBM=
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used without linking with libm" >&5
+printf %s "checking whether isnan(float) can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_isnanf_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+             # undef isnanf
+             # define isnanf(x) __builtin_isnan ((float)(x))
+             #elif defined isnan
+             # undef isnanf
+             # define isnanf(x) isnan ((float)(x))
+             #endif
+             float x;
+int
+main (void)
+{
+return isnanf (x);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_isnanf_no_libm=yes
+else $as_nop
+  gl_cv_func_isnanf_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_no_libm" >&5
+printf "%s\n" "$gl_cv_func_isnanf_no_libm" >&6; }
+
+  if test $gl_cv_func_isnanf_no_libm = no; then
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used with libm" >&5
+printf %s "checking whether isnan(float) can be used with libm... " >&6; }
+if test ${gl_cv_func_isnanf_in_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      save_LIBS="$LIBS"
+      LIBS="$LIBS -lm"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+             # undef isnanf
+             # define isnanf(x) __builtin_isnan ((float)(x))
+             #elif defined isnan
+             # undef isnanf
+             # define isnanf(x) isnan ((float)(x))
+             #endif
+             float x;
+int
+main (void)
+{
+return isnanf (x);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_isnanf_in_libm=yes
+else $as_nop
+  gl_cv_func_isnanf_in_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+      LIBS="$save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_in_libm" >&5
+printf "%s\n" "$gl_cv_func_isnanf_in_libm" >&6; }
+
+    if test $gl_cv_func_isnanf_in_libm = yes; then
+      ISNANF_LIBM=-lm
+    fi
+  fi
+    if test $gl_cv_func_isnanf_no_libm = yes \
+     || test $gl_cv_func_isnanf_in_libm = yes; then
+    save_LIBS="$LIBS"
+    LIBS="$LIBS $ISNANF_LIBM"
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) works" >&5
+printf %s "checking whether isnan(float) works... " >&6; }
+if test ${gl_cv_func_isnanf_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+           irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;;
+           mingw*) # Guess yes on mingw, no on MSVC.
+             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef __MINGW32__
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Known" >/dev/null 2>&1
+then :
+  gl_cv_func_isnanf_works="guessing yes"
+else $as_nop
+  gl_cv_func_isnanf_works="guessing no"
+fi
+rm -rf conftest*
+
+             ;;
+           *) gl_cv_func_isnanf_works="guessing yes" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <math.h>
+#if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# undef isnanf
+# define isnanf(x) __builtin_isnan ((float)(x))
+#elif defined isnan
+# undef isnanf
+# define isnanf(x) isnan ((float)(x))
+#endif
+/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0.  */
+#ifdef __DECC
+static float
+NaN ()
+{
+  static float zero = 0.0f;
+  return zero / zero;
+}
+#else
+# define NaN() (0.0f / 0.0f)
+#endif
+#define NWORDS \
+  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { unsigned int word[NWORDS]; float value; } memory_float;
+int main()
+{
+  int result = 0;
+
+  if (isnanf (1.0f / 0.0f))
+    result |= 1;
+
+  if (!isnanf (NaN ()))
+    result |= 2;
+
+#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
+  /* The isnanf function should be immune against changes in the sign bit and
+     in the mantissa bits.  The xor operation twiddles a bit that can only be
+     a sign bit or a mantissa bit.  */
+  if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0)
+    {
+      memory_float m;
+
+      m.value = NaN ();
+      /* Set the bits below the exponent to 01111...111.  */
+      m.word[0] &= -1U << FLT_EXPBIT0_BIT;
+      m.word[0] |= (1U << (FLT_EXPBIT0_BIT - 1)) - 1;
+      if (!isnanf (m.value))
+        result |= 4;
+    }
+#endif
+
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_isnanf_works=yes
+else $as_nop
+  gl_cv_func_isnanf_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_works" >&5
+printf "%s\n" "$gl_cv_func_isnanf_works" >&6; }
+
+    LIBS="$save_LIBS"
+    case "$gl_cv_func_isnanf_works" in
+      *yes) gl_func_isnanf=yes ;;
+      *)    gl_func_isnanf=no; ISNANF_LIBM= ;;
+    esac
+  else
+    gl_func_isnanf=no
+  fi
+  if test $gl_func_isnanf != yes; then
+    HAVE_ISNANF=0
+  fi
+
+
+
+
+  ISNAND_LIBM=
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used without linking with libm" >&5
+printf %s "checking whether isnan(double) can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_isnand_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+             # undef isnand
+             # define isnand(x) __builtin_isnan ((double)(x))
+             #else
+             # undef isnand
+             # define isnand(x) isnan ((double)(x))
+             #endif
+             double x;
+int
+main (void)
+{
+return isnand (x);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_isnand_no_libm=yes
+else $as_nop
+  gl_cv_func_isnand_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_no_libm" >&5
+printf "%s\n" "$gl_cv_func_isnand_no_libm" >&6; }
+
+  if test $gl_cv_func_isnand_no_libm = no; then
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used with libm" >&5
+printf %s "checking whether isnan(double) can be used with libm... " >&6; }
+if test ${gl_cv_func_isnand_in_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      save_LIBS="$LIBS"
+      LIBS="$LIBS -lm"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+             # undef isnand
+             # define isnand(x) __builtin_isnan ((double)(x))
+             #elif defined isnan
+             # undef isnand
+             # define isnand(x) isnan ((double)(x))
+             #endif
+             double x;
+int
+main (void)
+{
+return isnand (x);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_isnand_in_libm=yes
+else $as_nop
+  gl_cv_func_isnand_in_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+      LIBS="$save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_in_libm" >&5
+printf "%s\n" "$gl_cv_func_isnand_in_libm" >&6; }
+
+    if test $gl_cv_func_isnand_in_libm = yes; then
+      ISNAND_LIBM=-lm
+    fi
+  fi
+    if test $gl_cv_func_isnand_no_libm = yes \
+     || test $gl_cv_func_isnand_in_libm = yes; then
+    gl_func_isnand=yes
+  else
+    gl_func_isnand=no
+    HAVE_ISNAND=0
+  fi
+
+
+
+
+  ISNANL_LIBM=
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used without linking with libm" >&5
+printf %s "checking whether isnan(long double) can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_isnanl_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+             # undef isnanl
+             # define isnanl(x) __builtin_isnan ((long double)(x))
+             #elif defined isnan
+             # undef isnanl
+             # define isnanl(x) isnan ((long double)(x))
+             #endif
+             long double x;
+int
+main (void)
+{
+return isnanl (x);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_isnanl_no_libm=yes
+else $as_nop
+  gl_cv_func_isnanl_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_no_libm" >&5
+printf "%s\n" "$gl_cv_func_isnanl_no_libm" >&6; }
+
+  if test $gl_cv_func_isnanl_no_libm = no; then
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used with libm" >&5
+printf %s "checking whether isnan(long double) can be used with libm... " >&6; }
+if test ${gl_cv_func_isnanl_in_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      save_LIBS="$LIBS"
+      LIBS="$LIBS -lm"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+             # undef isnanl
+             # define isnanl(x) __builtin_isnan ((long double)(x))
+             #elif defined isnan
+             # undef isnanl
+             # define isnanl(x) isnan ((long double)(x))
+             #endif
+             long double x;
+int
+main (void)
+{
+return isnanl (x);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_isnanl_in_libm=yes
+else $as_nop
+  gl_cv_func_isnanl_in_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+      LIBS="$save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_in_libm" >&5
+printf "%s\n" "$gl_cv_func_isnanl_in_libm" >&6; }
+
+    if test $gl_cv_func_isnanl_in_libm = yes; then
+      ISNANL_LIBM=-lm
+    fi
+  fi
+    if test $gl_cv_func_isnanl_no_libm = yes \
+     || test $gl_cv_func_isnanl_in_libm = yes; then
+    save_LIBS="$LIBS"
+    LIBS="$LIBS $ISNANL_LIBM"
+
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnanl works" >&5
+printf %s "checking whether isnanl works... " >&6; }
+if test ${gl_cv_func_isnanl_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+           mingw*) # Guess yes on mingw, no on MSVC.
+             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef __MINGW32__
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Known" >/dev/null 2>&1
+then :
+  gl_cv_func_isnanl_works="guessing yes"
+else $as_nop
+  gl_cv_func_isnanl_works="guessing no"
+fi
+rm -rf conftest*
+
+             ;;
+           *) gl_cv_func_isnanl_works="guessing yes" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# undef isnanl
+# define isnanl(x) __builtin_isnan ((long double)(x))
+#elif defined isnan
+# undef isnanl
+# define isnanl(x) isnan ((long double)(x))
+#endif
+#define NWORDS \
+  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { unsigned int word[NWORDS]; long double value; }
+        memory_long_double;
+/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
+   runtime type conversion.  */
+#ifdef __sgi
+static long double NaNl ()
+{
+  double zero = 0.0;
+  return zero / zero;
+}
+#else
+# define NaNl() (0.0L / 0.0L)
+#endif
+int main ()
+{
+  int result = 0;
+
+  if (!isnanl (NaNl ()))
+    result |= 1;
+
+  {
+    memory_long_double m;
+    unsigned int i;
+
+    /* The isnanl function should be immune against changes in the sign bit and
+       in the mantissa bits.  The xor operation twiddles a bit that can only be
+       a sign bit or a mantissa bit (since the exponent never extends to
+       bit 31).  */
+    m.value = NaNl ();
+    m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+    for (i = 0; i < NWORDS; i++)
+      m.word[i] |= 1;
+    if (!isnanl (m.value))
+      result |= 1;
+  }
+
+#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+   of 'unsigned int' words.  */
+# ifdef WORDS_BIGENDIAN
+#  define LDBL80_WORDS(exponent,manthi,mantlo) \
+     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+       ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16),   \
+       (unsigned int) (mantlo) << 16                                        \
+     }
+# else
+#  define LDBL80_WORDS(exponent,manthi,mantlo) \
+     { mantlo, manthi, exponent }
+# endif
+  { /* Quiet NaN.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+    if (!isnanl (x.value))
+      result |= 2;
+  }
+  {
+    /* Signalling NaN.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+    if (!isnanl (x.value))
+      result |= 2;
+  }
+  /* isnanl should return something even for noncanonical values.  */
+  { /* Pseudo-NaN.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+    if (isnanl (x.value) && !isnanl (x.value))
+      result |= 4;
+  }
+  { /* Pseudo-Infinity.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+    if (isnanl (x.value) && !isnanl (x.value))
+      result |= 8;
+  }
+  { /* Pseudo-Zero.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+    if (isnanl (x.value) && !isnanl (x.value))
+      result |= 16;
+  }
+  { /* Unnormalized number.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+    if (isnanl (x.value) && !isnanl (x.value))
+      result |= 32;
+  }
+  { /* Pseudo-Denormal.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+    if (isnanl (x.value) && !isnanl (x.value))
+      result |= 64;
+  }
+#endif
+
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_isnanl_works=yes
+else $as_nop
+  gl_cv_func_isnanl_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_works" >&5
+printf "%s\n" "$gl_cv_func_isnanl_works" >&6; }
+
+    LIBS="$save_LIBS"
+    case "$gl_cv_func_isnanl_works" in
+      *yes) gl_func_isnanl=yes ;;
+      *)    gl_func_isnanl=no; ISNANL_LIBM= ;;
+    esac
+  else
+    gl_func_isnanl=no
+  fi
+  if test $gl_func_isnanl != yes; then
+    HAVE_ISNANL=0
+  fi
+
+
+
+    HAVE_ISWBLANK=1;
+  HAVE_WCTYPE_T=1;
+  HAVE_WCTRANS_T=1;
+  REPLACE_ISWBLANK=0;
+  REPLACE_ISWDIGIT=0;
+  REPLACE_ISWXDIGIT=0;
+
+
+
+
+
+  if test $ac_cv_header_crtdefs_h = yes; then
+    HAVE_CRTDEFS_H=1
+  else
+    HAVE_CRTDEFS_H=0
+  fi
+
+
+
+
+
+
+
+
+  if test $ac_cv_func_iswcntrl = yes; then
+    HAVE_ISWCNTRL=1
+  else
+    HAVE_ISWCNTRL=0
+  fi
+
+
+
+  if test $gt_cv_c_wint_t = yes; then
+    HAVE_WINT_T=1
+  else
+    HAVE_WINT_T=0
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_wctype_h='<'wctype.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <wctype.h>" >&5
+printf %s "checking absolute name of <wctype.h>... " >&6; }
+if test ${gl_cv_next_wctype_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_wctype_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <wctype.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'wctype.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_wctype_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_wctype_h
+           gl_cv_next_wctype_h='"'$gl_header'"'
+          else
+               gl_cv_next_wctype_h='<'wctype.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wctype_h" >&5
+printf "%s\n" "$gl_cv_next_wctype_h" >&6; }
+     fi
+     NEXT_WCTYPE_H=$gl_cv_next_wctype_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'wctype.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_wctype_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H=$gl_next_as_first_directive
+
+
+
+
+  if test $ac_cv_header_wctype_h = yes; then
+    if test $ac_cv_func_iswcntrl = yes; then
+                  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether iswcntrl works" >&5
+printf %s "checking whether iswcntrl works... " >&6; }
+if test ${gl_cv_func_iswcntrl_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+          if test "$cross_compiling" = yes
+then :
+               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+                          #if __GNU_LIBRARY__ == 1
+                          Linux libc5 i18n is broken.
+                          #endif
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_func_iswcntrl_works="guessing yes"
+else $as_nop
+  gl_cv_func_iswcntrl_works="guessing no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+               #include <wchar.h>
+               #include <wctype.h>
+               int main () { return iswprint ('x') == 0; }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_iswcntrl_works=yes
+else $as_nop
+  gl_cv_func_iswcntrl_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswcntrl_works" >&5
+printf "%s\n" "$gl_cv_func_iswcntrl_works" >&6; }
+    fi
+    HAVE_WCTYPE_H=1
+  else
+    HAVE_WCTYPE_H=0
+  fi
+
+
+  if test $GNULIBHEADERS_OVERRIDE_WINT_T = 1; then
+    REPLACE_ISWCNTRL=1
+  else
+    case "$gl_cv_func_iswcntrl_works" in
+      *yes) REPLACE_ISWCNTRL=0 ;;
+      *)    REPLACE_ISWCNTRL=1 ;;
+    esac
+  fi
+
+
+  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+        :
+  fi
+
+  if test $REPLACE_ISWCNTRL = 1; then
+    REPLACE_TOWLOWER=1
+  else
+    ac_fn_c_check_func "$LINENO" "towlower" "ac_cv_func_towlower"
+if test "x$ac_cv_func_towlower" = xyes
+then :
+  printf "%s\n" "#define HAVE_TOWLOWER 1" >>confdefs.h
+
+fi
+
+    if test $ac_cv_func_towlower = yes; then
+      REPLACE_TOWLOWER=0
+    else
+      ac_fn_check_decl "$LINENO" "towlower" "ac_cv_have_decl_towlower" "#include <wchar.h>
+          #if HAVE_WCTYPE_H
+          # include <wctype.h>
+          #endif
+
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_towlower" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_TOWLOWER $ac_have_decl" >>confdefs.h
+
+      if test $ac_cv_have_decl_towlower = yes; then
+                                REPLACE_TOWLOWER=1
+      else
+        REPLACE_TOWLOWER=0
+      fi
+    fi
+  fi
+
+
+  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then
+        :
+  fi
+
+          { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wctype_t" >&5
+printf %s "checking for wctype_t... " >&6; }
+if test ${gl_cv_type_wctype_t+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <wchar.h>
+            #if HAVE_WCTYPE_H
+            # include <wctype.h>
+            #endif
+            wctype_t a;
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_type_wctype_t=yes
+else $as_nop
+  gl_cv_type_wctype_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctype_t" >&5
+printf "%s\n" "$gl_cv_type_wctype_t" >&6; }
+  if test $gl_cv_type_wctype_t = no; then
+    HAVE_WCTYPE_T=0
+  fi
+
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wctrans_t" >&5
+printf %s "checking for wctrans_t... " >&6; }
+if test ${gl_cv_type_wctrans_t+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <wchar.h>
+            #include <wctype.h>
+            wctrans_t a;
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_type_wctrans_t=yes
+else $as_nop
+  gl_cv_type_wctrans_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctrans_t" >&5
+printf "%s\n" "$gl_cv_type_wctrans_t" >&6; }
+  if test $gl_cv_type_wctrans_t = no; then
+    HAVE_WCTRANS_T=0
+  fi
+
+
+
+
+
+
+
+
+  GL_GNULIB_ISWBLANK=0
+
+
+
+  GL_GNULIB_ISWDIGIT=0
+
+
+
+  GL_GNULIB_ISWXDIGIT=0
+
+
+
+  GL_GNULIB_WCTYPE=0
+
+
+
+  GL_GNULIB_ISWCTYPE=0
+
+
+
+  GL_GNULIB_WCTRANS=0
+
+
+
+  GL_GNULIB_TOWCTRANS=0
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5
+printf %s "checking for nl_langinfo and CODESET... " >&6; }
+if test ${am_cv_langinfo_codeset+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <langinfo.h>
+int
+main (void)
+{
+char* cs = nl_langinfo(CODESET); return !cs;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  am_cv_langinfo_codeset=yes
+else $as_nop
+  am_cv_langinfo_codeset=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5
+printf "%s\n" "$am_cv_langinfo_codeset" >&6; }
+  if test $am_cv_langinfo_codeset = yes; then
+
+printf "%s\n" "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h
+
+  fi
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a traditional french locale" >&5
+printf %s "checking for a traditional french locale... " >&6; }
+if test ${gt_cv_locale_fr+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main () {
+  /* On BeOS and Haiku, locales are not implemented in libc.  Rather, libintl
+     imitates locale dependent behaviour by looking at the environment
+     variables, and all locales use the UTF-8 encoding.  */
+#if defined __BEOS__ || defined __HAIKU__
+  return 1;
+#else
+  /* Check whether the given locale name is recognized by the system.  */
+# if defined _WIN32 && !defined __CYGWIN__
+  /* On native Windows, setlocale(category, "") looks at the system settings,
+     not at the environment variables.  Also, when an encoding suffix such
+     as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
+     category of the locale to "C".  */
+  if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
+      || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
+    return 1;
+# else
+  if (setlocale (LC_ALL, "") == NULL) return 1;
+# endif
+  /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+     On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
+     is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+     On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+     succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+     some unit tests fail.
+     On MirBSD 10, when an unsupported locale is specified, setlocale()
+     succeeds but then nl_langinfo(CODESET) is "UTF-8".  */
+# if HAVE_LANGINFO_CODESET
+  {
+    const char *cs = nl_langinfo (CODESET);
+    if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0
+        || strcmp (cs, "UTF-8") == 0)
+      return 1;
+  }
+# endif
+# ifdef __CYGWIN__
+  /* On Cygwin, avoid locale names without encoding suffix, because the
+     locale_charset() function relies on the encoding suffix.  Note that
+     LC_ALL is set on the command line.  */
+  if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+# endif
+  /* Check whether in the abbreviation of the second month, the second
+     character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is only
+     one byte long. This excludes the UTF-8 encoding.  */
+  t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
+  if (strftime (buf, sizeof (buf), "%b", &t) < 3 || buf[2] != 'v') return 1;
+# if !defined __BIONIC__ /* Bionic libc's 'struct lconv' is just a dummy.  */
+  /* Check whether the decimal separator is a comma.
+     On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point
+     are nl_langinfo(RADIXCHAR) are both ".".  */
+  if (localeconv () ->decimal_point[0] != ',') return 1;
+# endif
+  return 0;
+#endif
+}
+
+_ACEOF
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest$ac_exeext; then
+      case "$host_os" in
+        # Handle native Windows specially, because there setlocale() interprets
+        # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
+        # "fr" or "fra" as "French" or "French_France.1252",
+        # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
+        # "ja" as "Japanese" or "Japanese_Japan.932",
+        # and similar.
+        mingw*)
+          # Test for the native Windows locale name.
+          if (LC_ALL=French_France.1252 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+            gt_cv_locale_fr=French_France.1252
+          else
+            # None found.
+            gt_cv_locale_fr=none
+          fi
+          ;;
+        *)
+          # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+          # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
+          # configure script would override the LC_ALL setting. Likewise for
+          # LC_CTYPE, which is also set at the beginning of the configure script.
+          # Test for the usual locale name.
+          if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+            gt_cv_locale_fr=fr_FR
+          else
+            # Test for the locale name with explicit encoding suffix.
+            if (LC_ALL=fr_FR.ISO-8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+              gt_cv_locale_fr=fr_FR.ISO-8859-1
+            else
+              # Test for the AIX, OSF/1, FreeBSD, NetBSD, OpenBSD locale name.
+              if (LC_ALL=fr_FR.ISO8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+                gt_cv_locale_fr=fr_FR.ISO8859-1
+              else
+                # Test for the HP-UX locale name.
+                if (LC_ALL=fr_FR.iso88591 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+                  gt_cv_locale_fr=fr_FR.iso88591
+                else
+                  # Test for the Solaris 7 locale name.
+                  if (LC_ALL=fr LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+                    gt_cv_locale_fr=fr
+                  else
+                    # None found.
+                    gt_cv_locale_fr=none
+                  fi
+                fi
+              fi
+            fi
+          fi
+          ;;
+      esac
+    fi
+    rm -fr conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_fr" >&5
+printf "%s\n" "$gt_cv_locale_fr" >&6; }
+  LOCALE_FR=$gt_cv_locale_fr
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a traditional japanese locale" >&5
+printf %s "checking for a traditional japanese locale... " >&6; }
+if test ${gt_cv_locale_ja+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main ()
+{
+  /* On BeOS and Haiku, locales are not implemented in libc.  Rather, libintl
+     imitates locale dependent behaviour by looking at the environment
+     variables, and all locales use the UTF-8 encoding.  */
+#if defined __BEOS__ || defined __HAIKU__
+  return 1;
+#else
+  /* Check whether the given locale name is recognized by the system.  */
+# if defined _WIN32 && !defined __CYGWIN__
+  /* On native Windows, setlocale(category, "") looks at the system settings,
+     not at the environment variables.  Also, when an encoding suffix such
+     as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
+     category of the locale to "C".  */
+  if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
+      || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
+    return 1;
+# else
+  if (setlocale (LC_ALL, "") == NULL) return 1;
+# endif
+  /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+     On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
+     is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+     On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+     succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+     some unit tests fail.
+     On MirBSD 10, when an unsupported locale is specified, setlocale()
+     succeeds but then nl_langinfo(CODESET) is "UTF-8".  */
+# if HAVE_LANGINFO_CODESET
+  {
+    const char *cs = nl_langinfo (CODESET);
+    if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0
+        || strcmp (cs, "UTF-8") == 0)
+      return 1;
+  }
+# endif
+# ifdef __CYGWIN__
+  /* On Cygwin, avoid locale names without encoding suffix, because the
+     locale_charset() function relies on the encoding suffix.  Note that
+     LC_ALL is set on the command line.  */
+  if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+# endif
+  /* Check whether MB_CUR_MAX is > 1.  This excludes the dysfunctional locales
+     on Cygwin 1.5.x.  */
+  if (MB_CUR_MAX == 1)
+    return 1;
+  /* Check whether in a month name, no byte in the range 0x80..0x9F occurs.
+     This excludes the UTF-8 encoding (except on MirBSD).  */
+  {
+    const char *p;
+    t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
+    if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1;
+    for (p = buf; *p != '\0'; p++)
+      if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0)
+        return 1;
+  }
+  return 0;
+#endif
+}
+
+_ACEOF
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest$ac_exeext; then
+      case "$host_os" in
+        # Handle native Windows specially, because there setlocale() interprets
+        # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
+        # "fr" or "fra" as "French" or "French_France.1252",
+        # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
+        # "ja" as "Japanese" or "Japanese_Japan.932",
+        # and similar.
+        mingw*)
+          # Note that on native Windows, the Japanese locale is
+          # Japanese_Japan.932, and CP932 is very different from EUC-JP, so we
+          # cannot use it here.
+          gt_cv_locale_ja=none
+          ;;
+        *)
+          # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+          # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
+          # configure script would override the LC_ALL setting. Likewise for
+          # LC_CTYPE, which is also set at the beginning of the configure script.
+          # Test for the AIX locale name.
+          if (LC_ALL=ja_JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+            gt_cv_locale_ja=ja_JP
+          else
+            # Test for the locale name with explicit encoding suffix.
+            if (LC_ALL=ja_JP.EUC-JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+              gt_cv_locale_ja=ja_JP.EUC-JP
+            else
+              # Test for the HP-UX, OSF/1, NetBSD locale name.
+              if (LC_ALL=ja_JP.eucJP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+                gt_cv_locale_ja=ja_JP.eucJP
+              else
+                # Test for the IRIX, FreeBSD locale name.
+                if (LC_ALL=ja_JP.EUC LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+                  gt_cv_locale_ja=ja_JP.EUC
+                else
+                  # Test for the Solaris 7 locale name.
+                  if (LC_ALL=ja LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+                    gt_cv_locale_ja=ja
+                  else
+                    # Special test for NetBSD 1.6.
+                    if test -f /usr/share/locale/ja_JP.eucJP/LC_CTYPE; then
+                      gt_cv_locale_ja=ja_JP.eucJP
+                    else
+                      # None found.
+                      gt_cv_locale_ja=none
+                    fi
+                  fi
+                fi
+              fi
+            fi
+          fi
+          ;;
+      esac
+    fi
+    rm -fr conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_ja" >&5
+printf "%s\n" "$gt_cv_locale_ja" >&6; }
+  LOCALE_JA=$gt_cv_locale_ja
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a french Unicode locale" >&5
+printf %s "checking for a french Unicode locale... " >&6; }
+if test ${gt_cv_locale_fr_utf8+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main () {
+  /* On BeOS and Haiku, locales are not implemented in libc.  Rather, libintl
+     imitates locale dependent behaviour by looking at the environment
+     variables, and all locales use the UTF-8 encoding.  */
+#if !(defined __BEOS__ || defined __HAIKU__)
+  /* Check whether the given locale name is recognized by the system.  */
+# if defined _WIN32 && !defined __CYGWIN__
+  /* On native Windows, setlocale(category, "") looks at the system settings,
+     not at the environment variables.  Also, when an encoding suffix such
+     as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
+     category of the locale to "C".  */
+  if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
+      || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
+    return 1;
+# else
+  if (setlocale (LC_ALL, "") == NULL) return 1;
+# endif
+  /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+     On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
+     is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+     On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+     succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+     some unit tests fail.  */
+# if HAVE_LANGINFO_CODESET
+  {
+    const char *cs = nl_langinfo (CODESET);
+    if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0)
+      return 1;
+  }
+# endif
+# ifdef __CYGWIN__
+  /* On Cygwin, avoid locale names without encoding suffix, because the
+     locale_charset() function relies on the encoding suffix.  Note that
+     LC_ALL is set on the command line.  */
+  if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+# endif
+  /* Check whether in the abbreviation of the second month, the second
+     character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is
+     two bytes long, with UTF-8 encoding.  */
+  t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
+  if (strftime (buf, sizeof (buf), "%b", &t) < 4
+      || buf[1] != (char) 0xc3 || buf[2] != (char) 0xa9 || buf[3] != 'v')
+    return 1;
+#endif
+#if !defined __BIONIC__ /* Bionic libc's 'struct lconv' is just a dummy.  */
+  /* Check whether the decimal separator is a comma.
+     On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point
+     are nl_langinfo(RADIXCHAR) are both ".".  */
+  if (localeconv () ->decimal_point[0] != ',') return 1;
+#endif
+  return 0;
+}
+
+_ACEOF
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest$ac_exeext; then
+      case "$host_os" in
+        # Handle native Windows specially, because there setlocale() interprets
+        # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
+        # "fr" or "fra" as "French" or "French_France.1252",
+        # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
+        # "ja" as "Japanese" or "Japanese_Japan.932",
+        # and similar.
+        mingw*)
+          # Test for the hypothetical native Windows locale name.
+          if (LC_ALL=French_France.65001 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+            gt_cv_locale_fr_utf8=French_France.65001
+          else
+            # None found.
+            gt_cv_locale_fr_utf8=none
+          fi
+          ;;
+        *)
+          # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+          # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
+          # configure script would override the LC_ALL setting. Likewise for
+          # LC_CTYPE, which is also set at the beginning of the configure script.
+          # Test for the usual locale name.
+          if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+            gt_cv_locale_fr_utf8=fr_FR
+          else
+            # Test for the locale name with explicit encoding suffix.
+            if (LC_ALL=fr_FR.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+              gt_cv_locale_fr_utf8=fr_FR.UTF-8
+            else
+              # Test for the Solaris 7 locale name.
+              if (LC_ALL=fr.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+                gt_cv_locale_fr_utf8=fr.UTF-8
+              else
+                # None found.
+                gt_cv_locale_fr_utf8=none
+              fi
+            fi
+          fi
+          ;;
+      esac
+    fi
+    rm -fr conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_fr_utf8" >&5
+printf "%s\n" "$gt_cv_locale_fr_utf8" >&6; }
+  LOCALE_FR_UTF8=$gt_cv_locale_fr_utf8
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a transitional chinese locale" >&5
+printf %s "checking for a transitional chinese locale... " >&6; }
+if test ${gt_cv_locale_zh_CN+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <stdlib.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main ()
+{
+  /* On BeOS and Haiku, locales are not implemented in libc.  Rather, libintl
+     imitates locale dependent behaviour by looking at the environment
+     variables, and all locales use the UTF-8 encoding.  */
+#if defined __BEOS__ || defined __HAIKU__
+  return 1;
+#else
+  /* Check whether the given locale name is recognized by the system.  */
+# if defined _WIN32 && !defined __CYGWIN__
+  /* On native Windows, setlocale(category, "") looks at the system settings,
+     not at the environment variables.  Also, when an encoding suffix such
+     as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
+     category of the locale to "C".  */
+  if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
+      || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
+    return 1;
+# else
+  if (setlocale (LC_ALL, "") == NULL) return 1;
+# endif
+  /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+     On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
+     is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+     On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+     succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+     some unit tests fail.
+     On MirBSD 10, when an unsupported locale is specified, setlocale()
+     succeeds but then nl_langinfo(CODESET) is "UTF-8".  */
+# if HAVE_LANGINFO_CODESET
+  {
+    const char *cs = nl_langinfo (CODESET);
+    if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0
+        || strcmp (cs, "UTF-8") == 0)
+      return 1;
+  }
+# endif
+# ifdef __CYGWIN__
+  /* On Cygwin, avoid locale names without encoding suffix, because the
+     locale_charset() function relies on the encoding suffix.  Note that
+     LC_ALL is set on the command line.  */
+  if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+# endif
+  /* Check whether in a month name, no byte in the range 0x80..0x9F occurs.
+     This excludes the UTF-8 encoding (except on MirBSD).  */
+  {
+    const char *p;
+    t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
+    if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1;
+    for (p = buf; *p != '\0'; p++)
+      if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0)
+        return 1;
+  }
+  /* Check whether a typical GB18030 multibyte sequence is recognized as a
+     single wide character.  This excludes the GB2312 and GBK encodings.  */
+  if (mblen ("\203\062\332\066", 5) != 4)
+    return 1;
+  return 0;
+#endif
+}
+
+_ACEOF
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest$ac_exeext; then
+      case "$host_os" in
+        # Handle native Windows specially, because there setlocale() interprets
+        # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
+        # "fr" or "fra" as "French" or "French_France.1252",
+        # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
+        # "ja" as "Japanese" or "Japanese_Japan.932",
+        # and similar.
+        mingw*)
+          # Test for the hypothetical native Windows locale name.
+          if (LC_ALL=Chinese_China.54936 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+            gt_cv_locale_zh_CN=Chinese_China.54936
+          else
+            # None found.
+            gt_cv_locale_zh_CN=none
+          fi
+          ;;
+        solaris2.8)
+          # On Solaris 8, the locales zh_CN.GB18030, zh_CN.GBK, zh.GBK are
+          # broken. One witness is the test case in gl_MBRTOWC_SANITYCHECK.
+          # Another witness is that "LC_ALL=zh_CN.GB18030 bash -c true" dumps core.
+          gt_cv_locale_zh_CN=none
+          ;;
+        *)
+          # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+          # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
+          # configure script would override the LC_ALL setting. Likewise for
+          # LC_CTYPE, which is also set at the beginning of the configure script.
+          # Test for the locale name without encoding suffix.
+          if (LC_ALL=zh_CN LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+            gt_cv_locale_zh_CN=zh_CN
+          else
+            # Test for the locale name with explicit encoding suffix.
+            if (LC_ALL=zh_CN.GB18030 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+              gt_cv_locale_zh_CN=zh_CN.GB18030
+            else
+              # None found.
+              gt_cv_locale_zh_CN=none
+            fi
+          fi
+          ;;
+      esac
+    else
+      # If there was a link error, due to mblen(), the system is so old that
+      # it certainly doesn't have a chinese locale.
+      gt_cv_locale_zh_CN=none
+    fi
+    rm -fr conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_zh_CN" >&5
+printf "%s\n" "$gt_cv_locale_zh_CN" >&6; }
+  LOCALE_ZH_CN=$gt_cv_locale_zh_CN
+
+
+
+
+  case "$host_os" in
+    mingw*)
+                        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit off_t" >&5
+printf %s "checking for 64-bit off_t... " >&6; }
+if test ${gl_cv_type_off_t_64+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+                int verify_off_t_size[sizeof (off_t) >= 8 ? 1 : -1];
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_type_off_t_64=yes
+else $as_nop
+  gl_cv_type_off_t_64=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_off_t_64" >&5
+printf "%s\n" "$gl_cv_type_off_t_64" >&6; }
+      if test $gl_cv_type_off_t_64 = no; then
+        WINDOWS_64_BIT_OFF_T=1
+      else
+        WINDOWS_64_BIT_OFF_T=0
+      fi
+                        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit st_size" >&5
+printf %s "checking for 64-bit st_size... " >&6; }
+if test ${gl_cv_member_st_size_64+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+                struct stat buf;
+                int verify_st_size_size[sizeof (buf.st_size) >= 8 ? 1 : -1];
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_member_st_size_64=yes
+else $as_nop
+  gl_cv_member_st_size_64=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_member_st_size_64" >&5
+printf "%s\n" "$gl_cv_member_st_size_64" >&6; }
+      if test $gl_cv_member_st_size_64 = no; then
+        WINDOWS_64_BIT_ST_SIZE=1
+      else
+        WINDOWS_64_BIT_ST_SIZE=0
+      fi
+      ;;
+    *)
+                                                      WINDOWS_64_BIT_OFF_T=0
+      WINDOWS_64_BIT_ST_SIZE=0
+      ;;
+  esac
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ldexp() can be used without linking with libm" >&5
+printf %s "checking whether ldexp() can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_ldexp_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __NO_MATH_INLINES
+                           # define __NO_MATH_INLINES 1 /* for glibc */
+                           #endif
+                           #include <math.h>
+                           double (*funcptr) (double, int) = ldexp;
+                           double x;
+int
+main (void)
+{
+return ldexp (x, -1) > 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_ldexp_no_libm=yes
+else $as_nop
+  gl_cv_func_ldexp_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_no_libm" >&5
+printf "%s\n" "$gl_cv_func_ldexp_no_libm" >&6; }
+
+
+
+  LDEXP_LIBM=
+  if test $gl_cv_func_ldexp_no_libm = no; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ldexp() can be used with libm" >&5
+printf %s "checking whether ldexp() can be used with libm... " >&6; }
+if test ${gl_cv_func_ldexp_in_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+        save_LIBS="$LIBS"
+        LIBS="$LIBS -lm"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __NO_MATH_INLINES
+                             # define __NO_MATH_INLINES 1 /* for glibc */
+                             #endif
+                             #include <math.h>
+                             double (*funcptr) (double, int) = ldexp;
+                             double x;
+int
+main (void)
+{
+return ldexp (x, -1) > 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_ldexp_in_libm=yes
+else $as_nop
+  gl_cv_func_ldexp_in_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+        LIBS="$save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_in_libm" >&5
+printf "%s\n" "$gl_cv_func_ldexp_in_libm" >&6; }
+    if test $gl_cv_func_ldexp_in_libm = yes; then
+      LDEXP_LIBM=-lm
+    fi
+  fi
+
+
+
+
+
+  gl_threads_api=none
+  LIBTHREAD=
+  LTLIBTHREAD=
+  LIBMULTITHREAD=
+  LTLIBMULTITHREAD=
+  if test "$gl_use_threads" != no; then
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5
+printf %s "checking whether imported symbols can be declared weak... " >&6; }
+if test ${gl_cv_have_weak+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case "$host_os" in
+       cygwin*)
+                                    gl_cv_have_weak="guessing no"
+         ;;
+       *)
+         gl_cv_have_weak=no
+                  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+extern void xyzzy ();
+#pragma weak xyzzy
+int
+main (void)
+{
+xyzzy();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_have_weak=maybe
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+         if test $gl_cv_have_weak = maybe; then
+                                 if test "$cross_compiling" = yes
+then :
+                              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __ELF__
+                 Extensible Linking Format
+                 #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Extensible Linking Format" >/dev/null 2>&1
+then :
+  gl_cv_have_weak="guessing yes"
+else $as_nop
+  gl_cv_have_weak="guessing no"
+fi
+rm -rf conftest*
+
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#pragma weak fputs
+int main ()
+{
+  return (fputs == NULL);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_have_weak=yes
+else $as_nop
+  gl_cv_have_weak=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+         fi
+         ;;
+     esac
+          case " $LDFLAGS " in
+       *" -static "*) gl_cv_have_weak=no ;;
+     esac
+                    case "$gl_cv_have_weak" in
+       *yes)
+         case "$host_os" in
+           freebsd* | dragonfly* | midnightbsd*)
+             : > conftest1.c
+             $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1
+             cat <<EOF > conftest2.c
+#include <pthread.h>
+#pragma weak pthread_mutexattr_gettype
+int main ()
+{
+  return (pthread_mutexattr_gettype != NULL);
+}
+EOF
+             $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \
+               || gl_cv_have_weak=no
+             rm -f conftest1.c libempty.so conftest2.c conftest
+             ;;
+         esac
+         ;;
+     esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5
+printf "%s\n" "$gl_cv_have_weak" >&6; }
+  case "$gl_cv_have_weak" in
+    *yes)
+
+printf "%s\n" "#define HAVE_WEAK_SYMBOLS 1" >>confdefs.h
+
+      ;;
+  esac
+
+    if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
+
+      :
+    fi
+    if test "$gl_use_threads" = isoc || test "$gl_use_threads" = isoc+posix; then
+
+      gl_have_isoc_threads="$ac_cv_header_threads_h"
+    fi
+    if test "$gl_use_threads" = yes \
+       || test "$gl_use_threads" = posix \
+       || test "$gl_use_threads" = isoc+posix; then
+
+
+  if test -z "$gl_pthreadlib_body_done"; then
+    gl_pthread_api=no
+    LIBPTHREAD=
+    LIBPMULTITHREAD=
+    # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
+    # it groks <pthread.h>. It's added above, in gl_ANYTHREADLIB_EARLY.
+    ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_h" = xyes
+then :
+  gl_have_pthread_h=yes
+else $as_nop
+  gl_have_pthread_h=no
+fi
+
+    if test "$gl_have_pthread_h" = yes; then
+      # Other possible tests:
+      #   -lpthreads (FSU threads, PCthreads)
+      #   -lgthreads
+      # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
+      # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
+      # the second one only in libpthread, and lock.c needs it.
+      #
+      # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04
+      # needs -pthread for some reason.  See:
+      # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html
+      save_LIBS=$LIBS
+      for gl_pthread in '' '-pthread'; do
+        LIBS="$LIBS $gl_pthread"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+               pthread_mutex_t m;
+               pthread_mutexattr_t ma;
+
+int
+main (void)
+{
+pthread_mutex_lock (&m);
+               pthread_mutexattr_init (&ma);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_pthread_api=yes
+           LIBPTHREAD=$gl_pthread
+           LIBPMULTITHREAD=$gl_pthread
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+        LIBS=$save_LIBS
+        test $gl_pthread_api = yes && break
+      done
+      echo "$as_me:25886: gl_pthread_api=$gl_pthread_api" >&5
+      echo "$as_me:25887: LIBPTHREAD=$LIBPTHREAD" >&5
+
+      gl_pthread_in_glibc=no
+      # On Linux with glibc >= 2.34, libc contains the fully functional
+      # pthread functions.
+      case "$host_os" in
+        linux*)
+          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <features.h>
+             #ifdef __GNU_LIBRARY__
+              #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 34) || (__GLIBC__ > 2)
+               Lucky user
+              #endif
+             #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Lucky user" >/dev/null 2>&1
+then :
+  gl_pthread_in_glibc=yes
+fi
+rm -rf conftest*
+
+          ;;
+      esac
+      echo "$as_me:25913: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&5
+
+      # Test for libpthread by looking for pthread_kill. (Not pthread_self,
+      # since it is defined as a macro on OSF/1.)
+      if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then
+        # The program links fine without libpthread. But it may actually
+        # need to link with libpthread in order to create multiple threads.
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5
+printf %s "checking for pthread_kill in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_kill+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_pthread_pthread_kill=yes
+else $as_nop
+  ac_cv_lib_pthread_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_kill" = xyes
+then :
+  if test $gl_pthread_in_glibc = yes; then
+             LIBPMULTITHREAD=
+           else
+             LIBPMULTITHREAD=-lpthread
+             # On Solaris and HP-UX, most pthread functions exist also in libc.
+             # Therefore pthread_in_use() needs to actually try to create a
+             # thread: pthread_create from libc will fail, whereas
+             # pthread_create will actually create a thread.
+             # On Solaris 10 or newer, this test is no longer needed, because
+             # libc contains the fully functional pthread functions.
+             case "$host_os" in
+               solaris | solaris2.1-9 | solaris2.1-9.* | hpux*)
+
+printf "%s\n" "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h
+
+             esac
+           fi
+
+fi
+
+      elif test $gl_pthread_api != yes; then
+        # Some library is needed. Try libpthread and libc_r.
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5
+printf %s "checking for pthread_kill in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_kill+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_pthread_pthread_kill=yes
+else $as_nop
+  ac_cv_lib_pthread_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_kill" = xyes
+then :
+  gl_pthread_api=yes
+           LIBPTHREAD=-lpthread
+           LIBPMULTITHREAD=-lpthread
+fi
+
+        if test $gl_pthread_api != yes; then
+          # For FreeBSD 4.
+          { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lc_r" >&5
+printf %s "checking for pthread_kill in -lc_r... " >&6; }
+if test ${ac_cv_lib_c_r_pthread_kill+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc_r  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_c_r_pthread_kill=yes
+else $as_nop
+  ac_cv_lib_c_r_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_c_r_pthread_kill" >&6; }
+if test "x$ac_cv_lib_c_r_pthread_kill" = xyes
+then :
+  gl_pthread_api=yes
+             LIBPTHREAD=-lc_r
+             LIBPMULTITHREAD=-lc_r
+fi
+
+        fi
+      fi
+      echo "$as_me:26067: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&5
+    fi
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether POSIX threads API is available" >&5
+printf %s "checking whether POSIX threads API is available... " >&6; }
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_pthread_api" >&5
+printf "%s\n" "$gl_pthread_api" >&6; }
+
+
+    if test $gl_pthread_api = yes; then
+
+printf "%s\n" "#define HAVE_PTHREAD_API 1" >>confdefs.h
+
+    fi
+
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sched.h>
+int
+main (void)
+{
+sched_yield ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  LIB_SCHED_YIELD=
+
+else $as_nop
+         { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5
+printf %s "checking for sched_yield in -lrt... " >&6; }
+if test ${ac_cv_lib_rt_sched_yield+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrt  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char sched_yield ();
+int
+main (void)
+{
+return sched_yield ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_rt_sched_yield=yes
+else $as_nop
+  ac_cv_lib_rt_sched_yield=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_yield" >&5
+printf "%s\n" "$ac_cv_lib_rt_sched_yield" >&6; }
+if test "x$ac_cv_lib_rt_sched_yield" = xyes
+then :
+  LIB_SCHED_YIELD=-lrt
+else $as_nop
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lposix4" >&5
+printf %s "checking for sched_yield in -lposix4... " >&6; }
+if test ${ac_cv_lib_posix4_sched_yield+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix4  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char sched_yield ();
+int
+main (void)
+{
+return sched_yield ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_posix4_sched_yield=yes
+else $as_nop
+  ac_cv_lib_posix4_sched_yield=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix4_sched_yield" >&5
+printf "%s\n" "$ac_cv_lib_posix4_sched_yield" >&6; }
+if test "x$ac_cv_lib_posix4_sched_yield" = xyes
+then :
+  LIB_SCHED_YIELD=-lposix4
+fi
+
+fi
+
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+
+    gl_pthreadlib_body_done=done
+  fi
+
+      LIBTHREAD=$LIBPTHREAD LTLIBTHREAD=$LIBPTHREAD
+      LIBMULTITHREAD=$LIBPMULTITHREAD LTLIBMULTITHREAD=$LIBPMULTITHREAD
+      if test $gl_pthread_api = yes; then
+        if test "$gl_use_threads" = isoc+posix && test "$gl_have_isoc_threads" = yes; then
+          gl_threads_api='isoc+posix'
+
+printf "%s\n" "#define USE_ISOC_AND_POSIX_THREADS 1" >>confdefs.h
+
+          LIBTHREAD= LTLIBTHREAD=
+        else
+          gl_threads_api=posix
+
+printf "%s\n" "#define USE_POSIX_THREADS 1" >>confdefs.h
+
+          if test -z "$LIBMULTITHREAD" && test -z "$LTLIBMULTITHREAD"; then
+
+printf "%s\n" "#define USE_POSIX_THREADS_FROM_LIBC 1" >>confdefs.h
+
+          else
+            if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
+
+printf "%s\n" "#define USE_POSIX_THREADS_WEAK 1" >>confdefs.h
+
+              LIBTHREAD= LTLIBTHREAD=
+            else
+              case "$host_os" in
+                freebsd* | dragonfly* | midnightbsd*)
+                  if test "x$LIBTHREAD" != "x$LIBMULTITHREAD"; then
+
+printf "%s\n" "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h
+
+                  fi
+                  ;;
+              esac
+            fi
+          fi
+        fi
+      fi
+    fi
+    if test $gl_threads_api = none; then
+      if test "$gl_use_threads" = isoc && test "$gl_have_isoc_threads" = yes; then
+
+
+
+  if test -z "$gl_stdthreadlib_body_done"; then
+
+
+    case "$host_os" in
+      mingw*)
+        LIBSTDTHREAD=
+        ;;
+      *)
+
+
+  if test -z "$gl_pthreadlib_body_done"; then
+    gl_pthread_api=no
+    LIBPTHREAD=
+    LIBPMULTITHREAD=
+    # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
+    # it groks <pthread.h>. It's added above, in gl_ANYTHREADLIB_EARLY.
+    ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_h" = xyes
+then :
+  gl_have_pthread_h=yes
+else $as_nop
+  gl_have_pthread_h=no
+fi
+
+    if test "$gl_have_pthread_h" = yes; then
+      # Other possible tests:
+      #   -lpthreads (FSU threads, PCthreads)
+      #   -lgthreads
+      # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
+      # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
+      # the second one only in libpthread, and lock.c needs it.
+      #
+      # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04
+      # needs -pthread for some reason.  See:
+      # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html
+      save_LIBS=$LIBS
+      for gl_pthread in '' '-pthread'; do
+        LIBS="$LIBS $gl_pthread"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+               pthread_mutex_t m;
+               pthread_mutexattr_t ma;
+
+int
+main (void)
+{
+pthread_mutex_lock (&m);
+               pthread_mutexattr_init (&ma);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_pthread_api=yes
+           LIBPTHREAD=$gl_pthread
+           LIBPMULTITHREAD=$gl_pthread
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+        LIBS=$save_LIBS
+        test $gl_pthread_api = yes && break
+      done
+      echo "$as_me:26295: gl_pthread_api=$gl_pthread_api" >&5
+      echo "$as_me:26296: LIBPTHREAD=$LIBPTHREAD" >&5
+
+      gl_pthread_in_glibc=no
+      # On Linux with glibc >= 2.34, libc contains the fully functional
+      # pthread functions.
+      case "$host_os" in
+        linux*)
+          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <features.h>
+             #ifdef __GNU_LIBRARY__
+              #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 34) || (__GLIBC__ > 2)
+               Lucky user
+              #endif
+             #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Lucky user" >/dev/null 2>&1
+then :
+  gl_pthread_in_glibc=yes
+fi
+rm -rf conftest*
+
+          ;;
+      esac
+      echo "$as_me:26322: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&5
+
+      # Test for libpthread by looking for pthread_kill. (Not pthread_self,
+      # since it is defined as a macro on OSF/1.)
+      if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then
+        # The program links fine without libpthread. But it may actually
+        # need to link with libpthread in order to create multiple threads.
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5
+printf %s "checking for pthread_kill in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_kill+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_pthread_pthread_kill=yes
+else $as_nop
+  ac_cv_lib_pthread_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_kill" = xyes
+then :
+  if test $gl_pthread_in_glibc = yes; then
+             LIBPMULTITHREAD=
+           else
+             LIBPMULTITHREAD=-lpthread
+             # On Solaris and HP-UX, most pthread functions exist also in libc.
+             # Therefore pthread_in_use() needs to actually try to create a
+             # thread: pthread_create from libc will fail, whereas
+             # pthread_create will actually create a thread.
+             # On Solaris 10 or newer, this test is no longer needed, because
+             # libc contains the fully functional pthread functions.
+             case "$host_os" in
+               solaris | solaris2.1-9 | solaris2.1-9.* | hpux*)
+
+printf "%s\n" "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h
+
+             esac
+           fi
+
+fi
+
+      elif test $gl_pthread_api != yes; then
+        # Some library is needed. Try libpthread and libc_r.
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5
+printf %s "checking for pthread_kill in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_kill+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_pthread_pthread_kill=yes
+else $as_nop
+  ac_cv_lib_pthread_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_kill" = xyes
+then :
+  gl_pthread_api=yes
+           LIBPTHREAD=-lpthread
+           LIBPMULTITHREAD=-lpthread
+fi
+
+        if test $gl_pthread_api != yes; then
+          # For FreeBSD 4.
+          { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lc_r" >&5
+printf %s "checking for pthread_kill in -lc_r... " >&6; }
+if test ${ac_cv_lib_c_r_pthread_kill+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc_r  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_c_r_pthread_kill=yes
+else $as_nop
+  ac_cv_lib_c_r_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_c_r_pthread_kill" >&6; }
+if test "x$ac_cv_lib_c_r_pthread_kill" = xyes
+then :
+  gl_pthread_api=yes
+             LIBPTHREAD=-lc_r
+             LIBPMULTITHREAD=-lc_r
+fi
+
+        fi
+      fi
+      echo "$as_me:26476: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&5
+    fi
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether POSIX threads API is available" >&5
+printf %s "checking whether POSIX threads API is available... " >&6; }
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_pthread_api" >&5
+printf "%s\n" "$gl_pthread_api" >&6; }
+
+
+    if test $gl_pthread_api = yes; then
+
+printf "%s\n" "#define HAVE_PTHREAD_API 1" >>confdefs.h
+
+    fi
+
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sched.h>
+int
+main (void)
+{
+sched_yield ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  LIB_SCHED_YIELD=
+
+else $as_nop
+         { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5
+printf %s "checking for sched_yield in -lrt... " >&6; }
+if test ${ac_cv_lib_rt_sched_yield+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrt  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char sched_yield ();
+int
+main (void)
+{
+return sched_yield ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_rt_sched_yield=yes
+else $as_nop
+  ac_cv_lib_rt_sched_yield=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_yield" >&5
+printf "%s\n" "$ac_cv_lib_rt_sched_yield" >&6; }
+if test "x$ac_cv_lib_rt_sched_yield" = xyes
+then :
+  LIB_SCHED_YIELD=-lrt
+else $as_nop
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lposix4" >&5
+printf %s "checking for sched_yield in -lposix4... " >&6; }
+if test ${ac_cv_lib_posix4_sched_yield+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix4  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char sched_yield ();
+int
+main (void)
+{
+return sched_yield ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_posix4_sched_yield=yes
+else $as_nop
+  ac_cv_lib_posix4_sched_yield=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix4_sched_yield" >&5
+printf "%s\n" "$ac_cv_lib_posix4_sched_yield" >&6; }
+if test "x$ac_cv_lib_posix4_sched_yield" = xyes
+then :
+  LIB_SCHED_YIELD=-lposix4
+fi
+
+fi
+
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+
+    gl_pthreadlib_body_done=done
+  fi
+
+        if test $ac_cv_header_threads_h = yes; then
+                                                            ac_fn_c_check_func "$LINENO" "thrd_create" "ac_cv_func_thrd_create"
+if test "x$ac_cv_func_thrd_create" = xyes
+then :
+  printf "%s\n" "#define HAVE_THRD_CREATE 1" >>confdefs.h
+
+fi
+
+          if test $ac_cv_func_thrd_create = yes; then
+            LIBSTDTHREAD=
+          else
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for thrd_create in -lstdthreads" >&5
+printf %s "checking for thrd_create in -lstdthreads... " >&6; }
+if test ${ac_cv_lib_stdthreads_thrd_create+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lstdthreads  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char thrd_create ();
+int
+main (void)
+{
+return thrd_create ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_stdthreads_thrd_create=yes
+else $as_nop
+  ac_cv_lib_stdthreads_thrd_create=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_stdthreads_thrd_create" >&5
+printf "%s\n" "$ac_cv_lib_stdthreads_thrd_create" >&6; }
+if test "x$ac_cv_lib_stdthreads_thrd_create" = xyes
+then :
+
+              LIBSTDTHREAD='-lstdthreads -lpthread'
+
+else $as_nop
+
+                            LIBSTDTHREAD="$LIBPMULTITHREAD"
+
+fi
+
+          fi
+        else
+                    LIBSTDTHREAD="$LIBPMULTITHREAD $LIB_SCHED_YIELD"
+        fi
+        ;;
+    esac
+
+
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ISO C threads API is available" >&5
+printf %s "checking whether ISO C threads API is available... " >&6; }
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_threads_h" >&5
+printf "%s\n" "$ac_cv_header_threads_h" >&6; }
+    gl_stdthreadlib_body_done=done
+  fi
+
+        LIBTHREAD=$LIBSTDTHREAD LTLIBTHREAD=$LIBSTDTHREAD
+        LIBMULTITHREAD=$LIBSTDTHREAD LTLIBMULTITHREAD=$LIBSTDTHREAD
+        gl_threads_api=isoc
+
+printf "%s\n" "#define USE_ISOC_THREADS 1" >>confdefs.h
+
+      fi
+    fi
+    if test $gl_threads_api = none; then
+      case "$gl_use_threads" in
+        yes | windows | win32) # The 'win32' is for backward compatibility.
+          if { case "$host_os" in
+                 mingw*) true;;
+                 *) false;;
+               esac
+             }; then
+            gl_threads_api=windows
+
+printf "%s\n" "#define USE_WINDOWS_THREADS 1" >>confdefs.h
+
+          fi
+          ;;
+      esac
+    fi
+  fi
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for multithread API to use" >&5
+printf %s "checking for multithread API to use... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_threads_api" >&5
+printf "%s\n" "$gl_threads_api" >&6; }
+
+
+
+
+
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+printf %s "checking for a sed that does not truncate output... " >&6; }
+if test ${ac_cv_path_SED+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_prog in sed gsed
+   do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  printf %s 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    printf "%s\n" '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+printf "%s\n" "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_math_h='<'math.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <math.h>" >&5
+printf %s "checking absolute name of <math.h>... " >&6; }
+if test ${gl_cv_next_math_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_math_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'math.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_math_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_math_h
+           gl_cv_next_math_h='"'$gl_header'"'
+          else
+               gl_cv_next_math_h='<'math.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_math_h" >&5
+printf "%s\n" "$gl_cv_next_math_h" >&6; }
+     fi
+     NEXT_MATH_H=$gl_cv_next_math_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'math.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_math_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_MATH_H=$gl_next_as_first_directive
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether NAN macro works" >&5
+printf %s "checking whether NAN macro works... " >&6; }
+if test ${gl_cv_header_math_nan_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+int
+main (void)
+{
+/* Solaris 10 has a broken definition of NAN.  Other platforms
+        fail to provide NAN, or provide it only in C99 mode; this
+        test only needs to fail when NAN is provided but wrong.  */
+         float f = 1.0f;
+#ifdef NAN
+         f = NAN;
+#endif
+         return f == 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_header_math_nan_works=yes
+else $as_nop
+  gl_cv_header_math_nan_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_math_nan_works" >&5
+printf "%s\n" "$gl_cv_header_math_nan_works" >&6; }
+  if test $gl_cv_header_math_nan_works = no; then
+    REPLACE_NAN=1
+  fi
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether HUGE_VAL works" >&5
+printf %s "checking whether HUGE_VAL works... " >&6; }
+if test ${gl_cv_header_math_huge_val_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+int
+main (void)
+{
+/* Solaris 10 has a broken definition of HUGE_VAL.  */
+         double d = HUGE_VAL;
+         return d == 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_header_math_huge_val_works=yes
+else $as_nop
+  gl_cv_header_math_huge_val_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_math_huge_val_works" >&5
+printf "%s\n" "$gl_cv_header_math_huge_val_works" >&6; }
+  if test $gl_cv_header_math_huge_val_works = no; then
+    REPLACE_HUGE_VAL=1
+  fi
+
+
+
+
+
+
+
+   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mbstate_t" >&5
+printf %s "checking for mbstate_t... " >&6; }
+if test ${ac_cv_type_mbstate_t+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+             #include <wchar.h>
+int
+main (void)
+{
+mbstate_t x; return sizeof x;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_type_mbstate_t=yes
+else $as_nop
+  ac_cv_type_mbstate_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_mbstate_t" >&5
+printf "%s\n" "$ac_cv_type_mbstate_t" >&6; }
+   if test $ac_cv_type_mbstate_t = yes; then
+
+printf "%s\n" "#define HAVE_MBSTATE_T 1" >>confdefs.h
+
+   else
+
+printf "%s\n" "#define mbstate_t int" >>confdefs.h
+
+   fi
+
+
+    HAVE_BTOWC=1;
+  HAVE_MBSINIT=1;
+  HAVE_MBRTOWC=1;
+  HAVE_MBRLEN=1;
+  HAVE_MBSRTOWCS=1;
+  HAVE_MBSNRTOWCS=1;
+  HAVE_WCRTOMB=1;
+  HAVE_WCSRTOMBS=1;
+  HAVE_WCSNRTOMBS=1;
+  HAVE_WMEMCHR=1;
+  HAVE_WMEMCMP=1;
+  HAVE_WMEMCPY=1;
+  HAVE_WMEMMOVE=1;
+  HAVE_WMEMPCPY=1;
+  HAVE_WMEMSET=1;
+  HAVE_WCSLEN=1;
+  HAVE_WCSNLEN=1;
+  HAVE_WCSCPY=1;
+  HAVE_WCPCPY=1;
+  HAVE_WCSNCPY=1;
+  HAVE_WCPNCPY=1;
+  HAVE_WCSCAT=1;
+  HAVE_WCSNCAT=1;
+  HAVE_WCSCMP=1;
+  HAVE_WCSNCMP=1;
+  HAVE_WCSCASECMP=1;
+  HAVE_WCSNCASECMP=1;
+  HAVE_WCSCOLL=1;
+  HAVE_WCSXFRM=1;
+  HAVE_WCSDUP=1;
+  HAVE_WCSCHR=1;
+  HAVE_WCSRCHR=1;
+  HAVE_WCSCSPN=1;
+  HAVE_WCSSPN=1;
+  HAVE_WCSPBRK=1;
+  HAVE_WCSSTR=1;
+  HAVE_WCSTOK=1;
+  HAVE_WCSWIDTH=1;
+  HAVE_WCSFTIME=1;
+  HAVE_DECL_WCTOB=1;
+  HAVE_DECL_WCSDUP=1;
+  HAVE_DECL_WCWIDTH=1;
+  REPLACE_MBSTATE_T=0;
+  REPLACE_BTOWC=0;
+  REPLACE_WCTOB=0;
+  REPLACE_MBSINIT=0;
+  REPLACE_MBRTOWC=0;
+  REPLACE_MBRLEN=0;
+  REPLACE_MBSRTOWCS=0;
+  REPLACE_MBSNRTOWCS=0;
+  REPLACE_WCRTOMB=0;
+  REPLACE_WCSRTOMBS=0;
+  REPLACE_WCSNRTOMBS=0;
+  REPLACE_WCWIDTH=0;
+  REPLACE_WCSWIDTH=0;
+  REPLACE_WCSFTIME=0;
+  REPLACE_WCSTOK=0;
+
+
+
+
+
+  if test -z "$gl_pthreadlib_body_done"; then
+    gl_pthread_api=no
+    LIBPTHREAD=
+    LIBPMULTITHREAD=
+    # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
+    # it groks <pthread.h>. It's added above, in gl_ANYTHREADLIB_EARLY.
+    ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_h" = xyes
+then :
+  gl_have_pthread_h=yes
+else $as_nop
+  gl_have_pthread_h=no
+fi
+
+    if test "$gl_have_pthread_h" = yes; then
+      # Other possible tests:
+      #   -lpthreads (FSU threads, PCthreads)
+      #   -lgthreads
+      # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
+      # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
+      # the second one only in libpthread, and lock.c needs it.
+      #
+      # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04
+      # needs -pthread for some reason.  See:
+      # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html
+      save_LIBS=$LIBS
+      for gl_pthread in '' '-pthread'; do
+        LIBS="$LIBS $gl_pthread"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+               pthread_mutex_t m;
+               pthread_mutexattr_t ma;
+
+int
+main (void)
+{
+pthread_mutex_lock (&m);
+               pthread_mutexattr_init (&ma);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_pthread_api=yes
+           LIBPTHREAD=$gl_pthread
+           LIBPMULTITHREAD=$gl_pthread
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+        LIBS=$save_LIBS
+        test $gl_pthread_api = yes && break
+      done
+      echo "$as_me:27095: gl_pthread_api=$gl_pthread_api" >&5
+      echo "$as_me:27096: LIBPTHREAD=$LIBPTHREAD" >&5
+
+      gl_pthread_in_glibc=no
+      # On Linux with glibc >= 2.34, libc contains the fully functional
+      # pthread functions.
+      case "$host_os" in
+        linux*)
+          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <features.h>
+             #ifdef __GNU_LIBRARY__
+              #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 34) || (__GLIBC__ > 2)
+               Lucky user
+              #endif
+             #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Lucky user" >/dev/null 2>&1
+then :
+  gl_pthread_in_glibc=yes
+fi
+rm -rf conftest*
+
+          ;;
+      esac
+      echo "$as_me:27122: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&5
+
+      # Test for libpthread by looking for pthread_kill. (Not pthread_self,
+      # since it is defined as a macro on OSF/1.)
+      if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then
+        # The program links fine without libpthread. But it may actually
+        # need to link with libpthread in order to create multiple threads.
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5
+printf %s "checking for pthread_kill in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_kill+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_pthread_pthread_kill=yes
+else $as_nop
+  ac_cv_lib_pthread_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_kill" = xyes
+then :
+  if test $gl_pthread_in_glibc = yes; then
+             LIBPMULTITHREAD=
+           else
+             LIBPMULTITHREAD=-lpthread
+             # On Solaris and HP-UX, most pthread functions exist also in libc.
+             # Therefore pthread_in_use() needs to actually try to create a
+             # thread: pthread_create from libc will fail, whereas
+             # pthread_create will actually create a thread.
+             # On Solaris 10 or newer, this test is no longer needed, because
+             # libc contains the fully functional pthread functions.
+             case "$host_os" in
+               solaris | solaris2.1-9 | solaris2.1-9.* | hpux*)
+
+printf "%s\n" "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h
+
+             esac
+           fi
+
+fi
+
+      elif test $gl_pthread_api != yes; then
+        # Some library is needed. Try libpthread and libc_r.
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5
+printf %s "checking for pthread_kill in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_kill+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_pthread_pthread_kill=yes
+else $as_nop
+  ac_cv_lib_pthread_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_kill" = xyes
+then :
+  gl_pthread_api=yes
+           LIBPTHREAD=-lpthread
+           LIBPMULTITHREAD=-lpthread
+fi
+
+        if test $gl_pthread_api != yes; then
+          # For FreeBSD 4.
+          { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lc_r" >&5
+printf %s "checking for pthread_kill in -lc_r... " >&6; }
+if test ${ac_cv_lib_c_r_pthread_kill+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc_r  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_c_r_pthread_kill=yes
+else $as_nop
+  ac_cv_lib_c_r_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_c_r_pthread_kill" >&6; }
+if test "x$ac_cv_lib_c_r_pthread_kill" = xyes
+then :
+  gl_pthread_api=yes
+             LIBPTHREAD=-lc_r
+             LIBPMULTITHREAD=-lc_r
+fi
+
+        fi
+      fi
+      echo "$as_me:27276: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&5
+    fi
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether POSIX threads API is available" >&5
+printf %s "checking whether POSIX threads API is available... " >&6; }
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_pthread_api" >&5
+printf "%s\n" "$gl_pthread_api" >&6; }
+
+
+    if test $gl_pthread_api = yes; then
+
+printf "%s\n" "#define HAVE_PTHREAD_API 1" >>confdefs.h
+
+    fi
+
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sched.h>
+int
+main (void)
+{
+sched_yield ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  LIB_SCHED_YIELD=
+
+else $as_nop
+         { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5
+printf %s "checking for sched_yield in -lrt... " >&6; }
+if test ${ac_cv_lib_rt_sched_yield+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrt  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char sched_yield ();
+int
+main (void)
+{
+return sched_yield ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_rt_sched_yield=yes
+else $as_nop
+  ac_cv_lib_rt_sched_yield=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_yield" >&5
+printf "%s\n" "$ac_cv_lib_rt_sched_yield" >&6; }
+if test "x$ac_cv_lib_rt_sched_yield" = xyes
+then :
+  LIB_SCHED_YIELD=-lrt
+else $as_nop
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lposix4" >&5
+printf %s "checking for sched_yield in -lposix4... " >&6; }
+if test ${ac_cv_lib_posix4_sched_yield+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix4  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char sched_yield ();
+int
+main (void)
+{
+return sched_yield ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_posix4_sched_yield=yes
+else $as_nop
+  ac_cv_lib_posix4_sched_yield=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix4_sched_yield" >&5
+printf "%s\n" "$ac_cv_lib_posix4_sched_yield" >&6; }
+if test "x$ac_cv_lib_posix4_sched_yield" = xyes
+then :
+  LIB_SCHED_YIELD=-lposix4
+fi
+
+fi
+
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+
+    gl_pthreadlib_body_done=done
+  fi
+
+
+
+
+
+
+  GL_GNULIB_BTOWC=0
+
+
+
+  GL_GNULIB_WCTOB=0
+
+
+
+  GL_GNULIB_MBSINIT=0
+
+
+
+  GL_GNULIB_MBRTOWC=0
+
+
+
+  GL_GNULIB_MBRLEN=0
+
+
+
+  GL_GNULIB_MBSRTOWCS=0
+
+
+
+  GL_GNULIB_MBSNRTOWCS=0
+
+
+
+  GL_GNULIB_WCRTOMB=0
+
+
+
+  GL_GNULIB_WCSRTOMBS=0
+
+
+
+  GL_GNULIB_WCSNRTOMBS=0
+
+
+
+  GL_GNULIB_WCWIDTH=0
+
+
+
+  GL_GNULIB_WMEMCHR=0
+
+
+
+  GL_GNULIB_WMEMCMP=0
+
+
+
+  GL_GNULIB_WMEMCPY=0
+
+
+
+  GL_GNULIB_WMEMMOVE=0
+
+
+
+  GL_GNULIB_WMEMPCPY=0
+
+
+
+  GL_GNULIB_WMEMSET=0
+
+
+
+  GL_GNULIB_WCSLEN=0
+
+
+
+  GL_GNULIB_WCSNLEN=0
+
+
+
+  GL_GNULIB_WCSCPY=0
+
+
+
+  GL_GNULIB_WCPCPY=0
+
+
+
+  GL_GNULIB_WCSNCPY=0
+
+
+
+  GL_GNULIB_WCPNCPY=0
+
+
+
+  GL_GNULIB_WCSCAT=0
+
+
+
+  GL_GNULIB_WCSNCAT=0
+
+
+
+  GL_GNULIB_WCSCMP=0
+
+
+
+  GL_GNULIB_WCSNCMP=0
+
+
+
+  GL_GNULIB_WCSCASECMP=0
+
+
+
+  GL_GNULIB_WCSNCASECMP=0
+
+
+
+  GL_GNULIB_WCSCOLL=0
+
+
+
+  GL_GNULIB_WCSXFRM=0
+
+
+
+  GL_GNULIB_WCSDUP=0
+
+
+
+  GL_GNULIB_WCSCHR=0
+
+
+
+  GL_GNULIB_WCSRCHR=0
+
+
+
+  GL_GNULIB_WCSCSPN=0
+
+
+
+  GL_GNULIB_WCSSPN=0
+
+
+
+  GL_GNULIB_WCSPBRK=0
+
+
+
+  GL_GNULIB_WCSSTR=0
+
+
+
+  GL_GNULIB_WCSTOK=0
+
+
+
+  GL_GNULIB_WCSWIDTH=0
+
+
+
+  GL_GNULIB_WCSFTIME=0
+
+
+
+  GL_GNULIB_MDA_WCSDUP=1
+
+
+
+
+
+
+
+  # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it
+  # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is
+  # irrelevant for anonymous mappings.
+  ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap"
+if test "x$ac_cv_func_mmap" = xyes
+then :
+  gl_have_mmap=yes
+else $as_nop
+  gl_have_mmap=no
+fi
+
+
+  # Try to allow MAP_ANONYMOUS.
+  gl_have_mmap_anonymous=no
+  if test $gl_have_mmap = yes; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for MAP_ANONYMOUS" >&5
+printf %s "checking for MAP_ANONYMOUS... " >&6; }
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <sys/mman.h>
+#ifdef MAP_ANONYMOUS
+    I cannot identify this map
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "I cannot identify this map" >/dev/null 2>&1
+then :
+  gl_have_mmap_anonymous=yes
+fi
+rm -rf conftest*
+
+    if test $gl_have_mmap_anonymous != yes; then
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <sys/mman.h>
+#ifdef MAP_ANON
+    I cannot identify this map
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "I cannot identify this map" >/dev/null 2>&1
+then :
+
+printf "%s\n" "#define MAP_ANONYMOUS MAP_ANON" >>confdefs.h
+
+         gl_have_mmap_anonymous=yes
+fi
+rm -rf conftest*
+
+    fi
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_have_mmap_anonymous" >&5
+printf "%s\n" "$gl_have_mmap_anonymous" >&6; }
+    if test $gl_have_mmap_anonymous = yes; then
+
+printf "%s\n" "#define HAVE_MAP_ANONYMOUS 1" >>confdefs.h
+
+    fi
+  fi
+
+
+
+
+
+
+
+
+
+
+  # Detect platform-specific bugs in some versions of glibc:
+  # memchr should not dereference anything with length 0
+  #   https://bugzilla.redhat.com/show_bug.cgi?id=499689
+  # memchr should not dereference overestimated length after a match
+  #   https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737
+  #   https://sourceware.org/bugzilla/show_bug.cgi?id=10162
+  # memchr should cast the second argument to 'unsigned char'.
+  #   This bug exists in Android 4.3.
+  # Assume that memchr works on platforms that lack mprotect.
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether memchr works" >&5
+printf %s "checking whether memchr works... " >&6; }
+if test ${gl_cv_func_memchr_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                           # Guess no on Android.
+          linux*-android*) gl_cv_func_memchr_works="guessing no" ;;
+                           # Guess yes on native Windows.
+          mingw*)          gl_cv_func_memchr_works="guessing yes" ;;
+                           # If we don't know, obey --enable-cross-guesses.
+          *)               gl_cv_func_memchr_works="$gl_cross_guess_normal" ;;
+        esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <string.h>
+#if HAVE_SYS_MMAN_H
+# include <fcntl.h>
+# include <unistd.h>
+# include <sys/types.h>
+# include <sys/mman.h>
+# ifndef MAP_FILE
+#  define MAP_FILE 0
+# endif
+#endif
+
+int
+main (void)
+{
+
+  int result = 0;
+  char *fence = NULL;
+#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
+# if HAVE_MAP_ANONYMOUS
+  const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
+  const int fd = -1;
+# else /* !HAVE_MAP_ANONYMOUS */
+  const int flags = MAP_FILE | MAP_PRIVATE;
+  int fd = open ("/dev/zero", O_RDONLY, 0666);
+  if (fd >= 0)
+# endif
+    {
+      int pagesize = getpagesize ();
+      char *two_pages =
+        (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
+                       flags, fd, 0);
+      if (two_pages != (char *)(-1)
+          && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
+        fence = two_pages + pagesize;
+    }
+#endif
+  if (fence)
+    {
+      /* Test against bugs on glibc systems.  */
+      if (memchr (fence, 0, 0))
+        result |= 1;
+      strcpy (fence - 9, "12345678");
+      if (memchr (fence - 9, 0, 79) != fence - 1)
+        result |= 2;
+      if (memchr (fence - 1, 0, 3) != fence - 1)
+        result |= 4;
+      /* Test against bug on AIX 7.2.  */
+      if (memchr (fence - 4, '6', 16) != fence - 4)
+        result |= 8;
+    }
+  /* Test against bug on Android 4.3.  */
+  {
+    char input[3];
+    input[0] = 'a';
+    input[1] = 'b';
+    input[2] = 'c';
+    if (memchr (input, 0x789abc00 | 'b', 3) != input + 1)
+      result |= 16;
+  }
+  return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_memchr_works=yes
+else $as_nop
+  gl_cv_func_memchr_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_memchr_works" >&5
+printf "%s\n" "$gl_cv_func_memchr_works" >&6; }
+  case "$gl_cv_func_memchr_works" in
+    *yes) ;;
+    *) REPLACE_MEMCHR=1 ;;
+  esac
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether <limits.h> defines MIN and MAX" >&5
+printf %s "checking whether <limits.h> defines MIN and MAX... " >&6; }
+if test ${gl_cv_minmax_in_limits_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+            int x = MIN (42, 17);
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_minmax_in_limits_h=yes
+else $as_nop
+  gl_cv_minmax_in_limits_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_minmax_in_limits_h" >&5
+printf "%s\n" "$gl_cv_minmax_in_limits_h" >&6; }
+  if test $gl_cv_minmax_in_limits_h = yes; then
+
+printf "%s\n" "#define HAVE_MINMAX_IN_LIMITS_H 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether <sys/param.h> defines MIN and MAX" >&5
+printf %s "checking whether <sys/param.h> defines MIN and MAX... " >&6; }
+if test ${gl_cv_minmax_in_sys_param_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/param.h>
+            int x = MIN (42, 17);
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_minmax_in_sys_param_h=yes
+else $as_nop
+  gl_cv_minmax_in_sys_param_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_minmax_in_sys_param_h" >&5
+printf "%s\n" "$gl_cv_minmax_in_sys_param_h" >&6; }
+  if test $gl_cv_minmax_in_sys_param_h = yes; then
+
+printf "%s\n" "#define HAVE_MINMAX_IN_SYS_PARAM_H 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+
+
+
+ac_fn_check_decl "$LINENO" "obstack_printf" "ac_cv_have_decl_obstack_printf" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_obstack_printf" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_OBSTACK_PRINTF $ac_have_decl" >>confdefs.h
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for O_CLOEXEC" >&5
+printf %s "checking for O_CLOEXEC... " >&6; }
+if test ${gl_cv_macro_O_CLOEXEC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <fcntl.h>
+                          #ifndef O_CLOEXEC
+                            choke me;
+                          #endif
+
+int
+main (void)
+{
+return O_CLOEXEC;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_macro_O_CLOEXEC=yes
+else $as_nop
+  gl_cv_macro_O_CLOEXEC=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_macro_O_CLOEXEC" >&5
+printf "%s\n" "$gl_cv_macro_O_CLOEXEC" >&6; }
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for promoted mode_t type" >&5
+printf %s "checking for promoted mode_t type... " >&6; }
+if test ${gl_cv_promoted_mode_t+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+                cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+int
+main (void)
+{
+typedef int array[2 * (sizeof (mode_t) < sizeof (int)) - 1];
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_promoted_mode_t='int'
+else $as_nop
+  gl_cv_promoted_mode_t='mode_t'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_promoted_mode_t" >&5
+printf "%s\n" "$gl_cv_promoted_mode_t" >&6; }
+
+printf "%s\n" "#define PROMOTED_MODE_T $gl_cv_promoted_mode_t" >>confdefs.h
+
+
+
+     REPLACE_STRERROR_0=0
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strerror(0) succeeds" >&5
+printf %s "checking whether strerror(0) succeeds... " >&6; }
+if test ${gl_cv_func_strerror_0_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                        # Guess yes on glibc systems.
+         *-gnu* | gnu*) gl_cv_func_strerror_0_works="guessing yes" ;;
+                        # Guess yes on musl systems.
+         *-musl*)       gl_cv_func_strerror_0_works="guessing yes" ;;
+                        # Guess yes on native Windows.
+         mingw*)        gl_cv_func_strerror_0_works="guessing yes" ;;
+                        # If we don't know, obey --enable-cross-guesses.
+         *)             gl_cv_func_strerror_0_works="$gl_cross_guess_normal" ;;
+       esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+           #include <errno.h>
+
+int
+main (void)
+{
+int result = 0;
+           char *str;
+           errno = 0;
+           str = strerror (0);
+           if (!*str) result |= 1;
+           if (errno) result |= 2;
+           if (strstr (str, "nknown") || strstr (str, "ndefined"))
+             result |= 4;
+           return result;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_strerror_0_works=yes
+else $as_nop
+  gl_cv_func_strerror_0_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_0_works" >&5
+printf "%s\n" "$gl_cv_func_strerror_0_works" >&6; }
+  case "$gl_cv_func_strerror_0_works" in
+    *yes) ;;
+    *)
+      REPLACE_STRERROR_0=1
+
+printf "%s\n" "#define REPLACE_STRERROR_0 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+
+
+
+
+
+
+
+  if test $ac_cv_func_strerror_r = yes; then
+    if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
+                        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for strerror_r with POSIX signature" >&5
+printf %s "checking for strerror_r with POSIX signature... " >&6; }
+if test ${gl_cv_func_strerror_r_posix_signature+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+                int strerror_r (int, char *, size_t);
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_func_strerror_r_posix_signature=yes
+else $as_nop
+  gl_cv_func_strerror_r_posix_signature=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_r_posix_signature" >&5
+printf "%s\n" "$gl_cv_func_strerror_r_posix_signature" >&6; }
+      if test $gl_cv_func_strerror_r_posix_signature = yes; then
+                                                        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strerror_r works" >&5
+printf %s "checking whether strerror_r works... " >&6; }
+if test ${gl_cv_func_strerror_r_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+
+              case "$host_os" in
+                       # Guess no on AIX.
+                aix*)  gl_cv_func_strerror_r_works="guessing no";;
+                       # Guess no on HP-UX.
+                hpux*) gl_cv_func_strerror_r_works="guessing no";;
+                       # Guess no on BSD variants.
+                *bsd*)  gl_cv_func_strerror_r_works="guessing no";;
+                       # Guess yes otherwise.
+                *)     gl_cv_func_strerror_r_works="guessing yes";;
+              esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <errno.h>
+                  #include <string.h>
+
+int
+main (void)
+{
+int result = 0;
+                  char buf[79];
+                  if (strerror_r (EACCES, buf, 0) < 0)
+                    result |= 1;
+                  errno = 0;
+                  if (strerror_r (EACCES, buf, sizeof buf) != 0)
+                    result |= 2;
+                  strcpy (buf, "Unknown");
+                  if (strerror_r (0, buf, sizeof buf) != 0)
+                    result |= 4;
+                  if (errno)
+                    result |= 8;
+                  if (strstr (buf, "nknown") || strstr (buf, "ndefined"))
+                    result |= 0x10;
+                  errno = 0;
+                  *buf = 0;
+                  if (strerror_r (-3, buf, sizeof buf) < 0)
+                    result |= 0x20;
+                  if (errno)
+                    result |= 0x40;
+                  if (!*buf)
+                    result |= 0x80;
+                  return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_strerror_r_works=yes
+else $as_nop
+  gl_cv_func_strerror_r_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_r_works" >&5
+printf "%s\n" "$gl_cv_func_strerror_r_works" >&6; }
+      else
+
+                        if test $ac_cv_func___xpg_strerror_r = yes; then
+          { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether __xpg_strerror_r works" >&5
+printf %s "checking whether __xpg_strerror_r works... " >&6; }
+if test ${gl_cv_func_strerror_r_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+                                  gl_cv_func_strerror_r_works="$gl_cross_guess_normal"
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <errno.h>
+                    #include <string.h>
+                    extern
+                    #ifdef __cplusplus
+                    "C"
+                    #endif
+                    int __xpg_strerror_r(int, char *, size_t);
+
+int
+main (void)
+{
+int result = 0;
+                    char buf[256] = "^";
+                    char copy[256];
+                    char *str = strerror (-1);
+                    strcpy (copy, str);
+                    if (__xpg_strerror_r (-2, buf, 1) == 0)
+                      result |= 1;
+                    if (*buf)
+                      result |= 2;
+                    __xpg_strerror_r (-2, buf, 256);
+                    if (strcmp (str, copy))
+                      result |= 4;
+                    return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_strerror_r_works=yes
+else $as_nop
+  gl_cv_func_strerror_r_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_r_works" >&5
+printf "%s\n" "$gl_cv_func_strerror_r_works" >&6; }
+        fi
+      fi
+    fi
+  fi
+
+
+
+
+
+
+  if test $ac_cv_have_decl_strerror_r = no; then
+    HAVE_DECL_STRERROR_R=0
+  fi
+
+  if test $ac_cv_func_strerror_r = yes; then
+    if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
+      if test $gl_cv_func_strerror_r_posix_signature = yes; then
+        case "$gl_cv_func_strerror_r_works" in
+                    *no) REPLACE_STRERROR_R=1 ;;
+        esac
+      else
+                REPLACE_STRERROR_R=1
+      fi
+    else
+                  REPLACE_STRERROR_R=1
+    fi
+  fi
+
+
+
+
+    HAVE_POSIX_SPAWN=1;
+  HAVE_POSIX_SPAWNATTR_T=1;
+  HAVE_POSIX_SPAWN_FILE_ACTIONS_T=1;
+
+  HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=1;
+
+  HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR=1;
+
+  REPLACE_POSIX_SPAWN=0;
+  REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=0;
+
+  REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=0;
+
+  REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=0;
+
+  REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR=0;
+
+  REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=0;
+
+
+
+
+
+  LIB_POSIX_SPAWN=
+
+  gl_saved_libs=$LIBS
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing posix_spawn" >&5
+printf %s "checking for library containing posix_spawn... " >&6; }
+if test ${ac_cv_search_posix_spawn+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char posix_spawn ();
+int
+main (void)
+{
+return posix_spawn ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' rt
+do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_search_posix_spawn=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext
+  if test ${ac_cv_search_posix_spawn+y}
+then :
+  break
+fi
+done
+if test ${ac_cv_search_posix_spawn+y}
+then :
+
+else $as_nop
+  ac_cv_search_posix_spawn=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_posix_spawn" >&5
+printf "%s\n" "$ac_cv_search_posix_spawn" >&6; }
+ac_res=$ac_cv_search_posix_spawn
+if test "$ac_res" != no
+then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+  test "$ac_cv_search_posix_spawn" = "none required" ||
+                    LIB_POSIX_SPAWN=$ac_cv_search_posix_spawn
+fi
+
+    ac_fn_c_check_func "$LINENO" "posix_spawn" "ac_cv_func_posix_spawn"
+if test "x$ac_cv_func_posix_spawn" = xyes
+then :
+  printf "%s\n" "#define HAVE_POSIX_SPAWN 1" >>confdefs.h
+
+fi
+
+  LIBS=$gl_saved_libs
+
+  if test $ac_cv_func_posix_spawn != yes; then
+    HAVE_POSIX_SPAWN=0
+  fi
+
+
+
+
+
+                                      ac_fn_check_decl "$LINENO" "posix_spawn" "ac_cv_have_decl_posix_spawn" "#include <spawn.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_posix_spawn" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_POSIX_SPAWN $ac_have_decl" >>confdefs.h
+
+  if test $ac_cv_func_posix_spawn = yes; then
+
+       if test $ac_cv_func_posix_spawn_file_actions_addchdir_np = no; then
+                           REPLACE_POSIX_SPAWN=1
+       fi
+
+
+    if test $REPLACE_POSIX_SPAWN = 0; then
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn works" >&5
+printf %s "checking whether posix_spawn works... " >&6; }
+if test ${gl_cv_func_posix_spawn_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test $cross_compiling = no; then
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <spawn.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+
+$gl_mda_defines
+
+
+extern char **environ;
+
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+#ifndef WTERMSIG
+# define WTERMSIG(x) ((x) & 0x7f)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(x) (WTERMSIG (x) == 0)
+#endif
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(x) (((x) >> 8) & 0xff)
+#endif
+
+#define CHILD_PROGRAM_FILENAME "/non/exist/ent"
+
+static int
+fd_safer (int fd)
+{
+  if (0 <= fd && fd <= 2)
+    {
+      int f = fd_safer (dup (fd));
+      int e = errno;
+      close (fd);
+      errno = e;
+      fd = f;
+    }
+
+  return fd;
+}
+
+int
+main ()
+{
+  char *argv[2] = { CHILD_PROGRAM_FILENAME, NULL };
+  int ofd[2];
+  sigset_t blocked_signals;
+  sigset_t fatal_signal_set;
+  posix_spawn_file_actions_t actions;
+  bool actions_allocated;
+  posix_spawnattr_t attrs;
+  bool attrs_allocated;
+  int err;
+  pid_t child;
+  int status;
+  int exitstatus;
+
+  setvbuf (stdout, NULL, _IOFBF, 0);
+  puts ("This should be seen only once.");
+  if (pipe (ofd) < 0 || (ofd[1] = fd_safer (ofd[1])) < 0)
+    {
+      perror ("cannot create pipe");
+      exit (1);
+    }
+  sigprocmask (SIG_SETMASK, NULL, &blocked_signals);
+  sigemptyset (&fatal_signal_set);
+  sigaddset (&fatal_signal_set, SIGINT);
+  sigaddset (&fatal_signal_set, SIGTERM);
+  sigaddset (&fatal_signal_set, SIGHUP);
+  sigaddset (&fatal_signal_set, SIGPIPE);
+  sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL);
+  actions_allocated = false;
+  attrs_allocated = false;
+  if ((err = posix_spawn_file_actions_init (&actions)) != 0
+      || (actions_allocated = true,
+          (err = posix_spawn_file_actions_adddup2 (&actions, ofd[0], STDIN_FILENO)) != 0
+          || (err = posix_spawn_file_actions_addclose (&actions, ofd[0])) != 0
+          || (err = posix_spawn_file_actions_addclose (&actions, ofd[1])) != 0
+          || (err = posix_spawnattr_init (&attrs)) != 0
+          || (attrs_allocated = true,
+              (err = posix_spawnattr_setsigmask (&attrs, &blocked_signals)) != 0
+              || (err = posix_spawnattr_setflags (&attrs, POSIX_SPAWN_SETSIGMASK)) != 0)
+          || (err = posix_spawnp (&child, CHILD_PROGRAM_FILENAME, &actions, &attrs, argv, environ)) != 0))
+    {
+      if (actions_allocated)
+        posix_spawn_file_actions_destroy (&actions);
+      if (attrs_allocated)
+        posix_spawnattr_destroy (&attrs);
+      sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+      if (err == ENOENT)
+        return 0;
+      else
+        {
+          errno = err;
+          perror ("subprocess failed");
+          exit (1);
+        }
+    }
+  posix_spawn_file_actions_destroy (&actions);
+  posix_spawnattr_destroy (&attrs);
+  sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+  close (ofd[0]);
+  close (ofd[1]);
+  status = 0;
+  while (waitpid (child, &status, 0) != child)
+    ;
+  if (!WIFEXITED (status))
+    {
+      fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status);
+      exit (1);
+    }
+  exitstatus = WEXITSTATUS (status);
+  if (exitstatus != 127)
+    {
+      fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus);
+      exit (1);
+    }
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  if test -s conftest$ac_exeext \
+             && ./conftest$ac_exeext > conftest.out \
+             && echo 'This should be seen only once.' > conftest.ok \
+             && cmp conftest.out conftest.ok >/dev/null 2>&1; then
+            gl_cv_func_posix_spawn_works=yes
+          else
+            gl_cv_func_posix_spawn_works=no
+          fi
+else $as_nop
+  gl_cv_func_posix_spawn_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+       if test $gl_cv_func_posix_spawn_works = yes; then
+         if test "$cross_compiling" = yes
+then :
+  { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Test whether posix_spawn_file_actions_addopen supports filename arguments
+   that contain special characters such as '*'.  */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <spawn.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+
+$gl_mda_defines
+
+
+extern char **environ;
+
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+#ifndef WTERMSIG
+# define WTERMSIG(x) ((x) & 0x7f)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(x) (WTERMSIG (x) == 0)
+#endif
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(x) (((x) >> 8) & 0xff)
+#endif
+
+#define CHILD_PROGRAM_FILENAME "conftest"
+#define DATA_FILENAME "conftest%=*#?"
+
+static int
+parent_main (void)
+{
+  FILE *fp;
+  char *argv[3] = { CHILD_PROGRAM_FILENAME, "-child", NULL };
+  posix_spawn_file_actions_t actions;
+  bool actions_allocated;
+  int err;
+  pid_t child;
+  int status;
+  int exitstatus;
+
+  /* Create a data file with specific contents.  */
+  fp = fopen (DATA_FILENAME, "wb");
+  if (fp == NULL)
+    {
+      perror ("cannot create data file");
+      return 1;
+    }
+  fwrite ("Halle Potta", 1, 11, fp);
+  if (fflush (fp) || fclose (fp))
+    {
+      perror ("cannot prepare data file");
+      return 2;
+    }
+
+  /* Avoid reading from our stdin, as it could block.  */
+  freopen ("/dev/null", "rb", stdin);
+
+  /* Test whether posix_spawn_file_actions_addopen with this file name
+     actually works, but spawning a child that reads from this file.  */
+  actions_allocated = false;
+  if ((err = posix_spawn_file_actions_init (&actions)) != 0
+      || (actions_allocated = true,
+          (err = posix_spawn_file_actions_addopen (&actions, STDIN_FILENO, DATA_FILENAME, O_RDONLY, 0600)) != 0
+          || (err = posix_spawn (&child, CHILD_PROGRAM_FILENAME, &actions, NULL, argv, environ)) != 0))
+    {
+      if (actions_allocated)
+        posix_spawn_file_actions_destroy (&actions);
+      errno = err;
+      perror ("subprocess failed");
+      return 3;
+    }
+  posix_spawn_file_actions_destroy (&actions);
+  status = 0;
+  while (waitpid (child, &status, 0) != child)
+    ;
+  if (!WIFEXITED (status))
+    {
+      fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status);
+      return 4;
+    }
+  exitstatus = WEXITSTATUS (status);
+  if (exitstatus != 0)
+    {
+      fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus);
+      return 5;
+    }
+  return 0;
+}
+
+static int
+child_main (void)
+{
+  char buf[1024];
+
+  /* See if reading from STDIN_FILENO yields the expected contents.  */
+  if (fread (buf, 1, sizeof (buf), stdin) == 11
+      && memcmp (buf, "Halle Potta", 11) == 0)
+    return 0;
+  else
+    return 8;
+}
+
+static void
+cleanup_then_die (int sig)
+{
+  /* Clean up data file.  */
+  unlink (DATA_FILENAME);
+
+  /* Re-raise the signal and die from it.  */
+  signal (sig, SIG_DFL);
+  raise (sig);
+}
+
+int
+main (int argc, char *argv[])
+{
+  int exitstatus;
+
+  if (!(argc > 1 && strcmp (argv[1], "-child") == 0))
+    {
+      /* This is the parent process.  */
+      signal (SIGINT, cleanup_then_die);
+      signal (SIGTERM, cleanup_then_die);
+      #ifdef SIGHUP
+      signal (SIGHUP, cleanup_then_die);
+      #endif
+
+      exitstatus = parent_main ();
+    }
+  else
+    {
+      /* This is the child process.  */
+
+      exitstatus = child_main ();
+    }
+  unlink (DATA_FILENAME);
+  return exitstatus;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+
+else $as_nop
+  gl_cv_func_posix_spawn_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+       fi
+     else
+       case "$host_os" in
+         aix*) gl_cv_func_posix_spawn_works="guessing no";;
+         *)    gl_cv_func_posix_spawn_works="guessing yes";;
+       esac
+     fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_works" >&5
+printf "%s\n" "$gl_cv_func_posix_spawn_works" >&6; }
+
+      case "$gl_cv_func_posix_spawn_works" in
+        *yes) ;;
+        *) REPLACE_POSIX_SPAWN=1 ;;
+      esac
+    fi
+    if test $REPLACE_POSIX_SPAWN = 0; then
+
+
+         { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn rejects scripts without shebang" >&5
+printf %s "checking whether posix_spawn rejects scripts without shebang... " >&6; }
+if test ${gl_cv_func_posix_spawn_secure_exec+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  echo ':' > conftest.scr
+     chmod a+x conftest.scr
+     if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+          # Guess no on GNU/Hurd.
+          gnu*)
+            gl_cv_func_posix_spawn_secure_exec="guessing no" ;;
+          # Guess yes on all other platforms.
+          *)
+            gl_cv_func_posix_spawn_secure_exec="guessing yes" ;;
+        esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+       #include <errno.h>
+       #include <spawn.h>
+       #include <stddef.h>
+       #include <sys/types.h>
+       #include <sys/wait.h>
+       int
+       main ()
+       {
+         const char *prog_path = "./conftest.scr";
+         const char *prog_argv[2] = { prog_path, NULL };
+         const char *environment[2] = { "PATH=.", NULL };
+         pid_t child;
+         int status;
+         int err = posix_spawn (&child, prog_path, NULL, NULL,
+                                (char **) prog_argv, (char **) environment);
+         if (err == ENOEXEC)
+           return 0;
+         if (err != 0)
+           return 1;
+         status = 0;
+         while (waitpid (child, &status, 0) != child)
+           ;
+         if (!WIFEXITED (status))
+           return 2;
+         if (WEXITSTATUS (status) != 127)
+           return 3;
+         return 0;
+       }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_posix_spawn_secure_exec=yes
+else $as_nop
+  gl_cv_func_posix_spawn_secure_exec=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+     rm -f conftest.scr
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_secure_exec" >&5
+printf "%s\n" "$gl_cv_func_posix_spawn_secure_exec" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether posix_spawnp rejects scripts without shebang" >&5
+printf %s "checking whether posix_spawnp rejects scripts without shebang... " >&6; }
+if test ${gl_cv_func_posix_spawnp_secure_exec+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  echo ':' > conftest.scr
+     chmod a+x conftest.scr
+     if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+          # Guess yes on glibc systems (glibc >= 2.15 actually) except GNU/Hurd,
+          # musl libc, NetBSD.
+          *-gnu* | *-musl* | netbsd*)
+            gl_cv_func_posix_spawnp_secure_exec="guessing yes" ;;
+          # Guess no on GNU/Hurd, macOS, FreeBSD, OpenBSD, AIX, Solaris, Cygwin.
+          gnu* | darwin* | freebsd* | dragonfly* | midnightbsd* | openbsd* | \
+          aix* | solaris* | cygwin*)
+            gl_cv_func_posix_spawnp_secure_exec="guessing no" ;;
+          # If we don't know, obey --enable-cross-guesses.
+          *)
+            gl_cv_func_posix_spawnp_secure_exec="$gl_cross_guess_normal" ;;
+        esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+       #include <errno.h>
+       #include <spawn.h>
+       #include <stddef.h>
+       #include <sys/types.h>
+       #include <sys/wait.h>
+       int
+       main ()
+       {
+         const char *prog_path = "./conftest.scr";
+         const char *prog_argv[2] = { prog_path, NULL };
+         const char *environment[2] = { "PATH=.", NULL };
+         pid_t child;
+         int status;
+         int err = posix_spawnp (&child, prog_path, NULL, NULL,
+                                 (char **) prog_argv, (char **) environment);
+         if (err == ENOEXEC)
+           return 0;
+         if (err != 0)
+           return 1;
+         status = 0;
+         while (waitpid (child, &status, 0) != child)
+           ;
+         if (!WIFEXITED (status))
+           return 2;
+         if (WEXITSTATUS (status) != 127)
+           return 3;
+         return 0;
+       }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_posix_spawnp_secure_exec=yes
+else $as_nop
+  gl_cv_func_posix_spawnp_secure_exec=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+     rm -f conftest.scr
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawnp_secure_exec" >&5
+printf "%s\n" "$gl_cv_func_posix_spawnp_secure_exec" >&6; }
+
+      case "$gl_cv_func_posix_spawn_secure_exec" in
+        *yes) ;;
+        *) REPLACE_POSIX_SPAWN=1 ;;
+      esac
+      case "$gl_cv_func_posix_spawnp_secure_exec" in
+        *yes) ;;
+        *) REPLACE_POSIX_SPAWN=1 ;;
+      esac
+    fi
+    if test $REPLACE_POSIX_SPAWN = 0; then
+                              { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether posix_spawnattr_setschedpolicy is supported" >&5
+printf %s "checking whether posix_spawnattr_setschedpolicy is supported... " >&6; }
+if test ${gl_cv_func_spawnattr_setschedpolicy+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <spawn.h>
+#if POSIX_SPAWN_SETSCHEDULER
+ POSIX scheduling supported
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "POSIX scheduling supported" >/dev/null 2>&1
+then :
+  gl_cv_func_spawnattr_setschedpolicy=yes
+else $as_nop
+  gl_cv_func_spawnattr_setschedpolicy=no
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_spawnattr_setschedpolicy" >&5
+printf "%s\n" "$gl_cv_func_spawnattr_setschedpolicy" >&6; }
+                              { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether posix_spawnattr_setschedparam is supported" >&5
+printf %s "checking whether posix_spawnattr_setschedparam is supported... " >&6; }
+if test ${gl_cv_func_spawnattr_setschedparam+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <spawn.h>
+#if POSIX_SPAWN_SETSCHEDPARAM
+ POSIX scheduling supported
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "POSIX scheduling supported" >/dev/null 2>&1
+then :
+  gl_cv_func_spawnattr_setschedparam=yes
+else $as_nop
+  gl_cv_func_spawnattr_setschedparam=no
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_spawnattr_setschedparam" >&5
+printf "%s\n" "$gl_cv_func_spawnattr_setschedparam" >&6; }
+    fi
+  else
+                if test $ac_cv_have_decl_posix_spawn = yes; then
+                              REPLACE_POSIX_SPAWN=1
+    fi
+  fi
+  if test $ac_cv_func_posix_spawn != yes || test $REPLACE_POSIX_SPAWN = 1; then
+
+printf "%s\n" "#define REPLACE_POSIX_SPAWN 1" >>confdefs.h
+
+  fi
+
+
+
+  GL_GNULIB_POSIX_SPAWN=0
+
+
+
+  GL_GNULIB_POSIX_SPAWNP=0
+
+
+
+  GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT=0
+
+
+
+  GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=0
+
+
+
+  GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=0
+
+
+
+  GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=0
+
+
+
+  GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR=0
+
+
+
+  GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=0
+
+
+
+  GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY=0
+
+
+
+  GL_GNULIB_POSIX_SPAWNATTR_INIT=0
+
+
+
+  GL_GNULIB_POSIX_SPAWNATTR_GETFLAGS=0
+
+
+
+  GL_GNULIB_POSIX_SPAWNATTR_SETFLAGS=0
+
+
+
+  GL_GNULIB_POSIX_SPAWNATTR_GETPGROUP=0
+
+
+
+  GL_GNULIB_POSIX_SPAWNATTR_SETPGROUP=0
+
+
+
+  GL_GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM=0
+
+
+
+  GL_GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM=0
+
+
+
+  GL_GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY=0
+
+
+
+  GL_GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY=0
+
+
+
+  GL_GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT=0
+
+
+
+  GL_GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT=0
+
+
+
+  GL_GNULIB_POSIX_SPAWNATTR_GETSIGMASK=0
+
+
+
+  GL_GNULIB_POSIX_SPAWNATTR_SETSIGMASK=0
+
+
+
+  GL_GNULIB_POSIX_SPAWNATTR_DESTROY=0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_cv_func_vfprintf_posix=no
+  case "$gl_cv_func_printf_sizes_c99" in
+    *yes)
+      case "$gl_cv_func_printf_long_double" in
+        *yes)
+          case "$gl_cv_func_printf_infinite" in
+            *yes)
+              case "$gl_cv_func_printf_infinite_long_double" in
+                *yes)
+                  case "$gl_cv_func_printf_directive_a" in
+                    *yes)
+                      case "$gl_cv_func_printf_directive_f" in
+                        *yes)
+                          case "$gl_cv_func_printf_directive_n" in
+                            *yes)
+                              case "$gl_cv_func_printf_directive_ls" in
+                                *yes)
+                                  case "$gl_cv_func_printf_positions" in
+                                    *yes)
+                                      case "$gl_cv_func_printf_flag_grouping" in
+                                        *yes)
+                                          case "$gl_cv_func_printf_flag_leftadjust" in
+                                            *yes)
+                                              case "$gl_cv_func_printf_flag_zero" in
+                                                *yes)
+                                                  case "$gl_cv_func_printf_precision" in
+                                                    *yes)
+                                                      case "$gl_cv_func_printf_enomem" in
+                                                        *yes)
+                                                          # vfprintf exists and is
+                                                          # already POSIX compliant.
+                                                          gl_cv_func_vfprintf_posix=yes
+                                                          ;;
+                                                      esac
+                                                      ;;
+                                                  esac
+                                                  ;;
+                                              esac
+                                              ;;
+                                          esac
+                                          ;;
+                                      esac
+                                      ;;
+                                  esac
+                                  ;;
+                              esac
+                              ;;
+                          esac
+                          ;;
+                      esac
+                      ;;
+                  esac
+                  ;;
+              esac
+              ;;
+          esac
+          ;;
+      esac
+      ;;
+  esac
+  if test $gl_cv_func_vfprintf_posix = no; then
+
+
+
+  case "$gl_cv_func_printf_infinite" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+  case "$gl_cv_func_printf_long_double" in
+    *yes)
+      case "$gl_cv_func_printf_infinite_long_double" in
+        *yes)
+          ;;
+        *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
+
+          ;;
+      esac
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_a" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
+
+      ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
+if test "x$ac_cv_func_nl_langinfo" = xyes
+then :
+  printf "%s\n" "#define HAVE_NL_LANGINFO 1" >>confdefs.h
+
+fi
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_f" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_ls" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_grouping" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_leftadjust" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_zero" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_precision" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_enomem" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
+
+  if test $ac_cv_func_vasnprintf = yes; then
+
+printf "%s\n" "#define REPLACE_VASNPRINTF 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+
+
+
+
+  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
+if test "x$ac_cv_type_ptrdiff_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define ptrdiff_t long" >>confdefs.h
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS vfprintf.$ac_objext"
+
+  REPLACE_VFPRINTF=1
+
+printf "%s\n" "#define REPLACE_VFPRINTF_POSIX 1" >>confdefs.h
+
+  :
+
+  fi
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef _MSC_VER
+MicrosoftCompiler
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "MicrosoftCompiler" >/dev/null 2>&1
+then :
+            rm -f conftest*
+     echo 'int dummy;' > conftest.c
+     { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null 2>&1
+     if test -f conftest.o; then
+       gl_asmext='s'
+       gl_c_asm_opt='-S'
+     else
+       gl_asmext='asm'
+       gl_c_asm_opt='-c -Fa'
+     fi
+     rm -f conftest*
+
+else $as_nop
+  gl_asmext='s'
+     gl_c_asm_opt='-S'
+
+fi
+rm -rf conftest*
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C symbols are prefixed with underscore at the linker level" >&5
+printf %s "checking whether C symbols are prefixed with underscore at the linker level... " >&6; }
+if test ${gl_cv_prog_as_underscore+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat > conftest.c <<EOF
+#ifdef __cplusplus
+extern "C" int foo (void);
+#endif
+int foo(void) { return 0; }
+EOF
+     # Look for the assembly language name in the .s file.
+     { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null 2>&1
+     if LC_ALL=C $EGREP '(^|[^a-zA-Z0-9_])_foo([^a-zA-Z0-9_]|$)' conftest.$gl_asmext >/dev/null; then
+       gl_cv_prog_as_underscore=yes
+     else
+       gl_cv_prog_as_underscore=no
+     fi
+     rm -f conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_prog_as_underscore" >&5
+printf "%s\n" "$gl_cv_prog_as_underscore" >&6; }
+  if test $gl_cv_prog_as_underscore = yes; then
+    USER_LABEL_PREFIX=_
+  else
+    USER_LABEL_PREFIX=
+  fi
+
+printf "%s\n" "#define USER_LABEL_PREFIX $USER_LABEL_PREFIX" >>confdefs.h
+
+  ASM_SYMBOL_PREFIX='"'${USER_LABEL_PREFIX}'"'
+
+
+
+    HAVE_POSIX_SIGNALBLOCKING=1;
+  HAVE_PTHREAD_SIGMASK=1;
+  HAVE_RAISE=1;
+  HAVE_SIGSET_T=1;
+  HAVE_SIGINFO_T=1;
+  HAVE_SIGACTION=1;
+  HAVE_STRUCT_SIGACTION_SA_SIGACTION=1;
+
+  HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=1;
+
+  HAVE_SIGHANDLER_T=1;
+  REPLACE_PTHREAD_SIGMASK=0;
+  REPLACE_RAISE=0;
+
+
+  ac_fn_c_check_type "$LINENO" "sigset_t" "ac_cv_type_sigset_t" "
+      #include <signal.h>
+      /* Mingw defines sigset_t not in <signal.h>, but in <sys/types.h>.  */
+      #include <sys/types.h>
+
+"
+if test "x$ac_cv_type_sigset_t" = xyes
+then :
+
+printf "%s\n" "#define HAVE_SIGSET_T 1" >>confdefs.h
+
+gl_cv_type_sigset_t=yes
+else $as_nop
+  gl_cv_type_sigset_t=no
+fi
+
+  if test $gl_cv_type_sigset_t != yes; then
+    HAVE_SIGSET_T=0
+  fi
+
+
+
+  GL_GNULIB_PTHREAD_SIGMASK=0
+
+
+
+  GL_GNULIB_RAISE=0
+
+
+
+  GL_GNULIB_SIGNAL_H_SIGPIPE=0
+
+
+
+  GL_GNULIB_SIGPROCMASK=0
+
+
+
+  GL_GNULIB_SIGACTION=0
+
+
+
+
+
+
+
+  if test $REPLACE_MALLOC = 1; then
+    REPLACE_REALLOC=1
+  fi
+
+
+                              { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shared library path variable" >&5
+printf %s "checking for shared library path variable... " >&6; }
+if test ${acl_cv_libpath+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+    LD="$LD" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.libpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_libpath=${acl_cv_shlibpath_var:-none}
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_libpath" >&5
+printf "%s\n" "$acl_cv_libpath" >&6; }
+  shlibpath_var="$acl_cv_shlibpath_var"
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to activate relocatable installation" >&5
+printf %s "checking whether to activate relocatable installation... " >&6; }
+  # Check whether --enable-relocatable was given.
+if test ${enable_relocatable+y}
+then :
+  enableval=$enable_relocatable; if test "$enableval" != no; then
+       RELOCATABLE=yes
+     else
+       RELOCATABLE=no
+     fi
+
+else $as_nop
+  RELOCATABLE=no
+fi
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RELOCATABLE" >&5
+printf "%s\n" "$RELOCATABLE" >&6; }
+
+
+
+    if test "X$prefix" = "XNONE"; then
+    reloc_final_prefix="$ac_default_prefix"
+  else
+    reloc_final_prefix="$prefix"
+  fi
+
+printf "%s\n" "#define INSTALLPREFIX \"${reloc_final_prefix}\"" >>confdefs.h
+
+  if test $RELOCATABLE = yes; then
+
+printf "%s\n" "#define ENABLE_RELOCATABLE 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+
+
+
+  is_noop=no
+  use_elf_origin_trick=no
+  use_macos_tools=no
+  use_wrapper=no
+  if test $RELOCATABLE = yes; then
+    # --enable-relocatable implies --disable-rpath
+    enable_rpath=no
+    ac_fn_c_check_header_compile "$LINENO" "mach-o/dyld.h" "ac_cv_header_mach_o_dyld_h" "$ac_includes_default"
+if test "x$ac_cv_header_mach_o_dyld_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_MACH_O_DYLD_H 1" >>confdefs.h
+
+fi
+
+    ac_fn_c_check_func "$LINENO" "_NSGetExecutablePath" "ac_cv_func__NSGetExecutablePath"
+if test "x$ac_cv_func__NSGetExecutablePath" = xyes
+then :
+  printf "%s\n" "#define HAVE__NSGETEXECUTABLEPATH 1" >>confdefs.h
+
+fi
+
+    case "$host_os" in
+      mingw*) is_noop=yes ;;
+      # For the platforms that support $ORIGIN, see
+      # <https://lekensteyn.nl/rpath.html>.
+      # glibc systems, Linux with musl libc: yes. Android: no.
+      linux*-android*) ;;
+      linux* | kfreebsd*) use_elf_origin_trick=yes ;;
+      # Hurd: <https://lists.gnu.org/r/bug-hurd/2019-02/msg00049.html>
+      # only after the glibc commit from 2018-01-08
+      # <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=311ba8dc4416467947eff2ab327854f124226309>
+      gnu*)
+        # Test for a glibc version >= 2.27.
+        ac_fn_c_check_func "$LINENO" "copy_file_range" "ac_cv_func_copy_file_range"
+if test "x$ac_cv_func_copy_file_range" = xyes
+then :
+  printf "%s\n" "#define HAVE_COPY_FILE_RANGE 1" >>confdefs.h
+
+fi
+
+        if test $ac_cv_func_copy_file_range = yes; then
+          use_elf_origin_trick=yes
+        fi
+        ;;
+      # FreeBSD >= 7.3, DragonFly >= 3.0, MidnightBSD >= 1.1: yes.
+      freebsd | freebsd[1-7] | freebsd[1-6].* | freebsd7.[0-2]) ;;
+      dragonfly | dragonfly[1-2] | dragonfly[1-2].*) ;;
+      midnightbsd | midnightbsd0* | midnightbsd1.0*) ;;
+      freebsd* | dragonfly* | midnightbsd*) use_elf_origin_trick=yes ;;
+      # NetBSD >= 8.0: yes.
+      netbsd | netbsd[1-7] | netbsd[1-7].*) ;;
+      netbsdelf | netbsdelf[1-7] | netbsdelf[1-7].*) ;;
+      netbsd*) use_elf_origin_trick=yes ;;
+      # OpenBSD >= 5.4: yes.
+      openbsd | openbsd[1-5] | openbsd[1-4].* | openbsd5.[0-3]) ;;
+      openbsd*) use_elf_origin_trick=yes ;;
+      # Solaris >= 10: yes.
+      solaris | solaris2.[1-9] | solaris2.[1-9].*) ;;
+      solaris*) use_elf_origin_trick=yes ;;
+      # Haiku: yes.
+      haiku*) use_elf_origin_trick=yes ;;
+      # On Mac OS X 10.4 or newer, use Mac OS X tools. See
+      # <https://wincent.com/wiki/@executable_path,_@load_path_and_@rpath>.
+      darwin | darwin[1-7].*) ;;
+      darwin*) use_macos_tools=yes ;;
+    esac
+    if test $is_noop = yes; then
+      RELOCATABLE_LDFLAGS=:
+
+    else
+      if test $use_elf_origin_trick = yes || test $use_macos_tools = yes; then
+                case "$ac_aux_dir" in
+          /*) reloc_ldflags="$ac_aux_dir/reloc-ldflags" ;;
+          *) reloc_ldflags="\$(top_builddir)/$ac_aux_dir/reloc-ldflags" ;;
+        esac
+        RELOCATABLE_LDFLAGS="\"$reloc_ldflags\" \"\$(host)\" \"\$(RELOCATABLE_LIBRARY_PATH)\""
+
+        if test $use_macos_tools = yes; then
+                    case "$ac_aux_dir" in
+            /*) LIBTOOL="${CONFIG_SHELL-$SHELL} $ac_aux_dir/libtool-reloc $LIBTOOL" ;;
+            *) LIBTOOL="${CONFIG_SHELL-$SHELL} \$(top_builddir)/$ac_aux_dir/libtool-reloc $LIBTOOL" ;;
+          esac
+        fi
+      else
+        use_wrapper=yes
+                                        INSTALL_PROGRAM_ENV="RELOC_LIBRARY_PATH_VAR=\"$shlibpath_var\" RELOC_LIBRARY_PATH_VALUE=\"\$(RELOCATABLE_LIBRARY_PATH)\" RELOC_PREFIX=\"\$(prefix)\" RELOC_DESTDIR=\"\$(DESTDIR)\" RELOC_COMPILE_COMMAND=\"\$(CC) \$(CPPFLAGS) \$(CFLAGS) \$(LDFLAGS)\" RELOC_SRCDIR=\"\$(RELOCATABLE_SRC_DIR)\" RELOC_BUILDDIR=\"\$(RELOCATABLE_BUILD_DIR)\" RELOC_CONFIG_H_DIR=\"\$(RELOCATABLE_CONFIG_H_DIR)\" RELOC_EXEEXT=\"\$(EXEEXT)\" RELOC_STRIP_PROG=\"\$(RELOCATABLE_STRIP)\" RELOC_INSTALL_PROG=\"$INSTALL_PROGRAM\""
+
+        case "$ac_aux_dir" in
+          /*) INSTALL_PROGRAM="$ac_aux_dir/install-reloc" ;;
+          *) INSTALL_PROGRAM="\$(top_builddir)/$ac_aux_dir/install-reloc" ;;
+        esac
+      fi
+    fi
+  fi
+   if test $is_noop = yes || test $use_elf_origin_trick = yes || test $use_macos_tools = yes; then
+  RELOCATABLE_VIA_LD_TRUE=
+  RELOCATABLE_VIA_LD_FALSE='#'
+else
+  RELOCATABLE_VIA_LD_TRUE='#'
+  RELOCATABLE_VIA_LD_FALSE=
+fi
+
+   if test $use_wrapper = yes; then
+  RELOCATABLE_VIA_WRAPPER_TRUE=
+  RELOCATABLE_VIA_WRAPPER_FALSE='#'
+else
+  RELOCATABLE_VIA_WRAPPER_TRUE='#'
+  RELOCATABLE_VIA_WRAPPER_FALSE=
+fi
+
+
+
+
+
+
+
+
+      RELOCATABLE_STRIP=':'
+
+
+
+
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether malloc (0) returns nonnull" >&5
+printf %s "checking whether malloc (0) returns nonnull... " >&6; }
+if test ${ac_cv_func_malloc_0_nonnull+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+          # Guess yes on platforms where we know the result.
+          *-gnu* | freebsd* | netbsd* | openbsd* | bitrig* \
+          | gnu* | *-musl* | midnightbsd* \
+          | hpux* | solaris* | cygwin* | mingw* | msys* )
+            ac_cv_func_malloc_0_nonnull="guessing yes" ;;
+          # If we don't know, obey --enable-cross-guesses.
+          *) ac_cv_func_malloc_0_nonnull="$gl_cross_guess_normal" ;;
+        esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+int
+main (void)
+{
+void *p = malloc (0);
+            int result = !p;
+            free (p);
+            return result;
+  ;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  ac_cv_func_malloc_0_nonnull=yes
+else $as_nop
+  ac_cv_func_malloc_0_nonnull=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5
+printf "%s\n" "$ac_cv_func_malloc_0_nonnull" >&6; }
+  case $ac_cv_func_malloc_0_nonnull in #(
+  *yes) :
+    gl_cv_func_malloc_0_nonnull=1 ;; #(
+  *) :
+    gl_cv_func_malloc_0_nonnull=0 ;;
+esac
+
+
+printf "%s\n" "#define MALLOC_0_IS_NONNULL $gl_cv_func_malloc_0_nonnull" >>confdefs.h
+
+
+ac_fn_check_decl "$LINENO" "setenv" "ac_cv_have_decl_setenv" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_setenv" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_SETENV $ac_have_decl" >>confdefs.h
+
+
+
+
+    HAVE_SCHED_YIELD=1;
+  REPLACE_SCHED_YIELD=0;
+
+
+
+
+
+
+
+  ac_fn_c_check_header_compile "$LINENO" "sched.h" "ac_cv_header_sched_h" "#if HAVE_SYS_CDEFS_H
+       #include <sys/cdefs.h>
+      #endif
+
+"
+if test "x$ac_cv_header_sched_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_SCHED_H 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_sched_h='<'sched.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sched.h>" >&5
+printf %s "checking absolute name of <sched.h>... " >&6; }
+if test ${gl_cv_next_sched_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sched.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'sched.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_sched_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_sched_h
+           gl_cv_next_sched_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sched_h" >&5
+printf "%s\n" "$gl_cv_next_sched_h" >&6; }
+     fi
+     NEXT_SCHED_H=$gl_cv_next_sched_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'sched.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_sched_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_SCHED_H=$gl_next_as_first_directive
+
+
+
+
+
+  if test "$ac_cv_header_sched_h" = yes; then
+    HAVE_SCHED_H=1
+  else
+    HAVE_SCHED_H=0
+  fi
+
+
+  if test "$HAVE_SCHED_H" = 1; then
+    ac_fn_c_check_type "$LINENO" "struct sched_param" "ac_cv_type_struct_sched_param" "#if HAVE_SYS_CDEFS_H
+         #include <sys/cdefs.h>
+        #endif
+        #include <sched.h>
+
+"
+if test "x$ac_cv_type_struct_sched_param" = xyes
+then :
+  HAVE_STRUCT_SCHED_PARAM=1
+else $as_nop
+  HAVE_STRUCT_SCHED_PARAM=0
+fi
+
+  else
+    HAVE_STRUCT_SCHED_PARAM=0
+    case "$host_os" in
+      os2*)
+                ac_fn_c_check_type "$LINENO" "struct sched_param" "ac_cv_type_struct_sched_param" "#include <spawn.h>
+"
+if test "x$ac_cv_type_struct_sched_param" = xyes
+then :
+  HAVE_STRUCT_SCHED_PARAM=1
+fi
+
+        ;;
+      vms)
+                ac_fn_c_check_type "$LINENO" "struct sched_param" "ac_cv_type_struct_sched_param" "#include <pthread.h>
+"
+if test "x$ac_cv_type_struct_sched_param" = xyes
+then :
+  HAVE_STRUCT_SCHED_PARAM=1
+fi
+
+        ;;
+    esac
+  fi
+
+
+  if test "$ac_cv_header_sys_cdefs_h" = yes; then
+    HAVE_SYS_CDEFS_H=1
+  else
+    HAVE_SYS_CDEFS_H=0
+  fi
+
+
+
+
+
+
+
+
+
+
+  GL_GNULIB_SCHED_YIELD=0
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5
+printf %s "checking for uid_t in sys/types.h... " >&6; }
+if test ${ac_cv_type_uid_t+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "uid_t" >/dev/null 2>&1
+then :
+  ac_cv_type_uid_t=yes
+else $as_nop
+  ac_cv_type_uid_t=no
+fi
+rm -rf conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5
+printf "%s\n" "$ac_cv_type_uid_t" >&6; }
+if test $ac_cv_type_uid_t = no; then
+
+printf "%s\n" "#define uid_t int" >>confdefs.h
+
+
+printf "%s\n" "#define gid_t int" >>confdefs.h
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_signal_h='<'signal.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <signal.h>" >&5
+printf %s "checking absolute name of <signal.h>... " >&6; }
+if test ${gl_cv_next_signal_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <signal.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'signal.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_signal_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_signal_h
+           gl_cv_next_signal_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_signal_h" >&5
+printf "%s\n" "$gl_cv_next_signal_h" >&6; }
+     fi
+     NEXT_SIGNAL_H=$gl_cv_next_signal_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'signal.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_signal_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H=$gl_next_as_first_directive
+
+
+
+
+
+# AIX declares sig_atomic_t to already include volatile, and C89 compilers
+# then choke on 'volatile sig_atomic_t'.  C99 requires that it compile.
+  ac_fn_c_check_type "$LINENO" "volatile sig_atomic_t" "ac_cv_type_volatile_sig_atomic_t" "
+#include <signal.h>
+
+"
+if test "x$ac_cv_type_volatile_sig_atomic_t" = xyes
+then :
+
+else $as_nop
+  HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=0
+fi
+
+
+
+
+
+
+
+  ac_fn_c_check_type "$LINENO" "sighandler_t" "ac_cv_type_sighandler_t" "
+#include <signal.h>
+
+"
+if test "x$ac_cv_type_sighandler_t" = xyes
+then :
+
+else $as_nop
+  HAVE_SIGHANDLER_T=0
+fi
+
+
+
+
+
+
+
+
+ac_fn_check_decl "$LINENO" "snprintf" "ac_cv_have_decl_snprintf" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_snprintf" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_SNPRINTF $ac_have_decl" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_spawn_h='<'spawn.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <spawn.h>" >&5
+printf %s "checking absolute name of <spawn.h>... " >&6; }
+if test ${gl_cv_next_spawn_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_spawn_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <spawn.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'spawn.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_spawn_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_spawn_h
+           gl_cv_next_spawn_h='"'$gl_header'"'
+          else
+               gl_cv_next_spawn_h='<'spawn.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_spawn_h" >&5
+printf "%s\n" "$gl_cv_next_spawn_h" >&6; }
+     fi
+     NEXT_SPAWN_H=$gl_cv_next_spawn_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'spawn.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_spawn_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_SPAWN_H=$gl_next_as_first_directive
+
+
+
+
+
+  if test $ac_cv_header_spawn_h = yes; then
+    HAVE_SPAWN_H=1
+    ac_fn_c_check_type "$LINENO" "posix_spawnattr_t" "ac_cv_type_posix_spawnattr_t" "
+#include <spawn.h>
+
+"
+if test "x$ac_cv_type_posix_spawnattr_t" = xyes
+then :
+
+printf "%s\n" "#define HAVE_POSIX_SPAWNATTR_T 1" >>confdefs.h
+
+
+else $as_nop
+  HAVE_POSIX_SPAWNATTR_T=0
+fi
+
+    ac_fn_c_check_type "$LINENO" "posix_spawn_file_actions_t" "ac_cv_type_posix_spawn_file_actions_t" "
+#include <spawn.h>
+
+"
+if test "x$ac_cv_type_posix_spawn_file_actions_t" = xyes
+then :
+
+printf "%s\n" "#define HAVE_POSIX_SPAWN_FILE_ACTIONS_T 1" >>confdefs.h
+
+
+else $as_nop
+  HAVE_POSIX_SPAWN_FILE_ACTIONS_T=0
+fi
+
+  else
+    HAVE_SPAWN_H=0
+    HAVE_POSIX_SPAWNATTR_T=0
+    HAVE_POSIX_SPAWN_FILE_ACTIONS_T=0
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    HAVE_FCHMODAT=1;
+  HAVE_FSTATAT=1;
+  HAVE_FUTIMENS=1;
+  HAVE_GETUMASK=1;
+  HAVE_LCHMOD=1;
+  HAVE_LSTAT=1;
+  HAVE_MKDIRAT=1;
+  HAVE_MKFIFO=1;
+  HAVE_MKFIFOAT=1;
+  HAVE_MKNOD=1;
+  HAVE_MKNODAT=1;
+  HAVE_UTIMENSAT=1;
+  REPLACE_FCHMODAT=0;
+  REPLACE_FSTAT=0;
+  REPLACE_FSTATAT=0;
+  REPLACE_FUTIMENS=0;
+  REPLACE_LSTAT=0;
+  REPLACE_MKDIR=0;
+  REPLACE_MKFIFO=0;
+  REPLACE_MKFIFOAT=0;
+  REPLACE_MKNOD=0;
+  REPLACE_MKNODAT=0;
+  REPLACE_STAT=0;
+  REPLACE_UTIMENSAT=0;
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5
+printf %s "checking whether stat file-mode macros are broken... " >&6; }
+if test ${ac_cv_header_stat_broken+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if defined S_ISBLK && defined S_IFDIR
+extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1];
+#endif
+
+#if defined S_ISBLK && defined S_IFCHR
+extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1];
+#endif
+
+#if defined S_ISLNK && defined S_IFREG
+extern char c3[S_ISLNK (S_IFREG) ? -1 : 1];
+#endif
+
+#if defined S_ISSOCK && defined S_IFREG
+extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1];
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_header_stat_broken=no
+else $as_nop
+  ac_cv_header_stat_broken=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5
+printf "%s\n" "$ac_cv_header_stat_broken" >&6; }
+if test $ac_cv_header_stat_broken = yes; then
+
+printf "%s\n" "#define STAT_MACROS_BROKEN 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_sys_stat_h='<'sys/stat.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/stat.h>" >&5
+printf %s "checking absolute name of <sys/stat.h>... " >&6; }
+if test ${gl_cv_next_sys_stat_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_sys_stat_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/stat.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'sys/stat.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_sys_stat_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_sys_stat_h
+           gl_cv_next_sys_stat_h='"'$gl_header'"'
+          else
+               gl_cv_next_sys_stat_h='<'sys/stat.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_stat_h" >&5
+printf "%s\n" "$gl_cv_next_sys_stat_h" >&6; }
+     fi
+     NEXT_SYS_STAT_H=$gl_cv_next_sys_stat_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'sys/stat.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_sys_stat_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+    WINDOWS_STAT_TIMESPEC=0
+
+
+
+
+
+
+
+
+      ac_fn_c_check_type "$LINENO" "nlink_t" "ac_cv_type_nlink_t" "#include <sys/types.h>
+     #include <sys/stat.h>
+"
+if test "x$ac_cv_type_nlink_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define nlink_t int" >>confdefs.h
+
+fi
+
+
+
+
+
+
+
+
+
+
+  case "$host_os" in
+    mingw*)
+      ac_fn_c_check_header_compile "$LINENO" "sdkddkver.h" "ac_cv_header_sdkddkver_h" "$ac_includes_default"
+if test "x$ac_cv_header_sdkddkver_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_SDKDDKVER_H 1" >>confdefs.h
+
+fi
+
+      ;;
+  esac
+
+
+
+
+
+
+
+  GL_GNULIB_FCHMODAT=0
+
+
+
+  GL_GNULIB_FSTAT=0
+
+
+
+  GL_GNULIB_FSTATAT=0
+
+
+
+  GL_GNULIB_FUTIMENS=0
+
+
+
+  GL_GNULIB_GETUMASK=0
+
+
+
+  GL_GNULIB_LCHMOD=0
+
+
+
+  GL_GNULIB_LSTAT=0
+
+
+
+  GL_GNULIB_MKDIR=0
+
+
+
+  GL_GNULIB_MKDIRAT=0
+
+
+
+  GL_GNULIB_MKFIFO=0
+
+
+
+  GL_GNULIB_MKFIFOAT=0
+
+
+
+  GL_GNULIB_MKNOD=0
+
+
+
+  GL_GNULIB_MKNODAT=0
+
+
+
+  GL_GNULIB_STAT=0
+
+
+
+  GL_GNULIB_UTIMENSAT=0
+
+
+
+  GL_GNULIB_OVERRIDES_STRUCT_STAT=0
+
+
+
+  GL_GNULIB_MDA_CHMOD=1
+
+
+
+  GL_GNULIB_MDA_MKDIR=1
+
+
+
+  GL_GNULIB_MDA_UMASK=1
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5
+printf %s "checking for stdbool.h that conforms to C99... " >&6; }
+if test ${ac_cv_header_stdbool_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+             #include <stdbool.h>
+
+             #ifdef __cplusplus
+              typedef bool Bool;
+             #else
+              typedef _Bool Bool;
+              #ifndef bool
+               "error: bool is not defined"
+              #endif
+              #ifndef false
+               "error: false is not defined"
+              #endif
+              #if false
+               "error: false is not 0"
+              #endif
+              #ifndef true
+               "error: true is not defined"
+              #endif
+              #if true != 1
+               "error: true is not 1"
+              #endif
+             #endif
+
+             #ifndef __bool_true_false_are_defined
+              "error: __bool_true_false_are_defined is not defined"
+             #endif
+
+             struct s { Bool s: 1; Bool t; bool u: 1; bool v; } s;
+
+             char a[true == 1 ? 1 : -1];
+             char b[false == 0 ? 1 : -1];
+             char c[__bool_true_false_are_defined == 1 ? 1 : -1];
+             char d[(bool) 0.5 == true ? 1 : -1];
+             /* See body of main program for 'e'.  */
+             char f[(Bool) 0.0 == false ? 1 : -1];
+             char g[true];
+             char h[sizeof (Bool)];
+             char i[sizeof s.t];
+             enum { j = false, k = true, l = false * true, m = true * 256 };
+             /* The following fails for
+                HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
+             Bool n[m];
+             char o[sizeof n == m * sizeof n[0] ? 1 : -1];
+             char p[-1 - (Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
+             /* Catch a bug in an HP-UX C compiler.  See
+                https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+                https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html
+              */
+             Bool q = true;
+             Bool *pq = &q;
+             bool *qq = &q;
+
+int
+main (void)
+{
+
+             bool e = &s;
+             *pq |= q; *pq |= ! q;
+             *qq |= q; *qq |= ! q;
+             /* Refer to every declared value, to avoid compiler optimizations.  */
+             return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
+                     + !m + !n + !o + !p + !q + !pq + !qq);
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_header_stdbool_h=yes
+else $as_nop
+  ac_cv_header_stdbool_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5
+printf "%s\n" "$ac_cv_header_stdbool_h" >&6; }
+   ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
+if test "x$ac_cv_type__Bool" = xyes
+then :
+
+printf "%s\n" "#define HAVE__BOOL 1" >>confdefs.h
+
+
+fi
+
+
+
+    REPLACE_NULL=0;
+  HAVE_MAX_ALIGN_T=1;
+  HAVE_WCHAR_T=1;
+
+
+
+
+
+
+
+  STDDEF_H=
+
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for good max_align_t" >&5
+printf %s "checking for good max_align_t... " >&6; }
+if test ${gl_cv_type_max_align_t+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stddef.h>
+            unsigned int s = sizeof (max_align_t);
+            #if defined __GNUC__ || defined __clang__ || defined __IBM__ALIGNOF__
+            int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1];
+            int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1];
+            #endif
+            typedef struct { char a; max_align_t b; } max_helper;
+            typedef struct { char a; long b; } long_helper;
+            typedef struct { char a; double b; } double_helper;
+            typedef struct { char a; long double b; } long_double_helper;
+            int check3[2 * (offsetof (long_helper, b) <= offsetof (max_helper, b)) - 1];
+            int check4[2 * (offsetof (double_helper, b) <= offsetof (max_helper, b)) - 1];
+            int check5[2 * (offsetof (long_double_helper, b) <= offsetof (max_helper, b)) - 1];
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_type_max_align_t=yes
+else $as_nop
+  gl_cv_type_max_align_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_max_align_t" >&5
+printf "%s\n" "$gl_cv_type_max_align_t" >&6; }
+  if test $gl_cv_type_max_align_t = no; then
+    HAVE_MAX_ALIGN_T=0
+    STDDEF_H=stddef.h
+  fi
+
+  if test $gt_cv_c_wchar_t = no; then
+    HAVE_WCHAR_T=0
+    STDDEF_H=stddef.h
+  fi
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether NULL can be used in arbitrary expressions" >&5
+printf %s "checking whether NULL can be used in arbitrary expressions... " >&6; }
+if test ${gl_cv_decl_null_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stddef.h>
+      int test[2 * (sizeof NULL == sizeof (void *)) -1];
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_decl_null_works=yes
+else $as_nop
+  gl_cv_decl_null_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_null_works" >&5
+printf "%s\n" "$gl_cv_decl_null_works" >&6; }
+  if test $gl_cv_decl_null_works = no; then
+    REPLACE_NULL=1
+    STDDEF_H=stddef.h
+  fi
+
+
+   if test -n "$STDDEF_H"; then
+  GL_GENERATE_STDDEF_H_TRUE=
+  GL_GENERATE_STDDEF_H_FALSE='#'
+else
+  GL_GENERATE_STDDEF_H_TRUE='#'
+  GL_GENERATE_STDDEF_H_FALSE=
+fi
+
+  if test -n "$STDDEF_H"; then
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_stddef_h='<'stddef.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <stddef.h>" >&5
+printf %s "checking absolute name of <stddef.h>... " >&6; }
+if test ${gl_cv_next_stddef_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stddef.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'stddef.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_stddef_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_stddef_h
+           gl_cv_next_stddef_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stddef_h" >&5
+printf "%s\n" "$gl_cv_next_stddef_h" >&6; }
+     fi
+     NEXT_STDDEF_H=$gl_cv_next_stddef_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'stddef.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_stddef_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_STDDEF_H=$gl_next_as_first_directive
+
+
+
+
+  fi
+
+
+
+ac_fn_check_decl "$LINENO" "fcloseall" "ac_cv_have_decl_fcloseall" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_fcloseall" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_FCLOSEALL $ac_have_decl" >>confdefs.h
+
+
+
+
+  printf "%s\n" "#define __USE_MINGW_ANSI_STDIO 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_stdio_h='<'stdio.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdio.h>" >&5
+printf %s "checking absolute name of <stdio.h>... " >&6; }
+if test ${gl_cv_next_stdio_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'stdio.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_stdio_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_stdio_h
+           gl_cv_next_stdio_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdio_h" >&5
+printf "%s\n" "$gl_cv_next_stdio_h" >&6; }
+     fi
+     NEXT_STDIO_H=$gl_cv_next_stdio_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'stdio.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_stdio_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_STDIO_H=$gl_next_as_first_directive
+
+
+
+
+
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which flavor of printf attribute matches inttypes macros" >&5
+printf %s "checking which flavor of printf attribute matches inttypes macros... " >&6; }
+if test ${gl_cv_func_printf_attribute_flavor+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+       #define __STDC_FORMAT_MACROS 1
+       #include <stdio.h>
+       #include <inttypes.h>
+       /* For non-mingw systems, compilation will trivially succeed.
+          For mingw, compilation will succeed for older mingw (system
+          printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */
+       #if (defined _WIN32 && ! defined __CYGWIN__) && \
+         (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+       extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1];
+       #endif
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_func_printf_attribute_flavor=system
+else $as_nop
+  gl_cv_func_printf_attribute_flavor=gnu
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_attribute_flavor" >&5
+printf "%s\n" "$gl_cv_func_printf_attribute_flavor" >&6; }
+  if test "$gl_cv_func_printf_attribute_flavor" = gnu; then
+
+printf "%s\n" "#define GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+  if test $ac_cv_have_decl_fcloseall = no; then
+    HAVE_DECL_FCLOSEALL=0
+  fi
+
+ac_fn_check_decl "$LINENO" "ecvt" "ac_cv_have_decl_ecvt" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_ecvt" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_ECVT $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "fcvt" "ac_cv_have_decl_fcvt" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_fcvt" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_FCVT $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "gcvt" "ac_cv_have_decl_gcvt" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_gcvt" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_GCVT $ac_have_decl" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_stdlib_h='<'stdlib.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdlib.h>" >&5
+printf %s "checking absolute name of <stdlib.h>... " >&6; }
+if test ${gl_cv_next_stdlib_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'stdlib.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_stdlib_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_stdlib_h
+           gl_cv_next_stdlib_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdlib_h" >&5
+printf "%s\n" "$gl_cv_next_stdlib_h" >&6; }
+     fi
+     NEXT_STDLIB_H=$gl_cv_next_stdlib_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'stdlib.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_stdlib_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_STDLIB_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+  if test $ac_cv_have_decl_ecvt = no; then
+    HAVE_DECL_ECVT=0
+  fi
+
+  if test $ac_cv_have_decl_fcvt = no; then
+    HAVE_DECL_FCVT=0
+  fi
+
+  if test $ac_cv_have_decl_gcvt = no; then
+    HAVE_DECL_GCVT=0
+  fi
+
+ac_fn_check_decl "$LINENO" "stpncpy" "ac_cv_have_decl_stpncpy" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_stpncpy" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_STPNCPY $ac_have_decl" >>confdefs.h
+
+
+ac_fn_check_decl "$LINENO" "strdup" "ac_cv_have_decl_strdup" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_strdup" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_STRDUP $ac_have_decl" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_string_h='<'string.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <string.h>" >&5
+printf %s "checking absolute name of <string.h>... " >&6; }
+if test ${gl_cv_next_string_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'string.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_string_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_string_h
+           gl_cv_next_string_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_string_h" >&5
+printf "%s\n" "$gl_cv_next_string_h" >&6; }
+     fi
+     NEXT_STRING_H=$gl_cv_next_string_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'string.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_string_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_STRING_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+ac_fn_check_decl "$LINENO" "strndup" "ac_cv_have_decl_strndup" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_strndup" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_STRNDUP $ac_have_decl" >>confdefs.h
+
+
+
+
+
+
+
+  if test $ac_cv_header_sys_ioctl_h = yes; then
+    HAVE_SYS_IOCTL_H=1
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether <sys/ioctl.h> declares ioctl" >&5
+printf %s "checking whether <sys/ioctl.h> declares ioctl... " >&6; }
+if test ${gl_cv_decl_ioctl_in_sys_ioctl_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/ioctl.h>
+int
+main (void)
+{
+(void) ioctl;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_decl_ioctl_in_sys_ioctl_h=yes
+else $as_nop
+  gl_cv_decl_ioctl_in_sys_ioctl_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_ioctl_in_sys_ioctl_h" >&5
+printf "%s\n" "$gl_cv_decl_ioctl_in_sys_ioctl_h" >&6; }
+  else
+    HAVE_SYS_IOCTL_H=0
+  fi
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_sys_ioctl_h='<'sys/ioctl.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/ioctl.h>" >&5
+printf %s "checking absolute name of <sys/ioctl.h>... " >&6; }
+if test ${gl_cv_next_sys_ioctl_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_sys_ioctl_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/ioctl.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'sys/ioctl.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_sys_ioctl_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_sys_ioctl_h
+           gl_cv_next_sys_ioctl_h='"'$gl_header'"'
+          else
+               gl_cv_next_sys_ioctl_h='<'sys/ioctl.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_ioctl_h" >&5
+printf "%s\n" "$gl_cv_next_sys_ioctl_h" >&6; }
+     fi
+     NEXT_SYS_IOCTL_H=$gl_cv_next_sys_ioctl_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'sys/ioctl.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_sys_ioctl_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+  GL_GNULIB_IOCTL=0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_sys_resource_h='<'sys/resource.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/resource.h>" >&5
+printf %s "checking absolute name of <sys/resource.h>... " >&6; }
+if test ${gl_cv_next_sys_resource_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_sys_resource_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/resource.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'sys/resource.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_sys_resource_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_sys_resource_h
+           gl_cv_next_sys_resource_h='"'$gl_header'"'
+          else
+               gl_cv_next_sys_resource_h='<'sys/resource.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_resource_h" >&5
+printf "%s\n" "$gl_cv_next_sys_resource_h" >&6; }
+     fi
+     NEXT_SYS_RESOURCE_H=$gl_cv_next_sys_resource_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'sys/resource.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_sys_resource_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_SYS_RESOURCE_H=$gl_next_as_first_directive
+
+
+
+
+  if test $ac_cv_header_sys_resource_h = yes; then
+    HAVE_SYS_RESOURCE_H=1
+  else
+    HAVE_SYS_RESOURCE_H=0
+  fi
+
+
+
+
+
+
+
+  HAVE_STRUCT_TMS=1;
+  HAVE_TIMES=1;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_sys_times_h='<'sys/times.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/times.h>" >&5
+printf %s "checking absolute name of <sys/times.h>... " >&6; }
+if test ${gl_cv_next_sys_times_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_sys_times_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/times.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'sys/times.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_sys_times_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_sys_times_h
+           gl_cv_next_sys_times_h='"'$gl_header'"'
+          else
+               gl_cv_next_sys_times_h='<'sys/times.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_times_h" >&5
+printf "%s\n" "$gl_cv_next_sys_times_h" >&6; }
+     fi
+     NEXT_SYS_TIMES_H=$gl_cv_next_sys_times_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'sys/times.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_sys_times_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_SYS_TIMES_H=$gl_next_as_first_directive
+
+
+
+
+  if test $ac_cv_header_sys_times_h = yes; then
+    HAVE_SYS_TIMES_H=1
+    ac_fn_c_check_type "$LINENO" "struct tms" "ac_cv_type_struct_tms" "
+#include <sys/times.h>
+
+"
+if test "x$ac_cv_type_struct_tms" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_TMS 1" >>confdefs.h
+
+
+else $as_nop
+  HAVE_STRUCT_TMS=0
+fi
+
+  else
+    HAVE_SYS_TIMES_H=0
+    HAVE_STRUCT_TMS=0
+  fi
+
+
+
+
+
+
+
+
+  GL_GNULIB_TIMES=0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+printf "%s\n" "#define _USE_STD_STAT 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_sys_types_h='<'sys/types.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/types.h>" >&5
+printf %s "checking absolute name of <sys/types.h>... " >&6; }
+if test ${gl_cv_next_sys_types_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'sys/types.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_sys_types_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_sys_types_h
+           gl_cv_next_sys_types_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_types_h" >&5
+printf "%s\n" "$gl_cv_next_sys_types_h" >&6; }
+     fi
+     NEXT_SYS_TYPES_H=$gl_cv_next_sys_types_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'sys/types.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_sys_types_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+    WINDOWS_STAT_INODES=0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_sys_wait_h='<'sys/wait.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/wait.h>" >&5
+printf %s "checking absolute name of <sys/wait.h>... " >&6; }
+if test ${gl_cv_next_sys_wait_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_sys_wait_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/wait.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'sys/wait.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_sys_wait_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_sys_wait_h
+           gl_cv_next_sys_wait_h='"'$gl_header'"'
+          else
+               gl_cv_next_sys_wait_h='<'sys/wait.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_wait_h" >&5
+printf "%s\n" "$gl_cv_next_sys_wait_h" >&6; }
+     fi
+     NEXT_SYS_WAIT_H=$gl_cv_next_sys_wait_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'sys/wait.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_sys_wait_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+
+  GL_GNULIB_WAITPID=0
+
+
+
+
+    HAVE_DECL_TCGETSID=1;
+  HAVE_TERMIOS_H=1;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_termios_h='<'termios.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <termios.h>" >&5
+printf %s "checking absolute name of <termios.h>... " >&6; }
+if test ${gl_cv_next_termios_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_termios_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <termios.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'termios.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_termios_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_termios_h
+           gl_cv_next_termios_h='"'$gl_header'"'
+          else
+               gl_cv_next_termios_h='<'termios.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_termios_h" >&5
+printf "%s\n" "$gl_cv_next_termios_h" >&6; }
+     fi
+     NEXT_TERMIOS_H=$gl_cv_next_termios_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'termios.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_termios_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_TERMIOS_H=$gl_next_as_first_directive
+
+
+
+
+  if test $ac_cv_header_termios_h != yes; then
+    HAVE_TERMIOS_H=0
+  fi
+
+
+
+
+
+
+
+
+
+  GL_GNULIB_TCGETSID=0
+
+
+
+
+    HAVE_DECL_LOCALTIME_R=1;
+  HAVE_NANOSLEEP=1;
+  HAVE_STRPTIME=1;
+  HAVE_TIMEGM=1;
+  HAVE_TIMESPEC_GET=1;
+    HAVE_TIMEZONE_T=0;
+        REPLACE_CTIME=GNULIB_PORTCHECK;
+  REPLACE_LOCALTIME_R=GNULIB_PORTCHECK;
+  REPLACE_MKTIME=GNULIB_PORTCHECK;
+  REPLACE_NANOSLEEP=GNULIB_PORTCHECK;
+  REPLACE_STRFTIME=GNULIB_PORTCHECK;
+  REPLACE_TIMEGM=GNULIB_PORTCHECK;
+  REPLACE_TZSET=GNULIB_PORTCHECK;
+
+      : ${GNULIB_GETTIMEOFDAY=0};
+        REPLACE_GMTIME=0;
+  REPLACE_LOCALTIME=0;
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timespec in <time.h>" >&5
+printf %s "checking for struct timespec in <time.h>... " >&6; }
+if test ${gl_cv_sys_struct_timespec_in_time_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <time.h>
+
+int
+main (void)
+{
+static struct timespec x; x.tv_sec = x.tv_nsec;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_sys_struct_timespec_in_time_h=yes
+else $as_nop
+  gl_cv_sys_struct_timespec_in_time_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_time_h" >&5
+printf "%s\n" "$gl_cv_sys_struct_timespec_in_time_h" >&6; }
+
+  TIME_H_DEFINES_STRUCT_TIMESPEC=0
+  SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=0
+  PTHREAD_H_DEFINES_STRUCT_TIMESPEC=0
+  UNISTD_H_DEFINES_STRUCT_TIMESPEC=0
+  if test $gl_cv_sys_struct_timespec_in_time_h = yes; then
+    TIME_H_DEFINES_STRUCT_TIMESPEC=1
+  else
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timespec in <sys/time.h>" >&5
+printf %s "checking for struct timespec in <sys/time.h>... " >&6; }
+if test ${gl_cv_sys_struct_timespec_in_sys_time_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/time.h>
+
+int
+main (void)
+{
+static struct timespec x; x.tv_sec = x.tv_nsec;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_sys_struct_timespec_in_sys_time_h=yes
+else $as_nop
+  gl_cv_sys_struct_timespec_in_sys_time_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_sys_time_h" >&5
+printf "%s\n" "$gl_cv_sys_struct_timespec_in_sys_time_h" >&6; }
+    if test $gl_cv_sys_struct_timespec_in_sys_time_h = yes; then
+      SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1
+    else
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timespec in <pthread.h>" >&5
+printf %s "checking for struct timespec in <pthread.h>... " >&6; }
+if test ${gl_cv_sys_struct_timespec_in_pthread_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+
+int
+main (void)
+{
+static struct timespec x; x.tv_sec = x.tv_nsec;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_sys_struct_timespec_in_pthread_h=yes
+else $as_nop
+  gl_cv_sys_struct_timespec_in_pthread_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_pthread_h" >&5
+printf "%s\n" "$gl_cv_sys_struct_timespec_in_pthread_h" >&6; }
+      if test $gl_cv_sys_struct_timespec_in_pthread_h = yes; then
+        PTHREAD_H_DEFINES_STRUCT_TIMESPEC=1
+      else
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timespec in <unistd.h>" >&5
+printf %s "checking for struct timespec in <unistd.h>... " >&6; }
+if test ${gl_cv_sys_struct_timespec_in_unistd_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <unistd.h>
+
+int
+main (void)
+{
+static struct timespec x; x.tv_sec = x.tv_nsec;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_sys_struct_timespec_in_unistd_h=yes
+else $as_nop
+  gl_cv_sys_struct_timespec_in_unistd_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_unistd_h" >&5
+printf "%s\n" "$gl_cv_sys_struct_timespec_in_unistd_h" >&6; }
+        if test $gl_cv_sys_struct_timespec_in_unistd_h = yes; then
+          UNISTD_H_DEFINES_STRUCT_TIMESPEC=1
+        fi
+      fi
+    fi
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_time_h='<'time.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <time.h>" >&5
+printf %s "checking absolute name of <time.h>... " >&6; }
+if test ${gl_cv_next_time_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <time.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'time.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_time_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_time_h
+           gl_cv_next_time_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_time_h" >&5
+printf "%s\n" "$gl_cv_next_time_h" >&6; }
+     fi
+     NEXT_TIME_H=$gl_cv_next_time_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'time.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_time_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_TIME_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for TIME_UTC in <time.h>" >&5
+printf %s "checking for TIME_UTC in <time.h>... " >&6; }
+if test ${gl_cv_time_h_has_TIME_UTC+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <time.h>
+
+int
+main (void)
+{
+static int x = TIME_UTC; x++;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_time_h_has_TIME_UTC=yes
+else $as_nop
+  gl_cv_time_h_has_TIME_UTC=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_time_h_has_TIME_UTC" >&5
+printf "%s\n" "$gl_cv_time_h_has_TIME_UTC" >&6; }
+  if test $gl_cv_time_h_has_TIME_UTC = yes; then
+    TIME_H_DEFINES_TIME_UTC=1
+  else
+    TIME_H_DEFINES_TIME_UTC=0
+  fi
+
+
+
+
+  GL_GNULIB_CTIME=0
+
+
+
+  GL_GNULIB_MKTIME=0
+
+
+
+  GL_GNULIB_LOCALTIME=0
+
+
+
+  GL_GNULIB_NANOSLEEP=0
+
+
+
+  GL_GNULIB_STRFTIME=0
+
+
+
+  GL_GNULIB_STRPTIME=0
+
+
+
+  GL_GNULIB_TIMEGM=0
+
+
+
+  GL_GNULIB_TIMESPEC_GET=0
+
+
+
+  GL_GNULIB_TIME_R=0
+
+
+
+  GL_GNULIB_TIME_RZ=0
+
+
+
+  GL_GNULIB_TZSET=0
+
+
+
+  GL_GNULIB_MDA_TZSET=1
+
+
+
+
+
+  case "$host_os" in
+    *-musl*)
+printf "%s\n" "#define MUSL_LIBC 1" >>confdefs.h
+ ;;
+  esac
+
+ac_fn_check_decl "$LINENO" "execvpe" "ac_cv_have_decl_execvpe" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_execvpe" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_EXECVPE $ac_have_decl" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_unistd_h='<'unistd.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <unistd.h>" >&5
+printf %s "checking absolute name of <unistd.h>... " >&6; }
+if test ${gl_cv_next_unistd_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_unistd_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <unistd.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'unistd.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_unistd_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_unistd_h
+           gl_cv_next_unistd_h='"'$gl_header'"'
+          else
+               gl_cv_next_unistd_h='<'unistd.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_unistd_h" >&5
+printf "%s\n" "$gl_cv_next_unistd_h" >&6; }
+     fi
+     NEXT_UNISTD_H=$gl_cv_next_unistd_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'unistd.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_unistd_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_UNISTD_H=$gl_next_as_first_directive
+
+
+
+
+  if test $ac_cv_header_unistd_h = yes; then
+    HAVE_UNISTD_H=1
+  else
+    HAVE_UNISTD_H=0
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+  if test $ac_cv_have_decl_execvpe = no; then
+    HAVE_DECL_EXECVPE=0
+  fi
+
+
+
+
+
+
+
+gl_libunistring_sed_extract_major='/^[0-9]/{s/^\([0-9]*\).*/\1/p;q;}
+i\
+0
+q
+'
+gl_libunistring_sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{s/^[0-9]*[.]\([0-9]*\).*/\1/p;q;}
+i\
+0
+q
+'
+gl_libunistring_sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p;q;}
+i\
+0
+q
+'
+
+
+  if test "$HAVE_LIBUNISTRING" = yes; then
+    LIBUNISTRING_VERSION_MAJOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_major"`
+    LIBUNISTRING_VERSION_MINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_minor"`
+    LIBUNISTRING_VERSION_SUBMINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_subminor"`
+  fi
+
+ac_fn_check_decl "$LINENO" "clearerr_unlocked" "ac_cv_have_decl_clearerr_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_clearerr_unlocked" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_CLEARERR_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "feof_unlocked" "ac_cv_have_decl_feof_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_feof_unlocked" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_FEOF_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "ferror_unlocked" "ac_cv_have_decl_ferror_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_ferror_unlocked" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_FERROR_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "fflush_unlocked" "ac_cv_have_decl_fflush_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_fflush_unlocked" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_FFLUSH_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "fgets_unlocked" "ac_cv_have_decl_fgets_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_fgets_unlocked" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_FGETS_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "fputc_unlocked" "ac_cv_have_decl_fputc_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_fputc_unlocked" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_FPUTC_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "fputs_unlocked" "ac_cv_have_decl_fputs_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_fputs_unlocked" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_FPUTS_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "fread_unlocked" "ac_cv_have_decl_fread_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_fread_unlocked" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_FREAD_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "fwrite_unlocked" "ac_cv_have_decl_fwrite_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_fwrite_unlocked" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_FWRITE_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_getc_unlocked" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_GETC_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "getchar_unlocked" "ac_cv_have_decl_getchar_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_getchar_unlocked" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_GETCHAR_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "putc_unlocked" "ac_cv_have_decl_putc_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_putc_unlocked" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_PUTC_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "putchar_unlocked" "ac_cv_have_decl_putchar_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_putchar_unlocked" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_PUTCHAR_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "unsetenv" "ac_cv_have_decl_unsetenv" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_unsetenv" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_UNSETENV $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "vsnprintf" "ac_cv_have_decl_vsnprintf" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_vsnprintf" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_VSNPRINTF $ac_have_decl" >>confdefs.h
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether <wchar.h> uses 'inline' correctly" >&5
+printf %s "checking whether <wchar.h> uses 'inline' correctly... " >&6; }
+if test ${gl_cv_header_wchar_h_correct_inline+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  gl_cv_header_wchar_h_correct_inline=yes
+     case "$host_os" in
+       *-gnu* | gnu*)
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+             #define wcstod renamed_wcstod
+             #include <wchar.h>
+             extern int zero (void);
+             int main () { return zero(); }
+
+_ACEOF
+                                                      save_ac_compile="$ac_compile"
+         ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/`
+         if echo '#include "conftest.c"' >conftest1.c \
+            && { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+               #define wcstod renamed_wcstod
+               #include <wchar.h>
+               int zero (void) { return 0; }
+
+_ACEOF
+                      ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/`
+           if echo '#include "conftest.c"' >conftest2.c \
+              && { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+             if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&5 2>&1; then
+               :
+             else
+               gl_cv_header_wchar_h_correct_inline=no
+             fi
+           fi
+         fi
+         ac_compile="$save_ac_compile"
+         rm -f conftest12.c conftest12.$ac_objext conftest$ac_exeext
+         ;;
+     esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_wchar_h_correct_inline" >&5
+printf "%s\n" "$gl_cv_header_wchar_h_correct_inline" >&6; }
+  if test $gl_cv_header_wchar_h_correct_inline = no; then
+    as_fn_error $? "<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
+This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
+C99 mode. You have four options:
+  - Add the flag -fgnu89-inline to CC and reconfigure, or
+  - Fix your include files, using parts of
+    <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
+  - Use a gcc version older than 4.3, or
+  - Don't use the flags -std=c99 or -std=gnu99.
+Configuration aborted." "$LINENO" 5
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_wchar_h='<'wchar.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <wchar.h>" >&5
+printf %s "checking absolute name of <wchar.h>... " >&6; }
+if test ${gl_cv_next_wchar_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_wchar_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <wchar.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'wchar.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_wchar_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_wchar_h
+           gl_cv_next_wchar_h='"'$gl_header'"'
+          else
+               gl_cv_next_wchar_h='<'wchar.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wchar_h" >&5
+printf "%s\n" "$gl_cv_next_wchar_h" >&6; }
+     fi
+     NEXT_WCHAR_H=$gl_cv_next_wchar_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'wchar.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_wchar_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_WCHAR_H=$gl_next_as_first_directive
+
+
+
+
+  if test $ac_cv_header_wchar_h = yes; then
+    HAVE_WCHAR_H=1
+  else
+    HAVE_WCHAR_H=0
+  fi
+
+
+
+
+
+  if test $gt_cv_c_wint_t = yes; then
+    HAVE_WINT_T=1
+  else
+    HAVE_WINT_T=0
+  fi
+
+
+
+
+
+
+
+
+
+
+  ac_fn_check_decl "$LINENO" "wcsdup" "ac_cv_have_decl_wcsdup" "
+      #include <wchar.h>
+
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_wcsdup" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_WCSDUP $ac_have_decl" >>confdefs.h
+
+  if test $ac_cv_have_decl_wcsdup = no; then
+    HAVE_DECL_WCSDUP=0
+  fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking POSIX termios" >&5
+printf %s "checking POSIX termios... " >&6; }
+if test ${ac_cv_sys_posix_termios+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <unistd.h>
+#include <termios.h>
+
+int
+main (void)
+{
+/* SunOS 4.0.3 has termios.h but not the library calls.  */
+   tcgetattr(0, 0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_sys_posix_termios=yes
+else $as_nop
+  ac_cv_sys_posix_termios=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_posix_termios" >&5
+printf "%s\n" "$ac_cv_sys_posix_termios" >&6; }
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether use of TIOCGWINSZ requires termios.h" >&5
+printf %s "checking whether use of TIOCGWINSZ requires termios.h... " >&6; }
+if test ${gl_cv_sys_tiocgwinsz_needs_termios_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  gl_cv_sys_tiocgwinsz_needs_termios_h=no
+
+   if test $ac_cv_sys_posix_termios = yes; then
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#      include <termios.h>
+#      ifdef TIOCGWINSZ
+         yes
+#      endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1
+then :
+  gl_cv_sys_tiocgwinsz_needs_termios_h=yes
+fi
+rm -rf conftest*
+
+   fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_tiocgwinsz_needs_termios_h" >&5
+printf "%s\n" "$gl_cv_sys_tiocgwinsz_needs_termios_h" >&6; }
+
+
+    HAVE_OPENDIR=1;
+  HAVE_READDIR=1;
+  HAVE_REWINDDIR=1;
+  HAVE_CLOSEDIR=1;
+  HAVE_DECL_DIRFD=1;
+  HAVE_DECL_FDOPENDIR=1;
+  HAVE_FDOPENDIR=1;
+  HAVE_SCANDIR=1;
+  HAVE_ALPHASORT=1;
+  REPLACE_OPENDIR=0;
+  REPLACE_CLOSEDIR=0;
+  REPLACE_DIRFD=0;
+  REPLACE_FDOPENDIR=0;
+
+
+
+
+
+
+
+  GL_GNULIB_OPENDIR=0
+
+
+
+  GL_GNULIB_READDIR=0
+
+
+
+  GL_GNULIB_REWINDDIR=0
+
+
+
+  GL_GNULIB_CLOSEDIR=0
+
+
+
+  GL_GNULIB_DIRFD=0
+
+
+
+  GL_GNULIB_FDOPENDIR=0
+
+
+
+  GL_GNULIB_SCANDIR=0
+
+
+
+  GL_GNULIB_ALPHASORT=0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_dirent_h='<'dirent.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <dirent.h>" >&5
+printf %s "checking absolute name of <dirent.h>... " >&6; }
+if test ${gl_cv_next_dirent_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_dirent_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <dirent.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'dirent.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_dirent_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_dirent_h
+           gl_cv_next_dirent_h='"'$gl_header'"'
+          else
+               gl_cv_next_dirent_h='<'dirent.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_dirent_h" >&5
+printf "%s\n" "$gl_cv_next_dirent_h" >&6; }
+     fi
+     NEXT_DIRENT_H=$gl_cv_next_dirent_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'dirent.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_dirent_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_DIRENT_H=$gl_next_as_first_directive
+
+
+
+
+  if test $ac_cv_header_dirent_h = yes; then
+    HAVE_DIRENT_H=1
+  else
+    HAVE_DIRENT_H=0
+  fi
+
+
+
+
+
+
+ac_fn_check_decl "$LINENO" "fchdir" "ac_cv_have_decl_fchdir" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_fchdir" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_FCHDIR $ac_have_decl" >>confdefs.h
+
+
+
+    HAVE_FFS=1;
+  HAVE_STRCASECMP=1;
+  HAVE_DECL_STRNCASECMP=1;
+
+
+
+  GL_GNULIB_FFS=0
+
+
+
+
+
+
+ac_fn_check_decl "$LINENO" "getdelim" "ac_cv_have_decl_getdelim" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_getdelim" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_GETDELIM $ac_have_decl" >>confdefs.h
+
+
+
+ac_fn_check_decl "$LINENO" "getdtablesize" "ac_cv_have_decl_getdtablesize" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_getdtablesize" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_GETDTABLESIZE $ac_have_decl" >>confdefs.h
+
+ac_fn_check_decl "$LINENO" "getline" "ac_cv_have_decl_getline" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_getline" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_GETLINE $ac_have_decl" >>confdefs.h
+
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether setlocale (LC_ALL, NULL) is multithread-safe" >&5
+printf %s "checking whether setlocale (LC_ALL, NULL) is multithread-safe... " >&6; }
+if test ${gl_cv_func_setlocale_null_all_mtsafe+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case "$host_os" in
+       # Guess no on musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin.
+       *-musl* | darwin* | freebsd* | midnightbsd* | netbsd* | openbsd* | aix* | haiku* | cygwin*)
+         gl_cv_func_setlocale_null_all_mtsafe=no ;;
+       # Guess yes on glibc, HP-UX, IRIX, Solaris, native Windows.
+       *-gnu* | gnu* | hpux* | irix* | solaris* | mingw*)
+         gl_cv_func_setlocale_null_all_mtsafe=yes ;;
+       # If we don't know, obey --enable-cross-guesses.
+       *)
+         gl_cv_func_setlocale_null_all_mtsafe="$gl_cross_guess_normal" ;;
+     esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_all_mtsafe" >&5
+printf "%s\n" "$gl_cv_func_setlocale_null_all_mtsafe" >&6; }
+    case "$host_os" in
+    mingw*) ;;
+    *)
+      if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then
+        gl_cv_func_setlocale_null_all_mtsafe="trivially yes"
+      fi
+      ;;
+  esac
+  case "$gl_cv_func_setlocale_null_all_mtsafe" in
+    *yes) SETLOCALE_NULL_ALL_MTSAFE=1 ;;
+    *)    SETLOCALE_NULL_ALL_MTSAFE=0 ;;
+  esac
+
+printf "%s\n" "#define SETLOCALE_NULL_ALL_MTSAFE $SETLOCALE_NULL_ALL_MTSAFE" >>confdefs.h
+
+
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether setlocale (category, NULL) is multithread-safe" >&5
+printf %s "checking whether setlocale (category, NULL) is multithread-safe... " >&6; }
+if test ${gl_cv_func_setlocale_null_one_mtsafe+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case "$host_os" in
+       # Guess no on OpenBSD, AIX.
+       openbsd* | aix*)
+         gl_cv_func_setlocale_null_one_mtsafe=no ;;
+       # Guess yes on glibc, musl libc, macOS, FreeBSD, NetBSD, HP-UX, IRIX, Solaris, Haiku, Cygwin, native Windows.
+       *-gnu* | gnu* | *-musl* | darwin* | freebsd* | midnightbsd* | netbsd* | hpux* | irix* | solaris* | haiku* | cygwin* | mingw*)
+         gl_cv_func_setlocale_null_one_mtsafe=yes ;;
+       # If we don't know, obey --enable-cross-guesses.
+       *)
+         gl_cv_func_setlocale_null_one_mtsafe="$gl_cross_guess_normal" ;;
+     esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_one_mtsafe" >&5
+printf "%s\n" "$gl_cv_func_setlocale_null_one_mtsafe" >&6; }
+    case "$host_os" in
+    mingw*) ;;
+    *)
+      if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then
+        gl_cv_func_setlocale_null_one_mtsafe="trivially yes"
+      fi
+      ;;
+  esac
+  case "$gl_cv_func_setlocale_null_one_mtsafe" in
+    *yes) SETLOCALE_NULL_ONE_MTSAFE=1 ;;
+    *)    SETLOCALE_NULL_ONE_MTSAFE=0 ;;
+  esac
+
+printf "%s\n" "#define SETLOCALE_NULL_ONE_MTSAFE $SETLOCALE_NULL_ONE_MTSAFE" >>confdefs.h
+
+
+    if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then
+    case "$host_os" in
+      mingw*) LIB_SETLOCALE_NULL= ;;
+      *)
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5
+printf %s "checking whether imported symbols can be declared weak... " >&6; }
+if test ${gl_cv_have_weak+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case "$host_os" in
+       cygwin*)
+                                    gl_cv_have_weak="guessing no"
+         ;;
+       *)
+         gl_cv_have_weak=no
+                  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+extern void xyzzy ();
+#pragma weak xyzzy
+int
+main (void)
+{
+xyzzy();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_have_weak=maybe
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+         if test $gl_cv_have_weak = maybe; then
+                                 if test "$cross_compiling" = yes
+then :
+                              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __ELF__
+                 Extensible Linking Format
+                 #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Extensible Linking Format" >/dev/null 2>&1
+then :
+  gl_cv_have_weak="guessing yes"
+else $as_nop
+  gl_cv_have_weak="guessing no"
+fi
+rm -rf conftest*
+
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#pragma weak fputs
+int main ()
+{
+  return (fputs == NULL);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_have_weak=yes
+else $as_nop
+  gl_cv_have_weak=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+         fi
+         ;;
+     esac
+          case " $LDFLAGS " in
+       *" -static "*) gl_cv_have_weak=no ;;
+     esac
+                    case "$gl_cv_have_weak" in
+       *yes)
+         case "$host_os" in
+           freebsd* | dragonfly* | midnightbsd*)
+             : > conftest1.c
+             $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1
+             cat <<EOF > conftest2.c
+#include <pthread.h>
+#pragma weak pthread_mutexattr_gettype
+int main ()
+{
+  return (pthread_mutexattr_gettype != NULL);
+}
+EOF
+             $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \
+               || gl_cv_have_weak=no
+             rm -f conftest1.c libempty.so conftest2.c conftest
+             ;;
+         esac
+         ;;
+     esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5
+printf "%s\n" "$gl_cv_have_weak" >&6; }
+  case "$gl_cv_have_weak" in
+    *yes)
+
+printf "%s\n" "#define HAVE_WEAK_SYMBOLS 1" >>confdefs.h
+
+      ;;
+  esac
+
+        case "$gl_cv_have_weak" in
+          *yes) LIB_SETLOCALE_NULL= ;;
+          *)    LIB_SETLOCALE_NULL="$LIBPTHREAD" ;;
+        esac
+        ;;
+    esac
+  else
+    LIB_SETLOCALE_NULL=
+  fi
+
+
+
+    HAVE_NEWLOCALE=1;
+  HAVE_DUPLOCALE=1;
+  HAVE_FREELOCALE=1;
+  REPLACE_LOCALECONV=0;
+  REPLACE_SETLOCALE=0;
+  REPLACE_NEWLOCALE=0;
+  REPLACE_DUPLOCALE=0;
+  REPLACE_FREELOCALE=0;
+  REPLACE_STRUCT_LCONV=0;
+  LOCALENAME_ENHANCE_LOCALE_FUNCS=0;
+
+
+
+
+
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether locale.h defines locale_t" >&5
+printf %s "checking whether locale.h defines locale_t... " >&6; }
+if test ${gl_cv_header_locale_has_locale_t+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <locale.h>
+            locale_t x;
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_header_locale_has_locale_t=yes
+else $as_nop
+  gl_cv_header_locale_has_locale_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_locale_has_locale_t" >&5
+printf "%s\n" "$gl_cv_header_locale_has_locale_t" >&6; }
+
+
+  if test $ac_cv_header_xlocale_h = yes; then
+    HAVE_XLOCALE_H=1
+    if test $gl_cv_header_locale_has_locale_t = yes; then
+      gl_cv_header_locale_h_needs_xlocale_h=no
+    else
+      gl_cv_header_locale_h_needs_xlocale_h=yes
+    fi
+    HAVE_LOCALE_T=1
+  else
+    HAVE_XLOCALE_H=0
+    gl_cv_header_locale_h_needs_xlocale_h=no
+    if test $gl_cv_header_locale_has_locale_t = yes; then
+      HAVE_LOCALE_T=1
+    else
+      HAVE_LOCALE_T=0
+    fi
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+  case "$host_os" in
+    solaris*)
+
+printf "%s\n" "#define _LCONV_C99 1" >>confdefs.h
+
+      ;;
+  esac
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether locale.h conforms to POSIX:2001" >&5
+printf %s "checking whether locale.h conforms to POSIX:2001... " >&6; }
+if test ${gl_cv_header_locale_h_posix2001+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <locale.h>
+            int x = LC_MESSAGES;
+            int y = sizeof (((struct lconv *) 0)->decimal_point);
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_header_locale_h_posix2001=yes
+else $as_nop
+  gl_cv_header_locale_h_posix2001=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_locale_h_posix2001" >&5
+printf "%s\n" "$gl_cv_header_locale_h_posix2001" >&6; }
+
+          { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether struct lconv is properly defined" >&5
+printf %s "checking whether struct lconv is properly defined... " >&6; }
+if test ${gl_cv_sys_struct_lconv_ok+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <locale.h>
+            struct lconv l;
+            int x = sizeof (l.decimal_point);
+            int y = sizeof (l.int_p_cs_precedes);
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_sys_struct_lconv_ok=yes
+else $as_nop
+  gl_cv_sys_struct_lconv_ok=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_lconv_ok" >&5
+printf "%s\n" "$gl_cv_sys_struct_lconv_ok" >&6; }
+  if test $gl_cv_sys_struct_lconv_ok = no; then
+            case "$host_os" in
+      mingw*)
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef _MSC_VER
+ Special
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Special" >/dev/null 2>&1
+then :
+
+else $as_nop
+  REPLACE_STRUCT_LCONV=1
+fi
+rm -rf conftest*
+
+        ;;
+      *) REPLACE_STRUCT_LCONV=1 ;;
+    esac
+  fi
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_locale_h='<'locale.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <locale.h>" >&5
+printf %s "checking absolute name of <locale.h>... " >&6; }
+if test ${gl_cv_next_locale_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <locale.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'locale.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_locale_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_locale_h
+           gl_cv_next_locale_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_locale_h" >&5
+printf "%s\n" "$gl_cv_next_locale_h" >&6; }
+     fi
+     NEXT_LOCALE_H=$gl_cv_next_locale_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'locale.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_locale_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_LOCALE_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+  GL_GNULIB_LOCALECONV=0
+
+
+
+  GL_GNULIB_SETLOCALE=0
+
+
+
+  GL_GNULIB_SETLOCALE_NULL=0
+
+
+
+  GL_GNULIB_DUPLOCALE=0
+
+
+
+  GL_GNULIB_LOCALENAME=0
+
+
+
+ac_fn_check_decl "$LINENO" "memrchr" "ac_cv_have_decl_memrchr" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_memrchr" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_MEMRCHR $ac_have_decl" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_strings_h='<'strings.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <strings.h>" >&5
+printf %s "checking absolute name of <strings.h>... " >&6; }
+if test ${gl_cv_next_strings_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+             if test $ac_cv_header_strings_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <strings.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'strings.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_strings_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_strings_h
+           gl_cv_next_strings_h='"'$gl_header'"'
+          else
+               gl_cv_next_strings_h='<'strings.h'>'
+             fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_strings_h" >&5
+printf "%s\n" "$gl_cv_next_strings_h" >&6; }
+     fi
+     NEXT_STRINGS_H=$gl_cv_next_strings_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'strings.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_strings_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_STRINGS_H=$gl_next_as_first_directive
+
+
+
+
+  if test $ac_cv_header_strings_h = yes; then
+    HAVE_STRINGS_H=1
+  else
+    HAVE_STRINGS_H=0
+  fi
+
+
+
+
+
+
+ac_fn_check_decl "$LINENO" "strnlen" "ac_cv_have_decl_strnlen" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_strnlen" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_STRNLEN $ac_have_decl" >>confdefs.h
+
+
+   if false; then
+  GL_COND_LIBTOOL_TRUE=
+  GL_COND_LIBTOOL_FALSE='#'
+else
+  GL_COND_LIBTOOL_TRUE='#'
+  GL_COND_LIBTOOL_FALSE=
+fi
+
+  gl_cond_libtool=false
+  gl_libdeps=
+  gl_ltlibdeps=
+  gl_m4_base='m4'
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_source_base='lib'
+
+
+
+      case "$host_os" in
+    mingw*) REPLACE_ACCESS=1 ;;
+  esac
+
+  if test $REPLACE_ACCESS = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS access.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_ACCESS=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_ACCESS 1" >>confdefs.h
+
+
+
+
+
+  if test $ac_cv_func_alloca_works = no; then
+    :
+  fi
+
+  # Define an additional variable used in the Makefile substitution.
+  if test $ac_cv_working_alloca_h = yes; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for alloca as a compiler built-in" >&5
+printf %s "checking for alloca as a compiler built-in... " >&6; }
+if test ${gl_cv_rpl_alloca+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#if defined __GNUC__ || defined _AIX || defined _MSC_VER
+        Need own alloca
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Need own alloca" >/dev/null 2>&1
+then :
+  gl_cv_rpl_alloca=yes
+else $as_nop
+  gl_cv_rpl_alloca=no
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_rpl_alloca" >&5
+printf "%s\n" "$gl_cv_rpl_alloca" >&6; }
+    if test $gl_cv_rpl_alloca = yes; then
+
+printf "%s\n" "#define HAVE_ALLOCA 1" >>confdefs.h
+
+      ALLOCA_H=alloca.h
+    else
+                  ALLOCA_H=
+    fi
+  else
+    ALLOCA_H=alloca.h
+  fi
+
+   if test -n "$ALLOCA_H"; then
+  GL_GENERATE_ALLOCA_H_TRUE=
+  GL_GENERATE_ALLOCA_H_FALSE='#'
+else
+  GL_GENERATE_ALLOCA_H_TRUE='#'
+  GL_GENERATE_ALLOCA_H_FALSE=
+fi
+
+
+  if test $ac_cv_working_alloca_h = yes; then
+    HAVE_ALLOCA_H=1
+  else
+    HAVE_ALLOCA_H=0
+  fi
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable assertions" >&5
+printf %s "checking whether to enable assertions... " >&6; }
+  # Check whether --enable-assert was given.
+if test ${enable_assert+y}
+then :
+  enableval=$enable_assert; if test "x$enableval" = xno
+then :
+
+printf "%s\n" "#define NDEBUG 1" >>confdefs.h
+
+elif test "x$enableval" != xyes
+then :
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-assert" >&5
+printf "%s\n" "$as_me: WARNING: invalid argument supplied to --enable-assert" >&2;}
+      enable_assert=yes
+fi
+else $as_nop
+  enable_assert=yes
+fi
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_assert" >&5
+printf "%s\n" "$enable_assert" >&6; }
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __builtin_expect" >&5
+printf %s "checking for __builtin_expect... " >&6; }
+if test ${gl_cv___builtin_expect+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+         int
+         main (int argc, char **argv)
+         {
+           argc = __builtin_expect (argc, 100);
+           return argv[argc != 100][0];
+         }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv___builtin_expect=yes
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+             #include <builtins.h>
+             int
+             main (int argc, char **argv)
+             {
+               argc = __builtin_expect (argc, 100);
+               return argv[argc != 100][0];
+             }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv___builtin_expect="in <builtins.h>"
+else $as_nop
+  gl_cv___builtin_expect=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv___builtin_expect" >&5
+printf "%s\n" "$gl_cv___builtin_expect" >&6; }
+  if test "$gl_cv___builtin_expect" = yes; then
+    printf "%s\n" "#define HAVE___BUILTIN_EXPECT 1" >>confdefs.h
+
+  elif test "$gl_cv___builtin_expect" = "in <builtins.h>"; then
+    printf "%s\n" "#define HAVE___BUILTIN_EXPECT 2" >>confdefs.h
+
+  fi
+
+
+
+
+
+  if test $REPLACE_CALLOC = 0; then
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether calloc (0, n) and calloc (n, 0) return nonnull" >&5
+printf %s "checking whether calloc (0, n) and calloc (n, 0) return nonnull... " >&6; }
+if test ${ac_cv_func_calloc_0_nonnull+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test $cross_compiling != yes; then
+       ac_cv_func_calloc_0_nonnull=yes
+       if test "$cross_compiling" = yes
+then :
+  { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main (void)
+{
+int result = 0;
+              char * volatile p = calloc (0, 0);
+              if (!p)
+                result |= 1;
+              free (p);
+              return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+
+else $as_nop
+  ac_cv_func_calloc_0_nonnull=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+     else
+       case "$host_os" in
+                        # Guess yes on glibc systems.
+         *-gnu* | gnu*) ac_cv_func_calloc_0_nonnull="guessing yes" ;;
+                        # Guess yes on musl systems.
+         *-musl*)       ac_cv_func_calloc_0_nonnull="guessing yes" ;;
+                        # Guess yes on native Windows.
+         mingw*)        ac_cv_func_calloc_0_nonnull="guessing yes" ;;
+                        # If we don't know, obey --enable-cross-guesses.
+         *)             ac_cv_func_calloc_0_nonnull="$gl_cross_guess_normal" ;;
+       esac
+     fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_calloc_0_nonnull" >&5
+printf "%s\n" "$ac_cv_func_calloc_0_nonnull" >&6; }
+  case $ac_cv_func_calloc_0_nonnull in #(
+  *yes) :
+     ;; #(
+  *) :
+    REPLACE_CALLOC=1 ;;
+esac
+
+  fi
+
+  if test $REPLACE_CALLOC = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS calloc.$ac_objext"
+
+  fi
+
+
+
+  if test $REPLACE_MALLOC = 1; then
+    REPLACE_CALLOC=1
+  fi
+
+  if test $REPLACE_CALLOC = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS calloc.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_CALLOC_POSIX=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_CALLOC_POSIX 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+  if test $ac_cv_func_canonicalize_file_name = no; then
+    HAVE_CANONICALIZE_FILE_NAME=0
+  else
+    case "$gl_cv_func_realpath_works" in
+      *yes) ;;
+      *)    REPLACE_CANONICALIZE_FILE_NAME=1 ;;
+    esac
+  fi
+
+
+
+printf "%s\n" "#define GNULIB_CANONICALIZE 1" >>confdefs.h
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_CANONICALIZE 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_CANONICALIZE_FILE_NAME=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_CANONICALIZE_FILE_NAME 1" >>confdefs.h
+
+
+
+
+
+
+  if test $ac_cv_func_canonicalize_file_name = no; then
+    HAVE_CANONICALIZE_FILE_NAME=0
+    if test $ac_cv_func_realpath = no; then
+      HAVE_REALPATH=0
+    else
+      case "$gl_cv_func_realpath_works" in
+        *yes) ;;
+        *)    REPLACE_REALPATH=1 ;;
+      esac
+    fi
+  else
+    case "$gl_cv_func_realpath_works" in
+      *yes)
+        ;;
+      *)
+        REPLACE_CANONICALIZE_FILE_NAME=1
+        REPLACE_REALPATH=1
+        ;;
+    esac
+  fi
+
+  if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS canonicalize-lgpl.$ac_objext"
+
+  fi
+
+
+printf "%s\n" "#define GNULIB_CANONICALIZE_LGPL 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_CANONICALIZE_FILE_NAME=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_CANONICALIZE_FILE_NAME 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_REALPATH=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_REALPATH 1" >>confdefs.h
+
+
+
+
+
+
+
+
+  # Solaris 2.5.1 needs -lposix4 to get the clock_gettime function.
+  # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4.
+
+  # Save and restore LIBS so e.g., -lrt, isn't added to it.  Otherwise, *all*
+  # programs in the package would end up linked with that potentially-shared
+  # library, inducing unnecessary run-time overhead.
+  LIB_CLOCK_GETTIME=
+
+  gl_saved_libs=$LIBS
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5
+printf %s "checking for library containing clock_gettime... " >&6; }
+if test ${ac_cv_search_clock_gettime+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+char clock_gettime ();
+int
+main (void)
+{
+return clock_gettime ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' rt posix4
+do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_search_clock_gettime=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext
+  if test ${ac_cv_search_clock_gettime+y}
+then :
+  break
+fi
+done
+if test ${ac_cv_search_clock_gettime+y}
+then :
+
+else $as_nop
+  ac_cv_search_clock_gettime=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
+printf "%s\n" "$ac_cv_search_clock_gettime" >&6; }
+ac_res=$ac_cv_search_clock_gettime
+if test "$ac_res" != no
+then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+  test "$ac_cv_search_clock_gettime" = "none required" ||
+                    LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime
+fi
+
+    ac_fn_c_check_func "$LINENO" "clock_gettime" "ac_cv_func_clock_gettime"
+if test "x$ac_cv_func_clock_gettime" = xyes
+then :
+  printf "%s\n" "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "clock_settime" "ac_cv_func_clock_settime"
+if test "x$ac_cv_func_clock_settime" = xyes
+then :
+  printf "%s\n" "#define HAVE_CLOCK_SETTIME 1" >>confdefs.h
+
+fi
+
+  LIBS=$gl_saved_libs
+
+
+
+printf "%s\n" "#define GNULIB_TEST_CLOEXEC 1" >>confdefs.h
+
+
+
+
+
+
+    if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+      REPLACE_CLOSE=1
+    fi
+
+
+
+
+
+
+  if test $ac_cv_header_sys_socket_h != yes; then
+                    ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h
+
+fi
+
+  fi
+  if test "$ac_cv_header_winsock2_h" = yes; then
+    HAVE_WINSOCK2_H=1
+    UNISTD_H_HAVE_WINSOCK2_H=1
+    SYS_IOCTL_H_HAVE_WINSOCK2_H=1
+  else
+    HAVE_WINSOCK2_H=0
+  fi
+
+
+    if test $UNISTD_H_HAVE_WINSOCK2_H = 1; then
+                        REPLACE_CLOSE=1
+    fi
+
+
+    if test $REPLACE_CLOSE = 0; then
+
+
+
+  if test $ac_cv_func_fchdir = no; then
+    HAVE_FCHDIR=0
+  fi
+
+      if test $HAVE_FCHDIR = 0; then
+        REPLACE_CLOSE=1
+      fi
+    fi
+
+
+  if test $REPLACE_CLOSE = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS close.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_CLOSE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_CLOSE 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define GNULIB_CLOSE_STREAM 1" >>confdefs.h
+
+
+
+
+  if test "x$lispdir" = x; then
+    lispdir='${datarootdir}/emacs/site-lisp'
+
+  fi
+    if test "x$runstatedir" = x; then
+    runstatedir='${localstatedir}/run'
+
+  fi
+
+      pkglibexecdir='${libexecdir}/${PACKAGE}'
+
+
+
+
+printf "%s\n" "#define GNULIB_DIRNAME 1" >>confdefs.h
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether // is distinct from /" >&5
+printf %s "checking whether // is distinct from /... " >&6; }
+if test ${gl_cv_double_slash_root+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+   if test x"$cross_compiling" = xyes ; then
+        # When cross-compiling, there is no way to tell whether // is special
+        # short of a list of hosts.  However, the only known hosts to date
+        # that have a distinct // are Apollo DomainOS (too old to port to),
+        # Cygwin, and z/OS.  If anyone knows of another system for which // has
+        # special semantics and is distinct from /, please report it to
+        # <bug-gnulib@gnu.org>.
+        case $host in
+          *-cygwin | i370-ibm-openedition)
+            gl_cv_double_slash_root=yes ;;
+          *)
+            # Be optimistic and assume that / and // are the same when we
+            # don't know.
+            gl_cv_double_slash_root='unknown, assuming no' ;;
+        esac
+      else
+        set x `ls -di / // 2>/dev/null`
+        if test "$2" = "$4" && wc //dev/null >/dev/null 2>&1; then
+          gl_cv_double_slash_root=no
+        else
+          gl_cv_double_slash_root=yes
+        fi
+      fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_double_slash_root" >&5
+printf "%s\n" "$gl_cv_double_slash_root" >&6; }
+  if test "$gl_cv_double_slash_root" = yes; then
+
+printf "%s\n" "#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1" >>confdefs.h
+
+  fi
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether dup2 works" >&5
+printf %s "checking whether dup2 works... " >&6; }
+if test ${gl_cv_func_dup2_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+         mingw*) # on this platform, dup2 always returns 0 for success
+           gl_cv_func_dup2_works="guessing no" ;;
+         cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0
+           gl_cv_func_dup2_works="guessing no" ;;
+         aix* | freebsd*)
+                 # on AIX 7.1 and FreeBSD 6.1, dup2 (1,toobig) gives EMFILE,
+                 # not EBADF.
+           gl_cv_func_dup2_works="guessing no" ;;
+         haiku*) # on Haiku alpha 2, dup2(1, 1) resets FD_CLOEXEC.
+           gl_cv_func_dup2_works="guessing no" ;;
+         *-android*) # implemented using dup3(), which fails if oldfd == newfd
+           gl_cv_func_dup2_works="guessing no" ;;
+         os2*) # on OS/2 kLIBC, dup2() does not work on a directory fd.
+           gl_cv_func_dup2_works="guessing no" ;;
+         *) gl_cv_func_dup2_works="guessing yes" ;;
+       esac
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+       #include <errno.h>
+           #include <fcntl.h>
+           #include <limits.h>
+           #include <sys/resource.h>
+           #include <unistd.h>
+
+
+$gl_mda_defines
+
+           #ifndef RLIM_SAVED_CUR
+           # define RLIM_SAVED_CUR RLIM_INFINITY
+           #endif
+           #ifndef RLIM_SAVED_MAX
+           # define RLIM_SAVED_MAX RLIM_INFINITY
+           #endif
+
+int
+main (void)
+{
+int result = 0;
+           int bad_fd = INT_MAX;
+           struct rlimit rlim;
+           if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
+               && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX
+               && rlim.rlim_cur != RLIM_INFINITY
+               && rlim.rlim_cur != RLIM_SAVED_MAX
+               && rlim.rlim_cur != RLIM_SAVED_CUR)
+             bad_fd = rlim.rlim_cur;
+           #ifdef FD_CLOEXEC
+             if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1)
+               result |= 1;
+           #endif
+           if (dup2 (1, 1) != 1)
+             result |= 2;
+           #ifdef FD_CLOEXEC
+             if (fcntl (1, F_GETFD) != FD_CLOEXEC)
+               result |= 4;
+           #endif
+           close (0);
+           if (dup2 (0, 0) != -1)
+             result |= 8;
+           /* Many gnulib modules require POSIX conformance of EBADF.  */
+           if (dup2 (2, bad_fd) == -1 && errno != EBADF)
+             result |= 16;
+           /* Flush out some cygwin core dumps.  */
+           if (dup2 (2, -1) != -1 || errno != EBADF)
+             result |= 32;
+           dup2 (2, 255);
+           dup2 (2, 256);
+           /* On OS/2 kLIBC, dup2() does not work on a directory fd.  */
+           {
+             int fd = open (".", O_RDONLY);
+             if (fd == -1)
+               result |= 64;
+             else if (dup2 (fd, fd + 1) == -1)
+               result |= 128;
+             close (fd);
+           }
+           return result;
+  ;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_dup2_works=yes
+else $as_nop
+  gl_cv_func_dup2_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_dup2_works" >&5
+printf "%s\n" "$gl_cv_func_dup2_works" >&6; }
+  case "$gl_cv_func_dup2_works" in
+    *yes) ;;
+    *)
+      REPLACE_DUP2=1
+      ac_fn_c_check_func "$LINENO" "setdtablesize" "ac_cv_func_setdtablesize"
+if test "x$ac_cv_func_setdtablesize" = xyes
+then :
+  printf "%s\n" "#define HAVE_SETDTABLESIZE 1" >>confdefs.h
+
+fi
+
+      ;;
+  esac
+
+
+
+
+  if test $ac_cv_func_fchdir = no; then
+    HAVE_FCHDIR=0
+  fi
+
+    if test $HAVE_FCHDIR = 0; then
+      REPLACE_DUP2=1
+    fi
+
+
+  if test $REPLACE_DUP2 = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS dup2.$ac_objext"
+
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_DUP2=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_DUP2 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_ENVIRON=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_ENVIRON 1" >>confdefs.h
+
+
+
+
+
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5
+printf %s "checking for error_at_line... " >&6; }
+if test ${ac_cv_lib_error_at_line+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <error.h>
+int
+main (void)
+{
+error_at_line (0, 0, "", 0, "an error occurred");
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_lib_error_at_line=yes
+else $as_nop
+  ac_cv_lib_error_at_line=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_error_at_line" >&5
+printf "%s\n" "$ac_cv_lib_error_at_line" >&6; }
+
+  if test "$ac_cv_lib_error_at_line" = no
+then :
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS error.$ac_objext"
+
+
+
+
+
+  :
+
+
+fi
+
+
+  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error:3:c-format"
+
+
+
+  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error_at_line:5:c-format"
+
+
+
+
+
+
+
+
+  :
+
+
+
+
+
+
+  if test $ac_cv_func_fcntl = no; then
+
+
+
+  if test $ac_cv_func_fcntl = no; then
+    HAVE_FCNTL=0
+  else
+    REPLACE_FCNTL=1
+  fi
+
+  else
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fcntl handles F_DUPFD correctly" >&5
+printf %s "checking whether fcntl handles F_DUPFD correctly... " >&6; }
+if test ${gl_cv_func_fcntl_f_dupfd_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case $host_os in
+            aix* | cygwin* | haiku*)
+               gl_cv_func_fcntl_f_dupfd_works="guessing no" ;;
+            *) gl_cv_func_fcntl_f_dupfd_works="guessing yes" ;;
+          esac
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <errno.h>
+              #include <fcntl.h>
+              #include <limits.h>
+              #include <sys/resource.h>
+              #include <unistd.h>
+
+
+$gl_mda_defines
+
+              #ifndef RLIM_SAVED_CUR
+              # define RLIM_SAVED_CUR RLIM_INFINITY
+              #endif
+              #ifndef RLIM_SAVED_MAX
+              # define RLIM_SAVED_MAX RLIM_INFINITY
+              #endif
+
+int
+main (void)
+{
+int result = 0;
+              int bad_fd = INT_MAX;
+              struct rlimit rlim;
+              if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
+                  && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX
+                  && rlim.rlim_cur != RLIM_INFINITY
+                  && rlim.rlim_cur != RLIM_SAVED_MAX
+                  && rlim.rlim_cur != RLIM_SAVED_CUR)
+                bad_fd = rlim.rlim_cur;
+              if (fcntl (0, F_DUPFD, -1) != -1) result |= 1;
+              if (errno != EINVAL) result |= 2;
+              if (fcntl (0, F_DUPFD, bad_fd) != -1) result |= 4;
+              if (errno != EINVAL) result |= 8;
+              /* On OS/2 kLIBC, F_DUPFD does not work on a directory fd */
+              {
+                int fd;
+                fd = open (".", O_RDONLY);
+                if (fd == -1)
+                  result |= 16;
+                else if (fcntl (fd, F_DUPFD, STDERR_FILENO + 1) == -1)
+                  result |= 32;
+
+                close (fd);
+              }
+              return result;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_fcntl_f_dupfd_works=yes
+else $as_nop
+  gl_cv_func_fcntl_f_dupfd_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fcntl_f_dupfd_works" >&5
+printf "%s\n" "$gl_cv_func_fcntl_f_dupfd_works" >&6; }
+    case $gl_cv_func_fcntl_f_dupfd_works in
+      *yes) ;;
+      *)
+
+
+  if test $ac_cv_func_fcntl = no; then
+    HAVE_FCNTL=0
+  else
+    REPLACE_FCNTL=1
+  fi
+
+
+printf "%s\n" "#define FCNTL_DUPFD_BUGGY 1" >>confdefs.h
+ ;;
+    esac
+
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fcntl understands F_DUPFD_CLOEXEC" >&5
+printf %s "checking whether fcntl understands F_DUPFD_CLOEXEC... " >&6; }
+if test ${gl_cv_func_fcntl_f_dupfd_cloexec+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                     # Guess no on NetBSD.
+            netbsd*) gl_cv_func_fcntl_f_dupfd_cloexec="guessing no" ;;
+            *)       gl_cv_func_fcntl_f_dupfd_cloexec="$gl_cross_guess_normal" ;;
+          esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <fcntl.h>
+              #include <unistd.h>
+              int main (int argc, char *argv[])
+              {
+                if (argc == 1)
+                  /* parent process */
+                  {
+                    if (fcntl (1, F_DUPFD_CLOEXEC, 10) < 0)
+                      return 1;
+                    return execl ("./conftest", "./conftest", "child", NULL);
+                  }
+                else
+                  /* child process */
+                  return (fcntl (10, F_GETFL) < 0 ? 0 : 42);
+              }
+
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef __linux__
+/* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace
+   it to support the semantics on older kernels that failed with EINVAL.  */
+choke me
+#endif
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_func_fcntl_f_dupfd_cloexec=yes
+else $as_nop
+  gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+else $as_nop
+  gl_cv_func_fcntl_f_dupfd_cloexec=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fcntl_f_dupfd_cloexec" >&5
+printf "%s\n" "$gl_cv_func_fcntl_f_dupfd_cloexec" >&6; }
+    case "$gl_cv_func_fcntl_f_dupfd_cloexec" in
+      *yes) ;;
+      *)
+
+
+  if test $ac_cv_func_fcntl = no; then
+    HAVE_FCNTL=0
+  else
+    REPLACE_FCNTL=1
+  fi
+
+                        ;;
+    esac
+  fi
+
+
+
+
+  if test $ac_cv_func_fchdir = no; then
+    HAVE_FCHDIR=0
+  fi
+
+    if test $HAVE_FCHDIR = 0; then
+
+
+
+  if test $ac_cv_func_fcntl = no; then
+    HAVE_FCNTL=0
+  else
+    REPLACE_FCNTL=1
+  fi
+
+    fi
+
+
+  if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS fcntl.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FCNTL=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FCNTL 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+printf "%s\n" "#define GNULIB_FD_SAFER_FLAG 1" >>confdefs.h
+
+
+
+
+
+
+
+
+  if test $ac_cv_func_ffsl = no; then
+    HAVE_FFSL=0
+  fi
+
+  if test $HAVE_FFSL = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS ffsl.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FFSL=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FFSL 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+  FLOAT_H=
+  REPLACE_FLOAT_LDBL=0
+  case "$host_os" in
+    aix* | beos* | openbsd* | mirbsd* | irix*)
+      FLOAT_H=float.h
+      ;;
+    freebsd* | dragonfly*)
+      case "$host_cpu" in
+        i[34567]86 )
+          FLOAT_H=float.h
+          ;;
+        x86_64 )
+          # On x86_64 systems, the C compiler may still be generating
+          # 32-bit code.
+          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if defined __LP64__ || defined __x86_64__ || defined __amd64__
+                  int ok;
+                 #else
+                  error fail
+                 #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+  FLOAT_H=float.h
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+          ;;
+      esac
+      ;;
+    linux*)
+      case "$host_cpu" in
+        powerpc*)
+          FLOAT_H=float.h
+          ;;
+      esac
+      ;;
+  esac
+  case "$host_os" in
+    aix* | freebsd* | dragonfly* | linux*)
+      if test -n "$FLOAT_H"; then
+        REPLACE_FLOAT_LDBL=1
+      fi
+      ;;
+  esac
+
+    REPLACE_ITOLD=0
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether conversion from 'int' to 'long double' works" >&5
+printf %s "checking whether conversion from 'int' to 'long double' works... " >&6; }
+if test ${gl_cv_func_itold_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host" in
+           sparc*-*-linux*)
+             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if defined __LP64__ || defined __arch64__
+                    int ok;
+                   #else
+                    error fail
+                   #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_func_itold_works="guessing no"
+else $as_nop
+  gl_cv_func_itold_works="guessing yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+             ;;
+                   # Guess yes on native Windows.
+           mingw*) gl_cv_func_itold_works="guessing yes" ;;
+           *)      gl_cv_func_itold_works="guessing yes" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int i = -1;
+volatile long double ld;
+int main ()
+{
+  ld += i * 1.0L;
+  if (ld > 0)
+    return 1;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_itold_works=yes
+else $as_nop
+  gl_cv_func_itold_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_itold_works" >&5
+printf "%s\n" "$gl_cv_func_itold_works" >&6; }
+  case "$gl_cv_func_itold_works" in
+    *no)
+      REPLACE_ITOLD=1
+                  FLOAT_H=float.h
+      ;;
+  esac
+
+  if test -n "$FLOAT_H"; then
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_float_h='<'float.h'>'
+     else
+       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <float.h>" >&5
+printf %s "checking absolute name of <float.h>... " >&6; }
+if test ${gl_cv_next_float_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <float.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'float.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_float_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_float_h
+           gl_cv_next_float_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_float_h" >&5
+printf "%s\n" "$gl_cv_next_float_h" >&6; }
+     fi
+     NEXT_FLOAT_H=$gl_cv_next_float_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'float.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_float_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_FLOAT_H=$gl_next_as_first_directive
+
+
+
+
+  fi
+
+   if test -n "$FLOAT_H"; then
+  GL_GENERATE_FLOAT_H_TRUE=
+  GL_GENERATE_FLOAT_H_FALSE='#'
+else
+  GL_GENERATE_FLOAT_H_TRUE='#'
+  GL_GENERATE_FLOAT_H_FALSE=
+fi
+
+
+
+  if test $REPLACE_FLOAT_LDBL = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS float.$ac_objext"
+
+  fi
+  if test $REPLACE_ITOLD = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS itold.$ac_objext"
+
+  fi
+
+
+
+  case "$host_os" in
+    mingw* | pw*)
+            REPLACE_FOPEN=1
+            gl_cv_func_fopen_slash="guessing no"
+      ;;
+    *)
+                  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fopen recognizes a trailing slash" >&5
+printf %s "checking whether fopen recognizes a trailing slash... " >&6; }
+if test ${gl_cv_func_fopen_slash+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+          if test "$cross_compiling" = yes
+then :
+
+             case "$host_os" in
+               aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*)
+                 gl_cv_func_fopen_slash="guessing no" ;;
+               *)
+                 gl_cv_func_fopen_slash="guessing yes" ;;
+             esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stddef.h>
+#include <stdio.h>
+int main ()
+{
+  FILE *fp = fopen ("conftest.sl/", "w");
+  int result = (fp != NULL);
+  if (fp != NULL)
+    fclose (fp);
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_fopen_slash=yes
+else $as_nop
+  gl_cv_func_fopen_slash=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+          rm -f conftest.sl
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fopen_slash" >&5
+printf "%s\n" "$gl_cv_func_fopen_slash" >&6; }
+      ;;
+  esac
+  case "$gl_cv_func_fopen_slash" in
+    *no)
+
+printf "%s\n" "#define FOPEN_TRAILING_SLASH_BUG 1" >>confdefs.h
+
+      REPLACE_FOPEN=1
+      ;;
+  esac
+
+  if test $REPLACE_FOPEN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS fopen.$ac_objext"
+
+    :
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FOPEN=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FOPEN 1" >>confdefs.h
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fopen supports the mode character 'x'" >&5
+printf %s "checking whether fopen supports the mode character 'x'... " >&6; }
+if test ${gl_cv_func_fopen_mode_x+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  rm -f conftest.x
+     if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+          # Guess yes on glibc and musl systems.
+          linux*-gnu* | gnu* | kfreebsd*-gnu | *-musl*)
+            gl_cv_func_fopen_mode_x="guessing yes" ;;
+          # If we don't know, obey --enable-cross-guesses.
+          *)
+            gl_cv_func_fopen_mode_x="$gl_cross_guess_normal" ;;
+        esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <errno.h>
+int main ()
+{
+  FILE *fp;
+  fp = fopen ("conftest.x", "w");
+  fclose (fp);
+  fp = fopen ("conftest.x", "wx");
+  if (fp != NULL)
+    /* 'x' ignored */
+    return 1;
+  else if (errno == EEXIST)
+    return 0;
+  else
+    /* 'x' rejected */
+    return 2;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_fopen_mode_x=yes
+else $as_nop
+  gl_cv_func_fopen_mode_x=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+     rm -f conftest.x
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fopen_mode_x" >&5
+printf "%s\n" "$gl_cv_func_fopen_mode_x" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fopen supports the mode character 'e'" >&5
+printf %s "checking whether fopen supports the mode character 'e'... " >&6; }
+if test ${gl_cv_func_fopen_mode_e+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  echo foo > conftest.x
+     if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+          # Guess yes on glibc and musl systems.
+          linux*-gnu* | gnu* | kfreebsd*-gnu | *-musl*)
+            gl_cv_func_fopen_mode_e="guessing yes" ;;
+          # Guess no on native Windows.
+          mingw*)
+            gl_cv_func_fopen_mode_e="guessing no" ;;
+          # If we don't know, obey --enable-cross-guesses.
+          *)
+            gl_cv_func_fopen_mode_e="$gl_cross_guess_normal" ;;
+        esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <errno.h>
+#include <fcntl.h>
+
+
+$gl_mda_defines
+
+int main ()
+{
+  FILE *fp = fopen ("conftest.x", "re");
+  if (fp != NULL)
+    {
+      if (fcntl (fileno (fp), F_GETFD) & FD_CLOEXEC)
+        return 0;
+      else
+        /* 'e' ignored */
+        return 1;
+    }
+  else
+    /* 'e' rejected */
+    return 2;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_fopen_mode_e=yes
+else $as_nop
+  gl_cv_func_fopen_mode_e=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+     rm -f conftest.x
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fopen_mode_e" >&5
+printf "%s\n" "$gl_cv_func_fopen_mode_e" >&6; }
+  case "$gl_cv_func_fopen_mode_x" in
+    *no) REPLACE_FOPEN=1 ;;
+  esac
+  case "$gl_cv_func_fopen_mode_e" in
+    *no) REPLACE_FOPEN=1 ;;
+  esac
+
+  if test $REPLACE_FOPEN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS fopen.$ac_objext"
+
+    :
+  fi
+
+
+printf "%s\n" "#define GNULIB_FOPEN_GNU 1" >>confdefs.h
+
+
+
+
+printf "%s\n" "#define GNULIB_FOPEN_SAFER 1" >>confdefs.h
+
+
+
+
+  fp_headers='
+    #include <stdio.h>
+    #if HAVE_STDIO_EXT_H
+    # include <stdio_ext.h>
+    #endif
+  '
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __fpending" >&5
+printf %s "checking for __fpending... " >&6; }
+if test ${gl_cv_func___fpending+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$fp_headers
+int
+main (void)
+{
+return ! __fpending (stdin);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func___fpending=yes
+else $as_nop
+  gl_cv_func___fpending=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func___fpending" >&5
+printf "%s\n" "$gl_cv_func___fpending" >&6; }
+  if test $gl_cv_func___fpending = yes; then
+    ac_fn_check_decl "$LINENO" "__fpending" "ac_cv_have_decl___fpending" "$fp_headers
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl___fpending" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL___FPENDING $ac_have_decl" >>confdefs.h
+
+  fi
+
+  if test $gl_cv_func___fpending = no; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS fpending.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_cv_func_fprintf_posix=no
+  case "$gl_cv_func_printf_sizes_c99" in
+    *yes)
+      case "$gl_cv_func_printf_long_double" in
+        *yes)
+          case "$gl_cv_func_printf_infinite" in
+            *yes)
+              case "$gl_cv_func_printf_infinite_long_double" in
+                *yes)
+                  case "$gl_cv_func_printf_directive_a" in
+                    *yes)
+                      case "$gl_cv_func_printf_directive_f" in
+                        *yes)
+                          case "$gl_cv_func_printf_directive_n" in
+                            *yes)
+                              case "$gl_cv_func_printf_directive_ls" in
+                                *yes)
+                                  case "$gl_cv_func_printf_positions" in
+                                    *yes)
+                                      case "$gl_cv_func_printf_flag_grouping" in
+                                        *yes)
+                                          case "$gl_cv_func_printf_flag_leftadjust" in
+                                            *yes)
+                                              case "$gl_cv_func_printf_flag_zero" in
+                                                *yes)
+                                                  case "$gl_cv_func_printf_precision" in
+                                                    *yes)
+                                                      case "$gl_cv_func_printf_enomem" in
+                                                        *yes)
+                                                          # fprintf exists and is
+                                                          # already POSIX compliant.
+                                                          gl_cv_func_fprintf_posix=yes
+                                                          ;;
+                                                      esac
+                                                      ;;
+                                                  esac
+                                                  ;;
+                                              esac
+                                              ;;
+                                          esac
+                                          ;;
+                                      esac
+                                      ;;
+                                  esac
+                                  ;;
+                              esac
+                              ;;
+                          esac
+                          ;;
+                      esac
+                      ;;
+                  esac
+                  ;;
+              esac
+              ;;
+          esac
+          ;;
+      esac
+      ;;
+  esac
+  if test $gl_cv_func_fprintf_posix = no; then
+
+
+
+  case "$gl_cv_func_printf_infinite" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+  case "$gl_cv_func_printf_long_double" in
+    *yes)
+      case "$gl_cv_func_printf_infinite_long_double" in
+        *yes)
+          ;;
+        *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
+
+          ;;
+      esac
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_a" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
+
+      ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
+if test "x$ac_cv_func_nl_langinfo" = xyes
+then :
+  printf "%s\n" "#define HAVE_NL_LANGINFO 1" >>confdefs.h
+
+fi
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_f" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_ls" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_grouping" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_leftadjust" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_zero" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_precision" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_enomem" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
+
+  if test $ac_cv_func_vasnprintf = yes; then
+
+printf "%s\n" "#define REPLACE_VASNPRINTF 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+
+
+
+
+  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
+if test "x$ac_cv_type_ptrdiff_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define ptrdiff_t long" >>confdefs.h
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS fprintf.$ac_objext"
+
+  REPLACE_FPRINTF=1
+
+printf "%s\n" "#define REPLACE_FPRINTF_POSIX 1" >>confdefs.h
+
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FPRINTF_POSIX=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FPRINTF_POSIX 1" >>confdefs.h
+
+
+
+
+
+
+                          { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether free is known to preserve errno" >&5
+printf %s "checking whether free is known to preserve errno... " >&6; }
+if test ${gl_cv_func_free_preserves_errno+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+int
+main (void)
+{
+#if 2 < __GLIBC__ + (33 <= __GLIBC_MINOR__)
+            #elif defined __OpenBSD__
+            #elif defined __sun
+            #else
+              #error "'free' is not known to preserve errno"
+            #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_func_free_preserves_errno=yes
+else $as_nop
+  gl_cv_func_free_preserves_errno=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_free_preserves_errno" >&5
+printf "%s\n" "$gl_cv_func_free_preserves_errno" >&6; }
+
+  case $gl_cv_func_free_preserves_errno in
+   *yes)
+
+printf "%s\n" "#define HAVE_FREE_POSIX 1" >>confdefs.h
+
+    ;;
+   *) REPLACE_FREE=1 ;;
+  esac
+
+  if test $REPLACE_FREE = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS free.$ac_objext"
+
+    :
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FREE_POSIX=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FREE_POSIX 1" >>confdefs.h
+
+
+
+
+
+
+  if test $gl_cv_func_frexp_no_libm = yes; then
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexp works" >&5
+printf %s "checking whether frexp works... " >&6; }
+if test ${gl_cv_func_frexp_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+           netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;;
+           mingw*) # Guess yes with MSVC, no with mingw.
+             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef _MSC_VER
+ Good
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Good" >/dev/null 2>&1
+then :
+  gl_cv_func_frexp_works="guessing yes"
+else $as_nop
+  gl_cv_func_frexp_works="guessing no"
+fi
+rm -rf conftest*
+
+             ;;
+           *) gl_cv_func_frexp_works="guessing yes" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <float.h>
+#include <math.h>
+#include <string.h>
+#if HAVE_DECL_ALARM
+# include <signal.h>
+# include <unistd.h>
+#endif
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+   ICC 10.0 has a bug when optimizing the expression -zero.
+   The expression -DBL_MIN * DBL_MIN does not work when cross-compiling
+   to PowerPC on Mac OS X 10.5.  */
+#if defined __hpux || defined __sgi || defined __ICC
+static double
+compute_minus_zero (void)
+{
+  return -DBL_MIN * DBL_MIN;
+}
+# define minus_zero compute_minus_zero ()
+#else
+double minus_zero = -0.0;
+#endif
+int main()
+{
+  int result = 0;
+  int i;
+  volatile double x;
+  double zero = 0.0;
+#if HAVE_DECL_ALARM
+  /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite
+     number.  Let the test fail in this case.  */
+  signal (SIGALRM, SIG_DFL);
+  alarm (5);
+#endif
+  /* Test on denormalized numbers.  */
+  for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
+    ;
+  if (x > 0.0)
+    {
+      int exp;
+      double y = frexp (x, &exp);
+      /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022.
+         On NetBSD: y = 0.75. Correct: y = 0.5.  */
+      if (y != 0.5)
+        result |= 1;
+    }
+  /* Test on infinite numbers.  */
+  x = 1.0 / zero;
+  {
+    int exp;
+    double y = frexp (x, &exp);
+    if (y != x)
+      result |= 2;
+  }
+  /* Test on negative zero.  */
+  x = minus_zero;
+  {
+    int exp;
+    double y = frexp (x, &exp);
+    if (memcmp (&y, &x, sizeof x))
+      result |= 4;
+  }
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_frexp_works=yes
+else $as_nop
+  gl_cv_func_frexp_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_works" >&5
+printf "%s\n" "$gl_cv_func_frexp_works" >&6; }
+
+    case "$gl_cv_func_frexp_works" in
+      *yes) gl_func_frexp_no_libm=yes ;;
+      *)    gl_func_frexp_no_libm=no; REPLACE_FREXP=1 ;;
+    esac
+  else
+    gl_func_frexp_no_libm=no
+        REPLACE_FREXP=1
+  fi
+  if test $gl_func_frexp_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_FREXP_IN_LIBC 1" >>confdefs.h
+
+  fi
+
+  if test $gl_func_frexp_no_libm != yes; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS frexp.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FREXP=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FREXP 1" >>confdefs.h
+
+
+
+
+
+
+      ac_fn_check_decl "$LINENO" "frexpl" "ac_cv_have_decl_frexpl" "#include <math.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_frexpl" = xyes
+then :
+
+else $as_nop
+  HAVE_DECL_FREXPL=0
+fi
+  if test $HAVE_DECL_FREXPL = 1; then
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexpl() can be used without linking with libm" >&5
+printf %s "checking whether frexpl() can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_frexpl_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             long double x;
+int
+main (void)
+{
+int e; return frexpl (x, &e) > 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_frexpl_no_libm=yes
+else $as_nop
+  gl_cv_func_frexpl_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_no_libm" >&5
+printf "%s\n" "$gl_cv_func_frexpl_no_libm" >&6; }
+
+    if test $gl_cv_func_frexpl_no_libm = yes; then
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexpl works" >&5
+printf %s "checking whether frexpl works... " >&6; }
+if test ${gl_cv_func_frexpl_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+           aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*)
+              gl_cv_func_frexpl_works="guessing no";;
+           *) gl_cv_func_frexpl_works="guessing yes";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <float.h>
+#include <math.h>
+/* Override the values of <float.h>, like done in float.in.h.  */
+#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP    (-16381)
+#endif
+#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP    (-16381)
+#endif
+#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP DBL_MIN_EXP
+#endif
+#if defined __sgi && (LDBL_MANT_DIG >= 106)
+# if defined __GNUC__
+#  undef LDBL_MIN_EXP
+#  define LDBL_MIN_EXP DBL_MIN_EXP
+# endif
+#endif
+extern
+#ifdef __cplusplus
+"C"
+#endif
+long double frexpl (long double, int *);
+long double zero = 0.0L;
+int main()
+{
+  int result = 0;
+  volatile long double x;
+  /* Test on finite numbers that fails on AIX 5.1.  */
+  x = 16.0L;
+  {
+    int exp = -9999;
+    frexpl (x, &exp);
+    if (exp != 5)
+      result |= 1;
+  }
+  /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl
+     function returns an invalid (incorrectly normalized) value: it returns
+               y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
+     but the correct result is
+          0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 }  */
+  x = 1.01L;
+  {
+    int exp = -9999;
+    long double y = frexpl (x, &exp);
+    if (!(exp == 1 && y == 0.505L))
+      result |= 2;
+  }
+  /* Test on large finite numbers.  This fails on BeOS at i = 16322, while
+     LDBL_MAX_EXP = 16384.
+     In the loop end test, we test x against Infinity, rather than comparing
+     i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP.  */
+  {
+    int i;
+    for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
+      {
+        int exp = -9999;
+        frexpl (x, &exp);
+        if (exp != i)
+          {
+            result |= 4;
+            break;
+          }
+      }
+  }
+  /* Test on denormalized numbers.  */
+  {
+    int i;
+    for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
+      ;
+    if (x > 0.0L)
+      {
+        int exp;
+        long double y = frexpl (x, &exp);
+        /* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
+           exp = -16382, y = 0.5.  On Mac OS X 10.5: exp = -16384, y = 0.5.  */
+        if (exp != LDBL_MIN_EXP - 1)
+          result |= 8;
+      }
+  }
+  /* Test on infinite numbers.  */
+  /* The Microsoft MSVC 14 compiler chokes on the expression 1.0 / 0.0.  */
+  x = 1.0L / zero;
+  {
+    int exp;
+    long double y = frexpl (x, &exp);
+    if (y != x)
+      result |= 16;
+  }
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_frexpl_works=yes
+else $as_nop
+  gl_cv_func_frexpl_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_works" >&5
+printf "%s\n" "$gl_cv_func_frexpl_works" >&6; }
+
+      case "$gl_cv_func_frexpl_works" in
+        *yes) gl_func_frexpl_no_libm=yes ;;
+        *)    gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;;
+      esac
+    else
+      gl_func_frexpl_no_libm=no
+            REPLACE_FREXPL=1
+    fi
+    if test $gl_func_frexpl_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_FREXPL_IN_LIBC 1" >>confdefs.h
+
+    fi
+  fi
+
+  if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl_no_libm = no; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS frexpl.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FREXPL=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FREXPL 1" >>confdefs.h
+
+
+
+
+
+
+  if test $ac_cv_func_fsync = no; then
+    HAVE_FSYNC=0
+  fi
+
+  if test $HAVE_FSYNC = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS fsync.$ac_objext"
+
+    :
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FSYNC=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FSYNC 1" >>confdefs.h
+
+
+
+
+
+
+
+
+  gl_abort_bug=no
+  case "$host_os" in
+    mingw*)
+      gl_cv_func_getcwd_path_max=yes
+      ;;
+    *)
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getcwd handles long file names properly" >&5
+printf %s "checking whether getcwd handles long file names properly... " >&6; }
+if test ${gl_cv_func_getcwd_path_max+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  # Arrange for deletion of the temporary directory this test creates.
+     ac_clean_files="$ac_clean_files confdir3"
+          if test "$cross_compiling" = yes
+then :
+  # Cross-compilation guesses:
+        case "$host_os" in
+          aix*) # On AIX, it has the AIX bug.
+            gl_cv_func_getcwd_path_max='guessing no, it has the AIX bug' ;;
+          gnu*) # On Hurd, it is 'yes'.
+            gl_cv_func_getcwd_path_max='guessing yes' ;;
+          linux* | kfreebsd*)
+            # On older Linux+glibc it's 'no, but it is partly working',
+            # on newer Linux+glibc it's 'yes'.
+            # On Linux+musl libc, it's 'no, but it is partly working'.
+            # On kFreeBSD+glibc, it's 'no, but it is partly working'.
+            gl_cv_func_getcwd_path_max='guessing no, but it is partly working' ;;
+          *) # If we don't know, obey --enable-cross-guesses.
+            gl_cv_func_getcwd_path_max="$gl_cross_guess_normal" ;;
+        esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <errno.h>
+#include <stdlib.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#else
+# include <direct.h>
+#endif
+#include <string.h>
+#include <limits.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+
+/* Arrange to define PATH_MAX, like "pathmax.h" does. */
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <limits.h>
+#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+# include <sys/param.h>
+#endif
+#if !defined PATH_MAX && defined MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+#endif
+#ifdef __hpux
+# undef PATH_MAX
+# define PATH_MAX 1024
+#endif
+#if defined _WIN32 && ! defined __CYGWIN__
+# undef PATH_MAX
+# define PATH_MAX 260
+#endif
+
+
+#ifndef AT_FDCWD
+# define AT_FDCWD 0
+#endif
+#ifdef ENAMETOOLONG
+# define is_ENAMETOOLONG(x) ((x) == ENAMETOOLONG)
+#else
+# define is_ENAMETOOLONG(x) 0
+#endif
+
+/* Use the getcwd function, not any macro.  */
+#undef getcwd
+
+
+
+$gl_mda_defines
+
+
+#ifndef S_IRWXU
+# define S_IRWXU 0700
+#endif
+
+/* The length of this name must be 8.  */
+#define DIR_NAME "confdir3"
+#define DIR_NAME_LEN 8
+#define DIR_NAME_SIZE (DIR_NAME_LEN + 1)
+
+/* The length of "../".  */
+#define DOTDOTSLASH_LEN 3
+
+/* Leftover bytes in the buffer, to work around library or OS bugs.  */
+#define BUF_SLOP 20
+
+int
+main ()
+{
+#ifndef PATH_MAX
+  /* The Hurd doesn't define this, so getcwd can't exhibit the bug --
+     at least not on a local file system.  And if we were to start worrying
+     about remote file systems, we'd have to enable the wrapper function
+     all of the time, just to be safe.  That's not worth the cost.  */
+  exit (0);
+#elif ((INT_MAX / (DIR_NAME_SIZE / DOTDOTSLASH_LEN + 1) \
+        - DIR_NAME_SIZE - BUF_SLOP) \
+       <= PATH_MAX)
+  /* FIXME: Assuming there's a system for which this is true,
+     this should be done in a compile test.  */
+  exit (0);
+#else
+  char buf[PATH_MAX * (DIR_NAME_SIZE / DOTDOTSLASH_LEN + 1)
+           + DIR_NAME_SIZE + BUF_SLOP];
+  char *cwd = getcwd (buf, PATH_MAX);
+  size_t initial_cwd_len;
+  size_t cwd_len;
+  int fail = 0;
+  size_t n_chdirs = 0;
+
+  if (cwd == NULL)
+    exit (10);
+
+  cwd_len = initial_cwd_len = strlen (cwd);
+
+  while (1)
+    {
+      size_t dotdot_max = PATH_MAX * (DIR_NAME_SIZE / DOTDOTSLASH_LEN);
+      char *c = NULL;
+
+      cwd_len += DIR_NAME_SIZE;
+      /* If mkdir or chdir fails, it could be that this system cannot create
+         any file with an absolute name longer than PATH_MAX, such as cygwin.
+         If so, leave fail as 0, because the current working directory can't
+         be too long for getcwd if it can't even be created.  On Linux with
+         the 9p file system, mkdir fails with error EINVAL when cwd_len gets
+         too long; ignore this failure because the getcwd() system call
+         produces good results whereas the gnulib substitute calls getdents64
+         which fails with error EPROTO.
+         For other errors, be pessimistic and consider that as a failure,
+         too.  */
+      if (mkdir (DIR_NAME, S_IRWXU) < 0 || chdir (DIR_NAME) < 0)
+        {
+          if (! (errno == ERANGE || is_ENAMETOOLONG (errno)))
+            #ifdef __linux__
+            if (! (errno == EINVAL))
+            #endif
+              fail = 20;
+          break;
+        }
+
+      if (PATH_MAX <= cwd_len && cwd_len < PATH_MAX + DIR_NAME_SIZE)
+        {
+          struct stat sb;
+
+          c = getcwd (buf, PATH_MAX);
+          if (!c && errno == ENOENT)
+            {
+              fail = 11;
+              break;
+            }
+          if (c)
+            {
+              fail = 31;
+              break;
+            }
+          if (! (errno == ERANGE || is_ENAMETOOLONG (errno)))
+            {
+              fail = 21;
+              break;
+            }
+
+          /* Our replacement needs to be able to stat() long ../../paths,
+             so generate a path larger than PATH_MAX to check,
+             avoiding the replacement if we can't stat().  */
+          c = getcwd (buf, cwd_len + 1);
+          if (c && !AT_FDCWD && stat (c, &sb) != 0 && is_ENAMETOOLONG (errno))
+            {
+              fail = 32;
+              break;
+            }
+        }
+
+      if (dotdot_max <= cwd_len - initial_cwd_len)
+        {
+          if (dotdot_max + DIR_NAME_SIZE < cwd_len - initial_cwd_len)
+            break;
+          c = getcwd (buf, cwd_len + 1);
+          if (!c)
+            {
+              if (! (errno == ERANGE || errno == ENOENT
+                     || is_ENAMETOOLONG (errno)))
+                {
+                  fail = 22;
+                  break;
+                }
+              if (AT_FDCWD || errno == ERANGE || errno == ENOENT)
+                {
+                  fail = 12;
+                  break;
+                }
+            }
+        }
+
+      if (c && strlen (c) != cwd_len)
+        {
+          fail = 23;
+          break;
+        }
+      ++n_chdirs;
+    }
+
+  /* Leaving behind such a deep directory is not polite.
+     So clean up here, right away, even though the driving
+     shell script would also clean up.  */
+  {
+    size_t i;
+
+    /* Try rmdir first, in case the chdir failed.  */
+    rmdir (DIR_NAME);
+    for (i = 0; i <= n_chdirs; i++)
+      {
+        if (chdir ("..") < 0)
+          break;
+        if (rmdir (DIR_NAME) != 0)
+          break;
+      }
+  }
+
+  exit (fail);
+#endif
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_getcwd_path_max=yes
+else $as_nop
+  case $? in
+        10|11|12) gl_cv_func_getcwd_path_max='no, but it is partly working';;
+        31) gl_cv_func_getcwd_path_max='no, it has the AIX bug';;
+        32) gl_cv_func_getcwd_path_max='yes, but with shorter paths';;
+        *) gl_cv_func_getcwd_path_max=no;;
+        esac
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getcwd_path_max" >&5
+printf "%s\n" "$gl_cv_func_getcwd_path_max" >&6; }
+
+      case "$gl_cv_func_getcwd_null" in
+        *yes)
+
+
+
+
+
+
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getpagesize" >&5
+printf %s "checking for getpagesize... " >&6; }
+if test ${gl_cv_func_getpagesize+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <unistd.h>
+int
+main (void)
+{
+return getpagesize();
+  ;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_getpagesize=yes
+else $as_nop
+  gl_cv_func_getpagesize=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getpagesize" >&5
+printf "%s\n" "$gl_cv_func_getpagesize" >&6; }
+
+  if test $gl_cv_func_getpagesize = yes; then
+
+printf "%s\n" "#define HAVE_GETPAGESIZE 1" >>confdefs.h
+
+  fi
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getcwd succeeds when 4k < cwd_length < 16k" >&5
+printf %s "checking whether getcwd succeeds when 4k < cwd_length < 16k... " >&6; }
+if test ${gl_cv_func_getcwd_succeeds_beyond_4k+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  # Remove any remnants of a previous test.
+     rm -rf confdir-14B---
+     # Arrange for deletion of the temporary directory this test creates.
+     ac_clean_files="$ac_clean_files confdir-14B---"
+          if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+             # Guess no otherwise, even on glibc systems and musl systems.
+          *) gl_cv_func_getcwd_succeeds_beyond_4k="guessing no"
+        esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <errno.h>
+#include <stdlib.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#else /* on Windows with MSVC */
+# include <direct.h>
+#endif
+#include <string.h>
+#include <sys/stat.h>
+
+
+/* Arrange to define PATH_MAX, like "pathmax.h" does. */
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <limits.h>
+#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+# include <sys/param.h>
+#endif
+#if !defined PATH_MAX && defined MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+#endif
+#ifdef __hpux
+# undef PATH_MAX
+# define PATH_MAX 1024
+#endif
+#if defined _WIN32 && ! defined __CYGWIN__
+# undef PATH_MAX
+# define PATH_MAX 260
+#endif
+
+
+
+$gl_mda_defines
+
+
+#ifndef S_IRWXU
+# define S_IRWXU 0700
+#endif
+
+/* FIXME: skip the run-test altogether on systems without getpagesize.  */
+#if ! HAVE_GETPAGESIZE
+# define getpagesize() 0
+#endif
+
+/* This size is chosen to be larger than PATH_MAX (4k), yet smaller than
+   the 16kB pagesize on ia64 linux.  Those conditions make the code below
+   trigger a bug in glibc's getcwd implementation before 2.4.90-10.  */
+#define TARGET_LEN (5 * 1024)
+
+int
+main ()
+{
+  char *cwd;
+  size_t initial_cwd_len;
+  int fail = 0;
+
+  /* The bug is triggered when PATH_MAX < getpagesize (), so skip
+     this relatively expensive and invasive test if that's not true.  */
+#ifdef PATH_MAX
+  int bug_possible = PATH_MAX < getpagesize ();
+#else
+  int bug_possible = 0;
+#endif
+  if (! bug_possible)
+    return 0;
+
+  cwd = getcwd (NULL, 0);
+  if (cwd == NULL)
+    return 2;
+
+  initial_cwd_len = strlen (cwd);
+  free (cwd);
+
+  if (1)
+    {
+      static char const dir_name[] = "confdir-14B---";
+      size_t desired_depth = ((TARGET_LEN - 1 - initial_cwd_len)
+                              / sizeof dir_name);
+      size_t d;
+      for (d = 0; d < desired_depth; d++)
+        {
+          if (mkdir (dir_name, S_IRWXU) < 0 || chdir (dir_name) < 0)
+            {
+              if (! (errno == ERANGE || errno == ENAMETOOLONG
+                     || errno == ENOENT))
+                fail = 3; /* Unable to construct deep hierarchy.  */
+              break;
+            }
+        }
+
+      /* If libc has the bug in question, this invocation of getcwd
+         results in a failed assertion.  */
+      cwd = getcwd (NULL, 0);
+      if (cwd == NULL)
+        fail = 4; /* getcwd didn't assert, but it failed for a long name
+                     where the answer could have been learned.  */
+      free (cwd);
+
+      /* Call rmdir first, in case the above chdir failed.  */
+      rmdir (dir_name);
+      while (0 < d--)
+        {
+          if (chdir ("..") < 0)
+            {
+              fail = 5;
+              break;
+            }
+          rmdir (dir_name);
+        }
+    }
+
+  return fail;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_getcwd_succeeds_beyond_4k=yes
+else $as_nop
+                                                          ret=$?
+        if test $ret -ge 128 || test $ret = 4; then
+          gl_cv_func_getcwd_succeeds_beyond_4k=no
+        else
+          gl_cv_func_getcwd_succeeds_beyond_4k=yes
+        fi
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getcwd_succeeds_beyond_4k" >&5
+printf "%s\n" "$gl_cv_func_getcwd_succeeds_beyond_4k" >&6; }
+  case "$gl_cv_func_getcwd_succeeds_beyond_4k" in
+    *no)
+      gl_abort_bug=yes
+      ;;
+    *)
+
+      ;;
+  esac
+
+          ;;
+      esac
+      ;;
+  esac
+      case "$gl_cv_func_getcwd_path_max" in
+    *"no" | *"no, it has the AIX bug") ;;
+    *)
+
+printf "%s\n" "#define HAVE_MINIMALLY_WORKING_GETCWD 1" >>confdefs.h
+
+      ;;
+  esac
+  case "$gl_cv_func_getcwd_path_max" in
+    *"no, but it is partly working")
+
+printf "%s\n" "#define HAVE_PARTLY_WORKING_GETCWD 1" >>confdefs.h
+
+      ;;
+    *"yes, but with shorter paths")
+
+printf "%s\n" "#define HAVE_GETCWD_SHORTER 1" >>confdefs.h
+
+      ;;
+  esac
+
+  if { case "$gl_cv_func_getcwd_null" in *yes) false;; *) true;; esac; } \
+     || test $gl_cv_func_getcwd_posix_signature != yes \
+     || { case "$gl_cv_func_getcwd_path_max" in *yes*) false;; *) true;; esac; } \
+     || test $gl_abort_bug = yes; then
+    REPLACE_GETCWD=1
+  fi
+
+  if test $REPLACE_GETCWD = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS getcwd.$ac_objext"
+
+
+
+
+  :
+
+  fi
+
+
+printf "%s\n" "#define GNULIB_GETCWD 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_GETCWD=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETCWD 1" >>confdefs.h
+
+
+
+
+
+
+
+  ac_fn_check_decl "$LINENO" "gethrtime" "ac_cv_have_decl_gethrtime" "#include <time.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_gethrtime" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_GETHRTIME $ac_have_decl" >>confdefs.h
+
+  LIB_GETHRXTIME=
+  if test $ac_cv_have_decl_gethrtime = no \
+     || test $gl_cv_arithmetic_hrtime_t = no; then
+
+
+
+    if test $ac_cv_func_nanouptime != yes \
+       && { test $ac_cv_have_decl_gethrtime = no \
+            || test $gl_cv_arithmetic_hrtime_t = no; }; then
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether CLOCK_MONOTONIC or CLOCK_REALTIME is defined" >&5
+printf %s "checking whether CLOCK_MONOTONIC or CLOCK_REALTIME is defined... " >&6; }
+if test ${gl_cv_have_clock_gettime_macro+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#          include <time.h>
+#          if defined CLOCK_MONOTONIC || defined CLOCK_REALTIME
+            have_clock_gettime_macro
+#          endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "have_clock_gettime_macro" >/dev/null 2>&1
+then :
+  gl_cv_have_clock_gettime_macro=yes
+else $as_nop
+  gl_cv_have_clock_gettime_macro=no
+fi
+rm -rf conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_clock_gettime_macro" >&5
+printf "%s\n" "$gl_cv_have_clock_gettime_macro" >&6; }
+      if test $gl_cv_have_clock_gettime_macro = yes; then
+        LIB_GETHRXTIME=$LIB_CLOCK_GETTIME
+      fi
+    fi
+  fi
+
+
+
+
+
+
+
+
+
+
+
+    REPLACE_GETOPT=0
+    if test -n "$gl_replace_getopt"; then
+      REPLACE_GETOPT=1
+    fi
+
+  if test $REPLACE_GETOPT = 1; then
+
+
+  if test $ac_cv_header_sys_cdefs_h = yes; then
+    HAVE_SYS_CDEFS_H=1
+  else
+    HAVE_SYS_CDEFS_H=0
+  fi
+
+
+
+printf "%s\n" "#define __GETOPT_PREFIX rpl_" >>confdefs.h
+
+  GETOPT_H=getopt.h
+  GETOPT_CDEFS_H=getopt-cdefs.h
+
+
+
+  fi
+
+  if test $REPLACE_GETOPT = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS getopt.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS getopt1.$ac_objext"
+
+
+
+
+
+
+
+  GL_GNULIB_UNISTD_H_GETOPT=1
+
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_GETOPT_POSIX=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETOPT_POSIX 1" >>confdefs.h
+
+
+
+
+
+
+  ac_found=0
+  ac_fn_check_decl "$LINENO" "program_invocation_name" "ac_cv_have_decl_program_invocation_name" "#include <errno.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_program_invocation_name" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_PROGRAM_INVOCATION_NAME $ac_have_decl" >>confdefs.h
+if test $ac_have_decl = 1
+then :
+  ac_found=1
+fi
+
+  ac_fn_check_decl "$LINENO" "program_invocation_short_name" "ac_cv_have_decl_program_invocation_short_name" "#include <errno.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_program_invocation_short_name" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME $ac_have_decl" >>confdefs.h
+if test $ac_have_decl = 1
+then :
+  ac_found=1
+fi
+
+  ac_fn_check_decl "$LINENO" "__argv" "ac_cv_have_decl___argv" "#include <stdlib.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl___argv" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL___ARGV $ac_have_decl" >>confdefs.h
+if test $ac_have_decl = 1
+then :
+  ac_found=1
+fi
+
+
+  # Incur the cost of this test only if none of the above worked.
+  if test $ac_found = 0; then
+    # On OpenBSD 5.1, using the global __progname variable appears to be
+    # the only way to implement getprogname.
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether __progname is defined in default libraries" >&5
+printf %s "checking whether __progname is defined in default libraries... " >&6; }
+if test ${gl_cv_var___progname+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+        gl_cv_var___progname=
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+extern char *__progname;
+int
+main (void)
+{
+return *__progname;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_var___progname=yes
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_var___progname" >&5
+printf "%s\n" "$gl_cv_var___progname" >&6; }
+    if test "$gl_cv_var___progname" = yes; then
+
+printf "%s\n" "#define HAVE_VAR___PROGNAME 1" >>confdefs.h
+
+    fi
+  fi
+
+
+
+
+  if test $ac_cv_func_getrusage = no; then
+    HAVE_GETRUSAGE=0
+  fi
+
+  if test $HAVE_GETRUSAGE = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS getrusage.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_GETRUSAGE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETRUSAGE 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_gettimeofday_timezone=void
+  if test $ac_cv_func_gettimeofday != yes; then
+    HAVE_GETTIMEOFDAY=0
+  else
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gettimeofday with POSIX signature" >&5
+printf %s "checking for gettimeofday with POSIX signature... " >&6; }
+if test ${gl_cv_func_gettimeofday_posix_signature+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/time.h>
+              struct timeval c;
+              int gettimeofday (struct timeval *restrict, void *restrict);
+
+int
+main (void)
+{
+/* glibc uses struct timezone * rather than the POSIX void *
+                 if _GNU_SOURCE is defined.  However, since the only portable
+                 use of gettimeofday uses NULL as the second parameter, and
+                 since the glibc definition is actually more typesafe, it is
+                 not worth wrapping this to get a compliant signature.  */
+              int (*f) (struct timeval *restrict, void *restrict)
+                = gettimeofday;
+              int x = f (&c, 0);
+              return !(x | c.tv_sec | c.tv_usec);
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_func_gettimeofday_posix_signature=yes
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/time.h>
+int gettimeofday (struct timeval *restrict, struct timezone *restrict);
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_func_gettimeofday_posix_signature=almost
+else $as_nop
+  gl_cv_func_gettimeofday_posix_signature=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_gettimeofday_posix_signature" >&5
+printf "%s\n" "$gl_cv_func_gettimeofday_posix_signature" >&6; }
+    if test $gl_cv_func_gettimeofday_posix_signature = almost; then
+      gl_gettimeofday_timezone='struct timezone'
+    elif test $gl_cv_func_gettimeofday_posix_signature != yes; then
+      REPLACE_GETTIMEOFDAY=1
+    fi
+        if test $REPLACE_STRUCT_TIMEVAL = 1; then
+      REPLACE_GETTIMEOFDAY=1
+    fi
+            case "$host_os" in
+      mingw*) REPLACE_GETTIMEOFDAY=1 ;;
+    esac
+  fi
+
+printf "%s\n" "#define GETTIMEOFDAY_TIMEZONE $gl_gettimeofday_timezone" >>confdefs.h
+
+
+  if test $HAVE_GETTIMEOFDAY = 0 || test $REPLACE_GETTIMEOFDAY = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS gettimeofday.$ac_objext"
+
+    :
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_GETTIMEOFDAY=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETTIMEOFDAY 1" >>confdefs.h
+
+
+
+  # Autoconf 2.61a.99 and earlier don't support linking a file only
+  # in VPATH builds.  But since GNUmakefile is for maintainer use
+  # only, it does not matter if we skip the link with older autoconf.
+  # Automake 1.10.1 and earlier try to remove GNUmakefile in non-VPATH
+  # builds, so use a shell variable to bypass this.
+  GNUmakefile=GNUmakefile
+  ac_config_links="$ac_config_links $GNUmakefile:$GNUmakefile"
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_ICONV=1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  if test "$am_cv_func_iconv" = yes; then
+
+
+
+
+
+
+  ICONV_H='iconv.h'
+   if test -n "$ICONV_H"; then
+  GL_GENERATE_ICONV_H_TRUE=
+  GL_GENERATE_ICONV_H_FALSE='#'
+else
+  GL_GENERATE_ICONV_H_TRUE='#'
+  GL_GENERATE_ICONV_H_FALSE=
+fi
+
+
+            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+      #include <iconv.h>
+      #if defined _LIBICONV_VERSION || (defined __GLIBC__ && !defined __UCLIBC__)
+       gnu_iconv
+      #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "gnu_iconv" >/dev/null 2>&1
+then :
+  gl_func_iconv_gnu=yes
+else $as_nop
+  gl_func_iconv_gnu=no
+fi
+rm -rf conftest*
+
+    if test $gl_func_iconv_gnu = no; then
+      iconv_flavor=
+      case "$host_os" in
+        aix*)         iconv_flavor=ICONV_FLAVOR_AIX ;;
+        irix*)        iconv_flavor=ICONV_FLAVOR_IRIX ;;
+        hpux*)        iconv_flavor=ICONV_FLAVOR_HPUX ;;
+        osf*)         iconv_flavor=ICONV_FLAVOR_OSF ;;
+        solaris*)     iconv_flavor=ICONV_FLAVOR_SOLARIS ;;
+        openedition*) iconv_flavor=ICONV_FLAVOR_ZOS ;;
+      esac
+      if test -n "$iconv_flavor"; then
+
+printf "%s\n" "#define ICONV_FLAVOR $iconv_flavor" >>confdefs.h
+
+
+
+
+
+
+
+
+  ICONV_H='iconv.h'
+   if test -n "$ICONV_H"; then
+  GL_GENERATE_ICONV_H_TRUE=
+  GL_GENERATE_ICONV_H_FALSE='#'
+else
+  GL_GENERATE_ICONV_H_TRUE='#'
+  GL_GENERATE_ICONV_H_FALSE=
+fi
+
+
+  REPLACE_ICONV_OPEN=1
+
+      fi
+    fi
+
+  fi
+
+  if test $REPLACE_ICONV_OPEN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS iconv_open.$ac_objext"
+
+  fi
+  if test $REPLACE_ICONV = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS iconv.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS iconv_close.$ac_objext"
+
+  fi
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler generally respects inline" >&5
+printf %s "checking whether the compiler generally respects inline... " >&6; }
+if test ${gl_cv_c_inline_effective+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test $ac_cv_c_inline = no; then
+       gl_cv_c_inline_effective=no
+     else
+                                          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+#ifdef __NO_INLINE__
+               #error "inline is not effective"
+             #endif
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_c_inline_effective=yes
+else $as_nop
+  gl_cv_c_inline_effective=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+     fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_inline_effective" >&5
+printf "%s\n" "$gl_cv_c_inline_effective" >&6; }
+  if test $gl_cv_c_inline_effective = yes; then
+
+printf "%s\n" "#define HAVE_INLINE 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  # If we replaced any of the underlying isnan* functions, replace
+  # the isnan macro; it undoubtedly suffers from the same flaws.
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan macro works" >&5
+printf %s "checking whether isnan macro works... " >&6; }
+  if test $gl_func_isnanf = yes \
+     && test $gl_func_isnand = yes \
+     && test $gl_func_isnanl = yes; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+    ISNAN_LIBM=
+        case " $ISNAN_LIBM " in
+      *" $ISNANF_LIBM "*) ;;
+      *) ISNAN_LIBM="$ISNAN_LIBM $ISNANF_LIBM" ;;
+    esac
+        case " $ISNAN_LIBM " in
+      *" $ISNAND_LIBM "*) ;;
+      *) ISNAN_LIBM="$ISNAN_LIBM $ISNAND_LIBM" ;;
+    esac
+        case " $ISNAN_LIBM " in
+      *" $ISNANL_LIBM "*) ;;
+      *) ISNAN_LIBM="$ISNAN_LIBM $ISNANL_LIBM" ;;
+    esac
+  else
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+        REPLACE_ISNAN=1
+    ISNAN_LIBM=
+  fi
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_ISNAN=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_ISNAN 1" >>confdefs.h
+
+
+
+
+
+  ISNAND_LIBM=
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used without linking with libm" >&5
+printf %s "checking whether isnan(double) can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_isnand_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+             # undef isnand
+             # define isnand(x) __builtin_isnan ((double)(x))
+             #else
+             # undef isnand
+             # define isnand(x) isnan ((double)(x))
+             #endif
+             double x;
+int
+main (void)
+{
+return isnand (x);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_isnand_no_libm=yes
+else $as_nop
+  gl_cv_func_isnand_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_no_libm" >&5
+printf "%s\n" "$gl_cv_func_isnand_no_libm" >&6; }
+
+  if test $gl_cv_func_isnand_no_libm = no; then
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used with libm" >&5
+printf %s "checking whether isnan(double) can be used with libm... " >&6; }
+if test ${gl_cv_func_isnand_in_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      save_LIBS="$LIBS"
+      LIBS="$LIBS -lm"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+             # undef isnand
+             # define isnand(x) __builtin_isnan ((double)(x))
+             #elif defined isnan
+             # undef isnand
+             # define isnand(x) isnan ((double)(x))
+             #endif
+             double x;
+int
+main (void)
+{
+return isnand (x);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_isnand_in_libm=yes
+else $as_nop
+  gl_cv_func_isnand_in_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+      LIBS="$save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_in_libm" >&5
+printf "%s\n" "$gl_cv_func_isnand_in_libm" >&6; }
+
+    if test $gl_cv_func_isnand_in_libm = yes; then
+      ISNAND_LIBM=-lm
+    fi
+  fi
+    if test $gl_cv_func_isnand_no_libm = yes \
+     || test $gl_cv_func_isnand_in_libm = yes; then
+    gl_func_isnand=yes
+  else
+    gl_func_isnand=no
+    HAVE_ISNAND=0
+  fi
+
+
+
+
+
+  if test $HAVE_ISNAND = 0 || test $REPLACE_ISNAN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS isnand.$ac_objext"
+
+
+
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_ISNAND=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_ISNAND 1" >>confdefs.h
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used without linking with libm" >&5
+printf %s "checking whether isnan(double) can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_isnand_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+             # undef isnand
+             # define isnand(x) __builtin_isnan ((double)(x))
+             #else
+             # undef isnand
+             # define isnand(x) isnan ((double)(x))
+             #endif
+             double x;
+int
+main (void)
+{
+return isnand (x);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_isnand_no_libm=yes
+else $as_nop
+  gl_cv_func_isnand_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_no_libm" >&5
+printf "%s\n" "$gl_cv_func_isnand_no_libm" >&6; }
+
+  gl_func_isnand_no_libm=$gl_cv_func_isnand_no_libm
+  if test $gl_cv_func_isnand_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_ISNAND_IN_LIBC 1" >>confdefs.h
+
+  fi
+
+  if test $gl_func_isnand_no_libm != yes; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS isnand.$ac_objext"
+
+
+
+
+  fi
+
+
+  ISNANF_LIBM=
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used without linking with libm" >&5
+printf %s "checking whether isnan(float) can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_isnanf_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+             # undef isnanf
+             # define isnanf(x) __builtin_isnan ((float)(x))
+             #elif defined isnan
+             # undef isnanf
+             # define isnanf(x) isnan ((float)(x))
+             #endif
+             float x;
+int
+main (void)
+{
+return isnanf (x);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_isnanf_no_libm=yes
+else $as_nop
+  gl_cv_func_isnanf_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_no_libm" >&5
+printf "%s\n" "$gl_cv_func_isnanf_no_libm" >&6; }
+
+  if test $gl_cv_func_isnanf_no_libm = no; then
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used with libm" >&5
+printf %s "checking whether isnan(float) can be used with libm... " >&6; }
+if test ${gl_cv_func_isnanf_in_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      save_LIBS="$LIBS"
+      LIBS="$LIBS -lm"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+             # undef isnanf
+             # define isnanf(x) __builtin_isnan ((float)(x))
+             #elif defined isnan
+             # undef isnanf
+             # define isnanf(x) isnan ((float)(x))
+             #endif
+             float x;
+int
+main (void)
+{
+return isnanf (x);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_isnanf_in_libm=yes
+else $as_nop
+  gl_cv_func_isnanf_in_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+      LIBS="$save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_in_libm" >&5
+printf "%s\n" "$gl_cv_func_isnanf_in_libm" >&6; }
+
+    if test $gl_cv_func_isnanf_in_libm = yes; then
+      ISNANF_LIBM=-lm
+    fi
+  fi
+    if test $gl_cv_func_isnanf_no_libm = yes \
+     || test $gl_cv_func_isnanf_in_libm = yes; then
+    save_LIBS="$LIBS"
+    LIBS="$LIBS $ISNANF_LIBM"
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) works" >&5
+printf %s "checking whether isnan(float) works... " >&6; }
+if test ${gl_cv_func_isnanf_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+           irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;;
+           mingw*) # Guess yes on mingw, no on MSVC.
+             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef __MINGW32__
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Known" >/dev/null 2>&1
+then :
+  gl_cv_func_isnanf_works="guessing yes"
+else $as_nop
+  gl_cv_func_isnanf_works="guessing no"
+fi
+rm -rf conftest*
+
+             ;;
+           *) gl_cv_func_isnanf_works="guessing yes" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <math.h>
+#if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# undef isnanf
+# define isnanf(x) __builtin_isnan ((float)(x))
+#elif defined isnan
+# undef isnanf
+# define isnanf(x) isnan ((float)(x))
+#endif
+/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0.  */
+#ifdef __DECC
+static float
+NaN ()
+{
+  static float zero = 0.0f;
+  return zero / zero;
+}
+#else
+# define NaN() (0.0f / 0.0f)
+#endif
+#define NWORDS \
+  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { unsigned int word[NWORDS]; float value; } memory_float;
+int main()
+{
+  int result = 0;
+
+  if (isnanf (1.0f / 0.0f))
+    result |= 1;
+
+  if (!isnanf (NaN ()))
+    result |= 2;
+
+#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
+  /* The isnanf function should be immune against changes in the sign bit and
+     in the mantissa bits.  The xor operation twiddles a bit that can only be
+     a sign bit or a mantissa bit.  */
+  if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0)
+    {
+      memory_float m;
+
+      m.value = NaN ();
+      /* Set the bits below the exponent to 01111...111.  */
+      m.word[0] &= -1U << FLT_EXPBIT0_BIT;
+      m.word[0] |= (1U << (FLT_EXPBIT0_BIT - 1)) - 1;
+      if (!isnanf (m.value))
+        result |= 4;
+    }
+#endif
+
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_isnanf_works=yes
+else $as_nop
+  gl_cv_func_isnanf_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_works" >&5
+printf "%s\n" "$gl_cv_func_isnanf_works" >&6; }
+
+    LIBS="$save_LIBS"
+    case "$gl_cv_func_isnanf_works" in
+      *yes) gl_func_isnanf=yes ;;
+      *)    gl_func_isnanf=no; ISNANF_LIBM= ;;
+    esac
+  else
+    gl_func_isnanf=no
+  fi
+  if test $gl_func_isnanf != yes; then
+    HAVE_ISNANF=0
+  fi
+
+
+
+
+
+  if test $HAVE_ISNANF = 0 || test $REPLACE_ISNAN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS isnanf.$ac_objext"
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5
+printf %s "checking where to find the exponent in a 'float'... " >&6; }
+if test ${gl_cv_cc_float_expbit0+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  gl_cv_cc_float_expbit0="word 0 bit 23"
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { float value; unsigned int word[NWORDS]; } memory_float;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (float x)
+{
+  memory_float m;
+  size_t i;
+  /* Clear it first, in case
+     sizeof (float) < sizeof (memory_float).  */
+  memset (&m, 0, sizeof (memory_float));
+  m.value = x;
+  for (i = 0; i < NWORDS; i++)
+    {
+      ored_words[i] |= m.word[i];
+      anded_words[i] &= m.word[i];
+    }
+}
+int main ()
+{
+  size_t j;
+  FILE *fp = fopen ("conftest.out", "w");
+  if (fp == NULL)
+    return 1;
+  for (j = 0; j < NWORDS; j++)
+    anded_words[j] = ~ (unsigned int) 0;
+  add_to_ored_words (0.25f);
+  add_to_ored_words (0.5f);
+  add_to_ored_words (1.0f);
+  add_to_ored_words (2.0f);
+  add_to_ored_words (4.0f);
+  /* Remove bits that are common (e.g. if representation of the first mantissa
+     bit is explicit).  */
+  for (j = 0; j < NWORDS; j++)
+    ored_words[j] &= ~anded_words[j];
+  /* Now find the nonzero word.  */
+  for (j = 0; j < NWORDS; j++)
+    if (ored_words[j] != 0)
+      break;
+  if (j < NWORDS)
+    {
+      size_t i;
+      for (i = j + 1; i < NWORDS; i++)
+        if (ored_words[i] != 0)
+          {
+            fprintf (fp, "unknown");
+            return (fclose (fp) != 0);
+          }
+      for (i = 0; ; i++)
+        if ((ored_words[j] >> i) & 1)
+          {
+            fprintf (fp, "word %d bit %d", (int) j, (int) i);
+            return (fclose (fp) != 0);
+          }
+    }
+  fprintf (fp, "unknown");
+  return (fclose (fp) != 0);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_cc_float_expbit0=`cat conftest.out`
+else $as_nop
+  gl_cv_cc_float_expbit0="unknown"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      rm -f conftest.out
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5
+printf "%s\n" "$gl_cv_cc_float_expbit0" >&6; }
+  case "$gl_cv_cc_float_expbit0" in
+    word*bit*)
+      word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+      bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'`
+
+printf "%s\n" "#define FLT_EXPBIT0_WORD $word" >>confdefs.h
+
+
+printf "%s\n" "#define FLT_EXPBIT0_BIT $bit" >>confdefs.h
+
+      ;;
+  esac
+
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_ISNANF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_ISNANF 1" >>confdefs.h
+
+
+
+
+
+  ISNANL_LIBM=
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used without linking with libm" >&5
+printf %s "checking whether isnan(long double) can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_isnanl_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+             # undef isnanl
+             # define isnanl(x) __builtin_isnan ((long double)(x))
+             #elif defined isnan
+             # undef isnanl
+             # define isnanl(x) isnan ((long double)(x))
+             #endif
+             long double x;
+int
+main (void)
+{
+return isnanl (x);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_isnanl_no_libm=yes
+else $as_nop
+  gl_cv_func_isnanl_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_no_libm" >&5
+printf "%s\n" "$gl_cv_func_isnanl_no_libm" >&6; }
+
+  if test $gl_cv_func_isnanl_no_libm = no; then
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used with libm" >&5
+printf %s "checking whether isnan(long double) can be used with libm... " >&6; }
+if test ${gl_cv_func_isnanl_in_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      save_LIBS="$LIBS"
+      LIBS="$LIBS -lm"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+             # undef isnanl
+             # define isnanl(x) __builtin_isnan ((long double)(x))
+             #elif defined isnan
+             # undef isnanl
+             # define isnanl(x) isnan ((long double)(x))
+             #endif
+             long double x;
+int
+main (void)
+{
+return isnanl (x);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_isnanl_in_libm=yes
+else $as_nop
+  gl_cv_func_isnanl_in_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+      LIBS="$save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_in_libm" >&5
+printf "%s\n" "$gl_cv_func_isnanl_in_libm" >&6; }
+
+    if test $gl_cv_func_isnanl_in_libm = yes; then
+      ISNANL_LIBM=-lm
+    fi
+  fi
+    if test $gl_cv_func_isnanl_no_libm = yes \
+     || test $gl_cv_func_isnanl_in_libm = yes; then
+    save_LIBS="$LIBS"
+    LIBS="$LIBS $ISNANL_LIBM"
+
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnanl works" >&5
+printf %s "checking whether isnanl works... " >&6; }
+if test ${gl_cv_func_isnanl_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+           mingw*) # Guess yes on mingw, no on MSVC.
+             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef __MINGW32__
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Known" >/dev/null 2>&1
+then :
+  gl_cv_func_isnanl_works="guessing yes"
+else $as_nop
+  gl_cv_func_isnanl_works="guessing no"
+fi
+rm -rf conftest*
+
+             ;;
+           *) gl_cv_func_isnanl_works="guessing yes" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# undef isnanl
+# define isnanl(x) __builtin_isnan ((long double)(x))
+#elif defined isnan
+# undef isnanl
+# define isnanl(x) isnan ((long double)(x))
+#endif
+#define NWORDS \
+  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { unsigned int word[NWORDS]; long double value; }
+        memory_long_double;
+/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
+   runtime type conversion.  */
+#ifdef __sgi
+static long double NaNl ()
+{
+  double zero = 0.0;
+  return zero / zero;
+}
+#else
+# define NaNl() (0.0L / 0.0L)
+#endif
+int main ()
+{
+  int result = 0;
+
+  if (!isnanl (NaNl ()))
+    result |= 1;
+
+  {
+    memory_long_double m;
+    unsigned int i;
+
+    /* The isnanl function should be immune against changes in the sign bit and
+       in the mantissa bits.  The xor operation twiddles a bit that can only be
+       a sign bit or a mantissa bit (since the exponent never extends to
+       bit 31).  */
+    m.value = NaNl ();
+    m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+    for (i = 0; i < NWORDS; i++)
+      m.word[i] |= 1;
+    if (!isnanl (m.value))
+      result |= 1;
+  }
+
+#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+   of 'unsigned int' words.  */
+# ifdef WORDS_BIGENDIAN
+#  define LDBL80_WORDS(exponent,manthi,mantlo) \
+     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+       ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16),   \
+       (unsigned int) (mantlo) << 16                                        \
+     }
+# else
+#  define LDBL80_WORDS(exponent,manthi,mantlo) \
+     { mantlo, manthi, exponent }
+# endif
+  { /* Quiet NaN.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+    if (!isnanl (x.value))
+      result |= 2;
+  }
+  {
+    /* Signalling NaN.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+    if (!isnanl (x.value))
+      result |= 2;
+  }
+  /* isnanl should return something even for noncanonical values.  */
+  { /* Pseudo-NaN.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+    if (isnanl (x.value) && !isnanl (x.value))
+      result |= 4;
+  }
+  { /* Pseudo-Infinity.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+    if (isnanl (x.value) && !isnanl (x.value))
+      result |= 8;
+  }
+  { /* Pseudo-Zero.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+    if (isnanl (x.value) && !isnanl (x.value))
+      result |= 16;
+  }
+  { /* Unnormalized number.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+    if (isnanl (x.value) && !isnanl (x.value))
+      result |= 32;
+  }
+  { /* Pseudo-Denormal.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+    if (isnanl (x.value) && !isnanl (x.value))
+      result |= 64;
+  }
+#endif
+
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_isnanl_works=yes
+else $as_nop
+  gl_cv_func_isnanl_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_works" >&5
+printf "%s\n" "$gl_cv_func_isnanl_works" >&6; }
+
+    LIBS="$save_LIBS"
+    case "$gl_cv_func_isnanl_works" in
+      *yes) gl_func_isnanl=yes ;;
+      *)    gl_func_isnanl=no; ISNANL_LIBM= ;;
+    esac
+  else
+    gl_func_isnanl=no
+  fi
+  if test $gl_func_isnanl != yes; then
+    HAVE_ISNANL=0
+  fi
+
+
+
+
+
+  if test $HAVE_ISNANL = 0 || test $REPLACE_ISNAN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS isnanl.$ac_objext"
+
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'long double'" >&5
+printf %s "checking where to find the exponent in a 'long double'... " >&6; }
+if test ${gl_cv_cc_long_double_expbit0+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+                              gl_cv_cc_long_double_expbit0="unknown"
+          case "$host_os" in
+            mingw*) # On native Windows (little-endian), we know the result
+                    # in two cases: mingw, MSVC.
+              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef __MINGW32__
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Known" >/dev/null 2>&1
+then :
+  gl_cv_cc_long_double_expbit0="word 2 bit 0"
+fi
+rm -rf conftest*
+
+              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef _MSC_VER
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Known" >/dev/null 2>&1
+then :
+  gl_cv_cc_long_double_expbit0="word 1 bit 20"
+fi
+rm -rf conftest*
+
+              ;;
+          esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { long double value; unsigned int word[NWORDS]; }
+        memory_long_double;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (long double *x)
+{
+  memory_long_double m;
+  size_t i;
+  /* Clear it first, in case
+     sizeof (long double) < sizeof (memory_long_double).  */
+  memset (&m, 0, sizeof (memory_long_double));
+  m.value = *x;
+  for (i = 0; i < NWORDS; i++)
+    {
+      ored_words[i] |= m.word[i];
+      anded_words[i] &= m.word[i];
+    }
+}
+int main ()
+{
+  static long double samples[5] = { 0.25L, 0.5L, 1.0L, 2.0L, 4.0L };
+  size_t j;
+  FILE *fp = fopen ("conftest.out", "w");
+  if (fp == NULL)
+    return 1;
+  for (j = 0; j < NWORDS; j++)
+    anded_words[j] = ~ (unsigned int) 0;
+  for (j = 0; j < 5; j++)
+    add_to_ored_words (&samples[j]);
+  /* Remove bits that are common (e.g. if representation of the first mantissa
+     bit is explicit).  */
+  for (j = 0; j < NWORDS; j++)
+    ored_words[j] &= ~anded_words[j];
+  /* Now find the nonzero word.  */
+  for (j = 0; j < NWORDS; j++)
+    if (ored_words[j] != 0)
+      break;
+  if (j < NWORDS)
+    {
+      size_t i;
+      for (i = j + 1; i < NWORDS; i++)
+        if (ored_words[i] != 0)
+          {
+            fprintf (fp, "unknown");
+            return (fclose (fp) != 0);
+          }
+      for (i = 0; ; i++)
+        if ((ored_words[j] >> i) & 1)
+          {
+            fprintf (fp, "word %d bit %d", (int) j, (int) i);
+            return (fclose (fp) != 0);
+          }
+    }
+  fprintf (fp, "unknown");
+  return (fclose (fp) != 0);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_cc_long_double_expbit0=`cat conftest.out`
+else $as_nop
+  gl_cv_cc_long_double_expbit0="unknown"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      rm -f conftest.out
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_expbit0" >&5
+printf "%s\n" "$gl_cv_cc_long_double_expbit0" >&6; }
+  case "$gl_cv_cc_long_double_expbit0" in
+    word*bit*)
+      word=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+      bit=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word.*bit //'`
+
+printf "%s\n" "#define LDBL_EXPBIT0_WORD $word" >>confdefs.h
+
+
+printf "%s\n" "#define LDBL_EXPBIT0_BIT $bit" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_ISNANL=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_ISNANL 1" >>confdefs.h
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used without linking with libm" >&5
+printf %s "checking whether isnan(long double) can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_isnanl_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+             # undef isnanl
+             # define isnanl(x) __builtin_isnan ((long double)(x))
+             #elif defined isnan
+             # undef isnanl
+             # define isnanl(x) isnan ((long double)(x))
+             #endif
+             long double x;
+int
+main (void)
+{
+return isnanl (x);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_isnanl_no_libm=yes
+else $as_nop
+  gl_cv_func_isnanl_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_no_libm" >&5
+printf "%s\n" "$gl_cv_func_isnanl_no_libm" >&6; }
+
+  gl_func_isnanl_no_libm=$gl_cv_func_isnanl_no_libm
+  if test $gl_func_isnanl_no_libm = yes; then
+
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnanl works" >&5
+printf %s "checking whether isnanl works... " >&6; }
+if test ${gl_cv_func_isnanl_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+           mingw*) # Guess yes on mingw, no on MSVC.
+             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef __MINGW32__
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Known" >/dev/null 2>&1
+then :
+  gl_cv_func_isnanl_works="guessing yes"
+else $as_nop
+  gl_cv_func_isnanl_works="guessing no"
+fi
+rm -rf conftest*
+
+             ;;
+           *) gl_cv_func_isnanl_works="guessing yes" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# undef isnanl
+# define isnanl(x) __builtin_isnan ((long double)(x))
+#elif defined isnan
+# undef isnanl
+# define isnanl(x) isnan ((long double)(x))
+#endif
+#define NWORDS \
+  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { unsigned int word[NWORDS]; long double value; }
+        memory_long_double;
+/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
+   runtime type conversion.  */
+#ifdef __sgi
+static long double NaNl ()
+{
+  double zero = 0.0;
+  return zero / zero;
+}
+#else
+# define NaNl() (0.0L / 0.0L)
+#endif
+int main ()
+{
+  int result = 0;
+
+  if (!isnanl (NaNl ()))
+    result |= 1;
+
+  {
+    memory_long_double m;
+    unsigned int i;
+
+    /* The isnanl function should be immune against changes in the sign bit and
+       in the mantissa bits.  The xor operation twiddles a bit that can only be
+       a sign bit or a mantissa bit (since the exponent never extends to
+       bit 31).  */
+    m.value = NaNl ();
+    m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
+    for (i = 0; i < NWORDS; i++)
+      m.word[i] |= 1;
+    if (!isnanl (m.value))
+      result |= 1;
+  }
+
+#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+   of 'unsigned int' words.  */
+# ifdef WORDS_BIGENDIAN
+#  define LDBL80_WORDS(exponent,manthi,mantlo) \
+     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+       ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16),   \
+       (unsigned int) (mantlo) << 16                                        \
+     }
+# else
+#  define LDBL80_WORDS(exponent,manthi,mantlo) \
+     { mantlo, manthi, exponent }
+# endif
+  { /* Quiet NaN.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+    if (!isnanl (x.value))
+      result |= 2;
+  }
+  {
+    /* Signalling NaN.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+    if (!isnanl (x.value))
+      result |= 2;
+  }
+  /* isnanl should return something even for noncanonical values.  */
+  { /* Pseudo-NaN.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+    if (isnanl (x.value) && !isnanl (x.value))
+      result |= 4;
+  }
+  { /* Pseudo-Infinity.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+    if (isnanl (x.value) && !isnanl (x.value))
+      result |= 8;
+  }
+  { /* Pseudo-Zero.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+    if (isnanl (x.value) && !isnanl (x.value))
+      result |= 16;
+  }
+  { /* Unnormalized number.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+    if (isnanl (x.value) && !isnanl (x.value))
+      result |= 32;
+  }
+  { /* Pseudo-Denormal.  */
+    static memory_long_double x =
+      { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+    if (isnanl (x.value) && !isnanl (x.value))
+      result |= 64;
+  }
+#endif
+
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_isnanl_works=yes
+else $as_nop
+  gl_cv_func_isnanl_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_works" >&5
+printf "%s\n" "$gl_cv_func_isnanl_works" >&6; }
+
+    case "$gl_cv_func_isnanl_works" in
+      *yes) ;;
+      *)    gl_func_isnanl_no_libm=no ;;
+    esac
+  fi
+  if test $gl_func_isnanl_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_ISNANL_IN_LIBC 1" >>confdefs.h
+
+  fi
+
+  if test $gl_func_isnanl_no_libm != yes; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS isnanl.$ac_objext"
+
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'long double'" >&5
+printf %s "checking where to find the exponent in a 'long double'... " >&6; }
+if test ${gl_cv_cc_long_double_expbit0+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+                              gl_cv_cc_long_double_expbit0="unknown"
+          case "$host_os" in
+            mingw*) # On native Windows (little-endian), we know the result
+                    # in two cases: mingw, MSVC.
+              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef __MINGW32__
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Known" >/dev/null 2>&1
+then :
+  gl_cv_cc_long_double_expbit0="word 2 bit 0"
+fi
+rm -rf conftest*
+
+              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef _MSC_VER
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Known" >/dev/null 2>&1
+then :
+  gl_cv_cc_long_double_expbit0="word 1 bit 20"
+fi
+rm -rf conftest*
+
+              ;;
+          esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { long double value; unsigned int word[NWORDS]; }
+        memory_long_double;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (long double *x)
+{
+  memory_long_double m;
+  size_t i;
+  /* Clear it first, in case
+     sizeof (long double) < sizeof (memory_long_double).  */
+  memset (&m, 0, sizeof (memory_long_double));
+  m.value = *x;
+  for (i = 0; i < NWORDS; i++)
+    {
+      ored_words[i] |= m.word[i];
+      anded_words[i] &= m.word[i];
+    }
+}
+int main ()
+{
+  static long double samples[5] = { 0.25L, 0.5L, 1.0L, 2.0L, 4.0L };
+  size_t j;
+  FILE *fp = fopen ("conftest.out", "w");
+  if (fp == NULL)
+    return 1;
+  for (j = 0; j < NWORDS; j++)
+    anded_words[j] = ~ (unsigned int) 0;
+  for (j = 0; j < 5; j++)
+    add_to_ored_words (&samples[j]);
+  /* Remove bits that are common (e.g. if representation of the first mantissa
+     bit is explicit).  */
+  for (j = 0; j < NWORDS; j++)
+    ored_words[j] &= ~anded_words[j];
+  /* Now find the nonzero word.  */
+  for (j = 0; j < NWORDS; j++)
+    if (ored_words[j] != 0)
+      break;
+  if (j < NWORDS)
+    {
+      size_t i;
+      for (i = j + 1; i < NWORDS; i++)
+        if (ored_words[i] != 0)
+          {
+            fprintf (fp, "unknown");
+            return (fclose (fp) != 0);
+          }
+      for (i = 0; ; i++)
+        if ((ored_words[j] >> i) & 1)
+          {
+            fprintf (fp, "word %d bit %d", (int) j, (int) i);
+            return (fclose (fp) != 0);
+          }
+    }
+  fprintf (fp, "unknown");
+  return (fclose (fp) != 0);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_cc_long_double_expbit0=`cat conftest.out`
+else $as_nop
+  gl_cv_cc_long_double_expbit0="unknown"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      rm -f conftest.out
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_expbit0" >&5
+printf "%s\n" "$gl_cv_cc_long_double_expbit0" >&6; }
+  case "$gl_cv_cc_long_double_expbit0" in
+    word*bit*)
+      word=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+      bit=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word.*bit //'`
+
+printf "%s\n" "#define LDBL_EXPBIT0_WORD $word" >>confdefs.h
+
+
+printf "%s\n" "#define LDBL_EXPBIT0_BIT $bit" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  fi
+
+
+
+
+
+  ac_fn_check_decl "$LINENO" "iswblank" "ac_cv_have_decl_iswblank" "
+    #include <wchar.h>
+    #include <wctype.h>
+
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_iswblank" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_ISWBLANK $ac_have_decl" >>confdefs.h
+
+  if test $ac_cv_func_iswblank = no; then
+    HAVE_ISWBLANK=0
+    if test $ac_cv_have_decl_iswblank = yes; then
+      REPLACE_ISWBLANK=1
+    fi
+  fi
+  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+        :
+  else
+    if test $HAVE_ISWBLANK = 0 || test $REPLACE_ISWBLANK = 1; then
+            :
+    fi
+  fi
+
+
+  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+    :
+  else
+    if test $HAVE_ISWBLANK = 0 || test $REPLACE_ISWBLANK = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS iswblank.$ac_objext"
+
+    fi
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_ISWBLANK=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_ISWBLANK 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+        REPLACE_ISWDIGIT="$REPLACE_ISWCNTRL"
+  else
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether iswdigit is ISO C compliant" >&5
+printf %s "checking whether iswdigit is ISO C compliant... " >&6; }
+if test ${gl_cv_func_iswdigit_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+                     case "$host_os" in
+         # Guess no on FreeBSD, NetBSD, Solaris, native Windows.
+         freebsd* | dragonfly* | netbsd* | solaris* | mingw*)
+           gl_cv_func_iswdigit_works="guessing no" ;;
+         # Guess yes otherwise.
+         *) gl_cv_func_iswdigit_works="guessing yes" ;;
+       esac
+       if test $LOCALE_FR != none || test $LOCALE_JA != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_ZH_CN != none; then
+         if test "$cross_compiling" = yes
+then :
+  :
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+/* Returns the value of iswdigit for the multibyte character s[0..n-1].  */
+static int
+for_character (const char *s, size_t n)
+{
+  mbstate_t state;
+  wchar_t wc;
+  size_t ret;
+
+  memset (&state, '\0', sizeof (mbstate_t));
+  wc = (wchar_t) 0xBADFACE;
+  ret = mbrtowc (&wc, s, n, &state);
+  if (ret != n)
+    abort ();
+
+  return iswdigit (wc);
+}
+
+int
+main (int argc, char *argv[])
+{
+  int is;
+  int result = 0;
+
+  if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
+    {
+      /* This fails on mingw, MSVC 14.  */
+      /* U+00B2 SUPERSCRIPT TWO */
+      is = for_character ("\262", 1);
+      if (!(is == 0))
+        result |= 1;
+    }
+  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+    {
+      /* This fails on NetBSD 8.0.  */
+      /* U+FF11 FULLWIDTH DIGIT ONE */
+      is = for_character ("\243\261", 2);
+      if (!(is == 0))
+        result |= 2;
+    }
+  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+    {
+      /* This fails on FreeBSD 13.0, NetBSD 8.0, MSVC 14.  */
+      /* U+0663 ARABIC-INDIC DIGIT THREE */
+      is = for_character ("\331\243", 2);
+      if (!(is == 0))
+        result |= 4;
+      /* This fails on FreeBSD 13.0, NetBSD 8.0, MSVC 14.  */
+      /* U+FF11 FULLWIDTH DIGIT ONE */
+      is = for_character ("\357\274\221", 3);
+      if (!(is == 0))
+        result |= 8;
+    }
+  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+    {
+      /* This fails on NetBSD 8.0, Solaris 10, Solaris 11.4.  */
+      /* U+FF11 FULLWIDTH DIGIT ONE */
+      is = for_character ("\243\261", 2);
+      if (!(is == 0))
+        result |= 16;
+    }
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_iswdigit_works=yes
+else $as_nop
+  gl_cv_func_iswdigit_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+       fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswdigit_works" >&5
+printf "%s\n" "$gl_cv_func_iswdigit_works" >&6; }
+    case "$gl_cv_func_iswdigit_works" in
+      *yes) ;;
+      *) REPLACE_ISWDIGIT=1 ;;
+    esac
+  fi
+
+  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+    :
+  else
+    if test $REPLACE_ISWDIGIT = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS iswdigit.$ac_objext"
+
+    fi
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_ISWDIGIT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_ISWDIGIT 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+        REPLACE_ISWXDIGIT="$REPLACE_ISWCNTRL"
+  else
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether iswxdigit is ISO C compliant" >&5
+printf %s "checking whether iswxdigit is ISO C compliant... " >&6; }
+if test ${gl_cv_func_iswxdigit_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+                     case "$host_os" in
+         # Guess no on FreeBSD, NetBSD, Solaris, native Windows.
+         freebsd* | dragonfly* | netbsd* | solaris* | mingw*)
+           gl_cv_func_iswxdigit_works="guessing no" ;;
+         # Guess yes otherwise.
+         *) gl_cv_func_iswxdigit_works="guessing yes" ;;
+       esac
+       if test $LOCALE_JA != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_ZH_CN != none; then
+         if test "$cross_compiling" = yes
+then :
+  :
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+/* Returns the value of iswxdigit for the multibyte character s[0..n-1].  */
+static int
+for_character (const char *s, size_t n)
+{
+  mbstate_t state;
+  wchar_t wc;
+  size_t ret;
+
+  memset (&state, '\0', sizeof (mbstate_t));
+  wc = (wchar_t) 0xBADFACE;
+  ret = mbrtowc (&wc, s, n, &state);
+  if (ret != n)
+    abort ();
+
+  return iswxdigit (wc);
+}
+
+int
+main (int argc, char *argv[])
+{
+  int is;
+  int result = 0;
+
+  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+    {
+      /* This fails on NetBSD 8.0.  */
+      /* U+FF21 FULLWIDTH LATIN CAPITAL LETTER A */
+      is = for_character ("\243\301", 2);
+      if (!(is == 0))
+        result |= 1;
+    }
+  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+    {
+      /* This fails on FreeBSD 13.0.  */
+      /* U+0663 ARABIC-INDIC DIGIT THREE */
+      is = for_character ("\331\243", 2);
+      if (!(is == 0))
+        result |= 2;
+      /* This fails on MSVC 14.  */
+      /* U+FF21 FULLWIDTH LATIN CAPITAL LETTER A */
+      is = for_character ("\357\274\241", 3);
+      if (!(is == 0))
+        result |= 4;
+    }
+  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+    {
+      /* This fails on Solaris 10, Solaris 11.4.  */
+      /* U+FF11 FULLWIDTH DIGIT ONE */
+      is = for_character ("\243\261", 2);
+      if (!(is == 0))
+        result |= 8;
+    }
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_iswxdigit_works=yes
+else $as_nop
+  gl_cv_func_iswxdigit_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+       fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswxdigit_works" >&5
+printf "%s\n" "$gl_cv_func_iswxdigit_works" >&6; }
+    case "$gl_cv_func_iswxdigit_works" in
+      *yes) ;;
+      *) REPLACE_ISWXDIGIT=1 ;;
+    esac
+  fi
+
+  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+    :
+  else
+    if test $REPLACE_ISWXDIGIT = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS iswxdigit.$ac_objext"
+
+    fi
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_ISWXDIGIT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_ISWXDIGIT 1" >>confdefs.h
+
+
+
+  # You need to invoke gt_JAVACOMP yourself, possibly with arguments.
+  ac_config_files="$ac_config_files javacomp.sh:build-aux/javacomp.sh.in"
+
+  # You need to invoke gt_JAVAEXEC yourself, possibly with arguments.
+  ac_config_files="$ac_config_files javaexec.sh:build-aux/javaexec.sh.in"
+
+
+
+
+
+
+
+
+      ac_fn_check_decl "$LINENO" "ldexpl" "ac_cv_have_decl_ldexpl" "#include <math.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_ldexpl" = xyes
+then :
+
+else $as_nop
+  HAVE_DECL_LDEXPL=0
+fi
+
+  LDEXPL_LIBM=
+  if test $HAVE_DECL_LDEXPL = 1; then
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ldexpl() can be used without linking with libm" >&5
+printf %s "checking whether ldexpl() can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_ldexpl_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             long double x;
+int
+main (void)
+{
+return ldexpl (x, -1) > 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_ldexpl_no_libm=yes
+else $as_nop
+  gl_cv_func_ldexpl_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_no_libm" >&5
+printf "%s\n" "$gl_cv_func_ldexpl_no_libm" >&6; }
+
+    if test $gl_cv_func_ldexpl_no_libm = no; then
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ldexpl() can be used with libm" >&5
+printf %s "checking whether ldexpl() can be used with libm... " >&6; }
+if test ${gl_cv_func_ldexpl_in_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+          save_LIBS="$LIBS"
+          LIBS="$LIBS -lm"
+          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+                 long double x;
+int
+main (void)
+{
+return ldexpl (x, -1) > 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_ldexpl_in_libm=yes
+else $as_nop
+  gl_cv_func_ldexpl_in_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+          LIBS="$save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_in_libm" >&5
+printf "%s\n" "$gl_cv_func_ldexpl_in_libm" >&6; }
+      if test $gl_cv_func_ldexpl_in_libm = yes; then
+        LDEXPL_LIBM=-lm
+      fi
+    fi
+    if test $gl_cv_func_ldexpl_no_libm = yes \
+       || test $gl_cv_func_ldexpl_in_libm = yes; then
+      save_LIBS="$LIBS"
+      LIBS="$LIBS $LDEXPL_LIBM"
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ldexpl works" >&5
+printf %s "checking whether ldexpl works... " >&6; }
+if test ${gl_cv_func_ldexpl_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+           aix | aix[3-6]*) gl_cv_func_ldexpl_works="guessing no" ;;
+                            # Guess yes on native Windows.
+           mingw*)          gl_cv_func_ldexpl_works="guessing yes" ;;
+           *)               gl_cv_func_ldexpl_works="guessing yes" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <math.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+long double ldexpl (long double, int);
+int main()
+{
+  int result = 0;
+  {
+    volatile long double x = 1.0;
+    volatile long double y = ldexpl (x, -1);
+    if (y != 0.5L)
+      result |= 1;
+  }
+  {
+    volatile long double x = 1.73205L;
+    volatile long double y = ldexpl (x, 0);
+    if (y != x)
+      result |= 2;
+  }
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_ldexpl_works=yes
+else $as_nop
+  gl_cv_func_ldexpl_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_works" >&5
+printf "%s\n" "$gl_cv_func_ldexpl_works" >&6; }
+
+      LIBS="$save_LIBS"
+      case "$gl_cv_func_ldexpl_works" in
+        *yes) gl_func_ldexpl=yes ;;
+        *)    gl_func_ldexpl=no; REPLACE_LDEXPL=1 ;;
+      esac
+    else
+      gl_func_ldexpl=no
+    fi
+    if test $gl_func_ldexpl = yes; then
+
+printf "%s\n" "#define HAVE_LDEXPL 1" >>confdefs.h
+
+    fi
+  fi
+  if test $HAVE_DECL_LDEXPL = 0 || test $gl_func_ldexpl = no; then
+        if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
+
+      LDEXPL_LIBM="$LDEXP_LIBM"
+    else
+      LDEXPL_LIBM="$ISNANL_LIBM"
+    fi
+  fi
+
+
+  if test $HAVE_DECL_LDEXPL = 0 || test $gl_func_ldexpl = no; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS ldexpl.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_LDEXPL=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_LDEXPL 1" >>confdefs.h
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the __inline keyword" >&5
+printf %s "checking whether the compiler supports the __inline keyword... " >&6; }
+if test ${gl_cv_c___inline+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+typedef int foo_t;
+           static __inline foo_t foo (void) { return 0; }
+int
+main (void)
+{
+return foo ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_c___inline=yes
+else $as_nop
+  gl_cv_c___inline=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c___inline" >&5
+printf "%s\n" "$gl_cv_c___inline" >&6; }
+  if test $gl_cv_c___inline = yes; then
+
+printf "%s\n" "#define HAVE___INLINE 1" >>confdefs.h
+
+  fi
+
+  # You need to invoke gl_LIBTEXTSTYLE yourself, possibly with arguments.
+  # You need to invoke gl_LIBTEXTSTYLE_OPTIONAL yourself, possibly with arguments.
+
+
+
+
+    LOCALCHARSET_TESTS_ENVIRONMENT=
+
+
+
+  if test "$gl_threads_api" = posix; then
+    # OSF/1 4.0 and Mac OS X 10.1 lack the pthread_rwlock_t type and the
+    # pthread_rwlock_* functions.
+    has_rwlock=false
+    ac_fn_c_check_type "$LINENO" "pthread_rwlock_t" "ac_cv_type_pthread_rwlock_t" "#include <pthread.h>
+"
+if test "x$ac_cv_type_pthread_rwlock_t" = xyes
+then :
+  has_rwlock=true
+
+printf "%s\n" "#define HAVE_PTHREAD_RWLOCK 1" >>confdefs.h
+
+fi
+
+    if $has_rwlock; then
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthread_rwlock_rdlock prefers a writer to a reader" >&5
+printf %s "checking whether pthread_rwlock_rdlock prefers a writer to a reader... " >&6; }
+if test ${gl_cv_pthread_rwlock_rdlock_prefer_writer+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  save_LIBS="$LIBS"
+     LIBS="$LIBS $LIBMULTITHREAD"
+     if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                         # Guess no on glibc systems.
+          *-gnu* | gnu*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;;
+                         # Guess no on musl systems.
+          *-musl*)       gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;;
+                         # Guess no on bionic systems.
+          *-android*)    gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;;
+                         # Guess yes on native Windows with the mingw-w64 winpthreads library.
+                         # Guess no on native Windows with the gnulib windows-rwlock module.
+          mingw*)        if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
+                           gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing yes"
+                         else
+                           gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no"
+                         fi
+                         ;;
+                         # If we don't know, obey --enable-cross-guesses.
+          *)             gl_cv_pthread_rwlock_rdlock_prefer_writer="$gl_cross_guess_normal" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <errno.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define SUCCEED() exit (0)
+#define FAILURE() exit (1)
+#define UNEXPECTED(n) (exit (10 + (n)))
+
+/* The main thread creates the waiting writer and the requesting reader threads
+   in the default way; this guarantees that they have the same priority.
+   We can reuse the main thread as first reader thread.  */
+
+static pthread_rwlock_t lock;
+static pthread_t reader1;
+static pthread_t writer;
+static pthread_t reader2;
+static pthread_t timer;
+/* Used to pass control from writer to reader2 and from reader2 to timer,
+   as in a relay race.
+   Passing control from one running thread to another running thread
+   is most likely faster than to create the second thread.  */
+static pthread_mutex_t baton;
+
+static void *
+timer_func (void *ignored)
+{
+  /* Step 13 (can be before or after step 12):
+     The timer thread takes the baton, then waits a moment to make sure
+     it can tell whether the second reader thread is blocked at step 12.  */
+  if (pthread_mutex_lock (&baton))
+    UNEXPECTED (13);
+  usleep (100000);
+  /* By the time we get here, it's clear that the second reader thread is
+     blocked at step 12.  This is the desired behaviour.  */
+  SUCCEED ();
+}
+
+static void *
+reader2_func (void *ignored)
+{
+  int err;
+
+  /* Step 8 (can be before or after step 7):
+     The second reader thread takes the baton, then waits a moment to make sure
+     the writer thread has reached step 7.  */
+  if (pthread_mutex_lock (&baton))
+    UNEXPECTED (8);
+  usleep (100000);
+  /* Step 9: The second reader thread requests the lock.  */
+  err = pthread_rwlock_tryrdlock (&lock);
+  if (err == 0)
+    FAILURE ();
+  else if (err != EBUSY)
+    UNEXPECTED (9);
+  /* Step 10: Launch a timer, to test whether the next call blocks.  */
+  if (pthread_create (&timer, NULL, timer_func, NULL))
+    UNEXPECTED (10);
+  /* Step 11: Release the baton.  */
+  if (pthread_mutex_unlock (&baton))
+    UNEXPECTED (11);
+  /* Step 12: The second reader thread requests the lock.  */
+  err = pthread_rwlock_rdlock (&lock);
+  if (err == 0)
+    FAILURE ();
+  else
+    UNEXPECTED (12);
+}
+
+static void *
+writer_func (void *ignored)
+{
+  /* Step 4: Take the baton, so that the second reader thread does not go ahead
+     too early.  */
+  if (pthread_mutex_lock (&baton))
+    UNEXPECTED (4);
+  /* Step 5: Create the second reader thread.  */
+  if (pthread_create (&reader2, NULL, reader2_func, NULL))
+    UNEXPECTED (5);
+  /* Step 6: Release the baton.  */
+  if (pthread_mutex_unlock (&baton))
+    UNEXPECTED (6);
+  /* Step 7: The writer thread requests the lock.  */
+  if (pthread_rwlock_wrlock (&lock))
+    UNEXPECTED (7);
+  return NULL;
+}
+
+int
+main ()
+{
+  reader1 = pthread_self ();
+
+  /* Step 1: The main thread initializes the lock and the baton.  */
+  if (pthread_rwlock_init (&lock, NULL))
+    UNEXPECTED (1);
+  if (pthread_mutex_init (&baton, NULL))
+    UNEXPECTED (1);
+  /* Step 2: The main thread acquires the lock as a reader.  */
+  if (pthread_rwlock_rdlock (&lock))
+    UNEXPECTED (2);
+  /* Step 3: Create the writer thread.  */
+  if (pthread_create (&writer, NULL, writer_func, NULL))
+    UNEXPECTED (3);
+  /* Job done.  Go to sleep.  */
+  for (;;)
+    {
+      sleep (1);
+    }
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_pthread_rwlock_rdlock_prefer_writer=yes
+else $as_nop
+  gl_cv_pthread_rwlock_rdlock_prefer_writer=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+     LIBS="$save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_pthread_rwlock_rdlock_prefer_writer" >&5
+printf "%s\n" "$gl_cv_pthread_rwlock_rdlock_prefer_writer" >&6; }
+  case "$gl_cv_pthread_rwlock_rdlock_prefer_writer" in
+    *yes)
+
+printf "%s\n" "#define HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER 1" >>confdefs.h
+
+      ;;
+  esac
+
+    fi
+    # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro.
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+      #include <pthread.h>
+int
+main (void)
+{
+
+#if __FreeBSD__ == 4
+error "No, in FreeBSD 4.0 recursive mutexes actually don't work."
+#elif (defined __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ \
+       && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)
+error "No, in Mac OS X < 10.7 recursive mutexes actually don't work."
+#else
+int x = (int)PTHREAD_MUTEX_RECURSIVE;
+return !x;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+printf "%s\n" "#define HAVE_PTHREAD_MUTEX_RECURSIVE 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+  fi
+  :
+
+
+
+printf "%s\n" "#define GNULIB_LOCK 1" >>confdefs.h
+
+
+
+
+
+
+
+
+  if test $REPLACE_MALLOC = 0; then
+
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether malloc (0) returns nonnull" >&5
+printf %s "checking whether malloc (0) returns nonnull... " >&6; }
+if test ${ac_cv_func_malloc_0_nonnull+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+          # Guess yes on platforms where we know the result.
+          *-gnu* | freebsd* | netbsd* | openbsd* | bitrig* \
+          | gnu* | *-musl* | midnightbsd* \
+          | hpux* | solaris* | cygwin* | mingw* | msys* )
+            ac_cv_func_malloc_0_nonnull="guessing yes" ;;
+          # If we don't know, obey --enable-cross-guesses.
+          *) ac_cv_func_malloc_0_nonnull="$gl_cross_guess_normal" ;;
+        esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+int
+main (void)
+{
+void *p = malloc (0);
+            int result = !p;
+            free (p);
+            return result;
+  ;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  ac_cv_func_malloc_0_nonnull=yes
+else $as_nop
+  ac_cv_func_malloc_0_nonnull=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5
+printf "%s\n" "$ac_cv_func_malloc_0_nonnull" >&6; }
+  case $ac_cv_func_malloc_0_nonnull in #(
+  *yes) :
+     ;; #(
+  *) :
+    REPLACE_MALLOC=1 ;;
+esac
+
+  fi
+
+  if test $REPLACE_MALLOC = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS malloc.$ac_objext"
+
+  fi
+
+  if test $REPLACE_MALLOC = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS malloc.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_MALLOC_POSIX=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MALLOC_POSIX 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  :
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+        if case "$host_os" in
+       mingw*) true ;;
+       *) test $ac_cv_func_mbsinit = yes ;;
+     esac \
+    && test $ac_cv_func_mbrtowc = yes; then
+
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5
+printf %s "checking whether mbrtowc handles incomplete characters... " >&6; }
+if test ${gl_cv_func_mbrtowc_incomplete_state+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+                  case "$host_os" in
+                     # Guess no on AIX and OSF/1.
+        aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;;
+                     # Guess yes otherwise.
+        *)           gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;;
+      esac
+      if test $LOCALE_JA != none; then
+        if test "$cross_compiling" = yes
+then :
+  :
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+    {
+      const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
+      mbstate_t state;
+      wchar_t wc;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+        if (mbsinit (&state))
+          return 2;
+    }
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_mbrtowc_incomplete_state=yes
+else $as_nop
+  gl_cv_func_mbrtowc_incomplete_state=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      else
+        if test $LOCALE_FR_UTF8 != none; then
+          if test "$cross_compiling" = yes
+then :
+  :
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+    {
+      const char input[] = "B\303\274\303\237er"; /* "Büßer" */
+      mbstate_t state;
+      wchar_t wc;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+        if (mbsinit (&state))
+          return 2;
+    }
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_mbrtowc_incomplete_state=yes
+else $as_nop
+  gl_cv_func_mbrtowc_incomplete_state=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+        fi
+      fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_incomplete_state" >&6; }
+
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5
+printf %s "checking whether mbrtowc works as well as mbtowc... " >&6; }
+if test ${gl_cv_func_mbrtowc_sanitycheck+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+                  case "$host_os" in
+                    # Guess no on Solaris 8.
+        solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;;
+                    # Guess yes otherwise.
+        *)          gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;;
+      esac
+      if test $LOCALE_ZH_CN != none; then
+        if test "$cross_compiling" = yes
+then :
+  :
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+  /* This fails on Solaris 8:
+     mbrtowc returns 2, and sets wc to 0x00F0.
+     mbtowc returns 4 (correct) and sets wc to 0x5EDC.  */
+  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+    {
+      char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
+      mbstate_t state;
+      wchar_t wc;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, input + 3, 6, &state) != 4
+          && mbtowc (&wc, input + 3, 6) == 4)
+        return 2;
+    }
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_mbrtowc_sanitycheck=yes
+else $as_nop
+  gl_cv_func_mbrtowc_sanitycheck=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_sanitycheck" >&6; }
+
+    REPLACE_MBSTATE_T=0
+    case "$gl_cv_func_mbrtowc_incomplete_state" in
+      *yes) ;;
+      *) REPLACE_MBSTATE_T=1 ;;
+    esac
+    case "$gl_cv_func_mbrtowc_sanitycheck" in
+      *yes) ;;
+      *) REPLACE_MBSTATE_T=1 ;;
+    esac
+  else
+    REPLACE_MBSTATE_T=1
+  fi
+
+
+
+  if test $ac_cv_func_mbrtowc = no; then
+    HAVE_MBRTOWC=0
+    ac_fn_check_decl "$LINENO" "mbrtowc" "ac_cv_have_decl_mbrtowc" "
+      #include <wchar.h>
+
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_mbrtowc" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_MBRTOWC $ac_have_decl" >>confdefs.h
+
+    if test $ac_cv_have_decl_mbrtowc = yes; then
+                        REPLACE_MBRTOWC=1
+    fi
+  else
+    if test $REPLACE_MBSTATE_T = 1; then
+      REPLACE_MBRTOWC=1
+    else
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles a NULL pwc argument" >&5
+printf %s "checking whether mbrtowc handles a NULL pwc argument... " >&6; }
+if test ${gl_cv_func_mbrtowc_null_arg1+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+                  case "$host_os" in
+                  # Guess no on Solaris.
+        solaris*) gl_cv_func_mbrtowc_null_arg1="guessing no" ;;
+                  # Guess yes otherwise.
+        *)        gl_cv_func_mbrtowc_null_arg1="guessing yes" ;;
+      esac
+      if test $LOCALE_FR_UTF8 != none; then
+        if test "$cross_compiling" = yes
+then :
+  :
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+  int result = 0;
+
+  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+    {
+      char input[] = "\303\237er";
+      mbstate_t state;
+      wchar_t wc;
+      size_t ret;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      wc = (wchar_t) 0xBADFACE;
+      ret = mbrtowc (&wc, input, 5, &state);
+      if (ret != 2)
+        result |= 1;
+      if (!mbsinit (&state))
+        result |= 2;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      ret = mbrtowc (NULL, input, 5, &state);
+      if (ret != 2) /* Solaris 7 fails here: ret is -1.  */
+        result |= 4;
+      if (!mbsinit (&state))
+        result |= 8;
+    }
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_mbrtowc_null_arg1=yes
+else $as_nop
+  gl_cv_func_mbrtowc_null_arg1=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_null_arg1" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_null_arg1" >&6; }
+
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles a NULL string argument" >&5
+printf %s "checking whether mbrtowc handles a NULL string argument... " >&6; }
+if test ${gl_cv_func_mbrtowc_null_arg2+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+                  case "$host_os" in
+              # Guess no on OSF/1.
+        osf*) gl_cv_func_mbrtowc_null_arg2="guessing no" ;;
+              # Guess yes otherwise.
+        *)    gl_cv_func_mbrtowc_null_arg2="guessing yes" ;;
+      esac
+      if test $LOCALE_FR_UTF8 != none; then
+        if test "$cross_compiling" = yes
+then :
+  :
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+    {
+      mbstate_t state;
+      wchar_t wc;
+      int ret;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      wc = (wchar_t) 0xBADFACE;
+      mbrtowc (&wc, NULL, 5, &state);
+      /* Check that wc was not modified.  */
+      if (wc != (wchar_t) 0xBADFACE)
+        return 2;
+    }
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_mbrtowc_null_arg2=yes
+else $as_nop
+  gl_cv_func_mbrtowc_null_arg2=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_null_arg2" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_null_arg2" >&6; }
+
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc has a correct return value" >&5
+printf %s "checking whether mbrtowc has a correct return value... " >&6; }
+if test ${gl_cv_func_mbrtowc_retval+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+                  case "$host_os" in
+                                   # Guess no on HP-UX, Solaris, native Windows.
+        hpux* | solaris* | mingw*) gl_cv_func_mbrtowc_retval="guessing no" ;;
+                                   # Guess yes otherwise.
+        *)                         gl_cv_func_mbrtowc_retval="guessing yes" ;;
+      esac
+      if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none \
+         || { case "$host_os" in mingw*) true;; *) false;; esac; }; then
+        if test "$cross_compiling" = yes
+then :
+  :
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+  int result = 0;
+  int found_some_locale = 0;
+  /* This fails on Solaris.  */
+  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+    {
+      char input[] = "B\303\274\303\237er"; /* "Büßer" */
+      mbstate_t state;
+      wchar_t wc;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+        {
+          input[1] = '\0';
+          if (mbrtowc (&wc, input + 2, 5, &state) != 1)
+            result |= 1;
+        }
+      found_some_locale = 1;
+    }
+  /* This fails on HP-UX 11.11.  */
+  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+    {
+      char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
+      mbstate_t state;
+      wchar_t wc;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+        {
+          input[1] = '\0';
+          if (mbrtowc (&wc, input + 2, 5, &state) != 2)
+            result |= 2;
+        }
+      found_some_locale = 1;
+    }
+  /* This fails on native Windows.  */
+  if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL)
+    {
+      char input[] = "<\223\372\226\173\214\352>"; /* "<日本語>" */
+      mbstate_t state;
+      wchar_t wc;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
+        {
+          input[3] = '\0';
+          if (mbrtowc (&wc, input + 4, 4, &state) != 1)
+            result |= 4;
+        }
+      found_some_locale = 1;
+    }
+  if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL)
+    {
+      char input[] = "<\244\351\245\273\273\171>"; /* "<日本語>" */
+      mbstate_t state;
+      wchar_t wc;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
+        {
+          input[3] = '\0';
+          if (mbrtowc (&wc, input + 4, 4, &state) != 1)
+            result |= 8;
+        }
+      found_some_locale = 1;
+    }
+  if (setlocale (LC_ALL, "Chinese_China.936") != NULL)
+    {
+      char input[] = "<\310\325\261\276\325\132>"; /* "<日本語>" */
+      mbstate_t state;
+      wchar_t wc;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
+        {
+          input[3] = '\0';
+          if (mbrtowc (&wc, input + 4, 4, &state) != 1)
+            result |= 16;
+        }
+      found_some_locale = 1;
+    }
+  return (found_some_locale ? result : 77);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_mbrtowc_retval=yes
+else $as_nop
+  if test $? != 77; then
+             gl_cv_func_mbrtowc_retval=no
+           fi
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_retval" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_retval" >&6; }
+
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc returns 0 when parsing a NUL character" >&5
+printf %s "checking whether mbrtowc returns 0 when parsing a NUL character... " >&6; }
+if test ${gl_cv_func_mbrtowc_nul_retval+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+                  case "$host_os" in
+                       # Guess no on Solaris 8 and 9.
+        solaris2.[89]) gl_cv_func_mbrtowc_nul_retval="guessing no" ;;
+                       # Guess yes otherwise.
+        *)             gl_cv_func_mbrtowc_nul_retval="guessing yes" ;;
+      esac
+      if test $LOCALE_ZH_CN != none; then
+        if test "$cross_compiling" = yes
+then :
+  :
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+  /* This fails on Solaris 8 and 9.  */
+  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+    {
+      mbstate_t state;
+      wchar_t wc;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, "", 1, &state) != 0)
+        return 2;
+    }
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_mbrtowc_nul_retval=yes
+else $as_nop
+  gl_cv_func_mbrtowc_nul_retval=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_nul_retval" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_nul_retval" >&6; }
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc stores incomplete characters" >&5
+printf %s "checking whether mbrtowc stores incomplete characters... " >&6; }
+if test ${gl_cv_func_mbrtowc_stores_incomplete+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+               case "$host_os" in
+               # Guess yes on native Windows.
+       mingw*) gl_cv_func_mbrtowc_stores_incomplete="guessing yes" ;;
+       *)      gl_cv_func_mbrtowc_stores_incomplete="guessing no" ;;
+     esac
+     case "$host_os" in
+       mingw*)
+         if test "$cross_compiling" = yes
+then :
+  :
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+  int result = 0;
+  if (setlocale (LC_ALL, "French_France.65001") != NULL)
+    {
+      wchar_t wc = (wchar_t) 0xBADFACE;
+      mbstate_t state;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2)
+          && wc != (wchar_t) 0xBADFACE)
+        result |= 1;
+    }
+  if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL)
+    {
+      wchar_t wc = (wchar_t) 0xBADFACE;
+      mbstate_t state;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, "\226", 1, &state) == (size_t)(-2)
+          && wc != (wchar_t) 0xBADFACE)
+        result |= 2;
+    }
+  if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL)
+    {
+      wchar_t wc = (wchar_t) 0xBADFACE;
+      mbstate_t state;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, "\245", 1, &state) == (size_t)(-2)
+          && wc != (wchar_t) 0xBADFACE)
+        result |= 4;
+    }
+  if (setlocale (LC_ALL, "Chinese_China.936") != NULL)
+    {
+      wchar_t wc = (wchar_t) 0xBADFACE;
+      mbstate_t state;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, "\261", 1, &state) == (size_t)(-2)
+          && wc != (wchar_t) 0xBADFACE)
+        result |= 8;
+    }
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_mbrtowc_stores_incomplete=no
+else $as_nop
+  gl_cv_func_mbrtowc_stores_incomplete=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+         ;;
+       *)
+
+         if test $LOCALE_FR_UTF8 != none; then
+           if test "$cross_compiling" = yes
+then :
+  :
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+    {
+      wchar_t wc = (wchar_t) 0xBADFACE;
+      mbstate_t state;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2)
+          && wc != (wchar_t) 0xBADFACE)
+        return 1;
+    }
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_mbrtowc_stores_incomplete=no
+else $as_nop
+  gl_cv_func_mbrtowc_stores_incomplete=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+         fi
+         ;;
+     esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_stores_incomplete" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_stores_incomplete" >&6; }
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works on empty input" >&5
+printf %s "checking whether mbrtowc works on empty input... " >&6; }
+if test ${gl_cv_func_mbrtowc_empty_input+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+                  case "$host_os" in
+                              # Guess no on AIX and glibc systems.
+        aix* | *-gnu* | gnu*) gl_cv_func_mbrtowc_empty_input="guessing no" ;;
+                              # Guess yes on native Windows.
+        mingw*)               gl_cv_func_mbrtowc_empty_input="guessing yes" ;;
+        *)                    gl_cv_func_mbrtowc_empty_input="guessing yes" ;;
+      esac
+      if test "$cross_compiling" = yes
+then :
+  :
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+           #include <wchar.h>
+           static wchar_t wc;
+           static mbstate_t mbs;
+           int
+           main (void)
+           {
+             return mbrtowc (&wc, "", 0, &mbs) != (size_t) -2;
+           }
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_mbrtowc_empty_input=yes
+else $as_nop
+  gl_cv_func_mbrtowc_empty_input=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_empty_input" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_empty_input" >&6; }
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C locale is free of encoding errors" >&5
+printf %s "checking whether the C locale is free of encoding errors... " >&6; }
+if test ${gl_cv_func_mbrtowc_C_locale_sans_EILSEQ+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+               gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="$gl_cross_guess_normal"
+
+     if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                 # Guess yes on native Windows.
+         mingw*) gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="guessing yes" ;;
+       esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+            #include <locale.h>
+            #include <wchar.h>
+
+int
+main (void)
+{
+
+            int i;
+            char *locale = setlocale (LC_ALL, "C");
+            if (! locale)
+              return 2;
+            for (i = CHAR_MIN; i <= CHAR_MAX; i++)
+              {
+                char c = i;
+                wchar_t wc;
+                mbstate_t mbs = { 0, };
+                size_t ss = mbrtowc (&wc, &c, 1, &mbs);
+                if (1 < ss)
+                  return 3;
+              }
+            return 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=yes
+else $as_nop
+  gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" >&6; }
+
+      case "$gl_cv_func_mbrtowc_null_arg1" in
+        *yes) ;;
+        *)
+printf "%s\n" "#define MBRTOWC_NULL_ARG1_BUG 1" >>confdefs.h
+
+           REPLACE_MBRTOWC=1
+           ;;
+      esac
+      case "$gl_cv_func_mbrtowc_null_arg2" in
+        *yes) ;;
+        *)
+printf "%s\n" "#define MBRTOWC_NULL_ARG2_BUG 1" >>confdefs.h
+
+           REPLACE_MBRTOWC=1
+           ;;
+      esac
+      case "$gl_cv_func_mbrtowc_retval" in
+        *yes) ;;
+        *)
+printf "%s\n" "#define MBRTOWC_RETVAL_BUG 1" >>confdefs.h
+
+           REPLACE_MBRTOWC=1
+           ;;
+      esac
+      case "$gl_cv_func_mbrtowc_nul_retval" in
+        *yes) ;;
+        *)
+printf "%s\n" "#define MBRTOWC_NUL_RETVAL_BUG 1" >>confdefs.h
+
+           REPLACE_MBRTOWC=1
+           ;;
+      esac
+      case "$gl_cv_func_mbrtowc_stores_incomplete" in
+        *no) ;;
+        *)
+printf "%s\n" "#define MBRTOWC_STORES_INCOMPLETE_BUG 1" >>confdefs.h
+
+           REPLACE_MBRTOWC=1
+           ;;
+      esac
+      case "$gl_cv_func_mbrtowc_empty_input" in
+        *yes) ;;
+        *)
+printf "%s\n" "#define MBRTOWC_EMPTY_INPUT_BUG 1" >>confdefs.h
+
+           REPLACE_MBRTOWC=1
+           ;;
+      esac
+      case "$gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" in
+        *yes) ;;
+        *)
+printf "%s\n" "#define MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ 1" >>confdefs.h
+
+           REPLACE_MBRTOWC=1
+           ;;
+      esac
+    fi
+  fi
+  if test $REPLACE_MBSTATE_T = 1; then
+    case "$host_os" in
+      mingw*) LIB_MBRTOWC= ;;
+      *)
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5
+printf %s "checking whether imported symbols can be declared weak... " >&6; }
+if test ${gl_cv_have_weak+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case "$host_os" in
+       cygwin*)
+                                    gl_cv_have_weak="guessing no"
+         ;;
+       *)
+         gl_cv_have_weak=no
+                  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+extern void xyzzy ();
+#pragma weak xyzzy
+int
+main (void)
+{
+xyzzy();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_have_weak=maybe
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+         if test $gl_cv_have_weak = maybe; then
+                                 if test "$cross_compiling" = yes
+then :
+                              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __ELF__
+                 Extensible Linking Format
+                 #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Extensible Linking Format" >/dev/null 2>&1
+then :
+  gl_cv_have_weak="guessing yes"
+else $as_nop
+  gl_cv_have_weak="guessing no"
+fi
+rm -rf conftest*
+
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#pragma weak fputs
+int main ()
+{
+  return (fputs == NULL);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_have_weak=yes
+else $as_nop
+  gl_cv_have_weak=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+         fi
+         ;;
+     esac
+          case " $LDFLAGS " in
+       *" -static "*) gl_cv_have_weak=no ;;
+     esac
+                    case "$gl_cv_have_weak" in
+       *yes)
+         case "$host_os" in
+           freebsd* | dragonfly* | midnightbsd*)
+             : > conftest1.c
+             $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1
+             cat <<EOF > conftest2.c
+#include <pthread.h>
+#pragma weak pthread_mutexattr_gettype
+int main ()
+{
+  return (pthread_mutexattr_gettype != NULL);
+}
+EOF
+             $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \
+               || gl_cv_have_weak=no
+             rm -f conftest1.c libempty.so conftest2.c conftest
+             ;;
+         esac
+         ;;
+     esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5
+printf "%s\n" "$gl_cv_have_weak" >&6; }
+  case "$gl_cv_have_weak" in
+    *yes)
+
+printf "%s\n" "#define HAVE_WEAK_SYMBOLS 1" >>confdefs.h
+
+      ;;
+  esac
+
+        case "$gl_cv_have_weak" in
+          *yes) LIB_MBRTOWC= ;;
+          *)    LIB_MBRTOWC="$LIBPTHREAD" ;;
+        esac
+        ;;
+    esac
+  else
+    LIB_MBRTOWC=
+  fi
+
+
+  if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS mbrtowc.$ac_objext"
+
+    if test $REPLACE_MBSTATE_T = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS lc-charset-dispatch.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS mbtowc-lock.$ac_objext"
+
+
+
+
+  CFLAG_VISIBILITY=
+  HAVE_VISIBILITY=0
+  if test -n "$GCC"; then
+                { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5
+printf %s "checking whether the -Werror option is usable... " >&6; }
+if test ${gl_cv_cc_vis_werror+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  gl_save_CFLAGS="$CFLAGS"
+       CFLAGS="$CFLAGS -Werror"
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_cc_vis_werror=yes
+else $as_nop
+  gl_cv_cc_vis_werror=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+       CFLAGS="$gl_save_CFLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_vis_werror" >&5
+printf "%s\n" "$gl_cv_cc_vis_werror" >&6; }
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5
+printf %s "checking for simple visibility declarations... " >&6; }
+if test ${gl_cv_cc_visibility+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  gl_save_CFLAGS="$CFLAGS"
+       CFLAGS="$CFLAGS -fvisibility=hidden"
+                                          if test $gl_cv_cc_vis_werror = yes; then
+         CFLAGS="$CFLAGS -Werror"
+       fi
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+              extern __attribute__((__visibility__("default"))) int exportedvar;
+              extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+              extern __attribute__((__visibility__("default"))) int exportedfunc (void);
+              void dummyfunc (void);
+              int hiddenvar;
+              int exportedvar;
+              int hiddenfunc (void) { return 51; }
+              int exportedfunc (void) { return 1225736919; }
+              void dummyfunc (void) {}
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_cc_visibility=yes
+else $as_nop
+  gl_cv_cc_visibility=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+       CFLAGS="$gl_save_CFLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_visibility" >&5
+printf "%s\n" "$gl_cv_cc_visibility" >&6; }
+    if test $gl_cv_cc_visibility = yes; then
+      CFLAG_VISIBILITY="-fvisibility=hidden"
+      HAVE_VISIBILITY=1
+    fi
+  fi
+
+
+
+printf "%s\n" "#define HAVE_VISIBILITY $HAVE_VISIBILITY" >>confdefs.h
+
+
+
+    fi
+
+
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_MBRTOWC=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MBRTOWC 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+        if case "$host_os" in
+       mingw*) true ;;
+       *) test $ac_cv_func_mbsinit = yes ;;
+     esac \
+    && test $ac_cv_func_mbrtowc = yes; then
+
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5
+printf %s "checking whether mbrtowc handles incomplete characters... " >&6; }
+if test ${gl_cv_func_mbrtowc_incomplete_state+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+                  case "$host_os" in
+                     # Guess no on AIX and OSF/1.
+        aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;;
+                     # Guess yes otherwise.
+        *)           gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;;
+      esac
+      if test $LOCALE_JA != none; then
+        if test "$cross_compiling" = yes
+then :
+  :
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+    {
+      const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
+      mbstate_t state;
+      wchar_t wc;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+        if (mbsinit (&state))
+          return 2;
+    }
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_mbrtowc_incomplete_state=yes
+else $as_nop
+  gl_cv_func_mbrtowc_incomplete_state=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      else
+        if test $LOCALE_FR_UTF8 != none; then
+          if test "$cross_compiling" = yes
+then :
+  :
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+    {
+      const char input[] = "B\303\274\303\237er"; /* "Büßer" */
+      mbstate_t state;
+      wchar_t wc;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+        if (mbsinit (&state))
+          return 2;
+    }
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_mbrtowc_incomplete_state=yes
+else $as_nop
+  gl_cv_func_mbrtowc_incomplete_state=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+        fi
+      fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_incomplete_state" >&6; }
+
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5
+printf %s "checking whether mbrtowc works as well as mbtowc... " >&6; }
+if test ${gl_cv_func_mbrtowc_sanitycheck+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+                  case "$host_os" in
+                    # Guess no on Solaris 8.
+        solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;;
+                    # Guess yes otherwise.
+        *)          gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;;
+      esac
+      if test $LOCALE_ZH_CN != none; then
+        if test "$cross_compiling" = yes
+then :
+  :
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+  /* This fails on Solaris 8:
+     mbrtowc returns 2, and sets wc to 0x00F0.
+     mbtowc returns 4 (correct) and sets wc to 0x5EDC.  */
+  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+    {
+      char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
+      mbstate_t state;
+      wchar_t wc;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, input + 3, 6, &state) != 4
+          && mbtowc (&wc, input + 3, 6) == 4)
+        return 2;
+    }
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_mbrtowc_sanitycheck=yes
+else $as_nop
+  gl_cv_func_mbrtowc_sanitycheck=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_sanitycheck" >&6; }
+
+    REPLACE_MBSTATE_T=0
+    case "$gl_cv_func_mbrtowc_incomplete_state" in
+      *yes) ;;
+      *) REPLACE_MBSTATE_T=1 ;;
+    esac
+    case "$gl_cv_func_mbrtowc_sanitycheck" in
+      *yes) ;;
+      *) REPLACE_MBSTATE_T=1 ;;
+    esac
+  else
+    REPLACE_MBSTATE_T=1
+  fi
+
+
+
+  if test $ac_cv_func_mbsinit = no; then
+    HAVE_MBSINIT=0
+    ac_fn_check_decl "$LINENO" "mbsinit" "ac_cv_have_decl_mbsinit" "
+      #include <wchar.h>
+
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_mbsinit" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_MBSINIT $ac_have_decl" >>confdefs.h
+
+    if test $ac_cv_have_decl_mbsinit = yes; then
+                        REPLACE_MBSINIT=1
+    fi
+  else
+    if test $REPLACE_MBSTATE_T = 1; then
+      REPLACE_MBSINIT=1
+    else
+                        case "$host_os" in
+        mingw*) REPLACE_MBSINIT=1 ;;
+      esac
+    fi
+  fi
+
+  if test $HAVE_MBSINIT = 0 || test $REPLACE_MBSINIT = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS mbsinit.$ac_objext"
+
+
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_MBSINIT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MBSINIT 1" >>confdefs.h
+
+
+
+
+
+
+
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbswidth is declared in <wchar.h>" >&5
+printf %s "checking whether mbswidth is declared in <wchar.h>... " >&6; }
+if test ${ac_cv_have_decl_mbswidth+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <wchar.h>
+
+int
+main (void)
+{
+char *p = (char *) mbswidth;
+            return !p;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_have_decl_mbswidth=yes
+else $as_nop
+  ac_cv_have_decl_mbswidth=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_mbswidth" >&5
+printf "%s\n" "$ac_cv_have_decl_mbswidth" >&6; }
+  if test $ac_cv_have_decl_mbswidth = yes; then
+    ac_val=1
+  else
+    ac_val=0
+  fi
+
+printf "%s\n" "#define HAVE_DECL_MBSWIDTH_IN_WCHAR_H $ac_val" >>confdefs.h
+
+
+
+
+   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mbstate_t" >&5
+printf %s "checking for mbstate_t... " >&6; }
+if test ${ac_cv_type_mbstate_t+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+             #include <wchar.h>
+int
+main (void)
+{
+mbstate_t x; return sizeof x;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_type_mbstate_t=yes
+else $as_nop
+  ac_cv_type_mbstate_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_mbstate_t" >&5
+printf "%s\n" "$ac_cv_type_mbstate_t" >&6; }
+   if test $ac_cv_type_mbstate_t = yes; then
+
+printf "%s\n" "#define HAVE_MBSTATE_T 1" >>confdefs.h
+
+   else
+
+printf "%s\n" "#define mbstate_t int" >>confdefs.h
+
+   fi
+
+
+
+  if test $REPLACE_MEMCHR = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS memchr.$ac_objext"
+
+
+  ac_fn_c_check_header_compile "$LINENO" "bp-sym.h" "ac_cv_header_bp_sym_h" "$ac_includes_default"
+if test "x$ac_cv_header_bp_sym_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_BP_SYM_H 1" >>confdefs.h
+
+fi
+
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_MEMCHR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MEMCHR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+  ac_fn_c_check_func "$LINENO" "mempcpy" "ac_cv_func_mempcpy"
+if test "x$ac_cv_func_mempcpy" = xyes
+then :
+  printf "%s\n" "#define HAVE_MEMPCPY 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_mempcpy = no; then
+    HAVE_MEMPCPY=0
+  fi
+
+  if test $HAVE_MEMPCPY = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS mempcpy.$ac_objext"
+
+
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_MEMPCPY=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MEMPCPY 1" >>confdefs.h
+
+
+
+
+
+
+
+  if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS msvc-inval.$ac_objext"
+
+  fi
+
+  if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS msvc-nothrow.$ac_objext"
+
+  fi
+
+
+printf "%s\n" "#define GNULIB_MSVC_NOTHROW 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for obstacks that work with any size object" >&5
+printf %s "checking for obstacks that work with any size object... " >&6; }
+if test ${ac_cv_func_obstack+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include "obstack.h"
+             void *obstack_chunk_alloc (size_t n) { return 0; }
+             void obstack_chunk_free (void *p) { }
+             /* Check that an internal function returns size_t, not int.  */
+             size_t _obstack_memory_used (struct obstack *);
+
+int
+main (void)
+{
+struct obstack mem;
+             obstack_init (&mem);
+             obstack_free (&mem, 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  ac_cv_func_obstack=yes
+else $as_nop
+  ac_cv_func_obstack=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_obstack" >&5
+printf "%s\n" "$ac_cv_func_obstack" >&6; }
+   if test "$ac_cv_func_obstack" = yes; then
+
+printf "%s\n" "#define HAVE_OBSTACK 1" >>confdefs.h
+
+   else
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS obstack.$ac_objext"
+
+   fi
+
+
+
+
+
+
+  if test $ac_cv_func_obstack_printf = no ; then
+
+
+  if test $ac_cv_func_obstack_printf = yes; then
+    REPLACE_OBSTACK_PRINTF=1
+  fi
+
+  fi
+
+
+
+  if test $ac_cv_have_decl_obstack_printf = no; then
+    HAVE_DECL_OBSTACK_PRINTF=0
+  fi
+
+
+  if test $ac_cv_func_obstack_printf = no || test $REPLACE_OBSTACK_PRINTF = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS obstack_printf.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_OBSTACK_PRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_OBSTACK_PRINTF 1" >>confdefs.h
+
+
+
+
+
+
+  case "$host_os" in
+    mingw* | pw*)
+      REPLACE_OPEN=1
+      ;;
+    *)
+
+      if test "$gl_cv_macro_O_CLOEXEC" != yes; then
+        REPLACE_OPEN=1
+      fi
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether open recognizes a trailing slash" >&5
+printf %s "checking whether open recognizes a trailing slash... " >&6; }
+if test ${gl_cv_func_open_slash+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  # Assume that if we have lstat, we can also check symlinks.
+     if test $ac_cv_func_lstat = yes; then
+       touch conftest.tmp
+       ln -s conftest.tmp conftest.lnk
+     fi
+     if test "$cross_compiling" = yes
+then :
+
+        case "$host_os" in
+          freebsd* | aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*)
+            gl_cv_func_open_slash="guessing no" ;;
+          *)
+            gl_cv_func_open_slash="guessing yes" ;;
+        esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <fcntl.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+
+$gl_mda_defines
+
+int main ()
+{
+  int result = 0;
+#if HAVE_LSTAT
+  if (open ("conftest.lnk/", O_RDONLY) != -1)
+    result |= 1;
+#endif
+  if (open ("conftest.sl/", O_CREAT, 0600) >= 0)
+    result |= 2;
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_open_slash=yes
+else $as_nop
+  gl_cv_func_open_slash=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+     rm -f conftest.sl conftest.tmp conftest.lnk
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_open_slash" >&5
+printf "%s\n" "$gl_cv_func_open_slash" >&6; }
+  case "$gl_cv_func_open_slash" in
+    *no)
+
+printf "%s\n" "#define OPEN_TRAILING_SLASH_BUG 1" >>confdefs.h
+
+      ;;
+  esac
+
+      case "$gl_cv_func_open_slash" in
+        *no)
+          REPLACE_OPEN=1
+          ;;
+      esac
+      ;;
+  esac
+
+    if test $REPLACE_OPEN = 0; then
+
+
+
+  if test $ac_cv_func_fchdir = no; then
+    HAVE_FCHDIR=0
+  fi
+
+      if test $HAVE_FCHDIR = 0; then
+        REPLACE_OPEN=1
+      fi
+    fi
+
+
+
+  if test $REPLACE_OPEN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS open.$ac_objext"
+
+
+
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_OPEN=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_OPEN 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+             if test "$ERRNO_H:$REPLACE_STRERROR_0" != :0; then
+            REPLACE_PERROR=1
+  fi
+  case ${gl_cv_func_strerror_r_works-unset} in
+    unset|*yes)
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether perror matches strerror" >&5
+printf %s "checking whether perror matches strerror... " >&6; }
+if test ${gl_cv_func_perror_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                       # Guess yes on musl systems.
+              *-musl*) gl_cv_func_perror_works="guessing yes" ;;
+                       # Guess yes on native Windows.
+              mingw*)  gl_cv_func_perror_works="guessing yes" ;;
+                       # Otherwise obey --enable-cross-guesses.
+              *)       gl_cv_func_perror_works="$gl_cross_guess_normal" ;;
+            esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <errno.h>
+                #include <stdio.h>
+                #include <stdlib.h>
+                #include <string.h>
+
+int
+main (void)
+{
+char *str = strerror (-1);
+                if (!getenv("CONFTEST_OUTPUT")) return 0;
+                if (!str) str = "";
+                puts (str);
+                errno = -1;
+                perror ("");
+                return 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  if CONFTEST_OUTPUT=1 ./conftest$EXEEXT >conftest.txt1 2>conftest.txt2 \
+               && cmp conftest.txt1 conftest.txt2 >/dev/null; then
+              gl_cv_func_perror_works=yes
+            else
+              gl_cv_func_perror_works=no
+            fi
+            rm -rf conftest.txt1 conftest.txt2
+else $as_nop
+  gl_cv_func_perror_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_perror_works" >&5
+printf "%s\n" "$gl_cv_func_perror_works" >&6; }
+      case "$gl_cv_func_perror_works" in
+        *yes) ;;
+        *) REPLACE_PERROR=1 ;;
+      esac
+      ;;
+    *)
+                  REPLACE_PERROR=1
+      ;;
+  esac
+
+  if test $REPLACE_PERROR = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS perror.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_PERROR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_PERROR 1" >>confdefs.h
+
+
+
+
+
+
+
+  if test $ac_cv_func_pipe != yes; then
+    HAVE_PIPE=0
+  fi
+
+  if test $HAVE_PIPE = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS pipe.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_PIPE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_PIPE 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+  if test $ac_cv_func_pipe2 != yes; then
+    HAVE_PIPE2=0
+  fi
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_PIPE2=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_PIPE2 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define GNULIB_PIPE2_SAFER 1" >>confdefs.h
+
+
+
+
+
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS spawn.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_POSIX_SPAWN=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWN 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+  if test $ac_cv_func_posix_spawn_file_actions_addchdir = yes; then
+            REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=1
+  else
+    HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=0
+  fi
+
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = 0 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS spawn_faction_addchdir.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+  if test $REPLACE_POSIX_SPAWN = 1; then
+    REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=1
+  else
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn_file_actions_addclose works" >&5
+printf %s "checking whether posix_spawn_file_actions_addclose works... " >&6; }
+if test ${gl_cv_func_posix_spawn_file_actions_addclose_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  # Guess no on musl libc and Solaris, yes otherwise.
+          case "$host_os" in
+            *-musl*)  gl_cv_func_posix_spawn_file_actions_addclose_works="guessing no" ;;
+            solaris*) gl_cv_func_posix_spawn_file_actions_addclose_works="guessing no" ;;
+                      # Guess no on native Windows.
+            mingw*)   gl_cv_func_posix_spawn_file_actions_addclose_works="guessing no" ;;
+            *)        gl_cv_func_posix_spawn_file_actions_addclose_works="guessing yes" ;;
+          esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <spawn.h>
+int main ()
+{
+  posix_spawn_file_actions_t actions;
+  if (posix_spawn_file_actions_init (&actions) != 0)
+    return 1;
+  if (posix_spawn_file_actions_addclose (&actions, -5) == 0)
+    return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_posix_spawn_file_actions_addclose_works=yes
+else $as_nop
+  gl_cv_func_posix_spawn_file_actions_addclose_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_file_actions_addclose_works" >&5
+printf "%s\n" "$gl_cv_func_posix_spawn_file_actions_addclose_works" >&6; }
+    case "$gl_cv_func_posix_spawn_file_actions_addclose_works" in
+      *yes) ;;
+      *) REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=1 ;;
+    esac
+  fi
+
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS spawn_faction_addclose.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+  if test $REPLACE_POSIX_SPAWN = 1; then
+    REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=1
+  else
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn_file_actions_adddup2 works" >&5
+printf %s "checking whether posix_spawn_file_actions_adddup2 works... " >&6; }
+if test ${gl_cv_func_posix_spawn_file_actions_adddup2_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  # Guess no on musl libc and Solaris, yes otherwise.
+          case "$host_os" in
+            *-musl*)  gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing no";;
+            solaris*) gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing no";;
+                      # Guess no on native Windows.
+            mingw*)   gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing no" ;;
+            *)        gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing yes";;
+          esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <spawn.h>
+int main ()
+{
+  posix_spawn_file_actions_t actions;
+  if (posix_spawn_file_actions_init (&actions) != 0)
+    return 1;
+  if (posix_spawn_file_actions_adddup2 (&actions, 10000000, 2) == 0)
+    return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_posix_spawn_file_actions_adddup2_works=yes
+else $as_nop
+  gl_cv_func_posix_spawn_file_actions_adddup2_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_file_actions_adddup2_works" >&5
+printf "%s\n" "$gl_cv_func_posix_spawn_file_actions_adddup2_works" >&6; }
+    case "$gl_cv_func_posix_spawn_file_actions_adddup2_works" in
+      *yes) ;;
+      *) REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=1 ;;
+    esac
+  fi
+
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS spawn_faction_adddup2.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+  if test $REPLACE_POSIX_SPAWN = 1; then
+    REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=1
+  else
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn_file_actions_addopen works" >&5
+printf %s "checking whether posix_spawn_file_actions_addopen works... " >&6; }
+if test ${gl_cv_func_posix_spawn_file_actions_addopen_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  # Guess no on musl libc and Solaris, yes otherwise.
+          case "$host_os" in
+            *-musl*)  gl_cv_func_posix_spawn_file_actions_addopen_works="guessing no";;
+            solaris*) gl_cv_func_posix_spawn_file_actions_addopen_works="guessing no";;
+                      # Guess no on native Windows.
+            mingw*)   gl_cv_func_posix_spawn_file_actions_addopen_works="guessing no" ;;
+            *)        gl_cv_func_posix_spawn_file_actions_addopen_works="guessing yes";;
+          esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <spawn.h>
+#include <fcntl.h>
+int main ()
+{
+  posix_spawn_file_actions_t actions;
+  if (posix_spawn_file_actions_init (&actions) != 0)
+    return 1;
+  if (posix_spawn_file_actions_addopen (&actions, 10000000, "foo", 0, O_RDONLY)
+      == 0)
+    return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_posix_spawn_file_actions_addopen_works=yes
+else $as_nop
+  gl_cv_func_posix_spawn_file_actions_addopen_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_file_actions_addopen_works" >&5
+printf "%s\n" "$gl_cv_func_posix_spawn_file_actions_addopen_works" >&6; }
+    case "$gl_cv_func_posix_spawn_file_actions_addopen_works" in
+      *yes) ;;
+      *) REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=1 ;;
+    esac
+  fi
+
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS spawn_faction_addopen.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN 1" >>confdefs.h
+
+
+
+
+
+
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS spawn_faction_destroy.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_DESTROY 1" >>confdefs.h
+
+
+
+
+
+
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS spawn_faction_init.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_INIT 1" >>confdefs.h
+
+
+
+
+
+
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS spawnattr_destroy.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_POSIX_SPAWNATTR_DESTROY=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWNATTR_DESTROY 1" >>confdefs.h
+
+
+
+
+
+
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS spawnattr_init.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_POSIX_SPAWNATTR_INIT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWNATTR_INIT 1" >>confdefs.h
+
+
+
+
+
+
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS spawnattr_setflags.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_POSIX_SPAWNATTR_SETFLAGS=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWNATTR_SETFLAGS 1" >>confdefs.h
+
+
+
+
+
+
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS spawnattr_setpgroup.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_POSIX_SPAWNATTR_SETPGROUP=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWNATTR_SETPGROUP 1" >>confdefs.h
+
+
+
+
+
+
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS spawnattr_setsigmask.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_POSIX_SPAWNATTR_SETSIGMASK=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWNATTR_SETSIGMASK 1" >>confdefs.h
+
+
+
+
+
+
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS spawnp.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_POSIX_SPAWNP=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWNP 1" >>confdefs.h
+
+
+
+
+
+  if test $gl_cv_func_frexp_no_libm = yes; then
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexp works" >&5
+printf %s "checking whether frexp works... " >&6; }
+if test ${gl_cv_func_frexp_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+           netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;;
+           mingw*) # Guess yes with MSVC, no with mingw.
+             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef _MSC_VER
+ Good
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Good" >/dev/null 2>&1
+then :
+  gl_cv_func_frexp_works="guessing yes"
+else $as_nop
+  gl_cv_func_frexp_works="guessing no"
+fi
+rm -rf conftest*
+
+             ;;
+           *) gl_cv_func_frexp_works="guessing yes" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <float.h>
+#include <math.h>
+#include <string.h>
+#if HAVE_DECL_ALARM
+# include <signal.h>
+# include <unistd.h>
+#endif
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+   ICC 10.0 has a bug when optimizing the expression -zero.
+   The expression -DBL_MIN * DBL_MIN does not work when cross-compiling
+   to PowerPC on Mac OS X 10.5.  */
+#if defined __hpux || defined __sgi || defined __ICC
+static double
+compute_minus_zero (void)
+{
+  return -DBL_MIN * DBL_MIN;
+}
+# define minus_zero compute_minus_zero ()
+#else
+double minus_zero = -0.0;
+#endif
+int main()
+{
+  int result = 0;
+  int i;
+  volatile double x;
+  double zero = 0.0;
+#if HAVE_DECL_ALARM
+  /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite
+     number.  Let the test fail in this case.  */
+  signal (SIGALRM, SIG_DFL);
+  alarm (5);
+#endif
+  /* Test on denormalized numbers.  */
+  for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
+    ;
+  if (x > 0.0)
+    {
+      int exp;
+      double y = frexp (x, &exp);
+      /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022.
+         On NetBSD: y = 0.75. Correct: y = 0.5.  */
+      if (y != 0.5)
+        result |= 1;
+    }
+  /* Test on infinite numbers.  */
+  x = 1.0 / zero;
+  {
+    int exp;
+    double y = frexp (x, &exp);
+    if (y != x)
+      result |= 2;
+  }
+  /* Test on negative zero.  */
+  x = minus_zero;
+  {
+    int exp;
+    double y = frexp (x, &exp);
+    if (memcmp (&y, &x, sizeof x))
+      result |= 4;
+  }
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_frexp_works=yes
+else $as_nop
+  gl_cv_func_frexp_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_works" >&5
+printf "%s\n" "$gl_cv_func_frexp_works" >&6; }
+
+    case "$gl_cv_func_frexp_works" in
+      *yes)
+
+printf "%s\n" "#define HAVE_FREXP_IN_LIBC 1" >>confdefs.h
+
+        ;;
+    esac
+  fi
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ldexp can be used without linking with libm" >&5
+printf %s "checking whether ldexp can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_ldexp_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             double x;
+             int y;
+int
+main (void)
+{
+return ldexp (x, y) < 1;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_ldexp_no_libm=yes
+else $as_nop
+  gl_cv_func_ldexp_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_no_libm" >&5
+printf "%s\n" "$gl_cv_func_ldexp_no_libm" >&6; }
+  if test $gl_cv_func_ldexp_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_LDEXP_IN_LIBC 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexpl() can be used without linking with libm" >&5
+printf %s "checking whether frexpl() can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_frexpl_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             long double x;
+int
+main (void)
+{
+int e; return frexpl (x, &e) > 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_frexpl_no_libm=yes
+else $as_nop
+  gl_cv_func_frexpl_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_no_libm" >&5
+printf "%s\n" "$gl_cv_func_frexpl_no_libm" >&6; }
+
+  if test $gl_cv_func_frexpl_no_libm = yes; then
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether frexpl works" >&5
+printf %s "checking whether frexpl works... " >&6; }
+if test ${gl_cv_func_frexpl_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+           aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*)
+              gl_cv_func_frexpl_works="guessing no";;
+           *) gl_cv_func_frexpl_works="guessing yes";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <float.h>
+#include <math.h>
+/* Override the values of <float.h>, like done in float.in.h.  */
+#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP    (-16381)
+#endif
+#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP    (-16381)
+#endif
+#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP DBL_MIN_EXP
+#endif
+#if defined __sgi && (LDBL_MANT_DIG >= 106)
+# if defined __GNUC__
+#  undef LDBL_MIN_EXP
+#  define LDBL_MIN_EXP DBL_MIN_EXP
+# endif
+#endif
+extern
+#ifdef __cplusplus
+"C"
+#endif
+long double frexpl (long double, int *);
+long double zero = 0.0L;
+int main()
+{
+  int result = 0;
+  volatile long double x;
+  /* Test on finite numbers that fails on AIX 5.1.  */
+  x = 16.0L;
+  {
+    int exp = -9999;
+    frexpl (x, &exp);
+    if (exp != 5)
+      result |= 1;
+  }
+  /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl
+     function returns an invalid (incorrectly normalized) value: it returns
+               y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
+     but the correct result is
+          0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 }  */
+  x = 1.01L;
+  {
+    int exp = -9999;
+    long double y = frexpl (x, &exp);
+    if (!(exp == 1 && y == 0.505L))
+      result |= 2;
+  }
+  /* Test on large finite numbers.  This fails on BeOS at i = 16322, while
+     LDBL_MAX_EXP = 16384.
+     In the loop end test, we test x against Infinity, rather than comparing
+     i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP.  */
+  {
+    int i;
+    for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
+      {
+        int exp = -9999;
+        frexpl (x, &exp);
+        if (exp != i)
+          {
+            result |= 4;
+            break;
+          }
+      }
+  }
+  /* Test on denormalized numbers.  */
+  {
+    int i;
+    for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
+      ;
+    if (x > 0.0L)
+      {
+        int exp;
+        long double y = frexpl (x, &exp);
+        /* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
+           exp = -16382, y = 0.5.  On Mac OS X 10.5: exp = -16384, y = 0.5.  */
+        if (exp != LDBL_MIN_EXP - 1)
+          result |= 8;
+      }
+  }
+  /* Test on infinite numbers.  */
+  /* The Microsoft MSVC 14 compiler chokes on the expression 1.0 / 0.0.  */
+  x = 1.0L / zero;
+  {
+    int exp;
+    long double y = frexpl (x, &exp);
+    if (y != x)
+      result |= 16;
+  }
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_frexpl_works=yes
+else $as_nop
+  gl_cv_func_frexpl_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_works" >&5
+printf "%s\n" "$gl_cv_func_frexpl_works" >&6; }
+
+    case "$gl_cv_func_frexpl_works" in
+      *yes) gl_func_frexpl_no_libm=yes ;;
+      *)    gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;;
+    esac
+  else
+    gl_func_frexpl_no_libm=no
+        REPLACE_FREXPL=1
+  fi
+  if test $gl_func_frexpl_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_FREXPL_IN_LIBC 1" >>confdefs.h
+
+            ac_fn_check_decl "$LINENO" "frexpl" "ac_cv_have_decl_frexpl" "#include <math.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_frexpl" = xyes
+then :
+
+else $as_nop
+  HAVE_DECL_FREXPL=0
+fi
+  fi
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ldexpl() can be used without linking with libm" >&5
+printf %s "checking whether ldexpl() can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_ldexpl_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             long double x;
+int
+main (void)
+{
+return ldexpl (x, -1) > 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_ldexpl_no_libm=yes
+else $as_nop
+  gl_cv_func_ldexpl_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_no_libm" >&5
+printf "%s\n" "$gl_cv_func_ldexpl_no_libm" >&6; }
+
+  if test $gl_cv_func_ldexpl_no_libm = yes; then
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ldexpl works" >&5
+printf %s "checking whether ldexpl works... " >&6; }
+if test ${gl_cv_func_ldexpl_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+           aix | aix[3-6]*) gl_cv_func_ldexpl_works="guessing no" ;;
+                            # Guess yes on native Windows.
+           mingw*)          gl_cv_func_ldexpl_works="guessing yes" ;;
+           *)               gl_cv_func_ldexpl_works="guessing yes" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <math.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+long double ldexpl (long double, int);
+int main()
+{
+  int result = 0;
+  {
+    volatile long double x = 1.0;
+    volatile long double y = ldexpl (x, -1);
+    if (y != 0.5L)
+      result |= 1;
+  }
+  {
+    volatile long double x = 1.73205L;
+    volatile long double y = ldexpl (x, 0);
+    if (y != x)
+      result |= 2;
+  }
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_ldexpl_works=yes
+else $as_nop
+  gl_cv_func_ldexpl_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_works" >&5
+printf "%s\n" "$gl_cv_func_ldexpl_works" >&6; }
+
+    case "$gl_cv_func_ldexpl_works" in
+      *yes)
+
+printf "%s\n" "#define HAVE_LDEXPL_IN_LIBC 1" >>confdefs.h
+
+                        ac_fn_check_decl "$LINENO" "ldexpl" "ac_cv_have_decl_ldexpl" "#include <math.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_ldexpl" = xyes
+then :
+
+else $as_nop
+  HAVE_DECL_LDEXPL=0
+fi
+        ;;
+    esac
+  fi
+
+
+
+  if test $gl_cv_func_vfprintf_posix = no; then
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf.$ac_objext"
+
+  REPLACE_PRINTF=1
+
+printf "%s\n" "#define REPLACE_PRINTF_POSIX 1" >>confdefs.h
+
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_PRINTF_POSIX=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_PRINTF_POSIX 1" >>confdefs.h
+
+
+
+
+  ac_fn_check_decl "$LINENO" "program_invocation_name" "ac_cv_have_decl_program_invocation_name" "#include <errno.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_program_invocation_name" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_PROGRAM_INVOCATION_NAME $ac_have_decl" >>confdefs.h
+
+  ac_fn_check_decl "$LINENO" "program_invocation_short_name" "ac_cv_have_decl_program_invocation_short_name" "#include <errno.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_program_invocation_short_name" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME $ac_have_decl" >>confdefs.h
+
+
+      :
+
+
+
+  :
+
+
+
+
+  ac_fn_c_check_func "$LINENO" "raise" "ac_cv_func_raise"
+if test "x$ac_cv_func_raise" = xyes
+then :
+  printf "%s\n" "#define HAVE_RAISE 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_raise = no; then
+    HAVE_RAISE=0
+  else
+
+
+      if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+        REPLACE_RAISE=1
+      fi
+
+
+
+
+
+  HAVE_POSIX_SIGNALBLOCKING=0
+  if test "$gl_cv_type_sigset_t" = yes; then
+    ac_fn_c_check_func "$LINENO" "sigprocmask" "ac_cv_func_sigprocmask"
+if test "x$ac_cv_func_sigprocmask" = xyes
+then :
+  HAVE_POSIX_SIGNALBLOCKING=1
+fi
+
+  fi
+
+      if test $HAVE_POSIX_SIGNALBLOCKING = 0; then
+        :
+      fi
+
+  fi
+
+  if test $HAVE_RAISE = 0 || test $REPLACE_RAISE = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS raise.$ac_objext"
+
+    :
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_RAISE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_RAISE 1" >>confdefs.h
+
+
+
+
+
+
+
+  ac_fn_c_check_func "$LINENO" "rawmemchr" "ac_cv_func_rawmemchr"
+if test "x$ac_cv_func_rawmemchr" = xyes
+then :
+  printf "%s\n" "#define HAVE_RAWMEMCHR 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_rawmemchr = no; then
+    HAVE_RAWMEMCHR=0
+  fi
+
+  if test $HAVE_RAWMEMCHR = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS rawmemchr.$ac_objext"
+
+    :
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_RAWMEMCHR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_RAWMEMCHR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    use_additional=yes
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+    eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+    eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-libreadline-prefix was given.
+if test ${with_libreadline_prefix+y}
+then :
+  withval=$with_libreadline_prefix;
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+          eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+          eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+        additional_libdir2="$withval/$acl_libdirstem2"
+        additional_libdir3="$withval/$acl_libdirstem3"
+      fi
+    fi
+
+fi
+
+  if test "X$additional_libdir2" = "X$additional_libdir"; then
+    additional_libdir2=
+  fi
+  if test "X$additional_libdir3" = "X$additional_libdir"; then
+    additional_libdir3=
+  fi
+      LIBREADLINE=
+  LTLIBREADLINE=
+  INCREADLINE=
+  LIBREADLINE_PREFIX=
+      HAVE_LIBREADLINE=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='readline '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBREADLINE="${LTLIBREADLINE}${LTLIBREADLINE:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
+          if test $use_additional = yes; then
+            for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do
+              if test "X$found_dir" = "X"; then
+                eval dir=\$$additional_libdir_variable
+                if test -n "$dir"; then
+                                                      if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+                      found_dir="$dir"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                                    if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
+                fi
+              fi
+            done
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBREADLINE; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                                    if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+                      found_dir="$dir"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                                    if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBREADLINE="${LTLIBREADLINE}${LTLIBREADLINE:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "$enable_rpath" = no \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem2" \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then
+                                LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$acl_hardcode_direct" = yes; then
+                                                      LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$found_so"
+                else
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+                                                            LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBREADLINE; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }-L$found_dir"
+                    fi
+                    if test "$acl_hardcode_minus_L" != no; then
+                                                                                        LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$found_a"
+              else
+                                                LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                if test "$name" = 'readline'; then
+                  LIBREADLINE_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+              */$acl_libdirstem2 | */$acl_libdirstem2/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+                if test "$name" = 'readline'; then
+                  LIBREADLINE_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+              */$acl_libdirstem3 | */$acl_libdirstem3/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'`
+                if test "$name" = 'readline'; then
+                  LIBREADLINE_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCREADLINE; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCREADLINE="${INCREADLINE}${INCREADLINE:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \
+                       && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \
+                       && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then
+                      haveit=
+                      if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \
+                         || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \
+                         || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBREADLINE; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$dependency_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$dependency_libdir"; then
+                                                        LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }-L$dependency_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBREADLINE; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$dependency_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$dependency_libdir"; then
+                                                        LTLIBREADLINE="${LTLIBREADLINE}${LTLIBREADLINE:+ }-L$dependency_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                                                                  haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                                                                  haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                                                                                                                                                dep=`echo "X$dep" | sed -e 's/^X-l//'`
+                    if test "X$dep" != Xc \
+                       || case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) false ;;
+                            *)                          true ;;
+                          esac; then
+                      names_next_round="$names_next_round $dep"
+                    fi
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$dep"
+                    LTLIBREADLINE="${LTLIBREADLINE}${LTLIBREADLINE:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }-l$name"
+            LTLIBREADLINE="${LTLIBREADLINE}${LTLIBREADLINE:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBREADLINE="${LIBREADLINE}${LIBREADLINE:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBREADLINE="${LTLIBREADLINE}${LTLIBREADLINE:+ }-R$found_dir"
+    done
+  fi
+
+
+
+
+
+
+          am_save_CPPFLAGS="$CPPFLAGS"
+
+  for element in $INCREADLINE; do
+    haveit=
+    for x in $CPPFLAGS; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline" >&5
+printf %s "checking for readline... " >&6; }
+if test ${gl_cv_lib_readline+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+    gl_cv_lib_readline=no
+    am_save_LIBS="$LIBS"
+                        for extra_lib in "" ncurses termcap curses; do
+      LIBS="$am_save_LIBS $LIBREADLINE"
+      if test -n "$extra_lib"; then
+        LIBS="$LIBS -l$extra_lib"
+      fi
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+#include <readline/readline.h>
+int
+main (void)
+{
+readline((char*)0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  if test -n "$extra_lib"; then
+           gl_cv_lib_readline="yes, requires -l$extra_lib"
+         else
+           gl_cv_lib_readline="yes"
+         fi
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+      if test "$gl_cv_lib_readline" != no; then
+        break
+      fi
+    done
+    LIBS="$am_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_lib_readline" >&5
+printf "%s\n" "$gl_cv_lib_readline" >&6; }
+
+  if test "$gl_cv_lib_readline" != no; then
+
+printf "%s\n" "#define HAVE_READLINE 1" >>confdefs.h
+
+    extra_lib=`echo "$gl_cv_lib_readline" | sed -n -e 's/yes, requires //p'`
+    if test -n "$extra_lib"; then
+      LIBREADLINE="$LIBREADLINE $extra_lib"
+      LTLIBREADLINE="$LTLIBREADLINE $extra_lib"
+    fi
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libreadline" >&5
+printf %s "checking how to link with libreadline... " >&6; }
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBREADLINE" >&5
+printf "%s\n" "$LIBREADLINE" >&6; }
+  else
+            CPPFLAGS="$am_save_CPPFLAGS"
+    LIBREADLINE=
+    LTLIBREADLINE=
+  fi
+
+
+
+  ac_fn_c_check_header_compile "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default"
+if test "x$ac_cv_header_readline_readline_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_READLINE_READLINE_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "readline/history.h" "ac_cv_header_readline_history_h" "$ac_includes_default"
+if test "x$ac_cv_header_readline_history_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_READLINE_HISTORY_H 1" >>confdefs.h
+
+fi
+
+
+  if test "$gl_cv_lib_readline" = no; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS readline.$ac_objext"
+
+
+  :
+
+  fi
+
+
+
+  if test $ac_cv_func_readlink = no; then
+    HAVE_READLINK=0
+  else
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether readlink signature is correct" >&5
+printf %s "checking whether readlink signature is correct... " >&6; }
+if test ${gl_cv_decl_readlink_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <unistd.h>
+      /* Cause compilation failure if original declaration has wrong type.  */
+      ssize_t readlink (const char *, char *, size_t);
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_decl_readlink_works=yes
+else $as_nop
+  gl_cv_decl_readlink_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_readlink_works" >&5
+printf "%s\n" "$gl_cv_decl_readlink_works" >&6; }
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether readlink handles trailing slash correctly" >&5
+printf %s "checking whether readlink handles trailing slash correctly... " >&6; }
+if test ${gl_cv_func_readlink_trailing_slash+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  # We have readlink, so assume ln -s works.
+       ln -s conftest.no-such conftest.link
+       ln -s conftest.link conftest.lnk2
+       if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+            # Guess yes on Linux or glibc systems.
+            linux-* | linux | *-gnu* | gnu*)
+              gl_cv_func_readlink_trailing_slash="guessing yes" ;;
+            # Guess no on AIX or HP-UX.
+            aix* | hpux*)
+              gl_cv_func_readlink_trailing_slash="guessing no" ;;
+            # If we don't know, obey --enable-cross-guesses.
+            *)
+              gl_cv_func_readlink_trailing_slash="$gl_cross_guess_normal" ;;
+          esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <unistd.h>
+
+int
+main (void)
+{
+char buf[20];
+      return readlink ("conftest.lnk2/", buf, sizeof buf) != -1;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_readlink_trailing_slash=yes
+else $as_nop
+  gl_cv_func_readlink_trailing_slash=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      rm -f conftest.link conftest.lnk2
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_readlink_trailing_slash" >&5
+printf "%s\n" "$gl_cv_func_readlink_trailing_slash" >&6; }
+    case "$gl_cv_func_readlink_trailing_slash" in
+      *yes)
+        if test "$gl_cv_decl_readlink_works" != yes; then
+          REPLACE_READLINK=1
+        fi
+        ;;
+      *)
+
+printf "%s\n" "#define READLINK_TRAILING_SLASH_BUG 1" >>confdefs.h
+
+        REPLACE_READLINK=1
+        ;;
+    esac
+
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether readlink truncates results correctly" >&5
+printf %s "checking whether readlink truncates results correctly... " >&6; }
+if test ${gl_cv_func_readlink_truncate+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  # We have readlink, so assume ln -s works.
+       ln -s ab conftest.link
+       if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+            # Guess yes on Linux or glibc systems.
+            linux-* | linux | *-gnu* | gnu*)
+              gl_cv_func_readlink_truncate="guessing yes" ;;
+            # Guess no on AIX or HP-UX.
+            aix* | hpux*)
+              gl_cv_func_readlink_truncate="guessing no" ;;
+            # If we don't know, obey --enable-cross-guesses.
+            *)
+              gl_cv_func_readlink_truncate="$gl_cross_guess_normal" ;;
+          esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <unistd.h>
+
+int
+main (void)
+{
+char c;
+      return readlink ("conftest.link", &c, 1) != 1;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_readlink_truncate=yes
+else $as_nop
+  gl_cv_func_readlink_truncate=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      rm -f conftest.link conftest.lnk2
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_readlink_truncate" >&5
+printf "%s\n" "$gl_cv_func_readlink_truncate" >&6; }
+    case $gl_cv_func_readlink_truncate in
+      *yes)
+        if test "$gl_cv_decl_readlink_works" != yes; then
+          REPLACE_READLINK=1
+        fi
+        ;;
+      *)
+
+printf "%s\n" "#define READLINK_TRUNCATE_BUG 1" >>confdefs.h
+
+        REPLACE_READLINK=1
+        ;;
+    esac
+  fi
+
+  if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS readlink.$ac_objext"
+
+
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_READLINK=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_READLINK 1" >>confdefs.h
+
+
+
+
+
+
+  if test $REPLACE_REALLOC = 0; then
+
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether realloc (0, 0) returns nonnull" >&5
+printf %s "checking whether realloc (0, 0) returns nonnull... " >&6; }
+if test ${ac_cv_func_realloc_0_nonnull+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+          # Guess yes on platforms where we know the result.
+          *-gnu* | freebsd* | netbsd* | openbsd* | bitrig* \
+          | gnu* | *-musl* | midnightbsd* \
+          | hpux* | solaris* | cygwin* | mingw* | msys* )
+            ac_cv_func_realloc_0_nonnull="guessing yes" ;;
+          # If we don't know, obey --enable-cross-guesses.
+          *) ac_cv_func_realloc_0_nonnull="$gl_cross_guess_normal" ;;
+        esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+int
+main (void)
+{
+void *p = realloc (0, 0);
+            int result = !p;
+            free (p);
+            return result;
+  ;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  ac_cv_func_realloc_0_nonnull=yes
+else $as_nop
+  ac_cv_func_realloc_0_nonnull=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5
+printf "%s\n" "$ac_cv_func_realloc_0_nonnull" >&6; }
+  case $ac_cv_func_realloc_0_nonnull in #(
+  *yes) :
+     ;; #(
+  *) :
+    REPLACE_REALLOC=1 ;;
+esac
+
+  fi
+
+  if test $REPLACE_REALLOC = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS realloc.$ac_objext"
+
+  fi
+
+
+
+  if test $REPLACE_MALLOC = 1; then
+    REPLACE_REALLOC=1
+  fi
+
+  if test $REPLACE_REALLOC = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS realloc.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_REALLOC_POSIX=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_REALLOC_POSIX 1" >>confdefs.h
+
+
+
+
+
+
+
+
+  ac_fn_c_check_func "$LINENO" "reallocarray" "ac_cv_func_reallocarray"
+if test "x$ac_cv_func_reallocarray" = xyes
+then :
+  printf "%s\n" "#define HAVE_REALLOCARRAY 1" >>confdefs.h
+
+fi
+
+  if test "$ac_cv_func_reallocarray" = no; then
+    HAVE_REALLOCARRAY=0
+  elif test "$gl_cv_malloc_ptrdiff" = no; then
+    REPLACE_REALLOCARRAY=1
+  fi
+
+  if test $HAVE_REALLOCARRAY = 0 || test $REPLACE_REALLOCARRAY = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS reallocarray.$ac_objext"
+
+    :
+  fi
+
+
+printf "%s\n" "#define GNULIB_REALLOCARRAY 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_REALLOCARRAY=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_REALLOCARRAY 1" >>confdefs.h
+
+
+
+
+
+
+
+
+  : ${RELOCATABLE_CONFIG_H_DIR='$(top_builddir)'}
+  RELOCATABLE_SRC_DIR="\$(top_srcdir)/$gl_source_base"
+  RELOCATABLE_BUILD_DIR="\$(top_builddir)/$gl_source_base"
+
+  if test $RELOCATABLE = yes; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS progreloc.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS relocatable.$ac_objext"
+
+  fi
+
+
+
+
+  :
+
+
+
+
+
+
+
+
+  case "$host_os" in
+    mingw*) ;;
+    *)      ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd"
+if test "x$ac_cv_func_getcwd" = xyes
+then :
+  printf "%s\n" "#define HAVE_GETCWD 1" >>confdefs.h
+
+fi
+ ;;
+  esac
+
+
+
+
+
+
+
+
+
+  if test "$gl_cv_func_malloc_posix" = yes; then
+
+printf "%s\n" "#define HAVE_MALLOC_POSIX 1" >>confdefs.h
+
+  else
+    REPLACE_MALLOC=1
+  fi
+
+
+
+
+  if test $REPLACE_MALLOC = 1; then
+    REPLACE_REALLOC=1
+  fi
+
+
+
+
+                          { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether free is known to preserve errno" >&5
+printf %s "checking whether free is known to preserve errno... " >&6; }
+if test ${gl_cv_func_free_preserves_errno+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+int
+main (void)
+{
+#if 2 < __GLIBC__ + (33 <= __GLIBC_MINOR__)
+            #elif defined __OpenBSD__
+            #elif defined __sun
+            #else
+              #error "'free' is not known to preserve errno"
+            #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_func_free_preserves_errno=yes
+else $as_nop
+  gl_cv_func_free_preserves_errno=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_free_preserves_errno" >&5
+printf "%s\n" "$gl_cv_func_free_preserves_errno" >&6; }
+
+  case $gl_cv_func_free_preserves_errno in
+   *yes)
+
+printf "%s\n" "#define HAVE_FREE_POSIX 1" >>confdefs.h
+
+    ;;
+   *) REPLACE_FREE=1 ;;
+  esac
+
+
+
+
+
+
+
+  ac_fn_c_check_func "$LINENO" "mempcpy" "ac_cv_func_mempcpy"
+if test "x$ac_cv_func_mempcpy" = xyes
+then :
+  printf "%s\n" "#define HAVE_MEMPCPY 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_mempcpy = no; then
+    HAVE_MEMPCPY=0
+  fi
+
+
+
+
+
+  ac_fn_c_check_func "$LINENO" "rawmemchr" "ac_cv_func_rawmemchr"
+if test "x$ac_cv_func_rawmemchr" = xyes
+then :
+  printf "%s\n" "#define HAVE_RAWMEMCHR 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_rawmemchr = no; then
+    HAVE_RAWMEMCHR=0
+  fi
+
+
+
+
+
+
+
+
+
+
+  if test $ac_cv_have_decl_setenv = no; then
+    HAVE_DECL_SETENV=0
+  fi
+
+
+
+
+
+  ac_fn_c_check_header_compile "$LINENO" "search.h" "ac_cv_header_search_h" "$ac_includes_default"
+if test "x$ac_cv_header_search_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_SEARCH_H 1" >>confdefs.h
+
+fi
+
+  ac_fn_c_check_func "$LINENO" "tsearch" "ac_cv_func_tsearch"
+if test "x$ac_cv_func_tsearch" = xyes
+then :
+  printf "%s\n" "#define HAVE_TSEARCH 1" >>confdefs.h
+
+fi
+
+
+
+
+  relocatable_sh=$ac_aux_dir/relocatable.sh.in
+
+
+
+
+
+
+                { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether rename honors trailing slash on destination" >&5
+printf %s "checking whether rename honors trailing slash on destination... " >&6; }
+if test ${gl_cv_func_rename_slash_dst_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  rm -rf conftest.f conftest.f1 conftest.f2 conftest.d1 conftest.d2 conftest.lnk
+    touch conftest.f && touch conftest.f1 && mkdir conftest.d1 ||
+      as_fn_error $? "cannot create temporary files" "$LINENO" 5
+    # Assume that if we have lstat, we can also check symlinks.
+    if test $ac_cv_func_lstat = yes; then
+      ln -s conftest.f conftest.lnk
+    fi
+    if test "$cross_compiling" = yes
+then :
+        case "$host_os" in
+                          # Guess yes on Linux systems.
+         linux-* | linux) gl_cv_func_rename_slash_dst_works="guessing yes" ;;
+                          # Guess yes on glibc systems.
+         *-gnu*)          gl_cv_func_rename_slash_dst_works="guessing yes" ;;
+                          # Guess no on native Windows.
+         mingw*)          gl_cv_func_rename_slash_dst_works="guessing no" ;;
+                          # If we don't know, obey --enable-cross-guesses.
+         *)               gl_cv_func_rename_slash_dst_works="$gl_cross_guess_normal" ;;
+       esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#        include <stdio.h>
+#        include <stdlib.h>
+
+int
+main (void)
+{
+int result = 0;
+           if (rename ("conftest.f1", "conftest.f2/") == 0)
+             result |= 1;
+           if (rename ("conftest.d1", "conftest.d2/") != 0)
+             result |= 2;
+#if HAVE_LSTAT
+           if (rename ("conftest.f", "conftest.lnk/") == 0)
+             result |= 4;
+#endif
+           return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_rename_slash_dst_works=yes
+else $as_nop
+  gl_cv_func_rename_slash_dst_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+    rm -rf conftest.f conftest.f1 conftest.f2 conftest.d1 conftest.d2 conftest.lnk
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rename_slash_dst_works" >&5
+printf "%s\n" "$gl_cv_func_rename_slash_dst_works" >&6; }
+  case "$gl_cv_func_rename_slash_dst_works" in
+    *yes) ;;
+    *)
+      REPLACE_RENAME=1
+
+printf "%s\n" "#define RENAME_TRAILING_SLASH_DEST_BUG 1" >>confdefs.h
+
+      ;;
+  esac
+
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether rename honors trailing slash on source" >&5
+printf %s "checking whether rename honors trailing slash on source... " >&6; }
+if test ${gl_cv_func_rename_slash_src_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.d3 conftest.lnk
+    touch conftest.f && touch conftest.f1 && mkdir conftest.d1 ||
+      as_fn_error $? "cannot create temporary files" "$LINENO" 5
+    # Assume that if we have lstat, we can also check symlinks.
+    if test $ac_cv_func_lstat = yes; then
+      ln -s conftest.f conftest.lnk
+    fi
+    if test "$cross_compiling" = yes
+then :
+        case "$host_os" in
+                          # Guess yes on Linux systems.
+         linux-* | linux) gl_cv_func_rename_slash_src_works="guessing yes" ;;
+                          # Guess yes on glibc systems.
+         *-gnu*)          gl_cv_func_rename_slash_src_works="guessing yes" ;;
+                          # Guess yes on native Windows.
+         mingw*)          gl_cv_func_rename_slash_src_works="guessing yes" ;;
+                          # If we don't know, obey --enable-cross-guesses.
+         *)               gl_cv_func_rename_slash_src_works="$gl_cross_guess_normal" ;;
+       esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#        include <stdio.h>
+#        include <stdlib.h>
+
+int
+main (void)
+{
+int result = 0;
+           if (rename ("conftest.f1/", "conftest.d3") == 0)
+             result |= 1;
+           if (rename ("conftest.d1/", "conftest.d2") != 0)
+             result |= 2;
+#if HAVE_LSTAT
+           if (rename ("conftest.lnk/", "conftest.f") == 0)
+             result |= 4;
+#endif
+           return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_rename_slash_src_works=yes
+else $as_nop
+  gl_cv_func_rename_slash_src_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+    rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.d3 conftest.lnk
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rename_slash_src_works" >&5
+printf "%s\n" "$gl_cv_func_rename_slash_src_works" >&6; }
+  case "$gl_cv_func_rename_slash_src_works" in
+    *yes) ;;
+    *)
+      REPLACE_RENAME=1
+
+printf "%s\n" "#define RENAME_TRAILING_SLASH_SOURCE_BUG 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether rename manages hard links correctly" >&5
+printf %s "checking whether rename manages hard links correctly... " >&6; }
+if test ${gl_cv_func_rename_link_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test $ac_cv_func_link = yes; then
+       if test $cross_compiling != yes; then
+         rm -rf conftest.f conftest.f1 conftest.f2
+         if touch conftest.f conftest.f2 && ln conftest.f conftest.f1 &&
+             set x `ls -i conftest.f conftest.f1` && test "" = ""; then
+           if test "$cross_compiling" = yes
+then :
+                :
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#               include <errno.h>
+#               include <stdio.h>
+#               include <stdlib.h>
+#               include <unistd.h>
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+int result = 0;
+                  if (rename ("conftest.f", "conftest.f1"))
+                    result |= 1;
+                  if (unlink ("conftest.f1"))
+                    result |= 2;
+
+                  /* Allow either the POSIX-required behavior, where the
+                     previous rename kept conftest.f, or the (better) NetBSD
+                     behavior, where it removed conftest.f.  */
+                  if (rename ("conftest.f", "conftest.f") != 0
+                      && errno != ENOENT)
+                    result |= 4;
+
+                  if (rename ("conftest.f1", "conftest.f1") == 0)
+                    result |= 8;
+                  if (rename ("conftest.f2", "conftest.f2") != 0)
+                    result |= 16;
+                  return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_rename_link_works=yes
+else $as_nop
+  gl_cv_func_rename_link_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+         else
+           gl_cv_func_rename_link_works="guessing no"
+         fi
+         rm -rf conftest.f conftest.f1 conftest.f2
+       else
+                  case "$host_os" in
+                            # Guess yes on Linux systems.
+           linux-* | linux) gl_cv_func_rename_link_works="guessing yes" ;;
+                            # Guess yes on glibc systems.
+           *-gnu*)          gl_cv_func_rename_link_works="guessing yes" ;;
+                            # Guess yes on native Windows.
+           mingw*)          gl_cv_func_rename_link_works="guessing yes" ;;
+                            # If we don't know, obey --enable-cross-guesses.
+           *)               gl_cv_func_rename_link_works="$gl_cross_guess_normal" ;;
+         esac
+       fi
+     else
+       gl_cv_func_rename_link_works=yes
+     fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rename_link_works" >&5
+printf "%s\n" "$gl_cv_func_rename_link_works" >&6; }
+  case "$gl_cv_func_rename_link_works" in
+    *yes) ;;
+    *)
+      REPLACE_RENAME=1
+
+printf "%s\n" "#define RENAME_HARD_LINK_BUG 1" >>confdefs.h
+
+      ;;
+  esac
+
+          { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether rename manages existing destinations correctly" >&5
+printf %s "checking whether rename manages existing destinations correctly... " >&6; }
+if test ${gl_cv_func_rename_dest_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  rm -rf conftest.f conftest.d1 conftest.d2
+    touch conftest.f && mkdir conftest.d1 conftest.d2 ||
+      as_fn_error $? "cannot create temporary files" "$LINENO" 5
+    if test "$cross_compiling" = yes
+then :
+        case "$host_os" in
+                          # Guess yes on Linux systems.
+         linux-* | linux) gl_cv_func_rename_dest_works="guessing yes" ;;
+                          # Guess yes on glibc systems.
+         *-gnu*)          gl_cv_func_rename_dest_works="guessing yes" ;;
+                          # Guess no on native Windows.
+         mingw*)          gl_cv_func_rename_dest_works="guessing no" ;;
+                          # If we don't know, obey --enable-cross-guesses.
+         *)               gl_cv_func_rename_dest_works="$gl_cross_guess_normal" ;;
+       esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#        include <stdio.h>
+#        include <stdlib.h>
+
+int
+main (void)
+{
+int result = 0;
+           if (rename ("conftest.d1", "conftest.d2") != 0)
+             result |= 1;
+           if (rename ("conftest.d2", "conftest.f") == 0)
+             result |= 2;
+           return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_rename_dest_works=yes
+else $as_nop
+  gl_cv_func_rename_dest_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+    rm -rf conftest.f conftest.d1 conftest.d2
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rename_dest_works" >&5
+printf "%s\n" "$gl_cv_func_rename_dest_works" >&6; }
+  case "$gl_cv_func_rename_dest_works" in
+    *yes) ;;
+    *)
+      REPLACE_RENAME=1
+
+printf "%s\n" "#define RENAME_DEST_EXISTS_BUG 1" >>confdefs.h
+
+      ;;
+  esac
+
+  if test $REPLACE_RENAME = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS rename.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_RENAME=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_RENAME 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+  if test $ac_cv_func_sigaction = yes; then
+    ac_fn_c_check_member "$LINENO" "struct sigaction" "sa_sigaction" "ac_cv_member_struct_sigaction_sa_sigaction" "#include <signal.h>
+"
+if test "x$ac_cv_member_struct_sigaction_sa_sigaction" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_SIGACTION_SA_SIGACTION 1" >>confdefs.h
+
+
+fi
+
+    if test $ac_cv_member_struct_sigaction_sa_sigaction = no; then
+      HAVE_STRUCT_SIGACTION_SA_SIGACTION=0
+    fi
+  else
+    HAVE_SIGACTION=0
+  fi
+
+  if test $HAVE_SIGACTION = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS sigaction.$ac_objext"
+
+
+
+
+
+
+
+  ac_fn_c_check_type "$LINENO" "siginfo_t" "ac_cv_type_siginfo_t" "
+#include <signal.h>
+
+"
+if test "x$ac_cv_type_siginfo_t" = xyes
+then :
+
+printf "%s\n" "#define HAVE_SIGINFO_T 1" >>confdefs.h
+
+
+fi
+
+  if test $ac_cv_type_siginfo_t = no; then
+    HAVE_SIGINFO_T=0
+  fi
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_SIGACTION=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SIGACTION 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for signbit macro" >&5
+printf %s "checking for signbit macro... " >&6; }
+if test ${gl_cv_func_signbit+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                          # Guess yes on glibc systems.
+           *-gnu* | gnu*) gl_cv_func_signbit="guessing yes" ;;
+                          # Guess yes on musl systems.
+           *-musl*)       gl_cv_func_signbit="guessing yes" ;;
+                          # Guess yes on native Windows.
+           mingw*)        gl_cv_func_signbit="guessing yes" ;;
+                          # If we don't know, obey --enable-cross-guesses.
+           *)             gl_cv_func_signbit="$gl_cross_guess_normal" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <math.h>
+/* If signbit is defined as a function, don't use it, since calling it for
+   'float' or 'long double' arguments would involve conversions.
+   If signbit is not declared at all but exists as a library function, don't
+   use it, since the prototype may not match.
+   If signbit is not declared at all but exists as a compiler built-in, don't
+   use it, since it's preferable to use __builtin_signbit* (no warnings,
+   no conversions).  */
+#ifndef signbit
+# error "signbit should be a macro"
+#endif
+#include <string.h>
+
+/* Global variables.
+   Needed because GCC 4 constant-folds __builtin_signbitl (literal)
+   but cannot constant-fold            __builtin_signbitl (variable).  */
+float vf;
+double vd;
+long double vl;
+int main ()
+{
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+   So we use -p0f and -p0d instead.  */
+float p0f = 0.0f;
+float m0f = -p0f;
+double p0d = 0.0;
+double m0d = -p0d;
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+   So we use another constant expression instead.
+   But that expression does not work on other platforms, such as when
+   cross-compiling to PowerPC on Mac OS X 10.5.  */
+long double p0l = 0.0L;
+#if defined __hpux || defined __sgi
+long double m0l = -LDBL_MIN * LDBL_MIN;
+#else
+long double m0l = -p0l;
+#endif
+  int result = 0;
+  if (signbit (vf)) /* link check */
+    vf++;
+  {
+    float plus_inf = 1.0f / p0f;
+    float minus_inf = -1.0f / p0f;
+    if (!(!signbit (255.0f)
+          && signbit (-255.0f)
+          && !signbit (p0f)
+          && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f))
+          && !signbit (plus_inf)
+          && signbit (minus_inf)))
+      result |= 1;
+  }
+  if (signbit (vd)) /* link check */
+    vd++;
+  {
+    double plus_inf = 1.0 / p0d;
+    double minus_inf = -1.0 / p0d;
+    if (!(!signbit (255.0)
+          && signbit (-255.0)
+          && !signbit (p0d)
+          && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d))
+          && !signbit (plus_inf)
+          && signbit (minus_inf)))
+      result |= 2;
+  }
+  if (signbit (vl)) /* link check */
+    vl++;
+  {
+    long double plus_inf = 1.0L / p0l;
+    long double minus_inf = -1.0L / p0l;
+    if (signbit (255.0L))
+      result |= 4;
+    if (!signbit (-255.0L))
+      result |= 4;
+    if (signbit (p0l))
+      result |= 8;
+    if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l)))
+      result |= 16;
+    if (signbit (plus_inf))
+      result |= 32;
+    if (!signbit (minus_inf))
+      result |= 64;
+  }
+  return result;
+}
+
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_signbit=yes
+else $as_nop
+  gl_cv_func_signbit=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_signbit" >&5
+printf "%s\n" "$gl_cv_func_signbit" >&6; }
+          { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for signbit compiler built-ins" >&5
+printf %s "checking for signbit compiler built-ins... " >&6; }
+if test ${gl_cv_func_signbit_builtins+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                          # Guess yes on glibc systems.
+           *-gnu* | gnu*) gl_cv_func_signbit_builtins="guessing yes" ;;
+                          # Guess yes on musl systems.
+           *-musl*)       gl_cv_func_signbit_builtins="guessing yes" ;;
+                          # Guess yes on mingw, no on MSVC.
+           mingw*)        if test -n "$GCC"; then
+                            gl_cv_func_signbit_builtins="guessing yes"
+                          else
+                            gl_cv_func_signbit_builtins="guessing no"
+                          fi
+                          ;;
+                          # If we don't know, obey --enable-cross-guesses.
+           *)             gl_cv_func_signbit_builtins="$gl_cross_guess_normal" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# define signbit(x) \
+   (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
+    sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
+    __builtin_signbitf (x))
+#else
+# error "signbit should be three compiler built-ins"
+#endif
+#include <string.h>
+
+/* Global variables.
+   Needed because GCC 4 constant-folds __builtin_signbitl (literal)
+   but cannot constant-fold            __builtin_signbitl (variable).  */
+float vf;
+double vd;
+long double vl;
+int main ()
+{
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+   So we use -p0f and -p0d instead.  */
+float p0f = 0.0f;
+float m0f = -p0f;
+double p0d = 0.0;
+double m0d = -p0d;
+/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
+   So we use another constant expression instead.
+   But that expression does not work on other platforms, such as when
+   cross-compiling to PowerPC on Mac OS X 10.5.  */
+long double p0l = 0.0L;
+#if defined __hpux || defined __sgi
+long double m0l = -LDBL_MIN * LDBL_MIN;
+#else
+long double m0l = -p0l;
+#endif
+  int result = 0;
+  if (signbit (vf)) /* link check */
+    vf++;
+  {
+    float plus_inf = 1.0f / p0f;
+    float minus_inf = -1.0f / p0f;
+    if (!(!signbit (255.0f)
+          && signbit (-255.0f)
+          && !signbit (p0f)
+          && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f))
+          && !signbit (plus_inf)
+          && signbit (minus_inf)))
+      result |= 1;
+  }
+  if (signbit (vd)) /* link check */
+    vd++;
+  {
+    double plus_inf = 1.0 / p0d;
+    double minus_inf = -1.0 / p0d;
+    if (!(!signbit (255.0)
+          && signbit (-255.0)
+          && !signbit (p0d)
+          && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d))
+          && !signbit (plus_inf)
+          && signbit (minus_inf)))
+      result |= 2;
+  }
+  if (signbit (vl)) /* link check */
+    vl++;
+  {
+    long double plus_inf = 1.0L / p0l;
+    long double minus_inf = -1.0L / p0l;
+    if (signbit (255.0L))
+      result |= 4;
+    if (!signbit (-255.0L))
+      result |= 4;
+    if (signbit (p0l))
+      result |= 8;
+    if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l)))
+      result |= 16;
+    if (signbit (plus_inf))
+      result |= 32;
+    if (!signbit (minus_inf))
+      result |= 64;
+  }
+  return result;
+}
+
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_signbit_builtins=yes
+else $as_nop
+  gl_cv_func_signbit_builtins=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_signbit_builtins" >&5
+printf "%s\n" "$gl_cv_func_signbit_builtins" >&6; }
+      case "$gl_cv_func_signbit_builtins" in
+    *yes)
+      REPLACE_SIGNBIT_USING_BUILTINS=1
+      ;;
+    *)
+      case "$gl_cv_func_signbit" in
+        *yes) ;;
+        *)
+                    REPLACE_SIGNBIT=1
+          ;;
+      esac
+      ;;
+  esac
+          case "$host_os" in
+    solaris*)
+      REPLACE_SIGNBIT=1
+      ;;
+  esac
+  if test $REPLACE_SIGNBIT = 1; then
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'float'" >&5
+printf %s "checking where to find the sign bit in a 'float'... " >&6; }
+if test ${gl_cv_cc_float_signbit+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+                              gl_cv_cc_float_signbit="unknown"
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stddef.h>
+#include <stdio.h>
+#define NWORDS \
+  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { float value; unsigned int word[NWORDS]; }
+        memory_float;
+static memory_float plus = { 1.0f };
+static memory_float minus = { -1.0f };
+int main ()
+{
+  size_t j, k, i;
+  unsigned int m;
+  FILE *fp = fopen ("conftest.out", "w");
+  if (fp == NULL)
+    return 1;
+  /* Find the different bit.  */
+  k = 0; m = 0;
+  for (j = 0; j < NWORDS; j++)
+    {
+      unsigned int x = plus.word[j] ^ minus.word[j];
+      if ((x & (x - 1)) || (x && m))
+        {
+          /* More than one bit difference.  */
+          fprintf (fp, "unknown");
+          fclose (fp);
+          return 2;
+        }
+      if (x)
+        {
+          k = j;
+          m = x;
+        }
+    }
+  if (m == 0)
+    {
+      /* No difference.  */
+      fprintf (fp, "unknown");
+      fclose (fp);
+      return 3;
+    }
+  /* Now m = plus.word[k] ^ ~minus.word[k].  */
+  if (plus.word[k] & ~minus.word[k])
+    {
+      /* Oh? The sign bit is set in the positive and cleared in the negative
+         numbers?  */
+      fprintf (fp, "unknown");
+      fclose (fp);
+      return 4;
+    }
+  for (i = 0; ; i++)
+    if ((m >> i) & 1)
+      break;
+  fprintf (fp, "word %d bit %d", (int) k, (int) i);
+  if (fclose (fp) != 0)
+    return 5;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_cc_float_signbit=`cat conftest.out`
+else $as_nop
+  gl_cv_cc_float_signbit="unknown"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      rm -f conftest.out
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_signbit" >&5
+printf "%s\n" "$gl_cv_cc_float_signbit" >&6; }
+  case "$gl_cv_cc_float_signbit" in
+    word*bit*)
+      word=`echo "$gl_cv_cc_float_signbit" | sed -e 's/word //' -e 's/ bit.*//'`
+      bit=`echo "$gl_cv_cc_float_signbit" | sed -e 's/word.*bit //'`
+
+printf "%s\n" "#define FLT_SIGNBIT_WORD $word" >>confdefs.h
+
+
+printf "%s\n" "#define FLT_SIGNBIT_BIT $bit" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'double'" >&5
+printf %s "checking where to find the sign bit in a 'double'... " >&6; }
+if test ${gl_cv_cc_double_signbit+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+                              gl_cv_cc_double_signbit="unknown"
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stddef.h>
+#include <stdio.h>
+#define NWORDS \
+  ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { double value; unsigned int word[NWORDS]; }
+        memory_float;
+static memory_float plus = { 1.0 };
+static memory_float minus = { -1.0 };
+int main ()
+{
+  size_t j, k, i;
+  unsigned int m;
+  FILE *fp = fopen ("conftest.out", "w");
+  if (fp == NULL)
+    return 1;
+  /* Find the different bit.  */
+  k = 0; m = 0;
+  for (j = 0; j < NWORDS; j++)
+    {
+      unsigned int x = plus.word[j] ^ minus.word[j];
+      if ((x & (x - 1)) || (x && m))
+        {
+          /* More than one bit difference.  */
+          fprintf (fp, "unknown");
+          fclose (fp);
+          return 2;
+        }
+      if (x)
+        {
+          k = j;
+          m = x;
+        }
+    }
+  if (m == 0)
+    {
+      /* No difference.  */
+      fprintf (fp, "unknown");
+      fclose (fp);
+      return 3;
+    }
+  /* Now m = plus.word[k] ^ ~minus.word[k].  */
+  if (plus.word[k] & ~minus.word[k])
+    {
+      /* Oh? The sign bit is set in the positive and cleared in the negative
+         numbers?  */
+      fprintf (fp, "unknown");
+      fclose (fp);
+      return 4;
+    }
+  for (i = 0; ; i++)
+    if ((m >> i) & 1)
+      break;
+  fprintf (fp, "word %d bit %d", (int) k, (int) i);
+  if (fclose (fp) != 0)
+    return 5;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_cc_double_signbit=`cat conftest.out`
+else $as_nop
+  gl_cv_cc_double_signbit="unknown"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      rm -f conftest.out
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_signbit" >&5
+printf "%s\n" "$gl_cv_cc_double_signbit" >&6; }
+  case "$gl_cv_cc_double_signbit" in
+    word*bit*)
+      word=`echo "$gl_cv_cc_double_signbit" | sed -e 's/word //' -e 's/ bit.*//'`
+      bit=`echo "$gl_cv_cc_double_signbit" | sed -e 's/word.*bit //'`
+
+printf "%s\n" "#define DBL_SIGNBIT_WORD $word" >>confdefs.h
+
+
+printf "%s\n" "#define DBL_SIGNBIT_BIT $bit" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'long double'" >&5
+printf %s "checking where to find the sign bit in a 'long double'... " >&6; }
+if test ${gl_cv_cc_long_double_signbit+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+                              gl_cv_cc_long_double_signbit="unknown"
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stddef.h>
+#include <stdio.h>
+#define NWORDS \
+  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { long double value; unsigned int word[NWORDS]; }
+        memory_float;
+static memory_float plus = { 1.0L };
+static memory_float minus = { -1.0L };
+int main ()
+{
+  size_t j, k, i;
+  unsigned int m;
+  FILE *fp = fopen ("conftest.out", "w");
+  if (fp == NULL)
+    return 1;
+  /* Find the different bit.  */
+  k = 0; m = 0;
+  for (j = 0; j < NWORDS; j++)
+    {
+      unsigned int x = plus.word[j] ^ minus.word[j];
+      if ((x & (x - 1)) || (x && m))
+        {
+          /* More than one bit difference.  */
+          fprintf (fp, "unknown");
+          fclose (fp);
+          return 2;
+        }
+      if (x)
+        {
+          k = j;
+          m = x;
+        }
+    }
+  if (m == 0)
+    {
+      /* No difference.  */
+      fprintf (fp, "unknown");
+      fclose (fp);
+      return 3;
+    }
+  /* Now m = plus.word[k] ^ ~minus.word[k].  */
+  if (plus.word[k] & ~minus.word[k])
+    {
+      /* Oh? The sign bit is set in the positive and cleared in the negative
+         numbers?  */
+      fprintf (fp, "unknown");
+      fclose (fp);
+      return 4;
+    }
+  for (i = 0; ; i++)
+    if ((m >> i) & 1)
+      break;
+  fprintf (fp, "word %d bit %d", (int) k, (int) i);
+  if (fclose (fp) != 0)
+    return 5;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_cc_long_double_signbit=`cat conftest.out`
+else $as_nop
+  gl_cv_cc_long_double_signbit="unknown"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      rm -f conftest.out
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_signbit" >&5
+printf "%s\n" "$gl_cv_cc_long_double_signbit" >&6; }
+  case "$gl_cv_cc_long_double_signbit" in
+    word*bit*)
+      word=`echo "$gl_cv_cc_long_double_signbit" | sed -e 's/word //' -e 's/ bit.*//'`
+      bit=`echo "$gl_cv_cc_long_double_signbit" | sed -e 's/word.*bit //'`
+
+printf "%s\n" "#define LDBL_SIGNBIT_WORD $word" >>confdefs.h
+
+
+printf "%s\n" "#define LDBL_SIGNBIT_BIT $bit" >>confdefs.h
+
+      ;;
+  esac
+
+
+    if test "$gl_cv_cc_float_signbit" = unknown; then
+            ac_fn_check_decl "$LINENO" "copysignf" "ac_cv_have_decl_copysignf" "#include <math.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_copysignf" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_COPYSIGNF $ac_have_decl" >>confdefs.h
+
+      if test "$ac_cv_have_decl_copysignf" = yes; then
+                { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether copysignf can be used without linking with libm" >&5
+printf %s "checking whether copysignf can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_copysignf_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+                   float x, y;
+int
+main (void)
+{
+return copysignf (x, y) < 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_copysignf_no_libm=yes
+else $as_nop
+  gl_cv_func_copysignf_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysignf_no_libm" >&5
+printf "%s\n" "$gl_cv_func_copysignf_no_libm" >&6; }
+        if test $gl_cv_func_copysignf_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_COPYSIGNF_IN_LIBC 1" >>confdefs.h
+
+        fi
+      fi
+    fi
+    if test "$gl_cv_cc_double_signbit" = unknown; then
+            ac_fn_check_decl "$LINENO" "copysign" "ac_cv_have_decl_copysign" "#include <math.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_copysign" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_COPYSIGN $ac_have_decl" >>confdefs.h
+
+      if test "$ac_cv_have_decl_copysign" = yes; then
+                { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether copysign can be used without linking with libm" >&5
+printf %s "checking whether copysign can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_copysign_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+                   double x, y;
+int
+main (void)
+{
+return copysign (x, y) < 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_copysign_no_libm=yes
+else $as_nop
+  gl_cv_func_copysign_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysign_no_libm" >&5
+printf "%s\n" "$gl_cv_func_copysign_no_libm" >&6; }
+        if test $gl_cv_func_copysign_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_COPYSIGN_IN_LIBC 1" >>confdefs.h
+
+        fi
+      fi
+    fi
+    if test "$gl_cv_cc_long_double_signbit" = unknown; then
+            ac_fn_check_decl "$LINENO" "copysignl" "ac_cv_have_decl_copysignl" "#include <math.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_copysignl" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_COPYSIGNL $ac_have_decl" >>confdefs.h
+
+      if test "$ac_cv_have_decl_copysignl" = yes; then
+                { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether copysignl can be used without linking with libm" >&5
+printf %s "checking whether copysignl can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_copysignl_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+                   long double x, y;
+int
+main (void)
+{
+return copysignl (x, y) < 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_copysignl_no_libm=yes
+else $as_nop
+  gl_cv_func_copysignl_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysignl_no_libm" >&5
+printf "%s\n" "$gl_cv_func_copysignl_no_libm" >&6; }
+        if test $gl_cv_func_copysignl_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_COPYSIGNL_IN_LIBC 1" >>confdefs.h
+
+        fi
+      fi
+    fi
+  fi
+
+  if test $REPLACE_SIGNBIT = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS signbitf.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS signbitd.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS signbitl.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_SIGNBIT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SIGNBIT 1" >>confdefs.h
+
+
+
+
+
+
+  HAVE_POSIX_SIGNALBLOCKING=0
+  if test "$gl_cv_type_sigset_t" = yes; then
+    ac_fn_c_check_func "$LINENO" "sigprocmask" "ac_cv_func_sigprocmask"
+if test "x$ac_cv_func_sigprocmask" = xyes
+then :
+  HAVE_POSIX_SIGNALBLOCKING=1
+fi
+
+  fi
+
+  if test $HAVE_POSIX_SIGNALBLOCKING = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS sigprocmask.$ac_objext"
+
+    :
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_SIGPROCMASK=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SIGPROCMASK 1" >>confdefs.h
+
+
+
+
+  ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdint_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h
+
+fi
+
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SIZE_MAX" >&5
+printf %s "checking for SIZE_MAX... " >&6; }
+if test ${gl_cv_size_max+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+    gl_cv_size_max=no
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <limits.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef SIZE_MAX
+Found it
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Found it" >/dev/null 2>&1
+then :
+  gl_cv_size_max=yes
+fi
+rm -rf conftest*
+
+    if test $gl_cv_size_max != yes; then
+                        if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) * CHAR_BIT - 1" "size_t_bits_minus_1"        "#include <stddef.h>
+#include <limits.h>"
+then :
+
+else $as_nop
+  size_t_bits_minus_1=
+fi
+
+      if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) <= sizeof (unsigned int)" "fits_in_uint"        "#include <stddef.h>"
+then :
+
+else $as_nop
+  fits_in_uint=
+fi
+
+      if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then
+        if test $fits_in_uint = 1; then
+                              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stddef.h>
+                 extern size_t foo;
+                 extern unsigned long foo;
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  fits_in_uint=0
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+        fi
+                                if test $fits_in_uint = 1; then
+          gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)"
+        else
+          gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)"
+        fi
+      else
+                gl_cv_size_max='((size_t)~(size_t)0)'
+      fi
+    fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_size_max" >&5
+printf "%s\n" "$gl_cv_size_max" >&6; }
+  if test "$gl_cv_size_max" != yes; then
+
+printf "%s\n" "#define SIZE_MAX $gl_cv_size_max" >>confdefs.h
+
+  fi
+
+
+
+
+  gl_cv_func_snprintf_usable=no
+  ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf"
+if test "x$ac_cv_func_snprintf" = xyes
+then :
+  printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_snprintf = yes; then
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5
+printf %s "checking whether snprintf respects a size of 1... " >&6; }
+if test ${gl_cv_func_snprintf_size1+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                            # Guess yes on Android.
+           linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
+                            # Guess yes on native Windows.
+           mingw*)          gl_cv_func_snprintf_size1="guessing yes" ;;
+           *)               gl_cv_func_snprintf_size1="guessing yes" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+  va_list args;
+  int ret;
+  va_start (args, format);
+  ret = vsnprintf (buf, size, format, args);
+  va_end (args);
+  return ret;
+}
+#endif
+int main()
+{
+  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+  my_snprintf (buf, 1, "%d", 12345);
+  return buf[1] != 'E';
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_snprintf_size1=yes
+else $as_nop
+  gl_cv_func_snprintf_size1=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5
+printf "%s\n" "$gl_cv_func_snprintf_size1" >&6; }
+
+    case "$gl_cv_func_snprintf_size1" in
+      *yes)
+
+        case "$gl_cv_func_snprintf_retval_c99" in
+          *yes)
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5
+printf %s "checking whether printf supports POSIX/XSI format strings with positions... " >&6; }
+if test ${gl_cv_func_printf_positions+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+           netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
+                            gl_cv_func_printf_positions="guessing no";;
+           beos*)           gl_cv_func_printf_positions="guessing no";;
+                            # Guess yes on Android.
+           linux*-android*) gl_cv_func_printf_positions="guessing yes";;
+                            # Guess no on native Windows.
+           mingw* | pw*)    gl_cv_func_printf_positions="guessing no";;
+           *)               gl_cv_func_printf_positions="guessing yes";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+   dollar expansion (possibly an autoconf bug).  */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+  sprintf (buf, format, 33, 55);
+  return (strcmp (buf, "55 33") != 0);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_printf_positions=yes
+else $as_nop
+  gl_cv_func_printf_positions=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5
+printf "%s\n" "$gl_cv_func_printf_positions" >&6; }
+
+            case "$gl_cv_func_printf_positions" in
+              *yes)
+                gl_cv_func_snprintf_usable=yes
+                ;;
+            esac
+            ;;
+        esac
+        ;;
+    esac
+  fi
+  if test $gl_cv_func_snprintf_usable = no; then
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS snprintf.$ac_objext"
+
+  if test $ac_cv_func_snprintf = yes; then
+    REPLACE_SNPRINTF=1
+  else
+
+    if test $ac_cv_have_decl_snprintf = yes; then
+                        REPLACE_SNPRINTF=1
+    fi
+  fi
+  :
+
+  fi
+
+  if test $ac_cv_have_decl_snprintf = no; then
+    HAVE_DECL_SNPRINTF=0
+  fi
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_SNPRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SNPRINTF 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define GNULIB_SNPRINTF 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_cv_func_snprintf_posix=no
+  ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf"
+if test "x$ac_cv_func_snprintf" = xyes
+then :
+  printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_snprintf = yes; then
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf fully supports the 'n' directive" >&5
+printf %s "checking whether snprintf fully supports the 'n' directive... " >&6; }
+if test ${gl_cv_func_snprintf_directive_n+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+                                 # Guess no on glibc when _FORTIFY_SOURCE >= 2.
+           *-gnu* | gnu*)        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if _FORTIFY_SOURCE >= 2
+                                         error fail
+                                        #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_func_snprintf_directive_n="guessing yes"
+else $as_nop
+  gl_cv_func_snprintf_directive_n="guessing no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+                                 ;;
+                                 # Guess yes on musl systems.
+           *-musl*)              gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess yes on FreeBSD >= 5.
+           freebsd[1-4].*)       gl_cv_func_snprintf_directive_n="guessing no";;
+           freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
+           midnightbsd*)         gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess yes on Mac OS X >= 10.3.
+           darwin[1-6].*)        gl_cv_func_snprintf_directive_n="guessing no";;
+           darwin*)              gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess yes on Solaris >= 2.6.
+           solaris2.[0-5] | solaris2.[0-5].*)
+                                 gl_cv_func_snprintf_directive_n="guessing no";;
+           solaris*)             gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess yes on AIX >= 4.
+           aix[1-3]*)            gl_cv_func_snprintf_directive_n="guessing no";;
+           aix*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess yes on IRIX >= 6.5.
+           irix6.5)              gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess yes on OSF/1 >= 5.
+           osf[3-4]*)            gl_cv_func_snprintf_directive_n="guessing no";;
+           osf*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess yes on NetBSD >= 3.
+           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+                                 gl_cv_func_snprintf_directive_n="guessing no";;
+           netbsd*)              gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess yes on BeOS.
+           beos*)                gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess no on Android.
+           linux*-android*)      gl_cv_func_snprintf_directive_n="guessing no";;
+                                 # Guess no on native Windows.
+           mingw*)               gl_cv_func_snprintf_directive_n="guessing no";;
+                                 # If we don't know, obey --enable-cross-guesses.
+           *)                    gl_cv_func_snprintf_directive_n="$gl_cross_guess_normal";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <string.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+  va_list args;
+  int ret;
+  va_start (args, format);
+  ret = vsnprintf (buf, size, format, args);
+  va_end (args);
+  return ret;
+}
+#endif
+static char fmtstring[10];
+static char buf[100];
+int main ()
+{
+  int count = -1;
+  /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
+     support %n in format strings in read-only memory but not in writable
+     memory.  */
+  strcpy (fmtstring, "%d %n");
+  my_snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
+  if (count != 6)
+    return 1;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_snprintf_directive_n=yes
+else $as_nop
+  gl_cv_func_snprintf_directive_n=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_directive_n" >&5
+printf "%s\n" "$gl_cv_func_snprintf_directive_n" >&6; }
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5
+printf %s "checking whether snprintf respects a size of 1... " >&6; }
+if test ${gl_cv_func_snprintf_size1+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                            # Guess yes on Android.
+           linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
+                            # Guess yes on native Windows.
+           mingw*)          gl_cv_func_snprintf_size1="guessing yes" ;;
+           *)               gl_cv_func_snprintf_size1="guessing yes" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+  va_list args;
+  int ret;
+  va_start (args, format);
+  ret = vsnprintf (buf, size, format, args);
+  va_end (args);
+  return ret;
+}
+#endif
+int main()
+{
+  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+  my_snprintf (buf, 1, "%d", 12345);
+  return buf[1] != 'E';
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_snprintf_size1=yes
+else $as_nop
+  gl_cv_func_snprintf_size1=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5
+printf "%s\n" "$gl_cv_func_snprintf_size1" >&6; }
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether vsnprintf respects a zero size as in C99" >&5
+printf %s "checking whether vsnprintf respects a zero size as in C99... " >&6; }
+if test ${gl_cv_func_vsnprintf_zerosize_c99+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+                                 # Guess yes on glibc systems.
+           *-gnu* | gnu*)        gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on musl systems.
+           *-musl*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on FreeBSD >= 5.
+           freebsd[1-4].*)       gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+           freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+           midnightbsd*)         gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on Mac OS X >= 10.3.
+           darwin[1-6].*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+           darwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on Cygwin.
+           cygwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on Solaris >= 2.6.
+           solaris2.[0-5] | solaris2.[0-5].*)
+                                 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+           solaris*)             gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on AIX >= 4.
+           aix[1-3]*)            gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+           aix*)                 gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on IRIX >= 6.5.
+           irix6.5)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on NetBSD >= 3.
+           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+                                 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+           netbsd*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on BeOS.
+           beos*)                gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on Android.
+           linux*-android*)      gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on native Windows.
+           mingw* | pw*)         gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # If we don't know, obey --enable-cross-guesses.
+           *)                    gl_cv_func_vsnprintf_zerosize_c99="$gl_cross_guess_normal";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdarg.h>
+#include <stdio.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+  va_list args;
+  int ret;
+  va_start (args, format);
+  ret = vsnprintf (buf, size, format, args);
+  va_end (args);
+  return ret;
+}
+int main()
+{
+  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+  my_snprintf (buf, 0, "%d", 12345);
+  return buf[0] != 'D';
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_vsnprintf_zerosize_c99=yes
+else $as_nop
+  gl_cv_func_vsnprintf_zerosize_c99=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_vsnprintf_zerosize_c99" >&5
+printf "%s\n" "$gl_cv_func_vsnprintf_zerosize_c99" >&6; }
+
+    case "$gl_cv_func_printf_sizes_c99" in
+      *yes)
+        case "$gl_cv_func_printf_long_double" in
+          *yes)
+            case "$gl_cv_func_printf_infinite" in
+              *yes)
+                case "$gl_cv_func_printf_infinite_long_double" in
+                  *yes)
+                    case "$gl_cv_func_printf_directive_a" in
+                      *yes)
+                        case "$gl_cv_func_printf_directive_f" in
+                          *yes)
+                            case "$gl_cv_func_printf_directive_n" in
+                              *yes)
+                                case "$gl_cv_func_printf_directive_ls" in
+                                  *yes)
+                                    case "$gl_cv_func_printf_positions" in
+                                      *yes)
+                                        case "$gl_cv_func_printf_flag_grouping" in
+                                          *yes)
+                                            case "$gl_cv_func_printf_flag_leftadjust" in
+                                              *yes)
+                                                case "$gl_cv_func_printf_flag_zero" in
+                                                  *yes)
+                                                    case "$gl_cv_func_printf_precision" in
+                                                      *yes)
+                                                        case "$gl_cv_func_printf_enomem" in
+                                                          *yes)
+                                                            case "$gl_cv_func_snprintf_truncation_c99" in
+                                                              *yes)
+                                                                case "$gl_cv_func_snprintf_retval_c99" in
+                                                                  *yes)
+                                                                    case "$gl_cv_func_snprintf_directive_n" in
+                                                                      *yes)
+                                                                        case "$gl_cv_func_snprintf_size1" in
+                                                                          *yes)
+                                                                            case "$gl_cv_func_vsnprintf_zerosize_c99" in
+                                                                              *yes)
+                                                                                # snprintf exists and is
+                                                                                # already POSIX compliant.
+                                                                                gl_cv_func_snprintf_posix=yes
+                                                                                ;;
+                                                                            esac
+                                                                            ;;
+                                                                        esac
+                                                                        ;;
+                                                                    esac
+                                                                    ;;
+                                                                esac
+                                                                ;;
+                                                            esac
+                                                            ;;
+                                                        esac
+                                                        ;;
+                                                    esac
+                                                    ;;
+                                                esac
+                                                ;;
+                                            esac
+                                            ;;
+                                        esac
+                                        ;;
+                                    esac
+                                    ;;
+                                esac
+                                ;;
+                            esac
+                            ;;
+                        esac
+                        ;;
+                    esac
+                    ;;
+                esac
+                ;;
+            esac
+            ;;
+        esac
+        ;;
+    esac
+  fi
+  if test $gl_cv_func_snprintf_posix = no; then
+
+
+
+  case "$gl_cv_func_printf_infinite" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+  case "$gl_cv_func_printf_long_double" in
+    *yes)
+      case "$gl_cv_func_printf_infinite_long_double" in
+        *yes)
+          ;;
+        *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
+
+          ;;
+      esac
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_a" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
+
+      ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
+if test "x$ac_cv_func_nl_langinfo" = xyes
+then :
+  printf "%s\n" "#define HAVE_NL_LANGINFO 1" >>confdefs.h
+
+fi
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_f" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_ls" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_grouping" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_leftadjust" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_zero" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_precision" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_enomem" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
+
+  if test $ac_cv_func_vasnprintf = yes; then
+
+printf "%s\n" "#define REPLACE_VASNPRINTF 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+
+
+
+
+  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
+if test "x$ac_cv_type_ptrdiff_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define ptrdiff_t long" >>confdefs.h
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS snprintf.$ac_objext"
+
+  if test $ac_cv_func_snprintf = yes; then
+    REPLACE_SNPRINTF=1
+  else
+
+    if test $ac_cv_have_decl_snprintf = yes; then
+                        REPLACE_SNPRINTF=1
+    fi
+  fi
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+
+
+  case "$host_os" in
+    os2*)
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS os2-spawn.$ac_objext"
+
+      ;;
+  esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_cv_func_sprintf_posix=no
+  case "$gl_cv_func_printf_sizes_c99" in
+    *yes)
+      case "$gl_cv_func_printf_long_double" in
+        *yes)
+          case "$gl_cv_func_printf_infinite" in
+            *yes)
+              case "$gl_cv_func_printf_infinite_long_double" in
+                *yes)
+                  case "$gl_cv_func_printf_directive_a" in
+                    *yes)
+                      case "$gl_cv_func_printf_directive_f" in
+                        *yes)
+                          case "$gl_cv_func_printf_directive_n" in
+                            *yes)
+                              case "$gl_cv_func_printf_directive_ls" in
+                                *yes)
+                                  case "$gl_cv_func_printf_positions" in
+                                    *yes)
+                                      case "$gl_cv_func_printf_flag_grouping" in
+                                        *yes)
+                                          case "$gl_cv_func_printf_flag_leftadjust" in
+                                            *yes)
+                                              case "$gl_cv_func_printf_flag_zero" in
+                                                *yes)
+                                                  case "$gl_cv_func_printf_precision" in
+                                                    *yes)
+                                                      case "$gl_cv_func_printf_enomem" in
+                                                        *yes)
+                                                          # sprintf exists and is
+                                                          # already POSIX compliant.
+                                                          gl_cv_func_sprintf_posix=yes
+                                                          ;;
+                                                      esac
+                                                      ;;
+                                                  esac
+                                                  ;;
+                                              esac
+                                              ;;
+                                          esac
+                                          ;;
+                                      esac
+                                      ;;
+                                  esac
+                                  ;;
+                              esac
+                              ;;
+                          esac
+                          ;;
+                      esac
+                      ;;
+                  esac
+                  ;;
+              esac
+              ;;
+          esac
+          ;;
+      esac
+      ;;
+  esac
+  if test $gl_cv_func_sprintf_posix = no; then
+
+
+
+  case "$gl_cv_func_printf_infinite" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+  case "$gl_cv_func_printf_long_double" in
+    *yes)
+      case "$gl_cv_func_printf_infinite_long_double" in
+        *yes)
+          ;;
+        *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
+
+          ;;
+      esac
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_a" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
+
+      ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
+if test "x$ac_cv_func_nl_langinfo" = xyes
+then :
+  printf "%s\n" "#define HAVE_NL_LANGINFO 1" >>confdefs.h
+
+fi
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_f" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_ls" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_grouping" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_leftadjust" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_zero" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_precision" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_enomem" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
+
+  if test $ac_cv_func_vasnprintf = yes; then
+
+printf "%s\n" "#define REPLACE_VASNPRINTF 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+
+
+
+
+  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
+if test "x$ac_cv_type_ptrdiff_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define ptrdiff_t long" >>confdefs.h
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS sprintf.$ac_objext"
+
+  REPLACE_SPRINTF=1
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_SPRINTF_POSIX=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SPRINTF_POSIX 1" >>confdefs.h
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ssize_t" >&5
+printf %s "checking for ssize_t... " >&6; }
+if test ${gt_cv_ssize_t+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+int
+main (void)
+{
+int x = sizeof (ssize_t *) + sizeof (ssize_t);
+            return !x;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gt_cv_ssize_t=yes
+else $as_nop
+  gt_cv_ssize_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_ssize_t" >&5
+printf "%s\n" "$gt_cv_ssize_t" >&6; }
+  if test $gt_cv_ssize_t = no; then
+
+printf "%s\n" "#define ssize_t int" >>confdefs.h
+
+  fi
+
+
+
+
+
+  case "$host_os" in
+    mingw*)
+                  REPLACE_STAT=1
+      ;;
+    *)
+                        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stat handles trailing slashes on files" >&5
+printf %s "checking whether stat handles trailing slashes on files... " >&6; }
+if test ${gl_cv_func_stat_file_slash+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  touch conftest.tmp
+         # Assume that if we have lstat, we can also check symlinks.
+         if test $ac_cv_func_lstat = yes; then
+           ln -s conftest.tmp conftest.lnk
+         fi
+         if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                               # Guess yes on Linux systems.
+              linux-* | linux) gl_cv_func_stat_file_slash="guessing yes" ;;
+                               # Guess yes on glibc systems.
+              *-gnu* | gnu*)   gl_cv_func_stat_file_slash="guessing yes" ;;
+                               # If we don't know, obey --enable-cross-guesses.
+              *)               gl_cv_func_stat_file_slash="$gl_cross_guess_normal" ;;
+            esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/stat.h>
+
+int
+main (void)
+{
+int result = 0;
+               struct stat st;
+               if (!stat ("conftest.tmp/", &st))
+                 result |= 1;
+#if HAVE_LSTAT
+               if (!stat ("conftest.lnk/", &st))
+                 result |= 2;
+#endif
+               return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_stat_file_slash=yes
+else $as_nop
+  gl_cv_func_stat_file_slash=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+         rm -f conftest.tmp conftest.lnk
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_stat_file_slash" >&5
+printf "%s\n" "$gl_cv_func_stat_file_slash" >&6; }
+      case $gl_cv_func_stat_file_slash in
+        *no)
+          REPLACE_STAT=1
+
+printf "%s\n" "#define REPLACE_FUNC_STAT_FILE 1" >>confdefs.h
+;;
+      esac
+      case $host_os in
+                solaris*)
+          REPLACE_FSTAT=1 ;;
+      esac
+      ;;
+  esac
+
+  if test $REPLACE_STAT = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS stat.$ac_objext"
+
+    case "$host_os" in
+      mingw*)
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS stat-w32.$ac_objext"
+
+        ;;
+    esac
+
+
+
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_STAT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STAT 1" >>confdefs.h
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working stdalign.h" >&5
+printf %s "checking for working stdalign.h... " >&6; }
+if test ${gl_cv_header_working_stdalign_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdint.h>
+            #include <stdalign.h>
+            #include <stddef.h>
+
+            /* Test that alignof yields a result consistent with offsetof.
+               This catches GCC bug 52023
+               <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023>.  */
+            #ifdef __cplusplus
+               template <class t> struct alignof_helper { char a; t b; };
+            # define ao(type) offsetof (alignof_helper<type>, b)
+            #else
+            # define ao(type) offsetof (struct { char a; type b; }, b)
+            #endif
+            char test_double[ao (double) % _Alignof (double) == 0 ? 1 : -1];
+            char test_long[ao (long int) % _Alignof (long int) == 0 ? 1 : -1];
+            char test_alignof[alignof (double) == _Alignof (double) ? 1 : -1];
+
+            /* Test _Alignas only on platforms where gnulib can help.  */
+            #if \
+                ((defined __cplusplus && 201103 <= __cplusplus) \
+                 || (__TINYC__ && defined __attribute__) \
+                 || (defined __APPLE__ && defined __MACH__ \
+                     ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__) \
+                     : __GNUC__) \
+                 || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \
+                 || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__ \
+                 || 1300 <= _MSC_VER)
+              struct alignas_test { char c; char alignas (8) alignas_8; };
+              char test_alignas[offsetof (struct alignas_test, alignas_8) == 8
+                                ? 1 : -1];
+            #endif
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_header_working_stdalign_h=yes
+else $as_nop
+  gl_cv_header_working_stdalign_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_stdalign_h" >&5
+printf "%s\n" "$gl_cv_header_working_stdalign_h" >&6; }
+
+  if test $gl_cv_header_working_stdalign_h = yes; then
+    STDALIGN_H=''
+  else
+    STDALIGN_H='stdalign.h'
+  fi
+
+
+   if test -n "$STDALIGN_H"; then
+  GL_GENERATE_STDALIGN_H_TRUE=
+  GL_GENERATE_STDALIGN_H_FALSE='#'
+else
+  GL_GENERATE_STDALIGN_H_TRUE='#'
+  GL_GENERATE_STDALIGN_H_FALSE=
+fi
+
+
+
+
+
+
+          if test "$ac_cv_header_stdbool_h" = yes; then
+    case "$host_os" in
+      solaris*)
+        if test -z "$GCC"; then
+          STDBOOL_H='stdbool.h'
+        else
+          STDBOOL_H=''
+        fi
+        ;;
+      *)
+        STDBOOL_H=''
+        ;;
+    esac
+  else
+    STDBOOL_H='stdbool.h'
+  fi
+
+   if test -n "$STDBOOL_H"; then
+  GL_GENERATE_STDBOOL_H_TRUE=
+  GL_GENERATE_STDBOOL_H_FALSE='#'
+else
+  GL_GENERATE_STDBOOL_H_TRUE='#'
+  GL_GENERATE_STDBOOL_H_FALSE=
+fi
+
+
+  if test "$ac_cv_type__Bool" = yes; then
+    HAVE__BOOL=1
+  else
+    HAVE__BOOL=0
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FSCANF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FSCANF 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define GNULIB_FSCANF 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_SCANF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SCANF 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define GNULIB_SCANF 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FGETC=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FGETC 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_GETC=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETC 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_GETCHAR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETCHAR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FGETS=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FGETS 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FREAD=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FREAD 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FPRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FPRINTF 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_PRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_PRINTF 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_VFPRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_VFPRINTF 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_VPRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_VPRINTF 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FPUTC=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FPUTC 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_PUTC=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_PUTC 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_PUTCHAR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_PUTCHAR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FPUTS=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FPUTS 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_PUTS=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_PUTS 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FWRITE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FWRITE 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  ac_fn_c_check_func "$LINENO" "stpcpy" "ac_cv_func_stpcpy"
+if test "x$ac_cv_func_stpcpy" = xyes
+then :
+  printf "%s\n" "#define HAVE_STPCPY 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_stpcpy = no; then
+    HAVE_STPCPY=0
+  fi
+
+  if test $HAVE_STPCPY = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS stpcpy.$ac_objext"
+
+
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_STPCPY=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STPCPY 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  if test $ac_cv_func_stpncpy = yes; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working stpncpy" >&5
+printf %s "checking for working stpncpy... " >&6; }
+if test ${gl_cv_func_stpncpy+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+  Thanks for using GNU
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Thanks for using GNU" >/dev/null 2>&1
+then :
+  gl_cv_func_stpncpy="guessing yes"
+else $as_nop
+  case "$host_os" in
+              *-musl*) gl_cv_func_stpncpy="guessing yes" ;;
+              *)       gl_cv_func_stpncpy="$gl_cross_guess_normal" ;;
+            esac
+
+fi
+rm -rf conftest*
+
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdlib.h>
+#include <string.h> /* for strcpy */
+/* The stpncpy prototype is missing in <string.h> on AIX 4.  */
+#if !HAVE_DECL_STPNCPY
+extern
+# ifdef __cplusplus
+"C"
+# endif
+char *stpncpy (char *dest, const char *src, size_t n);
+#endif
+int main ()
+{
+  int result = 0;
+  const char *src = "Hello";
+  char dest[10];
+  /* AIX 4.3.3 and AIX 5.1 stpncpy() returns dest+1 here.  */
+  {
+    strcpy (dest, "\377\377\377\377\377\377");
+    if (stpncpy (dest, src, 2) != dest + 2)
+      result |= 1;
+  }
+  /* AIX 4.3.3 and AIX 5.1 stpncpy() returns dest+4 here.  */
+  {
+    strcpy (dest, "\377\377\377\377\377\377");
+    if (stpncpy (dest, src, 5) != dest + 5)
+      result |= 2;
+  }
+  /* AIX 4.3.3 and AIX 5.1 stpncpy() returns dest+6 here.  */
+  {
+    strcpy (dest, "\377\377\377\377\377\377");
+    if (stpncpy (dest, src, 7) != dest + 5)
+      result |= 4;
+  }
+  return result;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_stpncpy=yes
+else $as_nop
+  gl_cv_func_stpncpy=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_stpncpy" >&5
+printf "%s\n" "$gl_cv_func_stpncpy" >&6; }
+    case "$gl_cv_func_stpncpy" in
+      *yes)
+
+printf "%s\n" "#define HAVE_STPNCPY 1" >>confdefs.h
+
+        ;;
+      *)
+        REPLACE_STPNCPY=1
+        ;;
+    esac
+  else
+    HAVE_STPNCPY=0
+  fi
+
+  if test $HAVE_STPNCPY = 0 || test $REPLACE_STPNCPY = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS stpncpy.$ac_objext"
+
+
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_STPNCPY=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STPNCPY 1" >>confdefs.h
+
+
+
+
+
+
+  if test $gl_cv_func_malloc_posix != yes; then
+    REPLACE_STRDUP=1
+  fi
+
+  if test $ac_cv_have_decl_strdup = no; then
+    HAVE_DECL_STRDUP=0
+  fi
+
+  if test $REPLACE_STRDUP = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS strdup.$ac_objext"
+
+    :
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_STRDUP=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRDUP 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+  if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working strerror function" >&5
+printf %s "checking for working strerror function... " >&6; }
+if test ${gl_cv_func_working_strerror+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                          # Guess yes on glibc systems.
+           *-gnu* | gnu*) gl_cv_func_working_strerror="guessing yes" ;;
+                          # Guess yes on musl systems.
+           *-musl*)       gl_cv_func_working_strerror="guessing yes" ;;
+                          # If we don't know, obey --enable-cross-guesses.
+           *)             gl_cv_func_working_strerror="$gl_cross_guess_normal" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+int
+main (void)
+{
+if (!*strerror (-2)) return 1;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_working_strerror=yes
+else $as_nop
+  gl_cv_func_working_strerror=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_strerror" >&5
+printf "%s\n" "$gl_cv_func_working_strerror" >&6; }
+    case "$gl_cv_func_working_strerror" in
+      *yes) ;;
+      *)
+                        REPLACE_STRERROR=1
+        ;;
+    esac
+
+                  case "$gl_cv_func_strerror_r_works" in
+        *no) REPLACE_STRERROR=1 ;;
+      esac
+
+  else
+            REPLACE_STRERROR=1
+  fi
+
+  if test $REPLACE_STRERROR = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS strerror.$ac_objext"
+
+  fi
+
+
+printf "%s\n" "#define GNULIB_STRERROR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_STRERROR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRERROR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  if test $ac_cv_have_decl_strndup = no; then
+    HAVE_DECL_STRNDUP=0
+  fi
+
+  if test $ac_cv_func_strndup = yes; then
+    HAVE_STRNDUP=1
+    # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'.
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working strndup" >&5
+printf %s "checking for working strndup... " >&6; }
+if test ${gl_cv_func_strndup_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+
+          case $host_os in
+            aix | aix[3-6]*) gl_cv_func_strndup_works="guessing no";;
+            *)               gl_cv_func_strndup_works="guessing yes";;
+          esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+         #include <string.h>
+                           #include <stdlib.h>
+int
+main (void)
+{
+
+#if !HAVE_DECL_STRNDUP
+  extern
+  #ifdef __cplusplus
+  "C"
+  #endif
+  char *strndup (const char *, size_t);
+#endif
+  int result;
+  char *s;
+  s = strndup ("some longer string", 15);
+  free (s);
+  s = strndup ("shorter string", 13);
+  result = s[13] != '\0';
+  free (s);
+  return result;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_strndup_works=yes
+else $as_nop
+  gl_cv_func_strndup_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strndup_works" >&5
+printf "%s\n" "$gl_cv_func_strndup_works" >&6; }
+    case $gl_cv_func_strndup_works in
+      *no) REPLACE_STRNDUP=1 ;;
+    esac
+  else
+    HAVE_STRNDUP=0
+  fi
+
+  if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS strndup.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_STRNDUP=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRNDUP 1" >>confdefs.h
+
+
+
+
+
+
+  if test $HAVE_STRTOD = 1; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strtod obeys C99" >&5
+printf %s "checking whether strtod obeys C99... " >&6; }
+if test ${gl_cv_func_strtod_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+                    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8) || (__GLIBC__ > 2)) \
+     && !defined __UCLIBC__
+  Lucky user
+ #endif
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Lucky user" >/dev/null 2>&1
+then :
+  gl_cv_func_strtod_works="guessing yes"
+else $as_nop
+  case "$host_os" in
+                       # Guess yes on musl systems.
+              *-musl*) gl_cv_func_strtod_works="guessing yes" ;;
+                       # Guess yes on native Windows.
+              mingw*)  gl_cv_func_strtod_works="guessing yes" ;;
+              *)       gl_cv_func_strtod_works="$gl_cross_guess_normal" ;;
+            esac
+
+fi
+rm -rf conftest*
+
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdlib.h>
+#include <math.h>
+#include <errno.h>
+/* Compare two numbers with ==.
+   This is a separate function because IRIX 6.5 "cc -O" miscompiles an
+   'x == x' test.  */
+static int
+numeric_equal (double x, double y)
+{
+  return x == y;
+}
+
+int
+main (void)
+{
+
+  int result = 0;
+  {
+    /* In some old versions of Linux (2000 or before), strtod mis-parses
+       strings with leading '+'.  */
+    const char *string = " +69";
+    char *term;
+    double value = strtod (string, &term);
+    if (value != 69 || term != (string + 4))
+      result |= 1;
+  }
+  {
+    /* Under Solaris 2.4, strtod returns the wrong value for the
+       terminating character under some conditions.  */
+    const char *string = "NaN";
+    char *term;
+    strtod (string, &term);
+    if (term != string && *(term - 1) == 0)
+      result |= 2;
+  }
+  {
+    /* Older glibc and Cygwin mis-parse "-0x".  */
+    const char *string = "-0x";
+    char *term;
+    double value = strtod (string, &term);
+    double zero = 0.0;
+    if (1.0 / value != -1.0 / zero || term != (string + 2))
+      result |= 4;
+  }
+  {
+    /* Many platforms do not parse hex floats.  */
+    const char *string = "0XaP+1";
+    char *term;
+    double value = strtod (string, &term);
+    if (value != 20.0 || term != (string + 6))
+      result |= 8;
+  }
+  {
+    /* Many platforms do not parse infinities.  HP-UX 11.31 parses inf,
+       but mistakenly sets errno.  */
+    const char *string = "inf";
+    char *term;
+    double value;
+    errno = 0;
+    value = strtod (string, &term);
+    if (value != HUGE_VAL || term != (string + 3) || errno)
+      result |= 16;
+  }
+  {
+    /* glibc 2.7 and cygwin 1.5.24 misparse "nan()".  */
+    const char *string = "nan()";
+    char *term;
+    double value = strtod (string, &term);
+    if (numeric_equal (value, value) || term != (string + 5))
+      result |= 32;
+  }
+  {
+    /* darwin 10.6.1 misparses "nan(".  */
+    const char *string = "nan(";
+    char *term;
+    double value = strtod (string, &term);
+    if (numeric_equal (value, value) || term != (string + 3))
+      result |= 64;
+  }
+  return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_strtod_works=yes
+else $as_nop
+  gl_cv_func_strtod_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strtod_works" >&5
+printf "%s\n" "$gl_cv_func_strtod_works" >&6; }
+    case "$gl_cv_func_strtod_works" in
+      *yes) ;;
+      *)
+        REPLACE_STRTOD=1
+        ;;
+    esac
+  fi
+
+  if test $HAVE_STRTOD = 0 || test $REPLACE_STRTOD = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS strtod.$ac_objext"
+
+
+
+  if test $gl_cv_func_ldexp_no_libm = yes; then
+
+printf "%s\n" "#define HAVE_LDEXP_IN_LIBC 1" >>confdefs.h
+
+  fi
+  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
+if test "x$ac_cv_func_nl_langinfo" = xyes
+then :
+  printf "%s\n" "#define HAVE_NL_LANGINFO 1" >>confdefs.h
+
+fi
+
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_STRTOD=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRTOD 1" >>confdefs.h
+
+
+
+
+
+
+
+  ac_fn_c_check_func "$LINENO" "strverscmp" "ac_cv_func_strverscmp"
+if test "x$ac_cv_func_strverscmp" = xyes
+then :
+  printf "%s\n" "#define HAVE_STRVERSCMP 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_strverscmp = no; then
+    HAVE_STRVERSCMP=0
+  fi
+
+  if test $HAVE_STRVERSCMP = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS strverscmp.$ac_objext"
+
+
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_STRVERSCMP=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRVERSCMP 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  ac_fn_c_check_header_compile "$LINENO" "sys/single_threaded.h" "ac_cv_header_sys_single_threaded_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_single_threaded_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_SYS_SINGLE_THREADED_H 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+
+
+  :
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+      if  { test "$HAVE_LIBUNISTRING" != yes \
+    || {
+
+
+
+            test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+            || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+                 && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+                      || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+                           && test $LIBUNISTRING_VERSION_SUBMINOR -lt 11
+                         }
+                    }
+               }
+
+
+
+
+       }
+  }; then
+    LIBUNISTRING_UNISTR_H='unistr.h'
+  else
+    LIBUNISTRING_UNISTR_H=
+  fi
+
+
+
+
+printf "%s\n" "#define GNULIB_UNISTR_U8_MBTOUCR 1" >>confdefs.h
+
+
+
+
+       if  { test "$HAVE_LIBUNISTRING" != yes \
+    || {
+
+
+
+            test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+            || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+                 && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+                      || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+                           && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0
+                         }
+                    }
+               }
+
+
+
+
+       }
+  }; then
+  LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_TRUE=
+  LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_FALSE='#'
+else
+  LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_TRUE='#'
+  LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_FALSE=
+fi
+
+
+
+
+printf "%s\n" "#define GNULIB_UNISTR_U8_UCTOMB 1" >>confdefs.h
+
+
+
+
+       if  { test "$HAVE_LIBUNISTRING" != yes \
+    || {
+
+
+
+            test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+            || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+                 && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+                      || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+                           && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0
+                         }
+                    }
+               }
+
+
+
+
+       }
+  }; then
+  LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE=
+  LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_FALSE='#'
+else
+  LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE='#'
+  LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_FALSE=
+fi
+
+
+
+
+      if  { test "$HAVE_LIBUNISTRING" != yes \
+    || {
+
+
+
+            test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+            || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+                 && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+                      || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+                           && test $LIBUNISTRING_VERSION_SUBMINOR -lt 11
+                         }
+                    }
+               }
+
+
+
+
+       }
+  }; then
+    LIBUNISTRING_UNITYPES_H='unitypes.h'
+  else
+    LIBUNISTRING_UNITYPES_H=
+  fi
+
+
+
+
+
+      if  { test "$HAVE_LIBUNISTRING" != yes \
+    || {
+
+
+
+            test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+            || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+                 && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+                      || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+                           && test $LIBUNISTRING_VERSION_SUBMINOR -lt 11
+                         }
+                    }
+               }
+
+
+
+
+       }
+  }; then
+    LIBUNISTRING_UNIWIDTH_H='uniwidth.h'
+  else
+    LIBUNISTRING_UNIWIDTH_H=
+  fi
+
+
+
+
+       if  { test "$HAVE_LIBUNISTRING" != yes \
+    || {
+
+
+
+            test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+            || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+                 && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+                      || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+                           && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8
+                         }
+                    }
+               }
+
+
+
+
+       }
+  }; then
+  LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE=
+  LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE='#'
+else
+  LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE='#'
+  LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE=
+fi
+
+
+
+
+
+
+
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether unlink honors trailing slashes" >&5
+printf %s "checking whether unlink honors trailing slashes... " >&6; }
+if test ${gl_cv_func_unlink_honors_slashes+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  touch conftest.file
+     # Assume that if we have lstat, we can also check symlinks.
+     if test $ac_cv_func_lstat = yes; then
+       ln -s conftest.file conftest.lnk
+     fi
+     if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                          # Guess yes on Linux systems.
+         linux-* | linux) gl_cv_func_unlink_honors_slashes="guessing yes" ;;
+                          # Guess yes on glibc systems.
+         *-gnu*)          gl_cv_func_unlink_honors_slashes="guessing yes" ;;
+                          # Guess no on native Windows.
+         mingw*)          gl_cv_func_unlink_honors_slashes="guessing no" ;;
+                          # If we don't know, obey --enable-cross-guesses.
+         *)               gl_cv_func_unlink_honors_slashes="$gl_cross_guess_normal" ;;
+       esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if HAVE_UNISTD_H
+           # include <unistd.h>
+           #else /* on Windows with MSVC */
+           # include <io.h>
+           #endif
+           #include <errno.h>
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+int result = 0;
+           if (!unlink ("conftest.file/"))
+             result |= 1;
+           else if (errno != ENOTDIR)
+             result |= 2;
+#if HAVE_LSTAT
+           if (!unlink ("conftest.lnk/"))
+             result |= 4;
+           else if (errno != ENOTDIR)
+             result |= 8;
+#endif
+           return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_unlink_honors_slashes=yes
+else $as_nop
+  gl_cv_func_unlink_honors_slashes=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+     rm -f conftest.file conftest.lnk
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_unlink_honors_slashes" >&5
+printf "%s\n" "$gl_cv_func_unlink_honors_slashes" >&6; }
+  case "$gl_cv_func_unlink_honors_slashes" in
+    *no)
+      REPLACE_UNLINK=1
+      ;;
+  esac
+
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether unlink of a parent directory fails as it should" >&5
+printf %s "checking whether unlink of a parent directory fails as it should... " >&6; }
+if test ${gl_cv_func_unlink_parent_fails+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case "$host_os" in
+       darwin*)
+                                                      if {
+              # Use the mktemp program if available. If not available, hide the error
+              # message.
+              tmp=`(umask 077 && mktemp -d /tmp/gtXXXXXX) 2>/dev/null` &&
+              test -n "$tmp" && test -d "$tmp"
+            } ||
+            {
+              # Use a simple mkdir command. It is guaranteed to fail if the directory
+              # already exists.  $RANDOM is bash specific and expands to empty in shells
+              # other than bash, ksh and zsh.  Its use does not increase security;
+              # rather, it minimizes the probability of failure in a very cluttered /tmp
+              # directory.
+              tmp=/tmp/gt$$-$RANDOM
+              (umask 077 && mkdir "$tmp")
+            }; then
+           mkdir "$tmp/subdir"
+           GL_SUBDIR_FOR_UNLINK="$tmp/subdir"
+           export GL_SUBDIR_FOR_UNLINK
+           if test "$cross_compiling" = yes
+then :
+  # If we don't know, obey --enable-cross-guesses.
+              gl_cv_func_unlink_parent_fails="$gl_cross_guess_normal"
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+                #include <stdlib.h>
+                #if HAVE_UNISTD_H
+                # include <unistd.h>
+                #else /* on Windows with MSVC */
+                # include <direct.h>
+                # include <io.h>
+                #endif
+
+
+$gl_mda_defines
+
+                int main ()
+                {
+                  int result = 0;
+                  if (chdir (getenv ("GL_SUBDIR_FOR_UNLINK")) != 0)
+                    result |= 1;
+                  else if (unlink ("..") == 0)
+                    result |= 2;
+                  return result;
+                }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_unlink_parent_fails=yes
+else $as_nop
+  gl_cv_func_unlink_parent_fails=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+           unset GL_SUBDIR_FOR_UNLINK
+           rm -rf "$tmp"
+         else
+           gl_cv_func_unlink_parent_fails="guessing no"
+         fi
+         ;;
+       *)
+         gl_cv_func_unlink_parent_fails="guessing yes"
+         ;;
+     esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_unlink_parent_fails" >&5
+printf "%s\n" "$gl_cv_func_unlink_parent_fails" >&6; }
+  case "$gl_cv_func_unlink_parent_fails" in
+    *no)
+      REPLACE_UNLINK=1
+
+printf "%s\n" "#define UNLINK_PARENT_BUG 1" >>confdefs.h
+
+      ;;
+  esac
+
+  if test $REPLACE_UNLINK = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS unlink.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_UNLINK=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_UNLINK 1" >>confdefs.h
+
+
+
+
+printf "%s\n" "#define GNULIB_STDIO_SINGLE_THREAD 1" >>confdefs.h
+
+
+printf "%s\n" "#define USE_UNLOCKED_IO GNULIB_STDIO_SINGLE_THREAD" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  if test $ac_cv_have_decl_unsetenv = no; then
+    HAVE_DECL_UNSETENV=0
+  fi
+  ac_fn_c_check_func "$LINENO" "unsetenv" "ac_cv_func_unsetenv"
+if test "x$ac_cv_func_unsetenv" = xyes
+then :
+  printf "%s\n" "#define HAVE_UNSETENV 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_unsetenv = no; then
+    HAVE_UNSETENV=0
+  else
+    HAVE_UNSETENV=1
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for unsetenv() return type" >&5
+printf %s "checking for unsetenv() return type... " >&6; }
+if test ${gt_cv_func_unsetenv_ret+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#undef _BSD
+#define _BSD 1 /* unhide unsetenv declaration in OSF/1 5.1 <stdlib.h> */
+#include <stdlib.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+int unsetenv (const char *name);
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gt_cv_func_unsetenv_ret='int'
+else $as_nop
+  gt_cv_func_unsetenv_ret='void'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_unsetenv_ret" >&5
+printf "%s\n" "$gt_cv_func_unsetenv_ret" >&6; }
+    if test $gt_cv_func_unsetenv_ret = 'void'; then
+
+printf "%s\n" "#define VOID_UNSETENV 1" >>confdefs.h
+
+      REPLACE_UNSETENV=1
+    fi
+
+                { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether unsetenv obeys POSIX" >&5
+printf %s "checking whether unsetenv obeys POSIX... " >&6; }
+if test ${gl_cv_func_unsetenv_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                    # Guess yes on glibc systems.
+            *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;;
+                    # If we don't know, obey --enable-cross-guesses.
+            *)      gl_cv_func_unsetenv_works="$gl_cross_guess_normal" ;;
+          esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+            #include <stdlib.h>
+            #include <errno.h>
+            extern char **environ;
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+
+            char entry1[] = "a=1";
+            char entry2[] = "b=2";
+            char *env[] = { entry1, entry2, NULL };
+            if (putenv ((char *) "a=1")) return 1;
+            if (putenv (entry2)) return 2;
+            entry2[0] = 'a';
+            unsetenv ("a");
+            if (getenv ("a")) return 3;
+            if (!unsetenv ("") || errno != EINVAL) return 4;
+            entry2[0] = 'b';
+            environ = env;
+            if (!getenv ("a")) return 5;
+            entry2[0] = 'a';
+            unsetenv ("a");
+            if (getenv ("a")) return 6;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_unsetenv_works=yes
+else $as_nop
+  gl_cv_func_unsetenv_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_unsetenv_works" >&5
+printf "%s\n" "$gl_cv_func_unsetenv_works" >&6; }
+    case "$gl_cv_func_unsetenv_works" in
+      *yes) ;;
+      *)
+        REPLACE_UNSETENV=1
+        ;;
+    esac
+  fi
+
+  if test $HAVE_UNSETENV = 0 || test $REPLACE_UNSETENV = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS unsetenv.$ac_objext"
+
+
+
+
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_UNSETENV=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_UNSETENV 1" >>confdefs.h
+
+
+
+
+
+
+  if test $ac_cv_func_vasnprintf = no; then
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
+
+  if test $ac_cv_func_vasnprintf = yes; then
+
+printf "%s\n" "#define REPLACE_VASNPRINTF 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+
+
+
+
+  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
+if test "x$ac_cv_type_ptrdiff_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define ptrdiff_t long" >>confdefs.h
+
+
+fi
+
+
+
+
+
+
+
+  fi
+
+
+  ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf"
+if test "x$ac_cv_func_vasprintf" = xyes
+then :
+  printf "%s\n" "#define HAVE_VASPRINTF 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_vasprintf = no; then
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS vasprintf.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS asprintf.$ac_objext"
+
+
+  if test $ac_cv_func_vasprintf = yes; then
+    REPLACE_VASPRINTF=1
+  else
+    HAVE_VASPRINTF=0
+  fi
+
+
+
+
+
+
+
+
+  fi
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_VASPRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_VASPRINTF 1" >>confdefs.h
+
+
+
+
+
+  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=asprintf:2:c-format"
+
+
+
+  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=vasprintf:2:c-format"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_cv_func_vasprintf_posix=no
+  ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf"
+if test "x$ac_cv_func_vasprintf" = xyes
+then :
+  printf "%s\n" "#define HAVE_VASPRINTF 1" >>confdefs.h
+
+fi
+
+  case "$gl_cv_func_printf_sizes_c99" in
+    *yes)
+      case "$gl_cv_func_printf_long_double" in
+        *yes)
+          case "$gl_cv_func_printf_infinite" in
+            *yes)
+              case "$gl_cv_func_printf_infinite_long_double" in
+                *yes)
+                  case "$gl_cv_func_printf_directive_a" in
+                    *yes)
+                      case "$gl_cv_func_printf_directive_f" in
+                        *yes)
+                          case "$gl_cv_func_printf_directive_n" in
+                            *yes)
+                              case "$gl_cv_func_printf_directive_ls" in
+                                *yes)
+                                  case "$gl_cv_func_printf_positions" in
+                                    *yes)
+                                      case "$gl_cv_func_printf_flag_grouping" in
+                                        *yes)
+                                          case "$gl_cv_func_printf_flag_leftadjust" in
+                                            *yes)
+                                              case "$gl_cv_func_printf_flag_zero" in
+                                                *yes)
+                                                  case "$gl_cv_func_printf_precision" in
+                                                    *yes)
+                                                      case "$gl_cv_func_printf_enomem" in
+                                                        *yes)
+                                                          if test $ac_cv_func_vasprintf = yes; then
+                                                            # vasprintf exists and is
+                                                            # already POSIX compliant.
+                                                            gl_cv_func_vasprintf_posix=yes
+                                                          fi
+                                                          ;;
+                                                      esac
+                                                      ;;
+                                                  esac
+                                                  ;;
+                                              esac
+                                              ;;
+                                          esac
+                                          ;;
+                                      esac
+                                      ;;
+                                  esac
+                                  ;;
+                              esac
+                              ;;
+                          esac
+                          ;;
+                      esac
+                      ;;
+                  esac
+                  ;;
+              esac
+              ;;
+          esac
+          ;;
+      esac
+      ;;
+  esac
+  if test $gl_cv_func_vasprintf_posix = no; then
+
+
+
+  case "$gl_cv_func_printf_infinite" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+  case "$gl_cv_func_printf_long_double" in
+    *yes)
+      case "$gl_cv_func_printf_infinite_long_double" in
+        *yes)
+          ;;
+        *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
+
+          ;;
+      esac
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_a" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
+
+      ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
+if test "x$ac_cv_func_nl_langinfo" = xyes
+then :
+  printf "%s\n" "#define HAVE_NL_LANGINFO 1" >>confdefs.h
+
+fi
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_f" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_ls" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_grouping" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_leftadjust" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_zero" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_precision" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_enomem" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
+
+  if test $ac_cv_func_vasnprintf = yes; then
+
+printf "%s\n" "#define REPLACE_VASNPRINTF 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+
+
+
+
+  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
+if test "x$ac_cv_type_ptrdiff_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define ptrdiff_t long" >>confdefs.h
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS vasprintf.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS asprintf.$ac_objext"
+
+
+  if test $ac_cv_func_vasprintf = yes; then
+    REPLACE_VASPRINTF=1
+  else
+    HAVE_VASPRINTF=0
+  fi
+
+
+
+
+
+
+
+
+  fi
+
+
+
+  gl_cv_func_vsnprintf_usable=no
+  ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf"
+if test "x$ac_cv_func_vsnprintf" = xyes
+then :
+  printf "%s\n" "#define HAVE_VSNPRINTF 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_vsnprintf = yes; then
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5
+printf %s "checking whether snprintf respects a size of 1... " >&6; }
+if test ${gl_cv_func_snprintf_size1+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                            # Guess yes on Android.
+           linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
+                            # Guess yes on native Windows.
+           mingw*)          gl_cv_func_snprintf_size1="guessing yes" ;;
+           *)               gl_cv_func_snprintf_size1="guessing yes" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+  va_list args;
+  int ret;
+  va_start (args, format);
+  ret = vsnprintf (buf, size, format, args);
+  va_end (args);
+  return ret;
+}
+#endif
+int main()
+{
+  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+  my_snprintf (buf, 1, "%d", 12345);
+  return buf[1] != 'E';
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_snprintf_size1=yes
+else $as_nop
+  gl_cv_func_snprintf_size1=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5
+printf "%s\n" "$gl_cv_func_snprintf_size1" >&6; }
+
+    case "$gl_cv_func_snprintf_size1" in
+      *yes)
+
+        case "$gl_cv_func_snprintf_retval_c99" in
+          *yes)
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5
+printf %s "checking whether printf supports POSIX/XSI format strings with positions... " >&6; }
+if test ${gl_cv_func_printf_positions+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+           netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
+                            gl_cv_func_printf_positions="guessing no";;
+           beos*)           gl_cv_func_printf_positions="guessing no";;
+                            # Guess yes on Android.
+           linux*-android*) gl_cv_func_printf_positions="guessing yes";;
+                            # Guess no on native Windows.
+           mingw* | pw*)    gl_cv_func_printf_positions="guessing no";;
+           *)               gl_cv_func_printf_positions="guessing yes";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+   dollar expansion (possibly an autoconf bug).  */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+  sprintf (buf, format, 33, 55);
+  return (strcmp (buf, "55 33") != 0);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_printf_positions=yes
+else $as_nop
+  gl_cv_func_printf_positions=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5
+printf "%s\n" "$gl_cv_func_printf_positions" >&6; }
+
+            case "$gl_cv_func_printf_positions" in
+              *yes)
+                gl_cv_func_vsnprintf_usable=yes
+                ;;
+            esac
+            ;;
+        esac
+        ;;
+    esac
+  fi
+  if test $gl_cv_func_vsnprintf_usable = no; then
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS vsnprintf.$ac_objext"
+
+  if test $ac_cv_func_vsnprintf = yes; then
+    REPLACE_VSNPRINTF=1
+  else
+
+    if test $ac_cv_have_decl_vsnprintf = yes; then
+                        REPLACE_VSNPRINTF=1
+    fi
+  fi
+  :
+
+  fi
+
+  if test $ac_cv_have_decl_vsnprintf = no; then
+    HAVE_DECL_VSNPRINTF=0
+  fi
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_VSNPRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_VSNPRINTF 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_cv_func_vsnprintf_posix=no
+  ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf"
+if test "x$ac_cv_func_vsnprintf" = xyes
+then :
+  printf "%s\n" "#define HAVE_VSNPRINTF 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_vsnprintf = yes; then
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf fully supports the 'n' directive" >&5
+printf %s "checking whether snprintf fully supports the 'n' directive... " >&6; }
+if test ${gl_cv_func_snprintf_directive_n+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+                                 # Guess no on glibc when _FORTIFY_SOURCE >= 2.
+           *-gnu* | gnu*)        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if _FORTIFY_SOURCE >= 2
+                                         error fail
+                                        #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_func_snprintf_directive_n="guessing yes"
+else $as_nop
+  gl_cv_func_snprintf_directive_n="guessing no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+                                 ;;
+                                 # Guess yes on musl systems.
+           *-musl*)              gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess yes on FreeBSD >= 5.
+           freebsd[1-4].*)       gl_cv_func_snprintf_directive_n="guessing no";;
+           freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
+           midnightbsd*)         gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess yes on Mac OS X >= 10.3.
+           darwin[1-6].*)        gl_cv_func_snprintf_directive_n="guessing no";;
+           darwin*)              gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess yes on Solaris >= 2.6.
+           solaris2.[0-5] | solaris2.[0-5].*)
+                                 gl_cv_func_snprintf_directive_n="guessing no";;
+           solaris*)             gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess yes on AIX >= 4.
+           aix[1-3]*)            gl_cv_func_snprintf_directive_n="guessing no";;
+           aix*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess yes on IRIX >= 6.5.
+           irix6.5)              gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess yes on OSF/1 >= 5.
+           osf[3-4]*)            gl_cv_func_snprintf_directive_n="guessing no";;
+           osf*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess yes on NetBSD >= 3.
+           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+                                 gl_cv_func_snprintf_directive_n="guessing no";;
+           netbsd*)              gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess yes on BeOS.
+           beos*)                gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess no on Android.
+           linux*-android*)      gl_cv_func_snprintf_directive_n="guessing no";;
+                                 # Guess no on native Windows.
+           mingw*)               gl_cv_func_snprintf_directive_n="guessing no";;
+                                 # If we don't know, obey --enable-cross-guesses.
+           *)                    gl_cv_func_snprintf_directive_n="$gl_cross_guess_normal";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <string.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+  va_list args;
+  int ret;
+  va_start (args, format);
+  ret = vsnprintf (buf, size, format, args);
+  va_end (args);
+  return ret;
+}
+#endif
+static char fmtstring[10];
+static char buf[100];
+int main ()
+{
+  int count = -1;
+  /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
+     support %n in format strings in read-only memory but not in writable
+     memory.  */
+  strcpy (fmtstring, "%d %n");
+  my_snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
+  if (count != 6)
+    return 1;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_snprintf_directive_n=yes
+else $as_nop
+  gl_cv_func_snprintf_directive_n=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_directive_n" >&5
+printf "%s\n" "$gl_cv_func_snprintf_directive_n" >&6; }
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5
+printf %s "checking whether snprintf respects a size of 1... " >&6; }
+if test ${gl_cv_func_snprintf_size1+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                            # Guess yes on Android.
+           linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
+                            # Guess yes on native Windows.
+           mingw*)          gl_cv_func_snprintf_size1="guessing yes" ;;
+           *)               gl_cv_func_snprintf_size1="guessing yes" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+  va_list args;
+  int ret;
+  va_start (args, format);
+  ret = vsnprintf (buf, size, format, args);
+  va_end (args);
+  return ret;
+}
+#endif
+int main()
+{
+  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+  my_snprintf (buf, 1, "%d", 12345);
+  return buf[1] != 'E';
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_snprintf_size1=yes
+else $as_nop
+  gl_cv_func_snprintf_size1=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5
+printf "%s\n" "$gl_cv_func_snprintf_size1" >&6; }
+
+
+
+     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether vsnprintf respects a zero size as in C99" >&5
+printf %s "checking whether vsnprintf respects a zero size as in C99... " >&6; }
+if test ${gl_cv_func_vsnprintf_zerosize_c99+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+
+         case "$host_os" in
+                                 # Guess yes on glibc systems.
+           *-gnu* | gnu*)        gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on musl systems.
+           *-musl*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on FreeBSD >= 5.
+           freebsd[1-4].*)       gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+           freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+           midnightbsd*)         gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on Mac OS X >= 10.3.
+           darwin[1-6].*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+           darwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on Cygwin.
+           cygwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on Solaris >= 2.6.
+           solaris2.[0-5] | solaris2.[0-5].*)
+                                 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+           solaris*)             gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on AIX >= 4.
+           aix[1-3]*)            gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+           aix*)                 gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on IRIX >= 6.5.
+           irix6.5)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on NetBSD >= 3.
+           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+                                 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+           netbsd*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on BeOS.
+           beos*)                gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on Android.
+           linux*-android*)      gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # Guess yes on native Windows.
+           mingw* | pw*)         gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+                                 # If we don't know, obey --enable-cross-guesses.
+           *)                    gl_cv_func_vsnprintf_zerosize_c99="$gl_cross_guess_normal";;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdarg.h>
+#include <stdio.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+  va_list args;
+  int ret;
+  va_start (args, format);
+  ret = vsnprintf (buf, size, format, args);
+  va_end (args);
+  return ret;
+}
+int main()
+{
+  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+  my_snprintf (buf, 0, "%d", 12345);
+  return buf[0] != 'D';
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_vsnprintf_zerosize_c99=yes
+else $as_nop
+  gl_cv_func_vsnprintf_zerosize_c99=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_vsnprintf_zerosize_c99" >&5
+printf "%s\n" "$gl_cv_func_vsnprintf_zerosize_c99" >&6; }
+
+    case "$gl_cv_func_printf_sizes_c99" in
+      *yes)
+        case "$gl_cv_func_printf_long_double" in
+          *yes)
+            case "$gl_cv_func_printf_infinite" in
+              *yes)
+                case "$gl_cv_func_printf_infinite_long_double" in
+                  *yes)
+                    case "$gl_cv_func_printf_directive_a" in
+                      *yes)
+                        case "$gl_cv_func_printf_directive_f" in
+                          *yes)
+                            case "$gl_cv_func_printf_directive_n" in
+                              *yes)
+                                case "$gl_cv_func_printf_directive_ls" in
+                                  *yes)
+                                    case "$gl_cv_func_printf_positions" in
+                                      *yes)
+                                        case "$gl_cv_func_printf_flag_grouping" in
+                                          *yes)
+                                            case "$gl_cv_func_printf_flag_leftadjust" in
+                                              *yes)
+                                                case "$gl_cv_func_printf_flag_zero" in
+                                                  *yes)
+                                                    case "$gl_cv_func_printf_precision" in
+                                                      *yes)
+                                                        case "$gl_cv_func_printf_enomem" in
+                                                          *yes)
+                                                            case "$gl_cv_func_snprintf_truncation_c99" in
+                                                              *yes)
+                                                                case "$gl_cv_func_snprintf_retval_c99" in
+                                                                  *yes)
+                                                                    case "$gl_cv_func_snprintf_directive_n" in
+                                                                      *yes)
+                                                                        case "$gl_cv_func_snprintf_size1" in
+                                                                          *yes)
+                                                                            case "$gl_cv_func_vsnprintf_zerosize_c99" in
+                                                                              *yes)
+                                                                                # vsnprintf exists and is
+                                                                                # already POSIX compliant.
+                                                                                gl_cv_func_vsnprintf_posix=yes
+                                                                                ;;
+                                                                            esac
+                                                                            ;;
+                                                                        esac
+                                                                        ;;
+                                                                    esac
+                                                                    ;;
+                                                                esac
+                                                                ;;
+                                                            esac
+                                                            ;;
+                                                        esac
+                                                        ;;
+                                                    esac
+                                                    ;;
+                                                esac
+                                                ;;
+                                            esac
+                                            ;;
+                                        esac
+                                        ;;
+                                    esac
+                                    ;;
+                                esac
+                                ;;
+                            esac
+                            ;;
+                        esac
+                        ;;
+                    esac
+                    ;;
+                esac
+                ;;
+            esac
+            ;;
+        esac
+        ;;
+    esac
+  fi
+  if test $gl_cv_func_vsnprintf_posix = no; then
+
+
+
+  case "$gl_cv_func_printf_infinite" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+  case "$gl_cv_func_printf_long_double" in
+    *yes)
+      case "$gl_cv_func_printf_infinite_long_double" in
+        *yes)
+          ;;
+        *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
+
+          ;;
+      esac
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_a" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
+
+      ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
+if test "x$ac_cv_func_nl_langinfo" = xyes
+then :
+  printf "%s\n" "#define HAVE_NL_LANGINFO 1" >>confdefs.h
+
+fi
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_f" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_ls" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_grouping" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_leftadjust" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_zero" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_precision" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_enomem" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
+
+  if test $ac_cv_func_vasnprintf = yes; then
+
+printf "%s\n" "#define REPLACE_VASNPRINTF 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+
+
+
+
+  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
+if test "x$ac_cv_type_ptrdiff_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define ptrdiff_t long" >>confdefs.h
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS vsnprintf.$ac_objext"
+
+  if test $ac_cv_func_vsnprintf = yes; then
+    REPLACE_VSNPRINTF=1
+  else
+
+    if test $ac_cv_have_decl_vsnprintf = yes; then
+                        REPLACE_VSNPRINTF=1
+    fi
+  fi
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_cv_func_vsprintf_posix=no
+  case "$gl_cv_func_printf_sizes_c99" in
+    *yes)
+      case "$gl_cv_func_printf_long_double" in
+        *yes)
+          case "$gl_cv_func_printf_infinite" in
+            *yes)
+              case "$gl_cv_func_printf_infinite_long_double" in
+                *yes)
+                  case "$gl_cv_func_printf_directive_a" in
+                    *yes)
+                      case "$gl_cv_func_printf_directive_f" in
+                        *yes)
+                          case "$gl_cv_func_printf_directive_n" in
+                            *yes)
+                              case "$gl_cv_func_printf_directive_ls" in
+                                *yes)
+                                  case "$gl_cv_func_printf_positions" in
+                                    *yes)
+                                      case "$gl_cv_func_printf_flag_grouping" in
+                                        *yes)
+                                          case "$gl_cv_func_printf_flag_leftadjust" in
+                                            *yes)
+                                              case "$gl_cv_func_printf_flag_zero" in
+                                                *yes)
+                                                  case "$gl_cv_func_printf_precision" in
+                                                    *yes)
+                                                      case "$gl_cv_func_printf_enomem" in
+                                                        *yes)
+                                                          # vsprintf exists and is
+                                                          # already POSIX compliant.
+                                                          gl_cv_func_vsprintf_posix=yes
+                                                          ;;
+                                                      esac
+                                                      ;;
+                                                  esac
+                                                  ;;
+                                              esac
+                                              ;;
+                                          esac
+                                          ;;
+                                      esac
+                                      ;;
+                                  esac
+                                  ;;
+                              esac
+                              ;;
+                          esac
+                          ;;
+                      esac
+                      ;;
+                  esac
+                  ;;
+              esac
+              ;;
+          esac
+          ;;
+      esac
+      ;;
+  esac
+  if test $gl_cv_func_vsprintf_posix = no; then
+
+
+
+  case "$gl_cv_func_printf_infinite" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+  case "$gl_cv_func_printf_long_double" in
+    *yes)
+      case "$gl_cv_func_printf_infinite_long_double" in
+        *yes)
+          ;;
+        *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
+
+          ;;
+      esac
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_a" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
+
+      ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
+if test "x$ac_cv_func_nl_langinfo" = xyes
+then :
+  printf "%s\n" "#define HAVE_NL_LANGINFO 1" >>confdefs.h
+
+fi
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_f" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_ls" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_grouping" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_leftadjust" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_zero" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_precision" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_enomem" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
+
+  if test $ac_cv_func_vasnprintf = yes; then
+
+printf "%s\n" "#define REPLACE_VASNPRINTF 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+
+
+
+
+  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
+if test "x$ac_cv_type_ptrdiff_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define ptrdiff_t long" >>confdefs.h
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS vsprintf.$ac_objext"
+
+  REPLACE_VSPRINTF=1
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_VSPRINTF_POSIX=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_VSPRINTF_POSIX 1" >>confdefs.h
+
+
+
+
+
+  ac_fn_c_check_func "$LINENO" "waitid" "ac_cv_func_waitid"
+if test "x$ac_cv_func_waitid" = xyes
+then :
+  printf "%s\n" "#define HAVE_WAITID 1" >>confdefs.h
+
+fi
+
+
+
+
+  HAVE_WAITPID=1
+  case $host_os in
+    mingw*) HAVE_WAITPID=0 ;;
+  esac
+
+  if test $HAVE_WAITPID = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS waitpid.$ac_objext"
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_WAITPID=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_WAITPID 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  ac_fn_check_decl "$LINENO" "wcwidth" "ac_cv_have_decl_wcwidth" "
+    #include <wchar.h>
+
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_wcwidth" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_WCWIDTH $ac_have_decl" >>confdefs.h
+
+  if test $ac_cv_have_decl_wcwidth != yes; then
+    HAVE_DECL_WCWIDTH=0
+  fi
+
+  if test $ac_cv_func_wcwidth != yes; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wcwidth is a macro" >&5
+printf %s "checking whether wcwidth is a macro... " >&6; }
+if test ${gl_cv_func_wcwidth_macro+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <wchar.h>
+#ifdef wcwidth
+ wchar_header_defines_wcwidth
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "wchar_header_defines_wcwidth" >/dev/null 2>&1
+then :
+  gl_cv_func_wcwidth_macro=yes
+else $as_nop
+  gl_cv_func_wcwidth_macro=no
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_macro" >&5
+printf "%s\n" "$gl_cv_func_wcwidth_macro" >&6; }
+  fi
+
+  if test $ac_cv_func_wcwidth = yes || test $gl_cv_func_wcwidth_macro = yes; then
+    HAVE_WCWIDTH=1
+                                        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wcwidth works reasonably in UTF-8 locales" >&5
+printf %s "checking whether wcwidth works reasonably in UTF-8 locales... " >&6; }
+if test ${gl_cv_func_wcwidth_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+        if test "$cross_compiling" = yes
+then :
+
+           case "$host_os" in
+                            # Guess yes on glibc systems.
+             *-gnu* | gnu*) gl_cv_func_wcwidth_works="guessing yes";;
+                            # Guess yes on musl systems.
+             *-musl*)       gl_cv_func_wcwidth_works="guessing yes";;
+                            # Guess yes on AIX 7 systems.
+             aix[7-9]*)     gl_cv_func_wcwidth_works="guessing yes";;
+             *)             gl_cv_func_wcwidth_works="$gl_cross_guess_normal";;
+           esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <locale.h>
+#include <wchar.h>
+#if !HAVE_DECL_WCWIDTH
+extern
+# ifdef __cplusplus
+"C"
+# endif
+int wcwidth (int);
+#endif
+int main ()
+{
+  int result = 0;
+  if (setlocale (LC_ALL, "en_US.UTF-8") != NULL)
+    {
+      if (wcwidth (0x0301) > 0)
+        result |= 1;
+      if (wcwidth (0x05B0) > 0)
+        result |= 2;
+      if (wcwidth (0x200B) > 0)
+        result |= 4;
+      if (wcwidth (0xFF1A) == 0)
+        result |= 8;
+      if (wcwidth (0x2202) > 1)
+        result |= 16;
+    }
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_wcwidth_works=yes
+else $as_nop
+  gl_cv_func_wcwidth_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_works" >&5
+printf "%s\n" "$gl_cv_func_wcwidth_works" >&6; }
+    case "$gl_cv_func_wcwidth_works" in
+      *yes) ;;
+      *no) REPLACE_WCWIDTH=1 ;;
+    esac
+  else
+    HAVE_WCWIDTH=0
+  fi
+
+  if test $HAVE_WCWIDTH = 0 || test $REPLACE_WCWIDTH = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS wcwidth.$ac_objext"
+
+
+
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_WCWIDTH=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_WCWIDTH 1" >>confdefs.h
+
+
+
+
+  case "$host_os" in
+    mingw*)
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS windows-spawn.$ac_objext"
+
+      ;;
+  esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether use of TIOCGWINSZ requires sys/ioctl.h" >&5
+printf %s "checking whether use of TIOCGWINSZ requires sys/ioctl.h... " >&6; }
+if test ${gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h=no
+
+   if test $gl_cv_sys_tiocgwinsz_needs_termios_h = no; then
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#        include <sys/ioctl.h>
+#        ifdef TIOCGWINSZ
+           yes
+#        endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1
+then :
+  gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h=yes
+fi
+rm -rf conftest*
+
+   fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h" >&5
+printf "%s\n" "$gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h" >&6; }
+  if test $gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h = yes; then
+
+printf "%s\n" "#define GWINSZ_IN_SYS_IOCTL 1" >>confdefs.h
+
+  fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether use of TIOCGWINSZ requires termios.h" >&5
+printf %s "checking whether use of TIOCGWINSZ requires termios.h... " >&6; }
+if test ${gl_cv_sys_tiocgwinsz_needs_termios_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  gl_cv_sys_tiocgwinsz_needs_termios_h=no
+
+   if test $ac_cv_sys_posix_termios = yes; then
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#      include <termios.h>
+#      ifdef TIOCGWINSZ
+         yes
+#      endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1
+then :
+  gl_cv_sys_tiocgwinsz_needs_termios_h=yes
+fi
+rm -rf conftest*
+
+   fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_tiocgwinsz_needs_termios_h" >&5
+printf "%s\n" "$gl_cv_sys_tiocgwinsz_needs_termios_h" >&6; }
+
+
+
+   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether use of struct winsize requires sys/ptem.h" >&5
+printf %s "checking whether use of struct winsize requires sys/ptem.h... " >&6; }
+if test ${gl_cv_sys_struct_winsize_needs_sys_ptem_h+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  gl_cv_sys_struct_winsize_needs_sys_ptem_h=yes
+      if test $ac_cv_sys_posix_termios = yes; then
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <termios.h>
+int
+main (void)
+{
+struct winsize x;
+            if (sizeof x > 0) return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_sys_struct_winsize_needs_sys_ptem_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+      fi
+      if test $gl_cv_sys_struct_winsize_needs_sys_ptem_h = yes; then
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/ptem.h>
+int
+main (void)
+{
+struct winsize x;
+            if (sizeof x > 0) return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+  gl_cv_sys_struct_winsize_needs_sys_ptem_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+      fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_winsize_needs_sys_ptem_h" >&5
+printf "%s\n" "$gl_cv_sys_struct_winsize_needs_sys_ptem_h" >&6; }
+   if test $gl_cv_sys_struct_winsize_needs_sys_ptem_h = yes; then
+
+printf "%s\n" "#define WINSIZE_IN_PTEM 1" >>confdefs.h
+
+   fi
+
+  :
+
+
+printf "%s\n" "#define GNULIB_XALLOC 1" >>confdefs.h
+
+
+
+
+printf "%s\n" "#define GNULIB_XALLOC_DIE 1" >>confdefs.h
+
+
+
+
+  ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdint_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h
+
+fi
+
+
+
+
+  :
+
+
+  gl_gnulib_enabled_260941c0e5dc67ec9e87d1fb321c300b=false
+  gl_gnulib_enabled_chdir=false
+  gl_gnulib_enabled_8198daae261b932d64a998f8586f5005=false
+  gl_gnulib_enabled_closedir=false
+  gl_gnulib_enabled_75c65a2c014cf8235dd95289676302a4=false
+  gl_gnulib_enabled_dirent=false
+  gl_gnulib_enabled_dirfd=false
+  gl_gnulib_enabled_dup=false
+  gl_gnulib_enabled_fchdir=false
+  gl_gnulib_enabled_43fe87a341d9b4b93c47c3ad819a5239=false
+  gl_gnulib_enabled_fdopendir=false
+  gl_gnulib_enabled_ffs=false
+  gl_gnulib_enabled_fca9852db2a43bb33f02f0fbdbc174f6=false
+  gl_gnulib_enabled_fseterr=false
+  gl_gnulib_enabled_fstat=false
+  gl_gnulib_enabled_fstatat=false
+  gl_gnulib_enabled_3d094ef542bfdd238a5194e172bfe5f6=false
+  gl_gnulib_enabled_getdelim=false
+  gl_gnulib_enabled_getdtablesize=false
+  gl_gnulib_enabled_getline=false
+  gl_gnulib_enabled_30838f5439487421042f2225bed3af76=false
+  gl_gnulib_enabled_3f0e593033d1fc2c127581960f641b66=false
+  gl_gnulib_enabled_ldexp=false
+  gl_gnulib_enabled_locale=false
+  gl_gnulib_enabled_lstat=false
+  gl_gnulib_enabled_malloca=false
+  gl_gnulib_enabled_memrchr=false
+  gl_gnulib_enabled_openat=false
+  gl_gnulib_enabled_1840129d490f3a00c8a098316d0fa345=false
+  gl_gnulib_enabled_03e0aaad4cb89ca757653bd367a6ccb7=false
+  gl_gnulib_enabled_opendir=false
+  gl_gnulib_enabled_332607f759618fb73dfc3076748afea7=false
+  gl_gnulib_enabled_readdir=false
+  gl_gnulib_enabled_rewinddir=false
+  gl_gnulib_enabled_rmdir=false
+  gl_gnulib_enabled_d4850532688ba16d685f036076611f21=false
+  gl_gnulib_enabled_e7e881d32ca02f1c997b13c737c64bbd=false
+  gl_gnulib_enabled_cdeb0f2aaf9d280baa6526bfa1b07f70=false
+  gl_gnulib_enabled_0137e3d3638b33e5819d132d0b23165c=false
+  gl_gnulib_enabled_strchrnul=false
+  gl_gnulib_enabled_dbb57f49352be8fb86869629a254fb72=false
+  gl_gnulib_enabled_1f32594a85e6221ba15f884daeee8c2a=false
+  gl_gnulib_enabled_strings=false
+  gl_gnulib_enabled_strnlen=false
+  gl_gnulib_enabled_ed5616be3593d355b981ffab56b9f37b=false
+  gl_gnulib_enabled_503a4cb75d69c787103d0aa2ab7d8440=false
+  gl_gnulib_enabled_68a4501daeca58988392c7e60b4917ab=false
+  gl_gnulib_enabled_f0efff84a70f4afba30902bb8ffe9354=false
+  gl_gnulib_enabled_8bb827fe37eaccf1b97feb0c87bc92ef=false
+  gl_gnulib_enabled_48b2271240803e4879464b755748a89d=false
+  func_gl_gnulib_m4code_260941c0e5dc67ec9e87d1fb321c300b ()
+  {
+    if ! $gl_gnulib_enabled_260941c0e5dc67ec9e87d1fb321c300b; then
+
+      gl_gnulib_enabled_260941c0e5dc67ec9e87d1fb321c300b=true
+    fi
+  }
+  func_gl_gnulib_m4code_chdir ()
+  {
+    if ! $gl_gnulib_enabled_chdir; then
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_CHDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_CHDIR 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_chdir=true
+    fi
+  }
+  func_gl_gnulib_m4code_8198daae261b932d64a998f8586f5005 ()
+  {
+    if ! $gl_gnulib_enabled_8198daae261b932d64a998f8586f5005; then
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether this system supports file names of any length" >&5
+printf %s "checking whether this system supports file names of any length... " >&6; }
+if test ${gl_cv_have_unlimited_file_name_length+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Arrange to define PATH_MAX, like "pathmax.h" does. */
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <limits.h>
+#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+# include <sys/param.h>
+#endif
+#if !defined PATH_MAX && defined MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+#endif
+#ifdef __hpux
+# undef PATH_MAX
+# define PATH_MAX 1024
+#endif
+#if defined _WIN32 && ! defined __CYGWIN__
+# undef PATH_MAX
+# define PATH_MAX 260
+#endif
+
+#ifdef PATH_MAX
+have_arbitrary_file_name_length_limit
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "have_arbitrary_file_name_length_limit" >/dev/null 2>&1
+then :
+  gl_cv_have_unlimited_file_name_length=no
+else $as_nop
+  gl_cv_have_unlimited_file_name_length=yes
+fi
+rm -rf conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_unlimited_file_name_length" >&5
+printf "%s\n" "$gl_cv_have_unlimited_file_name_length" >&6; }
+
+      if test $gl_cv_have_unlimited_file_name_length = no; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS chdir-long.$ac_objext"
+
+        :
+      fi
+      gl_gnulib_enabled_8198daae261b932d64a998f8586f5005=true
+      func_gl_gnulib_m4code_chdir
+      if test $gl_cv_have_unlimited_file_name_length = no; then
+        func_gl_gnulib_m4code_fchdir
+      fi
+      if test $gl_cv_have_unlimited_file_name_length = no; then
+        func_gl_gnulib_m4code_memrchr
+      fi
+      if test $gl_cv_have_unlimited_file_name_length = no; then
+        func_gl_gnulib_m4code_openat
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_closedir ()
+  {
+    if ! $gl_gnulib_enabled_closedir; then
+
+
+
+  ac_fn_c_check_func "$LINENO" "closedir" "ac_cv_func_closedir"
+if test "x$ac_cv_func_closedir" = xyes
+then :
+  printf "%s\n" "#define HAVE_CLOSEDIR 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_closedir = no; then
+    HAVE_CLOSEDIR=0
+  fi
+
+
+
+
+  if test $ac_cv_func_fchdir = no; then
+    HAVE_FCHDIR=0
+  fi
+
+    if test $HAVE_FCHDIR = 0; then
+      if test $HAVE_CLOSEDIR = 1; then
+        REPLACE_CLOSEDIR=1
+      fi
+    fi
+
+    case $host_os,$HAVE_CLOSEDIR in
+    os2*,1)
+      REPLACE_CLOSEDIR=1;;
+  esac
+
+      if test $HAVE_CLOSEDIR = 0 || test $REPLACE_CLOSEDIR = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS closedir.$ac_objext"
+
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_CLOSEDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_CLOSEDIR 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_closedir=true
+      func_gl_gnulib_m4code_dirent
+      if test $HAVE_CLOSEDIR = 0 || test $REPLACE_CLOSEDIR = 1; then
+        func_gl_gnulib_m4code_dirfd
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_75c65a2c014cf8235dd95289676302a4 ()
+  {
+    if ! $gl_gnulib_enabled_75c65a2c014cf8235dd95289676302a4; then
+          { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for d_ino member in directory struct" >&5
+printf %s "checking for d_ino member in directory struct... " >&6; }
+if test ${gl_cv_struct_dirent_d_ino+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                            # Guess yes on glibc systems with Linux kernel.
+              linux*-gnu*)  gl_cv_struct_dirent_d_ino="guessing yes" ;;
+                            # Guess yes on musl systems with Linux kernel.
+              linux*-musl*) gl_cv_struct_dirent_d_ino="guessing yes" ;;
+                            # Guess no on native Windows.
+              mingw*)       gl_cv_struct_dirent_d_ino="guessing no" ;;
+                            # If we don't know, obey --enable-cross-guesses.
+              *)            gl_cv_struct_dirent_d_ino="$gl_cross_guess_normal" ;;
+            esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+             #include <sys/stat.h>
+             #include <dirent.h>
+
+int
+main (void)
+{
+DIR *dp = opendir (".");
+             struct dirent *e;
+             struct stat st;
+             if (! dp)
+               return 1;
+             e = readdir (dp);
+             if (! e)
+               { closedir (dp); return 2; }
+             if (lstat (e->d_name, &st) != 0)
+               { closedir (dp); return 3; }
+             if (e->d_ino != st.st_ino)
+               { closedir (dp); return 4; }
+             closedir (dp);
+             return 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_struct_dirent_d_ino=yes
+else $as_nop
+  gl_cv_struct_dirent_d_ino=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_struct_dirent_d_ino" >&5
+printf "%s\n" "$gl_cv_struct_dirent_d_ino" >&6; }
+   case "$gl_cv_struct_dirent_d_ino" in
+     *yes)
+
+printf "%s\n" "#define D_INO_IN_DIRENT 1" >>confdefs.h
+
+       ;;
+   esac
+
+
+      gl_gnulib_enabled_75c65a2c014cf8235dd95289676302a4=true
+    fi
+  }
+  func_gl_gnulib_m4code_dirent ()
+  {
+    if ! $gl_gnulib_enabled_dirent; then
+
+
+
+
+
+
+      gl_gnulib_enabled_dirent=true
+    fi
+  }
+  func_gl_gnulib_m4code_dirfd ()
+  {
+    if ! $gl_gnulib_enabled_dirfd; then
+
+
+
+
+
+  ac_fn_c_check_func "$LINENO" "dirfd" "ac_cv_func_dirfd"
+if test "x$ac_cv_func_dirfd" = xyes
+then :
+  printf "%s\n" "#define HAVE_DIRFD 1" >>confdefs.h
+
+fi
+
+  ac_fn_check_decl "$LINENO" "dirfd" "ac_cv_have_decl_dirfd" "#include <sys/types.h>
+      #include <dirent.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_dirfd" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_DIRFD $ac_have_decl" >>confdefs.h
+
+  if test $ac_cv_have_decl_dirfd = no; then
+    HAVE_DECL_DIRFD=0
+  fi
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether dirfd is a macro" >&5
+printf %s "checking whether dirfd is a macro... " >&6; }
+if test ${gl_cv_func_dirfd_macro+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <sys/types.h>
+#include <dirent.h>
+#ifdef dirfd
+ dirent_header_defines_dirfd
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "dirent_header_defines_dirfd" >/dev/null 2>&1
+then :
+  gl_cv_func_dirfd_macro=yes
+else $as_nop
+  gl_cv_func_dirfd_macro=no
+fi
+rm -rf conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_dirfd_macro" >&5
+printf "%s\n" "$gl_cv_func_dirfd_macro" >&6; }
+
+  # Use the replacement if we have no function or macro with that name,
+  # or if OS/2 kLIBC whose dirfd() does not work.
+  # Replace only if the system declares dirfd already.
+  case $ac_cv_func_dirfd,$gl_cv_func_dirfd_macro,$host_os,$ac_cv_have_decl_dirfd in
+    no,no,*,yes | *,*,os2*,yes)
+      REPLACE_DIRFD=1
+
+printf "%s\n" "#define REPLACE_DIRFD 1" >>confdefs.h
+;;
+  esac
+
+      if test $ac_cv_func_dirfd = no && test $gl_cv_func_dirfd_macro = no \
+         || test $REPLACE_DIRFD = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS dirfd.$ac_objext"
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to get the file descriptor associated with an open DIR*" >&5
+printf %s "checking how to get the file descriptor associated with an open DIR*... " >&6; }
+if test ${gl_cv_sys_dir_fd_member_name+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      dirfd_save_CFLAGS=$CFLAGS
+      for ac_expr in d_fd dd_fd; do
+
+        CFLAGS="$CFLAGS -DDIR_FD_MEMBER_NAME=$ac_expr"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+           #include <sys/types.h>
+           #include <dirent.h>
+int
+main (void)
+{
+DIR *dir_p = opendir("."); (void) dir_p->DIR_FD_MEMBER_NAME;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  dir_fd_found=yes
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+        CFLAGS=$dirfd_save_CFLAGS
+        test "$dir_fd_found" = yes && break
+      done
+      test "$dir_fd_found" = yes || ac_expr=no_such_member
+
+      gl_cv_sys_dir_fd_member_name=$ac_expr
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_dir_fd_member_name" >&5
+printf "%s\n" "$gl_cv_sys_dir_fd_member_name" >&6; }
+  if test $gl_cv_sys_dir_fd_member_name != no_such_member; then
+
+printf "%s\n" "#define DIR_FD_MEMBER_NAME $gl_cv_sys_dir_fd_member_name" >>confdefs.h
+
+  fi
+
+
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_DIRFD=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_DIRFD 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_dirfd=true
+      func_gl_gnulib_m4code_dirent
+    fi
+  }
+  func_gl_gnulib_m4code_dup ()
+  {
+    if ! $gl_gnulib_enabled_dup; then
+
+
+
+
+    if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+      REPLACE_DUP=1
+    fi
+
+
+
+
+
+  if test $ac_cv_func_fchdir = no; then
+    HAVE_FCHDIR=0
+  fi
+
+    if test $HAVE_FCHDIR = 0; then
+      REPLACE_DUP=1
+    fi
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether dup works" >&5
+printf %s "checking whether dup works... " >&6; }
+if test ${gl_cv_func_dup_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                 # Guess no on native Windows.
+         mingw*) gl_cv_func_dup_works="guessing no" ;;
+         *)      gl_cv_func_dup_works="guessing yes" ;;
+       esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <unistd.h>
+                         #include <fcntl.h>
+                         #include <errno.h>
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+/* On OS/2 kLIBC, dup does not work on a directory fd.  */
+           int fd = open (".", O_RDONLY);
+           return fd < 0 ? 1 : dup (fd) < 0 ? 2 : 0;
+
+  ;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_dup_works=yes
+else $as_nop
+  gl_cv_func_dup_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_dup_works" >&5
+printf "%s\n" "$gl_cv_func_dup_works" >&6; }
+  case "$gl_cv_func_dup_works" in
+    *yes) ;;
+    *)
+      REPLACE_DUP=1
+      ;;
+  esac
+
+      if test $REPLACE_DUP = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS dup.$ac_objext"
+
+        :
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_DUP=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_DUP 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_dup=true
+    fi
+  }
+  func_gl_gnulib_m4code_fchdir ()
+  {
+    if ! $gl_gnulib_enabled_fchdir; then
+
+
+
+
+
+  if test $ac_cv_have_decl_fchdir = no; then
+    HAVE_DECL_FCHDIR=0
+  fi
+
+
+  if test $HAVE_FCHDIR = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS fchdir.$ac_objext"
+
+    :
+
+printf "%s\n" "#define REPLACE_FCHDIR 1" >>confdefs.h
+
+                { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether open can visit directories" >&5
+printf %s "checking whether open can visit directories... " >&6; }
+if test ${gl_cv_func_open_directory_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                             # Guess yes on Linux systems.
+            linux-* | linux) gl_cv_func_open_directory_works="guessing yes" ;;
+                             # Guess yes on glibc systems.
+            *-gnu* | gnu*)   gl_cv_func_open_directory_works="guessing yes" ;;
+                             # Guess no on native Windows.
+            mingw*)          gl_cv_func_open_directory_works="guessing no" ;;
+                             # If we don't know, obey --enable-cross-guesses.
+            *)               gl_cv_func_open_directory_works="$gl_cross_guess_normal" ;;
+          esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <fcntl.h>
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+return open(".", O_RDONLY) < 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_open_directory_works=yes
+else $as_nop
+  gl_cv_func_open_directory_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_open_directory_works" >&5
+printf "%s\n" "$gl_cv_func_open_directory_works" >&6; }
+    case "$gl_cv_func_open_directory_works" in
+      *yes) ;;
+      *)
+
+printf "%s\n" "#define REPLACE_OPEN_DIRECTORY 1" >>confdefs.h
+
+        ;;
+    esac
+  fi
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FCHDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FCHDIR 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_fchdir=true
+      if test $HAVE_FCHDIR = 0; then
+        func_gl_gnulib_m4code_chdir
+      fi
+      if test $HAVE_FCHDIR = 0; then
+        func_gl_gnulib_m4code_dirent
+      fi
+      if test $HAVE_FCHDIR = 0; then
+        func_gl_gnulib_m4code_dirfd
+      fi
+      if test $HAVE_FCHDIR = 0; then
+        func_gl_gnulib_m4code_fca9852db2a43bb33f02f0fbdbc174f6
+      fi
+      if test $HAVE_FCHDIR = 0; then
+        func_gl_gnulib_m4code_fstat
+      fi
+      if test $HAVE_FCHDIR = 0; then
+        func_gl_gnulib_m4code_3d094ef542bfdd238a5194e172bfe5f6
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_43fe87a341d9b4b93c47c3ad819a5239 ()
+  {
+    if ! $gl_gnulib_enabled_43fe87a341d9b4b93c47c3ad819a5239; then
+      gl_gnulib_enabled_43fe87a341d9b4b93c47c3ad819a5239=true
+    fi
+  }
+  func_gl_gnulib_m4code_fdopendir ()
+  {
+    if ! $gl_gnulib_enabled_fdopendir; then
+
+
+
+
+
+    ac_fn_check_decl "$LINENO" "fdopendir" "ac_cv_have_decl_fdopendir" "
+#include <dirent.h>
+
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_fdopendir" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_FDOPENDIR $ac_have_decl" >>confdefs.h
+if test $ac_have_decl = 1
+then :
+
+else $as_nop
+  HAVE_DECL_FDOPENDIR=0
+fi
+
+
+  if test $ac_cv_func_fdopendir = no; then
+    HAVE_FDOPENDIR=0
+  else
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fdopendir works" >&5
+printf %s "checking whether fdopendir works... " >&6; }
+if test ${gl_cv_func_fdopendir_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                     # Guess yes on glibc systems.
+            *-gnu*)  gl_cv_func_fdopendir_works="guessing yes" ;;
+                     # Guess yes on musl systems.
+            *-musl*) gl_cv_func_fdopendir_works="guessing yes" ;;
+                     # If we don't know, obey --enable-cross-guesses.
+            *)       gl_cv_func_fdopendir_works="$gl_cross_guess_normal" ;;
+          esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+
+$gl_mda_defines
+
+#if !HAVE_DECL_FDOPENDIR
+extern
+# ifdef __cplusplus
+"C"
+# endif
+DIR *fdopendir (int);
+#endif
+
+int
+main (void)
+{
+int result = 0;
+              int fd = open ("conftest.c", O_RDONLY);
+              if (fd < 0) result |= 1;
+              if (fdopendir (fd)) result |= 2;
+              if (close (fd)) result |= 4;
+              return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_fdopendir_works=yes
+else $as_nop
+  gl_cv_func_fdopendir_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fdopendir_works" >&5
+printf "%s\n" "$gl_cv_func_fdopendir_works" >&6; }
+    case "$gl_cv_func_fdopendir_works" in
+      *yes) ;;
+      *)
+        REPLACE_FDOPENDIR=1
+        ;;
+    esac
+  fi
+
+      if test $HAVE_FDOPENDIR = 0 || test $REPLACE_FDOPENDIR = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS fdopendir.$ac_objext"
+
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FDOPENDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FDOPENDIR 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define GNULIB_FDOPENDIR 1" >>confdefs.h
+
+
+      gl_gnulib_enabled_fdopendir=true
+      if test $HAVE_FDOPENDIR = 0; then
+        func_gl_gnulib_m4code_260941c0e5dc67ec9e87d1fb321c300b
+      fi
+      func_gl_gnulib_m4code_dirent
+      if test $HAVE_FDOPENDIR = 0; then
+        func_gl_gnulib_m4code_dirfd
+      fi
+      if test $HAVE_FDOPENDIR = 0; then
+        func_gl_gnulib_m4code_dup
+      fi
+      if test $HAVE_FDOPENDIR = 0; then
+        func_gl_gnulib_m4code_fchdir
+      fi
+      if test $HAVE_FDOPENDIR = 0; then
+        func_gl_gnulib_m4code_fstat
+      fi
+      if test $HAVE_FDOPENDIR = 0; then
+        func_gl_gnulib_m4code_1840129d490f3a00c8a098316d0fa345
+      fi
+      if test $HAVE_FDOPENDIR = 0; then
+        func_gl_gnulib_m4code_opendir
+      fi
+      if test $HAVE_FDOPENDIR = 0; then
+        func_gl_gnulib_m4code_d4850532688ba16d685f036076611f21
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_ffs ()
+  {
+    if ! $gl_gnulib_enabled_ffs; then
+
+
+
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ffs" >&5
+printf %s "checking for ffs... " >&6; }
+if test ${gl_cv_func_ffs+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <strings.h>
+            int x;
+
+int
+main (void)
+{
+int (*func) (int) = ffs;
+            return func (x);
+
+  ;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_ffs=yes
+else $as_nop
+  gl_cv_func_ffs=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ffs" >&5
+printf "%s\n" "$gl_cv_func_ffs" >&6; }
+  if test $gl_cv_func_ffs = no; then
+    HAVE_FFS=0
+  fi
+
+      if test $HAVE_FFS = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS ffs.$ac_objext"
+
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FFS=1
+
+
+
+
+      gl_gnulib_enabled_ffs=true
+      func_gl_gnulib_m4code_strings
+    fi
+  }
+  func_gl_gnulib_m4code_fca9852db2a43bb33f02f0fbdbc174f6 ()
+  {
+    if ! $gl_gnulib_enabled_fca9852db2a43bb33f02f0fbdbc174f6; then
+
+
+
+      gl_gnulib_enabled_fca9852db2a43bb33f02f0fbdbc174f6=true
+    fi
+  }
+  func_gl_gnulib_m4code_fseterr ()
+  {
+    if ! $gl_gnulib_enabled_fseterr; then
+
+
+
+      if test $ac_cv_func___fseterr = no; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS fseterr.$ac_objext"
+
+      fi
+      gl_gnulib_enabled_fseterr=true
+    fi
+  }
+  func_gl_gnulib_m4code_fstat ()
+  {
+    if ! $gl_gnulib_enabled_fstat; then
+
+
+
+
+  case "$host_os" in
+    mingw* | solaris*)
+                        REPLACE_FSTAT=1
+      ;;
+  esac
+
+
+
+
+
+  if test $ac_cv_func_fchdir = no; then
+    HAVE_FCHDIR=0
+  fi
+
+    if test $HAVE_FCHDIR = 0; then
+      case "$gl_cv_func_open_directory_works" in
+        *yes) ;;
+        *)
+          REPLACE_FSTAT=1
+          ;;
+      esac
+    fi
+
+
+      if test $REPLACE_FSTAT = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS fstat.$ac_objext"
+
+        case "$host_os" in
+          mingw*)
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS stat-w32.$ac_objext"
+
+            ;;
+        esac
+
+
+
+  :
+
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FSTAT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FSTAT 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_fstat=true
+      if test $REPLACE_FSTAT = 1; then
+        func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_fstatat ()
+  {
+    if ! $gl_gnulib_enabled_fstatat; then
+
+
+
+
+
+
+
+  if test $ac_cv_func_fstatat = no; then
+    HAVE_FSTATAT=0
+  else
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fstatat (..., 0) works" >&5
+printf %s "checking whether fstatat (..., 0) works... " >&6; }
+if test ${gl_cv_func_fstatat_zero_flag+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+            aix*) gl_cv_func_fstatat_zero_flag="guessing no";;
+            *)    gl_cv_func_fstatat_zero_flag="guessing yes";;
+          esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+              #include <fcntl.h>
+              #include <sys/stat.h>
+              int
+              main (void)
+              {
+                struct stat a;
+                return fstatat (AT_FDCWD, ".", &a, 0) != 0;
+              }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_fstatat_zero_flag=yes
+else $as_nop
+  gl_cv_func_fstatat_zero_flag=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fstatat_zero_flag" >&5
+printf "%s\n" "$gl_cv_func_fstatat_zero_flag" >&6; }
+
+    case $gl_cv_func_fstatat_zero_flag+$gl_cv_func_lstat_dereferences_slashed_symlink in
+    *yes+*yes) ;;
+    *) REPLACE_FSTATAT=1 ;;
+    esac
+
+    case $host_os in
+      solaris*)
+        REPLACE_FSTATAT=1 ;;
+    esac
+
+    case $REPLACE_FSTATAT,$gl_cv_func_fstatat_zero_flag in
+      1,*yes)
+
+printf "%s\n" "#define HAVE_WORKING_FSTATAT_ZERO_FLAG 1" >>confdefs.h
+
+         ;;
+    esac
+  fi
+
+      if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS fstatat.$ac_objext"
+
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_FSTATAT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FSTATAT 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_fstatat=true
+      if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+        func_gl_gnulib_m4code_260941c0e5dc67ec9e87d1fb321c300b
+      fi
+      if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+        func_gl_gnulib_m4code_fchdir
+      fi
+      if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+        func_gl_gnulib_m4code_lstat
+      fi
+      if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+        func_gl_gnulib_m4code_1840129d490f3a00c8a098316d0fa345
+      fi
+      if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+        func_gl_gnulib_m4code_03e0aaad4cb89ca757653bd367a6ccb7
+      fi
+      if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+        func_gl_gnulib_m4code_d4850532688ba16d685f036076611f21
+      fi
+      if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+        func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_3d094ef542bfdd238a5194e172bfe5f6 ()
+  {
+    if ! $gl_gnulib_enabled_3d094ef542bfdd238a5194e172bfe5f6; then
+
+
+
+
+
+  case $gl_cv_func_getcwd_null,$gl_cv_func_getcwd_posix_signature in
+  *yes,yes) ;;
+  *)
+        REPLACE_GETCWD=1
+    ;;
+  esac
+
+      if test $REPLACE_GETCWD = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS getcwd-lgpl.$ac_objext"
+
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_GETCWD=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETCWD 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_3d094ef542bfdd238a5194e172bfe5f6=true
+    fi
+  }
+  func_gl_gnulib_m4code_getdelim ()
+  {
+    if ! $gl_gnulib_enabled_getdelim; then
+
+
+
+
+
+
+
+
+  if test $ac_cv_func_getdelim = yes; then
+    HAVE_GETDELIM=1
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working getdelim function" >&5
+printf %s "checking for working getdelim function... " >&6; }
+if test ${gl_cv_func_working_getdelim+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data
+       if test "$cross_compiling" = yes
+then :
+                      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2) && !defined __UCLIBC__
+  Lucky GNU user
+ #endif
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Lucky GNU user" >/dev/null 2>&1
+then :
+  gl_cv_func_working_getdelim="guessing yes"
+else $as_nop
+  case "$host_os" in
+               *-musl*) gl_cv_func_working_getdelim="guessing yes" ;;
+               *)       gl_cv_func_working_getdelim="$gl_cross_guess_normal" ;;
+             esac
+
+fi
+rm -rf conftest*
+
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#    include <stdio.h>
+#    include <stdlib.h>
+#    include <string.h>
+    int main ()
+    {
+      FILE *in = fopen ("./conftest.data", "r");
+      if (!in)
+        return 1;
+      {
+        /* Test result for a NULL buffer and a zero size.
+           Based on a test program from Karl Heuer.  */
+        char *line = NULL;
+        size_t siz = 0;
+        int len = getdelim (&line, &siz, '\n', in);
+        if (!(len == 4 && line && strcmp (line, "foo\n") == 0))
+          { free (line); fclose (in); return 2; }
+        free (line);
+      }
+      {
+        /* Test result for a NULL buffer and a non-zero size.
+           This crashes on FreeBSD 8.0.  */
+        char *line = NULL;
+        size_t siz = (size_t)(~0) / 4;
+        if (getdelim (&line, &siz, '\n', in) == -1)
+          { fclose (in); return 3; }
+        free (line);
+      }
+      fclose (in);
+      return 0;
+    }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_working_getdelim=yes
+else $as_nop
+  gl_cv_func_working_getdelim=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_getdelim" >&5
+printf "%s\n" "$gl_cv_func_working_getdelim" >&6; }
+    case "$gl_cv_func_working_getdelim" in
+      *yes) ;;
+      *) REPLACE_GETDELIM=1 ;;
+    esac
+  else
+    HAVE_GETDELIM=0
+  fi
+
+  if test $ac_cv_have_decl_getdelim = no; then
+    HAVE_DECL_GETDELIM=0
+  fi
+
+      if test $HAVE_GETDELIM = 0 || test $REPLACE_GETDELIM = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS getdelim.$ac_objext"
+
+
+  ac_fn_c_check_func "$LINENO" "flockfile" "ac_cv_func_flockfile"
+if test "x$ac_cv_func_flockfile" = xyes
+then :
+  printf "%s\n" "#define HAVE_FLOCKFILE 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "funlockfile" "ac_cv_func_funlockfile"
+if test "x$ac_cv_func_funlockfile" = xyes
+then :
+  printf "%s\n" "#define HAVE_FUNLOCKFILE 1" >>confdefs.h
+
+fi
+
+  ac_fn_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_getc_unlocked" = xyes
+then :
+  ac_have_decl=1
+else $as_nop
+  ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_GETC_UNLOCKED $ac_have_decl" >>confdefs.h
+
+
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_GETDELIM=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETDELIM 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_getdelim=true
+    fi
+  }
+  func_gl_gnulib_m4code_getdtablesize ()
+  {
+    if ! $gl_gnulib_enabled_getdtablesize; then
+
+
+
+
+
+  if test $ac_cv_func_getdtablesize = yes &&
+     test $ac_cv_have_decl_getdtablesize = yes; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getdtablesize works" >&5
+printf %s "checking whether getdtablesize works... " >&6; }
+if test ${gl_cv_func_getdtablesize_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+                                                   case "$host_os" in
+         vms*) gl_cv_func_getdtablesize_works="no (limitation)" ;;
+         *)
+                                                       if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                cygwin*) # on cygwin 1.5.25, getdtablesize() automatically grows
+                  gl_cv_func_getdtablesize_works="guessing no" ;;
+                *) gl_cv_func_getdtablesize_works="guessing yes" ;;
+              esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+             #include <unistd.h>
+
+
+$gl_mda_defines
+
+
+int
+main (void)
+{
+int size = getdtablesize();
+                 if (dup2 (0, getdtablesize()) != -1)
+                   return 1;
+                 if (size != getdtablesize())
+                   return 2;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_getdtablesize_works=yes
+else $as_nop
+  gl_cv_func_getdtablesize_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+           ;;
+       esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getdtablesize_works" >&5
+printf "%s\n" "$gl_cv_func_getdtablesize_works" >&6; }
+    case "$gl_cv_func_getdtablesize_works" in
+      *yes | "no (limitation)") ;;
+      *) REPLACE_GETDTABLESIZE=1 ;;
+    esac
+  else
+    HAVE_GETDTABLESIZE=0
+  fi
+
+      if test $HAVE_GETDTABLESIZE = 0 || test $REPLACE_GETDTABLESIZE = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS getdtablesize.$ac_objext"
+
+        :
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_GETDTABLESIZE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETDTABLESIZE 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_getdtablesize=true
+    fi
+  }
+  func_gl_gnulib_m4code_getline ()
+  {
+    if ! $gl_gnulib_enabled_getline; then
+
+
+
+
+
+
+
+  gl_getline_needs_run_time_check=no
+  ac_fn_c_check_func "$LINENO" "getline" "ac_cv_func_getline"
+if test "x$ac_cv_func_getline" = xyes
+then :
+                   gl_getline_needs_run_time_check=yes
+else $as_nop
+  am_cv_func_working_getline=no
+fi
+
+  if test $gl_getline_needs_run_time_check = yes; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working getline function" >&5
+printf %s "checking for working getline function... " >&6; }
+if test ${am_cv_func_working_getline+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data
+       if test "$cross_compiling" = yes
+then :
+                      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2) && !defined __UCLIBC__
+  Lucky GNU user
+ #endif
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Lucky GNU user" >/dev/null 2>&1
+then :
+  am_cv_func_working_getline="guessing yes"
+else $as_nop
+  case "$host_os" in
+               *-musl*) am_cv_func_working_getline="guessing yes" ;;
+               *)       am_cv_func_working_getline="$gl_cross_guess_normal" ;;
+             esac
+
+fi
+rm -rf conftest*
+
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#    include <stdio.h>
+#    include <stdlib.h>
+#    include <string.h>
+    int main ()
+    {
+      FILE *in = fopen ("./conftest.data", "r");
+      if (!in)
+        return 1;
+      {
+        /* Test result for a NULL buffer and a zero size.
+           Based on a test program from Karl Heuer.  */
+        char *line = NULL;
+        size_t siz = 0;
+        int len = getline (&line, &siz, in);
+        if (!(len == 4 && line && strcmp (line, "foo\n") == 0))
+          { free (line); fclose (in); return 2; }
+        free (line);
+      }
+      {
+        /* Test result for a NULL buffer and a non-zero size.
+           This crashes on FreeBSD 8.0.  */
+        char *line = NULL;
+        size_t siz = (size_t)(~0) / 4;
+        if (getline (&line, &siz, in) == -1)
+          { fclose (in); return 3; }
+        free (line);
+      }
+      fclose (in);
+      return 0;
+    }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  am_cv_func_working_getline=yes
+else $as_nop
+  am_cv_func_working_getline=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_working_getline" >&5
+printf "%s\n" "$am_cv_func_working_getline" >&6; }
+  fi
+
+  if test $ac_cv_have_decl_getline = no; then
+    HAVE_DECL_GETLINE=0
+  fi
+
+  case "$am_cv_func_working_getline" in
+    *yes) ;;
+    *)
+                        REPLACE_GETLINE=1
+      ;;
+  esac
+
+      if test $REPLACE_GETLINE = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS getline.$ac_objext"
+
+
+  :
+
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_GETLINE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETLINE 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_getline=true
+      if test $REPLACE_GETLINE = 1; then
+        func_gl_gnulib_m4code_getdelim
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_30838f5439487421042f2225bed3af76 ()
+  {
+    if ! $gl_gnulib_enabled_30838f5439487421042f2225bed3af76; then
+
+      LIB_HARD_LOCALE="$LIB_SETLOCALE_NULL"
+
+      gl_gnulib_enabled_30838f5439487421042f2225bed3af76=true
+      func_gl_gnulib_m4code_e7e881d32ca02f1c997b13c737c64bbd
+    fi
+  }
+  func_gl_gnulib_m4code_3f0e593033d1fc2c127581960f641b66 ()
+  {
+    if ! $gl_gnulib_enabled_3f0e593033d1fc2c127581960f641b66; then
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used without linking with libm" >&5
+printf %s "checking whether isnan(float) can be used without linking with libm... " >&6; }
+if test ${gl_cv_func_isnanf_no_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <math.h>
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+             # undef isnanf
+             # define isnanf(x) __builtin_isnan ((float)(x))
+             #elif defined isnan
+             # undef isnanf
+             # define isnanf(x) isnan ((float)(x))
+             #endif
+             float x;
+int
+main (void)
+{
+return isnanf (x);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_isnanf_no_libm=yes
+else $as_nop
+  gl_cv_func_isnanf_no_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_no_libm" >&5
+printf "%s\n" "$gl_cv_func_isnanf_no_libm" >&6; }
+
+  if test $gl_cv_func_isnanf_no_libm = yes; then
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) works" >&5
+printf %s "checking whether isnan(float) works... " >&6; }
+if test ${gl_cv_func_isnanf_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+           irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;;
+           mingw*) # Guess yes on mingw, no on MSVC.
+             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef __MINGW32__
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Known" >/dev/null 2>&1
+then :
+  gl_cv_func_isnanf_works="guessing yes"
+else $as_nop
+  gl_cv_func_isnanf_works="guessing no"
+fi
+rm -rf conftest*
+
+             ;;
+           *) gl_cv_func_isnanf_works="guessing yes" ;;
+         esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <math.h>
+#if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+# undef isnanf
+# define isnanf(x) __builtin_isnan ((float)(x))
+#elif defined isnan
+# undef isnanf
+# define isnanf(x) isnan ((float)(x))
+#endif
+/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0.  */
+#ifdef __DECC
+static float
+NaN ()
+{
+  static float zero = 0.0f;
+  return zero / zero;
+}
+#else
+# define NaN() (0.0f / 0.0f)
+#endif
+#define NWORDS \
+  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { unsigned int word[NWORDS]; float value; } memory_float;
+int main()
+{
+  int result = 0;
+
+  if (isnanf (1.0f / 0.0f))
+    result |= 1;
+
+  if (!isnanf (NaN ()))
+    result |= 2;
+
+#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
+  /* The isnanf function should be immune against changes in the sign bit and
+     in the mantissa bits.  The xor operation twiddles a bit that can only be
+     a sign bit or a mantissa bit.  */
+  if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0)
+    {
+      memory_float m;
+
+      m.value = NaN ();
+      /* Set the bits below the exponent to 01111...111.  */
+      m.word[0] &= -1U << FLT_EXPBIT0_BIT;
+      m.word[0] |= (1U << (FLT_EXPBIT0_BIT - 1)) - 1;
+      if (!isnanf (m.value))
+        result |= 4;
+    }
+#endif
+
+  return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_isnanf_works=yes
+else $as_nop
+  gl_cv_func_isnanf_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_works" >&5
+printf "%s\n" "$gl_cv_func_isnanf_works" >&6; }
+
+  fi
+  if test $gl_cv_func_isnanf_no_libm = yes \
+     && { case "$gl_cv_func_isnanf_works" in
+            *yes) true;;
+            *) false;;
+          esac
+        }; then
+    gl_func_isnanf_no_libm=yes
+
+printf "%s\n" "#define HAVE_ISNANF_IN_LIBC 1" >>confdefs.h
+
+  else
+    gl_func_isnanf_no_libm=no
+  fi
+
+      if test $gl_func_isnanf_no_libm != yes; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS isnanf.$ac_objext"
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5
+printf %s "checking where to find the exponent in a 'float'... " >&6; }
+if test ${gl_cv_cc_float_expbit0+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+      if test "$cross_compiling" = yes
+then :
+  gl_cv_cc_float_expbit0="word 0 bit 23"
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { float value; unsigned int word[NWORDS]; } memory_float;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (float x)
+{
+  memory_float m;
+  size_t i;
+  /* Clear it first, in case
+     sizeof (float) < sizeof (memory_float).  */
+  memset (&m, 0, sizeof (memory_float));
+  m.value = x;
+  for (i = 0; i < NWORDS; i++)
+    {
+      ored_words[i] |= m.word[i];
+      anded_words[i] &= m.word[i];
+    }
+}
+int main ()
+{
+  size_t j;
+  FILE *fp = fopen ("conftest.out", "w");
+  if (fp == NULL)
+    return 1;
+  for (j = 0; j < NWORDS; j++)
+    anded_words[j] = ~ (unsigned int) 0;
+  add_to_ored_words (0.25f);
+  add_to_ored_words (0.5f);
+  add_to_ored_words (1.0f);
+  add_to_ored_words (2.0f);
+  add_to_ored_words (4.0f);
+  /* Remove bits that are common (e.g. if representation of the first mantissa
+     bit is explicit).  */
+  for (j = 0; j < NWORDS; j++)
+    ored_words[j] &= ~anded_words[j];
+  /* Now find the nonzero word.  */
+  for (j = 0; j < NWORDS; j++)
+    if (ored_words[j] != 0)
+      break;
+  if (j < NWORDS)
+    {
+      size_t i;
+      for (i = j + 1; i < NWORDS; i++)
+        if (ored_words[i] != 0)
+          {
+            fprintf (fp, "unknown");
+            return (fclose (fp) != 0);
+          }
+      for (i = 0; ; i++)
+        if ((ored_words[j] >> i) & 1)
+          {
+            fprintf (fp, "word %d bit %d", (int) j, (int) i);
+            return (fclose (fp) != 0);
+          }
+    }
+  fprintf (fp, "unknown");
+  return (fclose (fp) != 0);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_cc_float_expbit0=`cat conftest.out`
+else $as_nop
+  gl_cv_cc_float_expbit0="unknown"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      rm -f conftest.out
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5
+printf "%s\n" "$gl_cv_cc_float_expbit0" >&6; }
+  case "$gl_cv_cc_float_expbit0" in
+    word*bit*)
+      word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+      bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'`
+
+printf "%s\n" "#define FLT_EXPBIT0_WORD $word" >>confdefs.h
+
+
+printf "%s\n" "#define FLT_EXPBIT0_BIT $bit" >>confdefs.h
+
+      ;;
+  esac
+
+
+      fi
+      gl_gnulib_enabled_3f0e593033d1fc2c127581960f641b66=true
+    fi
+  }
+  func_gl_gnulib_m4code_ldexp ()
+  {
+    if ! $gl_gnulib_enabled_ldexp; then
+
+
+  LDEXP_LIBM=
+  if test $gl_cv_func_ldexp_no_libm = no; then
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ldexp() can be used with libm" >&5
+printf %s "checking whether ldexp() can be used with libm... " >&6; }
+if test ${gl_cv_func_ldexp_in_libm+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+
+        save_LIBS="$LIBS"
+        LIBS="$LIBS -lm"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __NO_MATH_INLINES
+                             # define __NO_MATH_INLINES 1 /* for glibc */
+                             #endif
+                             #include <math.h>
+                             double (*funcptr) (double, int) = ldexp;
+                             double x;
+int
+main (void)
+{
+return ldexp (x, -1) > 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_func_ldexp_in_libm=yes
+else $as_nop
+  gl_cv_func_ldexp_in_libm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+        LIBS="$save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_in_libm" >&5
+printf "%s\n" "$gl_cv_func_ldexp_in_libm" >&6; }
+    if test $gl_cv_func_ldexp_in_libm = yes; then
+      LDEXP_LIBM=-lm
+    fi
+  fi
+
+
+      gl_gnulib_enabled_ldexp=true
+    fi
+  }
+  func_gl_gnulib_m4code_locale ()
+  {
+    if ! $gl_gnulib_enabled_locale; then
+
+
+
+
+
+
+      gl_gnulib_enabled_locale=true
+    fi
+  }
+  func_gl_gnulib_m4code_lstat ()
+  {
+    if ! $gl_gnulib_enabled_lstat; then
+
+
+
+
+  if test $ac_cv_func_lstat = yes; then
+
+    case $host_os,$gl_cv_func_lstat_dereferences_slashed_symlink in
+      solaris* | *no)
+        REPLACE_LSTAT=1
+        ;;
+    esac
+  else
+    HAVE_LSTAT=0
+  fi
+
+      if test $REPLACE_LSTAT = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS lstat.$ac_objext"
+
+        :
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_LSTAT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_LSTAT 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_lstat=true
+      if test $REPLACE_LSTAT = 1; then
+        func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_malloca ()
+  {
+    if ! $gl_gnulib_enabled_malloca; then
+
+
+
+      gl_gnulib_enabled_malloca=true
+    fi
+  }
+  func_gl_gnulib_m4code_memrchr ()
+  {
+    if ! $gl_gnulib_enabled_memrchr; then
+
+
+
+
+
+  if test $ac_cv_have_decl_memrchr = no; then
+    HAVE_DECL_MEMRCHR=0
+  fi
+
+  ac_fn_c_check_func "$LINENO" "memrchr" "ac_cv_func_memrchr"
+if test "x$ac_cv_func_memrchr" = xyes
+then :
+  printf "%s\n" "#define HAVE_MEMRCHR 1" >>confdefs.h
+
+fi
+
+
+      if test $ac_cv_func_memrchr = no; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS memrchr.$ac_objext"
+
+        :
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_MEMRCHR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MEMRCHR 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_memrchr=true
+    fi
+  }
+  func_gl_gnulib_m4code_openat ()
+  {
+    if ! $gl_gnulib_enabled_openat; then
+
+
+
+
+
+
+  case $ac_cv_func_openat+$gl_cv_func_lstat_dereferences_slashed_symlink+$gl_cv_macro_O_CLOEXEC in
+  yes+*yes+yes)
+    ;;
+  yes+*)
+    # Solaris 10 lacks O_CLOEXEC.
+    # Solaris 9 has *at functions, but uniformly mishandles trailing
+    # slash in all of them.
+    REPLACE_OPENAT=1
+    ;;
+  *)
+    HAVE_OPENAT=0
+    ;;
+  esac
+
+      if test $HAVE_OPENAT = 0 || test $REPLACE_OPENAT = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS openat.$ac_objext"
+
+
+
+  :
+
+      fi
+
+
+printf "%s\n" "#define GNULIB_OPENAT 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_OPENAT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_OPENAT 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_openat=true
+      if test $HAVE_OPENAT = 0; then
+        func_gl_gnulib_m4code_260941c0e5dc67ec9e87d1fb321c300b
+      fi
+      if test $HAVE_OPENAT = 0; then
+        func_gl_gnulib_m4code_fchdir
+      fi
+      if test $REPLACE_OPENAT = 1; then
+        func_gl_gnulib_m4code_fstat
+      fi
+      if test $HAVE_OPENAT = 0; then
+        func_gl_gnulib_m4code_1840129d490f3a00c8a098316d0fa345
+      fi
+      if test $HAVE_OPENAT = 0 || test $REPLACE_OPENAT = 1; then
+        func_gl_gnulib_m4code_03e0aaad4cb89ca757653bd367a6ccb7
+      fi
+      if test $HAVE_OPENAT = 0; then
+        func_gl_gnulib_m4code_d4850532688ba16d685f036076611f21
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_1840129d490f3a00c8a098316d0fa345 ()
+  {
+    if ! $gl_gnulib_enabled_1840129d490f3a00c8a098316d0fa345; then
+      gl_gnulib_enabled_1840129d490f3a00c8a098316d0fa345=true
+      func_gl_gnulib_m4code_03e0aaad4cb89ca757653bd367a6ccb7
+    fi
+  }
+  func_gl_gnulib_m4code_03e0aaad4cb89ca757653bd367a6ccb7 ()
+  {
+    if ! $gl_gnulib_enabled_03e0aaad4cb89ca757653bd367a6ccb7; then
+      gl_gnulib_enabled_03e0aaad4cb89ca757653bd367a6ccb7=true
+    fi
+  }
+  func_gl_gnulib_m4code_opendir ()
+  {
+    if ! $gl_gnulib_enabled_opendir; then
+
+
+
+  ac_fn_c_check_func "$LINENO" "opendir" "ac_cv_func_opendir"
+if test "x$ac_cv_func_opendir" = xyes
+then :
+  printf "%s\n" "#define HAVE_OPENDIR 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_opendir = no; then
+    HAVE_OPENDIR=0
+  fi
+
+
+
+
+  if test $ac_cv_func_fchdir = no; then
+    HAVE_FCHDIR=0
+  fi
+
+    if test $HAVE_FCHDIR = 0; then
+      if test $HAVE_OPENDIR = 1; then
+        REPLACE_OPENDIR=1
+      fi
+    fi
+
+      case $host_os,$HAVE_OPENDIR in
+    os2*,1)
+      REPLACE_OPENDIR=1;;
+  esac
+
+      if test $HAVE_OPENDIR = 0 || test $REPLACE_OPENDIR = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS opendir.$ac_objext"
+
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_OPENDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_OPENDIR 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_opendir=true
+      if test $HAVE_OPENDIR = 0 || test $REPLACE_OPENDIR = 1; then
+        func_gl_gnulib_m4code_closedir
+      fi
+      func_gl_gnulib_m4code_dirent
+      if test $HAVE_OPENDIR = 0 || test $REPLACE_OPENDIR = 1; then
+        func_gl_gnulib_m4code_dirfd
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_332607f759618fb73dfc3076748afea7 ()
+  {
+    if ! $gl_gnulib_enabled_332607f759618fb73dfc3076748afea7; then
+
+
+
+      if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS spawni.$ac_objext"
+
+
+  ac_fn_c_check_header_compile "$LINENO" "paths.h" "ac_cv_header_paths_h" "$ac_includes_default"
+if test "x$ac_cv_header_paths_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_PATHS_H 1" >>confdefs.h
+
+fi
+
+  ac_fn_c_check_func "$LINENO" "confstr" "ac_cv_func_confstr"
+if test "x$ac_cv_func_confstr" = xyes
+then :
+  printf "%s\n" "#define HAVE_CONFSTR 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "sched_setparam" "ac_cv_func_sched_setparam"
+if test "x$ac_cv_func_sched_setparam" = xyes
+then :
+  printf "%s\n" "#define HAVE_SCHED_SETPARAM 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "sched_setscheduler" "ac_cv_func_sched_setscheduler"
+if test "x$ac_cv_func_sched_setscheduler" = xyes
+then :
+  printf "%s\n" "#define HAVE_SCHED_SETSCHEDULER 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "setegid" "ac_cv_func_setegid"
+if test "x$ac_cv_func_setegid" = xyes
+then :
+  printf "%s\n" "#define HAVE_SETEGID 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "seteuid" "ac_cv_func_seteuid"
+if test "x$ac_cv_func_seteuid" = xyes
+then :
+  printf "%s\n" "#define HAVE_SETEUID 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "vfork" "ac_cv_func_vfork"
+if test "x$ac_cv_func_vfork" = xyes
+then :
+  printf "%s\n" "#define HAVE_VFORK 1" >>confdefs.h
+
+fi
+
+
+      fi
+      gl_gnulib_enabled_332607f759618fb73dfc3076748afea7=true
+      if test $HAVE_POSIX_SPAWN = 0; then
+        func_gl_gnulib_m4code_malloca
+      fi
+      func_gl_gnulib_m4code_cdeb0f2aaf9d280baa6526bfa1b07f70
+      func_gl_gnulib_m4code_strchrnul
+    fi
+  }
+  func_gl_gnulib_m4code_readdir ()
+  {
+    if ! $gl_gnulib_enabled_readdir; then
+
+
+
+  ac_fn_c_check_func "$LINENO" "readdir" "ac_cv_func_readdir"
+if test "x$ac_cv_func_readdir" = xyes
+then :
+  printf "%s\n" "#define HAVE_READDIR 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_readdir = no; then
+    HAVE_READDIR=0
+  fi
+
+      if test $HAVE_READDIR = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS readdir.$ac_objext"
+
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_READDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_READDIR 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_readdir=true
+      func_gl_gnulib_m4code_dirent
+    fi
+  }
+  func_gl_gnulib_m4code_rewinddir ()
+  {
+    if ! $gl_gnulib_enabled_rewinddir; then
+
+
+
+  ac_fn_c_check_func "$LINENO" "rewinddir" "ac_cv_func_rewinddir"
+if test "x$ac_cv_func_rewinddir" = xyes
+then :
+  printf "%s\n" "#define HAVE_REWINDDIR 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_rewinddir = no; then
+    HAVE_REWINDDIR=0
+  fi
+
+      if test $HAVE_REWINDDIR = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS rewinddir.$ac_objext"
+
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_REWINDDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_REWINDDIR 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_rewinddir=true
+      func_gl_gnulib_m4code_dirent
+    fi
+  }
+  func_gl_gnulib_m4code_rmdir ()
+  {
+    if ! $gl_gnulib_enabled_rmdir; then
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether rmdir works" >&5
+printf %s "checking whether rmdir works... " >&6; }
+if test ${gl_cv_func_rmdir_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  mkdir conftest.dir
+     touch conftest.file
+     if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+                           # Guess yes on Linux systems.
+          linux-* | linux) gl_cv_func_rmdir_works="guessing yes" ;;
+                           # Guess yes on glibc systems.
+          *-gnu* | gnu*)   gl_cv_func_rmdir_works="guessing yes" ;;
+                           # Guess no on native Windows.
+          mingw*)          gl_cv_func_rmdir_works="guessing no" ;;
+                           # If we don't know, obey --enable-cross-guesses.
+          *)               gl_cv_func_rmdir_works="$gl_cross_guess_normal" ;;
+        esac
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+           #include <errno.h>
+           #if HAVE_UNISTD_H
+           # include <unistd.h>
+           #else /* on Windows with MSVC */
+           # include <direct.h>
+           #endif
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+int result = 0;
+           if (!rmdir ("conftest.file/"))
+             result |= 1;
+           else if (errno != ENOTDIR)
+             result |= 2;
+           if (!rmdir ("conftest.dir/./"))
+             result |= 4;
+           return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_rmdir_works=yes
+else $as_nop
+  gl_cv_func_rmdir_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+     rm -rf conftest.dir conftest.file
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rmdir_works" >&5
+printf "%s\n" "$gl_cv_func_rmdir_works" >&6; }
+  case "$gl_cv_func_rmdir_works" in
+    *yes) ;;
+    *)
+      REPLACE_RMDIR=1
+      ;;
+  esac
+
+      if test $REPLACE_RMDIR = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS rmdir.$ac_objext"
+
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_RMDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_RMDIR 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_rmdir=true
+    fi
+  }
+  func_gl_gnulib_m4code_d4850532688ba16d685f036076611f21 ()
+  {
+    if ! $gl_gnulib_enabled_d4850532688ba16d685f036076611f21; then
+
+
+
+      gl_gnulib_enabled_d4850532688ba16d685f036076611f21=true
+      func_gl_gnulib_m4code_8198daae261b932d64a998f8586f5005
+      func_gl_gnulib_m4code_fchdir
+      func_gl_gnulib_m4code_3d094ef542bfdd238a5194e172bfe5f6
+    fi
+  }
+  func_gl_gnulib_m4code_e7e881d32ca02f1c997b13c737c64bbd ()
+  {
+    if ! $gl_gnulib_enabled_e7e881d32ca02f1c997b13c737c64bbd; then
+
+
+
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether setlocale (LC_ALL, NULL) is multithread-safe" >&5
+printf %s "checking whether setlocale (LC_ALL, NULL) is multithread-safe... " >&6; }
+if test ${gl_cv_func_setlocale_null_all_mtsafe+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case "$host_os" in
+       # Guess no on musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin.
+       *-musl* | darwin* | freebsd* | midnightbsd* | netbsd* | openbsd* | aix* | haiku* | cygwin*)
+         gl_cv_func_setlocale_null_all_mtsafe=no ;;
+       # Guess yes on glibc, HP-UX, IRIX, Solaris, native Windows.
+       *-gnu* | gnu* | hpux* | irix* | solaris* | mingw*)
+         gl_cv_func_setlocale_null_all_mtsafe=yes ;;
+       # If we don't know, obey --enable-cross-guesses.
+       *)
+         gl_cv_func_setlocale_null_all_mtsafe="$gl_cross_guess_normal" ;;
+     esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_all_mtsafe" >&5
+printf "%s\n" "$gl_cv_func_setlocale_null_all_mtsafe" >&6; }
+    case "$host_os" in
+    mingw*) ;;
+    *)
+      if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then
+        gl_cv_func_setlocale_null_all_mtsafe="trivially yes"
+      fi
+      ;;
+  esac
+  case "$gl_cv_func_setlocale_null_all_mtsafe" in
+    *yes) SETLOCALE_NULL_ALL_MTSAFE=1 ;;
+    *)    SETLOCALE_NULL_ALL_MTSAFE=0 ;;
+  esac
+
+printf "%s\n" "#define SETLOCALE_NULL_ALL_MTSAFE $SETLOCALE_NULL_ALL_MTSAFE" >>confdefs.h
+
+
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether setlocale (category, NULL) is multithread-safe" >&5
+printf %s "checking whether setlocale (category, NULL) is multithread-safe... " >&6; }
+if test ${gl_cv_func_setlocale_null_one_mtsafe+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case "$host_os" in
+       # Guess no on OpenBSD, AIX.
+       openbsd* | aix*)
+         gl_cv_func_setlocale_null_one_mtsafe=no ;;
+       # Guess yes on glibc, musl libc, macOS, FreeBSD, NetBSD, HP-UX, IRIX, Solaris, Haiku, Cygwin, native Windows.
+       *-gnu* | gnu* | *-musl* | darwin* | freebsd* | midnightbsd* | netbsd* | hpux* | irix* | solaris* | haiku* | cygwin* | mingw*)
+         gl_cv_func_setlocale_null_one_mtsafe=yes ;;
+       # If we don't know, obey --enable-cross-guesses.
+       *)
+         gl_cv_func_setlocale_null_one_mtsafe="$gl_cross_guess_normal" ;;
+     esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_one_mtsafe" >&5
+printf "%s\n" "$gl_cv_func_setlocale_null_one_mtsafe" >&6; }
+    case "$host_os" in
+    mingw*) ;;
+    *)
+      if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then
+        gl_cv_func_setlocale_null_one_mtsafe="trivially yes"
+      fi
+      ;;
+  esac
+  case "$gl_cv_func_setlocale_null_one_mtsafe" in
+    *yes) SETLOCALE_NULL_ONE_MTSAFE=1 ;;
+    *)    SETLOCALE_NULL_ONE_MTSAFE=0 ;;
+  esac
+
+printf "%s\n" "#define SETLOCALE_NULL_ONE_MTSAFE $SETLOCALE_NULL_ONE_MTSAFE" >>confdefs.h
+
+
+    if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then
+    case "$host_os" in
+      mingw*) LIB_SETLOCALE_NULL= ;;
+      *)
+
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5
+printf %s "checking whether imported symbols can be declared weak... " >&6; }
+if test ${gl_cv_have_weak+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case "$host_os" in
+       cygwin*)
+                                    gl_cv_have_weak="guessing no"
+         ;;
+       *)
+         gl_cv_have_weak=no
+                  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+extern void xyzzy ();
+#pragma weak xyzzy
+int
+main (void)
+{
+xyzzy();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+  gl_cv_have_weak=maybe
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+    conftest$ac_exeext conftest.$ac_ext
+         if test $gl_cv_have_weak = maybe; then
+                                 if test "$cross_compiling" = yes
+then :
+                              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __ELF__
+                 Extensible Linking Format
+                 #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Extensible Linking Format" >/dev/null 2>&1
+then :
+  gl_cv_have_weak="guessing yes"
+else $as_nop
+  gl_cv_have_weak="guessing no"
+fi
+rm -rf conftest*
+
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#pragma weak fputs
+int main ()
+{
+  return (fputs == NULL);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_have_weak=yes
+else $as_nop
+  gl_cv_have_weak=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+         fi
+         ;;
+     esac
+          case " $LDFLAGS " in
+       *" -static "*) gl_cv_have_weak=no ;;
+     esac
+                    case "$gl_cv_have_weak" in
+       *yes)
+         case "$host_os" in
+           freebsd* | dragonfly* | midnightbsd*)
+             : > conftest1.c
+             $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1
+             cat <<EOF > conftest2.c
+#include <pthread.h>
+#pragma weak pthread_mutexattr_gettype
+int main ()
+{
+  return (pthread_mutexattr_gettype != NULL);
+}
+EOF
+             $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \
+               || gl_cv_have_weak=no
+             rm -f conftest1.c libempty.so conftest2.c conftest
+             ;;
+         esac
+         ;;
+     esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5
+printf "%s\n" "$gl_cv_have_weak" >&6; }
+  case "$gl_cv_have_weak" in
+    *yes)
+
+printf "%s\n" "#define HAVE_WEAK_SYMBOLS 1" >>confdefs.h
+
+      ;;
+  esac
+
+        case "$gl_cv_have_weak" in
+          *yes) LIB_SETLOCALE_NULL= ;;
+          *)    LIB_SETLOCALE_NULL="$LIBPTHREAD" ;;
+        esac
+        ;;
+    esac
+  else
+    LIB_SETLOCALE_NULL=
+  fi
+
+
+      if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS setlocale-lock.$ac_objext"
+
+
+
+
+  CFLAG_VISIBILITY=
+  HAVE_VISIBILITY=0
+  if test -n "$GCC"; then
+                { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5
+printf %s "checking whether the -Werror option is usable... " >&6; }
+if test ${gl_cv_cc_vis_werror+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  gl_save_CFLAGS="$CFLAGS"
+       CFLAGS="$CFLAGS -Werror"
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_cc_vis_werror=yes
+else $as_nop
+  gl_cv_cc_vis_werror=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+       CFLAGS="$gl_save_CFLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_vis_werror" >&5
+printf "%s\n" "$gl_cv_cc_vis_werror" >&6; }
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5
+printf %s "checking for simple visibility declarations... " >&6; }
+if test ${gl_cv_cc_visibility+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  gl_save_CFLAGS="$CFLAGS"
+       CFLAGS="$CFLAGS -fvisibility=hidden"
+                                          if test $gl_cv_cc_vis_werror = yes; then
+         CFLAGS="$CFLAGS -Werror"
+       fi
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+              extern __attribute__((__visibility__("default"))) int exportedvar;
+              extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+              extern __attribute__((__visibility__("default"))) int exportedfunc (void);
+              void dummyfunc (void);
+              int hiddenvar;
+              int exportedvar;
+              int hiddenfunc (void) { return 51; }
+              int exportedfunc (void) { return 1225736919; }
+              void dummyfunc (void) {}
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  gl_cv_cc_visibility=yes
+else $as_nop
+  gl_cv_cc_visibility=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+       CFLAGS="$gl_save_CFLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_visibility" >&5
+printf "%s\n" "$gl_cv_cc_visibility" >&6; }
+    if test $gl_cv_cc_visibility = yes; then
+      CFLAG_VISIBILITY="-fvisibility=hidden"
+      HAVE_VISIBILITY=1
+    fi
+  fi
+
+
+
+printf "%s\n" "#define HAVE_VISIBILITY $HAVE_VISIBILITY" >>confdefs.h
+
+
+
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_SETLOCALE_NULL=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SETLOCALE_NULL 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_e7e881d32ca02f1c997b13c737c64bbd=true
+      func_gl_gnulib_m4code_locale
+    fi
+  }
+  func_gl_gnulib_m4code_cdeb0f2aaf9d280baa6526bfa1b07f70 ()
+  {
+    if ! $gl_gnulib_enabled_cdeb0f2aaf9d280baa6526bfa1b07f70; then
+
+
+
+      gl_gnulib_enabled_cdeb0f2aaf9d280baa6526bfa1b07f70=true
+    fi
+  }
+  func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c ()
+  {
+    if ! $gl_gnulib_enabled_0137e3d3638b33e5819d132d0b23165c; then
+
+
+
+
+  ac_fn_c_check_member "$LINENO" "struct stat" "st_atim.tv_nsec" "ac_cv_member_struct_stat_st_atim_tv_nsec" "#include <sys/types.h>
+     #include <sys/stat.h>
+"
+if test "x$ac_cv_member_struct_stat_st_atim_tv_nsec" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC 1" >>confdefs.h
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether struct stat.st_atim is of type struct timespec" >&5
+printf %s "checking whether struct stat.st_atim is of type struct timespec... " >&6; }
+if test ${ac_cv_typeof_struct_stat_st_atim_is_struct_timespec+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+            #include <sys/types.h>
+            #include <sys/stat.h>
+            #if HAVE_SYS_TIME_H
+            # include <sys/time.h>
+            #endif
+            #include <time.h>
+            struct timespec ts;
+            struct stat st;
+
+int
+main (void)
+{
+
+            st.st_atim = ts;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+  ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=yes
+else $as_nop
+  ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec" >&5
+printf "%s\n" "$ac_cv_typeof_struct_stat_st_atim_is_struct_timespec" >&6; }
+     if test $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec = yes; then
+
+printf "%s\n" "#define TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC 1" >>confdefs.h
+
+     fi
+else $as_nop
+  ac_fn_c_check_member "$LINENO" "struct stat" "st_atimespec.tv_nsec" "ac_cv_member_struct_stat_st_atimespec_tv_nsec" "#include <sys/types.h>
+        #include <sys/stat.h>
+"
+if test "x$ac_cv_member_struct_stat_st_atimespec_tv_nsec" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC 1" >>confdefs.h
+
+
+else $as_nop
+  ac_fn_c_check_member "$LINENO" "struct stat" "st_atimensec" "ac_cv_member_struct_stat_st_atimensec" "#include <sys/types.h>
+           #include <sys/stat.h>
+"
+if test "x$ac_cv_member_struct_stat_st_atimensec" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_STAT_ST_ATIMENSEC 1" >>confdefs.h
+
+
+else $as_nop
+  ac_fn_c_check_member "$LINENO" "struct stat" "st_atim.st__tim.tv_nsec" "ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec" "#include <sys/types.h>
+              #include <sys/stat.h>
+"
+if test "x$ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC 1" >>confdefs.h
+
+
+fi
+
+fi
+
+fi
+
+fi
+
+
+
+
+
+  ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimespec.tv_nsec" "ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" "#include <sys/types.h>
+     #include <sys/stat.h>
+"
+if test "x$ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC 1" >>confdefs.h
+
+
+else $as_nop
+  ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimensec" "ac_cv_member_struct_stat_st_birthtimensec" "#include <sys/types.h>
+        #include <sys/stat.h>
+"
+if test "x$ac_cv_member_struct_stat_st_birthtimensec" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC 1" >>confdefs.h
+
+
+else $as_nop
+  ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtim.tv_nsec" "ac_cv_member_struct_stat_st_birthtim_tv_nsec" "#include <sys/types.h>
+          #include <sys/stat.h>
+"
+if test "x$ac_cv_member_struct_stat_st_birthtim_tv_nsec" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC 1" >>confdefs.h
+
+
+fi
+
+fi
+
+fi
+
+
+      gl_gnulib_enabled_0137e3d3638b33e5819d132d0b23165c=true
+    fi
+  }
+  func_gl_gnulib_m4code_strchrnul ()
+  {
+    if ! $gl_gnulib_enabled_strchrnul; then
+
+
+
+
+  ac_fn_c_check_func "$LINENO" "strchrnul" "ac_cv_func_strchrnul"
+if test "x$ac_cv_func_strchrnul" = xyes
+then :
+  printf "%s\n" "#define HAVE_STRCHRNUL 1" >>confdefs.h
+
+fi
+
+  if test $ac_cv_func_strchrnul = no; then
+    HAVE_STRCHRNUL=0
+  else
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strchrnul works" >&5
+printf %s "checking whether strchrnul works... " >&6; }
+if test ${gl_cv_func_strchrnul_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#if defined __CYGWIN__
+ #include <cygwin/version.h>
+ #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 9)
+  Lucky user
+ #endif
+#else
+  Lucky user
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Lucky user" >/dev/null 2>&1
+then :
+  gl_cv_func_strchrnul_works="guessing yes"
+else $as_nop
+  gl_cv_func_strchrnul_works="guessing no"
+fi
+rm -rf conftest*
+
+
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <string.h> /* for strchrnul */
+
+int
+main (void)
+{
+const char *buf = "a";
+      return strchrnul (buf, 'b') != buf + 1;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  gl_cv_func_strchrnul_works=yes
+else $as_nop
+  gl_cv_func_strchrnul_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strchrnul_works" >&5
+printf "%s\n" "$gl_cv_func_strchrnul_works" >&6; }
+    case "$gl_cv_func_strchrnul_works" in
+      *yes) ;;
+      *) REPLACE_STRCHRNUL=1 ;;
+    esac
+  fi
+
+      if test $HAVE_STRCHRNUL = 0 || test $REPLACE_STRCHRNUL = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS strchrnul.$ac_objext"
+
+        :
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_STRCHRNUL=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRCHRNUL 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_strchrnul=true
+    fi
+  }
+  func_gl_gnulib_m4code_dbb57f49352be8fb86869629a254fb72 ()
+  {
+    if ! $gl_gnulib_enabled_dbb57f49352be8fb86869629a254fb72; then
+
+
+      if test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS strerror-override.$ac_objext"
+
+
+
+
+
+  if test $ac_cv_header_sys_socket_h != yes; then
+                    ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = xyes
+then :
+  printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h
+
+fi
+
+  fi
+  if test "$ac_cv_header_winsock2_h" = yes; then
+    HAVE_WINSOCK2_H=1
+    UNISTD_H_HAVE_WINSOCK2_H=1
+    SYS_IOCTL_H_HAVE_WINSOCK2_H=1
+  else
+    HAVE_WINSOCK2_H=0
+  fi
+
+
+      fi
+      gl_gnulib_enabled_dbb57f49352be8fb86869629a254fb72=true
+    fi
+  }
+  func_gl_gnulib_m4code_1f32594a85e6221ba15f884daeee8c2a ()
+  {
+    if ! $gl_gnulib_enabled_1f32594a85e6221ba15f884daeee8c2a; then
+
+
+
+
+
+  if test $ac_cv_have_decl_strerror_r = no; then
+    HAVE_DECL_STRERROR_R=0
+  fi
+
+  if test $ac_cv_func_strerror_r = yes; then
+    if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
+      if test $gl_cv_func_strerror_r_posix_signature = yes; then
+        case "$gl_cv_func_strerror_r_works" in
+                    *no) REPLACE_STRERROR_R=1 ;;
+        esac
+      else
+                REPLACE_STRERROR_R=1
+      fi
+    else
+                  REPLACE_STRERROR_R=1
+    fi
+  fi
+
+      if test $HAVE_DECL_STRERROR_R = 0 || test $REPLACE_STRERROR_R = 1
+then :
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS strerror_r.$ac_objext"
+
+
+
+
+
+
+
+
+fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_STRERROR_R=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRERROR_R 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define GNULIB_STRERROR_R_POSIX 1" >>confdefs.h
+
+
+      gl_gnulib_enabled_1f32594a85e6221ba15f884daeee8c2a=true
+      if test $HAVE_DECL_STRERROR_R = 0 || test $REPLACE_STRERROR_R = 1; then
+        func_gl_gnulib_m4code_dbb57f49352be8fb86869629a254fb72
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_strings ()
+  {
+    if ! $gl_gnulib_enabled_strings; then
+
+
+
+
+
+
+      gl_gnulib_enabled_strings=true
+    fi
+  }
+  func_gl_gnulib_m4code_strnlen ()
+  {
+    if ! $gl_gnulib_enabled_strnlen; then
+
+
+
+
+
+
+  if test $ac_cv_have_decl_strnlen = no; then
+    HAVE_DECL_STRNLEN=0
+  else
+
+         { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working strnlen" >&5
+printf %s "checking for working strnlen... " >&6; }
+if test ${ac_cv_func_strnlen_working+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  if test "$cross_compiling" = yes
+then :
+  # Guess no on AIX systems, yes otherwise.
+		case "$host_os" in
+		  aix*) ac_cv_func_strnlen_working=no;;
+		  *)    ac_cv_func_strnlen_working=yes;;
+		esac
+else $as_nop
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main (void)
+{
+
+#define S "foobar"
+#define S_LEN (sizeof S - 1)
+
+  /* At least one implementation is buggy: that of AIX 4.3 would
+     give strnlen (S, 1) == 3.  */
+
+  int i;
+  for (i = 0; i < S_LEN + 1; ++i)
+    {
+      int expected = i <= S_LEN ? i : S_LEN;
+      if (strnlen (S, i) != expected)
+	return 1;
+    }
+  return 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+  ac_cv_func_strnlen_working=yes
+else $as_nop
+  ac_cv_func_strnlen_working=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strnlen_working" >&5
+printf "%s\n" "$ac_cv_func_strnlen_working" >&6; }
+test $ac_cv_func_strnlen_working = no && :
+
+
+    if test $ac_cv_func_strnlen_working = no; then
+      REPLACE_STRNLEN=1
+    fi
+  fi
+
+      if test $HAVE_DECL_STRNLEN = 0 || test $REPLACE_STRNLEN = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS strnlen.$ac_objext"
+
+        :
+      fi
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_STRNLEN=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRNLEN 1" >>confdefs.h
+
+
+
+      gl_gnulib_enabled_strnlen=true
+    fi
+  }
+  func_gl_gnulib_m4code_ed5616be3593d355b981ffab56b9f37b ()
+  {
+    if ! $gl_gnulib_enabled_ed5616be3593d355b981ffab56b9f37b; then
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_cv_func_vfprintf_posix=no
+  case "$gl_cv_func_printf_sizes_c99" in
+    *yes)
+      case "$gl_cv_func_printf_long_double" in
+        *yes)
+          case "$gl_cv_func_printf_infinite" in
+            *yes)
+              case "$gl_cv_func_printf_infinite_long_double" in
+                *yes)
+                  case "$gl_cv_func_printf_directive_a" in
+                    *yes)
+                      case "$gl_cv_func_printf_directive_f" in
+                        *yes)
+                          case "$gl_cv_func_printf_directive_n" in
+                            *yes)
+                              case "$gl_cv_func_printf_directive_ls" in
+                                *yes)
+                                  case "$gl_cv_func_printf_positions" in
+                                    *yes)
+                                      case "$gl_cv_func_printf_flag_grouping" in
+                                        *yes)
+                                          case "$gl_cv_func_printf_flag_leftadjust" in
+                                            *yes)
+                                              case "$gl_cv_func_printf_flag_zero" in
+                                                *yes)
+                                                  case "$gl_cv_func_printf_precision" in
+                                                    *yes)
+                                                      case "$gl_cv_func_printf_enomem" in
+                                                        *yes)
+                                                          # vfprintf exists and is
+                                                          # already POSIX compliant.
+                                                          gl_cv_func_vfprintf_posix=yes
+                                                          ;;
+                                                      esac
+                                                      ;;
+                                                  esac
+                                                  ;;
+                                              esac
+                                              ;;
+                                          esac
+                                          ;;
+                                      esac
+                                      ;;
+                                  esac
+                                  ;;
+                              esac
+                              ;;
+                          esac
+                          ;;
+                      esac
+                      ;;
+                  esac
+                  ;;
+              esac
+              ;;
+          esac
+          ;;
+      esac
+      ;;
+  esac
+  if test $gl_cv_func_vfprintf_posix = no; then
+
+
+
+  case "$gl_cv_func_printf_infinite" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+  case "$gl_cv_func_printf_long_double" in
+    *yes)
+      case "$gl_cv_func_printf_infinite_long_double" in
+        *yes)
+          ;;
+        *)
+
+printf "%s\n" "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h
+
+          ;;
+      esac
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_a" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h
+
+      ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
+if test "x$ac_cv_func_nl_langinfo" = xyes
+then :
+  printf "%s\n" "#define HAVE_NL_LANGINFO 1" >>confdefs.h
+
+fi
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_f" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_directive_ls" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_grouping" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_leftadjust" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_flag_zero" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_precision" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+  case "$gl_cv_func_printf_enomem" in
+    *yes)
+      ;;
+    *)
+
+printf "%s\n" "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h
+
+
+printf "%s\n" "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h
+
+      ;;
+  esac
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
+
+  if test $ac_cv_func_vasnprintf = yes; then
+
+printf "%s\n" "#define REPLACE_VASNPRINTF 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+
+
+
+
+  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
+if test "x$ac_cv_type_ptrdiff_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define ptrdiff_t long" >>confdefs.h
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS vfprintf.$ac_objext"
+
+  REPLACE_VFPRINTF=1
+
+printf "%s\n" "#define REPLACE_VFPRINTF_POSIX 1" >>confdefs.h
+
+  :
+
+  fi
+
+
+
+
+
+
+
+
+
+
+          GL_GNULIB_VFPRINTF_POSIX=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_VFPRINTF_POSIX 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define GNULIB_VFPRINTF_POSIX 1" >>confdefs.h
+
+
+      gl_gnulib_enabled_ed5616be3593d355b981ffab56b9f37b=true
+      if test $REPLACE_VFPRINTF = 1; then
+        func_gl_gnulib_m4code_fseterr
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_503a4cb75d69c787103d0aa2ab7d8440 ()
+  {
+    if ! $gl_gnulib_enabled_503a4cb75d69c787103d0aa2ab7d8440; then
+
+      case "$host_os" in
+        mingw*)
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS windows-mutex.$ac_objext"
+
+          ;;
+      esac
+      gl_gnulib_enabled_503a4cb75d69c787103d0aa2ab7d8440=true
+    fi
+  }
+  func_gl_gnulib_m4code_68a4501daeca58988392c7e60b4917ab ()
+  {
+    if ! $gl_gnulib_enabled_68a4501daeca58988392c7e60b4917ab; then
+
+      case "$host_os" in
+        mingw*)
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS windows-once.$ac_objext"
+
+          ;;
+      esac
+      gl_gnulib_enabled_68a4501daeca58988392c7e60b4917ab=true
+    fi
+  }
+  func_gl_gnulib_m4code_f0efff84a70f4afba30902bb8ffe9354 ()
+  {
+    if ! $gl_gnulib_enabled_f0efff84a70f4afba30902bb8ffe9354; then
+
+      case "$host_os" in
+        mingw*)
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS windows-recmutex.$ac_objext"
+
+          ;;
+      esac
+      gl_gnulib_enabled_f0efff84a70f4afba30902bb8ffe9354=true
+    fi
+  }
+  func_gl_gnulib_m4code_8bb827fe37eaccf1b97feb0c87bc92ef ()
+  {
+    if ! $gl_gnulib_enabled_8bb827fe37eaccf1b97feb0c87bc92ef; then
+
+      case "$host_os" in
+        mingw*)
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS windows-rwlock.$ac_objext"
+
+          ;;
+      esac
+      gl_gnulib_enabled_8bb827fe37eaccf1b97feb0c87bc92ef=true
+    fi
+  }
+  func_gl_gnulib_m4code_48b2271240803e4879464b755748a89d ()
+  {
+    if ! $gl_gnulib_enabled_48b2271240803e4879464b755748a89d; then
+
+      case "$host_os" in
+        mingw*)
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS windows-tls.$ac_objext"
+
+          ;;
+      esac
+      gl_gnulib_enabled_48b2271240803e4879464b755748a89d=true
+      func_gl_gnulib_m4code_68a4501daeca58988392c7e60b4917ab
+    fi
+  }
+  if test $REPLACE_CLOSE = 1; then
+    func_gl_gnulib_m4code_43fe87a341d9b4b93c47c3ad819a5239
+  fi
+  if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then
+    func_gl_gnulib_m4code_getdtablesize
+  fi
+  if test $HAVE_FFSL = 0; then
+    func_gl_gnulib_m4code_ffs
+  fi
+  if test $REPLACE_FOPEN = 1; then
+    func_gl_gnulib_m4code_fstat
+  fi
+  if test $REPLACE_FPRINTF = 1; then
+    func_gl_gnulib_m4code_fseterr
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_closedir
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_75c65a2c014cf8235dd95289676302a4
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_fdopendir
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_fstat
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_fstatat
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_openat
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_opendir
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_readdir
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_rewinddir
+  fi
+  if { test $HAVE_DECL_LDEXPL = 0 || test $gl_func_ldexpl = no; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
+    func_gl_gnulib_m4code_ldexp
+  fi
+  if test $gl_threads_api = windows; then
+    func_gl_gnulib_m4code_503a4cb75d69c787103d0aa2ab7d8440
+  fi
+  if test $gl_threads_api = windows; then
+    func_gl_gnulib_m4code_68a4501daeca58988392c7e60b4917ab
+  fi
+  if test $gl_threads_api = windows; then
+    func_gl_gnulib_m4code_f0efff84a70f4afba30902bb8ffe9354
+  fi
+  if test $gl_threads_api = windows; then
+    func_gl_gnulib_m4code_8bb827fe37eaccf1b97feb0c87bc92ef
+  fi
+  if { test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; } && test $REPLACE_MBSTATE_T = 0; then
+    func_gl_gnulib_m4code_30838f5439487421042f2225bed3af76
+  fi
+  if test $REPLACE_OPEN = 1; then
+    func_gl_gnulib_m4code_fstat
+  fi
+  if test $REPLACE_PERROR = 1; then
+    func_gl_gnulib_m4code_dbb57f49352be8fb86869629a254fb72
+  fi
+  if test $REPLACE_PERROR = 1; then
+    func_gl_gnulib_m4code_1f32594a85e6221ba15f884daeee8c2a
+  fi
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+    func_gl_gnulib_m4code_332607f759618fb73dfc3076748afea7
+  fi
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = 1; then
+    func_gl_gnulib_m4code_getdtablesize
+  fi
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = 1; then
+    func_gl_gnulib_m4code_getdtablesize
+  fi
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = 1; then
+    func_gl_gnulib_m4code_getdtablesize
+  fi
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+    func_gl_gnulib_m4code_332607f759618fb73dfc3076748afea7
+  fi
+  if test $REPLACE_PRINTF = 1; then
+    func_gl_gnulib_m4code_ed5616be3593d355b981ffab56b9f37b
+  fi
+  if test "$gl_cv_lib_readline" = no; then
+    func_gl_gnulib_m4code_getline
+  fi
+  if test $REPLACE_RENAME = 1; then
+    func_gl_gnulib_m4code_chdir
+  fi
+  if test $REPLACE_RENAME = 1; then
+    func_gl_gnulib_m4code_lstat
+  fi
+  if test $REPLACE_RENAME = 1; then
+    func_gl_gnulib_m4code_rmdir
+  fi
+  if test $REPLACE_SIGNBIT = 1; then
+    func_gl_gnulib_m4code_3f0e593033d1fc2c127581960f641b66
+  fi
+  if test $REPLACE_STAT = 1; then
+    func_gl_gnulib_m4code_malloca
+  fi
+  if test $REPLACE_STAT = 1; then
+    func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c
+  fi
+  if test $REPLACE_STRERROR = 1; then
+    func_gl_gnulib_m4code_dbb57f49352be8fb86869629a254fb72
+  fi
+  if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then
+    func_gl_gnulib_m4code_strnlen
+  fi
+  if test $gl_threads_api = windows; then
+    func_gl_gnulib_m4code_48b2271240803e4879464b755748a89d
+  fi
+  if test $REPLACE_UNLINK = 1; then
+    func_gl_gnulib_m4code_lstat
+  fi
+
+   if $gl_gnulib_enabled_260941c0e5dc67ec9e87d1fb321c300b; then
+  gl_GNULIB_ENABLED_260941c0e5dc67ec9e87d1fb321c300b_TRUE=
+  gl_GNULIB_ENABLED_260941c0e5dc67ec9e87d1fb321c300b_FALSE='#'
+else
+  gl_GNULIB_ENABLED_260941c0e5dc67ec9e87d1fb321c300b_TRUE='#'
+  gl_GNULIB_ENABLED_260941c0e5dc67ec9e87d1fb321c300b_FALSE=
+fi
+
+   if $gl_gnulib_enabled_chdir; then
+  gl_GNULIB_ENABLED_chdir_TRUE=
+  gl_GNULIB_ENABLED_chdir_FALSE='#'
+else
+  gl_GNULIB_ENABLED_chdir_TRUE='#'
+  gl_GNULIB_ENABLED_chdir_FALSE=
+fi
+
+   if $gl_gnulib_enabled_8198daae261b932d64a998f8586f5005; then
+  gl_GNULIB_ENABLED_8198daae261b932d64a998f8586f5005_TRUE=
+  gl_GNULIB_ENABLED_8198daae261b932d64a998f8586f5005_FALSE='#'
+else
+  gl_GNULIB_ENABLED_8198daae261b932d64a998f8586f5005_TRUE='#'
+  gl_GNULIB_ENABLED_8198daae261b932d64a998f8586f5005_FALSE=
+fi
+
+   if $gl_gnulib_enabled_closedir; then
+  gl_GNULIB_ENABLED_closedir_TRUE=
+  gl_GNULIB_ENABLED_closedir_FALSE='#'
+else
+  gl_GNULIB_ENABLED_closedir_TRUE='#'
+  gl_GNULIB_ENABLED_closedir_FALSE=
+fi
+
+   if $gl_gnulib_enabled_75c65a2c014cf8235dd95289676302a4; then
+  gl_GNULIB_ENABLED_75c65a2c014cf8235dd95289676302a4_TRUE=
+  gl_GNULIB_ENABLED_75c65a2c014cf8235dd95289676302a4_FALSE='#'
+else
+  gl_GNULIB_ENABLED_75c65a2c014cf8235dd95289676302a4_TRUE='#'
+  gl_GNULIB_ENABLED_75c65a2c014cf8235dd95289676302a4_FALSE=
+fi
+
+   if $gl_gnulib_enabled_dirent; then
+  gl_GNULIB_ENABLED_dirent_TRUE=
+  gl_GNULIB_ENABLED_dirent_FALSE='#'
+else
+  gl_GNULIB_ENABLED_dirent_TRUE='#'
+  gl_GNULIB_ENABLED_dirent_FALSE=
+fi
+
+   if $gl_gnulib_enabled_dirfd; then
+  gl_GNULIB_ENABLED_dirfd_TRUE=
+  gl_GNULIB_ENABLED_dirfd_FALSE='#'
+else
+  gl_GNULIB_ENABLED_dirfd_TRUE='#'
+  gl_GNULIB_ENABLED_dirfd_FALSE=
+fi
+
+   if $gl_gnulib_enabled_dup; then
+  gl_GNULIB_ENABLED_dup_TRUE=
+  gl_GNULIB_ENABLED_dup_FALSE='#'
+else
+  gl_GNULIB_ENABLED_dup_TRUE='#'
+  gl_GNULIB_ENABLED_dup_FALSE=
+fi
+
+   if $gl_gnulib_enabled_fchdir; then
+  gl_GNULIB_ENABLED_fchdir_TRUE=
+  gl_GNULIB_ENABLED_fchdir_FALSE='#'
+else
+  gl_GNULIB_ENABLED_fchdir_TRUE='#'
+  gl_GNULIB_ENABLED_fchdir_FALSE=
+fi
+
+   if $gl_gnulib_enabled_43fe87a341d9b4b93c47c3ad819a5239; then
+  gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_TRUE=
+  gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_FALSE='#'
+else
+  gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_TRUE='#'
+  gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_FALSE=
+fi
+
+   if $gl_gnulib_enabled_fdopendir; then
+  gl_GNULIB_ENABLED_fdopendir_TRUE=
+  gl_GNULIB_ENABLED_fdopendir_FALSE='#'
+else
+  gl_GNULIB_ENABLED_fdopendir_TRUE='#'
+  gl_GNULIB_ENABLED_fdopendir_FALSE=
+fi
+
+   if $gl_gnulib_enabled_ffs; then
+  gl_GNULIB_ENABLED_ffs_TRUE=
+  gl_GNULIB_ENABLED_ffs_FALSE='#'
+else
+  gl_GNULIB_ENABLED_ffs_TRUE='#'
+  gl_GNULIB_ENABLED_ffs_FALSE=
+fi
+
+   if $gl_gnulib_enabled_fca9852db2a43bb33f02f0fbdbc174f6; then
+  gl_GNULIB_ENABLED_fca9852db2a43bb33f02f0fbdbc174f6_TRUE=
+  gl_GNULIB_ENABLED_fca9852db2a43bb33f02f0fbdbc174f6_FALSE='#'
+else
+  gl_GNULIB_ENABLED_fca9852db2a43bb33f02f0fbdbc174f6_TRUE='#'
+  gl_GNULIB_ENABLED_fca9852db2a43bb33f02f0fbdbc174f6_FALSE=
+fi
+
+   if $gl_gnulib_enabled_fseterr; then
+  gl_GNULIB_ENABLED_fseterr_TRUE=
+  gl_GNULIB_ENABLED_fseterr_FALSE='#'
+else
+  gl_GNULIB_ENABLED_fseterr_TRUE='#'
+  gl_GNULIB_ENABLED_fseterr_FALSE=
+fi
+
+   if $gl_gnulib_enabled_fstat; then
+  gl_GNULIB_ENABLED_fstat_TRUE=
+  gl_GNULIB_ENABLED_fstat_FALSE='#'
+else
+  gl_GNULIB_ENABLED_fstat_TRUE='#'
+  gl_GNULIB_ENABLED_fstat_FALSE=
+fi
+
+   if $gl_gnulib_enabled_fstatat; then
+  gl_GNULIB_ENABLED_fstatat_TRUE=
+  gl_GNULIB_ENABLED_fstatat_FALSE='#'
+else
+  gl_GNULIB_ENABLED_fstatat_TRUE='#'
+  gl_GNULIB_ENABLED_fstatat_FALSE=
+fi
+
+   if $gl_gnulib_enabled_3d094ef542bfdd238a5194e172bfe5f6; then
+  gl_GNULIB_ENABLED_3d094ef542bfdd238a5194e172bfe5f6_TRUE=
+  gl_GNULIB_ENABLED_3d094ef542bfdd238a5194e172bfe5f6_FALSE='#'
+else
+  gl_GNULIB_ENABLED_3d094ef542bfdd238a5194e172bfe5f6_TRUE='#'
+  gl_GNULIB_ENABLED_3d094ef542bfdd238a5194e172bfe5f6_FALSE=
+fi
+
+   if $gl_gnulib_enabled_getdelim; then
+  gl_GNULIB_ENABLED_getdelim_TRUE=
+  gl_GNULIB_ENABLED_getdelim_FALSE='#'
+else
+  gl_GNULIB_ENABLED_getdelim_TRUE='#'
+  gl_GNULIB_ENABLED_getdelim_FALSE=
+fi
+
+   if $gl_gnulib_enabled_getdtablesize; then
+  gl_GNULIB_ENABLED_getdtablesize_TRUE=
+  gl_GNULIB_ENABLED_getdtablesize_FALSE='#'
+else
+  gl_GNULIB_ENABLED_getdtablesize_TRUE='#'
+  gl_GNULIB_ENABLED_getdtablesize_FALSE=
+fi
+
+   if $gl_gnulib_enabled_getline; then
+  gl_GNULIB_ENABLED_getline_TRUE=
+  gl_GNULIB_ENABLED_getline_FALSE='#'
+else
+  gl_GNULIB_ENABLED_getline_TRUE='#'
+  gl_GNULIB_ENABLED_getline_FALSE=
+fi
+
+   if $gl_gnulib_enabled_30838f5439487421042f2225bed3af76; then
+  gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_TRUE=
+  gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_FALSE='#'
+else
+  gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_TRUE='#'
+  gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_FALSE=
+fi
+
+   if $gl_gnulib_enabled_3f0e593033d1fc2c127581960f641b66; then
+  gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_TRUE=
+  gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_FALSE='#'
+else
+  gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_TRUE='#'
+  gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_FALSE=
+fi
+
+   if $gl_gnulib_enabled_ldexp; then
+  gl_GNULIB_ENABLED_ldexp_TRUE=
+  gl_GNULIB_ENABLED_ldexp_FALSE='#'
+else
+  gl_GNULIB_ENABLED_ldexp_TRUE='#'
+  gl_GNULIB_ENABLED_ldexp_FALSE=
+fi
+
+   if $gl_gnulib_enabled_locale; then
+  gl_GNULIB_ENABLED_locale_TRUE=
+  gl_GNULIB_ENABLED_locale_FALSE='#'
+else
+  gl_GNULIB_ENABLED_locale_TRUE='#'
+  gl_GNULIB_ENABLED_locale_FALSE=
+fi
+
+   if $gl_gnulib_enabled_lstat; then
+  gl_GNULIB_ENABLED_lstat_TRUE=
+  gl_GNULIB_ENABLED_lstat_FALSE='#'
+else
+  gl_GNULIB_ENABLED_lstat_TRUE='#'
+  gl_GNULIB_ENABLED_lstat_FALSE=
+fi
+
+   if $gl_gnulib_enabled_malloca; then
+  gl_GNULIB_ENABLED_malloca_TRUE=
+  gl_GNULIB_ENABLED_malloca_FALSE='#'
+else
+  gl_GNULIB_ENABLED_malloca_TRUE='#'
+  gl_GNULIB_ENABLED_malloca_FALSE=
+fi
+
+   if $gl_gnulib_enabled_memrchr; then
+  gl_GNULIB_ENABLED_memrchr_TRUE=
+  gl_GNULIB_ENABLED_memrchr_FALSE='#'
+else
+  gl_GNULIB_ENABLED_memrchr_TRUE='#'
+  gl_GNULIB_ENABLED_memrchr_FALSE=
+fi
+
+   if $gl_gnulib_enabled_openat; then
+  gl_GNULIB_ENABLED_openat_TRUE=
+  gl_GNULIB_ENABLED_openat_FALSE='#'
+else
+  gl_GNULIB_ENABLED_openat_TRUE='#'
+  gl_GNULIB_ENABLED_openat_FALSE=
+fi
+
+   if $gl_gnulib_enabled_1840129d490f3a00c8a098316d0fa345; then
+  gl_GNULIB_ENABLED_1840129d490f3a00c8a098316d0fa345_TRUE=
+  gl_GNULIB_ENABLED_1840129d490f3a00c8a098316d0fa345_FALSE='#'
+else
+  gl_GNULIB_ENABLED_1840129d490f3a00c8a098316d0fa345_TRUE='#'
+  gl_GNULIB_ENABLED_1840129d490f3a00c8a098316d0fa345_FALSE=
+fi
+
+   if $gl_gnulib_enabled_03e0aaad4cb89ca757653bd367a6ccb7; then
+  gl_GNULIB_ENABLED_03e0aaad4cb89ca757653bd367a6ccb7_TRUE=
+  gl_GNULIB_ENABLED_03e0aaad4cb89ca757653bd367a6ccb7_FALSE='#'
+else
+  gl_GNULIB_ENABLED_03e0aaad4cb89ca757653bd367a6ccb7_TRUE='#'
+  gl_GNULIB_ENABLED_03e0aaad4cb89ca757653bd367a6ccb7_FALSE=
+fi
+
+   if $gl_gnulib_enabled_opendir; then
+  gl_GNULIB_ENABLED_opendir_TRUE=
+  gl_GNULIB_ENABLED_opendir_FALSE='#'
+else
+  gl_GNULIB_ENABLED_opendir_TRUE='#'
+  gl_GNULIB_ENABLED_opendir_FALSE=
+fi
+
+   if $gl_gnulib_enabled_332607f759618fb73dfc3076748afea7; then
+  gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_TRUE=
+  gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_FALSE='#'
+else
+  gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_TRUE='#'
+  gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_FALSE=
+fi
+
+   if $gl_gnulib_enabled_readdir; then
+  gl_GNULIB_ENABLED_readdir_TRUE=
+  gl_GNULIB_ENABLED_readdir_FALSE='#'
+else
+  gl_GNULIB_ENABLED_readdir_TRUE='#'
+  gl_GNULIB_ENABLED_readdir_FALSE=
+fi
+
+   if $gl_gnulib_enabled_rewinddir; then
+  gl_GNULIB_ENABLED_rewinddir_TRUE=
+  gl_GNULIB_ENABLED_rewinddir_FALSE='#'
+else
+  gl_GNULIB_ENABLED_rewinddir_TRUE='#'
+  gl_GNULIB_ENABLED_rewinddir_FALSE=
+fi
+
+   if $gl_gnulib_enabled_rmdir; then
+  gl_GNULIB_ENABLED_rmdir_TRUE=
+  gl_GNULIB_ENABLED_rmdir_FALSE='#'
+else
+  gl_GNULIB_ENABLED_rmdir_TRUE='#'
+  gl_GNULIB_ENABLED_rmdir_FALSE=
+fi
+
+   if $gl_gnulib_enabled_d4850532688ba16d685f036076611f21; then
+  gl_GNULIB_ENABLED_d4850532688ba16d685f036076611f21_TRUE=
+  gl_GNULIB_ENABLED_d4850532688ba16d685f036076611f21_FALSE='#'
+else
+  gl_GNULIB_ENABLED_d4850532688ba16d685f036076611f21_TRUE='#'
+  gl_GNULIB_ENABLED_d4850532688ba16d685f036076611f21_FALSE=
+fi
+
+   if $gl_gnulib_enabled_e7e881d32ca02f1c997b13c737c64bbd; then
+  gl_GNULIB_ENABLED_e7e881d32ca02f1c997b13c737c64bbd_TRUE=
+  gl_GNULIB_ENABLED_e7e881d32ca02f1c997b13c737c64bbd_FALSE='#'
+else
+  gl_GNULIB_ENABLED_e7e881d32ca02f1c997b13c737c64bbd_TRUE='#'
+  gl_GNULIB_ENABLED_e7e881d32ca02f1c997b13c737c64bbd_FALSE=
+fi
+
+   if $gl_gnulib_enabled_cdeb0f2aaf9d280baa6526bfa1b07f70; then
+  gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_TRUE=
+  gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_FALSE='#'
+else
+  gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_TRUE='#'
+  gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_FALSE=
+fi
+
+   if $gl_gnulib_enabled_0137e3d3638b33e5819d132d0b23165c; then
+  gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_TRUE=
+  gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_FALSE='#'
+else
+  gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_TRUE='#'
+  gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_FALSE=
+fi
+
+   if $gl_gnulib_enabled_strchrnul; then
+  gl_GNULIB_ENABLED_strchrnul_TRUE=
+  gl_GNULIB_ENABLED_strchrnul_FALSE='#'
+else
+  gl_GNULIB_ENABLED_strchrnul_TRUE='#'
+  gl_GNULIB_ENABLED_strchrnul_FALSE=
+fi
+
+   if $gl_gnulib_enabled_dbb57f49352be8fb86869629a254fb72; then
+  gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_TRUE=
+  gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_FALSE='#'
+else
+  gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_TRUE='#'
+  gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_FALSE=
+fi
+
+   if $gl_gnulib_enabled_1f32594a85e6221ba15f884daeee8c2a; then
+  gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_TRUE=
+  gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_FALSE='#'
+else
+  gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_TRUE='#'
+  gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_FALSE=
+fi
+
+   if $gl_gnulib_enabled_strings; then
+  gl_GNULIB_ENABLED_strings_TRUE=
+  gl_GNULIB_ENABLED_strings_FALSE='#'
+else
+  gl_GNULIB_ENABLED_strings_TRUE='#'
+  gl_GNULIB_ENABLED_strings_FALSE=
+fi
+
+   if $gl_gnulib_enabled_strnlen; then
+  gl_GNULIB_ENABLED_strnlen_TRUE=
+  gl_GNULIB_ENABLED_strnlen_FALSE='#'
+else
+  gl_GNULIB_ENABLED_strnlen_TRUE='#'
+  gl_GNULIB_ENABLED_strnlen_FALSE=
+fi
+
+   if $gl_gnulib_enabled_ed5616be3593d355b981ffab56b9f37b; then
+  gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_TRUE=
+  gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_FALSE='#'
+else
+  gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_TRUE='#'
+  gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_FALSE=
+fi
+
+   if $gl_gnulib_enabled_503a4cb75d69c787103d0aa2ab7d8440; then
+  gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_TRUE=
+  gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_FALSE='#'
+else
+  gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_TRUE='#'
+  gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_FALSE=
+fi
+
+   if $gl_gnulib_enabled_68a4501daeca58988392c7e60b4917ab; then
+  gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab_TRUE=
+  gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab_FALSE='#'
+else
+  gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab_TRUE='#'
+  gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab_FALSE=
+fi
+
+   if $gl_gnulib_enabled_f0efff84a70f4afba30902bb8ffe9354; then
+  gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354_TRUE=
+  gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354_FALSE='#'
+else
+  gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354_TRUE='#'
+  gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354_FALSE=
+fi
+
+   if $gl_gnulib_enabled_8bb827fe37eaccf1b97feb0c87bc92ef; then
+  gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef_TRUE=
+  gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef_FALSE='#'
+else
+  gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef_TRUE='#'
+  gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef_FALSE=
+fi
+
+   if $gl_gnulib_enabled_48b2271240803e4879464b755748a89d; then
+  gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d_TRUE=
+  gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d_FALSE='#'
+else
+  gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d_TRUE='#'
+  gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d_FALSE=
+fi
+
+  # End of code from modules
+
+
+
+
+
+
+
+
+
+
+
+  gltests_libdeps=
+  gltests_ltlibdeps=
+
+
+
+
+
+
+
+
+
+
+
+
+  gl_source_base='tests'
+  gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS
+
+  gl_module_indicator_condition=$gltests_WITNESS
+
+
+
+
+
+
+
+
+
+
+
+
+  LIBBISON_LIBDEPS="$gl_libdeps"
+
+  LIBBISON_LTLIBDEPS="$gl_ltlibdeps"
+
+
+
+# Checks for library functions.
+
+
+
+# Gettext.
+# We use gnulib, which is only guaranteed to work properly with the
+# latest Gettext.
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5
+printf %s "checking whether NLS is requested... " >&6; }
+    # Check whether --enable-nls was given.
+if test ${enable_nls+y}
+then :
+  enableval=$enable_nls; USE_NLS=$enableval
+else $as_nop
+  USE_NLS=yes
+fi
+
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
+printf "%s\n" "$USE_NLS" >&6; }
+
+
+
+
+      GETTEXT_MACRO_VERSION=0.19
+
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_MSGFMT+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case "$MSGFMT" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&5
+          if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 &&
+     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+            ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
+    ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test "$MSGFMT" != ":"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
+printf "%s\n" "$MSGFMT" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+  # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_GMSGFMT+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case $GMSGFMT in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+    ac_cv_path_GMSGFMT="$as_dir$ac_word$ac_exec_ext"
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+  ;;
+esac
+fi
+GMSGFMT=$ac_cv_path_GMSGFMT
+if test -n "$GMSGFMT"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
+printf "%s\n" "$GMSGFMT" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+
+    case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
+    *) MSGFMT_015=$MSGFMT ;;
+  esac
+
+  case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
+    *) GMSGFMT_015=$GMSGFMT ;;
+  esac
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_XGETTEXT+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case "$XGETTEXT" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&5
+          if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 &&
+     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+            ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+    ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
+printf "%s\n" "$XGETTEXT" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+    rm -f messages.po
+
+    case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
+    *) XGETTEXT_015=$XGETTEXT ;;
+  esac
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_MSGMERGE+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  case "$MSGMERGE" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&5
+          if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then
+            ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
+    ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test "$MSGMERGE" != ":"; then
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
+printf "%s\n" "$MSGMERGE" >&6; }
+else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+        test -n "$localedir" || localedir='${datadir}/locale'
+
+
+    test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+
+
+  ac_config_commands="$ac_config_commands po-directories"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5
+printf %s "checking for CFPreferencesCopyAppValue... " >&6; }
+if test ${gt_cv_func_CFPreferencesCopyAppValue+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   gt_save_LIBS="$LIBS"
      LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <CoreFoundation/CFPreferences.h>
 int
-main ()
+main (void)
 {
 CFPreferencesCopyAppValue(NULL, NULL)
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
   gt_cv_func_CFPreferencesCopyAppValue=yes
-else
+else $as_nop
   gt_cv_func_CFPreferencesCopyAppValue=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
      LIBS="$gt_save_LIBS"
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5
-$as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5
+printf "%s\n" "$gt_cv_func_CFPreferencesCopyAppValue" >&6; }
   if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
 
-$as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h
+printf "%s\n" "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h
 
   fi
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5
-$as_echo_n "checking for CFLocaleCopyCurrent... " >&6; }
-if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5
+printf %s "checking for CFLocaleCopyCurrent... " >&6; }
+if test ${gt_cv_func_CFLocaleCopyCurrent+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   gt_save_LIBS="$LIBS"
      LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <CoreFoundation/CFLocale.h>
 int
-main ()
+main (void)
 {
 CFLocaleCopyCurrent();
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
   gt_cv_func_CFLocaleCopyCurrent=yes
-else
+else $as_nop
   gt_cv_func_CFLocaleCopyCurrent=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
      LIBS="$gt_save_LIBS"
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5
-$as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5
+printf "%s\n" "$gt_cv_func_CFLocaleCopyCurrent" >&6; }
   if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
 
-$as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h
+printf "%s\n" "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h
 
   fi
   INTL_MACOSX_LIBS=
@@ -43565,11 +55598,12 @@
           gt_expression_test_code=
         fi
 
-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5
-$as_echo_n "checking for GNU gettext in libc... " >&6; }
-if eval \${$gt_func_gnugettext_libc+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5
+printf %s "checking for GNU gettext in libc... " >&6; }
+if eval test \${$gt_func_gnugettext_libc+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -43579,7 +55613,7 @@
 extern int *_nl_domain_bindings;
 
 int
-main ()
+main (void)
 {
 
 bindtextdomain ("", "");
@@ -43589,17 +55623,18 @@
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
   eval "$gt_func_gnugettext_libc=yes"
-else
+else $as_nop
   eval "$gt_func_gnugettext_libc=no"
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
 fi
 eval ac_res=\$$gt_func_gnugettext_libc
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
 
         if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
 
@@ -43632,11 +55667,12 @@
   done
 
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
-$as_echo_n "checking for iconv... " >&6; }
-if ${am_cv_func_iconv+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
+printf %s "checking for iconv... " >&6; }
+if test ${am_cv_func_iconv+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
     am_cv_func_iconv="no, consider installing GNU libiconv"
     am_cv_lib_iconv=no
@@ -43647,7 +55683,7 @@
 #include <iconv.h>
 
 int
-main ()
+main (void)
 {
 iconv_t cd = iconv_open("","");
            iconv(cd,NULL,NULL,NULL,NULL);
@@ -43656,10 +55692,11 @@
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
   am_cv_func_iconv=yes
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
     if test "$am_cv_func_iconv" != yes; then
       am_save_LIBS="$LIBS"
@@ -43671,7 +55708,7 @@
 #include <iconv.h>
 
 int
-main ()
+main (void)
 {
 iconv_t cd = iconv_open("","");
              iconv(cd,NULL,NULL,NULL,NULL);
@@ -43680,59 +55717,69 @@
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
   am_cv_lib_iconv=yes
         am_cv_func_iconv=yes
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
       LIBS="$am_save_LIBS"
     fi
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
-$as_echo "$am_cv_func_iconv" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
+printf "%s\n" "$am_cv_func_iconv" >&6; }
   if test "$am_cv_func_iconv" = yes; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5
-$as_echo_n "checking for working iconv... " >&6; }
-if ${am_cv_func_iconv_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5
+printf %s "checking for working iconv... " >&6; }
+if test ${am_cv_func_iconv_works+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
 
                   am_save_LIBS="$LIBS"
       if test $am_cv_lib_iconv = yes; then
         LIBS="$LIBS $LIBICONV"
       fi
-      if test "$cross_compiling" = yes; then :
-
-         case "$host_os" in
-           aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
-           *)            am_cv_func_iconv_works="guessing yes" ;;
-         esac
-
-else
+      am_cv_func_iconv_works=no
+      for ac_iconv_const in '' 'const'; do
+        if test "$cross_compiling" = yes
+then :
+  case "$host_os" in
+             aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+             *)            am_cv_func_iconv_works="guessing yes" ;;
+           esac
+else $as_nop
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 #include <iconv.h>
 #include <string.h>
-int main ()
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+
+int
+main (void)
 {
-  int result = 0;
-  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
-     returns.  */
+int result = 0;
+  /* Test against AIX 5.1...7.2 bug: Failures are not distinguishable from
+     successful returns.  This is even documented in
+     <https://www.ibm.com/support/knowledgecenter/ssw_aix_72/i_bostechref/iconv.html> */
   {
     iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
     if (cd_utf8_to_88591 != (iconv_t)(-1))
       {
-        static const char input[] = "\342\202\254"; /* EURO SIGN */
+        static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
         char buf[10];
-        const char *inptr = input;
+        ICONV_CONST char *inptr = input;
         size_t inbytesleft = strlen (input);
         char *outptr = buf;
         size_t outbytesleft = sizeof (buf);
         size_t res = iconv (cd_utf8_to_88591,
-                            (char **) &inptr, &inbytesleft,
+                            &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if (res == 0)
           result |= 1;
@@ -43745,14 +55792,14 @@
     iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
     if (cd_ascii_to_88591 != (iconv_t)(-1))
       {
-        static const char input[] = "\263";
+        static ICONV_CONST char input[] = "\263";
         char buf[10];
-        const char *inptr = input;
+        ICONV_CONST char *inptr = input;
         size_t inbytesleft = strlen (input);
         char *outptr = buf;
         size_t outbytesleft = sizeof (buf);
         size_t res = iconv (cd_ascii_to_88591,
-                            (char **) &inptr, &inbytesleft,
+                            &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if (res == 0)
           result |= 2;
@@ -43764,14 +55811,14 @@
     iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
     if (cd_88591_to_utf8 != (iconv_t)(-1))
       {
-        static const char input[] = "\304";
+        static ICONV_CONST char input[] = "\304";
         static char buf[2] = { (char)0xDE, (char)0xAD };
-        const char *inptr = input;
+        ICONV_CONST char *inptr = input;
         size_t inbytesleft = 1;
         char *outptr = buf;
         size_t outbytesleft = 1;
         size_t res = iconv (cd_88591_to_utf8,
-                            (char **) &inptr, &inbytesleft,
+                            &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
           result |= 4;
@@ -43784,14 +55831,14 @@
     iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
     if (cd_88591_to_utf8 != (iconv_t)(-1))
       {
-        static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+        static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
         char buf[50];
-        const char *inptr = input;
+        ICONV_CONST char *inptr = input;
         size_t inbytesleft = strlen (input);
         char *outptr = buf;
         size_t outbytesleft = sizeof (buf);
         size_t res = iconv (cd_88591_to_utf8,
-                            (char **) &inptr, &inbytesleft,
+                            &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if ((int)res > 0)
           result |= 8;
@@ -43801,32 +55848,48 @@
 #endif
   /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
      provided.  */
-  if (/* Try standardized names.  */
-      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
-      /* Try IRIX, OSF/1 names.  */
-      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
-      /* Try AIX names.  */
-      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
-      /* Try HP-UX names.  */
-      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
-    result |= 16;
+  {
+    /* Try standardized names.  */
+    iconv_t cd1 = iconv_open ("UTF-8", "EUC-JP");
+    /* Try IRIX, OSF/1 names.  */
+    iconv_t cd2 = iconv_open ("UTF-8", "eucJP");
+    /* Try AIX names.  */
+    iconv_t cd3 = iconv_open ("UTF-8", "IBM-eucJP");
+    /* Try HP-UX names.  */
+    iconv_t cd4 = iconv_open ("utf8", "eucJP");
+    if (cd1 == (iconv_t)(-1) && cd2 == (iconv_t)(-1)
+        && cd3 == (iconv_t)(-1) && cd4 == (iconv_t)(-1))
+      result |= 16;
+    if (cd1 != (iconv_t)(-1))
+      iconv_close (cd1);
+    if (cd2 != (iconv_t)(-1))
+      iconv_close (cd2);
+    if (cd3 != (iconv_t)(-1))
+      iconv_close (cd3);
+    if (cd4 != (iconv_t)(-1))
+      iconv_close (cd4);
+  }
   return result;
+
+  ;
+  return 0;
 }
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+if ac_fn_c_try_run "$LINENO"
+then :
   am_cv_func_iconv_works=yes
-else
-  am_cv_func_iconv_works=no
 fi
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
   conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
+        test "$am_cv_func_iconv_works" = no || break
+      done
       LIBS="$am_save_LIBS"
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5
-$as_echo "$am_cv_func_iconv_works" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5
+printf "%s\n" "$am_cv_func_iconv_works" >&6; }
     case "$am_cv_func_iconv_works" in
       *no) am_func_iconv=no am_cv_lib_iconv=no ;;
       *)   am_func_iconv=yes ;;
@@ -43836,14 +55899,14 @@
   fi
   if test "$am_func_iconv" = yes; then
 
-$as_echo "#define HAVE_ICONV 1" >>confdefs.h
+printf "%s\n" "#define HAVE_ICONV 1" >>confdefs.h
 
   fi
   if test "$am_cv_lib_iconv" = yes; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
-$as_echo_n "checking how to link with libiconv... " >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
-$as_echo "$LIBICONV" >&6; }
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
+printf %s "checking how to link with libiconv... " >&6; }
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
+printf "%s\n" "$LIBICONV" >&6; }
   else
             CPPFLAGS="$am_save_CPPFLAGS"
     LIBICONV=
@@ -43876,7 +55939,8 @@
 
 
 # Check whether --with-libintl-prefix was given.
-if test "${with_libintl_prefix+set}" = set; then :
+if test ${with_libintl_prefix+y}
+then :
   withval=$with_libintl_prefix;
     if test "X$withval" = "Xno"; then
       use_additional=no
@@ -44285,7 +56349,14 @@
                     fi
                     ;;
                   -l*)
-                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                                                                                                                                                                dep=`echo "X$dep" | sed -e 's/^X-l//'`
+                    if test "X$dep" != Xc \
+                       || case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) false ;;
+                            *)                          true ;;
+                          esac; then
+                      names_next_round="$names_next_round $dep"
+                    fi
                     ;;
                   *.la)
                                                                                 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
@@ -44336,11 +56407,12 @@
 
 
 
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5
-$as_echo_n "checking for GNU gettext in libintl... " >&6; }
-if eval \${$gt_func_gnugettext_libintl+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+          { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5
+printf %s "checking for GNU gettext in libintl... " >&6; }
+if eval test \${$gt_func_gnugettext_libintl+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   gt_save_CPPFLAGS="$CPPFLAGS"
             CPPFLAGS="$CPPFLAGS $INCINTL"
             gt_save_LIBS="$LIBS"
@@ -44358,7 +56430,7 @@
 const char *_nl_expand_alias (const char *);
 
 int
-main ()
+main (void)
 {
 
 bindtextdomain ("", "");
@@ -44368,12 +56440,13 @@
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
   eval "$gt_func_gnugettext_libintl=yes"
-else
+else $as_nop
   eval "$gt_func_gnugettext_libintl=no"
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
                         if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
               LIBS="$LIBS $LIBICONV"
@@ -44390,7 +56463,7 @@
 const char *_nl_expand_alias (const char *);
 
 int
-main ()
+main (void)
 {
 
 bindtextdomain ("", "");
@@ -44400,21 +56473,22 @@
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
   LIBINTL="$LIBINTL $LIBICONV"
                  LTLIBINTL="$LTLIBINTL $LTLIBICONV"
                  eval "$gt_func_gnugettext_libintl=yes"
 
 fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
     conftest$ac_exeext conftest.$ac_ext
             fi
             CPPFLAGS="$gt_save_CPPFLAGS"
             LIBS="$gt_save_LIBS"
 fi
 eval ac_res=\$$gt_func_gnugettext_libintl
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+	       { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
         fi
 
                                         if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
@@ -44441,20 +56515,20 @@
     if test "$gt_use_preinstalled_gnugettext" = "yes" \
        || test "$nls_cv_use_gnu_gettext" = "yes"; then
 
-$as_echo "#define ENABLE_NLS 1" >>confdefs.h
+printf "%s\n" "#define ENABLE_NLS 1" >>confdefs.h
 
     else
       USE_NLS=no
     fi
   fi
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5
-$as_echo_n "checking whether to use NLS... " >&6; }
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
-$as_echo "$USE_NLS" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5
+printf %s "checking whether to use NLS... " >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
+printf "%s\n" "$USE_NLS" >&6; }
   if test "$USE_NLS" = "yes"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5
-$as_echo_n "checking where the gettext function comes from... " >&6; }
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5
+printf %s "checking where the gettext function comes from... " >&6; }
     if test "$gt_use_preinstalled_gnugettext" = "yes"; then
       if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
         gt_source="external libintl"
@@ -44464,18 +56538,18 @@
     else
       gt_source="included intl directory"
     fi
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5
-$as_echo "$gt_source" >&6; }
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5
+printf "%s\n" "$gt_source" >&6; }
   fi
 
   if test "$USE_NLS" = "yes"; then
 
     if test "$gt_use_preinstalled_gnugettext" = "yes"; then
       if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5
-$as_echo_n "checking how to link with libintl... " >&6; }
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5
-$as_echo "$LIBINTL" >&6; }
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5
+printf %s "checking how to link with libintl... " >&6; }
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5
+printf "%s\n" "$LIBINTL" >&6; }
 
   for element in $INCINTL; do
     haveit=
@@ -44502,10 +56576,10 @@
       fi
 
 
-$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h
+printf "%s\n" "#define HAVE_GETTEXT 1" >>confdefs.h
 
 
-$as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h
+printf "%s\n" "#define HAVE_DCGETTEXT 1" >>confdefs.h
 
     fi
 
@@ -44543,7 +56617,7 @@
   fi
   if test $BISON_USE_NLS = yes; then
 
-$as_echo "#define YYENABLE_NLS 1" >>confdefs.h
+printf "%s\n" "#define YYENABLE_NLS 1" >>confdefs.h
 
   fi
 
@@ -44573,11 +56647,12 @@
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_VALGRIND+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_VALGRIND+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
   if test -n "$VALGRIND"; then
   ac_cv_prog_VALGRIND="$VALGRIND" # Let the user override the test.
 else
@@ -44585,11 +56660,15 @@
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
     ac_cv_prog_VALGRIND="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -44600,11 +56679,11 @@
 fi
 VALGRIND=$ac_cv_prog_VALGRIND
 if test -n "$VALGRIND"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VALGRIND" >&5
-$as_echo "$VALGRIND" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $VALGRIND" >&5
+printf "%s\n" "$VALGRIND" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
 fi
 
 
@@ -44626,10 +56705,10 @@
     fi
     ;;
 esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Valgrind suppression file" >&5
-$as_echo_n "checking Valgrind suppression file... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $suppfile" >&5
-$as_echo "$suppfile" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking Valgrind suppression file" >&5
+printf %s "checking Valgrind suppression file... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $suppfile" >&5
+printf "%s\n" "$suppfile" >&6; }
 
 # Whether we cannot run the compiled bison.
  if test "$cross_compiling" = yes; then
@@ -44641,6 +56720,19 @@
 fi
 
 
+# Build bistromathic if we have the lib and both readline/readline.h
+# and readline/history.h.
+ if test "$gl_cv_lib_readline" != no &&
+  test "$ac_cv_header_readline_readline_h" = yes &&
+  test "$ac_cv_header_readline_history_h" = yes; then
+  ENABLE_BISTROMATHIC_TRUE=
+  ENABLE_BISTROMATHIC_FALSE='#'
+else
+  ENABLE_BISTROMATHIC_TRUE='#'
+  ENABLE_BISTROMATHIC_FALSE=
+fi
+
+
 
 AUTOM4TE=${AUTOM4TE-"${am_missing_run}autom4te"}
 
@@ -44682,8 +56774,8 @@
     case $ac_val in #(
     *${as_nl}*)
       case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
       esac
       case $ac_var in #(
       _ | IFS | as_nl) ;; #(
@@ -44713,15 +56805,15 @@
      /^ac_cv_env_/b end
      t clear
      :clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
      t end
      s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
      :end' >>confcache
 if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
   if test -w "$cache_file"; then
     if test "x$cache_file" != "x/dev/null"; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
       if test ! -f "$cache_file" || test -h "$cache_file"; then
 	cat confcache >"$cache_file"
       else
@@ -44735,8 +56827,8 @@
       fi
     fi
   else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
   fi
 fi
 rm -f confcache
@@ -44753,7 +56845,7 @@
 for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
   # 1. Remove the extension, and $U if already installed.
   ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
   # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
   #    will be set to the directory where LIBOBJS objects are built.
   as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
@@ -44764,14 +56856,14 @@
 LTLIBOBJS=$ac_ltlibobjs
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
-$as_echo_n "checking that generated files are newer than configure... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+printf %s "checking that generated files are newer than configure... " >&6; }
    if test -n "$am_sleep_pid"; then
      # Hide warnings about reused PIDs.
      wait $am_sleep_pid 2>/dev/null
    fi
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
-$as_echo "done" >&6; }
+   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5
+printf "%s\n" "done" >&6; }
  if test -n "$EXEEXT"; then
   am__EXEEXT_TRUE=
   am__EXEEXT_FALSE='#'
@@ -44792,6 +56884,10 @@
   as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${GL_GENERATE_TEXTSTYLE_H_TRUE}" && test -z "${GL_GENERATE_TEXTSTYLE_H_FALSE}"; then
+  as_fn_error $? "conditional \"GL_GENERATE_TEXTSTYLE_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${ENABLE_CXX11_TRUE}" && test -z "${ENABLE_CXX11_FALSE}"; then
   as_fn_error $? "conditional \"ENABLE_CXX11\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -44847,6 +56943,18 @@
 fi
 
 
+if test -z "${GL_GENERATE_ICONV_H_TRUE}" && test -z "${GL_GENERATE_ICONV_H_FALSE}"; then
+  as_fn_error $? "conditional \"GL_GENERATE_ICONV_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_ICONV_H_TRUE}" && test -z "${GL_GENERATE_ICONV_H_FALSE}"; then
+  as_fn_error $? "conditional \"GL_GENERATE_ICONV_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_ICONV_H_TRUE}" && test -z "${GL_GENERATE_ICONV_H_FALSE}"; then
+  as_fn_error $? "conditional \"GL_GENERATE_ICONV_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then
   as_fn_error $? "conditional \"GL_GENERATE_LIMITS_H\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -44859,10 +56967,6 @@
   as_fn_error $? "conditional \"GL_GENERATE_STDINT_H\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${GL_GENERATE_TEXTSTYLE_H_TRUE}" && test -z "${GL_GENERATE_TEXTSTYLE_H_FALSE}"; then
-  as_fn_error $? "conditional \"GL_GENERATE_TEXTSTYLE_H\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
 CONFIG_INCLUDE=lib/config.h
 
 
@@ -44898,6 +57002,10 @@
   as_fn_error $? "conditional \"RELOCATABLE_VIA_WRAPPER\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${GL_GENERATE_STDALIGN_H_TRUE}" && test -z "${GL_GENERATE_STDALIGN_H_FALSE}"; then
+  as_fn_error $? "conditional \"GL_GENERATE_STDALIGN_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${GL_GENERATE_STDBOOL_H_TRUE}" && test -z "${GL_GENERATE_STDBOOL_H_FALSE}"; then
   as_fn_error $? "conditional \"GL_GENERATE_STDBOOL_H\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -44906,18 +57014,70 @@
   as_fn_error $? "conditional \"GL_GENERATE_STDDEF_H\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR_FALSE}"; then
+  as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_FALSE}"; then
+  as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE}"; then
   as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${gl_GNULIB_ENABLED_260941c0e5dc67ec9e87d1fb321c300b_TRUE}" && test -z "${gl_GNULIB_ENABLED_260941c0e5dc67ec9e87d1fb321c300b_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_260941c0e5dc67ec9e87d1fb321c300b\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${gl_GNULIB_ENABLED_chdir_TRUE}" && test -z "${gl_GNULIB_ENABLED_chdir_FALSE}"; then
   as_fn_error $? "conditional \"gl_GNULIB_ENABLED_chdir\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${gl_GNULIB_ENABLED_8198daae261b932d64a998f8586f5005_TRUE}" && test -z "${gl_GNULIB_ENABLED_8198daae261b932d64a998f8586f5005_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_8198daae261b932d64a998f8586f5005\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${gl_GNULIB_ENABLED_closedir_TRUE}" && test -z "${gl_GNULIB_ENABLED_closedir_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_closedir\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${gl_GNULIB_ENABLED_75c65a2c014cf8235dd95289676302a4_TRUE}" && test -z "${gl_GNULIB_ENABLED_75c65a2c014cf8235dd95289676302a4_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_75c65a2c014cf8235dd95289676302a4\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${gl_GNULIB_ENABLED_dirent_TRUE}" && test -z "${gl_GNULIB_ENABLED_dirent_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_dirent\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${gl_GNULIB_ENABLED_dirfd_TRUE}" && test -z "${gl_GNULIB_ENABLED_dirfd_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_dirfd\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${gl_GNULIB_ENABLED_dup_TRUE}" && test -z "${gl_GNULIB_ENABLED_dup_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_dup\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${gl_GNULIB_ENABLED_fchdir_TRUE}" && test -z "${gl_GNULIB_ENABLED_fchdir_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_fchdir\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_TRUE}" && test -z "${gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_FALSE}"; then
   as_fn_error $? "conditional \"gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${gl_GNULIB_ENABLED_fdopendir_TRUE}" && test -z "${gl_GNULIB_ENABLED_fdopendir_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_fdopendir\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${gl_GNULIB_ENABLED_ffs_TRUE}" && test -z "${gl_GNULIB_ENABLED_ffs_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_ffs\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${gl_GNULIB_ENABLED_fca9852db2a43bb33f02f0fbdbc174f6_TRUE}" && test -z "${gl_GNULIB_ENABLED_fca9852db2a43bb33f02f0fbdbc174f6_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_fca9852db2a43bb33f02f0fbdbc174f6\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${gl_GNULIB_ENABLED_fseterr_TRUE}" && test -z "${gl_GNULIB_ENABLED_fseterr_FALSE}"; then
   as_fn_error $? "conditional \"gl_GNULIB_ENABLED_fseterr\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -44926,10 +57086,26 @@
   as_fn_error $? "conditional \"gl_GNULIB_ENABLED_fstat\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${gl_GNULIB_ENABLED_fstatat_TRUE}" && test -z "${gl_GNULIB_ENABLED_fstatat_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_fstatat\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${gl_GNULIB_ENABLED_3d094ef542bfdd238a5194e172bfe5f6_TRUE}" && test -z "${gl_GNULIB_ENABLED_3d094ef542bfdd238a5194e172bfe5f6_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_3d094ef542bfdd238a5194e172bfe5f6\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${gl_GNULIB_ENABLED_getdelim_TRUE}" && test -z "${gl_GNULIB_ENABLED_getdelim_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_getdelim\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${gl_GNULIB_ENABLED_getdtablesize_TRUE}" && test -z "${gl_GNULIB_ENABLED_getdtablesize_FALSE}"; then
   as_fn_error $? "conditional \"gl_GNULIB_ENABLED_getdtablesize\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${gl_GNULIB_ENABLED_getline_TRUE}" && test -z "${gl_GNULIB_ENABLED_getline_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_getline\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_TRUE}" && test -z "${gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_FALSE}"; then
   as_fn_error $? "conditional \"gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -44942,12 +57118,8 @@
   as_fn_error $? "conditional \"gl_GNULIB_ENABLED_ldexp\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467_TRUE}" && test -z "${gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467_FALSE}"; then
-  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9_TRUE}" && test -z "${gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9_FALSE}"; then
-  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9\" was never defined.
+if test -z "${gl_GNULIB_ENABLED_locale_TRUE}" && test -z "${gl_GNULIB_ENABLED_locale_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_locale\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
 if test -z "${gl_GNULIB_ENABLED_lstat_TRUE}" && test -z "${gl_GNULIB_ENABLED_lstat_FALSE}"; then
@@ -44958,30 +57130,54 @@
   as_fn_error $? "conditional \"gl_GNULIB_ENABLED_malloca\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${gl_GNULIB_ENABLED_memrchr_TRUE}" && test -z "${gl_GNULIB_ENABLED_memrchr_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_memrchr\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${gl_GNULIB_ENABLED_openat_TRUE}" && test -z "${gl_GNULIB_ENABLED_openat_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_openat\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${gl_GNULIB_ENABLED_1840129d490f3a00c8a098316d0fa345_TRUE}" && test -z "${gl_GNULIB_ENABLED_1840129d490f3a00c8a098316d0fa345_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_1840129d490f3a00c8a098316d0fa345\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${gl_GNULIB_ENABLED_03e0aaad4cb89ca757653bd367a6ccb7_TRUE}" && test -z "${gl_GNULIB_ENABLED_03e0aaad4cb89ca757653bd367a6ccb7_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_03e0aaad4cb89ca757653bd367a6ccb7\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${gl_GNULIB_ENABLED_opendir_TRUE}" && test -z "${gl_GNULIB_ENABLED_opendir_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_opendir\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_TRUE}" && test -z "${gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_FALSE}"; then
   as_fn_error $? "conditional \"gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${gl_GNULIB_ENABLED_rawmemchr_TRUE}" && test -z "${gl_GNULIB_ENABLED_rawmemchr_FALSE}"; then
-  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_rawmemchr\" was never defined.
+if test -z "${gl_GNULIB_ENABLED_readdir_TRUE}" && test -z "${gl_GNULIB_ENABLED_readdir_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_readdir\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${gl_GNULIB_ENABLED_rewinddir_TRUE}" && test -z "${gl_GNULIB_ENABLED_rewinddir_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_rewinddir\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
 if test -z "${gl_GNULIB_ENABLED_rmdir_TRUE}" && test -z "${gl_GNULIB_ENABLED_rmdir_FALSE}"; then
   as_fn_error $? "conditional \"gl_GNULIB_ENABLED_rmdir\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62_TRUE}" && test -z "${gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62_FALSE}"; then
-  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62\" was never defined.
+if test -z "${gl_GNULIB_ENABLED_d4850532688ba16d685f036076611f21_TRUE}" && test -z "${gl_GNULIB_ENABLED_d4850532688ba16d685f036076611f21_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_d4850532688ba16d685f036076611f21\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${gl_GNULIB_ENABLED_e7e881d32ca02f1c997b13c737c64bbd_TRUE}" && test -z "${gl_GNULIB_ENABLED_e7e881d32ca02f1c997b13c737c64bbd_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_e7e881d32ca02f1c997b13c737c64bbd\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
 if test -z "${gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_TRUE}" && test -z "${gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_FALSE}"; then
   as_fn_error $? "conditional \"gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${gl_GNULIB_ENABLED_stat_TRUE}" && test -z "${gl_GNULIB_ENABLED_stat_FALSE}"; then
-  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_stat\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
 if test -z "${gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_TRUE}" && test -z "${gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_FALSE}"; then
   as_fn_error $? "conditional \"gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -44998,12 +57194,12 @@
   as_fn_error $? "conditional \"gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${gl_GNULIB_ENABLED_strnlen_TRUE}" && test -z "${gl_GNULIB_ENABLED_strnlen_FALSE}"; then
-  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_strnlen\" was never defined.
+if test -z "${gl_GNULIB_ENABLED_strings_TRUE}" && test -z "${gl_GNULIB_ENABLED_strings_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_strings\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${gl_GNULIB_ENABLED_sys_stat_TRUE}" && test -z "${gl_GNULIB_ENABLED_sys_stat_FALSE}"; then
-  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_sys_stat\" was never defined.
+if test -z "${gl_GNULIB_ENABLED_strnlen_TRUE}" && test -z "${gl_GNULIB_ENABLED_strnlen_FALSE}"; then
+  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_strnlen\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
 if test -z "${gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_TRUE}" && test -z "${gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_FALSE}"; then
@@ -45066,6 +57262,10 @@
   as_fn_error $? "conditional \"CROSS_COMPILING\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${ENABLE_BISTROMATHIC_TRUE}" && test -z "${ENABLE_BISTROMATHIC_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_BISTROMATHIC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 
   case $am__api_version in
     1.14*|1.15*) gl_LIBOBJS=`echo "$gl_LIBOBJS" | sed -e 's, lib/, lib/lib_libbison_a-,g'`;;
@@ -45077,8 +57277,8 @@
 ac_write_fail=0
 ac_clean_files_save=$ac_clean_files
 ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
 as_write_fail=0
 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
 #! $SHELL
@@ -45101,14 +57301,16 @@
 
 # Be more Bourne compatible
 DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
   emulate sh
   NULLCMD=:
   # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
-else
+else $as_nop
   case `(set -o) 2>/dev/null` in #(
   *posix*) :
     set -o posix ;; #(
@@ -45118,46 +57320,46 @@
 fi
 
 
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
 as_nl='
 '
 export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" ""	$as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh).  This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2)            ; then :; else exec 2>/dev/null; fi
 
 # The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
   PATH_SEPARATOR=:
   (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
     (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -45166,13 +57368,6 @@
 fi
 
 
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
 # Find who we are.  Look in the path if we contain no directory separator.
 as_myself=
 case $0 in #((
@@ -45181,8 +57376,12 @@
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  case $as_dir in #(((
+    '') as_dir=./ ;;
+    */) ;;
+    *) as_dir=$as_dir/ ;;
+  esac
+    test -r "$as_dir$0" && as_myself=$as_dir$0 && break
   done
 IFS=$as_save_IFS
 
@@ -45194,30 +57393,10 @@
   as_myself=$0
 fi
 if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
   exit 1
 fi
 
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
 
 # as_fn_error STATUS ERROR [LINENO LOG_FD]
@@ -45230,13 +57409,14 @@
   as_status=$1; test $as_status -eq 0 && as_status=1
   if test "$4"; then
     as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+    printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
   fi
-  $as_echo "$as_me: error: $2" >&2
+  printf "%s\n" "$as_me: error: $2" >&2
   as_fn_exit $as_status
 } # as_fn_error
 
 
+
 # as_fn_set_status STATUS
 # -----------------------
 # Set $? to STATUS, without forking.
@@ -45263,18 +57443,20 @@
   { eval $1=; unset $1;}
 }
 as_unset=as_fn_unset
+
 # as_fn_append VAR VALUE
 # ----------------------
 # Append the text in VALUE to the end of the definition contained in VAR. Take
 # advantage of any shell optimizations that allow amortized linear growth over
 # repeated appends, instead of the typical quadratic growth present in naive
 # implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
   eval 'as_fn_append ()
   {
     eval $1+=\$2
   }'
-else
+else $as_nop
   as_fn_append ()
   {
     eval $1=\$$1\$2
@@ -45286,12 +57468,13 @@
 # Perform arithmetic evaluation on the ARGs, and store the result in the
 # global $as_val. Take advantage of shells that can avoid forks. The arguments
 # must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
   eval 'as_fn_arith ()
   {
     as_val=$(( $* ))
   }'
-else
+else $as_nop
   as_fn_arith ()
   {
     as_val=`expr "$@" || test $? -eq 1`
@@ -45322,7 +57505,7 @@
 $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
 	 X"$0" : 'X\(//\)$' \| \
 	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
     sed '/^.*\/\([^/][^/]*\)\/*$/{
 	    s//\1/
 	    q
@@ -45344,6 +57527,10 @@
 as_cr_digits='0123456789'
 as_cr_alnum=$as_cr_Letters$as_cr_digits
 
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
 ECHO_C= ECHO_N= ECHO_T=
 case `echo -n x` in #(((((
 -n*)
@@ -45357,6 +57544,12 @@
   ECHO_N='-n';;
 esac
 
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n.  New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
 rm -f conf$$ conf$$.exe conf$$.file
 if test -d conf$$.dir; then
   rm -f conf$$.dir/conf$$.file
@@ -45398,7 +57591,7 @@
     as_dirs=
     while :; do
       case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
       *) as_qdir=$as_dir;;
       esac
       as_dirs="'$as_qdir' $as_dirs"
@@ -45407,7 +57600,7 @@
 	 X"$as_dir" : 'X\(//\)[^/]' \| \
 	 X"$as_dir" : 'X\(//\)$' \| \
 	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -45469,8 +57662,8 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by GNU Bison $as_me 3.5, which was
-generated by GNU Autoconf 2.69.  Invocation command line was
+This file was extended by GNU Bison $as_me 3.8.2, which was
+generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -45534,18 +57727,20 @@
 $config_commands
 
 Report bugs to <bug-bison@gnu.org>.
-GNU Bison home page: <http://www.gnu.org/software/bison/>.
-General help using GNU software: <http://www.gnu.org/gethelp/>."
+GNU Bison home page: <https://www.gnu.org/software/bison/>.
+General help using GNU software: <https://www.gnu.org/gethelp/>."
 
 _ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-GNU Bison config.status 3.5
-configured by $0, generated by GNU Autoconf 2.69,
+GNU Bison config.status 3.8.2
+configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
 
@@ -45585,15 +57780,15 @@
   -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
     ac_cs_recheck=: ;;
   --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
-    $as_echo "$ac_cs_version"; exit ;;
+    printf "%s\n" "$ac_cs_version"; exit ;;
   --config | --confi | --conf | --con | --co | --c )
-    $as_echo "$ac_cs_config"; exit ;;
+    printf "%s\n" "$ac_cs_config"; exit ;;
   --debug | --debu | --deb | --de | --d | -d )
     debug=: ;;
   --file | --fil | --fi | --f )
     $ac_shift
     case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
     '') as_fn_error $? "missing file argument" ;;
     esac
     as_fn_append CONFIG_FILES " '$ac_optarg'"
@@ -45601,7 +57796,7 @@
   --header | --heade | --head | --hea )
     $ac_shift
     case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
     esac
     as_fn_append CONFIG_HEADERS " '$ac_optarg'"
     ac_need_defaults=false;;
@@ -45610,7 +57805,7 @@
     as_fn_error $? "ambiguous option: \`$1'
 Try \`$0 --help' for more information.";;
   --help | --hel | -h )
-    $as_echo "$ac_cs_usage"; exit ;;
+    printf "%s\n" "$ac_cs_usage"; exit ;;
   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
   | -silent | --silent | --silen | --sile | --sil | --si | --s)
     ac_cs_silent=: ;;
@@ -45638,7 +57833,7 @@
 if \$ac_cs_recheck; then
   set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
   shift
-  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
   CONFIG_SHELL='$SHELL'
   export CONFIG_SHELL
   exec "\$@"
@@ -45652,7 +57847,7 @@
   sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
 ## Running $as_me. ##
 _ASBOX
-  $as_echo "$ac_log"
+  printf "%s\n" "$ac_log"
 } >&5
 
 _ACEOF
@@ -45669,6 +57864,7 @@
     # Capture the value of LINGUAS because we need it to compute CATALOGS.
     LINGUAS="${LINGUAS-%UNSET%}"
 
+ac_cv_exeext="$ac_cv_exeext"
 
 
 _ACEOF
@@ -45706,10 +57902,10 @@
 # We use the long form for the default assignment because of an extremely
 # bizarre bug on SunOS 4.1.3.
 if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-  test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+  test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
+  test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers
+  test ${CONFIG_LINKS+y} || CONFIG_LINKS=$config_links
+  test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands
 fi
 
 # Have a temporary directory for convenience.  Make it in the build tree
@@ -46079,7 +58275,7 @@
 	   esac ||
 	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
       esac
-      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
       as_fn_append ac_file_inputs " '$ac_f'"
     done
 
@@ -46087,17 +58283,17 @@
     # use $as_me), people would be surprised to read:
     #    /* config.h.  Generated by config.status.  */
     configure_input='Generated from '`
-	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	  printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
 	`' by configure.'
     if test x"$ac_file" != x-; then
       configure_input="$ac_file.  $configure_input"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
     fi
     # Neutralize special characters interpreted by sed in replacement strings.
     case $configure_input in #(
     *\&* | *\|* | *\\* )
-       ac_sed_conf_input=`$as_echo "$configure_input" |
+       ac_sed_conf_input=`printf "%s\n" "$configure_input" |
        sed 's/[\\\\&|]/\\\\&/g'`;; #(
     *) ac_sed_conf_input=$configure_input;;
     esac
@@ -46114,7 +58310,7 @@
 	 X"$ac_file" : 'X\(//\)[^/]' \| \
 	 X"$ac_file" : 'X\(//\)$' \| \
 	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
+printf "%s\n" X"$ac_file" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -46138,9 +58334,9 @@
 case "$ac_dir" in
 .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
 *)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
   # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
   case $ac_top_builddir_sub in
   "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
   *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -46202,8 +58398,8 @@
 case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
 *datarootdir*) ac_datarootdir_seen=yes;;
 *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
   ac_datarootdir_hack='
@@ -46252,9 +58448,9 @@
   { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
   { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
       "$ac_tmp/out"`; test -z "$ac_out"; } &&
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
 which seems to be undefined.  Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
 which seems to be undefined.  Please make sure it is defined" >&2;}
 
   rm -f "$ac_tmp/stdin"
@@ -46270,20 +58466,20 @@
   #
   if test x"$ac_file" != x-; then
     {
-      $as_echo "/* $configure_input  */" \
+      printf "%s\n" "/* $configure_input  */" >&1 \
       && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
     } >"$ac_tmp/config.h" \
       || as_fn_error $? "could not create $ac_file" "$LINENO" 5
     if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
-$as_echo "$as_me: $ac_file is unchanged" >&6;}
+      { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+printf "%s\n" "$as_me: $ac_file is unchanged" >&6;}
     else
       rm -f "$ac_file"
       mv "$ac_tmp/config.h" "$ac_file" \
 	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
     fi
   else
-    $as_echo "/* $configure_input  */" \
+    printf "%s\n" "/* $configure_input  */" >&1 \
       && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
       || as_fn_error $? "could not create -" "$LINENO" 5
   fi
@@ -46303,7 +58499,7 @@
 	 X"$_am_arg" : 'X\(//\)[^/]' \| \
 	 X"$_am_arg" : 'X\(//\)$' \| \
 	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$_am_arg" |
+printf "%s\n" X"$_am_arg" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -46335,8 +58531,8 @@
       ac_source=$srcdir/$ac_source
     fi
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5
-$as_echo "$as_me: linking $ac_source to $ac_file" >&6;}
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5
+printf "%s\n" "$as_me: linking $ac_source to $ac_file" >&6;}
 
     if test ! -r "$ac_source"; then
       as_fn_error $? "$ac_source: file not found" "$LINENO" 5
@@ -46354,8 +58550,8 @@
       as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5
   fi
  ;;
-  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
-$as_echo "$as_me: executing $ac_file commands" >&6;}
+  :C)  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+printf "%s\n" "$as_me: executing $ac_file commands" >&6;}
  ;;
   esac
 
@@ -46381,7 +58577,7 @@
   for am_mf
   do
     # Strip MF so we end up with the name of the file.
-    am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'`
+    am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'`
     # Check whether this is an Automake generated Makefile which includes
     # dependency-tracking related rules and includes.
     # Grep'ing the whole file directly is not great: AIX grep has a line
@@ -46393,7 +58589,7 @@
 	 X"$am_mf" : 'X\(//\)[^/]' \| \
 	 X"$am_mf" : 'X\(//\)$' \| \
 	 X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$am_mf" |
+printf "%s\n" X"$am_mf" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -46415,7 +58611,7 @@
 $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
 	 X"$am_mf" : 'X\(//\)$' \| \
 	 X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$am_mf" |
+printf "%s\n" X/"$am_mf" |
     sed '/^.*\/\([^/][^/]*\)\/*$/{
 	    s//\1/
 	    q
@@ -46440,10 +58636,12 @@
    (exit $ac_status); } || am_rc=$?
   done
   if test $am_rc -ne 0; then
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+    { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "Something went wrong bootstrapping makefile fragments
-    for automatic dependency tracking.  Try re-running configure with the
+    for automatic dependency tracking.  If GNU make was not used, consider
+    re-running the configure script with MAKE=\"gmake\" (or whatever is
+    necessary).  You can also try re-running configure with the
     '--disable-dependency-tracking' option to at least be able to build
     the package (albeit without support for automatic dependency tracking).
 See \`config.log' for more details" "$LINENO" 5; }
@@ -46574,7 +58772,7 @@
     "tests/atconfig":C) cat >tests/atconfig <<ATEOF
 # Configurable variable values for building test suites.
 # Generated by $0.
-# Copyright (C) 2012 Free Software Foundation, Inc.
+# Copyright (C) 2021 Free Software Foundation, Inc.
 
 # The test suite will define top_srcdir=$at_top_srcdir/../.. etc.
 at_testdir='tests'
@@ -46589,6 +58787,8 @@
 # Backward compatibility with Autotest <= 2.59b:
 at_top_builddir=\$at_top_build_prefix
 
+
+EXEEXT='$ac_cv_exeext'
 AUTOTEST_PATH='tests'
 
 SHELL=\${CONFIG_SHELL-'$SHELL'}
@@ -46629,7 +58829,8 @@
   $ac_cs_success || as_fn_exit 1
 fi
 if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
+
diff --git a/configure.ac b/configure.ac
index 7a80eac..7f6133e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,6 +1,6 @@
 # Configure template for GNU Bison.                   -*-Autoconf-*-
 #
-# Copyright (C) 2001-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2001-2015, 2018-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,31 +13,26 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
-# In order for some versions of Sun Studio to compile our C++ test cases
-# correctly, we need Autoconf 2.64 or better to handle the restrict
-# keyword in at least string.h from gnulib.  We need Autoconf 2.68 or
-# better to avoid a typo in the 'configure --help' entry for the YACC
-# environment variable.
-AC_PREREQ([2.68])
+AC_PREREQ([2.71])
 m4_pattern_forbid([^_?(gl_[A-Z]|AX_|BISON_)])
 m4_pattern_allow([^BISON_USE_NLS$])
 
 AC_INIT([GNU Bison],
         m4_esyscmd([build-aux/git-version-gen .tarball-version]),
-        [bug-bison@gnu.org])
-AC_SUBST([PACKAGE_COPYRIGHT_YEAR], [2019])
+        [bug-bison@gnu.org],
+        [],
+        [https://www.gnu.org/software/bison/])
+AC_SUBST([PACKAGE_COPYRIGHT_YEAR], [2021])
 AC_DEFINE_UNQUOTED([PACKAGE_COPYRIGHT_YEAR], [$PACKAGE_COPYRIGHT_YEAR],
                    [The copyright year for this package])
 
 AC_CONFIG_AUX_DIR([build-aux])
 AC_CONFIG_MACRO_DIR([m4])
 
-# We use Automake 1.14's %D% and %C%.
-#
 # When we move to Automake 1.16, simplify examples/c/reccalc/local.mk.
-# Our CI runs on Xenial, which has only Automake 1.15.
+# Our CI build the packages on Bionic, which has only Automake 1.15.
 #
 # We want gnits strictness only when rolling a stable release.  For
 # release candidates, we use version strings like 2.4.3_rc1, but gnits
@@ -45,7 +40,7 @@
 # releases, we want to be able run make dist without being required to
 # add a bogus NEWS entry.  In that case, the version string
 # automatically contains a dash, which we also let disable gnits.
-AM_INIT_AUTOMAKE([1.14 dist-xz nostdinc
+AM_INIT_AUTOMAKE([1.15 dist-lzip dist-xz nostdinc
                  color-tests parallel-tests
                  silent-rules]
                  m4_bmatch(m4_defn([AC_PACKAGE_VERSION]), [[-_]],
@@ -54,12 +49,15 @@
 AC_CONFIG_HEADERS([lib/config.h:lib/config.in.h])
 
 # Checks for the compiler.
-AC_PROG_CC_STDC
+AC_PROG_CC
 AC_PROG_CXX
 
 # Gnulib (early checks).
 gl_EARLY
 
+# We want ostream_printf and hyperlink support.
+gl_LIBTEXTSTYLE_OPTIONAL([0.20.5])
+
 # Gnulib uses '#pragma GCC diagnostic push' to silence some
 # warnings, but older gcc doesn't support this.
 AC_CACHE_CHECK([whether pragma GCC diagnostic push works],
@@ -81,7 +79,8 @@
 BISON_CXXSTD([11])
 BISON_CXXSTD([14])
 BISON_CXXSTD([17])
-BISON_CXXSTD([2a])
+BISON_CXXSTD([20])
+BISON_CXXSTD([2b])
 AM_CONDITIONAL([ENABLE_CXX11], [test x"$CXX11_CXXFLAGS" != x])
 AM_CONDITIONAL([ENABLE_CXX14], [test x"$CXX14_CXXFLAGS" != x])
 AC_LANG_POP([C++])
@@ -100,13 +99,44 @@
   # -Wno-tautological-constant-out-of-range-compare for Clang 3.3 and
   # 3.4 on GNU/Linux that choke on intprops.h's INT_MULTIPLY_WRAPV,
   # etc.
-  warn_common='-Wall -Wextra -Wcast-align
+  #
+  # ICC: -wr188
+  #
+  # 1669  warnings warnings_default =
+  # ../src/complain.c(318): error #188: enumerated type mixed with another type
+  # 1670      Wconflicts_sr | Wconflicts_rr | Wdeprecated | Wother;
+  # 1671      ^
+  # 1672
+  # 1673../src/complain.c(393): error #188: enumerated type mixed with another type
+  # 1674          warnings w = 1 << wbit;
+  # 1675                       ^
+  #
+  # ICC: -wr3179
+  #
+  # char const *usefulness
+  #   = rule_useless_in_grammar_p (&rules[r]) ? "useless-in-grammar"
+  #   : rule_useless_in_parser_p (&rules[r])  ? "useless-in-parser"
+  #   :                                         "useful";
+  #
+  # gives
+  #
+  # error #3179: deprecated conversion of string literal to char* (should be const char*)
+  #
+  # ICC: -wr2259 (that's in C, in spite of what the error messages which seems to be about C++).
+  # error #2259: non-pointer conversion from "int" to "yybool={signed char}" may lose significant bits
+  #   yybool yynormal YY_ATTRIBUTE_UNUSED = yystackp->yysplitPoint == YY_NULLPTR;
+  #                                         ^
+  warn_common='-Wall -Wextra
+    -Wcast-align -Wchar-subscripts
     -fparse-all-comments -Wdocumentation
-    -Wformat -Wimplicit-fallthrough -Wnull-dereference
+    -Wformat -Wimplicit-fallthrough -Wmismatched-dealloc -Wnull-dereference
     -Wno-sign-compare -Wno-tautological-constant-out-of-range-compare
-    -Wpointer-arith -Wshadow
-    -Wwrite-strings'
-  warn_c='-Wbad-function-cast -Wstrict-prototypes'
+    -Wpointer-arith -Wshadow -Wstrict-aliasing
+    -Wwrite-strings
+    -wr188 -wr2259 -wr3179'
+  warn_c='-Wbad-function-cast
+    -Wmissing-prototypes
+    -Wstrict-prototypes'
   warn_cxx='-Wextra-semi -Wnoexcept -Wold-style-cast -Wundefined-func-template
     -Wweak-vtables'
   # Warnings for the test suite only.
@@ -217,7 +247,7 @@
 
 
 AC_ARG_ENABLE([yacc],
-  [AC_HELP_STRING([--disable-yacc],
+  [AS_HELP_STRING([--disable-yacc],
      [do not build a yacc command or an -ly library])],
   , [enable_yacc=yes])
 AM_CONDITIONAL([ENABLE_YACC], [test "$enable_yacc" = yes])
@@ -230,9 +260,9 @@
   AC_MSG_WARN([bypassing lex because flex is required])
   LEX=:
 fi
-AM_CONDITIONAL([FLEX_WORKS], [$LEX_IS_FLEX])
+AM_CONDITIONAL([FLEX_WORKS], [$LEX_IS_FLEX && $FLEX_SUPPORTS_HEADER_OPT])
 AM_CONDITIONAL([FLEX_CXX_WORKS],
-  [$LEX_IS_FLEX && test $bison_cv_cxx_works = yes])
+  [$LEX_IS_FLEX && $FLEX_SUPPORTS_HEADER_OPT && test $bison_cv_cxx_works = yes])
 AC_PROG_YACC
 AC_PROG_RANLIB
 AC_PROG_GNU_M4
@@ -301,6 +331,13 @@
 # Whether we cannot run the compiled bison.
 AM_CONDITIONAL([CROSS_COMPILING], [test "$cross_compiling" = yes])
 
+# Build bistromathic if we have the lib and both readline/readline.h
+# and readline/history.h.
+AM_CONDITIONAL([ENABLE_BISTROMATHIC],
+[test "$gl_cv_lib_readline" != no &&
+  test "$ac_cv_header_readline_readline_h" = yes &&
+  test "$ac_cv_header_readline_history_h" = yes])
+
 AM_MISSING_PROG([AUTOM4TE], [autom4te])
 # Needed by tests/atlocal.in.
 AC_SUBST([GCC])
diff --git a/darwin-lib/Android.bp b/darwin-lib/Android.bp
index 5177747..6fd3085 100644
--- a/darwin-lib/Android.bp
+++ b/darwin-lib/Android.bp
@@ -25,7 +25,9 @@
                 "lib/c-strcasecmp.c",
                 "lib/c-strncasecmp.c",
                 "lib/canonicalize-lgpl.c",
+                "lib/canonicalize.c",
                 "lib/careadlinkat.c",
+                "lib/chdir-long.c",
                 "lib/cloexec.c",
                 "lib/close-stream.c",
                 "lib/closeout.c",
@@ -35,41 +37,67 @@
                 "lib/dup-safer-flag.c",
                 "lib/dup-safer.c",
                 "lib/error.c",
+                "lib/execute.c",
                 "lib/exitfail.c",
                 "lib/fatal-signal.c",
                 "lib/fd-safer-flag.c",
                 "lib/fd-safer.c",
+                "lib/file-set.c",
+                "lib/findprog-in.c",
                 "lib/fopen-safer.c",
+                "lib/fopen.c",
                 "lib/fpending.c",
                 "lib/fprintf.c",
+                "lib/free.c",
                 "lib/fseterr.c",
+                "lib/fstatat.c",
                 "lib/fstrcmp.c",
                 "lib/get-errno.c",
+                "lib/getcwd-lgpl.c",
+                "lib/getcwd.c",
                 "lib/gethrxtime.c",
                 "lib/getopt.c",
                 "lib/getopt1.c",
                 "lib/getprogname.c",
                 "lib/gettime.c",
                 "lib/gl_array_list.c",
+                "lib/gl_hash_map.c",
+                "lib/gl_linked_list.c",
                 "lib/gl_list.c",
+                "lib/gl_map.c",
+                "lib/gl_oset.c",
+                "lib/gl_rbtree_oset.c",
+                "lib/gl_rbtreehash_list.c",
                 "lib/gl_xlist.c",
+                "lib/gl_xmap.c",
                 "lib/glthread/lock.c",
                 "lib/glthread/threadlib.c",
                 "lib/glthread/tls.c",
+                "lib/hash-pjw.c",
+                "lib/hash-triple-simple.c",
                 "lib/hash.c",
-                "lib/isnand.c",
-                "lib/isnanf.c",
-                "lib/isnanl.c",
+                "lib/ialloc.c",
+                "lib/integer_length.c",
+                "lib/integer_length_l.c",
                 "lib/localcharset.c",
                 "lib/lstat.c",
+                "lib/malloc/scratch_buffer_dupfree.c",
+                "lib/malloc/scratch_buffer_grow.c",
+                "lib/malloc/scratch_buffer_grow_preserve.c",
+                "lib/malloc/scratch_buffer_set_array_size.c",
                 "lib/malloca.c",
                 "lib/math.c",
                 "lib/mbchar.c",
                 "lib/mbfile.c",
                 "lib/mbswidth.c",
+                "lib/mempcpy.c",
+                "lib/memrchr.c",
                 "lib/obstack.c",
                 "lib/obstack_printf.c",
                 "lib/open.c",
+                "lib/openat-die.c",
+                "lib/openat-proc.c",
+                "lib/openat.c",
                 "lib/path-join.c",
                 "lib/perror.c",
                 "lib/pipe-safer.c",
@@ -83,15 +111,33 @@
                 "lib/progname.c",
                 "lib/progreloc.c",
                 "lib/quotearg.c",
+                "lib/rawmemchr.c",
                 "lib/readlink.c",
+                "lib/reallocarray.c",
                 "lib/relocatable.c",
                 "lib/rename.c",
+                "lib/save-cwd.c",
                 "lib/sig-handler.c",
                 "lib/snprintf.c",
                 "lib/spawn-pipe.c",
+                "lib/spawn.c",
+                "lib/spawn_faction_addchdir.c",
+                "lib/spawn_faction_addclose.c",
+                "lib/spawn_faction_adddup2.c",
+                "lib/spawn_faction_addopen.c",
+                "lib/spawn_faction_destroy.c",
+                "lib/spawn_faction_init.c",
+                "lib/spawnattr_destroy.c",
+                "lib/spawnattr_init.c",
+                "lib/spawnattr_setflags.c",
+                "lib/spawnattr_setpgroup.c",
+                "lib/spawnattr_setsigmask.c",
+                "lib/spawni.c",
+                "lib/spawnp.c",
                 "lib/sprintf.c",
                 "lib/stat-time.c",
                 "lib/stat.c",
+                "lib/strchrnul.c",
                 "lib/strerror-override.c",
                 "lib/strerror.c",
                 "lib/strerror_r.c",
@@ -99,7 +145,11 @@
                 "lib/strverscmp.c",
                 "lib/timespec.c",
                 "lib/timevar.c",
+                "lib/unicodeio.c",
                 "lib/unistd.c",
+                "lib/unistr/u8-mbtoucr.c",
+                "lib/unistr/u8-uctomb-aux.c",
+                "lib/unistr/u8-uctomb.c",
                 "lib/uniwidth/width.c",
                 "lib/unlink.c",
                 "lib/vasnprintf.c",
@@ -136,22 +186,27 @@
                 "src/closure.c",
                 "src/complain.c",
                 "src/conflicts.c",
+                "src/counterexample.c",
+                "src/derivation.c",
                 "src/derives.c",
                 "src/files.c",
                 "src/fixits.c",
                 "src/getargs.c",
+                "src/glyphs.c",
                 "src/gram.c",
                 "src/graphviz.c",
                 "src/ielr.c",
                 "src/lalr.c",
                 "src/location.c",
                 "src/lr0.c",
+                "src/lssi.c",
                 "src/main.c",
                 "src/muscle-tab.c",
                 "src/named-ref.c",
                 "src/nullable.c",
                 "src/output.c",
                 "src/parse-gram.c",
+                "src/parse-simulation.c",
                 "src/print-graph.c",
                 "src/print-xml.c",
                 "src/print.c",
@@ -161,7 +216,9 @@
                 "src/scan-code-c.c",
                 "src/scan-gram-c.c",
                 "src/scan-skel-c.c",
+                "src/state-item.c",
                 "src/state.c",
+                "src/strversion.c",
                 "src/symlist.c",
                 "src/symtab.c",
                 "src/tables.c",
diff --git a/darwin-lib/alloca.h b/darwin-lib/alloca.h
index ec2c08e..181db57 100644
--- a/darwin-lib/alloca.h
+++ b/darwin-lib/alloca.h
@@ -1,23 +1,21 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Memory allocation on the stack.
 
-   Copyright (C) 1995, 1999, 2001-2004, 2006-2019 Free Software Foundation,
+   Copyright (C) 1995, 1999, 2001-2004, 2006-2021 Free Software Foundation,
    Inc.
 
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
-   License along with this program; if not, see
-   <https://www.gnu.org/licenses/>.
-  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
    means there is a real alloca function.  */
@@ -36,13 +34,16 @@
  */
 
 #ifndef alloca
-# ifdef __GNUC__
-   /* Some version of mingw have an <alloca.h> that causes trouble when
-      included after 'alloca' gets defined as a macro.  As a workaround, include
-      this <alloca.h> first and define 'alloca' as a macro afterwards.  */
-#  if (defined _WIN32 && ! defined __CYGWIN__) && 1
-#   include_next <alloca.h>
-#  endif
+  /* Some version of mingw have an <alloca.h> that causes trouble when
+     included after 'alloca' gets defined as a macro.  As a workaround,
+     include this <alloca.h> first and define 'alloca' as a macro afterwards
+     if needed.  */
+# if defined __GNUC__ && (defined _WIN32 && ! defined __CYGWIN__) && 1
+#  include_next <alloca.h>
+# endif
+#endif
+#ifndef alloca
+# if defined __GNUC__ || (__clang_major__ >= 4)
 #  define alloca __builtin_alloca
 # elif defined _AIX
 #  define alloca __alloca
diff --git a/darwin-lib/config.h b/darwin-lib/config.h
index 2f88cc2..1c11fba 100644
--- a/darwin-lib/config.h
+++ b/darwin-lib/config.h
@@ -23,17 +23,9 @@
    non-IEEE-754 'long double' values. */
 #define CHECK_PRINTF_SAFE 1
 
-/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
-   systems. This function is required for `alloca.c' support on those systems.
-   */
-/* #undef CRAY_STACKSEG_END */
-
-/* Define to 1 if using `alloca.c'. */
+/* Define to 1 if using 'alloca.c'. */
 /* #undef C_ALLOCA */
 
-/* Define to 1 if the C locale may have encoding errors. */
-/* #undef C_LOCALE_MAYBE_EILSEQ */
-
 /* Define as the bit index in the word where to find bit 0 of the exponent of
    'double'. */
 #define DBL_EXPBIT0_BIT 20
@@ -47,9 +39,22 @@
 /* Define as the word index where to find the sign of 'double'. */
 /* #undef DBL_SIGNBIT_WORD */
 
+/* the name of the file descriptor member of DIR */
+/* #undef DIR_FD_MEMBER_NAME */
+
+#ifdef DIR_FD_MEMBER_NAME
+# define DIR_TO_FD(Dir_p) ((Dir_p)->DIR_FD_MEMBER_NAME)
+#else
+# define DIR_TO_FD(Dir_p) -1
+#endif
+
+
 /* Define to 1 if // is a file system root distinct from /. */
 /* #undef DOUBLE_SLASH_IS_DISTINCT_ROOT */
 
+/* Define if struct dirent has a member d_ino that actually works. */
+#define D_INO_IN_DIRENT 1
+
 /* Define to 1 if translation of program messages to the user's native
    language is requested. */
 /* #undef ENABLE_NLS */
@@ -77,17 +82,22 @@
 /* #undef FOPEN_TRAILING_SLASH_BUG */
 
 /* Define to 1 if realpath() can malloc memory, always gives an absolute path,
-   and handles trailing slash correctly. */
-/* #undef FUNC_REALPATH_WORKS */
+   and handles a trailing slash correctly. */
+/* #undef FUNC_REALPATH_NEARLY_WORKS */
 
-/* Define if gettimeofday clobbers the localtime buffer. */
-/* #undef GETTIMEOFDAY_CLOBBERS_LOCALTIME */
+/* Define to 1 if realpath() can malloc memory, always gives an absolute path,
+   and handles leading slashes and a trailing slash correctly. */
+/* #undef FUNC_REALPATH_WORKS */
 
 /* Define this to 'void' or 'struct timezone' to match the system's
    declaration of the second argument to gettimeofday. */
 #define GETTIMEOFDAY_TIMEZONE void
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module canonicalize shall be considered present. */
+#define GNULIB_CANONICALIZE 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module canonicalize-lgpl shall be considered present. */
 #define GNULIB_CANONICALIZE_LGPL 1
 
@@ -100,10 +110,18 @@
 #define GNULIB_DIRNAME 1
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module fdopendir shall be considered present. */
+#define GNULIB_FDOPENDIR 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module fd-safer-flag shall be considered present. */
 #define GNULIB_FD_SAFER_FLAG 1
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module fopen-gnu shall be considered present. */
+#define GNULIB_FOPEN_GNU 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module fopen-safer shall be considered present. */
 #define GNULIB_FOPEN_SAFER 1
 
@@ -112,18 +130,22 @@
 #define GNULIB_FSCANF 1
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module getcwd shall be considered present. */
+#define GNULIB_GETCWD 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module lock shall be considered present. */
 #define GNULIB_LOCK 1
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
-   whether the gnulib module malloc-gnu shall be considered present. */
-#define GNULIB_MALLOC_GNU 1
-
-/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module msvc-nothrow shall be considered present. */
 #define GNULIB_MSVC_NOTHROW 1
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module openat shall be considered present. */
+#define GNULIB_OPENAT 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module pipe2-safer shall be considered present. */
 #define GNULIB_PIPE2_SAFER 1
 
@@ -132,6 +154,10 @@
 /* #undef GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU */
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module reallocarray shall be considered present. */
+#define GNULIB_REALLOCARRAY 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module scanf shall be considered present. */
 #define GNULIB_SCANF 1
 
@@ -139,6 +165,14 @@
    whether the gnulib module snprintf shall be considered present. */
 #define GNULIB_SNPRINTF 1
 
+/* Define to 1 if you want the FILE stream functions getc, putc, etc. to use
+   unlocked I/O if available, throughout the package. Unlocked I/O can improve
+   performance, sometimes dramatically. But unlocked I/O is safe only in
+   single-threaded programs, as well as in multithreaded programs for which
+   you can guarantee that every FILE stream, including stdin, stdout, stderr,
+   is used only in a single thread. */
+#define GNULIB_STDIO_SINGLE_THREAD 1
+
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module strerror shall be considered present. */
 #define GNULIB_STRERROR 1
@@ -147,9 +181,15 @@
    whether the gnulib module strerror_r-posix shall be considered present. */
 #define GNULIB_STRERROR_R_POSIX 1
 
+/* Define to 1 when the gnulib module access should be tested. */
+#define GNULIB_TEST_ACCESS 1
+
 /* Define to 1 when the gnulib module calloc-posix should be tested. */
 #define GNULIB_TEST_CALLOC_POSIX 1
 
+/* Define to 1 when the gnulib module canonicalize should be tested. */
+#define GNULIB_TEST_CANONICALIZE 1
+
 /* Define to 1 when the gnulib module canonicalize_file_name should be tested.
    */
 #define GNULIB_TEST_CANONICALIZE_FILE_NAME 1
@@ -163,35 +203,101 @@
 /* Define to 1 when the gnulib module close should be tested. */
 #define GNULIB_TEST_CLOSE 1
 
+/* Define to 1 when the gnulib module closedir should be tested. */
+#define GNULIB_TEST_CLOSEDIR 1
+
+/* Define to 1 when the gnulib module dirfd should be tested. */
+/* #undef GNULIB_TEST_DIRFD */
+
+/* Define to 1 when the gnulib module dup should be tested. */
+/* #undef GNULIB_TEST_DUP */
+
 /* Define to 1 when the gnulib module dup2 should be tested. */
 #define GNULIB_TEST_DUP2 1
 
 /* Define to 1 when the gnulib module environ should be tested. */
 #define GNULIB_TEST_ENVIRON 1
 
+/* Define to 1 when the gnulib module fchdir should be tested. */
+#define GNULIB_TEST_FCHDIR 1
+
 /* Define to 1 when the gnulib module fcntl should be tested. */
 #define GNULIB_TEST_FCNTL 1
 
+/* Define to 1 when the gnulib module fdopendir should be tested. */
+#define GNULIB_TEST_FDOPENDIR 1
+
+/* Define to 1 when the gnulib module ffsl should be tested. */
+#define GNULIB_TEST_FFSL 1
+
+/* Define to 1 when the gnulib module fgetc should be tested. */
+#define GNULIB_TEST_FGETC 1
+
+/* Define to 1 when the gnulib module fgets should be tested. */
+#define GNULIB_TEST_FGETS 1
+
 /* Define to 1 when the gnulib module fopen should be tested. */
 #define GNULIB_TEST_FOPEN 1
 
+/* Define to 1 when the gnulib module fprintf should be tested. */
+#define GNULIB_TEST_FPRINTF 1
+
 /* Define to 1 when the gnulib module fprintf-posix should be tested. */
 #define GNULIB_TEST_FPRINTF_POSIX 1
 
+/* Define to 1 when the gnulib module fputc should be tested. */
+#define GNULIB_TEST_FPUTC 1
+
+/* Define to 1 when the gnulib module fputs should be tested. */
+#define GNULIB_TEST_FPUTS 1
+
+/* Define to 1 when the gnulib module fread should be tested. */
+#define GNULIB_TEST_FREAD 1
+
+/* Define to 1 when the gnulib module free-posix should be tested. */
+#define GNULIB_TEST_FREE_POSIX 1
+
 /* Define to 1 when the gnulib module frexp should be tested. */
 #define GNULIB_TEST_FREXP 1
 
 /* Define to 1 when the gnulib module frexpl should be tested. */
 #define GNULIB_TEST_FREXPL 1
 
+/* Define to 1 when the gnulib module fscanf should be tested. */
+#define GNULIB_TEST_FSCANF 1
+
 /* Define to 1 when the gnulib module fstat should be tested. */
 #define GNULIB_TEST_FSTAT 1
 
+/* Define to 1 when the gnulib module fstatat should be tested. */
+#define GNULIB_TEST_FSTATAT 1
+
 /* Define to 1 when the gnulib module fsync should be tested. */
 #define GNULIB_TEST_FSYNC 1
 
+/* Define to 1 when the gnulib module fwrite should be tested. */
+#define GNULIB_TEST_FWRITE 1
+
+/* Define to 1 when the gnulib module getc should be tested. */
+#define GNULIB_TEST_GETC 1
+
+/* Define to 1 when the gnulib module getchar should be tested. */
+#define GNULIB_TEST_GETCHAR 1
+
+/* Define to 1 when the gnulib module getcwd should be tested. */
+#define GNULIB_TEST_GETCWD 1
+
+/* Define to 1 when the gnulib module getdelim should be tested. */
+/* #undef GNULIB_TEST_GETDELIM */
+
 /* Define to 1 when the gnulib module getdtablesize should be tested. */
-/* #undef GNULIB_TEST_GETDTABLESIZE */
+#define GNULIB_TEST_GETDTABLESIZE 1
+
+/* Define to 1 when the gnulib module getline should be tested. */
+/* #undef GNULIB_TEST_GETLINE */
+
+/* Define to 1 when the gnulib module getopt-posix should be tested. */
+#define GNULIB_TEST_GETOPT_POSIX 1
 
 /* Define to 1 when the gnulib module getrusage should be tested. */
 #define GNULIB_TEST_GETRUSAGE 1
@@ -214,6 +320,12 @@
 /* Define to 1 when the gnulib module iswblank should be tested. */
 #define GNULIB_TEST_ISWBLANK 1
 
+/* Define to 1 when the gnulib module iswdigit should be tested. */
+#define GNULIB_TEST_ISWDIGIT 1
+
+/* Define to 1 when the gnulib module iswxdigit should be tested. */
+#define GNULIB_TEST_ISWXDIGIT 1
+
 /* Define to 1 when the gnulib module ldexpl should be tested. */
 #define GNULIB_TEST_LDEXPL 1
 
@@ -232,18 +344,36 @@
 /* Define to 1 when the gnulib module memchr should be tested. */
 #define GNULIB_TEST_MEMCHR 1
 
+/* Define to 1 when the gnulib module mempcpy should be tested. */
+#define GNULIB_TEST_MEMPCPY 1
+
+/* Define to 1 when the gnulib module memrchr should be tested. */
+#define GNULIB_TEST_MEMRCHR 1
+
 /* Define to 1 when the gnulib module obstack-printf should be tested. */
 #define GNULIB_TEST_OBSTACK_PRINTF 1
 
 /* Define to 1 when the gnulib module open should be tested. */
 #define GNULIB_TEST_OPEN 1
 
+/* Define to 1 when the gnulib module openat should be tested. */
+#define GNULIB_TEST_OPENAT 1
+
+/* Define to 1 when the gnulib module opendir should be tested. */
+#define GNULIB_TEST_OPENDIR 1
+
 /* Define to 1 when the gnulib module perror should be tested. */
 #define GNULIB_TEST_PERROR 1
 
+/* Define to 1 when the gnulib module pipe should be tested. */
+#define GNULIB_TEST_PIPE 1
+
 /* Define to 1 when the gnulib module pipe2 should be tested. */
 #define GNULIB_TEST_PIPE2 1
 
+/* Define to 1 when the gnulib module posix_spawn should be tested. */
+#define GNULIB_TEST_POSIX_SPAWN 1
+
 /* Define to 1 when the gnulib module posix_spawnattr_destroy should be
    tested. */
 #define GNULIB_TEST_POSIX_SPAWNATTR_DESTROY 1
@@ -256,6 +386,10 @@
    tested. */
 #define GNULIB_TEST_POSIX_SPAWNATTR_SETFLAGS 1
 
+/* Define to 1 when the gnulib module posix_spawnattr_setpgroup should be
+   tested. */
+#define GNULIB_TEST_POSIX_SPAWNATTR_SETPGROUP 1
+
 /* Define to 1 when the gnulib module posix_spawnattr_setsigmask should be
    tested. */
 #define GNULIB_TEST_POSIX_SPAWNATTR_SETSIGMASK 1
@@ -263,6 +397,10 @@
 /* Define to 1 when the gnulib module posix_spawnp should be tested. */
 #define GNULIB_TEST_POSIX_SPAWNP 1
 
+/* Define to 1 when the gnulib module posix_spawn_file_actions_addchdir should
+   be tested. */
+#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR 1
+
 /* Define to 1 when the gnulib module posix_spawn_file_actions_addclose should
    be tested. */
 #define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE 1
@@ -283,18 +421,36 @@
    tested. */
 #define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_INIT 1
 
+/* Define to 1 when the gnulib module printf should be tested. */
+#define GNULIB_TEST_PRINTF 1
+
 /* Define to 1 when the gnulib module printf-posix should be tested. */
 #define GNULIB_TEST_PRINTF_POSIX 1
 
+/* Define to 1 when the gnulib module putc should be tested. */
+#define GNULIB_TEST_PUTC 1
+
+/* Define to 1 when the gnulib module putchar should be tested. */
+#define GNULIB_TEST_PUTCHAR 1
+
+/* Define to 1 when the gnulib module puts should be tested. */
+#define GNULIB_TEST_PUTS 1
+
 /* Define to 1 when the gnulib module raise should be tested. */
 #define GNULIB_TEST_RAISE 1
 
 /* Define to 1 when the gnulib module rawmemchr should be tested. */
-/* #undef GNULIB_TEST_RAWMEMCHR */
+#define GNULIB_TEST_RAWMEMCHR 1
+
+/* Define to 1 when the gnulib module readdir should be tested. */
+#define GNULIB_TEST_READDIR 1
 
 /* Define to 1 when the gnulib module readlink should be tested. */
 #define GNULIB_TEST_READLINK 1
 
+/* Define to 1 when the gnulib module reallocarray should be tested. */
+#define GNULIB_TEST_REALLOCARRAY 1
+
 /* Define to 1 when the gnulib module realloc-posix should be tested. */
 #define GNULIB_TEST_REALLOC_POSIX 1
 
@@ -304,9 +460,18 @@
 /* Define to 1 when the gnulib module rename should be tested. */
 #define GNULIB_TEST_RENAME 1
 
+/* Define to 1 when the gnulib module rewinddir should be tested. */
+#define GNULIB_TEST_REWINDDIR 1
+
 /* Define to 1 when the gnulib module rmdir should be tested. */
 #define GNULIB_TEST_RMDIR 1
 
+/* Define to 1 when the gnulib module scanf should be tested. */
+#define GNULIB_TEST_SCANF 1
+
+/* Define to 1 when the gnulib module setlocale_null should be tested. */
+/* #undef GNULIB_TEST_SETLOCALE_NULL */
+
 /* Define to 1 when the gnulib module sigaction should be tested. */
 #define GNULIB_TEST_SIGACTION 1
 
@@ -328,8 +493,11 @@
 /* Define to 1 when the gnulib module stpcpy should be tested. */
 #define GNULIB_TEST_STPCPY 1
 
+/* Define to 1 when the gnulib module stpncpy should be tested. */
+#define GNULIB_TEST_STPNCPY 1
+
 /* Define to 1 when the gnulib module strchrnul should be tested. */
-/* #undef GNULIB_TEST_STRCHRNUL */
+#define GNULIB_TEST_STRCHRNUL 1
 
 /* Define to 1 when the gnulib module strdup should be tested. */
 #define GNULIB_TEST_STRDUP 1
@@ -346,6 +514,9 @@
 /* Define to 1 when the gnulib module strnlen should be tested. */
 /* #undef GNULIB_TEST_STRNLEN */
 
+/* Define to 1 when the gnulib module strtod should be tested. */
+#define GNULIB_TEST_STRTOD 1
+
 /* Define to 1 when the gnulib module strverscmp should be tested. */
 #define GNULIB_TEST_STRVERSCMP 1
 
@@ -358,9 +529,15 @@
 /* Define to 1 when the gnulib module vasprintf should be tested. */
 #define GNULIB_TEST_VASPRINTF 1
 
+/* Define to 1 when the gnulib module vfprintf should be tested. */
+#define GNULIB_TEST_VFPRINTF 1
+
 /* Define to 1 when the gnulib module vfprintf-posix should be tested. */
 #define GNULIB_TEST_VFPRINTF_POSIX 1
 
+/* Define to 1 when the gnulib module vprintf should be tested. */
+#define GNULIB_TEST_VPRINTF 1
+
 /* Define to 1 when the gnulib module vsnprintf should be tested. */
 #define GNULIB_TEST_VSNPRINTF 1
 
@@ -373,6 +550,26 @@
 /* Define to 1 when the gnulib module wcwidth should be tested. */
 #define GNULIB_TEST_WCWIDTH 1
 
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module unistr/u8-mbtoucr shall be considered present. */
+#define GNULIB_UNISTR_U8_MBTOUCR 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module unistr/u8-uctomb shall be considered present. */
+#define GNULIB_UNISTR_U8_UCTOMB 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module vfprintf-posix shall be considered present. */
+#define GNULIB_VFPRINTF_POSIX 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module xalloc shall be considered present. */
+#define GNULIB_XALLOC 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module xalloc-die shall be considered present. */
+#define GNULIB_XALLOC_DIE 1
+
 /* Define if your system defines TIOCGWINSZ in sys/ioctl.h. */
 /* #undef GWINSZ_IN_SYS_IOCTL */
 
@@ -380,8 +577,7 @@
    may be supplied by this distribution. */
 #define HAVE_ALLOCA 1
 
-/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
-   */
+/* Define to 1 if <alloca.h> works. */
 #define HAVE_ALLOCA_H 1
 
 /* Define if you have an arithmetic hrtime_t type. */
@@ -390,9 +586,6 @@
 /* Define to 1 if you have the <bp-sym.h> header file. */
 /* #undef HAVE_BP_SYM_H */
 
-/* Define if the 'calloc' function is POSIX compliant. */
-#define HAVE_CALLOC_POSIX 1
-
 /* Define to 1 if you have the `canonicalize_file_name' function. */
 /* #undef HAVE_CANONICALIZE_FILE_NAME */
 
@@ -413,8 +606,11 @@
 /* Define to 1 if you have the `clock_settime' function. */
 #define HAVE_CLOCK_SETTIME 1
 
+/* Define to 1 if you have the `closedir' function. */
+#define HAVE_CLOSEDIR 1
+
 /* Define to 1 if you have the `confstr' function. */
-/* #undef HAVE_CONFSTR */
+#define HAVE_CONFSTR 1
 
 /* Define if the copysignf function is declared in <math.h> and available in
    libc. */
@@ -458,6 +654,34 @@
    don't. */
 /* #undef HAVE_DECL_COPYSIGNL */
 
+/* Define to 1 if you have the declaration of `dirfd', and to 0 if you don't.
+   */
+/* #undef HAVE_DECL_DIRFD */
+
+/* Define to 1 if you have the declaration of `ecvt', and to 0 if you don't.
+   */
+#define HAVE_DECL_ECVT 1
+
+/* Define to 1 if you have the declaration of `execvpe', and to 0 if you
+   don't. */
+#define HAVE_DECL_EXECVPE 0
+
+/* Define to 1 if you have the declaration of `fchdir', and to 0 if you don't.
+   */
+#define HAVE_DECL_FCHDIR 1
+
+/* Define to 1 if you have the declaration of `fcloseall', and to 0 if you
+   don't. */
+#define HAVE_DECL_FCLOSEALL 0
+
+/* Define to 1 if you have the declaration of `fcvt', and to 0 if you don't.
+   */
+#define HAVE_DECL_FCVT 1
+
+/* Define to 1 if you have the declaration of `fdopendir', and to 0 if you
+   don't. */
+#define HAVE_DECL_FDOPENDIR 1
+
 /* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you
    don't. */
 #define HAVE_DECL_FEOF_UNLOCKED 1
@@ -490,14 +714,26 @@
    you don't. */
 #define HAVE_DECL_FWRITE_UNLOCKED 0
 
+/* Define to 1 if you have the declaration of `gcvt', and to 0 if you don't.
+   */
+#define HAVE_DECL_GCVT 1
+
 /* Define to 1 if you have the declaration of `getchar_unlocked', and to 0 if
    you don't. */
 #define HAVE_DECL_GETCHAR_UNLOCKED 1
 
+/* Define to 1 if you have the declaration of `getcwd', and to 0 if you don't.
+   */
+#define HAVE_DECL_GETCWD 1
+
 /* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you
    don't. */
 #define HAVE_DECL_GETC_UNLOCKED 1
 
+/* Define to 1 if you have the declaration of `getdelim', and to 0 if you
+   don't. */
+#define HAVE_DECL_GETDELIM 1
+
 /* Define to 1 if you have the declaration of `getdtablesize', and to 0 if you
    don't. */
 #define HAVE_DECL_GETDTABLESIZE 1
@@ -506,6 +742,10 @@
    don't. */
 #define HAVE_DECL_GETHRTIME 0
 
+/* Define to 1 if you have the declaration of `getline', and to 0 if you
+   don't. */
+#define HAVE_DECL_GETLINE 1
+
 /* Define to 1 if you have the declaration of `iswblank', and to 0 if you
    don't. */
 #define HAVE_DECL_ISWBLANK 1
@@ -522,10 +762,18 @@
    otherwise. */
 #define HAVE_DECL_MBSWIDTH_IN_WCHAR_H 0
 
+/* Define to 1 if you have the declaration of `memrchr', and to 0 if you
+   don't. */
+#define HAVE_DECL_MEMRCHR 0
+
 /* Define to 1 if you have the declaration of `obstack_printf', and to 0 if
    you don't. */
 #define HAVE_DECL_OBSTACK_PRINTF 0
 
+/* Define to 1 if you have the declaration of `posix_spawn', and to 0 if you
+   don't. */
+#define HAVE_DECL_POSIX_SPAWN 1
+
 /* Define to 1 if you have the declaration of `program_invocation_name', and
    to 0 if you don't. */
 #define HAVE_DECL_PROGRAM_INVOCATION_NAME 0
@@ -550,6 +798,10 @@
    don't. */
 #define HAVE_DECL_SNPRINTF 1
 
+/* Define to 1 if you have the declaration of `stpncpy', and to 0 if you
+   don't. */
+#define HAVE_DECL_STPNCPY 1
+
 /* Define to 1 if you have the declaration of `strdup', and to 0 if you don't.
    */
 #define HAVE_DECL_STRDUP 1
@@ -578,6 +830,10 @@
    don't. */
 #define HAVE_DECL_VSNPRINTF 1
 
+/* Define to 1 if you have the declaration of `wcsdup', and to 0 if you don't.
+   */
+#define HAVE_DECL_WCSDUP 1
+
 /* Define to 1 if you have the declaration of `wcwidth', and to 0 if you
    don't. */
 #define HAVE_DECL_WCWIDTH 1
@@ -594,30 +850,64 @@
    don't. */
 /* #undef HAVE_DECL___FPENDING */
 
-/* Define to 1 if you have the 'dup2' function. */
-#define HAVE_DUP2 1
+/* Define to 1 if you have the <dirent.h> header file. */
+#define HAVE_DIRENT_H 1
+
+/* Define to 1 if you have the `dirfd' function. */
+/* #undef HAVE_DIRFD */
 
 /* Define if you have the declaration of environ. */
 /* #undef HAVE_ENVIRON_DECL */
 
+/* Define to 1 if you have the `faccessat' function. */
+#define HAVE_FACCESSAT 1
+
+/* Define to 1 if you have the `fchdir' function. */
+#define HAVE_FCHDIR 1
+
 /* Define to 1 if you have the `fcntl' function. */
 #define HAVE_FCNTL 1
 
+/* Define to 1 if you have the `fdopendir' function. */
+#define HAVE_FDOPENDIR 1
+
 /* Define to 1 if you have the <features.h> header file. */
 /* #undef HAVE_FEATURES_H */
 
+/* Define to 1 if you have the `ffsl' function. */
+#define HAVE_FFSL 1
+
+/* Define to 1 if you have the `flockfile' function. */
+/* #undef HAVE_FLOCKFILE */
+
+/* Define if the 'free' function is guaranteed to preserve errno. */
+/* #undef HAVE_FREE_POSIX */
+
 /* Define if the frexpl function is available in libc. */
 #define HAVE_FREXPL_IN_LIBC 1
 
 /* Define if the frexp function is available in libc. */
 #define HAVE_FREXP_IN_LIBC 1
 
+/* Define to 1 if you have the `fstatat' function. */
+#define HAVE_FSTATAT 1
+
 /* Define to 1 if you have the `fsync' function. */
 #define HAVE_FSYNC 1
 
+/* Define to 1 if you have the `funlockfile' function. */
+/* #undef HAVE_FUNLOCKFILE */
+
 /* Define to 1 if you have the `getcwd' function. */
 #define HAVE_GETCWD 1
 
+/* Define to 1 if getcwd works, but with shorter paths than is generally
+   tested with the replacement. */
+/* #undef HAVE_GETCWD_SHORTER */
+
+/* Define to 1 if you have the `getdelim' function. */
+#define HAVE_GETDELIM 1
+
 /* Define to 1 if you have the `getdtablesize' function. */
 #define HAVE_GETDTABLESIZE 1
 
@@ -630,6 +920,9 @@
 /* Define to 1 if you have the `getopt_long_only' function. */
 #define HAVE_GETOPT_LONG_ONLY 1
 
+/* Define to 1 if the system has the 'getpagesize' function. */
+#define HAVE_GETPAGESIZE 1
+
 /* Define to 1 if you have the `getprogname' function. */
 #define HAVE_GETPROGNAME 1
 
@@ -645,6 +938,14 @@
 /* Define if you have the iconv() function and it works. */
 /* #undef HAVE_ICONV */
 
+/* Define to 1 if you have the <iconv.h> header file. */
+#define HAVE_ICONV_H 1
+
+/* Define to 1 if the compiler supports one of the keywords 'inline',
+   '__inline__', '__inline' and effectively inlines functions marked as such.
+   */
+#define HAVE_INLINE 1
+
 /* Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>. */
 #define HAVE_INTMAX_T 1
 
@@ -665,7 +966,7 @@
 /* #undef HAVE_ISNANF_IN_LIBC */
 
 /* Define if the isnan(long double) function is available in libc. */
-/* #undef HAVE_ISNANL_IN_LIBC */
+#define HAVE_ISNANL_IN_LIBC 1
 
 /* Define to 1 if you have the `iswblank' function. */
 #define HAVE_ISWBLANK 1
@@ -706,11 +1007,7 @@
 /* Define to 1 if you have the <mach-o/dyld.h> header file. */
 #define HAVE_MACH_O_DYLD_H 1
 
-/* Define to 1 if your system has a GNU libc compatible 'malloc' function, and
-   to 0 otherwise. */
-#define HAVE_MALLOC_GNU 1
-
-/* Define if the 'malloc' function is POSIX compliant. */
+/* Define if malloc, realloc, and calloc set errno on allocation failure. */
 #define HAVE_MALLOC_POSIX 1
 
 /* Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including
@@ -729,12 +1026,22 @@
 /* Define to 1 if <wchar.h> declares mbstate_t. */
 #define HAVE_MBSTATE_T 1
 
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
+/* Define to 1 if you have the `mempcpy' function. */
+/* #undef HAVE_MEMPCPY */
+
+/* Define to 1 if you have the `memrchr' function. */
+/* #undef HAVE_MEMRCHR */
 
 /* Define to 1 if you have the `microuptime' function. */
 /* #undef HAVE_MICROUPTIME */
 
+/* Define to 1 if getcwd minimally works, that is, its result can be trusted
+   when it succeeds. */
+#define HAVE_MINIMALLY_WORKING_GETCWD 1
+
+/* Define to 1 if you have the <minix/config.h> header file. */
+/* #undef HAVE_MINIX_CONFIG_H */
+
 /* Define to 1 if <limits.h> defines the MIN and MAX macros. */
 /* #undef HAVE_MINMAX_IN_LIMITS_H */
 
@@ -760,8 +1067,18 @@
 /* Define to 1 if you have the `obstack_printf' function. */
 /* #undef HAVE_OBSTACK_PRINTF */
 
+/* Define to 1 if you have the `openat' function. */
+#define HAVE_OPENAT 1
+
+/* Define to 1 if you have the `opendir' function. */
+#define HAVE_OPENDIR 1
+
+/* Define to 1 if getcwd works, except it sometimes fails when it shouldn't,
+   setting errno to ERANGE, ENAMETOOLONG, or ENOENT. */
+#define HAVE_PARTLY_WORKING_GETCWD 1
+
 /* Define to 1 if you have the <paths.h> header file. */
-/* #undef HAVE_PATHS_H */
+#define HAVE_PATHS_H 1
 
 /* Define to 1 if you have the `pipe' function. */
 #define HAVE_PIPE 1
@@ -775,9 +1092,20 @@
 /* Define to 1 if the system has the type `posix_spawnattr_t'. */
 #define HAVE_POSIX_SPAWNATTR_T 1
 
+/* Define to 1 if you have the `posix_spawn_file_actions_addchdir' function.
+   */
+/* #undef HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR */
+
+/* Define to 1 if you have the `posix_spawn_file_actions_addchdir_np'
+   function. */
+#define HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR_NP 1
+
 /* Define to 1 if the system has the type `posix_spawn_file_actions_t'. */
 #define HAVE_POSIX_SPAWN_FILE_ACTIONS_T 1
 
+/* Define if you have the <pthread.h> header and the POSIX threads API. */
+#define HAVE_PTHREAD_API 1
+
 /* Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE. */
 #define HAVE_PTHREAD_MUTEX_RECURSIVE 1
 
@@ -794,18 +1122,33 @@
 /* Define to 1 if you have the `rawmemchr' function. */
 /* #undef HAVE_RAWMEMCHR */
 
+/* Define to 1 if you have the `readdir' function. */
+#define HAVE_READDIR 1
+
+/* Define if you have the readline library. */
+#define HAVE_READLINE 1
+
+/* Define to 1 if you have the <readline/history.h> header file. */
+#define HAVE_READLINE_HISTORY_H 1
+
+/* Define to 1 if you have the <readline/readline.h> header file. */
+#define HAVE_READLINE_READLINE_H 1
+
 /* Define to 1 if you have the `readlink' function. */
 #define HAVE_READLINK 1
 
 /* Define to 1 if you have the `readlinkat' function. */
 #define HAVE_READLINKAT 1
 
-/* Define if the 'realloc' function is POSIX compliant. */
-#define HAVE_REALLOC_POSIX 1
+/* Define to 1 if you have the `reallocarray' function. */
+/* #undef HAVE_REALLOCARRAY */
 
 /* Define to 1 if you have the `realpath' function. */
 #define HAVE_REALPATH 1
 
+/* Define to 1 if you have the `rewinddir' function. */
+#define HAVE_REWINDDIR 1
+
 /* Define to 1 if 'long double' and 'double' have the same representation. */
 /* #undef HAVE_SAME_LONG_DOUBLE_AS_DOUBLE */
 
@@ -818,6 +1161,9 @@
 /* Define to 1 if you have the `sched_setscheduler' function. */
 /* #undef HAVE_SCHED_SETSCHEDULER */
 
+/* Define to 1 if you have the <sdkddkver.h> header file. */
+/* #undef HAVE_SDKDDKVER_H */
+
 /* Define to 1 if you have the <search.h> header file. */
 #define HAVE_SEARCH_H 1
 
@@ -825,13 +1171,13 @@
 /* #undef HAVE_SETDTABLESIZE */
 
 /* Define to 1 if you have the `setegid' function. */
-/* #undef HAVE_SETEGID */
+#define HAVE_SETEGID 1
 
 /* Define to 1 if you have the `setenv' function. */
 #define HAVE_SETENV 1
 
 /* Define to 1 if you have the `seteuid' function. */
-/* #undef HAVE_SETEUID */
+#define HAVE_SETEUID 1
 
 /* Define to 1 if you have the `setlocale' function. */
 #define HAVE_SETLOCALE 1
@@ -871,6 +1217,10 @@
    buffer had been large enough. */
 #define HAVE_SNPRINTF_RETVAL_C99 1
 
+/* Define if the string produced by the snprintf function is always NUL
+   terminated. */
+#define HAVE_SNPRINTF_TRUNCATION_C99 1
+
 /* Define to 1 if you have the <spawn.h> header file. */
 #define HAVE_SPAWN_H 1
 
@@ -884,18 +1234,21 @@
 /* Define to 1 if you have the <stdio_ext.h> header file. */
 /* #undef HAVE_STDIO_EXT_H */
 
+/* Define to 1 if you have the <stdio.h> header file. */
+#define HAVE_STDIO_H 1
+
 /* Define to 1 if you have the <stdlib.h> header file. */
 #define HAVE_STDLIB_H 1
 
 /* Define to 1 if you have the `stpcpy' function. */
 #define HAVE_STPCPY 1
 
+/* Define if you have the stpncpy() function and it works. */
+#define HAVE_STPNCPY 1
+
 /* Define to 1 if you have the `strchrnul' function. */
 /* #undef HAVE_STRCHRNUL */
 
-/* Define to 1 if you have the `strdup' function. */
-#define HAVE_STRDUP 1
-
 /* Define to 1 if you have the `strerror_r' function. */
 #define HAVE_STRERROR_R 1
 
@@ -953,6 +1306,9 @@
 /* Define to 1 if you have the <sys/inttypes.h> header file. */
 /* #undef HAVE_SYS_INTTYPES_H */
 
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#define HAVE_SYS_IOCTL_H 1
+
 /* Define to 1 if you have the <sys/mman.h> header file. */
 #define HAVE_SYS_MMAN_H 1
 
@@ -962,6 +1318,9 @@
 /* Define to 1 if you have the <sys/resource.h> header file. */
 #define HAVE_SYS_RESOURCE_H 1
 
+/* Define to 1 if you have the <sys/single_threaded.h> header file. */
+/* #undef HAVE_SYS_SINGLE_THREADED_H */
+
 /* Define to 1 if you have the <sys/socket.h> header file. */
 #define HAVE_SYS_SOCKET_H 1
 
@@ -983,6 +1342,12 @@
 /* Define to 1 if you have the `tcdrain' function. */
 #define HAVE_TCDRAIN 1
 
+/* Define to 1 if you have the <termios.h> header file. */
+#define HAVE_TERMIOS_H 1
+
+/* Define to 1 if you have the `thrd_create' function. */
+/* #undef HAVE_THRD_CREATE */
+
 /* Define to 1 if you have the <threads.h> header file. */
 /* #undef HAVE_THREADS_H */
 
@@ -1013,6 +1378,10 @@
 /* Define to 1 if you have the `vfork' function. */
 /* #undef HAVE_VFORK */
 
+/* Define to 1 or 0, depending whether the compiler supports simple visibility
+   declarations. */
+/* #undef HAVE_VISIBILITY */
+
 /* Define to 1 if you have the `vsnprintf' function. */
 #define HAVE_VSNPRINTF 1
 
@@ -1040,18 +1409,29 @@
 /* Define to 1 if you have the `wcwidth' function. */
 #define HAVE_WCWIDTH 1
 
+/* Define to 1 if the compiler and linker support weak declarations of
+   symbols. */
+/* #undef HAVE_WEAK_SYMBOLS */
+
 /* Define to 1 if you have the <winsock2.h> header file. */
 /* #undef HAVE_WINSOCK2_H */
 
 /* Define if you have the 'wint_t' type. */
 #define HAVE_WINT_T 1
 
+/* Define to 1 if fstatat (..., 0) works. For example, it does not work in AIX
+   7.1. */
+#define HAVE_WORKING_FSTATAT_ZERO_FLAG 1
+
 /* Define to 1 if O_NOATIME works. */
 #define HAVE_WORKING_O_NOATIME 1
 
 /* Define to 1 if O_NOFOLLOW works. */
 #define HAVE_WORKING_O_NOFOLLOW 1
 
+/* Define to 1 if you have the <xlocale.h> header file. */
+#define HAVE_XLOCALE_H 1
+
 /* Define to 1 if the system has the type `_Bool'. */
 #define HAVE__BOOL 1
 
@@ -1061,6 +1441,16 @@
 /* Define to 1 if you have the `_set_invalid_parameter_handler' function. */
 /* #undef HAVE__SET_INVALID_PARAMETER_HANDLER */
 
+/* Define to 1 if the compiler supports __builtin_expect,
+   and to 2 if <builtins.h> does.  */
+#define HAVE___BUILTIN_EXPECT 1
+#ifndef HAVE___BUILTIN_EXPECT
+# define __builtin_expect(e, c) (e)
+#elif HAVE___BUILTIN_EXPECT == 2
+# include <builtins.h>
+#endif
+    
+
 /* Define to 1 if you have the `__fseterr' function. */
 /* #undef HAVE___FSETERR */
 
@@ -1070,15 +1460,22 @@
 /* Define to 1 if you have the `__xpg_strerror_r' function. */
 /* #undef HAVE___XPG_STRERROR_R */
 
+/* Define as const if the declaration of iconv() needs const. */
+#define ICONV_CONST 
+
+/* Define to a symbolic name denoting the flavor of iconv_open()
+   implementation. */
+/* #undef ICONV_FLAVOR */
+
 /* Define to the value of ${prefix}, as a string. */
 #define INSTALLPREFIX "/nonexistent"
 
 /* Define as the bit index in the word where to find bit 0 of the exponent of
    'long double'. */
-#define LDBL_EXPBIT0_BIT 0
+/* #undef LDBL_EXPBIT0_BIT */
 
 /* Define as the word index where to find the exponent of 'long double'. */
-#define LDBL_EXPBIT0_WORD 2
+/* #undef LDBL_EXPBIT0_WORD */
 
 /* Define as the bit index in the word where to find the sign of 'long
    double'. */
@@ -1107,6 +1504,10 @@
    */
 /* #undef MBRTOWC_EMPTY_INPUT_BUG */
 
+/* Define if the mbrtowc function may signal encoding errors in the C locale.
+   */
+/* #undef MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ */
+
 /* Define if the mbrtowc function has the NULL pwc argument bug. */
 /* #undef MBRTOWC_NULL_ARG1_BUG */
 
@@ -1119,12 +1520,19 @@
 /* Define if the mbrtowc function returns a wrong return value. */
 /* #undef MBRTOWC_RETVAL_BUG */
 
+/* Define if the mbrtowc function stores a wide character when reporting
+   incomplete input. */
+/* #undef MBRTOWC_STORES_INCOMPLETE_BUG */
+
 /* Use GNU style printf and scanf.  */
 #ifndef __USE_MINGW_ANSI_STDIO
 # define __USE_MINGW_ANSI_STDIO 1
 #endif
 
 
+/* Define to 1 on musl libc. */
+/* #undef MUSL_LIBC */
+
 /* Define to 1 if assertions should be disabled. */
 /* #undef NDEBUG */
 
@@ -1142,11 +1550,11 @@
 
 /* Define if the vasnprintf implementation needs special code for 'double'
    arguments. */
-/* #undef NEED_PRINTF_DOUBLE */
+#define NEED_PRINTF_DOUBLE 1
 
 /* Define if the vasnprintf implementation needs special code for surviving
    out-of-memory conditions. */
-/* #undef NEED_PRINTF_ENOMEM */
+#define NEED_PRINTF_ENOMEM 1
 
 /* Define if the vasnprintf implementation needs special code for the ' flag.
    */
@@ -1170,7 +1578,7 @@
 
 /* Define if the vasnprintf implementation needs special code for 'long
    double' arguments. */
-/* #undef NEED_PRINTF_LONG_DOUBLE */
+#define NEED_PRINTF_LONG_DOUBLE 1
 
 /* Define if the vasnprintf implementation needs special code for supporting
    large precisions without arbitrary bounds. */
@@ -1186,25 +1594,22 @@
 #define PACKAGE_BUGREPORT "bug-bison@gnu.org"
 
 /* The copyright year for this package */
-#define PACKAGE_COPYRIGHT_YEAR 2019
+#define PACKAGE_COPYRIGHT_YEAR 2021
 
 /* Define to the full name of this package. */
 #define PACKAGE_NAME "GNU Bison"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "GNU Bison 3.5"
+#define PACKAGE_STRING "GNU Bison 3.8.2"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "bison"
 
 /* Define to the home page for this package. */
-#define PACKAGE_URL "http://www.gnu.org/software/bison/"
+#define PACKAGE_URL "https://www.gnu.org/software/bison/"
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "3.5"
-
-/* Define if <inttypes.h> exists and defines unusable PRI* macros. */
-/* #undef PRI_MACROS_BROKEN */
+#define PACKAGE_VERSION "3.8.2"
 
 /* Define to the type that is the result of default argument promotions of
    type mode_t. */
@@ -1220,6 +1625,10 @@
 /* Define to 1 if readlink fails to recognize a trailing slash. */
 #define READLINK_TRAILING_SLASH_BUG 1
 
+/* Define to 1 if readlink sets errno instead of truncating a too-long link.
+   */
+/* #undef READLINK_TRUNCATE_BUG */
+
 /* Define if rename does not work when the destination file exists, as on
    Cygwin 1.5 or Windows. */
 /* #undef RENAME_DEST_EXISTS_BUG */
@@ -1236,6 +1645,12 @@
    such as on Solaris 9 or cygwin 1.5. */
 #define RENAME_TRAILING_SLASH_SOURCE_BUG 1
 
+/* Define to 1 if gnulib's dirfd() replacement is used. */
+/* #undef REPLACE_DIRFD */
+
+/* Define to 1 if gnulib's fchdir() replacement is used. */
+/* #undef REPLACE_FCHDIR */
+
 /* Define if fprintf is overridden by a POSIX compliant gnulib implementation.
    */
 #define REPLACE_FPRINTF_POSIX 1
@@ -1244,8 +1659,12 @@
    slash */
 #define REPLACE_FUNC_STAT_FILE 1
 
+/* Define to 1 if open() should work around the inability to open a directory.
+   */
+/* #undef REPLACE_OPEN_DIRECTORY */
+
 /* Define if gnulib uses its own posix_spawn and posix_spawnp functions. */
-/* #undef REPLACE_POSIX_SPAWN */
+#define REPLACE_POSIX_SPAWN 1
 
 /* Define if printf is overridden by a POSIX compliant gnulib implementation.
    */
@@ -1261,9 +1680,17 @@
    implementation. */
 #define REPLACE_VFPRINTF_POSIX 1
 
+/* Define to 1 if setlocale (LC_ALL, NULL) is multithread-safe. */
+#define SETLOCALE_NULL_ALL_MTSAFE 0
+
+/* Define to 1 if setlocale (category, NULL) is multithread-safe. */
+#define SETLOCALE_NULL_ONE_MTSAFE 1
+
 /* File name of the Bourne shell.  */
-#if defined __CYGWIN__ || defined __ANDROID__
+#if (defined _WIN32 && !defined __CYGWIN__) || defined __CYGWIN__ || defined __ANDROID__
 /* Omit the directory part because
+   - For native Windows programs in a Cygwin environment, the Cygwin mounts
+     are not visible.
    - For 32-bit Cygwin programs in a 64-bit Cygwin environment, the Cygwin
      mounts are not visible.
    - On Android, /bin/sh does not exist. It's /system/bin/sh instead.  */
@@ -1297,7 +1724,9 @@
 /* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
 /* #undef STAT_MACROS_BROKEN */
 
-/* Define to 1 if you have the ANSI C header files. */
+/* Define to 1 if all of the C90 standard headers exist (not just the ones
+   required in a freestanding environment). This macro is provided for
+   backward compatibility; new code need not use it. */
 #define STDC_HEADERS 1
 
 /* Define to 1 if strerror_r returns char *. */
@@ -1324,6 +1753,10 @@
 /* Define if the POSIX multithreading library can be used. */
 #define USE_POSIX_THREADS 1
 
+/* Define if references to the POSIX multithreading library are satisfied by
+   libc. */
+/* #undef USE_POSIX_THREADS_FROM_LIBC */
+
 /* Define if references to the POSIX multithreading library should be made
    weak. */
 /* #undef USE_POSIX_THREADS_WEAK */
@@ -1336,19 +1769,44 @@
 #ifndef _DARWIN_C_SOURCE
 # define _DARWIN_C_SOURCE 1
 #endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# define __EXTENSIONS__ 1
+#endif
 /* Enable GNU extensions on systems that have them.  */
 #ifndef _GNU_SOURCE
 # define _GNU_SOURCE 1
 #endif
-/* Enable NetBSD extensions on NetBSD.  */
+/* Enable X/Open compliant socket functions that do not require linking
+   with -lxnet on HP-UX 11.11.  */
+#ifndef _HPUX_ALT_XOPEN_SOCKET_API
+# define _HPUX_ALT_XOPEN_SOCKET_API 1
+#endif
+/* Identify the host operating system as Minix.
+   This macro does not affect the system headers' behavior.
+   A future release of Autoconf may stop defining this macro.  */
+#ifndef _MINIX
+/* # undef _MINIX */
+#endif
+/* Enable general extensions on NetBSD.
+   Enable NetBSD compatibility extensions on Minix.  */
 #ifndef _NETBSD_SOURCE
 # define _NETBSD_SOURCE 1
 #endif
-/* Enable OpenBSD extensions on NetBSD.  */
+/* Enable OpenBSD compatibility extensions on NetBSD.
+   Oddly enough, this does nothing on OpenBSD.  */
 #ifndef _OPENBSD_SOURCE
 # define _OPENBSD_SOURCE 1
 #endif
-/* Enable threading extensions on Solaris.  */
+/* Define to 1 if needed for POSIX-compatible behavior.  */
+#ifndef _POSIX_SOURCE
+/* # undef _POSIX_SOURCE */
+#endif
+/* Define to 2 if needed for POSIX-compatible behavior.  */
+#ifndef _POSIX_1_SOURCE
+/* # undef _POSIX_1_SOURCE */
+#endif
+/* Enable POSIX-compatible threading on Solaris.  */
 #ifndef _POSIX_PTHREAD_SEMANTICS
 # define _POSIX_PTHREAD_SEMANTICS 1
 #endif
@@ -1384,33 +1842,21 @@
 #ifndef _TANDEM_SOURCE
 # define _TANDEM_SOURCE 1
 #endif
-/* Enable X/Open extensions if necessary.  HP-UX 11.11 defines
-   mbstate_t only if _XOPEN_SOURCE is defined to 500, regardless of
-   whether compiling with -Ae or -D_HPUX_SOURCE=1.  */
+/* Enable X/Open extensions.  Define to 500 only if necessary
+   to make mbstate_t available.  */
 #ifndef _XOPEN_SOURCE
 /* # undef _XOPEN_SOURCE */
 #endif
-/* Enable X/Open compliant socket functions that do not require linking
-   with -lxnet on HP-UX 11.11.  */
-#ifndef _HPUX_ALT_XOPEN_SOCKET_API
-# define _HPUX_ALT_XOPEN_SOCKET_API 1
-#endif
-/* Enable general extensions on Solaris.  */
-#ifndef __EXTENSIONS__
-# define __EXTENSIONS__ 1
-#endif
 
 
-/* Define to 1 if you want getc etc. to use unlocked I/O if available.
-   Unlocked I/O can improve performance in unithreaded apps, but it is not
-   safe for multithreaded apps. */
-#define USE_UNLOCKED_IO 1
+/* An alias of GNULIB_STDIO_SINGLE_THREAD. */
+#define USE_UNLOCKED_IO GNULIB_STDIO_SINGLE_THREAD
 
 /* Define if the native Windows multithreading API can be used. */
 /* #undef USE_WINDOWS_THREADS */
 
 /* Version number of package */
-#define VERSION "3.5"
+#define VERSION "3.8.2"
 
 /* Define to 1 if unsetenv returns void instead of int. */
 /* #undef VOID_UNSETENV */
@@ -1445,20 +1891,26 @@
    `char[]'. */
 #define YYTEXT_POINTER 1
 
-/* Enable large inode numbers on Mac OS X 10.5. */
-#define _DARWIN_USE_64_BIT_INODE 1
-
 /* Number of bits in a file offset, on hosts where this is settable. */
 /* #undef _FILE_OFFSET_BITS */
 
+/* True if the compiler says it groks GNU C version MAJOR.MINOR.  */
+#if defined __GNUC__ && defined __GNUC_MINOR__
+# define _GL_GNUC_PREREQ(major, minor) \
+    ((major) < __GNUC__ + ((minor) <= __GNUC_MINOR__))
+#else
+# define _GL_GNUC_PREREQ(major, minor) 0
+#endif
+
+
+/* Define to enable the declarations of ISO C 11 types and functions. */
+/* #undef _ISOC11_SOURCE */
+
 /* Define for large files, on AIX-style hosts. */
 /* #undef _LARGE_FILES */
 
-/* Define to 1 if on MINIX. */
-/* #undef _MINIX */
-
-/* Define to 1 to make NetBSD features available. MINIX 3 needs this. */
-#define _NETBSD_SOURCE 1
+/* Define to 1 on Solaris. */
+/* #undef _LCONV_C99 */
 
 /* The _Noreturn keyword of C11.  */
 #ifndef _Noreturn
@@ -1474,10 +1926,14 @@
        this syntax with 'extern'.  */
 #  define _Noreturn [[noreturn]]
 # elif ((!defined __cplusplus || defined __clang__) \
-        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)  \
-            || 4 < __GNUC__ + (7 <= __GNUC_MINOR__)))
+        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
+            || (!defined __STRICT_ANSI__ \
+                && (_GL_GNUC_PREREQ (4, 7) \
+                    || (defined __apple_build_version__ \
+                        ? 6000000 <= __apple_build_version__ \
+                        : 3 < __clang_major__ + (5 <= __clang_minor__))))))
    /* _Noreturn works as-is.  */
-# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
+# elif _GL_GNUC_PREREQ (2, 8) || defined __clang__ || 0x5110 <= __SUNPRO_C
 #  define _Noreturn __attribute__ ((__noreturn__))
 # elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
 #  define _Noreturn __declspec (noreturn)
@@ -1487,12 +1943,8 @@
 #endif
 
 
-/* Define to 2 if the system does not provide POSIX.1 features except with
-   this defined. */
-/* #undef _POSIX_1_SOURCE */
-
-/* Define to 1 if you need to in order for 'stat' and other things to work. */
-/* #undef _POSIX_SOURCE */
+/* Number of bits in a timestamp, on hosts where this is settable. */
+/* #undef _TIME_BITS */
 
 /* For standard stat data types on VMS. */
 #define _USE_STD_STAT 1
@@ -1501,6 +1953,9 @@
    used. */
 #define __GETOPT_PREFIX rpl_
 
+/* For 64-bit time_t on 32-bit mingw. */
+/* #undef __MINGW_USE_VC2005_COMPAT */
+
 /* Define to 1 if the system <stdint.h> predates C++11. */
 /* #undef __STDC_CONSTANT_MACROS */
 
@@ -1534,6 +1989,368 @@
 #define _GL_ASYNC_SAFE
 
 
+/* Attributes.  */
+#if (defined __has_attribute \
+     && (!defined __clang_minor__ \
+         || 3 < __clang_major__ + (5 <= __clang_minor__)))
+# define _GL_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__)
+#else
+# define _GL_HAS_ATTRIBUTE(attr) _GL_ATTR_##attr
+# define _GL_ATTR_alloc_size _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_always_inline _GL_GNUC_PREREQ (3, 2)
+# define _GL_ATTR_artificial _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_cold _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_const _GL_GNUC_PREREQ (2, 95)
+# define _GL_ATTR_deprecated _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_diagnose_if 0
+# define _GL_ATTR_error _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_externally_visible _GL_GNUC_PREREQ (4, 1)
+# define _GL_ATTR_fallthrough _GL_GNUC_PREREQ (7, 0)
+# define _GL_ATTR_format _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_leaf _GL_GNUC_PREREQ (4, 6)
+# define _GL_ATTR_malloc _GL_GNUC_PREREQ (3, 0)
+# ifdef _ICC
+#  define _GL_ATTR_may_alias 0
+# else
+#  define _GL_ATTR_may_alias _GL_GNUC_PREREQ (3, 3)
+# endif
+# define _GL_ATTR_noinline _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_nonnull _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_nonstring _GL_GNUC_PREREQ (8, 0)
+# define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96)
+# define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9)
+# define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0)
+# define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4)
+#endif
+
+#ifdef __has_c_attribute
+# define _GL_HAS_C_ATTRIBUTE(attr) __has_c_attribute (__##attr##__)
+#else
+# define _GL_HAS_C_ATTRIBUTE(attr) 0
+#endif
+
+
+/* _GL_ATTRIBUTE_ALLOC_SIZE ((N)) declares that the Nth argument of the function
+   is the size of the returned memory block.
+   _GL_ATTRIBUTE_ALLOC_SIZE ((M, N)) declares that the Mth argument multiplied
+   by the Nth argument of the function is the size of the returned memory block.
+ */
+/* Applies to: function, pointer to function, function types.  */
+#if _GL_HAS_ATTRIBUTE (alloc_size)
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
+#else
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args)
+#endif
+
+/* _GL_ATTRIBUTE_ALWAYS_INLINE tells that the compiler should always inline the
+   function and report an error if it cannot do so.  */
+/* Applies to: function.  */
+#if _GL_HAS_ATTRIBUTE (always_inline)
+# define _GL_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__))
+#else
+# define _GL_ATTRIBUTE_ALWAYS_INLINE
+#endif
+
+/* _GL_ATTRIBUTE_ARTIFICIAL declares that the function is not important to show
+    in stack traces when debugging.  The compiler should omit the function from
+    stack traces.  */
+/* Applies to: function.  */
+#if _GL_HAS_ATTRIBUTE (artificial)
+# define _GL_ATTRIBUTE_ARTIFICIAL __attribute__ ((__artificial__))
+#else
+# define _GL_ATTRIBUTE_ARTIFICIAL
+#endif
+
+/* _GL_ATTRIBUTE_COLD declares that the function is rarely executed.  */
+/* Applies to: functions.  */
+/* Avoid __attribute__ ((cold)) on MinGW; see thread starting at
+   <https://lists.gnu.org/r/emacs-devel/2019-04/msg01152.html>.
+   Also, Oracle Studio 12.6 requires 'cold' not '__cold__'.  */
+#if _GL_HAS_ATTRIBUTE (cold) && !defined __MINGW32__
+# ifndef __SUNPRO_C
+#  define _GL_ATTRIBUTE_COLD __attribute__ ((__cold__))
+# else
+#  define _GL_ATTRIBUTE_COLD __attribute__ ((cold))
+# endif
+#else
+# define _GL_ATTRIBUTE_COLD
+#endif
+
+/* _GL_ATTRIBUTE_CONST declares that it is OK for a compiler to omit duplicate
+   calls to the function with the same arguments.
+   This attribute is safe for a function that neither depends on nor affects
+   observable state, and always returns exactly once - e.g., does not loop
+   forever, and does not call longjmp.
+   (This attribute is stricter than _GL_ATTRIBUTE_PURE.)  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (const)
+# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
+#else
+# define _GL_ATTRIBUTE_CONST
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.
+   _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
+   can be freed via 'free'; it can be used only after declaring 'free'.  */
+/* Applies to: functions.  Cannot be used on inline functions.  */
+#if _GL_GNUC_PREREQ (11, 0)
+# define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+#else
+# define _GL_ATTRIBUTE_DEALLOC(f, i)
+#endif
+#define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (free, 1)
+
+/* _GL_ATTRIBUTE_DEPRECATED: Declares that an entity is deprecated.
+   The compiler may warn if the entity is used.  */
+/* Applies to:
+     - function, variable,
+     - struct, union, struct/union member,
+     - enumeration, enumeration item,
+     - typedef,
+   in C++ also: namespace, class, template specialization.  */
+#if _GL_HAS_C_ATTRIBUTE (deprecated)
+# define _GL_ATTRIBUTE_DEPRECATED [[__deprecated__]]
+#elif _GL_HAS_ATTRIBUTE (deprecated)
+# define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__))
+#else
+# define _GL_ATTRIBUTE_DEPRECATED
+#endif
+
+/* _GL_ATTRIBUTE_ERROR(msg) requests an error if a function is called and
+   the function call is not optimized away.
+   _GL_ATTRIBUTE_WARNING(msg) requests a warning if a function is called and
+   the function call is not optimized away.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (error)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__error__ (msg)))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__warning__ (msg)))
+#elif _GL_HAS_ATTRIBUTE (diagnose_if)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__diagnose_if__ (1, msg, "error")))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#else
+# define _GL_ATTRIBUTE_ERROR(msg)
+# define _GL_ATTRIBUTE_WARNING(msg)
+#endif
+
+/* _GL_ATTRIBUTE_EXTERNALLY_VISIBLE declares that the entity should remain
+   visible to debuggers etc., even with '-fwhole-program'.  */
+/* Applies to: functions, variables.  */
+#if _GL_HAS_ATTRIBUTE (externally_visible)
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((externally_visible))
+#else
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
+#endif
+
+/* _GL_ATTRIBUTE_FALLTHROUGH declares that it is not a programming mistake if
+   the control flow falls through to the immediately following 'case' or
+   'default' label.  The compiler should not warn in this case.  */
+/* Applies to: Empty statement (;), inside a 'switch' statement.  */
+/* Always expands to something.  */
+#if _GL_HAS_C_ATTRIBUTE (fallthrough)
+# define _GL_ATTRIBUTE_FALLTHROUGH [[__fallthrough__]]
+#elif _GL_HAS_ATTRIBUTE (fallthrough)
+# define _GL_ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__))
+#else
+# define _GL_ATTRIBUTE_FALLTHROUGH ((void) 0)
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK))
+   declares that the STRING-INDEXth function argument is a format string of
+   style ARCHETYPE, which is one of:
+     printf, gnu_printf
+     scanf, gnu_scanf,
+     strftime, gnu_strftime,
+     strfmon,
+   or the same thing prefixed and suffixed with '__'.
+   If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK
+   are suitable for the format string.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (format)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define _GL_ATTRIBUTE_FORMAT(spec)
+#endif
+
+/* _GL_ATTRIBUTE_LEAF declares that if the function is called from some other
+   compilation unit, it executes code from that unit only by return or by
+   exception handling.  This declaration lets the compiler optimize that unit
+   more aggressively.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (leaf)
+# define _GL_ATTRIBUTE_LEAF __attribute__ ((__leaf__))
+#else
+# define _GL_ATTRIBUTE_LEAF
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+   allocated memory.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (malloc)
+# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+#else
+# define _GL_ATTRIBUTE_MALLOC
+#endif
+
+/* _GL_ATTRIBUTE_MAY_ALIAS declares that pointers to the type may point to the
+   same storage as pointers to other types.  Thus this declaration disables
+   strict aliasing optimization.  */
+/* Applies to: types.  */
+/* Oracle Studio 12.6 mishandles may_alias despite __has_attribute OK.  */
+#if _GL_HAS_ATTRIBUTE (may_alias) && !defined __SUNPRO_C
+# define _GL_ATTRIBUTE_MAY_ALIAS __attribute__ ((__may_alias__))
+#else
+# define _GL_ATTRIBUTE_MAY_ALIAS
+#endif
+
+/* _GL_ATTRIBUTE_MAYBE_UNUSED declares that it is not a programming mistake if
+   the entity is not used.  The compiler should not warn if the entity is not
+   used.  */
+/* Applies to:
+     - function, variable,
+     - struct, union, struct/union member,
+     - enumeration, enumeration item,
+     - typedef,
+   in C++ also: class.  */
+/* In C++ and C2x, this is spelled [[__maybe_unused__]].
+   GCC's syntax is __attribute__ ((__unused__)).
+   clang supports both syntaxes.  */
+#if _GL_HAS_C_ATTRIBUTE (maybe_unused)
+# define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
+#else
+# define _GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_UNUSED
+#endif
+/* Alternative spelling of this macro, for convenience.  */
+#define _GL_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
+/* Earlier spellings of this macro.  */
+#define _UNUSED_PARAMETER_ _GL_ATTRIBUTE_MAYBE_UNUSED
+
+/* _GL_ATTRIBUTE_NODISCARD declares that the caller of the function should not
+   discard the return value.  The compiler may warn if the caller does not use
+   the return value, unless the caller uses something like ignore_value.  */
+/* Applies to: function, enumeration, class.  */
+#if _GL_HAS_C_ATTRIBUTE (nodiscard)
+# define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]]
+#elif _GL_HAS_ATTRIBUTE (warn_unused_result)
+# define _GL_ATTRIBUTE_NODISCARD __attribute__ ((__warn_unused_result__))
+#else
+# define _GL_ATTRIBUTE_NODISCARD
+#endif
+
+/* _GL_ATTRIBUTE_NOINLINE tells that the compiler should not inline the
+   function.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (noinline)
+# define _GL_ATTRIBUTE_NOINLINE __attribute__ ((__noinline__))
+#else
+# define _GL_ATTRIBUTE_NOINLINE
+#endif
+
+/* _GL_ATTRIBUTE_NONNULL ((N1, N2,...)) declares that the arguments N1, N2,...
+   must not be NULL.
+   _GL_ATTRIBUTE_NONNULL () declares that all pointer arguments must not be
+   null.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (nonnull)
+# define _GL_ATTRIBUTE_NONNULL(args) __attribute__ ((__nonnull__ args))
+#else
+# define _GL_ATTRIBUTE_NONNULL(args)
+#endif
+
+/* _GL_ATTRIBUTE_NONSTRING declares that the contents of a character array is
+   not meant to be NUL-terminated.  */
+/* Applies to: struct/union members and variables that are arrays of element
+   type '[[un]signed] char'.  */
+#if _GL_HAS_ATTRIBUTE (nonstring)
+# define _GL_ATTRIBUTE_NONSTRING __attribute__ ((__nonstring__))
+#else
+# define _GL_ATTRIBUTE_NONSTRING
+#endif
+
+/* There is no _GL_ATTRIBUTE_NORETURN; use _Noreturn instead.  */
+
+/* _GL_ATTRIBUTE_NOTHROW declares that the function does not throw exceptions.
+ */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (nothrow) && !defined __cplusplus
+# define _GL_ATTRIBUTE_NOTHROW __attribute__ ((__nothrow__))
+#else
+# define _GL_ATTRIBUTE_NOTHROW
+#endif
+
+/* _GL_ATTRIBUTE_PACKED declares:
+   For struct members: The member has the smallest possible alignment.
+   For struct, union, class: All members have the smallest possible alignment,
+   minimizing the memory required.  */
+/* Applies to: struct members, struct, union,
+   in C++ also: class.  */
+#if _GL_HAS_ATTRIBUTE (packed)
+# define _GL_ATTRIBUTE_PACKED __attribute__ ((__packed__))
+#else
+# define _GL_ATTRIBUTE_PACKED
+#endif
+
+/* _GL_ATTRIBUTE_PURE declares that It is OK for a compiler to omit duplicate
+   calls to the function with the same arguments if observable state is not
+   changed between calls.
+   This attribute is safe for a function that does not affect
+   observable state, and always returns exactly once.
+   (This attribute is looser than _GL_ATTRIBUTE_CONST.)  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (pure)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE
+#endif
+
+/* _GL_ATTRIBUTE_RETURNS_NONNULL declares that the function's return value is
+   a non-NULL pointer.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (returns_nonnull)
+# define _GL_ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__))
+#else
+# define _GL_ATTRIBUTE_RETURNS_NONNULL
+#endif
+
+/* _GL_ATTRIBUTE_SENTINEL(pos) declares that the variadic function expects a
+   trailing NULL argument.
+   _GL_ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99).
+   _GL_ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (sentinel)
+# define _GL_ATTRIBUTE_SENTINEL(pos) __attribute__ ((__sentinel__ pos))
+#else
+# define _GL_ATTRIBUTE_SENTINEL(pos)
+#endif
+
+/* A helper macro.  Don't use it directly.  */
+#if _GL_HAS_ATTRIBUTE (unused)
+# define _GL_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#else
+# define _GL_ATTRIBUTE_UNUSED
+#endif
+
+
+/* _GL_UNUSED_LABEL; declares that it is not a programming mistake if the
+   immediately preceding label is not used.  The compiler should not warn
+   if the label is not used.  */
+/* Applies to: label (both in C and C++).  */
+/* Note that g++ < 4.5 does not support the '__attribute__ ((__unused__)) ;'
+   syntax.  But clang does.  */
+#if !(defined __cplusplus && !_GL_GNUC_PREREQ (4, 5)) || defined __clang__
+# define _GL_UNUSED_LABEL _GL_ATTRIBUTE_UNUSED
+#else
+# define _GL_UNUSED_LABEL
+#endif
+
+
+/* Define as 'access' if you don't have the eaccess() function. */
+#define eaccess access
+
 /* Please see the Gnulib manual for how to use these macros.
 
    Suppress extern inline with HP-UX cc, as it appears to be broken; see
@@ -1543,7 +2360,8 @@
    mishandles inline functions that call each other.  E.g., for 'inline void f
    (void) { } inline void g (void) { f (); }', c99 incorrectly complains
    'reference to static identifier "f" in extern inline function'.
-   This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16.
+   This bug was observed with Oracle Developer Studio 12.6
+   (Sun C 5.15 SunOS_sparc 2017/05/30).
 
    Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
    on configurations that mistakenly use 'static inline' to implement
@@ -1609,8 +2427,8 @@
 # define _GL_EXTERN_INLINE extern
 # define _GL_EXTERN_INLINE_IN_USE
 #else
-# define _GL_INLINE static _GL_UNUSED
-# define _GL_EXTERN_INLINE static _GL_UNUSED
+# define _GL_INLINE _GL_UNUSED static
+# define _GL_EXTERN_INLINE _GL_UNUSED static
 #endif
 
 /* In GCC 4.6 (inclusive) to 5.1 (exclusive),
@@ -1663,13 +2481,29 @@
 /* Define to a type if <wchar.h> does not define. */
 /* #undef mbstate_t */
 
+/* _GL_CMP (n1, n2) performs a three-valued comparison on n1 vs. n2, where
+   n1 and n2 are expressions without side effects, that evaluate to real
+   numbers (excluding NaN).
+   It returns
+     1  if n1 > n2
+     0  if n1 == n2
+     -1 if n1 < n2
+   The naïve code   (n1 > n2 ? 1 : n1 < n2 ? -1 : 0)  produces a conditional
+   jump with nearly all GCC versions up to GCC 10.
+   This variant     (n1 < n2 ? -1 : n1 > n2)  produces a conditional with many
+   GCC versions up to GCC 9.
+   The better code  (n1 > n2) - (n1 < n2)  from Hacker's Delight § 2-9
+   avoids conditional jumps in all GCC versions >= 3.4.  */
+#define _GL_CMP(n1, n2) (((n1) > (n2)) - ((n1) < (n2)))
+
+
 /* Define to `int' if <sys/types.h> does not define. */
 /* #undef mode_t */
 
 /* Define to the type of st_nlink in struct stat, or a supertype. */
 /* #undef nlink_t */
 
-/* Define to `int' if <sys/types.h> does not define. */
+/* Define as a signed integer type capable of holding a process identifier. */
 /* #undef pid_t */
 
 /* Define as the type of the result of subtracting two pointers, if the system
@@ -1678,14 +2512,15 @@
 
 /* Define to the equivalent of the C99 'restrict' keyword, or to
    nothing if this is not supported.  Do not define if restrict is
-   supported directly.  */
-#define restrict __restrict
-/* Work around a bug in Sun C++: it does not support _Restrict or
-   __restrict__, even though the corresponding Sun C compiler ends up with
-   "#define restrict _Restrict" or "#define restrict __restrict__" in the
-   previous line.  Perhaps some future version of Sun C++ will work with
-   restrict; if so, hopefully it defines __RESTRICT like Sun C does.  */
-#if defined __SUNPRO_CC && !defined __RESTRICT
+   supported only directly.  */
+#define restrict __restrict__
+/* Work around a bug in older versions of Sun C++, which did not
+   #define __restrict__ or support _Restrict or __restrict__
+   even though the corresponding Sun C compiler ended up with
+   "#define restrict _Restrict" or "#define restrict __restrict__"
+   in the previous line.  This workaround can be removed once
+   we assume Oracle Developer Studio 12.5 (2016) or later.  */
+#if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__
 # define _Restrict
 # define __restrict__
 #endif
@@ -1703,46 +2538,18 @@
 /* Define to `int' if <sys/types.h> doesn't define. */
 /* #undef uid_t */
 
-/* Define as a marker that can be attached to declarations that might not
-    be used.  This helps to reduce warnings, such as from
-    GCC -Wunused-parameter.  */
-#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
-# define _GL_UNUSED __attribute__ ((__unused__))
-#else
-# define _GL_UNUSED
-#endif
-/* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name
-   is a misnomer outside of parameter lists.  */
-#define _UNUSED_PARAMETER_ _GL_UNUSED
 
-/* gcc supports the "unused" attribute on possibly unused labels, and
-   g++ has since version 4.5.  Note to support C++ as well as C,
-   _GL_UNUSED_LABEL should be used with a trailing ;  */
-#if !defined __cplusplus || __GNUC__ > 4 \
-    || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
-# define _GL_UNUSED_LABEL _GL_UNUSED
-#else
-# define _GL_UNUSED_LABEL
-#endif
-
-/* The __pure__ attribute was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define _GL_ATTRIBUTE_PURE /* empty */
-#endif
-
-/* The __const__ attribute was added in gcc 2.95.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
-# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
-#else
-# define _GL_ATTRIBUTE_CONST /* empty */
-#endif
-
-/* The __malloc__ attribute was added in gcc 3.  */
-#if 3 <= __GNUC__
-# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
-#else
-# define _GL_ATTRIBUTE_MALLOC /* empty */
-#endif
-
+  /* This definition is a duplicate of the one in unitypes.h.
+     It is here so that we can cope with an older version of unitypes.h
+     that does not contain this definition and that is pre-installed among
+     the public header files.  */
+  # if defined __restrict \
+       || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+       || __clang_major__ >= 3
+  #  define _UC_RESTRICT __restrict
+  # elif 199901L <= __STDC_VERSION__ || defined restrict
+  #  define _UC_RESTRICT restrict
+  # else
+  #  define _UC_RESTRICT
+  # endif
+  
diff --git a/darwin-lib/dirent.h b/darwin-lib/dirent.h
new file mode 100644
index 0000000..f9e238f
--- /dev/null
+++ b/darwin-lib/dirent.h
@@ -0,0 +1,828 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* A GNU-like <dirent.h>.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_DIRENT_H
+
+#if __GNUC__ >= 3
+#pragma GCC system_header
+#endif
+
+
+/* The include_next requires a split double-inclusion guard.  */
+#if 1
+# include_next <dirent.h>
+#endif
+
+#ifndef _GL_DIRENT_H
+#define _GL_DIRENT_H
+
+/* Get ino_t.  Needed on some systems, including glibc 2.8.  */
+#include <sys/types.h>
+
+#if !1
+/* Define types DIR and 'struct dirent'.  */
+# if !GNULIB_defined_struct_dirent
+struct dirent
+{
+  char d_type;
+  char d_name[1];
+};
+/* Possible values for 'd_type'.  */
+#  define DT_UNKNOWN 0
+#  define DT_FIFO    1          /* FIFO */
+#  define DT_CHR     2          /* character device */
+#  define DT_DIR     4          /* directory */
+#  define DT_BLK     6          /* block device */
+#  define DT_REG     8          /* regular file */
+#  define DT_LNK    10          /* symbolic link */
+#  define DT_SOCK   12          /* socket */
+#  define DT_WHT    14          /* whiteout */
+typedef struct gl_directory DIR;
+#  define GNULIB_defined_struct_dirent 1
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.  */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if __GNUC__ >= 11
+#  define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+#  define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+   allocated memory.  */
+/* Applies to: functions.  */
+#ifndef _GL_ATTRIBUTE_MALLOC
+# if __GNUC__ >= 3 || defined __clang__
+#  define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+#  define _GL_ATTRIBUTE_MALLOC
+# endif
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The attribute __pure__ was added in gcc 2.96.  */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+/* C++ compatible function declaration macros.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_CXXDEFS_H
+#define _GL_CXXDEFS_H
+
+/* Begin/end the GNULIB_NAMESPACE namespace.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
+# define _GL_END_NAMESPACE }
+#else
+# define _GL_BEGIN_NAMESPACE
+# define _GL_END_NAMESPACE
+#endif
+
+/* The three most frequent use cases of these macros are:
+
+   * For providing a substitute for a function that is missing on some
+     platforms, but is declared and works fine on the platforms on which
+     it exists:
+
+       #if @GNULIB_FOO@
+       # if !@HAVE_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       # endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on all platforms,
+     but is broken/insufficient and needs to be replaced on some platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on some platforms
+     but is broken/insufficient and needs to be replaced on some of them and
+     is additionally either missing or undeclared on some other platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       #  if !@HAVE_FOO@   or   if !@HAVE_DECL_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       #  endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+*/
+
+/* _GL_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#if defined __cplusplus
+# define _GL_EXTERN_C extern "C"
+#else
+# define _GL_EXTERN_C extern
+#endif
+
+/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
+   declares a replacement function, named rpl_func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
+  _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
+#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype rpl_func parameters_and_attributes
+
+/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
+   declares the system function, named func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype func parameters_and_attributes
+
+/* _GL_CXXALIAS_RPL (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+
+   Wrapping rpl_func in an object with an inline conversion operator
+   avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::rpl_func;                                  \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
+   is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
+   except that the C function rpl_func may have a slightly different
+   declaration.  A cast is used to silence the "invalid conversion" error
+   that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                     \
+    {                                                              \
+      static const struct _gl_ ## func ## _wrapper                 \
+      {                                                            \
+        typedef rettype (*type) parameters;                        \
+                                                                   \
+        inline operator type () const                              \
+        {                                                          \
+          return reinterpret_cast<type>(::rpl_func);               \
+        }                                                          \
+      } func = {};                                                 \
+    }                                                              \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_SYS (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to the system provided function func, if GNULIB_NAMESPACE
+   is defined.
+   Example:
+     _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+
+   Wrapping func in an object with an inline conversion operator
+   avoids a reference to func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS(func,rettype,parameters)            \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::func;                                      \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                          \
+    {                                                   \
+      static const struct _gl_ ## func ## _wrapper      \
+      {                                                 \
+        typedef rettype (*type) parameters;             \
+                                                        \
+        inline operator type () const                   \
+        {                                               \
+          return reinterpret_cast<type>(::func);        \
+        }                                               \
+      } func = {};                                      \
+    }                                                   \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function is picked among a set of overloaded functions,
+   namely the one with rettype2 and parameters2.  Two consecutive casts
+   are used to silence the "cannot find a match" and "invalid conversion"
+   errors that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+  /* The outer cast must be a reinterpret_cast.
+     The inner cast: When the function is defined as a set of overloaded
+     functions, it works as a static_cast<>, choosing the designated variant.
+     When the function is defined as a single variant, it works as a
+     reinterpret_cast<>. The parenthesized cast syntax works both ways.  */
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    namespace GNULIB_NAMESPACE                                                \
+    {                                                                         \
+      static const struct _gl_ ## func ## _wrapper                            \
+      {                                                                       \
+        typedef rettype (*type) parameters;                                   \
+                                                                              \
+        inline operator type () const                                         \
+        {                                                                     \
+          return reinterpret_cast<type>((rettype2 (*) parameters2)(::func));  \
+        }                                                                     \
+      } func = {};                                                            \
+    }                                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN (func);
+   causes a warning to be emitted when ::func is used but not when
+   GNULIB_NAMESPACE::func is used.  func must be defined without overloaded
+   variants.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN(func) \
+   _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN_1(func,namespace) \
+   _GL_CXXALIASWARN_2 (func, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+    _GL_WARN_ON_USE (func, \
+                     "The symbol ::" #func " refers to the system function. " \
+                     "Use " #namespace "::" #func " instead.")
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     extern __typeof__ (func) func
+# else
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN(func) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
+   causes a warning to be emitted when the given overloaded variant of ::func
+   is used but not when GNULIB_NAMESPACE::func is used.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+   _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
+                        GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
+   _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
+                         "The symbol ::" #func " refers to the system function. " \
+                         "Use " #namespace "::" #func " instead.")
+# else
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+#endif /* _GL_CXXDEFS_H */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+/* A C macro for declaring that specific arguments must not be NULL.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
+   that the values passed as arguments n, ..., m must be non-NULL pointers.
+   n = 1 stands for the first argument, n = 2 for the second argument etc.  */
+#ifndef _GL_ARG_NONNULL
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
+#  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
+# else
+#  define _GL_ARG_NONNULL(params)
+# endif
+#endif
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+/* A C macro for emitting warnings if a function is used.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
+   for FUNCTION which will then trigger a compiler warning containing
+   the text of "literal string" anywhere that function is called, if
+   supported by the compiler.  If the compiler does not support this
+   feature, the macro expands to an unused extern declaration.
+
+   _GL_WARN_ON_USE_ATTRIBUTE ("literal string") expands to the
+   attribute used in _GL_WARN_ON_USE.  If the compiler does not support
+   this feature, it expands to empty.
+
+   These macros are useful for marking a function as a potential
+   portability trap, with the intent that "literal string" include
+   instructions on the replacement function that should be used
+   instead.
+   _GL_WARN_ON_USE is for functions with 'extern' linkage.
+   _GL_WARN_ON_USE_ATTRIBUTE is for functions with 'static' or 'inline'
+   linkage.
+
+   However, one of the reasons that a function is a portability trap is
+   if it has the wrong signature.  Declaring FUNCTION with a different
+   signature in C is a compilation error, so this macro must use the
+   same type as any existing declaration so that programs that avoid
+   the problematic FUNCTION do not fail to compile merely because they
+   included a header that poisoned the function.  But this implies that
+   _GL_WARN_ON_USE is only safe to use if FUNCTION is known to already
+   have a declaration.  Use of this macro implies that there must not
+   be any other macro hiding the declaration of FUNCTION; but
+   undefining FUNCTION first is part of the poisoning process anyway
+   (although for symbols that are provided only via a macro, the result
+   is a compilation error rather than a warning containing
+   "literal string").  Also note that in C++, it is only safe to use if
+   FUNCTION has no overloads.
+
+   For an example, it is possible to poison 'getline' by:
+   - adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
+     [getline]) in configure.ac, which potentially defines
+     HAVE_RAW_DECL_GETLINE
+   - adding this code to a header that wraps the system <stdio.h>:
+     #undef getline
+     #if HAVE_RAW_DECL_GETLINE
+     _GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
+       "not universally present; use the gnulib module getline");
+     #endif
+
+   It is not possible to directly poison global variables.  But it is
+   possible to write a wrapper accessor function, and poison that
+   (less common usage, like &environ, will cause a compilation error
+   rather than issue the nice warning, but the end result of informing
+   the developer about their portability problem is still achieved):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     rpl_environ (void) { return &environ; }
+     _GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   or better (avoiding contradictory use of 'static' and 'extern'):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     _GL_WARN_ON_USE_ATTRIBUTE ("environ is not always properly declared")
+     rpl_environ (void) { return &environ; }
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   */
+#ifndef _GL_WARN_ON_USE
+
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# else /* Unsupported.  */
+#  define _GL_WARN_ON_USE(function, message) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# endif
+#endif
+
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
+   This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
+   not work in this case.  */
+#ifndef _GL_WARN_ON_USE_CXX
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
+# endif
+#endif
+
+/* _GL_WARN_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#ifndef _GL_WARN_EXTERN_C
+# if defined __cplusplus
+#  define _GL_WARN_EXTERN_C extern "C"
+# else
+#  define _GL_WARN_EXTERN_C extern
+# endif
+#endif
+
+
+/* Declare overridden functions.  */
+
+#if 1
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef closedir
+#   define closedir rpl_closedir
+#   define GNULIB_defined_closedir 1
+#  endif
+_GL_FUNCDECL_RPL (closedir, int, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (closedir, int, (DIR *dirp));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (closedir, int, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (closedir, int, (DIR *dirp));
+# endif
+_GL_CXXALIASWARN (closedir);
+#elif defined GNULIB_POSIXCHECK
+# undef closedir
+# if HAVE_RAW_DECL_CLOSEDIR
+_GL_WARN_ON_USE (closedir, "closedir is not portable - "
+                 "use gnulib module closedir for portability");
+# endif
+#endif
+
+#if 1
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef opendir
+#   define opendir rpl_opendir
+#   define GNULIB_defined_opendir 1
+#  endif
+_GL_FUNCDECL_RPL (opendir, DIR *,
+                  (const char *dir_name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+_GL_CXXALIAS_RPL (opendir, DIR *, (const char *dir_name));
+# else
+#  if !1 || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (opendir, DIR *,
+                  (const char *dir_name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+#  endif
+_GL_CXXALIAS_SYS (opendir, DIR *, (const char *dir_name));
+# endif
+_GL_CXXALIASWARN (opendir);
+#else
+# if 1 && __GNUC__ >= 11 && !defined opendir
+/* For -Wmismatched-dealloc: Associate opendir with closedir or
+   rpl_closedir.  */
+_GL_FUNCDECL_SYS (opendir, DIR *,
+                  (const char *dir_name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef opendir
+#  if HAVE_RAW_DECL_OPENDIR
+_GL_WARN_ON_USE (opendir, "opendir is not portable - "
+                 "use gnulib module opendir for portability");
+#  endif
+# endif
+#endif
+
+#if 1
+# if !1
+_GL_FUNCDECL_SYS (readdir, struct dirent *, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (readdir, struct dirent *, (DIR *dirp));
+_GL_CXXALIASWARN (readdir);
+#elif defined GNULIB_POSIXCHECK
+# undef readdir
+# if HAVE_RAW_DECL_READDIR
+_GL_WARN_ON_USE (readdir, "readdir is not portable - "
+                 "use gnulib module readdir for portability");
+# endif
+#endif
+
+#if 1
+# if !1
+_GL_FUNCDECL_SYS (rewinddir, void, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (rewinddir, void, (DIR *dirp));
+_GL_CXXALIASWARN (rewinddir);
+#elif defined GNULIB_POSIXCHECK
+# undef rewinddir
+# if HAVE_RAW_DECL_REWINDDIR
+_GL_WARN_ON_USE (rewinddir, "rewinddir is not portable - "
+                 "use gnulib module rewinddir for portability");
+# endif
+#endif
+
+#if 0
+/* Return the file descriptor associated with the given directory stream,
+   or -1 if none exists.  */
+# if 0
+/* On kLIBC, dirfd() is a macro that does not work.  Undefine it.  */
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) || defined dirfd
+#   undef dirfd
+#   define dirfd rpl_dirfd
+#  endif
+_GL_FUNCDECL_RPL (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (dirfd, int, (DIR *));
+
+#  ifdef __KLIBC__
+/* Gnulib internal hooks needed to maintain the dirfd metadata.  */
+_GL_EXTERN_C int _gl_register_dirp_fd (int fd, DIR *dirp)
+     _GL_ARG_NONNULL ((2));
+_GL_EXTERN_C void _gl_unregister_dirp_fd (int fd);
+#  endif
+# else
+#  if defined __cplusplus && defined GNULIB_NAMESPACE && defined dirfd
+    /* dirfd is defined as a macro and not as a function.
+       Turn it into a function and get rid of the macro.  */
+static inline int (dirfd) (DIR *dp) { return dirfd (dp); }
+#   undef dirfd
+#  endif
+#  if !(1 || defined dirfd)
+_GL_FUNCDECL_SYS (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (dirfd, int, (DIR *));
+# endif
+_GL_CXXALIASWARN (dirfd);
+#elif defined GNULIB_POSIXCHECK
+# undef dirfd
+# if HAVE_RAW_DECL_DIRFD
+_GL_WARN_ON_USE (dirfd, "dirfd is unportable - "
+                 "use gnulib module dirfd for portability");
+# endif
+#endif
+
+#if 1
+/* Open a directory stream visiting the given directory file
+   descriptor.  Return NULL and set errno if fd is not visiting a
+   directory.  On success, this function consumes fd (it will be
+   implicitly closed either by this function or by a subsequent
+   closedir).  */
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fdopendir
+#   define fdopendir rpl_fdopendir
+#  endif
+_GL_FUNCDECL_RPL (fdopendir, DIR *,
+                  (int fd)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+_GL_CXXALIAS_RPL (fdopendir, DIR *, (int fd));
+# else
+#  if !1 || !1 || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (fdopendir, DIR *,
+                  (int fd)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+#  endif
+_GL_CXXALIAS_SYS (fdopendir, DIR *, (int fd));
+# endif
+_GL_CXXALIASWARN (fdopendir);
+#else
+# if 1 && __GNUC__ >= 11 && !defined fdopendir
+/* For -Wmismatched-dealloc: Associate fdopendir with closedir or
+   rpl_closedir.  */
+_GL_FUNCDECL_SYS (fdopendir, DIR *,
+                  (int fd)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef fdopendir
+#  if HAVE_RAW_DECL_FDOPENDIR
+_GL_WARN_ON_USE (fdopendir, "fdopendir is unportable - "
+                 "use gnulib module fdopendir for portability");
+#  endif
+# endif
+#endif
+
+#if 0
+/* Scan the directory DIR, calling FILTER on each directory entry.
+   Entries for which FILTER returns nonzero are individually malloc'd,
+   sorted using qsort with CMP, and collected in a malloc'd array in
+   *NAMELIST.  Returns the number of entries selected, or -1 on error.  */
+# if !1
+_GL_FUNCDECL_SYS (scandir, int,
+                  (const char *dir, struct dirent ***namelist,
+                   int (*filter) (const struct dirent *),
+                   int (*cmp) (const struct dirent **, const struct dirent **))
+                  _GL_ARG_NONNULL ((1, 2, 4)));
+# endif
+/* Need to cast, because on glibc systems, the fourth parameter is
+                        int (*cmp) (const void *, const void *).  */
+_GL_CXXALIAS_SYS_CAST (scandir, int,
+                       (const char *dir, struct dirent ***namelist,
+                        int (*filter) (const struct dirent *),
+                        int (*cmp) (const struct dirent **, const struct dirent **)));
+_GL_CXXALIASWARN (scandir);
+#elif defined GNULIB_POSIXCHECK
+# undef scandir
+# if HAVE_RAW_DECL_SCANDIR
+_GL_WARN_ON_USE (scandir, "scandir is unportable - "
+                 "use gnulib module scandir for portability");
+# endif
+#endif
+
+#if 0
+/* Compare two 'struct dirent' entries alphabetically.  */
+# if !1
+_GL_FUNCDECL_SYS (alphasort, int,
+                  (const struct dirent **, const struct dirent **)
+                  _GL_ATTRIBUTE_PURE
+                  _GL_ARG_NONNULL ((1, 2)));
+# endif
+/* Need to cast, because on glibc systems, the parameters are
+                       (const void *, const void *).  */
+_GL_CXXALIAS_SYS_CAST (alphasort, int,
+                       (const struct dirent **, const struct dirent **));
+_GL_CXXALIASWARN (alphasort);
+#elif defined GNULIB_POSIXCHECK
+# undef alphasort
+# if HAVE_RAW_DECL_ALPHASORT
+_GL_WARN_ON_USE (alphasort, "alphasort is unportable - "
+                 "use gnulib module alphasort for portability");
+# endif
+#endif
+
+
+#endif /* _GL_DIRENT_H */
+#endif /* _GL_DIRENT_H */
diff --git a/darwin-lib/fcntl.h b/darwin-lib/fcntl.h
index 62f0724..946327e 100644
--- a/darwin-lib/fcntl.h
+++ b/darwin-lib/fcntl.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Like <fcntl.h>, but with non-working flags defined to 0.
 
-   Copyright (C) 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* written by Paul Eggert */
@@ -82,19 +82,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -229,6 +229,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -254,6 +264,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -351,7 +369,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -379,14 +397,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -400,26 +415,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -428,19 +443,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -516,6 +531,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -528,24 +550,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -571,6 +604,12 @@
 _GL_FUNCDECL_RPL (creat, int, (const char *filename, mode_t mode)
                              _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (creat, int, (const char *filename, mode_t mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef creat
+#   define creat _creat
+#  endif
+_GL_CXXALIAS_MDA (creat, int, (const char *filename, mode_t mode));
 # else
 _GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode));
 # endif
@@ -580,6 +619,21 @@
 /* Assume creat is always declared.  */
 _GL_WARN_ON_USE (creat, "creat is not always POSIX compliant - "
                  "use gnulib module creat for portability");
+#elif 1
+/* On native Windows, map 'creat' to '_creat', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::creat always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef creat
+#   define creat _creat
+#  endif
+/* Need to cast, because in mingw the last argument is 'int mode'.  */
+_GL_CXXALIAS_MDA_CAST (creat, int, (const char *filename, mode_t mode));
+# else
+_GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode));
+# endif
+_GL_CXXALIASWARN (creat);
 #endif
 
 #if 1
@@ -590,9 +644,15 @@
 #  endif
 _GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...));
 _GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...));
+#  if !GNULIB_defined_rpl_fcntl
+#   define GNULIB_defined_rpl_fcntl 1
+#  endif
 # else
 #  if !1
 _GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...));
+#   if !GNULIB_defined_fcntl
+#    define GNULIB_defined_fcntl 1
+#   endif
 #  endif
 _GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...));
 # endif
@@ -614,6 +674,12 @@
 _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
                              _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef open
+#   define open _open
+#  endif
+_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
 # else
 _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
 # endif
@@ -627,10 +693,26 @@
 /* Assume open is always declared.  */
 _GL_WARN_ON_USE (open, "open is not always POSIX compliant - "
                  "use gnulib module open for portability");
+#elif 1
+/* On native Windows, map 'open' to '_open', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::open always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef open
+#   define open _open
+#  endif
+_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+# else
+_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+# endif
+# if !defined __hpux
+_GL_CXXALIASWARN (open);
+# endif
 #endif
 
-#if 0
-# if 0
+#if 1
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef openat
 #   define openat rpl_openat
diff --git a/darwin-lib/getopt-cdefs.h b/darwin-lib/getopt-cdefs.h
index 60e3c77..33d7c09 100644
--- a/darwin-lib/getopt-cdefs.h
+++ b/darwin-lib/getopt-cdefs.h
@@ -1,23 +1,22 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* getopt-on-non-glibc compatibility macros.
-   Copyright (C) 1989-2019 Free Software Foundation, Inc.
+   Copyright (C) 1989-2021 Free Software Foundation, Inc.
    This file is part of gnulib.
    Unlike most of the getopt implementation, it is NOT shared
    with the GNU C Library.
 
-   This file is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 3 of
-   the License, or (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This file is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
-   License along with gnulib; if not, see
-   <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GETOPT_CDEFS_H
 #define _GETOPT_CDEFS_H 1
@@ -58,7 +57,7 @@
 #endif
 
 #ifndef __THROW
-# if defined __cplusplus && __GNUC_PREREQ (2,8)
+# if defined __cplusplus && (__GNUC_PREREQ (2,8) || __clang_major__ >= 4)
 #  define __THROW       throw ()
 # else
 #  define __THROW
diff --git a/darwin-lib/getopt.h b/darwin-lib/getopt.h
index 632b49b..2524034 100644
--- a/darwin-lib/getopt.h
+++ b/darwin-lib/getopt.h
@@ -1,23 +1,23 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Declarations for getopt.
-   Copyright (C) 1989-2019 Free Software Foundation, Inc.
+   Copyright (C) 1989-2021 Free Software Foundation, Inc.
    This file is part of gnulib.
    Unlike most of the getopt implementation, it is NOT shared
    with the GNU C Library, which supplies a different version of
    this file.
 
-   This file is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 3 of
-   the License, or (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This file is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
-   License along with gnulib; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_GETOPT_H
 
@@ -55,26 +55,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
diff --git a/darwin-lib/inttypes.h b/darwin-lib/inttypes.h
index 9c46e85..8c933a9 100644
--- a/darwin-lib/inttypes.h
+++ b/darwin-lib/inttypes.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
-/* Copyright (C) 2006-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2006-2021 Free Software Foundation, Inc.
    Written by Paul Eggert, Bruno Haible, Derek Price.
    This file is part of gnulib.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /*
@@ -39,6 +39,8 @@
 #  endif
 
 #  include_next <inttypes.h>
+
+#  define _GL_FINISHED_INCLUDING_SYSTEM_INTTYPES_H
 # endif
 #endif
 
@@ -63,19 +65,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -210,6 +212,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -235,6 +247,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -332,7 +352,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -360,14 +380,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -381,26 +398,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -409,19 +426,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -497,6 +514,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -509,24 +533,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -550,110 +585,92 @@
 # define _LONG_LONG_FORMAT_PREFIX "ll"
 #endif
 
-#if !defined PRId8 || 0
-# undef PRId8
+#if !defined PRId8
 # ifdef INT8_MAX
 #  define PRId8 "d"
 # endif
 #endif
-#if !defined PRIi8 || 0
-# undef PRIi8
+#if !defined PRIi8
 # ifdef INT8_MAX
 #  define PRIi8 "i"
 # endif
 #endif
-#if !defined PRIo8 || 0
-# undef PRIo8
+#if !defined PRIo8
 # ifdef UINT8_MAX
 #  define PRIo8 "o"
 # endif
 #endif
-#if !defined PRIu8 || 0
-# undef PRIu8
+#if !defined PRIu8
 # ifdef UINT8_MAX
 #  define PRIu8 "u"
 # endif
 #endif
-#if !defined PRIx8 || 0
-# undef PRIx8
+#if !defined PRIx8
 # ifdef UINT8_MAX
 #  define PRIx8 "x"
 # endif
 #endif
-#if !defined PRIX8 || 0
-# undef PRIX8
+#if !defined PRIX8
 # ifdef UINT8_MAX
 #  define PRIX8 "X"
 # endif
 #endif
-#if !defined PRId16 || 0
-# undef PRId16
+#if !defined PRId16
 # ifdef INT16_MAX
 #  define PRId16 "d"
 # endif
 #endif
-#if !defined PRIi16 || 0
-# undef PRIi16
+#if !defined PRIi16
 # ifdef INT16_MAX
 #  define PRIi16 "i"
 # endif
 #endif
-#if !defined PRIo16 || 0
-# undef PRIo16
+#if !defined PRIo16
 # ifdef UINT16_MAX
 #  define PRIo16 "o"
 # endif
 #endif
-#if !defined PRIu16 || 0
-# undef PRIu16
+#if !defined PRIu16
 # ifdef UINT16_MAX
 #  define PRIu16 "u"
 # endif
 #endif
-#if !defined PRIx16 || 0
-# undef PRIx16
+#if !defined PRIx16
 # ifdef UINT16_MAX
 #  define PRIx16 "x"
 # endif
 #endif
-#if !defined PRIX16 || 0
-# undef PRIX16
+#if !defined PRIX16
 # ifdef UINT16_MAX
 #  define PRIX16 "X"
 # endif
 #endif
-#if !defined PRId32 || 0
-# undef PRId32
+#if !defined PRId32
 # ifdef INT32_MAX
 #  define PRId32 "d"
 # endif
 #endif
-#if !defined PRIi32 || 0
-# undef PRIi32
+#if !defined PRIi32
 # ifdef INT32_MAX
 #  define PRIi32 "i"
 # endif
 #endif
-#if !defined PRIo32 || 0
-# undef PRIo32
+#if !defined PRIo32
 # ifdef UINT32_MAX
 #  define PRIo32 "o"
 # endif
 #endif
-#if !defined PRIu32 || 0
-# undef PRIu32
+#if !defined PRIu32
 # ifdef UINT32_MAX
 #  define PRIu32 "u"
 # endif
 #endif
-#if !defined PRIx32 || 0
-# undef PRIx32
+#if !defined PRIx32
 # ifdef UINT32_MAX
 #  define PRIx32 "x"
 # endif
 #endif
-#if !defined PRIX32 || 0
-# undef PRIX32
+#if !defined PRIX32
 # ifdef UINT32_MAX
 #  define PRIX32 "X"
 # endif
@@ -663,15 +680,13 @@
 #  define _PRI64_PREFIX "l"
 # elif defined _MSC_VER || defined __MINGW32__
 #  define _PRI64_PREFIX "I64"
-# elif 1 && LONG_MAX >> 30 == 1
+# elif LONG_MAX >> 30 == 1
 #  define _PRI64_PREFIX _LONG_LONG_FORMAT_PREFIX
 # endif
-# if !defined PRId64 || 0
-#  undef PRId64
+# if !defined PRId64
 #  define PRId64 _PRI64_PREFIX "d"
 # endif
-# if !defined PRIi64 || 0
-#  undef PRIi64
+# if !defined PRIi64
 #  define PRIi64 _PRI64_PREFIX "i"
 # endif
 #endif
@@ -680,266 +695,220 @@
 #  define _PRIu64_PREFIX "l"
 # elif defined _MSC_VER || defined __MINGW32__
 #  define _PRIu64_PREFIX "I64"
-# elif 1 && ULONG_MAX >> 31 == 1
+# elif ULONG_MAX >> 31 == 1
 #  define _PRIu64_PREFIX _LONG_LONG_FORMAT_PREFIX
 # endif
-# if !defined PRIo64 || 0
-#  undef PRIo64
+# if !defined PRIo64
 #  define PRIo64 _PRIu64_PREFIX "o"
 # endif
-# if !defined PRIu64 || 0
-#  undef PRIu64
+# if !defined PRIu64
 #  define PRIu64 _PRIu64_PREFIX "u"
 # endif
-# if !defined PRIx64 || 0
-#  undef PRIx64
+# if !defined PRIx64
 #  define PRIx64 _PRIu64_PREFIX "x"
 # endif
-# if !defined PRIX64 || 0
-#  undef PRIX64
+# if !defined PRIX64
 #  define PRIX64 _PRIu64_PREFIX "X"
 # endif
 #endif
 
-#if !defined PRIdLEAST8 || 0
-# undef PRIdLEAST8
+#if !defined PRIdLEAST8
 # define PRIdLEAST8 "d"
 #endif
-#if !defined PRIiLEAST8 || 0
-# undef PRIiLEAST8
+#if !defined PRIiLEAST8
 # define PRIiLEAST8 "i"
 #endif
-#if !defined PRIoLEAST8 || 0
-# undef PRIoLEAST8
+#if !defined PRIoLEAST8
 # define PRIoLEAST8 "o"
 #endif
-#if !defined PRIuLEAST8 || 0
-# undef PRIuLEAST8
+#if !defined PRIuLEAST8
 # define PRIuLEAST8 "u"
 #endif
-#if !defined PRIxLEAST8 || 0
-# undef PRIxLEAST8
+#if !defined PRIxLEAST8
 # define PRIxLEAST8 "x"
 #endif
-#if !defined PRIXLEAST8 || 0
-# undef PRIXLEAST8
+#if !defined PRIXLEAST8
 # define PRIXLEAST8 "X"
 #endif
-#if !defined PRIdLEAST16 || 0
-# undef PRIdLEAST16
+#if !defined PRIdLEAST16
 # define PRIdLEAST16 "d"
 #endif
-#if !defined PRIiLEAST16 || 0
-# undef PRIiLEAST16
+#if !defined PRIiLEAST16
 # define PRIiLEAST16 "i"
 #endif
-#if !defined PRIoLEAST16 || 0
-# undef PRIoLEAST16
+#if !defined PRIoLEAST16
 # define PRIoLEAST16 "o"
 #endif
-#if !defined PRIuLEAST16 || 0
-# undef PRIuLEAST16
+#if !defined PRIuLEAST16
 # define PRIuLEAST16 "u"
 #endif
-#if !defined PRIxLEAST16 || 0
-# undef PRIxLEAST16
+#if !defined PRIxLEAST16
 # define PRIxLEAST16 "x"
 #endif
-#if !defined PRIXLEAST16 || 0
-# undef PRIXLEAST16
+#if !defined PRIXLEAST16
 # define PRIXLEAST16 "X"
 #endif
-#if !defined PRIdLEAST32 || 0
-# undef PRIdLEAST32
+#if !defined PRIdLEAST32
 # define PRIdLEAST32 "d"
 #endif
-#if !defined PRIiLEAST32 || 0
-# undef PRIiLEAST32
+#if !defined PRIiLEAST32
 # define PRIiLEAST32 "i"
 #endif
-#if !defined PRIoLEAST32 || 0
-# undef PRIoLEAST32
+#if !defined PRIoLEAST32
 # define PRIoLEAST32 "o"
 #endif
-#if !defined PRIuLEAST32 || 0
-# undef PRIuLEAST32
+#if !defined PRIuLEAST32
 # define PRIuLEAST32 "u"
 #endif
-#if !defined PRIxLEAST32 || 0
-# undef PRIxLEAST32
+#if !defined PRIxLEAST32
 # define PRIxLEAST32 "x"
 #endif
-#if !defined PRIXLEAST32 || 0
-# undef PRIXLEAST32
+#if !defined PRIXLEAST32
 # define PRIXLEAST32 "X"
 #endif
 #ifdef INT64_MAX
-# if !defined PRIdLEAST64 || 0
-#  undef PRIdLEAST64
+# if !defined PRIdLEAST64
 #  define PRIdLEAST64 PRId64
 # endif
-# if !defined PRIiLEAST64 || 0
-#  undef PRIiLEAST64
+# if !defined PRIiLEAST64
 #  define PRIiLEAST64 PRIi64
 # endif
 #endif
 #ifdef UINT64_MAX
-# if !defined PRIoLEAST64 || 0
-#  undef PRIoLEAST64
+# if !defined PRIoLEAST64
 #  define PRIoLEAST64 PRIo64
 # endif
-# if !defined PRIuLEAST64 || 0
-#  undef PRIuLEAST64
+# if !defined PRIuLEAST64
 #  define PRIuLEAST64 PRIu64
 # endif
-# if !defined PRIxLEAST64 || 0
-#  undef PRIxLEAST64
+# if !defined PRIxLEAST64
 #  define PRIxLEAST64 PRIx64
 # endif
-# if !defined PRIXLEAST64 || 0
-#  undef PRIXLEAST64
+# if !defined PRIXLEAST64
 #  define PRIXLEAST64 PRIX64
 # endif
 #endif
 
-#if !defined PRIdFAST8 || 0
-# undef PRIdFAST8
+#if !defined PRIdFAST8
 # if INT_FAST8_MAX > INT32_MAX
 #  define PRIdFAST8 PRId64
 # else
 #  define PRIdFAST8 "d"
 # endif
 #endif
-#if !defined PRIiFAST8 || 0
-# undef PRIiFAST8
+#if !defined PRIiFAST8
 # if INT_FAST8_MAX > INT32_MAX
 #  define PRIiFAST8 PRIi64
 # else
 #  define PRIiFAST8 "i"
 # endif
 #endif
-#if !defined PRIoFAST8 || 0
-# undef PRIoFAST8
+#if !defined PRIoFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define PRIoFAST8 PRIo64
 # else
 #  define PRIoFAST8 "o"
 # endif
 #endif
-#if !defined PRIuFAST8 || 0
-# undef PRIuFAST8
+#if !defined PRIuFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define PRIuFAST8 PRIu64
 # else
 #  define PRIuFAST8 "u"
 # endif
 #endif
-#if !defined PRIxFAST8 || 0
-# undef PRIxFAST8
+#if !defined PRIxFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define PRIxFAST8 PRIx64
 # else
 #  define PRIxFAST8 "x"
 # endif
 #endif
-#if !defined PRIXFAST8 || 0
-# undef PRIXFAST8
+#if !defined PRIXFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define PRIXFAST8 PRIX64
 # else
 #  define PRIXFAST8 "X"
 # endif
 #endif
-#if !defined PRIdFAST16 || 0
-# undef PRIdFAST16
+#if !defined PRIdFAST16
 # if INT_FAST16_MAX > INT32_MAX
 #  define PRIdFAST16 PRId64
 # else
 #  define PRIdFAST16 "d"
 # endif
 #endif
-#if !defined PRIiFAST16 || 0
-# undef PRIiFAST16
+#if !defined PRIiFAST16
 # if INT_FAST16_MAX > INT32_MAX
 #  define PRIiFAST16 PRIi64
 # else
 #  define PRIiFAST16 "i"
 # endif
 #endif
-#if !defined PRIoFAST16 || 0
-# undef PRIoFAST16
+#if !defined PRIoFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define PRIoFAST16 PRIo64
 # else
 #  define PRIoFAST16 "o"
 # endif
 #endif
-#if !defined PRIuFAST16 || 0
-# undef PRIuFAST16
+#if !defined PRIuFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define PRIuFAST16 PRIu64
 # else
 #  define PRIuFAST16 "u"
 # endif
 #endif
-#if !defined PRIxFAST16 || 0
-# undef PRIxFAST16
+#if !defined PRIxFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define PRIxFAST16 PRIx64
 # else
 #  define PRIxFAST16 "x"
 # endif
 #endif
-#if !defined PRIXFAST16 || 0
-# undef PRIXFAST16
+#if !defined PRIXFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define PRIXFAST16 PRIX64
 # else
 #  define PRIXFAST16 "X"
 # endif
 #endif
-#if !defined PRIdFAST32 || 0
-# undef PRIdFAST32
+#if !defined PRIdFAST32
 # if INT_FAST32_MAX > INT32_MAX
 #  define PRIdFAST32 PRId64
 # else
 #  define PRIdFAST32 "d"
 # endif
 #endif
-#if !defined PRIiFAST32 || 0
-# undef PRIiFAST32
+#if !defined PRIiFAST32
 # if INT_FAST32_MAX > INT32_MAX
 #  define PRIiFAST32 PRIi64
 # else
 #  define PRIiFAST32 "i"
 # endif
 #endif
-#if !defined PRIoFAST32 || 0
-# undef PRIoFAST32
+#if !defined PRIoFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define PRIoFAST32 PRIo64
 # else
 #  define PRIoFAST32 "o"
 # endif
 #endif
-#if !defined PRIuFAST32 || 0
-# undef PRIuFAST32
+#if !defined PRIuFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define PRIuFAST32 PRIu64
 # else
 #  define PRIuFAST32 "u"
 # endif
 #endif
-#if !defined PRIxFAST32 || 0
-# undef PRIxFAST32
+#if !defined PRIxFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define PRIxFAST32 PRIx64
 # else
 #  define PRIxFAST32 "x"
 # endif
 #endif
-#if !defined PRIXFAST32 || 0
-# undef PRIXFAST32
+#if !defined PRIXFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define PRIXFAST32 PRIX64
 # else
@@ -947,76 +916,64 @@
 # endif
 #endif
 #ifdef INT64_MAX
-# if !defined PRIdFAST64 || 0
-#  undef PRIdFAST64
+# if !defined PRIdFAST64
 #  define PRIdFAST64 PRId64
 # endif
-# if !defined PRIiFAST64 || 0
-#  undef PRIiFAST64
+# if !defined PRIiFAST64
 #  define PRIiFAST64 PRIi64
 # endif
 #endif
 #ifdef UINT64_MAX
-# if !defined PRIoFAST64 || 0
-#  undef PRIoFAST64
+# if !defined PRIoFAST64
 #  define PRIoFAST64 PRIo64
 # endif
-# if !defined PRIuFAST64 || 0
-#  undef PRIuFAST64
+# if !defined PRIuFAST64
 #  define PRIuFAST64 PRIu64
 # endif
-# if !defined PRIxFAST64 || 0
-#  undef PRIxFAST64
+# if !defined PRIxFAST64
 #  define PRIxFAST64 PRIx64
 # endif
-# if !defined PRIXFAST64 || 0
-#  undef PRIXFAST64
+# if !defined PRIXFAST64
 #  define PRIXFAST64 PRIX64
 # endif
 #endif
 
-#if !defined PRIdMAX || 0
-# undef PRIdMAX
+#if !defined PRIdMAX
 # if 1
 #  define PRIdMAX PRId64
 # else
 #  define PRIdMAX "ld"
 # endif
 #endif
-#if !defined PRIiMAX || 0
-# undef PRIiMAX
+#if !defined PRIiMAX
 # if 1
 #  define PRIiMAX PRIi64
 # else
 #  define PRIiMAX "li"
 # endif
 #endif
-#if !defined PRIoMAX || 0
-# undef PRIoMAX
+#if !defined PRIoMAX
 # if 1
 #  define PRIoMAX PRIo64
 # else
 #  define PRIoMAX "lo"
 # endif
 #endif
-#if !defined PRIuMAX || 0
-# undef PRIuMAX
+#if !defined PRIuMAX
 # if 1
 #  define PRIuMAX PRIu64
 # else
 #  define PRIuMAX "lu"
 # endif
 #endif
-#if !defined PRIxMAX || 0
-# undef PRIxMAX
+#if !defined PRIxMAX
 # if 1
 #  define PRIxMAX PRIx64
 # else
 #  define PRIxMAX "lx"
 # endif
 #endif
-#if !defined PRIXMAX || 0
-# undef PRIXMAX
+#if !defined PRIXMAX
 # if 1
 #  define PRIXMAX PRIX64
 # else
@@ -1024,129 +981,108 @@
 # endif
 #endif
 
-#if !defined PRIdPTR || 0
-# undef PRIdPTR
+#if !defined PRIdPTR
 # ifdef INTPTR_MAX
 #  define PRIdPTR "l" "d"
 # endif
 #endif
-#if !defined PRIiPTR || 0
-# undef PRIiPTR
+#if !defined PRIiPTR
 # ifdef INTPTR_MAX
 #  define PRIiPTR "l" "i"
 # endif
 #endif
-#if !defined PRIoPTR || 0
-# undef PRIoPTR
+#if !defined PRIoPTR
 # ifdef UINTPTR_MAX
 #  define PRIoPTR "l" "o"
 # endif
 #endif
-#if !defined PRIuPTR || 0
-# undef PRIuPTR
+#if !defined PRIuPTR
 # ifdef UINTPTR_MAX
 #  define PRIuPTR "l" "u"
 # endif
 #endif
-#if !defined PRIxPTR || 0
-# undef PRIxPTR
+#if !defined PRIxPTR
 # ifdef UINTPTR_MAX
 #  define PRIxPTR "l" "x"
 # endif
 #endif
-#if !defined PRIXPTR || 0
-# undef PRIXPTR
+#if !defined PRIXPTR
 # ifdef UINTPTR_MAX
 #  define PRIXPTR "l" "X"
 # endif
 #endif
 
-#if !defined SCNd8 || 0
-# undef SCNd8
+#if !defined SCNd8
 # ifdef INT8_MAX
 #  define SCNd8 "hhd"
 # endif
 #endif
-#if !defined SCNi8 || 0
-# undef SCNi8
+#if !defined SCNi8
 # ifdef INT8_MAX
 #  define SCNi8 "hhi"
 # endif
 #endif
-#if !defined SCNo8 || 0
-# undef SCNo8
+#if !defined SCNo8
 # ifdef UINT8_MAX
 #  define SCNo8 "hho"
 # endif
 #endif
-#if !defined SCNu8 || 0
-# undef SCNu8
+#if !defined SCNu8
 # ifdef UINT8_MAX
 #  define SCNu8 "hhu"
 # endif
 #endif
-#if !defined SCNx8 || 0
-# undef SCNx8
+#if !defined SCNx8
 # ifdef UINT8_MAX
 #  define SCNx8 "hhx"
 # endif
 #endif
-#if !defined SCNd16 || 0
-# undef SCNd16
+#if !defined SCNd16
 # ifdef INT16_MAX
 #  define SCNd16 "hd"
 # endif
 #endif
-#if !defined SCNi16 || 0
-# undef SCNi16
+#if !defined SCNi16
 # ifdef INT16_MAX
 #  define SCNi16 "hi"
 # endif
 #endif
-#if !defined SCNo16 || 0
-# undef SCNo16
+#if !defined SCNo16
 # ifdef UINT16_MAX
 #  define SCNo16 "ho"
 # endif
 #endif
-#if !defined SCNu16 || 0
-# undef SCNu16
+#if !defined SCNu16
 # ifdef UINT16_MAX
 #  define SCNu16 "hu"
 # endif
 #endif
-#if !defined SCNx16 || 0
-# undef SCNx16
+#if !defined SCNx16
 # ifdef UINT16_MAX
 #  define SCNx16 "hx"
 # endif
 #endif
-#if !defined SCNd32 || 0
-# undef SCNd32
+#if !defined SCNd32
 # ifdef INT32_MAX
 #  define SCNd32 "d"
 # endif
 #endif
-#if !defined SCNi32 || 0
-# undef SCNi32
+#if !defined SCNi32
 # ifdef INT32_MAX
 #  define SCNi32 "i"
 # endif
 #endif
-#if !defined SCNo32 || 0
-# undef SCNo32
+#if !defined SCNo32
 # ifdef UINT32_MAX
 #  define SCNo32 "o"
 # endif
 #endif
-#if !defined SCNu32 || 0
-# undef SCNu32
+#if !defined SCNu32
 # ifdef UINT32_MAX
 #  define SCNu32 "u"
 # endif
 #endif
-#if !defined SCNx32 || 0
-# undef SCNx32
+#if !defined SCNx32
 # ifdef UINT32_MAX
 #  define SCNx32 "x"
 # endif
@@ -1156,15 +1092,13 @@
 #  define _SCN64_PREFIX "l"
 # elif defined _MSC_VER || defined __MINGW32__
 #  define _SCN64_PREFIX "I64"
-# elif 1 && LONG_MAX >> 30 == 1
+# elif LONG_MAX >> 30 == 1
 #  define _SCN64_PREFIX _LONG_LONG_FORMAT_PREFIX
 # endif
-# if !defined SCNd64 || 0
-#  undef SCNd64
+# if !defined SCNd64
 #  define SCNd64 _SCN64_PREFIX "d"
 # endif
-# if !defined SCNi64 || 0
-#  undef SCNi64
+# if !defined SCNi64
 #  define SCNi64 _SCN64_PREFIX "i"
 # endif
 #endif
@@ -1173,110 +1107,86 @@
 #  define _SCNu64_PREFIX "l"
 # elif defined _MSC_VER || defined __MINGW32__
 #  define _SCNu64_PREFIX "I64"
-# elif 1 && ULONG_MAX >> 31 == 1
+# elif ULONG_MAX >> 31 == 1
 #  define _SCNu64_PREFIX _LONG_LONG_FORMAT_PREFIX
 # endif
-# if !defined SCNo64 || 0
-#  undef SCNo64
+# if !defined SCNo64
 #  define SCNo64 _SCNu64_PREFIX "o"
 # endif
-# if !defined SCNu64 || 0
-#  undef SCNu64
+# if !defined SCNu64
 #  define SCNu64 _SCNu64_PREFIX "u"
 # endif
-# if !defined SCNx64 || 0
-#  undef SCNx64
+# if !defined SCNx64
 #  define SCNx64 _SCNu64_PREFIX "x"
 # endif
 #endif
 
-#if !defined SCNdLEAST8 || 0
-# undef SCNdLEAST8
+#if !defined SCNdLEAST8
 # define SCNdLEAST8 "hhd"
 #endif
-#if !defined SCNiLEAST8 || 0
-# undef SCNiLEAST8
+#if !defined SCNiLEAST8
 # define SCNiLEAST8 "hhi"
 #endif
-#if !defined SCNoLEAST8 || 0
-# undef SCNoLEAST8
+#if !defined SCNoLEAST8
 # define SCNoLEAST8 "hho"
 #endif
-#if !defined SCNuLEAST8 || 0
-# undef SCNuLEAST8
+#if !defined SCNuLEAST8
 # define SCNuLEAST8 "hhu"
 #endif
-#if !defined SCNxLEAST8 || 0
-# undef SCNxLEAST8
+#if !defined SCNxLEAST8
 # define SCNxLEAST8 "hhx"
 #endif
-#if !defined SCNdLEAST16 || 0
-# undef SCNdLEAST16
+#if !defined SCNdLEAST16
 # define SCNdLEAST16 "hd"
 #endif
-#if !defined SCNiLEAST16 || 0
-# undef SCNiLEAST16
+#if !defined SCNiLEAST16
 # define SCNiLEAST16 "hi"
 #endif
-#if !defined SCNoLEAST16 || 0
-# undef SCNoLEAST16
+#if !defined SCNoLEAST16
 # define SCNoLEAST16 "ho"
 #endif
-#if !defined SCNuLEAST16 || 0
-# undef SCNuLEAST16
+#if !defined SCNuLEAST16
 # define SCNuLEAST16 "hu"
 #endif
-#if !defined SCNxLEAST16 || 0
-# undef SCNxLEAST16
+#if !defined SCNxLEAST16
 # define SCNxLEAST16 "hx"
 #endif
-#if !defined SCNdLEAST32 || 0
-# undef SCNdLEAST32
+#if !defined SCNdLEAST32
 # define SCNdLEAST32 "d"
 #endif
-#if !defined SCNiLEAST32 || 0
-# undef SCNiLEAST32
+#if !defined SCNiLEAST32
 # define SCNiLEAST32 "i"
 #endif
-#if !defined SCNoLEAST32 || 0
-# undef SCNoLEAST32
+#if !defined SCNoLEAST32
 # define SCNoLEAST32 "o"
 #endif
-#if !defined SCNuLEAST32 || 0
-# undef SCNuLEAST32
+#if !defined SCNuLEAST32
 # define SCNuLEAST32 "u"
 #endif
-#if !defined SCNxLEAST32 || 0
-# undef SCNxLEAST32
+#if !defined SCNxLEAST32
 # define SCNxLEAST32 "x"
 #endif
 #ifdef INT64_MAX
-# if !defined SCNdLEAST64 || 0
-#  undef SCNdLEAST64
+# if !defined SCNdLEAST64
 #  define SCNdLEAST64 SCNd64
 # endif
-# if !defined SCNiLEAST64 || 0
-#  undef SCNiLEAST64
+# if !defined SCNiLEAST64
 #  define SCNiLEAST64 SCNi64
 # endif
 #endif
 #ifdef UINT64_MAX
-# if !defined SCNoLEAST64 || 0
-#  undef SCNoLEAST64
+# if !defined SCNoLEAST64
 #  define SCNoLEAST64 SCNo64
 # endif
-# if !defined SCNuLEAST64 || 0
-#  undef SCNuLEAST64
+# if !defined SCNuLEAST64
 #  define SCNuLEAST64 SCNu64
 # endif
-# if !defined SCNxLEAST64 || 0
-#  undef SCNxLEAST64
+# if !defined SCNxLEAST64
 #  define SCNxLEAST64 SCNx64
 # endif
 #endif
 
-#if !defined SCNdFAST8 || 0
-# undef SCNdFAST8
+#if !defined SCNdFAST8
 # if INT_FAST8_MAX > INT32_MAX
 #  define SCNdFAST8 SCNd64
 # elif INT_FAST8_MAX == 0x7fff
@@ -1287,8 +1197,7 @@
 #  define SCNdFAST8 "d"
 # endif
 #endif
-#if !defined SCNiFAST8 || 0
-# undef SCNiFAST8
+#if !defined SCNiFAST8
 # if INT_FAST8_MAX > INT32_MAX
 #  define SCNiFAST8 SCNi64
 # elif INT_FAST8_MAX == 0x7fff
@@ -1299,8 +1208,7 @@
 #  define SCNiFAST8 "i"
 # endif
 #endif
-#if !defined SCNoFAST8 || 0
-# undef SCNoFAST8
+#if !defined SCNoFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define SCNoFAST8 SCNo64
 # elif UINT_FAST8_MAX == 0xffff
@@ -1311,8 +1219,7 @@
 #  define SCNoFAST8 "o"
 # endif
 #endif
-#if !defined SCNuFAST8 || 0
-# undef SCNuFAST8
+#if !defined SCNuFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define SCNuFAST8 SCNu64
 # elif UINT_FAST8_MAX == 0xffff
@@ -1323,8 +1230,7 @@
 #  define SCNuFAST8 "u"
 # endif
 #endif
-#if !defined SCNxFAST8 || 0
-# undef SCNxFAST8
+#if !defined SCNxFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define SCNxFAST8 SCNx64
 # elif UINT_FAST8_MAX == 0xffff
@@ -1335,8 +1241,7 @@
 #  define SCNxFAST8 "x"
 # endif
 #endif
-#if !defined SCNdFAST16 || 0
-# undef SCNdFAST16
+#if !defined SCNdFAST16
 # if INT_FAST16_MAX > INT32_MAX
 #  define SCNdFAST16 SCNd64
 # elif INT_FAST16_MAX == 0x7fff
@@ -1345,8 +1250,7 @@
 #  define SCNdFAST16 "d"
 # endif
 #endif
-#if !defined SCNiFAST16 || 0
-# undef SCNiFAST16
+#if !defined SCNiFAST16
 # if INT_FAST16_MAX > INT32_MAX
 #  define SCNiFAST16 SCNi64
 # elif INT_FAST16_MAX == 0x7fff
@@ -1355,8 +1259,7 @@
 #  define SCNiFAST16 "i"
 # endif
 #endif
-#if !defined SCNoFAST16 || 0
-# undef SCNoFAST16
+#if !defined SCNoFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define SCNoFAST16 SCNo64
 # elif UINT_FAST16_MAX == 0xffff
@@ -1365,8 +1268,7 @@
 #  define SCNoFAST16 "o"
 # endif
 #endif
-#if !defined SCNuFAST16 || 0
-# undef SCNuFAST16
+#if !defined SCNuFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define SCNuFAST16 SCNu64
 # elif UINT_FAST16_MAX == 0xffff
@@ -1375,8 +1277,7 @@
 #  define SCNuFAST16 "u"
 # endif
 #endif
-#if !defined SCNxFAST16 || 0
-# undef SCNxFAST16
+#if !defined SCNxFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define SCNxFAST16 SCNx64
 # elif UINT_FAST16_MAX == 0xffff
@@ -1385,40 +1286,35 @@
 #  define SCNxFAST16 "x"
 # endif
 #endif
-#if !defined SCNdFAST32 || 0
-# undef SCNdFAST32
+#if !defined SCNdFAST32
 # if INT_FAST32_MAX > INT32_MAX
 #  define SCNdFAST32 SCNd64
 # else
 #  define SCNdFAST32 "d"
 # endif
 #endif
-#if !defined SCNiFAST32 || 0
-# undef SCNiFAST32
+#if !defined SCNiFAST32
 # if INT_FAST32_MAX > INT32_MAX
 #  define SCNiFAST32 SCNi64
 # else
 #  define SCNiFAST32 "i"
 # endif
 #endif
-#if !defined SCNoFAST32 || 0
-# undef SCNoFAST32
+#if !defined SCNoFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define SCNoFAST32 SCNo64
 # else
 #  define SCNoFAST32 "o"
 # endif
 #endif
-#if !defined SCNuFAST32 || 0
-# undef SCNuFAST32
+#if !defined SCNuFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define SCNuFAST32 SCNu64
 # else
 #  define SCNuFAST32 "u"
 # endif
 #endif
-#if !defined SCNxFAST32 || 0
-# undef SCNxFAST32
+#if !defined SCNxFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define SCNxFAST32 SCNx64
 # else
@@ -1426,64 +1322,54 @@
 # endif
 #endif
 #ifdef INT64_MAX
-# if !defined SCNdFAST64 || 0
-#  undef SCNdFAST64
+# if !defined SCNdFAST64
 #  define SCNdFAST64 SCNd64
 # endif
-# if !defined SCNiFAST64 || 0
-#  undef SCNiFAST64
+# if !defined SCNiFAST64
 #  define SCNiFAST64 SCNi64
 # endif
 #endif
 #ifdef UINT64_MAX
-# if !defined SCNoFAST64 || 0
-#  undef SCNoFAST64
+# if !defined SCNoFAST64
 #  define SCNoFAST64 SCNo64
 # endif
-# if !defined SCNuFAST64 || 0
-#  undef SCNuFAST64
+# if !defined SCNuFAST64
 #  define SCNuFAST64 SCNu64
 # endif
-# if !defined SCNxFAST64 || 0
-#  undef SCNxFAST64
+# if !defined SCNxFAST64
 #  define SCNxFAST64 SCNx64
 # endif
 #endif
 
-#if !defined SCNdMAX || 0
-# undef SCNdMAX
+#if !defined SCNdMAX
 # if 1
 #  define SCNdMAX SCNd64
 # else
 #  define SCNdMAX "ld"
 # endif
 #endif
-#if !defined SCNiMAX || 0
-# undef SCNiMAX
+#if !defined SCNiMAX
 # if 1
 #  define SCNiMAX SCNi64
 # else
 #  define SCNiMAX "li"
 # endif
 #endif
-#if !defined SCNoMAX || 0
-# undef SCNoMAX
+#if !defined SCNoMAX
 # if 1
 #  define SCNoMAX SCNo64
 # else
 #  define SCNoMAX "lo"
 # endif
 #endif
-#if !defined SCNuMAX || 0
-# undef SCNuMAX
+#if !defined SCNuMAX
 # if 1
 #  define SCNuMAX SCNu64
 # else
 #  define SCNuMAX "lu"
 # endif
 #endif
-#if !defined SCNxMAX || 0
-# undef SCNxMAX
+#if !defined SCNxMAX
 # if 1
 #  define SCNxMAX SCNx64
 # else
@@ -1491,32 +1377,27 @@
 # endif
 #endif
 
-#if !defined SCNdPTR || 0
-# undef SCNdPTR
+#if !defined SCNdPTR
 # ifdef INTPTR_MAX
 #  define SCNdPTR "l" "d"
 # endif
 #endif
-#if !defined SCNiPTR || 0
-# undef SCNiPTR
+#if !defined SCNiPTR
 # ifdef INTPTR_MAX
 #  define SCNiPTR "l" "i"
 # endif
 #endif
-#if !defined SCNoPTR || 0
-# undef SCNoPTR
+#if !defined SCNoPTR
 # ifdef UINTPTR_MAX
 #  define SCNoPTR "l" "o"
 # endif
 #endif
-#if !defined SCNuPTR || 0
-# undef SCNuPTR
+#if !defined SCNuPTR
 # ifdef UINTPTR_MAX
 #  define SCNuPTR "l" "u"
 # endif
 #endif
-#if !defined SCNxPTR || 0
-# undef SCNxPTR
+#if !defined SCNxPTR
 # ifdef UINTPTR_MAX
 #  define SCNxPTR "l" "x"
 # endif
@@ -1565,15 +1446,19 @@
 #   define strtoimax rpl_strtoimax
 #  endif
 _GL_FUNCDECL_RPL (strtoimax, intmax_t,
-                  (const char *, char **, int) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtoimax, intmax_t, (const char *, char **, int));
+                  (const char *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoimax, intmax_t,
+                  (const char *restrict, char **restrict, int));
 # else
 #  if !1
 #   undef strtoimax
 _GL_FUNCDECL_SYS (strtoimax, intmax_t,
-                  (const char *, char **, int) _GL_ARG_NONNULL ((1)));
+                  (const char *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (strtoimax, intmax_t, (const char *, char **, int));
+_GL_CXXALIAS_SYS (strtoimax, intmax_t,
+                  (const char *restrict, char **restrict, int));
 # endif
 _GL_CXXALIASWARN (strtoimax);
 #elif defined GNULIB_POSIXCHECK
@@ -1591,15 +1476,19 @@
 #   define strtoumax rpl_strtoumax
 #  endif
 _GL_FUNCDECL_RPL (strtoumax, uintmax_t,
-                  (const char *, char **, int) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtoumax, uintmax_t, (const char *, char **, int));
+                  (const char *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoumax, uintmax_t,
+                  (const char *restrict, char **restrict, int));
 # else
 #  if !1
 #   undef strtoumax
 _GL_FUNCDECL_SYS (strtoumax, uintmax_t,
-                  (const char *, char **, int) _GL_ARG_NONNULL ((1)));
+                  (const char *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (strtoumax, uintmax_t, (const char *, char **, int));
+_GL_CXXALIAS_SYS (strtoumax, uintmax_t,
+                  (const char *restrict, char **restrict, int));
 # endif
 _GL_CXXALIASWARN (strtoumax);
 #elif defined GNULIB_POSIXCHECK
diff --git a/darwin-lib/limits.h b/darwin-lib/limits.h
index 6fea064..bf2dca2 100644
--- a/darwin-lib/limits.h
+++ b/darwin-lib/limits.h
@@ -1,31 +1,47 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <limits.h>.
 
-   Copyright 2016-2019 Free Software Foundation, Inc.
+   Copyright 2016-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License
-   as published by the Free Software Foundation; either version 3, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
-
-#ifndef _GL_LIMITS_H
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 #pragma GCC system_header
 #endif
 
 
-/* The include_next requires a split double-inclusion guard.  */
+#if defined _GL_ALREADY_INCLUDING_LIMITS_H
+/* Special invocation convention:
+   On Haiku/x86_64, we have a sequence of nested includes
+   <limits.h> -> <syslimits.h> -> <limits.h>.
+   In this situation, LONG_MAX and INT_MAX are not yet defined,
+   therefore we should not attempt to define LONG_BIT.  */
+
 #include_next <limits.h>
 
+#else
+/* Normal invocation convention.  */
+
+#ifndef _GL_LIMITS_H
+
+# define _GL_ALREADY_INCLUDING_LIMITS_H
+
+/* The include_next requires a split double-inclusion guard.  */
+# include_next <limits.h>
+
+# undef _GL_ALREADY_INCLUDING_LIMITS_H
+
 #ifndef _GL_LIMITS_H
 #define _GL_LIMITS_H
 
@@ -84,10 +100,11 @@
 # endif
 #endif
 
-/* Macros specified by ISO/IEC TS 18661-1:2014.  */
+/* Macros specified by C2x and by ISO/IEC TS 18661-1:2014.  */
 
 #if (! defined ULLONG_WIDTH                                             \
-     && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__))
+     && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__ \
+         || (defined __STDC_VERSION__ && 201710 < __STDC_VERSION__)))
 # define CHAR_WIDTH _GL_INTEGER_WIDTH (CHAR_MIN, CHAR_MAX)
 # define SCHAR_WIDTH _GL_INTEGER_WIDTH (SCHAR_MIN, SCHAR_MAX)
 # define UCHAR_WIDTH _GL_INTEGER_WIDTH (0, UCHAR_MAX)
@@ -99,7 +116,17 @@
 # define ULONG_WIDTH _GL_INTEGER_WIDTH (0, ULONG_MAX)
 # define LLONG_WIDTH _GL_INTEGER_WIDTH (LLONG_MIN, LLONG_MAX)
 # define ULLONG_WIDTH _GL_INTEGER_WIDTH (0, ULLONG_MAX)
-#endif /* !ULLONG_WIDTH && (_GNU_SOURCE || __STDC_WANT_IEC_60559_BFP_EXT__) */
+#endif
+
+/* Macros specified by C2x.  */
+
+#if (! defined BOOL_WIDTH \
+     && (defined _GNU_SOURCE \
+         || (defined __STDC_VERSION__ && 201710 < __STDC_VERSION__)))
+# define BOOL_MAX 1
+# define BOOL_WIDTH 1
+#endif
 
 #endif /* _GL_LIMITS_H */
 #endif /* _GL_LIMITS_H */
+#endif
diff --git a/darwin-lib/malloc/scratch_buffer.gl.h b/darwin-lib/malloc/scratch_buffer.gl.h
new file mode 100644
index 0000000..1870f8e
--- /dev/null
+++ b/darwin-lib/malloc/scratch_buffer.gl.h
@@ -0,0 +1,148 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Variable-sized buffer with on-stack default allocation.
+   Copyright (C) 2015-2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _SCRATCH_BUFFER_H
+#define _SCRATCH_BUFFER_H
+
+/* Scratch buffers with a default stack allocation and fallback to
+   heap allocation.  It is expected that this function is used in this
+   way:
+
+     struct scratch_buffer tmpbuf;
+     scratch_buffer_init (&tmpbuf);
+
+     while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
+       if (!scratch_buffer_grow (&tmpbuf))
+	 return -1;
+
+     scratch_buffer_free (&tmpbuf);
+     return 0;
+
+   The allocation functions (scratch_buffer_grow,
+   scratch_buffer_grow_preserve, scratch_buffer_set_array_size) make
+   sure that the heap allocation, if any, is freed, so that the code
+   above does not have a memory leak.  The buffer still remains in a
+   state that can be deallocated using scratch_buffer_free, so a loop
+   like this is valid as well:
+
+     struct scratch_buffer tmpbuf;
+     scratch_buffer_init (&tmpbuf);
+
+     while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
+       if (!scratch_buffer_grow (&tmpbuf))
+	 break;
+
+     scratch_buffer_free (&tmpbuf);
+
+   scratch_buffer_grow and scratch_buffer_grow_preserve are guaranteed
+   to grow the buffer by at least 512 bytes.  This means that when
+   using the scratch buffer as a backing store for a non-character
+   array whose element size, in bytes, is 512 or smaller, the scratch
+   buffer only has to grow once to make room for at least one more
+   element.
+*/
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+/* Scratch buffer.  Must be initialized with scratch_buffer_init
+   before its use.  */
+struct scratch_buffer {
+  void *data;    /* Pointer to the beginning of the scratch area.  */
+  size_t length; /* Allocated space at the data pointer, in bytes.  */
+  union { max_align_t __align; char __c[1024]; } __space;
+};
+
+/* Initializes *BUFFER so that BUFFER->data points to BUFFER->__space
+   and BUFFER->length reflects the available space.  */
+static inline void
+scratch_buffer_init (struct scratch_buffer *buffer)
+{
+  buffer->data = buffer->__space.__c;
+  buffer->length = sizeof (buffer->__space);
+}
+
+/* Deallocates *BUFFER (if it was heap-allocated).  */
+static inline void
+scratch_buffer_free (struct scratch_buffer *buffer)
+{
+  if (buffer->data != buffer->__space.__c)
+    free (buffer->data);
+}
+
+/* Grow *BUFFER by some arbitrary amount.  The buffer contents is NOT
+   preserved.  Return true on success, false on allocation failure (in
+   which case the old buffer is freed).  On success, the new buffer is
+   larger than the previous size.  On failure, *BUFFER is deallocated,
+   but remains in a free-able state, and errno is set.  */
+bool __libc_scratch_buffer_grow (struct scratch_buffer *buffer);
+
+/* Alias for __libc_scratch_buffer_grow.  */
+static inline _GL_ATTRIBUTE_ALWAYS_INLINE bool
+scratch_buffer_grow (struct scratch_buffer *buffer)
+{
+  return _GL_LIKELY (__libc_scratch_buffer_grow (buffer));
+}
+
+/* Like __libc_scratch_buffer_grow, but preserve the old buffer
+   contents on success, as a prefix of the new buffer.  */
+bool __libc_scratch_buffer_grow_preserve (struct scratch_buffer *buffer);
+
+/* Alias for __libc_scratch_buffer_grow_preserve.  */
+static inline _GL_ATTRIBUTE_ALWAYS_INLINE bool
+scratch_buffer_grow_preserve (struct scratch_buffer *buffer)
+{
+  return _GL_LIKELY (__libc_scratch_buffer_grow_preserve (buffer));
+}
+
+/* Grow *BUFFER so that it can store at least NELEM elements of SIZE
+   bytes.  The buffer contents are NOT preserved.  Both NELEM and SIZE
+   can be zero.  Return true on success, false on allocation failure
+   (in which case the old buffer is freed, but *BUFFER remains in a
+   free-able state, and errno is set).  It is unspecified whether this
+   function can reduce the array size.  */
+bool __libc_scratch_buffer_set_array_size (struct scratch_buffer *buffer,
+					   size_t nelem, size_t size);
+
+/* Alias for __libc_scratch_set_array_size.  */
+static inline _GL_ATTRIBUTE_ALWAYS_INLINE bool
+scratch_buffer_set_array_size (struct scratch_buffer *buffer,
+			       size_t nelem, size_t size)
+{
+  return _GL_LIKELY (__libc_scratch_buffer_set_array_size
+			 (buffer, nelem, size));
+}
+
+/* Return a copy of *BUFFER's first SIZE bytes as a heap-allocated block,
+   deallocating *BUFFER if it was heap-allocated.  SIZE must be at
+   most *BUFFER's size.  Return NULL (setting errno) on memory
+   exhaustion.  */
+void *__libc_scratch_buffer_dupfree (struct scratch_buffer *buffer,
+                                     size_t size);
+
+/* Alias for __libc_scratch_dupfree.  */
+static inline _GL_ATTRIBUTE_ALWAYS_INLINE void *
+scratch_buffer_dupfree (struct scratch_buffer *buffer, size_t size)
+{
+  void *r = __libc_scratch_buffer_dupfree (buffer, size);
+  return _GL_LIKELY (r != NULL) ? r : NULL;
+}
+
+#endif /* _SCRATCH_BUFFER_H */
diff --git a/darwin-lib/math.h b/darwin-lib/math.h
index d2a223a..f879672 100644
--- a/darwin-lib/math.h
+++ b/darwin-lib/math.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <math.h>.
 
-   Copyright (C) 2002-2003, 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002-2003, 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_MATH_H
@@ -23,9 +23,24 @@
 #endif
 
 
-/* The include_next requires a split double-inclusion guard.  */
+#if defined _GL_INCLUDING_MATH_H
+/* Special invocation convention:
+   - On FreeBSD 12.2 we have a sequence of nested includes
+     <math.h> -> <stdlib.h> -> <sys/wait.h> -> <sys/types.h> -> <sys/select.h>
+       -> <signal.h> -> <pthread.h> -> <stdlib.h> -> <math.h>
+     In this situation, the functions are not yet declared, therefore we cannot
+     provide the C++ aliases.  */
+
 #include_next <math.h>
 
+#else
+/* Normal invocation convention.  */
+
+/* The include_next requires a split double-inclusion guard.  */
+#define _GL_INCLUDING_MATH_H
+#include_next <math.h>
+#undef _GL_INCLUDING_MATH_H
+
 #ifndef _GL_MATH_H
 #define _GL_MATH_H
 
@@ -42,21 +57,31 @@
 # define _GL_MATH_INLINE _GL_INLINE
 #endif
 
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The attribute __const__ was added in gcc 2.95.  */
+#ifndef _GL_ATTRIBUTE_CONST
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) || defined __clang__
+#  define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
+# else
+#  define _GL_ATTRIBUTE_CONST /* empty */
+# endif
+#endif
+
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -191,6 +216,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -216,6 +251,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -313,7 +356,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -341,14 +384,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -362,26 +402,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -390,19 +430,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -478,6 +518,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -490,24 +537,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -729,7 +787,9 @@
 _GL_FUNCDECL_SYS (acosl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (acosl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (acosl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef acosl
 # if HAVE_RAW_DECL_ACOSL
@@ -769,7 +829,9 @@
 _GL_FUNCDECL_SYS (asinl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (asinl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (asinl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef asinl
 # if HAVE_RAW_DECL_ASINL
@@ -809,7 +871,9 @@
 _GL_FUNCDECL_SYS (atanl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (atanl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (atanl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef atanl
 # if HAVE_RAW_DECL_ATANL
@@ -873,7 +937,7 @@
 # endif
 _GL_CXXALIAS_SYS (cbrt, double, (double x));
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (cbrt);
+_GL_CXXALIASWARN1 (cbrt, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef cbrt
@@ -943,7 +1007,7 @@
 _GL_CXXALIAS_SYS (ceil, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (ceil);
+_GL_CXXALIASWARN1 (ceil, double, (double x));
 # endif
 #endif
 
@@ -962,7 +1026,9 @@
 #  endif
 _GL_CXXALIAS_SYS (ceill, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (ceill);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef ceill
 # if HAVE_RAW_DECL_CEILL
@@ -974,6 +1040,7 @@
 
 #if 0
 # if !1
+#  undef copysignf
 _GL_FUNCDECL_SYS (copysignf, float, (float x, float y));
 # endif
 _GL_CXXALIAS_SYS (copysignf, float, (float x, float y));
@@ -992,7 +1059,7 @@
 # endif
 _GL_CXXALIAS_SYS (copysign, double, (double x, double y));
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (copysign);
+_GL_CXXALIASWARN1 (copysign, double, (double x, double y));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef copysign
@@ -1047,7 +1114,9 @@
 _GL_FUNCDECL_SYS (cosl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (cosl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (cosl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef cosl
 # if HAVE_RAW_DECL_COSL
@@ -1121,7 +1190,9 @@
 #  endif
 _GL_CXXALIAS_SYS (expl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (expl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef expl
 # if HAVE_RAW_DECL_EXPL
@@ -1160,7 +1231,7 @@
 _GL_CXXALIAS_SYS (exp2, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (exp2);
+_GL_CXXALIASWARN1 (exp2, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef exp2
@@ -1233,7 +1304,7 @@
 _GL_CXXALIAS_SYS (expm1, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (expm1);
+_GL_CXXALIASWARN1 (expm1, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef expm1
@@ -1276,7 +1347,9 @@
 _GL_FUNCDECL_SYS (fabsf, float, (float x));
 # endif
 _GL_CXXALIAS_SYS (fabsf, float, (float x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fabsf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef fabsf
 # if HAVE_RAW_DECL_FABSF
@@ -1300,7 +1373,9 @@
 #  endif
 _GL_CXXALIAS_SYS (fabsl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fabsl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef fabsl
 # if HAVE_RAW_DECL_FABSL
@@ -1346,7 +1421,7 @@
 _GL_CXXALIAS_SYS (floor, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (floor);
+_GL_CXXALIASWARN1 (floor, double, (double x));
 # endif
 #endif
 
@@ -1365,7 +1440,9 @@
 #  endif
 _GL_CXXALIAS_SYS (floorl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (floorl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef floorl
 # if HAVE_RAW_DECL_FLOORL
@@ -1385,6 +1462,7 @@
 _GL_CXXALIAS_RPL (fmaf, float, (float x, float y, float z));
 # else
 #  if !1
+#   undef fmaf
 _GL_FUNCDECL_SYS (fmaf, float, (float x, float y, float z));
 #  endif
 _GL_CXXALIAS_SYS (fmaf, float, (float x, float y, float z));
@@ -1408,12 +1486,13 @@
 _GL_CXXALIAS_RPL (fma, double, (double x, double y, double z));
 # else
 #  if !1
+#   undef fma
 _GL_FUNCDECL_SYS (fma, double, (double x, double y, double z));
 #  endif
 _GL_CXXALIAS_SYS (fma, double, (double x, double y, double z));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fma);
+_GL_CXXALIASWARN1 (fma, double, (double x, double y, double z));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef fma
@@ -1490,7 +1569,7 @@
 _GL_CXXALIAS_SYS (fmod, double, (double x, double y));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fmod);
+_GL_CXXALIASWARN1 (fmod, double, (double x, double y));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef fmod
@@ -1515,7 +1594,9 @@
 #  endif
 _GL_CXXALIAS_SYS (fmodl, long double, (long double x, long double y));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fmodl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef fmodl
 # if HAVE_RAW_DECL_FMODL
@@ -1547,7 +1628,9 @@
 #  endif
 _GL_CXXALIAS_SYS (frexpf, float, (float x, int *expptr));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (frexpf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef frexpf
 # if HAVE_RAW_DECL_FREXPF
@@ -1609,7 +1692,9 @@
 # endif
 #endif
 #if 1 && !(0 && !1)
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (frexpl);
+# endif
 #endif
 #if !1 && defined GNULIB_POSIXCHECK
 # undef frexpl
@@ -1635,7 +1720,9 @@
 #  endif
 _GL_CXXALIAS_SYS (hypotf, float, (float x, float y));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (hypotf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef hypotf
 # if HAVE_RAW_DECL_HYPOTF
@@ -1657,7 +1744,7 @@
 _GL_CXXALIAS_SYS (hypot, double, (double x, double y));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (hypot);
+_GL_CXXALIASWARN1 (hypot, double, (double x, double y));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef hypot
@@ -1682,7 +1769,9 @@
 #  endif
 _GL_CXXALIAS_SYS (hypotl, long double, (long double x, long double y));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (hypotl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef hypotl
 # if HAVE_RAW_DECL_HYPOTL
@@ -1730,7 +1819,7 @@
 _GL_CXXALIAS_SYS (ilogb, int, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (ilogb);
+_GL_CXXALIASWARN1 (ilogb, int, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef ilogb
@@ -1750,6 +1839,7 @@
 _GL_CXXALIAS_RPL (ilogbl, int, (long double x));
 # else
 #  if !1
+#   undef ilogbl
 _GL_FUNCDECL_SYS (ilogbl, int, (long double x));
 #  endif
 _GL_CXXALIAS_SYS (ilogbl, int, (long double x));
@@ -1764,6 +1854,55 @@
 #endif
 
 
+#if 1
+/* On native Windows, map 'j0' to '_j0', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::j0 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef j0
+#   define j0 _j0
+#  endif
+_GL_CXXALIAS_MDA (j0, double, (double x));
+# else
+_GL_CXXALIAS_SYS (j0, double, (double x));
+# endif
+_GL_CXXALIASWARN (j0);
+#endif
+
+#if 1
+/* On native Windows, map 'j1' to '_j1', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::j1 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef j1
+#   define j1 _j1
+#  endif
+_GL_CXXALIAS_MDA (j1, double, (double x));
+# else
+_GL_CXXALIAS_SYS (j1, double, (double x));
+# endif
+_GL_CXXALIASWARN (j1);
+#endif
+
+#if 1
+/* On native Windows, map 'jn' to '_jn', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::jn always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef jn
+#   define jn _jn
+#  endif
+_GL_CXXALIAS_MDA (jn, double, (int n, double x));
+# else
+_GL_CXXALIAS_SYS (jn, double, (int n, double x));
+# endif
+_GL_CXXALIASWARN (jn);
+#endif
+
+
 /* Return x * 2^exp.  */
 #if 0
 # if !1
@@ -1771,7 +1910,9 @@
 _GL_FUNCDECL_SYS (ldexpf, float, (float x, int exp));
 # endif
 _GL_CXXALIAS_SYS (ldexpf, float, (float x, int exp));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (ldexpf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef ldexpf
 # if HAVE_RAW_DECL_LDEXPF
@@ -1797,7 +1938,9 @@
 # endif
 #endif
 #if 1
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (ldexpl);
+# endif
 #endif
 #if !1 && defined GNULIB_POSIXCHECK
 # undef ldexpl
@@ -1844,7 +1987,7 @@
 _GL_CXXALIAS_SYS (log, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log);
+_GL_CXXALIASWARN1 (log, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef log
@@ -1869,7 +2012,9 @@
 #  endif
 _GL_CXXALIAS_SYS (logl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (logl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef logl
 # if HAVE_RAW_DECL_LOGL
@@ -1915,7 +2060,7 @@
 _GL_CXXALIAS_SYS (log10, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log10);
+_GL_CXXALIASWARN1 (log10, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef log10
@@ -1940,7 +2085,9 @@
 #  endif
 _GL_CXXALIAS_SYS (log10l, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (log10l);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef log10l
 # if HAVE_RAW_DECL_LOG10L
@@ -1988,7 +2135,7 @@
 _GL_CXXALIAS_SYS (log1p, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log1p);
+_GL_CXXALIASWARN1 (log1p, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef log1p
@@ -2062,7 +2209,7 @@
 _GL_CXXALIAS_SYS (log2, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log2);
+_GL_CXXALIASWARN1 (log2, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef log2
@@ -2134,7 +2281,7 @@
 _GL_CXXALIAS_SYS (logb, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (logb);
+_GL_CXXALIASWARN1 (logb, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef logb
@@ -2204,7 +2351,7 @@
 _GL_CXXALIAS_SYS (modf, double, (double x, double *iptr));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (modf);
+_GL_CXXALIASWARN1 (modf, double, (double x, double *iptr));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef modf
@@ -2231,7 +2378,9 @@
 #  endif
 _GL_CXXALIAS_SYS (modfl, long double, (long double x, long double *iptr));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (modfl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef modfl
 # if HAVE_RAW_DECL_MODFL
@@ -2295,7 +2444,7 @@
 _GL_CXXALIAS_SYS (remainder, double, (double x, double y));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (remainder);
+_GL_CXXALIASWARN1 (remainder, double, (double x, double y));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef remainder
@@ -2352,7 +2501,7 @@
 # endif
 _GL_CXXALIAS_SYS (rint, double, (double x));
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (rint);
+_GL_CXXALIASWARN1 (rint, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef rint
@@ -2424,7 +2573,7 @@
 _GL_CXXALIAS_SYS (round, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (round);
+_GL_CXXALIASWARN1 (round, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef round
@@ -2471,7 +2620,7 @@
 _GL_CXXALIAS_RPL (sinf, float, (float x));
 # else
 #  if !1
- #  undef sinf
+#   undef sinf
 _GL_FUNCDECL_SYS (sinf, float, (float x));
 #  endif
 _GL_CXXALIAS_SYS (sinf, float, (float x));
@@ -2491,7 +2640,9 @@
 _GL_FUNCDECL_SYS (sinl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (sinl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (sinl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef sinl
 # if HAVE_RAW_DECL_SINL
@@ -2565,7 +2716,9 @@
 #  endif
 _GL_CXXALIAS_SYS (sqrtl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (sqrtl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef sqrtl
 # if HAVE_RAW_DECL_SQRTL
@@ -2605,7 +2758,9 @@
 _GL_FUNCDECL_SYS (tanl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (tanl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (tanl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef tanl
 # if HAVE_RAW_DECL_TANL
@@ -2678,7 +2833,7 @@
 _GL_CXXALIAS_SYS (trunc, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (trunc);
+_GL_CXXALIASWARN1 (trunc, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef trunc
@@ -2712,6 +2867,55 @@
 #endif
 
 
+#if 1
+/* On native Windows, map 'y0' to '_y0', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::y0 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef y0
+#   define y0 _y0
+#  endif
+_GL_CXXALIAS_MDA (y0, double, (double x));
+# else
+_GL_CXXALIAS_SYS (y0, double, (double x));
+# endif
+_GL_CXXALIASWARN (y0);
+#endif
+
+#if 1
+/* On native Windows, map 'y1' to '_y1', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::y1 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef y1
+#   define y1 _y1
+#  endif
+_GL_CXXALIAS_MDA (y1, double, (double x));
+# else
+_GL_CXXALIAS_SYS (y1, double, (double x));
+# endif
+_GL_CXXALIASWARN (y1);
+#endif
+
+#if 1
+/* On native Windows, map 'yn' to '_yn', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::yn always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef yn
+#   define yn _yn
+#  endif
+_GL_CXXALIAS_MDA (yn, double, (int n, double x));
+# else
+_GL_CXXALIAS_SYS (yn, double, (int n, double x));
+# endif
+_GL_CXXALIASWARN (yn);
+#endif
+
+
 /* Definitions of function-like macros come here, after the function
    declarations.  */
 
@@ -2731,7 +2935,7 @@
 #  if defined isfinite || defined GNULIB_NAMESPACE
 _GL_MATH_CXX_REAL_FLOATING_DECL_1 (isfinite)
 #   undef isfinite
-#   if __GNUC__ >= 6 || (defined __clang__ && !defined _AIX)
+#   if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || defined _AIX || (defined _WIN32 && !defined __CYGWIN__)))
   /* This platform's <cmath> possibly defines isfinite through a set of inline
      functions.  */
 _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isfinite, rpl_isfinite, bool)
@@ -2765,7 +2969,7 @@
 #  if defined isinf || defined GNULIB_NAMESPACE
 _GL_MATH_CXX_REAL_FLOATING_DECL_1 (isinf)
 #   undef isinf
-#   if __GNUC__ >= 6 || defined __clang__
+#   if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || (defined _WIN32 && !defined __CYGWIN__)))
   /* This platform's <cmath> possibly defines isinf through a set of inline
      functions.  */
 _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isinf, rpl_isinf, bool)
@@ -2786,13 +2990,14 @@
 
 #if 1
 /* Test for NaN for 'float' numbers.  */
-# if 0
+# if 1
 /* The original <math.h> included above provides a declaration of isnan macro
    or (older) isnanf function.  */
-#  if __GNUC__ >= 4
-    /* GCC 4.0 and newer provides three built-ins for isnan.  */
+#  if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+    /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
+       GCC >= 4.0 also provides __builtin_isnanf, but clang doesn't.  */
 #   undef isnanf
-#   define isnanf(x) __builtin_isnanf ((float)(x))
+#   define isnanf(x) __builtin_isnan ((float)(x))
 #  elif defined isnan
 #   undef isnanf
 #   define isnanf(x) isnan ((float)(x))
@@ -2812,8 +3017,8 @@
 # if 1
 /* The original <math.h> included above provides a declaration of isnan
    macro.  */
-#  if __GNUC__ >= 4
-    /* GCC 4.0 and newer provides three built-ins for isnan.  */
+#  if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+    /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.  */
 #   undef isnand
 #   define isnand(x) __builtin_isnan ((double)(x))
 #  else
@@ -2830,13 +3035,14 @@
 
 #if 1
 /* Test for NaN for 'long double' numbers.  */
-# if 0
+# if 1
 /* The original <math.h> included above provides a declaration of isnan
    macro or (older) isnanl function.  */
-#  if __GNUC__ >= 4
-    /* GCC 4.0 and newer provides three built-ins for isnan.  */
+#  if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+    /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
+       GCC >= 4.0 also provides __builtin_isnanl, but clang doesn't.  */
 #   undef isnanl
-#   define isnanl(x) __builtin_isnanl ((long double)(x))
+#   define isnanl(x) __builtin_isnan ((long double)(x))
 #  elif defined isnan
 #   undef isnanl
 #   define isnanl(x) isnan ((long double)(x))
@@ -2851,25 +3057,25 @@
 
 /* This must come *after* the snippets for GNULIB_ISNANF and GNULIB_ISNANL!  */
 #if 1
-# if 1
+# if 0
 /* We can't just use the isnanf macro (e.g.) as exposed by
    isnanf.h (e.g.) here, because those may end up being macros
    that recursively expand back to isnan.  So use the gnulib
    replacements for them directly. */
-#  if 0 && __GNUC__ >= 4
-#   define gl_isnan_f(x) __builtin_isnanf ((float)(x))
+#  if 1 && (__GNUC__ >= 4) || (__clang_major__ >= 4)
+#   define gl_isnan_f(x) __builtin_isnan ((float)(x))
 #  else
 _GL_EXTERN_C int rpl_isnanf (float x);
 #   define gl_isnan_f(x) rpl_isnanf (x)
 #  endif
-#  if 1 && __GNUC__ >= 4
+#  if 1 && (__GNUC__ >= 4) || (__clang_major__ >= 4)
 #   define gl_isnan_d(x) __builtin_isnan ((double)(x))
 #  else
 _GL_EXTERN_C int rpl_isnand (double x);
 #   define gl_isnan_d(x) rpl_isnand (x)
 #  endif
-#  if 0 && __GNUC__ >= 4
-#   define gl_isnan_l(x) __builtin_isnanl ((long double)(x))
+#  if 1 && (__GNUC__ >= 4) || (__clang_major__ >= 4)
+#   define gl_isnan_l(x) __builtin_isnan ((long double)(x))
 #  else
 _GL_EXTERN_C int rpl_isnanl (long double x) _GL_ATTRIBUTE_CONST;
 #   define gl_isnan_l(x) rpl_isnanl (x)
@@ -2879,18 +3085,18 @@
    (sizeof (x) == sizeof (long double) ? gl_isnan_l (x) : \
     sizeof (x) == sizeof (double) ? gl_isnan_d (x) : \
     gl_isnan_f (x))
-# elif __GNUC__ >= 4
+# elif (__GNUC__ >= 4) || (__clang_major__ >= 4)
 #  undef isnan
 #  define isnan(x) \
-   (sizeof (x) == sizeof (long double) ? __builtin_isnanl ((long double)(x)) : \
+   (sizeof (x) == sizeof (long double) ? __builtin_isnan ((long double)(x)) : \
     sizeof (x) == sizeof (double) ? __builtin_isnan ((double)(x)) : \
-    __builtin_isnanf ((float)(x)))
+    __builtin_isnan ((float)(x)))
 # endif
 # ifdef __cplusplus
 #  if defined isnan || defined GNULIB_NAMESPACE
 _GL_MATH_CXX_REAL_FLOATING_DECL_1 (isnan)
 #   undef isnan
-#   if __GNUC__ >= 6 || defined __clang__
+#   if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__ && __clang_major__ < 12) || (defined __FreeBSD__ && __clang_major__ < 7) || defined __OpenBSD__ || (defined _WIN32 && !defined __CYGWIN__)))
   /* This platform's <cmath> possibly defines isnan through a set of inline
      functions.  */
 _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isnan, rpl_isnan, bool)
@@ -2918,7 +3124,7 @@
 # if (1 \
       && (!defined __cplusplus || __cplusplus < 201103))
 #  undef signbit
-   /* GCC 4.0 and newer provides three built-ins for signbit.  */
+   /* GCC >= 4.0 and clang provide three built-ins for signbit.  */
 #  define signbit(x) \
    (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
     sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
@@ -2929,7 +3135,7 @@
 _GL_EXTERN_C int gl_signbitf (float arg);
 _GL_EXTERN_C int gl_signbitd (double arg);
 _GL_EXTERN_C int gl_signbitl (long double arg);
-#  if __GNUC__ >= 2 && !defined __STRICT_ANSI__
+#  if (__GNUC__ >= 2 || defined __clang__) && !defined __STRICT_ANSI__
 #   define _GL_NUM_UINT_WORDS(type) \
       ((sizeof (type) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
 #   if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT && !defined gl_signbitf
@@ -2973,7 +3179,7 @@
 #  if defined signbit || defined GNULIB_NAMESPACE
 _GL_MATH_CXX_REAL_FLOATING_DECL_1 (signbit)
 #   undef signbit
-#   if __GNUC__ >= 6 || (defined __clang__ && !defined _AIX)
+#   if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || defined _AIX || (defined _WIN32 && !defined __CYGWIN__)))
   /* This platform's <cmath> possibly defines signbit through a set of inline
      functions.  */
 _GL_MATH_CXX_REAL_FLOATING_DECL_2 (signbit, rpl_signbit, bool)
@@ -2994,4 +3200,5 @@
 _GL_INLINE_HEADER_END
 
 #endif /* _GL_MATH_H */
+#endif /* _GL_INCLUDING_MATH_H */
 #endif /* _GL_MATH_H */
diff --git a/darwin-lib/sched.h b/darwin-lib/sched.h
index 41a8c71..9936111 100644
--- a/darwin-lib/sched.h
+++ b/darwin-lib/sched.h
@@ -1,18 +1,18 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <sched.h>.
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_SCHED_H
@@ -51,19 +51,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -198,6 +198,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -223,6 +233,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -320,7 +338,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -348,14 +366,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -369,19 +384,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -457,6 +472,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -469,24 +491,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -532,7 +565,9 @@
 #  endif
 _GL_CXXALIAS_SYS (sched_yield, int, (void));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (sched_yield);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef sched_yield
 # if HAVE_RAW_DECL_SCHED_YIELD
diff --git a/darwin-lib/signal.h b/darwin-lib/signal.h
index 43c0c8a..6444a76 100644
--- a/darwin-lib/signal.h
+++ b/darwin-lib/signal.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <signal.h>.
 
-   Copyright (C) 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
@@ -56,32 +56,32 @@
 #ifndef _GL_SIGNAL_H
 #define _GL_SIGNAL_H
 
-/* Mac OS X 10.3, FreeBSD 6.4, OpenBSD 3.8, OSF/1 4.0, Solaris 2.6, Android
-   declare pthread_sigmask in <pthread.h>, not in <signal.h>.
+/* Mac OS X 10.3, FreeBSD 6.4, OpenBSD 3.8, OSF/1 4.0, Solaris 2.6, Android,
+   OS/2 kLIBC declare pthread_sigmask in <pthread.h>, not in <signal.h>.
    But avoid namespace pollution on glibc systems.*/
 #if (0 || defined GNULIB_POSIXCHECK) \
     && ((defined __APPLE__ && defined __MACH__) \
         || defined __FreeBSD__ || defined __OpenBSD__ || defined __osf__ \
-        || defined __sun || defined __ANDROID__) \
+        || defined __sun || defined __ANDROID__ || defined __KLIBC__) \
     && ! defined __GLIBC__
 # include <pthread.h>
 #endif
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -216,6 +216,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -241,6 +251,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -338,7 +356,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -366,14 +384,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -387,26 +402,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -415,19 +430,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -503,6 +518,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -515,24 +537,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -607,16 +640,24 @@
 #   define pthread_sigmask rpl_pthread_sigmask
 #  endif
 _GL_FUNCDECL_RPL (pthread_sigmask, int,
-                  (int how, const sigset_t *new_mask, sigset_t *old_mask));
+                  (int how,
+                   const sigset_t *restrict new_mask,
+                   sigset_t *restrict old_mask));
 _GL_CXXALIAS_RPL (pthread_sigmask, int,
-                  (int how, const sigset_t *new_mask, sigset_t *old_mask));
+                  (int how,
+                   const sigset_t *restrict new_mask,
+                   sigset_t *restrict old_mask));
 # else
 #  if !(1 || defined pthread_sigmask)
 _GL_FUNCDECL_SYS (pthread_sigmask, int,
-                  (int how, const sigset_t *new_mask, sigset_t *old_mask));
+                  (int how,
+                   const sigset_t *restrict new_mask,
+                   sigset_t *restrict old_mask));
 #  endif
 _GL_CXXALIAS_SYS (pthread_sigmask, int,
-                  (int how, const sigset_t *new_mask, sigset_t *old_mask));
+                  (int how,
+                   const sigset_t *restrict new_mask,
+                   sigset_t *restrict old_mask));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (pthread_sigmask);
@@ -769,10 +810,14 @@
 #  define SIG_SETMASK 1  /* blocked_set = *set; */
 #  define SIG_UNBLOCK 2  /* blocked_set = blocked_set & ~*set; */
 _GL_FUNCDECL_SYS (sigprocmask, int,
-                  (int operation, const sigset_t *set, sigset_t *old_set));
+                  (int operation,
+                   const sigset_t *restrict set,
+                   sigset_t *restrict old_set));
 # endif
 _GL_CXXALIAS_SYS (sigprocmask, int,
-                  (int operation, const sigset_t *set, sigset_t *old_set));
+                  (int operation,
+                   const sigset_t *restrict set,
+                   sigset_t *restrict old_set));
 _GL_CXXALIASWARN (sigprocmask);
 
 /* Install the handler FUNC for signal SIG, and return the previous
@@ -796,6 +841,12 @@
 _GL_CXXALIAS_RPL (signal, _gl_function_taking_int_returning_void_t,
                   (int sig, _gl_function_taking_int_returning_void_t func));
 # else
+/* On OpenBSD, the declaration of 'signal' may not be present at this point,
+   because it occurs in <sys/signal.h>, not <signal.h> directly.  */
+#  if defined __OpenBSD__
+_GL_FUNCDECL_SYS (signal, _gl_function_taking_int_returning_void_t,
+                  (int sig, _gl_function_taking_int_returning_void_t func));
+#  endif
 _GL_CXXALIAS_SYS (signal, _gl_function_taking_int_returning_void_t,
                   (int sig, _gl_function_taking_int_returning_void_t func));
 # endif
diff --git a/darwin-lib/spawn.h b/darwin-lib/spawn.h
index a8a4934..9fdc500 100644
--- a/darwin-lib/spawn.h
+++ b/darwin-lib/spawn.h
@@ -1,31 +1,48 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Definitions for POSIX spawn interface.
-   Copyright (C) 2000, 2003-2004, 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2003-2004, 2008-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
-#ifndef _GL_SPAWN_H
-
 #if __GNUC__ >= 3
 #pragma GCC system_header
 #endif
 
 
+#if defined _GL_ALREADY_INCLUDING_SPAWN_H
+/* Special invocation convention:
+   On OS/2 kLIBC, <spawn.h> includes <signal.h>. Then <signal.h> ->
+   <pthread.h> -> <sched.h> -> <spawn.h> are included by GNULIB.
+   In this situation, struct sched_param is not yet defined.  */
+
+#include_next <spawn.h>
+
+#else
+
+#ifndef _GL_SPAWN_H
+/* Normal invocation convention.  */
+
 /* The include_next requires a split double-inclusion guard.  */
 #if 1
+
+# define _GL_ALREADY_INCLUDING_SPAWN_H
+
 # include_next <spawn.h>
+
+# define _GL_ALREADY_INCLUDING_SPAWN_H
+
 #endif
 
 #ifndef _GL_SPAWN_H
@@ -44,28 +61,35 @@
 # define __THROW
 #endif
 
-/* GCC 2.95 and later have "__restrict"; C99 compilers have
+/* For plain 'restrict', use glibc's __restrict if defined.
+   Otherwise, GCC 2.95 and later have "__restrict"; C99 compilers have
    "restrict", and "configure" may have defined "restrict".
    Other compilers use __restrict, __restrict__, and _Restrict, and
    'configure' might #define 'restrict' to those words, so pick a
    different name.  */
 #ifndef _Restrict_
-# if 199901L <= __STDC_VERSION__
-#  define _Restrict_ restrict
-# elif 2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)
+# if defined __restrict \
+     || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+     || __clang_major__ >= 3
 #  define _Restrict_ __restrict
+# elif 199901L <= __STDC_VERSION__ || defined restrict
+#  define _Restrict_ restrict
 # else
 #  define _Restrict_
 # endif
 #endif
-/* gcc 3.1 and up support the [restrict] syntax.  Don't trust
-   sys/cdefs.h's definition of __restrict_arr, though, as it
-   mishandles gcc -ansi -pedantic.  */
+/* For the ISO C99 syntax
+     array_name[restrict]
+   use glibc's __restrict_arr if available.
+   Otherwise, GCC 3.1 and clang support this syntax (but not in C++ mode).
+   Other ISO C99 compilers support it as well.  */
 #ifndef _Restrict_arr_
-# if ((199901L <= __STDC_VERSION__                                      \
-       || ((3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__))     \
-           && !defined __STRICT_ANSI__))                                        \
-      && !defined __GNUG__)
+# ifdef __restrict_arr
+#  define _Restrict_arr_ __restrict_arr
+# elif ((199901L <= __STDC_VERSION__ \
+         || 3 < __GNUC__ + (1 <= __GNUC_MINOR__) \
+         || __clang_major__ >= 3) \
+        && !defined __cplusplus)
 #  define _Restrict_arr_ _Restrict_
 # else
 #  define _Restrict_arr_
@@ -74,19 +98,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -221,6 +245,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -246,6 +280,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -343,7 +385,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -371,14 +413,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -392,26 +431,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -420,19 +459,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -508,6 +547,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -520,24 +566,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -553,10 +610,10 @@
 
 
 /* Data structure to contain attributes for thread creation.  */
-#if 0 || (1 && !1)
+#if 1 || (1 && !1)
 # define posix_spawnattr_t rpl_posix_spawnattr_t
 #endif
-#if 0 || !1 || !1
+#if 1 || !1 || !1
 # if !GNULIB_defined_posix_spawnattr_t
 typedef struct
 {
@@ -575,10 +632,10 @@
 
 /* Data structure to contain information about the actions to be
    performed in the new process with respect to file descriptors.  */
-#if 0 || (1 && !1)
+#if 1 || (1 && !1)
 # define posix_spawn_file_actions_t rpl_posix_spawn_file_actions_t
 #endif
-#if 0 || !1 || !1
+#if 1 || !1 || !1
 # if !GNULIB_defined_posix_spawn_file_actions_t
 typedef struct
 {
@@ -602,7 +659,7 @@
 #  define POSIX_SPAWN_SETSCHEDULER 0
 # endif
 #else
-# if 0
+# if 1
 /* Use the values from the system, for better compatibility.  */
 /* But this implementation does not support AIX extensions.  */
 #  undef POSIX_SPAWN_FORK_HANDLERS
@@ -640,13 +697,13 @@
 #endif
 
 
-#if 0
+#if 1
 /* Spawn a new process executing PATH with the attributes describes in *ATTRP.
    Before running the process perform the actions described in FILE-ACTIONS.
 
    This function is a possible cancellation points and therefore not
    marked with __THROW. */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawn rpl_posix_spawn
 #  endif
@@ -698,7 +755,7 @@
 
    This function is a possible cancellation points and therefore not
    marked with __THROW.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnp rpl_posix_spawnp
 #  endif
@@ -740,7 +797,7 @@
 
 #if 1
 /* Initialize data structure with attributes for 'spawn' to default values.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_init rpl_posix_spawnattr_init
 #  endif
@@ -765,7 +822,7 @@
 
 #if 1
 /* Free resources associated with ATTR.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_destroy rpl_posix_spawnattr_destroy
 #  endif
@@ -792,7 +849,7 @@
 #if 0
 /* Store signal mask for signals with default handling from ATTR in
    SIGDEFAULT.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_getsigdefault rpl_posix_spawnattr_getsigdefault
 #  endif
@@ -826,7 +883,7 @@
 
 #if 0
 /* Set signal mask for signals with default handling in ATTR to SIGDEFAULT.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_setsigdefault rpl_posix_spawnattr_setsigdefault
 #  endif
@@ -860,7 +917,7 @@
 
 #if 0
 /* Store signal mask for the new process from ATTR in SIGMASK.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_getsigmask rpl_posix_spawnattr_getsigmask
 #  endif
@@ -894,7 +951,7 @@
 
 #if 1
 /* Set signal mask for the new process in ATTR to SIGMASK.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_setsigmask rpl_posix_spawnattr_setsigmask
 #  endif
@@ -928,7 +985,7 @@
 
 #if 0
 /* Get flag word from the attribute structure.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_getflags rpl_posix_spawnattr_getflags
 #  endif
@@ -962,7 +1019,7 @@
 
 #if 1
 /* Store flags in the attribute structure.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_setflags rpl_posix_spawnattr_setflags
 #  endif
@@ -992,7 +1049,7 @@
 
 #if 0
 /* Get process group ID from the attribute structure.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_getpgroup rpl_posix_spawnattr_getpgroup
 #  endif
@@ -1024,9 +1081,9 @@
 # endif
 #endif
 
-#if 0
+#if 1
 /* Store process group ID in the attribute structure.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_setpgroup rpl_posix_spawnattr_setpgroup
 #  endif
@@ -1056,7 +1113,7 @@
 
 #if 0
 /* Get scheduling policy from the attribute structure.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_getschedpolicy rpl_posix_spawnattr_getschedpolicy
 #  endif
@@ -1078,7 +1135,9 @@
                   (const posix_spawnattr_t *_Restrict_ __attr,
                    int *_Restrict_ __schedpolicy));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (posix_spawnattr_getschedpolicy);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef posix_spawnattr_getschedpolicy
 # if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSCHEDPOLICY
@@ -1090,7 +1149,7 @@
 
 #if 0
 /* Store scheduling policy in the attribute structure.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_setschedpolicy rpl_posix_spawnattr_setschedpolicy
 #  endif
@@ -1108,7 +1167,9 @@
 _GL_CXXALIAS_SYS (posix_spawnattr_setschedpolicy, int,
                   (posix_spawnattr_t *__attr, int __schedpolicy));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (posix_spawnattr_setschedpolicy);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef posix_spawnattr_setschedpolicy
 # if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSCHEDPOLICY
@@ -1120,7 +1181,7 @@
 
 #if 0
 /* Get scheduling parameters from the attribute structure.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_getschedparam rpl_posix_spawnattr_getschedparam
 #  endif
@@ -1142,7 +1203,9 @@
                   (const posix_spawnattr_t *_Restrict_ __attr,
                    struct sched_param *_Restrict_ __schedparam));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (posix_spawnattr_getschedparam);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef posix_spawnattr_getschedparam
 # if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSCHEDPARAM
@@ -1154,7 +1217,7 @@
 
 #if 0
 /* Store scheduling parameters in the attribute structure.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_setschedparam rpl_posix_spawnattr_setschedparam
 #  endif
@@ -1176,7 +1239,9 @@
                   (posix_spawnattr_t *_Restrict_ __attr,
                    const struct sched_param *_Restrict_ __schedparam));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (posix_spawnattr_setschedparam);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef posix_spawnattr_setschedparam
 # if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSCHEDPARAM
@@ -1189,7 +1254,7 @@
 
 #if 1
 /* Initialize data structure for file attribute for 'spawn' call.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawn_file_actions_init rpl_posix_spawn_file_actions_init
 #  endif
@@ -1219,7 +1284,7 @@
 
 #if 1
 /* Free resources associated with FILE-ACTIONS.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawn_file_actions_destroy rpl_posix_spawn_file_actions_destroy
 #  endif
@@ -1250,7 +1315,7 @@
 #if 1
 /* Add an action to FILE-ACTIONS which tells the implementation to call
    'open' for the given file during the 'spawn' call.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawn_file_actions_addopen rpl_posix_spawn_file_actions_addopen
 #  endif
@@ -1291,7 +1356,7 @@
 #if 1
 /* Add an action to FILE-ACTIONS which tells the implementation to call
    'close' for the given file descriptor during the 'spawn' call.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawn_file_actions_addclose rpl_posix_spawn_file_actions_addclose
 #  endif
@@ -1324,7 +1389,7 @@
 #if 1
 /* Add an action to FILE-ACTIONS which tells the implementation to call
    'dup2' for the given file descriptors during the 'spawn' call.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawn_file_actions_adddup2 rpl_posix_spawn_file_actions_adddup2
 #  endif
@@ -1358,7 +1423,7 @@
 # endif
 #endif
 
-#if 0
+#if 1
 /* Add an action to FILE-ACTIONS which tells the implementation to call
    'chdir' to the given directory during the 'spawn' call.  */
 # if 0
@@ -1373,7 +1438,7 @@
                   (posix_spawn_file_actions_t *_Restrict_ __file_actions,
                    const char *_Restrict_ __path));
 # else
-#  if !1
+#  if !0
 _GL_FUNCDECL_SYS (posix_spawn_file_actions_addchdir, int,
                   (posix_spawn_file_actions_t *_Restrict_ __file_actions,
                    const char *_Restrict_ __path)
@@ -1431,3 +1496,4 @@
 
 #endif /* _GL_SPAWN_H */
 #endif /* _GL_SPAWN_H */
+#endif
diff --git a/darwin-lib/stdint.h b/darwin-lib/stdint.h
index b0af07f..1735ed5 100644
--- a/darwin-lib/stdint.h
+++ b/darwin-lib/stdint.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
-/* Copyright (C) 2001-2002, 2004-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2001-2002, 2004-2021 Free Software Foundation, Inc.
    Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood.
    This file is part of gnulib.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /*
  * ISO C 99 <stdint.h> for platforms that lack it.
@@ -189,7 +189,7 @@
 typedef __int64 gl_int64_t;
 #   define int64_t gl_int64_t
 #   define GL_INT64_T
-#  elif 1
+#  else
 #   undef int64_t
 typedef long long int gl_int64_t;
 #   define int64_t gl_int64_t
@@ -210,7 +210,7 @@
 typedef unsigned __int64 gl_uint64_t;
 #   define uint64_t gl_uint64_t
 #   define GL_UINT64_T
-#  elif 1
+#  else
 #   undef uint64_t
 typedef unsigned long long int gl_uint64_t;
 #   define uint64_t gl_uint64_t
@@ -303,12 +303,11 @@
 /* kLIBC's <stdint.h> defines _INTPTR_T_DECLARED and needs its own
    definitions of intptr_t and uintptr_t (which use int and unsigned)
    to avoid clashes with declarations of system functions like sbrk.
-   Similarly, mingw 5.22 <crtdefs.h> defines _INTPTR_T_DEFINED and
-   _UINTPTR_T_DEFINED and needs its own definitions of intptr_t and
+   Similarly, MinGW WSL-5.4.1 <stdint.h> needs its own intptr_t and
    uintptr_t to avoid conflicting declarations of system functions like
    _findclose in <io.h>.  */
 # if !((defined __KLIBC__ && defined _INTPTR_T_DECLARED) \
-       || (defined __MINGW32__ && defined _INTPTR_T_DEFINED && defined _UINTPTR_T_DEFINED))
+       || defined __MINGW32__)
 #  undef intptr_t
 #  undef uintptr_t
 #  ifdef _WIN64
@@ -334,7 +333,7 @@
 # ifndef INTMAX_MAX
 #  undef INTMAX_C
 #  undef intmax_t
-#  if 1 && LONG_MAX >> 30 == 1
+#  if LONG_MAX >> 30 == 1
 typedef long long int gl_intmax_t;
 #   define intmax_t gl_intmax_t
 #  elif defined GL_INT64_T
@@ -348,7 +347,7 @@
 # ifndef UINTMAX_MAX
 #  undef UINTMAX_C
 #  undef uintmax_t
-#  if 1 && ULONG_MAX >> 31 == 1
+#  if ULONG_MAX >> 31 == 1
 typedef unsigned long long int gl_uintmax_t;
 #   define uintmax_t gl_uintmax_t
 #  elif defined GL_UINT64_T
@@ -581,11 +580,6 @@
    <wchar.h> -> <stdio.h> -> <getopt.h> -> <stdlib.h>, and the latter includes
    <stdint.h> and assumes its types are already defined.  */
 # if 1 && ! (defined WCHAR_MIN && defined WCHAR_MAX)
-  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-     included before <wchar.h>.  */
-#  include <stddef.h>
-#  include <stdio.h>
-#  include <time.h>
 #  define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
 #  include <wchar.h>
 #  undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
@@ -648,21 +642,21 @@
 #  define INT64_C(x) x##L
 # elif defined _MSC_VER
 #  define INT64_C(x) x##i64
-# elif 1
+# else
 #  define INT64_C(x) x##LL
 # endif
 # if ULONG_MAX >> 31 >> 31 >> 1 == 1
 #  define UINT64_C(x) x##UL
 # elif defined _MSC_VER
 #  define UINT64_C(x) x##ui64
-# elif 1
+# else
 #  define UINT64_C(x) x##ULL
 # endif
 
 /* 7.18.4.2. Macros for greatest-width integer constants */
 
 # ifndef INTMAX_C
-#  if 1 && LONG_MAX >> 30 == 1
+#  if LONG_MAX >> 30 == 1
 #   define INTMAX_C(x)   x##LL
 #  elif defined GL_INT64_T
 #   define INTMAX_C(x)   INT64_C(x)
@@ -672,7 +666,7 @@
 # endif
 
 # ifndef UINTMAX_C
-#  if 1 && ULONG_MAX >> 31 == 1
+#  if ULONG_MAX >> 31 == 1
 #   define UINTMAX_C(x)  x##ULL
 #  elif defined GL_UINT64_T
 #   define UINTMAX_C(x)  UINT64_C(x)
diff --git a/darwin-lib/stdio.h b/darwin-lib/stdio.h
index 8aed4ef..839c446 100644
--- a/darwin-lib/stdio.h
+++ b/darwin-lib/stdio.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <stdio.h>.
 
-   Copyright (C) 2004, 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 #pragma GCC system_header
@@ -57,61 +57,6 @@
    May also define off_t to a 64-bit type on native Windows.  */
 #include <sys/types.h>
 
-/* The __attribute__ feature is available in gcc versions 2.5 and later.
-   The __-protected variants of the attributes 'format' and 'printf' are
-   accepted by gcc versions 2.6.4 (effectively 2.7) and later.
-   We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
-   gnulib and libintl do '#define printf __printf__' when they override
-   the 'printf' function.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
-# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
-#else
-# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_PRINTF
-   indicates to GCC that the function takes a format string and arguments,
-   where the format string directives are the ones standardized by ISO C99
-   and POSIX.  */
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
-# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
-   _GL_ATTRIBUTE_FORMAT ((__gnu_printf__, formatstring_parameter, first_argument))
-#else
-# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
-   _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF,
-   except that it indicates to GCC that the supported format string directives
-   are the ones of the system printf(), rather than the ones standardized by
-   ISO C99 and POSIX.  */
-#if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
-# define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
-  _GL_ATTRIBUTE_FORMAT_PRINTF (formatstring_parameter, first_argument)
-#else
-# define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
-  _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_SCANF
-   indicates to GCC that the function takes a format string and arguments,
-   where the format string directives are the ones standardized by ISO C99
-   and POSIX.  */
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
-# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
-   _GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument))
-#else
-# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
-   _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF,
-   except that it indicates to GCC that the supported format string directives
-   are the ones of the system scanf(), rather than the ones standardized by
-   ISO C99 and POSIX.  */
-#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \
-  _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
-
 /* Solaris 10 and NetBSD 7.0 declare renameat in <unistd.h>, not in <stdio.h>.  */
 /* But in any case avoid namespace pollution on glibc systems.  */
 #if (0 || defined GNULIB_POSIXCHECK) && (defined __sun || defined __NetBSD__) \
@@ -147,21 +92,103 @@
 #endif
 
 
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.  */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if __GNUC__ >= 11
+#  define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+#  define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The __-protected variants of the attributes 'format' and 'printf' are
+   accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+   We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
+   gnulib and libintl do '#define printf __printf__' when they override
+   the 'printf' function.  */
+#ifndef _GL_ATTRIBUTE_FORMAT
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || defined __clang__
+#  define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+# else
+#  define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
+# endif
+#endif
+
+/* An __attribute__ __format__ specifier for a function that takes a format
+   string and arguments, where the format string directives are the ones
+   standardized by ISO C99 and POSIX.
+   _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD  */
+/* __gnu_printf__ is supported in GCC >= 4.4.  */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __gnu_printf__
+#else
+# define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __printf__
+#endif
+
+/* An __attribute__ __format__ specifier for a function that takes a format
+   string and arguments, where the format string directives are the ones of the
+   system printf(), rather than the ones standardized by ISO C99 and POSIX.
+   _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM  */
+/* On mingw, Gnulib sets __USE_MINGW_ANSI_STDIO in order to get closer to
+   the standards.  The macro GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU indicates
+   whether this change is effective.  On older mingw, it is not.  */
+#if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
+# define _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD
+#else
+# define _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM __printf__
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD
+   indicates to GCC that the function takes a format string and arguments,
+   where the format string directives are the ones standardized by ISO C99
+   and POSIX.  */
+#define _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD(formatstring_parameter, first_argument) \
+  _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, formatstring_parameter, first_argument))
+
+/* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD,
+   except that it indicates to GCC that the supported format string directives
+   are the ones of the system printf(), rather than the ones standardized by
+   ISO C99 and POSIX.  */
+#define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
+  _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM, formatstring_parameter, first_argument))
+
+/* _GL_ATTRIBUTE_FORMAT_SCANF
+   indicates to GCC that the function takes a format string and arguments,
+   where the format string directives are the ones standardized by ISO C99
+   and POSIX.  */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
+   _GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument))
+#else
+# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
+   _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF,
+   except that it indicates to GCC that the supported format string directives
+   are the ones of the system scanf(), rather than the ones standardized by
+   ISO C99 and POSIX.  */
+#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \
+  _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
+
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -296,6 +323,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -321,6 +358,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -418,7 +463,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -446,14 +491,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -467,26 +509,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -495,19 +537,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -583,6 +625,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -595,24 +644,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -645,17 +705,17 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define dprintf rpl_dprintf
 #  endif
-_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *restrict format, ...)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                                 _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *format, ...));
+_GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *restrict format, ...));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+_GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *restrict format, ...)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                                 _GL_ARG_NONNULL ((2)));
 #  endif
-_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *format, ...));
+_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *restrict format, ...));
 # endif
 _GL_CXXALIASWARN (dprintf);
 #elif defined GNULIB_POSIXCHECK
@@ -687,24 +747,84 @@
                  "use gnulib module fclose for portable POSIX compliance");
 #endif
 
+#if 1
+/* On native Windows, map 'fcloseall' to '_fcloseall', so that -loldnames is
+   not required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::fcloseall on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fcloseall
+#   define fcloseall _fcloseall
+#  endif
+_GL_CXXALIAS_MDA (fcloseall, int, (void));
+# else
+#  if 0
+#   if defined __FreeBSD__ || defined __DragonFly__
+_GL_CXXALIAS_SYS (fcloseall, void, (void));
+#   else
+_GL_CXXALIAS_SYS (fcloseall, int, (void));
+#   endif
+#  endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || 0
+_GL_CXXALIASWARN (fcloseall);
+# endif
+#endif
+
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef fdopen
 #   define fdopen rpl_fdopen
 #  endif
-_GL_FUNCDECL_RPL (fdopen, FILE *, (int fd, const char *mode)
-                                  _GL_ARG_NONNULL ((2)));
+_GL_FUNCDECL_RPL (fdopen, FILE *,
+                  (int fd, const char *mode)
+                  _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
 _GL_CXXALIAS_RPL (fdopen, FILE *, (int fd, const char *mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fdopen
+#   define fdopen _fdopen
+#  endif
+_GL_CXXALIAS_MDA (fdopen, FILE *, (int fd, const char *mode));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate fdopen with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (fdopen, FILE *,
+                  (int fd, const char *mode)
+                  _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+#  endif
 _GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
 # endif
 _GL_CXXALIASWARN (fdopen);
-#elif defined GNULIB_POSIXCHECK
-# undef fdopen
+#else
+# if 0 && __GNUC__ >= 11 && !defined fdopen
+/* For -Wmismatched-dealloc: Associate fdopen with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (fdopen, FILE *,
+                  (int fd, const char *mode)
+                  _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef fdopen
 /* Assume fdopen is always declared.  */
 _GL_WARN_ON_USE (fdopen, "fdopen on native Windows platforms is not POSIX compliant - "
                  "use gnulib module fdopen for portability");
+# elif 1
+/* On native Windows, map 'fdopen' to '_fdopen', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::fdopen always.  */
+#  if defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef fdopen
+#    define fdopen _fdopen
+#   endif
+_GL_CXXALIAS_MDA (fdopen, FILE *, (int fd, const char *mode));
+#  else
+_GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
+#  endif
+_GL_CXXALIASWARN (fdopen);
+# endif
 #endif
 
 #if 0
@@ -755,11 +875,14 @@
 #   undef fgets
 #   define fgets rpl_fgets
 #  endif
-_GL_FUNCDECL_RPL (fgets, char *, (char *s, int n, FILE *stream)
-                                 _GL_ARG_NONNULL ((1, 3)));
-_GL_CXXALIAS_RPL (fgets, char *, (char *s, int n, FILE *stream));
+_GL_FUNCDECL_RPL (fgets, char *,
+                  (char *restrict s, int n, FILE *restrict stream)
+                  _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (fgets, char *,
+                  (char *restrict s, int n, FILE *restrict stream));
 # else
-_GL_CXXALIAS_SYS (fgets, char *, (char *s, int n, FILE *stream));
+_GL_CXXALIAS_SYS (fgets, char *,
+                  (char *restrict s, int n, FILE *restrict stream));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fgets);
@@ -767,25 +890,58 @@
 #endif
 
 #if 1
-# if 0
+/* On native Windows, map 'fileno' to '_fileno', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::fileno always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fileno
+#   define fileno _fileno
+#  endif
+_GL_CXXALIAS_MDA (fileno, int, (FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (fileno, int, (FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (fileno);
+#endif
+
+#if 1
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef fopen
 #   define fopen rpl_fopen
 #  endif
-_GL_FUNCDECL_RPL (fopen, FILE *, (const char *filename, const char *mode)
-                                 _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (fopen, FILE *, (const char *filename, const char *mode));
+_GL_FUNCDECL_RPL (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+_GL_CXXALIAS_RPL (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode));
 # else
-_GL_CXXALIAS_SYS (fopen, FILE *, (const char *filename, const char *mode));
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate fopen with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+#  endif
+_GL_CXXALIAS_SYS (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fopen);
 # endif
-#elif defined GNULIB_POSIXCHECK
-# undef fopen
+#else
+# if 0 && __GNUC__ >= 11 && !defined fopen
+/* For -Wmismatched-dealloc: Associate fopen with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef fopen
 /* Assume fopen is always declared.  */
 _GL_WARN_ON_USE (fopen, "fopen on native Windows platforms is not POSIX compliant - "
                  "use gnulib module fopen for portability");
+# endif
 #endif
 
 #if 1 || 1
@@ -796,17 +952,21 @@
 #  endif
 #  define GNULIB_overrides_fprintf 1
 #  if 1 || 1
-_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
-                                _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (fprintf, int,
+                  (FILE *restrict fp, const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
 #  else
-_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3)
-                                _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (fprintf, int,
+                  (FILE *restrict fp, const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
 #  endif
-_GL_CXXALIAS_RPL (fprintf, int, (FILE *fp, const char *format, ...));
+_GL_CXXALIAS_RPL (fprintf, int,
+                  (FILE *restrict fp, const char *restrict format, ...));
 # else
-_GL_CXXALIAS_SYS (fprintf, int, (FILE *fp, const char *format, ...));
+_GL_CXXALIAS_SYS (fprintf, int,
+                  (FILE *restrict fp, const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fprintf);
@@ -872,11 +1032,14 @@
 #   undef fputs
 #   define fputs rpl_fputs
 #  endif
-_GL_FUNCDECL_RPL (fputs, int, (const char *string, FILE *stream)
-                              _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (fputs, int, (const char *string, FILE *stream));
+_GL_FUNCDECL_RPL (fputs, int,
+                  (const char *restrict string, FILE *restrict stream)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fputs, int,
+                  (const char *restrict string, FILE *restrict stream));
 # else
-_GL_CXXALIAS_SYS (fputs, int, (const char *string, FILE *stream));
+_GL_CXXALIAS_SYS (fputs, int,
+                  (const char *restrict string, FILE *restrict stream));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fputs);
@@ -889,11 +1052,17 @@
 #   undef fread
 #   define fread rpl_fread
 #  endif
-_GL_FUNCDECL_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream)
-                                 _GL_ARG_NONNULL ((4)));
-_GL_CXXALIAS_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream));
+_GL_FUNCDECL_RPL (fread, size_t,
+                  (void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream)
+                  _GL_ARG_NONNULL ((4)));
+_GL_CXXALIAS_RPL (fread, size_t,
+                  (void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream));
 # else
-_GL_CXXALIAS_SYS (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream));
+_GL_CXXALIAS_SYS (fread, size_t,
+                  (void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fread);
@@ -907,13 +1076,16 @@
 #   define freopen rpl_freopen
 #  endif
 _GL_FUNCDECL_RPL (freopen, FILE *,
-                  (const char *filename, const char *mode, FILE *stream)
+                  (const char *restrict filename, const char *restrict mode,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((2, 3)));
 _GL_CXXALIAS_RPL (freopen, FILE *,
-                  (const char *filename, const char *mode, FILE *stream));
+                  (const char *restrict filename, const char *restrict mode,
+                   FILE *restrict stream));
 # else
 _GL_CXXALIAS_SYS (freopen, FILE *,
-                  (const char *filename, const char *mode, FILE *stream));
+                  (const char *restrict filename, const char *restrict mode,
+                   FILE *restrict stream));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (freopen);
@@ -932,12 +1104,15 @@
 #   undef fscanf
 #   define fscanf rpl_fscanf
 #  endif
-_GL_FUNCDECL_RPL (fscanf, int, (FILE *stream, const char *format, ...)
-                               _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3)
-                               _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (fscanf, int, (FILE *stream, const char *format, ...));
+_GL_FUNCDECL_RPL (fscanf, int,
+                  (FILE *restrict stream, const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fscanf, int,
+                  (FILE *restrict stream, const char *restrict format, ...));
 # else
-_GL_CXXALIAS_SYS (fscanf, int, (FILE *stream, const char *format, ...));
+_GL_CXXALIAS_SYS (fscanf, int,
+                  (FILE *restrict stream, const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fscanf);
@@ -1108,13 +1283,16 @@
 #   define fwrite rpl_fwrite
 #  endif
 _GL_FUNCDECL_RPL (fwrite, size_t,
-                  (const void *ptr, size_t s, size_t n, FILE *stream)
+                  (const void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 4)));
 _GL_CXXALIAS_RPL (fwrite, size_t,
-                  (const void *ptr, size_t s, size_t n, FILE *stream));
+                  (const void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream));
 # else
 _GL_CXXALIAS_SYS (fwrite, size_t,
-                  (const void *ptr, size_t s, size_t n, FILE *stream));
+                  (const void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream));
 
 /* Work around bug 11959 when fortifying glibc 2.4 through 2.15
    <https://sourceware.org/bugzilla/show_bug.cgi?id=11959>,
@@ -1189,22 +1367,26 @@
 #   define getdelim rpl_getdelim
 #  endif
 _GL_FUNCDECL_RPL (getdelim, ssize_t,
-                  (char **lineptr, size_t *linesize, int delimiter,
-                   FILE *stream)
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   int delimiter,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 2, 4)));
 _GL_CXXALIAS_RPL (getdelim, ssize_t,
-                  (char **lineptr, size_t *linesize, int delimiter,
-                   FILE *stream));
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   int delimiter,
+                   FILE *restrict stream));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (getdelim, ssize_t,
-                  (char **lineptr, size_t *linesize, int delimiter,
-                   FILE *stream)
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   int delimiter,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 2, 4)));
 #  endif
 _GL_CXXALIAS_SYS (getdelim, ssize_t,
-                  (char **lineptr, size_t *linesize, int delimiter,
-                   FILE *stream));
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   int delimiter,
+                   FILE *restrict stream));
 # endif
 _GL_CXXALIASWARN (getdelim);
 #elif defined GNULIB_POSIXCHECK
@@ -1228,18 +1410,22 @@
 #   define getline rpl_getline
 #  endif
 _GL_FUNCDECL_RPL (getline, ssize_t,
-                  (char **lineptr, size_t *linesize, FILE *stream)
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 2, 3)));
 _GL_CXXALIAS_RPL (getline, ssize_t,
-                  (char **lineptr, size_t *linesize, FILE *stream));
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   FILE *restrict stream));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (getline, ssize_t,
-                  (char **lineptr, size_t *linesize, FILE *stream)
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 2, 3)));
 #  endif
 _GL_CXXALIAS_SYS (getline, ssize_t,
-                  (char **lineptr, size_t *linesize, FILE *stream));
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   FILE *restrict stream));
 # endif
 # if 1
 _GL_CXXALIASWARN (getline);
@@ -1260,6 +1446,22 @@
 _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
 #endif
 
+#if 1
+/* On native Windows, map 'getw' to '_getw', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::getw always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getw
+#   define getw _getw
+#  endif
+_GL_CXXALIAS_MDA (getw, int, (FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (getw, int, (FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (getw);
+#endif
+
 #if 1 || 0
 struct obstack;
 /* Grow an obstack with formatted output.  Return the number of
@@ -1273,7 +1475,7 @@
 #  endif
 _GL_FUNCDECL_RPL (obstack_printf, int,
                   (struct obstack *obs, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (obstack_printf, int,
                   (struct obstack *obs, const char *format, ...));
@@ -1281,7 +1483,7 @@
 #  if !0
 _GL_FUNCDECL_SYS (obstack_printf, int,
                   (struct obstack *obs, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (obstack_printf, int,
@@ -1294,7 +1496,7 @@
 #  endif
 _GL_FUNCDECL_RPL (obstack_vprintf, int,
                   (struct obstack *obs, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (obstack_vprintf, int,
                   (struct obstack *obs, const char *format, va_list args));
@@ -1302,7 +1504,7 @@
 #  if !0
 _GL_FUNCDECL_SYS (obstack_vprintf, int,
                   (struct obstack *obs, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (obstack_vprintf, int,
@@ -1354,43 +1556,53 @@
 #   undef popen
 #   define popen rpl_popen
 #  endif
-_GL_FUNCDECL_RPL (popen, FILE *, (const char *cmd, const char *mode)
-                                 _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (popen, FILE *,
+                  (const char *cmd, const char *mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
 _GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode));
 # else
-#  if !1
-_GL_FUNCDECL_SYS (popen, FILE *, (const char *cmd, const char *mode)
-                                 _GL_ARG_NONNULL ((1, 2)));
+#  if !1 || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (popen, FILE *,
+                  (const char *cmd, const char *mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
 #  endif
 _GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode));
 # endif
 _GL_CXXALIASWARN (popen);
-#elif defined GNULIB_POSIXCHECK
-# undef popen
-# if HAVE_RAW_DECL_POPEN
+#else
+# if 0 && __GNUC__ >= 11 && !defined popen
+/* For -Wmismatched-dealloc: Associate popen with pclose or rpl_pclose.  */
+_GL_FUNCDECL_SYS (popen, FILE *,
+                  (const char *cmd, const char *mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef popen
+#  if HAVE_RAW_DECL_POPEN
 _GL_WARN_ON_USE (popen, "popen is buggy on some platforms - "
                  "use gnulib module popen or pipe for more portability");
+#  endif
 # endif
 #endif
 
 #if 1 || 1
 # if (1 && 1) \
      || (1 && 0 && (0 || 0))
-#  if defined __GNUC__
+#  if defined __GNUC__ || defined __clang__
 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 /* Don't break __attribute__((format(printf,M,N))).  */
 #    define printf __printf__
 #   endif
 #   if 1 || 1
 _GL_FUNCDECL_RPL_1 (__printf__, int,
-                    (const char *format, ...)
+                    (const char *restrict format, ...)
                     __asm__ ("_"
                              _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
-                    _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2)
+                    _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 2)
                     _GL_ARG_NONNULL ((1)));
 #   else
 _GL_FUNCDECL_RPL_1 (__printf__, int,
-                    (const char *format, ...)
+                    (const char *restrict format, ...)
                     __asm__ ("_"
                              _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
                     _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 2)
@@ -1402,14 +1614,14 @@
 #    define printf rpl_printf
 #   endif
 _GL_FUNCDECL_RPL (printf, int,
-                  (const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2)
+                  (const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 2)
                   _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (printf, int, (const char *format, ...));
+_GL_CXXALIAS_RPL (printf, int, (const char *restrict format, ...));
 #  endif
 #  define GNULIB_overrides_printf 1
 # else
-_GL_CXXALIAS_SYS (printf, int, (const char *format, ...));
+_GL_CXXALIAS_SYS (printf, int, (const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (printf);
@@ -1473,6 +1685,22 @@
 # endif
 #endif
 
+#if 1
+/* On native Windows, map 'putw' to '_putw', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::putw always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef putw
+#   define putw _putw
+#  endif
+_GL_CXXALIAS_MDA (putw, int, (int w, FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (putw, int, (int w, FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (putw);
+#endif
+
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
@@ -1550,31 +1778,31 @@
 
 #if 1
 # if 0 && 0
-#  if defined __GNUC__
+#  if defined __GNUC__ || defined __clang__
 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #    undef scanf
 /* Don't break __attribute__((format(scanf,M,N))).  */
 #    define scanf __scanf__
 #   endif
 _GL_FUNCDECL_RPL_1 (__scanf__, int,
-                    (const char *format, ...)
+                    (const char *restrict format, ...)
                     __asm__ ("_"
                              _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_scanf))
                     _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
                     _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *format, ...));
+_GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *restrict format, ...));
 #  else
 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #    undef scanf
 #    define scanf rpl_scanf
 #   endif
-_GL_FUNCDECL_RPL (scanf, int, (const char *format, ...)
+_GL_FUNCDECL_RPL (scanf, int, (const char *restrict format, ...)
                               _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
                               _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (scanf, int, (const char *format, ...));
+_GL_CXXALIAS_RPL (scanf, int, (const char *restrict format, ...));
 #  endif
 # else
-_GL_CXXALIAS_SYS (scanf, int, (const char *format, ...));
+_GL_CXXALIAS_SYS (scanf, int, (const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (scanf);
@@ -1586,23 +1814,30 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define snprintf rpl_snprintf
 #  endif
+#  define GNULIB_overrides_snprintf 1
 _GL_FUNCDECL_RPL (snprintf, int,
-                  (char *str, size_t size, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4)
+                  (char *restrict str, size_t size,
+                   const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 4)
                   _GL_ARG_NONNULL ((3)));
 _GL_CXXALIAS_RPL (snprintf, int,
-                  (char *str, size_t size, const char *format, ...));
+                  (char *restrict str, size_t size,
+                   const char *restrict format, ...));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (snprintf, int,
-                  (char *str, size_t size, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4)
+                  (char *restrict str, size_t size,
+                   const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 4)
                   _GL_ARG_NONNULL ((3)));
 #  endif
 _GL_CXXALIAS_SYS (snprintf, int,
-                  (char *str, size_t size, const char *format, ...));
+                  (char *restrict str, size_t size,
+                   const char *restrict format, ...));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (snprintf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef snprintf
 # if HAVE_RAW_DECL_SNPRINTF
@@ -1625,12 +1860,16 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define sprintf rpl_sprintf
 #  endif
-_GL_FUNCDECL_RPL (sprintf, int, (char *str, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
-                                _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (sprintf, int, (char *str, const char *format, ...));
+#  define GNULIB_overrides_sprintf 1
+_GL_FUNCDECL_RPL (sprintf, int,
+                  (char *restrict str, const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (sprintf, int,
+                  (char *restrict str, const char *restrict format, ...));
 # else
-_GL_CXXALIAS_SYS (sprintf, int, (char *str, const char *format, ...));
+_GL_CXXALIAS_SYS (sprintf, int,
+                  (char *restrict str, const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (sprintf);
@@ -1643,24 +1882,53 @@
                  "POSIX compliance");
 #endif
 
+#if 1
+/* On native Windows, map 'tempnam' to '_tempnam', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::tempnam always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef tempnam
+#   define tempnam _tempnam
+#  endif
+_GL_CXXALIAS_MDA (tempnam, char *, (const char *dir, const char *prefix));
+# else
+_GL_CXXALIAS_SYS (tempnam, char *, (const char *dir, const char *prefix));
+# endif
+_GL_CXXALIASWARN (tempnam);
+#endif
+
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define tmpfile rpl_tmpfile
 #  endif
-_GL_FUNCDECL_RPL (tmpfile, FILE *, (void));
+_GL_FUNCDECL_RPL (tmpfile, FILE *, (void)
+                                   _GL_ATTRIBUTE_DEALLOC (fclose, 1));
 _GL_CXXALIAS_RPL (tmpfile, FILE *, (void));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate tmpfile with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (tmpfile, FILE *, (void)
+                                   _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+#  endif
 _GL_CXXALIAS_SYS (tmpfile, FILE *, (void));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (tmpfile);
 # endif
-#elif defined GNULIB_POSIXCHECK
-# undef tmpfile
-# if HAVE_RAW_DECL_TMPFILE
+#else
+# if 0 && __GNUC__ >= 11 && !defined tmpfile
+/* For -Wmismatched-dealloc: Associate tmpfile with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (tmpfile, FILE *, (void)
+                                   _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef tmpfile
+#  if HAVE_RAW_DECL_TMPFILE
 _GL_WARN_ON_USE (tmpfile, "tmpfile is not usable on mingw - "
                  "use gnulib module tmpfile for portability");
+#  endif
 # endif
 #endif
 
@@ -1673,9 +1941,10 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define asprintf rpl_asprintf
 #  endif
+#  define GNULIB_overrides_asprintf
 _GL_FUNCDECL_RPL (asprintf, int,
                   (char **result, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (asprintf, int,
                   (char **result, const char *format, ...));
@@ -1683,7 +1952,7 @@
 #  if !1
 _GL_FUNCDECL_SYS (asprintf, int,
                   (char **result, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (asprintf, int,
@@ -1694,9 +1963,10 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define vasprintf rpl_vasprintf
 #  endif
+#  define GNULIB_overrides_vasprintf 1
 _GL_FUNCDECL_RPL (vasprintf, int,
                   (char **result, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (vasprintf, int,
                   (char **result, const char *format, va_list args));
@@ -1704,7 +1974,7 @@
 #  if !1
 _GL_FUNCDECL_SYS (vasprintf, int,
                   (char **result, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (vasprintf, int,
@@ -1718,22 +1988,27 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define vdprintf rpl_vdprintf
 #  endif
-_GL_FUNCDECL_RPL (vdprintf, int, (int fd, const char *format, va_list args)
-                                 _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
-                                 _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (vdprintf, int, (int fd, const char *format, va_list args));
+_GL_FUNCDECL_RPL (vdprintf, int,
+                  (int fd, const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (vdprintf, int,
+                  (int fd, const char *restrict format, va_list args));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (vdprintf, int, (int fd, const char *format, va_list args)
-                                 _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
-                                 _GL_ARG_NONNULL ((2)));
+_GL_FUNCDECL_SYS (vdprintf, int,
+                  (int fd, const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+                  _GL_ARG_NONNULL ((2)));
 #  endif
 /* Need to cast, because on Solaris, the third parameter will likely be
                                                     __va_list args.  */
 _GL_CXXALIAS_SYS_CAST (vdprintf, int,
-                       (int fd, const char *format, va_list args));
+                       (int fd, const char *restrict format, va_list args));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vdprintf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef vdprintf
 # if HAVE_RAW_DECL_VDPRINTF
@@ -1750,21 +2025,28 @@
 #  endif
 #  define GNULIB_overrides_vfprintf 1
 #  if 1
-_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)
-                                 _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
-                                 _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (vfprintf, int,
+                  (FILE *restrict fp,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+                  _GL_ARG_NONNULL ((1, 2)));
 #  else
-_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)
-                                 _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0)
-                                 _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (vfprintf, int,
+                  (FILE *restrict fp,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0)
+                  _GL_ARG_NONNULL ((1, 2)));
 #  endif
-_GL_CXXALIAS_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args));
+_GL_CXXALIAS_RPL (vfprintf, int,
+                  (FILE *restrict fp,
+                   const char *restrict format, va_list args));
 # else
 /* Need to cast, because on Solaris, the third parameter is
                                                       __va_list args
    and GCC's fixincludes did not change this to __gnuc_va_list.  */
 _GL_CXXALIAS_SYS_CAST (vfprintf, int,
-                       (FILE *fp, const char *format, va_list args));
+                       (FILE *restrict fp,
+                        const char *restrict format, va_list args));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vfprintf);
@@ -1787,16 +2069,21 @@
 #   define vfscanf rpl_vfscanf
 #  endif
 _GL_FUNCDECL_RPL (vfscanf, int,
-                  (FILE *stream, const char *format, va_list args)
+                  (FILE *restrict stream,
+                   const char *restrict format, va_list args)
                   _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (vfscanf, int,
-                  (FILE *stream, const char *format, va_list args));
+                  (FILE *restrict stream,
+                   const char *restrict format, va_list args));
 # else
 _GL_CXXALIAS_SYS (vfscanf, int,
-                  (FILE *stream, const char *format, va_list args));
+                  (FILE *restrict stream,
+                   const char *restrict format, va_list args));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vfscanf);
+# endif
 #endif
 
 #if 0 || 1
@@ -1807,20 +2094,21 @@
 #  endif
 #  define GNULIB_overrides_vprintf 1
 #  if 0 || 1
-_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (1, 0)
+_GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 0)
                                 _GL_ARG_NONNULL ((1)));
 #  else
-_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args)
+_GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args)
                                 _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 0)
                                 _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_RPL (vprintf, int, (const char *format, va_list args));
+_GL_CXXALIAS_RPL (vprintf, int, (const char *restrict format, va_list args));
 # else
 /* Need to cast, because on Solaris, the second parameter is
                                                           __va_list args
    and GCC's fixincludes did not change this to __gnuc_va_list.  */
-_GL_CXXALIAS_SYS_CAST (vprintf, int, (const char *format, va_list args));
+_GL_CXXALIAS_SYS_CAST (vprintf, int,
+                       (const char *restrict format, va_list args));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vprintf);
@@ -1842,14 +2130,16 @@
 #   undef vscanf
 #   define vscanf rpl_vscanf
 #  endif
-_GL_FUNCDECL_RPL (vscanf, int, (const char *format, va_list args)
+_GL_FUNCDECL_RPL (vscanf, int, (const char *restrict format, va_list args)
                                _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 0)
                                _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (vscanf, int, (const char *format, va_list args));
+_GL_CXXALIAS_RPL (vscanf, int, (const char *restrict format, va_list args));
 # else
-_GL_CXXALIAS_SYS (vscanf, int, (const char *format, va_list args));
+_GL_CXXALIAS_SYS (vscanf, int, (const char *restrict format, va_list args));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vscanf);
+# endif
 #endif
 
 #if 1
@@ -1857,23 +2147,30 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define vsnprintf rpl_vsnprintf
 #  endif
+#  define GNULIB_overrides_vsnprintf 1
 _GL_FUNCDECL_RPL (vsnprintf, int,
-                  (char *str, size_t size, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0)
+                  (char *restrict str, size_t size,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0)
                   _GL_ARG_NONNULL ((3)));
 _GL_CXXALIAS_RPL (vsnprintf, int,
-                  (char *str, size_t size, const char *format, va_list args));
+                  (char *restrict str, size_t size,
+                   const char *restrict format, va_list args));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (vsnprintf, int,
-                  (char *str, size_t size, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0)
+                  (char *restrict str, size_t size,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0)
                   _GL_ARG_NONNULL ((3)));
 #  endif
 _GL_CXXALIAS_SYS (vsnprintf, int,
-                  (char *str, size_t size, const char *format, va_list args));
+                  (char *restrict str, size_t size,
+                   const char *restrict format, va_list args));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vsnprintf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef vsnprintf
 # if HAVE_RAW_DECL_VSNPRINTF
@@ -1887,18 +2184,22 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define vsprintf rpl_vsprintf
 #  endif
+#  define GNULIB_overrides_vsprintf 1
 _GL_FUNCDECL_RPL (vsprintf, int,
-                  (char *str, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  (char *restrict str,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (vsprintf, int,
-                  (char *str, const char *format, va_list args));
+                  (char *restrict str,
+                   const char *restrict format, va_list args));
 # else
 /* Need to cast, because on Solaris, the third parameter is
                                                        __va_list args
    and GCC's fixincludes did not change this to __gnuc_va_list.  */
 _GL_CXXALIAS_SYS_CAST (vsprintf, int,
-                       (char *str, const char *format, va_list args));
+                       (char *restrict str,
+                        const char *restrict format, va_list args));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vsprintf);
diff --git a/darwin-lib/stdlib.h b/darwin-lib/stdlib.h
index 60428b5..8e2d762 100644
--- a/darwin-lib/stdlib.h
+++ b/darwin-lib/stdlib.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <stdlib.h>.
 
-   Copyright (C) 1995, 2001-2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 1995, 2001-2004, 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
@@ -54,8 +54,8 @@
 # include <sys/loadavg.h>
 #endif
 
-/* Native Windows platforms declare mktemp() in <io.h>.  */
-#if 0 && (defined _WIN32 && ! defined __CYGWIN__)
+/* Native Windows platforms declare _mktemp() in <io.h>.  */
+#if defined _WIN32 && !defined __CYGWIN__
 # include <io.h>
 #endif
 
@@ -100,29 +100,60 @@
 # include <unistd.h>
 #endif
 
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.  */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if __GNUC__ >= 11
+#  define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+#  define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
+   can be freed via 'free'; it can be used only after declaring 'free'.  */
+/* Applies to: functions.  Cannot be used on inline functions.  */
+#ifndef _GL_ATTRIBUTE_DEALLOC_FREE
+# define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (free, 1)
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+   allocated memory.  */
+/* Applies to: functions.  */
+#ifndef _GL_ATTRIBUTE_MALLOC
+# if __GNUC__ >= 3 || defined __clang__
+#  define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+#  define _GL_ATTRIBUTE_MALLOC
+# endif
+#endif
+
 /* The __attribute__ feature is available in gcc versions 2.5 and later.
    The attribute __pure__ was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define _GL_ATTRIBUTE_PURE /* empty */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
 #endif
 
 /* The definition of _Noreturn is copied here.  */
 /* A C macro for declaring that a function does not return.
-   Copyright (C) 2011-2019 Free Software Foundation, Inc.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _Noreturn
@@ -137,11 +168,16 @@
        AIX system header files and several gnulib header files use precisely
        this syntax with 'extern'.  */
 #  define _Noreturn [[noreturn]]
-# elif ((!defined __cplusplus || defined __clang__)                     \
-        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)  \
-            || 4 < __GNUC__ + (7 <= __GNUC_MINOR__)))
+# elif ((!defined __cplusplus || defined __clang__) \
+        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
+            || (!defined __STRICT_ANSI__ \
+                && (4 < __GNUC__ + (7 <= __GNUC_MINOR__) \
+                    || (defined __apple_build_version__ \
+                        ? 6000000 <= __apple_build_version__ \
+                        : 3 < __clang_major__ + (5 <= __clang_minor__))))))
    /* _Noreturn works as-is.  */
-# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
+# elif (2 < __GNUC__ + (8 <= __GNUC_MINOR__) || defined __clang__ \
+        || 0x5110 <= __SUNPRO_C)
 #  define _Noreturn __attribute__ ((__noreturn__))
 # elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
 #  define _Noreturn __declspec (noreturn)
@@ -152,19 +188,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -299,6 +335,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -324,6 +370,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -421,7 +475,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -449,14 +503,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -470,26 +521,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -498,19 +549,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -586,6 +637,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -598,24 +656,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -661,6 +730,69 @@
 #endif
 
 
+#if 1
+# if 1
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef free
+#   define free rpl_free
+#  endif
+_GL_FUNCDECL_RPL (free, void, (void *ptr));
+_GL_CXXALIAS_RPL (free, void, (void *ptr));
+# else
+_GL_CXXALIAS_SYS (free, void, (void *ptr));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (free);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef free
+/* Assume free is always declared.  */
+_GL_WARN_ON_USE (free, "free is not future POSIX compliant everywhere - "
+                 "use gnulib module free for portability");
+#endif
+
+
+/* Allocate memory with indefinite extent and specified alignment.  */
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef aligned_alloc
+#   define aligned_alloc rpl_aligned_alloc
+#  endif
+_GL_FUNCDECL_RPL (aligned_alloc, void *,
+                  (size_t alignment, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+_GL_CXXALIAS_RPL (aligned_alloc, void *, (size_t alignment, size_t size));
+# else
+#  if 1
+#   if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate aligned_alloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (aligned_alloc, void *,
+                  (size_t alignment, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#   endif
+_GL_CXXALIAS_SYS (aligned_alloc, void *, (size_t alignment, size_t size));
+#  endif
+# endif
+# if 1
+_GL_CXXALIASWARN (aligned_alloc);
+# endif
+#else
+# if 1 && __GNUC__ >= 11 && !defined aligned_alloc
+/* For -Wmismatched-dealloc: Associate aligned_alloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (aligned_alloc, void *,
+                  (size_t alignment, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef aligned_alloc
+#  if HAVE_RAW_DECL_ALIGNED_ALLOC
+_GL_WARN_ON_USE (aligned_alloc, "aligned_alloc is not portable - "
+                 "use gnulib module aligned_alloc for portability");
+#  endif
+# endif
+#endif
+
 #if 0
 /* Parse a signed decimal integer.
    Returns the value of the integer.  Errors are not detected.  */
@@ -685,19 +817,35 @@
 #   undef calloc
 #   define calloc rpl_calloc
 #  endif
-_GL_FUNCDECL_RPL (calloc, void *, (size_t nmemb, size_t size));
+_GL_FUNCDECL_RPL (calloc, void *,
+                  (size_t nmemb, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (calloc, void *, (size_t nmemb, size_t size));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate calloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (calloc, void *,
+                  (size_t nmemb, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#  endif
 _GL_CXXALIAS_SYS (calloc, void *, (size_t nmemb, size_t size));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (calloc);
 # endif
-#elif defined GNULIB_POSIXCHECK
-# undef calloc
+#else
+# if 1 && __GNUC__ >= 11 && !defined calloc
+/* For -Wmismatched-dealloc: Associate calloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (calloc, void *,
+                  (size_t nmemb, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef calloc
 /* Assume calloc is always declared.  */
 _GL_WARN_ON_USE (calloc, "calloc is not POSIX compliant everywhere - "
                  "use gnulib module calloc-posix for portability");
+# endif
 #endif
 
 #if 1
@@ -705,23 +853,108 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define canonicalize_file_name rpl_canonicalize_file_name
 #  endif
-_GL_FUNCDECL_RPL (canonicalize_file_name, char *, (const char *name)
-                                                  _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_RPL (canonicalize_file_name, char *,
+                  (const char *name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (canonicalize_file_name, char *, (const char *name));
 # else
-#  if !0
-_GL_FUNCDECL_SYS (canonicalize_file_name, char *, (const char *name)
-                                                  _GL_ARG_NONNULL ((1)));
+#  if !0 || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (canonicalize_file_name, char *,
+                  (const char *name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 #  endif
 _GL_CXXALIAS_SYS (canonicalize_file_name, char *, (const char *name));
 # endif
+# ifndef GNULIB_defined_canonicalize_file_name
+#  define GNULIB_defined_canonicalize_file_name \
+     (!0 || 0)
+# endif
 _GL_CXXALIASWARN (canonicalize_file_name);
-#elif defined GNULIB_POSIXCHECK
-# undef canonicalize_file_name
-# if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
+#else
+# if 1 && __GNUC__ >= 11 && !defined canonicalize_file_name
+/* For -Wmismatched-dealloc: Associate canonicalize_file_name with free or
+   rpl_free.  */
+_GL_FUNCDECL_SYS (canonicalize_file_name, char *,
+                  (const char *name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef canonicalize_file_name
+#  if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
 _GL_WARN_ON_USE (canonicalize_file_name,
                  "canonicalize_file_name is unportable - "
                  "use gnulib module canonicalize-lgpl for portability");
+#  endif
+# endif
+#endif
+
+#if 1
+/* On native Windows, map 'ecvt' to '_ecvt', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::ecvt on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef ecvt
+#   define ecvt _ecvt
+#  endif
+_GL_CXXALIAS_MDA (ecvt, char *,
+                  (double number, int ndigits, int *decptp, int *signp));
+# else
+#  if 1
+_GL_CXXALIAS_SYS (ecvt, char *,
+                  (double number, int ndigits, int *decptp, int *signp));
+#  endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || 1
+_GL_CXXALIASWARN (ecvt);
+# endif
+#endif
+
+#if 1
+/* On native Windows, map 'fcvt' to '_fcvt', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::fcvt on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fcvt
+#   define fcvt _fcvt
+#  endif
+_GL_CXXALIAS_MDA (fcvt, char *,
+                  (double number, int ndigits, int *decptp, int *signp));
+# else
+#  if 1
+_GL_CXXALIAS_SYS (fcvt, char *,
+                  (double number, int ndigits, int *decptp, int *signp));
+#  endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || 1
+_GL_CXXALIASWARN (fcvt);
+# endif
+#endif
+
+#if 1
+/* On native Windows, map 'gcvt' to '_gcvt', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::gcvt on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef gcvt
+#   define gcvt _gcvt
+#  endif
+_GL_CXXALIAS_MDA (gcvt, char *, (double number, int ndigits, char *buf));
+# else
+#  if 1
+_GL_CXXALIAS_SYS (gcvt, char *, (double number, int ndigits, char *buf));
+#  endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || 1
+_GL_CXXALIASWARN (gcvt);
 # endif
 #endif
 
@@ -799,19 +1032,35 @@
 #   undef malloc
 #   define malloc rpl_malloc
 #  endif
-_GL_FUNCDECL_RPL (malloc, void *, (size_t size));
+_GL_FUNCDECL_RPL (malloc, void *,
+                  (size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (malloc, void *, (size_t size));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate malloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (malloc, void *,
+                  (size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#  endif
 _GL_CXXALIAS_SYS (malloc, void *, (size_t size));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (malloc);
 # endif
-#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
-# undef malloc
+#else
+# if 1 && __GNUC__ >= 11 && !defined malloc
+/* For -Wmismatched-dealloc: Associate malloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (malloc, void *,
+                  (size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+#  undef malloc
 /* Assume malloc is always declared.  */
 _GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - "
                  "use gnulib module malloc-posix for portability");
+# endif
 #endif
 
 /* Convert a multibyte character to a wide character.  */
@@ -821,13 +1070,17 @@
 #   undef mbtowc
 #   define mbtowc rpl_mbtowc
 #  endif
-_GL_FUNCDECL_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
-_GL_CXXALIAS_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+_GL_FUNCDECL_RPL (mbtowc, int,
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n));
+_GL_CXXALIAS_RPL (mbtowc, int,
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+_GL_FUNCDECL_SYS (mbtowc, int,
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n));
 #  endif
-_GL_CXXALIAS_SYS (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+_GL_CXXALIAS_SYS (mbtowc, int,
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (mbtowc);
@@ -972,6 +1225,51 @@
 # endif
 #endif
 
+#if 1
+/* On native Windows, map 'mktemp' to '_mktemp', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::mktemp always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef mktemp
+#   define mktemp _mktemp
+#  endif
+_GL_CXXALIAS_MDA (mktemp, char *, (char * /*template*/));
+# else
+_GL_CXXALIAS_SYS (mktemp, char *, (char * /*template*/));
+# endif
+_GL_CXXALIASWARN (mktemp);
+#endif
+
+/* Allocate memory with indefinite extent and specified alignment.  */
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef posix_memalign
+#   define posix_memalign rpl_posix_memalign
+#  endif
+_GL_FUNCDECL_RPL (posix_memalign, int,
+                  (void **memptr, size_t alignment, size_t size)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_memalign, int,
+                  (void **memptr, size_t alignment, size_t size));
+# else
+#  if 1
+_GL_CXXALIAS_SYS (posix_memalign, int,
+                  (void **memptr, size_t alignment, size_t size));
+#  endif
+# endif
+# if 1
+_GL_CXXALIASWARN (posix_memalign);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_memalign
+# if HAVE_RAW_DECL_POSIX_MEMALIGN
+_GL_WARN_ON_USE (posix_memalign, "posix_memalign is not portable - "
+                 "use gnulib module posix_memalign for portability");
+# endif
+#endif
+
 #if 0
 /* Return an FD open to the master side of a pseudo-terminal.  Flags should
    include O_RDWR, and may also include O_NOCTTY.  */
@@ -1030,6 +1328,9 @@
 #  endif
 _GL_CXXALIAS_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
 # endif
+# ifndef GNULIB_defined_ptsname_r
+#  define GNULIB_defined_ptsname_r (!1 || 0)
+# endif
 _GL_CXXALIASWARN (ptsname_r);
 #elif defined GNULIB_POSIXCHECK
 # undef ptsname_r
@@ -1047,6 +1348,28 @@
 #  endif
 _GL_FUNCDECL_RPL (putenv, int, (char *string) _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (putenv, int, (char *string));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef putenv
+#   define putenv _putenv
+#  endif
+_GL_CXXALIAS_MDA (putenv, int, (char *string));
+# else
+_GL_CXXALIAS_SYS (putenv, int, (char *string));
+# endif
+_GL_CXXALIASWARN (putenv);
+#elif 1
+/* On native Windows, map 'putenv' to '_putenv', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::putenv always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef putenv
+#   define putenv _putenv
+#  endif
+/* Need to cast, because on mingw, the parameter is either
+   'const char *string' or 'char *string'.  */
+_GL_CXXALIAS_MDA_CAST (putenv, int, (char *string));
 # else
 _GL_CXXALIAS_SYS (putenv, int, (char *string));
 # endif
@@ -1113,7 +1436,9 @@
 #  if !1
 _GL_FUNCDECL_SYS (random, long, (void));
 #  endif
-_GL_CXXALIAS_SYS (random, long, (void));
+/* Need to cast, because on Haiku, the return type is
+                               int.  */
+_GL_CXXALIAS_SYS_CAST (random, long, (void));
 # endif
 _GL_CXXALIASWARN (random);
 #elif defined GNULIB_POSIXCHECK
@@ -1280,9 +1605,11 @@
                    struct random_data *rand_state)
                   _GL_ARG_NONNULL ((2, 4)));
 #  endif
-_GL_CXXALIAS_SYS (initstate_r, int,
-                  (unsigned int seed, char *buf, size_t buf_size,
-                   struct random_data *rand_state));
+/* Need to cast, because on Haiku, the third parameter is
+                                                     unsigned long buf_size.  */
+_GL_CXXALIAS_SYS_CAST (initstate_r, int,
+                       (unsigned int seed, char *buf, size_t buf_size,
+                        struct random_data *rand_state));
 # endif
 _GL_CXXALIASWARN (initstate_r);
 #elif defined GNULIB_POSIXCHECK
@@ -1310,8 +1637,10 @@
                   (char *arg_state, struct random_data *rand_state)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
-_GL_CXXALIAS_SYS (setstate_r, int,
-                  (char *arg_state, struct random_data *rand_state));
+/* Need to cast, because on Haiku, the first parameter is
+                        void *arg_state.  */
+_GL_CXXALIAS_SYS_CAST (setstate_r, int,
+                       (char *arg_state, struct random_data *rand_state));
 # endif
 _GL_CXXALIASWARN (setstate_r);
 #elif defined GNULIB_POSIXCHECK
@@ -1330,29 +1659,53 @@
 #   undef realloc
 #   define realloc rpl_realloc
 #  endif
-_GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size));
+_GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size)
+                                   _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (realloc, void *, (void *ptr, size_t size));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate realloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (realloc, void *, (void *ptr, size_t size)
+                                   _GL_ATTRIBUTE_DEALLOC_FREE);
+#  endif
 _GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (realloc);
 # endif
-#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
-# undef realloc
+#else
+# if 1 && __GNUC__ >= 11 && !defined realloc
+/* For -Wmismatched-dealloc: Associate realloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (realloc, void *, (void *ptr, size_t size)
+                                   _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+#  undef realloc
 /* Assume realloc is always declared.  */
 _GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - "
                  "use gnulib module realloc-posix for portability");
+# endif
 #endif
 
 
-#if 0
-# if ! 1
+#if 1
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef reallocarray
+#   define reallocarray rpl_reallocarray
+#  endif
+_GL_FUNCDECL_RPL (reallocarray, void *,
+                  (void *ptr, size_t nmemb, size_t size));
+_GL_CXXALIAS_RPL (reallocarray, void *,
+                  (void *ptr, size_t nmemb, size_t size));
+# else
+#  if ! 0
 _GL_FUNCDECL_SYS (reallocarray, void *,
                   (void *ptr, size_t nmemb, size_t size));
-# endif
+#  endif
 _GL_CXXALIAS_SYS (reallocarray, void *,
                   (void *ptr, size_t nmemb, size_t size));
+# endif
 _GL_CXXALIASWARN (reallocarray);
 #elif defined GNULIB_POSIXCHECK
 # undef reallocarray
@@ -1367,15 +1720,19 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define realpath rpl_realpath
 #  endif
-_GL_FUNCDECL_RPL (realpath, char *, (const char *name, char *resolved)
-                                    _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (realpath, char *, (const char *name, char *resolved));
+_GL_FUNCDECL_RPL (realpath, char *,
+                  (const char *restrict name, char *restrict resolved)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (realpath, char *,
+                  (const char *restrict name, char *restrict resolved));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (realpath, char *, (const char *name, char *resolved)
-                                    _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_SYS (realpath, char *,
+                  (const char *restrict name, char *restrict resolved)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (realpath, char *, (const char *name, char *resolved));
+_GL_CXXALIAS_SYS (realpath, char *,
+                  (const char *restrict name, char *restrict resolved));
 # endif
 _GL_CXXALIASWARN (realpath);
 #elif defined GNULIB_POSIXCHECK
@@ -1451,22 +1808,26 @@
 # endif
 #endif
 
-#if 0
+#if 1
  /* Parse a double from STRING, updating ENDP if appropriate.  */
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define strtod rpl_strtod
 #  endif
 #  define GNULIB_defined_strtod_function 1
-_GL_FUNCDECL_RPL (strtod, double, (const char *str, char **endp)
-                                  _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtod, double, (const char *str, char **endp));
+_GL_FUNCDECL_RPL (strtod, double,
+                  (const char *restrict str, char **restrict endp)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtod, double,
+                  (const char *restrict str, char **restrict endp));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (strtod, double, (const char *str, char **endp)
-                                  _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_SYS (strtod, double,
+                  (const char *restrict str, char **restrict endp)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (strtod, double, (const char *str, char **endp));
+_GL_CXXALIAS_SYS (strtod, double,
+                  (const char *restrict str, char **restrict endp));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (strtod);
@@ -1486,15 +1847,19 @@
 #   define strtold rpl_strtold
 #  endif
 #  define GNULIB_defined_strtold_function 1
-_GL_FUNCDECL_RPL (strtold, long double, (const char *str, char **endp)
-                                        _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtold, long double, (const char *str, char **endp));
+_GL_FUNCDECL_RPL (strtold, long double,
+                  (const char *restrict str, char **restrict endp)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtold, long double,
+                  (const char *restrict str, char **restrict endp));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (strtold, long double, (const char *str, char **endp)
-                                        _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_SYS (strtold, long double,
+                  (const char *restrict str, char **restrict endp)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (strtold, long double, (const char *str, char **endp));
+_GL_CXXALIAS_SYS (strtold, long double,
+                  (const char *restrict str, char **restrict endp));
 # endif
 _GL_CXXALIASWARN (strtold);
 #elif defined GNULIB_POSIXCHECK
@@ -1512,15 +1877,72 @@
    "0x").
    If ENDPTR is not NULL, the address of the first byte after the integer is
    stored in *ENDPTR.
+   Upon overflow, the return value is LONG_MAX or LONG_MIN, and errno is set
+   to ERANGE.  */
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtol rpl_strtol
+#  endif
+#  define GNULIB_defined_strtol_function 1
+_GL_FUNCDECL_RPL (strtol, long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtol, long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (strtol, long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strtol, long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# endif
+_GL_CXXALIASWARN (strtol);
+#elif defined GNULIB_POSIXCHECK
+# undef strtol
+# if HAVE_RAW_DECL_STRTOL
+_GL_WARN_ON_USE (strtol, "strtol is unportable - "
+                 "use gnulib module strtol for portability");
+# endif
+#endif
+
+#if 0
+/* Parse a signed integer whose textual representation starts at STRING.
+   The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+   it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+   "0x").
+   If ENDPTR is not NULL, the address of the first byte after the integer is
+   stored in *ENDPTR.
    Upon overflow, the return value is LLONG_MAX or LLONG_MIN, and errno is set
    to ERANGE.  */
-# if !1
-_GL_FUNCDECL_SYS (strtoll, long long,
-                  (const char *string, char **endptr, int base)
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtoll rpl_strtoll
+#  endif
+#  define GNULIB_defined_strtoll_function 1
+_GL_FUNCDECL_RPL (strtoll, long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
                   _GL_ARG_NONNULL ((1)));
-# endif
+_GL_CXXALIAS_RPL (strtoll, long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (strtoll, long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
 _GL_CXXALIAS_SYS (strtoll, long long,
-                  (const char *string, char **endptr, int base));
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# endif
 _GL_CXXALIASWARN (strtoll);
 #elif defined GNULIB_POSIXCHECK
 # undef strtoll
@@ -1537,15 +1959,71 @@
    "0x").
    If ENDPTR is not NULL, the address of the first byte after the integer is
    stored in *ENDPTR.
+   Upon overflow, the return value is ULONG_MAX, and errno is set to ERANGE.  */
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtoul rpl_strtoul
+#  endif
+#  define GNULIB_defined_strtoul_function 1
+_GL_FUNCDECL_RPL (strtoul, unsigned long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoul, unsigned long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (strtoul, unsigned long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strtoul, unsigned long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# endif
+_GL_CXXALIASWARN (strtoul);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoul
+# if HAVE_RAW_DECL_STRTOUL
+_GL_WARN_ON_USE (strtoul, "strtoul is unportable - "
+                 "use gnulib module strtoul for portability");
+# endif
+#endif
+
+#if 0
+/* Parse an unsigned integer whose textual representation starts at STRING.
+   The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+   it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+   "0x").
+   If ENDPTR is not NULL, the address of the first byte after the integer is
+   stored in *ENDPTR.
    Upon overflow, the return value is ULLONG_MAX, and errno is set to
    ERANGE.  */
-# if !1
-_GL_FUNCDECL_SYS (strtoull, unsigned long long,
-                  (const char *string, char **endptr, int base)
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtoull rpl_strtoull
+#  endif
+#  define GNULIB_defined_strtoull_function 1
+_GL_FUNCDECL_RPL (strtoull, unsigned long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
                   _GL_ARG_NONNULL ((1)));
-# endif
+_GL_CXXALIAS_RPL (strtoull, unsigned long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (strtoull, unsigned long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
 _GL_CXXALIAS_SYS (strtoull, unsigned long long,
-                  (const char *string, char **endptr, int base));
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# endif
 _GL_CXXALIASWARN (strtoull);
 #elif defined GNULIB_POSIXCHECK
 # undef strtoull
diff --git a/darwin-lib/string.h b/darwin-lib/string.h
index 5ed186d..ac01b09 100644
--- a/darwin-lib/string.h
+++ b/darwin-lib/string.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <string.h>.
 
-   Copyright (C) 1995-1996, 2001-2019 Free Software Foundation, Inc.
+   Copyright (C) 1995-1996, 2001-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 #pragma GCC system_header
@@ -53,14 +53,6 @@
 # include <wchar.h>
 #endif
 
-/* The __attribute__ feature is available in gcc versions 2.5 and later.
-   The attribute __pure__ was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define _GL_ATTRIBUTE_PURE /* empty */
-#endif
-
 /* NetBSD 5.0 declares strsignal in <unistd.h>, not in <string.h>.  */
 /* But in any case avoid namespace pollution on glibc systems.  */
 #if (0 || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \
@@ -68,21 +60,39 @@
 # include <unistd.h>
 #endif
 
+/* AIX 7.2 declares ffsl and ffsll in <strings.h>, not in <string.h>.  */
+/* But in any case avoid namespace pollution on glibc systems.  */
+#if ((1 || 0 || defined GNULIB_POSIXCHECK) \
+     && defined _AIX) \
+    && ! defined __GLIBC__
+# include <strings.h>
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The attribute __pure__ was added in gcc 2.96.  */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
+#endif
+
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -217,6 +227,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -242,6 +262,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -339,7 +367,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -367,14 +395,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -388,26 +413,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -416,19 +441,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -504,6 +529,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -516,24 +548,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -547,6 +590,13 @@
 # endif
 #endif
 
+/* Declare 'free' if needed for _GL_ATTRIBUTE_DEALLOC_FREE.  */
+#if (1 && !defined free \
+     && !(defined __cplusplus && defined GNULIB_NAMESPACE))
+_GL_EXTERN_C void free (void *);
+# define free rpl_free
+#endif
+_GL_EXTERN_C void free (void *);
 
 /* Clear a block of memory.  The compiler will not delete a call to
    this function, even if the block is dead after the call.  */
@@ -566,7 +616,7 @@
 #endif
 
 /* Find the index of the least-significant set bit.  */
-#if 0
+#if 1
 # if !1
 _GL_FUNCDECL_SYS (ffsl, int, (long int i));
 # endif
@@ -582,10 +632,18 @@
 
 /* Find the index of the least-significant set bit.  */
 #if 0
-# if !1
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define ffsll rpl_ffsll
+#  endif
+_GL_FUNCDECL_RPL (ffsll, int, (long long int i));
+_GL_CXXALIAS_RPL (ffsll, int, (long long int i));
+# else
+#  if !1
 _GL_FUNCDECL_SYS (ffsll, int, (long long int i));
-# endif
+#  endif
 _GL_CXXALIAS_SYS (ffsll, int, (long long int i));
+# endif
 _GL_CXXALIASWARN (ffsll);
 #elif defined GNULIB_POSIXCHECK
 # undef ffsll
@@ -595,10 +653,30 @@
 #endif
 
 
+#if 1
+/* On native Windows, map 'memccpy' to '_memccpy', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::memccpy always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef memccpy
+#   define memccpy _memccpy
+#  endif
+_GL_CXXALIAS_MDA (memccpy, void *,
+                  (void *dest, const void *src, int c, size_t n));
+# else
+_GL_CXXALIAS_SYS (memccpy, void *,
+                  (void *dest, const void *src, int c, size_t n));
+# endif
+_GL_CXXALIASWARN (memccpy);
+#endif
+
+
 /* Return the first instance of C within N bytes of S, or NULL.  */
 #if 1
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef memchr
 #   define memchr rpl_memchr
 #  endif
 _GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n)
@@ -606,11 +684,6 @@
                                   _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n));
 # else
-#  if ! 1
-_GL_FUNCDECL_SYS (memchr, void *, (void const *__s, int __c, size_t __n)
-                                  _GL_ATTRIBUTE_PURE
-                                  _GL_ARG_NONNULL ((1)));
-#  endif
   /* On some systems, this function is defined as an overloaded function:
        extern "C" { const void * std::memchr (const void *, int, size_t); }
        extern "C++" { void * std::memchr (void *, int, size_t); }  */
@@ -671,8 +744,8 @@
 
 /* Copy N bytes of SRC to DEST, return pointer to bytes after the
    last written byte.  */
-#if 0
-# if ! 1
+#if 1
+# if ! 0
 _GL_FUNCDECL_SYS (mempcpy, void *,
                   (void *restrict __dest, void const *restrict __src,
                    size_t __n)
@@ -691,8 +764,8 @@
 #endif
 
 /* Search backwards through a block for a byte (specified as an int).  */
-#if 0
-# if ! 1
+#if 1
+# if ! 0
 _GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t)
                                    _GL_ATTRIBUTE_PURE
                                    _GL_ARG_NONNULL ((1)));
@@ -721,8 +794,8 @@
 /* Find the first occurrence of C in S.  More efficient than
    memchr(S,C,N), at the expense of undefined behavior if C does not
    occur within N bytes.  */
-#if 0
-# if ! 1
+#if 1
+# if ! 0
 _GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in)
                                      _GL_ATTRIBUTE_PURE
                                      _GL_ARG_NONNULL ((1)));
@@ -768,7 +841,7 @@
 
 /* Copy no more than N bytes of SRC to DST, returning a pointer past the
    last non-NUL byte written into DST.  */
-#if 0
+#if 1
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef stpncpy
@@ -806,13 +879,15 @@
    GB18030 and the character to be searched is a digit.  */
 # undef strchr
 /* Assume strchr is always declared.  */
-_GL_WARN_ON_USE (strchr, "strchr cannot work correctly on character strings "
-                 "in some multibyte locales - "
-                 "use mbschr if you care about internationalization");
+_GL_WARN_ON_USE_CXX (strchr,
+                     const char *, char *, (const char *, int),
+                     "strchr cannot work correctly on character strings "
+                     "in some multibyte locales - "
+                     "use mbschr if you care about internationalization");
 #endif
 
 /* Find the first occurrence of C in S or the final NUL byte.  */
-#if 0
+#if 1
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define strchrnul rpl_strchrnul
@@ -823,7 +898,7 @@
 _GL_CXXALIAS_RPL (strchrnul, char *,
                   (const char *str, int ch));
 # else
-#  if ! 1
+#  if ! 0
 _GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in)
                                      _GL_ATTRIBUTE_PURE
                                      _GL_ARG_NONNULL ((1)));
@@ -857,24 +932,62 @@
 #   undef strdup
 #   define strdup rpl_strdup
 #  endif
-_GL_FUNCDECL_RPL (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_RPL (strdup, char *,
+                  (char const *__s)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (strdup, char *, (char const *__s));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strdup
+#   define strdup _strdup
+#  endif
+_GL_CXXALIAS_MDA (strdup, char *, (char const *__s));
 # else
 #  if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
     /* strdup exists as a function and as a macro.  Get rid of the macro.  */
 #   undef strdup
 #  endif
-#  if !(1 || defined strdup)
-_GL_FUNCDECL_SYS (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
+#  if (!1 || __GNUC__ >= 11) && !defined strdup
+_GL_FUNCDECL_SYS (strdup, char *,
+                  (char const *__s)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 #  endif
 _GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
 # endif
 _GL_CXXALIASWARN (strdup);
-#elif defined GNULIB_POSIXCHECK
-# undef strdup
-# if HAVE_RAW_DECL_STRDUP
+#else
+# if __GNUC__ >= 11 && !defined strdup
+/* For -Wmismatched-dealloc: Associate strdup with free or rpl_free.  */
+_GL_FUNCDECL_SYS (strdup, char *,
+                  (char const *__s)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef strdup
+#  if HAVE_RAW_DECL_STRDUP
 _GL_WARN_ON_USE (strdup, "strdup is unportable - "
                  "use gnulib module strdup for portability");
+#  endif
+# elif 1
+/* On native Windows, map 'creat' to '_creat', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::strdup always.  */
+#  if defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef strdup
+#    define strdup _strdup
+#   endif
+_GL_CXXALIAS_MDA (strdup, char *, (char const *__s));
+#  else
+#   if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
+#    undef strdup
+#   endif
+_GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
+#  endif
+_GL_CXXALIASWARN (strdup);
 # endif
 #endif
 
@@ -885,11 +998,14 @@
 #   undef strncat
 #   define strncat rpl_strncat
 #  endif
-_GL_FUNCDECL_RPL (strncat, char *, (char *dest, const char *src, size_t n)
-                                   _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (strncat, char *, (char *dest, const char *src, size_t n));
+_GL_FUNCDECL_RPL (strncat, char *,
+                  (char *restrict dest, const char *restrict src, size_t n)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strncat, char *,
+                  (char *restrict dest, const char *restrict src, size_t n));
 # else
-_GL_CXXALIAS_SYS (strncat, char *, (char *dest, const char *src, size_t n));
+_GL_CXXALIAS_SYS (strncat, char *,
+                  (char *restrict dest, const char *restrict src, size_t n));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (strncat);
@@ -997,15 +1113,19 @@
    locale encoding is GB18030 and one of the characters to be searched is a
    digit.  */
 #  undef strpbrk
-_GL_WARN_ON_USE (strpbrk, "strpbrk cannot work correctly on character strings "
-                 "in multibyte locales - "
-                 "use mbspbrk if you care about internationalization");
+_GL_WARN_ON_USE_CXX (strpbrk,
+                     const char *, char *, (const char *, const char *),
+                     "strpbrk cannot work correctly on character strings "
+                     "in multibyte locales - "
+                     "use mbspbrk if you care about internationalization");
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef strpbrk
 # if HAVE_RAW_DECL_STRPBRK
-_GL_WARN_ON_USE (strpbrk, "strpbrk is unportable - "
-                 "use gnulib module strpbrk for portability");
+_GL_WARN_ON_USE_CXX (strpbrk,
+                     const char *, char *, (const char *, const char *),
+                     "strpbrk is unportable - "
+                     "use gnulib module strpbrk for portability");
 # endif
 #endif
 
@@ -1024,9 +1144,11 @@
    GB18030 and the character to be searched is a digit.  */
 # undef strrchr
 /* Assume strrchr is always declared.  */
-_GL_WARN_ON_USE (strrchr, "strrchr cannot work correctly on character strings "
-                 "in some multibyte locales - "
-                 "use mbsrchr if you care about internationalization");
+_GL_WARN_ON_USE_CXX (strrchr,
+                     const char *, char *, (const char *, int),
+                     "strrchr cannot work correctly on character strings "
+                     "in some multibyte locales - "
+                     "use mbsrchr if you care about internationalization");
 #endif
 
 /* Search the next delimiter (char listed in DELIM) starting at *STRINGP.
@@ -1440,7 +1562,8 @@
    Caveat: The identity of the delimiting character is lost.
 
    See also mbssep().  */
-_GL_EXTERN_C char * mbstok_r (char *string, const char *delim, char **save_ptr)
+_GL_EXTERN_C char * mbstok_r (char *restrict string, const char *delim,
+                              char **save_ptr)
      _GL_ARG_NONNULL ((2, 3));
 #endif
 
@@ -1495,6 +1618,60 @@
 # endif
 #endif
 
+/* Return the name of the system error code ERRNUM.  */
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strerrorname_np
+#   define strerrorname_np rpl_strerrorname_np
+#  endif
+_GL_FUNCDECL_RPL (strerrorname_np, const char *, (int errnum));
+_GL_CXXALIAS_RPL (strerrorname_np, const char *, (int errnum));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (strerrorname_np, const char *, (int errnum));
+#  endif
+_GL_CXXALIAS_SYS (strerrorname_np, const char *, (int errnum));
+# endif
+_GL_CXXALIASWARN (strerrorname_np);
+#elif defined GNULIB_POSIXCHECK
+# undef strerrorname_np
+# if HAVE_RAW_DECL_STRERRORNAME_NP
+_GL_WARN_ON_USE (strerrorname_np, "strerrorname_np is unportable - "
+                 "use gnulib module strerrorname_np for portability");
+# endif
+#endif
+
+/* Return an abbreviation string for the signal number SIG.  */
+#if 0
+# if ! 1
+_GL_FUNCDECL_SYS (sigabbrev_np, const char *, (int sig));
+# endif
+_GL_CXXALIAS_SYS (sigabbrev_np, const char *, (int sig));
+_GL_CXXALIASWARN (sigabbrev_np);
+#elif defined GNULIB_POSIXCHECK
+# undef sigabbrev_np
+# if HAVE_RAW_DECL_SIGABBREV_NP
+_GL_WARN_ON_USE (sigabbrev_np, "sigabbrev_np is unportable - "
+                 "use gnulib module sigabbrev_np for portability");
+# endif
+#endif
+
+/* Return an English description string for the signal number SIG.  */
+#if 0
+# if ! 1
+_GL_FUNCDECL_SYS (sigdescr_np, const char *, (int sig));
+# endif
+_GL_CXXALIAS_SYS (sigdescr_np, const char *, (int sig));
+_GL_CXXALIASWARN (sigdescr_np);
+#elif defined GNULIB_POSIXCHECK
+# undef sigdescr_np
+# if HAVE_RAW_DECL_SIGDESCR_NP
+_GL_WARN_ON_USE (sigdescr_np, "sigdescr_np is unportable - "
+                 "use gnulib module sigdescr_np for portability");
+# endif
+#endif
+
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
diff --git a/darwin-lib/termios.h b/darwin-lib/termios.h
new file mode 100644
index 0000000..5865c9c
--- /dev/null
+++ b/darwin-lib/termios.h
@@ -0,0 +1,554 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Substitute for and wrapper around <termios.h>.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_TERMIOS_H
+
+#if __GNUC__ >= 3
+#pragma GCC system_header
+#endif
+
+
+/* On HP-UX 11.00, some of the function declarations in <sys/termio.h>,
+   included by <termios.h>, are not protected by extern "C".  Enforce
+   "C" linkage for these functions nevertheless.  */
+#if defined __hpux && defined __cplusplus
+# include <sys/types.h>
+# include <sys/ioctl.h>
+extern "C" {
+# include <sys/termio.h>
+}
+#endif
+
+/* The include_next requires a split double-inclusion guard.  */
+#if 1
+# include_next <termios.h>
+#endif
+
+#ifndef _GL_TERMIOS_H
+#define _GL_TERMIOS_H
+
+/* Get pid_t.  */
+#include <sys/types.h>
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+/* C++ compatible function declaration macros.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_CXXDEFS_H
+#define _GL_CXXDEFS_H
+
+/* Begin/end the GNULIB_NAMESPACE namespace.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
+# define _GL_END_NAMESPACE }
+#else
+# define _GL_BEGIN_NAMESPACE
+# define _GL_END_NAMESPACE
+#endif
+
+/* The three most frequent use cases of these macros are:
+
+   * For providing a substitute for a function that is missing on some
+     platforms, but is declared and works fine on the platforms on which
+     it exists:
+
+       #if @GNULIB_FOO@
+       # if !@HAVE_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       # endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on all platforms,
+     but is broken/insufficient and needs to be replaced on some platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on some platforms
+     but is broken/insufficient and needs to be replaced on some of them and
+     is additionally either missing or undeclared on some other platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       #  if !@HAVE_FOO@   or   if !@HAVE_DECL_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       #  endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+*/
+
+/* _GL_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#if defined __cplusplus
+# define _GL_EXTERN_C extern "C"
+#else
+# define _GL_EXTERN_C extern
+#endif
+
+/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
+   declares a replacement function, named rpl_func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
+  _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
+#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype rpl_func parameters_and_attributes
+
+/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
+   declares the system function, named func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype func parameters_and_attributes
+
+/* _GL_CXXALIAS_RPL (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+
+   Wrapping rpl_func in an object with an inline conversion operator
+   avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::rpl_func;                                  \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
+   is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
+   except that the C function rpl_func may have a slightly different
+   declaration.  A cast is used to silence the "invalid conversion" error
+   that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                     \
+    {                                                              \
+      static const struct _gl_ ## func ## _wrapper                 \
+      {                                                            \
+        typedef rettype (*type) parameters;                        \
+                                                                   \
+        inline operator type () const                              \
+        {                                                          \
+          return reinterpret_cast<type>(::rpl_func);               \
+        }                                                          \
+      } func = {};                                                 \
+    }                                                              \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_SYS (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to the system provided function func, if GNULIB_NAMESPACE
+   is defined.
+   Example:
+     _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+
+   Wrapping func in an object with an inline conversion operator
+   avoids a reference to func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS(func,rettype,parameters)            \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::func;                                      \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                          \
+    {                                                   \
+      static const struct _gl_ ## func ## _wrapper      \
+      {                                                 \
+        typedef rettype (*type) parameters;             \
+                                                        \
+        inline operator type () const                   \
+        {                                               \
+          return reinterpret_cast<type>(::func);        \
+        }                                               \
+      } func = {};                                      \
+    }                                                   \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function is picked among a set of overloaded functions,
+   namely the one with rettype2 and parameters2.  Two consecutive casts
+   are used to silence the "cannot find a match" and "invalid conversion"
+   errors that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+  /* The outer cast must be a reinterpret_cast.
+     The inner cast: When the function is defined as a set of overloaded
+     functions, it works as a static_cast<>, choosing the designated variant.
+     When the function is defined as a single variant, it works as a
+     reinterpret_cast<>. The parenthesized cast syntax works both ways.  */
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    namespace GNULIB_NAMESPACE                                                \
+    {                                                                         \
+      static const struct _gl_ ## func ## _wrapper                            \
+      {                                                                       \
+        typedef rettype (*type) parameters;                                   \
+                                                                              \
+        inline operator type () const                                         \
+        {                                                                     \
+          return reinterpret_cast<type>((rettype2 (*) parameters2)(::func));  \
+        }                                                                     \
+      } func = {};                                                            \
+    }                                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN (func);
+   causes a warning to be emitted when ::func is used but not when
+   GNULIB_NAMESPACE::func is used.  func must be defined without overloaded
+   variants.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN(func) \
+   _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN_1(func,namespace) \
+   _GL_CXXALIASWARN_2 (func, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+    _GL_WARN_ON_USE (func, \
+                     "The symbol ::" #func " refers to the system function. " \
+                     "Use " #namespace "::" #func " instead.")
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     extern __typeof__ (func) func
+# else
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN(func) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
+   causes a warning to be emitted when the given overloaded variant of ::func
+   is used but not when GNULIB_NAMESPACE::func is used.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+   _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
+                        GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
+   _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
+                         "The symbol ::" #func " refers to the system function. " \
+                         "Use " #namespace "::" #func " instead.")
+# else
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+#endif /* _GL_CXXDEFS_H */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+/* A C macro for emitting warnings if a function is used.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
+   for FUNCTION which will then trigger a compiler warning containing
+   the text of "literal string" anywhere that function is called, if
+   supported by the compiler.  If the compiler does not support this
+   feature, the macro expands to an unused extern declaration.
+
+   _GL_WARN_ON_USE_ATTRIBUTE ("literal string") expands to the
+   attribute used in _GL_WARN_ON_USE.  If the compiler does not support
+   this feature, it expands to empty.
+
+   These macros are useful for marking a function as a potential
+   portability trap, with the intent that "literal string" include
+   instructions on the replacement function that should be used
+   instead.
+   _GL_WARN_ON_USE is for functions with 'extern' linkage.
+   _GL_WARN_ON_USE_ATTRIBUTE is for functions with 'static' or 'inline'
+   linkage.
+
+   However, one of the reasons that a function is a portability trap is
+   if it has the wrong signature.  Declaring FUNCTION with a different
+   signature in C is a compilation error, so this macro must use the
+   same type as any existing declaration so that programs that avoid
+   the problematic FUNCTION do not fail to compile merely because they
+   included a header that poisoned the function.  But this implies that
+   _GL_WARN_ON_USE is only safe to use if FUNCTION is known to already
+   have a declaration.  Use of this macro implies that there must not
+   be any other macro hiding the declaration of FUNCTION; but
+   undefining FUNCTION first is part of the poisoning process anyway
+   (although for symbols that are provided only via a macro, the result
+   is a compilation error rather than a warning containing
+   "literal string").  Also note that in C++, it is only safe to use if
+   FUNCTION has no overloads.
+
+   For an example, it is possible to poison 'getline' by:
+   - adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
+     [getline]) in configure.ac, which potentially defines
+     HAVE_RAW_DECL_GETLINE
+   - adding this code to a header that wraps the system <stdio.h>:
+     #undef getline
+     #if HAVE_RAW_DECL_GETLINE
+     _GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
+       "not universally present; use the gnulib module getline");
+     #endif
+
+   It is not possible to directly poison global variables.  But it is
+   possible to write a wrapper accessor function, and poison that
+   (less common usage, like &environ, will cause a compilation error
+   rather than issue the nice warning, but the end result of informing
+   the developer about their portability problem is still achieved):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     rpl_environ (void) { return &environ; }
+     _GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   or better (avoiding contradictory use of 'static' and 'extern'):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     _GL_WARN_ON_USE_ATTRIBUTE ("environ is not always properly declared")
+     rpl_environ (void) { return &environ; }
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   */
+#ifndef _GL_WARN_ON_USE
+
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# else /* Unsupported.  */
+#  define _GL_WARN_ON_USE(function, message) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# endif
+#endif
+
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
+   This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
+   not work in this case.  */
+#ifndef _GL_WARN_ON_USE_CXX
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
+# endif
+#endif
+
+/* _GL_WARN_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#ifndef _GL_WARN_EXTERN_C
+# if defined __cplusplus
+#  define _GL_WARN_EXTERN_C extern "C"
+# else
+#  define _GL_WARN_EXTERN_C extern
+# endif
+#endif
+
+
+/* Declare overridden functions.  */
+
+#if 0
+/* Return the session ID of the controlling terminal of the current process.
+   The argument is a descriptor if this controlling terminal.
+   Return -1, with errno set, upon failure.  errno = ENOSYS means that the
+   function is unsupported.  */
+# if !1
+_GL_FUNCDECL_SYS (tcgetsid, pid_t, (int fd));
+# endif
+_GL_CXXALIAS_SYS (tcgetsid, pid_t, (int fd));
+_GL_CXXALIASWARN (tcgetsid);
+#elif defined GNULIB_POSIXCHECK
+# undef tcgetsid
+# if HAVE_RAW_DECL_TCGETSID
+_GL_WARN_ON_USE (tcgetsid, "tcgetsid is not portable - "
+                 "use gnulib module tcgetsid for portability");
+# endif
+#endif
+
+
+#endif /* _GL_TERMIOS_H */
+#endif /* _GL_TERMIOS_H */
diff --git a/darwin-lib/textstyle.h b/darwin-lib/textstyle.h
index 3011cad..42fddfc 100644
--- a/darwin-lib/textstyle.h
+++ b/darwin-lib/textstyle.h
@@ -1,6 +1,6 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Dummy replacement for part of the public API of the libtextstyle library.
-   Copyright (C) 2006-2007, 2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2007, 2019-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -43,6 +43,32 @@
 # include <termios.h>
 #endif
 
+/* An __attribute__ __format__ specifier for a function that takes a format
+   string and arguments, where the format string directives are the ones
+   standardized by ISO C99 and POSIX.
+   _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD  */
+/* __gnu_printf__ is supported in GCC >= 4.4.  */
+#ifndef _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD
+# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+#  define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __gnu_printf__
+# else
+#  define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __printf__
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_MAYBE_UNUSED declares that it is not a programming mistake if
+   the entity is not used.  The compiler should not warn if the entity is not
+   used.  */
+#ifndef _GL_ATTRIBUTE_MAYBE_UNUSED
+# if 0 /* no GCC or clang version supports this yet */
+#  define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
+# elif defined __GNUC__ || defined __clang__
+#  define _GL_ATTRIBUTE_MAYBE_UNUSED __attribute__ ((__unused__))
+# else
+#  define _GL_ATTRIBUTE_MAYBE_UNUSED
+# endif
+#endif
+
 /* ----------------------------- From ostream.h ----------------------------- */
 
 /* Describes the scope of a flush operation.  */
@@ -116,8 +142,8 @@
 
 static inline ptrdiff_t ostream_printf (ostream_t stream,
                                         const char *format, ...)
-#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ > 3
-  __attribute__ ((__format__ (__printf__, 2, 3)))
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || defined __clang__
+  __attribute__ ((__format__ (_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 2, 3)))
 #endif
   ;
 static inline ptrdiff_t
@@ -141,8 +167,8 @@
 
 static inline ptrdiff_t ostream_vprintf (ostream_t stream,
                                          const char *format, va_list args)
-#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ > 3
-  __attribute__ ((__format__ (__printf__, 2, 0)))
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || defined __clang__
+  __attribute__ ((__format__ (_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 2, 0)))
 #endif
   ;
 static inline ptrdiff_t
@@ -168,38 +194,38 @@
 #define styled_ostream_free ostream_free
 
 static inline void
-styled_ostream_begin_use_class (styled_ostream_t stream _GL_UNUSED,
-                                const char *classname _GL_UNUSED)
+styled_ostream_begin_use_class (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream,
+                                _GL_ATTRIBUTE_MAYBE_UNUSED const char *classname)
 {
 }
 
 static inline void
-styled_ostream_end_use_class (styled_ostream_t stream _GL_UNUSED,
-                              const char *classname _GL_UNUSED)
+styled_ostream_end_use_class (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream,
+                              _GL_ATTRIBUTE_MAYBE_UNUSED const char *classname)
 {
 }
 
 static inline const char *
-styled_ostream_get_hyperlink_ref (styled_ostream_t stream _GL_UNUSED)
+styled_ostream_get_hyperlink_ref (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream)
 {
   return NULL;
 }
 
 static inline const char *
-styled_ostream_get_hyperlink_id (styled_ostream_t stream _GL_UNUSED)
+styled_ostream_get_hyperlink_id (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream)
 {
   return NULL;
 }
 
 static inline void
-styled_ostream_set_hyperlink (styled_ostream_t stream _GL_UNUSED,
-                              const char *ref _GL_UNUSED,
-                              const char *id _GL_UNUSED)
+styled_ostream_set_hyperlink (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream,
+                              _GL_ATTRIBUTE_MAYBE_UNUSED const char *ref,
+                              _GL_ATTRIBUTE_MAYBE_UNUSED const char *id)
 {
 }
 
 static inline void
-styled_ostream_flush_to_current_style (styled_ostream_t stream _GL_UNUSED)
+styled_ostream_flush_to_current_style (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream)
 {
 }
 
@@ -226,8 +252,8 @@
 #define fd_ostream_free ostream_free
 
 static inline fd_ostream_t
-fd_ostream_create (int fd, const char *filename _GL_UNUSED,
-                   bool buffered _GL_UNUSED)
+fd_ostream_create (int fd, _GL_ATTRIBUTE_MAYBE_UNUSED const char *filename,
+                   _GL_ATTRIBUTE_MAYBE_UNUSED bool buffered)
 {
   if (fd == 1)
     return stdout;
@@ -273,81 +299,81 @@
 #define term_ostream_free ostream_free
 
 static inline term_color_t
-term_ostream_get_color (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_color (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return COLOR_DEFAULT;
 }
 
 static inline void
-term_ostream_set_color (term_ostream_t stream _GL_UNUSED,
-                        term_color_t color _GL_UNUSED)
+term_ostream_set_color (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                        _GL_ATTRIBUTE_MAYBE_UNUSED term_color_t color)
 {
 }
 
 static inline term_color_t
-term_ostream_get_bgcolor (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_bgcolor (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return COLOR_DEFAULT;
 }
 
 static inline void
-term_ostream_set_bgcolor (term_ostream_t stream _GL_UNUSED,
-                          term_color_t color _GL_UNUSED)
+term_ostream_set_bgcolor (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                          _GL_ATTRIBUTE_MAYBE_UNUSED term_color_t color)
 {
 }
 
 static inline term_weight_t
-term_ostream_get_weight (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_weight (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return WEIGHT_DEFAULT;
 }
 
 static inline void
-term_ostream_set_weight (term_ostream_t stream _GL_UNUSED,
-                         term_weight_t weight _GL_UNUSED)
+term_ostream_set_weight (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                         _GL_ATTRIBUTE_MAYBE_UNUSED term_weight_t weight)
 {
 }
 
 static inline term_posture_t
-term_ostream_get_posture (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_posture (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return POSTURE_DEFAULT;
 }
 
 static inline void
-term_ostream_set_posture (term_ostream_t stream _GL_UNUSED,
-                          term_posture_t posture _GL_UNUSED)
+term_ostream_set_posture (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                          _GL_ATTRIBUTE_MAYBE_UNUSED term_posture_t posture)
 {
 }
 
 static inline term_underline_t
-term_ostream_get_underline (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_underline (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return UNDERLINE_DEFAULT;
 }
 
 static inline void
-term_ostream_set_underline (term_ostream_t stream _GL_UNUSED,
-                            term_underline_t underline _GL_UNUSED)
+term_ostream_set_underline (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED term_underline_t underline)
 {
 }
 
 static inline const char *
-term_ostream_get_hyperlink_ref (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_hyperlink_ref (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return NULL;
 }
 
 static inline const char *
-term_ostream_get_hyperlink_id (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_hyperlink_id (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return NULL;
 }
 
 static inline void
-term_ostream_set_hyperlink (term_ostream_t stream _GL_UNUSED,
-                            const char *ref _GL_UNUSED,
-                            const char *id _GL_UNUSED)
+term_ostream_set_hyperlink (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED const char *ref,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED const char *id)
 {
 }
 
@@ -375,7 +401,7 @@
 
 static inline term_ostream_t
 term_ostream_create (int fd, const char *filename,
-                     ttyctl_t tty_control _GL_UNUSED)
+                     _GL_ATTRIBUTE_MAYBE_UNUSED ttyctl_t tty_control)
 {
   return fd_ostream_create (fd, filename, true);
 }
@@ -396,8 +422,8 @@
 
 static inline term_styled_ostream_t
 term_styled_ostream_create (int fd, const char *filename,
-                            ttyctl_t tty_control _GL_UNUSED,
-                            const char *css_filename _GL_UNUSED)
+                            _GL_ATTRIBUTE_MAYBE_UNUSED ttyctl_t tty_control,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED const char *css_filename)
 {
   return fd_ostream_create (fd, filename, true);
 }
@@ -407,8 +433,8 @@
 typedef styled_ostream_t html_styled_ostream_t;
 
 static inline html_styled_ostream_t
-html_styled_ostream_create (ostream_t destination _GL_UNUSED,
-                            const char *css_filename _GL_UNUSED)
+html_styled_ostream_create (_GL_ATTRIBUTE_MAYBE_UNUSED ostream_t destination,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED const char *css_filename)
 {
   abort ();
   return NULL;
@@ -424,13 +450,13 @@
 #define style_file_name NULL
 
 static inline bool
-handle_color_option (const char *option _GL_UNUSED)
+handle_color_option (_GL_ATTRIBUTE_MAYBE_UNUSED const char *option)
 {
   return false;
 }
 
 static inline void
-handle_style_option (const char *option _GL_UNUSED)
+handle_style_option (_GL_ATTRIBUTE_MAYBE_UNUSED const char *option)
 {
 }
 
@@ -441,10 +467,10 @@
 }
 
 static inline void
-style_file_prepare (const char *style_file_envvar _GL_UNUSED,
-                    const char *stylesdir_envvar _GL_UNUSED,
-                    const char *stylesdir_after_install _GL_UNUSED,
-                    const char *default_style_file _GL_UNUSED)
+style_file_prepare (_GL_ATTRIBUTE_MAYBE_UNUSED const char *style_file_envvar,
+                    _GL_ATTRIBUTE_MAYBE_UNUSED const char *stylesdir_envvar,
+                    _GL_ATTRIBUTE_MAYBE_UNUSED const char *stylesdir_after_install,
+                    _GL_ATTRIBUTE_MAYBE_UNUSED const char *default_style_file)
 {
 }
 
@@ -452,14 +478,14 @@
 
 static inline styled_ostream_t
 styled_ostream_create (int fd, const char *filename,
-                       ttyctl_t tty_control _GL_UNUSED,
-                       const char *css_filename _GL_UNUSED)
+                       _GL_ATTRIBUTE_MAYBE_UNUSED ttyctl_t tty_control,
+                       _GL_ATTRIBUTE_MAYBE_UNUSED const char *css_filename)
 {
   return fd_ostream_create (fd, filename, true);
 }
 
 static inline void
-libtextstyle_set_failure_exit_code (int exit_code _GL_UNUSED)
+libtextstyle_set_failure_exit_code (_GL_ATTRIBUTE_MAYBE_UNUSED int exit_code)
 {
 }
 
diff --git a/darwin-lib/time.h b/darwin-lib/time.h
index 1262e7c..1d9ad11 100644
--- a/darwin-lib/time.h
+++ b/darwin-lib/time.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A more-standard <time.h>.
 
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 #pragma GCC system_header
@@ -51,19 +51,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -198,6 +198,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -223,6 +233,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -320,7 +338,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -348,14 +366,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -369,26 +384,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -397,19 +412,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -485,6 +500,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -497,24 +519,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -575,6 +608,25 @@
 #  define GNULIB_defined_struct_time_t_must_be_integral 1
 # endif
 
+/* Define TIME_UTC, a positive integer constant used for timespec_get().  */
+# if ! 1
+#  if !GNULIB_defined_TIME_UTC
+#   define TIME_UTC 1
+#   define GNULIB_defined_TIME_UTC 1
+#  endif
+# endif
+
+/* Set *TS to the current time, and return BASE.
+   Upon failure, return 0.  */
+# if 0
+#  if ! 1
+_GL_FUNCDECL_SYS (timespec_get, int, (struct timespec *ts, int base)
+                                     _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (timespec_get, int, (struct timespec *ts, int base));
+_GL_CXXALIASWARN (timespec_get);
+# endif
+
 /* Sleep for at least RQTP seconds unless interrupted,  If interrupted,
    return -1 and store the remaining time into RMTP.  See
    <https://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html>.  */
@@ -609,10 +661,27 @@
 #   endif
 _GL_FUNCDECL_RPL (tzset, void, (void));
 _GL_CXXALIAS_RPL (tzset, void, (void));
-#  else
-#   if ! 1
-_GL_FUNCDECL_SYS (tzset, void, (void));
+#  elif defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef tzset
+#    define tzset _tzset
 #   endif
+_GL_CXXALIAS_MDA (tzset, void, (void));
+#  else
+_GL_CXXALIAS_SYS (tzset, void, (void));
+#  endif
+_GL_CXXALIASWARN (tzset);
+# elif 1
+/* On native Windows, map 'tzset' to '_tzset', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::tzset always.  */
+#  if defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef tzset
+#    define tzset _tzset
+#   endif
+_GL_CXXALIAS_MDA (tzset, void, (void));
+#  else
 _GL_CXXALIAS_SYS (tzset, void, (void));
 #  endif
 _GL_CXXALIASWARN (tzset);
@@ -760,14 +829,17 @@
 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #    define strftime rpl_strftime
 #   endif
-_GL_FUNCDECL_RPL (strftime, size_t, (char *__buf, size_t __bufsize,
-                                     const char *__fmt, const struct tm *__tp)
-                                    _GL_ARG_NONNULL ((1, 3, 4)));
-_GL_CXXALIAS_RPL (strftime, size_t, (char *__buf, size_t __bufsize,
-                                     const char *__fmt, const struct tm *__tp));
+_GL_FUNCDECL_RPL (strftime, size_t,
+                  (char *restrict __buf, size_t __bufsize,
+                   const char *restrict __fmt, const struct tm *restrict __tp)
+                  _GL_ARG_NONNULL ((1, 3, 4)));
+_GL_CXXALIAS_RPL (strftime, size_t,
+                  (char *restrict __buf, size_t __bufsize,
+                   const char *restrict __fmt, const struct tm *restrict __tp));
 #  else
-_GL_CXXALIAS_SYS (strftime, size_t, (char *__buf, size_t __bufsize,
-                                     const char *__fmt, const struct tm *__tp));
+_GL_CXXALIAS_SYS (strftime, size_t,
+                  (char *restrict __buf, size_t __bufsize,
+                   const char *restrict __fmt, const struct tm *restrict __tp));
 #  endif
 #  if __GLIBC__ >= 2
 _GL_CXXALIASWARN (strftime);
@@ -775,22 +847,60 @@
 # endif
 
 # if defined _GNU_SOURCE && 0 && ! 0
+/* Functions that use a first-class time zone data type, instead of
+   relying on an implicit global time zone.
+   Inspired by NetBSD.  */
+
+/* Represents a time zone.
+   (timezone_t) NULL stands for UTC.  */
 typedef struct tm_zone *timezone_t;
+
+/* tzalloc (name)
+   Returns a time zone object for the given time zone NAME.  This object
+   represents the time zone that other functions would use it the TZ
+   environment variable was set to NAME.
+   If NAME is NULL, the result represents the time zone that other functions
+   would use it the TZ environment variable was unset.
+   May return NULL if NAME is invalid (this is platform dependent) or
+   upon memory allocation failure.  */
 _GL_FUNCDECL_SYS (tzalloc, timezone_t, (char const *__name));
 _GL_CXXALIAS_SYS (tzalloc, timezone_t, (char const *__name));
+
+/* tzfree (tz)
+   Frees a time zone object.
+   The argument must have been returned by tzalloc().  */
 _GL_FUNCDECL_SYS (tzfree, void, (timezone_t __tz));
 _GL_CXXALIAS_SYS (tzfree, void, (timezone_t __tz));
+
+/* localtime_rz (tz, &t, &result)
+   Converts an absolute time T to a broken-down time RESULT, assuming the
+   time zone TZ.
+   This function is like 'localtime_r', but relies on the argument TZ instead
+   of an implicit global time zone.  */
 _GL_FUNCDECL_SYS (localtime_rz, struct tm *,
                   (timezone_t __tz, time_t const *restrict __timer,
                    struct tm *restrict __result) _GL_ARG_NONNULL ((2, 3)));
 _GL_CXXALIAS_SYS (localtime_rz, struct tm *,
                   (timezone_t __tz, time_t const *restrict __timer,
                    struct tm *restrict __result));
+
+/* mktime_z (tz, &tm)
+   Normalizes the broken-down time TM and converts it to an absolute time,
+   assuming the time zone TZ.  Returns the absolute time.
+   This function is like 'mktime', but relies on the argument TZ instead
+   of an implicit global time zone.  */
 _GL_FUNCDECL_SYS (mktime_z, time_t,
-                  (timezone_t __tz, struct tm *restrict __result)
+                  (timezone_t __tz, struct tm *restrict __tm)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_SYS (mktime_z, time_t,
-                  (timezone_t __tz, struct tm *restrict __result));
+                  (timezone_t __tz, struct tm *restrict __tm));
+
+/* Time zone abbreviation strings (returned by 'localtime_rz' or 'mktime_z'
+   in the 'tm_zone' member of 'struct tm') are valid as long as
+     - the 'struct tm' argument is not destroyed or overwritten,
+   and
+     - the 'timezone_t' argument is not freed through tzfree().  */
+
 # endif
 
 /* Convert TM to a time_t value, assuming UTC.  */
@@ -821,17 +931,17 @@
 # endif
 # if defined GNULIB_POSIXCHECK
 #  undef asctime_r
-_GL_WARN_ON_USE (asctime, "asctime_r can overrun buffers in some cases - "
+_GL_WARN_ON_USE (asctime_r, "asctime_r can overrun buffers in some cases - "
                  "better use strftime (or even sprintf) instead");
 # endif
 # if defined GNULIB_POSIXCHECK
 #  undef ctime
-_GL_WARN_ON_USE (asctime, "ctime can overrun buffers in some cases - "
+_GL_WARN_ON_USE (ctime, "ctime can overrun buffers in some cases - "
                  "better use strftime (or even sprintf) instead");
 # endif
 # if defined GNULIB_POSIXCHECK
 #  undef ctime_r
-_GL_WARN_ON_USE (asctime, "ctime_r can overrun buffers in some cases - "
+_GL_WARN_ON_USE (ctime_r, "ctime_r can overrun buffers in some cases - "
                  "better use strftime (or even sprintf) instead");
 # endif
 
diff --git a/darwin-lib/unistd.h b/darwin-lib/unistd.h
index 9331cec..afd7e02 100644
--- a/darwin-lib/unistd.h
+++ b/darwin-lib/unistd.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Substitute for and wrapper around <unistd.h>.
-   Copyright (C) 2003-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_UNISTD_H
 
@@ -22,7 +22,7 @@
 #endif
 
 
-#ifdef _GL_INCLUDING_UNISTD_H
+#if 1 && defined _GL_INCLUDING_UNISTD_H
 /* Special invocation convention:
    - On Mac OS X 10.3.9 we have a sequence of nested includes
      <unistd.h> -> <signal.h> -> <pthread.h> -> <unistd.h>
@@ -94,20 +94,18 @@
 # undef __need_system_stdlib_h
 #endif
 
-/* Native Windows platforms declare chdir, getcwd, rmdir in
+/* Native Windows platforms declare _chdir, _getcwd, _rmdir in
    <io.h> and/or <direct.h>, not in <unistd.h>.
-   They also declare access(), chmod(), close(), dup(), dup2(), isatty(),
-   lseek(), read(), unlink(), write() in <io.h>.  */
-#if ((1 || 0 || 1 \
-      || defined GNULIB_POSIXCHECK) \
-     && (defined _WIN32 && ! defined __CYGWIN__))
-# include <io.h>     /* mingw32, mingw64 */
-# include <direct.h> /* mingw64, MSVC 9 */
-#elif (1 || 0 || 1 || 0 \
-       || 0 || 0 || 1 || 0 \
-       || defined GNULIB_POSIXCHECK) \
-      && (defined _WIN32 && ! defined __CYGWIN__)
+   They also declare _access(), _chmod(), _close(), _dup(), _dup2(), _isatty(),
+   _lseek(), _read(), _unlink(), _write() in <io.h>.  */
+#if defined _WIN32 && !defined __CYGWIN__
 # include <io.h>
+# include <direct.h>
+#endif
+
+/* Native Windows platforms declare _execl*, _execv* in <process.h>.  */
+#if defined _WIN32 && !defined __CYGWIN__
+# include <process.h>
 #endif
 
 /* AIX and OSF/1 5.1 declare getdomainname in <netdb.h>, not in <unistd.h>.
@@ -119,6 +117,17 @@
 # include <netdb.h>
 #endif
 
+/* Mac OS X 10.13, Solaris 11.4, and Android 9.0 declare getentropy in
+   <sys/random.h>, not in <unistd.h>.  */
+/* But avoid namespace pollution on glibc systems.  */
+#if (0 || defined GNULIB_POSIXCHECK) \
+    && ((defined __APPLE__ && defined __MACH__) || defined __sun \
+        || defined __ANDROID__) \
+    && 0 \
+    && !defined __GLIBC__
+# include <sys/random.h>
+#endif
+
 /* Android 4.3 declares fchownat in <sys/stat.h>, not in <unistd.h>.  */
 /* But avoid namespace pollution on glibc systems.  */
 #if (0 || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \
@@ -128,27 +137,24 @@
 
 /* MSVC defines off_t in <sys/types.h>.
    May also define off_t to a 64-bit type on native Windows.  */
-/* But avoid namespace pollution on glibc systems.  */
-#ifndef __GLIBC__
-/* Get off_t, ssize_t.  */
-# include <sys/types.h>
-#endif
+/* Get off_t, ssize_t, mode_t.  */
+#include <sys/types.h>
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -283,6 +289,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -308,6 +324,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -405,7 +429,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -433,14 +457,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -454,26 +475,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -482,19 +503,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -570,6 +591,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -582,24 +610,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -615,7 +654,7 @@
 
 
 /* Get getopt(), optarg, optind, opterr, optopt.  */
-#if 01 && !defined _GL_SYSTEM_GETOPT
+#if 1 && 01 && !defined _GL_SYSTEM_GETOPT
 # include <getopt-cdefs.h>
 # include <getopt-pfx-core.h>
 #endif
@@ -727,7 +766,7 @@
 /* Declare overridden functions.  */
 
 
-#if 0
+#if 1
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef access
@@ -736,6 +775,12 @@
 _GL_FUNCDECL_RPL (access, int, (const char *file, int mode)
                                _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (access, int, (const char *file, int mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef access
+#   define access _access
+#  endif
+_GL_CXXALIAS_MDA (access, int, (const char *file, int mode));
 # else
 _GL_CXXALIAS_SYS (access, int, (const char *file, int mode));
 # endif
@@ -749,11 +794,33 @@
                  "also, this function is a security risk - "
                  "use the gnulib module faccessat instead");
 # endif
+#elif 1
+/* On native Windows, map 'access' to '_access', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::access always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef access
+#   define access _access
+#  endif
+_GL_CXXALIAS_MDA (access, int, (const char *file, int mode));
+# else
+_GL_CXXALIAS_SYS (access, int, (const char *file, int mode));
+# endif
+_GL_CXXALIASWARN (access);
 #endif
 
 
 #if 1
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef chdir
+#   define chdir _chdir
+#  endif
+_GL_CXXALIAS_MDA (chdir, int, (const char *file));
+# else
 _GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
+# endif
 _GL_CXXALIASWARN (chdir);
 #elif defined GNULIB_POSIXCHECK
 # undef chdir
@@ -761,6 +828,20 @@
 _GL_WARN_ON_USE (chown, "chdir is not always in <unistd.h> - "
                  "use gnulib module chdir for portability");
 # endif
+#elif 1
+/* On native Windows, map 'chdir' to '_chdir', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::chdir always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef chdir
+#   define chdir _chdir
+#  endif
+_GL_CXXALIAS_MDA (chdir, int, (const char *file));
+# else
+_GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIASWARN (chdir);
 #endif
 
 
@@ -805,6 +886,12 @@
 #  endif
 _GL_FUNCDECL_RPL (close, int, (int fd));
 _GL_CXXALIAS_RPL (close, int, (int fd));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef close
+#   define close _close
+#  endif
+_GL_CXXALIAS_MDA (close, int, (int fd));
 # else
 _GL_CXXALIAS_SYS (close, int, (int fd));
 # endif
@@ -817,6 +904,20 @@
 /* Assume close is always declared.  */
 _GL_WARN_ON_USE (close, "close does not portably work on sockets - "
                  "use gnulib module close for portability");
+#elif 1
+/* On native Windows, map 'close' to '_close', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::close always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef close
+#   define close _close
+#  endif
+_GL_CXXALIAS_MDA (close, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (close, int, (int fd));
+# endif
+_GL_CXXALIASWARN (close);
 #endif
 
 
@@ -831,10 +932,11 @@
 # endif
 _GL_CXXALIASWARN (copy_file_range);
 #elif defined GNULIB_POSIXCHECK
-/* Assume copy_file_range is always declared.  */
+# if HAVE_RAW_DECL_COPY_FILE_RANGE
 _GL_WARN_ON_USE (copy_file_range,
                  "copy_file_range is unportable - "
                  "use gnulib module copy_file_range for portability");
+# endif
 #endif
 
 
@@ -845,6 +947,12 @@
 #  endif
 _GL_FUNCDECL_RPL (dup, int, (int oldfd));
 _GL_CXXALIAS_RPL (dup, int, (int oldfd));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dup
+#   define dup _dup
+#  endif
+_GL_CXXALIAS_MDA (dup, int, (int oldfd));
 # else
 _GL_CXXALIAS_SYS (dup, int, (int oldfd));
 # endif
@@ -855,6 +963,20 @@
 _GL_WARN_ON_USE (dup, "dup is unportable - "
                  "use gnulib module dup for portability");
 # endif
+#elif 1
+/* On native Windows, map 'dup' to '_dup', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::dup always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dup
+#   define dup _dup
+#  endif
+_GL_CXXALIAS_MDA (dup, int, (int oldfd));
+# else
+_GL_CXXALIAS_SYS (dup, int, (int oldfd));
+# endif
+_GL_CXXALIASWARN (dup);
 #endif
 
 
@@ -870,10 +992,13 @@
 #  endif
 _GL_FUNCDECL_RPL (dup2, int, (int oldfd, int newfd));
 _GL_CXXALIAS_RPL (dup2, int, (int oldfd, int newfd));
-# else
-#  if !1
-_GL_FUNCDECL_SYS (dup2, int, (int oldfd, int newfd));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dup2
+#   define dup2 _dup2
 #  endif
+_GL_CXXALIAS_MDA (dup2, int, (int oldfd, int newfd));
+# else
 _GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
 # endif
 _GL_CXXALIASWARN (dup2);
@@ -883,6 +1008,20 @@
 _GL_WARN_ON_USE (dup2, "dup2 is unportable - "
                  "use gnulib module dup2 for portability");
 # endif
+#elif 1
+/* On native Windows, map 'dup2' to '_dup2', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::dup2 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dup2
+#   define dup2 _dup2
+#  endif
+_GL_CXXALIAS_MDA (dup2, int, (int oldfd, int newfd));
+# else
+_GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
+# endif
+_GL_CXXALIASWARN (dup2);
 #endif
 
 
@@ -986,6 +1125,282 @@
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execl
+#   define execl rpl_execl
+#  endif
+_GL_FUNCDECL_RPL (execl, int, (const char *program, const char *arg, ...)
+                              _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execl, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execl, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execl);
+#elif defined GNULIB_POSIXCHECK
+# undef execl
+# if HAVE_RAW_DECL_EXECL
+_GL_WARN_ON_USE (execl, "execl behaves very differently on mingw - "
+                 "use gnulib module execl for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execl' to '_execl', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execl always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execl
+#   define execl _execl
+#  endif
+_GL_CXXALIAS_MDA (execl, intptr_t, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execl, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execl);
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execle
+#   define execle rpl_execle
+#  endif
+_GL_FUNCDECL_RPL (execle, int, (const char *program, const char *arg, ...)
+                               _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execle, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execle, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execle);
+#elif defined GNULIB_POSIXCHECK
+# undef execle
+# if HAVE_RAW_DECL_EXECLE
+_GL_WARN_ON_USE (execle, "execle behaves very differently on mingw - "
+                 "use gnulib module execle for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execle' to '_execle', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execle always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execle
+#   define execle _execle
+#  endif
+_GL_CXXALIAS_MDA (execle, intptr_t,
+                  (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execle, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execle);
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execlp
+#   define execlp rpl_execlp
+#  endif
+_GL_FUNCDECL_RPL (execlp, int, (const char *program, const char *arg, ...)
+                               _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execlp, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execlp, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execlp);
+#elif defined GNULIB_POSIXCHECK
+# undef execlp
+# if HAVE_RAW_DECL_EXECLP
+_GL_WARN_ON_USE (execlp, "execlp behaves very differently on mingw - "
+                 "use gnulib module execlp for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execlp' to '_execlp', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execlp always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execlp
+#   define execlp _execlp
+#  endif
+_GL_CXXALIAS_MDA (execlp, intptr_t,
+                  (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execlp, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execlp);
+#endif
+
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execv
+#   define execv rpl_execv
+#  endif
+_GL_FUNCDECL_RPL (execv, int, (const char *program, char * const *argv)
+                              _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execv, int, (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execv, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execv);
+#elif defined GNULIB_POSIXCHECK
+# undef execv
+# if HAVE_RAW_DECL_EXECV
+_GL_WARN_ON_USE (execv, "execv behaves very differently on mingw - "
+                 "use gnulib module execv for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execv' to '_execv', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execv always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execv
+#   define execv _execv
+#  endif
+_GL_CXXALIAS_MDA_CAST (execv, intptr_t,
+                       (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execv, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execv);
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execve
+#   define execve rpl_execve
+#  endif
+_GL_FUNCDECL_RPL (execve, int,
+                  (const char *program, char * const *argv, char * const *env)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execve, int,
+                  (const char *program, char * const *argv, char * const *env));
+# else
+_GL_CXXALIAS_SYS (execve, int,
+                  (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execve);
+#elif defined GNULIB_POSIXCHECK
+# undef execve
+# if HAVE_RAW_DECL_EXECVE
+_GL_WARN_ON_USE (execve, "execve behaves very differently on mingw - "
+                 "use gnulib module execve for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execve' to '_execve', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execve always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execve
+#   define execve _execve
+#  endif
+_GL_CXXALIAS_MDA_CAST (execve, intptr_t,
+                       (const char *program, char * const *argv,
+                        char * const *env));
+# else
+_GL_CXXALIAS_SYS (execve, int,
+                  (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execve);
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execvp
+#   define execvp rpl_execvp
+#  endif
+_GL_FUNCDECL_RPL (execvp, int, (const char *program, char * const *argv)
+                               _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execvp, int, (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execvp, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execvp);
+#elif defined GNULIB_POSIXCHECK
+# undef execvp
+# if HAVE_RAW_DECL_EXECVP
+_GL_WARN_ON_USE (execvp, "execvp behaves very differently on mingw - "
+                 "use gnulib module execvp for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execvp' to '_execvp', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execvp always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execvp
+#   define execvp _execvp
+#  endif
+_GL_CXXALIAS_MDA_CAST (execvp, intptr_t,
+                       (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execvp, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execvp);
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execvpe
+#   define execvpe rpl_execvpe
+#  endif
+_GL_FUNCDECL_RPL (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env));
+# else
+#  if !0
+_GL_FUNCDECL_SYS (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execvpe);
+#elif defined GNULIB_POSIXCHECK
+# undef execvpe
+# if HAVE_RAW_DECL_EXECVPE
+_GL_WARN_ON_USE (execvpe, "execvpe behaves very differently on mingw - "
+                 "use gnulib module execvpe for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execvpe' to '_execvpe', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execvpe on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execvpe
+#   define execvpe _execvpe
+#  endif
+_GL_CXXALIAS_MDA_CAST (execvpe, intptr_t,
+                       (const char *program, char * const *argv,
+                        char * const *env));
+# elif 1
+#  if !0
+_GL_FUNCDECL_SYS (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env));
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || 1
+_GL_CXXALIASWARN (execvpe);
+# endif
+#endif
+
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef faccessat
 #   define faccessat rpl_faccessat
 #  endif
@@ -1013,7 +1428,7 @@
 #endif
 
 
-#if 0
+#if 1
 /* Change the process' current working directory to the directory on which
    the given file descriptor is open.
    Return 0 if successful, otherwise -1 and errno set.
@@ -1070,7 +1485,7 @@
 # undef fchownat
 # if HAVE_RAW_DECL_FCHOWNAT
 _GL_WARN_ON_USE (fchownat, "fchownat is not portable - "
-                 "use gnulib module openat for portability");
+                 "use gnulib module fchownat for portability");
 # endif
 #endif
 
@@ -1141,7 +1556,7 @@
 #endif
 
 
-#if 0
+#if 1
 /* Get the name of the current working directory, and put it in SIZE bytes
    of BUF.
    Return BUF if successful, or NULL if the directory couldn't be determined
@@ -1152,12 +1567,18 @@
    extension: If BUF is NULL, an array is allocated with 'malloc'; the array
    is SIZE bytes long, unless SIZE == 0, in which case it is as big as
    necessary.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define getcwd rpl_getcwd
 #  endif
 _GL_FUNCDECL_RPL (getcwd, char *, (char *buf, size_t size));
 _GL_CXXALIAS_RPL (getcwd, char *, (char *buf, size_t size));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getcwd
+#   define getcwd _getcwd
+#  endif
+_GL_CXXALIAS_MDA (getcwd, char *, (char *buf, size_t size));
 # else
 /* Need to cast, because on mingw, the second parameter is
                                                    int size.  */
@@ -1170,6 +1591,22 @@
 _GL_WARN_ON_USE (getcwd, "getcwd is unportable - "
                  "use gnulib module getcwd for portability");
 # endif
+#elif 1
+/* On native Windows, map 'getcwd' to '_getcwd', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::getcwd always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getcwd
+#   define getcwd _getcwd
+#  endif
+/* Need to cast, because on mingw, the second parameter is either
+   'int size' or 'size_t size'.  */
+_GL_CXXALIAS_MDA_CAST (getcwd, char *, (char *buf, size_t size));
+# else
+_GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size));
+# endif
+_GL_CXXALIASWARN (getcwd);
 #endif
 
 
@@ -1209,7 +1646,7 @@
 #endif
 
 
-#if 0
+#if 1
 /* Return the maximum number of file descriptors in the current process.
    In POSIX, this is same as sysconf (_SC_OPEN_MAX).  */
 # if 0
@@ -1238,6 +1675,22 @@
 
 
 #if 0
+/* Fill a buffer with random bytes.  */
+# if !1
+_GL_FUNCDECL_SYS (getentropy, int, (void *buffer, size_t length));
+# endif
+_GL_CXXALIAS_SYS (getentropy, int, (void *buffer, size_t length));
+_GL_CXXALIASWARN (getentropy);
+#elif defined GNULIB_POSIXCHECK
+# undef getentropy
+# if HAVE_RAW_DECL_GETENTROPY
+_GL_WARN_ON_USE (getentropy, "getentropy is unportable - "
+                 "use gnulib module getentropy for portability");
+# endif
+#endif
+
+
+#if 0
 /* Return the supplemental groups that the current process belongs to.
    It is unspecified whether the effective group id is in the list.
    If N is 0, return the group count; otherwise, N describes how many
@@ -1379,6 +1832,11 @@
 _GL_FUNCDECL_RPL (getpagesize, int, (void));
 _GL_CXXALIAS_RPL (getpagesize, int, (void));
 # else
+/* On HP-UX, getpagesize exists, but it is not declared in <unistd.h> even if
+   the compiler options -D_HPUX_SOURCE -D_XOPEN_SOURCE=600 are used.  */
+#  if defined __hpux
+_GL_FUNCDECL_SYS (getpagesize, int, (void));
+#  endif
 #  if !1
 #   if !defined getpagesize
 /* This is for POSIX systems.  */
@@ -1483,6 +1941,23 @@
 #endif
 
 
+#if 1
+/* On native Windows, map 'getpid' to '_getpid', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::getpid always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getpid
+#   define getpid _getpid
+#  endif
+_GL_CXXALIAS_MDA (getpid, int, (void));
+# else
+_GL_CXXALIAS_SYS (getpid, pid_t, (void));
+# endif
+_GL_CXXALIASWARN (getpid);
+#endif
+
+
 #if 0
 /* Return the next valid login shell on the system, or NULL when the end of
    the list has been reached.  */
@@ -1553,8 +2028,15 @@
 #   undef isatty
 #   define isatty rpl_isatty
 #  endif
+#  define GNULIB_defined_isatty 1
 _GL_FUNCDECL_RPL (isatty, int, (int fd));
 _GL_CXXALIAS_RPL (isatty, int, (int fd));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef isatty
+#   define isatty _isatty
+#  endif
+_GL_CXXALIAS_MDA (isatty, int, (int fd));
 # else
 _GL_CXXALIAS_SYS (isatty, int, (int fd));
 # endif
@@ -1565,6 +2047,20 @@
 _GL_WARN_ON_USE (isatty, "isatty has portability problems on native Windows - "
                  "use gnulib module isatty for portability");
 # endif
+#elif 1
+/* On native Windows, map 'isatty' to '_isatty', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::isatty always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef isatty
+#   define isatty _isatty
+#  endif
+_GL_CXXALIAS_MDA (isatty, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (isatty, int, (int fd));
+# endif
+_GL_CXXALIASWARN (isatty);
 #endif
 
 
@@ -1676,6 +2172,12 @@
 #  endif
 _GL_FUNCDECL_RPL (lseek, off_t, (int fd, off_t offset, int whence));
 _GL_CXXALIAS_RPL (lseek, off_t, (int fd, off_t offset, int whence));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef lseek
+#   define lseek _lseek
+#  endif
+_GL_CXXALIAS_MDA (lseek, off_t, (int fd, off_t offset, int whence));
 # else
 _GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
 # endif
@@ -1686,10 +2188,24 @@
 _GL_WARN_ON_USE (lseek, "lseek does not fail with ESPIPE on pipes on some "
                  "systems - use gnulib module lseek for portability");
 # endif
+#elif 1
+/* On native Windows, map 'lseek' to '_lseek', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::lseek always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef lseek
+#   define lseek _lseek
+#  endif
+_GL_CXXALIAS_MDA (lseek, long, (int fd, long offset, int whence));
+# else
+_GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
+# endif
+_GL_CXXALIASWARN (lseek);
 #endif
 
 
-#if 0
+#if 1
 /* Create a pipe, defaulting to O_BINARY mode.
    Store the read-end as fd[0] and the write-end as fd[1].
    Return 0 upon success, or -1 with errno set upon failure.  */
@@ -1818,11 +2334,32 @@
 _GL_FUNCDECL_RPL (read, ssize_t, (int fd, void *buf, size_t count)
                                  _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (read, ssize_t, (int fd, void *buf, size_t count));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef read
+#   define read _read
+#  endif
+_GL_CXXALIAS_MDA (read, ssize_t, (int fd, void *buf, size_t count));
 # else
-/* Need to cast, because on mingw, the third parameter is
-                                                          unsigned int count
-   and the return type is 'int'.  */
-_GL_CXXALIAS_SYS_CAST (read, ssize_t, (int fd, void *buf, size_t count));
+_GL_CXXALIAS_SYS (read, ssize_t, (int fd, void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (read);
+#elif 1
+/* On native Windows, map 'read' to '_read', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::read always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef read
+#   define read _read
+#  endif
+#  ifdef __MINGW32__
+_GL_CXXALIAS_MDA (read, int, (int fd, void *buf, unsigned int count));
+#  else
+_GL_CXXALIAS_MDA (read, ssize_t, (int fd, void *buf, unsigned int count));
+#  endif
+# else
+_GL_CXXALIAS_SYS (read, ssize_t, (int fd, void *buf, size_t count));
 # endif
 _GL_CXXALIASWARN (read);
 #endif
@@ -1839,18 +2376,22 @@
 #   define readlink rpl_readlink
 #  endif
 _GL_FUNCDECL_RPL (readlink, ssize_t,
-                  (const char *file, char *buf, size_t bufsize)
+                  (const char *restrict file,
+                   char *restrict buf, size_t bufsize)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (readlink, ssize_t,
-                  (const char *file, char *buf, size_t bufsize));
+                  (const char *restrict file,
+                   char *restrict buf, size_t bufsize));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (readlink, ssize_t,
-                  (const char *file, char *buf, size_t bufsize)
+                  (const char *restrict file,
+                   char *restrict buf, size_t bufsize)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (readlink, ssize_t,
-                  (const char *file, char *buf, size_t bufsize));
+                  (const char *restrict file,
+                   char *restrict buf, size_t bufsize));
 # endif
 _GL_CXXALIASWARN (readlink);
 #elif defined GNULIB_POSIXCHECK
@@ -1868,18 +2409,22 @@
 #   define readlinkat rpl_readlinkat
 #  endif
 _GL_FUNCDECL_RPL (readlinkat, ssize_t,
-                  (int fd, char const *file, char *buf, size_t len)
+                  (int fd, char const *restrict file,
+                   char *restrict buf, size_t len)
                   _GL_ARG_NONNULL ((2, 3)));
 _GL_CXXALIAS_RPL (readlinkat, ssize_t,
-                  (int fd, char const *file, char *buf, size_t len));
+                  (int fd, char const *restrict file,
+                   char *restrict buf, size_t len));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (readlinkat, ssize_t,
-                  (int fd, char const *file, char *buf, size_t len)
+                  (int fd, char const *restrict file,
+                   char *restrict buf, size_t len)
                   _GL_ARG_NONNULL ((2, 3)));
 #  endif
 _GL_CXXALIAS_SYS (readlinkat, ssize_t,
-                  (int fd, char const *file, char *buf, size_t len));
+                  (int fd, char const *restrict file,
+                   char *restrict buf, size_t len));
 # endif
 _GL_CXXALIASWARN (readlinkat);
 #elif defined GNULIB_POSIXCHECK
@@ -1899,6 +2444,12 @@
 #  endif
 _GL_FUNCDECL_RPL (rmdir, int, (char const *name) _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (rmdir, int, (char const *name));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef rmdir
+#   define rmdir _rmdir
+#  endif
+_GL_CXXALIAS_MDA (rmdir, int, (char const *name));
 # else
 _GL_CXXALIAS_SYS (rmdir, int, (char const *name));
 # endif
@@ -1909,6 +2460,20 @@
 _GL_WARN_ON_USE (rmdir, "rmdir is unportable - "
                  "use gnulib module rmdir for portability");
 # endif
+#elif 1
+/* On native Windows, map 'rmdir' to '_rmdir', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::rmdir always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef rmdir
+#   define rmdir _rmdir
+#  endif
+_GL_CXXALIAS_MDA (rmdir, int, (char const *name));
+# else
+_GL_CXXALIAS_SYS (rmdir, int, (char const *name));
+# endif
+_GL_CXXALIASWARN (rmdir);
 #endif
 
 
@@ -1967,6 +2532,31 @@
 #endif
 
 
+#if 1
+/* On native Windows, map 'swab' to '_swab', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::swab always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef swab
+#   define swab _swab
+#  endif
+/* Need to cast, because in old mingw the arguments are
+                             (const char *from, char *to, size_t n).  */
+_GL_CXXALIAS_MDA_CAST (swab, void, (char *from, char *to, int n));
+# else
+#  if defined __hpux /* HP-UX */
+_GL_CXXALIAS_SYS (swab, void, (const char *from, char *to, int n));
+#  elif defined __sun && !defined _XPG4 /* Solaris */
+_GL_CXXALIAS_SYS (swab, void, (const char *from, char *to, ssize_t n));
+#  else
+_GL_CXXALIAS_SYS (swab, void, (const void *from, void *to, ssize_t n));
+#  endif
+# endif
+_GL_CXXALIASWARN (swab);
+#endif
+
+
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
@@ -2091,6 +2681,12 @@
 #  endif
 _GL_FUNCDECL_RPL (unlink, int, (char const *file) _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (unlink, int, (char const *file));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef unlink
+#   define unlink _unlink
+#  endif
+_GL_CXXALIAS_MDA (unlink, int, (char const *file));
 # else
 _GL_CXXALIAS_SYS (unlink, int, (char const *file));
 # endif
@@ -2101,6 +2697,20 @@
 _GL_WARN_ON_USE (unlink, "unlink is not portable - "
                  "use gnulib module unlink for portability");
 # endif
+#elif 1
+/* On native Windows, map 'unlink' to '_unlink', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::unlink always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef unlink
+#   define unlink _unlink
+#  endif
+_GL_CXXALIAS_MDA (unlink, int, (char const *file));
+# else
+_GL_CXXALIAS_SYS (unlink, int, (char const *file));
+# endif
+_GL_CXXALIASWARN (unlink);
 #endif
 
 
@@ -2125,7 +2735,7 @@
 # undef unlinkat
 # if HAVE_RAW_DECL_UNLINKAT
 _GL_WARN_ON_USE (unlinkat, "unlinkat is not portable - "
-                 "use gnulib module openat for portability");
+                 "use gnulib module unlinkat for portability");
 # endif
 #endif
 
@@ -2146,7 +2756,9 @@
 #  if !1
 _GL_FUNCDECL_SYS (usleep, int, (useconds_t n));
 #  endif
-_GL_CXXALIAS_SYS (usleep, int, (useconds_t n));
+/* Need to cast, because on Haiku, the first parameter is
+                                     unsigned int n.  */
+_GL_CXXALIAS_SYS_CAST (usleep, int, (useconds_t n));
 # endif
 _GL_CXXALIASWARN (usleep);
 #elif defined GNULIB_POSIXCHECK
@@ -2170,11 +2782,32 @@
 _GL_FUNCDECL_RPL (write, ssize_t, (int fd, const void *buf, size_t count)
                                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (write, ssize_t, (int fd, const void *buf, size_t count));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef write
+#   define write _write
+#  endif
+_GL_CXXALIAS_MDA (write, ssize_t, (int fd, const void *buf, size_t count));
 # else
-/* Need to cast, because on mingw, the third parameter is
-                                                             unsigned int count
-   and the return type is 'int'.  */
-_GL_CXXALIAS_SYS_CAST (write, ssize_t, (int fd, const void *buf, size_t count));
+_GL_CXXALIAS_SYS (write, ssize_t, (int fd, const void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (write);
+#elif 1
+/* On native Windows, map 'write' to '_write', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::write always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef write
+#   define write _write
+#  endif
+#  ifdef __MINGW32__
+_GL_CXXALIAS_MDA (write, int, (int fd, const void *buf, unsigned int count));
+#  else
+_GL_CXXALIAS_MDA (write, ssize_t, (int fd, const void *buf, unsigned int count));
+#  endif
+# else
+_GL_CXXALIAS_SYS (write, ssize_t, (int fd, const void *buf, size_t count));
 # endif
 _GL_CXXALIASWARN (write);
 #endif
diff --git a/darwin-lib/unistr.h b/darwin-lib/unistr.h
new file mode 100644
index 0000000..f6963df
--- /dev/null
+++ b/darwin-lib/unistr.h
@@ -0,0 +1,754 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Elementary Unicode string functions.
+   Copyright (C) 2001-2002, 2005-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _UNISTR_H
+#define _UNISTR_H
+
+#include "unitypes.h"
+
+/* Get bool.  */
+#include <stdbool.h>
+
+/* Get size_t, ptrdiff_t.  */
+#include <stddef.h>
+
+/* Get free().  */
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Conventions:
+
+   All functions prefixed with u8_ operate on UTF-8 encoded strings.
+   Their unit is an uint8_t (1 byte).
+
+   All functions prefixed with u16_ operate on UTF-16 encoded strings.
+   Their unit is an uint16_t (a 2-byte word).
+
+   All functions prefixed with u32_ operate on UCS-4 encoded strings.
+   Their unit is an uint32_t (a 4-byte word).
+
+   All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
+   n units.
+
+   All arguments starting with "str" and the arguments of functions starting
+   with u8_str/u16_str/u32_str denote a NUL terminated string, i.e. a string
+   which terminates at the first NUL unit.  This termination unit is
+   considered part of the string for all memory allocation purposes, but
+   is not considered part of the string for all other logical purposes.
+
+   Functions returning a string result take a (resultbuf, lengthp) argument
+   pair.  If resultbuf is not NULL and the result fits into *lengthp units,
+   it is put in resultbuf, and resultbuf is returned.  Otherwise, a freshly
+   allocated string is returned.  In both cases, *lengthp is set to the
+   length (number of units) of the returned string.  In case of error,
+   NULL is returned and errno is set.  */
+
+
+/* Elementary string checks.  */
+
+/* Check whether an UTF-8 string is well-formed.
+   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
+extern const uint8_t *
+       u8_check (const uint8_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Check whether an UTF-16 string is well-formed.
+   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
+extern const uint16_t *
+       u16_check (const uint16_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Check whether an UCS-4 string is well-formed.
+   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
+extern const uint32_t *
+       u32_check (const uint32_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+
+/* Elementary string conversions.  */
+
+/* Convert an UTF-8 string to an UTF-16 string.  */
+extern uint16_t *
+       u8_to_u16 (const uint8_t *s, size_t n, uint16_t *resultbuf,
+                  size_t *lengthp);
+
+/* Convert an UTF-8 string to an UCS-4 string.  */
+extern uint32_t *
+       u8_to_u32 (const uint8_t *s, size_t n, uint32_t *resultbuf,
+                  size_t *lengthp);
+
+/* Convert an UTF-16 string to an UTF-8 string.  */
+extern uint8_t *
+       u16_to_u8 (const uint16_t *s, size_t n, uint8_t *resultbuf,
+                  size_t *lengthp);
+
+/* Convert an UTF-16 string to an UCS-4 string.  */
+extern uint32_t *
+       u16_to_u32 (const uint16_t *s, size_t n, uint32_t *resultbuf,
+                   size_t *lengthp);
+
+/* Convert an UCS-4 string to an UTF-8 string.  */
+extern uint8_t *
+       u32_to_u8 (const uint32_t *s, size_t n, uint8_t *resultbuf,
+                  size_t *lengthp);
+
+/* Convert an UCS-4 string to an UTF-16 string.  */
+extern uint16_t *
+       u32_to_u16 (const uint32_t *s, size_t n, uint16_t *resultbuf,
+                   size_t *lengthp);
+
+
+/* Elementary string functions.  */
+
+/* Return the length (number of units) of the first character in S, which is
+   no longer than N.  Return 0 if it is the NUL character.  Return -1 upon
+   failure.  */
+/* Similar to mblen(), except that s must not be NULL.  */
+extern int
+       u8_mblen (const uint8_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_mblen (const uint16_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_mblen (const uint32_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the length (number of units) of the first character in S, putting
+   its 'ucs4_t' representation in *PUC.  Upon failure, *PUC is set to 0xfffd,
+   and an appropriate number of units is returned.
+   The number of available units, N, must be > 0.  */
+/* Similar to mbtowc(), except that puc and s must not be NULL, n must be > 0,
+   and the NUL character is not treated specially.  */
+/* The variants with _unsafe suffix are for backward compatibility with
+   libunistring versions < 0.9.7.  */
+
+#if GNULIB_UNISTR_U8_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n);
+# else
+extern int
+       u8_mbtouc_unsafe_aux (ucs4_t *puc, const uint8_t *s, size_t n);
+static inline int
+u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+  uint8_t c = *s;
+
+  if (c < 0x80)
+    {
+      *puc = c;
+      return 1;
+    }
+  else
+    return u8_mbtouc_unsafe_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n);
+# else
+extern int
+       u16_mbtouc_unsafe_aux (ucs4_t *puc, const uint16_t *s, size_t n);
+static inline int
+u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+  uint16_t c = *s;
+
+  if (c < 0xd800 || c >= 0xe000)
+    {
+      *puc = c;
+      return 1;
+    }
+  else
+    return u16_mbtouc_unsafe_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u32_mbtouc_unsafe (ucs4_t *puc, const uint32_t *s, size_t n);
+# else
+static inline int
+u32_mbtouc_unsafe (ucs4_t *puc,
+                   const uint32_t *s, _GL_ATTRIBUTE_MAYBE_UNUSED size_t n)
+{
+  uint32_t c = *s;
+
+  if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+    *puc = c;
+  else
+    /* invalid multibyte character */
+    *puc = 0xfffd;
+  return 1;
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U8_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n);
+# else
+extern int
+       u8_mbtouc_aux (ucs4_t *puc, const uint8_t *s, size_t n);
+static inline int
+u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+  uint8_t c = *s;
+
+  if (c < 0x80)
+    {
+      *puc = c;
+      return 1;
+    }
+  else
+    return u8_mbtouc_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n);
+# else
+extern int
+       u16_mbtouc_aux (ucs4_t *puc, const uint16_t *s, size_t n);
+static inline int
+u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+  uint16_t c = *s;
+
+  if (c < 0xd800 || c >= 0xe000)
+    {
+      *puc = c;
+      return 1;
+    }
+  else
+    return u16_mbtouc_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n);
+# else
+static inline int
+u32_mbtouc (ucs4_t *puc, const uint32_t *s,
+            _GL_ATTRIBUTE_MAYBE_UNUSED size_t n)
+{
+  uint32_t c = *s;
+
+  if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+    *puc = c;
+  else
+    /* invalid multibyte character */
+    *puc = 0xfffd;
+  return 1;
+}
+# endif
+#endif
+
+/* Return the length (number of units) of the first character in S, putting
+   its 'ucs4_t' representation in *PUC.  Upon failure, *PUC is set to 0xfffd,
+   and -1 is returned for an invalid sequence of units, -2 is returned for an
+   incomplete sequence of units.
+   The number of available units, N, must be > 0.  */
+/* Similar to u*_mbtouc(), except that the return value gives more details
+   about the failure, similar to mbrtowc().  */
+
+#if GNULIB_UNISTR_U8_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+       u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n);
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+       u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n);
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+       u32_mbtoucr (ucs4_t *puc, const uint32_t *s, size_t n);
+#endif
+
+/* Put the multibyte character represented by UC in S, returning its
+   length.  Return -1 upon failure, -2 if the number of available units, N,
+   is too small.  The latter case cannot occur if N >= 6/2/1, respectively.  */
+/* Similar to wctomb(), except that s must not be NULL, and the argument n
+   must be specified.  */
+
+#if GNULIB_UNISTR_U8_UCTOMB || HAVE_LIBUNISTRING
+/* Auxiliary function, also used by u8_chr, u8_strchr, u8_strrchr.  */
+extern int
+       u8_uctomb_aux (uint8_t *s, ucs4_t uc, ptrdiff_t n);
+# if !HAVE_INLINE
+extern int
+       u8_uctomb (uint8_t *s, ucs4_t uc, ptrdiff_t n);
+# else
+static inline int
+u8_uctomb (uint8_t *s, ucs4_t uc, ptrdiff_t n)
+{
+  if (uc < 0x80 && n > 0)
+    {
+      s[0] = uc;
+      return 1;
+    }
+  else
+    return u8_uctomb_aux (s, uc, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_UCTOMB || HAVE_LIBUNISTRING
+/* Auxiliary function, also used by u16_chr, u16_strchr, u16_strrchr.  */
+extern int
+       u16_uctomb_aux (uint16_t *s, ucs4_t uc, ptrdiff_t n);
+# if !HAVE_INLINE
+extern int
+       u16_uctomb (uint16_t *s, ucs4_t uc, ptrdiff_t n);
+# else
+static inline int
+u16_uctomb (uint16_t *s, ucs4_t uc, ptrdiff_t n)
+{
+  if (uc < 0xd800 && n > 0)
+    {
+      s[0] = uc;
+      return 1;
+    }
+  else
+    return u16_uctomb_aux (s, uc, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_UCTOMB || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u32_uctomb (uint32_t *s, ucs4_t uc, ptrdiff_t n);
+# else
+static inline int
+u32_uctomb (uint32_t *s, ucs4_t uc, ptrdiff_t n)
+{
+  if (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000))
+    {
+      if (n > 0)
+        {
+          *s = uc;
+          return 1;
+        }
+      else
+        return -2;
+    }
+  else
+    return -1;
+}
+# endif
+#endif
+
+/* Copy N units from SRC to DEST.  */
+/* Similar to memcpy().  */
+extern uint8_t *
+       u8_cpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_cpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_cpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Copy N units from SRC to DEST, guaranteeing correct behavior for
+   overlapping memory areas.  */
+/* Similar to memmove().  */
+extern uint8_t *
+       u8_move (uint8_t *dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_move (uint16_t *dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_move (uint32_t *dest, const uint32_t *src, size_t n);
+
+/* Set the first N characters of S to UC.  UC should be a character that
+   occupies only 1 unit.  */
+/* Similar to memset().  */
+extern uint8_t *
+       u8_set (uint8_t *s, ucs4_t uc, size_t n);
+extern uint16_t *
+       u16_set (uint16_t *s, ucs4_t uc, size_t n);
+extern uint32_t *
+       u32_set (uint32_t *s, ucs4_t uc, size_t n);
+
+/* Compare S1 and S2, each of length N.  */
+/* Similar to memcmp().  */
+extern int
+       u8_cmp (const uint8_t *s1, const uint8_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_cmp (const uint16_t *s1, const uint16_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_cmp (const uint32_t *s1, const uint32_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Compare S1 and S2.  */
+/* Similar to the gnulib function memcmp2().  */
+extern int
+       u8_cmp2 (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_cmp2 (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_cmp2 (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2)
+       _UC_ATTRIBUTE_PURE;
+
+/* Search the string at S for UC.  */
+/* Similar to memchr().  */
+extern uint8_t *
+       u8_chr (const uint8_t *s, size_t n, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_chr (const uint16_t *s, size_t n, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_chr (const uint32_t *s, size_t n, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+
+/* Count the number of Unicode characters in the N units from S.  */
+/* Similar to mbsnlen().  */
+extern size_t
+       u8_mbsnlen (const uint8_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_mbsnlen (const uint16_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_mbsnlen (const uint32_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Elementary string functions with memory allocation.  */
+
+/* Make a freshly allocated copy of S, of length N.  */
+extern uint8_t *
+       u8_cpy_alloc (const uint8_t *s, size_t n);
+extern uint16_t *
+       u16_cpy_alloc (const uint16_t *s, size_t n);
+extern uint32_t *
+       u32_cpy_alloc (const uint32_t *s, size_t n);
+
+/* Elementary string functions on NUL terminated strings.  */
+
+/* Return the length (number of units) of the first character in S.
+   Return 0 if it is the NUL character.  Return -1 upon failure.  */
+extern int
+       u8_strmblen (const uint8_t *s)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_strmblen (const uint16_t *s)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_strmblen (const uint32_t *s)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the length (number of units) of the first character in S, putting
+   its 'ucs4_t' representation in *PUC.  Return 0 if it is the NUL
+   character.  Return -1 upon failure.  */
+extern int
+       u8_strmbtouc (ucs4_t *puc, const uint8_t *s);
+extern int
+       u16_strmbtouc (ucs4_t *puc, const uint16_t *s);
+extern int
+       u32_strmbtouc (ucs4_t *puc, const uint32_t *s);
+
+/* Forward iteration step.  Advances the pointer past the next character,
+   or returns NULL if the end of the string has been reached.  Puts the
+   character's 'ucs4_t' representation in *PUC.  */
+extern const uint8_t *
+       u8_next (ucs4_t *puc, const uint8_t *s);
+extern const uint16_t *
+       u16_next (ucs4_t *puc, const uint16_t *s);
+extern const uint32_t *
+       u32_next (ucs4_t *puc, const uint32_t *s);
+
+/* Backward iteration step.  Advances the pointer to point to the previous
+   character, or returns NULL if the beginning of the string had been reached.
+   Puts the character's 'ucs4_t' representation in *PUC.  */
+extern const uint8_t *
+       u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start);
+extern const uint16_t *
+       u16_prev (ucs4_t *puc, const uint16_t *s, const uint16_t *start);
+extern const uint32_t *
+       u32_prev (ucs4_t *puc, const uint32_t *s, const uint32_t *start);
+
+/* Return the number of units in S.  */
+/* Similar to strlen(), wcslen().  */
+extern size_t
+       u8_strlen (const uint8_t *s)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_strlen (const uint16_t *s)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_strlen (const uint32_t *s)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the number of units in S, but at most MAXLEN.  */
+/* Similar to strnlen(), wcsnlen().  */
+extern size_t
+       u8_strnlen (const uint8_t *s, size_t maxlen)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_strnlen (const uint16_t *s, size_t maxlen)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_strnlen (const uint32_t *s, size_t maxlen)
+       _UC_ATTRIBUTE_PURE;
+
+/* Copy SRC to DEST.  */
+/* Similar to strcpy(), wcscpy().  */
+extern uint8_t *
+       u8_strcpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
+extern uint16_t *
+       u16_strcpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
+extern uint32_t *
+       u32_strcpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
+
+/* Copy SRC to DEST, returning the address of the terminating NUL in DEST.  */
+/* Similar to stpcpy().  */
+extern uint8_t *
+       u8_stpcpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
+extern uint16_t *
+       u16_stpcpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
+extern uint32_t *
+       u32_stpcpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
+
+/* Copy no more than N units of SRC to DEST.  */
+/* Similar to strncpy(), wcsncpy().  */
+extern uint8_t *
+       u8_strncpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_strncpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_strncpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Copy no more than N units of SRC to DEST.  Return a pointer past the last
+   non-NUL unit written into DEST.  */
+/* Similar to stpncpy().  */
+extern uint8_t *
+       u8_stpncpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_stpncpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_stpncpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Append SRC onto DEST.  */
+/* Similar to strcat(), wcscat().  */
+extern uint8_t *
+       u8_strcat (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
+extern uint16_t *
+       u16_strcat (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
+extern uint32_t *
+       u32_strcat (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
+
+/* Append no more than N units of SRC onto DEST.  */
+/* Similar to strncat(), wcsncat().  */
+extern uint8_t *
+       u8_strncat (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_strncat (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_strncat (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Compare S1 and S2.  */
+/* Similar to strcmp(), wcscmp().  */
+#ifdef __sun
+/* Avoid a collision with the u8_strcmp() function in Solaris 11 libc.  */
+extern int
+       u8_strcmp_gnu (const uint8_t *s1, const uint8_t *s2)
+       _UC_ATTRIBUTE_PURE;
+# define u8_strcmp u8_strcmp_gnu
+#else
+extern int
+       u8_strcmp (const uint8_t *s1, const uint8_t *s2)
+       _UC_ATTRIBUTE_PURE;
+#endif
+extern int
+       u16_strcmp (const uint16_t *s1, const uint16_t *s2)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_strcmp (const uint32_t *s1, const uint32_t *s2)
+       _UC_ATTRIBUTE_PURE;
+
+/* Compare S1 and S2 using the collation rules of the current locale.
+   Return -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2.
+   Upon failure, set errno and return any value.  */
+/* Similar to strcoll(), wcscoll().  */
+extern int
+       u8_strcoll (const uint8_t *s1, const uint8_t *s2);
+extern int
+       u16_strcoll (const uint16_t *s1, const uint16_t *s2);
+extern int
+       u32_strcoll (const uint32_t *s1, const uint32_t *s2);
+
+/* Compare no more than N units of S1 and S2.  */
+/* Similar to strncmp(), wcsncmp().  */
+extern int
+       u8_strncmp (const uint8_t *s1, const uint8_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_strncmp (const uint16_t *s1, const uint16_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_strncmp (const uint32_t *s1, const uint32_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Duplicate S, returning an identical malloc'd string.  */
+/* Similar to strdup(), wcsdup().  */
+extern uint8_t *
+       u8_strdup (const uint8_t *s)
+       _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
+extern uint16_t *
+       u16_strdup (const uint16_t *s)
+       _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
+extern uint32_t *
+       u32_strdup (const uint32_t *s)
+       _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
+
+/* Find the first occurrence of UC in STR.  */
+/* Similar to strchr(), wcschr().  */
+extern uint8_t *
+       u8_strchr (const uint8_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_strchr (const uint16_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_strchr (const uint32_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+
+/* Find the last occurrence of UC in STR.  */
+/* Similar to strrchr(), wcsrchr().  */
+extern uint8_t *
+       u8_strrchr (const uint8_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_strrchr (const uint16_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_strrchr (const uint32_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the length of the initial segment of STR which consists entirely
+   of Unicode characters not in REJECT.  */
+/* Similar to strcspn(), wcscspn().  */
+extern size_t
+       u8_strcspn (const uint8_t *str, const uint8_t *reject)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_strcspn (const uint16_t *str, const uint16_t *reject)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_strcspn (const uint32_t *str, const uint32_t *reject)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the length of the initial segment of STR which consists entirely
+   of Unicode characters in ACCEPT.  */
+/* Similar to strspn(), wcsspn().  */
+extern size_t
+       u8_strspn (const uint8_t *str, const uint8_t *accept)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_strspn (const uint16_t *str, const uint16_t *accept)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_strspn (const uint32_t *str, const uint32_t *accept)
+       _UC_ATTRIBUTE_PURE;
+
+/* Find the first occurrence in STR of any character in ACCEPT.  */
+/* Similar to strpbrk(), wcspbrk().  */
+extern uint8_t *
+       u8_strpbrk (const uint8_t *str, const uint8_t *accept)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_strpbrk (const uint16_t *str, const uint16_t *accept)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_strpbrk (const uint32_t *str, const uint32_t *accept)
+       _UC_ATTRIBUTE_PURE;
+
+/* Find the first occurrence of NEEDLE in HAYSTACK.  */
+/* Similar to strstr(), wcsstr().  */
+extern uint8_t *
+       u8_strstr (const uint8_t *haystack, const uint8_t *needle)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_strstr (const uint16_t *haystack, const uint16_t *needle)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_strstr (const uint32_t *haystack, const uint32_t *needle)
+       _UC_ATTRIBUTE_PURE;
+
+/* Test whether STR starts with PREFIX.  */
+extern bool
+       u8_startswith (const uint8_t *str, const uint8_t *prefix)
+       _UC_ATTRIBUTE_PURE;
+extern bool
+       u16_startswith (const uint16_t *str, const uint16_t *prefix)
+       _UC_ATTRIBUTE_PURE;
+extern bool
+       u32_startswith (const uint32_t *str, const uint32_t *prefix)
+       _UC_ATTRIBUTE_PURE;
+
+/* Test whether STR ends with SUFFIX.  */
+extern bool
+       u8_endswith (const uint8_t *str, const uint8_t *suffix)
+       _UC_ATTRIBUTE_PURE;
+extern bool
+       u16_endswith (const uint16_t *str, const uint16_t *suffix)
+       _UC_ATTRIBUTE_PURE;
+extern bool
+       u32_endswith (const uint32_t *str, const uint32_t *suffix)
+       _UC_ATTRIBUTE_PURE;
+
+/* Divide STR into tokens separated by characters in DELIM.
+   This interface is actually more similar to wcstok than to strtok.  */
+/* Similar to strtok_r(), wcstok().  */
+extern uint8_t *
+       u8_strtok (uint8_t *_UC_RESTRICT str, const uint8_t *delim,
+                  uint8_t **ptr);
+extern uint16_t *
+       u16_strtok (uint16_t *_UC_RESTRICT str, const uint16_t *delim,
+                   uint16_t **ptr);
+extern uint32_t *
+       u32_strtok (uint32_t *_UC_RESTRICT str, const uint32_t *delim,
+                   uint32_t **ptr);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNISTR_H */
diff --git a/darwin-lib/unitypes.h b/darwin-lib/unitypes.h
index 8ce4661..ec472d5 100644
--- a/darwin-lib/unitypes.h
+++ b/darwin-lib/unitypes.h
@@ -1,18 +1,18 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Elementary types and macros for the GNU UniString library.
-   Copyright (C) 2002, 2005-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2005-2006, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _UNITYPES_H
@@ -27,7 +27,7 @@
 /* Attribute of a function whose result depends only on the arguments
    (not pointers!) and which has no side effects.  */
 #ifndef _UC_ATTRIBUTE_CONST
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) || defined __clang__
 #  define _UC_ATTRIBUTE_CONST __attribute__ ((__const__))
 # else
 #  define _UC_ATTRIBUTE_CONST
@@ -37,11 +37,26 @@
 /* Attribute of a function whose result depends only on the arguments
    (possibly pointers) and global memory, and which has no side effects.  */
 #ifndef _UC_ATTRIBUTE_PURE
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
 #  define _UC_ATTRIBUTE_PURE __attribute__ ((__pure__))
 # else
 #  define _UC_ATTRIBUTE_PURE
 # endif
 #endif
 
+/* Qualifier in a function declaration, that asserts that the caller must
+   pass a pointer to a different object in the specified pointer argument
+   than in the other pointer arguments.  */
+#ifndef _UC_RESTRICT
+# if defined __restrict \
+     || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+     || __clang_major__ >= 3
+#  define _UC_RESTRICT __restrict
+# elif 199901L <= __STDC_VERSION__ || defined restrict
+#  define _UC_RESTRICT restrict
+# else
+#  define _UC_RESTRICT
+# endif
+#endif
+
 #endif /* _UNITYPES_H */
diff --git a/darwin-lib/uniwidth.h b/darwin-lib/uniwidth.h
index cb79a70..7980449 100644
--- a/darwin-lib/uniwidth.h
+++ b/darwin-lib/uniwidth.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Display width functions.
-   Copyright (C) 2001-2002, 2005, 2007, 2009-2019 Free Software Foundation,
+   Copyright (C) 2001-2002, 2005, 2007, 2009-2021 Free Software Foundation,
    Inc.
 
-   This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _UNIWIDTH_H
diff --git a/darwin-lib/wchar.h b/darwin-lib/wchar.h
index e042add..3a227d2 100644
--- a/darwin-lib/wchar.h
+++ b/darwin-lib/wchar.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A substitute for ISO C99 <wchar.h>, for platforms that have issues.
 
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Eric Blake.  */
 
@@ -34,7 +34,8 @@
 #if (((defined __need_mbstate_t || defined __need_wint_t)               \
       && !defined __MINGW32__)                                          \
      || (defined __hpux                                                 \
-         && ((defined _INTTYPES_INCLUDED && !defined strtoimax)         \
+         && ((defined _INTTYPES_INCLUDED                                \
+              && !defined _GL_FINISHED_INCLUDING_SYSTEM_INTTYPES_H)     \
              || defined _GL_JUST_INCLUDE_SYSTEM_WCHAR_H))               \
      || (defined __MINGW32__ && defined __STRING_H_SOURCED__)           \
      || defined _GL_ALREADY_INCLUDING_WCHAR_H)
@@ -65,20 +66,12 @@
 # include <features.h> /* for __GLIBC__ */
 #endif
 
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.
-   In some builds of uClibc, <wchar.h> is nonexistent and wchar_t is defined
+/* In some builds of uClibc, <wchar.h> is nonexistent and wchar_t is defined
    by <stddef.h>.
    But avoid namespace pollution on glibc systems.  */
 #if !(defined __GLIBC__ && !defined __UCLIBC__)
 # include <stddef.h>
 #endif
-#ifndef __GLIBC__
-# include <stdio.h>
-# include <time.h>
-#endif
 
 /* Include the original <wchar.h> if it exists.
    Some builds of uClibc lack it.  */
@@ -94,27 +87,29 @@
 
 /* The __attribute__ feature is available in gcc versions 2.5 and later.
    The attribute __pure__ was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define _GL_ATTRIBUTE_PURE /* empty */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
 #endif
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -249,6 +244,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -274,6 +279,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -371,7 +384,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -399,14 +412,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -420,26 +430,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -448,19 +458,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -536,6 +546,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -548,24 +565,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -611,16 +639,27 @@
 
 /* Override mbstate_t if it is too small.
    On IRIX 6.5, sizeof (mbstate_t) == 1, which is not sufficient for
-   implementing mbrtowc for encodings like UTF-8.  */
-#if !(1 && 1) || 0
+   implementing mbrtowc for encodings like UTF-8.
+   On AIX and MSVC, mbrtowc needs to be overridden, but mbstate_t exists and is
+   large enough and overriding it would cause problems in C++ mode.  */
+#if !(((defined _WIN32 && !defined __CYGWIN__) || 1) && 1) || 0
 # if !GNULIB_defined_mbstate_t
+#  if !(defined _AIX || defined _MSC_VER)
 typedef int rpl_mbstate_t;
-#  undef mbstate_t
-#  define mbstate_t rpl_mbstate_t
+#   undef mbstate_t
+#   define mbstate_t rpl_mbstate_t
+#  endif
 #  define GNULIB_defined_mbstate_t 1
 # endif
 #endif
 
+/* Declare 'free' if needed for _GL_ATTRIBUTE_DEALLOC_FREE.  */
+#if (1 && !defined free \
+     && !(defined __cplusplus && defined GNULIB_NAMESPACE))
+_GL_EXTERN_C void free (void *);
+# define free rpl_free
+#endif
+_GL_EXTERN_C void free (void *);
 
 /* Convert a single-byte character to a wide character.  */
 #if 0
@@ -713,16 +752,20 @@
 #   define mbrtowc rpl_mbrtowc
 #  endif
 _GL_FUNCDECL_RPL (mbrtowc, size_t,
-                  (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n,
+                   mbstate_t *restrict ps));
 _GL_CXXALIAS_RPL (mbrtowc, size_t,
-                  (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n,
+                   mbstate_t *restrict ps));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (mbrtowc, size_t,
-                  (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n,
+                   mbstate_t *restrict ps));
 #  endif
 _GL_CXXALIAS_SYS (mbrtowc, size_t,
-                  (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n,
+                   mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (mbrtowc);
@@ -743,13 +786,17 @@
 #   undef mbrlen
 #   define mbrlen rpl_mbrlen
 #  endif
-_GL_FUNCDECL_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
-_GL_CXXALIAS_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
+_GL_FUNCDECL_RPL (mbrlen, size_t,
+                  (const char *restrict s, size_t n, mbstate_t *restrict ps));
+_GL_CXXALIAS_RPL (mbrlen, size_t,
+                  (const char *restrict s, size_t n, mbstate_t *restrict ps));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
+_GL_FUNCDECL_SYS (mbrlen, size_t,
+                  (const char *restrict s, size_t n, mbstate_t *restrict ps));
 #  endif
-_GL_CXXALIAS_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
+_GL_CXXALIAS_SYS (mbrlen, size_t,
+                  (const char *restrict s, size_t n, mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (mbrlen);
@@ -771,20 +818,26 @@
 #   define mbsrtowcs rpl_mbsrtowcs
 #  endif
 _GL_FUNCDECL_RPL (mbsrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (mbsrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t len,
-                   mbstate_t *ps));
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t len,
+                   mbstate_t *restrict ps));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (mbsrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 #  endif
 _GL_CXXALIAS_SYS (mbsrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t len,
-                   mbstate_t *ps));
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t len,
+                   mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (mbsrtowcs);
@@ -806,22 +859,26 @@
 #   define mbsnrtowcs rpl_mbsnrtowcs
 #  endif
 _GL_FUNCDECL_RPL (mbsnrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps)
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t srclen, size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (mbsnrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps));
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t srclen, size_t len,
+                   mbstate_t *restrict ps));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (mbsnrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps)
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t srclen, size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 #  endif
 _GL_CXXALIAS_SYS (mbsnrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps));
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t srclen, size_t len,
+                   mbstate_t *restrict ps));
 # endif
 _GL_CXXALIASWARN (mbsnrtowcs);
 #elif defined GNULIB_POSIXCHECK
@@ -840,13 +897,17 @@
 #   undef wcrtomb
 #   define wcrtomb rpl_wcrtomb
 #  endif
-_GL_FUNCDECL_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
-_GL_CXXALIAS_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
+_GL_FUNCDECL_RPL (wcrtomb, size_t,
+                  (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
+_GL_CXXALIAS_RPL (wcrtomb, size_t,
+                  (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
+_GL_FUNCDECL_SYS (wcrtomb, size_t,
+                  (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
 #  endif
-_GL_CXXALIAS_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
+_GL_CXXALIAS_SYS (wcrtomb, size_t,
+                  (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcrtomb);
@@ -868,20 +929,26 @@
 #   define wcsrtombs rpl_wcsrtombs
 #  endif
 _GL_FUNCDECL_RPL (wcsrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
+                  (char *restrict dest, const wchar_t **restrict srcp,
+                   size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (wcsrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t len,
-                   mbstate_t *ps));
+                  (char *restrict dest, const wchar_t **restrict srcp,
+                   size_t len,
+                   mbstate_t *restrict ps));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (wcsrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
+                  (char *restrict dest, const wchar_t **restrict srcp,
+                   size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 #  endif
 _GL_CXXALIAS_SYS (wcsrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t len,
-                   mbstate_t *ps));
+                  (char *restrict dest, const wchar_t **restrict srcp,
+                   size_t len,
+                   mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsrtombs);
@@ -903,22 +970,30 @@
 #   define wcsnrtombs rpl_wcsnrtombs
 #  endif
 _GL_FUNCDECL_RPL (wcsnrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps)
+                  (char *restrict dest,
+                   const wchar_t **restrict srcp, size_t srclen,
+                   size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (wcsnrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps));
+                  (char *restrict dest,
+                   const wchar_t **restrict srcp, size_t srclen,
+                   size_t len,
+                   mbstate_t *restrict ps));
 # else
 #  if !1 || (defined __cplusplus && defined __sun)
 _GL_FUNCDECL_SYS (wcsnrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps)
+                  (char *restrict dest,
+                   const wchar_t **restrict srcp, size_t srclen,
+                   size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 #  endif
 _GL_CXXALIAS_SYS (wcsnrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps));
+                  (char *restrict dest,
+                   const wchar_t **restrict srcp, size_t srclen,
+                   size_t len,
+                   mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsnrtombs);
@@ -1016,10 +1091,12 @@
 #if 0
 # if !1
 _GL_FUNCDECL_SYS (wmemcpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # endif
 _GL_CXXALIAS_SYS (wmemcpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wmemcpy);
 # endif
@@ -1053,6 +1130,29 @@
 #endif
 
 
+/* Copy N wide characters of SRC to DEST.
+   Return pointer to wide characters after the last written wide character.  */
+#if 0
+# if !1
+_GL_FUNCDECL_SYS (wmempcpy, wchar_t *,
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wmempcpy, wchar_t *,
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wmempcpy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmempcpy
+# if HAVE_RAW_DECL_WMEMPCPY
+_GL_WARN_ON_USE (wmempcpy, "wmempcpy is unportable - "
+                 "use gnulib module wmempcpy for portability");
+# endif
+#endif
+
+
 /* Set N wide characters of S to C.  */
 #if 0
 # if !1
@@ -1109,9 +1209,11 @@
 /* Copy SRC to DEST.  */
 #if 0
 # if !1
-_GL_FUNCDECL_SYS (wcscpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_FUNCDECL_SYS (wcscpy, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # endif
-_GL_CXXALIAS_SYS (wcscpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_CXXALIAS_SYS (wcscpy, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcscpy);
 # endif
@@ -1127,9 +1229,11 @@
 /* Copy SRC to DEST, returning the address of the terminating L'\0' in DEST.  */
 #if 0
 # if !1
-_GL_FUNCDECL_SYS (wcpcpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_FUNCDECL_SYS (wcpcpy, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # endif
-_GL_CXXALIAS_SYS (wcpcpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_CXXALIAS_SYS (wcpcpy, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 _GL_CXXALIASWARN (wcpcpy);
 #elif defined GNULIB_POSIXCHECK
 # undef wcpcpy
@@ -1144,10 +1248,12 @@
 #if 0
 # if !1
 _GL_FUNCDECL_SYS (wcsncpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # endif
 _GL_CXXALIAS_SYS (wcsncpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsncpy);
 # endif
@@ -1165,10 +1271,12 @@
 #if 0
 # if !1
 _GL_FUNCDECL_SYS (wcpncpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # endif
 _GL_CXXALIAS_SYS (wcpncpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 _GL_CXXALIASWARN (wcpncpy);
 #elif defined GNULIB_POSIXCHECK
 # undef wcpncpy
@@ -1182,9 +1290,11 @@
 /* Append SRC onto DEST.  */
 #if 0
 # if !1
-_GL_FUNCDECL_SYS (wcscat, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_FUNCDECL_SYS (wcscat, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # endif
-_GL_CXXALIAS_SYS (wcscat, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_CXXALIAS_SYS (wcscat, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcscat);
 # endif
@@ -1201,10 +1311,12 @@
 #if 0
 # if !1
 _GL_FUNCDECL_SYS (wcsncat, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest, const wchar_t *restrict src,
+                   size_t n));
 # endif
 _GL_CXXALIAS_SYS (wcsncat, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest, const wchar_t *restrict src,
+                   size_t n));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsncat);
 # endif
@@ -1317,9 +1429,11 @@
    original strings.  */
 #if 0
 # if !1
-_GL_FUNCDECL_SYS (wcsxfrm, size_t, (wchar_t *s1, const wchar_t *s2, size_t n));
+_GL_FUNCDECL_SYS (wcsxfrm, size_t,
+                  (wchar_t *restrict s1, const wchar_t *restrict s2, size_t n));
 # endif
-_GL_CXXALIAS_SYS (wcsxfrm, size_t, (wchar_t *s1, const wchar_t *s2, size_t n));
+_GL_CXXALIAS_SYS (wcsxfrm, size_t,
+                  (wchar_t *restrict s1, const wchar_t *restrict s2, size_t n));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsxfrm);
 # endif
@@ -1334,16 +1448,55 @@
 
 /* Duplicate S, returning an identical malloc'd string.  */
 #if 0
-# if !1
-_GL_FUNCDECL_SYS (wcsdup, wchar_t *, (const wchar_t *s));
-# endif
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef wcsdup
+#   define wcsdup _wcsdup
+#  endif
+_GL_CXXALIAS_MDA (wcsdup, wchar_t *, (const wchar_t *s));
+# else
+#  if !1 || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
+                  (const wchar_t *s)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#  endif
 _GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s));
+# endif
 _GL_CXXALIASWARN (wcsdup);
-#elif defined GNULIB_POSIXCHECK
-# undef wcsdup
-# if HAVE_RAW_DECL_WCSDUP
+#else
+# if __GNUC__ >= 11 && !defined wcsdup
+/* For -Wmismatched-dealloc: Associate wcsdup with free or rpl_free.  */
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
+                  (const wchar_t *s)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef wcsdup
+#  if HAVE_RAW_DECL_WCSDUP
 _GL_WARN_ON_USE (wcsdup, "wcsdup is unportable - "
                  "use gnulib module wcsdup for portability");
+#  endif
+# elif 1
+/* On native Windows, map 'wcsdup' to '_wcsdup', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::wcsdup always.  */
+#  if defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef wcsdup
+#    define wcsdup _wcsdup
+#   endif
+_GL_CXXALIAS_MDA (wcsdup, wchar_t *, (const wchar_t *s));
+#  else
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
+                  (const wchar_t *s)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#   if 1
+_GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s));
+#   endif
+#  endif
+#  if (defined _WIN32 && !defined __CYGWIN__) || 1
+_GL_CXXALIASWARN (wcsdup);
+#  endif
 # endif
 #endif
 
@@ -1485,7 +1638,8 @@
 #if 0
 # if !1
 _GL_FUNCDECL_SYS (wcsstr, wchar_t *,
-                  (const wchar_t *haystack, const wchar_t *needle)
+                  (const wchar_t *restrict haystack,
+                   const wchar_t *restrict needle)
                   _GL_ATTRIBUTE_PURE);
 # endif
   /* On some systems, this function is defined as an overloaded function:
@@ -1494,14 +1648,18 @@
          wchar_t * std::wcsstr (wchar_t *, const wchar_t *);
        }  */
 _GL_CXXALIAS_SYS_CAST2 (wcsstr,
-                        wchar_t *, (const wchar_t *, const wchar_t *),
-                        const wchar_t *, (const wchar_t *, const wchar_t *));
+                        wchar_t *,
+                        (const wchar_t *restrict, const wchar_t *restrict),
+                        const wchar_t *,
+                        (const wchar_t *restrict, const wchar_t *restrict));
 # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
      && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
 _GL_CXXALIASWARN1 (wcsstr, wchar_t *,
-                   (wchar_t *haystack, const wchar_t *needle));
+                   (wchar_t *restrict haystack,
+                    const wchar_t *restrict needle));
 _GL_CXXALIASWARN1 (wcsstr, const wchar_t *,
-                   (const wchar_t *haystack, const wchar_t *needle));
+                   (const wchar_t *restrict haystack,
+                    const wchar_t *restrict needle));
 # elif __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsstr);
 # endif
@@ -1522,16 +1680,20 @@
 #   define wcstok rpl_wcstok
 #  endif
 _GL_FUNCDECL_RPL (wcstok, wchar_t *,
-                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+                  (wchar_t *restrict wcs, const wchar_t *restrict delim,
+                   wchar_t **restrict ptr));
 _GL_CXXALIAS_RPL (wcstok, wchar_t *,
-                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+                  (wchar_t *restrict wcs, const wchar_t *restrict delim,
+                   wchar_t **restrict ptr));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (wcstok, wchar_t *,
-                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+                  (wchar_t *restrict wcs, const wchar_t *restrict delim,
+                   wchar_t **restrict ptr));
 #  endif
 _GL_CXXALIAS_SYS (wcstok, wchar_t *,
-                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+                  (wchar_t *restrict wcs, const wchar_t *restrict delim,
+                   wchar_t **restrict ptr));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcstok);
@@ -1583,19 +1745,27 @@
 #   undef wcsftime
 #   define wcsftime rpl_wcsftime
 #  endif
-_GL_FUNCDECL_RPL (wcsftime, size_t, (wchar_t *__buf, size_t __bufsize,
-                                     const wchar_t *__fmt, const struct tm *__tp)
-                                    _GL_ARG_NONNULL ((1, 3, 4)));
-_GL_CXXALIAS_RPL (wcsftime, size_t, (wchar_t *__buf, size_t __bufsize,
-                                     const wchar_t *__fmt, const struct tm *__tp));
+_GL_FUNCDECL_RPL (wcsftime, size_t,
+                  (wchar_t *restrict __buf, size_t __bufsize,
+                   const wchar_t *restrict __fmt,
+                   const struct tm *restrict __tp)
+                  _GL_ARG_NONNULL ((1, 3, 4)));
+_GL_CXXALIAS_RPL (wcsftime, size_t,
+                  (wchar_t *restrict __buf, size_t __bufsize,
+                   const wchar_t *restrict __fmt,
+                   const struct tm *restrict __tp));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (wcsftime, size_t, (wchar_t *__buf, size_t __bufsize,
-                                     const wchar_t *__fmt, const struct tm *__tp)
-                                    _GL_ARG_NONNULL ((1, 3, 4)));
+_GL_FUNCDECL_SYS (wcsftime, size_t,
+                  (wchar_t *restrict __buf, size_t __bufsize,
+                   const wchar_t *restrict __fmt,
+                   const struct tm *restrict __tp)
+                  _GL_ARG_NONNULL ((1, 3, 4)));
 #  endif
-_GL_CXXALIAS_SYS (wcsftime, size_t, (wchar_t *__buf, size_t __bufsize,
-                                     const wchar_t *__fmt, const struct tm *__tp));
+_GL_CXXALIAS_SYS (wcsftime, size_t,
+                  (wchar_t *restrict __buf, size_t __bufsize,
+                   const wchar_t *restrict __fmt,
+                   const struct tm *restrict __tp));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsftime);
diff --git a/darwin-lib/wctype.h b/darwin-lib/wctype.h
index 3055531..e593107 100644
--- a/darwin-lib/wctype.h
+++ b/darwin-lib/wctype.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A substitute for ISO C99 <wctype.h>, for platforms that lack it.
 
-   Copyright (C) 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible and Paul Eggert.  */
 
@@ -46,14 +46,7 @@
 #ifndef _GL_WCTYPE_H
 
 #if 1
-/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.
-   Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-# include <stddef.h>
-# include <stdio.h>
-# include <time.h>
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
 # include <wchar.h>
 #endif
 
@@ -86,19 +79,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -233,6 +226,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -258,6 +261,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -355,7 +366,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -383,14 +394,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -404,19 +412,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -492,6 +500,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -504,24 +519,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -616,7 +642,7 @@
 _GL_WCTYPE_INLINE int
 rpl_iswdigit (wint_t wc)
 {
-  return ((wchar_t) wc == wc ? iswdigit ((wchar_t) wc) : 0);
+  return ((wchar_t) wc == wc ? wc >= '0' && wc <= '9' : 0);
 }
 
 _GL_WCTYPE_INLINE int
@@ -658,7 +684,10 @@
 _GL_WCTYPE_INLINE int
 rpl_iswxdigit (wint_t wc)
 {
-  return ((wchar_t) wc == wc ? iswxdigit ((wchar_t) wc) : 0);
+  return ((wchar_t) wc == wc
+          ? (wc >= '0' && wc <= '9')
+            || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F')
+          : 0);
 }
 
 _GL_WCTYPE_INLINE wint_t
@@ -911,16 +940,39 @@
 
 #  endif
 
-# elif 1 && (! 1 || 0)
-/* Only the iswblank function is missing.  */
+# else
+/* Only some of the functions are missing or broken.  */
 
-#  if 0
-#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-#    define iswblank rpl_iswblank
-#   endif
+#  if 1 && (! 1 || 0)
+/* Only the iswblank function is missing.  */
+#   if 0
+#    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#     define iswblank rpl_iswblank
+#    endif
 _GL_FUNCDECL_RPL (iswblank, int, (wint_t wc));
-#  else
+#   else
 _GL_FUNCDECL_SYS (iswblank, int, (wint_t wc));
+#   endif
+#  endif
+
+#  if 1
+#   if 0
+#    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#     undef iswdigit
+#     define iswdigit rpl_iswdigit
+#    endif
+_GL_FUNCDECL_RPL (iswdigit, int, (wint_t wc));
+#   endif
+#  endif
+
+#  if 1
+#   if 0
+#    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#     undef iswxdigit
+#     define iswxdigit rpl_iswxdigit
+#    endif
+_GL_FUNCDECL_RPL (iswxdigit, int, (wint_t wc));
+#   endif
 #  endif
 
 # endif
@@ -965,28 +1017,62 @@
 
 #if 0
 _GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
 #else
 _GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc));
+#endif
+#if 1
+# if 0
+_GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
+# else
 _GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc));
+# endif
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswlower, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswprint, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswspace, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswupper, int, (wint_t wc));
+#endif
+#if 1
+# if 0
+_GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
+# else
 _GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc));
+# endif
 #endif
 #if __GLIBC__ >= 2
 _GL_CXXALIASWARN (iswalnum);
diff --git a/data/README.md b/data/README.md
index 94e9891..09886ea 100644
--- a/data/README.md
+++ b/data/README.md
@@ -1,6 +1,6 @@
 This directory contains data needed by Bison.
 
-# Directory content
+# Directory Content
 ## Skeletons
 Bison skeletons: the general shapes of the different parser kinds, that are
 specialized for specific grammars by the bison program.
@@ -48,7 +48,7 @@
 - xml2xhtml.xsl
   Conversion into XHTML.
 
-# Implementation note about the skeletons
+# Implementation Notes About the Skeletons
 
 "Skeleton" in Bison parlance means "backend": a skeleton is fed by the bison
 executable with LR tables, facts about the symbols, etc. and they generate
@@ -73,36 +73,63 @@
 your language.  Overall, be sure to follow the same patterns as the existing
 skeletons.
 
+## Vocabulary
+
+We use "formal arguments", or "formals" for short, to denote the declared
+parameters of a function (e.g., `int argc, const char **argv`).  Yes, this
+is somewhat contradictory with `param` in the `%param` directives.
+
+We use "effective arguments", or "args" for short, to denote the values
+passed in function calls (e.g., `argc, argv`).
+
 ## Symbols
 
 ### `b4_symbol(NUM, FIELD)`
 In order to unify the handling of the various aspects of symbols (tag, type
 name, whether terminal, etc.), bison.exe defines one macro per (token,
 field), where field can `has_id`, `id`, etc.: see
-`prepare_symbols_definitions()` in `src/output.c`.
+`prepare_symbol_definitions()` in `src/output.c`.
 
-The macro `b4_symbol(NUM, FIELD)` gives access to the following FIELDS:
+NUM can be:
+- `empty` to denote the "empty" pseudo-symbol when it exists,
+- `eof`, `error`, or `undef`
+- a symbol number.
 
-- `has_id`: 0 or 1.
+FIELD can be:
 
-  Whether the symbol has an id.
+- `has_id`: 0 or 1
+  Whether the symbol has an `id`.
 
-- `id`: string
-  If has_id, the id (prefixed by api.token.prefix if defined), otherwise
-  defined as empty.  Guaranteed to be usable as a C identifier.
+- `id`: string (e.g., `exp`, `NUM`, or `TOK_NUM` with api.token.prefix)
+  If `has_id`, the name of the token kind (prefixed by api.token.prefix if
+  defined), otherwise empty.  Guaranteed to be usable as a C identifier.
+  This is used to define the token kind (i.e., the enum used by the return
+  value of yylex).  Should be named `token_kind`.
 
-- `tag`: string.
-  A representation of the symbol.  Can be 'foo', 'foo.id', '"foo"' etc.
+- `tag`: string
+  A human readable representation of the symbol.  Can be `'foo'`,
+  `'foo.id'`, `'"foo"'` etc.
 
-- `user_number`: integer
+- `code`: integer
+  The token code associated to the token kind `id`.
   The external number as used by yylex.  Can be ASCII code when a character,
-  some number chosen by bison, or some user number in the case of
-  %token FOO <NUM>.  Corresponds to yychar in yacc.c.
+  some number chosen by bison, or some user number in the case of `%token
+  FOO <NUM>`.  Corresponds to `yychar` in `yacc.c`.
 
 - `is_token`: 0 or 1
   Whether this is a terminal symbol.
 
+- `kind_base`: string (e.g., `YYSYMBOL_exp`, `YYSYMBOL_NUM`)
+  The base of the symbol kind, i.e., the enumerator of this symbol (token or
+  nonterminal) which is mapped to its `number`.
+
+- `kind`: string
+  Same as `kind_base`, but possibly with a prefix in some languages.  E.g.,
+  EOF's `kind_base` and `kind` are `YYSYMBOL_YYEOF` in C, but are
+  `S_YYEMPTY` and `symbol_kind::S_YYEMPTY` in C++.
+
 - `number`: integer
+  The code associated to the `kind`.
   The internal number (computed from the external number by yytranslate).
   Corresponds to yytoken in yacc.c.  This is the same number that serves as
   key in b4_symbol(NUM, FIELD).
@@ -129,11 +156,17 @@
   When api.value.type=union, the generated name for the union member.
   yytype_INT etc. for symbols that has_id, otherwise yytype_1 etc.
 
-- `type`
+- `type`: string
   If it has a semantic value, its type tag, or, if variant are used,
   its type.
   In the case of api.value.type=union, type is the real type (e.g. int).
 
+- `slot`: string
+  If it has a semantic value, the name of the union member (i.e., bounces to
+  either `type_tag` or `type`).  It would be better to fix our mess and
+  always use `type` for the true type of the member, and `type_tag` for the
+  name of the union member.
+
 - `has_printer`: 0, 1
 - `printer`: string
 - `printer_file`: string
@@ -166,7 +199,7 @@
 Expansion of `$<TYPE>POS`, where the current rule has `RULE-LENGTH` symbols
 on RHS.
 
------
+<!--
 
 Local Variables:
 mode: markdown
@@ -174,7 +207,7 @@
 ispell-dictionary: "american"
 End:
 
-Copyright (C) 2002, 2008-2015, 2018-2019 Free Software Foundation, Inc.
+Copyright (C) 2002, 2008-2015, 2018-2021 Free Software Foundation, Inc.
 
 This file is part of GNU Bison.
 
@@ -189,4 +222,6 @@
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
+along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+-->
diff --git a/data/bison-default.css b/data/bison-default.css
index 68df166..aadaba1 100644
--- a/data/bison-default.css
+++ b/data/bison-default.css
@@ -1,5 +1,5 @@
 /* Default styling rules for Bison when doing terminal output.
-   Copyright (C) 2019 Free Software Foundation, Inc.
+   Copyright (C) 2019-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -29,3 +29,33 @@
 
 /* "Sections" in traces (--trace).  */
 .trace0    { color: green; }
+
+/* Syntax error messages.  */
+.expected   { color: green; }
+.unexpected { color: red; }
+
+
+/* Counterexamples.  */
+
+/* Cex: point in rule.  */
+.cex-dot { color: red; }
+
+/* Cex: coloring various rules.  */
+.cex-0   { color: yellow; }
+.cex-1   { color: green; }
+.cex-2   { color: blue; }
+.cex-3   { color: purple; }
+.cex-4   { color: violet; }
+.cex-5   { color: orange; }
+.cex-6   { color: brown; }
+.cex-7   { color: mauve; }
+.cex-8   { color: #013220; } /* Dark green. */
+.cex-9   { color: #e75480; } /* Dark pink. */
+.cex-10  { color: cyan; }
+.cex-11  { color: orange; }
+
+/* Cex: derivation rewriting steps.  */
+.cex-step { font-style: italic; }
+
+/* Cex: leaves of a derivation.  */
+.cex-leaf { font-weight: 600; }
diff --git a/data/local.mk b/data/local.mk
index f82aee7..c51d287 100644
--- a/data/local.mk
+++ b/data/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2002, 2005-2015, 2018-2019 Free Software Foundation,
+## Copyright (C) 2002, 2005-2015, 2018-2021 Free Software Foundation,
 ## Inc.
 
 ## This program is free software: you can redistribute it and/or modify
@@ -12,7 +12,7 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 dist_pkgdata_DATA =                             \
   data/README.md                                \
@@ -28,18 +28,19 @@
   data/skeletons/c.m4                           \
   data/skeletons/glr.c                          \
   data/skeletons/glr.cc                         \
+  data/skeletons/glr2.cc                        \
   data/skeletons/java-skel.m4                   \
   data/skeletons/java.m4                        \
   data/skeletons/lalr1.cc                       \
   data/skeletons/lalr1.java                     \
   data/skeletons/location.cc                    \
   data/skeletons/stack.hh                       \
+  data/skeletons/traceon.m4                     \
   data/skeletons/variant.hh                     \
   data/skeletons/yacc.c
 
 # Experimental support for the D language.
 dist_skeletons_DATA +=                          \
-  data/skeletons/README-D.txt                   \
   data/skeletons/d-skel.m4                      \
   data/skeletons/d.m4                           \
   data/skeletons/lalr1.d
diff --git a/data/m4sugar/foreach.m4 b/data/m4sugar/foreach.m4
index 7093d0fc..2052d44 100644
--- a/data/m4sugar/foreach.m4
+++ b/data/m4sugar/foreach.m4
@@ -4,7 +4,7 @@
 # Speeds up GNU M4 1.4.x by avoiding quadratic $@ recursion, but penalizes
 # GNU M4 1.6 by requiring more memory and macro expansions.
 #
-# Copyright (C) 2008-2017 Free Software Foundation, Inc.
+# Copyright (C) 2008-2017, 2020 Free Software Foundation, Inc.
 
 # This file is part of Autoconf.  This program is free
 # software; you can redistribute it and/or modify it under the
diff --git a/data/m4sugar/m4sugar.m4 b/data/m4sugar/m4sugar.m4
index bbd6958..b42fc1a 100644
--- a/data/m4sugar/m4sugar.m4
+++ b/data/m4sugar/m4sugar.m4
@@ -3,7 +3,7 @@
 # Base M4 layer.
 # Requires GNU M4.
 #
-# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017, 2020 Free Software Foundation, Inc.
 
 # This file is part of Autoconf.  This program is free
 # software; you can redistribute it and/or modify it under the
@@ -2412,6 +2412,27 @@
 [m4_strip(m4_flatten([$1]))])
 
 
+# m4_validate_w(STRING)
+# ---------------------
+# Expands into m4_normalize(m4_expand([STRING])), but if that is not
+# the same as just m4_normalize([STRING]), issue a warning.
+#
+# This is used in several Autoconf macros that take a
+# whitespace-separated list of symbols as an argument.  Ideally that
+# list would not be expanded before use, but several packages used
+# `dnl' to put comments inside those lists, so they must be expanded
+# for compatibility's sake.
+m4_define([m4_validate_w],
+[_m4_validate_w(m4_normalize([$1]), m4_normalize(m4_expand([$1])))])
+
+m4_define([_m4_validate_w],
+[m4_if([$1], [$2], [],
+  [m4_warn([obsolete], [whitespace-separated list contains macros;
+in a future version of Autoconf they will not be expanded]dnl
+m4_if(m4_bregexp([$1], [\bdn[l]\b]), -1, [], [
+note: `dn@&t@l' is a macro]))])dnl
+[$2]])
+
 
 # m4_join(SEP, ARG1, ARG2...)
 # ---------------------------
diff --git a/data/skeletons/README-D.txt b/data/skeletons/README-D.txt
deleted file mode 100644
index 214e309..0000000
--- a/data/skeletons/README-D.txt
+++ /dev/null
@@ -1,60 +0,0 @@
-Some usage notes for the D Parser:
-
-- it is a port of the Java parser, so interface is very similar.
-
-- the lexer class needs to implement the interface 'Lexer' (similar to
-  java). It typically (depending on options) looks like this:
-
-public interface Lexer
-{
-  /**
-   * Method to retrieve the beginning position of the last scanned token.
-   * @return the position at which the last scanned token starts.  */
-  @property YYPosition startPos ();
-
-  /**
-   * Method to retrieve the ending position of the last scanned token.
-   * @return the first position beyond the last scanned token.  */
-  @property YYPosition endPos ();
-
-  /**
-   * Method to retrieve the semantic value of the last scanned token.
-   * @return the semantic value of the last scanned token.  */
-  @property YYSemanticType semanticVal ();
-
-  /**
-   * Entry point for the scanner.  Returns the token identifier corresponding
-   * to the next token and prepares to return the semantic value
-   * and beginning/ending positions of the token.
-   * @return the token identifier corresponding to the next token. */
-  YYTokenType yylex ();
-
-  /**
-   * Entry point for error reporting.  Emits an error
-   * referring to the given location in a user-defined way.
-   *
-   * @param loc The location of the element to which the
-   *                error message is related
-   * @param s The string for the error message.  */
-   void yyerror (YYLocation loc, string s);
-}
-
-- semantic types are handled by D usions (same as for C/C++ parsers)
-
-- the following (non-standard) %defines are supported:
-
-  %define package "<package_name>"
-  %define api.parser.class "my_class_name>"
-  %define position_type "my_position_type"
-  %define location_type "my_location_type"
-
-- the following declarations basically work like in C/C++:
-
-  %locations
-  %error-verbose
-  %parse-param
-  %initial-action
-  %code
-  %union
-
-- %destructor is not yet supported
diff --git a/data/skeletons/bison.m4 b/data/skeletons/bison.m4
index 7ca8497..b7bf5c5 100644
--- a/data/skeletons/bison.m4
+++ b/data/skeletons/bison.m4
@@ -2,7 +2,7 @@
 
 # Language-independent M4 Macros for Bison.
 
-# Copyright (C) 2002, 2004-2015, 2018-2019 Free Software Foundation,
+# Copyright (C) 2002, 2004-2015, 2018-2021 Free Software Foundation,
 # Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -16,7 +16,30 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+
+
+# m4_gsub(STRING, RE1, SUBST1, RE2, SUBST2, ...)
+# ----------------------------------------------
+# m4 equivalent of
+#
+#   $_ = STRING;
+#   s/RE1/SUBST1/g;
+#   s/RE2/SUBST2/g;
+#   ...
+#
+# Really similar to m4_bpatsubsts, but behaves properly with quotes.
+# See m4.at's "Generating Comments".  Super inelegant, but so far, I
+# did not find any better solution.
+m4_define([b4_gsub],
+[m4_bpatsubst(m4_bpatsubst(m4_bpatsubst([[[[$1]]]],
+                                        [$2], [$3]),
+                           [$4], [$5]),
+              [$6], [$7])])
+
+# m4_shift2 and m4_shift3 are provided by m4sugar.
+m4_define([m4_shift4], [m4_shift(m4_shift(m4_shift(m4_shift($@))))])
 
 
 ## ---------------- ##
@@ -26,7 +49,7 @@
 # b4_generated_by
 # ---------------
 m4_define([b4_generated_by],
-[b4_comment([A Bison parser, made by GNU Bison b4_version.])
+[b4_comment([A Bison parser, made by GNU Bison b4_version_string.])
 ])
 
 # b4_copyright(TITLE, [YEARS])
@@ -51,7 +74,7 @@
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.])
+along with this program.  If not, see <https://www.gnu.org/licenses/>.])
 
 b4_comment([As a special exception, you may create a larger work that contains
 part or all of the Bison parser skeleton and distribute that work
@@ -72,8 +95,9 @@
 # -------------
 # Issue a warning about private implementation details.
 m4_define([b4_disclaimer],
-[b4_comment([Undocumented macros, especially those whose name start with YY_,
-are private implementation details.  Do not rely on them.])
+[b4_comment([DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+especially those whose name start with YY_ or yy_.  They are
+private implementation details that can be changed or removed.])
 ])
 
 
@@ -161,7 +185,7 @@
 [b4_cat([[@complain][(]$1[@,]$2[@,]$3[@,]$4[]]dnl
 [m4_if([$#], [4], [],
        [m4_foreach([b4_arg],
-                   m4_dquote(m4_shift(m4_shift(m4_shift(m4_shift($@))))),
+                   m4_dquote(m4_shift4($@)),
                    [[@,]b4_arg])])[@)]])])
 
 # b4_warn(FORMAT, [ARG1], [ARG2], ...)
@@ -237,6 +261,13 @@
 [b4_error([[fatal]], $@)dnl
 m4_exit(1)])
 
+# b4_canary(MSG)
+# --------------
+# Issue a warning on stderr and in the output.  Used in the test suite
+# to catch spurious m4 evaluations.
+m4_define([b4_canary],
+[m4_errprintn([dead canary: $1])DEAD CANARY($1)])
+
 
 ## ------------ ##
 ## Data Types.  ##
@@ -308,14 +339,14 @@
 $1([check], [b4_check])
 
 $1([stos], [b4_stos],
-   [[YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-symbol of state STATE-NUM.]])
+   [[YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
+state STATE-NUM.]])
 
 $1([r1], [b4_r1],
-   [[YYR1[YYN] -- Symbol number of symbol that rule YYN derives.]])
+   [[YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM.]])
 
 $1([r2], [b4_r2],
-   [[YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.]])
+   [[YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM.]])
 ])
 
 
@@ -367,8 +398,9 @@
 # b4_FLAG_if(IF-TRUE, IF-FALSE)
 # -----------------------------
 # Expand IF-TRUE, if FLAG is true, IF-FALSE otherwise.
-b4_define_flag_if([defines])            # Whether headers are requested.
 b4_define_flag_if([glr])                # Whether a GLR parser is requested.
+b4_define_flag_if([has_translations])   # Whether some tokens are internationalized.
+b4_define_flag_if([header])             # Whether a header is requested.
 b4_define_flag_if([nondeterministic])   # Whether conflicts should be handled.
 b4_define_flag_if([token_table])        # Whether yytoken_table is demanded.
 b4_define_flag_if([yacc])               # Whether POSIX Yacc is emulated.
@@ -379,43 +411,100 @@
 m4_define([b4_glr_cc_if],
           [m4_if(b4_skeleton, ["glr.cc"], $@)])
 
+# b4_glr2_cc_if([IF-TRUE], [IF-FALSE])
+# ------------------------------------
+m4_define([b4_glr2_cc_if],
+          [m4_if(b4_skeleton, ["glr2.cc"], $@)])
 
 ## --------- ##
 ## Symbols.  ##
 ## --------- ##
 
-# For a description of the Symbol handling, see README.
+# For a description of the Symbol handling, see README.md.
 #
 # The following macros provide access to symbol related values.
 
 # __b4_symbol(NUM, FIELD)
 # -----------------------
-# Recover a FIELD about symbol #NUM.  Thanks to m4_indir, fails if
-# undefined.
+# Fetch FIELD of symbol #NUM.  Fail if undefined.
 m4_define([__b4_symbol],
 [m4_indir([b4_symbol($1, $2)])])
 
 
 # _b4_symbol(NUM, FIELD)
 # ----------------------
-# Recover a FIELD about symbol #NUM (or "orig NUM").  Fails if
-# undefined.
+# Fetch FIELD of symbol #NUM (or "orig NUM", see README.md).
+# Fail if undefined.
 m4_define([_b4_symbol],
 [m4_ifdef([b4_symbol($1, number)],
           [__b4_symbol(m4_indir([b4_symbol($1, number)]), $2)],
           [__b4_symbol([$1], [$2])])])
 
 
+# b4_symbol_token_kind(NUM)
+# -------------------------
+# The token kind of this symbol.
+m4_define([b4_symbol_token_kind],
+[b4_percent_define_get([api.token.prefix])dnl
+_b4_symbol([$1], [id])])
+
+
+# b4_symbol_kind_base(NUM)
+# ------------------------
+# Build the name of the kind of this symbol.  It must always exist,
+# otherwise some symbols might not be represented in the enum, which
+# might be compiled into too small a type to contain all the symbol
+# numbers.
+m4_define([b4_symbol_prefix], [b4_percent_define_get([api.symbol.prefix])])
+m4_define([b4_symbol_kind_base],
+[b4_percent_define_get([api.symbol.prefix])dnl
+m4_case([$1],
+  [-2],                             [[YYEMPTY]],
+  [0],                              [[YYEOF]],
+  [1],                              [[YYerror]],
+  [2],                              [[YYUNDEF]],
+  [m4_case(b4_symbol([$1], [tag]),
+      [$accept],                    [[YYACCEPT]],
+      [b4_symbol_if([$1], [has_id], _b4_symbol([$1], [id]),
+                                    [m4_bpatsubst([$1-][]_b4_symbol([$1], [tag]), [[^a-zA-Z_0-9]+], [_])])])])])
+
+
+# b4_symbol_kind(NUM)
+# -------------------
+# Same as b4_symbol_kind, but possibly with a prefix in some
+# languages.  E.g., EOF's kind_base and kind are YYSYMBOL_YYEOF in C,
+# but are S_YYEMPTY and symbol_kind::S_YYEMPTY in C++.
+m4_copy([b4_symbol_kind_base], [b4_symbol_kind])
+
+
+# b4_symbol_slot(NUM)
+# -------------------
+# The name of union member that contains the value of these symbols.
+# Currently, we are messy, this should actually be type_tag, but type_tag
+# has several meanings.
+m4_define([b4_symbol_slot],
+[m4_case(b4_percent_define_get([[api.value.type]]),
+         [union],   [b4_symbol([$1], [type_tag])],
+         [variant], [b4_symbol([$1], [type_tag])],
+         [b4_symbol([$1], [type])])])
+
 
 # b4_symbol(NUM, FIELD)
 # ---------------------
-# Recover a FIELD about symbol #NUM (or "orig NUM").  Fails if
-# undefined.  If FIELD = id, prepend the token prefix.
+# Fetch FIELD of symbol #NUM (or "orig NUM", or "empty").  Fail if undefined.
+#
+# If FIELD = id, prepend the token prefix.
 m4_define([b4_symbol],
-[m4_case([$2],
-         [id],    [m4_do([b4_percent_define_get([api.token.prefix])],
-                         [_b4_symbol([$1], [id])])],
-         [_b4_symbol($@)])])
+[m4_if([$1], [empty], [b4_symbol([-2], [$2])],
+       [$1], [eof],   [b4_symbol([0], [$2])],
+       [$1], [error], [b4_symbol([1], [$2])],
+       [$1], [undef], [b4_symbol([2], [$2])],
+       [m4_case([$2],
+                [id],        [b4_symbol_token_kind([$1])],
+                [kind_base], [b4_symbol_kind_base([$1])],
+                [kind],      [b4_symbol_kind([$1])],
+                [slot],      [b4_symbol_slot([$1])],
+                [_b4_symbol($@)])])])
 
 
 # b4_symbol_if(NUM, FIELD, IF-TRUE, IF-FALSE)
@@ -437,9 +526,9 @@
 ])
 
 
-# b4_symbol_action(SYMBOL-NUM, KIND)
-# ----------------------------------
-# Run the action KIND (destructor or printer) for SYMBOL-NUM.
+# b4_symbol_action(SYMBOL-NUM, ACTION)
+# ------------------------------------
+# Run the action ACTION ("destructor" or "printer") for SYMBOL-NUM.
 m4_define([b4_symbol_action],
 [b4_symbol_if([$1], [has_$2],
 [b4_dollar_pushdef([(*yyvaluep)],
@@ -463,21 +552,21 @@
 m4_define([b4_symbol_printer],    [b4_symbol_action([$1], [printer])])
 
 
-# b4_symbol_actions(KIND, [TYPE = yytype])
-# ----------------------------------------
-# Emit the symbol actions for KIND ("printer" or "destructor").
-# Dispatch on TYPE.
+# b4_symbol_actions(ACTION, [KIND = yykind])
+# ------------------------------------------
+# Emit the symbol actions for ACTION ("destructor" or "printer").
+# Dispatch on KIND.
 m4_define([b4_symbol_actions],
 [m4_pushdef([b4_actions_], m4_expand([b4_symbol_foreach([b4_symbol_$1])]))dnl
 m4_ifval(m4_defn([b4_actions_]),
-[switch (m4_default([$2], [yytype]))
+[switch (m4_default([$2], [yykind]))
     {
 m4_defn([b4_actions_])[]dnl
       default:
         break;
     }dnl
 ],
-[YYUSE (m4_default([$2], [yytype]));])dnl
+[b4_use(m4_default([$2], [yykind]));])dnl
 m4_popdef([b4_actions_])dnl
 ])
 
@@ -487,7 +576,7 @@
 # easier to use with m4_map, but then, use []dnl to suppress the last
 # one.
 m4_define([_b4_symbol_case],
-[case b4_symbol([$1], [number]): b4_symbol_tag_comment([$1])])
+[case b4_symbol([$1], [kind]): b4_symbol_tag_comment([$1])])
 ])
 
 
@@ -507,13 +596,14 @@
 
 # b4_token_visible_if(NUM, IF-TRUE, IF-FALSE)
 # -------------------------------------------
-# Whether NUM denotes a token that has an exported definition (i.e.,
-# shows in enum yytokentype).
+# Whether NUM denotes a token kind that has an exported definition
+# (i.e., shows in enum yytokentype).
 m4_define([b4_token_visible_if],
 [b4_symbol_if([$1], [is_token],
               [b4_symbol_if([$1], [has_id], [$2], [$3])],
               [$3])])
 
+
 # b4_token_has_definition(NUM)
 # ----------------------------
 # 1 if NUM is visible, nothing otherwise.
@@ -530,13 +620,27 @@
 
 # b4_token_format(FORMAT, NUM)
 # ----------------------------
+# If token NUM has a visible ID, format FORMAT with ID, USER_NUMBER.
 m4_define([b4_token_format],
 [b4_token_visible_if([$2],
-[m4_quote(m4_format([$1],
-                     [b4_symbol([$2], [id])],
-                     [b4_symbol([$2], b4_api_token_raw_if([[number]], [[user_number]]))]))])])
+[m4_format([[$1]],
+           b4_symbol([$2], [id]),
+           b4_symbol([$2], b4_api_token_raw_if([[number]], [[code]])))])])
 
 
+# b4_last_enum_token
+# ------------------
+# The code of the last token visible token.
+m4_define([_b4_last_enum_token],
+[b4_token_visible_if([$1],
+   [m4_define([b4_last_enum_token], [$1])])])
+b4_symbol_foreach([_b4_last_enum_token])
+
+# b4_last_symbol
+# --------------
+# The code of the last symbol.
+m4_define([b4_last_symbol], m4_eval(b4_tokens_number + b4_nterms_number - 1))
+
 ## ------- ##
 ## Types.  ##
 ## ------- ##
@@ -558,11 +662,11 @@
 
 ])])
 
-# b4_type_foreach(MACRO)
-# ----------------------
+# b4_type_foreach(MACRO, [SEP])
+# -----------------------------
 # Invoke MACRO(SYMBOL-NUMS) for each set of SYMBOL-NUMS for each type set.
 m4_define([b4_type_foreach],
-          [m4_map([$1], m4_defn([b4_type_names]))])
+          [m4_map_sep([$1], [$2], m4_defn([b4_type_names]))])
 
 
 
@@ -603,7 +707,7 @@
 # This generates dependencies on the Bison skeletons hence lots of
 # useless 'git diff'.  This location is useless for the regular
 # user (who does not care about the skeletons) and is actually not
-# useful for Bison developpers too (I, Akim, never used this to locate
+# useful for Bison developers too (I, Akim, never used this to locate
 # the code in skeletons that generated output).  So disable it
 # completely.  If someone thinks this was actually useful, a %define
 # variable should be provided to control the level of verbosity of
@@ -683,7 +787,7 @@
 [m4_pushdef([b4_occurrence], b4_occurrence)dnl
 m4_pushdef([b4_user_name], m4_car(b4_occurrence))dnl
 m4_pushdef([b4_start], m4_car(m4_shift(b4_occurrence)))dnl
-m4_pushdef([b4_end], m4_shift(m4_shift(b4_occurrence)))dnl
+m4_pushdef([b4_end], m4_shift2(b4_occurrence))dnl
 m4_ifndef($3[(]m4_quote(b4_user_name)[)],
           [b4_complain_at([b4_start], [b4_end],
                           [[%s '%s' is not used]],
@@ -878,15 +982,18 @@
 # For example:
 #
 #   b4_percent_define_default([[foo]], [[default value]])
+m4_define([_b4_percent_define_define],
+[m4_define([b4_percent_define(]$1[)], [$2])dnl
+m4_define([b4_percent_define_kind(]$1[)],
+          [m4_default([$3], [keyword])])dnl
+m4_define([b4_percent_define_loc(]$1[)],
+          [[[[<skeleton default value>:-1.-1]],
+            [[<skeleton default value>:-1.-1]]]])dnl
+m4_define([b4_percent_define_syncline(]$1[)], [[]])])
+
 m4_define([b4_percent_define_default],
 [_b4_percent_define_ifdef([$1], [],
-           [m4_define([b4_percent_define(]$1[)], [$2])dnl
-            m4_define([b4_percent_define_kind(]$1[)],
-                      [m4_default([$3], [keyword])])dnl
-            m4_define([b4_percent_define_loc(]$1[)],
-                      [[[[<skeleton default value>:-1.-1]],
-                        [[<skeleton default value>:-1.-1]]]])dnl
-            m4_define([b4_percent_define_syncline(]$1[)], [[]])])])
+                          [_b4_percent_define_define($@)])])
 
 
 # b4_percent_define_if_define(NAME, [VARIABLE = NAME])
@@ -896,11 +1003,12 @@
 # to '_'.
 m4_define([_b4_percent_define_if_define],
 [m4_define(m4_bpatsubst([b4_$1_if], [[-.]], [_]),
-           [b4_percent_define_flag_if(m4_default([$2], [$1]),
-                                      [$3], [$4])])])
+           [b4_percent_define_default([m4_default([$2], [$1])], [[false]])dnl
+b4_percent_define_flag_if(m4_default([$2], [$1]),
+                                     [$3], [$4])])])
+
 m4_define([b4_percent_define_if_define],
-[b4_percent_define_default([m4_default([$2], [$1])], [[false]])
-_b4_percent_define_if_define([$1], [$2], $[1], $[2])])
+[_b4_percent_define_if_define([$1], [$2], $[1], $[2])])
 
 
 # b4_percent_define_check_kind(VARIABLE, KIND, [DIAGNOSTIC = complain])
@@ -1006,6 +1114,7 @@
 b4_percent_define_if_define([locations])     # Whether locations are tracked.
 b4_percent_define_if_define([parse.assert])
 b4_percent_define_if_define([parse.trace])
+b4_percent_define_if_define([posix])
 
 
 # b4_bison_locations_if([IF-TRUE])
@@ -1016,31 +1125,37 @@
 [b4_locations_if([b4_percent_define_ifdef([[api.location.type]], [], [$1])])])
 
 
-# b4_error_verbose_if([IF-ERRORS-ARE-VERBOSE], [IF-NOT])
+
+# %define parse.error "(custom|detailed|simple|verbose)"
 # ------------------------------------------------------
-# Map %define parse.error "(simple|verbose)" to b4_error_verbose_if and
-# b4_error_verbose_flag.
 b4_percent_define_default([[parse.error]], [[simple]])
 b4_percent_define_check_values([[[[parse.error]],
-                                 [[simple]], [[verbose]]]])
-m4_define([b4_error_verbose_flag],
-          [m4_case(b4_percent_define_get([[parse.error]]),
-                   [simple],  [[0]],
-                   [verbose], [[1]])])
-b4_define_flag_if([error_verbose])
+                                 [[custom]], [[detailed]], [[simple]], [[verbose]]]])
 
-# yytoken_table is needed to support verbose errors.
-b4_error_verbose_if([m4_define([b4_token_table_flag], [1])])
+# b4_parse_error_case(CASE1, THEN1, CASE2, THEN2, ..., ELSE)
+# ----------------------------------------------------------
+m4_define([b4_parse_error_case],
+[m4_case(b4_percent_define_get([[parse.error]]), $@)])
+
+# b4_parse_error_bmatch(PATTERN1, THEN1, PATTERN2, THEN2, ..., ELSE)
+# ------------------------------------------------------------------
+m4_define([b4_parse_error_bmatch],
+[m4_bmatch(b4_percent_define_get([[parse.error]]), $@)])
 
 
+
+# b4_union_if([IF-UNION-ARE-USED], [IF-NOT])
 # b4_variant_if([IF-VARIANT-ARE-USED], [IF-NOT])
 # ----------------------------------------------
-b4_percent_define_if_define([variant])
+# Depend on whether api.value.type is union, or variant.
+m4_define([b4_union_flag],   [[0]])
 m4_define([b4_variant_flag], [[0]])
 b4_percent_define_ifdef([[api.value.type]],
    [m4_case(b4_percent_define_get_kind([[api.value.type]]), [keyword],
-            [m4_case(b4_percent_define_get([[api.value.type]]), [variant],
-                    [m4_define([b4_variant_flag], [[1]])])])])
+            [m4_case(b4_percent_define_get([[api.value.type]]),
+                     [union],   [m4_define([b4_union_flag],   [[1]])],
+                     [variant], [m4_define([b4_variant_flag], [[1]])])])])
+b4_define_flag_if([union])
 b4_define_flag_if([variant])
 
 
@@ -1116,3 +1231,11 @@
 
 # api.value.union.name.
 b4_percent_define_check_kind([api.value.union.name], [keyword])
+
+# parse.error (custom|detailed) >< token-table.
+b4_token_table_if(
+[b4_parse_error_bmatch([custom\|detailed],
+[b4_complain_at(b4_percent_define_get_loc([parse.error]),
+                [['%s' and '%s' cannot be used together]],
+                [%token-table],
+                [%define parse.error (custom|detailed)])])])
diff --git a/data/skeletons/c++-skel.m4 b/data/skeletons/c++-skel.m4
index 1c3721c..f22002b 100644
--- a/data/skeletons/c++-skel.m4
+++ b/data/skeletons/c++-skel.m4
@@ -2,7 +2,7 @@
 
 # C++ skeleton dispatching for Bison.
 
-# Copyright (C) 2006-2007, 2009-2015, 2018-2019 Free Software
+# Copyright (C) 2006-2007, 2009-2015, 2018-2021 Free Software
 # Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -16,7 +16,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 b4_glr_if(             [m4_define([b4_used_skeleton], [b4_skeletonsdir/[glr.cc]])])
 b4_nondeterministic_if([m4_define([b4_used_skeleton], [b4_skeletonsdir/[glr.cc]])])
diff --git a/data/skeletons/c++.m4 b/data/skeletons/c++.m4
index 3e2e4df..2ae8423 100644
--- a/data/skeletons/c++.m4
+++ b/data/skeletons/c++.m4
@@ -2,7 +2,7 @@
 
 # C++ skeleton for Bison
 
-# Copyright (C) 2002-2019 Free Software Foundation, Inc.
+# Copyright (C) 2002-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -15,13 +15,15 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 # Sanity checks, before defaults installed by c.m4.
 b4_percent_define_ifdef([[api.value.union.name]],
   [b4_complain_at(b4_percent_define_get_loc([[api.value.union.name]]),
                   [named %union is invalid in C++])])
 
+b4_percent_define_default([[api.symbol.prefix]], [[S_]])
+
 m4_include(b4_skeletonsdir/[c.m4])
 
 b4_percent_define_check_kind([api.namespace], [code], [deprecated])
@@ -103,11 +105,10 @@
 #
 # b4_percent_define_default([[api.location.type]], [[location]])
 
-b4_percent_define_default([[filename_type]], [[std::string]])
+b4_percent_define_default([[api.filename.type]], [[const std::string]])
 # Make it a warning for those who used betas of Bison 3.0.
 b4_percent_define_default([[api.namespace]], m4_defn([b4_prefix]))
 
-b4_percent_define_default([[global_tokens_and_yystype]], [[false]])
 b4_percent_define_default([[define_location_comparison]],
                           [m4_if(b4_percent_define_get([[filename_type]]),
                                  [std::string], [[true]], [[false]])])
@@ -160,20 +161,42 @@
              [::\([^][:]\|:[^:]\)*], [} ])[} // ]b4_namespace_ref])])
 
 
+## ------------- ##
+## Token kinds.  ##
+## ------------- ##
+
+
 # b4_token_enums
 # --------------
-# Output the definition of the tokens as enums.
+# Output the definition of the token kinds.
 m4_define([b4_token_enums],
-[[enum yytokentype
+[[enum token_kind_type
       {
-        ]m4_join([,
-        ],
-                 b4_symbol_map([b4_token_enum]))[
-      };]dnl
+        ]b4_symbol([-2], [id])[ = -2,
+]b4_symbol_foreach([b4_token_enum])dnl
+[      };]dnl
 ])
 
 
 
+## -------------- ##
+## Symbol kinds.  ##
+## -------------- ##
+
+# b4_declare_symbol_enum
+# ----------------------
+# The definition of the symbol internal numbers as an enum.
+# Defining YYEMPTY here is important: it forces the compiler
+# to use a signed type, which matters for yytoken.
+m4_define([b4_declare_symbol_enum],
+[[enum symbol_kind_type
+      {
+        YYNTOKENS = ]b4_tokens_number[, ///< Number of tokens.
+        ]b4_symbol(empty, kind_base)[ = -2,
+]b4_symbol_foreach([      b4_symbol_enum])dnl
+[      };]])
+
+
 
 ## ----------------- ##
 ## Semantic Values.  ##
@@ -183,16 +206,16 @@
 
 # b4_value_type_declare
 # ---------------------
-# Declare semantic_type.
+# Declare value_type.
 m4_define([b4_value_type_declare],
 [b4_value_type_setup[]dnl
 [    /// Symbol semantic values.
 ]m4_bmatch(b4_percent_define_get_kind([[api.value.type]]),
 [code],
-[[    typedef ]b4_percent_define_get([[api.value.type]])[ semantic_type;]],
+[[    typedef ]b4_percent_define_get([[api.value.type]])[ value_type;]],
 [m4_bmatch(b4_percent_define_get([[api.value.type]]),
 [union\|union-directive],
-[[    union semantic_type
+[[    union value_type
     {
 ]b4_user_union_members[
     };]])])dnl
@@ -204,11 +227,19 @@
 # Define the public types: token, semantic value, location, and so forth.
 # Depending on %define token_lex, may be output in the header or source file.
 m4_define([b4_public_types_declare],
-[[#ifndef ]b4_api_PREFIX[STYPE
-]b4_value_type_declare[
+[b4_glr2_cc_if(
+[b4_value_type_declare],
+[[#ifdef ]b4_api_PREFIX[STYPE
+# ifdef __GNUC__
+#  pragma GCC message "bison: do not #define ]b4_api_PREFIX[STYPE in C++, use %define api.value.type"
+# endif
+    typedef ]b4_api_PREFIX[STYPE value_type;
 #else
-    typedef ]b4_api_PREFIX[STYPE semantic_type;
-#endif]b4_locations_if([
+]b4_value_type_declare[
+#endif
+    /// Backward compatibility (Bison 3.8).
+    typedef value_type semantic_type;
+]])[]b4_locations_if([
     /// Symbol locations.
     typedef b4_percent_define_get([[api.location.type]],
                                   [[location]]) location_type;])[
@@ -231,23 +262,31 @@
       location_type location;])[
     };
 
-    /// Tokens.
+    /// Token kinds.
     struct token
     {
-      ]b4_token_enums[
+      ]b4_token_enums[]b4_glr2_cc_if([], [[
+      /// Backward compatibility alias (Bison 3.6).
+      typedef token_kind_type yytokentype;]])[
     };
 
-    /// (External) token type, as returned by yylex.
-    typedef token::yytokentype token_type;
+    /// Token kind, as returned by yylex.
+    typedef token::token_kind_type token_kind_type;]b4_glr2_cc_if([], [[
 
-    /// Symbol type: an internal symbol number.
-    typedef int symbol_number_type;
+    /// Backward compatibility alias (Bison 3.6).
+    typedef token_kind_type token_type;]])[
 
-    /// The symbol type number to denote an empty symbol.
-    enum { empty_symbol = -2 };
+    /// Symbol kinds.
+    struct symbol_kind
+    {
+      ]b4_declare_symbol_enum[
+    };
 
-    /// Internal symbol number for tokens (subsumed by symbol_number_type).
-    typedef ]b4_int_type_for([b4_translate])[ token_number_type;
+    /// (Internal) symbol kind.
+    typedef symbol_kind::symbol_kind_type symbol_kind_type;
+
+    /// The number of tokens.
+    static const symbol_kind_type YYNTOKENS = symbol_kind::YYNTOKENS;
 ]])
 
 
@@ -258,8 +297,8 @@
 m4_define([b4_symbol_type_define],
 [[    /// A complete symbol.
     ///
-    /// Expects its Base type to provide access to the symbol type
-    /// via type_get ().
+    /// Expects its Base type to provide access to the symbol kind
+    /// via kind ().
     ///
     /// Provide access to semantic value]b4_locations_if([ and location])[.
     template <typename Base>
@@ -269,28 +308,36 @@
       typedef Base super_type;
 
       /// Default constructor.
-      basic_symbol ()
+      basic_symbol () YY_NOEXCEPT
         : value ()]b4_locations_if([
         , location ()])[
       {}
 
 #if 201103L <= YY_CPLUSPLUS
       /// Move constructor.
-      basic_symbol (basic_symbol&& that);
+      basic_symbol (basic_symbol&& that)
+        : Base (std::move (that))
+        , value (]b4_variant_if([], [std::move (that.value)]))b4_locations_if([
+        , location (std::move (that.location))])[
+      {]b4_variant_if([
+        b4_symbol_variant([this->kind ()], [value], [move],
+                          [std::move (that.value)])
+      ])[}
 #endif
 
       /// Copy constructor.
       basic_symbol (const basic_symbol& that);]b4_variant_if([[
 
-      /// Constructor for valueless symbols, and symbols from each type.
-]b4_type_foreach([b4_basic_symbol_constructor_define])], [[
+      /// Constructors for typed symbols.
+]b4_type_foreach([b4_basic_symbol_constructor_define], [
+])], [[
       /// Constructor for valueless symbols.
       basic_symbol (typename Base::kind_type t]b4_locations_if([,
                     YY_MOVE_REF (location_type) l])[);
 
       /// Constructor for symbols with semantic value.
       basic_symbol (typename Base::kind_type t,
-                    YY_RVREF (semantic_type) v]b4_locations_if([,
+                    YY_RVREF (value_type) v]b4_locations_if([,
                     YY_RVREF (location_type) l])[);
 ]])[
       /// Destroy the symbol.
@@ -299,25 +346,75 @@
         clear ();
       }
 
+]b4_glr2_cc_if([[
+      /// Copy assignment.
+      basic_symbol& operator= (const basic_symbol& that)
+      {
+        Base::operator= (that);]b4_variant_if([[
+        ]b4_symbol_variant([this->kind ()], [value], [copy],
+                           [that.value])], [[
+        value = that.value]])[;]b4_locations_if([[
+        location = that.location;]])[
+        return *this;
+      }
+
+      /// Move assignment.
+      basic_symbol& operator= (basic_symbol&& that)
+      {
+        Base::operator= (std::move (that));]b4_variant_if([[
+        ]b4_symbol_variant([this->kind ()], [value], [move],
+                           [std::move (that.value)])], [[
+        value = std::move (that.value)]])[;]b4_locations_if([[
+        location = std::move (that.location);]])[
+        return *this;
+      }
+]])[
+
       /// Destroy contents, and record that is empty.
-      void clear ()
+      void clear () YY_NOEXCEPT
       {]b4_variant_if([[
         // User destructor.
-        symbol_number_type yytype = this->type_get ();
+        symbol_kind_type yykind = this->kind ();
         basic_symbol<Base>& yysym = *this;
         (void) yysym;
-        switch (yytype)
+        switch (yykind)
         {
 ]b4_symbol_foreach([b4_symbol_destructor])dnl
 [       default:
           break;
         }
 
-        // Type destructor.
-]b4_symbol_variant([[yytype]], [[value]], [[template destroy]])])[
+        // Value type destructor.
+]b4_symbol_variant([[yykind]], [[value]], [[template destroy]])])[
         Base::clear ();
       }
 
+]b4_parse_error_bmatch(
+[custom\|detailed],
+[[      /// The user-facing name of this symbol.
+      const char *name () const YY_NOEXCEPT
+      {
+        return ]b4_parser_class[::symbol_name (this->kind ());
+      }]],
+[simple],
+[[#if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
+      /// The user-facing name of this symbol.
+      const char *name () const YY_NOEXCEPT
+      {
+        return ]b4_parser_class[::symbol_name (this->kind ());
+      }
+#endif // #if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
+]],
+[verbose],
+[[      /// The user-facing name of this symbol.
+      std::string name () const YY_NOEXCEPT
+      {
+        return ]b4_parser_class[::symbol_name (this->kind ());
+      }]])[]b4_glr2_cc_if([], [[
+
+      /// Backward compatibility (Bison 3.6).
+      symbol_kind_type type_get () const YY_NOEXCEPT;]])[
+
       /// Whether empty.
       bool empty () const YY_NOEXCEPT;
 
@@ -325,7 +422,7 @@
       void move (basic_symbol& s);
 
       /// The semantic value.
-      semantic_type value;]b4_locations_if([
+      value_type value;]b4_locations_if([
 
       /// The location.
       location_type location;])[
@@ -338,52 +435,65 @@
     };
 
     /// Type access provider for token (enum) based symbols.
-    struct by_type
+    struct by_kind
     {
+      /// The symbol kind as needed by the constructor.
+      typedef token_kind_type kind_type;
+
       /// Default constructor.
-      by_type ();
+      by_kind () YY_NOEXCEPT;
 
 #if 201103L <= YY_CPLUSPLUS
       /// Move constructor.
-      by_type (by_type&& that);
+      by_kind (by_kind&& that) YY_NOEXCEPT;
 #endif
 
       /// Copy constructor.
-      by_type (const by_type& that);
-
-      /// The symbol type as needed by the constructor.
-      typedef token_type kind_type;
+      by_kind (const by_kind& that) YY_NOEXCEPT;
 
       /// Constructor from (external) token numbers.
-      by_type (kind_type t);
+      by_kind (kind_type t) YY_NOEXCEPT;
+
+]b4_glr2_cc_if([[
+      /// Copy assignment.
+      by_kind& operator= (const by_kind& that);
+
+      /// Move assignment.
+      by_kind& operator= (by_kind&& that);
+]])[
 
       /// Record that this symbol is empty.
-      void clear ();
+      void clear () YY_NOEXCEPT;
 
-      /// Steal the symbol type from \a that.
-      void move (by_type& that);
+      /// Steal the symbol kind from \a that.
+      void move (by_kind& that);
 
       /// The (internal) type number (corresponding to \a type).
       /// \a empty when empty.
-      symbol_number_type type_get () const YY_NOEXCEPT;
+      symbol_kind_type kind () const YY_NOEXCEPT;]b4_glr2_cc_if([], [[
 
-      /// The symbol type.
-      /// \a empty_symbol when empty.
-      /// An int, not token_number_type, to be able to store empty_symbol.
-      int type;
-    };
+      /// Backward compatibility (Bison 3.6).
+      symbol_kind_type type_get () const YY_NOEXCEPT;]])[
+
+      /// The symbol kind.
+      /// \a ]b4_symbol_prefix[YYEMPTY when empty.
+      symbol_kind_type kind_;
+    };]b4_glr2_cc_if([], [[
+
+    /// Backward compatibility for a private implementation detail (Bison 3.6).
+    typedef by_kind by_type;]])[
 
     /// "External" symbols: returned by the scanner.
-    struct symbol_type : basic_symbol<by_type>
+    struct symbol_type : basic_symbol<by_kind>
     {]b4_variant_if([[
       /// Superclass.
-      typedef basic_symbol<by_type> super_type;
+      typedef basic_symbol<by_kind> super_type;
 
       /// Empty symbol.
-      symbol_type () {}
+      symbol_type () YY_NOEXCEPT {}
 
       /// Constructor for valueless symbols, and symbols from each type.
-]b4_type_foreach([_b4_token_constructor_define])dnl
+]b4_type_foreach([_b4_symbol_constructor_define])dnl
     ])[};
 ]])
 
@@ -393,25 +503,13 @@
 # Provide the implementation needed by the public types.
 m4_define([b4_public_types_define],
 [[  // basic_symbol.
-#if 201103L <= YY_CPLUSPLUS
-  template <typename Base>
-  ]b4_parser_class[::basic_symbol<Base>::basic_symbol (basic_symbol&& that)
-    : Base (std::move (that))
-    , value (]b4_variant_if([], [std::move (that.value)]))b4_locations_if([
-    , location (std::move (that.location))])[
-  {]b4_variant_if([
-    b4_symbol_variant([this->type_get ()], [value], [move],
-                      [std::move (that.value)])
-  ])[}
-#endif
-
   template <typename Base>
   ]b4_parser_class[::basic_symbol<Base>::basic_symbol (const basic_symbol& that)
     : Base (that)
     , value (]b4_variant_if([], [that.value]))b4_locations_if([
     , location (that.location)])[
   {]b4_variant_if([
-    b4_symbol_variant([this->type_get ()], [value], [copy],
+    b4_symbol_variant([this->kind ()], [value], [copy],
                       [YY_MOVE (that.value)])
   ])[}
 
@@ -429,20 +527,29 @@
   template <typename Base>
   ]b4_parser_class[::basic_symbol<Base>::basic_symbol (]b4_join(
           [typename Base::kind_type t],
-          [YY_RVREF (semantic_type) v],
+          [YY_RVREF (value_type) v],
           b4_locations_if([YY_RVREF (location_type) l]))[)
     : Base (t)
     , value (]b4_variant_if([], [YY_MOVE (v)])[)]b4_locations_if([
     , location (YY_MOVE (l))])[
   {]b4_variant_if([[
     (void) v;
-    ]b4_symbol_variant([this->type_get ()], [value], [YY_MOVE_OR_COPY], [YY_MOVE (v)])])[}]])[
+    ]b4_symbol_variant([this->kind ()], [value], [YY_MOVE_OR_COPY], [YY_MOVE (v)])])[}]])[
+
+]b4_glr2_cc_if([], [[
+  template <typename Base>
+  ]b4_parser_class[::symbol_kind_type
+  ]b4_parser_class[::basic_symbol<Base>::type_get () const YY_NOEXCEPT
+  {
+    return this->kind ();
+  }
+]])[
 
   template <typename Base>
   bool
   ]b4_parser_class[::basic_symbol<Base>::empty () const YY_NOEXCEPT
   {
-    return Base::type_get () == empty_symbol;
+    return this->kind () == ]b4_symbol(empty, kind)[;
   }
 
   template <typename Base>
@@ -450,57 +557,82 @@
   ]b4_parser_class[::basic_symbol<Base>::move (basic_symbol& s)
   {
     super_type::move (s);
-    ]b4_variant_if([b4_symbol_variant([this->type_get ()], [value], [move],
+    ]b4_variant_if([b4_symbol_variant([this->kind ()], [value], [move],
                                       [YY_MOVE (s.value)])],
                    [value = YY_MOVE (s.value);])[]b4_locations_if([
     location = YY_MOVE (s.location);])[
   }
 
-  // by_type.
-  ]b4_inline([$1])b4_parser_class[::by_type::by_type ()
-    : type (empty_symbol)
+  // by_kind.
+  ]b4_inline([$1])b4_parser_class[::by_kind::by_kind () YY_NOEXCEPT
+    : kind_ (]b4_symbol(empty, kind)[)
   {}
 
 #if 201103L <= YY_CPLUSPLUS
-  ]b4_inline([$1])b4_parser_class[::by_type::by_type (by_type&& that)
-    : type (that.type)
+  ]b4_inline([$1])b4_parser_class[::by_kind::by_kind (by_kind&& that) YY_NOEXCEPT
+    : kind_ (that.kind_)
   {
     that.clear ();
   }
 #endif
 
-  ]b4_inline([$1])b4_parser_class[::by_type::by_type (const by_type& that)
-    : type (that.type)
+  ]b4_inline([$1])b4_parser_class[::by_kind::by_kind (const by_kind& that) YY_NOEXCEPT
+    : kind_ (that.kind_)
   {}
 
-  ]b4_inline([$1])b4_parser_class[::by_type::by_type (token_type t)
-    : type (yytranslate_ (t))
+  ]b4_inline([$1])b4_parser_class[::by_kind::by_kind (token_kind_type t) YY_NOEXCEPT
+    : kind_ (yytranslate_ (t))
   {}
 
+]b4_glr2_cc_if([[
+  ]b4_inline([$1])]b4_parser_class[::by_kind&
+  b4_parser_class[::by_kind::by_kind::operator= (const by_kind& that)
+  {
+    kind_ = that.kind_;
+    return *this;
+  }
+
+  ]b4_inline([$1])]b4_parser_class[::by_kind&
+  b4_parser_class[::by_kind::by_kind::operator= (by_kind&& that)
+  {
+    kind_ = that.kind_;
+    that.clear ();
+    return *this;
+  }
+]])[
+
   ]b4_inline([$1])[void
-  ]b4_parser_class[::by_type::clear ()
+  ]b4_parser_class[::by_kind::clear () YY_NOEXCEPT
   {
-    type = empty_symbol;
+    kind_ = ]b4_symbol(empty, kind)[;
   }
 
   ]b4_inline([$1])[void
-  ]b4_parser_class[::by_type::move (by_type& that)
+  ]b4_parser_class[::by_kind::move (by_kind& that)
   {
-    type = that.type;
+    kind_ = that.kind_;
     that.clear ();
   }
 
-  ]b4_inline([$1])[int
-  ]b4_parser_class[::by_type::type_get () const YY_NOEXCEPT
+  ]b4_inline([$1])[]b4_parser_class[::symbol_kind_type
+  ]b4_parser_class[::by_kind::kind () const YY_NOEXCEPT
   {
-    return type;
+    return kind_;
   }
+
+]b4_glr2_cc_if([], [[
+  ]b4_inline([$1])[]b4_parser_class[::symbol_kind_type
+  ]b4_parser_class[::by_kind::type_get () const YY_NOEXCEPT
+  {
+    return this->kind ();
+  }
+]])[
 ]])
 
 
 # b4_token_constructor_define
 # ----------------------------
-# Define symbol constructors for all the value types.
+# Define make_FOO for all the token kinds.
 # Use at class-level.  Redefined in variant.hh.
 m4_define([b4_token_constructor_define], [])
 
@@ -510,27 +642,28 @@
 # Define yytranslate_.  Sometimes used in the header file ($1=hh),
 # sometimes in the cc file.
 m4_define([b4_yytranslate_define],
-[  b4_inline([$1])b4_parser_class[::token_number_type
-  ]b4_parser_class[::yytranslate_ (int t)
+[  b4_inline([$1])b4_parser_class[::symbol_kind_type
+  ]b4_parser_class[::yytranslate_ (int t) YY_NOEXCEPT
   {
 ]b4_api_token_raw_if(
-[[    return static_cast<token_number_type> (t);]],
+[[    return static_cast<symbol_kind_type> (t);]],
 [[    // YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to
     // TOKEN-NUM as returned by yylex.
     static
-    const token_number_type
+    const ]b4_int_type_for([b4_translate])[
     translate_table[] =
     {
   ]b4_translate[
     };
-    const int user_token_number_max_ = ]b4_user_token_number_max[;
+    // Last valid token kind.
+    const int code_max = ]b4_code_max[;
 
     if (t <= 0)
-      return yyeof_;
-    else if (t <= user_token_number_max_)
-      return translate_table[t];
+      return symbol_kind::]b4_symbol_prefix[YYEOF;
+    else if (t <= code_max)
+      return static_cast <symbol_kind_type> (translate_table[t]);
     else
-      return yy_undef_token_;]])[
+      return symbol_kind::]b4_symbol_prefix[YYUNDEF;]])[
   }
 ]])
 
diff --git a/data/skeletons/c-like.m4 b/data/skeletons/c-like.m4
index 8d891b6..a9bbc2e 100644
--- a/data/skeletons/c-like.m4
+++ b/data/skeletons/c-like.m4
@@ -2,7 +2,7 @@
 
 # Common code for C-like languages (C, C++, Java, etc.)
 
-# Copyright (C) 2012-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2012-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -15,17 +15,23 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
 
 # _b4_comment(TEXT, OPEN, CONTINUE, END)
 # --------------------------------------
 # Put TEXT in comment.  Avoid trailing spaces: don't indent empty lines.
 # Avoid adding indentation to the first line, as the indentation comes
 # from OPEN.  That's why we don't patsubst([$1], [^\(.\)], [   \1]).
+# Turn "*/" in TEXT into "* /" so that we don't unexpectedly close
+# the comments before its end.
 #
 # Prefix all the output lines with PREFIX.
 m4_define([_b4_comment],
-[$2[]m4_bpatsubst(m4_expand([[$1]]), [
+[$2[]b4_gsub(m4_expand([$1]),
+            [[*]/], [*\\/],
+            [/[*]], [/\\*],
+            [
 \(.\)], [
 $3\1])$4])
 
diff --git a/data/skeletons/c-skel.m4 b/data/skeletons/c-skel.m4
index 2a21cfc..ac6ddd6 100644
--- a/data/skeletons/c-skel.m4
+++ b/data/skeletons/c-skel.m4
@@ -2,7 +2,7 @@
 
 # C skeleton dispatching for Bison.
 
-# Copyright (C) 2006-2007, 2009-2015, 2018-2019 Free Software
+# Copyright (C) 2006-2007, 2009-2015, 2018-2021 Free Software
 # Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -16,7 +16,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 b4_glr_if(             [m4_define([b4_used_skeleton], [b4_skeletonsdir/[glr.c]])])
 b4_nondeterministic_if([m4_define([b4_used_skeleton], [b4_skeletonsdir/[glr.c]])])
diff --git a/data/skeletons/c.m4 b/data/skeletons/c.m4
index 4b2c094..2425b07 100644
--- a/data/skeletons/c.m4
+++ b/data/skeletons/c.m4
@@ -2,7 +2,7 @@
 
 # C M4 Macros for Bison.
 
-# Copyright (C) 2002, 2004-2015, 2018-2019 Free Software Foundation,
+# Copyright (C) 2002, 2004-2015, 2018-2021 Free Software Foundation,
 # Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -16,7 +16,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 m4_include(b4_skeletonsdir/[c-like.m4])
 
@@ -58,11 +58,11 @@
 # b4_pull_flag if they use the values of the %define variables api.pure or
 # api.push-pull.
 m4_define([b4_identification],
-[[/* Identify Bison output.  */
-#define YYBISON 1
+[[/* Identify Bison output, and Bison version.  */
+#define YYBISON ]b4_version[
 
-/* Bison version.  */
-#define YYBISON_VERSION "]b4_version["
+/* Bison version string.  */
+#define YYBISON_VERSION "]b4_version_string["
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME ]b4_skeleton[]m4_ifdef([b4_pure_flag], [[
@@ -101,32 +101,45 @@
 b4_percent_define_default([[api.value.union.name]],
                           [b4_api_PREFIX[][STYPE]])
 
+b4_percent_define_default([[api.symbol.prefix]], [[YYSYMBOL_]])
 
 ## ------------------------ ##
 ## Pure/impure interfaces.  ##
 ## ------------------------ ##
 
-# b4_lex_formals
-# --------------
+# b4_yylex_formals
+# ----------------
 # All the yylex formal arguments.
 # b4_lex_param arrives quoted twice, but we want to keep only one level.
-m4_define([b4_lex_formals],
-[b4_pure_if([[[[YYSTYPE *yylvalp]], [[&yylval]]][]dnl
-b4_locations_if([, [[YYLTYPE *yyllocp], [&yylloc]]])])dnl
+m4_define([b4_yylex_formals],
+[b4_pure_if([[[b4_api_PREFIX[STYPE *yylvalp]], [[&yylval]]][]dnl
+b4_locations_if([, [b4_api_PREFIX[LTYPE *yyllocp], [&yylloc]]])])dnl
 m4_ifdef([b4_lex_param], [, ]b4_lex_param)])
 
 
-# b4_lex
-# ------
+# b4_yylex
+# --------
 # Call yylex.
-m4_define([b4_lex],
-[b4_function_call([yylex], [int], b4_lex_formals)])
+m4_define([b4_yylex],
+[b4_function_call([yylex], [int], b4_yylex_formals)])
 
 
 # b4_user_args
 # ------------
 m4_define([b4_user_args],
-[m4_ifset([b4_parse_param], [, b4_args(b4_parse_param)])])
+[m4_ifset([b4_parse_param], [, b4_user_args_no_comma])])
+
+# b4_user_args_no_comma
+# ---------------------
+m4_define([b4_user_args_no_comma],
+[m4_ifset([b4_parse_param], [b4_args(b4_parse_param)])])
+
+
+# b4_user_formals
+# ---------------
+# The possible parse-params formal arguments preceded by a comma.
+m4_define([b4_user_formals],
+[m4_ifset([b4_parse_param], [, b4_formals(b4_parse_param)])])
 
 
 # b4_parse_param
@@ -150,13 +163,20 @@
 m4_popdef([$1])dnl
 ])])
 
+
+# b4_use(EXPR)
+# ------------
+# Pacify the compiler about some maybe unused value.
+m4_define([b4_use],
+[YY_USE ($1)])
+
 # b4_parse_param_use([VAL], [LOC])
 # --------------------------------
-# 'YYUSE' VAL, LOC if locations are enabled, and all the parse-params.
+# 'YY_USE' VAL, LOC if locations are enabled, and all the parse-params.
 m4_define([b4_parse_param_use],
-[m4_ifvaln([$1], [  YYUSE ([$1]);])dnl
-b4_locations_if([m4_ifvaln([$2], [  YYUSE ([$2]);])])dnl
-b4_parse_param_for([Decl], [Formal], [  YYUSE (Formal);
+[m4_ifvaln([$1], [  b4_use([$1]);])dnl
+b4_locations_if([m4_ifvaln([$2], [  b4_use([$2]);])])dnl
+b4_parse_param_for([Decl], [Formal], [  b4_use(Formal);
 ])dnl
 ])
 
@@ -197,7 +217,11 @@
 # Define private types suitable for holding small integers in C99 or later.
 m4_define([b4_c99_int_type_define],
 [m4_copy_force([b4_c99_int_type], [b4_int_type])dnl
-[/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
+[#ifdef short
+# undef short
+#endif
+
+/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
    <limits.h> and (if available) <stdint.h> are included
    so that the code can choose integer types of a good width.  */
 
@@ -230,6 +254,18 @@
 typedef short yytype_int16;
 #endif
 
+/* Work around bug in HP-UX 11.23, which defines these macros
+   incorrectly for preprocessor constants.  This workaround can likely
+   be removed in 2023, as HPE has promised support for HP-UX 11.23
+   (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
+   <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>.  */
+#ifdef __hpux
+# undef UINT_LEAST8_MAX
+# undef UINT_LEAST16_MAX
+# define UINT_LEAST8_MAX 255
+# define UINT_LEAST16_MAX 65535
+#endif
+
 #if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
 typedef __UINT_LEAST8_TYPE__ yytype_uint8;
 #elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
@@ -253,6 +289,50 @@
 #endif]])
 
 
+# b4_sizes_types_define
+# ---------------------
+# Define YYPTRDIFF_T/YYPTRDIFF_MAXIMUM, YYSIZE_T/YYSIZE_MAXIMUM,
+# and YYSIZEOF.
+m4_define([b4_sizes_types_define],
+[[#ifndef YYPTRDIFF_T
+# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
+#  define YYPTRDIFF_T __PTRDIFF_TYPE__
+#  define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
+# elif defined PTRDIFF_MAX
+#  ifndef ptrdiff_t
+#   include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  endif
+#  define YYPTRDIFF_T ptrdiff_t
+#  define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
+# else
+#  define YYPTRDIFF_T long
+#  define YYPTRDIFF_MAXIMUM LONG_MAX
+# endif
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+#  define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+#  define YYSIZE_T size_t
+# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# else
+#  define YYSIZE_T unsigned
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM                                  \
+  YY_CAST (YYPTRDIFF_T,                                 \
+           (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1)  \
+            ? YYPTRDIFF_MAXIMUM                         \
+            : YY_CAST (YYSIZE_T, -1)))
+
+#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
+]])
+
+
 # b4_int_type_for(NAME)
 # ---------------------
 # Return a narrow int type able to handle numbers ranging from
@@ -299,17 +379,27 @@
 #endif
 
 ]m4_bmatch([$1], [\bnoreturn\b], [[/* The _Noreturn keyword of C11.  */
-]dnl This is an exact copy of lib/_Noreturn.h.
+]dnl This is close to lib/_Noreturn.h, except that we do enable
+dnl the use of [[noreturn]], because _Noreturn is used in places
+dnl where [[noreturn]] works in C++.  We need this in particular
+dnl because of glr.cc which compiles code from glr.c in C++.
+dnl And the C++ compiler chokes on _Noreturn.  Also, we do not
+dnl use C' _Noreturn in C++, to avoid -Wc11-extensions warnings.
 [#ifndef _Noreturn
 # if (defined __cplusplus \
       && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
           || (defined _MSC_VER && 1900 <= _MSC_VER)))
 #  define _Noreturn [[noreturn]]
 # elif ((!defined __cplusplus || defined __clang__) \
-        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)  \
-            || 4 < __GNUC__ + (7 <= __GNUC_MINOR__)))
+        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
+            || (!defined __STRICT_ANSI__ \
+                && (4 < __GNUC__ + (7 <= __GNUC_MINOR__) \
+                    || (defined __apple_build_version__ \
+                        ? 6000000 <= __apple_build_version__ \
+                        : 3 < __clang_major__ + (5 <= __clang_minor__))))))
    /* _Noreturn works as-is.  */
-# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
+# elif (2 < __GNUC__ + (8 <= __GNUC_MINOR__) || defined __clang__ \
+        || 0x5110 <= __SUNPRO_C)
 #  define _Noreturn __attribute__ ((__noreturn__))
 # elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
 #  define _Noreturn __declspec (noreturn)
@@ -320,17 +410,23 @@
 
 ]])[/* Suppress unused-variable warnings by "using" E.  */
 #if ! defined lint || defined __GNUC__
-# define YYUSE(E) ((void) (E))
+# define YY_USE(E) ((void) (E))
 #else
-# define YYUSE(E) /* empty */
+# define YY_USE(E) /* empty */
 #endif
 
-#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
 /* Suppress an incorrect diagnostic about yylval being uninitialized.  */
-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN                            \
+#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__
+# if __GNUC__ * 100 + __GNUC_MINOR__ < 407
+#  define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN                           \
+    _Pragma ("GCC diagnostic push")                                     \
+    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")
+# else
+#  define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN                           \
     _Pragma ("GCC diagnostic push")                                     \
     _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")              \
     _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# endif
 # define YY_IGNORE_MAYBE_UNINITIALIZED_END      \
     _Pragma ("GCC diagnostic pop")
 #else
@@ -410,7 +506,7 @@
 # -------------------------------------------------------------
 # Define "yy<TABLE-NAME>" whose contents is CONTENT.
 m4_define([b4_integral_parser_table_define],
-[m4_ifvaln([$3], [b4_comment([$3], [  ])])dnl
+[m4_ifvaln([$3], [b4_comment([$3])])dnl
 static const b4_int_type_for([$2]) yy$1[[]] =
 {
   $2
@@ -418,9 +514,22 @@
 ])
 
 
-## ------------------------- ##
-## Assigning token numbers.  ##
-## ------------------------- ##
+## ------------- ##
+## Token kinds.  ##
+## ------------- ##
+
+# Because C enums are not scoped, because tokens are exposed in the
+# header, and because these tokens are common to all the parsers, we
+# need to make sure their names don't collide: use the api.prefix.
+# YYEOF is special, since the user may give it a different name.
+m4_define([b4_symbol(-2, id)],  [b4_api_PREFIX[][EMPTY]])
+m4_define([b4_symbol(-2, tag)], [[No symbol.]])
+
+m4_if(b4_symbol(eof, id), [YYEOF],
+     [m4_define([b4_symbol(0, id)],  [b4_api_PREFIX[][EOF]])])
+m4_define([b4_symbol(1, id)],  [b4_api_PREFIX[][error]])
+m4_define([b4_symbol(2, id)],  [b4_api_PREFIX[][UNDEF]])
+
 
 # b4_token_define(TOKEN-NUM)
 # --------------------------
@@ -432,44 +541,92 @@
 # ----------------
 # Output the definition of the tokens.
 m4_define([b4_token_defines],
-[b4_any_token_visible_if([/* Tokens.  */
-m4_join([
+[[/* Token kinds.  */
+#define ]b4_symbol(empty, [id])[ -2
+]m4_join([
 ], b4_symbol_map([b4_token_define]))
-])])
+])
 
 
 # b4_token_enum(TOKEN-NUM)
 # ------------------------
 # Output the definition of this token as an enum.
 m4_define([b4_token_enum],
-[b4_token_format([%s = %s], [$1])])
+[b4_token_visible_if([$1],
+    [m4_format([    %-30s %s],
+               m4_format([[%s = %s%s%s]],
+                         b4_symbol([$1], [id]),
+                         b4_symbol([$1], b4_api_token_raw_if([[number]], [[code]])),
+                         m4_if([$1], b4_last_enum_token, [], [[,]])),
+               [b4_symbol_tag_comment([$1])])])])
 
 
 # b4_token_enums
 # --------------
-# Output the definition of the tokens (if there are) as enums.
+# The definition of the token kinds.
 m4_define([b4_token_enums],
-[b4_any_token_visible_if([[/* Token type.  */
+[b4_any_token_visible_if([[/* Token kinds.  */
 #ifndef ]b4_api_PREFIX[TOKENTYPE
 # define ]b4_api_PREFIX[TOKENTYPE
   enum ]b4_api_prefix[tokentype
   {
-    ]m4_join([,
-    ],
-             b4_symbol_map([b4_token_enum]))[
-  };
+    ]b4_symbol(empty, [id])[ = -2,
+]b4_symbol_foreach([b4_token_enum])dnl
+[  };
+  typedef enum ]b4_api_prefix[tokentype ]b4_api_prefix[token_kind_t;
 #endif
 ]])])
 
 
 # b4_token_enums_defines
 # ----------------------
-# Output the definition of the tokens (if there are any) as enums and,
+# The definition of the tokens (if there are any) as enums and,
 # if POSIX Yacc is enabled, as #defines.
 m4_define([b4_token_enums_defines],
 [b4_token_enums[]b4_yacc_if([b4_token_defines])])
 
 
+# b4_symbol_translate(STRING)
+# ---------------------------
+# Used by "bison" in the array of symbol names to mark those that
+# require translation.
+m4_define([b4_symbol_translate],
+[[N_($1)]])
+
+
+
+## -------------- ##
+## Symbol kinds.  ##
+## -------------- ##
+
+# b4_symbol_enum(SYMBOL-NUM)
+# --------------------------
+# Output the definition of this symbol as an enum.
+m4_define([b4_symbol_enum],
+[m4_format([  %-40s %s],
+           m4_format([[%s = %s%s%s]],
+                     b4_symbol([$1], [kind_base]),
+                     [$1],
+                     m4_if([$1], b4_last_symbol, [], [[,]])),
+           [b4_symbol_tag_comment([$1])])])
+
+
+# b4_declare_symbol_enum
+# ----------------------
+# The definition of the symbol internal numbers as an enum.
+# Defining YYEMPTY here is important: it forces the compiler
+# to use a signed type, which matters for yytoken.
+m4_define([b4_declare_symbol_enum],
+[[/* Symbol kind.  */
+enum yysymbol_kind_t
+{
+  ]b4_symbol(empty, [kind_base])[ = -2,
+]b4_symbol_foreach([b4_symbol_enum])dnl
+[};
+typedef enum yysymbol_kind_t yysymbol_kind_t;
+]])])
+
+
 ## ----------------- ##
 ## Semantic Values.  ##
 ## ----------------- ##
@@ -493,15 +650,6 @@
 ## ---------------------- ##
 
 
-# b4_function_define(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
-# -----------------------------------------------------------
-# Declare the function NAME in C.
-m4_define([b4_function_define],
-[$2
-$1 (b4_formals(m4_shift2($@)))[]dnl
-])
-
-
 # b4_formals([DECL1, NAME1], ...)
 # -------------------------------
 # The formal arguments of a C function definition.
@@ -514,12 +662,6 @@
 [$1])
 
 
-
-## ----------------------- ##
-## Declaring C functions.  ##
-## ----------------------- ##
-
-
 # b4_function_declare(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 # ------------------------------------------------------------
 # Declare the function NAME.
@@ -529,7 +671,6 @@
 
 
 
-
 ## --------------------- ##
 ## Calling C functions.  ##
 ## --------------------- ##
@@ -566,10 +707,10 @@
 ## User actions.  ##
 ## -------------- ##
 
-# b4_case(LABEL, STATEMENTS)
-# --------------------------
+# b4_case(LABEL, STATEMENTS, [COMMENTS])
+# --------------------------------------
 m4_define([b4_case],
-[  case $1:
+[  case $1:m4_ifval([$3], [ b4_comment([$3])])
 $2
 b4_syncline([@oline@], [@ofile@])dnl
     break;])
@@ -593,18 +734,15 @@
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
-]b4_function_define([yydestruct],
-    [static void],
-    [[const char *yymsg],    [yymsg]],
-    [[int yytype],           [yytype]],
-    [[YYSTYPE *yyvaluep],    [yyvaluep]][]dnl
-b4_locations_if(            [, [[YYLTYPE *yylocationp], [yylocationp]]])[]dnl
-m4_ifset([b4_parse_param], [, b4_parse_param]))[
+static void
+yydestruct (const char *yymsg,
+            yysymbol_kind_t yykind, YYSTYPE *yyvaluep]b4_locations_if(dnl
+[[, YYLTYPE *yylocationp]])[]b4_user_formals[)
 {
 ]b4_parse_param_use([yyvaluep], [yylocationp])dnl
 [  if (!yymsg)
     yymsg = "Deleting";
-  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+  YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
 
   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   ]b4_symbol_actions([destructor])[
@@ -622,25 +760,15 @@
 | Print this symbol's value on YYO.  |
 `-----------------------------------*/
 
-]b4_function_define([yy_symbol_value_print],
-    [static void],
-               [[FILE *yyo],                            [yyo]],
-               [[int yytype],                           [yytype]],
-               [[YYSTYPE const * const yyvaluep],       [yyvaluep]][]dnl
-b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
-m4_ifset([b4_parse_param], [, b4_parse_param]))[
+static void
+yy_symbol_value_print (FILE *yyo,
+                       yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep]b4_locations_if(dnl
+[[, YYLTYPE const * const yylocationp]])[]b4_user_formals[)
 {
   FILE *yyoutput = yyo;
 ]b4_parse_param_use([yyoutput], [yylocationp])dnl
 [  if (!yyvaluep)
     return;]
-dnl glr.c does not feature yytoknum.
-m4_if(b4_skeleton, ["yacc.c"],
-[[# ifdef YYPRINT
-  if (yytype < YYNTOKENS)
-    YYPRINT (yyo, yytoknum[yytype], *yyvaluep);
-# endif
-]])dnl
 b4_percent_code_get([[pre-printer]])dnl
   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   b4_symbol_actions([printer])
@@ -653,21 +781,18 @@
 | Print this symbol on YYO.  |
 `---------------------------*/
 
-]b4_function_define([yy_symbol_print],
-    [static void],
-               [[FILE *yyo],                            [yyo]],
-               [[int yytype],                           [yytype]],
-               [[YYSTYPE const * const yyvaluep],       [yyvaluep]][]dnl
-b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
-m4_ifset([b4_parse_param], [, b4_parse_param]))[
+static void
+yy_symbol_print (FILE *yyo,
+                 yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep]b4_locations_if(dnl
+[[, YYLTYPE const * const yylocationp]])[]b4_user_formals[)
 {
   YYFPRINTF (yyo, "%s %s (",
-             yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
+             yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
 
-]b4_locations_if([  YY_LOCATION_PRINT (yyo, *yylocationp);
+]b4_locations_if([  YYLOCATION_PRINT (yyo, yylocationp);
   YYFPRINTF (yyo, ": ");
 ])dnl
-[  yy_symbol_value_print (yyo, yytype, yyvaluep]dnl
+[  yy_symbol_value_print (yyo, yykind, yyvaluep]dnl
 b4_locations_if([, yylocationp])[]b4_user_args[);
   YYFPRINTF (yyo, ")");
 }]dnl
@@ -693,11 +818,11 @@
 [m4_define([b4_symbol($1, type_tag)],
            [b4_symbol_if([$1], [has_id],
                          [b4_symbol([$1], [id])],
-                         [yytype_[]b4_symbol([$1], [number])])])dnl
+                         [yykind_[]b4_symbol([$1], [number])])])dnl
 m4_append([b4_union_members],
-m4_expand([
-  b4_symbol_tag_comment([$1])dnl
-  b4_symbol([$1], [type]) b4_symbol([$1], [type_tag]);]))
+m4_expand([m4_format([  %-40s %s],
+                     m4_expand([b4_symbol([$1], [type]) b4_symbol([$1], [type_tag]);]),
+                     [b4_symbol_tag_comment([$1])])]))
 ])
 
 
@@ -851,7 +976,7 @@
 
 # b4_declare_yylstype
 # -------------------
-# Declarations that might either go into the header (if --defines) or
+# Declarations that might either go into the header (if --header) or
 # in the parser body.  Declare YYSTYPE/YYLTYPE, and yylval/yylloc.
 m4_define([b4_declare_yylstype],
 [b4_value_type_define[]b4_locations_if([
@@ -921,25 +1046,30 @@
 #endif
 ]])
 
-# b4_yy_location_print_define
-# ---------------------------
-# Define YY_LOCATION_PRINT.
-m4_define([b4_yy_location_print_define],
+# b4_yylocation_print_define
+# --------------------------
+# Define YYLOCATION_PRINT.
+m4_define([b4_yylocation_print_define],
 [b4_locations_if([[
-/* YY_LOCATION_PRINT -- Print the location on the stream.
+/* YYLOCATION_PRINT -- Print the location on the stream.
    This macro was not mandated originally: define only if we know
    we won't break user code: when these are the locations we know.  */
 
-#ifndef YY_LOCATION_PRINT
-# if defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL
+# ifndef YYLOCATION_PRINT
+
+#  if defined YY_LOCATION_PRINT
+
+   /* Temporary convenience wrapper in case some people defined the
+      undocumented and private YY_LOCATION_PRINT macros.  */
+#   define YYLOCATION_PRINT(File, Loc)  YY_LOCATION_PRINT(File, *(Loc))
+
+#  elif defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL
 
 /* Print *YYLOCP on YYO.  Private, do not rely on its existence. */
 
 YY_ATTRIBUTE_UNUSED
-]b4_function_define([yy_location_print_],
-    [static int],
-               [[FILE *yyo],                    [yyo]],
-               [[YYLTYPE const * const yylocp], [yylocp]])[
+static int
+yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp)
 {
   int res = 0;
   int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0;
@@ -961,19 +1091,23 @@
         res += YYFPRINTF (yyo, "-%d", end_col);
     }
   return res;
- }
+}
 
-#  define YY_LOCATION_PRINT(File, Loc)          \
-  yy_location_print_ (File, &(Loc))
+#   define YYLOCATION_PRINT  yy_location_print_
 
-# else
-#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-# endif
-#endif]],
-[[/* This macro is provided for backward compatibility. */
-#ifndef YY_LOCATION_PRINT
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-#endif]])
+    /* Temporary convenience wrapper in case some people defined the
+       undocumented and private YY_LOCATION_PRINT macros.  */
+#   define YY_LOCATION_PRINT(File, Loc)  YYLOCATION_PRINT(File, &(Loc))
+
+#  else
+
+#   define YYLOCATION_PRINT(File, Loc) ((void) 0)
+    /* Temporary convenience wrapper in case some people defined the
+       undocumented and private YY_LOCATION_PRINT macros.  */
+#   define YY_LOCATION_PRINT  YYLOCATION_PRINT
+
+#  endif
+# endif /* !defined YYLOCATION_PRINT */]])
 ])
 
 # b4_yyloc_default
diff --git a/data/skeletons/d-skel.m4 b/data/skeletons/d-skel.m4
index 1705d84..2a38f02 100644
--- a/data/skeletons/d-skel.m4
+++ b/data/skeletons/d-skel.m4
@@ -2,7 +2,7 @@
 
 # D skeleton dispatching for Bison.
 
-# Copyright (C) 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -15,7 +15,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 b4_glr_if(             [b4_complain([%%glr-parser not supported for D])])
 b4_nondeterministic_if([b4_complain([%%nondeterministic-parser not supported for D])])
diff --git a/data/skeletons/d.m4 b/data/skeletons/d.m4
index 2d29127..c0632e4 100644
--- a/data/skeletons/d.m4
+++ b/data/skeletons/d.m4
@@ -2,7 +2,7 @@
 
 # D language support for Bison
 
-# Copyright (C) 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -15,27 +15,36 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 
-# _b4_comment(TEXT, OPEN, CONTINUE, END)
-# --------------------------------------
-# Put TEXT in comment.  Avoid trailing spaces: don't indent empty lines.
-# Avoid adding indentation to the first line, as the indentation comes
-# from OPEN.  That's why we don't patsubst([$1], [^\(.\)], [   \1]).
-#
-# Prefix all the output lines with PREFIX.
-m4_define([_b4_comment],
-[$2[]m4_bpatsubst(m4_expand([[$1]]), [
-\(.\)], [
-$3\1])$4])
+m4_include(b4_skeletonsdir/[c-like.m4])
 
 
-# b4_comment(TEXT, [PREFIX])
-# --------------------------
-# Put TEXT in comment.  Prefix all the output lines with PREFIX.
-m4_define([b4_comment],
-[_b4_comment([$1], [$2/* ], [$2   ], [  */])])
+# b4_symbol_action(SYMBOL-NUM, ACTION)
+# ------------------------------------
+# Run the action ACTION ("destructor" or "printer") for SYMBOL-NUM.
+m4_define([b4_symbol_action],
+[b4_symbol_if([$1], [has_$2],
+[b4_dollar_pushdef([yyval],
+                   [$1],
+                   [],
+                   [yyloc])dnl
+    _b4_symbol_case([$1])[]dnl
+b4_syncline([b4_symbol([$1], [$2_line])], [b4_symbol([$1], [$2_file])])dnl
+b4_symbol([$1], [$2])
+b4_syncline([@oline@], [@ofile@])dnl
+        break;
+
+b4_dollar_popdef[]dnl
+])])
+
+
+# b4_use(EXPR)
+# ------------
+# Pacify the compiler about some maybe unused value.
+m4_define([b4_use],
+[])
 
 
 # b4_sync_start(LINE, FILE)
@@ -58,6 +67,23 @@
           [m4_ifval(m4_quote(b4_percent_define_get([$1])),
                 [$2[]b4_percent_define_get([$1])[]$3], [$4])])
 
+# b4_percent_define_if_get2(ARG1, ARG2, DEF, NOT)
+# -----------------------------------------------
+# Expand to the value of DEF if ARG1 or ARG2 are %define'ed,
+# otherwise NOT.
+m4_define([b4_percent_define_if_get2],
+          [m4_ifval(m4_quote(b4_percent_define_get([$1])),
+                [$3], [m4_ifval(m4_quote(b4_percent_define_get([$2])),
+                      [$3], [$4])])])
+
+# b4_percent_define_class_before_interface(CLASS, INTERFACE)
+# ----------------------------------------------------------
+# Expand to a ', ' if both a class and an interface have been %define'ed
+m4_define([b4_percent_define_class_before_interface],
+          [m4_ifval(m4_quote(b4_percent_define_get([$1])),
+                [m4_ifval(m4_quote(b4_percent_define_get([$2])),
+                      [, ])])])
+
 
 # b4_flag_value(BOOLEAN-FLAG)
 # ---------------------------
@@ -78,8 +104,10 @@
 b4_percent_define_flag_if([api.parser.abstract], [abstract ])dnl
 b4_percent_define_flag_if([api.parser.final],    [final ])dnl
 [class ]b4_parser_class[]dnl
-b4_percent_define_get3([api.parser.extends], [ extends ])dnl
-b4_percent_define_get3([api.parser.implements], [ implements ])])
+b4_percent_define_if_get2([api.parser.extends], [api.parser.implements], [ : ])dnl
+b4_percent_define_get([api.parser.extends])dnl
+b4_percent_define_class_before_interface([api.parser.extends], [api.parser.implements])dnl
+b4_percent_define_get([api.parser.implements])])
 
 
 # b4_lexer_if(TRUE, FALSE)
@@ -103,12 +131,12 @@
 # b4_identification
 # -----------------
 m4_define([b4_identification],
-[/** Version number for the Bison executable that generated this parser.  */
-  public static immutable string yy_bison_version = "b4_version";
+[[/** Version number for the Bison executable that generated this parser.  */
+  public static immutable string yy_bison_version = "]b4_version_string[";
 
   /** Name of the skeleton that generated this parser.  */
-  public static immutable string yy_bison_skeleton = b4_skeleton;
-])
+  public static immutable string yy_bison_skeleton = ]b4_skeleton[;
+]])
 
 
 ## ------------ ##
@@ -148,9 +176,12 @@
 ])
 
 
-## ------------------------- ##
-## Assigning token numbers.  ##
-## ------------------------- ##
+## ------------- ##
+## Token kinds.  ##
+## ------------- ##
+
+m4_define([b4_symbol(-2, id)],  [[YYEMPTY]])
+b4_percent_define_default([[api.token.raw]], [[true]])
 
 # b4_token_enum(TOKEN-NAME, TOKEN-NUMBER)
 # ---------------------------------------
@@ -159,22 +190,121 @@
 [b4_token_format([  %s = %s,
 ], [$1])])
 
-# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
-# -----------------------------------------------------
+# b4_token_enums
+# --------------
 # Output the definition of the tokens as enums.
 m4_define([b4_token_enums],
-[/* Tokens.  */
-public enum YYTokenType {
-
-  /** Token returned by the scanner to signal the end of its input.  */
-  EOF = 0,
-b4_symbol_foreach([b4_token_enum])
+[/* Token kinds.  */
+public enum TokenKind {
+  ]b4_symbol(empty, id)[ = -2,
+b4_symbol_foreach([b4_token_enum])dnl
 }
 ])
 
-# b4-case(ID, CODE)
-# -----------------
-m4_define([b4_case], [    case $1:
+# b4_symbol_translate(STRING)
+# ---------------------------
+# Used by "bison" in the array of symbol names to mark those that
+# require translation.
+m4_define([b4_symbol_translate],
+[[_($1)]])
+
+
+# _b4_token_constructor_define(SYMBOL-NUM)
+# ----------------------------------------
+# Define Symbol.FOO for SYMBOL-NUM.
+m4_define([_b4_token_constructor_define],
+[b4_token_visible_if([$1],
+[[
+    static auto ]b4_symbol([$1], [id])[(]b4_symbol_if([$1], [has_type],
+[b4_union_if([b4_symbol([$1], [type]],
+[[typeof(YYSemanticType.]b4_symbol([$1], [type])[]])) [val]])dnl
+[]b4_locations_if([b4_symbol_if([$1], [has_type], [[, ]])[Location l]])[)
+    {
+      return Symbol(TokenKind.]b4_symbol([$1], [id])[]b4_symbol_if([$1], [has_type],
+      [[, val]])[]b4_locations_if([[, l]])[);
+    }]])])
+
+# b4_token_constructor_define
+# ---------------------------
+# Define Symbol.FOO for each token kind FOO.
+m4_define([b4_token_constructor_define],
+[[
+    /* Implementation of token constructors for each symbol type visible to
+     * the user. The code generates static methods that have the same names
+     * as the TokenKinds.
+     */]b4_symbol_foreach([_b4_token_constructor_define])dnl
+])
+
+## -------------- ##
+## Symbol kinds.  ##
+## -------------- ##
+
+# b4_symbol_kind(NUM)
+# -------------------
+m4_define([b4_symbol_kind],
+[SymbolKind.b4_symbol_kind_base($@)])
+
+
+# b4_symbol_enum(SYMBOL-NUM)
+# --------------------------
+# Output the definition of this symbol as an enum.
+m4_define([b4_symbol_enum],
+[m4_format([    %-30s %s],
+           m4_format([[%s = %s,]],
+                     b4_symbol([$1], [kind_base]),
+                     [$1]),
+           [b4_symbol_tag_comment([$1])])])
+
+
+# b4_declare_symbol_enum
+# ----------------------
+# The definition of the symbol internal numbers as an enum.
+# Defining YYEMPTY here is important: it forces the compiler
+# to use a signed type, which matters for yytoken.
+m4_define([b4_declare_symbol_enum],
+[[  /* Symbol kinds.  */
+  struct SymbolKind
+  {
+    enum
+    {
+    ]b4_symbol(empty, kind_base)[ = -2,  /* No symbol.  */
+]b4_symbol_foreach([b4_symbol_enum])dnl
+[    }
+
+    private int yycode_;
+    alias yycode_ this;
+
+    this(int code)
+    {
+      yycode_ = code;
+    }
+
+    /* Return YYSTR after stripping away unnecessary quotes and
+     backslashes, so that it's suitable for yyerror.  The heuristic is
+     that double-quoting is unnecessary unless the string contains an
+     apostrophe, a comma, or backslash (other than backslash-backslash).
+     YYSTR is taken from yytname.  */
+    final void toString(W)(W sink) const
+    if (isOutputRange!(W, char))
+    {
+      immutable string[] yy_sname = @{
+  ]b4_symbol_names[
+      @};]b4_has_translations_if([[
+      /* YYTRANSLATABLE[SYMBOL-NUM] -- Whether YY_SNAME[SYMBOL-NUM] is
+        internationalizable.  */
+      immutable ]b4_int_type_for([b4_translatable])[[] yytranslatable = @{
+  ]b4_translatable[
+      @};]])[
+
+      put(sink, yy_sname[yycode_]);
+    }
+  }
+]])
+
+
+# b4_case(ID, CODE, [COMMENTS])
+# -----------------------------
+m4_define([b4_case], [    case $1:m4_ifval([$3], [ b4_comment([$3])])
 $2
       break;])
 
@@ -199,6 +329,109 @@
 m4_define([b4_position_type], b4_percent_define_ifdef([[position_type]],[b4_percent_define_get([[position_type]])],[YYPosition]))
 
 
+## ---------------- ##
+## api.value.type.  ##
+## ---------------- ##
+
+
+# ---------------------- #
+# api.value.type=union.  #
+# ---------------------- #
+
+# b4_symbol_type_register(SYMBOL-NUM)
+# -----------------------------------
+# Symbol SYMBOL-NUM has a type (for union) instead of a type-tag.
+# Extend the definition of %union's body (b4_union_members) with a
+# field of that type, and extend the symbol's "type" field to point to
+# the field name, instead of the type name.
+m4_define([b4_symbol_type_register],
+[m4_define([b4_symbol($1, type_tag)],
+           [b4_symbol_if([$1], [has_id],
+                         [b4_symbol([$1], [id])],
+                         [yykind_[]b4_symbol([$1], [number])])])dnl
+m4_append([b4_union_members],
+m4_expand([m4_format([  %-40s %s],
+                     m4_expand([b4_symbol([$1], [type]) b4_symbol([$1], [type_tag]);]),
+                     [b4_symbol_tag_comment([$1])])]))
+])
+
+
+# b4_type_define_tag(SYMBOL1-NUM, ...)
+# ------------------------------------
+# For the batch of symbols SYMBOL1-NUM... (which all have the same
+# type), enhance the %union definition for each of them, and set
+# there "type" field to the field tag name, instead of the type name.
+m4_define([b4_type_define_tag],
+[b4_symbol_if([$1], [has_type],
+              [m4_map([b4_symbol_type_register], [$@])])
+])
+
+
+# b4_symbol_value_union(VAL, SYMBOL-NUM, [TYPE])
+# ----------------------------------------------
+# Same of b4_symbol_value, but when api.value.type=union.
+m4_define([b4_symbol_value_union],
+[m4_ifval([$3],
+          [(*($3*)(&$1))],
+          [m4_ifval([$2],
+                    [b4_symbol_if([$2], [has_type],
+                                  [($1.b4_symbol([$2], [type_tag]))],
+                                  [$1])],
+                    [$1])])])
+
+
+# b4_value_type_setup_union
+# -------------------------
+# Setup support for api.value.type=union.  Symbols are defined with a
+# type instead of a union member name: build the corresponding union,
+# and give the symbols their tag.
+m4_define([b4_value_type_setup_union],
+[m4_define([b4_union_members])
+b4_type_foreach([b4_type_define_tag])
+m4_copy_force([b4_symbol_value_union], [b4_symbol_value])
+])
+
+
+# _b4_value_type_setup_keyword
+# ----------------------------
+# api.value.type is defined with a keyword/string syntax.  Check if
+# that is properly defined, and prepare its use.
+m4_define([_b4_value_type_setup_keyword],
+[b4_percent_define_check_values([[[[api.value.type]],
+                                  [[none]],
+                                  [[union]],
+                                  [[union-directive]],
+                                  [[yystype]]]])dnl
+m4_case(b4_percent_define_get([[api.value.type]]),
+        [union],   [b4_value_type_setup_union])])
+
+
+# b4_value_type_setup
+# -------------------
+# Check if api.value.type is properly defined, and possibly prepare
+# its use.
+b4_define_silent([b4_value_type_setup],
+[
+# Define default value.
+b4_percent_define_ifdef([[api.value.type]], [],
+[# %union => api.value.type=union-directive
+m4_ifdef([b4_union_members],
+[m4_define([b4_percent_define_kind(api.value.type)], [keyword])
+m4_define([b4_percent_define(api.value.type)], [union-directive])],
+[# no tag seen => api.value.type={int}
+m4_if(b4_tag_seen_flag, 0,
+[m4_define([b4_percent_define_kind(api.value.type)], [code])
+m4_define([b4_percent_define(api.value.type)], [int])],
+[# otherwise api.value.type=yystype
+m4_define([b4_percent_define_kind(api.value.type)], [keyword])
+m4_define([b4_percent_define(api.value.type)], [yystype])])])])
+
+# Set up.
+m4_bmatch(b4_percent_define_get_kind([[api.value.type]]),
+   [keyword], [_b4_value_type_setup_keyword])
+])
+
+
 ## ----------------- ##
 ## Semantic Values.  ##
 ## ----------------- ##
@@ -245,7 +478,7 @@
 # Expansion of @POS, where the current rule has RULE-LENGTH symbols
 # on RHS.
 m4_define([b4_rhs_location],
-[yystack.locationAt ([$1], [$2])])
+[yystack.locationAt (b4_subtract($@))])
 
 
 # b4_lex_param
@@ -330,3 +563,66 @@
 ], [$@])])
 m4_define([b4_var_decl],
           [    protected $1;])
+
+
+# b4_public_types_declare
+# -----------------------
+# Define the public types: token, semantic value, location, and so forth.
+# Depending on %define token_lex, may be output in the header or source file.
+m4_define([b4_public_types_declare],
+[[
+alias Symbol = ]b4_parser_class[.Symbol;
+alias Value = ]b4_yystype[;]b4_locations_if([[
+alias Location = ]b4_location_type[;
+alias Position = ]b4_position_type[;]b4_push_if([[
+alias PUSH_MORE = ]b4_parser_class[.YYPUSH_MORE;
+alias ABORT = ]b4_parser_class[.YYABORT;
+alias ACCEPT = ]b4_parser_class[.YYACCEPT;]])[]])[
+]])
+
+
+# b4_basic_symbol_constructor_define
+# ----------------------------------
+# Create Symbol struct constructors for all the visible types.
+m4_define([b4_basic_symbol_constructor_define],
+[b4_token_visible_if([$1],
+[[    this(TokenKind token]b4_symbol_if([$1], [has_type],
+[[, ]b4_union_if([], [[typeof(YYSemanticType.]])b4_symbol([$1], [type])dnl
+[]b4_union_if([], [[) ]])[ val]])[]b4_locations_if([[, Location loc]])[)
+    {
+      kind = yytranslate_(token);]b4_union_if([b4_symbol_if([$1], [has_type], [[
+      static foreach (member; __traits(allMembers, YYSemanticType))
+      {
+        static if (is(typeof(mixin("value_." ~ member)) == ]b4_symbol([$1], [type])[))
+        {
+          mixin("value_." ~ member ~ " = val;");
+        }
+      }]])], [b4_symbol_if([$1], [has_type], [[
+      value_.]b4_symbol([$1], [type])[ = val;]])])[]b4_locations_if([
+      location_ = loc;])[
+    }
+]])])
+
+
+# b4_symbol_type_define
+# ---------------------
+# Define symbol_type, the external type for symbols used for symbol
+# constructors.
+m4_define([b4_symbol_type_define],
+[[
+  /**
+    * A complete symbol
+    */
+  struct Symbol
+  {
+    private SymbolKind kind;
+    private Value value_;]b4_locations_if([[
+    private Location location_;]])[
+
+]b4_type_foreach([b4_basic_symbol_constructor_define])[
+    SymbolKind token() { return kind; }
+    Value value() { return value_; }]b4_locations_if([[
+    Location location() { return location_; }]])[
+]b4_token_ctor_if([b4_token_constructor_define])[
+  }
+]])
diff --git a/data/skeletons/glr.c b/data/skeletons/glr.c
index 945ff0a..fab3733 100644
--- a/data/skeletons/glr.c
+++ b/data/skeletons/glr.c
@@ -1,8 +1,8 @@
-                                                                    -*- C -*-
+#                                                             -*- C -*-
 
 # GLR skeleton for Bison
 
-# Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -15,7 +15,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 
 # If we are loaded by glr.cc, do not override c++.m4 definitions by
@@ -32,7 +32,9 @@
 m4_define_default([b4_stack_depth_max], [10000])
 m4_define_default([b4_stack_depth_init],  [200])
 
-
+# Included header.
+b4_percent_define_default([[api.header.include]],
+                          [["@basename(]b4_spec_header_file[@)"]])
 
 ## ------------------------ ##
 ## Pure/impure interfaces.  ##
@@ -46,16 +48,6 @@
  m4_define([b4_pure_flag],
            [b4_percent_define_flag_if([[api.pure]], [[1]], [[0]])])])
 
-# b4_user_formals
-# ---------------
-# The possible parse-params formal arguments preceded by a comma.
-#
-# This is not shared with yacc.c in c.m4 because  GLR relies on ISO C
-# formal argument declarations.
-m4_define([b4_user_formals],
-[m4_ifset([b4_parse_param], [, b4_formals(b4_parse_param)])])
-
-
 # b4_yyerror_args
 # ---------------
 # Optional effective arguments passed to yyerror: user args plus yylloc, and
@@ -132,7 +124,7 @@
 # --------------------------------------------------
 # Expansion of $$ or $<TYPE>$, for symbol SYMBOL-NUM.
 m4_define([b4_rhs_value],
-[b4_symbol_value([b4_rhs_data([$1], [$2]).yysemantics.yysval], [$3], [$4])])
+[b4_symbol_value([b4_rhs_data([$1], [$2]).yysemantics.yyval], [$3], [$4])])
 
 
 
@@ -155,13 +147,22 @@
 [(b4_rhs_data([$1], [$2]).yyloc)])
 
 
+# b4_call_merger(MERGER-NUM, MERGER-NAME, SYMBOL-SUM)
+# ---------------------------------------------------
+m4_define([b4_call_merger],
+[b4_case([$1],
+         [    b4_symbol_if([$3], [has_type],
+                           [yy0->b4_symbol($3, slot) = $2 (*yy0, *yy1);],
+                           [*yy0 = $2 (*yy0, *yy1);])])])
+
+
 ## -------------- ##
 ## Declarations.  ##
 ## -------------- ##
 
 # b4_shared_declarations
 # ----------------------
-# Declaration that might either go into the header (if --defines)
+# Declaration that might either go into the header (if --header)
 # or open coded in the parser body.  glr.cc has its own definition.
 m4_if(b4_skeleton, ["glr.c"],
 [m4_define([b4_shared_declarations],
@@ -169,7 +170,7 @@
 ]b4_percent_code_get([[requires]])[
 ]b4_token_enums[
 ]b4_declare_yylstype[
-]b4_function_declare(b4_prefix[parse], [int], b4_parse_param)[
+int ]b4_prefix[parse (]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param)], [void])[);
 ]b4_percent_code_get([[provides]])[]dnl
 ])
 ])
@@ -187,7 +188,7 @@
 # members of this union.
 #
 # To avoid this issue, just generate the header before the
-# implementation file.  But we should also make them more independant.
+# implementation file.  But we should also make them more independent.
 
 # ----------------- #
 # The header file.  #
@@ -195,13 +196,13 @@
 
 # glr.cc produces its own header.
 b4_glr_cc_if([],
-[b4_defines_if(
+[b4_header_if(
 [b4_output_begin([b4_spec_header_file])
 b4_copyright([Skeleton interface for Bison GLR parsers in C],
-             [2002-2015, 2018-2019])[
-]b4_cpp_guard_open([b4_spec_header_file])[
+             [2002-2015, 2018-2021])[
+]b4_cpp_guard_open([b4_spec_mapped_header_file])[
 ]b4_shared_declarations[
-]b4_cpp_guard_close([b4_spec_header_file])[
+]b4_cpp_guard_close([b4_spec_mapped_header_file])[
 ]b4_output_end[
 ]])])
 
@@ -212,7 +213,7 @@
 
 b4_output_begin([b4_parser_file_name])
 b4_copyright([Skeleton implementation for Bison GLR parsers in C],
-             [2002-2015, 2018-2019])[
+             [2002-2015, 2018-2021])[
 /* C GLR parser skeleton written by Paul Hilfinger.  */
 
 ]b4_disclaimer[
@@ -225,7 +226,7 @@
 #define YYLTYPE ]b4_api_PREFIX[LTYPE]])])[
 ]m4_if(b4_prefix, [yy], [],
 [[/* Substitute the variable and function names.  */
-#define yyparse ]b4_prefix[parse
+#define ]b4_glr_cc_if([yy_parse_impl], [yyparse])[ ]b4_prefix[]b4_glr_cc_if([_parse_impl], [parse])[
 #define yylex   ]b4_prefix[lex
 #define yyerror ]b4_prefix[error
 #define yydebug ]b4_prefix[debug]]b4_pure_if([], [[
@@ -238,16 +239,11 @@
 ]b4_cast_define[
 ]b4_null_define[
 
-]b4_defines_if([[#include "@basename(]b4_spec_header_file[@)"]],
-               [b4_shared_declarations])[
+]b4_header_if([[#include ]b4_percent_define_get([[api.header.include]])],
+              [b4_shared_declarations])[
 
-/* Enabling verbose error messages.  */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[
-#endif
+]b4_glr_cc_if([b4_glr_cc_setup],
+              [b4_declare_symbol_enum])[
 
 /* Default (constant) value used for initialization for null
    right-hand sides.  Unlike the standard yacc.c template, here we set
@@ -266,6 +262,7 @@
 #include <string.h>
 
 ]b4_c99_int_type_define[
+]b4_sizes_types_define[
 
 #ifndef YY_
 # if defined YYENABLE_NLS && YYENABLE_NLS
@@ -278,6 +275,11 @@
 #  define YY_(Msgid) Msgid
 # endif
 #endif
+]b4_has_translations_if([
+#ifndef N_
+# define N_(Msgid) Msgid
+#endif
+])[
 
 #ifndef YYFREE
 # define YYFREE free
@@ -289,9 +291,6 @@
 # define YYREALLOC realloc
 #endif
 
-#define YYSIZEMAX \
-  (PTRDIFF_MAX < SIZE_MAX ? PTRDIFF_MAX : YY_CAST (ptrdiff_t, SIZE_MAX))
-
 #ifdef __cplusplus
   typedef bool yybool;
 # define yytrue true
@@ -345,21 +344,17 @@
    accessed by $0, $-1, etc., in any rule.  */
 #define YYMAXLEFT ]b4_max_left_semantic_context[
 
-/* YYMAXUTOK -- Last valid token number (for yychar).  */
-#define YYMAXUTOK   ]b4_user_token_number_max[]b4_glr_cc_if([[
-/* YYFAULTYTOK -- Token number (for yychar) that denotes a
-   syntax_error thrown from the scanner.  */
-#define YYFAULTYTOK (YYMAXUTOK + 1)]])[
-/* YYUNDEFTOK -- Symbol number (for yytoken) that denotes an unknown
-   token.  */
-#define YYUNDEFTOK  ]b4_undef_token_number[
+/* YYMAXUTOK -- Last valid token kind.  */
+#define YYMAXUTOK   ]b4_code_max[
 
 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
    as returned by yylex, with out-of-bounds checking.  */
 ]b4_api_token_raw_if(dnl
-[[#define YYTRANSLATE(YYX) (YYX)]],
-[[#define YYTRANSLATE(YYX)                         \
-  (0 <= (YYX) && (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+[[#define YYTRANSLATE(YYX) YY_CAST (yysymbol_kind_t, YYX)]],
+[[#define YYTRANSLATE(YYX)                                \
+  (0 <= (YYX) && (YYX) <= YYMAXUTOK                     \
+   ? YY_CAST (yysymbol_kind_t, yytranslate[YYX])        \
+   : ]b4_symbol_prefix[YYUNDEF)
 
 /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
    as returned by yylex.  */
@@ -376,15 +371,6 @@
 };
 #endif
 
-#if ]b4_api_PREFIX[DEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
-static const char *const yytname[] =
-{
-  ]b4_tname[
-};
-#endif
-
 #define YYPACT_NINF (]b4_pact_ninf[)
 #define YYTABLE_NINF (]b4_table_ninf[)
 
@@ -428,9 +414,6 @@
   ]b4_conflicting_rules[
 };
 
-/* Error token number */
-#define YYTERROR 1
-
 ]b4_locations_if([[
 ]b4_yylloc_default_define[
 # define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc)
@@ -457,10 +440,9 @@
 int yynerrs;
 int yychar;])[
 
-static const int YYEOF = 0;
-static const int YYEMPTY = -2;
+enum { YYENOMEM = -2 };
 
-typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG;
+typedef enum { yyok, yyaccept, yyabort, yyerr, yynomem } YYRESULTTAG;
 
 #define YYCHK(YYE)                              \
   do {                                          \
@@ -469,62 +451,6 @@
       return yychk_flag;                        \
   } while (0)
 
-#if ]b4_api_PREFIX[DEBUG
-
-# ifndef YYFPRINTF
-#  define YYFPRINTF fprintf
-# endif
-
-# define YY_FPRINTF                             \
-  YY_IGNORE_USELESS_CAST_BEGIN YY_FPRINTF_
-
-# define YY_FPRINTF_(Args)                      \
-  do {                                          \
-    YYFPRINTF Args;                             \
-    YY_IGNORE_USELESS_CAST_END                  \
-  } while (0)
-
-# define YY_DPRINTF                             \
-  YY_IGNORE_USELESS_CAST_BEGIN YY_DPRINTF_
-
-# define YY_DPRINTF_(Args)                      \
-  do {                                          \
-    if (yydebug)                                \
-      YYFPRINTF Args;                           \
-    YY_IGNORE_USELESS_CAST_END                  \
-  } while (0)
-
-]b4_yy_location_print_define[
-
-]b4_yy_symbol_print_define[
-
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                  \
-  do {                                                                  \
-    if (yydebug)                                                        \
-      {                                                                 \
-        YY_FPRINTF ((stderr, "%s ", Title));                            \
-        yy_symbol_print (stderr, Type, Value]b4_locuser_args([Location])[);        \
-        YY_FPRINTF ((stderr, "\n"));                                    \
-      }                                                                 \
-  } while (0)
-
-/* Nonzero means print parse trace.  It is left uninitialized so that
-   multiple parsers can coexist.  */
-int yydebug;
-
-struct yyGLRStack;
-static void yypstack (struct yyGLRStack* yystackp, ptrdiff_t yyk)
-  YY_ATTRIBUTE_UNUSED;
-static void yypdumpstack (struct yyGLRStack* yystackp)
-  YY_ATTRIBUTE_UNUSED;
-
-#else /* !]b4_api_PREFIX[DEBUG */
-
-# define YY_DPRINTF(Args) do {} while (yyfalse)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-
-#endif /* !]b4_api_PREFIX[DEBUG */
-
 /* YYINITDEPTH -- initial size of the parser's stacks.  */
 #ifndef YYINITDEPTH
 # define YYINITDEPTH ]b4_stack_depth_init[
@@ -566,91 +492,12 @@
   } while (0)
 #endif
 
-
-#if YYERROR_VERBOSE
-
-# ifndef yystpcpy
-#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-#   define yystpcpy stpcpy
-#  else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
-   YYDEST.  */
-static char *
-yystpcpy (char *yydest, const char *yysrc)
-{
-  char *yyd = yydest;
-  const char *yys = yysrc;
-
-  while ((*yyd++ = *yys++) != '\0')
-    continue;
-
-  return yyd - 1;
-}
-#  endif
-# endif
-
-# ifndef yytnamerr
-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
-   quotes and backslashes, so that it's suitable for yyerror.  The
-   heuristic is that double-quoting is unnecessary unless the string
-   contains an apostrophe, a comma, or backslash (other than
-   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
-   null, do not copy; instead, return the length of what the result
-   would have been.  */
-static ptrdiff_t
-yytnamerr (char *yyres, const char *yystr)
-{
-  if (*yystr == '"')
-    {
-      ptrdiff_t yyn = 0;
-      char const *yyp = yystr;
-
-      for (;;)
-        switch (*++yyp)
-          {
-          case '\'':
-          case ',':
-            goto do_not_strip_quotes;
-
-          case '\\':
-            if (*++yyp != '\\')
-              goto do_not_strip_quotes;
-            else
-              goto append;
-
-          append:
-          default:
-            if (yyres)
-              yyres[yyn] = *yyp;
-            yyn++;
-            break;
-
-          case '"':
-            if (yyres)
-              yyres[yyn] = '\0';
-            return yyn;
-          }
-    do_not_strip_quotes: ;
-    }
-
-  if (yyres)
-    return yystpcpy (yyres, yystr) - yyres;
-  else
-    return YY_CAST (ptrdiff_t, strlen (yystr));
-}
-# endif
-
-#endif /* !YYERROR_VERBOSE */
-
 /** State numbers. */
-typedef int yyStateNum;
+typedef int yy_state_t;
 
 /** Rule numbers. */
 typedef int yyRuleNum;
 
-/** Grammar symbol. */
-typedef int yySymbol;
-
 /** Item references. */
 typedef short yyItemNum;
 
@@ -660,42 +507,45 @@
 typedef union yyGLRStackItem yyGLRStackItem;
 typedef struct yyGLRStack yyGLRStack;
 
-struct yyGLRState {
+struct yyGLRState
+{
   /** Type tag: always true.  */
   yybool yyisState;
-  /** Type tag for yysemantics.  If true, yysval applies, otherwise
+  /** Type tag for yysemantics.  If true, yyval applies, otherwise
    *  yyfirstVal applies.  */
   yybool yyresolved;
   /** Number of corresponding LALR(1) machine state.  */
-  yyStateNum yylrState;
+  yy_state_t yylrState;
   /** Preceding state in this stack */
   yyGLRState* yypred;
   /** Source position of the last token produced by my symbol */
-  ptrdiff_t yyposn;
+  YYPTRDIFF_T yyposn;
   union {
     /** First in a chain of alternative reductions producing the
      *  nonterminal corresponding to this state, threaded through
      *  yynext.  */
     yySemanticOption* yyfirstVal;
     /** Semantic value for this state.  */
-    YYSTYPE yysval;
+    YYSTYPE yyval;
   } yysemantics;]b4_locations_if([[
   /** Source location for this state.  */
   YYLTYPE yyloc;]])[
 };
 
-struct yyGLRStateSet {
+struct yyGLRStateSet
+{
   yyGLRState** yystates;
   /** During nondeterministic operation, yylookaheadNeeds tracks which
    *  stacks have actually needed the current lookahead.  During deterministic
    *  operation, yylookaheadNeeds[0] is not maintained since it would merely
-   *  duplicate yychar != YYEMPTY.  */
+   *  duplicate yychar != ]b4_symbol(empty, id)[.  */
   yybool* yylookaheadNeeds;
-  ptrdiff_t yysize;
-  ptrdiff_t yycapacity;
+  YYPTRDIFF_T yysize;
+  YYPTRDIFF_T yycapacity;
 };
 
-struct yySemanticOption {
+struct yySemanticOption
+{
   /** Type tag: always false.  */
   yybool yyisState;
   /** Rule number for this reduction */
@@ -732,7 +582,7 @@
   YYJMP_BUF yyexception_buffer;
   yyGLRStackItem* yyitems;
   yyGLRStackItem* yynextFree;
-  ptrdiff_t yyspaceLeft;
+  YYPTRDIFF_T yyspaceLeft;
   yyGLRState* yysplitPoint;
   yyGLRState* yylastDeleted;
   yyGLRStateSet yytops;
@@ -756,14 +606,206 @@
   YYLONGJMP (yystackp->yyexception_buffer, 2);
 }
 
-#if ]b4_api_PREFIX[DEBUG || YYERROR_VERBOSE
-/** A printable representation of TOKEN.  */
-static inline const char*
-yytokenName (yySymbol yytoken)
+/** Accessing symbol of state YYSTATE.  */
+static inline yysymbol_kind_t
+yy_accessing_symbol (yy_state_t yystate)
 {
-  return yytoken == YYEMPTY ? "" : yytname[yytoken];
+  return YY_CAST (yysymbol_kind_t, yystos[yystate]);
+}
+
+#if ]b4_parse_error_case([simple], [b4_api_PREFIX[DEBUG || ]b4_token_table_flag], [[1]])[
+/* The user-facing name of the symbol whose (internal) number is
+   YYSYMBOL.  No bounds checking.  */
+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
+
+]b4_parse_error_bmatch([simple\|verbose],
+[[/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
+static const char *const yytname[] =
+{
+  ]b4_tname[
+};
+
+static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
+{
+  return yytname[yysymbol];
+}]],
+[[static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
+{
+  static const char *const yy_sname[] =
+  {
+  ]b4_symbol_names[
+  };]b4_has_translations_if([[
+  /* YYTRANSLATABLE[SYMBOL-NUM] -- Whether YY_SNAME[SYMBOL-NUM] is
+     internationalizable.  */
+  static ]b4_int_type_for([b4_translatable])[ yytranslatable[] =
+  {
+  ]b4_translatable[
+  };
+  return (yysymbol < YYNTOKENS && yytranslatable[yysymbol]
+          ? _(yy_sname[yysymbol])
+          : yy_sname[yysymbol]);]], [[
+  return yy_sname[yysymbol];]])[
+}]])[
+#endif
+
+/** Left-hand-side symbol for rule #YYRULE.  */
+static inline yysymbol_kind_t
+yylhsNonterm (yyRuleNum yyrule)
+{
+  return YY_CAST (yysymbol_kind_t, yyr1[yyrule]);
+}
+
+#if ]b4_api_PREFIX[DEBUG
+
+# ifndef YYFPRINTF
+#  define YYFPRINTF fprintf
+# endif
+
+# define YY_FPRINTF                             \
+  YY_IGNORE_USELESS_CAST_BEGIN YY_FPRINTF_
+
+# define YY_FPRINTF_(Args)                      \
+  do {                                          \
+    YYFPRINTF Args;                             \
+    YY_IGNORE_USELESS_CAST_END                  \
+  } while (0)
+
+# define YY_DPRINTF                             \
+  YY_IGNORE_USELESS_CAST_BEGIN YY_DPRINTF_
+
+# define YY_DPRINTF_(Args)                      \
+  do {                                          \
+    if (yydebug)                                \
+      YYFPRINTF Args;                           \
+    YY_IGNORE_USELESS_CAST_END                  \
+  } while (0)
+
+]b4_yylocation_print_define[
+
+]b4_yy_symbol_print_define[
+
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)                  \
+  do {                                                                  \
+    if (yydebug)                                                        \
+      {                                                                 \
+        YY_FPRINTF ((stderr, "%s ", Title));                            \
+        yy_symbol_print (stderr, Kind, Value]b4_locuser_args([Location])[);        \
+        YY_FPRINTF ((stderr, "\n"));                                    \
+      }                                                                 \
+  } while (0)
+
+static inline void
+yy_reduce_print (yybool yynormal, yyGLRStackItem* yyvsp, YYPTRDIFF_T yyk,
+                 yyRuleNum yyrule]b4_user_formals[);
+
+# define YY_REDUCE_PRINT(Args)          \
+  do {                                  \
+    if (yydebug)                        \
+      yy_reduce_print Args;             \
+  } while (0)
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+
+static void yypstack (yyGLRStack* yystackp, YYPTRDIFF_T yyk)
+  YY_ATTRIBUTE_UNUSED;
+static void yypdumpstack (yyGLRStack* yystackp)
+  YY_ATTRIBUTE_UNUSED;
+
+#else /* !]b4_api_PREFIX[DEBUG */
+
+# define YY_DPRINTF(Args) do {} while (yyfalse)
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
+# define YY_REDUCE_PRINT(Args)
+
+#endif /* !]b4_api_PREFIX[DEBUG */
+
+]b4_parse_error_case(
+         [simple],
+[[]],
+[[#ifndef yystrlen
+# define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S)))
+#endif
+
+]b4_parse_error_bmatch(
+           [detailed\|verbose],
+[[#ifndef yystpcpy
+# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+#  define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+{
+  char *yyd = yydest;
+  const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+# endif
+#endif]])[
+
+]b4_parse_error_case(
+         [verbose],
+[[#ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+   quotes and backslashes, so that it's suitable for yyerror.  The
+   heuristic is that double-quoting is unnecessary unless the string
+   contains an apostrophe, a comma, or backslash (other than
+   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
+   null, do not copy; instead, return the length of what the result
+   would have been.  */
+static YYPTRDIFF_T
+yytnamerr (char *yyres, const char *yystr)
+{
+  if (*yystr == '"')
+    {
+      YYPTRDIFF_T yyn = 0;
+      char const *yyp = yystr;
+
+      for (;;)
+        switch (*++yyp)
+          {
+          case '\'':
+          case ',':
+            goto do_not_strip_quotes;
+
+          case '\\':
+            if (*++yyp != '\\')
+              goto do_not_strip_quotes;
+            else
+              goto append;
+
+          append:
+          default:
+            if (yyres)
+              yyres[yyn] = *yyp;
+            yyn++;
+            break;
+
+          case '"':
+            if (yyres)
+              yyres[yyn] = '\0';
+            return yyn;
+          }
+    do_not_strip_quotes: ;
+    }
+
+  if (yyres)
+    return yystpcpy (yyres, yystr) - yyres;
+  else
+    return yystrlen (yystr);
 }
 #endif
+]])])[
 
 /** Fill in YYVSP[YYLOW1 .. YYLOW0-1] from the chain of states starting
  *  at YYVSP[YYLOW0].yystate.yypred.  Leaves YYVSP[YYLOW1].yystate.yypred
@@ -781,9 +823,9 @@
 #endif
       yyvsp[i].yystate.yyresolved = s->yyresolved;
       if (s->yyresolved)
-        yyvsp[i].yystate.yysemantics.yysval = s->yysemantics.yysval;
+        yyvsp[i].yystate.yysemantics.yyval = s->yysemantics.yyval;
       else
-        /* The effect of using yysval or yyloc (in an immediate rule) is
+        /* The effect of using yyval or yyloc (in an immediate rule) is
          * undefined.  */
         yyvsp[i].yystate.yysemantics.yyfirstVal = YY_NULLPTR;]b4_locations_if([[
       yyvsp[i].yystate.yyloc = s->yyloc;]])[
@@ -794,19 +836,19 @@
 ]m4_define([b4_yygetToken_call],
            [[yygetToken (&yychar][]b4_pure_if([, yystackp])[]b4_user_args[)]])[
 /** If yychar is empty, fetch the next token.  */
-static inline yySymbol
+static inline yysymbol_kind_t
 yygetToken (int *yycharp][]b4_pure_if([, yyGLRStack* yystackp])[]b4_user_formals[)
 {
-  yySymbol yytoken;
+  yysymbol_kind_t yytoken;
 ]b4_parse_param_use()dnl
-[  if (*yycharp == YYEMPTY)
+[  if (*yycharp == ]b4_symbol(empty, id)[)
     {
-      YY_DPRINTF ((stderr, "Reading a token: "));]b4_glr_cc_if([[
+      YY_DPRINTF ((stderr, "Reading a token\n"));]b4_glr_cc_if([[
 #if YY_EXCEPTIONS
       try
         {
 #endif // YY_EXCEPTIONS
-          *yycharp = ]b4_lex[;
+          *yycharp = ]b4_yylex[;
 #if YY_EXCEPTIONS
         }
       catch (const ]b4_namespace_ref[::]b4_parser_class[::syntax_error& yyexc)
@@ -814,17 +856,18 @@
           YY_DPRINTF ((stderr, "Caught exception: %s\n", yyexc.what()));]b4_locations_if([
           yylloc = yyexc.location;])[
           yyerror (]b4_lyyerror_args[yyexc.what ());
-          // Map errors caught in the scanner to the undefined token
-          // (YYUNDEFTOK), so that error handling is started.
-          // However, record this with this special value of yychar.
-          *yycharp = YYFAULTYTOK;
+          // Map errors caught in the scanner to the undefined token,
+          // so that error handling is started.  However, record this
+          // with this special value of yychar.
+          *yycharp = ]b4_symbol(error, id)[;
         }
 #endif // YY_EXCEPTIONS]], [[
-      *yycharp = ]b4_lex[;]])[
+      *yycharp = ]b4_yylex[;]])[
     }
-  if (*yycharp <= YYEOF)
+  if (*yycharp <= ]b4_symbol(eof, [id])[)
     {
-      *yycharp = yytoken = YYEOF;
+      *yycharp = ]b4_symbol(eof, [id])[;
+      yytoken = ]b4_symbol_prefix[YYEOF;
       YY_DPRINTF ((stderr, "Now at end of input.\n"));
     }
   else
@@ -855,28 +898,31 @@
  *  and top stack item YYVSP.  YYLVALP points to place to put semantic
  *  value ($$), and yylocp points to place for location information
  *  (@@$).  Returns yyok for normal return, yyaccept for YYACCEPT,
- *  yyerr for YYERROR, yyabort for YYABORT.  */
+ *  yyerr for YYERROR, yyabort for YYABORT, yynomem for YYNOMEM.  */
 static YYRESULTTAG
-yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
-              yyGLRStack* yystackp,
+yyuserAction (yyRuleNum yyrule, int yyrhslen, yyGLRStackItem* yyvsp,
+              yyGLRStack* yystackp, YYPTRDIFF_T yyk,
               YYSTYPE* yyvalp]b4_locuser_formals[)
 {
-  yybool yynormal YY_ATTRIBUTE_UNUSED = yystackp->yysplitPoint == YY_NULLPTR;
-  int yylow;
+  const yybool yynormal YY_ATTRIBUTE_UNUSED = yystackp->yysplitPoint == YY_NULLPTR;
+  int yylow = 1;
 ]b4_parse_param_use([yyvalp], [yylocp])dnl
-[  YYUSE (yyrhslen);
+[  YY_USE (yyk);
+  YY_USE (yyrhslen);
 # undef yyerrok
 # define yyerrok (yystackp->yyerrState = 0)
 # undef YYACCEPT
 # define YYACCEPT return yyaccept
 # undef YYABORT
 # define YYABORT return yyabort
+# undef YYNOMEM
+# define YYNOMEM return yynomem
 # undef YYERROR
 # define YYERROR return yyerrok, yyerr
 # undef YYRECOVERING
 # define YYRECOVERING() (yystackp->yyerrState != 0)
 # undef yyclearin
-# define yyclearin (yychar = YYEMPTY)
+# define yyclearin (yychar = ]b4_symbol(empty, id)[)
 # undef YYFILL
 # define YYFILL(N) yyfill (yyvsp, &yylow, (N), yynormal)
 # undef YYBACKUP
@@ -884,21 +930,23 @@
   return yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")),     \
          yyerrok, yyerr
 
-  yylow = 1;
   if (yyrhslen == 0)
     *yyvalp = yyval_default;
   else
-    *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval;]b4_locations_if([[
+    *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yyval;]b4_locations_if([[
   /* Default location. */
   YYLLOC_DEFAULT ((*yylocp), (yyvsp - yyrhslen), yyrhslen);
-  yystackp->yyerror_range[1].yystate.yyloc = *yylocp;
-]])[]b4_glr_cc_if([[
+  yystackp->yyerror_range[1].yystate.yyloc = *yylocp;]])[
+  /* If yyk == -1, we are running a deferred action on a temporary
+     stack.  In that case, YY_REDUCE_PRINT must not play with YYFILL,
+     so pretend the stack is "normal". */
+  YY_REDUCE_PRINT ((yynormal || yyk == -1, yyvsp, yyk, yyrule]b4_user_args[));]b4_glr_cc_if([[
 #if YY_EXCEPTIONS
   typedef ]b4_namespace_ref[::]b4_parser_class[::syntax_error syntax_error;
   try
   {
 #endif // YY_EXCEPTIONS]])[
-  switch (yyn)
+  switch (yyrule)
     {
 ]b4_user_actions[
       default: break;
@@ -913,11 +961,13 @@
       YYERROR;
     }
 #endif // YY_EXCEPTIONS]])[
+  YY_SYMBOL_PRINT ("-> $$ =", yylhsNonterm (yyrule), yyvalp, yylocp);
 
   return yyok;
 # undef yyerrok
 # undef YYABORT
 # undef YYACCEPT
+# undef YYNOMEM
 # undef YYERROR
 # undef YYBACKUP
 # undef yyclearin
@@ -928,8 +978,8 @@
 static void
 yyuserMerge (int yyn, YYSTYPE* yy0, YYSTYPE* yy1)
 {
-  YYUSE (yy0);
-  YYUSE (yy1);
+  YY_USE (yy0);
+  YY_USE (yy1);
 
   switch (yyn)
     {
@@ -953,8 +1003,8 @@
 yydestroyGLRState (char const *yymsg, yyGLRState *yys]b4_user_formals[)
 {
   if (yys->yyresolved)
-    yydestruct (yymsg, yystos[yys->yylrState],
-                &yys->yysemantics.yysval]b4_locuser_args([&yys->yyloc])[);
+    yydestruct (yymsg, yy_accessing_symbol (yys->yylrState),
+                &yys->yysemantics.yyval]b4_locuser_args([&yys->yyloc])[);
   else
     {
 #if ]b4_api_PREFIX[DEBUG
@@ -964,7 +1014,7 @@
             YY_FPRINTF ((stderr, "%s unresolved", yymsg));
           else
             YY_FPRINTF ((stderr, "%s incomplete", yymsg));
-          YY_SYMBOL_PRINT ("", yystos[yys->yylrState], YY_NULLPTR, &yys->yyloc);
+          YY_SYMBOL_PRINT ("", yy_accessing_symbol (yys->yylrState), YY_NULLPTR, &yys->yyloc);
         }
 #endif
 
@@ -981,27 +1031,20 @@
     }
 }
 
-/** Left-hand-side symbol for rule #YYRULE.  */
-static inline yySymbol
-yylhsNonterm (yyRuleNum yyrule)
-{
-  return yyr1[yyrule];
-}
-
 #define yypact_value_is_default(Yyn) \
   ]b4_table_value_equals([[pact]], [[Yyn]], [b4_pact_ninf], [YYPACT_NINF])[
 
 /** True iff LR state YYSTATE has only a default reduction (regardless
  *  of token).  */
 static inline yybool
-yyisDefaultedState (yyStateNum yystate)
+yyisDefaultedState (yy_state_t yystate)
 {
   return yypact_value_is_default (yypact[yystate]);
 }
 
 /** The default reduction for YYSTATE, assuming it has one.  */
 static inline yyRuleNum
-yydefaultAction (yyStateNum yystate)
+yydefaultAction (yy_state_t yystate)
 {
   return yydefact[yystate];
 }
@@ -1018,11 +1061,17 @@
  *  of conflicting reductions.
  */
 static inline int
-yygetLRActions (yyStateNum yystate, yySymbol yytoken, const short** yyconflicts)
+yygetLRActions (yy_state_t yystate, yysymbol_kind_t yytoken, const short** yyconflicts)
 {
   int yyindex = yypact[yystate] + yytoken;
-  if (yyisDefaultedState (yystate)
-      || yyindex < 0 || YYLAST < yyindex || yycheck[yyindex] != yytoken)
+  if (yytoken == ]b4_symbol(error, kind)[)
+    {
+      // This is the error token.
+      *yyconflicts = yyconfl;
+      return 0;
+    }
+  else if (yyisDefaultedState (yystate)
+           || yyindex < 0 || YYLAST < yyindex || yycheck[yyindex] != yytoken)
     {
       *yyconflicts = yyconfl;
       return -yydefact[yystate];
@@ -1043,8 +1092,8 @@
  * \param yystate   the current state
  * \param yysym     the nonterminal to push on the stack
  */
-static inline yyStateNum
-yyLRgotoState (yyStateNum yystate, yySymbol yysym)
+static inline yy_state_t
+yyLRgotoState (yy_state_t yystate, yysymbol_kind_t yysym)
 {
   int yyr = yypgoto[yysym - YYNTOKENS] + yystate;
   if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate)
@@ -1087,7 +1136,7 @@
  *  alternative actions for YYSTATE.  Assumes that YYRHS comes from
  *  stack #YYK of *YYSTACKP. */
 static void
-yyaddDeferredAction (yyGLRStack* yystackp, ptrdiff_t yyk, yyGLRState* yystate,
+yyaddDeferredAction (yyGLRStack* yystackp, YYPTRDIFF_T yyk, yyGLRState* yystate,
                      yyGLRState* yyrhs, yyRuleNum yyrule)
 {
   yySemanticOption* yynewOption =
@@ -1102,7 +1151,7 @@
       yynewOption->yyloc = yylloc;])[
     }
   else
-    yynewOption->yyrawchar = YYEMPTY;
+    yynewOption->yyrawchar = ]b4_symbol(empty, id)[;
   yynewOption->yynext = yystate->yysemantics.yyfirstVal;
   yystate->yysemantics.yyfirstVal = yynewOption;
 
@@ -1119,14 +1168,14 @@
   yyset->yycapacity = 16;
   yyset->yystates
     = YY_CAST (yyGLRState**,
-               YYMALLOC (YY_CAST (size_t, yyset->yycapacity)
+               YYMALLOC (YY_CAST (YYSIZE_T, yyset->yycapacity)
                          * sizeof yyset->yystates[0]));
   if (! yyset->yystates)
     return yyfalse;
   yyset->yystates[0] = YY_NULLPTR;
   yyset->yylookaheadNeeds
     = YY_CAST (yybool*,
-               YYMALLOC (YY_CAST (size_t, yyset->yycapacity)
+               YYMALLOC (YY_CAST (YYSIZE_T, yyset->yycapacity)
                          * sizeof yyset->yylookaheadNeeds[0]));
   if (! yyset->yylookaheadNeeds)
     {
@@ -1135,7 +1184,7 @@
     }
   memset (yyset->yylookaheadNeeds,
           0,
-          YY_CAST (size_t, yyset->yycapacity) * sizeof yyset->yylookaheadNeeds[0]);
+          YY_CAST (YYSIZE_T, yyset->yycapacity) * sizeof yyset->yylookaheadNeeds[0]);
   return yytrue;
 }
 
@@ -1148,14 +1197,14 @@
 /** Initialize *YYSTACKP to a single empty stack, with total maximum
  *  capacity for all stacks of YYSIZE.  */
 static yybool
-yyinitGLRStack (yyGLRStack* yystackp, ptrdiff_t yysize)
+yyinitGLRStack (yyGLRStack* yystackp, YYPTRDIFF_T yysize)
 {
   yystackp->yyerrState = 0;
   yynerrs = 0;
   yystackp->yyspaceLeft = yysize;
   yystackp->yyitems
     = YY_CAST (yyGLRStackItem*,
-               YYMALLOC (YY_CAST (size_t, yysize)
+               YYMALLOC (YY_CAST (YYSIZE_T, yysize)
                          * sizeof yystackp->yynextFree[0]));
   if (!yystackp->yyitems)
     return yyfalse;
@@ -1181,9 +1230,9 @@
 {
   yyGLRStackItem* yynewItems;
   yyGLRStackItem* yyp0, *yyp1;
-  ptrdiff_t yynewSize;
-  ptrdiff_t yyn;
-  ptrdiff_t yysize = yystackp->yynextFree - yystackp->yyitems;
+  YYPTRDIFF_T yynewSize;
+  YYPTRDIFF_T yyn;
+  YYPTRDIFF_T yysize = yystackp->yynextFree - yystackp->yyitems;
   if (YYMAXDEPTH - YYHEADROOM < yysize)
     yyMemoryExhausted (yystackp);
   yynewSize = 2*yysize;
@@ -1191,7 +1240,7 @@
     yynewSize = YYMAXDEPTH;
   yynewItems
     = YY_CAST (yyGLRStackItem*,
-               YYMALLOC (YY_CAST (size_t, yynewSize)
+               YYMALLOC (YY_CAST (YYSIZE_T, yynewSize)
                          * sizeof yynewItems[0]));
   if (! yynewItems)
     yyMemoryExhausted (yystackp);
@@ -1256,7 +1305,7 @@
 
 /** Invalidate stack #YYK in *YYSTACKP.  */
 static inline void
-yymarkStackDeleted (yyGLRStack* yystackp, ptrdiff_t yyk)
+yymarkStackDeleted (yyGLRStack* yystackp, YYPTRDIFF_T yyk)
 {
   if (yystackp->yytops.yystates[yyk] != YY_NULLPTR)
     yystackp->yylastDeleted = yystackp->yytops.yystates[yyk];
@@ -1280,7 +1329,7 @@
 static inline void
 yyremoveDeletes (yyGLRStack* yystackp)
 {
-  ptrdiff_t yyi, yyj;
+  YYPTRDIFF_T yyi, yyj;
   yyi = yyj = 0;
   while (yyj < yystackp->yytops.yysize)
     {
@@ -1313,8 +1362,8 @@
  * state YYLRSTATE, at input position YYPOSN, with (resolved) semantic
  * value *YYVALP and source location *YYLOCP.  */
 static inline void
-yyglrShift (yyGLRStack* yystackp, ptrdiff_t yyk, yyStateNum yylrState,
-            ptrdiff_t yyposn,
+yyglrShift (yyGLRStack* yystackp, YYPTRDIFF_T yyk, yy_state_t yylrState,
+            YYPTRDIFF_T yyposn,
             YYSTYPE* yyvalp]b4_locations_if([, YYLTYPE* yylocp])[)
 {
   yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate;
@@ -1323,7 +1372,7 @@
   yynewState->yyposn = yyposn;
   yynewState->yyresolved = yytrue;
   yynewState->yypred = yystackp->yytops.yystates[yyk];
-  yynewState->yysemantics.yysval = *yyvalp;]b4_locations_if([
+  yynewState->yysemantics.yyval = *yyvalp;]b4_locations_if([
   yynewState->yyloc = *yylocp;])[
   yystackp->yytops.yystates[yyk] = yynewState;
 
@@ -1334,8 +1383,8 @@
  *  state YYLRSTATE, at input position YYPOSN, with the (unresolved)
  *  semantic value of YYRHS under the action for YYRULE.  */
 static inline void
-yyglrShiftDefer (yyGLRStack* yystackp, ptrdiff_t yyk, yyStateNum yylrState,
-                 ptrdiff_t yyposn, yyGLRState* yyrhs, yyRuleNum yyrule)
+yyglrShiftDefer (yyGLRStack* yystackp, YYPTRDIFF_T yyk, yy_state_t yylrState,
+                 YYPTRDIFF_T yyposn, yyGLRState* yyrhs, yyRuleNum yyrule)
 {
   yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate;
   YY_ASSERT (yynewState->yyisState);
@@ -1351,21 +1400,14 @@
   yyaddDeferredAction (yystackp, yyk, yynewState, yyrhs, yyrule);
 }
 
-#if !]b4_api_PREFIX[DEBUG
-# define YY_REDUCE_PRINT(Args)
-#else
-# define YY_REDUCE_PRINT(Args)          \
-  do {                                  \
-    if (yydebug)                        \
-      yy_reduce_print Args;             \
-  } while (0)
+#if ]b4_api_PREFIX[DEBUG
 
 /*----------------------------------------------------------------------.
 | Report that stack #YYK of *YYSTACKP is going to be reduced by YYRULE. |
 `----------------------------------------------------------------------*/
 
 static inline void
-yy_reduce_print (yybool yynormal, yyGLRStackItem* yyvsp, ptrdiff_t yyk,
+yy_reduce_print (yybool yynormal, yyGLRStackItem* yyvsp, YYPTRDIFF_T yyk,
                  yyRuleNum yyrule]b4_user_formals[)
 {
   int yynrhs = yyrhsLength (yyrule);]b4_locations_if([
@@ -1380,8 +1422,8 @@
     {
       YY_FPRINTF ((stderr, "   $%d = ", yyi + 1));
       yy_symbol_print (stderr,
-                       yystos[yyvsp[yyi - yynrhs + 1].yystate.yylrState],
-                       &yyvsp[yyi - yynrhs + 1].yystate.yysemantics.yysval]b4_locations_if([,
+                       yy_accessing_symbol (yyvsp[yyi - yynrhs + 1].yystate.yylrState),
+                       &yyvsp[yyi - yynrhs + 1].yystate.yysemantics.yyval]b4_locations_if([,
                        &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
                        b4_user_args[);
       if (!yyvsp[yyi - yynrhs + 1].yystate.yyresolved)
@@ -1398,7 +1440,7 @@
  *  and *YYLOCP to the computed location (if any).  Return value is as
  *  for userAction.  */
 static inline YYRESULTTAG
-yydoAction (yyGLRStack* yystackp, ptrdiff_t yyk, yyRuleNum yyrule,
+yydoAction (yyGLRStack* yystackp, YYPTRDIFF_T yyk, yyRuleNum yyrule,
             YYSTYPE* yyvalp]b4_locuser_formals[)
 {
   int yynrhs = yyrhsLength (yyrule);
@@ -1412,8 +1454,7 @@
       yystackp->yynextFree -= yynrhs;
       yystackp->yyspaceLeft += yynrhs;
       yystackp->yytops.yystates[0] = & yystackp->yynextFree[-1].yystate;
-      YY_REDUCE_PRINT ((yytrue, yyrhs, yyk, yyrule]b4_user_args[));
-      return yyuserAction (yyrule, yynrhs, yyrhs, yystackp,
+      return yyuserAction (yyrule, yynrhs, yyrhs, yystackp, yyk,
                            yyvalp]b4_locuser_args[);
     }
   else
@@ -1432,9 +1473,8 @@
         }
       yyupdateSplit (yystackp, yys);
       yystackp->yytops.yystates[yyk] = yys;
-      YY_REDUCE_PRINT ((yyfalse, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, yyk, yyrule]b4_user_args[));
       return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1,
-                           yystackp, yyvalp]b4_locuser_args[);
+                           yystackp, yyk, yyvalp]b4_locuser_args[);
     }
 }
 
@@ -1450,35 +1490,34 @@
  *  added to the options for the existing state's semantic value.
  */
 static inline YYRESULTTAG
-yyglrReduce (yyGLRStack* yystackp, ptrdiff_t yyk, yyRuleNum yyrule,
+yyglrReduce (yyGLRStack* yystackp, YYPTRDIFF_T yyk, yyRuleNum yyrule,
              yybool yyforceEval]b4_user_formals[)
 {
-  ptrdiff_t yyposn = yystackp->yytops.yystates[yyk]->yyposn;
+  YYPTRDIFF_T yyposn = yystackp->yytops.yystates[yyk]->yyposn;
 
   if (yyforceEval || yystackp->yysplitPoint == YY_NULLPTR)
     {
-      YYSTYPE yysval;]b4_locations_if([[
+      YYSTYPE yyval;]b4_locations_if([[
       YYLTYPE yyloc;]])[
 
-      YYRESULTTAG yyflag = yydoAction (yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[);
+      YYRESULTTAG yyflag = yydoAction (yystackp, yyk, yyrule, &yyval]b4_locuser_args([&yyloc])[);
       if (yyflag == yyerr && yystackp->yysplitPoint != YY_NULLPTR)
         YY_DPRINTF ((stderr,
                      "Parse on stack %ld rejected by rule %d (line %d).\n",
-                     YY_CAST (long, yyk), yyrule - 1, yyrline[yyrule - 1]));
+                     YY_CAST (long, yyk), yyrule - 1, yyrline[yyrule]));
       if (yyflag != yyok)
         return yyflag;
-      YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyrule], &yysval, &yyloc);
       yyglrShift (yystackp, yyk,
                   yyLRgotoState (yystackp->yytops.yystates[yyk]->yylrState,
                                  yylhsNonterm (yyrule)),
-                  yyposn, &yysval]b4_locations_if([, &yyloc])[);
+                  yyposn, &yyval]b4_locations_if([, &yyloc])[);
     }
   else
     {
-      ptrdiff_t yyi;
+      YYPTRDIFF_T yyi;
       int yyn;
       yyGLRState* yys, *yys0 = yystackp->yytops.yystates[yyk];
-      yyStateNum yynewLRState;
+      yy_state_t yynewLRState;
 
       for (yys = yystackp->yytops.yystates[yyk], yyn = yyrhsLength (yyrule);
            0 < yyn; yyn -= 1)
@@ -1491,7 +1530,7 @@
       YY_DPRINTF ((stderr,
                    "Reduced stack %ld by rule %d (line %d); action deferred.  "
                    "Now in state %d.\n",
-                   YY_CAST (long, yyk), yyrule - 1, yyrline[yyrule - 1],
+                   YY_CAST (long, yyk), yyrule - 1, yyrline[yyrule],
                    yynewLRState));
       for (yyi = 0; yyi < yystackp->yytops.yysize; yyi += 1)
         if (yyi != yyk && yystackp->yytops.yystates[yyi] != YY_NULLPTR)
@@ -1517,8 +1556,8 @@
   return yyok;
 }
 
-static ptrdiff_t
-yysplitStack (yyGLRStack* yystackp, ptrdiff_t yyk)
+static YYPTRDIFF_T
+yysplitStack (yyGLRStack* yystackp, YYPTRDIFF_T yyk)
 {
   if (yystackp->yysplitPoint == YY_NULLPTR)
     {
@@ -1527,8 +1566,8 @@
     }
   if (yystackp->yytops.yycapacity <= yystackp->yytops.yysize)
     {
-      ptrdiff_t state_size = sizeof yystackp->yytops.yystates[0];
-      ptrdiff_t half_max_capacity = YYSIZEMAX / 2 / state_size;
+      YYPTRDIFF_T state_size = YYSIZEOF (yystackp->yytops.yystates[0]);
+      YYPTRDIFF_T half_max_capacity = YYSIZE_MAXIMUM / 2 / state_size;
       if (half_max_capacity < yystackp->yytops.yycapacity)
         yyMemoryExhausted (yystackp);
       yystackp->yytops.yycapacity *= 2;
@@ -1537,7 +1576,7 @@
         yyGLRState** yynewStates
           = YY_CAST (yyGLRState**,
                      YYREALLOC (yystackp->yytops.yystates,
-                                (YY_CAST (size_t, yystackp->yytops.yycapacity)
+                                (YY_CAST (YYSIZE_T, yystackp->yytops.yycapacity)
                                  * sizeof yynewStates[0])));
         if (yynewStates == YY_NULLPTR)
           yyMemoryExhausted (yystackp);
@@ -1548,7 +1587,7 @@
         yybool* yynewLookaheadNeeds
           = YY_CAST (yybool*,
                      YYREALLOC (yystackp->yytops.yylookaheadNeeds,
-                                (YY_CAST (size_t, yystackp->yytops.yycapacity)
+                                (YY_CAST (YYSIZE_T, yystackp->yytops.yycapacity)
                                  * sizeof yynewLookaheadNeeds[0])));
         if (yynewLookaheadNeeds == YY_NULLPTR)
           yyMemoryExhausted (yystackp);
@@ -1602,12 +1641,12 @@
       else if (yys0->yyresolved)
         {
           yys1->yyresolved = yytrue;
-          yys1->yysemantics.yysval = yys0->yysemantics.yysval;
+          yys1->yysemantics.yyval = yys0->yysemantics.yyval;
         }
       else if (yys1->yyresolved)
         {
           yys0->yyresolved = yytrue;
-          yys0->yysemantics.yysval = yys1->yysemantics.yysval;
+          yys0->yysemantics.yyval = yys1->yysemantics.yyval;
         }
       else
         {
@@ -1661,8 +1700,8 @@
   return 0;
 }
 
-static YYRESULTTAG yyresolveValue (yyGLRState* yys,
-                                   yyGLRStack* yystackp]b4_user_formals[);
+static YYRESULTTAG
+yyresolveValue (yyGLRState* yys, yyGLRStack* yystackp]b4_user_formals[);
 
 
 /** Resolve the previous YYN states starting at and including state YYS
@@ -1718,7 +1757,7 @@
     yylloc = yyopt->yyloc;])[
     yyflag = yyuserAction (yyopt->yyrule, yynrhs,
                            yyrhsVals + YYMAXRHS + YYMAXLEFT - 1,
-                           yystackp, yyvalp]b4_locuser_args[);
+                           yystackp, -1, yyvalp]b4_locuser_args[);
     yychar = yychar_current;
     yylval = yylval_current;]b4_locations_if([
     yylloc = yylloc_current;])[
@@ -1748,11 +1787,11 @@
 
   if (yyx->yystate->yyposn < yys->yyposn + 1)
     YY_FPRINTF ((stderr, "%*s%s -> <Rule %d, empty>\n",
-                 yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)),
+                 yyindent, "", yysymbol_name (yylhsNonterm (yyx->yyrule)),
                  yyx->yyrule - 1));
   else
     YY_FPRINTF ((stderr, "%*s%s -> <Rule %d, tokens %ld .. %ld>\n",
-                 yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)),
+                 yyindent, "", yysymbol_name (yylhsNonterm (yyx->yyrule)),
                  yyx->yyrule - 1, YY_CAST (long, yys->yyposn + 1),
                  YY_CAST (long, yyx->yystate->yyposn)));
   for (yyi = 1; yyi <= yynrhs; yyi += 1)
@@ -1761,10 +1800,10 @@
         {
           if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn)
             YY_FPRINTF ((stderr, "%*s%s <empty>\n", yyindent+2, "",
-                         yytokenName (yystos[yystates[yyi]->yylrState])));
+                         yysymbol_name (yy_accessing_symbol (yystates[yyi]->yylrState))));
           else
             YY_FPRINTF ((stderr, "%*s%s <tokens %ld .. %ld>\n", yyindent+2, "",
-                         yytokenName (yystos[yystates[yyi]->yylrState]),
+                         yysymbol_name (yy_accessing_symbol (yystates[yyi]->yylrState)),
                          YY_CAST (long, yystates[yyi-1]->yyposn + 1),
                          YY_CAST (long, yystates[yyi]->yyposn)));
         }
@@ -1778,8 +1817,8 @@
 yyreportAmbiguity (yySemanticOption* yyx0,
                    yySemanticOption* yyx1]b4_pure_formals[)
 {
-  YYUSE (yyx0);
-  YYUSE (yyx1);
+  YY_USE (yyx0);
+  YY_USE (yyx1);
 
 #if ]b4_api_PREFIX[DEBUG
   YY_FPRINTF ((stderr, "Ambiguity detected.\n"));
@@ -1853,7 +1892,7 @@
   yySemanticOption* yybest = yyoptionList;
   yySemanticOption** yypp;
   yybool yymerge = yyfalse;
-  YYSTYPE yysval;
+  YYSTYPE yyval;
   YYRESULTTAG yyflag;]b4_locations_if([
   YYLTYPE *yylocp = &yys->yyloc;])[
 
@@ -1897,33 +1936,33 @@
     {
       yySemanticOption* yyp;
       int yyprec = yydprec[yybest->yyrule];
-      yyflag = yyresolveAction (yybest, yystackp, &yysval]b4_locuser_args[);
+      yyflag = yyresolveAction (yybest, yystackp, &yyval]b4_locuser_args[);
       if (yyflag == yyok)
         for (yyp = yybest->yynext; yyp != YY_NULLPTR; yyp = yyp->yynext)
           {
             if (yyprec == yydprec[yyp->yyrule])
               {
-                YYSTYPE yysval_other;]b4_locations_if([
+                YYSTYPE yyval_other;]b4_locations_if([
                 YYLTYPE yydummy;])[
-                yyflag = yyresolveAction (yyp, yystackp, &yysval_other]b4_locuser_args([&yydummy])[);
+                yyflag = yyresolveAction (yyp, yystackp, &yyval_other]b4_locuser_args([&yydummy])[);
                 if (yyflag != yyok)
                   {
                     yydestruct ("Cleanup: discarding incompletely merged value for",
-                                yystos[yys->yylrState],
-                                &yysval]b4_locuser_args[);
+                                yy_accessing_symbol (yys->yylrState),
+                                &yyval]b4_locuser_args[);
                     break;
                   }
-                yyuserMerge (yymerger[yyp->yyrule], &yysval, &yysval_other);
+                yyuserMerge (yymerger[yyp->yyrule], &yyval, &yyval_other);
               }
           }
     }
   else
-    yyflag = yyresolveAction (yybest, yystackp, &yysval]b4_locuser_args([yylocp])[);
+    yyflag = yyresolveAction (yybest, yystackp, &yyval]b4_locuser_args([yylocp])[);
 
   if (yyflag == yyok)
     {
       yys->yyresolved = yytrue;
-      yys->yysemantics.yysval = yysval;
+      yys->yysemantics.yyval = yyval;
     }
   else
     yys->yysemantics.yyfirstVal = YY_NULLPTR;
@@ -1948,18 +1987,24 @@
   return yyok;
 }
 
+/** Called when returning to deterministic operation to clean up the extra
+ * stacks. */
 static void
 yycompressStack (yyGLRStack* yystackp)
 {
-  yyGLRState* yyp, *yyq, *yyr;
+  /* yyr is the state after the split point.  */
+  yyGLRState *yyr;
 
   if (yystackp->yytops.yysize != 1 || yystackp->yysplitPoint == YY_NULLPTR)
     return;
 
-  for (yyp = yystackp->yytops.yystates[0], yyq = yyp->yypred, yyr = YY_NULLPTR;
-       yyp != yystackp->yysplitPoint;
-       yyr = yyp, yyp = yyq, yyq = yyp->yypred)
-    yyp->yypred = yyr;
+  {
+    yyGLRState *yyp, *yyq;
+    for (yyp = yystackp->yytops.yystates[0], yyq = yyp->yypred, yyr = YY_NULLPTR;
+         yyp != yystackp->yysplitPoint;
+         yyr = yyp, yyp = yyq, yyq = yyp->yypred)
+      yyp->yypred = yyr;
+  }
 
   yystackp->yyspaceLeft += yystackp->yynextFree - yystackp->yyitems;
   yystackp->yynextFree = YY_REINTERPRET_CAST (yyGLRStackItem*, yystackp->yysplitPoint) + 1;
@@ -1979,13 +2024,14 @@
 }
 
 static YYRESULTTAG
-yyprocessOneStack (yyGLRStack* yystackp, ptrdiff_t yyk,
-                   ptrdiff_t yyposn]b4_pure_formals[)
+yyprocessOneStack (yyGLRStack* yystackp, YYPTRDIFF_T yyk,
+                   YYPTRDIFF_T yyposn]b4_pure_formals[)
 {
   while (yystackp->yytops.yystates[yyk] != YY_NULLPTR)
     {
-      yyStateNum yystate = yystackp->yytops.yystates[yyk]->yylrState;
-      YY_DPRINTF ((stderr, "Stack %ld Entering state %d\n", YY_CAST (long, yyk), yystate));
+      yy_state_t yystate = yystackp->yytops.yystates[yyk]->yylrState;
+      YY_DPRINTF ((stderr, "Stack %ld Entering state %d\n",
+                   YY_CAST (long, yyk), yystate));
 
       YY_ASSERT (yystate != YYFINAL);
 
@@ -2014,15 +2060,15 @@
         }
       else
         {
-          yySymbol yytoken = ]b4_yygetToken_call[;
+          yysymbol_kind_t yytoken = ]b4_yygetToken_call[;
           const short* yyconflicts;
           const int yyaction = yygetLRActions (yystate, yytoken, &yyconflicts);
           yystackp->yytops.yylookaheadNeeds[yyk] = yytrue;
 
-          while (*yyconflicts != 0)
+          for (/* nothing */; *yyconflicts; yyconflicts += 1)
             {
               YYRESULTTAG yyflag;
-              ptrdiff_t yynewStack = yysplitStack (yystackp, yyk);
+              YYPTRDIFF_T yynewStack = yysplitStack (yystackp, yyk);
               YY_DPRINTF ((stderr, "Splitting off stack %ld from %ld.\n",
                            YY_CAST (long, yynewStack), YY_CAST (long, yyk)));
               yyflag = yyglrReduce (yystackp, yynewStack,
@@ -2038,7 +2084,6 @@
                 }
               else
                 return yyflag;
-              yyconflicts += 1;
             }
 
           if (yyisShiftAction (yyaction))
@@ -2070,29 +2115,82 @@
   return yyok;
 }
 
-static void
-yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
+]b4_parse_error_case([simple], [],
+[[/* Put in YYARG at most YYARGN of the expected tokens given the
+   current YYSTACKP, and return the number of tokens stored in YYARG.  If
+   YYARG is null, return the number of expected tokens (guaranteed to
+   be less than YYNTOKENS).  */
+static int
+yypcontext_expected_tokens (const yyGLRStack* yystackp,
+                            yysymbol_kind_t yyarg[], int yyargn)
 {
-  if (yystackp->yyerrState != 0)
-    return;
-#if ! YYERROR_VERBOSE
-  yyerror (]b4_lyyerror_args[YY_("syntax error"));
-#else
-  {
-  yySymbol yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
-  yybool yysize_overflow = yyfalse;
-  char* yymsg = YY_NULLPTR;
-  enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
-  /* Internationalized format string. */
-  const char *yyformat = YY_NULLPTR;
-  /* Arguments of yyformat: reported tokens (one for the "unexpected",
-     one per "expected"). */
-  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
   /* Actual size of YYARG. */
   int yycount = 0;
-  /* Cumulated lengths of YYARG.  */
-  ptrdiff_t yysize = 0;
+  int yyn = yypact[yystackp->yytops.yystates[0]->yylrState];
+  if (!yypact_value_is_default (yyn))
+    {
+      /* Start YYX at -YYN if negative to avoid negative indexes in
+         YYCHECK.  In other words, skip the first -YYN actions for
+         this state because they are default actions.  */
+      int yyxbegin = yyn < 0 ? -yyn : 0;
+      /* Stay within bounds of both yycheck and yytname.  */
+      int yychecklim = YYLAST - yyn + 1;
+      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+      int yyx;
+      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+        if (yycheck[yyx + yyn] == yyx && yyx != ]b4_symbol(error, kind)[
+            && !yytable_value_is_error (yytable[yyx + yyn]))
+          {
+            if (!yyarg)
+              ++yycount;
+            else if (yycount == yyargn)
+              return 0;
+            else
+              yyarg[yycount++] = YY_CAST (yysymbol_kind_t, yyx);
+          }
+    }
+  if (yyarg && yycount == 0 && 0 < yyargn)
+    yyarg[0] = ]b4_symbol(empty, kind)[;
+  return yycount;
+}]])[
 
+]b4_parse_error_bmatch(
+         [custom],
+[[/* User defined function to report a syntax error.  */
+typedef yyGLRStack yypcontext_t;
+static int
+yyreport_syntax_error (const yyGLRStack* yystackp]b4_user_formals[);
+
+/* The kind of the lookahead of this context.  */
+static yysymbol_kind_t
+yypcontext_token (const yyGLRStack *yystackp) YY_ATTRIBUTE_UNUSED;
+
+static yysymbol_kind_t
+yypcontext_token (const yyGLRStack *yystackp)
+{
+  YY_USE (yystackp);
+  yysymbol_kind_t yytoken = yychar == ]b4_symbol(empty, id)[ ? ]b4_symbol(empty, kind)[ : YYTRANSLATE (yychar);
+  return yytoken;
+}
+
+]b4_locations_if([[/* The location of the lookahead of this context.  */
+static const YYLTYPE *
+yypcontext_location (const yyGLRStack *yystackp) YY_ATTRIBUTE_UNUSED;
+
+static const YYLTYPE *
+yypcontext_location (const yyGLRStack *yystackp)
+{
+  YY_USE (yystackp);
+  return &yylloc;
+}]])],
+         [detailed\|verbose],
+[[static int
+yy_syntax_error_arguments (const yyGLRStack* yystackp,
+                           yysymbol_kind_t yyarg[], int yyargn)
+{
+  yysymbol_kind_t yytoken = yychar == ]b4_symbol(empty, id)[ ? ]b4_symbol(empty, kind)[ : YYTRANSLATE (yychar);
+  /* Actual size of YYARG. */
+  int yycount = 0;
   /* There are many possibilities here to consider:
      - If this state is a consistent state with a default action, then
        the only way this function was invoked is if the default action
@@ -2116,43 +2214,52 @@
        one exception: it will still contain any token that will not be
        accepted due to an error action in a later state.
   */
-  if (yytoken != YYEMPTY)
+  if (yytoken != ]b4_symbol(empty, kind)[)
     {
-      int yyn = yypact[yystackp->yytops.yystates[0]->yylrState];
-      ptrdiff_t yysize0 = yytnamerr (YY_NULLPTR, yytokenName (yytoken));
-      yysize = yysize0;
-      yyarg[yycount++] = yytokenName (yytoken);
-      if (!yypact_value_is_default (yyn))
-        {
-          /* Start YYX at -YYN if negative to avoid negative indexes in
-             YYCHECK.  In other words, skip the first -YYN actions for this
-             state because they are default actions.  */
-          int yyxbegin = yyn < 0 ? -yyn : 0;
-          /* Stay within bounds of both yycheck and yytname.  */
-          int yychecklim = YYLAST - yyn + 1;
-          int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-          int yyx;
-          for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
-                && !yytable_value_is_error (yytable[yyx + yyn]))
-              {
-                if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-                  {
-                    yycount = 1;
-                    yysize = yysize0;
-                    break;
-                  }
-                yyarg[yycount++] = yytokenName (yyx);
-                {
-                  ptrdiff_t yysz = yytnamerr (YY_NULLPTR, yytokenName (yyx));
-                  if (YYSIZEMAX - yysize < yysz)
-                    yysize_overflow = yytrue;
-                  else
-                    yysize += yysz;
-                }
-              }
-        }
+      int yyn;
+      if (yyarg)
+        yyarg[yycount] = yytoken;
+      ++yycount;
+      yyn = yypcontext_expected_tokens (yystackp,
+                                        yyarg ? yyarg + 1 : yyarg, yyargn - 1);
+      if (yyn == YYENOMEM)
+        return YYENOMEM;
+      else
+        yycount += yyn;
     }
+  return yycount;
+}
+]])[
+
+
+static void
+yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
+{
+  if (yystackp->yyerrState != 0)
+    return;
+]b4_parse_error_case(
+         [custom],
+[[  if (yyreport_syntax_error (yystackp]b4_user_args[))
+    yyMemoryExhausted (yystackp);]],
+         [simple],
+[[  yyerror (]b4_lyyerror_args[YY_("syntax error"));]],
+[[  {
+  yybool yysize_overflow = yyfalse;
+  char* yymsg = YY_NULLPTR;
+  enum { YYARGS_MAX = 5 };
+  /* Internationalized format string. */
+  const char *yyformat = YY_NULLPTR;
+  /* Arguments of yyformat: reported tokens (one for the "unexpected",
+     one per "expected"). */
+  yysymbol_kind_t yyarg[YYARGS_MAX];
+  /* Cumulated lengths of YYARG.  */
+  YYPTRDIFF_T yysize = 0;
+
+  /* Actual size of YYARG. */
+  int yycount
+    = yy_syntax_error_arguments (yystackp, yyarg, YYARGS_MAX);
+  if (yycount == YYENOMEM)
+    yyMemoryExhausted (yystackp);
 
   switch (yycount)
     {
@@ -2170,18 +2277,26 @@
 #undef YYCASE_
     }
 
+  /* Compute error message size.  Don't count the "%s"s, but reserve
+     room for the terminator.  */
+  yysize = yystrlen (yyformat) - 2 * yycount + 1;
   {
-    /* Don't count the "%s"s in the final size, but reserve room for
-       the terminator.  */
-    ptrdiff_t yysz = YY_CAST (ptrdiff_t, strlen (yyformat)) - 2 * yycount + 1;
-    if (YYSIZEMAX - yysize < yysz)
-      yysize_overflow = yytrue;
-    else
-      yysize += yysz;
+    int yyi;
+    for (yyi = 0; yyi < yycount; ++yyi)
+      {
+        YYPTRDIFF_T yysz
+          = ]b4_parse_error_case(
+                     [verbose], [[yytnamerr (YY_NULLPTR, yytname[yyarg[yyi]])]],
+                     [[yystrlen (yysymbol_name (yyarg[yyi]))]]);[
+        if (YYSIZE_MAXIMUM - yysize < yysz)
+          yysize_overflow = yytrue;
+        else
+          yysize += yysz;
+      }
   }
 
   if (!yysize_overflow)
-    yymsg = YY_CAST (char *, YYMALLOC (YY_CAST (size_t, yysize)));
+    yymsg = YY_CAST (char *, YYMALLOC (YY_CAST (YYSIZE_T, yysize)));
 
   if (yymsg)
     {
@@ -2190,8 +2305,9 @@
       while ((*yyp = *yyformat))
         {
           if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
-            {
-              yyp += yytnamerr (yyp, yyarg[yyi++]);
+            {]b4_parse_error_case([verbose], [[
+              yyp += yytnamerr (yyp, yytname[yyarg[yyi++]]);]], [[
+              yyp = yystpcpy (yyp, yysymbol_name (yyarg[yyi++]));]])[
               yyformat += 2;
             }
           else
@@ -2208,8 +2324,7 @@
       yyerror (]b4_lyyerror_args[YY_("syntax error"));
       yyMemoryExhausted (yystackp);
     }
-  }
-#endif /* YYERROR_VERBOSE */
+  }]])[
   yynerrs += 1;
 }
 
@@ -2224,11 +2339,11 @@
        reductions.  Skip tokens until we can proceed.  */
     while (yytrue)
       {
-        yySymbol yytoken;
+        yysymbol_kind_t yytoken;
         int yyj;
-        if (yychar == YYEOF)
+        if (yychar == ]b4_symbol(eof, [id])[)
           yyFail (yystackp][]b4_lpure_args[, YY_NULLPTR);
-        if (yychar != YYEMPTY)
+        if (yychar != ]b4_symbol(empty, id)[)
           {]b4_locations_if([[
             /* We throw away the lookahead, but the error range
                of the shifted error token must take it into account.  */
@@ -2240,7 +2355,7 @@
             yytoken = YYTRANSLATE (yychar);
             yydestruct ("Error: discarding",
                         yytoken, &yylval]b4_locuser_args([&yylloc])[);
-            yychar = YYEMPTY;
+            yychar = ]b4_symbol(empty, id)[;
           }
         yytoken = ]b4_yygetToken_call[;
         yyj = yypact[yystackp->yytops.yystates[0]->yylrState];
@@ -2258,7 +2373,7 @@
 
   /* Reduce to one stack.  */
   {
-    ptrdiff_t yyk;
+    YYPTRDIFF_T yyk;
     for (yyk = 0; yyk < yystackp->yytops.yysize; yyk += 1)
       if (yystackp->yytops.yystates[yyk] != YY_NULLPTR)
         break;
@@ -2270,7 +2385,7 @@
     yycompressStack (yystackp);
   }
 
-  /* Now pop stack until we find a state that shifts the error token.  */
+  /* Pop stack until we find a state that shifts the error token.  */
   yystackp->yyerrState = 3;
   while (yystackp->yytops.yystates[0] != YY_NULLPTR)
     {
@@ -2278,8 +2393,8 @@
       int yyj = yypact[yys->yylrState];
       if (! yypact_value_is_default (yyj))
         {
-          yyj += YYTERROR;
-          if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR
+          yyj += ]b4_symbol(error, kind)[;
+          if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == ]b4_symbol(error, kind)[
               && yyisShiftAction (yytable[yyj]))
             {
               /* Shift the error token.  */
@@ -2288,7 +2403,7 @@
               YYLTYPE yyerrloc;
               yystackp->yyerror_range[2].yystate.yyloc = yylloc;
               YYLLOC_DEFAULT (yyerrloc, (yystackp->yyerror_range), 2);]])[
-              YY_SYMBOL_PRINT ("Shifting", yystos[yyaction],
+              YY_SYMBOL_PRINT ("Shifting", yy_accessing_symbol (yyaction),
                                &yylval, &yyerrloc);
               yyglrShift (yystackp, 0, yyaction,
                           yys->yyposn, &yylval]b4_locations_if([, &yyerrloc])[);
@@ -2307,36 +2422,33 @@
     yyFail (yystackp][]b4_lpure_args[, YY_NULLPTR);
 }
 
-#define YYCHK1(YYE)                                                          \
-  do {                                                                       \
-    switch (YYE) {                                                           \
-    case yyok:                                                               \
-      break;                                                                 \
-    case yyabort:                                                            \
-      goto yyabortlab;                                                       \
-    case yyaccept:                                                           \
-      goto yyacceptlab;                                                      \
-    case yyerr:                                                              \
-      goto yyuser_error;                                                     \
-    default:                                                                 \
-      goto yybuglab;                                                         \
-    }                                                                        \
+#define YYCHK1(YYE)                             \
+  do {                                          \
+    switch (YYE) {                              \
+    case yyok:     break;                       \
+    case yyabort:  goto yyabortlab;             \
+    case yyaccept: goto yyacceptlab;            \
+    case yyerr:    goto yyuser_error;           \
+    case yynomem:  goto yyexhaustedlab;         \
+    default:       goto yybuglab;               \
+    }                                           \
   } while (0)
 
 /*----------.
 | yyparse.  |
 `----------*/
 
-]b4_function_define([yyparse], [int], b4_parse_param)[
+int
+]b4_glr_cc_if([yy_parse_impl], [yyparse])[ (]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param)], [void])[)
 {
   int yyresult;
   yyGLRStack yystack;
   yyGLRStack* const yystackp = &yystack;
-  ptrdiff_t yyposn;
+  YYPTRDIFF_T yyposn;
 
   YY_DPRINTF ((stderr, "Starting parse\n"));
 
-  yychar = YYEMPTY;
+  yychar = ]b4_symbol(empty, id)[;
   yylval = yyval_default;]b4_locations_if([
   yylloc = yyloc_default;])[
 ]m4_ifdef([b4_initial_action], [
@@ -2361,10 +2473,10 @@
       /* For efficiency, we have two loops, the first of which is
          specialized to deterministic operation (single stack, no
          potential ambiguity).  */
-      /* Standard mode */
+      /* Standard mode. */
       while (yytrue)
         {
-          yyStateNum yystate = yystack.yytops.yystates[0]->yylrState;
+          yy_state_t yystate = yystack.yytops.yystates[0]->yylrState;
           YY_DPRINTF ((stderr, "Entering state %d\n", yystate));
           if (yystate == YYFINAL)
             goto yyacceptlab;
@@ -2381,15 +2493,16 @@
             }
           else
             {
-              yySymbol yytoken = ]b4_yygetToken_call;[
+              yysymbol_kind_t yytoken = ]b4_yygetToken_call;[
               const short* yyconflicts;
               int yyaction = yygetLRActions (yystate, yytoken, &yyconflicts);
-              if (*yyconflicts != 0)
+              if (*yyconflicts)
+                /* Enter nondeterministic mode.  */
                 break;
               if (yyisShiftAction (yyaction))
                 {
                   YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-                  yychar = YYEMPTY;
+                  yychar = ]b4_symbol(empty, id)[;
                   yyposn += 1;
                   yyglrShift (&yystack, 0, yyaction, yyposn, &yylval]b4_locations_if([, &yylloc])[);
                   if (0 < yystack.yyerrState)
@@ -2397,11 +2510,11 @@
                 }
               else if (yyisErrorAction (yyaction))
                 {]b4_locations_if([[
-                  yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[]b4_glr_cc_if([[
-                  /* Don't issue an error message again for exceptions
-                     thrown from the scanner.  */
-                  if (yychar != YYFAULTYTOK)
-  ]])[                  yyreportSyntaxError (&yystack]b4_user_args[);
+                  yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[
+                  /* Issue an error message unless the scanner already
+                     did. */
+                  if (yychar != ]b4_symbol(error, id)[)
+                    yyreportSyntaxError (&yystack]b4_user_args[);
                   goto yyuser_error;
                 }
               else
@@ -2409,13 +2522,14 @@
             }
         }
 
+      /* Nondeterministic mode. */
       while (yytrue)
         {
-          yySymbol yytoken_to_shift;
-          ptrdiff_t yys;
+          yysymbol_kind_t yytoken_to_shift;
+          YYPTRDIFF_T yys;
 
           for (yys = 0; yys < yystack.yytops.yysize; yys += 1)
-            yystackp->yytops.yylookaheadNeeds[yys] = yychar != YYEMPTY;
+            yystackp->yytops.yylookaheadNeeds[yys] = yychar != ]b4_symbol(empty, id)[;
 
           /* yyprocessOneStack returns one of three things:
 
@@ -2453,15 +2567,15 @@
 
           /* If any yyglrShift call fails, it will fail after shifting.  Thus,
              a copy of yylval will already be on stack 0 in the event of a
-             failure in the following loop.  Thus, yychar is set to YYEMPTY
+             failure in the following loop.  Thus, yychar is set to ]b4_symbol(empty, id)[
              before the loop to make sure the user destructor for yylval isn't
              called twice.  */
           yytoken_to_shift = YYTRANSLATE (yychar);
-          yychar = YYEMPTY;
+          yychar = ]b4_symbol(empty, id)[;
           yyposn += 1;
           for (yys = 0; yys < yystack.yytops.yysize; yys += 1)
             {
-              yyStateNum yystate = yystack.yytops.yystates[yys]->yylrState;
+              yy_state_t yystate = yystack.yytops.yystates[yys]->yylrState;
               const short* yyconflicts;
               int yyaction = yygetLRActions (yystate, yytoken_to_shift,
                               &yyconflicts);
@@ -2470,7 +2584,7 @@
               YY_SYMBOL_PRINT ("shifting", yytoken_to_shift, &yylval, &yylloc);
               yyglrShift (&yystack, yys, yyaction, yyposn,
                           &yylval]b4_locations_if([, &yylloc])[);
-              YY_DPRINTF ((stderr, "Stack %ld now in state #%d\n",
+              YY_DPRINTF ((stderr, "Stack %ld now in state %d\n",
                            YY_CAST (long, yys),
                            yystack.yytops.yystates[yys]->yylrState));
             }
@@ -2491,7 +2605,7 @@
 
  yyacceptlab:
   yyresult = 0;
-  goto yyreturn;
+  goto yyreturnlab;
 
  yybuglab:
   YY_ASSERT (yyfalse);
@@ -2499,15 +2613,15 @@
 
  yyabortlab:
   yyresult = 1;
-  goto yyreturn;
+  goto yyreturnlab;
 
  yyexhaustedlab:
   yyerror (]b4_lyyerror_args[YY_("memory exhausted"));
   yyresult = 2;
-  goto yyreturn;
+  goto yyreturnlab;
 
- yyreturn:
-  if (yychar != YYEMPTY)
+ yyreturnlab:
+  if (yychar != ]b4_symbol(empty, id)[)
     yydestruct ("Cleanup: discarding lookahead",
                 YYTRANSLATE (yychar), &yylval]b4_locuser_args([&yylloc])[);
 
@@ -2519,8 +2633,8 @@
       yyGLRState** yystates = yystack.yytops.yystates;
       if (yystates)
         {
-          ptrdiff_t yysize = yystack.yytops.yysize;
-          ptrdiff_t yyk;
+          YYPTRDIFF_T yysize = yystack.yytops.yysize;
+          YYPTRDIFF_T yyk;
           for (yyk = 0; yyk < yysize; yyk += 1)
             if (yystates[yyk])
               {
@@ -2545,6 +2659,7 @@
 
 /* DEBUGGING ONLY */
 #if ]b4_api_PREFIX[DEBUG
+/* Print *YYS and its predecessors. */
 static void
 yy_yypstack (yyGLRState* yys)
 {
@@ -2556,22 +2671,25 @@
   YY_FPRINTF ((stderr, "%d@@%ld", yys->yylrState, YY_CAST (long, yys->yyposn)));
 }
 
+/* Print YYS (possibly NULL) and its predecessors. */
 static void
-yypstates (yyGLRState* yyst)
+yypstates (yyGLRState* yys)
 {
-  if (yyst == YY_NULLPTR)
+  if (yys == YY_NULLPTR)
     YY_FPRINTF ((stderr, "<null>"));
   else
-    yy_yypstack (yyst);
+    yy_yypstack (yys);
   YY_FPRINTF ((stderr, "\n"));
 }
 
+/* Print the stack #YYK.  */
 static void
-yypstack (yyGLRStack* yystackp, ptrdiff_t yyk)
+yypstack (yyGLRStack* yystackp, YYPTRDIFF_T yyk)
 {
   yypstates (yystackp->yytops.yystates[yyk]);
 }
 
+/* Print all the stacks.  */
 static void
 yypdumpstack (yyGLRStack* yystackp)
 {
@@ -2612,7 +2730,7 @@
 
   YY_FPRINTF ((stderr, "Tops:"));
   {
-    ptrdiff_t yyi;
+    YYPTRDIFF_T yyi;
     for (yyi = 0; yyi < yystackp->yytops.yysize; yyi += 1)
       YY_FPRINTF ((stderr, "%ld: %ld; ", YY_CAST (long, yyi),
                    YYINDEX (yystackp->yytops.yystates[yyi])));
@@ -2638,5 +2756,8 @@
 #define yynerrs ]b4_prefix[nerrs]b4_locations_if([[
 #define yylloc  ]b4_prefix[lloc]])])[
 
-]b4_epilogue[]dnl
+]b4_glr_cc_if([b4_glr_cc_pre_epilogue
+b4_glr_cc_cleanup])[
+]b4_percent_code_get([[epilogue]])[]dnl
+b4_epilogue[]dnl
 b4_output_end
diff --git a/data/skeletons/glr.cc b/data/skeletons/glr.cc
index 343b52e..7181402 100644
--- a/data/skeletons/glr.cc
+++ b/data/skeletons/glr.cc
@@ -1,6 +1,6 @@
 # C++ GLR skeleton for Bison
 
-# Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 
 # This skeleton produces a C++ class that encapsulates a C glr parser.
@@ -72,24 +72,17 @@
 # Bypass the default implementation to generate the "yy_symbol_print"
 # and "yy_symbol_value_print" functions.
 m4_define([b4_yy_symbol_print_define],
-[[
-/*--------------------.
+[[/*--------------------.
 | Print this symbol.  |
 `--------------------*/
 
-]b4_function_define([yy_symbol_print],
-    [static void],
-    [[FILE *],      []],
-    [[int yytype],  [yytype]],
-    [[const ]b4_namespace_ref::b4_parser_class[::semantic_type *yyvaluep],
-                    [yyvaluep]][]dnl
-b4_locations_if([,
-    [[const ]b4_namespace_ref::b4_parser_class[::location_type *yylocationp],
-                    [yylocationp]]]),
-    b4_parse_param)[
+static void
+yy_symbol_print (FILE *, ]b4_namespace_ref::b4_parser_class[::symbol_kind_type yytoken,
+                 const ]b4_namespace_ref::b4_parser_class[::value_type *yyvaluep]b4_locations_if([[,
+                 const ]b4_namespace_ref::b4_parser_class[::location_type *yylocationp]])[]b4_user_formals[)
 {
 ]b4_parse_param_use[]dnl
-[  yyparser.yy_symbol_print_ (yytype, yyvaluep]b4_locations_if([, yylocationp])[);
+[  yyparser.yy_symbol_print_ (yytoken, yyvaluep]b4_locations_if([, yylocationp])[);
 }
 ]])[
 
@@ -101,45 +94,24 @@
 # Hijack the post prologue to declare yyerror.
 ]m4_append([b4_post_prologue],
 [b4_syncline([@oline@], [@ofile@])dnl
-b4_function_declare([yyerror],
-    [static void],b4_locations_if([
-    [[const ]b4_namespace_ref::b4_parser_class[::location_type *yylocationp],
-                        [yylocationp]],])
-    b4_parse_param,
-    [[const char* msg], [msg]])])[
+[static void
+yyerror (]b4_locations_if([[const ]b4_namespace_ref::b4_parser_class[::location_type *yylocationp,
+         ]])[]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param),
+         ])[const char* msg);]])[
 
-
-#undef yynerrs
-#undef yychar
-#undef yylval]b4_locations_if([
-#undef yylloc])
-
-m4_if(b4_prefix, [yy], [],
-[[/* Substitute the variable and function names.  */
-#define yyparse ]b4_prefix[parse
-#define yylex   ]b4_prefix[lex
-#define yyerror ]b4_prefix[error
-#define yydebug ]b4_prefix[debug]]b4_pure_if([], [[
-#define yylval  ]b4_prefix[lval
-#define yychar  ]b4_prefix[char
-#define yynerrs ]b4_prefix[nerrs]b4_locations_if([[
-#define yylloc  ]b4_prefix[lloc]])]))
-
-# Hijack the epilogue to define implementations (yyerror, parser member
+# Inserted before the epilogue to define implementations (yyerror, parser member
 # functions etc.).
-m4_append([b4_epilogue],
+]m4_define([b4_glr_cc_pre_epilogue],
 [b4_syncline([@oline@], [@ofile@])dnl
 [
 /*------------------.
 | Report an error.  |
 `------------------*/
 
-]b4_function_define([yyerror],
-    [static void],b4_locations_if([
-    [[const ]b4_namespace_ref::b4_parser_class[::location_type *yylocationp],
-                        [yylocationp]],])
-    b4_parse_param,
-    [[const char* msg], [msg]])[
+static void
+yyerror (]b4_locations_if([[const ]b4_namespace_ref::b4_parser_class[::location_type *yylocationp,
+         ]])[]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param),
+         ])[const char* msg)
 {
 ]b4_parse_param_use[]dnl
 [  yyparser.error (]b4_locations_if([[*yylocationp, ]])[msg);
@@ -172,7 +144,7 @@
   int
   ]b4_parser_class[::parse ()
   {
-    return ::yyparse (*this]b4_user_args[);
+    return ::yy_parse_impl (*this]b4_user_args[);
   }
 
 #if ]b4_api_PREFIX[DEBUG
@@ -181,28 +153,28 @@
   `--------------------*/
 
   void
-  ]b4_parser_class[::yy_symbol_value_print_ (int yytype,
-                           const semantic_type* yyvaluep]b4_locations_if([[,
-                           const location_type* yylocationp]])[)
+  ]b4_parser_class[::yy_symbol_value_print_ (symbol_kind_type yykind,
+                           const value_type* yyvaluep]b4_locations_if([[,
+                           const location_type* yylocationp]])[) const
   {]b4_locations_if([[
-    YYUSE (yylocationp);]])[
-    YYUSE (yyvaluep);
+    YY_USE (yylocationp);]])[
+    YY_USE (yyvaluep);
     std::ostream& yyo = debug_stream ();
     std::ostream& yyoutput = yyo;
-    YYUSE (yyoutput);
+    YY_USE (yyoutput);
     ]b4_symbol_actions([printer])[
   }
 
 
   void
-  ]b4_parser_class[::yy_symbol_print_ (int yytype,
-                           const semantic_type* yyvaluep]b4_locations_if([[,
-                           const location_type* yylocationp]])[)
+  ]b4_parser_class[::yy_symbol_print_ (symbol_kind_type yykind,
+                           const value_type* yyvaluep]b4_locations_if([[,
+                           const location_type* yylocationp]])[) const
   {
-    *yycdebug_ << (yytype < YYNTOKENS ? "token" : "nterm")
-               << ' ' << yytname[yytype] << " ("]b4_locations_if([[
+    *yycdebug_ << (yykind < YYNTOKENS ? "token" : "nterm")
+               << ' ' << yysymbol_name (yykind) << " ("]b4_locations_if([[
                << *yylocationp << ": "]])[;
-    yy_symbol_value_print_ (yytype, yyvaluep]b4_locations_if([[, yylocationp]])[);
+    yy_symbol_value_print_ (yykind, yyvaluep]b4_locations_if([[, yylocationp]])[);
     *yycdebug_ << ')';
   }
 
@@ -238,23 +210,18 @@
 ])
 
 
-# b4_shared_declarations(hh|cc)
-# -----------------------------
-# Declaration that might either go into the header (if --defines, $1 = hh)
-# or in the implementation file.
-m4_define([b4_shared_declarations],
-[m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
-b4_percent_code_get([[requires]])[
-#include <iostream>
-#include <stdexcept>
-#include <string>
+m4_define([b4_define_symbol_kind],
+[m4_format([#define %-15s %s],
+           b4_symbol($][1, kind_base),
+           b4_namespace_ref[::]b4_parser_class[::symbol_kind::]b4_symbol($1, kind_base))
+])
 
-]b4_cxx_portability[
-]m4_ifdef([b4_location_include],
-          [[# include ]b4_location_include])[
-]b4_variant_if([b4_variant_includes])[
-
-]b4_attribute_define[
+# b4_glr_cc_setup
+# ---------------
+# Setup redirections for glr.c: Map the names used in c.m4 to the ones used
+# in c++.m4.
+m4_define([b4_glr_cc_setup],
+[[]b4_attribute_define[
 ]b4_null_define[
 
 // This skeleton is based on C, yet compiles it as C++.
@@ -267,10 +234,67 @@
 
 // On MacOS, PTRDIFF_MAX is defined as long long, which Clang's
 // -pedantic reports as being a C++11 extension.
-#if defined __APPLE__ && YY_CPLUSPLUS < 201103L && 4 <= __clang_major__
+#if defined __APPLE__ && YY_CPLUSPLUS < 201103L \
+    && defined __clang__ && 4 <= __clang_major__
 # pragma clang diagnostic ignored "-Wc++11-long-long"
 #endif
 
+#undef ]b4_symbol(empty, [id])[
+#define ]b4_symbol(empty, [id])[ ]b4_namespace_ref[::]b4_parser_class[::token::]b4_symbol(empty, [id])[
+#undef ]b4_symbol(eof, [id])[
+#define ]b4_symbol(eof, [id])[ ]b4_namespace_ref[::]b4_parser_class[::token::]b4_symbol(eof, [id])[
+#undef ]b4_symbol(error, [id])[
+#define ]b4_symbol(error, [id])[ ]b4_namespace_ref[::]b4_parser_class[::token::]b4_symbol(error, [id])[
+
+#ifndef ]b4_api_PREFIX[STYPE
+# define ]b4_api_PREFIX[STYPE ]b4_namespace_ref[::]b4_parser_class[::value_type
+#endif
+#ifndef ]b4_api_PREFIX[LTYPE
+# define ]b4_api_PREFIX[LTYPE ]b4_namespace_ref[::]b4_parser_class[::location_type
+#endif
+
+typedef ]b4_namespace_ref[::]b4_parser_class[::symbol_kind_type yysymbol_kind_t;
+
+// Expose C++ symbol kinds to C.
+]b4_define_symbol_kind(-2)dnl
+b4_symbol_foreach([b4_define_symbol_kind])])[
+]])
+
+
+m4_define([b4_undef_symbol_kind],
+[[#undef ]b4_symbol($1, kind_base)[
+]])
+
+
+# b4_glr_cc_cleanup
+# -----------------
+# Remove redirections for glr.c.
+m4_define([b4_glr_cc_cleanup],
+[[#undef ]b4_symbol(empty, [id])[
+#undef ]b4_symbol(eof, [id])[
+#undef ]b4_symbol(error, [id])[
+
+]b4_undef_symbol_kind(-2)dnl
+b4_symbol_foreach([b4_undef_symbol_kind])dnl
+])
+
+
+# b4_shared_declarations(hh|cc)
+# -----------------------------
+# Declaration that might either go into the header (if --header, $1 = hh)
+# or in the implementation file.
+m4_define([b4_shared_declarations],
+[m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
+b4_percent_code_get([[requires]])[
+#include <iostream>
+#include <stdexcept>
+#include <string>
+
+]b4_cxx_portability[
+]m4_ifdef([b4_location_include],
+          [[# include ]b4_location_include])[
+]b4_variant_if([b4_variant_includes])[
+
 // Whether we are compiled with exception support.
 #ifndef YY_EXCEPTIONS
 # if defined __GNUC__ && !defined __EXCEPTIONS
@@ -327,53 +351,43 @@
 # if ]b4_api_PREFIX[DEBUG
   public:
     /// \brief Report a symbol value on the debug stream.
-    /// \param yytype       The token type.
+    /// \param yykind       The symbol kind.
     /// \param yyvaluep     Its semantic value.]b4_locations_if([[
     /// \param yylocationp  Its location.]])[
-    virtual void yy_symbol_value_print_ (int yytype,
-                                         const semantic_type* yyvaluep]b4_locations_if([[,
-                                         const location_type* yylocationp]])[);
+    virtual void yy_symbol_value_print_ (symbol_kind_type yykind,
+                                         const value_type* yyvaluep]b4_locations_if([[,
+                                         const location_type* yylocationp]])[) const;
     /// \brief Report a symbol on the debug stream.
-    /// \param yytype       The token type.
+    /// \param yykind       The symbol kind.
     /// \param yyvaluep     Its semantic value.]b4_locations_if([[
     /// \param yylocationp  Its location.]])[
-    virtual void yy_symbol_print_ (int yytype,
-                                   const semantic_type* yyvaluep]b4_locations_if([[,
-                                   const location_type* yylocationp]])[);
+    virtual void yy_symbol_print_ (symbol_kind_type yykind,
+                                   const value_type* yyvaluep]b4_locations_if([[,
+                                   const location_type* yylocationp]])[) const;
   private:
-    // Debugging.
+    /// Debug stream.
     std::ostream* yycdebug_;
 #endif
 
 ]b4_parse_param_vars[
   };
 
-]dnl Redirections for glr.c.
-b4_percent_define_flag_if([[global_tokens_and_yystype]],
-[b4_token_defines])
-[
-#ifndef ]b4_api_PREFIX[STYPE
-# define ]b4_api_PREFIX[STYPE ]b4_namespace_ref[::]b4_parser_class[::semantic_type
-#endif
-#ifndef ]b4_api_PREFIX[LTYPE
-# define ]b4_api_PREFIX[LTYPE ]b4_namespace_ref[::]b4_parser_class[::location_type
-#endif
-
 ]b4_namespace_close[
+
 ]b4_percent_code_get([[provides]])[
 ]m4_popdef([b4_parse_param])dnl
-])
+])[
 
-b4_defines_if(
+]b4_header_if(
 [b4_output_begin([b4_spec_header_file])
 b4_copyright([Skeleton interface for Bison GLR parsers in C++],
-             [2002-2015, 2018-2019])[
+             [2002-2015, 2018-2021])[
 // C++ GLR parser skeleton written by Akim Demaille.
 
 ]b4_disclaimer[
-]b4_cpp_guard_open([b4_spec_header_file])[
+]b4_cpp_guard_open([b4_spec_mapped_header_file])[
 ]b4_shared_declarations[
-]b4_cpp_guard_close([b4_spec_header_file])[
+]b4_cpp_guard_close([b4_spec_mapped_header_file])[
 ]b4_output_end])
 
 # Let glr.c (and b4_shared_declarations) believe that the user
diff --git a/data/skeletons/glr2.cc b/data/skeletons/glr2.cc
new file mode 100644
index 0000000..757d68d
--- /dev/null
+++ b/data/skeletons/glr2.cc
@@ -0,0 +1,3533 @@
+# C++ GLR skeleton for Bison
+
+# Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+m4_include(b4_skeletonsdir/[c++.m4])
+
+# api.value.type=variant is valid.
+m4_define([b4_value_type_setup_variant])
+
+# b4_tname_if(TNAME-NEEDED, TNAME-NOT-NEEDED)
+# -------------------------------------------
+m4_define([b4_tname_if],
+[m4_case(b4_percent_define_get([[parse.error]]),
+         [verbose],         [$1],
+         [b4_token_table_if([$1],
+                            [$2])])])
+
+b4_bison_locations_if([
+   m4_define([b4_location_constructors])
+   m4_include(b4_skeletonsdir/[location.cc])])
+b4_variant_if([m4_include(b4_skeletonsdir/[variant.hh])])
+
+m4_define([b4_parser_class],
+          [b4_percent_define_get([[api.parser.class]])])
+
+]m4_define([b4_define_symbol_kind],
+[m4_format([#define %-15s %s],
+           b4_symbol($][1, kind_base),
+           b4_namespace_ref[::]b4_parser_class[::symbol_kind::]b4_symbol($1, kind_base))
+])
+
+
+# b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT)
+# -------------------------------------------------------------
+# Define "yy<TABLE-NAME>" whose contents is CONTENT.  Does not use "static",
+# should be in unnamed namespace.
+m4_define([b4_integral_parser_table_define],
+[m4_ifvaln([$3], [  b4_comment([$3])])dnl
+  const b4_int_type_for([$2]) yy$1[[]] =
+  {
+  $2
+  };dnl
+])
+
+
+## ---------------- ##
+## Default values.  ##
+## ---------------- ##
+
+# Stack parameters.
+m4_define_default([b4_stack_depth_max], [10000])
+m4_define_default([b4_stack_depth_init],  [200])
+
+
+
+## ------------ ##
+## Interfaces.  ##
+## ------------ ##
+
+# b4_user_formals
+# ---------------
+# The possible parse-params formal arguments preceded by a comma.
+#
+# This is not shared with yacc.c in c.m4 because  GLR relies on ISO C
+# formal argument declarations.
+m4_define([b4_user_formals],
+[m4_ifset([b4_parse_param], [, b4_formals(b4_parse_param)])])
+
+
+# b4_symbol_kind(NUM)
+# -------------------
+m4_define([b4_symbol_kind],
+[symbol_kind::b4_symbol_kind_base($@)])
+
+
+## ----------------- ##
+## Semantic Values.  ##
+## ----------------- ##
+
+
+# b4_lhs_value(SYMBOL-NUM, [TYPE])
+# --------------------------------
+# See README.
+m4_define([b4_lhs_value],
+[b4_symbol_value([(*yyvalp)], [$1], [$2])])
+
+
+# b4_rhs_data(RULE-LENGTH, POS)
+# -----------------------------
+# See README.
+m4_define([b4_rhs_data],
+[(static_cast<glr_stack_item const *>(yyvsp))@{YYFILL (b4_subtract([$2], [$1]))@}.getState()])
+
+
+# b4_rhs_value(RULE-LENGTH, POS, SYMBOL-NUM, [TYPE])
+# --------------------------------------------------
+# Expansion of $$ or $<TYPE>$, for symbol SYMBOL-NUM.
+m4_define([b4_rhs_value],
+[b4_symbol_value([b4_rhs_data([$1], [$2]).value ()], [$3], [$4])])
+
+
+
+## ----------- ##
+## Locations.  ##
+## ----------- ##
+
+# b4_lhs_location()
+# -----------------
+# Expansion of @$.
+m4_define([b4_lhs_location],
+[(*yylocp)])
+
+
+# b4_rhs_location(RULE-LENGTH, NUM)
+# ---------------------------------
+# Expansion of @NUM, where the current rule has RULE-LENGTH symbols
+# on RHS.
+m4_define([b4_rhs_location],
+[(b4_rhs_data([$1], [$2]).yyloc)])
+
+
+# b4_symbol_action(SYMBOL-NUM, KIND)
+# ----------------------------------
+# Run the action KIND (destructor or printer) for SYMBOL-NUM.
+# Same as in C, but using references instead of pointers.
+#
+# Currently we need two different b4_symbol_action: once for the
+# self-contained symbols, and another time for yy_destroy_ and
+# yy_symbol_value_print_, which don't use genuine symbols yet.
+m4_define([b4_symbol_action],
+[b4_symbol_if([$1], [has_$2],
+[m4_pushdef([b4_symbol_value], m4_defn([b4_symbol_value_template]))[]dnl
+b4_dollar_pushdef([yysym.value],
+                  [$1],
+                  [],
+                  [yysym.location])dnl
+      _b4_symbol_case([$1])[]dnl
+b4_syncline([b4_symbol([$1], [$2_line])], [b4_symbol([$1], [$2_file])])dnl
+        b4_symbol([$1], [$2])
+b4_syncline([@oline@], [@ofile@])dnl
+        break;
+
+m4_popdef([b4_symbol_value])[]dnl
+b4_dollar_popdef[]dnl
+])])
+
+
+# b4_symbol_action_for_yyval(SYMBOL-NUM, KIND)
+# --------------------------------------------
+# Run the action KIND (destructor or printer) for SYMBOL-NUM.
+# Same as in C, but using references instead of pointers.
+m4_define([b4_symbol_action_for_yyval],
+[b4_symbol_if([$1], [has_$2],
+[b4_dollar_pushdef([yyval],
+                   [$1],
+                   [],
+                   [yyloc])dnl
+      _b4_symbol_case([$1])[]dnl
+b4_syncline([b4_symbol([$1], [$2_line])], [b4_symbol([$1], [$2_file])])dnl
+        b4_symbol([$1], [$2])
+b4_syncline([@oline@], [@ofile@])dnl
+        break;
+
+b4_dollar_popdef[]dnl
+])])
+
+
+# b4_call_merger(MERGER-NUM, MERGER-NAME, SYMBOL-SUM)
+# ---------------------------------------------------
+m4_define([b4_call_merger],
+[b4_case([$1],
+         [    b4_symbol_if([$3], [has_type],
+                           [b4_variant_if([yy0.as< b4_symbol($3, type) > () = $2 (yy0.as< b4_symbol($3, type) >(), yy1.as< b4_symbol($3, type) >());],
+                                          [yy0.b4_symbol($3, slot) = $2 (yy0, yy1);])],
+                           [yy0 = $2 (yy0, yy1);])])])
+
+# b4_yylex
+# --------
+# Call yylex.
+m4_define([b4_yylex],
+[b4_token_ctor_if(
+[b4_function_call([yylex],
+                  [symbol_type], m4_ifdef([b4_lex_param], b4_lex_param))],
+[b4_function_call([yylex], [int],
+                  [[value_type *], [&this->yyla.value]][]dnl
+b4_locations_if([, [[location_type *], [&this->yyla.location]]])dnl
+m4_ifdef([b4_lex_param], [, ]b4_lex_param))])])
+
+
+# b4_shared_declarations(hh|cc)
+# -----------------------------
+# Declaration that might either go into the header (if --header, $1 = hh)
+# or in the implementation file.
+m4_define([b4_shared_declarations],
+[b4_percent_code_get([[requires]])[
+#include <algorithm>
+#include <cstddef> // ptrdiff_t
+#include <cstring> // memcpy
+#include <iostream>
+#include <iomanip>
+#include <limits>
+#include <stdexcept>
+#include <stdint.h>
+#include <string>
+#include <vector>
+
+]b4_cxx_portability[
+]m4_ifdef([b4_location_include],
+          [[# include ]b4_location_include])[
+]b4_variant_if([b4_variant_includes])[
+
+]b4_YYDEBUG_define[
+
+]b4_namespace_open[
+
+]b4_bison_locations_if([m4_ifndef([b4_location_file],
+                                  [b4_location_define])])[
+
+  /// A Bison parser.
+  class ]b4_parser_class[
+  {
+  public:
+]b4_public_types_declare[
+]b4_symbol_type_define[
+
+    // FIXME: should be private eventually.
+    class glr_stack;
+    class glr_state;
+
+    /// Build a parser object.
+    ]b4_parser_class[ (]b4_parse_param_decl[);
+    ~]b4_parser_class[ ();
+
+    /// Parse.  An alias for parse ().
+    /// \returns  0 iff parsing succeeded.
+    int operator() ();
+
+    /// Parse.
+    /// \returns  0 iff parsing succeeded.
+    int parse ();
+
+#if ]b4_api_PREFIX[DEBUG
+    /// The current debugging stream.
+    std::ostream& debug_stream () const;
+    /// Set the current debugging stream.
+    void set_debug_stream (std::ostream &);
+
+    /// Type for debugging levels.
+    using debug_level_type = int;
+    /// The current debugging level.
+    debug_level_type debug_level () const;
+    /// Set the current debugging level.
+    void set_debug_level (debug_level_type l);
+#endif
+
+    /// Report a syntax error.]b4_locations_if([[
+    /// \param loc    where the syntax error is found.]])[
+    /// \param msg    a description of the syntax error.
+    void error (]b4_locations_if([[const location_type& loc, ]])[const std::string& msg);
+
+]b4_parse_error_bmatch(
+[custom\|detailed],
+[[    /// The user-facing name of the symbol whose (internal) number is
+    /// YYSYMBOL.  No bounds checking.
+    static const char *symbol_name (symbol_kind_type yysymbol);]],
+[simple],
+[[#if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
+    /// The user-facing name of the symbol whose (internal) number is
+    /// YYSYMBOL.  No bounds checking.
+    static const char *symbol_name (symbol_kind_type yysymbol);
+#endif // #if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
+]],
+[verbose],
+[[    /// The user-facing name of the symbol whose (internal) number is
+    /// YYSYMBOL.  No bounds checking.
+    static std::string symbol_name (symbol_kind_type yysymbol);]])[
+
+]b4_token_constructor_define[
+]b4_parse_error_bmatch([custom\|detailed\|verbose], [[
+    class context
+    {
+    public:
+      context (glr_stack& yystack, const symbol_type& yyla);
+      const symbol_type& lookahead () const YY_NOEXCEPT { return yyla_; }
+      symbol_kind_type token () const YY_NOEXCEPT { return yyla_.kind (); }]b4_locations_if([[
+      const location_type& location () const YY_NOEXCEPT { return yyla_.location; }
+]])[
+      /// Put in YYARG at most YYARGN of the expected tokens, and return the
+      /// number of tokens stored in YYARG.  If YYARG is null, return the
+      /// number of expected tokens (guaranteed to be less than YYNTOKENS).
+      int expected_tokens (symbol_kind_type yyarg[], int yyargn) const;
+
+    private:
+      glr_stack& yystack_;
+      const symbol_type& yyla_;
+    };
+]])[
+# if ]b4_api_PREFIX[DEBUG
+  public:
+    /// \brief Report a symbol value on the debug stream.
+    /// \param yykind   The symbol kind.
+    /// \param yyval    Its semantic value.]b4_locations_if([[
+    /// \param yyloc    Its location.]])[
+    void yy_symbol_value_print_ (symbol_kind_type yykind,
+                                 const value_type& yyval]b4_locations_if([[,
+                                 const location_type& yyloc]])[) const;
+    /// \brief Report a symbol on the debug stream.
+    /// \param yykind   The symbol kind.
+    /// \param yyval    Its semantic value.]b4_locations_if([[
+    /// \param yyloc    Its location.]])[
+    void yy_symbol_print_ (symbol_kind_type yykind,
+                           const value_type& yyval]b4_locations_if([[,
+                           const location_type& yyloc]])[) const;
+  private:
+    /// Debug stream.
+    std::ostream* yycdebug_;
+#endif
+
+]b4_parse_error_bmatch(
+[custom], [[
+  private:
+    /// Report a syntax error
+    /// \param yyctx     the context in which the error occurred.
+    void report_syntax_error (const context& yyctx) const;]],
+[detailed\|verbose], [[
+  private:
+    /// The arguments of the error message.
+    int yy_syntax_error_arguments_ (const context& yyctx,
+                                    symbol_kind_type yyarg[], int yyargn) const;
+
+    /// Generate an error message.
+    /// \param yyctx     the context in which the error occurred.
+    virtual std::string yysyntax_error_ (const context& yyctx) const;]])[
+
+    /// Convert a scanner token kind \a t to a symbol kind.
+    /// In theory \a t should be a token_kind_type, but character literals
+    /// are valid, yet not members of the token_kind_type enum.
+    static symbol_kind_type yytranslate_ (int t) YY_NOEXCEPT;
+
+]b4_parse_error_bmatch(
+[simple],
+[[#if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
+    /// For a symbol, its name in clear.
+    static const char* const yytname_[];
+#endif // #if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
+]],
+[verbose],
+[[    /// Convert the symbol name \a n to a form suitable for a diagnostic.
+    static std::string yytnamerr_ (const char *yystr);
+
+    /// For a symbol, its name in clear.
+    static const char* const yytname_[];
+]])[
+
+    /// \brief Reclaim the memory associated to a symbol.
+    /// \param yymsg     Why this token is reclaimed.
+    ///                  If null, print nothing.
+    /// \param yykind    The symbol kind.
+    void yy_destroy_ (const char* yymsg, symbol_kind_type yykind,
+                      value_type& yyval]b4_locations_if([[,
+                      location_type& yyloc]])[);
+
+]b4_parse_param_vars[
+    // Needs access to yy_destroy_, report_syntax_error, etc.
+    friend glr_stack;
+  };
+
+]b4_token_ctor_if([b4_yytranslate_define([$1])[
+]b4_public_types_define([$1])])[
+]b4_namespace_close[
+
+]b4_percent_code_get([[provides]])[
+]])[
+
+
+## -------------- ##
+## Output files.  ##
+## -------------- ##
+
+
+# ------------- #
+# Header file.  #
+# ------------- #
+
+]b4_header_if([[
+]b4_output_begin([b4_spec_header_file])[
+]b4_copyright([Skeleton interface for Bison GLR parsers in C++],
+             [2002-2015, 2018-2021])[
+// C++ GLR parser skeleton written by Valentin Tolmer.
+
+]b4_disclaimer[
+]b4_cpp_guard_open([b4_spec_mapped_header_file])[
+]b4_shared_declarations([hh])[
+]b4_cpp_guard_close([b4_spec_mapped_header_file])[
+]b4_output_end])[
+
+
+# --------------------- #
+# Implementation file.  #
+# --------------------- #
+
+]b4_output_begin([b4_parser_file_name])[
+]b4_copyright([Skeleton implementation for Bison GLR parsers in C],
+              [2002-2015, 2018-2021])[
+// C++ GLR parser skeleton written by Valentin Tolmer.
+
+]b4_disclaimer[
+]b4_identification[
+
+]b4_percent_code_get([[top]])[
+]m4_if(b4_prefix, [yy], [],
+[[/* Substitute the variable and function names.  */
+#define yyparse ]b4_prefix[parse
+#define yylex   ]b4_prefix[lex
+#define yyerror ]b4_prefix[error
+#define yydebug ]b4_prefix[debug]])[
+
+]b4_user_pre_prologue[
+
+]b4_null_define[
+
+]b4_header_if([[#include "@basename(]b4_spec_header_file[@)"]],
+              [b4_shared_declarations([cc])])[
+
+namespace
+{
+  /* Default (constant) value used for initialization for null
+     right-hand sides.  Unlike the standard yacc.c template, here we set
+     the default value of $$ to a zeroed-out value.  Since the default
+     value is undefined, this behavior is technically correct.  */
+  ]b4_namespace_ref[::]b4_parser_class[::value_type yyval_default;
+}
+
+]b4_user_post_prologue[
+]b4_percent_code_get[
+
+#include <cstdio>
+#include <cstdlib>
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+#  if ENABLE_NLS
+#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+#   define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+#  endif
+# endif
+# ifndef YY_
+#  define YY_(Msgid) Msgid
+# endif
+#endif
+
+// Whether we are compiled with exception support.
+#ifndef YY_EXCEPTIONS
+# if defined __GNUC__ && !defined __EXCEPTIONS
+#  define YY_EXCEPTIONS 0
+# else
+#  define YY_EXCEPTIONS 1
+# endif
+#endif
+
+#ifndef YYFREE
+# define YYFREE free
+#endif
+#ifndef YYMALLOC
+# define YYMALLOC malloc
+#endif
+
+#ifndef YYSETJMP
+# include <setjmp.h>
+# define YYJMP_BUF jmp_buf
+# define YYSETJMP(Env) setjmp (Env)
+/* Pacify Clang and ICC.  */
+# define YYLONGJMP(Env, Val)                    \
+ do {                                           \
+   longjmp (Env, Val);                          \
+   YYASSERT (0);                                \
+ } while (false)
+#endif
+
+]b4_attribute_define([noreturn])[
+
+#if defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
+# define YY_IGNORE_NULL_DEREFERENCE_BEGIN                               \
+  _Pragma ("GCC diagnostic push")                                       \
+  _Pragma ("GCC diagnostic ignored \"-Wnull-dereference\"")
+# define YY_IGNORE_NULL_DEREFERENCE_END         \
+  _Pragma ("GCC diagnostic pop")
+#else
+# define YY_IGNORE_NULL_DEREFERENCE_BEGIN
+# define YY_IGNORE_NULL_DEREFERENCE_END
+#endif
+
+]b4_null_define[
+]b4_cast_define[
+
+// FIXME: Use the same conventions as lalr1.cc.
+]b4_parse_assert_if[
+#ifndef YYASSERT
+# define YYASSERT(Condition) ((void) ((Condition) || (abort (), 0)))
+#endif
+
+#ifdef YYDEBUG
+# define YYDASSERT(Condition) YYASSERT(Condition)
+#else
+# define YYDASSERT(Condition)
+#endif
+
+/* YYFINAL -- State number of the termination state.  */
+#define YYFINAL  ]b4_final_state_number[
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   ]b4_last[
+
+/* YYNTOKENS -- Number of terminals.  */
+#define YYNTOKENS  ]b4_tokens_number[
+/* YYNNTS -- Number of nonterminals.  */
+#define YYNNTS  ]b4_nterms_number[
+/* YYNRULES -- Number of rules.  */
+#define YYNRULES  ]b4_rules_number[
+/* YYNSTATES -- Number of states.  */
+#define YYNSTATES  ]b4_states_number[
+/* YYMAXRHS -- Maximum number of symbols on right-hand side of rule.  */
+#define YYMAXRHS ]b4_r2_max[
+/* YYMAXLEFT -- Maximum number of symbols to the left of a handle
+   accessed by $0, $-1, etc., in any rule.  */
+#define YYMAXLEFT ]b4_max_left_semantic_context[
+
+namespace
+{
+#if ]b4_api_PREFIX[DEBUG
+  /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+  const ]b4_int_type_for([b4_rline])[ yyrline[] =
+  {
+  ]b4_rline[
+  };
+#endif
+
+#define YYPACT_NINF ]b4_pact_ninf[
+#define YYTABLE_NINF ]b4_table_ninf[
+
+]b4_parser_tables_define[
+
+  /* YYDPREC[RULE-NUM] -- Dynamic precedence of rule #RULE-NUM (0 if none).  */
+  const ]b4_int_type_for([b4_dprec])[ yydprec[] =
+  {
+  ]b4_dprec[
+  };
+
+  /* YYMERGER[RULE-NUM] -- Index of merging function for rule #RULE-NUM.  */
+  const ]b4_int_type_for([b4_merger])[ yymerger[] =
+  {
+  ]b4_merger[
+  };
+
+  /* YYIMMEDIATE[RULE-NUM] -- True iff rule #RULE-NUM is not to be deferred, as
+     in the case of predicates.  */
+  const bool yyimmediate[] =
+  {
+  ]b4_immediate[
+  };
+
+  /* YYCONFLP[YYPACT[STATE-NUM]] -- Pointer into YYCONFL of start of
+     list of conflicting reductions corresponding to action entry for
+     state STATE-NUM in yytable.  0 means no conflicts.  The list in
+     yyconfl is terminated by a rule number of 0.  */
+  const ]b4_int_type_for([b4_conflict_list_heads])[ yyconflp[] =
+  {
+  ]b4_conflict_list_heads[
+  };
+
+  /* YYCONFL[I] -- lists of conflicting rule numbers, each terminated by
+     0, pointed into by YYCONFLP.  */
+  ]dnl Do not use b4_int_type_for here, since there are places where
+  dnl pointers onto yyconfl are taken, whose type is "short*".
+  dnl We probably ought to introduce a type for confl.
+  [const short yyconfl[] =
+  {
+  ]b4_conflicting_rules[
+  };
+} // namespace
+
+
+/* Error token number */
+#define YYTERROR 1
+
+]b4_locations_if([[
+]b4_yylloc_default_define[
+# define YYRHSLOC(Rhs, K) ((Rhs)[K].getState().yyloc)
+]])[
+
+enum YYRESULTTAG { yyok, yyaccept, yyabort, yyerr };
+
+#define YYCHK(YYE)                              \
+  do {                                          \
+    YYRESULTTAG yychk_flag = YYE;               \
+    if (yychk_flag != yyok)                     \
+      return yychk_flag;                        \
+  } while (false)
+
+#if ]b4_api_PREFIX[DEBUG
+
+#define YYCDEBUG if (!yydebug) {} else std::cerr
+
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)                  \
+  do {                                                                  \
+    if (yydebug)                                                        \
+      {                                                                 \
+        std::cerr << Title << ' ';                                      \
+        yyparser.yy_symbol_print_ (Kind, Value]b4_locations_if([, Location])[); \
+        std::cerr << '\n';                                              \
+      }                                                                 \
+  } while (false)
+
+# define YY_REDUCE_PRINT(Args)                  \
+  do {                                          \
+    if (yydebug)                                \
+      yystateStack.yy_reduce_print Args;        \
+  } while (false)
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+
+namespace
+{
+  using glr_stack = ]b4_namespace_ref[::]b4_parser_class[::glr_stack;
+  using glr_state = ]b4_namespace_ref[::]b4_parser_class[::glr_state;
+
+  void yypstack (const glr_stack& yystack, size_t yyk)
+    YY_ATTRIBUTE_UNUSED;
+  void yypdumpstack (const glr_stack& yystack)
+    YY_ATTRIBUTE_UNUSED;
+}
+
+#else /* !]b4_api_PREFIX[DEBUG */
+
+# define YYCDEBUG if (true) {} else std::cerr
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) {}
+# define YY_REDUCE_PRINT(Args) {}
+
+#endif /* !]b4_api_PREFIX[DEBUG */
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH ]b4_stack_depth_init[
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   SIZE_MAX < YYMAXDEPTH * sizeof (GLRStackItem)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH ]b4_stack_depth_max[
+#endif
+
+/* Minimum number of free items on the stack allowed after an
+   allocation.  This is to allow allocation and initialization
+   to be completed by functions that call yyexpandGLRStack before the
+   stack is expanded, thus insuring that all necessary pointers get
+   properly redirected to new data.  */
+#define YYHEADROOM 2
+
+#ifndef YYSTACKEXPANDABLE
+# define YYSTACKEXPANDABLE 1
+#endif
+
+namespace
+{
+  template <typename Parameter>
+  class strong_index_alias
+  {
+  public:
+    static strong_index_alias create (std::ptrdiff_t value)
+    {
+      strong_index_alias result;
+      result.value_ = value;
+      return result;
+    }
+
+    std::ptrdiff_t const& get () const { return value_; }
+
+    size_t uget () const { return static_cast<size_t> (value_); }
+
+    strong_index_alias operator+ (std::ptrdiff_t other) const
+    {
+      return strong_index_alias (get () + other);
+    }
+
+    void operator+= (std::ptrdiff_t other)
+    {
+      value_ += other;
+    }
+
+    strong_index_alias operator- (std::ptrdiff_t other)
+    {
+      return strong_index_alias (get () - other);
+    }
+
+    void operator-= (std::ptrdiff_t other)
+    {
+      value_ -= other;
+    }
+
+    size_t operator- (strong_index_alias other)
+    {
+      return strong_index_alias (get () - other.get ());
+    }
+
+    strong_index_alias& operator++ ()
+    {
+      ++value_;
+      return *this;
+    }
+
+    bool isValid () const
+    {
+      return value_ != INVALID_INDEX;
+    }
+
+    void setInvalid()
+    {
+      value_ = INVALID_INDEX;
+    }
+
+    bool operator== (strong_index_alias other)
+    {
+      return get () == other.get ();
+    }
+
+    bool operator!= (strong_index_alias other)
+    {
+      return get () != other.get ();
+    }
+
+    bool operator< (strong_index_alias other)
+    {
+      return get () < other.get ();
+    }
+
+  private:
+    static const std::ptrdiff_t INVALID_INDEX;
+
+    // WARNING: 0-initialized.
+    std::ptrdiff_t value_;
+  }; // class strong_index_alias
+
+  template<typename T>
+  const std::ptrdiff_t strong_index_alias<T>::INVALID_INDEX =
+    std::numeric_limits<std::ptrdiff_t>::max ();
+
+  using state_set_index = strong_index_alias<struct glr_state_set_tag>;
+
+  state_set_index create_state_set_index (std::ptrdiff_t value)
+  {
+    return state_set_index::create (value);
+  }
+
+  /** State numbers, as in LALR(1) machine */
+  using state_num = int;
+
+  /** Rule numbers, as in LALR(1) machine */
+  using rule_num = int;
+
+  using parser_type = ]b4_namespace_ref[::]b4_parser_class[;
+  using glr_state = parser_type::glr_state;
+  using symbol_kind = parser_type::symbol_kind;
+  using symbol_kind_type = parser_type::symbol_kind_type;
+  using symbol_type = parser_type::symbol_type;
+  using value_type = parser_type::value_type;]b4_locations_if([[
+  using location_type = parser_type::location_type;]])[
+
+  // Forward declarations.
+  class glr_stack_item;
+  class semantic_option;
+} // namespace
+
+namespace
+{
+  /** Accessing symbol of state YYSTATE.  */
+  inline symbol_kind_type
+  yy_accessing_symbol (state_num yystate)
+  {
+    return YY_CAST (symbol_kind_type, yystos[yystate]);
+  }
+
+  /** Left-hand-side symbol for rule #YYRULE.  */
+  inline symbol_kind_type
+  yylhsNonterm (rule_num yyrule)
+  {
+    return static_cast<symbol_kind_type>(yyr1[yyrule]);
+  }
+
+  /** Number of symbols composing the right hand side of rule #RULE.  */
+  inline int
+  yyrhsLength (rule_num yyrule)
+  {
+    return yyr2[yyrule];
+  }
+}
+
+namespace ]b4_namespace_ref[
+{
+  class ]b4_parser_class[::glr_state
+  {
+  public:
+    glr_state ()
+      : yyresolved (false)
+      , yylrState (0)
+      , yyposn (0)
+      , yypred (0)
+      , yyfirstVal (0)]b4_locations_if([[
+      , yyloc ()]])[]b4_parse_assert_if([[
+      , magic_ (MAGIC)]])[
+    {}
+
+    /// Build with a semantic value.
+    glr_state (state_num lrState, size_t posn, const value_type& val]b4_locations_if([[, const location_type& loc]])[)
+      : yyresolved (true)
+      , yylrState (lrState)
+      , yyposn (posn)
+      , yypred (0)
+      , yyval (]b4_variant_if([], [[val]])[)]b4_locations_if([[
+      , yyloc (loc)]])[]b4_parse_assert_if([[
+      , magic_ (MAGIC)]])[
+    {]b4_variant_if([[
+      ]b4_symbol_variant([yy_accessing_symbol (lrState)],
+                         [yyval], [copy], [val])])[}
+
+    /// Build with a semantic option.
+    glr_state (state_num lrState, size_t posn)
+      : yyresolved (false)
+      , yylrState (lrState)
+      , yyposn (posn)
+      , yypred (0)
+      , yyfirstVal (0)]b4_locations_if([[
+      , yyloc ()]])[]b4_parse_assert_if([[
+      , magic_ (MAGIC)]])[
+    {}
+
+    glr_state (const glr_state& other)
+      : yyresolved (other.yyresolved)
+      , yylrState (other.yylrState)
+      , yyposn (other.yyposn)
+      , yypred (0)]b4_locations_if([[
+      , yyloc (other.yyloc)]])[]b4_parse_assert_if([[
+      , magic_ (MAGIC)]])[
+    {
+      setPred (other.pred ());
+      if (other.yyresolved)]b4_variant_if([[
+        {
+          new (&yyval) value_type ();
+          ]b4_symbol_variant([yy_accessing_symbol (other.yylrState)],
+                             [yyval], [copy], [other.value ()])[
+        }]], [[
+        new (&yyval) value_type (other.value ());]])[
+      else
+        {
+          yyfirstVal = 0;
+          setFirstVal (other.firstVal ());
+        }]b4_parse_assert_if([[
+      check_();]])[
+    }
+
+    ~glr_state ()
+    {]b4_parse_assert_if([[
+      check_ ();]])[
+      if (yyresolved)
+        {]b4_variant_if([[
+          symbol_kind_type yykind = yy_accessing_symbol (yylrState);
+          // FIXME: User destructors.
+          // Value type destructor.
+          ]b4_symbol_variant([[yykind]], [[yyval]], [[template destroy]])])[
+          yyval.~value_type ();
+        }]b4_parse_assert_if([[
+      magic_ = 0;]])[
+    }
+
+    glr_state& operator= (const glr_state& other)
+    {]b4_parse_assert_if([[
+      check_ ();
+      other.check_ ();]])[
+      if (!yyresolved && other.yyresolved)
+        new (&yyval) value_type;
+      yyresolved = other.yyresolved;
+      yylrState = other.yylrState;
+      yyposn = other.yyposn;
+      setPred (other.pred ());
+      if (other.yyresolved)]b4_variant_if([[
+        ]b4_symbol_variant([yy_accessing_symbol (other.yylrState)],
+                           [yyval], [copy], [other.value ()])], [[
+        value () = other.value ();]])[
+      else
+        setFirstVal (other.firstVal ());]b4_locations_if([[
+      yyloc = other.yyloc;]])[
+      return *this;
+    }
+
+    /** Type tag for the semantic value.  If true, yyval applies, otherwise
+     *  yyfirstVal applies.  */
+    bool yyresolved;
+    /** Number of corresponding LALR(1) machine state.  */
+    state_num yylrState;
+    /** Source position of the last token produced by my symbol */
+    size_t yyposn;
+
+    /// Only call pred() and setPred() on objects in yyitems, not temporaries.
+    glr_state* pred ();
+    const glr_state* pred () const;
+    void setPred (const glr_state* state);
+
+    /// Only call firstVal() and setFirstVal() on objects in yyitems, not
+    /// temporaries.
+    semantic_option* firstVal ();
+    const semantic_option* firstVal () const;
+    void setFirstVal (const semantic_option* option);
+
+    value_type& value ()
+    {]b4_parse_assert_if([[
+      check_ ();]])[
+      return yyval;
+    }
+
+    const value_type& value () const
+    {]b4_parse_assert_if([[
+      check_ ();]])[
+      return yyval;
+    }
+
+    void
+    destroy (char const *yymsg, ]b4_namespace_ref[::]b4_parser_class[& yyparser);
+
+    /* DEBUGGING ONLY */
+  #if ]b4_api_PREFIX[DEBUG
+    void yy_yypstack () const
+    {]b4_parse_assert_if([[
+      check_ ();]])[
+      if (pred () != YY_NULLPTR)
+        {
+          pred ()->yy_yypstack ();
+          std::cerr << " -> ";
+        }
+      std::cerr << yylrState << "@@" << yyposn;
+    }
+  #endif
+
+    std::ptrdiff_t indexIn (const glr_stack_item* array) const YY_ATTRIBUTE_UNUSED;
+
+    glr_stack_item* asItem ()
+    {]b4_parse_assert_if([[
+      check_ ();]])[
+      return asItem(this);
+    }
+
+    const glr_stack_item* asItem () const
+    {]b4_parse_assert_if([[
+      check_ ();]])[
+      return asItem (this);
+    }
+
+  private:
+    template <typename T>
+    static const glr_stack_item* asItem (const T* state)
+    {
+      return reinterpret_cast<const glr_stack_item*>(state);
+    }
+    template <typename T>
+    static glr_stack_item* asItem (T* state)
+    {
+      return reinterpret_cast<glr_stack_item*> (state);
+    }
+    static const char *as_pointer_ (const glr_state *state)
+    {
+      return reinterpret_cast<const char *> (state);
+    }
+    static char *as_pointer_ (glr_state *state)
+    {
+      return reinterpret_cast<char *> (state);
+    }
+    /** Preceding state in this stack */
+    std::ptrdiff_t yypred;
+    union {
+      /** First in a chain of alternative reductions producing the
+       *  nonterminal corresponding to this state, threaded through
+       *  yyfirstVal.  Value "0" means empty.  */
+      std::ptrdiff_t yyfirstVal;
+      /** Semantic value for this state.  */
+      value_type yyval;
+    };]b4_locations_if([[
+   // FIXME: Why public?
+   public:
+    /** Source location for this state.  */
+    location_type yyloc;]])[
+
+]b4_parse_assert_if([[
+  public:
+    // Check invariants.
+    void check_ () const
+    {
+      YY_IGNORE_NULL_DEREFERENCE_BEGIN
+      YYASSERT (this->magic_ == MAGIC);
+      YY_IGNORE_NULL_DEREFERENCE_END
+    }
+
+    // A magic number to check our pointer arithmetic is sane.
+    enum { MAGIC = 713705 };
+    unsigned int magic_;]])[
+  }; // class ]b4_parser_class[::glr_state
+} // namespace ]b4_namespace_ref[
+
+
+namespace
+{
+  /** A stack of GLRState representing the different heads during
+    * nondeterministic evaluation. */
+  class glr_state_set
+  {
+  public:
+    /** Initialize YYSET to a singleton set containing an empty stack.  */
+    glr_state_set ()
+      : yylastDeleted (YY_NULLPTR)
+    {
+      yystates.push_back (YY_NULLPTR);
+      yylookaheadNeeds.push_back (false);
+    }
+
+    // Behave like a vector of states.
+    glr_state*& operator[] (state_set_index index)
+    {
+      return yystates[index.uget()];
+    }
+
+    glr_state* operator[] (state_set_index index) const
+    {
+      return yystates[index.uget()];
+    }
+
+    size_t size () const
+    {
+      return yystates.size ();
+    }
+
+    std::vector<glr_state*>::iterator begin ()
+    {
+      return yystates.begin ();
+    }
+
+    std::vector<glr_state*>::iterator end ()
+    {
+      return yystates.end ();
+    }
+
+    bool lookaheadNeeds (state_set_index index) const
+    {
+      return yylookaheadNeeds[index.uget ()];
+    }
+
+    bool setLookaheadNeeds (state_set_index index, bool value)
+    {
+      return yylookaheadNeeds[index.uget ()] = value;
+    }
+
+    /** Invalidate stack #YYK.  */
+    void
+    yymarkStackDeleted (state_set_index yyk)
+    {
+      size_t k = yyk.uget ();
+      if (yystates[k] != YY_NULLPTR)
+        yylastDeleted = yystates[k];
+      yystates[k] = YY_NULLPTR;
+    }
+
+    /** Undelete the last stack in *this that was marked as deleted.  Can
+        only be done once after a deletion, and only when all other stacks have
+        been deleted.  */
+    void
+    yyundeleteLastStack ()
+    {
+      if (yylastDeleted == YY_NULLPTR || !yystates.empty ())
+        return;
+      yystates.push_back (yylastDeleted);
+      YYCDEBUG << "Restoring last deleted stack as stack #0.\n";
+      clearLastDeleted ();
+    }
+
+    /** Remove the dead stacks (yystates[i] == YY_NULLPTR) and shift the later
+     * ones.  */
+    void
+    yyremoveDeletes ()
+    {
+      size_t newsize = yystates.size ();
+      /* j is the number of live stacks we have seen.  */
+      for (size_t i = 0, j = 0; j < newsize; ++i)
+        {
+          if (yystates[i] == YY_NULLPTR)
+            {
+              if (i == j)
+                {
+                  YYCDEBUG << "Removing dead stacks.\n";
+                }
+              newsize -= 1;
+            }
+          else
+            {
+              yystates[j] = yystates[i];
+              /* In the current implementation, it's unnecessary to copy
+                 yylookaheadNeeds[i] since, after
+                 yyremoveDeletes returns, the parser immediately either enters
+                 deterministic operation or shifts a token.  However, it doesn't
+                 hurt, and the code might evolve to need it.  */
+              yylookaheadNeeds[j] = yylookaheadNeeds[i];
+              if (j != i)
+                {
+                  YYCDEBUG << "Rename stack " << i << " -> " << j << ".\n";
+                }
+              j += 1;
+            }
+        }
+      yystates.resize (newsize);
+      yylookaheadNeeds.resize (newsize);
+    }
+
+
+    state_set_index
+    yysplitStack (state_set_index yyk)
+    {
+      const size_t k = yyk.uget ();
+      yystates.push_back (yystates[k]);
+      yylookaheadNeeds.push_back (yylookaheadNeeds[k]);
+      return create_state_set_index (static_cast<std::ptrdiff_t> (yystates.size () - 1));
+    }
+
+    void clearLastDeleted ()
+    {
+      yylastDeleted = YY_NULLPTR;
+    }
+
+  private:
+
+    std::vector<glr_state*> yystates;
+    /** During nondeterministic operation, yylookaheadNeeds tracks which
+     *  stacks have actually needed the current lookahead.  During deterministic
+     *  operation, yylookaheadNeeds[0] is not maintained since it would merely
+     *  duplicate !yyla.empty ().  */
+    std::vector<bool> yylookaheadNeeds;
+
+    /** The last stack we invalidated.  */
+    glr_state* yylastDeleted;
+  }; // class glr_state_set
+} // namespace
+
+namespace
+{
+  class semantic_option
+  {
+  public:
+    semantic_option ()
+      : yyrule (0)
+      , yystate (0)
+      , yynext (0)
+      , yyla ()]b4_parse_assert_if([[
+      , magic_ (MAGIC)]])[
+    {}
+
+    semantic_option (rule_num rule)
+      : yyrule (rule)
+      , yystate (0)
+      , yynext (0)
+      , yyla ()]b4_parse_assert_if([[
+      , magic_ (MAGIC)]])[
+    {}
+
+    semantic_option (const semantic_option& that)
+      : yyrule (that.yyrule)
+      , yystate (that.yystate)
+      , yynext (that.yynext)
+      , yyla (that.yyla)]b4_parse_assert_if([[
+      , magic_ (MAGIC)]])[
+    {]b4_parse_assert_if([[
+      that.check_ ();]])[
+    }
+
+    // Needed for the assignment in yynewSemanticOption.
+    semantic_option& operator= (const semantic_option& that)
+    {]b4_parse_assert_if([[
+      check_ ();
+      that.check_ ();]])[
+      yyrule = that.yyrule;
+      yystate = that.yystate;
+      yynext = that.yynext;
+      yyla = that.yyla;
+      return *this;
+    }
+
+    /// Only call state() and setState() on objects in yyitems, not temporaries.
+    glr_state* state();
+    const glr_state* state() const;
+    void setState(const glr_state* s);
+
+    const semantic_option* next () const YY_ATTRIBUTE_UNUSED;
+    semantic_option* next ();
+    void setNext (const semantic_option* s);
+
+    std::ptrdiff_t indexIn (const glr_stack_item* array) const YY_ATTRIBUTE_UNUSED;
+
+    /** True iff YYY0 and YYY1 represent identical options at the top level.
+     *  That is, they represent the same rule applied to RHS symbols
+     *  that produce the same terminal symbols.  */
+    bool
+    isIdenticalTo (const semantic_option& yyy1) const
+    {]b4_parse_assert_if([[
+      check_ ();
+      yyy1.check_ ();]])[
+      if (this->yyrule == yyy1.yyrule)
+        {
+          const glr_state *yys0, *yys1;
+          int yyn;
+          for (yys0 = this->state(),
+               yys1 = yyy1.state(),
+               yyn = yyrhsLength (this->yyrule);
+               yyn > 0;
+               yys0 = yys0->pred(),
+               yys1 = yys1->pred(), yyn -= 1)
+            if (yys0->yyposn != yys1->yyposn)
+              return false;
+          return true;
+        }
+      else
+        return false;
+    }
+
+    /** Assuming identicalOptions (YYY0,YYY1), destructively merge the
+     *  alternative semantic values for the RHS-symbols of YYY1 and YYY0.  */
+    void
+    mergeWith (semantic_option& yyy1)
+    {]b4_parse_assert_if([[
+      check_ ();
+      yyy1.check_ ();]])[
+      glr_state *yys0 = this->state ();
+      glr_state *yys1 = yyy1.state ();
+      for (int yyn = yyrhsLength (this->yyrule);
+           yyn > 0;
+           yyn -= 1, yys0 = yys0->pred (), yys1 = yys1->pred ())
+        {
+          if (yys0 == yys1)
+            break;
+          else if (yys0->yyresolved)
+            {
+              yys1->yyresolved = true;]b4_variant_if([[
+              YYASSERT (yys1->yylrState == yys0->yylrState);
+              ]b4_symbol_variant([yy_accessing_symbol (yys0->yylrState)],
+                                 [yys1->value ()], [copy], [yys0->value ()])], [[
+              yys1->value () = yys0->value ();]])[
+            }
+          else if (yys1->yyresolved)
+            {
+              yys0->yyresolved = true;]b4_variant_if([[
+              YYASSERT (yys0->yylrState == yys1->yylrState);
+              ]b4_symbol_variant([yy_accessing_symbol (yys1->yylrState)],
+                                 [yys0->value ()], [copy], [yys1->value ()])], [[
+              yys0->value () = yys1->value ();]])[
+            }
+          else
+            {
+              semantic_option* yyz0prev = YY_NULLPTR;
+              semantic_option* yyz0 = yys0->firstVal();
+              semantic_option* yyz1 = yys1->firstVal();
+              while (true)
+                {
+                  if (yyz1 == yyz0 || yyz1 == YY_NULLPTR)
+                    break;
+                  else if (yyz0 == YY_NULLPTR)
+                    {
+                      if (yyz0prev != YY_NULLPTR)
+                        yyz0prev->setNext (yyz1);
+                      else
+                        yys0->setFirstVal (yyz1);
+                      break;
+                    }
+                  else if (yyz0 < yyz1)
+                    {
+                      semantic_option* yyz = yyz0;
+                      if (yyz0prev != YY_NULLPTR)
+                        yyz0prev->setNext(yyz1);
+                      else
+                        yys0->setFirstVal(yyz1);
+                      yyz1 = yyz1->next();
+                      yyz0->setNext(yyz);
+                    }
+                  yyz0prev = yyz0;
+                  yyz0 = yyz0->next();
+                }
+              yys1->setFirstVal(yys0->firstVal());
+            }
+        }
+    }
+
+#if ]b4_api_PREFIX[DEBUG
+    void yyreportTree (size_t yyindent = 2) const
+    {]b4_parse_assert_if([[
+      check_ ();]])[
+      int yynrhs = yyrhsLength (this->yyrule);
+      const glr_state* yystates[1 + YYMAXRHS];
+      glr_state yyleftmost_state;
+
+      {
+        const glr_state* yys = this->state();
+        for (int yyi = yynrhs; 0 < yyi; yyi -= 1)
+          {
+            yystates[yyi] = yys;
+            yys = yys->pred();
+          }
+        if (yys == YY_NULLPTR)
+          {
+            yyleftmost_state.yyposn = 0;
+            yystates[0] = &yyleftmost_state;
+          }
+        else
+          yystates[0] = yys;
+      }
+
+      std::string yylhs = ]b4_namespace_ref[::]b4_parser_class[::symbol_name (yylhsNonterm (this->yyrule));
+      YYASSERT(this->state());
+      if (this->state()->yyposn < yystates[0]->yyposn + 1)
+        std::cerr << std::string(yyindent, ' ') << yylhs << " -> <Rule "
+                  << this->yyrule - 1 << ", empty>\n";
+      else
+        std::cerr << std::string(yyindent, ' ') << yylhs << " -> <Rule "
+                  << this->yyrule - 1 << ", tokens "
+                  << yystates[0]->yyposn + 1 << " .. "
+                  << this->state()->yyposn << ">\n";
+      for (int yyi = 1; yyi <= yynrhs; yyi += 1)
+        {
+          if (yystates[yyi]->yyresolved)
+            {
+              std::string yysym = ]b4_namespace_ref[::]b4_parser_class[::symbol_name (yy_accessing_symbol (yystates[yyi]->yylrState));
+              if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn)
+                std::cerr << std::string(yyindent + 2, ' ') << yysym
+                          << " <empty>\n";
+              else
+                std::cerr << std::string(yyindent + 2, ' ') << yysym
+                          << " <tokens " << yystates[yyi-1]->yyposn + 1
+                          << " .. " << yystates[yyi]->yyposn << ">\n";
+            }
+          else
+            yystates[yyi]->firstVal ()->yyreportTree (yyindent+2);
+        }
+    }
+#endif
+
+    /** Rule number for this reduction */
+    rule_num yyrule;
+
+  private:
+    template <typename T>
+    static const glr_stack_item* asItem(const T* state)
+    {
+      return reinterpret_cast<const glr_stack_item*>(state);
+    }
+    template <typename T>
+    static glr_stack_item* asItem(T* state)
+    {
+      return reinterpret_cast<glr_stack_item*>(state);
+    }
+    /** The last RHS state in the list of states to be reduced.  */
+    std::ptrdiff_t yystate;
+    /** Next sibling in chain of options.  To facilitate merging,
+     *  options are chained in decreasing order by address.  */
+    std::ptrdiff_t yynext;
+
+  public:
+    /** The lookahead for this reduction.  */
+    symbol_type yyla;
+
+]b4_parse_assert_if([[
+  public:
+    // Check invariants.
+    void check_ () const
+    {
+      YY_IGNORE_NULL_DEREFERENCE_BEGIN
+      YYASSERT (this->magic_ == MAGIC);
+      YY_IGNORE_NULL_DEREFERENCE_END
+    }
+
+    // A magic number to check our pointer arithmetic is sane.
+    enum { MAGIC = 0xeff1cace };
+    unsigned int magic_;]])[
+  }; // class semantic_option
+} // namespace
+
+namespace
+{
+  /** Type of the items in the GLR stack.
+   *  It can be either a glr_state or a semantic_option. The is_state_ field
+   *  indicates which item of the union is valid.  */
+  class glr_stack_item
+  {
+  public:
+    glr_stack_item (bool state = true)
+      : is_state_ (state)]b4_parse_assert_if([[
+      , magic_ (MAGIC)]])[
+    {
+      if (is_state_)
+        new (&raw_) glr_state;
+      else
+        new (&raw_) semantic_option;
+    }
+
+    glr_stack_item (const glr_stack_item& other) YY_NOEXCEPT YY_NOTHROW
+      : is_state_ (other.is_state_)]b4_parse_assert_if([[
+      , magic_ (MAGIC)]])[
+    {]b4_parse_assert_if([[
+      other.check_ ();]])[
+      std::memcpy (raw_, other.raw_, union_size);
+    }
+
+    glr_stack_item& operator= (glr_stack_item other)
+    {]b4_parse_assert_if([[
+      check_ ();
+      other.check_ ();]])[
+      std::swap (is_state_, other.is_state_);
+      std::swap (raw_, other.raw_);
+      return *this;
+    }
+
+    ~glr_stack_item ()
+    {]b4_parse_assert_if([[
+      check_ ();]])[
+      if (is_state ())
+        getState ().~glr_state ();
+      else
+        getOption ().~semantic_option ();
+    }
+
+    void setState (const glr_state &state)
+    {]b4_parse_assert_if([[
+      check_ ();
+      state.check_ ();]])[
+      if (this != state.asItem ())
+        {
+          if (is_state_)
+            getState ().~glr_state ();
+          else
+            getOption ().~semantic_option ();
+          new (&raw_) glr_state (state);
+          is_state_ = true;
+        }
+    }
+
+    glr_state& getState ()
+    {]b4_parse_assert_if([[
+      check_ ();]])[
+      YYDASSERT (is_state ());
+      void *yyp = raw_;
+      glr_state& res = *static_cast<glr_state*> (yyp);]b4_parse_assert_if([[
+      res.check_ ();]])[
+      return res;
+    }
+
+    const glr_state& getState () const
+    {]b4_parse_assert_if([[
+      check_ ();]])[
+      YYDASSERT (is_state ());
+      const void *yyp = raw_;
+      const glr_state& res = *static_cast<const glr_state*> (yyp);]b4_parse_assert_if([[
+      res.check_ ();]])[
+      return res;
+    }
+
+    semantic_option& getOption ()
+    {]b4_parse_assert_if([[
+      check_ ();]])[
+      YYDASSERT (!is_state ());
+      void *yyp = raw_;
+      return *static_cast<semantic_option*> (yyp);
+    }
+    const semantic_option& getOption () const
+    {]b4_parse_assert_if([[
+      check_ ();]])[
+      YYDASSERT (!is_state ());
+      const void *yyp = raw_;
+      return *static_cast<const semantic_option*> (yyp);
+    }
+    bool is_state () const
+    {]b4_parse_assert_if([[
+      check_ ();]])[
+      return is_state_;
+    }
+
+  private:
+    /// The possible contents of raw_. Since they have constructors, they cannot
+    /// be directly included in the union.
+    union contents
+    {
+      char yystate[sizeof (glr_state)];
+      char yyoption[sizeof (semantic_option)];
+    };
+    enum { union_size = sizeof (contents) };
+    union {
+      /// Strongest alignment constraints.
+      long double yyalign_me;
+      /// A buffer large enough to store the contents.
+      char raw_[union_size];
+    };
+    /** Type tag for the union. */
+    bool is_state_;
+]b4_parse_assert_if([[
+  public:
+    // Check invariants.
+    void check_ () const
+    {
+      YYASSERT (this->magic_ == MAGIC);
+      YYASSERT (this->is_state_ == false || this->is_state_ == true);
+    }
+    // A magic number to check our pointer arithmetic is sane.
+    enum { MAGIC = 0xDEAD1ACC }; // 3735886540.
+    const unsigned int magic_;]])[
+  }; // class glr_stack_item
+} // namespace
+
+glr_state* glr_state::pred ()
+{]b4_parse_assert_if([[
+  check_ ();]])[
+  YY_IGNORE_NULL_DEREFERENCE_BEGIN
+  return yypred ? &asItem (as_pointer_ (this) - yypred)->getState () : YY_NULLPTR;
+  YY_IGNORE_NULL_DEREFERENCE_END
+}
+
+const glr_state* glr_state::pred () const
+{]b4_parse_assert_if([[
+  check_ ();]])[
+  YY_IGNORE_NULL_DEREFERENCE_BEGIN
+  return yypred ? &asItem (as_pointer_ (this) - yypred)->getState () : YY_NULLPTR;
+  YY_IGNORE_NULL_DEREFERENCE_END
+}
+
+void glr_state::setPred (const glr_state* state)
+{]b4_parse_assert_if([[
+  check_ ();
+  if (state)
+    state->check_ ();]])[
+  yypred = state ? as_pointer_ (this) - as_pointer_ (state) : 0;
+}
+
+semantic_option* glr_state::firstVal ()
+{]b4_parse_assert_if([[
+  check_ ();]])[
+  return yyfirstVal ? &(asItem(this) - yyfirstVal)->getOption() : YY_NULLPTR;
+}
+
+const semantic_option* glr_state::firstVal () const
+{]b4_parse_assert_if([[
+  check_ ();]])[
+  return yyfirstVal ? &(asItem(this) - yyfirstVal)->getOption() : YY_NULLPTR;
+}
+
+void glr_state::setFirstVal (const semantic_option* option)
+{]b4_parse_assert_if([[
+  check_ ();]])[
+  yyfirstVal = option ? asItem(this) - asItem(option) : 0;
+}
+
+std::ptrdiff_t glr_state::indexIn (const glr_stack_item* array) const
+{]b4_parse_assert_if([[
+  check_ ();]])[
+  return asItem(this) - array;
+}
+
+std::ptrdiff_t semantic_option::indexIn (const glr_stack_item* array) const
+{
+  return asItem(this) - array;
+}
+
+glr_state* semantic_option::state ()
+{
+  YY_IGNORE_NULL_DEREFERENCE_BEGIN
+  return yystate ? &(asItem(this) - yystate)->getState() : YY_NULLPTR;
+  YY_IGNORE_NULL_DEREFERENCE_END
+}
+
+const glr_state* semantic_option::state () const
+{
+  return yystate ? &(asItem(this) - yystate)->getState() : YY_NULLPTR;
+}
+
+void semantic_option::setState (const glr_state* s)
+{
+  yystate = s ? asItem(this) - asItem(s) : 0;
+}
+
+const semantic_option* semantic_option::next () const
+{
+  return yynext ? &(asItem(this) - yynext)->getOption() : YY_NULLPTR;
+}
+
+semantic_option* semantic_option::next ()
+{
+  return yynext ? &(asItem(this) - yynext)->getOption() : YY_NULLPTR;
+}
+
+void semantic_option::setNext (const semantic_option* s)
+{
+  yynext = s ? asItem(this) - asItem(s) : 0;
+}
+
+void glr_state::destroy (char const* yymsg, ]b4_namespace_ref[::]b4_parser_class[& yyparser)
+{]b4_parse_assert_if([[
+  check_ ();]])[
+  if (yyresolved)
+    yyparser.yy_destroy_ (yymsg, yy_accessing_symbol(yylrState),
+                          value ()]b4_locations_if([, yyloc])[);
+  else
+    {
+#if ]b4_api_PREFIX[DEBUG
+      YYCDEBUG << yymsg
+               << (firstVal() ? " unresolved " : " incomplete ")
+               << (yy_accessing_symbol (yylrState) < YYNTOKENS ? "token" : "nterm")
+               << ' ' << yyparser.symbol_name (yy_accessing_symbol (yylrState))
+               << " ("]b4_locations_if([[
+               << yyloc << ": "]])[
+               << ")\n";
+#endif
+      if (firstVal() != YY_NULLPTR)
+        {
+          semantic_option& yyoption = *firstVal ();
+          glr_state *yyrh = yyoption.state ();
+          for (int yyn = yyrhsLength (yyoption.yyrule); yyn > 0; yyn -= 1)
+            {
+              yyrh->destroy (yymsg, yyparser);
+              yyrh = yyrh->pred();
+            }
+        }
+    }
+}
+
+
+#undef YYFILL
+#define YYFILL(N) yyfill (yyvsp, yylow, (N), yynormal)
+
+namespace
+{
+  class state_stack
+  {
+  public:
+    using parser_type = ]b4_namespace_ref[::]b4_parser_class[;
+    using symbol_kind = parser_type::symbol_kind;
+    using value_type = parser_type::value_type;]b4_locations_if([[
+    using location_type = parser_type::location_type;]])[
+
+    /** Initialize to a single empty stack, with total maximum
+     *  capacity for all stacks of YYSIZE.  */
+    state_stack (size_t yysize)
+      : yysplitPoint (YY_NULLPTR)
+    {
+      yyitems.reserve (yysize);
+    }
+
+#if YYSTACKEXPANDABLE
+    /** Returns false if it tried to expand but could not. */
+    bool
+    yyexpandGLRStackIfNeeded ()
+    {
+      return YYHEADROOM <= spaceLeft () || yyexpandGLRStack ();
+    }
+
+  private:
+    /** If *this is expandable, extend it.  WARNING: Pointers into the
+        stack from outside should be considered invalid after this call.
+        We always expand when there are 1 or fewer items left AFTER an
+        allocation, so that we can avoid having external pointers exist
+        across an allocation.  */
+    bool
+    yyexpandGLRStack ()
+    {
+      const size_t oldsize = yyitems.size();
+      if (YYMAXDEPTH - YYHEADROOM < oldsize)
+        return false;
+      const size_t yynewSize = YYMAXDEPTH < 2 * oldsize ? YYMAXDEPTH : 2 * oldsize;
+      const glr_stack_item *oldbase = &yyitems[0];
+
+      yyitems.reserve (yynewSize);
+      const glr_stack_item *newbase = &yyitems[0];
+
+      // Adjust the pointers.  Perform raw pointer arithmetic, as there
+      // is no reason for objects to be aligned on their size.
+      const ptrdiff_t disp
+        = reinterpret_cast<const char*> (newbase) - reinterpret_cast<const char*> (oldbase);
+      if (yysplitPoint)
+        const_cast<glr_state*&> (yysplitPoint)
+          = reinterpret_cast<glr_state*> (reinterpret_cast<char*> (const_cast<glr_state*> (yysplitPoint)) + disp);
+
+      for (std::vector<glr_state*>::iterator
+             i = yytops.begin (),
+             yyend = yytops.end ();
+           i != yyend; ++i)
+        if (glr_state_not_null (*i))
+          *i = reinterpret_cast<glr_state*>(reinterpret_cast<char*>(*i) + disp);
+
+      return true;
+    }
+
+  public:
+#else
+    bool yyexpandGLRStackIfNeeded ()
+    {
+      return YYHEADROOM <= spaceLeft ();
+    }
+#endif
+#undef YYSTACKEXPANDABLE
+
+    static bool glr_state_not_null (glr_state* s)
+    {
+      return s != YY_NULLPTR;
+    }
+
+    bool
+    reduceToOneStack ()
+    {
+      using iterator = std::vector<glr_state*>::iterator;
+      const iterator yybegin = yytops.begin();
+      const iterator yyend = yytops.end();
+      const iterator yyit = std::find_if(yybegin, yyend, glr_state_not_null);
+      if (yyit == yyend)
+        return false;
+      for (state_set_index yyk = create_state_set_index(yyit + 1 - yybegin);
+           yyk.uget() != numTops(); ++yyk)
+        yytops.yymarkStackDeleted (yyk);
+      yytops.yyremoveDeletes ();
+      yycompressStack ();
+      return true;
+    }
+
+    /** Called when returning to deterministic operation to clean up the extra
+     * stacks. */
+    void
+    yycompressStack ()
+    {
+      if (yytops.size() != 1 || !isSplit())
+        return;
+
+      // yyr is the state after the split point.
+      glr_state* yyr = YY_NULLPTR;
+      for (glr_state *yyp = firstTop(), *yyq = yyp->pred();
+           yyp != yysplitPoint;
+           yyr = yyp, yyp = yyq, yyq = yyp->pred())
+        yyp->setPred(yyr);
+
+      // This const_cast is okay, since anyway we have access to the mutable
+      // yyitems into which yysplitPoint points.
+      glr_stack_item* nextFreeItem
+        = const_cast<glr_state*> (yysplitPoint)->asItem () + 1;
+      yysplitPoint = YY_NULLPTR;
+      yytops.clearLastDeleted ();
+
+      while (yyr != YY_NULLPTR)
+        {
+          nextFreeItem->setState (*yyr);
+          glr_state& nextFreeState = nextFreeItem->getState();
+          yyr = yyr->pred();
+          nextFreeState.setPred(&(nextFreeItem - 1)->getState());
+          setFirstTop (&nextFreeState);
+          ++nextFreeItem;
+        }
+      yyitems.resize(static_cast<size_t>(nextFreeItem - yyitems.data()));
+    }
+
+    bool isSplit() const {
+      return yysplitPoint != YY_NULLPTR;
+    }
+
+    // Present the interface of a vector of glr_stack_item.
+    std::vector<glr_stack_item>::const_iterator begin () const
+    {
+      return yyitems.begin ();
+    }
+
+    std::vector<glr_stack_item>::const_iterator end () const
+    {
+      return yyitems.end ();
+    }
+
+    size_t size() const
+    {
+      return yyitems.size ();
+    }
+
+    glr_stack_item& operator[] (size_t i)
+    {
+      return yyitems[i];
+    }
+
+    glr_stack_item& stackItemAt (size_t index)
+    {
+      return yyitems[index];
+    }
+
+    size_t numTops () const
+    {
+      return yytops.size ();
+    }
+
+    glr_state* firstTop () const
+    {
+      return yytops[create_state_set_index (0)];
+    }
+
+    glr_state* topAt (state_set_index i) const
+    {
+      return yytops[i];
+    }
+
+    void setFirstTop (glr_state* value)
+    {
+      yytops[create_state_set_index (0)] = value;
+    }
+
+    void setTopAt (state_set_index i, glr_state* value)
+    {
+      yytops[i] = value;
+    }
+
+    void pop_back ()
+    {
+      yyitems.pop_back ();
+    }
+
+    void pop_back (size_t n)
+    {
+      yyitems.resize (yyitems.size () - n);
+    }
+
+    state_set_index
+    yysplitStack (state_set_index yyk)
+    {
+      if (!isSplit ())
+        {
+          YYASSERT (yyk.get () == 0);
+          yysplitPoint = topAt (yyk);
+        }
+      return yytops.yysplitStack (yyk);
+    }
+
+    /** Assuming that YYS is a GLRState somewhere on *this, update the
+     *  splitpoint of *this, if needed, so that it is at least as deep as
+     *  YYS.  */
+    void
+    yyupdateSplit (glr_state& yys)
+    {
+      if (isSplit() && &yys < yysplitPoint)
+        yysplitPoint = &yys;
+    }
+
+    /** Return a fresh GLRState.
+     * Callers should call yyreserveStack afterwards to make sure there is
+     * sufficient headroom.  */
+    glr_state& yynewGLRState (const glr_state& newState)
+    {
+      glr_state& state = yyitems[yynewGLRStackItem (true)].getState ();
+#if false && 201103L <= YY_CPLUSPLUS
+      state = std::move (newState);
+#else
+      state = newState;
+#endif
+      return state;
+    }
+
+    /** Return a fresh SemanticOption.
+     * Callers should call yyreserveStack afterwards to make sure there is
+     * sufficient headroom.  */
+    semantic_option& yynewSemanticOption (semantic_option newOption)
+    {
+      semantic_option& option = yyitems[yynewGLRStackItem (false)].getOption ();
+      option = std::move (newOption);
+      return option;
+    }
+
+    /* Do nothing if YYNORMAL or if *YYLOW <= YYLOW1.  Otherwise, fill in
+     * YYVSP[YYLOW1 .. *YYLOW-1] as in yyfillin and set *YYLOW = YYLOW1.
+     * For convenience, always return YYLOW1.  */
+    int
+    yyfill (glr_stack_item *yyvsp, int &yylow, int yylow1, bool yynormal)
+    {
+      if (!yynormal && yylow1 < yylow)
+        {
+          yyfillin (yyvsp, yylow, yylow1);
+          yylow = yylow1;
+        }
+      return yylow1;
+    }
+
+    /** Fill in YYVSP[YYLOW1 .. YYLOW0-1] from the chain of states starting
+     *  at YYVSP[YYLOW0].getState().pred().  Leaves YYVSP[YYLOW1].getState().pred()
+     *  containing the pointer to the next state in the chain.  */
+    void
+    yyfillin (glr_stack_item *yyvsp, int yylow0, int yylow1)
+    {
+      glr_state* s = yyvsp[yylow0].getState().pred();
+      YYASSERT(s != YY_NULLPTR);
+      for (int i = yylow0-1; i >= yylow1; i -= 1, s = s->pred())
+        {
+          glr_state& yys = yyvsp[i].getState();
+#if ]b4_api_PREFIX[DEBUG
+          yys.yylrState = s->yylrState;
+#endif
+          yys.yyresolved = s->yyresolved;
+          if (s->yyresolved)
+            {]b4_variant_if([[
+              new (&yys.value ()) value_type ();
+              ]b4_symbol_variant([yy_accessing_symbol (s->yylrState)],
+                                 [yys.value ()], [copy], [s->value ()])], [[
+              new (&yys.value ()) value_type (s->value ());]])[
+            }
+          else
+            /* The effect of using yyval or yyloc (in an immediate
+             * rule) is undefined.  */
+            yys.setFirstVal (YY_NULLPTR);]b4_locations_if([[
+          yys.yyloc = s->yyloc;]])[
+          yys.setPred(s->pred());
+        }
+    }
+
+#if ]b4_api_PREFIX[DEBUG
+
+    /*----------------------------------------------------------------------.
+    | Report that stack #YYK of *YYSTACKP is going to be reduced by YYRULE. |
+    `----------------------------------------------------------------------*/
+
+    void
+    yy_reduce_print (bool yynormal, glr_stack_item* yyvsp, state_set_index yyk,
+                     rule_num yyrule, parser_type& yyparser)
+    {
+      int yynrhs = yyrhsLength (yyrule);]b4_locations_if([
+      int yylow = 1;])[
+      int yyi;
+      std::cerr << "Reducing stack " << yyk.get() << " by rule " << yyrule - 1
+                << " (line " << int (yyrline[yyrule]) << "):\n";
+      if (! yynormal)
+        yyfillin (yyvsp, 1, -yynrhs);
+      /* The symbols being reduced.  */
+      for (yyi = 0; yyi < yynrhs; yyi++)
+        {
+          std::cerr << "   $" << yyi + 1 << " = ";
+          yyparser.yy_symbol_print_
+            (yy_accessing_symbol (yyvsp[yyi - yynrhs + 1].getState().yylrState),
+             yyvsp[yyi - yynrhs + 1].getState().value ()]b4_locations_if([[,
+             ]b4_rhs_location(yynrhs, yyi + 1)])[);
+          if (!yyvsp[yyi - yynrhs + 1].getState().yyresolved)
+            std::cerr << " (unresolved)";
+          std::cerr << '\n';
+        }
+    }
+
+
+#define YYINDEX(YYX)                                                         \
+      ((YYX) == YY_NULLPTR ? -1 : (YYX)->indexIn (yyitems.data ()))
+
+    void
+    dumpStack () const
+    {
+      for (size_t yyi = 0; yyi < size(); ++yyi)
+        {
+          const glr_stack_item& item = yyitems[yyi];
+          std::cerr << std::setw(3) << yyi << ". ";
+          if (item.is_state())
+            {
+              std::cerr << "Res: " << item.getState().yyresolved
+                        << ", LR State: " << item.getState().yylrState
+                        << ", posn: " << item.getState().yyposn
+                        << ", pred: " << YYINDEX(item.getState().pred());
+              if (! item.getState().yyresolved)
+                std::cerr << ", firstVal: "
+                          << YYINDEX(item.getState().firstVal());
+            }
+          else
+            {
+              std::cerr << "Option. rule: " << item.getOption().yyrule - 1
+                        << ", state: " << YYINDEX(item.getOption().state())
+                        << ", next: " << YYINDEX(item.getOption().next());
+            }
+          std::cerr << '\n';
+        }
+      std::cerr << "Tops:";
+      for (state_set_index yyi = create_state_set_index(0); yyi.uget() < numTops(); ++yyi) {
+        std::cerr << yyi.get() << ": " << YYINDEX(topAt(yyi)) << "; ";
+      }
+      std::cerr << '\n';
+    }
+
+#undef YYINDEX
+#endif
+
+    YYRESULTTAG
+    yyreportAmbiguity (const semantic_option& yyx0,
+                       const semantic_option& yyx1, parser_type& yyparser]b4_locations_if([, const location_type& yyloc])[)
+    {
+      YY_USE (yyx0);
+      YY_USE (yyx1);
+
+#if ]b4_api_PREFIX[DEBUG
+      std::cerr << "Ambiguity detected.\n"
+        "Option 1,\n";
+      yyx0.yyreportTree ();
+      std::cerr << "\nOption 2,\n";
+      yyx1.yyreportTree ();
+      std::cerr << '\n';
+#endif
+
+      yyparser.error (]b4_locations_if([yyloc, ])[YY_("syntax is ambiguous"));
+      return yyabort;
+    }
+
+#if ]b4_api_PREFIX[DEBUG
+    /* Print YYS (possibly NULL) and its predecessors. */
+    void
+    yypstates (const glr_state* yys) const
+    {
+      if (yys != YY_NULLPTR)
+        yys->yy_yypstack();
+      else
+        std::cerr << "<null>";
+      std::cerr << '\n';
+    }
+#endif
+
+  private:
+    size_t spaceLeft() const
+    {
+      return yyitems.capacity() - yyitems.size();
+    }
+
+    /** Return a fresh GLRStackItem in this.  The item is an LR state
+     *  if YYIS_STATE, and otherwise a semantic option.  Callers should call
+     *  yyreserveStack afterwards to make sure there is sufficient
+     *  headroom.  */
+    size_t
+    yynewGLRStackItem (bool yyis_state)
+    {
+      YYDASSERT(yyitems.size() < yyitems.capacity());
+      yyitems.push_back(glr_stack_item(yyis_state));
+      return yyitems.size() - 1;
+    }
+
+
+  public:
+    std::vector<glr_stack_item> yyitems;
+    // Where the stack splits. Anything below this address is deterministic.
+    const glr_state* yysplitPoint;
+    glr_state_set yytops;
+  }; // class state_stack
+} // namespace
+
+#undef YYFILL
+#define YYFILL(N) yystateStack.yyfill (yyvsp, yylow, (N), yynormal)
+
+namespace ]b4_namespace_ref[
+{
+  class ]b4_parser_class[::glr_stack
+  {
+  public:
+]b4_parse_error_bmatch([custom\|detailed\|verbose], [[
+    // Needs access to yypact_value_is_default, etc.
+    friend context;
+]])[
+
+    glr_stack (size_t yysize, parser_type& yyparser_yyarg]m4_ifset([b4_parse_param], [, b4_parse_param_decl])[)
+      : yyerrState (0)
+      , yystateStack (yysize)
+      , yyerrcnt (0)
+      , yyla ()
+      , yyparser (yyparser_yyarg)]m4_ifset([b4_parse_param], [,b4_parse_param_cons])[
+    {}
+
+    ~glr_stack ()
+    {
+      if (!this->yyla.empty ())
+        yyparser.yy_destroy_ ("Cleanup: discarding lookahead",
+                              this->yyla.kind (), this->yyla.value]b4_locations_if([, this->yyla.location])[);
+      popall_ ();
+    }
+
+    int yyerrState;
+]b4_locations_if([[  /* To compute the location of the error token.  */
+    glr_stack_item yyerror_range[3];]])[
+    state_stack yystateStack;
+    int yyerrcnt;
+    symbol_type yyla;
+    YYJMP_BUF yyexception_buffer;
+    parser_type& yyparser;
+
+  #define YYCHK1(YYE)                                                          \
+    do {                                                                       \
+      switch (YYE) {                                                           \
+      case yyok:                                                               \
+        break;                                                                 \
+      case yyabort:                                                            \
+        goto yyabortlab;                                                       \
+      case yyaccept:                                                           \
+        goto yyacceptlab;                                                      \
+      case yyerr:                                                              \
+        goto yyuser_error;                                                     \
+      default:                                                                 \
+        goto yybuglab;                                                         \
+      }                                                                        \
+    } while (false)
+
+    int
+    parse ()
+    {
+      int yyresult;
+      size_t yyposn;
+
+      YYCDEBUG << "Starting parse\n";
+
+      this->yyla.clear ();
+]m4_ifdef([b4_initial_action], [
+b4_dollar_pushdef([yyla.value], [], [], [yyla.location])dnl
+      b4_user_initial_action
+b4_dollar_popdef])[]dnl
+[
+      switch (YYSETJMP (this->yyexception_buffer))
+        {
+        case 0: break;
+        case 1: goto yyabortlab;
+        case 2: goto yyexhaustedlab;
+        default: goto yybuglab;
+        }
+      this->yyglrShift (create_state_set_index(0), 0, 0, this->yyla.value]b4_locations_if([, this->yyla.location])[);
+      yyposn = 0;
+
+      while (true)
+        {
+          /* For efficiency, we have two loops, the first of which is
+             specialized to deterministic operation (single stack, no
+             potential ambiguity).  */
+          /* Standard mode */
+          while (true)
+            {
+              const state_num yystate = this->firstTopState()->yylrState;
+              YYCDEBUG << "Entering state " << yystate << '\n';
+              if (yystate == YYFINAL)
+                goto yyacceptlab;
+              if (yy_is_defaulted_state (yystate))
+                {
+                  const rule_num yyrule = yy_default_action (yystate);
+                  if (yyrule == 0)
+                    {]b4_locations_if([[
+                      this->yyerror_range[1].getState().yyloc = this->yyla.location;]])[
+                      this->yyreportSyntaxError ();
+                      goto yyuser_error;
+                    }
+                  YYCHK1 (this->yyglrReduce (create_state_set_index(0), yyrule, true));
+                }
+              else
+                {
+                  yyget_token ();
+                  const short* yyconflicts;
+                  const int yyaction = yygetLRActions (yystate, this->yyla.kind (), yyconflicts);
+                  if (*yyconflicts != 0)
+                    break;
+                  if (yy_is_shift_action (yyaction))
+                    {
+                      YY_SYMBOL_PRINT ("Shifting", this->yyla.kind (), this->yyla.value, this->yyla.location);
+                      yyposn += 1;
+                      // FIXME: we should move yylval.
+                      this->yyglrShift (create_state_set_index(0), yyaction, yyposn, this->yyla.value]b4_locations_if([, this->yyla.location])[);
+                      yyla.clear ();
+                      if (0 < this->yyerrState)
+                        this->yyerrState -= 1;
+                    }
+                  else if (yy_is_error_action (yyaction))
+                    {]b4_locations_if([[
+                      this->yyerror_range[1].getState().yyloc = this->yyla.location;]])[
+                      /* Don't issue an error message again for exceptions
+                         thrown from the scanner.  */
+                      if (this->yyla.kind () != ]b4_symbol(error, kind)[)
+                        this->yyreportSyntaxError ();
+                      goto yyuser_error;
+                    }
+                  else
+                    YYCHK1 (this->yyglrReduce (create_state_set_index(0), -yyaction, true));
+                }
+            }
+
+          while (true)
+            {
+              for (state_set_index yys = create_state_set_index(0); yys.uget() < this->yystateStack.numTops(); ++yys)
+                this->yystateStack.yytops.setLookaheadNeeds(yys, !this->yyla.empty ());
+
+              /* yyprocessOneStack returns one of three things:
+
+                  - An error flag.  If the caller is yyprocessOneStack, it
+                    immediately returns as well.  When the caller is finally
+                    yyparse, it jumps to an error label via YYCHK1.
+
+                  - yyok, but yyprocessOneStack has invoked yymarkStackDeleted
+                    (yys), which sets the top state of yys to NULL.  Thus,
+                    yyparse's following invocation of yyremoveDeletes will remove
+                    the stack.
+
+                  - yyok, when ready to shift a token.
+
+                 Except in the first case, yyparse will invoke yyremoveDeletes and
+                 then shift the next token onto all remaining stacks.  This
+                 synchronization of the shift (that is, after all preceding
+                 reductions on all stacks) helps prevent double destructor calls
+                 on yylval in the event of memory exhaustion.  */
+
+              for (state_set_index yys = create_state_set_index (0); yys.uget () < this->yystateStack.numTops (); ++yys)
+                YYCHK1 (this->yyprocessOneStack (yys, yyposn]b4_locations_if([, &this->yyla.location])[));
+              this->yystateStack.yytops.yyremoveDeletes ();
+              if (this->yystateStack.yytops.size() == 0)
+                {
+                  this->yystateStack.yytops.yyundeleteLastStack ();
+                  if (this->yystateStack.yytops.size() == 0)
+                    this->yyFail (]b4_locations_if([&this->yyla.location, ])[YY_("syntax error"));
+                  YYCHK1 (this->yyresolveStack ());
+                  YYCDEBUG << "Returning to deterministic operation.\n";]b4_locations_if([[
+                  this->yyerror_range[1].getState ().yyloc = this->yyla.location;]])[
+                  this->yyreportSyntaxError ();
+                  goto yyuser_error;
+                }
+
+              /* If any yyglrShift call fails, it will fail after shifting.  Thus,
+                 a copy of yylval will already be on stack 0 in the event of a
+                 failure in the following loop.  Thus, yyla is emptied
+                 before the loop to make sure the user destructor for yylval isn't
+                 called twice.  */
+              symbol_kind_type yytoken_to_shift = this->yyla.kind ();
+              this->yyla.kind_ = ]b4_symbol(empty, kind)[;
+              yyposn += 1;
+              for (state_set_index yys = create_state_set_index (0); yys.uget () < this->yystateStack.numTops (); ++yys)
+                {
+                  const state_num yystate = this->topState (yys)->yylrState;
+                  const short* yyconflicts;
+                  const int yyaction = yygetLRActions (yystate, yytoken_to_shift, yyconflicts);
+                  /* Note that yyconflicts were handled by yyprocessOneStack.  */
+                  YYCDEBUG << "On stack " << yys.get() << ", ";
+                  YY_SYMBOL_PRINT ("shifting", yytoken_to_shift, this->yyla.value, this->yyla.location);
+                  this->yyglrShift (yys, yyaction, yyposn, this->yyla.value]b4_locations_if([, this->yyla.location])[);
+                  YYCDEBUG << "Stack " << yys.get() << " now in state "
+                           << this->topState(yys)->yylrState << '\n';
+                }
+]b4_variant_if([[
+                // FIXME: User destructors.
+                // Value type destructor.
+                ]b4_symbol_variant([[yytoken_to_shift]], [[this->yyla.value]], [[template destroy]])])[
+
+              if (this->yystateStack.yytops.size () == 1)
+                {
+                  YYCHK1 (this->yyresolveStack ());
+                  YYCDEBUG << "Returning to deterministic operation.\n";
+                  this->yystateStack.yycompressStack ();
+                  break;
+                }
+            }
+          continue;
+        yyuser_error:
+          this->yyrecoverSyntaxError (]b4_locations_if([&this->yyla.location])[);
+          yyposn = this->firstTopState()->yyposn;
+        }
+
+    yyacceptlab:
+      yyresult = 0;
+      goto yyreturn;
+
+    yybuglab:
+      YYASSERT (false);
+      goto yyabortlab;
+
+    yyabortlab:
+      yyresult = 1;
+      goto yyreturn;
+
+    yyexhaustedlab:
+      yyparser.error (]b4_locations_if([this->yyla.location, ])[YY_("memory exhausted"));
+      yyresult = 2;
+      goto yyreturn;
+
+    yyreturn:
+      return yyresult;
+    }
+  #undef YYCHK1
+
+    void yyreserveGlrStack ()
+    {
+      if (!yystateStack.yyexpandGLRStackIfNeeded ())
+        yyMemoryExhausted ();
+    }
+
+    _Noreturn void
+    yyMemoryExhausted ()
+    {
+      YYLONGJMP (yyexception_buffer, 2);
+    }
+
+    _Noreturn void
+    yyFail (]b4_locations_if([location_type* yylocp, ])[const char* yymsg)
+    {
+      if (yymsg != YY_NULLPTR)
+        yyparser.error (]b4_locations_if([*yylocp, ])[yymsg);
+      YYLONGJMP (yyexception_buffer, 1);
+    }
+
+                                  /* GLRStates */
+
+
+    /** Add a new semantic action that will execute the action for rule
+     *  YYRULE on the semantic values in YYRHS to the list of
+     *  alternative actions for YYSTATE.  Assumes that YYRHS comes from
+     *  stack #YYK of *this. */
+    void
+    yyaddDeferredAction (state_set_index yyk, glr_state* yystate,
+                         glr_state* yyrhs, rule_num yyrule)
+    {
+      semantic_option& yyopt = yystateStack.yynewSemanticOption (semantic_option (yyrule));
+      yyopt.setState (yyrhs);
+      yyopt.setNext (yystate->firstVal ());
+      if (yystateStack.yytops.lookaheadNeeds (yyk))
+        yyopt.yyla = this->yyla;
+      yystate->setFirstVal (&yyopt);
+
+      yyreserveGlrStack ();
+    }
+
+  #if ]b4_api_PREFIX[DEBUG
+    void yypdumpstack () const
+    {
+      yystateStack.dumpStack();
+    }
+  #endif
+
+    void
+    yyreportSyntaxError ()
+    {
+      if (yyerrState != 0)
+        return;
+]b4_parse_error_case(
+[simple], [[
+      std::string msg = YY_("syntax error");
+      yyparser.error (]b4_join(b4_locations_if([yyla.location]), [[YY_MOVE (msg)]])[);]],
+[custom], [[
+      context yyctx (*this, yyla);
+      yyparser.report_syntax_error (yyctx);]],
+[[
+      context yyctx (*this, yyla);
+      std::string msg = yyparser.yysyntax_error_ (yyctx);
+      yyparser.error (]b4_join(b4_locations_if([yyla.location]), [[YY_MOVE (msg)]])[);]])[
+      yyerrcnt += 1;
+    }
+
+    /* Recover from a syntax error on this, assuming that yytoken,
+       yylval, and yylloc are the syntactic category, semantic value, and location
+       of the lookahead.  */
+    void
+    yyrecoverSyntaxError (]b4_locations_if([location_type* yylocp])[)
+    {
+      if (yyerrState == 3)
+        /* We just shifted the error token and (perhaps) took some
+           reductions.  Skip tokens until we can proceed.  */
+        while (true)
+          {
+            if (this->yyla.kind () == ]b4_symbol(eof, kind)[)
+              yyFail (]b4_locations_if([yylocp, ])[YY_NULLPTR);
+            if (this->yyla.kind () != ]b4_symbol(empty, kind)[)
+              {]b4_locations_if([[
+                /* We throw away the lookahead, but the error range
+                   of the shifted error token must take it into account.  */
+                glr_state *yys = firstTopState();
+                yyerror_range[1].getState().yyloc = yys->yyloc;
+                yyerror_range[2].getState().yyloc = this->yyla.location;
+                YYLLOC_DEFAULT ((yys->yyloc), yyerror_range, 2);]])[
+                yyparser.yy_destroy_ ("Error: discarding",
+                                      this->yyla.kind (), this->yyla.value]b4_locations_if([, this->yyla.location])[);]b4_variant_if([[
+                // Value type destructor.
+                ]b4_symbol_variant([[this->yyla.kind ()]], [[this->yyla.value]], [[template destroy]])])[
+                this->yyla.kind_ = ]b4_symbol(empty, kind)[;
+              }
+            yyget_token ();
+            int yyj = yypact[firstTopState()->yylrState];
+            if (yypact_value_is_default (yyj))
+              return;
+            yyj += this->yyla.kind ();
+            if (yyj < 0 || YYLAST < yyj || yycheck[yyj] != this->yyla.kind ())
+              {
+                if (yydefact[firstTopState()->yylrState] != 0)
+                  return;
+              }
+            else if (! yytable_value_is_error (yytable[yyj]))
+              return;
+          }
+
+      if (!yystateStack.reduceToOneStack())
+        yyFail (]b4_locations_if([yylocp, ])[YY_NULLPTR);
+
+      /* Now pop stack until we find a state that shifts the error token.  */
+      yyerrState = 3;
+      while (firstTopState () != YY_NULLPTR)
+        {
+          glr_state *yys = firstTopState ();
+          int yyj = yypact[yys->yylrState];
+          if (! yypact_value_is_default (yyj))
+            {
+              yyj += YYTERROR;
+              if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR
+                  && yy_is_shift_action (yytable[yyj]))
+                {
+                  /* Shift the error token.  */]b4_locations_if([[
+                  /* First adjust its location.*/
+                  location_type yyerrloc;
+                  yyerror_range[2].getState().yyloc = this->yyla.location;
+                  YYLLOC_DEFAULT (yyerrloc, (yyerror_range), 2);]])[
+                  YY_SYMBOL_PRINT ("Shifting", yy_accessing_symbol (yytable[yyj]),
+                                   this->yyla.value, yyerrloc);
+                  yyglrShift (create_state_set_index(0), yytable[yyj],
+                              yys->yyposn, yyla.value]b4_locations_if([, yyerrloc])[);
+                  yys = firstTopState();
+                  break;
+                }
+            }]b4_locations_if([[
+          yyerror_range[1].getState().yyloc = yys->yyloc;]])[
+          if (yys->pred() != YY_NULLPTR)
+            yys->destroy ("Error: popping", yyparser);
+          yystateStack.setFirstTop(yys->pred());
+          yystateStack.pop_back();
+        }
+      if (firstTopState() == YY_NULLPTR)
+        yyFail (]b4_locations_if([yylocp, ])[YY_NULLPTR);
+    }
+
+    YYRESULTTAG
+    yyprocessOneStack (state_set_index yyk,
+                       size_t yyposn]b4_locations_if([, location_type* yylocp])[)
+    {
+      while (yystateStack.topAt(yyk) != YY_NULLPTR)
+        {
+          const state_num yystate = topState(yyk)->yylrState;
+          YYCDEBUG << "Stack " << yyk.get()
+                   << " Entering state " << yystate << '\n';
+
+          YYASSERT (yystate != YYFINAL);
+
+          if (yy_is_defaulted_state (yystate))
+            {
+              const rule_num yyrule = yy_default_action (yystate);
+              if (yyrule == 0)
+                {
+                  YYCDEBUG << "Stack " << yyk.get() << " dies.\n";
+                  yystateStack.yytops.yymarkStackDeleted (yyk);
+                  return yyok;
+                }
+              const YYRESULTTAG yyflag
+                = yyglrReduce (yyk, yyrule, yyimmediate[yyrule]);
+              if (yyflag == yyerr)
+                {
+                  YYCDEBUG << "Stack " << yyk.get() << " dies"
+                    " (predicate failure or explicit user error).\n";
+                  yystateStack.yytops.yymarkStackDeleted (yyk);
+                  return yyok;
+                }
+              if (yyflag != yyok)
+                return yyflag;
+            }
+          else
+            {
+              yystateStack.yytops.setLookaheadNeeds(yyk, true);
+              yyget_token ();
+              const short* yyconflicts;
+              const int yyaction = yygetLRActions (yystate, this->yyla.kind (), yyconflicts);
+
+              for (; *yyconflicts != 0; ++yyconflicts)
+                {
+                  state_set_index yynewStack = yystateStack.yysplitStack (yyk);
+                  YYCDEBUG << "Splitting off stack " << yynewStack.get()
+                           << " from " << yyk.get() << ".\n";
+                  YYRESULTTAG yyflag =
+                    yyglrReduce (yynewStack, *yyconflicts, yyimmediate[*yyconflicts]);
+                  if (yyflag == yyok)
+                    YYCHK (yyprocessOneStack (yynewStack,
+                                              yyposn]b4_locations_if([, yylocp])[));
+                  else if (yyflag == yyerr)
+                    {
+                      YYCDEBUG << "Stack " << yynewStack.get() << " dies.\n";
+                      yystateStack.yytops.yymarkStackDeleted (yynewStack);
+                    }
+                  else
+                    return yyflag;
+                }
+
+              if (yy_is_shift_action (yyaction))
+                break;
+              else if (yy_is_error_action (yyaction))
+                {
+                  YYCDEBUG << "Stack " << yyk.get() << " dies.\n";
+                  yystateStack.yytops.yymarkStackDeleted (yyk);
+                  break;
+                }
+              else
+                {
+                  YYRESULTTAG yyflag
+                    = yyglrReduce (yyk, -yyaction, yyimmediate[-yyaction]);
+                  if (yyflag == yyerr)
+                    {
+                      YYCDEBUG << "Stack " << yyk.get() << " dies"
+                        " (predicate failure or explicit user error).\n";
+                      yystateStack.yytops.yymarkStackDeleted (yyk);
+                      break;
+                    }
+                  else if (yyflag != yyok)
+                    return yyflag;
+                }
+            }
+        }
+      return yyok;
+    }
+
+    /** Perform user action for rule number YYN, with RHS length YYRHSLEN,
+     *  and top stack item YYVSP.  YYVALP points to place to put semantic
+     *  value ($$), and yylocp points to place for location information
+     *  (@@$).  Returns yyok for normal return, yyaccept for YYACCEPT,
+     *  yyerr for YYERROR, yyabort for YYABORT.  */
+    YYRESULTTAG
+    yyuserAction (rule_num yyrule, int yyrhslen, glr_stack_item* yyvsp, state_set_index yyk,
+                  value_type* yyvalp]b4_locations_if([, location_type* yylocp])[)
+    {
+      bool yynormal YY_ATTRIBUTE_UNUSED = !yystateStack.isSplit();
+      int yylow = 1;
+]b4_parse_param_use([yyvalp], [yylocp])dnl
+[      YY_USE (yyk);
+      YY_USE (yyrhslen);
+    # undef yyerrok
+    # define yyerrok (yyerrState = 0)
+    # undef YYACCEPT
+    # define YYACCEPT return yyaccept
+    # undef YYABORT
+    # define YYABORT return yyabort
+    # undef YYERROR
+    # define YYERROR return yyerrok, yyerr
+    # undef YYRECOVERING
+    # define YYRECOVERING() (yyerrState != 0)
+    # undef yytoken
+    # define yytoken this->yyla.kind_
+    # undef yyclearin
+    # define yyclearin (yytoken = ]b4_symbol(empty, kind)[)
+    # undef YYBACKUP
+    # define YYBACKUP(Token, Value)                                              \
+      return yyparser.error (]b4_locations_if([*yylocp, ])[YY_("syntax error: cannot back up")),     \
+             yyerrok, yyerr
+
+]b4_variant_if([[
+      /* Variants are always initialized to an empty instance of the
+         correct type. The default '$$ = $1' action is NOT applied
+         when using variants.  */
+      // However we really need to prepare yyvsp now if we want to get
+      // correct locations, so invoke YYFILL for $1 anyway.
+      (void) YYFILL (1-yyrhslen);
+      ]b4_symbol_variant([[yylhsNonterm (yyrule)]], [(*yyvalp)], [emplace])], [[
+      if (yyrhslen == 0)
+        *yyvalp = yyval_default;
+      else
+        *yyvalp = yyvsp[YYFILL (1-yyrhslen)].getState().value ();]])[]b4_locations_if([[
+      /* Default location. */
+      YYLLOC_DEFAULT ((*yylocp), (yyvsp - yyrhslen), yyrhslen);
+      yyerror_range[1].getState().yyloc = *yylocp;
+]])[
+    /* If yyk == -1, we are running a deferred action on a temporary
+       stack.  In that case, YY_REDUCE_PRINT must not play with YYFILL,
+       so pretend the stack is "normal". */
+    YY_REDUCE_PRINT ((yynormal || yyk == create_state_set_index (-1), yyvsp, yyk, yyrule, yyparser));
+    #if YY_EXCEPTIONS
+      try
+      {
+    #endif // YY_EXCEPTIONS
+      switch (yyrule)
+        {
+    ]b4_user_actions[
+          default: break;
+        }
+    #if YY_EXCEPTIONS
+      }
+      catch (const syntax_error& yyexc)
+        {
+          YYCDEBUG << "Caught exception: " << yyexc.what() << '\n';]b4_locations_if([
+          *yylocp = yyexc.location;])[
+          yyparser.error (]b4_locations_if([*yylocp, ])[yyexc.what ());
+          YYERROR;
+        }
+    #endif // YY_EXCEPTIONS
+    YY_SYMBOL_PRINT ("-> $$ =", yylhsNonterm (yyrule), *yyvalp, *yylocp);
+
+      return yyok;
+    # undef yyerrok
+    # undef YYABORT
+    # undef YYACCEPT
+    # undef YYERROR
+    # undef YYBACKUP
+    # undef yytoken
+    # undef yyclearin
+    # undef YYRECOVERING
+    }
+
+    YYRESULTTAG
+    yyresolveStack ()
+    {
+      if (yystateStack.isSplit ())
+        {
+          int yyn = 0;
+          for (glr_state* yys = firstTopState ();
+               yys != yystateStack.yysplitPoint;
+               yys = yys->pred ())
+            yyn += 1;
+          YYCHK (yyresolveStates (*firstTopState (), yyn));
+        }
+      return yyok;
+    }
+
+    /** Pop the symbols consumed by reduction #YYRULE from the top of stack
+     *  #YYK of *YYSTACKP, and perform the appropriate semantic action on their
+     *  semantic values.  Assumes that all ambiguities in semantic values
+     *  have been previously resolved.  Set *YYVALP to the resulting value,
+     *  and *YYLOCP to the computed location (if any).  Return value is as
+     *  for userAction.  */
+    YYRESULTTAG
+    yydoAction (state_set_index yyk, rule_num yyrule,
+                value_type* yyvalp]b4_locations_if([, location_type* yylocp])[)
+    {
+      const int yynrhs = yyrhsLength (yyrule);
+
+      if (!yystateStack.isSplit())
+        {
+          /* Standard special case: single stack.  */
+          YYASSERT (yyk.get() == 0);
+          glr_stack_item* yyrhs = yystateStack.firstTop()->asItem();
+          const YYRESULTTAG res
+            = yyuserAction (yyrule, yynrhs, yyrhs, yyk, yyvalp]b4_locations_if([, yylocp])[);
+          yystateStack.pop_back(static_cast<size_t>(yynrhs));
+          yystateStack.setFirstTop(&yystateStack[yystateStack.size() - 1].getState());
+          return res;
+        }
+      else
+        {
+          glr_stack_item yyrhsVals[YYMAXRHS + YYMAXLEFT + 1];
+          glr_state* yys = yystateStack.topAt(yyk);
+          yyrhsVals[YYMAXRHS + YYMAXLEFT].getState().setPred(yys);]b4_locations_if([[
+          if (yynrhs == 0)
+            /* Set default location.  */
+            yyrhsVals[YYMAXRHS + YYMAXLEFT - 1].getState().yyloc = yys->yyloc;]])[
+          for (int yyi = 0; yyi < yynrhs; yyi += 1)
+            {
+              yys = yys->pred();
+              YYASSERT (yys != YY_NULLPTR);
+            }
+          yystateStack.yyupdateSplit (*yys);
+          yystateStack.setTopAt(yyk, yys);
+          return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1,
+                               yyk,
+                               yyvalp]b4_locations_if([, yylocp])[);
+        }
+    }
+
+    /** Pop items off stack #YYK of *YYSTACKP according to grammar rule YYRULE,
+     *  and push back on the resulting nonterminal symbol.  Perform the
+     *  semantic action associated with YYRULE and store its value with the
+     *  newly pushed state, if YYFORCEEVAL or if *YYSTACKP is currently
+     *  unambiguous.  Otherwise, store the deferred semantic action with
+     *  the new state.  If the new state would have an identical input
+     *  position, LR state, and predecessor to an existing state on the stack,
+     *  it is identified with that existing state, eliminating stack #YYK from
+     *  *YYSTACKP.  In this case, the semantic value is
+     *  added to the options for the existing state's semantic value.
+     */
+    YYRESULTTAG
+    yyglrReduce (state_set_index yyk, rule_num yyrule, bool yyforceEval)
+    {
+      size_t yyposn = topState(yyk)->yyposn;
+
+      if (yyforceEval || !yystateStack.isSplit())
+        {
+          value_type val;]b4_locations_if([[
+          location_type loc;]])[
+
+          YYRESULTTAG yyflag = yydoAction (yyk, yyrule, &val]b4_locations_if([, &loc])[);
+          if (yyflag == yyerr && yystateStack.isSplit())
+            {]b4_parse_trace_if([[
+              YYCDEBUG << "Parse on stack " << yyk.get ()
+                       << " rejected by rule " << yyrule - 1
+                       << " (line " << int (yyrline[yyrule]) << ").\n";
+            ]])[}
+          if (yyflag != yyok)
+            return yyflag;
+          yyglrShift (yyk,
+                      yyLRgotoState (topState(yyk)->yylrState,
+                                     yylhsNonterm (yyrule)),
+                      yyposn, val]b4_locations_if([, loc])[);]b4_variant_if([[
+          // FIXME: User destructors.
+          // Value type destructor.
+          ]b4_symbol_variant([[yylhsNonterm (yyrule)]], [[val]], [[template destroy]])])[
+        }
+      else
+        {
+          glr_state *yys = yystateStack.topAt(yyk);
+          glr_state *yys0 = yys;
+          for (int yyn = yyrhsLength (yyrule); 0 < yyn; yyn -= 1)
+            {
+              yys = yys->pred();
+              YYASSERT (yys != YY_NULLPTR);
+            }
+          yystateStack.yyupdateSplit (*yys);
+          state_num yynewLRState = yyLRgotoState (yys->yylrState, yylhsNonterm (yyrule));]b4_parse_trace_if([[
+          YYCDEBUG << "Reduced stack " << yyk.get ()
+                   << " by rule " << yyrule - 1 << " (line " << int (yyrline[yyrule])
+                   << "); action deferred.  Now in state " << yynewLRState
+                   << ".\n";]])[
+          for (state_set_index yyi = create_state_set_index(0); yyi.uget() < yystateStack.numTops(); ++yyi)
+            if (yyi != yyk && yystateStack.topAt(yyi) != YY_NULLPTR)
+              {
+                const glr_state* yysplit = yystateStack.yysplitPoint;
+                glr_state* yyp = yystateStack.topAt(yyi);
+                while (yyp != yys && yyp != yysplit
+                       && yyp->yyposn >= yyposn)
+                  {
+                    if (yyp->yylrState == yynewLRState
+                        && yyp->pred() == yys)
+                      {
+                        yyaddDeferredAction (yyk, yyp, yys0, yyrule);
+                        yystateStack.yytops.yymarkStackDeleted (yyk);
+                        YYCDEBUG << "Merging stack " << yyk.get ()
+                                 << " into stack " << yyi.get () << ".\n";
+                        return yyok;
+                      }
+                    yyp = yyp->pred();
+                  }
+              }
+          yystateStack.setTopAt(yyk, yys);
+          yyglrShiftDefer (yyk, yynewLRState, yyposn, yys0, yyrule);
+        }
+      return yyok;
+    }
+
+    /** Shift stack #YYK of *YYSTACKP, to a new state corresponding to LR
+     *  state YYLRSTATE, at input position YYPOSN, with the (unresolved)
+     *  semantic value of YYRHS under the action for YYRULE.  */
+    void
+    yyglrShiftDefer (state_set_index yyk, state_num yylrState,
+                     size_t yyposn, glr_state* yyrhs, rule_num yyrule)
+    {
+      glr_state& yynewState = yystateStack.yynewGLRState (
+        glr_state (yylrState, yyposn));
+      yynewState.setPred (yystateStack.topAt (yyk));
+      yystateStack.setTopAt (yyk, &yynewState);
+
+      /* Invokes yyreserveStack.  */
+      yyaddDeferredAction (yyk, &yynewState, yyrhs, yyrule);
+    }
+
+    /** Shift to a new state on stack #YYK of *YYSTACKP, corresponding to LR
+     * state YYLRSTATE, at input position YYPOSN, with (resolved) semantic
+     * value YYVAL_ARG and source location YYLOC_ARG.  */
+    void
+    yyglrShift (state_set_index yyk, state_num yylrState,
+                size_t yyposn,
+                const value_type& yyval_arg]b4_locations_if([, const location_type& yyloc_arg])[)
+    {
+      glr_state& yynewState = yystateStack.yynewGLRState (
+        glr_state (yylrState, yyposn, yyval_arg]b4_locations_if([, yyloc_arg])[));
+      yynewState.setPred (yystateStack.topAt(yyk));
+      yystateStack.setTopAt (yyk, &yynewState);
+      yyreserveGlrStack ();
+    }
+
+#if ]b4_api_PREFIX[DEBUG
+    void
+    yypstack (state_set_index yyk) const
+    {
+      yystateStack.yypstates (yystateStack.topAt (yyk));
+    }
+#endif
+
+    glr_state* topState(state_set_index i) {
+      return yystateStack.topAt(i);
+    }
+
+    glr_state* firstTopState() {
+      return yystateStack.firstTop();
+    }
+
+  private:
+
+    void popall_ ()
+    {
+      /* If the stack is well-formed, pop the stack until it is empty,
+         destroying its entries as we go.  But free the stack regardless
+         of whether it is well-formed.  */
+      for (state_set_index k = create_state_set_index(0); k.uget() < yystateStack.numTops(); k += 1)
+        if (yystateStack.topAt(k) != YY_NULLPTR)
+          {
+            while (yystateStack.topAt(k) != YY_NULLPTR)
+              {
+                glr_state* state = topState(k);]b4_locations_if([[
+                yyerror_range[1].getState().yyloc = state->yyloc;]])[
+                if (state->pred() != YY_NULLPTR)
+                  state->destroy ("Cleanup: popping", yyparser);
+                yystateStack.setTopAt(k, state->pred());
+                yystateStack.pop_back();
+              }
+              break;
+          }
+    }
+
+    /** Resolve the previous YYN states starting at and including state YYS
+     *  on *YYSTACKP. If result != yyok, some states may have been left
+     *  unresolved possibly with empty semantic option chains.  Regardless
+     *  of whether result = yyok, each state has been left with consistent
+     *  data so that destroy can be invoked if necessary.  */
+    YYRESULTTAG
+    yyresolveStates (glr_state& yys, int yyn)
+    {
+      if (0 < yyn)
+        {
+          YYASSERT (yys.pred() != YY_NULLPTR);
+          YYCHK (yyresolveStates (*yys.pred(), yyn-1));
+          if (! yys.yyresolved)
+            YYCHK (yyresolveValue (yys));
+        }
+      return yyok;
+    }
+
+    static void
+    yyuserMerge (int yyn, value_type& yy0, value_type& yy1)
+    {
+      YY_USE (yy0);
+      YY_USE (yy1);
+
+      switch (yyn)
+        {
+]b4_mergers[
+          default: break;
+        }
+    }
+
+    /** Resolve the ambiguity represented in state YYS in *YYSTACKP,
+     *  perform the indicated actions, and set the semantic value of YYS.
+     *  If result != yyok, the chain of semantic options in YYS has been
+     *  cleared instead or it has been left unmodified except that
+     *  redundant options may have been removed.  Regardless of whether
+     *  result = yyok, YYS has been left with consistent data so that
+     *  destroy can be invoked if necessary.  */
+    YYRESULTTAG
+    yyresolveValue (glr_state& yys)
+    {
+      semantic_option* yybest = yys.firstVal();
+      YYASSERT(yybest != YY_NULLPTR);
+      bool yymerge = false;
+      YYRESULTTAG yyflag;]b4_locations_if([
+      location_type *yylocp = &yys.yyloc;])[
+
+      semantic_option* yypPrev = yybest;
+      for (semantic_option* yyp = yybest->next();
+           yyp != YY_NULLPTR; )
+        {
+          if (yybest->isIdenticalTo (*yyp))
+            {
+              yybest->mergeWith (*yyp);
+              yypPrev->setNext(yyp->next());
+              yyp = yypPrev->next();
+            }
+          else
+            {
+              switch (yypreference (*yybest, *yyp))
+                {
+                case 0:]b4_locations_if([[
+                  yyresolveLocations (yys, 1);]])[
+                  return yystateStack.yyreportAmbiguity (*yybest, *yyp, yyparser]b4_locations_if([, *yylocp])[);
+                  break;
+                case 1:
+                  yymerge = true;
+                  break;
+                case 2:
+                  break;
+                case 3:
+                  yybest = yyp;
+                  yymerge = false;
+                  break;
+                default:
+                  /* This cannot happen so it is not worth a YYASSERT (false),
+                     but some compilers complain if the default case is
+                     omitted.  */
+                  break;
+                }
+              yypPrev = yyp;
+              yyp = yyp->next();
+            }
+        }
+
+      value_type val;
+      if (yymerge)
+        {
+          int yyprec = yydprec[yybest->yyrule];
+          yyflag = yyresolveAction (*yybest, &val]b4_locations_if([, yylocp])[);
+          if (yyflag == yyok)
+            for (semantic_option* yyp = yybest->next();
+                 yyp != YY_NULLPTR;
+                 yyp = yyp->next())
+              {
+                if (yyprec == yydprec[yyp->yyrule])
+                  {
+                    value_type yyval_other;]b4_locations_if([
+                    location_type yydummy;])[
+                    yyflag = yyresolveAction (*yyp, &yyval_other]b4_locations_if([, &yydummy])[);
+                    if (yyflag != yyok)
+                      {
+                        yyparser.yy_destroy_ ("Cleanup: discarding incompletely merged value for",
+                                              yy_accessing_symbol (yys.yylrState),
+                                              this->yyla.value]b4_locations_if([, *yylocp])[);
+                        break;
+                      }
+                    yyuserMerge (yymerger[yyp->yyrule], val, yyval_other);]b4_variant_if([[
+                    // FIXME: User destructors.
+                    // Value type destructor.
+                    ]b4_symbol_variant([[yy_accessing_symbol (yys.yylrState)]], [[yyval_other]], [[template destroy]])])[
+                  }
+              }
+        }
+      else
+        yyflag = yyresolveAction (*yybest, &val]b4_locations_if([, yylocp])[);
+
+      if (yyflag == yyok)
+        {
+          yys.yyresolved = true;
+          YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN]b4_variant_if([[
+          new (&yys.value ()) value_type ();
+          ]b4_symbol_variant([yy_accessing_symbol (yys.yylrState)],
+                             [yys.value ()], [copy], [val])], [[
+          new (&yys.value ()) value_type (val);]])[
+
+          YY_IGNORE_MAYBE_UNINITIALIZED_END
+        }
+      else
+        yys.setFirstVal(YY_NULLPTR);
+]b4_variant_if([[
+      // FIXME: User destructors.
+      // Value type destructor.
+      ]b4_symbol_variant([[yy_accessing_symbol (yys.yylrState)]], [[val]], [[template destroy]])])[
+      return yyflag;
+    }
+
+    /** Resolve the states for the RHS of YYOPT on *YYSTACKP, perform its
+     *  user action, and return the semantic value and location in *YYVALP
+     *  and *YYLOCP.  Regardless of whether result = yyok, all RHS states
+     *  have been destroyed (assuming the user action destroys all RHS
+     *  semantic values if invoked).  */
+    YYRESULTTAG
+    yyresolveAction (semantic_option& yyopt, value_type* yyvalp]b4_locations_if([, location_type* yylocp])[)
+    {
+      glr_state* yyoptState = yyopt.state();
+      YYASSERT(yyoptState != YY_NULLPTR);
+      int yynrhs = yyrhsLength (yyopt.yyrule);
+      YYRESULTTAG yyflag = yyresolveStates (*yyoptState, yynrhs);
+      if (yyflag != yyok)
+        {
+          for (glr_state *yys = yyoptState; yynrhs > 0; yys = yys->pred(), yynrhs -= 1)
+            yys->destroy ("Cleanup: popping", yyparser);
+          return yyflag;
+        }
+
+      glr_stack_item yyrhsVals[YYMAXRHS + YYMAXLEFT + 1];
+      yyrhsVals[YYMAXRHS + YYMAXLEFT].getState().setPred(yyopt.state());]b4_locations_if([[
+      if (yynrhs == 0)
+        /* Set default location.  */
+        yyrhsVals[YYMAXRHS + YYMAXLEFT - 1].getState().yyloc = yyoptState->yyloc;]])[
+      {
+        symbol_type yyla_current = std::move (this->yyla);
+        this->yyla = std::move (yyopt.yyla);
+        yyflag = yyuserAction (yyopt.yyrule, yynrhs,
+                               yyrhsVals + YYMAXRHS + YYMAXLEFT - 1,
+                               create_state_set_index (-1),
+                               yyvalp]b4_locations_if([, yylocp])[);
+        this->yyla = std::move (yyla_current);
+      }
+      return yyflag;
+    }]b4_locations_if([[
+
+    /** Resolve the locations for each of the YYN1 states in *YYSTACKP,
+     *  ending at YYS1.  Has no effect on previously resolved states.
+     *  The first semantic option of a state is always chosen.  */
+    void
+    yyresolveLocations (glr_state &yys1, int yyn1)
+    {
+      if (0 < yyn1)
+        {
+          yyresolveLocations (*yys1.pred(), yyn1 - 1);
+          if (!yys1.yyresolved)
+            {
+              glr_stack_item yyrhsloc[1 + YYMAXRHS];
+              YYASSERT (yys1.firstVal() != YY_NULLPTR);
+              semantic_option& yyoption = *yys1.firstVal();
+              const int yynrhs = yyrhsLength (yyoption.yyrule);
+              if (0 < yynrhs)
+                {
+                  yyresolveLocations (*yyoption.state(), yynrhs);
+                  const glr_state *yys = yyoption.state();
+                  for (int yyn = yynrhs; yyn > 0; yyn -= 1)
+                  {
+                    yyrhsloc[yyn].getState().yyloc = yys->yyloc;
+                    yys = yys->pred();
+                  }
+                }
+              else
+                {
+                  /* Both yyresolveAction and yyresolveLocations traverse the GSS
+                     in reverse rightmost order.  It is only necessary to invoke
+                     yyresolveLocations on a subforest for which yyresolveAction
+                     would have been invoked next had an ambiguity not been
+                     detected.  Thus the location of the previous state (but not
+                     necessarily the previous state itself) is guaranteed to be
+                     resolved already.  */
+                  YY_IGNORE_NULL_DEREFERENCE_BEGIN
+                  yyrhsloc[0].getState().yyloc = yyoption.state()->yyloc;
+                  YY_IGNORE_NULL_DEREFERENCE_END
+                }
+              YYLLOC_DEFAULT ((yys1.yyloc), yyrhsloc, yynrhs);
+            }
+        }
+    }]])[
+
+    /** If yytoken is empty, fetch the next token.  */
+    void
+    yyget_token ()
+    {
+]b4_parse_param_use()dnl
+[      if (this->yyla.empty ())
+        {
+          YYCDEBUG << "Reading a token\n";
+#if YY_EXCEPTIONS
+          try
+#endif // YY_EXCEPTIONS
+            {]b4_token_ctor_if([[
+              symbol_type yylookahead (]b4_yylex[);
+              yyla.move (yylookahead);]], [[
+              yyla.kind_ = yyparser.yytranslate_ (]b4_yylex[);]])[
+            }
+#if YY_EXCEPTIONS
+          catch (const parser_type::syntax_error& yyexc)
+            {
+              YYCDEBUG << "Caught exception: " << yyexc.what () << '\n';]b4_locations_if([
+              this->yyla.location = yyexc.location;])[
+              yyparser.error (]b4_locations_if([this->yyla.location, ])[yyexc.what ());
+              // Map errors caught in the scanner to the error token, so that error
+              // handling is started.
+              this->yyla.kind_ = ]b4_symbol(error, kind)[;
+            }
+        }
+#endif // YY_EXCEPTIONS
+      if (this->yyla.kind () == ]b4_symbol(eof, kind)[)
+        YYCDEBUG << "Now at end of input.\n";
+      else
+        YY_SYMBOL_PRINT ("Next token is", this->yyla.kind (), this->yyla.value, this->yyla.location);
+    }
+
+
+                                /* Bison grammar-table manipulation.  */
+
+    /** The action to take in YYSTATE on seeing YYTOKEN.
+     *  Result R means
+     *    R < 0:  Reduce on rule -R.
+     *    R = 0:  Error.
+     *    R > 0:  Shift to state R.
+     *  Set *YYCONFLICTS to a pointer into yyconfl to a 0-terminated list
+     *  of conflicting reductions.
+     */
+    static int
+    yygetLRActions (state_num yystate, symbol_kind_type yytoken, const short*& yyconflicts)
+    {
+      int yyindex = yypact[yystate] + yytoken;
+      if (yytoken == ]b4_symbol(error, kind)[)
+        {
+          // This is the error token.
+          yyconflicts = yyconfl;
+          return 0;
+        }
+      else if (yy_is_defaulted_state (yystate)
+               || yyindex < 0 || YYLAST < yyindex || yycheck[yyindex] != yytoken)
+        {
+          yyconflicts = yyconfl;
+          return -yydefact[yystate];
+        }
+      else if (! yytable_value_is_error (yytable[yyindex]))
+        {
+          yyconflicts = yyconfl + yyconflp[yyindex];
+          return yytable[yyindex];
+        }
+      else
+        {
+          yyconflicts = yyconfl + yyconflp[yyindex];
+          return 0;
+        }
+    }
+
+    /** Compute post-reduction state.
+     * \param yystate   the current state
+     * \param yysym     the nonterminal to push on the stack
+     */
+    static state_num
+    yyLRgotoState (state_num yystate, symbol_kind_type yysym)
+    {
+      const int yyr = yypgoto[yysym - YYNTOKENS] + yystate;
+      if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate)
+        return yytable[yyr];
+      else
+        return yydefgoto[yysym - YYNTOKENS];
+    }
+
+    static bool
+    yypact_value_is_default (state_num yystate)
+    {
+      return ]b4_table_value_equals([[pact]], [[yystate]], [b4_pact_ninf], [YYPACT_NINF])[;
+    }
+
+    static bool
+    yytable_value_is_error (int yytable_value YY_ATTRIBUTE_UNUSED)
+    {
+      return ]b4_table_value_equals([[table]], [[yytable_value]], [b4_table_ninf], [YYTABLE_NINF])[;
+    }
+
+    static bool
+    yy_is_shift_action (int yyaction) YY_NOEXCEPT
+    {
+      return 0 < yyaction;
+    }
+
+    static bool
+    yy_is_error_action (int yyaction) YY_NOEXCEPT
+    {
+      return yyaction == 0;
+    }
+
+    /** Whether LR state YYSTATE has only a default reduction
+     *  (regardless of token).  */
+    static bool
+    yy_is_defaulted_state (state_num yystate)
+    {
+      return yypact_value_is_default (yypact[yystate]);
+    }
+
+    /** The default reduction for YYSTATE, assuming it has one.  */
+    static rule_num
+    yy_default_action (state_num yystate)
+    {
+      return yydefact[yystate];
+    }
+
+                                    /* GLRStacks */
+
+    /** Y0 and Y1 represent two possible actions to take in a given
+     *  parsing state; return 0 if no combination is possible,
+     *  1 if user-mergeable, 2 if Y0 is preferred, 3 if Y1 is preferred.  */
+    static int
+    yypreference (const semantic_option& y0, const semantic_option& y1)
+    {
+      const rule_num r0 = y0.yyrule, r1 = y1.yyrule;
+      const int p0 = yydprec[r0], p1 = yydprec[r1];
+
+      if (p0 == p1)
+        {
+          if (yymerger[r0] == 0 || yymerger[r0] != yymerger[r1])
+            return 0;
+          else
+            return 1;
+        }
+      else if (p0 == 0 || p1 == 0)
+        return 0;
+      else if (p0 < p1)
+        return 3;
+      else if (p1 < p0)
+        return 2;
+      else
+        return 0;
+    }
+
+]b4_parse_param_vars[
+  }; // class ]b4_parser_class[::glr_stack
+} // namespace ]b4_namespace_ref[
+
+
+#if ]b4_api_PREFIX[DEBUG
+namespace
+{
+  void
+  yypstack (const glr_stack& yystack, size_t yyk)
+  {
+    yystack.yypstack (create_state_set_index (static_cast<std::ptrdiff_t> (yyk)));
+  }
+
+  void
+  yypdumpstack (const glr_stack& yystack)
+  {
+    yystack.yypdumpstack ();
+  }
+}
+#endif
+
+]b4_namespace_open[
+  /// Build a parser object.
+  ]b4_parser_class::b4_parser_class[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
+    :])[
+#if ]b4_api_PREFIX[DEBUG
+    ]m4_ifset([b4_parse_param], [  ], [ :])[yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
+#endif]b4_parse_param_cons[
+  {}
+
+  ]b4_parser_class::~b4_parser_class[ ()
+  {}
+
+  ]b4_parser_class[::syntax_error::~syntax_error () YY_NOEXCEPT YY_NOTHROW
+  {}
+
+  int
+  ]b4_parser_class[::operator() ()
+  {
+    return parse ();
+  }
+
+  int
+  ]b4_parser_class[::parse ()
+  {
+    glr_stack yystack(YYINITDEPTH, *this]b4_user_args[);
+    return yystack.parse ();
+  }
+
+]b4_parse_error_bmatch([custom\|detailed],
+[[  const char *
+  ]b4_parser_class[::symbol_name (symbol_kind_type yysymbol)
+  {
+    static const char *const yy_sname[] =
+    {
+    ]b4_symbol_names[
+    };]b4_has_translations_if([[
+    /* YYTRANSLATABLE[SYMBOL-NUM] -- Whether YY_SNAME[SYMBOL-NUM] is
+       internationalizable.  */
+    static ]b4_int_type_for([b4_translatable])[ yytranslatable[] =
+    {
+    ]b4_translatable[
+    };
+    return (yysymbol < YYNTOKENS && yytranslatable[yysymbol]
+            ? _(yy_sname[yysymbol])
+            : yy_sname[yysymbol]);]], [[
+    return yy_sname[yysymbol];]])[
+  }
+]],
+[simple],
+[[#if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
+  const char *
+  ]b4_parser_class[::symbol_name (symbol_kind_type yysymbol)
+  {
+    return yytname_[yysymbol];
+  }
+#endif // #if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
+]],
+[verbose],
+[[  /* Return YYSTR after stripping away unnecessary quotes and
+     backslashes, so that it's suitable for yyerror.  The heuristic is
+     that double-quoting is unnecessary unless the string contains an
+     apostrophe, a comma, or backslash (other than backslash-backslash).
+     YYSTR is taken from yytname.  */
+  std::string
+  ]b4_parser_class[::yytnamerr_ (const char *yystr)
+  {
+    if (*yystr == '"')
+      {
+        std::string yyr;
+        char const *yyp = yystr;
+
+        for (;;)
+          switch (*++yyp)
+            {
+            case '\'':
+            case ',':
+              goto do_not_strip_quotes;
+
+            case '\\':
+              if (*++yyp != '\\')
+                goto do_not_strip_quotes;
+              else
+                goto append;
+
+            append:
+            default:
+              yyr += *yyp;
+              break;
+
+            case '"':
+              return yyr;
+            }
+      do_not_strip_quotes: ;
+      }
+
+    return yystr;
+  }
+
+  std::string
+  ]b4_parser_class[::symbol_name (symbol_kind_type yysymbol)
+  {
+    return yytnamerr_ (yytname_[yysymbol]);
+  }
+]])[
+
+]b4_parse_error_bmatch([simple\|verbose],
+[[#if ]b4_api_PREFIX[DEBUG]b4_tname_if([[ || 1]])[
+  // YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+  // First, the terminals, then, starting at \a YYNTOKENS, nonterminals.
+  const char*
+  const ]b4_parser_class[::yytname_[] =
+  {
+  ]b4_tname[
+  };
+#endif
+]])[
+
+]b4_parse_error_bmatch([custom\|detailed\|verbose], [[
+  // ]b4_parser_class[::context.
+  ]b4_parser_class[::context::context (glr_stack& yystack, const symbol_type& yyla)
+    : yystack_ (yystack)
+    , yyla_ (yyla)
+  {}
+
+  int
+  ]b4_parser_class[::context::expected_tokens (symbol_kind_type yyarg[], int yyargn) const
+  {
+    // Actual number of expected tokens
+    int yycount = 0;
+    const int yyn = yypact[yystack_.firstTopState()->yylrState];
+    if (!yystack_.yypact_value_is_default (yyn))
+      {
+        /* Start YYX at -YYN if negative to avoid negative indexes in
+           YYCHECK.  In other words, skip the first -YYN actions for this
+           state because they are default actions.  */
+        const int yyxbegin = yyn < 0 ? -yyn : 0;
+        /* Stay within bounds of both yycheck and yytname.  */
+        const int yychecklim = YYLAST - yyn + 1;
+        const int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+        for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
+          if (yycheck[yyx + yyn] == yyx && yyx != ]b4_symbol(error, kind)[
+              && !yystack_.yytable_value_is_error (yytable[yyx + yyn]))
+            {
+              if (!yyarg)
+                ++yycount;
+              else if (yycount == yyargn)
+                return 0;
+              else
+                yyarg[yycount++] = YY_CAST (symbol_kind_type, yyx);
+            }
+      }
+    if (yyarg && yycount == 0 && 0 < yyargn)
+      yyarg[0] = ]b4_symbol(empty, kind)[;
+    return yycount;
+  }
+
+]])[
+
+]b4_parse_error_bmatch([detailed\|verbose], [[
+  int
+  ]b4_parser_class[::yy_syntax_error_arguments_ (const context& yyctx,
+                                                 symbol_kind_type yyarg[], int yyargn) const
+  {
+    /* There are many possibilities here to consider:
+       - If this state is a consistent state with a default action, then
+         the only way this function was invoked is if the default action
+         is an error action.  In that case, don't check for expected
+         tokens because there are none.
+       - The only way there can be no lookahead present (in yyla) is
+         if this state is a consistent state with a default action.
+         Thus, detecting the absence of a lookahead is sufficient to
+         determine that there is no unexpected or expected token to
+         report.  In that case, just report a simple "syntax error".
+       - Don't assume there isn't a lookahead just because this state is
+         a consistent state with a default action.  There might have
+         been a previous inconsistent state, consistent state with a
+         non-default action, or user semantic action that manipulated
+         yyla.  (However, yyla is currently not documented for users.)
+    */
+
+    if (!yyctx.lookahead ().empty ())
+      {
+        if (yyarg)
+          yyarg[0] = yyctx.token ();
+        int yyn = yyctx.expected_tokens (yyarg ? yyarg + 1 : yyarg, yyargn - 1);
+        return yyn + 1;
+      }
+    return 0;
+  }
+
+  // Generate an error message.
+  std::string
+  ]b4_parser_class[::yysyntax_error_ (const context& yyctx) const
+  {
+    // Its maximum.
+    enum { YYARGS_MAX = 5 };
+    // Arguments of yyformat.
+    symbol_kind_type yyarg[YYARGS_MAX];
+    int yycount = yy_syntax_error_arguments_ (yyctx, yyarg, YYARGS_MAX);
+
+    char const* yyformat = YY_NULLPTR;
+    switch (yycount)
+      {
+#define YYCASE_(N, S)                         \
+        case N:                               \
+          yyformat = S;                       \
+        break
+      default: // Avoid compiler warnings.
+        YYCASE_ (0, YY_("syntax error"));
+        YYCASE_ (1, YY_("syntax error, unexpected %s"));
+        YYCASE_ (2, YY_("syntax error, unexpected %s, expecting %s"));
+        YYCASE_ (3, YY_("syntax error, unexpected %s, expecting %s or %s"));
+        YYCASE_ (4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
+        YYCASE_ (5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
+#undef YYCASE_
+      }
+
+    std::string yyres;
+    // Argument number.
+    std::ptrdiff_t yyi = 0;
+    for (char const* yyp = yyformat; *yyp; ++yyp)
+      if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)
+        {
+          yyres += symbol_name (yyarg[yyi++]);
+          ++yyp;
+        }
+      else
+        yyres += *yyp;
+    return yyres;
+  }]])[
+
+  void
+  ]b4_parser_class[::yy_destroy_ (const char* yymsg, symbol_kind_type yykind,
+                           value_type& yyval]b4_locations_if([[,
+                           location_type& yyloc]])[)
+  {
+    YY_USE (yyval);]b4_locations_if([[
+    YY_USE (yyloc);]])[
+    if (!yymsg)
+      yymsg = "Deleting";
+    ]b4_parser_class[& yyparser = *this;
+    YY_USE (yyparser);
+    YY_SYMBOL_PRINT (yymsg, yykind, yyval, yyloc);
+
+    YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+    ]m4_do([m4_pushdef([b4_symbol_action], m4_defn([b4_symbol_action_for_yyval]))],
+           [b4_symbol_actions([destructor])],
+           [m4_popdef([b4_symbol_action])])[
+    YY_IGNORE_MAYBE_UNINITIALIZED_END
+  }
+
+#if ]b4_api_PREFIX[DEBUG
+  /*--------------------.
+  | Print this symbol.  |
+  `--------------------*/
+
+  void
+  ]b4_parser_class[::yy_symbol_value_print_ (symbol_kind_type yykind,
+                           const value_type& yyval]b4_locations_if([[,
+                           const location_type& yyloc]])[) const
+  {]b4_locations_if([[
+    YY_USE (yyloc);]])[
+    YY_USE (yyval);
+    std::ostream& yyo = debug_stream ();
+    YY_USE (yyo);
+    ]m4_do([m4_pushdef([b4_symbol_action], m4_defn([b4_symbol_action_for_yyval]))],
+           [b4_symbol_actions([printer])],
+           [m4_popdef([b4_symbol_action])])[
+  }
+
+  void
+  ]b4_parser_class[::yy_symbol_print_ (symbol_kind_type yykind,
+                           const value_type& yyval]b4_locations_if([[,
+                           const location_type& yyloc]])[) const
+  {
+    *yycdebug_ << (yykind < YYNTOKENS ? "token" : "nterm")
+               << ' ' << symbol_name (yykind) << " ("]b4_locations_if([[
+               << yyloc << ": "]])[;
+    yy_symbol_value_print_ (yykind, yyval]b4_locations_if([[, yyloc]])[);
+    *yycdebug_ << ')';
+  }
+
+  std::ostream&
+  ]b4_parser_class[::debug_stream () const
+  {
+    return *yycdebug_;
+  }
+
+  void
+  ]b4_parser_class[::set_debug_stream (std::ostream& o)
+  {
+    yycdebug_ = &o;
+  }
+
+
+  ]b4_parser_class[::debug_level_type
+  ]b4_parser_class[::debug_level () const
+  {
+    return yydebug;
+  }
+
+  void
+  ]b4_parser_class[::set_debug_level (debug_level_type l)
+  {
+    // Actually, it is yydebug which is really used.
+    yydebug = l;
+  }
+#endif // ]b4_api_PREFIX[DEBUG
+
+]b4_token_ctor_if([], [b4_yytranslate_define([cc])])[
+
+]b4_token_ctor_if([], [[
+  /*---------.
+  | symbol.  |
+  `---------*/
+]b4_public_types_define([cc])])[
+]b4_namespace_close[]dnl
+b4_epilogue[]dnl
+b4_output_end
diff --git a/data/skeletons/java-skel.m4 b/data/skeletons/java-skel.m4
index 922f1a8..11cbc49 100644
--- a/data/skeletons/java-skel.m4
+++ b/data/skeletons/java-skel.m4
@@ -2,7 +2,7 @@
 
 # Java skeleton dispatching for Bison.
 
-# Copyright (C) 2007, 2009-2015, 2018-2019 Free Software Foundation,
+# Copyright (C) 2007, 2009-2015, 2018-2021 Free Software Foundation,
 # Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -16,7 +16,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 b4_glr_if(             [b4_complain([%%glr-parser not supported for Java])])
 b4_nondeterministic_if([b4_complain([%%nondeterministic-parser not supported for Java])])
diff --git a/data/skeletons/java.m4 b/data/skeletons/java.m4
index edf23a9..8b0828b 100644
--- a/data/skeletons/java.m4
+++ b/data/skeletons/java.m4
@@ -2,7 +2,7 @@
 
 # Java language support for Bison
 
-# Copyright (C) 2007-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2007-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -15,7 +15,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 m4_include(b4_skeletonsdir/[c-like.m4])
 
@@ -71,12 +71,12 @@
 # b4_identification
 # -----------------
 m4_define([b4_identification],
-[  /** Version number for the Bison executable that generated this parser.  */
-  public static final String bisonVersion = "b4_version";
+[[  /** Version number for the Bison executable that generated this parser.  */
+  public static final String bisonVersion = "]b4_version_string[";
 
   /** Name of the skeleton that generated this parser.  */
-  public static final String bisonSkeleton = b4_skeleton;
-])
+  public static final String bisonSkeleton = ]b4_skeleton[;
+]])
 
 
 ## ------------ ##
@@ -106,10 +106,13 @@
 
 # b4_typed_parser_table_define(TYPE, NAME, DATA, COMMENT)
 # -------------------------------------------------------
+# We use intermediate functions (e.g., yypact_init) to work around the
+# 64KB limit for JVM methods.  See
+# https://lists.gnu.org/r/help-bison/2008-11/msg00004.html.
 m4_define([b4_typed_parser_table_define],
 [m4_ifval([$4], [b4_comment([$4])
   ])dnl
-[private static final ]$1[ yy$2_[] = yy$2_init();
+[private static final ]$1[[] yy$2_ = yy$2_init();
   private static final ]$1[[] yy$2_init()
   {
     return new ]$1[[]
@@ -125,40 +128,158 @@
 [b4_typed_parser_table_define([b4_int_type_for([$2])], [$1], [$2], [$3])])
 
 
-## ------------------------- ##
-## Assigning token numbers.  ##
-## ------------------------- ##
+## ------------- ##
+## Token kinds.  ##
+## ------------- ##
+
 
 # b4_token_enum(TOKEN-NUM)
 # ------------------------
 # Output the definition of this token as an enum.
 m4_define([b4_token_enum],
-[b4_token_format([    /** Token number, to be returned by the scanner.  */
-    static final int %s = %s;
-], [$1])])
+[b4_token_visible_if([$1],
+    [m4_format([[    /** Token %s, to be returned by the scanner.  */
+    static final int %s = %s%s;
+]],
+               b4_symbol([$1], [tag]),
+               b4_symbol([$1], [id]),
+               b4_symbol([$1], b4_api_token_raw_if([[number]], [[code]])))])])
+
 
 # b4_token_enums
 # --------------
 # Output the definition of the tokens (if there are) as enums.
 m4_define([b4_token_enums],
-[b4_any_token_visible_if([/* Tokens.  */
+[b4_any_token_visible_if([    /* Token kinds.  */
 b4_symbol_foreach([b4_token_enum])])])
 
-# b4-case(ID, CODE)
-# -----------------
+
+
+## -------------- ##
+## Symbol kinds.  ##
+## -------------- ##
+
+
+# b4_symbol_kind(NUM)
+# -------------------
+m4_define([b4_symbol_kind],
+[SymbolKind.b4_symbol_kind_base($@)])
+
+
+# b4_symbol_enum(SYMBOL-NUM)
+# --------------------------
+# Output the definition of this symbol as an enum.
+m4_define([b4_symbol_enum],
+[m4_format([    %-30s %s],
+           m4_format([[%s(%s)%s]],
+                     b4_symbol([$1], [kind_base]),
+                     [$1],
+                     m4_if([$1], b4_last_symbol, [[;]], [[,]])),
+           [b4_symbol_tag_comment([$1])])])
+
+
+# b4_declare_symbol_enum
+# ----------------------
+# The definition of the symbol internal numbers as an enum.
+m4_define([b4_declare_symbol_enum],
+[[  public enum SymbolKind
+  {
+]b4_symbol_foreach([b4_symbol_enum])[
+
+    private final int yycode_;
+
+    SymbolKind (int n) {
+      this.yycode_ = n;
+    }
+
+    private static final SymbolKind[] values_ = {
+      ]m4_map_args_sep([b4_symbol_kind(], [)], [,
+      ], b4_symbol_numbers)[
+    };
+
+    static final SymbolKind get(int code) {
+      return values_[code];
+    }
+
+    public final int getCode() {
+      return this.yycode_;
+    }
+
+]b4_parse_error_bmatch(
+[simple\|verbose],
+[[    /* Return YYSTR after stripping away unnecessary quotes and
+       backslashes, so that it's suitable for yyerror.  The heuristic is
+       that double-quoting is unnecessary unless the string contains an
+       apostrophe, a comma, or backslash (other than backslash-backslash).
+       YYSTR is taken from yytname.  */
+    private static String yytnamerr_(String yystr)
+    {
+      if (yystr.charAt (0) == '"')
+        {
+          StringBuffer yyr = new StringBuffer();
+          strip_quotes: for (int i = 1; i < yystr.length(); i++)
+            switch (yystr.charAt(i))
+              {
+              case '\'':
+              case ',':
+                break strip_quotes;
+
+              case '\\':
+                if (yystr.charAt(++i) != '\\')
+                  break strip_quotes;
+                /* Fall through.  */
+              default:
+                yyr.append(yystr.charAt(i));
+                break;
+
+              case '"':
+                return yyr.toString();
+              }
+        }
+      return yystr;
+    }
+
+    /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+       First, the terminals, then, starting at \a YYNTOKENS_, nonterminals.  */
+    ]b4_typed_parser_table_define([String], [tname], [b4_tname])[
+
+    /* The user-facing name of this symbol.  */
+    public final String getName() {
+      return yytnamerr_(yytname_[yycode_]);
+    }
+]],
+[custom\|detailed],
+[[    /* YYNAMES_[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+       First, the terminals, then, starting at \a YYNTOKENS_, nonterminals.  */
+    ]b4_typed_parser_table_define([String], [names], [b4_symbol_names])[
+
+    /* The user-facing name of this symbol.  */
+    public final String getName() {
+      return yynames_[yycode_];
+    }]])[
+  };
+]])])
+
+
+
+# b4_case(ID, CODE, [COMMENTS])
+# -----------------------------
 # We need to fool Java's stupid unreachable code detection.
-m4_define([b4_case], [  case $1:
+m4_define([b4_case],
+[  case $1:m4_ifval([$3], [ b4_comment([$3])])
   if (yyn == $1)
     $2;
   break;
-    ])
+])
+
 
 # b4_predicate_case(LABEL, CONDITIONS)
 # ------------------------------------
-m4_define([b4_predicate_case], [  case $1:
+m4_define([b4_predicate_case],
+[  case $1:
      if (! ($2)) YYERROR;
     break;
-    ])
+])
 
 
 ## -------- ##
@@ -183,6 +304,7 @@
 
 m4_define([b4_yystype], [b4_percent_define_get([[api.value.type]])])
 b4_percent_define_default([[api.value.type]], [[Object]])
+b4_percent_define_default([[api.symbol.prefix]], [[S_]])
 
 # b4_api_prefix, b4_api_PREFIX
 # ----------------------------
@@ -222,6 +344,22 @@
 ## ----------------- ##
 
 
+# b4_symbol_translate(STRING)
+# ---------------------------
+# Used by "bison" in the array of symbol names to mark those that
+# require translation.
+m4_define([b4_symbol_translate],
+[[i18n($1)]])
+
+
+# b4_trans(STRING)
+# ----------------
+# Translate a string if i18n is enabled.  Avoid collision with b4_translate.
+m4_define([b4_trans],
+[b4_has_translations_if([i18n($1)], [$1])])
+
+
+
 # b4_symbol_value(VAL, [SYMBOL-NUM], [TYPE-TAG])
 # ----------------------------------------------
 # See README.
@@ -361,4 +499,4 @@
 # -----------------------
 # Expand to either an empty string or "throws THROWS".
 m4_define([b4_maybe_throws],
-          [m4_ifval($1, [throws $1])])
+          [m4_ifval($1, [ throws $1])])
diff --git a/data/skeletons/lalr1.cc b/data/skeletons/lalr1.cc
index d245796..7cb69d3 100644
--- a/data/skeletons/lalr1.cc
+++ b/data/skeletons/lalr1.cc
@@ -1,6 +1,6 @@
 # C++ skeleton for Bison
 
-# Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,22 +13,31 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 m4_include(b4_skeletonsdir/[c++.m4])
 
 # api.value.type=variant is valid.
 m4_define([b4_value_type_setup_variant])
 
-# Check the value of %define parse.lac, where LAC stands for lookahead
-# correction.
+# parse.lac
 b4_percent_define_default([[parse.lac]], [[none]])
+b4_percent_define_check_values([[[[parse.lac]], [[full]], [[none]]]])
 b4_define_flag_if([lac])
 m4_define([b4_lac_flag],
           [m4_if(b4_percent_define_get([[parse.lac]]),
                  [none], [[0]], [[1]])])
 
 
+# b4_tname_if(TNAME-NEEDED, TNAME-NOT-NEEDED)
+# -------------------------------------------
+m4_define([b4_tname_if],
+[m4_case(b4_percent_define_get([[parse.error]]),
+         [verbose],         [$1],
+         [b4_token_table_if([$1],
+                            [$2])])])
+
+
 # b4_integral_parser_table_declare(TABLE-NAME, CONTENT, COMMENT)
 # --------------------------------------------------------------
 # Declare "parser::yy<TABLE-NAME>_" whose contents is CONTENT.
@@ -49,6 +58,13 @@
   };dnl
 ])
 
+
+# b4_symbol_kind(NUM)
+# -------------------
+m4_define([b4_symbol_kind],
+[symbol_kind::b4_symbol_kind_base($@)])
+
+
 # b4_symbol_value_template(VAL, SYMBOL-NUM, [TYPE])
 # -------------------------------------------------
 # Same as b4_symbol_value, but used in a template method.  It makes
@@ -129,21 +145,21 @@
 ])])
 
 
-# b4_lex
-# ------
+# b4_yylex
+# --------
 # Call yylex.
-m4_define([b4_lex],
+m4_define([b4_yylex],
 [b4_token_ctor_if(
 [b4_function_call([yylex],
                   [symbol_type], m4_ifdef([b4_lex_param], b4_lex_param))],
 [b4_function_call([yylex], [int],
-                  [b4_api_PREFIX[STYPE*], [&yyla.value]][]dnl
-b4_locations_if([, [[location*], [&yyla.location]]])dnl
+                  [[value_type *], [&yyla.value]][]dnl
+b4_locations_if([, [[location_type *], [&yyla.location]]])dnl
 m4_ifdef([b4_lex_param], [, ]b4_lex_param))])])
 
 
 m4_pushdef([b4_copyright_years],
-           [2002-2015, 2018-2019])
+           [2002-2015, 2018-2021])
 
 m4_define([b4_parser_class],
           [b4_percent_define_get([[api.parser.class]])])
@@ -157,7 +173,7 @@
 
 # b4_shared_declarations(hh|cc)
 # -----------------------------
-# Declaration that might either go into the header (if --defines, $1 = hh)
+# Declaration that might either go into the header (if --header, $1 = hh)
 # or in the implementation file.
 m4_define([b4_shared_declarations],
 [b4_percent_code_get([[requires]])[
@@ -194,6 +210,13 @@
     ]b4_parser_class[ (]b4_parse_param_decl[);
     virtual ~]b4_parser_class[ ();
 
+#if 201103L <= YY_CPLUSPLUS
+    /// Non copyable.
+    ]b4_parser_class[ (const ]b4_parser_class[&) = delete;
+    /// Non copyable.
+    ]b4_parser_class[& operator= (const ]b4_parser_class[&) = delete;
+#endif
+
     /// Parse.  An alias for parse ().
     /// \returns  0 iff parsing succeeded.
     int operator() ();
@@ -224,19 +247,57 @@
     /// Report a syntax error.
     void error (const syntax_error& err);
 
+]b4_parse_error_bmatch(
+[custom\|detailed],
+[[    /// The user-facing name of the symbol whose (internal) number is
+    /// YYSYMBOL.  No bounds checking.
+    static const char *symbol_name (symbol_kind_type yysymbol);]],
+[simple],
+[[#if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
+    /// The user-facing name of the symbol whose (internal) number is
+    /// YYSYMBOL.  No bounds checking.
+    static const char *symbol_name (symbol_kind_type yysymbol);
+#endif // #if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
+]],
+[verbose],
+[[    /// The user-facing name of the symbol whose (internal) number is
+    /// YYSYMBOL.  No bounds checking.
+    static std::string symbol_name (symbol_kind_type yysymbol);]])[
+
 ]b4_token_constructor_define[
+]b4_parse_error_bmatch([custom\|detailed\|verbose], [[
+    class context
+    {
+    public:
+      context (const ]b4_parser_class[& yyparser, const symbol_type& yyla);
+      const symbol_type& lookahead () const YY_NOEXCEPT { return yyla_; }
+      symbol_kind_type token () const YY_NOEXCEPT { return yyla_.kind (); }]b4_locations_if([[
+      const location_type& location () const YY_NOEXCEPT { return yyla_.location; }
+]])[
+      /// Put in YYARG at most YYARGN of the expected tokens, and return the
+      /// number of tokens stored in YYARG.  If YYARG is null, return the
+      /// number of expected tokens (guaranteed to be less than YYNTOKENS).
+      int expected_tokens (symbol_kind_type yyarg[], int yyargn) const;
 
+    private:
+      const ]b4_parser_class[& yyparser_;
+      const symbol_type& yyla_;
+    };
+]])[
   private:
-    /// This class is not copyable.
+#if YY_CPLUSPLUS < 201103L
+    /// Non copyable.
     ]b4_parser_class[ (const ]b4_parser_class[&);
-    ]b4_parser_class[& operator= (const ]b4_parser_class[&);]b4_lac_if([[
-
+    /// Non copyable.
+    ]b4_parser_class[& operator= (const ]b4_parser_class[&);
+#endif
+]b4_lac_if([[
     /// Check the lookahead yytoken.
     /// \returns  true iff the token will be eventually shifted.
-    bool yy_lac_check_ (int yytoken) const;
+    bool yy_lac_check_ (symbol_kind_type yytoken) const;
     /// Establish the initial context if no initial context currently exists.
     /// \returns  true iff the token will be eventually shifted.
-    bool yy_lac_establish_ (int yytoken);
+    bool yy_lac_establish_ (symbol_kind_type yytoken);
     /// Discard any previous initial lookahead context because of event.
     /// \param event  the event which caused the lookahead to be discarded.
     ///               Only used for debbuging output.
@@ -244,13 +305,19 @@
 
     /// Stored state numbers (used for stacks).
     typedef ]b4_int_type(0, m4_eval(b4_states_number - 1))[ state_type;
+]b4_parse_error_bmatch(
+[custom], [[
+    /// Report a syntax error
+    /// \param yyctx     the context in which the error occurred.
+    void report_syntax_error (const context& yyctx) const;]],
+[detailed\|verbose], [[
+    /// The arguments of the error message.
+    int yy_syntax_error_arguments_ (const context& yyctx,
+                                    symbol_kind_type yyarg[], int yyargn) const;
 
     /// Generate an error message.
-    /// \param yystate   the state where the error occurred.
-    /// \param yyla      the lookahead token.
-    virtual std::string yysyntax_error_ (state_type yystate,
-                                         const symbol_type& yyla) const;
-
+    /// \param yyctx     the context in which the error occurred.
+    virtual std::string yysyntax_error_ (const context& yyctx) const;]])[
     /// Compute post-reduction state.
     /// \param yystate   the current state
     /// \param yysym     the nonterminal to push on the stack
@@ -258,43 +325,52 @@
 
     /// Whether the given \c yypact_ value indicates a defaulted state.
     /// \param yyvalue   the value to check
-    static bool yy_pact_value_is_default_ (int yyvalue);
+    static bool yy_pact_value_is_default_ (int yyvalue) YY_NOEXCEPT;
 
     /// Whether the given \c yytable_ value indicates a syntax error.
     /// \param yyvalue   the value to check
-    static bool yy_table_value_is_error_ (int yyvalue);
+    static bool yy_table_value_is_error_ (int yyvalue) YY_NOEXCEPT;
 
     static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
     static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;
 
-    /// Convert a scanner token number \a t to a symbol number.
-    /// In theory \a t should be a token_type, but character literals
-    /// are valid, yet not members of the token_type enum.
-    static token_number_type yytranslate_ (int t);
+    /// Convert a scanner token kind \a t to a symbol kind.
+    /// In theory \a t should be a token_kind_type, but character literals
+    /// are valid, yet not members of the token_kind_type enum.
+    static symbol_kind_type yytranslate_ (int t) YY_NOEXCEPT;
 
-    // Tables.
-]b4_parser_tables_declare[]b4_error_verbose_if([
-
-    /// Convert the symbol name \a n to a form suitable for a diagnostic.
-    static std::string yytnamerr_ (const char *n);])[
-
-]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[
+]b4_parse_error_bmatch(
+[simple],
+[[#if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
     /// For a symbol, its name in clear.
     static const char* const yytname_[];
-]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[
+#endif // #if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
+]],
+[verbose],
+[[    /// Convert the symbol name \a n to a form suitable for a diagnostic.
+    static std::string yytnamerr_ (const char *yystr);
+
+    /// For a symbol, its name in clear.
+    static const char* const yytname_[];
+]])[
+
+    // Tables.
+]b4_parser_tables_declare[
+
+#if ]b4_api_PREFIX[DEBUG
 ]b4_integral_parser_table_declare([rline], [b4_rline],
      [[YYRLINE[YYN] -- Source line where rule number YYN was defined.]])[
     /// Report on the debug stream that the rule \a r is going to be reduced.
-    virtual void yy_reduce_print_ (int r);
+    virtual void yy_reduce_print_ (int r) const;
     /// Print the state stack on the debug stream.
-    virtual void yystack_print_ ();
+    virtual void yy_stack_print_ () const;
 
     /// Debugging level.
     int yydebug_;
     /// Debug stream.
     std::ostream* yycdebug_;
 
-    /// \brief Display a symbol type, value and location.
+    /// \brief Display a symbol kind, value and location.
     /// \param yyo    The output stream.
     /// \param yysym  The symbol.
     template <typename Base>
@@ -315,7 +391,7 @@
       /// Default constructor.
       by_state () YY_NOEXCEPT;
 
-      /// The symbol type as needed by the constructor.
+      /// The symbol kind as needed by the constructor.
       typedef state_type kind_type;
 
       /// Constructor.
@@ -327,12 +403,12 @@
       /// Record that this symbol is empty.
       void clear () YY_NOEXCEPT;
 
-      /// Steal the symbol type from \a that.
+      /// Steal the symbol kind from \a that.
       void move (by_state& that);
 
-      /// The (internal) type number (corresponding to \a state).
-      /// \a empty_symbol when empty.
-      symbol_number_type type_get () const YY_NOEXCEPT;
+      /// The symbol kind (corresponding to \a state).
+      /// \a ]b4_symbol(empty, kind)[ when empty.
+      symbol_kind_type kind () const YY_NOEXCEPT;
 
       /// The state number used to denote an empty symbol.
       /// We use the initial state, as it does not have a value.
@@ -398,64 +474,60 @@
     void yypush_ (const char* m, state_type s, YY_MOVE_REF (symbol_type) sym);
 
     /// Pop \a n symbols from the stack.
-    void yypop_ (int n = 1);
-
-    /// Some specific tokens.
-    static const token_number_type yy_error_token_ = 1;
-    static const token_number_type yy_undef_token_ = ]b4_undef_token_number[;
+    void yypop_ (int n = 1) YY_NOEXCEPT;
 
     /// Constants.
     enum
     {
-      yyeof_ = 0,
       yylast_ = ]b4_last[,     ///< Last index in yytable_.
       yynnts_ = ]b4_nterms_number[,  ///< Number of nonterminal symbols.
-      yyfinal_ = ]b4_final_state_number[, ///< Termination state number.
-      yyntokens_ = ]b4_tokens_number[  ///< Number of tokens.
+      yyfinal_ = ]b4_final_state_number[ ///< Termination state number.
     };
 
 ]b4_parse_param_vars[
+]b4_percent_code_get([[yy_bison_internal_hook]])[
   };
 
 ]b4_token_ctor_if([b4_yytranslate_define([$1])[
 ]b4_public_types_define([$1])])[
 ]b4_namespace_close[
 
-]b4_percent_define_flag_if([[global_tokens_and_yystype]],
-[b4_token_defines
-
-#ifndef ]b4_api_PREFIX[STYPE
- // Redirection for backward compatibility.
-# define ]b4_api_PREFIX[STYPE b4_namespace_ref::b4_parser_class::semantic_type
-#endif
-])[
 ]b4_percent_code_get([[provides]])[
-]])
+]])[
+
 
 ## -------------- ##
 ## Output files.  ##
 ## -------------- ##
 
-b4_defines_if(
-[b4_output_begin([b4_spec_header_file])
-b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++])
-[
+# ------------- #
+# Header file.  #
+# ------------- #
+
+]b4_header_if([[
+]b4_output_begin([b4_spec_header_file])[
+]b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++])[
+
 /**
- ** \file ]b4_spec_header_file[
+ ** \file ]b4_spec_mapped_header_file[
  ** Define the ]b4_namespace_ref[::parser class.
  */
 
 // C++ LALR(1) parser skeleton written by Akim Demaille.
 
 ]b4_disclaimer[
-]b4_cpp_guard_open([b4_spec_header_file])[
+]b4_cpp_guard_open([b4_spec_mapped_header_file])[
 ]b4_shared_declarations(hh)[
-]b4_cpp_guard_close([b4_spec_header_file])[
+]b4_cpp_guard_close([b4_spec_mapped_header_file])[
 ]b4_output_end[
-]])
+]])[
 
 
-b4_output_begin([b4_parser_file_name])[
+# --------------------- #
+# Implementation file.  #
+# --------------------- #
+
+]b4_output_begin([b4_parser_file_name])[
 ]b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++])[
 ]b4_disclaimer[
 ]b4_percent_code_get([[top]])[]dnl
@@ -466,7 +538,7 @@
 
 ]b4_user_pre_prologue[
 
-]b4_defines_if([[#include "@basename(]b4_spec_header_file[@)"]],
+]b4_header_if([[#include "@basename(]b4_spec_header_file[@)"]],
                [b4_shared_declarations([cc])])[
 
 ]b4_user_post_prologue[
@@ -483,6 +555,11 @@
 #  define YY_(msgid) msgid
 # endif
 #endif
+]b4_has_translations_if([
+#ifndef N_
+# define N_(Msgid) Msgid
+#endif
+])[
 
 // Whether we are compiled with exception support.
 #ifndef YY_EXCEPTIONS
@@ -522,13 +599,13 @@
 # define YY_STACK_PRINT()               \
   do {                                  \
     if (yydebug_)                       \
-      yystack_print_ ();                \
+      yy_stack_print_ ();                \
   } while (false)
 
 #else // !]b4_api_PREFIX[DEBUG
 
 # define YYCDEBUG if (false) std::cerr
-# define YY_SYMBOL_PRINT(Title, Symbol)  YYUSE (Symbol)
+# define YY_SYMBOL_PRINT(Title, Symbol)  YY_USE (Symbol)
 # define YY_REDUCE_PRINT(Rule)           static_cast<void> (0)
 # define YY_STACK_PRINT()                static_cast<void> (0)
 
@@ -542,9 +619,623 @@
 #define YYERROR         goto yyerrorlab
 #define YYRECOVERING()  (!!yyerrstatus_)
 
-]b4_namespace_open[]b4_error_verbose_if([[
+]b4_namespace_open[
+  /// Build a parser object.
+  ]b4_parser_class::b4_parser_class[ (]b4_parse_param_decl[)
+#if ]b4_api_PREFIX[DEBUG
+    : yydebug_ (false),
+      yycdebug_ (&std::cerr)]b4_lac_if([,], [m4_ifset([b4_parse_param], [,])])[
+#else
+]b4_lac_if([    :], [m4_ifset([b4_parse_param], [    :])])[
+#endif]b4_lac_if([[
+      yy_lac_established_ (false)]m4_ifset([b4_parse_param], [,])])[]b4_parse_param_cons[
+  {}
 
-  /* Return YYSTR after stripping away unnecessary quotes and
+  ]b4_parser_class::~b4_parser_class[ ()
+  {}
+
+  ]b4_parser_class[::syntax_error::~syntax_error () YY_NOEXCEPT YY_NOTHROW
+  {}
+
+  /*---------.
+  | symbol.  |
+  `---------*/
+
+]b4_token_ctor_if([], [b4_public_types_define([cc])])[
+
+  // by_state.
+  ]b4_parser_class[::by_state::by_state () YY_NOEXCEPT
+    : state (empty_state)
+  {}
+
+  ]b4_parser_class[::by_state::by_state (const by_state& that) YY_NOEXCEPT
+    : state (that.state)
+  {}
+
+  void
+  ]b4_parser_class[::by_state::clear () YY_NOEXCEPT
+  {
+    state = empty_state;
+  }
+
+  void
+  ]b4_parser_class[::by_state::move (by_state& that)
+  {
+    state = that.state;
+    that.clear ();
+  }
+
+  ]b4_parser_class[::by_state::by_state (state_type s) YY_NOEXCEPT
+    : state (s)
+  {}
+
+  ]b4_parser_class[::symbol_kind_type
+  ]b4_parser_class[::by_state::kind () const YY_NOEXCEPT
+  {
+    if (state == empty_state)
+      return ]b4_symbol(empty, kind)[;
+    else
+      return YY_CAST (symbol_kind_type, yystos_[+state]);
+  }
+
+  ]b4_parser_class[::stack_symbol_type::stack_symbol_type ()
+  {}
+
+  ]b4_parser_class[::stack_symbol_type::stack_symbol_type (YY_RVREF (stack_symbol_type) that)
+    : super_type (YY_MOVE (that.state)]b4_variant_if([], [, YY_MOVE (that.value)])b4_locations_if([, YY_MOVE (that.location)])[)
+  {]b4_variant_if([
+    b4_symbol_variant([that.kind ()],
+                      [value], [YY_MOVE_OR_COPY], [YY_MOVE (that.value)])])[
+#if 201103L <= YY_CPLUSPLUS
+    // that is emptied.
+    that.state = empty_state;
+#endif
+  }
+
+  ]b4_parser_class[::stack_symbol_type::stack_symbol_type (state_type s, YY_MOVE_REF (symbol_type) that)
+    : super_type (s]b4_variant_if([], [, YY_MOVE (that.value)])[]b4_locations_if([, YY_MOVE (that.location)])[)
+  {]b4_variant_if([
+    b4_symbol_variant([that.kind ()],
+                      [value], [move], [YY_MOVE (that.value)])])[
+    // that is emptied.
+    that.kind_ = ]b4_symbol(empty, kind)[;
+  }
+
+#if YY_CPLUSPLUS < 201103L
+  ]b4_parser_class[::stack_symbol_type&
+  ]b4_parser_class[::stack_symbol_type::operator= (const stack_symbol_type& that)
+  {
+    state = that.state;
+    ]b4_variant_if([b4_symbol_variant([that.kind ()],
+                                      [value], [copy], [that.value])],
+                   [[value = that.value;]])[]b4_locations_if([
+    location = that.location;])[
+    return *this;
+  }
+
+  ]b4_parser_class[::stack_symbol_type&
+  ]b4_parser_class[::stack_symbol_type::operator= (stack_symbol_type& that)
+  {
+    state = that.state;
+    ]b4_variant_if([b4_symbol_variant([that.kind ()],
+                                      [value], [move], [that.value])],
+                   [[value = that.value;]])[]b4_locations_if([
+    location = that.location;])[
+    // that is emptied.
+    that.state = empty_state;
+    return *this;
+  }
+#endif
+
+  template <typename Base>
+  void
+  ]b4_parser_class[::yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const
+  {
+    if (yymsg)
+      YY_SYMBOL_PRINT (yymsg, yysym);]b4_variant_if([], [
+
+    // User destructor.
+    b4_symbol_actions([destructor], [yysym.kind ()])])[
+  }
+
+#if ]b4_api_PREFIX[DEBUG
+  template <typename Base>
+  void
+  ]b4_parser_class[::yy_print_ (std::ostream& yyo, const basic_symbol<Base>& yysym) const
+  {
+    std::ostream& yyoutput = yyo;
+    YY_USE (yyoutput);
+    if (yysym.empty ())
+      yyo << "empty symbol";
+    else
+      {
+        symbol_kind_type yykind = yysym.kind ();
+        yyo << (yykind < YYNTOKENS ? "token" : "nterm")
+            << ' ' << yysym.name () << " ("]b4_locations_if([
+            << yysym.location << ": "])[;
+        ]b4_symbol_actions([printer])[
+        yyo << ')';
+      }
+  }
+#endif
+
+  void
+  ]b4_parser_class[::yypush_ (const char* m, YY_MOVE_REF (stack_symbol_type) sym)
+  {
+    if (m)
+      YY_SYMBOL_PRINT (m, sym);
+    yystack_.push (YY_MOVE (sym));
+  }
+
+  void
+  ]b4_parser_class[::yypush_ (const char* m, state_type s, YY_MOVE_REF (symbol_type) sym)
+  {
+#if 201103L <= YY_CPLUSPLUS
+    yypush_ (m, stack_symbol_type (s, std::move (sym)));
+#else
+    stack_symbol_type ss (s, sym);
+    yypush_ (m, ss);
+#endif
+  }
+
+  void
+  ]b4_parser_class[::yypop_ (int n) YY_NOEXCEPT
+  {
+    yystack_.pop (n);
+  }
+
+#if ]b4_api_PREFIX[DEBUG
+  std::ostream&
+  ]b4_parser_class[::debug_stream () const
+  {
+    return *yycdebug_;
+  }
+
+  void
+  ]b4_parser_class[::set_debug_stream (std::ostream& o)
+  {
+    yycdebug_ = &o;
+  }
+
+
+  ]b4_parser_class[::debug_level_type
+  ]b4_parser_class[::debug_level () const
+  {
+    return yydebug_;
+  }
+
+  void
+  ]b4_parser_class[::set_debug_level (debug_level_type l)
+  {
+    yydebug_ = l;
+  }
+#endif // ]b4_api_PREFIX[DEBUG
+
+  ]b4_parser_class[::state_type
+  ]b4_parser_class[::yy_lr_goto_state_ (state_type yystate, int yysym)
+  {
+    int yyr = yypgoto_[yysym - YYNTOKENS] + yystate;
+    if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
+      return yytable_[yyr];
+    else
+      return yydefgoto_[yysym - YYNTOKENS];
+  }
+
+  bool
+  ]b4_parser_class[::yy_pact_value_is_default_ (int yyvalue) YY_NOEXCEPT
+  {
+    return yyvalue == yypact_ninf_;
+  }
+
+  bool
+  ]b4_parser_class[::yy_table_value_is_error_ (int yyvalue) YY_NOEXCEPT
+  {
+    return yyvalue == yytable_ninf_;
+  }
+
+  int
+  ]b4_parser_class[::operator() ()
+  {
+    return parse ();
+  }
+
+  int
+  ]b4_parser_class[::parse ()
+  {
+    int yyn;
+    /// Length of the RHS of the rule being reduced.
+    int yylen = 0;
+
+    // Error handling.
+    int yynerrs_ = 0;
+    int yyerrstatus_ = 0;
+
+    /// The lookahead symbol.
+    symbol_type yyla;]b4_locations_if([[
+
+    /// The locations where the error started and ended.
+    stack_symbol_type yyerror_range[3];]])[
+
+    /// The return value of parse ().
+    int yyresult;]b4_lac_if([[
+
+    // Discard the LAC context in case there still is one left from a
+    // previous invocation.
+    yy_lac_discard_ ("init");]])[
+
+#if YY_EXCEPTIONS
+    try
+#endif // YY_EXCEPTIONS
+      {
+    YYCDEBUG << "Starting parse\n";
+
+]m4_ifdef([b4_initial_action], [
+b4_dollar_pushdef([yyla.value], [], [], [yyla.location])dnl
+    b4_user_initial_action
+b4_dollar_popdef])[]dnl
+
+  [  /* Initialize the stack.  The initial state will be set in
+       yynewstate, since the latter expects the semantical and the
+       location values to have been already stored, initialize these
+       stacks with a primary value.  */
+    yystack_.clear ();
+    yypush_ (YY_NULLPTR, 0, YY_MOVE (yyla));
+
+  /*-----------------------------------------------.
+  | yynewstate -- push a new symbol on the stack.  |
+  `-----------------------------------------------*/
+  yynewstate:
+    YYCDEBUG << "Entering state " << int (yystack_[0].state) << '\n';
+    YY_STACK_PRINT ();
+
+    // Accept?
+    if (yystack_[0].state == yyfinal_)
+      YYACCEPT;
+
+    goto yybackup;
+
+
+  /*-----------.
+  | yybackup.  |
+  `-----------*/
+  yybackup:
+    // Try to take a decision without lookahead.
+    yyn = yypact_[+yystack_[0].state];
+    if (yy_pact_value_is_default_ (yyn))
+      goto yydefault;
+
+    // Read a lookahead token.
+    if (yyla.empty ())
+      {
+        YYCDEBUG << "Reading a token\n";
+#if YY_EXCEPTIONS
+        try
+#endif // YY_EXCEPTIONS
+          {]b4_token_ctor_if([[
+            symbol_type yylookahead (]b4_yylex[);
+            yyla.move (yylookahead);]], [[
+            yyla.kind_ = yytranslate_ (]b4_yylex[);]])[
+          }
+#if YY_EXCEPTIONS
+        catch (const syntax_error& yyexc)
+          {
+            YYCDEBUG << "Caught exception: " << yyexc.what() << '\n';
+            error (yyexc);
+            goto yyerrlab1;
+          }
+#endif // YY_EXCEPTIONS
+      }
+    YY_SYMBOL_PRINT ("Next token is", yyla);
+
+    if (yyla.kind () == ]b4_symbol(error, kind)[)
+    {
+      // The scanner already issued an error message, process directly
+      // to error recovery.  But do not keep the error token as
+      // lookahead, it is too special and may lead us to an endless
+      // loop in error recovery. */
+      yyla.kind_ = ]b4_symbol(undef, kind)[;
+      goto yyerrlab1;
+    }
+
+    /* If the proper action on seeing token YYLA.TYPE is to reduce or
+       to detect an error, take that action.  */
+    yyn += yyla.kind ();
+    if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.kind ())
+      {]b4_lac_if([[
+        if (!yy_lac_establish_ (yyla.kind ()))
+          goto yyerrlab;]])[
+        goto yydefault;
+      }
+
+    // Reduce or error.
+    yyn = yytable_[yyn];
+    if (yyn <= 0)
+      {
+        if (yy_table_value_is_error_ (yyn))
+          goto yyerrlab;]b4_lac_if([[
+        if (!yy_lac_establish_ (yyla.kind ()))
+          goto yyerrlab;
+]])[
+        yyn = -yyn;
+        goto yyreduce;
+      }
+
+    // Count tokens shifted since error; after three, turn off error status.
+    if (yyerrstatus_)
+      --yyerrstatus_;
+
+    // Shift the lookahead token.
+    yypush_ ("Shifting", state_type (yyn), YY_MOVE (yyla));]b4_lac_if([[
+    yy_lac_discard_ ("shift");]])[
+    goto yynewstate;
+
+
+  /*-----------------------------------------------------------.
+  | yydefault -- do the default action for the current state.  |
+  `-----------------------------------------------------------*/
+  yydefault:
+    yyn = yydefact_[+yystack_[0].state];
+    if (yyn == 0)
+      goto yyerrlab;
+    goto yyreduce;
+
+
+  /*-----------------------------.
+  | yyreduce -- do a reduction.  |
+  `-----------------------------*/
+  yyreduce:
+    yylen = yyr2_[yyn];
+    {
+      stack_symbol_type yylhs;
+      yylhs.state = yy_lr_goto_state_ (yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([[
+      /* Variants are always initialized to an empty instance of the
+         correct type. The default '$$ = $1' action is NOT applied
+         when using variants.  */
+      ]b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [emplace])], [[
+      /* If YYLEN is nonzero, implement the default value of the
+         action: '$$ = $1'.  Otherwise, use the top of the stack.
+
+         Otherwise, the following line sets YYLHS.VALUE to garbage.
+         This behavior is undocumented and Bison users should not rely
+         upon it.  */
+      if (yylen)
+        yylhs.value = yystack_@{yylen - 1@}.value;
+      else
+        yylhs.value = yystack_@{0@}.value;]])[
+]b4_locations_if([dnl
+[
+      // Default location.
+      {
+        stack_type::slice range (yystack_, yylen);
+        YYLLOC_DEFAULT (yylhs.location, range, yylen);
+        yyerror_range[1].location = yylhs.location;
+      }]])[
+
+      // Perform the reduction.
+      YY_REDUCE_PRINT (yyn);
+#if YY_EXCEPTIONS
+      try
+#endif // YY_EXCEPTIONS
+        {
+          switch (yyn)
+            {
+]b4_user_actions[
+            default:
+              break;
+            }
+        }
+#if YY_EXCEPTIONS
+      catch (const syntax_error& yyexc)
+        {
+          YYCDEBUG << "Caught exception: " << yyexc.what() << '\n';
+          error (yyexc);
+          YYERROR;
+        }
+#endif // YY_EXCEPTIONS
+      YY_SYMBOL_PRINT ("-> $$ =", yylhs);
+      yypop_ (yylen);
+      yylen = 0;
+
+      // Shift the result of the reduction.
+      yypush_ (YY_NULLPTR, YY_MOVE (yylhs));
+    }
+    goto yynewstate;
+
+
+  /*--------------------------------------.
+  | yyerrlab -- here on detecting error.  |
+  `--------------------------------------*/
+  yyerrlab:
+    // If not already recovering from an error, report this error.
+    if (!yyerrstatus_)
+      {
+        ++yynerrs_;]b4_parse_error_case(
+                  [simple], [[
+        std::string msg = YY_("syntax error");
+        error (]b4_join(b4_locations_if([yyla.location]), [[YY_MOVE (msg)]])[);]],
+                  [custom], [[
+        context yyctx (*this, yyla);
+        report_syntax_error (yyctx);]],
+                  [[
+        context yyctx (*this, yyla);
+        std::string msg = yysyntax_error_ (yyctx);
+        error (]b4_join(b4_locations_if([yyla.location]), [[YY_MOVE (msg)]])[);]])[
+      }
+
+]b4_locations_if([[
+    yyerror_range[1].location = yyla.location;]])[
+    if (yyerrstatus_ == 3)
+      {
+        /* If just tried and failed to reuse lookahead token after an
+           error, discard it.  */
+
+        // Return failure if at end of input.
+        if (yyla.kind () == ]b4_symbol(eof, kind)[)
+          YYABORT;
+        else if (!yyla.empty ())
+          {
+            yy_destroy_ ("Error: discarding", yyla);
+            yyla.clear ();
+          }
+      }
+
+    // Else will try to reuse lookahead token after shifting the error token.
+    goto yyerrlab1;
+
+
+  /*---------------------------------------------------.
+  | yyerrorlab -- error raised explicitly by YYERROR.  |
+  `---------------------------------------------------*/
+  yyerrorlab:
+    /* Pacify compilers when the user code never invokes YYERROR and
+       the label yyerrorlab therefore never appears in user code.  */
+    if (false)
+      YYERROR;
+
+    /* Do not reclaim the symbols of the rule whose action triggered
+       this YYERROR.  */
+    yypop_ (yylen);
+    yylen = 0;
+    YY_STACK_PRINT ();
+    goto yyerrlab1;
+
+
+  /*-------------------------------------------------------------.
+  | yyerrlab1 -- common code for both syntax error and YYERROR.  |
+  `-------------------------------------------------------------*/
+  yyerrlab1:
+    yyerrstatus_ = 3;   // Each real token shifted decrements this.
+    // Pop stack until we find a state that shifts the error token.
+    for (;;)
+      {
+        yyn = yypact_[+yystack_[0].state];
+        if (!yy_pact_value_is_default_ (yyn))
+          {
+            yyn += ]b4_symbol(error, kind)[;
+            if (0 <= yyn && yyn <= yylast_
+                && yycheck_[yyn] == ]b4_symbol(error, kind)[)
+              {
+                yyn = yytable_[yyn];
+                if (0 < yyn)
+                  break;
+              }
+          }
+
+        // Pop the current state because it cannot handle the error token.
+        if (yystack_.size () == 1)
+          YYABORT;
+]b4_locations_if([[
+        yyerror_range[1].location = yystack_[0].location;]])[
+        yy_destroy_ ("Error: popping", yystack_[0]);
+        yypop_ ();
+        YY_STACK_PRINT ();
+      }
+    {
+      stack_symbol_type error_token;
+]b4_locations_if([[
+      yyerror_range[2].location = yyla.location;
+      YYLLOC_DEFAULT (error_token.location, yyerror_range, 2);]])[
+
+      // Shift the error token.]b4_lac_if([[
+      yy_lac_discard_ ("error recovery");]])[
+      error_token.state = state_type (yyn);
+      yypush_ ("Shifting", YY_MOVE (error_token));
+    }
+    goto yynewstate;
+
+
+  /*-------------------------------------.
+  | yyacceptlab -- YYACCEPT comes here.  |
+  `-------------------------------------*/
+  yyacceptlab:
+    yyresult = 0;
+    goto yyreturn;
+
+
+  /*-----------------------------------.
+  | yyabortlab -- YYABORT comes here.  |
+  `-----------------------------------*/
+  yyabortlab:
+    yyresult = 1;
+    goto yyreturn;
+
+
+  /*-----------------------------------------------------.
+  | yyreturn -- parsing is finished, return the result.  |
+  `-----------------------------------------------------*/
+  yyreturn:
+    if (!yyla.empty ())
+      yy_destroy_ ("Cleanup: discarding lookahead", yyla);
+
+    /* Do not reclaim the symbols of the rule whose action triggered
+       this YYABORT or YYACCEPT.  */
+    yypop_ (yylen);
+    YY_STACK_PRINT ();
+    while (1 < yystack_.size ())
+      {
+        yy_destroy_ ("Cleanup: popping", yystack_[0]);
+        yypop_ ();
+      }
+
+    return yyresult;
+  }
+#if YY_EXCEPTIONS
+    catch (...)
+      {
+        YYCDEBUG << "Exception caught: cleaning lookahead and stack\n";
+        // Do not try to display the values of the reclaimed symbols,
+        // as their printers might throw an exception.
+        if (!yyla.empty ())
+          yy_destroy_ (YY_NULLPTR, yyla);
+
+        while (1 < yystack_.size ())
+          {
+            yy_destroy_ (YY_NULLPTR, yystack_[0]);
+            yypop_ ();
+          }
+        throw;
+      }
+#endif // YY_EXCEPTIONS
+  }
+
+  void
+  ]b4_parser_class[::error (const syntax_error& yyexc)
+  {
+    error (]b4_join(b4_locations_if([yyexc.location]),
+                    [[yyexc.what ()]])[);
+  }
+
+]b4_parse_error_bmatch([custom\|detailed],
+[[  const char *
+  ]b4_parser_class[::symbol_name (symbol_kind_type yysymbol)
+  {
+    static const char *const yy_sname[] =
+    {
+    ]b4_symbol_names[
+    };]b4_has_translations_if([[
+    /* YYTRANSLATABLE[SYMBOL-NUM] -- Whether YY_SNAME[SYMBOL-NUM] is
+       internationalizable.  */
+    static ]b4_int_type_for([b4_translatable])[ yytranslatable[] =
+    {
+    ]b4_translatable[
+    };
+    return (yysymbol < YYNTOKENS && yytranslatable[yysymbol]
+            ? _(yy_sname[yysymbol])
+            : yy_sname[yysymbol]);]], [[
+    return yy_sname[yysymbol];]])[
+  }
+]],
+[simple],
+[[#if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
+  const char *
+  ]b4_parser_class[::symbol_name (symbol_kind_type yysymbol)
+  {
+    return yytname_[yysymbol];
+  }
+#endif // #if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
+]],
+[verbose],
+[[  /* Return YYSTR after stripping away unnecessary quotes and
      backslashes, so that it's suitable for yyerror.  The heuristic is
      that double-quoting is unnecessary unless the string contains an
      apostrophe, a comma, or backslash (other than backslash-backslash).
@@ -583,582 +1274,89 @@
 
     return yystr;
   }
+
+  std::string
+  ]b4_parser_class[::symbol_name (symbol_kind_type yysymbol)
+  {
+    return yytnamerr_ (yytname_[yysymbol]);
+  }
 ]])[
 
-  /// Build a parser object.
-  ]b4_parser_class::b4_parser_class[ (]b4_parse_param_decl[)
-#if ]b4_api_PREFIX[DEBUG
-    : yydebug_ (false),
-      yycdebug_ (&std::cerr)]b4_lac_if([,], [m4_ifset([b4_parse_param], [,])])[
-#else
-]b4_lac_if([    :], [m4_ifset([b4_parse_param], [    :])])[
-#endif]b4_lac_if([[
-      yy_lac_established_ (false)]m4_ifset([b4_parse_param], [,])])[]b4_parse_param_cons[
+]b4_parse_error_bmatch([custom\|detailed\|verbose], [[
+  // ]b4_parser_class[::context.
+  ]b4_parser_class[::context::context (const ]b4_parser_class[& yyparser, const symbol_type& yyla)
+    : yyparser_ (yyparser)
+    , yyla_ (yyla)
   {}
 
-  ]b4_parser_class::~b4_parser_class[ ()
-  {}
-
-  ]b4_parser_class[::syntax_error::~syntax_error () YY_NOEXCEPT YY_NOTHROW
-  {}
-
-  /*---------------.
-  | Symbol types.  |
-  `---------------*/
-
-]b4_token_ctor_if([], [b4_public_types_define([cc])])[
-
-  // by_state.
-  ]b4_parser_class[::by_state::by_state () YY_NOEXCEPT
-    : state (empty_state)
-  {}
-
-  ]b4_parser_class[::by_state::by_state (const by_state& that) YY_NOEXCEPT
-    : state (that.state)
-  {}
-
-  void
-  ]b4_parser_class[::by_state::clear () YY_NOEXCEPT
-  {
-    state = empty_state;
-  }
-
-  void
-  ]b4_parser_class[::by_state::move (by_state& that)
-  {
-    state = that.state;
-    that.clear ();
-  }
-
-  ]b4_parser_class[::by_state::by_state (state_type s) YY_NOEXCEPT
-    : state (s)
-  {}
-
-  ]b4_parser_class[::symbol_number_type
-  ]b4_parser_class[::by_state::type_get () const YY_NOEXCEPT
-  {
-    if (state == empty_state)
-      return empty_symbol;
-    else
-      return yystos_[state];
-  }
-
-  ]b4_parser_class[::stack_symbol_type::stack_symbol_type ()
-  {}
-
-  ]b4_parser_class[::stack_symbol_type::stack_symbol_type (YY_RVREF (stack_symbol_type) that)
-    : super_type (YY_MOVE (that.state)]b4_variant_if([], [, YY_MOVE (that.value)])b4_locations_if([, YY_MOVE (that.location)])[)
-  {]b4_variant_if([
-    b4_symbol_variant([that.type_get ()],
-                      [value], [YY_MOVE_OR_COPY], [YY_MOVE (that.value)])])[
-#if 201103L <= YY_CPLUSPLUS
-    // that is emptied.
-    that.state = empty_state;
-#endif
-  }
-
-  ]b4_parser_class[::stack_symbol_type::stack_symbol_type (state_type s, YY_MOVE_REF (symbol_type) that)
-    : super_type (s]b4_variant_if([], [, YY_MOVE (that.value)])[]b4_locations_if([, YY_MOVE (that.location)])[)
-  {]b4_variant_if([
-    b4_symbol_variant([that.type_get ()],
-                      [value], [move], [YY_MOVE (that.value)])])[
-    // that is emptied.
-    that.type = empty_symbol;
-  }
-
-#if YY_CPLUSPLUS < 201103L
-  ]b4_parser_class[::stack_symbol_type&
-  ]b4_parser_class[::stack_symbol_type::operator= (const stack_symbol_type& that)
-  {
-    state = that.state;
-    ]b4_variant_if([b4_symbol_variant([that.type_get ()],
-                                      [value], [copy], [that.value])],
-                   [[value = that.value;]])[]b4_locations_if([
-    location = that.location;])[
-    return *this;
-  }
-
-  ]b4_parser_class[::stack_symbol_type&
-  ]b4_parser_class[::stack_symbol_type::operator= (stack_symbol_type& that)
-  {
-    state = that.state;
-    ]b4_variant_if([b4_symbol_variant([that.type_get ()],
-                                      [value], [move], [that.value])],
-                   [[value = that.value;]])[]b4_locations_if([
-    location = that.location;])[
-    // that is emptied.
-    that.state = empty_state;
-    return *this;
-  }
-#endif
-
-  template <typename Base>
-  void
-  ]b4_parser_class[::yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const
-  {
-    if (yymsg)
-      YY_SYMBOL_PRINT (yymsg, yysym);]b4_variant_if([], [
-
-    // User destructor.
-    b4_symbol_actions([destructor], [yysym.type_get ()])])[
-  }
-
-#if ]b4_api_PREFIX[DEBUG
-  template <typename Base>
-  void
-  ]b4_parser_class[::yy_print_ (std::ostream& yyo,
-                                     const basic_symbol<Base>& yysym) const
-  {
-    std::ostream& yyoutput = yyo;
-    YYUSE (yyoutput);
-    symbol_number_type yytype = yysym.type_get ();
-#if defined __GNUC__ && ! defined __clang__ && ! defined __ICC && __GNUC__ * 100 + __GNUC_MINOR__ <= 408
-    // Avoid a (spurious) G++ 4.8 warning about "array subscript is
-    // below array bounds".
-    if (yysym.empty ())
-      std::abort ();
-#endif
-    yyo << (yytype < yyntokens_ ? "token" : "nterm")
-        << ' ' << yytname_[yytype] << " ("]b4_locations_if([
-        << yysym.location << ": "])[;
-    ]b4_symbol_actions([printer])[
-    yyo << ')';
-  }
-#endif
-
-  void
-  ]b4_parser_class[::yypush_ (const char* m, YY_MOVE_REF (stack_symbol_type) sym)
-  {
-    if (m)
-      YY_SYMBOL_PRINT (m, sym);
-    yystack_.push (YY_MOVE (sym));
-  }
-
-  void
-  ]b4_parser_class[::yypush_ (const char* m, state_type s, YY_MOVE_REF (symbol_type) sym)
-  {
-#if 201103L <= YY_CPLUSPLUS
-    yypush_ (m, stack_symbol_type (s, std::move (sym)));
-#else
-    stack_symbol_type ss (s, sym);
-    yypush_ (m, ss);
-#endif
-  }
-
-  void
-  ]b4_parser_class[::yypop_ (int n)
-  {
-    yystack_.pop (n);
-  }
-
-#if ]b4_api_PREFIX[DEBUG
-  std::ostream&
-  ]b4_parser_class[::debug_stream () const
-  {
-    return *yycdebug_;
-  }
-
-  void
-  ]b4_parser_class[::set_debug_stream (std::ostream& o)
-  {
-    yycdebug_ = &o;
-  }
-
-
-  ]b4_parser_class[::debug_level_type
-  ]b4_parser_class[::debug_level () const
-  {
-    return yydebug_;
-  }
-
-  void
-  ]b4_parser_class[::set_debug_level (debug_level_type l)
-  {
-    yydebug_ = l;
-  }
-#endif // ]b4_api_PREFIX[DEBUG
-
-  ]b4_parser_class[::state_type
-  ]b4_parser_class[::yy_lr_goto_state_ (state_type yystate, int yysym)
-  {
-    int yyr = yypgoto_[yysym - yyntokens_] + yystate;
-    if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
-      return yytable_[yyr];
-    else
-      return yydefgoto_[yysym - yyntokens_];
-  }
-
-  bool
-  ]b4_parser_class[::yy_pact_value_is_default_ (int yyvalue)
-  {
-    return yyvalue == yypact_ninf_;
-  }
-
-  bool
-  ]b4_parser_class[::yy_table_value_is_error_ (int yyvalue)
-  {
-    return yyvalue == yytable_ninf_;
-  }
-
   int
-  ]b4_parser_class[::operator() ()
+  ]b4_parser_class[::context::expected_tokens (symbol_kind_type yyarg[], int yyargn) const
   {
-    return parse ();
-  }
+    // Actual number of expected tokens
+    int yycount = 0;
+]b4_lac_if([[
+#if ]b4_api_PREFIX[DEBUG
+    // Execute LAC once. We don't care if it is successful, we
+    // only do it for the sake of debugging output.
+    if (!yyparser_.yy_lac_established_)
+      yyparser_.yy_lac_check_ (yyla_.kind ());
+#endif
 
-  int
-  ]b4_parser_class[::parse ()
-  {
-    int yyn;
-    /// Length of the RHS of the rule being reduced.
-    int yylen = 0;
-
-    // Error handling.
-    int yynerrs_ = 0;
-    int yyerrstatus_ = 0;
-
-    /// The lookahead symbol.
-    symbol_type yyla;]b4_locations_if([[
-
-    /// The locations where the error started and ended.
-    stack_symbol_type yyerror_range[3];]])[
-
-    /// The return value of parse ().
-    int yyresult;]b4_lac_if([[
-
-    /// Discard the LAC context in case there still is one left from a
-    /// previous invocation.
-    yy_lac_discard_ ("init");]])[
-
-#if YY_EXCEPTIONS
-    try
-#endif // YY_EXCEPTIONS
+    for (int yyx = 0; yyx < YYNTOKENS; ++yyx)
       {
-    YYCDEBUG << "Starting parse\n";
-
-]m4_ifdef([b4_initial_action], [
-b4_dollar_pushdef([yyla.value], [], [], [yyla.location])dnl
-    b4_user_initial_action
-b4_dollar_popdef])[]dnl
-
-  [  /* Initialize the stack.  The initial state will be set in
-       yynewstate, since the latter expects the semantical and the
-       location values to have been already stored, initialize these
-       stacks with a primary value.  */
-    yystack_.clear ();
-    yypush_ (YY_NULLPTR, 0, YY_MOVE (yyla));
-
-  /*-----------------------------------------------.
-  | yynewstate -- push a new symbol on the stack.  |
-  `-----------------------------------------------*/
-  yynewstate:
-    YYCDEBUG << "Entering state " << int (yystack_[0].state) << '\n';
-
-    // Accept?
-    if (yystack_[0].state == yyfinal_)
-      YYACCEPT;
-
-    goto yybackup;
-
-
-  /*-----------.
-  | yybackup.  |
-  `-----------*/
-  yybackup:
-    // Try to take a decision without lookahead.
-    yyn = yypact_[yystack_[0].state];
-    if (yy_pact_value_is_default_ (yyn))
-      goto yydefault;
-
-    // Read a lookahead token.
-    if (yyla.empty ())
-      {
-        YYCDEBUG << "Reading a token: ";
-#if YY_EXCEPTIONS
-        try
-#endif // YY_EXCEPTIONS
-          {]b4_token_ctor_if([[
-            symbol_type yylookahead (]b4_lex[);
-            yyla.move (yylookahead);]], [[
-            yyla.type = yytranslate_ (]b4_lex[);]])[
-          }
-#if YY_EXCEPTIONS
-        catch (const syntax_error& yyexc)
+        symbol_kind_type yysym = YY_CAST (symbol_kind_type, yyx);
+        if (yysym != ]b4_symbol(error, kind)[
+            && yysym != ]b4_symbol(undef, kind)[
+            && yyparser_.yy_lac_check_ (yysym))
           {
-            YYCDEBUG << "Caught exception: " << yyexc.what() << '\n';
-            error (yyexc);
-            goto yyerrlab1;
+            if (!yyarg)
+              ++yycount;
+            else if (yycount == yyargn)
+              return 0;
+            else
+              yyarg[yycount++] = yysym;
           }
-#endif // YY_EXCEPTIONS
-      }
-    YY_SYMBOL_PRINT ("Next token is", yyla);
-
-    /* If the proper action on seeing token YYLA.TYPE is to reduce or
-       to detect an error, take that action.  */
-    yyn += yyla.type_get ();
-    if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type_get ())
-      {]b4_lac_if([[
-        if (!yy_lac_establish_ (yyla.type_get ()))
-           goto yyerrlab;]])[
-        goto yydefault;
-      }
-
-    // Reduce or error.
-    yyn = yytable_[yyn];
-    if (yyn <= 0)
+      }]], [[
+    const int yyn = yypact_[+yyparser_.yystack_[0].state];
+    if (!yy_pact_value_is_default_ (yyn))
       {
-        if (yy_table_value_is_error_ (yyn))
-          goto yyerrlab;]b4_lac_if([[
-        if (!yy_lac_establish_ (yyla.type_get ()))
-           goto yyerrlab;
+        /* Start YYX at -YYN if negative to avoid negative indexes in
+           YYCHECK.  In other words, skip the first -YYN actions for
+           this state because they are default actions.  */
+        const int yyxbegin = yyn < 0 ? -yyn : 0;
+        // Stay within bounds of both yycheck and yytname.
+        const int yychecklim = yylast_ - yyn + 1;
+        const int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+        for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
+          if (yycheck_[yyx + yyn] == yyx && yyx != ]b4_symbol(error, kind)[
+              && !yy_table_value_is_error_ (yytable_[yyx + yyn]))
+            {
+              if (!yyarg)
+                ++yycount;
+              else if (yycount == yyargn)
+                return 0;
+              else
+                yyarg[yycount++] = YY_CAST (symbol_kind_type, yyx);
+            }
+      }
 ]])[
-        yyn = -yyn;
-        goto yyreduce;
-      }
-
-    // Count tokens shifted since error; after three, turn off error status.
-    if (yyerrstatus_)
-      --yyerrstatus_;
-
-    // Shift the lookahead token.
-    yypush_ ("Shifting", static_cast<state_type> (yyn), YY_MOVE (yyla));]b4_lac_if([[
-    yy_lac_discard_ ("shift");]])[
-    goto yynewstate;
-
-
-  /*-----------------------------------------------------------.
-  | yydefault -- do the default action for the current state.  |
-  `-----------------------------------------------------------*/
-  yydefault:
-    yyn = yydefact_[yystack_[0].state];
-    if (yyn == 0)
-      goto yyerrlab;
-    goto yyreduce;
-
-
-  /*-----------------------------.
-  | yyreduce -- do a reduction.  |
-  `-----------------------------*/
-  yyreduce:
-    yylen = yyr2_[yyn];
-    {
-      stack_symbol_type yylhs;
-      yylhs.state = yy_lr_goto_state_ (yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([
-      /* Variants are always initialized to an empty instance of the
-         correct type. The default '$$ = $1' action is NOT applied
-         when using variants.  */
-      b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [emplace])], [
-      /* If YYLEN is nonzero, implement the default value of the
-         action: '$$ = $1'.  Otherwise, use the top of the stack.
-
-         Otherwise, the following line sets YYLHS.VALUE to garbage.
-         This behavior is undocumented and Bison users should not rely
-         upon it.  */
-      if (yylen)
-        yylhs.value = yystack_@{yylen - 1@}.value;
-      else
-        yylhs.value = yystack_@{0@}.value;])[
-]b4_locations_if([dnl
-[
-      // Default location.
-      {
-        stack_type::slice range (yystack_, yylen);
-        YYLLOC_DEFAULT (yylhs.location, range, yylen);
-        yyerror_range[1].location = yylhs.location;
-      }]])[
-
-      // Perform the reduction.
-      YY_REDUCE_PRINT (yyn);
-#if YY_EXCEPTIONS
-      try
-#endif // YY_EXCEPTIONS
-        {
-          switch (yyn)
-            {
-]b4_user_actions[
-            default:
-              break;
-            }
-        }
-#if YY_EXCEPTIONS
-      catch (const syntax_error& yyexc)
-        {
-          YYCDEBUG << "Caught exception: " << yyexc.what() << '\n';
-          error (yyexc);
-          YYERROR;
-        }
-#endif // YY_EXCEPTIONS
-      YY_SYMBOL_PRINT ("-> $$ =", yylhs);
-      yypop_ (yylen);
-      yylen = 0;
-      YY_STACK_PRINT ();
-
-      // Shift the result of the reduction.
-      yypush_ (YY_NULLPTR, YY_MOVE (yylhs));
-    }
-    goto yynewstate;
-
-
-  /*--------------------------------------.
-  | yyerrlab -- here on detecting error.  |
-  `--------------------------------------*/
-  yyerrlab:
-    // If not already recovering from an error, report this error.
-    if (!yyerrstatus_)
-      {
-        ++yynerrs_;
-        error (]b4_join(b4_locations_if([yyla.location]),
-                        [[yysyntax_error_ (yystack_[0].state, yyla)]])[);
-      }
-
-]b4_locations_if([[
-    yyerror_range[1].location = yyla.location;]])[
-    if (yyerrstatus_ == 3)
-      {
-        /* If just tried and failed to reuse lookahead token after an
-           error, discard it.  */
-
-        // Return failure if at end of input.
-        if (yyla.type_get () == yyeof_)
-          YYABORT;
-        else if (!yyla.empty ())
-          {
-            yy_destroy_ ("Error: discarding", yyla);
-            yyla.clear ();
-          }
-      }
-
-    // Else will try to reuse lookahead token after shifting the error token.
-    goto yyerrlab1;
-
-
-  /*---------------------------------------------------.
-  | yyerrorlab -- error raised explicitly by YYERROR.  |
-  `---------------------------------------------------*/
-  yyerrorlab:
-    /* Pacify compilers when the user code never invokes YYERROR and
-       the label yyerrorlab therefore never appears in user code.  */
-    if (false)
-      YYERROR;
-
-    /* Do not reclaim the symbols of the rule whose action triggered
-       this YYERROR.  */
-    yypop_ (yylen);
-    yylen = 0;
-    goto yyerrlab1;
-
-
-  /*-------------------------------------------------------------.
-  | yyerrlab1 -- common code for both syntax error and YYERROR.  |
-  `-------------------------------------------------------------*/
-  yyerrlab1:
-    yyerrstatus_ = 3;   // Each real token shifted decrements this.
-    {
-      stack_symbol_type error_token;
-      for (;;)
-        {
-          yyn = yypact_[yystack_[0].state];
-          if (!yy_pact_value_is_default_ (yyn))
-            {
-              yyn += yy_error_token_;
-              if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yy_error_token_)
-                {
-                  yyn = yytable_[yyn];
-                  if (0 < yyn)
-                    break;
-                }
-            }
-
-          // Pop the current state because it cannot handle the error token.
-          if (yystack_.size () == 1)
-            YYABORT;
-]b4_locations_if([[
-          yyerror_range[1].location = yystack_[0].location;]])[
-          yy_destroy_ ("Error: popping", yystack_[0]);
-          yypop_ ();
-          YY_STACK_PRINT ();
-        }
-]b4_locations_if([[
-      yyerror_range[2].location = yyla.location;
-      YYLLOC_DEFAULT (error_token.location, yyerror_range, 2);]])[
-
-      // Shift the error token.]b4_lac_if([[
-      yy_lac_discard_ ("error recovery");]])[
-      error_token.state = static_cast<state_type> (yyn);
-      yypush_ ("Shifting", YY_MOVE (error_token));
-    }
-    goto yynewstate;
-
-
-  /*-------------------------------------.
-  | yyacceptlab -- YYACCEPT comes here.  |
-  `-------------------------------------*/
-  yyacceptlab:
-    yyresult = 0;
-    goto yyreturn;
-
-
-  /*-----------------------------------.
-  | yyabortlab -- YYABORT comes here.  |
-  `-----------------------------------*/
-  yyabortlab:
-    yyresult = 1;
-    goto yyreturn;
-
-
-  /*-----------------------------------------------------.
-  | yyreturn -- parsing is finished, return the result.  |
-  `-----------------------------------------------------*/
-  yyreturn:
-    if (!yyla.empty ())
-      yy_destroy_ ("Cleanup: discarding lookahead", yyla);
-
-    /* Do not reclaim the symbols of the rule whose action triggered
-       this YYABORT or YYACCEPT.  */
-    yypop_ (yylen);
-    while (1 < yystack_.size ())
-      {
-        yy_destroy_ ("Cleanup: popping", yystack_[0]);
-        yypop_ ();
-      }
-
-    return yyresult;
-  }
-#if YY_EXCEPTIONS
-    catch (...)
-      {
-        YYCDEBUG << "Exception caught: cleaning lookahead and stack\n";
-        // Do not try to display the values of the reclaimed symbols,
-        // as their printers might throw an exception.
-        if (!yyla.empty ())
-          yy_destroy_ (YY_NULLPTR, yyla);
-
-        while (1 < yystack_.size ())
-          {
-            yy_destroy_ (YY_NULLPTR, yystack_[0]);
-            yypop_ ();
-          }
-        throw;
-      }
-#endif // YY_EXCEPTIONS
+    if (yyarg && yycount == 0 && 0 < yyargn)
+      yyarg[0] = ]b4_symbol(empty, kind)[;
+    return yycount;
   }
 
-  void
-  ]b4_parser_class[::error (const syntax_error& yyexc)
-  {
-    error (]b4_join(b4_locations_if([yyexc.location]),
-                    [[yyexc.what ()]])[);
-  }]b4_lac_if([[
+]])[
 
+]b4_lac_if([[
   bool
-  ]b4_parser_class[::yy_lac_check_ (int yytoken) const
+  ]b4_parser_class[::yy_lac_check_ (symbol_kind_type yytoken) const
   {
     // Logically, the yylac_stack's lifetime is confined to this function.
     // Clear it, to get rid of potential left-overs from previous call.
     yylac_stack_.clear ();
     // Reduce until we encounter a shift and thereby accept the token.
 #if ]b4_api_PREFIX[DEBUG
-    YYCDEBUG << "LAC: checking lookahead " << yytname_[yytoken] << ':';
+    YYCDEBUG << "LAC: checking lookahead " << symbol_name (yytoken) << ':';
 #endif
     std::ptrdiff_t lac_top = 0;
     while (true)
@@ -1166,13 +1364,13 @@
         state_type top_state = (yylac_stack_.empty ()
                                 ? yystack_[lac_top].state
                                 : yylac_stack_.back ());
-        int yyrule = yypact_[top_state];
+        int yyrule = yypact_[+top_state];
         if (yy_pact_value_is_default_ (yyrule)
             || (yyrule += yytoken) < 0 || yylast_ < yyrule
             || yycheck_[yyrule] != yytoken)
           {
             // Use the default action.
-            yyrule = yydefact_[top_state];
+            yyrule = yydefact_[+top_state];
             if (yyrule == 0)
               {
                 YYCDEBUG << " Err\n";
@@ -1222,14 +1420,14 @@
                      : yylac_stack_.back ());
         // Push the resulting state of the reduction.
         state_type state = yy_lr_goto_state_ (top_state, yyr1_[yyrule]);
-        YYCDEBUG << " G" << state;
+        YYCDEBUG << " G" << int (state);
         yylac_stack_.push_back (state);
       }
   }
 
   // Establish the initial context if no initial context currently exists.
   bool
-  ]b4_parser_class[::yy_lac_establish_ (int yytoken)
+  ]b4_parser_class[::yy_lac_establish_ (symbol_kind_type yytoken)
   {
     /* Establish the initial context for the current lookahead if no initial
        context is currently established.
@@ -1254,21 +1452,22 @@
        follows.  If no initial context is currently established for the
        current lookahead, then check if that lookahead can eventually be
        shifted if syntactic actions continue from the current context.  */
-    if (!yy_lac_established_)
+    if (yy_lac_established_)
+      return true;
+    else
       {
 #if ]b4_api_PREFIX[DEBUG
         YYCDEBUG << "LAC: initial context established for "
-                 << yytname_[yytoken] << '\n';
+                 << symbol_name (yytoken) << '\n';
 #endif
         yy_lac_established_ = true;
         return yy_lac_check_ (yytoken);
       }
-    return true;
   }
 
   // Discard any previous initial lookahead context.
   void
-  ]b4_parser_class[::yy_lac_discard_ (const char* evt)
+  ]b4_parser_class[::yy_lac_discard_ (const char* event)
   {
    /* Discard any previous initial lookahead context because of Event,
       which may be a lookahead change or an invalidation of the currently
@@ -1284,25 +1483,16 @@
     if (yy_lac_established_)
       {
         YYCDEBUG << "LAC: initial context discarded due to "
-                 << evt << '\n';
+                 << event << '\n';
         yy_lac_established_ = false;
       }
   }]])[
 
-  // Generate an error message.
-  std::string
-  ]b4_parser_class[::yysyntax_error_ (]dnl
-b4_error_verbose_if([state_type yystate, const symbol_type& yyla],
-                    [state_type, const symbol_type&])[) const
-  {]b4_error_verbose_if([[
-    // Number of reported tokens (one for the "unexpected", one per
-    // "expected").
-    std::ptrdiff_t yycount = 0;
-    // Its maximum.
-    enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
-    // Arguments of yyformat.
-    char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-
+]b4_parse_error_bmatch([detailed\|verbose], [[
+  int
+  ]b4_parser_class[::yy_syntax_error_arguments_ (const context& yyctx,
+                                                 symbol_kind_type yyarg[], int yyargn) const
+  {
     /* There are many possibilities here to consider:
        - If this state is a consistent state with a default action, then
          the only way this function was invoked is if the default action
@@ -1333,46 +1523,26 @@
          one exception: it will still contain any token that will not be
          accepted due to an error action in a later state.]])[
     */
-    if (!yyla.empty ())
+
+    if (!yyctx.lookahead ().empty ())
       {
-        symbol_number_type yytoken = yyla.type_get ();
-        yyarg[yycount++] = yytname_[yytoken];]b4_lac_if([[
-
-#if ]b4_api_PREFIX[DEBUG
-        // Execute LAC once. We don't care if it is succesful, we
-        // only do it for the sake of debugging output.
-        if (!yy_lac_established_)
-          yy_lac_check_ (yytoken);
-#endif]])[
-
-        int yyn = yypact_[yystate];
-        if (!yy_pact_value_is_default_ (yyn))
-          {]b4_lac_if([[
-            for (int yyx = 0; yyx < yyntokens_; ++yyx)
-              if (yyx != yy_error_token_ && yyx != yy_undef_token_
-                  && yy_lac_check_ (yyx))
-                {]], [[
-            /* Start YYX at -YYN if negative to avoid negative indexes in
-               YYCHECK.  In other words, skip the first -YYN actions for
-               this state because they are default actions.  */
-            int yyxbegin = yyn < 0 ? -yyn : 0;
-            // Stay within bounds of both yycheck and yytname.
-            int yychecklim = yylast_ - yyn + 1;
-            int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
-            for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
-              if (yycheck_[yyx + yyn] == yyx && yyx != yy_error_token_
-                  && !yy_table_value_is_error_ (yytable_[yyx + yyn]))
-                {]])[
-                  if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-                    {
-                      yycount = 1;
-                      break;
-                    }
-                  else
-                    yyarg[yycount++] = yytname_[yyx];
-                }
-          }
+        if (yyarg)
+          yyarg[0] = yyctx.token ();
+        int yyn = yyctx.expected_tokens (yyarg ? yyarg + 1 : yyarg, yyargn - 1);
+        return yyn + 1;
       }
+    return 0;
+  }
+
+  // Generate an error message.
+  std::string
+  ]b4_parser_class[::yysyntax_error_ (const context& yyctx) const
+  {
+    // Its maximum.
+    enum { YYARGS_MAX = 5 };
+    // Arguments of yyformat.
+    symbol_kind_type yyarg[YYARGS_MAX];
+    int yycount = yy_syntax_error_arguments_ (yyctx, yyarg, YYARGS_MAX);
 
     char const* yyformat = YY_NULLPTR;
     switch (yycount)
@@ -1397,14 +1567,13 @@
     for (char const* yyp = yyformat; *yyp; ++yyp)
       if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)
         {
-          yyres += yytnamerr_ (yyarg[yyi++]);
+          yyres += symbol_name (yyarg[yyi++]);
           ++yyp;
         }
       else
         yyres += *yyp;
-    return yyres;]], [[
-    return YY_("syntax error");]])[
-  }
+    return yyres;
+  }]])[
 
 
   const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class::yypact_ninf_ = b4_pact_ninf[;
@@ -1413,21 +1582,23 @@
 
 ]b4_parser_tables_define[
 
-]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[
+]b4_parse_error_bmatch([simple\|verbose],
+[[#if ]b4_api_PREFIX[DEBUG]b4_tname_if([[ || 1]])[
   // YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-  // First, the terminals, then, starting at \a yyntokens_, nonterminals.
+  // First, the terminals, then, starting at \a YYNTOKENS, nonterminals.
   const char*
   const ]b4_parser_class[::yytname_[] =
   {
   ]b4_tname[
   };
+#endif
+]])[
 
-]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[
+#if ]b4_api_PREFIX[DEBUG][
 ]b4_integral_parser_table_define([rline], [b4_rline])[
 
-  // Print the state stack on the debug stream.
   void
-  ]b4_parser_class[::yystack_print_ ()
+  ]b4_parser_class[::yy_stack_print_ () const
   {
     *yycdebug_ << "Stack now";
     for (stack_type::const_iterator
@@ -1438,9 +1609,8 @@
     *yycdebug_ << '\n';
   }
 
-  // Report on the debug stream that the rule \a yyrule is going to be reduced.
   void
-  ]b4_parser_class[::yy_reduce_print_ (int yyrule)
+  ]b4_parser_class[::yy_reduce_print_ (int yyrule) const
   {
     int yylno = yyrline_[yyrule];
     int yynrhs = yyr2_[yyrule];
diff --git a/data/skeletons/lalr1.d b/data/skeletons/lalr1.d
index 5aa2fb6..9730377 100644
--- a/data/skeletons/lalr1.d
+++ b/data/skeletons/lalr1.d
@@ -1,6 +1,6 @@
 # D skeleton for Bison -*- autoconf -*-
 
-# Copyright (C) 2007-2012, 2019 Free Software Foundation, Inc.
+# Copyright (C) 2007-2012, 2019-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,15 +13,56 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 m4_include(b4_skeletonsdir/[d.m4])
 
+b4_header_if([b4_complain([%header/%defines does not make sense in D])])
 
+# parse.lac
+b4_percent_define_default([[parse.lac]], [[none]])
+b4_percent_define_check_values([[[[parse.lac]], [[full]], [[none]]]])
+b4_define_flag_if([lac])
+m4_define([b4_lac_flag],
+          [m4_if(b4_percent_define_get([[parse.lac]]),
+                 [none], [[0]], [[1]])])
+
+
+## --------------- ##
+## api.push-pull.  ##
+## --------------- ##
+
+b4_percent_define_default([[api.push-pull]], [[pull]])
+b4_percent_define_check_values([[[[api.push-pull]],
+                                 [[pull]], [[push]], [[both]]]])
+
+# Define m4 conditional macros that encode the value
+# of the api.push-pull flag.
+b4_define_flag_if([pull]) m4_define([b4_pull_flag], [[1]])
+b4_define_flag_if([push]) m4_define([b4_push_flag], [[1]])
+m4_case(b4_percent_define_get([[api.push-pull]]),
+        [pull], [m4_define([b4_push_flag], [[0]])],
+        [push], [m4_define([b4_pull_flag], [[0]])])
+
+# Define a macro to be true when api.push-pull has the value "both".
+m4_define([b4_both_if],[b4_push_if([b4_pull_if([$1],[$2])],[$2])])
+
+# Handle BISON_USE_PUSH_FOR_PULL for the test suite.  So that push parsing
+# tests function as written, do not let BISON_USE_PUSH_FOR_PULL modify the
+# behavior of Bison at all when push parsing is already requested.
+b4_define_flag_if([use_push_for_pull])
+b4_use_push_for_pull_if([
+  b4_push_if([m4_define([b4_use_push_for_pull_flag], [[0]])],
+             [m4_define([b4_push_flag], [[1]])])])
+
+
+# Define a macro to encapsulate the parse state variables.  This
+# allows them to be defined either in parse() when doing pull parsing,
+# or as class instance variable when doing push parsing.
 b4_output_begin([b4_parser_file_name])
 b4_copyright([Skeleton implementation for Bison LALR(1) parsers in D],
-             [2007-2012, 2019])[
-
+             [2007-2012, 2019-2021])[
+]b4_disclaimer[
 ]b4_percent_define_ifdef([package], [module b4_percent_define_get([package]);
 ])[
 version(D_Version2) {
@@ -33,6 +74,29 @@
 ]b4_user_post_prologue[
 ]b4_percent_code_get([[imports]])[
 import std.format;
+import std.conv;
+
+/**
+ * Handle error message internationalisation.
+ */
+static if (!is(typeof(YY_))) {
+  version(YYENABLE_NLS)
+  {
+    version(ENABLE_NLS)
+    {
+      extern(C) char* dgettext(const char*, const char*);
+      string YY_(const char* s)
+      {
+        return to!string(dgettext("bison-runtime", s));
+      }
+    }
+  }
+  static if (!is(typeof(YY_)))
+  {
+    pragma(inline, true)
+    string YY_(string msg) { return msg; }
+  }
+}
 
 /**
  * A Bison parser, automatically generated from <tt>]m4_bpatsubst(b4_file_name, [^"\(.*\)"$], [\1])[</tt>.
@@ -46,29 +110,13 @@
  * parser <tt>]b4_parser_class[</tt>.
  */
 public interface Lexer
-{]b4_locations_if([[
-  /**
-   * Method to retrieve the beginning position of the last scanned token.
-   * @@return the position at which the last scanned token starts.  */
-  @@property ]b4_position_type[ startPos ();
-
-  /**
-   * Method to retrieve the ending position of the last scanned token.
-   * @@return the first position beyond the last scanned token.  */
-  @@property ]b4_position_type[ endPos ();
-
-]])[
-  /**
-   * Method to retrieve the semantic value of the last scanned token.
-   * @@return the semantic value of the last scanned token.  */
-  @@property ]b4_yystype[ semanticVal ();
-
+{
   /**
    * Entry point for the scanner.  Returns the token identifier corresponding
    * to the next token and prepares to return the semantic value
    * ]b4_locations_if([and beginning/ending positions ])[of the token.
    * @@return the token identifier corresponding to the next token. */
-  int yylex ();
+  Symbol yylex ();
 
   /**
    * Entry point for error reporting.  Emits an error
@@ -77,16 +125,26 @@
    * @@param loc The location of the element to which the
    *                error message is related]])[
    * @@param s The string for the error message.  */
-   void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[string s);
+   void yyerror (]b4_locations_if([[const Location loc, ]])[string s);
+]b4_parse_error_bmatch([custom], [[
+  /**
+   * Build and emit a "syntax error" message in a user-defined way.
+   *
+   * @@param ctx  The context of the error.
+   */
+  void reportSyntaxError(]b4_parser_class[.Context ctx);
+]])[
 }
 
+]b4_public_types_declare[
+
 ]b4_locations_if([b4_position_type_if([[
 static assert(__traits(compiles,
-              (new ]b4_position_type[[1])[0]=(new ]b4_position_type[[1])[0]),
-              "struct/class ]b4_position_type[ must be default-constructible "
+              (new Position[1])[0]=(new Position[1])[0]),
+              "struct/class Position must be default-constructible "
               "and assignable");
-static assert(__traits(compiles, (new string[1])[0]=(new ]b4_position_type[).toString()),
-              "error: struct/class ]b4_position_type[ must have toString method");
+static assert(__traits(compiles, (new string[1])[0]=(new Position).toString()),
+              "error: struct/class Position must have toString method");
 ]], [[
   /**
    * A struct denoting a point in the input.*/
@@ -109,59 +167,65 @@
   }
 }
 ]])b4_location_type_if([[
-static assert(__traits(compiles, (new ]b4_location_type[((new ]b4_position_type[[1])[0]))) &&
-              __traits(compiles, (new ]b4_location_type[((new ]b4_position_type[[1])[0], (new ]b4_position_type[[1])[0]))),
-              "error: struct/class ]b4_location_type[ must have "
-              "default constructor and constructors this(]b4_position_type[) and this(]b4_position_type[, ]b4_position_type[).");
-static assert(__traits(compiles, (new ]b4_location_type[[1])[0].begin=(new ]b4_location_type[[1])[0].begin) &&
-              __traits(compiles, (new ]b4_location_type[[1])[0].begin=(new ]b4_location_type[[1])[0].end) &&
-              __traits(compiles, (new ]b4_location_type[[1])[0].end=(new ]b4_location_type[[1])[0].begin) &&
-              __traits(compiles, (new ]b4_location_type[[1])[0].end=(new ]b4_location_type[[1])[0].end),
-              "error: struct/class ]b4_location_type[ must have assignment-compatible "
+static assert(__traits(compiles, (new Location((new Position[1])[0]))) &&
+              __traits(compiles, (new Location((new Position[1])[0], (new Position[1])[0]))),
+              "error: struct/class Location must have "
+              "default constructor and constructors this(Position) and this(Position, Position).");
+static assert(__traits(compiles, (new Location[1])[0].begin=(new Location[1])[0].begin) &&
+              __traits(compiles, (new Location[1])[0].begin=(new Location[1])[0].end) &&
+              __traits(compiles, (new Location[1])[0].end=(new Location[1])[0].begin) &&
+              __traits(compiles, (new Location[1])[0].end=(new Location[1])[0].end),
+              "error: struct/class Location must have assignment-compatible "
               "members/properties 'begin' and 'end'.");
-static assert(__traits(compiles, (new string[1])[0]=(new ]b4_location_type[[1])[0].toString()),
-              "error: struct/class ]b4_location_type[ must have toString method.");
+static assert(__traits(compiles, (new string[1])[0]=(new Location[1])[0].toString()),
+              "error: struct/class Location must have toString method.");
 
-private immutable bool yy_location_is_class = !__traits(compiles, *(new ]b4_location_type[((new ]b4_position_type[[1])[0])));]], [[
+private immutable bool yy_location_is_class = !__traits(compiles, *(new Location((new Position[1])[0])));]], [[
 /**
- * A class defining a pair of positions.  Positions, defined by the
- * <code>]b4_position_type[</code> class, denote a point in the input.
+ * A struct defining a pair of positions.  Positions, defined by the
+ * <code>Position</code> struct, denote a point in the input.
  * Locations represent a part of the input through the beginning
  * and ending positions.  */
-public class ]b4_location_type[
+public struct ]b4_location_type[
 {
   /** The first, inclusive, position in the range.  */
-  public ]b4_position_type[ begin;
+  public Position begin;
 
   /** The first position beyond the range.  */
-  public ]b4_position_type[ end;
+  public Position end;
 
   /**
-   * Create a <code>]b4_location_type[</code> denoting an empty range located at
+   * Create a <code>Location</code> denoting an empty range located at
    * a given point.
    * @@param loc The position at which the range is anchored.  */
-  public this (]b4_position_type[ loc) {
+  public this(Position loc)
+  {
     this.begin = this.end = loc;
   }
 
-  public this () {
-  }
-
   /**
-   * Create a <code>]b4_location_type[</code> from the endpoints of the range.
+   * Create a <code>Location</code> from the endpoints of the range.
    * @@param begin The first position included in the range.
    * @@param end   The first position beyond the range.  */
-  public this (]b4_position_type[ begin, ]b4_position_type[ end)
+  public this(Position begin, Position end)
   {
     this.begin = begin;
     this.end = end;
   }
 
   /**
-   * A representation of the location. For this to be correct,
-   * <code>]b4_position_type[</code> should override the <code>toString</code>
-   * method.  */
-  public override string toString () const {
+   * Reset initial location to final location.
+   */
+  public void step()
+  {
+    this.begin = this.end;
+  }
+
+  /**
+   * A representation of the location.
+   */
+  public string toString() const
+  {
     auto end_col = 0 < end.column ? end.column - 1 : 0;
     auto res = begin.toString ();
     if (end.filename && begin.filename != end.filename)
@@ -174,32 +238,34 @@
   }
 }
 
-private immutable bool yy_location_is_class = true;
+private immutable bool yy_location_is_class = false;
 
-]])])m4_ifdef([b4_user_union_members], [private union YYSemanticType
+]])])[]b4_value_type_setup[]m4_ifdef([b4_user_union_members], [private union YYSemanticType
 {
 b4_user_union_members
 };],
 [m4_if(b4_tag_seen_flag, 0,
 [[private alias int YYSemanticType;]])])[
-]b4_token_enums(b4_tokens)[
+]b4_token_enums[
 ]b4_parser_class_declaration[
 {
   ]b4_identification[
 
+]b4_declare_symbol_enum[
+
 ]b4_locations_if([[
-  private final ]b4_location_type[ yylloc_from_stack (ref YYStack rhs, int n)
+  private final Location yylloc_from_stack (ref YYStack rhs, int n)
   {
     static if (yy_location_is_class) {
       if (n > 0)
-        return new ]b4_location_type[ (rhs.locationAt (n-1).begin, rhs.locationAt (0).end);
+        return new Location (rhs.locationAt (n-1).begin, rhs.locationAt (0).end);
       else
-        return new ]b4_location_type[ (rhs.locationAt (0).end);
+        return new Location (rhs.locationAt (0).end);
     } else {
       if (n > 0)
-        return ]b4_location_type[ (rhs.locationAt (n-1).begin, rhs.locationAt (0).end);
+        return Location (rhs.locationAt (n-1).begin, rhs.locationAt (0).end);
       else
-        return ]b4_location_type[ (rhs.locationAt (0).end);
+        return Location (rhs.locationAt (0).end);
     }
   }]])[
 
@@ -217,6 +283,9 @@
    * Instantiate the Bison-generated parser.
    */
   public this] (b4_parse_param_decl([b4_lex_param_decl])[) {
+]b4_percent_code_get([[init]])[]b4_lac_if([[
+    this.yylacStack = new int[];
+    this.yylacEstablished = false;]])[
     this (new YYLexer(]b4_lex_param_call[));
   }
 ]])[
@@ -231,6 +300,7 @@
 ]b4_parse_param_cons[
   }
 ]b4_parse_trace_if([[
+  import std.stdio;
   private File yyDebugStream;
 
   /**
@@ -262,18 +332,29 @@
 
   protected final void yycdebug (string s) {
     if (0 < yydebug)
+      yyDebugStream.write (s);
+  }
+
+  protected final void yycdebugln (string s) {
+    if (0 < yydebug)
       yyDebugStream.writeln (s);
   }
 ]])[
-  private final int yylex () {
+  private final ]b4_parser_class[.Symbol yylex () {
     return yylexer.yylex ();
   }
 
-  protected final void yyerror (]b4_locations_if(ref [b4_location_type[ loc, ]])[string s) {
+  protected final void yyerror (]b4_locations_if([[const Location loc, ]])[string s) {
     yylexer.yyerror (]b4_locations_if([loc, ])[s);
   }
 
   /**
+   * The number of syntax errors so far.
+   */
+  public int numberOfErrors() const { return yynerrs_; }
+  private int yynerrs_ = 0;
+
+  /**
    * Returned by a Bison action in order to stop the parsing process and
    * return success (<tt>true</tt>).  */
   public static immutable int YYACCEPT = 0;
@@ -282,6 +363,11 @@
    * Returned by a Bison action in order to stop the parsing process and
    * return failure (<tt>false</tt>).  */
   public static immutable int YYABORT = 1;
+]b4_push_if([
+  /**
+   * Returned by a Bison action in order to request a new token.
+   */
+  public static immutable int YYPUSH_MORE = 4;])[
 
   /**
    * Returned by a Bison action in order to start error recovery without
@@ -296,10 +382,43 @@
   private static immutable int YYREDUCE = 6;
   private static immutable int YYERRLAB1 = 7;
   private static immutable int YYRETURN = 8;
+]b4_push_if([[  private static immutable int YYGETTOKEN = 9; /* Signify that a new token is expected when doing push-parsing.  */]])[
+
 ]b4_locations_if([
   private static immutable YYSemanticType yy_semantic_null;])[
   private int yyerrstatus_ = 0;
 
+  private void yyerrok()
+  {
+    yyerrstatus_ = 0;
+  }
+
+  // Lookahead symbol kind.
+  SymbolKind yytoken = ]b4_symbol(empty, kind)[;
+
+  /* State.  */
+  int yyn = 0;
+  int yylen = 0;
+  int yystate = 0;
+
+  YYStack yystack;
+
+  int label = YYNEWSTATE;
+
+  /* Error handling.  */
+]b4_locations_if([[
+  /// The location where the error started.
+  Location yyerrloc;
+
+  /// Location of the lookahead.
+  Location yylloc;
+
+  /// @@$.
+  Location yyloc;]])[
+
+  /// Semantic value of the lookahead.
+  Value yylval;
+
   /**
    * Whether error recovery is being done.  In this state, the parser
    * reads token until it reaches a known state, and then restarts normal
@@ -309,10 +428,22 @@
     return yyerrstatus_ == 0;
   }
 
+  /** Compute post-reduction state.
+   * @@param yystate   the current state
+   * @@param yysym     the nonterminal to push on the stack
+   */
+  private int yyLRGotoState(int yystate, int yysym) {
+    int yyr = yypgoto_[yysym - yyntokens_] + yystate;
+    if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
+      return yytable_[yyr];
+    else
+      return yydefgoto_[yysym - yyntokens_];
+  }
+
   private int yyaction (int yyn, ref YYStack yystack, int yylen)
   {
-    ]b4_yystype[ yyval;]b4_locations_if([[
-    ]b4_location_type[ yyloc = yylloc_from_stack (yystack, yylen);]])[
+    Value yyval;]b4_locations_if([[
+    Location yyloc = yylloc_from_stack (yystack, yylen);]])[
 
     /* If YYLEN is nonzero, implement the default value of the action:
        `$$ = $1'.  Otherwise, use the top of the stack.
@@ -335,82 +466,47 @@
     }
 
 ]b4_parse_trace_if([[
-    yy_symbol_print ("-> $$ =", yyr1_[yyn], yyval]b4_locations_if([, yyloc])[);]])[
+    yy_symbol_print ("-> $$ =", to!SymbolKind (yyr1_[yyn]), yyval]b4_locations_if([, yyloc])[);]])[
 
     yystack.pop (yylen);
     yylen = 0;
 
     /* Shift the result of the reduction.  */
-    yyn = yyr1_[yyn];
-    int yystate = yypgoto_[yyn - yyntokens_] + yystack.stateAt (0);
-    if (0 <= yystate && yystate <= yylast_
-        && yycheck_[yystate] == yystack.stateAt (0))
-      yystate = yytable_[yystate];
-    else
-      yystate = yydefgoto_[yyn - yyntokens_];
-
+    int yystate = yyLRGotoState(yystack.stateAt(0), yyr1_[yyn]);
     yystack.push (yystate, yyval]b4_locations_if([, yyloc])[);
     return YYNEWSTATE;
   }
 
-  /* Return YYSTR after stripping away unnecessary quotes and
-     backslashes, so that it's suitable for yyerror.  The heuristic is
-     that double-quoting is unnecessary unless the string contains an
-     apostrophe, a comma, or backslash (other than backslash-backslash).
-     YYSTR is taken from yytname.  */
-  private final string yytnamerr_ (string yystr)
-  {
-    if (yystr[0] == '"')
-      {
-        string yyr;
-      strip_quotes:
-        for (int i = 1; i < yystr.length; i++)
-          switch (yystr[i])
-            {
-            case '\'':
-            case ',':
-              break strip_quotes;
-
-            case '\\':
-              if (yystr[++i] != '\\')
-                break strip_quotes;
-              goto default;
-            default:
-              yyr ~= yystr[i];
-              break;
-
-            case '"':
-              return yyr;
-            }
-      }
-    else if (yystr == "$end")
-      return "end of input";
-
-    return yystr;
-  }
 ]b4_parse_trace_if([[
   /*--------------------------------.
   | Print this symbol on YYOUTPUT.  |
   `--------------------------------*/
 
-  private final void yy_symbol_print (string s, int yytype,
-    ref ]b4_yystype[ yyvaluep]dnl
-b4_locations_if([, ref ]b4_location_type[ yylocationp])[)
+  private final void yy_symbol_print (string s, SymbolKind yykind,
+    ref Value yyval]b4_locations_if([, ref Location yyloc])[)
   {
     if (0 < yydebug)
     {
-      string message = s ~ (yytype < yyntokens_ ? " token " : " nterm ")
-              ~ yytname_[yytype] ~ " ("]b4_locations_if([
-              ~ yylocationp.toString() ~ ": "])[;
-      static if (__traits(compiles, message ~= yyvaluep.toString ()))
-              message ~= yyvaluep.toString ();
-      else
-              message ~= format ("%s", &yyvaluep);
-      message ~= ")";
-      yycdebug (message);
+      File yyo = yyDebugStream;
+      yyo.write(s);
+      yyo.write(yykind < yyntokens_ ? " token " : " nterm ");
+      yyo.write(format("%s", yykind));
+      yyo.write(" ("]b4_locations_if([ ~ yyloc.toString() ~ ": "])[);
+      ]b4_symbol_actions([printer])[
+      yyo.write(")\n");
     }
   }
 ]])[
+]b4_symbol_type_define[
+]b4_push_if([[
+  /**
+   * Push Parse input from external lexer
+   *
+   * @@param yyla current Symbol
+   *
+   * @@return <tt>YYACCEPT, YYABORT, YYPUSH_MORE</tt>
+   */
+  public int pushParse(Symbol yyla)]], [[
   /**
    * Parse input from the scanner that was specified at object construction
    * time.  Return whether the end of the input was reached successfully.
@@ -418,36 +514,23 @@
    * @@return <tt>true</tt> if the parsing succeeds.  Note that this does not
    *          imply that there were no syntax errors.
    */
-  public bool parse ()
-  {
-    /// Lookahead and lookahead in internal form.
-    int yychar = yyempty_;
-    int yytoken = 0;
+  public bool parse()]])[
+  {]b4_push_if([[
+    if (!this.pushParseInitialized)
+    {
+      pushParseInitialize();
+      yyerrstatus_ = 0;
+    }
+    else
+      label = YYGETTOKEN;
 
-    /* State.  */
-    int yyn = 0;
-    int yylen = 0;
-    int yystate = 0;
+    bool push_token_consumed = true;
+]], [[  bool yyresult;]b4_lac_if([[
+    // Discard the LAC context in case there still is one left from a
+    // previous invocation.
+    yylacDiscard("init");]])[]b4_parse_trace_if([[
 
-    YYStack yystack;
-
-    /* Error handling.  */
-    int yynerrs_ = 0;]b4_locations_if([[
-    /// The location where the error started.
-    ]b4_location_type[ yyerrloc = null;
-
-    /// ]b4_location_type[ of the lookahead.
-    ]b4_location_type[ yylloc;
-
-    /// @@$.
-    ]b4_location_type[ yyloc;]])[
-
-    /// Semantic value of the lookahead.
-    ]b4_yystype[ yylval;
-
-    int yyresult;]b4_parse_trace_if([[
-
-    yycdebug ("Starting parse\n");]])[
+    yycdebugln ("Starting parse");]])[
     yyerrstatus_ = 0;
 
 ]m4_ifdef([b4_initial_action], [
@@ -461,81 +544,107 @@
   [  /* Initialize the stack.  */
     yystack.push (yystate, yylval]b4_locations_if([, yylloc])[);
 
-    int label = YYNEWSTATE;
+    label = YYNEWSTATE;]])[
     for (;;)
       final switch (label)
       {
         /* New state.  Unlike in the C/C++ skeletons, the state is already
            pushed when we come here.  */
       case YYNEWSTATE:]b4_parse_trace_if([[
-        yycdebug (format("Entering state %d\n", yystate));
+        yycdebugln (format("Entering state %d", yystate));
         if (0 < yydebug)
           yystack.print (yyDebugStream);]])[
 
         /* Accept?  */
-        if (yystate == yyfinal_)
-          return true;
+        if (yystate == yyfinal_)]b4_push_if([[
+        {
+          label = YYACCEPT;
+          break;
+        }]], [[
+          return true;]])[
 
         /* Take a decision.  First try without lookahead.  */
         yyn = yypact_[yystate];
-        if (yy_pact_value_is_default_ (yyn))
+        if (yyPactValueIsDefault(yyn))
         {
           label = YYDEFAULT;
           break;
-        }
+        }]b4_push_if([[
+        goto case;
+
+        case YYGETTOKEN:]])[
 
         /* Read a lookahead token.  */
-        if (yychar == yyempty_)
-        {]b4_parse_trace_if([[
-          yycdebug ("Reading a token: ");]])[
-          yychar = yylex ();]b4_locations_if([[
-          static if (yy_location_is_class) {
-            yylloc = new ]b4_location_type[(yylexer.startPos, yylexer.endPos);
-          } else {
-            yylloc = ]b4_location_type[(yylexer.startPos, yylexer.endPos);
-          }]])
-          yylval = yylexer.semanticVal;[
+        if (yytoken == ]b4_symbol(empty, kind)[)
+        {]b4_push_if([[
+          if (!push_token_consumed)
+            return YYPUSH_MORE;]])[]b4_parse_trace_if([[
+          yycdebugln ("Reading a token");]])[]b4_push_if([[
+          yytoken = yyla.token;
+          yylval = yyla.value;]b4_locations_if([[
+          yylloc = yyla.location;]])[
+          push_token_consumed = false;]], [[
+          Symbol yysymbol = yylex();
+          yytoken = yysymbol.token();
+          yylval = yysymbol.value();]b4_locations_if([[
+          yylloc = yysymbol.location();]])[]])[
         }
 
-        /* Convert token to internal form.  */
-        yytoken = yytranslate_ (yychar);]b4_parse_trace_if([[
-        yy_symbol_print ("Next token is",
-                         yytoken, yylval]b4_locations_if([, yylloc])[);]])[
+        /* Token already converted to internal form.  */]b4_parse_trace_if([[
+        yy_symbol_print ("Next token is", yytoken, yylval]b4_locations_if([, yylloc])[);]])[
 
-        /* If the proper action on seeing token YYTOKEN is to reduce or to
-           detect an error, take that action.  */
-        yyn += yytoken;
-        if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken)
-          label = YYDEFAULT;
-
-        /* <= 0 means reduce or error.  */
-        else if ((yyn = yytable_[yyn]) <= 0)
+        if (yytoken == ]b4_symbol(error, kind)[)
         {
-          if (yy_table_value_is_error_ (yyn))
-            label = YYERRLAB;
-          else
-          {
-            yyn = -yyn;
-            label = YYREDUCE;
-          }
+          // The scanner already issued an error message, process directly
+          // to error recovery.  But do not keep the error token as
+          // lookahead, it is too special and may lead us to an endless
+          // loop in error recovery. */
+          yytoken = ]b4_symbol(undef, kind)[;]b4_locations_if([[
+          yyerrloc = yylloc;]])[
+          label = YYERRLAB1;
         }
         else
         {
-          /* Shift the lookahead token.  */]b4_parse_trace_if([[
-          yy_symbol_print ("Shifting", yytoken,
-                            yylval]b4_locations_if([, yylloc])[);]])[
+          /* If the proper action on seeing token YYTOKEN is to reduce or to
+             detect an error, take that action.  */
+          yyn += yytoken;
+          if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken) {]b4_lac_if([[
+            if (!yylacEstablish(yystack, yytoken))
+              label = YYERRLAB;
+            else]])[
+              label = YYDEFAULT;
+          }
+          /* <= 0 means reduce or error.  */
+          else if ((yyn = yytable_[yyn]) <= 0)
+          {
+            if (yyTableValueIsError(yyn))
+              label = YYERRLAB;]b4_lac_if([[
+            else if (!yylacEstablish(yystack, yytoken))
+              label = YYERRLAB;]])[
+            else
+            {
+              yyn = -yyn;
+              label = YYREDUCE;
+            }
+          }
+          else
+          {
+            /* Shift the lookahead token.  */]b4_parse_trace_if([[
+            yy_symbol_print ("Shifting", yytoken, yylval]b4_locations_if([, yylloc])[);]])[
 
-          /* Discard the token being shifted.  */
-          yychar = yyempty_;
+            /* Discard the token being shifted.  */
+            yytoken = ]b4_symbol(empty, kind)[;
 
-          /* Count tokens shifted since error; after three, turn off error
-           * status.  */
-          if (yyerrstatus_ > 0)
-            --yyerrstatus_;
+            /* Count tokens shifted since error; after three, turn off error
+             * status.  */
+            if (yyerrstatus_ > 0)
+              --yyerrstatus_;
 
-          yystate = yyn;
-          yystack.push (yystate, yylval]b4_locations_if([, yylloc])[);
-          label = YYNEWSTATE;
+            yystate = yyn;
+            yystack.push (yystate, yylval]b4_locations_if([, yylloc])[);]b4_lac_if([[
+            yylacDiscard("shift");]])[
+            label = YYNEWSTATE;
+          }
         }
         break;
 
@@ -559,33 +668,32 @@
         yystate = yystack.stateAt (0);
         break;
 
-      /*------------------------------------.
-      | yyerrlab -- here on detecting error |
-      `------------------------------------*/
+      /*--------------------------------------.
+      | yyerrlab -- here on detecting error.  |
+      `--------------------------------------*/
       case YYERRLAB:
         /* If not already recovering from an error, report this error.  */
         if (yyerrstatus_ == 0)
         {
           ++yynerrs_;
-          if (yychar == yyempty_)
-            yytoken = yyempty_;
-          yyerror (]b4_locations_if([yylloc, ])[yysyntax_error (yystate, yytoken));
+          yyreportSyntaxError(new Context(]b4_lac_if([[this, ]])[yystack, yytoken]b4_locations_if([[, yylloc]])[));
         }
-
-]b4_locations_if([        yyerrloc = yylloc;])[
+]b4_locations_if([
+        yyerrloc = yylloc;])[
         if (yyerrstatus_ == 3)
         {
           /* If just tried and failed to reuse lookahead token after an
            * error, discard it.  */
 
-          if (yychar <= YYTokenType.EOF)
+          /* Return failure if at end of input.  */
+          if (yytoken == ]b4_symbol(eof, [kind])[)]b4_push_if([[
           {
-            /* Return failure if at end of input.  */
-            if (yychar == YYTokenType.EOF)
-             return false;
-          }
+            label = YYABORT;
+            break;
+          }]], [[
+          return false;]])[
           else
-            yychar = yyempty_;
+            yytoken = ]b4_symbol(empty, kind)[;
         }
 
         /* Else will try to reuse lookahead token after shifting the error
@@ -612,13 +720,14 @@
       case YYERRLAB1:
         yyerrstatus_ = 3;       /* Each real token shifted decrements this.  */
 
+        // Pop stack until we find a state that shifts the error token.
         for (;;)
         {
           yyn = yypact_[yystate];
-          if (!yy_pact_value_is_default_ (yyn))
+          if (!yyPactValueIsDefault(yyn))
           {
-            yyn += yy_error_token_;
-            if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yy_error_token_)
+            yyn += ]b4_symbol(error, kind)[;
+            if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == ]b4_symbol(error, kind)[)
             {
               yyn = yytable_[yyn];
               if (0 < yyn)
@@ -627,16 +736,23 @@
           }
 
           /* Pop the current state because it cannot handle the error token.  */
-          if (yystack.height == 1)
-            return false;
+          if (yystack.height == 1)]b4_push_if([[
+          {
+            label = YYABORT;
+            break;
+          }]],[[
+            return false;]])[
 
 ]b4_locations_if([          yyerrloc = yystack.locationAt (0);])[
           yystack.pop ();
           yystate = yystack.stateAt (0);]b4_parse_trace_if([[
           if (0 < yydebug)
             yystack.print (yyDebugStream);]])[
-        }
-
+        }]b4_push_if([[
+        if (label == YYABORT)
+          /* Leave the switch.  */
+          break;
+]])[
 ]b4_locations_if([
         /* Muck with the stack to setup for yylloc.  */
         yystack.push (0, yy_semantic_null, yylloc);
@@ -644,34 +760,145 @@
         yyloc = yylloc_from_stack (yystack, 2);
         yystack.pop (2);])[
 
-        /* Shift the error token.  */]b4_parse_trace_if([[
-        yy_symbol_print ("Shifting", yystos_[yyn],
-        yylval]b4_locations_if([, yyloc])[);]])[
-
+        /* Shift the error token.  */]b4_lac_if([[
+        yylacDiscard("error recovery");]])[]b4_parse_trace_if([[
+        yy_symbol_print ("Shifting", to!SymbolKind (yystos_[yyn]), yylval]b4_locations_if([, yyloc])[);]])[
         yystate = yyn;
         yystack.push (yyn, yylval]b4_locations_if([, yyloc])[);
         label = YYNEWSTATE;
         break;
 
       /* Accept.  */
-      case YYACCEPT:
-        return true;
+      case YYACCEPT:]b4_push_if([[
+        this.pushParseInitialized = false;]b4_parse_trace_if([[
+        if (0 < yydebug)
+          yystack.print (yyDebugStream);]])[
+        return YYACCEPT;]], [[
+        yyresult = true;
+        label = YYRETURN;
+        break;]])[
 
       /* Abort.  */
-      case YYABORT:
-        return false;
+      case YYABORT:]b4_push_if([[
+        this.pushParseInitialized = false;]b4_parse_trace_if([[
+        if (0 < yydebug)
+          yystack.print (yyDebugStream);]])[
+        return YYABORT;]], [[
+        yyresult = false;
+        label = YYRETURN;
+        break;]])[
+]b4_push_if([[]], [[      ][case YYRETURN:]b4_parse_trace_if([[
+        if (0 < yydebug)
+          yystack.print (yyDebugStream);]])[
+        return yyresult;]])[
     }
+    assert(0);
   }
 
+]b4_push_if([[
+  bool pushParseInitialized = false;
+
+  /**
+   * (Re-)Initialize the state of the push parser.
+   */
+  public void pushParseInitialize()
+  {
+
+    /* Lookahead and lookahead in internal form.  */
+    this.yytoken = ]b4_symbol(empty, kind)[;
+
+    /* State.  */
+    this.yyn = 0;
+    this.yylen = 0;
+    this.yystate = 0;
+    destroy(this.yystack);
+    this.label = YYNEWSTATE;
+]b4_lac_if([[
+    destroy(this.yylacStack);
+    this.yylacEstablished = false;]])[
+
+    /* Error handling.  */
+    this.yynerrs_ = 0;
+]b4_locations_if([
+    /* The location where the error started.  */
+    this.yyerrloc = Location(Position(), Position());
+    this.yylloc = Location(Position(), Position());])[
+
+    /* Semantic value of the lookahead.  */
+    //destroy(this.yylval);
+
+    /* Initialize the stack.  */
+    yystack.push(this.yystate, this.yylval]b4_locations_if([, this.yylloc])[);
+
+    this.pushParseInitialized = true;
+  }]])[]b4_both_if([[
+  /**
+   * Parse input from the scanner that was specified at object construction
+   * time.  Return whether the end of the input was reached successfully.
+   * This version of parse() is defined only when api.push-push=both.
+   *
+   * @@return <tt>true</tt> if the parsing succeeds.  Note that this does not
+   *          imply that there were no syntax errors.
+   */
+  bool parse()
+  {
+    int status = 0;
+    do {
+      status = this.pushParse(yylex());
+    } while (status == YYPUSH_MORE);
+    return status == YYACCEPT;
+  }]])[
+
   // Generate an error message.
-  private final string yysyntax_error (int yystate, int tok)
-  {]b4_error_verbose_if([[
+  private final void yyreportSyntaxError(Context yyctx)
+  {]b4_parse_error_bmatch(
+[custom], [[
+    yylexer.reportSyntaxError(yyctx);]],
+[detailed], [[
+    if (yyctx.getToken() != ]b4_symbol(empty, kind)[)
+    {
+      // FIXME: This method of building the message is not compatible
+      // with internationalization.
+      immutable int argmax = 5;
+      SymbolKind[] yyarg = new SymbolKind[argmax];
+      int yycount = yysyntaxErrorArguments(yyctx, yyarg, argmax);
+      string res, yyformat;
+      switch (yycount)
+      {
+        case  1:
+          yyformat = YY_("syntax error, unexpected %s");
+          res = format(yyformat, yyarg[0]);
+         break;
+        case  2:
+          yyformat = YY_("syntax error, unexpected %s, expecting %s");
+          res = format(yyformat, yyarg[0], yyarg[1]);
+          break;
+        case  3:
+          yyformat = YY_("syntax error, unexpected %s, expecting %s or %s");
+          res = format(yyformat, yyarg[0], yyarg[1], yyarg[2]);
+          break;
+        case  4:
+          yyformat = YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+          res = format(yyformat, yyarg[0], yyarg[1], yyarg[2], yyarg[3]);
+          break;
+        case  5:
+          yyformat = YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+          res = format(yyformat, yyarg[0], yyarg[1], yyarg[2], yyarg[3], yyarg[4]);
+          break;
+        default:
+          res = YY_("syntax error");
+          break;
+      }
+      yyerror(]b4_locations_if([yyctx.getLocation(), ])[res);
+    }]],
+[[simple]], [[
+    yyerror(]b4_locations_if([yyctx.getLocation(), ])[YY_("syntax error"));]])[
+  }
+
+]b4_parse_error_bmatch(
+[detailed], [[
+  private int yysyntaxErrorArguments(Context yyctx, SymbolKind[] yyarg, int yyargn) {
     /* There are many possibilities here to consider:
-       - Assume YYFAIL is not used.  It's too flawed to consider.
-         See
-         <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
-         for details.  YYERROR is fine as it does not invoke this
-         function.
        - If this state is a consistent state with a default action,
          then the only way this function was invoked is if the
          default action is an error action.  In that case, don't
@@ -696,15 +923,85 @@
          list is correct for canonical LR with one exception: it
          will still contain any token that will not be accepted due
          to an error action in a later state.
-      */
-    if (tok != yyempty_)
+    */
+    int yycount = 0;
+    if (yyctx.getToken() != ]b4_symbol(empty, kind)[)
+      {
+        if (yyarg !is null)
+          yyarg[yycount] = yyctx.getToken();
+        yycount += 1;
+        yycount += yyctx.getExpectedTokens(yyarg, 1, yyargn);
+      }
+    return yycount;
+  }
+]])[
+
+
+  /**
+   * Information needed to get the list of expected tokens and to forge
+   * a syntax error diagnostic.
+   */
+  public static final class Context
+  {]b4_lac_if([[
+    private ]b4_parser_class[ yyparser;]])[
+    private const(YYStack) yystack;
+    private SymbolKind yytoken;]b4_locations_if([[
+    private const(Location) yylocation;]])[
+
+    this(]b4_lac_if([[]b4_parser_class[ parser, ]])[YYStack stack, SymbolKind kind]b4_locations_if([[, Location loc]])[)
+    {]b4_lac_if([[
+        yyparser = parser;]])[
+      yystack = stack;
+      yytoken = kind;]b4_locations_if([[
+      yylocation = loc;]])[
+    }
+
+    final SymbolKind getToken() const
     {
-      // FIXME: This method of building the message is not compatible
-      // with internationalization.
-      string res = "syntax error, unexpected ";
-      res ~= yytnamerr_ (yytname_[tok]);
-      int yyn = yypact_[yystate];
-      if (!yy_pact_value_is_default_ (yyn))
+      return yytoken;
+    }]b4_locations_if([[
+
+    final const(Location) getLocation() const
+    {
+      return yylocation;
+    }]])[
+    /**
+     * Put in YYARG at most YYARGN of the expected tokens given the
+     * current YYCTX, and return the number of tokens stored in YYARG.  If
+     * YYARG is null, return the number of expected tokens (guaranteed to
+     * be less than YYNTOKENS).
+     */
+    int getExpectedTokens(SymbolKind[] yyarg, int yyargn)]b4_lac_if([[]], [[ const]])[
+    {
+      return getExpectedTokens(yyarg, 0, yyargn);
+    }
+
+    int getExpectedTokens(SymbolKind[] yyarg, int yyoffset, int yyargn)]b4_lac_if([[]], [[ const]])[
+    {
+      int yycount = yyoffset;]b4_lac_if([b4_parse_trace_if([[
+      // Execute LAC once. We don't care if it is successful, we
+      // only do it for the sake of debugging output.
+
+      if (!yyparser.yylacEstablished)
+        yyparser.yylacCheck(yystack, yytoken);
+]])[
+      for (int yyx = 0; yyx < yyntokens_; ++yyx)
+        {
+          SymbolKind yysym = SymbolKind(yyx);
+          if (yysym != ]b4_symbol(error, kind)[
+              && yysym != ]b4_symbol(undef, kind)[
+              && yyparser.yylacCheck(yystack, yysym))
+            {
+              if (yyarg == null)
+                yycount += 1;
+              else if (yycount == yyargn)
+                return 0;
+              else
+                yyarg[yycount++] = yysym;
+            }
+        }]], [[
+      int yyn = yypact_[this.yystack.stateAt(0)];
+      if (!yyPactValueIsDefault(yyn))
       {
         /* Start YYX at -YYN if negative to avoid negative
            indexes in YYCHECK.  In other words, skip the first
@@ -714,33 +1011,181 @@
         /* Stay within bounds of both yycheck and yytname.  */
         int yychecklim = yylast_ - yyn + 1;
         int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
-        int count = 0;
-        for (int x = yyxbegin; x < yyxend; ++x)
-          if (yycheck_[x + yyn] == x && x != yy_error_token_
-              && !yy_table_value_is_error_ (yytable_[x + yyn]))
-             ++count;
-          if (count < 5)
+        for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
+          if (yycheck_[yyx + yyn] == yyx && yyx != ]b4_symbol(error, kind)[
+              && !yyTableValueIsError(yytable_[yyx + yyn]))
           {
-             count = 0;
-             for (int x = yyxbegin; x < yyxend; ++x)
-               if (yycheck_[x + yyn] == x && x != yy_error_token_
-                   && !yy_table_value_is_error_ (yytable_[x + yyn]))
-               {
-                  res ~= count++ == 0 ? ", expecting " : " or ";
-                  res ~= yytnamerr_ (yytname_[x]);
-               }
+            if (yyarg is null)
+              ++yycount;
+            else if (yycount == yyargn)
+              return 0;
+            else
+              yyarg[yycount++] = SymbolKind(yyx);
           }
-      }
-      return res;
-    }]])[
-    return "syntax error";
+      }]])[
+      if (yyarg !is null && yycount == yyoffset && yyoffset < yyargn)
+        yyarg[yyoffset] = ]b4_symbol(empty, kind)[;
+      return yycount - yyoffset;
+    }
   }
 
+]b4_lac_if([[
+  /** Check the lookahead yytoken.
+   * \returns  true iff the token will be eventually shifted.
+   */
+  bool yylacCheck(const YYStack yystack, SymbolKind yytoken)
+  {
+    // Logically, the yylacStack's lifetime is confined to this function.
+    // Clear it, to get rid of potential left-overs from previous call.
+    destroy(yylacStack);
+    // Reduce until we encounter a shift and thereby accept the token.
+]b4_parse_trace_if([[
+    yycdebug("LAC: checking lookahead " ~ format("%s", yytoken) ~ ":");]])[
+    int lacTop = 0;
+    while (true)
+    {
+      int topState = (yylacStack.length == 0
+                      ? yystack.stateAt(lacTop)
+                      : yylacStack[$ - 1]);
+      int yyrule = yypact_[topState];
+      if (yyPactValueIsDefault(yyrule)
+          || (yyrule += yytoken) < 0 || yylast_ < yyrule
+          || yycheck_[yyrule] != yytoken)
+      {
+        // Use the default action.
+        yyrule = yydefact_[+topState];
+        if (yyrule == 0)
+        {]b4_parse_trace_if([[
+          yycdebugln(" Err");]])[
+          return false;
+        }
+      }
+      else
+      {
+        // Use the action from yytable.
+        yyrule = yytable_[yyrule];
+        if (yyTableValueIsError(yyrule))
+        {]b4_parse_trace_if([[
+          yycdebugln(" Err");]])[
+          return false;
+        }
+        if (0 < yyrule)
+        {]b4_parse_trace_if([[
+          yycdebugln(" S" ~ to!string(yyrule));]])[
+          return true;
+        }
+        yyrule = -yyrule;
+      }
+      // By now we know we have to simulate a reduce.
+]b4_parse_trace_if([[
+      yycdebug(" R" ~ to!string(yyrule - 1));]])[
+      // Pop the corresponding number of values from the stack.
+      {
+        int yylen = yyr2_[yyrule];
+        // First pop from the LAC stack as many tokens as possible.
+        int lacSize = cast (int) yylacStack.length;
+        if (yylen < lacSize)
+        {
+          yylacStack.length -= yylen;
+          yylen = 0;
+        }
+        else if (lacSize != 0)
+        {
+          destroy(yylacStack);
+          yylen -= lacSize;
+        }
+        // Only afterwards look at the main stack.
+        // We simulate popping elements by incrementing lacTop.
+        lacTop += yylen;
+      }
+      // Keep topState in sync with the updated stack.
+      topState = (yylacStack.length == 0
+                  ? yystack.stateAt(lacTop)
+                  : yylacStack[$ - 1]);
+      // Push the resulting state of the reduction.
+      int state = yyLRGotoState(topState, yyr1_[yyrule]);]b4_parse_trace_if([[
+      yycdebug(" G" ~ to!string(state));]])[
+      yylacStack.length++;
+      yylacStack[$ - 1] = state;
+    }
+  }
+
+  /** Establish the initial context if no initial context currently exists.
+   * \returns  true iff the token will be eventually shifted.
+   */
+  bool yylacEstablish(YYStack yystack, SymbolKind yytoken)
+  {
+  /* Establish the initial context for the current lookahead if no initial
+     context is currently established.
+
+     We define a context as a snapshot of the parser stacks.  We define
+     the initial context for a lookahead as the context in which the
+     parser initially examines that lookahead in order to select a
+     syntactic action.  Thus, if the lookahead eventually proves
+     syntactically unacceptable (possibly in a later context reached via a
+     series of reductions), the initial context can be used to determine
+     the exact set of tokens that would be syntactically acceptable in the
+     lookahead's place.  Moreover, it is the context after which any
+     further semantic actions would be erroneous because they would be
+     determined by a syntactically unacceptable token.
+
+     yylacEstablish should be invoked when a reduction is about to be
+     performed in an inconsistent state (which, for the purposes of LAC,
+     includes consistent states that don't know they're consistent because
+     their default reductions have been disabled).
+
+     For parse.lac=full, the implementation of yylacEstablish is as
+     follows.  If no initial context is currently established for the
+     current lookahead, then check if that lookahead can eventually be
+     shifted if syntactic actions continue from the current context.  */
+    if (yylacEstablished)
+      return true;
+    else
+    {]b4_parse_trace_if([[
+        yycdebugln("LAC: initial context established for " ~ format("%s", yytoken));]])[
+        yylacEstablished = true;
+        return yylacCheck(yystack, yytoken);
+    }
+  }
+
+  /** Discard any previous initial lookahead context because of event.
+   * \param event  the event which caused the lookahead to be discarded.
+   *               Only used for debbuging output.  */
+  void yylacDiscard(string event)
+  {
+  /* Discard any previous initial lookahead context because of Event,
+     which may be a lookahead change or an invalidation of the currently
+     established initial context for the current lookahead.
+
+     The most common example of a lookahead change is a shift.  An example
+     of both cases is syntax error recovery.  That is, a syntax error
+     occurs when the lookahead is syntactically erroneous for the
+     currently established initial context, so error recovery manipulates
+     the parser stacks to try to find a new initial context in which the
+     current lookahead is syntactically acceptable.  If it fails to find
+     such a context, it discards the lookahead.  */
+    if (yylacEstablished)
+    {]b4_parse_trace_if([[
+      yycdebugln("LAC: initial context discarded due to " ~ event);]])[
+      yylacEstablished = false;
+    }
+  }
+
+  /** The stack for LAC.
+   * Logically, the yylacStack's lifetime is confined to the function
+   * yylacCheck. We just store it as a member of this class to hold
+   * on to the memory and to avoid frequent reallocations.
+   */
+  int[] yylacStack;
+  /**  Whether an initial LAC context was established. */
+  bool yylacEstablished;
+]])[
+
   /**
    * Whether the given <code>yypact_</code> value indicates a defaulted state.
    * @@param yyvalue   the value to check
    */
-  private static bool yy_pact_value_is_default_ (int yyvalue)
+  private static bool yyPactValueIsDefault(int yyvalue)
   {
     return yyvalue == yypact_ninf_;
   }
@@ -749,7 +1194,7 @@
    * Whether the given <code>yytable_</code> value indicates a syntax error.
    * @@param yyvalue   the value to check
    */
-  private static bool yy_table_value_is_error_ (int yyvalue)
+  private static bool yyTableValueIsError(int yyvalue)
   {
     return yyvalue == yytable_ninf_;
   }
@@ -765,13 +1210,6 @@
 
   ]b4_parser_tables_define[
 
-  /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-     First, the terminals, then, starting at \a yyntokens_, nonterminals.  */
-  private static immutable string[] yytname_ =
-  @{
-  ]b4_tname[
-  @};
-
 ]b4_parse_trace_if([[
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
   private static immutable ]b4_int_type_for([b4_rline])[[] yyrline_ =
@@ -788,66 +1226,60 @@
     int yylno = yyrline_[yyrule];
     int yynrhs = yyr2_[yyrule];
     /* Print the symbols being reduced, and their result.  */
-    yycdebug (format("Reducing stack by rule %d (line %d), ",
-              yyrule - 1, yylno));
+    yycdebugln (format("Reducing stack by rule %d (line %d):",
+                yyrule - 1, yylno));
 
     /* The symbols being reduced.  */
     for (int yyi = 0; yyi < yynrhs; yyi++)
       yy_symbol_print (format("   $%d =", yyi + 1),
-                       yystos_[yystack.stateAt(yynrhs - (yyi + 1))],
+                       to!SymbolKind (yystos_[yystack.stateAt(yynrhs - (yyi + 1))]),
                        ]b4_rhs_value(yynrhs, yyi + 1)b4_locations_if([,
                        b4_rhs_location(yynrhs, yyi + 1)])[);
   }
 ]])[
 
-  private static token_number_type yytranslate_ (int t)
+  private static auto yytranslate_ (int t)
   {
 ]b4_api_token_raw_if(
-[[    import std.conv : to;
-    return to!byte (t);]],
+[[    return SymbolKind(t);]],
 [[    /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
-    immutable token_number_type[] translate_table =
+    immutable ]b4_int_type_for([b4_translate])[[] translate_table =
     @{
   ]b4_translate[
     @};
 
-    immutable int user_token_number_max_ = ]b4_user_token_number_max[;
-    immutable token_number_type undef_token_ = ]b4_undef_token_number[;
+    // Last valid token kind.
+    immutable int code_max = ]b4_code_max[;
 
     if (t <= 0)
-      return YYTokenType.EOF;
-    else if (t <= user_token_number_max_)
-      return translate_table[t];
+      return ]b4_symbol(eof, kind)[;
+    else if (t <= code_max)
+      return SymbolKind(translate_table[t]);
     else
-      return undef_token_;]])[
+      return ]b4_symbol(undef, kind)[;]])[
   }
 
-  alias ]b4_int_type_for([b4_translate])[ token_number_type;
-
-  private static immutable token_number_type yy_error_token_ = 1;
-
   private static immutable int yylast_ = ]b4_last[;
   private static immutable int yynnts_ = ]b4_nterms_number[;
-  private static immutable int yyempty_ = -2;
   private static immutable int yyfinal_ = ]b4_final_state_number[;
   private static immutable int yyntokens_ = ]b4_tokens_number[;
 
   private final struct YYStackElement {
     int state;
-    ]b4_yystype[ value;]b4_locations_if(
+    Value value;]b4_locations_if(
     b4_location_type[[] location;])[
   }
 
   private final struct YYStack {
     private YYStackElement[] stack = [];
 
-    public final @@property ulong height()
+    public final ulong height()
     {
       return stack.length;
     }
 
-    public final void push (int state, ]b4_yystype[ value]dnl
-  b4_locations_if([, ref ]b4_location_type[ loc])[)
+    public final void push (int state, Value value]dnl
+  b4_locations_if([, ref Location loc])[)
     {
       stack ~= YYStackElement(state, value]b4_locations_if([, loc])[);
     }
@@ -862,18 +1294,18 @@
       stack.length -= num;
     }
 
-    public final int stateAt (int i)
+    public final int stateAt (int i) const
     {
       return stack[$-i-1].state;
     }
 
 ]b4_locations_if([[
-    public final ref ]b4_location_type[ locationAt (int i)
+    public final ref Location locationAt (int i)
     {
       return stack[$-i-1].location;
     }]])[
 
-    public final ref ]b4_yystype[ valueAt (int i)
+    public final ref Value valueAt (int i)
     {
       return stack[$-i-1].value;
     }
@@ -887,9 +1319,8 @@
       stream.writeln ();
     }]])[
   }
-
-  /* User implementation code.  */
 ]b4_percent_code_get[
 }
-]b4_epilogue[]dnl
+]b4_percent_code_get([[epilogue]])[]dnl
+b4_epilogue[]dnl
 b4_output_end
diff --git a/data/skeletons/lalr1.java b/data/skeletons/lalr1.java
index 9ec0806..1bbecca 100644
--- a/data/skeletons/lalr1.java
+++ b/data/skeletons/lalr1.java
@@ -1,6 +1,6 @@
-# Java skeleton for Bison                           -*- autoconf -*-
+# Java skeleton for Bison                           -*- java -*-
 
-# Copyright (C) 2007-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2007-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,11 +13,11 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 m4_include(b4_skeletonsdir/[java.m4])
 
-b4_defines_if([b4_complain([%defines does not make sense in Java])])
+b4_header_if([b4_complain([%header/%defines does not make sense in Java])])
 
 m4_define([b4_symbol_no_destructor_assert],
 [b4_symbol_if([$1], [has_destructor],
@@ -25,7 +25,10 @@
                               [%destructor does not make sense in Java])])])
 b4_symbol_foreach([b4_symbol_no_destructor_assert])
 
-# Setup some macros for api.push-pull.
+## --------------- ##
+## api.push-pull.  ##
+## --------------- ##
+
 b4_percent_define_default([[api.push-pull]], [[pull]])
 b4_percent_define_check_values([[[[api.push-pull]],
                                  [[pull]], [[push]], [[both]]]])
@@ -49,13 +52,15 @@
   b4_push_if([m4_define([b4_use_push_for_pull_flag], [[0]])],
              [m4_define([b4_push_flag], [[1]])])])
 
-# Define a macro to encapsulate the parse state variables.
-# This allows them to be defined either in parse() when doing
-# pull parsing, or as class instance variable when doing push parsing.
-m4_define([b4_define_state],[[
-    /* Lookahead and lookahead in internal form.  */
-    int yychar = yyempty_;
-    int yytoken = 0;
+# Define a macro to encapsulate the parse state variables.  This
+# allows them to be defined either in parse() when doing pull parsing,
+# or as class instance variable when doing push parsing.
+m4_define([b4_define_state],
+[[
+    /* Lookahead token kind.  */
+    int yychar = YYEMPTY_;
+    /* Lookahead symbol kind.  */
+    SymbolKind yytoken = null;
 
     /* State.  */
     int yyn = 0;
@@ -64,9 +69,8 @@
     YYStack yystack = new YYStack ();
     int label = YYNEWSTATE;
 
-    /* Error handling.  */
-    int yynerrs_ = 0;
-    ]b4_locations_if([[/* The location where the error started.  */
+]b4_locations_if([[
+    /* The location where the error started.  */
     ]b4_location_type[ yyerrloc = null;
 
     /* Location. */
@@ -74,15 +78,31 @@
 
     /* Semantic value of the lookahead.  */
     ]b4_yystype[ yylval = null;
-]])[
+]])
 
-]b4_output_begin([b4_parser_file_name])[
+# parse.lac
+b4_percent_define_default([[parse.lac]], [[none]])
+b4_percent_define_check_values([[[[parse.lac]], [[full]], [[none]]]])
+b4_define_flag_if([lac])
+m4_define([b4_lac_flag],
+          [m4_if(b4_percent_define_get([[parse.lac]]),
+                 [none], [[0]], [[1]])])
+
+
+## ------------- ##
+## Parser File.  ##
+## ------------- ##
+
+b4_output_begin([b4_parser_file_name])[
 ]b4_copyright([Skeleton implementation for Bison LALR(1) parsers in Java],
-              [2007-2015, 2018-2019])[
-]b4_percent_define_ifdef([package], [package b4_percent_define_get([package]);[
+              [2007-2015, 2018-2021])[
+]b4_disclaimer[
+]b4_percent_define_ifdef([api.package], [package b4_percent_define_get([api.package]);[
 ]])[
 ]b4_user_pre_prologue[
 ]b4_user_post_prologue[
+import java.text.MessageFormat;
+import java.util.ArrayList;
 ]b4_percent_code_get([[imports]])[
 /**
  * A Bison parser, automatically generated from <tt>]m4_bpatsubst(b4_file_name, [^"\(.*\)"$], [\1])[</tt>.
@@ -91,8 +111,10 @@
  */
 ]b4_parser_class_declaration[
 {
-  ]b4_identification[
-]b4_error_verbose_if([[
+]b4_identification[
+][
+]b4_parse_error_bmatch(
+           [detailed\|verbose], [[
   /**
    * True if verbose error messages are enabled.
    */
@@ -109,16 +131,16 @@
    */
   public final void setErrorVerbose(boolean verbose)
   { yyErrorVerbose = verbose; }
-]])
+]])[
 
-b4_locations_if([[
+]b4_locations_if([[
   /**
    * A class defining a pair of positions.  Positions, defined by the
    * <code>]b4_position_type[</code> class, denote a point in the input.
    * Locations represent a part of the input through the beginning
    * and ending positions.
    */
-  public class ]b4_location_type[ {
+  public static class ]b4_location_type[ {
     /**
      * The first, inclusive, position in the range.
      */
@@ -153,52 +175,50 @@
      * <code>]b4_position_type[</code> should override the <code>equals</code>
      * method.
      */
-    public String toString () {
+    public String toString() {
       if (begin.equals (end))
-        return begin.toString ();
+        return begin.toString();
       else
-        return begin.toString () + "-" + end.toString ();
+        return begin.toString() + "-" + end.toString();
     }
   }
 
-]])[
-
-]b4_locations_if([[
-  private ]b4_location_type[ yylloc (YYStack rhs, int n)
+  private ]b4_location_type[ yylloc(YYStack rhs, int n)
   {
     if (0 < n)
-      return new ]b4_location_type[ (rhs.locationAt (n-1).begin, rhs.locationAt (0).end);
+      return new ]b4_location_type[(rhs.locationAt(n-1).begin, rhs.locationAt(0).end);
     else
-      return new ]b4_location_type[ (rhs.locationAt (0).end);
+      return new ]b4_location_type[(rhs.locationAt(0).end);
   }]])[
 
+]b4_declare_symbol_enum[
+
   /**
    * Communication interface between the scanner and the Bison-generated
    * parser <tt>]b4_parser_class[</tt>.
    */
   public interface Lexer {
-    /** Token returned by the scanner to signal the end of its input.  */
-    public static final int EOF = 0;
-
 ]b4_token_enums[
-
-    ]b4_locations_if([[/**
+    /** Deprecated, use ]b4_symbol(eof, id)[ instead.  */
+    public static final int EOF = ]b4_symbol(eof, id)[;
+]b4_pull_if([b4_locations_if([[
+    /**
      * Method to retrieve the beginning position of the last scanned token.
      * @@return the position at which the last scanned token starts.
      */
-    ]b4_position_type[ getStartPos ();
+    ]b4_position_type[ getStartPos();
 
     /**
      * Method to retrieve the ending position of the last scanned token.
      * @@return the first position beyond the last scanned token.
      */
-    ]b4_position_type[ getEndPos ();]])[
+    ]b4_position_type[ getEndPos();]])[
 
     /**
      * Method to retrieve the semantic value of the last scanned token.
      * @@return the semantic value of the last scanned token.
      */
-    ]b4_yystype[ getLVal ();
+    ]b4_yystype[ getLVal();
 
     /**
      * Entry point for the scanner.  Returns the token identifier corresponding
@@ -206,17 +226,26 @@
      * ]b4_locations_if([and beginning/ending positions ])[of the token.
      * @@return the token identifier corresponding to the next token.
      */
-    int yylex () ]b4_maybe_throws([b4_lex_throws])[;
-
+    int yylex()]b4_maybe_throws([b4_lex_throws])[;
+]])[
     /**
-     * Entry point for error reporting.  Emits an error
-     * ]b4_locations_if([referring to the given location ])[in a user-defined way.
+     * Emit an error]b4_locations_if([ referring to the given location])[in a user-defined way.
      *
-     * ]b4_locations_if([[@@param loc The location of the element to which the
-     *                error message is related]])[
+     *]b4_locations_if([[ @@param loc The location of the element to which the
+     *                error message is related.]])[
      * @@param msg The string for the error message.
      */
-     void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String msg);
+     void yyerror(]b4_locations_if([b4_location_type[ loc, ]])[String msg);
+
+]b4_parse_error_bmatch(
+           [custom], [[
+    /**
+     * Build and emit a "syntax error" message in a user-defined way.
+     *
+     * @@param ctx  The context of the error.
+     */
+     void reportSyntaxError(Context ctx);
+]])[
   }
 
 ]b4_lexer_if([[
@@ -224,22 +253,25 @@
 ]b4_percent_code_get([[lexer]])[
   }
 
-  ]])[/**
+]])[
+  /**
    * The object doing lexical analysis for us.
    */
   private Lexer yylexer;
 
-  ]b4_parse_param_vars[
+]b4_parse_param_vars[
 
 ]b4_lexer_if([[
   /**
    * Instantiates the Bison-generated parser.
    */
-  public ]b4_parser_class (b4_parse_param_decl([b4_lex_param_decl])[) ]b4_maybe_throws([b4_init_throws])[
+  public ]b4_parser_class[(]b4_parse_param_decl([b4_lex_param_decl])[)]b4_maybe_throws([b4_init_throws])[
   {
-    ]b4_percent_code_get([[init]])[
+]b4_percent_code_get([[init]])[]b4_lac_if([[
+    this.yylacStack = new ArrayList<Integer>();
+    this.yylacEstablished = false;]])[
     this.yylexer = new YYLexer(]b4_lex_param_call[);
-    ]b4_parse_param_cons[
+]b4_parse_param_cons[
   }
 ]])[
 
@@ -247,11 +279,13 @@
    * Instantiates the Bison-generated parser.
    * @@param yylexer The scanner that will supply tokens to the parser.
    */
-  ]b4_lexer_if([[protected]], [[public]]) b4_parser_class[ (]b4_parse_param_decl([[Lexer yylexer]])[) ]b4_maybe_throws([b4_init_throws])[
+  ]b4_lexer_if([[protected]], [[public]]) b4_parser_class[(]b4_parse_param_decl([[Lexer yylexer]])[)]b4_maybe_throws([b4_init_throws])[
   {
-    ]b4_percent_code_get([[init]])[
+]b4_percent_code_get([[init]])[]b4_lac_if([[
+    this.yylacStack = new ArrayList<Integer>();
+    this.yylacEstablished = false;]])[
     this.yylexer = yylexer;
-    ]b4_parse_param_cons[
+]b4_parse_param_cons[
   }
 
 ]b4_parse_trace_if([[
@@ -260,7 +294,7 @@
   /**
    * The <tt>PrintStream</tt> on which the debugging output is printed.
    */
-  public final java.io.PrintStream getDebugStream () { return yyDebugStream; }
+  public final java.io.PrintStream getDebugStream() { return yyDebugStream; }
 
   /**
    * Set the <tt>PrintStream</tt> on which the debug output is printed.
@@ -284,14 +318,20 @@
   public final void setDebugLevel(int level) { yydebug = level; }
 ]])[
 
+  private int yynerrs = 0;
+
+  /**
+   * The number of syntax errors so far.
+   */
+  public final int getNumberOfErrors() { return yynerrs; }
+
   /**
    * Print an error message via the lexer.
    *]b4_locations_if([[ Use a <code>null</code> location.]])[
    * @@param msg The error message.
    */
-  public final void yyerror (String msg)
-  {
-    yylexer.yyerror (]b4_locations_if([[(]b4_location_type[)null, ]])[msg);
+  public final void yyerror(String msg) {
+      yylexer.yyerror(]b4_locations_if([[(]b4_location_type[)null, ]])[msg);
   }
 ]b4_locations_if([[
   /**
@@ -299,9 +339,8 @@
    * @@param loc The location associated with the message.
    * @@param msg The error message.
    */
-  public final void yyerror (]b4_location_type[ loc, String msg)
-  {
-    yylexer.yyerror (loc, msg);
+  public final void yyerror(]b4_location_type[ loc, String msg) {
+      yylexer.yyerror(loc, msg);
   }
 
   /**
@@ -309,84 +348,85 @@
    * @@param pos The position associated with the message.
    * @@param msg The error message.
    */
-  public final void yyerror (]b4_position_type[ pos, String msg)
-  {
-    yylexer.yyerror (new ]b4_location_type[ (pos), msg);
+  public final void yyerror(]b4_position_type[ pos, String msg) {
+      yylexer.yyerror(new ]b4_location_type[ (pos), msg);
   }]])[
 ]b4_parse_trace_if([[
-  protected final void yycdebug (String s) {
+  protected final void yycdebugNnl(String s) {
     if (0 < yydebug)
-      yyDebugStream.println (s);
+      yyDebugStream.print(s);
+  }
+
+  protected final void yycdebug(String s) {
+    if (0 < yydebug)
+      yyDebugStream.println(s);
   }]])[
 
   private final class YYStack {
-    private int[] stateStack = new int[16];
-    ]b4_locations_if([[private ]b4_location_type[[] locStack = new ]b4_location_type[[16];]])[
+    private int[] stateStack = new int[16];]b4_locations_if([[
+    private ]b4_location_type[[] locStack = new ]b4_location_type[[16];]])[
     private ]b4_yystype[[] valueStack = new ]b4_yystype[[16];
 
     public int size = 16;
     public int height = -1;
 
-    public final void push (int state, ]b4_yystype[ value]dnl
-                            b4_locations_if([, ]b4_location_type[ loc])[) {
+    public final void push(int state, ]b4_yystype[ value]b4_locations_if([, ]b4_location_type[ loc])[) {
       height++;
-      if (size == height)
-        {
-          int[] newStateStack = new int[size * 2];
-          System.arraycopy (stateStack, 0, newStateStack, 0, height);
-          stateStack = newStateStack;
-          ]b4_locations_if([[
-          ]b4_location_type[[] newLocStack = new ]b4_location_type[[size * 2];
-          System.arraycopy (locStack, 0, newLocStack, 0, height);
-          locStack = newLocStack;]])
+      if (size == height) {
+        int[] newStateStack = new int[size * 2];
+        System.arraycopy(stateStack, 0, newStateStack, 0, height);
+        stateStack = newStateStack;]b4_locations_if([[
+        ]b4_location_type[[] newLocStack = new ]b4_location_type[[size * 2];
+        System.arraycopy(locStack, 0, newLocStack, 0, height);
+        locStack = newLocStack;]])
 
-          b4_yystype[[] newValueStack = new ]b4_yystype[[size * 2];
-          System.arraycopy (valueStack, 0, newValueStack, 0, height);
-          valueStack = newValueStack;
+        b4_yystype[[] newValueStack = new ]b4_yystype[[size * 2];
+        System.arraycopy(valueStack, 0, newValueStack, 0, height);
+        valueStack = newValueStack;
 
-          size *= 2;
-        }
+        size *= 2;
+      }
 
-      stateStack[height] = state;
-      ]b4_locations_if([[locStack[height] = loc;]])[
+      stateStack[height] = state;]b4_locations_if([[
+      locStack[height] = loc;]])[
       valueStack[height] = value;
     }
 
-    public final void pop () {
-      pop (1);
+    public final void pop() {
+      pop(1);
     }
 
-    public final void pop (int num) {
+    public final void pop(int num) {
       // Avoid memory leaks... garbage collection is a white lie!
       if (0 < num) {
-        java.util.Arrays.fill (valueStack, height - num + 1, height + 1, null);
-        ]b4_locations_if([[java.util.Arrays.fill (locStack, height - num + 1, height + 1, null);]])[
+        java.util.Arrays.fill(valueStack, height - num + 1, height + 1, null);]b4_locations_if([[
+        java.util.Arrays.fill(locStack, height - num + 1, height + 1, null);]])[
       }
       height -= num;
     }
 
-    public final int stateAt (int i) {
+    public final int stateAt(int i) {
       return stateStack[height - i];
     }
+]b4_locations_if([[
 
-    ]b4_locations_if([[public final ]b4_location_type[ locationAt (int i) {
+    public final ]b4_location_type[ locationAt(int i) {
       return locStack[height - i];
     }
-
-    ]])[public final ]b4_yystype[ valueAt (int i) {
+]])[
+    public final ]b4_yystype[ valueAt(int i) {
       return valueStack[height - i];
     }
 
     // Print the state stack on the debug stream.
-    public void print (java.io.PrintStream out) {
+    public void print(java.io.PrintStream out) {
       out.print ("Stack now");
 
-      for (int i = 0; i <= height; i++)
-        {
-          out.print (' ');
-          out.print (stateStack[i]);
-        }
-      out.println ();
+      for (int i = 0; i <= height; i++) {
+        out.print(' ');
+        out.print(stateStack[i]);
+      }
+      out.println();
     }
   }
 
@@ -443,16 +483,15 @@
    * @@param yystate   the current state
    * @@param yysym     the nonterminal to push on the stack
    */
-  private int yyLRGotoState (int yystate, int yysym)
-  {
-    int yyr = yypgoto_[yysym - yyntokens_] + yystate;
-    if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
+  private int yyLRGotoState(int yystate, int yysym) {
+    int yyr = yypgoto_[yysym - YYNTOKENS_] + yystate;
+    if (0 <= yyr && yyr <= YYLAST_ && yycheck_[yyr] == yystate)
       return yytable_[yyr];
     else
-      return yydefgoto_[yysym - yyntokens_];
+      return yydefgoto_[yysym - YYNTOKENS_];
   }
 
-  private int yyaction (int yyn, YYStack yystack, int yylen) ]b4_maybe_throws([b4_throws])[
+  private int yyaction(int yyn, YYStack yystack, int yylen)]b4_maybe_throws([b4_throws])[
   {
     /* If YYLEN is nonzero, implement the default value of the action:
        '$$ = $1'.  Otherwise, use the top of the stack.
@@ -460,10 +499,10 @@
        Otherwise, the following line sets YYVAL to garbage.
        This behavior is undocumented and Bison
        users should not rely upon it.  */
-    ]b4_yystype[ yyval = (0 < yylen) ? yystack.valueAt (yylen - 1) : yystack.valueAt (0);
-    ]b4_locations_if([b4_location_type[ yyloc = yylloc (yystack, yylen);]])[]b4_parse_trace_if([[
+    ]b4_yystype[ yyval = (0 < yylen) ? yystack.valueAt(yylen - 1) : yystack.valueAt(0);]b4_locations_if([[
+    ]b4_location_type[ yyloc = yylloc(yystack, yylen);]])[]b4_parse_trace_if([[
 
-    yyReducePrint (yyn, yystack);]])[
+    yyReducePrint(yyn, yystack);]])[
 
     switch (yyn)
       {
@@ -471,66 +510,30 @@
         default: break;
       }]b4_parse_trace_if([[
 
-    yySymbolPrint ("-> $$ =", yyr1_[yyn], yyval]b4_locations_if([, yyloc])[);]])[
+    yySymbolPrint("-> $$ =", SymbolKind.get(yyr1_[yyn]), yyval]b4_locations_if([, yyloc])[);]])[
 
-    yystack.pop (yylen);
+    yystack.pop(yylen);
     yylen = 0;
-
     /* Shift the result of the reduction.  */
-    int yystate = yyLRGotoState (yystack.stateAt (0), yyr1_[yyn]);
-    yystack.push (yystate, yyval]b4_locations_if([, yyloc])[);
+    int yystate = yyLRGotoState(yystack.stateAt(0), yyr1_[yyn]);
+    yystack.push(yystate, yyval]b4_locations_if([, yyloc])[);
     return YYNEWSTATE;
   }
 
-]b4_error_verbose_if([[
-  /* Return YYSTR after stripping away unnecessary quotes and
-     backslashes, so that it's suitable for yyerror.  The heuristic is
-     that double-quoting is unnecessary unless the string contains an
-     apostrophe, a comma, or backslash (other than backslash-backslash).
-     YYSTR is taken from yytname.  */
-  private final String yytnamerr_ (String yystr)
-  {
-    if (yystr.charAt (0) == '"')
-      {
-        StringBuffer yyr = new StringBuffer ();
-        strip_quotes: for (int i = 1; i < yystr.length (); i++)
-          switch (yystr.charAt (i))
-            {
-            case '\'':
-            case ',':
-              break strip_quotes;
-
-            case '\\':
-              if (yystr.charAt(++i) != '\\')
-                break strip_quotes;
-              /* Fall through.  */
-            default:
-              yyr.append (yystr.charAt (i));
-              break;
-
-            case '"':
-              return yyr.toString ();
-            }
-      }
-    else if (yystr.equals ("$end"))
-      return "end of input";
-
-    return yystr;
-  }
-]])[
 ]b4_parse_trace_if([[
   /*--------------------------------.
   | Print this symbol on YYOUTPUT.  |
   `--------------------------------*/
 
-  private void yySymbolPrint (String s, int yytype,
-                             ]b4_yystype[ yyvaluep]dnl
-                              b4_locations_if([, Object yylocationp])[)
-  {
-    yycdebug (s + (yytype < yyntokens_ ? " token " : " nterm ")
-              + yytname_[yytype] + " ("]b4_locations_if([
-              + yylocationp + ": "])[
-              + (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")");
+  private void yySymbolPrint(String s, SymbolKind yykind,
+                             ]b4_yystype[ yyvalue]b4_locations_if([, ]b4_location_type[ yylocation])[) {
+      if (0 < yydebug) {
+          yycdebug(s
+                   + (yykind.getCode() < YYNTOKENS_ ? " token " : " nterm ")
+                   + yykind.getName() + " ("]b4_locations_if([
+                   + yylocation + ": "])[
+                   + (yyvalue == null ? "(null)" : yyvalue.toString()) + ")");
+      }
   }]])[
 
 ]b4_push_if([],[[
@@ -541,29 +544,34 @@
    * @@return <tt>true</tt> if the parsing succeeds.  Note that this does not
    *          imply that there were no syntax errors.
    */
-  public boolean parse () ]b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])[]])[
+  public boolean parse()]b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])[]])[
 ]b4_push_if([
   /**
    * Push Parse input from external lexer
    *
    * @@param yylextoken current token
-   * @@param yylexval current lval
-]b4_locations_if([   * @@param yylexloc current position])[
+   * @@param yylexval current lval]b4_locations_if([[
+   * @@param yylexloc current position]])[
    *
    * @@return <tt>YYACCEPT, YYABORT, YYPUSH_MORE</tt>
    */
-  public int push_parse (int yylextoken, b4_yystype yylexval[]b4_locations_if([, b4_location_type yylexloc]))
-      b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])])[
-  {
-    ]b4_locations_if([/* @@$.  */
-    b4_location_type yyloc;])[
+  public int push_parse(int yylextoken, b4_yystype yylexval[]b4_locations_if([, b4_location_type yylexloc]))b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])])[
+  {]b4_locations_if([[
+    /* @@$.  */
+    ]b4_location_type[ yyloc;]])[
 ]b4_push_if([],[[
-]b4_define_state[]b4_parse_trace_if([[
-    yycdebug ("Starting parse\n");]])[
+]b4_define_state[
+]b4_lac_if([[
+    // Discard the LAC context in case there still is one left from a
+    // previous invocation.
+    yylacDiscard("init");]])[
+]b4_parse_trace_if([[
+    yycdebug ("Starting parse");]])[
     yyerrstatus_ = 0;
+    yynerrs = 0;
 
     /* Initialize the stack.  */
-    yystack.push (yystate, yylval ]b4_locations_if([, yylloc])[);
+    yystack.push (yystate, yylval]b4_locations_if([, yylloc])[);
 ]m4_ifdef([b4_initial_action], [
 b4_dollar_pushdef([yylval], [], [], [yylloc])dnl
     b4_user_initial_action
@@ -579,7 +587,7 @@
     b4_user_initial_action
 b4_dollar_popdef[]dnl
 ])[]b4_parse_trace_if([[
-        yycdebug ("Starting parse\n");]])[
+        yycdebug ("Starting parse");]])[
         yyerrstatus_ = 0;
       } else
         label = YYGETTOKEN;
@@ -592,12 +600,12 @@
         /* New state.  Unlike in the C/C++ skeletons, the state is already
            pushed when we come here.  */
       case YYNEWSTATE:]b4_parse_trace_if([[
-        yycdebug ("Entering state " + yystate + "\n");
+        yycdebug ("Entering state " + yystate);
         if (0 < yydebug)
           yystack.print (yyDebugStream);]])[
 
         /* Accept?  */
-        if (yystate == yyfinal_)
+        if (yystate == YYFINAL_)
           ]b4_push_if([{label = YYACCEPT; break;}],
                       [return true;])[
 
@@ -612,64 +620,84 @@
 
       case YYGETTOKEN:])[
         /* Read a lookahead token.  */
-        if (yychar == yyempty_)
+        if (yychar == YYEMPTY_)
           {
 ]b4_push_if([[
             if (!push_token_consumed)
               return YYPUSH_MORE;]b4_parse_trace_if([[
-            yycdebug ("Reading a token: ");]])[
+            yycdebug ("Reading a token");]])[
             yychar = yylextoken;
             yylval = yylexval;]b4_locations_if([
             yylloc = yylexloc;])[
             push_token_consumed = false;]], [b4_parse_trace_if([[
-            yycdebug ("Reading a token: ");]])[
+            yycdebug ("Reading a token");]])[
             yychar = yylexer.yylex ();
-            yylval = yylexer.getLVal ();]b4_locations_if([
-            yylloc = new b4_location_type (yylexer.getStartPos (),
-                            yylexer.getEndPos ());])[
+            yylval = yylexer.getLVal();]b4_locations_if([[
+            yylloc = new ]b4_location_type[(yylexer.getStartPos(),
+                                          yylexer.getEndPos());]])[
 ]])[
           }
 
         /* Convert token to internal form.  */
         yytoken = yytranslate_ (yychar);]b4_parse_trace_if([[
-        yySymbolPrint ("Next token is", yytoken,
-                       yylval]b4_locations_if([, yylloc])[);]])[
+        yySymbolPrint("Next token is", yytoken,
+                      yylval]b4_locations_if([, yylloc])[);]])[
 
-        /* If the proper action on seeing token YYTOKEN is to reduce or to
-           detect an error, take that action.  */
-        yyn += yytoken;
-        if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken)
-          label = YYDEFAULT;
-
-        /* <= 0 means reduce or error.  */
-        else if ((yyn = yytable_[yyn]) <= 0)
+        if (yytoken == ]b4_symbol(error, kind)[)
           {
-            if (yyTableValueIsError (yyn))
-              label = YYERRLAB;
-            else
-              {
-                yyn = -yyn;
-                label = YYREDUCE;
-              }
+            // The scanner already issued an error message, process directly
+            // to error recovery.  But do not keep the error token as
+            // lookahead, it is too special and may lead us to an endless
+            // loop in error recovery. */
+            yychar = Lexer.]b4_symbol(undef, id)[;
+            yytoken = ]b4_symbol(undef, kind)[;]b4_locations_if([[
+            yyerrloc = yylloc;]])[
+            label = YYERRLAB1;
           }
-
         else
           {
-            /* Shift the lookahead token.  */]b4_parse_trace_if([[
-            yySymbolPrint ("Shifting", yytoken,
-                           yylval]b4_locations_if([, yylloc])[);
+            /* If the proper action on seeing token YYTOKEN is to reduce or to
+               detect an error, take that action.  */
+            yyn += yytoken.getCode();
+            if (yyn < 0 || YYLAST_ < yyn || yycheck_[yyn] != yytoken.getCode()) {]b4_lac_if([[
+              if (!yylacEstablish(yystack, yytoken)) {
+                label = YYERRLAB;
+              } else]])[
+              label = YYDEFAULT;
+            }
+
+            /* <= 0 means reduce or error.  */
+            else if ((yyn = yytable_[yyn]) <= 0)
+              {
+                if (yyTableValueIsError(yyn)) {
+                  label = YYERRLAB;
+                }]b4_lac_if([[ else if (!yylacEstablish(yystack, yytoken)) {
+                  label = YYERRLAB;
+                }]])[ else {
+                  yyn = -yyn;
+                  label = YYREDUCE;
+                }
+              }
+
+            else
+              {
+                /* Shift the lookahead token.  */]b4_parse_trace_if([[
+                yySymbolPrint("Shifting", yytoken,
+                              yylval]b4_locations_if([, yylloc])[);
 ]])[
-            /* Discard the token being shifted.  */
-            yychar = yyempty_;
+                /* Discard the token being shifted.  */
+                yychar = YYEMPTY_;
 
-            /* Count tokens shifted since error; after three, turn off error
-               status.  */
-            if (yyerrstatus_ > 0)
-              --yyerrstatus_;
+                /* Count tokens shifted since error; after three, turn off error
+                   status.  */
+                if (yyerrstatus_ > 0)
+                  --yyerrstatus_;
 
-            yystate = yyn;
-            yystack.push (yystate, yylval]b4_locations_if([, yylloc])[);
-            label = YYNEWSTATE;
+                yystate = yyn;
+                yystack.push(yystate, yylval]b4_locations_if([, yylloc])[);]b4_lac_if([[
+                yylacDiscard("shift");]])[
+                label = YYNEWSTATE;
+              }
           }
         break;
 
@@ -689,8 +717,8 @@
       `-----------------------------*/
       case YYREDUCE:
         yylen = yyr2_[yyn];
-        label = yyaction (yyn, yystack, yylen);
-        yystate = yystack.stateAt (0);
+        label = yyaction(yyn, yystack, yylen);
+        yystate = yystack.stateAt(0);
         break;
 
       /*------------------------------------.
@@ -700,26 +728,26 @@
         /* If not already recovering from an error, report this error.  */
         if (yyerrstatus_ == 0)
           {
-            ++yynerrs_;
-            if (yychar == yyempty_)
-              yytoken = yyempty_;
-            yyerror (]b4_locations_if([yylloc, ])[yysyntax_error (yystate, yytoken));
+            ++yynerrs;
+            if (yychar == YYEMPTY_)
+              yytoken = null;
+            yyreportSyntaxError(new Context(this, yystack, yytoken]b4_locations_if([[, yylloc]])[));
           }
-
-        ]b4_locations_if([yyerrloc = yylloc;])[
+]b4_locations_if([[
+        yyerrloc = yylloc;]])[
         if (yyerrstatus_ == 3)
           {
             /* If just tried and failed to reuse lookahead token after an
                error, discard it.  */
 
-            if (yychar <= Lexer.EOF)
+            if (yychar <= Lexer.]b4_symbol(eof, id)[)
               {
                 /* Return failure if at end of input.  */
-                if (yychar == Lexer.EOF)
+                if (yychar == Lexer.]b4_symbol(eof, id)[)
                   ]b4_push_if([{label = YYABORT; break;}], [return false;])[
               }
             else
-              yychar = yyempty_;
+              yychar = YYEMPTY_;
           }
 
         /* Else will try to reuse lookahead token after shifting the error
@@ -730,13 +758,13 @@
       /*-------------------------------------------------.
       | errorlab -- error raised explicitly by YYERROR.  |
       `-------------------------------------------------*/
-      case YYERROR:
-        ]b4_locations_if([yyerrloc = yystack.locationAt (yylen - 1);])[
+      case YYERROR:]b4_locations_if([[
+        yyerrloc = yystack.locationAt (yylen - 1);]])[
         /* Do not reclaim the symbols of the rule which action triggered
            this YYERROR.  */
         yystack.pop (yylen);
         yylen = 0;
-        yystate = yystack.stateAt (0);
+        yystate = yystack.stateAt(0);
         label = YYERRLAB1;
         break;
 
@@ -746,13 +774,15 @@
       case YYERRLAB1:
         yyerrstatus_ = 3;       /* Each real token shifted decrements this.  */
 
+        // Pop stack until we find a state that shifts the error token.
         for (;;)
           {
             yyn = yypact_[yystate];
             if (!yyPactValueIsDefault (yyn))
               {
-                yyn += yy_error_token_;
-                if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yy_error_token_)
+                yyn += ]b4_symbol(error, kind)[.getCode();
+                if (0 <= yyn && yyn <= YYLAST_
+                    && yycheck_[yyn] == ]b4_symbol(error, kind)[.getCode())
                   {
                     yyn = yytable_[yyn];
                     if (0 < yyn)
@@ -765,27 +795,29 @@
             if (yystack.height == 0)
               ]b4_push_if([{label = YYABORT; break;}],[return false;])[
 
-            ]b4_locations_if([yyerrloc = yystack.locationAt (0);])[
+]b4_locations_if([[
+            yyerrloc = yystack.locationAt (0);]])[
             yystack.pop ();
-            yystate = yystack.stateAt (0);]b4_parse_trace_if([[
+            yystate = yystack.stateAt(0);]b4_parse_trace_if([[
             if (0 < yydebug)
               yystack.print (yyDebugStream);]])[
           }
 
         if (label == YYABORT)
-            /* Leave the switch.  */
-            break;
+          /* Leave the switch.  */
+          break;
 
-]b4_locations_if([
+]b4_locations_if([[
         /* Muck with the stack to setup for yylloc.  */
         yystack.push (0, null, yylloc);
         yystack.push (0, null, yyerrloc);
         yyloc = yylloc (yystack, 2);
-        yystack.pop (2);])[
+        yystack.pop (2);]])[
 
-        /* Shift the error token.  */]b4_parse_trace_if([[
-        yySymbolPrint ("Shifting", yystos_[yyn],
-                       yylval]b4_locations_if([, yyloc])[);]])[
+        /* Shift the error token.  */]b4_lac_if([[
+        yylacDiscard("error recovery");]])[]b4_parse_trace_if([[
+        yySymbolPrint("Shifting", SymbolKind.get(yystos_[yyn]),
+                      yylval]b4_locations_if([, yyloc])[);]])[
 
         yystate = yyn;
         yystack.push (yyn, yylval]b4_locations_if([, yyloc])[);
@@ -809,24 +841,26 @@
     /**
      * (Re-)Initialize the state of the push parser.
      */
-  public void push_parse_initialize()
+  public void push_parse_initialize ()
   {
     /* Lookahead and lookahead in internal form.  */
-    this.yychar = yyempty_;
-    this.yytoken = 0;
+    this.yychar = YYEMPTY_;
+    this.yytoken = null;
 
     /* State.  */
     this.yyn = 0;
     this.yylen = 0;
     this.yystate = 0;
-    this.yystack = new YYStack ();
+    this.yystack = new YYStack();]b4_lac_if([[
+    this.yylacStack = new ArrayList<Integer>();
+    this.yylacEstablished = false;]])[
     this.label = YYNEWSTATE;
 
     /* Error handling.  */
-    this.yynerrs_ = 0;
-    ]b4_locations_if([/* The location where the error started.  */
+    this.yynerrs = 0;]b4_locations_if([[
+    /* The location where the error started.  */
     this.yyerrloc = null;
-    this.yylloc = new b4_location_type (null, null);])[
+    this.yylloc = new ]b4_location_type[ (null, null);]])[
 
     /* Semantic value of the lookahead.  */
     this.yylval = null;
@@ -836,7 +870,7 @@
     this.push_parse_initialized = true;
 
   }
-]b4_locations_if([
+]b4_locations_if([[
   /**
    * Push parse given input from an external lexer.
    *
@@ -846,119 +880,354 @@
    *
    * @@return <tt>YYACCEPT, YYABORT, YYPUSH_MORE</tt>
    */
-  public int push_parse (int yylextoken, b4_yystype yylexval, b4_position_type yylexpos)
-      b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])
-  {
-    return push_parse (yylextoken, yylexval, new b4_location_type (yylexpos));
+  public int push_parse(int yylextoken, ]b4_yystype[ yylexval, ]b4_position_type[ yylexpos)]b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])[ {
+      return push_parse(yylextoken, yylexval, new ]b4_location_type[(yylexpos));
   }
-])[]])[
+]])])[
 
 ]b4_both_if([[
   /**
    * Parse input from the scanner that was specified at object construction
    * time.  Return whether the end of the input was reached successfully.
-   * This version of parse () is defined only when api.push-push=both.
+   * This version of parse() is defined only when api.push-push=both.
    *
    * @@return <tt>true</tt> if the parsing succeeds.  Note that this does not
    *          imply that there were no syntax errors.
    */
-  public boolean parse () ]b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])[
-  {
-    if (yylexer == null)
-      throw new NullPointerException("Null Lexer");
-    int status;
-    do {
-      int token = yylexer.yylex();
-      ]b4_yystype[ lval = yylexer.getLVal();
-]b4_locations_if([dnl
-      b4_location_type yyloc = new b4_location_type (yylexer.getStartPos (),
-                                            yylexer.getEndPos ());])[
-      ]b4_locations_if([status = push_parse(token,lval,yyloc);],[
-      status = push_parse(token,lval);])[
-    } while (status == YYPUSH_MORE);
-    return (status == YYACCEPT);
+  public boolean parse()]b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])[ {
+      if (yylexer == null)
+          throw new NullPointerException("Null Lexer");
+      int status;
+      do {
+          int token = yylexer.yylex();
+          ]b4_yystype[ lval = yylexer.getLVal();]b4_locations_if([[
+          ]b4_location_type[ yyloc = new ]b4_location_type[(yylexer.getStartPos(), yylexer.getEndPos());
+          status = push_parse(token, lval, yyloc);]], [[
+          status = push_parse(token, lval);]])[
+      } while (status == YYPUSH_MORE);
+      return status == YYACCEPT;
   }
 ]])[
 
-  // Generate an error message.
-  private String yysyntax_error (int yystate, int tok)
-  {]b4_error_verbose_if([[
-    if (yyErrorVerbose)
-      {
-        /* There are many possibilities here to consider:
-           - If this state is a consistent state with a default action,
-             then the only way this function was invoked is if the
-             default action is an error action.  In that case, don't
-             check for expected tokens because there are none.
-           - The only way there can be no lookahead present (in tok) is
-             if this state is a consistent state with a default action.
-             Thus, detecting the absence of a lookahead is sufficient to
-             determine that there is no unexpected or expected token to
-             report.  In that case, just report a simple "syntax error".
-           - Don't assume there isn't a lookahead just because this
-             state is a consistent state with a default action.  There
-             might have been a previous inconsistent state, consistent
-             state with a non-default action, or user semantic action
-             that manipulated yychar.  (However, yychar is currently out
-             of scope during semantic actions.)
-           - Of course, the expected token list depends on states to
-             have correct lookahead information, and it depends on the
-             parser not to perform extra reductions after fetching a
-             lookahead from the scanner and before detecting a syntax
-             error.  Thus, state merging (from LALR or IELR) and default
-             reductions corrupt the expected token list.  However, the
-             list is correct for canonical LR with one exception: it
-             will still contain any token that will not be accepted due
-             to an error action in a later state.
-        */
-        if (tok != yyempty_)
-          {
-            /* FIXME: This method of building the message is not compatible
-               with internationalization.  */
-            StringBuffer res =
-              new StringBuffer ("syntax error, unexpected ");
-            res.append (yytnamerr_ (yytname_[tok]));
-            int yyn = yypact_[yystate];
-            if (!yyPactValueIsDefault (yyn))
-              {
-                /* Start YYX at -YYN if negative to avoid negative
-                   indexes in YYCHECK.  In other words, skip the first
-                   -YYN actions for this state because they are default
-                   actions.  */
-                int yyxbegin = yyn < 0 ? -yyn : 0;
-                /* Stay within bounds of both yycheck and yytname.  */
-                int yychecklim = yylast_ - yyn + 1;
-                int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
-                int count = 0;
-                for (int x = yyxbegin; x < yyxend; ++x)
-                  if (yycheck_[x + yyn] == x && x != yy_error_token_
-                      && !yyTableValueIsError (yytable_[x + yyn]))
-                    ++count;
-                if (count < 5)
-                  {
-                    count = 0;
-                    for (int x = yyxbegin; x < yyxend; ++x)
-                      if (yycheck_[x + yyn] == x && x != yy_error_token_
-                          && !yyTableValueIsError (yytable_[x + yyn]))
-                        {
-                          res.append (count++ == 0 ? ", expecting " : " or ");
-                          res.append (yytnamerr_ (yytname_[x]));
-                        }
-                  }
-              }
-            return res.toString ();
-          }
-      }
+  /**
+   * Information needed to get the list of expected tokens and to forge
+   * a syntax error diagnostic.
+   */
+  public static final class Context {
+    Context(]b4_parser_class[ parser, YYStack stack, SymbolKind token]b4_locations_if([[, ]b4_location_type[ loc]])[) {
+      yyparser = parser;
+      yystack = stack;
+      yytoken = token;]b4_locations_if([[
+      yylocation = loc;]])[
+    }
+
+    private ]b4_parser_class[ yyparser;
+    private YYStack yystack;
+
+
+    /**
+     * The symbol kind of the lookahead token.
+     */
+    public final SymbolKind getToken() {
+      return yytoken;
+    }
+
+    private SymbolKind yytoken;]b4_locations_if([[
+
+    /**
+     * The location of the lookahead.
+     */
+    public final ]b4_location_type[ getLocation() {
+      return yylocation;
+    }
+
+    private ]b4_location_type[ yylocation;]])[
+    static final int NTOKENS = ]b4_parser_class[.YYNTOKENS_;
+
+    /**
+     * Put in YYARG at most YYARGN of the expected tokens given the
+     * current YYCTX, and return the number of tokens stored in YYARG.  If
+     * YYARG is null, return the number of expected tokens (guaranteed to
+     * be less than YYNTOKENS).
+     */
+    int getExpectedTokens(SymbolKind yyarg[], int yyargn) {
+      return getExpectedTokens (yyarg, 0, yyargn);
+    }
+
+    int getExpectedTokens(SymbolKind yyarg[], int yyoffset, int yyargn) {
+      int yycount = yyoffset;]b4_lac_if([b4_parse_trace_if([[
+      // Execute LAC once. We don't care if it is successful, we
+      // only do it for the sake of debugging output.
+      if (!yyparser.yylacEstablished)
+        yyparser.yylacCheck(yystack, yytoken);
 ]])[
-    return "syntax error";
+      for (int yyx = 0; yyx < YYNTOKENS_; ++yyx)
+        {
+          SymbolKind yysym = SymbolKind.get(yyx);
+          if (yysym != ]b4_symbol(error, kind)[
+              && yysym != ]b4_symbol(undef, kind)[
+              && yyparser.yylacCheck(yystack, yysym))
+            {
+              if (yyarg == null)
+                yycount += 1;
+              else if (yycount == yyargn)
+                return 0;
+              else
+                yyarg[yycount++] = yysym;
+            }
+        }]], [[
+      int yyn = yypact_[this.yystack.stateAt(0)];
+      if (!yyPactValueIsDefault(yyn))
+        {
+          /* Start YYX at -YYN if negative to avoid negative
+             indexes in YYCHECK.  In other words, skip the first
+             -YYN actions for this state because they are default
+             actions.  */
+          int yyxbegin = yyn < 0 ? -yyn : 0;
+          /* Stay within bounds of both yycheck and yytname.  */
+          int yychecklim = YYLAST_ - yyn + 1;
+          int yyxend = yychecklim < NTOKENS ? yychecklim : NTOKENS;
+          for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
+            if (yycheck_[yyx + yyn] == yyx && yyx != ]b4_symbol(error, kind)[.getCode()
+                && !yyTableValueIsError(yytable_[yyx + yyn]))
+              {
+                if (yyarg == null)
+                  yycount += 1;
+                else if (yycount == yyargn)
+                  return 0; // FIXME: this is incorrect.
+                else
+                  yyarg[yycount++] = SymbolKind.get(yyx);
+              }
+        }]])[
+      if (yyarg != null && yycount == yyoffset && yyoffset < yyargn)
+        yyarg[yycount] = null;
+      return yycount - yyoffset;
+    }
+  }
+
+]b4_lac_if([[
+    /** Check the lookahead yytoken.
+     * \returns  true iff the token will be eventually shifted.
+     */
+    boolean yylacCheck(YYStack yystack, SymbolKind yytoken)
+    {
+      // Logically, the yylacStack's lifetime is confined to this function.
+      // Clear it, to get rid of potential left-overs from previous call.
+      yylacStack.clear();
+      // Reduce until we encounter a shift and thereby accept the token.
+      yycdebugNnl("LAC: checking lookahead " + yytoken.getName() + ":");
+      int lacTop = 0;
+      while (true)
+        {
+          int topState = (yylacStack.isEmpty()
+                          ? yystack.stateAt(lacTop)
+                          : yylacStack.get(yylacStack.size() - 1));
+          int yyrule = yypact_[topState];
+          if (yyPactValueIsDefault(yyrule)
+              || (yyrule += yytoken.getCode()) < 0 || YYLAST_ < yyrule
+              || yycheck_[yyrule] != yytoken.getCode())
+            {
+              // Use the default action.
+              yyrule = yydefact_[+topState];
+              if (yyrule == 0) {
+                yycdebug(" Err");
+                return false;
+              }
+            }
+          else
+            {
+              // Use the action from yytable.
+              yyrule = yytable_[yyrule];
+              if (yyTableValueIsError(yyrule)) {
+                yycdebug(" Err");
+                return false;
+              }
+              if (0 < yyrule) {
+                yycdebug(" S" + yyrule);
+                return true;
+              }
+              yyrule = -yyrule;
+            }
+          // By now we know we have to simulate a reduce.
+          yycdebugNnl(" R" + (yyrule - 1));
+          // Pop the corresponding number of values from the stack.
+          {
+            int yylen = yyr2_[yyrule];
+            // First pop from the LAC stack as many tokens as possible.
+            int lacSize = yylacStack.size();
+            if (yylen < lacSize) {
+              // yylacStack.setSize(lacSize - yylen);
+              for (/* Nothing */; 0 < yylen; yylen -= 1) {
+                yylacStack.remove(yylacStack.size() - 1);
+              }
+              yylen = 0;
+            } else if (lacSize != 0) {
+              yylacStack.clear();
+              yylen -= lacSize;
+            }
+            // Only afterwards look at the main stack.
+            // We simulate popping elements by incrementing lacTop.
+            lacTop += yylen;
+          }
+          // Keep topState in sync with the updated stack.
+          topState = (yylacStack.isEmpty()
+                      ? yystack.stateAt(lacTop)
+                      : yylacStack.get(yylacStack.size() - 1));
+          // Push the resulting state of the reduction.
+          int state = yyLRGotoState(topState, yyr1_[yyrule]);
+          yycdebugNnl(" G" + state);
+          yylacStack.add(state);
+        }
+    }
+
+    /** Establish the initial context if no initial context currently exists.
+     * \returns  true iff the token will be eventually shifted.
+     */
+    boolean yylacEstablish(YYStack yystack, SymbolKind yytoken) {
+      /* Establish the initial context for the current lookahead if no initial
+         context is currently established.
+
+         We define a context as a snapshot of the parser stacks.  We define
+         the initial context for a lookahead as the context in which the
+         parser initially examines that lookahead in order to select a
+         syntactic action.  Thus, if the lookahead eventually proves
+         syntactically unacceptable (possibly in a later context reached via a
+         series of reductions), the initial context can be used to determine
+         the exact set of tokens that would be syntactically acceptable in the
+         lookahead's place.  Moreover, it is the context after which any
+         further semantic actions would be erroneous because they would be
+         determined by a syntactically unacceptable token.
+
+         yylacEstablish should be invoked when a reduction is about to be
+         performed in an inconsistent state (which, for the purposes of LAC,
+         includes consistent states that don't know they're consistent because
+         their default reductions have been disabled).
+
+         For parse.lac=full, the implementation of yylacEstablish is as
+         follows.  If no initial context is currently established for the
+         current lookahead, then check if that lookahead can eventually be
+         shifted if syntactic actions continue from the current context.  */
+      if (yylacEstablished) {
+        return true;
+      } else {
+        yycdebug("LAC: initial context established for " + yytoken.getName());
+        yylacEstablished = true;
+        return yylacCheck(yystack, yytoken);
+      }
+    }
+
+    /** Discard any previous initial lookahead context because of event.
+     * \param event  the event which caused the lookahead to be discarded.
+     *               Only used for debbuging output.  */
+    void yylacDiscard(String event) {
+     /* Discard any previous initial lookahead context because of Event,
+        which may be a lookahead change or an invalidation of the currently
+        established initial context for the current lookahead.
+
+        The most common example of a lookahead change is a shift.  An example
+        of both cases is syntax error recovery.  That is, a syntax error
+        occurs when the lookahead is syntactically erroneous for the
+        currently established initial context, so error recovery manipulates
+        the parser stacks to try to find a new initial context in which the
+        current lookahead is syntactically acceptable.  If it fails to find
+        such a context, it discards the lookahead.  */
+      if (yylacEstablished) {
+        yycdebug("LAC: initial context discarded due to " + event);
+        yylacEstablished = false;
+      }
+    }
+
+    /** The stack for LAC.
+     * Logically, the yylacStack's lifetime is confined to the function
+     * yylacCheck. We just store it as a member of this class to hold
+     * on to the memory and to avoid frequent reallocations.
+     */
+    ArrayList<Integer> yylacStack;
+    /**  Whether an initial LAC context was established. */
+    boolean yylacEstablished;
+]])[
+
+]b4_parse_error_bmatch(
+[detailed\|verbose], [[
+  private int yysyntaxErrorArguments(Context yyctx, SymbolKind[] yyarg, int yyargn) {
+    /* There are many possibilities here to consider:
+       - If this state is a consistent state with a default action,
+         then the only way this function was invoked is if the
+         default action is an error action.  In that case, don't
+         check for expected tokens because there are none.
+       - The only way there can be no lookahead present (in tok) is
+         if this state is a consistent state with a default action.
+         Thus, detecting the absence of a lookahead is sufficient to
+         determine that there is no unexpected or expected token to
+         report.  In that case, just report a simple "syntax error".
+       - Don't assume there isn't a lookahead just because this
+         state is a consistent state with a default action.  There
+         might have been a previous inconsistent state, consistent
+         state with a non-default action, or user semantic action
+         that manipulated yychar.  (However, yychar is currently out
+         of scope during semantic actions.)
+       - Of course, the expected token list depends on states to
+         have correct lookahead information, and it depends on the
+         parser not to perform extra reductions after fetching a
+         lookahead from the scanner and before detecting a syntax
+         error.  Thus, state merging (from LALR or IELR) and default
+         reductions corrupt the expected token list.  However, the
+         list is correct for canonical LR with one exception: it
+         will still contain any token that will not be accepted due
+         to an error action in a later state.
+    */
+    int yycount = 0;
+    if (yyctx.getToken() != null)
+      {
+        if (yyarg != null)
+          yyarg[yycount] = yyctx.getToken();
+        yycount += 1;
+        yycount += yyctx.getExpectedTokens(yyarg, 1, yyargn);
+      }
+    return yycount;
+  }
+]])[
+
+  /**
+   * Build and emit a "syntax error" message in a user-defined way.
+   *
+   * @@param ctx  The context of the error.
+   */
+  private void yyreportSyntaxError(Context yyctx) {]b4_parse_error_bmatch(
+[custom], [[
+      yylexer.reportSyntaxError(yyctx);]],
+[detailed\|verbose], [[
+      if (yyErrorVerbose) {
+          final int argmax = 5;
+          SymbolKind[] yyarg = new SymbolKind[argmax];
+          int yycount = yysyntaxErrorArguments(yyctx, yyarg, argmax);
+          String[] yystr = new String[yycount];
+          for (int yyi = 0; yyi < yycount; ++yyi) {
+              yystr[yyi] = yyarg[yyi].getName();
+          }
+          String yyformat;
+          switch (yycount) {
+              default:
+              case 0: yyformat = ]b4_trans(["syntax error"])[; break;
+              case 1: yyformat = ]b4_trans(["syntax error, unexpected {0}"])[; break;
+              case 2: yyformat = ]b4_trans(["syntax error, unexpected {0}, expecting {1}"])[; break;
+              case 3: yyformat = ]b4_trans(["syntax error, unexpected {0}, expecting {1} or {2}"])[; break;
+              case 4: yyformat = ]b4_trans(["syntax error, unexpected {0}, expecting {1} or {2} or {3}"])[; break;
+              case 5: yyformat = ]b4_trans(["syntax error, unexpected {0}, expecting {1} or {2} or {3} or {4}"])[; break;
+          }
+          yyerror(]b4_locations_if([[yyctx.yylocation, ]])[new MessageFormat(yyformat).format(yystr));
+      } else {
+          yyerror(]b4_locations_if([[yyctx.yylocation, ]])[]b4_trans(["syntax error"])[);
+      }]],
+[simple], [[
+      yyerror(]b4_locations_if([[yyctx.yylocation, ]])[]b4_trans(["syntax error"])[);]])[
   }
 
   /**
    * Whether the given <code>yypact_</code> value indicates a defaulted state.
    * @@param yyvalue   the value to check
    */
-  private static boolean yyPactValueIsDefault (int yyvalue)
-  {
+  private static boolean yyPactValueIsDefault(int yyvalue) {
     return yyvalue == yypact_ninf_;
   }
 
@@ -967,19 +1236,14 @@
    * value indicates a syntax error.
    * @@param yyvalue the value to check
    */
-  private static boolean yyTableValueIsError (int yyvalue)
-  {
+  private static boolean yyTableValueIsError(int yyvalue) {
     return yyvalue == yytable_ninf_;
   }
 
   private static final ]b4_int_type_for([b4_pact])[ yypact_ninf_ = ]b4_pact_ninf[;
   private static final ]b4_int_type_for([b4_table])[ yytable_ninf_ = ]b4_table_ninf[;
 
-  ]b4_parser_tables_define[
-
-  /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-     First, the terminals, then, starting at \a yyntokens_, nonterminals.  */
-  ]b4_typed_parser_table_define([String], [tname], [b4_tname])[
+]b4_parser_tables_define[
 
 ]b4_parse_trace_if([[
   ]b4_integral_parser_table_define([rline], [b4_rline],
@@ -996,50 +1260,44 @@
     int yynrhs = yyr2_[yyrule];
     /* Print the symbols being reduced, and their result.  */
     yycdebug ("Reducing stack by rule " + (yyrule - 1)
-              + " (line " + yylno + "), ");
+              + " (line " + yylno + "):");
 
     /* The symbols being reduced.  */
     for (int yyi = 0; yyi < yynrhs; yyi++)
-      yySymbolPrint ("   $" + (yyi + 1) + " =",
-                     yystos_[yystack.stateAt(yynrhs - (yyi + 1))],
-                     ]b4_rhs_data(yynrhs, yyi + 1)b4_locations_if([,
-                     b4_rhs_location(yynrhs, yyi + 1)])[);
+      yySymbolPrint("   $" + (yyi + 1) + " =",
+                    SymbolKind.get(yystos_[yystack.stateAt(yynrhs - (yyi + 1))]),
+                    ]b4_rhs_data(yynrhs, yyi + 1)b4_locations_if([,
+                    b4_rhs_location(yynrhs, yyi + 1)])[);
   }]])[
 
   /* YYTRANSLATE_(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
      as returned by yylex, with out-of-bounds checking.  */
-  private static final ]b4_int_type_for([b4_translate])[ yytranslate_ (int t)
+  private static final SymbolKind yytranslate_(int t)
 ]b4_api_token_raw_if(dnl
 [[  {
-    return t;
+    return SymbolKind.get(t);
   }
 ]],
 [[  {
-    int user_token_number_max_ = ]b4_user_token_number_max[;
-    ]b4_int_type_for([b4_translate])[ undef_token_ = ]b4_undef_token_number[;
-
+    // Last valid token kind.
+    int code_max = ]b4_code_max[;
     if (t <= 0)
-      return Lexer.EOF;
-    else if (t <= user_token_number_max_)
-      return yytranslate_table_[t];
+      return ]b4_symbol(eof, kind)[;
+    else if (t <= code_max)
+      return SymbolKind.get(yytranslate_table_[t]);
     else
-      return undef_token_;
+      return ]b4_symbol(undef, kind)[;
   }
   ]b4_integral_parser_table_define([translate_table], [b4_translate])[
 ]])[
 
-  private static final ]b4_int_type_for([b4_translate])[ yy_error_token_ = 1;
+  private static final int YYLAST_ = ]b4_last[;
+  private static final int YYEMPTY_ = -2;
+  private static final int YYFINAL_ = ]b4_final_state_number[;
+  private static final int YYNTOKENS_ = ]b4_tokens_number[;
 
-  private static final int yylast_ = ]b4_last[;
-  private static final int yynnts_ = ]b4_nterms_number[;
-  private static final int yyempty_ = -2;
-  private static final int yyfinal_ = ]b4_final_state_number[;
-  private static final int yyntokens_ = ]b4_tokens_number[;
-
-/* User implementation code.  */
-]b4_percent_code_get[]dnl
-
+]b4_percent_code_get[
 }
-
+]b4_percent_code_get([[epilogue]])[]dnl
 b4_epilogue[]dnl
 b4_output_end
diff --git a/data/skeletons/location.cc b/data/skeletons/location.cc
index 0258379..3870b2b 100644
--- a/data/skeletons/location.cc
+++ b/data/skeletons/location.cc
@@ -1,6 +1,6 @@
 # C++ skeleton for Bison
 
-# Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,17 +13,10 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 m4_pushdef([b4_copyright_years],
-           [2002-2015, 2018-2019])
-
-
-# b4_position_file
-# ----------------
-# Name of the file containing the position class, if we want this file.
-b4_defines_if([b4_required_version_if([302], [],
-                                      [m4_define([b4_position_file], [position.hh])])])])
+           [2002-2015, 2018-2021])
 
 
 # b4_location_file
@@ -32,7 +25,7 @@
 # if we want this file.
 b4_percent_define_check_file([b4_location_file],
                              [[api.location.file]],
-                             b4_defines_if([[location.hh]]))
+                             b4_header_if([[location.hh]]))
 
 # b4_location_include
 # -------------------
@@ -48,12 +41,22 @@
                                   ["b4_location_file"])])
  m4_define([b4_location_path],
            b4_percent_define_get([[api.location.include]],
-                                 ["b4_dir_prefix[]b4_location_file"]))
+                                 ["b4_mapped_dir_prefix[]b4_location_file"]))
  m4_define([b4_location_path],
            m4_substr(m4_defn([b4_location_path]), 1, m4_eval(m4_len(m4_defn([b4_location_path])) - 2)))
  ])
 
 
+# b4_position_file
+# ----------------
+# Name of the file containing the position class, if we want this file.
+b4_header_if(
+  [b4_required_version_if(
+    [30200], [],
+    [m4_ifdef([b4_location_file],
+              [m4_define([b4_position_file], [position.hh])])])])
+
+
 
 # b4_location_define
 # ------------------
@@ -63,11 +66,13 @@
   class position
   {
   public:
+    /// Type for file name.
+    typedef ]b4_percent_define_get([[api.filename.type]])[ filename_type;
     /// Type for line and column numbers.
     typedef int counter_type;
 ]m4_ifdef([b4_location_constructors], [[
     /// Construct a position.
-    explicit position (]b4_percent_define_get([[filename_type]])[* f = YY_NULLPTR,
+    explicit position (filename_type* f = YY_NULLPTR,
                        counter_type l = ]b4_location_initial_line[,
                        counter_type c = ]b4_location_initial_column[)
       : filename (f)
@@ -77,7 +82,7 @@
 
 ]])[
     /// Initialization.
-    void initialize (]b4_percent_define_get([[filename_type]])[* fn = YY_NULLPTR,
+    void initialize (filename_type* fn = YY_NULLPTR,
                      counter_type l = ]b4_location_initial_line[,
                      counter_type c = ]b4_location_initial_column[)
     {
@@ -106,7 +111,7 @@
     /** \} */
 
     /// File name to which this position refers.
-    ]b4_percent_define_get([[filename_type]])[* filename;
+    filename_type* filename;
     /// Current line number.
     counter_type line;
     /// Current column number.
@@ -184,6 +189,8 @@
   class location
   {
   public:
+    /// Type for file name.
+    typedef position::filename_type filename_type;
     /// Type for line and column numbers.
     typedef position::counter_type counter_type;
 ]m4_ifdef([b4_location_constructors], [
@@ -200,7 +207,7 @@
     {}
 
     /// Construct a 0-width location in \a f, \a l, \a c.
-    explicit location (]b4_percent_define_get([[filename_type]])[* f,
+    explicit location (filename_type* f,
                        counter_type l = ]b4_location_initial_line[,
                        counter_type c = ]b4_location_initial_column[)
       : begin (f, l, c)
@@ -209,7 +216,7 @@
 
 ])[
     /// Initialization.
-    void initialize (]b4_percent_define_get([[filename_type]])[* f = YY_NULLPTR,
+    void initialize (filename_type* f = YY_NULLPTR,
                      counter_type l = ]b4_location_initial_line[,
                      counter_type c = ]b4_location_initial_column[)
     {
diff --git a/data/skeletons/stack.hh b/data/skeletons/stack.hh
index cb52bcc..9891325 100644
--- a/data/skeletons/stack.hh
+++ b/data/skeletons/stack.hh
@@ -1,6 +1,6 @@
 # C++ skeleton for Bison
 
-# Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,14 +13,14 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 
 # b4_stack_file
 # -------------
 # Name of the file containing the stack class, if we want this file.
-b4_defines_if([b4_required_version_if([302], [],
-                                      [m4_define([b4_stack_file], [stack.hh])])])
+b4_header_if([b4_required_version_if([30200], [],
+                                     [m4_define([b4_stack_file], [stack.hh])])])
 
 
 # b4_stack_define
@@ -32,15 +32,22 @@
     {
     public:
       // Hide our reversed order.
-      typedef typename S::reverse_iterator iterator;
-      typedef typename S::const_reverse_iterator const_iterator;
+      typedef typename S::iterator iterator;
+      typedef typename S::const_iterator const_iterator;
       typedef typename S::size_type size_type;
       typedef typename std::ptrdiff_t index_type;
 
-      stack (size_type n = 200)
+      stack (size_type n = 200) YY_NOEXCEPT
         : seq_ (n)
       {}
 
+#if 201103L <= YY_CPLUSPLUS
+      /// Non copyable.
+      stack (const stack&) = delete;
+      /// Non copyable.
+      stack& operator= (const stack&) = delete;
+#endif
+
       /// Random access.
       ///
       /// Index 0 returns the topmost element.
@@ -91,31 +98,25 @@
         return index_type (seq_.size ());
       }
 
-      std::ptrdiff_t
-      ssize () const YY_NOEXCEPT
-      {
-        return std::ptrdiff_t (size ());
-      }
-
       /// Iterator on top of the stack (going downwards).
       const_iterator
       begin () const YY_NOEXCEPT
       {
-        return seq_.rbegin ();
+        return seq_.begin ();
       }
 
       /// Bottom of the stack.
       const_iterator
       end () const YY_NOEXCEPT
       {
-        return seq_.rend ();
+        return seq_.end ();
       }
 
       /// Present a slice of the top of a stack.
       class slice
       {
       public:
-        slice (const stack& stack, index_type range)
+        slice (const stack& stack, index_type range) YY_NOEXCEPT
           : stack_ (stack)
           , range_ (range)
         {}
@@ -132,8 +133,12 @@
       };
 
     private:
+#if YY_CPLUSPLUS < 201103L
+      /// Non copyable.
       stack (const stack&);
+      /// Non copyable.
       stack& operator= (const stack&);
+#endif
       /// The wrapped container.
       S seq_;
     };
diff --git a/data/skeletons/traceon.m4 b/data/skeletons/traceon.m4
new file mode 100644
index 0000000..344d7d1
--- /dev/null
+++ b/data/skeletons/traceon.m4
@@ -0,0 +1,2 @@
+dnl GNU M4 treats -dV in a position-independent manner.
+m4_debugmode(V)m4_traceon()dnl
diff --git a/data/skeletons/variant.hh b/data/skeletons/variant.hh
index be4a3ce..2a490e8 100644
--- a/data/skeletons/variant.hh
+++ b/data/skeletons/variant.hh
@@ -1,6 +1,6 @@
 # C++ skeleton for Bison
 
-# Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,13 +13,20 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 
 ## --------- ##
 ## variant.  ##
 ## --------- ##
 
+# b4_assert
+# ---------
+# The name of YY_ASSERT.
+m4_define([b4_assert],
+          [b4_api_PREFIX[]_ASSERT])
+
+
 # b4_symbol_variant(YYTYPE, YYVAL, ACTION, [ARGS])
 # ------------------------------------------------
 # Run some ACTION ("build", or "destroy") on YYVAL of symbol type
@@ -71,12 +78,12 @@
 # -------------------
 # The needed includes for variants support.
 m4_define([b4_variant_includes],
-[b4_parse_assert_if([[#include <typeinfo>]])[
-#ifndef YY_ASSERT
+[b4_parse_assert_if([[#include <typeinfo>
+#ifndef ]b4_assert[
 # include <cassert>
-# define YY_ASSERT assert
+# define ]b4_assert[ assert
 #endif
-]])
+]])])
 
 
 
@@ -87,38 +94,45 @@
 
 # b4_value_type_declare
 # ---------------------
-# Define semantic_type.
+# Define value_type.
 m4_define([b4_value_type_declare],
 [[  /// A buffer to store and retrieve objects.
   ///
   /// Sort of a variant, but does not keep track of the nature
   /// of the stored data, since that knowledge is available
   /// via the current parser state.
-  class semantic_type
+  class value_type
   {
   public:
     /// Type of *this.
-    typedef semantic_type self_type;
+    typedef value_type self_type;
 
     /// Empty construction.
-    semantic_type () YY_NOEXCEPT
-      : yybuffer_ ()]b4_parse_assert_if([
+    value_type () YY_NOEXCEPT
+      : yyraw_ ()]b4_parse_assert_if([
       , yytypeid_ (YY_NULLPTR)])[
     {}
 
     /// Construct and fill.
     template <typename T>
-    semantic_type (YY_RVREF (T) t)]b4_parse_assert_if([
+    value_type (YY_RVREF (T) t)]b4_parse_assert_if([
       : yytypeid_ (&typeid (T))])[
-    {
-      YY_ASSERT (sizeof (T) <= size);
+    {]b4_parse_assert_if([[
+      ]b4_assert[ (sizeof (T) <= size);]])[
       new (yyas_<T> ()) T (YY_MOVE (t));
     }
 
+#if 201103L <= YY_CPLUSPLUS
+    /// Non copyable.
+    value_type (const self_type&) = delete;
+    /// Non copyable.
+    self_type& operator= (const self_type&) = delete;
+#endif
+
     /// Destruction, allowed only if empty.
-    ~semantic_type () YY_NOEXCEPT
+    ~value_type () YY_NOEXCEPT
     {]b4_parse_assert_if([
-      YY_ASSERT (!yytypeid_);
+      ]b4_assert[ (!yytypeid_);
     ])[}
 
 # if 201103L <= YY_CPLUSPLUS
@@ -126,10 +140,10 @@
     template <typename T, typename... U>
     T&
     emplace (U&&... u)
-    {]b4_parse_assert_if([
-      YY_ASSERT (!yytypeid_);
-      YY_ASSERT (sizeof (T) <= size);
-      yytypeid_ = & typeid (T);])[
+    {]b4_parse_assert_if([[
+      ]b4_assert[ (!yytypeid_);
+      ]b4_assert[ (sizeof (T) <= size);
+      yytypeid_ = & typeid (T);]])[
       return *new (yyas_<T> ()) T (std::forward <U>(u)...);
     }
 # else
@@ -137,10 +151,10 @@
     template <typename T>
     T&
     emplace ()
-    {]b4_parse_assert_if([
-      YY_ASSERT (!yytypeid_);
-      YY_ASSERT (sizeof (T) <= size);
-      yytypeid_ = & typeid (T);])[
+    {]b4_parse_assert_if([[
+      ]b4_assert[ (!yytypeid_);
+      ]b4_assert[ (sizeof (T) <= size);
+      yytypeid_ = & typeid (T);]])[
       return *new (yyas_<T> ()) T ();
     }
 
@@ -148,10 +162,10 @@
     template <typename T>
     T&
     emplace (const T& t)
-    {]b4_parse_assert_if([
-      YY_ASSERT (!yytypeid_);
-      YY_ASSERT (sizeof (T) <= size);
-      yytypeid_ = & typeid (T);])[
+    {]b4_parse_assert_if([[
+      ]b4_assert[ (!yytypeid_);
+      ]b4_assert[ (sizeof (T) <= size);
+      yytypeid_ = & typeid (T);]])[
       return *new (yyas_<T> ()) T (t);
     }
 # endif
@@ -178,10 +192,10 @@
     template <typename T>
     T&
     as () YY_NOEXCEPT
-    {]b4_parse_assert_if([
-      YY_ASSERT (yytypeid_);
-      YY_ASSERT (*yytypeid_ == typeid (T));
-      YY_ASSERT (sizeof (T) <= size);])[
+    {]b4_parse_assert_if([[
+      ]b4_assert[ (yytypeid_);
+      ]b4_assert[ (*yytypeid_ == typeid (T));
+      ]b4_assert[ (sizeof (T) <= size);]])[
       return *yyas_<T> ();
     }
 
@@ -189,10 +203,10 @@
     template <typename T>
     const T&
     as () const YY_NOEXCEPT
-    {]b4_parse_assert_if([
-      YY_ASSERT (yytypeid_);
-      YY_ASSERT (*yytypeid_ == typeid (T));
-      YY_ASSERT (sizeof (T) <= size);])[
+    {]b4_parse_assert_if([[
+      ]b4_assert[ (yytypeid_);
+      ]b4_assert[ (*yytypeid_ == typeid (T));
+      ]b4_assert[ (sizeof (T) <= size);]])[
       return *yyas_<T> ();
     }
 
@@ -207,9 +221,9 @@
     template <typename T>
     void
     swap (self_type& that) YY_NOEXCEPT
-    {]b4_parse_assert_if([
-      YY_ASSERT (yytypeid_);
-      YY_ASSERT (*yytypeid_ == *that.yytypeid_);])[
+    {]b4_parse_assert_if([[
+      ]b4_assert[ (yytypeid_);
+      ]b4_assert[ (*yytypeid_ == *that.yytypeid_);]])[
       std::swap (as<T> (), that.as<T> ());
     }
 
@@ -258,16 +272,19 @@
     }
 
   private:
-    /// Prohibit blind copies.
+#if YY_CPLUSPLUS < 201103L
+    /// Non copyable.
+    value_type (const self_type&);
+    /// Non copyable.
     self_type& operator= (const self_type&);
-    semantic_type (const self_type&);
+#endif
 
     /// Accessor to raw memory as \a T.
     template <typename T>
     T*
     yyas_ () YY_NOEXCEPT
     {
-      void *yyp = yybuffer_.yyraw;
+      void *yyp = yyraw_;
       return static_cast<T*> (yyp);
      }
 
@@ -276,7 +293,7 @@
     const T*
     yyas_ () const YY_NOEXCEPT
     {
-      const void *yyp = yybuffer_.yyraw;
+      const void *yyp = yyraw_;
       return static_cast<const T*> (yyp);
      }
 
@@ -291,10 +308,10 @@
     union
     {
       /// Strongest alignment constraints.
-      long double yyalign_me;
+      long double yyalign_me_;
       /// A buffer large enough to store any of the semantic values.
-      char yyraw[size];
-    } yybuffer_;]b4_parse_assert_if([
+      char yyraw_[size];
+    };]b4_parse_assert_if([
 
     /// Whether the content is built: if defined, the name of the stored type.
     const std::type_info *yytypeid_;])[
@@ -378,18 +395,74 @@
 ])])
 
 
-m4_define([_b4_type_clause],
-[b4_symbol_if([$1], [is_token],
-              [b4_symbol_if([$1], [has_id],
-                            [tok == token::b4_symbol([$1], [id])],
-                            [tok == b4_symbol([$1], [user_number])])])])
+# b4_token_kind(SYMBOL-NUM)
+# -------------------------
+# Some tokens don't have an ID.
+m4_define([b4_token_kind],
+[b4_symbol_if([$1], [has_id],
+              [token::b4_symbol([$1], [id])],
+              [b4_symbol([$1], [code])])])
 
 
-# _b4_token_constructor_define(SYMBOL-NUM...)
-# -------------------------------------------
-# Define a unique make_symbol for all the SYMBOL-NUM (they
+# _b4_tok_in(SYMBOL-NUM, ...)
+# ---------------------------
+# See b4_tok_in below.  The SYMBOL-NUMs... are tokens only.
+#
+# We iterate over the tokens to group them by "range" of token numbers (not
+# symbols numbers!).
+#
+# b4_fst is the start of that range.
+# b4_prev is the previous value.
+# b4_val is the current value.
+# If b4_val is the successor of b4_prev in token numbers, update the latter,
+#   otherwise emit the code for range b4_fst .. b4_prev.
+# $1 is also used as a terminator in the foreach, but it will not be printed.
+#
+m4_define([_b4_tok_in],
+[m4_pushdef([b4_prev], [$1])dnl
+m4_pushdef([b4_fst], [$1])dnl
+m4_pushdef([b4_sep], [])dnl
+m4_foreach([b4_val], m4_dquote(m4_shift($@, $1)),
+           [m4_if(b4_symbol(b4_val, [code]), m4_eval(b4_symbol(b4_prev, [code]) + 1), [],
+                  [b4_sep[]m4_if(b4_fst, b4_prev,
+                         [tok == b4_token_kind(b4_fst)],
+                         [(b4_token_kind(b4_fst) <= tok && tok <= b4_token_kind(b4_prev))])[]dnl
+m4_define([b4_fst], b4_val)dnl
+m4_define([b4_sep], [
+                   || ])])dnl
+m4_define([b4_prev], b4_val)])dnl
+m4_popdef([b4_sep])dnl
+m4_popdef([b4_fst])dnl
+m4_popdef([b4_prev])dnl
+])
+
+
+# _b4_filter_tokens(SYMBOL-NUM, ...)
+# ----------------------------------
+# Expand as the list of tokens amongst SYMBOL-NUM.
+m4_define([_b4_filter_tokens],
+[m4_pushdef([b4_sep])dnl
+m4_foreach([b4_val], [$@],
+           [b4_symbol_if(b4_val, [is_token], [b4_sep[]b4_val[]m4_define([b4_sep], [,])])])dnl
+m4_popdef([b4_sep])dnl
+])
+
+
+# b4_tok_in(SYMBOL-NUM, ...)
+# ---------------------------
+# A C++ conditional that checks that `tok` is a member of this list of symbol
+# numbers.
+m4_define([b4_tok_in],
+          [_$0(_b4_filter_tokens($@))])
+
+
+
+
+# _b4_symbol_constructor_define(SYMBOL-NUM...)
+# --------------------------------------------
+# Define a symbol_type constructor common to all the SYMBOL-NUM (they
 # have the same type).  Use at class-level.
-m4_define([_b4_token_constructor_define],
+m4_define([_b4_symbol_constructor_define],
 [m4_ifval(_b4_includes_tokens($@),
 [[#if 201103L <= YY_CPLUSPLUS
       symbol_type (]b4_join(
@@ -397,25 +470,24 @@
           b4_symbol_if([$1], [has_type],
                        [b4_symbol([$1], [type]) v]),
           b4_locations_if([location_type l]))[)
-        : super_type(]b4_join([token_type (tok)],
-                              b4_symbol_if([$1], [has_type], [std::move (v)]),
-                              b4_locations_if([std::move (l)]))[)
-      {
-        YY_ASSERT (]m4_join([ || ], m4_map_sep([_b4_type_clause], [, ], [$@]))[);
-      }
+        : super_type (]b4_join([token_kind_type (tok)],
+                               b4_symbol_if([$1], [has_type], [std::move (v)]),
+                               b4_locations_if([std::move (l)]))[)
 #else
       symbol_type (]b4_join(
           [int tok],
           b4_symbol_if([$1], [has_type],
                        [const b4_symbol([$1], [type])& v]),
           b4_locations_if([const location_type& l]))[)
-        : super_type(]b4_join([token_type (tok)],
-                              b4_symbol_if([$1], [has_type], [v]),
-                              b4_locations_if([l]))[)
-      {
-        YY_ASSERT (]m4_join([ || ], m4_map_sep([_b4_type_clause], [, ], [$@]))[);
-      }
+        : super_type (]b4_join([token_kind_type (tok)],
+                               b4_symbol_if([$1], [has_type], [v]),
+                               b4_locations_if([l]))[)
 #endif
+      {]b4_parse_assert_if([[
+#if !defined _MSC_VER || defined __clang__
+        ]b4_assert[ (]b4_tok_in($@)[);
+#endif
+      ]])[}
 ]])])
 
 
@@ -447,7 +519,7 @@
 
 # b4_token_constructor_define
 # ---------------------------
-# Define the overloaded versions of make_symbol for all the value types.
+# Define the overloaded versions of make_FOO for all the token kinds.
 m4_define([b4_token_constructor_define],
-[    // Implementation of make_symbol for each symbol type.
+[    // Implementation of make_symbol for each token kind.
 b4_symbol_foreach([_b4_token_maker_define])])
diff --git a/data/skeletons/yacc.c b/data/skeletons/yacc.c
index 2830c1d..64b9ac6 100644
--- a/data/skeletons/yacc.c
+++ b/data/skeletons/yacc.c
@@ -1,11 +1,11 @@
 #                                                            -*- C -*-
 # Yacc compatible skeleton for Bison
 
-# Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software
+# Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software
 # Foundation, Inc.
 
 m4_pushdef([b4_copyright_years],
-           [1984, 1989-1990, 2000-2015, 2018-2019])
+           [1984, 1989-1990, 2000-2015, 2018-2021])
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,10 +18,11 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 m4_include(b4_skeletonsdir/[c.m4])
 
+
 ## ---------- ##
 ## api.pure.  ##
 ## ---------- ##
@@ -48,6 +49,10 @@
 ## api.push-pull.  ##
 ## --------------- ##
 
+# b4_pull_if, b4_push_if
+# ----------------------
+# Whether the pull/push APIs are needed.  Both can be enabled.
+
 b4_percent_define_default([[api.push-pull]], [[pull]])
 b4_percent_define_check_values([[[[api.push-pull]],
                                  [[pull]], [[push]], [[both]]]])
@@ -97,6 +102,16 @@
                           [1], [m4_ifset([b4_parse_param], [$1])],
                           [2], [$1])])])
 
+# b4_yyerror_formals
+# ------------------
+m4_define([b4_yyerror_formals],
+[b4_pure_if([b4_locations_if([, [[const ]b4_api_PREFIX[LTYPE *yyllocp], [&yylloc]]])[]dnl
+m4_ifdef([b4_parse_param], [, b4_parse_param])[]dnl
+,])dnl
+[[const char *msg], [msg]]])
+
+
+
 # b4_yyerror_args
 # ---------------
 # Arguments passed to yyerror: user args plus yylloc.
@@ -111,6 +126,16 @@
 ## ----------------- ##
 
 
+# b4_accept([SYMBOL-NUM])
+# -----------------------
+# Used in actions of the rules of accept, the initial symbol, to call
+# YYACCEPT.  If SYMBOL-NUM is specified, run "yyvalue->SLOT = $2;"
+# before, using the slot of SYMBOL-NUM.
+m4_define([b4_accept],
+[m4_ifval([$1],
+          [b4_symbol_value(yyimpl->yyvalue, [$1]) = b4_rhs_value(2, 1, [$1]); ]) YYACCEPT])
+
+
 # b4_lhs_value(SYMBOL-NUM, [TYPE])
 # --------------------------------
 # See README.
@@ -132,6 +157,7 @@
 # b4_lhs_location()
 # -----------------
 # Expansion of @$.
+# Overparenthetized to avoid obscure problems with "foo$$bar = foo$1bar".
 m4_define([b4_lhs_location],
 [(yyloc)])
 
@@ -140,6 +166,7 @@
 # ---------------------------------
 # Expansion of @POS, where the current rule has RULE-LENGTH symbols
 # on RHS.
+# Overparenthetized to avoid obscure problems with "foo$$bar = foo$1bar".
 m4_define([b4_rhs_location],
 [(yylsp@{b4_subtract([$2], [$1])@})])
 
@@ -148,14 +175,61 @@
 ## Declarations.  ##
 ## -------------- ##
 
+# _b4_declare_sub_yyparse(START-SYMBOL-NUM, SWITCHING-TOKEN-SYMBOL-NUM)
+# ---------------------------------------------------------------------
+# Define the return type of the parsing function for SYMBOL-NUM, and
+# declare its parsing function.
+m4_define([_b4_declare_sub_yyparse],
+[[
+// Return type when parsing one ]_b4_symbol($1, tag)[.
+typedef struct
+{]b4_symbol_if([$1], [has_type], [[
+  ]_b4_symbol($1, type)[ yyvalue;]])[
+  int yystatus;
+  int yynerrs;
+} ]b4_prefix[parse_]_b4_symbol($1, id)[_t;
+
+// Parse one ]_b4_symbol($1, tag)[.
+]b4_prefix[parse_]_b4_symbol($1, id)[_t ]b4_prefix[parse_]_b4_symbol($1, id)[ (]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param)], [void])[);
+]])
+
+
+# _b4_first_switching_token
+# -------------------------
+m4_define([b4_first], [$1])
+m4_define([b4_second], [$2])
+m4_define([_b4_first_switching_token],
+[b4_second(b4_first(b4_start_symbols))])
+
+
+# _b4_define_sub_yyparse(START-SYMBOL-NUM, SWITCHING-TOKEN-SYMBOL-NUM)
+# --------------------------------------------------------------------
+# Define the parsing function for START-SYMBOL-NUM.
+m4_define([_b4_define_sub_yyparse],
+[[
+]b4_prefix[parse_]_b4_symbol($1, id)[_t
+]b4_prefix[parse_]_b4_symbol($1, id)[ (]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param)], [void])[)
+{
+  ]b4_prefix[parse_]_b4_symbol($1, id)[_t yyres;
+  yy_parse_impl_t yyimpl;
+  yyres.yystatus = yy_parse_impl (]b4_symbol($2, id)[, &yyimpl]m4_ifset([b4_parse_param],
+                           [[, ]b4_args(b4_parse_param)])[);]b4_symbol_if([$1], [has_type], [[
+  yyres.yyvalue = yyimpl.yyvalue.]b4_symbol($1, slot)[;]])[
+  yyres.yynerrs = yyimpl.yynerrs;
+  return yyres;
+}
+]])
+
+
 # b4_declare_scanner_communication_variables
 # ------------------------------------------
 # Declare the variables that are global, or local to YYPARSE if
 # pure-parser.
 m4_define([b4_declare_scanner_communication_variables], [[
-/* The lookahead symbol.  */
+]m4_ifdef([b4_start_symbols], [],
+[[/* Lookahead token kind.  */
 int yychar;
-
+]])[
 ]b4_pure_if([[
 /* The semantic value of the lookahead symbol.  */
 /* Default value used for initialization, for pacifying older GCCs
@@ -174,49 +248,79 @@
 int yynerrs;]])])
 
 
-# b4_declare_parser_state_variables
-# ---------------------------------
+# b4_declare_parser_state_variables([INIT])
+# -----------------------------------------
 # Declare all the variables that are needed to maintain the parser state
 # between calls to yypush_parse.
-m4_define([b4_declare_parser_state_variables], [b4_pure_if([[
+# If INIT is non-null, initialize these variables.
+m4_define([b4_declare_parser_state_variables],
+[b4_pure_if([[
     /* Number of syntax errors so far.  */
-    int yynerrs;
+    int yynerrs]m4_ifval([$1], [ = 0])[;
 ]])[
-    yy_state_fast_t yystate;
+    yy_state_fast_t yystate]m4_ifval([$1], [ = 0])[;
     /* Number of tokens to shift before error messages enabled.  */
-    int yyerrstatus;
+    int yyerrstatus]m4_ifval([$1], [ = 0])[;
 
-    /* The stacks and their tools:
-       'yyss': related to states.
-       'yyvs': related to semantic values.]b4_locations_if([[
-       'yyls': related to locations.]])[
-
-       Refer to the stacks through separate pointers, to allow yyoverflow
+    /* Refer to the stacks through separate pointers, to allow yyoverflow
        to reallocate them elsewhere.  */
 
-    /* The state stack.  */
+    /* Their size.  */
+    YYPTRDIFF_T yystacksize]m4_ifval([$1], [ = YYINITDEPTH])[;
+
+    /* The state stack: array, bottom, top.  */
     yy_state_t yyssa[YYINITDEPTH];
-    yy_state_t *yyss;
-    yy_state_t *yyssp;
+    yy_state_t *yyss]m4_ifval([$1], [ = yyssa])[;
+    yy_state_t *yyssp]m4_ifval([$1], [ = yyss])[;
 
-    /* The semantic value stack.  */
+    /* The semantic value stack: array, bottom, top.  */
     YYSTYPE yyvsa[YYINITDEPTH];
-    YYSTYPE *yyvs;
-    YYSTYPE *yyvsp;]b4_locations_if([[
+    YYSTYPE *yyvs]m4_ifval([$1], [ = yyvsa])[;
+    YYSTYPE *yyvsp]m4_ifval([$1], [ = yyvs])[;]b4_locations_if([[
 
-    /* The location stack.  */
+    /* The location stack: array, bottom, top.  */
     YYLTYPE yylsa[YYINITDEPTH];
-    YYLTYPE *yyls;
-    YYLTYPE *yylsp;
-
-    /* The locations where the error started and ended.  */
-    YYLTYPE yyerror_range[3];]])[
-
-    YYPTRDIFF_T yystacksize;]b4_lac_if([[
+    YYLTYPE *yyls]m4_ifval([$1], [ = yylsa])[;
+    YYLTYPE *yylsp]m4_ifval([$1], [ = yyls])[;]])[]b4_lac_if([[
 
     yy_state_t yyesa@{]b4_percent_define_get([[parse.lac.es-capacity-initial]])[@};
-    yy_state_t *yyes;
-    YYPTRDIFF_T yyes_capacity;]])])
+    yy_state_t *yyes]m4_ifval([$1], [ = yyesa])[;
+    YYPTRDIFF_T yyes_capacity][]m4_ifval([$1],
+            [m4_do([ = b4_percent_define_get([[parse.lac.es-capacity-initial]]) < YYMAXDEPTH],
+                   [ ? b4_percent_define_get([[parse.lac.es-capacity-initial]])],
+                   [ : YYMAXDEPTH])])[;]])])
+
+
+m4_define([b4_macro_define],
+[[#]define $1 $2])
+
+m4_define([b4_macro_undef],
+[[#]undef $1])
+
+m4_define([b4_pstate_macro_define],
+[b4_macro_define([$1], [yyps->$1])])
+
+# b4_parse_state_variable_macros(b4_macro_define|b4_macro_undef)
+# --------------------------------------------------------------
+m4_define([b4_parse_state_variable_macros],
+[b4_pure_if([$1([b4_prefix[]nerrs])])
+$1([yystate])
+$1([yyerrstatus])
+$1([yyssa])
+$1([yyss])
+$1([yyssp])
+$1([yyvsa])
+$1([yyvs])
+$1([yyvsp])[]b4_locations_if([
+$1([yylsa])
+$1([yyls])
+$1([yylsp])])
+$1([yystacksize])[]b4_lac_if([
+$1([yyesa])
+$1([yyes])
+$1([yyes_capacity])])])
+
+
 
 
 # _b4_declare_yyparse_push
@@ -231,27 +335,23 @@
 
 typedef struct ]b4_prefix[pstate ]b4_prefix[pstate;
 
-]b4_pull_if([b4_function_declare([b4_prefix[parse]], [[int]], b4_parse_param)
-])b4_function_declare([b4_prefix[push_parse]], [[int]],
-  [[b4_prefix[pstate *ps]], [[ps]]]b4_pure_if([,
-  [[[int pushed_char]], [[pushed_char]]],
-  [[b4_api_PREFIX[STYPE const *pushed_val]], [[pushed_val]]]b4_locations_if([,
-  [[b4_api_PREFIX[LTYPE *pushed_loc]], [[pushed_loc]]]])])m4_ifset([b4_parse_param], [,
-  b4_parse_param]))
-b4_pull_if([b4_function_declare([b4_prefix[pull_parse]], [[int]],
-  [[b4_prefix[pstate *ps]], [[ps]]]m4_ifset([b4_parse_param], [,
-  b4_parse_param]))])
-b4_function_declare([b4_prefix[pstate_new]], [b4_prefix[pstate *]],
-                    [[[void]], []])
-b4_function_declare([b4_prefix[pstate_delete]], [[void]],
-                   [[b4_prefix[pstate *ps]], [[ps]]])dnl
-])
+]b4_pull_if([[
+int ]b4_prefix[parse (]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param)], [void])[);]])[
+int ]b4_prefix[push_parse (]b4_prefix[pstate *ps]b4_pure_if([[,
+                  int pushed_char, ]b4_api_PREFIX[STYPE const *pushed_val]b4_locations_if([[, ]b4_api_PREFIX[LTYPE *pushed_loc]])])b4_user_formals[);
+]b4_pull_if([[int ]b4_prefix[pull_parse (]b4_prefix[pstate *ps]b4_user_formals[);]])[
+]b4_prefix[pstate *]b4_prefix[pstate_new (void);
+void ]b4_prefix[pstate_delete (]b4_prefix[pstate *ps);
+]])
+
 
 # _b4_declare_yyparse
 # -------------------
 # When not the push parser.
 m4_define([_b4_declare_yyparse],
-[b4_function_declare(b4_prefix[parse], [int], b4_parse_param)])
+[[int ]b4_prefix[parse (]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param)], [void])[);
+]m4_ifdef([b4_start_symbols],
+          [m4_map([_b4_declare_sub_yyparse], m4_defn([b4_start_symbols]))])])
 
 
 # b4_declare_yyparse
@@ -262,19 +362,35 @@
 ])
 
 
+# b4_declare_yyerror_and_yylex
+# ----------------------------
+# Comply with POSIX Yacc.
+# <https://austingroupbugs.net/view.php?id=1388#c5220>
+m4_define([b4_declare_yyerror_and_yylex],
+[b4_posix_if([[#if !defined ]b4_prefix[error && !defined ]b4_api_PREFIX[ERROR_IS_DECLARED
+]b4_function_declare([b4_prefix[error]], void, b4_yyerror_formals)[
+#endif
+#if !defined ]b4_prefix[lex && !defined ]b4_api_PREFIX[LEX_IS_DECLARED
+]b4_function_declare([b4_prefix[lex]], int, b4_yylex_formals)[
+#endif
+]])dnl
+])
+
+
 # b4_shared_declarations
 # ----------------------
-# Declaration that might either go into the header (if --defines)
-# or open coded in the parser body.
+# Declarations that might either go into the header (if --header)
+# or into the implementation file.
 m4_define([b4_shared_declarations],
-[b4_cpp_guard_open([b4_spec_header_file])[
+[b4_cpp_guard_open([b4_spec_mapped_header_file])[
 ]b4_declare_yydebug[
 ]b4_percent_code_get([[requires]])[
 ]b4_token_enums_defines[
 ]b4_declare_yylstype[
+]b4_declare_yyerror_and_yylex[
 ]b4_declare_yyparse[
 ]b4_percent_code_get([[provides]])[
-]b4_cpp_guard_close([b4_spec_header_file])[]dnl
+]b4_cpp_guard_close([b4_spec_mapped_header_file])[]dnl
 ])
 
 
@@ -289,7 +405,7 @@
                                    [$2])],
           [$2])])
 
-m4_if(b4_spec_header_file, [[y.tab.h]],
+m4_if(b4_spec_header_file, [y.tab.h], [],
       [b4_percent_define_default([[api.header.include]],
                                  [["@basename(]b4_spec_header_file[@)"]])])
 
@@ -301,19 +417,20 @@
 ## -------------- ##
 
 
-b4_defines_if([[
+b4_header_if([[
 ]b4_output_begin([b4_spec_header_file])[
 ]b4_copyright([Bison interface for Yacc-like parsers in C])[
 ]b4_disclaimer[
 ]b4_shared_declarations[
 ]b4_output_end[
-]])# b4_defines_if
+]])# b4_header_if
 
 b4_output_begin([b4_parser_file_name])[
 ]b4_copyright([Bison implementation for Yacc-like parsers in C])[
 /* C LALR(1) parser skeleton written by Richard Stallman, by
    simplifying the original so-called "semantic" parser.  */
 
+]b4_disclaimer[
 /* All symbols defined below should begin with yy or YY, to avoid
    infringing on user name space.  This should be done even for local
    variables, as they might otherwise be expanded by user macros.
@@ -321,7 +438,6 @@
    define necessary library symbols; they are noted "INFRINGES ON
    USER NAME SPACE" below.  */
 
-]b4_disclaimer[
 ]b4_identification[
 ]b4_percent_code_get([[top]])[]dnl
 m4_if(b4_api_prefix, [yy], [],
@@ -334,6 +450,7 @@
 #define yypush_parse    ]b4_prefix[push_parse]b4_pull_if([[
 #define yypull_parse    ]b4_prefix[pull_parse]])[
 #define yypstate_new    ]b4_prefix[pstate_new
+#define yypstate_clear  ]b4_prefix[pstate_clear
 #define yypstate_delete ]b4_prefix[pstate_delete
 #define yypstate        ]b4_prefix[pstate]])[
 #define yylex           ]b4_prefix[lex
@@ -348,65 +465,18 @@
 ]b4_cast_define[
 ]b4_null_define[
 
-/* Enabling verbose error messages.  */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[
-#endif
-
 ]b4_header_include_if([[#include ]b4_percent_define_get([[api.header.include]])],
                       [m4_ifval(m4_quote(b4_spec_header_file),
                                 [/* Use api.header.include to #include this header
    instead of duplicating it here.  */
 ])b4_shared_declarations])[
+]b4_declare_symbol_enum[
 
 ]b4_user_post_prologue[
-]b4_percent_code_get[]dnl
-
-[#ifdef short
-# undef short
-#endif
-
+]b4_percent_code_get[
 ]b4_c99_int_type_define[
 
-#ifndef YYPTRDIFF_T
-# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
-#  define YYPTRDIFF_T __PTRDIFF_TYPE__
-#  define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
-# elif defined PTRDIFF_MAX
-#  ifndef ptrdiff_t
-#   include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-#  endif
-#  define YYPTRDIFF_T ptrdiff_t
-#  define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
-# else
-#  define YYPTRDIFF_T long
-#  define YYPTRDIFF_MAXIMUM LONG_MAX
-# endif
-#endif
-
-#ifndef YYSIZE_T
-# ifdef __SIZE_TYPE__
-#  define YYSIZE_T __SIZE_TYPE__
-# elif defined size_t
-#  define YYSIZE_T size_t
-# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
-#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-#  define YYSIZE_T size_t
-# else
-#  define YYSIZE_T unsigned
-# endif
-#endif
-
-#define YYSIZE_MAXIMUM                                  \
-  YY_CAST (YYPTRDIFF_T,                                 \
-           (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1)  \
-            ? YYPTRDIFF_MAXIMUM                         \
-            : YY_CAST (YYSIZE_T, -1)))
-
-#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
+]b4_sizes_types_define[
 
 /* Stored state numbers (used for stacks). */
 typedef ]b4_int_type(0, m4_eval(b4_states_number - 1))[ yy_state_t;
@@ -425,6 +495,11 @@
 #  define YY_(Msgid) Msgid
 # endif
 #endif
+]b4_has_translations_if([
+#ifndef N_
+# define N_(Msgid) Msgid
+#endif
+])[
 
 ]b4_attribute_define[
 
@@ -437,7 +512,7 @@
 ]],
 [[#define YY_ASSERT(E) ((void) (0 && (E)))]])[
 
-#if ]b4_lac_if([[1]], [[! defined yyoverflow || YYERROR_VERBOSE]])[
+#if ]b4_lac_if([[1]], [b4_parse_error_case([simple], [[!defined yyoverflow]], [[1]])])[
 
 /* The parser invokes alloca or malloc; define the necessary symbols.  */]dnl
 b4_push_if([], [b4_lac_if([], [[
@@ -504,8 +579,7 @@
 #  endif
 # endif]b4_lac_if([[
 # define YYCOPY_NEEDED 1]])[
-#endif]b4_lac_if([], [[ /* ! defined yyoverflow || YYERROR_VERBOSE */]])[
-
+#endif /* ]b4_lac_if([[1]], [b4_parse_error_case([simple], [[!defined yyoverflow]], [[1]])])[ */
 
 #if (! defined yyoverflow \
      && (! defined __cplusplus \
@@ -588,16 +662,18 @@
 /* YYNSTATES -- Number of states.  */
 #define YYNSTATES  ]b4_states_number[
 
-#define YYUNDEFTOK  ]b4_undef_token_number[
-#define YYMAXUTOK   ]b4_user_token_number_max[
+/* YYMAXUTOK -- Last valid token kind.  */
+#define YYMAXUTOK   ]b4_code_max[
 
 
 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
    as returned by yylex, with out-of-bounds checking.  */
 ]b4_api_token_raw_if(dnl
-[[#define YYTRANSLATE(YYX) (YYX)]],
-[[#define YYTRANSLATE(YYX)                                                \
-  (0 <= (YYX) && (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+[[#define YYTRANSLATE(YYX) YY_CAST (yysymbol_kind_t, YYX)]],
+[[#define YYTRANSLATE(YYX)                                \
+  (0 <= (YYX) && (YYX) <= YYMAXUTOK                     \
+   ? YY_CAST (yysymbol_kind_t, yytranslate[YYX])        \
+   : ]b4_symbol_prefix[YYUNDEF)
 
 /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
    as returned by yylex.  */
@@ -611,23 +687,46 @@
      [[YYRLINE[YYN] -- Source line where rule number YYN was defined.]])[
 #endif
 
-#if ]b4_api_PREFIX[DEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+/** Accessing symbol of state STATE.  */
+#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
+
+#if ]b4_parse_error_case([simple], [b4_api_PREFIX[DEBUG || ]b4_token_table_flag], [[1]])[
+/* The user-facing name of the symbol whose (internal) number is
+   YYSYMBOL.  No bounds checking.  */
+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
+
+]b4_parse_error_bmatch([simple\|verbose],
+[[/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
 {
   ]b4_tname[
 };
-#endif
 
-# ifdef YYPRINT
-/* YYTOKNUM[NUM] -- (External) token number corresponding to the
-   (internal) symbol number NUM (which must be that of a token).  */
-static const ]b4_int_type_for([b4_toknum])[ yytoknum[] =
+static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
 {
-  ]b4_toknum[
-};
-# endif
+  return yytname[yysymbol];
+}]],
+[[static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
+{
+  static const char *const yy_sname[] =
+  {
+  ]b4_symbol_names[
+  };]b4_has_translations_if([[
+  /* YYTRANSLATABLE[SYMBOL-NUM] -- Whether YY_SNAME[SYMBOL-NUM] is
+     internationalizable.  */
+  static ]b4_int_type_for([b4_translatable])[ yytranslatable[] =
+  {
+  ]b4_translatable[
+  };
+  return (yysymbol < YYNTOKENS && yytranslatable[yysymbol]
+          ? _(yy_sname[yysymbol])
+          : yy_sname[yysymbol]);]], [[
+  return yy_sname[yysymbol];]])[
+}]])[
+#endif
 
 #define YYPACT_NINF (]b4_pact_ninf[)
 
@@ -641,21 +740,22 @@
 
 ]b4_parser_tables_define[
 
+enum { YYENOMEM = -2 };
+
 #define yyerrok         (yyerrstatus = 0)
-#define yyclearin       (yychar = YYEMPTY)
-#define YYEMPTY         (-2)
-#define YYEOF           0
+#define yyclearin       (yychar = ]b4_symbol(empty, id)[)
 
 #define YYACCEPT        goto yyacceptlab
 #define YYABORT         goto yyabortlab
 #define YYERROR         goto yyerrorlab
+#define YYNOMEM         goto yyexhaustedlab
 
 
 #define YYRECOVERING()  (!!yyerrstatus)
 
 #define YYBACKUP(Token, Value)                                    \
   do                                                              \
-    if (yychar == YYEMPTY)                                        \
+    if (yychar == ]b4_symbol(empty, id)[)                                        \
       {                                                           \
         yychar = (Token);                                         \
         yylval = (Value);                                         \
@@ -671,10 +771,9 @@
       }                                                           \
   while (0)
 
-/* Error token number */
-#define YYTERROR        1
-#define YYERRCODE       256
-
+/* Backward compatibility with an undocumented macro.
+   Use ]b4_symbol(error, id)[ or ]b4_symbol(undef, id)[. */
+#define YYERRCODE ]b4_symbol(undef, id)[
 ]b4_locations_if([[
 ]b4_yylloc_default_define[
 #define YYRHSLOC(Rhs, K) ((Rhs)[K])
@@ -694,15 +793,15 @@
     YYFPRINTF Args;                             \
 } while (0)
 
-]b4_yy_location_print_define[
+]b4_yylocation_print_define[
 
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)                    \
 do {                                                                      \
   if (yydebug)                                                            \
     {                                                                     \
       YYFPRINTF (stderr, "%s ", Title);                                   \
       yy_symbol_print (stderr,                                            \
-                  Type, Value]b4_locations_if([, Location])[]b4_user_args[); \
+                  Kind, Value]b4_locations_if([, Location])[]b4_user_args[); \
       YYFPRINTF (stderr, "\n");                                           \
     }                                                                     \
 } while (0)
@@ -714,9 +813,8 @@
 | TOP (included).                                                   |
 `------------------------------------------------------------------*/
 
-]b4_function_define([yy_stack_print], [static void],
-                   [[yy_state_t *yybottom], [yybottom]],
-                   [[yy_state_t *yytop],    [yytop]])[
+static void
+yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
 {
   YYFPRINTF (stderr, "Stack now");
   for (; yybottom <= yytop; yybottom++)
@@ -738,12 +836,9 @@
 | Report that the YYRULE is going to be reduced.  |
 `------------------------------------------------*/
 
-]b4_function_define([yy_reduce_print], [static void],
-                   [[yy_state_t *yyssp], [yyssp]],
-                   [[YYSTYPE *yyvsp], [yyvsp]],
-    b4_locations_if([[[YYLTYPE *yylsp], [yylsp]],
-                   ])[[int yyrule], [yyrule]]m4_ifset([b4_parse_param], [,
-                   b4_parse_param]))[
+static void
+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,]b4_locations_if([[ YYLTYPE *yylsp,]])[
+                 int yyrule]b4_user_formals[)
 {
   int yylno = yyrline[yyrule];
   int yynrhs = yyr2[yyrule];
@@ -755,10 +850,9 @@
     {
       YYFPRINTF (stderr, "   $%d = ", yyi + 1);
       yy_symbol_print (stderr,
-                       yystos[yyssp[yyi + 1 - yynrhs]],
-                       &]b4_rhs_value(yynrhs, yyi + 1)[
-                       ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
-                       b4_user_args[);
+                       YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
+                       &]b4_rhs_value(yynrhs, yyi + 1)[]b4_locations_if([,
+                       &]b4_rhs_location(yynrhs, yyi + 1))[]b4_user_args[);
       YYFPRINTF (stderr, "\n");
     }
 }
@@ -773,8 +867,8 @@
    multiple parsers can coexist.  */
 int yydebug;
 #else /* !]b4_api_PREFIX[DEBUG */
-# define YYDPRINTF(Args)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YYDPRINTF(Args) ((void) 0)
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
 # define YY_STACK_PRINT(Bottom, Top)
 # define YY_REDUCE_PRINT(Rule)
 #endif /* !]b4_api_PREFIX[DEBUG */
@@ -794,7 +888,18 @@
 
 #ifndef YYMAXDEPTH
 # define YYMAXDEPTH ]b4_stack_depth_max[
-#endif]b4_lac_if([[
+#endif]b4_push_if([[
+/* Parser data structure.  */
+struct yypstate
+  {]b4_declare_parser_state_variables[
+    /* Whether this instance has not started parsing yet.
+     * If 2, it corresponds to a finished parsing.  */
+    int yynew;
+  };]b4_pure_if([], [[
+
+/* Whether the only allowed instance of yypstate is allocated.  */
+static char yypstate_allocated = 0;]])])[
+]b4_lac_if([[
 
 /* Given a state stack such that *YYBOTTOM is its bottom, such that
    *YYTOP is either its top or is YYTOP_EMPTY to indicate an empty
@@ -805,7 +910,7 @@
    *YYTOP, and *YYCAPACITY to reflect the new capacity and memory
    location.  If *YYBOTTOM != YYBOTTOM_NO_FREE, then free the old stack
    using YYSTACK_FREE.  Return 0 if successful or if no reallocation is
-   required.  Return 1 if memory is exhausted.  */
+   required.  Return YYENOMEM if memory is exhausted.  */
 static int
 yy_lac_stack_realloc (YYPTRDIFF_T *yycapacity, YYPTRDIFF_T yyadd,
 #if ]b4_api_PREFIX[DEBUG
@@ -830,7 +935,7 @@
         {
           YYDPRINTF ((stderr, "%smax size exceeded%s", yydebug_prefix,
                       yydebug_suffix));
-          return 1;
+          return YYENOMEM;
         }
       if (YYMAXDEPTH < yyalloc)
         yyalloc = YYMAXDEPTH;
@@ -842,7 +947,7 @@
         {
           YYDPRINTF ((stderr, "%srealloc failed%s", yydebug_prefix,
                       yydebug_suffix));
-          return 1;
+          return YYENOMEM;
         }
       if (*yytop != yytop_empty)
         {
@@ -888,23 +993,22 @@
    current lookahead, then check if that lookahead can eventually be
    shifted if syntactic actions continue from the current context.
    Report a syntax error if it cannot.  */
-#define YY_LAC_ESTABLISH                                         \
-do {                                                             \
-  if (!yy_lac_established)                                       \
-    {                                                            \
-      YYDPRINTF ((stderr,                                        \
-                  "LAC: initial context established for %s\n",   \
-                  yytname[yytoken]));                            \
-      yy_lac_established = 1;                                    \
-      {                                                          \
-        int yy_lac_status =                                      \
-          yy_lac (yyesa, &yyes, &yyes_capacity, yyssp, yytoken); \
-        if (yy_lac_status == 2)                                  \
-          goto yyexhaustedlab;                                   \
-        if (yy_lac_status == 1)                                  \
-          goto yyerrlab;                                         \
-      }                                                          \
-    }                                                            \
+#define YY_LAC_ESTABLISH                                                \
+do {                                                                    \
+  if (!yy_lac_established)                                              \
+    {                                                                   \
+      YYDPRINTF ((stderr,                                               \
+                  "LAC: initial context established for %s\n",          \
+                  yysymbol_name (yytoken)));                            \
+      yy_lac_established = 1;                                           \
+      switch (yy_lac (yyesa, &yyes, &yyes_capacity, yyssp, yytoken))    \
+        {                                                               \
+        case YYENOMEM:                                                  \
+          YYNOMEM;                                                      \
+        case 1:                                                         \
+          goto yyerrlab;                                                \
+        }                                                               \
+    }                                                                   \
 } while (0)
 
 /* Discard any previous initial lookahead context because of Event,
@@ -923,9 +1027,8 @@
 do {                                                                     \
   if (yy_lac_established)                                                \
     {                                                                    \
-      if (yydebug)                                                       \
-        YYFPRINTF (stderr, "LAC: initial context discarded due to "      \
-                   Event "\n");                                          \
+      YYDPRINTF ((stderr, "LAC: initial context discarded due to "       \
+                  Event "\n"));                                          \
       yy_lac_established = 0;                                            \
     }                                                                    \
 } while (0)
@@ -935,7 +1038,7 @@
 
 /* Given the stack whose top is *YYSSP, return 0 iff YYTOKEN can
    eventually (after perhaps some reductions) be shifted, return 1 if
-   not, or return 2 if memory is exhausted.  As preconditions and
+   not, or return YYENOMEM if memory is exhausted.  As preconditions and
    postconditions: *YYES_CAPACITY is the allocated size of the array to
    which *YYES points, and either *YYES = YYESA or *YYES points to an
    array allocated with YYSTACK_ALLOC.  yy_lac may overwrite the
@@ -943,24 +1046,26 @@
    any old *YYES other than YYESA.  */
 static int
 yy_lac (yy_state_t *yyesa, yy_state_t **yyes,
-        YYPTRDIFF_T *yyes_capacity, yy_state_t *yyssp, int yytoken)
+        YYPTRDIFF_T *yyes_capacity, yy_state_t *yyssp, yysymbol_kind_t yytoken)
 {
   yy_state_t *yyes_prev = yyssp;
   yy_state_t *yyesp = yyes_prev;
-  YYDPRINTF ((stderr, "LAC: checking lookahead %s:", yytname[yytoken]));
-  if (yytoken == YYUNDEFTOK)
+  /* Reduce until we encounter a shift and thereby accept the token.  */
+  YYDPRINTF ((stderr, "LAC: checking lookahead %s:", yysymbol_name (yytoken)));
+  if (yytoken == ]b4_symbol_prefix[YYUNDEF)
     {
       YYDPRINTF ((stderr, " Always Err\n"));
       return 1;
     }
   while (1)
     {
-      int yyrule = yypact[*yyesp];
+      int yyrule = yypact[+*yyesp];
       if (yypact_value_is_default (yyrule)
           || (yyrule += yytoken) < 0 || YYLAST < yyrule
           || yycheck[yyrule] != yytoken)
         {
-          yyrule = yydefact[*yyesp];
+          /* Use the default action.  */
+          yyrule = yydefact[+*yyesp];
           if (yyrule == 0)
             {
               YYDPRINTF ((stderr, " Err\n"));
@@ -969,6 +1074,7 @@
         }
       else
         {
+          /* Use the action from yytable.  */
           yyrule = yytable[yyrule];
           if (yytable_value_is_error (yyrule))
             {
@@ -982,9 +1088,12 @@
             }
           yyrule = -yyrule;
         }
+      /* By now we know we have to simulate a reduce.  */
+      YYDPRINTF ((stderr, " R%d", yyrule - 1));
       {
+        /* Pop the corresponding number of values from the stack.  */
         YYPTRDIFF_T yylen = yyr2[yyrule];
-        YYDPRINTF ((stderr, " R%d", yyrule - 1));
+        /* First pop from the LAC stack as many tokens as possible.  */
         if (yyesp != yyes_prev)
           {
             YYPTRDIFF_T yysize = yyesp - *yyes + 1;
@@ -995,13 +1104,15 @@
               }
             else
               {
-                yylen -= yysize;
                 yyesp = yyes_prev;
+                yylen -= yysize;
               }
           }
+        /* Only afterwards look at the main stack.  */
         if (yylen)
           yyesp = yyes_prev -= yylen;
       }
+      /* Push the resulting state of the reduction.  */
       {
         yy_state_fast_t yystate;
         {
@@ -1027,7 +1138,7 @@
                                       yyes, yyesa, &yyesp, yyes_prev))
               {
                 YYDPRINTF ((stderr, "\n"));
-                return 2;
+                return YYENOMEM;
               }
             YY_IGNORE_USELESS_CAST_BEGIN
             *++yyesp = YY_CAST (yy_state_t, yystate);
@@ -1038,33 +1149,144 @@
     }
 }]])[
 
+]b4_parse_error_case([simple], [],
+[[/* Context of a parse error.  */
+typedef struct
+{]b4_push_if([[
+  yypstate* yyps;]], [[
+  yy_state_t *yyssp;]b4_lac_if([[
+  yy_state_t *yyesa;
+  yy_state_t **yyes;
+  YYPTRDIFF_T *yyes_capacity;]])])[
+  yysymbol_kind_t yytoken;]b4_locations_if([[
+  YYLTYPE *yylloc;]])[
+} yypcontext_t;
 
-#if YYERROR_VERBOSE
+/* Put in YYARG at most YYARGN of the expected tokens given the
+   current YYCTX, and return the number of tokens stored in YYARG.  If
+   YYARG is null, return the number of expected tokens (guaranteed to
+   be less than YYNTOKENS).  Return YYENOMEM on memory exhaustion.
+   Return 0 if there are more than YYARGN expected tokens, yet fill
+   YYARG up to YYARGN. */]b4_push_if([[
+static int
+yypstate_expected_tokens (yypstate *yyps,
+                          yysymbol_kind_t yyarg[], int yyargn)]], [[
+static int
+yypcontext_expected_tokens (const yypcontext_t *yyctx,
+                            yysymbol_kind_t yyarg[], int yyargn)]])[
+{
+  /* Actual size of YYARG. */
+  int yycount = 0;
+]b4_lac_if([[
+  int yyx;
+  for (yyx = 0; yyx < YYNTOKENS; ++yyx)
+    {
+      yysymbol_kind_t yysym = YY_CAST (yysymbol_kind_t, yyx);
+      if (yysym != ]b4_symbol(error, kind)[ && yysym != ]b4_symbol_prefix[YYUNDEF)
+        switch (yy_lac (]b4_push_if([[yyps->yyesa, &yyps->yyes, &yyps->yyes_capacity, yyps->yyssp, yysym]],
+                                    [[yyctx->yyesa, yyctx->yyes, yyctx->yyes_capacity, yyctx->yyssp, yysym]])[))
+          {
+          case YYENOMEM:
+            return YYENOMEM;
+          case 1:
+            continue;
+          default:
+            if (!yyarg)
+              ++yycount;
+            else if (yycount == yyargn)
+              return 0;
+            else
+              yyarg[yycount++] = yysym;
+          }
+    }]],
+[[  int yyn = yypact@{+*]b4_push_if([yyps], [yyctx])[->yyssp@};
+  if (!yypact_value_is_default (yyn))
+    {
+      /* Start YYX at -YYN if negative to avoid negative indexes in
+         YYCHECK.  In other words, skip the first -YYN actions for
+         this state because they are default actions.  */
+      int yyxbegin = yyn < 0 ? -yyn : 0;
+      /* Stay within bounds of both yycheck and yytname.  */
+      int yychecklim = YYLAST - yyn + 1;
+      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+      int yyx;
+      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+        if (yycheck[yyx + yyn] == yyx && yyx != ]b4_symbol(error, kind)[
+            && !yytable_value_is_error (yytable[yyx + yyn]))
+          {
+            if (!yyarg)
+              ++yycount;
+            else if (yycount == yyargn)
+              return 0;
+            else
+              yyarg[yycount++] = YY_CAST (yysymbol_kind_t, yyx);
+          }
+    }]])[
+  if (yyarg && yycount == 0 && 0 < yyargn)
+    yyarg[0] = ]b4_symbol(empty, kind)[;
+  return yycount;
+}
 
-# ifndef yystrlen
-#  if defined __GLIBC__ && defined _STRING_H
-#   define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S)))
-#  else
+]b4_push_if([[
+/* Similar to the previous function.  */
+static int
+yypcontext_expected_tokens (const yypcontext_t *yyctx,
+                            yysymbol_kind_t yyarg[], int yyargn)
+{
+  return yypstate_expected_tokens (yyctx->yyps, yyarg, yyargn);
+}]])[
+]])[
+
+]b4_parse_error_bmatch(
+         [custom],
+[[/* The kind of the lookahead of this context.  */
+static yysymbol_kind_t
+yypcontext_token (const yypcontext_t *yyctx) YY_ATTRIBUTE_UNUSED;
+
+static yysymbol_kind_t
+yypcontext_token (const yypcontext_t *yyctx)
+{
+  return yyctx->yytoken;
+}
+
+]b4_locations_if([[/* The location of the lookahead of this context.  */
+static YYLTYPE *
+yypcontext_location (const yypcontext_t *yyctx) YY_ATTRIBUTE_UNUSED;
+
+static YYLTYPE *
+yypcontext_location (const yypcontext_t *yyctx)
+{
+  return yyctx->yylloc;
+}]])[
+
+/* User defined function to report a syntax error.  */
+static int
+yyreport_syntax_error (const yypcontext_t *yyctx]b4_user_formals[);]],
+         [detailed\|verbose],
+[[#ifndef yystrlen
+# if defined __GLIBC__ && defined _STRING_H
+#  define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S)))
+# else
 /* Return the length of YYSTR.  */
-]b4_function_define([yystrlen], [static YYPTRDIFF_T],
-   [[const char *yystr], [yystr]])[
+static YYPTRDIFF_T
+yystrlen (const char *yystr)
 {
   YYPTRDIFF_T yylen;
   for (yylen = 0; yystr[yylen]; yylen++)
     continue;
   return yylen;
 }
-#  endif
 # endif
+#endif
 
-# ifndef yystpcpy
-#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-#   define yystpcpy stpcpy
-#  else
+#ifndef yystpcpy
+# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+#  define yystpcpy stpcpy
+# else
 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
    YYDEST.  */
-]b4_function_define([yystpcpy], [static char *],
-   [[char *yydest], [yydest]], [[const char *yysrc], [yysrc]])[
+static char *
+yystpcpy (char *yydest, const char *yysrc)
 {
   char *yyd = yydest;
   const char *yys = yysrc;
@@ -1074,10 +1296,12 @@
 
   return yyd - 1;
 }
-#  endif
 # endif
+#endif
 
-# ifndef yytnamerr
+]b4_parse_error_case(
+         [verbose],
+[[#ifndef yytnamerr
 /* Copy to YYRES the contents of YYSTR after stripping away unnecessary
    quotes and backslashes, so that it's suitable for yyerror.  The
    heuristic is that double-quoting is unnecessary unless the string
@@ -1092,7 +1316,6 @@
     {
       YYPTRDIFF_T yyn = 0;
       char const *yyp = yystr;
-
       for (;;)
         switch (*++yyp)
           {
@@ -1126,34 +1349,15 @@
   else
     return yystrlen (yystr);
 }
-# endif
+#endif
+]])[
 
-/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
-   about the unexpected token YYTOKEN for the state stack whose top is
-   YYSSP.]b4_lac_if([[  In order to see if a particular token T is a
-   valid looakhead, invoke yy_lac (YYESA, YYES, YYES_CAPACITY, YYSSP, T).]])[
-
-   Return 0 if *YYMSG was successfully written.  Return 1 if *YYMSG is
-   not large enough to hold the message.  In that case, also set
-   *YYMSG_ALLOC to the required number of bytes.  Return 2 if the
-   required number of bytes is too large to store]b4_lac_if([[ or if
-   yy_lac returned 2]])[.  */
 static int
-yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg,
-                ]b4_lac_if([[yy_state_t *yyesa, yy_state_t **yyes,
-                YYPTRDIFF_T *yyes_capacity, ]])[yy_state_t *yyssp, int yytoken)
+yy_syntax_error_arguments (const yypcontext_t *yyctx,
+                           yysymbol_kind_t yyarg[], int yyargn)
 {
-  enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
-  /* Internationalized format string. */
-  const char *yyformat = YY_NULLPTR;
-  /* Arguments of yyformat: reported tokens (one for the "unexpected",
-     one per "expected"). */
-  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
   /* Actual size of YYARG. */
   int yycount = 0;
-  /* Cumulated lengths of YYARG.  */
-  YYPTRDIFF_T yysize = 0;
-
   /* There are many possibilities here to consider:
      - If this state is a consistent state with a default action, then
        the only way this function was invoked is if the default action
@@ -1182,70 +1386,59 @@
        one exception: it will still contain any token that will not be
        accepted due to an error action in a later state.]])[
   */
-  if (yytoken != YYEMPTY)
+  if (yyctx->yytoken != ]b4_symbol(empty, kind)[)
     {
-      int yyn = yypact[*yyssp];
-      YYPTRDIFF_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
-      yysize = yysize0;]b4_lac_if([[
+      int yyn;]b4_lac_if([[
       YYDPRINTF ((stderr, "Constructing syntax error message\n"));]])[
-      yyarg[yycount++] = yytname[yytoken];
-      if (!yypact_value_is_default (yyn))
-        {]b4_lac_if([[
-          int yyx;
-
-          for (yyx = 0; yyx < YYNTOKENS; ++yyx)
-            if (yyx != YYTERROR && yyx != YYUNDEFTOK)
-              {
-                {
-                  int yy_lac_status = yy_lac (yyesa, yyes, yyes_capacity,
-                                              yyssp, yyx);
-                  if (yy_lac_status == 2)
-                    return 2;
-                  if (yy_lac_status == 1)
-                    continue;
-                }]], [[
-          /* Start YYX at -YYN if negative to avoid negative indexes in
-             YYCHECK.  In other words, skip the first -YYN actions for
-             this state because they are default actions.  */
-          int yyxbegin = yyn < 0 ? -yyn : 0;
-          /* Stay within bounds of both yycheck and yytname.  */
-          int yychecklim = YYLAST - yyn + 1;
-          int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-          int yyx;
-
-          for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
-                && !yytable_value_is_error (yytable[yyx + yyn]))
-              {]])[
-                if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-                  {
-                    yycount = 1;
-                    yysize = yysize0;
-                    break;
-                  }
-                yyarg[yycount++] = yytname[yyx];
-                {
-                  YYPTRDIFF_T yysize1
-                    = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
-                  if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
-                    yysize = yysize1;
-                  else
-                    return 2;
-                }
-              }
-        }]b4_lac_if([[
-# if ]b4_api_PREFIX[DEBUG
-      else if (yydebug)
-        YYFPRINTF (stderr, "No expected tokens.\n");
-# endif]])[
+      if (yyarg)
+        yyarg[yycount] = yyctx->yytoken;
+      ++yycount;
+      yyn = yypcontext_expected_tokens (yyctx,
+                                        yyarg ? yyarg + 1 : yyarg, yyargn - 1);
+      if (yyn == YYENOMEM)
+        return YYENOMEM;]b4_lac_if([[
+      else if (yyn == 0)
+        YYDPRINTF ((stderr, "No expected tokens.\n"));]])[
+      else
+        yycount += yyn;
     }
+  return yycount;
+}
+
+/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
+   about the unexpected token YYTOKEN for the state stack whose top is
+   YYSSP.]b4_lac_if([[  In order to see if a particular token T is a
+   valid looakhead, invoke yy_lac (YYESA, YYES, YYES_CAPACITY, YYSSP, T).]])[
+
+   Return 0 if *YYMSG was successfully written.  Return -1 if *YYMSG is
+   not large enough to hold the message.  In that case, also set
+   *YYMSG_ALLOC to the required number of bytes.  Return YYENOMEM if the
+   required number of bytes is too large to store]b4_lac_if([[ or if
+   yy_lac returned YYENOMEM]])[.  */
+static int
+yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg,
+                const yypcontext_t *yyctx)
+{
+  enum { YYARGS_MAX = 5 };
+  /* Internationalized format string. */
+  const char *yyformat = YY_NULLPTR;
+  /* Arguments of yyformat: reported tokens (one for the "unexpected",
+     one per "expected"). */
+  yysymbol_kind_t yyarg[YYARGS_MAX];
+  /* Cumulated lengths of YYARG.  */
+  YYPTRDIFF_T yysize = 0;
+
+  /* Actual size of YYARG. */
+  int yycount = yy_syntax_error_arguments (yyctx, yyarg, YYARGS_MAX);
+  if (yycount == YYENOMEM)
+    return YYENOMEM;
 
   switch (yycount)
     {
-# define YYCASE_(N, S)                      \
+#define YYCASE_(N, S)                       \
       case N:                               \
         yyformat = S;                       \
-      break
+        break
     default: /* Avoid compiler warnings. */
       YYCASE_(0, YY_("syntax error"));
       YYCASE_(1, YY_("syntax error, unexpected %s"));
@@ -1253,17 +1446,25 @@
       YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
       YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
       YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
-# undef YYCASE_
+#undef YYCASE_
     }
 
+  /* Compute error message size.  Don't count the "%s"s, but reserve
+     room for the terminator.  */
+  yysize = yystrlen (yyformat) - 2 * yycount + 1;
   {
-    /* Don't count the "%s"s in the final size, but reserve room for
-       the terminator.  */
-    YYPTRDIFF_T yysize1 = yysize + (yystrlen (yyformat) - 2 * yycount) + 1;
-    if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
-      yysize = yysize1;
-    else
-      return 2;
+    int yyi;
+    for (yyi = 0; yyi < yycount; ++yyi)
+      {
+        YYPTRDIFF_T yysize1
+          = yysize + ]b4_parse_error_case(
+                              [verbose], [[yytnamerr (YY_NULLPTR, yytname[yyarg[yyi]])]],
+                              [[yystrlen (yysymbol_name (yyarg[yyi]))]]);[
+        if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
+          yysize = yysize1;
+        else
+          return YYENOMEM;
+      }
   }
 
   if (*yymsg_alloc < yysize)
@@ -1272,7 +1473,7 @@
       if (! (yysize <= *yymsg_alloc
              && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
         *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
-      return 1;
+      return -1;
     }
 
   /* Avoid sprintf, as that infringes on the user's name space.
@@ -1283,8 +1484,9 @@
     int yyi = 0;
     while ((*yyp = *yyformat) != '\0')
       if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
-        {
-          yyp += yytnamerr (yyp, yyarg[yyi++]);
+        {]b4_parse_error_case([verbose], [[
+          yyp += yytnamerr (yyp, yytname[yyarg[yyi++]]);]], [[
+          yyp = yystpcpy (yyp, yysymbol_name (yyarg[yyi++]));]])[
           yyformat += 2;
         }
       else
@@ -1295,153 +1497,175 @@
   }
   return 0;
 }
-#endif /* YYERROR_VERBOSE */
+]])[
 
 ]b4_yydestruct_define[
 
-]b4_pure_if([], [
+]b4_pure_if([], [b4_declare_scanner_communication_variables])[
 
-b4_declare_scanner_communication_variables])[]b4_push_if([[
+]b4_push_if([b4_pull_if([[
 
-struct yypstate
-  {]b4_declare_parser_state_variables[
-    /* Used to determine if this is the first time this instance has
-       been used.  */
-    int yynew;
-  };]b4_pure_if([], [[
-
-static char yypstate_allocated = 0;]])b4_pull_if([
-
-b4_function_define([[yyparse]], [[int]], b4_parse_param)[
+int
+yyparse (]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param)], [void])[)
 {
-  return yypull_parse (YY_NULLPTR]m4_ifset([b4_parse_param],
-                                  [[, ]b4_args(b4_parse_param)])[);
+  yypstate *yyps = yypstate_new ();
+  if (!yyps)
+    {]b4_pure_if([b4_locations_if([[
+      static YYLTYPE yyloc_default][]b4_yyloc_default[;
+      YYLTYPE yylloc = yyloc_default;]])[
+      yyerror (]b4_yyerror_args[YY_("memory exhausted"));]], [[
+      if (!yypstate_allocated)
+        yyerror (]b4_yyerror_args[YY_("memory exhausted"));]])[
+      return 2;
+    }
+  int yystatus = yypull_parse (yyps]b4_user_args[);
+  yypstate_delete (yyps);
+  return yystatus;
 }
 
-]b4_function_define([[yypull_parse]], [[int]],
-  [[[yypstate *yyps]], [[yyps]]]m4_ifset([b4_parse_param], [,
-  b4_parse_param]))[
-{]b4_pure_if([b4_locations_if([[
+int
+yypull_parse (yypstate *yyps]b4_user_formals[)
+{
+  YY_ASSERT (yyps);]b4_pure_if([b4_locations_if([[
   static YYLTYPE yyloc_default][]b4_yyloc_default[;
   YYLTYPE yylloc = yyloc_default;]])])[
-  yypstate *yyps_local;
-  if (yyps)
-    yyps_local = yyps;
-  else
-    {
-      yyps_local = yypstate_new ();
-      if (!yyps_local)
-        {]b4_pure_if([[
-          yyerror (]b4_yyerror_args[YY_("memory exhausted"));]], [[
-          if (!yypstate_allocated)
-            yyerror (]b4_yyerror_args[YY_("memory exhausted"));]])[
-          return 2;
-        }
-    }
   int yystatus;
-  do {]b4_pure_if([[
-    YYSTYPE yylval;
-    int ]])[yychar = ]b4_lex[;
-    yystatus =
-      yypush_parse (yyps_local]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_args(b4_parse_param)])[);
+  do {
+]b4_pure_if([[    YYSTYPE yylval;
+    int ]])[yychar = ]b4_yylex[;
+    yystatus = yypush_parse (yyps]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_args(b4_parse_param)])[);
   } while (yystatus == YYPUSH_MORE);
-  if (!yyps)
-    yypstate_delete (yyps_local);
   return yystatus;
 }]])[
 
+]b4_parse_state_variable_macros([b4_pstate_macro_define])[
+
 /* Initialize the parser data structure.  */
-]b4_function_define([[yypstate_new]], [[yypstate *]])[
+static void
+yypstate_clear (yypstate *yyps)
+{
+  yynerrs = 0;
+  yystate = 0;
+  yyerrstatus = 0;
+
+  yyssp = yyss;
+  yyvsp = yyvs;]b4_locations_if([[
+  yylsp = yyls;]])[
+
+  /* Initialize the state stack, in case yypcontext_expected_tokens is
+     called before the first call to yyparse. */
+  *yyssp = 0;
+  yyps->yynew = 1;
+}
+
+/* Initialize the parser data structure.  */
+yypstate *
+yypstate_new (void)
 {
   yypstate *yyps;]b4_pure_if([], [[
   if (yypstate_allocated)
     return YY_NULLPTR;]])[
-  yyps = YY_CAST (yypstate *, malloc (sizeof *yyps));
+  yyps = YY_CAST (yypstate *, YYMALLOC (sizeof *yyps));
   if (!yyps)
-    return YY_NULLPTR;
-  yyps->yynew = 1;]b4_pure_if([], [[
+    return YY_NULLPTR;]b4_pure_if([], [[
   yypstate_allocated = 1;]])[
+  yystacksize = YYINITDEPTH;
+  yyss = yyssa;
+  yyvs = yyvsa;]b4_locations_if([[
+  yyls = yylsa;]])[]b4_lac_if([[
+  yyes = yyesa;
+  yyes_capacity = ]b4_percent_define_get([[parse.lac.es-capacity-initial]])[;
+  if (YYMAXDEPTH < yyes_capacity)
+    yyes_capacity = YYMAXDEPTH;]])[
+  yypstate_clear (yyps);
   return yyps;
 }
 
-]b4_function_define([[yypstate_delete]], [[void]],
-                   [[[yypstate *yyps]], [[yyps]]])[
+void
+yypstate_delete (yypstate *yyps)
 {
   if (yyps)
     {
 #ifndef yyoverflow
       /* If the stack was reallocated but the parse did not complete, then the
          stack still needs to be freed.  */
-      if (!yyps->yynew && yyps->yyss != yyps->yyssa)
-        YYSTACK_FREE (yyps->yyss);
+      if (yyss != yyssa)
+        YYSTACK_FREE (yyss);
 #endif]b4_lac_if([[
-      if (!yyps->yynew && yyps->yyes != yyps->yyesa)
-        YYSTACK_FREE (yyps->yyes);]])[
-      free (yyps);]b4_pure_if([], [[
+      if (yyes != yyesa)
+        YYSTACK_FREE (yyes);]])[
+      YYFREE (yyps);]b4_pure_if([], [[
       yypstate_allocated = 0;]])[
     }
 }
-]b4_pure_if([[
-#define ]b4_prefix[nerrs yyps->]b4_prefix[nerrs]])[
-#define yystate yyps->yystate
-#define yyerrstatus yyps->yyerrstatus
-#define yyssa yyps->yyssa
-#define yyss yyps->yyss
-#define yyssp yyps->yyssp
-#define yyvsa yyps->yyvsa
-#define yyvs yyps->yyvs
-#define yyvsp yyps->yyvsp]b4_locations_if([[
-#define yylsa yyps->yylsa
-#define yyls yyps->yyls
-#define yylsp yyps->yylsp
-#define yyerror_range yyps->yyerror_range]])[
-#define yystacksize yyps->yystacksize]b4_lac_if([[
-#define yyesa yyps->yyesa
-#define yyes yyps->yyes
-#define yyes_capacity yyps->yyes_capacity]])[
+]])[
 
-
+]b4_push_if([[
 /*---------------.
 | yypush_parse.  |
 `---------------*/
 
-]b4_function_define([[yypush_parse]], [[int]],
-  [[[yypstate *yyps]], [[yyps]]]b4_pure_if([,
-  [[[int yypushed_char]], [[yypushed_char]]],
-  [[[YYSTYPE const *yypushed_val]], [[yypushed_val]]]b4_locations_if([,
-  [[[YYLTYPE *yypushed_loc]], [[yypushed_loc]]]])])m4_ifset([b4_parse_param], [,
-  b4_parse_param]))], [[
-
-
+int
+yypush_parse (yypstate *yyps]b4_pure_if([[,
+              int yypushed_char, YYSTYPE const *yypushed_val]b4_locations_if([[, YYLTYPE *yypushed_loc]])])b4_user_formals[)]],
+[[
 /*----------.
 | yyparse.  |
 `----------*/
 
-]b4_function_define([yyparse], [int], b4_parse_param)])[
+]m4_ifdef([b4_start_symbols],
+[[// Extract data from the parser.
+typedef struct
+{
+  YYSTYPE yyvalue;
+  int yynerrs;
+} yy_parse_impl_t;
+
+// Run a full parse, using YYCHAR as switching token.
+static int
+yy_parse_impl (int yychar, yy_parse_impl_t *yyimpl]m4_ifset([b4_parse_param], [, b4_formals(b4_parse_param)])[);
+
+]m4_map([_b4_define_sub_yyparse], m4_defn([b4_start_symbols]))[
+
+int
+yyparse (]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param)], [void])[)
+{
+  return yy_parse_impl (]b4_symbol(_b4_first_switching_token, id)[, YY_NULLPTR]m4_ifset([b4_parse_param],
+                                                    [[, ]b4_args(b4_parse_param)])[);
+}
+
+static int
+yy_parse_impl (int yychar, yy_parse_impl_t *yyimpl]m4_ifset([b4_parse_param], [, b4_formals(b4_parse_param)])[)]],
+[[int
+yyparse (]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param)], [void])[)]])])[
 {]b4_pure_if([b4_declare_scanner_communication_variables
 ])b4_push_if([b4_pure_if([], [[
   int yypushed_char = yychar;
   YYSTYPE yypushed_val = yylval;]b4_locations_if([[
   YYLTYPE yypushed_loc = yylloc;]])
 ])],
-  [b4_declare_parser_state_variables
+  [b4_declare_parser_state_variables([init])
 ])b4_lac_if([[
+  /* Whether LAC context is established.  A Boolean.  */
   int yy_lac_established = 0;]])[
   int yyn;
+  /* The return value of yyparse.  */
   int yyresult;
-  /* Lookahead token as an internal (translated) token number.  */
-  int yytoken = 0;
+  /* Lookahead symbol kind.  */
+  yysymbol_kind_t yytoken = ]b4_symbol(empty, kind)[;
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;]b4_locations_if([[
-  YYLTYPE yyloc;]])[
+  YYLTYPE yyloc;
 
-#if YYERROR_VERBOSE
-  /* Buffer for error messages, and its allocated size.  */
+  /* The locations where the error started and ended.  */
+  YYLTYPE yyerror_range[3];]])[
+
+]b4_parse_error_bmatch([detailed\|verbose],
+[[  /* Buffer for error messages, and its allocated size.  */
   char yymsgbuf[128];
   char *yymsg = yymsgbuf;
-  YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf;
-#endif
+  YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf;]])[
 
 #define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N)]b4_locations_if([, yylsp -= (N)])[)
 
@@ -1449,28 +1673,25 @@
      Keep to zero when no symbol should be popped.  */
   int yylen = 0;]b4_push_if([[
 
-  if (!yyps->yynew)
+  switch (yyps->yynew)
     {
+    case 0:
       yyn = yypact[yystate];
       goto yyread_pushed_token;
+
+    case 2:
+      yypstate_clear (yyps);
+      break;
+
+    default:
+      break;
     }]])[
 
-  yyssp = yyss = yyssa;
-  yyvsp = yyvs = yyvsa;]b4_locations_if([[
-  yylsp = yyls = yylsa;]])[
-  yystacksize = YYINITDEPTH;]b4_lac_if([[
-
-  yyes = yyesa;
-  yyes_capacity = ]b4_percent_define_get([[parse.lac.es-capacity-initial]])[;
-  if (YYMAXDEPTH < yyes_capacity)
-    yyes_capacity = YYMAXDEPTH;]])[
-
   YYDPRINTF ((stderr, "Starting parse\n"));
 
-  yystate = 0;
-  yyerrstatus = 0;
-  yynerrs = 0;
-  yychar = YYEMPTY; /* Cause a token to be read.  */
+]m4_ifdef([b4_start_symbols], [],
+[[  yychar = ]b4_symbol(empty, id)[; /* Cause a token to be read.  */
+]])[
 ]m4_ifdef([b4_initial_action], [
 b4_dollar_pushdef([m4_define([b4_dollar_dollar_used])yylval], [], [],
                   [b4_push_if([b4_pure_if([*])yypushed_loc], [yylloc])])dnl
@@ -1501,10 +1722,11 @@
   YY_IGNORE_USELESS_CAST_BEGIN
   *yyssp = YY_CAST (yy_state_t, yystate);
   YY_IGNORE_USELESS_CAST_END
+  YY_STACK_PRINT (yyss, yyssp);
 
   if (yyss + yystacksize - 1 <= yyssp)
 #if !defined yyoverflow && !defined YYSTACK_RELOCATE
-    goto yyexhaustedlab;
+    YYNOMEM;
 #else
     {
       /* Get the current used size of the three stacks, in elements.  */
@@ -1535,7 +1757,7 @@
 # else /* defined YYSTACK_RELOCATE */
       /* Extend the stack our own way.  */
       if (YYMAXDEPTH <= yystacksize)
-        goto yyexhaustedlab;
+        YYNOMEM;
       yystacksize *= 2;
       if (YYMAXDEPTH < yystacksize)
         yystacksize = YYMAXDEPTH;
@@ -1546,11 +1768,11 @@
           YY_CAST (union yyalloc *,
                    YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
         if (! yyptr)
-          goto yyexhaustedlab;
+          YYNOMEM;
         YYSTACK_RELOCATE (yyss_alloc, yyss);
         YYSTACK_RELOCATE (yyvs_alloc, yyvs);]b4_locations_if([
         YYSTACK_RELOCATE (yyls_alloc, yyls);])[
-# undef YYSTACK_RELOCATE
+#  undef YYSTACK_RELOCATE
         if (yyss1 != yyssa)
           YYSTACK_FREE (yyss1);
       }
@@ -1570,8 +1792,9 @@
     }
 #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
 
+]m4_ifdef([b4_start_symbols], [], [[
   if (yystate == YYFINAL)
-    YYACCEPT;
+    YYACCEPT;]])[
 
   goto yybackup;
 
@@ -1590,8 +1813,8 @@
 
   /* Not known => get a lookahead token if don't already have one.  */
 
-  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
-  if (yychar == YYEMPTY)
+  /* YYCHAR is either empty, or end-of-input, or a valid lookahead.  */
+  if (yychar == ]b4_symbol(empty, id)[)
     {]b4_push_if([[
       if (!yyps->yynew)
         {]b4_use_push_for_pull_if([], [[
@@ -1607,20 +1830,32 @@
       yylval = yypushed_val;]b4_locations_if([[
       yylloc = yypushed_loc;]])])[
 yyread_pushed_token:]])[
-      YYDPRINTF ((stderr, "Reading a token: "));]b4_push_if([b4_pure_if([[
+      YYDPRINTF ((stderr, "Reading a token\n"));]b4_push_if([b4_pure_if([[
       yychar = yypushed_char;
       if (yypushed_val)
         yylval = *yypushed_val;]b4_locations_if([[
       if (yypushed_loc)
         yylloc = *yypushed_loc;]])])], [[
-      yychar = ]b4_lex[;]])[
+      yychar = ]b4_yylex[;]])[
     }
 
-  if (yychar <= YYEOF)
+  if (yychar <= ]b4_symbol(eof, [id])[)
     {
-      yychar = yytoken = YYEOF;
+      yychar = ]b4_symbol(eof, [id])[;
+      yytoken = ]b4_symbol(eof, [kind])[;
       YYDPRINTF ((stderr, "Now at end of input.\n"));
     }
+  else if (yychar == ]b4_symbol(error, [id])[)
+    {
+      /* The scanner already issued an error message, process directly
+         to error recovery.  But do not keep the error token as
+         lookahead, it is too special and may lead us to an endless
+         loop in error recovery. */
+      yychar = ]b4_symbol(undef, [id])[;
+      yytoken = ]b4_symbol(error, [kind])[;]b4_locations_if([[
+      yyerror_range[1] = yylloc;]])[
+      goto yyerrlab1;
+    }
   else
     {
       yytoken = YYTRANSLATE (yychar);
@@ -1640,9 +1875,9 @@
   if (yyn <= 0)
     {
       if (yytable_value_is_error (yyn))
-        goto yyerrlab;]b4_lac_if([[
+        goto yyerrlab;
+      yyn = -yyn;]b4_lac_if([[
       YY_LAC_ESTABLISH;]])[
-      yyn = -yyn;
       goto yyreduce;
     }
 
@@ -1660,7 +1895,7 @@
   *++yylsp = yylloc;])[
 
   /* Discard the shifted token.  */
-  yychar = YYEMPTY;]b4_lac_if([[
+  yychar = ]b4_symbol(empty, id)[;]b4_lac_if([[
   YY_LAC_DISCARD ("shift");]])[
   goto yynewstate;
 
@@ -1723,11 +1958,10 @@
      case of YYERROR or YYBACKUP, subsequent parser actions might lead
      to an incorrect destructor call or verbose syntax error message
      before the lookahead is translated.  */
-  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+  YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
 
   YYPOPSTACK (yylen);
   yylen = 0;
-  YY_STACK_PRINT (yyss, yyssp);
 
   *++yyvsp = yyval;]b4_locations_if([
   *++yylsp = yyloc;])[
@@ -1752,69 +1986,76 @@
 yyerrlab:
   /* Make sure we have latest lookahead translation.  See comments at
      user semantic actions for why this is necessary.  */
-  yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
-
+  yytoken = yychar == ]b4_symbol(empty, id)[ ? ]b4_symbol(empty, kind)[ : YYTRANSLATE (yychar);
   /* If not already recovering from an error, report this error.  */
   if (!yyerrstatus)
     {
       ++yynerrs;
-#if ! YYERROR_VERBOSE
-      yyerror (]b4_yyerror_args[YY_("syntax error"));
-#else
-# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \]b4_lac_if([[
-                                        yyesa, &yyes, &yyes_capacity, \]])[
-                                        yyssp, yytoken)
-      {
+]b4_parse_error_case(
+         [custom],
+[[      {
+        yypcontext_t yyctx
+          = {]b4_push_if([[yyps]], [[yyssp]b4_lac_if([[, yyesa, &yyes, &yyes_capacity]])])[, yytoken]b4_locations_if([[, &yylloc]])[};]b4_lac_if([[
+        if (yychar != ]b4_symbol(empty, id)[)
+          YY_LAC_ESTABLISH;]])[
+        if (yyreport_syntax_error (&yyctx]m4_ifset([b4_parse_param],
+                                   [[, ]b4_args(b4_parse_param)])[) == 2)
+          YYNOMEM;
+      }]],
+         [simple],
+[[      yyerror (]b4_yyerror_args[YY_("syntax error"));]],
+[[      {
+        yypcontext_t yyctx
+          = {]b4_push_if([[yyps]], [[yyssp]b4_lac_if([[, yyesa, &yyes, &yyes_capacity]])])[, yytoken]b4_locations_if([[, &yylloc]])[};
         char const *yymsgp = YY_("syntax error");
         int yysyntax_error_status;]b4_lac_if([[
-        if (yychar != YYEMPTY)
+        if (yychar != ]b4_symbol(empty, id)[)
           YY_LAC_ESTABLISH;]])[
-        yysyntax_error_status = YYSYNTAX_ERROR;
+        yysyntax_error_status = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx);
         if (yysyntax_error_status == 0)
           yymsgp = yymsg;
-        else if (yysyntax_error_status == 1)
+        else if (yysyntax_error_status == -1)
           {
             if (yymsg != yymsgbuf)
               YYSTACK_FREE (yymsg);
-            yymsg = YY_CAST (char *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc)));
-            if (!yymsg)
+            yymsg = YY_CAST (char *,
+                             YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc)));
+            if (yymsg)
               {
-                yymsg = yymsgbuf;
-                yymsg_alloc = sizeof yymsgbuf;
-                yysyntax_error_status = 2;
+                yysyntax_error_status
+                  = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx);
+                yymsgp = yymsg;
               }
             else
               {
-                yysyntax_error_status = YYSYNTAX_ERROR;
-                yymsgp = yymsg;
+                yymsg = yymsgbuf;
+                yymsg_alloc = sizeof yymsgbuf;
+                yysyntax_error_status = YYENOMEM;
               }
           }
         yyerror (]b4_yyerror_args[yymsgp);
-        if (yysyntax_error_status == 2)
-          goto yyexhaustedlab;
-      }
-# undef YYSYNTAX_ERROR
-#endif
+        if (yysyntax_error_status == YYENOMEM)
+          YYNOMEM;
+      }]])[
     }
-
-]b4_locations_if([[  yyerror_range[1] = yylloc;]])[
-
+]b4_locations_if([[
+  yyerror_range[1] = yylloc;]])[
   if (yyerrstatus == 3)
     {
       /* If just tried and failed to reuse lookahead token after an
          error, discard it.  */
 
-      if (yychar <= YYEOF)
+      if (yychar <= ]b4_symbol(eof, [id])[)
         {
           /* Return failure if at end of input.  */
-          if (yychar == YYEOF)
+          if (yychar == ]b4_symbol(eof, [id])[)
             YYABORT;
         }
       else
         {
           yydestruct ("Error: discarding",
                       yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
-          yychar = YYEMPTY;
+          yychar = ]b4_symbol(empty, id)[;
         }
     }
 
@@ -1831,6 +2072,7 @@
      label yyerrorlab therefore never appears in user code.  */
   if (0)
     YYERROR;
+  ++yynerrs;
 
   /* Do not reclaim the symbols of the rule whose action triggered
      this YYERROR.  */
@@ -1847,13 +2089,14 @@
 yyerrlab1:
   yyerrstatus = 3;      /* Each real token shifted decrements this.  */
 
+  /* Pop stack until we find a state that shifts the error token.  */
   for (;;)
     {
       yyn = yypact[yystate];
       if (!yypact_value_is_default (yyn))
         {
-          yyn += YYTERROR;
-          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+          yyn += ]b4_symbol(error, kind)[;
+          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == ]b4_symbol(error, kind)[)
             {
               yyn = yytable[yyn];
               if (0 < yyn)
@@ -1867,7 +2110,7 @@
 
 ]b4_locations_if([[      yyerror_range[1] = *yylsp;]])[
       yydestruct ("Error: popping",
-                  yystos[yystate], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
+                  YY_ACCESSING_SYMBOL (yystate), yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
       YYPOPSTACK (1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
@@ -1882,13 +2125,11 @@
   YY_IGNORE_MAYBE_UNINITIALIZED_END
 ]b4_locations_if([[
   yyerror_range[2] = yylloc;
-  /* Using YYLLOC is tempting, but would change the location of
-     the lookahead.  YYLOC is available though.  */
-  YYLLOC_DEFAULT (yyloc, yyerror_range, 2);
-  *++yylsp = yyloc;]])[
+  ++yylsp;
+  YYLLOC_DEFAULT (*yylsp, yyerror_range, 2);]])[
 
   /* Shift the error token.  */
-  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+  YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
 
   yystate = yyn;
   goto yynewstate;
@@ -1899,7 +2140,7 @@
 `-------------------------------------*/
 yyacceptlab:
   yyresult = 0;
-  goto yyreturn;
+  goto yyreturnlab;
 
 
 /*-----------------------------------.
@@ -1907,25 +2148,23 @@
 `-----------------------------------*/
 yyabortlab:
   yyresult = 1;
-  goto yyreturn;
+  goto yyreturnlab;
 
 
-#if ]b4_lac_if([[1]], [[!defined yyoverflow || YYERROR_VERBOSE]])[
-/*-------------------------------------------------.
-| yyexhaustedlab -- memory exhaustion comes here.  |
-`-------------------------------------------------*/
+/*-----------------------------------------------------------.
+| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here.  |
+`-----------------------------------------------------------*/
 yyexhaustedlab:
   yyerror (]b4_yyerror_args[YY_("memory exhausted"));
   yyresult = 2;
-  /* Fall through.  */
-#endif
+  goto yyreturnlab;
 
 
-/*-----------------------------------------------------.
-| yyreturn -- parsing is finished, return the result.  |
-`-----------------------------------------------------*/
-yyreturn:
-  if (yychar != YYEMPTY)
+/*----------------------------------------------------------.
+| yyreturnlab -- parsing is finished, clean up and return.  |
+`----------------------------------------------------------*/
+yyreturnlab:
+  if (yychar != ]b4_symbol(empty, id)[)
     {
       /* Make sure we have latest lookahead translation.  See comments at
          user semantic actions for why this is necessary.  */
@@ -1940,27 +2179,31 @@
   while (yyssp != yyss)
     {
       yydestruct ("Cleanup: popping",
-                  yystos[*yyssp], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
+                  YY_ACCESSING_SYMBOL (+*yyssp), yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
       YYPOPSTACK (1);
-    }
+    }]b4_push_if([[
+  yyps->yynew = 2;
+  goto yypushreturn;
+
+
+/*-------------------------.
+| yypushreturn -- return.  |
+`-------------------------*/
+yypushreturn:]], [[
 #ifndef yyoverflow
   if (yyss != yyssa)
     YYSTACK_FREE (yyss);
 #endif]b4_lac_if([[
   if (yyes != yyesa)
-    YYSTACK_FREE (yyes);]])b4_push_if([[
-  yyps->yynew = 1;
-
-
-/*-----------------------------------------.
-| yypushreturn -- ask for the next token.  |
-`-----------------------------------------*/
-yypushreturn:]])[
-#if YYERROR_VERBOSE
-  if (yymsg != yymsgbuf)
-    YYSTACK_FREE (yymsg);
-#endif
+    YYSTACK_FREE (yyes);]])])[
+]b4_parse_error_bmatch([detailed\|verbose],
+[[  if (yymsg != yymsgbuf)
+    YYSTACK_FREE (yymsg);]])[]m4_ifdef([b4_start_symbols], [[
+  if (yyimpl)
+    yyimpl->yynerrs = yynerrs;]])[
   return yyresult;
 }
-]b4_epilogue[]dnl
+]b4_push_if([b4_parse_state_variable_macros([b4_macro_undef])])[
+]b4_percent_code_get([[epilogue]])[]dnl
+b4_epilogue[]dnl
 b4_output_end
diff --git a/data/xslt/bison.xsl b/data/xslt/bison.xsl
index 5c1a358..989a343 100644
--- a/data/xslt/bison.xsl
+++ b/data/xslt/bison.xsl
@@ -3,7 +3,7 @@
 <!--
     bison.xsl - common templates for Bison XSLT.
 
-    Copyright (C) 2007-2015, 2018-2019 Free Software Foundation, Inc.
+    Copyright (C) 2007-2015, 2018-2021 Free Software Foundation, Inc.
 
     This file is part of Bison, the GNU Compiler Compiler.
 
@@ -18,12 +18,12 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.
   -->
 
 <xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-  xmlns:bison="http://www.gnu.org/software/bison/">
+  xmlns:bison="https://www.gnu.org/software/bison/">
 
 <xsl:key
   name="bison:symbolByName"
diff --git a/data/xslt/xml2dot.xsl b/data/xslt/xml2dot.xsl
index 0a7419f..7715d1a 100644
--- a/data/xslt/xml2dot.xsl
+++ b/data/xslt/xml2dot.xsl
@@ -3,7 +3,7 @@
 <!--
     xml2dot.xsl - transform Bison XML Report into DOT.
 
-    Copyright (C) 2007-2015, 2018-2019 Free Software Foundation, Inc.
+    Copyright (C) 2007-2015, 2018-2021 Free Software Foundation, Inc.
 
     This file is part of Bison, the GNU Compiler Compiler.
 
@@ -18,14 +18,14 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
     Written by Wojciech Polak <polak@gnu.org>.
   -->
 
 <xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-  xmlns:bison="http://www.gnu.org/software/bison/">
+  xmlns:bison="https://www.gnu.org/software/bison/">
 
 <xsl:import href="bison.xsl"/>
 <xsl:output method="text" encoding="UTF-8" indent="no"/>
@@ -159,7 +159,7 @@
   <xsl:param name="prev-rule-number"
     select="preceding-sibling::item[1]/@rule-number"/>
   <xsl:apply-templates select="key('bison:ruleByNumber', @rule-number)">
-    <xsl:with-param name="point" select="@point"/>
+    <xsl:with-param name="dot" select="@dot"/>
     <xsl:with-param name="num" select="@rule-number"/>
     <xsl:with-param name="prev-lhs"
       select="key('bison:ruleByNumber', $prev-rule-number)/lhs[text()]"
@@ -169,7 +169,7 @@
 </xsl:template>
 
 <xsl:template match="rule">
-  <xsl:param name="point"/>
+  <xsl:param name="dot"/>
   <xsl:param name="num"/>
   <xsl:param name="prev-lhs"/>
   <xsl:text>&#10;</xsl:text>
@@ -198,14 +198,14 @@
       <xsl:text>:</xsl:text>
     </xsl:otherwise>
   </xsl:choose>
-  <xsl:if test="$point = 0">
+  <xsl:if test="$dot = 0">
     <xsl:text> .</xsl:text>
   </xsl:if>
 
   <!-- RHS -->
   <xsl:for-each select="rhs/symbol|rhs/empty">
     <xsl:apply-templates select="."/>
-    <xsl:if test="$point = position()">
+    <xsl:if test="$dot = position()">
       <xsl:text> .</xsl:text>
     </xsl:if>
   </xsl:for-each>
diff --git a/data/xslt/xml2text.xsl b/data/xslt/xml2text.xsl
index 72b56e7..1fc5731 100644
--- a/data/xslt/xml2text.xsl
+++ b/data/xslt/xml2text.xsl
@@ -3,7 +3,7 @@
 <!--
     xml2text.xsl - transform Bison XML Report into plain text.
 
-    Copyright (C) 2007-2015, 2018-2019 Free Software Foundation, Inc.
+    Copyright (C) 2007-2015, 2018-2021 Free Software Foundation, Inc.
 
     This file is part of Bison, the GNU Compiler Compiler.
 
@@ -18,14 +18,14 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
     Written by Wojciech Polak <polak@gnu.org>.
   -->
 
 <xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-  xmlns:bison="http://www.gnu.org/software/bison/">
+  xmlns:bison="https://www.gnu.org/software/bison/">
 
 <xsl:import href="bison.xsl"/>
 <xsl:output method="text" encoding="UTF-8" indent="no"/>
@@ -52,7 +52,7 @@
   <xsl:if test="nonterminal[@usefulness='useless-in-grammar']">
     <xsl:text>Nonterminals useless in grammar&#10;&#10;</xsl:text>
     <xsl:for-each select="nonterminal[@usefulness='useless-in-grammar']">
-      <xsl:text>   </xsl:text>
+      <xsl:text>    </xsl:text>
       <xsl:value-of select="@name"/>
       <xsl:text>&#10;</xsl:text>
     </xsl:for-each>
@@ -65,7 +65,7 @@
     <xsl:text>Terminals unused in grammar&#10;&#10;</xsl:text>
     <xsl:for-each select="terminal[@usefulness='unused-in-grammar']">
       <xsl:sort select="@symbol-number" data-type="number"/>
-      <xsl:text>   </xsl:text>
+      <xsl:text>    </xsl:text>
       <xsl:value-of select="@name"/>
       <xsl:text>&#10;</xsl:text>
     </xsl:for-each>
@@ -136,6 +136,7 @@
 </xsl:template>
 
 <xsl:template match="terminal">
+  <xsl:text>    </xsl:text>
   <xsl:value-of select="@name"/>
   <xsl:call-template name="line-wrap">
     <xsl:with-param name="first-line-length">
@@ -148,6 +149,9 @@
     </xsl:with-param>
     <xsl:with-param name="line-length" select="66" />
     <xsl:with-param name="text">
+      <xsl:if test="string-length(@type) != 0">
+        <xsl:value-of select="concat(' &lt;', @type, '&gt;')"/>
+      </xsl:if>
       <xsl:value-of select="concat(' (', @token-number, ')')"/>
       <xsl:for-each select="key('bison:ruleByRhs', @name)">
         <xsl:value-of select="concat(' ', @number)"/>
@@ -157,14 +161,18 @@
 </xsl:template>
 
 <xsl:template match="nonterminal">
+  <xsl:text>    </xsl:text>
   <xsl:value-of select="@name"/>
+  <xsl:if test="string-length(@type) != 0">
+    <xsl:value-of select="concat(' &lt;', @type, '&gt;')"/>
+  </xsl:if>
   <xsl:value-of select="concat(' (', @symbol-number, ')')"/>
   <xsl:text>&#10;</xsl:text>
   <xsl:variable name="output">
     <xsl:call-template name="line-wrap">
       <xsl:with-param name="line-length" select="66" />
       <xsl:with-param name="text">
-        <xsl:text>    </xsl:text>
+        <xsl:text>        </xsl:text>
         <xsl:if test="key('bison:ruleByLhs', @name)">
           <xsl:text>on@left:</xsl:text>
           <xsl:for-each select="key('bison:ruleByLhs', @name)">
@@ -173,7 +181,7 @@
         </xsl:if>
         <xsl:if test="key('bison:ruleByRhs', @name)">
           <xsl:if test="key('bison:ruleByLhs', @name)">
-            <xsl:text>, </xsl:text>
+            <xsl:text>&#10;        </xsl:text>
           </xsl:if>
           <xsl:text>on@right:</xsl:text>
           <xsl:for-each select="key('bison:ruleByRhs', @name)">
@@ -300,7 +308,7 @@
       name="prev-lhs"
       select="key('bison:ruleByNumber', $prev-rule-number)/lhs[text()]"
    />
-    <xsl:with-param name="point" select="@point"/>
+    <xsl:with-param name="dot" select="@dot"/>
     <xsl:with-param name="lookaheads">
       <xsl:apply-templates select="lookaheads"/>
     </xsl:with-param>
@@ -311,7 +319,7 @@
   <xsl:param name="itemset"/>
   <xsl:param name="pad"/>
   <xsl:param name="prev-lhs"/>
-  <xsl:param name="point"/>
+  <xsl:param name="dot"/>
   <xsl:param name="lookaheads"/>
 
   <xsl:if test="$itemset != 'true' and not($prev-lhs = lhs[text()])">
@@ -347,12 +355,12 @@
 
   <!-- RHS -->
   <xsl:for-each select="rhs/*">
-    <xsl:if test="position() = $point + 1">
-      <xsl:text> .</xsl:text>
+    <xsl:if test="position() = $dot + 1">
+      <xsl:text> •</xsl:text>
     </xsl:if>
     <xsl:apply-templates select="."/>
-    <xsl:if test="position() = last() and position() = $point">
-      <xsl:text> .</xsl:text>
+    <xsl:if test="position() = last() and position() = $dot">
+      <xsl:text> •</xsl:text>
     </xsl:if>
   </xsl:for-each>
   <xsl:if test="$lookaheads">
diff --git a/data/xslt/xml2xhtml.xsl b/data/xslt/xml2xhtml.xsl
index 087b035..aaa5dba 100644
--- a/data/xslt/xml2xhtml.xsl
+++ b/data/xslt/xml2xhtml.xsl
@@ -3,7 +3,7 @@
 <!--
     xml2html.xsl - transform Bison XML Report into XHTML.
 
-    Copyright (C) 2007-2015, 2018-2019 Free Software Foundation, Inc.
+    Copyright (C) 2007-2015, 2018-2021 Free Software Foundation, Inc.
 
     This file is part of Bison, the GNU Compiler Compiler.
 
@@ -18,7 +18,7 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
     Written by Wojciech Polak <polak@gnu.org>.
   -->
@@ -26,7 +26,7 @@
 <xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns="http://www.w3.org/1999/xhtml"
-  xmlns:bison="http://www.gnu.org/software/bison/">
+  xmlns:bison="https://www.gnu.org/software/bison/">
 
 <xsl:import href="bison.xsl"/>
 
@@ -75,7 +75,7 @@
       ol.lower-alpha {
         list-style-type: lower-alpha;
       }
-      .point {
+      .dot {
         color: #cc0000;
       }
       #footer {
@@ -88,7 +88,7 @@
       <xsl:apply-templates select="bison-xml-report"/>
       <xsl:text>&#10;&#10;</xsl:text>
       <div id="footer"><hr />This document was generated using
-      <a href="http://www.gnu.org/software/bison/" title="GNU Bison">
+      <a href="https://www.gnu.org/software/bison/" title="GNU Bison">
       GNU Bison <xsl:value-of select="/bison-xml-report/@version"/></a>
       XML Automaton Report.<br />
       <!-- default copying notice -->
@@ -227,6 +227,7 @@
   <xsl:text>&#10;</xsl:text>
   <p class="pre">
     <xsl:call-template name="style-rule-set">
+      <xsl:with-param name="anchor" select="'true'" />
       <xsl:with-param
         name="rule-set" select="rules/rule[@usefulness!='useless-in-grammar']"
       />
@@ -238,9 +239,11 @@
 </xsl:template>
 
 <xsl:template name="style-rule-set">
+  <xsl:param name="anchor"/>
   <xsl:param name="rule-set"/>
   <xsl:for-each select="$rule-set">
     <xsl:apply-templates select=".">
+      <xsl:with-param name="anchor" select="$anchor"/>
       <xsl:with-param name="pad" select="'3'"/>
       <xsl:with-param name="prev-lhs">
         <xsl:if test="position()>1">
@@ -306,9 +309,10 @@
     <xsl:text> Terminals, with rules where they appear</xsl:text>
   </h3>
   <xsl:text>&#10;&#10;</xsl:text>
-  <p class="pre">
+  <ul>
+    <xsl:text>&#10;</xsl:text>
     <xsl:apply-templates select="terminal"/>
-  </p>
+  </ul>
   <xsl:text>&#10;&#10;</xsl:text>
 </xsl:template>
 
@@ -318,41 +322,64 @@
     <xsl:text> Nonterminals, with rules where they appear</xsl:text>
   </h3>
   <xsl:text>&#10;&#10;</xsl:text>
-  <p class="pre">
+  <ul>
+    <xsl:text>&#10;</xsl:text>
     <xsl:apply-templates
       select="nonterminal[@usefulness!='useless-in-grammar']"
     />
-  </p>
+  </ul>
 </xsl:template>
 
 <xsl:template match="terminal">
-  <b><xsl:value-of select="@name"/></b>
-  <xsl:value-of select="concat(' (', @token-number, ')')"/>
-  <xsl:for-each select="key('bison:ruleByRhs', @name)">
-    <xsl:apply-templates select="." mode="number-link"/>
-  </xsl:for-each>
+  <xsl:text>  </xsl:text>
+  <li>
+    <b><xsl:value-of select="@name"/></b>
+    <xsl:if test="string-length(@type) != 0">
+      <xsl:value-of select="concat(' &lt;', @type, '&gt;')"/>
+    </xsl:if>
+    <xsl:value-of select="concat(' (', @token-number, ')')"/>
+    <xsl:for-each select="key('bison:ruleByRhs', @name)">
+      <xsl:apply-templates select="." mode="number-link"/>
+    </xsl:for-each>
+  </li>
   <xsl:text>&#10;</xsl:text>
 </xsl:template>
 
 <xsl:template match="nonterminal">
-  <b><xsl:value-of select="@name"/></b>
-  <xsl:value-of select="concat(' (', @symbol-number, ')')"/>
-  <xsl:text>&#10;    </xsl:text>
-  <xsl:if test="key('bison:ruleByLhs', @name)">
-    <xsl:text>on left:</xsl:text>
-    <xsl:for-each select="key('bison:ruleByLhs', @name)">
-      <xsl:apply-templates select="." mode="number-link"/>
-    </xsl:for-each>
-  </xsl:if>
-  <xsl:if test="key('bison:ruleByRhs', @name)">
-    <xsl:if test="key('bison:ruleByLhs', @name)">
-      <xsl:text>&#10;    </xsl:text>
+  <xsl:text>  </xsl:text>
+  <li>
+    <b><xsl:value-of select="@name"/></b>
+    <xsl:if test="string-length(@type) != 0">
+      <xsl:value-of select="concat(' &lt;', @type, '&gt;')"/>
     </xsl:if>
-    <xsl:text>on right:</xsl:text>
-    <xsl:for-each select="key('bison:ruleByRhs', @name)">
-      <xsl:apply-templates select="." mode="number-link"/>
-    </xsl:for-each>
-  </xsl:if>
+    <xsl:value-of select="concat(' (', @symbol-number, ')')"/>
+    <xsl:text>&#10;    </xsl:text>
+    <ul>
+      <xsl:text>&#10;</xsl:text>
+      <xsl:if test="key('bison:ruleByLhs', @name)">
+        <xsl:text>      </xsl:text>
+        <li>
+          <xsl:text>on left:</xsl:text>
+          <xsl:for-each select="key('bison:ruleByLhs', @name)">
+            <xsl:apply-templates select="." mode="number-link"/>
+          </xsl:for-each>
+        </li>
+        <xsl:text>&#10;</xsl:text>
+      </xsl:if>
+      <xsl:if test="key('bison:ruleByRhs', @name)">
+        <xsl:text>      </xsl:text>
+        <li>
+          <xsl:text>on right:</xsl:text>
+          <xsl:for-each select="key('bison:ruleByRhs', @name)">
+            <xsl:apply-templates select="." mode="number-link"/>
+          </xsl:for-each>
+        </li>
+        <xsl:text>&#10;</xsl:text>
+      </xsl:if>
+    <xsl:text>    </xsl:text>
+    </ul>
+    <xsl:text>&#10;  </xsl:text>
+  </li>
   <xsl:text>&#10;</xsl:text>
 </xsl:template>
 
@@ -385,7 +412,7 @@
         <xsl:value-of select="concat('state_', @number)"/>
       </xsl:attribute>
     </a>
-    <xsl:text>state </xsl:text>
+    <xsl:text>State </xsl:text>
     <xsl:value-of select="@number"/>
   </h3>
   <xsl:text>&#10;&#10;</xsl:text>
@@ -457,35 +484,44 @@
     <xsl:with-param name="prev-lhs"
       select="key('bison:ruleByNumber', $prev-rule-number)/lhs[text()]"
    />
-    <xsl:with-param name="point" select="@point"/>
+    <xsl:with-param name="dot" select="@dot"/>
     <xsl:with-param name="lookaheads">
       <xsl:apply-templates select="lookaheads"/>
     </xsl:with-param>
   </xsl:apply-templates>
 </xsl:template>
 
+<!--
+anchor = 'true': define as an <a> anchor.
+itemset = 'true': show the items.
+ -->
 <xsl:template match="rule">
+  <xsl:param name="anchor"/>
   <xsl:param name="itemset"/>
   <xsl:param name="pad"/>
   <xsl:param name="prev-lhs"/>
-  <xsl:param name="point"/>
+  <xsl:param name="dot"/>
   <xsl:param name="lookaheads"/>
 
   <xsl:if test="$itemset != 'true' and not($prev-lhs = lhs[text()])">
     <xsl:text>&#10;</xsl:text>
   </xsl:if>
 
-  <xsl:if test="$itemset != 'true'">
-    <a>
-      <xsl:attribute name="name">
-        <xsl:value-of select="concat('rule_', @number)"/>
-      </xsl:attribute>
-    </a>
-  </xsl:if>
   <xsl:text>  </xsl:text>
 
   <xsl:choose>
-    <xsl:when test="$itemset = 'true'">
+    <xsl:when test="$anchor = 'true'">
+      <a>
+        <xsl:attribute name="name">
+          <xsl:value-of select="concat('rule_', @number)"/>
+        </xsl:attribute>
+        <xsl:call-template name="lpad">
+          <xsl:with-param name="str" select="string(@number)"/>
+          <xsl:with-param name="pad" select="number($pad)"/>
+        </xsl:call-template>
+      </a>
+    </xsl:when>
+    <xsl:otherwise>
       <a>
         <xsl:attribute name="href">
           <xsl:value-of select="concat('#rule_', @number)"/>
@@ -495,25 +531,13 @@
           <xsl:with-param name="pad" select="number($pad)"/>
         </xsl:call-template>
       </a>
-    </xsl:when>
-    <xsl:otherwise>
-      <xsl:call-template name="lpad">
-        <xsl:with-param name="str" select="string(@number)"/>
-        <xsl:with-param name="pad" select="number($pad)"/>
-      </xsl:call-template>
     </xsl:otherwise>
   </xsl:choose>
   <xsl:text> </xsl:text>
 
   <!-- LHS -->
   <xsl:choose>
-    <xsl:when test="$itemset != 'true' and $prev-lhs = lhs[text()]">
-      <xsl:call-template name="lpad">
-        <xsl:with-param name="str" select="'|'"/>
-        <xsl:with-param name="pad" select="number(string-length(lhs[text()])) + 2"/>
-      </xsl:call-template>
-    </xsl:when>
-    <xsl:when test="$itemset = 'true' and $prev-lhs = lhs[text()]">
+    <xsl:when test="$prev-lhs = lhs[text()]">
       <xsl:call-template name="lpad">
         <xsl:with-param name="str" select="'|'"/>
         <xsl:with-param name="pad" select="number(string-length(lhs[text()])) + 2"/>
@@ -529,14 +553,14 @@
 
   <!-- RHS -->
   <xsl:for-each select="rhs/*">
-    <xsl:if test="position() = $point + 1">
+    <xsl:if test="position() = $dot + 1">
       <xsl:text> </xsl:text>
-      <span class="point">.</span>
+      <span class="dot">&#x2022;</span>
     </xsl:if>
     <xsl:apply-templates select="."/>
-    <xsl:if test="position() = last() and position() = $point">
+    <xsl:if test="position() = last() and position() = $dot">
       <xsl:text> </xsl:text>
-      <span class="point">.</span>
+      <span class="dot">&#x2022;</span>
     </xsl:if>
   </xsl:for-each>
   <xsl:if test="$lookaheads">
diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in
index c646c4d..c1331b7 100644
--- a/doc/Doxyfile.in
+++ b/doc/Doxyfile.in
@@ -1,4 +1,4 @@
-# Doxyfile 1.8.7
+# Doxyfile 1.9.1
 
 # This file describes the settings to be used by the documentation system
 # doxygen (www.doxygen.org) for a project.
@@ -17,11 +17,11 @@
 # Project related configuration options
 #---------------------------------------------------------------------------
 
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all text
-# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
-# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
-# for the list of possible encodings.
+# This tag specifies the encoding used for all characters in the configuration
+# file that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
 # The default value is: UTF-8.
 
 DOXYFILE_ENCODING      = UTF-8
@@ -32,13 +32,13 @@
 # title of most generated pages and in a few other places.
 # The default value is: My Project.
 
-PROJECT_NAME           = "@PACKAGE_NAME@"
+PROJECT_NAME           = @PACKAGE_NAME@
 
 # The PROJECT_NUMBER tag can be used to enter a project or revision number. This
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = "@PACKAGE_VERSION@"
+PROJECT_NUMBER         = @PACKAGE_VERSION@
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
@@ -46,10 +46,10 @@
 
 PROJECT_BRIEF          = "Generate a deterministic LR or generalized LR (GLR) parser employing LALR(1), IELR(1), or canonical LR(1) parser tables."
 
-# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
-# the documentation. The maximum height of the logo should not exceed 55 pixels
-# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
-# to the output directory.
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
 
 PROJECT_LOGO           =
 
@@ -60,7 +60,7 @@
 
 OUTPUT_DIRECTORY       = @top_builddir@/doc
 
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
 # directories (in 2 levels) under the output directory of each output format and
 # will distribute the generated files over these directories. Enabling this
 # option can be useful when feeding doxygen a huge amount of source files, where
@@ -93,14 +93,22 @@
 
 OUTPUT_LANGUAGE        = English
 
-# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all generated output in the proper direction.
+# Possible values are: None, LTR, RTL and Context.
+# The default value is: None.
+
+OUTPUT_TEXT_DIRECTION  = None
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
 # descriptions after the members that are listed in the file and class
 # documentation (similar to Javadoc). Set to NO to disable this.
 # The default value is: YES.
 
 BRIEF_MEMBER_DESC      = YES
 
-# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
 # description of a member or function before the detailed description
 #
 # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
@@ -135,7 +143,7 @@
 
 INLINE_INHERITED_MEMB  = YES
 
-# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
 # before files name in the file list and in the header files. If set to NO the
 # shortest path that makes the file name unique will be used
 # The default value is: YES.
@@ -179,6 +187,16 @@
 
 JAVADOC_AUTOBRIEF      = NO
 
+# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
+# such as
+# /***************
+# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
+# Javadoc-style will behave just like regular comments and it will not be
+# interpreted by doxygen.
+# The default value is: NO.
+
+JAVADOC_BANNER         = NO
+
 # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
 # line (until the first dot) of a Qt-style comment as the brief description. If
 # set to NO, the Qt-style will behave just like regular Qt-style comments (thus
@@ -199,15 +217,23 @@
 
 MULTILINE_CPP_IS_BRIEF = NO
 
+# By default Python docstrings are displayed as preformatted text and doxygen's
+# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
+# doxygen's special commands can be used and the contents of the docstring
+# documentation blocks is shown as doxygen documentation.
+# The default value is: YES.
+
+PYTHON_DOCSTRING       = YES
+
 # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
 # documentation from any documented member that it re-implements.
 # The default value is: YES.
 
 INHERIT_DOCS           = YES
 
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
-# new page for each member. If set to NO, the documentation of a member will be
-# part of the file/class/namespace that contains it.
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
 # The default value is: NO.
 
 SEPARATE_MEMBER_PAGES  = NO
@@ -226,16 +252,15 @@
 # will allow you to put the command \sideeffect (or @sideeffect) in the
 # documentation, which will result in a user-defined paragraph with heading
 # "Side Effects:". You can put \n's in the value part of an alias to insert
-# newlines.
+# newlines (in the resulting output). You can put ^^ in the value part of an
+# alias to insert a newline as if a physical newline was in the original file.
+# When you need a literal { or } or , in the value part of an alias you have to
+# escape them by means of a backslash (\), this can lead to conflicts with the
+# commands \{ and \} for these it is advised to use the version @{ and @} or use
+# a double escape (\\{ and \\})
 
 ALIASES                =
 
-# This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding "class=itcl::class"
-# will allow you to use the command class in the itcl::class meaning.
-
-TCL_SUBST              =
-
 # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
 # only. Doxygen will then generate output that is more tailored for C. For
 # instance, some of the names that are used will be different. The list of all
@@ -264,28 +289,40 @@
 
 OPTIMIZE_OUTPUT_VHDL   = NO
 
+# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
+# sources only. Doxygen will then generate output that is more tailored for that
+# language. For instance, namespaces will be presented as modules, types will be
+# separated into more groups, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_SLICE  = NO
+
 # Doxygen selects the parser to use depending on the extension of the files it
 # parses. With this tag you can assign which parser to use for a given
 # extension. Doxygen has a built-in mapping, but you can override or extend it
 # using this tag. The format is ext=language, where ext is a file extension, and
-# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
-# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
-# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
-# Fortran. In the later case the parser tries to guess whether the code is fixed
-# or free formatted code, this is the default for Fortran type files), VHDL. For
-# instance to make doxygen treat .inc files as Fortran files (default is PHP),
-# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
+# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL,
+# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
+# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
+# tries to guess whether the code is fixed or free formatted code, this is the
+# default for Fortran type files). For instance to make doxygen treat .inc files
+# as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C.
 #
-# Note For files without extension you can use no_extension as a placeholder.
+# Note: For files without extension you can use no_extension as a placeholder.
 #
 # Note that for custom extensions you also need to set FILE_PATTERNS otherwise
-# the files are not read by doxygen.
+# the files are not read by doxygen. When specifying no_extension you should add
+# * to the FILE_PATTERNS.
+#
+# Note see also the list of default file extension mappings.
 
 EXTENSION_MAPPING      =
 
 # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
 # according to the Markdown format, which allows for more readable
-# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# documentation. See https://daringfireball.net/projects/markdown/ for details.
 # The output of markdown processing is further processed by doxygen, so you can
 # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
 # case of backward compatibilities issues.
@@ -293,10 +330,19 @@
 
 MARKDOWN_SUPPORT       = YES
 
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 5.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS   = 5
+
 # When enabled doxygen tries to link words that correspond to documented
 # classes, or namespaces to their corresponding documentation. Such a link can
-# be prevented in individual cases by by putting a % sign in front of the word
-# or globally by setting AUTOLINK_SUPPORT to NO.
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
 # The default value is: YES.
 
 AUTOLINK_SUPPORT       = YES
@@ -318,7 +364,7 @@
 CPP_CLI_SUPPORT        = NO
 
 # Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
-# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
 # will parse them like normal C++ but will assume all classes use public instead
 # of private inheritance when no explicit protection keyword is present.
 # The default value is: NO.
@@ -336,13 +382,20 @@
 IDL_PROPERTY_SUPPORT   = YES
 
 # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
+# tag is set to YES then doxygen will reuse the documentation of the first
 # member in the group (if any) for the other members of the group. By default
 # all members of a group must be documented explicitly.
 # The default value is: NO.
 
 DISTRIBUTE_GROUP_DOC   = NO
 
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
 # Set the SUBGROUPING tag to YES to allow class member groups of the same type
 # (for instance a group of public functions) to be put as a subgroup of that
 # type (e.g. under the Public Functions section). Set it to NO to prevent
@@ -397,11 +450,24 @@
 
 LOOKUP_CACHE_SIZE      = 0
 
+# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use
+# during processing. When set to 0 doxygen will based this on the number of
+# cores available in the system. You can set it explicitly to a value larger
+# than 0 to get more control over the balance between CPU load and processing
+# speed. At this moment only the input processing can be done using multiple
+# threads. Since this is still an experimental feature the default is set to 1,
+# which efficively disables parallel processing. Please report any issues you
+# encounter. Generating dot graphs in parallel is controlled by the
+# DOT_NUM_THREADS setting.
+# Minimum value: 0, maximum value: 32, default value: 1.
+
+NUM_PROC_THREADS       = 1
+
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
 
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
 # documentation are documented, even if no documentation was available. Private
 # class members and static file members will be hidden unless the
 # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
@@ -411,35 +477,41 @@
 
 EXTRACT_ALL            = YES
 
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
 # be included in the documentation.
 # The default value is: NO.
 
 EXTRACT_PRIVATE        = YES
 
-# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
+# methods of a class will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIV_VIRTUAL   = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
 # scope will be included in the documentation.
 # The default value is: NO.
 
 EXTRACT_PACKAGE        = NO
 
-# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
 # included in the documentation.
 # The default value is: NO.
 
 EXTRACT_STATIC         = YES
 
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
-# locally in source files will be included in the documentation. If set to NO
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
 # only classes defined in header files are included. Does not have any effect
 # for Java sources.
 # The default value is: YES.
 
 EXTRACT_LOCAL_CLASSES  = YES
 
-# This flag is only useful for Objective-C code. When set to YES local methods,
+# This flag is only useful for Objective-C code. If set to YES, local methods,
 # which are defined in the implementation section but not in the interface are
-# included in the documentation. If set to NO only methods in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
 # included.
 # The default value is: NO.
 
@@ -454,6 +526,13 @@
 
 EXTRACT_ANON_NSPACES   = NO
 
+# If this flag is set to YES, the name of an unnamed parameter in a declaration
+# will be determined by the corresponding definition. By default unnamed
+# parameters remain unnamed in the output.
+# The default value is: YES.
+
+RESOLVE_UNNAMED_PARAMS = YES
+
 # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
 # undocumented members inside documented classes or files. If set to NO these
 # members will be included in the various overviews, but no documentation
@@ -464,21 +543,21 @@
 
 # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
 # undocumented classes that are normally visible in the class hierarchy. If set
-# to NO these classes will be included in the various overviews. This option has
-# no effect if EXTRACT_ALL is enabled.
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
 # The default value is: NO.
 
 HIDE_UNDOC_CLASSES     = NO
 
 # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
-# (class|struct|union) declarations. If set to NO these declarations will be
-# included in the documentation.
+# declarations. If set to NO, these declarations will be included in the
+# documentation.
 # The default value is: NO.
 
 HIDE_FRIEND_COMPOUNDS  = NO
 
 # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
-# documentation blocks found inside the body of a function. If set to NO these
+# documentation blocks found inside the body of a function. If set to NO, these
 # blocks will be appended to the function's detailed documentation block.
 # The default value is: NO.
 
@@ -491,22 +570,36 @@
 
 INTERNAL_DOCS          = NO
 
-# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
+# With the correct setting of option CASE_SENSE_NAMES doxygen will better be
+# able to match the capabilities of the underlying filesystem. In case the
+# filesystem is case sensitive (i.e. it supports files in the same directory
+# whose names only differ in casing), the option must be set to YES to properly
+# deal with such files in case they appear in the input. For filesystems that
+# are not case sensitive the option should be be set to NO to properly deal with
+# output files written for symbols that only differ in casing, such as for two
+# classes, one named CLASS and the other named Class, and to also support
+# references to files without having to specify the exact matching casing. On
+# Windows (including Cygwin) and MacOS, users should typically set this option
+# to NO, whereas on Linux or other Unix flavors it should typically be set to
+# YES.
 # The default value is: system dependent.
 
 CASE_SENSE_NAMES       = YES
 
 # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
-# their full class and namespace scopes in the documentation. If set to YES the
+# their full class and namespace scopes in the documentation. If set to YES, the
 # scope will be hidden.
 # The default value is: NO.
 
 HIDE_SCOPE_NAMES       = NO
 
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
 # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
 # the files that are included by a file in the documentation of that file.
 # The default value is: YES.
@@ -534,14 +627,14 @@
 
 # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
 # (detailed) documentation of file and class members alphabetically by member
-# name. If set to NO the members will appear in declaration order.
+# name. If set to NO, the members will appear in declaration order.
 # The default value is: YES.
 
 SORT_MEMBER_DOCS       = YES
 
 # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
 # descriptions of file, namespace and class members alphabetically by member
-# name. If set to NO the members will appear in declaration order. Note that
+# name. If set to NO, the members will appear in declaration order. Note that
 # this will also influence the order of the classes in the class list.
 # The default value is: NO.
 
@@ -586,27 +679,25 @@
 
 STRICT_PROTO_MATCHING  = NO
 
-# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
-# todo list. This list is created by putting \todo commands in the
-# documentation.
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
 # The default value is: YES.
 
 GENERATE_TODOLIST      = YES
 
-# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
-# test list. This list is created by putting \test commands in the
-# documentation.
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
 # The default value is: YES.
 
 GENERATE_TESTLIST      = YES
 
-# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
 # list. This list is created by putting \bug commands in the documentation.
 # The default value is: YES.
 
 GENERATE_BUGLIST       = YES
 
-# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
 # the deprecated list. This list is created by putting \deprecated commands in
 # the documentation.
 # The default value is: YES.
@@ -631,8 +722,8 @@
 MAX_INITIALIZER_LINES  = 30
 
 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
-# the bottom of the documentation of classes and structs. If set to YES the list
-# will mention the files that were used to generate the documentation.
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
 # The default value is: YES.
 
 SHOW_USED_FILES        = YES
@@ -677,11 +768,10 @@
 # The CITE_BIB_FILES tag can be used to specify one or more bib files containing
 # the reference definitions. This must be a list of .bib files. The .bib
 # extension is automatically appended if omitted. This requires the bibtex tool
-# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
 # For LaTeX the style of the bibliography can be controlled using
 # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
-# search path. Do not use file names with spaces, bibtex cannot handle them. See
-# also \cite for info how to create references.
+# search path. See also \cite for info how to create references.
 
 CITE_BIB_FILES         =
 
@@ -697,7 +787,7 @@
 QUIET                  = YES
 
 # The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
 # this implies that the warnings are on.
 #
 # Tip: Turn warnings on while writing the documentation.
@@ -705,7 +795,7 @@
 
 WARNINGS               = YES
 
-# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
 # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
 # will automatically be disabled.
 # The default value is: YES.
@@ -722,12 +812,22 @@
 
 # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
 # are documented, but have no documentation for their parameters or return
-# value. If set to NO doxygen will only warn about wrong or incomplete parameter
-# documentation, but not about the absence of documentation.
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation. If
+# EXTRACT_ALL is set to YES then this flag will automatically be disabled.
 # The default value is: NO.
 
 WARN_NO_PARAMDOC       = NO
 
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
+# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
+# at the end of the doxygen process doxygen will return with a non-zero status.
+# Possible values are: NO, YES and FAIL_ON_WARNINGS.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
 # The WARN_FORMAT tag determines the format of the warning messages that doxygen
 # can produce. The string should contain the $file, $line, and $text tags, which
 # will be replaced by the file and line number from which the warning originated
@@ -751,7 +851,7 @@
 # The INPUT tag is used to specify the files and/or directories that contain
 # documented source files. You may enter file names like myfile.cpp or
 # directories like /usr/src/myproject. Separate the files or directories with
-# spaces.
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
 # Note: If this tag is empty the current directory is searched.
 
 INPUT                  = @top_srcdir@/src \
@@ -760,20 +860,29 @@
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
 # libiconv (or the iconv built into libc) for the transcoding. See the libiconv
-# documentation (see: http://www.gnu.org/software/libiconv) for the list of
-# possible encodings.
+# documentation (see:
+# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
 # The default value is: UTF-8.
 
 INPUT_ENCODING         = UTF-8
 
 # If the value of the INPUT tag contains directories, you can use the
 # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
-# *.h) to filter out the source-files in the directories. If left blank the
-# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
-# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
-# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
-# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
-# *.qsf, *.as and *.js.
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# Note the list of default checked file patterns might differ from the list of
+# default file extension mappings.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment),
+# *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl,
+# *.ucf, *.qsf and *.ice.
 
 FILE_PATTERNS          = *.c \
                          *.h \
@@ -864,6 +973,10 @@
 # Note that the filter must not add or remove lines; it is applied before the
 # code is scanned, but not when the output code is generated. If lines are added
 # or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
 
 INPUT_FILTER           =
 
@@ -873,11 +986,15 @@
 # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
 # filters are used. If the FILTER_PATTERNS tag is empty or if none of the
 # patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
 
 FILTER_PATTERNS        =
 
 # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER ) will also be used to filter the input files that are used for
+# INPUT_FILTER) will also be used to filter the input files that are used for
 # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
 # The default value is: NO.
 
@@ -925,7 +1042,7 @@
 STRIP_CODE_COMMENTS    = YES
 
 # If the REFERENCED_BY_RELATION tag is set to YES then for each documented
-# function all documented functions referencing it will be listed.
+# entity all documented functions referencing it will be listed.
 # The default value is: NO.
 
 REFERENCED_BY_RELATION = YES
@@ -937,7 +1054,7 @@
 REFERENCES_RELATION    = YES
 
 # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
-# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
 # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
 # link to the documentation.
 # The default value is: YES.
@@ -957,12 +1074,12 @@
 # If the USE_HTAGS tag is set to YES then the references to source code will
 # point to the HTML generated by the htags(1) tool instead of doxygen built-in
 # source browser. The htags tool is part of GNU's global source tagging system
-# (see http://www.gnu.org/software/global/global.html). You will need version
+# (see https://www.gnu.org/software/global/global.html). You will need version
 # 4.8.6 or higher.
 #
 # To use it do the following:
 # - Install the latest version of global
-# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
 # - Make sure the INPUT points to the root of the source tree
 # - Run doxygen as normal
 #
@@ -995,13 +1112,6 @@
 
 ALPHABETICAL_INDEX     = YES
 
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-COLS_IN_ALPHA_INDEX    = 5
-
 # In case all classes in a project start with a common prefix, all classes will
 # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
 # can be used to specify a prefix (or a list of prefixes) that should be ignored
@@ -1014,7 +1124,7 @@
 # Configuration options related to the HTML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
 # The default value is: YES.
 
 GENERATE_HTML          = YES
@@ -1076,13 +1186,15 @@
 
 HTML_STYLESHEET        =
 
-# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
-# defined cascading style sheet that is included after the standard style sheets
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
 # created by doxygen. Using this option one can overrule certain style aspects.
 # This is preferred over using HTML_STYLESHEET since it does not replace the
-# standard style sheet and is therefor more robust against future updates.
-# Doxygen will copy the style sheet file to the output directory. For an example
-# see the documentation.
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_EXTRA_STYLESHEET  =
@@ -1098,9 +1210,9 @@
 HTML_EXTRA_FILES       =
 
 # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
-# will adjust the colors in the stylesheet and background images according to
+# will adjust the colors in the style sheet and background images according to
 # this color. Hue is specified as an angle on a colorwheel, see
-# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
 # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
 # purple, and 360 is red again.
 # Minimum value: 0, maximum value: 359, default value: 220.
@@ -1129,12 +1241,24 @@
 
 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
 # page will contain the date and time when the page was generated. Setting this
-# to NO can help when comparing the output of multiple runs.
-# The default value is: YES.
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_TIMESTAMP         = YES
 
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
+# documentation will contain a main index with vertical navigation menus that
+# are dynamically created via JavaScript. If disabled, the navigation index will
+# consists of multiple levels of tabs that are statically embedded in every HTML
+# page. Disable this option to support browsers that do not have JavaScript,
+# like the Qt help browser.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_MENUS     = YES
+
 # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
 # documentation will contain sections that can be hidden and shown after the
 # page has loaded.
@@ -1158,13 +1282,14 @@
 
 # If the GENERATE_DOCSET tag is set to YES, additional index files will be
 # generated that can be used as input for Apple's Xcode 3 integrated development
-# environment (see: http://developer.apple.com/tools/xcode/), introduced with
-# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
-# Makefile in the HTML output directory. Running make will produce the docset in
-# that directory and running make install will install the docset in
+# environment (see:
+# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
+# create a documentation set, doxygen will generate a Makefile in the HTML
+# output directory. Running make will produce the docset in that directory and
+# running make install will install the docset in
 # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
-# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
-# for more information.
+# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
+# genXcode/_index.html for more information.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
@@ -1203,8 +1328,8 @@
 # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
 # additional HTML index files: index.hhp, index.hhc, and index.hhk. The
 # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
-# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
-# Windows.
+# (see:
+# https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows.
 #
 # The HTML Help Workshop contains a compiler that can convert all HTML output
 # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
@@ -1226,28 +1351,28 @@
 CHM_FILE               =
 
 # The HHC_LOCATION tag can be used to specify the location (absolute path
-# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
 # doxygen will try to run the HTML help compiler on the generated index.hhp.
 # The file has to be specified with full path.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 HHC_LOCATION           =
 
-# The GENERATE_CHI flag controls if a separate .chi index file is generated (
-# YES) or that it should be included in the master .chm file ( NO).
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the main .chm file (NO).
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 GENERATE_CHI           = NO
 
-# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
 # and project file content.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 CHM_INDEX_ENCODING     =
 
-# The BINARY_TOC flag controls whether a binary table of contents is generated (
-# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
 # enables the Previous and Next buttons.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
@@ -1279,7 +1404,8 @@
 
 # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
 # Project output. For more information please see Qt Help Project / Namespace
-# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
 # The default value is: org.doxygen.Project.
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
@@ -1287,8 +1413,8 @@
 
 # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
 # Help Project output. For more information please see Qt Help Project / Virtual
-# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
-# folders).
+# Folders (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
 # The default value is: doc.
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
@@ -1296,30 +1422,30 @@
 
 # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
 # filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_CUST_FILTER_NAME   =
 
 # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
 # custom filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_CUST_FILTER_ATTRS  =
 
 # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
 # project's filter section matches. Qt Help Project / Filter Attributes (see:
-# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_SECT_FILTER_ATTRS  =
 
-# The QHG_LOCATION tag can be used to specify the location of Qt's
-# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
-# generated .qhp file.
+# The QHG_LOCATION tag can be used to specify the location (absolute path
+# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to
+# run qhelpgenerator on the generated .qhp file.
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHG_LOCATION           =
@@ -1361,7 +1487,7 @@
 # index structure (just like the one that is generated for HTML Help). For this
 # to work a browser that supports JavaScript, DHTML, CSS and frames is required
 # (i.e. any modern browser). Windows users are probably better off using the
-# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
 # further fine-tune the look of the index. As an example, the default style
 # sheet generated by doxygen has an example that shows how to put an image at
 # the root of the tree instead of the PROJECT_NAME. Since the tree basically has
@@ -1389,13 +1515,24 @@
 
 TREEVIEW_WIDTH         = 250
 
-# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
 # external symbols imported via tag files in a separate window.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
 EXT_LINKS_IN_WINDOW    = NO
 
+# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
+# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
+# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
+# the HTML output. These images will generally look nicer at scaled resolutions.
+# Possible values are: png (the default) and svg (looks nicer but requires the
+# pdf2svg or inkscape tool).
+# The default value is: png.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FORMULA_FORMAT    = png
+
 # Use this tag to change the font size of LaTeX formulas included as images in
 # the HTML documentation. When you change the font size after a successful
 # doxygen run you need to manually remove any form_*.png images from the HTML
@@ -1416,9 +1553,15 @@
 
 FORMULA_TRANSPARENT    = YES
 
+# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
+# to create new LaTeX commands to be used in formulas as building blocks. See
+# the section "Including formulas" for details.
+
+FORMULA_MACROFILE      =
+
 # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
-# http://www.mathjax.org) which uses client side Javascript for the rendering
-# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# https://www.mathjax.org) which uses client side JavaScript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
 # installed or if you want to formulas look prettier in the HTML output. When
 # enabled you may also need to install MathJax separately and configure the path
 # to it using the MATHJAX_RELPATH option.
@@ -1429,7 +1572,7 @@
 
 # When MathJax is enabled you can set the default output format to be used for
 # the MathJax output. See the MathJax site (see:
-# http://docs.mathjax.org/en/latest/output.html) for more details.
+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details.
 # Possible values are: HTML-CSS (which is slower, but has the best
 # compatibility), NativeMML (i.e. MathML) and SVG.
 # The default value is: HTML-CSS.
@@ -1444,8 +1587,8 @@
 # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
 # Content Delivery Network so you can quickly see the result without installing
 # MathJax. However, it is strongly recommended to install a local copy of
-# MathJax from http://www.mathjax.org before deployment.
-# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# MathJax from https://www.mathjax.org before deployment.
+# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2.
 # This tag requires that the tag USE_MATHJAX is set to YES.
 
 MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
@@ -1459,7 +1602,8 @@
 
 # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
 # of code that will be used on startup of the MathJax code. See the MathJax site
-# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
 # example see the documentation.
 # This tag requires that the tag USE_MATHJAX is set to YES.
 
@@ -1487,7 +1631,7 @@
 SEARCHENGINE           = NO
 
 # When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a web server instead of a web client using Javascript. There
+# implemented using a web server instead of a web client using JavaScript. There
 # are two flavors of web server based searching depending on the EXTERNAL_SEARCH
 # setting. When disabled, doxygen will generate a PHP script for searching and
 # an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
@@ -1504,9 +1648,10 @@
 # external search engine pointed to by the SEARCHENGINE_URL option to obtain the
 # search results.
 #
-# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# Doxygen ships with an example indexer (doxyindexer) and search engine
 # (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/).
+# Xapian (see:
+# https://xapian.org/).
 #
 # See the section "External Indexing and Searching" for details.
 # The default value is: NO.
@@ -1517,10 +1662,11 @@
 # The SEARCHENGINE_URL should point to a search engine hosted by a web server
 # which will return the search results when EXTERNAL_SEARCH is enabled.
 #
-# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# Doxygen ships with an example indexer (doxyindexer) and search engine
 # (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/). See the section "External Indexing and
-# Searching" for details.
+# Xapian (see:
+# https://xapian.org/). See the section "External Indexing and Searching" for
+# details.
 # This tag requires that the tag SEARCHENGINE is set to YES.
 
 SEARCHENGINE_URL       =
@@ -1555,7 +1701,7 @@
 # Configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
 # The default value is: YES.
 
 GENERATE_LATEX         = NO
@@ -1571,22 +1717,36 @@
 # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
 # invoked.
 #
-# Note that when enabling USE_PDFLATEX this option is only used for generating
-# bitmaps for formulas in the HTML output, but not in the Makefile that is
-# written to the output directory.
-# The default file is: latex.
+# Note that when not enabling USE_PDFLATEX the default is latex when enabling
+# USE_PDFLATEX the default is pdflatex and when in the later case latex is
+# chosen this is overwritten by pdflatex. For specific output languages the
+# default can have been set differently, this depends on the implementation of
+# the output language.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_CMD_NAME         = latex
 
 # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
 # index for LaTeX.
+# Note: This tag is used in the Makefile / make.bat.
+# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
+# (.tex).
 # The default file is: makeindex.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 MAKEINDEX_CMD_NAME     = makeindex
 
-# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
+# generate index for LaTeX. In case there is no backslash (\) as first character
+# it will be automatically added in the LaTeX code.
+# Note: This tag is used in the generated output file (.tex).
+# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
+# The default value is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_MAKEINDEX_CMD    = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
 # documents. This may be useful for small projects and may help to save some
 # trees in general.
 # The default value is: NO.
@@ -1601,12 +1761,15 @@
 # The default value is: a4.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
-PAPER_TYPE             = a4wide
+PAPER_TYPE             = a4
 
 # The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
-# that should be included in the LaTeX output. To get the times font for
-# instance you can specify
-# EXTRA_PACKAGES=times
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
 # If left blank no extra packages will be included.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
@@ -1620,23 +1783,36 @@
 #
 # Note: Only use a user-defined header if you know what you are doing! The
 # following commands have a special meaning inside the header: $title,
-# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will
-# replace them by respectively the title of the page, the current date and time,
-# only the current date, the version number of doxygen, the project name (see
-# PROJECT_NAME), or the project number (see PROJECT_NUMBER).
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_HEADER           =
 
 # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
 # generated LaTeX document. The footer should contain everything after the last
-# chapter. If it is left blank doxygen will generate a standard footer.
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
 #
 # Note: Only use a user-defined footer if you know what you are doing!
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_FOOTER           =
 
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
 # The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
 # other source files which should be copied to the LATEX_OUTPUT output
 # directory. Note that the files will be copied as-is; there are no commands or
@@ -1654,9 +1830,11 @@
 
 PDF_HYPERLINKS         = YES
 
-# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
-# the PDF file directly from the LaTeX files. Set this option to YES to get a
-# higher quality PDF documentation.
+# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as
+# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
+# files. Set this option to YES, to get a higher quality PDF documentation.
+#
+# See also section LATEX_CMD_NAME for selecting the engine.
 # The default value is: YES.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
@@ -1690,17 +1868,33 @@
 
 # The LATEX_BIB_STYLE tag can be used to specify the style to use for the
 # bibliography, e.g. plainnat, or ieeetr. See
-# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
 # The default value is: plain.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_BIB_STYLE        = plain
 
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
+# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
+# path from which the emoji images will be read. If a relative path is entered,
+# it will be relative to the LATEX_OUTPUT directory. If left blank the
+# LATEX_OUTPUT directory will be used.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EMOJI_DIRECTORY  =
+
 #---------------------------------------------------------------------------
 # Configuration options related to the RTF output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
 # RTF output is optimized for Word 97 and may not look too pretty with other RTF
 # readers/editors.
 # The default value is: NO.
@@ -1715,7 +1909,7 @@
 
 RTF_OUTPUT             = rtf
 
-# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
 # documents. This may be useful for small projects and may help to save some
 # trees in general.
 # The default value is: NO.
@@ -1735,9 +1929,9 @@
 
 RTF_HYPERLINKS         = NO
 
-# Load stylesheet definitions from file. Syntax is similar to doxygen's config
-# file, i.e. a series of assignments. You only have to provide replacements,
-# missing definitions are set to their default value.
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# configuration file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
 #
 # See also section "Doxygen usage" for information on how to generate the
 # default style sheet that doxygen normally uses.
@@ -1746,17 +1940,27 @@
 RTF_STYLESHEET_FILE    =
 
 # Set optional variables used in the generation of an RTF document. Syntax is
-# similar to doxygen's config file. A template extensions file can be generated
-# using doxygen -e rtf extensionFile.
+# similar to doxygen's configuration file. A template extensions file can be
+# generated using doxygen -e rtf extensionFile.
 # This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_EXTENSIONS_FILE    =
 
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
+
 #---------------------------------------------------------------------------
 # Configuration options related to the man page output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
 # classes and files.
 # The default value is: NO.
 
@@ -1800,7 +2004,7 @@
 # Configuration options related to the XML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
 # captures the structure of the code including all documentation.
 # The default value is: NO.
 
@@ -1814,7 +2018,7 @@
 
 XML_OUTPUT             = xml
 
-# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
 # listings (including syntax highlighting and cross-referencing information) to
 # the XML output. Note that enabling this will significantly increase the size
 # of the XML output.
@@ -1823,11 +2027,18 @@
 
 XML_PROGRAMLISTING     = YES
 
+# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
+# namespace members in file scope as well, matching the HTML output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_NS_MEMB_FILE_SCOPE = NO
+
 #---------------------------------------------------------------------------
 # Configuration options related to the DOCBOOK output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
 # that can be used to generate PDF.
 # The default value is: NO.
 
@@ -1841,14 +2052,23 @@
 
 DOCBOOK_OUTPUT         = docbook
 
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
 #---------------------------------------------------------------------------
 # Configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
-# Definitions (see http://autogen.sf.net) file that captures the structure of
-# the code including all documentation. Note that this feature is still
-# experimental and incomplete at the moment.
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
+# the structure of the code including all documentation. Note that this feature
+# is still experimental and incomplete at the moment.
 # The default value is: NO.
 
 GENERATE_AUTOGEN_DEF   = NO
@@ -1857,7 +2077,7 @@
 # Configuration options related to the Perl module output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
 # file that captures the structure of the code including all documentation.
 #
 # Note that this feature is still experimental and incomplete at the moment.
@@ -1865,7 +2085,7 @@
 
 GENERATE_PERLMOD       = NO
 
-# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
 # Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
 # output from the Perl module output.
 # The default value is: NO.
@@ -1873,9 +2093,9 @@
 
 PERLMOD_LATEX          = NO
 
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
 # formatted so it can be parsed by a human reader. This is useful if you want to
-# understand what is going on. On the other hand, if this tag is set to NO the
+# understand what is going on. On the other hand, if this tag is set to NO, the
 # size of the Perl module output will be much smaller and Perl will parse it
 # just the same.
 # The default value is: YES.
@@ -1895,14 +2115,14 @@
 # Configuration options related to the preprocessor
 #---------------------------------------------------------------------------
 
-# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
 # C-preprocessor directives found in the sources and include files.
 # The default value is: YES.
 
 ENABLE_PREPROCESSING   = YES
 
-# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
-# in the source code. If set to NO only conditional compilation will be
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
 # performed. Macro expansion can be done in a controlled way by setting
 # EXPAND_ONLY_PREDEF to YES.
 # The default value is: NO.
@@ -1918,7 +2138,7 @@
 
 EXPAND_ONLY_PREDEF     = NO
 
-# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
 # INCLUDE_PATH will be searched if a #include is found.
 # The default value is: YES.
 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
@@ -1996,37 +2216,32 @@
 
 GENERATE_TAGFILE       =
 
-# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
-# class index. If set to NO only the inherited external classes will be listed.
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
 # The default value is: NO.
 
 ALLEXTERNALS           = NO
 
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
-# the modules index. If set to NO, only the current project's groups will be
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
 # listed.
 # The default value is: YES.
 
 EXTERNAL_GROUPS        = YES
 
-# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
 # the related pages index. If set to NO, only the current project's pages will
 # be listed.
 # The default value is: YES.
 
 EXTERNAL_PAGES         = YES
 
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of 'which perl').
-# The default file (with absolute path) is: /usr/bin/perl.
-
-PERL_PATH              = @PERL@
-
 #---------------------------------------------------------------------------
 # Configuration options related to the dot tool
 #---------------------------------------------------------------------------
 
-# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
 # (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
 # NO turns the diagrams off. Note that this option also works with HAVE_DOT
 # disabled, but it is recommended to install and use dot, since it yields more
@@ -2035,15 +2250,6 @@
 
 CLASS_DIAGRAMS         = YES
 
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see:
-# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH            =
-
 # You can include diagrams made with dia in doxygen documentation. Doxygen will
 # then run dia to produce the diagram and insert it in the documentation. The
 # DIA_PATH tag allows you to specify the directory where the dia binary resides.
@@ -2051,7 +2257,7 @@
 
 DIA_PATH               =
 
-# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# If set to YES the inheritance and collaboration graphs will hide inheritance
 # and usage relations if the target is undocumented or is not a class.
 # The default value is: YES.
 
@@ -2076,7 +2282,7 @@
 
 DOT_NUM_THREADS        = 0
 
-# When you want a differently looking font n the dot files that doxygen
+# When you want a differently looking font in the dot files that doxygen
 # generates you can specify the font name using DOT_FONTNAME. You need to make
 # sure dot is able to find the font, which can be done by putting it in a
 # standard location or by setting the DOTFONTPATH environment variable or by
@@ -2124,7 +2330,7 @@
 
 GROUP_GRAPHS           = YES
 
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
 # collaboration diagrams in a style similar to the OMG's Unified Modeling
 # Language.
 # The default value is: NO.
@@ -2141,10 +2347,32 @@
 # but if the number exceeds 15, the total amount of fields shown is limited to
 # 10.
 # Minimum value: 0, maximum value: 100, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
+# This tag requires that the tag UML_LOOK is set to YES.
 
 UML_LIMIT_NUM_FIELDS   = 10
 
+# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and
+# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
+# tag is set to YES, doxygen will add type and arguments for attributes and
+# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen
+# will not generate fields with class member information in the UML graphs. The
+# class diagrams will look similar to the default class diagrams but using UML
+# notation for the relationships.
+# Possible values are: NO, YES and NONE.
+# The default value is: NO.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+DOT_UML_DETAILS        = NO
+
+# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
+# to display on a single line. If the actual line length exceeds this threshold
+# significantly it will wrapped across multiple lines. Some heuristics are apply
+# to avoid ugly line breaks.
+# Minimum value: 0, maximum value: 1000, default value: 17.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_WRAP_THRESHOLD     = 17
+
 # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
 # collaboration graphs will show the relations between templates and their
 # instances.
@@ -2176,7 +2404,8 @@
 #
 # Note that enabling this option will significantly increase the time of a run.
 # So in most cases it will be better to enable call graphs for selected
-# functions only using the \callgraph command.
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
 # The default value is: NO.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
@@ -2187,7 +2416,8 @@
 #
 # Note that enabling this option will significantly increase the time of a run.
 # So in most cases it will be better to enable caller graphs for selected
-# functions only using the \callergraph command.
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
 # The default value is: NO.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
@@ -2210,11 +2440,15 @@
 DIRECTORY_GRAPH        = YES
 
 # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot.
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
 # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
 # to make the SVG files visible in IE 9+ (other browsers do not have this
 # requirement).
-# Possible values are: png, jpg, gif and svg.
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
 # The default value is: png.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
@@ -2257,6 +2491,24 @@
 
 DIAFILE_DIRS           =
 
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      =
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE      =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  =
+
 # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
 # that will be shown in the graph. If the number of nodes in a graph becomes
 # larger than this value, doxygen will truncate the graph, which is visualized
@@ -2293,7 +2545,7 @@
 
 DOT_TRANSPARENT        = NO
 
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
 # files in one run (i.e. multiple -o and -T options on the command line). This
 # makes dot run faster, but since only newer versions of dot (>1.8.10) support
 # this, this feature is disabled by default.
@@ -2310,9 +2562,11 @@
 
 GENERATE_LEGEND        = YES
 
-# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
 # files that are used to generate the various graphs.
+#
+# Note: This setting is not only used for dot files but also for msc and
+# plantuml temporary files.
 # The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_CLEANUP            = YES
diff --git a/doc/bison.1 b/doc/bison.1
index 0537cfc..c1bb7a2 100644
--- a/doc/bison.1
+++ b/doc/bison.1
@@ -1,5 +1,5 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.11.
-.TH BISON "1" "December 2019" "bison 3.5" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.48.4.
+.TH BISON "1" "September 2021" "GNU Bison 3.8.2" "User Commands"
 .SH NAME
 bison \- GNU Project parser generator (yacc replacement)
 .SH SYNOPSIS
@@ -118,6 +118,9 @@
 conflicts\-rr
 R/R conflicts (enabled by default)
 .TP
+counterexamples, cex
+generate conflict counterexamples
+.TP
 dangling\-alias
 string aliases not attached to a symbol
 .TP
@@ -140,7 +143,7 @@
 all other warnings (enabled by default)
 .TP
 all
-all the warnings except 'dangling\-alias' and 'yacc'
+all the warnings except 'counterexamples', 'dangling\-alias' and 'yacc'
 .TP
 no\-CATEGORY
 turn off warnings in CATEGORY
@@ -195,7 +198,7 @@
 emulate POSIX Yacc
 .SS "Output Files:"
 .TP
-\fB\-\-defines\fR[=\fI\,FILE\/\fR]
+\fB\-H\fR, \fB\-\-header\fR=\fI\,[FILE]\/\fR
 also produce a header file
 .TP
 \fB\-d\fR
@@ -219,8 +222,14 @@
 \fB\-g\fR, \fB\-\-graph\fR[=\fI\,FILE\/\fR]
 also output a graph of the automaton
 .TP
+\fB\-\-html\fR[=\fI\,FILE\/\fR]
+also output an HTML report of the automaton
+.TP
 \fB\-x\fR, \fB\-\-xml\fR[=\fI\,FILE\/\fR]
 also output an XML report of the automaton
+.TP
+\fB\-M\fR, \fB\-\-file\-prefix\-map\fR=\fI\,OLD=NEW\/\fR replace prefix OLD with NEW when writing file paths
+in output files
 .SS "THINGS is a list of comma separated words that can include:"
 .TP
 states
@@ -235,6 +244,9 @@
 solved
 describe shift/reduce conflicts solving
 .TP
+counterexamples, cex
+generate conflict counterexamples
+.TP
 all
 include all the above information
 .TP
@@ -245,13 +257,13 @@
 .SH "REPORTING BUGS"
 Report bugs to <bug\-bison@gnu.org>.
 .br
-GNU Bison home page: <http://www.gnu.org/software/bison/>.
+GNU Bison home page: <https://www.gnu.org/software/bison/>.
 .br
-General help using GNU software: <http://www.gnu.org/gethelp/>.
+General help using GNU software: <https://www.gnu.org/gethelp/>.
 .br
 For complete documentation, run: info bison.
 .SH COPYRIGHT
-Copyright \(co 2019 Free Software Foundation, Inc.
+Copyright \(co 2021 Free Software Foundation, Inc.
 .br
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
diff --git a/doc/bison.help b/doc/bison.help
index d163329..4907ec6 100644
--- a/doc/bison.help
+++ b/doc/bison.help
@@ -1,7 +1,7 @@
-bison (GNU Bison) 3.5
+bison (GNU Bison) 3.8.2
 Written by Robert Corbett and Richard Stallman.
 
-Copyright (C) 2019 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 Usage: bison [OPTION]... FILE
@@ -38,6 +38,8 @@
 Warning categories include:
   conflicts-sr      S/R conflicts (enabled by default)
   conflicts-rr      R/R conflicts (enabled by default)
+  counterexamples, cex
+                    generate conflict counterexamples
   dangling-alias    string aliases not attached to a symbol
   deprecated        obsolete constructs
   empty-rule        empty rules without %empty
@@ -45,7 +47,7 @@
   precedence        useless precedence and associativity
   yacc              incompatibilities with POSIX Yacc
   other             all other warnings (enabled by default)
-  all               all the warnings except 'dangling-alias' and 'yacc'
+  all               all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'
   no-CATEGORY       turn off warnings in CATEGORY
   none              turn off all the warnings
   error[=CATEGORY]  treat warnings as errors
@@ -70,25 +72,30 @@
   -y, --yacc                       emulate POSIX Yacc
 
 Output Files:
-      --defines[=FILE]       also produce a header file
-  -d                         likewise but cannot specify FILE (for POSIX Yacc)
-  -r, --report=THINGS        also produce details on the automaton
-      --report-file=FILE     write report to FILE
-  -v, --verbose              same as '--report=state'
-  -b, --file-prefix=PREFIX   specify a PREFIX for output files
-  -o, --output=FILE          leave output to FILE
-  -g, --graph[=FILE]         also output a graph of the automaton
-  -x, --xml[=FILE]           also output an XML report of the automaton
+  -H, --header=[FILE]           also produce a header file
+  -d                            likewise but cannot specify FILE (for POSIX Yacc)
+  -r, --report=THINGS           also produce details on the automaton
+      --report-file=FILE        write report to FILE
+  -v, --verbose                 same as '--report=state'
+  -b, --file-prefix=PREFIX      specify a PREFIX for output files
+  -o, --output=FILE             leave output to FILE
+  -g, --graph[=FILE]            also output a graph of the automaton
+      --html[=FILE]             also output an HTML report of the automaton
+  -x, --xml[=FILE]              also output an XML report of the automaton
+  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing file paths
+                                in output files
 
 THINGS is a list of comma separated words that can include:
-  states      describe the states
-  itemsets    complete the core item sets with their closure
-  lookaheads  explicitly associate lookahead tokens to items
-  solved      describe shift/reduce conflicts solving
-  all         include all the above information
-  none        disable the report
+  states            describe the states
+  itemsets          complete the core item sets with their closure
+  lookaheads        explicitly associate lookahead tokens to items
+  solved            describe shift/reduce conflicts solving
+  counterexamples, cex
+                    generate conflict counterexamples
+  all               include all the above information
+  none              disable the report
 
 Report bugs to <bug-bison@gnu.org>.
-GNU Bison home page: <http://www.gnu.org/software/bison/>.
-General help using GNU software: <http://www.gnu.org/gethelp/>.
+GNU Bison home page: <https://www.gnu.org/software/bison/>.
+General help using GNU software: <https://www.gnu.org/gethelp/>.
 For complete documentation, run: info bison.
diff --git a/doc/bison.info b/doc/bison.info
index 989f1dd..4f4fb08 100644
--- a/doc/bison.info
+++ b/doc/bison.info
Binary files differ
diff --git a/doc/bison.info.bak b/doc/bison.info.bak
index 5ce9611..4f4fb08 100644
--- a/doc/bison.info.bak
+++ b/doc/bison.info.bak
Binary files differ
diff --git a/doc/bison.texi b/doc/bison.texi
index 60cd0ab..a559649 100644
--- a/doc/bison.texi
+++ b/doc/bison.texi
@@ -4,50 +4,144 @@
 @documentencoding UTF-8
 @include version.texi
 @settitle Bison @value{VERSION}
+@xrefautomaticsectiontitle on
+
+@c cite a reference in text.  Could not find a means to have a single
+@c definition that looks nice in all the output formats.
+@iftex
+@macro tcite{ref}
+@ref{\ref\,,\ref\}
+@end macro
+@end iftex
+@ifnottex
+@macro tcite{ref}
+@ref{\ref\}
+@end macro
+@end ifnottex
+
+@c cite a reference in parentheses.
+@iftex
+@macro pcite{ref}
+(@pxref{\ref\,,\ref\})
+@end macro
+@end iftex
+@ifnottex
+@macro pcite{ref}
+(@pxref{\ref\})
+@end macro
+@end ifnottex
+
+
+@c ## ---------------------- ##
+@c ## Diagnostics in color.  ##
+@c ## ---------------------- ##
 
 @tex
-\gdef\rgbWarning{0.50 0 0.50}
-\gdef\colorWarning{%
- \setcolor{\rgbWarning}%
+\gdef\rgbGreen{0 .80 0}
+\gdef\colorGreen{%
+ \setcolor{\rgbGreen}%
 }
+\gdef\rgbYellow{1 .5 0}
+\gdef\colorYellow{%
+ \setcolor{\rgbYellow}%
+}
+\gdef\rgbRed{1 0 0}
+\gdef\colorRed{%
+ \setcolor{\rgbRed}%
+}
+\gdef\rgbBlue{0 0 1}
+\gdef\colorBlue{%
+ \setcolor{\rgbBlue}%
+}
+\gdef\rgbPurple{0.50 0 0.50}
+\gdef\colorPurple{%
+ \setcolor{\rgbPurple}%
+}
+\gdef\colorOff{%
+ \setcolor{\maincolor}%
+}
+
 \gdef\rgbError{0.80 0 0}
-\gdef\colorError{%
+\gdef\diagError{%
  \setcolor{\rgbError}%
 }
 \gdef\rgbNotice{0 0 0.80}
-\gdef\colorNotice{%
+\gdef\diagNotice{%
  \setcolor{\rgbNotice}%
 }
-\gdef\colorOff{%
+\gdef\rgbWarning{0.50 0 0.50}
+\gdef\diagWarning{%
+ \setcolor{\rgbWarning}%
+}
+\gdef\diagOff{%
  \setcolor{\maincolor}%
 }
 @end tex
 
 @ifnottex
-@macro colorWarning
-@inlineraw{html, <b style="color:darkviolet">}
+@macro colorGreen
+@inlineraw{html, <span style="color:green">}
 @end macro
-@macro colorError
-@inlineraw{html, <b style="color:red">}
+@macro colorYellow
+@inlineraw{html, <span style="color:#ff8000">}
 @end macro
-@macro colorNotice
-@inlineraw{html, <b style="color:darkcyan">}
+@macro colorRed
+@inlineraw{html, <span style="color:red">}
+@end macro
+@macro colorBlue
+@inlineraw{html, <span style="color:blue">}
+@end macro
+@macro colorPurple
+@inlineraw{html, <span style="color:darkviolet">}
 @end macro
 @macro colorOff
+@inlineraw{html, </span>}
+@end macro
+
+@macro diagError
+@inlineraw{html, <b style="color:red">}
+@end macro
+@macro diagNotice
+@inlineraw{html, <b style="color:darkcyan">}
+@end macro
+@macro diagWarning
+@inlineraw{html, <b style="color:darkviolet">}
+@end macro
+@macro diagOff
 @inlineraw{html, </b>}
 @end macro
 @end ifnottex
 
+@macro green{text}
+@colorGreen{}\text\@colorOff{}
+@end macro
+
+@macro yellow{text}
+@colorYellow{}\text\@colorOff{}
+@end macro
+
+@macro red{text}
+@colorRed{}\text\@colorOff{}
+@end macro
+
+@macro blue{text}
+@colorBlue{}\text\@colorOff{}
+@end macro
+
+@macro purple{text}
+@colorPurple{}\text\@colorOff{}
+@end macro
+
 @macro dwarning{text}
-@colorWarning{}\text\@colorOff{}
+@diagWarning{}\text\@diagOff{}
 @end macro
 
 @macro derror{text}
-@colorError{}\text\@colorOff{}
+@diagError{}\text\@diagOff{}
 @end macro
 
 @macro dnotice{text}
-@colorNotice{}\text\@colorOff{}
+@diagNotice{}\text\@diagOff{}
 @end macro
 
 @finalout
@@ -79,7 +173,7 @@
 This manual (@value{UPDATED}) is for GNU Bison (version @value{VERSION}),
 the GNU parser generator.
 
-Copyright @copyright{} 1988-1993, 1995, 1998-2015, 2018-2019 Free
+Copyright @copyright{} 1988--1993, 1995, 1998--2015, 2018--2021 Free
 Software Foundation, Inc.
 
 @quotation
@@ -148,8 +242,9 @@
                           messy for Bison to handle straightforwardly.
 * Debugging::           Understanding or debugging Bison parsers.
 * Invocation::          How to run Bison (to produce the parser implementation).
-* Other Languages::     Creating C++ and Java parsers.
+* Other Languages::     Creating C++, D and Java parsers.
 * History::             How Bison came to be
+* Versioning::          Dealing with Bison versioning
 * FAQ::                 Frequently Asked Questions
 * Table of Symbols::    All the keywords of the Bison language are explained.
 * Glossary::            Basic concepts are explained.
@@ -182,7 +277,6 @@
 * Merging GLR Parses::     Using GLR parsers to resolve ambiguities.
 * GLR Semantic Actions::   Considerations for semantic values and deferred actions.
 * Semantic Predicates::    Controlling a parse with arbitrary computations.
-* Compiler Requirements for GLR::  GLR parsers require a modern C compiler.
 
 Examples
 
@@ -210,7 +304,7 @@
 
 * Rpcalc Input::            Explanation of the @code{input} nonterminal
 * Rpcalc Line::             Explanation of the @code{line} nonterminal
-* Rpcalc Expr::             Explanation of the @code{expr} nonterminal
+* Rpcalc Exp::              Explanation of the @code{exp} nonterminal
 
 Location Tracking Calculator: @code{ltcalc}
 
@@ -276,6 +370,7 @@
 
 * Location Type::               Specifying a data type for locations.
 * Actions and Locations::       Using locations in actions.
+* Printing Locations::          Defining how locations are printed.
 * Location Default Action::     Defining a general way to compute locations.
 
 Bison Declarations
@@ -299,13 +394,10 @@
 Parser C-Language Interface
 
 * Parser Function::         How to call @code{yyparse} and what it returns.
-* Push Parser Function::    How to call @code{yypush_parse} and what it returns.
-* Pull Parser Function::    How to call @code{yypull_parse} and what it returns.
-* Parser Create Function::  How to call @code{yypstate_new} and what it returns.
-* Parser Delete Function::  How to call @code{yypstate_delete} and what it returns.
+* Push Parser Interface::   How to create, use, and destroy push parsers.
 * Lexical::                 You must supply a function @code{yylex}
                               which reads tokens.
-* Error Reporting::         You must supply a function @code{yyerror}.
+* Error Reporting::         Passing error messages to the user.
 * Action Features::         Special features for use in actions.
 * Internationalization::    How to let the parser speak in the user's
                               native language.
@@ -313,14 +405,25 @@
 The Lexical Analyzer Function @code{yylex}
 
 * Calling Convention::  How @code{yyparse} calls @code{yylex}.
-* Tokens from Literals:: Finding token types from string aliases.
+* Special Tokens::      Signaling end-of-file and errors to the parser.
+* Tokens from Literals:: Finding token kinds from string aliases.
 * Token Values::        How @code{yylex} must return the semantic value
                           of the token it has read.
 * Token Locations::     How @code{yylex} must return the text location
                           (line number, etc.) of the token, if the
                           actions want that.
 * Pure Calling::        How the calling convention differs in a pure parser
-                          (@pxref{Pure Decl, ,A Pure (Reentrant) Parser}).
+                          (@pxref{Pure Decl}).
+
+Error Reporting
+
+* Error Reporting Function::         You must supply a @code{yyerror} function.
+* Syntax Error Reporting Function::  You can supply a @code{yyreport_syntax_error} function.
+
+Parser Internationalization
+
+* Enabling I18n::    Preparing your project to support internationalization.
+* Token I18n::       Preparing tokens for internationalization in error messages.
 
 The Bison Parser Algorithm
 
@@ -360,6 +463,7 @@
 
 Debugging Your Parser
 
+* Counterexamples::   Understanding conflicts.
 * Understanding::     Understanding the structure of your parser.
 * Graphviz::          Getting a visual representation of the parser.
 * Xml::               Getting a markup representation of the parser.
@@ -369,7 +473,6 @@
 
 * Enabling Traces::    Activating run-time trace support
 * Mfcalc Traces::      Extending @code{mfcalc} to support traces
-* The YYPRINT Macro::  Obsolete interface for semantic value reports
 
 Invoking Bison
 
@@ -388,6 +491,7 @@
 Parsers Written In Other Languages
 
 * C++ Parsers::                 The interface to generate C++ parser classes
+* D Parsers::                   The interface to generate D parser classes
 * Java Parsers::                The interface to generate Java parser classes
 
 C++ Parsers
@@ -397,6 +501,7 @@
 * C++ Parser Interface::        Instantiating and running the parser
 * C++ Semantic Values::         %union vs. C++
 * C++ Location Values::         The position and location classes
+* C++ Parser Context::          You can supply a @code{report_syntax_error} function.
 * C++ Scanner Interface::       Exchanges between yylex and parse
 * A Complete C++ Example::      Demonstrating their use
 
@@ -416,15 +521,28 @@
 * Calc++ Scanner::              A pure C++ Flex scanner
 * Calc++ Top Level::            Conducting the band
 
+D Parsers
+
+* D Bison Interface::        Asking for D parser generation
+* D Semantic Values::        %token and %nterm vs. D
+* D Location Values::        The position and location classes
+* D Parser Interface::       Instantiating and running the parser
+* D Parser Context Interface:: Circumstances of a syntax error
+* D Scanner Interface::      Specifying the scanner for the parser
+* D Action Features::        Special features for use in actions
+* D Push Parser Interface::  Instantiating and running the push parser
+* D Complete Symbols::       Using token constructors
+
 Java Parsers
 
 * Java Bison Interface::        Asking for Java parser generation
 * Java Semantic Values::        %token and %nterm vs. Java
 * Java Location Values::        The position and location classes
 * Java Parser Interface::       Instantiating and running the parser
+* Java Parser Context Interface:: Circumstances of a syntax error
 * Java Scanner Interface::      Specifying the scanner for the parser
 * Java Action Features::        Special features for use in actions
-* Java Push Parser Interface::  Instantiating and running the a push parser
+* Java Push Parser Interface::  Instantiating and running the push parser
 * Java Differences::            Differences between C/C++ and Java Grammars
 * Java Declarations Summary::   List of Bison declarations used with Java
 
@@ -436,6 +554,10 @@
 * Bison::                       This program
 * Other Ungulates::             Similar programs
 
+Bison Version Compatibility
+
+* Versioning::                  Dealing with Bison versioning
+
 Frequently Asked Questions
 
 * Memory Exhausted::            Breaking the Stack Limits
@@ -472,8 +594,8 @@
 
 Bison is upward compatible with Yacc: all properly-written Yacc grammars
 ought to work with Bison with no change.  Anyone familiar with Yacc should
-be able to use Bison with little trouble.  You need to be fluent in C, C++
-or Java programming in order to use Bison or to understand this manual.
+be able to use Bison with little trouble.  You need to be fluent in C, C++,
+D or Java programming in order to use Bison or to understand this manual.
 
 We begin with tutorial chapters that explain the basic concepts of
 using Bison and show three explained examples, each building on the
@@ -612,11 +734,11 @@
 @cindex token
 @cindex syntactic grouping
 @cindex grouping, syntactic
-In the formal grammatical rules for a language, each kind of syntactic
-unit or grouping is named by a @dfn{symbol}.  Those which are built by
-grouping smaller constructs according to grammatical rules are called
+In the formal grammatical rules for a language, each kind of syntactic unit
+or grouping is named by a @dfn{symbol}.  Those which are built by grouping
+smaller constructs according to grammatical rules are called
 @dfn{nonterminal symbols}; those which can't be subdivided are called
-@dfn{terminal symbols} or @dfn{token types}.  We call a piece of input
+@dfn{terminal symbols} or @dfn{token kinds}.  We call a piece of input
 corresponding to a single terminal symbol a @dfn{token}, and a piece
 corresponding to a single nonterminal symbol a @dfn{grouping}.
 
@@ -692,14 +814,14 @@
 
 A formal grammar is a mathematical construct.  To define the language
 for Bison, you must write a file expressing the grammar in Bison syntax:
-a @dfn{Bison grammar} file.  @xref{Grammar File, ,Bison Grammar Files}.
+a @dfn{Bison grammar} file.  @xref{Grammar File}.
 
 A nonterminal symbol in the formal grammar is represented in Bison input
 as an identifier, like an identifier in C@.  By convention, it should be
 in lower case, such as @code{expr}, @code{stmt} or @code{declaration}.
 
 The Bison representation for a terminal symbol is also called a @dfn{token
-type}.  Token types as well can be represented as C-like identifiers.  By
+kind}.  Token kinds as well can be represented as C-like identifiers.  By
 convention, these identifiers should be upper case to distinguish them from
 nonterminals: for example, @code{INTEGER}, @code{IDENTIFIER}, @code{IF} or
 @code{RETURN}.  A terminal symbol that stands for a particular keyword in
@@ -726,7 +848,7 @@
 @end example
 
 @noindent
-@xref{Rules, ,Syntax of Grammar Rules}.
+@xref{Rules}.
 
 @node Semantic Values
 @section Semantic Values
@@ -743,27 +865,26 @@
 But the precise value is very important for what the input means once it is
 parsed.  A compiler is useless if it fails to distinguish between 4, 1 and
 3989 as constants in the program!  Therefore, each token in a Bison grammar
-has both a token type and a @dfn{semantic value}.  @xref{Semantics,
-,Defining Language Semantics},
-for details.
+has both a token kind and a @dfn{semantic value}.  @xref{Semantics}, for
+details.
 
-The token type is a terminal symbol defined in the grammar, such as
-@code{INTEGER}, @code{IDENTIFIER} or @code{','}.  It tells everything
-you need to know to decide where the token may validly appear and how to
-group it with other tokens.  The grammar rules know nothing about tokens
-except their types.
+The token kind is a terminal symbol defined in the grammar, such as
+@code{INTEGER}, @code{IDENTIFIER} or @code{','}.  It tells everything you
+need to know to decide where the token may validly appear and how to group
+it with other tokens.  The grammar rules know nothing about tokens except
+their kinds.
 
 The semantic value has all the rest of the information about the
 meaning of the token, such as the value of an integer, or the name of an
 identifier.  (A token such as @code{','} which is just punctuation doesn't
 need to have any semantic value.)
 
-For example, an input token might be classified as token type
-@code{INTEGER} and have the semantic value 4.  Another input token might
-have the same token type @code{INTEGER} but value 3989.  When a grammar
-rule says that @code{INTEGER} is allowed, either of these tokens is
-acceptable because each is an @code{INTEGER}.  When the parser accepts the
-token, it keeps track of the token's semantic value.
+For example, an input token might be classified as token kind @code{INTEGER}
+and have the semantic value 4.  Another input token might have the same
+token kind @code{INTEGER} but value 3989.  When a grammar rule says that
+@code{INTEGER} is allowed, either of these tokens is acceptable because each
+is an @code{INTEGER}.  When the parser accepts the token, it keeps track of
+the token's semantic value.
 
 Each grouping can also have a semantic value as well as its nonterminal
 symbol.  For example, in a calculator, an expression typically has a
@@ -852,7 +973,6 @@
 * Merging GLR Parses::     Using GLR parsers to resolve ambiguities.
 * GLR Semantic Actions::   Considerations for semantic values and deferred actions.
 * Semantic Predicates::    Controlling a parse with arbitrary computations.
-* Compiler Requirements for GLR::  GLR parsers require a modern C compiler.
 @end menu
 
 @node Simple GLR Parsers
@@ -1042,16 +1162,20 @@
 @cindex conflicts
 @cindex reduce/reduce conflicts
 
-Let's consider an example, vastly simplified from a C++ grammar.
+Let's consider an example, vastly simplified from a C++
+grammar.@footnote{The sources of an extended version of this example are
+available in C as @file{examples/c/glr}, and in C++ as
+@file{examples/c++/glr}.}
 
 @example
 %@{
   #include <stdio.h>
-  #define YYSTYPE char const *
   int yylex (void);
   void yyerror (char const *);
 %@}
 
+%define api.value.type @{char const *@}
+
 %token TYPENAME ID
 
 %right '='
@@ -1159,17 +1283,17 @@
 
 @example
 stmt:
-  expr ';'  %merge <stmtMerge>
-| decl      %merge <stmtMerge>
+  expr ';'  %merge <stmt_merge>
+| decl      %merge <stmt_merge>
 ;
 @end example
 
 @noindent
-and define the @code{stmtMerge} function as:
+and define the @code{stmt_merge} function as:
 
 @example
 static YYSTYPE
-stmtMerge (YYSTYPE x0, YYSTYPE x1)
+stmt_merge (YYSTYPE x0, YYSTYPE x1)
 @{
   printf ("<OR> ");
   return "";
@@ -1182,8 +1306,7 @@
 
 @example
 %@{
-  #define YYSTYPE char const *
-  static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);
+  static YYSTYPE stmt_merge (YYSTYPE x0, YYSTYPE x1);
 %@}
 @end example
 
@@ -1201,6 +1324,48 @@
 and the parser will report an error during any parse that results in
 the offending merge.
 
+@sp 1
+
+The signature of the merger depends on the type of the symbol.  In the
+previous example, the merged-to symbol (@code{stmt}) does not have a
+specific type, and the merger is
+
+@example
+YYSTYPE stmt_merge (YYSTYPE x0, YYSTYPE x1);
+@end example
+
+@noindent
+However, if @code{stmt} had a declared type, e.g.,
+
+@example
+%type <Node *> stmt;
+@end example
+
+@noindent
+or
+
+@example
+@group
+%union @{
+  Node *node;
+  ...
+@};
+@end group
+%type <node> stmt;
+@end example
+
+@noindent
+then the prototype of the merger must be:
+
+@example
+Node *stmt_merge (YYSTYPE x0, YYSTYPE x1);
+@end example
+
+@noindent
+(This signature might be a mistake originally, and maybe it should have been
+@samp{Node *stmt_merge (Node *x0, Node *x1)}.  If you have an opinion about
+it, please let us know.)
+
 @node GLR Semantic Actions
 @subsection GLR Semantic Actions
 
@@ -1220,13 +1385,13 @@
 @cindex GLR parsers and @code{yylval}
 @vindex yylloc
 @cindex GLR parsers and @code{yylloc}
-In any semantic action, you can examine @code{yychar} to determine the type
+In any semantic action, you can examine @code{yychar} to determine the kind
 of the lookahead token present at the time of the associated reduction.
 After checking that @code{yychar} is not set to @code{YYEMPTY} or
 @code{YYEOF}, you can then examine @code{yylval} and @code{yylloc} to
 determine the lookahead token's semantic value and location, if any.  In a
 nondeferred semantic action, you can also modify any of these variables to
-influence syntax analysis.  @xref{Lookahead, ,Lookahead Tokens}.
+influence syntax analysis.  @xref{Lookahead}.
 
 @findex yyclearin
 @cindex GLR parsers and @code{yyclearin}
@@ -1281,14 +1446,14 @@
 @noindent
 is one way to allow the same parser to handle two different syntaxes for
 widgets.  The clause preceded by @code{%?} is treated like an ordinary
-action, except that its text is treated as an expression and is always
+midrule action, except that its text is handled as an expression and is always
 evaluated immediately (even when in nondeterministic mode).  If the
 expression yields 0 (false), the clause is treated as a syntax error,
 which, in a nondeterministic parser, causes the stack in which it is reduced
-to die.  In a deterministic parser, it acts like YYERROR.
+to die.  In a deterministic parser, it acts like @code{YYERROR}.
 
 As the example shows, predicates otherwise look like semantic actions, and
-therefore you must be take them into account when determining the numbers
+therefore you must take them into account when determining the numbers
 to use for denoting the semantic values of right-hand side symbols.
 Predicate actions, however, have no defined value, and may not be given
 labels.
@@ -1302,7 +1467,7 @@
   @{ if (!new_syntax) YYERROR; @}
     "widget" id new_args  @{ $$ = f($3, $4); @}
 |  @{ if (new_syntax) YYERROR; @}
-    "widget" id old_args   @{ $$ = f($3, $4); @}
+    "widget" id old_args  @{ $$ = f($3, $4); @}
 ;
 @end example
 
@@ -1320,36 +1485,6 @@
 Finally, be careful in writing predicates: deferred actions have not been
 evaluated, so that using them in a predicate will have undefined effects.
 
-@node Compiler Requirements for GLR
-@subsection Considerations when Compiling GLR Parsers
-@cindex @code{inline}
-@cindex GLR parsers and @code{inline}
-
-The GLR parsers require a compiler for ISO C89 or
-later.  In addition, they use the @code{inline} keyword, which is not
-C89, but is C99 and is a common extension in pre-C99 compilers.  It is
-up to the user of these parsers to handle
-portability issues.  For instance, if using Autoconf and the Autoconf
-macro @code{AC_C_INLINE}, a mere
-
-@example
-%@{
-  #include <config.h>
-%@}
-@end example
-
-@noindent
-will suffice.  Otherwise, we suggest
-
-@example
-%@{
-  #if (__STDC_VERSION__ < 199901 && ! defined __GNUC__ \
-       && ! defined inline)
-  # define inline
-  #endif
-%@}
-@end example
-
 @node Locations
 @section Locations
 @cindex location
@@ -1407,7 +1542,7 @@
 doesn't know what is ``inside'' the tokens (though their semantic values
 may reflect this).  Typically the lexical analyzer makes the tokens by
 parsing characters of text, but Bison does not depend on this.
-@xref{Lexical, ,The Lexical Analyzer Function @code{yylex}}.
+@xref{Lexical}.
 
 The Bison parser implementation file is C code which defines a
 function named @code{yyparse} which implements that grammar.  This
@@ -1416,10 +1551,9 @@
 error-reporting function which the parser calls to report an error.
 In addition, a complete C program must start with a function called
 @code{main}; you have to provide this, and arrange for it to call
-@code{yyparse} or the parser will never run.  @xref{Interface, ,Parser
-C-Language Interface}.
+@code{yyparse} or the parser will never run.  @xref{Interface}.
 
-Aside from the token type names and the symbols in the actions you
+Aside from the token kind names and the symbols in the actions you
 write, all symbols defined in the Bison parser implementation file
 itself begin with @samp{yy} or @samp{YY}.  This includes interface
 functions such as the lexical analyzer function @code{yylex}, the
@@ -1438,7 +1572,7 @@
 are included to declare memory allocators and integer types and constants.
 @code{<libintl.h>} is included if message translation is in use
 (@pxref{Internationalization}).  Other system headers may be included
-if you define @code{YYDEBUG} (@pxref{Tracing, ,Tracing Your Parser}) or
+if you define @code{YYDEBUG} (@pxref{Tracing}) or
 @code{YYSTACK_USE_ALLOCA} (@pxref{Table of Symbols}) to a nonzero value.
 
 @node Stages
@@ -1452,16 +1586,16 @@
 @enumerate
 @item
 Formally specify the grammar in a form recognized by Bison
-(@pxref{Grammar File, ,Bison Grammar Files}).  For each grammatical rule
+(@pxref{Grammar File}).  For each grammatical rule
 in the language, describe the action that is to be taken when an
 instance of that rule is recognized.  The action is described by a
 sequence of C statements.
 
 @item
 Write a lexical analyzer to process input and pass tokens to the parser.
-The lexical analyzer may be written by hand in C (@pxref{Lexical, ,The
-Lexical Analyzer Function @code{yylex}}).  It could also be produced
-using Lex, but the use of Lex is not discussed in this manual.
+The lexical analyzer may be written by hand in C (@pxref{Lexical}).  It
+could also be produced using Lex, but the use of Lex is not discussed in
+this manual.
 
 @item
 Write a controlling function that calls the Bison-produced parser.
@@ -1544,6 +1678,14 @@
 languages are written the same way.  You can copy these examples into a
 source file to try them.
 
+@sp 1
+
+Bison comes with several examples (including for the different target
+languages).  If this package is properly installed, you shall find them in
+@file{@var{prefix}/share/doc/bison/examples}, where @var{prefix} is the root
+of the installation, probably something like @file{/usr/local} or
+@file{/usr}.
+
 @menu
 * RPN Calc::               Reverse Polish Notation Calculator;
                              a first example with no operator precedence.
@@ -1562,7 +1704,9 @@
 @cindex @code{rpcalc}
 @cindex calculator, simple
 
-The first example is that of a simple double-precision @dfn{Reverse Polish
+The first example@footnote{The sources of @command{rpcalc} are available as
+@file{examples/c/rpcalc}.} is that of a simple double-precision @dfn{Reverse
+Polish
 Notation} calculator (a calculator using postfix operators).  This example
 provides a good starting point, since operator precedence is not an issue.
 The second example will illustrate how operator precedence is handled.
@@ -1587,7 +1731,32 @@
 calculator.  As in C, comments are placed between @samp{/*@dots{}*/} or
 after @samp{//}.
 
-@comment file: rpcalc.y
+@ignore
+@comment file: c/rpcalc/rpcalc.y
+@example
+/* Parser for rpcalc.   -*- C -*-
+
+   Copyright (C) 1988-1993, 1995, 1998-2015, 2018-2021 Free Software
+   Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+@end example
+@end ignore
+
+@comment file: c/rpcalc/rpcalc.y
 @example
 /* Reverse Polish Notation calculator. */
 
@@ -1606,7 +1775,7 @@
 %% /* Grammar rules and actions follow. */
 @end example
 
-The declarations section (@pxref{Prologue, , The prologue}) contains two
+The declarations section (@pxref{Prologue}) contains two
 preprocessor directives and two forward declarations.
 
 The @code{#include} directive is used to declare the exponentiation
@@ -1619,12 +1788,11 @@
 prologue.
 
 The second section, Bison declarations, provides information to Bison about
-the tokens and their types (@pxref{Bison Declarations, ,The Bison
-Declarations Section}).
+the tokens and their types (@pxref{Bison Declarations}).
 
 The @code{%define} directive defines the variable @code{api.value.type},
 thus specifying the C data type for semantic values of both tokens and
-groupings (@pxref{Value Type, ,Data Types of Semantic Values}).  The Bison
+groupings (@pxref{Value Type}).  The Bison
 parser will use whatever type @code{api.value.type} is defined as; if you
 don't define it, @code{int} is the default.  Because we specify
 @samp{@{double@}}, each token and each expression has an associated value,
@@ -1635,14 +1803,14 @@
 declared.  (Single-character literals normally don't need to be declared.)
 In this example, all the arithmetic operators are designated by
 single-character literals, so the only terminal symbol that needs to be
-declared is @code{NUM}, the token type for numeric constants.
+declared is @code{NUM}, the token kind for numeric constants.
 
 @node Rpcalc Rules
 @subsection Grammar Rules for @code{rpcalc}
 
 Here are the grammar rules for the Reverse Polish Notation calculator.
 
-@comment file: rpcalc.y
+@comment file: c/rpcalc/rpcalc.y
 @example
 @group
 input:
@@ -1693,7 +1861,7 @@
 @menu
 * Rpcalc Input::            Explanation of the @code{input} nonterminal
 * Rpcalc Line::             Explanation of the @code{line} nonterminal
-* Rpcalc Expr::             Explanation of the @code{expr} nonterminal
+* Rpcalc Exp::              Explanation of the @code{exp} nonterminal
 @end menu
 
 @node Rpcalc Input
@@ -1712,7 +1880,7 @@
 string, or a complete input followed by an input line''.  Notice that
 ``complete input'' is defined in terms of itself.  This definition is said
 to be @dfn{left recursive} since @code{input} appears always as the
-leftmost symbol in the sequence.  @xref{Recursion, ,Recursive Rules}.
+leftmost symbol in the sequence.  @xref{Recursion}.
 
 The first alternative is empty because there are no symbols between the
 colon and the first @samp{|}; this means that @code{input} can match an
@@ -1758,8 +1926,8 @@
 that value were ever used, but we don't use it: once rpcalc has printed the
 value of the user's input line, that value is no longer needed.
 
-@node Rpcalc Expr
-@subsubsection Explanation of @code{expr}
+@node Rpcalc Exp
+@subsubsection Explanation of @code{exp}
 
 The @code{exp} grouping has several rules, one for each kind of expression.
 The first rule handles the simplest expressions: those that are just
@@ -1832,8 +2000,7 @@
 
 The lexical analyzer's job is low-level parsing: converting characters
 or sequences of characters into tokens.  The Bison parser gets its
-tokens by calling the lexical analyzer.  @xref{Lexical, ,The Lexical
-Analyzer Function @code{yylex}}.
+tokens by calling the lexical analyzer.  @xref{Lexical}.
 
 Only a simple lexical analyzer is needed for the RPN
 calculator.  This
@@ -1843,27 +2010,27 @@
 for such a single-character token is the character itself.
 
 The return value of the lexical analyzer function is a numeric code which
-represents a token type.  The same text used in Bison rules to stand for
-this token type is also a C expression for the numeric code for the type.
-This works in two ways.  If the token type is a character literal, then its
-numeric code is that of the character; you can use the same
-character literal in the lexical analyzer to express the number.  If the
-token type is an identifier, that identifier is defined by Bison as a C
-macro whose definition is the appropriate number.  In this example,
-therefore, @code{NUM} becomes a macro for @code{yylex} to use.
+represents a token kind.  The same text used in Bison rules to stand for
+this token kind is also a C expression for the numeric code of the kind.
+This works in two ways.  If the token kind is a character literal, then its
+numeric code is that of the character; you can use the same character
+literal in the lexical analyzer to express the number.  If the token kind is
+an identifier, that identifier is defined by Bison as a C enum whose
+definition is the appropriate code.  In this example, therefore, @code{NUM}
+becomes an enum for @code{yylex} to use.
 
 The semantic value of the token (if it has one) is stored into the global
 variable @code{yylval}, which is where the Bison parser will look for it.
 (The C data type of @code{yylval} is @code{YYSTYPE}, whose value was defined
 at the beginning of the grammar via @samp{%define api.value.type
-@{double@}}; @pxref{Rpcalc Declarations,,Declarations for @code{rpcalc}}.)
+@{double@}}; @pxref{Rpcalc Declarations}.)
 
-A token type code of zero is returned if the end-of-input is encountered.
+A token kind code of zero is returned if the end-of-input is encountered.
 (Bison recognizes any nonpositive value as indicating end-of-input.)
 
 Here is the code for the lexical analyzer:
 
-@comment file: rpcalc.y
+@comment file: c/rpcalc/rpcalc.y
 @example
 @group
 /* The lexical analyzer returns a double floating point
@@ -1872,6 +2039,7 @@
    and tabs, and returns 0 for end-of-input. */
 
 #include <ctype.h>
+#include <stdlib.h>
 @end group
 
 @group
@@ -1888,14 +2056,15 @@
   if (c == '.' || isdigit (c))
     @{
       ungetc (c, stdin);
-      scanf ("%lf", &yylval);
+      if (scanf ("%lf", &yylval) != 1)
+        abort ();
       return NUM;
     @}
 @end group
 @group
   /* Return end-of-input. */
   else if (c == EOF)
-    return 0;
+    return YYEOF;
   /* Return a single char. */
   else
     return c;
@@ -1912,7 +2081,7 @@
 kept to the bare minimum.  The only requirement is that it call
 @code{yyparse} to start the process of parsing.
 
-@comment file: rpcalc.y
+@comment file: c/rpcalc/rpcalc.y
 @example
 @group
 int
@@ -1930,10 +2099,10 @@
 When @code{yyparse} detects a syntax error, it calls the error reporting
 function @code{yyerror} to print an error message (usually but not
 always @code{"syntax error"}).  It is up to the programmer to supply
-@code{yyerror} (@pxref{Interface, ,Parser C-Language Interface}), so
+@code{yyerror} (@pxref{Interface}), so
 here is the definition we will use:
 
-@comment file: rpcalc.y
+@comment file: c/rpcalc/rpcalc.y
 @example
 #include <stdio.h>
 
@@ -1963,7 +2132,7 @@
 simple example, the easiest thing is to put everything in one file,
 the grammar file.  The definitions of @code{yylex}, @code{yyerror} and
 @code{main} go at the end, in the epilogue of the grammar file
-(@pxref{Grammar Layout, ,The Overall Layout of a Bison Grammar}).
+(@pxref{Grammar Layout}).
 
 For a large project, you would probably have several source files, and use
 @code{make} to arrange to recompile them.
@@ -1999,7 +2168,7 @@
 
 @group
 # @r{Compile the Bison parser.}
-# @r{@samp{-lm} tells compiler to search math library for @code{pow}.}
+# @r{@option{-lm} tells compiler to search math library for @code{pow}.}
 $ @kbd{cc -lm -o rpcalc rpcalc.tab.c}
 @end group
 
@@ -2035,7 +2204,10 @@
 @cindex @code{calc}
 @cindex calculator, infix notation
 
-We now modify rpcalc to handle infix operators instead of postfix.  Infix
+We now modify rpcalc to handle infix operators instead of
+postfix.@footnote{A similar example, but using an unambiguous grammar rather
+than precedence and associativity annotations, is available as
+@file{examples/c/calc}.}  Infix
 notation involves the concept of operator precedence and the need for
 parentheses nested to arbitrary depth.  Here is the Bison code for
 @file{calc.y}, an infix desk-top calculator.
@@ -2099,11 +2271,11 @@
 There are two important new features shown in this code.
 
 In the second section (Bison declarations), @code{%left} declares token
-types and says they are left-associative operators.  The declarations
+kinds and says they are left-associative operators.  The declarations
 @code{%left} and @code{%right} (right associativity) take the place of
-@code{%token} which is used to declare a token type name without
-associativity/precedence.  (These tokens are single-character literals, which
-ordinarily don't need to be declared.  We declare them here to specify
+@code{%token} which is used to declare a token kind name without
+associativity/precedence.  (These tokens are single-character literals,
+which ordinarily don't need to be declared.  We declare them here to specify
 the associativity/precedence.)
 
 Operator precedence is determined by the line ordering of the
@@ -2111,14 +2283,13 @@
 the page or screen), the higher the precedence.  Hence, exponentiation
 has the highest precedence, unary minus (@code{NEG}) is next, followed
 by @samp{*} and @samp{/}, and so on.  Unary minus is not associative,
-only precedence matters (@code{%precedence}. @xref{Precedence, ,Operator
-Precedence}.
+only precedence matters (@code{%precedence}. @xref{Precedence}.
 
 The other important new feature is the @code{%prec} in the grammar
 section for the unary minus operator.  The @code{%prec} simply instructs
 Bison that the rule @samp{| '-' exp} has the same precedence as
 @code{NEG}---in this case the next-to-highest.  @xref{Contextual
-Precedence, ,Context-Dependent Precedence}.
+Precedence}.
 
 Here is a sample run of @file{calc.y}:
 
@@ -2222,14 +2393,13 @@
 @end example
 
 @noindent
-Note there are no declarations specific to locations.  Defining a data
-type for storing locations is not needed: we will use the type provided
-by default (@pxref{Location Type, ,Data Types of Locations}), which is a
-four member structure with the following integer fields:
-@code{first_line}, @code{first_column}, @code{last_line} and
-@code{last_column}.  By conventions, and in accordance with the GNU
-Coding Standards and common practice, the line and column count both
-start at 1.
+Note there are no declarations specific to locations.  Defining a data type
+for storing locations is not needed: we will use the type provided by
+default (@pxref{Location Type}), which is a four member structure with the
+following integer fields: @code{first_line}, @code{first_column},
+@code{last_line} and @code{last_column}.  By conventions, and in accordance
+with the GNU Coding Standards and common practice, the line and column count
+both start at 1.
 
 @node Ltcalc Rules
 @subsection Grammar Rules for @code{ltcalc}
@@ -2291,11 +2461,10 @@
 
 We don't need to assign a value to @code{@@$}: the output parser does it
 automatically.  By default, before executing the C code of each action,
-@code{@@$} is set to range from the beginning of @code{@@1} to the end
-of @code{@@@var{n}}, for a rule with @var{n} components.  This behavior
-can be redefined (@pxref{Location Default Action, , Default Action for
-Locations}), and for very specific rules, @code{@@$} can be computed by
-hand.
+@code{@@$} is set to range from the beginning of @code{@@1} to the end of
+@code{@@@var{n}}, for a rule with @var{n} components.  This behavior can be
+redefined (@pxref{Location Default Action}), and for very specific rules,
+@code{@@$} can be computed by hand.
 
 @node Ltcalc Lexer
 @subsection The @code{ltcalc} Lexical Analyzer.
@@ -2346,7 +2515,7 @@
 
   /* Return end-of-input. */
   if (c == EOF)
-    return 0;
+    return YYEOF;
 
 @group
   /* Return a single char, and update location. */
@@ -2362,15 +2531,15 @@
 @end group
 @end example
 
-Basically, the lexical analyzer performs the same processing as before:
-it skips blanks and tabs, and reads numbers or single-character tokens.
-In addition, it updates @code{yylloc}, the global variable (of type
+Basically, the lexical analyzer performs the same processing as before: it
+skips blanks and tabs, and reads numbers or single-character tokens.  In
+addition, it updates @code{yylloc}, the global variable (of type
 @code{YYLTYPE}) containing the token's location.
 
-Now, each time this function returns a token, the parser has its number
-as well as its semantic value, and its location in the text.  The last
-needed change is to initialize @code{yylloc}, for example in the
-controlling function:
+Now, each time this function returns a token, the parser has its kind as
+well as its semantic value, and its location in the text.  The last needed
+change is to initialize @code{yylloc}, for example in the controlling
+function:
 
 @example
 @group
@@ -2394,11 +2563,12 @@
 @cindex @code{mfcalc}
 @cindex calculator, multi-function
 
-Now that the basics of Bison have been discussed, it is time to move on to
-a more advanced problem.  The above calculators provided only five
-functions, @samp{+}, @samp{-}, @samp{*}, @samp{/} and @samp{^}.  It would
-be nice to have a calculator that provides other mathematical functions such
-as @code{sin}, @code{cos}, etc.
+Now that the basics of Bison have been discussed, it is time to move on to a
+more advanced problem.@footnote{The sources of @command{mfcalc} are
+available as @file{examples/c/mfcalc}.}  The above calculators provided only
+five functions, @samp{+}, @samp{-}, @samp{*}, @samp{/} and @samp{^}.  It
+would be nice to have a calculator that provides other mathematical
+functions such as @code{sin}, @code{cos}, etc.
 
 It is easy to add new operators to the infix calculator as long as they are
 only single-character literals.  The lexical analyzer @code{yylex} passes
@@ -2449,9 +2619,35 @@
 @node Mfcalc Declarations
 @subsection Declarations for @code{mfcalc}
 
-Here are the C and Bison declarations for the multi-function calculator.
+Here are the C and Bison declarations for the multi-function
+calculator.
 
-@comment file: mfcalc.y: 1
+@ignore
+@comment file: c/mfcalc/mfcalc.y
+@example
+/* Parser for mfcalc.   -*- C -*-
+
+   Copyright (C) 1988-1993, 1995, 1998-2015, 2018-2021 Free Software
+   Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+@end example
+@end ignore
+
+@comment file: c/mfcalc/mfcalc.y: 1
 @example
 @group
 %@{
@@ -2479,7 +2675,7 @@
 
 The above grammar introduces only two new features of the Bison language.
 These features allow semantic values to have various data types
-(@pxref{Multiple Types, ,More Than One Value Type}).
+(@pxref{Multiple Types}).
 
 The special @code{union} value assigned to the @code{%define} variable
 @code{api.value.type} specifies that the symbols are defined with their data
@@ -2493,11 +2689,10 @@
 instance, values of @code{NUM} are stored in @code{double}.
 
 The Bison construct @code{%nterm} is used for declaring nonterminal symbols,
-just as @code{%token} is used for declaring token types.  Previously we did
+just as @code{%token} is used for declaring token kinds.  Previously we did
 not use @code{%nterm} before because nonterminal symbols are normally
 declared implicitly by the rules that define them.  But @code{exp} must be
-declared explicitly so we can specify its value type.  @xref{Type Decl,
-,Nonterminal Symbols}.
+declared explicitly so we can specify its value type.  @xref{Type Decl}.
 
 @node Mfcalc Rules
 @subsection Grammar Rules for @code{mfcalc}
@@ -2506,7 +2701,7 @@
 Most of them are copied directly from @code{calc}; three rules,
 those which mention @code{VAR} or @code{FUN}, are new.
 
-@comment file: mfcalc.y: 3
+@comment file: c/mfcalc/mfcalc.y: 3
 @example
 %% /* The grammar follows. */
 @group
@@ -2556,7 +2751,32 @@
 definition, which is kept in the header @file{calc.h}, is as follows.  It
 provides for either functions or variables to be placed in the table.
 
-@comment file: calc.h
+@ignore
+@comment file: c/mfcalc/calc.h
+@example
+/* Functions for mfcalc.   -*- C -*-
+
+   Copyright (C) 1988-1993, 1995, 1998-2015, 2018-2021 Free Software
+   Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+@end example
+@end ignore
+
+@comment file: c/mfcalc/calc.h
 @example
 @group
 /* Function type. */
@@ -2592,7 +2812,7 @@
 The new version of @code{main} will call @code{init_table} to initialize
 the symbol table:
 
-@comment file: mfcalc.y: 3
+@comment file: c/mfcalc/mfcalc.y: 3
 @example
 @group
 struct init
@@ -2603,7 +2823,7 @@
 @end group
 
 @group
-struct init const arith_funs[] =
+struct init const funs[] =
 @{
   @{ "atan", atan @},
   @{ "cos",  cos  @},
@@ -2621,16 +2841,16 @@
 @end group
 
 @group
-/* Put arithmetic functions in table. */
+/* Put functions in table. */
 static void
 init_table (void)
 @end group
 @group
 @{
-  for (int i = 0; arith_funs[i].name; i++)
+  for (int i = 0; funs[i].name; i++)
     @{
-      symrec *ptr = putsym (arith_funs[i].name, FUN);
-      ptr->value.fun = arith_funs[i].fun;
+      symrec *ptr = putsym (funs[i].name, FUN);
+      ptr->value.fun = funs[i].fun;
     @}
 @}
 @end group
@@ -2640,19 +2860,20 @@
 files, you can add additional functions to the calculator.
 
 Two important functions allow look-up and installation of symbols in the
-symbol table.  The function @code{putsym} is passed a name and the type
+symbol table.  The function @code{putsym} is passed a name and the kind
 (@code{VAR} or @code{FUN}) of the object to be installed.  The object is
 linked to the front of the list, and a pointer to the object is returned.
 The function @code{getsym} is passed the name of the symbol to look up.  If
 found, a pointer to that symbol is returned; otherwise zero is returned.
 
-@comment file: mfcalc.y: 3
+@comment file: c/mfcalc/mfcalc.y: 3
 @example
 @group
 /* The mfcalc code assumes that malloc and realloc
    always succeed, and that integer calculations
    never overflow.  Production-quality code should
    not make these assumptions.  */
+#include <assert.h>
 #include <stdlib.h> /* malloc, realloc. */
 #include <string.h> /* strlen. */
 @end group
@@ -2701,7 +2922,7 @@
 No change is needed in the handling of numeric values and arithmetic
 operators in @code{yylex}.
 
-@comment file: mfcalc.y: 3
+@comment file: c/mfcalc/mfcalc.y: 3
 @example
 #include <ctype.h>
 #include <stddef.h>
@@ -2717,7 +2938,7 @@
     c = getchar ();
 
   if (c == EOF)
-    return 0;
+    return YYEOF;
 @end group
 
 @group
@@ -2725,7 +2946,8 @@
   if (c == '.' || isdigit (c))
     @{
       ungetc (c, stdin);
-      scanf ("%lf", &yylval.NUM);
+      if (scanf ("%lf", &yylval.NUM) != 1)
+        abort ();
       return NUM;
     @}
 @end group
@@ -2735,7 +2957,7 @@
 Bison generated a definition of @code{YYSTYPE} with a member named
 @code{NUM} to store value of @code{NUM} symbols.
 
-@comment file: mfcalc.y: 3
+@comment file: c/mfcalc/mfcalc.y: 3
 @example
 @group
   /* Char starts an identifier => read the name. */
@@ -2752,10 +2974,10 @@
           if (bufsize <= i)
             @{
               bufsize = 2 * bufsize + 40;
-              symbuf = realloc (symbuf, bufsize);
+              symbuf = realloc (symbuf, (size_t) bufsize);
             @}
           /* Add this character to the buffer. */
-          symbuf[i++] = c;
+          symbuf[i++] = (char) c;
           /* Get another character. */
           c = getchar ();
         @}
@@ -2786,9 +3008,9 @@
 
 The error reporting function is unchanged, and the new version of
 @code{main} includes a call to @code{init_table} and sets the @code{yydebug}
-on user demand (@xref{Tracing, , Tracing Your Parser}, for details):
+on user demand (@xref{Tracing}, for details):
 
-@comment file: mfcalc.y: 3
+@comment file: c/mfcalc/mfcalc.y: 3
 @example
 @group
 /* Called by yyparse on error. */
@@ -2827,13 +3049,13 @@
 Add some new functions from @file{math.h} to the initialization list.
 
 @item
-Add another array that contains constants and their values.  Then
-modify @code{init_table} to add these constants to the symbol table.
-It will be easiest to give the constants type @code{VAR}.
+Add another array that contains constants and their values.  Then modify
+@code{init_table} to add these constants to the symbol table.  It will be
+easiest to give the constants type @code{VAR}.
 
 @item
-Make the program report an error if the user refers to an
-uninitialized variable in any way except to store a value in it.
+Make the program report an error if the user refers to an uninitialized
+variable in any way except to store a value in it.
 @end enumerate
 
 @node Grammar File
@@ -2843,7 +3065,7 @@
 C-language function that recognizes correct instances of the grammar.
 
 The Bison grammar file conventionally has a name ending in @samp{.y}.
-@xref{Invocation, ,Invoking Bison}.
+@xref{Invocation}.
 
 @menu
 * Grammar Outline::    Overall layout of the grammar file.
@@ -2935,7 +3157,7 @@
 
 @group
 %@{
-  static void print_token (enum yytokentype token, YYSTYPE val);
+  static void print_token (yytoken_kind_t token, YYSTYPE val);
 %@}
 @end group
 
@@ -2984,7 +3206,7 @@
 
 @group
 %@{
-  static void print_token (enum yytokentype token, YYSTYPE val);
+  static void print_token (yytoken_kind_t token, YYSTYPE val);
 %@}
 @end group
 
@@ -2995,20 +3217,23 @@
 Notice that there are two @var{Prologue} sections here, but there's a subtle
 distinction between their functionality.  For example, if you decide to
 override Bison's default definition for @code{YYLTYPE}, in which
-@var{Prologue} section should you write your new definition?  You should
+@var{Prologue} section should you write your new
+definition?@footnote{However, defining @code{YYLTYPE} via a C macro is not
+the recommended way.  @xref{Location Type}}
+You should
 write it in the first since Bison will insert that code into the parser
 implementation file @emph{before} the default @code{YYLTYPE} definition.  In
 which @var{Prologue} section should you prototype an internal function,
-@code{trace_token}, that accepts @code{YYLTYPE} and @code{yytokentype} as
+@code{trace_token}, that accepts @code{YYLTYPE} and @code{yytoken_kind_t} as
 arguments?  You should prototype it in the second since Bison will insert
-that code @emph{after} the @code{YYLTYPE} and @code{yytokentype}
+that code @emph{after} the @code{YYLTYPE} and @code{yytoken_kind_t}
 definitions.
 
 This distinction in functionality between the two @var{Prologue} sections is
 established by the appearance of the @code{%union} between them.  This
 behavior raises a few questions.  First, why should the position of a
 @code{%union} affect definitions related to @code{YYLTYPE} and
-@code{yytokentype}?  Second, what if there is no @code{%union}?  In that
+@code{yytoken_kind_t}?  Second, what if there is no @code{%union}?  In that
 case, the second kind of @var{Prologue} section is not available.  This
 behavior is not intuitive.
 
@@ -3046,8 +3271,8 @@
 
 @group
 %code @{
-  static void print_token (enum yytokentype token, YYSTYPE val);
-  static void trace_token (enum yytokentype token, YYLTYPE loc);
+  static void print_token (yytoken_kind_t token, YYSTYPE val);
+  static void trace_token (yytoken_kind_t token, YYLTYPE loc);
 @}
 @end group
 
@@ -3065,7 +3290,7 @@
 implementation file.  The first line after the warning is required by
 @code{YYSTYPE} and thus also needs to appear in the parser implementation
 file.  However, if you've instructed Bison to generate a parser header file
-(@pxref{Decl Summary, ,%defines}), you probably want that line to appear
+(@pxref{Decl Summary}), you probably want that line to appear
 before the @code{YYSTYPE} definition in that header file as well.  The
 @code{YYLTYPE} definition should also appear in the parser header file to
 override the default @code{YYLTYPE} definition there.
@@ -3111,8 +3336,8 @@
 
 @group
 %code @{
-  static void print_token (enum yytokentype token, YYSTYPE val);
-  static void trace_token (enum yytokentype token, YYLTYPE loc);
+  static void print_token (yytoken_kind_t token, YYSTYPE val);
+  static void trace_token (yytoken_kind_t token, YYLTYPE loc);
 @}
 @end group
 
@@ -3144,7 +3369,7 @@
 file and the parser implementation file.  Since this function is not a
 dependency required by @code{YYSTYPE} or @code{YYLTYPE}, it doesn't make
 sense to move its prototype to a @code{%code requires}.  More importantly,
-since it depends upon @code{YYLTYPE} and @code{yytokentype}, @code{%code
+since it depends upon @code{YYLTYPE} and @code{yytoken_kind_t}, @code{%code
 requires} is not sufficient.  Instead, move its prototype from the
 unqualified @code{%code} to a @code{%code provides}:
 
@@ -3184,7 +3409,7 @@
 
 @group
 %code provides @{
-  void trace_token (enum yytokentype token, YYLTYPE loc);
+  void trace_token (yytoken_kind_t token, YYLTYPE loc);
 @}
 @end group
 
@@ -3200,7 +3425,7 @@
 @noindent
 Bison will insert the @code{trace_token} prototype into both the parser
 header file and the parser implementation file after the definitions for
-@code{yytokentype}, @code{YYLTYPE}, and @code{YYSTYPE}.
+@code{yytoken_kind_t}, @code{YYLTYPE}, and @code{YYSTYPE}.
 
 The above examples are careful to write directives in an order that reflects
 the layout of the generated parser implementation and header files:
@@ -3264,7 +3489,7 @@
 The @var{Bison declarations} section contains declarations that define
 terminal and nonterminal symbols, specify precedence, and so on.
 In some simple grammars you may not need any declarations.
-@xref{Declarations, ,Bison Declarations}.
+@xref{Declarations}.
 
 @node Grammar Rules
 @subsection The Grammar Rules Section
@@ -3272,7 +3497,7 @@
 @cindex rules section for grammar
 
 The @dfn{grammar rules} section contains one or more Bison grammar
-rules, and nothing else.  @xref{Rules, ,Syntax of Grammar Rules}.
+rules, and nothing else.  @xref{Rules}.
 
 There must always be at least one grammar rule, and the first
 @samp{%%} (which precedes the grammar rules) may never be omitted even
@@ -3292,8 +3517,7 @@
 of @code{yylex} and @code{yyerror} often go here.  Because C requires
 functions to be declared before being used, you often need to declare
 functions like @code{yylex} and @code{yyerror} in the Prologue, even
-if you define them in the Epilogue.  @xref{Interface, ,Parser
-C-Language Interface}.
+if you define them in the Epilogue.  @xref{Interface}.
 
 If the last section is empty, you may omit the @samp{%%} that separates it
 from the grammar rules.
@@ -3307,19 +3531,19 @@
 @section Symbols, Terminal and Nonterminal
 @cindex nonterminal symbol
 @cindex terminal symbol
-@cindex token type
+@cindex token kind
 @cindex symbol
 
 @dfn{Symbols} in Bison grammars represent the grammatical classifications
 of the language.
 
-A @dfn{terminal symbol} (also known as a @dfn{token type}) represents a
+A @dfn{terminal symbol} (also known as a @dfn{token kind}) represents a
 class of syntactically equivalent tokens.  You use the symbol in grammar
 rules to mean that a token in that class is allowed.  The symbol is
 represented in the Bison parser by a numeric code, and the @code{yylex}
-function returns a token type code to indicate what kind of token has
-been read.  You don't need to know what the code value is; you can use
-the symbol to stand for it.
+function returns a token kind code to indicate what kind of token has been
+read.  You don't need to know what the code value is; you can use the symbol
+to stand for it.
 
 A @dfn{nonterminal symbol} stands for a class of syntactically
 equivalent groupings.  The symbol name is used in writing grammar rules.
@@ -3337,34 +3561,31 @@
 
 @itemize @bullet
 @item
-A @dfn{named token type} is written with an identifier, like an
-identifier in C@.  By convention, it should be all upper case.  Each
-such name must be defined with a Bison declaration such as
-@code{%token}.  @xref{Token Decl, ,Token Type Names}.
+A @dfn{named token kind} is written with an identifier, like an identifier
+in C@.  By convention, it should be all upper case.  Each such name must be
+defined with a Bison declaration such as @code{%token}.  @xref{Token Decl}.
 
 @item
 @cindex character token
 @cindex literal token
 @cindex single-character literal
-A @dfn{character token type} (or @dfn{literal character token}) is
-written in the grammar using the same syntax used in C for character
-constants; for example, @code{'+'} is a character token type.  A
-character token type doesn't need to be declared unless you need to
-specify its semantic value data type (@pxref{Value Type, ,Data Types of
-Semantic Values}), associativity, or precedence (@pxref{Precedence,
-,Operator Precedence}).
+A @dfn{character token kind} (or @dfn{literal character token}) is written
+in the grammar using the same syntax used in C for character constants; for
+example, @code{'+'} is a character token kind.  A character token kind
+doesn't need to be declared unless you need to specify its semantic value
+data type (@pxref{Value Type}), associativity, or precedence
+(@pxref{Precedence}).
 
-By convention, a character token type is used only to represent a
-token that consists of that particular character.  Thus, the token
-type @code{'+'} is used to represent the character @samp{+} as a
-token.  Nothing enforces this convention, but if you depart from it,
-your program will confuse other readers.
+By convention, a character token kind is used only to represent a token that
+consists of that particular character.  Thus, the token kind @code{'+'} is
+used to represent the character @samp{+} as a token.  Nothing enforces this
+convention, but if you depart from it, your program will confuse other
+readers.
 
-All the usual escape sequences used in character literals in C can be
-used in Bison as well, but you must not use the null character as a
-character literal because its numeric code, zero, signifies
-end-of-input (@pxref{Calling Convention, ,Calling Convention
-for @code{yylex}}).  Also, unlike standard C, trigraphs have no
+All the usual escape sequences used in character literals in C can be used
+in Bison as well, but you must not use the null character as a character
+literal because its numeric code, zero, signifies end-of-input
+(@pxref{Calling Convention}).  Also, unlike standard C, trigraphs have no
 special meaning in Bison character literals, nor is backslash-newline
 allowed.
 
@@ -3378,17 +3599,16 @@
 value data type (@pxref{Value Type}), associativity, or precedence
 (@pxref{Precedence}).
 
-You can associate the literal string token with a symbolic name as an
-alias, using the @code{%token} declaration (@pxref{Token Decl, ,Token
-Declarations}).  If you don't do that, the lexical analyzer has to
-retrieve the token number for the literal string token from the
-@code{yytname} table (@pxref{Calling Convention}).
+You can associate the literal string token with a symbolic name as an alias,
+using the @code{%token} declaration (@pxref{Token Decl}).  If you don't do
+that, the lexical analyzer has to retrieve the token code for the literal
+string token from the @code{yytname} table (@pxref{Calling Convention}).
 
 @strong{Warning}: literal string tokens do not work in Yacc.
 
 By convention, a literal string token is used only to represent a token
 that consists of that particular string.  Thus, you should use the token
-type @code{"<="} to represent the string @samp{<=} as a token.  Bison
+kind @code{"<="} to represent the string @samp{<=} as a token.  Bison
 does not enforce this convention, but if you depart from it, people who
 read your program will be confused.
 
@@ -3406,22 +3626,22 @@
 
 The value returned by @code{yylex} is always one of the terminal
 symbols, except that a zero or negative value signifies end-of-input.
-Whichever way you write the token type in the grammar rules, you write
+Whichever way you write the token kind in the grammar rules, you write
 it the same way in the definition of @code{yylex}.  The numeric code
-for a character token type is simply the positive numeric code of the
+for a character token kind is simply the positive numeric code of the
 character, so @code{yylex} can use the identical value to generate the
 requisite code, though you may need to convert it to @code{unsigned
 char} to avoid sign-extension on hosts where @code{char} is signed.
-Each named token type becomes a C macro in the parser implementation
+Each named token kind becomes a C macro in the parser implementation
 file, so @code{yylex} can use the name to stand for the code.  (This
 is why periods don't make sense in terminal symbols.)  @xref{Calling
-Convention, ,Calling Convention for @code{yylex}}.
+Convention}.
 
 If @code{yylex} is defined in a separate file, you need to arrange for the
-token-type macro definitions to be available there.  Use the @samp{-d}
-option when you run Bison, so that it will write these macro definitions
-into a separate header file @file{@var{name}.tab.h} which you can include
-in the other source files that need it.  @xref{Invocation, ,Invoking Bison}.
+token-kind definitions to be available there.  Use the @option{-d} option
+when you run Bison, so that it will write these definitions into a separate
+header file @file{@var{name}.tab.h} which you can include in the other
+source files that need it.  @xref{Invocation}.
 
 If you want to write a grammar that is portable to any Standard C
 host, you must use only nonnull character tokens taken from the basic
@@ -3628,7 +3848,7 @@
 Right recursion uses up space on the Bison stack in proportion to the
 number of elements in the sequence, because all the elements must be
 shifted onto the stack before the rule can be applied even once.
-@xref{Algorithm, ,The Bison Parser Algorithm}, for further explanation
+@xref{Algorithm}, for further explanation
 of this.
 
 @cindex mutual recursion
@@ -3695,13 +3915,11 @@
 
 In a simple program it may be sufficient to use the same data type for
 the semantic values of all language constructs.  This was true in the
-RPN and infix calculator examples (@pxref{RPN Calc, ,Reverse Polish
-Notation Calculator}).
+RPN and infix calculator examples (@pxref{RPN Calc}).
 
-Bison normally uses the type @code{int} for semantic values if your
-program uses the same data type for all language constructs.  To
-specify some other type, define the @code{%define} variable
-@code{api.value.type} like this:
+Bison normally uses the type @code{int} for semantic values if your program
+uses the same data type for all language constructs.  To specify some other
+type, define the @code{%define} variable @code{api.value.type} like this:
 
 @example
 %define api.value.type @{double@}
@@ -3711,15 +3929,14 @@
 or
 
 @example
-%define api.value.type @{struct semantic_type@}
+%define api.value.type @{struct semantic_value_type@}
 @end example
 
 The value of @code{api.value.type} should be a type name that does not
 contain parentheses or square brackets.
 
-Alternatively, instead of relying of Bison's @code{%define} support, you may
-rely on the C/C++ preprocessor and define @code{YYSTYPE} as a macro, like
-this:
+Alternatively in C, instead of relying of Bison's @code{%define} support,
+you may rely on the C preprocessor and define @code{YYSTYPE} as a macro:
 
 @example
 #define YYSTYPE double
@@ -3727,11 +3944,10 @@
 
 @noindent
 This macro definition must go in the prologue of the grammar file
-(@pxref{Grammar Outline, ,Outline of a Bison Grammar}).  If compatibility
-with POSIX Yacc matters to you, use this.  Note however that Bison cannot
-know @code{YYSTYPE}'s value, not even whether it is defined, so there are
-services it cannot provide.  Besides this works only for languages that have
-a preprocessor.
+(@pxref{Grammar Outline}).  If compatibility with POSIX Yacc matters to you,
+use this.  Note however that Bison cannot know @code{YYSTYPE}'s value, not
+even whether it is defined, so there are services it cannot provide.
+Besides this works only for C.
 
 @node Multiple Types
 @subsection More Than One Value Type
@@ -3754,13 +3970,11 @@
 let Bison compute the union type from the tags you assign to symbols;
 
 @item
-use the @code{%union} Bison declaration (@pxref{Union Decl, ,The Union
-Declaration});
+use the @code{%union} Bison declaration (@pxref{Union Decl});
 
 @item
 define the @code{%define} variable @code{api.value.type} to be a union type
-whose members are the type tags (@pxref{Structured Value Type,, Providing a
-Structured Semantic Value Type});
+whose members are the type tags (@pxref{Structured Value Type});
 
 @item
 use a @code{typedef} or a @code{#define} to define @code{YYSTYPE} to be a
@@ -3770,9 +3984,9 @@
 @item
 Choose one of those types for each symbol (terminal or nonterminal) for
 which semantic values are used.  This is done for tokens with the
-@code{%token} Bison declaration (@pxref{Token Decl, ,Token Type Names}) and
+@code{%token} Bison declaration (@pxref{Token Decl}) and
 for groupings with the @code{%nterm}/@code{%type} Bison declarations
-(@pxref{Type Decl, ,Nonterminal Symbols}).
+(@pxref{Type Decl}).
 @end itemize
 
 @node Type Generation
@@ -3819,7 +4033,7 @@
 @end example
 
 If the @code{%define} variable @code{api.token.prefix} is defined
-(@pxref{%define Summary,,api.token.prefix}), then it is also used to prefix
+(@pxref{%define Summary}), then it is also used to prefix
 the union member names.  For instance, with @samp{%define api.token.prefix
 @{TOK_@}}:
 
@@ -3863,8 +4077,7 @@
 This says that the two alternative types are @code{double} and @code{symrec
 *}.  They are given names @code{val} and @code{tptr}; these names are used
 in the @code{%token}, @code{%nterm} and @code{%type} declarations to pick
-one of the types for a terminal or nonterminal symbol (@pxref{Type Decl,
-,Nonterminal Symbols}).
+one of the types for a terminal or nonterminal symbol (@pxref{Type Decl}).
 
 As an extension to POSIX, a tag is allowed after the @code{%union}.  For
 example:
@@ -3881,7 +4094,7 @@
 @noindent
 specifies the union tag @code{value}, so the corresponding C type is
 @code{union value}.  If you do not specify a tag, it defaults to
-@code{YYSTYPE} (@pxref{%define Summary,,api.value.union.name}).
+@code{YYSTYPE} (@pxref{%define Summary}).
 
 As another extension to POSIX, you may specify multiple @code{%union}
 declarations; their contents are concatenated.  However, only the first
@@ -3950,7 +4163,7 @@
 it is executed at that position.  Most rules have just one action at the
 end of the rule, following all the components.  Actions in the middle of
 a rule are tricky and used only for special purposes (@pxref{Midrule
-Actions, ,Actions in Midrule}).
+Actions}).
 
 The C code in an action can refer to the semantic values of the
 components matched by the rule with the construct @code{$@var{n}},
@@ -4046,7 +4259,7 @@
 It is also possible to access the semantic value of the lookahead token, if
 any, from a semantic action.
 This semantic value is stored in @code{yylval}.
-@xref{Action Features, ,Special Features for Use in Actions}.
+@xref{Action Features}.
 
 @node Action Types
 @subsection Data Types of Values in Actions
@@ -4213,7 +4426,7 @@
 Recovery}) while parsing the tokens in the embedded statement @code{stmt},
 it might discard the previous semantic context @code{$<context>5} without
 restoring it.  Thus, @code{$<context>5} needs a destructor
-(@pxref{Destructor Decl, , Freeing Discarded Symbols}), and Bison needs the
+(@pxref{Destructor Decl}), and Bison needs the
 type of the semantic value (@code{context}) to select the right destructor.
 
 As an extension to Yacc's midrule actions, Bison offers a means to type
@@ -4270,7 +4483,7 @@
 
 Midrule actions are actually transformed into regular rules and actions.
 The various reports generated by Bison (textual, graphical, etc., see
-@ref{Understanding, , Understanding Your Parser}) reveal this translation,
+@ref{Understanding}) reveal this translation,
 best explained by means of an example.  The following rule:
 
 @example
@@ -4312,8 +4525,7 @@
 does not generate a value (it does not use @code{$$} although the final
 action uses it), and the value of the second one is not used (the final
 action does not use @code{$3}).  Bison reports these errors when the
-@code{midrule-value} warnings are enabled (@pxref{Invocation, ,Invoking
-Bison}):
+@code{midrule-value} warnings are enabled (@pxref{Invocation}):
 
 @example
 $ @kbd{bison -Wmidrule-value mid.y}
@@ -4408,7 +4620,7 @@
 must commit to using one rule or the other, without sufficient
 information to do it correctly.  (The open-brace token is what is called
 the @dfn{lookahead} token at this time, since the parser is still
-deciding what to do about it.  @xref{Lookahead, ,Lookahead Tokens}.)
+deciding what to do about it.  @xref{Lookahead}.)
 
 You might think that you could correct the problem by putting identical
 actions into the two rules, like this:
@@ -4485,6 +4697,7 @@
 @menu
 * Location Type::               Specifying a data type for locations.
 * Actions and Locations::       Using locations in actions.
+* Printing Locations::          Defining how locations are printed.
 * Location Default Action::     Defining a general way to compute locations.
 @end menu
 
@@ -4494,13 +4707,16 @@
 @cindex default location type
 
 Defining a data type for locations is much simpler than for semantic values,
-since all tokens and groupings always use the same type.
+since all tokens and groupings always use the same type.  The location type
+is specified using @samp{%define api.location.type}:
 
-You can specify the type of locations by defining a macro called
-@code{YYLTYPE}, just as you can specify the semantic value type by
-defining a @code{YYSTYPE} macro (@pxref{Value Type}).
-When @code{YYLTYPE} is not defined, Bison uses a default structure type with
-four members:
+@example
+%define api.location.type @{location_t@}
+@end example
+
+This defines, in the C generated code, the @code{YYLTYPE} type name.  When
+@code{YYLTYPE} is not defined, Bison uses a default structure type with four
+members:
 
 @example
 typedef struct YYLTYPE
@@ -4512,11 +4728,22 @@
 @} YYLTYPE;
 @end example
 
-When @code{YYLTYPE} is not defined, at the beginning of the parsing, Bison
-initializes all these fields to 1 for @code{yylloc}.  To initialize
+In C, you may also specify the type of locations by defining a macro called
+@code{YYLTYPE}, just as you can specify the semantic value type by defining
+a @code{YYSTYPE} macro (@pxref{Value Type}).  However, rather than using
+macros, we recommend the @code{api.value.type} and @code{api.location.type}
+@code{%define} variables.
+
+Default locations represent a range in the source file(s), but this is not a
+requirement.  It could be a single point or just a line number, or even more
+complex structures.
+
+When the default location type is used, Bison initializes all these fields
+to 1 for @code{yylloc} at the beginning of the parsing.  To initialize
 @code{yylloc} with a custom location type (or to chose a different
 initialization), use the @code{%initial-action} directive.  @xref{Initial
-Action Decl, , Performing Actions before Parsing}.
+Action Decl}.
+
 
 @node Actions and Locations
 @subsection Actions and Locations
@@ -4598,7 +4825,30 @@
 It is also possible to access the location of the lookahead token, if any,
 from a semantic action.
 This location is stored in @code{yylloc}.
-@xref{Action Features, ,Special Features for Use in Actions}.
+@xref{Action Features}.
+
+@node Printing Locations
+@subsection Printing Locations
+@vindex YYLOCATION_PRINT
+
+When using the default location type, the debug traces report the symbols'
+location.  The generated parser does so using the @code{YYLOCATION_PRINT}
+macro.
+
+@deffn {Macro} YYLOCATION_PRINT (@var{file}, @var{loc})@code{;}
+When traces are enabled, print @var{loc} (of type @samp{YYLTYPE const *}) on
+@var{file} (of type @samp{FILE *}).  Do nothing when traces are disabled, or
+if the location type is user defined.
+@end deffn
+
+To get locations in the debug traces with your user-defined location types,
+define the @code{YYLOCATION_PRINT} macro.  For instance:
+
+@example
+#define YYLOCATION_PRINT   location_print
+@end example
+
+
 
 @node Location Default Action
 @subsection Default Action for Locations
@@ -4777,15 +5027,14 @@
 used in formulating the grammar and the data types of semantic values.
 @xref{Symbols}.
 
-All token type names (but not single-character literal tokens such as
+All token kind names (but not single-character literal tokens such as
 @code{'+'} and @code{'*'}) must be declared.  Nonterminal symbols must be
 declared if you need to specify which data type to use for the semantic
-value (@pxref{Multiple Types, ,More Than One Value Type}).
+value (@pxref{Multiple Types}).
 
 The first rule in the grammar file also specifies the start symbol, by
 default.  If you want some other symbol to be the start symbol, you
-must declare it explicitly (@pxref{Language and Grammar, ,Languages
-and Context-Free Grammars}).
+must declare it explicitly (@pxref{Language and Grammar}).
 
 @menu
 * Require Decl::      Requiring a Bison version.
@@ -4824,37 +5073,33 @@
 @item @code{"3.2"} (or better)
 The C++ deprecated files @file{position.hh} and @file{stack.hh} are no
 longer generated.
-
-@item @code{"3.4"} (or better)
-To comply with the
-@uref{https://marc.info/?l=graphviz-devel&m=129418103126092, recommendations
-of the Graphviz team}, use the @code{.gv} extension instead of @code{.dot}
-for the name of the generated DOT file.  @xref{Graphviz}.
 @end table
 
 
 @node Token Decl
-@subsection Token Type Names
-@cindex declaring token type names
-@cindex token type names, declaring
+@subsection Token Kind Names
+@cindex declaring token kind names
+@cindex token kind names, declaring
 @cindex declaring literal string tokens
 @findex %token
 
-The basic way to declare a token type name (terminal symbol) is as follows:
+The basic way to declare a token kind name (terminal symbol) is as follows:
 
 @example
 %token @var{name}
 @end example
 
-Bison will convert this into a definition in the parser, so
-that the function @code{yylex} (if it is in this file) can use the name
-@var{name} to stand for this token type's code.
+Bison will convert this into a definition in the parser, so that the
+function @code{yylex} (if it is in this file) can use the name @var{name} to
+stand for this token kind's code.
 
 Alternatively, you can use @code{%left}, @code{%right}, @code{%precedence},
 or @code{%nonassoc} instead of @code{%token}, if you wish to specify
-associativity and precedence.  @xref{Precedence Decl, ,Operator Precedence}.
+associativity and precedence.  @xref{Precedence Decl}.  However, for
+clarity, we recommend to use these directives only to declare associativity
+and precedence, and not to add string aliases, semantic types, etc.
 
-You can explicitly specify the numeric code for a token type by appending a
+You can explicitly specify the numeric code for a token kind by appending a
 nonnegative decimal or hexadecimal integer value in the field immediately
 following the token name:
 
@@ -4865,13 +5110,12 @@
 
 @noindent
 It is generally best, however, to let Bison choose the numeric codes for all
-token types.  Bison will automatically select codes that don't conflict with
+token kinds.  Bison will automatically select codes that don't conflict with
 each other or with normal characters.
 
 In the event that the stack type is a union, you must augment the
 @code{%token} or other token declaration to include the data type
-alternative delimited by angle-brackets (@pxref{Multiple Types, ,More Than
-One Value Type}).
+alternative delimited by angle-brackets (@pxref{Multiple Types}).
 
 For example:
 
@@ -4885,7 +5129,7 @@
 @end group
 @end example
 
-You can associate a literal string token with a token type name by writing
+You can associate a literal string token with a token kind name by writing
 the literal string at the end of a @code{%token} declaration which declares
 the name.  For example:
 
@@ -4904,21 +5148,34 @@
 @end example
 
 @noindent
-Once you equate the literal string and the token name, you can use them
+Once you equate the literal string and the token kind name, you can use them
 interchangeably in further declarations or the grammar rules.  The
 @code{yylex} function can use the token name or the literal string to obtain
-the token type code number (@pxref{Calling Convention}).  Syntax error
-messages passed to @code{yyerror} from the parser will reference the literal
-string instead of the token name.
+the token kind code (@pxref{Calling Convention}).
 
-The token numbered as 0 corresponds to end of file; the following line
-allows for nicer error messages referring to ``end of file'' instead of
-``$end'':
+String aliases allow for better error messages using the literal strings
+instead of the token names, such as @samp{syntax error, unexpected ||,
+expecting number or (} rather than @samp{syntax error, unexpected OR,
+expecting NUM or LPAREN}.
+
+String aliases may also be marked for internationalization (@pxref{Token
+I18n}):
 
 @example
-%token END 0 "end of file"
+%token
+    OR     "||"
+    LPAREN "("
+    RPAREN ")"
+    '\n'   _("end of line")
+  <double>
+    NUM    _("number")
 @end example
 
+@noindent
+would produce in French @samp{erreur de syntaxe, || inattendu, attendait
+nombre ou (} rather than @samp{erreur de syntaxe, || inattendu, attendait
+number ou (}.
+
 @node Precedence Decl
 @subsection Operator Precedence
 @cindex precedence declarations
@@ -4928,7 +5185,7 @@
 Use the @code{%left}, @code{%right}, @code{%nonassoc}, or @code{%precedence}
 declaration to declare a token and specify its precedence and associativity,
 all at once.  These are called @dfn{precedence declarations}.
-@xref{Precedence, ,Operator Precedence}, for general information on operator
+@xref{Precedence}, for general information on operator
 precedence.
 
 The syntax of a precedence declaration is nearly the same as that of
@@ -4974,7 +5231,7 @@
 
 For backward compatibility, there is a confusing difference between the
 argument lists of @code{%token} and precedence declarations.  Only a
-@code{%token} can associate a literal string with a token type name.  A
+@code{%token} can associate a literal string with a token kind name.  A
 precedence declaration always interprets a literal string as a reference to
 a separate token.  For example:
 
@@ -5002,9 +5259,9 @@
 @noindent
 Here @var{nonterminal} is the name of a nonterminal symbol, and @var{type}
 is the name given in the @code{%union} to the alternative that you want
-(@pxref{Union Decl, ,The Union Declaration}).  You can give any number of
-nonterminal symbols in the same @code{%type} declaration, if they have the
-same value type.  Use spaces to separate the symbol names.
+(@pxref{Union Decl}).  You can give any number of nonterminal symbols in the
+same @code{%type} declaration, if they have the same value type.  Use spaces
+to separate the symbol names.
 
 While POSIX Yacc allows @code{%type} only for nonterminals, Bison accepts
 that this directive be also applied to terminal symbols.  To declare
@@ -5074,10 +5331,10 @@
 @findex %destructor
 @findex <*>
 @findex <>
-During error recovery (@pxref{Error Recovery}), symbols already pushed
-on the stack and tokens coming from the rest of the file are discarded
-until the parser falls on its feet.  If the parser runs out of memory,
-or if it returns via @code{YYABORT} or @code{YYACCEPT}, all the
+During error recovery (@pxref{Error Recovery}), symbols already pushed on
+the stack and tokens coming from the rest of the file are discarded until
+the parser falls on its feet.  If the parser runs out of memory, or if it
+returns via @code{YYABORT}, @code{YYACCEPT} or @code{YYNOMEM}, all the
 symbols on the stack must be discarded.  Even if the parser succeeds, it
 must discard the start symbol.
 
@@ -5095,8 +5352,7 @@
 @var{symbols}.  Within @var{code}, @code{$$} (or @code{$<@var{tag}>$})
 designates the semantic value associated with the discarded symbol, and
 @code{@@$} designates its location.  The additional parser parameters are
-also available (@pxref{Parser Function, , The Parser Function
-@code{yyparse}}).
+also available (@pxref{Parser Function}).
 
 When a symbol is listed among @var{symbols}, its @code{%destructor} is called a
 per-symbol @code{%destructor}.
@@ -5152,10 +5408,10 @@
 user-defined as opposed to Bison-defined symbols.
 For example, the parser will not invoke either kind of default
 @code{%destructor} for the special Bison-defined symbols @code{$accept},
-@code{$undefined}, or @code{$end} (@pxref{Table of Symbols, ,Bison Symbols}),
+@code{$undefined}, or @code{$end} (@pxref{Table of Symbols}),
 none of which you can reference in your grammar.
 It also will not invoke either for the @code{error} token (@pxref{Table of
-Symbols, ,error}), which is always defined by Bison regardless of whether you
+Symbols}), which is always defined by Bison regardless of whether you
 reference it in your grammar.
 However, it may invoke one of them for the end token (token 0) if you
 redefine it from @code{$end} to, for example, @code{END}:
@@ -5167,7 +5423,7 @@
 @cindex actions in midrule
 @cindex midrule actions
 Finally, Bison will never invoke a @code{%destructor} for an unreferenced
-midrule semantic value (@pxref{Midrule Actions,,Actions in Midrule}).
+midrule semantic value (@pxref{Midrule Actions}).
 That is, Bison does not consider a midrule to have a semantic value if you
 do not reference @code{$$} in the midrule's action or @code{$@var{n}}
 (where @var{n} is the right-hand side symbol position of the midrule) in
@@ -5204,8 +5460,8 @@
 @end itemize
 
 The parser can @dfn{return immediately} because of an explicit call to
-@code{YYABORT} or @code{YYACCEPT}, or failed error recovery, or memory
-exhaustion.
+@code{YYABORT}, @code{YYACCEPT} or @code{YYNOMEM}, or failed error recovery,
+or memory exhaustion.
 
 Right-hand side symbols of a rule that explicitly triggers a syntax
 error via @code{YYERROR} are not discarded automatically.  As a rule
@@ -5218,14 +5474,14 @@
 @findex %printer
 @findex <*>
 @findex <>
-When run-time traces are enabled (@pxref{Tracing, ,Tracing Your Parser}),
+When run-time traces are enabled (@pxref{Tracing}),
 the parser reports its actions, such as reductions.  When a symbol involved
 in an action is reported, only its kind is displayed, as the parser cannot
 know how semantic values should be formatted.
 
 The @code{%printer} directive defines code that is called when a symbol is
 reported.  Its syntax is the same as @code{%destructor} (@pxref{Destructor
-Decl, , Freeing Discarded Symbols}).
+Decl}).
 
 @deffn {Directive} %printer @{ @var{code} @} @var{symbols}
 @findex %printer
@@ -5233,14 +5489,13 @@
 @c This is the same text as for %destructor.
 Invoke the braced @var{code} whenever the parser displays one of the
 @var{symbols}.  Within @var{code}, @code{yyo} denotes the output stream (a
-@code{FILE*} in C, and an @code{std::ostream&} in C++), @code{$$} (or
+@code{FILE*} in C, an @code{std::ostream&} in C++, and @code{stdout} in D), @code{$$} (or
 @code{$<@var{tag}>$}) designates the semantic value associated with the
 symbol, and @code{@@$} its location.  The additional parser parameters are
-also available (@pxref{Parser Function, , The Parser Function
-@code{yyparse}}).
+also available (@pxref{Parser Function}).
 
 The @var{symbols} are defined as for @code{%destructor} (@pxref{Destructor
-Decl, , Freeing Discarded Symbols}.): they can be per-type (e.g.,
+Decl}.): they can be per-type (e.g.,
 @samp{<ival>}), per-symbol (e.g., @samp{exp}, @samp{NUM}, @samp{"float"}),
 typed per-default (i.e., @samp{<*>}, or untyped per-default (i.e.,
 @samp{<>}).
@@ -5271,8 +5526,7 @@
 @code{string1}, it formats it as a string in double quotes.  It performs
 only the second @code{%printer} in this case, so it prints only once.
 Finally, the parser print @samp{<>} for any symbol, such as @code{TAGLESS},
-that has no semantic type tag.  @xref{Mfcalc Traces, ,Enabling Debug Traces
-for @code{mfcalc}}, for a complete example.
+that has no semantic type tag.  @xref{Mfcalc Traces}, for a complete example.
 
 
 
@@ -5286,7 +5540,7 @@
 @findex %expect-rr
 
 Bison normally warns if there are any conflicts in the grammar
-(@pxref{Shift/Reduce, ,Shift/Reduce Conflicts}), but most real grammars
+(@pxref{Shift/Reduce}), but most real grammars
 have harmless shift/reduce conflicts which are resolved in a predictable
 way and would be difficult to eliminate.  It is desirable to suppress
 the warning about these conflicts unless the number of conflicts
@@ -5321,7 +5575,7 @@
 The interpretation of these modifiers differs from their use as
 declarations.  When attached to rules, they indicate the number of states
 in which the rule is involved in a conflict.  You will need to consult the
-output resulting from @samp{-v} to determine appropriate numbers to use.
+output resulting from @option{-v} to determine appropriate numbers to use.
 For example, for the following grammar fragment, the first rule for
 @code{empty_dims} appears in two states in which the @samp{[} token is a
 lookahead.  Having determined that, you can document this fact with an
@@ -5340,7 +5594,7 @@
 @end example
 
 Mid-rule actions generate implicit rules that are also subject to conflicts
-(@pxref{Midrule Conflicts,, Conflicts due to Midrule Actions}). To attach
+(@pxref{Midrule Conflicts}). To attach
 an @code{%expect} or @code{%expect-rr} annotation to an implicit
 mid-rule action's rule, put it before the action.  For example,
 
@@ -5366,7 +5620,7 @@
 
 @itemize @bullet
 @item
-Compile your grammar without @code{%expect}.  Use the @samp{-v} option
+Compile your grammar without @code{%expect}.  Use the @option{-v} option
 to get a verbose list of where the conflicts occur.  Bison will also
 print the number of conflicts.
 
@@ -5437,13 +5691,11 @@
 
 The result is that the communication variables @code{yylval} and
 @code{yylloc} become local variables in @code{yyparse}, and a different
-calling convention is used for the lexical analyzer function
-@code{yylex}.  @xref{Pure Calling, ,Calling Conventions for Pure
-Parsers}, for the details of this.  The variable @code{yynerrs}
-becomes local in @code{yyparse} in pull mode but it becomes a member
-of @code{yypstate} in push mode.  (@pxref{Error Reporting, ,The Error
-Reporting Function @code{yyerror}}).  The convention for calling
-@code{yyparse} itself is unchanged.
+calling convention is used for the lexical analyzer function @code{yylex}.
+@xref{Pure Calling}, for the details of this.  The variable @code{yynerrs}
+becomes local in @code{yyparse} in pull mode but it becomes a member of
+@code{yypstate} in push mode.  (@pxref{Error Reporting Function}).  The
+convention for calling @code{yyparse} itself is unchanged.
 
 Whether the parser is pure has nothing to do with the grammar rules.
 You can generate either a pure parser or a nonreentrant parser from any
@@ -5466,14 +5718,14 @@
 
 Normally, Bison generates a pull parser.
 The following Bison declaration says that you want the parser to be a push
-parser (@pxref{%define Summary,,api.push-pull}):
+parser (@pxref{%define Summary}):
 
 @example
 %define api.push-pull push
 @end example
 
 In almost all cases, you want to ensure that your push parser is also
-a pure parser (@pxref{Pure Decl, ,A Pure (Reentrant) Parser}).  The only
+a pure parser (@pxref{Pure Decl}).  The only
 time you should create an impure push parser is to have backwards
 compatibility with the impure Yacc pull mode interface.  Unless you know
 what you are doing, your declarations should look like this:
@@ -5506,12 +5758,12 @@
 yypstate_delete (ps);
 @end example
 
-If the user decided to use an impure push parser, a few things about
-the generated parser will change.  The @code{yychar} variable becomes
-a global variable instead of a variable in the @code{yypush_parse} function.
-For this reason, the signature of the @code{yypush_parse} function is
-changed to remove the token as a parameter.  A nonreentrant push parser
-example would thus look like this:
+If the user decided to use an impure push parser, a few things about the
+generated parser will change.  The @code{yychar} variable becomes a global
+variable instead of a local one in the @code{yypush_parse} function.  For
+this reason, the signature of the @code{yypush_parse} function is changed to
+remove the token as a parameter.  A nonreentrant push parser example would
+thus look like this:
 
 @example
 extern int yychar;
@@ -5566,62 +5818,60 @@
 
 @deffn {Directive} %union
 Declare the collection of data types that semantic values may have
-(@pxref{Union Decl, ,The Union Declaration}).
+(@pxref{Union Decl}).
 @end deffn
 
 @deffn {Directive} %token
-Declare a terminal symbol (token type name) with no precedence
-or associativity specified (@pxref{Token Decl, ,Token Type Names}).
+Declare a terminal symbol (token kind name) with no precedence
+or associativity specified (@pxref{Token Decl}).
 @end deffn
 
 @deffn {Directive} %right
-Declare a terminal symbol (token type name) that is right-associative
-(@pxref{Precedence Decl, ,Operator Precedence}).
+Declare a terminal symbol (token kind name) that is right-associative
+(@pxref{Precedence Decl}).
 @end deffn
 
 @deffn {Directive} %left
-Declare a terminal symbol (token type name) that is left-associative
-(@pxref{Precedence Decl, ,Operator Precedence}).
+Declare a terminal symbol (token kind name) that is left-associative
+(@pxref{Precedence Decl}).
 @end deffn
 
 @deffn {Directive} %nonassoc
-Declare a terminal symbol (token type name) that is nonassociative
-(@pxref{Precedence Decl, ,Operator Precedence}).
+Declare a terminal symbol (token kind name) that is nonassociative
+(@pxref{Precedence Decl}).
 Using it in a way that would be associative is a syntax error.
 @end deffn
 
 @ifset defaultprec
 @deffn {Directive} %default-prec
 Assign a precedence to rules lacking an explicit @code{%prec} modifier
-(@pxref{Contextual Precedence, ,Context-Dependent Precedence}).
+(@pxref{Contextual Precedence}).
 @end deffn
 @end ifset
 
 @deffn {Directive} %nterm
 Declare the type of semantic values for a nonterminal symbol (@pxref{Type
-Decl, ,Nonterminal Symbols}).
+Decl}).
 @end deffn
 
 @deffn {Directive} %type
-Declare the type of semantic values for a symbol (@pxref{Type Decl,
-,Nonterminal Symbols}).
+Declare the type of semantic values for a symbol (@pxref{Type Decl}).
 @end deffn
 
 @deffn {Directive} %start
-Specify the grammar's start symbol (@pxref{Start Decl, ,The
-Start-Symbol}).
+Specify the grammar's start symbol (@pxref{Start Decl}).
 @end deffn
 
 @deffn {Directive} %expect
-Declare the expected number of shift-reduce conflicts, either overall or
+Declare the expected number of shift/reduce conflicts, either overall or
 for a given rule
-(@pxref{Expect Decl, ,Suppressing Conflict Warnings}).
+(@pxref{Expect Decl}).
 @end deffn
 
 @deffn {Directive} %expect-rr
-Declare the expected number of reduce-reduce conflicts, either overall or
+Declare the expected number of reduce/reduce conflicts, either overall or
 for a given rule
-(@pxref{Expect Decl, ,Suppressing Conflict Warnings}).
+(@pxref{Expect Decl}).
 @end deffn
 
 
@@ -5641,7 +5891,7 @@
 @deffn {Directive} %debug
 Instrument the parser for traces.  Obsoleted by @samp{%define
 parse.trace}.
-@xref{Tracing, ,Tracing Your Parser}.
+@xref{Tracing}.
 @end deffn
 
 @deffn {Directive} %define @var{variable}
@@ -5652,25 +5902,39 @@
 @end deffn
 
 @deffn {Directive} %defines
-Write a parser header file containing macro definitions for the token
-type names defined in the grammar as well as a few other declarations.
-If the parser implementation file is named @file{@var{name}.c} then
-the parser header file is named @file{@var{name}.h}.
+@deffnx {Directive} %defines @var{defines-file}
+Historical name for @code{%header}.  @xref{%header,,@code{%header}}.
+@end deffn
+
+@deffn {Directive} %destructor
+Specify how the parser should reclaim the memory associated to
+discarded symbols.  @xref{Destructor Decl}.
+@end deffn
+
+@deffn {Directive} %file-prefix "@var{prefix}"
+Specify a prefix to use for all Bison output file names.  The names
+are chosen as if the grammar file were named @file{@var{prefix}.y}.
+@end deffn
+
+@anchor{%header}
+@deffn {Directive} %header
+Write a parser header file containing definitions for the token kind names
+defined in the grammar as well as a few other declarations.  If the parser
+implementation file is named @file{@var{name}.c} then the parser header file
+is named @file{@var{name}.h}.
 
 For C parsers, the parser header file declares @code{YYSTYPE} unless
 @code{YYSTYPE} is already defined as a macro or you have used a
-@code{<@var{type}>} tag without using @code{%union}.  Therefore, if
-you are using a @code{%union} (@pxref{Multiple Types, ,More Than One
-Value Type}) with components that require other definitions, or if you
-have defined a @code{YYSTYPE} macro or type definition (@pxref{Value
-Type, ,Data Types of Semantic Values}), you need to arrange for these
-definitions to be propagated to all modules, e.g., by putting them in
-a prerequisite header that is included both by your parser and by any
-other module that needs @code{YYSTYPE}.
+@code{<@var{type}>} tag without using @code{%union}.  Therefore, if you are
+using a @code{%union} (@pxref{Multiple Types}) with components that require
+other definitions, or if you have defined a @code{YYSTYPE} macro or type
+definition (@pxref{Value Type}), you need to arrange for these definitions
+to be propagated to all modules, e.g., by putting them in a prerequisite
+header that is included both by your parser and by any other module that
+needs @code{YYSTYPE}.
 
 Unless your parser is pure, the parser header file declares
-@code{yylval} as an external variable.  @xref{Pure Decl, ,A Pure
-(Reentrant) Parser}.
+@code{yylval} as an external variable.  @xref{Pure Decl}.
 
 If you have also used locations, the parser header file declares
 @code{YYLTYPE} and @code{yylloc} using a protocol similar to that of the
@@ -5679,8 +5943,8 @@
 This parser header file is normally essential if you wish to put the
 definition of @code{yylex} in a separate source file, because
 @code{yylex} typically needs to be able to refer to the
-above-mentioned declarations and to the token type codes.  @xref{Token
-Values, ,Semantic Values of Tokens}.
+above-mentioned declarations and to the token kind codes.  @xref{Token
+Values}.
 
 @findex %code requires
 @findex %code provides
@@ -5691,12 +5955,11 @@
 @cindex Header guard
 The generated header is protected against multiple inclusions with a C
 preprocessor guard: @samp{YY_@var{PREFIX}_@var{FILE}_INCLUDED}, where
-@var{PREFIX} and @var{FILE} are the prefix (@pxref{Multiple Parsers,
-,Multiple Parsers in the Same Program}) and generated file name turned
-uppercase, with each series of non alphanumerical characters converted to a
-single underscore.
+@var{PREFIX} and @var{FILE} are the prefix (@pxref{Multiple Parsers}) and
+generated file name turned uppercase, with each series of non alphanumerical
+characters converted to a single underscore.
 
-For instance with @samp{%define api.prefix @{calc@}} and @samp{%defines
+For instance with @samp{%define api.prefix @{calc@}} and @samp{%header
 "lib/parse.h"}, the header will be guarded as follows.
 @example
 #ifndef YY_CALC_LIB_PARSE_H_INCLUDED
@@ -5704,38 +5967,30 @@
 ...
 #endif /* ! YY_CALC_LIB_PARSE_H_INCLUDED */
 @end example
+
+Introduced in Bison 3.8.
 @end deffn
 
-@deffn {Directive} %defines @var{defines-file}
-Same as above, but save in the file @file{@var{defines-file}}.
-@end deffn
-
-@deffn {Directive} %destructor
-Specify how the parser should reclaim the memory associated to
-discarded symbols.  @xref{Destructor Decl, , Freeing Discarded Symbols}.
-@end deffn
-
-@deffn {Directive} %file-prefix "@var{prefix}"
-Specify a prefix to use for all Bison output file names.  The names
-are chosen as if the grammar file were named @file{@var{prefix}.y}.
+@deffn {Directive} %header @var{header-file}
+Same as above, but save in the file @file{@var{header-file}}.
 @end deffn
 
 @deffn {Directive} %language "@var{language}"
 Specify the programming language for the generated parser.  Currently
-supported languages include C, C++, and Java.  @var{language} is
+supported languages include C, C++, D and Java.  @var{language} is
 case-insensitive.
 @end deffn
 
 @deffn {Directive} %locations
-Generate the code processing the locations (@pxref{Action Features, ,Special
-Features for Use in Actions}).  This mode is enabled as soon as the grammar
-uses the special @samp{@@@var{n}} tokens, but if your grammar does not use
-it, using @samp{%locations} allows for more accurate syntax error messages.
+Generate the code processing the locations (@pxref{Action Features}).  This
+mode is enabled as soon as the grammar uses the special @samp{@@@var{n}}
+tokens, but if your grammar does not use it, using @samp{%locations} allows
+for more accurate syntax error messages.
 @end deffn
 
 @deffn {Directive} %name-prefix "@var{prefix}"
 Obsoleted by @samp{%define api.prefix @{@var{prefix}@}}.  @xref{Multiple
-Parsers, ,Multiple Parsers in the Same Program}.  For C++ parsers, see the
+Parsers}.  For C++ parsers, see the
 @samp{%define api.namespace} documentation in this section.
 
 Rename the external symbols used in the parser so that they start with
@@ -5750,13 +6005,13 @@
 
 Contrary to defining @code{api.prefix}, some symbols are @emph{not} renamed
 by @code{%name-prefix}, for instance @code{YYDEBUG}, @code{YYTOKENTYPE},
-@code{yytokentype}, @code{YYSTYPE}, @code{YYLTYPE}.
+@code{yytoken_kind_t}, @code{YYSTYPE}, @code{YYLTYPE}.
 @end deffn
 
 @ifset defaultprec
 @deffn {Directive} %no-default-prec
 Do not assign a precedence to rules lacking an explicit @code{%prec}
-modifier (@pxref{Contextual Precedence, ,Context-Dependent Precedence}).
+modifier (@pxref{Contextual Precedence}).
 @end deffn
 @end ifset
 
@@ -5775,13 +6030,12 @@
 
 @deffn {Directive} %pure-parser
 Deprecated version of @samp{%define api.pure} (@pxref{%define
-Summary,,api.pure}), for which Bison is more careful to warn about
+Summary}), for which Bison is more careful to warn about
 unreasonable usage.
 @end deffn
 
 @deffn {Directive} %require "@var{version}"
-Require version @var{version} or higher of Bison.  @xref{Require Decl, ,
-Require a Version of Bison}.
+Require version @var{version} or higher of Bison.  @xref{Require Decl}.
 @end deffn
 
 @deffn {Directive} %skeleton "@var{file}"
@@ -5800,30 +6054,30 @@
 @end deffn
 
 @deffn {Directive} %token-table
-Generate an array of token names in the parser implementation file.
-The name of the array is @code{yytname}; @code{yytname[@var{i}]} is
-the name of the token whose internal Bison token code number is
-@var{i}.  The first three elements of @code{yytname} correspond to the
-predefined tokens @code{"$end"}, @code{"error"}, and
-@code{"$undefined"}; after these come the symbols defined in the
-grammar file.
+This feature is obsolescent, avoid it in new projects.
 
-The name in the table includes all the characters needed to represent
-the token in Bison.  For single-character literals and literal
-strings, this includes the surrounding quoting characters and any
-escape sequences.  For example, the Bison single-character literal
-@code{'+'} corresponds to a three-character name, represented in C as
-@code{"'+'"}; and the Bison two-character literal string @code{"\\/"}
-corresponds to a five-character name, represented in C as
-@code{"\"\\\\/\""}.
+Generate an array of token names in the parser implementation file.  The
+name of the array is @code{yytname}; @code{yytname[@var{i}]} is the name of
+the token whose internal Bison token code is @var{i}.  The first three
+elements of @code{yytname} correspond to the predefined tokens
+@code{"$end"}, @code{"error"}, and @code{"$undefined"}; after these come the
+symbols defined in the grammar file.
 
-When you specify @code{%token-table}, Bison also generates macro
-definitions for macros @code{YYNTOKENS}, @code{YYNNTS}, and
-@code{YYNRULES}, and @code{YYNSTATES}:
+The name in the table includes all the characters needed to represent the
+token in Bison.  For single-character literals and literal strings, this
+includes the surrounding quoting characters and any escape sequences.  For
+example, the Bison single-character literal @code{'+'} corresponds to a
+three-character name, represented in C as @code{"'+'"}; and the Bison
+two-character literal string @code{"\\/"} corresponds to a five-character
+name, represented in C as @code{"\"\\\\/\""}.
+
+When you specify @code{%token-table}, Bison also generates macro definitions
+for macros @code{YYNTOKENS}, @code{YYNNTS}, and @code{YYNRULES}, and
+@code{YYNSTATES}:
 
 @table @code
 @item YYNTOKENS
-The highest token number, plus one.
+The number of terminal symbols, i.e., the highest token code, plus one.
 @item YYNNTS
 The number of nonterminal symbols.
 @item YYNRULES
@@ -5831,17 +6085,45 @@
 @item YYNSTATES
 The number of parser states (@pxref{Parser States}).
 @end table
+
+Here's code for looking up a multicharacter token in @code{yytname},
+assuming that the characters of the token are stored in @code{token_buffer},
+and assuming that the token does not contain any characters like @samp{"}
+that require escaping.
+
+@example
+for (int i = 0; i < YYNTOKENS; i++)
+  if (yytname[i]
+      && yytname[i][0] == '"'
+      && ! strncmp (yytname[i] + 1, token_buffer,
+                    strlen (token_buffer))
+      && yytname[i][strlen (token_buffer) + 1] == '"'
+      && yytname[i][strlen (token_buffer) + 2] == 0)
+    break;
+@end example
+
+This method is discouraged: the primary purpose of string aliases is forging
+good error messages, not describing the spelling of keywords.  In addition,
+looking for the token kind at runtime incurs a (small but noticeable) cost.
+
+Finally, @code{%token-table} is incompatible with the @code{custom} and
+@code{detailed} values of the @code{parse.error} @code{%define} variable.
 @end deffn
 
 @deffn {Directive} %verbose
 Write an extra output file containing verbose descriptions of the parser
 states and what is done for each type of lookahead token in that state.
-@xref{Understanding, , Understanding Your Parser}, for more information.
+@xref{Understanding}, for more information.
 @end deffn
 
 @deffn {Directive} %yacc
-Pretend the option @option{--yacc} was given, i.e., imitate Yacc, including
-its naming conventions.  @xref{Tuning the Parser}, for more.
+Pretend the option @option{--yacc} was given
+(@pxref{option-yacc,,@option{--yacc}}), i.e., imitate Yacc, including its
+naming conventions.  Only makes sense with the @file{yacc.c}
+skeleton. @xref{Tuning the Parser}, for more.
+
+Of course, being a Bison extension, @code{%yacc} is somewhat
+self-contradictory@dots{}
 @end deffn
 
 
@@ -5890,49 +6172,88 @@
 
 What @var{variable}s are accepted, as well as their meanings and default
 values, depend on the selected target language and/or the parser skeleton
-(@pxref{Decl Summary,,%language}, @pxref{Decl Summary,,%skeleton}).
+(@pxref{Decl Summary}, @pxref{Decl Summary}).
 Unaccepted @var{variable}s produce an error.  Some of the accepted
 @var{variable}s are described below.
 
 
-@c ================================================== api.namespace
-@deffn Directive {%define api.namespace} @{@var{namespace}@}
-@itemize
-@item Languages(s): C++
+@c ================================================== api.filename.file
+@anchor{api-filename-type}
+@deffn {Directive} {%define api.filename.type} @{@var{type}@}
 
-@item Purpose: Specify the namespace for the parser class.
-For example, if you specify:
+@itemize @bullet
+@item Language(s): C++
 
-@example
-%define api.namespace @{foo::bar@}
-@end example
-
-Bison uses @code{foo::bar} verbatim in references such as:
-
-@example
-foo::bar::parser::semantic_type
-@end example
-
-However, to open a namespace, Bison removes any leading @code{::} and then
-splits on any remaining occurrences:
-
-@example
-namespace foo @{ namespace bar @{
-  class position;
-  class location;
-@} @}
-@end example
+@item Purpose:
+Define the type of file names in Bison's default location and position
+types. @xref{Exposing the Location Classes}.
 
 @item Accepted Values:
-Any absolute or relative C++ namespace reference without a trailing
-@code{"::"}.  For example, @code{"foo"} or @code{"::foo::bar"}.
+Any type that is printable (via streams) and comparable (with @code{==} and
+@code{!=}).
 
-@item Default Value:
-@code{yy}, unless you used the obsolete @samp{%name-prefix "@var{prefix}"}
-directive.
+@item Default Value: @code{const std::string}.
+
+@item History:
+Introduced in Bison 2.0 as @code{filename_type} (with @code{std::string} as
+default), renamed as @code{api.filename.type} in Bison 3.7 (with @code{const
+std::string} as default).
 @end itemize
 @end deffn
-@c api.namespace
+
+
+@c ================================================== api.header.include
+@deffn Directive {%define api.header.include} @{"header.h"@}
+@deffnx Directive {%define api.header.include} @{<header.h>@}
+@itemize
+@item Languages(s): C (@file{yacc.c})
+
+@item Purpose: Specify how the generated parser should include the generated header.
+
+Historically, when option @option{-d} or @option{--header} was used,
+@command{bison} generated a header and pasted an exact copy of it into the
+generated parser implementation file.  Since Bison 3.6, it is
+@code{#include}d as @samp{"@var{basename}.h"}, instead of duplicated, unless
+@var{file} is @samp{y.tab}, see below.
+
+The @code{api.header.include} variable allows to control how the generated
+parser @code{#include}s the generated header.  For instance:
+
+@example
+%define api.header.include @{"parse.h"@}
+@end example
+
+@noindent
+or
+
+@example
+%define api.header.include @{<parser/parse.h>@}
+@end example
+
+Using @code{api.header.include} does not change the name of the generated
+header, only how it is included.
+
+To work around limitations of Automake's @command{ylwrap} (which runs
+@command{bison} with @option{--yacc}), @code{api.header.include} is
+@emph{not} predefined when the output file is @file{y.tab.c}.  Define it to
+avoid the duplication.
+
+@item Accepted Values:
+An argument for @code{#include}.
+
+@item Default Value:
+@samp{"@var{header-basename}"}, unless the header file is @file{y.tab.h},
+where @var{header-basename} is the name of the generated header, without
+directory part.  For instance with @samp{bison -d calc/parse.y},
+@code{api.header.include} defaults to @samp{"parse.h"}, not
+@samp{"calc/parse.h"}.
+
+@item History:
+Introduced in Bison 3.4.  Defaults to @samp{"@var{basename}.h"} since Bison
+3.7, unless the header file is @file{y.tab.h}.
+@end itemize
+@end deffn
+@c api.header.include
 
 
 @c ================================================== api.location.file
@@ -5950,7 +6271,7 @@
 @table @asis
 @item @code{none}
 If locations are enabled, generate the definition of the @code{position} and
-@code{location} classes in the header file if @code{%defines}, otherwise in
+@code{location} classes in the header file if @code{%header}, otherwise in
 the parser implementation.
 
 @item "@var{file}"
@@ -6004,23 +6325,64 @@
 @item Language(s): C, C++, Java
 
 @item Purpose: Define the location type.
-@xref{User Defined Location Type}.
+@xref{Location Type}, and @ref{User Defined Location Type}.
 
 @item Accepted Values: String
 
 @item Default Value: none
 
 @item History:
-Introduced in Bison 2.7 for C++ and Java, in Bison 3.4 for C.
+Introduced in Bison 2.7 for C++ and Java, in Bison 3.4 for C.  Was
+originally named @code{location_type} in Bison 2.5 and 2.6.
 @end itemize
 @end deffn
 
 
+@c ================================================== api.namespace
+@deffn Directive {%define api.namespace} @{@var{namespace}@}
+@itemize
+@item Languages(s): C++
+
+@item Purpose: Specify the namespace for the parser class.
+For example, if you specify:
+
+@example
+%define api.namespace @{foo::bar@}
+@end example
+
+Bison uses @code{foo::bar} verbatim in references such as:
+
+@example
+foo::bar::parser::value_type
+@end example
+
+However, to open a namespace, Bison removes any leading @code{::} and then
+splits on any remaining occurrences:
+
+@example
+namespace foo @{ namespace bar @{
+  class position;
+  class location;
+@} @}
+@end example
+
+@item Accepted Values:
+Any absolute or relative C++ namespace reference without a trailing
+@code{"::"}.  For example, @code{"foo"} or @code{"::foo::bar"}.
+
+@item Default Value:
+@code{yy}, unless you used the obsolete @samp{%name-prefix "@var{prefix}"}
+directive.
+@end itemize
+@end deffn
+@c api.namespace
+
+
 @c ================================================== api.parser.class
 @deffn Directive {%define api.parser.class} @{@var{name}@}
 @itemize @bullet
 @item Language(s):
-C++, Java
+C++, Java, D
 
 @item Purpose:
 The name of the parser class.
@@ -6029,7 +6391,7 @@
 Any valid identifier.
 
 @item Default Value:
-In C++, @code{parser}.  In Java, @code{YYParser} or
+In C++, @code{parser}.  In D and Java, @code{YYParser} or
 @code{@var{api.prefix}Parser} (@pxref{Java Bison Interface}).
 
 @item History:
@@ -6043,16 +6405,19 @@
 @deffn {Directive} {%define api.prefix} @{@var{prefix}@}
 
 @itemize @bullet
-@item Language(s): All
+@item Language(s): C, C++, Java
 
 @item Purpose: Rename exported symbols.
-@xref{Multiple Parsers, ,Multiple Parsers in the Same Program}.
+@xref{Multiple Parsers}.
 
 @item Accepted Values: String
 
 @item Default Value: @code{YY} for Java, @code{yy} otherwise.
 
-@item History: introduced in Bison 2.6
+@item History:
+introduced in Bison 2.6, with its argument in double quotes.  Uses braces
+since Bison 3.0 (double quotes are still supported for backward
+compatibility).
 @end itemize
 @end deffn
 
@@ -6064,7 +6429,7 @@
 @item Language(s): C
 
 @item Purpose: Request a pure (reentrant) parser program.
-@xref{Pure Decl, ,A Pure (Reentrant) Parser}.
+@xref{Pure Decl}.
 
 @item Accepted Values: @code{true}, @code{false}, @code{full}
 
@@ -6095,8 +6460,7 @@
 void yyerror (YYLTYPE *llocp, int *nastiness, char const *msg);
 @end example
 
-(@pxref{Error Reporting, ,The Error
-Reporting Function @code{yyerror}})
+(@pxref{Error Reporting Function})
 
 @item Default Value: @code{false}
 
@@ -6112,10 +6476,10 @@
 @deffn Directive {%define api.push-pull} @var{kind}
 
 @itemize @bullet
-@item Language(s): C (deterministic parsers only)
+@item Language(s): C (deterministic parsers only), D, Java
 
 @item Purpose: Request a pull parser, a push parser, or both.
-@xref{Push Decl, ,A Push Parser}.
+@xref{Push Decl}.
 
 @item Accepted Values: @code{pull}, @code{push}, @code{both}
 
@@ -6126,17 +6490,83 @@
 
 
 
+@c ================================================== api.symbol.prefix
+@deffn Directive {%define api.symbol.prefix} @{@var{prefix}@}
+
+@itemize
+@item Languages(s): all
+
+@item Purpose:
+Add a prefix to the name of the symbol kinds.  For instance
+
+@example
+%define api.symbol.prefix @{S_@}
+%token FILE for ERROR
+%%
+start: FILE for ERROR;
+@end example
+
+@noindent
+generates this definition in C:
+
+@example
+/* Symbol kind.  */
+enum yysymbol_kind_t
+@{
+  S_YYEMPTY = -2,   /* No symbol.  */
+  S_YYEOF = 0,      /* $end  */
+  S_YYERROR = 1,    /* error  */
+  S_YYUNDEF = 2,    /* $undefined  */
+  S_FILE = 3,       /* FILE  */
+  S_for = 4,        /* for  */
+  S_ERROR = 5,      /* ERROR  */
+  S_YYACCEPT = 6,   /* $accept  */
+  S_start = 7       /* start  */
+@};
+@end example
+
+@item Accepted Values:
+Any non empty string.  Must be a valid identifier in the target language
+(typically a non empty sequence of letters, underscores, and ---not at the
+beginning--- digits).
+
+The empty prefix is (generally) invalid:
+@itemize
+@item
+in C it would create collision with the @code{YYERROR} macro, and
+potentially token kind definitions and symbol kind definitions would
+collide;
+@item
+unnamed symbols (such as @samp{'+'}) have a name which starts with a digit;
+@item
+even in languages with scoped enumerations such as Java, an empty prefix is
+dangerous: symbol names may collide with the target language keywords, or
+with other members of the @code{SymbolKind} class.
+@end itemize
+
+
+@item Default Value:
+@code{YYSYMBOL_} in C, @code{S_} in C++ and Java, empty in D.
+@item History:
+introduced in Bison 3.6.
+@end itemize
+@end deffn
+@c api.symbol.prefix
+
+
 @c ================================================== api.token.constructor
 @deffn Directive {%define api.token.constructor}
 
 @itemize @bullet
 @item Language(s):
-C++
+C++, D
 
 @item Purpose:
-When variant-based semantic values are enabled (@pxref{C++ Variants}),
-request that symbols be handled as a whole (type, value, and possibly
-location) in the scanner.  @xref{Complete Symbols}, for details.
+Request that symbols be handled as a whole (type, value, and possibly
+location) in the scanner. In the case of C++, it works only when
+variant-based semantic values are enabled (@pxref{C++ Variants}), see
+@ref{Complete Symbols}, for details. In D, token constructors work with both
+@samp{%union} and @samp{%define api.value.type union}.
 
 @item Accepted Values:
 Boolean.
@@ -6144,15 +6574,15 @@
 @item Default Value:
 @code{false}
 @item History:
-introduced in Bison 3.0
+introduced in Bison 3.0.
 @end itemize
 @end deffn
 @c api.token.constructor
 
 
 @c ================================================== api.token.prefix
+@anchor{api-token-prefix}
 @deffn Directive {%define api.token.prefix} @{@var{prefix}@}
-
 @itemize
 @item Languages(s): all
 
@@ -6161,8 +6591,8 @@
 target language.  For instance
 
 @example
-%token FILE for ERROR
 %define api.token.prefix @{TOK_@}
+%token FILE for ERROR
 %%
 start: FILE for ERROR;
 @end example
@@ -6176,20 +6606,20 @@
 modified by this prefix.
 
 Bison also prefixes the generated member names of the semantic value union.
-@xref{Type Generation,, Generating the Semantic Value Type}, for more
+@xref{Type Generation}, for more
 details.
 
 See @ref{Calc++ Parser} and @ref{Calc++ Scanner}, for a complete example.
 
 @item Accepted Values:
-Any string.  Should be a valid identifier prefix in the target language,
-in other words, it should typically be an identifier itself (sequence of
-letters, underscores, and ---not at the beginning--- digits).
+Any string.  Must be a valid identifier prefix in the target language
+(typically, a possibly empty sequence of letters, underscores, and ---not at
+the beginning--- digits).
 
 @item Default Value:
 empty
 @item History:
-introduced in Bison 3.0
+introduced in Bison 3.0.
 @end itemize
 @end deffn
 @c api.token.prefix
@@ -6203,18 +6633,19 @@
 all
 
 @item Purpose:
-The output files normally define the tokens with Yacc-compatible token
-numbers: sequential numbers starting at 257 except for single character
-tokens which stand for themselves (e.g., in ASCII, @samp{'a'} is numbered
-65).  The parser however uses symbol numbers assigned sequentially starting
-at 3.  Therefore each time the scanner returns an (external) token number,
-it must be mapped to the (internal) symbol number.
+The output files normally define the enumeration of the @emph{token kinds}
+with Yacc-compatible token codes: sequential numbers starting at 257 except
+for single character tokens which stand for themselves (e.g., in ASCII,
+@samp{'a'} is numbered 65).  The parser however uses @emph{symbol kinds}
+which are assigned numbers sequentially starting at 0.  Therefore each time
+the scanner returns an (external) token kind, it must be mapped to the
+(internal) symbol kind.
 
-When @code{api.token.raw} is set, tokens are assigned their internal number,
-which saves one table lookup per token to map them from the external to the
-internal number, and also saves the generation of the mapping table.  The
-gain is typically moderate, but in extreme cases (very simple user actions),
-a 10% improvement can be observed.
+When @code{api.token.raw} is set, the code of the token kinds are forced to
+coincide with the symbol kind.  This saves one table lookup per token to map
+them from the token kind to the symbol kind, and also saves the generation
+of the mapping table.  The gain is typically moderate, but in extreme cases
+(very simple user actions), a 10% improvement can be observed.
 
 When @code{api.token.raw} is set, the grammar cannot use character literals
 (such as @samp{'a'}).
@@ -6222,7 +6653,7 @@
 @item Accepted Values: Boolean.
 
 @item Default Value:
-@code{false}
+@code{true} in D, @code{false} otherwise
 @item History:
 introduced in Bison 3.5.  Was initially introduced in Bison 1.25 as
 @samp{%raw}, but never worked and was removed in Bison 1.29.
@@ -6306,10 +6737,10 @@
 @item @samp{@{@}}
 This grammar has no semantic value at all.  This is not properly supported
 yet.
-@item @samp{union-directive} (C, C++)
+@item @samp{union-directive} (C, C++, D)
 The type is defined thanks to the @code{%union} directive.  You don't have
 to define @code{api.value.type} in that case, using @code{%union} suffices.
-@xref{Union Decl, ,The Union Declaration}.
+@xref{Union Decl}.
 For instance:
 @example
 %define api.value.type union-directive
@@ -6407,13 +6838,7 @@
 Introduced in Bison 3.0.3.
 @end itemize
 @end deffn
-@c api.value.type
-
-
-@c ================================================== location_type
-@deffn Directive {%define location_type}
-Obsoleted by @code{api.location.type} since Bison 2.7.
-@end deffn
+@c api.value.union.name
 
 
 @c ================================================== lr.default-reduction
@@ -6493,7 +6918,10 @@
 checked when this option is enabled.
 
 In C++, when variants are used (@pxref{C++ Variants}), symbols must be
-constructed and destroyed properly.  This option checks these constraints.
+constructed and destroyed properly.  This option checks these constraints
+using runtime type information (RTTI).  Therefore the generated code cannot
+be compiled with RTTI disabled (via compiler options such as
+@option{-fno-rtti}).
 
 @item Accepted Values: Boolean
 
@@ -6509,22 +6937,40 @@
 @item Languages(s):
 all
 @item Purpose:
-Control the kind of error messages passed to the error reporting
-function.  @xref{Error Reporting, ,The Error Reporting Function
-@code{yyerror}}.
+Control the generation of syntax error messages.  @xref{Error Reporting}.
 @item Accepted Values:
 @itemize
 @item @code{simple}
 Error messages passed to @code{yyerror} are simply @w{@code{"syntax
 error"}}.
+
+@item @code{detailed}
+Error messages report the unexpected token, and possibly the expected ones.
+However, this report can often be incorrect when LAC is not enabled
+(@pxref{LAC}).  Token name internationalization is supported.
+
 @item @code{verbose}
+Similar (but inferior) to @code{detailed}. The D parser does not support this value.
+
 Error messages report the unexpected token, and possibly the expected ones.
 However, this report can often be incorrect when LAC is not enabled
 (@pxref{LAC}).
+
+Does not support token internationalization.  Using non-ASCII characters in
+token aliases is not portable.
+
+@item @code{custom}
+The user is in charge of generating the syntax error message by defining the
+@code{yyreport_syntax_error} function.  @xref{Syntax Error Reporting
+Function}.
 @end itemize
 
 @item Default Value:
 @code{simple}
+
+@item History:
+introduced in 3.0 with support for @code{simple} and @code{verbose}.  Values
+@code{custom} and @code{detailed} were introduced in 3.6.
 @end itemize
 @end deffn
 @c parse.error
@@ -6534,7 +6980,7 @@
 @deffn Directive {%define parse.lac} @var{when}
 
 @itemize
-@item Languages(s): C (deterministic parsers only)
+@item Languages(s): C/C++ (deterministic parsers only), D and Java.
 
 @item Purpose: Enable LAC (lookahead correction) to improve
 syntax error handling.  @xref{LAC}.
@@ -6549,15 +6995,14 @@
 @deffn Directive {%define parse.trace}
 
 @itemize
-@item Languages(s): C, C++, Java
+@item Languages(s): C, C++, D, Java
 
 @item Purpose: Require parser instrumentation for tracing.
-@xref{Tracing, ,Tracing Your Parser}.
+@xref{Tracing}.
 
 In C/C++, define the macro @code{YYDEBUG} (or @code{@var{prefix}DEBUG} with
-@samp{%define api.prefix @{@var{prefix}@}}), see @ref{Multiple Parsers,
-,Multiple Parsers in the Same Program}) to 1 in the parser implementation
-file if it is not already defined, so that the debugging facilities are
+@samp{%define api.prefix @{@var{prefix}@}}), see @ref{Multiple Parsers}) to
+1 (if it is not already defined) so that the debugging facilities are
 compiled.
 
 @item Accepted Values: Boolean
@@ -6602,7 +7047,7 @@
 after the usual contents of the parser header file.  Thus, the
 unqualified form replaces @code{%@{@var{code}%@}} for most purposes.
 
-For Java, the default location is inside the parser class.
+For D and Java, the default location is inside the parser class.
 @end deffn
 
 @deffn {Directive} %code @var{qualifier} @{@var{code}@}
@@ -6629,16 +7074,19 @@
 @itemize @bullet
 @item Language(s): C, C++
 
-@item Purpose: This is the best place to write dependency code required for
-@code{YYSTYPE} and @code{YYLTYPE}.  In other words, it's the best place to
-define types referenced in @code{%union} directives.  If you use
-@code{#define} to override Bison's default @code{YYSTYPE} and @code{YYLTYPE}
-definitions, then it is also the best place.  However you should rather
-@code{%define} @code{api.value.type} and @code{api.location.type}.
+@item Purpose:
+This is the best place to write dependency code required for the value and
+location types (@code{YYSTYPE} and @code{YYLTYPE} in C).  In other words,
+it's the best place to define types referenced in @code{%union} directives.
+In C, if you use @code{#define} to override Bison's default @code{YYSTYPE}
+and @code{YYLTYPE} definitions, then it is also the best place.  However you
+should rather @code{%define} @code{api.value.type} and
+@code{api.location.type}.
 
-@item Location(s): The parser header file and the parser implementation file
-before the Bison-generated @code{YYSTYPE} and @code{YYLTYPE}
-definitions.
+@item Location(s):
+The parser header file and the parser implementation file before the
+Bison-generated definitions of the value and location types (@code{YYSTYPE}
+and @code{YYLTYPE} in C).
 @end itemize
 
 @item provides
@@ -6650,9 +7098,10 @@
 @item Purpose: This is the best place to write additional definitions and
 declarations that should be provided to other modules.
 
-@item Location(s): The parser header file and the parser implementation
-file after the Bison-generated @code{YYSTYPE}, @code{YYLTYPE}, and
-token definitions.
+@item Location(s):
+The parser header file and the parser implementation file after the
+Bison-generated value and location types (@code{YYSTYPE} and @code{YYLTYPE}
+in C), and token definitions.
 @end itemize
 
 @item top
@@ -6680,12 +7129,13 @@
 @findex %code imports
 
 @itemize @bullet
-@item Language(s): Java
+@item Language(s): D, Java
 
-@item Purpose: This is the best place to write Java import directives.
+@item Purpose: This is the best place to write Java import directives. D syntax
+allows for import statements all throughout the code.
 
 @item Location(s): The parser Java file after any Java package directive and
-before any class definitions.
+before any class definitions. The parser D file before any class definitions.
 @end itemize
 @end table
 
@@ -6710,8 +7160,8 @@
 @code{api.prefix}.  With different @code{api.prefix}s it is guaranteed that
 headers do not conflict when included together, and that compiled objects
 can be linked together too.  Specifying @samp{%define api.prefix
-@{@var{prefix}@}} (or passing the option @samp{-Dapi.prefix=@{@var{prefix}@}}, see
-@ref{Invocation, ,Invoking Bison}) renames the interface functions and
+@{@var{prefix}@}} (or passing the option @option{-Dapi.prefix=@{@var{prefix}@}}, see
+@ref{Invocation}) renames the interface functions and
 variables of the Bison parser to start with @var{prefix} instead of
 @samp{yy}, and all the macros to start by @var{PREFIX} (i.e., @var{prefix}
 upper-cased) instead of @samp{YY}.
@@ -6801,8 +7251,8 @@
 @sp 2
 
 Prior to Bison 2.6, a feature similar to @code{api.prefix} was provided by
-the obsolete directive @code{%name-prefix} (@pxref{Table of Symbols, ,Bison
-Symbols}) and the option @option{--name-prefix} (@pxref{Output Files}).
+the obsolete directive @code{%name-prefix} (@pxref{Table of Symbols}) and
+the option @option{--name-prefix} (@pxref{Output Files}).
 
 @node Interface
 @chapter Parser C-Language Interface
@@ -6820,13 +7270,10 @@
 
 @menu
 * Parser Function::         How to call @code{yyparse} and what it returns.
-* Push Parser Function::    How to call @code{yypush_parse} and what it returns.
-* Pull Parser Function::    How to call @code{yypull_parse} and what it returns.
-* Parser Create Function::  How to call @code{yypstate_new} and what it returns.
-* Parser Delete Function::  How to call @code{yypstate_delete} and what it returns.
+* Push Parser Interface::   How to create, use, and destroy push parsers.
 * Lexical::                 You must supply a function @code{yylex}
                               which reads tokens.
-* Error Reporting::         You must supply a function @code{yyerror}.
+* Error Reporting::         Passing error messages to the user.
 * Action Features::         Special features for use in actions.
 * Internationalization::    How to let the parser speak in the user's
                               native language.
@@ -6867,6 +7314,11 @@
 Return immediately with value 1 (to report failure).
 @end defmac
 
+@defmac YYNOMEM
+@findex YYNOMEM
+Return immediately with value 2 (to report memory exhaustion).
+@end defmac
+
 If you use a reentrant parser, you can optionally pass additional
 parameter information to it in a reentrant way.  To do so, use the
 declaration @code{%parse-param}:
@@ -6926,20 +7378,48 @@
 int  yyparse (int *randomness);
 @end example
 
-@node Push Parser Function
-@section The Push Parser Function @code{yypush_parse}
-@findex yypush_parse
+@node Push Parser Interface
+@section Push Parser Interface
 
-You call the function @code{yypush_parse} to parse a single token.  This
+@findex yypstate_new
+You call the function @code{yypstate_new} to create a new parser instance.
+This function is available if either the @samp{%define api.push-pull push}
+or @samp{%define api.push-pull both} declaration is used.  @xref{Push Decl}.
+
+@anchor{yypstate_new}
+@deftypefun {yypstate*} yypstate_new (@code{void})
+Return a valid parser instance if there is memory available, 0 otherwise.
+In impure mode, it will also return 0 if a parser instance is currently
+allocated.
+@end deftypefun
+
+@findex yypstate_delete
+You call the function @code{yypstate_delete} to delete a parser instance.
 function is available if either the @samp{%define api.push-pull push} or
 @samp{%define api.push-pull both} declaration is used.
-@xref{Push Decl, ,A Push Parser}.
+@xref{Push Decl}.
 
+@anchor{yypstate_delete}
+@deftypefun void yypstate_delete (@code{yypstate *}@var{yyps})
+Reclaim the memory associated with a parser instance.  After this call, you
+should no longer attempt to use the parser instance.
+@end deftypefun
+
+@findex yypush_parse
+You call the function @code{yypush_parse} to parse a single token.  This
+function is available if either the @samp{%define api.push-pull push} or
+@samp{%define api.push-pull both} declaration is used.  @xref{Push Decl}.
+
+@anchor{yypush_parse}
 @deftypefun int yypush_parse (@code{yypstate *}@var{yyps})
 The value returned by @code{yypush_parse} is the same as for @code{yyparse}
 with the following exception: it returns @code{YYPUSH_MORE} if more input is
 required to finish parsing the grammar.
 
+After @code{yypush_parse} returned, the instance may be consulted.  For
+instance check @code{yynerrs} to see whether there were (possibly recovered)
+syntax errors.
+
 After @code{yypush_parse} returns a status other than @code{YYPUSH_MORE},
 the parser instance @code{yyps} may be reused for a new parse.
 @end deftypefun
@@ -6949,50 +7429,35 @@
 as an expression can just keep reusing the same @code{yyps} even if an input
 was invalid.
 
-@node Pull Parser Function
-@section The Pull Parser Function @code{yypull_parse}
-@findex yypull_parse
-
 You call the function @code{yypull_parse} to parse the rest of the input
 stream.  This function is available if the @samp{%define api.push-pull both}
-declaration is used.
-@xref{Push Decl, ,A Push Parser}.
+declaration is used.  @xref{Push Decl}.
 
+@anchor{yypull_parse}
 @deftypefun int yypull_parse (@code{yypstate *}@var{yyps})
 The value returned by @code{yypull_parse} is the same as for @code{yyparse}.
 
 The parser instance @code{yyps} may be reused for new parses.
 @end deftypefun
 
-@node Parser Create Function
-@section The Parser Create Function @code{yystate_new}
-@findex yypstate_new
+@deftypefun int yypstate_expected_tokens (@code{const yypstate *}yyps, @code{yysymbol_kind_t} @var{argv}@code{[]}, @code{int} @var{argc})
+Fill @var{argv} with the expected tokens, which never includes
+@code{YYSYMBOL_YYEMPTY}, @code{YYSYMBOL_YYerror}, or
+@code{YYSYMBOL_YYUNDEF}.
 
-You call the function @code{yypstate_new} to create a new parser instance.
-This function is available if either the @samp{%define api.push-pull push} or
-@samp{%define api.push-pull both} declaration is used.
-@xref{Push Decl, ,A Push Parser}.
+Never put more than @var{argc} elements into @var{argv}, and on success
+return the number of tokens stored in @var{argv}.  If there are more
+expected tokens than @var{argc}, fill @var{argv} up to @var{argc} and return
+0.  If there are no expected tokens, also return 0, but set @code{argv[0]}
+to @code{YYSYMBOL_YYEMPTY}.
 
-@deftypefun {yypstate*} yypstate_new (@code{void})
-The function will return a valid parser instance if there was memory available
-or 0 if no memory was available.
-In impure mode, it will also return 0 if a parser instance is currently
-allocated.
+When LAC is enabled, may return a negative number on errors,
+such as @code{YYENOMEM} on memory exhaustion.
+
+If @var{argv} is null, return the size needed to store all the possible
+values, which is always less than @code{YYNTOKENS}.
 @end deftypefun
 
-@node Parser Delete Function
-@section The Parser Delete Function @code{yystate_delete}
-@findex yypstate_delete
-
-You call the function @code{yypstate_delete} to delete a parser instance.
-function is available if either the @samp{%define api.push-pull push} or
-@samp{%define api.push-pull both} declaration is used.
-@xref{Push Decl, ,A Push Parser}.
-
-@deftypefun void yypstate_delete (@code{yypstate *}@var{yyps})
-This function will reclaim the memory associated with a parser instance.
-After this call, you should no longer attempt to use the parser instance.
-@end deftypefun
 
 @node Lexical
 @section The Lexical Analyzer Function @code{yylex}
@@ -7004,41 +7469,42 @@
 this function automatically; you must write it so that @code{yyparse} can
 call it.  The function is sometimes referred to as a lexical scanner.
 
-In simple programs, @code{yylex} is often defined at the end of the
-Bison grammar file.  If @code{yylex} is defined in a separate source
-file, you need to arrange for the token-type macro definitions to be
-available there.  To do this, use the @samp{-d} option when you run
-Bison, so that it will write these macro definitions into the separate
-parser header file, @file{@var{name}.tab.h}, which you can include in
-the other source files that need it.  @xref{Invocation, ,Invoking
-Bison}.
+In simple programs, @code{yylex} is often defined at the end of the Bison
+grammar file.  If @code{yylex} is defined in a separate source file, you
+need to arrange for the token-kind definitions to be available there.  To do
+this, use the @option{-d} option when you run Bison, so that it will write
+these definitions into the separate parser header file,
+@file{@var{name}.tab.h}, which you can include in the other source files
+that need it.  @xref{Invocation}.
 
 @menu
 * Calling Convention::  How @code{yyparse} calls @code{yylex}.
-* Tokens from Literals:: Finding token types from string aliases.
+* Special Tokens::      Signaling end-of-file and errors to the parser.
+* Tokens from Literals:: Finding token kinds from string aliases.
 * Token Values::        How @code{yylex} must return the semantic value
                           of the token it has read.
 * Token Locations::     How @code{yylex} must return the text location
                           (line number, etc.) of the token, if the
                           actions want that.
 * Pure Calling::        How the calling convention differs in a pure parser
-                          (@pxref{Pure Decl, ,A Pure (Reentrant) Parser}).
+                          (@pxref{Pure Decl}).
 @end menu
 
 @node Calling Convention
 @subsection Calling Convention for @code{yylex}
 
 The value that @code{yylex} returns must be the positive numeric code for
-the type of token it has just found; a zero or negative value signifies
+the kind of token it has just found; a zero or negative value signifies
 end-of-input.
 
-When a token is referred to in the grammar rules by a name, that name in the
-parser implementation file becomes a C macro whose definition is the proper
-numeric code for that token type.  So @code{yylex} can use the name to
-indicate that type.  @xref{Symbols}.
+When a token kind is referred to in the grammar rules by a name, that name
+in the parser implementation file becomes an enumerator of the enum
+@code{yytoken_kind_t} whose definition is the proper numeric code for that
+token kind.  So @code{yylex} should use the name to indicate that type.
+@xref{Symbols}.
 
 When a token is referred to in the grammar rules by a character literal, the
-numeric code for that character is also the code for the token type.  So
+numeric code for that character is also the code for the token kind.  So
 @code{yylex} can simply return that character code, possibly converted to
 @code{unsigned char} to avoid sign-extension.  The null character must not
 be used this way, because its code is zero and that signifies end-of-input.
@@ -7051,12 +7517,13 @@
 @{
   @dots{}
   if (c == EOF)    /* Detect end-of-input. */
-    return 0;
+    return YYEOF;
   @dots{}
-  if (c == '+' || c == '-')
-    return c;      /* Assume token type for '+' is '+'. */
+  else if (c == '+' || c == '-')
+    return c;      /* Assume token kind for '+' is '+'. */
   @dots{}
-  return INT;      /* Return the type of the token. */
+  else
+    return INT;    /* Return the kind of the token. */
   @dots{}
 @}
 @end example
@@ -7066,11 +7533,54 @@
 utility can be used without change as the definition of @code{yylex}.
 
 
+@node Special Tokens
+@subsection Special Tokens
+
+In addition to the user defined tokens, Bison generates a few special tokens
+that @code{yylex} may return.
+
+The @code{YYEOF} token denotes the end of file, and signals to the parser
+that there is nothing left afterwards.  @xref{Calling Convention}, for an
+example.
+
+Returning @code{YYUNDEF} tells the parser that some lexical error was found.
+It will emit an error message about an ``invalid token'', and enter
+error-recovery (@pxref{Error Recovery}).  Returning an unknown token kind
+results in the exact same behavior.
+
+Returning @code{YYerror} requires the parser to enter error-recovery
+@emph{without} emitting an error message.  This way the lexical analyzer can
+produce an accurate error messages about the invalid input (something the
+parser cannot do), and yet benefit from the error-recovery features of the
+parser.
+
+@example
+int
+yylex (void)
+@{
+  @dots{}
+  switch (c)
+    @{
+      @dots{}
+      case '0': case '1': case '2': case '3': case '4':
+      case '5': case '6': case '7': case '8': case '9':
+        @dots{}
+        return TOK_NUM;
+      @dots{}
+      case EOF:
+        return YYEOF;
+      default:
+        yyerror ("syntax error: invalid character: %c", c);
+        return YYerror;
+    @}
+@}
+@end example
+
 @node Tokens from Literals
 @subsection Finding Tokens by String Literals
 
 If the grammar uses literal string tokens, there are two ways that
-@code{yylex} can determine the token type codes for them:
+@code{yylex} can determine the token kind codes for them:
 
 @itemize @bullet
 @item
@@ -7085,32 +7595,9 @@
 @code{yylex} can search for the multicharacter token in the @code{yytname}
 table.  This method is discouraged: the primary purpose of string aliases is
 forging good error messages, not describing the spelling of keywords.  In
-addition, looking for the token type at runtime incurs a (small but
+addition, looking for the token kind at runtime incurs a (small but
 noticeable) cost.
 
-The index of the token in the table is the token type's code.  The name of a
-multicharacter token is recorded in @code{yytname} with a double-quote, the
-token's characters, and another double-quote.  The token's characters are
-escaped as necessary to be suitable as input to Bison.
-
-Here's code for looking up a multicharacter token in @code{yytname},
-assuming that the characters of the token are stored in @code{token_buffer},
-and assuming that the token does not contain any characters like @samp{"}
-that require escaping.
-
-@example
-for (int i = 0; i < YYNTOKENS; i++)
-  @{
-    if (yytname[i]
-        && yytname[i][0] == '"'
-        && ! strncmp (yytname[i] + 1, token_buffer,
-                      strlen (token_buffer))
-        && yytname[i][strlen (token_buffer) + 1] == '"'
-        && yytname[i][strlen (token_buffer) + 2] == 0)
-      break;
-  @}
-@end example
-
 The @code{yytname} table is generated only if you use the
 @code{%token-table} declaration.  @xref{Decl Summary}.
 @end itemize
@@ -7121,25 +7608,23 @@
 
 @vindex yylval
 In an ordinary (nonreentrant) parser, the semantic value of the token must
-be stored into the global variable @code{yylval}.  When you are using
-just one data type for semantic values, @code{yylval} has that type.
-Thus, if the type is @code{int} (the default), you might write this in
-@code{yylex}:
+be stored into the global variable @code{yylval}.  When you are using just
+one data type for semantic values, @code{yylval} has that type.  Thus, if
+the type is @code{int} (the default), you might write this in @code{yylex}:
 
 @example
 @group
   @dots{}
   yylval = value;  /* Put value onto Bison stack. */
-  return INT;      /* Return the type of the token. */
+  return INT;      /* Return the kind of the token. */
   @dots{}
 @end group
 @end example
 
-When you are using multiple data types, @code{yylval}'s type is a union
-made from the @code{%union} declaration (@pxref{Union Decl, ,The
-Union Declaration}).  So when you store a token's value, you
-must use the proper member of the union.  If the @code{%union}
-declaration looks like this:
+When you are using multiple data types, @code{yylval}'s type is a union made
+from the @code{%union} declaration (@pxref{Union Decl}).  So when you store
+a token's value, you must use the proper member of the union.  If the
+@code{%union} declaration looks like this:
 
 @example
 @group
@@ -7158,7 +7643,7 @@
 @group
   @dots{}
   yylval.intval = value; /* Put value onto Bison stack. */
-  return INT;            /* Return the type of the token. */
+  return INT;            /* Return the kind of the token. */
   @dots{}
 @end group
 @end example
@@ -7187,12 +7672,11 @@
 @subsection Calling Conventions for Pure Parsers
 
 When you use the Bison declaration @code{%define api.pure full} to request a
-pure, reentrant parser, the global communication variables @code{yylval}
-and @code{yylloc} cannot be used.  (@xref{Pure Decl, ,A Pure (Reentrant)
-Parser}.)  In such parsers the two global variables are replaced by
-pointers passed as arguments to @code{yylex}.  You must declare them as
-shown here, and pass the information back by storing it through those
-pointers.
+pure, reentrant parser, the global communication variables @code{yylval} and
+@code{yylloc} cannot be used.  (@xref{Pure Decl}.)  In such parsers the two
+global variables are replaced by pointers passed as arguments to
+@code{yylex}.  You must declare them as shown here, and pass the information
+back by storing it through those pointers.
 
 @example
 int
@@ -7200,7 +7684,7 @@
 @{
   @dots{}
   *lvalp = value;  /* Put value onto Bison stack. */
-  return INT;      /* Return the type of the token. */
+  return INT;      /* Return the kind of the token. */
   @dots{}
 @}
 @end example
@@ -7265,8 +7749,21 @@
 int yyparse (parser_mode *mode, environment_type *env);
 @end example
 
+
 @node Error Reporting
-@section The Error Reporting Function @code{yyerror}
+@section Error Reporting
+
+During its execution the parser may have error messages to pass to the user,
+such as syntax error, or memory exhaustion.  How this message is delivered
+to the user must be specified by the developer.
+
+@menu
+* Error Reporting Function::         You must supply a @code{yyerror} function.
+* Syntax Error Reporting Function::  You can supply a @code{yyreport_syntax_error} function.
+@end menu
+
+@node Error Reporting Function
+@subsection The Error Reporting Function @code{yyerror}
 @cindex error reporting function
 @findex yyerror
 @cindex parse error
@@ -7275,8 +7772,7 @@
 The Bison parser detects a @dfn{syntax error} (or @dfn{parse error})
 whenever it reads a token which cannot satisfy any syntax rule.  An
 action in the grammar can also explicitly proclaim an error, using the
-macro @code{YYERROR} (@pxref{Action Features, ,Special Features for Use
-in Actions}).
+macro @code{YYERROR} (@pxref{Action Features}).
 
 The Bison parser expects to report the error by calling an error
 reporting function named @code{yyerror}, which you must supply.  It is
@@ -7284,12 +7780,13 @@
 receives one argument.  For a syntax error, the string is normally
 @w{@code{"syntax error"}}.
 
-@findex %define parse.error
-If you invoke @samp{%define parse.error verbose} in the Bison declarations
-section (@pxref{Bison Declarations, ,The Bison Declarations Section}), then
-Bison provides a more verbose and specific error message string instead of
-just plain @w{@code{"syntax error"}}.  However, that message sometimes
-contains incorrect information if LAC is not enabled (@pxref{LAC}).
+@findex %define parse.error detailed
+@findex %define parse.error verbose
+If you invoke @samp{%define parse.error detailed} (or @samp{custom}) in the
+Bison declarations section (@pxref{Bison Declarations}), then Bison provides
+a more verbose and specific error message string instead of just plain
+@w{@code{"syntax error"}}.  However, that message sometimes contains
+incorrect information if LAC is not enabled (@pxref{LAC}).
 
 The parser can detect one other kind of error: memory exhaustion.  This
 can happen when the input contains constructions that are very deeply
@@ -7349,16 +7846,134 @@
 @vindex yynerrs
 The variable @code{yynerrs} contains the number of syntax errors
 reported so far.  Normally this variable is global; but if you
-request a pure parser (@pxref{Pure Decl, ,A Pure (Reentrant) Parser})
+request a pure parser (@pxref{Pure Decl})
 then it is a local variable which only the actions can access.
 
+
+@node Syntax Error Reporting Function
+@subsection The Syntax Error Reporting Function @code{yyreport_syntax_error}
+
+@findex %define parse.error custom
+If you invoke @samp{%define parse.error custom} (@pxref{Bison
+Declarations}), then the parser no longer passes syntax error messages to
+@code{yyerror}, rather it delegates that task to the user by calling the
+@code{yyreport_syntax_error} function.
+
+The following functions and types are ``@code{static}'': they are defined in
+the implementation file (@file{*.c}) and available only from there.  They
+are meant to be used from the grammar's epilogue.
+
+@deftypefun {static int} yyreport_syntax_error (@code{const yypcontext_t *}@var{ctx})
+Report a syntax error to the user.  Return 0 on success, @code{YYENOMEM} on
+memory exhaustion.  Whether it uses @code{yyerror} is up to the user.
+@end deftypefun
+
+Use the following types and functions to build the error message.
+
+@deffn {Type} yypcontext_t
+An opaque type that captures the circumstances of the syntax error.
+@end deffn
+
+@deffn {Type} yysymbol_kind_t
+An enum of all the grammar symbols, tokens and nonterminals.  Its
+enumerators are forged from the symbol names:
+
+@example
+enum yysymbol_kind_t
+@{
+  YYSYMBOL_YYEMPTY = -2,      /* No symbol.  */
+  YYSYMBOL_YYEOF = 0,         /* "end of file"  */
+  YYSYMBOL_YYerror = 1,       /* error  */
+  YYSYMBOL_YYUNDEF = 2,       /* "invalid token"  */
+  YYSYMBOL_PLUS = 3,          /* "+"  */
+  YYSYMBOL_MINUS = 4,         /* "-"  */
+  [...]
+  YYSYMBOL_VAR = 14,          /* "variable"  */
+  YYSYMBOL_NEG = 15,          /* NEG  */
+  YYSYMBOL_YYACCEPT = 16,     /* $accept  */
+  YYSYMBOL_exp = 17,          /* exp  */
+  YYSYMBOL_input = 18         /* input  */
+@};
+typedef enum yysymbol_kind_t yysymbol_kind_t;
+@end example
+@end deffn
+
+@deftypefun {static yysymbol_kind_t} yypcontext_token (@code{const yypcontext_t *}@var{ctx})
+The ``unexpected'' token: the symbol kind of the lookahead token that caused
+the syntax error.  Returns @code{YYSYMBOL_YYEMPTY} if there is no lookahead.
+@end deftypefun
+
+@deftypefun {static YYLTYPE *} yypcontext_location (@code{const yypcontext_t *}@var{ctx})
+The location of the syntax error (that of the unexpected token).
+@end deftypefun
+
+@deftypefun {static int} yypcontext_expected_tokens (@code{const yypcontext_t *}ctx, @code{yysymbol_kind_t} @var{argv}@code{[]}, @code{int} @var{argc})
+Fill @var{argv} with the expected tokens, which never includes
+@code{YYSYMBOL_YYEMPTY}, @code{YYSYMBOL_YYerror}, or
+@code{YYSYMBOL_YYUNDEF}.
+
+Never put more than @var{argc} elements into @var{argv}, and on success
+return the number of tokens stored in @var{argv}.  If there are more
+expected tokens than @var{argc}, fill @var{argv} up to @var{argc} and return
+0.  If there are no expected tokens, also return 0, but set @code{argv[0]}
+to @code{YYSYMBOL_YYEMPTY}.
+
+When LAC is enabled, may return a negative number on errors,
+such as @code{YYENOMEM} on memory exhaustion.
+
+If @var{argv} is null, return the size needed to store all the possible
+values, which is always less than @code{YYNTOKENS}.
+@end deftypefun
+
+@deftypefun {static const char *} yysymbol_name (@code{symbol_kind_t} @var{symbol})
+The name of the symbol whose kind is @var{symbol}, possibly translated.
+@end deftypefun
+
+A custom syntax error function looks as follows.  This implementation is
+inappropriate for internationalization, see the @file{c/bistromathic}
+example for a better alternative.
+
+@example
+static int
+yyreport_syntax_error (const yypcontext_t *ctx)
+@{
+  int res = 0;
+  YYLOCATION_PRINT (stderr, *yypcontext_location (ctx));
+  fprintf (stderr, ": syntax error");
+  // Report the tokens expected at this point.
+  @{
+    enum @{ TOKENMAX = 5 @};
+    yysymbol_kind_t expected[TOKENMAX];
+    int n = yypcontext_expected_tokens (ctx, expected, TOKENMAX);
+    if (n < 0)
+      // Forward errors to yyparse.
+      res = n;
+    else
+      for (int i = 0; i < n; ++i)
+        fprintf (stderr, "%s %s",
+                 i == 0 ? ": expected" : " or", yysymbol_name (expected[i]));
+  @}
+  // Report the unexpected token.
+  @{
+    yysymbol_kind_t lookahead = yypcontext_token (ctx);
+    if (lookahead != YYSYMBOL_YYEMPTY)
+      fprintf (stderr, " before %s", yysymbol_name (lookahead));
+  @}
+  fprintf (stderr, "\n");
+  return res;
+@}
+@end example
+
+You still must provide a @code{yyerror} function, used for instance to
+report memory exhaustion.
+
 @node Action Features
 @section Special Features for Use in Actions
 @cindex summary, action features
 @cindex action features summary
 
-Here is a table of Bison constructs, variables and macros that
-are useful in actions.
+Here is a table of Bison constructs, variables and macros that are useful in
+actions.
 
 @deffn {Variable} $$
 Acts like a variable that contains the semantic value for the
@@ -7372,24 +7987,23 @@
 
 @deffn {Variable} $<@var{typealt}>$
 Like @code{$$} but specifies alternative @var{typealt} in the union
-specified by the @code{%union} declaration.  @xref{Action Types, ,Data
-Types of Values in Actions}.
+specified by the @code{%union} declaration.  @xref{Action Types}.
 @end deffn
 
 @deffn {Variable} $<@var{typealt}>@var{n}
 Like @code{$@var{n}} but specifies alternative @var{typealt} in the
 union specified by the @code{%union} declaration.
-@xref{Action Types, ,Data Types of Values in Actions}.
+@xref{Action Types}.
 @end deffn
 
 @deffn {Macro} YYABORT @code{;}
 Return immediately from @code{yyparse}, indicating failure.
-@xref{Parser Function, ,The Parser Function @code{yyparse}}.
+@xref{Parser Function}.
 @end deffn
 
 @deffn {Macro} YYACCEPT @code{;}
 Return immediately from @code{yyparse}, indicating success.
-@xref{Parser Function, ,The Parser Function @code{yyparse}}.
+@xref{Parser Function}.
 @end deffn
 
 @deffn {Macro} YYBACKUP (@var{token}, @var{value})@code{;}
@@ -7397,7 +8011,7 @@
 Unshift a token.  This macro is allowed only for rules that reduce
 a single value, and only when there is no lookahead token.
 It is also disallowed in GLR parsers.
-It installs a lookahead token with token type @var{token} and
+It installs a lookahead token with token kind @var{token} and
 semantic value @var{value}; then it discards the value that was
 going to be reduced by this rule.
 
@@ -7409,11 +8023,11 @@
 In either case, the rest of the action is not executed.
 @end deffn
 
-@deffn {Macro} YYEMPTY
+@deffn {Value} YYEMPTY
 Value stored in @code{yychar} when there is no lookahead token.
 @end deffn
 
-@deffn {Macro} YYEOF
+@deffn {Value} YYEOF
 Value stored in @code{yychar} when the lookahead is the end of the input
 stream.
 @end deffn
@@ -7426,6 +8040,11 @@
 the @samp{YYERROR;} statement.  @xref{Error Recovery}.
 @end deffn
 
+@deffn {Macro} YYNOMEM @code{;}
+Return immediately from @code{yyparse}, indicating memory exhaustion.
+@xref{Parser Function}.
+@end deffn
+
 @deffn {Macro} YYRECOVERING
 @findex YYRECOVERING
 The expression @code{YYRECOVERING ()} yields 1 when the parser
@@ -7439,7 +8058,7 @@
 has been performed so the next token is not yet known.
 Do not modify @code{yychar} in a deferred semantic action (@pxref{GLR Semantic
 Actions}).
-@xref{Lookahead, ,Lookahead Tokens}.
+@xref{Lookahead}.
 @end deffn
 
 @deffn {Macro} yyclearin @code{;}
@@ -7461,7 +8080,7 @@
 to @code{YYEMPTY} or @code{YYEOF}.
 Do not modify @code{yylloc} in a deferred semantic action (@pxref{GLR Semantic
 Actions}).
-@xref{Actions and Locations, ,Actions and Locations}.
+@xref{Actions and Locations}.
 @end deffn
 
 @deffn {Variable} yylval
@@ -7469,7 +8088,7 @@
 not set to @code{YYEMPTY} or @code{YYEOF}.
 Do not modify @code{yylval} in a deferred semantic action (@pxref{GLR Semantic
 Actions}).
-@xref{Actions, ,Actions}.
+@xref{Actions}.
 @end deffn
 
 @deffn {Value} @@$
@@ -7522,6 +8141,14 @@
 encoding.  The exact set of available locales depends on the user's
 installation.
 
+@menu
+* Enabling I18n::    Preparing your project to support internationalization.
+* Token I18n::       Preparing tokens for internationalization in error messages.
+@end menu
+
+@node Enabling I18n
+@subsection Enabling Internationalization
+
 The maintainer of a package that uses a Bison-generated parser enables
 the internationalization of the parser's output through the following
 steps.  Here we assume a package that uses GNU Autoconf and
@@ -7587,6 +8214,51 @@
 infrastructure.
 @end enumerate
 
+@node Token I18n
+@subsection Token Internationalization
+
+When the @code{%define} variable @code{parse.error} is set to @code{custom}
+or @code{detailed}, token aliases can be internationalized:
+
+@example
+%token
+    '\n'   _("end of line")
+  <double>
+    NUM    _("number")
+  <symrec*>
+    FUN    _("function")
+    VAR    _("variable")
+@end example
+
+The remainder of the grammar may freely use either the token symbol
+(@code{FUN}) or its alias (@code{"function"}), but not with the
+internationalization marker (@code{_("function")}).
+
+If at least one token alias is internationalized, then the generated parser
+will use both @code{N_} and @code{_}, that must be defined
+(@pxref{Programmers, , The Programmer’s View, gettext, GNU @code{gettext}
+utilities}).  They are used only on string aliases marked for translation.
+In other words, even if your catalog features a translation for
+``function'', then with
+
+@example
+%token
+  <symrec*>
+    FUN      "function"
+    VAR    _("variable")
+@end example
+
+@noindent
+``function'' will appear untranslated in debug traces and error messages.
+
+Unless defined by the user, the end-of-file token, @code{YYEOF}, is provided
+``end of file'' as an alias.  It is also internationalized if the user
+internationalized tokens.  To map it to another string, use:
+
+@example
+%token END 0 _("end of input")
+@end example
+
 
 @node Algorithm
 @chapter The Bison Parser Algorithm
@@ -7640,7 +8312,7 @@
 
 The parser tries, by shifts and reductions, to reduce the entire input down
 to a single grouping whose symbol is the grammar's start-symbol
-(@pxref{Language and Grammar, ,Languages and Context-Free Grammars}).
+(@pxref{Language and Grammar}).
 
 This kind of parser is known in the literature as a bottom-up parser.
 
@@ -7673,7 +8345,7 @@
 the lookahead token remains off to the side.  When no more reductions
 should take place, the lookahead token is shifted onto the stack.  This
 does not mean that all possible reductions have been done; depending on the
-token type of the lookahead token, some rules may choose to delay their
+token kind of the lookahead token, some rules may choose to delay their
 application.
 
 Here is a simple case where lookahead is needed.  These three rules define
@@ -7713,10 +8385,9 @@
 @vindex yychar
 @vindex yylval
 @vindex yylloc
-The lookahead token is stored in the variable @code{yychar}.
-Its semantic value and location, if any, are stored in the variables
-@code{yylval} and @code{yylloc}.
-@xref{Action Features, ,Special Features for Use in Actions}.
+The lookahead token is stored in the variable @code{yychar}.  Its semantic
+value and location, if any, are stored in the variables @code{yylval} and
+@code{yylloc}.  @xref{Action Features}.
 
 @node Shift/Reduce
 @section Shift/Reduce Conflicts
@@ -7782,17 +8453,62 @@
 This particular ambiguity was first encountered in the specifications of
 Algol 60 and is called the ``dangling @code{else}'' ambiguity.
 
-To avoid warnings from Bison about predictable, legitimate shift/reduce
+To assist the grammar author in understanding the nature of each conflict,
+Bison can be asked to generate ``counterexamples''.  In the present case it
+actually even proves that the grammar is ambiguous by exhibiting a string
+with two different parses:
+
+@macro danglingElseCex
+@group
+@ifnottex
+  Example: @yellow{"if" expr "then"} @blue{"if" expr "then" stmt} @red{•} @blue{"else" stmt}
+  Shift derivation
+    @yellow{if_stmt}
+    @yellow{↳ 3: "if" expr "then"} @green{stmt}
+                           @green{↳ 2:} @blue{if_stmt}
+                                 @blue{↳ 4: "if" expr "then" stmt} @red{•} @blue{"else" stmt}
+  Example: @yellow{"if" expr "then"} @blue{"if" expr "then" stmt} @red{•} @yellow{"else" stmt}
+  Reduce derivation
+    @yellow{if_stmt}
+    @yellow{↳ 4: "if" expr "then"} @green{stmt}                                @yellow{"else" stmt}
+                           @green{↳ 2:} @blue{if_stmt}
+                                 @blue{↳ 3: "if" expr "then" stmt} @red{•}
+@end ifnottex
+@iftex
+  Example: @yellow{"if" expr "then"} @blue{"if" expr "then" stmt} @red{•} @blue{"else" stmt}
+  Shift derivation
+    @yellow{if_stmt}
+    @yellow{@arrow{} 3: "if" expr "then"} @green{stmt}
+                           @green{@arrow{} 2:} @blue{if_stmt}
+                                 @blue{@arrow{} 4: "if" expr "then" stmt} @red{•} @blue{"else" stmt}
+  Example: @yellow{"if" expr "then"} @blue{"if" expr "then" stmt} @red{•} @yellow{"else" stmt}
+  Reduce derivation
+    @yellow{if_stmt}
+    @yellow{@arrow{} 4: "if" expr "then"} @green{stmt}                                @yellow{"else" stmt}
+                           @green{@arrow{} 2:} @blue{if_stmt}
+                                 @blue{@arrow{} 3: "if" expr "then" stmt} @red{•}
+@end iftex
+@end group
+@end macro
+@example
+@danglingElseCex
+@end example
+
+@noindent
+@xref{Counterexamples}, for more details.
+
+@sp 1
+
+To avoid warnings from Bison about predictable, @emph{legitimate} shift/reduce
 conflicts, you can use the @code{%expect @var{n}} declaration.
 There will be no warning as long as the number of shift/reduce conflicts
 is exactly @var{n}, and Bison will report an error if there is a
 different number.
-@xref{Expect Decl, ,Suppressing Conflict Warnings}.  However, we don't
+@xref{Expect Decl}.  However, we don't
 recommend the use of @code{%expect} (except @samp{%expect 0}!), as an equal
 number of conflicts does not mean that they are the @emph{same}.  When
 possible, you should rather use precedence directives to @emph{fix} the
-conflicts explicitly (@pxref{Non Operators,, Using Precedence For Non
-Operators}).
+conflicts explicitly (@pxref{Non Operators}).
 
 The definition of @code{if_stmt} above is solely to blame for the
 conflict, but the conflict does not actually appear without additional
@@ -7929,13 +8645,12 @@
 @code{%right}, or @code{%nonassoc} might hide future (associativity
 related) conflicts that would remain hidden.
 
-The dangling @code{else} ambiguity (@pxref{Shift/Reduce, , Shift/Reduce
-Conflicts}) can be solved explicitly.  This shift/reduce conflicts occurs
-in the following situation, where the period denotes the current parsing
-state:
+The dangling @code{else} ambiguity (@pxref{Shift/Reduce}) can be solved
+explicitly.  This shift/reduce conflicts occurs in the following situation,
+where the period denotes the current parsing state:
 
 @example
-if @var{e1} then if  @var{e2} then @var{s1} . else @var{s2}
+if @var{e1} then if  @var{e2} then @var{s1} • else @var{s2}
 @end example
 
 The conflict involves the reduction of the rule @samp{IF expr THEN
@@ -7951,12 +8666,11 @@
 %precedence ELSE
 @end example
 
-The unary-minus is another typical example where associativity is
-usually over-specified, see @ref{Infix Calc, , Infix Notation
-Calculator - @code{calc}}.  The @code{%left} directive is traditionally
-used to declare the precedence of @code{NEG}, which is more than needed
-since it also defines its associativity.  While this is harmless in the
-traditional example, who knows how @code{NEG} might be used in future
+The unary-minus is another typical example where associativity is usually
+over-specified, see @ref{Infix Calc}.  The @code{%left} directive is
+traditionally used to declare the precedence of @code{NEG}, which is more
+than needed since it also defines its associativity.  While this is harmless
+in the traditional example, who knows how @code{NEG} might be used in future
 evolutions of the grammar@dots{}
 
 @node Precedence Examples
@@ -7988,15 +8702,15 @@
 precedence levels to certain rules: each rule gets its precedence from
 the last terminal symbol mentioned in the components.  (You can also
 specify explicitly the precedence of a rule.  @xref{Contextual
-Precedence, ,Context-Dependent Precedence}.)
+Precedence}.)
 
 Finally, the resolution of conflicts works by comparing the precedence
 of the rule being considered with that of the lookahead token.  If the
 token's precedence is higher, the choice is to shift.  If the rule's
 precedence is higher, the choice is to reduce.  If they have equal
 precedence, the choice is made based on the associativity of that
-precedence level.  The verbose output file made by @samp{-v}
-(@pxref{Invocation, ,Invoking Bison}) says how each conflict was
+precedence level.  The verbose output file made by @option{-v}
+(@pxref{Invocation}) says how each conflict was
 resolved.
 
 Not all rules and not all tokens have precedence.  If either the rule or
@@ -8006,9 +8720,9 @@
 @subsection Using Precedence For Non Operators
 
 Using properly precedence and associativity directives can help fixing
-shift/reduce conflicts that do not involve arithmetics-like operators.  For
-instance, the ``dangling @code{else}'' problem (@pxref{Shift/Reduce, ,
-Shift/Reduce Conflicts}) can be solved elegantly in two different ways.
+shift/reduce conflicts that do not involve arithmetic-like operators.  For
+instance, the ``dangling @code{else}'' problem (@pxref{Shift/Reduce}) can be
+solved elegantly in two different ways.
 
 In the present case, the conflict is between the token @code{"else"} willing
 to be shifted, and the rule @samp{if_stmt: "if" expr "then" stmt}, asking
@@ -8073,7 +8787,7 @@
 assign the rule the precedence of @var{terminal-symbol}, overriding
 the precedence that would be deduced for it in the ordinary way.  The
 altered rule precedence then affects how conflicts involving that rule
-are resolved (@pxref{Precedence, ,Operator Precedence}).
+are resolved (@pxref{Precedence}).
 
 Here is how @code{%prec} solves the problem of unary minus.  First, declare
 a precedence for a fictitious terminal symbol named @code{UMINUS}.  There
@@ -8128,20 +8842,19 @@
 @cindex state (of parser)
 
 The function @code{yyparse} is implemented using a finite-state machine.
-The values pushed on the parser stack are not simply token type codes; they
+The values pushed on the parser stack are not simply token kind codes; they
 represent the entire sequence of terminal and nonterminal symbols at or
 near the top of the stack.  The current state collects all the information
 about previous input which is relevant to deciding what to do next.
 
-Each time a lookahead token is read, the current parser state together
-with the type of lookahead token are looked up in a table.  This table
-entry can say, ``Shift the lookahead token.''  In this case, it also
-specifies the new parser state, which is pushed onto the top of the
-parser stack.  Or it can say, ``Reduce using rule number @var{n}.''
-This means that a certain number of tokens or groupings are taken off
-the top of the stack, and replaced by one grouping.  In other words,
-that number of states are popped from the stack, and one new state is
-pushed.
+Each time a lookahead token is read, the current parser state together with
+the kind of lookahead token are looked up in a table.  This table entry can
+say, ``Shift the lookahead token.''  In this case, it also specifies the new
+parser state, which is pushed onto the top of the parser stack.  Or it can
+say, ``Reduce using rule number @var{n}.''  This means that a certain number
+of tokens or groupings are taken off the top of the stack, and replaced by
+one grouping.  In other words, that number of states are popped from the
+stack, and one new state is pushed.
 
 There is one other alternative: the table can say that the lookahead token
 is erroneous in the current state.  This causes error processing to begin
@@ -8177,7 +8890,8 @@
 @end example
 
 @noindent
-The error is an ambiguity: there is more than one way to parse a single
+The error is an ambiguity: as counterexample generation would demonstrate
+(@pxref{Counterexamples}), there is more than one way to parse a single
 @code{word} into a @code{sequence}.  It could be reduced to a
 @code{maybeword} and then into a @code{sequence} via the second rule.
 Alternatively, nothing-at-all could be reduced into a @code{sequence}
@@ -8297,7 +9011,7 @@
 To prefer the longest @code{words}, the conflict between the token
 @code{"word"} and the rule @samp{sequence: sequence words} must be resolved
 as a shift.  To this end, we use the same techniques as exposed above, see
-@ref{Non Operators,, Using Precedence For Non Operators}.  One solution
+@ref{Non Operators}.  One solution
 relies on precedences: use @code{%prec} to give a lower precedence to the
 rule:
 
@@ -8374,12 +9088,14 @@
 It would seem that this grammar can be parsed with only a single token of
 lookahead: when a @code{param_spec} is being read, an @code{"id"} is a
 @code{name} if a comma or colon follows, or a @code{type} if another
-@code{"id"} follows.  In other words, this grammar is LR(1).
+@code{"id"} follows.  In other words, this grammar is LR(1).  Yet Bison
+finds one reduce/reduce conflict, for which counterexample generation
+(@pxref{Counterexamples}) would find a @emph{nonunifying} example.
 
 @cindex LR
 @cindex LALR
-However, for historical reasons, Bison cannot by default handle all
-LR(1) grammars.
+This is because Bison does not handle all LR(1) grammars @emph{by default},
+for historical reasons.
 In this grammar, two contexts, that after an @code{"id"} at the beginning
 of a @code{param_spec} and likewise at the beginning of a
 @code{return_spec}, are similar enough that Bison assumes they are the
@@ -8449,8 +9165,8 @@
 @end group
 @end example
 
-For a more detailed exposition of LALR(1) parsers and parser
-generators, @pxref{Bibliography,,DeRemer 1982}.
+For a more detailed exposition of LALR(1) parsers and parser generators, see
+@tcite{DeRemer 1982}.
 
 @node Tuning LR
 @section Tuning LR
@@ -8530,10 +9246,9 @@
 safely and completely eliminate the need to consider LALR's shortcomings.
 
 While IELR is almost always preferable, there are circumstances where LALR
-or the canonical LR parser tables described by Knuth
-(@pxref{Bibliography,,Knuth 1965}) can be useful.  Here we summarize the
-relative advantages of each parser table construction algorithm within
-Bison:
+or the canonical LR parser tables described by Knuth @pcite{Knuth 1965} can
+be useful.  Here we summarize the relative advantages of each parser table
+construction algorithm within Bison:
 
 @itemize
 @item LALR
@@ -8597,8 +9312,8 @@
 @end itemize
 
 For a more detailed exposition of the mysterious behavior in LALR parsers
-and the benefits of IELR, @pxref{Bibliography,,Denny 2008 March}, and
-@ref{Bibliography,,Denny 2010 November}.
+and the benefits of IELR, see @tcite{Denny 2008}, and @tcite{Denny 2010
+November}.
 
 @node Default Reductions
 @subsection Default Reductions
@@ -8800,8 +9515,8 @@
 @end itemize
 
 While the LAC algorithm shares techniques that have been recognized in the
-parser community for years, for the publication that introduces LAC,
-@pxref{Bibliography,,Denny 2010 May}.
+parser community for years, for the publication that introduces LAC, see
+@tcite{Denny 2010 May}.
 
 @node Unreachable States
 @subsection Unreachable States
@@ -8862,7 +9577,7 @@
 sequence of reductions cannot have deterministic parsers in this sense.
 The same is true of languages that require more than one symbol of
 lookahead, since the parser lacks the information necessary to make a
-decision at the point it must be made in a shift-reduce parser.
+decision at the point it must be made in a shift/reduce parser.
 Finally, as previously mentioned (@pxref{Mysterious Conflicts}),
 there are languages where Bison's default choice of how to
 summarize the input seen so far loses necessary information.
@@ -8872,9 +9587,9 @@
 Generalized LR (or GLR).  A Bison GLR
 parser uses the same basic
 algorithm for parsing as an ordinary Bison parser, but behaves
-differently in cases where there is a shift-reduce conflict that has not
+differently in cases where there is a shift/reduce conflict that has not
 been resolved by precedence rules (@pxref{Precedence}) or a
-reduce-reduce conflict.  When a GLR parser encounters such a
+reduce/reduce conflict.  When a GLR parser encounters such a
 situation, it
 effectively @emph{splits} into a several parsers, one for each possible
 shift or reduction.  These parsers then proceed as usual, consuming
@@ -8925,8 +9640,7 @@
 grammar, in particular, it is only slightly slower than with the
 deterministic LR(1) Bison parser.
 
-For a more detailed exposition of GLR parsers, @pxref{Bibliography,,Scott
-2000}.
+For a more detailed exposition of GLR parsers, see @tcite{Scott 2000}.
 
 @node Memory Management
 @section Memory Management, and How to Avoid Memory Exhaustion
@@ -8942,7 +9656,7 @@
 
 Because Bison parsers have growing stacks, hitting the upper limit
 usually results from using a right recursion instead of a left
-recursion, see @ref{Recursion, ,Recursive Rules}.
+recursion, see @ref{Recursion}.
 
 @vindex YYMAXDEPTH
 By defining the macro @code{YYMAXDEPTH}, you can control how deep the
@@ -8975,14 +9689,12 @@
 
 Do not allow @code{YYINITDEPTH} to be greater than @code{YYMAXDEPTH}.
 
-You can generate a deterministic parser containing C++ user code from
-the default (C) skeleton, as well as from the C++ skeleton
-(@pxref{C++ Parsers}).  However, if you do use the default skeleton
-and want to allow the parsing stack to grow,
-be careful not to use semantic types or location types that require
-non-trivial copy constructors.
-The C skeleton bypasses these constructors when copying data to
-new, larger stacks.
+You can generate a deterministic parser containing C++ user code from the
+default (C) skeleton, as well as from the C++ skeleton (@pxref{C++
+Parsers}).  However, if you do use the default skeleton and want to allow
+the parsing stack to grow, be careful not to use semantic types or location
+types that require non-trivial copy constructors.  The C skeleton bypasses
+these constructors when copying data to new, larger stacks.
 
 @node Error Recovery
 @chapter Error Recovery
@@ -9031,18 +9743,18 @@
 will be tokens to read before the next newline.  So the rule is not
 applicable in the ordinary way.
 
-But Bison can force the situation to fit the rule, by discarding part of
-the semantic context and part of the input.  First it discards states
-and objects from the stack until it gets back to a state in which the
+But Bison can force the situation to fit the rule, by discarding part of the
+semantic context and part of the input.  First it discards states and
+objects from the stack until it gets back to a state in which the
 @code{error} token is acceptable.  (This means that the subexpressions
-already parsed are discarded, back to the last complete @code{stmts}.)
-At this point the @code{error} token can be shifted.  Then, if the old
+already parsed are discarded, back to the last complete @code{stmts}.)  At
+this point the @code{error} token can be shifted.  Then, if the old
 lookahead token is not acceptable to be shifted next, the parser reads
 tokens and discards them until it finds a token which is acceptable.  In
-this example, Bison reads and discards input until the next newline so
-that the fourth rule can apply.  Note that discarded symbols are
-possible sources of memory leaks, see @ref{Destructor Decl, , Freeing
-Discarded Symbols}, for a means to reclaim this memory.
+this example, Bison reads and discards input until the next newline so that
+the fourth rule can apply.  Note that discarded symbols are possible sources
+of memory leaks, see @ref{Destructor Decl}, for a means to reclaim this
+memory.
 
 The choice of error rules in the grammar is a choice of strategies for
 error recovery.  A simple and useful strategy is simply to skip the rest of
@@ -9069,10 +9781,9 @@
 one syntax error often leads to another.  In the above example, the error
 recovery rule guesses that an error is due to bad input within one
 @code{stmt}.  Suppose that instead a spurious semicolon is inserted in the
-middle of a valid @code{stmt}.  After the error recovery rule recovers
-from the first error, another syntax error will be found straightaway,
-since the text following the spurious semicolon is also an invalid
-@code{stmt}.
+middle of a valid @code{stmt}.  After the error recovery rule recovers from
+the first error, another syntax error will be found straight away, since the
+text following the spurious semicolon is also an invalid @code{stmt}.
 
 To prevent an outpouring of error messages, the parser will output no error
 message for another syntax error that happens shortly after the first; only
@@ -9093,7 +9804,7 @@
 this is unacceptable, then the macro @code{yyclearin} may be used to clear
 this token.  Write the statement @samp{yyclearin;} in the error rule's
 action.
-@xref{Action Features, ,Special Features for Use in Actions}.
+@xref{Action Features}.
 
 For example, suppose that on a syntax error, an error handling routine is
 called that advances the input stream to some point where parsing should
@@ -9127,7 +9838,7 @@
 neither clean nor robust.)
 
 @node Semantic Tokens
-@section Semantic Info in Token Types
+@section Semantic Info in Token Kinds
 
 The C language has a context dependency: the way an identifier is used
 depends on what its current meaning is.  For example, consider this:
@@ -9140,19 +9851,19 @@
 name, then this is actually a declaration of @code{x}.  How can a Bison
 parser for C decide how to parse this input?
 
-The method used in GNU C is to have two different token types,
+The method used in GNU C is to have two different token kinds,
 @code{IDENTIFIER} and @code{TYPENAME}.  When @code{yylex} finds an
 identifier, it looks up the current declaration of the identifier in order
-to decide which token type to return: @code{TYPENAME} if the identifier is
+to decide which token kind to return: @code{TYPENAME} if the identifier is
 declared as a typedef, @code{IDENTIFIER} otherwise.
 
 The grammar rules can then express the context dependency by the choice of
-token type to recognize.  @code{IDENTIFIER} is accepted as an expression,
+token kind to recognize.  @code{IDENTIFIER} is accepted as an expression,
 but @code{TYPENAME} is not.  @code{TYPENAME} can start a declaration, but
 @code{IDENTIFIER} cannot.  In contexts where the meaning of the identifier
 is @emph{not} significant, such as in declarations that can shadow a
 typedef name, either @code{TYPENAME} or @code{IDENTIFIER} is
-accepted---there is one rule for each of the two token types.
+accepted---there is one rule for each of the two token kinds.
 
 This technique is simple to use if the decision of which kinds of
 identifiers to allow is made at a place close to where the identifier is
@@ -9257,10 +9968,9 @@
 it is nonzero, all integers are parsed in hexadecimal, and tokens starting
 with letters are parsed as integers if possible.
 
-The declaration of @code{hexflag} shown in the prologue of the grammar
-file is needed to make it accessible to the actions (@pxref{Prologue,
-,The Prologue}).  You must also write the code in @code{yylex} to obey
-the flag.
+The declaration of @code{hexflag} shown in the prologue of the grammar file
+is needed to make it accessible to the actions (@pxref{Prologue}).  You must
+also write the code in @code{yylex} to obey the flag.
 
 @node Tie-in Recovery
 @section Lexical Tie-ins and Error Recovery
@@ -9323,53 +10033,315 @@
 @chapter Debugging Your Parser
 
 Developing a parser can be a challenge, especially if you don't understand
-the algorithm (@pxref{Algorithm, ,The Bison Parser Algorithm}).  This
-chapter explains how to understand and debug a parser.
+the algorithm (@pxref{Algorithm}).  This chapter explains how to understand
+and debug a parser.
 
-The first sections focus on the static part of the parser: its structure.
-They explain how to generate and read the detailed description of the
-automaton.  There are several formats available:
+The most frequent issue users face is solving their conflicts.  To fix them,
+the first step is understanding how they arise in a given grammar.  This is
+made much easier by automated generation of counterexamples, cover in the
+first section (@pxref{Counterexamples}).
+
+In most cases though, looking at the structure of the automaton is still
+needed.  The following sections explain how to generate and read the
+detailed structural description of the automaton.  There are several formats
+available:
 @itemize @minus
 @item
-as text, see @ref{Understanding, , Understanding Your Parser};
+as text, see @ref{Understanding};
 
 @item
-as a graph, see @ref{Graphviz,, Visualizing Your Parser};
+as a graph, see @ref{Graphviz};
 
 @item
 or as a markup report that can be turned, for instance, into HTML, see
-@ref{Xml,, Visualizing your parser in multiple formats}.
+@ref{Xml}.
 @end itemize
 
 The last section focuses on the dynamic part of the parser: how to enable
-and understand the parser run-time traces (@pxref{Tracing, ,Tracing Your
-Parser}).
+and understand the parser run-time traces (@pxref{Tracing}).
 
 @menu
+* Counterexamples::   Understanding conflicts.
 * Understanding::     Understanding the structure of your parser.
 * Graphviz::          Getting a visual representation of the parser.
 * Xml::               Getting a markup representation of the parser.
 * Tracing::           Tracing the execution of your parser.
 @end menu
 
+@node Counterexamples
+@section Generation of Counterexamples
+@cindex cex
+@cindex counterexamples
+@cindex conflict counterexamples
+
+Solving conflicts is probably the most delicate part of the design of an LR
+parser, as demonstrated by the number of sections devoted to them in this
+very documentation.  To solve a conflict, one must understand it: when does
+it occur?  Is it because of a flaw in the grammar?  Is it rather because
+LR(1) cannot cope with this grammar?
+
+One difficulty is that conflicts occur in the @emph{automaton}, and it can
+be tricky to relate them to issues in the @emph{grammar} itself.  With
+experience and patience, analysis of the detailed description of the
+automaton (@pxref{Understanding}) allows one to find example strings that
+reach these conflicts.
+
+That task is made much easier thanks to the generation of counterexamples,
+initially developed by Chinawat Isradisaikul and Andrew Myers
+@pcite{Isradisaikul 2015}.
+
+As a first example, see the grammar of @ref{Shift/Reduce}, which features
+one shift/reduce conflict:
+
+@c see doc/else.y
+@example
+$ @kbd{bison else.y}
+else.y: @dwarning{warning}: 1 shift/reduce conflict [@dwarning{-Wconflicts-sr}]
+else.y: @dnotice{note}: rerun with option '-Wcounterexamples' to generate conflict counterexamples
+@end example
+
+@noindent
+Let's rerun @command{bison} with the option
+@option{-Wcex}/@option{-Wcounterexamples}@inlinefmt{info, (the following
+output is actually in color)}:
+
+@example
+else.y: @dwarning{warning}: 1 shift/reduce conflict [@dwarning{-Wconflicts-sr}]
+else.y: @dwarning{warning}: shift/reduce conflict on token "else" [@dwarning{-Wcounterexamples}]
+@danglingElseCex
+@end example
+
+This shows two different derivations for one single expression, which proves
+that the grammar is ambiguous.
+
+@sp 1
+
+As a more delicate example, consider the example grammar of
+@ref{Reduce/Reduce}, which features a reduce/reduce conflict:
+
+@c doc/sequence.y
+@example
+%%
+sequence:
+  %empty
+| maybeword
+| sequence "word"
+;
+maybeword:
+  %empty
+| "word"
+;
+@end example
+
+Bison generates the following counterexamples:
+
+@example
+@group
+$ @kbd{bison -Wcex sequence.y}
+sequence.y: @dwarning{warning}: 1 shift/reduce conflict [@dwarning{-Wconflicts-sr}]
+sequence.y: @dwarning{warning}: 2 reduce/reduce conflicts [@dwarning{-Wconflicts-rr}]
+@end group
+@ifnottex
+@group
+sequence.y: @dwarning{warning}: shift/reduce conflict on token "word" [@dwarning{-Wcounterexamples}]
+  Example: @red{•} @green{"word"}
+  Shift derivation
+    @yellow{sequence}
+    @yellow{↳ 2:} @green{maybeword}
+          @green{↳ 5:} @red{•} @green{"word"}
+  Example: @red{•} @yellow{"word"}
+  Reduce derivation
+    @yellow{sequence}
+    @yellow{↳ 3:} @green{sequence} @yellow{"word"}
+          @green{↳ 1:} @red{•}
+@end group
+@group
+sequence.y: @dwarning{warning}: reduce/reduce conflict on tokens $end, "word" [@dwarning{-Wcounterexamples}]
+  Example: @red{•}
+  First reduce derivation
+    @yellow{sequence}
+    @yellow{↳ 1:} @red{•}
+  Example: @red{•}
+  Second reduce derivation
+    @yellow{sequence}
+    @yellow{↳ 2:} @green{maybeword}
+          @green{↳ 4:} @red{•}
+@end group
+@group
+sequence.y: @dwarning{warning}: shift/reduce conflict on token "word" [@dwarning{-Wcounterexamples}]
+  Example: @red{•} @green{"word"}
+  Shift derivation
+    @yellow{sequence}
+    @yellow{↳ 2:} @green{maybeword}
+          @green{↳ 5:} @red{•} @green{"word"}
+  Example: @red{•} @yellow{"word"}
+  Reduce derivation
+    @yellow{sequence}
+    @yellow{↳ 3:} @green{sequence}        @yellow{"word"}
+          @green{↳ 2:} @blue{maybeword}
+                @blue{↳ 4:} @red{•}
+@end group
+@group
+sequence.y:8.3-45: @dwarning{warning}: rule useless in parser due to conflicts [@dwarning{-Wother}]
+    8 |   @dwarning{%empty    @{ printf ("empty maybeword\n"); @}}
+      |   @dwarning{^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
+@end group
+@end ifnottex
+@iftex
+@group
+sequence.y: @dwarning{warning}: shift/reduce conflict on token "word" [@dwarning{-Wcounterexamples}]
+  Example: @red{•} @green{"word"}
+  Shift derivation
+    @yellow{sequence}
+    @yellow{@arrow{} 2:} @green{maybeword}
+          @green{@arrow{} 5:} @red{•} @green{"word"}
+  Example: @red{•} @yellow{"word"}
+  Reduce derivation
+    @yellow{sequence}
+    @yellow{@arrow{} 3:} @green{sequence} @yellow{"word"}
+          @green{@arrow{} 1:} @red{•}
+@end group
+@group
+sequence.y: @dwarning{warning}: reduce/reduce conflict on tokens $end, "word" [@dwarning{-Wcounterexamples}]
+  Example: @red{•}
+  First reduce derivation
+    @yellow{sequence}
+    @yellow{@arrow{} 1:} @red{•}
+  Example: @red{•}
+  Second reduce derivation
+    @yellow{sequence}
+    @yellow{@arrow{} 2:} @green{maybeword}
+          @green{@arrow{}: 4} @red{•}
+@end group
+@group
+sequence.y: @dwarning{warning}: shift/reduce conflict on token "word" [@dwarning{-Wcounterexamples}]
+  Example: @red{•} @green{"word"}
+  Shift derivation
+    @yellow{sequence}
+    @yellow{@arrow{} 2:} @green{maybeword}
+          @green{@arrow{} 5:} @red{•} @green{"word"}
+  Example: @red{•} @yellow{"word"}
+  Reduce derivation
+    @yellow{sequence}
+    @yellow{@arrow{} 3:} @green{sequence}        @yellow{"word"}
+          @green{@arrow{} 2:} @blue{maybeword}
+                @blue{@arrow{} 4:} @red{•}
+@end group
+@group
+sequence.y:8.3-45: @dwarning{warning}: rule useless in parser due to conflicts [@dwarning{-Wother}]
+    8 |   @dwarning{%empty    @{ printf ("empty maybeword\n"); @}}
+      |   @dwarning{^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
+@end group
+@end iftex
+@end example
+
+Each of these three conflicts, again, prove that the grammar is ambiguous.
+For instance, the second conflict (the reduce/reduce one) shows that the
+grammar accepts the empty input in two different ways.
+
+@sp 1
+
+Sometimes, the search will not find an example that can be derived in two
+ways.  In these cases, counterexample generation will provide two examples
+that are the same up until the dot.  Most notably, this will happen when
+your grammar requires a stronger parser (more lookahead, LR instead of
+LALR).  The following example isn't LR(1):
+
+@c doc/ids.y
+@example
+%token ID
+%%
+s: a ID
+a: expr
+expr: %empty | expr ID ','
+@end example
+
+@command{bison} reports:
+
+@example
+ids.y: @dwarning{warning}: 1 shift/reduce conflict [@dwarning{-Wconflicts-sr}]
+ids.y: @dwarning{warning}: shift/reduce conflict on token ID [@dwarning{-Wcounterexamples}]
+@ifnottex
+@group
+  First example: @purple{expr} @red{•} @purple{ID ','} @green{ID} @yellow{$end}
+  Shift derivation
+    @yellow{$accept}
+    @yellow{↳ 0:} @green{s}                                 @yellow{$end}
+         @green{↳ 1:} @blue{a}                        @green{ID}
+              @blue{↳ 2:} @purple{expr}
+                    @purple{↳ 4: expr} @red{•} @purple{ID ','}
+  Second example: @blue{expr} @red{•} @green{ID} @yellow{$end}
+  Reduce derivation
+    @yellow{$accept}
+    @yellow{↳ 0:} @green{s}                   @yellow{$end}
+         @green{↳ 1:} @blue{a}           @green{ID}
+              @blue{↳ 2: expr} @red{•}
+@end group
+@group
+ids.y:4.4-7: @dwarning{warning}: rule useless in parser due to conflicts [@dwarning{-Wother}]
+    4 | a: expr
+      |    ^~~~
+@end group
+@end ifnottex
+@iftex
+@group
+  First example: @purple{expr} @red{•} @purple{ID ','} @green{ID} @yellow{$end}
+  Shift derivation
+    @yellow{$accept}
+    @yellow{@arrow{} 0:} @green{s}                                   @yellow{$end}
+          @green{@arrow{} 1:} @blue{a}                         @green{ID}
+                @blue{@arrow{} 2:} @purple{expr}
+                      @purple{@arrow{} 4: expr} @red{•} @purple{ID ','}
+  Second example: @blue{expr} @red{•} @green{ID} @yellow{$end}
+  Reduce derivation
+    @yellow{$accept}
+    @yellow{@arrow{} 0:} @green{s}                     @yellow{$end}
+          @green{@arrow{} 1:} @blue{a}            @green{ID}
+                @blue{@arrow{} 2: expr} @red{•}
+@end group
+@group
+ids.y:4.4-7: @dwarning{warning}: rule useless in parser due to conflicts [@dwarning{-Wother}]
+    4 | a: expr
+      |    ^~~~
+@end group
+@end iftex
+@end example
+
+This conflict is caused by the parser not having enough information to know
+the difference between these two examples.  The parser would need an
+additional lookahead token to know whether or not a comma follows the
+@code{ID} after @code{expr}.  These types of conflicts tend to be more
+difficult to fix, and usually need a rework of the grammar.  In this case,
+it can be fixed by changing around the recursion: @code{expr: ID | ',' expr
+ID}.
+
+Alternatively, you might also want to consider using a GLR parser
+(@pxref{GLR Parsers}).
+
+@sp 1
+
+On occasions, it is useful to look at counterexamples @emph{in situ}: with
+the automaton report (@xref{Understanding}, in particular @ref{state-8,,
+State 8}).
+
 @node Understanding
 @section Understanding Your Parser
 
-As documented elsewhere (@pxref{Algorithm, ,The Bison Parser Algorithm})
-Bison parsers are @dfn{shift/reduce automata}.  In some cases (much more
-frequent than one would hope), looking at this automaton is required to
-tune or simply fix a parser.
+Bison parsers are @dfn{shift/reduce automata} (@pxref{Algorithm}).  In some
+cases (much more frequent than one would hope), looking at this automaton is
+required to tune or simply fix a parser.
 
 The textual file is generated when the options @option{--report} or
-@option{--verbose} are specified, see @ref{Invocation, , Invoking
-Bison}.  Its name is made by removing @samp{.tab.c} or @samp{.c} from
-the parser implementation file name, and adding @samp{.output}
-instead.  Therefore, if the grammar file is @file{foo.y}, then the
-parser implementation file is called @file{foo.tab.c} by default.  As
-a consequence, the verbose output file is called @file{foo.output}.
+@option{--verbose} are specified, see @ref{Invocation}.  Its name is made by
+removing @samp{.tab.c} or @samp{.c} from the parser implementation file
+name, and adding @samp{.output} instead.  Therefore, if the grammar file is
+@file{foo.y}, then the parser implementation file is called @file{foo.tab.c}
+by default.  As a consequence, the verbose output file is called
+@file{foo.output}.
 
 The following grammar file, @file{calc.y}, will be used in the sequel:
 
+@c doc/calc.y
 @example
 @group
 %union
@@ -9406,19 +10378,20 @@
 
 @command{bison} reports:
 
-@example
+@smallexample
 calc.y: @dwarning{warning}: 1 nonterminal useless in grammar [@dwarning{-Wother}]
 calc.y: @dwarning{warning}: 1 rule useless in grammar [@dwarning{-Wother}]
 calc.y:19.1-7: @dwarning{warning}: nonterminal useless in grammar: useless [@dwarning{-Wother}]
    19 | @dwarning{useless: STR;}
       | @dwarning{^~~~~~~}
 calc.y: @dwarning{warning}: 7 shift/reduce conflicts [@dwarning{-Wconflicts-sr}]
-@end example
+calc.y: @dnotice{note}: rerun with option '-Wcounterexamples' to generate conflict counterexamples
+@end smallexample
 
-When given @option{--report=state}, in addition to @file{calc.tab.c}, it
-creates a file @file{calc.output} with contents detailed below.  The
-order of the output and the exact presentation might vary, but the
-interpretation is the same.
+Going back to the calc example, when given @option{--report=state},
+in addition to @file{calc.tab.c}, it creates a file @file{calc.output}
+with contents detailed below.  The order of the output and the exact
+presentation might vary, but the interpretation is the same.
 
 @noindent
 @cindex token, useless
@@ -9475,39 +10448,40 @@
 @group
 Terminals, with rules where they appear
 
-$end (0) 0
-'*' (42) 3
-'+' (43) 1
-'-' (45) 2
-'/' (47) 4
-error (256)
-NUM <ival> (258) 5
-STR <sval> (259)
+    $end (0) 0
+    '*' (42) 3
+    '+' (43) 1
+    '-' (45) 2
+    '/' (47) 4
+    error (256)
+    NUM <ival> (258) 5
+    STR <sval> (259)
 @end group
 
 @group
 Nonterminals, with rules where they appear
 
-$accept (9)
-    on left: 0
-exp <ival> (10)
-    on left: 1 2 3 4 5, on right: 0 1 2 3 4
+    $accept (9)
+        on left: 0
+    exp <ival> (10)
+        on left: 1 2 3 4 5
+        on right: 0 1 2 3 4
 @end group
 @end example
 
 @noindent
 @cindex item
-@cindex pointed rule
-@cindex rule, pointed
-Bison then proceeds onto the automaton itself, describing each state
-with its set of @dfn{items}, also known as @dfn{pointed rules}.  Each
-item is a production rule together with a point (@samp{.}) marking
-the location of the input cursor.
+@cindex dotted rule
+@cindex rule, dotted
+Bison then proceeds onto the automaton itself, describing each state with
+its set of @dfn{items}, also known as @dfn{dotted rules}.  Each item is a
+production rule together with a point (@samp{.}) marking the location of the
+input cursor.
 
 @example
 State 0
 
-    0 $accept: . exp $end
+    0 $accept: • exp $end
 
     NUM  shift, and go to state 1
 
@@ -9537,12 +10511,12 @@
 @example
 State 0
 
-    0 $accept: . exp $end
-    1 exp: . exp '+' exp
-    2    | . exp '-' exp
-    3    | . exp '*' exp
-    4    | . exp '/' exp
-    5    | . NUM
+    0 $accept: • exp $end
+    1 exp: • exp '+' exp
+    2    | • exp '-' exp
+    3    | • exp '*' exp
+    4    | • exp '/' exp
+    5    | • NUM
 
     NUM  shift, and go to state 1
 
@@ -9555,25 +10529,25 @@
 @example
 State 1
 
-    5 exp: NUM .
+    5 exp: NUM •
 
     $default  reduce using rule 5 (exp)
 @end example
 
 @noindent
 the rule 5, @samp{exp: NUM;}, is completed.  Whatever the lookahead token
-(@samp{$default}), the parser will reduce it.  If it was coming from
-State 0, then, after this reduction it will return to state 0, and will
-jump to state 2 (@samp{exp: go to state 2}).
+(@samp{$default}), the parser will reduce it.  If it was coming from State
+0, then, after this reduction it will return to state 0, and will jump to
+state 2 (@samp{exp: go to state 2}).
 
 @example
 State 2
 
-    0 $accept: exp . $end
-    1 exp: exp . '+' exp
-    2    | exp . '-' exp
-    3    | exp . '*' exp
-    4    | exp . '/' exp
+    0 $accept: exp • $end
+    1 exp: exp • '+' exp
+    2    | exp • '-' exp
+    3    | exp • '*' exp
+    4    | exp • '/' exp
 
     $end  shift, and go to state 3
     '+'   shift, and go to state 4
@@ -9583,12 +10557,11 @@
 @end example
 
 @noindent
-In state 2, the automaton can only shift a symbol.  For instance,
-because of the item @samp{exp: exp . '+' exp}, if the lookahead is
-@samp{+} it is shifted onto the parse stack, and the automaton
-jumps to state 4, corresponding to the item @samp{exp: exp '+' . exp}.
-Since there is no default action, any lookahead not listed triggers a syntax
-error.
+In state 2, the automaton can only shift a symbol.  For instance, because of
+the item @samp{exp: exp • '+' exp}, if the lookahead is @samp{+} it is
+shifted onto the parse stack, and the automaton jumps to state 4,
+corresponding to the item @samp{exp: exp '+' • exp}.  Since there is no
+default action, any lookahead not listed triggers a syntax error.
 
 @cindex accepting state
 The state 3 is named the @dfn{final state}, or the @dfn{accepting
@@ -9597,7 +10570,7 @@
 @example
 State 3
 
-    0 $accept: exp $end .
+    0 $accept: exp $end •
 
     $default  accept
 @end example
@@ -9612,7 +10585,7 @@
 @example
 State 4
 
-    1 exp: exp '+' . exp
+    1 exp: exp '+' • exp
 
     NUM  shift, and go to state 1
 
@@ -9621,7 +10594,7 @@
 
 State 5
 
-    2 exp: exp '-' . exp
+    2 exp: exp '-' • exp
 
     NUM  shift, and go to state 1
 
@@ -9630,7 +10603,7 @@
 
 State 6
 
-    3 exp: exp '*' . exp
+    3 exp: exp '*' • exp
 
     NUM  shift, and go to state 1
 
@@ -9639,24 +10612,25 @@
 
 State 7
 
-    4 exp: exp '/' . exp
+    4 exp: exp '/' • exp
 
     NUM  shift, and go to state 1
 
     exp  go to state 11
 @end example
 
+@anchor{state-8}
 As was announced in beginning of the report, @samp{State 8 conflicts:
 1 shift/reduce}:
 
 @example
 State 8
 
-    1 exp: exp . '+' exp
-    1    | exp '+' exp .
-    2    | exp . '-' exp
-    3    | exp . '*' exp
-    4    | exp . '/' exp
+    1 exp: exp • '+' exp
+    1    | exp '+' exp •
+    2    | exp • '-' exp
+    3    | exp • '*' exp
+    4    | exp • '/' exp
 
     '*'  shift, and go to state 6
     '/'  shift, and go to state 7
@@ -9675,9 +10649,8 @@
 NUM}, which corresponds to reducing rule 1.
 
 Because in deterministic parsing a single decision can be made, Bison
-arbitrarily chose to disable the reduction, see @ref{Shift/Reduce, ,
-Shift/Reduce Conflicts}.  Discarded actions are reported between
-square brackets.
+arbitrarily chose to disable the reduction, see @ref{Shift/Reduce}.
+Discarded actions are reported between square brackets.
 
 Note that all the previous states had a single possible action: either
 shifting the next token and going to the corresponding state, or
@@ -9695,11 +10668,11 @@
 @example
 State 8
 
-    1 exp: exp . '+' exp
-    1    | exp '+' exp .  [$end, '+', '-', '/']
-    2    | exp . '-' exp
-    3    | exp . '*' exp
-    4    | exp . '/' exp
+    1 exp: exp • '+' exp
+    1    | exp '+' exp •  [$end, '+', '-', '/']
+    2    | exp • '-' exp
+    3    | exp • '*' exp
+    4    | exp • '/' exp
 
     '*'  shift, and go to state 6
     '/'  shift, and go to state 7
@@ -9720,6 +10693,56 @@
 Conflict between rule 1 and token '*' resolved as shift ('+' < '*').
 @end example
 
+When given @option{--report=counterexamples}, @command{bison} will generate
+counterexamples within the report, augmented with the corresponding items
+(@pxref{Counterexamples}).
+
+@ifnottex
+@example
+shift/reduce conflict on token '/':
+    1 exp: exp '+' exp •
+    4 exp: exp • '/' exp
+@group
+  Example: exp '+' exp • '/' exp
+  Shift derivation
+    exp
+    ↳ 1: exp '+' exp
+                 ↳ 4: exp • '/' exp
+  Example: exp '+' exp • '/' exp
+  Reduce derivation
+    exp
+    ↳ 4: exp                 '/' exp
+         ↳ 1: exp '+' exp •
+@end group
+@end example
+@end ifnottex
+@iftex
+@example
+shift/reduce conflict on token '/':
+    1 exp: exp '+' exp •
+    4 exp: exp • '/' exp
+@group
+  Example: exp '+' exp • '/' exp
+  Shift derivation
+    exp
+    @arrow{} 1: exp '+' exp
+                  @arrow{} 4: exp • '/' exp
+  Example: exp '+' exp • '/' exp
+  Reduce derivation
+    exp
+    @arrow{} 4: exp                '/' exp
+          @arrow{} 1: exp '+' exp •
+@end group
+@end example
+@end iftex
+
+This shows two separate derivations in the grammar for the same @code{exp}:
+@samp{e1 + e2 / e3}.  The derivations show how your rules would parse the
+given example. Here, the first derivation completes a reduction when seeing
+@samp{/}, causing @samp{e1 + e2} to be grouped as an @code{exp}. The second
+derivation shifts on @samp{/}, resulting in @samp{e2 / e3} being grouped as
+an @code{exp}.  Therefore, it is easy to see that adding
+precedence/associativity directives would fix this conflict.
 
 The remaining states are similar:
 
@@ -9727,11 +10750,11 @@
 @group
 State 9
 
-    1 exp: exp . '+' exp
-    2    | exp . '-' exp
-    2    | exp '-' exp .
-    3    | exp . '*' exp
-    4    | exp . '/' exp
+    1 exp: exp • '+' exp
+    2    | exp • '-' exp
+    2    | exp '-' exp •
+    3    | exp • '*' exp
+    4    | exp • '/' exp
 
     '*'  shift, and go to state 6
     '/'  shift, and go to state 7
@@ -9743,11 +10766,11 @@
 @group
 State 10
 
-    1 exp: exp . '+' exp
-    2    | exp . '-' exp
-    3    | exp . '*' exp
-    3    | exp '*' exp .
-    4    | exp . '/' exp
+    1 exp: exp • '+' exp
+    2    | exp • '-' exp
+    3    | exp • '*' exp
+    3    | exp '*' exp •
+    4    | exp • '/' exp
 
     '/'  shift, and go to state 7
 
@@ -9758,11 +10781,11 @@
 @group
 State 11
 
-    1 exp: exp . '+' exp
-    2    | exp . '-' exp
-    3    | exp . '*' exp
-    4    | exp . '/' exp
-    4    | exp '/' exp .
+    1 exp: exp • '+' exp
+    2    | exp • '-' exp
+    3    | exp • '*' exp
+    4    | exp • '/' exp
+    4    | exp '/' exp •
 
     '+'  shift, and go to state 4
     '-'  shift, and go to state 5
@@ -9783,7 +10806,7 @@
 also because the associativity of @samp{/} is not specified.
 
 Bison may also produce an HTML version of this output, via an XML file and
-XSLT processing (@pxref{Xml,,Visualizing your parser in multiple formats}).
+XSLT processing (@pxref{Xml}).
 
 @c ================================================= Graphical Representation
 
@@ -9800,12 +10823,11 @@
 to help them understand LR parsers.
 
 This file is generated when the @option{--graph} option is specified
-(@pxref{Invocation, , Invoking Bison}).  Its name is made by removing
+(@pxref{Invocation}).  Its name is made by removing
 @samp{.tab.c} or @samp{.c} from the parser implementation file name, and
 adding @samp{.gv} instead.  If the grammar file is @file{foo.y}, the
 Graphviz output file is called @file{foo.gv}.  A DOT file may also be
-produced via an XML file and XSLT processing (@pxref{Xml,,Visualizing your
-parser in multiple formats}).
+produced via an XML file and XSLT processing (@pxref{Xml}).
 
 
 The following grammar file, @file{rr.y}, will be used in the sequel:
@@ -9824,8 +10846,8 @@
 (see @ref{fig:graph})
 @end ifnotinfo
 is very similar to the textual one, and as such it is easier understood by
-making direct comparisons between them.  @xref{Debugging, , Debugging Your
-Parser}, for a detailed analysis of the textual report.
+making direct comparisons between them.  @xref{Debugging}, for a detailed
+analysis of the textual report.
 
 @ifnotinfo
 @float Figure,fig:graph
@@ -9836,9 +10858,9 @@
 
 @subheading Graphical Representation of States
 
-The items (pointed rules) for each state are grouped together in graph nodes.
-Their numbering is the same as in the verbose file. See the following points,
-about transitions, for examples
+The items (dotted rules) for each state are grouped together in graph nodes.
+Their numbering is the same as in the verbose file. See the following
+points, about transitions, for examples
 
 When invoked with @option{--report=lookaheads}, the lookahead tokens, when
 needed, are shown next to the relevant rule between square brackets as a
@@ -9859,7 +10881,7 @@
 @group
 State 3
 
-    1 exp: a . ";"
+    1 exp: a • ";"
 
     ";"  shift, and go to state 6
 @end group
@@ -9880,8 +10902,8 @@
 @example
 State 1
 
-    3 a: "0" .  [";"]
-    4 b: "0" .  ["."]
+    3 a: "0" •  [";"]
+    4 b: "0" •  ["."]
 
     "."       reduce using rule 4 (b)
     $default  reduce using rule 3 (a)
@@ -9893,7 +10915,7 @@
 
 When unresolved conflicts are present, because in deterministic parsing
 a single decision can be made, Bison can arbitrarily choose to disable a
-reduction, see @ref{Shift/Reduce, , Shift/Reduce Conflicts}.  Discarded actions
+reduction, see @ref{Shift/Reduce}.  Discarded actions
 are distinguished by a red filling color on these nodes, just like how they are
 reported between square brackets in the verbose file.
 
@@ -9912,9 +10934,9 @@
 @cindex xml
 
 Bison supports two major report formats: textual output
-(@pxref{Understanding, ,Understanding Your Parser}) when invoked
+(@pxref{Understanding}) when invoked
 with option @option{--verbose}, and DOT
-(@pxref{Graphviz,, Visualizing Your Parser}) when invoked with
+(@pxref{Graphviz}) when invoked with
 option @option{--graph}. However,
 another alternative is to output an XML file that may then be, with
 @command{xsltproc}, rendered as either a raw text format equivalent to the
@@ -9924,7 +10946,7 @@
 @command{bison} with options @option{--verbose} or @option{--graph}.
 
 The XML file is generated when the options @option{-x} or
-@option{--xml[=FILE]} are specified, see @ref{Invocation,,Invoking Bison}.
+@option{--xml[=FILE]} are specified, see @ref{Invocation}.
 If not specified, its name is made by removing @samp{.tab.c} or @samp{.c}
 from the parser implementation file name, and adding @samp{.xml} instead.
 For instance, if the grammar file is @file{foo.y}, the default XML output
@@ -9966,112 +10988,114 @@
 @menu
 * Enabling Traces::    Activating run-time trace support
 * Mfcalc Traces::      Extending @code{mfcalc} to support traces
-* The YYPRINT Macro::  Obsolete interface for semantic value reports
 @end menu
 
 @node Enabling Traces
 @subsection  Enabling Traces
-There are several means to enable compilation of trace facilities:
+There are several means to enable compilation of trace facilities, in
+decreasing order of preference:
 
 @table @asis
-@item the macro @code{YYDEBUG}
-@findex YYDEBUG
-Define the macro @code{YYDEBUG} to a nonzero value when you compile the
-parser.  This is compliant with POSIX Yacc.  You could use
-@samp{-DYYDEBUG=1} as a compiler option or you could put @samp{#define
-YYDEBUG 1} in the prologue of the grammar file (@pxref{Prologue, , The
-Prologue}).
-
-If the @code{%define} variable @code{api.prefix} is used (@pxref{Multiple
-Parsers, ,Multiple Parsers in the Same Program}), for instance @samp{%define
-api.prefix x}, then if @code{CDEBUG} is defined, its value controls the
-tracing feature (enabled if and only if nonzero); otherwise tracing is
-enabled if and only if @code{YYDEBUG} is nonzero.
-
-@item the option @option{-t} (POSIX Yacc compliant)
-@itemx the option @option{--debug} (Bison extension)
-Use the @samp{-t} option when you run Bison (@pxref{Invocation, ,Invoking
-Bison}).  With @samp{%define api.prefix @{c@}}, it defines @code{CDEBUG} to 1,
-otherwise it defines @code{YYDEBUG} to 1.
-
-@item the directive @samp{%debug}
-@findex %debug
-Add the @code{%debug} directive (@pxref{Decl Summary, ,Bison Declaration
-Summary}).  This Bison extension is maintained for backward
-compatibility with previous versions of Bison.
-
 @item the variable @samp{parse.trace}
 @findex %define parse.trace
 Add the @samp{%define parse.trace} directive (@pxref{%define
-Summary,,parse.trace}), or pass the @option{-Dparse.trace} option
-(@pxref{Tuning the Parser}).  This is a Bison extension, which is especially
-useful for languages that don't use a preprocessor.  Unless POSIX and Yacc
-portability matter to you, this is the preferred solution.
+Summary}), or pass the @option{-Dparse.trace} option
+(@pxref{Tuning the Parser}).  This is a Bison extension.  Unless POSIX and
+Yacc portability matter to you, this is the preferred solution.
+
+@item the option @option{-t} (POSIX Yacc compliant)
+@itemx the option @option{--debug} (Bison extension)
+Use the @option{-t} option when you run Bison (@pxref{Invocation}).  With
+@samp{%define api.prefix @{c@}}, it defines @code{CDEBUG} to 1, otherwise it
+defines @code{YYDEBUG} to 1.
+
+@item the directive @samp{%debug} (deprecated)
+@findex %debug
+Add the @code{%debug} directive (@pxref{Decl Summary}).  This Bison
+extension is maintained for backward compatibility; use @code{%define
+parse.trace} instead.
+
+@item the macro @code{YYDEBUG} (C/C++ only)
+@findex YYDEBUG
+Define the macro @code{YYDEBUG} to a nonzero value when you compile the
+parser.  This is compliant with POSIX Yacc.  You could use
+@option{-DYYDEBUG=1} as a compiler option or you could put @samp{#define
+YYDEBUG 1} in the prologue of the grammar file (@pxref{Prologue}).
+
+If the @code{%define} variable @code{api.prefix} is used (@pxref{Multiple
+Parsers}), for instance @samp{%define
+api.prefix @{c@}}, then if @code{CDEBUG} is defined, its value controls the
+tracing feature (enabled if and only if nonzero); otherwise tracing is
+enabled if and only if @code{YYDEBUG} is nonzero.
+
+In C++, where POSIX compliance makes no sense, avoid this option, and prefer
+@samp{%define parse.trace}.  If you @code{#define} the @code{YYDEBUG} macro
+at the wrong place (e.g., in @samp{%code top} instead of @samp{%code
+require}), the parser class will have two different definitions, thus
+leading to ODR violations and happy debugging times.
 @end table
 
 We suggest that you always enable the trace option so that debugging is
 always possible.
 
 @findex YYFPRINTF
-The trace facility outputs messages with macro calls of the form
-@code{YYFPRINTF (stderr, @var{format}, @var{args})} where
-@var{format} and @var{args} are the usual @code{printf} format and variadic
-arguments.  If you define @code{YYDEBUG} to a nonzero value but do not
-define @code{YYFPRINTF}, @code{<stdio.h>} is automatically included
-and @code{YYFPRINTF} is defined to @code{fprintf}.
+In C the trace facility outputs messages with macro calls of the form
+@code{YYFPRINTF (stderr, @var{format}, @var{args})} where @var{format} and
+@var{args} are the usual @code{printf} format and variadic arguments.  If
+you define @code{YYDEBUG} to a nonzero value but do not define
+@code{YYFPRINTF}, @code{<stdio.h>} is automatically included and
+@code{YYFPRINTF} is defined to @code{fprintf}.
 
-Once you have compiled the program with trace facilities, the way to
-request a trace is to store a nonzero value in the variable @code{yydebug}.
-You can do this by making the C code do it (in @code{main}, perhaps), or
-you can alter the value with a C debugger.
+Once you have compiled the program with trace facilities, the way to request
+a trace is to store a nonzero value in the variable @code{yydebug}.  You can
+do this by making the C code do it (in @code{main}, perhaps), or you can
+alter the value with a C debugger.
 
-Each step taken by the parser when @code{yydebug} is nonzero produces a
-line or two of trace information, written on @code{stderr}.  The trace
-messages tell you these things:
+Each step taken by the parser when @code{yydebug} is nonzero produces a line
+or two of trace information, written on @code{stderr}.  The trace messages
+tell you these things:
 
 @itemize @bullet
 @item
 Each time the parser calls @code{yylex}, what kind of token was read.
 
 @item
-Each time a token is shifted, the depth and complete contents of the
-state stack (@pxref{Parser States}).
+Each time a token is shifted, the depth and complete contents of the state
+stack (@pxref{Parser States}).
 
 @item
-Each time a rule is reduced, which rule it is, and the complete contents
-of the state stack afterward.
+Each time a rule is reduced, which rule it is, and the complete contents of
+the state stack afterward.
 @end itemize
 
 To make sense of this information, it helps to refer to the automaton
-description file (@pxref{Understanding, ,Understanding Your Parser}).
-This file shows the meaning of each state in terms of
-positions in various rules, and also what each state will do with each
-possible input token.  As you read the successive trace messages, you
-can see that the parser is functioning according to its specification in
-the listing file.  Eventually you will arrive at the place where
-something undesirable happens, and you will see which parts of the
-grammar are to blame.
+description file (@pxref{Understanding}).  This
+file shows the meaning of each state in terms of positions in various rules,
+and also what each state will do with each possible input token.  As you
+read the successive trace messages, you can see that the parser is
+functioning according to its specification in the listing file.  Eventually
+you will arrive at the place where something undesirable happens, and you
+will see which parts of the grammar are to blame.
 
-The parser implementation file is a C/C++/Java program and you can use
+The parser implementation file is a C/C++/D/Java program and you can use
 debuggers on it, but it's not easy to interpret what it is doing.  The
-parser function is a finite-state machine interpreter, and aside from
-the actions it executes the same code over and over.  Only the values
-of variables show where in the grammar it is working.
+parser function is a finite-state machine interpreter, and aside from the
+actions it executes the same code over and over.  Only the values of
+variables show where in the grammar it is working.
 
 @node Mfcalc Traces
 @subsection Enabling Debug Traces for @code{mfcalc}
 
-The debugging information normally gives the token type of each token read,
+The debugging information normally gives the token kind of each token read,
 but not its semantic value.  The @code{%printer} directive allows specify
-how semantic values are reported, see @ref{Printer Decl, , Printing
-Semantic Values}.
+how semantic values are reported, see @ref{Printer Decl}.
 
 As a demonstration of @code{%printer}, consider the multi-function
 calculator, @code{mfcalc} (@pxref{Multi-function Calc}).  To enable run-time
 traces, and semantic value reports, insert the following directives in its
 prologue:
 
-@comment file: mfcalc.y: 2
+@comment file: c/mfcalc/mfcalc.y: 2
 @example
 /* Generate the parser description file. */
 %verbose
@@ -10118,7 +11142,8 @@
 
 Then the parser calls the scanner.
 @example
-Reading a token: Next token is token FUN (sin())
+Reading a token
+Next token is token FUN (sin())
 Shifting token FUN (sin())
 Entering state 6
 @end example
@@ -10130,10 +11155,12 @@
 something about it.
 
 @example
-Reading a token: Next token is token '(' ()
+Reading a token
+Next token is token '(' ()
 Shifting token '(' ()
 Entering state 14
-Reading a token: Next token is token NUM (1.000000)
+Reading a token
+Next token is token NUM (1.000000)
 Shifting token NUM (1.000000)
 Entering state 4
 Reducing stack by rule 6 (line 44):
@@ -10149,10 +11176,12 @@
 @code{exp} have @samp{1} as value.
 
 @example
-Reading a token: Next token is token '-' ()
+Reading a token
+Next token is token '-' ()
 Shifting token '-' ()
 Entering state 17
-Reading a token: Next token is token NUM (1.000000)
+Reading a token
+Next token is token NUM (1.000000)
 Shifting token NUM (1.000000)
 Entering state 4
 Reducing stack by rule 6 (line 44):
@@ -10160,7 +11189,8 @@
 -> $$ = nterm exp (1.000000)
 Stack now 0 1 6 14 24 17
 Entering state 26
-Reading a token: Next token is token ')' ()
+Reading a token
+Next token is token ')' ()
 Reducing stack by rule 11 (line 49):
    $1 = nterm exp (1.000000)
    $2 = token '-' ()
@@ -10193,7 +11223,8 @@
 display its result.
 
 @example
-Reading a token: Next token is token '\n' ()
+Reading a token
+Next token is token '\n' ()
 Shifting token '\n' ()
 Entering state 22
 Reducing stack by rule 4 (line 40):
@@ -10216,7 +11247,8 @@
 completion of the parsing.
 
 @example
-Reading a token: Now at end of input.
+Reading a token
+Now at end of input.
 Shifting token $end ()
 Entering state 2
 Stack now 0 1 2
@@ -10225,50 +11257,6 @@
 @end example
 
 
-@node The YYPRINT Macro
-@subsection The @code{YYPRINT} Macro
-@findex YYPRINT
-
-The @code{%printer} directive was introduced in Bison 1.50 (Novembre 2002).
-Before then, @code{YYPRINT} provided a similar feature, but only for
-terminal symbols and only with the @file{yacc.c} skeleton.
-
-@deffn {Macro} YYPRINT (@var{stream}, @var{token}, @var{value});
-@findex YYPRINT
-Deprecated, will be removed eventually.
-
-If you define @code{YYPRINT}, it should take three arguments.  The parser
-will pass a standard I/O stream, the numeric code for the token type, and
-the token value (from @code{yylval}).
-
-For @file{yacc.c} only.  Obsoleted by @code{%printer}.
-@end deffn
-
-Here is an example of @code{YYPRINT} suitable for the multi-function
-calculator (@pxref{Mfcalc Declarations, ,Declarations for @code{mfcalc}}):
-
-@example
-%@{
-  static void print_token_value (FILE *file, int type, YYSTYPE value);
-  #define YYPRINT(File, Type, Value)            \
-    print_token_value (File, Type, Value)
-%@}
-
-@dots{} %% @dots{} %% @dots{}
-
-static void
-print_token_value (FILE *file, int type, YYSTYPE value)
-@{
-  if (type == VAR)
-    fprintf (file, "%s", value.tptr->name);
-  else if (type == NUM)
-    fprintf (file, "%d", value.val);
-@}
-@end example
-
-@xref{Mfcalc Traces, ,Enabling Debug Traces for @code{mfcalc}}, for the
-proper use of @code{%printer}.
-
 @c ================================================= Invoking Bison
 
 @node Invocation
@@ -10292,7 +11280,7 @@
 @file{foo.ypp} or @file{foo.y++}.  Then, the output files will take an
 extension like the given one as input (respectively @file{foo.tab.cpp} and
 @file{foo.tab.c++}).  This feature takes effect with all options that
-manipulate file names like @samp{-o} or @samp{-d}.
+manipulate file names like @option{-o} or @option{-d}.
 
 For example:
 
@@ -10312,6 +11300,26 @@
 a shell script called @command{yacc} that invokes Bison with the @option{-y}
 option.
 
+@sp 1
+
+The exit status of @command{bison} is:
+@table @asis
+@item 0 (success)
+when there were no errors.  Warnings, which are diagnostics about dubious
+constructs, do not change the exit status, unless they are turned into
+errors (@pxref{Werror,,@option{-Werror}}).
+
+@item 1 (failure)
+when there were errors.  No file was generated (except the reports generated
+by @option{--verbose}, etc.).  In particular, the output files that possibly
+existed were not changed.
+
+@item 63 (mismatch)
+when @command{bison} does not meet the version requirements of the grammar
+file. @xref{Require Decl}.  No file was generated or changed.
+@end table
+
+
 @menu
 * Bison Options::     All the options described in detail,
                         in alphabetical order by short options.
@@ -10323,10 +11331,10 @@
 @section Bison Options
 
 Bison supports both traditional single-letter options and mnemonic long
-option names.  Long option names are indicated with @samp{--} instead of
-@samp{-}.  Abbreviations for option names are allowed as long as they
+option names.  Long option names are indicated with @option{--} instead of
+@option{-}.  Abbreviations for option names are allowed as long as they
 are unique.  When a long option takes an argument, like
-@samp{--file-prefix}, connect the option name and the argument with
+@option{--file-prefix}, connect the option name and the argument with
 @samp{=}.
 
 Here is a list of options that can be used with Bison.  It is followed by a
@@ -10358,7 +11366,7 @@
 Print the name of the directory containing locale-dependent data.
 
 @item --print-datadir
-Print the name of the directory containing skeletons and XSLT.
+Print the name of the directory containing skeletons, CSS and XSLT.
 
 @item -u
 @item --update
@@ -10536,15 +11544,22 @@
 Output warnings falling in @var{category}.  @var{category} can be one
 of:
 @table @code
-@item conflicts-sr
-@itemx conflicts-rr
+@item @anchor{Wconflicts-sr}conflicts-sr
+@itemx @anchor{Wconflicts-rr}conflicts-rr
 S/R and R/R conflicts.  These warnings are enabled by default.  However, if
 the @code{%expect} or @code{%expect-rr} directive is specified, an
 unexpected number of conflicts is an error, and an expected number of
 conflicts is not reported, so @option{-W} and @option{--warning} then have
 no effect on the conflict report.
 
-@item dangling-alias
+@item @anchor{Wcounterexamples}counterexamples
+@itemx cex
+Provide counterexamples for conflicts.  @xref{Counterexamples}.
+Counterexamples take time to compute.  The option @option{-Wcex} should be
+used by the developer when working on the grammar; it hardly makes sense to
+use it in a CI.
+
+@item @anchor{Wdangling-alias}dangling-alias
 Report string literals that are not bound to a token symbol.
 
 String literals, which allow for better error messages, are (too) liberally
@@ -10579,7 +11594,7 @@
 @end example
 
 @noindent
-@command{bison -Wdangling-alias} reports
+@samp{bison -Wdangling-alias} reports
 
 @example
 @dwarning{warning}: string literal not attached to a symbol
@@ -10590,16 +11605,16 @@
       |      @dwarning{^~~~~}
 @end example
 
-@item deprecated
+@item @anchor{Wdeprecated}deprecated
 Deprecated constructs whose support will be removed in future versions of
 Bison.
 
-@item empty-rule
+@item @anchor{Wempty-rule}empty-rule
 Empty rules without @code{%empty}.  @xref{Empty Rules}.  Disabled by
 default, but enabled by uses of @code{%empty}, unless
 @option{-Wno-empty-rule} was specified.
 
-@item midrule-values
+@item @anchor{Wmidrule-values}midrule-values
 Warn about midrule values that are set but not used within any of the actions
 of the parent rule.
 For example, warn about unused @code{$2} in:
@@ -10619,7 +11634,7 @@
 be false alarms in existing grammars employing the Yacc constructs
 @code{$0} or @code{$-@var{n}} (where @var{n} is some positive integer).
 
-@item precedence
+@item @anchor{Wprecedence}precedence
 Useless precedence and associativity directives.  Disabled by default.
 
 Consider for instance the following grammar:
@@ -10642,9 +11657,9 @@
 @group
 exp:
   exp "+" exp
-| exp "*" "num"
+| exp "*" "number"
 | "(" exp ")"
-| "num"
+| "number"
 ;
 @end group
 @end example
@@ -10680,20 +11695,21 @@
 @end group
 @end example
 
-@item yacc
+@item @anchor{Wyacc}yacc
 Incompatibilities with POSIX Yacc.
 
-@item other
+@item @anchor{Wother}other
 All warnings not categorized above.  These warnings are enabled by default.
 
 This category is provided merely for the sake of completeness.  Future
 releases of Bison may move warnings from this category to new, more specific
 categories.
 
-@item all
-All the warnings except @code{dangling-alias} and @code{yacc}.
+@item @anchor{Wall}all
+All the warnings except @code{counterexamples}, @code{dangling-alias} and
+@code{yacc}.
 
-@item none
+@item @anchor{Wnone}none
 Turn off all the warnings.
 
 @item error
@@ -10704,7 +11720,7 @@
 instance, @option{-Wno-yacc} will hide the warnings about
 POSIX Yacc incompatibilities.
 
-@item -Werror
+@item @anchor{Werror}-Werror
 Turn enabled warnings for every @var{category} into errors, unless they are
 explicitly disabled by @option{-Wno-error=@var{category}}.
 
@@ -10770,7 +11786,7 @@
 @itemx --debug
 In the parser implementation file, define the macro @code{YYDEBUG} to 1 if
 it is not already defined, so that the debugging facilities are compiled.
-@xref{Tracing, ,Tracing Your Parser}.
+@xref{Tracing}.
 
 @item -D @var{name}[=@var{value}]
 @itemx --define=@var{name}[=@var{value}]
@@ -10809,9 +11825,8 @@
 @item -L @var{language}
 @itemx --language=@var{language}
 Specify the programming language for the generated parser, as if
-@code{%language} was specified (@pxref{Decl Summary, , Bison Declaration
-Summary}).  Currently supported languages include C, C++, and Java.
-@var{language} is case-insensitive.
+@code{%language} was specified (@pxref{Decl Summary}).  Currently supported
+languages include C, C++, D and Java.  @var{language} is case-insensitive.
 
 @item --locations
 Pretend that @code{%locations} was specified.  @xref{Decl Summary}.
@@ -10819,8 +11834,9 @@
 @item -p @var{prefix}
 @itemx --name-prefix=@var{prefix}
 Pretend that @code{%name-prefix "@var{prefix}"} was specified (@pxref{Decl
-Summary}).  Obsoleted by @option{-Dapi.prefix=@var{prefix}}.  @xref{Multiple
-Parsers, ,Multiple Parsers in the Same Program}.
+Summary}).  The option @option{-p} is specified by POSIX.  When POSIX
+compatibility is not a requirement, @option{-Dapi.prefix=@var{prefix}} is a
+better option (@pxref{Multiple Parsers}).
 
 @item -l
 @itemx --no-lines
@@ -10834,7 +11850,7 @@
 @item -S @var{file}
 @itemx --skeleton=@var{file}
 Specify the skeleton to use, similar to @code{%skeleton}
-(@pxref{Decl Summary, , Bison Declaration Summary}).
+(@pxref{Decl Summary}).
 
 @c You probably don't need this option unless you are developing Bison.
 @c You should use @option{--language} if you want to specify the skeleton for a
@@ -10852,27 +11868,49 @@
 Pretend that @code{%token-table} was specified.  @xref{Decl Summary}.
 
 @item -y
-@itemx --yacc
-Act more like the traditional @command{yacc} command.  This can cause
-different diagnostics to be generated (it implies @option{-Wyacc}), and may
-change behavior in other minor ways.  Most importantly, imitate Yacc's
-output file name conventions, so that the parser implementation file is
-called @file{y.tab.c}, and the other outputs are called @file{y.output} and
-@file{y.tab.h}.  Also, if generating a deterministic parser in C, generate
-@code{#define} statements in addition to an @code{enum} to associate token
-numbers with token names.  Thus, the following shell script can substitute
-for Yacc, and the Bison distribution contains such a script for
-compatibility with POSIX:
+@itemx @anchor{option-yacc} --yacc
+Act more like the traditional @command{yacc} command:
+@itemize
+@item
+Generate different diagnostics (it implies @option{-Wyacc}).
+@item
+Generate @code{#define} statements in addition to an @code{enum} to
+associate token codes with token kind names.
+@item
+If the @code{POSIXLY_CORRECT} environment variable is defined, generate
+prototypes for @code{yyerror} and @code{yylex}@footnote{See
+@url{https://austingroupbugs.net/view.php?id=1388#c5220}.} (since Bison
+3.8):
+@example
+int yylex (void);
+void yyerror (const char *);
+@end example
+As a Bison extension, additional arguments required by @code{%pure-parser},
+@code{%locations}, @code{%lex-param} and @code{%parse-param} are taken into
+account.  You may disable @code{yyerror}'s prototype with @samp{#define
+yyerror yyerror} (as specified by POSIX), or with @samp{#define
+YYERROR_IS_DECLARED} (a Bison extension).  Likewise for @code{yylex}.
+@item
+Imitate Yacc's output file name conventions, so that the parser
+implementation file is called @file{y.tab.c}, and the other outputs are
+called @file{y.output} and @file{y.tab.h}.  Do not use @option{--yacc} just
+to change the output file names since it also triggers all the
+aforementioned behavior changes; rather use @samp{-o y.tab.c}.
+@end itemize
+
+The @option{-y}/@option{--yacc} option is intended for use with traditional
+Yacc grammars.  This option only makes sense for the default C skeleton,
+@file{yacc.c}.  If your grammar uses Bison extensions Bison cannot be
+Yacc-compatible, even if this option is specified.
+
+Thus, the following shell script can substitute for Yacc, and the Bison
+distribution contains such a @command{yacc} script for compatibility with
+POSIX:
 
 @example
 #! /bin/sh
 bison -y "$@@"
 @end example
-
-The @option{-y}/@option{--yacc} option is intended for use with traditional
-Yacc grammars.  If your grammar uses Bison extensions like
-@samp{%glr-parser}, Bison might not be Yacc-compatible even if this option
-is specified.
 @end table
 
 @node Output Files
@@ -10882,15 +11920,19 @@
 
 @c Please, keep this ordered as in 'bison --help'.
 @table @option
+@item -H [@var{file}]
+@itemx --header=[@var{file}]
+Pretend that @code{%header} was specified, i.e., write an extra output file
+containing definitions for the token kind names defined in the grammar, as
+well as a few other declarations.  @xref{Decl Summary}.
+
 @item --defines[=@var{file}]
-Pretend that @code{%defines} was specified, i.e., write an extra output
-file containing macro definitions for the token type names defined in
-the grammar, as well as a few other declarations.  @xref{Decl Summary}.
+Historical name for option @option{--header} before Bison 3.8.
 
 @item -d
-This is the same as @option{--defines} except @option{-d} does not accept a
-@var{file} argument since POSIX Yacc requires that @option{-d} can be bundled
-with other short options.
+This is the same as @option{--header} except @option{-d} does not accept a
+@var{file} argument since POSIX Yacc requires that @option{-d} can be
+bundled with other short options.
 
 @item -b @var{file-prefix}
 @itemx --file-prefix=@var{prefix}
@@ -10919,6 +11961,13 @@
 Implies @code{state}.  Explain how conflicts were solved thanks to
 precedence and associativity directives.
 
+@item counterexamples
+@itemx cex
+Look for counterexamples for the conflicts.  @xref{Counterexamples}.
+Counterexamples take time to compute.  The option @option{-rcex} should be
+used by the developer when working on the grammar; it hardly makes sense to
+use it in a CI.
+
 @item all
 Enable all the items.
 
@@ -10939,17 +11988,16 @@
 @itemx --output=@var{file}
 Specify the @var{file} for the parser implementation file.
 
-The other output files' names are constructed from @var{file} as
-described under the @samp{-v} and @samp{-d} options.
+The names of the other output files are constructed from @var{file} as
+described under the @option{-v} and @option{-d} options.
 
 @item -g [@var{file}]
 @itemx --graph[=@var{file}]
 Output a graphical representation of the parser's automaton computed by
-Bison, in @uref{http://www.graphviz.org/, Graphviz}
-@uref{http://www.graphviz.org/doc/info/lang.html, DOT} format.
+Bison, in @uref{https://www.graphviz.org/, Graphviz}
+@uref{https://www.graphviz.org/doc/info/lang.html, DOT} format.
 @code{@var{file}} is optional.  If omitted and the grammar file is
-@file{foo.y}, the output file will be @file{foo.gv} if the @code{%required}
-version is 3.4 or better, @file{foo.dot} otherwise.
+@file{foo.y}, the output file will be @file{foo.gv}.
 
 @item -x [@var{file}]
 @itemx --xml[=@var{file}]
@@ -10957,6 +12005,11 @@
 @code{@var{file}} is optional.
 If omitted and the grammar file is @file{foo.y}, the output file will be
 @file{foo.xml}.
+
+@item -M @var{old}=@var{new}
+@itemx --file-prefix-map=@var{old}=@var{new}
+Replace prefix @var{old} with @var{new} when writing file paths in output
+files.
 @end table
 
 @node Option Cross Key
@@ -11014,12 +12067,13 @@
 @node Other Languages
 @chapter Parsers Written In Other Languages
 
-In addition to C, Bison can generate parsers in C++ and Java.  This chapter
+In addition to C, Bison can generate parsers in C++, D and Java.  This chapter
 is devoted to these languages.  The reader is expected to understand how
 Bison works; read the introductory chapters first if you don't.
 
 @menu
 * C++ Parsers::                 The interface to generate C++ parser classes
+* D Parsers::                   The interface to generate D parser classes
 * Java Parsers::                The interface to generate Java parser classes
 @end menu
 
@@ -11035,6 +12089,7 @@
 * C++ Parser Interface::        Instantiating and running the parser
 * C++ Semantic Values::         %union vs. C++
 * C++ Location Values::         The position and location classes
+* C++ Parser Context::          You can supply a @code{report_syntax_error} function.
 * C++ Scanner Interface::       Exchanges between yylex and parse
 * A Complete C++ Example::      Demonstrating their use
 @end menu
@@ -11043,9 +12098,10 @@
 @subsection A Simple C++ Example
 
 This tutorial about C++ parsers is based on a simple, self contained
-example.  The following sections are the reference manual for Bison with
-C++, the last one showing a fully blown example (@pxref{A Complete C++
-Example}).
+example.@footnote{The sources of this example are available as
+@file{examples/c++/simple.yy}.}  The following sections are the reference
+manual for Bison with C++, the last one showing a fully blown example
+(@pxref{A Complete C++ Example}).
 
 To look nicer, our example will be in C++14.  It is not required: Bison
 supports the original C++98 standard.
@@ -11054,6 +12110,30 @@
 making sure we run a version of Bison which is recent enough, and that we
 generate C++.
 
+@ignore
+@comment file: c++/simple.yy: 1
+@example
+/* Simple variant-based parser.   -*- C++ -*-
+
+   Copyright (C) 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+@end example
+@end ignore
+
 @comment file: c++/simple.yy: 1
 @example
 %require "3.2"
@@ -11144,7 +12224,7 @@
 @sp 1
 
 Our scanner deserves some attention.  The traditional interface of
-@code{yylex} is not type safe: since the token type and the token value are
+@code{yylex} is not type safe: since the token kind and the token value are
 not correlated, you may return a @code{NUMBER} with a string as semantic
 value.  To avoid this, we use @emph{token constructors} (@pxref{Complete
 Symbols}).  This directive:
@@ -11156,17 +12236,7 @@
 
 @noindent
 requests that Bison generates the functions @code{make_TEXT} and
-@code{make_NUMBER}.  As a matter of fact, it is convenient to have also a
-symbol to mark the end of input, say @code{END_OF_FILE}:
-
-@comment file: c++/simple.yy: 1
-@example
-%token END_OF_FILE 0
-@end example
-
-@noindent
-The @code{0} tells Bison this token is special: when it is reached, parsing
-finishes.
+@code{make_NUMBER}, but also @code{make_YYEOF}, for the end of input.
 
 Everything is in place for our scanner:
 
@@ -11196,7 +12266,7 @@
 @end group
 @group
         default:
-          return parser::make_END_OF_FILE ();
+          return parser::make_YYEOF ();
 @end group
         @}
     @}
@@ -11250,14 +12320,14 @@
 namespace.
 @findex %define api.namespace
 Use the @samp{%define api.namespace} directive to change the namespace name,
-see @ref{%define Summary,,api.namespace}.  The various classes are generated
+see @ref{%define Summary}.  The various classes are generated
 in the following files:
 
 @table @file
 @item @var{file}.hh
 (Assuming the extension of the grammar file was @samp{.yy}.)  The
 declaration of the C++ parser class and auxiliary types.  By default, this
-file is not generated (@pxref{Decl Summary, ,%defines}).
+file is not generated (@pxref{Decl Summary}).
 
 @item @var{file}.cc
 The implementation of the C++ parser class.  The basename and extension of
@@ -11265,7 +12335,7 @@
 same rules as with regular C parsers (@pxref{Invocation}).
 
 @item location.hh
-Generated when both @code{%defines} and @code{%locations} are enabled, this
+Generated when both @code{%header} and @code{%locations} are enabled, this
 file contains the definition of the classes @code{position} and
 @code{location}, used for location tracking.  It is not generated if
 @samp{%define api.location.file none} is specified, or if user defined
@@ -11291,7 +12361,44 @@
 changed since it describes an additional member of the parser class, and an
 additional argument for its constructor.
 
-@defcv {Type} {parser} {semantic_type}
+
+@defcv {Type} {parser} {token}
+A structure that contains (only) the @code{token_kind_type} enumeration,
+which defines the tokens.  To refer to the token @code{FOO}, use
+@code{yy::parser::token::FOO}.  The scanner can use @samp{typedef
+yy::parser::token token;} to ``import'' the token enumeration (@pxref{Calc++
+Scanner}).
+@end defcv
+
+@defcv {Type} {parser} {token_kind_type}
+An enumeration of the token kinds.  Its enumerators are forged from the
+token names, with a possible token prefix
+(@pxref{api-token-prefix,,@code{api.token.prefix}}):
+
+@example
+/// Token kinds.
+struct token
+@{
+  enum token_kind_type
+  @{
+    YYEMPTY = -2,              // No token.
+    YYEOF = 0,                 // "end of file"
+    YYerror = 256,             // error
+    YYUNDEF = 257,             // "invalid token"
+    PLUS = 258,                // "+"
+    MINUS = 259,               // "-"
+    [...]
+    VAR = 271,                 // "variable"
+    NEG = 272                  // NEG
+  @};
+@};
+
+/// Token kind, as returned by yylex.
+typedef token::token_kind_type token_kind_type;
+@end example
+@end defcv
+
+@defcv {Type} {parser} {value_type}
 The types for semantic values. @xref{C++ Semantic Values}.
 @end defcv
 
@@ -11300,14 +12407,6 @@
 Values}.
 @end defcv
 
-@defcv {Type} {parser} {token}
-A structure that contains (only) the @code{yytokentype} enumeration, which
-defines the tokens.  To refer to the token @code{FOO}, use
-@code{yy::parser::token::FOO}.  The scanner can use @samp{typedef
-yy::parser::token token;} to ``import'' the token enumeration (@pxref{Calc++
-Scanner}).
-@end defcv
-
 @defcv {Type} {parser} {syntax_error}
 This class derives from @code{std::runtime_error}.  Throw instances of it
 from the scanner or from the actions to raise parse errors.  This is
@@ -11366,9 +12465,6 @@
 
 @node C++ Semantic Values
 @subsection C++ Semantic Values
-@c - No objects in unions
-@c - YYSTYPE
-@c - Printer and destructor
 
 Bison supports two different means to handle semantic values in C++.  One is
 alike the C interface, and relies on unions.  As C++ practitioners know,
@@ -11383,14 +12479,12 @@
 @node C++ Unions
 @subsubsection C++ Unions
 
-The @code{%union} directive works as for C, see @ref{Union Decl, ,The Union
-Declaration}.  In particular it produces a genuine @code{union}, which have
-a few specific features in C++.
+The @code{%union} directive works as for C, see @ref{Union Decl}.  In
+particular it produces a genuine @code{union}, which have a few specific
+features in C++.
 @itemize @minus
 @item
-The type @code{YYSTYPE} is defined but its use is discouraged: rather
-you should refer to the parser's encapsulated type
-@code{yy::parser::semantic_type}.
+The value type is @code{yy::parser::value_type}, not @code{YYSTYPE}.
 @item
 Non POD (Plain Old Data) types cannot be used.  C++98 forbids any instance
 of classes with constructors in unions: only @emph{pointers} to such objects
@@ -11399,8 +12493,7 @@
 
 Because objects have to be stored via pointers, memory is not
 reclaimed automatically: using the @code{%destructor} directive is the
-only means to avoid leaks.  @xref{Destructor Decl, , Freeing Discarded
-Symbols}.
+only means to avoid leaks.  @xref{Destructor Decl}.
 
 @node C++ Variants
 @subsubsection C++ Variants
@@ -11410,10 +12503,9 @@
 and in particular, object types can be used without pointers.
 
 To enable variant-based semantic values, set the @code{%define} variable
-@code{api.value.type} to @code{variant} (@pxref{%define Summary,,
-@code{api.value.type}}).  Then @code{%union} is ignored; instead of using
-the name of the fields of the @code{%union} to ``type'' the symbols, use
-genuine types.
+@code{api.value.type} to @code{variant} (@pxref{%define Summary}).  Then
+@code{%union} is ignored; instead of using the name of the fields of the
+@code{%union} to ``type'' the symbols, use genuine types.
 
 For instance, instead of:
 
@@ -11452,14 +12544,14 @@
 in midrule actions.  It is mandatory to use typed midrule actions
 (@pxref{Typed Midrule Actions}).
 
-@deftypemethod {semantic_type} {T&} {emplace<T>} ()
-@deftypemethodx {semantic_type} {T&} {emplace<T>} (@code{const T&} @var{t})
+@deftypemethod {value_type} {T&} {emplace<T>} ()
+@deftypemethodx {value_type} {T&} {emplace<T>} (@code{const T&} @var{t})
 Available in C++98/C++03 only.  Default construct/copy-construct from
 @var{t}.  Return a reference to where the actual value may be stored.
 Requires that the variant was not initialized yet.
 @end deftypemethod
 
-@deftypemethod {semantic_type} {T&} {emplace<T, U>} (@code{U&&...} @var{u})
+@deftypemethod {value_type} {T&} {emplace<T, U>} (@code{U&&...} @var{u})
 Available in C++11 and later only.  Build a variant of type @code{T} from
 the variadic forwarding references @var{u...}.
 @end deftypemethod
@@ -11497,10 +12589,6 @@
 
 @node C++ Location Values
 @subsection C++ Location Values
-@c - %locations
-@c - class position
-@c - class location
-@c - %define filename_type "const symbol::Symbol"
 
 When the directive @code{%locations} is used, the C++ parser supports
 location tracking, see @ref{Tracking Locations}.
@@ -11522,25 +12610,28 @@
 @node C++ position
 @subsubsection C++ @code{position}
 
+@defcv {Type} {position} {filename_type}
+The base type for file names. Defaults to @code{const std::string}.
+@xref{api-filename-type,,@code{api.filename.type}}, to change its definition.
+@end defcv
+
 @defcv {Type} {position} {counter_type}
 The type used to store line and column numbers.  Defined as @code{int}.
 @end defcv
 
-@deftypeop {Constructor} {position} {} position (@code{std::string*} @var{file} = nullptr, @code{counter_type} @var{line} = 1, @code{counter_type} @var{col} = 1)
+@deftypeop {Constructor} {position} {} position (@code{filename_type*} @var{file} = nullptr, @code{counter_type} @var{line} = 1, @code{counter_type} @var{col} = 1)
 Create a @code{position} denoting a given point.  Note that @code{file} is
 not reclaimed when the @code{position} is destroyed: memory managed must be
 handled elsewhere.
 @end deftypeop
 
-@deftypemethod {position} {void} initialize (@code{std::string*} @var{file} = nullptr, @code{counter_type} @var{line} = 1, @code{counter_type} @var{col} = 1)
+@deftypemethod {position} {void} initialize (@code{filename_type*} @var{file} = nullptr, @code{counter_type} @var{line} = 1, @code{counter_type} @var{col} = 1)
 Reset the position to the given values.
 @end deftypemethod
 
-@deftypeivar {position} {std::string*} file
+@deftypeivar {position} {filename_type*} file
 The name of the file.  It will always be handled as a pointer, the parser
-will never duplicate nor deallocate it.  As an experimental feature you may
-change it to @samp{@var{type}*} using @samp{%define filename_type
-"@var{type}"}.
+will never duplicate nor deallocate it.
 @end deftypeivar
 
 @deftypeivar {position} {counter_type} line
@@ -11587,11 +12678,11 @@
 @end deftypeop
 
 @deftypeop {Constructor} {location} {} location (@code{const position&} @var{pos} = position())
-@deftypeopx {Constructor} {location} {} location (@code{std::string*} @var{file}, @code{counter_type} @var{line}, @code{counter_type} @var{col})
+@deftypeopx {Constructor} {location} {} location (@code{filename_type*} @var{file}, @code{counter_type} @var{line}, @code{counter_type} @var{col})
 Create a @code{Location} denoting an empty range located at a given point.
 @end deftypeop
 
-@deftypemethod {location} {void} initialize (@code{std::string*} @var{file} = nullptr, @code{counter_type} @var{line} = 1, @code{counter_type} @var{col} = 1)
+@deftypemethod {location} {void} initialize (@code{filename_type*} @var{file} = nullptr, @code{counter_type} @var{line} = 1, @code{counter_type} @var{col} = 1)
 Reset the location to an empty range at the given values.
 @end deftypemethod
 
@@ -11636,7 +12727,7 @@
 @node Exposing the Location Classes
 @subsubsection Exposing the Location Classes
 
-When both @code{%defines} and @code{%locations} are enabled, Bison generates
+When both @code{%header} and @code{%locations} are enabled, Bison generates
 an additional file: @file{location.hh}.  If you don't use locations outside
 of the parser, you may avoid its creation with @samp{%define
 api.location.file none}.
@@ -11725,7 +12816,7 @@
 parser @file{master/parser.yy} might use:
 
 @example
-%defines
+%header
 %locations
 %define api.namespace @{master::@}
 @end example
@@ -11740,6 +12831,117 @@
 @end example
 
 
+@node C++ Parser Context
+@subsection C++ Parser Context
+
+When @samp{%define parse.error custom} is used (@pxref{Syntax Error
+Reporting Function}), the user must define the following function.
+
+@deftypemethod {parser} {void} report_syntax_error (@code{const context_type&}@var{ctx}) @code{const}
+Report a syntax error to the user.  Whether it uses @code{yyerror} is up to
+the user.
+@end deftypemethod
+
+Use the following types and functions to build the error message.
+
+@defcv {Type} {parser} {context}
+A type that captures the circumstances of the syntax error.
+@end defcv
+
+@defcv {Type} {parser} {symbol_kind_type}
+An enum of all the grammar symbols, tokens and nonterminals.  Its
+enumerators are forged from the symbol names:
+
+@example
+struct symbol_kind
+@{
+  enum symbol_kind_type
+  @{
+    S_YYEMPTY = -2,      // No symbol.
+    S_YYEOF = 0,         // "end of file"
+    S_YYERROR = 1,       // error
+    S_YYUNDEF = 2,       // "invalid token"
+    S_PLUS = 3,          // "+"
+    S_MINUS = 4,         // "-"
+    [...]
+    S_VAR = 14,          // "variable"
+    S_NEG = 15,          // NEG
+    S_YYACCEPT = 16,     // $accept
+    S_exp = 17,          // exp
+    S_input = 18         // input
+  @};
+@};
+typedef symbol_kind::symbol_kind_t symbol_kind_type;
+@end example
+@end defcv
+
+@deftypemethod {context} {const symbol_type&} lookahead () @code{const}
+The ``unexpected'' token: the lookahead that caused the syntax error.
+@end deftypemethod
+
+@deftypemethod {context} {symbol_kind_type} token () @code{const}
+The symbol kind of the lookahead token that caused the syntax error.  Returns
+@code{symbol_kind::S_YYEMPTY} if there is no lookahead.
+@end deftypemethod
+
+@deftypemethod {context} {const location&} location () @code{const}
+The location of the syntax error (that of the lookahead).
+@end deftypemethod
+
+@deftypemethod {context} int expected_tokens (@code{symbol_kind_type} @var{argv}@code{[]}, @code{int} @var{argc}) @code{const}
+Fill @var{argv} with the expected tokens, which never includes
+@code{symbol_kind::S_YYEMPTY}, @code{symbol_kind::S_YYERROR}, or
+@code{symbol_kind::S_YYUNDEF}.
+
+Never put more than @var{argc} elements into @var{argv}, and on success
+return the number of tokens stored in @var{argv}.  If there are more
+expected tokens than @var{argc}, fill @var{argv} up to @var{argc} and return
+0.  If there are no expected tokens, also return 0, but set @code{argv[0]}
+to @code{symbol_kind::S_YYEMPTY}.
+
+If @var{argv} is null, return the size needed to store all the possible
+values, which is always less than @code{YYNTOKENS}.
+@end deftypemethod
+
+@deftypemethod {parser} {const char *} symbol_name (@code{symbol_kind_t} @var{symbol}) @code{const}
+The name of the symbol whose kind is @var{symbol}, possibly translated.
+
+Returns a @code{std::string} when @code{parse.error} is @code{verbose}.
+@end deftypemethod
+
+A custom syntax error function looks as follows.  This implementation is
+inappropriate for internationalization, see the @file{c/bistromathic}
+example for a better alternative.
+
+@example
+void
+yy::parser::report_syntax_error (const context& ctx)
+@{
+  int res = 0;
+  std::cerr << ctx.location () << ": syntax error";
+  // Report the tokens expected at this point.
+  @{
+    enum @{ TOKENMAX = 5 @};
+    symbol_kind_type expected[TOKENMAX];
+    int n = ctx.expected_tokens (ctx, expected, TOKENMAX);
+    for (int i = 0; i < n; ++i)
+      std::cerr << i == 0 ? ": expected " : " or "
+                << symbol_name (expected[i]);
+  @}
+  // Report the unexpected token.
+  @{
+    symbol_kind_type lookahead = ctx.token ();
+    if (lookahead != symbol_kind::S_YYEMPTY)
+      std::cerr << " before " << symbol_name (lookahead));
+  @}
+  std::cerr << '\n';
+@}
+@end example
+
+You still must provide a @code{yyerror} function, used for instance to
+report memory exhaustion.
+
+
 @node C++ Scanner Interface
 @subsection C++ Scanner Interface
 @c - prefix for yylex.
@@ -11761,9 +12963,9 @@
 
 The generated parser expects @code{yylex} to have the following prototype.
 
-@deftypefun {int} yylex (@code{semantic_type*} @var{yylval}, @code{location_type*} @var{yylloc}, @var{type1} @var{arg1}, @dots{})
-@deftypefunx {int} yylex (@code{semantic_type*} @var{yylval}, @var{type1} @var{arg1}, @dots{})
-Return the next token.  Its type is the return value, its semantic value and
+@deftypefun {int} yylex (@code{value_type*} @var{yylval}, @code{location_type*} @var{yylloc}, @var{type1} @var{arg1}, @dots{})
+@deftypefunx {int} yylex (@code{value_type*} @var{yylval}, @var{type1} @var{arg1}, @dots{})
+Return the next token.  Its kind is the return value, its semantic value and
 location (if enabled) being @var{yylval} and @var{yylloc}.  Invocations of
 @samp{%lex-param @{@var{type1} @var{arg1}@}} yield additional arguments.
 @end deftypefun
@@ -11828,13 +13030,30 @@
 additional arguments.
 @end deftypefun
 
-For each token type, Bison generates named constructors as follows.
+@defcv {Type} {parser} {symbol_type}
+A ``complete symbol'', that binds together its kind, value and (when
+applicable) location.
+@end defcv
+
+@deftypemethod {symbol_type} {symbol_kind_type} kind () @code{const}
+The kind of this symbol.
+@end deftypemethod
+
+@deftypemethod {symbol_type} {const char *} name () @code{const}
+The name of the kind of this symbol.
+
+Returns a @code{std::string} when @code{parse.error} is @code{verbose}.
+@end deftypemethod
+
+@sp 1
+
+For each token kind, Bison generates named constructors as follows.
 
 @deftypeop  {Constructor} {parser::symbol_type} {} {symbol_type} (@code{int} @var{token}, @code{const @var{value_type}&} @var{value}, @code{const location_type&} @var{location})
 @deftypeopx {Constructor} {parser::symbol_type} {} {symbol_type} (@code{int} @var{token}, @code{const location_type&} @var{location})
 @deftypeopx {Constructor} {parser::symbol_type} {} {symbol_type} (@code{int} @var{token}, @code{const @var{value_type}&} @var{value})
 @deftypeopx {Constructor} {parser::symbol_type} {} {symbol_type} (@code{int} @var{token})
-Build a complete terminal symbol for the token type @var{token} (including
+Build a complete terminal symbol for the token kind @var{token} (including
 the @code{api.token.prefix}), whose semantic value, if it has one, is
 @var{value} of adequate @var{value_type}.  Pass the @var{location} iff
 location tracking is enabled.
@@ -11861,11 +13080,11 @@
 symbol_type (int token, const location_type&);
 @end example
 
-Correct matching between token types and value types is checked via
+Correct matching between token kinds and value types is checked via
 @code{assert}; for instance, @samp{symbol_type (ID, 42)} would abort.  Named
 constructors are preferable (see below), as they offer better type safety
 (for instance @samp{make_ID (42)} would not even compile), but symbol_type
-constructors may help when token types are discovered at run-time, e.g.,
+constructors may help when token kinds are discovered at run-time, e.g.,
 
 @example
 @group
@@ -11891,7 +13110,7 @@
 @deftypemethodx {parser} {symbol_type} {make_@var{token}} (@code{const location_type&} @var{location})
 @deftypemethodx {parser} {symbol_type} {make_@var{token}} (@code{const @var{value_type}&} @var{value})
 @deftypemethodx {parser} {symbol_type} {make_@var{token}} ()
-Build a complete terminal symbol for the token type @var{token} (not
+Build a complete terminal symbol for the token kind @var{token} (not
 including the @code{api.token.prefix}), whose semantic value, if it has one,
 is @var{value} of adequate @var{value_type}.  Pass the @var{location} iff
 location tracking is enabled.
@@ -11937,7 +13156,7 @@
 
 This section demonstrates the use of a C++ parser with a simple but complete
 example.  This example should be available on your system, ready to compile,
-in the directory @dfn{.../share/doc/bison/examples/calc++}.  It focuses on
+in the directory @file{examples/c++/calc++}.  It focuses on
 the use of Bison, therefore the design of the various C++ classes is very
 naive: no accessors, no encapsulation of members etc.  We will use a Lex
 scanner, and more precisely, a Flex scanner, to demonstrate the various
@@ -11954,7 +13173,7 @@
 @node Calc++ --- C++ Calculator
 @subsubsection Calc++ --- C++ Calculator
 
-Of course the grammar is dedicated to arithmetics, a single expression,
+Of course the grammar is dedicated to arithmetic, a single expression,
 possibly preceded by variable assignments.  An environment containing
 possibly predefined variables such as @code{one} and @code{two}, is
 exchanged with the parser.  An example of valid input follows.
@@ -11982,7 +13201,31 @@
 The first part includes the CPP guard and imports the required standard
 library components, and the declaration of the parser class.
 
-@comment file: calc++/driver.hh
+@ignore
+@comment file: c++/calc++/driver.hh
+@example
+/* Driver for calc++.   -*- C++ -*-
+
+   Copyright (C) 2005-2015, 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+@end example
+@end ignore
+
+@comment file: c++/calc++/driver.hh
 @example
 #ifndef DRIVER_HH
 # define DRIVER_HH
@@ -11997,7 +13240,7 @@
 signature of @code{yylex} to be defined in the macro @code{YY_DECL}, and the
 C++ parser expects it to be declared.  We can factor both as follows.
 
-@comment file: calc++/driver.hh
+@comment file: c++/calc++/driver.hh
 @example
 // Give Flex the prototype of yylex we want ...
 # define YY_DECL \
@@ -12009,7 +13252,7 @@
 @noindent
 The @code{driver} class is then declared with its most obvious members.
 
-@comment file: calc++/driver.hh
+@comment file: c++/calc++/driver.hh
 @example
 // Conducting the whole scanning and parsing of Calc++.
 class driver
@@ -12025,7 +13268,7 @@
 @noindent
 The main routine is of course calling the parser.
 
-@comment file: calc++/driver.hh
+@comment file: c++/calc++/driver.hh
 @example
   // Run the parser on file F.  Return 0 on success.
   int parse (const std::string& f);
@@ -12039,7 +13282,7 @@
 To encapsulate the coordination with the Flex scanner, it is useful to have
 member functions to open and close the scanning phase.
 
-@comment file: calc++/driver.hh
+@comment file: c++/calc++/driver.hh
 @example
   // Handling the scanner.
   void scan_begin ();
@@ -12054,7 +13297,31 @@
 
 The implementation of the driver (@file{driver.cc}) is straightforward.
 
-@comment file: calc++/driver.cc
+@ignore
+@comment file: c++/calc++/driver.cc
+@example
+/* Driver for calc++.   -*- C++ -*-
+
+   Copyright (C) 2005-2015, 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+@end example
+@end ignore
+
+@comment file: c++/calc++/driver.cc
 @example
 #include "driver.hh"
 #include "parser.hh"
@@ -12071,7 +13338,7 @@
 
 The @code{parse} member function deserves some attention.
 
-@comment file: calc++/driver.cc
+@comment file: c++/calc++/driver.cc
 @example
 @group
 int
@@ -12097,22 +13364,57 @@
 skeleton changed several times, it is safer to require the version you
 designed the grammar for.
 
-@comment file: calc++/parser.yy
+@ignore
+@comment file: c++/calc++/parser.yy
 @example
-%skeleton "lalr1.cc" /* -*- C++ -*- */
+/* Parser for calc++.   -*- C++ -*-
+
+   Copyright (C) 2005-2015, 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+@end example
+@end ignore
+
+@comment file: c++/calc++/parser.yy
+@example
+%skeleton "lalr1.cc" // -*- C++ -*-
 %require "@value{VERSION}"
-%defines
+%header
+@end example
+
+@noindent
+@findex %define api.token.raw
+Because our scanner returns only genuine tokens and never simple characters
+(i.e., it returns @samp{PLUS}, not @samp{'+'}), we can avoid conversions.
+
+@comment file: c++/calc++/parser.yy
+@example
+%define api.token.raw
 @end example
 
 @noindent
 @findex %define api.token.constructor
 @findex %define api.value.type variant
-This example will use genuine C++ objects as semantic values, therefore, we
-require the variant-based interface.  To make sure we properly use it, we
-enable assertions.  To fully benefit from type-safety and more natural
-definition of ``symbol'', we enable @code{api.token.constructor}.
+This example uses genuine C++ objects as semantic values, therefore, we
+require the variant-based storage of semantic values.  To make sure we
+properly use it, we enable assertions.  To fully benefit from type-safety
+and more natural definition of ``symbol'', we enable
+@code{api.token.constructor}.
 
-@comment file: calc++/parser.yy
+@comment file: c++/calc++/parser.yy
 @example
 %define api.token.constructor
 %define api.value.type variant
@@ -12129,7 +13431,7 @@
 particular its inner types), it is the parser's header which will use a
 forward declaration of the driver.  @xref{%code Summary}.
 
-@comment file: calc++/parser.yy
+@comment file: c++/calc++/parser.yy
 @example
 @group
 %code requires @{
@@ -12144,7 +13446,7 @@
 This provides a simple but effective pure interface, not relying on
 global variables.
 
-@comment file: calc++/parser.yy
+@comment file: c++/calc++/parser.yy
 @example
 // The parsing context.
 %param @{ driver& drv @}
@@ -12153,20 +13455,21 @@
 @noindent
 Then we request location tracking.
 
-@comment file: calc++/parser.yy
+@comment file: c++/calc++/parser.yy
 @example
 %locations
 @end example
 
 @noindent
-Use the following two directives to enable parser tracing and verbose error
-messages.  However, verbose error messages can contain incorrect information
-(@pxref{LAC}).
+Use the following two directives to enable parser tracing and detailed error
+messages.  However, detailed error messages can contain incorrect
+information if lookahead correction is not enabled (@pxref{LAC}).
 
-@comment file: calc++/parser.yy
+@comment file: c++/calc++/parser.yy
 @example
 %define parse.trace
-%define parse.error verbose
+%define parse.error detailed
+%define parse.lac full
 @end example
 
 @noindent
@@ -12174,7 +13477,7 @@
 The code between @samp{%code @{} and @samp{@}} is output in the @file{*.cc}
 file; it needs detailed knowledge about the driver.
 
-@comment file: calc++/parser.yy
+@comment file: c++/calc++/parser.yy
 @example
 @group
 %code @{
@@ -12185,17 +13488,14 @@
 
 
 @noindent
-The token numbered as 0 corresponds to end of file; the following line
-allows for nicer error messages referring to ``end of file'' instead of
-``$end''.  Similarly user friendly names are provided for each symbol.  To
-avoid name clashes in the generated files (@pxref{Calc++ Scanner}), prefix
-tokens with @code{TOK_} (@pxref{%define Summary,,api.token.prefix}).
+User friendly names are provided for each symbol.  To avoid name clashes in
+the generated files (@pxref{Calc++ Scanner}), prefix tokens with @code{TOK_}
+(@pxref{%define Summary}).
 
-@comment file: calc++/parser.yy
+@comment file: c++/calc++/parser.yy
 @example
 %define api.token.prefix @{TOK_@}
 %token
-  END  0  "end of file"
   ASSIGN  ":="
   MINUS   "-"
   PLUS    "+"
@@ -12211,7 +13511,7 @@
 @code{%token}, @code{%nterm} and @code{%type} expect genuine types, not type
 tags.
 
-@comment file: calc++/parser.yy
+@comment file: c++/calc++/parser.yy
 @example
 %token <std::string> IDENTIFIER "identifier"
 %token <int> NUMBER "number"
@@ -12222,18 +13522,17 @@
 No @code{%destructor} is needed to enable memory deallocation during error
 recovery; the memory, for strings for instance, will be reclaimed by the
 regular destructors.  All the values are printed using their
-@code{operator<<} (@pxref{Printer Decl, , Printing Semantic Values}).
+@code{operator<<} (@pxref{Printer Decl}).
 
-@comment file: calc++/parser.yy
+@comment file: c++/calc++/parser.yy
 @example
 %printer @{ yyo << $$; @} <*>;
 @end example
 
 @noindent
-The grammar itself is straightforward (@pxref{Location Tracking Calc, ,
-Location Tracking Calculator - @code{ltcalc}}).
+The grammar itself is straightforward (@pxref{Location Tracking Calc}).
 
-@comment file: calc++/parser.yy
+@comment file: c++/calc++/parser.yy
 @example
 %%
 %start unit;
@@ -12262,7 +13561,7 @@
 @noindent
 Finally the @code{error} member function reports the errors.
 
-@comment file: calc++/parser.yy
+@comment file: c++/calc++/parser.yy
 @example
 void
 yy::parser::error (const location_type& l, const std::string& m)
@@ -12277,7 +13576,31 @@
 In addition to standard headers, the Flex scanner includes the driver's,
 then the parser's to get the set of defined tokens.
 
-@comment file: calc++/scanner.ll
+@ignore
+@comment file: c++/calc++/scanner.ll
+@example
+/* Scanner for calc++.   -*- C++ -*-
+
+   Copyright (C) 2005-2015, 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+@end example
+@end ignore
+
+@comment file: c++/calc++/scanner.ll
 @example
 %@{ /* -*- C++ -*- */
 # include <cerrno>
@@ -12291,7 +13614,7 @@
 @end example
 
 @ignore
-@comment file: calc++/scanner.ll
+@comment file: c++/calc++/scanner.ll
 @example
 %@{
 #if defined __clang__
@@ -12309,7 +13632,7 @@
 # pragma GCC diagnostic ignored "-Wnull-dereference"
 #endif
 
-// This example uses Flex's C backend, yet compiles it as C++.
+// This example uses Flex's C back end, yet compiles it as C++.
 // So expect warnings about C style casts and NULL.
 #if defined CLANG_VERSION && 500 <= CLANG_VERSION
 # pragma clang diagnostic ignored "-Wold-style-cast"
@@ -12354,6 +13677,14 @@
 #  pragma GCC diagnostic ignored "-Wsign-conversion"
 # endif
 #endif
+
+// Flex 2.6.4, GCC 9
+// warning: useless cast to type 'int' [-Wuseless-cast]
+// 1361 |   YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
+//      |                                                 ^
+#if defined GCC_VERSION && 900 <= GCC_VERSION
+# pragma GCC diagnostic ignored "-Wuseless-cast"
+#endif
 %@}
 @end example
 @end ignore
@@ -12364,16 +13695,16 @@
 either, and we parse an actual file, this is not an interactive session with
 the user.  Finally, we enable scanner tracing.
 
-@comment file: calc++/scanner.ll
+@comment file: c++/calc++/scanner.ll
 @example
 %option noyywrap nounput noinput batch debug
 @end example
 
 @noindent
 The following function will be handy to convert a string denoting a number
-into a number token.
+into a @code{NUMBER} token.
 
-@comment file: calc++/scanner.ll
+@comment file: c++/calc++/scanner.ll
 @example
 %@{
   // A number symbol corresponding to the value in S.
@@ -12385,7 +13716,7 @@
 @noindent
 Abbreviations allow for more readable rules.
 
-@comment file: calc++/scanner.ll
+@comment file: c++/calc++/scanner.ll
 @example
 id    [a-zA-Z][a-zA-Z_0-9]*
 int   [0-9]+
@@ -12400,7 +13731,7 @@
 matched, the begin cursor is moved onto the end cursor to effectively ignore
 the blanks preceding tokens.  Comments would be treated equally.
 
-@comment file: calc++/scanner.ll
+@comment file: c++/calc++/scanner.ll
 @example
 @group
 %@{
@@ -12424,7 +13755,7 @@
 @noindent
 The rules are simple.  The driver is used to report errors.
 
-@comment file: calc++/scanner.ll
+@comment file: c++/calc++/scanner.ll
 @example
 "-"        return yy::parser::make_MINUS  (loc);
 "+"        return yy::parser::make_PLUS   (loc);
@@ -12442,7 +13773,7 @@
                (loc, "invalid character: " + std::string(yytext));
 @}
 @end group
-<<EOF>>    return yy::parser::make_END (loc);
+<<EOF>>    return yy::parser::make_YYEOF (loc);
 %%
 @end example
 
@@ -12450,7 +13781,7 @@
 You should keep your rules simple, both in the parser and in the scanner.
 Throwing from the auxiliary functions is then very handy to report errors.
 
-@comment file: scanner.ll
+@comment file: c++/calc++/scanner.ll
 @example
 @group
 yy::parser::symbol_type
@@ -12469,7 +13800,7 @@
 Finally, because the scanner-related driver's member-functions depend
 on the scanner's data, it is simpler to implement them in this file.
 
-@comment file: calc++/scanner.ll
+@comment file: c++/calc++/scanner.ll
 @example
 @group
 void
@@ -12480,7 +13811,7 @@
     yyin = stdin;
   else if (!(yyin = fopen (file.c_str (), "r")))
     @{
-      std::cerr << "cannot open " << file << ": " << strerror(errno) << '\n';
+      std::cerr << "cannot open " << file << ": " << strerror (errno) << '\n';
       exit (EXIT_FAILURE);
     @}
 @}
@@ -12500,7 +13831,31 @@
 
 The top level file, @file{calc++.cc}, poses no problem.
 
-@comment file: calc++.cc
+@ignore
+@comment file: c++/calc++/calc++.cc
+@example
+/* Main for calc++.   -*- C++ -*-
+
+   Copyright (C) 2005-2015, 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+@end example
+@end ignore
+
+@comment file: c++/calc++/calc++.cc
 @example
 #include <iostream>
 #include "driver.hh"
@@ -12525,6 +13880,421 @@
 @end group
 @end example
 
+@node D Parsers
+@section D Parsers
+
+@menu
+* D Bison Interface::        Asking for D parser generation
+* D Semantic Values::        %token and %nterm vs. D
+* D Location Values::        The position and location classes
+* D Parser Interface::       Instantiating and running the parser
+* D Parser Context Interface:: Circumstances of a syntax error
+* D Scanner Interface::      Specifying the scanner for the parser
+* D Action Features::        Special features for use in actions
+* D Push Parser Interface::  Instantiating and running the push parser
+* D Complete Symbols::       Using token constructors
+@end menu
+
+@node D Bison Interface
+@subsection D Bison Interface
+@c - %language "D"
+
+The D parser skeletons are selected using the @code{%language "D"}
+directive or the @option{-L D}/@option{--language=D} option.
+
+@c FIXME: Documented bug.
+When generating a D parser, @samp{bison @var{basename}.y} will create a
+single D source file named @file{@var{basename}.d} containing the
+parser implementation.  Using a grammar file without a @file{.y} suffix is
+currently broken.  The basename of the parser implementation file can be
+changed by the @code{%file-prefix} directive or the
+@option{-b}/@option{--file-prefix} option.  The entire parser implementation
+file name can be changed by the @code{%output} directive or the
+@option{-o}/@option{--output} option.  The parser implementation file
+contains a single class for the parser.
+
+You can create documentation for generated parsers using Ddoc.
+
+GLR parsers are currently unsupported in D.  Do not use the
+@code{glr-parser} directive.
+
+No header file can be generated for D parsers.  Do not use the
+@code{%header} directive or the @option{-d}/@option{--header} options.
+
+@node D Semantic Values
+@subsection D Semantic Values
+
+Semantic types are handled by @code{%union} and @samp{%define api.value.type
+union}, similar to C/C++ parsers. In the latter case, the union of the
+values is handled by the backend. In D, unions can hold classes, structs,
+etc., so this directive is more similar to @samp{%define api.value.type
+variant} from C++.
+
+D parsers do not support @code{%destructor}, since the language
+adopts garbage collection.  The parser will try to hold references
+to semantic values for as little time as needed.
+
+D parsers support @code{%printer}.  An example for the output of type
+@code{int}, where @code{yyo} is the parser's debug output:
+
+@example
+%printer @{ yyo.write($$); @} <int>
+@end example
+
+
+@node D Location Values
+@subsection D Location Values
+@c - %locations
+@c - class Position
+@c - class Location
+
+When the directive @code{%locations} is used, the D parser supports location
+tracking, see @ref{Tracking Locations}.  The position and the location
+structures are provided.
+
+@deftypeivar {Location} {Position} begin
+@deftypeivarx {Location} {Position} end
+The first, inclusive, position of the range, and the first beyond.
+@end deftypeivar
+
+@deftypeop {Constructor} {Location} {} this(@code{Position} @var{loc})
+Create a @code{Location} denoting an empty range located at a given point.
+@end deftypeop
+
+@deftypeop {Constructor} {Location} {} this(@code{Position} @var{begin}, @code{Position} @var{end})
+Create a @code{Location} from the endpoints of the range.
+@end deftypeop
+
+@deftypemethod {Location} {string} toString()
+The range represented by the location as a string.
+@end deftypemethod
+
+
+@node D Parser Interface
+@subsection D Parser Interface
+
+The name of the generated parser class defaults to @code{YYParser}.  The
+@code{YY} prefix may be changed using the @samp{%define api.prefix}.
+Alternatively, use @samp{%define api.parser.class @{@var{name}@}} to give a
+custom name to the class.  The interface of this class is detailed below.
+
+By default, the parser class has public visibility.  To add modifiers to the
+parser class, @code{%define} @code{api.parser.public},
+@code{api.parser.abstract} and/or @code{api.parser.final}.
+
+The superclass and the implemented interfaces of the parser class can be
+specified with the @samp{%define api.parser.extends} and @samp{%define
+api.parser.implements} directives.
+
+The parser class defines an interface, @code{Lexer} (@pxref{D Scanner
+Interface}).  Other than this interface and the members described in the
+interface below, all the other members and fields are preceded with a
+@code{yy} or @code{YY} prefix to avoid clashes with user code.
+
+The parser class can be extended using the @code{%parse-param}
+directive. Each occurrence of the directive will add a by default public
+field to the parser class, and an argument to its constructor, which
+initializes them automatically.
+
+@deftypeop {Constructor} {YYParser} {} this(@var{lex_param}, @dots{}, @var{parse_param}, @dots{})
+Build a new parser object with embedded @samp{%code lexer}.  There are no
+parameters, unless @code{%param}s and/or @code{%parse-param}s and/or
+@code{%lex-param}s are used.
+@end deftypeop
+
+@deftypeop {Constructor} {YYParser} {} this(@code{Lexer} @var{lexer}, @var{parse_param}, @dots{})
+Build a new parser object using the specified scanner.  There are no
+additional parameters unless @code{%param}s and/or @code{%parse-param}s are
+used.
+@end deftypeop
+
+@deftypemethod {YYParser} {boolean} parse()
+Run the syntactic analysis, and return @code{true} on success,
+@code{false} otherwise.
+@end deftypemethod
+
+@deftypemethod {YYParser} {boolean} getErrorVerbose()
+@deftypemethodx {YYParser} {void} setErrorVerbose(boolean @var{verbose})
+Get or set the option to produce verbose error messages.  These are only
+available with @samp{%define parse.error detailed},
+which also turns on verbose error messages.
+@end deftypemethod
+
+@deftypemethod {YYParser} {void} yyerror(@code{string} @var{msg})
+@deftypemethodx {YYParser} {void} yyerror(@code{Location} @var{loc}, @code{string} @var{msg})
+Print an error message using the @code{yyerror} method of the scanner
+instance in use. The @code{Location} and @code{Position} parameters are
+available only if location tracking is active.
+@end deftypemethod
+
+@deftypemethod {YYParser} {boolean} recovering()
+During the syntactic analysis, return @code{true} if recovering
+from a syntax error.
+@xref{Error Recovery}.
+@end deftypemethod
+
+@deftypemethod {YYParser} {File} getDebugStream()
+@deftypemethodx {YYParser} {void} setDebugStream(@code{File} @var{o})
+Get or set the stream used for tracing the parsing.  It defaults to
+@code{stderr}.
+@end deftypemethod
+
+@deftypemethod {YYParser} {int} getDebugLevel()
+@deftypemethodx {YYParser} {void} setDebugLevel(@code{int} @var{l})
+Get or set the tracing level.  Currently its value is either 0, no trace,
+or nonzero, full tracing.
+@end deftypemethod
+
+@deftypecv {Constant} {YYParser} {string} {bisonVersion}
+@deftypecvx {Constant} {YYParser} {string} {bisonSkeleton}
+Identify the Bison version and skeleton used to generate this parser.
+@end deftypecv
+
+The internationalization in D is very similar to the one in C. The D
+parser uses @code{dgettext} for translating Bison messages.
+
+To enable internationalization, compile using @samp{-version ENABLE_NLS
+-version YYENABLE_NLS} and import @code{bindtextdomain} and
+@code{textdomain} from C:
+
+@example
+extern(C) char* bindtextdomain(const char* domainname, const char* dirname);
+extern(C) char* textdomain(const char* domainname);
+@end example
+
+The main function should load the translation catalogs, similarly to the
+@file{c/bistromathic} example:
+
+@example
+int main()
+@{
+  import core.stdc.locale;
+
+  // Set up internationalization.
+  setlocale(LC_ALL, "");
+  // Use Bison's standard translation catalog for error messages
+  // (the generated messages).
+  bindtextdomain("bison-runtime", BISON_LOCALEDIR);
+  // For the translation catalog of your own project, use the
+  // name of your project.
+  bindtextdomain("bison", LOCALEDIR);
+  textdomain("bison");
+
+  // usual main content
+  ...
+@}
+@end example
+
+For user message translations, the user must implement the @samp{string
+_(const char* @var{msg})} function.  It is recommended to use
+@code{gettext}:
+
+@example
+%code imports @{
+  static if (!is(typeof(_)))
+  @{
+    version(ENABLE_NLS)
+    @{
+      extern(C) char* gettext(const char*);
+      string _(const char* s)
+      @{
+        return to!string(gettext(s));
+      @}
+    @}
+  @}
+  static if (!is(typeof(_)))
+  @{
+    pragma(inline, true)
+    string _(string msg) @{ return msg; @}
+  @}
+@}
+@end example
+
+@node D Parser Context Interface
+@subsection D Parser Context Interface
+The parser context provides information to build error reports when you
+invoke @samp{%define parse.error custom}.
+
+@defcv {Type} {YYParser} {SymbolKind}
+A struct containing an enum of all the grammar symbols, tokens and
+nonterminals.  Its enumerators are forged from the symbol names.  Use
+@samp{void toString(W)(W sink)} to get the symbol names.
+@end defcv
+
+@deftypemethod {YYParser.Context} {YYParser.SymbolKind} getToken()
+The kind of the lookahead.  Return @code{null} iff there is no lookahead.
+@end deftypemethod
+
+@deftypemethod {YYParser.Context} {YYParser.Location} getLocation()
+The location of the lookahead.
+@end deftypemethod
+
+@deftypemethod {YYParser.Context} {int} getExpectedTokens(@code{YYParser.SymbolKind[]} @var{argv}, @code{int} @var{argc})
+Fill @var{argv} with the expected tokens, which never includes
+@code{SymbolKind.YYERROR}, or @code{SymbolKind.YYUNDEF}.
+
+Never put more than @var{argc} elements into @var{argv}, and on success
+return the number of tokens stored in @var{argv}.  If there are more
+expected tokens than @var{argc}, fill @var{argv} up to @var{argc} and return
+0.  If there are no expected tokens, also return 0, but set @code{argv[0]}
+to @code{null}.
+
+If @var{argv} is null, return the size needed to store all the possible
+values, which is always less than @code{YYNTOKENS}.
+@end deftypemethod
+
+
+@node D Scanner Interface
+@subsection D Scanner Interface
+@c - %code lexer
+@c - %lex-param
+@c - Lexer interface
+
+There are two possible ways to interface a Bison-generated D parser
+with a scanner: the scanner may be defined by @code{%code lexer}, or
+defined elsewhere.  In either case, the scanner has to implement the
+@code{Lexer} inner interface of the parser class.  This interface also
+contains constants for all user-defined token names and the predefined
+@code{YYEOF} token.
+
+In the first case, the body of the scanner class is placed in
+@code{%code lexer} blocks.  If you want to pass parameters from the
+parser constructor to the scanner constructor, specify them with
+@code{%lex-param}; they are passed before @code{%parse-param}s to the
+constructor.
+
+In the second case, the scanner has to implement the @code{Lexer} interface,
+which is defined within the parser class (e.g., @code{YYParser.Lexer}).
+The constructor of the parser object will then accept an object
+implementing the interface; @code{%lex-param} is not used in this
+case.
+
+In both cases, the scanner has to implement the following methods.
+
+@deftypemethod {Lexer} {void} yyerror(@code{Location} @var{loc}, @code{string} @var{msg})
+This method is defined by the user to emit an error message.  The first
+parameter is omitted if location tracking is not active.
+@end deftypemethod
+
+@deftypemethod {Lexer} {Symbol} yylex()
+Return the next token. The return value is of type @code{Symbol}, which
+binds together the kind, the semantic value and the location.
+@end deftypemethod
+
+@deftypemethod {Lexer} {void} reportSyntaxError(@code{YYParser.Context} @var{ctx})
+If you invoke @samp{%define parse.error custom} (@pxref{Bison
+Declarations}), then the parser no longer passes syntax error messages to
+@code{yyerror}, rather it delegates that task to the user by calling the
+@code{reportSyntaxError} function.
+
+Whether it uses @code{yyerror} is up to the user.
+
+Here is an example of a reporting function (@pxref{D Parser Context
+Interface}).
+
+@example
+public void reportSyntaxError(YYParser.Context ctx)
+@{
+  stderr.write(ctx.getLocation(), ": syntax error");
+  // Report the expected tokens.
+  @{
+    immutable int TOKENMAX = 5;
+    YYParser.SymbolKind[] arg = new YYParser.SymbolKind[TOKENMAX];
+    int n = ctx.getExpectedTokens(arg, TOKENMAX);
+    if (n < TOKENMAX)
+      for (int i = 0; i < n; ++i)
+        stderr.write((i == 0 ? ": expected " : " or "), arg[i]);
+  @}
+  // Report the unexpected token which triggered the error.
+  @{
+    YYParser.SymbolKind lookahead = ctx.getToken();
+    stderr.writeln(" before ", lookahead);
+  @}
+@}
+@end example
+
+@noindent
+This implementation is inappropriate for internationalization, see
+the @file{c/bistromathic} example for a better alternative.
+@end deftypemethod
+
+@node D Action Features
+@subsection Special Features for Use in D Actions
+
+Here is a table of Bison constructs, variables and functions that are useful in
+actions.
+
+@deffn {Variable} $$
+Acts like a variable that contains the semantic value for the
+grouping made by the current rule.  @xref{Actions}.
+@end deffn
+
+@deffn {Variable} $@var{n}
+Acts like a variable that contains the semantic value for the
+@var{n}th component of the current rule.  @xref{Actions}.
+@end deffn
+
+@deffn {Function} yyerrok
+Resume generating error messages immediately for subsequent syntax
+errors.  This is useful primarily in error rules.
+@xref{Error Recovery}.
+@end deffn
+
+@node D Push Parser Interface
+@subsection D Push Parser Interface
+@c - define push_parse
+@findex %define api.push-pull
+
+Normally, Bison generates a pull parser for D.
+The following Bison declaration says that you want the parser to be a push
+parser (@pxref{%define Summary}):
+
+@example
+%define api.push-pull push
+@end example
+
+Most of the discussion about the D pull Parser Interface, (@pxref{D
+Parser Interface}) applies to the push parser interface as well.
+
+When generating a push parser, the method @code{pushParse} is created with
+the following signature:
+
+@deftypemethod {YYParser} {int} pushParse (@code{Symbol} @var{sym})
+@end deftypemethod
+
+The primary difference with respect to a pull parser is that the parser
+method @code{pushParse} is invoked repeatedly to parse each token.  This
+function is available if either the @samp{%define api.push-pull push} or
+@samp{%define api.push-pull both} declaration is used (@pxref{%define
+Summary}).
+
+The value returned by the @code{pushParse} method is one of the following:
+@code{ACCEPT}, @code{ABORT}, or @code{PUSH_MORE}.  This new value,
+@code{PUSH_MORE}, may be returned if more input is required to finish
+parsing the input.
+
+If @code{api.push-pull} is defined as @code{both}, then the generated parser
+class will also implement the @code{parse} method. This method's body is a
+loop that repeatedly invokes the scanner and then passes the values obtained
+from the scanner to the @code{pushParse} method.
+
+@node D Complete Symbols
+@subsection D Complete Symbols
+
+To build return values for @code{yylex}, call the @code{Symbol} method of
+the same name as the token kind reported, and adding the parameters for
+value and location if necessary.  These methods generate compile-time errors
+if the parameters are inconsistent.  Token constructors work with both
+@code{%union} and @samp{%define api.value.type union}.
+
+The order of the parameters is the same as for the @code{Symbol}
+constructor.  An example for the token kind @code{NUM}, which has value
+@code{ival} and with location tracking activated:
+
+@example
+Symbol.NUM(ival, location);
+@end example
+
 @node Java Parsers
 @section Java Parsers
 
@@ -12533,9 +14303,10 @@
 * Java Semantic Values::        %token and %nterm vs. Java
 * Java Location Values::        The position and location classes
 * Java Parser Interface::       Instantiating and running the parser
+* Java Parser Context Interface:: Circumstances of a syntax error
 * Java Scanner Interface::      Specifying the scanner for the parser
 * Java Action Features::        Special features for use in actions
-* Java Push Parser Interface::  Instantiating and running the a push parser
+* Java Push Parser Interface::  Instantiating and running the push parser
 * Java Differences::            Differences between C/C++ and Java Grammars
 * Java Declarations Summary::   List of Bison declarations used with Java
 @end menu
@@ -12565,38 +14336,30 @@
 Therefore, all Java parsers are ``pure'', and the @code{%define api.pure}
 directive does nothing when used in Java.
 
-Push parsers are currently unsupported in Java and @code{%define
-api.push-pull} have no effect.
-
 GLR parsers are currently unsupported in Java.  Do not use the
 @code{glr-parser} directive.
 
 No header file can be generated for Java parsers.  Do not use the
-@code{%defines} directive or the @option{-d}/@option{--defines} options.
+@code{%header} directive or the @option{-d}/@option{-H}/@option{--header}
+options.
 
 @c FIXME: Possible code change.
-Currently, support for tracing is always compiled
-in.  Thus the @samp{%define parse.trace} and @samp{%token-table}
-directives and the
-@option{-t}/@option{--debug} and @option{-k}/@option{--token-table}
-options have no effect.  This may change in the future to eliminate
-unused code in the generated parser, so use @samp{%define parse.trace}
-explicitly
-if needed.  Also, in the future the
-@code{%token-table} directive might enable a public interface to
-access the token names and codes.
+Currently, support for tracing is always compiled in.  Thus the
+@samp{%define parse.trace} and @samp{%token-table} directives and the
+@option{-t}/@option{--debug} and @option{-k}/@option{--token-table} options
+have no effect.  This may change in the future to eliminate unused code in
+the generated parser, so use @samp{%define parse.trace} explicitly if
+needed.  Also, in the future the @code{%token-table} directive might enable
+a public interface to access the token names and codes.
 
-Getting a ``code too large'' error from the Java compiler means the code
-hit the 64KB bytecode per method limitation of the Java class file.
-Try reducing the amount of code in actions and static initializers;
-otherwise, report a bug so that the parser skeleton will be improved.
+Getting a ``code too large'' error from the Java compiler means the code hit
+the 64KB bytecode per method limitation of the Java class file.  Try
+reducing the amount of code in actions and static initializers; otherwise,
+report a bug so that the parser skeleton will be improved.
 
 
 @node Java Semantic Values
 @subsection Java Semantic Values
-@c - No %union, specify type in %nterm/%token.
-@c - YYSTYPE
-@c - Printer and destructor
 
 There is no @code{%union} directive in Java parsers.  Instead, the semantic
 values' types (class names) should be specified in the @code{%nterm} or
@@ -12710,7 +14473,7 @@
 The parser class can be extended using the @code{%parse-param}
 directive. Each occurrence of the directive will add a @code{protected
 final} field to the parser class, and an argument to its constructor,
-which initialize them automatically.
+which initializes them automatically.
 
 @deftypeop {Constructor} {YYParser} {} YYParser (@var{lex_param}, @dots{}, @var{parse_param}, @dots{})
 Build a new parser object with embedded @code{%code lexer}.  There are
@@ -12744,8 +14507,8 @@
 @deftypemethod {YYParser} {boolean} getErrorVerbose ()
 @deftypemethodx {YYParser} {void} setErrorVerbose (boolean @var{verbose})
 Get or set the option to produce verbose error messages.  These are only
-available with @samp{%define parse.error verbose}, which also turns on
-verbose error messages.
+available with @samp{%define parse.error detailed} (or @samp{verbose}),
+which also turns on verbose error messages.
 @end deftypemethod
 
 @deftypemethod {YYParser} {void} yyerror (@code{String} @var{msg})
@@ -12763,7 +14526,7 @@
 @end deftypemethod
 
 @deftypemethod {YYParser} {java.io.PrintStream} getDebugStream ()
-@deftypemethodx {YYParser} {void} setDebugStream (@code{java.io.printStream} @var{o})
+@deftypemethodx {YYParser} {void} setDebugStream (@code{java.io.PrintStream} @var{o})
 Get or set the stream used for tracing the parsing.  It defaults to
 @code{System.err}.
 @end deftypemethod
@@ -12779,6 +14542,78 @@
 Identify the Bison version and skeleton used to generate this parser.
 @end deftypecv
 
+If you enabled token internationalization (@pxref{Token I18n}), you must
+provide the parser with the following function:
+
+@deftypecv {Static Method} {YYParser} {String} {i18n} (@code{string} @var{s})
+Return the translation of @var{s} in the user's language.  As an example:
+
+@example
+%code @{
+  static ResourceBundle myResources
+    = ResourceBundle.getBundle("domain-name");
+  static final String i18n(String s) @{
+    return myResources.getString(s);
+  @}
+@}
+@end example
+@end deftypecv
+
+@node Java Parser Context Interface
+@subsection Java Parser Context Interface
+
+The parser context provides information to build error reports when you
+invoke @samp{%define parse.error custom}.
+
+@defcv {Type} {YYParser} {SymbolKind}
+An enum of all the grammar symbols, tokens and nonterminals.  Its
+enumerators are forged from the symbol names:
+
+@example
+public enum SymbolKind
+@{
+  S_YYEOF(0),          /* "end of file"  */
+  S_YYERROR(1),        /* error  */
+  S_YYUNDEF(2),        /* "invalid token"  */
+  S_BANG(3),           /* "!"  */
+  S_PLUS(4),           /* "+"  */
+  S_MINUS(5),          /* "-"  */
+  [...]
+  S_NUM(13),           /* "number"  */
+  S_NEG(14),           /* NEG  */
+  S_YYACCEPT(15),      /* $accept  */
+  S_input(16),         /* input  */
+  S_line(17);          /* line  */
+@};
+@end example
+@end defcv
+
+@deftypemethod {YYParser.SymbolKind} {String} getName ()
+The name of this symbol, possibly translated.
+@end deftypemethod
+
+@deftypemethod {YYParser.Context} {YYParser.SymbolKind} getToken ()
+The kind of the lookahead.  Return @code{null} iff there is no lookahead.
+@end deftypemethod
+
+@deftypemethod {YYParser.Context} {YYParser.Location} getLocation ()
+The location of the lookahead.
+@end deftypemethod
+
+@deftypemethod {YYParser.Context} {int} getExpectedTokens (@code{YYParser.SymbolKind[]} @var{argv}, @code{int} @var{argc})
+Fill @var{argv} with the expected tokens, which never includes
+@code{SymbolKind.S_YYERROR}, or @code{SymbolKind.S_YYUNDEF}.
+
+Never put more than @var{argc} elements into @var{argv}, and on success
+return the number of tokens stored in @var{argv}.  If there are more
+expected tokens than @var{argc}, fill @var{argv} up to @var{argc} and return
+0.  If there are no expected tokens, also return 0, but set @code{argv[0]}
+to @code{null}.
+
+If @var{argv} is null, return the size needed to store all the possible
+values, which is always less than @code{YYNTOKENS}.
+@end deftypemethod
+
 
 @node Java Scanner Interface
 @subsection Java Scanner Interface
@@ -12790,8 +14625,8 @@
 with a scanner: the scanner may be defined by @code{%code lexer}, or
 defined elsewhere.  In either case, the scanner has to implement the
 @code{Lexer} inner interface of the parser class.  This interface also
-contain constants for all user-defined token names and the predefined
-@code{EOF} token.
+contains constants for all user-defined token names and the predefined
+@code{YYEOF} token.
 
 In the first case, the body of the scanner class is placed in
 @code{%code lexer} blocks.  If you want to pass parameters from the
@@ -12814,9 +14649,9 @@
 @end deftypemethod
 
 @deftypemethod {Lexer} {int} yylex ()
-Return the next token.  Its type is the return value, its semantic
-value and location are saved and returned by the their methods in the
-interface.
+Return the next token.  Its type is the return value, its semantic value and
+location are saved and returned by the their methods in the interface.  Not
+needed for push-only parsers.
 
 Use @samp{%define lex_throws} to specify any uncaught exceptions.
 Default is @code{java.io.IOException}.
@@ -12824,21 +14659,63 @@
 
 @deftypemethod {Lexer} {Position} getStartPos ()
 @deftypemethodx {Lexer} {Position} getEndPos ()
-Return respectively the first position of the last token that
-@code{yylex} returned, and the first position beyond it.  These
-methods are not needed unless location tracking is active.
+Return respectively the first position of the last token that @code{yylex}
+returned, and the first position beyond it.  These methods are not needed
+unless location tracking and pull parsing are active.
+
+They should return new objects for each call, to avoid that all the symbol
+share the same Position boundaries.
 
 The return type can be changed using @code{%define api.position.type
 @{@var{class-name}@}}.
 @end deftypemethod
 
 @deftypemethod {Lexer} {Object} getLVal ()
-Return the semantic value of the last token that yylex returned.
+Return the semantic value of the last token that yylex returned.  Not needed
+for push-only parsers.
 
 The return type can be changed using @samp{%define api.value.type
 @{@var{class-name}@}}.
 @end deftypemethod
 
+@deftypemethod {Lexer} {void} reportSyntaxError (@code{YYParser.Context} @var{ctx})
+If you invoke @samp{%define parse.error custom} (@pxref{Bison
+Declarations}), then the parser no longer passes syntax error messages to
+@code{yyerror}, rather it delegates that task to the user by calling the
+@code{reportSyntaxError} function.
+
+Whether it uses @code{yyerror} is up to the user.
+
+Here is an example of a reporting function (@pxref{Java Parser Context
+Interface}).
+
+@example
+public void reportSyntaxError(YYParser.Context ctx) @{
+  System.err.print(ctx.getLocation() + ": syntax error");
+  // Report the expected tokens.
+  @{
+    final int TOKENMAX = 5;
+    YYParser.SymbolKind[] arg = new YYParser.SymbolKind[TOKENMAX];
+    int n = ctx.getExpectedTokens(arg, TOKENMAX);
+    for (int i = 0; i < n; ++i)
+      System.err.print((i == 0 ? ": expected " : " or ")
+                       + arg[i].getName());
+  @}
+  // Report the unexpected token which triggered the error.
+  @{
+    YYParser.SymbolKind lookahead = ctx.getToken();
+    if (lookahead != null)
+      System.err.print(" before " + lookahead.getName());
+  @}
+  System.err.println("");
+@}
+@end example
+
+@noindent
+This implementation is inappropriate for internationalization, see the
+@file{c/bistromathic} example for a better alternative.
+@end deftypemethod
+
 @node Java Action Features
 @subsection Special Features for Use in Java Actions
 
@@ -12924,7 +14801,7 @@
 
 Normally, Bison generates a pull parser for Java.
 The following Bison declaration says that you want the parser to be a push
-parser (@pxref{%define Summary,,api.push-pull}):
+parser (@pxref{%define Summary}):
 
 @example
 %define api.push-pull push
@@ -12943,20 +14820,20 @@
 
 The primary difference with respect to a pull parser is that the parser
 method @code{push_parse} is invoked repeatedly to parse each token.  This
-function is available if either the "%define api.push-pull push" or "%define
-api.push-pull both" declaration is used (@pxref{%define
-Summary,,api.push-pull}).  The @code{Location} and @code{Position}
-parameters are available only if location tracking is active.
+function is available if either the @samp{%define api.push-pull push} or
+@samp{%define api.push-pull both} declaration is used (@pxref{%define
+Summary}).  The @code{Location} and @code{Position} parameters are available
+only if location tracking is active.
 
-The value returned by the @code{push_parse} method is one of the following
-four constants: @code{YYABORT}, @code{YYACCEPT}, @code{YYERROR}, or
-@code{YYPUSH_MORE}.  This new value, @code{YYPUSH_MORE}, may be returned if
-more input is required to finish parsing the grammar.
+The value returned by the @code{push_parse} method is one of the following:
+0 (success), 1 (abort), 2 (memory exhaustion), or @code{YYPUSH_MORE}.  This
+new value, @code{YYPUSH_MORE}, may be returned if more input is required to
+finish parsing the grammar.
 
-If api.push-pull is declared as @code{both}, then the generated parser class
-will also implement the @code{parse} method. This method's body is a loop
-that repeatedly invokes the scanner and then passes the values obtained from
-the scanner to the @code{push_parse} method.
+If @code{api.push-pull} is defined as @code{both}, then the generated parser
+class will also implement the @code{parse} method. This method's body is a
+loop that repeatedly invokes the scanner and then passes the values obtained
+from the scanner to the @code{push_parse} method.
 
 There is one additional complication.  Technically, the push parser does not
 need to know about the scanner (i.e. an object implementing the
@@ -12991,13 +14868,12 @@
 
 @itemize
 @item
-Java lacks a preprocessor, so the @code{YYERROR}, @code{YYACCEPT},
-@code{YYABORT} symbols (@pxref{Table of Symbols}) cannot obviously be
-macros.  Instead, they should be preceded by @code{return} when they
-appear in an action.  The actual definition of these symbols is
-opaque to the Bison grammar, and it might change in the future.  The
-only meaningful operation that you can do, is to return them.
-@xref{Java Action Features}.
+Java has no a preprocessor, so obviously the @code{YYERROR},
+@code{YYACCEPT}, @code{YYABORT} symbols (@pxref{Table of Symbols}) cannot be
+macros.  Instead, they should be preceded by @code{return} when they appear
+in an action.  The actual definition of these symbols is opaque to the Bison
+grammar, and it might change in the future.  The only meaningful operation
+that you can do, is to return them.  @xref{Java Action Features}.
 
 Note that of these three symbols, only @code{YYACCEPT} and
 @code{YYABORT} will cause a return from the @code{yyparse}
@@ -13021,8 +14897,8 @@
 @table @asis
 @item @code{%code imports}
 blocks are placed at the beginning of the Java source code.  They may
-include copyright notices.  For a @code{package} declarations, it is
-suggested to use @samp{%define package} instead.
+include copyright notices.  For a @code{package} declarations, use
+@samp{%define api.package} instead.
 
 @item unqualified @code{%code}
 blocks are placed inside the parser class.
@@ -13176,9 +15052,10 @@
 @xref{Java Location Values}.
 @end deffn
 
-@deffn {Directive} {%define package} @{@var{package}@}
+@deffn {Directive} {%define api.package} @{@var{package}@}
 The package to put the parser class in.  Default is none.
 @xref{Java Bison Interface}.
+Renamed from @code{package} in Bison 3.7.
 @end deffn
 
 @deffn {Directive} {%define api.position.type} @{@var{class}@}
@@ -13199,6 +15076,7 @@
 @xref{Java Parser Interface}.
 @end deffn
 
+
 @c ================================================= History
 
 @node History
@@ -13228,10 +15106,10 @@
 the original pcc.
 
 According to the author
-@footnote{@url{https://lists.gnu.org/archive/html/bison-patches/2019-02/msg00061.html}},
+@footnote{@url{https://lists.gnu.org/r/bison-patches/2019-02/msg00061.html}},
 Yacc was first invented in 1971 and reached a form recognizably similar to
 the C version in 1973.  Johnson published @cite{A Portable Compiler: Theory
-and Practice} (@pxref{Bibliography,,Johnson 1978}).
+and Practice} @pcite{Johnson 1978}.
 
 Yacc was not itself originally written in C but in its predecessor language,
 B.  This goes far to explain its odd interface, which exposes a large number
@@ -13262,16 +15140,15 @@
 @section Berkeley Yacc
 @cindex byacc
 
-Berkeley Yacc was originated in 1985 by Robert Corbett
-(@pxref{Bibliography,,Corbett 1984}).  It was originally named ``zoo'', but
-by October 1989 it became known as Berkeley Yacc or byacc.
+Berkeley Yacc was originated in 1985 by Robert Corbett @pcite{Corbett
+1984}.  It was originally named ``zoo'', but by October 1989 it became
+known as Berkeley Yacc or byacc.
 
 Berkeley Yacc had three advantages over the ancestral Yacc: it generated
-faster parsers, it could generate reentrant parsers, and the source code
-was released to the public domain rather than being under an AT&T
-proprietary license.  The better performance came from implementing
-techniques from DeRemer and Penello's seminal paper on LALR parsing
-(@pxref{Bibliography,,DeRemer 1982}).
+faster parsers, it could generate reentrant parsers, and the source code was
+released to the public domain rather than being under an AT&T proprietary
+license.  The better performance came from implementing techniques from
+DeRemer and Penello's seminal paper on LALR parsing @pcite{DeRemer 1982}.
 
 Use of byacc spread rapidly due to its public domain license. However, once
 Bison became available, byacc itself passed out of general use.
@@ -13293,7 +15170,7 @@
 There was also the command @samp{%expect @var{n}} which said not to mention the
 conflicts if there are @var{n} shift/reduce conflicts and no reduce/reduce
 conflicts.  In more recent versions of Bison, @code{%expect} and its
-@code{%expect-rr} variant for reduce-reduce conflicts can be applied to
+@code{%expect-rr} variant for reduce/reduce conflicts can be applied to
 individual rules.
 
 Later versions of Bison added many more new features.
@@ -13302,9 +15179,9 @@
 Yacc and Byson did not have carets in error messages.
 
 Compared to Yacc Bison uses a faster but less space-efficient encoding for
-the parse tables (@pxref{Bibliography,,Corbett 1984}), and more modern
-techniques for generating the lookahead sets (@pxref{Bibliography,,DeRemer
-1982}).  This approach is the standard one since then.
+the parse tables @pcite{Corbett 1984}, and more modern techniques for
+generating the lookahead sets @pcite{DeRemer 1982}.  This approach is the
+standard one since then.
 
 (It has also been plausibly alleged the differences in the algorithms stem
 mainly from the horrible kludges that Johnson had to perpetrate to make
@@ -13333,6 +15210,66 @@
 Python. Another is goyacc, supporting the Go language. An ``ocamlyacc''
 is shipped as part of the Ocaml compiler suite.
 
+@c ================================================= Version Compatibility
+
+@node Versioning
+@chapter Bison Version Compatibility: Best Practices
+@cindex version
+@cindex compatibility
+
+Bison provides a Yacc compatibility mode in which it strives to conform with
+the POSIX standard.  Grammar files which are written to the POSIX standard, and
+do not take advantage of any of the special capabilities of Bison, should
+work with many versions of Bison without modification.
+
+All other features of Bison are particular to Bison, and are changing.  Bison
+is actively maintained and continuously evolving.  It should come as no
+surprise that an older version of Bison will not accept Bison source code which
+uses newer features that do no not exist at all in the older Bison.
+Regrettably, in spite of reasonable effort to maintain compatibility, the
+reverse situation may also occur: it may happen that code developed using an
+older version of Bison does not build with a newer version of Bison without
+modifications.
+
+Because Bison is a code generation tool, it is possible to retain its output
+and distribute that to the users of the program.  The users are then not
+required to have Bison installed at all, only an implementation of the
+programming language, such as C, which is required for processing the generated
+output.
+
+It is the output of Bison that is intended to be of the utmost portability.
+So, that is to say, whereas the Bison grammar source code may have a dependency
+on specific versions of Bison, the generated parser from any version of Bison
+should work with with a large number of implementations of C, or whatever
+language is applicable.
+
+The recommended best practice for using Bison (in the context of software that
+is distributed in source code form) is to ship the generated parser to the
+downstream users.  Only those downstream users who engage in active development
+of the program who need to make changes to the grammar file need to have Bison
+installed at all, and those users can install the specific version of Bison
+which is required.
+
+Following this recommended practice also makes it possible to use a more recent
+Bison than what is available to users through operating system distributions,
+thereby taking advantage of the latest techniques that Bison allows.
+
+Some features of Bison have been, or are being adopted into other Yacc-like
+programs.  Therefore it might seem that is a good idea to write grammar code
+which targets multiple implementations, similarly to the way C programs are
+often written to target multiple compilers and language versions.  Other than
+the Yacc subset described by POSIX, the Bison language is not rigorously
+standardized.  When a Bison feature is adopted by another parser generator, it
+may be initially compatible with that version of Bison on which it was based,
+but the compatibility may degrade going forward.  Developers who strive to make
+their Bison code simultaneously compatible with other parser generators are
+encouraged to nevertheless use specific versions of all generators, and still
+follow the recommended practice of shipping generated output.  For example,
+a project can internally maintain compatibility with multiple generators,
+and choose the output of a particular one to ship to the users.  Or else,
+the project could ship all of the outputs, arranging for a way for the user
+to specify which one is used to build the program.
+
 @c ================================================= FAQ
 
 @node FAQ
@@ -13367,8 +15304,7 @@
 message.  What can I do?
 @end quotation
 
-This question is already addressed elsewhere, see @ref{Recursion, ,Recursive
-Rules}.
+This question is already addressed elsewhere, see @ref{Recursion}.
 
 @node How Can I Reset the Parser
 @section How Can I Reset the Parser
@@ -13575,15 +15511,14 @@
 
 @quotation
 I have several closely related grammars, and I would like to share their
-implementations.  In fact, I could use a single grammar but with
-multiple entry points.
+implementations.  In fact, I could use a single grammar but with multiple
+entry points.
 @end quotation
 
-Bison does not support multiple start-symbols, but there is a very
-simple means to simulate them.  If @code{foo} and @code{bar} are the two
-pseudo start-symbols, then introduce two new tokens, say
-@code{START_FOO} and @code{START_BAR}, and use them as switches from the
-real start-symbol:
+Bison does not support multiple start-symbols, but there is a very simple
+means to simulate them.  If @code{foo} and @code{bar} are the two pseudo
+start-symbols, then introduce two new tokens, say @code{START_FOO} and
+@code{START_BAR}, and use them as switches from the real start-symbol:
 
 @example
 %token START_FOO START_BAR;
@@ -13593,17 +15528,16 @@
 | START_BAR bar;
 @end example
 
-These tokens prevents the introduction of new conflicts.  As far as the
+These tokens prevent the introduction of new conflicts.  As far as the
 parser goes, that is all that is needed.
 
-Now the difficult part is ensuring that the scanner will send these
-tokens first.  If your scanner is hand-written, that should be
-straightforward.  If your scanner is generated by Lex, them there is
-simple means to do it: recall that anything between @samp{%@{ ... %@}}
-after the first @code{%%} is copied verbatim in the top of the generated
-@code{yylex} function.  Make sure a variable @code{start_token} is
-available in the scanner (e.g., a global variable or using
-@code{%lex-param} etc.), and use the following:
+Now the difficult part is ensuring that the scanner will send these tokens
+first.  If your scanner is hand-written, that should be straightforward.  If
+your scanner is generated by Lex, them there is simple means to do it:
+recall that anything between @samp{%@{ ... %@}} after the first @code{%%} is
+copied verbatim in the top of the generated @code{yylex} function.  Make
+sure a variable @code{start_token} is available in the scanner (e.g., a
+global variable or using @code{%lex-param} etc.), and use the following:
 
 @example
   /* @r{Prologue.} */
@@ -13655,13 +15589,13 @@
 I can't build Bison because my C compiler is too old.
 @end quotation
 
-Except for GLR parsers (@pxref{Compiler Requirements for GLR}), the C
-code that Bison generates requires only C89 or later.  However, Bison
-itself requires common C99 features such as declarations after
-statements.  Bison's @code{configure} script attempts to enable C99 (or
-later) support on compilers that default to pre-C99.  If your compiler
-lacks these C99 features entirely, GCC may well be a better choice; or
-you can try upgrading to your compiler's latest version.
+Except for GLR parsers (which require C99), the C code that Bison generates
+requires only C89 or later.  However, Bison itself requires common C99
+features such as declarations after statements.  Bison's @code{configure}
+script attempts to enable C99 (or later) support on compilers that default
+to pre-C99.  If your compiler lacks these C99 features entirely, GCC may
+well be a better choice; or you can try upgrading to your compiler's latest
+version.
 
 @node Where can I find help?
 @section Where can I find help?
@@ -13719,8 +15653,8 @@
 favorite language here}?
 @end quotation
 
-C++ and Java support is there now, and is documented.  We'd love to add other
-languages; contributions are welcome.
+C++, D and Java are supported.  We'd love to add other languages;
+contributions are welcome.
 
 @node Beta Testing
 @section Beta Testing
@@ -13749,7 +15683,7 @@
 How do I join the help-bison and bug-bison mailing lists?
 @end quotation
 
-See @url{http://lists.gnu.org/}.
+See @url{https://lists.gnu.org/}.
 
 @c ================================================= Table of Symbols
 
@@ -13802,15 +15736,14 @@
 @deffn {Delimiter} %%
 Delimiter used to separate the grammar rule section from the
 Bison declarations section or the epilogue.
-@xref{Grammar Layout, ,The Overall Layout of a Bison Grammar}.
+@xref{Grammar Layout}.
 @end deffn
 
 @c Don't insert spaces, or check the DVI output.
 @deffn {Delimiter} %@{@var{code}%@}
 All code listed between @samp{%@{} and @samp{%@}} is copied verbatim
 to the parser implementation file.  Such code forms the prologue of
-the grammar file.  @xref{Grammar Outline, ,Outline of a Bison
-Grammar}.
+the grammar file.  @xref{Grammar Outline}.
 @end deffn
 
 @deffn {Directive} %?@{@var{expression}@}
@@ -13828,37 +15761,36 @@
 @end deffn
 
 @deffn {Delimiter} :
-Separates a rule's result from its components.  @xref{Rules, ,Syntax of
-Grammar Rules}.
+Separates a rule's result from its components.  @xref{Rules}.
 @end deffn
 
 @deffn {Delimiter} ;
-Terminates a rule.  @xref{Rules, ,Syntax of Grammar Rules}.
+Terminates a rule.  @xref{Rules}.
 @end deffn
 
 @deffn {Delimiter} |
 Separates alternate rules for the same result nonterminal.
-@xref{Rules, ,Syntax of Grammar Rules}.
+@xref{Rules}.
 @end deffn
 
 @deffn {Directive} <*>
 Used to define a default tagged @code{%destructor} or default tagged
 @code{%printer}.
 
-@xref{Destructor Decl, , Freeing Discarded Symbols}.
+@xref{Destructor Decl}.
 @end deffn
 
 @deffn {Directive} <>
 Used to define a default tagless @code{%destructor} or default tagless
 @code{%printer}.
 
-@xref{Destructor Decl, , Freeing Discarded Symbols}.
+@xref{Destructor Decl}.
 @end deffn
 
 @deffn {Symbol} $accept
 The predefined nonterminal whose only rule is @samp{$accept: @var{start}
-$end}, where @var{start} is the start symbol.  @xref{Start Decl, , The
-Start-Symbol}.  It cannot be used in the grammar.
+$end}, where @var{start} is the start symbol.  @xref{Start Decl}.  It cannot
+be used in the grammar.
 @end deffn
 
 @deffn {Directive} %code @{@var{code}@}
@@ -13875,8 +15807,7 @@
 @ifset defaultprec
 @deffn {Directive} %default-prec
 Assign a precedence to rules that lack an explicit @samp{%prec}
-modifier.  @xref{Contextual Precedence, ,Context-Dependent
-Precedence}.
+modifier.  @xref{Contextual Precedence}.
 @end deffn
 @end ifset
 
@@ -13888,24 +15819,19 @@
 @end deffn
 
 @deffn {Directive} %defines
-Bison declaration to create a parser header file, which is usually
-meant for the scanner.  @xref{Decl Summary}.
-@end deffn
-
-@deffn {Directive} %defines @var{defines-file}
-Same as above, but save in the file @var{defines-file}.
+@deffnx {Directive} %defines @var{defines-file}
+Historical name for @code{%header}.
 @xref{Decl Summary}.
 @end deffn
 
 @deffn {Directive} %destructor
 Specify how the parser should reclaim the memory associated to
-discarded symbols.  @xref{Destructor Decl, , Freeing Discarded Symbols}.
+discarded symbols.  @xref{Destructor Decl}.
 @end deffn
 
 @deffn {Directive} %dprec
 Bison declaration to assign a precedence to a rule that is used at parse
-time to resolve reduce/reduce conflicts.  @xref{GLR Parsers, ,Writing
-GLR Parsers}.
+time to resolve reduce/reduce conflicts.  @xref{GLR Parsers}.
 @end deffn
 
 @deffn {Directive} %empty
@@ -13930,8 +15856,7 @@
 @end deffn
 
 @deffn {Directive} %error-verbose
-An obsolete directive standing for @samp{%define parse.error verbose}
-(@pxref{Error Reporting, ,The Error Reporting Function @code{yyerror}}).
+An obsolete directive standing for @samp{%define parse.error verbose}.
 @end deffn
 
 @deffn {Directive} %file-prefix "@var{prefix}"
@@ -13941,11 +15866,21 @@
 
 @deffn {Directive} %glr-parser
 Bison declaration to produce a GLR parser.  @xref{GLR
-Parsers, ,Writing GLR Parsers}.
+Parsers}.
+@end deffn
+
+@deffn {Directive} %header
+Bison declaration to create a parser header file, which is usually
+meant for the scanner.  @xref{Decl Summary}.
+@end deffn
+
+@deffn {Directive} %header @var{header-file}
+Same as above, but save in the file @var{header-file}.
+@xref{Decl Summary}.
 @end deffn
 
 @deffn {Directive} %initial-action
-Run user code before parsing.  @xref{Initial Action Decl, , Performing Actions before Parsing}.
+Run user code before parsing.  @xref{Initial Action Decl}.
 @end deffn
 
 @deffn {Directive} %language
@@ -13955,25 +15890,24 @@
 
 @deffn {Directive} %left
 Bison declaration to assign precedence and left associativity to token(s).
-@xref{Precedence Decl, ,Operator Precedence}.
+@xref{Precedence Decl}.
 @end deffn
 
 @deffn {Directive} %lex-param @{@var{argument-declaration}@} @dots{}
 Bison declaration to specifying additional arguments that
-@code{yylex} should accept.  @xref{Pure Calling,, Calling Conventions
-for Pure Parsers}.
+@code{yylex} should accept.  @xref{Pure Calling}.
 @end deffn
 
 @deffn {Directive} %merge
 Bison declaration to assign a merging function to a rule.  If there is a
 reduce/reduce conflict with a rule having the same merging function, the
 function is applied to the two semantic values to get a single result.
-@xref{GLR Parsers, ,Writing GLR Parsers}.
+@xref{GLR Parsers}.
 @end deffn
 
 @deffn {Directive} %name-prefix "@var{prefix}"
 Obsoleted by the @code{%define} variable @code{api.prefix} (@pxref{Multiple
-Parsers, ,Multiple Parsers in the Same Program}).
+Parsers}).
 
 Rename the external symbols (variables and functions) used in the parser so
 that they start with @var{prefix} instead of @samp{yy}.  Contrary to
@@ -13993,8 +15927,7 @@
 @ifset defaultprec
 @deffn {Directive} %no-default-prec
 Do not assign a precedence to rules that lack an explicit @samp{%prec}
-modifier.  @xref{Contextual Precedence, ,Context-Dependent
-Precedence}.
+modifier.  @xref{Contextual Precedence}.
 @end deffn
 @end ifset
 
@@ -14005,12 +15938,11 @@
 
 @deffn {Directive} %nonassoc
 Bison declaration to assign precedence and nonassociativity to token(s).
-@xref{Precedence Decl, ,Operator Precedence}.
+@xref{Precedence Decl}.
 @end deffn
 
 @deffn {Directive} %nterm
-Bison declaration to declare nonterminals.  @xref{Type Decl, ,Nonterminal
-Symbols}.
+Bison declaration to declare nonterminals.  @xref{Type Decl}.
 @end deffn
 
 @deffn {Directive} %output "@var{file}"
@@ -14020,39 +15952,37 @@
 
 @deffn {Directive} %param @{@var{argument-declaration}@} @dots{}
 Bison declaration to specify additional arguments that both
-@code{yylex} and @code{yyparse} should accept.  @xref{Parser Function,, The
-Parser Function @code{yyparse}}.
+@code{yylex} and @code{yyparse} should accept.  @xref{Parser Function}.
 @end deffn
 
 @deffn {Directive} %parse-param @{@var{argument-declaration}@} @dots{}
 Bison declaration to specify additional arguments that @code{yyparse}
-should accept.  @xref{Parser Function,, The Parser Function @code{yyparse}}.
+should accept.  @xref{Parser Function}.
 @end deffn
 
 @deffn {Directive} %prec
 Bison declaration to assign a precedence to a specific rule.
-@xref{Contextual Precedence, ,Context-Dependent Precedence}.
+@xref{Contextual Precedence}.
 @end deffn
 
 @deffn {Directive} %precedence
 Bison declaration to assign precedence to token(s), but no associativity
-@xref{Precedence Decl, ,Operator Precedence}.
+@xref{Precedence Decl}.
 @end deffn
 
 @deffn {Directive} %pure-parser
 Deprecated version of @samp{%define api.pure} (@pxref{%define
-Summary,,api.pure}), for which Bison is more careful to warn about
+Summary}), for which Bison is more careful to warn about
 unreasonable usage.
 @end deffn
 
 @deffn {Directive} %require "@var{version}"
-Require version @var{version} or higher of Bison.  @xref{Require Decl, ,
-Require a Version of Bison}.
+Require version @var{version} or higher of Bison.  @xref{Require Decl}.
 @end deffn
 
 @deffn {Directive} %right
 Bison declaration to assign precedence and right associativity to token(s).
-@xref{Precedence Decl, ,Operator Precedence}.
+@xref{Precedence Decl}.
 @end deffn
 
 @deffn {Directive} %skeleton
@@ -14061,23 +15991,21 @@
 @end deffn
 
 @deffn {Directive} %start
-Bison declaration to specify the start symbol.  @xref{Start Decl, ,The
-Start-Symbol}.
+Bison declaration to specify the start symbol.  @xref{Start Decl}.
 @end deffn
 
 @deffn {Directive} %token
 Bison declaration to declare token(s) without specifying precedence.
-@xref{Token Decl, ,Token Type Names}.
+@xref{Token Decl}.
 @end deffn
 
 @deffn {Directive} %token-table
-Bison declaration to include a token name table in the parser
-implementation file.  @xref{Decl Summary}.
+Bison declaration to include a token name table in the parser implementation
+file.  @xref{Decl Summary}.
 @end deffn
 
 @deffn {Directive} %type
-Bison declaration to declare symbol value types.  @xref{Type Decl,
-,Nonterminal Symbols}.
+Bison declaration to declare symbol value types.  @xref{Type Decl}.
 @end deffn
 
 @deffn {Symbol} $undefined
@@ -14088,14 +16016,13 @@
 
 @deffn {Directive} %union
 Bison declaration to specify several possible data types for semantic
-values.  @xref{Union Decl, ,The Union Declaration}.
+values.  @xref{Union Decl}.
 @end deffn
 
 @deffn {Macro} YYABORT
-Macro to pretend that an unrecoverable syntax error has occurred, by
-making @code{yyparse} return 1 immediately.  The error reporting
-function @code{yyerror} is not called.  @xref{Parser Function, ,The
-Parser Function @code{yyparse}}.
+Macro to pretend that an unrecoverable syntax error has occurred, by making
+@code{yyparse} return 1 immediately.  The error reporting function
+@code{yyerror} is not called.  @xref{Parser Function}.
 
 For Java parsers, this functionality is invoked using @code{return YYABORT;}
 instead.
@@ -14104,7 +16031,7 @@
 @deffn {Macro} YYACCEPT
 Macro to pretend that a complete utterance of the language has been
 read, by making @code{yyparse} return 0 immediately.
-@xref{Parser Function, ,The Parser Function @code{yyparse}}.
+@xref{Parser Function}.
 
 For Java parsers, this functionality is invoked using @code{return YYACCEPT;}
 instead.
@@ -14112,14 +16039,20 @@
 
 @deffn {Macro} YYBACKUP
 Macro to discard a value from the parser stack and fake a lookahead
-token.  @xref{Action Features, ,Special Features for Use in Actions}.
+token.  @xref{Action Features}.
+@end deffn
+
+@deffn {Macro} YYBISON
+The version of Bison as an integer, for instance 30704 for version 3.7.4.
+Defined in @file{yacc.c} only.  Before version 3.7.4, @code{YYBISON} was
+defined to 1.
 @end deffn
 
 @deffn {Variable} yychar
 External integer variable that contains the integer value of the
 lookahead token.  (In a pure parser, it is a local variable within
 @code{yyparse}.)  Error-recovery rule actions may examine this variable.
-@xref{Action Features, ,Special Features for Use in Actions}.
+@xref{Action Features}.
 @end deffn
 
 @deffn {Variable} yyclearin
@@ -14128,14 +16061,21 @@
 @end deffn
 
 @deffn {Macro} YYDEBUG
-Macro to define to equip the parser with tracing code.  @xref{Tracing,
-,Tracing Your Parser}.
+Macro to define to equip the parser with tracing code.  @xref{Tracing}.
 @end deffn
 
 @deffn {Variable} yydebug
 External integer variable set to zero by default.  If @code{yydebug}
 is given a nonzero value, the parser will output information on input
-symbols and parser action.  @xref{Tracing, ,Tracing Your Parser}.
+symbols and parser action.  @xref{Tracing}.
+@end deffn
+
+@deffn {Value} YYEMPTY
+The pseudo token kind when there is no lookahead token.
+@end deffn
+
+@deffn {Value} YYEOF
+The token kind denoting is the end of the input stream.
 @end deffn
 
 @deffn {Macro} yyerrok
@@ -14156,20 +16096,11 @@
 
 @deffn {Function} yyerror
 User-supplied function to be called by @code{yyparse} on error.
-@xref{Error Reporting, ,The Error Reporting Function @code{yyerror}}.
-@end deffn
-
-@deffn {Macro} YYERROR_VERBOSE
-An obsolete macro used in the @file{yacc.c} skeleton, that you define
-with @code{#define} in the prologue to request verbose, specific error
-message strings when @code{yyerror} is called.  It doesn't matter what
-definition you use for @code{YYERROR_VERBOSE}, just whether you define
-it.  Using @samp{%define parse.error verbose} is preferred
-(@pxref{Error Reporting, ,The Error Reporting Function @code{yyerror}}).
+@xref{Error Reporting Function}.
 @end deffn
 
 @deffn {Macro} YYFPRINTF
-Macro used to output run-time traces.
+Macro used to output run-time traces in C.
 @xref{Enabling Traces}.
 @end deffn
 
@@ -14180,8 +16111,7 @@
 
 @deffn {Function} yylex
 User-supplied lexical analyzer function, called with no arguments to get
-the next token.  @xref{Lexical, ,The Lexical Analyzer Function
-@code{yylex}}.
+the next token.  @xref{Lexical}.
 @end deffn
 
 @deffn {Variable} yylloc
@@ -14191,14 +16121,14 @@
 @code{yylex}.)
 You can ignore this variable if you don't use the @samp{@@} feature in the
 grammar actions.
-@xref{Token Locations, ,Textual Locations of Tokens}.
+@xref{Token Locations}.
 In semantic actions, it stores the location of the lookahead token.
-@xref{Actions and Locations, ,Actions and Locations}.
+@xref{Actions and Locations}.
 @end deffn
 
 @deffn {Type} YYLTYPE
-Data type of @code{yylloc}; by default, a structure with four
-members.  @xref{Location Type, , Data Types of Locations}.
+Data type of @code{yylloc}.  By default in C, a structure with four members
+(start/end line/column).  @xref{Location Type}.
 @end deffn
 
 @deffn {Variable} yylval
@@ -14206,9 +16136,9 @@
 value associated with a token.  (In a pure parser, it is a local
 variable within @code{yyparse}, and its address is passed to
 @code{yylex}.)
-@xref{Token Values, ,Semantic Values of Tokens}.
+@xref{Token Values}.
 In semantic actions, it stores the semantic value of the lookahead token.
-@xref{Actions, ,Actions}.
+@xref{Actions}.
 @end deffn
 
 @deffn {Macro} YYMAXDEPTH
@@ -14220,52 +16150,49 @@
 Global variable which Bison increments each time it reports a syntax error.
 (In a pure parser, it is a local variable within @code{yyparse}. In a
 pure push parser, it is a member of @code{yypstate}.)
-@xref{Error Reporting, ,The Error Reporting Function @code{yyerror}}.
+@xref{Error Reporting Function}.
+@end deffn
+
+@deffn {Macro} YYNOMEM
+Macro to pretend that memory is exhausted, by making @code{yyparse} return 2
+immediately.  The error reporting function @code{yyerror} is called.
+@xref{Parser Function}.
 @end deffn
 
 @deffn {Function} yyparse
 The parser function produced by Bison; call this function to start
-parsing.  @xref{Parser Function, ,The Parser Function @code{yyparse}}.
-@end deffn
-
-@deffn {Macro} YYPRINT
-Macro used to output token semantic values.  For @file{yacc.c} only.
-Deprecated, use @code{%printer} instead (@pxref{Printer Decl, , Printing
-Semantic Values}).
-@xref{The YYPRINT Macro, , The @code{YYPRINT} Macro}.
+parsing.  @xref{Parser Function}.
 @end deffn
 
 @deffn {Function} yypstate_delete
 The function to delete a parser instance, produced by Bison in push mode;
 call this function to delete the memory associated with a parser.
-@xref{Parser Delete Function, ,The Parser Delete Function
-@code{yypstate_delete}}.  Does nothing when called with a null pointer.
+@xref{yypstate_delete,,@code{yypstate_delete}}.  Does nothing when called
+with a null pointer.
 @end deffn
 
 @deffn {Function} yypstate_new
 The function to create a parser instance, produced by Bison in push mode;
 call this function to create a new parser.
-@xref{Parser Create Function, ,The Parser Create Function
-@code{yypstate_new}}.
+@xref{yypstate_new,,@code{yypstate_new}}.
 @end deffn
 
 @deffn {Function} yypull_parse
 The parser function produced by Bison in push mode; call this function to
 parse the rest of the input stream.
-@xref{Pull Parser Function, ,The Pull Parser Function
-@code{yypull_parse}}.
+@xref{yypull_parse,,@code{yypull_parse}}.
 @end deffn
 
 @deffn {Function} yypush_parse
 The parser function produced by Bison in push mode; call this function to
-parse a single token.  @xref{Push Parser Function, ,The Push Parser Function
-@code{yypush_parse}}.
+parse a single token.
+@xref{yypush_parse,,@code{yypush_parse}}.
 @end deffn
 
 @deffn {Macro} YYRECOVERING
 The expression @code{YYRECOVERING ()} yields 1 when the parser
 is recovering from a syntax error, and 0 otherwise.
-@xref{Action Features, ,Special Features for Use in Actions}.
+@xref{Action Features}.
 @end deffn
 
 @deffn {Macro} YYSTACK_USE_ALLOCA
@@ -14287,11 +16214,31 @@
 @end deffn
 
 @deffn {Type} YYSTYPE
+In C, data type of semantic values; @code{int} by default.
 Deprecated in favor of the @code{%define} variable @code{api.value.type}.
-Data type of semantic values; @code{int} by default.
-@xref{Value Type, ,Data Types of Semantic Values}.
+@xref{Value Type}.
 @end deffn
 
+@deffn {Type} yysymbol_kind_t
+An enum of all the symbols, tokens and nonterminals, of the grammar.
+@xref{Syntax Error Reporting Function}.  The symbol kinds are used
+internally by the parser, and should not be confused with the token kinds:
+the symbol kind of a terminal symbol is not equal to its token kind! (Unless
+@samp{%define api.token.raw} was used.)
+@end deffn
+
+@deffn {Type} yytoken_kind_t
+An enum of all the @dfn{token kinds} declared with @code{%token}
+(@pxref{Token Decl}).  These are the return values for @code{yylex}.  They
+should not be confused with the @emph{symbol kinds}, used internally by the
+parser.
+@end deffn
+
+@deffn {Value} YYUNDEF
+The token kind denoting an unknown token.
+@end deffn
+
+
 @node Glossary
 @appendix Glossary
 @cindex glossary
@@ -14300,13 +16247,13 @@
 @item Accepting state
 A state whose only action is the accept action.
 The accepting state is thus a consistent state.
-@xref{Understanding, ,Understanding Your Parser}.
+@xref{Understanding}.
 
 @item Backus-Naur Form (BNF; also called ``Backus Normal Form'')
 Formal method of specifying context-free grammars originally proposed
 by John Backus, and slightly improved by Peter Naur in his 1960-01-02
 committee document contributing to what became the Algol 60 report.
-@xref{Language and Grammar, ,Languages and Context-Free Grammars}.
+@xref{Language and Grammar}.
 
 @item Consistent state
 A state containing only one possible action.  @xref{Default Reductions}.
@@ -14315,8 +16262,23 @@
 Grammars specified as rules that can be applied regardless of context.
 Thus, if there is a rule which says that an integer can be used as an
 expression, integers are allowed @emph{anywhere} an expression is
-permitted.  @xref{Language and Grammar, ,Languages and Context-Free
-Grammars}.
+permitted.  @xref{Language and Grammar}.
+
+@item Counterexample
+A sequence of tokens and/or nonterminals, with one dot, that demonstrates a
+conflict.  The dot marks the place where the conflict occurs.
+
+@cindex unifying counterexample
+@cindex counterexample, unifying
+@cindex nonunifying counterexample
+@cindex counterexample, nonunifying
+A @emph{unifying} counterexample is a single string that has two different
+parses; its existence proves that the grammar is ambiguous.  When a unifying
+counterexample cannot be found in reasonable time, a @emph{nonunifying}
+counterexample is built: @emph{two} different string sharing the prefix up
+to the dot.
+
+@xref{Counterexamples}
 
 @item Default reduction
 The reduction that a parser should perform if the current parser state
@@ -14342,7 +16304,7 @@
 machine moves from state to state as specified by the logic of the
 machine.  In the case of the parser, the input is the language being
 parsed, and the states correspond to various stages in the grammar
-rules.  @xref{Algorithm, ,The Bison Parser Algorithm}.
+rules.  @xref{Algorithm}.
 
 @item Generalized LR (GLR)
 A parsing algorithm that can handle all context-free grammars, including those
@@ -14350,13 +16312,12 @@
 deterministic parsing
 algorithm cannot by effectively splitting off multiple parsers, trying all
 possible parsers, and discarding those that fail in the light of additional
-right context.  @xref{Generalized LR Parsing, ,Generalized
-LR Parsing}.
+right context.  @xref{Generalized LR Parsing}.
 
 @item Grouping
 A language construct that is (in general) grammatically divisible;
 for example, `expression' or `declaration' in C@.
-@xref{Language and Grammar, ,Languages and Context-Free Grammars}.
+@xref{Language and Grammar}.
 
 @item IELR(1) (Inadequacy Elimination LR(1))
 A minimal LR(1) parser table construction algorithm.  That is, given any
@@ -14376,6 +16337,30 @@
 @item Input stream
 A continuous flow of data between devices or programs.
 
+@item Kind
+``Token'' and ``symbol'' are each overloaded to mean either a grammar symbol
+(kind) or all parse info (kind, value, location) associated with occurrences
+of that grammar symbol from the input.  To disambiguate,
+
+@itemize
+@item
+we use ``token kind'' and ``symbol kind'' to mean both grammar symbols and
+the values that represent them in a base programming language (C, C++,
+etc.).  The names of the types of these values are typically
+@code{token_kind_t}, or @code{token_kind_type}, or @code{TokenKind},
+depending on the programming language.
+
+@item
+we use ``token'' and ``symbol'' without the word ``kind'' to mean parsed
+occurrences, and we append the word ``type'' to refer to the types that
+represent them in a base programming language.
+@end itemize
+
+In summary: When you see ``kind'', interpret ``symbol'' or ``token'' to mean
+a @emph{grammar symbol}.  When you don't see ``kind'' (including when you
+see ``type''), interpret ``symbol'' or ``token'' to mean a @emph{parsed
+symbol}.
+
 @item LAC (Lookahead Correction)
 A parsing mechanism that fixes the problem of delayed syntax error
 detection, which is caused by LR state merging, default reductions, and the
@@ -14387,25 +16372,24 @@
 @item Language construct
 One of the typical usage schemas of the language.  For example, one of
 the constructs of the C language is the @code{if} statement.
-@xref{Language and Grammar, ,Languages and Context-Free Grammars}.
+@xref{Language and Grammar}.
 
 @item Left associativity
 Operators having left associativity are analyzed from left to right:
 @samp{a+b+c} first computes @samp{a+b} and then combines with
-@samp{c}.  @xref{Precedence, ,Operator Precedence}.
+@samp{c}.  @xref{Precedence}.
 
 @item Left recursion
 A rule whose result symbol is also its first component symbol; for
-example, @samp{expseq1 : expseq1 ',' exp;}.  @xref{Recursion, ,Recursive
-Rules}.
+example, @samp{expseq1 : expseq1 ',' exp;}.  @xref{Recursion}.
 
 @item Left-to-right parsing
 Parsing a sentence of a language by analyzing it token by token from
-left to right.  @xref{Algorithm, ,The Bison Parser Algorithm}.
+left to right.  @xref{Algorithm}.
 
 @item Lexical analyzer (scanner)
 A function that reads an input stream and returns tokens one by one.
-@xref{Lexical, ,The Lexical Analyzer Function @code{yylex}}.
+@xref{Lexical}.
 
 @item Lexical tie-in
 A flag, set by actions in the grammar rules, which alters the way
@@ -14415,8 +16399,7 @@
 A token which consists of two or more fixed characters.  @xref{Symbols}.
 
 @item Lookahead token
-A token already read but not yet shifted.  @xref{Lookahead, ,Lookahead
-Tokens}.
+A token already read but not yet shifted.  @xref{Lookahead}.
 
 @item LALR(1)
 The class of context-free grammars that Bison (like most other parser
@@ -14443,61 +16426,67 @@
 
 @item Reduction
 Replacing a string of nonterminals and/or terminals with a single
-nonterminal, according to a grammar rule.  @xref{Algorithm, ,The Bison
-Parser Algorithm}.
+nonterminal, according to a grammar rule.  @xref{Algorithm}.
 
 @item Reentrant
 A reentrant subprogram is a subprogram which can be in invoked any
 number of times in parallel, without interference between the various
-invocations.  @xref{Pure Decl, ,A Pure (Reentrant) Parser}.
+invocations.  @xref{Pure Decl}.
 
 @item Reverse Polish Notation
 A language in which all operators are postfix operators.
 
 @item Right recursion
 A rule whose result symbol is also its last component symbol; for
-example, @samp{expseq1: exp ',' expseq1;}.  @xref{Recursion, ,Recursive
-Rules}.
+example, @samp{expseq1: exp ',' expseq1;}.  @xref{Recursion}.
 
 @item Semantics
 In computer languages, the semantics are specified by the actions
 taken for each instance of the language, i.e., the meaning of
-each statement.  @xref{Semantics, ,Defining Language Semantics}.
+each statement.  @xref{Semantics}.
 
 @item Shift
 A parser is said to shift when it makes the choice of analyzing
 further input from the stream rather than reducing immediately some
-already-recognized rule.  @xref{Algorithm, ,The Bison Parser Algorithm}.
+already-recognized rule.  @xref{Algorithm}.
 
 @item Single-character literal
 A single character that is recognized and interpreted as is.
-@xref{Grammar in Bison, ,From Formal Rules to Bison Input}.
+@xref{Grammar in Bison}.
 
 @item Start symbol
 The nonterminal symbol that stands for a complete valid utterance in
 the language being parsed.  The start symbol is usually listed as the
 first nonterminal symbol in a language specification.
-@xref{Start Decl, ,The Start-Symbol}.
+@xref{Start Decl}.
+
+@item Symbol kind
+A (finite) enumeration of the grammar symbols, as processed by the parser.
+@xref{Symbols}.
 
 @item Symbol table
-A data structure where symbol names and associated data are stored
-during parsing to allow for recognition and use of existing
-information in repeated uses of a symbol.  @xref{Multi-function Calc}.
+A data structure where symbol names and associated data are stored during
+parsing to allow for recognition and use of existing information in repeated
+uses of a symbol.  @xref{Multi-function Calc}.
 
 @item Syntax error
 An error encountered during parsing of an input stream due to invalid
 syntax.  @xref{Error Recovery}.
 
-@item Token
-A basic, grammatically indivisible unit of a language.  The symbol
-that describes a token in the grammar is a terminal symbol.
-The input of the Bison parser is a stream of tokens which comes from
-the lexical analyzer.  @xref{Symbols}.
-
 @item Terminal symbol
 A grammar symbol that has no rules in the grammar and therefore is
 grammatically indivisible.  The piece of text it represents is a token.
-@xref{Language and Grammar, ,Languages and Context-Free Grammars}.
+@xref{Language and Grammar}.
+
+@item Token
+A basic, grammatically indivisible unit of a language.  The symbol that
+describes a token in the grammar is a terminal symbol.  The input of the
+Bison parser is a stream of tokens which comes from the lexical analyzer.
+@xref{Symbols}.
+
+@item Token kind
+A (finite) enumeration of the grammar terminals, as discriminated by the
+scanner.  @xref{Symbols}.
 
 @item Unreachable state
 A parser state to which there does not exist a sequence of transitions from
@@ -14514,8 +16503,10 @@
 @unnumbered Bibliography
 
 @c Please follow the following canvas to add more references.
+@c And keep sorted alphabetically.
 
 @table @asis
+@anchor{Corbett 1984}
 @item [Corbett 1984]
 @c author
 Robert Paul Corbett,
@@ -14529,32 +16520,46 @@
 @c when
 (June 1985).
 @c url
-@uref{http://xtf.lib.berkeley.edu/reports/TRWebData/accessPages/CSD-85-251.html}
+@uref{https://digicoll.lib.berkeley.edu/record/135875}
 
+@anchor{Denny 2008}
 @item [Denny 2008]
 Joel E. Denny and Brian A. Malloy, IELR(1): Practical LR(1) Parser Tables
 for Non-LR(1) Grammars with Conflict Resolution, in @cite{Proceedings of the
 2008 ACM Symposium on Applied Computing} (SAC'08), ACM, New York, NY, USA,
-pp.@: 240--245.  @uref{http://dx.doi.org/10.1145/1363686.1363747}
+pp.@: 240--245.  @uref{https://dx.doi.org/10.1145/1363686.1363747}
 
+@anchor{Denny 2010 May}
 @item [Denny 2010 May]
 Joel E. Denny, PSLR(1): Pseudo-Scannerless Minimal LR(1) for the
 Deterministic Parsing of Composite Languages, Ph.D. Dissertation, Clemson
 University, Clemson, SC, USA (May 2010).
-@uref{http://proquest.umi.com/pqdlink?did=2041473591&Fmt=7&clientId=79356&RQT=309&VName=PQD}
+@uref{https://tigerprints.clemson.edu/all_dissertations/519/}
 
+@anchor{Denny 2010 November}
 @item [Denny 2010 November]
 Joel E. Denny and Brian A. Malloy, The IELR(1) Algorithm for Generating
 Minimal LR(1) Parser Tables for Non-LR(1) Grammars with Conflict Resolution,
 in @cite{Science of Computer Programming}, Vol.@: 75, Issue 11 (November
-2010), pp.@: 943--979.  @uref{http://dx.doi.org/10.1016/j.scico.2009.08.001}
+2010), pp.@: 943--979.  @uref{https://dx.doi.org/10.1016/j.scico.2009.08.001}
 
+@anchor{DeRemer 1982}
 @item [DeRemer 1982]
 Frank DeRemer and Thomas Pennello, Efficient Computation of LALR(1)
 Look-Ahead Sets, in @cite{ACM Transactions on Programming Languages and
 Systems}, Vol.@: 4, No.@: 4 (October 1982), pp.@:
-615--649. @uref{http://dx.doi.org/10.1145/69622.357187}
+615--649. @uref{https://dx.doi.org/10.1145/69622.357187}
 
+@anchor{Isradisaikul 2015}
+@item [Isradisaikul 2015]
+Chinawat Isradisaikul, Andrew Myers,
+Finding Counterexamples from Parsing Conflicts,
+in @cite{Proceedings of the 36th ACM SIGPLAN Conference on
+Programming Language Design and Implementation} (PLDI '15),
+ACM, pp.@: 555--564.
+@uref{https://www.cs.cornell.edu/andru/papers/cupex/cupex.pdf}
+
+@anchor{Johnson 1978}
 @item [Johnson 1978]
 Steven C. Johnson,
 A portable compiler: theory and practice,
@@ -14563,16 +16568,18 @@
 pp.@: 97--104.
 @uref{https://dx.doi.org/10.1145/512760.512771}.
 
+@anchor{Knuth 1965}
 @item [Knuth 1965]
 Donald E. Knuth, On the Translation of Languages from Left to Right, in
 @cite{Information and Control}, Vol.@: 8, Issue 6 (December 1965), pp.@:
-607--639. @uref{http://dx.doi.org/10.1016/S0019-9958(65)90426-2}
+607--639. @uref{https://dx.doi.org/10.1016/S0019-9958(65)90426-2}
 
+@anchor{Scott 2000}
 @item [Scott 2000]
 Elizabeth Scott, Adrian Johnstone, and Shamsa Sadaf Hussain,
 @cite{Tomita-Style Generalised LR Parsers}, Royal Holloway, University of
 London, Department of Computer Science, TR-00-12 (December 2000).
-@uref{http://www.cs.rhul.ac.uk/research/languages/publications/tomita_style_1.ps}
+@uref{https://www.cs.rhul.ac.uk/research/languages/publications/tomita_style_1.ps}
 @end table
 
 @node Index of Terms
@@ -14590,7 +16597,7 @@
 @c LocalWords: rpcalc Lexer Expr ltcalc mfcalc yylex defaultprec Donnelly Gotos
 @c LocalWords: yyerror pxref LR yylval cindex dfn LALR samp gpl BNF xref yypush
 @c LocalWords: const int paren ifnotinfo AC noindent emph expr stmt findex lr
-@c LocalWords: glr YYSTYPE TYPENAME prog dprec printf decl init stmtMerge POSIX
+@c LocalWords: glr YYSTYPE TYPENAME prog dprec printf decl init POSIX ODR
 @c LocalWords: pre STDC GNUC endif yy YY alloca lf stddef stdlib YYDEBUG yypull
 @c LocalWords: NUM exp subsubsection kbd Ctrl ctype EOF getchar isdigit nonfree
 @c LocalWords: ungetc stdin scanf sc calc ulator ls lm cc NEG prec yyerrok rr
@@ -14598,14 +16605,14 @@
 @c LocalWords: symrec val tptr FUN func struct sym enum IEC syntaxes Byacc
 @c LocalWords: fun putsym getsym arith funs atan ptr malloc sizeof Lex pcc
 @c LocalWords: strlen strcpy fctn strcmp isalpha symbuf realloc isalnum DOTDOT
-@c LocalWords: ptypes itype YYPRINT trigraphs yytname expseq vindex dtype Unary
+@c LocalWords: ptypes itype trigraphs yytname expseq vindex dtype Unary usr
 @c LocalWords: Rhs YYRHSLOC LE nonassoc op deffn typeless yynerrs nonterminal
 @c LocalWords: yychar yydebug msg YYNTOKENS YYNNTS YYNRULES YYNSTATES reentrant
 @c LocalWords: cparse clex deftypefun NE defmac YYACCEPT YYABORT param yypstate
 @c LocalWords: strncmp intval tindex lvalp locp llocp typealt YYBACKUP subrange
 @c LocalWords: YYEMPTY YYEOF YYRECOVERING yyclearin GE def UMINUS maybeword loc
 @c LocalWords: Johnstone Shamsa Sadaf Hussain Tomita TR uref YYMAXDEPTH inline
-@c LocalWords: YYINITDEPTH stmts ref initdcl maybeasm notype Lookahead
+@c LocalWords: YYINITDEPTH stmts ref initdcl maybeasm notype Lookahead ctx
 @c LocalWords: hexflag STR exdent itemset asis DYYDEBUG YYFPRINTF args Autoconf
 @c LocalWords: ypp yxx itemx tex leaderfill Troubleshouting sqrt Graphviz
 @c LocalWords: hbox hss hfill tt ly yyin fopen fclose ofirst gcc ll lookahead
@@ -14621,9 +16628,9 @@
 @c LocalWords: YYENABLE bindtextdomain Makefile DEFS CPPFLAGS DBISON DeRemer
 @c LocalWords: autoreconf Pennello multisets nondeterminism Generalised baz ACM
 @c LocalWords: redeclare automata Dparse localedir datadir XSLT midrule Wno
-@c LocalWords: multitable headitem hh basename Doxygen fno filename gdef
+@c LocalWords: multitable headitem hh basename Doxygen fno filename gdef de
 @c LocalWords: doxygen ival sval deftypemethod deallocate pos deftypemethodx
-@c LocalWords: Ctor defcv defcvx arg accessors arithmetics CPP ifndef CALCXX
+@c LocalWords: Ctor defcv defcvx arg accessors CPP ifndef CALCXX YYerror
 @c LocalWords: lexer's calcxx bool LPAREN RPAREN deallocation cerrno climits
 @c LocalWords: cstdlib Debian undef yywrap unput noyywrap nounput zA yyleng
 @c LocalWords: errno strtol ERANGE str strerror iostream argc argv Javadoc PSLR
@@ -14645,14 +16652,27 @@
 @c LocalWords: fdiagnostics setlocale nullptr ast srcdir iff drv rgbWarning
 @c LocalWords: deftypefunx pragma Wnull dereference Wdocumentation elif ish
 @c LocalWords: Wdeprecated Wregister noinput yyloc yypos PODs sstream Wsign
-@c LocalWords: typename emplace Wconversion Wshorten yacchack reentrancy
+@c LocalWords: typename emplace Wconversion Wshorten yacchack reentrancy ou
 @c LocalWords: Relocatability exprs fixit Wyacc parseable fixits ffixit svg
 @c LocalWords: DNDEBUG cstring Wzero workalike POPL workalikes byacc UCB
-@c LocalWords: Penello's Penello Byson Byson's Corbett's CSD TOPLAS PDP
-@c LocalWords: Beazley's goyacc ocamlyacc SIGACT SIGPLAN colorWarning
+@c LocalWords: Penello's Penello Byson Byson's Corbett's CSD TOPLAS PDP cex
+@c LocalWords: Beazley's goyacc ocamlyacc SIGACT SIGPLAN colorWarning exVal
 @c LocalWords: setcolor rgbError colorError rgbNotice colorNotice derror
 @c LocalWords: colorOff maincolor inlineraw darkviolet darkcyan dwarning
-@c LocalWords: dnotice copyable stdint ptrdiff bufsize
+@c LocalWords: dnotice copyable stdint ptrdiff bufsize yyreport invariants
+@c LocalWords: xrefautomaticsectiontitle yysyntax yysymbol ARGMAX cond RTTI
+@c LocalWords: Wdangling yytoken erreur syntaxe inattendu attendait nombre
+@c LocalWords: YYUNDEF SymbolKind yypcontext YYENOMEM TOKENMAX getBundle
+@c LocalWords: ResourceBundle myResources getString getName getToken ylwrap
+@c LocalWords: getLocation getExpectedTokens reportSyntaxError bistromathic
+@c LocalWords: TokenKind Automake's rtti Wcounterexamples Chinawat PLDI buf
+@c LocalWords: Isradisaikul tcite pcite rgbGreen colorGreen rgbYellow Wcex
+@c LocalWords: colorYellow rgbRed colorRed rgbBlue colorBlue rgbPurple Ddoc
+@c LocalWords: colorPurple ifhtml ifnothtml situ rcex MERCHANTABILITY Wnone
+@c LocalWords: diagError diagNotice diagWarning diagOff danglingElseCex
+@c LocalWords: nonunifying YYNOMEM Wuseless dgettext textdomain domainname
+@c LocalWords: dirname typeof writeln YYBISON YYLOCATION backend structs
+@c LocalWords: pushParse
 
 @c Local Variables:
 @c ispell-dictionary: "american"
diff --git a/doc/cross-options.texi b/doc/cross-options.texi
index 9afdf15..f0c9cb5 100644
--- a/doc/cross-options.texi
+++ b/doc/cross-options.texi
@@ -1,12 +1,14 @@
 @item @option{--color[=@var{when}]}                    @tab                                      @tab
 @item @option{--debug}                                 @tab @option{-t}                          @tab @code{%debug}
 @item @option{--define=@var{name}[=@var{value}]}       @tab @option{-D @var{name}[=@var{value}]} @tab @code{%define @var{name} [@var{value}]}
-@item @option{--defines[=@var{file}]}                  @tab @option{-d}                          @tab @code{%defines [@var{"file"}]}
 @item @option{--feature[=@var{features}]}              @tab @option{-f [@var{features}]}         @tab
+@item @option{--file-prefix-map=@var{old}=@var{new}}   @tab @option{-M @var{old}=@var{new}}      @tab
 @item @option{--file-prefix=@var{prefix}}              @tab @option{-b @var{prefix}}             @tab @code{%file-prefix @var{"prefix"}}
 @item @option{--force-define=@var{name}[=@var{value}]} @tab @option{-F @var{name}[=@var{value}]} @tab @code{%define @var{name} [@var{value}]}
 @item @option{--graph[=@var{file}]}                    @tab @option{-g [@var{file}]}             @tab
+@item @option{--header=[@var{file}]}                   @tab @option{-H [@var{file}]}             @tab @code{%header [@var{"file"}]}
 @item @option{--help}                                  @tab @option{-h}                          @tab
+@item @option{--html[=@var{file}]}                     @tab                                      @tab
 @item @option{--language=@var{language}}               @tab @option{-L @var{language}}           @tab @code{%language @var{"language"}}
 @item @option{--locations}                             @tab                                      @tab @code{%locations}
 @item @option{--name-prefix=@var{prefix}}              @tab @option{-p @var{prefix}}             @tab @code{%name-prefix @var{"prefix"}}
diff --git a/doc/fdl.texi b/doc/fdl.texi
index 542edaa..eaf3da0 100644
--- a/doc/fdl.texi
+++ b/doc/fdl.texi
@@ -414,7 +414,7 @@
 of the GNU Free Documentation License from time to time.  Such new
 versions will be similar in spirit to the present version, but may
 differ in detail to address new problems or concerns.  See
-@uref{https://www.gnu.org/copyleft/}.
+@uref{https://www.gnu.org/licenses/}.
 
 Each version of the License is given a distinguishing version number.
 If the Document specifies that a particular numbered version of this
diff --git a/doc/figs/example-reduce.eps b/doc/figs/example-reduce.eps
index 43c0745..ef71211 100644
--- a/doc/figs/example-reduce.eps
+++ b/doc/figs/example-reduce.eps
@@ -1,5 +1,5 @@
 %!PS-Adobe-3.0 EPSF-3.0
-%%Creator: graphviz version 2.40.1 (20161225.0304)
+%%Creator: graphviz version 2.41.20171026.1811 (20171026.1811)
 %%Title: reduce.y
 %%Pages: 1
 %%BoundingBox: 0 0 184 148
@@ -198,10 +198,10 @@
 58.5 124.8 moveto 59 (State 1) alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-8 109.8 moveto 160 (  3 a: "0" .  ["."]) alignedtext
+8 109.8 moveto 160 (  3 a: "0" •  ["."]) alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-8 94.8 moveto 160 (  4 b: "0" .  [";"]) alignedtext
+8 94.8 moveto 160 (  4 b: "0" •  [";"]) alignedtext
 grestore
 % 1R3
 gsave
@@ -228,20 +228,20 @@
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 77.1363 86.8979 moveto
-71.4249 72.9122 64.4748 55.8933 58.9111 42.2696 curveto
+newpath 77.3431 86.9507 moveto
+71.5202 72.9906 64.3625 55.8307 58.697 42.248 curveto
 stroke
 0 0 0 edgecolor
-newpath 61.9913 40.5543 moveto
-54.9704 32.6197 lineto
-55.5109 43.2008 lineto
+newpath 61.7822 40.5527 moveto
+54.7022 32.6708 lineto
+55.3217 43.2475 lineto
 closepath fill
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 61.9913 40.5543 moveto
-54.9704 32.6197 lineto
-55.5109 43.2008 lineto
+newpath 61.7822 40.5527 moveto
+54.7022 32.6708 lineto
+55.3217 43.2475 lineto
 closepath stroke
 grestore
 % 1R4
@@ -269,20 +269,20 @@
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 99.1422 86.8979 moveto
-105.0575 72.7751 112.2683 55.5593 118.0021 41.8699 curveto
+newpath 98.9302 86.9507 moveto
+104.9024 72.9906 112.2436 55.8307 118.0543 42.248 curveto
 stroke
 0 0 0 edgecolor
-newpath 121.2415 43.1955 moveto
-121.8765 32.6197 lineto
-114.7849 40.4912 lineto
+newpath 121.4361 43.2414 moveto
+122.1515 32.6708 lineto
+115.0003 40.4881 lineto
 closepath fill
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 121.2415 43.1955 moveto
-121.8765 32.6197 lineto
-114.7849 40.4912 lineto
+newpath 121.4361 43.2414 moveto
+122.1515 32.6708 lineto
+115.0003 40.4881 lineto
 closepath stroke
 0 0 0 edgecolor
 14 /courier set_font
diff --git a/doc/figs/example-reduce.gv b/doc/figs/example-reduce.gv
index fdd99c5..d71a9d6 100644
--- a/doc/figs/example-reduce.gv
+++ b/doc/figs/example-reduce.gv
@@ -3,7 +3,7 @@
   node [fontname=courier shape=box]
   edge [fontname=courier]
 
-  1 [label="State 1\n  3 a: \"0\" .  [\".\"]\l  4 b: \"0\" .  [\";\"]\l"]
+  1 [label="State 1\n  3 a: \"0\" •  [\".\"]\l  4 b: \"0\" •  [\";\"]\l"]
   1 -> "1R3" [label="" style=solid]
  "1R3" [style=filled shape=diamond fillcolor=yellowgreen label="R3"]
   1 -> "1R4" [label="[\";\"]" style=solid]
diff --git a/doc/figs/example-reduce.pdf b/doc/figs/example-reduce.pdf
index 58c1934..e53a499 100644
--- a/doc/figs/example-reduce.pdf
+++ b/doc/figs/example-reduce.pdf
Binary files differ
diff --git a/doc/figs/example-reduce.svg b/doc/figs/example-reduce.svg
index 149590d..05b28c5 100644
--- a/doc/figs/example-reduce.svg
+++ b/doc/figs/example-reduce.svg
@@ -1,46 +1,46 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+<!-- Generated by graphviz version 2.41.20171026.1811 (20171026.1811)
  -->
 <!-- Title: reduce.y Pages: 1 -->
 <svg width="184pt" height="148pt"
  viewBox="0.00 0.00 184.00 148.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 144)">
 <title>reduce.y</title>
-<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-144 180,-144 180,4 -4,4"/>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-144 180,-144 180,4 -4,4"/>
 <!-- 1 -->
 <g id="node1" class="node">
 <title>1</title>
-<polygon fill="none" stroke="#000000" points="176,-140 0,-140 0,-87 176,-87 176,-140"/>
-<text text-anchor="middle" x="88" y="-124.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">State 1</text>
-<text text-anchor="start" x="8" y="-109.8" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;3 a: &quot;0&quot; . &#160;[&quot;.&quot;]</text>
-<text text-anchor="start" x="8" y="-94.8" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;4 b: &quot;0&quot; . &#160;[&quot;;&quot;]</text>
+<polygon fill="none" stroke="black" points="176,-140 0,-140 0,-87 176,-87 176,-140"/>
+<text text-anchor="middle" x="88" y="-124.8" font-family="Courier,monospace" font-size="14.00">State 1</text>
+<text text-anchor="start" x="8" y="-109.8" font-family="Courier,monospace" font-size="14.00"> &#160;3 a: &quot;0&quot; • &#160;[&quot;.&quot;]</text>
+<text text-anchor="start" x="8" y="-94.8" font-family="Courier,monospace" font-size="14.00"> &#160;4 b: &quot;0&quot; • &#160;[&quot;;&quot;]</text>
 </g>
 <!-- 1R3 -->
 <g id="node2" class="node">
 <title>1R3</title>
-<polygon fill="#9acd32" stroke="#000000" points="49,-36 18.8347,-18 49,0 79.1653,-18 49,-36"/>
-<text text-anchor="middle" x="49" y="-14.3" font-family="Courier,monospace" font-size="14.00" fill="#000000">R3</text>
+<polygon fill="yellowgreen" stroke="black" points="49,-36 18.83,-18 49,0 79.17,-18 49,-36"/>
+<text text-anchor="middle" x="49" y="-14.3" font-family="Courier,monospace" font-size="14.00">R3</text>
 </g>
 <!-- 1&#45;&gt;1R3 -->
 <g id="edge1" class="edge">
 <title>1&#45;&gt;1R3</title>
-<path fill="none" stroke="#000000" d="M77.1363,-86.8979C71.4249,-72.9122 64.4748,-55.8933 58.9111,-42.2696"/>
-<polygon fill="#000000" stroke="#000000" points="61.9913,-40.5543 54.9704,-32.6197 55.5109,-43.2008 61.9913,-40.5543"/>
+<path fill="none" stroke="black" d="M77.34,-86.95C71.52,-72.99 64.36,-55.83 58.7,-42.25"/>
+<polygon fill="black" stroke="black" points="61.78,-40.55 54.7,-32.67 55.32,-43.25 61.78,-40.55"/>
 </g>
 <!-- 1R4 -->
 <g id="node3" class="node">
 <title>1R4</title>
-<polygon fill="#9acd32" stroke="#000000" points="128,-36 97.8347,-18 128,0 158.1653,-18 128,-36"/>
-<text text-anchor="middle" x="128" y="-14.3" font-family="Courier,monospace" font-size="14.00" fill="#000000">R4</text>
+<polygon fill="yellowgreen" stroke="black" points="128,-36 97.83,-18 128,0 158.17,-18 128,-36"/>
+<text text-anchor="middle" x="128" y="-14.3" font-family="Courier,monospace" font-size="14.00">R4</text>
 </g>
 <!-- 1&#45;&gt;1R4 -->
 <g id="edge2" class="edge">
 <title>1&#45;&gt;1R4</title>
-<path fill="none" stroke="#000000" d="M99.1422,-86.8979C105.0575,-72.7751 112.2683,-55.5593 118.0021,-41.8699"/>
-<polygon fill="#000000" stroke="#000000" points="121.2415,-43.1955 121.8765,-32.6197 114.7849,-40.4912 121.2415,-43.1955"/>
-<text text-anchor="middle" x="133.5" y="-57.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">[&quot;;&quot;]</text>
+<path fill="none" stroke="black" d="M98.93,-86.95C104.9,-72.99 112.24,-55.83 118.05,-42.25"/>
+<polygon fill="black" stroke="black" points="121.44,-43.24 122.15,-32.67 115,-40.49 121.44,-43.24"/>
+<text text-anchor="middle" x="133.5" y="-57.8" font-family="Courier,monospace" font-size="14.00">[&quot;;&quot;]</text>
 </g>
 </g>
 </svg>
diff --git a/doc/figs/example-reduce.txt b/doc/figs/example-reduce.txt
index d4e8219..ab4a839 100644
--- a/doc/figs/example-reduce.txt
+++ b/doc/figs/example-reduce.txt
@@ -1,7 +1,7 @@
        .------------------.
        |     State 1      |
-       | 3 a: "0" . [";"] |
-       | 4 b: "0" . ["."] |
+       | 3 a: "0" • [";"] |
+       | 4 b: "0" • ["."] |
        `------------------'
              /     \
             /       \ ["."]
diff --git a/doc/figs/example-shift.eps b/doc/figs/example-shift.eps
index fdb6f9b..af424b6 100644
--- a/doc/figs/example-shift.eps
+++ b/doc/figs/example-shift.eps
@@ -1,5 +1,5 @@
 %!PS-Adobe-3.0 EPSF-3.0
-%%Creator: graphviz version 2.40.1 (20161225.0304)
+%%Creator: graphviz version 2.41.20171026.1811 (20171026.1811)
 %%Title: shift.y
 %%Pages: 1
 %%BoundingBox: 0 0 159 135
@@ -198,7 +198,7 @@
 46 111.8 moveto 59 (State 3) alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-8 96.8 moveto 135 (  1 exp: a . ".") alignedtext
+8 96.8 moveto 135 (  1 exp: a • ".") alignedtext
 grestore
 % 6
 gsave
@@ -214,27 +214,27 @@
 46 22.8 moveto 59 (State 6) alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-8 7.8 moveto 135 (  1 exp: a "." .) alignedtext
+8 7.8 moveto 135 (  1 exp: a "." •) alignedtext
 grestore
 % 3->6
 gsave
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 75.5 88.6883 moveto
-75.5 76.909 75.5 61.6187 75.5 48.3628 curveto
+newpath 75.5 88.9735 moveto
+75.5 77.1918 75.5 61.5607 75.5 48.1581 curveto
 stroke
 0 0 0 edgecolor
-newpath 79.0001 48.274 moveto
-75.5 38.274 lineto
-72.0001 48.274 lineto
+newpath 79.0001 48.0033 moveto
+75.5 38.0034 lineto
+72.0001 48.0034 lineto
 closepath fill
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 79.0001 48.274 moveto
-75.5 38.274 lineto
-72.0001 48.274 lineto
+newpath 79.0001 48.0033 moveto
+75.5 38.0034 lineto
+72.0001 48.0034 lineto
 closepath stroke
 0 0 0 edgecolor
 14 /courier set_font
diff --git a/doc/figs/example-shift.gv b/doc/figs/example-shift.gv
index 995ba0e..df8369f 100644
--- a/doc/figs/example-shift.gv
+++ b/doc/figs/example-shift.gv
@@ -3,7 +3,7 @@
   node [fontname=courier shape=box]
   edge [fontname=courier]
 
-  3 [label="State 3\n  1 exp: a . \".\"\l"]
+  3 [label="State 3\n  1 exp: a • \".\"\l"]
   3 -> 6 [style=solid label="\".\""]
-  6 [label="State 6\n  1 exp: a \".\" .\l"]
+  6 [label="State 6\n  1 exp: a \".\" •\l"]
 }
diff --git a/doc/figs/example-shift.pdf b/doc/figs/example-shift.pdf
index 374907f..b3555bd 100644
--- a/doc/figs/example-shift.pdf
+++ b/doc/figs/example-shift.pdf
Binary files differ
diff --git a/doc/figs/example-shift.svg b/doc/figs/example-shift.svg
index bd9c236..819b643 100644
--- a/doc/figs/example-shift.svg
+++ b/doc/figs/example-shift.svg
@@ -1,34 +1,34 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+<!-- Generated by graphviz version 2.41.20171026.1811 (20171026.1811)
  -->
 <!-- Title: shift.y Pages: 1 -->
 <svg width="159pt" height="135pt"
  viewBox="0.00 0.00 159.00 135.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 131)">
 <title>shift.y</title>
-<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-131 155,-131 155,4 -4,4"/>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-131 155,-131 155,4 -4,4"/>
 <!-- 3 -->
 <g id="node1" class="node">
 <title>3</title>
-<polygon fill="none" stroke="#000000" points="151,-127 0,-127 0,-89 151,-89 151,-127"/>
-<text text-anchor="middle" x="75.5" y="-111.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">State 3</text>
-<text text-anchor="start" x="8" y="-96.8" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;1 exp: a . &quot;.&quot;</text>
+<polygon fill="none" stroke="black" points="151,-127 0,-127 0,-89 151,-89 151,-127"/>
+<text text-anchor="middle" x="75.5" y="-111.8" font-family="Courier,monospace" font-size="14.00">State 3</text>
+<text text-anchor="start" x="8" y="-96.8" font-family="Courier,monospace" font-size="14.00"> &#160;1 exp: a • &quot;.&quot;</text>
 </g>
 <!-- 6 -->
 <g id="node2" class="node">
 <title>6</title>
-<polygon fill="none" stroke="#000000" points="151,-38 0,-38 0,0 151,0 151,-38"/>
-<text text-anchor="middle" x="75.5" y="-22.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">State 6</text>
-<text text-anchor="start" x="8" y="-7.8" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;1 exp: a &quot;.&quot; .</text>
+<polygon fill="none" stroke="black" points="151,-38 0,-38 0,0 151,0 151,-38"/>
+<text text-anchor="middle" x="75.5" y="-22.8" font-family="Courier,monospace" font-size="14.00">State 6</text>
+<text text-anchor="start" x="8" y="-7.8" font-family="Courier,monospace" font-size="14.00"> &#160;1 exp: a &quot;.&quot; •</text>
 </g>
 <!-- 3&#45;&gt;6 -->
 <g id="edge1" class="edge">
 <title>3&#45;&gt;6</title>
-<path fill="none" stroke="#000000" d="M75.5,-88.6883C75.5,-76.909 75.5,-61.6187 75.5,-48.3628"/>
-<polygon fill="#000000" stroke="#000000" points="79.0001,-48.274 75.5,-38.274 72.0001,-48.274 79.0001,-48.274"/>
-<text text-anchor="middle" x="88.5" y="-59.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">&quot;.&quot;</text>
+<path fill="none" stroke="black" d="M75.5,-88.97C75.5,-77.19 75.5,-61.56 75.5,-48.16"/>
+<polygon fill="black" stroke="black" points="79,-48 75.5,-38 72,-48 79,-48"/>
+<text text-anchor="middle" x="88.5" y="-59.8" font-family="Courier,monospace" font-size="14.00">&quot;.&quot;</text>
 </g>
 </g>
 </svg>
diff --git a/doc/figs/example-shift.txt b/doc/figs/example-shift.txt
index 43b1412..4ff9be8 100644
--- a/doc/figs/example-shift.txt
+++ b/doc/figs/example-shift.txt
@@ -1,6 +1,6 @@
 .----------------.
 |    State 3     |
-| 1 exp: a . ";" |
+| 1 exp: a • ";" |
 `----------------'
         |
         | ";"
@@ -8,5 +8,5 @@
         v
 .----------------.
 |    State 6     |
-| 1 exp: a ";" . |
+| 1 exp: a ";" • |
 `----------------'
diff --git a/doc/figs/example.eps b/doc/figs/example.eps
index 0ecb490..26f60d2 100644
--- a/doc/figs/example.eps
+++ b/doc/figs/example.eps
@@ -1,6 +1,6 @@
 %!PS-Adobe-3.0 EPSF-3.0
-%%Creator: graphviz version 2.40.1 (20161225.0304)
-%%Title: /tmp/fo.y
+%%Creator: graphviz version 2.41.20171026.1811 (20171026.1811)
+%%Title: example.y
 %%Pages: 1
 %%BoundingBox: 0 0 751 420
 %%EndComments
@@ -198,19 +198,19 @@
 330.5 396.8 moveto 59 (State 0) alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-263 365.8 moveto 194 (  0 $accept: . exp $end) alignedtext
+263 365.8 moveto 194 (  0 $accept: • exp $end) alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-263 350.8 moveto 135 (  1 exp: . a ";") alignedtext
+263 350.8 moveto 135 (  1 exp: • a ";") alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-263 335.8 moveto 135 (  2    | . b ".") alignedtext
+263 335.8 moveto 135 (  2    | • b ".") alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-263 320.8 moveto 101 (  3 a: . "0") alignedtext
+263 320.8 moveto 101 (  3 a: • "0") alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-263 305.8 moveto 101 (  4 b: . "0") alignedtext
+263 305.8 moveto 101 (  4 b: • "0") alignedtext
 grestore
 % 1
 gsave
@@ -226,30 +226,30 @@
 58.5 231.8 moveto 59 (State 1) alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-8 200.8 moveto 160 (  3 a: "0" .  [";"]) alignedtext
+8 200.8 moveto 160 (  3 a: "0" •  [";"]) alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-8 185.8 moveto 160 (  4 b: "0" .  ["."]) alignedtext
+8 185.8 moveto 160 (  4 b: "0" •  ["."]) alignedtext
 grestore
 % 0->1
 gsave
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 254.8377 299.9058 moveto
-224.2166 283.8635 191.3938 266.6677 163.0319 251.809 curveto
+newpath 254.8377 299.679 moveto
+223.9468 283.7225 190.8153 266.6086 162.2833 251.8706 curveto
 stroke
 0 0 0 edgecolor
-newpath 164.471 248.6117 moveto
-153.9887 247.0713 lineto
-161.2224 254.8123 lineto
+newpath 163.681 248.6532 moveto
+153.19 247.1735 lineto
+160.4684 254.8725 lineto
 closepath fill
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 164.471 248.6117 moveto
-153.9887 247.0713 lineto
-161.2224 254.8123 lineto
+newpath 163.681 248.6532 moveto
+153.19 247.1735 lineto
+160.4684 254.8725 lineto
 closepath stroke
 0 0 0 edgecolor
 14 /courier set_font
@@ -269,27 +269,27 @@
 269.5 224.3 moveto 59 (State 2) alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-202 193.3 moveto 194 (  0 $accept: exp . $end) alignedtext
+202 193.3 moveto 194 (  0 $accept: exp • $end) alignedtext
 grestore
 % 0->2
 gsave
 1 setlinewidth
 dashed
 0 0 0 edgecolor
-newpath 335.5404 297.8609 moveto
-328.4711 281.3463 320.9507 263.7782 314.5817 248.8999 curveto
+newpath 335.5404 297.6628 moveto
+328.4167 281.2548 320.8349 263.7919 314.435 249.051 curveto
 stroke
 0 0 0 edgecolor
-newpath 317.732 247.3651 moveto
-310.579 239.5493 lineto
-311.2968 250.1198 lineto
+newpath 317.6096 247.5745 moveto
+310.4166 239.7956 lineto
+311.1887 250.3623 lineto
 closepath fill
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 317.732 247.3651 moveto
-310.579 239.5493 lineto
-311.2968 250.1198 lineto
+newpath 317.6096 247.5745 moveto
+310.4166 239.7956 lineto
+311.1887 250.3623 lineto
 closepath stroke
 0 0 0 edgecolor
 14 /courier set_font
@@ -309,27 +309,27 @@
 468.5 224.3 moveto 59 (State 3) alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-430.5 193.3 moveto 135 (  1 exp: a . ";") alignedtext
+430.5 193.3 moveto 135 (  1 exp: a • ";") alignedtext
 grestore
 % 0->3
 gsave
 1 setlinewidth
 dashed
 0 0 0 edgecolor
-newpath 415.3347 297.8609 moveto
-432.0893 280.5599 449.9638 262.1026 464.7898 246.7932 curveto
+newpath 415.3347 297.6628 moveto
+432.2182 280.4735 450.2388 262.1264 465.1314 246.9641 curveto
 stroke
 0 0 0 edgecolor
-newpath 467.3623 249.1678 moveto
-471.8048 239.5493 lineto
-462.3338 244.2981 lineto
+newpath 467.6619 249.3825 moveto
+472.1723 239.7956 lineto
+462.6679 244.4773 lineto
 closepath fill
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 467.3623 249.1678 moveto
-471.8048 239.5493 lineto
-462.3338 244.2981 lineto
+newpath 467.6619 249.3825 moveto
+472.1723 239.7956 lineto
+462.6679 244.4773 lineto
 closepath stroke
 0 0 0 edgecolor
 14 /courier set_font
@@ -349,27 +349,27 @@
 637.5 224.3 moveto 59 (State 4) alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-599.5 193.3 moveto 135 (  2 exp: b . ".") alignedtext
+599.5 193.3 moveto 135 (  2 exp: b • ".") alignedtext
 grestore
 % 0->4
 gsave
 1 setlinewidth
 dashed
 0 0 0 edgecolor
-newpath 465.2225 306.1589 moveto
-509.5736 285.5725 559.9111 262.2074 599.2142 243.9641 curveto
+newpath 465.2225 305.8444 moveto
+510.0556 285.3263 561.0061 262.0086 600.4919 243.9377 curveto
 stroke
 0 0 0 edgecolor
-newpath 600.8484 247.0643 moveto
-608.4453 239.6793 lineto
-597.9012 240.7149 lineto
+newpath 602.1219 247.041 moveto
+609.7584 239.6969 lineto
+599.2088 240.6759 lineto
 closepath fill
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 600.8484 247.0643 moveto
-608.4453 239.6793 lineto
-597.9012 240.7149 lineto
+newpath 602.1219 247.041 moveto
+609.7584 239.6969 lineto
+599.2088 240.6759 lineto
 closepath stroke
 0 0 0 edgecolor
 14 /courier set_font
@@ -400,20 +400,20 @@
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 72.5904 177.8283 moveto
-64.8229 160.3515 55.5996 139.599 48.6312 123.9201 curveto
+newpath 72.7267 177.7459 moveto
+64.811 160.2523 55.3541 139.3525 48.3092 123.7834 curveto
 stroke
 0 0 0 edgecolor
-newpath 51.6753 122.1516 moveto
-44.4155 114.435 lineto
-45.2786 124.9946 lineto
+newpath 51.3798 122.0793 moveto
+44.0685 114.4114 lineto
+45.0023 124.965 lineto
 closepath fill
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 51.6753 122.1516 moveto
-44.4155 114.435 lineto
-45.2786 124.9946 lineto
+newpath 51.3798 122.0793 moveto
+44.0685 114.4114 lineto
+45.0023 124.965 lineto
 closepath stroke
 grestore
 % 1R4
@@ -441,20 +441,20 @@
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 96.9376 177.8283 moveto
-101.2916 160.9376 106.4344 140.9872 110.423 125.5143 curveto
+newpath 96.8585 177.7459 moveto
+101.2705 160.9346 106.5081 140.9776 110.5363 125.6289 curveto
 stroke
 0 0 0 edgecolor
-newpath 113.869 126.1674 moveto
-112.976 115.6103 lineto
-107.0906 124.4201 lineto
+newpath 113.9536 126.3953 moveto
+113.1068 115.8344 lineto
+107.1829 124.6184 lineto
 closepath fill
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 113.869 126.1674 moveto
-112.976 115.6103 lineto
-107.0906 124.4201 lineto
+newpath 113.9536 126.3953 moveto
+113.1068 115.8344 lineto
+107.1829 124.6184 lineto
 closepath stroke
 0 0 0 edgecolor
 14 /courier set_font
@@ -474,27 +474,27 @@
 269.5 111.8 moveto 59 (State 5) alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-202 80.8 moveto 194 (  0 $accept: exp $end .) alignedtext
+202 80.8 moveto 194 (  0 $accept: exp $end •) alignedtext
 grestore
 % 2->5
 gsave
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 299 185.2669 moveto
-299 171.0012 299 153.3067 299 137.7405 curveto
+newpath 299 185.313 moveto
+299 171.1049 299 153.312 299 137.7381 curveto
 stroke
 0 0 0 edgecolor
-newpath 302.5001 137.3722 moveto
-299 127.3722 lineto
-295.5001 137.3723 lineto
+newpath 302.5001 137.3819 moveto
+299 127.3819 lineto
+295.5001 137.382 lineto
 closepath fill
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 302.5001 137.3722 moveto
-299 127.3722 lineto
-295.5001 137.3723 lineto
+newpath 302.5001 137.3819 moveto
+299 127.3819 lineto
+295.5001 137.382 lineto
 closepath stroke
 0 0 0 edgecolor
 14 /courier set_font
@@ -514,27 +514,27 @@
 468.5 111.8 moveto 59 (State 6) alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-430.5 80.8 moveto 135 (  1 exp: a ";" .) alignedtext
+430.5 80.8 moveto 135 (  1 exp: a ";" •) alignedtext
 grestore
 % 3->6
 gsave
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 498 185.2669 moveto
-498 171.0012 498 153.3067 498 137.7405 curveto
+newpath 498 185.313 moveto
+498 171.1049 498 153.312 498 137.7381 curveto
 stroke
 0 0 0 edgecolor
-newpath 501.5001 137.3722 moveto
-498 127.3722 lineto
-494.5001 137.3723 lineto
+newpath 501.5001 137.3819 moveto
+498 127.3819 lineto
+494.5001 137.382 lineto
 closepath fill
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 501.5001 137.3722 moveto
-498 127.3722 lineto
-494.5001 137.3723 lineto
+newpath 501.5001 137.3819 moveto
+498 127.3819 lineto
+494.5001 137.382 lineto
 closepath stroke
 0 0 0 edgecolor
 14 /courier set_font
@@ -554,27 +554,27 @@
 637.5 111.8 moveto 59 (State 7) alignedtext
 0 0 0 nodecolor
 14 /courier set_font
-599.5 80.8 moveto 135 (  2 exp: b "." .) alignedtext
+599.5 80.8 moveto 135 (  2 exp: b "." •) alignedtext
 grestore
 % 4->7
 gsave
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 667 185.2669 moveto
-667 171.0012 667 153.3067 667 137.7405 curveto
+newpath 667 185.313 moveto
+667 171.1049 667 153.312 667 137.7381 curveto
 stroke
 0 0 0 edgecolor
-newpath 670.5001 137.3722 moveto
-667 127.3722 lineto
-663.5001 137.3723 lineto
+newpath 670.5001 137.3819 moveto
+667 127.3819 lineto
+663.5001 137.382 lineto
 closepath fill
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 670.5001 137.3722 moveto
-667 127.3722 lineto
-663.5001 137.3723 lineto
+newpath 670.5001 137.3819 moveto
+667 127.3819 lineto
+663.5001 137.382 lineto
 closepath stroke
 0 0 0 edgecolor
 14 /courier set_font
@@ -605,20 +605,20 @@
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 299 72.6952 moveto
-299 64.3091 299 55.0593 299 46.5897 curveto
+newpath 299 72.805 moveto
+299 64.3462 299 54.9487 299 46.4049 curveto
 stroke
 0 0 0 edgecolor
-newpath 302.5001 46.4024 moveto
-299 36.4024 lineto
-295.5001 46.4024 lineto
+newpath 302.5001 46.1743 moveto
+299 36.1743 lineto
+295.5001 46.1743 lineto
 closepath fill
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 302.5001 46.4024 moveto
-299 36.4024 lineto
-295.5001 46.4024 lineto
+newpath 302.5001 46.1743 moveto
+299 36.1743 lineto
+295.5001 46.1743 lineto
 closepath stroke
 grestore
 % 6R1
@@ -646,20 +646,20 @@
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 498 72.6952 moveto
-498 64.3091 498 55.0593 498 46.5897 curveto
+newpath 498 72.805 moveto
+498 64.3462 498 54.9487 498 46.4049 curveto
 stroke
 0 0 0 edgecolor
-newpath 501.5001 46.4024 moveto
-498 36.4024 lineto
-494.5001 46.4024 lineto
+newpath 501.5001 46.1743 moveto
+498 36.1743 lineto
+494.5001 46.1743 lineto
 closepath fill
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 501.5001 46.4024 moveto
-498 36.4024 lineto
-494.5001 46.4024 lineto
+newpath 501.5001 46.1743 moveto
+498 36.1743 lineto
+494.5001 46.1743 lineto
 closepath stroke
 grestore
 % 7R2
@@ -687,20 +687,20 @@
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 667 72.6952 moveto
-667 64.3091 667 55.0593 667 46.5897 curveto
+newpath 667 72.805 moveto
+667 64.3462 667 54.9487 667 46.4049 curveto
 stroke
 0 0 0 edgecolor
-newpath 670.5001 46.4024 moveto
-667 36.4024 lineto
-663.5001 46.4024 lineto
+newpath 670.5001 46.1743 moveto
+667 36.1743 lineto
+663.5001 46.1743 lineto
 closepath fill
 1 setlinewidth
 solid
 0 0 0 edgecolor
-newpath 670.5001 46.4024 moveto
-667 36.4024 lineto
-663.5001 46.4024 lineto
+newpath 670.5001 46.1743 moveto
+667 36.1743 lineto
+663.5001 46.1743 lineto
 closepath stroke
 grestore
 endpage
diff --git a/doc/figs/example.gv b/doc/figs/example.gv
index 94fff85..846c9ab 100644
--- a/doc/figs/example.gv
+++ b/doc/figs/example.gv
@@ -1,35 +1,35 @@
 // Generated by GNU Bison 2.6.90.
 // Report bugs to <bug-bison@gnu.org>.
-// Home page: <http://www.gnu.org/software/bison/>.
+// Home page: <https://www.gnu.org/software/bison/>.
 
-digraph "/tmp/fo.y"
+digraph "example.y"
 {
   node [fontname = courier, shape = box, colorscheme = paired6]
   edge [fontname = courier]
 
-  0 [label="State 0\n\l  0 $accept: . exp $end\l  1 exp: . a \";\"\l  2    | . b \".\"\l  3 a: . \"0\"\l  4 b: . \"0\"\l"]
+  0 [label="State 0\n\l  0 $accept: • exp $end\l  1 exp: • a \";\"\l  2    | • b \".\"\l  3 a: • \"0\"\l  4 b: • \"0\"\l"]
   0 -> 1 [style=solid label="\"0\""]
   0 -> 2 [style=dashed label="exp"]
   0 -> 3 [style=dashed label="a"]
   0 -> 4 [style=dashed label="b"]
-  1 [label="State 1\n\l  3 a: \"0\" .  [\";\"]\l  4 b: \"0\" .  [\".\"]\l"]
+  1 [label="State 1\n\l  3 a: \"0\" •  [\";\"]\l  4 b: \"0\" •  [\".\"]\l"]
   1 -> "1R3" [style=solid]
  "1R3" [label="R3", fillcolor=3, shape=diamond, style=filled]
   1 -> "1R4" [label="[\".\"]", style=solid]
  "1R4" [label="R4", fillcolor=3, shape=diamond, style=filled]
-  2 [label="State 2\n\l  0 $accept: exp . $end\l"]
+  2 [label="State 2\n\l  0 $accept: exp • $end\l"]
   2 -> 5 [style=solid label="$end"]
-  3 [label="State 3\n\l  1 exp: a . \";\"\l"]
+  3 [label="State 3\n\l  1 exp: a • \";\"\l"]
   3 -> 6 [style=solid label="\";\""]
-  4 [label="State 4\n\l  2 exp: b . \".\"\l"]
+  4 [label="State 4\n\l  2 exp: b • \".\"\l"]
   4 -> 7 [style=solid label="\".\""]
-  5 [label="State 5\n\l  0 $accept: exp $end .\l"]
+  5 [label="State 5\n\l  0 $accept: exp $end •\l"]
   5 -> "5R0" [style=solid]
  "5R0" [label="Acc", fillcolor=1, shape=diamond, style=filled]
-  6 [label="State 6\n\l  1 exp: a \";\" .\l"]
+  6 [label="State 6\n\l  1 exp: a \";\" •\l"]
   6 -> "6R1" [style=solid]
  "6R1" [label="R1", fillcolor=3, shape=diamond, style=filled]
-  7 [label="State 7\n\l  2 exp: b \".\" .\l"]
+  7 [label="State 7\n\l  2 exp: b \".\" •\l"]
   7 -> "7R2" [style=solid]
  "7R2" [label="R2", fillcolor=3, shape=diamond, style=filled]
 }
diff --git a/doc/figs/example.pdf b/doc/figs/example.pdf
index 6c4d336..d6b660c 100644
--- a/doc/figs/example.pdf
+++ b/doc/figs/example.pdf
Binary files differ
diff --git a/doc/figs/example.svg b/doc/figs/example.svg
index d2dad96..cf892d3 100644
--- a/doc/figs/example.svg
+++ b/doc/figs/example.svg
@@ -1,184 +1,184 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+<!-- Generated by graphviz version 2.41.20171026.1811 (20171026.1811)
  -->
-<!-- Title: /tmp/fo.y Pages: 1 -->
+<!-- Title: example.y Pages: 1 -->
 <svg width="751pt" height="420pt"
  viewBox="0.00 0.00 750.50 420.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
 <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 416)">
-<title>/tmp/fo.y</title>
-<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-416 746.5,-416 746.5,4 -4,4"/>
+<title>example.y</title>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-416 746.5,-416 746.5,4 -4,4"/>
 <!-- 0 -->
 <g id="node1" class="node">
 <title>0</title>
-<polygon fill="none" stroke="#000000" points="465,-412 255,-412 255,-298 465,-298 465,-412"/>
-<text text-anchor="middle" x="360" y="-396.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">State 0</text>
-<text text-anchor="start" x="263" y="-365.8" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;0 $accept: . exp $end</text>
-<text text-anchor="start" x="263" y="-350.8" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;1 exp: . a &quot;;&quot;</text>
-<text text-anchor="start" x="263" y="-335.8" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;2 &#160;&#160;&#160;| . b &quot;.&quot;</text>
-<text text-anchor="start" x="263" y="-320.8" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;3 a: . &quot;0&quot;</text>
-<text text-anchor="start" x="263" y="-305.8" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;4 b: . &quot;0&quot;</text>
+<polygon fill="none" stroke="black" points="465,-412 255,-412 255,-298 465,-298 465,-412"/>
+<text text-anchor="middle" x="360" y="-396.8" font-family="Courier,monospace" font-size="14.00">State 0</text>
+<text text-anchor="start" x="263" y="-365.8" font-family="Courier,monospace" font-size="14.00"> &#160;0 $accept: • exp $end</text>
+<text text-anchor="start" x="263" y="-350.8" font-family="Courier,monospace" font-size="14.00"> &#160;1 exp: • a &quot;;&quot;</text>
+<text text-anchor="start" x="263" y="-335.8" font-family="Courier,monospace" font-size="14.00"> &#160;2 &#160;&#160;&#160;| • b &quot;.&quot;</text>
+<text text-anchor="start" x="263" y="-320.8" font-family="Courier,monospace" font-size="14.00"> &#160;3 a: • &quot;0&quot;</text>
+<text text-anchor="start" x="263" y="-305.8" font-family="Courier,monospace" font-size="14.00"> &#160;4 b: • &quot;0&quot;</text>
 </g>
 <!-- 1 -->
 <g id="node2" class="node">
 <title>1</title>
-<polygon fill="none" stroke="#000000" points="176,-247 0,-247 0,-178 176,-178 176,-247"/>
-<text text-anchor="middle" x="88" y="-231.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">State 1</text>
-<text text-anchor="start" x="8" y="-200.8" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;3 a: &quot;0&quot; . &#160;[&quot;;&quot;]</text>
-<text text-anchor="start" x="8" y="-185.8" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;4 b: &quot;0&quot; . &#160;[&quot;.&quot;]</text>
+<polygon fill="none" stroke="black" points="176,-247 0,-247 0,-178 176,-178 176,-247"/>
+<text text-anchor="middle" x="88" y="-231.8" font-family="Courier,monospace" font-size="14.00">State 1</text>
+<text text-anchor="start" x="8" y="-200.8" font-family="Courier,monospace" font-size="14.00"> &#160;3 a: &quot;0&quot; • &#160;[&quot;;&quot;]</text>
+<text text-anchor="start" x="8" y="-185.8" font-family="Courier,monospace" font-size="14.00"> &#160;4 b: &quot;0&quot; • &#160;[&quot;.&quot;]</text>
 </g>
 <!-- 0&#45;&gt;1 -->
 <g id="edge1" class="edge">
 <title>0&#45;&gt;1</title>
-<path fill="none" stroke="#000000" d="M254.8377,-299.9058C224.2166,-283.8635 191.3938,-266.6677 163.0319,-251.809"/>
-<polygon fill="#000000" stroke="#000000" points="164.471,-248.6117 153.9887,-247.0713 161.2224,-254.8123 164.471,-248.6117"/>
-<text text-anchor="middle" x="229" y="-268.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">&quot;0&quot;</text>
+<path fill="none" stroke="black" d="M254.84,-299.68C223.95,-283.72 190.82,-266.61 162.28,-251.87"/>
+<polygon fill="black" stroke="black" points="163.68,-248.65 153.19,-247.17 160.47,-254.87 163.68,-248.65"/>
+<text text-anchor="middle" x="229" y="-268.8" font-family="Courier,monospace" font-size="14.00">&quot;0&quot;</text>
 </g>
 <!-- 2 -->
 <g id="node3" class="node">
 <title>2</title>
-<polygon fill="none" stroke="#000000" points="404,-239.5 194,-239.5 194,-185.5 404,-185.5 404,-239.5"/>
-<text text-anchor="middle" x="299" y="-224.3" font-family="Courier,monospace" font-size="14.00" fill="#000000">State 2</text>
-<text text-anchor="start" x="202" y="-193.3" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;0 $accept: exp . $end</text>
+<polygon fill="none" stroke="black" points="404,-239.5 194,-239.5 194,-185.5 404,-185.5 404,-239.5"/>
+<text text-anchor="middle" x="299" y="-224.3" font-family="Courier,monospace" font-size="14.00">State 2</text>
+<text text-anchor="start" x="202" y="-193.3" font-family="Courier,monospace" font-size="14.00"> &#160;0 $accept: exp • $end</text>
 </g>
 <!-- 0&#45;&gt;2 -->
 <g id="edge2" class="edge">
 <title>0&#45;&gt;2</title>
-<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M335.5404,-297.8609C328.4711,-281.3463 320.9507,-263.7782 314.5817,-248.8999"/>
-<polygon fill="#000000" stroke="#000000" points="317.732,-247.3651 310.579,-239.5493 311.2968,-250.1198 317.732,-247.3651"/>
-<text text-anchor="middle" x="341" y="-268.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">exp</text>
+<path fill="none" stroke="black" stroke-dasharray="5,2" d="M335.54,-297.66C328.42,-281.25 320.83,-263.79 314.43,-249.05"/>
+<polygon fill="black" stroke="black" points="317.61,-247.57 310.42,-239.8 311.19,-250.36 317.61,-247.57"/>
+<text text-anchor="middle" x="341" y="-268.8" font-family="Courier,monospace" font-size="14.00">exp</text>
 </g>
 <!-- 3 -->
 <g id="node4" class="node">
 <title>3</title>
-<polygon fill="none" stroke="#000000" points="573.5,-239.5 422.5,-239.5 422.5,-185.5 573.5,-185.5 573.5,-239.5"/>
-<text text-anchor="middle" x="498" y="-224.3" font-family="Courier,monospace" font-size="14.00" fill="#000000">State 3</text>
-<text text-anchor="start" x="430.5" y="-193.3" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;1 exp: a . &quot;;&quot;</text>
+<polygon fill="none" stroke="black" points="573.5,-239.5 422.5,-239.5 422.5,-185.5 573.5,-185.5 573.5,-239.5"/>
+<text text-anchor="middle" x="498" y="-224.3" font-family="Courier,monospace" font-size="14.00">State 3</text>
+<text text-anchor="start" x="430.5" y="-193.3" font-family="Courier,monospace" font-size="14.00"> &#160;1 exp: a • &quot;;&quot;</text>
 </g>
 <!-- 0&#45;&gt;3 -->
 <g id="edge3" class="edge">
 <title>0&#45;&gt;3</title>
-<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M415.3347,-297.8609C432.0893,-280.5599 449.9638,-262.1026 464.7898,-246.7932"/>
-<polygon fill="#000000" stroke="#000000" points="467.3623,-249.1678 471.8048,-239.5493 462.3338,-244.2981 467.3623,-249.1678"/>
-<text text-anchor="middle" x="450.5" y="-268.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">a</text>
+<path fill="none" stroke="black" stroke-dasharray="5,2" d="M415.33,-297.66C432.22,-280.47 450.24,-262.13 465.13,-246.96"/>
+<polygon fill="black" stroke="black" points="467.66,-249.38 472.17,-239.8 462.67,-244.48 467.66,-249.38"/>
+<text text-anchor="middle" x="450.5" y="-268.8" font-family="Courier,monospace" font-size="14.00">a</text>
 </g>
 <!-- 4 -->
 <g id="node5" class="node">
 <title>4</title>
-<polygon fill="none" stroke="#000000" points="742.5,-239.5 591.5,-239.5 591.5,-185.5 742.5,-185.5 742.5,-239.5"/>
-<text text-anchor="middle" x="667" y="-224.3" font-family="Courier,monospace" font-size="14.00" fill="#000000">State 4</text>
-<text text-anchor="start" x="599.5" y="-193.3" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;2 exp: b . &quot;.&quot;</text>
+<polygon fill="none" stroke="black" points="742.5,-239.5 591.5,-239.5 591.5,-185.5 742.5,-185.5 742.5,-239.5"/>
+<text text-anchor="middle" x="667" y="-224.3" font-family="Courier,monospace" font-size="14.00">State 4</text>
+<text text-anchor="start" x="599.5" y="-193.3" font-family="Courier,monospace" font-size="14.00"> &#160;2 exp: b • &quot;.&quot;</text>
 </g>
 <!-- 0&#45;&gt;4 -->
 <g id="edge4" class="edge">
 <title>0&#45;&gt;4</title>
-<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M465.2225,-306.1589C509.5736,-285.5725 559.9111,-262.2074 599.2142,-243.9641"/>
-<polygon fill="#000000" stroke="#000000" points="600.8484,-247.0643 608.4453,-239.6793 597.9012,-240.7149 600.8484,-247.0643"/>
-<text text-anchor="middle" x="555.5" y="-268.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">b</text>
+<path fill="none" stroke="black" stroke-dasharray="5,2" d="M465.22,-305.84C510.06,-285.33 561.01,-262.01 600.49,-243.94"/>
+<polygon fill="black" stroke="black" points="602.12,-247.04 609.76,-239.7 599.21,-240.68 602.12,-247.04"/>
+<text text-anchor="middle" x="555.5" y="-268.8" font-family="Courier,monospace" font-size="14.00">b</text>
 </g>
 <!-- 1R3 -->
 <g id="node6" class="node">
 <title>1R3</title>
-<polygon fill="#b2df8a" stroke="#000000" points="38,-118 7.8347,-100 38,-82 68.1653,-100 38,-118"/>
-<text text-anchor="middle" x="38" y="-96.3" font-family="Courier,monospace" font-size="14.00" fill="#000000">R3</text>
+<polygon fill="#b2df8a" stroke="black" points="38,-118 7.83,-100 38,-82 68.17,-100 38,-118"/>
+<text text-anchor="middle" x="38" y="-96.3" font-family="Courier,monospace" font-size="14.00">R3</text>
 </g>
 <!-- 1&#45;&gt;1R3 -->
 <g id="edge5" class="edge">
 <title>1&#45;&gt;1R3</title>
-<path fill="none" stroke="#000000" d="M72.5904,-177.8283C64.8229,-160.3515 55.5996,-139.599 48.6312,-123.9201"/>
-<polygon fill="#000000" stroke="#000000" points="51.6753,-122.1516 44.4155,-114.435 45.2786,-124.9946 51.6753,-122.1516"/>
+<path fill="none" stroke="black" d="M72.73,-177.75C64.81,-160.25 55.35,-139.35 48.31,-123.78"/>
+<polygon fill="black" stroke="black" points="51.38,-122.08 44.07,-114.41 45,-124.97 51.38,-122.08"/>
 </g>
 <!-- 1R4 -->
 <g id="node7" class="node">
 <title>1R4</title>
-<polygon fill="#b2df8a" stroke="#000000" points="117,-118 86.8347,-100 117,-82 147.1653,-100 117,-118"/>
-<text text-anchor="middle" x="117" y="-96.3" font-family="Courier,monospace" font-size="14.00" fill="#000000">R4</text>
+<polygon fill="#b2df8a" stroke="black" points="117,-118 86.83,-100 117,-82 147.17,-100 117,-118"/>
+<text text-anchor="middle" x="117" y="-96.3" font-family="Courier,monospace" font-size="14.00">R4</text>
 </g>
 <!-- 1&#45;&gt;1R4 -->
 <g id="edge6" class="edge">
 <title>1&#45;&gt;1R4</title>
-<path fill="none" stroke="#000000" d="M96.9376,-177.8283C101.2916,-160.9376 106.4344,-140.9872 110.423,-125.5143"/>
-<polygon fill="#000000" stroke="#000000" points="113.869,-126.1674 112.976,-115.6103 107.0906,-124.4201 113.869,-126.1674"/>
-<text text-anchor="middle" x="127.5" y="-148.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">[&quot;.&quot;]</text>
+<path fill="none" stroke="black" d="M96.86,-177.75C101.27,-160.93 106.51,-140.98 110.54,-125.63"/>
+<polygon fill="black" stroke="black" points="113.95,-126.4 113.11,-115.83 107.18,-124.62 113.95,-126.4"/>
+<text text-anchor="middle" x="127.5" y="-148.8" font-family="Courier,monospace" font-size="14.00">[&quot;.&quot;]</text>
 </g>
 <!-- 5 -->
 <g id="node8" class="node">
 <title>5</title>
-<polygon fill="none" stroke="#000000" points="404,-127 194,-127 194,-73 404,-73 404,-127"/>
-<text text-anchor="middle" x="299" y="-111.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">State 5</text>
-<text text-anchor="start" x="202" y="-80.8" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;0 $accept: exp $end .</text>
+<polygon fill="none" stroke="black" points="404,-127 194,-127 194,-73 404,-73 404,-127"/>
+<text text-anchor="middle" x="299" y="-111.8" font-family="Courier,monospace" font-size="14.00">State 5</text>
+<text text-anchor="start" x="202" y="-80.8" font-family="Courier,monospace" font-size="14.00"> &#160;0 $accept: exp $end •</text>
 </g>
 <!-- 2&#45;&gt;5 -->
 <g id="edge7" class="edge">
 <title>2&#45;&gt;5</title>
-<path fill="none" stroke="#000000" d="M299,-185.2669C299,-171.0012 299,-153.3067 299,-137.7405"/>
-<polygon fill="#000000" stroke="#000000" points="302.5001,-137.3722 299,-127.3722 295.5001,-137.3723 302.5001,-137.3722"/>
-<text text-anchor="middle" x="316" y="-148.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">$end</text>
+<path fill="none" stroke="black" d="M299,-185.31C299,-171.1 299,-153.31 299,-137.74"/>
+<polygon fill="black" stroke="black" points="302.5,-137.38 299,-127.38 295.5,-137.38 302.5,-137.38"/>
+<text text-anchor="middle" x="316" y="-148.8" font-family="Courier,monospace" font-size="14.00">$end</text>
 </g>
 <!-- 6 -->
 <g id="node9" class="node">
 <title>6</title>
-<polygon fill="none" stroke="#000000" points="573.5,-127 422.5,-127 422.5,-73 573.5,-73 573.5,-127"/>
-<text text-anchor="middle" x="498" y="-111.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">State 6</text>
-<text text-anchor="start" x="430.5" y="-80.8" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;1 exp: a &quot;;&quot; .</text>
+<polygon fill="none" stroke="black" points="573.5,-127 422.5,-127 422.5,-73 573.5,-73 573.5,-127"/>
+<text text-anchor="middle" x="498" y="-111.8" font-family="Courier,monospace" font-size="14.00">State 6</text>
+<text text-anchor="start" x="430.5" y="-80.8" font-family="Courier,monospace" font-size="14.00"> &#160;1 exp: a &quot;;&quot; •</text>
 </g>
 <!-- 3&#45;&gt;6 -->
 <g id="edge8" class="edge">
 <title>3&#45;&gt;6</title>
-<path fill="none" stroke="#000000" d="M498,-185.2669C498,-171.0012 498,-153.3067 498,-137.7405"/>
-<polygon fill="#000000" stroke="#000000" points="501.5001,-137.3722 498,-127.3722 494.5001,-137.3723 501.5001,-137.3722"/>
-<text text-anchor="middle" x="511" y="-148.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">&quot;;&quot;</text>
+<path fill="none" stroke="black" d="M498,-185.31C498,-171.1 498,-153.31 498,-137.74"/>
+<polygon fill="black" stroke="black" points="501.5,-137.38 498,-127.38 494.5,-137.38 501.5,-137.38"/>
+<text text-anchor="middle" x="511" y="-148.8" font-family="Courier,monospace" font-size="14.00">&quot;;&quot;</text>
 </g>
 <!-- 7 -->
 <g id="node10" class="node">
 <title>7</title>
-<polygon fill="none" stroke="#000000" points="742.5,-127 591.5,-127 591.5,-73 742.5,-73 742.5,-127"/>
-<text text-anchor="middle" x="667" y="-111.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">State 7</text>
-<text text-anchor="start" x="599.5" y="-80.8" font-family="Courier,monospace" font-size="14.00" fill="#000000"> &#160;2 exp: b &quot;.&quot; .</text>
+<polygon fill="none" stroke="black" points="742.5,-127 591.5,-127 591.5,-73 742.5,-73 742.5,-127"/>
+<text text-anchor="middle" x="667" y="-111.8" font-family="Courier,monospace" font-size="14.00">State 7</text>
+<text text-anchor="start" x="599.5" y="-80.8" font-family="Courier,monospace" font-size="14.00"> &#160;2 exp: b &quot;.&quot; •</text>
 </g>
 <!-- 4&#45;&gt;7 -->
 <g id="edge9" class="edge">
 <title>4&#45;&gt;7</title>
-<path fill="none" stroke="#000000" d="M667,-185.2669C667,-171.0012 667,-153.3067 667,-137.7405"/>
-<polygon fill="#000000" stroke="#000000" points="670.5001,-137.3722 667,-127.3722 663.5001,-137.3723 670.5001,-137.3722"/>
-<text text-anchor="middle" x="680" y="-148.8" font-family="Courier,monospace" font-size="14.00" fill="#000000">&quot;.&quot;</text>
+<path fill="none" stroke="black" d="M667,-185.31C667,-171.1 667,-153.31 667,-137.74"/>
+<polygon fill="black" stroke="black" points="670.5,-137.38 667,-127.38 663.5,-137.38 670.5,-137.38"/>
+<text text-anchor="middle" x="680" y="-148.8" font-family="Courier,monospace" font-size="14.00">&quot;.&quot;</text>
 </g>
 <!-- 5R0 -->
 <g id="node11" class="node">
 <title>5R0</title>
-<polygon fill="#a6cee3" stroke="#000000" points="299,-36 260.2905,-18 299,0 337.7095,-18 299,-36"/>
-<text text-anchor="middle" x="299" y="-14.3" font-family="Courier,monospace" font-size="14.00" fill="#000000">Acc</text>
+<polygon fill="#a6cee3" stroke="black" points="299,-36 260.29,-18 299,0 337.71,-18 299,-36"/>
+<text text-anchor="middle" x="299" y="-14.3" font-family="Courier,monospace" font-size="14.00">Acc</text>
 </g>
 <!-- 5&#45;&gt;5R0 -->
 <g id="edge10" class="edge">
 <title>5&#45;&gt;5R0</title>
-<path fill="none" stroke="#000000" d="M299,-72.6952C299,-64.3091 299,-55.0593 299,-46.5897"/>
-<polygon fill="#000000" stroke="#000000" points="302.5001,-46.4024 299,-36.4024 295.5001,-46.4024 302.5001,-46.4024"/>
+<path fill="none" stroke="black" d="M299,-72.81C299,-64.35 299,-54.95 299,-46.4"/>
+<polygon fill="black" stroke="black" points="302.5,-46.17 299,-36.17 295.5,-46.17 302.5,-46.17"/>
 </g>
 <!-- 6R1 -->
 <g id="node12" class="node">
 <title>6R1</title>
-<polygon fill="#b2df8a" stroke="#000000" points="498,-36 467.8347,-18 498,0 528.1653,-18 498,-36"/>
-<text text-anchor="middle" x="498" y="-14.3" font-family="Courier,monospace" font-size="14.00" fill="#000000">R1</text>
+<polygon fill="#b2df8a" stroke="black" points="498,-36 467.83,-18 498,0 528.17,-18 498,-36"/>
+<text text-anchor="middle" x="498" y="-14.3" font-family="Courier,monospace" font-size="14.00">R1</text>
 </g>
 <!-- 6&#45;&gt;6R1 -->
 <g id="edge11" class="edge">
 <title>6&#45;&gt;6R1</title>
-<path fill="none" stroke="#000000" d="M498,-72.6952C498,-64.3091 498,-55.0593 498,-46.5897"/>
-<polygon fill="#000000" stroke="#000000" points="501.5001,-46.4024 498,-36.4024 494.5001,-46.4024 501.5001,-46.4024"/>
+<path fill="none" stroke="black" d="M498,-72.81C498,-64.35 498,-54.95 498,-46.4"/>
+<polygon fill="black" stroke="black" points="501.5,-46.17 498,-36.17 494.5,-46.17 501.5,-46.17"/>
 </g>
 <!-- 7R2 -->
 <g id="node13" class="node">
 <title>7R2</title>
-<polygon fill="#b2df8a" stroke="#000000" points="667,-36 636.8347,-18 667,0 697.1653,-18 667,-36"/>
-<text text-anchor="middle" x="667" y="-14.3" font-family="Courier,monospace" font-size="14.00" fill="#000000">R2</text>
+<polygon fill="#b2df8a" stroke="black" points="667,-36 636.83,-18 667,0 697.17,-18 667,-36"/>
+<text text-anchor="middle" x="667" y="-14.3" font-family="Courier,monospace" font-size="14.00">R2</text>
 </g>
 <!-- 7&#45;&gt;7R2 -->
 <g id="edge12" class="edge">
 <title>7&#45;&gt;7R2</title>
-<path fill="none" stroke="#000000" d="M667,-72.6952C667,-64.3091 667,-55.0593 667,-46.5897"/>
-<polygon fill="#000000" stroke="#000000" points="670.5001,-46.4024 667,-36.4024 663.5001,-46.4024 670.5001,-46.4024"/>
+<path fill="none" stroke="black" d="M667,-72.81C667,-64.35 667,-54.95 667,-46.4"/>
+<polygon fill="black" stroke="black" points="670.5,-46.17 667,-36.17 663.5,-46.17 670.5,-46.17"/>
 </g>
 </g>
 </svg>
diff --git a/doc/local.mk b/doc/local.mk
index cfd41ac..a8aa208 100644
--- a/doc/local.mk
+++ b/doc/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2001-2003, 2005-2015, 2018-2019 Free Software
+## Copyright (C) 2001-2003, 2005-2015, 2018-2021 Free Software
 ## Foundation, Inc.
 
 ## This program is free software: you can redistribute it and/or modify
@@ -12,7 +12,7 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AM_MAKEINFOFLAGS =                                              \
   --no-split                                                    \
@@ -20,71 +20,71 @@
   --set-customization-variable=AVOID_MENU_REDUNDANCY=true       \
   --set-customization-variable=ICONS=true
 
-info_TEXINFOS = doc/bison.texi
-doc_bison_TEXINFOS =                            \
+info_TEXINFOS = %D%/bison.texi
+%C%_bison_TEXINFOS =                            \
   $(CROSS_OPTIONS_TEXI)                         \
-  doc/fdl.texi                                  \
-  doc/gpl-3.0.texi                              \
-  doc/relocatable.texi
+  %D%/fdl.texi                                  \
+  %D%/gpl-3.0.texi                              \
+  %D%/relocatable.texi
 
 # Cannot express dependencies directly on file names because of Automake.
 # Obfuscate with a variable.
-doc_bison = doc/bison
-$(doc_bison).dvi: $(FIGS_GV:.gv=.eps)
-$(doc_bison).info: $(FIGS_GV:.gv=.txt)
-$(doc_bison).pdf: $(FIGS_GV:.gv=.pdf)
-$(doc_bison).html: $(FIGS_GV:.gv=.svg)
+%C%_bison = %D%/bison
+$(%C%_bison).dvi: $(FIGS_GV:.gv=.eps)
+$(%C%_bison).info: $(FIGS_GV:.gv=.txt)
+$(%C%_bison).pdf: $(FIGS_GV:.gv=.pdf)
+$(%C%_bison).html: $(FIGS_GV:.gv=.svg)
 
-TEXI2DVI = texi2dvi --build-dir=doc/bison.t2d -I doc
-CLEANDIRS += doc/bison.t2d
+TEXI2DVI = texi2dvi --build-dir=%D%/bison.t2d -I %D%
+CLEANDIRS += %D%/bison.t2d
 
-MOSTLYCLEANFILES += $(top_srcdir)/doc/*.tmp
+MOSTLYCLEANFILES += $(top_srcdir)/%D%/*.tmp
 
 CROSS_OPTIONS_PL = $(top_srcdir)/build-aux/cross-options.pl
-CROSS_OPTIONS_TEXI = $(top_srcdir)/doc/cross-options.texi
-$(CROSS_OPTIONS_TEXI): doc/bison.help $(CROSS_OPTIONS_PL)
+CROSS_OPTIONS_TEXI = $(top_srcdir)/%D%/cross-options.texi
+$(CROSS_OPTIONS_TEXI): %D%/bison.help $(CROSS_OPTIONS_PL)
 # Create $@~ which is the previous contents.  Don't use 'mv' here so
 # that even if we are interrupted, the file is still available for
 # diff in the next run.  Note that $@ might not exist yet.
 	$(AM_V_GEN){ test ! -f $@ || cat $@; } >$@~
 	$(AM_V_at)test ! -f $@.tmp || rm -f $@.tmp
 	$(AM_V_at)$(PERL) $(CROSS_OPTIONS_PL) $(top_srcdir)/src/scan-gram.l \
-	  <$(top_srcdir)/doc/bison.help >$@.tmp
+	  <$(top_srcdir)/%D%/bison.help >$@.tmp
 	$(AM_V_at)diff -u $@~ $@.tmp || true
 	$(AM_V_at)mv $@.tmp $@
 MAINTAINERCLEANFILES = $(CROSS_OPTIONS_TEXI)
 
 
 # Fix Info's @code in @deftype
-# https://lists.gnu.org/archive/html/help-texinfo/2019-11/msg00004.html
-all: $(srcdir)/$(doc_bison).info.bak
-$(srcdir)/$(doc_bison).info.bak: $(srcdir)/$(doc_bison).info
+# https://lists.gnu.org/r/help-texinfo/2019-11/msg00004.html
+all-local: $(srcdir)/$(%C%_bison).info.bak
+$(srcdir)/$(%C%_bison).info.bak: $(srcdir)/$(%C%_bison).info
 	$(AM_V_GEN) $(PERL) -pi.bak -0777	\
 	  -e 's{(^ --.*\n(?: {10}.*\n)*)}'	\
 	  -e '{'				\
 	  -e '  $$def = $$1;'			\
 	  -e '  $$def =~ s/‘|’//g;'		\
 	  -e '  $$def;'				\
-	  -e '}gem;' $(srcdir)/$(doc_bison).info
+	  -e '}gem;' $(srcdir)/$(%C%_bison).info
 	@ touch $@
-EXTRA_DIST += $(srcdir)/$(doc_bison).info.bak
-MAINTAINERCLEANFILES += $(srcdir)/$(doc_bison).info.bak
+EXTRA_DIST += $(srcdir)/$(%C%_bison).info.bak
+MAINTAINERCLEANFILES += $(srcdir)/$(%C%_bison).info.bak
 
 
 ## ---------- ##
 ## Ref card.  ##
 ## ---------- ##
 
-EXTRA_DIST += doc/refcard.tex
-CLEANFILES += doc/refcard.pdf
+EXTRA_DIST += %D%/refcard.tex
+CLEANFILES += %D%/refcard.pdf
 
-doc/refcard.pdf: doc/refcard.tex
-	$(AM_V_GEN) cd doc && pdftex $(abs_top_srcdir)/doc/refcard.tex
+%D%/refcard.pdf: %D%/refcard.tex
+	$(AM_V_GEN) cd %D% && pdftex $(abs_top_srcdir)/%D%/refcard.tex
 
 
 
 ## ---------------- ##
-## doc/bison.help.  ##
+## %D%/bison.help.  ##
 ## ---------------- ##
 
 # Some of our targets (cross-options.texi, bison.1) use "bison --help".
@@ -106,18 +106,19 @@
 # compilations of cross-options.texi and bison.1.  At the cost of
 # repeated builds of bison.help.
 
-EXTRA_DIST += $(top_srcdir)/doc/bison.help
+EXTRA_DIST += $(top_srcdir)/%D%/bison.help
 if ! CROSS_COMPILING
-MAINTAINERCLEANFILES += $(top_srcdir)/doc/bison.help
-$(top_srcdir)/doc/bison.help: src/bison$(EXEEXT)
-	$(AM_V_GEN)LC_ALL=C tests/bison --version >doc/bison.help.tmp
+MAINTAINERCLEANFILES += $(top_srcdir)/%D%/bison.help
+$(top_srcdir)/%D%/bison.help: src/bison$(EXEEXT)
+	$(AM_V_GEN)$(MKDIR_P) %D%
+	$(AM_V_at) LC_ALL=C tests/bison --version >%D%/bison.help.tmp
 	$(AM_V_at) LC_ALL=C tests/bison --help | \
 ## Avoid depending on the path to Bison.
 	  sed -e 's,^Usage: .*/bison \[OPTION\],Usage: bison [OPTION],g' \
 ## Avoid variations in the output depending on whether we are
 ## on a glibc system.
-	      -e '/translation bugs/d'  >>doc/bison.help.tmp
-	$(AM_V_at)$(top_srcdir)/build-aux/move-if-change doc/bison.help.tmp $@
+	      -e '/translation bugs/d'  >>%D%/bison.help.tmp
+	$(AM_V_at)$(top_srcdir)/build-aux/move-if-change %D%/bison.help.tmp $@
 endif ! CROSS_COMPILING
 
 
@@ -125,34 +126,48 @@
 ## Man Pages.  ##
 ## ----------- ##
 
-dist_man_MANS = $(top_srcdir)/doc/bison.1
+dist_man_MANS = $(top_srcdir)/%D%/bison.1
 
 EXTRA_DIST += $(dist_man_MANS:.1=.x)
 MAINTAINERCLEANFILES += $(dist_man_MANS)
 
-# Differences to ignore when comparing the man page (the date).
+# Differences to ignore when comparing man pages (the date).
 remove_time_stamp = \
   sed 's/^\(\.TH[^"]*"[^"]*"[^"]*\)"[^"]*"/\1/'
 
 # Depend on configure to get version number changes.
 if ! CROSS_COMPILING
-MAN_DEPS = doc/bison.help doc/bison.x $(top_srcdir)/configure
+MAN_DEPS = %D%/bison.help %D%/bison.x $(top_srcdir)/configure
 endif
 
-$(top_srcdir)/doc/bison.1: $(MAN_DEPS)
-	$(AM_V_GEN)$(HELP2MAN)			\
-	    --include=$(top_srcdir)/doc/bison.x	\
-	    --output=$@.tmp tests/bison
-	$(AM_V_at)if $(remove_time_stamp) $@ >$@a.tmp 2>/dev/null &&		\
-	   $(remove_time_stamp) $@.tmp | cmp $@a.tmp - >/dev/null 2>&1; then	\
-	  touch $@;								\
-	else									\
-	  mv $@.tmp $@;								\
+# If we don't have help2man, just touch the target.  Maintainers must
+# have the real thing, so if there's a .git directory, fail hard.
+#
+# We shouldn't need this, but on some OS the timestamps in the tarball
+# leave us no choice.  See
+# https://lists.gnu.org/r/bug-bison/2020-05/msg00055.html.
+$(top_srcdir)/%D%/bison.1: $(MAN_DEPS)
+	$(AM_V_GEN)if $(HELP2MAN) --version >/dev/null 2>&1; then	\
+	  $(HELP2MAN)							\
+	    --include=$(top_srcdir)/%D%/bison.x				\
+	    --output=$@.tmp tests/bison &&				\
+	  { $(remove_time_stamp) $@     >$@a.tmp || true; } &&		\
+	    $(remove_time_stamp) $@.tmp >$@b.tmp &&			\
+	  if diff $@a.tmp $@b.tmp >/dev/null 2>&1; then			\
+	    touch $@;							\
+	  else								\
+	    mv $@.tmp $@;						\
+	  fi &&								\
+	  rm -f $@*.tmp;						\
+	elif test -d $(srcdir)/.git; then				\
+	  echo >&2 "ERROR: $@: help2man is needed";			\
+	  exit 1;							\
+	else								\
+	  touch $@;							\
 	fi
-	$(AM_V_at)rm -f $@*.tmp
 
 if ENABLE_YACC
-nodist_man_MANS = doc/yacc.1
+nodist_man_MANS = %D%/yacc.1
 endif
 
 ## ----------------------------- ##
@@ -161,8 +176,8 @@
 
 CLEANFILES += $(FIGS_GV:.gv=.eps) $(FIGS_GV:.gv=.pdf) $(FIGS_GV:.gv=.svg)
 FIGS_GV =                                               \
-  doc/figs/example.gv                                   \
-  doc/figs/example-reduce.gv doc/figs/example-shift.gv
+  %D%/figs/example.gv                                   \
+  %D%/figs/example-reduce.gv %D%/figs/example-shift.gv
 EXTRA_DIST +=                                                   \
   $(FIGS_GV) $(FIGS_GV:.gv=.txt)                                \
   $(FIGS_GV:.gv=.eps) $(FIGS_GV:.gv=.pdf) $(FIGS_GV:.gv=.svg)
@@ -193,8 +208,8 @@
 
 doc: html
 
-html-local: doc/Doxyfile
-	$(AM_V_GEN) $(DOXYGEN) doc/Doxyfile
+html-local: %D%/Doxyfile
+	$(AM_V_GEN) $(DOXYGEN) %D%/Doxyfile
 
 edit = sed -e 's,@PACKAGE_NAME\@,$(PACKAGE_NAME),g' \
 	   -e 's,@PACKAGE_VERSION\@,$(PACKAGE_VERSION),g' \
@@ -202,11 +217,11 @@
 	   -e 's,@top_builddir\@,$(top_builddir),g' \
 	   -e 's,@top_srcdir\@,$(top_srcdir),g'
 
-EXTRA_DIST += doc/Doxyfile.in
-CLEANFILES += doc/Doxyfile
+EXTRA_DIST += %D%/Doxyfile.in
+CLEANFILES += %D%/Doxyfile
 # Sed is used to generate Doxyfile from Doxyfile.in instead of
 # configure, because the former is way faster than the latter.
-doc/Doxyfile: $(top_srcdir)/doc/Doxyfile.in
-	$(AM_V_GEN) $(edit) $(top_srcdir)/doc/Doxyfile.in >doc/Doxyfile
+%D%/Doxyfile: $(top_srcdir)/%D%/Doxyfile.in
+	$(AM_V_GEN) $(edit) $(top_srcdir)/%D%/Doxyfile.in >%D%/Doxyfile
 
-CLEANDIRS += doc/html
+CLEANDIRS += %D%/html
diff --git a/doc/refcard.tex b/doc/refcard.tex
index b2bcefb..7fd7507 100644
--- a/doc/refcard.tex
+++ b/doc/refcard.tex
@@ -19,7 +19,7 @@
 \def\finalout{\overfullrule=0pt}
 %\finalout
 
-% Copyright (c) 1998, 2001, 2009-2015, 2018-2019 Free Software
+% Copyright (c) 1998, 2001, 2009--2015, 2018--2021 Free Software
 % Foundation, Inc.
 %
 % This file is part of Bison.
@@ -35,7 +35,7 @@
 % GNU General Public License for more details.
 %
 % You should have received a copy of the GNU General Public License
-% along with this program.  If not, see <http://www.gnu.org/licenses/>.
+% along with this program.  If not, see <https://www.gnu.org/licenses/>.
 %
 % This file is intended to be processed by plain TeX (TeX82).
 %
diff --git a/doc/relocatable.texi b/doc/relocatable.texi
index fca0ea5..f8eec1e 100644
--- a/doc/relocatable.texi
+++ b/doc/relocatable.texi
@@ -8,7 +8,8 @@
 through @code{configure; make; make install} with all its
 dependencies, options, and hurdles.
 
-Red Hat, Debian, and similar package systems solve the ``ease of
+Most package management systems, that allow the user to install
+pre-built binaries of the packages, solve the ``ease of
 installation'' problem, but they hardwire path names, usually to
 @file{/usr} or @file{/usr/local}.  This means that users need root
 privileges to install a binary package, and prevents installing two
@@ -52,9 +53,7 @@
 
 Installation with @option{--enable-relocatable} will not work for
 setuid or setgid executables, because such executables search only
-system library paths for security reasons.  Also, installation with
-@option{--enable-relocatable} might not work on OpenBSD, when the
-package contains shared libraries and libtool versions 1.5.xx are used.
+system library paths for security reasons.
 
 The runtime penalty and size penalty are negligible on GNU/Linux (just
 one system call more when an executable is launched), and small on
diff --git a/doc/stamp-vti b/doc/stamp-vti
index 7db56a3..f0d2ff8 100644
--- a/doc/stamp-vti
+++ b/doc/stamp-vti
@@ -1,4 +1,4 @@
-@set UPDATED 7 December 2019
-@set UPDATED-MONTH December 2019
-@set EDITION 3.5
-@set VERSION 3.5
+@set UPDATED 12 September 2021
+@set UPDATED-MONTH September 2021
+@set EDITION 3.8.2
+@set VERSION 3.8.2
diff --git a/doc/version.texi b/doc/version.texi
index 7db56a3..f0d2ff8 100644
--- a/doc/version.texi
+++ b/doc/version.texi
@@ -1,4 +1,4 @@
-@set UPDATED 7 December 2019
-@set UPDATED-MONTH December 2019
-@set EDITION 3.5
-@set VERSION 3.5
+@set UPDATED 12 September 2021
+@set UPDATED-MONTH September 2021
+@set EDITION 3.8.2
+@set VERSION 3.8.2
diff --git a/etc/README.md b/etc/README.md
new file mode 100644
index 0000000..996b640
--- /dev/null
+++ b/etc/README.md
@@ -0,0 +1,36 @@
+# bench.pl
+A primitive Perl script to run benches.  Currently its only bench is the
+usual calculator: it has a lightweight processing part (but not null), so it
+is really emphasizing the cost of the whole parsing (including scanning and
+I/O).
+
+Set the envvars `BISON` and `CC` to the programs and flags you want to use.
+They default to `bison` and `gcc`.  To run a non-installed bison from a
+tarball built in _build, I suggest the following.
+
+    BISON=_build/tests/bison CC='gcc -O2' ./bench.pl
+
+(The `_build/tests/bison` wrapper makes sure that `_build/src/bison` will
+use the tarballs' skeletons, not those already installed as a
+straightforward use of `_build/src/bison` would.)
+
+<!--
+
+Local Variables:
+mode: markdown
+fill-column: 76
+ispell-dictionary: "american"
+End:
+
+Copyright (C) 2006, 2009-2015, 2018-2021 Free Software Foundation, Inc.
+
+This file is part of Bison, the GNU Compiler Compiler.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts.  A copy of the license is included in the "GNU Free
+Documentation License" file as part of this distribution.
+
+-->
diff --git a/etc/bench.pl.in b/etc/bench.pl.in
index 4a239d2..b3006ae 100755
--- a/etc/bench.pl.in
+++ b/etc/bench.pl.in
@@ -1,6 +1,6 @@
 #! /usr/bin/perl -w
 
-# Copyright (C) 2006, 2008-2015, 2018-2019 Free Software Foundation,
+# Copyright (C) 2006, 2008-2015, 2018-2021 Free Software Foundation,
 # Inc.
 #
 # This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 =head1 NAME
 
@@ -38,13 +38,13 @@
      | ( directives> )          -- Parentheses
      | %b PATH                  -- Use bison at PATH for this bench
      | #d NAME[=VALUE]          -- %code { #define NAME [VALUE] }
-     | %d NAME[=VALUE]          -- %define NAME ["VALUE"]
+     | %d NAME[=VALUE]          -- %define NAME [VALUE]
      | %s skeleton              -- %skeleton "skeleton"
      | directive
 
 Parentheses only group to override precedence.  For instance:
 
-  [ %debug ] & [ %error-verbose ] & [ %define variant ]
+  [ %debug ] & [ %d parse.error=verbose ] & [ %define variant ]
 
 will generate eight different cases.
 
@@ -100,7 +100,7 @@
 
 =item B<-h>, B<--help>
 
-Display this message and exit succesfully.  The more verbose, the more
+Display this message and exit successfully.  The more verbose, the more
 details.
 
 =item B<-i>, B<--iterations>=I<integer>
@@ -109,6 +109,10 @@
 negative, specify the minimum number of CPU seconds to run.  Defaults
 to -1.
 
+=item B<-k>, B<--gbench>
+
+Use Google Benchmark.
+
 =item B<-q>, B<--quiet>
 
 Decrease the verbosity level (defaults to 1).
@@ -144,7 +148,7 @@
 
 =item C<$cxx>
 
-The C++ compiler.
+The C++-11 compiler.
 
 =item C<$cflags>
 
@@ -169,9 +173,10 @@
 my $bench;
 my $bison = $ENV{'BISON'} || '@abs_top_builddir@/tests/bison';
 my $cc = $ENV{'CC'} || 'gcc';
-my $cxx = $ENV{'CXX'} || 'g++';
+my $cxx = $ENV{'CXX'} || 'g++ -std=c++11';
 my $cflags = '-O2';
 my @directive = ();
+my $gbench = 0;
 my $grammar = 'calc';
 my $iterations = -1;
 my $verbose = 1;
@@ -180,13 +185,13 @@
 
 =over 4
 
-=item C<verbose($level, $message)>
+=item C<verbose ($level, $message)>
 
 Report the C<$message> is C<$level> E<lt>= C<$verbose>.
 
 =cut
 
-sub verbose($$)
+sub verbose ($$)
 {
   my ($level, $message) = @_;
   print STDERR $message
@@ -196,13 +201,13 @@
 
 ######################################################################
 
-=item C<directives($bench, @directive)>
+=item C<directives ($bench, @directive)>
 
 Format the list of directives for Bison for bench named C<$bench>.
 
 =cut
 
-sub directives($@)
+sub directives ($@)
 {
   my ($bench, @directive) = @_;
   my $res = "/* Directives for bench '$bench'. */\n";
@@ -213,6 +218,27 @@
 
 ######################################################################
 
+=item C<is_pure (@directive)>
+
+Whether api.pure is set.
+
+=cut
+
+sub is_pure (@)
+{
+  my (@directive) = @_;
+  for my $dir (@directive)
+    {
+      if ($dir =~ /\A%define api.pure/)
+        {
+          return 1;
+        }
+    }
+  return 0;
+}
+
+######################################################################
+
 =item C<generate_grammar_triangular ($base, $max, @directive)>
 
 Create a large triangular grammar which looks like :
@@ -247,7 +273,6 @@
   my $out = new IO::File ">$base.y"
     or die;
   print $out <<EOF;
-%error-verbose
 %{
 #include <stdio.h>
 #include <stdlib.h>
@@ -329,24 +354,22 @@
 
 ##################################################################
 
-=item C<calc_input ($base, $max)>
+=item C<calc_input ($out)>
 
-Generate the input file F<$base.input> for the calc parser.  The input
-is composed of two expressions.  The first one is using left recursion
-only and consumes no stack.  The second one requires a deep stack.
-These two expressions are repeated C<$max> times in the output file.
+Emit in C<$out> input for the calc parser.  The input is composed of
+two expressions.  The first one is using left recursion only and
+consumes no stack.  The second one requires a deep stack.  These two
+expressions are repeated C<$max> times in the output file.
 
 =cut
 
-sub calc_input ($$)
+sub calc_input ($)
 {
-  my ($base, $max) = @_;
-  my $out = new IO::File ">$base.input"
-    or die;
-  foreach (1 .. $max)
+  my ($out) = @_;
+  print $out "0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99\\n\\\n";
+  if (!$gbench)
     {
-      print $out "0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99\n";
-      print $out "1+1*(2+2*(3+3*(4+4*(5+5*(6+6*(7+7*(8+8*(9+9*(10+10*(11+11*(12+12*(13+13*(14+14*(15+15*(16+16*(17+17*(18+18*(19+19*(20+20*(21+21*(22+22*(23+23*(24+24*(25+25*(26+26*(27+27*(28+28*(29+29*(30+30*(31+31*(32+32*(33+33*(34+34*(35+35*(36+36*(37+37*(38+38*(39+39*(40+40*(41+41*(42+42*(43+43*(44+44*(45+45*(46+46*(47+47*(48+48*(49+49*(50+50*(51+51*(52+52*(53+53*(54+54*(55+55*(56+56*(57+57*(58+58*(59+59*(60+60*(61+61*(62+62*(63+63*(64+64*(65+65*(66+66*(67+67*(68+68*(69+69*(70+70*(71+71*(72+72*(73+73*(74+74*(75+75*(76+76*(77+77*(78+78*(79+79*(80+80*(81+81*(82+82*(83+83*(84+84*(85+85*(86+86*(87+87*(88+88*(89+89*(90+90*(91+91*(92+92*(93+93*(94+94*(95+95*(96+96*(97+97*(98+98*(99+99*(100+100*(101+101*(102+102*(103+103*(104+104*(105+105*(106+106*(107+107*(108+108*(109+109*(110+110*(111+111*(112+112*(113+113*(114+114*(115+115*(116+116*(117+117*(118+118*(119+119*(120+120*(121+121*(122+122*(123+123*(124+124*(125+125*(126+126*(127+127*(128+128*(129+129*(130+130*(131+131*(132+132*(133+133*(134+134*(135+135*(136+136*(137+137*(138+138*(139+139*(140+140*(141+141*(142+142*(143+143*(144+144*(145+145*(146+146*(147+147*(148+148*(149+149*(150+150*(151+151*(152+152*(153+153*(154+154*(155+155*(156+156*(157+157*(158+158*(159+159*(160+160*(161+161*(162+162*(163+163*(164+164*(165+165*(166+166*(167+167*(168+168*(169+169*(170+170*(171+171*(172+172*(173+173*(174+174*(175+175*(176+176*(177+177*(178+178*(179+179*(180+180*(181+181*(182+182*(183+183*(184+184*(185+185*(186+186*(187+187*(188+188*(189+189*(190+190*(191+191*(192+192*(193+193*(194+194*(195+195*(196+196*(197+197*(198+198*(199+199*(200+200*(201+201*(202+202*(203+203*(204+204*(205+205*(206+206*(207+207*(208+208*(209+209*(210+210*(211+211*(212+212*(213+213*(214+214*(215+215*(216+216*(217+217*(218+218*(219+219*(220+220*(221+221*(222+222*(223+223*(224+224*(225+225*(226+226*(227+227*(228+228*(229+229*(230+230*(231+231*(232+232*(233+233*(234+234*(235+235*(236+236*(237+237*(238+238*(239+239*(240+240*(241+241*(242+242*(243+243*(244+244*(245+245*(246+246*(247+247*(248+248*(249+249*(250+250*(251+251*(252+252*(253+253*(254+254*(255+255*(256+256*(257+257*(258+258*(259+259*(260+260*(261+261*(262+262*(263+263*(264+264*(265+265*(266+266*(267+267*(268+268*(269+269*(270+270*(271+271*(272+272*(273+273*(274+274*(275+275*(276+276*(277+277*(278+278*(279+279*(280+280*(281+281*(282+282*(283+283*(284+284*(285+285*(286+286*(287+287*(288+288*(289+289*(290+290*(291+291*(292+292*(293+293*(294+294*(295+295*(296+296*(297+297*(298+298*(299+299*(300+300*(301+301*(302+302*(303+303*(304+304*(305+305*(306+306*(307+307*(308+308*(309+309*(310+310*(311+311*(312+312*(313+313*(314+314*(315+315*(316+316*(317+317*(318+318*(319+319*(320+320*(321+321*(322+322*(323+323*(324+324*(325+325*(326+326*(327+327*(328+328*(329+329*(330+330*(331+331*(332+332*(333+333*(334+334*(335+335*(336+336*(337+337*(338+338*(339+339*(340+340*(341+341*(342+342*(343+343*(344+344*(345+345*(346+346*(347+347*(348+348*(349+349*(350+350*(351+351*(352+352*(353+353*(354+354*(355+355*(356+356*(357+357*(358+358*(359+359*(360+360*(361+361*(362+362*(363+363*(364+364*(365+365*(366+366*(367+367*(368+368*(369+369*(370+370*(371+371*(372+372*(373+373*(374+374*(375+375*(376+376*(377+377*(378+378*(379+379*(380+380*(381+381*(382+382*(383+383*(384+384*(385+385*(386+386*(387+387*(388+388*(389+389*(390+390*(391+391*(392+392*(393+393*(394+394*(395+395*(396+396*(397+397*(398+398*(399+399*(400+400*(401+401*(402+402*(403+403*(404+404*(405+405*(406+406*(407+407*(408+408*(409+409*(410+410*(411+411*(412+412*(413+413*(414+414*(415+415*(416+416*(417+417*(418+418*(419+419*(420+420*(421+421*(422+422*(423+423*(424+424*(425+425*(426+426*(427+427*(428+428*(429+429*(430+430*(431+431*(432+432*(433+433*(434+434*(435+435*(436+436*(437+437*(438+438*(439+439*(440+440*(441+441*(442+442*(443+443*(444+444*(445+445*(446+446*(447+447*(448+448*(449+449*(450+450*(451+451*(452+452*(453+453*(454+454*(455+455*(456+456*(457+457*(458+458*(459+459*(460+460*(461+461*(462+462*(463+463*(464+464*(465+465*(466+466*(467+467*(468+468*(469+469*(470+470*(471+471*(472+472*(473+473*(474+474*(475+475*(476+476*(477+477*(478+478*(479+479*(480+480*(481+481*(482+482*(483+483*(484+484*(485+485*(486+486*(487+487*(488+488*(489+489*(490+490*(491+491*(492+492*(493+493*(494+494*(495+495*(496+496*(497+497*(498+498*(499+499*(500+500*(501+501*(502+502*(503+503*(504+504*(505+505*(506+506*(507+507*(508+508*(509+509*(510+510*(511+511*(512+512*(513+513*(514+514*(515+515*(516+516*(517+517*(518+518*(519+519*(520+520*(521+521*(522+522*(523+523*(524+524*(525+525*(526+526*(527+527*(528+528*(529+529*(530+530*(531+531*(532+532*(533+533*(534+534*(535+535*(536+536*(537+537*(538+538*(539+539*(540+540*(541+541*(542+542*(543+543*(544+544*(545+545*(546+546*(547+547*(548+548*(549+549*(550+550*(551+551*(552+552*(553+553*(554+554*(555+555*(556+556*(557+557*(558+558*(559+559*(560+560*(561+561*(562+562*(563+563*(564+564*(565+565*(566+566*(567+567*(568+568*(569+569*(570+570*(571+571*(572+572*(573+573*(574+574*(575+575*(576+576*(577+577*(578+578*(579+579*(580+580*(581+581*(582+582*(583+583*(584+584*(585+585*(586+586*(587+587*(588+588*(589+589*(590+590*(591+591*(592+592*(593+593*(594+594*(595+595*(596+596*(597+597*(598+598*(599+599*(600+600*(601+601*(602+602*(603+603*(604+604*(605+605*(606+606*(607+607*(608+608*(609+609*(610+610*(611+611*(612+612*(613+613*(614+614*(615+615*(616+616*(617+617*(618+618*(619+619*(620+620*(621+621*(622+622*(623+623*(624+624*(625+625*(626+626*(627+627*(628+628*(629+629*(630+630*(631+631*(632+632*(633+633*(634+634*(635+635*(636+636*(637+637*(638+638*(639+639*(640+640*(641+641*(642+642*(643+643*(644+644*(645+645*(646+646*(647+647*(648+648*(649+649*(650+650*(651+651*(652+652*(653+653*(654+654*(655+655*(656+656*(657+657*(658+658*(659+659*(660+660*(661+661*(662+662*(663+663*(664+664*(665+665*(666+666*(667+667*(668+668*(669+669*(670+670*(671+671*(672+672*(673+673*(674+674*(675+675*(676+676*(677+677*(678+678*(679+679*(680+680*(681+681*(682+682*(683+683*(684+684*(685+685*(686+686*(687+687*(688+688*(689+689*(690+690*(691+691*(692+692*(693+693*(694+694*(695+695*(696+696*(697+697*(698+698*(699+699*(700+700*(701+701*(702+702*(703+703*(704+704*(705+705*(706+706*(707+707*(708+708*(709+709*(710+710*(711+711*(712+712*(713+713*(714+714*(715+715*(716+716*(717+717*(718+718*(719+719*(720+720*(721+721*(722+722*(723+723*(724+724*(725+725*(726+726*(727+727*(728+728*(729+729*(730+730*(731+731*(732+732*(733+733*(734+734*(735+735*(736+736*(737+737*(738+738*(739+739*(740+740*(741+741*(742+742*(743+743*(744+744*(745+745*(746+746*(747+747*(748+748*(749+749*(750+750*(751+751*(752+752*(753+753*(754+754*(755+755*(756+756*(757+757*(758+758*(759+759*(760+760*(761+761*(762+762*(763+763*(764+764*(765+765*(766+766*(767+767*(768+768*(769+769*(770+770*(771+771*(772+772*(773+773*(774+774*(775+775*(776+776*(777+777*(778+778*(779+779*(780+780*(781+781*(782+782*(783+783*(784+784*(785+785*(786+786*(787+787*(788+788*(789+789*(790+790*(791+791*(792+792*(793+793*(794+794*(795+795*(796+796*(797+797*(798+798*(799+799*(800+800*(801+801*(802+802*(803+803*(804+804*(805+805*(806+806*(807+807*(808+808*(809+809*(810+810*(811+811*(812+812*(813+813*(814+814*(815+815*(816+816*(817+817*(818+818*(819+819*(820+820*(821+821*(822+822*(823+823*(824+824*(825+825*(826+826*(827+827*(828+828*(829+829*(830+830*(831+831*(832+832*(833+833*(834+834*(835+835*(836+836*(837+837*(838+838*(839+839*(840+840*(841+841*(842+842*(843+843*(844+844*(845+845*(846+846*(847+847*(848+848*(849+849*(850+850*(851+851*(852+852*(853+853*(854+854*(855+855*(856+856*(857+857*(858+858*(859+859*(860+860*(861+861*(862+862*(863+863*(864+864*(865+865*(866+866*(867+867*(868+868*(869+869*(870+870*(871+871*(872+872*(873+873*(874+874*(875+875*(876+876*(877+877*(878+878*(879+879*(880+880*(881+881*(882+882*(883+883*(884+884*(885+885*(886+886*(887+887*(888+888*(889+889*(890+890*(891+891*(892+892*(893+893*(894+894*(895+895*(896+896*(897+897*(898+898*(899+899*(900+900*(901+901*(902+902*(903+903*(904+904*(905+905*(906+906*(907+907*(908+908*(909+909*(910+910*(911+911*(912+912*(913+913*(914+914*(915+915*(916+916*(917+917*(918+918*(919+919*(920+920*(921+921*(922+922*(923+923*(924+924*(925+925*(926+926*(927+927*(928+928*(929+929*(930+930*(931+931*(932+932*(933+933*(934+934*(935+935*(936+936*(937+937*(938+938*(939+939*(940+940*(941+941*(942+942*(943+943*(944+944*(945+945*(946+946*(947+947*(948+948*(949+949*(950+950*(951+951*(952+952*(953+953*(954+954*(955+955*(956+956*(957+957*(958+958*(959+959*(960+960*(961+961*(962+962*(963+963*(964+964*(965+965*(966+966*(967+967*(968+968*(969+969*(970+970*(971+971*(972+972*(973+973*(974+974*(975+975*(976+976*(977+977*(978+978*(979+979*(980+980*(981+981*(982+982*(983+983*(984+984*(985+985*(986+986*(987+987*(988+988*(989+989*(990+990*(991+991*(992+992*(993+993*(994+994*(995+995*(996+996*(997+997*(998+998*(999+999*(1000+1000*(1001))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n";
+      print $out "1+1*(2+2*(3+3*(4+4*(5+5*(6+6*(7+7*(8+8*(9+9*(10+10*(11+11*(12+12*(13+13*(14+14*(15+15*(16+16*(17+17*(18+18*(19+19*(20+20*(21+21*(22+22*(23+23*(24+24*(25+25*(26+26*(27+27*(28+28*(29+29*(30+30*(31+31*(32+32*(33+33*(34+34*(35+35*(36+36*(37+37*(38+38*(39+39*(40+40*(41+41*(42+42*(43+43*(44+44*(45+45*(46+46*(47+47*(48+48*(49+49*(50+50*(51+51*(52+52*(53+53*(54+54*(55+55*(56+56*(57+57*(58+58*(59+59*(60+60*(61+61*(62+62*(63+63*(64+64*(65+65*(66+66*(67+67*(68+68*(69+69*(70+70*(71+71*(72+72*(73+73*(74+74*(75+75*(76+76*(77+77*(78+78*(79+79*(80+80*(81+81*(82+82*(83+83*(84+84*(85+85*(86+86*(87+87*(88+88*(89+89*(90+90*(91+91*(92+92*(93+93*(94+94*(95+95*(96+96*(97+97*(98+98*(99+99*(100+100*(101+101*(102+102*(103+103*(104+104*(105+105*(106+106*(107+107*(108+108*(109+109*(110+110*(111+111*(112+112*(113+113*(114+114*(115+115*(116+116*(117+117*(118+118*(119+119*(120+120*(121+121*(122+122*(123+123*(124+124*(125+125*(126+126*(127+127*(128+128*(129+129*(130+130*(131+131*(132+132*(133+133*(134+134*(135+135*(136+136*(137+137*(138+138*(139+139*(140+140*(141+141*(142+142*(143+143*(144+144*(145+145*(146+146*(147+147*(148+148*(149+149*(150+150*(151+151*(152+152*(153+153*(154+154*(155+155*(156+156*(157+157*(158+158*(159+159*(160+160*(161+161*(162+162*(163+163*(164+164*(165+165*(166+166*(167+167*(168+168*(169+169*(170+170*(171+171*(172+172*(173+173*(174+174*(175+175*(176+176*(177+177*(178+178*(179+179*(180+180*(181+181*(182+182*(183+183*(184+184*(185+185*(186+186*(187+187*(188+188*(189+189*(190+190*(191+191*(192+192*(193+193*(194+194*(195+195*(196+196*(197+197*(198+198*(199+199*(200+200*(201+201*(202+202*(203+203*(204+204*(205+205*(206+206*(207+207*(208+208*(209+209*(210+210*(211+211*(212+212*(213+213*(214+214*(215+215*(216+216*(217+217*(218+218*(219+219*(220+220*(221+221*(222+222*(223+223*(224+224*(225+225*(226+226*(227+227*(228+228*(229+229*(230+230*(231+231*(232+232*(233+233*(234+234*(235+235*(236+236*(237+237*(238+238*(239+239*(240+240*(241+241*(242+242*(243+243*(244+244*(245+245*(246+246*(247+247*(248+248*(249+249*(250+250*(251+251*(252+252*(253+253*(254+254*(255+255*(256+256*(257+257*(258+258*(259+259*(260+260*(261+261*(262+262*(263+263*(264+264*(265+265*(266+266*(267+267*(268+268*(269+269*(270+270*(271+271*(272+272*(273+273*(274+274*(275+275*(276+276*(277+277*(278+278*(279+279*(280+280*(281+281*(282+282*(283+283*(284+284*(285+285*(286+286*(287+287*(288+288*(289+289*(290+290*(291+291*(292+292*(293+293*(294+294*(295+295*(296+296*(297+297*(298+298*(299+299*(300+300*(301+301*(302+302*(303+303*(304+304*(305+305*(306+306*(307+307*(308+308*(309+309*(310+310*(311+311*(312+312*(313+313*(314+314*(315+315*(316+316*(317+317*(318+318*(319+319*(320+320*(321+321*(322+322*(323+323*(324+324*(325+325*(326+326*(327+327*(328+328*(329+329*(330+330*(331+331*(332+332*(333+333*(334+334*(335+335*(336+336*(337+337*(338+338*(339+339*(340+340*(341+341*(342+342*(343+343*(344+344*(345+345*(346+346*(347+347*(348+348*(349+349*(350+350*(351+351*(352+352*(353+353*(354+354*(355+355*(356+356*(357+357*(358+358*(359+359*(360+360*(361+361*(362+362*(363+363*(364+364*(365+365*(366+366*(367+367*(368+368*(369+369*(370+370*(371+371*(372+372*(373+373*(374+374*(375+375*(376+376*(377+377*(378+378*(379+379*(380+380*(381+381*(382+382*(383+383*(384+384*(385+385*(386+386*(387+387*(388+388*(389+389*(390+390*(391+391*(392+392*(393+393*(394+394*(395+395*(396+396*(397+397*(398+398*(399+399*(400+400*(401+401*(402+402*(403+403*(404+404*(405+405*(406+406*(407+407*(408+408*(409+409*(410+410*(411+411*(412+412*(413+413*(414+414*(415+415*(416+416*(417+417*(418+418*(419+419*(420+420*(421+421*(422+422*(423+423*(424+424*(425+425*(426+426*(427+427*(428+428*(429+429*(430+430*(431+431*(432+432*(433+433*(434+434*(435+435*(436+436*(437+437*(438+438*(439+439*(440+440*(441+441*(442+442*(443+443*(444+444*(445+445*(446+446*(447+447*(448+448*(449+449*(450+450*(451+451*(452+452*(453+453*(454+454*(455+455*(456+456*(457+457*(458+458*(459+459*(460+460*(461+461*(462+462*(463+463*(464+464*(465+465*(466+466*(467+467*(468+468*(469+469*(470+470*(471+471*(472+472*(473+473*(474+474*(475+475*(476+476*(477+477*(478+478*(479+479*(480+480*(481+481*(482+482*(483+483*(484+484*(485+485*(486+486*(487+487*(488+488*(489+489*(490+490*(491+491*(492+492*(493+493*(494+494*(495+495*(496+496*(497+497*(498+498*(499+499*(500+500*(501+501*(502+502*(503+503*(504+504*(505+505*(506+506*(507+507*(508+508*(509+509*(510+510*(511+511*(512+512*(513+513*(514+514*(515+515*(516+516*(517+517*(518+518*(519+519*(520+520*(521+521*(522+522*(523+523*(524+524*(525+525*(526+526*(527+527*(528+528*(529+529*(530+530*(531+531*(532+532*(533+533*(534+534*(535+535*(536+536*(537+537*(538+538*(539+539*(540+540*(541+541*(542+542*(543+543*(544+544*(545+545*(546+546*(547+547*(548+548*(549+549*(550+550*(551+551*(552+552*(553+553*(554+554*(555+555*(556+556*(557+557*(558+558*(559+559*(560+560*(561+561*(562+562*(563+563*(564+564*(565+565*(566+566*(567+567*(568+568*(569+569*(570+570*(571+571*(572+572*(573+573*(574+574*(575+575*(576+576*(577+577*(578+578*(579+579*(580+580*(581+581*(582+582*(583+583*(584+584*(585+585*(586+586*(587+587*(588+588*(589+589*(590+590*(591+591*(592+592*(593+593*(594+594*(595+595*(596+596*(597+597*(598+598*(599+599*(600+600*(601+601*(602+602*(603+603*(604+604*(605+605*(606+606*(607+607*(608+608*(609+609*(610+610*(611+611*(612+612*(613+613*(614+614*(615+615*(616+616*(617+617*(618+618*(619+619*(620+620*(621+621*(622+622*(623+623*(624+624*(625+625*(626+626*(627+627*(628+628*(629+629*(630+630*(631+631*(632+632*(633+633*(634+634*(635+635*(636+636*(637+637*(638+638*(639+639*(640+640*(641+641*(642+642*(643+643*(644+644*(645+645*(646+646*(647+647*(648+648*(649+649*(650+650*(651+651*(652+652*(653+653*(654+654*(655+655*(656+656*(657+657*(658+658*(659+659*(660+660*(661+661*(662+662*(663+663*(664+664*(665+665*(666+666*(667+667*(668+668*(669+669*(670+670*(671+671*(672+672*(673+673*(674+674*(675+675*(676+676*(677+677*(678+678*(679+679*(680+680*(681+681*(682+682*(683+683*(684+684*(685+685*(686+686*(687+687*(688+688*(689+689*(690+690*(691+691*(692+692*(693+693*(694+694*(695+695*(696+696*(697+697*(698+698*(699+699*(700+700*(701+701*(702+702*(703+703*(704+704*(705+705*(706+706*(707+707*(708+708*(709+709*(710+710*(711+711*(712+712*(713+713*(714+714*(715+715*(716+716*(717+717*(718+718*(719+719*(720+720*(721+721*(722+722*(723+723*(724+724*(725+725*(726+726*(727+727*(728+728*(729+729*(730+730*(731+731*(732+732*(733+733*(734+734*(735+735*(736+736*(737+737*(738+738*(739+739*(740+740*(741+741*(742+742*(743+743*(744+744*(745+745*(746+746*(747+747*(748+748*(749+749*(750+750*(751+751*(752+752*(753+753*(754+754*(755+755*(756+756*(757+757*(758+758*(759+759*(760+760*(761+761*(762+762*(763+763*(764+764*(765+765*(766+766*(767+767*(768+768*(769+769*(770+770*(771+771*(772+772*(773+773*(774+774*(775+775*(776+776*(777+777*(778+778*(779+779*(780+780*(781+781*(782+782*(783+783*(784+784*(785+785*(786+786*(787+787*(788+788*(789+789*(790+790*(791+791*(792+792*(793+793*(794+794*(795+795*(796+796*(797+797*(798+798*(799+799*(800+800*(801+801*(802+802*(803+803*(804+804*(805+805*(806+806*(807+807*(808+808*(809+809*(810+810*(811+811*(812+812*(813+813*(814+814*(815+815*(816+816*(817+817*(818+818*(819+819*(820+820*(821+821*(822+822*(823+823*(824+824*(825+825*(826+826*(827+827*(828+828*(829+829*(830+830*(831+831*(832+832*(833+833*(834+834*(835+835*(836+836*(837+837*(838+838*(839+839*(840+840*(841+841*(842+842*(843+843*(844+844*(845+845*(846+846*(847+847*(848+848*(849+849*(850+850*(851+851*(852+852*(853+853*(854+854*(855+855*(856+856*(857+857*(858+858*(859+859*(860+860*(861+861*(862+862*(863+863*(864+864*(865+865*(866+866*(867+867*(868+868*(869+869*(870+870*(871+871*(872+872*(873+873*(874+874*(875+875*(876+876*(877+877*(878+878*(879+879*(880+880*(881+881*(882+882*(883+883*(884+884*(885+885*(886+886*(887+887*(888+888*(889+889*(890+890*(891+891*(892+892*(893+893*(894+894*(895+895*(896+896*(897+897*(898+898*(899+899*(900+900*(901+901*(902+902*(903+903*(904+904*(905+905*(906+906*(907+907*(908+908*(909+909*(910+910*(911+911*(912+912*(913+913*(914+914*(915+915*(916+916*(917+917*(918+918*(919+919*(920+920*(921+921*(922+922*(923+923*(924+924*(925+925*(926+926*(927+927*(928+928*(929+929*(930+930*(931+931*(932+932*(933+933*(934+934*(935+935*(936+936*(937+937*(938+938*(939+939*(940+940*(941+941*(942+942*(943+943*(944+944*(945+945*(946+946*(947+947*(948+948*(949+949*(950+950*(951+951*(952+952*(953+953*(954+954*(955+955*(956+956*(957+957*(958+958*(959+959*(960+960*(961+961*(962+962*(963+963*(964+964*(965+965*(966+966*(967+967*(968+968*(969+969*(970+970*(971+971*(972+972*(973+973*(974+974*(975+975*(976+976*(977+977*(978+978*(979+979*(980+980*(981+981*(982+982*(983+983*(984+984*(985+985*(986+986*(987+987*(988+988*(989+989*(990+990*(991+991*(992+992*(993+993*(994+994*(995+995*(996+996*(997+997*(998+998*(999+999*(1000+1000*(1001))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\\n\\\n";
     }
 }
 
@@ -363,61 +386,63 @@
 sub generate_grammar_calc ($$@)
 {
   my ($base, $max, @directive) = @_;
-  my $directives = directives ($base, @directive);
 
-  # Putting this request here is stupid, since the input will be
-  # generated each time we generate a grammar.
-  calc_input ('calc', 200);
+  my $prefix = $base;
+  push @directive, "%define api.prefix {$prefix}"
+    if ($gbench);
+  my $directives = directives ($base, @directive);
 
   my $out = new IO::File ">$base.y"
     or die;
   print $out <<EOF;
 %{
 #include <assert.h>
+#include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <ctype.h>
+
+@{[$gbench ? "#include <benchmark/benchmark.h>" : ""]}
+
 #define USE(Var)
-
-/* Exercise pre-prologue dependency to %union.  */
-typedef int semantic_value;
-
-static semantic_value global_result = 0;
-static int global_count = 0;
 %}
 
+%define api.value.type union
 $directives
-%error-verbose
-/* Exercise %union. */
-%union
-{
-  semantic_value ival;
-};
 
-%{
+%code provides {
 static int power (int base, int exponent);
 /* yyerror receives the location if:
    - %location & %pure & %glr
    - %location & %pure & %yacc & %parse-param. */
 static void yyerror (const char *s);
-#if YYPURE
-static int yylex (YYSTYPE* yylvalp);
-#else
-static int yylex (void);
-#endif
-%}
+static int yylex (@{[is_pure (@directive) ? "YYSTYPE *yylvalp" : "void"]});
+}
 
 /* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
+%token
+    PLUS   "+"
+    MINUS  "-"
+    STAR   "*"
+    SLASH  "/"
+    CARET  "^"
+    LPAREN "("
+    RPAREN ")"
+    EQUAL  "="
+    BANG   "!"
+    EOL    "end of line"
+    CALC_EOF 0 "end of input"
+  <int>
+    NUM "number"
+%type  <int> exp
 
-%nonassoc '=' /* comparison            */
-%left '-' '+'
-%left '*' '/'
+%printer { fprintf (yyo, "%d", \$\$); } <int>
+
+%nonassoc "=" /* comparison            */
+%left "-" "+"
+%left "*" "/"
 %left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
+%right "^"    /* exponentiation        */
 
 /* Grammar follows */
 %%
@@ -427,32 +452,30 @@
 ;
 
 line:
-  '\\n'
-| exp '\\n'           { USE (\$1); }
+  EOL
+| exp EOL            { USE (\$1); }
 ;
 
 exp:
   NUM                { \$\$ = \$1;             }
-| exp '=' exp
+| exp "=" exp
   {
     if (\$1 != \$3)
       fprintf (stderr, "calc: error: %d != %d\\n", \$1, \$3);
     \$\$ = \$1;
   }
-| exp '+' exp        { \$\$ = \$1 + \$3;        }
-| exp '-' exp        { \$\$ = \$1 - \$3;        }
-| exp '*' exp        { \$\$ = \$1 * \$3;        }
-| exp '/' exp        { \$\$ = \$1 / \$3;        }
-| '-' exp  %prec NEG { \$\$ = -\$2;            }
-| exp '^' exp        { \$\$ = power (\$1, \$3); }
-| '(' exp ')'        { \$\$ = \$2;             }
-| '(' error ')'      { \$\$ = 1111;           }
-| '!'                { \$\$ = 0; YYERROR;     }
-| '-' error          { \$\$ = 0; YYERROR;     }
+| exp "+" exp        { \$\$ = \$1 + \$3;      }
+| exp "-" exp        { \$\$ = \$1 - \$3;      }
+| exp "*" exp        { \$\$ = \$1 * \$3;      }
+| exp "/" exp        { \$\$ = \$1 / \$3;      }
+| "-" exp  %prec NEG { \$\$ = -\$2;           }
+| "(" exp ")"        { \$\$ = \$2;            }
+| "(" error ")"      { \$\$ = 1111;           }
+| "-" error          { \$\$ = 0; YYERROR;     }
 ;
 %%
 /* The input.  */
-static FILE *input;
+static const char *input;
 
 static void
 yyerror (const char *s)
@@ -461,110 +484,82 @@
 }
 
 static int
-get_char (void)
-{
-  return getc (input);
-}
-
-
-static void
-unget_char ( int c)
-{
-  ungetc (c, input);
-}
-
-static int
-read_signed_integer (void)
-{
-  int c = get_char ();
-  int sign = 1;
-  int n = 0;
-
-  if (c == '-')
-    {
-      c = get_char ();
-      sign = -1;
-    }
-
-  while (isdigit (c))
-    {
-      n = 10 * n + (c - '0');
-      c = get_char ();
-    }
-
-  unget_char (c);
-
-  return sign * n;
-}
-
-static int
-#if YYPURE
-# define yylval (*yylvalp)
-yylex (YYSTYPE* yylvalp)
-#else
-yylex (void)
-#endif
+yylex (@{[is_pure (@directive) ? "YYSTYPE *yylvalp" : "void"]})
 {
   int c;
 
-  /* Skip white space.  */
-  while ((c = get_char ()) == ' ' || c == '\t')
-    continue;
+  // Ignore white space, get first nonwhite character.
+  do {
+    c = *input++;
+  } while (c == ' ' || c == '\t');
 
-  /* process numbers   */
-  if (c == '.' || isdigit (c))
+  switch (c)
     {
-      unget_char ( c);
-      yylval.ival = read_signed_integer ();
-      return NUM;
+    case '+': return PLUS;
+    case '-': return MINUS;
+    case '*': return STAR;
+    case '/': return SLASH;
+    case '=': return EQUAL;
+    case '(': return LPAREN;
+    case ')': return RPAREN;
+
+    case '\\n': return EOL;
+    case 0: return CALC_EOF;
+
+    case '0': case '1': case '2': case '3': case '4':
+    case '5': case '6': case '7': case '8': case '9':
+      {
+        int nchars = 0;
+        int n = sscanf (input - 1, "%d%n", &@{[is_pure (@directive) ? "yylvalp->" : "yylval."]}NUM, &nchars);
+        assert (n == 1);
+        input += nchars - 1;
+        return NUM;
+      }
+
+    default:
+      yyerror ("error: invalid character");
+      return yylex (@{[is_pure (@directive) ? "yylvalp" : ""]});
     }
-
-  /* Return end-of-file.  */
-  if (c == EOF)
-    return CALC_EOF;
-
-  /* Return single chars. */
-  return c;
 }
+EOF
 
-static int
-power (int base, int exponent)
+  print $out "static const char *INPUT = \"\\n\\\n";
+  calc_input ($out);
+  print $out "\";\n";
+
+  if ($gbench)
+    {
+      print $out <<EOF;
+static void BM_${prefix} (benchmark::State& state)
 {
-  assert (0 <= exponent);
-  int res = 1;
-  for (/* Niente */; exponent; --exponent)
-    res *= base;
-  return res;
-}
-
-
-int
-main (int argc, const char **argv)
-{
-  semantic_value result = 0;
-  int count = 0;
-  int status;
-
 #if YYDEBUG
   yydebug = !!getenv ("YYDEBUG");
 #endif
 
-  input = fopen ("calc.input", "r");
-  if (!input)
+  for (auto _ : state)
     {
-      perror ("calc.input");
-      return 3;
+      input = INPUT;
+      yyparse ();
     }
+}
+BENCHMARK(BM_${prefix});
+EOF
+    }
+  else
+    {
+      print $out <<EOF;
+int
+main (int argc, const char **argv)
+{
+#if YYDEBUG
+  yydebug = !!getenv ("YYDEBUG");
+#endif
 
-  status = yyparse ();
-  if (global_result != result)
-    abort ();
-  if (global_count != count)
-    abort ();
-
-  return status;
+  input = INPUT;
+  yyparse ();
 }
 EOF
+    }
 }
 
 ##################################################################
@@ -586,7 +581,7 @@
     or die;
   print $out <<EOF;
 %language "C++"
-%defines
+%header
 %locations
 $directives
 
@@ -609,10 +604,10 @@
   // Prototype of the yylex function providing subsequent tokens.
   static
 #if USE_TOKEN_CTOR
-  yy::parser::symbol_type yylex();
+  yy::parser::symbol_type yylex ();
 #else
-  yy::parser::token_type yylex(yy::parser::semantic_type* yylvalp,
-                               yy::parser::location_type* yyllocp);
+  yy::parser::token_type yylex (yy::parser::semantic_type *yylvalp,
+                                yy::parser::location_type *yyllocp);
 #endif
 
   // Conversion to string.
@@ -635,8 +630,8 @@
       print $out <<'EOF';
 %token <std::string> TEXT
 %token <int> NUMBER
-%printer { std::cerr << "Number: " << $$; } <int>
-%printer { std::cerr << "Text: " << $$; } <std::string>
+%printer { yyo << "Number: " << $$; } <int>
+%printer { yyo << "Text: " << $$; } <std::string>
 %type <std::string> text result
 
 %%
@@ -658,8 +653,8 @@
 %union {int ival; std::string* sval;}
 %token <sval> TEXT
 %token <ival> NUMBER
-%printer { std::cerr << "Number: " << $$; } <ival>
-%printer { std::cerr << "Text: " << *$$; } <sval>
+%printer { yyo << "Number: " << $$; } <ival>
+%printer { yyo << "Text: " << *$$; } <sval>
 %type <sval> text result
 
 %%
@@ -681,10 +676,10 @@
 
 static
 #if USE_TOKEN_CTOR
-yy::parser::symbol_type yylex()
+yy::parser::symbol_type yylex ()
 #else
-yy::parser::token_type yylex(yy::parser::semantic_type* yylvalp,
-                             yy::parser::location_type* yyllocp)
+yy::parser::token_type yylex (yy::parser::semantic_type *yylvalp,
+                              yy::parser::location_type *yyllocp)
 #endif
 {
   typedef yy::parser::location_type location_type;
@@ -793,61 +788,124 @@
 
 ##################################################################
 
-=item C<compile ($base)>
+=item C<language ($base)>
 
-Compile C<$base.y> to an executable C, Using the C or C++ compiler
-depending on the %language specification in C<$base.y>.
+The language to use depending on the %language specification in
+C<$base.y>: C<c> or C<c++>.
 
 =cut
 
-sub compile ($)
+sub language ($)
 {
   my ($base) = @_;
-  my $language = `sed -ne '/%language "\\(.*\\)"/{s//\\1/;p;q;}' $base.y`;
-  chomp $language;
+  if ($gbench)
+    {
+      "c++";
+    }
+  else
+    {
+      my $language = `sed -ne '/%language "\\(.*\\)"/{s//\\1/;p;q;}' $base.y`;
+      chomp $language;
+      $language eq 'C++' ? "c++" : "c";
+    }
+}
 
-  my $compiler = $language eq 'C++' ? $cxx : $cc;
+##################################################################
 
-  my $my_bison = `sed -ne '/%bison "\\(.*\\)"/{s//\\1/;p;q;}' $base.y`;
-  run ((length $my_bison ? $my_bison : $bison) . " $base.y -o $base.c");
-  run "$compiler -o $base $cflags $base.c";
+=item C<compiler ($base)>
+
+The compiler to use depending on the %language specification in
+C<$base.y>.
+
+=cut
+
+sub compiler ($)
+{
+  my ($base) = @_;
+  my %compiler =
+    (
+      'c++' => $cxx,
+      'c'   => $cc,
+    );
+  $compiler{language ($base)};
+}
+
+##################################################################
+
+=item C<compile ($base)>
+
+Compile C<$base.y> to an executable.
+
+=cut
+
+sub compile ($$)
+{
+  my ($makefile, $base) = @_;
+  my $compiler = compiler ($base);
+
+  my $my_bison = `sed -ne '/[/][/] %bison "\\(.*\\)"/{s//\\1/;p;q;}' $base.y`;
+  chop $my_bison;
+  my %ext =
+    (
+      'c++' => 'cc',
+      'c'   => 'c',
+    );
+  my $ext = $ext{language ($base)};
+  if ($gbench)
+    {
+      print $makefile <<EOF;
+$base.$ext: $base.y
+\t@{[length $my_bison ? $my_bison : $bison]} $base.y -o $base.$ext
+
+$base.o: $base.$ext
+\t$compiler -c -o $base.o $cflags $base.$ext
+EOF
+    }
+  else
+    {
+      print $makefile <<EOF;
+$base.$ext: $base.y
+\t@{[length $my_bison ? $my_bison : $bison]} $base.y -o $base.$ext
+
+$base: $base.$ext
+\t$compiler -o $base $cflags $base.$ext
+EOF
+    }
 }
 
 ######################################################################
 
-=item C<bench ($grammar, @token)>
+=item C<bench_with_timethese ($grammar, @directive)>
 
-Generate benches for the C<$grammar> and the directive specification
-given in the list of C<@token>.
+With Perl's timethese, bench the C<$grammar> and the C<@directive>
+directive list.
 
 =cut
 
-sub bench ($@)
+sub bench_with_timethese ($@)
 {
-  my ($grammar, @token) = @_;
+  my ($grammar, @directive) = @_;
   use Benchmark qw (:all :hireswallclock);
 
-  my @directive = parse (@token);
-
   # Set up the benches as expected by timethese.
   my %bench;
-  # A counter of directive sets.
-  my $count = 1;
-  for my $d (@directive)
+  for my $i (0 .. $#directive)
     {
-      $bench{$count} = $d;
-      printf " %2d. %s\n", $count, join (' ', split ("\n", $d));
-      $count++;
+      my $base = "y$i";
+      $bench{$base} = $directive[$i];
+      printf " %2d. %s\n", $i, join (' ', split ("\n", $directive[$i]));
     };
 
   # For each bench, capture the size.
   my %size;
 
+  my $makefile = new IO::File ">Makefile";
   while (my ($name, $directives) = each %bench)
     {
       generate_grammar ($grammar, $name, $directives);
       # Compile the executable.
-      compile ($name);
+      compile ($makefile, $name);
+      run "make $name";
       $bench{$name} = "system ('./$name');";
       chop($size{$name} = `wc -c <$name`);
     }
@@ -885,6 +943,91 @@
 
 ######################################################################
 
+=item C<bench_with_gbenchmark ($grammar, @directive)>
+
+With Google Benchmark, bench the C<$grammar> and the C<@directive>
+directive list.
+
+=cut
+
+sub bench_with_gbenchmark ($@)
+{
+  my ($grammar, @directive) = @_;
+  my $compiler = compiler ("y0");
+
+  my $readme = new IO::File ">README.md";
+  print $readme <<EOF;
+compiler: $compiler $cflags
+EOF
+
+  my $makefile = new IO::File ">Makefile";
+  print $makefile <<EOF;
+.PHONY: bench
+bench: main
+\t./main \$(BENCHFLAGS) | tee -a README.md
+
+# Link the bench cases in a different order to run the bench case in a
+# different order.
+.PHONY: rand
+rand:
+\t-rm main
+\tmake bench OBJECTS="\$\$(shuf -e \$(OBJECTS) | xargs)"
+EOF
+
+  my @obj = ();
+  for my $i (0 .. $#directive)
+    {
+      my $base = "y$i";
+      my $m = sprintf " %2d. %s\n", $i, join (' ', split ("\n", $directive[$i]));
+      print $m;
+      print $readme $m;
+      generate_grammar ($grammar, $base, $directive[$i]);
+      compile ($makefile, $base);
+      push @obj, "$base.o";
+    }
+
+  my $out = new IO::File ">main.cc";
+  print $out <<EOF;
+#include <benchmark/benchmark.h>
+
+BENCHMARK_MAIN();
+EOF
+
+  print $makefile <<EOF;
+OBJECTS = @{obj}
+main: \$(OBJECTS)
+\t$compiler -o main $cflags main.cc \$(OBJECTS) -lbenchmark
+EOF
+
+  run "make";
+}
+
+######################################################################
+
+=item C<bench ($grammar, @token)>
+
+Generate benches for the C<$grammar> and the directive specification
+given in the list of C<@token>.
+
+=cut
+
+sub bench ($@)
+{
+  my ($grammar, @token) = @_;
+  my @directive = parse (@token);
+
+  if ($gbench)
+    {
+      bench_with_gbenchmark ($grammar, @directive);
+    }
+  else
+    {
+      bench_with_timethese ($grammar, @directive);
+    }
+}
+
+######################################################################
+
 =item C<bench_push_parser ()>
 
 Bench the C push parser against the pull parser, pure and impure
@@ -929,7 +1072,7 @@
 {
   my ($verbose) = @_;
   use Pod::Usage;
-  # See <URL:http://perldoc.perl.org/pod2man.html#NOTES>.
+  # See <URL:https://perldoc.perl.org/pod2man.html#NOTES>.
   pod2usage( { -message => "Bench Bison parsers",
                -exitval => 0,
                -verbose => $verbose,
@@ -949,16 +1092,17 @@
 sub eat ($)
 {
   my ($expected) = @_;
-  die "expected $expected, unexpected: $token[0] (@token)\n"
-    unless $token[0] eq $expected;
+  my $unexpected = $token[0];
+  die "expected $expected, unexpected: $unexpected (@token)\n"
+    unless $token[0] && $token[0] eq $expected;
   shift @token;
 }
 
 # Parse directive specifications:
 #   expr: term (| term)*
 #   term: fact (& fact)*
-#   fact: ( expr ) | [ expr ] | dirs
-#   dirs: %s SKELETON | #d NAME[=VALUE] | %d NAME[=VALUE] | directive
+#   fact: ( expr ) | [ expr ] | dir
+#   dir: %s SKELETON | #d NAME[=VALUE] | %d NAME[=VALUE] | directive
 sub parse (@)
 {
   @token = (@_, $eod);
@@ -971,7 +1115,7 @@
 sub parse_expr ()
 {
   my @res = parse_term ();
-  while ($token[0] eq '|')
+  while ($token[0] && $token[0] eq '|')
     {
       eat ('|');
       # Alternation.
@@ -983,7 +1127,7 @@
 sub parse_term ()
 {
   my @res = parse_fact ();
-  while ($token[0] eq '&')
+  while ($token[0] && $token[0] eq '&')
     {
       eat ('&');
       # Cartesian product.
@@ -1006,13 +1150,13 @@
   die "unexpected end of expression"
     unless defined $token[0];
 
-  if ($token[0] eq '(')
+  if ($token[0] && $token[0] eq '(')
     {
       eat ('(');
       @res = parse_expr ();
       eat (')');
     }
-  elsif ($token[0] eq '[')
+  elsif ($token[0] && $token[0] eq '[')
     {
       eat ('[');
       @res = (parse_expr (), '');
@@ -1020,48 +1164,44 @@
     }
   else
     {
-      @res = parse_dirs ();
+      @res = parse_dir ();
     }
   return @res;
 }
 
-sub parse_dirs ()
+sub parse_dir ()
 {
   my @res;
   die "unexpected end of expression"
-    unless defined $token[0];
+    unless defined $token[0] && $token[0] ne $eod;
 
   if ($token[0] eq '#d')
     {
       eat ('#d');
       $token[0] =~ s/(.*?)=(.*)/$1 $2/;
       @res = ("%code {\n#define $token[0]\n}");
-      shift @token;
     }
   elsif ($token[0] eq '%d')
     {
       shift @token;
-      $token[0] =~ s/(.*?)=(.*)/$1 "$2"/;
+      $token[0] =~ s/(.*?)=(.*)/$1 $2/;
       @res = ("%define $token[0]");
-      shift @token;
     }
   elsif ($token[0] eq '%s')
     {
       shift @token;
       @res = ("%skeleton \"$token[0]\"");
-      shift @token;
     }
   elsif ($token[0] eq '%b')
     {
       shift @token;
-      @res = ("/*\n%bison \"$token[0]\"\\\n*/");
-      shift @token;
+      @res = ("// %bison \"$token[0]\"");
     }
   else
     {
       @res = $token[0];
-      shift @token;
     }
+  shift @token;
 
   return @res;
 }
@@ -1075,6 +1215,7 @@
     "b|bench=s"      => \$bench,
     "c|cflags=s"     => \$cflags,
     "d|directive=s"  => \@directive,
+    "k|gbench"       => \$gbench,
     "g|grammar=s"    => \$grammar,
     "h|help"         => sub { help ($verbose) },
     "i|iterations=i" => \$iterations,
@@ -1084,21 +1225,36 @@
   Getopt::Long::Configure ("bundling", "pass_through");
   GetOptions (%option)
     or exit 1;
+  my %grammars = map { $_ => 1 } qw[calc list triangular];
+  die "invalid grammar: $grammar, valid: @{[keys %grammars]}\n"
+    if !exists($grammars{$grammar});
 }
 
 ######################################################################
 
 getopt;
 
+my $basedir = 'benches';
+
 # Create the directory we work in.
-mkdir "benches" or die "cannot create benches"
-  unless -d "benches";
-my $count = 1;
-++$count
-  while -d "benches/$count";
-my $dir = "benches/$count";
+mkdir $basedir or die "cannot create directory $basedir"
+  unless -d $basedir;
+
+my $count = 0;
+my $dir;
+while (!$dir || -d $dir)
+{
+  ++$count;
+  $dir = sprintf "%s/%03d", $basedir, $count;
+}
 mkdir $dir
-  or die "cannot create $dir";
+  or die "cannot create directory $dir";
+
+unlink "$basedir/latest"
+  or die "cannot unlink $basedir/latest"
+  if -l "$basedir/latest";
+symlink sprintf("%03d", $count), "$basedir/latest"
+  or die "cannot create symlink";
 chdir $dir
   or die "cannot chdir $dir";
 
diff --git a/etc/local.mk b/etc/local.mk
index 0dff151..78c1a98 100644
--- a/etc/local.mk
+++ b/etc/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2006, 2008-2015, 2018-2019 Free Software Foundation,
+## Copyright (C) 2006, 2008-2015, 2018-2021 Free Software Foundation,
 ## Inc.
 
 ## This program is free software: you can redistribute it and/or modify
@@ -12,6 +12,7 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
-nodist_noinst_SCRIPTS = etc/bench.pl
+dist_noinst_DATA = %D%/README.md
+nodist_noinst_SCRIPTS = %D%/bench.pl
diff --git a/examples/README.md b/examples/README.md
index 13b5d5a..cc467dc 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -17,7 +17,7 @@
 ispell-dictionary: "american"
 End:
 
-Copyright (C) 2018-2019 Free Software Foundation, Inc.
+Copyright (C) 2018-2021 Free Software Foundation, Inc.
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.3 or
diff --git a/examples/c++/Makefile b/examples/c++/Makefile
index 47e1fb4..4742fa9 100644
--- a/examples/c++/Makefile
+++ b/examples/c++/Makefile
@@ -11,8 +11,8 @@
 
 all: $(PROGS)
 
-%.cc %.hh: %.yy
-	$(BISON) $(BISONFLAGS) -o $*.cc $<
+%.cc %.hh %.html %.gv: %.yy
+	$(BISON) $(BISONFLAGS) --html --graph -o $*.cc $<
 
 %: %.cc
 	$(CXX) $(CXXFLAGS) -o$@ $<
diff --git a/examples/c++/README.md b/examples/c++/README.md
index 5b6d14c..dff3783 100644
--- a/examples/c++/README.md
+++ b/examples/c++/README.md
@@ -8,13 +8,13 @@
 ## simple.yy - Simple example in C++14
 A very simple example in C++, based on variants and symbol constructors.
 Variants allow to use any C++ type as semantic value type, and symbol
-constructors ensure consistency between declared token type and effective
+constructors ensure consistency between declared token kind and effective
 semantic value.
 
 Run as `./simple`.
 
-Extracted from the documentation: "A Simple C++ Example".
-https://www.gnu.org/software/bison/manual/html_node/A-Simple-C_002b_002b-Example.html
+Extracted from the documentation: [A Simple C++
+Example](https://www.gnu.org/software/bison/manual/html_node/A-Simple-C_002b_002b-Example.html).
 
 ## variant.yy - Self-contained example in C++98
 A variation of simple.yy, in C++98.
@@ -36,8 +36,17 @@
 introductory examples, and the C examples are also useful introductory
 examples.
 
-Extracted from the documentation: "A Complete C++ Example".
-https://www.gnu.org/software/bison/manual/html_node/A-Complete-C_002b_002b-Example.html
+Extracted from the documentation: [A Complete C++
+Example](https://www.gnu.org/software/bison/manual/html_node/A-Complete-C_002b_002b-Example.html).
+
+## glr
+
+This example demonstrates the use of GLR parsers to handle (local)
+ambiguities in the C++ language.  See the node "Merging GLR Parses" in
+Bison's documentation.
+
+It uses (Bison) variants to store objects as semantic values.  It also
+demonstrates custom error messages in C++.
 
 <!---
 
@@ -46,7 +55,7 @@
 ispell-dictionary: "american"
 End:
 
-Copyright (C) 2018-2019 Free Software Foundation, Inc.
+Copyright (C) 2018-2021 Free Software Foundation, Inc.
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.3 or
@@ -55,5 +64,5 @@
 Texts.  A copy of the license is included in the "GNU Free
 Documentation License" file as part of this distribution.
 
-# LocalWords:  mfcalc calc parsers yy ispell american
+LocalWords:  mfcalc calc parsers yy ispell american
 --->
diff --git a/examples/c++/calc++/Makefile b/examples/c++/calc++/Makefile
index a2d83d7..bf57a36 100644
--- a/examples/c++/calc++/Makefile
+++ b/examples/c++/calc++/Makefile
@@ -5,12 +5,11 @@
 BISON = bison
 CXX = g++
 FLEX = flex
-XSLTPROC = xsltproc
 
 all: $(BASE)
 
-%.cc %.hh %.xml %.gv: %.yy
-	$(BISON) $(BISONFLAGS) --xml --graph=$*.gv -o $*.cc $<
+%.cc %.hh %.html %.gv: %.yy
+	$(BISON) $(BISONFLAGS) --html --graph -o $*.cc $<
 
 %.cc: %.ll
 	$(FLEX) $(FLEXFLAGS) -o$@ $<
@@ -29,10 +28,6 @@
 	@echo "Type arithmetic expressions.  Quit with ctrl-d."
 	./$< -
 
-html: parser.html
-%.html: %.xml
-	$(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $$($(BISON) --print-datadir)/xslt/xml2xhtml.xsl $<
-
 CLEANFILES =										\
   $(BASE) *.o										\
   parser.hh parser.cc parser.output parser.xml parser.html parser.gv location.hh	\
diff --git a/examples/c++/calc++/README.md b/examples/c++/calc++/README.md
index 6dd0b3d..6aaebc2 100644
--- a/examples/c++/calc++/README.md
+++ b/examples/c++/calc++/README.md
@@ -5,9 +5,9 @@
 examples/c/lexcalc, which can be seen as a C precursor of this example.
 
 Read the corresponding chapter in the documentation: "A Complete C++
-Example".  It is also available on line (maybe with a different version of
-Bison):
-https://www.gnu.org/software/bison/manual/html_node/A-Complete-C_002b_002b-Example.html
+Example".  It is also available [on
+line](https://www.gnu.org/software/bison/manual/html_node/A-Complete-C_002b_002b-Example.html)
+(maybe with a different version of Bison).
 
 To use it, copy this directory into some work directory, and run `make` to
 compile the executable, and try it.  It is a simple calculator which accepts
@@ -36,22 +36,14 @@
 ispell-dictionary: "american"
 End:
 
-Copyright (C) 2018-2019 Free Software Foundation, Inc.
+Copyright (C) 2018-2021 Free Software Foundation, Inc.
 
-This file is part of Bison, the GNU Compiler Compiler.
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts.  A copy of the license is included in the "GNU Free
+Documentation License" file as part of this distribution.
 
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# LocalWords:  calc parsers yy MERCHANTABILITY Ctrl ispell american
+LocalWords:  calc parsers yy MERCHANTABILITY Ctrl ispell american
 --->
diff --git a/examples/c++/calc++/calc++.cc b/examples/c++/calc++/calc++.cc
index 446d0cb..2673807 100644
--- a/examples/c++/calc++/calc++.cc
+++ b/examples/c++/calc++/calc++.cc
@@ -1,3 +1,22 @@
+/* Main for calc++.   -*- C++ -*-
+
+   Copyright (C) 2005-2015, 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #include <iostream>
 #include "driver.hh"
 
diff --git a/examples/c++/calc++/calc++.test b/examples/c++/calc++/calc++.test
index 8c56266..290e6c2 100755
--- a/examples/c++/calc++/calc++.test
+++ b/examples/c++/calc++/calc++.test
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2005-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2005-2015, 2018-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 cat >input <<EOF
 toto := 1
@@ -45,10 +45,17 @@
 
 
 cat >input <<EOF
+1 +
+EOF
+run 1 'err: -:2.1: syntax error, unexpected end of file, expecting ( or identifier or number'
+
+
+# LAC finds many more tokens.
+cat >input <<EOF
 a := 1
 d := a + b * c
 EOF
-run 1 'err: -:3.1: syntax error, unexpected end of file, expecting ( or identifier or number'
+run 1 'err: -:3.1: syntax error, unexpected end of file'
 
 
 cat >input <<EOF
diff --git a/examples/c++/calc++/driver.cc b/examples/c++/calc++/driver.cc
index b52913e..ece1899 100644
--- a/examples/c++/calc++/driver.cc
+++ b/examples/c++/calc++/driver.cc
@@ -1,3 +1,22 @@
+/* Driver for calc++.   -*- C++ -*-
+
+   Copyright (C) 2005-2015, 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #include "driver.hh"
 #include "parser.hh"
 
diff --git a/examples/c++/calc++/driver.hh b/examples/c++/calc++/driver.hh
index 1cf47f4..b288396 100644
--- a/examples/c++/calc++/driver.hh
+++ b/examples/c++/calc++/driver.hh
@@ -1,3 +1,22 @@
+/* Driver for calc++.   -*- C++ -*-
+
+   Copyright (C) 2005-2015, 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #ifndef DRIVER_HH
 # define DRIVER_HH
 # include <string>
diff --git a/examples/c++/calc++/local.mk b/examples/c++/calc++/local.mk
index 8537389..df3435c 100644
--- a/examples/c++/calc++/local.mk
+++ b/examples/c++/calc++/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2005-2006, 2008-2015, 2018-2019 Free Software
+## Copyright (C) 2005-2006, 2008-2015, 2018-2021 Free Software
 ## Foundation, Inc.
 ##
 ## This program is free software: you can redistribute it and/or modify
@@ -12,13 +12,12 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 ## ------------------- ##
 ## Parser generation.  ##
 ## ------------------- ##
 
-%D%/parser.stamp: $(dependencies)
 SUFFIXES += .yy .stamp
 .yy.stamp:
 	$(AM_V_YACC)rm -f $@
@@ -26,12 +25,13 @@
 	$(AM_V_at)$(YACCCOMPILE) -o $*.cc $<
 	$(AM_V_at)mv -f $@.tmp $@
 
+%D%/parser.stamp: $(dependencies)
 $(calcxx_sources_generated): %D%/parser.stamp
 	@test -f $@ || rm -f %D%/parser.stamp
 	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) %D%/parser.stamp
 CLEANFILES +=					\
   $(calcxx_sources_generated)			\
-  %D%/parser.dot				\
+  %D%/parser.gv					\
   %D%/parser.output				\
   %D%/parser.stamp				\
   %D%/scanner.cc
diff --git a/examples/c++/calc++/parser.yy b/examples/c++/calc++/parser.yy
index 4d1af8d..11da515 100644
--- a/examples/c++/calc++/parser.yy
+++ b/examples/c++/calc++/parser.yy
@@ -1,6 +1,27 @@
-%skeleton "lalr1.cc" /* -*- C++ -*- */
-%require "3.5"
-%defines
+/* Parser for calc++.   -*- C++ -*-
+
+   Copyright (C) 2005-2015, 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+%skeleton "lalr1.cc" // -*- C++ -*-
+%require "3.8.2"
+%header
+
+%define api.token.raw
 
 %define api.token.constructor
 %define api.value.type variant
@@ -17,7 +38,8 @@
 %locations
 
 %define parse.trace
-%define parse.error verbose
+%define parse.error detailed
+%define parse.lac full
 
 %code {
 # include "driver.hh"
@@ -25,7 +47,6 @@
 
 %define api.token.prefix {TOK_}
 %token
-  END  0  "end of file"
   ASSIGN  ":="
   MINUS   "-"
   PLUS    "+"
diff --git a/examples/c++/calc++/scanner.ll b/examples/c++/calc++/scanner.ll
index be8f216..a3dd6d5 100644
--- a/examples/c++/calc++/scanner.ll
+++ b/examples/c++/calc++/scanner.ll
@@ -1,3 +1,22 @@
+/* Scanner for calc++.   -*- C++ -*-
+
+   Copyright (C) 2005-2015, 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 %{ /* -*- C++ -*- */
 # include <cerrno>
 # include <climits>
@@ -24,7 +43,7 @@
 # pragma GCC diagnostic ignored "-Wnull-dereference"
 #endif
 
-// This example uses Flex's C backend, yet compiles it as C++.
+// This example uses Flex's C back end, yet compiles it as C++.
 // So expect warnings about C style casts and NULL.
 #if defined CLANG_VERSION && 500 <= CLANG_VERSION
 # pragma clang diagnostic ignored "-Wold-style-cast"
@@ -69,6 +88,14 @@
 #  pragma GCC diagnostic ignored "-Wsign-conversion"
 # endif
 #endif
+
+// Flex 2.6.4, GCC 9
+// warning: useless cast to type 'int' [-Wuseless-cast]
+// 1361 |   YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
+//      |                                                 ^
+#if defined GCC_VERSION && 900 <= GCC_VERSION
+# pragma GCC diagnostic ignored "-Wuseless-cast"
+#endif
 %}
 
 %option noyywrap nounput noinput batch debug
@@ -111,7 +138,7 @@
              throw yy::parser::syntax_error
                (loc, "invalid character: " + std::string(yytext));
 }
-<<EOF>>    return yy::parser::make_END (loc);
+<<EOF>>    return yy::parser::make_YYEOF (loc);
 %%
 
 yy::parser::symbol_type
@@ -132,7 +159,7 @@
     yyin = stdin;
   else if (!(yyin = fopen (file.c_str (), "r")))
     {
-      std::cerr << "cannot open " << file << ": " << strerror(errno) << '\n';
+      std::cerr << "cannot open " << file << ": " << strerror (errno) << '\n';
       exit (EXIT_FAILURE);
     }
 }
diff --git a/examples/c++/glr/ast.hh b/examples/c++/glr/ast.hh
new file mode 100644
index 0000000..4faa640
--- /dev/null
+++ b/examples/c++/glr/ast.hh
@@ -0,0 +1,173 @@
+/*
+  Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+#include <cstddef> // nullptr_t
+#include <iostream>
+#include <memory>
+
+// Type erasure 101 <https://stackoverflow.com/a/26199467/1353549>.
+class NodeInterface;
+
+class Node
+{
+public:
+  Node (const Node& node) = default;
+  Node (Node&& node) = default;
+  Node () = default;
+  ~Node () = default;
+
+  template <typename T,
+            // SFINAE block using this ctor as a copy/move ctor:
+            std::enable_if_t<!std::is_same<Node, std::decay_t<T>>::value, int>* = nullptr>
+  Node (T&& t);
+
+  Node& operator= (const Node& node) = default;
+  Node& operator= (Node&& node) = default;
+
+  explicit operator bool () const
+  {
+    return impl_ != nullptr;
+  }
+
+  std::ostream& print (std::ostream& o) const;
+
+  std::shared_ptr<NodeInterface> impl_;
+};
+
+static std::ostream&
+operator<< (std::ostream& o, const Node &node)
+{
+  return node.print (o);
+}
+
+class NodeInterface
+{
+public:
+  virtual ~NodeInterface () = default;
+  virtual std::ostream& print (std::ostream& o) const = 0;
+};
+
+
+std::ostream& Node::print (std::ostream& o) const
+{
+  if (impl_)
+    impl_->print (o);
+  return o;
+}
+
+
+template <typename T,
+          std::enable_if_t<!std::is_same<std::nullptr_t, std::decay_t<T>>::value, int>* = nullptr>
+struct NodeImpl : public NodeInterface
+{
+  template <typename U>
+  explicit NodeImpl (U&& u)
+    : t{std::forward<U> (u)}
+  {}
+  virtual ~NodeImpl () = default;
+  virtual std::ostream& print (std::ostream& o) const
+  {
+    return o << t;
+  }
+
+  T t;
+};
+
+
+template <typename T,
+          std::enable_if_t<!std::is_same<Node, std::decay_t<T>>::value, int>*>
+Node::Node (T&& t)
+  : impl_ (new NodeImpl<std::decay_t<T>>{std::forward<T> (t)})
+{}
+
+class Nterm
+{
+public:
+  Nterm (std::string form,
+         Node child0 = Node (), Node child1 = Node (), Node child2 = Node ())
+    : form_ (std::move (form))
+  {
+    children_[0] = child0;
+    children_[1] = child1;
+    children_[2] = child2;
+  }
+
+  friend std::ostream& operator<< (std::ostream& o, const Nterm& t)
+  {
+    o << t.form_;
+    if (t.children_[0])
+      {
+        o << '(' << t.children_[0];
+        if (t.children_[1])
+          o << ", " << t.children_[1];
+        if (t.children_[2])
+          o << ", " << t.children_[2];
+        o << ')';
+      }
+    return o;
+  }
+
+private:
+  std::string form_;
+  Node children_[3];
+};
+
+
+
+class Term
+{
+public:
+  Term (std::string text)
+    : text_ (std::move (text))
+  {}
+
+  friend std::ostream& operator<< (std::ostream& o, const Term& t)
+  {
+    return o << t.text_;
+  }
+
+private:
+  std::string text_;
+};
+
+#ifdef TEST
+int main ()
+{
+  Node n0;
+  std::cout << n0 << '\n';
+
+  Node n;
+  n = n0;
+  std::cout << n0 << '\n';
+
+  Term t1 = Term ("T");
+  std::cout << t1 << '\n';
+
+  n = t1;
+  std::cout << n << '\n';
+  std::cout << Nterm ("+", t1, t1) << '\n';
+
+  auto n1
+    = Nterm ("<OR>",
+             Nterm ("<declare>", Term ("T"), Term ("x")),
+             Nterm ("<cast>", Term ("x"), Term ("T")));
+  std::cout << n1 << '\n';
+
+  n = n1;
+  std::cout << n1 << '\n';
+}
+#endif
diff --git a/examples/c++/glr/c++-types.test b/examples/c++/glr/c++-types.test
new file mode 100644
index 0000000..db5be8d
--- /dev/null
+++ b/examples/c++/glr/c++-types.test
@@ -0,0 +1,50 @@
+#! /bin/sh
+
+# Copyright (C) 2020-2021 Free Software Foundation, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+cat >input <<EOF
+z + q;
+
+T x;
+
+T x = y;
+
+x = y;
+EOF
+run 0 "\
+1.0-5: +(z, q)
+3.0-3: <declare>(T, x)
+5.0-7: <init-declare>(T, x, y)
+7.0-5: =(x, y)"
+
+cat >input <<EOF
+T (x) + y;
+
+T (x);
+
+T (y) = z + q;
+
+T (y y) = z + q;
+
+z + q;
+EOF
+run 0 "\
+1.0-9: +(<cast>(x, T), y)
+3.0-5: <OR>(<declare>(T, x), <cast>(x, T))
+5.0-13: <OR>(<init-declare>(T, y, +(z, q)), =(<cast>(y, T), +(z, q)))
+7.0-15: <error>
+9.0-5: +(z, q)
+err: 7.5: syntax error on token identifier (expected = or + or ))"
diff --git a/examples/c++/glr/c++-types.yy b/examples/c++/glr/c++-types.yy
new file mode 100644
index 0000000..a3131b0
--- /dev/null
+++ b/examples/c++/glr/c++-types.yy
@@ -0,0 +1,257 @@
+/*                                                       -*- C++ -*-
+  Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+/* Simplified C++ Type and Expression Grammar.
+   Written by Paul Hilfinger for Bison's test suite.  */
+
+%require "3.8"
+%glr-parser
+%skeleton "glr2.cc"
+%define parse.assert
+%define api.token.constructor
+%header
+%locations
+%debug
+
+// Custom error messages.
+%define parse.error custom
+
+%code requires
+{
+  #include "ast.hh"
+}
+
+%define api.value.type variant
+
+%code
+{
+  #include <cassert>
+  #include <cctype>
+  #include <fstream>
+  #include <cstring>
+
+  // Merge two semantic values.
+  static Node
+  stmt_merge (const Node& x0, const Node& x1);
+
+  // Fetch a token.
+  static yy::parser::symbol_type
+  yylex ();
+}
+
+%expect-rr 1
+
+%type <Node> TYPENAME ID stmt expr decl declarator
+%printer { yyo << $$; } <Node>
+
+%token
+  TYPENAME  "typename"
+  ID        "identifier"
+  SEMICOLON ";"
+  EQUAL     "="
+  PLUS      "+"
+  LPAREN    "("
+  RPAREN    ")"
+
+%right "="
+%left "+"
+
+%%
+
+prog : %empty
+     | prog stmt   { std::cout << @2 << ": " << $2 << '\n'; }
+     ;
+
+stmt : expr ";"  %merge <stmt_merge>   { $$ = $1; }
+     | decl      %merge <stmt_merge>
+     | error ";"                       { $$ = Nterm ("<error>"); }
+     ;
+
+expr : ID
+     | TYPENAME "(" expr ")"  { $$ = Nterm ("<cast>", $3, $1); }
+     | expr "+" expr          { $$ = Nterm ("+", $1, $3); }
+     | expr "=" expr          { $$ = Nterm ("=", $1, $3); }
+     ;
+
+decl : TYPENAME declarator ";"
+                        { $$ = Nterm ("<declare>", $1, $2); }
+     | TYPENAME declarator "=" expr ";"
+                        { $$ = Nterm ("<init-declare>", $1, $2, $4); }
+     ;
+
+declarator
+     : ID
+     | "(" declarator ")" { $$ = $2; }
+     ;
+
+%%
+std::istream* input = nullptr;
+yy::parser::location_type loc;
+
+
+/*---------.
+| Parser.  |
+`---------*/
+
+// Generate a custom error message.
+void
+yy::parser::report_syntax_error (const context& ctx) const
+{
+  std::cerr << ctx.location () << ": syntax error";
+  if (!ctx.lookahead ().empty ())
+    std::cerr << " on token " << ctx.lookahead ().name ();
+  {
+    enum { TOKENMAX = 10 };
+    symbol_kind_type expected[TOKENMAX];
+    int n = ctx.expected_tokens (expected, TOKENMAX);
+    if (0 < n)
+      {
+        for (int i = 0; i < n; ++i)
+          std::cerr << (i == 0 ? " (expected " : " or ")
+                    << symbol_name (expected[i]);
+        std::cerr << ')';
+      }
+  }
+  std::cerr << '\n';
+}
+
+// Report the error to the user.
+void
+yy::parser::error (const location_type& l, const std::string& m)
+{
+  std::cerr << l << ": " << m << '\n';
+}
+
+// Fetch the next token.
+static yy::parser::symbol_type
+yylex ()
+{
+  while (true)
+    {
+      loc.step ();
+      loc += 1;
+      assert (!input->eof ());
+      switch (int c = input->get ())
+        {
+        case EOF:
+          return yy::parser::make_YYEOF (loc);
+        case '\t':
+          loc.end.column = (loc.end.column + 7) & ~7;
+          loc.step ();
+          break;
+        case ' ': case '\f':
+          loc.step ();
+          break;
+        case '\n':
+          loc.lines (1);
+          loc.end.column = 0;
+          loc.step ();
+          break;
+        case '+':
+          return yy::parser::make_PLUS (loc);
+        case '=':
+          return yy::parser::make_EQUAL (loc);
+        case '(':
+          return yy::parser::make_LPAREN (loc);
+        case ')':
+          return yy::parser::make_RPAREN (loc);
+        case ';':
+          return yy::parser::make_SEMICOLON (loc);
+        default:
+          if (isalpha (c))
+            {
+              std::string form;
+              do
+                {
+                  form += static_cast<char> (c);
+                  loc += 1;
+                  c = input->get ();
+                }
+              while (isalnum (c) || c == '_');
+              input->unget ();
+              loc -= 1;
+              if (isupper (static_cast <unsigned char> (form[0])))
+                return yy::parser::make_TYPENAME (Term (form), loc);
+              else
+                return yy::parser::make_ID (Term (form), loc);
+            }
+          else
+            {
+              auto msg = "invalid character: " + std::string(1, static_cast<char> (c));
+              throw yy::parser::syntax_error (loc, msg);
+            }
+        }
+    }
+}
+
+// Merge two semantic values as an AST including both alternatives.
+static Node
+stmt_merge (const Node& x0, const Node& x1)
+{
+  return Nterm ("<OR>", x0, x1);
+}
+
+
+/*-------.
+| Main.  |
+`-------*/
+
+// Parse `file` using parser `parse`.
+int
+process (yy::parser& parse, const std::string& file)
+{
+  bool is_stdin = file == "-" || file.empty ();
+  if (is_stdin)
+    input = &std::cin;
+  else
+    input = new std::ifstream (file.c_str ());
+  loc.initialize (nullptr, 1, 0);
+  int status = parse ();
+  if (!is_stdin)
+    delete input;
+  return status;
+}
+
+int
+main (int argc, char **argv)
+{
+  yy::parser parse;
+
+  if (getenv ("YYDEBUG"))
+    parse.set_debug_level (1);
+
+  bool ran = false;
+  for (int i = 1; i < argc; ++i)
+    // Enable parse traces on option -p.
+    if (strcmp (argv[i], "-p") == 0)
+      parse.set_debug_level (1);
+    else
+      {
+        int status = process (parse, argv[i]);
+        ran = true;
+        if (!status)
+          return status;
+      }
+
+  if (!ran)
+    {
+      int status = process (parse, "");
+      if (!status)
+        return status;
+    }
+  return 0;
+}
diff --git a/examples/c++/glr/local.mk b/examples/c++/glr/local.mk
new file mode 100644
index 0000000..137d1ab
--- /dev/null
+++ b/examples/c++/glr/local.mk
@@ -0,0 +1,52 @@
+## Copyright (C) 2020-2021 Free Software Foundation, Inc.
+##
+## This program is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+glrxxdir = $(docdir)/%D%
+
+## ----------- ##
+## c++-types.  ##
+## ----------- ##
+
+%D%/c++-types.stamp: $(dependencies)
+$(nodist_%C%_c___types_SOURCES): %D%/c++-types.stamp
+	@test -f $@ || rm -f %D%/c++-types.stamp
+	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) %D%/c++-types.stamp
+CLEANFILES +=					\
+  $(nodist_%C%_c___types_SOURCES)		\
+  %D%/c++-types.stamp				\
+  %D%/c++-types.output				\
+  %D%/location.hh
+CLEANDIRS += %D%/*.dSYM
+
+## -------------------- ##
+## Building & testing.  ##
+## -------------------- ##
+
+# Avoid using BUILT_SOURCES which is too global.
+$(%C%_c___types_OBJECTS): $(cxx_types_sources_generated)
+
+if ENABLE_CXX14
+  check_PROGRAMS += %D%/c++-types
+  dist_%C%_c___types_SOURCES =			\
+    %D%/ast.hh
+  nodist_%C%_c___types_SOURCES =		\
+    %D%/c++-types.cc				\
+    %D%/c++-types.hh
+  # Don't use gnulib's system headers.
+  %C%_c___types_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
+  %C%_c___types_CXXFLAGS = $(CXX14_CXXFLAGS) $(WARN_CXXFLAGS_TEST)
+  TESTS += %D%/c++-types.test
+endif ENABLE_CXX14
+EXTRA_DIST += %D%/c++-types.yy %D%/c++-types.test
diff --git a/examples/c++/local.mk b/examples/c++/local.mk
index 3bf52dc..db1459d 100644
--- a/examples/c++/local.mk
+++ b/examples/c++/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2018-2019 Free Software Foundation, Inc.
+## Copyright (C) 2018-2021 Free Software Foundation, Inc.
 ##
 ## This program is free software: you can redistribute it and/or modify
 ## it under the terms of the GNU General Public License as published by
@@ -11,10 +11,11 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 cxxdir = $(docdir)/%D%
 include %D%/calc++/local.mk
+include %D%/glr/local.mk
 
 ## -------- ##
 ## Simple.  ##
@@ -29,7 +30,7 @@
 simple_sources = $(simple_extracted)
 extracted += $(simple_extracted)
 
-if ENABLE_CXX14
+if ENABLE_CXX11
   check_PROGRAMS += %D%/simple
   nodist_%C%_simple_SOURCES = $(simple_sources)
 
diff --git a/examples/c++/simple.yy b/examples/c++/simple.yy
index 169f3b9..0ef1dcc 100644
--- a/examples/c++/simple.yy
+++ b/examples/c++/simple.yy
@@ -1,3 +1,22 @@
+/* Simple variant-based parser.   -*- C++ -*-
+
+   Copyright (C) 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 %require "3.2"
 %language "c++"
 
@@ -23,8 +42,6 @@
 
 %define api.token.constructor
 
-%token END_OF_FILE 0
-
 %code
 {
   namespace yy
@@ -42,7 +59,7 @@
         case 4:
           return parser::make_TEXT ("And that's all!");
         default:
-          return parser::make_END_OF_FILE ();
+          return parser::make_YYEOF ();
         }
     }
   }
diff --git a/examples/c++/variant-11.test b/examples/c++/variant-11.test
index d03c193..9d9666f 100644
--- a/examples/c++/variant-11.test
+++ b/examples/c++/variant-11.test
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2018-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 : >input
 run 0 "{I have numbers for you., 1, 2, 3, And that's all!}" 4
diff --git a/examples/c++/variant-11.yy b/examples/c++/variant-11.yy
index 72687af..edbcff8 100644
--- a/examples/c++/variant-11.yy
+++ b/examples/c++/variant-11.yy
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2008-2015, 2018-2019 Free Software Foundation, Inc.
+  Copyright (C) 2008-2015, 2018-2021 Free Software Foundation, Inc.
 
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -12,7 +12,7 @@
   GNU General Public License for more details.
 
   You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
 %require "3.2"
@@ -139,7 +139,7 @@
 int
 main (int argc, const char *argv[])
 {
-  if (2 <= argc && isdigit (*argv[1]))
+  if (2 <= argc && isdigit (static_cast<unsigned char> (*argv[1])))
     {
       auto maxl = strtol (argv[1], nullptr, 10);
       max = INT_MIN <= maxl && maxl <= INT_MAX ? int(maxl) : 4;
diff --git a/examples/c++/variant.test b/examples/c++/variant.test
index 65e686c..344313a 100644
--- a/examples/c++/variant.test
+++ b/examples/c++/variant.test
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2018-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 : >input
 run 0 "{I have three numbers for you., 1, 2, 3, And that's all!}"
diff --git a/examples/c++/variant.yy b/examples/c++/variant.yy
index df955ce..8dcab48 100644
--- a/examples/c++/variant.yy
+++ b/examples/c++/variant.yy
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2008-2015, 2018-2019 Free Software Foundation, Inc.
+  Copyright (C) 2008-2015, 2018-2021 Free Software Foundation, Inc.
 
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -12,7 +12,7 @@
   GNU General Public License for more details.
 
   You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
 %require "3.2"
diff --git a/examples/c/README.md b/examples/c/README.md
index 46f4563..a7561c6 100644
--- a/examples/c/README.md
+++ b/examples/c/README.md
@@ -10,8 +10,8 @@
 Notation calculator (a calculator using postfix operators). This example
 provides a good starting point, since operator precedence is not an issue.
 
-Extracted from the documentation: "Reverse Polish Notation Calculator"
-https://www.gnu.org/software/bison/manual/html_node/RPN-Calc.html
+Extracted from the documentation: [Reverse Polish Notation
+Calculator](https://www.gnu.org/software/bison/manual/html_node/RPN-Calc.html).
 
 ## calc - Simple Calculator
 This example is slightly more complex than rpcalc: it features infix
@@ -24,19 +24,55 @@
 the previous example.  Using precedence directives to support infix
 operators.
 
-Extracted from the documentation: "Multi-Function Calculator: mfcalc".
-https://www.gnu.org/software/bison/manual/html_node/Multi_002dfunction-Calc.html
+Extracted from the documentation: [Multi-Function Calculator:
+mfcalc](https://www.gnu.org/software/bison/manual/html_node/Multi_002dfunction-Calc.html).
 
 ## lexcalc - calculator with Flex and Bison
-The calculator, redux.  This time using a scanner generated by Flex.
+The calculator with precedence directives and location tracking.  It uses
+Flex to generate the scanner.
 
 ## reccalc - recursive calculator with Flex and Bison
-The example builds on top of the previous one to provide a reentrant parser.
-Such parsers can be called concurrently in different threads, or even
-recursively.  To demonstrate this feature, expressions in parentheses are
-tokenized as strings, and then recursively parsed from the parser.  So
+This example builds on top of the previous one to provide a reentrant
+parser.  Such parsers can be called concurrently in different threads, or
+even recursively.  To demonstrate this feature, expressions in parentheses
+are tokenized as strings, and then recursively parsed from the parser.  So
 `(((1)+(2))*((3)+(4)))` uses eight parsers, with a depth of four.
 
+## pushcalc - calculator implemented with a push parser
+All the previous examples are so called "pull parsers": the user invokes the
+parser once, which repeatedly calls the scanner until the input is drained.
+
+This example demonstrates the "push parsers": the user calls the scanner to
+fetch the next token, passes it to the parser, and repeats the operation
+until the input is drained.
+
+This example is a straightforward conversion of the 'calc' example to the
+push-parser model.
+
+## bistromathic - all the bells and whistles
+This example demonstrates best practices when using Bison.
+- Its hand-written scanner tracks locations.
+- Its interface is pure.
+- It uses %params to pass user information to the parser and scanner.
+- Its scanner uses the `error` token to signal lexical errors and enter
+  error recovery.
+- Its interface is "incremental", well suited for interaction: it uses the
+  push-parser API to feed the parser with the incoming tokens.
+- It features an interactive command line with completion based on the
+  parser state, based on `yyexpected_tokens`.
+- It uses Bison's standard catalog for internationalization of generated
+  messages.
+- It uses a custom syntax error with location, lookahead correction and
+  token internationalization.
+- Error messages quote the source with squiggles that underline the error:
+```
+> 123 456
+1.5-7: syntax error: expected end of file or + or - or * or / or ^ before number
+    1 | 123 456
+      |     ^~~
+```
+- It supports debug traces with semantic values.
+- It uses named references instead of the traditional $1, $2, etc.
 
 <!---
 
@@ -45,7 +81,9 @@
 ispell-dictionary: "american"
 End:
 
-Copyright (C) 2018-2019 Free Software Foundation, Inc.
+Copyright (C) 2018-2021 Free Software Foundation, Inc.
+
+This file is part of GNU bison, the GNU Compiler Compiler.
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.3 or
@@ -54,6 +92,8 @@
 Texts.  A copy of the license is included in the "GNU Free
 Documentation License" file as part of this distribution.
 
-# LocalWords:  mfcalc calc parsers yy rpcalc lexcalc redux reccalc ispell
-# LocalWords:  reentrant tokenized american postfix
---->
+LocalWords:  mfcalc calc parsers yy rpcalc lexcalc redux reccalc ispell
+LocalWords:  reentrant tokenized american postfix pushcalc bistromathic
+LocalWords:  lookahead
+
+-->
diff --git a/examples/c/bistromathic/Makefile b/examples/c/bistromathic/Makefile
new file mode 100644
index 0000000..0e61ce6
--- /dev/null
+++ b/examples/c/bistromathic/Makefile
@@ -0,0 +1,35 @@
+# This Makefile is designed to be simple and readable.  It does not
+# aim at portability.  It requires GNU Make.
+
+BASE = bistromathic
+BISON = bison
+
+# We need to find the headers and libs for readline (and possibly intl).
+# You probably need to customize this for your own environment.
+CPPFLAGS = -I/opt/local/include
+LDFLAGS = -L/opt/local/lib
+
+# Find the translation catalog for Bison's generated messagess.
+BISON_LOCALEDIR = $(shell $(BISON) $(BISON_FLAGS) --print-localedir)
+CPPFLAGS += -DENABLE_NLS -DBISON_LOCALEDIR='"$(BISON_LOCALEDIR)"'
+
+LIBS = -lreadline -lm # In some environments, -lintl is needed.
+
+all: $(BASE)
+
+%.c %.h %.html %.xml %.gv: %.y
+	$(BISON) $(BISONFLAGS) --header --html --graph -o $*.c $<
+
+$(BASE): parse.o
+	$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS)
+
+run: $(BASE)
+	@echo "Type bistromathic expressions.  Quit with ctrl-d."
+	./$<
+
+CLEANFILES =						\
+  $(BASE) *.o						\
+  parse.[ch] parse.output parse.xml parse.html parse.gv
+
+clean:
+	rm -f $(CLEANFILES)
diff --git a/examples/c/bistromathic/README.md b/examples/c/bistromathic/README.md
new file mode 100644
index 0000000..8528e0b
--- /dev/null
+++ b/examples/c/bistromathic/README.md
@@ -0,0 +1,49 @@
+# bistromathic - all the bells and whistles
+This example demonstrates best practices when using Bison.
+- Its hand-written scanner tracks locations.
+- Its interface is pure.
+- It uses %params to pass user information to the parser and scanner.
+- Its scanner uses the `error` token to signal lexical errors and enter
+  error recovery.
+- Its interface is "incremental", well suited for interaction: it uses the
+  push-parser API to feed the parser with the incoming tokens.
+- It features an interactive command line with completion based on the
+  parser state, based on `yyexpected_tokens`.
+- It uses Bison's standard catalog for internationalization of generated
+  messages.
+- It uses a custom syntax error with location, lookahead correction and
+  token internationalization.
+- Error messages quote the source with squiggles that underline the error:
+```
+> 123 456
+1.5-7: syntax error: expected end of file or + or - or * or / or ^ before number
+    1 | 123 456
+      |     ^~~
+```
+- It supports debug traces with semantic values.
+- It uses named references instead of the traditional $1, $2, etc.
+
+To customize the interaction with bistromathic, see the GNU Readline user
+manual (see `info rluserman`).
+
+<!---
+Local Variables:
+fill-column: 76
+ispell-dictionary: "american"
+End:
+
+Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+This file is part of Bison, the GNU Compiler Compiler.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts.  A copy of the license is included in the "GNU Free
+Documentation License" file as part of this distribution.
+
+LocalWords:  bistromathic yyexpected lookahead ispell american
+LocalWords:  MERCHANTABILITY
+
+--->
diff --git a/examples/c/bistromathic/bistromathic.test b/examples/c/bistromathic/bistromathic.test
new file mode 100755
index 0000000..2db5dcf
--- /dev/null
+++ b/examples/c/bistromathic/bistromathic.test
@@ -0,0 +1,368 @@
+#! /bin/sh
+
+# Copyright (C) 2020-2021 Free Software Foundation, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# Users may customize the behavior of readline, which might break our
+# expected results.
+INPUTRC=/dev/null
+export INPUTRC
+
+# Beware of portability issues of readline when not feeding it from a
+# terminal.
+#
+# With recent versions of GNU Readline, input "1+2*3\n" gives
+# "> 1+2*3\n7\n> \n"
+#
+# macOS' version does not display the prompt and does not repeat stdin
+# on stdout, so input "1+2*3\n" gives "7\n" as output.  Let's try to
+# cope with this.
+#
+# On OpenBSD 6.5 the prompt is displayed, but the input is not
+# repeated (!).  So input "1+2*3\n" gives "> 7\n> \n" as output.
+#
+# On AIX, you get some escaping sequence before the prompt:
+# "<ESC>[?1034h> 1+2*3".  It appears to pass the terminfo capability
+# "smm", to put the terminal in "meta mode": as if the user had hit
+# META.
+
+echo >perfect '> 0
+0
+> '
+
+echo >ok '0'
+echo '0' | prog >effective
+
+echo "checking for readline output..."
+if diff perfect effective; then
+    # Alles ist gut.
+    strip_prompt=false
+elif diff ok effective; then
+    strip_prompt=true
+else
+    skip "this is not the GNU Readline we expect"
+fi
+
+
+cat >input <<EOF
+1+2*3
+EOF
+run 0 '> 1+2*3
+7
+> '
+
+cat >input <<EOF
+(1+2) * 3
+EOF
+run 0  '> (1+2) * 3
+9
+> '
+run -noerr 0 '> (1+2) * 3
+9
+> ' -p
+
+cat >input <<EOF
+a = 256
+sqrt (a)
+EOF
+run 0 '> a = 256
+256
+> sqrt (a)
+16
+> '
+
+cat >input <<EOF
+a = .16
+b = 10 ^ 2
+sqrt (a * b)
+EOF
+run 0 '> a = .16
+0.16
+> b = 10 ^ 2
+100
+> sqrt (a * b)
+4
+> '
+
+cat >input <<EOF
+*
+EOF
+run 0 '> *
+> ''
+err: 1.1: syntax error: expected end of file or - or ( or exit or number or function etc., before *
+err:     1 | *
+err:       | ^'
+
+# Underline long errors.
+cat >input <<EOF
+123 123456
+EOF
+run 0 '> 123 123456
+> ''
+err: 1.5-10: syntax error: expected end of file or + or - or * or / or ^ before number
+err:     1 | 123 123456
+err:       |     ^~~~~~'
+
+cat >input <<EOF
+1 + 2 * * 3
+EOF
+run 0 '> 1 + 2 * * 3
+> ''
+err: 1.9: syntax error: expected - or ( or number or function or variable before *
+err:     1 | 1 + 2 * * 3
+err:       |         ^'
+
+cat >input <<EOF
+1 / 0
+EOF
+run 0 '> 1 / 0
+> ''
+err: 1.1-5: error: division by zero'
+
+
+## ---------------- ##
+## Error recovery.  ##
+## ---------------- ##
+
+cat >input <<EOF
+((1 ++ 2) ** 3)
+(1 ++ 2) + (3 ** 4)
+EOF
+run 0 '> ((1 ++ 2) ** 3)
+666
+> (1 ++ 2) + (3 ** 4)
+1332
+> ''
+err: 1.6: syntax error: expected - or ( or number or function or variable before +
+err:     1 | ((1 ++ 2) ** 3)
+err:       |      ^
+err: 2.5: syntax error: expected - or ( or number or function or variable before +
+err:     2 | (1 ++ 2) + (3 ** 4)
+err:       |     ^
+err: 2.16: syntax error: expected - or ( or number or function or variable before *
+err:     2 | (1 ++ 2) + (3 ** 4)
+err:       |                ^'
+
+# The rule "( error )" should work even if there are no tokens between "(" and ")".
+cat >input <<EOF
+()
+EOF
+run 0 '> ()
+666
+> ''
+err: 1.2: syntax error: expected - or ( or number or function or variable before )
+err:     1 | ()
+err:       |  ^'
+
+
+cat >input <<EOF
+100% + 10
+EOF
+run 0 '> 100% + 10
+> ''
+err: 1.4: syntax error: invalid character: %'
+
+# Traces.  This allows to check the location of the error.  If we
+# forget to map YYerror to YYUNDEF, error recovery enters an endless
+# loop with this input.
+cat >input <<EOF
+(+_)
+EOF
+run 0 '> (+_)
+666
+> ''
+err: Starting parse
+err: Entering state 0
+err: Stack now 0
+err: Reading a token
+err: Next token is token ( (1.1: )
+err: Shifting token ( (1.1: )
+err: Entering state 2
+err: Stack now 0 2
+err: Return for a new token:
+err: Reading a token
+err: Next token is token + (1.2: )
+err: LAC: initial context established for +
+err: LAC: checking lookahead +: Err
+err: LAC: checking lookahead end of file: Err
+err: LAC: checking lookahead +: Err
+err: LAC: checking lookahead -: S1
+err: LAC: checking lookahead *: Err
+err: LAC: checking lookahead /: Err
+err: LAC: checking lookahead ^: Err
+err: LAC: checking lookahead (: S2
+err: LAC: checking lookahead ): Err
+err: LAC: checking lookahead =: Err
+err: LAC: checking lookahead exit: Err
+err: LAC: checking lookahead number: S4
+err: LAC: checking lookahead function: S5
+err: LAC: checking lookahead variable: S6
+err: LAC: checking lookahead NEG: Err
+err: 1.2: syntax error: expected - or ( or number or function or variable before +
+err:     1 | (+_)
+err:       |  ^
+err: LAC: initial context discarded due to error recovery
+err: Shifting token error (1.2: )
+err: Entering state 10
+err: Stack now 0 2 10
+err: Next token is token + (1.2: )
+err: LAC: initial context established for +
+err: LAC: checking lookahead +: Err
+err: Error: discarding token + (1.2: )
+err: Error: popping token error (1.2: )
+err: Stack now 0 2
+err: LAC: initial context discarded due to error recovery
+err: Shifting token error (1.2: )
+err: Entering state 10
+err: Stack now 0 2 10
+err: Return for a new token:
+err: 1.3: syntax error: invalid character: _
+err: Reading a token
+err: Error: popping token error (1.2: )
+err: Stack now 0 2
+err: Shifting token error (1.2-3: )
+err: Entering state 10
+err: Stack now 0 2 10
+err: Next token is token invalid token (1.3: )
+err: LAC: initial context established for invalid token
+err: LAC: checking lookahead invalid token: Always Err
+err: Error: discarding token invalid token (1.3: )
+err: Error: popping token error (1.2-3: )
+err: Stack now 0 2
+err: LAC: initial context discarded due to error recovery
+err: Shifting token error (1.2-3: )
+err: Entering state 10
+err: Stack now 0 2 10
+err: Return for a new token:
+err: Reading a token
+err: Next token is token ) (1.4: )
+err: Shifting token ) (1.4: )
+err: Entering state 20
+err: Stack now 0 2 10 20
+err: Reducing stack by rule XX (line XXX):
+err:    $1 = token ( (1.1: )
+err:    $2 = token error (1.2-3: )
+err:    $3 = token ) (1.4: )
+err: -> $$ = nterm exp (1.1-4: 666)
+err: Entering state 8
+err: Stack now 0 8
+err: Return for a new token:
+err: Reading a token
+err: Now at end of input.
+err: LAC: initial context established for end of file
+err: LAC: checking lookahead end of file: R2 G7 S14
+err: Reducing stack by rule XX (line XXX):
+err:    $1 = nterm exp (1.1-4: 666)
+err: -> $$ = nterm input (1.1-4: )
+err: Entering state 7
+err: Stack now 0 7
+err: Now at end of input.
+err: Shifting token end of file (1.5: )
+err: LAC: initial context discarded due to shift
+err: Entering state 14
+err: Stack now 0 7 14
+err: Stack now 0 7 14
+err: Cleanup: popping token end of file (1.5: )
+err: Cleanup: popping nterm input (1.1-4: )' -p
+
+
+
+## ------------ ##
+## Completion.  ##
+## ------------ ##
+
+# From now on, the differences between versions of GNU Readline are
+# too painful to try to cope with.
+if $strip_prompt; then
+  echo "SKIP: this is not the GNU Readline we expect"
+  exit $status
+fi
+
+# On Windows10/MSYS2 the ^G coming from <tab> completion is not
+# emitted the same way
+# (https://lists.gnu.org/r/bug-bison/2020-05/msg00076.html).
+echo "checking for kernel name... $(uname -s)"
+case $(uname -s) in
+  (MSYS*)
+    echo "SKIP: this is Windows/MSYS"
+    exit $status
+    ;;
+esac
+
+
+# Check completion after an operator.
+sed -e 's/\\t/	/g' >input <<EOF
+(1+\t\t
+EOF
+# Nuke the possible trailing white spaces in the effective output.
+# This is to cope with some readlines that pad all the suggestions
+# with white spaces (for alignment), including the last one on a line.
+#
+# See for instance <https://trac.macports.org/ticket/59927#comment:48>
+# and its test-suite.log:
+# <https://trac.macports.org/attachment/ticket/59927/bison-3.7.6-test-10.13.test-suite.log>
+run -t 0 '> (1+
+(       -       atan    cos     exp     ln      number  sin     sqrt
+> (1+
+>
+err: 1.4: syntax error: expected - or ( or number or function or variable before end of file
+err:     1 | (1+
+err:       |    ^'
+
+# Check the completion of a word.
+sed -e 's/\\t/	/g' >input <<EOF
+(at\t\t
+EOF
+run 0 '> (atan ( ''
+> ''
+err: 1.9: syntax error: expected - or ( or number or function or variable before end of file
+err:     1 | (atan ( ''
+err:       |         ^'
+
+# Check the completion at the very beginning.
+sed -e 's/\\t/	/g' >input <<EOF
+e\t\t
+EOF
+run -n 0 '> e
+end of file  exit         exp          ''
+> e
+0
+> ''
+err: '
+
+# Check that completion prints valid locations even when there is an error.
+sed -e 's/\\t/	/g' >input <<EOF
+1++\t
+EOF
+run -n 0 '> 1++ ''
+> ''
+err: 1.3: syntax error: expected - or ( or number or function or variable before +
+err:     1 | 1++ ''
+err:       |   ^
+'
+
+# And even when the error was recovered from.
+sed -e 's/\\t/	/g' >input <<EOF
+(1++2) + 3 +\t\t
+EOF
+run -n 0 '> (1++2) + 3 +  ''
+> ''
+err: 1.4: syntax error: expected - or ( or number or function or variable before +
+err:     1 | (1++2) + 3 +  ''
+err:       |    ^
+err: 1.15: syntax error: expected - or ( or number or function or variable before end of file
+err:     1 | (1++2) + 3 +  ''
+err:       |               ^
+'
diff --git a/examples/c/bistromathic/local.mk b/examples/c/bistromathic/local.mk
new file mode 100644
index 0000000..c693726
--- /dev/null
+++ b/examples/c/bistromathic/local.mk
@@ -0,0 +1,41 @@
+## Copyright (C) 2020-2021 Free Software Foundation, Inc.
+##
+## This program is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+bistromathicdir = $(docdir)/%D%
+
+## --------------- ##
+## Bistromathics.  ##
+## --------------- ##
+
+%D%/parse.c: $(dependencies)
+
+if ENABLE_BISTROMATHIC
+  check_PROGRAMS += %D%/bistromathic
+  TESTS += %D%/bistromathic.test
+  nodist_%C%_bistromathic_SOURCES = %D%/parse.y
+
+  # Don't use gnulib's system headers.
+  %C%_bistromathic_CPPFLAGS =			\
+    -DBISON_LOCALEDIR='"$(localdir)"'		\
+    -DLOCALEDIR='"$(localdir)"'			\
+    -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
+  %C%_bistromathic_CFLAGS = $(TEST_CFLAGS)
+  %C%_bistromathic_LDADD = -lm $(LIBREADLINE) $(LIBINTL)
+endif
+
+EXTRA_DIST += %D%/bistromathic.test
+dist_bistromathic_DATA = %D%/parse.y %D%/Makefile %D%/README.md
+CLEANFILES += %D%/parse.[ch] %D%/parse.output
+CLEANDIRS += %D%/*.dSYM
diff --git a/examples/c/bistromathic/parse.y b/examples/c/bistromathic/parse.y
new file mode 100644
index 0000000..8b1591e
--- /dev/null
+++ b/examples/c/bistromathic/parse.y
@@ -0,0 +1,695 @@
+/* Parser and scanner for bistromathic.   -*- C -*-
+
+   Copyright (C) 2019-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+%require "3.7"
+
+// Emitted on top of the implementation file.
+%code top {
+  #include <ctype.h>  // isdigit
+  #include <locale.h> // LC_ALL
+  #include <math.h>   // cos, sin, etc.
+  #include <stdarg.h> // va_start
+  #include <stdio.h>  // printf
+  #include <stdlib.h> // calloc
+  #include <string.h> // strcmp
+
+  #include <readline/readline.h>
+  #include <readline/history.h>
+
+  #if defined ENABLE_NLS && ENABLE_NLS
+  // Unable the translation of Bison's generated messages.
+  # define YYENABLE_NLS 1
+  # include <libintl.h>
+  // Unless specified otherwise, we expect bistromathic's own
+  // catalog to be installed in the same tree as Bison's catalog.
+  # ifndef LOCALEDIR
+  #  define LOCALEDIR BISON_LOCALEDIR
+  # endif
+  #endif
+}
+
+// Emitted in the header file, before the definition of YYSTYPE.
+%code requires {
+  // Function type.
+  typedef double (func_t) (double);
+
+  // Data type for links in the chain of symbols.
+  typedef struct symrec symrec;
+  struct symrec
+  {
+    char *name;  // name of symbol
+    int type;    // type of symbol: either VAR or FUN
+    union
+    {
+      double var;    // value of a VAR
+      func_t *fun;   // value of a FUN
+    } value;
+    symrec *next;  // link field
+  };
+
+  symrec *putsym (char const *name, int sym_type);
+  symrec *getsym (char const *name);
+
+  // Exchanging information with the parser.
+  typedef struct
+  {
+    // Whether to not emit error messages.
+    int silent;
+    // The current input line.
+    const char *line;
+  } user_context;
+}
+
+// Emitted in the header file, after the definition of YYSTYPE.
+%code provides {
+# ifndef __attribute__
+#  ifndef __GNUC__
+#   define __attribute__(Spec) /* empty */
+#  endif
+# endif
+
+  yytoken_kind_t
+  yylex (const char **line, YYSTYPE *yylval, YYLTYPE *yylloc,
+         const user_context *uctx);
+  void yyerror (const YYLTYPE *loc, const user_context *uctx,
+                char const *format, ...)
+    __attribute__ ((__format__ (__printf__, 3, 4)));
+}
+
+// Emitted in the implementation file.
+%code {
+  // Print *LOC on OUT.
+  static void location_print (FILE *out, YYLTYPE const * const loc);
+  #define YYLOCATION_PRINT location_print
+
+  #if defined ENABLE_NLS && ENABLE_NLS
+  # define _(Msgid)  gettext (Msgid)
+  #else
+  # define _(Msgid)  (Msgid)
+  #endif
+
+  // Whether to quit.
+  int done = 0;
+}
+
+// Include the header in the implementation rather than duplicating it.
+%define api.header.include {"parse.h"}
+
+// Don't share global variables between the scanner and the parser.
+%define api.pure full
+
+// Generate a push parser.
+%define api.push-pull push
+
+// To avoid name clashes (e.g., with C's EOF) prefix token definitions
+// with TOK_ (e.g., TOK_EOF).
+%define api.token.prefix {TOK_}
+
+// Customized syntax error messages (see yyreport_syntax_error)...
+%define parse.error custom
+
+// ... with locations...
+%locations
+
+// ... and accurate list of expected tokens.
+%define parse.lac full
+
+// Generate the parser description file (calc.output).
+%verbose
+
+// User information exchanged with the parser and scanner.
+%param {const user_context *uctx}
+
+// Generate YYSTYPE from the types assigned to symbols.
+%define api.value.type union
+%token
+    PLUS   "+"
+    MINUS  "-"
+    STAR   "*"
+    SLASH  "/"
+    CARET  "^"
+    LPAREN "("
+    RPAREN ")"
+    EQUAL  "="
+    EXIT   "exit"
+  <double>
+    NUM _("number")
+  <symrec*>
+    FUN _("function")
+    VAR _("variable")
+
+%nterm <double>  exp
+
+// Enable run-time traces (yydebug).
+%define parse.trace
+
+// Formatting semantic values in debug traces.
+%printer { fprintf (yyo, "%s", $$->name); } VAR;
+%printer { fprintf (yyo, "%s()", $$->name); } FUN;
+%printer { fprintf (yyo, "%g", $$); } <double>;
+
+
+// Precedence (from lowest to highest) and associativity.
+%precedence "="
+%left "+" "-"
+%left "*" "/"
+%precedence NEG // negation--unary minus
+%right "^"      // exponentiation
+
+%% // The grammar follows.
+input:
+  %empty
+| exp     { printf ("%.10g\n", $exp); }
+| "exit"  { done = 1; }
+;
+
+exp:
+  NUM
+| VAR               { $$ = $VAR->value.var; }
+| VAR "=" exp       { $$ = $3; $VAR->value.var = $3; }
+| FUN "(" exp ")"   { $$ = $FUN->value.fun ($3); }
+| exp[l] "+" exp[r] { $$ = $l + $r; }
+| exp[l] "-" exp[r] { $$ = $l - $r; }
+| exp[l] "*" exp[r] { $$ = $l * $r; }
+| exp[l] "/" exp[r]
+  {
+    if ($r == 0)
+      {
+        yyerror (&@$, uctx, _("error: division by zero"));
+        YYERROR;
+      }
+    else
+      $$ = $l / $r;
+  }
+| "-" exp  %prec NEG { $$ = -$2; }
+| exp[l] "^" exp[r]  { $$ = pow ($l, $r); }
+| "(" exp ")"        { $$ = $2; }
+| "(" error ")"      { $$ = 666; }
+;
+
+// End of grammar.
+%%
+
+/*------------.
+| Functions.  |
+`------------*/
+
+struct init
+{
+  char const *name;
+  func_t *fun;
+};
+
+static struct init const funs[] =
+{
+  { "atan", atan },
+  { "cos",  cos  },
+  { "exp",  exp  },
+  { "ln",   log  },
+  { "sin",  sin  },
+  { "sqrt", sqrt },
+  { 0, 0 },
+};
+
+// The symbol table: a chain of 'struct symrec'.
+static symrec *sym_table;
+
+// Put functions in table.
+static void
+init_table (void)
+{
+  for (int i = 0; funs[i].name; i++)
+    {
+      symrec *ptr = putsym (funs[i].name, TOK_FUN);
+      ptr->value.fun = funs[i].fun;
+    }
+}
+
+symrec *
+putsym (char const *name, int sym_type)
+{
+  symrec *res = (symrec *) malloc (sizeof (symrec));
+  res->name = strdup (name);
+  res->type = sym_type;
+  res->value.var = 0; // Set value to 0 even if fun.
+  res->next = sym_table;
+  sym_table = res;
+  return res;
+}
+
+symrec *
+getsym (char const *name)
+{
+  for (symrec *p = sym_table; p; p = p->next)
+    if (strcmp (p->name, name) == 0)
+      return p;
+  return NULL;
+}
+
+// How many symbols are registered.
+static int
+symbol_count (void)
+{
+  int res = 0;
+  for (symrec *p = sym_table; p; p = p->next)
+    ++res;
+  return res;
+}
+
+
+
+/*------------.
+| Locations.  |
+`------------*/
+
+// Print *LOC on OUT.  Do it in a compact way, that avoids redundancy.
+
+static void
+location_print (FILE *out, YYLTYPE const * const loc)
+{
+  fprintf (out, "%d.%d", loc->first_line, loc->first_column);
+
+  int end_col = 0 != loc->last_column ? loc->last_column - 1 : 0;
+  if (loc->first_line < loc->last_line)
+    fprintf (out, "-%d.%d", loc->last_line, end_col);
+  else if (loc->first_column < end_col)
+    fprintf (out, "-%d", end_col);
+}
+
+
+/*----------.
+| Scanner.  |
+`----------*/
+
+yytoken_kind_t
+yylex (const char **line, YYSTYPE *yylval, YYLTYPE *yylloc,
+       const user_context *uctx)
+{
+  int c;
+
+  // Ignore white space, get first nonwhite character.
+  do {
+    // Move the first position onto the last.
+    yylloc->first_line = yylloc->last_line;
+    yylloc->first_column = yylloc->last_column;
+
+    yylloc->last_column += 1;
+    c = *((*line)++);
+  } while (c == ' ' || c == '\t');
+
+  switch (c)
+    {
+    case '+': return TOK_PLUS;
+    case '-': return TOK_MINUS;
+    case '*': return TOK_STAR;
+    case '/': return TOK_SLASH;
+    case '^': return TOK_CARET;
+    case '=': return TOK_EQUAL;
+    case '(': return TOK_LPAREN;
+    case ')': return TOK_RPAREN;
+
+    case '!': return TOK_YYUNDEF;
+
+    case '\0': return TOK_YYEOF;
+
+      // Numbers.
+    case '.':
+    case '0': case '1': case '2': case '3': case '4':
+    case '5': case '6': case '7': case '8': case '9':
+      {
+        int nchars = 0;
+        if (sscanf (*line - 1, "%lf%n", &yylval->TOK_NUM, &nchars) != 1)
+          abort ();
+        *line += nchars - 1;
+        yylloc->last_column += nchars - 1;
+        return TOK_NUM;
+      }
+
+      // Identifiers.
+    case 'a': case 'b': case 'c': case 'd': case 'e':
+    case 'f': case 'g': case 'h': case 'i': case 'j':
+    case 'k': case 'l': case 'm': case 'n': case 'o':
+    case 'p': case 'q': case 'r': case 's': case 't':
+    case 'u': case 'v': case 'w': case 'x': case 'y':
+    case 'z':
+      {
+        int nchars = 0;
+        char buf[100];
+        if (sscanf (*line - 1, "%99[a-z]%n", buf, &nchars) != 1)
+          abort ();
+        *line += nchars - 1;
+        yylloc->last_column += nchars - 1;
+        if (strcmp (buf, "exit") == 0)
+          return TOK_EXIT;
+        else
+          {
+            symrec *s = getsym (buf);
+            if (!s)
+              s = putsym (buf, TOK_VAR);
+            yylval->TOK_VAR = s;
+            return s->type;
+          }
+      }
+
+      // Stray characters.
+    default:
+      yyerror (yylloc, uctx, _("syntax error: invalid character: %c"), c);
+      return TOK_YYerror;
+    }
+}
+
+
+/*---------.
+| Parser.  |
+`---------*/
+
+
+static const char *
+error_format_string (int argc)
+{
+  switch (argc)
+    {
+    default: // Avoid compiler warnings.
+    case 0: return _("%@: syntax error");
+    case 1: return _("%@: syntax error: unexpected %u");
+      // TRANSLATORS: '%@' is a location in a file, '%u' is an
+      // "unexpected token", and '%0e', '%1e'... are expected tokens
+      // at this point.
+      //
+      // For instance on the expression "1 + * 2", you'd get
+      //
+      // 1.5: syntax error: expected - or ( or number or function or variable before *
+    case 2: return _("%@: syntax error: expected %0e before %u");
+    case 3: return _("%@: syntax error: expected %0e or %1e before %u");
+    case 4: return _("%@: syntax error: expected %0e or %1e or %2e before %u");
+    case 5: return _("%@: syntax error: expected %0e or %1e or %2e or %3e before %u");
+    case 6: return _("%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u");
+    case 7: return _("%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u");
+    case 8: return _("%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., before %u");
+    }
+}
+
+
+int
+yyreport_syntax_error (const yypcontext_t *ctx, const user_context *uctx)
+{
+  if (uctx->silent)
+    return 0;
+
+  enum { ARGS_MAX = 6 };
+  yysymbol_kind_t arg[ARGS_MAX];
+  int argsize = yypcontext_expected_tokens (ctx, arg, ARGS_MAX);
+  if (argsize < 0)
+    return argsize;
+  const int too_many_expected_tokens = argsize == 0 && arg[0] != YYSYMBOL_YYEMPTY;
+  if (too_many_expected_tokens)
+    argsize = ARGS_MAX;
+  const char *format = error_format_string (1 + argsize + too_many_expected_tokens);
+
+  const YYLTYPE *loc = yypcontext_location (ctx);
+  while (*format)
+    // %@: location.
+    if (format[0] == '%' && format[1] == '@')
+      {
+        YYLOCATION_PRINT (stderr, loc);
+        format += 2;
+      }
+    // %u: unexpected token.
+    else if (format[0] == '%' && format[1] == 'u')
+      {
+        fputs (yysymbol_name (yypcontext_token (ctx)), stderr);
+        format += 2;
+      }
+    // %0e, %1e...: expected token.
+    else if (format[0] == '%'
+             && isdigit ((unsigned char) format[1])
+             && format[2] == 'e'
+             && (format[1] - '0') < argsize)
+      {
+        int i = format[1] - '0';
+        fputs (yysymbol_name (arg[i]), stderr);
+        format += 3;
+      }
+    else
+      {
+        fputc (*format, stderr);
+        ++format;
+      }
+  fputc ('\n', stderr);
+
+  // Quote the source line.
+  {
+    fprintf (stderr, "%5d | %s\n", loc->first_line, uctx->line);
+    fprintf (stderr, "%5s | %*s", "", loc->first_column, "^");
+    for (int i = loc->last_column - loc->first_column - 1; 0 < i; --i)
+      putc ('~', stderr);
+    putc ('\n', stderr);
+  }
+  return 0;
+}
+
+
+// Called by yyparse on errors to report the error to the user.
+void
+yyerror (const YYLTYPE *loc, const user_context *uctx, char const *format, ...)
+{
+  if (uctx->silent)
+    return;
+
+  YYLOCATION_PRINT (stderr, loc);
+  fputs (": ", stderr);
+  va_list args;
+  va_start (args, format);
+  vfprintf (stderr, format, args);
+  va_end (args);
+  putc ('\n', stderr);
+}
+
+
+// Return a newly allocated copy of at most N bytes of STRING.  In
+// other words, return a copy of the initial segment of length N of
+// STRING.
+static char *
+xstrndup (const char *string, size_t n)
+{
+  // len = strnlen (string, n), portably.
+  const char *end = memchr (string, '\0', n);
+  size_t len = end ? (size_t) (end - string) : n;
+  char *new = malloc (len + 1);
+  if (!new)
+    abort ();
+  new[len] = '\0';
+  return memcpy (new, string, len);
+}
+
+
+/*-----------.
+| Readline.  |
+`-----------*/
+
+// Parse (and execute) this line.
+static int
+process_line (YYLTYPE *lloc, const char *line)
+{
+  user_context uctx = {0, line};
+  yypstate *ps = yypstate_new ();
+  int status = 0;
+  do {
+    YYSTYPE lval;
+    yytoken_kind_t token = yylex (&line, &lval, lloc, &uctx);
+    status = yypush_parse (ps, token, &lval, lloc, &uctx);
+  } while (status == YYPUSH_MORE);
+  yypstate_delete (ps);
+  lloc->last_line++;
+  lloc->last_column = 1;
+  return status;
+}
+
+// Get the list of possible tokens after INPUT was read.
+// Returns a nonnegative.
+static int
+expected_tokens (const char *input,
+                 int *tokens, int ntokens)
+{
+  YYDPRINTF ((stderr, "expected_tokens (\"%s\")", input));
+  user_context uctx = {1, input};
+
+  // Parse the current state of the line.
+  yypstate *ps = yypstate_new ();
+  int status = 0;
+  YYLTYPE lloc = { 1, 1, 1, 1 };
+  do {
+    YYSTYPE lval;
+    yytoken_kind_t token = yylex (&input, &lval, &lloc, &uctx);
+    // Don't let the parse know when we reach the end of input.
+    if (token == TOK_YYEOF)
+      break;
+    status = yypush_parse (ps, token, &lval, &lloc, &uctx);
+  } while (status == YYPUSH_MORE);
+
+  int res = 0;
+  // If there were parse errors, don't propose completions.
+  if (!ps->yynerrs)
+    {
+      // Then query for the accepted tokens at this point.
+      res = yypstate_expected_tokens (ps, tokens, ntokens);
+      if (res < 0)
+        abort ();
+    }
+  yypstate_delete (ps);
+  return res;
+}
+
+// Attempt to complete on the contents of TEXT.  START and END bound
+// the region of rl_line_buffer that contains the word to complete.
+// TEXT is the word to complete.  We can use the entire contents of
+// rl_line_buffer in case we want to do some simple parsing.  Return
+// the array of matches, or NULL if there aren't any.
+static char **
+completion (const char *text, int start, int end)
+{
+  YYDPRINTF ((stderr, "completion (\"%.*s[%.*s]%s\")\n",
+              start, rl_line_buffer,
+              end - start, rl_line_buffer + start,
+              rl_line_buffer + end));
+
+  // Get list of token numbers.
+  int tokens[YYNTOKENS];
+  char *line = xstrndup (rl_line_buffer, (size_t) start);
+  int ntokens = expected_tokens (line, tokens, YYNTOKENS);
+  free (line);
+
+  // Build MATCHES, the list of possible completions.
+  const size_t len = strlen (text);
+  // Need initial prefix and final NULL.
+  char **matches
+    = calloc ((size_t) ntokens + (size_t) symbol_count () + 2, sizeof *matches);
+  if (!matches)
+    abort ();
+  int match = 1;
+  for (int i = 0; i < ntokens; ++i)
+    switch (tokens[i])
+      {
+      case YYSYMBOL_FUN:
+        for (symrec *s = sym_table; s; s = s->next)
+          if (s->type == TOK_FUN && strncmp (text, s->name, len) == 0)
+            matches[match++] = strdup (s->name);
+        break;
+      case YYSYMBOL_VAR:
+        for (symrec *s = sym_table; s; s = s->next)
+          if (s->type == TOK_VAR && strncmp (text, s->name, len) == 0)
+            matches[match++] = strdup (s->name);
+        break;
+      default:
+        {
+          const char* token = yysymbol_name (tokens[i]);
+          if (strncmp (text, token, len) == 0)
+            matches[match++] = strdup (token);
+          break;
+        }
+      }
+
+  // Find the longest common prefix, and install it in matches[0], as
+  // required by readline.
+  if (match == 1)
+    matches[0] = strdup (text);
+  else
+    {
+      size_t lcplen = strlen (matches[1]);
+      for (int i = 2; i < match && lcplen; ++i)
+        for (size_t j = 0; j < lcplen; ++j)
+          if (matches[1][j] != matches[i][j])
+            lcplen = j;
+      matches[0] = xstrndup (matches[1], lcplen);
+    }
+
+  if (yydebug)
+    {
+      fprintf (stderr, "completion (\"%.*s[%.*s]%s\") = ",
+               start, rl_line_buffer,
+               end - start, rl_line_buffer + start,
+               rl_line_buffer + end);
+      for (int i = 1; matches[i]; ++i)
+        fprintf (stderr, "%s%s",
+                 i == 1 ? "{" : ", ",
+                 matches[i]);
+      fprintf (stderr, "}\n");
+    }
+
+  // Don't fall back to proposing file names.
+  rl_attempted_completion_over = 1;
+  return matches;
+}
+
+static void
+init_readline (void)
+{
+  // Allow conditional parsing of the ~/.inputrc file.
+  rl_readline_name = "bistromathic";
+
+  // Tell the completer that we want a crack first.
+  rl_attempted_completion_function = completion;
+
+  // The basic list of characters that signal a break between words
+  // for the completer routine.
+  rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{(+-*/^)";
+}
+
+
+
+/*-------.
+| Main.  |
+`-------*/
+
+int
+main (int argc, char const* argv[])
+{
+#if defined ENABLE_NLS && ENABLE_NLS
+  // Set up internationalization.
+  setlocale (LC_ALL, "");
+  // Use Bison's standard translation catalog for error messages
+  // (the generated messages).
+  bindtextdomain ("bison-runtime", BISON_LOCALEDIR);
+  // The translation catalog of bistromathic is actually included in
+  // Bison's.  In your own project, use the name of your project.
+  bindtextdomain ("bison", LOCALEDIR);
+  textdomain ("bison");
+#endif
+
+  // Enable parse traces on option -p.
+  if (1 < argc && strcmp (argv[1], "-p") == 0)
+    yydebug = 1;
+  init_table ();
+  init_readline ();
+  YYLTYPE lloc = {1, 1, 1, 1};
+  while (!done)
+    {
+      char *line = readline ("> ");
+      if (!line)
+        {
+          // Finish the line started by the prompt.
+          putchar ('\n');
+          break;
+        }
+      if (*line)
+        add_history (line);
+      process_line (&lloc, line);
+      free (line);
+    }
+}
diff --git a/examples/c/calc/Makefile b/examples/c/calc/Makefile
index 6221ca9..cdf2ae3 100644
--- a/examples/c/calc/Makefile
+++ b/examples/c/calc/Makefile
@@ -3,12 +3,11 @@
 
 BASE = calc
 BISON = bison
-XSLTPROC = xsltproc
 
 all: $(BASE)
 
-%.c %.h %.xml %.gv: %.y
-	$(BISON) $(BISONFLAGS) --defines --xml --graph=$*.gv -o $*.c $<
+%.c %.h %.html %.xml %.gv: %.y
+	$(BISON) $(BISONFLAGS) --header --html --graph -o $*.c $<
 
 $(BASE): $(BASE).o
 	$(CC) $(CFLAGS) -o $@ $^
@@ -17,10 +16,6 @@
 	@echo "Type arithmetic expressions.  Quit with ctrl-d."
 	./$<
 
-html: $(BASE).html
-%.html: %.xml
-	$(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $$($(BISON) --print-datadir)/xslt/xml2xhtml.xsl $<
-
 CLEANFILES =									\
   $(BASE) *.o $(BASE).[ch] $(BASE).output $(BASE).xml $(BASE).html $(BASE).gv
 
diff --git a/examples/c/calc/README.md b/examples/c/calc/README.md
index ee39dd8..7cb5282 100644
--- a/examples/c/calc/README.md
+++ b/examples/c/calc/README.md
@@ -9,20 +9,15 @@
 ispell-dictionary: "american"
 End:
 
-Copyright (C) 2019 Free Software Foundation, Inc.
+Copyright (C) 2019-2021 Free Software Foundation, Inc.
 
 This file is part of Bison, the GNU Compiler Compiler.
 
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts.  A copy of the license is included in the "GNU Free
+Documentation License" file as part of this distribution.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
 --->
diff --git a/examples/c/calc/calc.test b/examples/c/calc/calc.test
index c1f1b07..d123f18 100644
--- a/examples/c/calc/calc.test
+++ b/examples/c/calc/calc.test
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2019 Free Software Foundation, Inc.
+# Copyright (C) 2019-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 cat >input <<EOF
 1+2*3
@@ -34,4 +34,10 @@
 (1+2) * 3
 EOF
 run 0 9
+# Check the traces.
 run -noerr 0 9 -p
+
+cat >input <<EOF
+1++2
+EOF
+run 0 "err: syntax error, unexpected '+', expecting number or '('"
diff --git a/examples/c/calc/calc.y b/examples/c/calc/calc.y
index a9896e4..6daf22b 100644
--- a/examples/c/calc/calc.y
+++ b/examples/c/calc/calc.y
@@ -1,6 +1,8 @@
 %code top {
+  #include <assert.h>
   #include <ctype.h>  /* isdigit. */
-  #include <stdio.h>  /* For printf, etc. */
+  #include <stdio.h>  /* printf. */
+  #include <stdlib.h> /* abort. */
   #include <string.h> /* strcmp. */
 
   int yylex (void);
@@ -8,16 +10,22 @@
 }
 
 %define api.header.include {"calc.h"}
-%define api.value.type union /* Generate YYSTYPE from these types:  */
+
+/* Generate YYSTYPE from the types used in %token and %type.  */
+%define api.value.type union
 %token <double> NUM "number"
 %type  <double> expr term fact
 
-/* Generate the parser description file.  */
+/* Generate the parser description file (calc.output).  */
 %verbose
+
+/* Nice error messages with details. */
+%define parse.error detailed
+
 /* Enable run-time traces (yydebug).  */
 %define parse.trace
 
-/* Formatting semantic values.  */
+/* Formatting semantic values in debug traces.  */
 %printer { fprintf (yyo, "%g", $$); } <double>;
 
 %% /* The grammar follows.  */
@@ -67,7 +75,8 @@
   if (c == '.' || isdigit (c))
     {
       ungetc (c, stdin);
-      scanf ("%lf", &yylval.NUM);
+      if (scanf ("%lf", &yylval.NUM) != 1)
+        abort ();
       return NUM;
     }
 
diff --git a/examples/c/calc/local.mk b/examples/c/calc/local.mk
index 3a4c494..17034fc 100644
--- a/examples/c/calc/local.mk
+++ b/examples/c/calc/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2019 Free Software Foundation, Inc.
+## Copyright (C) 2019-2021 Free Software Foundation, Inc.
 ##
 ## This program is free software: you can redistribute it and/or modify
 ## it under the terms of the GNU General Public License as published by
@@ -11,7 +11,7 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 calcdir = $(docdir)/%D%
 
@@ -27,6 +27,7 @@
 
 # Don't use gnulib's system headers.
 %C%_calc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
+%C%_calc_CFLAGS = $(TEST_CFLAGS)
 
 dist_calc_DATA = %D%/calc.y %D%/Makefile %D%/README.md
 CLEANFILES += %D%/calc.[ch] %D%/calc.output %D%/scan.c
diff --git a/examples/c/glr/Makefile b/examples/c/glr/Makefile
new file mode 100644
index 0000000..4bf7149
--- /dev/null
+++ b/examples/c/glr/Makefile
@@ -0,0 +1,23 @@
+# This Makefile is designed to be simple and readable.  It does not
+# aim at portability.  It requires GNU Make.
+
+BASE = c++-types
+BISON = bison
+
+all: $(BASE)
+
+%.c %.h %.xml %.gv: %.y
+	$(BISON) $(BISONFLAGS) --header --graph -o $*.c $<
+
+$(BASE): $(BASE).o
+	$(CC) $(CFLAGS) -o $@ $^
+
+run: $(BASE)
+	@echo "Type C++ declarations or expressions.  Quit with ctrl-d."
+	./$<
+
+CLEANFILES =									\
+  $(BASE) *.o $(BASE).[ch] $(BASE).output $(BASE).xml $(BASE).html $(BASE).gv
+
+clean:
+	rm -f $(CLEANFILES)
diff --git a/examples/c/glr/README.md b/examples/c/glr/README.md
new file mode 100644
index 0000000..26067c2
--- /dev/null
+++ b/examples/c/glr/README.md
@@ -0,0 +1,24 @@
+# glr
+
+This example demonstrates the use of GLR parsers to handle (local)
+ambiguities in the C++ language.  See the node "Merging GLR Parses" in
+Bison's documentation.
+
+<!---
+Local Variables:
+fill-column: 76
+ispell-dictionary: "american"
+End:
+
+Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+This file is part of Bison, the GNU Compiler Compiler.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts.  A copy of the license is included in the "GNU Free
+Documentation License" file as part of this distribution.
+
+--->
diff --git a/examples/c/glr/c++-types.test b/examples/c/glr/c++-types.test
new file mode 100644
index 0000000..074d72c
--- /dev/null
+++ b/examples/c/glr/c++-types.test
@@ -0,0 +1,47 @@
+#! /bin/sh
+
+# Copyright (C) 2020-2021 Free Software Foundation, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+cat >input <<EOF
+z + q;
+
+T x;
+
+T x = y;
+
+x = y;
+
+T (x) + y;
+
+T (x);
+
+T (y) = z + q;
+
+T (y y) = z + q;
+
+z + q;
+EOF
+run 0 "\
+1.0-5: +(z, q)
+3.0-3: <declare>(T, x)
+5.0-7: <init-declare>(T, x, y)
+7.0-5: =(x, y)
+9.0-9: +(<cast>(x, T), y)
+11.0-5: <OR>(<declare>(T, x), <cast>(x, T))
+13.0-13: <OR>(<init-declare>(T, y, +(z, q)), =(<cast>(y, T), +(z, q)))
+15.0-15: <error>
+17.0-5: +(z, q)
+err: 15.5: syntax error, unexpected identifier, expecting '=' or '+' or ')'"
diff --git a/examples/c/glr/c++-types.y b/examples/c/glr/c++-types.y
new file mode 100644
index 0000000..3a14d9b
--- /dev/null
+++ b/examples/c/glr/c++-types.y
@@ -0,0 +1,340 @@
+/*                                                       -*- C -*-
+  Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+/* Simplified C++ Type and Expression Grammar.
+   Written by Paul Hilfinger for Bison's test suite.  */
+
+%define api.pure
+%header
+%define api.header.include {"c++-types.h"}
+%locations
+%debug
+
+/* Nice error messages with details. */
+%define parse.error detailed
+
+%code requires
+{
+  union Node {
+    struct {
+      int isNterm;
+      int parents;
+    } nodeInfo;
+    struct {
+      int isNterm; /* 1 */
+      int parents;
+      char const *form;
+      union Node *children[3];
+    } nterm;
+    struct {
+      int isNterm; /* 0 */
+      int parents;
+      char *text;
+    } term;
+  };
+  typedef union Node Node;
+}
+
+%define api.value.type union
+
+%code
+{
+
+#include <assert.h>
+#include <ctype.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+  static Node *new_nterm (char const *, Node *, Node *, Node *);
+  static Node *new_term (char *);
+  static void free_node (Node *);
+  static char *node_to_string (const Node *);
+  static void node_print (FILE *, const Node *);
+  static Node *stmt_merge (YYSTYPE x0, YYSTYPE x1);
+
+  static void yyerror (YYLTYPE const * const loc, const char *msg);
+  static yytoken_kind_t yylex (YYSTYPE *lval, YYLTYPE *lloc);
+}
+
+%expect-rr 1
+
+%token
+  TYPENAME "typename"
+  ID "identifier"
+
+%right '='
+%left '+'
+
+%glr-parser
+
+%type <Node *> stmt expr decl declarator TYPENAME ID
+%destructor { free_node ($$); } <Node *>
+%printer { node_print (yyo, $$); } <Node *>
+
+%%
+
+prog : %empty
+     | prog stmt   {
+                     YYLOCATION_PRINT (stdout, &@2);
+                     fputs (": ", stdout);
+                     node_print (stdout, $2);
+                     putc ('\n', stdout);
+                     fflush (stdout);
+                     free_node ($2);
+                   }
+     ;
+
+stmt : expr ';'  %merge <stmt_merge>     { $$ = $1; }
+     | decl      %merge <stmt_merge>
+     | error ';'        { $$ = new_nterm ("<error>", NULL, NULL, NULL); }
+     ;
+
+expr : ID
+     | TYPENAME '(' expr ')'
+                        { $$ = new_nterm ("<cast>(%s, %s)", $3, $1, NULL); }
+     | expr '+' expr    { $$ = new_nterm ("+(%s, %s)", $1, $3, NULL); }
+     | expr '=' expr    { $$ = new_nterm ("=(%s, %s)", $1, $3, NULL); }
+     ;
+
+decl : TYPENAME declarator ';'
+                        { $$ = new_nterm ("<declare>(%s, %s)", $1, $2, NULL); }
+     | TYPENAME declarator '=' expr ';'
+                        { $$ = new_nterm ("<init-declare>(%s, %s, %s)", $1,
+                                          $2, $4); }
+     ;
+
+declarator
+     : ID
+     | '(' declarator ')' { $$ = $2; }
+     ;
+
+%%
+
+/* A C error reporting function.  */
+static void
+yyerror (YYLTYPE const * const loc, const char *msg)
+{
+  YYLOCATION_PRINT (stderr, loc);
+  fprintf (stderr, ": %s\n", msg);
+}
+
+/* The input file. */
+FILE * input = NULL;
+
+yytoken_kind_t
+yylex (YYSTYPE *lval, YYLTYPE *lloc)
+{
+  static int lineNum = 1;
+  static int colNum = 0;
+
+  while (1)
+    {
+      int c;
+      assert (!feof (input));
+      c = getc (input);
+      switch (c)
+        {
+        case EOF:
+          return 0;
+        case '\t':
+          colNum = (colNum + 7) & ~7;
+          break;
+        case ' ': case '\f':
+          colNum += 1;
+          break;
+        case '\n':
+          lineNum += 1;
+          colNum = 0;
+          break;
+        default:
+          {
+            yytoken_kind_t tok;
+            lloc->first_line = lloc->last_line = lineNum;
+            lloc->first_column = colNum;
+            if (isalpha (c))
+              {
+                char buffer[256];
+                unsigned i = 0;
+
+                do
+                  {
+                    buffer[i++] = (char) c;
+                    colNum += 1;
+                    assert (i != sizeof buffer - 1);
+                    c = getc (input);
+                  }
+                while (isalnum (c) || c == '_');
+
+                ungetc (c, input);
+                buffer[i++] = 0;
+                if (isupper ((unsigned char) buffer[0]))
+                  {
+                    tok = TYPENAME;
+                    lval->TYPENAME = new_term (strcpy (malloc (i), buffer));
+                  }
+                else
+                  {
+                    tok = ID;
+                    lval->ID = new_term (strcpy (malloc (i), buffer));
+                  }
+              }
+            else
+              {
+                colNum += 1;
+                tok = c;
+              }
+            lloc->last_column = colNum;
+            return tok;
+          }
+        }
+    }
+}
+
+static Node *
+new_nterm (char const *form, Node *child0, Node *child1, Node *child2)
+{
+  Node *res = malloc (sizeof *res);
+  res->nterm.isNterm = 1;
+  res->nterm.parents = 0;
+  res->nterm.form = form;
+  res->nterm.children[0] = child0;
+  if (child0)
+    child0->nodeInfo.parents += 1;
+  res->nterm.children[1] = child1;
+  if (child1)
+    child1->nodeInfo.parents += 1;
+  res->nterm.children[2] = child2;
+  if (child2)
+    child2->nodeInfo.parents += 1;
+  return res;
+}
+
+static Node *
+new_term (char *text)
+{
+  Node *res = malloc (sizeof *res);
+  res->term.isNterm = 0;
+  res->term.parents = 0;
+  res->term.text = text;
+  return res;
+}
+
+static void
+free_node (Node *node)
+{
+  if (!node)
+    return;
+  node->nodeInfo.parents -= 1;
+  /* Free only if 0 (last parent) or -1 (no parents).  */
+  if (node->nodeInfo.parents > 0)
+    return;
+  if (node->nodeInfo.isNterm == 1)
+    {
+      free_node (node->nterm.children[0]);
+      free_node (node->nterm.children[1]);
+      free_node (node->nterm.children[2]);
+    }
+  else
+    free (node->term.text);
+  free (node);
+}
+
+static char *
+node_to_string (const Node *node)
+{
+  char *res;
+  if (!node)
+    {
+      res = malloc (1);
+      res[0] = 0;
+    }
+  else if (node->nodeInfo.isNterm == 1)
+    {
+      char *child0 = node_to_string (node->nterm.children[0]);
+      char *child1 = node_to_string (node->nterm.children[1]);
+      char *child2 = node_to_string (node->nterm.children[2]);
+      res = malloc (strlen (node->nterm.form) + strlen (child0)
+                    + strlen (child1) + strlen (child2) + 1);
+      sprintf (res, node->nterm.form, child0, child1, child2);
+      free (child2);
+      free (child1);
+      free (child0);
+    }
+  else
+    res = strdup (node->term.text);
+  return res;
+}
+
+static void
+node_print (FILE *out, const Node *n)
+{
+  char *str = node_to_string (n);
+  fputs (str, out);
+  free (str);
+}
+
+
+static Node *
+stmt_merge (YYSTYPE x0, YYSTYPE x1)
+{
+  return new_nterm ("<OR>(%s, %s)", x0.stmt, x1.stmt, NULL);
+}
+
+static int
+process (const char *file)
+{
+  int is_stdin = !file || strcmp (file, "-") == 0;
+  if (is_stdin)
+    input = stdin;
+  else
+    input = fopen (file, "r");
+  assert (input);
+  int status = yyparse ();
+  if (!is_stdin)
+    fclose (input);
+  return status;
+}
+
+int
+main (int argc, char **argv)
+{
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
+
+  int ran = 0;
+  for (int i = 1; i < argc; ++i)
+    // Enable parse traces on option -p.
+    if (strcmp (argv[i], "-p") == 0)
+      yydebug = 1;
+    else
+      {
+        int status = process (argv[i]);
+        ran = 1;
+        if (!status)
+          return status;
+      }
+
+  if (!ran)
+    {
+      int status = process (NULL);
+      if (!status)
+        return status;
+    }
+  return 0;
+}
diff --git a/examples/c/glr/local.mk b/examples/c/glr/local.mk
new file mode 100644
index 0000000..7b2be76
--- /dev/null
+++ b/examples/c/glr/local.mk
@@ -0,0 +1,34 @@
+## Copyright (C) 2020-2021 Free Software Foundation, Inc.
+##
+## This program is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+glrdir = $(docdir)/%D%
+
+## ----------- ##
+## c++-types.  ##
+## ----------- ##
+
+check_PROGRAMS += %D%/c++-types
+TESTS += %D%/c++-types.test
+EXTRA_DIST += %D%/c++-types.test
+nodist_%C%_c___types_SOURCES = %D%/c++-types.y
+%D%/c++-types.c: $(dependencies)
+
+# Don't use gnulib's system headers.
+%C%_c___types_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
+%C%_c___types_CFLAGS = $(TEST_CFLAGS)
+
+dist_glr_DATA = %D%/c++-types.y %D%/Makefile %D%/README.md
+CLEANFILES += %D%/c++-types.[ch] %D%/c++-types.output
+CLEANDIRS += %D%/*.dSYM
diff --git a/examples/c/lexcalc/Makefile b/examples/c/lexcalc/Makefile
index eccc876..3306925 100644
--- a/examples/c/lexcalc/Makefile
+++ b/examples/c/lexcalc/Makefile
@@ -4,12 +4,11 @@
 BASE = lexcalc
 BISON = bison
 FLEX = flex
-XSLTPROC = xsltproc
 
 all: $(BASE)
 
-%.c %.h %.xml %.gv: %.y
-	$(BISON) $(BISONFLAGS) --defines --xml --graph=$*.gv -o $*.c $<
+%.c %.h %.html %.xml %.gv: %.y
+	$(BISON) $(BISONFLAGS) --header --html --graph -o $*.c $<
 
 %.c: %.l
 	$(FLEX) $(FLEXFLAGS) -o$@ $<
@@ -22,10 +21,6 @@
 	@echo "Type arithmetic expressions.  Quit with ctrl-d."
 	./$<
 
-html: parse.html
-%.html: %.xml
-	$(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $$($(BISON) --print-datadir)/xslt/xml2xhtml.xsl $<
-
 CLEANFILES =						\
   $(BASE) *.o						\
   parse.[ch] parse.output parse.xml parse.html parse.gv	\
diff --git a/examples/c/lexcalc/README.md b/examples/c/lexcalc/README.md
index 31ef276..2636a21 100644
--- a/examples/c/lexcalc/README.md
+++ b/examples/c/lexcalc/README.md
@@ -3,26 +3,22 @@
 This directory contains lexcalc, the traditional example of using Flex and
 Bison to build a simple calculator.
 
+It features detailed syntax errors with locations.
+
 <!---
 Local Variables:
 fill-column: 76
 ispell-dictionary: "american"
 End:
 
-Copyright (C) 2018-2019 Free Software Foundation, Inc.
+Copyright (C) 2018-2021 Free Software Foundation, Inc.
 
 This file is part of Bison, the GNU Compiler Compiler.
 
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts.  A copy of the license is included in the "GNU Free
+Documentation License" file as part of this distribution.
 --->
diff --git a/examples/c/lexcalc/lexcalc.test b/examples/c/lexcalc/lexcalc.test
index 6d1ecde..7559a21 100644
--- a/examples/c/lexcalc/lexcalc.test
+++ b/examples/c/lexcalc/lexcalc.test
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2018-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 cat >input <<EOF
 1+2*3
@@ -21,6 +21,15 @@
 run 0 7
 
 cat >input <<EOF
+1
+2
+3
+EOF
+run 0 '1
+2
+3'
+
+cat >input <<EOF
 (1+2) * 3
 EOF
 run 0 9
@@ -29,4 +38,9 @@
 cat >input <<EOF
 (1+2) *
 EOF
-run 1 'err: syntax error, unexpected end-of-line, expecting ( or number'
+run 1 'err: 1.8-2.0: syntax error, unexpected end of line, expecting ( or number'
+
+cat >input <<EOF
+1 / (2 - 2)
+EOF
+run 1 'err: 1.1-11: error: division by zero'
diff --git a/examples/c/lexcalc/local.mk b/examples/c/lexcalc/local.mk
index dc81eca..f1ff5eb 100644
--- a/examples/c/lexcalc/local.mk
+++ b/examples/c/lexcalc/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2018-2019 Free Software Foundation, Inc.
+## Copyright (C) 2018-2021 Free Software Foundation, Inc.
 ##
 ## This program is free software: you can redistribute it and/or modify
 ## it under the terms of the GNU General Public License as published by
@@ -11,7 +11,7 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 lexcalcdir = $(docdir)/%D%
 
@@ -25,10 +25,19 @@
   nodist_%C%_lexcalc_SOURCES = %D%/parse.y %D%/parse.h %D%/scan.l
   # Don't use gnulib's system headers.
   %C%_lexcalc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
+  # Fighting warnings triggered by Flex is just too painful.
+  # %C%_lexcalc_CFLAGS = $(TEST_CFLAGS)
 endif FLEX_WORKS
 
 %D%/parse.c: $(dependencies)
 
+# Tell Make scan.o depends on parse.h, except that Make sees only
+# parse.c, not parse.h.  We can't use BUILT_SOURCES to this end, since
+# we use the built bison.
+%D%/lexcalc$(DASH)scan.o: %D%/parse.c
+# Likewise, but for Automake before 1.16.
+%D%/examples_c_lexcalc_lexcalc$(DASH)scan.o: %D%/parse.c
+
 EXTRA_DIST += %D%/lexcalc.test
 dist_lexcalc_DATA = %D%/parse.y %D%/scan.l %D%/Makefile %D%/README.md
 CLEANFILES += %D%/parse.[ch] %D%/scan.c %D%/parse.output
diff --git a/examples/c/lexcalc/parse.y b/examples/c/lexcalc/parse.y
index 68b1b17..ee55988 100644
--- a/examples/c/lexcalc/parse.y
+++ b/examples/c/lexcalc/parse.y
@@ -1,3 +1,22 @@
+/* Parser for lexcalc.   -*- C -*-
+
+   Copyright (C) 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 // Prologue (directives).
 %expect 0
 
@@ -6,10 +25,10 @@
 {
   // Tell Flex the expected prototype of yylex.
 #define YY_DECL                                 \
-  enum yytokentype yylex (YYSTYPE* yylval, int *nerrs)
+  yytoken_kind_t yylex (YYSTYPE* yylval, YYLTYPE *yylloc, int *nerrs)
   YY_DECL;
 
-  void yyerror (int *nerrs, const char *msg);
+  void yyerror (const YYLTYPE *loc, int *nerrs, const char *msg);
 }
 
 // Emitted on top of the implementation file.
@@ -17,14 +36,33 @@
 {
 #include <stdio.h>  // printf.
 #include <stdlib.h> // getenv.
+#include <string.h> // strcmp.
 }
 
+// Include the header in the implementation rather than duplicating it.
+%define api.header.include {"parse.h"}
+
+// Don't share global variables between the scanner and the parser.
 %define api.pure full
+
+// To avoid name clashes (e.g., with C's EOF) prefix token definitions
+// with TOK_ (e.g., TOK_EOF).
 %define api.token.prefix {TOK_}
+
+// %token and %type use genuine types (e.g., "%token <int>").  Let
+// %bison define YYSTYPE as a union of all these types.
 %define api.value.type union
-%define parse.error verbose
+
+// Generate detailed error messages.
+%define parse.error detailed
+
+// with locations.
+%locations
+
+// Enable debug traces (see yydebug in main).
 %define parse.trace
- // Error count, exchanged between main, yyparse and yylex.
+
+// Error count, exchanged between main, yyparse and yylex.
 %param {int *nerrs}
 
 %token
@@ -34,8 +72,7 @@
   SLASH  "/"
   LPAREN "("
   RPAREN ")"
-  EOL    "end-of-line"
-  EOF 0  "end-of-file"
+  EOL    "end of line"
 ;
 
 %token <int> NUM "number"
@@ -66,7 +103,7 @@
   {
     if ($3 == 0)
       {
-        yyerror (nerrs, "invalid division by zero");
+        yyerror (&@$, nerrs, "error: division by zero");
         YYERROR;
       }
     else
@@ -77,17 +114,24 @@
 ;
 %%
 // Epilogue (C code).
-void yyerror (int *nerrs, const char *msg)
+
+void yyerror (const YYLTYPE *loc, int *nerrs, const char *msg)
 {
-  fprintf (stderr, "%s\n", msg);
+  YYLOCATION_PRINT (stderr, loc);
+  fprintf (stderr, ": %s\n", msg);
   ++*nerrs;
 }
 
-int main (void)
+int main (int argc, const char *argv[])
 {
-  int nerrs = 0;
   // Possibly enable parser runtime debugging.
   yydebug = !!getenv ("YYDEBUG");
+  // Enable parse traces on option -p.
+  for (int i = 1; i < argc; ++i)
+    if (strcmp (argv[i], "-p") == 0)
+      yydebug = 1;
+
+  int nerrs = 0;
   yyparse (&nerrs);
   // Exit on failure if there were errors.
   return !!nerrs;
diff --git a/examples/c/lexcalc/scan.l b/examples/c/lexcalc/scan.l
index 815f778..983fbda 100644
--- a/examples/c/lexcalc/scan.l
+++ b/examples/c/lexcalc/scan.l
@@ -1,17 +1,51 @@
-/* Prologue (directives).   -*- C++ -*- */
+/* Scanner for lexcalc.   -*- C -*-
+
+   Copyright (C) 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Prologue (directives). */
 
 /* Disable Flex features we don't need, to avoid warnings. */
 %option nodefault noinput nounput noyywrap
 
 %{
-#include <errno.h> /* errno, ERANGE */
+#include <errno.h>  /* errno, ERANGE */
 #include <limits.h> /* INT_MIN */
 #include <stdlib.h> /* strtol */
 
 #include "parse.h"
+
+  // Each time a rule is matched, advance the end cursor/position.
+#define YY_USER_ACTION                          \
+  yylloc->last_column += (int) yyleng;
+
+  // Move the first position onto the last.
+#define LOCATION_STEP()                         \
+  do {                                          \
+    yylloc->first_line = yylloc->last_line;     \
+    yylloc->first_column = yylloc->last_column; \
+  } while (0)
 %}
 
 %%
+%{
+  // Each time yylex is called, move the head position to the end one.
+  LOCATION_STEP ();
+%}
  /* Rules.  */
 
 "+"      return TOK_PLUS;
@@ -27,18 +61,18 @@
   errno = 0;
   long n = strtol (yytext, NULL, 10);
   if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE))
-    yyerror (nerrs, "integer is out of range");
+    yyerror (yylloc, nerrs, "integer is out of range");
   yylval->TOK_NUM = (int) n;
   return TOK_NUM;
 }
 
+"\n"     yylloc->last_line++; yylloc->last_column = 1; return TOK_EOL;
+
  /* Ignore white spaces. */
-[ \t]+   continue;
+[ \t]+   LOCATION_STEP (); continue;
 
-"\n"     return TOK_EOL;
+.        yyerror (yylloc, nerrs, "syntax error, invalid character"); continue;
 
-.        yyerror (nerrs, "syntax error, invalid character");
-
-<<EOF>>  return TOK_EOF;
+<<EOF>>  return TOK_YYEOF;
 %%
 /* Epilogue (C code). */
diff --git a/examples/c/local.mk b/examples/c/local.mk
index 11071f1..3f2029a 100644
--- a/examples/c/local.mk
+++ b/examples/c/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2018-2019 Free Software Foundation, Inc.
+## Copyright (C) 2018-2021 Free Software Foundation, Inc.
 ##
 ## This program is free software: you can redistribute it and/or modify
 ## it under the terms of the GNU General Public License as published by
@@ -11,13 +11,16 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 cdir = $(docdir)/%D%
 dist_c_DATA = %D%/README.md
 
+include %D%/bistromathic/local.mk
 include %D%/calc/local.mk
+include %D%/glr/local.mk
 include %D%/lexcalc/local.mk
 include %D%/mfcalc/local.mk
+include %D%/pushcalc/local.mk
 include %D%/reccalc/local.mk
 include %D%/rpcalc/local.mk
diff --git a/examples/c/mfcalc/Makefile b/examples/c/mfcalc/Makefile
index b951808..4014dd4 100644
--- a/examples/c/mfcalc/Makefile
+++ b/examples/c/mfcalc/Makefile
@@ -3,12 +3,11 @@
 
 BASE = mfcalc
 BISON = bison
-XSLTPROC = xsltproc
 
 all: $(BASE)
 
-%.c %.xml %.gv: %.y
-	$(BISON) $(BISONFLAGS) --xml --graph=$*.gv -o $*.c $<
+%.c %.html %.gv: %.y
+	$(BISON) $(BISONFLAGS) --html --graph -o $*.c $<
 
 %: %.c
 	$(CC) $(CFLAGS) -o $@ $<
@@ -17,9 +16,5 @@
 	@echo "Type arithmetic expressions.  Quit with ctrl-d."
 	./$<
 
-html: $(BASE).html
-%.html: %.xml
-	$(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $$($(BISON) --print-datadir)/xslt/xml2xhtml.xsl $<
-
 clean:
 	rm -f $(BASE) $(BASE).c $(BASE).html $(BASE).xml $(BASE).gv $(BASE).output
diff --git a/examples/c/mfcalc/calc.h b/examples/c/mfcalc/calc.h
index d672e8e..c5baeb9 100644
--- a/examples/c/mfcalc/calc.h
+++ b/examples/c/mfcalc/calc.h
@@ -1,3 +1,23 @@
+/* Functions for mfcalc.   -*- C -*-
+
+   Copyright (C) 1988-1993, 1995, 1998-2015, 2018-2021 Free Software
+   Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 /* Function type. */
 typedef double (func_t) (double);
 
diff --git a/examples/c/mfcalc/local.mk b/examples/c/mfcalc/local.mk
index 0beb8df..5990ddd 100644
--- a/examples/c/mfcalc/local.mk
+++ b/examples/c/mfcalc/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2005-2006, 2008-2015, 2018-2019 Free Software
+## Copyright (C) 2005-2006, 2008-2015, 2018-2021 Free Software
 ## Foundation, Inc.
 ##
 ## This program is free software: you can redistribute it and/or modify
@@ -12,7 +12,7 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 ## -------------------- ##
 ## Building & testing.  ##
@@ -31,6 +31,7 @@
 %D%/mfcalc.c: $(dependencies)
 # Don't use gnulib's system headers.
 %C%_mfcalc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
+%C%_mfcalc_CFLAGS = $(TEST_CFLAGS)
 %C%_mfcalc_LDADD = -lm
 
 dist_TESTS += %D%/mfcalc.test
diff --git a/examples/c/mfcalc/mfcalc.test b/examples/c/mfcalc/mfcalc.test
index 838dff1..1dac793 100755
--- a/examples/c/mfcalc/mfcalc.test
+++ b/examples/c/mfcalc/mfcalc.test
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2005-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2005-2015, 2018-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 cat >input <<EOF
 1+2*3
@@ -25,3 +25,15 @@
 EOF
 run 0 9
 run -noerr 0 9 -p
+
+cat >input <<EOF
+a = 256
+sqrt (a)
+EOF
+run 0 '256
+16'
+
+cat >input <<EOF
+16 == 12
+EOF
+run 0 'err: syntax error'
diff --git a/examples/c/mfcalc/mfcalc.y b/examples/c/mfcalc/mfcalc.y
index 4b6ba4c..4227d5c 100644
--- a/examples/c/mfcalc/mfcalc.y
+++ b/examples/c/mfcalc/mfcalc.y
@@ -1,3 +1,23 @@
+/* Parser for mfcalc.   -*- C -*-
+
+   Copyright (C) 1988-1993, 1995, 1998-2015, 2018-2021 Free Software
+   Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 %{
   #include <stdio.h>  /* For printf, etc. */
   #include <math.h>   /* For pow, used in the grammar. */
@@ -59,7 +79,7 @@
   func_t *fun;
 };
 
-struct init const arith_funs[] =
+struct init const funs[] =
 {
   { "atan", atan },
   { "cos",  cos  },
@@ -73,14 +93,14 @@
 /* The symbol table: a chain of 'struct symrec'. */
 symrec *sym_table;
 
-/* Put arithmetic functions in table. */
+/* Put functions in table. */
 static void
 init_table (void)
 {
-  for (int i = 0; arith_funs[i].name; i++)
+  for (int i = 0; funs[i].name; i++)
     {
-      symrec *ptr = putsym (arith_funs[i].name, FUN);
-      ptr->value.fun = arith_funs[i].fun;
+      symrec *ptr = putsym (funs[i].name, FUN);
+      ptr->value.fun = funs[i].fun;
     }
 }
 
@@ -88,6 +108,7 @@
    always succeed, and that integer calculations
    never overflow.  Production-quality code should
    not make these assumptions.  */
+#include <assert.h>
 #include <stdlib.h> /* malloc, realloc. */
 #include <string.h> /* strlen. */
 
@@ -125,13 +146,14 @@
     c = getchar ();
 
   if (c == EOF)
-    return 0;
+    return YYEOF;
 
   /* Char starts a number => parse the number. */
   if (c == '.' || isdigit (c))
     {
       ungetc (c, stdin);
-      scanf ("%lf", &yylval.NUM);
+      if (scanf ("%lf", &yylval.NUM) != 1)
+        abort ();
       return NUM;
     }
 
@@ -147,10 +169,10 @@
           if (bufsize <= i)
             {
               bufsize = 2 * bufsize + 40;
-              symbuf = realloc (symbuf, bufsize);
+              symbuf = realloc (symbuf, (size_t) bufsize);
             }
           /* Add this character to the buffer. */
-          symbuf[i++] = c;
+          symbuf[i++] = (char) c;
           /* Get another character. */
           c = getchar ();
         }
diff --git a/examples/c/pushcalc/Makefile b/examples/c/pushcalc/Makefile
new file mode 100644
index 0000000..8352393
--- /dev/null
+++ b/examples/c/pushcalc/Makefile
@@ -0,0 +1,23 @@
+# This Makefile is designed to be simple and readable.  It does not
+# aim at portability.  It requires GNU Make.
+
+BASE = calc
+BISON = bison
+
+all: $(BASE)
+
+%.c %.h %.html %.gv: %.y
+	$(BISON) $(BISONFLAGS) --header --html --graph -o $*.c $<
+
+$(BASE): $(BASE).o
+	$(CC) $(CFLAGS) -o $@ $^
+
+run: $(BASE)
+	@echo "Type arithmetic expressions.  Quit with ctrl-d."
+	./$<
+
+CLEANFILES =									\
+  $(BASE) *.o $(BASE).[ch] $(BASE).output $(BASE).xml $(BASE).html $(BASE).gv
+
+clean:
+	rm -f $(CLEANFILES)
diff --git a/examples/c/pushcalc/README.md b/examples/c/pushcalc/README.md
new file mode 100644
index 0000000..8ec1a3a
--- /dev/null
+++ b/examples/c/pushcalc/README.md
@@ -0,0 +1,32 @@
+# pushcalc - push parser with Bison
+
+This directory contains pushcalc, the traditional calculator, implemented as
+a push parser.
+
+Traditionally Bison is used to create so called "pull parsers": the user
+invokes the parser once, which repeatedly calls (pulls) the scanner until
+the input is drained.
+
+This example demonstrates the "push parsers": the user calls scanner to
+fetch the next token, passes (pushes) it to the parser, and repeats the
+operation until the input is drained.
+
+This example is a straightforward conversion of the 'calc' example to the
+push-parser model.
+
+<!---
+Local Variables:
+fill-column: 76
+ispell-dictionary: "american"
+End:
+
+Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts.  A copy of the license is included in the "GNU Free
+Documentation License" file as part of this distribution.
+
+--->
diff --git a/examples/d/calc.test b/examples/c/pushcalc/calc.test
similarity index 64%
copy from examples/d/calc.test
copy to examples/c/pushcalc/calc.test
index 3073609..611e9c8 100644
--- a/examples/d/calc.test
+++ b/examples/c/pushcalc/calc.test
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2020-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,14 +13,30 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 cat >input <<EOF
-1 + 2 * 3
+1+2*3
 EOF
 run 0 7
 
 cat >input <<EOF
-1 + 2 * * 3
+1 - 2 - 3
 EOF
-run 1 "err: syntax error, unexpected *, expecting + or - or ( or number"
+run 0 -4
+
+cat >input <<EOF
+8 / 2 / 2
+EOF
+run 0 2
+
+cat >input <<EOF
+(1+2) * 3
+EOF
+run 0 9
+run -noerr 0 9 -p
+
+cat >input <<EOF
+1++2
+EOF
+run 0 "err: syntax error, unexpected '+', expecting number or '('"
diff --git a/examples/c/pushcalc/calc.y b/examples/c/pushcalc/calc.y
new file mode 100644
index 0000000..d1fd3d5
--- /dev/null
+++ b/examples/c/pushcalc/calc.y
@@ -0,0 +1,134 @@
+/* Parser and scanner for pushcalc.   -*- C -*-
+
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+%code top {
+  #include <ctype.h>  /* isdigit. */
+  #include <stdio.h>  /* printf. */
+  #include <stdlib.h> /* abort. */
+  #include <string.h> /* strcmp. */
+}
+
+%code {
+  int yylex (YYSTYPE *yylval);
+  void yyerror (char const *);
+}
+
+%define api.header.include {"calc.h"}
+
+/* Generate YYSTYPE from the types used in %token and %type.  */
+%define api.value.type union
+%token <double> NUM "number"
+%type  <double> expr term fact
+
+/* Don't share global variables between the scanner and the parser.  */
+%define api.pure full
+/* Generate a push parser.  */
+%define api.push-pull push
+
+/* Nice error messages with details. */
+%define parse.error detailed
+
+/* Generate the parser description file (calc.output).  */
+%verbose
+
+ /* Enable run-time traces (yydebug).  */
+%define parse.trace
+
+/* Formatting semantic values in debug traces.  */
+%printer { fprintf (yyo, "%g", $$); } <double>;
+
+%% /* The grammar follows.  */
+input:
+  %empty
+| input line
+;
+
+line:
+  '\n'
+| expr '\n'  { printf ("%.10g\n", $1); }
+| error '\n' { yyerrok; }
+;
+
+expr:
+  expr '+' term { $$ = $1 + $3; }
+| expr '-' term { $$ = $1 - $3; }
+| term
+;
+
+term:
+  term '*' fact { $$ = $1 * $3; }
+| term '/' fact { $$ = $1 / $3; }
+| fact
+;
+
+fact:
+  "number"
+| '(' expr ')' { $$ = $expr; }
+;
+
+%%
+
+int
+yylex (YYSTYPE *yylval)
+{
+  int c;
+
+  /* Ignore white space, get first nonwhite character.  */
+  while ((c = getchar ()) == ' ' || c == '\t')
+    continue;
+
+  if (c == EOF)
+    return 0;
+
+  /* Char starts a number => parse the number.         */
+  if (c == '.' || isdigit (c))
+    {
+      ungetc (c, stdin);
+      if (scanf ("%lf", &yylval->NUM) != 1)
+        abort ();
+      return NUM;
+    }
+
+  /* Any other character is a token by itself.        */
+  return c;
+}
+
+/* Called by yyparse on error.  */
+void
+yyerror (char const *s)
+{
+  fprintf (stderr, "%s\n", s);
+}
+
+int
+main (int argc, char const* argv[])
+{
+  /* Enable parse traces on option -p.  */
+  for (int i = 1; i < argc; ++i)
+    if (!strcmp (argv[i], "-p"))
+      yydebug = 1;
+  int status;
+  yypstate *ps = yypstate_new ();
+  do {
+    YYSTYPE lval;
+    status = yypush_parse (ps, yylex (&lval), &lval);
+  } while (status == YYPUSH_MORE);
+  yypstate_delete (ps);
+  return status;
+}
diff --git a/examples/c/pushcalc/local.mk b/examples/c/pushcalc/local.mk
new file mode 100644
index 0000000..430ded1
--- /dev/null
+++ b/examples/c/pushcalc/local.mk
@@ -0,0 +1,34 @@
+## Copyright (C) 2020-2021 Free Software Foundation, Inc.
+##
+## This program is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+pushcalcdir = $(docdir)/%D%
+
+## ------ ##
+## Calc.  ##
+## ------ ##
+
+check_PROGRAMS += %D%/calc
+TESTS += %D%/calc.test
+EXTRA_DIST += %D%/calc.test
+nodist_%C%_calc_SOURCES = %D%/calc.y
+%D%/calc.c: $(dependencies)
+
+# Don't use gnulib's system headers.
+%C%_calc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
+%C%_calc_CFLAGS = $(TEST_CFLAGS)
+
+dist_pushcalc_DATA = %D%/calc.y %D%/Makefile %D%/README.md
+CLEANFILES += %D%/calc.[ch] %D%/calc.output
+CLEANDIRS += %D%/*.dSYM
diff --git a/examples/c/reccalc/Makefile b/examples/c/reccalc/Makefile
index 84fbd3e..69fc0c0 100644
--- a/examples/c/reccalc/Makefile
+++ b/examples/c/reccalc/Makefile
@@ -4,15 +4,14 @@
 BASE = reccalc
 BISON = bison
 FLEX = flex
-XSLTPROC = xsltproc
 
 all: $(BASE)
 
 %.c %.h %.xml %.gv: %.y
-	$(BISON) $(BISONFLAGS) --defines --xml --graph=$*.gv -o $*.c $<
+	$(BISON) $(BISONFLAGS) --header --graph -o $*.c $<
 
 %.c %.h: %.l
-	$(FLEX) $(FLEXFLAGS) -o$*.c --header-file=$*.h $<
+	$(FLEX) $(FLEXFLAGS) -o$*.c --header=$*.h $<
 
 scan.o: parse.h
 parse.o: scan.h
@@ -23,10 +22,6 @@
 	@echo "Type arithmetic expressions.  Quit with ctrl-d."
 	./$<
 
-html: parse.html
-%.html: %.xml
-	$(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $$($(BISON) --print-datadir)/xslt/xml2xhtml.xsl $<
-
 CLEANFILES =						\
   $(BASE) *.o						\
   parse.[ch] parse.output parse.xml parse.html parse.gv	\
diff --git a/examples/c/reccalc/README.md b/examples/c/reccalc/README.md
index 01ba6d3..b89911a 100644
--- a/examples/c/reccalc/README.md
+++ b/examples/c/reccalc/README.md
@@ -26,20 +26,13 @@
 ispell-dictionary: "american"
 End:
 
-Copyright (C) 2018-2019 Free Software Foundation, Inc.
+Copyright (C) 2018-2021 Free Software Foundation, Inc.
 
-This file is part of Bison, the GNU Compiler Compiler.
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts.  A copy of the license is included in the "GNU Free
+Documentation License" file as part of this distribution.
 
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
 --->
diff --git a/examples/c/reccalc/local.mk b/examples/c/reccalc/local.mk
index 0ff5abe..c38dcbe 100644
--- a/examples/c/reccalc/local.mk
+++ b/examples/c/reccalc/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2019 Free Software Foundation, Inc.
+## Copyright (C) 2019-2021 Free Software Foundation, Inc.
 ##
 ## This program is free software: you can redistribute it and/or modify
 ## it under the terms of the GNU General Public License as published by
@@ -11,7 +11,7 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 reccalcdir = $(docdir)/%D%
 
@@ -26,6 +26,8 @@
   BUILT_SOURCES += $(nodist_%C%_reccalc_SOURCES)
   # Don't use gnulib's system headers.
   %C%_reccalc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
+  # Fighting warnings triggered by Flex is just too painful.
+  # %C%_reccalc_CFLAGS = $(TEST_CFLAGS)
 endif FLEX_WORKS
 
 %D%/parse.c: $(dependencies)
@@ -69,7 +71,9 @@
 	$(AM_V_LEX)rm -f $@ $@.tmp
 	$(AM_V_at)$(MKDIR_P) %D%
 	$(AM_V_at)touch $@.tmp
-	$(AM_V_at)$(LEX) $(AM_LFLAGS) $(LFLAGS) -o%D%/scan.c --header-file=%D%/scan.h $(srcdir)/%D%/scan.l
+## --header introduced in 2.5.6, renamed as --header-file in 2.6.4.
+## Backward compatibility ensured since --header is an unambiguous prefix.
+	$(AM_V_at)$(LEX) $(AM_LFLAGS) $(LFLAGS) -o%D%/scan.c --header=%D%/scan.h $(srcdir)/%D%/scan.l
 	$(AM_V_at)mv $@.tmp $@
 
 
diff --git a/examples/c/reccalc/parse.y b/examples/c/reccalc/parse.y
index 6d64529..81d5bca 100644
--- a/examples/c/reccalc/parse.y
+++ b/examples/c/reccalc/parse.y
@@ -1,10 +1,33 @@
+/* Parser for reccalc.   -*- C -*-
+
+   Copyright (C) 2019-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 // Prologue (directives).
 %expect 0
 
 // Emitted in the header file, before the definition of YYSTYPE.
 %code requires
 {
+  #ifndef YY_TYPEDEF_YY_SCANNER_T
+  # define YY_TYPEDEF_YY_SCANNER_T
   typedef void* yyscan_t;
+  #endif
+
   typedef struct
   {
     // Whether to print the intermediate results.
@@ -22,7 +45,7 @@
   // Tell Flex the expected prototype of yylex.
   // The scanner argument must be named yyscanner.
 #define YY_DECL                                                         \
-  enum yytokentype yylex (YYSTYPE* yylval, yyscan_t yyscanner, result *res)
+  yytoken_kind_t yylex (YYSTYPE* yylval, yyscan_t yyscanner, result *res)
   YY_DECL;
 
   void yyerror (yyscan_t scanner, result *res, const char *msg, ...);
@@ -42,14 +65,29 @@
   result parse (void);
 }
 
+// Include the header in the implementation rather than duplicating it.
+%define api.header.include {"parse.h"}
+
+// Don't share global variables between the scanner and the parser.
 %define api.pure full
+
+// To avoid name clashes (e.g., with C's EOF) prefix token definitions
+// with TOK_ (e.g., TOK_EOF).
 %define api.token.prefix {TOK_}
+
+// Generate YYSTYPE from the types assigned to symbols.
 %define api.value.type union
-%define parse.error verbose
+
+// Error messages with "unexpected XXX, expected XXX...".
+%define parse.error detailed
+
+// Enable run-time traces (yydebug).
 %define parse.trace
+
+// Generate the parser description file (parse.output).
 %verbose
 
- // Scanner and error count are exchanged between main, yyparse and yylex.
+// Scanner and error count are exchanged between main, yyparse and yylex.
 %param {yyscan_t scanner}{result *res}
 
 %token
@@ -132,7 +170,6 @@
 
 %%
 // Epilogue (C code).
-
 #include "scan.h"
 
 result
diff --git a/examples/c/reccalc/reccalc.test b/examples/c/reccalc/reccalc.test
index 5d95b4e..7d28328 100644
--- a/examples/c/reccalc/reccalc.test
+++ b/examples/c/reccalc/reccalc.test
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2018-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,9 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+(seq 0) >/dev/null 2>&1 || skip "gimme one seq"
 
 cat >input <<EOF
 1+2*3
diff --git a/examples/c/reccalc/scan.l b/examples/c/reccalc/scan.l
index fbb781a..a80bf50 100644
--- a/examples/c/reccalc/scan.l
+++ b/examples/c/reccalc/scan.l
@@ -1,4 +1,23 @@
-/* Prologue (directives).   -*- C++ -*- */
+/* Scanner for reccalc.   -*- C -*-
+
+   Copyright (C) 2019-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Prologue (directives).   -*- C -*- */
 
 /* Disable Flex features we don't need, to avoid warnings. */
 %option nodefault noinput nounput noyywrap
@@ -17,10 +36,14 @@
 
 %%
 %{
+  // Number of opened parentheses.
   int nesting = 0;
+  // A buffer storing the text inside the outer parentheses.
   char *str = NULL;
-  int size = 0;
+  // Its allocated size.
   int capacity = 0;
+  // Its used size.
+  int size = 0;
 #define STR_APPEND()                                    \
   do {                                                  \
     if (capacity < size + yyleng + 1)                   \
@@ -28,9 +51,9 @@
         do                                              \
           capacity = capacity ? 2 * capacity : 128;     \
         while (capacity < size + yyleng + 1);           \
-        str = realloc (str, capacity);                  \
+        str = realloc (str, (size_t) capacity);         \
       }                                                 \
-    memcpy (str + size, yytext, yyleng);                \
+    memcpy (str + size, yytext, (size_t) yyleng);       \
     size += yyleng;                                     \
     assert (size < capacity);                           \
   } while (0)
diff --git a/examples/c/rpcalc/Makefile b/examples/c/rpcalc/Makefile
index 624f247..23ea410 100644
--- a/examples/c/rpcalc/Makefile
+++ b/examples/c/rpcalc/Makefile
@@ -3,12 +3,11 @@
 
 BASE = rpcalc
 BISON = bison
-XSLTPROC = xsltproc
 
 all: $(BASE)
 
-%.c %.xml %.gv: %.y
-	$(BISON) $(BISONFLAGS) --xml --graph=$*.gv -o $*.c $<
+%.c %.html %.gv: %.y
+	$(BISON) $(BISONFLAGS) --html --graph -o $*.c $<
 
 %: %.c
 	$(CC) $(CFLAGS) -o $@ $<
@@ -17,9 +16,5 @@
 	@echo "Type arithmetic expressions in Reverse Polish Notation.  Quit with ctrl-d."
 	./$<
 
-html: $(BASE).html
-%.html: %.xml
-	$(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $$($(BISON) --print-datadir)/xslt/xml2xhtml.xsl $<
-
 clean:
 	rm -f $(BASE) $(BASE).c $(BASE).html $(BASE).xml $(BASE).gv
diff --git a/examples/c/rpcalc/local.mk b/examples/c/rpcalc/local.mk
index bda0ba6..4f3f87d 100644
--- a/examples/c/rpcalc/local.mk
+++ b/examples/c/rpcalc/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2005-2006, 2008-2015, 2018-2019 Free Software
+## Copyright (C) 2005-2006, 2008-2015, 2018-2021 Free Software
 ## Foundation, Inc.
 ##
 ## This program is free software: you can redistribute it and/or modify
@@ -12,7 +12,7 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 ## -------------------- ##
 ## Building & testing.  ##
@@ -31,6 +31,7 @@
 %D%/rpcalc.c: $(dependencies)
 # Don't use gnulib's system headers.
 %C%_rpcalc_CPPFLAGS = -I$(top_builddir)/%D%
+%C%_rpcalc_CFLAGS = $(TEST_CFLAGS)
 %C%_rpcalc_LDADD = -lm
 
 dist_TESTS += %D%/rpcalc.test
diff --git a/examples/c/rpcalc/rpcalc.test b/examples/c/rpcalc/rpcalc.test
index 2c55fc8..348daf5 100755
--- a/examples/c/rpcalc/rpcalc.test
+++ b/examples/c/rpcalc/rpcalc.test
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2005-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2005-2015, 2018-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 cat >input <<EOF
 1 2 3 * +
diff --git a/examples/c/rpcalc/rpcalc.y b/examples/c/rpcalc/rpcalc.y
index eb514dc..bc67c58 100644
--- a/examples/c/rpcalc/rpcalc.y
+++ b/examples/c/rpcalc/rpcalc.y
@@ -1,3 +1,23 @@
+/* Parser for rpcalc.   -*- C -*-
+
+   Copyright (C) 1988-1993, 1995, 1998-2015, 2018-2021 Free Software
+   Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 /* Reverse Polish Notation calculator. */
 
 %{
@@ -39,6 +59,7 @@
    and tabs, and returns 0 for end-of-input. */
 
 #include <ctype.h>
+#include <stdlib.h>
 
 int
 yylex (void)
@@ -51,12 +72,13 @@
   if (c == '.' || isdigit (c))
     {
       ungetc (c, stdin);
-      scanf ("%lf", &yylval);
+      if (scanf ("%lf", &yylval) != 1)
+        abort ();
       return NUM;
     }
   /* Return end-of-input. */
   else if (c == EOF)
-    return 0;
+    return YYEOF;
   /* Return a single char. */
   else
     return c;
diff --git a/examples/d/Makefile b/examples/d/Makefile
deleted file mode 100644
index 45ae628..0000000
--- a/examples/d/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-# This Makefile is designed to be simple and readable.  It does not
-# aim at portability.  It requires GNU Make.
-
-BISON = bison
-DC = dmd
-XSLTPROC = xsltproc
-
-all: calc
-
-%.d %.xml %.gv: %.y
-	$(BISON) $(BISONFLAGS) --xml --graph=$*.gv -o $*.d $<
-
-%: %.d
-	$(DC) $(DCFLAGS) $<
-
-run: calc
-	@echo "Type arithmetic expressions.  Quit with ctrl-d."
-	./$<
-
-html: calc.html
-%.html: %.xml
-	$(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $$($(BISON) --print-datadir)/xslt/xml2xhtml.xsl $<
-
-clean:
-	rm -f calc calc.d calc.xml calc.gv calc.html *.o
diff --git a/examples/d/README.md b/examples/d/README.md
index 13ebe74..b060648 100644
--- a/examples/d/README.md
+++ b/examples/d/README.md
@@ -5,9 +5,12 @@
 You can run `make` to compile these examples.  And `make clean` to tidy
 afterwards.
 
-## d/calc.y
+## d/simple.y
 The usual calculator.
 
+## d/calc.y
+A richer implementation of the calculator, with location tracking.
+
 <!---
 
 Local Variables:
@@ -15,7 +18,7 @@
 ispell-dictionary: "american"
 End:
 
-Copyright (C) 2018-2019 Free Software Foundation, Inc.
+Copyright (C) 2018-2021 Free Software Foundation, Inc.
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.3 or
diff --git a/examples/d/calc.y b/examples/d/calc.y
deleted file mode 100644
index 7e0c5f1..0000000
--- a/examples/d/calc.y
+++ /dev/null
@@ -1,139 +0,0 @@
-%language "D"
-
-%define api.parser.class {Calc}
-%define parse.error verbose
-
-%union {
-  int ival;
-}
-
-/* Bison Declarations */
-%token EQ     "="
-       PLUS   "+"
-       MINUS  "-"
-       STAR   "*"
-       SLASH  "/"
-       LPAR   "("
-       RPAR   ")"
-       EOL    "end of line"
-%token <ival> NUM "number"
-%type  <ival> exp
-
-%left "-" "+"
-%left "*" "/"
-%precedence UNARY   /* unary operators */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line
-;
-
-line:
-  EOL
-| exp EOL           { writeln ($exp); }
-| error EOL
-;
-
-exp:
-  NUM                  { $$ = $1; }
-| exp "+" exp          { $$ = $1 + $3; }
-| exp "-" exp          { $$ = $1 - $3; }
-| exp "*" exp          { $$ = $1 * $3; }
-| exp "/" exp          { $$ = $1 / $3; }
-| "+" exp  %prec UNARY { $$ = -$2; }
-| "-" exp  %prec UNARY { $$ = -$2; }
-| "(" exp ")"          { $$ = $2; }
-;
-
-%%
-import std.range.primitives;
-import std.stdio;
-
-auto calcLexer(R)(R range)
-  if (isInputRange!R && is (ElementType!R : dchar))
-{
-  return new CalcLexer!R(range);
-}
-
-auto calcLexer (File f)
-{
-  import std.algorithm : map, joiner;
-  import std.utf : byDchar;
-
-  return f.byChunk(1024)        // avoid making a syscall roundtrip per char
-          .map!(chunk => cast(char[]) chunk) // because byChunk returns ubyte[]
-          .joiner               // combine chunks into a single virtual range of char
-          .calcLexer;           // forward to other overload
-}
-
-class CalcLexer(R) : Lexer
-  if (isInputRange!R && is (ElementType!R : dchar))
-{
-  R input;
-
-  this(R r) { input = r; }
-
-  // Should be a local in main, shared with %parse-param.
-  int exit_status = 0;
-
-  public void yyerror (string s)
-  {
-    exit_status = 1;
-    stderr.writeln (s);
-  }
-
-  YYSemanticType semanticVal_;
-
-  public final @property YYSemanticType semanticVal ()
-  {
-    return semanticVal_;
-  }
-
-  int yylex ()
-  {
-    import std.uni : isWhite, isNumber;
-
-    // Skip initial spaces
-    while (!input.empty && input.front != '\n' && isWhite (input.front))
-      input.popFront;
-
-    // Handle EOF.
-    if (input.empty)
-      return YYTokenType.EOF;
-
-    // Numbers.
-    if (input.front.isNumber)
-      {
-        import std.conv : parse;
-        semanticVal_.ival = input.parse!int;
-        return YYTokenType.NUM;
-      }
-
-    // Individual characters
-    auto ch = input.front;
-    input.popFront;
-    switch (ch)
-      {
-      case EOF: return YYTokenType.EOF;
-      case '=': return YYTokenType.EQ;
-      case '+': return YYTokenType.PLUS;
-      case '-': return YYTokenType.MINUS;
-      case '*': return YYTokenType.STAR;
-      case '/': return YYTokenType.SLASH;
-      case '(': return YYTokenType.LPAR;
-      case ')': return YYTokenType.RPAR;
-      case '\n': return YYTokenType.EOL;
-      default:  assert(0);
-      }
-  }
-}
-
-int main ()
-{
-  auto l = calcLexer (stdin);
-  auto p = new Calc (l);
-  p.parse ();
-  return l.exit_status;
-}
diff --git a/examples/d/calc/Makefile b/examples/d/calc/Makefile
new file mode 100644
index 0000000..e95960b
--- /dev/null
+++ b/examples/d/calc/Makefile
@@ -0,0 +1,20 @@
+# This Makefile is designed to be simple and readable.  It does not
+# aim at portability.  It requires GNU Make.
+
+BISON = bison
+DC = dmd
+
+all: calc
+
+%.d %.html %.gv: %.y
+	$(BISON) $(BISONFLAGS) --html --graph -o $*.d $<
+
+%: %.d
+	$(DC) $(DCFLAGS) $<
+
+run: calc
+	@echo "Type arithmetic expressions.  Quit with ctrl-d."
+	./$<
+
+clean:
+	rm -f calc calc.d calc.xml calc.gv calc.html *.o
diff --git a/examples/d/calc/calc.test b/examples/d/calc/calc.test
new file mode 100644
index 0000000..402a722
--- /dev/null
+++ b/examples/d/calc/calc.test
@@ -0,0 +1,51 @@
+#! /bin/sh
+
+# Copyright (C) 2018-2021 Free Software Foundation, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+cat >input <<EOF
+1 + 2 * 3
+EOF
+run 0 7
+
+cat >input <<EOF
++1 + +2 * +3
+EOF
+run 0 7
+
+cat >input <<EOF
+-1 + -2 * -3
+EOF
+run 0 5
+
+cat >input <<EOF
+1 + 2 * * 3
+EOF
+run 1 "err: 1.9: syntax error, unexpected *, expecting + or - or ( or number"
+
+cat >input <<EOF
+1111 + 1111 2222
+EOF
+run 1 "err: 1.13-16: syntax error, unexpected number"
+
+cat >input <<EOF
+1 +
+EOF
+run 1 "err: 1.4-2.0: syntax error, unexpected end of line, expecting + or - or ( or number"
+
+cat >input <<EOF
+99 009
+EOF
+run 1 "err: 1.4-6: syntax error, unexpected number"
diff --git a/examples/d/calc/calc.y b/examples/d/calc/calc.y
new file mode 100644
index 0000000..f2b0e8b
--- /dev/null
+++ b/examples/d/calc/calc.y
@@ -0,0 +1,188 @@
+/* Parser and scanner for calc in D.   -*- D -*-
+
+   Copyright (C) 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+%language "D"
+
+%define api.parser.class {Calc}
+%define api.push-pull push
+%define api.token.constructor
+%define api.value.type union
+%define parse.error detailed
+%define parse.trace
+
+%locations
+
+/* Bison Declarations */
+%token PLUS   "+"
+       MINUS  "-"
+       STAR   "*"
+       SLASH  "/"
+       LPAR   "("
+       RPAR   ")"
+       EOL    "end of line"
+%token <int> NUM "number"
+%type  <int> exp
+%printer { yyo.write($$); } <int>
+
+%left "-" "+"
+%left "*" "/"
+%precedence UNARY   /* unary operators */
+
+/* Grammar follows */
+%%
+input:
+  line
+| input line
+;
+
+line:
+  EOL
+| exp EOL           { writeln ($exp); }
+| error EOL         { yyerrok(); }
+;
+
+exp:
+  NUM                  { $$ = $1; }
+| exp "+" exp          { $$ = $1 + $3; }
+| exp "-" exp          { $$ = $1 - $3; }
+| exp "*" exp          { $$ = $1 * $3; }
+| exp "/" exp          { $$ = $1 / $3; }
+| "+" exp  %prec UNARY { $$ = $2; }
+| "-" exp  %prec UNARY { $$ = -$2; }
+| "(" exp ")"          { $$ = $2; }
+;
+
+%%
+import std.range.primitives;
+import std.stdio;
+
+auto calcLexer(R)(R range)
+if (isInputRange!R && is(ElementType!R : dchar))
+{
+  return new CalcLexer!R(range);
+}
+
+auto calcLexer(File f)
+{
+  import std.algorithm : map, joiner;
+  import std.utf : byDchar;
+
+  return f.byChunk(1024)        // avoid making a syscall roundtrip per char
+          .map!(chunk => cast(char[]) chunk) // because byChunk returns ubyte[]
+          .joiner               // combine chunks into a single virtual range of char
+          .calcLexer;           // forward to other overload
+}
+
+class CalcLexer(R) : Lexer
+if (isInputRange!R && is(ElementType!R : dchar))
+{
+  R input;
+
+  this(R r) { input = r; }
+
+  Location location;
+
+  // Should be a local in main, shared with %parse-param.
+  int exit_status = 0;
+
+  void yyerror(const Location loc, string s)
+  {
+    exit_status = 1;
+    stderr.writeln(loc.toString(), ": ", s);
+  }
+
+  Symbol yylex()
+  {
+    import std.uni : isWhite, isNumber;
+
+    // Skip initial spaces
+    while (!input.empty && input.front != '\n' && isWhite(input.front))
+    {
+      location.end.column++;
+      input.popFront;
+    }
+    location.step();
+
+    if (input.empty)
+      return Symbol.YYEOF(location);
+
+    // Numbers.
+    if (input.front.isNumber)
+    {
+      import std.compiler : version_minor;
+      static if (version_minor >= 95)
+      {
+        // from Dlang v2.095.0 onwards std.conv.parse reports
+        // the number of consumed characters
+        import std.typecons : Flag, Yes;
+        import std.conv : parse;
+        auto parsed = parse!(int, R, Yes.doCount)(input);
+        int ival = parsed.data;
+        location.end.column += cast(int) parsed.count;
+      }
+      else
+      {
+        auto copy = input;
+        import std.conv : parse;
+        int ival = input.parse!int;
+        while (!input.empty && copy.front != input.front)
+        {
+          location.end.column++;
+          copy.popFront;
+        }
+      }
+      return Symbol.NUM(ival, location);
+    }
+
+    // Individual characters
+    auto ch = input.front;
+    input.popFront;
+    location.end.column++;
+    switch (ch)
+    {
+      case '+':  return Symbol.PLUS(location);
+      case '-':  return Symbol.MINUS(location);
+      case '*':  return Symbol.STAR(location);
+      case '/':  return Symbol.SLASH(location);
+      case '(':  return Symbol.LPAR(location);
+      case ')':  return Symbol.RPAR(location);
+      case '\n':
+      {
+        location.end.line++;
+        location.end.column = 1;
+        return Symbol.EOL(location);
+      }
+      default: assert(0);
+    }
+  }
+}
+
+int main()
+{
+  auto l = calcLexer(stdin);
+  auto p = new Calc(l);
+  import core.stdc.stdlib : getenv;
+  if (getenv("YYDEBUG"))
+    p.setDebugLevel(1);
+  int status;
+  do {
+    status = p.pushParse(l.yylex());
+  } while (status == PUSH_MORE);
+  return l.exit_status;
+}
diff --git a/examples/d/calc/local.mk b/examples/d/calc/local.mk
new file mode 100644
index 0000000..995a7de
--- /dev/null
+++ b/examples/d/calc/local.mk
@@ -0,0 +1,36 @@
+## Copyright (C) 2018-2021 Free Software Foundation, Inc.
+##
+## This program is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+calcddir = $(docdir)/%D%
+
+## ------ ##
+## Calc.  ##
+## ------ ##
+
+if ENABLE_D
+  check_SCRIPTS += %D%/calc
+  TESTS += %D%/calc.test
+endif
+EXTRA_DIST += %D%/calc.test
+
+%D%/calc.d: %D%/calc.y $(dependencies)
+	$(AM_V_GEN)$(MKDIR_P) %D%
+	$(AM_V_at)$(BISON) -o $@ $(srcdir)/%D%/calc.y
+
+%D%/calc: %D%/calc.d
+	$(AM_V_GEN) $(DC) $(DCFLAGS) -of$@ %D%/calc.d
+
+dist_calcd_DATA = %D%/calc.y %D%/Makefile
+CLEANFILES += %D%/calc %D%/calc.[do]
diff --git a/examples/d/local.mk b/examples/d/local.mk
index e5b59a4..227c990 100644
--- a/examples/d/local.mk
+++ b/examples/d/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2018-2019 Free Software Foundation, Inc.
+## Copyright (C) 2018-2021 Free Software Foundation, Inc.
 ##
 ## This program is free software: you can redistribute it and/or modify
 ## it under the terms of the GNU General Public License as published by
@@ -11,26 +11,10 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 ddir = $(docdir)/%D%
+dist_d_DATA = %D%/README.md
 
-## ------ ##
-## Calc.  ##
-## ------ ##
-
-if ENABLE_D
-  check_SCRIPTS += %D%/calc
-  TESTS += %D%/calc.test
-endif
-EXTRA_DIST += %D%/calc.test
-
-%D%/calc.d: %D%/calc.y $(dependencies)
-	$(AM_V_GEN)$(MKDIR_P) %D%
-	$(AM_V_at)$(BISON) $(srcdir)/%D%/calc.y -o $@
-
-%D%/calc: %D%/calc.d
-	$(AM_V_GEN) $(DC) $(DCFLAGS) -of$@ %D%/calc.d
-
-dist_d_DATA = %D%/calc.y %D%/Makefile %D%/README.md
-CLEANFILES += %D%/calc %D%/calc.[do]
+include %D%/calc/local.mk
+include %D%/simple/local.mk
diff --git a/examples/d/simple/Makefile b/examples/d/simple/Makefile
new file mode 100644
index 0000000..e95960b
--- /dev/null
+++ b/examples/d/simple/Makefile
@@ -0,0 +1,20 @@
+# This Makefile is designed to be simple and readable.  It does not
+# aim at portability.  It requires GNU Make.
+
+BISON = bison
+DC = dmd
+
+all: calc
+
+%.d %.html %.gv: %.y
+	$(BISON) $(BISONFLAGS) --html --graph -o $*.d $<
+
+%: %.d
+	$(DC) $(DCFLAGS) $<
+
+run: calc
+	@echo "Type arithmetic expressions.  Quit with ctrl-d."
+	./$<
+
+clean:
+	rm -f calc calc.d calc.xml calc.gv calc.html *.o
diff --git a/examples/d/calc.test b/examples/d/simple/calc.test
similarity index 76%
rename from examples/d/calc.test
rename to examples/d/simple/calc.test
index 3073609..bfeddd0 100644
--- a/examples/d/calc.test
+++ b/examples/d/simple/calc.test
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2018-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 cat >input <<EOF
 1 + 2 * 3
@@ -21,6 +21,16 @@
 run 0 7
 
 cat >input <<EOF
++1 + +2 * +3
+EOF
+run 0 7
+
+cat >input <<EOF
+-1 + -2 * -3
+EOF
+run 0 5
+
+cat >input <<EOF
 1 + 2 * * 3
 EOF
 run 1 "err: syntax error, unexpected *, expecting + or - or ( or number"
diff --git a/examples/d/simple/calc.y b/examples/d/simple/calc.y
new file mode 100644
index 0000000..09c0626
--- /dev/null
+++ b/examples/d/simple/calc.y
@@ -0,0 +1,146 @@
+/* Parser and scanner for calc in D.   -*- D -*-
+
+   Copyright (C) 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+%language "D"
+
+%define api.parser.class {Calc}
+%define parse.error detailed
+
+%union {
+  int ival;
+}
+
+/* Bison Declarations */
+%token PLUS   "+"
+       MINUS  "-"
+       STAR   "*"
+       SLASH  "/"
+       LPAR   "("
+       RPAR   ")"
+       EOL    "end of line"
+%token <ival> NUM "number"
+%type  <ival> exp
+
+%left "-" "+"
+%left "*" "/"
+%precedence UNARY   /* unary operators */
+
+/* Grammar follows */
+%%
+input:
+  line
+| input line
+;
+
+line:
+  EOL
+| exp EOL           { writeln ($exp); }
+| error EOL         { yyerrok(); }
+;
+
+exp:
+  NUM                  { $$ = $1; }
+| exp "+" exp          { $$ = $1 + $3; }
+| exp "-" exp          { $$ = $1 - $3; }
+| exp "*" exp          { $$ = $1 * $3; }
+| exp "/" exp          { $$ = $1 / $3; }
+| "+" exp  %prec UNARY { $$ = $2; }
+| "-" exp  %prec UNARY { $$ = -$2; }
+| "(" exp ")"          { $$ = $2; }
+;
+
+%%
+import std.range.primitives;
+import std.stdio;
+
+auto calcLexer(R)(R range)
+if (isInputRange!R && is(ElementType!R : dchar))
+{
+  return new CalcLexer!R(range);
+}
+
+auto calcLexer(File f)
+{
+  import std.algorithm : map, joiner;
+  import std.utf : byDchar;
+
+  return f.byChunk(1024)        // avoid making a syscall roundtrip per char
+          .map!(chunk => cast(char[]) chunk) // because byChunk returns ubyte[]
+          .joiner               // combine chunks into a single virtual range of char
+          .calcLexer;           // forward to other overload
+}
+
+class CalcLexer(R) : Lexer
+if (isInputRange!R && is(ElementType!R : dchar))
+{
+  R input;
+
+  this(R r) { input = r; }
+
+  // Should be a local in main, shared with %parse-param.
+  int exit_status = 0;
+
+  public void yyerror(string s)
+  {
+    exit_status = 1;
+    stderr.writeln(s);
+  }
+
+  Symbol yylex()
+  {
+    import std.uni : isWhite, isNumber;
+
+    // Skip initial spaces
+    while (!input.empty && input.front != '\n' && isWhite(input.front))
+      input.popFront;
+
+    if (input.empty)
+      return Symbol(TokenKind.YYEOF);
+
+    // Numbers.
+    if (input.front.isNumber)
+    {
+      import std.conv : parse;
+      return Symbol(TokenKind.NUM, input.parse!int);
+    }
+
+    // Individual characters
+    auto ch = input.front;
+    input.popFront;
+    switch (ch)
+    {
+      case '+':  return Symbol(TokenKind.PLUS);
+      case '-':  return Symbol(TokenKind.MINUS);
+      case '*':  return Symbol(TokenKind.STAR);
+      case '/':  return Symbol(TokenKind.SLASH);
+      case '(':  return Symbol(TokenKind.LPAR);
+      case ')':  return Symbol(TokenKind.RPAR);
+      case '\n': return Symbol(TokenKind.EOL);
+      default: assert(0);
+    }
+  }
+}
+
+int main()
+{
+  auto l = calcLexer(stdin);
+  auto p = new Calc(l);
+  p.parse();
+  return l.exit_status;
+}
diff --git a/examples/d/simple/local.mk b/examples/d/simple/local.mk
new file mode 100644
index 0000000..0de4d5d
--- /dev/null
+++ b/examples/d/simple/local.mk
@@ -0,0 +1,36 @@
+## Copyright (C) 2018-2021 Free Software Foundation, Inc.
+##
+## This program is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+simpleddir = $(docdir)/%D%
+
+## ------ ##
+## Calc.  ##
+## ------ ##
+
+if ENABLE_D
+  check_SCRIPTS += %D%/calc
+  TESTS += %D%/calc.test
+endif
+EXTRA_DIST += %D%/calc.test
+
+%D%/calc.d: %D%/calc.y $(dependencies)
+	$(AM_V_GEN)$(MKDIR_P) %D%
+	$(AM_V_at)$(BISON) -o $@ $(srcdir)/%D%/calc.y
+
+%D%/calc: %D%/calc.d
+	$(AM_V_GEN) $(DC) $(DCFLAGS) -of$@ %D%/calc.d
+
+dist_simpled_DATA = %D%/calc.y %D%/Makefile
+CLEANFILES += %D%/calc %D%/calc.[do]
diff --git a/examples/extexi b/examples/extexi
index 3b7d907..5e50297 100755
--- a/examples/extexi
+++ b/examples/extexi
@@ -3,7 +3,7 @@
 
 # This file is part of GNU Bison
 
-# Copyright (C) 1992, 2000-2001, 2005-2006, 2009-2015, 2018-2019 Free
+# Copyright (C) 1992, 2000-2001, 2005-2006, 2009-2015, 2018-2021 Free
 # Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
@@ -17,27 +17,27 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 # Usage: extexi [OPTION...] input-file.texi ... -- [FILES to extract]
 
 # Look for @example environments preceded with lines such as:
 #
-#      @comment file calc.y
+#      @comment file c/mfcalc/calc.y
 # or
-#      @comment file calc.y: 3
+#      @comment file c/mfcalc/calc.y: 3
 #
-# and output their content in that file (calc.y).  When numbers are
-# provided, use them to decide the output order (block numbered 1 is
-# output before block 2, even if the latter appears before).  The same
-# number may be used several time, in which case the order of
+# and output their content in that file (c/mfcalc/calc.y).  When
+# numbers are provided, use them to decide the output order (block 1
+# is output before block 2, even if the latter appears before).  The
+# same number may be used several time, in which case the order of
 # appearance is used.
 #
 # Use @ignore for code to extract that must not be part of the
 # documentation.  For instance:
 #
 #      @ignore
-#      @comment file: calc++/scanner.ll
+#      @comment file: c++/calc++/scanner.ll
 #      @example
 #      // Work around an incompatibility in Flex.
 #      # undef yywrap
@@ -87,7 +87,9 @@
 # The list of files we should extract.
 my @file_wanted;
 
-# Whether we should extract that file, and then under which path.
+# Whether we should extract that file, and then under which path.  We
+# check if the prefix matches.  So for instance if "foo/bar.y" is
+# wanted (i.e., in @FILE_WANTED), "file: bar.y" matches.
 sub file_wanted ($)
 {
   my ($f) = @_;
diff --git a/examples/java/Calc.test b/examples/java/Calc.test
deleted file mode 100644
index d4fc41f..0000000
--- a/examples/java/Calc.test
+++ /dev/null
@@ -1,26 +0,0 @@
-#! /bin/sh
-
-# Copyright (C) 2018-2019 Free Software Foundation, Inc.
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-cat >input <<EOF
-1 + 2 * 3
-EOF
-run 0 7
-
-cat >input <<EOF
-1 + 2 * * 3
-EOF
-run 0 "err: 1.5: syntax error, unexpected '*', expecting number or '-' or '(' or '!'"
diff --git a/examples/java/Calc.y b/examples/java/Calc.y
deleted file mode 100644
index b69241b..0000000
--- a/examples/java/Calc.y
+++ /dev/null
@@ -1,168 +0,0 @@
-%language "Java"
-
-%define api.parser.class {Calc}
-%define api.parser.public
-
-%define parse.error verbose
-%locations
-
-%code imports {
-  import java.io.IOException;
-  import java.io.InputStream;
-  import java.io.InputStreamReader;
-  import java.io.Reader;
-  import java.io.StreamTokenizer;
-}
-
-%code {
-  public static void main (String args[]) throws IOException
-  {
-    CalcLexer l = new CalcLexer (System.in);
-    Calc p = new Calc (l);
-    p.parse ();
-  }
-}
-
-/* Bison Declarations */
-%token <Integer> NUM "number"
-%type  <Integer> exp
-
-%nonassoc '='       /* comparison            */
-%left '-' '+'
-%left '*' '/'
-%precedence NEG     /* negation--unary minus */
-%right '^'          /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line
-;
-
-line:
-  '\n'
-| exp '\n'           { System.out.println ($exp); }
-| error '\n'
-;
-
-exp:
-  NUM                { $$ = $1;                                             }
-| exp '=' exp
-  {
-    if ($1.intValue () != $3.intValue ())
-      yyerror (@$, "calc: error: " + $1 + " != " + $3);
-  }
-| exp '+' exp        { $$ = new Integer ($1.intValue () + $3.intValue ());  }
-| exp '-' exp        { $$ = new Integer ($1.intValue () - $3.intValue ());  }
-| exp '*' exp        { $$ = new Integer ($1.intValue () * $3.intValue ());  }
-| exp '/' exp        { $$ = new Integer ($1.intValue () / $3.intValue ());  }
-| '-' exp  %prec NEG { $$ = new Integer (-$2.intValue ());                  }
-| exp '^' exp        { $$ = new Integer ((int)
-                                         Math.pow ($1.intValue (),
-                                                   $3.intValue ()));        }
-| '(' exp ')'        { $$ = $2;                                             }
-| '(' error ')'      { $$ = new Integer (1111);                             }
-| '!'                { $$ = new Integer (0); return YYERROR;                }
-| '-' error          { $$ = new Integer (0); return YYERROR;                }
-;
-
-
-%%
-class CalcLexer implements Calc.Lexer {
-
-  StreamTokenizer st;
-
-  public CalcLexer (InputStream is)
-  {
-    st = new StreamTokenizer (new InputStreamReader (is));
-    st.resetSyntax ();
-    st.eolIsSignificant (true);
-    st.whitespaceChars ('\t', '\t');
-    st.whitespaceChars (' ', ' ');
-    st.wordChars ('0', '9');
-  }
-
-
-  Position yypos = new Position (1, 0);
-
-  public Position getStartPos () {
-    return yypos;
-  }
-
-  public Position getEndPos () {
-    return yypos;
-  }
-
-  public void yyerror (Calc.Location l, String s)
-  {
-    if (l == null)
-      System.err.println (s);
-    else
-      System.err.println (l + ": " + s);
-  }
-
-
-  Integer yylval;
-
-  public Object getLVal () {
-    return yylval;
-  }
-
-  public int yylex () throws IOException {
-    int ttype = st.nextToken ();
-    yypos = new Position (yypos.lineno (), yypos.token () + 1);
-    if (ttype == st.TT_EOF)
-      return EOF;
-    else if (ttype == st.TT_EOL)
-      {
-        yypos = new Position (yypos.lineno () + 1, 0);
-        return (int) '\n';
-      }
-    else if (ttype == st.TT_WORD)
-      {
-        yylval = new Integer (st.sval);
-        return NUM;
-      }
-    else
-      return st.ttype;
-  }
-}
-
-
-class Position {
-  public int line;
-  public int token;
-
-  public Position ()
-  {
-    line = 0;
-    token = 0;
-  }
-
-  public Position (int l, int t)
-  {
-    line = l;
-    token = t;
-  }
-
-  public boolean equals (Position l)
-  {
-    return l.line == line && l.token == token;
-  }
-
-  public String toString ()
-  {
-    return Integer.toString (line) + "." + Integer.toString(token);
-  }
-
-  public int lineno ()
-  {
-    return line;
-  }
-
-  public int token ()
-  {
-    return token;
-  }
-}
diff --git a/examples/java/README.md b/examples/java/README.md
index 9a6b99a..57b4a6b 100644
--- a/examples/java/README.md
+++ b/examples/java/README.md
@@ -5,8 +5,11 @@
 You can run `make` to compile these examples.  And `make clean` to tidy
 afterwards.
 
-## java/Calc.y
-The usual calculator.
+## simple/Calc.y
+The usual calculator, a very simple version.
+
+## calc/Calc.y
+The calculator, but with location tracking, debug traces, and a push parser.
 
 <!---
 
@@ -16,7 +19,7 @@
 ispell-dictionary: "american"
 End:
 
-Copyright (C) 2018-2019 Free Software Foundation, Inc.
+Copyright (C) 2018-2021 Free Software Foundation, Inc.
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.3 or
diff --git a/examples/d/calc.test b/examples/java/calc/Calc.test
similarity index 61%
copy from examples/d/calc.test
copy to examples/java/calc/Calc.test
index 3073609..7441a7d 100644
--- a/examples/d/calc.test
+++ b/examples/java/calc/Calc.test
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2018-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 cat >input <<EOF
 1 + 2 * 3
@@ -21,6 +21,18 @@
 run 0 7
 
 cat >input <<EOF
+1 + 2 * 3 = 7
+(1 + 2) * 3 = 9
+EOF
+run 0 '7
+9'
+
+cat >input <<EOF
 1 + 2 * * 3
 EOF
-run 1 "err: syntax error, unexpected *, expecting + or - or ( or number"
+run 0 "err: 1.9-1.10: syntax error: expected ! or - or ( or number before *"
+
+cat >input <<EOF
+12   222
+EOF
+run 0 "err: 1.6-1.9: syntax error: expected + or - or * or / or ^ or = or end of line before number"
diff --git a/examples/java/calc/Calc.y b/examples/java/calc/Calc.y
new file mode 100644
index 0000000..18bd038
--- /dev/null
+++ b/examples/java/calc/Calc.y
@@ -0,0 +1,317 @@
+/* Parser and scanner for calc in Java.   -*- Java -*-
+
+   Copyright (C) 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+%language "Java"
+
+%define api.parser.class {Calc}
+%define api.parser.public
+%define api.push-pull push
+
+// Customized syntax error messages (see reportSyntaxError)...
+%define parse.error custom
+
+// ... with locations...
+%locations
+
+// ... and accurate list of expected tokens.
+%define parse.lac full
+
+%define parse.trace
+
+%code imports {
+  import java.io.BufferedReader;
+  import java.io.IOException;
+  import java.io.InputStream;
+  import java.io.InputStreamReader;
+  import java.io.Reader;
+  import java.io.StreamTokenizer;
+  import java.nio.CharBuffer;
+}
+
+%code {
+  public static void main(String[] args) throws IOException {
+    CalcLexer scanner = new CalcLexer(System.in);
+    Calc parser = new Calc(scanner);
+    for (String arg : args)
+      if (arg.equals("-p"))
+        parser.setDebugLevel(1);
+    int status;
+    do {
+      int token = scanner.getToken();
+      Object lval = scanner.getValue();
+      Calc.Location yyloc = scanner.getLocation();
+      status = parser.push_parse(token, lval, yyloc);
+    } while (status == Calc.YYPUSH_MORE);
+    if (status != Calc.YYACCEPT)
+      System.exit(1);
+  }
+
+  static String i18n(String s) {
+    return s;
+  }
+}
+
+/* Bison Declarations */
+%token
+    BANG   "!"
+    PLUS   "+"
+    MINUS  "-"
+    STAR   "*"
+    SLASH  "/"
+    CARET  "^"
+    LPAREN "("
+    RPAREN ")"
+    EQUAL  "="
+    EOL    _("end of line")
+  <Integer>
+    NUM    _("number")
+%type  <Integer> exp
+
+%nonassoc "="       /* comparison            */
+%left "-" "+"
+%left "*" "/"
+%precedence NEG     /* negation--unary minus */
+%right "^"          /* exponentiation        */
+
+/* Grammar follows */
+%%
+input:
+  line
+| input line
+;
+
+line:
+  EOL
+| exp EOL            { System.out.println($exp); }
+| error EOL
+;
+
+exp:
+  NUM                { $$ = $1; }
+| exp "=" exp
+  {
+    if ($1.intValue() != $3.intValue())
+      yyerror(@$, "calc: error: " + $1 + " != " + $3);
+  }
+| exp "+" exp        { $$ = $1 + $3;  }
+| exp "-" exp        { $$ = $1 - $3;  }
+| exp "*" exp        { $$ = $1 * $3;  }
+| exp "/" exp        { $$ = $1 / $3;  }
+| "-" exp  %prec NEG { $$ = -$2; }
+| exp "^" exp        { $$ = (int) Math.pow($1, $3); }
+| "(" exp ")"        { $$ = $2; }
+| "(" error ")"      { $$ = 1111; }
+| "!"                { $$ = 0; return YYERROR; }
+| "-" error          { $$ = 0; return YYERROR; }
+;
+
+%%
+class CalcLexer implements Calc.Lexer {
+
+  StreamTokenizer st;
+  PositionReader reader;
+
+  public CalcLexer(InputStream is) {
+    reader = new PositionReader(new InputStreamReader(is));
+    st = new StreamTokenizer(reader);
+    st.resetSyntax();
+    st.eolIsSignificant(true);
+    st.wordChars('0', '9');
+  }
+
+  Position start = new Position(1, 0);
+  Position end = new Position(1, 0);
+
+  /**
+   * The location of the last token read.
+   * Implemented with getStartPos and getEndPos in pull parsers.
+   */
+  public Calc.Location getLocation() {
+    return new Calc.Location(new Position(start), new Position(end));
+  }
+
+  /**
+   * Build and emit a syntax error message.
+   */
+  public void reportSyntaxError(Calc.Context ctx) {
+    System.err.print(ctx.getLocation() + ": syntax error");
+    {
+      final int TOKENMAX = 10;
+      Calc.SymbolKind[] arg = new Calc.SymbolKind[TOKENMAX];
+      int n = ctx.getExpectedTokens(arg, TOKENMAX);
+      for (int i = 0; i < n; ++i)
+        System.err.print((i == 0 ? ": expected " : " or ")
+                         + arg[i].getName());
+    }
+    {
+      Calc.SymbolKind lookahead = ctx.getToken();
+      if (lookahead != null)
+        System.err.print(" before " + lookahead.getName());
+    }
+    System.err.println("");
+  }
+
+  /**
+   * Emit an error referring to the given location in a user-defined way.
+   *
+   * @@param loc The location of the element to which the
+   *                error message is related.
+   * @@param msg The string for the error message.
+   */
+  public void yyerror(Calc.Location loc, String msg) {
+    if (loc == null)
+      System.err.println(msg);
+    else
+      System.err.println(loc + ": " + msg);
+  }
+
+  Integer yylval;
+
+  /**
+   * The value of the last token read.  Called getLVal in pull parsers.
+   */
+  public Object getValue() {
+    return yylval;
+  }
+
+  /**
+   * Fetch the next token.  Called yylex in pull parsers.
+   */
+  public int getToken() throws IOException {
+    start.set(reader.getPosition());
+    int ttype = st.nextToken();
+    end.set(reader.getPosition());
+    switch (ttype) {
+    case StreamTokenizer.TT_EOF:
+      return YYEOF;
+    case StreamTokenizer.TT_EOL:
+      end.line += 1;
+      end.column = 0;
+      return EOL;
+    case StreamTokenizer.TT_WORD:
+      yylval = Integer.parseInt(st.sval);
+      end.set(reader.getPreviousPosition());
+      return NUM;
+    case ' ': case '\t':
+      return getToken();
+    case '!':
+      return BANG;
+    case '+':
+      return PLUS;
+    case '-':
+      return MINUS;
+    case '*':
+      return STAR;
+    case '/':
+      return SLASH;
+    case '^':
+      return CARET;
+    case '(':
+      return LPAREN;
+    case ')':
+      return RPAREN;
+    case '=':
+      return EQUAL;
+    default:
+      throw new AssertionError("invalid character: " + ttype);
+    }
+  }
+}
+
+/**
+ * A class defining a point in the input.
+ */
+class Position {
+  public int line = 1;
+  public int column = 1;
+
+  public Position() {
+    line = 1;
+    column = 1;
+  }
+
+  public Position(int l, int t) {
+    line = l;
+    column = t;
+  }
+
+  public Position(Position p) {
+    line = p.line;
+    column = p.column;
+  }
+
+  public void set(Position p) {
+    line = p.line;
+    column = p.column;
+  }
+
+  public boolean equals(Position l) {
+    return l.line == line && l.column == column;
+  }
+
+  public String toString() {
+    return Integer.toString(line) + "." + Integer.toString(column);
+  }
+
+  public int line() {
+    return line;
+  }
+
+  public int column() {
+    return column;
+  }
+}
+
+/**
+ * A Stream reader that keeps track of the current Position.
+ */
+class PositionReader extends BufferedReader {
+
+  private Position position = new Position();
+  // Position before the latest call to "read", i.e. position
+  // of the last character of the current token.
+  private Position previousPosition = new Position();
+
+  public PositionReader(Reader reader) {
+    super(reader);
+  }
+
+  public int read() throws IOException {
+    previousPosition.set(position);
+    int res = super.read();
+    if (res > -1) {
+      char c = (char) res;
+      if (c == '\r' || c == '\n') {
+        position.line += 1;
+        position.column = 1;
+      } else {
+        position.column += 1;
+      }
+    }
+    return res;
+  }
+
+  public Position getPosition() {
+    return position;
+  }
+
+  public Position getPreviousPosition() {
+    return previousPosition;
+  }
+}
diff --git a/examples/java/Makefile b/examples/java/calc/Makefile
similarity index 63%
rename from examples/java/Makefile
rename to examples/java/calc/Makefile
index 5a16520..9c7bf1e 100644
--- a/examples/java/Makefile
+++ b/examples/java/calc/Makefile
@@ -4,12 +4,11 @@
 BISON = bison
 JAVAC = javac
 JAVA = java
-XSLTPROC = xsltproc
 
 all: Calc.class
 
-%.java %.xml %.gv: %.y
-	$(BISON) $(BISONFLAGS) --xml --graph=$*.gv -o $*.java $<
+%.java %.html %.gv: %.y
+	$(BISON) $(BISONFLAGS) --html --graph -o $*.java $<
 
 %.class: %.java
 	$(JAVAC) $(JAVACFLAGS) $<
@@ -18,9 +17,5 @@
 	@echo "Type arithmetic expressions.  Quit with ctrl-d."
 	$(JAVA) $(JAVAFLAGS) Calc
 
-html: Calc.html
-%.html: %.xml
-	$(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $$($(BISON) --print-datadir)/xslt/xml2xhtml.xsl $<
-
 clean:
 	rm -f *.class Calc.java Calc.html Calc.xml Calc.gv
diff --git a/examples/java/calc/local.mk b/examples/java/calc/local.mk
new file mode 100644
index 0000000..be9d114
--- /dev/null
+++ b/examples/java/calc/local.mk
@@ -0,0 +1,36 @@
+## Copyright (C) 2018-2021 Free Software Foundation, Inc.
+##
+## This program is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+java_calcdir = $(docdir)/%D%
+
+## ------ ##
+## Calc.  ##
+## ------ ##
+
+if ENABLE_JAVA
+  check_SCRIPTS += %D%/Calc.class
+  TESTS += %D%/Calc.test
+endif
+EXTRA_DIST += %D%/Calc.test
+
+%D%/Calc.java: %D%/Calc.y $(dependencies)
+	$(AM_V_GEN)$(MKDIR_P) %D%
+	$(AM_V_at)$(BISON) -o $@ $(srcdir)/%D%/Calc.y
+
+%D%/Calc.class: %D%/Calc.java
+	$(AM_V_GEN) $(SHELL) $(top_builddir)/javacomp.sh %D%/Calc.java
+
+dist_java_calc_DATA = %D%/Calc.y %D%/Makefile
+CLEANFILES += %D%/*.class %D%/Calc.java
diff --git a/examples/java/local.mk b/examples/java/local.mk
index d165f33..5a976b4 100644
--- a/examples/java/local.mk
+++ b/examples/java/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2018-2019 Free Software Foundation, Inc.
+## Copyright (C) 2020-2021 Free Software Foundation, Inc.
 ##
 ## This program is free software: you can redistribute it and/or modify
 ## it under the terms of the GNU General Public License as published by
@@ -11,26 +11,10 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 javadir = $(docdir)/%D%
+dist_java_DATA = %D%/README.md
 
-## ------ ##
-## Calc.  ##
-## ------ ##
-
-if ENABLE_JAVA
-  check_SCRIPTS += %D%/Calc.class
-  TESTS += %D%/Calc.test
-endif
-EXTRA_DIST += %D%/Calc.test
-
-%D%/Calc.java: %D%/Calc.y $(dependencies)
-	$(AM_V_GEN)$(MKDIR_P) %D%
-	$(AM_V_at)$(BISON) $(srcdir)/%D%/Calc.y -o $@
-
-%D%/Calc.class: %D%/Calc.java
-	$(AM_V_GEN) $(SHELL) $(top_builddir)/javacomp.sh %D%/Calc.java
-
-dist_java_DATA = %D%/Calc.y %D%/Makefile %D%/README.md
-CLEANFILES += %D%/*.class %D%/Calc.java
+include %D%/calc/local.mk
+include %D%/simple/local.mk
diff --git a/examples/d/calc.test b/examples/java/simple/Calc.test
similarity index 70%
copy from examples/d/calc.test
copy to examples/java/simple/Calc.test
index 3073609..1316ca2 100644
--- a/examples/d/calc.test
+++ b/examples/java/simple/Calc.test
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2018-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 cat >input <<EOF
 1 + 2 * 3
@@ -21,6 +21,13 @@
 run 0 7
 
 cat >input <<EOF
+1 + 2 * 3 = 7
+(1 + 2) * 3 = 9
+EOF
+run 0 '7
+9'
+
+cat >input <<EOF
 1 + 2 * * 3
 EOF
-run 1 "err: syntax error, unexpected *, expecting + or - or ( or number"
+run 0 "err: syntax error, unexpected '*', expecting number or '-' or '(' or '!'"
diff --git a/examples/java/simple/Calc.y b/examples/java/simple/Calc.y
new file mode 100644
index 0000000..51699ed
--- /dev/null
+++ b/examples/java/simple/Calc.y
@@ -0,0 +1,125 @@
+/* Simple parser and scanner in Java.   -*- Java -*-
+
+   Copyright (C) 2018-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+%language "Java"
+
+%define api.parser.class {Calc}
+%define api.parser.public
+
+%define parse.error verbose
+
+%code imports {
+  import java.io.IOException;
+  import java.io.InputStream;
+  import java.io.InputStreamReader;
+  import java.io.Reader;
+  import java.io.StreamTokenizer;
+}
+
+%code {
+  public static void main(String[] args) throws IOException {
+    CalcLexer l = new CalcLexer(System.in);
+    Calc p = new Calc(l);
+    if (!p.parse())
+      System.exit(1);
+  }
+}
+
+/* Bison Declarations */
+%token <Integer> NUM "number"
+%type  <Integer> exp
+
+%nonassoc '='       /* comparison            */
+%left '-' '+'
+%left '*' '/'
+%precedence NEG     /* negation--unary minus */
+%right '^'          /* exponentiation        */
+
+/* Grammar follows */
+%%
+input:
+  line
+| input line
+;
+
+line:
+  '\n'
+| exp '\n'           { System.out.println($exp); }
+| error '\n'
+;
+
+exp:
+  NUM                { $$ = $1; }
+| exp '=' exp
+  {
+    if ($1.intValue() != $3.intValue())
+      yyerror("calc: error: " + $1 + " != " + $3);
+  }
+| exp '+' exp        { $$ = $1 + $3;  }
+| exp '-' exp        { $$ = $1 - $3;  }
+| exp '*' exp        { $$ = $1 * $3;  }
+| exp '/' exp        { $$ = $1 / $3;  }
+| '-' exp  %prec NEG { $$ = -$2; }
+| exp '^' exp        { $$ = (int) Math.pow($1, $3); }
+| '(' exp ')'        { $$ = $2; }
+| '(' error ')'      { $$ = 1111; }
+| '!'                { $$ = 0; return YYERROR; }
+| '-' error          { $$ = 0; return YYERROR; }
+;
+
+
+%%
+class CalcLexer implements Calc.Lexer {
+
+  StreamTokenizer st;
+
+  public CalcLexer(InputStream is) {
+    st = new StreamTokenizer(new InputStreamReader(is));
+    st.resetSyntax();
+    st.eolIsSignificant(true);
+    st.whitespaceChars('\t', '\t');
+    st.whitespaceChars(' ', ' ');
+    st.wordChars('0', '9');
+  }
+
+  public void yyerror(String s) {
+    System.err.println(s);
+  }
+
+  Integer yylval;
+
+  public Object getLVal() {
+    return yylval;
+  }
+
+  public int yylex() throws IOException {
+    int ttype = st.nextToken();
+    switch (ttype) {
+    case StreamTokenizer.TT_EOF:
+      return YYEOF;
+    case StreamTokenizer.TT_EOL:
+      return (int) '\n';
+    case StreamTokenizer.TT_WORD:
+      yylval = Integer.parseInt(st.sval);
+      return NUM;
+    default:
+      return ttype;
+    }
+  }
+}
diff --git a/examples/java/Makefile b/examples/java/simple/Makefile
similarity index 63%
copy from examples/java/Makefile
copy to examples/java/simple/Makefile
index 5a16520..9c7bf1e 100644
--- a/examples/java/Makefile
+++ b/examples/java/simple/Makefile
@@ -4,12 +4,11 @@
 BISON = bison
 JAVAC = javac
 JAVA = java
-XSLTPROC = xsltproc
 
 all: Calc.class
 
-%.java %.xml %.gv: %.y
-	$(BISON) $(BISONFLAGS) --xml --graph=$*.gv -o $*.java $<
+%.java %.html %.gv: %.y
+	$(BISON) $(BISONFLAGS) --html --graph -o $*.java $<
 
 %.class: %.java
 	$(JAVAC) $(JAVACFLAGS) $<
@@ -18,9 +17,5 @@
 	@echo "Type arithmetic expressions.  Quit with ctrl-d."
 	$(JAVA) $(JAVAFLAGS) Calc
 
-html: Calc.html
-%.html: %.xml
-	$(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $$($(BISON) --print-datadir)/xslt/xml2xhtml.xsl $<
-
 clean:
 	rm -f *.class Calc.java Calc.html Calc.xml Calc.gv
diff --git a/examples/java/simple/local.mk b/examples/java/simple/local.mk
new file mode 100644
index 0000000..2566161
--- /dev/null
+++ b/examples/java/simple/local.mk
@@ -0,0 +1,36 @@
+## Copyright (C) 2018-2021 Free Software Foundation, Inc.
+##
+## This program is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+java_simpledir = $(docdir)/%D%
+
+## ------ ##
+## Calc.  ##
+## ------ ##
+
+if ENABLE_JAVA
+  check_SCRIPTS += %D%/Calc.class
+  TESTS += %D%/Calc.test
+endif
+EXTRA_DIST += %D%/Calc.test
+
+%D%/Calc.java: %D%/Calc.y $(dependencies)
+	$(AM_V_GEN)$(MKDIR_P) %D%
+	$(AM_V_at)$(BISON) -o $@ $(srcdir)/%D%/Calc.y
+
+%D%/Calc.class: %D%/Calc.java
+	$(AM_V_GEN) $(SHELL) $(top_builddir)/javacomp.sh %D%/Calc.java
+
+dist_java_simple_DATA = %D%/Calc.y %D%/Makefile
+CLEANFILES += %D%/*.class %D%/Calc.java
diff --git a/examples/local.mk b/examples/local.mk
index db6fe65..b43943f 100644
--- a/examples/local.mk
+++ b/examples/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2005, 2008-2015, 2018-2019 Free Software Foundation,
+## Copyright (C) 2005, 2008-2015, 2018-2021 Free Software Foundation,
 ## Inc.
 ##
 ## This program is free software: you can redistribute it and/or modify
@@ -12,7 +12,7 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 
 ## Because some of our examples use
@@ -35,6 +35,9 @@
 dist_noinst_SCRIPTS = %D%/extexi %D%/test
 TEST_LOG_COMPILER = $(SHELL) $(top_srcdir)/%D%/test
 
+TEST_CFLAGS =						\
+  $(WARN_CFLAGS) $(WARN_CFLAGS_TEST) $(WERROR_CFLAGS)
+
 AM_CXXFLAGS =							\
   $(WARN_CXXFLAGS) $(WARN_CXXFLAGS_TEST) $(WERROR_CXXFLAGS)
 
@@ -90,6 +93,9 @@
 
 CLEANDIRS += %D%/*.dSYM
 
+.PHONY: check-examples
+check-examples: check-TESTS
+
 include %D%/c/local.mk
 include %D%/c++/local.mk
 include %D%/d/local.mk
diff --git a/examples/test b/examples/test
index d987d09..a537062 100755
--- a/examples/test
+++ b/examples/test
@@ -1,6 +1,6 @@
 #! /bin/sh
 
-# Copyright (C) 2005-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2005-2015, 2018-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 SHELL=/bin/sh
 export SHELL
@@ -25,24 +25,37 @@
 number=1
 
 # Exit status of this script.
-exit=true
+status=0
 
 # top_builddir.
 cwd=$(pwd)
 
+# Whether to strip '> ...' lines from the expected output.
+# See bistromathic.test.
+strip_prompt=false
+
+# If diff supports --strip-trailing-cr, use it, to avoid EOL issues
+# when testing Java programs on Windows.
+echo "checking for diff --strip-trailing-cr..."
+diff_opts=
+if diff --strip-trailing-cr "$1" "$1"; then
+  diff_opts=--strip-trailing-cr
+fi
+echo "checking for diff --strip-trailing-cr... $diff_opts"
+
 # The exercised program.
-for p in "$cwd/examples/$medir/$me"
-do
-    if test -x "$p"; then
-        prog=$p
-        break
-    elif test -f "$p.class"; then
-        pwd
-        prog="$SHELL $cwd/javaexec.sh -cp $(dirname $p) $(basename $p)"
-        break
-    fi
-done
-if test x"$prog" = x; then
+abs_medir=$cwd/examples/$medir
+if test -x "$abs_medir/$me"; then
+    prog ()
+    {
+        "$abs_medir/$me" "$@"
+    }
+elif test -f "$abs_medir/$me.class"; then
+    prog ()
+    {
+        "$SHELL" "$cwd/javaexec.sh" -cp "$abs_medir" "$me" "$@"
+    }
+else
     echo "$me: ERROR: cannot find program to exercise in:"
     echo "$me: ERROR:   $cwd/examples/$medir/$me"
     exit 1
@@ -55,7 +68,7 @@
 {
   status=$?
   if test -z "$DEBUG"; then
-     cd $cwd
+     cd "$cwd"
      rm -rf $$.dir
   fi
   exit $status
@@ -64,47 +77,100 @@
 mkdir $$.dir
 cd $$.dir
 
-# run [-noerr] EXPECTED-EXIT-STATUS EXPECTED-OUTPUT [PARSER-OPTIONS]
-# ------------------------------------------------------------------
+
+# skip [MSG]
+# ----------
+# Skip this test.
+skip ()
+{
+  if test x"$1" != x; then
+    echo "SKIP: $1"
+  fi
+  # See Autoconf's doc on 'trap'.
+  (exit 77); exit 77
+}
+
+
+# run [-n, -noerr, -t] EXPECTED-EXIT-STATUS EXPECTED-OUTPUT [PARSER-OPTIONS]
+# --------------------------------------------------------------------------
+# -n: no final end-of-line in expected-output
 # -noerr: ignore stderr, otherwise merge it into effective output.
+# -t: nuke the possible trailing white spaces in the effective output.
 run ()
 {
+  echo=echo
   noerr=false
-  case $1 in
-    (-noerr) noerr=true; shift;;
-  esac
+  rstrip=false
+  while true; do
+    case $1 in
+      (-n)     echo=printf; shift;;
+      (-noerr) noerr=true; shift;;
+      (-t)     rstrip=true; shift;;
+      (*)      break;;
+    esac
+  done
 
   # Expected exit status.
   sta_exp=$1
   shift
+
   # Expected output.
-  out_exp=$1
+  $echo "$1" |
+    sed -e 's/Reducing stack by rule .* (line .*):/Reducing stack by rule XX (line XXX):/g' |
+    if $strip_prompt; then
+      # An extra EOL added in bistromathic's main.  Keep that empty line.
+      sed -e '/^> ./d;s/^> $//g'
+    else
+      cat
+    fi >exp
   shift
+
   # Effective exit status.
   sta_eff=0
-  $prog "$@" - <input >out_eff 2>err_eff || sta_eff=$?
+
+  prog "$@" - <input >out_eff 2>err_eff || sta_eff=$?
+
   # Combine effective output and error streams.
-  out_eff=$(cat out_eff && $noerr || sed -e 's/^/err: /g' err_eff)
+  {
+    if $rstrip; then
+      sed -e 's/ *$//g' out_eff
+    else
+      cat out_eff
+    fi
+    if ! $noerr; then
+       sed -e 's/^/err: /g' \
+           -e 's/Reducing stack by rule .* (line .*):/Reducing stack by rule XX (line XXX):/g' \
+           err_eff
+    fi
+  } >eff
+
   if test $sta_eff -eq $sta_exp; then
-    if test "$out_eff" = "$out_exp"; then
+    if diff $diff_opts eff exp >/dev/null 2>&1; then
       echo "$me: PASS: $number"
     else
-      echo "$me: FAIL: $number (expected output: $out_exp, effective: $out_eff)"
-      cat err_eff
-      exit=false
+      echo "$me: FAIL: $number"
+      echo "$me: input:"
+      sed -e 's/^/  /' input
+      echo "$me: expected output:"
+      sed -e 's/^/  /' exp
+      echo "$me: effective output:"
+      sed -e 's/^/  /' eff
+      echo "$me: diff:"
+      diff $diff_opts -u exp eff | sed -e 's/^/  /'
+      status=1
     fi
   else
     echo "$me: FAIL: $number (expected status: $sta_exp, effective: $sta_eff)"
     cat err_eff
-    exit=false
+    status=1
   fi
   number=$(expr $number + 1)
 }
 
 # We have cd'd one level deeper.
 case $1 in
-  /*) . "$1";;
-  *)  . "../$1";;
+  /*) . "$1" || status=2;;
+  *)  . "../$1" || status=2;;
 esac
 
-$exit
+exit $status
diff --git a/gnulib-po/Makevars b/gnulib-po/Makevars
index f6a27a3..061cc6e 100644
--- a/gnulib-po/Makevars
+++ b/gnulib-po/Makevars
@@ -1,5 +1,5 @@
 ## DO NOT EDIT! GENERATED AUTOMATICALLY!
-# Copyright (C) 2002-2019 Free Software Foundation, Inc.
+# Copyright (C) 2002-2021 Free Software Foundation, Inc.
 #
 # This file is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/gnulib-po/POTFILES.in b/gnulib-po/POTFILES.in
index 962726f..3780bf8 100644
--- a/gnulib-po/POTFILES.in
+++ b/gnulib-po/POTFILES.in
@@ -1,5 +1,5 @@
 ## DO NOT EDIT! GENERATED AUTOMATICALLY!
-# Copyright (C) 2002-2019 Free Software Foundation, Inc.
+# Copyright (C) 2002-2021 Free Software Foundation, Inc.
 #
 # This file is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -23,6 +23,7 @@
 
 # List of files which contain translatable strings.
 lib/_Noreturn.h
+lib/access.c
 lib/alignof.h
 lib/alloca.in.h
 lib/allocator.c
@@ -35,7 +36,10 @@
 lib/asnprintf.c
 lib/asprintf.c
 lib/assure.h
+lib/at-func.c
+lib/attribute.h
 lib/basename-lgpl.c
+lib/basename-lgpl.h
 lib/basename.c
 lib/binary-io.c
 lib/binary-io.h
@@ -65,40 +69,62 @@
 lib/c-strncasecmp.c
 lib/calloc.c
 lib/canonicalize-lgpl.c
+lib/canonicalize.c
+lib/canonicalize.h
 lib/careadlinkat.c
 lib/careadlinkat.h
 lib/cdefs.h
+lib/chdir-long.c
+lib/chdir-long.h
 lib/cloexec.c
 lib/cloexec.h
 lib/close-stream.c
 lib/close-stream.h
 lib/close.c
+lib/closedir.c
 lib/closeout.c
 lib/closeout.h
 lib/concat-filename.c
 lib/concat-filename.h
 lib/diffseq.h
+lib/dirent-private.h
+lib/dirent.in.h
+lib/dirfd.c
 lib/dirname-lgpl.c
 lib/dirname.c
 lib/dirname.h
-lib/dosname.h
 lib/dup-safer-flag.c
 lib/dup-safer.c
+lib/dup.c
 lib/dup2.c
+lib/eloop-threshold.h
 lib/errno.in.h
 lib/error.c
 lib/error.h
+lib/execute.c
+lib/execute.h
 lib/exitfail.c
 lib/exitfail.h
 lib/fatal-signal.c
 lib/fatal-signal.h
+lib/fchdir.c
 lib/fcntl.c
 lib/fcntl.in.h
 lib/fd-hook.c
 lib/fd-hook.h
 lib/fd-safer-flag.c
 lib/fd-safer.c
+lib/fdopendir.c
+lib/ffs.c
+lib/ffsl.c
+lib/ffsl.h
+lib/file-set.c
+lib/file-set.h
 lib/filename.h
+lib/filenamecat-lgpl.c
+lib/filenamecat.h
+lib/findprog-in.c
+lib/findprog.h
 lib/float+.h
 lib/float.c
 lib/float.in.h
@@ -108,17 +134,23 @@
 lib/fpending.h
 lib/fprintf.c
 lib/fpucw.h
+lib/free.c
 lib/frexp.c
 lib/frexpl.c
 lib/fseterr.c
 lib/fseterr.h
 lib/fstat.c
+lib/fstatat.c
 lib/fstrcmp.c
 lib/fstrcmp.h
 lib/fsync.c
+lib/getcwd-lgpl.c
+lib/getcwd.c
+lib/getdelim.c
 lib/getdtablesize.c
 lib/gethrxtime.c
 lib/gethrxtime.h
+lib/getline.c
 lib/getopt-cdefs.in.h
 lib/getopt-core.h
 lib/getopt-ext.h
@@ -134,12 +166,39 @@
 lib/gettext.h
 lib/gettime.c
 lib/gettimeofday.c
+lib/gl_anyhash1.h
+lib/gl_anyhash2.h
+lib/gl_anyhash_primes.h
+lib/gl_anylinked_list1.h
+lib/gl_anylinked_list2.h
+lib/gl_anyrbtree_list1.h
+lib/gl_anyrbtree_list2.h
+lib/gl_anytree_list1.h
+lib/gl_anytree_list2.h
+lib/gl_anytree_oset.h
+lib/gl_anytreehash_list1.h
+lib/gl_anytreehash_list2.h
 lib/gl_array_list.c
 lib/gl_array_list.h
+lib/gl_hash_map.c
+lib/gl_hash_map.h
+lib/gl_linked_list.c
+lib/gl_linked_list.h
 lib/gl_list.c
 lib/gl_list.h
+lib/gl_map.c
+lib/gl_map.h
+lib/gl_oset.c
+lib/gl_oset.h
+lib/gl_rbtree_ordered.h
+lib/gl_rbtree_oset.c
+lib/gl_rbtree_oset.h
+lib/gl_rbtreehash_list.c
+lib/gl_rbtreehash_list.h
 lib/gl_xlist.c
 lib/gl_xlist.h
+lib/gl_xmap.c
+lib/gl_xmap.h
 lib/glthread/lock.c
 lib/glthread/lock.h
 lib/glthread/threadlib.c
@@ -147,8 +206,28 @@
 lib/glthread/tls.h
 lib/hard-locale.c
 lib/hard-locale.h
+lib/hash-pjw.c
+lib/hash-pjw.h
+lib/hash-triple-simple.c
+lib/hash-triple.h
 lib/hash.c
 lib/hash.h
+lib/ialloc.c
+lib/ialloc.h
+lib/iconv.c
+lib/iconv.in.h
+lib/iconv_close.c
+lib/iconv_open-aix.gperf
+lib/iconv_open-hpux.gperf
+lib/iconv_open-irix.gperf
+lib/iconv_open-osf.gperf
+lib/iconv_open-solaris.gperf
+lib/iconv_open-zos.gperf
+lib/iconv_open.c
+lib/idx.h
+lib/integer_length.c
+lib/integer_length.h
+lib/integer_length_l.c
 lib/intprops.h
 lib/inttypes.in.h
 lib/isnan.c
@@ -159,16 +238,24 @@
 lib/isnanl-nolibm.h
 lib/isnanl.c
 lib/iswblank.c
+lib/iswdigit.c
+lib/iswxdigit.c
 lib/itold.c
+lib/lc-charset-dispatch.c
+lib/lc-charset-dispatch.h
 lib/ldexpl.c
 lib/libc-config.h
 lib/limits.in.h
 lib/localcharset.c
 lib/localcharset.h
-lib/localtime-buffer.c
-lib/localtime-buffer.h
+lib/locale.in.h
 lib/lstat.c
 lib/malloc.c
+lib/malloc/scratch_buffer.h
+lib/malloc/scratch_buffer_dupfree.c
+lib/malloc/scratch_buffer_grow.c
+lib/malloc/scratch_buffer_grow_preserve.c
+lib/malloc/scratch_buffer_set_array_size.c
 lib/malloca.c
 lib/malloca.h
 lib/math.c
@@ -177,12 +264,18 @@
 lib/mbchar.h
 lib/mbfile.c
 lib/mbfile.h
+lib/mbrtowc-impl-utf8.h
+lib/mbrtowc-impl.h
 lib/mbrtowc.c
 lib/mbsinit.c
 lib/mbswidth.c
 lib/mbswidth.h
+lib/mbtowc-lock.c
+lib/mbtowc-lock.h
 lib/memchr.c
 lib/memchr.valgrind
+lib/mempcpy.c
+lib/memrchr.c
 lib/minmax.h
 lib/msvc-inval.c
 lib/msvc-inval.h
@@ -192,9 +285,18 @@
 lib/obstack.h
 lib/obstack_printf.c
 lib/open.c
+lib/openat-die.c
+lib/openat-priv.h
+lib/openat-proc.c
+lib/openat.c
+lib/openat.h
+lib/opendir.c
+lib/os2-spawn.c
+lib/os2-spawn.h
 lib/pathmax.h
 lib/perror.c
 lib/pipe-safer.c
+lib/pipe.c
 lib/pipe2-safer.c
 lib/pipe2.c
 lib/printf-args.c
@@ -215,16 +317,27 @@
 lib/raise.c
 lib/rawmemchr.c
 lib/rawmemchr.valgrind
+lib/readdir.c
+lib/readline.c
+lib/readline.h
 lib/readlink.c
 lib/realloc.c
+lib/reallocarray.c
 lib/relocatable.c
 lib/relocatable.h
 lib/relocwrapper.c
 lib/rename.c
+lib/rewinddir.c
 lib/rmdir.c
 lib/same-inode.h
+lib/save-cwd.c
+lib/save-cwd.h
 lib/sched.in.h
+lib/scratch_buffer.h
 lib/setenv.c
+lib/setlocale-lock.c
+lib/setlocale_null.c
+lib/setlocale_null.h
 lib/sig-handler.c
 lib/sig-handler.h
 lib/sigaction.c
@@ -237,7 +350,9 @@
 lib/snprintf.c
 lib/spawn-pipe.c
 lib/spawn-pipe.h
+lib/spawn.c
 lib/spawn.in.h
+lib/spawn_faction_addchdir.c
 lib/spawn_faction_addclose.c
 lib/spawn_faction_adddup2.c
 lib/spawn_faction_addopen.c
@@ -247,6 +362,7 @@
 lib/spawnattr_destroy.c
 lib/spawnattr_init.c
 lib/spawnattr_setflags.c
+lib/spawnattr_setpgroup.c
 lib/spawnattr_setsigmask.c
 lib/spawni.c
 lib/spawnp.c
@@ -256,6 +372,7 @@
 lib/stat-w32.c
 lib/stat-w32.h
 lib/stat.c
+lib/stdalign.in.h
 lib/stdbool.in.h
 lib/stddef.in.h
 lib/stdint.in.h
@@ -265,6 +382,7 @@
 lib/stdio.in.h
 lib/stdlib.in.h
 lib/stpcpy.c
+lib/stpncpy.c
 lib/strchrnul.c
 lib/strchrnul.valgrind
 lib/strdup.c
@@ -274,26 +392,37 @@
 lib/strerror.c
 lib/strerror_r.c
 lib/string.in.h
+lib/strings.in.h
 lib/stripslash.c
 lib/strndup.c
 lib/strnlen.c
+lib/strtod.c
 lib/strverscmp.c
+lib/sys_ioctl.in.h
 lib/sys_resource.in.h
 lib/sys_stat.in.h
 lib/sys_time.in.h
 lib/sys_times.in.h
 lib/sys_types.in.h
 lib/sys_wait.in.h
+lib/termios.in.h
 lib/textstyle.in.h
+lib/thread-optim.h
 lib/time.in.h
 lib/timespec.c
 lib/timespec.h
 lib/timevar.c
 lib/timevar.h
+lib/unicodeio.c
+lib/unicodeio.h
 lib/unistd--.h
 lib/unistd-safer.h
 lib/unistd.c
 lib/unistd.in.h
+lib/unistr.in.h
+lib/unistr/u8-mbtoucr.c
+lib/unistr/u8-uctomb-aux.c
+lib/unistr/u8-uctomb.c
 lib/unitypes.in.h
 lib/uniwidth.in.h
 lib/uniwidth/cjk.h
@@ -308,7 +437,6 @@
 lib/vfprintf.c
 lib/vsnprintf.c
 lib/vsprintf.c
-lib/w32spawn.h
 lib/wait-process.c
 lib/wait-process.h
 lib/waitpid.c
@@ -326,6 +454,8 @@
 lib/windows-recmutex.h
 lib/windows-rwlock.c
 lib/windows-rwlock.h
+lib/windows-spawn.c
+lib/windows-spawn.h
 lib/windows-tls.c
 lib/windows-tls.h
 lib/xalloc-die.c
diff --git a/gnulib-po/af.gmo b/gnulib-po/af.gmo
index 957841b..35ea37a 100644
--- a/gnulib-po/af.gmo
+++ b/gnulib-po/af.gmo
Binary files differ
diff --git a/gnulib-po/af.po b/gnulib-po/af.po
index 4d1663c..f35ebe8 100644
--- a/gnulib-po/af.po
+++ b/gnulib-po/af.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: coreutils 5.2.1\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2004-03-17 11:58+0200\n"
 "Last-Translator: Petri Jooste <rkwjpj@puk.ac.za>\n"
 "Language-Team: Afrikaans <i18n@af.org.za>\n"
@@ -31,71 +31,71 @@
 msgid "Valid arguments are:"
 msgstr "Geldige parameters is soos volg:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "kan nie die skakel %s skep nie"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "kan nie die skakel %s skep nie"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "kan nie %s oopmaak om te lees nie"
@@ -108,6 +108,12 @@
 msgid "Unknown system error"
 msgstr "Onbekende stelselfout"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s: seek het misluk"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -143,10 +149,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: opsie benodig 'n parameter -- %c\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "geheue uitgeput"
 
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "kon nie na aanvanklike werkgids terugkeer nie"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "kon nie na aanvanklike werkgids terugkeer nie"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -168,26 +194,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "`"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "'"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, fuzzy, c-format
 msgid "cannot create pipe"
 msgstr "kan nie die skakel %s skep nie"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, fuzzy, c-format
-msgid "%s subprocess failed"
-msgstr "%s: seek het misluk"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -204,22 +224,34 @@
 msgid "wall clock"
 msgstr ""
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr ""
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "iconv-funksie onbruikbaar"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr ""
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "iconv-funksie is nie beskikbaar nie"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "karakter is buite die grense"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "kan nie U+%04X omskakel na 'n plaaslike karakterstel nie"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "kan nie U+%04X omskakel na 'n plaaslike karakterstel nie: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, fuzzy, c-format
 msgid "%s subprocess"
 msgstr "%s: seek het misluk"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, fuzzy, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s: seek het misluk"
@@ -449,13 +481,6 @@
 #~ msgstr "kan nie toegangsregte van %s verander nie"
 
 #, fuzzy
-#~ msgid "unable to record current working directory"
-#~ msgstr "kon nie na aanvanklike werkgids terugkeer nie"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "kon nie na aanvanklike werkgids terugkeer nie"
-
-#, fuzzy
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "magtigings vir %s kon nie behou word nie"
 
@@ -493,21 +518,6 @@
 #~ msgid "^[nN]"
 #~ msgstr "^[nN]"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "iconv-funksie onbruikbaar"
-
-#~ msgid "iconv function not available"
-#~ msgstr "iconv-funksie is nie beskikbaar nie"
-
-#~ msgid "character out of range"
-#~ msgstr "karakter is buite die grense"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "kan nie U+%04X omskakel na 'n plaaslike karakterstel nie"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "kan nie U+%04X omskakel na 'n plaaslike karakterstel nie: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "ongeldige gebruiker"
 
diff --git a/gnulib-po/be.gmo b/gnulib-po/be.gmo
index 2fed111..74010aa 100644
--- a/gnulib-po/be.gmo
+++ b/gnulib-po/be.gmo
Binary files differ
diff --git a/gnulib-po/be.po b/gnulib-po/be.po
index f513091..a314469 100644
--- a/gnulib-po/be.po
+++ b/gnulib-po/be.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: coreutils 5.0.91\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2003-10-30 01:10+0200\n"
 "Last-Translator: Ales Nyakhaychyk <nab@mail.by>\n"
 "Language-Team: Belarusian <i18n@mova.org>\n"
@@ -34,71 +34,71 @@
 msgid "Valid arguments are:"
 msgstr "Рэчаісныя довады:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "немагчыма стварыць лучыва %s"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "немагчыма стварыць лучыва %s"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "немагыма адчыніць %s для чытаньня"
@@ -111,6 +111,12 @@
 msgid "Unknown system error"
 msgstr "Невядомая сыстэмная памылка"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s: збой seek"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -146,10 +152,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: выбар патрабуе довад -- %c\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "памяць вычарпана"
 
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "немагчыма вярнуцца ў пачатковую працоўную тэчку"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "немагчыма вярнуцца ў пачатковую працоўную тэчку"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -171,26 +197,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "`"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "'"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, fuzzy, c-format
 msgid "cannot create pipe"
 msgstr "немагчыма стварыць лучыва %s"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, fuzzy, c-format
-msgid "%s subprocess failed"
-msgstr "%s: збой seek"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -207,22 +227,34 @@
 msgid "wall clock"
 msgstr ""
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr ""
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "функцыя iconv непрыгодна для выкарыстаньня"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr ""
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "недаступна функцыя iconv"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "знак па за дапушчальнымі межамі"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "немагчыма пераўтварыць U+%04X у мясцовы набор знакаў"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "немагчыма пераўтварыць U+%04X у мясцовы набор знакаў: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, fuzzy, c-format
 msgid "%s subprocess"
 msgstr "%s: збой seek"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, fuzzy, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s: збой seek"
@@ -435,13 +467,6 @@
 #~ msgstr "немагчыма зьмяніць правы %s"
 
 #, fuzzy
-#~ msgid "unable to record current working directory"
-#~ msgstr "немагчыма вярнуцца ў пачатковую працоўную тэчку"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "немагчыма вярнуцца ў пачатковую працоўную тэчку"
-
-#, fuzzy
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "збой пры захаваньні правоў для %s"
 
@@ -479,21 +504,6 @@
 #~ msgid "^[nN]"
 #~ msgstr "^[нН]"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "функцыя iconv непрыгодна для выкарыстаньня"
-
-#~ msgid "iconv function not available"
-#~ msgstr "недаступна функцыя iconv"
-
-#~ msgid "character out of range"
-#~ msgstr "знак па за дапушчальнымі межамі"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "немагчыма пераўтварыць U+%04X у мясцовы набор знакаў"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "немагчыма пераўтварыць U+%04X у мясцовы набор знакаў: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "нерэчаісны карыстальнік"
 
diff --git a/gnulib-po/bg.gmo b/gnulib-po/bg.gmo
index 3d5e0c8..d362b6f 100644
--- a/gnulib-po/bg.gmo
+++ b/gnulib-po/bg.gmo
Binary files differ
diff --git a/gnulib-po/bg.po b/gnulib-po/bg.po
index a57bfe1..e0966b5 100644
--- a/gnulib-po/bg.po
+++ b/gnulib-po/bg.po
@@ -4,10 +4,10 @@
 # Alexander Shopov <ash@kambanaria.org>, 2019.
 msgid ""
 msgstr ""
-"Project-Id-Version: gnulib 4.0.0.2412\n"
+"Project-Id-Version: gnulib 4.0.0.2567\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-05-15 07:06+0200\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2020-03-10 09:45+0100\n"
 "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
 "Language-Team: Bulgarian <dict@ludost.net>\n"
 "Language: bg\n"
@@ -31,44 +31,44 @@
 msgid "Valid arguments are:"
 msgstr "Възможните аргументи са:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr "%u побитови заделяния, освободени са %u (%.2f%%).\n"
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr "%u побитови задавания, кеширани са %u (%.2f%%)\n"
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr "%u побитови изчиствания, кеширани са %u (%.2f%%)\n"
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr "%u побитови проби, кеширани са %u (%.2f%%)\n"
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr "%u побитови извеждания\n"
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr "логаритмична хистограма по брой\n"
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr "логаритмична хистограма по размер\n"
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr "хистограма по плътност\n"
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
@@ -77,25 +77,25 @@
 "Побитова статистика:\n"
 "\n"
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr "Натрупани изпълнения = %u\n"
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 msgid "cannot read stats file"
 msgstr "файлът със статистиките не може да се прочете"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr "неправилен размер на файла със статистиките\n"
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 msgid "cannot write stats file"
 msgstr "файлът със статистиките не може да се запише"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
 msgstr "файлът със статистиките не може да се отвори за запис"
 
@@ -107,6 +107,12 @@
 msgid "Unknown system error"
 msgstr "Неизвестна системна грешка"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "дъщерният процес „%s“ завърши неуспешно"
+
 #: lib/getopt.c:278
 #, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -142,10 +148,32 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: опцията изисква аргумент — „%c“\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "паметта е изчерпана"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "текущата работна директория не може да се запише"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "не може да се върне към първоначалната работна директория"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "неуспешно изпълнение на „_open_osfhandle“"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+"файловият дескриптор %d не може да се възстанови: неуспешно изпълнение на "
+"функцията „dup2“"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -167,26 +195,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "„"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "“"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "не може да се създаде програмен канал"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "дъщерният процес „%s“ завърши неуспешно"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr "Време за изпълнение [секунди]"
@@ -203,146 +225,38 @@
 msgid "wall clock"
 msgstr "общо време"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "неуспешно изпълнение на „_open_osfhandle“"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "функцията „iconv“  е неизползваема"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr ""
-"файловият дескриптор %d не може да се възстанови: неуспешно изпълнение на "
-"функцията „dup2“"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "функцията „iconv“ е недостъпна"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "знак извън диапазона"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "„U+%04X“ не може да се конвертира в локалното кодиране"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "„U+%04X“ не може да се конвертира в локалното кодиране: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "дъщерен процес „%s“"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "дъщерният процес „%s“ получи фатален сигнал %d"
 
-#~ msgid "Packaged by %s (%s)\n"
-#~ msgstr "Пакетирано от %s (%s)\n"
-
-#~ msgid "Packaged by %s\n"
-#~ msgstr "Пакетирано от %s\n"
-
-#~ msgid "(C)"
-#~ msgstr "©"
-
-#, fuzzy
-#~| msgid ""
-#~| "\n"
-#~| "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl."
-#~| "html>.\n"
-#~| "This is free software: you are free to change and redistribute it.\n"
-#~| "There is NO WARRANTY, to the extent permitted by law.\n"
-#~| "\n"
-#~ msgid ""
-#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
-#~ "This is free software: you are free to change and redistribute it.\n"
-#~ "There is NO WARRANTY, to the extent permitted by law.\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Лиценз — Общ публичен лиценз на GNU (GNU GPL), както е публикуван от "
-#~ "Фондацията\n"
-#~ "за свободен софтуер — версия 3 на лиценза или (по ваше решение) по-късна "
-#~ "версия.\n"
-#~ "<https://gnu.org/licenses/gpl.html>\n"
-#~ "Тази програма е свободен софтуер. Можете да я разпространявате и/или "
-#~ "променяте.\n"
-#~ "Тя се разпространява БЕЗ НИКАКВИ ГАРАНЦИИ доколкото е позволено от "
-#~ "закона.\n"
-
-#~ msgid "Written by %s.\n"
-#~ msgstr "Създадено от %s.\n"
-
-#~ msgid "Written by %s and %s.\n"
-#~ msgstr "Създадено от %s и %s.\n"
-
-#~ msgid "Written by %s, %s, and %s.\n"
-#~ msgstr "Създадено от %s, %s и %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "and %s.\n"
-#~ msgstr ""
-#~ "Създадено от %s, %s, %s\n"
-#~ "и %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, and %s.\n"
-#~ msgstr ""
-#~ "Създадено от %s, %s, %s,\n"
-#~ "%s и %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, %s, and %s.\n"
-#~ msgstr ""
-#~ "Създадено от %s, %s, %s,\n"
-#~ "%s, %s и %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, %s, %s, and %s.\n"
-#~ msgstr ""
-#~ "Създадено от %s, %s, %s,\n"
-#~ "%s, %s, %s и %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, %s, %s, %s,\n"
-#~ "and %s.\n"
-#~ msgstr ""
-#~ "Създадено от %s, %s, %s,\n"
-#~ "%s, %s, %s, %s\n"
-#~ "и %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, %s, %s, %s,\n"
-#~ "%s, and %s.\n"
-#~ msgstr ""
-#~ "Създадено от %s, %s, %s,\n"
-#~ "%s, %s, %s, %s,\n"
-#~ "%s и %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, %s, %s, %s,\n"
-#~ "%s, %s, and others.\n"
-#~ msgstr ""
-#~ "Създадено от %s, %s, %s,\n"
-#~ "%s, %s, %s, %s,\n"
-#~ "%s, %s и др.\n"
-
-#, fuzzy
-#~| msgid ""
-#~| "\n"
-#~| "Report bugs to: %s\n"
-#~ msgid "Report bugs to: %s\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Докладвайте грешки в програмата на адрес: %s\n"
-#~ "Докладвайте грешки в превода на адрес: <dict@ludost.net>\n"
-
-#~ msgid "Report %s bugs to: %s\n"
-#~ msgstr "Докладвайте грешки в „%s“ на адрес: %s\n"
-
-#~ msgid "%s home page: <%s>\n"
-#~ msgstr "Уеб страница на „%s“: <%s>\n"
-
-#, fuzzy
-#~| msgid "General help using GNU software: <https://www.gnu.org/gethelp/>\n"
-#~ msgid "General help using GNU software: <%s>\n"
-#~ msgstr "Обща помощ за програмите на GNU: <https://www.gnu.org/gethelp/>\n"
-
 #~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
 #~ msgstr "„ARGP_HELP_FMT“: стойността %s е по-малка или равна на %s"
 
@@ -401,13 +315,13 @@
 #~ msgstr "извеждане на версията на програмата"
 
 #~ msgid "(PROGRAM ERROR) No version known!?"
-#~ msgstr "ГРЕШКА: Неизвестна версия!"
+#~ msgstr "(ДЕФЕКТ В ПРОГРАМАТА) Неизвестна версия!"
 
 #~ msgid "%s: Too many arguments\n"
 #~ msgstr "%s: Твърде много аргументи\n"
 
 #~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
-#~ msgstr "ГРЕШКА: Непозната опция, а трябва да се разпознава!"
+#~ msgstr "(ДЕФЕКТ В ПРОГРАМАТА) Опцията би трябвало да е била разпозната!"
 
 #~ msgid "program error"
 #~ msgstr "програмна грешка"
@@ -654,12 +568,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "директорията „%s“ не може да се създаде"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "текущата работна директория не може да се запише"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "не може да се върне към първоначалната работна директория"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "„/dev/zero“ не може да се отвори за запис"
 
@@ -863,21 +771,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Непознат сигнал %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "функцията „iconv“  е неизползваема"
-
-#~ msgid "iconv function not available"
-#~ msgstr "функцията „iconv“ е недостъпна"
-
-#~ msgid "character out of range"
-#~ msgstr "знак извън диапазона"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "„U+%04X“ не може да се конвертира в локалното кодиране"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "„U+%04X“ не може да се конвертира в локалното кодиране: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "несъществуващ потребител"
 
@@ -890,8 +783,107 @@
 #~ msgid "unable to display error message"
 #~ msgstr "съобщението за грешка не може да се изведе"
 
-#~ msgid "%s home page: <https://www.gnu.org/software/%s/>\n"
-#~ msgstr "Уеб страница на „%s“: <https://www.gnu.org/software/%s/>\n"
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Пакетирано от %s (%s)\n"
+
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Пакетирано от %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Лиценз — Общ публичен лиценз на GNU (GNU GPL), както е публикуван от "
+#~ "Фондацията\n"
+#~ "за свободен софтуер — версия 3 на лиценза или (по ваше решение) по-късна "
+#~ "версия.\n"
+#~ "<%s>\n"
+#~ "Тази програма е свободен софтуер. Можете да я разпространявате и/или "
+#~ "променяте.\n"
+#~ "Тя се разпространява БЕЗ НИКАКВИ ГАРАНЦИИ доколкото е позволено от "
+#~ "закона.\n"
+
+#~ msgid "Written by %s.\n"
+#~ msgstr "Създадено от %s.\n"
+
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Създадено от %s и %s.\n"
+
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Създадено от %s, %s и %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Създадено от %s, %s, %s\n"
+#~ "и %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Създадено от %s, %s, %s,\n"
+#~ "%s и %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Създадено от %s, %s, %s,\n"
+#~ "%s, %s и %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Създадено от %s, %s, %s,\n"
+#~ "%s, %s, %s и %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Създадено от %s, %s, %s,\n"
+#~ "%s, %s, %s, %s\n"
+#~ "и %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Създадено от %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s и %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Създадено от %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s и др.\n"
+
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "Докладвайте грешки в програмата на адрес: %s\n"
+#~ "Докладвайте грешки в превода на адрес: <dict@ludost.net>\n"
+
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Докладвайте грешки в „%s“ на адрес: %s\n"
+
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "Уеб страница на „%s“: <%s>\n"
+
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "Обща помощ за програмите на GNU: <%s>\n"
 
 #~ msgid "failed to set file descriptor text/binary mode"
 #~ msgstr "неуспешно задаване на вид на файла като текстов/двоичен"
diff --git a/gnulib-po/bison-gnulib.pot b/gnulib-po/bison-gnulib.pot
index a588271..4aafc1c 100644
--- a/gnulib-po/bison-gnulib.pot
+++ b/gnulib-po/bison-gnulib.pot
@@ -6,9 +6,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: GNU bison 3.5\n"
+"Project-Id-Version: GNU bison 3.8.2\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -31,69 +31,69 @@
 msgid "Valid arguments are:"
 msgstr ""
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 msgid "cannot read stats file"
 msgstr ""
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 msgid "cannot write stats file"
 msgstr ""
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
 msgstr ""
 
@@ -105,6 +105,12 @@
 msgid "Unknown system error"
 msgstr ""
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr ""
+
 #: lib/getopt.c:278
 #, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -140,10 +146,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr ""
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr ""
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr ""
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr ""
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -165,26 +191,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr ""
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr ""
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr ""
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr ""
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -201,22 +221,34 @@
 msgid "wall clock"
 msgstr ""
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
 msgstr ""
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
 msgstr ""
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr ""
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr ""
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr ""
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr ""
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr ""
diff --git a/gnulib-po/ca.gmo b/gnulib-po/ca.gmo
index 73eded0..b504421 100644
--- a/gnulib-po/ca.gmo
+++ b/gnulib-po/ca.gmo
Binary files differ
diff --git a/gnulib-po/ca.po b/gnulib-po/ca.po
index c662bd3..4f6b030 100644
--- a/gnulib-po/ca.po
+++ b/gnulib-po/ca.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: mailutils 0.6.90\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2005-05-21 04:10+0200\n"
 "Last-Translator: Jordi Mallach <jordi@gnu.org>\n"
 "Language-Team: Catalan <ca@dodds.net>\n"
@@ -34,72 +34,72 @@
 msgid "Valid arguments are:"
 msgstr "Els arguments vàlids són:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "No es pot crear la llista"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "No es pot crear la llista"
 
 # Usa quote().  ivb
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "no s'ha pogut obrir %s per a escriure"
@@ -112,6 +112,12 @@
 msgid "Unknown system error"
 msgstr "S'ha produït un error desconegut del sistema"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s: ha fallat el desplaçament"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -147,10 +153,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: l'opció requereix un argument -- %c\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "la memòria s'ha exhaurit"
 
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "openat: no s'ha pogut registrar el directori de treball actual"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "no s'ha pogut tornar al directori inicial de treball"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -172,26 +198,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "«"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "»"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, fuzzy, c-format
 msgid "cannot create pipe"
 msgstr "No es pot crear la llista"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, fuzzy, c-format
-msgid "%s subprocess failed"
-msgstr "%s: ha fallat el desplaçament"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -208,22 +228,34 @@
 msgid "wall clock"
 msgstr ""
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr ""
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "la funció iconv() no és útil"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr ""
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "la funció iconv() no es troba disponible"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "el caràcter es troba fora del rang"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "no s'ha pogut convertir U+%04X al joc de caràcters local"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "no s'ha pogut convertir U+%04X al joc de caràcters local: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, fuzzy, c-format
 msgid "%s subprocess"
 msgstr "%s: ha fallat el desplaçament"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, fuzzy, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s: ha fallat el desplaçament"
@@ -503,13 +535,6 @@
 #~ msgstr "no s'han pogut canviar els permisos de %s"
 
 #, fuzzy
-#~ msgid "unable to record current working directory"
-#~ msgstr "openat: no s'ha pogut registrar el directori de treball actual"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "no s'ha pogut tornar al directori inicial de treball"
-
-#, fuzzy
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "%s: no s'ha pogut obrir per a escriure"
 
@@ -559,21 +584,6 @@
 #~ msgid "^[nN]"
 #~ msgstr "^[nN]"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "la funció iconv() no és útil"
-
-#~ msgid "iconv function not available"
-#~ msgstr "la funció iconv() no es troba disponible"
-
-#~ msgid "character out of range"
-#~ msgstr "el caràcter es troba fora del rang"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "no s'ha pogut convertir U+%04X al joc de caràcters local"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "no s'ha pogut convertir U+%04X al joc de caràcters local: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "l'usuari no és vàlid"
 
diff --git a/gnulib-po/cs.gmo b/gnulib-po/cs.gmo
index 1bdd00c..85a18e6 100644
--- a/gnulib-po/cs.gmo
+++ b/gnulib-po/cs.gmo
Binary files differ
diff --git a/gnulib-po/cs.po b/gnulib-po/cs.po
index 329540a..1f4c364 100644
--- a/gnulib-po/cs.po
+++ b/gnulib-po/cs.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 3.0.0.6062.a6b16\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2011-12-04 08:50+0100\n"
 "Last-Translator: Marek Černocký <marek@manet.cz>\n"
 "Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
@@ -34,71 +34,71 @@
 msgid "Valid arguments are:"
 msgstr "Platné argumenty jsou:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "nelze vytvořit rouru"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "nelze vytvořit rouru"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "nelze otevřít záložní soubor „%s“ pro zápis"
@@ -111,6 +111,12 @@
 msgid "Unknown system error"
 msgstr "Neznámá chyba systému"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "selhal podřízený proces %s"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -146,10 +152,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: přepínač vyžaduje argument -- „%c“\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "paměť byla vyčerpána"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "nelze zaznamenat aktuální pracovní složku"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "selhalo vrácení počáteční pracovní složky"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "selhala funkce _open_osfhandle"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "nelze obnovit fd %d: selhala funkce dup2"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -171,26 +197,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "„"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "“"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "nelze vytvořit rouru"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "selhal podřízený proces %s"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -208,22 +228,34 @@
 msgid "wall clock"
 msgstr "Alarm od hodin"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "selhala funkce _open_osfhandle"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "funkce iconv není použitelná"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "nelze obnovit fd %d: selhala funkce dup2"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "funkce iconv není dostupná"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "znak je mimo rozsah"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "znak U+%04X nelze převést do místní znakové sady"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "znak U+%04X nelze převést do místní znakové sady: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "podřízený proces %s"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "podřízený proces %s obdržel kritický signál %d"
@@ -593,12 +625,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "nelze vytvořit složku %s"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "nelze zaznamenat aktuální pracovní složku"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "selhalo vrácení počáteční pracovní složky"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Selhalo otevření /dev/zero pro čtení"
 
@@ -800,21 +826,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Neznámý signál %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "funkce iconv není použitelná"
-
-#~ msgid "iconv function not available"
-#~ msgstr "funkce iconv není dostupná"
-
-#~ msgid "character out of range"
-#~ msgstr "znak je mimo rozsah"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "znak U+%04X nelze převést do místní znakové sady"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "znak U+%04X nelze převést do místní znakové sady: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "neplatný uživatel"
 
diff --git a/gnulib-po/da.gmo b/gnulib-po/da.gmo
index e70552d..21bf376 100644
--- a/gnulib-po/da.gmo
+++ b/gnulib-po/da.gmo
Binary files differ
diff --git a/gnulib-po/da.po b/gnulib-po/da.po
index 91f541e..6b60c1b 100644
--- a/gnulib-po/da.po
+++ b/gnulib-po/da.po
@@ -13,7 +13,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 2.0.0.3462.e9796\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2011-01-20 22:11+0100\n"
 "Last-Translator: Keld Simonsen <keld@keldix.com>\n"
 "Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
@@ -38,71 +38,71 @@
 msgid "Valid arguments are:"
 msgstr "gyldige argumenter er:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "kan ikke oprette datakanal"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "kan ikke oprette datakanal"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "kan ikke åbne sikkerhedskopifil '%s' for skrivning"
@@ -115,6 +115,12 @@
 msgid "Unknown system error"
 msgstr "Ukendt systemfejl"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s-underproces mislykkedes"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -150,10 +156,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: flaget kræver et argument -- '%c'\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "hukommelsen opbrugt"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "kan ikke notere aktuelt arbejdskatalog"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "kunne ikke gå tilbage til det oprindelige arbejdskatalog"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle mislykkedes"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "kan ikke genskabe fb %d: dup2 mislykkedes"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -175,26 +201,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "'"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "'"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "kan ikke oprette datakanal"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "%s-underproces mislykkedes"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -212,22 +232,34 @@
 msgid "wall clock"
 msgstr "Alarmklokke"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle mislykkedes"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "iconv-funktion ikke brugbar"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "kan ikke genskabe fb %d: dup2 mislykkedes"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "iconv-funktion ikke tilgængelig"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "tegn udenfor interval"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "kan ikke konvertere U+%04X til lokalt tegnsæt"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "kan ikke konvertere U+%04X til lokalt tegnsæt: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "%s-underproces"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s-underproces fik ødelæggende signal %d"
@@ -600,12 +632,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "kan ikke oprette kataloget %s"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "kan ikke notere aktuelt arbejdskatalog"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "kunne ikke gå tilbage til det oprindelige arbejdskatalog"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Mislykkedes med at åbne /dev/zero for læsning"
 
@@ -804,21 +830,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Ukendt signal %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "iconv-funktion ikke brugbar"
-
-#~ msgid "iconv function not available"
-#~ msgstr "iconv-funktion ikke tilgængelig"
-
-#~ msgid "character out of range"
-#~ msgstr "tegn udenfor interval"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "kan ikke konvertere U+%04X til lokalt tegnsæt"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "kan ikke konvertere U+%04X til lokalt tegnsæt: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "ugyldig bruger"
 
diff --git a/gnulib-po/de.gmo b/gnulib-po/de.gmo
index 8112949..3c5d21e 100644
--- a/gnulib-po/de.gmo
+++ b/gnulib-po/de.gmo
Binary files differ
diff --git a/gnulib-po/de.po b/gnulib-po/de.po
index c7cd5c4..8ce15e5 100644
--- a/gnulib-po/de.po
+++ b/gnulib-po/de.po
@@ -35,7 +35,7 @@
 msgstr ""
 "Project-Id-Version: GNU gnulib-4.0.0.2567\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2019-05-22 20:00+0200\n"
 "Last-Translator: Roland Illig <roland.illig@gmx.de>\n"
 "Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
@@ -61,44 +61,44 @@
 msgid "Valid arguments are:"
 msgstr "Gültige Argumente sind:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr "%u bitset_allocs, %u freigegeben (%.2f%%).\n"
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_sets, %u gecacht (%.2f%%)\n"
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_resets, %u gecacht (%.2f%%)\n"
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr "%u bitset_tests, %u gecacht (%.2f%%)\n"
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr "%u bitset_lists\n"
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr "logarithmisches Anzahlhistogramm\n"
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr "logarithmisches Größenhistogramm\n"
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr "Dichtehistogramm\n"
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
@@ -107,25 +107,25 @@
 "Bitmengen-Statistik:\n"
 "\n"
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr "Aufsummierte Durchläufe = %u\n"
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 msgid "cannot read stats file"
 msgstr "Statistikdatei konnte nicht gelesen werden"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr "Statistikdatei hat falsche Größe\n"
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 msgid "cannot write stats file"
 msgstr "Statistikdatei konnte nicht angelegt werden"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
 msgstr "Statistikdatei konnte nicht zum Schreiben geöffnet werden"
 
@@ -137,6 +137,12 @@
 msgid "Unknown system error"
 msgstr "Unbekannter Systemfehler"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s: Unterprozess fehlgeschlagen"
+
 #: lib/getopt.c:278
 #, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -172,10 +178,32 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: Option erfordert ein Argument -- »%c«\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "Zu wenig Speicher vorhanden"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "aktuelles Arbeitsverzeichnis konnte nicht bestimmt werden"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr ""
+"es konnte nicht ins ursprüngliche Arbeitsverzeichnis zurückgekehrt werden"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle fehlgeschlagen"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+"Dateideskriptor %d konnte nicht wiederhergestellt werden: dup2 fehlgeschlagen"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -197,26 +225,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "»"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "«"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "Pipe konnte nicht erzeugt werden"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "%s: Unterprozess fehlgeschlagen"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr "Ausführungszeiten (in Sekunden)"
@@ -233,23 +255,36 @@
 msgid "wall clock"
 msgstr "Vergangene Zeit"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle fehlgeschlagen"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "iconv-Funktion nicht benutzbar"
 
-#: lib/w32spawn.h:90
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "iconv-Funktion nicht verfügbar"
+
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "Zeichen außerhalb erlaubter Grenzen"
+
+#: lib/unicodeio.c:198
 #, c-format
-msgid "cannot restore fd %d: dup2 failed"
+msgid "cannot convert U+%04X to local character set"
 msgstr ""
-"Dateideskriptor %d konnte nicht wiederhergestellt werden: dup2 fehlgeschlagen"
+"das Zeichen U+%04X konnte nicht in lokalen Zeichensatz konvertiert werden"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr ""
+"das Zeichen U+%04X konnte nicht in lokalen Zeichensatz konvertiert werden: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "%s-Unterprozess"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s-Unterprozess bekam tödliches Signal %d"
@@ -660,13 +695,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "Verzeichnis »%s« konnte nicht angelegt werden"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "aktuelles Arbeitsverzeichnis konnte nicht bestimmt werden"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr ""
-#~ "es konnte nicht ins ursprüngliche Arbeitsverzeichnis zurückgekehrt werden"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Das Gerät »/dev/zero« konnte nicht zum Lesen geöffnet werden"
 
@@ -870,24 +898,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Unbekanntes Signal %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "iconv-Funktion nicht benutzbar"
-
-#~ msgid "iconv function not available"
-#~ msgstr "iconv-Funktion nicht verfügbar"
-
-#~ msgid "character out of range"
-#~ msgstr "Zeichen außerhalb erlaubter Grenzen"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr ""
-#~ "das Zeichen U+%04X konnte nicht in lokalen Zeichensatz konvertiert werden"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr ""
-#~ "das Zeichen U+%04X konnte nicht in lokalen Zeichensatz konvertiert "
-#~ "werden: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "ungültiger Benutzername"
 
diff --git a/gnulib-po/el.gmo b/gnulib-po/el.gmo
index d904d5a..e651d62 100644
--- a/gnulib-po/el.gmo
+++ b/gnulib-po/el.gmo
Binary files differ
diff --git a/gnulib-po/el.po b/gnulib-po/el.po
index dcb9540..6b63bdd 100644
--- a/gnulib-po/el.po
+++ b/gnulib-po/el.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 3.0.0.6062.a6b16\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2012-03-11 11:25+0100\n"
 "Last-Translator: Simos Xenitellis <simos.lists@googlemail.com>\n"
 "Language-Team: Greek <team@lists.gnome.gr>\n"
@@ -34,73 +34,73 @@
 msgid "Valid arguments are:"
 msgstr "Έγκυρα ορίσματα είναι:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
 #
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
 #
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "αδυναμία μεταφοράς του `%s' στο `%s'"
@@ -116,6 +116,13 @@
 msgstr "Άγνωστο σφάλμα συστήματος"
 
 #
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s: μη έγκυρη μορφή"
+
+#
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -158,11 +165,33 @@
 msgstr "%s: η επιλογή απαιτεί ένα όρισμα -- %c\n"
 
 #
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "η μνήμη εξαντλήθηκε"
 
 #
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
+
+#
+#: lib/openat-die.c:57
+#, fuzzy, c-format
+msgid "failed to return to initial working directory"
+msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
+#
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -184,29 +213,22 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "`"
 
 #
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "'"
 
 #
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, fuzzy, c-format
 msgid "cannot create pipe"
 msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
 
-#
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, fuzzy, c-format
-msgid "%s subprocess failed"
-msgstr "%s: μη έγκυρη μορφή"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -223,24 +245,38 @@
 msgid "wall clock"
 msgstr ""
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
 msgstr ""
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
 msgstr ""
 
 #
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+#, fuzzy
+msgid "character out of range"
+msgstr "%s: αριθμός γραμμής έξω από τα όρια"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr ""
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr ""
+
+#
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, fuzzy, c-format
 msgid "%s subprocess"
 msgstr "%s: μη έγκυρη μορφή"
 
 #
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, fuzzy, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s: μη έγκυρη μορφή"
@@ -511,16 +547,6 @@
 
 #
 #, fuzzy
-#~ msgid "unable to record current working directory"
-#~ msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
-
-#
-#, fuzzy
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "αδύνατη η δημιουργία καταλόγου `%s'"
-
-#
-#, fuzzy
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "αδυναμία αλλαγής ιδιοκτησίας στο %s"
 
@@ -603,11 +629,6 @@
 #~ msgstr "σφάλμα εγγραφής"
 
 #
-#, fuzzy
-#~ msgid "character out of range"
-#~ msgstr "%s: αριθμός γραμμής έξω από τα όρια"
-
-#
 #~ msgid "invalid user"
 #~ msgstr "μη έγκυρος χρήστης"
 
diff --git a/gnulib-po/eo.gmo b/gnulib-po/eo.gmo
index 87f6892..ff16a4d 100644
--- a/gnulib-po/eo.gmo
+++ b/gnulib-po/eo.gmo
Binary files differ
diff --git a/gnulib-po/eo.po b/gnulib-po/eo.po
index bf4d719..0b7a9b6 100644
--- a/gnulib-po/eo.po
+++ b/gnulib-po/eo.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 4.0.0.2412\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2019-01-29 21:44+0100\n"
 "Last-Translator: Felipe Castro <fefcas@gmail.com>\n"
 "Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n"
@@ -32,44 +32,44 @@
 msgid "Valid arguments are:"
 msgstr "Validaj argumentoj estas:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr "%u bitset_allocs, %u liberitaj (%.2f%%).\n"
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_sets, %u kaŝmem (%.2f%%)\n"
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_resets, %u kaŝmem (%.2f%%)\n"
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr "%u bitset_tests, %u kaŝmem (%.2f%%)\n"
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr "%u bitset_lists\n"
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr "histogramo pri nombro-protokolado\n"
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr "histogramo pri grando-protokolado\n"
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr "histogramo pri denso\n"
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
@@ -78,25 +78,25 @@
 "Bitset statistikoj:\n"
 "\n"
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr "Akumulitaj funkciadoj = %u\n"
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 msgid "cannot read stats file"
 msgstr "ne eblas legi dosieron stats"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr "malĝusta dosier-grando de stats\n"
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 msgid "cannot write stats file"
 msgstr "ne eblas skibi en dosiero stats"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
 msgstr "ne eblas malfermi dosieron stats por skribi"
 
@@ -108,6 +108,12 @@
 msgid "Unknown system error"
 msgstr "Nekonata sistem-eraro"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "subprocezo de %s fiaskis"
+
 #: lib/getopt.c:278
 #, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -143,10 +149,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: la modifilo postulas argumenton -- '%c'\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "memoro estas plenigita"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "ne eblas registri la aktualan labordosierujon"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "ni fiaskis reveni al la komenca labordosierujo"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle fiaskis"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "ne eblas restarigi fd %d: dup2 fiaskis"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -168,26 +194,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "‘"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "’"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "ne eblas krei dukton"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "subprocezo de %s fiaskis"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr "Tempo de funkciado (sekundoj)"
@@ -204,22 +224,34 @@
 msgid "wall clock"
 msgstr "mur-horloĝo"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle fiaskis"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "funkcio iconv ne uzeblas"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "ne eblas restarigi fd %d: dup2 fiaskis"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "funkcio iconv ne disponeblas"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "signo estas for de intervalo"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "ne eblas konverti U+%04X al loka signaro"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "ne eblas konverti U+%04X al loka signaro: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "subprocezo %s"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "subprocezo %s ricevis neripareblan signalon %d"
@@ -638,12 +670,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "ne eblas krei la dosierujon %s"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "ne eblas registri la aktualan labordosierujon"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "ni fiaskis reveni al la komenca labordosierujo"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Ni fiaskis malfermi /dev/zero por legi"
 
@@ -845,21 +871,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Nekonata signalo %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "funkcio iconv ne uzeblas"
-
-#~ msgid "iconv function not available"
-#~ msgstr "funkcio iconv ne disponeblas"
-
-#~ msgid "character out of range"
-#~ msgstr "signo estas for de intervalo"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "ne eblas konverti U+%04X al loka signaro"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "ne eblas konverti U+%04X al loka signaro: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "malvalida uzanto"
 
diff --git a/gnulib-po/es.gmo b/gnulib-po/es.gmo
index fa30700..986ccfc 100644
--- a/gnulib-po/es.gmo
+++ b/gnulib-po/es.gmo
Binary files differ
diff --git a/gnulib-po/es.po b/gnulib-po/es.po
index 13669fe..f965961 100644
--- a/gnulib-po/es.po
+++ b/gnulib-po/es.po
@@ -13,7 +13,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 3.0.0.6062.a6b16\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2011-08-24 11:23-0500\n"
 "Last-Translator: Cristian Othón Martínez Vera <cfuga@cfuga.mx>\n"
 "Language-Team: Spanish <es@li.org>\n"
@@ -38,71 +38,71 @@
 msgid "Valid arguments are:"
 msgstr "Los argumentos válidos son:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "no se puede una tubería"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "no se puede una tubería"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "no se puede abrir el fichero de respaldo \"%s\" para escritura"
@@ -115,6 +115,12 @@
 msgid "Unknown system error"
 msgstr "Error desconocido de sistema"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s: falló el subproceso"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -150,10 +156,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: la opción requiere de un argumento -- '%c'\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "memoria agotada"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "no se puede registrar el directorio de trabajo actual"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "no se puede volver al directorio de trabajo inicial"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "falló _open_osfhandle"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "no se puede restaurar el df %d: falló dup2"
+
 # Vamos a probar con el símbolo de cita tradicional en español,
 # a ver qué tal queda la cosa.
 #. TRANSLATORS:
@@ -177,26 +203,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "«"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "»"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "no se puede una tubería"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "%s: falló el subproceso"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -214,22 +234,34 @@
 msgid "wall clock"
 msgstr "Reloj de alarma"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "falló _open_osfhandle"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "la función iconv no es utilizable"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "no se puede restaurar el df %d: falló dup2"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "la función iconv no está disponible"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "carácter fuera de rango"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "no se puede convertir U+%04X al conjunto de caracteres local"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "no se puede convertir U+%04X al conjunto de caracteres local: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "subproceso %s"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "el subproceso %s recibió la señal fatal %d"
@@ -601,12 +633,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "no se puede crear el directorio %s"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "no se puede registrar el directorio de trabajo actual"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "no se puede volver al directorio de trabajo inicial"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Falló al abrir /dev/zero para lectura"
 
@@ -810,21 +836,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Señal %d desconocida"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "la función iconv no es utilizable"
-
-#~ msgid "iconv function not available"
-#~ msgstr "la función iconv no está disponible"
-
-#~ msgid "character out of range"
-#~ msgstr "carácter fuera de rango"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "no se puede convertir U+%04X al conjunto de caracteres local"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "no se puede convertir U+%04X al conjunto de caracteres local: %s"
-
 # Me niego a considerar "inválido" como palabra "políticamente incorrecta".
 # Si algún "impedido físico" lee este mensaje y se molesta por ello, entonces
 # es que además de impedido físico es tonto, pues todo el mundo sabe que,
diff --git a/gnulib-po/et.gmo b/gnulib-po/et.gmo
index 2840c4d..2cdba0a 100644
--- a/gnulib-po/et.gmo
+++ b/gnulib-po/et.gmo
Binary files differ
diff --git a/gnulib-po/et.po b/gnulib-po/et.po
index c3a7519..bf457c8 100644
--- a/gnulib-po/et.po
+++ b/gnulib-po/et.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 2.0.0.3462.e9796\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2011-05-19 15:10+0300\n"
 "Last-Translator: Toomas Soome <Toomas.Soome@microlink.ee>\n"
 "Language-Team: Estonian <linux-ee@lists.eenet.ee>\n"
@@ -32,71 +32,71 @@
 msgid "Valid arguments are:"
 msgstr "Lubatud argumendid on:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "ei õnnestu luua toru"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "ei õnnestu luua toru"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "Varukoopia faili \"%s\" ei õnnestu kirjutamiseks avada"
@@ -109,6 +109,12 @@
 msgid "Unknown system error"
 msgstr "Tundmatu süsteemne viga"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s: alamprotsess sai vea"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -144,10 +150,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: võti nõuab argumenti -- '%c'\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "mälu on otsas"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "ei õnnestu registreerida jooksvat töökataloogi"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "esialgsesse töökataloogi ei õnnestu tagasi minna"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle ebaõnnestus"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "failipidet %d ei õnnestu taastada: dup2 ebaõnnestus"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -169,26 +195,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "`"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "'"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "ei õnnestu luua toru"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "%s: alamprotsess sai vea"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -205,22 +225,34 @@
 msgid "wall clock"
 msgstr ""
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle ebaõnnestus"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "iconv funktsioon ei ole kasutatav"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "failipidet %d ei õnnestu taastada: dup2 ebaõnnestus"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "iconv funktsioon puudub"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "sümbol on piirkonnast väljas"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "U+%04X ei saa lokaalsesse kooditabelisse teisendada"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "U+%04X ei saa lokaalsesse kooditabelisse teisendada: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "%s alamprotsess"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s alamprotsess sai fataalse signaali %d"
@@ -560,12 +592,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "kataloogi `%s' ei õnnestu luua"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "ei õnnestu registreerida jooksvat töökataloogi"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "esialgsesse töökataloogi ei õnnestu tagasi minna"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Faili /dev/zero saa lugemiseks avada"
 
@@ -629,21 +655,6 @@
 #~ msgid "Power failure"
 #~ msgstr "Toite viga"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "iconv funktsioon ei ole kasutatav"
-
-#~ msgid "iconv function not available"
-#~ msgstr "iconv funktsioon puudub"
-
-#~ msgid "character out of range"
-#~ msgstr "sümbol on piirkonnast väljas"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "U+%04X ei saa lokaalsesse kooditabelisse teisendada"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "U+%04X ei saa lokaalsesse kooditabelisse teisendada: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "vigane kasutaja"
 
diff --git a/gnulib-po/eu.gmo b/gnulib-po/eu.gmo
index d58635f..91bb4d7 100644
--- a/gnulib-po/eu.gmo
+++ b/gnulib-po/eu.gmo
Binary files differ
diff --git a/gnulib-po/eu.po b/gnulib-po/eu.po
index 36674b5..2674917 100644
--- a/gnulib-po/eu.po
+++ b/gnulib-po/eu.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: coreutils-5.2.1\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2005-01-04 20:27+0100\n"
 "Last-Translator: Mikel Olasagasti <hey_neken@mundurat.net>\n"
 "Language-Team: Basque <translation-team-eu@lists.sourceforge.net>\n"
@@ -33,71 +33,71 @@
 msgid "Valid arguments are:"
 msgstr "Baliozko argumentuak hauek dira:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "ezin da %s esteka sortu"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "ezin da %s esteka sortu"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "errepikatu arte"
@@ -110,6 +110,12 @@
 msgid "Unknown system error"
 msgstr "Sistema-errore ezezaguna"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "baliogabea"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -145,10 +151,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: aukerak --%c argumentu bat behar du\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "memoria agortuta"
 
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "Inprimatu Fitxategi-izena - e e"
+
+#: lib/openat-die.c:57
+#, fuzzy, c-format
+msgid "failed to return to initial working directory"
+msgstr "Inprimatu Fitxategi-izena - e e"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -170,26 +196,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "`"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "'"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, fuzzy, c-format
 msgid "cannot create pipe"
 msgstr "ezin da %s esteka sortu"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, fuzzy, c-format
-msgid "%s subprocess failed"
-msgstr "baliogabea"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -206,22 +226,34 @@
 msgid "wall clock"
 msgstr ""
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
 msgstr ""
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
 msgstr ""
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "karakterea barrutitik kanpora"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr ""
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr ""
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, fuzzy, c-format
 msgid "%s subprocess"
 msgstr "baliogabea"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, fuzzy, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "baliogabea"
@@ -445,10 +477,6 @@
 #~ msgstr "ezin da %s-(r)en baimenak aldatu"
 
 #, fuzzy
-#~ msgid "unable to record current working directory"
-#~ msgstr "Inprimatu Fitxategi-izena - e e"
-
-#, fuzzy
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "baimenak errepikatu arte"
 
@@ -486,9 +514,6 @@
 #~ msgid "^[nN]"
 #~ msgstr "^[eE]"
 
-#~ msgid "character out of range"
-#~ msgstr "karakterea barrutitik kanpora"
-
 #~ msgid "invalid user"
 #~ msgstr "baliogabeko erabiltzailea"
 
diff --git a/gnulib-po/fi.gmo b/gnulib-po/fi.gmo
index 487f22c..42386ee 100644
--- a/gnulib-po/fi.gmo
+++ b/gnulib-po/fi.gmo
Binary files differ
diff --git a/gnulib-po/fi.po b/gnulib-po/fi.po
index 1c13a76..c4b483c 100644
--- a/gnulib-po/fi.po
+++ b/gnulib-po/fi.po
@@ -1,17 +1,17 @@
 # Finnish messages for gnulib.
-# Copyright © 2002, 2003, 2004, 2009, 2010 Free Software Foundation, Inc.
+# Copyright © 2002, 2003, 2004, 2009, 2010, 2011, 2019 Free Software Foundation, Inc.
 # This file is distributed under the same license as the gnulib package.
-# Lauri Nurmi <lanurmi@iki.fi>, 2003, 2004.
+# Lauri Nurmi <lanurmi@iki.fi>, 2003, 2004, 2019.
 # Matti Koskimies <matti@apulanta.fi>, 2002.
 # Jorma Karvonen <karvonen.jorma@gmail.com>, 2009-2011.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: gnulib 3.0.0.6062.a6b16\n"
+"Project-Id-Version: gnulib 4.0.0.2567\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2011-12-10 19:05+0200\n"
-"Last-Translator: Jorma Karvonen <karvonen.jorma@gmail.com>\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2019-12-26 12:28+0200\n"
+"Last-Translator: Lauri Nurmi <lanurmi@iki.fi>\n"
 "Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n"
 "Language: fi\n"
 "MIME-Version: 1.0\n"
@@ -19,89 +19,87 @@
 "Content-Transfer-Encoding: 8bit\n"
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural= ( n!=1) ;\n"
+"X-Generator: Poedit 2.2.4\n"
 
 #: lib/argmatch.c:132
 #, c-format
 msgid "invalid argument %s for %s"
-msgstr "virheellinen argumentti %s kohteelle %s"
+msgstr "virheellinen argumentti %s kontekstille %s"
 
 #: lib/argmatch.c:133
 #, c-format
 msgid "ambiguous argument %s for %s"
-msgstr "moniselitteinen argumentti %s kohteelle %s"
+msgstr "moniselitteinen argumentti %s kontekstille %s"
 
 #: lib/argmatch.c:152 lib/argmatch.h:223
 msgid "Valid arguments are:"
 msgstr "Kelvolliset argumentit:"
 
-#: lib/bitset/stats.c:177
-#, c-format
-msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
-msgstr ""
-
-#: lib/bitset/stats.c:180
-#, c-format
-msgid "%u bitset_sets, %u cached (%.2f%%)\n"
-msgstr ""
-
 #: lib/bitset/stats.c:183
 #, c-format
-msgid "%u bitset_resets, %u cached (%.2f%%)\n"
-msgstr ""
+msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+msgstr "%u bitset_allocs, %u vapautettu (%.2f%%).\n"
 
 #: lib/bitset/stats.c:186
 #, c-format
-msgid "%u bitset_tests, %u cached (%.2f%%)\n"
-msgstr ""
+msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+msgstr "%u bitset_sets, %u vapautettu (%.2f%%)\n"
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:189
 #, c-format
-msgid "%u bitset_lists\n"
-msgstr ""
+msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+msgstr "%u bitset_resets, %u välimuistitettu (%.2f%%)\n"
 
 #: lib/bitset/stats.c:192
-msgid "count log histogram\n"
-msgstr ""
+#, c-format
+msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+msgstr "%u bitset_tests, %u välimuistitettu (%.2f%%)\n"
 
-#: lib/bitset/stats.c:195
-msgid "size log histogram\n"
-msgstr ""
+#: lib/bitset/stats.c:196
+#, c-format
+msgid "%u bitset_lists\n"
+msgstr "%u bitset_lists\n"
 
 #: lib/bitset/stats.c:198
-msgid "density histogram\n"
-msgstr ""
+msgid "count log histogram\n"
+msgstr "määrälokihistogrammi\n"
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:201
+msgid "size log histogram\n"
+msgstr "kokolokihistogrammi\n"
+
+#: lib/bitset/stats.c:204
+msgid "density histogram\n"
+msgstr "tiheyshistogrammi\n"
+
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
-msgstr ""
+msgstr "Bitset-tilasto:\n"
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
-msgstr ""
+msgstr "Kertyneet ajot = %u\n"
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
-#, fuzzy
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 msgid "cannot read stats file"
-msgstr "ei voida luoda putkea"
+msgstr "ei voida lukea tilastotiedostoa"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
-msgstr ""
+msgstr "virheellinen tilastotiedoston koko\n"
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
-#, fuzzy
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 msgid "cannot write stats file"
-msgstr "ei voida luoda putkea"
+msgstr "ei voida kirjoittaa tilastotiedostoa"
 
-#: lib/bitset/stats.c:286
-#, fuzzy
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
-msgstr "ei voida avata varmuuskopiotiedostoa ”%s” kirjoittamista varten"
+msgstr "ei voida avata tilastotiedostoa kirjoitettavaksi"
 
 #: lib/closeout.c:122
 msgid "write error"
@@ -111,45 +109,71 @@
 msgid "Unknown system error"
 msgstr "Tuntematon järjestelmävirhe"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s-aliprosessi epäonnistui"
+
 #: lib/getopt.c:278
-#, fuzzy, c-format
+#, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
-msgstr "%s: valitsin ’-W %s’ ei ole yksiselitteinen\n"
+msgstr "%s: valitsin ”%s%s” on moniselitteinen\n"
 
 #: lib/getopt.c:284
-#, fuzzy, c-format
+#, c-format
 msgid "%s: option '%s%s' is ambiguous; possibilities:"
-msgstr "%s: valitsin ’%s’ ei ole yksiselitteinen; mahdollisuudet:"
+msgstr "%s: valitsin ”%s%s” on moniselitteinen; vaihtoehdot:"
 
 #: lib/getopt.c:319
-#, fuzzy, c-format
+#, c-format
 msgid "%s: unrecognized option '%s%s'\n"
-msgstr "%s: tunnistamaton valitsin ’%c%s’\n"
+msgstr "%s: tunnistamaton valitsin ”%s%s”\n"
 
 #: lib/getopt.c:345
-#, fuzzy, c-format
+#, c-format
 msgid "%s: option '%s%s' doesn't allow an argument\n"
-msgstr "%s: valitsin ’%c%s’ ei salli argumenttia\n"
+msgstr "%s: valitsin ”%s%s” ei salli argumenttia\n"
 
 #: lib/getopt.c:360
-#, fuzzy, c-format
+#, c-format
 msgid "%s: option '%s%s' requires an argument\n"
-msgstr "%s: valitsin ’--%s’ vaatii argumentin\n"
+msgstr "%s: valitsin ”%s%s” vaatii argumentin\n"
 
 #: lib/getopt.c:621
 #, c-format
 msgid "%s: invalid option -- '%c'\n"
-msgstr "%s: epäkelpo valitsin -- ’%c’\n"
+msgstr "%s: virheellinen valitsin -- ”%c”\n"
 
 #: lib/getopt.c:636 lib/getopt.c:682
 #, c-format
 msgid "%s: option requires an argument -- '%c'\n"
-msgstr "%s: valitsin vaatii argumentin -- ’%c’\n"
+msgstr "%s: valitsin vaatii argumentin -- ”%c”\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "muisti loppui"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "nykyisen työhakemiston kirjaaminen ei onnistu"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "palaaminen alkuperäiseen työhakemistoon epäonnistui"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle epäonnistui"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "ei voi palauttaa tiedostokahvaa %d: dup2 epäonnistui"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -171,92 +195,600 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "”"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "”"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "ei voida luoda putkea"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "%s-aliprosessi epäonnistui"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
-msgstr ""
+msgstr "Suoritusajat (sekuntia)"
 
 #: lib/timevar.c:318
 msgid "CPU user"
-msgstr ""
+msgstr "Suoritin (käyttäjä)"
 
 #: lib/timevar.c:318
 msgid "CPU system"
-msgstr ""
+msgstr "Suoritin (järjestelmä)"
 
 #: lib/timevar.c:318
-#, fuzzy
 msgid "wall clock"
-msgstr "Hälytyskello"
+msgstr "seinäkello"
 
-#: lib/w32spawn.h:49
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "iconv-funktio ei ole käyttökelpoinen"
+
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "iconv-funktio ei ole saatavilla"
+
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "merkki sallitun välin ulkopuolella"
+
+#: lib/unicodeio.c:198
 #, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle epäonnistui"
+msgid "cannot convert U+%04X to local character set"
+msgstr "merkin U+%04X muunnos paikalliseen merkistöön ei onnistu"
 
-#: lib/w32spawn.h:90
+#: lib/unicodeio.c:200
 #, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "ei voi palauttaa fd %d: dup2 epäonnistui"
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "merkin U+%04X muunnos paikalliseen merkistöön ei onnistu: %s"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "%s-aliprosessi"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
-msgstr "%s-aliprosessi sai sammuttavan signaalin %d"
+msgstr "%s-aliprosessi vastaanotti fataalin signaalin %d"
+
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: %s-arvo on pienempi tai yhtäsuuri kuin %s"
+
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: ARGP_HELP_FMT-parametri vaatii arvon"
+
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Tuntematon ARGP_HELP_FMT-parametri"
+
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Roskaa ARGP_HELP_FMT:ssä: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Pitkien valitsinten pakolliset tai valinnaiset argumentit ovat pakollisia "
+#~ "tai valinnaisia myös vastaaville lyhyille."
+
+#~ msgid "Usage:"
+#~ msgstr "Käyttö:"
+
+#~ msgid "  or: "
+#~ msgstr "  tai: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [VALITSIN...]"
+
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
+#~ msgstr "Lisätietoja komennolla ”%s --help” tai ”%s --usage”.\n"
+
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Lähetä raportit ohjelmistovioista (englanniksi) osoitteeseen %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "anna tämä opasteluettelo"
+
+#~ msgid "give a short usage message"
+#~ msgstr "anna lyhyt käyttöohje"
+
+#~ msgid "NAME"
+#~ msgstr "NIMI"
+
+#~ msgid "set the program name"
+#~ msgstr "aseta ohjelman nimi"
+
+#~ msgid "SECS"
+#~ msgstr "S"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "odota S sekuntia (oletus 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "tulosta ohjelman versio"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(OHJELMAVIRHE) Versiota ei tiedetä!?"
+
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: Liian monta argumenttia\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(OHJELMAVIRHE) Valitsin olisi pitänyt tunnistaa‽"
+
+#~ msgid "program error"
+#~ msgstr "ohjelmavirhe"
+
+#~ msgid "stack overflow"
+#~ msgstr "pinon ylivuoto"
+
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr ""
+#~ "tilapäisen hakemiston löytäminen epäonnistui, yritä asettaa $TMPDIR-"
+#~ "muuttuja"
+
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "ei voida luoda tilapäishakemistoa mallin ”%s” pohjalta"
+
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "ei voida poistaa tilapäistiedostoa %s"
+
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "ei voida poistaa tilapäishakemistoa %s"
+
+#~ msgid "error closing file"
+#~ msgstr "virhe tiedoston sulkemisessa"
+
+#~ msgid "preserving permissions for %s"
+#~ msgstr "säilytetään oikeudet kohteelle %s"
+
+#~ msgid "error while opening %s for reading"
+#~ msgstr "virhe avattaessa tiedostoa %s luettavaksi"
+
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "ei voida avata varmuuskopiotiedostoa %s kirjoitettavaksi"
+
+#~ msgid "error reading %s"
+#~ msgstr "virhe luettaessa tiedostoa %s"
+
+#~ msgid "error writing %s"
+#~ msgstr "virhe kirjoitettaessa tiedostoa %s"
+
+#~ msgid "error after reading %s"
+#~ msgstr "virhe tiedoston %s lukemisen jälkeen"
+
+#~ msgid "fdopen() failed"
+#~ msgstr "fdopen() epäonnistui"
+
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr "C#-kääntäjää ei löytynyt, yritä asentaa mono"
+
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr "C#-virtuaalikonetta ei löytynyt, yritä asentaa mono"
+
+#~ msgid "unbalanced ["
+#~ msgstr "pariton ["
+
+#~ msgid "invalid character class"
+#~ msgstr "virheellinen merkkiluokka"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr "merkkiluokkasyntaksi on [[:space:]], ei [:space:]"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "keskeneräinen \\-ohjaussarja"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "virheellinen \\{\\}:n sisältö"
+
+#~ msgid "regular expression too big"
+#~ msgstr "säännöllinen lauseke on liian suuri"
+
+#~ msgid "unbalanced ("
+#~ msgstr "pariton ("
+
+#~ msgid "no syntax specified"
+#~ msgstr "syntaksia ei ole määritelty"
+
+#~ msgid "unbalanced )"
+#~ msgstr "pariton )"
+
+#~ msgid "regular empty file"
+#~ msgstr "tavallinen tyhjä tiedosto"
+
+#~ msgid "regular file"
+#~ msgstr "tavallinen tiedosto"
+
+#~ msgid "directory"
+#~ msgstr "hakemisto"
+
+#~ msgid "symbolic link"
+#~ msgstr "symbolinen linkki"
+
+#~ msgid "message queue"
+#~ msgstr "viestijono"
+
+#~ msgid "semaphore"
+#~ msgstr "semafori"
+
+#~ msgid "shared memory object"
+#~ msgstr "jaetun muistin objekti"
+
+#~ msgid "typed memory object"
+#~ msgstr "tyypitetty muistiobjekti"
+
+#~ msgid "block special file"
+#~ msgstr "lohkoerikoistiedosto"
+
+#~ msgid "character special file"
+#~ msgstr "merkkierikoistiedosto"
+
+#~ msgid "contiguous data"
+#~ msgstr "yhtenäistä dataa"
+
+#~ msgid "fifo"
+#~ msgstr "putkitiedosto"
+
+#~ msgid "door"
+#~ msgstr "ovi"
+
+#~ msgid "multiplexed block special file"
+#~ msgstr "limitetty lohkoerikoistiedosto"
+
+#~ msgid "multiplexed character special file"
+#~ msgstr "limitetty merkkierikoistiedosto"
+
+#~ msgid "multiplexed file"
+#~ msgstr "limitetty tiedosto"
+
+#~ msgid "named file"
+#~ msgstr "nimetty tiedosto"
+
+#~ msgid "network special file"
+#~ msgstr "verkkoerikoistiedosto"
+
+#~ msgid "migrated file with data"
+#~ msgstr "datallinen siirretty tiedosto"
+
+#~ msgid "migrated file without data"
+#~ msgstr "dataton siirretty tiedosto"
+
+#~ msgid "port"
+#~ msgstr "portti"
+
+#~ msgid "socket"
+#~ msgstr "pistoke"
+
+#~ msgid "whiteout"
+#~ msgstr "himmeä"
+
+#~ msgid "weird file"
+#~ msgstr "outo tiedosto"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Konenimen osoiteperhe ei ole tuettu"
+
+#~ msgid "Temporary failure in name resolution"
+#~ msgstr "Väliaikainen häiriö nimenselvityksessä"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Virheellinen arvo ai_flags-kentälle"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Korjautumaton häiriö nimenselvityksessä"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family ei ole tuettu"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Muistinvarausvirhe"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Konenimeen ei liity osoitetta"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Nimi tai palvelu on tuntematon"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Servname ei ole tuettu kohteelle ai_socktype"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype ei ole tuettu"
+
+#~ msgid "System error"
+#~ msgstr "Järjestelmävirhe"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Argumenttipuskuri on liian pieni"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Pyynnön käsittely käynnissä"
+
+#~ msgid "Request canceled"
+#~ msgstr "Pyyntö peruttu"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Pyyntöä ei peruttu"
+
+#~ msgid "All requests done"
+#~ msgstr "Kaikki pyynnöt suoritettu"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Signaalin keskeyttämä"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Parametrimerkkijono on väärin koodattu"
+
+#~ msgid "Unknown error"
+#~ msgstr "Tuntematon virhe"
+
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "virheellinen source_version-argumentti kohteelle compile_java_class"
+
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "virheellinen target_version-argumentti kohteelle compile_java_class"
+
+#~ msgid "failed to create \"%s\""
+#~ msgstr "tiedoston ”%s” luominen epäonnistui"
+
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "virhe kirjoitettaessa tiedostoa ”%s”"
+
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr "Java-kääntäjää ei löytynyt, yritä asentaa gcj tai aseta $JAVAC"
+
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "Java-virtuaalikonetta ei löytynyt, yritä asentaa gij tai aseta $JAVA"
+
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "%s-aliprosessin siirräntävirhe"
+
+#~ msgid "cannot stat %s"
+#~ msgstr "tiedoston %s tilaa ei voi lukea"
+
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "tiedoston %s oikeuksien muuttaminen ei onnistu"
+
+#~ msgid "cannot create directory %s"
+#~ msgstr "hakemiston %s luominen ei onnistu"
+
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Tiedoston /dev/zero avaaminen lukemista varten epäonnistui"
+
+#~ msgid "creation of reading thread failed"
+#~ msgstr "lukemissäikeen luominen epäonnistui"
+
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "ei-lukitsevan siirron asettaminen aliprosessiin %s epäonnistui"
+
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "viestintä aliprosessin %s kanssa epäonnistui"
+
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "kirjoittaminen aliprosessiin %s epäonnistui"
+
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "lukeminen aliprosessista %s epäonnistui"
+
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "aliprosessi %s päättyi paluuarvolla %d"
+
+#~ msgid "creation of threads failed"
+#~ msgstr "säikeiden luominen epäonnistui"
+
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "%s-aliprosessi päättyi paluuarvolla %d"
+
+#~ msgid "Success"
+#~ msgstr "Onnistui"
+
+#~ msgid "No match"
+#~ msgstr "Ei täsmäävyyttä"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Virheellinen säännöllinen lauseke"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Virheellinen vertailumerkki"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Virheellinen merkkiluokan nimi"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Kenoviiva lopussa"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Virheellinen takaisinviittaus"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "Pariton [, [^, [:, [. tai [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "Pariton ( tai \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "Pariton \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Virheellinen \\{\\}:n sisältö"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Virheellinen välin loppu"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Muisti lopussa"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Virheellinen edeltävä säännöllinen lauseke"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Ennenaikainen säännöllisen lausekkeen loppu"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Säännöllinen lauseke on liian suuri"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "Pariton ) tai \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Ei edellistä säännöllistä lauseketta"
+
+# Kaikkihan muistavat kääntää nämä ja vastaavat juuri näin. Ei pelkkä kK.
+#~ msgid "^[yY]"
+#~ msgstr "^[kKyY]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[eEnN]"
+
+#~ msgid "setting permissions for %s"
+#~ msgstr "asetetaan oikeudet tiedostolle %s"
+
+#~ msgid "Hangup"
+#~ msgstr "Linjankatkaisu"
+
+#~ msgid "Interrupt"
+#~ msgstr "Keskeytys"
+
+#~ msgid "Quit"
+#~ msgstr "Lopetettu"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Virheellinen käsky"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Jäljitys-/katkaisupisteansa"
+
+#~ msgid "Aborted"
+#~ msgstr "Keskeytetty"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Liukulukupoikkeus"
+
+#~ msgid "Killed"
+#~ msgstr "Sammutettu"
+
+#~ msgid "Bus error"
+#~ msgstr "Väylävirhe"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Muistialueen ylitys"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Katkennut putki"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Herätyskello"
+
+#~ msgid "Terminated"
+#~ msgstr "Päätetty"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Kiireellinen I/O-ehto"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "Pysäytetty (signaali)"
+
+#~ msgid "Stopped"
+#~ msgstr "Pysäytetty"
+
+#~ msgid "Continued"
+#~ msgstr "Jatkettu"
+
+#~ msgid "Child exited"
+#~ msgstr "Lapsi lopetti"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Pysäytetty (tty-syöte)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Pysäytetty (tty-tuloste)"
+
+#~ msgid "I/O possible"
+#~ msgstr "I/O mahdollista"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Suoritinaikaraja ylittynyt"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Tiedoston kokoraja ylitetty"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Virtuaaliajastin vanhentunut"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Profilointiajastin vanhentunut"
+
+#~ msgid "Window changed"
+#~ msgstr "Ikkuna vaihtunut"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Käyttäjän määrittelemä signaali 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Käyttäjän määrittelemä signaali 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "EMT-ansa"
+
+#~ msgid "Bad system call"
+#~ msgstr "Virheellinen järjestelmäkutsu"
+
+#~ msgid "Stack fault"
+#~ msgstr "Pinovirhe"
+
+#~ msgid "Information request"
+#~ msgstr "Tietopyyntö"
+
+#~ msgid "Power failure"
+#~ msgstr "Sähkökatko"
+
+#~ msgid "Resource lost"
+#~ msgstr "Resurssi menetetty"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "virhe kirjoitettaessa suljettuun putkeen tai pistokkeeseen"
+
+#~ msgid "Real-time signal %d"
+#~ msgstr "Reaaliaikasignaali %d"
+
+#~ msgid "Unknown signal %d"
+#~ msgstr "Tuntematon signaali %d"
+
+#~ msgid "invalid user"
+#~ msgstr "virheellinen käyttäjä"
+
+#~ msgid "invalid group"
+#~ msgstr "virheellinen ryhmä"
+
+#~ msgid "invalid spec"
+#~ msgstr "virheellinen määrittely"
+
+#~ msgid "unable to display error message"
+#~ msgstr "ei kyetä näyttämään virheilmoitusta"
 
 #~ msgid "Packaged by %s (%s)\n"
-#~ msgstr "Pakkaaja: %s (%s)\n"
+#~ msgstr "Paketoinut %s (%s)\n"
 
 #~ msgid "Packaged by %s\n"
-#~ msgstr "Pakkaaja: %s\n"
+#~ msgstr "Paketoinut %s\n"
 
 #~ msgid "(C)"
 #~ msgstr "©"
 
-#, fuzzy
-#~| msgid ""
-#~| "\n"
-#~| "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
-#~| "html>.\n"
-#~| "This is free software: you are free to change and redistribute it.\n"
-#~| "There is NO WARRANTY, to the extent permitted by law.\n"
-#~| "\n"
 #~ msgid ""
 #~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
 #~ "This is free software: you are free to change and redistribute it.\n"
 #~ "There is NO WARRANTY, to the extent permitted by law.\n"
 #~ msgstr ""
-#~ "\n"
-#~ "Lisenssi GPLv3+: GNU GPL versio 3 tai myöhäisempi <http://gnu.org/"
-#~ "licenses/gpl.html>.\n"
-#~ "Tämä on vapaa ohjelmisto: voit vapaasti muuttaa sitä tai jakaa sitä "
-#~ "edelleen.\n"
-#~ "Ohjelmalle EI OLE TAKUUTA siinä laajuudessa mitä laki sen sallii.\n"
-#~ "\n"
+#~ "Lisenssi GPLv3+: GNU GPL versio 3 tai myöhempi <%s>.\n"
+#~ "\"Tämä on vapaa ohjelmisto; sitä saa vapaasti muuttaa ja levittää\n"
+#~ "\"edelleen. Siinä määrin kuin laki sallii, TAKUUTA EI OLE.\n"
 
 #~ msgid "Written by %s.\n"
 #~ msgstr "Kirjoittanut %s.\n"
@@ -323,522 +855,21 @@
 #~ "%s, %s, %s, %s,\n"
 #~ "%s, %s, %s ja muut.\n"
 
-#, fuzzy
-#~| msgid ""
-#~| "\n"
-#~| "Report bugs to: %s\n"
 #~ msgid "Report bugs to: %s\n"
 #~ msgstr ""
-#~ "\n"
-#~ "Lähetä ilmoitukset ohjelmistovioista (englanniksi) osoitteeseen %s\n"
-#~ "Lähetä ilmoitukset käännösvirheistä osoitteeseen <translation-team-"
-#~ "fi@lists.sourceforge.net>\n"
+#~ "Lähetä ilmoitukset ohjelmistovioista (englanniksi) osoitteeseen: %s\n"
 
 #~ msgid "Report %s bugs to: %s\n"
-#~ msgstr ""
-#~ "Lähetä %s ilmoitukset ohjelmistovioista (englanniksi) osoitteeseen %s\n"
+#~ msgstr "Ilmoita %s-vioista (englanniksi) osoitteeseen %s.\n"
 
 #~ msgid "%s home page: <%s>\n"
-#~ msgstr "%s kotisivu: <%s>\n"
+#~ msgstr "%s-kotisivu: <%s>\n"
 
-#, fuzzy
-#~| msgid "General help using GNU software: <http://www.gnu.org/gethelp/>\n"
 #~ msgid "General help using GNU software: <%s>\n"
-#~ msgstr ""
-#~ "Yleinen opaste GNU-ohjelmiston käyttämiseen: <http://www.gnu.org/gethelp/"
-#~ ">\n"
+#~ msgstr "Yleisohjeita GNU-ohjelmistojen käyttöön: <%s>\n"
 
-#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
-#~ msgstr "ARGP_HELP_FMT: %s arvo on pienempi tai yhtäsuuri kuin %s"
-
-#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
-#~ msgstr "%.*s: ARGP_HELP_FMT parametri vaatii arvon"
-
-#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
-#~ msgstr "%.*s: ARGP_HELP_FMT parametrin on oltava positiivinen"
-
-#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
-#~ msgstr "%.*s: Tuntematon ARGP_HELP_FMT-parametri"
-
-#~ msgid "Garbage in ARGP_HELP_FMT: %s"
-#~ msgstr "Roskaa kohteessa ARGP_HELP_FMT: %s"
-
-#~ msgid ""
-#~ "Mandatory or optional arguments to long options are also mandatory or "
-#~ "optional for any corresponding short options."
-#~ msgstr ""
-#~ "Pitkien valitsimien pakolliset tai valinnaiset argumentit ovat pakollisia "
-#~ "tai valinnaisia myös lyhyille valitsimille."
-
-#~ msgid "Usage:"
-#~ msgstr "Käyttö:"
-
-#~ msgid "  or: "
-#~ msgstr "  tai: "
-
-#~ msgid " [OPTION...]"
-#~ msgstr " [VALITSIN...]"
-
-#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
-#~ msgstr "Lisätietoja saa komennolla ”%s --help” tai ”%s --usage”.\n"
-
-#~ msgid "Report bugs to %s.\n"
-#~ msgstr "Lähetä raportit ohjelmistovioista (englanniksi) osoitteeseen %s.\n"
-
-#~ msgid "give this help list"
-#~ msgstr "anna tämä opasteluettelo"
-
-#~ msgid "give a short usage message"
-#~ msgstr "anna tämä lyhyt käyttösanoma"
-
-#~ msgid "NAME"
-#~ msgstr "NIMI"
-
-#~ msgid "set the program name"
-#~ msgstr "aseta ohjelman nimi"
-
-#~ msgid "SECS"
-#~ msgstr "SEKUNTIA"
-
-#~ msgid "hang for SECS seconds (default 3600)"
-#~ msgstr "odota SEKUNTIA sekuntia (oletus 3600)"
-
-#~ msgid "print program version"
-#~ msgstr "tulosta ohjelman versio"
-
-#~ msgid "(PROGRAM ERROR) No version known!?"
-#~ msgstr "(OHJELMAVIRHE) Versiota ei tiedetä!?"
-
-#~ msgid "%s: Too many arguments\n"
-#~ msgstr "%s: Liian monta argumenttia\n"
-
-#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
-#~ msgstr "(OHJELMAVIRHE) Valitsimen pitäisi olla tunnistettava!?"
-
-#~ msgid "program error"
-#~ msgstr "ohjelmavirhe"
-
-#~ msgid "stack overflow"
-#~ msgstr "pinon ylivuoto"
-
-#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
-#~ msgstr ""
-#~ "ei voi löytää tilapäistä hakemistoa, yritä asettaa $TMPDIR-"
-#~ "ympäristömuuttuja"
-
-#~ msgid "cannot create a temporary directory using template \"%s\""
-#~ msgstr "ei voida luoda tilapäistä hakemistoa käyttäen mallinnetta ”%s”"
-
-#~ msgid "cannot remove temporary file %s"
-#~ msgstr "ei voida poistaa tilapäistä tiedostoa %s"
-
-#~ msgid "cannot remove temporary directory %s"
-#~ msgstr "ei voida poistaa tilapäistä hakemistoa %s"
-
-#~ msgid "error closing file"
-#~ msgstr "virhe suljettaessa tiedostoa"
-
-#~ msgid "preserving permissions for %s"
-#~ msgstr "säilytetään oikeudet kohteelle %s"
-
-#~ msgid "error while opening \"%s\" for reading"
-#~ msgstr "virhe avattaessa tiedostoa ”%s” lukemista varten"
-
-#~ msgid "error reading \"%s\""
-#~ msgstr "virhe luettaessa tiedostoa ”%s”"
-
-#~ msgid "error writing \"%s\""
-#~ msgstr "virhe kirjoitettaessa tiedostoa ”%s”"
-
-#~ msgid "error after reading \"%s\""
-#~ msgstr "virhe luettaessa tiedostoa ”%s”"
-
-#~ msgid "fdopen() failed"
-#~ msgstr "fdopen()-kutsu epäonnistui"
-
-#~ msgid "C# compiler not found, try installing pnet"
-#~ msgstr "C#-kääntäjää ei löytynyt, yritä asentaa pnet"
-
-#~ msgid "C# virtual machine not found, try installing pnet"
-#~ msgstr "C#-virtuaalikonetta ei löytynyt, yritä asentaa pnet"
-
-#~ msgid "regular empty file"
-#~ msgstr "tavallinen tyhjä tiedosto"
-
-#~ msgid "regular file"
-#~ msgstr "tavallinen tiedosto"
-
-#~ msgid "directory"
-#~ msgstr "hakemisto"
-
-#~ msgid "block special file"
-#~ msgstr "lohkoerikoistiedosto"
-
-#~ msgid "character special file"
-#~ msgstr "merkkierikoistiedosto"
-
-#~ msgid "fifo"
-#~ msgstr "putkitiedosto"
-
-#~ msgid "symbolic link"
-#~ msgstr "symbolinen linkki"
-
-#~ msgid "socket"
-#~ msgstr "pistoke"
-
-#~ msgid "message queue"
-#~ msgstr "viestijono"
-
-#~ msgid "semaphore"
-#~ msgstr "semafori"
-
-#~ msgid "shared memory object"
-#~ msgstr "jaettu muistiobjekti"
-
-#~ msgid "typed memory object"
-#~ msgstr "tyypitetty muistiobjekti"
-
-#~ msgid "weird file"
-#~ msgstr "outo tiedosto"
-
-#~ msgid "Address family for hostname not supported"
-#~ msgstr "Osoiteperhe tietokonenimelle ei ole tuettu"
-
-#~ msgid "Temporary failure in name resolution"
-#~ msgstr "Tilapäinen virhe nimiratkaisussa"
-
-#~ msgid "Bad value for ai_flags"
-#~ msgstr "Väärä arvo kohteelle ai_flags"
-
-#~ msgid "Non-recoverable failure in name resolution"
-#~ msgstr "Korjaamaton virhe nimiratkaisussa"
-
-#~ msgid "ai_family not supported"
-#~ msgstr "ai_family ei ole tuettu"
-
-#~ msgid "Memory allocation failure"
-#~ msgstr "Muistinvarausvirhe"
-
-#~ msgid "No address associated with hostname"
-#~ msgstr "Tietokonenimeen ei ole liitetty osoitetta"
-
-#~ msgid "Name or service not known"
-#~ msgstr "Nimeä tai palvelua ei tunneta"
-
-#~ msgid "Servname not supported for ai_socktype"
-#~ msgstr "Servname ei ole tuettu kohteelle ai_socktype"
-
-#~ msgid "ai_socktype not supported"
-#~ msgstr "ai_socktype ei ole tuettu"
-
-#~ msgid "System error"
-#~ msgstr "Järjestelmävirhe"
-
-#~ msgid "Argument buffer too small"
-#~ msgstr "Argumenttipuskuri on liian suuri"
-
-#~ msgid "Processing request in progress"
-#~ msgstr "Prosessointipyyntö käsittelyssä"
-
-#~ msgid "Request canceled"
-#~ msgstr "Pyyntö peruttu"
-
-#~ msgid "Request not canceled"
-#~ msgstr "Pyyntöä ei ole peruttu"
-
-#~ msgid "All requests done"
-#~ msgstr "Kaikki pyynnöt suoritettu"
-
-#~ msgid "Interrupted by a signal"
-#~ msgstr "Signaalin keskeyttämä"
-
-#~ msgid "Parameter string not correctly encoded"
-#~ msgstr "Parametrimerkkijono ei ole oikein koodattu"
-
-#~ msgid "Unknown error"
-#~ msgstr "Tuntematon virhe"
-
-#~ msgid "%s: option '--%s' doesn't allow an argument\n"
-#~ msgstr "%s: valitsin ’--%s’ ei salli argumenttia\n"
-
-#~ msgid "%s: unrecognized option '--%s'\n"
-#~ msgstr "%s: tunnistamaton valitsin ’--%s’\n"
-
-#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
-#~ msgstr "%s: valitsin ’-W %s’ ei salli argumenttia\n"
-
-#~ msgid "%s: option '-W %s' requires an argument\n"
-#~ msgstr "%s: valitsin ’-W %s’ vaatii argumentin\n"
-
-#~ msgid "invalid source_version argument to compile_java_class"
-#~ msgstr "virheellinen source_version-argumentti kohteelle compile_java_class"
-
-#~ msgid "invalid target_version argument to compile_java_class"
-#~ msgstr "virheellinen target_version-argumentti kohteelle compile_java_class"
-
-#~ msgid "failed to create \"%s\""
-#~ msgstr "kohteen ”%s” luominen epäonnistui"
-
-#~ msgid "error while writing \"%s\" file"
-#~ msgstr "virhe kirjoitettaessa tiedostoa ”%s”"
-
-#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
-#~ msgstr ""
-#~ "Java-kääntäjää ei löytynyt, yritä asentaa gcj tai aseta $JAVAC-"
-#~ "ympäristömuuttuja"
-
-#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
-#~ msgstr ""
-#~ "Java-virtuaalikonetta ei löytynyt, yritä asentaa gij tai aseta $JAVA-"
-#~ "ympäristömuuttuja"
-
-#~ msgid "%s subprocess I/O error"
-#~ msgstr "%s-aliprosessisiirräntävirhe"
-
-#~ msgid "cannot change permissions of %s"
-#~ msgstr "kohteen %s oikeuksien muuttaminen ei onnistu"
-
-#~ msgid "cannot create directory %s"
-#~ msgstr "hakemiston %s luominen ei onnistu"
-
-#~ msgid "unable to record current working directory"
-#~ msgstr "ei kyetä tallentaman nykyistä työhakemistoa"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "alkuperäiseen työhakemistoon palaaminen epäonnistui"
-
-#~ msgid "Failed to open /dev/zero for read"
-#~ msgstr "Kohteen /dev/zero avaaminen lukemista varten epäonnistui"
-
-#~ msgid "creation of reading thread failed"
-#~ msgstr "lukemissäikeen luominen epäonnistui"
-
-#  nonblocking I/O on synonyymi termille asynchronous I/O
-#~ msgid "cannot set up nonblocking I/O to %s subprocess"
-#~ msgstr "ei voi asettaa tahdistamatonta siirräntää aliprosessille %s"
-
-#~ msgid "communication with %s subprocess failed"
-#~ msgstr "viestintä aliprosessin %s kanssa epäonnistui"
-
-#~ msgid "write to %s subprocess failed"
-#~ msgstr "kirjoittaminen aliprosessiin %s epäonnistui"
-
-#~ msgid "read from %s subprocess failed"
-#~ msgstr "lukeminen aliprosessista %s epäonnistui"
-
-#~ msgid "subprocess %s terminated with exit code %d"
-#~ msgstr "aliprosessi %s päättyi poistumiskoodilla %d"
-
-#~ msgid "creation of threads failed"
-#~ msgstr "säikeiden luominen epäonnistui"
-
-#~ msgid "%s subprocess terminated with exit code %d"
-#~ msgstr "%s-aliprosessi päättyi poistumiskoodilla %d"
-
-#~ msgid "Franc,ois Pinard"
-#~ msgstr "François Pinard"
-
-#~ msgid "Success"
-#~ msgstr "Onnistui"
-
-#~ msgid "No match"
-#~ msgstr "Ei osumaa"
-
-#~ msgid "Invalid regular expression"
-#~ msgstr "Virheellinen säännöllinen lauseke"
-
-#~ msgid "Invalid collation character"
-#~ msgstr "virheellinen collation-merkkiluokka"
-
-#~ msgid "Invalid character class name"
-#~ msgstr "Virheellinen merkkiluokkanimi"
-
-#~ msgid "Trailing backslash"
-#~ msgstr "Jälkikenoviiva"
-
-#~ msgid "Invalid back reference"
-#~ msgstr "Virheellinen paluuviite"
-
-#~ msgid "Unmatched [ or [^"
-#~ msgstr "Pariton [ tai [^"
-
-#~ msgid "Unmatched ( or \\("
-#~ msgstr "pariton ( tai \\("
-
-#~ msgid "Unmatched \\{"
-#~ msgstr "Pariton \\{"
-
-#~ msgid "Invalid content of \\{\\}"
-#~ msgstr "Kohteen \\{\\} virheellinen sisältö"
-
-#~ msgid "Invalid range end"
-#~ msgstr "Virheellinen lukualueen loppu"
-
-#~ msgid "Memory exhausted"
-#~ msgstr "Muisti loppui"
-
-#~ msgid "Invalid preceding regular expression"
-#~ msgstr "Virheellinen edeltävä säännöllinen lauseke"
-
-#~ msgid "Premature end of regular expression"
-#~ msgstr "Ennenaikainen säännöllisen lausekkeen loppu"
-
-#~ msgid "Regular expression too big"
-#~ msgstr "Säännöllinen lauseke on liian iso"
-
-#~ msgid "Unmatched ) or \\)"
-#~ msgstr "Pariton ) tai \\)"
-
-#~ msgid "No previous regular expression"
-#~ msgstr "Ei edellistä säännöllistä lauseketta"
-
-# Kaikkihan muistavat kääntää nämä ja vastaavat juuri näin. Ei pelkkä kK.
-#~ msgid "^[yY]"
-#~ msgstr "^[kKyY]"
-
-#~ msgid "^[nN]"
-#~ msgstr "^[eEnN]"
-
-#~ msgid "setting permissions for %s"
-#~ msgstr "asetetaan oikeudet kohteelle %s"
-
-#~ msgid "Hangup"
-#~ msgstr "Yhteyden katkaisu"
-
-#~ msgid "Interrupt"
-#~ msgstr "Keskeytys"
-
-#~ msgid "Quit"
-#~ msgstr "Poistu"
-
-#~ msgid "Illegal instruction"
-#~ msgstr "Virheellinen käsky"
-
-#~ msgid "Trace/breakpoint trap"
-#~ msgstr "Jäljitys/keskeytyspistekeskeytys"
-
-#~ msgid "Aborted"
-#~ msgstr "Keskeytetty"
-
-#~ msgid "Floating point exception"
-#~ msgstr "Liukulukupoikkeus"
-
-#~ msgid "Killed"
-#~ msgstr "Sammutettu"
-
-#~ msgid "Bus error"
-#~ msgstr "Väylävirhe"
-
-#~ msgid "Segmentation fault"
-#~ msgstr "Osiinjakamisvirhe"
-
-#~ msgid "Broken pipe"
-#~ msgstr "Rikkoutunut putki"
-
-#~ msgid "Terminated"
-#~ msgstr "Päättynyt"
-
-#~ msgid "Urgent I/O condition"
-#~ msgstr "Kiireellinen siirräntätila"
-
-#~ msgid "Stopped (signal)"
-#~ msgstr "Pysäytetty (signaali)"
-
-#~ msgid "Stopped"
-#~ msgstr "Pysäytetty"
-
-#~ msgid "Continued"
-#~ msgstr "Jatkettu"
-
-#~ msgid "Child exited"
-#~ msgstr "Lapsiprosessi poistunut"
-
-#~ msgid "Stopped (tty input)"
-#~ msgstr "Pysäytetty (tty-syöte)"
-
-#~ msgid "Stopped (tty output)"
-#~ msgstr "Pysäytetty (tty-tuloste)"
-
-#~ msgid "I/O possible"
-#~ msgstr "Siirräntä mahdollinen"
-
-#~ msgid "CPU time limit exceeded"
-#~ msgstr "Suoritinaikaraja ylitetty"
-
-#~ msgid "File size limit exceeded"
-#~ msgstr "Tiedostonkokoraja ylitetty"
-
-#~ msgid "Virtual timer expired"
-#~ msgstr "Virtuaaliajastin päättynyt"
-
-#~ msgid "Profiling timer expired"
-#~ msgstr "Profilointiajastin päättynyt"
-
-#~ msgid "Window changed"
-#~ msgstr "Ikkuna vaihtunut"
-
-#~ msgid "User defined signal 1"
-#~ msgstr "Käyttäjän määrittelemä signaali 1"
-
-#~ msgid "User defined signal 2"
-#~ msgstr "Käyttäjän määrittelemä signaali 2"
-
-#~ msgid "EMT trap"
-#~ msgstr "EMT-keskeytys"
-
-#~ msgid "Bad system call"
-#~ msgstr "Väärä järjestelmäkutsu"
-
-#~ msgid "Stack fault"
-#~ msgstr "Pinovirhe"
-
-#~ msgid "Information request"
-#~ msgstr "Tietopyyntö"
-
-#~ msgid "Power failure"
-#~ msgstr "Teholähdevika"
-
-#~ msgid "Resource lost"
-#~ msgstr "Resurssi kadonnut"
-
-#~ msgid "error writing to a closed pipe or socket"
-#~ msgstr "virhe kirjoitettaessa suljettuun putkeen tai pistokkeeseen"
-
-#~ msgid "Real-time signal %d"
-#~ msgstr "Tosiaikasignaali %d"
-
-#~ msgid "Unknown signal %d"
-#~ msgstr "Tuntematon signaali %d"
-
-#~ msgid "iconv function not usable"
-#~ msgstr "iconv-funktio ei ole käyttökelpoinen"
-
-#~ msgid "iconv function not available"
-#~ msgstr "iconv-funktio ei ole saatavilla"
-
-#~ msgid "character out of range"
-#~ msgstr "merkki sallitun välin ulkopuolella"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "merkin U+%04X muunnos paikalliseen merkistöön ei onnistu"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "merkin U+%04X muunnos paikalliseen merkistöön ei onnistu: %s"
-
-#~ msgid "invalid user"
-#~ msgstr "virheellinen käyttäjä"
-
-#~ msgid "invalid group"
-#~ msgstr "virheellinen ryhmä"
-
-#~ msgid "invalid spec"
-#~ msgstr "virheellinen määrittely"
-
-#~ msgid "unable to display error message"
-#~ msgstr "ei kyetä näyttämään virheilmoitusta"
-
-#~ msgid "%s home page: <http://www.gnu.org/software/%s/>\n"
-#~ msgstr "%s kotisivu:  <http://www.gnu.org/software/%s/>\n"
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr "tiedostokahvan teksti-/binääritilan asettaminen epäonnistui"
 
 #~ msgid "stdin"
 #~ msgstr "vakiosyöte"
@@ -847,10 +878,10 @@
 #~ msgstr "vakiotuloste"
 
 #~ msgid "stderr"
-#~ msgstr "vakiovirhe"
+#~ msgstr "vakiovirhetuloste"
 
 #~ msgid "unknown stream"
-#~ msgstr "tuntematon merkkivirta"
+#~ msgstr "tuntematon virta"
 
 #~ msgid "failed to reopen %s with mode %s"
 #~ msgstr "kohteen %s avaaminen uudelleen tilassa %s epäonnistui"
@@ -865,13 +896,16 @@
 #~ msgstr "Vertaillut merkkijonot olivat %s ja %s."
 
 #~ msgid "cannot perform formatted output"
-#~ msgstr "muotoiltua tulostetta ei voitu suorittaa"
+#~ msgstr "muotoiltua tulostusta ei voitu suorittaa"
 
-#~ msgid "invalid %s%s argument `%s'"
+#~ msgid "standard file descriptors"
+#~ msgstr "tavalliset tiedostokahvat"
+
+#~ msgid "invalid %s%s argument '%s'"
 #~ msgstr "virheellinen %s%s-argumentti ”%s”"
 
-#~ msgid "invalid suffix in %s%s argument `%s'"
-#~ msgstr "virheellinen jälkiliite kohteen %s%s argumentissa ”%s”"
+#~ msgid "invalid suffix in %s%s argument '%s'"
+#~ msgstr "virheellinen loppuliite %s%s-argumentissa ”%s”"
 
-#~ msgid "%s%s argument `%s' too large"
-#~ msgstr "%s%s argumentti ”%s” on liian iso"
+#~ msgid "%s%s argument '%s' too large"
+#~ msgstr "%s%s-argumentti ”%s” on liian suuri"
diff --git a/gnulib-po/fr.gmo b/gnulib-po/fr.gmo
index 16fad9d..bb5a94a 100644
--- a/gnulib-po/fr.gmo
+++ b/gnulib-po/fr.gmo
Binary files differ
diff --git a/gnulib-po/fr.po b/gnulib-po/fr.po
index 374b5d3..e38a214 100644
--- a/gnulib-po/fr.po
+++ b/gnulib-po/fr.po
@@ -11,7 +11,7 @@
 msgstr ""
 "Project-Id-Version: gnulib-4.0.0.2567\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2019-05-21 20:15+0200\n"
 "Last-Translator: Stéphane Aulery <lkppo@free.fr>\n"
 "Language-Team: French <traduc@traduc.org>\n"
@@ -37,44 +37,44 @@
 msgid "Valid arguments are:"
 msgstr "Les arguments valables sont :"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr "%u bitset_allocs, %u libérés (%.2f%%).\n"
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_sets, %u cachés (%.2f%%).\n"
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_resets, %u cachés (%.2f%%)\n"
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr "%u bitset_tests, %u cachés (%.2f%%)\n"
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr "%u bitset_lists\n"
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr "histogramme par comptage\n"
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr "histogramme par taille\n"
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr "histogramme par densité\n"
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
@@ -83,25 +83,25 @@
 "Statistiques de bitset :\n"
 "\n"
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr "Lancement cumulés = %u\n"
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 msgid "cannot read stats file"
 msgstr "impossible de lire les permissions du fichier"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr "taille du fichier de permission erroné\n"
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 msgid "cannot write stats file"
 msgstr "impossible d'écrire les permissions du fichier"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
 msgstr "impossible d'ouvrir les permissions du fichier en écriture"
 
@@ -113,6 +113,12 @@
 msgid "Unknown system error"
 msgstr "Erreur système inconnue"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "échec de sous-processus %s"
+
 #: lib/getopt.c:278
 #, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -148,10 +154,31 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s : l'option nécessite un argument -- « %c »\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "mémoire épuisée"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "impossible de mémoriser le répertoire de travail courant"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "échec de retour au répertoire initial de travail"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "échec de _open_osfhandle"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+"impossible de restaurer le descripteur de fichier (fd) %d : échec de dup2"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -173,26 +200,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "« "
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr " »"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "impossible de créer un tube (« pipe »)"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "échec de sous-processus %s"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr "Temps d'exécution (s)"
@@ -209,23 +230,34 @@
 msgid "wall clock"
 msgstr "horloge murale"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "échec de _open_osfhandle"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "fonction iconv non utilisable"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr ""
-"impossible de restaurer le descripteur de fichier (fd) %d : échec de dup2"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "fonction iconv non disponible"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "caractère hors limites"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "impossible de convertir U+%04X dans le jeu de caractères local"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "impossible de convertir U+%04X dans le jeu de caractères local : %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "sous-processus %s"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "le sous-processus %s a reçu un signal fatal %d"
@@ -631,12 +663,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "impossible de créer le répertoire %s"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "impossible de mémoriser le répertoire de travail courant"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "échec de retour au répertoire initial de travail"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Échec d'ouverture de /dev/zero en lecture"
 
@@ -840,21 +866,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Signal %d inconnu"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "fonction iconv non utilisable"
-
-#~ msgid "iconv function not available"
-#~ msgstr "fonction iconv non disponible"
-
-#~ msgid "character out of range"
-#~ msgstr "caractère hors limites"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "impossible de convertir U+%04X dans le jeu de caractères local"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "impossible de convertir U+%04X dans le jeu de caractères local : %s"
-
 #~ msgid "invalid user"
 #~ msgstr "utilisateur non valable"
 
diff --git a/gnulib-po/ga.gmo b/gnulib-po/ga.gmo
index 0e2cba8..0755436 100644
--- a/gnulib-po/ga.gmo
+++ b/gnulib-po/ga.gmo
Binary files differ
diff --git a/gnulib-po/ga.po b/gnulib-po/ga.po
index b5a0cc7..d47f3f3 100644
--- a/gnulib-po/ga.po
+++ b/gnulib-po/ga.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 1.1\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2007-07-20 12:24-0600\n"
 "Last-Translator: Kevin Scannell <kscanne@gmail.com>\n"
 "Language-Team: Irish <gaeilge-gnulinux@lists.sourceforge.net>\n"
@@ -33,71 +33,71 @@
 msgid "Valid arguments are:"
 msgstr "Na hargóintí bailí:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "ní féidir píopa a chruthú"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "ní féidir píopa a chruthú"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "ní féidir comhad cúltaca \"%s\" a oscailt chun scríobh ann"
@@ -110,6 +110,12 @@
 msgid "Unknown system error"
 msgstr "Earráid chórais anaithnid"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "theip ar fhophróiseas %s"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -145,10 +151,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: tá argóint de dhíth i ndiaidh na rogha -- %c\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "cuimhne ídithe"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "ní féidir an chomhadlann oibre a thaifead"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "níl aon fháil ar an chéad chomhadlann oibre"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -170,26 +196,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "`"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "'"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "ní féidir píopa a chruthú"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "theip ar fhophróiseas %s"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -206,22 +226,34 @@
 msgid "wall clock"
 msgstr ""
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr ""
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "ní féidir an fheidhm iconv a úsáid"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr ""
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "níl an fheidhm iconv ar fáil"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "carachtar as raon"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "ní féidir U+%04X a thiontú chuig an fhoireann carachtar logánta"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "ní féidir U+%04X a thiontú chuig an fhoireann carachtar logánta: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "fophróiseas %s"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "fuair fophróiseas %s comhartha marfach %d"
@@ -562,12 +594,6 @@
 #~ msgstr ""
 #~ "Meaisín fíorúil Java gan aimsiú, bain triail as gij, nó socraigh $JAVA"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "ní féidir an chomhadlann oibre a thaifead"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "níl aon fháil ar an chéad chomhadlann oibre"
-
 #~ msgid "cannot change permissions of %s"
 #~ msgstr "ní féidir na ceadanna de %s a athrú"
 
@@ -656,21 +682,6 @@
 #~ msgid "^[nN]"
 #~ msgstr "^[nN]"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "ní féidir an fheidhm iconv a úsáid"
-
-#~ msgid "iconv function not available"
-#~ msgstr "níl an fheidhm iconv ar fáil"
-
-#~ msgid "character out of range"
-#~ msgstr "carachtar as raon"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "ní féidir U+%04X a thiontú chuig an fhoireann carachtar logánta"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "ní féidir U+%04X a thiontú chuig an fhoireann carachtar logánta: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "úsáideoir neamhbhailí"
 
diff --git a/gnulib-po/gl.gmo b/gnulib-po/gl.gmo
index e498c6b..d6994f2 100644
--- a/gnulib-po/gl.gmo
+++ b/gnulib-po/gl.gmo
Binary files differ
diff --git a/gnulib-po/gl.po b/gnulib-po/gl.po
index 51cf806..1b4d933 100644
--- a/gnulib-po/gl.po
+++ b/gnulib-po/gl.po
@@ -13,7 +13,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 3.0.0.6062.a6b16\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2012-11-11 13:26+0200\n"
 "Last-Translator: Leandro Regueiro <leandro.regueiro@gmail.com>\n"
 "Language-Team: Galician <proxecto@trasno.net>\n"
@@ -38,71 +38,71 @@
 msgid "Valid arguments are:"
 msgstr "Os argumentos válidos son:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "non é posíbel crear a canalización"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "non é posíbel crear a canalización"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr ""
@@ -116,6 +116,12 @@
 msgid "Unknown system error"
 msgstr "Erro do sistema descoñecido"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr ""
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -151,10 +157,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: a opción require un argumento -- «%c»\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "memoria esgotada"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "non foi posíbel gravar o directorio de traballo actual"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "non foi posíbel volver ao directorio de traballo inicial"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle fallou"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "non foi posíbel restaurar o fd %d: dup2 fallou"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -176,26 +202,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "«"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "»"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "non é posíbel crear a canalización"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr ""
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -213,22 +233,34 @@
 msgid "wall clock"
 msgstr "Reloxo de alarma"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle fallou"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "a función iconv non é utilizábel"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "non foi posíbel restaurar o fd %d: dup2 fallou"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "a función iconv non está dispoñíbel"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "carácter fóra de intervalo"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "non é posíbel converter U+%04X ao xogo de caracteres local"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "non é posíbel converter U+%04X ao xogo de caracteres local: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr ""
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr ""
@@ -503,12 +535,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "non foi posíbel crear o directorio %s"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "non foi posíbel gravar o directorio de traballo actual"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "non foi posíbel volver ao directorio de traballo inicial"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Produciuse un erro ao abrir /dev/zero para ler"
 
@@ -650,21 +676,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Sinal %d descoñecido"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "a función iconv non é utilizábel"
-
-#~ msgid "iconv function not available"
-#~ msgstr "a función iconv non está dispoñíbel"
-
-#~ msgid "character out of range"
-#~ msgstr "carácter fóra de intervalo"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "non é posíbel converter U+%04X ao xogo de caracteres local"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "non é posíbel converter U+%04X ao xogo de caracteres local: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "usuario incorrecto"
 
diff --git a/gnulib-po/hu.gmo b/gnulib-po/hu.gmo
index c12b9f8..988ae6b 100644
--- a/gnulib-po/hu.gmo
+++ b/gnulib-po/hu.gmo
Binary files differ
diff --git a/gnulib-po/hu.po b/gnulib-po/hu.po
index 6813d34..514c2cd 100644
--- a/gnulib-po/hu.po
+++ b/gnulib-po/hu.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 3.0.0.6062.a6b16\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2014-06-25 19:51+0200\n"
 "Last-Translator: Balázs Úr <urbalazs@gmail.com>\n"
 "Language-Team: Hungarian <translation-team-hu@lists.sourceforge.net>\n"
@@ -35,71 +35,71 @@
 msgid "Valid arguments are:"
 msgstr "Az érvényes argumentumok a következők:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "nem hozható létre adatcsatorna"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "nem hozható létre adatcsatorna"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "%s mentési fájl megnyitása írásra sikertelen"
@@ -112,6 +112,12 @@
 msgid "Unknown system error"
 msgstr "Ismeretlen rendszerhiba"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s alfolyamat sikertelen"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -147,10 +153,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: a kapcsoló egy argumentumot igényel -- „%c”\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "elfogyott a memória"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "az aktuális munkakönyvtár feljegyzése meghiúsult"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "a visszatérés meghiúsult a kiinduló munkakönyvtárba"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle sikertelen"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "az fd %d visszaállítása nem sikerült: dup2 sikertelen"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -172,26 +198,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "„"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "”"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "nem hozható létre adatcsatorna"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "%s alfolyamat sikertelen"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -209,22 +229,34 @@
 msgid "wall clock"
 msgstr "Ébresztőóra"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle sikertelen"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "az iconv függvény nem használható"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "az fd %d visszaállítása nem sikerült: dup2 sikertelen"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "az iconv függvény nem elérhető"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "tartományon kívüli karakter"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "nem lehet helyi karakterkészletbe átalakítani a következőt: U+%04X"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "az U+%04X nem konvertálható a helyi karakterkészletbe:  %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "%s alfolyamat"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s alfolyamat végzetes %d szignált kapott"
@@ -599,12 +631,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "nem lehet létrehozni a(z) %s könyvtárat"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "az aktuális munkakönyvtár feljegyzése meghiúsult"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "a visszatérés meghiúsult a kiinduló munkakönyvtárba"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "A /dev/zero megnyitása olvasásra sikertelen"
 
@@ -806,21 +832,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Ismeretlen szignál %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "az iconv függvény nem használható"
-
-#~ msgid "iconv function not available"
-#~ msgstr "az iconv függvény nem elérhető"
-
-#~ msgid "character out of range"
-#~ msgstr "tartományon kívüli karakter"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "nem lehet helyi karakterkészletbe átalakítani a következőt: U+%04X"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "az U+%04X nem konvertálható a helyi karakterkészletbe:  %s"
-
 #~ msgid "invalid user"
 #~ msgstr "érvénytelen felhasználó"
 
diff --git a/gnulib-po/it.gmo b/gnulib-po/it.gmo
index 4cc60d5..122196c 100644
--- a/gnulib-po/it.gmo
+++ b/gnulib-po/it.gmo
Binary files differ
diff --git a/gnulib-po/it.po b/gnulib-po/it.po
index 23aec73..9b7c74a 100644
--- a/gnulib-po/it.po
+++ b/gnulib-po/it.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: gnulib-4.0.0.2567\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2019-05-21 14:07+0200\n"
 "Last-Translator: Milo Casagrande <milo@milo.name>\n"
 "Language-Team: Italian <tp@lists.linux.it>\n"
@@ -35,44 +35,44 @@
 msgid "Valid arguments are:"
 msgstr "Sono argomenti validi:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr "%u bitset_allocs, %u liberati (%.2f%%).\n"
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_sets, %u nella cache (%.2f%%)\n"
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_resets, %u nella cache (%.2f%%)\n"
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr "%u bitset_tests, %u nella cache (%.2f%%)\n"
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr "%u bitset_lists\n"
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr "istogramma registro del conteggio\n"
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr "istogramma registro delle dimensioni\n"
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr "istogramma densità\n"
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
@@ -81,25 +81,25 @@
 "Statistiche bitset:\n"
 "\n"
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr "Esecuzioni accumulate = %u\n"
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 msgid "cannot read stats file"
 msgstr "impossibile leggere il file delle statistiche"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr "dimensione file delle statistiche errata\n"
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 msgid "cannot write stats file"
 msgstr "impossibile scrivere il file delle statistiche"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
 msgstr "impossibile aprire il file delle statistiche in scrittura"
 
@@ -111,6 +111,12 @@
 msgid "Unknown system error"
 msgstr "Errore di sistema sconosciuto"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s: sottoprocesso non riuscito"
+
 #: lib/getopt.c:278
 #, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -146,10 +152,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: l'opzione richiede un argomento -- %c\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "memoria esaurita"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "impossibile registrare la directory di lavoro corrente"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "ritorno alla directory di lavoro iniziale non riuscito"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle non riuscita"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "impossibile ripristinare fd %d: dup2 non riuscita"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -171,26 +197,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "«"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "»"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "impossibile creare la pipe"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "%s: sottoprocesso non riuscito"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr "Tempi di esecuzione (secondi)"
@@ -207,22 +227,34 @@
 msgid "wall clock"
 msgstr "tempo reale"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle non riuscita"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "funzione iconv non utilizzabile"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "impossibile ripristinare fd %d: dup2 non riuscita"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "funzione iconv non disponibile"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "carattere fuori dall'intervallo"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "impossibile convertire U+%04X nel set di caratteri locale"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "impossibile convertire U+%04X nel set di caratteri locale: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "sottoprocesso %s"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "il sottoprocesso %s ha ricevuto un segnale %d fatale"
@@ -634,12 +666,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "impossibile creare la directory %s"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "impossibile registrare la directory di lavoro corrente"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "ritorno alla directory di lavoro iniziale non riuscito"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Apertura di /dev/zero in lettura non riuscita"
 
@@ -880,21 +906,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Segnale %d sconosciuto"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "funzione iconv non utilizzabile"
-
-#~ msgid "iconv function not available"
-#~ msgstr "funzione iconv non disponibile"
-
-#~ msgid "character out of range"
-#~ msgstr "carattere fuori dall'intervallo"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "impossibile convertire U+%04X nel set di caratteri locale"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "impossibile convertire U+%04X nel set di caratteri locale: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "utente non valido"
 
diff --git a/gnulib-po/ja.gmo b/gnulib-po/ja.gmo
index 8bf941d..c8dbc11 100644
--- a/gnulib-po/ja.gmo
+++ b/gnulib-po/ja.gmo
Binary files differ
diff --git a/gnulib-po/ja.po b/gnulib-po/ja.po
index d9d0658..84a4be6 100644
--- a/gnulib-po/ja.po
+++ b/gnulib-po/ja.po
@@ -11,7 +11,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 3.0.0.6062.a6b16\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2011-09-02 18:39+0900\n"
 "Last-Translator: Yasuaki Taniguchi <yasuakit@gmail.com>\n"
 "Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
@@ -36,71 +36,71 @@
 msgid "Valid arguments are:"
 msgstr "有効な引数:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "パイプを作成できません"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "パイプを作成できません"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "書込み用バックアップファイル\"%s\"を開くことができません"
@@ -113,6 +113,12 @@
 msgid "Unknown system error"
 msgstr "不明なシステムエラー"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s サブプロセスが失敗しました"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -148,10 +154,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: オプションには引数が必要です -- '%c'\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "メモリを使い果たしました"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "現在の作業ディレクトリを記録することができません"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "初期作業ディレクトリに戻るのに失敗しました"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle に失敗しました"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "ファイル記述子 (fd) %d をリストアできません: dup2 に失敗しました"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -173,26 +199,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "`"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "'"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "パイプを作成できません"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "%s サブプロセスが失敗しました"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -210,22 +230,34 @@
 msgid "wall clock"
 msgstr "Alarm clock"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle に失敗しました"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "iconv 関数が使えません"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "ファイル記述子 (fd) %d をリストアできません: dup2 に失敗しました"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "iconv 関数が有効ではありません"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "範囲外の文字"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "U+%04X をローカル文字セットに変換できません"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "U+%04X をローカル文字セットに変換できません: %s "
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "%s 子プロセス"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s 子プロセスが致命的なシグナル %d を受信しました"
@@ -601,12 +633,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "ディレクトリ %s を作成できません"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "現在の作業ディレクトリを記録することができません"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "初期作業ディレクトリに戻るのに失敗しました"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "/dev/zeroを読込み用に開けません"
 
@@ -808,21 +834,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "不明なシグナル %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "iconv 関数が使えません"
-
-#~ msgid "iconv function not available"
-#~ msgstr "iconv 関数が有効ではありません"
-
-#~ msgid "character out of range"
-#~ msgstr "範囲外の文字"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "U+%04X をローカル文字セットに変換できません"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "U+%04X をローカル文字セットに変換できません: %s "
-
 #~ msgid "invalid user"
 #~ msgstr "無効なユーザ"
 
diff --git a/gnulib-po/ko.gmo b/gnulib-po/ko.gmo
index fbc524d..b500faa 100644
--- a/gnulib-po/ko.gmo
+++ b/gnulib-po/ko.gmo
Binary files differ
diff --git a/gnulib-po/ko.po b/gnulib-po/ko.po
index 5be000e..ff0bb71 100644
--- a/gnulib-po/ko.po
+++ b/gnulib-po/ko.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: GNU textutils 2.0.22\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2002-07-22 20:02+0900\n"
 "Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
 "Language-Team: Korean <translation-team-ko@lists.sourceforge.net>\n"
@@ -31,71 +31,71 @@
 msgid "Valid arguments are:"
 msgstr "¿Ã¹Ù¸¥ ÀÎÀÚ´Â:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "%s µð·ºÅ丮¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "%s µð·ºÅ丮¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "`%s'¸¦ `%s'·Î À̵¿ÇÒ ¼ö ¾ø½À´Ï´Ù"
@@ -108,6 +108,12 @@
 msgid "Unknown system error"
 msgstr "¾Ë ¼ö ¾ø´Â ½Ã½ºÅÛ ¿À·ù"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s: ºÎÀûÀýÇÑ ÆÐÅÏ"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -143,10 +149,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: ÀÌ ¿É¼ÇÀº Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù -- %c\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "¸Þ¸ð¸®°¡ ¹Ù´Ú³²"
 
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "%s µð·ºÅ丮¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù"
+
+#: lib/openat-die.c:57
+#, fuzzy, c-format
+msgid "failed to return to initial working directory"
+msgstr "%s µð·ºÅ丮¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -168,26 +194,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "`"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "'"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, fuzzy, c-format
 msgid "cannot create pipe"
 msgstr "%s µð·ºÅ丮¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, fuzzy, c-format
-msgid "%s subprocess failed"
-msgstr "%s: ºÎÀûÀýÇÑ ÆÐÅÏ"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -204,22 +224,35 @@
 msgid "wall clock"
 msgstr ""
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr ""
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "iconv ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr ""
+# not usable°ú not availableÀÇ Â÷ÀÌ´Â?
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "iconv ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "¹üÀ§¸¦ ¹þ¾î³­ ¹®ÀÚ"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "U+%04XÀ»(¸¦) ·ÎÄ® ¹®ÀÚ¼ÂÀ¸·Î º¯È¯ÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "U+%04XÀ»(¸¦) ·ÎÄ® ¹®ÀÚ¼ÂÀ¸·Î º¯È¯ÇÒ ¼ö ¾ø½À´Ï´Ù: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, fuzzy, c-format
 msgid "%s subprocess"
 msgstr "%s: ºÎÀûÀýÇÑ ÆÐÅÏ"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, fuzzy, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s: ºÎÀûÀýÇÑ ÆÐÅÏ"
@@ -434,10 +467,6 @@
 #~ msgstr "%sÀÇ Çã°¡¸¦ ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù"
 
 #, fuzzy
-#~ msgid "unable to record current working directory"
-#~ msgstr "%s µð·ºÅ丮¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù"
-
-#, fuzzy
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "%sÀÇ Çã°¡¸¦ ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù"
 
@@ -475,22 +504,6 @@
 #~ msgid "^[nN]"
 #~ msgstr "^[nN]"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "iconv ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù"
-
-# not usable°ú not availableÀÇ Â÷ÀÌ´Â?
-#~ msgid "iconv function not available"
-#~ msgstr "iconv ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù"
-
-#~ msgid "character out of range"
-#~ msgstr "¹üÀ§¸¦ ¹þ¾î³­ ¹®ÀÚ"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "U+%04XÀ»(¸¦) ·ÎÄ® ¹®ÀÚ¼ÂÀ¸·Î º¯È¯ÇÒ ¼ö ¾ø½À´Ï´Ù"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "U+%04XÀ»(¸¦) ·ÎÄ® ¹®ÀÚ¼ÂÀ¸·Î º¯È¯ÇÒ ¼ö ¾ø½À´Ï´Ù: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "À߸øµÈ »ç¿ëÀÚ"
 
diff --git a/gnulib-po/ms.gmo b/gnulib-po/ms.gmo
index ea6247b..4f02d72 100644
--- a/gnulib-po/ms.gmo
+++ b/gnulib-po/ms.gmo
Binary files differ
diff --git a/gnulib-po/ms.po b/gnulib-po/ms.po
index e22393d..6042d1b 100644
--- a/gnulib-po/ms.po
+++ b/gnulib-po/ms.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version:  coreutils 5.0.90\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2003-08-10 16:00+0800\n"
 "Last-Translator: Hasbullah Bin Pit <sebol@ikhlas.com>\n"
 "Language-Team: Malay <translation-team-ms@lists.sourceforge.net>\n"
@@ -30,71 +30,71 @@
 msgid "Valid arguments are:"
 msgstr "Hujah sah adalah:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "tak boleh mencipta pautan %s"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "tak boleh mencipta pautan %s"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "tak dapat buka %s untuk dibaca"
@@ -107,6 +107,12 @@
 msgid "Unknown system error"
 msgstr "Ralat sistem yang tidak diketahui"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "fail istimewa blok"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -142,10 +148,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: opsyen memerlukan hujah -- %c\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "memori keletihan"
 
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "gagal untuk kembali ke direktori kerja pemulaan"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "gagal untuk kembali ke direktori kerja pemulaan"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -167,26 +193,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "`"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "`"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, fuzzy, c-format
 msgid "cannot create pipe"
 msgstr "tak boleh mencipta pautan %s"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, fuzzy, c-format
-msgid "%s subprocess failed"
-msgstr "fail istimewa blok"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -203,22 +223,34 @@
 msgid "wall clock"
 msgstr ""
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr ""
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "fungsi iconv tak boleh digunakan"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr ""
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "fungsi iconv tidak ada"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "aksara di luar julat"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "tak dapat menukar U+%04X ke set aksara lokal"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "tak dapat menukar U+%04X ke set aksara lokal: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, fuzzy, c-format
 msgid "%s subprocess"
 msgstr "fail istimewa blok"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, fuzzy, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "fail istimewa blok"
@@ -429,13 +461,6 @@
 #~ msgstr "tak dapat menukar keizinan %s"
 
 #, fuzzy
-#~ msgid "unable to record current working directory"
-#~ msgstr "gagal untuk kembali ke direktori kerja pemulaan"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "gagal untuk kembali ke direktori kerja pemulaan"
-
-#, fuzzy
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "gagal mengekalkan  keizinan bagi %s"
 
@@ -473,21 +498,6 @@
 #~ msgid "^[nN]"
 #~ msgstr "^[tT]"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "fungsi iconv tak boleh digunakan"
-
-#~ msgid "iconv function not available"
-#~ msgstr "fungsi iconv tidak ada"
-
-#~ msgid "character out of range"
-#~ msgstr "aksara di luar julat"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "tak dapat menukar U+%04X ke set aksara lokal"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "tak dapat menukar U+%04X ke set aksara lokal: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "pengguna tidak sah"
 
diff --git a/gnulib-po/nb.gmo b/gnulib-po/nb.gmo
index cb3008b..67c677b 100644
--- a/gnulib-po/nb.gmo
+++ b/gnulib-po/nb.gmo
Binary files differ
diff --git a/gnulib-po/nb.po b/gnulib-po/nb.po
index 0f11d53..dc35b75 100644
--- a/gnulib-po/nb.po
+++ b/gnulib-po/nb.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: GNU textutils 2.0.20\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2002-01-27 21:35+0100\n"
 "Last-Translator: Eivind Tagseth <eivindt@multinet.no>\n"
 "Language-Team: Norwegian <i18n-nb@lister.ping.uio.no>\n"
@@ -30,71 +30,71 @@
 msgid "Valid arguments are:"
 msgstr "Gyldige argument er:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "kan ikke opprette katalog %s"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "kan ikke opprette katalog %s"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
 msgstr ""
 
@@ -106,6 +106,12 @@
 msgid "Unknown system error"
 msgstr "Ukjent systemfeil"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s: ugyldig mønster"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -141,10 +147,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: flagget trenger et argument -- %c\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "virtuelt minne oppbrukt"
 
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "kan ikke opprette katalog %s"
+
+#: lib/openat-die.c:57
+#, fuzzy, c-format
+msgid "failed to return to initial working directory"
+msgstr "kan ikke opprette katalog %s"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -166,26 +192,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "«"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "»"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, fuzzy, c-format
 msgid "cannot create pipe"
 msgstr "kan ikke opprette katalog %s"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, fuzzy, c-format
-msgid "%s subprocess failed"
-msgstr "%s: ugyldig mønster"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -202,22 +222,37 @@
 msgid "wall clock"
 msgstr ""
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr ""
+#: lib/unicodeio.c:102
+#, fuzzy
+msgid "iconv function not usable"
+msgstr "kan ikke skrive ut U+%04X: iconv-funksjonen er ikke brukbar"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr ""
+#: lib/unicodeio.c:104
+#, fuzzy
+msgid "iconv function not available"
+msgstr "kan ikke skrive ut U+%04X: iconv-funksjon er ikke tilgjengelig"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+#, fuzzy
+msgid "character out of range"
+msgstr "U+%04X: tegn utenfor tillatte verdier"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "kan ikke konvertere U+%04X til lokalt tegnsett"
+
+#: lib/unicodeio.c:200
+#, fuzzy, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "kan ikke konvertere U+%04X til lokalt tegnsett"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, fuzzy, c-format
 msgid "%s subprocess"
 msgstr "%s: ugyldig mønster"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, fuzzy, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s: ugyldig mønster"
@@ -412,10 +447,6 @@
 #~ msgstr "kan ikke endre rettigheter til %s"
 
 #, fuzzy
-#~ msgid "unable to record current working directory"
-#~ msgstr "kan ikke opprette katalog %s"
-
-#, fuzzy
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "kan ikke endre rettigheter til %s"
 
@@ -454,25 +485,6 @@
 #~ msgid "^[nN]"
 #~ msgstr "^[nN]"
 
-#, fuzzy
-#~ msgid "iconv function not usable"
-#~ msgstr "kan ikke skrive ut U+%04X: iconv-funksjonen er ikke brukbar"
-
-#, fuzzy
-#~ msgid "iconv function not available"
-#~ msgstr "kan ikke skrive ut U+%04X: iconv-funksjon er ikke tilgjengelig"
-
-#, fuzzy
-#~ msgid "character out of range"
-#~ msgstr "U+%04X: tegn utenfor tillatte verdier"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "kan ikke konvertere U+%04X til lokalt tegnsett"
-
-#, fuzzy
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "kan ikke konvertere U+%04X til lokalt tegnsett"
-
 #~ msgid "invalid user"
 #~ msgstr "ugyldig bruker"
 
diff --git a/gnulib-po/nl.gmo b/gnulib-po/nl.gmo
index effe1a1..24544b2 100644
--- a/gnulib-po/nl.gmo
+++ b/gnulib-po/nl.gmo
Binary files differ
diff --git a/gnulib-po/nl.po b/gnulib-po/nl.po
index 63cfbdd..d740e47 100644
--- a/gnulib-po/nl.po
+++ b/gnulib-po/nl.po
@@ -11,7 +11,7 @@
 msgstr ""
 "Project-Id-Version: gnulib-4.0.0.2567\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2019-05-29 13:31+0200\n"
 "Last-Translator: Benno Schulenberg <vertaling@coevern.nl>\n"
 "Language-Team: Dutch <vertaling@vrijschrift.org>\n"
@@ -36,44 +36,44 @@
 msgid "Valid arguments are:"
 msgstr "Geldige argumenten zijn:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr "%u bitset_allocs, %u vrijgegeven (%.2f%%).\n"
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_sets, %u gecached (%.2f%%)\n"
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_resets, %u gecached (%.2f%%)\n"
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr "%u bitset_tests, %u gecached (%.2f%%)\n"
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr "%u bitset_lists\n"
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr "histogram van aantal gezette bits\n"
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr "histogram van bitset-groottes\n"
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr "histogram van dichtheid aan gezette bits\n"
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
@@ -82,25 +82,25 @@
 "Bitset-statistieken:\n"
 "\n"
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr "Aantal uitvoeringen = %u\n"
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 msgid "cannot read stats file"
 msgstr "kan statistiekenbestand niet lezen"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr "statistiekenbestand heeft een verkeerde grootte\n"
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 msgid "cannot write stats file"
 msgstr "kan statistiekenbestand niet schrijven"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
 msgstr "kan statistiekenbestand niet openen voor schrijven"
 
@@ -112,6 +112,12 @@
 msgid "Unknown system error"
 msgstr "Onbekende systeemfout"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "subproces %s is mislukt"
+
 #: lib/getopt.c:278
 #, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -147,10 +153,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: optie vereist een argument -- '%c'\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "onvoldoende geheugen beschikbaar"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "kan de huidige werkmap niet vastleggen"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "kan niet terugkeren naar de oorspronkelijke werkmap"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle() is mislukt"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "kan bestandsdescriptor %d niet herstellen: dup2() is mislukt"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -172,26 +198,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "‘"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "’"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "kan geen pijp aanmaken"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "subproces %s is mislukt"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr "Uitvoeringstijden (in seconden)"
@@ -208,22 +228,34 @@
 msgid "wall clock"
 msgstr "kloktijd"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle() is mislukt"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "de functie iconv() is onbruikbaar"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "kan bestandsdescriptor %d niet herstellen: dup2() is mislukt"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "de functie iconv() is niet beschikbaar"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "teken ligt buiten het toegestane bereik"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "kan U+%04X niet converteren naar de lokale tekenset"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "kan U+%04X niet converteren naar de lokale tekenset: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "subproces %s"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "subproces %s ontving het fatale signaal %d"
@@ -529,12 +561,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "kan map %s niet aanmaken"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "kan de huidige werkmap niet vastleggen"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "kan niet terugkeren naar de oorspronkelijke werkmap"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Openen van /dev/zero voor lezen is mislukt"
 
@@ -739,21 +765,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Onbekend signaal %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "de functie iconv() is onbruikbaar"
-
-#~ msgid "iconv function not available"
-#~ msgstr "de functie iconv() is niet beschikbaar"
-
-#~ msgid "character out of range"
-#~ msgstr "teken ligt buiten het toegestane bereik"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "kan U+%04X niet converteren naar de lokale tekenset"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "kan U+%04X niet converteren naar de lokale tekenset: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "ongeldige gebruiker"
 
diff --git a/gnulib-po/pl.gmo b/gnulib-po/pl.gmo
index 246436a..e8f3026 100644
--- a/gnulib-po/pl.gmo
+++ b/gnulib-po/pl.gmo
Binary files differ
diff --git a/gnulib-po/pl.po b/gnulib-po/pl.po
index e494051..992779c 100644
--- a/gnulib-po/pl.po
+++ b/gnulib-po/pl.po
@@ -11,7 +11,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 4.0.0.2567\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2019-05-19 20:02+0200\n"
 "Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
 "Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
@@ -37,44 +37,44 @@
 msgid "Valid arguments are:"
 msgstr "Prawidłowe argumenty to:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr "%u bitset_allocs, %u zwolniono (%.2f%%).\n"
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_sets, %u w pamięci podręcznej (%.2f%%)\n"
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_resets, %u w pamięci podręcznej (%.2f%%)\n"
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr "%u bitset_tests, %u w pamięci podręcznej (%.2f%%)\n"
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr "%u bitset_lists\n"
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr "histogram liczników\n"
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr "histogram rozmiarów\n"
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr "histogram gęstości\n"
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
@@ -83,25 +83,25 @@
 "Statystyki operacji bitset:\n"
 "\n"
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr "Uruchomień łącznie = %u\n"
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 msgid "cannot read stats file"
 msgstr "nie można odczytać pliku statystyk"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr "błędny rozmiar pliku statystyk\n"
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 msgid "cannot write stats file"
 msgstr "nie można zapisać pliku statystyk"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
 msgstr "nie można otworzyć pliku statystyk do zapisu"
 
@@ -113,6 +113,12 @@
 msgid "Unknown system error"
 msgstr "Nieznany błąd systemowy"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "podproces %s zawiódł"
+
 #: lib/getopt.c:278
 #, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -148,10 +154,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: opcja musi mieć argument -- '%c'\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "pamięć wyczerpana"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "nie udało się zapisać bieżącego katalogu roboczego"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "nie udało się wrócić do początkowego katalogu roboczego"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle nie powiodło się"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "nie można odtworzyć fd %d: dup2 nie powiodło się"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -173,26 +199,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "`"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "'"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "nie można utworzyć potoku"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "podproces %s zawiódł"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr "Czasy wykonywania (w sekundach)"
@@ -209,22 +229,34 @@
 msgid "wall clock"
 msgstr "zegarowo"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle nie powiodło się"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "nie można użyć funkcji iconv"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "nie można odtworzyć fd %d: dup2 nie powiodło się"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "funkcja iconv nie jest dostępna"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "znak spoza zakresu"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "nie można przekształcić U+%04X do lokalnego zestawu znaków"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "nie można przekształcić U+%04X do lokalnego zestawu znaków: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "podproces %s"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "podproces %s dostał krytyczny sygnał %d"
@@ -634,12 +666,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "nie można utworzyć katalogu %s"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "nie udało się zapisać bieżącego katalogu roboczego"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "nie udało się wrócić do początkowego katalogu roboczego"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Nie udało się otworzyć /dev/zero do odczytu"
 
@@ -841,21 +867,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Nieznany sygnał %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "nie można użyć funkcji iconv"
-
-#~ msgid "iconv function not available"
-#~ msgstr "funkcja iconv nie jest dostępna"
-
-#~ msgid "character out of range"
-#~ msgstr "znak spoza zakresu"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "nie można przekształcić U+%04X do lokalnego zestawu znaków"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "nie można przekształcić U+%04X do lokalnego zestawu znaków: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "błędny użytkownik"
 
diff --git a/gnulib-po/pt.gmo b/gnulib-po/pt.gmo
index 0579c78..1b26c93 100644
--- a/gnulib-po/pt.gmo
+++ b/gnulib-po/pt.gmo
Binary files differ
diff --git a/gnulib-po/pt.po b/gnulib-po/pt.po
index 3ff881d..7622a9b 100644
--- a/gnulib-po/pt.po
+++ b/gnulib-po/pt.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 3.0.0.6062.a6b16\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2014-11-29 14:28-0000\n"
 "Last-Translator: Luís Oliveira <luismbo@gmail.com>\n"
 "Language-Team: Portuguese <translation-team-pt@lists.sourceforge.net>\n"
@@ -34,69 +34,69 @@
 msgid "Valid arguments are:"
 msgstr ""
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 msgid "cannot read stats file"
 msgstr ""
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 msgid "cannot write stats file"
 msgstr ""
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
 msgstr ""
 
@@ -108,6 +108,12 @@
 msgid "Unknown system error"
 msgstr "Erro de sistema desconhecido"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr ""
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -143,10 +149,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: opção requer um argumento -- %c\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "memória esgotada"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "incapaz de registar o directório de trabalho actual"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "falha ao regressar ao directório de trabalho inicial"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -168,26 +194,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr ""
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr ""
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr ""
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr ""
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -205,22 +225,34 @@
 msgid "wall clock"
 msgstr "Despertador"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
 msgstr ""
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
 msgstr ""
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr ""
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr ""
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr ""
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr ""
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr ""
@@ -325,12 +357,6 @@
 #~ msgid "%s: option '-W %s' requires an argument\n"
 #~ msgstr "%s: opção '-W %s' requer um argumento\n"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "incapaz de registar o directório de trabalho actual"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "falha ao regressar ao directório de trabalho inicial"
-
 #~ msgid "Success"
 #~ msgstr "Com sucesso"
 
diff --git a/gnulib-po/pt_BR.gmo b/gnulib-po/pt_BR.gmo
index ecc9dd8..c1ffbe2 100644
--- a/gnulib-po/pt_BR.gmo
+++ b/gnulib-po/pt_BR.gmo
Binary files differ
diff --git a/gnulib-po/pt_BR.po b/gnulib-po/pt_BR.po
index 7b0c184..8ae24ed 100644
--- a/gnulib-po/pt_BR.po
+++ b/gnulib-po/pt_BR.po
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 4.0.0.2567\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2019-05-19 09:10-0200\n"
 "Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n"
 "Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge."
@@ -38,44 +38,44 @@
 msgid "Valid arguments are:"
 msgstr "Argumentos válidos são:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr "%u bitset_allocs, %u liberados (%.2f%%).\n"
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_sets, %u em cache (%.2f%%)\n"
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_resets, %u em cache (%.2f%%)\n"
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr "%u bitset_tests, %u em cache (%.2f%%)\n"
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr "%u bitset_lists\n"
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr "histograma de log de contagem\n"
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr "histograma de log de tamanho\n"
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr "histograma de densidade\n"
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
@@ -84,27 +84,27 @@
 "Estatística de bitset:\n"
 "\n"
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr "Execuções acumuladas = %u\n"
 
 # , c-format
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 msgid "cannot read stats file"
 msgstr "não foi possível ler o arquivo de estado"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr "tamanho inválido de arquivo de estado\n"
 
 # , c-format
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 msgid "cannot write stats file"
 msgstr "não foi possível escrever o arquivo de estado"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
 msgstr "não foi possível abrir o arquivo de estado para escrita"
 
@@ -116,6 +116,13 @@
 msgid "Unknown system error"
 msgstr "Erro desconhecido de sistema"
 
+# , c-format
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "subprocesso %s falhou"
+
 #: lib/getopt.c:278
 #, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -153,10 +160,32 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: a opção exige um argumento -- \"%c\"\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "memória esgotada"
 
+# , c-format
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "não foi possível registrar o diretório de trabalho atual"
+
+# , c-format
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "falha em retornar ao diretório de trabalho inicial"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle falhou"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "não foi possível restaurar descritor de arquivo %d: dup2 falhou"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -178,28 +207,21 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "“"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "”"
 
 # , c-format
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "não foi possível criar redirecionamento"
 
-# , c-format
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "subprocesso %s falhou"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr "Tempos de execução (segundos)"
@@ -217,24 +239,38 @@
 msgid "wall clock"
 msgstr "relógio de parede"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle falhou"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "função iconv não utilizável"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "não foi possível restaurar descritor de arquivo %d: dup2 falhou"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "função iconv não disponível"
 
 # , c-format
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "caractere fora do intervalo"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "não foi possível converter U+%04X para o conjunto de caracteres local"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr ""
+"não foi possível converter U+%04X para o conjunto de caracteres local: %s"
+
+# , c-format
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "subprocesso %s"
 
 # , c-format
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "o subprocesso %s recebeu sinal fatal %d"
@@ -661,14 +697,6 @@
 #~ msgstr "não foi possível criar o diretório %s"
 
 # , c-format
-#~ msgid "unable to record current working directory"
-#~ msgstr "não foi possível registrar o diretório de trabalho atual"
-
-# , c-format
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "falha em retornar ao diretório de trabalho inicial"
-
-# , c-format
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Falha ao abrir /dev/zero para leitura"
 
@@ -908,24 +936,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Sinal desconhecido %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "função iconv não utilizável"
-
-#~ msgid "iconv function not available"
-#~ msgstr "função iconv não disponível"
-
-# , c-format
-#~ msgid "character out of range"
-#~ msgstr "caractere fora do intervalo"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr ""
-#~ "não foi possível converter U+%04X para o conjunto de caracteres local"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr ""
-#~ "não foi possível converter U+%04X para o conjunto de caracteres local: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "usuário inválido"
 
diff --git a/gnulib-po/remove-potcdate.sin b/gnulib-po/remove-potcdate.sin
index 8c70dfb..4e726ec 100644
--- a/gnulib-po/remove-potcdate.sin
+++ b/gnulib-po/remove-potcdate.sin
@@ -1,7 +1,7 @@
 # Sed script that removes the POT-Creation-Date line in the header entry
 # from a POT file.
 #
-# Copyright (C) 2002 Free Software Foundation, Inc.
+# Copyright (C) 2002, 2020-2021 Free Software Foundation, Inc.
 # Copying and distribution of this file, with or without modification,
 # are permitted in any medium without royalty provided the copyright
 # notice and this notice are preserved.  This file is offered as-is,
diff --git a/gnulib-po/ro.gmo b/gnulib-po/ro.gmo
index 4e75b23..8ddabb3 100644
--- a/gnulib-po/ro.gmo
+++ b/gnulib-po/ro.gmo
Binary files differ
diff --git a/gnulib-po/ro.po b/gnulib-po/ro.po
index 31d0575..d44bcd8 100644
--- a/gnulib-po/ro.po
+++ b/gnulib-po/ro.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: mailutils 0.4\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2003-12-10 08:55+0200\n"
 "Last-Translator: Eugen Hoanca <eugenh@urban-grafx.ro>\n"
 "Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
@@ -32,71 +32,71 @@
 msgid "Valid arguments are:"
 msgstr "argumentele if valide sunt: s | r | t"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "nu se poate crea mailerul \"%s\""
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "nu se poate crea mailerul \"%s\""
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "nu se poate deschide fiºierul de ieºire(output) \"%s\": %s"
@@ -111,6 +111,12 @@
 msgid "Unknown system error"
 msgstr "tip de mesaj necunoscut"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr ""
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -146,11 +152,31 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: opþiunea necesitã un argument -- %c\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 #, fuzzy
 msgid "memory exhausted"
 msgstr "Memorie plinã"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr ""
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr ""
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -172,26 +198,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr ""
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr ""
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, fuzzy, c-format
 msgid "cannot create pipe"
 msgstr "nu se poate crea mailerul \"%s\""
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr ""
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -208,22 +228,34 @@
 msgid "wall clock"
 msgstr ""
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
 msgstr ""
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
 msgstr ""
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr ""
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr ""
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr ""
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr ""
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr ""
diff --git a/gnulib-po/ru.gmo b/gnulib-po/ru.gmo
index 409df53..7ca0091 100644
--- a/gnulib-po/ru.gmo
+++ b/gnulib-po/ru.gmo
Binary files differ
diff --git a/gnulib-po/ru.po b/gnulib-po/ru.po
index ab4a240..749e4d3 100644
--- a/gnulib-po/ru.po
+++ b/gnulib-po/ru.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 4.0.0.2567\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2019-05-21 18:46+0300\n"
 "Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
 "Language-Team: Russian <gnu@d07.ru>\n"
@@ -35,44 +35,44 @@
 msgid "Valid arguments are:"
 msgstr "Верные аргументы:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr "%u bitset_allocs, %u освобождено (%.2f%%).\n"
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_sets, %u кэшировано (%.2f%%)\n"
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_resets, %u кэшировано (%.2f%%)\n"
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr "%u bitset_tests, %u кэшировано (%.2f%%)\n"
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr "%u bitset_lists\n"
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr "количественная логарифмическая гистограмма\n"
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr "размерная логарифмическая гистограмма\n"
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr "гистограмма плотности\n"
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
@@ -81,25 +81,25 @@
 "Статистика bitset:\n"
 "\n"
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr "Накопленных запусков = %u\n"
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 msgid "cannot read stats file"
 msgstr "невозможно прочитать файл stats"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr "некорректный размер файла stats\n"
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 msgid "cannot write stats file"
 msgstr "невозможно записать файл stats"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
 msgstr "невозможно открыть файл stats для записи"
 
@@ -111,6 +111,12 @@
 msgid "Unknown system error"
 msgstr "Неизвестная системная ошибка"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "подпроцесс %s завершился с ошибкой"
+
 #: lib/getopt.c:278
 #, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -146,10 +152,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: для параметра требуется аргумент -- «%c»\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "закончилась память"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "не удалось запомнить текущий рабочий каталог"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "не удалось вернуться в первоначальный рабочий каталог"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle завершилась неудачно"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "не удалось восстановить fd %d: dup2 завершилась неудачно"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -171,26 +197,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "«"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "»"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "не удалось создать канал"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "подпроцесс %s завершился с ошибкой"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr "Время выполнения (секунд)"
@@ -207,22 +227,34 @@
 msgid "wall clock"
 msgstr "настенные часы"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle завершилась неудачно"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "функция iconv неприменима"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "не удалось восстановить fd %d: dup2 завершилась неудачно"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "функция iconv недоступна"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "символ вне допустимого диапазона"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "невозможно преобразовать U+%04X в локальную кодировку"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "невозможно преобразовать U+%04X в локальную кодировку: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "подпроцесс %s"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "подпроцесс %s получил сигнал завершения %d"
@@ -624,12 +656,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "невозможно создать каталог %s"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "не удалось запомнить текущий рабочий каталог"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "не удалось вернуться в первоначальный рабочий каталог"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Не удалось открыть /dev/zero на чтение"
 
@@ -831,21 +857,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Неизвестный сигнал %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "функция iconv неприменима"
-
-#~ msgid "iconv function not available"
-#~ msgstr "функция iconv недоступна"
-
-#~ msgid "character out of range"
-#~ msgstr "символ вне допустимого диапазона"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "невозможно преобразовать U+%04X в локальную кодировку"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "невозможно преобразовать U+%04X в локальную кодировку: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "неверный пользователь"
 
diff --git a/gnulib-po/rw.gmo b/gnulib-po/rw.gmo
index fc3508c..d25f680 100644
--- a/gnulib-po/rw.gmo
+++ b/gnulib-po/rw.gmo
Binary files differ
diff --git a/gnulib-po/rw.po b/gnulib-po/rw.po
index f07929c..a7d97f9 100644
--- a/gnulib-po/rw.po
+++ b/gnulib-po/rw.po
@@ -16,7 +16,7 @@
 msgstr ""
 "Project-Id-Version: mailutils 0.6\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2005-04-04 10:55-0700\n"
 "Last-Translator: Steven Michael Murphy <murf@e-tools.com>\n"
 "Language-Team: Kinyarwanda <translation-team-rw@lists.sourceforge.net>\n"
@@ -42,71 +42,71 @@
 msgid "Valid arguments are:"
 msgstr "ingingo"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "Kurema Ihuza"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "Kurema Ihuza"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "Gufungura kugirango"
@@ -122,6 +122,12 @@
 msgid "Unknown system error"
 msgstr "Sisitemu Ikosa"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s:Byanze"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -157,11 +163,31 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s:Ihitamo"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 #, fuzzy
 msgid "memory exhausted"
 msgstr "Ububiko"
 
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "Kuri Icyabitswe KIGEZWEHO bushyinguro"
+
+#: lib/openat-die.c:57
+#, fuzzy, c-format
+msgid "failed to return to initial working directory"
+msgstr "Byanze Kuri Garuka Kuri bushyinguro"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
 # basctl/source\basicide\basidesh.src:RID_IMGBTN_REMOVEWATCH.text
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
@@ -184,27 +210,21 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 #, fuzzy
 msgid "`"
 msgstr "`"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "'"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, fuzzy, c-format
 msgid "cannot create pipe"
 msgstr "Kurema Ihuza"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, fuzzy, c-format
-msgid "%s subprocess failed"
-msgstr "%s:Byanze"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -221,22 +241,37 @@
 msgid "wall clock"
 msgstr ""
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr ""
+#: lib/unicodeio.c:102
+#, fuzzy
+msgid "iconv function not usable"
+msgstr "Umumaro OYA"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr ""
+#: lib/unicodeio.c:104
+#, fuzzy
+msgid "iconv function not available"
+msgstr "Umumaro OYA Bihari"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+#, fuzzy
+msgid "character out of range"
+msgstr "Inyuguti Inyuma Bya Urutonde"
+
+#: lib/unicodeio.c:198
+#, fuzzy, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "GUHINDURA U Kuri Inyuguti Gushyiraho"
+
+#: lib/unicodeio.c:200
+#, fuzzy, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "GUHINDURA U Kuri Inyuguti Gushyiraho"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, fuzzy, c-format
 msgid "%s subprocess"
 msgstr "%s:Byanze"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, fuzzy, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s:Byanze"
@@ -534,14 +569,6 @@
 #~ msgstr "Guhindura>> Uruhushya Bya"
 
 #, fuzzy
-#~ msgid "unable to record current working directory"
-#~ msgstr "Kuri Icyabitswe KIGEZWEHO bushyinguro"
-
-#, fuzzy
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "Byanze Kuri Garuka Kuri bushyinguro"
-
-#, fuzzy
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "%s:Byanze Kuri Gufungura kugirango"
 
@@ -585,26 +612,6 @@
 #~ msgstr "Ikosa in Ibisanzwe imvugo Gushaka"
 
 #, fuzzy
-#~ msgid "iconv function not usable"
-#~ msgstr "Umumaro OYA"
-
-#, fuzzy
-#~ msgid "iconv function not available"
-#~ msgstr "Umumaro OYA Bihari"
-
-#, fuzzy
-#~ msgid "character out of range"
-#~ msgstr "Inyuguti Inyuma Bya Urutonde"
-
-#, fuzzy
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "GUHINDURA U Kuri Inyuguti Gushyiraho"
-
-#, fuzzy
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "GUHINDURA U Kuri Inyuguti Gushyiraho"
-
-#, fuzzy
 #~ msgid "invalid user"
 #~ msgstr "Sibyo Ukoresha:"
 
diff --git a/gnulib-po/sk.gmo b/gnulib-po/sk.gmo
index 90b7deb..27bc7ac 100644
--- a/gnulib-po/sk.gmo
+++ b/gnulib-po/sk.gmo
Binary files differ
diff --git a/gnulib-po/sk.po b/gnulib-po/sk.po
index 75d655f..25f896d 100644
--- a/gnulib-po/sk.po
+++ b/gnulib-po/sk.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: textutils 2.0.14\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2001-06-08 22:10 +02:00\n"
 "Last-Translator: Stanislav Meduna <stano@trillian.eunet.sk>\n"
 "Language-Team: Slovak <sk-i18n@rak.isternet.sk>\n"
@@ -30,71 +30,71 @@
 msgid "Valid arguments are:"
 msgstr "Platné argumenty sú:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "nie je mo¾né vytvori» adresár %s"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "nie je mo¾né vytvori» adresár %s"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "nie je mo¾né otvori» %s pre èítanie"
@@ -107,6 +107,12 @@
 msgid "Unknown system error"
 msgstr "Neznáma systémová chyba"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s: chybný vzor"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -142,10 +148,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: prepínaè vy¾aduje argument -- %c\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "vyèerpaná pamä»"
 
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "nie je mo¾né vytvori» adresár %s"
+
+#: lib/openat-die.c:57
+#, fuzzy, c-format
+msgid "failed to return to initial working directory"
+msgstr "nie je mo¾né vytvori» adresár %s"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -167,26 +193,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "`"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "'"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, fuzzy, c-format
 msgid "cannot create pipe"
 msgstr "nie je mo¾né vytvori» adresár %s"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, fuzzy, c-format
-msgid "%s subprocess failed"
-msgstr "%s: chybný vzor"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -203,22 +223,37 @@
 msgid "wall clock"
 msgstr ""
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr ""
+#: lib/unicodeio.c:102
+#, fuzzy
+msgid "iconv function not usable"
+msgstr "nie je mo¾né vypísa» U+%04X: funkcia iconv nie je pou¾iteµná"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr ""
+#: lib/unicodeio.c:104
+#, fuzzy
+msgid "iconv function not available"
+msgstr "nie je mo¾né vypísa» U+%04X: funkcia iconv nie je dostupná"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+#, fuzzy
+msgid "character out of range"
+msgstr "U+%04X: znak je mimo rozsah"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "nie je mo¾né konvertova» U+%04X do lokálnej znakovej sady"
+
+#: lib/unicodeio.c:200
+#, fuzzy, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "nie je mo¾né konvertova» U+%04X do lokálnej znakovej sady"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, fuzzy, c-format
 msgid "%s subprocess"
 msgstr "%s: chybný vzor"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, fuzzy, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s: chybný vzor"
@@ -418,10 +453,6 @@
 #~ msgstr "nie je mo¾né zmeni» práva %s"
 
 #, fuzzy
-#~ msgid "unable to record current working directory"
-#~ msgstr "nie je mo¾né vytvori» adresár %s"
-
-#, fuzzy
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "nie je mo¾né zmeni» práva %s"
 
@@ -459,25 +490,6 @@
 #~ msgid "^[nN]"
 #~ msgstr "^[nN]"
 
-#, fuzzy
-#~ msgid "iconv function not usable"
-#~ msgstr "nie je mo¾né vypísa» U+%04X: funkcia iconv nie je pou¾iteµná"
-
-#, fuzzy
-#~ msgid "iconv function not available"
-#~ msgstr "nie je mo¾né vypísa» U+%04X: funkcia iconv nie je dostupná"
-
-#, fuzzy
-#~ msgid "character out of range"
-#~ msgstr "U+%04X: znak je mimo rozsah"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "nie je mo¾né konvertova» U+%04X do lokálnej znakovej sady"
-
-#, fuzzy
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "nie je mo¾né konvertova» U+%04X do lokálnej znakovej sady"
-
 #~ msgid "invalid user"
 #~ msgstr "neplatný pou¾ívateµ"
 
diff --git a/gnulib-po/sl.gmo b/gnulib-po/sl.gmo
index 2f7e9f3..c1e0185 100644
--- a/gnulib-po/sl.gmo
+++ b/gnulib-po/sl.gmo
Binary files differ
diff --git a/gnulib-po/sl.po b/gnulib-po/sl.po
index 7b3a152..77f1dcb 100644
--- a/gnulib-po/sl.po
+++ b/gnulib-po/sl.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 3.0.0.6062.a6b16\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2012-05-20 13:08+0200\n"
 "Last-Translator: Primož Peterlin <primozz.peterlin@gmail.com>\n"
 "Language-Team: Slovenian <translation-team-sl@lists.sourceforge.net>\n"
@@ -34,71 +34,71 @@
 msgid "Valid arguments are:"
 msgstr "Veljavni argumenti so:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "ni mogoče ustvariti cevovoda"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "ni mogoče ustvariti cevovoda"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "varnostne kopije \"%s\" ni mogoče odpreti za pisanje"
@@ -111,6 +111,12 @@
 msgid "Unknown system error"
 msgstr "Neznana sistemska napaka"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "podproces %s ni uspel"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -147,10 +153,30 @@
 msgstr "%s: izbira zahteva argument -- '%c'\n"
 
 # ! INEXACT
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "zmanjkalo pomnilnika"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "ni mogoče zabeležiti trenutnega delovnega imenika"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "vrnitev v začetni delovni imenik ni uspela"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "klic _open_osfhandle ni uspel"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "ni mogoče obnoviti fd %d: klic dup2 ni uspel"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -172,26 +198,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "»"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "«"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "ni mogoče ustvariti cevovoda"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "podproces %s ni uspel"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -209,22 +229,34 @@
 msgid "wall clock"
 msgstr "Budilka"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "klic _open_osfhandle ni uspel"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "funkcija iconv ne deluje"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "ni mogoče obnoviti fd %d: klic dup2 ni uspel"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "funkcija iconv ni na voljo"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "koda znaka izven obsega"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "znaka s kodo U+%04X ni mogoče pretvoriti v lokalni nabor znakov"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "znaka s kodo U+%04X ni moč pretvoriti v lokalni nabor znakov: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "podproces %s"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "podproces %s je prejel terminalni signal %d"
@@ -597,12 +629,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "imenika %s ni mogoče ustvariti"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "ni mogoče zabeležiti trenutnega delovnega imenika"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "vrnitev v začetni delovni imenik ni uspela"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Datoteke /dev/null ni uspelo odpreti za branje"
 
@@ -805,21 +831,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Neznani signal %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "funkcija iconv ne deluje"
-
-#~ msgid "iconv function not available"
-#~ msgstr "funkcija iconv ni na voljo"
-
-#~ msgid "character out of range"
-#~ msgstr "koda znaka izven obsega"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "znaka s kodo U+%04X ni mogoče pretvoriti v lokalni nabor znakov"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "znaka s kodo U+%04X ni moč pretvoriti v lokalni nabor znakov: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "neveljavno uporabniško ime"
 
diff --git a/gnulib-po/sr.gmo b/gnulib-po/sr.gmo
index 55709cc..ffcd195 100644
--- a/gnulib-po/sr.gmo
+++ b/gnulib-po/sr.gmo
Binary files differ
diff --git a/gnulib-po/sr.po b/gnulib-po/sr.po
index 3702443..b194833 100644
--- a/gnulib-po/sr.po
+++ b/gnulib-po/sr.po
@@ -1,22 +1,23 @@
 # Serbian translation of gnulib.
-# Copyright (C) 2013 Free Software Foundation, Inc.
+# Copyright © 2020 Free Software Foundation, Inc.
 # This file is distributed under the same license as the gnulib package.
-# Мирослав Николић <miroslavnikolic@rocketmail.com>, 2013.
+# Мирослав Николић <miroslavnikolic@rocketmail.com>, 2013—2020.
 msgid ""
 msgstr ""
-"Project-Id-Version: gnulib-3.0.0.6062.a6b16\n"
+"Project-Id-Version: gnulib-4.0.0.2567\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2013-11-17 16:47+0200\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2020-04-07 08:38+0200\n"
 "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
 "Language-Team: Serbian <(nothing)>\n"
 "Language: sr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.7.1\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 
 #: lib/argmatch.c:132
 #, c-format
@@ -32,74 +33,73 @@
 msgid "Valid arguments are:"
 msgstr "Исправни аргументи су:"
 
-#: lib/bitset/stats.c:177
-#, c-format
-msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
-msgstr ""
-
-#: lib/bitset/stats.c:180
-#, c-format
-msgid "%u bitset_sets, %u cached (%.2f%%)\n"
-msgstr ""
-
 #: lib/bitset/stats.c:183
 #, c-format
-msgid "%u bitset_resets, %u cached (%.2f%%)\n"
-msgstr ""
+msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+msgstr "%u битсет_доделе, %u ослобођених (%.2f%%).\n"
 
 #: lib/bitset/stats.c:186
 #, c-format
-msgid "%u bitset_tests, %u cached (%.2f%%)\n"
-msgstr ""
+msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+msgstr "%u битсет_поставки, %u кешираних (%.2f%%)\n"
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:189
 #, c-format
-msgid "%u bitset_lists\n"
-msgstr ""
+msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+msgstr "%u битсет_повраћаја, %u кешираних (%.2f%%)\n"
 
 #: lib/bitset/stats.c:192
-msgid "count log histogram\n"
-msgstr ""
+#, c-format
+msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+msgstr "%u битсет_тестова, %u кешираних (%.2f%%)\n"
 
-#: lib/bitset/stats.c:195
-msgid "size log histogram\n"
-msgstr ""
+#: lib/bitset/stats.c:196
+#, c-format
+msgid "%u bitset_lists\n"
+msgstr "%u битсет_спискова\n"
 
 #: lib/bitset/stats.c:198
-msgid "density histogram\n"
-msgstr ""
+msgid "count log histogram\n"
+msgstr "број хистограма дневника\n"
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:201
+msgid "size log histogram\n"
+msgstr "величина хистограма дневника\n"
+
+#: lib/bitset/stats.c:204
+msgid "density histogram\n"
+msgstr "хистограм густине\n"
+
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
+"Статистике битсета:\n"
+"\n"
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
-msgstr ""
+msgstr "Нагомиланих покретања = %u\n"
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
-#, fuzzy
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 msgid "cannot read stats file"
-msgstr "не могу да направим спојку"
+msgstr "не могу да читам датотеку стања"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
-msgstr ""
+msgstr "лоша величина датотеке стања\n"
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
-#, fuzzy
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 msgid "cannot write stats file"
-msgstr "не могу да направим спојку"
+msgstr "не могу да пишем датотеку стања"
 
-#: lib/bitset/stats.c:286
-#, fuzzy
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
-msgstr "не могу да отворим датотеку резерве „%s“ за упис"
+msgstr "не могу да отворим датотеку стања за упис"
 
 #: lib/closeout.c:122
 msgid "write error"
@@ -109,30 +109,36 @@
 msgid "Unknown system error"
 msgstr "Непозната грешка система"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s потпроцес није успео"
+
 #: lib/getopt.c:278
-#, fuzzy, c-format
+#, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
-msgstr "%s: опција „-W %s“ је нејасна\n"
+msgstr "%s: опција „%s%s“ је нејасна\n"
 
 #: lib/getopt.c:284
-#, fuzzy, c-format
+#, c-format
 msgid "%s: option '%s%s' is ambiguous; possibilities:"
-msgstr "%s: опција „%s“ је нејасна; могућности:"
+msgstr "%s: опција „%s%s“ је нејасна; могућности:"
 
 #: lib/getopt.c:319
-#, fuzzy, c-format
+#, c-format
 msgid "%s: unrecognized option '%s%s'\n"
-msgstr "%s: непозната опција „%c%s“\n"
+msgstr "%s: непозната опција „%s%s“\n"
 
 #: lib/getopt.c:345
-#, fuzzy, c-format
+#, c-format
 msgid "%s: option '%s%s' doesn't allow an argument\n"
-msgstr "%s: опција „%c%s“ не дозвољава аргумент\n"
+msgstr "%s: опција „%s%s“ не дозвољава аргумент\n"
 
 #: lib/getopt.c:360
-#, fuzzy, c-format
+#, c-format
 msgid "%s: option '%s%s' requires an argument\n"
-msgstr "%s: опција „--%s“ захтева аргумент\n"
+msgstr "%s: опција „%s%s“ захтева аргумент\n"
 
 #: lib/getopt.c:621
 #, c-format
@@ -144,10 +150,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: опција захтева аргумент -- „%c“\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "меморија је потрошена"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "не могу да снимим тренутни радни директоријум"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "не могу да се вратим у почетни радни директоријум"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "„_open_osfhandle“ није успело"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "не могу да повратим фд %d: „dup2“ није успело"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -169,185 +195,74 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "„"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "“"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "не могу да направим спојку"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "%s потпроцес није успео"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
-msgstr ""
+msgstr "Времена извршења (секунди)"
 
 #: lib/timevar.c:318
 msgid "CPU user"
-msgstr ""
+msgstr "ЦПЈ корисник"
 
 #: lib/timevar.c:318
 msgid "CPU system"
-msgstr ""
+msgstr "ЦПЈ систем"
 
 #: lib/timevar.c:318
-#, fuzzy
 msgid "wall clock"
-msgstr "Будилник"
+msgstr "зидни сат"
 
-#: lib/w32spawn.h:49
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "иконв функција није употребљива"
+
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "иконв функција није доступна"
+
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "знак је ван опсега"
+
+#: lib/unicodeio.c:198
 #, c-format
-msgid "_open_osfhandle failed"
-msgstr "„_open_osfhandle“ није успело"
+msgid "cannot convert U+%04X to local character set"
+msgstr "не могу да претворим U+%04X у месни скуп знакова"
 
-#: lib/w32spawn.h:90
+#: lib/unicodeio.c:200
 #, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "не могу да повратим фд %d: „dup2“ није успело"
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "не могу да претворим U+%04X у месни скуп знакова: %s"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "%s потпроцес"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s потпроцес је добио кобни сигнал %d"
 
-#~ msgid "Packaged by %s (%s)\n"
-#~ msgstr "Запаковао је %s (%s)\n"
-
-#~ msgid "Packaged by %s\n"
-#~ msgstr "Запаковао је %s\n"
-
-#~ msgid "(C)"
-#~ msgstr "©"
-
-#, fuzzy
-#~| msgid ""
-#~| "\n"
-#~| "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
-#~| "html>.\n"
-#~| "This is free software: you are free to change and redistribute it.\n"
-#~| "There is NO WARRANTY, to the extent permitted by law.\n"
-#~| "\n"
-#~ msgid ""
-#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
-#~ "This is free software: you are free to change and redistribute it.\n"
-#~ "There is NO WARRANTY, to the extent permitted by law.\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Лиценца ОЈЛв3+: ГНУ ОЈЛ издање 3 или касније <http://gnu.org/licenses/gpl."
-#~ "html>.\n"
-#~ "Ово је слободан софтвер: слободни сте да га мењате и расподељујете.\n"
-#~ "Не постоји НИКАКВА ГАРАНЦИЈА, у оквирима дозвољеним законом.\n"
-#~ "\n"
-
-#~ msgid "Written by %s.\n"
-#~ msgstr "Написао је %s.\n"
-
-#~ msgid "Written by %s and %s.\n"
-#~ msgstr "Написали су %s и %s.\n"
-
-#~ msgid "Written by %s, %s, and %s.\n"
-#~ msgstr "Написали су %s, %s, и %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "and %s.\n"
-#~ msgstr ""
-#~ "Написали су %s, %s, %s,\n"
-#~ "и %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, and %s.\n"
-#~ msgstr ""
-#~ "Написали су %s, %s, %s,\n"
-#~ "%s, и %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, %s, and %s.\n"
-#~ msgstr ""
-#~ "Написали су %s, %s, %s,\n"
-#~ "%s, %s, и %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, %s, %s, and %s.\n"
-#~ msgstr ""
-#~ "Написали су %s, %s, %s,\n"
-#~ "%s, %s, %s, и %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, %s, %s, %s,\n"
-#~ "and %s.\n"
-#~ msgstr ""
-#~ "Написали су %s, %s, %s,\n"
-#~ "%s, %s, %s, %s,\n"
-#~ "и %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, %s, %s, %s,\n"
-#~ "%s, and %s.\n"
-#~ msgstr ""
-#~ "Написали су %s, %s, %s,\n"
-#~ "%s, %s, %s, %s,\n"
-#~ "%s, и %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, %s, %s, %s,\n"
-#~ "%s, %s, and others.\n"
-#~ msgstr ""
-#~ "Написали су %s, %s, %s,\n"
-#~ "%s, %s, %s, %s,\n"
-#~ "%s, %s, и други.\n"
-
-#, fuzzy
-#~| msgid ""
-#~| "\n"
-#~| "Report bugs to: %s\n"
-#~ msgid "Report bugs to: %s\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Грешке пријавите на: %s\n"
-
-#~ msgid "Report %s bugs to: %s\n"
-#~ msgstr "Грешке програма „%s“ пријавите на: %s\n"
-
-#~ msgid "%s home page: <%s>\n"
-#~ msgstr "%s матична страница: <%s>\n"
-
-#, fuzzy
-#~| msgid "General help using GNU software: <http://www.gnu.org/gethelp/>\n"
-#~ msgid "General help using GNU software: <%s>\n"
-#~ msgstr "Општа помоћ користећи ГНУ софтвер: <http://www.gnu.org/gethelp/>\n"
-
 #~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
 #~ msgstr "ARGP_HELP_FMT: %s вредност је мања од или једнака са %s"
 
 #~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
 #~ msgstr "%.*s: „ARGP_HELP_FMT“ параметар захтева вредност"
 
-#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
-#~ msgstr "%.*s: „ARGP_HELP_FMT“ параметар мора бити позитиван"
-
 #~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
 #~ msgstr "%.*s: Непознат параметар „ARGP_HELP_FMT“"
 
@@ -370,7 +285,7 @@
 #~ msgid " [OPTION...]"
 #~ msgstr " [ОПЦИЈА...]"
 
-#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
 #~ msgstr "Покушајте „%s --help“ или „%s --usage“ за више података.\n"
 
 #~ msgid "Report bugs to %s.\n"
@@ -432,26 +347,56 @@
 #~ msgid "preserving permissions for %s"
 #~ msgstr "причувавам овлашћења за %s"
 
-#~ msgid "error while opening \"%s\" for reading"
+#~ msgid "error while opening %s for reading"
 #~ msgstr "грешка приликом отварања „%s“ за читање"
 
-#~ msgid "error reading \"%s\""
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "не могу да отворим датотеку резерве „%s“ за упис"
+
+#~ msgid "error reading %s"
 #~ msgstr "грешка читања „%s“"
 
-#~ msgid "error writing \"%s\""
+#~ msgid "error writing %s"
 #~ msgstr "грешка писања „%s“"
 
-#~ msgid "error after reading \"%s\""
+#~ msgid "error after reading %s"
 #~ msgstr "грешка након читања „%s“"
 
 #~ msgid "fdopen() failed"
 #~ msgstr "није успела функција „fdopen()“"
 
-#~ msgid "C# compiler not found, try installing pnet"
-#~ msgstr "нисам нашао Ц# преводиоца, покушајте да инсталирате пнет"
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr "нисам нашао Ц# преводиоца, покушајте да инсталирате моно"
 
-#~ msgid "C# virtual machine not found, try installing pnet"
-#~ msgstr "нисам нашао Ц# виртуелну машину, покушајте да инсталирате пнет"
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr "нисам нашао Ц# виртуелну машину, покушајте да инсталирате моно"
+
+#~ msgid "unbalanced ["
+#~ msgstr "неуравнотежена ["
+
+#~ msgid "invalid character class"
+#~ msgstr "неисправна класа знака"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr "синтакса класе знака је [[:space:]], а не [:space:]"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "недовршена \\ излаза"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "неисправан садржај \\{\\}"
+
+#~ msgid "regular expression too big"
+#~ msgstr "регуларни израз је превелик"
+
+#~ msgid "unbalanced ("
+#~ msgstr "неуравнотежена ("
+
+#~ msgid "no syntax specified"
+#~ msgstr "није наведена синтакса"
+
+#~ msgid "unbalanced )"
+#~ msgstr "неуравнотежена )"
 
 #~ msgid "regular empty file"
 #~ msgstr "обична празна датотека"
@@ -462,21 +407,9 @@
 #~ msgid "directory"
 #~ msgstr "директоријум"
 
-#~ msgid "block special file"
-#~ msgstr "посебна датотека блока"
-
-#~ msgid "character special file"
-#~ msgstr "посебна датотека знака"
-
-#~ msgid "fifo"
-#~ msgstr "пупи"
-
 #~ msgid "symbolic link"
 #~ msgstr "симболичка веза"
 
-#~ msgid "socket"
-#~ msgstr "прикључница"
-
 #~ msgid "message queue"
 #~ msgstr "ред порука"
 
@@ -489,6 +422,39 @@
 #~ msgid "typed memory object"
 #~ msgstr "типски меморијски објекат"
 
+#~ msgid "block special file"
+#~ msgstr "посебна датотека блока"
+
+#~ msgid "character special file"
+#~ msgstr "посебна датотека знака"
+
+#~ msgid "contiguous data"
+#~ msgstr "непрекидни подаци"
+
+#~ msgid "fifo"
+#~ msgstr "пупи"
+
+#~ msgid "door"
+#~ msgstr "врата"
+
+#~ msgid "named file"
+#~ msgstr "именована датотека"
+
+#~ msgid "network special file"
+#~ msgstr "посебна датотека мреже"
+
+#~ msgid "migrated file with data"
+#~ msgstr "премештена датотека са подацима"
+
+#~ msgid "migrated file without data"
+#~ msgstr "премештена датотека без података"
+
+#~ msgid "port"
+#~ msgstr "порт"
+
+#~ msgid "socket"
+#~ msgstr "прикључница"
+
 #~ msgid "weird file"
 #~ msgstr "чудна датотека"
 
@@ -549,18 +515,6 @@
 #~ msgid "Unknown error"
 #~ msgstr "Непозната грешка"
 
-#~ msgid "%s: option '--%s' doesn't allow an argument\n"
-#~ msgstr "%s: опција „--%s“ не дозвољава аргумент\n"
-
-#~ msgid "%s: unrecognized option '--%s'\n"
-#~ msgstr "%s: непозната опција „--%s“\n"
-
-#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
-#~ msgstr "%s: опција „-W %s“ не дозвољава аргумент\n"
-
-#~ msgid "%s: option '-W %s' requires an argument\n"
-#~ msgstr "%s: опција „-W %s“ захтева аргумент\n"
-
 #~ msgid "invalid source_version argument to compile_java_class"
 #~ msgstr "неисправан аргумент издања_извора за преведи_јава_разред"
 
@@ -586,18 +540,15 @@
 #~ msgid "%s subprocess I/O error"
 #~ msgstr "У/И грешка %s потпроцеса"
 
+#~ msgid "cannot stat %s"
+#~ msgstr "не могу да добавим податке за „%s“"
+
 #~ msgid "cannot change permissions of %s"
 #~ msgstr "не могу да променим овлашћења за „%s“"
 
 #~ msgid "cannot create directory %s"
 #~ msgstr "не могу да направим директоријум „%s“"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "не могу да снимим тренутни радни директоријум"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "не могу да се вратим у почетни радни директоријум"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Нисам успео да отворим „/dev/zero“ за читање"
 
@@ -625,9 +576,6 @@
 #~ msgid "%s subprocess terminated with exit code %d"
 #~ msgstr "%s потпроцес је окончан са излазном шифром %d"
 
-#~ msgid "Franc,ois Pinard"
-#~ msgstr "Франсуа Пинард"
-
 #~ msgid "Success"
 #~ msgstr "Успешно"
 
@@ -649,14 +597,14 @@
 #~ msgid "Invalid back reference"
 #~ msgstr "Неисправна повратна упута"
 
-#~ msgid "Unmatched [ or [^"
-#~ msgstr "Непоклопљено [ или [^"
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "Неупарено [, [^, [:, [., или [="
 
 #~ msgid "Unmatched ( or \\("
-#~ msgstr "Непоклопљено ( или \\("
+#~ msgstr "Неупарено ( или \\("
 
 #~ msgid "Unmatched \\{"
-#~ msgstr "Непоклопљено \\{"
+#~ msgstr "Неупарено \\{"
 
 #~ msgid "Invalid content of \\{\\}"
 #~ msgstr "Неисправан садржај \\{\\}"
@@ -724,6 +672,9 @@
 #~ msgid "Broken pipe"
 #~ msgstr "Прекинута спојка"
 
+#~ msgid "Alarm clock"
+#~ msgstr "Будилник"
+
 #~ msgid "Terminated"
 #~ msgstr "Окончан"
 
@@ -799,21 +750,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Непознати сигнал %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "иконв функција није употребљива"
-
-#~ msgid "iconv function not available"
-#~ msgstr "иконв функција није доступна"
-
-#~ msgid "character out of range"
-#~ msgstr "знак је ван опсега"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "не могу да претворим U+%04X у месни скуп знакова"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "не могу да претворим U+%04X у месни скуп знакова: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "неисправан корисник"
 
@@ -826,8 +762,102 @@
 #~ msgid "unable to display error message"
 #~ msgstr "не могу да прикажем поруку грешке"
 
-#~ msgid "%s home page: <http://www.gnu.org/software/%s/>\n"
-#~ msgstr "%s матична страница: <http://www.gnu.org/software/%s/>\n"
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Запаковао је %s (%s)\n"
+
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Запаковао је %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Лиценца ОЈЛи3+: ГНУ ОЈЛ издање 3 или новије <%s>.\n"
+#~ "Ово је слободан софтвер: слободни сте да га мењате и расподељујете.\n"
+#~ "Не постоји НИКАКВА ГАРАНЦИЈА, у оквирима дозвољеним законом.\n"
+
+#~ msgid "Written by %s.\n"
+#~ msgstr "Написао је %s.\n"
+
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Написали су %s и %s.\n"
+
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Написали су %s, %s, и %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Написали су %s, %s, %s,\n"
+#~ "и %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Написали су %s, %s, %s,\n"
+#~ "%s, и %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Написали су %s, %s, %s,\n"
+#~ "%s, %s, и %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Написали су %s, %s, %s,\n"
+#~ "%s, %s, %s, и %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Написали су %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "и %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Написали су %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, и %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Написали су %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, и други.\n"
+
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr "Грешке пријавите на: %s\n"
+
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Грешке програма „%s“ пријавите на: %s\n"
+
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "%s матична страница: <%s>\n"
+
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "Општа помоћ користећи ГНУ софтвер: <%s>\n"
+
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr "нисам успео да подесим текстуални/бинарни режим описника датотеке"
 
 #~ msgid "stdin"
 #~ msgstr "стдулаз"
@@ -856,11 +886,35 @@
 #~ msgid "cannot perform formatted output"
 #~ msgstr "не могу да извршим обликовани излаз"
 
-#~ msgid "invalid %s%s argument `%s'"
+#~ msgid "standard file descriptors"
+#~ msgstr "стандардни описници датотеке"
+
+#~ msgid "invalid %s%s argument '%s'"
 #~ msgstr "неисправан %s%s аргумент „%s“"
 
-#~ msgid "invalid suffix in %s%s argument `%s'"
+#~ msgid "invalid suffix in %s%s argument '%s'"
 #~ msgstr "неисправан суфикс у %s%s аргумент „%s“"
 
-#~ msgid "%s%s argument `%s' too large"
+#~ msgid "%s%s argument '%s' too large"
 #~ msgstr "%s%s аргумент „%s“ је превелик"
+
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: „ARGP_HELP_FMT“ параметар мора бити позитиван"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: опција „--%s“ не дозвољава аргумент\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: непозната опција „--%s“\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: опција „-W %s“ не дозвољава аргумент\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: опција „-W %s“ захтева аргумент\n"
+
+#~ msgid "Franc,ois Pinard"
+#~ msgstr "Франсуа Пинард"
+
+#~ msgid "%s home page: <http://www.gnu.org/software/%s/>\n"
+#~ msgstr "%s матична страница: <http://www.gnu.org/software/%s/>\n"
diff --git a/gnulib-po/sv.gmo b/gnulib-po/sv.gmo
index f95bcd2..7ff949c 100644
--- a/gnulib-po/sv.gmo
+++ b/gnulib-po/sv.gmo
Binary files differ
diff --git a/gnulib-po/sv.po b/gnulib-po/sv.po
index 29c9c71..c4cd72f 100644
--- a/gnulib-po/sv.po
+++ b/gnulib-po/sv.po
@@ -1,21 +1,21 @@
 # Swedish messages for gnulib.
-# Copyright © 1997, 2002, 2003, 2004, 2005, 2007, 2009, 2010, 2011, 2019 Free Software Foundation, Inc.
+# Copyright © 1997, 2002, 2003, 2004, 2005, 2007, 2009, 2010, 2011, 2019, 2020 Free Software Foundation, Inc.
 # This file is distributed under the same license as the gnulib package.
 # Peter Antman <peter.antman@abc.se>, 1997.
 # Thomas Olsson <cid95tho@lustudat.student.lu.se>, 1997.
 # Daniel Resare <daniel@resare.com>, 1999, 2000.
-# Göran Uddeborg <goeran@uddeborg.se>, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2009, 2010, 2011, 2019.
+# Göran Uddeborg <goeran@uddeborg.se>, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2009, 2010, 2011, 2019, 2020.
 #
-# $Revision: 1.14 $
+# $Revision: 1.19 $
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: gnulib 4.0.0.2567\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-05-21 10:41+0200\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2020-05-28 21:40+0200\n"
 "Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
-"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
+"Language-Team: Swedish <tp-sv-list@lists.sourceforge.net>\n"
 "Language: sv\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -37,44 +37,44 @@
 msgid "Valid arguments are:"
 msgstr "Giltiga argument är:"
 
-#: lib/bitset/stats.c:177
-#, c-format
-msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
-msgstr "%u bitset-allokeringar, %u friade (%.2f%%).\n"
-
-#: lib/bitset/stats.c:180
-#, c-format
-msgid "%u bitset_sets, %u cached (%.2f%%)\n"
-msgstr "%u bitset-mängder, %u cachade (%.2f%%)\n"
-
 #: lib/bitset/stats.c:183
 #, c-format
-msgid "%u bitset_resets, %u cached (%.2f%%)\n"
-msgstr "%u bitset-återställningar, %u cachade (%.2f%%)\n"
+msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+msgstr "%u bitset-allokeringar, %u frigjorda (%.2f %%).\n"
 
 #: lib/bitset/stats.c:186
 #, c-format
-msgid "%u bitset_tests, %u cached (%.2f%%)\n"
-msgstr "%u bitset-tester, %u cachade (%.2f%%)\n"
+msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+msgstr "%u bitset-mängder, %u cachade (%.2f %%)\n"
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:189
+#, c-format
+msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+msgstr "%u bitset-återställningar, %u cachade (%.2f %%)\n"
+
+#: lib/bitset/stats.c:192
+#, c-format
+msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+msgstr "%u bitset-tester, %u cachade (%.2f %%)\n"
+
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr "%u bitset-listor\n"
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr "antalsloggshistogram\n"
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr "storleksloggshistogram\n"
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr "densitetshistogram\n"
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
@@ -83,25 +83,25 @@
 "Bitset-statistik:\n"
 "\n"
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr "Ackumulerade körningar = %u\n"
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 msgid "cannot read stats file"
 msgstr "kan inte läsa statistikfilen"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr "felaktig storlek på statistikfil\n"
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 msgid "cannot write stats file"
 msgstr "kan inte skriva statistikfilen"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
 msgstr "kan inte öppna statistikfilen för skrivning"
 
@@ -113,6 +113,12 @@
 msgid "Unknown system error"
 msgstr "Okänt systemfel"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s-underprocess misslyckades"
+
 #: lib/getopt.c:278
 #, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -141,17 +147,37 @@
 #: lib/getopt.c:621
 #, c-format
 msgid "%s: invalid option -- '%c'\n"
-msgstr "%s: ogiltig flagga -- \"%c\"\n"
+msgstr "%s: ogiltig flagga -- ”%c”\n"
 
 #: lib/getopt.c:636 lib/getopt.c:682
 #, c-format
 msgid "%s: option requires an argument -- '%c'\n"
-msgstr "%s: flaggan kräver ett argument -- \"%c\"\n"
+msgstr "%s: flaggan kräver ett argument -- ”%c”\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "minnet slut"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "kan inte notera aktuell arbetskatalog"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "kunde inte återvända till den ursprungliga arbetskatalogen"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle misslyckades"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "kan inte återställa fb %d: dup2 misslyckades"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -173,26 +199,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "”"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "”"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "kan inte skapa rör"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "%s-underprocess misslyckades"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr "Körtider (sekunder)"
@@ -209,128 +229,43 @@
 msgid "wall clock"
 msgstr "väggklocka"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle misslyckades"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "iconv-funktion inte användbar"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "kan inte återställa fb %d: dup2 misslyckades"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "iconv-funktion inte tillgänglig"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "tecken utanför intervall"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "kan inte konvertera U+%04X till lokal teckenuppsättning"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "kan inte konvertera U+%04X till lokal teckenuppsättning: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "%s-underprocess"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s-underprocess fick ödesdiger signal %d"
 
-#~ msgid "Packaged by %s (%s)\n"
-#~ msgstr "Paketerat av %s (%s)\n"
-
-#~ msgid "Packaged by %s\n"
-#~ msgstr "Paketerat av %s\n"
-
-#~ msgid "(C)"
-#~ msgstr "©"
-
-#~ msgid ""
-#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
-#~ "This is free software: you are free to change and redistribute it.\n"
-#~ "There is NO WARRANTY, to the extent permitted by law.\n"
-#~ msgstr ""
-#~ "Licens GPLv3+: GNU GPL version 3 eller senare <%s>.\n"
-#~ "Detta är fri programvara: du får lov att ändra och vidaredistribuera "
-#~ "den.\n"
-#~ "Det finns INGEN GARANTI, så långt lagen tillåter.\n"
-
-#~ msgid "Written by %s.\n"
-#~ msgstr "Skrivet av %s.\n"
-
-#~ msgid "Written by %s and %s.\n"
-#~ msgstr "Skrivet av %s och %s.\n"
-
-#~ msgid "Written by %s, %s, and %s.\n"
-#~ msgstr "Skrivet av %s, %s och %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "and %s.\n"
-#~ msgstr ""
-#~ "Skrivet av %s, %s, %s\n"
-#~ "och %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, and %s.\n"
-#~ msgstr ""
-#~ "Skrivet av %s, %s, %s,\n"
-#~ "%s och %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, %s, and %s.\n"
-#~ msgstr ""
-#~ "Skrivet av %s, %s, %s,\n"
-#~ "%s, %s och %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, %s, %s, and %s.\n"
-#~ msgstr ""
-#~ "Skrivet av %s, %s, %s,\n"
-#~ "%s, %s, %s och %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, %s, %s, %s,\n"
-#~ "and %s.\n"
-#~ msgstr ""
-#~ "Skrivet av %s, %s, %s,\n"
-#~ "%s, %s, %s, %s\n"
-#~ "och %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, %s, %s, %s,\n"
-#~ "%s, and %s.\n"
-#~ msgstr ""
-#~ "Skrivet av %s, %s, %s,\n"
-#~ "%s, %s, %s, %s,\n"
-#~ "%s och %s.\n"
-
-#~ msgid ""
-#~ "Written by %s, %s, %s,\n"
-#~ "%s, %s, %s, %s,\n"
-#~ "%s, %s, and others.\n"
-#~ msgstr ""
-#~ "Skrivet av %s, %s, %s,\n"
-#~ "%s, %s, %s, %s,\n"
-#~ "%s, %s med flera.\n"
-
-#~ msgid "Report bugs to: %s\n"
-#~ msgstr ""
-#~ "Rapportera fel till: %s\n"
-#~ "Skicka synpunkter på översättningen till: tp-sv@listor.tp-sv.se\n"
-
-#~ msgid "Report %s bugs to: %s\n"
-#~ msgstr "Rapportera %s-fel till: %s\n"
-
-#~ msgid "%s home page: <%s>\n"
-#~ msgstr "%s hemsida: <%s>\n"
-
-#~ msgid "General help using GNU software: <%s>\n"
-#~ msgstr "Allmän hjälp med att använda GNU-program: <%s>\n"
-
 #~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
 #~ msgstr "ARGP_HELP_FMT: värdet på %s är mindre än eller lika med %s"
 
 #~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
-#~ msgstr "%.*s: ARGP_HELP_FMT parametern kräver ett värde"
+#~ msgstr "%.*s: ARGP_HELP_FMT-parametern kräver ett värde"
 
 #~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
 #~ msgstr "%.*s: Okänd ARGP_HELP_FMT-parameter"
@@ -360,7 +295,8 @@
 #~ msgid "Report bugs to %s.\n"
 #~ msgstr ""
 #~ "Rapportera fel till %s.\n"
-#~ "Skicka synpunkter på översättningen till <tp-sv@listor.tp-sv.se>.\n"
+#~ "Skicka synpunkter på översättningen till <tp-sv-list@lists.sourceforge."
+#~ "net>.\n"
 
 #~ msgid "give this help list"
 #~ msgstr "ge denna hjälplista"
@@ -420,7 +356,7 @@
 #~ msgstr "fel när %s öppnades för läsning"
 
 #~ msgid "cannot open backup file %s for writing"
-#~ msgstr "det går inte att öppna säkerthetskopiefil %s för skrivning"
+#~ msgstr "det går inte att öppna säkerhetskopiefilen %s för skrivning"
 
 #~ msgid "error reading %s"
 #~ msgstr "fel vid läsning av %s"
@@ -438,7 +374,7 @@
 #~ msgstr "C#-kompilator hittades inte, försök installera mono"
 
 #~ msgid "C# virtual machine not found, try installing mono"
-#~ msgstr "virtuell C#-maskinen hittades inte, försök installera mono"
+#~ msgstr "den virtuella C#-maskinen hittades inte, försök installera mono"
 
 #~ msgid "unbalanced ["
 #~ msgstr "obalanserad ["
@@ -579,10 +515,10 @@
 #~ msgstr "Bearbetar pågående begäran"
 
 #~ msgid "Request canceled"
-#~ msgstr "Begäran annulerad"
+#~ msgstr "Begäran annullerad"
 
 #~ msgid "Request not canceled"
-#~ msgstr "Begäran inte annulerad"
+#~ msgstr "Begäran inte annullerad"
 
 #~ msgid "All requests done"
 #~ msgstr "Alla begäran utförda"
@@ -603,7 +539,7 @@
 #~ msgstr "ogiltigt target_version-argument till compile_java_class"
 
 #~ msgid "failed to create \"%s\""
-#~ msgstr "det gick inte att skapa \"%s\""
+#~ msgstr "det gick inte att skapa ”%s”"
 
 #~ msgid "error while writing \"%s\" file"
 #~ msgstr "fel vid skrivning av filen ”%s”"
@@ -628,12 +564,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "kan inte skapa katalogen %s"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "kan inte notera aktuell arbetskatalog"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "kunde inte återvända till den ursprungliga arbetskatalogen"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Misslyckades att öppna /dev/zero för läsning"
 
@@ -690,7 +620,7 @@
 #~ msgstr "Ensam ( eller \\("
 
 #~ msgid "Unmatched \\{"
-#~ msgstr "Ensam \\\\{"
+#~ msgstr "Ensam \\{"
 
 #~ msgid "Invalid content of \\{\\}"
 #~ msgstr "Ogiltigt innehåll i \\{\\}"
@@ -795,10 +725,10 @@
 #~ msgstr "Begränsning av filstorlek överskriden"
 
 #~ msgid "Virtual timer expired"
-#~ msgstr "Alarmklocka - virtuell tid"
+#~ msgstr "Alarmklocka - virtuell tid gick ut"
 
 #~ msgid "Profiling timer expired"
-#~ msgstr "Profileringsklocka"
+#~ msgstr "Profileringsklocka gick ut"
 
 #~ msgid "Window changed"
 #~ msgstr "Ändrat fönster"
@@ -831,26 +761,11 @@
 #~ msgstr "fel vid skrivning till ett stängt rör eller uttag"
 
 #~ msgid "Real-time signal %d"
-#~ msgstr "Realtidsignal %d"
+#~ msgstr "Realtidssignal %d"
 
 #~ msgid "Unknown signal %d"
 #~ msgstr "Okänd signal %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "iconv-funktion inte användbar"
-
-#~ msgid "iconv function not available"
-#~ msgstr "iconv-funktion inte tillgänglig"
-
-#~ msgid "character out of range"
-#~ msgstr "tecken utanför intervall"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "kan inte konvertera U+%04X till lokal teckenuppsättning"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "kan inte konvertera U+%04X till lokal teckenuppsättning: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "ogiltig användare"
 
@@ -863,8 +778,106 @@
 #~ msgid "unable to display error message"
 #~ msgstr "kan inte visa felmeddelande"
 
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Paketerat av %s (%s)\n"
+
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Paketerat av %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Licens GPLv3+: GNU GPL version 3 eller senare <%s>.\n"
+#~ "Detta är fri programvara: du får lov att ändra och vidaredistribuera "
+#~ "den.\n"
+#~ "Det finns INGEN GARANTI, så långt lagen tillåter.\n"
+
+#~ msgid "Written by %s.\n"
+#~ msgstr "Skrivet av %s.\n"
+
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Skrivet av %s och %s.\n"
+
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Skrivet av %s, %s och %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Skrivet av %s, %s, %s\n"
+#~ "och %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Skrivet av %s, %s, %s,\n"
+#~ "%s och %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Skrivet av %s, %s, %s,\n"
+#~ "%s, %s och %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Skrivet av %s, %s, %s,\n"
+#~ "%s, %s, %s och %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Skrivet av %s, %s, %s,\n"
+#~ "%s, %s, %s, %s\n"
+#~ "och %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Skrivet av %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s och %s.\n"
+
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Skrivet av %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s med flera.\n"
+
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "Rapportera fel till: %s\n"
+#~ "Skicka synpunkter på översättningen till: tp-sv-list@lists.sourceforg."
+#~ "net\n"
+
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Rapportera %s-fel till: %s\n"
+
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "Webbsida för %s: <%s>\n"
+
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "Allmän hjälp med att använda GNU-program: <%s>\n"
+
 #~ msgid "failed to set file descriptor text/binary mode"
-#~ msgstr "misslyckades att filbeskrivaren i text-/binärt läge"
+#~ msgstr "misslyckades att sätta filbeskrivaren i text-/binärt läge"
 
 #~ msgid "stdin"
 #~ msgstr "standard in"
diff --git a/gnulib-po/tr.gmo b/gnulib-po/tr.gmo
index 5d2a150..327fb8e 100644
--- a/gnulib-po/tr.gmo
+++ b/gnulib-po/tr.gmo
Binary files differ
diff --git a/gnulib-po/tr.po b/gnulib-po/tr.po
index 7aa426c..7b67dd5 100644
--- a/gnulib-po/tr.po
+++ b/gnulib-po/tr.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: coreutils 5.3.0\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2005-03-14 04:17+0200\n"
 "Last-Translator: Deniz Akkus Kanca <deniz@arayan.com>\n"
 "Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n"
@@ -35,71 +35,71 @@
 msgid "Valid arguments are:"
 msgstr "Geçerli argümanlar:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "%s bağı oluşturulamadı"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "%s bağı oluşturulamadı"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "%s yazmak için açılamadı"
@@ -112,6 +112,12 @@
 msgid "Unknown system error"
 msgstr "Bilinmeyen sistem hatası"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s: arama (seek) başarısız"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -147,10 +153,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: seçenek bir argümanla kullanılır -- %c\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "bellek tükendi"
 
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "openat: çalışılan dizini kaydedemedi"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "başlangıç çalışma dizinine geri dönülemedi"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -172,26 +198,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "`"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "'"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, fuzzy, c-format
 msgid "cannot create pipe"
 msgstr "%s bağı oluşturulamadı"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, fuzzy, c-format
-msgid "%s subprocess failed"
-msgstr "%s: arama (seek) başarısız"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -208,22 +228,35 @@
 msgid "wall clock"
 msgstr ""
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr ""
+#
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "iconv işlevi kullanılabilir değil"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr ""
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "iconv işlevi yok"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "karakter kapsamdışı"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "U+%04X yerel karakter kümesine dönüştürülemiyor"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "U+%04X yerel karakter kümesine dönüştürülemiyor: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, fuzzy, c-format
 msgid "%s subprocess"
 msgstr "%s: arama (seek) başarısız"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, fuzzy, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s: arama (seek) başarısız"
@@ -455,13 +488,6 @@
 #~ msgstr "%s'in erişim izinleri değiştirilemiyor"
 
 #, fuzzy
-#~ msgid "unable to record current working directory"
-#~ msgstr "openat: çalışılan dizini kaydedemedi"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "başlangıç çalışma dizinine geri dönülemedi"
-
-#, fuzzy
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "%s: yazmak için açılamadı"
 
@@ -503,22 +529,6 @@
 #~ msgid "^[nN]"
 #~ msgstr "^[hH]"
 
-#
-#~ msgid "iconv function not usable"
-#~ msgstr "iconv işlevi kullanılabilir değil"
-
-#~ msgid "iconv function not available"
-#~ msgstr "iconv işlevi yok"
-
-#~ msgid "character out of range"
-#~ msgstr "karakter kapsamdışı"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "U+%04X yerel karakter kümesine dönüştürülemiyor"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "U+%04X yerel karakter kümesine dönüştürülemiyor: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "kullanıcı geçersiz"
 
diff --git a/gnulib-po/uk.gmo b/gnulib-po/uk.gmo
index cfa9b6a..dc0440f 100644
--- a/gnulib-po/uk.gmo
+++ b/gnulib-po/uk.gmo
Binary files differ
diff --git a/gnulib-po/uk.po b/gnulib-po/uk.po
index 12c7309..0b6a79e 100644
--- a/gnulib-po/uk.po
+++ b/gnulib-po/uk.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 4.0.0.2567\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2019-05-19 14:26+0300\n"
 "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
 "Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
@@ -35,44 +35,44 @@
 msgid "Valid arguments are:"
 msgstr "Дозволені аргументи такі:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr "%u bitset_allocs, %u звільнено (%.2f%%).\n"
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_sets, %u кешовано (%.2f%%)\n"
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_resets, %u кешовано (%.2f%%)\n"
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr "%u bitset_tests, %u кешовано (%.2f%%)\n"
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr "%u bitset_lists\n"
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr "гістограма журналу лічильників\n"
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr "гістограма журналу розміру\n"
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr "гістограма щільності\n"
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
@@ -81,25 +81,25 @@
 "Статистика наборів бітів:\n"
 "\n"
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr "Акумульовані запуски = %u\n"
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 msgid "cannot read stats file"
 msgstr "не вдалося прочитати файл статистичних даних"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr "помилковий розмір файла статистичних даних\n"
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 msgid "cannot write stats file"
 msgstr "не вдалося записати файл статистичних даних."
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
 msgstr "не вдалося відкрити файл статистичних даних для запису"
 
@@ -111,6 +111,12 @@
 msgid "Unknown system error"
 msgstr "Невідома системна помилка"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "нащадок %s зазнав невдачі"
+
 #: lib/getopt.c:278
 #, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -146,10 +152,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: параметр вимагає аргументу -- '%c'\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "пам'ять вичерпано"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "не вдається змінити поточний каталог"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "не вдається зберегти поточний каталог"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "помилка _open_osfhandle"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "не вдається відновити дескриптор %d: помилка dup2"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -171,26 +197,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "`"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "'"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "не вдається створити конвеєр"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "нащадок %s зазнав невдачі"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr "Час виконання (у секундах)"
@@ -207,22 +227,34 @@
 msgid "wall clock"
 msgstr "настінний годинник"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "помилка _open_osfhandle"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "функція iconv непридатна до вжитку"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "не вдається відновити дескриптор %d: помилка dup2"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "функція iconv недоступна"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "символ поза діапазоном"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "не вдається передати U+%04X у локальному зборі знаків"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "не вдається передати U+%04X у локальному зборі знаків: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "нащадок процесу %s"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "підпроцес %s отримав фатальний сигнал %d"
@@ -629,12 +661,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "не вдається створити каталог %s"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "не вдається змінити поточний каталог"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "не вдається зберегти поточний каталог"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Не вдалося відкрити /dev/zero для читання"
 
@@ -836,21 +862,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Невідомий сигнал %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "функція iconv непридатна до вжитку"
-
-#~ msgid "iconv function not available"
-#~ msgstr "функція iconv недоступна"
-
-#~ msgid "character out of range"
-#~ msgstr "символ поза діапазоном"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "не вдається передати U+%04X у локальному зборі знаків"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "не вдається передати U+%04X у локальному зборі знаків: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "Некоректний користувач"
 
diff --git a/gnulib-po/vi.gmo b/gnulib-po/vi.gmo
index d178ae9..4aa1606 100644
--- a/gnulib-po/vi.gmo
+++ b/gnulib-po/vi.gmo
Binary files differ
diff --git a/gnulib-po/vi.po b/gnulib-po/vi.po
index 6467e4c..3f0c8ab 100644
--- a/gnulib-po/vi.po
+++ b/gnulib-po/vi.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: gnulib-3.0.0.6062.a6b16\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2014-01-13 08:31+0700\n"
 "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
 "Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
@@ -36,71 +36,71 @@
 msgid "Valid arguments are:"
 msgstr "Các đối số hợp lệ:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "không thể tạo ống dẫn"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "không thể tạo ống dẫn"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "không thể mở tập tin sao lưu dự phòng “%s” để ghi"
@@ -113,6 +113,12 @@
 msgid "Unknown system error"
 msgstr "Gặp lỗi hệ thống chưa biết"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "Tiến trình con %s bị lỗi"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -148,10 +154,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: tùy chọn yêu cầu một đối số -- “%c”\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "hết bộ nhớ"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "không thể ghi lại thư mục làm việc hiện thời"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "gặp lỗi khi quay trở về thư mục làm việc ban đầu"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle bị lỗi"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "không thể phục hồi bộ mô tả tập tin %d: “dup2” bị lỗi"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -173,26 +199,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "“"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "”"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "không thể tạo ống dẫn"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "Tiến trình con %s bị lỗi"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -210,22 +230,34 @@
 msgid "wall clock"
 msgstr "Đồng hồ báo động"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle bị lỗi"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "hàm iconv không khả dụng"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "không thể phục hồi bộ mô tả tập tin %d: “dup2” bị lỗi"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "không có hàm iconv"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "Ký tự ở ngoại phạm vi"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "không thể chuyển đổi U+%04X sang bộ ký tự địa phương"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "không thể chuyển đổi U+%04X sang bộ ký tự địa phương: %s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "Tiến trình con %s"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "Tiến trình con %s đã nhận tín hiệu nghiêm trọng %d"
@@ -606,12 +638,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "không thể tạo thư mục %s"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "không thể ghi lại thư mục làm việc hiện thời"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "gặp lỗi khi quay trở về thư mục làm việc ban đầu"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "Gặp lỗi khi mở thiết bị “/dev/zero” để đọc"
 
@@ -813,21 +839,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "Không rõ tín hiệu %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "hàm iconv không khả dụng"
-
-#~ msgid "iconv function not available"
-#~ msgstr "không có hàm iconv"
-
-#~ msgid "character out of range"
-#~ msgstr "Ký tự ở ngoại phạm vi"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "không thể chuyển đổi U+%04X sang bộ ký tự địa phương"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "không thể chuyển đổi U+%04X sang bộ ký tự địa phương: %s"
-
 #~ msgid "invalid user"
 #~ msgstr "người dùng không hợp lệ"
 
diff --git a/gnulib-po/zh_CN.gmo b/gnulib-po/zh_CN.gmo
index 23043bf..7599a9c 100644
--- a/gnulib-po/zh_CN.gmo
+++ b/gnulib-po/zh_CN.gmo
Binary files differ
diff --git a/gnulib-po/zh_CN.po b/gnulib-po/zh_CN.po
index 2eaacc5..b62d1d3 100644
--- a/gnulib-po/zh_CN.po
+++ b/gnulib-po/zh_CN.po
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: gnulib 2.0.0.3462.e9796\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2010-02-26 09:54+0800\n"
 "Last-Translator: Ji ZhengYu <zhengyuji@gmail.com>\n"
 "Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
@@ -35,71 +35,71 @@
 msgid "Valid arguments are:"
 msgstr "有效的参数为:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr ""
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr ""
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr ""
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
 "\n"
 msgstr ""
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr ""
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 #, fuzzy
 msgid "cannot read stats file"
 msgstr "无法创建管道"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr ""
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 #, fuzzy
 msgid "cannot write stats file"
 msgstr "无法创建管道"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 #, fuzzy
 msgid "cannot open stats file for writing"
 msgstr "无法打开备份文件“%s”写入数据"
@@ -112,6 +112,12 @@
 msgid "Unknown system error"
 msgstr "未知的系统错误"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s 子进程错误"
+
 #: lib/getopt.c:278
 #, fuzzy, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -147,10 +153,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s: 选项需要参数 -- \"%c\"\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "内存用尽"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "无法记录当前工作的目录"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "返回到初始工作目录失败"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle 失败"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "无法恢复文件描述符 %d: dup2 失败"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -172,26 +198,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "“"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "”"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "无法创建管道"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "%s 子进程错误"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr ""
@@ -209,22 +229,34 @@
 msgid "wall clock"
 msgstr "时钟警报"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle 失败"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "iconv 函数无法使用"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "无法恢复文件描述符 %d: dup2 失败"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "iconv 函数不存在"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "字符值超出可接受的范围以外"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "无法将 U+%04X 转换至用户的字符集"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "无法将 U+%04X 转换至用户的字符集:%s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "%s 子进程"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s 子进程获得终结信号 %d"
@@ -589,12 +621,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "无法创建目录 %s"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "无法记录当前工作的目录"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "返回到初始工作目录失败"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "无法以读方式打开 /dev/zero"
 
@@ -795,21 +821,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "未知信号 %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "iconv 函数无法使用"
-
-#~ msgid "iconv function not available"
-#~ msgstr "iconv 函数不存在"
-
-#~ msgid "character out of range"
-#~ msgstr "字符值超出可接受的范围以外"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "无法将 U+%04X 转换至用户的字符集"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "无法将 U+%04X 转换至用户的字符集:%s"
-
 #~ msgid "invalid user"
 #~ msgstr "无效的用户"
 
diff --git a/gnulib-po/zh_TW.gmo b/gnulib-po/zh_TW.gmo
index 72ec3e5..42de814 100644
--- a/gnulib-po/zh_TW.gmo
+++ b/gnulib-po/zh_TW.gmo
Binary files differ
diff --git a/gnulib-po/zh_TW.po b/gnulib-po/zh_TW.po
index 1acaafa..1da28c2 100644
--- a/gnulib-po/zh_TW.po
+++ b/gnulib-po/zh_TW.po
@@ -3,19 +3,19 @@
 # This file is distributed under the same license as the gnulib package.
 #
 # # Merged from textutils, sh-utils and fileutils translation:
+#
 # # Yip Chi Lap <clyip@cs.hku.hk>, 1998.
 # # Yuan-Chung Cheng <platin@ms.ccafps.khc.edu.tw>, 1998.
 # # Abel Cheung <abelcheung@gmail.com>, 2002.
 # # Pofeng Lee <pofeng@linux.org.tw>, 1998, 2002.
 # Abel Cheung <abelcheung@gmail.com>, 2005.
 # pan93412 <pan93412@gmail.com>, 2019.
-#
 msgid ""
 msgstr ""
 "Project-Id-Version: gnulib 4.0.0.2567\n"
 "Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-12-06 23:21+0800\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2019-12-15 13:01+0800\n"
 "Last-Translator: pan93412 <pan93412@gmail.com>\n"
 "Language-Team: Chinese (traditional) <zh-l10n@lists.linux.org.tw>\n"
 "Language: zh_TW\n"
@@ -24,7 +24,7 @@
 "Content-Transfer-Encoding: 8bit\n"
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Poedit 2.2.1\n"
+"X-Generator: Lokalize 19.12.0\n"
 
 #: lib/argmatch.c:132
 #, c-format
@@ -40,44 +40,44 @@
 msgid "Valid arguments are:"
 msgstr "有效的參數為:"
 
-#: lib/bitset/stats.c:177
+#: lib/bitset/stats.c:183
 #, c-format
 msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 msgstr "%u bitset_allocs,已釋放 %u (%.2f%%)。\n"
 
-#: lib/bitset/stats.c:180
+#: lib/bitset/stats.c:186
 #, c-format
 msgid "%u bitset_sets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_sets,已快取 %u (%.2f%%)\n"
 
-#: lib/bitset/stats.c:183
+#: lib/bitset/stats.c:189
 #, c-format
 msgid "%u bitset_resets, %u cached (%.2f%%)\n"
 msgstr "%u bitset_resets,已快取 %u (%.2f%%)\n"
 
-#: lib/bitset/stats.c:186
+#: lib/bitset/stats.c:192
 #, c-format
 msgid "%u bitset_tests, %u cached (%.2f%%)\n"
 msgstr "%u bitset_tests,%u 已快取 (%.2f%%)\n"
 
-#: lib/bitset/stats.c:190
+#: lib/bitset/stats.c:196
 #, c-format
 msgid "%u bitset_lists\n"
 msgstr "%u bitset_lists\n"
 
-#: lib/bitset/stats.c:192
+#: lib/bitset/stats.c:198
 msgid "count log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:195
+#: lib/bitset/stats.c:201
 msgid "size log histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:198
+#: lib/bitset/stats.c:204
 msgid "density histogram\n"
 msgstr ""
 
-#: lib/bitset/stats.c:210
+#: lib/bitset/stats.c:216
 #, c-format
 msgid ""
 "Bitset statistics:\n"
@@ -86,25 +86,25 @@
 "Bitset 統計:\n"
 "\n"
 
-#: lib/bitset/stats.c:213
+#: lib/bitset/stats.c:219
 #, c-format
 msgid "Accumulated runs = %u\n"
 msgstr "累積執行次數 = %u\n"
 
-#: lib/bitset/stats.c:255 lib/bitset/stats.c:260
+#: lib/bitset/stats.c:261 lib/bitset/stats.c:266
 msgid "cannot read stats file"
 msgstr "無法讀取統計檔案"
 
-#: lib/bitset/stats.c:257
+#: lib/bitset/stats.c:263
 #, c-format
 msgid "bad stats file size\n"
 msgstr "統計檔案大小無效\n"
 
-#: lib/bitset/stats.c:281 lib/bitset/stats.c:283
+#: lib/bitset/stats.c:287 lib/bitset/stats.c:289
 msgid "cannot write stats file"
 msgstr "無法寫入統計檔案"
 
-#: lib/bitset/stats.c:286
+#: lib/bitset/stats.c:292
 msgid "cannot open stats file for writing"
 msgstr "無法開啟統計檔案寫入"
 
@@ -116,6 +116,12 @@
 msgid "Unknown system error"
 msgstr "未知系統錯誤"
 
+#: lib/execute.c:348 lib/spawn-pipe.c:597 lib/wait-process.c:291
+#: lib/wait-process.c:365
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s 子執行程序執行失敗"
+
 #: lib/getopt.c:278
 #, c-format
 msgid "%s: option '%s%s' is ambiguous\n"
@@ -151,10 +157,30 @@
 msgid "%s: option requires an argument -- '%c'\n"
 msgstr "%s:選項需要參數 -- '%c'\n"
 
-#: lib/obstack.c:338 lib/obstack.c:340 lib/xalloc-die.c:34
+#: lib/obstack.c:337 lib/obstack.c:339 lib/xalloc-die.c:34
 msgid "memory exhausted"
 msgstr "記憶體用盡"
 
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "無法記錄目前工作目錄"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "無法回到初始工作目錄"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle 失敗"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "無法復原 fd %d:dup2 失敗"
+
 #. TRANSLATORS:
 #. Get translations for open and closing quotation marks.
 #. The message catalog should translate "`" to a left
@@ -176,26 +202,20 @@
 #. If you don't know what to put here, please see
 #. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
 #. and use glyphs suitable for your language.
-#: lib/quotearg.c:362
+#: lib/quotearg.c:355
 msgid "`"
 msgstr "「"
 
-#: lib/quotearg.c:363
+#: lib/quotearg.c:356
 msgid "'"
 msgstr "」"
 
-#: lib/spawn-pipe.c:141 lib/spawn-pipe.c:144 lib/spawn-pipe.c:265
-#: lib/spawn-pipe.c:268
+#: lib/spawn-pipe.c:217 lib/spawn-pipe.c:220 lib/spawn-pipe.c:459
+#: lib/spawn-pipe.c:462
 #, c-format
 msgid "cannot create pipe"
 msgstr "無法建立管線"
 
-#: lib/spawn-pipe.c:235 lib/spawn-pipe.c:349 lib/wait-process.c:290
-#: lib/wait-process.c:364
-#, c-format
-msgid "%s subprocess failed"
-msgstr "%s 子執行程序執行失敗"
-
 #: lib/timevar.c:316
 msgid "Execution times (seconds)"
 msgstr "執行次數(秒)"
@@ -212,22 +232,34 @@
 msgid "wall clock"
 msgstr "掛鐘"
 
-#: lib/w32spawn.h:49
-#, c-format
-msgid "_open_osfhandle failed"
-msgstr "_open_osfhandle 失敗"
+#: lib/unicodeio.c:102
+msgid "iconv function not usable"
+msgstr "iconv 功能沒有用"
 
-#: lib/w32spawn.h:90
-#, c-format
-msgid "cannot restore fd %d: dup2 failed"
-msgstr "無法復原 fd %d:dup2 失敗"
+#: lib/unicodeio.c:104
+msgid "iconv function not available"
+msgstr "iconv 功能不能使用"
 
-#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#: lib/unicodeio.c:111
+msgid "character out of range"
+msgstr "字元超出範圍"
+
+#: lib/unicodeio.c:198
+#, c-format
+msgid "cannot convert U+%04X to local character set"
+msgstr "無法將 U+%04X 轉換至使用者的字元集"
+
+#: lib/unicodeio.c:200
+#, c-format
+msgid "cannot convert U+%04X to local character set: %s"
+msgstr "無法將 U+%04X 轉換至使用者的字元集:%s"
+
+#: lib/wait-process.c:232 lib/wait-process.c:264 lib/wait-process.c:326
 #, c-format
 msgid "%s subprocess"
 msgstr "%s 子執行程序"
 
-#: lib/wait-process.c:282 lib/wait-process.c:354
+#: lib/wait-process.c:283 lib/wait-process.c:355
 #, c-format
 msgid "%s subprocess got fatal signal %d"
 msgstr "%s 子執行程序收到嚴重錯誤信號 %d"
@@ -490,7 +522,7 @@
 #~ msgstr "所有請求完成"
 
 #~ msgid "Interrupted by a signal"
-#~ msgstr "遭信號中止"
+#~ msgstr "遭信號中斷"
 
 #~ msgid "Parameter string not correctly encoded"
 #~ msgstr "未正確編碼參數字串"
@@ -528,12 +560,6 @@
 #~ msgid "cannot create directory %s"
 #~ msgstr "無法建立 %s 目錄"
 
-#~ msgid "unable to record current working directory"
-#~ msgstr "無法記錄目前工作目錄"
-
-#~ msgid "failed to return to initial working directory"
-#~ msgstr "無法回到初始工作目錄"
-
 #~ msgid "Failed to open /dev/zero for read"
 #~ msgstr "無法開啟 /dev/zero 讀取"
 
@@ -628,10 +654,10 @@
 #~ msgstr "掛斷"
 
 #~ msgid "Interrupt"
-#~ msgstr "中止"
+#~ msgstr "中斷"
 
 #~ msgid "Quit"
-#~ msgstr "結束"
+#~ msgstr "退出"
 
 #~ msgid "Illegal instruction"
 #~ msgstr "無效指令"
@@ -640,10 +666,10 @@
 #~ msgstr "追蹤 / 斷點陷阱"
 
 #~ msgid "Aborted"
-#~ msgstr "取消"
+#~ msgstr "中止"
 
 #~ msgid "Floating point exception"
-#~ msgstr "期望浮點數"
+#~ msgstr "浮點數例外"
 
 #~ msgid "Killed"
 #~ msgstr "強制結束"
@@ -735,21 +761,6 @@
 #~ msgid "Unknown signal %d"
 #~ msgstr "未知信號 %d"
 
-#~ msgid "iconv function not usable"
-#~ msgstr "iconv 功能沒有用"
-
-#~ msgid "iconv function not available"
-#~ msgstr "iconv 功能不能使用"
-
-#~ msgid "character out of range"
-#~ msgstr "字元超出範圍"
-
-#~ msgid "cannot convert U+%04X to local character set"
-#~ msgstr "無法將 U+%04X 轉換至使用者的字元集"
-
-#~ msgid "cannot convert U+%04X to local character set: %s"
-#~ msgstr "無法將 U+%04X 轉換至使用者的字元集:%s"
-
 #~ msgid "invalid user"
 #~ msgstr "使用者無效"
 
diff --git a/lib/_Noreturn.h b/lib/_Noreturn.h
index 7570f82..6fed3c7 100644
--- a/lib/_Noreturn.h
+++ b/lib/_Noreturn.h
@@ -1,17 +1,17 @@
 /* A C macro for declaring that a function does not return.
-   Copyright (C) 2011-2019 Free Software Foundation, Inc.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _Noreturn
@@ -26,11 +26,16 @@
        AIX system header files and several gnulib header files use precisely
        this syntax with 'extern'.  */
 #  define _Noreturn [[noreturn]]
-# elif ((!defined __cplusplus || defined __clang__)                     \
-        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)  \
-            || 4 < __GNUC__ + (7 <= __GNUC_MINOR__)))
+# elif ((!defined __cplusplus || defined __clang__) \
+        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
+            || (!defined __STRICT_ANSI__ \
+                && (4 < __GNUC__ + (7 <= __GNUC_MINOR__) \
+                    || (defined __apple_build_version__ \
+                        ? 6000000 <= __apple_build_version__ \
+                        : 3 < __clang_major__ + (5 <= __clang_minor__))))))
    /* _Noreturn works as-is.  */
-# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
+# elif (2 < __GNUC__ + (8 <= __GNUC_MINOR__) || defined __clang__ \
+        || 0x5110 <= __SUNPRO_C)
 #  define _Noreturn __attribute__ ((__noreturn__))
 # elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
 #  define _Noreturn __declspec (noreturn)
diff --git a/lib/access.c b/lib/access.c
new file mode 100644
index 0000000..dd9c43e
--- /dev/null
+++ b/lib/access.c
@@ -0,0 +1,31 @@
+/* Test the access rights of a file.
+   Copyright (C) 2019-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <unistd.h>
+
+#include <fcntl.h>
+#include <io.h>
+
+int
+access (const char *file, int mode)
+{
+  if ((mode & X_OK) != 0)
+    mode = (mode & ~X_OK) | R_OK;
+  return _access (file, mode);
+}
diff --git a/lib/alignof.h b/lib/alignof.h
index 46f4ad0..e6e7a51 100644
--- a/lib/alignof.h
+++ b/lib/alignof.h
@@ -1,18 +1,18 @@
 /* Determine alignment of types.
-   Copyright (C) 2003-2004, 2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003-2004, 2006, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _ALIGNOF_H
 #define _ALIGNOF_H
@@ -36,12 +36,14 @@
 /* alignof_type (TYPE)
    Determine the good alignment of an object of the given type at compile time.
    Note that this is not necessarily the same as alignof_slot(type).
-   For example, with GNU C on x86 platforms: alignof_type(double) = 8, but
+   For example, with GNU C on x86 platforms and with clang on Linux/x86:
+   alignof_type(long long) = 8, but alignof_slot(long long) = 4.
+   And alignof_type(double) = 8, but
    - when -malign-double is not specified:  alignof_slot(double) = 4,
    - when -malign-double is specified:      alignof_slot(double) = 8.
    Note: The result cannot be used as a value for an 'enum' constant,
    due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc.  */
-#if defined __GNUC__ || defined __IBM__ALIGNOF__
+#if defined __GNUC__ || defined __clang__ || defined __IBM__ALIGNOF__
 # define alignof_type __alignof__
 #else
 # define alignof_type alignof_slot
diff --git a/lib/alloca.in.h b/lib/alloca.in.h
index a581d58..65c2d4d 100644
--- a/lib/alloca.in.h
+++ b/lib/alloca.in.h
@@ -1,22 +1,20 @@
 /* Memory allocation on the stack.
 
-   Copyright (C) 1995, 1999, 2001-2004, 2006-2019 Free Software Foundation,
+   Copyright (C) 1995, 1999, 2001-2004, 2006-2021 Free Software Foundation,
    Inc.
 
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
-   License along with this program; if not, see
-   <https://www.gnu.org/licenses/>.
-  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
    means there is a real alloca function.  */
@@ -35,13 +33,16 @@
  */
 
 #ifndef alloca
-# ifdef __GNUC__
-   /* Some version of mingw have an <alloca.h> that causes trouble when
-      included after 'alloca' gets defined as a macro.  As a workaround, include
-      this <alloca.h> first and define 'alloca' as a macro afterwards.  */
-#  if (defined _WIN32 && ! defined __CYGWIN__) && @HAVE_ALLOCA_H@
-#   include_next <alloca.h>
-#  endif
+  /* Some version of mingw have an <alloca.h> that causes trouble when
+     included after 'alloca' gets defined as a macro.  As a workaround,
+     include this <alloca.h> first and define 'alloca' as a macro afterwards
+     if needed.  */
+# if defined __GNUC__ && (defined _WIN32 && ! defined __CYGWIN__) && @HAVE_ALLOCA_H@
+#  include_next <alloca.h>
+# endif
+#endif
+#ifndef alloca
+# if defined __GNUC__ || (__clang_major__ >= 4)
 #  define alloca __builtin_alloca
 # elif defined _AIX
 #  define alloca __alloca
diff --git a/lib/allocator.c b/lib/allocator.c
index 2c1a3da..2262de9 100644
--- a/lib/allocator.c
+++ b/lib/allocator.c
@@ -1,3 +1,20 @@
+/* Memory allocators such as malloc+free.
+
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #define _GL_USE_STDLIB_ALLOC 1
 #include <config.h>
 #include "allocator.h"
diff --git a/lib/allocator.h b/lib/allocator.h
index 5a632ba..f0e8f34 100644
--- a/lib/allocator.h
+++ b/lib/allocator.h
@@ -1,18 +1,18 @@
 /* Memory allocators such as malloc+free.
 
-   Copyright (C) 2011-2019 Free Software Foundation, Inc.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Paul Eggert.  */
diff --git a/lib/areadlink.c b/lib/areadlink.c
index 0594356..90ae0d5 100644
--- a/lib/areadlink.c
+++ b/lib/areadlink.c
@@ -1,19 +1,19 @@
 /* areadlink.c -- readlink wrapper to return the link name in malloc'd storage
    Unlike xreadlink and xreadlink_with_size, don't ever call exit.
 
-   Copyright (C) 2001, 2003-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2003-2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Jim Meyering <jim@meyering.net>
diff --git a/lib/areadlink.h b/lib/areadlink.h
index ddcd06d..1d0629e 100644
--- a/lib/areadlink.h
+++ b/lib/areadlink.h
@@ -1,33 +1,37 @@
 /* Read symbolic links without size limitation.
 
-   Copyright (C) 2001, 2003-2004, 2007, 2009-2019 Free Software Foundation,
+   Copyright (C) 2001, 2003-2004, 2007, 2009-2021 Free Software Foundation,
    Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Jim Meyering <jim@meyering.net>  */
 
-#include <stddef.h>
+#include <stdlib.h>
 
-extern char *areadlink (char const *filename);
-extern char *areadlink_with_size (char const *filename, size_t size_hint);
+extern char *areadlink (char const *filename)
+  _GL_ATTRIBUTE_DEALLOC_FREE;
+extern char *areadlink_with_size (char const *filename, size_t size_hint)
+  _GL_ATTRIBUTE_DEALLOC_FREE;
 
 #if GNULIB_AREADLINKAT
-extern char *areadlinkat (int fd, char const *filename);
+extern char *areadlinkat (int fd, char const *filename)
+  _GL_ATTRIBUTE_DEALLOC_FREE;
 #endif
 
 #if GNULIB_AREADLINKAT_WITH_SIZE
 extern char *areadlinkat_with_size (int fd, char const *filename,
-                                    size_t size_hint);
+                                    size_t size_hint)
+  _GL_ATTRIBUTE_DEALLOC_FREE;
 #endif
diff --git a/lib/arg-nonnull.h b/lib/arg-nonnull.h
index ad8c26c..b4de241 100644
--- a/lib/arg-nonnull.h
+++ b/lib/arg-nonnull.h
@@ -1,24 +1,24 @@
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
diff --git a/lib/argmatch.c b/lib/argmatch.c
index 9eeb451..dfdb4e3 100644
--- a/lib/argmatch.c
+++ b/lib/argmatch.c
@@ -1,6 +1,6 @@
 /* argmatch.c -- find a match for a string in an array
 
-   Copyright (C) 1990, 1998-1999, 2001-2007, 2009-2019 Free Software
+   Copyright (C) 1990, 1998-1999, 2001-2007, 2009-2021 Free Software
    Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -266,7 +266,7 @@
                              backup_args, backup_vals);
 
   printf ("The version control is '%s'\n",
-          ARGMATCH_TO_ARGUMENT (backup_type, backup_args, backup_vals));
+          ARGMATCH_TO_ARGUMENT (&backup_type, backup_args, backup_vals));
 
   return 0;
 }
diff --git a/lib/argmatch.h b/lib/argmatch.h
index 897fa41..3ef6813 100644
--- a/lib/argmatch.h
+++ b/lib/argmatch.h
@@ -1,6 +1,6 @@
 /* argmatch.h -- definitions and prototypes for argmatch.c
 
-   Copyright (C) 1990, 1998-1999, 2001-2002, 2004-2005, 2009-2019 Free Software
+   Copyright (C) 1990, 1998-1999, 2001-2002, 2004-2005, 2009-2021 Free Software
    Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
diff --git a/lib/asnprintf.c b/lib/asnprintf.c
index d2a8c09..c5367b2 100644
--- a/lib/asnprintf.c
+++ b/lib/asnprintf.c
@@ -1,18 +1,18 @@
 /* Formatted output to strings.
-   Copyright (C) 1999, 2002, 2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2002, 2006, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
diff --git a/lib/asprintf.c b/lib/asprintf.c
index 6cbd062..9c78c13 100644
--- a/lib/asprintf.c
+++ b/lib/asprintf.c
@@ -1,19 +1,19 @@
 /* Formatted output to strings.
-   Copyright (C) 1999, 2002, 2006-2007, 2009-2019 Free Software Foundation,
+   Copyright (C) 1999, 2002, 2006-2007, 2009-2021 Free Software Foundation,
    Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
diff --git a/lib/assure.h b/lib/assure.h
index c21b6a6..49aa82f 100644
--- a/lib/assure.h
+++ b/lib/assure.h
@@ -1,18 +1,18 @@
 /* Run-time assert-like macros.
 
-   Copyright (C) 2014-2019 Free Software Foundation, Inc.
+   Copyright (C) 2014-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Paul Eggert.  */
@@ -21,12 +21,32 @@
 #define _GL_ASSURE_H
 
 #include <assert.h>
+#include "verify.h"
+
+/* Evaluate an assertion E that is guaranteed to be true.
+   If NDEBUG is not defined, abort the program if E is false.
+   If NDEBUG is defined, the compiler can assume E and behavior is
+   undefined if E is false, fails to evaluate, or has side effects.
+
+   Unlike standard 'assert', this macro evaluates E even when NDEBUG
+   is defined, so as to catch typos, avoid some GCC warnings, and
+   improve performance when E is simple enough.
+
+   Also see the documentation for 'assume' in verify.h.  */
+
+#ifdef NDEBUG
+# define affirm(E) assume (E)
+#else
+# define affirm(E) assert (E)
+#endif
 
 /* Check E's value at runtime, and report an error and abort if not.
    However, do nothing if NDEBUG is defined.
 
-   Unlike standard 'assert', this macro always compiles E even when NDEBUG
-   is defined, so as to catch typos and avoid some GCC warnings.  */
+   Unlike standard 'assert', this macro compiles E even when NDEBUG
+   is defined, so as to catch typos and avoid some GCC warnings.
+   Unlike 'affirm', it is OK for E to use hard-to-optimize features,
+   since E is not executed if NDEBUG is defined.  */
 
 #ifdef NDEBUG
 # define assure(E) ((void) (0 && (E)))
diff --git a/lib/at-func.c b/lib/at-func.c
new file mode 100644
index 0000000..b6d9de7
--- /dev/null
+++ b/lib/at-func.c
@@ -0,0 +1,146 @@
+/* Define at-style functions like fstatat, unlinkat, fchownat, etc.
+   Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* written by Jim Meyering */
+
+#include "filename.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
+
+#ifdef GNULIB_SUPPORT_ONLY_AT_FDCWD
+# include <errno.h>
+# ifndef ENOTSUP
+#  define ENOTSUP EINVAL
+# endif
+#else
+# include "openat.h"
+# include "openat-priv.h"
+# include "save-cwd.h"
+#endif
+
+#ifdef AT_FUNC_USE_F1_COND
+# define CALL_FUNC(F)                           \
+  (flag == AT_FUNC_USE_F1_COND                  \
+    ? AT_FUNC_F1 (F AT_FUNC_POST_FILE_ARGS)     \
+    : AT_FUNC_F2 (F AT_FUNC_POST_FILE_ARGS))
+# define VALIDATE_FLAG(F)                       \
+  if (flag & ~AT_FUNC_USE_F1_COND)              \
+    {                                           \
+      errno = EINVAL;                           \
+      return FUNC_FAIL;                         \
+    }
+#else
+# define CALL_FUNC(F) (AT_FUNC_F1 (F AT_FUNC_POST_FILE_ARGS))
+# define VALIDATE_FLAG(F) /* empty */
+#endif
+
+#ifdef AT_FUNC_RESULT
+# define FUNC_RESULT AT_FUNC_RESULT
+#else
+# define FUNC_RESULT int
+#endif
+
+#ifdef AT_FUNC_FAIL
+# define FUNC_FAIL AT_FUNC_FAIL
+#else
+# define FUNC_FAIL -1
+#endif
+
+/* Call AT_FUNC_F1 to operate on FILE, which is in the directory
+   open on descriptor FD.  If AT_FUNC_USE_F1_COND is defined to a value,
+   AT_FUNC_POST_FILE_PARAM_DECLS must include a parameter named flag;
+   call AT_FUNC_F2 if FLAG is 0 or fail if FLAG contains more bits than
+   AT_FUNC_USE_F1_COND.  Return int and fail with -1 unless AT_FUNC_RESULT
+   or AT_FUNC_FAIL are defined.  If possible, do it without changing the
+   working directory.  Otherwise, resort to using save_cwd/fchdir,
+   then AT_FUNC_F?/restore_cwd.  If either the save_cwd or the restore_cwd
+   fails, then give a diagnostic and exit nonzero.  */
+FUNC_RESULT
+AT_FUNC_NAME (int fd, char const *file AT_FUNC_POST_FILE_PARAM_DECLS)
+{
+  VALIDATE_FLAG (flag);
+
+  if (fd == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file))
+    return CALL_FUNC (file);
+
+#ifdef GNULIB_SUPPORT_ONLY_AT_FDCWD
+  errno = ENOTSUP;
+  return FUNC_FAIL;
+#else
+  {
+  /* Be careful to choose names unlikely to conflict with
+     AT_FUNC_POST_FILE_PARAM_DECLS.  */
+  struct saved_cwd saved_cwd;
+  int saved_errno;
+  FUNC_RESULT err;
+
+  {
+    char proc_buf[OPENAT_BUFFER_SIZE];
+    char *proc_file = openat_proc_name (proc_buf, fd, file);
+    if (proc_file)
+      {
+        FUNC_RESULT proc_result = CALL_FUNC (proc_file);
+        int proc_errno = errno;
+        if (proc_file != proc_buf)
+          free (proc_file);
+        /* If the syscall succeeds, or if it fails with an unexpected
+           errno value, then return right away.  Otherwise, fall through
+           and resort to using save_cwd/restore_cwd.  */
+        if (FUNC_FAIL != proc_result)
+          return proc_result;
+        if (! EXPECTED_ERRNO (proc_errno))
+          {
+            errno = proc_errno;
+            return proc_result;
+          }
+      }
+  }
+
+  if (save_cwd (&saved_cwd) != 0)
+    openat_save_fail (errno);
+  if (0 <= fd && fd == saved_cwd.desc)
+    {
+      /* If saving the working directory collides with the user's
+         requested fd, then the user's fd must have been closed to
+         begin with.  */
+      free_cwd (&saved_cwd);
+      errno = EBADF;
+      return FUNC_FAIL;
+    }
+
+  if (fchdir (fd) != 0)
+    {
+      saved_errno = errno;
+      free_cwd (&saved_cwd);
+      errno = saved_errno;
+      return FUNC_FAIL;
+    }
+
+  err = CALL_FUNC (file);
+  saved_errno = (err == FUNC_FAIL ? errno : 0);
+
+  if (restore_cwd (&saved_cwd) != 0)
+    openat_restore_fail (errno);
+
+  free_cwd (&saved_cwd);
+
+  if (saved_errno)
+    errno = saved_errno;
+  return err;
+  }
+#endif
+}
+#undef CALL_FUNC
+#undef FUNC_RESULT
+#undef FUNC_FAIL
diff --git a/lib/attribute.h b/lib/attribute.h
new file mode 100644
index 0000000..eb36188
--- /dev/null
+++ b/lib/attribute.h
@@ -0,0 +1,226 @@
+/* ATTRIBUTE_* macros for using attributes in GCC and similar compilers
+
+   Copyright 2020-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Paul Eggert.  */
+
+/* Provide public ATTRIBUTE_* names for the private _GL_ATTRIBUTE_*
+   macros used within Gnulib.  */
+
+/* These attributes can be placed in two ways:
+     - At the start of a declaration (i.e. even before storage-class
+       specifiers!); then they apply to all entities that are declared
+       by the declaration.
+     - Immediately after the name of an entity being declared by the
+       declaration; then they apply to that entity only.  */
+
+#ifndef _GL_ATTRIBUTE_H
+#define _GL_ATTRIBUTE_H
+
+
+/* This file defines two types of attributes:
+   * C2x standard attributes.  These have macro names that do not begin with
+     'ATTRIBUTE_'.
+   * Selected GCC attributes; see:
+     https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html
+     https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html
+     https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html
+     These names begin with 'ATTRIBUTE_' to avoid name clashes.  */
+
+
+/* =============== Attributes for specific kinds of functions =============== */
+
+/* Attributes for functions that should not be used.  */
+
+/* Warn if the entity is used.  */
+/* Applies to:
+     - function, variable,
+     - struct, union, struct/union member,
+     - enumeration, enumeration item,
+     - typedef,
+   in C++ also: namespace, class, template specialization.  */
+#define DEPRECATED _GL_ATTRIBUTE_DEPRECATED
+
+/* If a function call is not optimized way, warn with MSG.  */
+/* Applies to: functions.  */
+#define ATTRIBUTE_WARNING(msg) _GL_ATTRIBUTE_WARNING (msg)
+
+/* If a function call is not optimized way, report an error with MSG.  */
+/* Applies to: functions.  */
+#define ATTRIBUTE_ERROR(msg) _GL_ATTRIBUTE_ERROR (msg)
+
+
+/* Attributes for memory-allocating functions.  */
+
+/* The function returns a pointer to freshly allocated memory.  */
+/* Applies to: functions.  */
+#define ATTRIBUTE_MALLOC _GL_ATTRIBUTE_MALLOC
+
+/* ATTRIBUTE_ALLOC_SIZE ((N)) - The Nth argument of the function
+   is the size of the returned memory block.
+   ATTRIBUTE_ALLOC_SIZE ((M, N)) - Multiply the Mth and Nth arguments
+   to determine the size of the returned memory block.  */
+/* Applies to: function, pointer to function, function types.  */
+#define ATTRIBUTE_ALLOC_SIZE(args) _GL_ATTRIBUTE_ALLOC_SIZE (args)
+
+/* ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.
+   ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
+   can be freed via 'free'; it can be used only after declaring 'free'.  */
+/* Applies to: functions.  Cannot be used on inline functions.  */
+#define ATTRIBUTE_DEALLOC(f, i) _GL_ATTRIBUTE_DEALLOC(f, i)
+#define ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC_FREE
+
+/* Attributes for variadic functions.  */
+
+/* The variadic function expects a trailing NULL argument.
+   ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99).
+   ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL.  */
+/* Applies to: functions.  */
+#define ATTRIBUTE_SENTINEL(pos) _GL_ATTRIBUTE_SENTINEL (pos)
+
+
+/* ================== Attributes for compiler diagnostics ================== */
+
+/* Attributes that help the compiler diagnose programmer mistakes.
+   Some of them may also help for some compiler optimizations.  */
+
+/* ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)) -
+   The STRING-INDEXth function argument is a format string of style
+   ARCHETYPE, which is one of:
+     printf, gnu_printf
+     scanf, gnu_scanf,
+     strftime, gnu_strftime,
+     strfmon,
+   or the same thing prefixed and suffixed with '__'.
+   If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK
+   are suitable for the format string.  */
+/* Applies to: functions.  */
+#define ATTRIBUTE_FORMAT(spec) _GL_ATTRIBUTE_FORMAT (spec)
+
+/* ATTRIBUTE_NONNULL ((N1, N2,...)) - Arguments N1, N2,... must not be NULL.
+   ATTRIBUTE_NONNULL () - All pointer arguments must not be null.  */
+/* Applies to: functions.  */
+#define ATTRIBUTE_NONNULL(args) _GL_ATTRIBUTE_NONNULL (args)
+
+/* The function's return value is a non-NULL pointer.  */
+/* Applies to: functions.  */
+#define ATTRIBUTE_RETURNS_NONNULL _GL_ATTRIBUTE_RETURNS_NONNULL
+
+/* Warn if the caller does not use the return value,
+   unless the caller uses something like ignore_value.  */
+/* Applies to: function, enumeration, class.  */
+#define NODISCARD _GL_ATTRIBUTE_NODISCARD
+
+
+/* Attributes that disable false alarms when the compiler diagnoses
+   programmer "mistakes".  */
+
+/* Do not warn if the entity is not used.  */
+/* Applies to:
+     - function, variable,
+     - struct, union, struct/union member,
+     - enumeration, enumeration item,
+     - typedef,
+   in C++ also: class.  */
+#define MAYBE_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
+
+/* The contents of a character array is not meant to be NUL-terminated.  */
+/* Applies to: struct/union members and variables that are arrays of element
+   type '[[un]signed] char'.  */
+#define ATTRIBUTE_NONSTRING _GL_ATTRIBUTE_NONSTRING
+
+/* Do not warn if control flow falls through to the immediately
+   following 'case' or 'default' label.  */
+/* Applies to: Empty statement (;), inside a 'switch' statement.  */
+#define FALLTHROUGH _GL_ATTRIBUTE_FALLTHROUGH
+
+
+/* ================== Attributes for debugging information ================== */
+
+/* Attributes regarding debugging information emitted by the compiler.  */
+
+/* Omit the function from stack traces when debugging.  */
+/* Applies to: function.  */
+#define ATTRIBUTE_ARTIFICIAL _GL_ATTRIBUTE_ARTIFICIAL
+
+/* Make the entity visible to debuggers etc., even with '-fwhole-program'.  */
+/* Applies to: functions, variables.  */
+#define ATTRIBUTE_EXTERNALLY_VISIBLE _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
+
+
+/* ========== Attributes that mainly direct compiler optimizations ========== */
+
+/* The function does not throw exceptions.  */
+/* Applies to: functions.  */
+#define ATTRIBUTE_NOTHROW _GL_ATTRIBUTE_NOTHROW
+
+/* Do not inline the function.  */
+/* Applies to: functions.  */
+#define ATTRIBUTE_NOINLINE _GL_ATTRIBUTE_NOINLINE
+
+/* Always inline the function, and report an error if the compiler
+   cannot inline.  */
+/* Applies to: function.  */
+#define ATTRIBUTE_ALWAYS_INLINE _GL_ATTRIBUTE_ALWAYS_INLINE
+
+/* It is OK for a compiler to omit duplicate calls with the same arguments.
+   This attribute is safe for a function that neither depends on
+   nor affects observable state, and always returns exactly once -
+   e.g., does not loop forever, and does not call longjmp.
+   (This attribute is stricter than ATTRIBUTE_PURE.)  */
+/* Applies to: functions.  */
+#define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST
+
+/* It is OK for a compiler to omit duplicate calls with the same
+   arguments if observable state is not changed between calls.
+   This attribute is safe for a function that does not affect
+   observable state, and always returns exactly once.
+   (This attribute is looser than ATTRIBUTE_CONST.)  */
+/* Applies to: functions.  */
+#define ATTRIBUTE_PURE _GL_ATTRIBUTE_PURE
+
+/* The function is rarely executed.  */
+/* Applies to: functions.  */
+#define ATTRIBUTE_COLD _GL_ATTRIBUTE_COLD
+
+/* If called from some other compilation unit, the function executes
+   code from that unit only by return or by exception handling,
+   letting the compiler optimize that unit more aggressively.  */
+/* Applies to: functions.  */
+#define ATTRIBUTE_LEAF _GL_ATTRIBUTE_LEAF
+
+/* For struct members: The member has the smallest possible alignment.
+   For struct, union, class: All members have the smallest possible alignment,
+   minimizing the memory required.  */
+/* Applies to: struct members, struct, union,
+   in C++ also: class.  */
+#define ATTRIBUTE_PACKED _GL_ATTRIBUTE_PACKED
+
+
+/* ================ Attributes that make invalid code valid ================ */
+
+/* Attributes that prevent fatal compiler optimizations for code that is not
+   fully ISO C compliant.  */
+
+/* Pointers to the type may point to the same storage as pointers to
+   other types, thus disabling strict aliasing optimization.  */
+/* Applies to: types.  */
+#define ATTRIBUTE_MAY_ALIAS _GL_ATTRIBUTE_MAY_ALIAS
+
+
+#endif /* _GL_ATTRIBUTE_H */
diff --git a/lib/basename-lgpl.c b/lib/basename-lgpl.c
index 0ae04ee..5dbd157 100644
--- a/lib/basename-lgpl.c
+++ b/lib/basename-lgpl.c
@@ -1,37 +1,37 @@
 /* basename.c -- return the last element in a file name
 
-   Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2019 Free Software
+   Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2021 Free Software
    Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
-#include "dirname.h"
+/* Specification.  */
+#include "basename-lgpl.h"
 
+#include <stdbool.h>
 #include <string.h>
 
-/* Return the address of the last file name component of NAME.  If
-   NAME has no relative file name components because it is a file
-   system root, return the empty string.  */
+#include "filename.h"
 
 char *
 last_component (char const *name)
 {
   char const *base = name + FILE_SYSTEM_PREFIX_LEN (name);
   char const *p;
-  bool saw_slash = false;
+  bool last_was_slash = false;
 
   while (ISSLASH (*base))
     base++;
@@ -39,21 +39,17 @@
   for (p = base; *p; p++)
     {
       if (ISSLASH (*p))
-        saw_slash = true;
-      else if (saw_slash)
+        last_was_slash = true;
+      else if (last_was_slash)
         {
           base = p;
-          saw_slash = false;
+          last_was_slash = false;
         }
     }
 
   return (char *) base;
 }
 
-/* Return the length of the basename NAME.  Typically NAME is the
-   value returned by base_name or last_component.  Act like strlen
-   (NAME), except omit all trailing slashes.  */
-
 size_t
 base_len (char const *name)
 {
diff --git a/lib/basename-lgpl.h b/lib/basename-lgpl.h
new file mode 100644
index 0000000..d520c09
--- /dev/null
+++ b/lib/basename-lgpl.h
@@ -0,0 +1,78 @@
+/* Extract the last component (base name) of a file name.
+
+   Copyright (C) 1998, 2001, 2003-2006, 2009-2021 Free Software Foundation,
+   Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _BASENAME_LGPL_H
+#define _BASENAME_LGPL_H
+
+#include <stddef.h>
+
+#ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
+# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Return the address of the last file name component of FILENAME.
+   If FILENAME has some trailing slash(es), they are considered to be
+   part of the last component.
+   If FILENAME has no relative file name components because it is a file
+   system root, return the empty string.
+   Examples:
+              FILENAME      RESULT
+              "foo.c"       "foo.c"
+              "foo/bar.c"   "bar.c"
+              "/foo/bar.c"  "bar.c"
+              "foo/bar/"    "bar/"
+              "foo/bar//"   "bar//"
+              "/"           ""
+              "//"          ""
+              ""            ""
+   The return value is a tail of the given FILENAME; do NOT free() it!  */
+
+/* This function was traditionally called 'basename', but we avoid this
+   function name because
+     * Various platforms have different functions in their libc.
+       In particular, the glibc basename(), defined in <string.h>, does
+       not consider trailing slashes to be part of the component:
+              FILENAME      RESULT
+              "foo/bar/"    ""
+              "foo/bar//"   ""
+     * The 'basename' command eliminates trailing slashes and for a root
+       produces a non-empty result:
+              FILENAME      RESULT
+              "foo/bar/"    "bar"
+              "foo/bar//"   "bar"
+              "/"           "/"
+              "//"          "/"
+ */
+extern char *last_component (char const *filename) _GL_ATTRIBUTE_PURE;
+
+/* Return the length of the basename FILENAME.
+   Typically FILENAME is the value returned by base_name or last_component.
+   Act like strlen (FILENAME), except omit all trailing slashes.  */
+extern size_t base_len (char const *filename) _GL_ATTRIBUTE_PURE;
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* _BASENAME_LGPL_H */
diff --git a/lib/basename.c b/lib/basename.c
index 1b6e0ea..1181134 100644
--- a/lib/basename.c
+++ b/lib/basename.c
@@ -1,6 +1,6 @@
 /* basename.c -- return the last element in a file name
 
-   Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2019 Free Software
+   Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2021 Free Software
    Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -22,37 +22,43 @@
 
 #include <string.h>
 #include "xalloc.h"
-#include "xstrndup.h"
 
 char *
 base_name (char const *name)
 {
   char const *base = last_component (name);
-  size_t length;
-
-  /* If there is no last component, then name is a file system root or the
-     empty string.  */
-  if (! *base)
-    return xstrndup (name, base_len (name));
-
-  /* Collapse a sequence of trailing slashes into one.  */
-  length = base_len (base);
-  if (ISSLASH (base[length]))
-    length++;
-
-  /* On systems with drive letters, "a/b:c" must return "./b:c" rather
-     than "b:c" to avoid confusion with a drive letter.  On systems
-     with pure POSIX semantics, this is not an issue.  */
-  if (FILE_SYSTEM_PREFIX_LEN (base))
+  idx_t length;
+  int dotslash_len;
+  if (*base)
     {
-      char *p = xmalloc (length + 3);
+      length = base_len (base);
+
+      /* Collapse a sequence of trailing slashes into one.  */
+      length += ISSLASH (base[length]);
+
+      /* On systems with drive letters, "a/b:c" must return "./b:c" rather
+         than "b:c" to avoid confusion with a drive letter.  On systems
+         with pure POSIX semantics, this is not an issue.  */
+      dotslash_len = FILE_SYSTEM_PREFIX_LEN (base) != 0 ? 2 : 0;
+    }
+  else
+    {
+      /* There is no last component, so NAME is a file system root or
+         the empty string.  */
+      base = name;
+      length = base_len (base);
+      dotslash_len = 0;
+    }
+
+  char *p = ximalloc (dotslash_len + length + 1);
+  if (dotslash_len)
+    {
       p[0] = '.';
       p[1] = '/';
-      memcpy (p + 2, base, length);
-      p[length + 2] = '\0';
-      return p;
     }
 
   /* Finally, copy the basename.  */
-  return xstrndup (base, length);
+  memcpy (p + dotslash_len, base, length);
+  p[dotslash_len + length] = '\0';
+  return p;
 }
diff --git a/lib/binary-io.c b/lib/binary-io.c
index 77490e6..adc0ae2 100644
--- a/lib/binary-io.c
+++ b/lib/binary-io.c
@@ -1,17 +1,17 @@
 /* Binary mode I/O.
-   Copyright 2017-2019 Free Software Foundation, Inc.
+   Copyright 2017-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/binary-io.h b/lib/binary-io.h
index 8d4133b..642f08b 100644
--- a/lib/binary-io.h
+++ b/lib/binary-io.h
@@ -1,17 +1,17 @@
 /* Binary mode I/O.
-   Copyright (C) 2001, 2003, 2005, 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2003, 2005, 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _BINARY_H
@@ -47,7 +47,7 @@
   /* Use a function rather than a macro, to avoid gcc warnings
      "warning: statement with no effect".  */
 BINARY_IO_INLINE int
-__gl_setmode (int fd _GL_UNUSED, int mode _GL_UNUSED)
+__gl_setmode (_GL_UNUSED int fd, _GL_UNUSED int mode)
 {
   return O_BINARY;
 }
@@ -56,7 +56,7 @@
 /* Set FD's mode to MODE, which should be either O_TEXT or O_BINARY.
    Return the old mode if successful, -1 (setting errno) on failure.
    Ordinarily this function would be called 'setmode', since that is
-   its name on MS-Windows, but it is called 'set_binary_mode' here
+   its old name on MS-Windows, but it is called 'set_binary_mode' here
    to avoid colliding with a BSD function of another name.  */
 
 #if defined __DJGPP__ || defined __EMX__
diff --git a/lib/bitrotate.c b/lib/bitrotate.c
index a8f6028..e8987f2 100644
--- a/lib/bitrotate.c
+++ b/lib/bitrotate.c
@@ -1,3 +1,21 @@
+/* Rotate bits in integers.
+
+   Copyright (C) 2012-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #include <config.h>
+
 #define BITROTATE_INLINE _GL_EXTERN_INLINE
 #include "bitrotate.h"
diff --git a/lib/bitrotate.h b/lib/bitrotate.h
index 04b9083..ceb734a 100644
--- a/lib/bitrotate.h
+++ b/lib/bitrotate.h
@@ -1,17 +1,17 @@
 /* bitrotate.h - Rotate bits in integers
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Simon Josefsson <simon@josefsson.org>, 2008. */
diff --git a/lib/bitset.c b/lib/bitset.c
index c3fe923..7725828 100644
--- a/lib/bitset.c
+++ b/lib/bitset.c
@@ -1,6 +1,6 @@
 /* General bitsets.
 
-   Copyright (C) 2002-2006, 2009-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002-2006, 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
 
@@ -94,7 +94,7 @@
    specified by ATTR.  For variable size bitsets, N_BITS is only a
    hint and may be zero.  */
 enum bitset_type
-bitset_type_choose (bitset_bindex n_bits ATTRIBUTE_UNUSED, unsigned attr)
+bitset_type_choose (MAYBE_UNUSED bitset_bindex n_bits, unsigned attr)
 {
   /* Check attributes.  */
   if (attr & BITSET_FIXED && attr & BITSET_VARIABLE)
@@ -207,8 +207,6 @@
 }
 
 
-/* Find next bit set in SRC starting from and including BITNO.
-   Return BITSET_BINDEX_MAX if SRC empty.  */
 bitset_bindex
 bitset_next (bitset src, bitset_bindex bitno)
 {
@@ -228,8 +226,6 @@
 }
 
 
-/* Find previous bit set in SRC starting from and including BITNO.
-   Return BITSET_BINDEX_MAX if SRC empty.  */
 bitset_bindex
 bitset_prev (bitset src, bitset_bindex bitno)
 {
@@ -275,7 +271,8 @@
 bitset_print (FILE *file, bitset bset, bool verbose)
 {
   if (verbose)
-    fprintf (file, "n_bits = %lu, set = {",
+    fprintf (file, "%s{n_bits = %lu, set = {",
+             bitset_type_name_get (bset),
              (unsigned long) bitset_size (bset));
 
   unsigned pos = 30;
@@ -294,7 +291,7 @@
   }
 
   if (verbose)
-    fprintf (file, "}\n");
+    fprintf (file, "}}\n");
 }
 
 
diff --git a/lib/bitset.h b/lib/bitset.h
index ea04916..abbfdd1 100644
--- a/lib/bitset.h
+++ b/lib/bitset.h
@@ -1,6 +1,6 @@
 /* Generic bitsets.
 
-   Copyright (C) 2002-2004, 2009-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002-2004, 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
 
@@ -96,6 +96,9 @@
 } bitset_iterator;
 
 
+/* Free bitset.  Do nothing if NULL.  */
+void bitset_free (bitset);
+
 /* Return bytes required for bitset of desired type and size.  */
 size_t bitset_bytes (enum bitset_type, bitset_bindex);
 
@@ -107,21 +110,21 @@
 enum bitset_type bitset_type_choose (bitset_bindex, bitset_attrs);
 
 /* Create a bitset of desired type and size.  The bitset is zeroed.  */
-bitset bitset_alloc (bitset_bindex, enum bitset_type);
-
-/* Free bitset.  Do nothing if NULL.  */
-void bitset_free (bitset);
-
-/* Create a bitset of desired type and size using an obstack.  The
-   bitset is zeroed.  */
-bitset bitset_obstack_alloc (struct obstack *bobstack,
-                             bitset_bindex, enum bitset_type);
+bitset bitset_alloc (bitset_bindex, enum bitset_type)
+  _GL_ATTRIBUTE_DEALLOC (bitset_free, 1);
 
 /* Free bitset allocated on obstack.  Do nothing if NULL.  */
 void bitset_obstack_free (bitset);
 
+/* Create a bitset of desired type and size using an obstack.  The
+   bitset is zeroed.  */
+bitset bitset_obstack_alloc (struct obstack *bobstack,
+                             bitset_bindex, enum bitset_type)
+  _GL_ATTRIBUTE_DEALLOC (bitset_obstack_free, 1);
+
 /* Create a bitset of desired size and attributes.  The bitset is zeroed.  */
-bitset bitset_create (bitset_bindex, bitset_attrs);
+bitset bitset_create (bitset_bindex, bitset_attrs)
+  _GL_ATTRIBUTE_DEALLOC (bitset_free, 1);
 
 /* Return bitset type.  */
 enum bitset_type bitset_type_get (bitset);
@@ -282,17 +285,21 @@
 /* Return true if both bitsets are of the same type and size.  */
 bool bitset_compatible_p (bitset bset1, bitset bset2);
 
-/* Find next set bit from the given bit index.  */
-bitset_bindex bitset_next (bitset, bitset_bindex);
+/* Find next bit set in SRC starting from and including BITNO.
+   Return BITSET_BINDEX_MAX if SRC empty.  */
+bitset_bindex bitset_next (bitset src, bitset_bindex bitno);
 
-/* Find previous set bit from the given bit index.  */
-bitset_bindex bitset_prev (bitset, bitset_bindex);
+/* Find previous bit set in SRC starting from and including BITNO.
+   Return BITSET_BINDEX_MAX if SRC empty.  */
+bitset_bindex bitset_prev (bitset src, bitset_bindex bitno);
 
-/* Find first set bit.  */
-bitset_bindex bitset_first (bitset);
+/* Find first set bit.
+   Return BITSET_BINDEX_MAX if SRC empty.  */
+bitset_bindex bitset_first (bitset src);
 
-/* Find last set bit.  */
-bitset_bindex bitset_last (bitset);
+/* Find last set bit.
+   Return BITSET_BINDEX_MAX if SRC empty.  */
+bitset_bindex bitset_last (bitset src);
 
 /* Return nonzero if this is the only set bit.  */
 bool bitset_only_set_p (bitset, bitset_bindex);
diff --git a/lib/bitset/array.c b/lib/bitset/array.c
index d46a73c..a984ede 100644
--- a/lib/bitset/array.c
+++ b/lib/bitset/array.c
@@ -1,6 +1,6 @@
 /* Array bitsets.
 
-   Copyright (C) 2002-2003, 2006, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2002-2003, 2006, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
@@ -42,7 +42,7 @@
   return size;
 }
 
-/* Find list of up to NUM bits set in BSET starting from and including
+/* Find list of up to NUM bits set in SRC starting from and including
    *NEXT and store in array LIST.  Return with actual number of bits
    found and with *NEXT indicating where search stopped.  */
 static bitset_bindex
@@ -62,44 +62,29 @@
 
   word >>= bitno;
 
-  /* If num is 1, we could speed things up with a binary search
-     of the word of interest.  */
-
-  bitset_bindex count;
+  bitset_bindex count = 0;
+  /* Is there enough room to avoid checking in each iteration? */
   if (num >= BITSET_WORD_BITS)
-    {
-      for (count = 0; word; bitno++)
-        {
-          if (word & 1)
-            list[count++] = bitno;
-          word >>= 1;
-        }
-    }
+    BITSET_FOR_EACH_BIT (pos, word)
+      list[count++] = bitno + pos;
   else
-    {
-      for (count = 0; word; bitno++)
-        {
-          if (word & 1)
-            {
-              list[count++] = bitno;
-              if (count >= num)
-                {
-                  bitno++;
-                  break;
-                }
-            }
-          word >>= 1;
-        }
-    }
-
-  *next = bitno;
+    BITSET_FOR_EACH_BIT (pos, word)
+      {
+        list[count++] = bitno + pos;
+        if (count >= num)
+          {
+            *next = bitno + pos + 1;
+            return count;
+          }
+      }
+  *next = bitno + BITSET_WORD_BITS;
   return count;
 }
 
 
 /* Set bit BITNO in bitset DST.  */
 static void
-abitset_set (bitset dst ATTRIBUTE_UNUSED, bitset_bindex bitno ATTRIBUTE_UNUSED)
+abitset_set (MAYBE_UNUSED bitset dst, MAYBE_UNUSED bitset_bindex bitno)
 {
   /* This should never occur for abitsets since we should always hit
      the cache.  It is likely someone is trying to access outside the
@@ -110,8 +95,8 @@
 
 /* Reset bit BITNO in bitset DST.  */
 static void
-abitset_reset (bitset dst ATTRIBUTE_UNUSED,
-               bitset_bindex bitno ATTRIBUTE_UNUSED)
+abitset_reset (MAYBE_UNUSED bitset dst,
+               MAYBE_UNUSED bitset_bindex bitno)
 {
   /* This should never occur for abitsets since we should always hit
      the cache.  It is likely someone is trying to access outside the
@@ -121,8 +106,8 @@
 
 /* Test bit BITNO in bitset SRC.  */
 static bool
-abitset_test (bitset src ATTRIBUTE_UNUSED,
-              bitset_bindex bitno ATTRIBUTE_UNUSED)
+abitset_test (MAYBE_UNUSED bitset src,
+              MAYBE_UNUSED bitset_bindex bitno)
 {
   /* This should never occur for abitsets since we should always
      hit the cache.  */
@@ -130,7 +115,7 @@
 }
 
 
-/* Find list of up to NUM bits set in BSET in reverse order, starting
+/* Find list of up to NUM bits set in SRC in reverse order, starting
    from and including NEXT and store in array LIST.  Return with
    actual number of bits found and with *NEXT indicating where search
    stopped.  */
@@ -158,19 +143,18 @@
 
   do
     {
-      bitset_word word = srcp[windex] << (BITSET_WORD_BITS - 1 - bitcnt);
-      for (; word; bitcnt--)
+      bitset_word word = srcp[windex];
+      if (bitcnt + 1 < BITSET_WORD_BITS)
+        /* We're starting in the middle of a word: smash bits to ignore.  */
+        word &= ((bitset_word) 1 << (bitcnt + 1)) - 1;
+      BITSET_FOR_EACH_BIT_REVERSE(pos, word)
         {
-          if (word & BITSET_MSB)
+          list[count++] = bitoff + pos;
+          if (count >= num)
             {
-              list[count++] = bitoff + bitcnt;
-              if (count >= num)
-                {
-                  *next = n_bits - (bitoff + bitcnt);
-                  return count;
-                }
+              *next = n_bits - (bitoff + pos);
+              return count;
             }
-          word <<= 1;
         }
       bitoff -= BITSET_WORD_BITS;
       bitcnt = BITSET_WORD_BITS - 1;
@@ -182,7 +166,7 @@
 }
 
 
-/* Find list of up to NUM bits set in BSET starting from and including
+/* Find list of up to NUM bits set in SRC starting from and including
    *NEXT and store in array LIST.  Return with actual number of bits
    found and with *NEXT indicating where search stopped.  */
 static bitset_bindex
@@ -205,9 +189,6 @@
       if (windex >= size)
         return 0;
 
-      /* If num is 1, we could speed things up with a binary search
-         of the current word.  */
-
       bitoff = windex * BITSET_WORD_BITS;
     }
   else
@@ -227,18 +208,15 @@
 
           bitoff = windex * BITSET_WORD_BITS;
           bitset_word word = srcp[windex] >> bitno;
-          for (bitno = bitoff + bitno; word; bitno++)
+          bitno = bitoff + bitno;
+          BITSET_FOR_EACH_BIT (pos, word)
             {
-              if (word & 1)
+              list[count++] = bitno + pos;
+              if (count >= num)
                 {
-                  list[count++] = bitno;
-                  if (count >= num)
-                    {
-                      *next = bitno + 1;
-                      return count;
-                    }
+                  *next = bitno + pos + 1;
+                  return count;
                 }
-              word >>= 1;
             }
           windex++;
         }
@@ -251,31 +229,20 @@
       if (!word)
         continue;
 
+      /* Is there enough room to avoid checking in each iteration? */
       if ((count + BITSET_WORD_BITS) < num)
-        {
-          for (bitno = bitoff; word; bitno++)
-            {
-              if (word & 1)
-                list[count++] = bitno;
-              word >>= 1;
-            }
-        }
+        BITSET_FOR_EACH_BIT (pos, word)
+          list[count++] = bitoff + pos;
       else
-        {
-          for (bitno = bitoff; word; bitno++)
-            {
-              if (word & 1)
-                {
-                  list[count++] = bitno;
-                  if (count >= num)
-                    {
-                      *next = bitno + 1;
-                      return count;
-                    }
-                }
-              word >>= 1;
-            }
-        }
+        BITSET_FOR_EACH_BIT (pos, word)
+          {
+            list[count++] = bitoff + pos;
+            if (count >= num)
+              {
+                *next = bitoff + pos + 1;
+                return count;
+              }
+          }
     }
 
   *next = bitoff;
diff --git a/lib/bitset/array.h b/lib/bitset/array.h
index 5842387..0d31e37 100644
--- a/lib/bitset/array.h
+++ b/lib/bitset/array.h
@@ -1,6 +1,6 @@
 /* Functions to support abitsets.
 
-   Copyright (C) 2002, 2004, 2009-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 2002, 2004, 2009-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
diff --git a/lib/bitset/base.h b/lib/bitset/base.h
index d1a1581..6f202e2 100644
--- a/lib/bitset/base.h
+++ b/lib/bitset/base.h
@@ -1,6 +1,6 @@
 /* Base bitset stuff.
 
-   Copyright (C) 2002-2004, 2006, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2002-2004, 2006, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
@@ -24,17 +24,13 @@
 #include <limits.h>
 #include <stdbool.h>
 #include <stddef.h>
+#include <stdlib.h>     /* because Gnulib's <stdlib.h> may '#define free ...' */
+#include <string.h> /* ffsl */
 
+#include "attribute.h"
+#include "integer_length.h"
 #include "xalloc.h"
 
-#ifndef __attribute__
-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
-#  define __attribute__(x)
-# endif
-#endif
-
-#define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
-
 /* Currently we support five flavours of bitsets:
    BITSET_ARRAY:  Array of bits (fixed size, fast for dense bitsets).
                   Memory for bit array and bitset structure allocated
@@ -284,6 +280,21 @@
 #define BITSET_LIST_REVERSE_(BSET, LIST, NUM, NEXT) \
  (BSET)->b.vtable->list_reverse (BSET, LIST, NUM, NEXT)
 
+/* Iterate left to right over each set bit of WORD.
+   Each iteration sets POS to the 0-based index of the next set bit in WORD.
+   Repeatedly resets bits in WORD in place until it's null.  */
+#define BITSET_FOR_EACH_BIT(Pos, Word)                  \
+  for (int Pos = bitset_ffs_ (Word);                    \
+       0 <= Pos;                                        \
+       Word ^= 1UL << Pos, Pos = bitset_ffs_ (Word))
+
+/* Iterate right to left over each set bit of WORD.
+   Each iteration sets POS to the 0-based index of the next set bit in WORD.
+   Repeatedly resets bits in WORD in place until it's null.  */
+#define BITSET_FOR_EACH_BIT_REVERSE(Pos, Word)          \
+  for (int Pos = bitset_fls_ (Word);                    \
+       0 <= Pos;                                        \
+       Word ^= 1UL << Pos, Pos = bitset_fls_ (Word))
 
 /* Private functions for bitset implementations.  */
 
@@ -307,4 +318,20 @@
 
 bool bitset_or_and_cmp_ (bitset, bitset, bitset, bitset);
 
+/* First set bit in WORD.
+   Indexes start at 0, return -1 if WORD is null. */
+static inline
+int bitset_ffs_ (bitset_word word)
+{
+  return ffsl ((long) word) - 1;
+}
+
+/* Last set bit in WORD.
+   Indexes start at 0, return -1 if WORD is null. */
+static inline
+int bitset_fls_ (bitset_word word)
+{
+  return integer_length_l (word) - 1;
+}
+
 #endif /* _BBITSET_H  */
diff --git a/lib/bitset/list.c b/lib/bitset/list.c
index 1a23fed..6e8724d 100644
--- a/lib/bitset/list.c
+++ b/lib/bitset/list.c
@@ -1,6 +1,6 @@
 /* Functions to support link list bitsets.
 
-   Copyright (C) 2002-2004, 2006, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2002-2004, 2006, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
@@ -122,7 +122,7 @@
 # define OBSTACK_CHUNK_FREE free
 #endif
 
-#if ! defined __GNUC__ || __GNUC__ < 2
+#if !(defined __GNUC__ || defined __clang__)
 # define __alignof__(type) 0
 #endif
 
@@ -428,7 +428,7 @@
 
 /* Copy bits from bitset SRC to bitset DST.  */
 static inline void
-lbitset_copy (bitset dst, bitset src)
+lbitset_copy_ (bitset dst, bitset src)
 {
   if (src == dst)
     return;
@@ -463,6 +463,15 @@
 }
 
 
+static void
+lbitset_copy (bitset dst, bitset src)
+{
+  if (BITSET_COMPATIBLE_ (dst, src))
+    lbitset_copy_ (dst, src);
+  else
+    bitset_copy_ (dst, src);
+}
+
 /* Copy bits from bitset SRC to bitset DST.  Return true if
    bitsets different.  */
 static inline bool
@@ -571,21 +580,21 @@
   if (!elt)
     return 0;
 
-  unsigned bcount;
+  unsigned bitcnt;
   if (windex >= elt->index + LBITSET_ELT_WORDS)
     {
       /* We are trying to start in no-mans land so start
          at end of current elt.  */
-      bcount = BITSET_WORD_BITS - 1;
+      bitcnt = BITSET_WORD_BITS - 1;
       windex = elt->index + LBITSET_ELT_WORDS - 1;
     }
   else
     {
-      bcount = bitno % BITSET_WORD_BITS;
+      bitcnt = bitno % BITSET_WORD_BITS;
     }
 
   bitset_bindex count = 0;
-  bitset_bindex boffset = windex * BITSET_WORD_BITS;
+  bitset_bindex bitoff = windex * BITSET_WORD_BITS;
 
   /* If num is 1, we could speed things up with a binary search
      of the word of interest.  */
@@ -595,36 +604,34 @@
       bitset_word *srcp = elt->words;
 
       for (; (windex - elt->index) < LBITSET_ELT_WORDS;
-           windex--, boffset -= BITSET_WORD_BITS,
-             bcount = BITSET_WORD_BITS - 1)
+           windex--)
         {
-          bitset_word word =
-            srcp[windex - elt->index] << (BITSET_WORD_BITS - 1 - bcount);
-
-          for (; word; bcount--)
+          bitset_word word = srcp[windex - elt->index];
+          if (bitcnt + 1 < BITSET_WORD_BITS)
+            /* We're starting in the middle of a word: smash bits to ignore.  */
+            word &= ((bitset_word) 1 << (bitcnt + 1)) - 1;
+          BITSET_FOR_EACH_BIT_REVERSE(pos, word)
             {
-              if (word & BITSET_MSB)
+              list[count++] = bitoff + pos;
+              if (count >= num)
                 {
-                  list[count++] = boffset + bcount;
-                  if (count >= num)
-                    {
-                      *next = n_bits - (boffset + bcount);
-                      return count;
-                    }
+                  *next = n_bits - (bitoff + pos);
+                  return count;
                 }
-              word <<= 1;
             }
+          bitoff -= BITSET_WORD_BITS;
+          bitcnt = BITSET_WORD_BITS - 1;
         }
 
       elt = elt->prev;
       if (elt)
         {
           windex = elt->index + LBITSET_ELT_WORDS - 1;
-          boffset = windex * BITSET_WORD_BITS;
+          bitoff = windex * BITSET_WORD_BITS;
         }
     }
 
-  *next = n_bits - (boffset + 1);
+  *next = n_bits - (bitoff + 1);
   return count;
 }
 
@@ -682,19 +689,14 @@
           for (; (windex - elt->index) < LBITSET_ELT_WORDS; windex++)
             {
               bitset_word word = srcp[windex - elt->index] >> (bitno % BITSET_WORD_BITS);
-
-              for (; word; bitno++)
+              BITSET_FOR_EACH_BIT (pos, word)
                 {
-                  if (word & 1)
+                  list[count++] = bitno + pos;
+                  if (count >= num)
                     {
-                      list[count++] = bitno;
-                      if (count >= num)
-                        {
-                          *next = bitno + 1;
-                          return count;
-                        }
+                      *next = bitno + pos + 1;
+                      return count;
                     }
-                  word >>= 1;
                 }
               bitno = (windex + 1) * BITSET_WORD_BITS;
             }
@@ -708,14 +710,11 @@
         }
     }
 
-
-  /* If num is 1, we could speed things up with a binary search
-     of the word of interest.  */
-
   while (elt)
     {
       bitset_word *srcp = elt->words;
 
+      /* Is there enough room to avoid checking in each iteration? */
       if ((count + LBITSET_ELT_BITS) < num)
         {
           /* The coast is clear, plant boot!  */
@@ -723,42 +722,15 @@
 #if LBITSET_ELT_WORDS == 2
           bitset_word word = srcp[0];
           if (word)
-            {
-              if (!(word & 0xffff))
-                {
-                  word >>= 16;
-                  bitno += 16;
-                }
-              if (!(word & 0xff))
-                {
-                  word >>= 8;
-                  bitno += 8;
-                }
-              for (; word; bitno++)
-                {
-                  if (word & 1)
-                    list[count++] = bitno;
-                  word >>= 1;
-                }
-            }
+            BITSET_FOR_EACH_BIT (pos, word)
+              list[count++] = bitno + pos;
           windex++;
           bitno = windex * BITSET_WORD_BITS;
 
           word = srcp[1];
           if (word)
-            {
-              if (!(word & 0xffff))
-                {
-                  word >>= 16;
-                  bitno += 16;
-                }
-              for (; word; bitno++)
-                {
-                  if (word & 1)
-                    list[count++] = bitno;
-                  word >>= 1;
-                }
-            }
+            BITSET_FOR_EACH_BIT (pos, word)
+              list[count++] = bitno + pos;
           windex++;
           bitno = windex * BITSET_WORD_BITS;
 #else
@@ -766,24 +738,8 @@
             {
               bitset_word word = srcp[i];
               if (word)
-                {
-                  if (!(word & 0xffff))
-                    {
-                      word >>= 16;
-                      bitno += 16;
-                    }
-                  if (!(word & 0xff))
-                    {
-                      word >>= 8;
-                      bitno += 8;
-                    }
-                  for (; word; bitno++)
-                    {
-                      if (word & 1)
-                        list[count++] = bitno;
-                      word >>= 1;
-                    }
-                }
+                BITSET_FOR_EACH_BIT (pos, word)
+                  list[count++] = bitno + pos;
               windex++;
               bitno = windex * BITSET_WORD_BITS;
             }
@@ -793,22 +749,19 @@
         {
           /* Tread more carefully since we need to check
              if array overflows.  */
-
           for (int i = 0; i < LBITSET_ELT_WORDS; i++)
             {
-              for (bitset_word word = srcp[i]; word; bitno++)
-                {
-                  if (word & 1)
-                    {
-                      list[count++] = bitno;
-                      if (count >= num)
-                        {
-                          *next = bitno + 1;
-                          return count;
-                        }
-                    }
-                  word >>= 1;
-                }
+              bitset_word word = srcp[i];
+              if (word)
+                BITSET_FOR_EACH_BIT (pos, word)
+                  {
+                    list[count++] = bitno + pos;
+                    if (count >= num)
+                      {
+                        *next = bitno + pos + 1;
+                        return count;
+                      }
+                  }
               windex++;
               bitno = windex * BITSET_WORD_BITS;
             }
@@ -1276,7 +1229,7 @@
 
 /* Return size of initial structure.  */
 size_t
-lbitset_bytes (bitset_bindex n_bits ATTRIBUTE_UNUSED)
+lbitset_bytes (MAYBE_UNUSED bitset_bindex n_bits)
 {
   return sizeof (struct lbitset_struct);
 }
@@ -1284,7 +1237,7 @@
 
 /* Initialize a bitset.  */
 bitset
-lbitset_init (bitset bset, bitset_bindex n_bits ATTRIBUTE_UNUSED)
+lbitset_init (bitset bset, MAYBE_UNUSED bitset_bindex n_bits)
 {
   BITSET_NBITS_ (bset) = n_bits;
   bset->b.vtable = &lbitset_vtable;
diff --git a/lib/bitset/list.h b/lib/bitset/list.h
index b87e6f2..349ba94 100644
--- a/lib/bitset/list.h
+++ b/lib/bitset/list.h
@@ -1,6 +1,6 @@
 /* Functions to support lbitsets.
 
-   Copyright (C) 2002, 2004, 2009-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 2002, 2004, 2009-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
diff --git a/lib/bitset/stats.c b/lib/bitset/stats.c
index 45d67ee..f998b2b 100644
--- a/lib/bitset/stats.c
+++ b/lib/bitset/stats.c
@@ -1,6 +1,6 @@
 /* Bitset statistics.
 
-   Copyright (C) 2002-2006, 2009-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002-2006, 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
 
@@ -154,13 +154,19 @@
       fprintf (file, "%*d\t%8u (%5.1f%%)\n",
                max_width, i, bins[i], 100.0 * bins[i] / total);
 
-    for (; i < n_bins; i++)
+    for (; i < n_bins - 1; i++)
       fprintf (file, "%*lu-%lu\t%8u (%5.1f%%)\n",
                max_width - ((unsigned) (0.30103 * (i) + 0.9999) + 1),
                1UL << (i - 1),
                (1UL << i) - 1,
                bins[i],
                (100.0 * bins[i]) / total);
+
+    fprintf (file, "%*lu-...\t%8u (%5.1f%%)\n",
+             max_width - ((unsigned) (0.30103 * (i) + 0.9999) + 1),
+             1UL << (i - 1),
+             bins[i],
+             (100.0 * bins[i]) / total);
   }
 }
 
@@ -202,7 +208,7 @@
 
 /* Print all bitset statistics to FILE.  */
 static void
-bitset_stats_print (FILE *file, bool verbose ATTRIBUTE_UNUSED)
+bitset_stats_print (FILE *file, MAYBE_UNUSED bool verbose)
 {
   if (!bitset_stats_info)
     return;
@@ -245,7 +251,7 @@
   if (!file_name)
     file_name = BITSET_STATS_FILE;
 
-  FILE *file = fopen (file_name, "r");
+  FILE *file = fopen (file_name, "re");
   if (file)
     {
       if (fread (&bitset_stats_info_data, sizeof (bitset_stats_info_data),
@@ -273,7 +279,7 @@
   if (!file_name)
     file_name = BITSET_STATS_FILE;
 
-  FILE *file = fopen (file_name, "w");
+  FILE *file = fopen (file_name, "we");
   if (file)
     {
       if (fwrite (&bitset_stats_info_data, sizeof (bitset_stats_info_data),
diff --git a/lib/bitset/stats.h b/lib/bitset/stats.h
index f578045..2b868aa 100644
--- a/lib/bitset/stats.h
+++ b/lib/bitset/stats.h
@@ -1,6 +1,6 @@
 /* Functions to support bitset statistics.
 
-   Copyright (C) 2002-2004, 2009-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002-2004, 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
 
diff --git a/lib/bitset/table.c b/lib/bitset/table.c
index 9142aa5..b74c8c1 100644
--- a/lib/bitset/table.c
+++ b/lib/bitset/table.c
@@ -1,6 +1,6 @@
 /* Functions to support expandable bitsets.
 
-   Copyright (C) 2002-2006, 2009-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002-2006, 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
 
@@ -49,18 +49,18 @@
 
 
 /* Number of words to use for each element.  */
-#define EBITSET_ELT_WORDS 2
+#define TBITSET_ELT_WORDS 2
 
 /* Number of bits stored in each element.  */
-#define EBITSET_ELT_BITS \
-  ((unsigned) (EBITSET_ELT_WORDS * BITSET_WORD_BITS))
+#define TBITSET_ELT_BITS \
+  ((unsigned) (TBITSET_ELT_WORDS * BITSET_WORD_BITS))
 
-/* Ebitset element.  We use an array of bits.  */
+/* Tbitset element.  We use an array of bits.  */
 typedef struct tbitset_elt_struct
 {
   union
   {
-    bitset_word words[EBITSET_ELT_WORDS];       /* Bits that are set.  */
+    bitset_word words[TBITSET_ELT_WORDS];       /* Bits that are set.  */
     struct tbitset_elt_struct *next;
   }
   u;
@@ -73,13 +73,13 @@
 
 /* Number of elements to initially allocate.  */
 
-#ifndef EBITSET_INITIAL_SIZE
-# define EBITSET_INITIAL_SIZE 2
+#ifndef TBITSET_INITIAL_SIZE
+# define TBITSET_INITIAL_SIZE 2
 #endif
 
 
 enum tbitset_find_mode
-  { EBITSET_FIND, EBITSET_CREATE, EBITSET_SUBST };
+  { TBITSET_FIND, TBITSET_CREATE, TBITSET_SUBST };
 
 static tbitset_elt tbitset_zero_elts[1]; /* Elements of all zero bits.  */
 
@@ -88,33 +88,33 @@
 static bool tbitset_obstack_init = false;
 static tbitset_elt *tbitset_free_list;  /* Free list of bitset elements.  */
 
-#define EBITSET_N_ELTS(N) (((N) + EBITSET_ELT_BITS - 1) / EBITSET_ELT_BITS)
-#define EBITSET_ELTS(BSET) ((BSET)->e.elts)
-#define EBITSET_SIZE(BSET) EBITSET_N_ELTS (BITSET_NBITS_ (BSET))
-#define EBITSET_ASIZE(BSET) ((BSET)->e.size)
+#define TBITSET_N_ELTS(N) (((N) + TBITSET_ELT_BITS - 1) / TBITSET_ELT_BITS)
+#define TBITSET_ELTS(BSET) ((BSET)->e.elts)
+#define TBITSET_SIZE(BSET) TBITSET_N_ELTS (BITSET_NBITS_ (BSET))
+#define TBITSET_ASIZE(BSET) ((BSET)->e.size)
 
-#define EBITSET_NEXT(ELT) ((ELT)->u.next)
-#define EBITSET_WORDS(ELT) ((ELT)->u.words)
+#define TBITSET_NEXT(ELT) ((ELT)->u.next)
+#define TBITSET_WORDS(ELT) ((ELT)->u.words)
 
 /* Disable bitset cache and mark BSET as being zero.  */
-#define EBITSET_ZERO_SET(BSET) ((BSET)->b.cindex = BITSET_WINDEX_MAX, \
+#define TBITSET_ZERO_SET(BSET) ((BSET)->b.cindex = BITSET_WINDEX_MAX, \
         (BSET)->b.cdata = 0)
 
-#define EBITSET_CACHE_DISABLE(BSET)  ((BSET)->b.cindex = BITSET_WINDEX_MAX)
+#define TBITSET_CACHE_DISABLE(BSET)  ((BSET)->b.cindex = BITSET_WINDEX_MAX)
 
 /* Disable bitset cache and mark BSET as being possibly non-zero.  */
-#define EBITSET_NONZERO_SET(BSET) \
- (EBITSET_CACHE_DISABLE (BSET), (BSET)->b.cdata = (bitset_word *)~0)
+#define TBITSET_NONZERO_SET(BSET) \
+ (TBITSET_CACHE_DISABLE (BSET), (BSET)->b.cdata = (bitset_word *)~0)
 
 /* A conservative estimate of whether the bitset is zero.
    This is non-zero only if we know for sure that the bitset is zero.  */
-#define EBITSET_ZERO_P(BSET) ((BSET)->b.cdata == 0)
+#define TBITSET_ZERO_P(BSET) ((BSET)->b.cdata == 0)
 
 /* Enable cache to point to element with table index EINDEX.
    The element must exist.  */
-#define EBITSET_CACHE_SET(BSET, EINDEX) \
- ((BSET)->b.cindex = (EINDEX) * EBITSET_ELT_WORDS, \
-  (BSET)->b.cdata = EBITSET_WORDS (EBITSET_ELTS (BSET) [EINDEX]))
+#define TBITSET_CACHE_SET(BSET, EINDEX) \
+ ((BSET)->b.cindex = (EINDEX) * TBITSET_ELT_WORDS, \
+  (BSET)->b.cdata = TBITSET_WORDS (TBITSET_ELTS (BSET) [EINDEX]))
 
 #undef min
 #undef max
@@ -127,14 +127,14 @@
   if (n_bits == BITSET_NBITS_ (src))
     return n_bits;
 
-  bitset_windex oldsize = EBITSET_SIZE (src);
-  bitset_windex newsize = EBITSET_N_ELTS (n_bits);
+  bitset_windex oldsize = TBITSET_SIZE (src);
+  bitset_windex newsize = TBITSET_N_ELTS (n_bits);
 
   if (oldsize < newsize)
     {
       /* The bitset needs to grow.  If we already have enough memory
          allocated, then just zero what we need.  */
-      if (newsize > EBITSET_ASIZE (src))
+      if (newsize > TBITSET_ASIZE (src))
         {
           /* We need to allocate more memory.  When oldsize is
              non-zero this means that we are changing the size, so
@@ -142,12 +142,12 @@
              number of reallocations.  */
 
           bitset_windex size = oldsize == 0 ? newsize : newsize + newsize / 4;
-          EBITSET_ELTS (src)
-            = xrealloc (EBITSET_ELTS (src), size * sizeof (tbitset_elt *));
-          EBITSET_ASIZE (src) = size;
+          TBITSET_ELTS (src)
+            = xrealloc (TBITSET_ELTS (src), size * sizeof (tbitset_elt *));
+          TBITSET_ASIZE (src) = size;
         }
 
-      memset (EBITSET_ELTS (src) + oldsize, 0,
+      memset (TBITSET_ELTS (src) + oldsize, 0,
               (newsize - oldsize) * sizeof (tbitset_elt *));
     }
   else
@@ -157,11 +157,11 @@
       if ((oldsize - newsize) >= oldsize / 2)
         {
           void *p
-            = realloc (EBITSET_ELTS (src), newsize * sizeof (tbitset_elt *));
+            = realloc (TBITSET_ELTS (src), newsize * sizeof (tbitset_elt *));
           if (p)
             {
-              EBITSET_ELTS (src) = p;
-              EBITSET_ASIZE (src) = newsize;
+              TBITSET_ELTS (src) = p;
+              TBITSET_ASIZE (src) = newsize;
             }
         }
 
@@ -182,7 +182,7 @@
   if (tbitset_free_list != 0)
     {
       elt = tbitset_free_list;
-      tbitset_free_list = EBITSET_NEXT (elt);
+      tbitset_free_list = TBITSET_NEXT (elt);
     }
   else
     {
@@ -206,7 +206,7 @@
 # define OBSTACK_CHUNK_FREE free
 #endif
 
-#if ! defined __GNUC__ || __GNUC__ < 2
+#if !(defined __GNUC__ || defined __clang__)
 # define __alignof__(type) 0
 #endif
 
@@ -231,7 +231,7 @@
 tbitset_elt_calloc (void)
 {
   tbitset_elt *elt = tbitset_elt_alloc ();
-  memset (EBITSET_WORDS (elt), 0, sizeof (EBITSET_WORDS (elt)));
+  memset (TBITSET_WORDS (elt), 0, sizeof (TBITSET_WORDS (elt)));
   return elt;
 }
 
@@ -239,7 +239,7 @@
 static inline void
 tbitset_elt_free (tbitset_elt *elt)
 {
-  EBITSET_NEXT (elt) = tbitset_free_list;
+  TBITSET_NEXT (elt) = tbitset_free_list;
   tbitset_free_list = elt;
 }
 
@@ -248,7 +248,7 @@
 static inline void
 tbitset_elt_remove (bitset bset, bitset_windex eindex)
 {
-  tbitset_elts *elts = EBITSET_ELTS (bset);
+  tbitset_elts *elts = TBITSET_ELTS (bset);
   tbitset_elt *elt = elts[eindex];
 
   elts[eindex] = 0;
@@ -260,7 +260,7 @@
 static inline void
 tbitset_elt_add (bitset bset, tbitset_elt *elt, bitset_windex eindex)
 {
-  tbitset_elts *elts = EBITSET_ELTS (bset);
+  tbitset_elts *elts = TBITSET_ELTS (bset);
   /* Assume that the elts entry not allocated.  */
   elts[eindex] = elt;
 }
@@ -270,8 +270,8 @@
 static inline bool
 tbitset_elt_zero_p (tbitset_elt *elt)
 {
-  for (int i = 0; i < EBITSET_ELT_WORDS; i++)
-    if (EBITSET_WORDS (elt)[i])
+  for (int i = 0; i < TBITSET_ELT_WORDS; i++)
+    if (TBITSET_WORDS (elt)[i])
       return false;
   return true;
 }
@@ -281,18 +281,18 @@
 tbitset_elt_find (bitset bset, bitset_bindex bindex,
                   enum tbitset_find_mode mode)
 {
-  bitset_windex eindex = bindex / EBITSET_ELT_BITS;
+  bitset_windex eindex = bindex / TBITSET_ELT_BITS;
 
-  tbitset_elts *elts = EBITSET_ELTS (bset);
-  bitset_windex size = EBITSET_SIZE (bset);
+  tbitset_elts *elts = TBITSET_ELTS (bset);
+  bitset_windex size = TBITSET_SIZE (bset);
 
   if (eindex < size)
     {
       tbitset_elt *elt = elts[eindex];
       if (elt)
         {
-          if (EBITSET_WORDS (elt) != bset->b.cdata)
-            EBITSET_CACHE_SET (bset, eindex);
+          if (TBITSET_WORDS (elt) != bset->b.cdata)
+            TBITSET_CACHE_SET (bset, eindex);
           return elt;
         }
     }
@@ -304,10 +304,10 @@
     default:
       abort ();
 
-    case EBITSET_FIND:
+    case TBITSET_FIND:
       return NULL;
 
-    case EBITSET_CREATE:
+    case TBITSET_CREATE:
       if (eindex >= size)
         tbitset_resize (bset, bindex);
 
@@ -315,11 +315,11 @@
       {
         tbitset_elt *elt = tbitset_elt_calloc ();
         tbitset_elt_add (bset, elt, eindex);
-        EBITSET_CACHE_SET (bset, eindex);
+        TBITSET_CACHE_SET (bset, eindex);
         return elt;
       }
 
-    case EBITSET_SUBST:
+    case TBITSET_SUBST:
       return &tbitset_zero_elts[0];
     }
 }
@@ -329,13 +329,13 @@
 static inline bitset_windex
 tbitset_weed (bitset bset)
 {
-  if (EBITSET_ZERO_P (bset))
+  if (TBITSET_ZERO_P (bset))
     return 0;
 
-  tbitset_elts *elts = EBITSET_ELTS (bset);
+  tbitset_elts *elts = TBITSET_ELTS (bset);
   bitset_windex count = 0;
   bitset_windex j;
-  for (j = 0; j < EBITSET_SIZE (bset); j++)
+  for (j = 0; j < TBITSET_SIZE (bset); j++)
     {
       tbitset_elt *elt = elts[j];
 
@@ -356,10 +356,10 @@
     {
       /* All the bits are zero.  We could shrink the elts.
          For now just mark BSET as known to be zero.  */
-      EBITSET_ZERO_SET (bset);
+      TBITSET_ZERO_SET (bset);
     }
   else
-    EBITSET_NONZERO_SET (bset);
+    TBITSET_NONZERO_SET (bset);
 
   return count;
 }
@@ -369,11 +369,11 @@
 static inline void
 tbitset_zero (bitset bset)
 {
-  if (EBITSET_ZERO_P (bset))
+  if (TBITSET_ZERO_P (bset))
     return;
 
-  tbitset_elts *elts = EBITSET_ELTS (bset);
-  for (bitset_windex j = 0; j < EBITSET_SIZE (bset); j++)
+  tbitset_elts *elts = TBITSET_ELTS (bset);
+  for (bitset_windex j = 0; j < TBITSET_SIZE (bset); j++)
     {
       tbitset_elt *elt = elts[j];
       if (elt)
@@ -382,7 +382,7 @@
 
   /* All the bits are zero.  We could shrink the elts.
      For now just mark BSET as known to be zero.  */
-  EBITSET_ZERO_SET (bset);
+  TBITSET_ZERO_SET (bset);
 }
 
 
@@ -395,13 +395,13 @@
   tbitset_weed (dst);
   tbitset_weed (src);
 
-  if (EBITSET_SIZE (src) != EBITSET_SIZE (dst))
+  if (TBITSET_SIZE (src) != TBITSET_SIZE (dst))
     return false;
 
-  tbitset_elts *selts = EBITSET_ELTS (src);
-  tbitset_elts *delts = EBITSET_ELTS (dst);
+  tbitset_elts *selts = TBITSET_ELTS (src);
+  tbitset_elts *delts = TBITSET_ELTS (dst);
 
-  for (bitset_windex j = 0; j < EBITSET_SIZE (src); j++)
+  for (bitset_windex j = 0; j < TBITSET_SIZE (src); j++)
     {
       tbitset_elt *selt = selts[j];
       tbitset_elt *delt = delts[j];
@@ -411,8 +411,8 @@
       if ((selt && !delt) || (!selt && delt))
         return false;
 
-      for (unsigned i = 0; i < EBITSET_ELT_WORDS; i++)
-        if (EBITSET_WORDS (selt)[i] != EBITSET_WORDS (delt)[i])
+      for (unsigned i = 0; i < TBITSET_ELT_WORDS; i++)
+        if (TBITSET_WORDS (selt)[i] != TBITSET_WORDS (delt)[i])
           return false;
     }
   return true;
@@ -431,20 +431,20 @@
   if (BITSET_NBITS_ (dst) != BITSET_NBITS_ (src))
     tbitset_resize (dst, BITSET_NBITS_ (src));
 
-  tbitset_elts *selts = EBITSET_ELTS (src);
-  tbitset_elts *delts = EBITSET_ELTS (dst);
-  for (bitset_windex j = 0; j < EBITSET_SIZE (src); j++)
+  tbitset_elts *selts = TBITSET_ELTS (src);
+  tbitset_elts *delts = TBITSET_ELTS (dst);
+  for (bitset_windex j = 0; j < TBITSET_SIZE (src); j++)
     {
       tbitset_elt *selt = selts[j];
       if (selt)
         {
           tbitset_elt *tmp = tbitset_elt_alloc ();
           delts[j] = tmp;
-          memcpy (EBITSET_WORDS (tmp), EBITSET_WORDS (selt),
-                  sizeof (EBITSET_WORDS (selt)));
+          memcpy (TBITSET_WORDS (tmp), TBITSET_WORDS (selt),
+                  sizeof (TBITSET_WORDS (selt)));
         }
     }
-  EBITSET_NONZERO_SET (dst);
+  TBITSET_NONZERO_SET (dst);
 }
 
 
@@ -456,10 +456,10 @@
   if (src == dst)
     return false;
 
-  if (EBITSET_ZERO_P (dst))
+  if (TBITSET_ZERO_P (dst))
     {
       tbitset_copy_ (dst, src);
-      return !EBITSET_ZERO_P (src);
+      return !TBITSET_ZERO_P (src);
     }
 
   if (tbitset_equal_p (dst, src))
@@ -476,7 +476,7 @@
 {
   bitset_windex windex = bitno / BITSET_WORD_BITS;
 
-  tbitset_elt_find (dst, bitno, EBITSET_CREATE);
+  tbitset_elt_find (dst, bitno, TBITSET_CREATE);
 
   dst->b.cdata[windex - dst->b.cindex] |=
     (bitset_word) 1 << (bitno % BITSET_WORD_BITS);
@@ -489,7 +489,7 @@
 {
   bitset_windex windex = bitno / BITSET_WORD_BITS;
 
-  if (!tbitset_elt_find (dst, bitno, EBITSET_FIND))
+  if (!tbitset_elt_find (dst, bitno, TBITSET_FIND))
     return;
 
   dst->b.cdata[windex - dst->b.cindex] &=
@@ -507,7 +507,7 @@
 {
   bitset_windex windex = bitno / BITSET_WORD_BITS;
 
-  return (tbitset_elt_find (src, bitno, EBITSET_FIND)
+  return (tbitset_elt_find (src, bitno, TBITSET_FIND)
           && ((src->b.cdata[windex - src->b.cindex]
                >> (bitno % BITSET_WORD_BITS))
               & 1));
@@ -518,7 +518,7 @@
 tbitset_free (bitset bset)
 {
   tbitset_zero (bset);
-  free (EBITSET_ELTS (bset));
+  free (TBITSET_ELTS (bset));
 }
 
 
@@ -529,65 +529,64 @@
 tbitset_list_reverse (bitset bset, bitset_bindex *list,
                       bitset_bindex num, bitset_bindex *next)
 {
-  if (EBITSET_ZERO_P (bset))
+  if (TBITSET_ZERO_P (bset))
     return 0;
 
-  bitset_windex size = EBITSET_SIZE (bset);
-  bitset_bindex n_bits = size * EBITSET_ELT_BITS;
+  bitset_windex size = TBITSET_SIZE (bset);
+  bitset_bindex n_bits = size * TBITSET_ELT_BITS;
   bitset_bindex rbitno = *next;
 
   if (rbitno >= n_bits)
     return 0;
 
-  tbitset_elts *elts = EBITSET_ELTS (bset);
+  tbitset_elts *elts = TBITSET_ELTS (bset);
 
   bitset_bindex bitno = n_bits - (rbitno + 1);
 
   bitset_windex windex = bitno / BITSET_WORD_BITS;
-  bitset_windex eindex = bitno / EBITSET_ELT_BITS;
-  bitset_windex woffset = windex - eindex * EBITSET_ELT_WORDS;
+  bitset_windex eindex = bitno / TBITSET_ELT_BITS;
+  bitset_windex woffset = windex - eindex * TBITSET_ELT_WORDS;
 
   /* If num is 1, we could speed things up with a binary search
      of the word of interest.  */
   bitset_bindex count = 0;
-  unsigned bcount = bitno % BITSET_WORD_BITS;
-  bitset_bindex boffset = windex * BITSET_WORD_BITS;
+  unsigned bitcnt = bitno % BITSET_WORD_BITS;
+  bitset_bindex bitoff = windex * BITSET_WORD_BITS;
 
   do
     {
       tbitset_elt *elt = elts[eindex];
       if (elt)
         {
-          bitset_word *srcp = EBITSET_WORDS (elt);
+          bitset_word *srcp = TBITSET_WORDS (elt);
 
           do
             {
-              for (bitset_word word = srcp[woffset] << (BITSET_WORD_BITS - 1 - bcount);
-                   word; bcount--)
+              bitset_word word = srcp[woffset];
+              if (bitcnt + 1 < BITSET_WORD_BITS)
+                /* We're starting in the middle of a word: smash bits to ignore.  */
+                word &= ((bitset_word) 1 << (bitcnt + 1)) - 1;
+              BITSET_FOR_EACH_BIT_REVERSE(pos, word)
                 {
-                  if (word & BITSET_MSB)
+                  list[count++] = bitoff + pos;
+                  if (count >= num)
                     {
-                      list[count++] = boffset + bcount;
-                      if (count >= num)
-                        {
-                          *next = n_bits - (boffset + bcount);
-                          return count;
-                        }
+                      *next = n_bits - (bitoff + pos);
+                      return count;
                     }
-                  word <<= 1;
                 }
-              boffset -= BITSET_WORD_BITS;
-              bcount = BITSET_WORD_BITS - 1;
+              bitoff -= BITSET_WORD_BITS;
+              bitcnt = BITSET_WORD_BITS - 1;
             }
           while (woffset--);
         }
 
-      woffset = EBITSET_ELT_WORDS - 1;
-      boffset = eindex * EBITSET_ELT_BITS - BITSET_WORD_BITS;
+      woffset = TBITSET_ELT_WORDS - 1;
+      bitoff = eindex * TBITSET_ELT_BITS - BITSET_WORD_BITS;
     }
   while (eindex--);
 
-  *next = n_bits - (boffset + 1);
+  *next = n_bits - (bitoff + 1);
   return count;
 }
 
@@ -599,42 +598,38 @@
 tbitset_list (bitset bset, bitset_bindex *list,
               bitset_bindex num, bitset_bindex *next)
 {
-  if (EBITSET_ZERO_P (bset))
+  if (TBITSET_ZERO_P (bset))
     return 0;
 
   bitset_bindex bitno = *next;
   bitset_bindex count = 0;
 
-  tbitset_elts *elts = EBITSET_ELTS (bset);
-  bitset_windex size = EBITSET_SIZE (bset);
-  bitset_windex eindex = bitno / EBITSET_ELT_BITS;
+  tbitset_elts *elts = TBITSET_ELTS (bset);
+  bitset_windex size = TBITSET_SIZE (bset);
+  bitset_windex eindex = bitno / TBITSET_ELT_BITS;
 
-  if (bitno % EBITSET_ELT_BITS)
+  if (bitno % TBITSET_ELT_BITS)
     {
       /* We need to start within an element.  This is not very common.  */
       tbitset_elt *elt = elts[eindex];
       if (elt)
         {
-          bitset_word *srcp = EBITSET_WORDS (elt);
-          bitset_windex woffset = eindex * EBITSET_ELT_WORDS;
+          bitset_word *srcp = TBITSET_WORDS (elt);
+          bitset_windex woffset = eindex * TBITSET_ELT_WORDS;
 
           for (bitset_windex windex = bitno / BITSET_WORD_BITS;
-               (windex - woffset) < EBITSET_ELT_WORDS; windex++)
+               (windex - woffset) < TBITSET_ELT_WORDS; windex++)
             {
               bitset_word word = srcp[windex - woffset] >> (bitno % BITSET_WORD_BITS);
 
-              for (; word; bitno++)
+              BITSET_FOR_EACH_BIT (pos, word)
                 {
-                  if (word & 1)
+                  list[count++] = bitno + pos;
+                  if (count >= num)
                     {
-                      list[count++] = bitno;
-                      if (count >= num)
-                        {
-                          *next = bitno + 1;
-                          return count;
-                        }
+                      *next = bitno + pos + 1;
+                      return count;
                     }
-                  word >>= 1;
                 }
               bitno = (windex + 1) * BITSET_WORD_BITS;
             }
@@ -649,85 +644,41 @@
 
   for (; eindex < size; eindex++)
     {
-      bitset_word *srcp;
-
       tbitset_elt *elt = elts[eindex];
       if (!elt)
         continue;
 
-      srcp = EBITSET_WORDS (elt);
-      bitset_windex windex = eindex * EBITSET_ELT_WORDS;
+      bitset_word *srcp = TBITSET_WORDS (elt);
+      bitset_windex windex = eindex * TBITSET_ELT_WORDS;
+      bitno = windex * BITSET_WORD_BITS;
 
-      if ((count + EBITSET_ELT_BITS) < num)
+      /* Is there enough room to avoid checking in each iteration? */
+      if ((count + TBITSET_ELT_BITS) < num)
         {
           /* The coast is clear, plant boot!  */
 
-#if EBITSET_ELT_WORDS == 2
+#if TBITSET_ELT_WORDS == 2
           bitset_word word = srcp[0];
           if (word)
-            {
-              if (!(word & 0xffff))
-                {
-                  word >>= 16;
-                  bitno += 16;
-                }
-              if (!(word & 0xff))
-                {
-                  word >>= 8;
-                  bitno += 8;
-                }
-              for (; word; bitno++)
-                {
-                  if (word & 1)
-                    list[count++] = bitno;
-                  word >>= 1;
-                }
-            }
+            BITSET_FOR_EACH_BIT (pos, word)
+              list[count++] = bitno + pos;
           windex++;
           bitno = windex * BITSET_WORD_BITS;
 
           word = srcp[1];
           if (word)
-            {
-              if (!(word & 0xffff))
-                {
-                  word >>= 16;
-                  bitno += 16;
-                }
-              for (; word; bitno++)
-                {
-                  if (word & 1)
-                    list[count++] = bitno;
-                  word >>= 1;
-                }
-            }
+            BITSET_FOR_EACH_BIT (pos, word)
+              list[count++] = bitno + pos;
           windex++;
           bitno = windex * BITSET_WORD_BITS;
 #else
-          for (int i = 0; i < EBITSET_ELT_WORDS; i++, windex++)
+          for (int i = 0; i < TBITSET_ELT_WORDS; i++, windex++)
             {
-              bitno = windex * BITSET_WORD_BITS;
-
-              word = srcp[i];
+              bitset_word word = srcp[i];
               if (word)
-                {
-                  if (!(word & 0xffff))
-                    {
-                      word >>= 16;
-                      bitno += 16;
-                    }
-                  if (!(word & 0xff))
-                    {
-                      word >>= 8;
-                      bitno += 8;
-                    }
-                  for (; word; bitno++)
-                    {
-                      if (word & 1)
-                        list[count++] = bitno;
-                      word >>= 1;
-                    }
-                }
+                BITSET_FOR_EACH_BIT (pos, word)
+                  list[count++] = bitno + pos;
+              bitno = windex * BITSET_WORD_BITS;
             }
 #endif
         }
@@ -735,24 +686,21 @@
         {
           /* Tread more carefully since we need to check
              if array overflows.  */
-
-          for (int i = 0; i < EBITSET_ELT_WORDS; i++, windex++)
+          for (int i = 0; i < TBITSET_ELT_WORDS; i++)
             {
+              bitset_word word = srcp[i];
+              if (word)
+                BITSET_FOR_EACH_BIT (pos, word)
+                  {
+                    list[count++] = bitno + pos;
+                    if (count >= num)
+                      {
+                        *next = bitno + pos + 1;
+                        return count;
+                      }
+                  }
+              windex++;
               bitno = windex * BITSET_WORD_BITS;
-
-              for (bitset_word word = srcp[i]; word; bitno++)
-                {
-                  if (word & 1)
-                    {
-                      list[count++] = bitno;
-                      if (count >= num)
-                        {
-                          *next = bitno + 1;
-                          return count;
-                        }
-                    }
-                  word >>= 1;
-                }
             }
         }
     }
@@ -767,26 +715,26 @@
 tbitset_unused_clear (bitset dst)
 {
   bitset_bindex n_bits = BITSET_NBITS_ (dst);
-  unsigned last_bit = n_bits % EBITSET_ELT_BITS;
+  unsigned last_bit = n_bits % TBITSET_ELT_BITS;
 
   if (last_bit)
     {
-      tbitset_elts *elts = EBITSET_ELTS (dst);
+      tbitset_elts *elts = TBITSET_ELTS (dst);
 
-      bitset_windex eindex = n_bits / EBITSET_ELT_BITS;
+      bitset_windex eindex = n_bits / TBITSET_ELT_BITS;
 
       tbitset_elt *elt = elts[eindex];
       if (elt)
         {
-          bitset_word *srcp = EBITSET_WORDS (elt);
+          bitset_word *srcp = TBITSET_WORDS (elt);
 
           bitset_windex windex = n_bits / BITSET_WORD_BITS;
-          bitset_windex woffset = eindex * EBITSET_ELT_WORDS;
+          bitset_windex woffset = eindex * TBITSET_ELT_WORDS;
 
           srcp[windex - woffset]
             &= ((bitset_word) 1 << (last_bit % BITSET_WORD_BITS)) - 1;
           windex++;
-          for (; (windex - woffset) < EBITSET_ELT_WORDS; windex++)
+          for (; (windex - woffset) < TBITSET_ELT_WORDS; windex++)
             srcp[windex - woffset] = 0;
         }
     }
@@ -796,15 +744,15 @@
 static void
 tbitset_ones (bitset dst)
 {
-  for (bitset_windex j = 0; j < EBITSET_SIZE (dst); j++)
+  for (bitset_windex j = 0; j < TBITSET_SIZE (dst); j++)
     {
       /* Create new elements if they cannot be found.  Perhaps
          we should just add pointers to a ones element?  */
       tbitset_elt *elt =
-        tbitset_elt_find (dst, j * EBITSET_ELT_BITS, EBITSET_CREATE);
-      memset (EBITSET_WORDS (elt), -1, sizeof (EBITSET_WORDS (elt)));
+        tbitset_elt_find (dst, j * TBITSET_ELT_BITS, TBITSET_CREATE);
+      memset (TBITSET_WORDS (elt), -1, sizeof (TBITSET_WORDS (elt)));
     }
-  EBITSET_NONZERO_SET (dst);
+  TBITSET_NONZERO_SET (dst);
   tbitset_unused_clear (dst);
 }
 
@@ -812,11 +760,11 @@
 static bool
 tbitset_empty_p (bitset dst)
 {
-  if (EBITSET_ZERO_P (dst))
+  if (TBITSET_ZERO_P (dst))
     return true;
 
-  tbitset_elts *elts = EBITSET_ELTS (dst);
-  for (bitset_windex j = 0; j < EBITSET_SIZE (dst); j++)
+  tbitset_elts *elts = TBITSET_ELTS (dst);
+  for (bitset_windex j = 0; j < TBITSET_SIZE (dst); j++)
     {
       tbitset_elt *elt = elts[j];
 
@@ -831,7 +779,7 @@
 
   /* All the bits are zero.  We could shrink the elts.
      For now just mark DST as known to be zero.  */
-  EBITSET_ZERO_SET (dst);
+  TBITSET_ZERO_SET (dst);
   return true;
 }
 
@@ -841,19 +789,19 @@
 {
   tbitset_resize (dst, BITSET_NBITS_ (src));
 
-  for (bitset_windex j = 0; j < EBITSET_SIZE (src); j++)
+  for (bitset_windex j = 0; j < TBITSET_SIZE (src); j++)
     {
       /* Create new elements for dst if they cannot be found
          or substitute zero elements if src elements not found.  */
       tbitset_elt *selt =
-        tbitset_elt_find (src, j * EBITSET_ELT_BITS, EBITSET_SUBST);
+        tbitset_elt_find (src, j * TBITSET_ELT_BITS, TBITSET_SUBST);
       tbitset_elt *delt =
-        tbitset_elt_find (dst, j * EBITSET_ELT_BITS, EBITSET_CREATE);
+        tbitset_elt_find (dst, j * TBITSET_ELT_BITS, TBITSET_CREATE);
 
-      for (unsigned i = 0; i < EBITSET_ELT_WORDS; i++)
-        EBITSET_WORDS (delt)[i] = ~EBITSET_WORDS (selt)[i];
+      for (unsigned i = 0; i < TBITSET_ELT_WORDS; i++)
+        TBITSET_WORDS (delt)[i] = ~TBITSET_WORDS (selt)[i];
     }
-  EBITSET_NONZERO_SET (dst);
+  TBITSET_NONZERO_SET (dst);
   tbitset_unused_clear (dst);
 }
 
@@ -862,11 +810,11 @@
 static bool
 tbitset_subset_p (bitset dst, bitset src)
 {
-  tbitset_elts *selts = EBITSET_ELTS (src);
-  tbitset_elts *delts = EBITSET_ELTS (dst);
+  tbitset_elts *selts = TBITSET_ELTS (src);
+  tbitset_elts *delts = TBITSET_ELTS (dst);
 
-  bitset_windex ssize = EBITSET_SIZE (src);
-  bitset_windex dsize = EBITSET_SIZE (dst);
+  bitset_windex ssize = TBITSET_SIZE (src);
+  bitset_windex dsize = TBITSET_SIZE (dst);
 
   for (bitset_windex j = 0; j < ssize; j++)
     {
@@ -881,9 +829,9 @@
       if (!delt)
         delt = &tbitset_zero_elts[0];
 
-      for (unsigned i = 0; i < EBITSET_ELT_WORDS; i++)
-        if (EBITSET_WORDS (delt)[i]
-            != (EBITSET_WORDS (selt)[i] | EBITSET_WORDS (delt)[i]))
+      for (unsigned i = 0; i < TBITSET_ELT_WORDS; i++)
+        if (TBITSET_WORDS (delt)[i]
+            != (TBITSET_WORDS (selt)[i] | TBITSET_WORDS (delt)[i]))
           return false;
     }
   return true;
@@ -894,11 +842,11 @@
 static bool
 tbitset_disjoint_p (bitset dst, bitset src)
 {
-  tbitset_elts *selts = EBITSET_ELTS (src);
-  tbitset_elts *delts = EBITSET_ELTS (dst);
+  tbitset_elts *selts = TBITSET_ELTS (src);
+  tbitset_elts *delts = TBITSET_ELTS (dst);
 
-  bitset_windex ssize = EBITSET_SIZE (src);
-  bitset_windex dsize = EBITSET_SIZE (dst);
+  bitset_windex ssize = TBITSET_SIZE (src);
+  bitset_windex dsize = TBITSET_SIZE (dst);
 
   for (bitset_windex j = 0; j < ssize; j++)
     {
@@ -908,8 +856,8 @@
       if (!selt || !delt)
         continue;
 
-      for (unsigned i = 0; i < EBITSET_ELT_WORDS; i++)
-        if ((EBITSET_WORDS (selt)[i] & EBITSET_WORDS (delt)[i]))
+      for (unsigned i = 0; i < TBITSET_ELT_WORDS; i++)
+        if ((TBITSET_WORDS (selt)[i] & TBITSET_WORDS (delt)[i]))
           return false;
     }
   return true;
@@ -924,16 +872,16 @@
 
   tbitset_resize (dst, max (BITSET_NBITS_ (src1), BITSET_NBITS_ (src2)));
 
-  bitset_windex ssize1 = EBITSET_SIZE (src1);
-  bitset_windex ssize2 = EBITSET_SIZE (src2);
-  bitset_windex dsize = EBITSET_SIZE (dst);
+  bitset_windex ssize1 = TBITSET_SIZE (src1);
+  bitset_windex ssize2 = TBITSET_SIZE (src2);
+  bitset_windex dsize = TBITSET_SIZE (dst);
   bitset_windex size = ssize1;
   if (size < ssize2)
     size = ssize2;
 
-  tbitset_elts *selts1 = EBITSET_ELTS (src1);
-  tbitset_elts *selts2 = EBITSET_ELTS (src2);
-  tbitset_elts *delts = EBITSET_ELTS (dst);
+  tbitset_elts *selts1 = TBITSET_ELTS (src1);
+  tbitset_elts *selts2 = TBITSET_ELTS (src2);
+  tbitset_elts *delts = TBITSET_ELTS (dst);
 
   bitset_windex j = 0;
   for (j = 0; j < size; j++)
@@ -961,16 +909,16 @@
       else
         delts[j] = 0;
 
-      bitset_word *srcp1 = EBITSET_WORDS (selt1);
-      bitset_word *srcp2 = EBITSET_WORDS (selt2);
-      bitset_word *dstp = EBITSET_WORDS (delt);
+      bitset_word *srcp1 = TBITSET_WORDS (selt1);
+      bitset_word *srcp2 = TBITSET_WORDS (selt2);
+      bitset_word *dstp = TBITSET_WORDS (delt);
       switch (op)
         {
         default:
           abort ();
 
         case BITSET_OP_OR:
-          for (unsigned i = 0; i < EBITSET_ELT_WORDS; i++, dstp++)
+          for (unsigned i = 0; i < TBITSET_ELT_WORDS; i++, dstp++)
             {
               bitset_word tmp = *srcp1++ | *srcp2++;
 
@@ -983,7 +931,7 @@
           break;
 
         case BITSET_OP_AND:
-          for (unsigned i = 0; i < EBITSET_ELT_WORDS; i++, dstp++)
+          for (unsigned i = 0; i < TBITSET_ELT_WORDS; i++, dstp++)
             {
               bitset_word tmp = *srcp1++ & *srcp2++;
 
@@ -996,7 +944,7 @@
           break;
 
         case BITSET_OP_XOR:
-          for (unsigned i = 0; i < EBITSET_ELT_WORDS; i++, dstp++)
+          for (unsigned i = 0; i < TBITSET_ELT_WORDS; i++, dstp++)
             {
               bitset_word tmp = *srcp1++ ^ *srcp2++;
 
@@ -1009,7 +957,7 @@
           break;
 
         case BITSET_OP_ANDN:
-          for (unsigned i = 0; i < EBITSET_ELT_WORDS; i++, dstp++)
+          for (unsigned i = 0; i < TBITSET_ELT_WORDS; i++, dstp++)
             {
               bitset_word tmp = *srcp1++ & ~(*srcp2++);
 
@@ -1038,7 +986,7 @@
         tbitset_elt_remove (dst, j);
     }
 
-  EBITSET_NONZERO_SET (dst);
+  TBITSET_NONZERO_SET (dst);
   return changed;
 }
 
@@ -1046,17 +994,17 @@
 static bool
 tbitset_and_cmp (bitset dst, bitset src1, bitset src2)
 {
-  if (EBITSET_ZERO_P (src2))
+  if (TBITSET_ZERO_P (src2))
     {
       tbitset_weed (dst);
-      bool changed = EBITSET_ZERO_P (dst);
+      bool changed = TBITSET_ZERO_P (dst);
       tbitset_zero (dst);
       return changed;
     }
-  else if (EBITSET_ZERO_P (src1))
+  else if (TBITSET_ZERO_P (src1))
     {
       tbitset_weed (dst);
-      bool changed = EBITSET_ZERO_P (dst);
+      bool changed = TBITSET_ZERO_P (dst);
       tbitset_zero (dst);
       return changed;
     }
@@ -1075,12 +1023,12 @@
 static bool
 tbitset_andn_cmp (bitset dst, bitset src1, bitset src2)
 {
-  if (EBITSET_ZERO_P (src2))
+  if (TBITSET_ZERO_P (src2))
     return tbitset_copy_cmp (dst, src1);
-  else if (EBITSET_ZERO_P (src1))
+  else if (TBITSET_ZERO_P (src1))
     {
       tbitset_weed (dst);
-      bool changed = EBITSET_ZERO_P (dst);
+      bool changed = TBITSET_ZERO_P (dst);
       tbitset_zero (dst);
       return changed;
     }
@@ -1099,9 +1047,9 @@
 static bool
 tbitset_or_cmp (bitset dst, bitset src1, bitset src2)
 {
-  if (EBITSET_ZERO_P (src2))
+  if (TBITSET_ZERO_P (src2))
     return tbitset_copy_cmp (dst, src1);
-  else if (EBITSET_ZERO_P (src1))
+  else if (TBITSET_ZERO_P (src1))
     return tbitset_copy_cmp (dst, src2);
   else
     return tbitset_op3_cmp (dst, src1, src2, BITSET_OP_OR);
@@ -1118,9 +1066,9 @@
 static bool
 tbitset_xor_cmp (bitset dst, bitset src1, bitset src2)
 {
-  if (EBITSET_ZERO_P (src2))
+  if (TBITSET_ZERO_P (src2))
     return tbitset_copy_cmp (dst, src1);
-  else if (EBITSET_ZERO_P (src1))
+  else if (TBITSET_ZERO_P (src1))
     return tbitset_copy_cmp (dst, src2);
   else
     return tbitset_op3_cmp (dst, src1, src2, BITSET_OP_XOR);
@@ -1184,7 +1132,7 @@
 
 /* Return size of initial structure.  */
 size_t
-tbitset_bytes (bitset_bindex n_bits ATTRIBUTE_UNUSED)
+tbitset_bytes (MAYBE_UNUSED bitset_bindex n_bits)
 {
   return sizeof (struct tbitset_struct);
 }
@@ -1197,12 +1145,12 @@
 {
   bset->b.vtable = &tbitset_vtable;
 
-  bset->b.csize = EBITSET_ELT_WORDS;
+  bset->b.csize = TBITSET_ELT_WORDS;
 
-  EBITSET_ZERO_SET (bset);
+  TBITSET_ZERO_SET (bset);
 
-  EBITSET_ASIZE (bset) = 0;
-  EBITSET_ELTS (bset) = 0;
+  TBITSET_ASIZE (bset) = 0;
+  TBITSET_ELTS (bset) = 0;
   tbitset_resize (bset, n_bits);
 
   return bset;
diff --git a/lib/bitset/table.h b/lib/bitset/table.h
index ebcb1c5..37aceca 100644
--- a/lib/bitset/table.h
+++ b/lib/bitset/table.h
@@ -1,6 +1,6 @@
 /* Functions to support tbitsets.
 
-   Copyright (C) 2002, 2004, 2009-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 2002, 2004, 2009-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
diff --git a/lib/bitset/vector.c b/lib/bitset/vector.c
index 935e644..f0dc5f5 100644
--- a/lib/bitset/vector.c
+++ b/lib/bitset/vector.c
@@ -1,6 +1,6 @@
 /* Variable array bitsets.
 
-   Copyright (C) 2002-2006, 2009-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002-2006, 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
 
@@ -126,7 +126,7 @@
 
 /* Reset bit BITNO in bitset DST.  */
 static void
-vbitset_reset (bitset dst ATTRIBUTE_UNUSED, bitset_bindex bitno ATTRIBUTE_UNUSED)
+vbitset_reset (MAYBE_UNUSED bitset dst, MAYBE_UNUSED bitset_bindex bitno)
 {
   /* We must be accessing outside the cache so the bit is
      zero anyway.  */
@@ -135,8 +135,8 @@
 
 /* Test bit BITNO in bitset SRC.  */
 static bool
-vbitset_test (bitset src ATTRIBUTE_UNUSED,
-              bitset_bindex bitno ATTRIBUTE_UNUSED)
+vbitset_test (MAYBE_UNUSED bitset src,
+              MAYBE_UNUSED bitset_bindex bitno)
 {
   /* We must be accessing outside the cache so the bit is
      zero anyway.  */
@@ -152,11 +152,11 @@
 vbitset_list_reverse (bitset src, bitset_bindex *list,
                       bitset_bindex num, bitset_bindex *next)
 {
+  /* FIXME: almost a duplicate of abitset_list_reverse.  Factor?  */
+  bitset_bindex rbitno = *next;
   bitset_word *srcp = VBITSET_WORDS (src);
   bitset_bindex n_bits = BITSET_SIZE_ (src);
 
-  bitset_bindex rbitno = *next;
-
   /* If num is 1, we could speed things up with a binary search
      of the word of interest.  */
 
@@ -173,19 +173,18 @@
 
   do
     {
-      bitset_word word = srcp[windex] << (BITSET_WORD_BITS - 1 - bitcnt);
-      for (; word; bitcnt--)
+      bitset_word word = srcp[windex];
+      if (bitcnt + 1 < BITSET_WORD_BITS)
+        /* We're starting in the middle of a word: smash bits to ignore.  */
+        word &= ((bitset_word) 1 << (bitcnt + 1)) - 1;
+      BITSET_FOR_EACH_BIT_REVERSE(pos, word)
         {
-          if (word & BITSET_MSB)
+          list[count++] = bitoff + pos;
+          if (count >= num)
             {
-              list[count++] = bitoff + bitcnt;
-              if (count >= num)
-                {
-                  *next = n_bits - (bitoff + bitcnt);
-                  return count;
-                }
+              *next = n_bits - (bitoff + pos);
+              return count;
             }
-          word <<= 1;
         }
       bitoff -= BITSET_WORD_BITS;
       bitcnt = BITSET_WORD_BITS - 1;
@@ -204,6 +203,7 @@
 vbitset_list (bitset src, bitset_bindex *list,
               bitset_bindex num, bitset_bindex *next)
 {
+  /* FIXME: almost a duplicate of abitset_list.  Factor?  */
   bitset_windex size = VBITSET_SIZE (src);
   bitset_word *srcp = VBITSET_WORDS (src);
   bitset_bindex bitno = *next;
@@ -211,7 +211,6 @@
 
   bitset_windex windex;
   bitset_bindex bitoff;
-  bitset_word word;
 
   if (!bitno)
     {
@@ -242,19 +241,16 @@
              on the previous call to this function.  */
 
           bitoff = windex * BITSET_WORD_BITS;
-          word = srcp[windex] >> bitno;
-          for (bitno = bitoff + bitno; word; bitno++)
+          bitset_word word = srcp[windex] >> bitno;
+          bitno = bitoff + bitno;
+          BITSET_FOR_EACH_BIT (pos, word)
             {
-              if (word & 1)
+              list[count++] = bitno + pos;
+              if (count >= num)
                 {
-                  list[count++] = bitno;
-                  if (count >= num)
-                    {
-                      *next = bitno + 1;
-                      return count;
-                    }
+                  *next = bitno + pos + 1;
+                  return count;
                 }
-              word >>= 1;
             }
           windex++;
         }
@@ -263,34 +259,24 @@
 
   for (; windex < size; windex++, bitoff += BITSET_WORD_BITS)
     {
-      if (!(word = srcp[windex]))
+      bitset_word word = srcp[windex];
+      if (!word)
         continue;
 
+      /* Is there enough room to avoid checking in each iteration? */
       if ((count + BITSET_WORD_BITS) < num)
-        {
-          for (bitno = bitoff; word; bitno++)
-            {
-              if (word & 1)
-                list[count++] = bitno;
-              word >>= 1;
-            }
-        }
+        BITSET_FOR_EACH_BIT (pos, word)
+          list[count++] = bitoff + pos;
       else
-        {
-          for (bitno = bitoff; word; bitno++)
-            {
-              if (word & 1)
-                {
-                  list[count++] = bitno;
-                  if (count >= num)
-                    {
-                      *next = bitno + 1;
-                      return count;
-                    }
-                }
-              word >>= 1;
-            }
-        }
+        BITSET_FOR_EACH_BIT (pos, word)
+          {
+            list[count++] = bitoff + pos;
+            if (count >= num)
+              {
+                *next = bitoff + pos + 1;
+                return count;
+              }
+          }
     }
 
   *next = bitoff;
@@ -978,7 +964,7 @@
 
 
 size_t
-vbitset_bytes (bitset_bindex n_bits ATTRIBUTE_UNUSED)
+vbitset_bytes (MAYBE_UNUSED bitset_bindex n_bits)
 {
   return sizeof (struct vbitset_struct);
 }
diff --git a/lib/bitset/vector.h b/lib/bitset/vector.h
index 34fa498..e32a0bd 100644
--- a/lib/bitset/vector.h
+++ b/lib/bitset/vector.h
@@ -1,6 +1,6 @@
 /* Functions to support vbitsets.
 
-   Copyright (C) 2002, 2004, 2009-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 2002, 2004, 2009-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
diff --git a/lib/bitsetv.c b/lib/bitsetv.c
index db10017..5f7d5a8 100644
--- a/lib/bitsetv.c
+++ b/lib/bitsetv.c
@@ -1,6 +1,6 @@
 /* Bitset vectors.
 
-   Copyright (C) 2001-2002, 2004-2006, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2001-2002, 2004-2006, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
diff --git a/lib/bitsetv.h b/lib/bitsetv.h
index 2f1ff88..2ab9b80 100644
--- a/lib/bitsetv.h
+++ b/lib/bitsetv.h
@@ -1,6 +1,6 @@
 /* Bitset vectors.
 
-   Copyright (C) 2002, 2004, 2009-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 2002, 2004, 2009-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
@@ -25,16 +25,18 @@
 
 typedef bitset * bitsetv;
 
+/* Free vector of bitsets.  Do nothing if NULL.  */
+void bitsetv_free (bitsetv);
+
 /* Create a vector of N_VECS bitsets, each of N_BITS, and of
    type TYPE.  */
-bitsetv bitsetv_alloc (bitset_bindex, bitset_bindex, enum bitset_type);
+bitsetv bitsetv_alloc (bitset_bindex, bitset_bindex, enum bitset_type)
+  _GL_ATTRIBUTE_DEALLOC (bitsetv_free, 1);
 
 /* Create a vector of N_VECS bitsets, each of N_BITS, and with
    attribute hints specified by ATTR.  */
-bitsetv bitsetv_create (bitset_bindex, bitset_bindex, unsigned);
-
-/* Free vector of bitsets.  Do nothing if NULL.  */
-void bitsetv_free (bitsetv);
+bitsetv bitsetv_create (bitset_bindex, bitset_bindex, unsigned)
+  _GL_ATTRIBUTE_DEALLOC (bitsetv_free, 1);
 
 /* Zero vector of bitsets.  */
 void bitsetv_zero (bitsetv);
diff --git a/lib/c++defs.h b/lib/c++defs.h
index 87d0716..a47b61a 100644
--- a/lib/c++defs.h
+++ b/lib/c++defs.h
@@ -1,17 +1,17 @@
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -146,6 +146,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -171,6 +181,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -268,7 +286,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -296,14 +314,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
diff --git a/lib/c-ctype.c b/lib/c-ctype.c
index 5d9d4d8..300f97c 100644
--- a/lib/c-ctype.c
+++ b/lib/c-ctype.c
@@ -1,3 +1,21 @@
+/* Character handling in C locale.
+
+   Copyright (C) 2003-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #include <config.h>
+
 #define C_CTYPE_INLINE _GL_EXTERN_INLINE
 #include "c-ctype.h"
diff --git a/lib/c-ctype.h b/lib/c-ctype.h
index 4d52176..3a652ac 100644
--- a/lib/c-ctype.h
+++ b/lib/c-ctype.h
@@ -5,20 +5,20 @@
    <ctype.h> functions' behaviour depends on the current locale set via
    setlocale.
 
-   Copyright (C) 2000-2003, 2006, 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2000-2003, 2006, 2008-2021 Free Software Foundation, Inc.
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3 of the License, or
-(at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef C_CTYPE_H
 #define C_CTYPE_H
diff --git a/lib/c-strcase.h b/lib/c-strcase.h
index b67c9b5..82f99bb 100644
--- a/lib/c-strcase.h
+++ b/lib/c-strcase.h
@@ -1,19 +1,19 @@
 /* Case-insensitive string comparison functions in C locale.
-   Copyright (C) 1995-1996, 2001, 2003, 2005, 2009-2019 Free Software
+   Copyright (C) 1995-1996, 2001, 2003, 2005, 2009-2021 Free Software
    Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef C_STRCASE_H
 #define C_STRCASE_H
diff --git a/lib/c-strcasecmp.c b/lib/c-strcasecmp.c
index ec50f1a..3c22455 100644
--- a/lib/c-strcasecmp.c
+++ b/lib/c-strcasecmp.c
@@ -1,18 +1,18 @@
 /* c-strcasecmp.c -- case insensitive string comparator in C locale
-   Copyright (C) 1998-1999, 2005-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 1998-1999, 2005-2006, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
@@ -52,5 +52,5 @@
     /* On machines where 'char' and 'int' are types of the same size, the
        difference of two 'unsigned char' values - including the sign bit -
        doesn't fit in an 'int'.  */
-    return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+    return _GL_CMP (c1, c2);
 }
diff --git a/lib/c-strcaseeq.h b/lib/c-strcaseeq.h
index bcc81fc..66b9cf3 100644
--- a/lib/c-strcaseeq.h
+++ b/lib/c-strcaseeq.h
@@ -1,17 +1,17 @@
 /* Optimized case-insensitive string comparison in C locale.
-   Copyright (C) 2001-2002, 2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2002, 2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>.  */
@@ -27,7 +27,7 @@
 
 /* Help GCC to generate good code for string comparisons with
    immediate strings. */
-#if defined (__GNUC__) && defined (__OPTIMIZE__)
+#if (defined __GNUC__ || defined __clang__) && defined __OPTIMIZE__
 
 /* Case insensitive comparison of ASCII characters.  */
 # if C_CTYPE_ASCII
diff --git a/lib/c-strncasecmp.c b/lib/c-strncasecmp.c
index 513c353..f3ca786 100644
--- a/lib/c-strncasecmp.c
+++ b/lib/c-strncasecmp.c
@@ -1,18 +1,18 @@
 /* c-strncasecmp.c -- case insensitive string comparator in C locale
-   Copyright (C) 1998-1999, 2005-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 1998-1999, 2005-2006, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
@@ -52,5 +52,5 @@
     /* On machines where 'char' and 'int' are types of the same size, the
        difference of two 'unsigned char' values - including the sign bit -
        doesn't fit in an 'int'.  */
-    return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+    return _GL_CMP (c1, c2);
 }
diff --git a/lib/calloc.c b/lib/calloc.c
index a0f5728..25064e9 100644
--- a/lib/calloc.c
+++ b/lib/calloc.c
@@ -1,70 +1,52 @@
 /* calloc() function that is glibc compatible.
    This wrapper function is required at least on Tru64 UNIX 5.1 and mingw.
-   Copyright (C) 2004-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2004-2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* written by Jim Meyering and Bruno Haible */
 
 #include <config.h>
-/* Only the AC_FUNC_CALLOC macro defines 'calloc' already in config.h.  */
-#ifdef calloc
-# define NEED_CALLOC_GNU 1
-# undef calloc
-/* Whereas the gnulib module 'calloc-gnu' defines HAVE_CALLOC_GNU.  */
-#elif GNULIB_CALLOC_GNU && !HAVE_CALLOC_GNU
-# define NEED_CALLOC_GNU 1
-#endif
 
 /* Specification.  */
 #include <stdlib.h>
 
 #include <errno.h>
 
+#include "xalloc-oversized.h"
+
 /* Call the system's calloc below.  */
 #undef calloc
 
-/* Allocate and zero-fill an NxS-byte block of memory from the heap.
-   If N or S is zero, allocate and zero-fill a 1-byte block.  */
+/* Allocate and zero-fill an NxS-byte block of memory from the heap,
+   even if N or S is zero.  */
 
 void *
 rpl_calloc (size_t n, size_t s)
 {
-  void *result;
-
-#if NEED_CALLOC_GNU
   if (n == 0 || s == 0)
-    {
-      n = 1;
-      s = 1;
-    }
-  else
-    {
-      /* Defend against buggy calloc implementations that mishandle
-         size_t overflow.  */
-      size_t bytes = n * s;
-      if (bytes / s != n)
-        {
-          errno = ENOMEM;
-          return NULL;
-        }
-    }
-#endif
+    n = s = 1;
 
-  result = calloc (n, s);
+  if (xalloc_oversized (n, s))
+    {
+      errno = ENOMEM;
+      return NULL;
+    }
 
-#if !HAVE_CALLOC_POSIX
+  void *result = calloc (n, s);
+
+#if !HAVE_MALLOC_POSIX
   if (result == NULL)
     errno = ENOMEM;
 #endif
diff --git a/lib/canonicalize-lgpl.c b/lib/canonicalize-lgpl.c
index 4d1be6d..92e9639 100644
--- a/lib/canonicalize-lgpl.c
+++ b/lib/canonicalize-lgpl.c
@@ -1,58 +1,58 @@
 /* Return the canonical absolute name of a given file.
-   Copyright (C) 1996-2019 Free Software Foundation, Inc.
+   Copyright (C) 1996-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
 
 #ifndef _LIBC
 /* Don't use __attribute__ __nonnull__ in this compilation unit.  Otherwise gcc
    optimizes away the name == NULL test below.  */
 # define _GL_ARG_NONNULL(params)
 
-# define _GL_USE_STDLIB_ALLOC 1
-# include <config.h>
+# include <libc-config.h>
 #endif
 
-#if !HAVE_CANONICALIZE_FILE_NAME || !FUNC_REALPATH_WORKS || defined _LIBC
-
 /* Specification.  */
 #include <stdlib.h>
 
-#include <alloca.h>
-#include <string.h>
-#include <unistd.h>
-#include <limits.h>
-#if HAVE_SYS_PARAM_H || defined _LIBC
-# include <sys/param.h>
-#endif
-#include <sys/stat.h>
 #include <errno.h>
-#include <stddef.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <eloop-threshold.h>
+#include <filename.h>
+#include <idx.h>
+#include <intprops.h>
+#include <scratch_buffer.h>
 
 #ifdef _LIBC
 # include <shlib-compat.h>
+# define GCC_LINT 1
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
 #else
-# define SHLIB_COMPAT(lib, introduced, obsoleted) 0
-# define versioned_symbol(lib, local, symbol, version) extern int dummy
-# define compat_symbol(lib, local, symbol, version)
-# define weak_alias(local, symbol)
 # define __canonicalize_file_name canonicalize_file_name
 # define __realpath realpath
 # include "pathmax.h"
-# include "malloca.h"
-# include "dosname.h"
-# if HAVE_GETCWD
+# define __faccessat faccessat
+# if defined _WIN32 && !defined __CYGWIN__
+#  define __getcwd _getcwd
+# elif HAVE_GETCWD
 #  if IN_RELOCWRAPPER
     /* When building the relocatable program wrapper, use the system's getcwd
        function, not the gnulib override, otherwise we would get a link error.
@@ -70,57 +70,142 @@
 # else
 #  define __getcwd(buf, max) getwd (buf)
 # endif
+# define __mempcpy mempcpy
+# define __pathconf pathconf
+# define __rawmemchr rawmemchr
 # define __readlink readlink
-# define __set_errno(e) errno = (e)
-# ifndef MAXSYMLINKS
-#  ifdef SYMLOOP_MAX
-#   define MAXSYMLINKS SYMLOOP_MAX
-#  else
-#   define MAXSYMLINKS 20
-#  endif
+# if IN_RELOCWRAPPER
+    /* When building the relocatable program wrapper, use the system's memmove
+       function, not the gnulib override, otherwise we would get a link error.
+     */
+#  undef memmove
 # endif
 #endif
 
+/* Suppress bogus GCC -Wmaybe-uninitialized warnings.  */
+#if defined GCC_LINT || defined lint
+# define IF_LINT(Code) Code
+#else
+# define IF_LINT(Code) /* empty */
+#endif
+
 #ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
-# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
+# define DOUBLE_SLASH_IS_DISTINCT_ROOT false
 #endif
 
-/* Define this independently so that stdint.h is not a prerequisite.  */
-#ifndef SIZE_MAX
-# define SIZE_MAX ((size_t) -1)
-#endif
+#if defined _LIBC || !FUNC_REALPATH_WORKS
 
-#if !FUNC_REALPATH_WORKS || defined _LIBC
-
-static void
-alloc_failed (void)
+/* Return true if FILE's existence can be shown, false (setting errno)
+   otherwise.  Follow symbolic links.  */
+static bool
+file_accessible (char const *file)
 {
-#if defined _WIN32 && ! defined __CYGWIN__
-  /* Avoid errno problem without using the malloc or realloc modules; see:
-     https://lists.gnu.org/r/bug-gnulib/2016-08/msg00025.html  */
-  errno = ENOMEM;
-#endif
+# if defined _LIBC || HAVE_FACCESSAT
+  return __faccessat (AT_FDCWD, file, F_OK, AT_EACCESS) == 0;
+# else
+  struct stat st;
+  return stat (file, &st) == 0 || errno == EOVERFLOW;
+# endif
 }
 
-/* Return the canonical absolute name of file NAME.  A canonical name
-   does not contain any ".", ".." components nor any repeated path
-   separators ('/') or symlinks.  All path components must exist.  If
-   RESOLVED is null, the result is malloc'd; otherwise, if the
-   canonical name is PATH_MAX chars or more, returns null with 'errno'
-   set to ENAMETOOLONG; if the name fits in fewer than PATH_MAX chars,
-   returns the name in RESOLVED.  If the name cannot be resolved and
-   RESOLVED is non-NULL, it contains the path of the first component
-   that cannot be resolved.  If the path can be resolved, RESOLVED
-   holds the same value as the value returned.  */
+/* True if concatenating END as a suffix to a file name means that the
+   code needs to check that the file name is that of a searchable
+   directory, since the canonicalize_filename_mode_stk code won't
+   check this later anyway when it checks an ordinary file name
+   component within END.  END must either be empty, or start with a
+   slash.  */
 
-char *
-__realpath (const char *name, char *resolved)
+static bool _GL_ATTRIBUTE_PURE
+suffix_requires_dir_check (char const *end)
 {
-  char *rpath, *dest, *extra_buf = NULL;
-  const char *start, *end, *rpath_limit;
-  long int path_max;
+  /* If END does not start with a slash, the suffix is OK.  */
+  while (ISSLASH (*end))
+    {
+      /* Two or more slashes act like a single slash.  */
+      do
+        end++;
+      while (ISSLASH (*end));
+
+      switch (*end++)
+        {
+        default: return false;  /* An ordinary file name component is OK.  */
+        case '\0': return true; /* Trailing "/" is trouble.  */
+        case '.': break;        /* Possibly "." or "..".  */
+        }
+      /* Trailing "/.", or "/.." even if not trailing, is trouble.  */
+      if (!*end || (*end == '.' && (!end[1] || ISSLASH (end[1]))))
+        return true;
+    }
+
+  return false;
+}
+
+/* Append this to a file name to test whether it is a searchable directory.
+   On POSIX platforms "/" suffices, but "/./" is sometimes needed on
+   macOS 10.13 <https://bugs.gnu.org/30350>, and should also work on
+   platforms like AIX 7.2 that need at least "/.".  */
+
+# if defined _LIBC || defined LSTAT_FOLLOWS_SLASHED_SYMLINK
+static char const dir_suffix[] = "/";
+# else
+static char const dir_suffix[] = "/./";
+# endif
+
+/* Return true if DIR is a searchable dir, false (setting errno) otherwise.
+   DIREND points to the NUL byte at the end of the DIR string.
+   Store garbage into DIREND[0 .. strlen (dir_suffix)].  */
+
+static bool
+dir_check (char *dir, char *dirend)
+{
+  strcpy (dirend, dir_suffix);
+  return file_accessible (dir);
+}
+
+static idx_t
+get_path_max (void)
+{
+# ifdef PATH_MAX
+  long int path_max = PATH_MAX;
+# else
+  /* The caller invoked realpath with a null RESOLVED, even though
+     PATH_MAX is not defined as a constant.  The glibc manual says
+     programs should not do this, and POSIX says the behavior is undefined.
+     Historically, glibc here used the result of pathconf, or 1024 if that
+     failed; stay consistent with this (dubious) historical practice.  */
+  int err = errno;
+  long int path_max = __pathconf ("/", _PC_PATH_MAX);
+  __set_errno (err);
+# endif
+  return path_max < 0 ? 1024 : path_max <= IDX_MAX ? path_max : IDX_MAX;
+}
+
+/* Act like __realpath (see below), with an additional argument
+   rname_buf that can be used as temporary storage.
+
+   If GCC_LINT is defined, do not inline this function with GCC 10.1
+   and later, to avoid creating a pointer to the stack that GCC
+   -Wreturn-local-addr incorrectly complains about.  See:
+   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644
+   Although the noinline attribute can hurt performance a bit, no better way
+   to pacify GCC is known; even an explicit #pragma does not pacify GCC.
+   When the GCC bug is fixed this workaround should be limited to the
+   broken GCC versions.  */
+# if __GNUC_PREREQ (10, 1)
+#  if defined GCC_LINT || defined lint
+__attribute__ ((__noinline__))
+#  elif __OPTIMIZE__ && !__NO_INLINE__
+#   define GCC_BOGUS_WRETURN_LOCAL_ADDR
+#  endif
+# endif
+static char *
+realpath_stk (const char *name, char *resolved,
+              struct scratch_buffer *rname_buf)
+{
+  char *dest;
+  char const *start;
+  char const *end;
   int num_links = 0;
-  size_t prefix_len;
 
   if (name == NULL)
     {
@@ -140,205 +225,148 @@
       return NULL;
     }
 
-#ifdef PATH_MAX
-  path_max = PATH_MAX;
-#else
-  path_max = pathconf (name, _PC_PATH_MAX);
-  if (path_max <= 0)
-    path_max = 8192;
-#endif
-
-  if (resolved == NULL)
-    {
-      rpath = malloc (path_max);
-      if (rpath == NULL)
-        {
-          alloc_failed ();
-          return NULL;
-        }
-    }
-  else
-    rpath = resolved;
-  rpath_limit = rpath + path_max;
+  struct scratch_buffer extra_buffer, link_buffer;
+  scratch_buffer_init (&extra_buffer);
+  scratch_buffer_init (&link_buffer);
+  scratch_buffer_init (rname_buf);
+  char *rname_on_stack = rname_buf->data;
+  char *rname = rname_on_stack;
+  bool end_in_extra_buffer = false;
+  bool failed = true;
 
   /* This is always zero for Posix hosts, but can be 2 for MS-Windows
      and MS-DOS X:/foo/bar file names.  */
-  prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
+  idx_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
 
   if (!IS_ABSOLUTE_FILE_NAME (name))
     {
-      if (!__getcwd (rpath, path_max))
+      while (!__getcwd (rname, rname_buf->length))
         {
-          rpath[0] = '\0';
-          goto error;
+          if (errno != ERANGE)
+            {
+              dest = rname;
+              goto error;
+            }
+          if (!scratch_buffer_grow (rname_buf))
+            goto error_nomem;
+          rname = rname_buf->data;
         }
-      dest = strchr (rpath, '\0');
+      dest = __rawmemchr (rname, '\0');
       start = name;
-      prefix_len = FILE_SYSTEM_PREFIX_LEN (rpath);
+      prefix_len = FILE_SYSTEM_PREFIX_LEN (rname);
     }
   else
     {
-      dest = rpath;
-      if (prefix_len)
-        {
-          memcpy (rpath, name, prefix_len);
-          dest += prefix_len;
-        }
+      dest = __mempcpy (rname, name, prefix_len);
       *dest++ = '/';
       if (DOUBLE_SLASH_IS_DISTINCT_ROOT)
         {
-          if (ISSLASH (name[1]) && !ISSLASH (name[2]) && !prefix_len)
+          if (prefix_len == 0 /* implies ISSLASH (name[0]) */
+              && ISSLASH (name[1]) && !ISSLASH (name[2]))
             *dest++ = '/';
           *dest = '\0';
         }
       start = name + prefix_len;
     }
 
-  for (end = start; *start; start = end)
+  for ( ; *start; start = end)
     {
-#ifdef _LIBC
-      struct stat64 st;
-#else
-      struct stat st;
-#endif
-
-      /* Skip sequence of multiple path-separators.  */
+      /* Skip sequence of multiple file name separators.  */
       while (ISSLASH (*start))
         ++start;
 
-      /* Find end of path component.  */
+      /* Find end of component.  */
       for (end = start; *end && !ISSLASH (*end); ++end)
         /* Nothing.  */;
 
-      if (end - start == 0)
+      /* Length of this file name component; it can be zero if a file
+         name ends in '/'.  */
+      idx_t startlen = end - start;
+
+      if (startlen == 0)
         break;
-      else if (end - start == 1 && start[0] == '.')
+      else if (startlen == 1 && start[0] == '.')
         /* nothing */;
-      else if (end - start == 2 && start[0] == '.' && start[1] == '.')
+      else if (startlen == 2 && start[0] == '.' && start[1] == '.')
         {
           /* Back up to previous component, ignore if at root already.  */
-          if (dest > rpath + prefix_len + 1)
-            for (--dest; dest > rpath && !ISSLASH (dest[-1]); --dest)
+          if (dest > rname + prefix_len + 1)
+            for (--dest; dest > rname && !ISSLASH (dest[-1]); --dest)
               continue;
           if (DOUBLE_SLASH_IS_DISTINCT_ROOT
-              && dest == rpath + 1 && !prefix_len
+              && dest == rname + 1 && !prefix_len
               && ISSLASH (*dest) && !ISSLASH (dest[1]))
             dest++;
         }
       else
         {
-          size_t new_size;
-
           if (!ISSLASH (dest[-1]))
             *dest++ = '/';
 
-          if (dest + (end - start) >= rpath_limit)
+          while (rname + rname_buf->length - dest
+                 < startlen + sizeof dir_suffix)
             {
-              ptrdiff_t dest_offset = dest - rpath;
-              char *new_rpath;
-
-              if (resolved)
-                {
-                  __set_errno (ENAMETOOLONG);
-                  if (dest > rpath + prefix_len + 1)
-                    dest--;
-                  *dest = '\0';
-                  goto error;
-                }
-              new_size = rpath_limit - rpath;
-              if (end - start + 1 > path_max)
-                new_size += end - start + 1;
-              else
-                new_size += path_max;
-              new_rpath = (char *) realloc (rpath, new_size);
-              if (new_rpath == NULL)
-                {
-                  alloc_failed ();
-                  goto error;
-                }
-              rpath = new_rpath;
-              rpath_limit = rpath + new_size;
-
-              dest = rpath + dest_offset;
+              idx_t dest_offset = dest - rname;
+              if (!scratch_buffer_grow_preserve (rname_buf))
+                goto error_nomem;
+              rname = rname_buf->data;
+              dest = rname + dest_offset;
             }
 
-#ifdef _LIBC
-          dest = __mempcpy (dest, start, end - start);
-#else
-          memcpy (dest, start, end - start);
-          dest += end - start;
-#endif
+          dest = __mempcpy (dest, start, startlen);
           *dest = '\0';
 
-          /* FIXME: if lstat fails with errno == EOVERFLOW,
-             the entry exists.  */
-#ifdef _LIBC
-          if (__lxstat64 (_STAT_VER, rpath, &st) < 0)
-#else
-          if (lstat (rpath, &st) < 0)
-#endif
-            goto error;
-
-          if (S_ISLNK (st.st_mode))
+          char *buf;
+          ssize_t n;
+          while (true)
             {
-              char *buf;
-              size_t len;
-              ssize_t n;
-
-              if (++num_links > MAXSYMLINKS)
+              buf = link_buffer.data;
+              idx_t bufsize = link_buffer.length;
+              n = __readlink (rname, buf, bufsize - 1);
+              if (n < bufsize - 1)
+                break;
+              if (!scratch_buffer_grow (&link_buffer))
+                goto error_nomem;
+            }
+          if (0 <= n)
+            {
+              if (++num_links > __eloop_threshold ())
                 {
                   __set_errno (ELOOP);
                   goto error;
                 }
 
-              buf = malloca (path_max);
-              if (!buf)
-                {
-                  __set_errno (ENOMEM);
-                  goto error;
-                }
-
-              n = __readlink (rpath, buf, path_max - 1);
-              if (n < 0)
-                {
-                  int saved_errno = errno;
-                  freea (buf);
-                  __set_errno (saved_errno);
-                  goto error;
-                }
               buf[n] = '\0';
 
-              if (!extra_buf)
+              char *extra_buf = extra_buffer.data;
+              idx_t end_idx IF_LINT (= 0);
+              if (end_in_extra_buffer)
+                end_idx = end - extra_buf;
+              size_t len = strlen (end);
+              if (INT_ADD_OVERFLOW (len, n))
                 {
-                  extra_buf = malloca (path_max);
-                  if (!extra_buf)
-                    {
-                      freea (buf);
-                      __set_errno (ENOMEM);
-                      goto error;
-                    }
+                  __set_errno (ENOMEM);
+                  goto error_nomem;
                 }
-
-              len = strlen (end);
-              /* Check that n + len + 1 doesn't overflow and is <= path_max. */
-              if (n >= SIZE_MAX - len || n + len >= path_max)
+              while (extra_buffer.length <= len + n)
                 {
-                  freea (buf);
-                  __set_errno (ENAMETOOLONG);
-                  goto error;
+                  if (!scratch_buffer_grow_preserve (&extra_buffer))
+                    goto error_nomem;
+                  extra_buf = extra_buffer.data;
                 }
+              if (end_in_extra_buffer)
+                end = extra_buf + end_idx;
 
               /* Careful here, end may be a pointer into extra_buf... */
               memmove (&extra_buf[n], end, len + 1);
               name = end = memcpy (extra_buf, buf, n);
+              end_in_extra_buffer = true;
 
               if (IS_ABSOLUTE_FILE_NAME (buf))
                 {
-                  size_t pfxlen = FILE_SYSTEM_PREFIX_LEN (buf);
+                  idx_t pfxlen = FILE_SYSTEM_PREFIX_LEN (buf);
 
-                  if (pfxlen)
-                    memcpy (rpath, buf, pfxlen);
-                  dest = rpath + pfxlen;
+                  dest = __mempcpy (rname, buf, pfxlen);
                   *dest++ = '/'; /* It's an absolute symlink */
                   if (DOUBLE_SLASH_IS_DISTINCT_ROOT)
                     {
@@ -353,46 +381,70 @@
                 {
                   /* Back up to previous component, ignore if at root
                      already: */
-                  if (dest > rpath + prefix_len + 1)
-                    for (--dest; dest > rpath && !ISSLASH (dest[-1]); --dest)
+                  if (dest > rname + prefix_len + 1)
+                    for (--dest; dest > rname && !ISSLASH (dest[-1]); --dest)
                       continue;
-                  if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rpath + 1
+                  if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1
                       && ISSLASH (*dest) && !ISSLASH (dest[1]) && !prefix_len)
                     dest++;
                 }
             }
-          else if (!S_ISDIR (st.st_mode) && *end != '\0')
-            {
-              __set_errno (ENOTDIR);
-              goto error;
-            }
+          else if (! (suffix_requires_dir_check (end)
+                      ? dir_check (rname, dest)
+                      : errno == EINVAL))
+            goto error;
         }
     }
-  if (dest > rpath + prefix_len + 1 && ISSLASH (dest[-1]))
+  if (dest > rname + prefix_len + 1 && ISSLASH (dest[-1]))
     --dest;
-  if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rpath + 1 && !prefix_len
+  if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1 && !prefix_len
       && ISSLASH (*dest) && !ISSLASH (dest[1]))
     dest++;
-  *dest = '\0';
-
-  if (extra_buf)
-    freea (extra_buf);
-
-  return rpath;
+  failed = false;
 
 error:
-  {
-    int saved_errno = errno;
-    if (extra_buf)
-      freea (extra_buf);
-    if (resolved == NULL)
-      free (rpath);
-    __set_errno (saved_errno);
-  }
-  return NULL;
+  *dest++ = '\0';
+  if (resolved != NULL && dest - rname <= get_path_max ())
+    rname = strcpy (resolved, rname);
+
+error_nomem:
+  scratch_buffer_free (&extra_buffer);
+  scratch_buffer_free (&link_buffer);
+
+  if (failed || rname == resolved)
+    {
+      scratch_buffer_free (rname_buf);
+      return failed ? NULL : resolved;
+    }
+
+  return scratch_buffer_dupfree (rname_buf, dest - rname);
 }
+
+/* Return the canonical absolute name of file NAME.  A canonical name
+   does not contain any ".", ".." components nor any repeated file name
+   separators ('/') or symlinks.  All file name components must exist.  If
+   RESOLVED is null, the result is malloc'd; otherwise, if the
+   canonical name is PATH_MAX chars or more, returns null with 'errno'
+   set to ENAMETOOLONG; if the name fits in fewer than PATH_MAX chars,
+   returns the name in RESOLVED.  If the name cannot be resolved and
+   RESOLVED is non-NULL, it contains the name of the first component
+   that cannot be resolved.  If the name can be resolved, RESOLVED
+   holds the same value as the value returned.  */
+
+char *
+__realpath (const char *name, char *resolved)
+{
+  #ifdef GCC_BOGUS_WRETURN_LOCAL_ADDR
+   #warning "GCC might issue a bogus -Wreturn-local-addr warning here."
+   #warning "See <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644>."
+  #endif
+  struct scratch_buffer rname_buffer;
+  return realpath_stk (name, resolved, &rname_buffer);
+}
+libc_hidden_def (__realpath)
 versioned_symbol (libc, __realpath, realpath, GLIBC_2_3);
-#endif /* !FUNC_REALPATH_WORKS || defined _LIBC */
+
+#endif /* defined _LIBC || !FUNC_REALPATH_WORKS */
 
 
 #if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3)
@@ -418,11 +470,3 @@
   return __realpath (name, NULL);
 }
 weak_alias (__canonicalize_file_name, canonicalize_file_name)
-
-#else
-
-/* This declaration is solely to ensure that after preprocessing
-   this file is never empty.  */
-typedef int dummy;
-
-#endif
diff --git a/lib/canonicalize.c b/lib/canonicalize.c
new file mode 100644
index 0000000..3a1c809
--- /dev/null
+++ b/lib/canonicalize.c
@@ -0,0 +1,489 @@
+/* Return the canonical absolute name of a given file.
+   Copyright (C) 1996-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "canonicalize.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <filename.h>
+#include <idx.h>
+#include <intprops.h>
+#include <scratch_buffer.h>
+
+#include "attribute.h"
+#include "file-set.h"
+#include "hash-triple.h"
+#include "xalloc.h"
+
+/* Suppress bogus GCC -Wmaybe-uninitialized warnings.  */
+#if defined GCC_LINT || defined lint
+# define IF_LINT(Code) Code
+#else
+# define IF_LINT(Code) /* empty */
+#endif
+
+#ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
+# define DOUBLE_SLASH_IS_DISTINCT_ROOT false
+#endif
+
+#if ISSLASH ('\\')
+# define SLASHES "/\\"
+#else
+# define SLASHES "/"
+#endif
+
+/* Return true if FILE's existence can be shown, false (setting errno)
+   otherwise.  Follow symbolic links.  */
+static bool
+file_accessible (char const *file)
+{
+# if HAVE_FACCESSAT
+  return faccessat (AT_FDCWD, file, F_OK, AT_EACCESS) == 0;
+# else
+  struct stat st;
+  return stat (file, &st) == 0 || errno == EOVERFLOW;
+# endif
+}
+
+/* True if concatenating END as a suffix to a file name means that the
+   code needs to check that the file name is that of a searchable
+   directory, since the canonicalize_filename_mode_stk code won't
+   check this later anyway when it checks an ordinary file name
+   component within END.  END must either be empty, or start with a
+   slash.  */
+
+static bool _GL_ATTRIBUTE_PURE
+suffix_requires_dir_check (char const *end)
+{
+  /* If END does not start with a slash, the suffix is OK.  */
+  while (ISSLASH (*end))
+    {
+      /* Two or more slashes act like a single slash.  */
+      do
+        end++;
+      while (ISSLASH (*end));
+
+      switch (*end++)
+        {
+        default: return false;  /* An ordinary file name component is OK.  */
+        case '\0': return true; /* Trailing "/" is trouble.  */
+        case '.': break;        /* Possibly "." or "..".  */
+        }
+      /* Trailing "/.", or "/.." even if not trailing, is trouble.  */
+      if (!*end || (*end == '.' && (!end[1] || ISSLASH (end[1]))))
+        return true;
+    }
+
+  return false;
+}
+
+/* Append this to a file name to test whether it is a searchable directory.
+   On POSIX platforms "/" suffices, but "/./" is sometimes needed on
+   macOS 10.13 <https://bugs.gnu.org/30350>, and should also work on
+   platforms like AIX 7.2 that need at least "/.".  */
+
+#ifdef LSTAT_FOLLOWS_SLASHED_SYMLINK
+static char const dir_suffix[] = "/";
+#else
+static char const dir_suffix[] = "/./";
+#endif
+
+/* Return true if DIR is a searchable dir, false (setting errno) otherwise.
+   DIREND points to the NUL byte at the end of the DIR string.
+   Store garbage into DIREND[0 .. strlen (dir_suffix)].  */
+
+static bool
+dir_check (char *dir, char *dirend)
+{
+  strcpy (dirend, dir_suffix);
+  return file_accessible (dir);
+}
+
+#if !((HAVE_CANONICALIZE_FILE_NAME && FUNC_REALPATH_WORKS)      \
+      || GNULIB_CANONICALIZE_LGPL)
+/* Return the canonical absolute name of file NAME.  A canonical name
+   does not contain any ".", ".." components nor any repeated file name
+   separators ('/') or symlinks.  All components must exist.
+   The result is malloc'd.  */
+
+char *
+canonicalize_file_name (const char *name)
+{
+  return canonicalize_filename_mode (name, CAN_EXISTING);
+}
+#endif /* !HAVE_CANONICALIZE_FILE_NAME */
+
+static bool
+multiple_bits_set (canonicalize_mode_t i)
+{
+  return (i & (i - 1)) != 0;
+}
+
+/* Return true if we've already seen the triple, <FILENAME, dev, ino>.
+   If *HT is not initialized, initialize it.  */
+static bool
+seen_triple (Hash_table **ht, char const *filename, struct stat const *st)
+{
+  if (*ht == NULL)
+    {
+      idx_t initial_capacity = 7;
+      *ht = hash_initialize (initial_capacity,
+                            NULL,
+                            triple_hash,
+                            triple_compare_ino_str,
+                            triple_free);
+      if (*ht == NULL)
+        xalloc_die ();
+    }
+
+  if (seen_file (*ht, filename, st))
+    return true;
+
+  record_file (*ht, filename, st);
+  return false;
+}
+
+
+/* Act like canonicalize_filename_mode (see below), with an additional argument
+   rname_buf that can be used as temporary storage.
+
+   If GCC_LINT is defined, do not inline this function with GCC 10.1
+   and later, to avoid creating a pointer to the stack that GCC
+   -Wreturn-local-addr incorrectly complains about.  See:
+   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644
+   Although the noinline attribute can hurt performance a bit, no better way
+   to pacify GCC is known; even an explicit #pragma does not pacify GCC.
+   When the GCC bug is fixed this workaround should be limited to the
+   broken GCC versions.  */
+#if _GL_GNUC_PREREQ (10, 1)
+# if defined GCC_LINT || defined lint
+__attribute__ ((__noinline__))
+# elif __OPTIMIZE__ && !__NO_INLINE__
+#  define GCC_BOGUS_WRETURN_LOCAL_ADDR
+# endif
+#endif
+static char *
+canonicalize_filename_mode_stk (const char *name, canonicalize_mode_t can_mode,
+                                struct scratch_buffer *rname_buf)
+{
+  char *dest;
+  char const *start;
+  char const *end;
+  Hash_table *ht = NULL;
+  bool logical = (can_mode & CAN_NOLINKS) != 0;
+  int num_links = 0;
+
+  canonicalize_mode_t can_exist = can_mode & CAN_MODE_MASK;
+  if (multiple_bits_set (can_exist))
+    {
+      errno = EINVAL;
+      return NULL;
+    }
+
+  if (name == NULL)
+    {
+      errno = EINVAL;
+      return NULL;
+    }
+
+  if (name[0] == '\0')
+    {
+      errno = ENOENT;
+      return NULL;
+    }
+
+  struct scratch_buffer extra_buffer, link_buffer;
+  scratch_buffer_init (&extra_buffer);
+  scratch_buffer_init (&link_buffer);
+  scratch_buffer_init (rname_buf);
+  char *rname_on_stack = rname_buf->data;
+  char *rname = rname_on_stack;
+  bool end_in_extra_buffer = false;
+  bool failed = true;
+
+  /* This is always zero for Posix hosts, but can be 2 for MS-Windows
+     and MS-DOS X:/foo/bar file names.  */
+  idx_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
+
+  if (!IS_ABSOLUTE_FILE_NAME (name))
+    {
+      while (!getcwd (rname, rname_buf->length))
+        {
+          switch (errno)
+            {
+            case ERANGE:
+              if (scratch_buffer_grow (rname_buf))
+                break;
+              FALLTHROUGH;
+            case ENOMEM:
+              xalloc_die ();
+
+            default:
+              dest = rname;
+              goto error;
+            }
+          rname = rname_buf->data;
+        }
+      dest = rawmemchr (rname, '\0');
+      start = name;
+      prefix_len = FILE_SYSTEM_PREFIX_LEN (rname);
+    }
+  else
+    {
+      dest = mempcpy (rname, name, prefix_len);
+      *dest++ = '/';
+      if (DOUBLE_SLASH_IS_DISTINCT_ROOT)
+        {
+          if (prefix_len == 0 /* implies ISSLASH (name[0]) */
+              && ISSLASH (name[1]) && !ISSLASH (name[2]))
+            {
+              *dest++ = '/';
+#if defined _WIN32 && !defined __CYGWIN__
+              /* For UNC file names '\\server\path\to\file', extend the prefix
+                 to include the server: '\\server\'.  */
+              {
+                idx_t i;
+                for (i = 2; name[i] != '\0' && !ISSLASH (name[i]); )
+                  i++;
+                if (name[i] != '\0' /* implies ISSLASH (name[i]) */
+                    && i + 1 < rname_buf->length)
+                  {
+                    prefix_len = i;
+                    memcpy (dest, name + 2, i - 2 + 1);
+                    dest += i - 2 + 1;
+                  }
+                else
+                  {
+                    /* Either name = '\\server'; this is an invalid file name.
+                       Or name = '\\server\...' and server is more than
+                       rname_buf->length - 4 bytes long.  In either
+                       case, stop the UNC processing.  */
+                  }
+              }
+#endif
+            }
+          *dest = '\0';
+        }
+      start = name + prefix_len;
+    }
+
+  for ( ; *start; start = end)
+    {
+      /* Skip sequence of multiple file name separators.  */
+      while (ISSLASH (*start))
+        ++start;
+
+      /* Find end of component.  */
+      for (end = start; *end && !ISSLASH (*end); ++end)
+        /* Nothing.  */;
+
+      /* Length of this file name component; it can be zero if a file
+         name ends in '/'.  */
+      idx_t startlen = end - start;
+
+      if (startlen == 0)
+        break;
+      else if (startlen == 1 && start[0] == '.')
+        /* nothing */;
+      else if (startlen == 2 && start[0] == '.' && start[1] == '.')
+        {
+          /* Back up to previous component, ignore if at root already.  */
+          if (dest > rname + prefix_len + 1)
+            for (--dest; dest > rname && !ISSLASH (dest[-1]); --dest)
+              continue;
+          if (DOUBLE_SLASH_IS_DISTINCT_ROOT
+              && dest == rname + 1 && !prefix_len
+              && ISSLASH (*dest) && !ISSLASH (dest[1]))
+            dest++;
+        }
+      else
+        {
+          if (!ISSLASH (dest[-1]))
+            *dest++ = '/';
+
+          while (rname + rname_buf->length - dest
+                 < startlen + sizeof dir_suffix)
+            {
+              idx_t dest_offset = dest - rname;
+              if (!scratch_buffer_grow_preserve (rname_buf))
+                xalloc_die ();
+              rname = rname_buf->data;
+              dest = rname + dest_offset;
+            }
+
+          dest = mempcpy (dest, start, startlen);
+          *dest = '\0';
+
+          char *buf;
+          ssize_t n = -1;
+          if (!logical)
+            {
+              while (true)
+                {
+                  buf = link_buffer.data;
+                  idx_t bufsize = link_buffer.length;
+                  n = readlink (rname, buf, bufsize - 1);
+                  if (n < bufsize - 1)
+                    break;
+                  if (!scratch_buffer_grow (&link_buffer))
+                    xalloc_die ();
+                }
+            }
+          if (0 <= n)
+            {
+              /* A physical traversal and RNAME is a symbolic link.  */
+
+              if (num_links < 20)
+                num_links++;
+              else if (*start)
+                {
+                  /* Enough symlinks have been seen that it is time to
+                     worry about being in a symlink cycle.
+                     Get the device and inode of the parent directory, as
+                     pre-2017 POSIX says this info is not reliable for
+                     symlinks.  */
+                  struct stat st;
+                  dest[- startlen] = '\0';
+                  if (stat (*rname ? rname : ".", &st) != 0)
+                    goto error;
+                  dest[- startlen] = *start;
+
+                  /* Detect loops.  We cannot use the cycle-check module here,
+                     since it's possible to encounter the same parent
+                     directory more than once in a given traversal.  However,
+                     encountering the same (parentdir, START) pair twice does
+                     indicate a loop.  */
+                  if (seen_triple (&ht, start, &st))
+                    {
+                      if (can_exist == CAN_MISSING)
+                        continue;
+                      errno = ELOOP;
+                      goto error;
+                    }
+                }
+
+              buf[n] = '\0';
+
+              char *extra_buf = extra_buffer.data;
+              idx_t end_idx IF_LINT (= 0);
+              if (end_in_extra_buffer)
+                end_idx = end - extra_buf;
+              size_t len = strlen (end);
+              if (INT_ADD_OVERFLOW (len, n))
+                xalloc_die ();
+              while (extra_buffer.length <= len + n)
+                {
+                  if (!scratch_buffer_grow_preserve (&extra_buffer))
+                    xalloc_die ();
+                  extra_buf = extra_buffer.data;
+                }
+              if (end_in_extra_buffer)
+                end = extra_buf + end_idx;
+
+              /* Careful here, end may be a pointer into extra_buf... */
+              memmove (&extra_buf[n], end, len + 1);
+              name = end = memcpy (extra_buf, buf, n);
+              end_in_extra_buffer = true;
+
+              if (IS_ABSOLUTE_FILE_NAME (buf))
+                {
+                  idx_t pfxlen = FILE_SYSTEM_PREFIX_LEN (buf);
+
+                  dest = mempcpy (rname, buf, pfxlen);
+                  *dest++ = '/'; /* It's an absolute symlink */
+                  if (DOUBLE_SLASH_IS_DISTINCT_ROOT)
+                    {
+                      if (ISSLASH (buf[1]) && !ISSLASH (buf[2]) && !pfxlen)
+                        *dest++ = '/';
+                      *dest = '\0';
+                    }
+                  /* Install the new prefix to be in effect hereafter.  */
+                  prefix_len = pfxlen;
+                }
+              else
+                {
+                  /* Back up to previous component, ignore if at root
+                     already: */
+                  if (dest > rname + prefix_len + 1)
+                    for (--dest; dest > rname && !ISSLASH (dest[-1]); --dest)
+                      continue;
+                  if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1
+                      && ISSLASH (*dest) && !ISSLASH (dest[1]) && !prefix_len)
+                    dest++;
+                }
+            }
+          else if (! (can_exist == CAN_MISSING
+                      || (suffix_requires_dir_check (end)
+                          ? dir_check (rname, dest)
+                          : !logical
+                          ? errno == EINVAL
+                          : *end || file_accessible (rname))
+                      || (can_exist == CAN_ALL_BUT_LAST
+                          && errno == ENOENT
+                          && !end[strspn (end, SLASHES)])))
+            goto error;
+        }
+    }
+  if (dest > rname + prefix_len + 1 && ISSLASH (dest[-1]))
+    --dest;
+  if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1 && !prefix_len
+      && ISSLASH (*dest) && !ISSLASH (dest[1]))
+    dest++;
+  failed = false;
+
+error:
+  if (ht)
+    hash_free (ht);
+  scratch_buffer_free (&extra_buffer);
+  scratch_buffer_free (&link_buffer);
+
+  if (failed)
+    {
+      scratch_buffer_free (rname_buf);
+      return NULL;
+    }
+
+  *dest++ = '\0';
+  char *result = scratch_buffer_dupfree (rname_buf, dest - rname);
+  if (!result)
+    xalloc_die ();
+  return result;
+}
+
+/* Return the canonical absolute name of file NAME, while treating
+   missing elements according to CAN_MODE.  A canonical name
+   does not contain any ".", ".." components nor any repeated file name
+   separators ('/') or, depending on other CAN_MODE flags, symlinks.
+   Whether components must exist or not depends on canonicalize mode.
+   The result is malloc'd.  */
+
+char *
+canonicalize_filename_mode (const char *name, canonicalize_mode_t can_mode)
+{
+  #ifdef GCC_BOGUS_WRETURN_LOCAL_ADDR
+   #warning "GCC might issue a bogus -Wreturn-local-addr warning here."
+   #warning "See <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644>."
+  #endif
+  struct scratch_buffer rname_buffer;
+  return canonicalize_filename_mode_stk (name, can_mode, &rname_buffer);
+}
diff --git a/lib/canonicalize.h b/lib/canonicalize.h
new file mode 100644
index 0000000..1f7a5fd
--- /dev/null
+++ b/lib/canonicalize.h
@@ -0,0 +1,58 @@
+/* Return the canonical absolute name of a given file.
+   Copyright (C) 1996-2007, 2009-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef CANONICALIZE_H_
+# define CANONICALIZE_H_
+
+#include <stdlib.h> /* for canonicalize_file_name */
+
+#define CAN_MODE_MASK (CAN_EXISTING | CAN_ALL_BUT_LAST | CAN_MISSING)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum canonicalize_mode_t
+  {
+    /* All components must exist.  */
+    CAN_EXISTING = 0,
+
+    /* All components excluding last one must exist.  */
+    CAN_ALL_BUT_LAST = 1,
+
+    /* No requirements on components existence.  */
+    CAN_MISSING = 2,
+
+    /* Don't expand symlinks.  */
+    CAN_NOLINKS = 4
+  };
+typedef enum canonicalize_mode_t canonicalize_mode_t;
+
+/* Return the canonical absolute name of file NAME, while treating
+   missing elements according to CAN_MODE.  A canonical name
+   does not contain any `.', `..' components nor any repeated file name
+   separators ('/') or, depending on other CAN_MODE flags, symlinks.
+   Whether components must exist or not depends on canonicalize mode.
+   The result is malloc'd.
+   Upon failure, return NULL with errno set.  */
+char *canonicalize_filename_mode (const char *, canonicalize_mode_t)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !CANONICALIZE_H_ */
diff --git a/lib/careadlinkat.c b/lib/careadlinkat.c
index 4803265..9d0c125 100644
--- a/lib/careadlinkat.c
+++ b/lib/careadlinkat.c
@@ -1,19 +1,19 @@
 /* Read symbolic links into a buffer without size limitation, relative to fd.
 
-   Copyright (C) 2001, 2003-2004, 2007, 2009-2019 Free Software Foundation,
+   Copyright (C) 2001, 2003-2004, 2007, 2009-2021 Free Software Foundation,
    Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Paul Eggert, Bruno Haible, and Jim Meyering.  */
@@ -22,6 +22,9 @@
 
 #include "careadlinkat.h"
 
+#include "idx.h"
+#include "minmax.h"
+
 #include <errno.h>
 #include <limits.h>
 #include <string.h>
@@ -38,6 +41,107 @@
 
 #include "allocator.h"
 
+enum { STACK_BUF_SIZE = 1024 };
+
+/* Act like careadlinkat (see below), with an additional argument
+   STACK_BUF that can be used as temporary storage.
+
+   If GCC_LINT is defined, do not inline this function with GCC 10.1
+   and later, to avoid creating a pointer to the stack that GCC
+   -Wreturn-local-addr incorrectly complains about.  See:
+   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644
+   Although the noinline attribute can hurt performance a bit, no better way
+   to pacify GCC is known; even an explicit #pragma does not pacify GCC.
+   When the GCC bug is fixed this workaround should be limited to the
+   broken GCC versions.  */
+#if _GL_GNUC_PREREQ (10, 1)
+# if defined GCC_LINT || defined lint
+__attribute__ ((__noinline__))
+# elif __OPTIMIZE__ && !__NO_INLINE__
+#  define GCC_BOGUS_WRETURN_LOCAL_ADDR
+# endif
+#endif
+static char *
+readlink_stk (int fd, char const *filename,
+              char *buffer, size_t buffer_size,
+              struct allocator const *alloc,
+              ssize_t (*preadlinkat) (int, char const *, char *, size_t),
+              char stack_buf[STACK_BUF_SIZE])
+{
+  if (! alloc)
+    alloc = &stdlib_allocator;
+
+  if (!buffer)
+    {
+      buffer = stack_buf;
+      buffer_size = STACK_BUF_SIZE;
+    }
+
+  char *buf = buffer;
+  idx_t buf_size_max = MIN (IDX_MAX, MIN (SSIZE_MAX, SIZE_MAX));
+  idx_t buf_size = MIN (buffer_size, buf_size_max);
+
+  while (buf)
+    {
+      /* Attempt to read the link into the current buffer.  */
+      idx_t link_length = preadlinkat (fd, filename, buf, buf_size);
+      if (link_length < 0)
+        {
+          if (buf != buffer)
+            {
+              int readlinkat_errno = errno;
+              alloc->free (buf);
+              errno = readlinkat_errno;
+            }
+          return NULL;
+        }
+
+      idx_t link_size = link_length;
+
+      if (link_size < buf_size)
+        {
+          buf[link_size++] = '\0';
+
+          if (buf == stack_buf)
+            {
+              char *b = alloc->allocate (link_size);
+              buf_size = link_size;
+              if (! b)
+                break;
+              return memcpy (b, buf, link_size);
+            }
+
+          if (link_size < buf_size && buf != buffer && alloc->reallocate)
+            {
+              /* Shrink BUF before returning it.  */
+              char *b = alloc->reallocate (buf, link_size);
+              if (b)
+                return b;
+            }
+
+          return buf;
+        }
+
+      if (buf != buffer)
+        alloc->free (buf);
+
+      if (buf_size_max / 2 <= buf_size)
+        {
+          errno = ENAMETOOLONG;
+          return NULL;
+        }
+
+      buf_size = 2 * buf_size + 1;
+      buf = alloc->allocate (buf_size);
+    }
+
+  if (alloc->die)
+    alloc->die (buf_size);
+  errno = ENOMEM;
+  return NULL;
+}
+
+
 /* Assuming the current directory is FD, get the symbolic link value
    of FILENAME as a null-terminated string and put it into a buffer.
    If FD is AT_FDCWD, FILENAME is interpreted relative to the current
@@ -66,95 +170,15 @@
               struct allocator const *alloc,
               ssize_t (*preadlinkat) (int, char const *, char *, size_t))
 {
-  char *buf;
-  size_t buf_size;
-  size_t buf_size_max =
-    SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX;
-  char stack_buf[1024];
-
-  if (! alloc)
-    alloc = &stdlib_allocator;
-
-  if (! buffer_size)
-    {
-      /* Allocate the initial buffer on the stack.  This way, in the
-         common case of a symlink of small size, we get away with a
-         single small malloc() instead of a big malloc() followed by a
-         shrinking realloc().  */
-      buffer = stack_buf;
-      buffer_size = sizeof stack_buf;
-    }
-
-  buf = buffer;
-  buf_size = buffer_size;
-
-  do
-    {
-      /* Attempt to read the link into the current buffer.  */
-      ssize_t link_length = preadlinkat (fd, filename, buf, buf_size);
-      size_t link_size;
-      if (link_length < 0)
-        {
-          /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1
-             with errno == ERANGE if the buffer is too small.  */
-          int readlinkat_errno = errno;
-          if (readlinkat_errno != ERANGE)
-            {
-              if (buf != buffer)
-                {
-                  alloc->free (buf);
-                  errno = readlinkat_errno;
-                }
-              return NULL;
-            }
-        }
-
-      link_size = link_length;
-
-      if (link_size < buf_size)
-        {
-          buf[link_size++] = '\0';
-
-          if (buf == stack_buf)
-            {
-              char *b = (char *) alloc->allocate (link_size);
-              buf_size = link_size;
-              if (! b)
-                break;
-              memcpy (b, buf, link_size);
-              buf = b;
-            }
-          else if (link_size < buf_size && buf != buffer && alloc->reallocate)
-            {
-              /* Shrink BUF before returning it.  */
-              char *b = (char *) alloc->reallocate (buf, link_size);
-              if (b)
-                buf = b;
-            }
-
-          return buf;
-        }
-
-      if (buf != buffer)
-        alloc->free (buf);
-
-      if (buf_size <= buf_size_max / 2)
-        buf_size *= 2;
-      else if (buf_size < buf_size_max)
-        buf_size = buf_size_max;
-      else if (buf_size_max < SIZE_MAX)
-        {
-          errno = ENAMETOOLONG;
-          return NULL;
-        }
-      else
-        break;
-      buf = (char *) alloc->allocate (buf_size);
-    }
-  while (buf);
-
-  if (alloc->die)
-    alloc->die (buf_size);
-  errno = ENOMEM;
-  return NULL;
+  /* Allocate the initial buffer on the stack.  This way, in the
+     common case of a symlink of small size, we get away with a
+     single small malloc instead of a big malloc followed by a
+     shrinking realloc.  */
+  #ifdef GCC_BOGUS_WRETURN_LOCAL_ADDR
+   #warning "GCC might issue a bogus -Wreturn-local-addr warning here."
+   #warning "See <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644>."
+  #endif
+  char stack_buf[STACK_BUF_SIZE];
+  return readlink_stk (fd, filename, buffer, buffer_size, alloc,
+                       preadlinkat, stack_buf);
 }
diff --git a/lib/careadlinkat.h b/lib/careadlinkat.h
index 3c08fd6..a3517b8 100644
--- a/lib/careadlinkat.h
+++ b/lib/careadlinkat.h
@@ -1,18 +1,18 @@
 /* Read symbolic links into a buffer without size limitation, relative to fd.
 
-   Copyright (C) 2011-2019 Free Software Foundation, Inc.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Paul Eggert, Bruno Haible, and Jim Meyering.  */
@@ -47,7 +47,7 @@
    set errno.  */
 
 char *careadlinkat (int fd, char const *filename,
-                    char *buffer, size_t buffer_size,
+                    char *restrict buffer, size_t buffer_size,
                     struct allocator const *alloc,
                     ssize_t (*preadlinkat) (int, char const *,
                                             char *, size_t));
diff --git a/lib/cdefs.h b/lib/cdefs.h
index 96d2616..4dac9d2 100644
--- a/lib/cdefs.h
+++ b/lib/cdefs.h
@@ -1,17 +1,17 @@
-/* Copyright (C) 1992-2019 Free Software Foundation, Inc.
+/* Copyright (C) 1992-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public
+   modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
-   version 3 of the License, or (at your option) any later version.
+   version 2.1 of the License, or (at your option) any later version.
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
+   You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
@@ -25,7 +25,7 @@
 
 /* The GNU libc does not support any K&R compilers or the traditional mode
    of ISO C compilers anymore.  Check for some of the combinations not
-   anymore supported.  */
+   supported anymore.  */
 #if defined __GNUC__ && !defined __STDC__
 # error "You need a ISO C conforming compiler to use the glibc headers"
 #endif
@@ -34,7 +34,29 @@
 #undef	__P
 #undef	__PMT
 
-#ifdef __GNUC__
+/* Compilers that lack __has_attribute may object to
+       #if defined __has_attribute && __has_attribute (...)
+   even though they do not need to evaluate the right-hand side of the &&.
+   Similarly for __has_builtin, etc.  */
+#if (defined __has_attribute \
+     && (!defined __clang_minor__ \
+         || 3 < __clang_major__ + (5 <= __clang_minor__)))
+# define __glibc_has_attribute(attr) __has_attribute (attr)
+#else
+# define __glibc_has_attribute(attr) 0
+#endif
+#ifdef __has_builtin
+# define __glibc_has_builtin(name) __has_builtin (name)
+#else
+# define __glibc_has_builtin(name) 0
+#endif
+#ifdef __has_extension
+# define __glibc_has_extension(ext) __has_extension (ext)
+#else
+# define __glibc_has_extension(ext) 0
+#endif
+
+#if defined __GNUC__ || defined __clang__
 
 /* All functions, except those with callbacks or those that
    synchronize memory, are leaf functions.  */
@@ -47,21 +69,26 @@
 # endif
 
 /* GCC can always grok prototypes.  For C++ programs we add throw()
-   to help it optimize the function calls.  But this works only with
-   gcc 2.8.x and egcs.  For gcc 3.2 and up we even mark C functions
+   to help it optimize the function calls.  But this only works with
+   gcc 2.8.x and egcs.  For gcc 3.4 and up we even mark C functions
    as non-throwing using a function attribute since programs can use
    the -fexceptions options for C code as well.  */
-# if !defined __cplusplus && __GNUC_PREREQ (3, 3)
+# if !defined __cplusplus \
+     && (__GNUC_PREREQ (3, 4) || __glibc_has_attribute (__nothrow__))
 #  define __THROW	__attribute__ ((__nothrow__ __LEAF))
 #  define __THROWNL	__attribute__ ((__nothrow__))
 #  define __NTH(fct)	__attribute__ ((__nothrow__ __LEAF)) fct
 #  define __NTHNL(fct)  __attribute__ ((__nothrow__)) fct
 # else
-#  if defined __cplusplus && __GNUC_PREREQ (2,8)
-#   define __THROW	throw ()
-#   define __THROWNL	throw ()
-#   define __NTH(fct)	__LEAF_ATTR fct throw ()
-#   define __NTHNL(fct) fct throw ()
+#  if defined __cplusplus && (__GNUC_PREREQ (2,8) || __clang_major >= 4)
+#   if __cplusplus >= 201103L
+#    define __THROW	noexcept (true)
+#   else
+#    define __THROW	throw ()
+#   endif
+#   define __THROWNL	__THROW
+#   define __NTH(fct)	__LEAF_ATTR fct __THROW
+#   define __NTHNL(fct) fct __THROW
 #  else
 #   define __THROW
 #   define __THROWNL
@@ -70,7 +97,7 @@
 #  endif
 # endif
 
-#else	/* Not GCC.  */
+#else	/* Not GCC or clang.  */
 
 # if (defined __cplusplus						\
       || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L))
@@ -83,16 +110,7 @@
 # define __THROWNL
 # define __NTH(fct)	fct
 
-#endif	/* GCC.  */
-
-/* Compilers that are not clang may object to
-       #if defined __clang__ && __has_extension(...)
-   even though they do not need to evaluate the right-hand side of the &&.  */
-#if defined __clang__ && defined __has_extension
-# define __glibc_clang_has_extension(ext) __has_extension (ext)
-#else
-# define __glibc_clang_has_extension(ext) 0
-#endif
+#endif	/* GCC || clang.  */
 
 /* These two macros are not used in glibc anymore.  They are kept here
    only because some other projects expect the macros to be defined.  */
@@ -123,14 +141,20 @@
 #define __bos(ptr) __builtin_object_size (ptr, __USE_FORTIFY_LEVEL > 1)
 #define __bos0(ptr) __builtin_object_size (ptr, 0)
 
+/* Use __builtin_dynamic_object_size at _FORTIFY_SOURCE=3 when available.  */
+#if __USE_FORTIFY_LEVEL == 3 && __glibc_clang_prereq (9, 0)
+# define __glibc_objsize0(__o) __builtin_dynamic_object_size (__o, 0)
+# define __glibc_objsize(__o) __builtin_dynamic_object_size (__o, 1)
+#else
+# define __glibc_objsize0(__o) __bos0 (__o)
+# define __glibc_objsize(__o) __bos (__o)
+#endif
+
 #if __GNUC_PREREQ (4,3)
-# define __warndecl(name, msg) \
-  extern void name (void) __attribute__((__warning__ (msg)))
 # define __warnattr(msg) __attribute__((__warning__ (msg)))
 # define __errordecl(name, msg) \
   extern void name (void) __attribute__((__error__ (msg)))
 #else
-# define __warndecl(name, msg) extern void name (void)
 # define __warnattr(msg)
 # define __errordecl(name, msg) extern void name (void)
 #endif
@@ -142,8 +166,8 @@
 #if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L && !defined __HP_cc
 # define __flexarr	[]
 # define __glibc_c99_flexarr_available 1
-#elif __GNUC_PREREQ (2,97)
-/* GCC 2.97 supports C99 flexible array members as an extension,
+#elif __GNUC_PREREQ (2,97) || defined __clang__
+/* GCC 2.97 and clang support C99 flexible array members as an extension,
    even when in C89 mode or compiling C++ (any version).  */
 # define __flexarr	[]
 # define __glibc_c99_flexarr_available 1
@@ -169,7 +193,7 @@
    Example:
    int __REDIRECT(setpgrp, (__pid_t pid, __pid_t pgrp), setpgid); */
 
-#if defined __GNUC__ && __GNUC__ >= 2
+#if (defined __GNUC__ && __GNUC__ >= 2) || (__clang_major__ >= 4)
 
 # define __REDIRECT(name, proto, alias) name proto __asm__ (__ASMNAME (#alias))
 # ifdef __cplusplus
@@ -194,17 +218,17 @@
 */
 #endif
 
-/* GCC has various useful declarations that can be made with the
-   `__attribute__' syntax.  All of the ways we use this do fine if
-   they are omitted for compilers that don't understand it. */
-#if !defined __GNUC__ || __GNUC__ < 2
+/* GCC and clang have various useful declarations that can be made with
+   the '__attribute__' syntax.  All of the ways we use this do fine if
+   they are omitted for compilers that don't understand it.  */
+#if !(defined __GNUC__ || defined __clang__)
 # define __attribute__(xyz)	/* Ignore */
 #endif
 
 /* At some point during the gcc 2.96 development the `malloc' attribute
    for functions was introduced.  We don't want to use it unconditionally
    (although this would be possible) since it generates warnings.  */
-#if __GNUC_PREREQ (2,96)
+#if __GNUC_PREREQ (2,96) || __glibc_has_attribute (__malloc__)
 # define __attribute_malloc__ __attribute__ ((__malloc__))
 #else
 # define __attribute_malloc__ /* Ignore */
@@ -222,23 +246,29 @@
 /* At some point during the gcc 2.96 development the `pure' attribute
    for functions was introduced.  We don't want to use it unconditionally
    (although this would be possible) since it generates warnings.  */
-#if __GNUC_PREREQ (2,96)
+#if __GNUC_PREREQ (2,96) || __glibc_has_attribute (__pure__)
 # define __attribute_pure__ __attribute__ ((__pure__))
 #else
 # define __attribute_pure__ /* Ignore */
 #endif
 
 /* This declaration tells the compiler that the value is constant.  */
-#if __GNUC_PREREQ (2,5)
+#if __GNUC_PREREQ (2,5) || __glibc_has_attribute (__const__)
 # define __attribute_const__ __attribute__ ((__const__))
 #else
 # define __attribute_const__ /* Ignore */
 #endif
 
+#if __GNUC_PREREQ (2,7) || __glibc_has_attribute (__unused__)
+# define __attribute_maybe_unused__ __attribute__ ((__unused__))
+#else
+# define __attribute_maybe_unused__ /* Ignore */
+#endif
+
 /* At some point during the gcc 3.1 development the `used' attribute
    for functions was introduced.  We don't want to use it unconditionally
    (although this would be possible) since it generates warnings.  */
-#if __GNUC_PREREQ (3,1)
+#if __GNUC_PREREQ (3,1) || __glibc_has_attribute (__used__)
 # define __attribute_used__ __attribute__ ((__used__))
 # define __attribute_noinline__ __attribute__ ((__noinline__))
 #else
@@ -247,7 +277,7 @@
 #endif
 
 /* Since version 3.2, gcc allows marking deprecated functions.  */
-#if __GNUC_PREREQ (3,2)
+#if __GNUC_PREREQ (3,2) || __glibc_has_attribute (__deprecated__)
 # define __attribute_deprecated__ __attribute__ ((__deprecated__))
 #else
 # define __attribute_deprecated__ /* Ignore */
@@ -256,8 +286,8 @@
 /* Since version 4.5, gcc also allows one to specify the message printed
    when a deprecated function is used.  clang claims to be gcc 4.2, but
    may also support this feature.  */
-#if __GNUC_PREREQ (4,5) || \
-    __glibc_clang_has_extension (__attribute_deprecated_with_message__)
+#if __GNUC_PREREQ (4,5) \
+    || __glibc_has_extension (__attribute_deprecated_with_message__)
 # define __attribute_deprecated_msg__(msg) \
 	 __attribute__ ((__deprecated__ (msg)))
 #else
@@ -270,7 +300,7 @@
    If several `format_arg' attributes are given for the same function, in
    gcc-3.0 and older, all but the last one are ignored.  In newer gccs,
    all designated arguments are considered.  */
-#if __GNUC_PREREQ (2,8)
+#if __GNUC_PREREQ (2,8) || __glibc_has_attribute (__format_arg__)
 # define __attribute_format_arg__(x) __attribute__ ((__format_arg__ (x)))
 #else
 # define __attribute_format_arg__(x) /* Ignore */
@@ -280,7 +310,7 @@
    attribute for functions was introduced.  We don't want to use it
    unconditionally (although this would be possible) since it
    generates warnings.  */
-#if __GNUC_PREREQ (2,97)
+#if __GNUC_PREREQ (2,97) || __glibc_has_attribute (__format__)
 # define __attribute_format_strfmon__(a,b) \
   __attribute__ ((__format__ (__strfmon__, a, b)))
 #else
@@ -288,19 +318,33 @@
 #endif
 
 /* The nonnull function attribute marks pointer parameters that
-   must not be NULL.  Do not define __nonnull if it is already defined,
-   for portability when this file is used in Gnulib.  */
-#ifndef __nonnull
-# if __GNUC_PREREQ (3,3)
-#  define __nonnull(params) __attribute__ ((__nonnull__ params))
+   must not be NULL.  This has the name __nonnull in glibc,
+   and __attribute_nonnull__ in files shared with Gnulib to avoid
+   collision with a different __nonnull in DragonFlyBSD 5.9.  */
+#ifndef __attribute_nonnull__
+# if __GNUC_PREREQ (3,3) || __glibc_has_attribute (__nonnull__)
+#  define __attribute_nonnull__(params) __attribute__ ((__nonnull__ params))
 # else
-#  define __nonnull(params)
+#  define __attribute_nonnull__(params)
+# endif
+#endif
+#ifndef __nonnull
+# define __nonnull(params) __attribute_nonnull__ (params)
+#endif
+
+/* The returns_nonnull function attribute marks the return type of the function
+   as always being non-null.  */
+#ifndef __returns_nonnull
+# if __GNUC_PREREQ (4, 9) || __glibc_has_attribute (__returns_nonnull__)
+# define __returns_nonnull __attribute__ ((__returns_nonnull__))
+# else
+# define __returns_nonnull
 # endif
 #endif
 
 /* If fortification mode, we warn about unused results of certain
    function calls which can lead to problems.  */
-#if __GNUC_PREREQ (3,4)
+#if __GNUC_PREREQ (3,4) || __glibc_has_attribute (__warn_unused_result__)
 # define __attribute_warn_unused_result__ \
    __attribute__ ((__warn_unused_result__))
 # if defined __USE_FORTIFY_LEVEL && __USE_FORTIFY_LEVEL > 0
@@ -314,7 +358,7 @@
 #endif
 
 /* Forces a function to be always inlined.  */
-#if __GNUC_PREREQ (3,2)
+#if __GNUC_PREREQ (3,2) || __glibc_has_attribute (__always_inline__)
 /* The Linux kernel defines __always_inline in stddef.h (283d7573), and
    it conflicts with this definition.  Therefore undefine it first to
    allow either header to be included first.  */
@@ -327,7 +371,7 @@
 
 /* Associate error messages with the source location of the call site rather
    than with the source location inside the function.  */
-#if __GNUC_PREREQ (4,3)
+#if __GNUC_PREREQ (4,3) || __glibc_has_attribute (__artificial__)
 # define __attribute_artificial__ __attribute__ ((__artificial__))
 #else
 # define __attribute_artificial__ /* Ignore */
@@ -370,12 +414,14 @@
    run in pedantic mode if the uses are carefully marked using the
    `__extension__' keyword.  But this is not generally available before
    version 2.8.  */
-#if !__GNUC_PREREQ (2,8)
+#if !(__GNUC_PREREQ (2,8) || defined __clang__)
 # define __extension__		/* Ignore */
 #endif
 
-/* __restrict is known in EGCS 1.2 and above. */
-#if !__GNUC_PREREQ (2,92)
+/* __restrict is known in EGCS 1.2 and above, and in clang.
+   It works also in C++ mode (outside of arrays), but only when spelled
+   as '__restrict', not 'restrict'.  */
+#if !(__GNUC_PREREQ (2,92) || __clang_major__ >= 3)
 # if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
 #  define __restrict	restrict
 # else
@@ -385,8 +431,9 @@
 
 /* ISO C99 also allows to declare arrays as non-overlapping.  The syntax is
      array_name[restrict]
-   GCC 3.1 supports this.  */
-#if __GNUC_PREREQ (3,1) && !defined __GNUG__
+   GCC 3.1 and clang support this.
+   This syntax is not usable in C++ mode.  */
+#if (__GNUC_PREREQ (3,1) || __clang_major__ >= 3) && !defined __cplusplus
 # define __restrict_arr	__restrict
 #else
 # ifdef __GNUC__
@@ -401,7 +448,7 @@
 # endif
 #endif
 
-#if __GNUC__ >= 3
+#if (__GNUC__ >= 3) || __glibc_has_builtin (__builtin_expect)
 # define __glibc_unlikely(cond)	__builtin_expect ((cond), 0)
 # define __glibc_likely(cond)	__builtin_expect ((cond), 1)
 #else
@@ -409,15 +456,10 @@
 # define __glibc_likely(cond)	(cond)
 #endif
 
-#ifdef __has_attribute
-# define __glibc_has_attribute(attr)	__has_attribute (attr)
-#else
-# define __glibc_has_attribute(attr)	0
-#endif
-
 #if (!defined _Noreturn \
      && (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
-     &&  !__GNUC_PREREQ (4,7))
+     &&  !(__GNUC_PREREQ (4,7) \
+           || (3 < __clang_major__ + (5 <= __clang_minor__))))
 # if __GNUC_PREREQ (2,8)
 #  define _Noreturn __attribute__ ((__noreturn__))
 # else
@@ -434,22 +476,63 @@
 # define __attribute_nonstring__
 #endif
 
+/* Undefine (also defined in libc-symbols.h).  */
+#undef __attribute_copy__
+#if __GNUC_PREREQ (9, 0)
+/* Copies attributes from the declaration or type referenced by
+   the argument.  */
+# define __attribute_copy__(arg) __attribute__ ((__copy__ (arg)))
+#else
+# define __attribute_copy__(arg)
+#endif
+
 #if (!defined _Static_assert && !defined __cplusplus \
      && (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
-     && (!__GNUC_PREREQ (4, 6) || defined __STRICT_ANSI__))
+     && (!(__GNUC_PREREQ (4, 6) || __clang_major__ >= 4) \
+         || defined __STRICT_ANSI__))
 # define _Static_assert(expr, diagnostic) \
     extern int (*__Static_assert_function (void)) \
       [!!sizeof (struct { int __error_if_negative: (expr) ? 2 : -1; })]
 #endif
 
-/* The #ifndef lets Gnulib avoid including these on non-glibc
-   platforms, where the includes typically do not exist.  */
-#ifndef __WORDSIZE
+/* Gnulib avoids including these, as they don't work on non-glibc or
+   older glibc platforms.  */
+#ifndef __GNULIB_CDEFS
 # include <bits/wordsize.h>
 # include <bits/long-double.h>
 #endif
 
-#if defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH
+#if __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
+# ifdef __REDIRECT
+
+/* Alias name defined automatically.  */
+#  define __LDBL_REDIR(name, proto) ... unused__ldbl_redir
+#  define __LDBL_REDIR_DECL(name) \
+  extern __typeof (name) name __asm (__ASMNAME ("__" #name "ieee128"));
+
+/* Alias name defined automatically, with leading underscores.  */
+#  define __LDBL_REDIR2_DECL(name) \
+  extern __typeof (__##name) __##name \
+    __asm (__ASMNAME ("__" #name "ieee128"));
+
+/* Alias name defined manually.  */
+#  define __LDBL_REDIR1(name, proto, alias) ... unused__ldbl_redir1
+#  define __LDBL_REDIR1_DECL(name, alias) \
+  extern __typeof (name) name __asm (__ASMNAME (#alias));
+
+#  define __LDBL_REDIR1_NTH(name, proto, alias) \
+  __REDIRECT_NTH (name, proto, alias)
+#  define __REDIRECT_NTH_LDBL(name, proto, alias) \
+  __LDBL_REDIR1_NTH (name, proto, __##alias##ieee128)
+
+/* Unused.  */
+#  define __REDIRECT_LDBL(name, proto, alias) ... unused__redirect_ldbl
+#  define __LDBL_REDIR_NTH(name, proto) ... unused__ldbl_redir_nth
+
+# else
+_Static_assert (0, "IEEE 128-bits long double requires redirection on this platform");
+# endif
+#elif defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH
 # define __LDBL_COMPAT 1
 # ifdef __REDIRECT
 #  define __LDBL_REDIR1(name, proto, alias) __REDIRECT (name, proto, alias)
@@ -458,6 +541,8 @@
 #  define __LDBL_REDIR1_NTH(name, proto, alias) __REDIRECT_NTH (name, proto, alias)
 #  define __LDBL_REDIR_NTH(name, proto) \
   __LDBL_REDIR1_NTH (name, proto, __nldbl_##name)
+#  define __LDBL_REDIR2_DECL(name) \
+  extern __typeof (__##name) __##name __asm (__ASMNAME ("__nldbl___" #name));
 #  define __LDBL_REDIR1_DECL(name, alias) \
   extern __typeof (name) name __asm (__ASMNAME (#alias));
 #  define __LDBL_REDIR_DECL(name) \
@@ -468,11 +553,13 @@
   __LDBL_REDIR1_NTH (name, proto, __nldbl_##alias)
 # endif
 #endif
-#if !defined __LDBL_COMPAT || !defined __REDIRECT
+#if (!defined __LDBL_COMPAT && __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 0) \
+    || !defined __REDIRECT
 # define __LDBL_REDIR1(name, proto, alias) name proto
 # define __LDBL_REDIR(name, proto) name proto
 # define __LDBL_REDIR1_NTH(name, proto, alias) name proto __THROW
 # define __LDBL_REDIR_NTH(name, proto) name proto __THROW
+# define __LDBL_REDIR2_DECL(name)
 # define __LDBL_REDIR_DECL(name)
 # ifdef __REDIRECT
 #  define __REDIRECT_LDBL(name, proto, alias) __REDIRECT (name, proto, alias)
@@ -503,7 +590,7 @@
    check is required to enable the use of generic selection.  */
 #if !defined __cplusplus \
     && (__GNUC_PREREQ (4, 9) \
-	|| __glibc_clang_has_extension (c_generic_selections) \
+	|| __glibc_has_extension (c_generic_selections) \
 	|| (!defined __GNUC__ && defined __STDC_VERSION__ \
 	    && __STDC_VERSION__ >= 201112L))
 # define __HAVE_GENERIC_SELECTION 1
@@ -511,4 +598,40 @@
 # define __HAVE_GENERIC_SELECTION 0
 #endif
 
+#if __GNUC_PREREQ (10, 0)
+/* Designates a 1-based positional argument ref-index of pointer type
+   that can be used to access size-index elements of the pointed-to
+   array according to access mode, or at least one element when
+   size-index is not provided:
+     access (access-mode, <ref-index> [, <size-index>])  */
+#  define __attr_access(x) __attribute__ ((__access__ x))
+#  if __GNUC_PREREQ (11, 0)
+#    define __attr_access_none(argno) __attribute__ ((__access__ (__none__, argno)))
+#  else
+#    define __attr_access_none(argno)
+#  endif
+#else
+#  define __attr_access(x)
+#  define __attr_access_none(argno)
+#endif
+
+#if __GNUC_PREREQ (11, 0)
+/* Designates dealloc as a function to call to deallocate objects
+   allocated by the declared function.  */
+# define __attr_dealloc(dealloc, argno) \
+    __attribute__ ((__malloc__ (dealloc, argno)))
+# define __attr_dealloc_free __attr_dealloc (__builtin_free, 1)
+#else
+# define __attr_dealloc(dealloc, argno)
+# define __attr_dealloc_free
+#endif
+
+/* Specify that a function such as setjmp or vfork may return
+   twice.  */
+#if __GNUC_PREREQ (4, 1)
+# define __attribute_returns_twice__ __attribute__ ((__returns_twice__))
+#else
+# define __attribute_returns_twice__ /* Ignore.  */
+#endif
+
 #endif	 /* sys/cdefs.h */
diff --git a/lib/chdir-long.c b/lib/chdir-long.c
new file mode 100644
index 0000000..0d693b0
--- /dev/null
+++ b/lib/chdir-long.c
@@ -0,0 +1,264 @@
+/* provide a chdir function that tries not to fail due to ENAMETOOLONG
+   Copyright (C) 2004-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "chdir-long.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "assure.h"
+
+#ifndef PATH_MAX
+# error "compile this file only if your system defines PATH_MAX"
+#endif
+
+/* The results of openat() in this file are not leaked to any
+   single-threaded code that could use stdio.
+   FIXME - if the kernel ever adds support for multi-thread safety for
+   avoiding standard fds, then we should use openat_safer.  */
+
+struct cd_buf
+{
+  int fd;
+};
+
+static void
+cdb_init (struct cd_buf *cdb)
+{
+  cdb->fd = AT_FDCWD;
+}
+
+static int
+cdb_fchdir (struct cd_buf const *cdb)
+{
+  return fchdir (cdb->fd);
+}
+
+static void
+cdb_free (struct cd_buf const *cdb)
+{
+  if (0 <= cdb->fd)
+    {
+      bool close_fail = close (cdb->fd);
+      assure (! close_fail);
+    }
+}
+
+/* Given a file descriptor of an open directory (or AT_FDCWD), CDB->fd,
+   try to open the CDB->fd-relative directory, DIR.  If the open succeeds,
+   update CDB->fd with the resulting descriptor, close the incoming file
+   descriptor, and return zero.  Upon failure, return -1 and set errno.  */
+static int
+cdb_advance_fd (struct cd_buf *cdb, char const *dir)
+{
+  int new_fd = openat (cdb->fd, dir,
+                       O_SEARCH | O_DIRECTORY | O_NOCTTY | O_NONBLOCK);
+  if (new_fd < 0)
+    return -1;
+
+  cdb_free (cdb);
+  cdb->fd = new_fd;
+
+  return 0;
+}
+
+/* Return a pointer to the first non-slash in S.  */
+static char * _GL_ATTRIBUTE_PURE
+find_non_slash (char const *s)
+{
+  size_t n_slash = strspn (s, "/");
+  return (char *) s + n_slash;
+}
+
+/* This is a function much like chdir, but without the PATH_MAX limitation
+   on the length of the directory name.  A significant difference is that
+   it must be able to modify (albeit only temporarily) the directory
+   name.  It handles an arbitrarily long directory name by operating
+   on manageable portions of the name.  On systems without the openat
+   syscall, this means changing the working directory to more and more
+   "distant" points along the long directory name and then restoring
+   the working directory.  If any of those attempts to save or restore
+   the working directory fails, this function exits nonzero.
+
+   Note that this function may still fail with errno == ENAMETOOLONG, but
+   only if the specified directory name contains a component that is long
+   enough to provoke such a failure all by itself (e.g. if the component
+   has length PATH_MAX or greater on systems that define PATH_MAX).  */
+
+int
+chdir_long (char *dir)
+{
+  int e = chdir (dir);
+  if (e == 0 || errno != ENAMETOOLONG)
+    return e;
+
+  {
+    size_t len = strlen (dir);
+    char *dir_end = dir + len;
+    struct cd_buf cdb;
+    size_t n_leading_slash;
+
+    cdb_init (&cdb);
+
+    /* If DIR is the empty string, then the chdir above
+       must have failed and set errno to ENOENT.  */
+    assure (0 < len);
+    assure (PATH_MAX <= len);
+
+    /* Count leading slashes.  */
+    n_leading_slash = strspn (dir, "/");
+
+    /* Handle any leading slashes as well as any name that matches
+       the regular expression, m!^//hostname[/]*! .  Handling this
+       prefix separately usually results in a single additional
+       cdb_advance_fd call, but it's worthwhile, since it makes the
+       code in the following loop cleaner.  */
+    if (n_leading_slash == 2)
+      {
+        int err;
+        /* Find next slash.
+           We already know that dir[2] is neither a slash nor '\0'.  */
+        char *slash = memchr (dir + 3, '/', dir_end - (dir + 3));
+        if (slash == NULL)
+          {
+            errno = ENAMETOOLONG;
+            return -1;
+          }
+        *slash = '\0';
+        err = cdb_advance_fd (&cdb, dir);
+        *slash = '/';
+        if (err != 0)
+          goto Fail;
+        dir = find_non_slash (slash + 1);
+      }
+    else if (n_leading_slash)
+      {
+        if (cdb_advance_fd (&cdb, "/") != 0)
+          goto Fail;
+        dir += n_leading_slash;
+      }
+
+    assure (*dir != '/');
+    assure (dir <= dir_end);
+
+    while (PATH_MAX <= dir_end - dir)
+      {
+        int err;
+        /* Find a slash that is PATH_MAX or fewer bytes away from dir.
+           I.e. see if there is a slash that will give us a name of
+           length PATH_MAX-1 or less.  */
+        char *slash = memrchr (dir, '/', PATH_MAX);
+        if (slash == NULL)
+          {
+            errno = ENAMETOOLONG;
+            return -1;
+          }
+
+        *slash = '\0';
+        assure (slash - dir < PATH_MAX);
+        err = cdb_advance_fd (&cdb, dir);
+        *slash = '/';
+        if (err != 0)
+          goto Fail;
+
+        dir = find_non_slash (slash + 1);
+      }
+
+    if (dir < dir_end)
+      {
+        if (cdb_advance_fd (&cdb, dir) != 0)
+          goto Fail;
+      }
+
+    if (cdb_fchdir (&cdb) != 0)
+      goto Fail;
+
+    cdb_free (&cdb);
+    return 0;
+
+   Fail:
+    {
+      int saved_errno = errno;
+      cdb_free (&cdb);
+      errno = saved_errno;
+      return -1;
+    }
+  }
+}
+
+#if TEST_CHDIR
+
+# include "closeout.h"
+# include "error.h"
+
+int
+main (int argc, char *argv[])
+{
+  char *line = NULL;
+  size_t n = 0;
+  int len;
+
+  atexit (close_stdout);
+
+  len = getline (&line, &n, stdin);
+  if (len < 0)
+    {
+      int saved_errno = errno;
+      if (feof (stdin))
+        exit (0);
+
+      error (EXIT_FAILURE, saved_errno,
+             "reading standard input");
+    }
+  else if (len == 0)
+    exit (0);
+
+  if (line[len-1] == '\n')
+    line[len-1] = '\0';
+
+  if (chdir_long (line) != 0)
+    error (EXIT_FAILURE, errno,
+           "chdir_long failed: %s", line);
+
+  if (argc <= 1)
+    {
+      /* Using 'pwd' here makes sense only if it is a robust implementation,
+         like the one in coreutils after the 2004-04-19 changes.  */
+      char const *cmd = "pwd";
+      execlp (cmd, (char *) NULL);
+      error (EXIT_FAILURE, errno, "%s", cmd);
+    }
+
+  fclose (stdin);
+  fclose (stderr);
+
+  exit (EXIT_SUCCESS);
+}
+#endif
+
+/*
+Local Variables:
+compile-command: "gcc -DTEST_CHDIR=1 -g -O -W -Wall chdir-long.c libcoreutils.a"
+End:
+*/
diff --git a/lib/chdir-long.h b/lib/chdir-long.h
new file mode 100644
index 0000000..17d9aa5
--- /dev/null
+++ b/lib/chdir-long.h
@@ -0,0 +1,30 @@
+/* provide a chdir function that tries not to fail due to ENAMETOOLONG
+   Copyright (C) 2004-2005, 2009-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Jim Meyering.  */
+
+#include <unistd.h>
+#include <limits.h>
+
+#include "pathmax.h"
+
+/* On systems without PATH_MAX, presume that chdir accepts
+   arbitrarily long directory names.  */
+#ifndef PATH_MAX
+# define chdir_long(Dir) chdir (Dir)
+#else
+int chdir_long (char *dir);
+#endif
diff --git a/lib/cloexec.c b/lib/cloexec.c
index db42576..7defa93 100644
--- a/lib/cloexec.c
+++ b/lib/cloexec.c
@@ -1,21 +1,21 @@
 /* cloexec.c - set or clear the close-on-exec descriptor flag
 
-   Copyright (C) 1991, 2004-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 1991, 2004-2006, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <https://www.gnu.org/licenses/>.
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
-   The code is taken from glibc/manual/llio.texi  */
+/* The code is taken from glibc/manual/llio.texi  */
 
 #include <config.h>
 
diff --git a/lib/cloexec.h b/lib/cloexec.h
index 06ad945..97a3659 100644
--- a/lib/cloexec.h
+++ b/lib/cloexec.h
@@ -1,21 +1,19 @@
 /* cloexec.c - set or clear the close-on-exec descriptor flag
 
-   Copyright (C) 2004, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <https://www.gnu.org/licenses/>.
-
-*/
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <stdbool.h>
 
diff --git a/lib/close-stream.c b/lib/close-stream.c
index 5458c4f..86f6d6e 100644
--- a/lib/close-stream.c
+++ b/lib/close-stream.c
@@ -1,6 +1,6 @@
 /* Close a stream, with nicer error checking than fclose's.
 
-   Copyright (C) 1998-2002, 2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 1998-2002, 2004, 2006-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/close-stream.h b/lib/close-stream.h
index be3d419..8a58a48 100644
--- a/lib/close-stream.h
+++ b/lib/close-stream.h
@@ -1,2 +1,20 @@
+/* Close a stream, with nicer error checking than fclose's.
+
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License,
+   or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #include <stdio.h>
+
 int close_stream (FILE *stream);
diff --git a/lib/close.c b/lib/close.c
index 40ce845..5b9ab6c 100644
--- a/lib/close.c
+++ b/lib/close.c
@@ -1,17 +1,17 @@
 /* close replacement.
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
@@ -28,7 +28,8 @@
 
 #undef close
 
-#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+#if defined _WIN32 && !defined __CYGWIN__
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
 static int
 close_nothrow (int fd)
 {
@@ -36,7 +37,7 @@
 
   TRY_MSVC_INVAL
     {
-      result = close (fd);
+      result = _close (fd);
     }
   CATCH_MSVC_INVAL
     {
@@ -47,6 +48,9 @@
 
   return result;
 }
+# else
+#  define close_nothrow _close
+# endif
 #else
 # define close_nothrow close
 #endif
diff --git a/lib/closedir.c b/lib/closedir.c
new file mode 100644
index 0000000..80a500b
--- /dev/null
+++ b/lib/closedir.c
@@ -0,0 +1,71 @@
+/* Stop reading the entries of a directory.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <dirent.h>
+
+#if REPLACE_FCHDIR
+# include <unistd.h>
+#endif
+
+#if HAVE_CLOSEDIR
+
+/* Override closedir(), to keep track of the open file descriptors.
+   Needed because there is a function dirfd().  */
+
+#else
+
+# include <stdlib.h>
+
+# include "dirent-private.h"
+
+#endif
+
+int
+closedir (DIR *dirp)
+{
+# if REPLACE_FCHDIR || REPLACE_DIRFD
+  int fd = dirfd (dirp);
+# endif
+  int retval;
+
+#if HAVE_CLOSEDIR
+# undef closedir
+
+  retval = closedir (dirp);
+
+# ifdef __KLIBC__
+  if (!retval)
+    _gl_unregister_dirp_fd (fd);
+# endif
+#else
+
+  if (dirp->current != INVALID_HANDLE_VALUE)
+    FindClose (dirp->current);
+  free (dirp);
+
+  retval = 0;
+
+#endif
+
+#if REPLACE_FCHDIR
+  if (retval >= 0)
+    _gl_unregister_fd (fd);
+#endif
+  return retval;
+}
diff --git a/lib/closeout.c b/lib/closeout.c
index 4a604ec..a0c935f 100644
--- a/lib/closeout.c
+++ b/lib/closeout.c
@@ -1,6 +1,6 @@
 /* Close standard output and standard error, exiting with a diagnostic on error.
 
-   Copyright (C) 1998-2002, 2004, 2006, 2008-2019 Free Software Foundation,
+   Copyright (C) 1998-2002, 2004, 2006, 2008-2021 Free Software Foundation,
    Inc.
 
    This program is free software: you can redistribute it and/or modify
diff --git a/lib/closeout.h b/lib/closeout.h
index ac89f76..68a6425 100644
--- a/lib/closeout.h
+++ b/lib/closeout.h
@@ -1,6 +1,6 @@
 /* Close standard output and standard error.
 
-   Copyright (C) 1998, 2000, 2003-2004, 2006, 2008-2019 Free Software
+   Copyright (C) 1998, 2000, 2003-2004, 2006, 2008-2021 Free Software
    Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
diff --git a/lib/concat-filename.c b/lib/concat-filename.c
index df0e170..46593cb 100644
--- a/lib/concat-filename.c
+++ b/lib/concat-filename.c
@@ -1,17 +1,17 @@
 /* Construct a full filename from a directory and a relative filename.
-   Copyright (C) 2001-2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2004, 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 3 of the License, or any
-   later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <haible@clisp.cons.org>.  */
diff --git a/lib/concat-filename.h b/lib/concat-filename.h
index 4448b78..32a437e 100644
--- a/lib/concat-filename.h
+++ b/lib/concat-filename.h
@@ -1,22 +1,24 @@
 /* Construct a full filename from a directory and a relative filename.
-   Copyright (C) 2001-2004, 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2004, 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _CONCAT_FILENAME_H
 #define _CONCAT_FILENAME_H
 
+#include <stdlib.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -26,12 +28,15 @@
    suffix.  Return a freshly allocated filename.  Return NULL and set errno
    upon memory allocation failure.  */
 extern char *concatenated_filename (const char *directory,
-                                    const char *filename, const char *suffix);
+                                    const char *filename, const char *suffix)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
 
 /* Concatenate a directory filename, a relative filename and an optional
    suffix.  Return a freshly allocated filename.  */
 extern char *xconcatenated_filename (const char *directory,
-                                     const char *filename, const char *suffix);
+                                     const char *filename, const char *suffix)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
 
 
 #ifdef __cplusplus
diff --git a/lib/config.in.h b/lib/config.in.h
index 9c8539e..c93fae4 100644
--- a/lib/config.in.h
+++ b/lib/config.in.h
@@ -22,17 +22,9 @@
    non-IEEE-754 'long double' values. */
 #undef CHECK_PRINTF_SAFE
 
-/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
-   systems. This function is required for `alloca.c' support on those systems.
-   */
-#undef CRAY_STACKSEG_END
-
-/* Define to 1 if using `alloca.c'. */
+/* Define to 1 if using 'alloca.c'. */
 #undef C_ALLOCA
 
-/* Define to 1 if the C locale may have encoding errors. */
-#undef C_LOCALE_MAYBE_EILSEQ
-
 /* Define as the bit index in the word where to find bit 0 of the exponent of
    'double'. */
 #undef DBL_EXPBIT0_BIT
@@ -46,9 +38,22 @@
 /* Define as the word index where to find the sign of 'double'. */
 #undef DBL_SIGNBIT_WORD
 
+/* the name of the file descriptor member of DIR */
+#undef DIR_FD_MEMBER_NAME
+
+#ifdef DIR_FD_MEMBER_NAME
+# define DIR_TO_FD(Dir_p) ((Dir_p)->DIR_FD_MEMBER_NAME)
+#else
+# define DIR_TO_FD(Dir_p) -1
+#endif
+
+
 /* Define to 1 if // is a file system root distinct from /. */
 #undef DOUBLE_SLASH_IS_DISTINCT_ROOT
 
+/* Define if struct dirent has a member d_ino that actually works. */
+#undef D_INO_IN_DIRENT
+
 /* Define to 1 if translation of program messages to the user's native
    language is requested. */
 #undef ENABLE_NLS
@@ -76,17 +81,22 @@
 #undef FOPEN_TRAILING_SLASH_BUG
 
 /* Define to 1 if realpath() can malloc memory, always gives an absolute path,
-   and handles trailing slash correctly. */
-#undef FUNC_REALPATH_WORKS
+   and handles a trailing slash correctly. */
+#undef FUNC_REALPATH_NEARLY_WORKS
 
-/* Define if gettimeofday clobbers the localtime buffer. */
-#undef GETTIMEOFDAY_CLOBBERS_LOCALTIME
+/* Define to 1 if realpath() can malloc memory, always gives an absolute path,
+   and handles leading slashes and a trailing slash correctly. */
+#undef FUNC_REALPATH_WORKS
 
 /* Define this to 'void' or 'struct timezone' to match the system's
    declaration of the second argument to gettimeofday. */
 #undef GETTIMEOFDAY_TIMEZONE
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module canonicalize shall be considered present. */
+#undef GNULIB_CANONICALIZE
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module canonicalize-lgpl shall be considered present. */
 #undef GNULIB_CANONICALIZE_LGPL
 
@@ -99,10 +109,18 @@
 #undef GNULIB_DIRNAME
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module fdopendir shall be considered present. */
+#undef GNULIB_FDOPENDIR
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module fd-safer-flag shall be considered present. */
 #undef GNULIB_FD_SAFER_FLAG
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module fopen-gnu shall be considered present. */
+#undef GNULIB_FOPEN_GNU
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module fopen-safer shall be considered present. */
 #undef GNULIB_FOPEN_SAFER
 
@@ -111,18 +129,22 @@
 #undef GNULIB_FSCANF
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module getcwd shall be considered present. */
+#undef GNULIB_GETCWD
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module lock shall be considered present. */
 #undef GNULIB_LOCK
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
-   whether the gnulib module malloc-gnu shall be considered present. */
-#undef GNULIB_MALLOC_GNU
-
-/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module msvc-nothrow shall be considered present. */
 #undef GNULIB_MSVC_NOTHROW
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module openat shall be considered present. */
+#undef GNULIB_OPENAT
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module pipe2-safer shall be considered present. */
 #undef GNULIB_PIPE2_SAFER
 
@@ -131,6 +153,10 @@
 #undef GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module reallocarray shall be considered present. */
+#undef GNULIB_REALLOCARRAY
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module scanf shall be considered present. */
 #undef GNULIB_SCANF
 
@@ -138,6 +164,14 @@
    whether the gnulib module snprintf shall be considered present. */
 #undef GNULIB_SNPRINTF
 
+/* Define to 1 if you want the FILE stream functions getc, putc, etc. to use
+   unlocked I/O if available, throughout the package. Unlocked I/O can improve
+   performance, sometimes dramatically. But unlocked I/O is safe only in
+   single-threaded programs, as well as in multithreaded programs for which
+   you can guarantee that every FILE stream, including stdin, stdout, stderr,
+   is used only in a single thread. */
+#undef GNULIB_STDIO_SINGLE_THREAD
+
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module strerror shall be considered present. */
 #undef GNULIB_STRERROR
@@ -146,9 +180,15 @@
    whether the gnulib module strerror_r-posix shall be considered present. */
 #undef GNULIB_STRERROR_R_POSIX
 
+/* Define to 1 when the gnulib module access should be tested. */
+#undef GNULIB_TEST_ACCESS
+
 /* Define to 1 when the gnulib module calloc-posix should be tested. */
 #undef GNULIB_TEST_CALLOC_POSIX
 
+/* Define to 1 when the gnulib module canonicalize should be tested. */
+#undef GNULIB_TEST_CANONICALIZE
+
 /* Define to 1 when the gnulib module canonicalize_file_name should be tested.
    */
 #undef GNULIB_TEST_CANONICALIZE_FILE_NAME
@@ -162,36 +202,102 @@
 /* Define to 1 when the gnulib module close should be tested. */
 #undef GNULIB_TEST_CLOSE
 
+/* Define to 1 when the gnulib module closedir should be tested. */
+#undef GNULIB_TEST_CLOSEDIR
+
+/* Define to 1 when the gnulib module dirfd should be tested. */
+#undef GNULIB_TEST_DIRFD
+
+/* Define to 1 when the gnulib module dup should be tested. */
+#undef GNULIB_TEST_DUP
+
 /* Define to 1 when the gnulib module dup2 should be tested. */
 #undef GNULIB_TEST_DUP2
 
 /* Define to 1 when the gnulib module environ should be tested. */
 #undef GNULIB_TEST_ENVIRON
 
+/* Define to 1 when the gnulib module fchdir should be tested. */
+#undef GNULIB_TEST_FCHDIR
+
 /* Define to 1 when the gnulib module fcntl should be tested. */
 #undef GNULIB_TEST_FCNTL
 
+/* Define to 1 when the gnulib module fdopendir should be tested. */
+#undef GNULIB_TEST_FDOPENDIR
+
+/* Define to 1 when the gnulib module ffsl should be tested. */
+#undef GNULIB_TEST_FFSL
+
+/* Define to 1 when the gnulib module fgetc should be tested. */
+#undef GNULIB_TEST_FGETC
+
+/* Define to 1 when the gnulib module fgets should be tested. */
+#undef GNULIB_TEST_FGETS
+
 /* Define to 1 when the gnulib module fopen should be tested. */
 #undef GNULIB_TEST_FOPEN
 
+/* Define to 1 when the gnulib module fprintf should be tested. */
+#undef GNULIB_TEST_FPRINTF
+
 /* Define to 1 when the gnulib module fprintf-posix should be tested. */
 #undef GNULIB_TEST_FPRINTF_POSIX
 
+/* Define to 1 when the gnulib module fputc should be tested. */
+#undef GNULIB_TEST_FPUTC
+
+/* Define to 1 when the gnulib module fputs should be tested. */
+#undef GNULIB_TEST_FPUTS
+
+/* Define to 1 when the gnulib module fread should be tested. */
+#undef GNULIB_TEST_FREAD
+
+/* Define to 1 when the gnulib module free-posix should be tested. */
+#undef GNULIB_TEST_FREE_POSIX
+
 /* Define to 1 when the gnulib module frexp should be tested. */
 #undef GNULIB_TEST_FREXP
 
 /* Define to 1 when the gnulib module frexpl should be tested. */
 #undef GNULIB_TEST_FREXPL
 
+/* Define to 1 when the gnulib module fscanf should be tested. */
+#undef GNULIB_TEST_FSCANF
+
 /* Define to 1 when the gnulib module fstat should be tested. */
 #undef GNULIB_TEST_FSTAT
 
+/* Define to 1 when the gnulib module fstatat should be tested. */
+#undef GNULIB_TEST_FSTATAT
+
 /* Define to 1 when the gnulib module fsync should be tested. */
 #undef GNULIB_TEST_FSYNC
 
+/* Define to 1 when the gnulib module fwrite should be tested. */
+#undef GNULIB_TEST_FWRITE
+
+/* Define to 1 when the gnulib module getc should be tested. */
+#undef GNULIB_TEST_GETC
+
+/* Define to 1 when the gnulib module getchar should be tested. */
+#undef GNULIB_TEST_GETCHAR
+
+/* Define to 1 when the gnulib module getcwd should be tested. */
+#undef GNULIB_TEST_GETCWD
+
+/* Define to 1 when the gnulib module getdelim should be tested. */
+#undef GNULIB_TEST_GETDELIM
+
 /* Define to 1 when the gnulib module getdtablesize should be tested. */
 #undef GNULIB_TEST_GETDTABLESIZE
 
+/* Define to 1 when the gnulib module getline should be tested. */
+#undef GNULIB_TEST_GETLINE
+
+/* Define to 1 when the gnulib module getopt-posix should be tested. */
+#undef GNULIB_TEST_GETOPT_POSIX
+
 /* Define to 1 when the gnulib module getrusage should be tested. */
 #undef GNULIB_TEST_GETRUSAGE
 
@@ -213,6 +319,12 @@
 /* Define to 1 when the gnulib module iswblank should be tested. */
 #undef GNULIB_TEST_ISWBLANK
 
+/* Define to 1 when the gnulib module iswdigit should be tested. */
+#undef GNULIB_TEST_ISWDIGIT
+
+/* Define to 1 when the gnulib module iswxdigit should be tested. */
+#undef GNULIB_TEST_ISWXDIGIT
+
 /* Define to 1 when the gnulib module ldexpl should be tested. */
 #undef GNULIB_TEST_LDEXPL
 
@@ -231,18 +343,36 @@
 /* Define to 1 when the gnulib module memchr should be tested. */
 #undef GNULIB_TEST_MEMCHR
 
+/* Define to 1 when the gnulib module mempcpy should be tested. */
+#undef GNULIB_TEST_MEMPCPY
+
+/* Define to 1 when the gnulib module memrchr should be tested. */
+#undef GNULIB_TEST_MEMRCHR
+
 /* Define to 1 when the gnulib module obstack-printf should be tested. */
 #undef GNULIB_TEST_OBSTACK_PRINTF
 
 /* Define to 1 when the gnulib module open should be tested. */
 #undef GNULIB_TEST_OPEN
 
+/* Define to 1 when the gnulib module openat should be tested. */
+#undef GNULIB_TEST_OPENAT
+
+/* Define to 1 when the gnulib module opendir should be tested. */
+#undef GNULIB_TEST_OPENDIR
+
 /* Define to 1 when the gnulib module perror should be tested. */
 #undef GNULIB_TEST_PERROR
 
+/* Define to 1 when the gnulib module pipe should be tested. */
+#undef GNULIB_TEST_PIPE
+
 /* Define to 1 when the gnulib module pipe2 should be tested. */
 #undef GNULIB_TEST_PIPE2
 
+/* Define to 1 when the gnulib module posix_spawn should be tested. */
+#undef GNULIB_TEST_POSIX_SPAWN
+
 /* Define to 1 when the gnulib module posix_spawnattr_destroy should be
    tested. */
 #undef GNULIB_TEST_POSIX_SPAWNATTR_DESTROY
@@ -255,6 +385,10 @@
    tested. */
 #undef GNULIB_TEST_POSIX_SPAWNATTR_SETFLAGS
 
+/* Define to 1 when the gnulib module posix_spawnattr_setpgroup should be
+   tested. */
+#undef GNULIB_TEST_POSIX_SPAWNATTR_SETPGROUP
+
 /* Define to 1 when the gnulib module posix_spawnattr_setsigmask should be
    tested. */
 #undef GNULIB_TEST_POSIX_SPAWNATTR_SETSIGMASK
@@ -262,6 +396,10 @@
 /* Define to 1 when the gnulib module posix_spawnp should be tested. */
 #undef GNULIB_TEST_POSIX_SPAWNP
 
+/* Define to 1 when the gnulib module posix_spawn_file_actions_addchdir should
+   be tested. */
+#undef GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR
+
 /* Define to 1 when the gnulib module posix_spawn_file_actions_addclose should
    be tested. */
 #undef GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE
@@ -282,18 +420,36 @@
    tested. */
 #undef GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_INIT
 
+/* Define to 1 when the gnulib module printf should be tested. */
+#undef GNULIB_TEST_PRINTF
+
 /* Define to 1 when the gnulib module printf-posix should be tested. */
 #undef GNULIB_TEST_PRINTF_POSIX
 
+/* Define to 1 when the gnulib module putc should be tested. */
+#undef GNULIB_TEST_PUTC
+
+/* Define to 1 when the gnulib module putchar should be tested. */
+#undef GNULIB_TEST_PUTCHAR
+
+/* Define to 1 when the gnulib module puts should be tested. */
+#undef GNULIB_TEST_PUTS
+
 /* Define to 1 when the gnulib module raise should be tested. */
 #undef GNULIB_TEST_RAISE
 
 /* Define to 1 when the gnulib module rawmemchr should be tested. */
 #undef GNULIB_TEST_RAWMEMCHR
 
+/* Define to 1 when the gnulib module readdir should be tested. */
+#undef GNULIB_TEST_READDIR
+
 /* Define to 1 when the gnulib module readlink should be tested. */
 #undef GNULIB_TEST_READLINK
 
+/* Define to 1 when the gnulib module reallocarray should be tested. */
+#undef GNULIB_TEST_REALLOCARRAY
+
 /* Define to 1 when the gnulib module realloc-posix should be tested. */
 #undef GNULIB_TEST_REALLOC_POSIX
 
@@ -303,9 +459,18 @@
 /* Define to 1 when the gnulib module rename should be tested. */
 #undef GNULIB_TEST_RENAME
 
+/* Define to 1 when the gnulib module rewinddir should be tested. */
+#undef GNULIB_TEST_REWINDDIR
+
 /* Define to 1 when the gnulib module rmdir should be tested. */
 #undef GNULIB_TEST_RMDIR
 
+/* Define to 1 when the gnulib module scanf should be tested. */
+#undef GNULIB_TEST_SCANF
+
+/* Define to 1 when the gnulib module setlocale_null should be tested. */
+#undef GNULIB_TEST_SETLOCALE_NULL
+
 /* Define to 1 when the gnulib module sigaction should be tested. */
 #undef GNULIB_TEST_SIGACTION
 
@@ -327,6 +492,9 @@
 /* Define to 1 when the gnulib module stpcpy should be tested. */
 #undef GNULIB_TEST_STPCPY
 
+/* Define to 1 when the gnulib module stpncpy should be tested. */
+#undef GNULIB_TEST_STPNCPY
+
 /* Define to 1 when the gnulib module strchrnul should be tested. */
 #undef GNULIB_TEST_STRCHRNUL
 
@@ -345,6 +513,9 @@
 /* Define to 1 when the gnulib module strnlen should be tested. */
 #undef GNULIB_TEST_STRNLEN
 
+/* Define to 1 when the gnulib module strtod should be tested. */
+#undef GNULIB_TEST_STRTOD
+
 /* Define to 1 when the gnulib module strverscmp should be tested. */
 #undef GNULIB_TEST_STRVERSCMP
 
@@ -357,9 +528,15 @@
 /* Define to 1 when the gnulib module vasprintf should be tested. */
 #undef GNULIB_TEST_VASPRINTF
 
+/* Define to 1 when the gnulib module vfprintf should be tested. */
+#undef GNULIB_TEST_VFPRINTF
+
 /* Define to 1 when the gnulib module vfprintf-posix should be tested. */
 #undef GNULIB_TEST_VFPRINTF_POSIX
 
+/* Define to 1 when the gnulib module vprintf should be tested. */
+#undef GNULIB_TEST_VPRINTF
+
 /* Define to 1 when the gnulib module vsnprintf should be tested. */
 #undef GNULIB_TEST_VSNPRINTF
 
@@ -372,6 +549,26 @@
 /* Define to 1 when the gnulib module wcwidth should be tested. */
 #undef GNULIB_TEST_WCWIDTH
 
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module unistr/u8-mbtoucr shall be considered present. */
+#undef GNULIB_UNISTR_U8_MBTOUCR
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module unistr/u8-uctomb shall be considered present. */
+#undef GNULIB_UNISTR_U8_UCTOMB
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module vfprintf-posix shall be considered present. */
+#undef GNULIB_VFPRINTF_POSIX
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module xalloc shall be considered present. */
+#undef GNULIB_XALLOC
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module xalloc-die shall be considered present. */
+#undef GNULIB_XALLOC_DIE
+
 /* Define if your system defines TIOCGWINSZ in sys/ioctl.h. */
 #undef GWINSZ_IN_SYS_IOCTL
 
@@ -379,8 +576,7 @@
    may be supplied by this distribution. */
 #undef HAVE_ALLOCA
 
-/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
-   */
+/* Define to 1 if <alloca.h> works. */
 #undef HAVE_ALLOCA_H
 
 /* Define if you have an arithmetic hrtime_t type. */
@@ -389,9 +585,6 @@
 /* Define to 1 if you have the <bp-sym.h> header file. */
 #undef HAVE_BP_SYM_H
 
-/* Define if the 'calloc' function is POSIX compliant. */
-#undef HAVE_CALLOC_POSIX
-
 /* Define to 1 if you have the `canonicalize_file_name' function. */
 #undef HAVE_CANONICALIZE_FILE_NAME
 
@@ -412,6 +605,9 @@
 /* Define to 1 if you have the `clock_settime' function. */
 #undef HAVE_CLOCK_SETTIME
 
+/* Define to 1 if you have the `closedir' function. */
+#undef HAVE_CLOSEDIR
+
 /* Define to 1 if you have the `confstr' function. */
 #undef HAVE_CONFSTR
 
@@ -457,6 +653,34 @@
    don't. */
 #undef HAVE_DECL_COPYSIGNL
 
+/* Define to 1 if you have the declaration of `dirfd', and to 0 if you don't.
+   */
+#undef HAVE_DECL_DIRFD
+
+/* Define to 1 if you have the declaration of `ecvt', and to 0 if you don't.
+   */
+#undef HAVE_DECL_ECVT
+
+/* Define to 1 if you have the declaration of `execvpe', and to 0 if you
+   don't. */
+#undef HAVE_DECL_EXECVPE
+
+/* Define to 1 if you have the declaration of `fchdir', and to 0 if you don't.
+   */
+#undef HAVE_DECL_FCHDIR
+
+/* Define to 1 if you have the declaration of `fcloseall', and to 0 if you
+   don't. */
+#undef HAVE_DECL_FCLOSEALL
+
+/* Define to 1 if you have the declaration of `fcvt', and to 0 if you don't.
+   */
+#undef HAVE_DECL_FCVT
+
+/* Define to 1 if you have the declaration of `fdopendir', and to 0 if you
+   don't. */
+#undef HAVE_DECL_FDOPENDIR
+
 /* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you
    don't. */
 #undef HAVE_DECL_FEOF_UNLOCKED
@@ -489,14 +713,26 @@
    you don't. */
 #undef HAVE_DECL_FWRITE_UNLOCKED
 
+/* Define to 1 if you have the declaration of `gcvt', and to 0 if you don't.
+   */
+#undef HAVE_DECL_GCVT
+
 /* Define to 1 if you have the declaration of `getchar_unlocked', and to 0 if
    you don't. */
 #undef HAVE_DECL_GETCHAR_UNLOCKED
 
+/* Define to 1 if you have the declaration of `getcwd', and to 0 if you don't.
+   */
+#undef HAVE_DECL_GETCWD
+
 /* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you
    don't. */
 #undef HAVE_DECL_GETC_UNLOCKED
 
+/* Define to 1 if you have the declaration of `getdelim', and to 0 if you
+   don't. */
+#undef HAVE_DECL_GETDELIM
+
 /* Define to 1 if you have the declaration of `getdtablesize', and to 0 if you
    don't. */
 #undef HAVE_DECL_GETDTABLESIZE
@@ -505,6 +741,10 @@
    don't. */
 #undef HAVE_DECL_GETHRTIME
 
+/* Define to 1 if you have the declaration of `getline', and to 0 if you
+   don't. */
+#undef HAVE_DECL_GETLINE
+
 /* Define to 1 if you have the declaration of `iswblank', and to 0 if you
    don't. */
 #undef HAVE_DECL_ISWBLANK
@@ -521,10 +761,18 @@
    otherwise. */
 #undef HAVE_DECL_MBSWIDTH_IN_WCHAR_H
 
+/* Define to 1 if you have the declaration of `memrchr', and to 0 if you
+   don't. */
+#undef HAVE_DECL_MEMRCHR
+
 /* Define to 1 if you have the declaration of `obstack_printf', and to 0 if
    you don't. */
 #undef HAVE_DECL_OBSTACK_PRINTF
 
+/* Define to 1 if you have the declaration of `posix_spawn', and to 0 if you
+   don't. */
+#undef HAVE_DECL_POSIX_SPAWN
+
 /* Define to 1 if you have the declaration of `program_invocation_name', and
    to 0 if you don't. */
 #undef HAVE_DECL_PROGRAM_INVOCATION_NAME
@@ -549,6 +797,10 @@
    don't. */
 #undef HAVE_DECL_SNPRINTF
 
+/* Define to 1 if you have the declaration of `stpncpy', and to 0 if you
+   don't. */
+#undef HAVE_DECL_STPNCPY
+
 /* Define to 1 if you have the declaration of `strdup', and to 0 if you don't.
    */
 #undef HAVE_DECL_STRDUP
@@ -577,6 +829,10 @@
    don't. */
 #undef HAVE_DECL_VSNPRINTF
 
+/* Define to 1 if you have the declaration of `wcsdup', and to 0 if you don't.
+   */
+#undef HAVE_DECL_WCSDUP
+
 /* Define to 1 if you have the declaration of `wcwidth', and to 0 if you
    don't. */
 #undef HAVE_DECL_WCWIDTH
@@ -593,30 +849,64 @@
    don't. */
 #undef HAVE_DECL___FPENDING
 
-/* Define to 1 if you have the 'dup2' function. */
-#undef HAVE_DUP2
+/* Define to 1 if you have the <dirent.h> header file. */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you have the `dirfd' function. */
+#undef HAVE_DIRFD
 
 /* Define if you have the declaration of environ. */
 #undef HAVE_ENVIRON_DECL
 
+/* Define to 1 if you have the `faccessat' function. */
+#undef HAVE_FACCESSAT
+
+/* Define to 1 if you have the `fchdir' function. */
+#undef HAVE_FCHDIR
+
 /* Define to 1 if you have the `fcntl' function. */
 #undef HAVE_FCNTL
 
+/* Define to 1 if you have the `fdopendir' function. */
+#undef HAVE_FDOPENDIR
+
 /* Define to 1 if you have the <features.h> header file. */
 #undef HAVE_FEATURES_H
 
+/* Define to 1 if you have the `ffsl' function. */
+#undef HAVE_FFSL
+
+/* Define to 1 if you have the `flockfile' function. */
+#undef HAVE_FLOCKFILE
+
+/* Define if the 'free' function is guaranteed to preserve errno. */
+#undef HAVE_FREE_POSIX
+
 /* Define if the frexpl function is available in libc. */
 #undef HAVE_FREXPL_IN_LIBC
 
 /* Define if the frexp function is available in libc. */
 #undef HAVE_FREXP_IN_LIBC
 
+/* Define to 1 if you have the `fstatat' function. */
+#undef HAVE_FSTATAT
+
 /* Define to 1 if you have the `fsync' function. */
 #undef HAVE_FSYNC
 
+/* Define to 1 if you have the `funlockfile' function. */
+#undef HAVE_FUNLOCKFILE
+
 /* Define to 1 if you have the `getcwd' function. */
 #undef HAVE_GETCWD
 
+/* Define to 1 if getcwd works, but with shorter paths than is generally
+   tested with the replacement. */
+#undef HAVE_GETCWD_SHORTER
+
+/* Define to 1 if you have the `getdelim' function. */
+#undef HAVE_GETDELIM
+
 /* Define to 1 if you have the `getdtablesize' function. */
 #undef HAVE_GETDTABLESIZE
 
@@ -629,6 +919,9 @@
 /* Define to 1 if you have the `getopt_long_only' function. */
 #undef HAVE_GETOPT_LONG_ONLY
 
+/* Define to 1 if the system has the 'getpagesize' function. */
+#undef HAVE_GETPAGESIZE
+
 /* Define to 1 if you have the `getprogname' function. */
 #undef HAVE_GETPROGNAME
 
@@ -644,6 +937,14 @@
 /* Define if you have the iconv() function and it works. */
 #undef HAVE_ICONV
 
+/* Define to 1 if you have the <iconv.h> header file. */
+#undef HAVE_ICONV_H
+
+/* Define to 1 if the compiler supports one of the keywords 'inline',
+   '__inline__', '__inline' and effectively inlines functions marked as such.
+   */
+#undef HAVE_INLINE
+
 /* Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>. */
 #undef HAVE_INTMAX_T
 
@@ -705,11 +1006,7 @@
 /* Define to 1 if you have the <mach-o/dyld.h> header file. */
 #undef HAVE_MACH_O_DYLD_H
 
-/* Define to 1 if your system has a GNU libc compatible 'malloc' function, and
-   to 0 otherwise. */
-#undef HAVE_MALLOC_GNU
-
-/* Define if the 'malloc' function is POSIX compliant. */
+/* Define if malloc, realloc, and calloc set errno on allocation failure. */
 #undef HAVE_MALLOC_POSIX
 
 /* Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including
@@ -728,12 +1025,22 @@
 /* Define to 1 if <wchar.h> declares mbstate_t. */
 #undef HAVE_MBSTATE_T
 
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
+/* Define to 1 if you have the `mempcpy' function. */
+#undef HAVE_MEMPCPY
+
+/* Define to 1 if you have the `memrchr' function. */
+#undef HAVE_MEMRCHR
 
 /* Define to 1 if you have the `microuptime' function. */
 #undef HAVE_MICROUPTIME
 
+/* Define to 1 if getcwd minimally works, that is, its result can be trusted
+   when it succeeds. */
+#undef HAVE_MINIMALLY_WORKING_GETCWD
+
+/* Define to 1 if you have the <minix/config.h> header file. */
+#undef HAVE_MINIX_CONFIG_H
+
 /* Define to 1 if <limits.h> defines the MIN and MAX macros. */
 #undef HAVE_MINMAX_IN_LIMITS_H
 
@@ -759,6 +1066,16 @@
 /* Define to 1 if you have the `obstack_printf' function. */
 #undef HAVE_OBSTACK_PRINTF
 
+/* Define to 1 if you have the `openat' function. */
+#undef HAVE_OPENAT
+
+/* Define to 1 if you have the `opendir' function. */
+#undef HAVE_OPENDIR
+
+/* Define to 1 if getcwd works, except it sometimes fails when it shouldn't,
+   setting errno to ERANGE, ENAMETOOLONG, or ENOENT. */
+#undef HAVE_PARTLY_WORKING_GETCWD
+
 /* Define to 1 if you have the <paths.h> header file. */
 #undef HAVE_PATHS_H
 
@@ -774,9 +1091,20 @@
 /* Define to 1 if the system has the type `posix_spawnattr_t'. */
 #undef HAVE_POSIX_SPAWNATTR_T
 
+/* Define to 1 if you have the `posix_spawn_file_actions_addchdir' function.
+   */
+#undef HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR
+
+/* Define to 1 if you have the `posix_spawn_file_actions_addchdir_np'
+   function. */
+#undef HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR_NP
+
 /* Define to 1 if the system has the type `posix_spawn_file_actions_t'. */
 #undef HAVE_POSIX_SPAWN_FILE_ACTIONS_T
 
+/* Define if you have the <pthread.h> header and the POSIX threads API. */
+#undef HAVE_PTHREAD_API
+
 /* Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE. */
 #undef HAVE_PTHREAD_MUTEX_RECURSIVE
 
@@ -793,18 +1121,33 @@
 /* Define to 1 if you have the `rawmemchr' function. */
 #undef HAVE_RAWMEMCHR
 
+/* Define to 1 if you have the `readdir' function. */
+#undef HAVE_READDIR
+
+/* Define if you have the readline library. */
+#undef HAVE_READLINE
+
+/* Define to 1 if you have the <readline/history.h> header file. */
+#undef HAVE_READLINE_HISTORY_H
+
+/* Define to 1 if you have the <readline/readline.h> header file. */
+#undef HAVE_READLINE_READLINE_H
+
 /* Define to 1 if you have the `readlink' function. */
 #undef HAVE_READLINK
 
 /* Define to 1 if you have the `readlinkat' function. */
 #undef HAVE_READLINKAT
 
-/* Define if the 'realloc' function is POSIX compliant. */
-#undef HAVE_REALLOC_POSIX
+/* Define to 1 if you have the `reallocarray' function. */
+#undef HAVE_REALLOCARRAY
 
 /* Define to 1 if you have the `realpath' function. */
 #undef HAVE_REALPATH
 
+/* Define to 1 if you have the `rewinddir' function. */
+#undef HAVE_REWINDDIR
+
 /* Define to 1 if 'long double' and 'double' have the same representation. */
 #undef HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
 
@@ -817,6 +1160,9 @@
 /* Define to 1 if you have the `sched_setscheduler' function. */
 #undef HAVE_SCHED_SETSCHEDULER
 
+/* Define to 1 if you have the <sdkddkver.h> header file. */
+#undef HAVE_SDKDDKVER_H
+
 /* Define to 1 if you have the <search.h> header file. */
 #undef HAVE_SEARCH_H
 
@@ -870,6 +1216,10 @@
    buffer had been large enough. */
 #undef HAVE_SNPRINTF_RETVAL_C99
 
+/* Define if the string produced by the snprintf function is always NUL
+   terminated. */
+#undef HAVE_SNPRINTF_TRUNCATION_C99
+
 /* Define to 1 if you have the <spawn.h> header file. */
 #undef HAVE_SPAWN_H
 
@@ -883,18 +1233,21 @@
 /* Define to 1 if you have the <stdio_ext.h> header file. */
 #undef HAVE_STDIO_EXT_H
 
+/* Define to 1 if you have the <stdio.h> header file. */
+#undef HAVE_STDIO_H
+
 /* Define to 1 if you have the <stdlib.h> header file. */
 #undef HAVE_STDLIB_H
 
 /* Define to 1 if you have the `stpcpy' function. */
 #undef HAVE_STPCPY
 
+/* Define if you have the stpncpy() function and it works. */
+#undef HAVE_STPNCPY
+
 /* Define to 1 if you have the `strchrnul' function. */
 #undef HAVE_STRCHRNUL
 
-/* Define to 1 if you have the `strdup' function. */
-#undef HAVE_STRDUP
-
 /* Define to 1 if you have the `strerror_r' function. */
 #undef HAVE_STRERROR_R
 
@@ -952,6 +1305,9 @@
 /* Define to 1 if you have the <sys/inttypes.h> header file. */
 #undef HAVE_SYS_INTTYPES_H
 
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#undef HAVE_SYS_IOCTL_H
+
 /* Define to 1 if you have the <sys/mman.h> header file. */
 #undef HAVE_SYS_MMAN_H
 
@@ -961,6 +1317,9 @@
 /* Define to 1 if you have the <sys/resource.h> header file. */
 #undef HAVE_SYS_RESOURCE_H
 
+/* Define to 1 if you have the <sys/single_threaded.h> header file. */
+#undef HAVE_SYS_SINGLE_THREADED_H
+
 /* Define to 1 if you have the <sys/socket.h> header file. */
 #undef HAVE_SYS_SOCKET_H
 
@@ -982,6 +1341,12 @@
 /* Define to 1 if you have the `tcdrain' function. */
 #undef HAVE_TCDRAIN
 
+/* Define to 1 if you have the <termios.h> header file. */
+#undef HAVE_TERMIOS_H
+
+/* Define to 1 if you have the `thrd_create' function. */
+#undef HAVE_THRD_CREATE
+
 /* Define to 1 if you have the <threads.h> header file. */
 #undef HAVE_THREADS_H
 
@@ -1012,6 +1377,10 @@
 /* Define to 1 if you have the `vfork' function. */
 #undef HAVE_VFORK
 
+/* Define to 1 or 0, depending whether the compiler supports simple visibility
+   declarations. */
+#undef HAVE_VISIBILITY
+
 /* Define to 1 if you have the `vsnprintf' function. */
 #undef HAVE_VSNPRINTF
 
@@ -1039,18 +1408,29 @@
 /* Define to 1 if you have the `wcwidth' function. */
 #undef HAVE_WCWIDTH
 
+/* Define to 1 if the compiler and linker support weak declarations of
+   symbols. */
+#undef HAVE_WEAK_SYMBOLS
+
 /* Define to 1 if you have the <winsock2.h> header file. */
 #undef HAVE_WINSOCK2_H
 
 /* Define if you have the 'wint_t' type. */
 #undef HAVE_WINT_T
 
+/* Define to 1 if fstatat (..., 0) works. For example, it does not work in AIX
+   7.1. */
+#undef HAVE_WORKING_FSTATAT_ZERO_FLAG
+
 /* Define to 1 if O_NOATIME works. */
 #undef HAVE_WORKING_O_NOATIME
 
 /* Define to 1 if O_NOFOLLOW works. */
 #undef HAVE_WORKING_O_NOFOLLOW
 
+/* Define to 1 if you have the <xlocale.h> header file. */
+#undef HAVE_XLOCALE_H
+
 /* Define to 1 if the system has the type `_Bool'. */
 #undef HAVE__BOOL
 
@@ -1060,6 +1440,16 @@
 /* Define to 1 if you have the `_set_invalid_parameter_handler' function. */
 #undef HAVE__SET_INVALID_PARAMETER_HANDLER
 
+/* Define to 1 if the compiler supports __builtin_expect,
+   and to 2 if <builtins.h> does.  */
+#undef HAVE___BUILTIN_EXPECT
+#ifndef HAVE___BUILTIN_EXPECT
+# define __builtin_expect(e, c) (e)
+#elif HAVE___BUILTIN_EXPECT == 2
+# include <builtins.h>
+#endif
+    
+
 /* Define to 1 if you have the `__fseterr' function. */
 #undef HAVE___FSETERR
 
@@ -1069,6 +1459,13 @@
 /* Define to 1 if you have the `__xpg_strerror_r' function. */
 #undef HAVE___XPG_STRERROR_R
 
+/* Define as const if the declaration of iconv() needs const. */
+#undef ICONV_CONST
+
+/* Define to a symbolic name denoting the flavor of iconv_open()
+   implementation. */
+#undef ICONV_FLAVOR
+
 /* Define to the value of ${prefix}, as a string. */
 #undef INSTALLPREFIX
 
@@ -1106,6 +1503,10 @@
    */
 #undef MBRTOWC_EMPTY_INPUT_BUG
 
+/* Define if the mbrtowc function may signal encoding errors in the C locale.
+   */
+#undef MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ
+
 /* Define if the mbrtowc function has the NULL pwc argument bug. */
 #undef MBRTOWC_NULL_ARG1_BUG
 
@@ -1118,12 +1519,19 @@
 /* Define if the mbrtowc function returns a wrong return value. */
 #undef MBRTOWC_RETVAL_BUG
 
+/* Define if the mbrtowc function stores a wide character when reporting
+   incomplete input. */
+#undef MBRTOWC_STORES_INCOMPLETE_BUG
+
 /* Use GNU style printf and scanf.  */
 #ifndef __USE_MINGW_ANSI_STDIO
 # undef __USE_MINGW_ANSI_STDIO
 #endif
 
 
+/* Define to 1 on musl libc. */
+#undef MUSL_LIBC
+
 /* Define to 1 if assertions should be disabled. */
 #undef NDEBUG
 
@@ -1202,9 +1610,6 @@
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
 
-/* Define if <inttypes.h> exists and defines unusable PRI* macros. */
-#undef PRI_MACROS_BROKEN
-
 /* Define to the type that is the result of default argument promotions of
    type mode_t. */
 #undef PROMOTED_MODE_T
@@ -1219,6 +1624,10 @@
 /* Define to 1 if readlink fails to recognize a trailing slash. */
 #undef READLINK_TRAILING_SLASH_BUG
 
+/* Define to 1 if readlink sets errno instead of truncating a too-long link.
+   */
+#undef READLINK_TRUNCATE_BUG
+
 /* Define if rename does not work when the destination file exists, as on
    Cygwin 1.5 or Windows. */
 #undef RENAME_DEST_EXISTS_BUG
@@ -1235,6 +1644,12 @@
    such as on Solaris 9 or cygwin 1.5. */
 #undef RENAME_TRAILING_SLASH_SOURCE_BUG
 
+/* Define to 1 if gnulib's dirfd() replacement is used. */
+#undef REPLACE_DIRFD
+
+/* Define to 1 if gnulib's fchdir() replacement is used. */
+#undef REPLACE_FCHDIR
+
 /* Define if fprintf is overridden by a POSIX compliant gnulib implementation.
    */
 #undef REPLACE_FPRINTF_POSIX
@@ -1243,6 +1658,10 @@
    slash */
 #undef REPLACE_FUNC_STAT_FILE
 
+/* Define to 1 if open() should work around the inability to open a directory.
+   */
+#undef REPLACE_OPEN_DIRECTORY
+
 /* Define if gnulib uses its own posix_spawn and posix_spawnp functions. */
 #undef REPLACE_POSIX_SPAWN
 
@@ -1260,9 +1679,17 @@
    implementation. */
 #undef REPLACE_VFPRINTF_POSIX
 
+/* Define to 1 if setlocale (LC_ALL, NULL) is multithread-safe. */
+#undef SETLOCALE_NULL_ALL_MTSAFE
+
+/* Define to 1 if setlocale (category, NULL) is multithread-safe. */
+#undef SETLOCALE_NULL_ONE_MTSAFE
+
 /* File name of the Bourne shell.  */
-#if defined __CYGWIN__ || defined __ANDROID__
+#if (defined _WIN32 && !defined __CYGWIN__) || defined __CYGWIN__ || defined __ANDROID__
 /* Omit the directory part because
+   - For native Windows programs in a Cygwin environment, the Cygwin mounts
+     are not visible.
    - For 32-bit Cygwin programs in a 64-bit Cygwin environment, the Cygwin
      mounts are not visible.
    - On Android, /bin/sh does not exist. It's /system/bin/sh instead.  */
@@ -1296,7 +1723,9 @@
 /* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
 #undef STAT_MACROS_BROKEN
 
-/* Define to 1 if you have the ANSI C header files. */
+/* Define to 1 if all of the C90 standard headers exist (not just the ones
+   required in a freestanding environment). This macro is provided for
+   backward compatibility; new code need not use it. */
 #undef STDC_HEADERS
 
 /* Define to 1 if strerror_r returns char *. */
@@ -1323,6 +1752,10 @@
 /* Define if the POSIX multithreading library can be used. */
 #undef USE_POSIX_THREADS
 
+/* Define if references to the POSIX multithreading library are satisfied by
+   libc. */
+#undef USE_POSIX_THREADS_FROM_LIBC
+
 /* Define if references to the POSIX multithreading library should be made
    weak. */
 #undef USE_POSIX_THREADS_WEAK
@@ -1335,19 +1768,44 @@
 #ifndef _DARWIN_C_SOURCE
 # undef _DARWIN_C_SOURCE
 #endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
 /* Enable GNU extensions on systems that have them.  */
 #ifndef _GNU_SOURCE
 # undef _GNU_SOURCE
 #endif
-/* Enable NetBSD extensions on NetBSD.  */
+/* Enable X/Open compliant socket functions that do not require linking
+   with -lxnet on HP-UX 11.11.  */
+#ifndef _HPUX_ALT_XOPEN_SOCKET_API
+# undef _HPUX_ALT_XOPEN_SOCKET_API
+#endif
+/* Identify the host operating system as Minix.
+   This macro does not affect the system headers' behavior.
+   A future release of Autoconf may stop defining this macro.  */
+#ifndef _MINIX
+# undef _MINIX
+#endif
+/* Enable general extensions on NetBSD.
+   Enable NetBSD compatibility extensions on Minix.  */
 #ifndef _NETBSD_SOURCE
 # undef _NETBSD_SOURCE
 #endif
-/* Enable OpenBSD extensions on NetBSD.  */
+/* Enable OpenBSD compatibility extensions on NetBSD.
+   Oddly enough, this does nothing on OpenBSD.  */
 #ifndef _OPENBSD_SOURCE
 # undef _OPENBSD_SOURCE
 #endif
-/* Enable threading extensions on Solaris.  */
+/* Define to 1 if needed for POSIX-compatible behavior.  */
+#ifndef _POSIX_SOURCE
+# undef _POSIX_SOURCE
+#endif
+/* Define to 2 if needed for POSIX-compatible behavior.  */
+#ifndef _POSIX_1_SOURCE
+# undef _POSIX_1_SOURCE
+#endif
+/* Enable POSIX-compatible threading on Solaris.  */
 #ifndef _POSIX_PTHREAD_SEMANTICS
 # undef _POSIX_PTHREAD_SEMANTICS
 #endif
@@ -1383,26 +1841,14 @@
 #ifndef _TANDEM_SOURCE
 # undef _TANDEM_SOURCE
 #endif
-/* Enable X/Open extensions if necessary.  HP-UX 11.11 defines
-   mbstate_t only if _XOPEN_SOURCE is defined to 500, regardless of
-   whether compiling with -Ae or -D_HPUX_SOURCE=1.  */
+/* Enable X/Open extensions.  Define to 500 only if necessary
+   to make mbstate_t available.  */
 #ifndef _XOPEN_SOURCE
 # undef _XOPEN_SOURCE
 #endif
-/* Enable X/Open compliant socket functions that do not require linking
-   with -lxnet on HP-UX 11.11.  */
-#ifndef _HPUX_ALT_XOPEN_SOCKET_API
-# undef _HPUX_ALT_XOPEN_SOCKET_API
-#endif
-/* Enable general extensions on Solaris.  */
-#ifndef __EXTENSIONS__
-# undef __EXTENSIONS__
-#endif
 
 
-/* Define to 1 if you want getc etc. to use unlocked I/O if available.
-   Unlocked I/O can improve performance in unithreaded apps, but it is not
-   safe for multithreaded apps. */
+/* An alias of GNULIB_STDIO_SINGLE_THREAD. */
 #undef USE_UNLOCKED_IO
 
 /* Define if the native Windows multithreading API can be used. */
@@ -1444,20 +1890,26 @@
    `char[]'. */
 #undef YYTEXT_POINTER
 
-/* Enable large inode numbers on Mac OS X 10.5. */
-#undef _DARWIN_USE_64_BIT_INODE
-
 /* Number of bits in a file offset, on hosts where this is settable. */
 #undef _FILE_OFFSET_BITS
 
+/* True if the compiler says it groks GNU C version MAJOR.MINOR.  */
+#if defined __GNUC__ && defined __GNUC_MINOR__
+# define _GL_GNUC_PREREQ(major, minor) \
+    ((major) < __GNUC__ + ((minor) <= __GNUC_MINOR__))
+#else
+# define _GL_GNUC_PREREQ(major, minor) 0
+#endif
+
+
+/* Define to enable the declarations of ISO C 11 types and functions. */
+#undef _ISOC11_SOURCE
+
 /* Define for large files, on AIX-style hosts. */
 #undef _LARGE_FILES
 
-/* Define to 1 if on MINIX. */
-#undef _MINIX
-
-/* Define to 1 to make NetBSD features available. MINIX 3 needs this. */
-#undef _NETBSD_SOURCE
+/* Define to 1 on Solaris. */
+#undef _LCONV_C99
 
 /* The _Noreturn keyword of C11.  */
 #ifndef _Noreturn
@@ -1473,10 +1925,14 @@
        this syntax with 'extern'.  */
 #  define _Noreturn [[noreturn]]
 # elif ((!defined __cplusplus || defined __clang__) \
-        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)  \
-            || 4 < __GNUC__ + (7 <= __GNUC_MINOR__)))
+        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
+            || (!defined __STRICT_ANSI__ \
+                && (_GL_GNUC_PREREQ (4, 7) \
+                    || (defined __apple_build_version__ \
+                        ? 6000000 <= __apple_build_version__ \
+                        : 3 < __clang_major__ + (5 <= __clang_minor__))))))
    /* _Noreturn works as-is.  */
-# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
+# elif _GL_GNUC_PREREQ (2, 8) || defined __clang__ || 0x5110 <= __SUNPRO_C
 #  define _Noreturn __attribute__ ((__noreturn__))
 # elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
 #  define _Noreturn __declspec (noreturn)
@@ -1486,12 +1942,8 @@
 #endif
 
 
-/* Define to 2 if the system does not provide POSIX.1 features except with
-   this defined. */
-#undef _POSIX_1_SOURCE
-
-/* Define to 1 if you need to in order for 'stat' and other things to work. */
-#undef _POSIX_SOURCE
+/* Number of bits in a timestamp, on hosts where this is settable. */
+#undef _TIME_BITS
 
 /* For standard stat data types on VMS. */
 #undef _USE_STD_STAT
@@ -1500,6 +1952,9 @@
    used. */
 #undef __GETOPT_PREFIX
 
+/* For 64-bit time_t on 32-bit mingw. */
+#undef __MINGW_USE_VC2005_COMPAT
+
 /* Define to 1 if the system <stdint.h> predates C++11. */
 #undef __STDC_CONSTANT_MACROS
 
@@ -1533,6 +1988,368 @@
 #define _GL_ASYNC_SAFE
 
 
+/* Attributes.  */
+#if (defined __has_attribute \
+     && (!defined __clang_minor__ \
+         || 3 < __clang_major__ + (5 <= __clang_minor__)))
+# define _GL_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__)
+#else
+# define _GL_HAS_ATTRIBUTE(attr) _GL_ATTR_##attr
+# define _GL_ATTR_alloc_size _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_always_inline _GL_GNUC_PREREQ (3, 2)
+# define _GL_ATTR_artificial _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_cold _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_const _GL_GNUC_PREREQ (2, 95)
+# define _GL_ATTR_deprecated _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_diagnose_if 0
+# define _GL_ATTR_error _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_externally_visible _GL_GNUC_PREREQ (4, 1)
+# define _GL_ATTR_fallthrough _GL_GNUC_PREREQ (7, 0)
+# define _GL_ATTR_format _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_leaf _GL_GNUC_PREREQ (4, 6)
+# define _GL_ATTR_malloc _GL_GNUC_PREREQ (3, 0)
+# ifdef _ICC
+#  define _GL_ATTR_may_alias 0
+# else
+#  define _GL_ATTR_may_alias _GL_GNUC_PREREQ (3, 3)
+# endif
+# define _GL_ATTR_noinline _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_nonnull _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_nonstring _GL_GNUC_PREREQ (8, 0)
+# define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96)
+# define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9)
+# define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0)
+# define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4)
+#endif
+
+#ifdef __has_c_attribute
+# define _GL_HAS_C_ATTRIBUTE(attr) __has_c_attribute (__##attr##__)
+#else
+# define _GL_HAS_C_ATTRIBUTE(attr) 0
+#endif
+
+
+/* _GL_ATTRIBUTE_ALLOC_SIZE ((N)) declares that the Nth argument of the function
+   is the size of the returned memory block.
+   _GL_ATTRIBUTE_ALLOC_SIZE ((M, N)) declares that the Mth argument multiplied
+   by the Nth argument of the function is the size of the returned memory block.
+ */
+/* Applies to: function, pointer to function, function types.  */
+#if _GL_HAS_ATTRIBUTE (alloc_size)
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
+#else
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args)
+#endif
+
+/* _GL_ATTRIBUTE_ALWAYS_INLINE tells that the compiler should always inline the
+   function and report an error if it cannot do so.  */
+/* Applies to: function.  */
+#if _GL_HAS_ATTRIBUTE (always_inline)
+# define _GL_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__))
+#else
+# define _GL_ATTRIBUTE_ALWAYS_INLINE
+#endif
+
+/* _GL_ATTRIBUTE_ARTIFICIAL declares that the function is not important to show
+    in stack traces when debugging.  The compiler should omit the function from
+    stack traces.  */
+/* Applies to: function.  */
+#if _GL_HAS_ATTRIBUTE (artificial)
+# define _GL_ATTRIBUTE_ARTIFICIAL __attribute__ ((__artificial__))
+#else
+# define _GL_ATTRIBUTE_ARTIFICIAL
+#endif
+
+/* _GL_ATTRIBUTE_COLD declares that the function is rarely executed.  */
+/* Applies to: functions.  */
+/* Avoid __attribute__ ((cold)) on MinGW; see thread starting at
+   <https://lists.gnu.org/r/emacs-devel/2019-04/msg01152.html>.
+   Also, Oracle Studio 12.6 requires 'cold' not '__cold__'.  */
+#if _GL_HAS_ATTRIBUTE (cold) && !defined __MINGW32__
+# ifndef __SUNPRO_C
+#  define _GL_ATTRIBUTE_COLD __attribute__ ((__cold__))
+# else
+#  define _GL_ATTRIBUTE_COLD __attribute__ ((cold))
+# endif
+#else
+# define _GL_ATTRIBUTE_COLD
+#endif
+
+/* _GL_ATTRIBUTE_CONST declares that it is OK for a compiler to omit duplicate
+   calls to the function with the same arguments.
+   This attribute is safe for a function that neither depends on nor affects
+   observable state, and always returns exactly once - e.g., does not loop
+   forever, and does not call longjmp.
+   (This attribute is stricter than _GL_ATTRIBUTE_PURE.)  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (const)
+# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
+#else
+# define _GL_ATTRIBUTE_CONST
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.
+   _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
+   can be freed via 'free'; it can be used only after declaring 'free'.  */
+/* Applies to: functions.  Cannot be used on inline functions.  */
+#if _GL_GNUC_PREREQ (11, 0)
+# define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+#else
+# define _GL_ATTRIBUTE_DEALLOC(f, i)
+#endif
+#define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (free, 1)
+
+/* _GL_ATTRIBUTE_DEPRECATED: Declares that an entity is deprecated.
+   The compiler may warn if the entity is used.  */
+/* Applies to:
+     - function, variable,
+     - struct, union, struct/union member,
+     - enumeration, enumeration item,
+     - typedef,
+   in C++ also: namespace, class, template specialization.  */
+#if _GL_HAS_C_ATTRIBUTE (deprecated)
+# define _GL_ATTRIBUTE_DEPRECATED [[__deprecated__]]
+#elif _GL_HAS_ATTRIBUTE (deprecated)
+# define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__))
+#else
+# define _GL_ATTRIBUTE_DEPRECATED
+#endif
+
+/* _GL_ATTRIBUTE_ERROR(msg) requests an error if a function is called and
+   the function call is not optimized away.
+   _GL_ATTRIBUTE_WARNING(msg) requests a warning if a function is called and
+   the function call is not optimized away.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (error)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__error__ (msg)))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__warning__ (msg)))
+#elif _GL_HAS_ATTRIBUTE (diagnose_if)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__diagnose_if__ (1, msg, "error")))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#else
+# define _GL_ATTRIBUTE_ERROR(msg)
+# define _GL_ATTRIBUTE_WARNING(msg)
+#endif
+
+/* _GL_ATTRIBUTE_EXTERNALLY_VISIBLE declares that the entity should remain
+   visible to debuggers etc., even with '-fwhole-program'.  */
+/* Applies to: functions, variables.  */
+#if _GL_HAS_ATTRIBUTE (externally_visible)
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((externally_visible))
+#else
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
+#endif
+
+/* _GL_ATTRIBUTE_FALLTHROUGH declares that it is not a programming mistake if
+   the control flow falls through to the immediately following 'case' or
+   'default' label.  The compiler should not warn in this case.  */
+/* Applies to: Empty statement (;), inside a 'switch' statement.  */
+/* Always expands to something.  */
+#if _GL_HAS_C_ATTRIBUTE (fallthrough)
+# define _GL_ATTRIBUTE_FALLTHROUGH [[__fallthrough__]]
+#elif _GL_HAS_ATTRIBUTE (fallthrough)
+# define _GL_ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__))
+#else
+# define _GL_ATTRIBUTE_FALLTHROUGH ((void) 0)
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK))
+   declares that the STRING-INDEXth function argument is a format string of
+   style ARCHETYPE, which is one of:
+     printf, gnu_printf
+     scanf, gnu_scanf,
+     strftime, gnu_strftime,
+     strfmon,
+   or the same thing prefixed and suffixed with '__'.
+   If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK
+   are suitable for the format string.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (format)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define _GL_ATTRIBUTE_FORMAT(spec)
+#endif
+
+/* _GL_ATTRIBUTE_LEAF declares that if the function is called from some other
+   compilation unit, it executes code from that unit only by return or by
+   exception handling.  This declaration lets the compiler optimize that unit
+   more aggressively.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (leaf)
+# define _GL_ATTRIBUTE_LEAF __attribute__ ((__leaf__))
+#else
+# define _GL_ATTRIBUTE_LEAF
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+   allocated memory.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (malloc)
+# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+#else
+# define _GL_ATTRIBUTE_MALLOC
+#endif
+
+/* _GL_ATTRIBUTE_MAY_ALIAS declares that pointers to the type may point to the
+   same storage as pointers to other types.  Thus this declaration disables
+   strict aliasing optimization.  */
+/* Applies to: types.  */
+/* Oracle Studio 12.6 mishandles may_alias despite __has_attribute OK.  */
+#if _GL_HAS_ATTRIBUTE (may_alias) && !defined __SUNPRO_C
+# define _GL_ATTRIBUTE_MAY_ALIAS __attribute__ ((__may_alias__))
+#else
+# define _GL_ATTRIBUTE_MAY_ALIAS
+#endif
+
+/* _GL_ATTRIBUTE_MAYBE_UNUSED declares that it is not a programming mistake if
+   the entity is not used.  The compiler should not warn if the entity is not
+   used.  */
+/* Applies to:
+     - function, variable,
+     - struct, union, struct/union member,
+     - enumeration, enumeration item,
+     - typedef,
+   in C++ also: class.  */
+/* In C++ and C2x, this is spelled [[__maybe_unused__]].
+   GCC's syntax is __attribute__ ((__unused__)).
+   clang supports both syntaxes.  */
+#if _GL_HAS_C_ATTRIBUTE (maybe_unused)
+# define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
+#else
+# define _GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_UNUSED
+#endif
+/* Alternative spelling of this macro, for convenience.  */
+#define _GL_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
+/* Earlier spellings of this macro.  */
+#define _UNUSED_PARAMETER_ _GL_ATTRIBUTE_MAYBE_UNUSED
+
+/* _GL_ATTRIBUTE_NODISCARD declares that the caller of the function should not
+   discard the return value.  The compiler may warn if the caller does not use
+   the return value, unless the caller uses something like ignore_value.  */
+/* Applies to: function, enumeration, class.  */
+#if _GL_HAS_C_ATTRIBUTE (nodiscard)
+# define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]]
+#elif _GL_HAS_ATTRIBUTE (warn_unused_result)
+# define _GL_ATTRIBUTE_NODISCARD __attribute__ ((__warn_unused_result__))
+#else
+# define _GL_ATTRIBUTE_NODISCARD
+#endif
+
+/* _GL_ATTRIBUTE_NOINLINE tells that the compiler should not inline the
+   function.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (noinline)
+# define _GL_ATTRIBUTE_NOINLINE __attribute__ ((__noinline__))
+#else
+# define _GL_ATTRIBUTE_NOINLINE
+#endif
+
+/* _GL_ATTRIBUTE_NONNULL ((N1, N2,...)) declares that the arguments N1, N2,...
+   must not be NULL.
+   _GL_ATTRIBUTE_NONNULL () declares that all pointer arguments must not be
+   null.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (nonnull)
+# define _GL_ATTRIBUTE_NONNULL(args) __attribute__ ((__nonnull__ args))
+#else
+# define _GL_ATTRIBUTE_NONNULL(args)
+#endif
+
+/* _GL_ATTRIBUTE_NONSTRING declares that the contents of a character array is
+   not meant to be NUL-terminated.  */
+/* Applies to: struct/union members and variables that are arrays of element
+   type '[[un]signed] char'.  */
+#if _GL_HAS_ATTRIBUTE (nonstring)
+# define _GL_ATTRIBUTE_NONSTRING __attribute__ ((__nonstring__))
+#else
+# define _GL_ATTRIBUTE_NONSTRING
+#endif
+
+/* There is no _GL_ATTRIBUTE_NORETURN; use _Noreturn instead.  */
+
+/* _GL_ATTRIBUTE_NOTHROW declares that the function does not throw exceptions.
+ */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (nothrow) && !defined __cplusplus
+# define _GL_ATTRIBUTE_NOTHROW __attribute__ ((__nothrow__))
+#else
+# define _GL_ATTRIBUTE_NOTHROW
+#endif
+
+/* _GL_ATTRIBUTE_PACKED declares:
+   For struct members: The member has the smallest possible alignment.
+   For struct, union, class: All members have the smallest possible alignment,
+   minimizing the memory required.  */
+/* Applies to: struct members, struct, union,
+   in C++ also: class.  */
+#if _GL_HAS_ATTRIBUTE (packed)
+# define _GL_ATTRIBUTE_PACKED __attribute__ ((__packed__))
+#else
+# define _GL_ATTRIBUTE_PACKED
+#endif
+
+/* _GL_ATTRIBUTE_PURE declares that It is OK for a compiler to omit duplicate
+   calls to the function with the same arguments if observable state is not
+   changed between calls.
+   This attribute is safe for a function that does not affect
+   observable state, and always returns exactly once.
+   (This attribute is looser than _GL_ATTRIBUTE_CONST.)  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (pure)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE
+#endif
+
+/* _GL_ATTRIBUTE_RETURNS_NONNULL declares that the function's return value is
+   a non-NULL pointer.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (returns_nonnull)
+# define _GL_ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__))
+#else
+# define _GL_ATTRIBUTE_RETURNS_NONNULL
+#endif
+
+/* _GL_ATTRIBUTE_SENTINEL(pos) declares that the variadic function expects a
+   trailing NULL argument.
+   _GL_ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99).
+   _GL_ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (sentinel)
+# define _GL_ATTRIBUTE_SENTINEL(pos) __attribute__ ((__sentinel__ pos))
+#else
+# define _GL_ATTRIBUTE_SENTINEL(pos)
+#endif
+
+/* A helper macro.  Don't use it directly.  */
+#if _GL_HAS_ATTRIBUTE (unused)
+# define _GL_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#else
+# define _GL_ATTRIBUTE_UNUSED
+#endif
+
+
+/* _GL_UNUSED_LABEL; declares that it is not a programming mistake if the
+   immediately preceding label is not used.  The compiler should not warn
+   if the label is not used.  */
+/* Applies to: label (both in C and C++).  */
+/* Note that g++ < 4.5 does not support the '__attribute__ ((__unused__)) ;'
+   syntax.  But clang does.  */
+#if !(defined __cplusplus && !_GL_GNUC_PREREQ (4, 5)) || defined __clang__
+# define _GL_UNUSED_LABEL _GL_ATTRIBUTE_UNUSED
+#else
+# define _GL_UNUSED_LABEL
+#endif
+
+
+/* Define as 'access' if you don't have the eaccess() function. */
+#undef eaccess
+
 /* Please see the Gnulib manual for how to use these macros.
 
    Suppress extern inline with HP-UX cc, as it appears to be broken; see
@@ -1542,7 +2359,8 @@
    mishandles inline functions that call each other.  E.g., for 'inline void f
    (void) { } inline void g (void) { f (); }', c99 incorrectly complains
    'reference to static identifier "f" in extern inline function'.
-   This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16.
+   This bug was observed with Oracle Developer Studio 12.6
+   (Sun C 5.15 SunOS_sparc 2017/05/30).
 
    Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
    on configurations that mistakenly use 'static inline' to implement
@@ -1608,8 +2426,8 @@
 # define _GL_EXTERN_INLINE extern
 # define _GL_EXTERN_INLINE_IN_USE
 #else
-# define _GL_INLINE static _GL_UNUSED
-# define _GL_EXTERN_INLINE static _GL_UNUSED
+# define _GL_INLINE _GL_UNUSED static
+# define _GL_EXTERN_INLINE _GL_UNUSED static
 #endif
 
 /* In GCC 4.6 (inclusive) to 5.1 (exclusive),
@@ -1662,13 +2480,29 @@
 /* Define to a type if <wchar.h> does not define. */
 #undef mbstate_t
 
+/* _GL_CMP (n1, n2) performs a three-valued comparison on n1 vs. n2, where
+   n1 and n2 are expressions without side effects, that evaluate to real
+   numbers (excluding NaN).
+   It returns
+     1  if n1 > n2
+     0  if n1 == n2
+     -1 if n1 < n2
+   The naïve code   (n1 > n2 ? 1 : n1 < n2 ? -1 : 0)  produces a conditional
+   jump with nearly all GCC versions up to GCC 10.
+   This variant     (n1 < n2 ? -1 : n1 > n2)  produces a conditional with many
+   GCC versions up to GCC 9.
+   The better code  (n1 > n2) - (n1 < n2)  from Hacker's Delight § 2-9
+   avoids conditional jumps in all GCC versions >= 3.4.  */
+#define _GL_CMP(n1, n2) (((n1) > (n2)) - ((n1) < (n2)))
+
+
 /* Define to `int' if <sys/types.h> does not define. */
 #undef mode_t
 
 /* Define to the type of st_nlink in struct stat, or a supertype. */
 #undef nlink_t
 
-/* Define to `int' if <sys/types.h> does not define. */
+/* Define as a signed integer type capable of holding a process identifier. */
 #undef pid_t
 
 /* Define as the type of the result of subtracting two pointers, if the system
@@ -1677,14 +2511,15 @@
 
 /* Define to the equivalent of the C99 'restrict' keyword, or to
    nothing if this is not supported.  Do not define if restrict is
-   supported directly.  */
+   supported only directly.  */
 #undef restrict
-/* Work around a bug in Sun C++: it does not support _Restrict or
-   __restrict__, even though the corresponding Sun C compiler ends up with
-   "#define restrict _Restrict" or "#define restrict __restrict__" in the
-   previous line.  Perhaps some future version of Sun C++ will work with
-   restrict; if so, hopefully it defines __RESTRICT like Sun C does.  */
-#if defined __SUNPRO_CC && !defined __RESTRICT
+/* Work around a bug in older versions of Sun C++, which did not
+   #define __restrict__ or support _Restrict or __restrict__
+   even though the corresponding Sun C compiler ended up with
+   "#define restrict _Restrict" or "#define restrict __restrict__"
+   in the previous line.  This workaround can be removed once
+   we assume Oracle Developer Studio 12.5 (2016) or later.  */
+#if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__
 # define _Restrict
 # define __restrict__
 #endif
@@ -1702,46 +2537,18 @@
 /* Define to `int' if <sys/types.h> doesn't define. */
 #undef uid_t
 
-/* Define as a marker that can be attached to declarations that might not
-    be used.  This helps to reduce warnings, such as from
-    GCC -Wunused-parameter.  */
-#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
-# define _GL_UNUSED __attribute__ ((__unused__))
-#else
-# define _GL_UNUSED
-#endif
-/* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name
-   is a misnomer outside of parameter lists.  */
-#define _UNUSED_PARAMETER_ _GL_UNUSED
 
-/* gcc supports the "unused" attribute on possibly unused labels, and
-   g++ has since version 4.5.  Note to support C++ as well as C,
-   _GL_UNUSED_LABEL should be used with a trailing ;  */
-#if !defined __cplusplus || __GNUC__ > 4 \
-    || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
-# define _GL_UNUSED_LABEL _GL_UNUSED
-#else
-# define _GL_UNUSED_LABEL
-#endif
-
-/* The __pure__ attribute was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define _GL_ATTRIBUTE_PURE /* empty */
-#endif
-
-/* The __const__ attribute was added in gcc 2.95.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
-# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
-#else
-# define _GL_ATTRIBUTE_CONST /* empty */
-#endif
-
-/* The __malloc__ attribute was added in gcc 3.  */
-#if 3 <= __GNUC__
-# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
-#else
-# define _GL_ATTRIBUTE_MALLOC /* empty */
-#endif
-
+  /* This definition is a duplicate of the one in unitypes.h.
+     It is here so that we can cope with an older version of unitypes.h
+     that does not contain this definition and that is pre-installed among
+     the public header files.  */
+  # if defined __restrict \
+       || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+       || __clang_major__ >= 3
+  #  define _UC_RESTRICT __restrict
+  # elif 199901L <= __STDC_VERSION__ || defined restrict
+  #  define _UC_RESTRICT restrict
+  # else
+  #  define _UC_RESTRICT
+  # endif
+  
diff --git a/lib/diffseq.h b/lib/diffseq.h
index c48da0c..1cac430 100644
--- a/lib/diffseq.h
+++ b/lib/diffseq.h
@@ -1,6 +1,6 @@
 /* Analyze differences between two vectors.
 
-   Copyright (C) 1988-1989, 1992-1995, 2001-2004, 2006-2019 Free Software
+   Copyright (C) 1988-1989, 1992-1995, 2001-2004, 2006-2021 Free Software
    Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -51,10 +51,14 @@
      EXTRA_CONTEXT_FIELDS    Declarations of fields for 'struct context'.
      NOTE_DELETE(ctxt, xoff) Record the removal of the object xvec[xoff].
      NOTE_INSERT(ctxt, yoff) Record the insertion of the object yvec[yoff].
+     NOTE_ORDERED            (Optional) A boolean expression saying that
+                             NOTE_DELETE and NOTE_INSERT calls must be
+                             issued in offset order.
      EARLY_ABORT(ctxt)       (Optional) A boolean expression that triggers an
                              early abort of the computation.
      USE_HEURISTIC           (Optional) Define if you want to support the
                              heuristic for large vectors.
+
    It is also possible to use this file with abstract arrays.  In this case,
    xvec and yvec are not represented in memory.  They only exist conceptually.
    In this case, the list of defines above is amended as follows:
@@ -63,6 +67,7 @@
      XVECREF_YVECREF_EQUAL(ctxt, xoff, yoff)
                              A three-argument macro: References xvec[xoff] and
                              yvec[yoff] and tests these elements for equality.
+
    Before including this file, you also need to include:
      #include <limits.h>
      #include <stdbool.h>
@@ -78,6 +83,10 @@
 # define EARLY_ABORT(ctxt) false
 #endif
 
+#ifndef NOTE_ORDERED
+# define NOTE_ORDERED false
+#endif
+
 /* Use this to suppress gcc's "...may be used before initialized" warnings.
    Beware: The Code argument must not contain commas.  */
 #ifndef IF_LINT
@@ -88,15 +97,6 @@
 # endif
 #endif
 
-/* As above, but when Code must contain one comma. */
-#ifndef IF_LINT2
-# if defined GCC_LINT || defined lint
-#  define IF_LINT2(Code1, Code2) Code1, Code2
-# else
-#  define IF_LINT2(Code1, Code2) /* empty */
-# endif
-#endif
-
 /*
  * Context of comparison operation.
  */
@@ -468,49 +468,89 @@
   #define XREF_YREF_EQUAL(x,y)  XVECREF_YVECREF_EQUAL (ctxt, x, y)
 #endif
 
-  /* Slide down the bottom initial diagonal.  */
-  while (xoff < xlim && yoff < ylim && XREF_YREF_EQUAL (xoff, yoff))
+  while (true)
     {
-      xoff++;
-      yoff++;
-    }
+      /* Slide down the bottom initial diagonal.  */
+      while (xoff < xlim && yoff < ylim && XREF_YREF_EQUAL (xoff, yoff))
+        {
+          xoff++;
+          yoff++;
+        }
 
-  /* Slide up the top initial diagonal. */
-  while (xoff < xlim && yoff < ylim && XREF_YREF_EQUAL (xlim - 1, ylim - 1))
-    {
-      xlim--;
-      ylim--;
-    }
+      /* Slide up the top initial diagonal. */
+      while (xoff < xlim && yoff < ylim && XREF_YREF_EQUAL (xlim - 1, ylim - 1))
+        {
+          xlim--;
+          ylim--;
+        }
 
-  /* Handle simple cases. */
-  if (xoff == xlim)
-    while (yoff < ylim)
-      {
-        NOTE_INSERT (ctxt, yoff);
-        if (EARLY_ABORT (ctxt))
-          return true;
-        yoff++;
-      }
-  else if (yoff == ylim)
-    while (xoff < xlim)
-      {
-        NOTE_DELETE (ctxt, xoff);
-        if (EARLY_ABORT (ctxt))
-          return true;
-        xoff++;
-      }
-  else
-    {
-      struct partition part IF_LINT2 (= { .xmid = 0, .ymid = 0 });
+      /* Handle simple cases. */
+      if (xoff == xlim)
+        {
+          while (yoff < ylim)
+            {
+              NOTE_INSERT (ctxt, yoff);
+              if (EARLY_ABORT (ctxt))
+                return true;
+              yoff++;
+            }
+          break;
+        }
+      if (yoff == ylim)
+        {
+          while (xoff < xlim)
+            {
+              NOTE_DELETE (ctxt, xoff);
+              if (EARLY_ABORT (ctxt))
+                return true;
+              xoff++;
+            }
+          break;
+        }
+
+      struct partition part;
 
       /* Find a point of correspondence in the middle of the vectors.  */
       diag (xoff, xlim, yoff, ylim, find_minimal, &part, ctxt);
 
       /* Use the partitions to split this problem into subproblems.  */
-      if (compareseq (xoff, part.xmid, yoff, part.ymid, part.lo_minimal, ctxt))
-        return true;
-      if (compareseq (part.xmid, xlim, part.ymid, ylim, part.hi_minimal, ctxt))
-        return true;
+      OFFSET xoff1, xlim1, yoff1, ylim1, xoff2, xlim2, yoff2, ylim2;
+      bool find_minimal1, find_minimal2;
+      if (!NOTE_ORDERED
+          && ((xlim + ylim) - (part.xmid + part.ymid)
+              < (part.xmid + part.ymid) - (xoff + yoff)))
+        {
+          /* The second problem is smaller and the caller doesn't
+             care about order, so do the second problem first to
+             lessen recursion.  */
+          xoff1 = part.xmid; xlim1 = xlim;
+          yoff1 = part.ymid; ylim1 = ylim;
+          find_minimal1 = part.hi_minimal;
+
+          xoff2 = xoff; xlim2 = part.xmid;
+          yoff2 = yoff; ylim2 = part.ymid;
+          find_minimal2 = part.lo_minimal;
+        }
+      else
+        {
+          xoff1 = xoff; xlim1 = part.xmid;
+          yoff1 = yoff; ylim1 = part.ymid;
+          find_minimal1 = part.lo_minimal;
+
+          xoff2 = part.xmid; xlim2 = xlim;
+          yoff2 = part.ymid; ylim2 = ylim;
+          find_minimal2 = part.hi_minimal;
+        }
+
+      /* Recurse to do one subproblem.  */
+      bool early = compareseq (xoff1, xlim1, yoff1, ylim1, find_minimal1, ctxt);
+      if (early)
+        return early;
+
+      /* Iterate to do the other subproblem.  */
+      xoff = xoff2; xlim = xlim2;
+      yoff = yoff2; ylim = ylim2;
+      find_minimal = find_minimal2;
     }
 
   return false;
diff --git a/lib/dirent-private.h b/lib/dirent-private.h
new file mode 100644
index 0000000..81f48d7
--- /dev/null
+++ b/lib/dirent-private.h
@@ -0,0 +1,44 @@
+/* Private details of the DIR type.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _DIRENT_PRIVATE_H
+#define _DIRENT_PRIVATE_H 1
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+/* Don't assume that UNICODE is not defined.  */
+#undef WIN32_FIND_DATA
+#define WIN32_FIND_DATA WIN32_FIND_DATAA
+
+struct gl_directory
+{
+  /* Status, or error code to produce in next readdir() call.
+     -2 means the end of the directory is already reached,
+     -1 means the entry was already filled by FindFirstFile,
+     0 means the entry needs to be filled using FindNextFile.
+     A positive value is an error code.  */
+  int status;
+  /* Handle, reading the directory, at current position.  */
+  HANDLE current;
+  /* Found directory entry.  */
+  WIN32_FIND_DATA entry;
+  /* Argument to pass to FindFirstFile.  It consists of the absolutized
+     directory name, followed by a directory separator and the wildcards.  */
+  char dir_name_mask[1];
+};
+
+#endif /* _DIRENT_PRIVATE_H */
diff --git a/lib/dirent.in.h b/lib/dirent.in.h
new file mode 100644
index 0000000..4deb0cb
--- /dev/null
+++ b/lib/dirent.in.h
@@ -0,0 +1,321 @@
+/* A GNU-like <dirent.h>.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _@GUARD_PREFIX@_DIRENT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard.  */
+#if @HAVE_DIRENT_H@
+# @INCLUDE_NEXT@ @NEXT_DIRENT_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_DIRENT_H
+#define _@GUARD_PREFIX@_DIRENT_H
+
+/* Get ino_t.  Needed on some systems, including glibc 2.8.  */
+#include <sys/types.h>
+
+#if !@HAVE_DIRENT_H@
+/* Define types DIR and 'struct dirent'.  */
+# if !GNULIB_defined_struct_dirent
+struct dirent
+{
+  char d_type;
+  char d_name[1];
+};
+/* Possible values for 'd_type'.  */
+#  define DT_UNKNOWN 0
+#  define DT_FIFO    1          /* FIFO */
+#  define DT_CHR     2          /* character device */
+#  define DT_DIR     4          /* directory */
+#  define DT_BLK     6          /* block device */
+#  define DT_REG     8          /* regular file */
+#  define DT_LNK    10          /* symbolic link */
+#  define DT_SOCK   12          /* socket */
+#  define DT_WHT    14          /* whiteout */
+typedef struct gl_directory DIR;
+#  define GNULIB_defined_struct_dirent 1
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.  */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if __GNUC__ >= 11
+#  define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+#  define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+   allocated memory.  */
+/* Applies to: functions.  */
+#ifndef _GL_ATTRIBUTE_MALLOC
+# if __GNUC__ >= 3 || defined __clang__
+#  define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+#  define _GL_ATTRIBUTE_MALLOC
+# endif
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The attribute __pure__ was added in gcc 2.96.  */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
+
+/* Declare overridden functions.  */
+
+#if @GNULIB_CLOSEDIR@
+# if @REPLACE_CLOSEDIR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef closedir
+#   define closedir rpl_closedir
+#   define GNULIB_defined_closedir 1
+#  endif
+_GL_FUNCDECL_RPL (closedir, int, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (closedir, int, (DIR *dirp));
+# else
+#  if !@HAVE_CLOSEDIR@
+_GL_FUNCDECL_SYS (closedir, int, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (closedir, int, (DIR *dirp));
+# endif
+_GL_CXXALIASWARN (closedir);
+#elif defined GNULIB_POSIXCHECK
+# undef closedir
+# if HAVE_RAW_DECL_CLOSEDIR
+_GL_WARN_ON_USE (closedir, "closedir is not portable - "
+                 "use gnulib module closedir for portability");
+# endif
+#endif
+
+#if @GNULIB_OPENDIR@
+# if @REPLACE_OPENDIR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef opendir
+#   define opendir rpl_opendir
+#   define GNULIB_defined_opendir 1
+#  endif
+_GL_FUNCDECL_RPL (opendir, DIR *,
+                  (const char *dir_name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+_GL_CXXALIAS_RPL (opendir, DIR *, (const char *dir_name));
+# else
+#  if !@HAVE_OPENDIR@ || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (opendir, DIR *,
+                  (const char *dir_name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+#  endif
+_GL_CXXALIAS_SYS (opendir, DIR *, (const char *dir_name));
+# endif
+_GL_CXXALIASWARN (opendir);
+#else
+# if @GNULIB_CLOSEDIR@ && __GNUC__ >= 11 && !defined opendir
+/* For -Wmismatched-dealloc: Associate opendir with closedir or
+   rpl_closedir.  */
+_GL_FUNCDECL_SYS (opendir, DIR *,
+                  (const char *dir_name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef opendir
+#  if HAVE_RAW_DECL_OPENDIR
+_GL_WARN_ON_USE (opendir, "opendir is not portable - "
+                 "use gnulib module opendir for portability");
+#  endif
+# endif
+#endif
+
+#if @GNULIB_READDIR@
+# if !@HAVE_READDIR@
+_GL_FUNCDECL_SYS (readdir, struct dirent *, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (readdir, struct dirent *, (DIR *dirp));
+_GL_CXXALIASWARN (readdir);
+#elif defined GNULIB_POSIXCHECK
+# undef readdir
+# if HAVE_RAW_DECL_READDIR
+_GL_WARN_ON_USE (readdir, "readdir is not portable - "
+                 "use gnulib module readdir for portability");
+# endif
+#endif
+
+#if @GNULIB_REWINDDIR@
+# if !@HAVE_REWINDDIR@
+_GL_FUNCDECL_SYS (rewinddir, void, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (rewinddir, void, (DIR *dirp));
+_GL_CXXALIASWARN (rewinddir);
+#elif defined GNULIB_POSIXCHECK
+# undef rewinddir
+# if HAVE_RAW_DECL_REWINDDIR
+_GL_WARN_ON_USE (rewinddir, "rewinddir is not portable - "
+                 "use gnulib module rewinddir for portability");
+# endif
+#endif
+
+#if @GNULIB_DIRFD@
+/* Return the file descriptor associated with the given directory stream,
+   or -1 if none exists.  */
+# if @REPLACE_DIRFD@
+/* On kLIBC, dirfd() is a macro that does not work.  Undefine it.  */
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) || defined dirfd
+#   undef dirfd
+#   define dirfd rpl_dirfd
+#  endif
+_GL_FUNCDECL_RPL (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (dirfd, int, (DIR *));
+
+#  ifdef __KLIBC__
+/* Gnulib internal hooks needed to maintain the dirfd metadata.  */
+_GL_EXTERN_C int _gl_register_dirp_fd (int fd, DIR *dirp)
+     _GL_ARG_NONNULL ((2));
+_GL_EXTERN_C void _gl_unregister_dirp_fd (int fd);
+#  endif
+# else
+#  if defined __cplusplus && defined GNULIB_NAMESPACE && defined dirfd
+    /* dirfd is defined as a macro and not as a function.
+       Turn it into a function and get rid of the macro.  */
+static inline int (dirfd) (DIR *dp) { return dirfd (dp); }
+#   undef dirfd
+#  endif
+#  if !(@HAVE_DECL_DIRFD@ || defined dirfd)
+_GL_FUNCDECL_SYS (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (dirfd, int, (DIR *));
+# endif
+_GL_CXXALIASWARN (dirfd);
+#elif defined GNULIB_POSIXCHECK
+# undef dirfd
+# if HAVE_RAW_DECL_DIRFD
+_GL_WARN_ON_USE (dirfd, "dirfd is unportable - "
+                 "use gnulib module dirfd for portability");
+# endif
+#endif
+
+#if @GNULIB_FDOPENDIR@
+/* Open a directory stream visiting the given directory file
+   descriptor.  Return NULL and set errno if fd is not visiting a
+   directory.  On success, this function consumes fd (it will be
+   implicitly closed either by this function or by a subsequent
+   closedir).  */
+# if @REPLACE_FDOPENDIR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fdopendir
+#   define fdopendir rpl_fdopendir
+#  endif
+_GL_FUNCDECL_RPL (fdopendir, DIR *,
+                  (int fd)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+_GL_CXXALIAS_RPL (fdopendir, DIR *, (int fd));
+# else
+#  if !@HAVE_FDOPENDIR@ || !@HAVE_DECL_FDOPENDIR@ || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (fdopendir, DIR *,
+                  (int fd)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+#  endif
+_GL_CXXALIAS_SYS (fdopendir, DIR *, (int fd));
+# endif
+_GL_CXXALIASWARN (fdopendir);
+#else
+# if @GNULIB_CLOSEDIR@ && __GNUC__ >= 11 && !defined fdopendir
+/* For -Wmismatched-dealloc: Associate fdopendir with closedir or
+   rpl_closedir.  */
+_GL_FUNCDECL_SYS (fdopendir, DIR *,
+                  (int fd)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef fdopendir
+#  if HAVE_RAW_DECL_FDOPENDIR
+_GL_WARN_ON_USE (fdopendir, "fdopendir is unportable - "
+                 "use gnulib module fdopendir for portability");
+#  endif
+# endif
+#endif
+
+#if @GNULIB_SCANDIR@
+/* Scan the directory DIR, calling FILTER on each directory entry.
+   Entries for which FILTER returns nonzero are individually malloc'd,
+   sorted using qsort with CMP, and collected in a malloc'd array in
+   *NAMELIST.  Returns the number of entries selected, or -1 on error.  */
+# if !@HAVE_SCANDIR@
+_GL_FUNCDECL_SYS (scandir, int,
+                  (const char *dir, struct dirent ***namelist,
+                   int (*filter) (const struct dirent *),
+                   int (*cmp) (const struct dirent **, const struct dirent **))
+                  _GL_ARG_NONNULL ((1, 2, 4)));
+# endif
+/* Need to cast, because on glibc systems, the fourth parameter is
+                        int (*cmp) (const void *, const void *).  */
+_GL_CXXALIAS_SYS_CAST (scandir, int,
+                       (const char *dir, struct dirent ***namelist,
+                        int (*filter) (const struct dirent *),
+                        int (*cmp) (const struct dirent **, const struct dirent **)));
+_GL_CXXALIASWARN (scandir);
+#elif defined GNULIB_POSIXCHECK
+# undef scandir
+# if HAVE_RAW_DECL_SCANDIR
+_GL_WARN_ON_USE (scandir, "scandir is unportable - "
+                 "use gnulib module scandir for portability");
+# endif
+#endif
+
+#if @GNULIB_ALPHASORT@
+/* Compare two 'struct dirent' entries alphabetically.  */
+# if !@HAVE_ALPHASORT@
+_GL_FUNCDECL_SYS (alphasort, int,
+                  (const struct dirent **, const struct dirent **)
+                  _GL_ATTRIBUTE_PURE
+                  _GL_ARG_NONNULL ((1, 2)));
+# endif
+/* Need to cast, because on glibc systems, the parameters are
+                       (const void *, const void *).  */
+_GL_CXXALIAS_SYS_CAST (alphasort, int,
+                       (const struct dirent **, const struct dirent **));
+_GL_CXXALIASWARN (alphasort);
+#elif defined GNULIB_POSIXCHECK
+# undef alphasort
+# if HAVE_RAW_DECL_ALPHASORT
+_GL_WARN_ON_USE (alphasort, "alphasort is unportable - "
+                 "use gnulib module alphasort for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_DIRENT_H */
+#endif /* _@GUARD_PREFIX@_DIRENT_H */
diff --git a/lib/dirfd.c b/lib/dirfd.c
new file mode 100644
index 0000000..640cb4f
--- /dev/null
+++ b/lib/dirfd.c
@@ -0,0 +1,98 @@
+/* dirfd.c -- return the file descriptor associated with an open DIR*
+
+   Copyright (C) 2001, 2006, 2008-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include <dirent.h>
+#include <errno.h>
+
+#ifdef __KLIBC__
+# include <stdlib.h>
+# include <io.h>
+
+static struct dirp_fd_list
+{
+  DIR *dirp;
+  int fd;
+  struct dirp_fd_list *next;
+} *dirp_fd_start = NULL;
+
+/* Register fd associated with dirp to dirp_fd_list. */
+int
+_gl_register_dirp_fd (int fd, DIR *dirp)
+{
+  struct dirp_fd_list *new_dirp_fd = malloc (sizeof *new_dirp_fd);
+  if (!new_dirp_fd)
+    return -1;
+
+  new_dirp_fd->dirp = dirp;
+  new_dirp_fd->fd = fd;
+  new_dirp_fd->next = dirp_fd_start;
+
+  dirp_fd_start = new_dirp_fd;
+
+  return 0;
+}
+
+/* Unregister fd from dirp_fd_list with closing it */
+void
+_gl_unregister_dirp_fd (int fd)
+{
+  struct dirp_fd_list *dirp_fd;
+  struct dirp_fd_list *dirp_fd_prev;
+
+  for (dirp_fd_prev = NULL, dirp_fd = dirp_fd_start; dirp_fd;
+       dirp_fd_prev = dirp_fd, dirp_fd = dirp_fd->next)
+    {
+      if (dirp_fd->fd == fd)
+        {
+          if (dirp_fd_prev)
+            dirp_fd_prev->next = dirp_fd->next;
+          else  /* dirp_fd == dirp_fd_start */
+            dirp_fd_start = dirp_fd_start->next;
+
+          close (fd);
+          free (dirp_fd);
+          break;
+        }
+    }
+}
+#endif
+
+int
+dirfd (DIR *dir_p)
+{
+  int fd = DIR_TO_FD (dir_p);
+  if (fd == -1)
+#ifndef __KLIBC__
+    errno = ENOTSUP;
+#else
+    {
+      struct dirp_fd_list *dirp_fd;
+
+      for (dirp_fd = dirp_fd_start; dirp_fd; dirp_fd = dirp_fd->next)
+        if (dirp_fd->dirp == dir_p)
+          return dirp_fd->fd;
+
+      errno = EINVAL;
+    }
+#endif
+
+  return fd;
+}
diff --git a/lib/dirname-lgpl.c b/lib/dirname-lgpl.c
index 7cf89d8..95f9c99 100644
--- a/lib/dirname-lgpl.c
+++ b/lib/dirname-lgpl.c
@@ -1,19 +1,19 @@
 /* dirname.c -- return all but the last element in a file name
 
-   Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2019 Free Software
+   Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2021 Free Software
    Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/dirname.c b/lib/dirname.c
index 1e042a5..d8b07d3 100644
--- a/lib/dirname.c
+++ b/lib/dirname.c
@@ -1,6 +1,6 @@
 /* dirname.c -- return all but the last element in a file name
 
-   Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2019 Free Software
+   Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2021 Free Software
    Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
diff --git a/lib/dirname.h b/lib/dirname.h
index 5791659..25abc7b 100644
--- a/lib/dirname.h
+++ b/lib/dirname.h
@@ -1,49 +1,49 @@
-/*  Take file names apart into directory and base names.
+/* Take file names apart into directory and base names.
 
-    Copyright (C) 1998, 2001, 2003-2006, 2009-2019 Free Software Foundation,
-    Inc.
+   Copyright (C) 1998, 2001, 2003-2006, 2009-2021 Free Software Foundation,
+   Inc.
 
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 3 of the License, or
-    (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef DIRNAME_H_
 # define DIRNAME_H_ 1
 
 # include <stdbool.h>
-# include <stddef.h>
-# include "dosname.h"
+# include <stdlib.h>
+# include "filename.h"
+# include "basename-lgpl.h"
 
 # ifndef DIRECTORY_SEPARATOR
 #  define DIRECTORY_SEPARATOR '/'
 # endif
 
-# ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
-#  define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
-# endif
-
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 # if GNULIB_DIRNAME
-char *base_name (char const *file) _GL_ATTRIBUTE_MALLOC;
-char *dir_name (char const *file);
+char *base_name (char const *file)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
+char *dir_name (char const *file)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
 # endif
 
-char *mdir_name (char const *file);
-size_t base_len (char const *file) _GL_ATTRIBUTE_PURE;
+char *mdir_name (char const *file)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
 size_t dir_len (char const *file) _GL_ATTRIBUTE_PURE;
-char *last_component (char const *file) _GL_ATTRIBUTE_PURE;
 
 bool strip_trailing_slashes (char *file);
 
diff --git a/lib/dosname.h b/lib/dosname.h
deleted file mode 100644
index c0ab684..0000000
--- a/lib/dosname.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* File names on MS-DOS/Windows systems.
-
-   Copyright (C) 2000-2001, 2004-2006, 2009-2019 Free Software Foundation, Inc.
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <https://www.gnu.org/licenses/>.
-
-   From Paul Eggert and Jim Meyering.  */
-
-#ifndef _DOSNAME_H
-#define _DOSNAME_H
-
-#if (defined _WIN32 || defined __CYGWIN__ \
-     || defined __EMX__ || defined __MSDOS__ || defined __DJGPP__)
-   /* This internal macro assumes ASCII, but all hosts that support drive
-      letters use ASCII.  */
-# define _IS_DRIVE_LETTER(C) (((unsigned int) (C) | ('a' - 'A')) - 'a'  \
-                              <= 'z' - 'a')
-# define FILE_SYSTEM_PREFIX_LEN(Filename) \
-          (_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':' ? 2 : 0)
-# ifndef __CYGWIN__
-#  define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 1
-# endif
-# define ISSLASH(C) ((C) == '/' || (C) == '\\')
-#else
-# define FILE_SYSTEM_PREFIX_LEN(Filename) 0
-# define ISSLASH(C) ((C) == '/')
-#endif
-
-#ifndef FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
-# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
-#endif
-
-#if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
-#  define IS_ABSOLUTE_FILE_NAME(F) ISSLASH ((F)[FILE_SYSTEM_PREFIX_LEN (F)])
-# else
-#  define IS_ABSOLUTE_FILE_NAME(F)                              \
-     (ISSLASH ((F)[0]) || FILE_SYSTEM_PREFIX_LEN (F) != 0)
-#endif
-#define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F))
-
-#endif /* DOSNAME_H_ */
diff --git a/lib/dup-safer-flag.c b/lib/dup-safer-flag.c
index 485f741..bba1354 100644
--- a/lib/dup-safer-flag.c
+++ b/lib/dup-safer-flag.c
@@ -1,7 +1,7 @@
 /* Duplicate a file descriptor result, avoiding clobbering
    STD{IN,OUT,ERR}_FILENO, with specific flags.
 
-   Copyright (C) 2001, 2004-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2004-2006, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/dup-safer.c b/lib/dup-safer.c
index c0c5f2a..2db1520 100644
--- a/lib/dup-safer.c
+++ b/lib/dup-safer.c
@@ -1,6 +1,6 @@
 /* Invoke dup, but avoid some glitches.
 
-   Copyright (C) 2001, 2004-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2004-2006, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/dup.c b/lib/dup.c
new file mode 100644
index 0000000..c3c727a
--- /dev/null
+++ b/lib/dup.c
@@ -0,0 +1,92 @@
+/* Duplicate an open file descriptor.
+
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <unistd.h>
+
+#include <errno.h>
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+#endif
+
+#undef dup
+
+#if defined _WIN32 && !defined __CYGWIN__
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static int
+dup_nothrow (int fd)
+{
+  int result;
+
+  TRY_MSVC_INVAL
+    {
+      result = _dup (fd);
+    }
+  CATCH_MSVC_INVAL
+    {
+      result = -1;
+      errno = EBADF;
+    }
+  DONE_MSVC_INVAL;
+
+  return result;
+}
+# else
+#  define dup_nothrow _dup
+# endif
+#elif defined __KLIBC__
+# include <fcntl.h>
+# include <sys/stat.h>
+
+# include <InnoTekLIBC/backend.h>
+
+static int
+dup_nothrow (int fd)
+{
+  int dupfd;
+  struct stat sbuf;
+
+  dupfd = dup (fd);
+  if (dupfd == -1 && errno == ENOTSUP \
+      && !fstat (fd, &sbuf) && S_ISDIR (sbuf.st_mode))
+    {
+      char path[_MAX_PATH];
+
+      /* Get a path from fd */
+      if (!__libc_Back_ioFHToPath (fd, path, sizeof (path)))
+        dupfd = open (path, O_RDONLY);
+    }
+
+  return dupfd;
+}
+#else
+# define dup_nothrow dup
+#endif
+
+int
+rpl_dup (int fd)
+{
+  int result = dup_nothrow (fd);
+#if REPLACE_FCHDIR
+  if (result >= 0)
+    result = _gl_register_dup (fd, result);
+#endif
+  return result;
+}
diff --git a/lib/dup2.c b/lib/dup2.c
index d3aafa4..53e5552 100644
--- a/lib/dup2.c
+++ b/lib/dup2.c
@@ -1,18 +1,18 @@
 /* Duplicate an open file descriptor to a specified file descriptor.
 
-   Copyright (C) 1999, 2004-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2004-2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* written by Paul Eggert */
@@ -25,28 +25,26 @@
 #include <errno.h>
 #include <fcntl.h>
 
-#if HAVE_DUP2
+#undef dup2
 
-# undef dup2
-
-# if defined _WIN32 && ! defined __CYGWIN__
+#if defined _WIN32 && ! defined __CYGWIN__
 
 /* Get declarations of the native Windows API functions.  */
-#  define WIN32_LEAN_AND_MEAN
-#  include <windows.h>
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
 
-#  if HAVE_MSVC_INVALID_PARAMETER_HANDLER
-#   include "msvc-inval.h"
-#  endif
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+#  include "msvc-inval.h"
+# endif
 
 /* Get _get_osfhandle.  */
-#  if GNULIB_MSVC_NOTHROW
-#   include "msvc-nothrow.h"
-#  else
-#   include <io.h>
-#  endif
+# if GNULIB_MSVC_NOTHROW
+#  include "msvc-nothrow.h"
+# else
+#  include <io.h>
+# endif
 
-#  if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
 static int
 dup2_nothrow (int fd, int desired_fd)
 {
@@ -54,7 +52,7 @@
 
   TRY_MSVC_INVAL
     {
-      result = dup2 (fd, desired_fd);
+      result = _dup2 (fd, desired_fd);
     }
   CATCH_MSVC_INVAL
     {
@@ -65,9 +63,9 @@
 
   return result;
 }
-#  else
-#   define dup2_nothrow dup2
-#  endif
+# else
+#  define dup2_nothrow _dup2
+# endif
 
 static int
 ms_windows_dup2 (int fd, int desired_fd)
@@ -103,11 +101,11 @@
   return result;
 }
 
-#  define dup2 ms_windows_dup2
+# define dup2 ms_windows_dup2
 
-# elif defined __KLIBC__
+#elif defined __KLIBC__
 
-#  include <InnoTekLIBC/backend.h>
+# include <InnoTekLIBC/backend.h>
 
 static int
 klibc_dup2dirfd (int fd, int desired_fd)
@@ -155,81 +153,37 @@
   return dupfd;
 }
 
-#  define dup2 klibc_dup2
-# endif
+# define dup2 klibc_dup2
+#endif
 
 int
 rpl_dup2 (int fd, int desired_fd)
 {
   int result;
 
-# ifdef F_GETFL
+#ifdef F_GETFL
   /* On Linux kernels 2.6.26-2.6.29, dup2 (fd, fd) returns -EBADF.
      On Cygwin 1.5.x, dup2 (1, 1) returns 0.
      On Cygwin 1.7.17, dup2 (1, -1) dumps core.
      On Cygwin 1.7.25, dup2 (1, 256) can dump core.
      On Haiku, dup2 (fd, fd) mistakenly clears FD_CLOEXEC.  */
-#  if HAVE_SETDTABLESIZE
+# if HAVE_SETDTABLESIZE
   setdtablesize (desired_fd + 1);
-#  endif
+# endif
   if (desired_fd < 0)
     fd = desired_fd;
   if (fd == desired_fd)
     return fcntl (fd, F_GETFL) == -1 ? -1 : fd;
-# endif
+#endif
 
   result = dup2 (fd, desired_fd);
 
   /* Correct an errno value on FreeBSD 6.1 and Cygwin 1.5.x.  */
   if (result == -1 && errno == EMFILE)
     errno = EBADF;
-# if REPLACE_FCHDIR
+#if REPLACE_FCHDIR
   if (fd != desired_fd && result != -1)
     result = _gl_register_dup (fd, result);
-# endif
+#endif
   return result;
 }
-
-#else /* !HAVE_DUP2 */
-
-/* On older platforms, dup2 did not exist.  */
-
-# ifndef F_DUPFD
-static int
-dupfd (int fd, int desired_fd)
-{
-  int duplicated_fd = dup (fd);
-  if (duplicated_fd < 0 || duplicated_fd == desired_fd)
-    return duplicated_fd;
-  else
-    {
-      int r = dupfd (fd, desired_fd);
-      int e = errno;
-      close (duplicated_fd);
-      errno = e;
-      return r;
-    }
-}
-# endif
-
-int
-dup2 (int fd, int desired_fd)
-{
-  int result = fcntl (fd, F_GETFL) < 0 ? -1 : fd;
-  if (result == -1 || fd == desired_fd)
-    return result;
-  close (desired_fd);
-# ifdef F_DUPFD
-  result = fcntl (fd, F_DUPFD, desired_fd);
-#  if REPLACE_FCHDIR
-  if (0 <= result)
-    result = _gl_register_dup (fd, result);
-#  endif
-# else
-  result = dupfd (fd, desired_fd);
-# endif
-  if (result == -1 && (errno == EMFILE || errno == EINVAL))
-    errno = EBADF;
-  return result;
-}
-#endif /* !HAVE_DUP2 */
diff --git a/lib/eloop-threshold.h b/lib/eloop-threshold.h
new file mode 100644
index 0000000..fcd30ab
--- /dev/null
+++ b/lib/eloop-threshold.h
@@ -0,0 +1,83 @@
+/* Threshold at which to diagnose ELOOP.  Generic version.
+   Copyright (C) 2012-2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _ELOOP_THRESHOLD_H
+#define _ELOOP_THRESHOLD_H      1
+
+#include <limits.h>
+#ifdef _LIBC
+# include <sys/param.h>
+# define _GL_ATTRIBUTE_CONST __attribute__ ((const))
+#else
+# include <unistd.h>
+# include "minmax.h"
+# define __sysconf sysconf
+# if (!defined SYMLOOP_MAX \
+      && ! (defined _SC_SYMLOOP_MAX && defined _POSIX_SYMLOOP_MAX))
+#  define SYMLOOP_MAX 8
+# endif
+#endif
+
+/* POSIX specifies SYMLOOP_MAX as the "Maximum number of symbolic
+   links that can be reliably traversed in the resolution of a
+   pathname in the absence of a loop."  This makes it a minimum that
+   we should certainly accept.  But it leaves open the possibility
+   that more might sometimes work--just not "reliably".
+
+   For example, Linux implements a complex policy whereby there is a
+   small limit on the number of direct symlink traversals (a symlink
+   to a symlink to a symlink), but larger limit on the total number of
+   symlink traversals overall.  Hence the SYMLOOP_MAX number should be
+   the small one, but the limit library functions enforce on users
+   should be the larger one.
+
+   So, we use the larger of the reported SYMLOOP_MAX (if any) and our
+   own constant MIN_ELOOP_THRESHOLD, below.  This constant should be
+   large enough that it never rules out a file name and directory tree
+   that the underlying system (i.e. calls to 'open' et al) would
+   resolve successfully.  It should be small enough that actual loops
+   are detected without a huge number of iterations.  */
+
+#ifndef MIN_ELOOP_THRESHOLD
+# define MIN_ELOOP_THRESHOLD    40
+#endif
+
+/* Return the maximum number of symlink traversals to permit
+   before diagnosing ELOOP.  */
+static inline unsigned int _GL_ATTRIBUTE_CONST
+__eloop_threshold (void)
+{
+#ifdef SYMLOOP_MAX
+  const int symloop_max = SYMLOOP_MAX;
+#else
+  /* The function is marked 'const' even though we use memory and
+     call a function, because sysconf is required to return the
+     same value in every call and so it must always be safe to
+     call __eloop_threshold exactly once and reuse the value.  */
+  static long int sysconf_symloop_max;
+  if (sysconf_symloop_max == 0)
+    sysconf_symloop_max = __sysconf (_SC_SYMLOOP_MAX);
+  const unsigned int symloop_max = (sysconf_symloop_max <= 0
+                                    ? _POSIX_SYMLOOP_MAX
+                                    : sysconf_symloop_max);
+#endif
+
+  return MAX (symloop_max, MIN_ELOOP_THRESHOLD);
+}
+
+#endif  /* eloop-threshold.h */
diff --git a/lib/errno.in.h b/lib/errno.in.h
index 3bd27f1..3cad9e2 100644
--- a/lib/errno.in.h
+++ b/lib/errno.in.h
@@ -1,19 +1,19 @@
 /* A POSIX-like <errno.h>.
 
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _@GUARD_PREFIX@_ERRNO_H
 
diff --git a/lib/error.c b/lib/error.c
index f8ab668..f89dcc5 100644
--- a/lib/error.c
+++ b/lib/error.c
@@ -1,18 +1,18 @@
 /* Error handler for noninteractive utilities
-   Copyright (C) 1990-1998, 2000-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 1990-1998, 2000-2007, 2009-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by David MacKenzie <djm@gnu.ai.mit.edu>.  */
@@ -40,7 +40,7 @@
 # include <wchar.h>
 # define mbsrtowcs __mbsrtowcs
 # define USE_UNLOCKED_IO 0
-# define _GL_ATTRIBUTE_FORMAT_PRINTF(a, b)
+# define _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD(a, b)
 # define _GL_ARG_NONNULL(a)
 #else
 # include "getprogname.h"
@@ -202,7 +202,7 @@
 #endif
 }
 
-static void _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0) _GL_ARG_NONNULL ((3))
+static void _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0) _GL_ARG_NONNULL ((3))
 error_tail (int status, int errnum, const char *message, va_list args)
 {
 #if _LIBC
diff --git a/lib/error.h b/lib/error.h
index 3759f8a..814715e 100644
--- a/lib/error.h
+++ b/lib/error.h
@@ -1,45 +1,26 @@
 /* Declaration for error-reporting function
-   Copyright (C) 1995-1997, 2003, 2006, 2008-2019 Free Software Foundation,
+   Copyright (C) 1995-1997, 2003, 2006, 2008-2021 Free Software Foundation,
    Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _ERROR_H
 #define _ERROR_H 1
 
-/* The __attribute__ feature is available in gcc versions 2.5 and later.
-   The __-protected variants of the attributes 'format' and 'printf' are
-   accepted by gcc versions 2.6.4 (effectively 2.7) and later.
-   We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
-   gnulib and libintl do '#define printf __printf__' when they override
-   the 'printf' function.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
-# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
-#else
-# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
-#endif
-
-/* On mingw, the flavor of printf depends on whether the extensions module
- * is in use; the check for <stdio.h> determines the witness macro.  */
-#ifndef _GL_ATTRIBUTE_SPEC_PRINTF
-# if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
-#  define _GL_ATTRIBUTE_SPEC_PRINTF __gnu_printf__
-# else
-#  define _GL_ATTRIBUTE_SPEC_PRINTF __printf__
-# endif
-#endif
+/* Get _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM.  */
+#include <stdio.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -50,11 +31,21 @@
    If STATUS is nonzero, terminate the program with 'exit (STATUS)'.  */
 
 extern void error (int __status, int __errnum, const char *__format, ...)
-     _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF, 3, 4));
+#if GNULIB_VFPRINTF_POSIX
+     _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 3, 4))
+#else
+     _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM, 3, 4))
+#endif
+     ;
 
 extern void error_at_line (int __status, int __errnum, const char *__fname,
                            unsigned int __lineno, const char *__format, ...)
-     _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF, 5, 6));
+#if GNULIB_VFPRINTF_POSIX
+     _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 5, 6))
+#else
+     _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM, 5, 6))
+#endif
+     ;
 
 /* If NULL, error will flush stdout, then print on stderr the program
    name, a colon and a space.  Otherwise, error will call this
diff --git a/lib/execute.c b/lib/execute.c
new file mode 100644
index 0000000..472b171
--- /dev/null
+++ b/lib/execute.c
@@ -0,0 +1,350 @@
+/* Creation of autonomous subprocesses.
+   Copyright (C) 2001-2004, 2006-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+
+#include <config.h>
+
+/* Specification.  */
+#include "execute.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "canonicalize.h"
+#include "error.h"
+#include "fatal-signal.h"
+#include "filename.h"
+#include "findprog.h"
+#include "wait-process.h"
+#include "xalloc.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+
+/* Choice of implementation for native Windows.
+   - Define to 0 to use the posix_spawn facility (modules 'posix_spawn' and
+     'posix_spawnp'), that is based on the module 'windows-spawn'.
+   - Define to 1 to use the older code, that uses the module 'windows-spawn'
+     directly.
+   You can set this macro from a Makefile or at configure time, from the
+   CPPFLAGS.  */
+#ifndef EXECUTE_IMPL_AVOID_POSIX_SPAWN
+# define EXECUTE_IMPL_AVOID_POSIX_SPAWN 0
+#endif
+
+
+#if (defined _WIN32 && !defined __CYGWIN__) && EXECUTE_IMPL_AVOID_POSIX_SPAWN
+
+/* Native Windows API.  */
+# if GNULIB_MSVC_NOTHROW
+#  include "msvc-nothrow.h"
+# else
+#  include <io.h>
+# endif
+# include <process.h>
+# include "windows-spawn.h"
+
+#else
+
+/* Unix API.  */
+# include <spawn.h>
+
+#endif
+
+
+#if defined EINTR && (defined _WIN32 && !defined __CYGWIN__) && EXECUTE_IMPL_AVOID_POSIX_SPAWN
+
+/* EINTR handling for close(), open().
+   These functions can return -1/EINTR even though we don't have any
+   signal handlers set up, namely when we get interrupted via SIGSTOP.  */
+
+static int
+nonintr_close (int fd)
+{
+  int retval;
+
+  do
+    retval = close (fd);
+  while (retval < 0 && errno == EINTR);
+
+  return retval;
+}
+#undef close /* avoid warning related to gnulib module unistd */
+#define close nonintr_close
+
+static int
+nonintr_open (const char *pathname, int oflag, mode_t mode)
+{
+  int retval;
+
+  do
+    retval = open (pathname, oflag, mode);
+  while (retval < 0 && errno == EINTR);
+
+  return retval;
+}
+#undef open /* avoid warning on VMS */
+#define open nonintr_open
+
+#endif
+
+
+int
+execute (const char *progname,
+         const char *prog_path, const char * const *prog_argv,
+         const char *directory,
+         bool ignore_sigpipe,
+         bool null_stdin, bool null_stdout, bool null_stderr,
+         bool slave_process, bool exit_on_error,
+         int *termsigp)
+{
+  int saved_errno;
+  char *prog_path_to_free = NULL;
+
+  if (directory != NULL)
+    {
+      /* If a change of directory is requested, make sure PROG_PATH is absolute
+         before we do so.  This is needed because
+           - posix_spawn and posix_spawnp are required to resolve a relative
+             PROG_PATH *after* changing the directory.  See
+             <https://www.austingroupbugs.net/view.php?id=1208>:
+               "if this pathname does not start with a <slash> it shall be
+                interpreted relative to the working directory of the child
+                process _after_ all file_actions have been performed."
+             But this would be a surprising application behaviour, possibly
+             even security relevant.
+           - For the Windows CreateProcess() function, it is unspecified whether
+             a relative file name is interpreted to the parent's current
+             directory or to the specified directory.  See
+             <https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa>  */
+      if (! IS_ABSOLUTE_FILE_NAME (prog_path))
+        {
+          const char *resolved_prog =
+            find_in_given_path (prog_path, getenv ("PATH"), NULL, false);
+          if (resolved_prog == NULL)
+            goto fail_with_errno;
+          if (resolved_prog != prog_path)
+            prog_path_to_free = (char *) resolved_prog;
+          prog_path = resolved_prog;
+
+          if (! IS_ABSOLUTE_FILE_NAME (prog_path))
+            {
+              char *absolute_prog =
+                canonicalize_filename_mode (prog_path,
+                                            CAN_MISSING | CAN_NOLINKS);
+              if (absolute_prog == NULL)
+                {
+                  free (prog_path_to_free);
+                  goto fail_with_errno;
+                }
+              free (prog_path_to_free);
+              prog_path_to_free = absolute_prog;
+              prog_path = absolute_prog;
+
+              if (! IS_ABSOLUTE_FILE_NAME (prog_path))
+                abort ();
+            }
+        }
+    }
+
+#if (defined _WIN32 && !defined __CYGWIN__) && EXECUTE_IMPL_AVOID_POSIX_SPAWN
+
+  /* Native Windows API.  */
+
+  char *argv_mem_to_free;
+
+  const char **argv = prepare_spawn (prog_argv, &argv_mem_to_free);
+  if (argv == NULL)
+    xalloc_die ();
+
+  int exitcode = -1;
+
+  /* Create standard file handles of child process.  */
+  int nullinfd = -1;
+  int nulloutfd = -1;
+  if ((!null_stdin
+       || (nullinfd = open ("NUL", O_RDONLY, 0)) >= 0)
+      && (!(null_stdout || null_stderr)
+          || (nulloutfd = open ("NUL", O_RDWR, 0)) >= 0))
+    /* Pass the environment explicitly.  This is needed if the program has
+       modified the environment using putenv() or [un]setenv().  On Windows,
+       processes have two environments, one in the "environment block" of the
+       process and managed through SetEnvironmentVariable(), and one inside the
+       process, in the location retrieved by the 'environ' macro.  If we were
+       to pass NULL, the child process would inherit a copy of the environment
+       block - ignoring the effects of putenv() and [un]setenv().  */
+    {
+      HANDLE stdin_handle =
+        (HANDLE) _get_osfhandle (null_stdin ? nullinfd : STDIN_FILENO);
+      HANDLE stdout_handle =
+        (HANDLE) _get_osfhandle (null_stdout ? nulloutfd : STDOUT_FILENO);
+      HANDLE stderr_handle =
+        (HANDLE) _get_osfhandle (null_stderr ? nulloutfd : STDERR_FILENO);
+
+      exitcode = spawnpvech (P_WAIT, prog_path, argv + 1,
+                             (const char * const *) environ, directory,
+                             stdin_handle, stdout_handle, stderr_handle);
+# if 0 /* Executing arbitrary files as shell scripts is unsecure.  */
+      if (exitcode == -1 && errno == ENOEXEC)
+        {
+          /* prog is not a native executable.  Try to execute it as a
+             shell script.  Note that prepare_spawn() has already prepended
+             a hidden element "sh.exe" to argv.  */
+          argv[1] = prog_path;
+          exitcode = spawnpvech (P_WAIT, argv[0], argv,
+                                 (const char * const *) environ, directory,
+                                 stdin_handle, stdout_handle, stderr_handle);
+        }
+# endif
+    }
+  if (exitcode == -1)
+    saved_errno = errno;
+  if (nulloutfd >= 0)
+    close (nulloutfd);
+  if (nullinfd >= 0)
+    close (nullinfd);
+  free (argv);
+  free (argv_mem_to_free);
+  free (prog_path_to_free);
+
+  /* Treat failure and signalled child processes like wait_subprocess()
+     does.  */
+  if (termsigp != NULL)
+    *termsigp = 0;
+
+  if (exitcode == -1)
+    goto fail_with_saved_errno;
+
+  if (WIFSIGNALED (exitcode))
+    {
+      if (termsigp != NULL)
+        *termsigp = WTERMSIG (exitcode);
+      saved_errno = 0;
+      goto fail_with_saved_errno;
+    }
+
+  return exitcode;
+
+#else
+
+  /* Unix API.  */
+  /* Note about 127: Some errors during posix_spawnp() cause the function
+     posix_spawnp() to return an error code; some other errors cause the
+     subprocess to exit with return code 127.  It is implementation
+     dependent which error is reported which way.  We treat both cases as
+     equivalent.  */
+  sigset_t blocked_signals;
+  posix_spawn_file_actions_t actions;
+  bool actions_allocated;
+  posix_spawnattr_t attrs;
+  bool attrs_allocated;
+  int err;
+  pid_t child;
+
+  if (slave_process)
+    {
+      sigprocmask (SIG_SETMASK, NULL, &blocked_signals);
+      block_fatal_signals ();
+    }
+  actions_allocated = false;
+  attrs_allocated = false;
+  if ((err = posix_spawn_file_actions_init (&actions)) != 0
+      || (actions_allocated = true,
+          (null_stdin
+            && (err = posix_spawn_file_actions_addopen (&actions,
+                                                        STDIN_FILENO,
+                                                        "/dev/null", O_RDONLY,
+                                                        0))
+               != 0)
+          || (null_stdout
+              && (err = posix_spawn_file_actions_addopen (&actions,
+                                                          STDOUT_FILENO,
+                                                          "/dev/null", O_RDWR,
+                                                          0))
+                 != 0)
+          || (null_stderr
+              && (err = posix_spawn_file_actions_addopen (&actions,
+                                                          STDERR_FILENO,
+                                                          "/dev/null", O_RDWR,
+                                                          0))
+                 != 0)
+          || (directory != NULL
+              && (err = posix_spawn_file_actions_addchdir (&actions,
+                                                           directory)))
+# if !(defined _WIN32 && !defined __CYGWIN__)
+          || (slave_process
+              && ((err = posix_spawnattr_init (&attrs)) != 0
+                  || (attrs_allocated = true,
+                      (err = posix_spawnattr_setsigmask (&attrs,
+                                                         &blocked_signals))
+                      != 0
+                      || (err = posix_spawnattr_setflags (&attrs,
+                                                        POSIX_SPAWN_SETSIGMASK))
+                         != 0)))
+# endif
+          || (err = (directory != NULL
+                     ? posix_spawn (&child, prog_path, &actions,
+                                    attrs_allocated ? &attrs : NULL,
+                                    (char * const *) prog_argv, environ)
+                     : posix_spawnp (&child, prog_path, &actions,
+                                     attrs_allocated ? &attrs : NULL,
+                                     (char * const *) prog_argv, environ)))
+             != 0))
+    {
+      if (actions_allocated)
+        posix_spawn_file_actions_destroy (&actions);
+      if (attrs_allocated)
+        posix_spawnattr_destroy (&attrs);
+      if (slave_process)
+        unblock_fatal_signals ();
+      free (prog_path_to_free);
+      if (termsigp != NULL)
+        *termsigp = 0;
+      saved_errno = err;
+      goto fail_with_saved_errno;
+    }
+  posix_spawn_file_actions_destroy (&actions);
+  if (attrs_allocated)
+    posix_spawnattr_destroy (&attrs);
+  if (slave_process)
+    {
+      register_slave_subprocess (child);
+      unblock_fatal_signals ();
+    }
+  free (prog_path_to_free);
+
+  return wait_subprocess (child, progname, ignore_sigpipe, null_stderr,
+                          slave_process, exit_on_error, termsigp);
+
+#endif
+
+ fail_with_errno:
+  saved_errno = errno;
+ fail_with_saved_errno:
+  if (exit_on_error || !null_stderr)
+    error (exit_on_error ? EXIT_FAILURE : 0, saved_errno,
+           _("%s subprocess failed"), progname);
+  return 127;
+}
diff --git a/lib/execute.h b/lib/execute.h
new file mode 100644
index 0000000..498ee1e
--- /dev/null
+++ b/lib/execute.h
@@ -0,0 +1,56 @@
+/* Creation of autonomous subprocesses.
+   Copyright (C) 2001-2003, 2008-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _EXECUTE_H
+#define _EXECUTE_H
+
+#include <stdbool.h>
+
+/* Execute a command, optionally redirecting any of the three standard file
+   descriptors to /dev/null.  Return its exit code.
+   If it didn't terminate correctly, exit if exit_on_error is true, otherwise
+   return 127.
+   progname is the name of the program to be executed by the subprocess, used
+   for error messages.
+   prog_path is the file name of the program to be executed by the subprocess.
+   If it contains no slashes, a search is conducted in $PATH.  An operating
+   system dependent suffix is added, if necessary.
+   prog_argv is the array of strings that the subprocess shall receive in
+   argv[].  It is a NULL-terminated array.  prog_argv[0] should normally be
+   identical to prog_path.
+   If directory is not NULL, the command is executed in that directory.  If
+   prog_path is a relative file name, it resolved before changing to that
+   directory.  The current directory of the current process remains unchanged.
+   If ignore_sigpipe is true, consider a subprocess termination due to SIGPIPE
+   as equivalent to a success.  This is suitable for processes whose only
+   purpose is to write to standard output.
+   If slave_process is true, the child process will be terminated when its
+   creator receives a catchable fatal signal.
+   If termsigp is not NULL, *termsig will be set to the signal that terminated
+   the subprocess (if supported by the platform: not on native Windows
+   platforms), otherwise 0.
+   It is recommended that no signal is blocked or ignored while execute()
+   is called.  See spawn-pipe.h for the reason.  */
+extern int execute (const char *progname,
+                    const char *prog_path, const char * const *prog_argv,
+                    const char *directory,
+                    bool ignore_sigpipe,
+                    bool null_stdin, bool null_stdout, bool null_stderr,
+                    bool slave_process, bool exit_on_error,
+                    int *termsigp);
+
+#endif /* _EXECUTE_H */
diff --git a/lib/exitfail.c b/lib/exitfail.c
index 69b3513..ebc1f58 100644
--- a/lib/exitfail.c
+++ b/lib/exitfail.c
@@ -1,18 +1,18 @@
 /* Failure exit status
 
-   Copyright (C) 2002-2003, 2005-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002-2003, 2005-2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/exitfail.h b/lib/exitfail.h
index 480ad1a..4add9e0 100644
--- a/lib/exitfail.h
+++ b/lib/exitfail.h
@@ -1,18 +1,18 @@
 /* Failure exit status
 
-   Copyright (C) 2002, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 extern int volatile exit_failure;
diff --git a/lib/fatal-signal.c b/lib/fatal-signal.c
index c9153f1..93a81ee 100644
--- a/lib/fatal-signal.c
+++ b/lib/fatal-signal.c
@@ -1,18 +1,18 @@
 /* Emergency actions in case of a fatal signal.
-   Copyright (C) 2003-2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003-2004, 2006-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2003.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 
@@ -26,8 +26,9 @@
 #include <signal.h>
 #include <unistd.h>
 
+#include "glthread/lock.h"
+#include "thread-optim.h"
 #include "sig-handler.h"
-#include "xalloc.h"
 
 #define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
 
@@ -85,6 +86,10 @@
 static void
 init_fatal_signals (void)
 {
+  /* This function is multithread-safe even without synchronization, because
+     if two threads execute it simultaneously, the fatal_signals[] array will
+     not change any more after the first of the threads has completed this
+     function.  */
   static bool fatal_signals_initialized = false;
   if (!fatal_signals_initialized)
     {
@@ -200,11 +205,18 @@
 }
 
 
+/* Lock that makes at_fatal_signal multi-thread safe.  */
+gl_lock_define_initialized (static, at_fatal_signal_lock)
+
 /* Register a cleanup function to be executed when a catchable fatal signal
    occurs.  */
-void
+int
 at_fatal_signal (action_t action)
 {
+  bool mt = gl_multithreaded ();
+
+  if (mt) gl_lock_lock (at_fatal_signal_lock);
+
   static bool cleanup_initialized = false;
   if (!cleanup_initialized)
     {
@@ -213,6 +225,8 @@
       cleanup_initialized = true;
     }
 
+  int ret = 0;
+
   if (actions_count == actions_allocated)
     {
       /* Extend the actions array.  Note that we cannot use xrealloc(),
@@ -222,9 +236,15 @@
       size_t old_actions_allocated = actions_allocated;
       size_t new_actions_allocated = 2 * actions_allocated;
       actions_entry_t *new_actions =
-        XNMALLOC (new_actions_allocated, actions_entry_t);
-      size_t k;
+        (actions_entry_t *)
+        malloc (new_actions_allocated * sizeof (actions_entry_t));
+      if (new_actions == NULL)
+        {
+          ret = -1;
+          goto done;
+        }
 
+      size_t k;
       /* Don't use memcpy() here, because memcpy takes non-volatile arguments
          and is therefore not guaranteed to complete all memory stores before
          the next statement.  */
@@ -233,8 +253,15 @@
       actions = new_actions;
       actions_allocated = new_actions_allocated;
       /* Now we can free the old actions array.  */
+      /* No, we can't do that.  If fatal_signal_handler is running in a
+         different thread and has already fetched the actions pointer (getting
+         old_actions) but not yet accessed its n-th element, that thread may
+         crash when accessing an element of the already freed old_actions
+         array.  */
+      #if 0
       if (old_actions != static_actions)
         free (old_actions);
+      #endif
     }
   /* The two uses of 'volatile' in the types above (and ISO C 99 section
      5.1.2.3.(5)) ensure that we increment the actions_count only after
@@ -242,6 +269,11 @@
      actions[actions_count].  */
   actions[actions_count].action = action;
   actions_count++;
+
+ done:
+  if (mt) gl_lock_unlock (at_fatal_signal_lock);
+
+  return ret;
 }
 
 
@@ -251,38 +283,68 @@
 static sigset_t fatal_signal_set;
 
 static void
+do_init_fatal_signal_set (void)
+{
+  size_t i;
+
+  init_fatal_signals ();
+
+  sigemptyset (&fatal_signal_set);
+  for (i = 0; i < num_fatal_signals; i++)
+    if (fatal_signals[i] >= 0)
+      sigaddset (&fatal_signal_set, fatal_signals[i]);
+}
+
+/* Ensure that do_init_fatal_signal_set is called once only.  */
+gl_once_define(static, fatal_signal_set_once)
+
+static void
 init_fatal_signal_set (void)
 {
-  static bool fatal_signal_set_initialized = false;
-  if (!fatal_signal_set_initialized)
-    {
-      size_t i;
-
-      init_fatal_signals ();
-
-      sigemptyset (&fatal_signal_set);
-      for (i = 0; i < num_fatal_signals; i++)
-        if (fatal_signals[i] >= 0)
-          sigaddset (&fatal_signal_set, fatal_signals[i]);
-
-      fatal_signal_set_initialized = true;
-    }
+  gl_once (fatal_signal_set_once, do_init_fatal_signal_set);
 }
 
+/* Lock and counter that allow block_fatal_signals/unblock_fatal_signals pairs
+   to occur in different threads and even overlap in time.  */
+gl_lock_define_initialized (static, fatal_signals_block_lock)
+static unsigned int fatal_signals_block_counter = 0;
+
 /* Temporarily delay the catchable fatal signals.  */
 void
 block_fatal_signals (void)
 {
-  init_fatal_signal_set ();
-  sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL);
+  bool mt = gl_multithreaded ();
+
+  if (mt) gl_lock_lock (fatal_signals_block_lock);
+
+  if (fatal_signals_block_counter++ == 0)
+    {
+      init_fatal_signal_set ();
+      sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL);
+    }
+
+  if (mt) gl_lock_unlock (fatal_signals_block_lock);
 }
 
 /* Stop delaying the catchable fatal signals.  */
 void
 unblock_fatal_signals (void)
 {
-  init_fatal_signal_set ();
-  sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+  bool mt = gl_multithreaded ();
+
+  if (mt) gl_lock_lock (fatal_signals_block_lock);
+
+  if (fatal_signals_block_counter == 0)
+    /* There are more calls to unblock_fatal_signals() than to
+       block_fatal_signals().  */
+    abort ();
+  if (--fatal_signals_block_counter == 0)
+    {
+      init_fatal_signal_set ();
+      sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+    }
+
+  if (mt) gl_lock_unlock (fatal_signals_block_lock);
 }
 
 
@@ -301,3 +363,10 @@
     return p - signals;
   }
 }
+
+const sigset_t *
+get_fatal_signal_set (void)
+{
+  init_fatal_signal_set ();
+  return &fatal_signal_set;
+}
diff --git a/lib/fatal-signal.h b/lib/fatal-signal.h
index 8ac57cf..e199484 100644
--- a/lib/fatal-signal.h
+++ b/lib/fatal-signal.h
@@ -1,21 +1,26 @@
 /* Emergency actions in case of a fatal signal.
-   Copyright (C) 2003-2004, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003-2004, 2009-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2003.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 
+#ifndef _FATAL_SIGNAL_H
+#define _FATAL_SIGNAL_H
+
+#include <signal.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -51,8 +56,10 @@
 
    The cleanup function is executed asynchronously.  It is unspecified
    whether during its execution the catchable fatal signals are blocked
-   or not.  */
-extern void at_fatal_signal (_GL_ASYNC_SAFE void (*function) (int sig));
+   or not.
+
+   Return 0 upon success, or -1 if there was a memory allocation problem.  */
+extern int at_fatal_signal (_GL_ASYNC_SAFE void (*function) (int sig));
 
 
 /* Sometimes it is necessary to block the usually fatal signals while the
@@ -77,7 +84,13 @@
    Fills signals[0..count-1] and returns count.  */
 extern unsigned int get_fatal_signals (int signals[64]);
 
+/* Return the list of signals that block_fatal_signals/unblock_fatal_signals
+   would block or unblock.  */
+extern const sigset_t * get_fatal_signal_set (void);
+
 
 #ifdef __cplusplus
 }
 #endif
+
+#endif /* _FATAL_SIGNAL_H */
diff --git a/lib/fchdir.c b/lib/fchdir.c
new file mode 100644
index 0000000..b5ed4df
--- /dev/null
+++ b/lib/fchdir.c
@@ -0,0 +1,206 @@
+/* fchdir replacement.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <unistd.h>
+
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "assure.h"
+#include "filename.h"
+#include "filenamecat.h"
+
+#ifndef REPLACE_OPEN_DIRECTORY
+# define REPLACE_OPEN_DIRECTORY 0
+#endif
+
+/* This replacement assumes that a directory is not renamed while opened
+   through a file descriptor.
+
+   FIXME: On mingw, this would be possible to enforce if we were to
+   also open a HANDLE to each directory currently visited by a file
+   descriptor, since mingw refuses to rename any in-use file system
+   object.  */
+
+/* Array of file descriptors opened.  If REPLACE_OPEN_DIRECTORY or if it points
+   to a directory, it stores info about this directory.  */
+typedef struct
+{
+  char *name;       /* Absolute name of the directory, or NULL.  */
+  /* FIXME - add a DIR* member to make dirfd possible on mingw?  */
+} dir_info_t;
+static dir_info_t *dirs;
+static size_t dirs_allocated;
+
+/* Try to ensure dirs has enough room for a slot at index fd; free any
+   contents already in that slot.  Return false and set errno to
+   ENOMEM on allocation failure.  */
+static bool
+ensure_dirs_slot (size_t fd)
+{
+  if (fd < dirs_allocated)
+    free (dirs[fd].name);
+  else
+    {
+      size_t new_allocated;
+      dir_info_t *new_dirs;
+
+      new_allocated = 2 * dirs_allocated + 1;
+      if (new_allocated <= fd)
+        new_allocated = fd + 1;
+      new_dirs =
+        (dirs != NULL
+         ? (dir_info_t *) realloc (dirs, new_allocated * sizeof *dirs)
+         : (dir_info_t *) malloc (new_allocated * sizeof *dirs));
+      if (new_dirs == NULL)
+        return false;
+      memset (new_dirs + dirs_allocated, 0,
+              (new_allocated - dirs_allocated) * sizeof *dirs);
+      dirs = new_dirs;
+      dirs_allocated = new_allocated;
+    }
+  return true;
+}
+
+/* Return an absolute name of DIR in malloc'd storage.
+   Upon failure, return NULL with errno set.  */
+static char *
+get_name (char const *dir)
+{
+  char *cwd;
+  char *result;
+
+  if (IS_ABSOLUTE_FILE_NAME (dir))
+    return strdup (dir);
+
+  /* We often encounter "."; treat it as a special case.  */
+  cwd = getcwd (NULL, 0);
+  if (!cwd || (dir[0] == '.' && dir[1] == '\0'))
+    return cwd;
+
+  result = mfile_name_concat (cwd, dir, NULL);
+  free (cwd);
+  return result;
+}
+
+/* Hook into the gnulib replacements for open() and close() to keep track
+   of the open file descriptors.  */
+
+/* Close FD, cleaning up any fd to name mapping if fd was visiting a
+   directory.  */
+void
+_gl_unregister_fd (int fd)
+{
+  if (fd >= 0 && fd < dirs_allocated)
+    {
+      free (dirs[fd].name);
+      dirs[fd].name = NULL;
+    }
+}
+
+/* Mark FD as visiting FILENAME.  FD must be non-negative, and refer
+   to an open file descriptor.  If REPLACE_OPEN_DIRECTORY is non-zero,
+   this should only be called if FD is visiting a directory.  Close FD
+   and return -1 with errno set if there is insufficient memory to track
+   the directory name; otherwise return FD.  */
+int
+_gl_register_fd (int fd, const char *filename)
+{
+  struct stat statbuf;
+
+  assure (0 <= fd);
+  if (REPLACE_OPEN_DIRECTORY
+      || (fstat (fd, &statbuf) == 0 && S_ISDIR (statbuf.st_mode)))
+    {
+      if (!ensure_dirs_slot (fd)
+          || (dirs[fd].name = get_name (filename)) == NULL)
+        {
+          int saved_errno = errno;
+          close (fd);
+          errno = saved_errno;
+          return -1;
+        }
+    }
+  return fd;
+}
+
+/* Mark NEWFD as a duplicate of OLDFD; useful from dup, dup2, dup3,
+   and fcntl.  Both arguments must be valid and distinct file
+   descriptors.  Close NEWFD and return -1 if OLDFD is tracking a
+   directory, but there is insufficient memory to track the same
+   directory in NEWFD; otherwise return NEWFD.  */
+int
+_gl_register_dup (int oldfd, int newfd)
+{
+  assure (0 <= oldfd && 0 <= newfd && oldfd != newfd);
+  if (oldfd < dirs_allocated && dirs[oldfd].name)
+    {
+      /* Duplicated a directory; must ensure newfd is allocated.  */
+      if (!ensure_dirs_slot (newfd)
+          || (dirs[newfd].name = strdup (dirs[oldfd].name)) == NULL)
+        {
+          int saved_errno = errno;
+          close (newfd);
+          errno = saved_errno;
+          newfd = -1;
+        }
+    }
+  else if (newfd < dirs_allocated)
+    {
+      /* Duplicated a non-directory; ensure newfd is cleared.  */
+      free (dirs[newfd].name);
+      dirs[newfd].name = NULL;
+    }
+  return newfd;
+}
+
+/* If FD is currently visiting a directory, then return the name of
+   that directory.  Otherwise, return NULL and set errno.  */
+const char *
+_gl_directory_name (int fd)
+{
+  if (0 <= fd && fd < dirs_allocated && dirs[fd].name != NULL)
+    return dirs[fd].name;
+  /* At this point, fd is either invalid, or open but not a directory.
+     If dup2 fails, errno is correctly EBADF.  */
+  if (0 <= fd)
+    {
+      if (dup2 (fd, fd) == fd)
+        errno = ENOTDIR;
+    }
+  else
+    errno = EBADF;
+  return NULL;
+}
+
+
+/* Implement fchdir() in terms of chdir().  */
+
+int
+fchdir (int fd)
+{
+  const char *name = _gl_directory_name (fd);
+  return name ? chdir (name) : -1;
+}
diff --git a/lib/fcntl.c b/lib/fcntl.c
index a3ffaa6..c744eb9 100644
--- a/lib/fcntl.c
+++ b/lib/fcntl.c
@@ -1,18 +1,18 @@
 /* Provide file descriptor control.
 
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Eric Blake <ebb9@byu.net>.  */
@@ -70,14 +70,14 @@
       return -1;
     }
   if (old_handle == INVALID_HANDLE_VALUE
-      || (mode = setmode (oldfd, O_BINARY)) == -1)
+      || (mode = _setmode (oldfd, O_BINARY)) == -1)
     {
       /* oldfd is not open, or is an unassigned standard file
          descriptor.  */
       errno = EBADF;
       return -1;
     }
-  setmode (oldfd, mode);
+  _setmode (oldfd, mode);
   flags |= mode;
 
   for (;;)
@@ -491,7 +491,9 @@
 #if !HAVE_FCNTL
   result = dupfd (fd, target, O_CLOEXEC);
 #else /* HAVE_FCNTL */
-# if defined __HAIKU__
+# if defined __NetBSD__ || defined __HAIKU__
+  /* On NetBSD 9.0, the system fcntl (fd, F_DUPFD_CLOEXEC, target)
+     has only the same effect as fcntl (fd, F_DUPFD, target).  */
   /* On Haiku, the system fcntl (fd, F_DUPFD_CLOEXEC, target) sets
      the FD_CLOEXEC flag on fd, not on target.  Therefore avoid the
      system fcntl in this case.  */
diff --git a/lib/fcntl.in.h b/lib/fcntl.in.h
index abe7993..26dedc3 100644
--- a/lib/fcntl.in.h
+++ b/lib/fcntl.in.h
@@ -1,18 +1,18 @@
 /* Like <fcntl.h>, but with non-working flags defined to 0.
 
-   Copyright (C) 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* written by Paul Eggert */
@@ -97,6 +97,12 @@
 _GL_FUNCDECL_RPL (creat, int, (const char *filename, mode_t mode)
                              _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (creat, int, (const char *filename, mode_t mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef creat
+#   define creat _creat
+#  endif
+_GL_CXXALIAS_MDA (creat, int, (const char *filename, mode_t mode));
 # else
 _GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode));
 # endif
@@ -106,6 +112,21 @@
 /* Assume creat is always declared.  */
 _GL_WARN_ON_USE (creat, "creat is not always POSIX compliant - "
                  "use gnulib module creat for portability");
+#elif @GNULIB_MDA_CREAT@
+/* On native Windows, map 'creat' to '_creat', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::creat always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef creat
+#   define creat _creat
+#  endif
+/* Need to cast, because in mingw the last argument is 'int mode'.  */
+_GL_CXXALIAS_MDA_CAST (creat, int, (const char *filename, mode_t mode));
+# else
+_GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode));
+# endif
+_GL_CXXALIASWARN (creat);
 #endif
 
 #if @GNULIB_FCNTL@
@@ -116,9 +137,15 @@
 #  endif
 _GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...));
 _GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...));
+#  if !GNULIB_defined_rpl_fcntl
+#   define GNULIB_defined_rpl_fcntl 1
+#  endif
 # else
 #  if !@HAVE_FCNTL@
 _GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...));
+#   if !GNULIB_defined_fcntl
+#    define GNULIB_defined_fcntl 1
+#   endif
 #  endif
 _GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...));
 # endif
@@ -140,6 +167,12 @@
 _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
                              _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef open
+#   define open _open
+#  endif
+_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
 # else
 _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
 # endif
@@ -153,6 +186,22 @@
 /* Assume open is always declared.  */
 _GL_WARN_ON_USE (open, "open is not always POSIX compliant - "
                  "use gnulib module open for portability");
+#elif @GNULIB_MDA_OPEN@
+/* On native Windows, map 'open' to '_open', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::open always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef open
+#   define open _open
+#  endif
+_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+# else
+_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+# endif
+# if !defined __hpux
+_GL_CXXALIASWARN (open);
+# endif
 #endif
 
 #if @GNULIB_OPENAT@
diff --git a/lib/fd-hook.c b/lib/fd-hook.c
index 7879119..75b1626 100644
--- a/lib/fd-hook.c
+++ b/lib/fd-hook.c
@@ -1,18 +1,18 @@
 /* Hook for making file descriptor functions close(), ioctl() extensible.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2009.
 
-   This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/fd-hook.h b/lib/fd-hook.h
index bf07f00..98e2a52 100644
--- a/lib/fd-hook.h
+++ b/lib/fd-hook.h
@@ -1,17 +1,17 @@
 /* Hook for making file descriptor functions close(), ioctl() extensible.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 
diff --git a/lib/fd-safer-flag.c b/lib/fd-safer-flag.c
index 7c026ef..bfaef4d 100644
--- a/lib/fd-safer-flag.c
+++ b/lib/fd-safer-flag.c
@@ -1,7 +1,7 @@
 /* Adjust a file descriptor result so that it avoids clobbering
    STD{IN,OUT,ERR}_FILENO, with specific flags.
 
-   Copyright (C) 2005-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2006, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/fd-safer.c b/lib/fd-safer.c
index b5113e1..487b039 100644
--- a/lib/fd-safer.c
+++ b/lib/fd-safer.c
@@ -1,6 +1,6 @@
 /* Return a safer copy of a file descriptor.
 
-   Copyright (C) 2005-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2006, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/fdopendir.c b/lib/fdopendir.c
new file mode 100644
index 0000000..451b4e1
--- /dev/null
+++ b/lib/fdopendir.c
@@ -0,0 +1,249 @@
+/* provide a replacement fdopendir function
+   Copyright (C) 2004-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <dirent.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#if !HAVE_FDOPENDIR
+
+# include "openat.h"
+# include "openat-priv.h"
+# include "save-cwd.h"
+
+# if GNULIB_DIRENT_SAFER
+#  include "dirent--.h"
+# endif
+
+# ifndef REPLACE_FCHDIR
+#  define REPLACE_FCHDIR 0
+# endif
+
+static DIR *fdopendir_with_dup (int, int, struct saved_cwd const *);
+static DIR *fd_clone_opendir (int, struct saved_cwd const *);
+
+/* Replacement for POSIX fdopendir.
+
+   First, try to simulate it via opendir ("/proc/self/fd/...").  Failing
+   that, simulate it by using fchdir metadata, or by doing
+   save_cwd/fchdir/opendir(".")/restore_cwd.
+   If either the save_cwd or the restore_cwd fails (relatively unlikely),
+   then give a diagnostic and exit nonzero.
+
+   If successful, the resulting stream is based on FD in
+   implementations where streams are based on file descriptors and in
+   applications where no other thread or signal handler allocates or
+   frees file descriptors.  In other cases, consult dirfd on the result
+   to find out whether FD is still being used.
+
+   Otherwise, this function works just like POSIX fdopendir.
+
+   W A R N I N G:
+
+   Unlike other fd-related functions, this one places constraints on FD.
+   If this function returns successfully, FD is under control of the
+   dirent.h system, and the caller should not close or modify the state of
+   FD other than by the dirent.h functions.  */
+# ifdef __KLIBC__
+#  include <InnoTekLIBC/backend.h>
+
+DIR *
+fdopendir (int fd)
+{
+  char path[_MAX_PATH];
+  DIR *dirp;
+
+  /* Get a path from fd */
+  if (__libc_Back_ioFHToPath (fd, path, sizeof (path)))
+    return NULL;
+
+  dirp = opendir (path);
+  if (!dirp)
+    return NULL;
+
+  /* Unregister fd registered by opendir() */
+  _gl_unregister_dirp_fd (dirfd (dirp));
+
+  /* Register our fd */
+  if (_gl_register_dirp_fd (fd, dirp))
+    {
+      int saved_errno = errno;
+
+      closedir (dirp);
+
+      errno = saved_errno;
+
+      dirp = NULL;
+    }
+
+  return dirp;
+}
+# else
+DIR *
+fdopendir (int fd)
+{
+  DIR *dir = fdopendir_with_dup (fd, -1, NULL);
+
+  if (! REPLACE_FCHDIR && ! dir)
+    {
+      int saved_errno = errno;
+      if (EXPECTED_ERRNO (saved_errno))
+        {
+          struct saved_cwd cwd;
+          if (save_cwd (&cwd) != 0)
+            openat_save_fail (errno);
+          dir = fdopendir_with_dup (fd, -1, &cwd);
+          saved_errno = errno;
+          free_cwd (&cwd);
+          errno = saved_errno;
+        }
+    }
+
+  return dir;
+}
+# endif
+
+/* Like fdopendir, except that if OLDER_DUPFD is not -1, it is known
+   to be a dup of FD which is less than FD - 1 and which will be
+   closed by the caller and not otherwise used by the caller.  This
+   function makes sure that FD is closed and all file descriptors less
+   than FD are open, and then calls fd_clone_opendir on a dup of FD.
+   That way, barring race conditions, fd_clone_opendir returns a
+   stream whose file descriptor is FD.
+
+   If REPLACE_FCHDIR or CWD is null, use opendir ("/proc/self/fd/...",
+   falling back on fchdir metadata.  Otherwise, CWD is a saved version
+   of the working directory; use fchdir/opendir(".")/restore_cwd(CWD).  */
+static DIR *
+fdopendir_with_dup (int fd, int older_dupfd, struct saved_cwd const *cwd)
+{
+  int dupfd = dup (fd);
+  if (dupfd < 0 && errno == EMFILE)
+    dupfd = older_dupfd;
+  if (dupfd < 0)
+    return NULL;
+  else
+    {
+      DIR *dir;
+      int saved_errno;
+      if (dupfd < fd - 1 && dupfd != older_dupfd)
+        {
+          dir = fdopendir_with_dup (fd, dupfd, cwd);
+          saved_errno = errno;
+        }
+      else
+        {
+          close (fd);
+          dir = fd_clone_opendir (dupfd, cwd);
+          saved_errno = errno;
+          if (! dir)
+            {
+              int fd1 = dup (dupfd);
+              if (fd1 != fd)
+                openat_save_fail (fd1 < 0 ? errno : EBADF);
+            }
+        }
+
+      if (dupfd != older_dupfd)
+        close (dupfd);
+      errno = saved_errno;
+      return dir;
+    }
+}
+
+/* Like fdopendir, except the result controls a clone of FD.  It is
+   the caller's responsibility both to close FD and (if the result is
+   not null) to closedir the result.  */
+static DIR *
+fd_clone_opendir (int fd, struct saved_cwd const *cwd)
+{
+  if (REPLACE_FCHDIR || ! cwd)
+    {
+      DIR *dir = NULL;
+      int saved_errno = EOPNOTSUPP;
+      char buf[OPENAT_BUFFER_SIZE];
+      char *proc_file = openat_proc_name (buf, fd, ".");
+      if (proc_file)
+        {
+          dir = opendir (proc_file);
+          saved_errno = errno;
+          if (proc_file != buf)
+            free (proc_file);
+        }
+# if REPLACE_FCHDIR
+      if (! dir && EXPECTED_ERRNO (saved_errno))
+        {
+          char const *name = _gl_directory_name (fd);
+          DIR *dp = name ? opendir (name) : NULL;
+
+          /* The caller has done an elaborate dance to arrange for opendir to
+             consume just the right file descriptor.  If dirfd returns -1,
+             though, we're on a system like mingw where opendir does not
+             consume a file descriptor.  Consume it via 'dup' instead.  */
+          if (dp && dirfd (dp) < 0)
+            dup (fd);
+
+          return dp;
+        }
+# endif
+      errno = saved_errno;
+      return dir;
+    }
+  else
+    {
+      if (fchdir (fd) != 0)
+        return NULL;
+      else
+        {
+          DIR *dir = opendir (".");
+          int saved_errno = errno;
+          if (restore_cwd (cwd) != 0)
+            openat_restore_fail (errno);
+          errno = saved_errno;
+          return dir;
+        }
+    }
+}
+
+#else /* HAVE_FDOPENDIR */
+
+# include <errno.h>
+# include <sys/stat.h>
+
+# undef fdopendir
+
+/* Like fdopendir, but work around GNU/Hurd bug by validating FD.  */
+
+DIR *
+rpl_fdopendir (int fd)
+{
+  struct stat st;
+  if (fstat (fd, &st))
+    return NULL;
+  if (!S_ISDIR (st.st_mode))
+    {
+      errno = ENOTDIR;
+      return NULL;
+    }
+  return fdopendir (fd);
+}
+
+#endif /* HAVE_FDOPENDIR */
diff --git a/lib/ffs.c b/lib/ffs.c
new file mode 100644
index 0000000..ab0bbaf
--- /dev/null
+++ b/lib/ffs.c
@@ -0,0 +1,68 @@
+/* ffs.c -- find the first set bit in a word.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Eric Blake.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <strings.h>
+
+#include <limits.h>
+
+#if defined _MSC_VER && !(__clang_major__ >= 4)
+# include <intrin.h>
+#endif
+
+int
+ffs (int i)
+{
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__clang_major__ >= 4)
+  return __builtin_ffs (i);
+#elif defined _MSC_VER
+  /* _BitScanForward
+     <https://docs.microsoft.com/en-us/cpp/intrinsics/bitscanforward-bitscanforward64> */
+  unsigned long bit;
+  if (_BitScanForward (&bit, i))
+    return bit + 1;
+  else
+    return 0;
+#else
+  /* <https://github.com/gibsjose/BitHacks>
+     gives this deBruijn constant for a branch-less computation, although
+     that table counted trailing zeros rather than bit position.  This
+     requires 32-bit int, we fall back to a naive algorithm on the rare
+     platforms where that assumption is not true.  */
+  if (CHAR_BIT * sizeof i == 32)
+    {
+      static unsigned int table[] = {
+        1, 2, 29, 3, 30, 15, 25, 4, 31, 23, 21, 16, 26, 18, 5, 9,
+        32, 28, 14, 24, 22, 20, 17, 8, 27, 13, 19, 7, 12, 6, 11, 10
+      };
+      unsigned int u = i;
+      unsigned int bit = u & -u;
+      return table[(bit * 0x077cb531U) >> 27] - !i;
+    }
+  else
+    {
+      unsigned int j;
+      for (j = 0; j < CHAR_BIT * sizeof i; j++)
+        if (i & (1U << j))
+          return j + 1;
+      return 0;
+    }
+#endif
+}
diff --git a/lib/ffsl.c b/lib/ffsl.c
new file mode 100644
index 0000000..07f3c3c
--- /dev/null
+++ b/lib/ffsl.c
@@ -0,0 +1,22 @@
+/* Find the first set bit in a 'long' word.
+
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#define FUNC ffsl
+#define TYPE long int
+#define GCC_BUILTIN __builtin_ffsl
+#define MSVC_BUILTIN _BitScanForward
+#include "ffsl.h"
diff --git a/lib/ffsl.h b/lib/ffsl.h
new file mode 100644
index 0000000..9774510
--- /dev/null
+++ b/lib/ffsl.h
@@ -0,0 +1,92 @@
+/* ffsl.h -- find the first set bit in a word.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Eric Blake.  */
+
+/* This file is meant to be included by ffsl.c and ffsll.c, after
+   they have defined FUNC and TYPE.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <string.h>
+
+#include <limits.h>
+#include <strings.h>
+
+#if defined _MSC_VER && !(__clang_major__ >= 4)
+# include <intrin.h>
+/* Copied from ffs.c.  */
+static inline int
+ffs (int i)
+{
+  /* _BitScanForward
+     <https://docs.microsoft.com/en-us/cpp/intrinsics/bitscanforward-bitscanforward64> */
+  unsigned long bit;
+  if (_BitScanForward (&bit, i))
+    return bit + 1;
+  else
+    return 0;
+}
+#endif
+
+#if !defined FUNC || !defined TYPE
+# error
+#endif
+
+int
+FUNC (TYPE i)
+{
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) \
+    || (__clang_major__ >= 4)
+  return GCC_BUILTIN (i);
+#elif defined _MSC_VER && defined MSVC_BUILTIN
+  /* _BitScanForward, _BitScanForward64
+     <https://docs.microsoft.com/en-us/cpp/intrinsics/bitscanforward-bitscanforward64> */
+  unsigned long bit;
+  if (MSVC_BUILTIN (&bit, i))
+    return bit + 1;
+  else
+    return 0;
+#else
+  unsigned TYPE j = i;
+  /* Split j into chunks, and look at one chunk after the other.  */
+  enum { chunk_bits = CHAR_BIT * sizeof (unsigned int) };
+  /* The number of chunks is ceil (sizeof (TYPE) / sizeof (unsigned int))
+     = (sizeof (TYPE) - 1) / sizeof (unsigned int) + 1. */
+  enum { chunk_count = (sizeof (TYPE) - 1) / sizeof (unsigned int) + 1 };
+
+  if (chunk_count > 1)
+    {
+      size_t k;
+
+      /* It is tempting to write  if (!j)  here, but if we do this,
+         Solaris 10/x86 "cc -O" miscompiles the code.  */
+      if (!i)
+        return 0;
+      /* Unroll the first loop round.  k = 0.  */
+      if ((unsigned int) j)
+        return ffs ((unsigned int) j);
+      /* Generic loop.  */
+      for (k = 1; k < chunk_count - 1; k++)
+        if ((unsigned int) (j >> (k * chunk_bits)) != 0)
+          return k * chunk_bits + ffs ((unsigned int) (j >> (k * chunk_bits)));
+    }
+  /* Last loop round.  k = chunk_count - 1.  */
+  return (chunk_count - 1) * chunk_bits
+         + ffs ((unsigned int) (j >> ((chunk_count - 1) * chunk_bits)));
+#endif
+}
diff --git a/lib/file-set.c b/lib/file-set.c
new file mode 100644
index 0000000..3b99b21
--- /dev/null
+++ b/lib/file-set.c
@@ -0,0 +1,74 @@
+/* Specialized functions to manipulate a set of files.
+   Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+#include "file-set.h"
+
+#include "hash-triple.h"
+#include "xalloc.h"
+
+/* Record file, FILE, and dev/ino from *STATS, in the hash table, HT.
+   If HT is NULL, return immediately.
+   If memory allocation fails, exit immediately.  */
+void
+record_file (Hash_table *ht, char const *file, struct stat const *stats)
+{
+  struct F_triple *ent;
+
+  if (ht == NULL)
+    return;
+
+  ent = xmalloc (sizeof *ent);
+  ent->name = xstrdup (file);
+  ent->st_ino = stats->st_ino;
+  ent->st_dev = stats->st_dev;
+
+  {
+    struct F_triple *ent_from_table = hash_insert (ht, ent);
+    if (ent_from_table == NULL)
+      {
+        /* Insertion failed due to lack of memory.  */
+        xalloc_die ();
+      }
+
+    if (ent_from_table != ent)
+      {
+        /* There was already a matching entry in the table, so ENT was
+           not inserted.  Free it.  */
+        triple_free (ent);
+      }
+  }
+}
+
+/* Return true if there is an entry in hash table, HT,
+   for the file described by FILE and STATS.  */
+bool
+seen_file (Hash_table const *ht, char const *file,
+           struct stat const *stats)
+{
+  struct F_triple new_ent;
+
+  if (ht == NULL)
+    return false;
+
+  new_ent.name = (char *) file;
+  new_ent.st_ino = stats->st_ino;
+  new_ent.st_dev = stats->st_dev;
+
+  return !!hash_lookup (ht, &new_ent);
+}
diff --git a/lib/file-set.h b/lib/file-set.h
new file mode 100644
index 0000000..45c951e
--- /dev/null
+++ b/lib/file-set.h
@@ -0,0 +1,33 @@
+/* Very specialized set-of-files code.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Jim Meyering, 2007.  */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdbool.h>
+
+#include "hash.h"
+
+extern void record_file (Hash_table *ht, char const *file,
+                         struct stat const *stats)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
+  __attribute__ ((__nonnull__ (2, 3)))
+#endif
+;
+
+extern bool seen_file (Hash_table const *ht, char const *file,
+                       struct stat const *stats);
diff --git a/lib/filename.h b/lib/filename.h
index 3ba3105..dafe3df 100644
--- a/lib/filename.h
+++ b/lib/filename.h
@@ -1,51 +1,109 @@
 /* Basic filename support macros.
-   Copyright (C) 2001-2004, 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2004, 2007-2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* From Paul Eggert and Jim Meyering.  */
 
 #ifndef _FILENAME_H
 #define _FILENAME_H
 
+#include <string.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 
-/* Pathname support.
-   ISSLASH(C)           tests whether C is a directory separator character.
-   IS_ABSOLUTE_PATH(P)  tests whether P is an absolute path.  If it is not,
-                        it may be concatenated to a directory pathname.
-   IS_PATH_WITH_DIR(P)  tests whether P contains a directory specification.
+/* Filename support.
+   ISSLASH(C)                  tests whether C is a directory separator
+                               character.
+   HAS_DEVICE(Filename)        tests whether Filename contains a device
+                               specification.
+   FILE_SYSTEM_PREFIX_LEN(Filename)  length of the device specification
+                                     at the beginning of Filename,
+                                     index of the part consisting of
+                                     alternating components and slashes.
+   FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+                               1 when a non-empty device specification
+                               can be followed by an empty or relative
+                               part,
+                               0 when a non-empty device specification
+                               must be followed by a slash,
+                               0 when device specification don't exist.
+   IS_ABSOLUTE_FILE_NAME(Filename)
+                               tests whether Filename is independent of
+                               any notion of "current directory".
+   IS_RELATIVE_FILE_NAME(Filename)
+                               tests whether Filename may be concatenated
+                               to a directory filename.
+   Note: On native Windows, OS/2, DOS, "c:" is neither an absolute nor a
+   relative file name!
+   IS_FILE_NAME_WITH_DIR(Filename)  tests whether Filename contains a device
+                                    or directory specification.
  */
-#if defined _WIN32 || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+#if defined _WIN32 || defined __CYGWIN__ \
+    || defined __EMX__ || defined __MSDOS__ || defined __DJGPP__
   /* Native Windows, Cygwin, OS/2, DOS */
 # define ISSLASH(C) ((C) == '/' || (C) == '\\')
-# define HAS_DEVICE(P) \
-    ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
-     && (P)[1] == ':')
-# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
-# define IS_PATH_WITH_DIR(P) \
-    (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
-# define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
+  /* Internal macro: Tests whether a character is a drive letter.  */
+# define _IS_DRIVE_LETTER(C) \
+    (((C) >= 'A' && (C) <= 'Z') || ((C) >= 'a' && (C) <= 'z'))
+  /* Help the compiler optimizing it.  This assumes ASCII.  */
+# undef _IS_DRIVE_LETTER
+# define _IS_DRIVE_LETTER(C) \
+    (((unsigned int) (C) | ('a' - 'A')) - 'a' <= 'z' - 'a')
+# define HAS_DEVICE(Filename) \
+    (_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':')
+# define FILE_SYSTEM_PREFIX_LEN(Filename) (HAS_DEVICE (Filename) ? 2 : 0)
+# ifdef __CYGWIN__
+#  define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
+# else
+   /* On native Windows, OS/2, DOS, the system has the notion of a
+      "current directory" on each drive.  */
+#  define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 1
+# endif
+# if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+#  define IS_ABSOLUTE_FILE_NAME(Filename) \
+     ISSLASH ((Filename)[FILE_SYSTEM_PREFIX_LEN (Filename)])
+# else
+#  define IS_ABSOLUTE_FILE_NAME(Filename) \
+     (ISSLASH ((Filename)[0]) || HAS_DEVICE (Filename))
+# endif
+# define IS_RELATIVE_FILE_NAME(Filename) \
+    (! (ISSLASH ((Filename)[0]) || HAS_DEVICE (Filename)))
+# define IS_FILE_NAME_WITH_DIR(Filename) \
+    (strchr ((Filename), '/') != NULL || strchr ((Filename), '\\') != NULL \
+     || HAS_DEVICE (Filename))
 #else
   /* Unix */
 # define ISSLASH(C) ((C) == '/')
-# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
-# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
-# define FILE_SYSTEM_PREFIX_LEN(P) 0
+# define HAS_DEVICE(Filename) ((void) (Filename), 0)
+# define FILE_SYSTEM_PREFIX_LEN(Filename) ((void) (Filename), 0)
+# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
+# define IS_ABSOLUTE_FILE_NAME(Filename) ISSLASH ((Filename)[0])
+# define IS_RELATIVE_FILE_NAME(Filename) (! ISSLASH ((Filename)[0]))
+# define IS_FILE_NAME_WITH_DIR(Filename) (strchr ((Filename), '/') != NULL)
 #endif
 
+/* Deprecated macros.  For backward compatibility with old users of the
+   'filename' module.  */
+#define IS_ABSOLUTE_PATH IS_ABSOLUTE_FILE_NAME
+#define IS_PATH_WITH_DIR IS_FILE_NAME_WITH_DIR
+
 
 #ifdef __cplusplus
 }
diff --git a/lib/filenamecat-lgpl.c b/lib/filenamecat-lgpl.c
new file mode 100644
index 0000000..d52dc80
--- /dev/null
+++ b/lib/filenamecat-lgpl.c
@@ -0,0 +1,90 @@
+/* Concatenate two arbitrary file names.
+
+   Copyright (C) 1996-2007, 2009-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Jim Meyering.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "filenamecat.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "basename-lgpl.h"
+#include "filename.h"
+
+#if ! HAVE_MEMPCPY && ! defined mempcpy
+# define mempcpy(D, S, N) ((void *) ((char *) memcpy (D, S, N) + (N)))
+#endif
+
+/* Concatenate two file name components, DIR and BASE, in
+   newly-allocated storage and return the result.
+   The resulting file name F is such that the commands "ls F" and "(cd
+   DIR; ls ./BASE)" refer to the same file.  If necessary, put
+   a separator between DIR and BASE in the result.  Typically this
+   separator is "/", but in rare cases it might be ".".
+   In any case, if BASE_IN_RESULT is non-NULL, set
+   *BASE_IN_RESULT to point to the copy of BASE at the end of the
+   returned concatenation.
+
+   If malloc fails, return NULL with errno set.  */
+
+char *
+mfile_name_concat (char const *dir, char const *base, char **base_in_result)
+{
+  char const *dirbase = last_component (dir);
+  size_t dirbaselen = base_len (dirbase);
+  size_t dirlen = dirbase - dir + dirbaselen;
+  size_t baselen = strlen (base);
+  char sep = '\0';
+  if (dirbaselen)
+    {
+      /* DIR is not a file system root, so separate with / if needed.  */
+      if (! ISSLASH (dir[dirlen - 1]) && ! ISSLASH (*base))
+        sep = '/';
+    }
+  else if (ISSLASH (*base))
+    {
+      /* DIR is a file system root and BASE begins with a slash, so
+         separate with ".".  For example, if DIR is "/" and BASE is
+         "/foo" then return "/./foo", as "//foo" would be wrong on
+         some POSIX systems.  A fancier algorithm could omit "." in
+         some cases but is not worth the trouble.  */
+      sep = '.';
+    }
+
+  char *p_concat = malloc (dirlen + (sep != '\0')  + baselen + 1);
+  if (p_concat == NULL)
+    return NULL;
+
+  {
+    char *p;
+
+    p = mempcpy (p_concat, dir, dirlen);
+    *p = sep;
+    p += sep != '\0';
+
+    if (base_in_result)
+      *base_in_result = p;
+
+    p = mempcpy (p, base, baselen);
+    *p = '\0';
+  }
+
+  return p_concat;
+}
diff --git a/lib/filenamecat.h b/lib/filenamecat.h
new file mode 100644
index 0000000..e5acb15
--- /dev/null
+++ b/lib/filenamecat.h
@@ -0,0 +1,32 @@
+/* Concatenate two arbitrary file names.
+
+   Copyright (C) 1996-1997, 2003, 2005, 2007, 2009-2021 Free Software
+   Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Jim Meyering.  */
+
+#include <stdlib.h>
+
+#if GNULIB_FILENAMECAT
+char *file_name_concat (char const *dir, char const *base,
+                        char **base_in_result)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
+#endif
+
+char *mfile_name_concat (char const *dir, char const *base,
+                         char **base_in_result)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
diff --git a/lib/findprog-in.c b/lib/findprog-in.c
new file mode 100644
index 0000000..a0e79eb
--- /dev/null
+++ b/lib/findprog-in.c
@@ -0,0 +1,399 @@
+/* Locating a program in a given path.
+   Copyright (C) 2001-2004, 2006-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <haible@clisp.cons.org>, 2001, 2019.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+
+#include <config.h>
+
+/* Specification.  */
+#include "findprog.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
+#include "filename.h"
+#include "concat-filename.h"
+
+#if (defined _WIN32 && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
+  /* Native Windows, OS/2, DOS */
+# define NATIVE_SLASH '\\'
+#else
+  /* Unix */
+# define NATIVE_SLASH '/'
+#endif
+
+/* Separator in PATH like lists of pathnames.  */
+#if (defined _WIN32 && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
+  /* Native Windows, OS/2, DOS */
+# define PATH_SEPARATOR ';'
+#else
+  /* Unix */
+# define PATH_SEPARATOR ':'
+#endif
+
+/* The list of suffixes that the execlp/execvp function tries when searching
+   for the program.  */
+static const char * const suffixes[] =
+  {
+    #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+    "", ".com", ".exe", ".bat", ".cmd"
+    /* Note: Files without any suffix are not considered executable.  */
+    /* Note: The cmd.exe program does a different lookup: It searches according
+       to the PATHEXT environment variable.
+       See <https://stackoverflow.com/questions/7839150/>.
+       Also, it executes files ending in .bat and .cmd directly without letting
+       the kernel interpret the program file.  */
+    #elif defined __CYGWIN__
+    "", ".exe", ".com"
+    #elif defined __EMX__
+    "", ".exe"
+    #elif defined __DJGPP__
+    "", ".com", ".exe", ".bat"
+    #else /* Unix */
+    ""
+    #endif
+  };
+
+const char *
+find_in_given_path (const char *progname, const char *path,
+                    const char *directory, bool optimize_for_exec)
+{
+  {
+    bool has_slash = false;
+    {
+      const char *p;
+
+      for (p = progname; *p != '\0'; p++)
+        if (ISSLASH (*p))
+          {
+            has_slash = true;
+            break;
+          }
+    }
+    if (has_slash)
+      {
+        /* If progname contains a slash, it is either absolute or relative to
+           the current directory.  PATH is not used.  */
+        if (optimize_for_exec)
+          /* The execl/execv/execlp/execvp functions will try the various
+             suffixes anyway and fail if no executable is found.  */
+          return progname;
+        else
+          {
+            /* Try the various suffixes and see whether one of the files
+               with such a suffix is actually executable.  */
+            int failure_errno;
+            size_t i;
+
+            const char *directory_as_prefix =
+              (directory != NULL && IS_RELATIVE_FILE_NAME (progname)
+               ? directory
+               : "");
+
+            #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+            const char *progbasename;
+
+            {
+              const char *p;
+
+              progbasename = progname;
+              for (p = progname; *p != '\0'; p++)
+                if (ISSLASH (*p))
+                  progbasename = p + 1;
+            }
+
+            bool progbasename_has_dot = (strchr (progbasename, '.') != NULL);
+            #endif
+
+            /* Try all platform-dependent suffixes.  */
+            failure_errno = ENOENT;
+            for (i = 0; i < sizeof (suffixes) / sizeof (suffixes[0]); i++)
+              {
+                const char *suffix = suffixes[i];
+
+                #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+                /* File names without a '.' are not considered executable, and
+                   for file names with a '.' no additional suffix is tried.  */
+                if ((*suffix != '\0') != progbasename_has_dot)
+                #endif
+                  {
+                    /* Concatenate directory_as_prefix, progname, suffix.  */
+                    char *progpathname =
+                      concatenated_filename (directory_as_prefix, progname,
+                                             suffix);
+
+                    if (progpathname == NULL)
+                      return NULL; /* errno is set here */
+
+                    /* On systems which have the eaccess() system call, let's
+                       use it.  On other systems, let's hope that this program
+                       is not installed setuid or setgid, so that it is ok to
+                       call access() despite its design flaw.  */
+                    if (eaccess (progpathname, X_OK) == 0)
+                      {
+                        /* Check that the progpathname does not point to a
+                           directory.  */
+                        struct stat statbuf;
+
+                        if (stat (progpathname, &statbuf) >= 0)
+                          {
+                            if (! S_ISDIR (statbuf.st_mode))
+                              {
+                                /* Found!  */
+                                if (strcmp (progpathname, progname) == 0)
+                                  {
+                                    free (progpathname);
+                                    return progname;
+                                  }
+                                else
+                                  return progpathname;
+                              }
+
+                            errno = EACCES;
+                          }
+                      }
+
+                    if (errno != ENOENT)
+                      failure_errno = errno;
+
+                    free (progpathname);
+                  }
+              }
+            #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+            if (failure_errno == ENOENT && !progbasename_has_dot)
+              {
+                /* In the loop above, we skipped suffix = "".  Do this loop
+                   round now, merely to provide a better errno than ENOENT.  */
+
+                char *progpathname =
+                  concatenated_filename (directory_as_prefix, progname, "");
+
+                if (progpathname == NULL)
+                  return NULL; /* errno is set here */
+
+                if (eaccess (progpathname, X_OK) == 0)
+                  {
+                    struct stat statbuf;
+
+                    if (stat (progpathname, &statbuf) >= 0)
+                      {
+                        if (! S_ISDIR (statbuf.st_mode))
+                          errno = ENOEXEC;
+                        else
+                          errno = EACCES;
+                      }
+                  }
+
+                failure_errno = errno;
+
+                free (progpathname);
+              }
+            #endif
+
+            errno = failure_errno;
+            return NULL;
+          }
+      }
+  }
+
+  if (path == NULL)
+    /* If PATH is not set, the default search path is implementation dependent.
+       In practice, it is treated like an empty PATH.  */
+    path = "";
+
+  {
+    /* Make a copy, to prepare for destructive modifications.  */
+    char *path_copy = strdup (path);
+    if (path_copy == NULL)
+      return NULL; /* errno is set here */
+
+    int failure_errno;
+    char *path_rest;
+    char *cp;
+
+    #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+    bool progname_has_dot = (strchr (progname, '.') != NULL);
+    #endif
+
+    failure_errno = ENOENT;
+    for (path_rest = path_copy; ; path_rest = cp + 1)
+      {
+        const char *dir;
+        bool last;
+        char *dir_as_prefix_to_free;
+        const char *dir_as_prefix;
+        size_t i;
+
+        /* Extract next directory in PATH.  */
+        dir = path_rest;
+        for (cp = path_rest; *cp != '\0' && *cp != PATH_SEPARATOR; cp++)
+          ;
+        last = (*cp == '\0');
+        *cp = '\0';
+
+        /* Empty PATH components designate the current directory.  */
+        if (dir == cp)
+          dir = ".";
+
+        /* Concatenate directory and dir.  */
+        if (directory != NULL && IS_RELATIVE_FILE_NAME (dir))
+          {
+            dir_as_prefix_to_free =
+              concatenated_filename (directory, dir, NULL);
+            if (dir_as_prefix_to_free == NULL)
+              {
+                /* errno is set here.  */
+                failure_errno = errno;
+                goto failed;
+              }
+            dir_as_prefix = dir_as_prefix_to_free;
+          }
+        else
+          {
+            dir_as_prefix_to_free = NULL;
+            dir_as_prefix = dir;
+          }
+
+        /* Try all platform-dependent suffixes.  */
+        for (i = 0; i < sizeof (suffixes) / sizeof (suffixes[0]); i++)
+          {
+            const char *suffix = suffixes[i];
+
+            #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+            /* File names without a '.' are not considered executable, and
+               for file names with a '.' no additional suffix is tried.  */
+            if ((*suffix != '\0') != progname_has_dot)
+            #endif
+              {
+                /* Concatenate dir_as_prefix, progname, and suffix.  */
+                char *progpathname =
+                  concatenated_filename (dir_as_prefix, progname, suffix);
+
+                if (progpathname == NULL)
+                  {
+                    /* errno is set here.  */
+                    failure_errno = errno;
+                    free (dir_as_prefix_to_free);
+                    goto failed;
+                  }
+
+                /* On systems which have the eaccess() system call, let's
+                   use it.  On other systems, let's hope that this program
+                   is not installed setuid or setgid, so that it is ok to
+                   call access() despite its design flaw.  */
+                if (eaccess (progpathname, X_OK) == 0)
+                  {
+                    /* Check that the progpathname does not point to a
+                       directory.  */
+                    struct stat statbuf;
+
+                    if (stat (progpathname, &statbuf) >= 0)
+                      {
+                        if (! S_ISDIR (statbuf.st_mode))
+                          {
+                            /* Found!  */
+                            if (strcmp (progpathname, progname) == 0)
+                              {
+                                free (progpathname);
+
+                                /* Add the "./" prefix for real, that
+                                   concatenated_filename() optimized away.
+                                   This avoids a second PATH search when the
+                                   caller uses execl/execv/execlp/execvp.  */
+                                progpathname =
+                                  (char *) malloc (2 + strlen (progname) + 1);
+                                if (progpathname == NULL)
+                                  {
+                                    /* errno is set here.  */
+                                    failure_errno = errno;
+                                    free (dir_as_prefix_to_free);
+                                    goto failed;
+                                  }
+                                progpathname[0] = '.';
+                                progpathname[1] = NATIVE_SLASH;
+                                memcpy (progpathname + 2, progname,
+                                        strlen (progname) + 1);
+                              }
+
+                            free (dir_as_prefix_to_free);
+                            free (path_copy);
+                            return progpathname;
+                          }
+
+                        errno = EACCES;
+                      }
+                  }
+
+                if (errno != ENOENT)
+                  failure_errno = errno;
+
+                free (progpathname);
+              }
+          }
+        #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+        if (failure_errno == ENOENT && !progname_has_dot)
+          {
+            /* In the loop above, we skipped suffix = "".  Do this loop
+               round now, merely to provide a better errno than ENOENT.  */
+
+            char *progpathname =
+              concatenated_filename (dir_as_prefix, progname, "");
+
+            if (progpathname == NULL)
+              {
+                /* errno is set here.  */
+                failure_errno = errno;
+                free (dir_as_prefix_to_free);
+                goto failed;
+              }
+
+            if (eaccess (progpathname, X_OK) == 0)
+              {
+                struct stat statbuf;
+
+                if (stat (progpathname, &statbuf) >= 0)
+                  {
+                    if (! S_ISDIR (statbuf.st_mode))
+                      errno = ENOEXEC;
+                    else
+                      errno = EACCES;
+                  }
+              }
+
+            failure_errno = errno;
+
+            free (progpathname);
+          }
+        #endif
+
+        free (dir_as_prefix_to_free);
+
+        if (last)
+          break;
+      }
+
+   failed:
+    /* Not found in PATH.  */
+    free (path_copy);
+
+    errno = failure_errno;
+    return NULL;
+  }
+}
diff --git a/lib/findprog.h b/lib/findprog.h
new file mode 100644
index 0000000..d91c3db
--- /dev/null
+++ b/lib/findprog.h
@@ -0,0 +1,77 @@
+/* Locating a program in PATH.
+   Copyright (C) 2001-2003, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _FINDPROG_H
+#define _FINDPROG_H
+
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Looks up a program in the PATH.
+   Attempts to determine the pathname that would be called by execlp/execvp
+   of PROGNAME.  If successful, it returns a pathname containing a slash
+   (either absolute or relative to the current directory).  Otherwise, it
+   returns PROGNAME unmodified.
+   Because of the latter case, callers should use execlp/execvp, not
+   execl/execv on the returned pathname.
+   The returned string is freshly malloc()ed if it is != PROGNAME.  */
+extern const char *find_in_path (const char *progname);
+
+/* Looks up a program in the given PATH-like string.
+
+   The PATH argument consists of a list of directories, separated by ':' or
+   (on native Windows) by ';'.  An empty PATH element designates the current
+   directory.  A null PATH is equivalent to an empty PATH, that is, to the
+   singleton list that contains only the current directory.
+
+   If DIRECTORY is not NULL, all relative filenames (i.e. PROGNAME when it
+   contains a slash, and the PATH elements) are considered relative to
+   DIRECTORY instead of relative to the current directory of this process.
+
+   Determines the pathname that would be called by execlp/execvp of PROGNAME.
+   - If successful, it returns a pathname containing a slash (either absolute
+     or relative to the current directory).  The returned string can be used
+     with either execl/execv or execlp/execvp.  It is freshly malloc()ed if it
+     is != PROGNAME.
+   - Otherwise, it sets errno and returns NULL.
+     Specific errno values include:
+       - ENOENT: means that the program's file was not found.
+       - EACCES: means that the program's file cannot be accessed (due to some
+         issue with one of the ancestor directories) or lacks the execute
+         permissions.
+       - ENOMEM: means out of memory.
+   If OPTIMIZE_FOR_EXEC is true, the function saves some work, under the
+   assumption that the resulting pathname will not be accessed directly,
+   only through execl/execv or execlp/execvp.
+
+   Here, a "slash" means:
+     - On POSIX systems excluding Cygwin: a '/',
+     - On Windows, OS/2, DOS platforms: a '/' or '\'. */
+extern const char *find_in_given_path (const char *progname, const char *path,
+                                       const char *directory,
+                                       bool optimize_for_exec);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _FINDPROG_H */
diff --git a/lib/float+.h b/lib/float+.h
index 5af861f..ad891f6 100644
--- a/lib/float+.h
+++ b/lib/float+.h
@@ -1,19 +1,19 @@
 /* Supplemental information about the floating-point formats.
-   Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2007.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _FLOATPLUS_H
 #define _FLOATPLUS_H
diff --git a/lib/float.c b/lib/float.c
index 8872deb..dd1e84a 100644
--- a/lib/float.c
+++ b/lib/float.c
@@ -1,18 +1,18 @@
 /* Auxiliary definitions for <float.h>.
-   Copyright (C) 2011-2019 Free Software Foundation, Inc.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2011.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/float.in.h b/lib/float.in.h
index ba094a8..f52aba3 100644
--- a/lib/float.in.h
+++ b/lib/float.in.h
@@ -1,18 +1,18 @@
 /* A correct <float.h>.
 
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _@GUARD_PREFIX@_FLOAT_H
@@ -93,11 +93,14 @@
      extern const long double LDBL_MAX;
 
    Unfortunately, this is not a constant expression.  */
+# if !GNULIB_defined_long_double_union
 union gl_long_double_union
   {
     struct { unsigned int lo; unsigned int hi; unsigned int exponent; } xd;
     long double ld;
   };
+#  define GNULIB_defined_long_double_union 1
+# endif
 extern const union gl_long_double_union gl_LDBL_MAX;
 # define LDBL_MAX (gl_LDBL_MAX.ld)
 /* Minimum e such that 10^e is in the range of normalized numbers.  */
@@ -146,11 +149,14 @@
 
    Unfortunately, this is not a constant expression, and the latter expression
    does not work well when GCC is optimizing..  */
+# if !GNULIB_defined_long_double_union
 union gl_long_double_union
   {
     struct { double hi; double lo; } dd;
     long double ld;
   };
+#  define GNULIB_defined_long_double_union 1
+# endif
 extern const union gl_long_double_union gl_LDBL_MAX;
 # define LDBL_MAX (gl_LDBL_MAX.ld)
 #endif
diff --git a/lib/fopen-safer.c b/lib/fopen-safer.c
index 5d4a4a9..ff20279 100644
--- a/lib/fopen-safer.c
+++ b/lib/fopen-safer.c
@@ -1,6 +1,6 @@
 /* Invoke fopen, but avoid some glitches.
 
-   Copyright (C) 2001, 2004-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2004-2006, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/fopen.c b/lib/fopen.c
index 69ba5b9..cebcdac 100644
--- a/lib/fopen.c
+++ b/lib/fopen.c
@@ -1,17 +1,17 @@
 /* Open a stream to a file.
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2007.  */
@@ -19,12 +19,12 @@
 /* If the user's config.h happens to include <stdio.h>, let it include only
    the system's <stdio.h> here, so that orig_fopen doesn't recurse to
    rpl_fopen.  */
-#define __need_FILE
+#define _GL_ALREADY_INCLUDING_STDIO_H
 #include <config.h>
 
 /* Get the original definition of fopen.  It might be defined as a macro.  */
 #include <stdio.h>
-#undef __need_FILE
+#undef _GL_ALREADY_INCLUDING_STDIO_H
 
 static FILE *
 orig_fopen (const char *filename, const char *mode)
@@ -39,6 +39,7 @@
 
 #include <errno.h>
 #include <fcntl.h>
+#include <stdbool.h>
 #include <string.h>
 #include <unistd.h>
 #include <sys/types.h>
@@ -47,11 +48,106 @@
 FILE *
 rpl_fopen (const char *filename, const char *mode)
 {
+  int open_direction;
+  int open_flags;
+#if GNULIB_FOPEN_GNU
+  bool open_flags_gnu;
+# define BUF_SIZE 80
+  char fdopen_mode_buf[BUF_SIZE + 1];
+#endif
+
 #if defined _WIN32 && ! defined __CYGWIN__
   if (strcmp (filename, "/dev/null") == 0)
     filename = "NUL";
 #endif
 
+  /* Parse the mode.  */
+  open_direction = 0;
+  open_flags = 0;
+#if GNULIB_FOPEN_GNU
+  open_flags_gnu = false;
+#endif
+  {
+    const char *p = mode;
+#if GNULIB_FOPEN_GNU
+    char *q = fdopen_mode_buf;
+#endif
+
+    for (; *p != '\0'; p++)
+      {
+        switch (*p)
+          {
+          case 'r':
+            open_direction = O_RDONLY;
+#if GNULIB_FOPEN_GNU
+            if (q < fdopen_mode_buf + BUF_SIZE)
+              *q++ = *p;
+#endif
+            continue;
+          case 'w':
+            open_direction = O_WRONLY;
+            open_flags |= O_CREAT | O_TRUNC;
+#if GNULIB_FOPEN_GNU
+            if (q < fdopen_mode_buf + BUF_SIZE)
+              *q++ = *p;
+#endif
+            continue;
+          case 'a':
+            open_direction = O_WRONLY;
+            open_flags |= O_CREAT | O_APPEND;
+#if GNULIB_FOPEN_GNU
+            if (q < fdopen_mode_buf + BUF_SIZE)
+              *q++ = *p;
+#endif
+            continue;
+          case 'b':
+            /* While it is non-standard, O_BINARY is guaranteed by
+               gnulib <fcntl.h>.  We can also assume that orig_fopen
+               supports the 'b' flag.  */
+            open_flags |= O_BINARY;
+#if GNULIB_FOPEN_GNU
+            if (q < fdopen_mode_buf + BUF_SIZE)
+              *q++ = *p;
+#endif
+            continue;
+          case '+':
+            open_direction = O_RDWR;
+#if GNULIB_FOPEN_GNU
+            if (q < fdopen_mode_buf + BUF_SIZE)
+              *q++ = *p;
+#endif
+            continue;
+#if GNULIB_FOPEN_GNU
+          case 'x':
+            open_flags |= O_EXCL;
+            open_flags_gnu = true;
+            continue;
+          case 'e':
+            open_flags |= O_CLOEXEC;
+            open_flags_gnu = true;
+            continue;
+#endif
+          default:
+            break;
+          }
+#if GNULIB_FOPEN_GNU
+        /* The rest of the mode string can be a platform-dependent extension.
+           Copy it unmodified.  */
+        {
+          size_t len = strlen (p);
+          if (len > fdopen_mode_buf + BUF_SIZE - q)
+            len = fdopen_mode_buf + BUF_SIZE - q;
+          memcpy (q, p, len);
+          q += len;
+        }
+#endif
+        break;
+      }
+#if GNULIB_FOPEN_GNU
+    *q = '\0';
+#endif
+  }
+
 #if FOPEN_TRAILING_SLASH_BUG
   /* Fail if the mode requires write access and the filename ends in a slash,
      as POSIX says such a filename must name a directory
@@ -74,13 +170,14 @@
         struct stat statbuf;
         FILE *fp;
 
-        if (mode[0] == 'w' || mode[0] == 'a')
+        if (open_direction != O_RDONLY)
           {
             errno = EISDIR;
             return NULL;
           }
 
-        fd = open (filename, O_RDONLY);
+        fd = open (filename, open_direction | open_flags,
+                   S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
         if (fd < 0)
           return NULL;
 
@@ -91,7 +188,11 @@
             return NULL;
           }
 
+# if GNULIB_FOPEN_GNU
+        fp = fdopen (fd, fdopen_mode_buf);
+# else
         fp = fdopen (fd, mode);
+# endif
         if (fp == NULL)
           {
             int saved_errno = errno;
@@ -101,7 +202,29 @@
         return fp;
       }
   }
-# endif
+#endif
+
+#if GNULIB_FOPEN_GNU
+  if (open_flags_gnu)
+    {
+      int fd;
+      FILE *fp;
+
+      fd = open (filename, open_direction | open_flags,
+                 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
+      if (fd < 0)
+        return NULL;
+
+      fp = fdopen (fd, fdopen_mode_buf);
+      if (fp == NULL)
+        {
+          int saved_errno = errno;
+          close (fd);
+          errno = saved_errno;
+        }
+      return fp;
+    }
+#endif
 
   return orig_fopen (filename, mode);
 }
diff --git a/lib/fpending.c b/lib/fpending.c
index 3c01285..7c61f7e 100644
--- a/lib/fpending.c
+++ b/lib/fpending.c
@@ -1,5 +1,5 @@
 /* fpending.c -- return the number of pending output bytes on a stream
-   Copyright (C) 2000, 2004, 2006-2007, 2009-2019 Free Software Foundation,
+   Copyright (C) 2000, 2004, 2006-2007, 2009-2021 Free Software Foundation,
    Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -25,7 +25,8 @@
 #include "stdio-impl.h"
 
 /* This file is not used on systems that already have the __fpending function,
-   namely glibc >= 2.2, Solaris >= 7, Android API >= 23.  */
+   namely glibc >= 2.2, Solaris >= 7, UnixWare >= 7.1.4.MP4, Cygwin >= 1.7.34,
+   Android API >= 23.  */
 
 /* Return the number of pending (aka buffered, unflushed)
    bytes on the stream, FP, that is open for writing.  */
@@ -39,13 +40,13 @@
   /* GNU libc, BeOS, Haiku, Linux libc5 */
   return fp->_IO_write_ptr - fp->_IO_write_base;
 #elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
-  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
+  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
   return fp->_p - fp->_bf._base;
 #elif defined __EMX__                /* emx+gcc */
   return fp->_ptr - fp->_buffer;
 #elif defined __minix                /* Minix */
   return fp_->_ptr - fp_->_buf;
-#elif defined _IOERR                 /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel, OpenVMS */
+#elif defined _IOERR                 /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
   return (fp_->_ptr ? fp_->_ptr - fp_->_base : 0);
 #elif defined __UCLIBC__             /* uClibc */
   return (fp->__modeflags & __FLAG_WRITING ? fp->__bufpos - fp->__bufstart : 0);
diff --git a/lib/fpending.h b/lib/fpending.h
index 097a3ef..016341b 100644
--- a/lib/fpending.h
+++ b/lib/fpending.h
@@ -1,6 +1,6 @@
 /* Declare __fpending.
 
-   Copyright (C) 2000, 2003, 2005-2006, 2009-2019 Free Software Foundation,
+   Copyright (C) 2000, 2003, 2005-2006, 2009-2021 Free Software Foundation,
    Inc.
 
    This program is free software: you can redistribute it and/or modify
diff --git a/lib/fprintf.c b/lib/fprintf.c
index ec5c415..5a7e536 100644
--- a/lib/fprintf.c
+++ b/lib/fprintf.c
@@ -1,17 +1,17 @@
 /* Formatted output to a stream.
-   Copyright (C) 2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if 1
@@ -55,11 +55,7 @@
   if (fwrite (output, 1, len, fp) < len)
     {
       if (output != buf)
-        {
-          int saved_errno = errno;
-          free (output);
-          errno = saved_errno;
-        }
+        free (output);
       return -1;
     }
 
diff --git a/lib/fpucw.h b/lib/fpucw.h
index 91a1cbe..4060911 100644
--- a/lib/fpucw.h
+++ b/lib/fpucw.h
@@ -1,18 +1,18 @@
 /* Manipulating the FPU control word.  -*- coding: utf-8 -*-
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2007.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _FPUCW_H
@@ -61,8 +61,8 @@
                                     'long double' safe operation precision
  */
 
-/* Inline assembler like this works only with GNU C.  */
-#if (defined __i386__ || defined __x86_64__) && defined __GNUC__
+/* Inline assembler like this works only with GNU C and clang.  */
+#if (defined __i386__ || defined __x86_64__) && (defined __GNUC__ || defined __clang__)
 
 typedef unsigned short fpucw_t; /* glibc calls this fpu_control_t */
 
diff --git a/lib/free.c b/lib/free.c
new file mode 100644
index 0000000..780f03d
--- /dev/null
+++ b/lib/free.c
@@ -0,0 +1,53 @@
+/* Make free() preserve errno.
+
+   Copyright (C) 2003, 2006, 2009-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* written by Paul Eggert */
+
+#include <config.h>
+
+/* Specification.  */
+#include <stdlib.h>
+
+/* A function definition is only needed if HAVE_FREE_POSIX is not defined.  */
+#if !HAVE_FREE_POSIX
+
+# include <errno.h>
+
+void
+rpl_free (void *p)
+# undef free
+{
+# if defined __GNUC__ && !defined __clang__
+  /* An invalid GCC optimization
+     <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98396>
+     would optimize away the assignments in the code below, when link-time
+     optimization (LTO) is enabled.  Make the code more complicated, so that
+     GCC does not grok how to optimize it.  */
+  int err[2];
+  err[0] = errno;
+  err[1] = errno;
+  errno = 0;
+  free (p);
+  errno = err[errno == 0];
+# else
+  int err = errno;
+  free (p);
+  errno = err;
+# endif
+}
+
+#endif
diff --git a/lib/frexp.c b/lib/frexp.c
index d3f1199..ab5f343 100644
--- a/lib/frexp.c
+++ b/lib/frexp.c
@@ -1,17 +1,17 @@
 /* Split a double into fraction and mantissa.
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Paolo Bonzini <bonzini@gnu.org>, 2003, and
diff --git a/lib/frexpl.c b/lib/frexpl.c
index 820cb2d..e14deea 100644
--- a/lib/frexpl.c
+++ b/lib/frexpl.c
@@ -1,17 +1,17 @@
 /* Split a 'long double' into fraction and mantissa.
-   Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/fseterr.c b/lib/fseterr.c
index 8cd68e8..ed50100 100644
--- a/lib/fseterr.c
+++ b/lib/fseterr.c
@@ -1,17 +1,17 @@
 /* Set the error indicator of a stream.
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
@@ -42,7 +42,7 @@
   fp->_flags |= _IOERR;
 #elif defined __minix               /* Minix */
   fp->_flags |= _IOERR;
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel, OpenVMS */
+#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
   fp_->_flag |= _IOERR;
 #elif defined __UCLIBC__            /* uClibc */
   fp->__modeflags |= __FLAG_ERROR;
diff --git a/lib/fseterr.h b/lib/fseterr.h
index 7b57faa..48084cf 100644
--- a/lib/fseterr.h
+++ b/lib/fseterr.h
@@ -1,17 +1,17 @@
 /* Set the error indicator of a stream.
-   Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _FSETERR_H
diff --git a/lib/fstat.c b/lib/fstat.c
index a892b8f..512c688 100644
--- a/lib/fstat.c
+++ b/lib/fstat.c
@@ -1,17 +1,17 @@
 /* fstat() replacement.
-   Copyright (C) 2011-2019 Free Software Foundation, Inc.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* If the user's config.h happens to include <sys/stat.h>, let it include only
diff --git a/lib/fstatat.c b/lib/fstatat.c
new file mode 100644
index 0000000..640a375
--- /dev/null
+++ b/lib/fstatat.c
@@ -0,0 +1,148 @@
+/* Work around an fstatat bug on Solaris 9.
+
+   Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Paul Eggert and Jim Meyering.  */
+
+/* If the user's config.h happens to include <sys/stat.h>, let it include only
+   the system's <sys/stat.h> here, so that orig_fstatat doesn't recurse to
+   rpl_fstatat.  */
+#define __need_system_sys_stat_h
+#include <config.h>
+
+/* Get the original definition of fstatat.  It might be defined as a macro.  */
+#include <sys/types.h>
+#include <sys/stat.h>
+#undef __need_system_sys_stat_h
+
+#if HAVE_FSTATAT && HAVE_WORKING_FSTATAT_ZERO_FLAG
+static int
+orig_fstatat (int fd, char const *filename, struct stat *buf, int flags)
+{
+  return fstatat (fd, filename, buf, flags);
+}
+#endif
+
+#ifdef __osf__
+/* Write "sys/stat.h" here, not <sys/stat.h>, otherwise OSF/1 5.1 DTK cc
+   eliminates this include because of the preliminary #include <sys/stat.h>
+   above.  */
+# include "sys/stat.h"
+#else
+# include <sys/stat.h>
+#endif
+
+#include "stat-time.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if HAVE_FSTATAT && HAVE_WORKING_FSTATAT_ZERO_FLAG
+
+# ifndef LSTAT_FOLLOWS_SLASHED_SYMLINK
+#  define LSTAT_FOLLOWS_SLASHED_SYMLINK 0
+# endif
+
+static int
+normal_fstatat (int fd, char const *file, struct stat *st, int flag)
+{
+  return stat_time_normalize (orig_fstatat (fd, file, st, flag), st);
+}
+
+/* fstatat should always follow symbolic links that end in /, but on
+   Solaris 9 it doesn't if AT_SYMLINK_NOFOLLOW is specified.
+   Likewise, trailing slash on a non-directory should be an error.
+   These are the same problems that lstat.c and stat.c address, so
+   solve it in a similar way.
+
+   AIX 7.1 fstatat (AT_FDCWD, ..., 0) always fails, which is a bug.
+   Work around this bug if FSTATAT_AT_FDCWD_0_BROKEN is nonzero.  */
+
+int
+rpl_fstatat (int fd, char const *file, struct stat *st, int flag)
+{
+  int result = normal_fstatat (fd, file, st, flag);
+  size_t len;
+
+  if (LSTAT_FOLLOWS_SLASHED_SYMLINK || result != 0)
+    return result;
+  len = strlen (file);
+  if (flag & AT_SYMLINK_NOFOLLOW)
+    {
+      /* Fix lstat behavior.  */
+      if (file[len - 1] != '/' || S_ISDIR (st->st_mode))
+        return 0;
+      if (!S_ISLNK (st->st_mode))
+        {
+          errno = ENOTDIR;
+          return -1;
+        }
+      result = normal_fstatat (fd, file, st, flag & ~AT_SYMLINK_NOFOLLOW);
+    }
+  /* Fix stat behavior.  */
+  if (result == 0 && !S_ISDIR (st->st_mode) && file[len - 1] == '/')
+    {
+      errno = ENOTDIR;
+      return -1;
+    }
+  return result;
+}
+
+#else /* ! (HAVE_FSTATAT && HAVE_WORKING_FSTATAT_ZERO_FLAG) */
+
+/* On mingw, the gnulib <sys/stat.h> defines 'stat' as a function-like
+   macro; but using it in AT_FUNC_F2 causes compilation failure
+   because the preprocessor sees a use of a macro that requires two
+   arguments but is only given one.  Hence, we need an inline
+   forwarder to get past the preprocessor.  */
+static int
+stat_func (char const *name, struct stat *st)
+{
+  return stat (name, st);
+}
+
+/* Likewise, if there is no native 'lstat', then the gnulib
+   <sys/stat.h> defined it as stat, which also needs adjustment.  */
+# if !HAVE_LSTAT
+#  undef lstat
+#  define lstat stat_func
+# endif
+
+/* Replacement for Solaris' function by the same name.
+   <https://www.google.com/search?q=fstatat+site:docs.oracle.com>
+   First, try to simulate it via l?stat ("/proc/self/fd/FD/FILE").
+   Failing that, simulate it via save_cwd/fchdir/(stat|lstat)/restore_cwd.
+   If either the save_cwd or the restore_cwd fails (relatively unlikely),
+   then give a diagnostic and exit nonzero.
+   Otherwise, this function works just like Solaris' fstatat.  */
+
+# define AT_FUNC_NAME fstatat
+# define AT_FUNC_F1 lstat
+# define AT_FUNC_F2 stat_func
+# define AT_FUNC_USE_F1_COND AT_SYMLINK_NOFOLLOW
+# define AT_FUNC_POST_FILE_PARAM_DECLS , struct stat *st, int flag
+# define AT_FUNC_POST_FILE_ARGS        , st
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_F2
+# undef AT_FUNC_USE_F1_COND
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+
+#endif /* !HAVE_FSTATAT */
diff --git a/lib/fstrcmp.c b/lib/fstrcmp.c
index c61eab9..85fa18f 100644
--- a/lib/fstrcmp.c
+++ b/lib/fstrcmp.c
@@ -1,5 +1,5 @@
 /* Functions to make fuzzy comparisons between strings
-   Copyright (C) 1988-1989, 1992-1993, 1995, 2001-2003, 2006, 2008-2019 Free
+   Copyright (C) 1988-1989, 1992-1993, 1995, 2001-2003, 2006, 2008-2021 Free
    Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -46,6 +46,7 @@
   ptrdiff_t edit_count;
 #define NOTE_DELETE(ctxt, xoff) ctxt->edit_count++
 #define NOTE_INSERT(ctxt, yoff) ctxt->edit_count++
+#define NOTE_ORDERED false
 #define EARLY_ABORT(ctxt) ctxt->edit_count > 0
 /* We don't need USE_HEURISTIC, since it is unlikely in typical uses of
    fstrcmp().  */
@@ -73,6 +74,21 @@
 /* Ensure that keys_init is called once only.  */
 gl_once_define(static, keys_init_once)
 
+void
+fstrcmp_free_resources (void)
+{
+  ptrdiff_t *buffer;
+
+  gl_once (keys_init_once, keys_init);
+  buffer = gl_tls_get (buffer_key);
+  if (buffer != NULL)
+    {
+      gl_tls_set (buffer_key, NULL);
+      gl_tls_set (bufmax_key, (void *) (uintptr_t) 0);
+      free (buffer);
+    }
+}
+
 
 /* In the code below, branch probabilities were measured by Ralf Wildenhues,
    by running "msgmerge LL.po coreutils.pot" with msgmerge 0.18 for many
diff --git a/lib/fstrcmp.h b/lib/fstrcmp.h
index 119498d..140a698 100644
--- a/lib/fstrcmp.h
+++ b/lib/fstrcmp.h
@@ -1,5 +1,5 @@
 /* Fuzzy string comparison.
-   Copyright (C) 1995, 2000, 2002-2003, 2006, 2008-2019 Free Software
+   Copyright (C) 1995, 2000, 2002-2003, 2006, 2008-2021 Free Software
    Foundation, Inc.
 
    This file was written by Peter Miller <pmiller@agso.gov.au>
@@ -38,6 +38,15 @@
 /* A shortcut for fstrcmp.  Avoids a function call.  */
 #define fstrcmp(s1,s2) fstrcmp_bounded (s1, s2, 0.0)
 
+/* Frees the per-thread resources allocated by this module for the current
+   thread.
+   You don't need to call this function in threads other than the main thread,
+   because per-thread resources are reclaimed automatically when the thread
+   exits.  However, per-thread resources allocated by the main thread are
+   comparable to static allocations; calling this function can be useful to
+   avoid an error report from valgrind.  */
+extern void fstrcmp_free_resources (void);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/fsync.c b/lib/fsync.c
index bfb6d28..99a932d 100644
--- a/lib/fsync.c
+++ b/lib/fsync.c
@@ -7,19 +7,19 @@
 
    Written by Richard W.M. Jones <rjones.at.redhat.com>
 
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public
-   License as published by the Free Software Foundation; either
-   version 3 of the License, or (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This library is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/get-errno.c b/lib/get-errno.c
index 36e07ad..5be2b68 100644
--- a/lib/get-errno.c
+++ b/lib/get-errno.c
@@ -1,6 +1,6 @@
 /* get-errno.c - get and set errno.
 
-   Copyright (C) 2002, 2006, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2002, 2006, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Paul Eggert.  */
 
diff --git a/lib/get-errno.h b/lib/get-errno.h
index c13ac6b..378e44e 100644
--- a/lib/get-errno.h
+++ b/lib/get-errno.h
@@ -1,6 +1,6 @@
 /* get-errno.h - get and set errno.
 
-   Copyright (C) 2002, 2009-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 2002, 2009-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 extern int get_errno (void);
 extern void set_errno (int);
diff --git a/lib/getcwd-lgpl.c b/lib/getcwd-lgpl.c
new file mode 100644
index 0000000..a9dd848
--- /dev/null
+++ b/lib/getcwd-lgpl.c
@@ -0,0 +1,127 @@
+/* Copyright (C) 2011-2021 Free Software Foundation, Inc.
+   This file is part of gnulib.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification */
+#include <unistd.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if GNULIB_GETCWD
+/* Favor GPL getcwd.c if both getcwd and getcwd-lgpl modules are in use.  */
+typedef int dummy;
+#else
+
+/* Get the name of the current working directory, and put it in SIZE
+   bytes of BUF.  Returns NULL if the directory couldn't be determined
+   (perhaps because the absolute name was longer than PATH_MAX, or
+   because of missing read/search permissions on parent directories)
+   or SIZE was too small.  If successful, returns BUF.  If BUF is
+   NULL, an array is allocated with 'malloc'; the array is SIZE bytes
+   long, unless SIZE == 0, in which case it is as big as
+   necessary.  */
+
+# undef getcwd
+# if defined _WIN32 && !defined __CYGWIN__
+#  define getcwd _getcwd
+# endif
+
+char *
+rpl_getcwd (char *buf, size_t size)
+{
+  char *ptr;
+  char *result;
+
+  /* Handle single size operations.  */
+  if (buf)
+    {
+      if (!size)
+        {
+          errno = EINVAL;
+          return NULL;
+        }
+      return getcwd (buf, size);
+    }
+
+  if (size)
+    {
+      buf = malloc (size);
+      if (!buf)
+        {
+          errno = ENOMEM;
+          return NULL;
+        }
+      result = getcwd (buf, size);
+      if (!result)
+        free (buf);
+      return result;
+    }
+
+  /* Flexible sizing requested.  Avoid over-allocation for the common
+     case of a name that fits within a 4k page, minus some space for
+     local variables, to be sure we don't skip over a guard page.  */
+  {
+    char tmp[4032];
+    size = sizeof tmp;
+    ptr = getcwd (tmp, size);
+    if (ptr)
+      {
+        result = strdup (ptr);
+        if (!result)
+          errno = ENOMEM;
+        return result;
+      }
+    if (errno != ERANGE)
+      return NULL;
+  }
+
+  /* My what a large directory name we have.  */
+  do
+    {
+      size <<= 1;
+      ptr = realloc (buf, size);
+      if (ptr == NULL)
+        {
+          free (buf);
+          errno = ENOMEM;
+          return NULL;
+        }
+      buf = ptr;
+      result = getcwd (buf, size);
+    }
+  while (!result && errno == ERANGE);
+
+  if (!result)
+    free (buf);
+  else
+    {
+      /* Here result == buf.  */
+      /* Shrink result before returning it.  */
+      size_t actual_size = strlen (result) + 1;
+      if (actual_size < size)
+        {
+          char *shrinked_result = realloc (result, actual_size);
+          if (shrinked_result != NULL)
+            result = shrinked_result;
+        }
+    }
+  return result;
+}
+
+#endif
diff --git a/lib/getcwd.c b/lib/getcwd.c
new file mode 100644
index 0000000..da9fcad
--- /dev/null
+++ b/lib/getcwd.c
@@ -0,0 +1,495 @@
+/* Copyright (C) 1991-2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License,
+   or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#if !_LIBC
+# include <config.h>
+# include <unistd.h>
+# include "pathmax.h"
+#else
+# define HAVE_OPENAT 1
+# define D_INO_IN_DIRENT 1
+# define HAVE_MSVC_INVALID_PARAMETER_HANDLER 0
+# define HAVE_MINIMALLY_WORKING_GETCWD 0
+#endif
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdbool.h>
+#include <stddef.h>
+
+#include <fcntl.h> /* For AT_FDCWD on Solaris 9.  */
+
+/* If this host provides the openat function or if we're using the
+   gnulib replacement function with a native fdopendir, then enable
+   code below to make getcwd more efficient and robust.  */
+#if defined HAVE_OPENAT || (defined GNULIB_OPENAT && defined HAVE_FDOPENDIR)
+# define HAVE_OPENAT_SUPPORT 1
+#else
+# define HAVE_OPENAT_SUPPORT 0
+#endif
+
+#ifndef __set_errno
+# define __set_errno(val) (errno = (val))
+#endif
+
+#include <dirent.h>
+#ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(d) strlen ((d)->d_name)
+#endif
+#ifndef _D_ALLOC_NAMLEN
+# define _D_ALLOC_NAMLEN(d) (_D_EXACT_NAMLEN (d) + 1)
+#endif
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if _LIBC
+# ifndef mempcpy
+#  define mempcpy __mempcpy
+# endif
+#endif
+
+#ifndef MAX
+# define MAX(a, b) ((a) < (b) ? (b) : (a))
+#endif
+#ifndef MIN
+# define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+/* In this file, PATH_MAX only serves as a threshold for choosing among two
+   algorithms.  */
+#ifndef PATH_MAX
+# define PATH_MAX 8192
+#endif
+
+#if D_INO_IN_DIRENT
+# define MATCHING_INO(dp, ino) ((dp)->d_ino == (ino))
+#else
+# define MATCHING_INO(dp, ino) true
+#endif
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+#endif
+
+#if !_LIBC
+# define GETCWD_RETURN_TYPE char *
+# define __close_nocancel_nostatus close
+# define __getcwd_generic rpl_getcwd
+# undef stat64
+# define stat64    stat
+# define __fstat64 fstat
+# define __fstatat64 fstatat
+# define __lstat64 lstat
+# define __closedir closedir
+# define __opendir opendir
+# define __readdir64 readdir
+# define __fdopendir fdopendir
+# define __openat openat
+# define __rewinddir rewinddir
+# define __openat64 openat
+# define dirent64 dirent
+#else
+# include <not-cancel.h>
+#endif
+
+/* The results of opendir() in this file are not used with dirfd and fchdir,
+   and we do not leak fds to any single-threaded code that could use stdio,
+   therefore save some unnecessary recursion in fchdir.c.
+   FIXME - if the kernel ever adds support for multi-thread safety for
+   avoiding standard fds, then we should use opendir_safer and
+   openat_safer.  */
+#ifdef GNULIB_defined_opendir
+# undef opendir
+#endif
+#ifdef GNULIB_defined_closedir
+# undef closedir
+#endif
+
+#if defined _WIN32 && !defined __CYGWIN__
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static char *
+getcwd_nothrow (char *buf, size_t size)
+{
+  char *result;
+
+  TRY_MSVC_INVAL
+    {
+      result = _getcwd (buf, size);
+    }
+  CATCH_MSVC_INVAL
+    {
+      result = NULL;
+      errno = ERANGE;
+    }
+  DONE_MSVC_INVAL;
+
+  return result;
+}
+# else
+#  define getcwd_nothrow _getcwd
+# endif
+# define getcwd_system getcwd_nothrow
+#else
+# define getcwd_system getcwd
+#endif
+
+/* Get the name of the current working directory, and put it in SIZE
+   bytes of BUF.  Returns NULL with errno set if the directory couldn't be
+   determined or SIZE was too small.  If successful, returns BUF.  In GNU,
+   if BUF is NULL, an array is allocated with 'malloc'; the array is SIZE
+   bytes long, unless SIZE == 0, in which case it is as big as necessary.  */
+
+GETCWD_RETURN_TYPE
+__getcwd_generic (char *buf, size_t size)
+{
+  /* Lengths of big file name components and entire file names, and a
+     deep level of file name nesting.  These numbers are not upper
+     bounds; they are merely large values suitable for initial
+     allocations, designed to be large enough for most real-world
+     uses.  */
+  enum
+    {
+      BIG_FILE_NAME_COMPONENT_LENGTH = 255,
+      BIG_FILE_NAME_LENGTH = MIN (4095, PATH_MAX - 1),
+      DEEP_NESTING = 100
+    };
+
+#if HAVE_OPENAT_SUPPORT
+  int fd = AT_FDCWD;
+  bool fd_needs_closing = false;
+#else
+  char dots[DEEP_NESTING * sizeof ".." + BIG_FILE_NAME_COMPONENT_LENGTH + 1];
+  char *dotlist = dots;
+  size_t dotsize = sizeof dots;
+  size_t dotlen = 0;
+#endif
+  DIR *dirstream = NULL;
+  dev_t rootdev, thisdev;
+  ino_t rootino, thisino;
+  char *dir;
+  register char *dirp;
+  struct stat64 st;
+  size_t allocated = size;
+  size_t used;
+
+#if HAVE_MINIMALLY_WORKING_GETCWD
+  /* If AT_FDCWD is not defined, the algorithm below is O(N**2) and
+     this is much slower than the system getcwd (at least on
+     GNU/Linux).  So trust the system getcwd's results unless they
+     look suspicious.
+
+     Use the system getcwd even if we have openat support, since the
+     system getcwd works even when a parent is unreadable, while the
+     openat-based approach does not.
+
+     But on AIX 5.1..7.1, the system getcwd is not even minimally
+     working: If the current directory name is slightly longer than
+     PATH_MAX, it omits the first directory component and returns
+     this wrong result with errno = 0.  */
+
+# undef getcwd
+  dir = getcwd_system (buf, size);
+  if (dir || (size && errno == ERANGE))
+    return dir;
+
+  /* Solaris getcwd (NULL, 0) fails with errno == EINVAL, but it has
+     internal magic that lets it work even if an ancestor directory is
+     inaccessible, which is better in many cases.  So in this case try
+     again with a buffer that's almost always big enough.  */
+  if (errno == EINVAL && buf == NULL && size == 0)
+    {
+      char big_buffer[BIG_FILE_NAME_LENGTH + 1];
+      dir = getcwd_system (big_buffer, sizeof big_buffer);
+      if (dir)
+        return strdup (dir);
+    }
+
+# if HAVE_PARTLY_WORKING_GETCWD
+  /* The system getcwd works, except it sometimes fails when it
+     shouldn't, setting errno to ERANGE, ENAMETOOLONG, or ENOENT.    */
+  if (errno != ERANGE && errno != ENAMETOOLONG && errno != ENOENT)
+    return NULL;
+# endif
+#endif
+  if (size == 0)
+    {
+      if (buf != NULL)
+        {
+          __set_errno (EINVAL);
+          return NULL;
+        }
+
+      allocated = BIG_FILE_NAME_LENGTH + 1;
+    }
+
+  if (buf == NULL)
+    {
+      dir = malloc (allocated);
+      if (dir == NULL)
+        return NULL;
+    }
+  else
+    dir = buf;
+
+  dirp = dir + allocated;
+  *--dirp = '\0';
+
+  if (__lstat64 (".", &st) < 0)
+    goto lose;
+  thisdev = st.st_dev;
+  thisino = st.st_ino;
+
+  if (__lstat64 ("/", &st) < 0)
+    goto lose;
+  rootdev = st.st_dev;
+  rootino = st.st_ino;
+
+  while (!(thisdev == rootdev && thisino == rootino))
+    {
+      struct dirent64 *d;
+      dev_t dotdev;
+      ino_t dotino;
+      bool mount_point;
+      int parent_status;
+      size_t dirroom;
+      size_t namlen;
+      bool use_d_ino = true;
+
+      /* Look at the parent directory.  */
+#if HAVE_OPENAT_SUPPORT
+      fd = __openat64 (fd, "..", O_RDONLY);
+      if (fd < 0)
+        goto lose;
+      fd_needs_closing = true;
+      parent_status = __fstat64 (fd, &st);
+#else
+      dotlist[dotlen++] = '.';
+      dotlist[dotlen++] = '.';
+      dotlist[dotlen] = '\0';
+      parent_status = __lstat64 (dotlist, &st);
+#endif
+      if (parent_status != 0)
+        goto lose;
+
+      if (dirstream && __closedir (dirstream) != 0)
+        {
+          dirstream = NULL;
+          goto lose;
+        }
+
+      /* Figure out if this directory is a mount point.  */
+      dotdev = st.st_dev;
+      dotino = st.st_ino;
+      mount_point = dotdev != thisdev;
+
+      /* Search for the last directory.  */
+#if HAVE_OPENAT_SUPPORT
+      dirstream = __fdopendir (fd);
+      if (dirstream == NULL)
+        goto lose;
+      fd_needs_closing = false;
+#else
+      dirstream = __opendir (dotlist);
+      if (dirstream == NULL)
+        goto lose;
+      dotlist[dotlen++] = '/';
+#endif
+      for (;;)
+        {
+          /* Clear errno to distinguish EOF from error if readdir returns
+             NULL.  */
+          __set_errno (0);
+          d = __readdir64 (dirstream);
+
+          /* When we've iterated through all directory entries without finding
+             one with a matching d_ino, rewind the stream and consider each
+             name again, but this time, using lstat.  This is necessary in a
+             chroot on at least one system (glibc-2.3.6 + linux 2.6.12), where
+             .., ../.., ../../.., etc. all had the same device number, yet the
+             d_ino values for entries in / did not match those obtained
+             via lstat.  */
+          if (d == NULL && errno == 0 && use_d_ino)
+            {
+              use_d_ino = false;
+              __rewinddir (dirstream);
+              d = __readdir64 (dirstream);
+            }
+
+          if (d == NULL)
+            {
+              if (errno == 0)
+                /* EOF on dirstream, which can mean e.g., that the current
+                   directory has been removed.  */
+                __set_errno (ENOENT);
+              goto lose;
+            }
+          if (d->d_name[0] == '.' &&
+              (d->d_name[1] == '\0' ||
+               (d->d_name[1] == '.' && d->d_name[2] == '\0')))
+            continue;
+
+          if (use_d_ino)
+            {
+              bool match = (MATCHING_INO (d, thisino) || mount_point);
+              if (! match)
+                continue;
+            }
+
+          {
+            int entry_status;
+#if HAVE_OPENAT_SUPPORT
+            entry_status = __fstatat64 (fd, d->d_name, &st, AT_SYMLINK_NOFOLLOW);
+#else
+            /* Compute size needed for this file name, or for the file
+               name ".." in the same directory, whichever is larger.
+               Room for ".." might be needed the next time through
+               the outer loop.  */
+            size_t name_alloc = _D_ALLOC_NAMLEN (d);
+            size_t filesize = dotlen + MAX (sizeof "..", name_alloc);
+
+            if (filesize < dotlen)
+              goto memory_exhausted;
+
+            if (dotsize < filesize)
+              {
+                /* My, what a deep directory tree you have, Grandma.  */
+                size_t newsize = MAX (filesize, dotsize * 2);
+                size_t i;
+                if (newsize < dotsize)
+                  goto memory_exhausted;
+                if (dotlist != dots)
+                  free (dotlist);
+                dotlist = malloc (newsize);
+                if (dotlist == NULL)
+                  goto lose;
+                dotsize = newsize;
+
+                i = 0;
+                do
+                  {
+                    dotlist[i++] = '.';
+                    dotlist[i++] = '.';
+                    dotlist[i++] = '/';
+                  }
+                while (i < dotlen);
+              }
+
+            memcpy (dotlist + dotlen, d->d_name, _D_ALLOC_NAMLEN (d));
+            entry_status = __lstat64 (dotlist, &st);
+#endif
+            /* We don't fail here if we cannot stat() a directory entry.
+               This can happen when (network) file systems fail.  If this
+               entry is in fact the one we are looking for we will find
+               out soon as we reach the end of the directory without
+               having found anything.  */
+            if (entry_status == 0 && S_ISDIR (st.st_mode)
+                && st.st_dev == thisdev && st.st_ino == thisino)
+              break;
+          }
+        }
+
+      dirroom = dirp - dir;
+      namlen = _D_EXACT_NAMLEN (d);
+
+      if (dirroom <= namlen)
+        {
+          if (size != 0)
+            {
+              __set_errno (ERANGE);
+              goto lose;
+            }
+          else
+            {
+              char *tmp;
+              size_t oldsize = allocated;
+
+              allocated += MAX (allocated, namlen);
+              if (allocated < oldsize
+                  || ! (tmp = realloc (dir, allocated)))
+                goto memory_exhausted;
+
+              /* Move current contents up to the end of the buffer.
+                 This is guaranteed to be non-overlapping.  */
+              dirp = memcpy (tmp + allocated - (oldsize - dirroom),
+                             tmp + dirroom,
+                             oldsize - dirroom);
+              dir = tmp;
+            }
+        }
+      dirp -= namlen;
+      memcpy (dirp, d->d_name, namlen);
+      *--dirp = '/';
+
+      thisdev = dotdev;
+      thisino = dotino;
+    }
+
+  if (dirstream && __closedir (dirstream) != 0)
+    {
+      dirstream = NULL;
+      goto lose;
+    }
+
+  if (dirp == &dir[allocated - 1])
+    *--dirp = '/';
+
+#if ! HAVE_OPENAT_SUPPORT
+  if (dotlist != dots)
+    free (dotlist);
+#endif
+
+  used = dir + allocated - dirp;
+  memmove (dir, dirp, used);
+
+  if (size == 0)
+    /* Ensure that the buffer is only as large as necessary.  */
+    buf = (used < allocated ? realloc (dir, used) : dir);
+
+  if (buf == NULL)
+    /* Either buf was NULL all along, or 'realloc' failed but
+       we still have the original string.  */
+    buf = dir;
+
+  return buf;
+
+ memory_exhausted:
+  __set_errno (ENOMEM);
+ lose:
+  {
+    int save = errno;
+    if (dirstream)
+      __closedir (dirstream);
+#if HAVE_OPENAT_SUPPORT
+    if (fd_needs_closing)
+       __close_nocancel_nostatus (fd);
+#else
+    if (dotlist != dots)
+      free (dotlist);
+#endif
+    if (buf == NULL)
+      free (dir);
+    __set_errno (save);
+  }
+  return NULL;
+}
+
+#if defined _LIBC && !defined GETCWD_RETURN_TYPE
+libc_hidden_def (__getcwd)
+weak_alias (__getcwd, getcwd)
+#endif
diff --git a/lib/getdelim.c b/lib/getdelim.c
new file mode 100644
index 0000000..c690b10
--- /dev/null
+++ b/lib/getdelim.c
@@ -0,0 +1,147 @@
+/* getdelim.c --- Implementation of replacement getdelim function.
+   Copyright (C) 1994, 1996-1998, 2001, 2003, 2005-2021 Free Software
+   Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Ported from glibc by Simon Josefsson. */
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit.  Otherwise gcc
+   optimizes away the lineptr == NULL || n == NULL || fp == NULL tests below.  */
+#define _GL_ARG_NONNULL(params)
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include <limits.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+# define getc_maybe_unlocked(fp)        getc(fp)
+#elif !HAVE_FLOCKFILE || !HAVE_FUNLOCKFILE || !HAVE_DECL_GETC_UNLOCKED
+# undef flockfile
+# undef funlockfile
+# define flockfile(x) ((void) 0)
+# define funlockfile(x) ((void) 0)
+# define getc_maybe_unlocked(fp)        getc(fp)
+#else
+# define getc_maybe_unlocked(fp)        getc_unlocked(fp)
+#endif
+
+static void
+alloc_failed (void)
+{
+#if defined _WIN32 && ! defined __CYGWIN__
+  /* Avoid errno problem without using the realloc module; see:
+     https://lists.gnu.org/r/bug-gnulib/2016-08/msg00025.html  */
+  errno = ENOMEM;
+#endif
+}
+
+/* Read up to (and including) a DELIMITER from FP into *LINEPTR (and
+   NUL-terminate it).  *LINEPTR is a pointer returned from malloc (or
+   NULL), pointing to *N characters of space.  It is realloc'ed as
+   necessary.  Returns the number of characters read (not including
+   the null terminator), or -1 on error or EOF.  */
+
+ssize_t
+getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp)
+{
+  ssize_t result;
+  size_t cur_len = 0;
+
+  if (lineptr == NULL || n == NULL || fp == NULL)
+    {
+      errno = EINVAL;
+      return -1;
+    }
+
+  flockfile (fp);
+
+  if (*lineptr == NULL || *n == 0)
+    {
+      char *new_lineptr;
+      *n = 120;
+      new_lineptr = (char *) realloc (*lineptr, *n);
+      if (new_lineptr == NULL)
+        {
+          alloc_failed ();
+          result = -1;
+          goto unlock_return;
+        }
+      *lineptr = new_lineptr;
+    }
+
+  for (;;)
+    {
+      int i;
+
+      i = getc_maybe_unlocked (fp);
+      if (i == EOF)
+        {
+          result = -1;
+          break;
+        }
+
+      /* Make enough space for len+1 (for final NUL) bytes.  */
+      if (cur_len + 1 >= *n)
+        {
+          size_t needed_max =
+            SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX;
+          size_t needed = 2 * *n + 1;   /* Be generous. */
+          char *new_lineptr;
+
+          if (needed_max < needed)
+            needed = needed_max;
+          if (cur_len + 1 >= needed)
+            {
+              result = -1;
+              errno = EOVERFLOW;
+              goto unlock_return;
+            }
+
+          new_lineptr = (char *) realloc (*lineptr, needed);
+          if (new_lineptr == NULL)
+            {
+              alloc_failed ();
+              result = -1;
+              goto unlock_return;
+            }
+
+          *lineptr = new_lineptr;
+          *n = needed;
+        }
+
+      (*lineptr)[cur_len] = i;
+      cur_len++;
+
+      if (i == delimiter)
+        break;
+    }
+  (*lineptr)[cur_len] = '\0';
+  result = cur_len ? cur_len : result;
+
+ unlock_return:
+  funlockfile (fp); /* doesn't set errno */
+
+  return result;
+}
diff --git a/lib/getdtablesize.c b/lib/getdtablesize.c
index 03a9243..5006c2d 100644
--- a/lib/getdtablesize.c
+++ b/lib/getdtablesize.c
@@ -1,18 +1,18 @@
 /* getdtablesize() function: Return maximum possible file descriptor value + 1.
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2008.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/gethrxtime.c b/lib/gethrxtime.c
index b1ade55..ea5bd12 100644
--- a/lib/gethrxtime.c
+++ b/lib/gethrxtime.c
@@ -1,6 +1,6 @@
 /* gethrxtime -- get high resolution real time
 
-   Copyright (C) 2005-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2007, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/gethrxtime.h b/lib/gethrxtime.h
index 6491794..f7dc079 100644
--- a/lib/gethrxtime.h
+++ b/lib/gethrxtime.h
@@ -1,6 +1,6 @@
 /* gethrxtime -- get high resolution real time
 
-   Copyright (C) 2005, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/getline.c b/lib/getline.c
new file mode 100644
index 0000000..47de1ba
--- /dev/null
+++ b/lib/getline.c
@@ -0,0 +1,27 @@
+/* getline.c --- Implementation of replacement getline function.
+   Copyright (C) 2005-2007, 2009-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+ssize_t
+getline (char **lineptr, size_t *n, FILE *stream)
+{
+  return getdelim (lineptr, n, '\n', stream);
+}
diff --git a/lib/getopt-cdefs.in.h b/lib/getopt-cdefs.in.h
index 049145b..33e3d4b 100644
--- a/lib/getopt-cdefs.in.h
+++ b/lib/getopt-cdefs.in.h
@@ -1,22 +1,21 @@
 /* getopt-on-non-glibc compatibility macros.
-   Copyright (C) 1989-2019 Free Software Foundation, Inc.
+   Copyright (C) 1989-2021 Free Software Foundation, Inc.
    This file is part of gnulib.
    Unlike most of the getopt implementation, it is NOT shared
    with the GNU C Library.
 
-   This file is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 3 of
-   the License, or (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This file is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
-   License along with gnulib; if not, see
-   <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GETOPT_CDEFS_H
 #define _GETOPT_CDEFS_H 1
@@ -57,7 +56,7 @@
 #endif
 
 #ifndef __THROW
-# if defined __cplusplus && __GNUC_PREREQ (2,8)
+# if defined __cplusplus && (__GNUC_PREREQ (2,8) || __clang_major__ >= 4)
 #  define __THROW       throw ()
 # else
 #  define __THROW
diff --git a/lib/getopt-core.h b/lib/getopt-core.h
index 6360ad6..ceb14d0 100644
--- a/lib/getopt-core.h
+++ b/lib/getopt-core.h
@@ -1,19 +1,19 @@
 /* Declarations for getopt (basic, portable features only).
-   Copyright (C) 1989-2019 Free Software Foundation, Inc.
+   Copyright (C) 1989-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library and is also part of gnulib.
    Patches to this file should be submitted to both projects.
 
    The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public
+   modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
-   version 3 of the License, or (at your option) any later version.
+   version 2.1 of the License, or (at your option) any later version.
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
+   You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
diff --git a/lib/getopt-ext.h b/lib/getopt-ext.h
index 13cb007..f82a8c6 100644
--- a/lib/getopt-ext.h
+++ b/lib/getopt-ext.h
@@ -1,19 +1,19 @@
 /* Declarations for getopt (GNU extensions).
-   Copyright (C) 1989-2019 Free Software Foundation, Inc.
+   Copyright (C) 1989-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library and is also part of gnulib.
    Patches to this file should be submitted to both projects.
 
    The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public
+   modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
-   version 3 of the License, or (at your option) any later version.
+   version 2.1 of the License, or (at your option) any later version.
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
+   You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
diff --git a/lib/getopt-pfx-core.h b/lib/getopt-pfx-core.h
index 8fac269..b1733a3 100644
--- a/lib/getopt-pfx-core.h
+++ b/lib/getopt-pfx-core.h
@@ -1,22 +1,21 @@
 /* getopt (basic, portable features) gnulib wrapper header.
-   Copyright (C) 1989-2019 Free Software Foundation, Inc.
+   Copyright (C) 1989-2021 Free Software Foundation, Inc.
    This file is part of gnulib.
    Unlike most of the getopt implementation, it is NOT shared
    with the GNU C Library.
 
-   This file is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 3 of
-   the License, or (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This file is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
-   License along with gnulib; if not, see
-   <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GETOPT_PFX_CORE_H
 #define _GETOPT_PFX_CORE_H 1
@@ -48,6 +47,14 @@
 # define optind __GETOPT_ID (optind)
 # define optopt __GETOPT_ID (optopt)
 
+/* Work around a a problem on macOS, which declares getopt with a
+   trailing __DARWIN_ALIAS(getopt) that would expand to something like
+   __asm("_" "rpl_getopt" "$UNIX2003") were it not for the following
+   hack to suppress the macOS declaration <https://bugs.gnu.org/40205>.  */
+# ifdef __APPLE__
+#  define _GETOPT
+# endif
+
 /* The system's getopt.h may have already included getopt-core.h to
    declare the unprefixed identifiers.  Undef _GETOPT_CORE_H so that
    getopt-core.h declares them with prefixes.  */
diff --git a/lib/getopt-pfx-ext.h b/lib/getopt-pfx-ext.h
index 0e21aef..b9a14ba 100644
--- a/lib/getopt-pfx-ext.h
+++ b/lib/getopt-pfx-ext.h
@@ -1,22 +1,21 @@
 /* getopt (GNU extensions) gnulib wrapper header.
-   Copyright (C) 1989-2019 Free Software Foundation, Inc.
+   Copyright (C) 1989-2021 Free Software Foundation, Inc.
    This file is part of gnulib.
    Unlike most of the getopt implementation, it is NOT shared
    with the GNU C Library.
 
-   This file is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 3 of
-   the License, or (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This file is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
-   License along with gnulib; if not, see
-   <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GETOPT_PFX_EXT_H
 #define _GETOPT_PFX_EXT_H 1
diff --git a/lib/getopt.c b/lib/getopt.c
index 8ee075a..7f3aa5a 100644
--- a/lib/getopt.c
+++ b/lib/getopt.c
@@ -1,19 +1,19 @@
 /* Getopt for GNU.
-   Copyright (C) 1987-2019 Free Software Foundation, Inc.
+   Copyright (C) 1987-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library and is also part of gnulib.
    Patches to this file should be submitted to both projects.
 
    The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public
+   modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
-   version 3 of the License, or (at your option) any later version.
+   version 2.1 of the License, or (at your option) any later version.
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
+   You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
@@ -378,8 +378,8 @@
 /* Initialize internal data upon the first call to getopt.  */
 
 static const char *
-_getopt_initialize (int argc _GL_UNUSED,
-		    char **argv _GL_UNUSED, const char *optstring,
+_getopt_initialize (_GL_UNUSED int argc,
+		    _GL_UNUSED char **argv, const char *optstring,
 		    struct _getopt_data *d, int posixly_correct)
 {
   /* Start processing options with ARGV-element 1 (since ARGV-element 0
diff --git a/lib/getopt.in.h b/lib/getopt.in.h
index c77f34c..bf884f0 100644
--- a/lib/getopt.in.h
+++ b/lib/getopt.in.h
@@ -1,22 +1,22 @@
 /* Declarations for getopt.
-   Copyright (C) 1989-2019 Free Software Foundation, Inc.
+   Copyright (C) 1989-2021 Free Software Foundation, Inc.
    This file is part of gnulib.
    Unlike most of the getopt implementation, it is NOT shared
    with the GNU C Library, which supplies a different version of
    this file.
 
-   This file is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 3 of
-   the License, or (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This file is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
-   License along with gnulib; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _@GUARD_PREFIX@_GETOPT_H
 
diff --git a/lib/getopt1.c b/lib/getopt1.c
index 883aa6b..5a92806 100644
--- a/lib/getopt1.c
+++ b/lib/getopt1.c
@@ -1,19 +1,19 @@
 /* getopt_long and getopt_long_only entry points for GNU getopt.
-   Copyright (C) 1987-2019 Free Software Foundation, Inc.
+   Copyright (C) 1987-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library and is also part of gnulib.
    Patches to this file should be submitted to both projects.
 
    The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public
+   modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
-   version 3 of the License, or (at your option) any later version.
+   version 2.1 of the License, or (at your option) any later version.
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
+   You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
diff --git a/lib/getopt_int.h b/lib/getopt_int.h
index e63706f..91254e4 100644
--- a/lib/getopt_int.h
+++ b/lib/getopt_int.h
@@ -1,19 +1,19 @@
 /* Internal declarations for getopt.
-   Copyright (C) 1989-2019 Free Software Foundation, Inc.
+   Copyright (C) 1989-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library and is also part of gnulib.
    Patches to this file should be submitted to both projects.
 
    The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public
+   modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
-   version 3 of the License, or (at your option) any later version.
+   version 2.1 of the License, or (at your option) any later version.
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
+   You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
diff --git a/lib/getprogname.c b/lib/getprogname.c
index de8f49a..9a80281 100644
--- a/lib/getprogname.c
+++ b/lib/getprogname.c
@@ -1,17 +1,17 @@
 /* Program name management.
-   Copyright (C) 2016-2019 Free Software Foundation, Inc.
+   Copyright (C) 2016-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
+   it under the terms of the GNU Lesser General Public License as published by
+   the Free Software Foundation; either version 2.1 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
@@ -43,7 +43,7 @@
 # include <string.h>
 #endif
 
-#ifdef __sgi
+#if defined __sgi || defined __osf__
 # include <string.h>
 # include <unistd.h>
 # include <stdio.h>
@@ -51,7 +51,13 @@
 # include <sys/procfs.h>
 #endif
 
-#include "dirname.h"
+#if defined __SCO_VERSION__ || defined __sysv5__
+# include <fcntl.h>
+# include <stdlib.h>
+# include <string.h>
+#endif
+
+#include "basename-lgpl.h"
 
 #ifndef HAVE_GETPROGNAME             /* not Mac OS X, FreeBSD, NetBSD, OpenBSD >= 5.4, Cygwin */
 char const *
@@ -218,12 +224,16 @@
       free (buf.ps_pathptr);
     }
   return p;
-# elif defined __sgi                                        /* IRIX */
+# elif defined __sgi || defined __osf__                     /* IRIX or Tru64 */
   char filename[50];
   int fd;
 
-  sprintf (filename, "/proc/pinfo/%d", (int) getpid ());
-  fd = open (filename, O_RDONLY);
+  # if defined __sgi
+    sprintf (filename, "/proc/pinfo/%d", (int) getpid ());
+  # else
+    sprintf (filename, "/proc/%d", (int) getpid ());
+  # endif
+  fd = open (filename, O_RDONLY | O_CLOEXEC);
   if (0 <= fd)
     {
       prpsinfo_t buf;
@@ -245,6 +255,38 @@
         }
     }
   return NULL;
+# elif defined __SCO_VERSION__ || defined __sysv5__                /* SCO OpenServer6/UnixWare */
+  char buf[80];
+  int fd;
+  sprintf (buf, "/proc/%d/cmdline", getpid());
+  fd = open (buf, O_RDONLY);
+  if (0 <= fd)
+    {
+      size_t n = read (fd, buf, 79);
+      if (n > 0)
+        {
+          buf[n] = '\0'; /* Guarantee null-termination */
+          char *progname;
+          progname = strrchr (buf, '/');
+          if (progname)
+            {
+              progname = progname + 1; /* Skip the '/' */
+            }
+          else
+            {
+              progname = buf;
+            }
+          char *ret;
+          ret = malloc (strlen (progname) + 1);
+          if (ret)
+            {
+              strcpy (ret, progname);
+              return ret;
+            }
+        }
+      close (fd);
+    }
+  return "?";
 # else
 #  error "getprogname module not ported to this OS"
 # endif
diff --git a/lib/getprogname.h b/lib/getprogname.h
index 1590b38..eb12dcd 100644
--- a/lib/getprogname.h
+++ b/lib/getprogname.h
@@ -1,17 +1,17 @@
 /* Program name management.
-   Copyright (C) 2016-2019 Free Software Foundation, Inc.
+   Copyright (C) 2016-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
+   it under the terms of the GNU Lesser General Public License as published by
+   the Free Software Foundation; either version 2.1 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_GETPROGNAME_H
diff --git a/lib/getrusage.c b/lib/getrusage.c
index 4598eac..612937a9 100644
--- a/lib/getrusage.c
+++ b/lib/getrusage.c
@@ -1,18 +1,18 @@
 /* getrusage replacement for systems which lack it.
 
-   Copyright (C) 2012-2019 Free Software Foundation, Inc.
+   Copyright (C) 2012-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible, 2012.  */
diff --git a/lib/gettext.h b/lib/gettext.h
index c7c0fdb..f1c7a24 100644
--- a/lib/gettext.h
+++ b/lib/gettext.h
@@ -1,19 +1,19 @@
 /* Convenience header for conditional use of GNU <libintl.h>.
-   Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2019 Free Software
+   Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2021 Free Software
    Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _LIBGETTEXT_H
 #define _LIBGETTEXT_H 1
diff --git a/lib/gettime.c b/lib/gettime.c
index 1fd153f..8f28a32 100644
--- a/lib/gettime.c
+++ b/lib/gettime.c
@@ -1,18 +1,18 @@
 /* gettime -- get the system clock
 
-   Copyright (C) 2002, 2004-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2004-2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Paul Eggert.  */
diff --git a/lib/gettimeofday.c b/lib/gettimeofday.c
index e728bf4..2a222fc 100644
--- a/lib/gettimeofday.c
+++ b/lib/gettimeofday.c
@@ -1,19 +1,19 @@
 /* Provide gettimeofday for systems that don't have it or for which it's broken.
 
-   Copyright (C) 2001-2003, 2005-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2003, 2005-2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* written by Jim Meyering */
 
@@ -29,13 +29,17 @@
 # include <windows.h>
 #endif
 
-#include "localtime-buffer.h"
-
 #ifdef WINDOWS_NATIVE
 
+/* Don't assume that UNICODE is not defined.  */
+# undef LoadLibrary
+# define LoadLibrary LoadLibraryA
+
+# if !(_WIN32_WINNT >= _WIN32_WINNT_WIN8)
+
 /* Avoid warnings from gcc -Wcast-function-type.  */
-# define GetProcAddress \
-   (void *) GetProcAddress
+#  define GetProcAddress \
+    (void *) GetProcAddress
 
 /* GetSystemTimePreciseAsFileTime was introduced only in Windows 8.  */
 typedef void (WINAPI * GetSystemTimePreciseAsFileTimeFuncType) (FILETIME *lpTime);
@@ -54,6 +58,12 @@
   initialized = TRUE;
 }
 
+# else
+
+#  define GetSystemTimePreciseAsFileTimeFunc GetSystemTimePreciseAsFileTime
+
+# endif
+
 #endif
 
 /* This is a wrapper for gettimeofday.  It is used only on systems
@@ -84,8 +94,10 @@
      <http://www.windowstimestamp.com/description>.  */
   FILETIME current_time;
 
+# if !(_WIN32_WINNT >= _WIN32_WINNT_WIN8)
   if (!initialized)
     initialize ();
+# endif
   if (GetSystemTimePreciseAsFileTimeFunc != NULL)
     GetSystemTimePreciseAsFileTimeFunc (&current_time);
   else
@@ -109,11 +121,6 @@
 #else
 
 # if HAVE_GETTIMEOFDAY
-#  if GETTIMEOFDAY_CLOBBERS_LOCALTIME
-  /* Save and restore the contents of the buffer used for localtime's
-     result around the call to gettimeofday.  */
-  struct tm save = *localtime_buffer_addr;
-#  endif
 
 #  if defined timeval /* 'struct timeval' overridden by gnulib?  */
 #   undef timeval
@@ -128,10 +135,6 @@
   int result = gettimeofday (tv, (struct timezone *) tz);
 #  endif
 
-#  if GETTIMEOFDAY_CLOBBERS_LOCALTIME
-  *localtime_buffer_addr = save;
-#  endif
-
   return result;
 
 # else
diff --git a/lib/gl_anyhash1.h b/lib/gl_anyhash1.h
new file mode 100644
index 0000000..49b727d
--- /dev/null
+++ b/lib/gl_anyhash1.h
@@ -0,0 +1,31 @@
+/* Hash table for sequential list, set, and map data type.
+   Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Common code of
+   gl_linkedhash_list.c, gl_avltreehash_list.c, gl_rbtreehash_list.c,
+   gl_linkedhash_set.c, gl_hash_set.c,
+   gl_linkedhash_map.c, gl_hash_map.c.  */
+
+/* Hash table entry.  */
+struct gl_hash_entry
+{
+  struct gl_hash_entry *hash_next;  /* chain of entries in same bucket */
+  size_t hashcode;                  /* cache of the hash code of
+                                       - the key (for map data type) or
+                                       - the value (for list, set data types) */
+};
+typedef struct gl_hash_entry * gl_hash_entry_t;
diff --git a/lib/gl_anyhash2.h b/lib/gl_anyhash2.h
new file mode 100644
index 0000000..7a9fcba
--- /dev/null
+++ b/lib/gl_anyhash2.h
@@ -0,0 +1,82 @@
+/* Hash table for sequential list, set, and map data type.
+   Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Common code of
+   gl_linkedhash_list.c, gl_avltreehash_list.c, gl_rbtreehash_list.c,
+   gl_linkedhash_set.c, gl_hash_set.c,
+   gl_linkedhash_map.c, gl_hash_map.c.  */
+
+#include "gl_anyhash_primes.h"
+
+/* Resizes the hash table with a new estimated size.  */
+static void
+hash_resize (CONTAINER_T container, size_t estimate)
+{
+  size_t new_size = next_prime (estimate);
+
+  if (new_size > container->table_size)
+    {
+      gl_hash_entry_t *old_table = container->table;
+      /* Allocate the new table.  */
+      gl_hash_entry_t *new_table;
+      size_t i;
+
+      if (size_overflow_p (xtimes (new_size, sizeof (gl_hash_entry_t))))
+        goto fail;
+      new_table =
+        (gl_hash_entry_t *) calloc (new_size, sizeof (gl_hash_entry_t));
+      if (new_table == NULL)
+        goto fail;
+
+      /* Iterate through the entries of the old table.  */
+      for (i = container->table_size; i > 0; )
+        {
+          gl_hash_entry_t node = old_table[--i];
+
+          while (node != NULL)
+            {
+              gl_hash_entry_t next = node->hash_next;
+              /* Add the entry to the new table.  */
+              size_t bucket = node->hashcode % new_size;
+              node->hash_next = new_table[bucket];
+              new_table[bucket] = node;
+
+              node = next;
+            }
+        }
+
+      container->table = new_table;
+      container->table_size = new_size;
+      free (old_table);
+    }
+  return;
+
+ fail:
+  /* Just continue without resizing the table.  */
+  return;
+}
+
+/* Resizes the hash table if needed, after CONTAINER_COUNT (container) was
+   incremented.  */
+static void
+hash_resize_after_add (CONTAINER_T container)
+{
+  size_t count = CONTAINER_COUNT (container);
+  size_t estimate = xsum (count, count / 2); /* 1.5 * count */
+  if (estimate > container->table_size)
+    hash_resize (container, estimate);
+}
diff --git a/lib/gl_anyhash_primes.h b/lib/gl_anyhash_primes.h
new file mode 100644
index 0000000..fc69e9c
--- /dev/null
+++ b/lib/gl_anyhash_primes.h
@@ -0,0 +1,87 @@
+/* Table of primes, for use by hash tables.
+   Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Array of primes, approximately in steps of factor 1.2.
+   This table was computed by executing the Common Lisp expression
+     (dotimes (i 244) (format t "nextprime(~D)~%" (ceiling (expt 1.2d0 i))))
+   and feeding the result to PARI/gp.  */
+static const size_t primes[] =
+  {
+    11, 13, 17, 19, 23, 29, 37, 41, 47, 59, 67, 83, 97, 127, 139, 167, 199,
+    239, 293, 347, 419, 499, 593, 709, 853, 1021, 1229, 1471, 1777, 2129, 2543,
+    3049, 3659, 4391, 5273, 6323, 7589, 9103, 10937, 13109, 15727, 18899,
+    22651, 27179, 32609, 39133, 46957, 56359, 67619, 81157, 97369, 116849,
+    140221, 168253, 201907, 242309, 290761, 348889, 418667, 502409, 602887,
+    723467, 868151, 1041779, 1250141, 1500181, 1800191, 2160233, 2592277,
+    3110741, 3732887, 4479463, 5375371, 6450413, 7740517, 9288589, 11146307,
+    13375573, 16050689, 19260817, 23112977, 27735583, 33282701, 39939233,
+    47927081, 57512503, 69014987, 82818011, 99381577, 119257891, 143109469,
+    171731387, 206077643, 247293161, 296751781, 356102141, 427322587,
+    512787097, 615344489, 738413383, 886096061, 1063315271, 1275978331,
+    1531174013, 1837408799, 2204890543UL, 2645868653UL, 3175042391UL,
+    3810050851UL,
+#if SIZE_MAX > 4294967295UL
+    4572061027UL, 5486473229UL, 6583767889UL, 7900521449UL, 9480625733UL,
+    11376750877UL, 13652101063UL, 16382521261UL, 19659025513UL, 23590830631UL,
+    28308996763UL, 33970796089UL, 40764955463UL, 48917946377UL, 58701535657UL,
+    70441842749UL, 84530211301UL, 101436253561UL, 121723504277UL,
+    146068205131UL, 175281846149UL, 210338215379UL, 252405858521UL,
+    302887030151UL, 363464436191UL, 436157323417UL, 523388788231UL,
+    628066545713UL, 753679854847UL, 904415825857UL, 1085298991109UL,
+    1302358789181UL, 1562830547009UL, 1875396656429UL, 2250475987709UL,
+    2700571185239UL, 3240685422287UL, 3888822506759UL, 4666587008147UL,
+    5599904409713UL, 6719885291641UL, 8063862349969UL, 9676634819959UL,
+    11611961783951UL, 13934354140769UL, 16721224968907UL, 20065469962669UL,
+    24078563955191UL, 28894276746229UL, 34673132095507UL, 41607758514593UL,
+    49929310217531UL, 59915172260971UL, 71898206713183UL, 86277848055823UL,
+    103533417666967UL, 124240101200359UL, 149088121440451UL, 178905745728529UL,
+    214686894874223UL, 257624273849081UL, 309149128618903UL, 370978954342639UL,
+    445174745211143UL, 534209694253381UL, 641051633104063UL, 769261959724877UL,
+    923114351670013UL, 1107737222003791UL, 1329284666404567UL,
+    1595141599685509UL, 1914169919622551UL, 2297003903547091UL,
+    2756404684256459UL, 3307685621107757UL, 3969222745329323UL,
+    4763067294395177UL, 5715680753274209UL, 6858816903929113UL,
+    8230580284714831UL, 9876696341657791UL, 11852035609989371UL,
+    14222442731987227UL, 17066931278384657UL, 20480317534061597UL,
+    24576381040873903UL, 29491657249048679UL, 35389988698858471UL,
+    42467986438630267UL, 50961583726356109UL, 61153900471627387UL,
+    73384680565952851UL, 88061616679143347UL, 105673940014972061UL,
+    126808728017966413UL, 152170473621559703UL, 182604568345871671UL,
+    219125482015045997UL, 262950578418055169UL, 315540694101666193UL,
+    378648832921999397UL, 454378599506399233UL, 545254319407679131UL,
+    654305183289214771UL, 785166219947057701UL, 942199463936469157UL,
+    1130639356723763129UL, 1356767228068515623UL, 1628120673682218619UL,
+    1953744808418662409UL, 2344493770102394881UL, 2813392524122873857UL,
+    3376071028947448339UL, 4051285234736937517UL, 4861542281684325481UL,
+    5833850738021191727UL, 7000620885625427969UL, 8400745062750513217UL,
+    10080894075300616261UL, 12097072890360739951UL, 14516487468432885797UL,
+    17419784962119465179UL,
+#endif
+    SIZE_MAX /* sentinel, to ensure the search terminates */
+  };
+
+/* Returns a suitable prime >= ESTIMATE.  */
+static size_t
+next_prime (size_t estimate)
+{
+  size_t i;
+
+  for (i = 0; i < sizeof (primes) / sizeof (primes[0]); i++)
+    if (primes[i] >= estimate)
+      return primes[i];
+  return SIZE_MAX; /* not a prime, but better than nothing */
+}
diff --git a/lib/gl_anylinked_list1.h b/lib/gl_anylinked_list1.h
new file mode 100644
index 0000000..10d6e9b
--- /dev/null
+++ b/lib/gl_anylinked_list1.h
@@ -0,0 +1,48 @@
+/* Sequential list data type implemented by a linked list.
+   Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Common code of gl_linked_list.c and gl_linkedhash_list.c.  */
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Concrete list node implementation, valid for this file only.  */
+struct gl_list_node_impl
+{
+#if WITH_HASHTABLE
+  struct gl_hash_entry h;           /* hash table entry fields; must be first */
+#endif
+  struct gl_list_node_impl *next;
+  struct gl_list_node_impl *prev;
+  const void *value;
+};
+
+/* Concrete gl_list_impl type, valid for this file only.  */
+struct gl_list_impl
+{
+  struct gl_list_impl_base base;
+#if WITH_HASHTABLE
+  /* A hash table: managed as an array of collision lists.  */
+  struct gl_hash_entry **table;
+  size_t table_size;
+#endif
+  /* A circular list anchored at root.
+     The first node is = root.next, the last node is = root.prev.
+     The root's value is unused.  */
+  struct gl_list_node_impl root;
+  /* Number of list nodes, excluding the root.  */
+  size_t count;
+};
diff --git a/lib/gl_anylinked_list2.h b/lib/gl_anylinked_list2.h
new file mode 100644
index 0000000..8ed54ca
--- /dev/null
+++ b/lib/gl_anylinked_list2.h
@@ -0,0 +1,1215 @@
+/* Sequential list data type implemented by a linked list.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Common code of gl_linked_list.c and gl_linkedhash_list.c.  */
+
+/* If the symbol SIGNAL_SAFE_LIST is defined, the code is compiled in such
+   a way that a gl_list_t data structure may be used from within a signal
+   handler.  The operations allowed in the signal handler are:
+     gl_list_iterator, gl_list_iterator_next, gl_list_iterator_free.
+   The list and node fields that are therefore accessed from the signal handler
+   are:
+     list->root, node->next, node->value.
+   We are careful to make modifications to these fields only in an order
+   that maintains the consistency of the list data structure at any moment,
+   and we use 'volatile' assignments to prevent the compiler from reordering
+   such assignments.  */
+#ifdef SIGNAL_SAFE_LIST
+# define ASYNCSAFE(type) *(type volatile *)&
+#else
+# define ASYNCSAFE(type)
+#endif
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+static gl_list_t
+gl_linked_nx_create_empty (gl_list_implementation_t implementation,
+                           gl_listelement_equals_fn equals_fn,
+                           gl_listelement_hashcode_fn hashcode_fn,
+                           gl_listelement_dispose_fn dispose_fn,
+                           bool allow_duplicates)
+{
+  struct gl_list_impl *list =
+    (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+  if (list == NULL)
+    return NULL;
+
+  list->base.vtable = implementation;
+  list->base.equals_fn = equals_fn;
+  list->base.hashcode_fn = hashcode_fn;
+  list->base.dispose_fn = dispose_fn;
+  list->base.allow_duplicates = allow_duplicates;
+#if WITH_HASHTABLE
+  list->table_size = 11;
+  list->table =
+    (gl_hash_entry_t *) calloc (list->table_size, sizeof (gl_hash_entry_t));
+  if (list->table == NULL)
+    goto fail;
+#endif
+  list->root.next = &list->root;
+  list->root.prev = &list->root;
+  list->count = 0;
+
+  return list;
+
+#if WITH_HASHTABLE
+ fail:
+  free (list);
+  return NULL;
+#endif
+}
+
+static gl_list_t
+gl_linked_nx_create (gl_list_implementation_t implementation,
+                     gl_listelement_equals_fn equals_fn,
+                     gl_listelement_hashcode_fn hashcode_fn,
+                     gl_listelement_dispose_fn dispose_fn,
+                     bool allow_duplicates,
+                     size_t count, const void **contents)
+{
+  struct gl_list_impl *list =
+    (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+  gl_list_node_t tail;
+
+  if (list == NULL)
+    return NULL;
+
+  list->base.vtable = implementation;
+  list->base.equals_fn = equals_fn;
+  list->base.hashcode_fn = hashcode_fn;
+  list->base.dispose_fn = dispose_fn;
+  list->base.allow_duplicates = allow_duplicates;
+#if WITH_HASHTABLE
+  {
+    size_t estimate = xsum (count, count / 2); /* 1.5 * count */
+    if (estimate < 10)
+      estimate = 10;
+    list->table_size = next_prime (estimate);
+    if (size_overflow_p (xtimes (list->table_size, sizeof (gl_hash_entry_t))))
+      goto fail1;
+    list->table =
+      (gl_hash_entry_t *) calloc (list->table_size, sizeof (gl_hash_entry_t));
+    if (list->table == NULL)
+      goto fail1;
+  }
+#endif
+  list->count = count;
+  tail = &list->root;
+  for (; count > 0; contents++, count--)
+    {
+      gl_list_node_t node =
+        (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+      if (node == NULL)
+        goto fail2;
+
+      node->value = *contents;
+#if WITH_HASHTABLE
+      node->h.hashcode =
+        (list->base.hashcode_fn != NULL
+         ? list->base.hashcode_fn (node->value)
+         : (size_t)(uintptr_t) node->value);
+
+      /* Add node to the hash table.  */
+      if (add_to_bucket (list, node) < 0)
+        {
+          free (node);
+          goto fail2;
+        }
+#endif
+
+      /* Add node to the list.  */
+      node->prev = tail;
+      tail->next = node;
+      tail = node;
+    }
+  tail->next = &list->root;
+  list->root.prev = tail;
+
+  return list;
+
+ fail2:
+  {
+    gl_list_node_t node;
+
+    for (node = tail; node != &list->root; )
+      {
+        gl_list_node_t prev = node->prev;
+
+        free (node);
+        node = prev;
+      }
+  }
+#if WITH_HASHTABLE
+  free (list->table);
+ fail1:
+#endif
+  free (list);
+  return NULL;
+}
+
+static size_t _GL_ATTRIBUTE_PURE
+gl_linked_size (gl_list_t list)
+{
+  return list->count;
+}
+
+static const void * _GL_ATTRIBUTE_PURE
+gl_linked_node_value (_GL_ATTRIBUTE_MAYBE_UNUSED gl_list_t list,
+                      gl_list_node_t node)
+{
+  return node->value;
+}
+
+static int
+gl_linked_node_nx_set_value (_GL_ATTRIBUTE_MAYBE_UNUSED gl_list_t list,
+                             gl_list_node_t node,
+                             const void *elt)
+{
+#if WITH_HASHTABLE
+  if (elt != node->value)
+    {
+      size_t new_hashcode =
+        (list->base.hashcode_fn != NULL
+         ? list->base.hashcode_fn (elt)
+         : (size_t)(uintptr_t) elt);
+
+      if (new_hashcode != node->h.hashcode)
+        {
+          remove_from_bucket (list, node);
+          node->value = elt;
+          node->h.hashcode = new_hashcode;
+          if (add_to_bucket (list, node) < 0)
+            {
+              /* Out of memory.  We removed node from a bucket but cannot add
+                 it to another bucket.  In order to avoid inconsistencies, we
+                 must remove node entirely from the list.  */
+              gl_list_node_t before_removed = node->prev;
+              gl_list_node_t after_removed = node->next;
+              ASYNCSAFE(gl_list_node_t) before_removed->next = after_removed;
+              after_removed->prev = before_removed;
+              list->count--;
+              free (node);
+              return -1;
+            }
+        }
+      else
+        node->value = elt;
+    }
+#else
+  node->value = elt;
+#endif
+  return 0;
+}
+
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+gl_linked_next_node (gl_list_t list, gl_list_node_t node)
+{
+  return (node->next != &list->root ? node->next : NULL);
+}
+
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+gl_linked_previous_node (gl_list_t list, gl_list_node_t node)
+{
+  return (node->prev != &list->root ? node->prev : NULL);
+}
+
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+gl_linked_first_node (gl_list_t list)
+{
+  if (list->count > 0)
+    return list->root.next;
+  else
+    return NULL;
+}
+
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+gl_linked_last_node (gl_list_t list)
+{
+  if (list->count > 0)
+    return list->root.prev;
+  else
+    return NULL;
+}
+
+static const void * _GL_ATTRIBUTE_PURE
+gl_linked_get_at (gl_list_t list, size_t position)
+{
+  size_t count = list->count;
+  gl_list_node_t node;
+
+  if (!(position < count))
+    /* Invalid argument.  */
+    abort ();
+  /* Here we know count > 0.  */
+  if (position <= ((count - 1) / 2))
+    {
+      node = list->root.next;
+      for (; position > 0; position--)
+        node = node->next;
+    }
+  else
+    {
+      position = count - 1 - position;
+      node = list->root.prev;
+      for (; position > 0; position--)
+        node = node->prev;
+    }
+  return node->value;
+}
+
+static gl_list_node_t
+gl_linked_nx_set_at (gl_list_t list, size_t position, const void *elt)
+{
+  size_t count = list->count;
+  gl_list_node_t node;
+
+  if (!(position < count))
+    /* Invalid argument.  */
+    abort ();
+  /* Here we know count > 0.  */
+  if (position <= ((count - 1) / 2))
+    {
+      node = list->root.next;
+      for (; position > 0; position--)
+        node = node->next;
+    }
+  else
+    {
+      position = count - 1 - position;
+      node = list->root.prev;
+      for (; position > 0; position--)
+        node = node->prev;
+    }
+#if WITH_HASHTABLE
+  if (elt != node->value)
+    {
+      size_t new_hashcode =
+        (list->base.hashcode_fn != NULL
+         ? list->base.hashcode_fn (elt)
+         : (size_t)(uintptr_t) elt);
+
+      if (new_hashcode != node->h.hashcode)
+        {
+          remove_from_bucket (list, node);
+          node->value = elt;
+          node->h.hashcode = new_hashcode;
+          if (add_to_bucket (list, node) < 0)
+            {
+              /* Out of memory.  We removed node from a bucket but cannot add
+                 it to another bucket.  In order to avoid inconsistencies, we
+                 must remove node entirely from the list.  */
+              gl_list_node_t before_removed = node->prev;
+              gl_list_node_t after_removed = node->next;
+              ASYNCSAFE(gl_list_node_t) before_removed->next = after_removed;
+              after_removed->prev = before_removed;
+              list->count--;
+              free (node);
+              return NULL;
+            }
+        }
+      else
+        node->value = elt;
+    }
+#else
+  node->value = elt;
+#endif
+  return node;
+}
+
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+gl_linked_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+                          const void *elt)
+{
+  size_t count = list->count;
+
+  if (!(start_index <= end_index && end_index <= count))
+    /* Invalid arguments.  */
+    abort ();
+  {
+#if WITH_HASHTABLE
+    size_t hashcode =
+      (list->base.hashcode_fn != NULL
+       ? list->base.hashcode_fn (elt)
+       : (size_t)(uintptr_t) elt);
+    size_t bucket = hashcode % list->table_size;
+    gl_listelement_equals_fn equals = list->base.equals_fn;
+
+    if (!list->base.allow_duplicates)
+      {
+        /* Look for the first match in the hash bucket.  */
+        gl_list_node_t found = NULL;
+        gl_list_node_t node;
+
+        for (node = (gl_list_node_t) list->table[bucket];
+             node != NULL;
+             node = (gl_list_node_t) node->h.hash_next)
+          if (node->h.hashcode == hashcode
+              && (equals != NULL
+                  ? equals (elt, node->value)
+                  : elt == node->value))
+            {
+              found = node;
+              break;
+            }
+        if (start_index > 0)
+          /* Look whether found's index is < start_index.  */
+          for (node = list->root.next; ; node = node->next)
+            {
+              if (node == found)
+                return NULL;
+              if (--start_index == 0)
+                break;
+            }
+        if (end_index < count)
+          /* Look whether found's index is >= end_index.  */
+          {
+            end_index = count - end_index;
+            for (node = list->root.prev; ; node = node->prev)
+              {
+                if (node == found)
+                  return NULL;
+                if (--end_index == 0)
+                  break;
+              }
+          }
+        return found;
+      }
+    else
+      {
+        /* Look whether there is more than one match in the hash bucket.  */
+        bool multiple_matches = false;
+        gl_list_node_t first_match = NULL;
+        gl_list_node_t node;
+
+        for (node = (gl_list_node_t) list->table[bucket];
+             node != NULL;
+             node = (gl_list_node_t) node->h.hash_next)
+          if (node->h.hashcode == hashcode
+              && (equals != NULL
+                  ? equals (elt, node->value)
+                  : elt == node->value))
+            {
+              if (first_match == NULL)
+                first_match = node;
+              else
+                {
+                  multiple_matches = true;
+                  break;
+                }
+            }
+        if (multiple_matches)
+          {
+            /* We need the match with the smallest index.  But we don't have
+               a fast mapping node -> index.  So we have to walk the list.  */
+            end_index -= start_index;
+            node = list->root.next;
+            for (; start_index > 0; start_index--)
+              node = node->next;
+
+            for (;
+                 end_index > 0;
+                 node = node->next, end_index--)
+              if (node->h.hashcode == hashcode
+                  && (equals != NULL
+                      ? equals (elt, node->value)
+                      : elt == node->value))
+                return node;
+            /* The matches must have all been at indices < start_index or
+               >= end_index.  */
+            return NULL;
+          }
+        else
+          {
+            if (start_index > 0)
+              /* Look whether first_match's index is < start_index.  */
+              for (node = list->root.next; node != &list->root; node = node->next)
+                {
+                  if (node == first_match)
+                    return NULL;
+                  if (--start_index == 0)
+                    break;
+                }
+            if (end_index < list->count)
+              /* Look whether first_match's index is >= end_index.  */
+              {
+                end_index = list->count - end_index;
+                for (node = list->root.prev; ; node = node->prev)
+                  {
+                    if (node == first_match)
+                      return NULL;
+                    if (--end_index == 0)
+                      break;
+                  }
+              }
+            return first_match;
+          }
+      }
+#else
+    gl_listelement_equals_fn equals = list->base.equals_fn;
+    gl_list_node_t node = list->root.next;
+
+    end_index -= start_index;
+    for (; start_index > 0; start_index--)
+      node = node->next;
+
+    if (equals != NULL)
+      {
+        for (; end_index > 0; node = node->next, end_index--)
+          if (equals (elt, node->value))
+            return node;
+      }
+    else
+      {
+        for (; end_index > 0; node = node->next, end_index--)
+          if (elt == node->value)
+            return node;
+      }
+    return NULL;
+#endif
+  }
+}
+
+static size_t _GL_ATTRIBUTE_PURE
+gl_linked_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index,
+                           const void *elt)
+{
+  size_t count = list->count;
+
+  if (!(start_index <= end_index && end_index <= count))
+    /* Invalid arguments.  */
+    abort ();
+  {
+#if WITH_HASHTABLE
+    /* Here the hash table doesn't help much.  It only allows us to minimize
+       the number of equals() calls, by looking up first the node and then
+       its index.  */
+    size_t hashcode =
+      (list->base.hashcode_fn != NULL
+       ? list->base.hashcode_fn (elt)
+       : (size_t)(uintptr_t) elt);
+    size_t bucket = hashcode % list->table_size;
+    gl_listelement_equals_fn equals = list->base.equals_fn;
+    gl_list_node_t node;
+
+    /* First step: Look up the node.  */
+    if (!list->base.allow_duplicates)
+      {
+        /* Look for the first match in the hash bucket.  */
+        for (node = (gl_list_node_t) list->table[bucket];
+             node != NULL;
+             node = (gl_list_node_t) node->h.hash_next)
+          if (node->h.hashcode == hashcode
+              && (equals != NULL
+                  ? equals (elt, node->value)
+                  : elt == node->value))
+            break;
+      }
+    else
+      {
+        /* Look whether there is more than one match in the hash bucket.  */
+        bool multiple_matches = false;
+        gl_list_node_t first_match = NULL;
+
+        for (node = (gl_list_node_t) list->table[bucket];
+             node != NULL;
+             node = (gl_list_node_t) node->h.hash_next)
+          if (node->h.hashcode == hashcode
+              && (equals != NULL
+                  ? equals (elt, node->value)
+                  : elt == node->value))
+            {
+              if (first_match == NULL)
+                first_match = node;
+              else
+                {
+                  multiple_matches = true;
+                  break;
+                }
+            }
+        if (multiple_matches)
+          {
+            /* We need the match with the smallest index.  But we don't have
+               a fast mapping node -> index.  So we have to walk the list.  */
+            size_t index;
+
+            index = start_index;
+            node = list->root.next;
+            for (; start_index > 0; start_index--)
+              node = node->next;
+
+            for (;
+                 index < end_index;
+                 node = node->next, index++)
+              if (node->h.hashcode == hashcode
+                  && (equals != NULL
+                      ? equals (elt, node->value)
+                      : elt == node->value))
+                return index;
+            /* The matches must have all been at indices < start_index or
+               >= end_index.  */
+            return (size_t)(-1);
+          }
+        node = first_match;
+      }
+
+    /* Second step: Look up the index of the node.  */
+    if (node == NULL)
+      return (size_t)(-1);
+    else
+      {
+        size_t index = 0;
+
+        for (; node->prev != &list->root; node = node->prev)
+          index++;
+
+        if (index >= start_index && index < end_index)
+          return index;
+        else
+          return (size_t)(-1);
+      }
+#else
+    gl_listelement_equals_fn equals = list->base.equals_fn;
+    size_t index = start_index;
+    gl_list_node_t node = list->root.next;
+
+    for (; start_index > 0; start_index--)
+      node = node->next;
+
+    if (equals != NULL)
+      {
+        for (;
+             index < end_index;
+             node = node->next, index++)
+          if (equals (elt, node->value))
+            return index;
+      }
+    else
+      {
+        for (;
+             index < end_index;
+             node = node->next, index++)
+          if (elt == node->value)
+            return index;
+      }
+    return (size_t)(-1);
+#endif
+  }
+}
+
+static gl_list_node_t
+gl_linked_nx_add_first (gl_list_t list, const void *elt)
+{
+  gl_list_node_t node =
+    (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+  if (node == NULL)
+    return NULL;
+
+  ASYNCSAFE(const void *) node->value = elt;
+#if WITH_HASHTABLE
+  node->h.hashcode =
+    (list->base.hashcode_fn != NULL
+     ? list->base.hashcode_fn (node->value)
+     : (size_t)(uintptr_t) node->value);
+
+  /* Add node to the hash table.  */
+  if (add_to_bucket (list, node) < 0)
+    {
+      free (node);
+      return NULL;
+    }
+#endif
+
+  /* Add node to the list.  */
+  node->prev = &list->root;
+  ASYNCSAFE(gl_list_node_t) node->next = list->root.next;
+  node->next->prev = node;
+  ASYNCSAFE(gl_list_node_t) list->root.next = node;
+  list->count++;
+
+#if WITH_HASHTABLE
+  hash_resize_after_add (list);
+#endif
+
+  return node;
+}
+
+static gl_list_node_t
+gl_linked_nx_add_last (gl_list_t list, const void *elt)
+{
+  gl_list_node_t node =
+    (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+  if (node == NULL)
+    return NULL;
+
+  ASYNCSAFE(const void *) node->value = elt;
+#if WITH_HASHTABLE
+  node->h.hashcode =
+    (list->base.hashcode_fn != NULL
+     ? list->base.hashcode_fn (node->value)
+     : (size_t)(uintptr_t) node->value);
+
+  /* Add node to the hash table.  */
+  if (add_to_bucket (list, node) < 0)
+    {
+      free (node);
+      return NULL;
+    }
+#endif
+
+  /* Add node to the list.  */
+  ASYNCSAFE(gl_list_node_t) node->next = &list->root;
+  node->prev = list->root.prev;
+  ASYNCSAFE(gl_list_node_t) node->prev->next = node;
+  list->root.prev = node;
+  list->count++;
+
+#if WITH_HASHTABLE
+  hash_resize_after_add (list);
+#endif
+
+  return node;
+}
+
+static gl_list_node_t
+gl_linked_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+  gl_list_node_t new_node =
+    (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+  if (new_node == NULL)
+    return NULL;
+
+  ASYNCSAFE(const void *) new_node->value = elt;
+#if WITH_HASHTABLE
+  new_node->h.hashcode =
+    (list->base.hashcode_fn != NULL
+     ? list->base.hashcode_fn (new_node->value)
+     : (size_t)(uintptr_t) new_node->value);
+
+  /* Add new_node to the hash table.  */
+  if (add_to_bucket (list, new_node) < 0)
+    {
+      free (new_node);
+      return NULL;
+    }
+#endif
+
+  /* Add new_node to the list.  */
+  ASYNCSAFE(gl_list_node_t) new_node->next = node;
+  new_node->prev = node->prev;
+  ASYNCSAFE(gl_list_node_t) new_node->prev->next = new_node;
+  node->prev = new_node;
+  list->count++;
+
+#if WITH_HASHTABLE
+  hash_resize_after_add (list);
+#endif
+
+  return new_node;
+}
+
+static gl_list_node_t
+gl_linked_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+  gl_list_node_t new_node =
+    (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+  if (new_node == NULL)
+    return NULL;
+
+  ASYNCSAFE(const void *) new_node->value = elt;
+#if WITH_HASHTABLE
+  new_node->h.hashcode =
+    (list->base.hashcode_fn != NULL
+     ? list->base.hashcode_fn (new_node->value)
+     : (size_t)(uintptr_t) new_node->value);
+
+  /* Add new_node to the hash table.  */
+  if (add_to_bucket (list, new_node) < 0)
+    {
+      free (new_node);
+      return NULL;
+    }
+#endif
+
+  /* Add new_node to the list.  */
+  new_node->prev = node;
+  ASYNCSAFE(gl_list_node_t) new_node->next = node->next;
+  new_node->next->prev = new_node;
+  ASYNCSAFE(gl_list_node_t) node->next = new_node;
+  list->count++;
+
+#if WITH_HASHTABLE
+  hash_resize_after_add (list);
+#endif
+
+  return new_node;
+}
+
+static gl_list_node_t
+gl_linked_nx_add_at (gl_list_t list, size_t position, const void *elt)
+{
+  size_t count = list->count;
+  gl_list_node_t new_node;
+
+  if (!(position <= count))
+    /* Invalid argument.  */
+    abort ();
+
+  new_node = (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+  if (new_node == NULL)
+    return NULL;
+
+  ASYNCSAFE(const void *) new_node->value = elt;
+#if WITH_HASHTABLE
+  new_node->h.hashcode =
+    (list->base.hashcode_fn != NULL
+     ? list->base.hashcode_fn (new_node->value)
+     : (size_t)(uintptr_t) new_node->value);
+
+  /* Add new_node to the hash table.  */
+  if (add_to_bucket (list, new_node) < 0)
+    {
+      free (new_node);
+      return NULL;
+    }
+#endif
+
+  /* Add new_node to the list.  */
+  if (position <= (count / 2))
+    {
+      gl_list_node_t node;
+
+      node = &list->root;
+      for (; position > 0; position--)
+        node = node->next;
+      new_node->prev = node;
+      ASYNCSAFE(gl_list_node_t) new_node->next = node->next;
+      new_node->next->prev = new_node;
+      ASYNCSAFE(gl_list_node_t) node->next = new_node;
+    }
+  else
+    {
+      gl_list_node_t node;
+
+      position = count - position;
+      node = &list->root;
+      for (; position > 0; position--)
+        node = node->prev;
+      ASYNCSAFE(gl_list_node_t) new_node->next = node;
+      new_node->prev = node->prev;
+      ASYNCSAFE(gl_list_node_t) new_node->prev->next = new_node;
+      node->prev = new_node;
+    }
+  list->count++;
+
+#if WITH_HASHTABLE
+  hash_resize_after_add (list);
+#endif
+
+  return new_node;
+}
+
+static bool
+gl_linked_remove_node (gl_list_t list, gl_list_node_t node)
+{
+  gl_list_node_t prev;
+  gl_list_node_t next;
+
+#if WITH_HASHTABLE
+  /* Remove node from the hash table.  */
+  remove_from_bucket (list, node);
+#endif
+
+  /* Remove node from the list.  */
+  prev = node->prev;
+  next = node->next;
+
+  ASYNCSAFE(gl_list_node_t) prev->next = next;
+  next->prev = prev;
+  list->count--;
+
+  if (list->base.dispose_fn != NULL)
+    list->base.dispose_fn (node->value);
+  free (node);
+  return true;
+}
+
+static bool
+gl_linked_remove_at (gl_list_t list, size_t position)
+{
+  size_t count = list->count;
+  gl_list_node_t removed_node;
+
+  if (!(position < count))
+    /* Invalid argument.  */
+    abort ();
+  /* Here we know count > 0.  */
+  if (position <= ((count - 1) / 2))
+    {
+      gl_list_node_t node;
+      gl_list_node_t after_removed;
+
+      node = &list->root;
+      for (; position > 0; position--)
+        node = node->next;
+      removed_node = node->next;
+      after_removed = node->next->next;
+      ASYNCSAFE(gl_list_node_t) node->next = after_removed;
+      after_removed->prev = node;
+    }
+  else
+    {
+      gl_list_node_t node;
+      gl_list_node_t before_removed;
+
+      position = count - 1 - position;
+      node = &list->root;
+      for (; position > 0; position--)
+        node = node->prev;
+      removed_node = node->prev;
+      before_removed = node->prev->prev;
+      node->prev = before_removed;
+      ASYNCSAFE(gl_list_node_t) before_removed->next = node;
+    }
+#if WITH_HASHTABLE
+  remove_from_bucket (list, removed_node);
+#endif
+  list->count--;
+
+  if (list->base.dispose_fn != NULL)
+    list->base.dispose_fn (removed_node->value);
+  free (removed_node);
+  return true;
+}
+
+static bool
+gl_linked_remove (gl_list_t list, const void *elt)
+{
+  gl_list_node_t node = gl_linked_search_from_to (list, 0, list->count, elt);
+
+  if (node != NULL)
+    return gl_linked_remove_node (list, node);
+  else
+    return false;
+}
+
+static void
+gl_linked_list_free (gl_list_t list)
+{
+  gl_listelement_dispose_fn dispose = list->base.dispose_fn;
+  gl_list_node_t node;
+
+  for (node = list->root.next; node != &list->root; )
+    {
+      gl_list_node_t next = node->next;
+      if (dispose != NULL)
+        dispose (node->value);
+      free (node);
+      node = next;
+    }
+#if WITH_HASHTABLE
+  free (list->table);
+#endif
+  free (list);
+}
+
+/* --------------------- gl_list_iterator_t Data Type --------------------- */
+
+static gl_list_iterator_t _GL_ATTRIBUTE_PURE
+gl_linked_iterator (gl_list_t list)
+{
+  gl_list_iterator_t result;
+
+  result.vtable = list->base.vtable;
+  result.list = list;
+  result.p = list->root.next;
+  result.q = &list->root;
+#if defined GCC_LINT || defined lint
+  result.i = 0;
+  result.j = 0;
+  result.count = 0;
+#endif
+
+  return result;
+}
+
+static gl_list_iterator_t _GL_ATTRIBUTE_PURE
+gl_linked_iterator_from_to (gl_list_t list,
+                            size_t start_index, size_t end_index)
+{
+  gl_list_iterator_t result;
+  size_t n1, n2, n3;
+
+  if (!(start_index <= end_index && end_index <= list->count))
+    /* Invalid arguments.  */
+    abort ();
+  result.vtable = list->base.vtable;
+  result.list = list;
+  n1 = start_index;
+  n2 = end_index - start_index;
+  n3 = list->count - end_index;
+  /* Find the maximum among n1, n2, n3, so as to reduce the number of
+     loop iterations to n1 + n2 + n3 - max(n1,n2,n3).  */
+  if (n1 > n2 && n1 > n3)
+    {
+      /* n1 is the maximum, use n2 and n3.  */
+      gl_list_node_t node;
+      size_t i;
+
+      node = &list->root;
+      for (i = n3; i > 0; i--)
+        node = node->prev;
+      result.q = node;
+      for (i = n2; i > 0; i--)
+        node = node->prev;
+      result.p = node;
+    }
+  else if (n2 > n3)
+    {
+      /* n2 is the maximum, use n1 and n3.  */
+      gl_list_node_t node;
+      size_t i;
+
+      node = list->root.next;
+      for (i = n1; i > 0; i--)
+        node = node->next;
+      result.p = node;
+
+      node = &list->root;
+      for (i = n3; i > 0; i--)
+        node = node->prev;
+      result.q = node;
+    }
+  else
+    {
+      /* n3 is the maximum, use n1 and n2.  */
+      gl_list_node_t node;
+      size_t i;
+
+      node = list->root.next;
+      for (i = n1; i > 0; i--)
+        node = node->next;
+      result.p = node;
+      for (i = n2; i > 0; i--)
+        node = node->next;
+      result.q = node;
+    }
+
+#if defined GCC_LINT || defined lint
+  result.i = 0;
+  result.j = 0;
+  result.count = 0;
+#endif
+
+  return result;
+}
+
+static bool
+gl_linked_iterator_next (gl_list_iterator_t *iterator,
+                         const void **eltp, gl_list_node_t *nodep)
+{
+  if (iterator->p != iterator->q)
+    {
+      gl_list_node_t node = (gl_list_node_t) iterator->p;
+      *eltp = node->value;
+      if (nodep != NULL)
+        *nodep = node;
+      iterator->p = node->next;
+      return true;
+    }
+  else
+    return false;
+}
+
+static void
+gl_linked_iterator_free (_GL_ATTRIBUTE_MAYBE_UNUSED gl_list_iterator_t *iterator)
+{
+}
+
+/* ---------------------- Sorted gl_list_t Data Type ---------------------- */
+
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+gl_linked_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar,
+                             const void *elt)
+{
+  gl_list_node_t node;
+
+  for (node = list->root.next; node != &list->root; node = node->next)
+    {
+      int cmp = compar (node->value, elt);
+
+      if (cmp > 0)
+        break;
+      if (cmp == 0)
+        return node;
+    }
+  return NULL;
+}
+
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+gl_linked_sortedlist_search_from_to (gl_list_t list,
+                                     gl_listelement_compar_fn compar,
+                                     size_t low, size_t high,
+                                     const void *elt)
+{
+  size_t count = list->count;
+
+  if (!(low <= high && high <= list->count))
+    /* Invalid arguments.  */
+    abort ();
+
+  high -= low;
+  if (high > 0)
+    {
+      /* Here we know low < count.  */
+      size_t position = low;
+      gl_list_node_t node;
+
+      if (position <= ((count - 1) / 2))
+        {
+          node = list->root.next;
+          for (; position > 0; position--)
+            node = node->next;
+        }
+      else
+        {
+          position = count - 1 - position;
+          node = list->root.prev;
+          for (; position > 0; position--)
+            node = node->prev;
+        }
+
+      do
+        {
+          int cmp = compar (node->value, elt);
+
+          if (cmp > 0)
+            break;
+          if (cmp == 0)
+            return node;
+          node = node->next;
+        }
+      while (--high > 0);
+    }
+  return NULL;
+}
+
+static size_t _GL_ATTRIBUTE_PURE
+gl_linked_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar,
+                              const void *elt)
+{
+  gl_list_node_t node;
+  size_t index;
+
+  for (node = list->root.next, index = 0;
+       node != &list->root;
+       node = node->next, index++)
+    {
+      int cmp = compar (node->value, elt);
+
+      if (cmp > 0)
+        break;
+      if (cmp == 0)
+        return index;
+    }
+  return (size_t)(-1);
+}
+
+static size_t _GL_ATTRIBUTE_PURE
+gl_linked_sortedlist_indexof_from_to (gl_list_t list,
+                                      gl_listelement_compar_fn compar,
+                                      size_t low, size_t high,
+                                      const void *elt)
+{
+  size_t count = list->count;
+
+  if (!(low <= high && high <= list->count))
+    /* Invalid arguments.  */
+    abort ();
+
+  high -= low;
+  if (high > 0)
+    {
+      /* Here we know low < count.  */
+      size_t index = low;
+      size_t position = low;
+      gl_list_node_t node;
+
+      if (position <= ((count - 1) / 2))
+        {
+          node = list->root.next;
+          for (; position > 0; position--)
+            node = node->next;
+        }
+      else
+        {
+          position = count - 1 - position;
+          node = list->root.prev;
+          for (; position > 0; position--)
+            node = node->prev;
+        }
+
+      do
+        {
+          int cmp = compar (node->value, elt);
+
+          if (cmp > 0)
+            break;
+          if (cmp == 0)
+            return index;
+          node = node->next;
+          index++;
+        }
+      while (--high > 0);
+    }
+  return (size_t)(-1);
+}
+
+static gl_list_node_t
+gl_linked_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar,
+                             const void *elt)
+{
+  gl_list_node_t node;
+
+  for (node = list->root.next; node != &list->root; node = node->next)
+    if (compar (node->value, elt) >= 0)
+      return gl_linked_nx_add_before (list, node, elt);
+  return gl_linked_nx_add_last (list, elt);
+}
+
+static bool
+gl_linked_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar,
+                             const void *elt)
+{
+  gl_list_node_t node;
+
+  for (node = list->root.next; node != &list->root; node = node->next)
+    {
+      int cmp = compar (node->value, elt);
+
+      if (cmp > 0)
+        break;
+      if (cmp == 0)
+        return gl_linked_remove_node (list, node);
+    }
+  return false;
+}
diff --git a/lib/gl_anyrbtree_list1.h b/lib/gl_anyrbtree_list1.h
new file mode 100644
index 0000000..3a28f13
--- /dev/null
+++ b/lib/gl_anyrbtree_list1.h
@@ -0,0 +1,76 @@
+/* Sequential list data type implemented by a binary tree.
+   Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Common code of gl_rbtree_list.c and gl_rbtreehash_list.c.  */
+
+/* A red-black tree is a binary tree where every node is colored black or
+   red such that
+   1. The root is black.
+   2. No red node has a red parent.
+      Or equivalently: No red node has a red child.
+   3. All paths from the root down to any NULL endpoint contain the same
+      number of black nodes.
+   Let's call this the "black-height" bh of the tree.  It follows that every
+   such path contains exactly bh black and between 0 and bh red nodes.  (The
+   extreme cases are a path containing only black nodes, and a path colored
+   alternately black-red-black-red-...-black-red.)  The height of the tree
+   therefore is >= bh, <= 2*bh.
+ */
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Color of a node.  */
+typedef enum color { BLACK, RED } color_t;
+
+/* Concrete list node implementation, valid for this file only.  */
+struct gl_list_node_impl
+{
+#if WITH_HASHTABLE
+  struct gl_hash_entry h;           /* hash table entry fields; must be first */
+#endif
+  struct gl_list_node_impl *left;   /* left branch, or NULL */
+  struct gl_list_node_impl *right;  /* right branch, or NULL */
+  /* Parent pointer, or NULL. The parent pointer is not needed for most
+     operations.  It is needed so that a gl_list_node_t can be returned
+     without memory allocation, on which the functions gl_list_remove_node,
+     gl_list_add_before, gl_list_add_after can be implemented.  */
+  struct gl_list_node_impl *parent;
+  color_t color;                    /* node's color */
+  size_t branch_size;               /* number of nodes in this branch,
+                                       = branchsize(left)+branchsize(right)+1 */
+  const void *value;
+};
+
+/* Concrete gl_list_impl type, valid for this file only.  */
+struct gl_list_impl
+{
+  struct gl_list_impl_base base;
+#if WITH_HASHTABLE
+  /* A hash table: managed as an array of collision lists.  */
+  struct gl_hash_entry **table;
+  size_t table_size;
+#endif
+  struct gl_list_node_impl *root;   /* root node or NULL */
+};
+
+/* A red-black tree of height h has a black-height bh >= ceil(h/2) and
+   therefore at least 2^ceil(h/2) - 1 elements.  So, h <= 116 (because a tree
+   of height h >= 117 would have at least 2^59 - 1 elements, and because even
+   on 64-bit machines,
+     sizeof (gl_list_node_impl) * (2^59 - 1) > 2^64
+   this would exceed the address space of the machine.  */
+#define MAXHEIGHT 116
diff --git a/lib/gl_anyrbtree_list2.h b/lib/gl_anyrbtree_list2.h
new file mode 100644
index 0000000..9677ab6
--- /dev/null
+++ b/lib/gl_anyrbtree_list2.h
@@ -0,0 +1,1028 @@
+/* Sequential list data type implemented by a binary tree.
+   Copyright (C) 2006-2007, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Common code of gl_rbtree_list.c and gl_rbtreehash_list.c.  */
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Creates a subtree for count >= 1 elements.
+   Its black-height bh is passed as argument, with
+   2^bh - 1 <= count <= 2^(bh+1) - 1.  bh == 0 implies count == 1.
+   Its height is h where 2^(h-1) <= count <= 2^h - 1.
+   Return NULL upon out-of-memory.  */
+static gl_list_node_t
+create_subtree_with_contents (unsigned int bh,
+                              size_t count, const void **contents)
+{
+  size_t half1 = (count - 1) / 2;
+  size_t half2 = count / 2;
+  /* Note: half1 + half2 = count - 1.  */
+  gl_list_node_t node =
+    (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+  if (node == NULL)
+    return NULL;
+
+  if (half1 > 0)
+    {
+      /* half1 > 0 implies count > 1, implies bh >= 1, implies
+           2^(bh-1) - 1 <= half1 <= 2^bh - 1.  */
+      node->left =
+        create_subtree_with_contents (bh - 1, half1, contents);
+      if (node->left == NULL)
+        goto fail1;
+      node->left->parent = node;
+    }
+  else
+    node->left = NULL;
+
+  node->value = contents[half1];
+
+  if (half2 > 0)
+    {
+      /* half2 > 0 implies count > 1, implies bh >= 1, implies
+           2^(bh-1) - 1 <= half2 <= 2^bh - 1.  */
+      node->right =
+       create_subtree_with_contents (bh - 1, half2, contents + half1 + 1);
+      if (node->right == NULL)
+        goto fail2;
+      node->right->parent = node;
+    }
+  else
+    node->right = NULL;
+
+  node->color = (bh == 0 ? RED : BLACK);
+
+  node->branch_size = count;
+
+  return node;
+
+ fail2:
+  if (node->left != NULL)
+    free_subtree (node->left);
+ fail1:
+  free (node);
+  return NULL;
+}
+
+static gl_list_t
+gl_tree_nx_create (gl_list_implementation_t implementation,
+                   gl_listelement_equals_fn equals_fn,
+                   gl_listelement_hashcode_fn hashcode_fn,
+                   gl_listelement_dispose_fn dispose_fn,
+                   bool allow_duplicates,
+                   size_t count, const void **contents)
+{
+  struct gl_list_impl *list =
+    (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+  if (list == NULL)
+    return NULL;
+
+  list->base.vtable = implementation;
+  list->base.equals_fn = equals_fn;
+  list->base.hashcode_fn = hashcode_fn;
+  list->base.dispose_fn = dispose_fn;
+  list->base.allow_duplicates = allow_duplicates;
+#if WITH_HASHTABLE
+  {
+    size_t estimate = xsum (count, count / 2); /* 1.5 * count */
+    if (estimate < 10)
+      estimate = 10;
+    list->table_size = next_prime (estimate);
+    if (size_overflow_p (xtimes (list->table_size, sizeof (gl_hash_entry_t))))
+      goto fail1;
+    list->table =
+      (gl_hash_entry_t *) calloc (list->table_size, sizeof (gl_hash_entry_t));
+    if (list->table == NULL)
+      goto fail1;
+  }
+#endif
+  if (count > 0)
+    {
+      /* Assuming 2^bh - 1 <= count <= 2^(bh+1) - 2, we create a tree whose
+         upper bh levels are black, and only the partially present lowest
+         level is red.  */
+      unsigned int bh;
+      {
+        size_t n;
+        for (n = count + 1, bh = 0; n > 1; n = n >> 1)
+          bh++;
+      }
+
+      list->root = create_subtree_with_contents (bh, count, contents);
+      if (list->root == NULL)
+        goto fail2;
+      list->root->parent = NULL;
+
+#if WITH_HASHTABLE
+      /* Now that the tree is built, node_position() works.  Now we can
+         add the nodes to the hash table.  */
+      if (add_nodes_to_buckets (list) < 0)
+        goto fail3;
+#endif
+    }
+  else
+    list->root = NULL;
+
+  return list;
+
+#if WITH_HASHTABLE
+ fail3:
+  free_subtree (list->root);
+#endif
+ fail2:
+#if WITH_HASHTABLE
+  free (list->table);
+ fail1:
+#endif
+  free (list);
+  return NULL;
+}
+
+/* Rotates left a subtree.
+
+                         B                         D
+                       /   \                     /   \
+                     A       D       -->       B       E
+                            / \               / \
+                           C   E             A   C
+
+   Changes the tree structure, updates the branch sizes.
+   The caller must update the colors and register D as child of its parent.  */
+static gl_list_node_t
+rotate_left (gl_list_node_t b_node, gl_list_node_t d_node)
+{
+  gl_list_node_t a_node = b_node->left;
+  gl_list_node_t c_node = d_node->left;
+  gl_list_node_t e_node = d_node->right;
+
+  b_node->right = c_node;
+  d_node->left = b_node;
+
+  d_node->parent = b_node->parent;
+  b_node->parent = d_node;
+  if (c_node != NULL)
+    c_node->parent = b_node;
+
+  b_node->branch_size =
+    (a_node != NULL ? a_node->branch_size : 0)
+    + 1 + (c_node != NULL ? c_node->branch_size : 0);
+  d_node->branch_size =
+    b_node->branch_size + 1 + (e_node != NULL ? e_node->branch_size : 0);
+
+  return d_node;
+}
+
+/* Rotates right a subtree.
+
+                           D                     B
+                         /   \                 /   \
+                       B       E     -->     A       D
+                      / \                           / \
+                     A   C                         C   E
+
+   Changes the tree structure, updates the branch sizes.
+   The caller must update the colors and register B as child of its parent.  */
+static gl_list_node_t
+rotate_right (gl_list_node_t b_node, gl_list_node_t d_node)
+{
+  gl_list_node_t a_node = b_node->left;
+  gl_list_node_t c_node = b_node->right;
+  gl_list_node_t e_node = d_node->right;
+
+  d_node->left = c_node;
+  b_node->right = d_node;
+
+  b_node->parent = d_node->parent;
+  d_node->parent = b_node;
+  if (c_node != NULL)
+    c_node->parent = d_node;
+
+  d_node->branch_size =
+    (c_node != NULL ? c_node->branch_size : 0)
+    + 1 + (e_node != NULL ? e_node->branch_size : 0);
+  b_node->branch_size =
+    (a_node != NULL ? a_node->branch_size : 0) + 1 + d_node->branch_size;
+
+  return b_node;
+}
+
+/* Ensures the tree is balanced, after an insertion operation.
+   Also assigns node->color.
+   parent is the given node's parent, known to be non-NULL.  */
+static void
+rebalance_after_add (gl_list_t list, gl_list_node_t node, gl_list_node_t parent)
+{
+  for (;;)
+    {
+      /* At this point, parent = node->parent != NULL.
+         Think of node->color being RED (although node->color is not yet
+         assigned.)  */
+      gl_list_node_t grandparent;
+      gl_list_node_t uncle;
+
+      if (parent->color == BLACK)
+        {
+          /* A RED color for node is acceptable.  */
+          node->color = RED;
+          return;
+        }
+
+      grandparent = parent->parent;
+      /* Since parent is RED, we know that
+         grandparent is != NULL and colored BLACK.  */
+
+      if (grandparent->left == parent)
+        uncle = grandparent->right;
+      else if (grandparent->right == parent)
+        uncle = grandparent->left;
+      else
+        abort ();
+
+      if (uncle != NULL && uncle->color == RED)
+        {
+          /* Change grandparent from BLACK to RED, and
+             change parent and uncle from RED to BLACK.
+             This makes it acceptable for node to be RED.  */
+          node->color = RED;
+          parent->color = uncle->color = BLACK;
+          node = grandparent;
+        }
+      else
+        {
+          /* grandparent and uncle are BLACK.  parent is RED.  node wants
+             to be RED too.
+             In this case, recoloring is not sufficient.  Need to perform
+             one or two rotations.  */
+          gl_list_node_t *grandparentp;
+
+          if (grandparent->parent == NULL)
+            grandparentp = &list->root;
+          else if (grandparent->parent->left == grandparent)
+            grandparentp = &grandparent->parent->left;
+          else if (grandparent->parent->right == grandparent)
+            grandparentp = &grandparent->parent->right;
+          else
+            abort ();
+
+          if (grandparent->left == parent)
+            {
+              if (parent->right == node)
+                {
+                  /* Rotation between node and parent.  */
+                  grandparent->left = rotate_left (parent, node);
+                  node = parent;
+                  parent = grandparent->left;
+                }
+              /* grandparent and uncle are BLACK.  parent and node want to be
+                 RED.  parent = grandparent->left.  node = parent->left.
+
+                      grandparent              parent
+                         bh+1                   bh+1
+                         /   \                 /   \
+                     parent  uncle    -->   node  grandparent
+                      bh      bh             bh      bh
+                      / \                           / \
+                   node  C                         C  uncle
+                    bh   bh                       bh    bh
+               */
+              *grandparentp = rotate_right (parent, grandparent);
+              parent->color = BLACK;
+              node->color = grandparent->color = RED;
+            }
+          else /* grandparent->right == parent */
+            {
+              if (parent->left == node)
+                {
+                  /* Rotation between node and parent.  */
+                  grandparent->right = rotate_right (node, parent);
+                  node = parent;
+                  parent = grandparent->right;
+                }
+              /* grandparent and uncle are BLACK.  parent and node want to be
+                 RED.  parent = grandparent->right.  node = parent->right.
+
+                    grandparent                    parent
+                       bh+1                         bh+1
+                       /   \                       /   \
+                   uncle  parent     -->   grandparent  node
+                     bh     bh                  bh       bh
+                            / \                 / \
+                           C  node          uncle  C
+                          bh   bh            bh    bh
+               */
+              *grandparentp = rotate_left (grandparent, parent);
+              parent->color = BLACK;
+              node->color = grandparent->color = RED;
+            }
+          return;
+        }
+
+      /* Start again with a new (node, parent) pair.  */
+      parent = node->parent;
+
+      if (parent == NULL)
+        {
+          /* Change node's color from RED to BLACK.  This increases the
+             tree's black-height.  */
+          node->color = BLACK;
+          return;
+        }
+    }
+}
+
+/* Ensures the tree is balanced, after a deletion operation.
+   CHILD was a grandchild of PARENT and is now its child.  Between them,
+   a black node was removed.  CHILD is also black, or NULL.
+   (CHILD can also be NULL.  But PARENT is non-NULL.)  */
+static void
+rebalance_after_remove (gl_list_t list, gl_list_node_t child, gl_list_node_t parent)
+{
+  for (;;)
+    {
+      /* At this point, we reduced the black-height of the CHILD subtree by 1.
+         To make up, either look for a possibility to turn a RED to a BLACK
+         node, or try to reduce the black-height tree of CHILD's sibling
+         subtree as well.  */
+      gl_list_node_t *parentp;
+
+      if (parent->parent == NULL)
+        parentp = &list->root;
+      else if (parent->parent->left == parent)
+        parentp = &parent->parent->left;
+      else if (parent->parent->right == parent)
+        parentp = &parent->parent->right;
+      else
+        abort ();
+
+      if (parent->left == child)
+        {
+          gl_list_node_t sibling = parent->right;
+          /* sibling's black-height is >= 1.  In particular,
+             sibling != NULL.
+
+                      parent
+                       /   \
+                   child  sibling
+                     bh    bh+1
+           */
+
+          if (sibling->color == RED)
+            {
+              /* sibling is RED, hence parent is BLACK and sibling's children
+                 are non-NULL and BLACK.
+
+                      parent                       sibling
+                       bh+2                         bh+2
+                       /   \                        /   \
+                   child  sibling     -->       parent    SR
+                     bh    bh+1                  bh+1    bh+1
+                            / \                  / \
+                          SL   SR            child  SL
+                         bh+1 bh+1             bh  bh+1
+               */
+              *parentp = rotate_left (parent, sibling);
+              parent->color = RED;
+              sibling->color = BLACK;
+
+              /* Concentrate on the subtree of parent.  The new sibling is
+                 one of the old sibling's children, and known to be BLACK.  */
+              parentp = &sibling->left;
+              sibling = parent->right;
+            }
+          /* Now we know that sibling is BLACK.
+
+                      parent
+                       /   \
+                   child  sibling
+                     bh    bh+1
+           */
+          if (sibling->right != NULL && sibling->right->color == RED)
+            {
+              /*
+                      parent                     sibling
+                     bh+1|bh+2                  bh+1|bh+2
+                       /   \                      /   \
+                   child  sibling    -->      parent    SR
+                     bh    bh+1                bh+1    bh+1
+                            / \                / \
+                          SL   SR           child  SL
+                          bh   bh             bh   bh
+               */
+              *parentp = rotate_left (parent, sibling);
+              sibling->color = parent->color;
+              parent->color = BLACK;
+              sibling->right->color = BLACK;
+              return;
+            }
+          else if (sibling->left != NULL && sibling->left->color == RED)
+            {
+              /*
+                      parent                   parent
+                     bh+1|bh+2                bh+1|bh+2
+                       /   \                    /   \
+                   child  sibling    -->    child    SL
+                     bh    bh+1               bh    bh+1
+                            / \                     /  \
+                          SL   SR                 SLL  sibling
+                          bh   bh                 bh     bh
+                         /  \                           /   \
+                       SLL  SLR                       SLR    SR
+                       bh    bh                       bh     bh
+
+                 where SLL, SLR, SR are all black.
+               */
+              parent->right = rotate_right (sibling->left, sibling);
+              /* Change sibling from BLACK to RED and SL from RED to BLACK.  */
+              sibling->color = RED;
+              sibling = parent->right;
+              sibling->color = BLACK;
+
+              /* Now do as in the previous case.  */
+              *parentp = rotate_left (parent, sibling);
+              sibling->color = parent->color;
+              parent->color = BLACK;
+              sibling->right->color = BLACK;
+              return;
+            }
+          else
+            {
+              if (parent->color == BLACK)
+                {
+                  /* Change sibling from BLACK to RED.  Then the entire
+                     subtree at parent has decreased its black-height.
+                              parent                   parent
+                               bh+2                     bh+1
+                               /   \                    /   \
+                           child  sibling    -->    child  sibling
+                             bh    bh+1               bh     bh
+                   */
+                  sibling->color = RED;
+
+                  child = parent;
+                }
+              else
+                {
+                  /* Change parent from RED to BLACK, but compensate by
+                     changing sibling from BLACK to RED.
+                              parent                   parent
+                               bh+1                     bh+1
+                               /   \                    /   \
+                           child  sibling    -->    child  sibling
+                             bh    bh+1               bh     bh
+                   */
+                  parent->color = BLACK;
+                  sibling->color = RED;
+                  return;
+                }
+            }
+        }
+      else if (parent->right == child)
+        {
+          gl_list_node_t sibling = parent->left;
+          /* sibling's black-height is >= 1.  In particular,
+             sibling != NULL.
+
+                      parent
+                       /   \
+                  sibling  child
+                    bh+1     bh
+           */
+
+          if (sibling->color == RED)
+            {
+              /* sibling is RED, hence parent is BLACK and sibling's children
+                 are non-NULL and BLACK.
+
+                      parent                 sibling
+                       bh+2                    bh+2
+                       /   \                  /   \
+                  sibling  child    -->     SR    parent
+                    bh+1     ch            bh+1    bh+1
+                    / \                            / \
+                  SL   SR                        SL  child
+                 bh+1 bh+1                      bh+1   bh
+               */
+              *parentp = rotate_right (sibling, parent);
+              parent->color = RED;
+              sibling->color = BLACK;
+
+              /* Concentrate on the subtree of parent.  The new sibling is
+                 one of the old sibling's children, and known to be BLACK.  */
+              parentp = &sibling->right;
+              sibling = parent->left;
+            }
+          /* Now we know that sibling is BLACK.
+
+                      parent
+                       /   \
+                  sibling  child
+                    bh+1     bh
+           */
+          if (sibling->left != NULL && sibling->left->color == RED)
+            {
+              /*
+                       parent                 sibling
+                      bh+1|bh+2              bh+1|bh+2
+                        /   \                  /   \
+                   sibling  child    -->     SL   parent
+                     bh+1     bh            bh+1   bh+1
+                     / \                           / \
+                   SL   SR                       SR  child
+                   bh   bh                       bh    bh
+               */
+              *parentp = rotate_right (sibling, parent);
+              sibling->color = parent->color;
+              parent->color = BLACK;
+              sibling->left->color = BLACK;
+              return;
+            }
+          else if (sibling->right != NULL && sibling->right->color == RED)
+            {
+              /*
+                      parent                       parent
+                     bh+1|bh+2                    bh+1|bh+2
+                       /   \                        /   \
+                   sibling  child    -->          SR    child
+                    bh+1      bh                 bh+1     bh
+                     / \                         /  \
+                   SL   SR                  sibling  SRR
+                   bh   bh                    bh      bh
+                       /  \                  /   \
+                     SRL  SRR               SL   SRL
+                     bh    bh               bh    bh
+
+                 where SL, SRL, SRR are all black.
+               */
+              parent->left = rotate_left (sibling, sibling->right);
+              /* Change sibling from BLACK to RED and SL from RED to BLACK.  */
+              sibling->color = RED;
+              sibling = parent->left;
+              sibling->color = BLACK;
+
+              /* Now do as in the previous case.  */
+              *parentp = rotate_right (sibling, parent);
+              sibling->color = parent->color;
+              parent->color = BLACK;
+              sibling->left->color = BLACK;
+              return;
+            }
+          else
+            {
+              if (parent->color == BLACK)
+                {
+                  /* Change sibling from BLACK to RED.  Then the entire
+                     subtree at parent has decreased its black-height.
+                              parent                   parent
+                               bh+2                     bh+1
+                               /   \                    /   \
+                           sibling  child    -->    sibling  child
+                            bh+1      bh              bh       bh
+                   */
+                  sibling->color = RED;
+
+                  child = parent;
+                }
+              else
+                {
+                  /* Change parent from RED to BLACK, but compensate by
+                     changing sibling from BLACK to RED.
+                              parent                   parent
+                               bh+1                     bh+1
+                               /   \                    /   \
+                           sibling  child    -->    sibling  child
+                            bh+1      bh              bh       bh
+                   */
+                  parent->color = BLACK;
+                  sibling->color = RED;
+                  return;
+                }
+            }
+        }
+      else
+        abort ();
+
+      /* Start again with a new (child, parent) pair.  */
+      parent = child->parent;
+
+#if 0 /* Already handled.  */
+      if (child != NULL && child->color == RED)
+        {
+          child->color = BLACK;
+          return;
+        }
+#endif
+
+      if (parent == NULL)
+        return;
+    }
+}
+
+static void
+gl_tree_remove_node_from_tree (gl_list_t list, gl_list_node_t node)
+{
+  gl_list_node_t parent = node->parent;
+
+  if (node->left == NULL)
+    {
+      /* Replace node with node->right.  */
+      gl_list_node_t child = node->right;
+
+      if (child != NULL)
+        {
+          child->parent = parent;
+          /* Since node->left == NULL, child must be RED and of height 1,
+             hence node must have been BLACK.  Recolor the child.  */
+          child->color = BLACK;
+        }
+      if (parent == NULL)
+        list->root = child;
+      else
+        {
+          if (parent->left == node)
+            parent->left = child;
+          else /* parent->right == node */
+            parent->right = child;
+
+          /* Update branch_size fields of the parent nodes.  */
+          {
+            gl_list_node_t p;
+
+            for (p = parent; p != NULL; p = p->parent)
+              p->branch_size--;
+          }
+
+          if (child == NULL && node->color == BLACK)
+            rebalance_after_remove (list, child, parent);
+        }
+    }
+  else if (node->right == NULL)
+    {
+      /* It is not absolutely necessary to treat this case.  But the more
+         general case below is more complicated, hence slower.  */
+      /* Replace node with node->left.  */
+      gl_list_node_t child = node->left;
+
+      child->parent = parent;
+      /* Since node->right == NULL, child must be RED and of height 1,
+         hence node must have been BLACK.  Recolor the child.  */
+      child->color = BLACK;
+      if (parent == NULL)
+        list->root = child;
+      else
+        {
+          if (parent->left == node)
+            parent->left = child;
+          else /* parent->right == node */
+            parent->right = child;
+
+          /* Update branch_size fields of the parent nodes.  */
+          {
+            gl_list_node_t p;
+
+            for (p = parent; p != NULL; p = p->parent)
+              p->branch_size--;
+          }
+        }
+    }
+  else
+    {
+      /* Replace node with the rightmost element of the node->left subtree.  */
+      gl_list_node_t subst;
+      gl_list_node_t subst_parent;
+      gl_list_node_t child;
+      color_t removed_color;
+
+      for (subst = node->left; subst->right != NULL; )
+        subst = subst->right;
+
+      subst_parent = subst->parent;
+
+      child = subst->left;
+
+      removed_color = subst->color;
+
+      /* The case subst_parent == node is special:  If we do nothing special,
+         we get confusion about node->left, subst->left and child->parent.
+           subst_parent == node
+           <==> The 'for' loop above terminated immediately.
+           <==> subst == subst_parent->left
+                [otherwise subst == subst_parent->right]
+         In this case, we would need to first set
+           child->parent = node; node->left = child;
+         and later - when we copy subst into node's position - again
+           child->parent = subst; subst->left = child;
+         Altogether a no-op.  */
+      if (subst_parent != node)
+        {
+          if (child != NULL)
+            child->parent = subst_parent;
+          subst_parent->right = child;
+        }
+
+      /* Update branch_size fields of the parent nodes.  */
+      {
+        gl_list_node_t p;
+
+        for (p = subst_parent; p != NULL; p = p->parent)
+          p->branch_size--;
+      }
+
+      /* Copy subst into node's position.
+         (This is safer than to copy subst's value into node, keep node in
+         place, and free subst.)  */
+      if (subst_parent != node)
+        {
+          subst->left = node->left;
+          subst->left->parent = subst;
+        }
+      subst->right = node->right;
+      subst->right->parent = subst;
+      subst->color = node->color;
+      subst->branch_size = node->branch_size;
+      subst->parent = parent;
+      if (parent == NULL)
+        list->root = subst;
+      else if (parent->left == node)
+        parent->left = subst;
+      else /* parent->right == node */
+        parent->right = subst;
+
+      if (removed_color == BLACK)
+        {
+          if (child != NULL && child->color == RED)
+            /* Recolor the child.  */
+            child->color = BLACK;
+          else
+            /* Rebalancing starts at child's parent, that is subst_parent -
+               except when subst_parent == node.  In this case, we need to use
+               its replacement, subst.  */
+            rebalance_after_remove (list, child,
+                                    subst_parent != node ? subst_parent : subst);
+        }
+    }
+}
+
+static gl_list_node_t
+gl_tree_nx_add_first (gl_list_t list, const void *elt)
+{
+  /* Create new node.  */
+  gl_list_node_t new_node =
+    (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+  if (new_node == NULL)
+    return NULL;
+
+  new_node->left = NULL;
+  new_node->right = NULL;
+  new_node->branch_size = 1;
+  new_node->value = elt;
+#if WITH_HASHTABLE
+  new_node->h.hashcode =
+    (list->base.hashcode_fn != NULL
+     ? list->base.hashcode_fn (new_node->value)
+     : (size_t)(uintptr_t) new_node->value);
+#endif
+
+  /* Add it to the tree.  */
+  if (list->root == NULL)
+    {
+      new_node->color = BLACK;
+      list->root = new_node;
+      new_node->parent = NULL;
+    }
+  else
+    {
+      gl_list_node_t node;
+
+      for (node = list->root; node->left != NULL; )
+        node = node->left;
+
+      node->left = new_node;
+      new_node->parent = node;
+
+      /* Update branch_size fields of the parent nodes.  */
+      {
+        gl_list_node_t p;
+
+        for (p = node; p != NULL; p = p->parent)
+          p->branch_size++;
+      }
+
+      /* Color and rebalance.  */
+      rebalance_after_add (list, new_node, node);
+    }
+
+#if WITH_HASHTABLE
+  /* Add node to the hash table.
+     Note that this is only possible _after_ the node has been added to the
+     tree structure, because add_to_bucket() uses node_position().  */
+  if (add_to_bucket (list, new_node) < 0)
+    {
+      gl_tree_remove_node_from_tree (list, new_node);
+      free (new_node);
+      return NULL;
+    }
+  hash_resize_after_add (list);
+#endif
+
+  return new_node;
+}
+
+static gl_list_node_t
+gl_tree_nx_add_last (gl_list_t list, const void *elt)
+{
+  /* Create new node.  */
+  gl_list_node_t new_node =
+    (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+  if (new_node == NULL)
+    return NULL;
+
+  new_node->left = NULL;
+  new_node->right = NULL;
+  new_node->branch_size = 1;
+  new_node->value = elt;
+#if WITH_HASHTABLE
+  new_node->h.hashcode =
+    (list->base.hashcode_fn != NULL
+     ? list->base.hashcode_fn (new_node->value)
+     : (size_t)(uintptr_t) new_node->value);
+#endif
+
+  /* Add it to the tree.  */
+  if (list->root == NULL)
+    {
+      new_node->color = BLACK;
+      list->root = new_node;
+      new_node->parent = NULL;
+    }
+  else
+    {
+      gl_list_node_t node;
+
+      for (node = list->root; node->right != NULL; )
+        node = node->right;
+
+      node->right = new_node;
+      new_node->parent = node;
+
+      /* Update branch_size fields of the parent nodes.  */
+      {
+        gl_list_node_t p;
+
+        for (p = node; p != NULL; p = p->parent)
+          p->branch_size++;
+      }
+
+      /* Color and rebalance.  */
+      rebalance_after_add (list, new_node, node);
+    }
+
+#if WITH_HASHTABLE
+  /* Add node to the hash table.
+     Note that this is only possible _after_ the node has been added to the
+     tree structure, because add_to_bucket() uses node_position().  */
+  if (add_to_bucket (list, new_node) < 0)
+    {
+      gl_tree_remove_node_from_tree (list, new_node);
+      free (new_node);
+      return NULL;
+    }
+  hash_resize_after_add (list);
+#endif
+
+  return new_node;
+}
+
+static gl_list_node_t
+gl_tree_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+  /* Create new node.  */
+  gl_list_node_t new_node =
+    (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+  if (new_node == NULL)
+    return NULL;
+
+  new_node->left = NULL;
+  new_node->right = NULL;
+  new_node->branch_size = 1;
+  new_node->value = elt;
+#if WITH_HASHTABLE
+  new_node->h.hashcode =
+    (list->base.hashcode_fn != NULL
+     ? list->base.hashcode_fn (new_node->value)
+     : (size_t)(uintptr_t) new_node->value);
+#endif
+
+  /* Add it to the tree.  */
+  if (node->left == NULL)
+    node->left = new_node;
+  else
+    {
+      for (node = node->left; node->right != NULL; )
+        node = node->right;
+      node->right = new_node;
+    }
+  new_node->parent = node;
+
+  /* Update branch_size fields of the parent nodes.  */
+  {
+    gl_list_node_t p;
+
+    for (p = node; p != NULL; p = p->parent)
+      p->branch_size++;
+  }
+
+  /* Color and rebalance.  */
+  rebalance_after_add (list, new_node, node);
+
+#if WITH_HASHTABLE
+  /* Add node to the hash table.
+     Note that this is only possible _after_ the node has been added to the
+     tree structure, because add_to_bucket() uses node_position().  */
+  if (add_to_bucket (list, new_node) < 0)
+    {
+      gl_tree_remove_node_from_tree (list, new_node);
+      free (new_node);
+      return NULL;
+    }
+  hash_resize_after_add (list);
+#endif
+
+  return new_node;
+}
+
+static gl_list_node_t
+gl_tree_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+  /* Create new node.  */
+  gl_list_node_t new_node =
+    (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+  if (new_node == NULL)
+    return NULL;
+
+  new_node->left = NULL;
+  new_node->right = NULL;
+  new_node->branch_size = 1;
+  new_node->value = elt;
+#if WITH_HASHTABLE
+  new_node->h.hashcode =
+    (list->base.hashcode_fn != NULL
+     ? list->base.hashcode_fn (new_node->value)
+     : (size_t)(uintptr_t) new_node->value);
+#endif
+
+  /* Add it to the tree.  */
+  if (node->right == NULL)
+    node->right = new_node;
+  else
+    {
+      for (node = node->right; node->left != NULL; )
+        node = node->left;
+      node->left = new_node;
+    }
+  new_node->parent = node;
+
+  /* Update branch_size fields of the parent nodes.  */
+  {
+    gl_list_node_t p;
+
+    for (p = node; p != NULL; p = p->parent)
+      p->branch_size++;
+  }
+
+  /* Color and rebalance.  */
+  rebalance_after_add (list, new_node, node);
+
+#if WITH_HASHTABLE
+  /* Add node to the hash table.
+     Note that this is only possible _after_ the node has been added to the
+     tree structure, because add_to_bucket() uses node_position().  */
+  if (add_to_bucket (list, new_node) < 0)
+    {
+      gl_tree_remove_node_from_tree (list, new_node);
+      free (new_node);
+      return NULL;
+    }
+  hash_resize_after_add (list);
+#endif
+
+  return new_node;
+}
diff --git a/lib/gl_anytree_list1.h b/lib/gl_anytree_list1.h
new file mode 100644
index 0000000..f111256
--- /dev/null
+++ b/lib/gl_anytree_list1.h
@@ -0,0 +1,41 @@
+/* Sequential list data type implemented by a binary tree.
+   Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Common code of gl_avltree_list.c, gl_rbtree_list.c,
+                  gl_avltreehash_list.c, gl_rbtreehash_list.c.  */
+
+/* An item on the stack used for iterating across the elements.  */
+typedef struct
+{
+  gl_list_node_t node;
+  size_t rightp;
+} iterstack_item_t;
+
+/* A stack used for iterating across the elements.  */
+typedef iterstack_item_t iterstack_t[MAXHEIGHT];
+
+/* Frees a non-empty subtree recursively.
+   This function is recursive and therefore not very fast.  */
+static void
+free_subtree (gl_list_node_t node)
+{
+  if (node->left != NULL)
+    free_subtree (node->left);
+  if (node->right != NULL)
+    free_subtree (node->right);
+  free (node);
+}
diff --git a/lib/gl_anytree_list2.h b/lib/gl_anytree_list2.h
new file mode 100644
index 0000000..536fc30
--- /dev/null
+++ b/lib/gl_anytree_list2.h
@@ -0,0 +1,970 @@
+/* Sequential list data type implemented by a binary tree.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Common code of gl_avltree_list.c, gl_rbtree_list.c,
+                  gl_avltreehash_list.c, gl_rbtreehash_list.c.  */
+
+static gl_list_t
+gl_tree_nx_create_empty (gl_list_implementation_t implementation,
+                         gl_listelement_equals_fn equals_fn,
+                         gl_listelement_hashcode_fn hashcode_fn,
+                         gl_listelement_dispose_fn dispose_fn,
+                         bool allow_duplicates)
+{
+  struct gl_list_impl *list = (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+  if (list == NULL)
+    return NULL;
+
+  list->base.vtable = implementation;
+  list->base.equals_fn = equals_fn;
+  list->base.hashcode_fn = hashcode_fn;
+  list->base.dispose_fn = dispose_fn;
+  list->base.allow_duplicates = allow_duplicates;
+#if WITH_HASHTABLE
+  list->table_size = 11;
+  list->table =
+    (gl_hash_entry_t *) calloc (list->table_size, sizeof (gl_hash_entry_t));
+  if (list->table == NULL)
+    goto fail;
+#endif
+  list->root = NULL;
+
+  return list;
+
+#if WITH_HASHTABLE
+ fail:
+  free (list);
+  return NULL;
+#endif
+}
+
+static size_t _GL_ATTRIBUTE_PURE
+gl_tree_size (gl_list_t list)
+{
+  return (list->root != NULL ? list->root->branch_size : 0);
+}
+
+static const void * _GL_ATTRIBUTE_PURE
+gl_tree_node_value (_GL_ATTRIBUTE_MAYBE_UNUSED gl_list_t list,
+                    gl_list_node_t node)
+{
+  return node->value;
+}
+
+static int
+gl_tree_node_nx_set_value (_GL_ATTRIBUTE_MAYBE_UNUSED gl_list_t list,
+                           gl_list_node_t node, const void *elt)
+{
+#if WITH_HASHTABLE
+  if (elt != node->value)
+    {
+      size_t new_hashcode =
+        (list->base.hashcode_fn != NULL
+         ? list->base.hashcode_fn (elt)
+         : (size_t)(uintptr_t) elt);
+
+      if (new_hashcode != node->h.hashcode)
+        {
+          remove_from_bucket (list, node);
+          node->value = elt;
+          node->h.hashcode = new_hashcode;
+          if (add_to_bucket (list, node) < 0)
+            {
+              /* Out of memory.  We removed node from a bucket but cannot add
+                 it to another bucket.  In order to avoid inconsistencies, we
+                 must remove node entirely from the list.  */
+              gl_tree_remove_node_from_tree (list, node);
+              free (node);
+              return -1;
+            }
+        }
+      else
+        node->value = elt;
+    }
+#else
+  node->value = elt;
+#endif
+  return 0;
+}
+
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+gl_tree_next_node (_GL_ATTRIBUTE_MAYBE_UNUSED gl_list_t list,
+                   gl_list_node_t node)
+{
+  if (node->right != NULL)
+    {
+      node = node->right;
+      while (node->left != NULL)
+        node = node->left;
+    }
+  else
+    {
+      while (node->parent != NULL && node->parent->right == node)
+        node = node->parent;
+      node = node->parent;
+    }
+  return node;
+}
+
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+gl_tree_previous_node (_GL_ATTRIBUTE_MAYBE_UNUSED gl_list_t list,
+                       gl_list_node_t node)
+{
+  if (node->left != NULL)
+    {
+      node = node->left;
+      while (node->right != NULL)
+        node = node->right;
+    }
+  else
+    {
+      while (node->parent != NULL && node->parent->left == node)
+        node = node->parent;
+      node = node->parent;
+    }
+  return node;
+}
+
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+gl_tree_first_node (_GL_ATTRIBUTE_MAYBE_UNUSED gl_list_t list)
+{
+  gl_list_node_t node = list->root;
+
+  if (node != NULL)
+    {
+      while (node->left != NULL)
+        node = node->left;
+    }
+  return node;
+}
+
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+gl_tree_last_node (_GL_ATTRIBUTE_MAYBE_UNUSED gl_list_t list)
+{
+  gl_list_node_t node = list->root;
+
+  if (node != NULL)
+    {
+      while (node->right != NULL)
+        node = node->right;
+    }
+  return node;
+}
+
+/* Returns the node at the given position < gl_tree_size (list).  */
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+node_at (gl_list_node_t root, size_t position)
+{
+  /* Here we know that root != NULL.  */
+  gl_list_node_t node = root;
+
+  for (;;)
+    {
+      if (node->left != NULL)
+        {
+          if (position < node->left->branch_size)
+            {
+              node = node->left;
+              continue;
+            }
+          position -= node->left->branch_size;
+        }
+      if (position == 0)
+        break;
+      position--;
+      node = node->right;
+    }
+  return node;
+}
+
+static const void * _GL_ATTRIBUTE_PURE
+gl_tree_get_at (gl_list_t list, size_t position)
+{
+  gl_list_node_t node = list->root;
+
+  if (!(node != NULL && position < node->branch_size))
+    /* Invalid argument.  */
+    abort ();
+  node = node_at (node, position);
+  return node->value;
+}
+
+static gl_list_node_t
+gl_tree_nx_set_at (gl_list_t list, size_t position, const void *elt)
+{
+  gl_list_node_t node = list->root;
+
+  if (!(node != NULL && position < node->branch_size))
+    /* Invalid argument.  */
+    abort ();
+  node = node_at (node, position);
+#if WITH_HASHTABLE
+  if (elt != node->value)
+    {
+      size_t new_hashcode =
+        (list->base.hashcode_fn != NULL
+         ? list->base.hashcode_fn (elt)
+         : (size_t)(uintptr_t) elt);
+
+      if (new_hashcode != node->h.hashcode)
+        {
+          remove_from_bucket (list, node);
+          node->value = elt;
+          node->h.hashcode = new_hashcode;
+          if (add_to_bucket (list, node) < 0)
+            {
+              /* Out of memory.  We removed node from a bucket but cannot add
+                 it to another bucket.  In order to avoid inconsistencies, we
+                 must remove node entirely from the list.  */
+              gl_tree_remove_node_from_tree (list, node);
+              free (node);
+              return NULL;
+            }
+        }
+      else
+        node->value = elt;
+    }
+#else
+  node->value = elt;
+#endif
+  return node;
+}
+
+#if !WITH_HASHTABLE
+
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+gl_tree_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+                        const void *elt)
+{
+  if (!(start_index <= end_index
+        && end_index <= (list->root != NULL ? list->root->branch_size : 0)))
+    /* Invalid arguments.  */
+    abort ();
+  {
+    gl_listelement_equals_fn equals = list->base.equals_fn;
+    /* Iterate across all elements.  */
+    gl_list_node_t node = list->root;
+    iterstack_t stack;
+    iterstack_item_t *stack_ptr = &stack[0];
+    size_t index = 0;
+
+    if (start_index == 0)
+      {
+        /* Consider all elements.  */
+        for (;;)
+          {
+            /* Descend on left branch.  */
+            for (;;)
+              {
+                if (node == NULL)
+                  break;
+                stack_ptr->node = node;
+                stack_ptr->rightp = 0;
+                node = node->left;
+                stack_ptr++;
+              }
+            /* Climb up again.  */
+            for (;;)
+              {
+                if (stack_ptr == &stack[0])
+                  return NULL;
+                stack_ptr--;
+                if (!stack_ptr->rightp)
+                  break;
+              }
+            node = stack_ptr->node;
+            /* Test against current element.  */
+            if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+              return node;
+            index++;
+            if (index >= end_index)
+              return NULL;
+            /* Descend on right branch.  */
+            stack_ptr->rightp = 1;
+            node = node->right;
+            stack_ptr++;
+          }
+      }
+    else
+      {
+        /* Consider only elements at indices >= start_index.
+           In this case, rightp contains the difference between the start_index
+           for the parent node and the one for the child node (0 when the child
+           node is the parent's left child, > 0 when the child is the parent's
+           right child).  */
+        for (;;)
+          {
+            /* Descend on left branch.  */
+            for (;;)
+              {
+                if (node == NULL)
+                  break;
+                if (node->branch_size <= start_index)
+                  break;
+                stack_ptr->node = node;
+                stack_ptr->rightp = 0;
+                node = node->left;
+                stack_ptr++;
+              }
+            /* Climb up again.  */
+            for (;;)
+              {
+                if (stack_ptr == &stack[0])
+                  return NULL;
+                stack_ptr--;
+                if (!stack_ptr->rightp)
+                  break;
+                start_index += stack_ptr->rightp;
+              }
+            node = stack_ptr->node;
+            {
+              size_t left_branch_size1 =
+                (node->left != NULL ? node->left->branch_size : 0) + 1;
+              if (start_index < left_branch_size1)
+                {
+                  /* Test against current element.  */
+                  if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+                    return node;
+                  /* Now that we have considered all indices < left_branch_size1,
+                     we can increment start_index.  */
+                  start_index = left_branch_size1;
+                }
+              index++;
+              if (index >= end_index)
+                return NULL;
+              /* Descend on right branch.  */
+              start_index -= left_branch_size1;
+              stack_ptr->rightp = left_branch_size1;
+            }
+            node = node->right;
+            stack_ptr++;
+          }
+      }
+  }
+}
+
+static size_t _GL_ATTRIBUTE_PURE
+gl_tree_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index,
+                         const void *elt)
+{
+  if (!(start_index <= end_index
+        && end_index <= (list->root != NULL ? list->root->branch_size : 0)))
+    /* Invalid arguments.  */
+    abort ();
+  {
+    gl_listelement_equals_fn equals = list->base.equals_fn;
+    /* Iterate across all elements.  */
+    gl_list_node_t node = list->root;
+    iterstack_t stack;
+    iterstack_item_t *stack_ptr = &stack[0];
+    size_t index = 0;
+
+    if (start_index == 0)
+      {
+        /* Consider all elements.  */
+        for (;;)
+          {
+            /* Descend on left branch.  */
+            for (;;)
+              {
+                if (node == NULL)
+                  break;
+                stack_ptr->node = node;
+                stack_ptr->rightp = 0;
+                node = node->left;
+                stack_ptr++;
+              }
+            /* Climb up again.  */
+            for (;;)
+              {
+                if (stack_ptr == &stack[0])
+                  return (size_t)(-1);
+                stack_ptr--;
+                if (!stack_ptr->rightp)
+                  break;
+              }
+            node = stack_ptr->node;
+            /* Test against current element.  */
+            if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+              return index;
+            index++;
+            if (index >= end_index)
+              return (size_t)(-1);
+            /* Descend on right branch.  */
+            stack_ptr->rightp = 1;
+            node = node->right;
+            stack_ptr++;
+          }
+      }
+    else
+      {
+        /* Consider only elements at indices >= start_index.
+           In this case, rightp contains the difference between the start_index
+           for the parent node and the one for the child node (0 when the child
+           node is the parent's left child, > 0 when the child is the parent's
+           right child).  */
+        for (;;)
+          {
+            /* Descend on left branch.  */
+            for (;;)
+              {
+                if (node == NULL)
+                  break;
+                if (node->branch_size <= start_index)
+                  break;
+                stack_ptr->node = node;
+                stack_ptr->rightp = 0;
+                node = node->left;
+                stack_ptr++;
+              }
+            /* Climb up again.  */
+            for (;;)
+              {
+                if (stack_ptr == &stack[0])
+                  return (size_t)(-1);
+                stack_ptr--;
+                if (!stack_ptr->rightp)
+                  break;
+                start_index += stack_ptr->rightp;
+              }
+            node = stack_ptr->node;
+            {
+              size_t left_branch_size1 =
+                (node->left != NULL ? node->left->branch_size : 0) + 1;
+              if (start_index < left_branch_size1)
+                {
+                  /* Test against current element.  */
+                  if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+                    return index;
+                  /* Now that we have considered all indices < left_branch_size1,
+                     we can increment start_index.  */
+                  start_index = left_branch_size1;
+                }
+              index++;
+              if (index >= end_index)
+                return (size_t)(-1);
+              /* Descend on right branch.  */
+              start_index -= left_branch_size1;
+              stack_ptr->rightp = left_branch_size1;
+            }
+            node = node->right;
+            stack_ptr++;
+          }
+      }
+  }
+}
+
+#endif
+
+static gl_list_node_t
+gl_tree_nx_add_at (gl_list_t list, size_t position, const void *elt)
+{
+  size_t count = (list->root != NULL ? list->root->branch_size : 0);
+
+  if (!(position <= count))
+    /* Invalid argument.  */
+    abort ();
+  if (position == count)
+    return gl_tree_nx_add_last (list, elt);
+  else
+    return gl_tree_nx_add_before (list, node_at (list->root, position), elt);
+}
+
+static bool
+gl_tree_remove_node (gl_list_t list, gl_list_node_t node)
+{
+#if WITH_HASHTABLE
+  /* Remove node from the hash table.
+     Note that this is only possible _before_ the node is removed from the
+     tree structure, because remove_from_bucket() uses node_position().  */
+  remove_from_bucket (list, node);
+#endif
+
+  gl_tree_remove_node_from_tree (list, node);
+
+  if (list->base.dispose_fn != NULL)
+    list->base.dispose_fn (node->value);
+  free (node);
+  return true;
+}
+
+static bool
+gl_tree_remove_at (gl_list_t list, size_t position)
+{
+  gl_list_node_t node = list->root;
+
+  if (!(node != NULL && position < node->branch_size))
+    /* Invalid argument.  */
+    abort ();
+  node = node_at (node, position);
+  return gl_tree_remove_node (list, node);
+}
+
+static bool
+gl_tree_remove (gl_list_t list, const void *elt)
+{
+  if (list->root != NULL)
+    {
+      gl_list_node_t node =
+        gl_tree_search_from_to (list, 0, list->root->branch_size, elt);
+
+      if (node != NULL)
+        return gl_tree_remove_node (list, node);
+    }
+  return false;
+}
+
+#if !WITH_HASHTABLE
+
+static void
+gl_tree_list_free (gl_list_t list)
+{
+  /* Iterate across all elements in post-order.  */
+  gl_list_node_t node = list->root;
+  iterstack_t stack;
+  iterstack_item_t *stack_ptr = &stack[0];
+
+  for (;;)
+    {
+      /* Descend on left branch.  */
+      for (;;)
+        {
+          if (node == NULL)
+            break;
+          stack_ptr->node = node;
+          stack_ptr->rightp = false;
+          node = node->left;
+          stack_ptr++;
+        }
+      /* Climb up again.  */
+      for (;;)
+        {
+          if (stack_ptr == &stack[0])
+            goto done_iterate;
+          stack_ptr--;
+          node = stack_ptr->node;
+          if (!stack_ptr->rightp)
+            break;
+          /* Free the current node.  */
+          if (list->base.dispose_fn != NULL)
+            list->base.dispose_fn (node->value);
+          free (node);
+        }
+      /* Descend on right branch.  */
+      stack_ptr->rightp = true;
+      node = node->right;
+      stack_ptr++;
+    }
+ done_iterate:
+  free (list);
+}
+
+#endif
+
+/* --------------------- gl_list_iterator_t Data Type --------------------- */
+
+static gl_list_iterator_t _GL_ATTRIBUTE_PURE
+gl_tree_iterator (gl_list_t list)
+{
+  gl_list_iterator_t result;
+  gl_list_node_t node;
+
+  result.vtable = list->base.vtable;
+  result.list = list;
+  /* Start node is the leftmost node.  */
+  node = list->root;
+  if (node != NULL)
+    while (node->left != NULL)
+      node = node->left;
+  result.p = node;
+  /* End point is past the rightmost node.  */
+  result.q = NULL;
+#if defined GCC_LINT || defined lint
+  result.i = 0;
+  result.j = 0;
+  result.count = 0;
+#endif
+
+  return result;
+}
+
+static gl_list_iterator_t _GL_ATTRIBUTE_PURE
+gl_tree_iterator_from_to (gl_list_t list, size_t start_index, size_t end_index)
+{
+  size_t count = (list->root != NULL ? list->root->branch_size : 0);
+  gl_list_iterator_t result;
+
+  if (!(start_index <= end_index && end_index <= count))
+    /* Invalid arguments.  */
+    abort ();
+  result.vtable = list->base.vtable;
+  result.list = list;
+  /* Start node is the node at position start_index.  */
+  result.p = (start_index < count ? node_at (list->root, start_index) : NULL);
+  /* End point is the node at position end_index.  */
+  result.q = (end_index < count ? node_at (list->root, end_index) : NULL);
+#if defined GCC_LINT || defined lint
+  result.i = 0;
+  result.j = 0;
+  result.count = 0;
+#endif
+
+  return result;
+}
+
+static bool
+gl_tree_iterator_next (gl_list_iterator_t *iterator,
+                       const void **eltp, gl_list_node_t *nodep)
+{
+  if (iterator->p != iterator->q)
+    {
+      gl_list_node_t node = (gl_list_node_t) iterator->p;
+      *eltp = node->value;
+      if (nodep != NULL)
+        *nodep = node;
+      /* Advance to the next node.  */
+      if (node->right != NULL)
+        {
+          node = node->right;
+          while (node->left != NULL)
+            node = node->left;
+        }
+      else
+        {
+          while (node->parent != NULL && node->parent->right == node)
+            node = node->parent;
+          node = node->parent;
+        }
+      iterator->p = node;
+      return true;
+    }
+  else
+    return false;
+}
+
+static void
+gl_tree_iterator_free (_GL_ATTRIBUTE_MAYBE_UNUSED gl_list_iterator_t *iterator)
+{
+}
+
+/* ---------------------- Sorted gl_list_t Data Type ---------------------- */
+
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+gl_tree_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar,
+                           const void *elt)
+{
+  gl_list_node_t node;
+
+  for (node = list->root; node != NULL; )
+    {
+      int cmp = compar (node->value, elt);
+
+      if (cmp < 0)
+        node = node->right;
+      else if (cmp > 0)
+        node = node->left;
+      else /* cmp == 0 */
+        {
+          /* We have an element equal to ELT.  But we need the leftmost such
+             element.  */
+          gl_list_node_t found = node;
+          node = node->left;
+          for (; node != NULL; )
+            {
+              int cmp2 = compar (node->value, elt);
+
+              if (cmp2 < 0)
+                node = node->right;
+              else if (cmp2 > 0)
+                /* The list was not sorted.  */
+                abort ();
+              else /* cmp2 == 0 */
+                {
+                  found = node;
+                  node = node->left;
+                }
+            }
+          return found;
+        }
+    }
+  return NULL;
+}
+
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+gl_tree_sortedlist_search_from_to (gl_list_t list,
+                                   gl_listelement_compar_fn compar,
+                                   size_t low, size_t high,
+                                   const void *elt)
+{
+  gl_list_node_t node;
+
+  if (!(low <= high
+        && high <= (list->root != NULL ? list->root->branch_size : 0)))
+    /* Invalid arguments.  */
+    abort ();
+
+  for (node = list->root; node != NULL; )
+    {
+      size_t left_branch_size =
+        (node->left != NULL ? node->left->branch_size : 0);
+
+      if (low > left_branch_size)
+        {
+          low -= left_branch_size + 1;
+          high -= left_branch_size + 1;
+          node = node->right;
+        }
+      else if (high <= left_branch_size)
+        node = node->left;
+      else
+        {
+          /* Here low <= left_branch_size < high.  */
+          int cmp = compar (node->value, elt);
+
+          if (cmp < 0)
+            {
+              low = 0;
+              high -= left_branch_size + 1;
+              node = node->right;
+            }
+          else if (cmp > 0)
+            node = node->left;
+          else /* cmp == 0 */
+            {
+              /* We have an element equal to ELT.  But we need the leftmost
+                 such element.  */
+              gl_list_node_t found = node;
+              node = node->left;
+              for (; node != NULL; )
+                {
+                  size_t left_branch_size2 =
+                    (node->left != NULL ? node->left->branch_size : 0);
+
+                  if (low > left_branch_size2)
+                    {
+                      low -= left_branch_size2 + 1;
+                      node = node->right;
+                    }
+                  else
+                    {
+                      /* Here low <= left_branch_size2.  */
+                      int cmp2 = compar (node->value, elt);
+
+                      if (cmp2 < 0)
+                        {
+                          low = 0;
+                          node = node->right;
+                        }
+                      else if (cmp2 > 0)
+                        /* The list was not sorted.  */
+                        abort ();
+                      else /* cmp2 == 0 */
+                        {
+                          found = node;
+                          node = node->left;
+                        }
+                    }
+                }
+              return found;
+            }
+        }
+    }
+  return NULL;
+}
+
+static size_t _GL_ATTRIBUTE_PURE
+gl_tree_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar,
+                            const void *elt)
+{
+  gl_list_node_t node;
+  size_t position;
+
+  for (node = list->root, position = 0; node != NULL; )
+    {
+      int cmp = compar (node->value, elt);
+
+      if (cmp < 0)
+        {
+          if (node->left != NULL)
+            position += node->left->branch_size;
+          position++;
+          node = node->right;
+        }
+      else if (cmp > 0)
+        node = node->left;
+      else /* cmp == 0 */
+        {
+          /* We have an element equal to ELT.  But we need the leftmost such
+             element.  */
+          size_t found_position =
+            position + (node->left != NULL ? node->left->branch_size : 0);
+          node = node->left;
+          for (; node != NULL; )
+            {
+              int cmp2 = compar (node->value, elt);
+
+              if (cmp2 < 0)
+                {
+                  if (node->left != NULL)
+                    position += node->left->branch_size;
+                  position++;
+                  node = node->right;
+                }
+              else if (cmp2 > 0)
+                /* The list was not sorted.  */
+                abort ();
+              else /* cmp2 == 0 */
+                {
+                  found_position =
+                    position
+                    + (node->left != NULL ? node->left->branch_size : 0);
+                  node = node->left;
+                }
+            }
+          return found_position;
+        }
+    }
+  return (size_t)(-1);
+}
+
+static size_t _GL_ATTRIBUTE_PURE
+gl_tree_sortedlist_indexof_from_to (gl_list_t list,
+                                    gl_listelement_compar_fn compar,
+                                    size_t low, size_t high,
+                                    const void *elt)
+{
+  gl_list_node_t node;
+  size_t position;
+
+  if (!(low <= high
+        && high <= (list->root != NULL ? list->root->branch_size : 0)))
+    /* Invalid arguments.  */
+    abort ();
+
+  for (node = list->root, position = 0; node != NULL; )
+    {
+      size_t left_branch_size =
+        (node->left != NULL ? node->left->branch_size : 0);
+
+      if (low > left_branch_size)
+        {
+          low -= left_branch_size + 1;
+          high -= left_branch_size + 1;
+          position += left_branch_size + 1;
+          node = node->right;
+        }
+      else if (high <= left_branch_size)
+        node = node->left;
+      else
+        {
+          /* Here low <= left_branch_size < high.  */
+          int cmp = compar (node->value, elt);
+
+          if (cmp < 0)
+            {
+              low = 0;
+              high -= left_branch_size + 1;
+              position += left_branch_size + 1;
+              node = node->right;
+            }
+          else if (cmp > 0)
+            node = node->left;
+          else /* cmp == 0 */
+            {
+              /* We have an element equal to ELT.  But we need the leftmost
+                 such element.  */
+              size_t found_position =
+                position + (node->left != NULL ? node->left->branch_size : 0);
+              node = node->left;
+              for (; node != NULL; )
+                {
+                  size_t left_branch_size2 =
+                    (node->left != NULL ? node->left->branch_size : 0);
+
+                  if (low > left_branch_size2)
+                    {
+                      low -= left_branch_size2 + 1;
+                      node = node->right;
+                    }
+                  else
+                    {
+                      /* Here low <= left_branch_size2.  */
+                      int cmp2 = compar (node->value, elt);
+
+                      if (cmp2 < 0)
+                        {
+                          position += left_branch_size2 + 1;
+                          node = node->right;
+                        }
+                      else if (cmp2 > 0)
+                        /* The list was not sorted.  */
+                        abort ();
+                      else /* cmp2 == 0 */
+                        {
+                          found_position = position + left_branch_size2;
+                          node = node->left;
+                        }
+                    }
+                }
+              return found_position;
+            }
+        }
+    }
+  return (size_t)(-1);
+}
+
+static gl_list_node_t
+gl_tree_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar,
+                           const void *elt)
+{
+  gl_list_node_t node = list->root;
+
+  if (node == NULL)
+    return gl_tree_nx_add_first (list, elt);
+
+  for (;;)
+    {
+      int cmp = compar (node->value, elt);
+
+      if (cmp < 0)
+        {
+          if (node->right == NULL)
+            return gl_tree_nx_add_after (list, node, elt);
+          node = node->right;
+        }
+      else if (cmp > 0)
+        {
+          if (node->left == NULL)
+            return gl_tree_nx_add_before (list, node, elt);
+          node = node->left;
+        }
+      else /* cmp == 0 */
+        return gl_tree_nx_add_before (list, node, elt);
+    }
+}
+
+static bool
+gl_tree_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar,
+                           const void *elt)
+{
+  gl_list_node_t node = gl_tree_sortedlist_search (list, compar, elt);
+  if (node != NULL)
+    return gl_tree_remove_node (list, node);
+  else
+    return false;
+}
diff --git a/lib/gl_anytree_oset.h b/lib/gl_anytree_oset.h
new file mode 100644
index 0000000..5123205
--- /dev/null
+++ b/lib/gl_anytree_oset.h
@@ -0,0 +1,443 @@
+/* Ordered set data type implemented by a binary tree.
+   Copyright (C) 2006-2007, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Common code of gl_avltree_oset.c and gl_rbtree_oset.c.  */
+
+/* An item on the stack used for iterating across the elements.  */
+typedef struct
+{
+  gl_oset_node_t node;
+  bool rightp;
+} iterstack_item_t;
+
+/* A stack used for iterating across the elements.  */
+typedef iterstack_item_t iterstack_t[MAXHEIGHT];
+
+static gl_oset_t
+gl_tree_nx_create_empty (gl_oset_implementation_t implementation,
+                         gl_setelement_compar_fn compar_fn,
+                         gl_setelement_dispose_fn dispose_fn)
+{
+  struct gl_oset_impl *set =
+    (struct gl_oset_impl *) malloc (sizeof (struct gl_oset_impl));
+
+  if (set == NULL)
+    return NULL;
+
+  set->base.vtable = implementation;
+  set->base.compar_fn = compar_fn;
+  set->base.dispose_fn = dispose_fn;
+  set->root = NULL;
+  set->count = 0;
+
+  return set;
+}
+
+static size_t _GL_ATTRIBUTE_PURE
+gl_tree_size (gl_oset_t set)
+{
+  return set->count;
+}
+
+/* Returns the next node in the tree, or NULL if there is none.  */
+static inline gl_oset_node_t _GL_ATTRIBUTE_PURE
+gl_tree_next_node (gl_oset_node_t node)
+{
+  if (node->right != NULL)
+    {
+      node = node->right;
+      while (node->left != NULL)
+        node = node->left;
+    }
+  else
+    {
+      while (node->parent != NULL && node->parent->right == node)
+        node = node->parent;
+      node = node->parent;
+    }
+  return node;
+}
+
+/* Returns the previous node in the tree, or NULL if there is none.  */
+static inline gl_oset_node_t _GL_ATTRIBUTE_PURE
+gl_tree_prev_node (gl_oset_node_t node)
+{
+  if (node->left != NULL)
+    {
+      node = node->left;
+      while (node->right != NULL)
+        node = node->right;
+    }
+  else
+    {
+      while (node->parent != NULL && node->parent->left == node)
+        node = node->parent;
+      node = node->parent;
+    }
+  return node;
+}
+
+static bool
+gl_tree_search (gl_oset_t set, const void *elt)
+{
+  gl_setelement_compar_fn compar = set->base.compar_fn;
+  gl_oset_node_t node;
+
+  for (node = set->root; node != NULL; )
+    {
+      int cmp = (compar != NULL
+                 ? compar (node->value, elt)
+                 : (node->value > elt ? 1 :
+                    node->value < elt ? -1 : 0));
+
+      if (cmp < 0)
+        node = node->right;
+      else if (cmp > 0)
+        node = node->left;
+      else /* cmp == 0 */
+        /* We have an element equal to ELT.  */
+        return true;
+    }
+  return false;
+}
+
+static bool
+gl_tree_search_atleast (gl_oset_t set,
+                        gl_setelement_threshold_fn threshold_fn,
+                        const void *threshold,
+                        const void **eltp)
+{
+  gl_oset_node_t node;
+
+  for (node = set->root; node != NULL; )
+    {
+      if (! threshold_fn (node->value, threshold))
+        node = node->right;
+      else
+        {
+          /* We have an element >= THRESHOLD.  But we need the leftmost such
+             element.  */
+          gl_oset_node_t found = node;
+          node = node->left;
+          for (; node != NULL; )
+            {
+              if (! threshold_fn (node->value, threshold))
+                node = node->right;
+              else
+                {
+                  found = node;
+                  node = node->left;
+                }
+            }
+          *eltp = found->value;
+          return true;
+        }
+    }
+  return false;
+}
+
+static gl_oset_node_t
+gl_tree_search_node (gl_oset_t set, const void *elt)
+{
+  gl_setelement_compar_fn compar = set->base.compar_fn;
+  gl_oset_node_t node;
+
+  for (node = set->root; node != NULL; )
+    {
+      int cmp = (compar != NULL
+                 ? compar (node->value, elt)
+                 : (node->value > elt ? 1 :
+                    node->value < elt ? -1 : 0));
+
+      if (cmp < 0)
+        node = node->right;
+      else if (cmp > 0)
+        node = node->left;
+      else /* cmp == 0 */
+        /* We have an element equal to ELT.  */
+        return node;
+    }
+  return NULL;
+}
+
+static int
+gl_tree_nx_add (gl_oset_t set, const void *elt)
+{
+  gl_setelement_compar_fn compar;
+  gl_oset_node_t node = set->root;
+
+  if (node == NULL)
+    {
+      if (gl_tree_nx_add_first (set, elt) == NULL)
+        return -1;
+      return true;
+    }
+
+  compar = set->base.compar_fn;
+
+  for (;;)
+    {
+      int cmp = (compar != NULL
+                 ? compar (node->value, elt)
+                 : (node->value > elt ? 1 :
+                    node->value < elt ? -1 : 0));
+
+      if (cmp < 0)
+        {
+          if (node->right == NULL)
+            {
+              if (gl_tree_nx_add_after (set, node, elt) == NULL)
+                return -1;
+              return true;
+            }
+          node = node->right;
+        }
+      else if (cmp > 0)
+        {
+          if (node->left == NULL)
+            {
+              if (gl_tree_nx_add_before (set, node, elt) == NULL)
+                return -1;
+              return true;
+            }
+          node = node->left;
+        }
+      else /* cmp == 0 */
+        return false;
+    }
+}
+
+static bool
+gl_tree_remove (gl_oset_t set, const void *elt)
+{
+  gl_oset_node_t node = gl_tree_search_node (set, elt);
+
+  if (node != NULL)
+    return gl_tree_remove_node (set, node);
+  else
+    return false;
+}
+
+static int
+gl_tree_update (gl_oset_t set, const void *elt,
+                void (*action) (const void * /*elt*/, void * /*action_data*/),
+                void *action_data)
+{
+  /* Like gl_tree_remove, action (...), gl_tree_nx_add, except that we don't
+     actually remove ELT.  */
+  /* Remember the old node.  Don't free it.  */
+  gl_oset_node_t old_node = gl_tree_search_node (set, elt);
+  /* Invoke ACTION.  */
+  action (elt, action_data);
+  /* Determine where to put the node now.  */
+  if (old_node != NULL)
+    {
+      if (set->count > 1)
+        {
+          gl_setelement_compar_fn compar = set->base.compar_fn;
+
+          gl_oset_node_t prev_node = gl_tree_prev_node (old_node);
+          gl_oset_node_t next_node = gl_tree_next_node (old_node);
+          if (!(compar != NULL
+                ? (prev_node == NULL || compar (prev_node->value, elt) < 0)
+                  && (next_node == NULL || compar (next_node->value, elt) > 0)
+                : (prev_node == NULL || prev_node->value < elt)
+                  && (next_node == NULL || next_node->value > elt)))
+            {
+              /* old_node needs to move in the tree.  */
+              gl_oset_node_t node;
+
+              /* Remove the node from the tree.  Don't free it.  */
+              gl_tree_remove_node_no_free (set, old_node);
+
+              node = set->root;
+
+              for (;;)
+                {
+                  int cmp = (compar != NULL
+                             ? compar (node->value, elt)
+                             : (node->value > elt ? 1 :
+                                node->value < elt ? -1 : 0));
+
+                  if (cmp < 0)
+                    {
+                      if (node->right == NULL)
+                        {
+                          gl_tree_add_node_after (set, node, old_node);
+                          return true;
+                        }
+                      node = node->right;
+                    }
+                  else if (cmp > 0)
+                    {
+                      if (node->left == NULL)
+                        {
+                          gl_tree_add_node_before (set, node, old_node);
+                          return true;
+                        }
+                      node = node->left;
+                    }
+                  else /* cmp == 0 */
+                    {
+                      /* Two elements are the same.  */
+                      NODE_PAYLOAD_DISPOSE (set, old_node)
+                      free (old_node);
+                      return -1;
+                    }
+                }
+            }
+        }
+    }
+  return 0;
+}
+
+static void
+gl_tree_oset_free (gl_oset_t set)
+{
+  /* Iterate across all elements in post-order.  */
+  gl_oset_node_t node = set->root;
+  iterstack_t stack;
+  iterstack_item_t *stack_ptr = &stack[0];
+
+  for (;;)
+    {
+      /* Descend on left branch.  */
+      for (;;)
+        {
+          if (node == NULL)
+            break;
+          stack_ptr->node = node;
+          stack_ptr->rightp = false;
+          node = node->left;
+          stack_ptr++;
+        }
+      /* Climb up again.  */
+      for (;;)
+        {
+          if (stack_ptr == &stack[0])
+            goto done_iterate;
+          stack_ptr--;
+          node = stack_ptr->node;
+          if (!stack_ptr->rightp)
+            break;
+          /* Free the current node.  */
+          if (set->base.dispose_fn != NULL)
+            set->base.dispose_fn (node->value);
+          free (node);
+        }
+      /* Descend on right branch.  */
+      stack_ptr->rightp = true;
+      node = node->right;
+      stack_ptr++;
+    }
+ done_iterate:
+  free (set);
+}
+
+/* --------------------- gl_oset_iterator_t Data Type --------------------- */
+
+static gl_oset_iterator_t _GL_ATTRIBUTE_PURE
+gl_tree_iterator (gl_oset_t set)
+{
+  gl_oset_iterator_t result;
+  gl_oset_node_t node;
+
+  result.vtable = set->base.vtable;
+  result.set = set;
+  /* Start node is the leftmost node.  */
+  node = set->root;
+  if (node != NULL)
+    while (node->left != NULL)
+      node = node->left;
+  result.p = node;
+  /* End point is past the rightmost node.  */
+  result.q = NULL;
+#if defined GCC_LINT || defined lint
+  result.i = 0;
+  result.j = 0;
+  result.count = 0;
+#endif
+
+  return result;
+}
+
+static gl_oset_iterator_t
+gl_tree_iterator_atleast (gl_oset_t set,
+                          gl_setelement_threshold_fn threshold_fn,
+                          const void *threshold)
+{
+  gl_oset_iterator_t result;
+  gl_oset_node_t node;
+
+  result.vtable = set->base.vtable;
+  result.set = set;
+  /* End point is past the rightmost node.  */
+  result.q = NULL;
+#if defined GCC_LINT || defined lint
+  result.i = 0;
+  result.j = 0;
+  result.count = 0;
+#endif
+
+  for (node = set->root; node != NULL; )
+    {
+      if (! threshold_fn (node->value, threshold))
+        node = node->right;
+      else
+        {
+          /* We have an element >= THRESHOLD.  But we need the leftmost such
+             element.  */
+          gl_oset_node_t found = node;
+          node = node->left;
+          for (; node != NULL; )
+            {
+              if (! threshold_fn (node->value, threshold))
+                node = node->right;
+              else
+                {
+                  found = node;
+                  node = node->left;
+                }
+            }
+          result.p = found;
+          return result;
+        }
+    }
+  result.p = NULL;
+  return result;
+}
+
+static bool
+gl_tree_iterator_next (gl_oset_iterator_t *iterator, const void **eltp)
+{
+  if (iterator->p != iterator->q)
+    {
+      gl_oset_node_t node = (gl_oset_node_t) iterator->p;
+      *eltp = node->value;
+      /* Advance to the next node.  */
+      node = gl_tree_next_node (node);
+      iterator->p = node;
+      return true;
+    }
+  else
+    return false;
+}
+
+static void
+gl_tree_iterator_free (_GL_ATTRIBUTE_MAYBE_UNUSED gl_oset_iterator_t *iterator)
+{
+}
diff --git a/lib/gl_anytreehash_list1.h b/lib/gl_anytreehash_list1.h
new file mode 100644
index 0000000..68bbe64
--- /dev/null
+++ b/lib/gl_anytreehash_list1.h
@@ -0,0 +1,346 @@
+/* Sequential list data type implemented by a hash table with a binary tree.
+   Copyright (C) 2006-2007, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Common code of gl_avltreehash_list.c and gl_rbtreehash_list.c.  */
+
+/* Hash table entry representing the same value at more than one position.  */
+struct gl_multiple_nodes
+{
+  struct gl_hash_entry h;           /* hash table entry fields; must be first */
+  void *magic;                      /* used to distinguish from single node */
+  gl_oset_t nodes;                  /* set of nodes, sorted by position */
+};
+/* A value that cannot occur at the corresponding field (->left) in
+   gl_list_node_impl.  */
+#define MULTIPLE_NODES_MAGIC  (void *) -1
+
+/* Returns the position of the given node in the tree.  */
+static size_t _GL_ATTRIBUTE_PURE
+node_position (gl_list_node_t node)
+{
+  size_t position = 0;
+
+  if (node->left != NULL)
+    position += node->left->branch_size;
+  for (;;)
+    {
+      gl_list_node_t parent = node->parent;
+
+      if (parent == NULL)
+        return position;
+      /* position is now relative to the subtree of node.  */
+      if (parent->right == node)
+        {
+          position += 1;
+          if (parent->left != NULL)
+            position += parent->left->branch_size;
+        }
+      /* position is now relative to the subtree of parent.  */
+      node = parent;
+    }
+}
+
+/* Compares two nodes by their position in the tree.  */
+static int _GL_ATTRIBUTE_PURE
+compare_by_position (const void *x1, const void *x2)
+{
+  gl_list_node_t node1 = (gl_list_node_t) x1;
+  gl_list_node_t node2 = (gl_list_node_t) x2;
+  size_t position1 = node_position (node1);
+  size_t position2 = node_position (node2);
+
+  return (position1 > position2 ? 1 :
+          position1 < position2 ? -1 : 0);
+}
+
+/* Compares a node's position in the tree with a given threshold.  */
+static bool _GL_ATTRIBUTE_PURE
+compare_position_threshold (const void *x, const void *threshold)
+{
+  gl_list_node_t node = (gl_list_node_t) x;
+  size_t position = node_position (node);
+  return (position >= (uintptr_t)threshold);
+}
+
+/* Returns the first element of a non-empty ordered set of nodes.  */
+static gl_list_node_t
+gl_oset_first (gl_oset_t set)
+{
+  gl_oset_iterator_t iter = gl_oset_iterator (set);
+  const void *first;
+
+  if (!gl_oset_iterator_next (&iter, &first))
+    abort ();
+  gl_oset_iterator_free (&iter);
+  return (gl_list_node_t) first;
+}
+
+/* Adds a node to the hash table structure.
+   If duplicates are allowed, this function performs in average time
+   O((log n)^2): gl_oset_nx_add may need to add an element to an ordered set
+   of size O(n), needing O(log n) comparison function calls.  The comparison
+   function is compare_by_position, which is O(log n) worst-case.
+   If duplicates are forbidden, this function is O(1).
+   Return 0 upon success, -1 upon out-of-memory.  */
+static int
+add_to_bucket (gl_list_t list, gl_list_node_t new_node)
+{
+  size_t bucket = new_node->h.hashcode % list->table_size;
+
+  /* If no duplicates are allowed, multiple nodes are not needed.  */
+  if (list->base.allow_duplicates)
+    {
+      size_t hashcode = new_node->h.hashcode;
+      const void *value = new_node->value;
+      gl_listelement_equals_fn equals = list->base.equals_fn;
+      gl_hash_entry_t *entryp;
+
+      for (entryp = &list->table[bucket]; *entryp != NULL; entryp = &(*entryp)->hash_next)
+        {
+          gl_hash_entry_t entry = *entryp;
+
+          if (entry->hashcode == hashcode)
+            {
+              if (((struct gl_multiple_nodes *) entry)->magic == MULTIPLE_NODES_MAGIC)
+                {
+                  /* An entry representing multiple nodes.  */
+                  gl_oset_t nodes = ((struct gl_multiple_nodes *) entry)->nodes;
+                  /* Only the first node is interesting.  */
+                  gl_list_node_t node = gl_oset_first (nodes);
+                  if (equals != NULL ? equals (value, node->value) : value == node->value)
+                    {
+                      /* Found already multiple nodes with the same value.
+                         Add the new_node to it.  */
+                      return gl_oset_nx_add (nodes, new_node);
+                    }
+                }
+              else
+                {
+                  /* An entry representing a single node.  */
+                  gl_list_node_t node = (struct gl_list_node_impl *) entry;
+                  if (equals != NULL ? equals (value, node->value) : value == node->value)
+                    {
+                      /* Found already a node with the same value.  Turn it
+                         into an ordered set, and add new_node to it.  */
+                      gl_oset_t nodes;
+                      struct gl_multiple_nodes *multi_entry;
+
+                      nodes =
+                        gl_oset_nx_create_empty (OSET_TREE_FLAVOR,
+                                                 compare_by_position, NULL);
+                      if (nodes == NULL)
+                        return -1;
+
+                      if (gl_oset_nx_add (nodes, node) < 0)
+                        goto fail;
+                      if (gl_oset_nx_add (nodes, new_node) < 0)
+                        goto fail;
+
+                      multi_entry =
+                       (struct gl_multiple_nodes *) malloc (sizeof (struct gl_multiple_nodes));
+                      if (multi_entry == NULL)
+                        goto fail;
+                      multi_entry->h.hash_next = entry->hash_next;
+                      multi_entry->h.hashcode = entry->hashcode;
+                      multi_entry->magic = MULTIPLE_NODES_MAGIC;
+                      multi_entry->nodes = nodes;
+                      *entryp = &multi_entry->h;
+                      return 0;
+
+                    fail:
+                      gl_oset_free (nodes);
+                      return -1;
+                    }
+                }
+            }
+        }
+    }
+  /* If no duplicates are allowed, multiple nodes are not needed.  */
+  new_node->h.hash_next = list->table[bucket];
+  list->table[bucket] = &new_node->h;
+  return 0;
+}
+/* Tell GCC that the likely return value is 0.  */
+#define add_to_bucket(list,node) \
+    __builtin_expect ((add_to_bucket) (list, node), 0)
+
+/* Removes a node from the hash table structure.
+   If duplicates are allowed, this function performs in average time
+   O((log n)^2): gl_oset_remove may need to remove an element from an ordered
+   set of size O(n), needing O(log n) comparison function calls.  The
+   comparison function is compare_by_position, which is O(log n) worst-case.
+   If duplicates are forbidden, this function is O(1) on average.  */
+static void
+remove_from_bucket (gl_list_t list, gl_list_node_t old_node)
+{
+  size_t bucket = old_node->h.hashcode % list->table_size;
+
+  if (list->base.allow_duplicates)
+    {
+      size_t hashcode = old_node->h.hashcode;
+      const void *value = old_node->value;
+      gl_listelement_equals_fn equals = list->base.equals_fn;
+      gl_hash_entry_t *entryp;
+
+      for (entryp = &list->table[bucket]; ; entryp = &(*entryp)->hash_next)
+        {
+          gl_hash_entry_t entry = *entryp;
+
+          if (entry == &old_node->h)
+            {
+              /* Found old_node as a single node in the bucket.  Remove it.  */
+              *entryp = old_node->h.hash_next;
+              break;
+            }
+          if (entry == NULL)
+            /* node is not in the right bucket.  Did the hash codes
+               change inadvertently?  */
+            abort ();
+          if (((struct gl_multiple_nodes *) entry)->magic == MULTIPLE_NODES_MAGIC
+              && entry->hashcode == hashcode)
+            {
+              /* An entry representing multiple nodes.  */
+              gl_oset_t nodes = ((struct gl_multiple_nodes *) entry)->nodes;
+              /* Only the first node is interesting.  */
+              gl_list_node_t node = gl_oset_first (nodes);
+              if (equals != NULL ? equals (value, node->value) : value == node->value)
+                {
+                  /* Found multiple nodes with the same value.
+                     old_node must be one of them.  Remove it.  */
+                  if (!gl_oset_remove (nodes, old_node))
+                    abort ();
+                  if (gl_oset_size (nodes) == 1)
+                    {
+                      /* Replace a one-element set with a single node.  */
+                      node = gl_oset_first (nodes);
+                      node->h.hash_next = entry->hash_next;
+                      *entryp = &node->h;
+                      gl_oset_free (nodes);
+                      free (entry);
+                    }
+                  break;
+                }
+            }
+        }
+    }
+  else
+    {
+      /* If no duplicates are allowed, multiple nodes are not needed.  */
+      gl_hash_entry_t *entryp;
+
+      for (entryp = &list->table[bucket]; ; entryp = &(*entryp)->hash_next)
+        {
+          if (*entryp == &old_node->h)
+            {
+              *entryp = old_node->h.hash_next;
+              break;
+            }
+          if (*entryp == NULL)
+            /* node is not in the right bucket.  Did the hash codes
+               change inadvertently?  */
+            abort ();
+        }
+    }
+}
+
+/* Builds up the hash table during initialization: Stores all the nodes of
+   list->root in the hash table.
+   Returns 0 upon success, -1 upon out-of-memory.  */
+static int
+add_nodes_to_buckets (gl_list_t list)
+{
+  /* Iterate across all nodes.  */
+  gl_list_node_t node = list->root;
+  iterstack_t stack;
+  iterstack_item_t *stack_ptr = &stack[0];
+
+  for (;;)
+    {
+      /* Descend on left branch.  */
+      for (;;)
+        {
+          if (node == NULL)
+            break;
+          stack_ptr->node = node;
+          stack_ptr->rightp = false;
+          node = node->left;
+          stack_ptr++;
+        }
+      /* Climb up again.  */
+      for (;;)
+        {
+          if (stack_ptr == &stack[0])
+            goto done;
+          stack_ptr--;
+          if (!stack_ptr->rightp)
+            break;
+        }
+      node = stack_ptr->node;
+      /* Add the current node to the hash table.  */
+      node->h.hashcode =
+        (list->base.hashcode_fn != NULL
+         ? list->base.hashcode_fn (node->value)
+         : (size_t)(uintptr_t) node->value);
+      if (add_to_bucket (list, node) < 0)
+        goto fail;
+      /* Descend on right branch.  */
+      stack_ptr->rightp = true;
+      node = node->right;
+      stack_ptr++;
+    }
+ done:
+  return 0;
+
+ fail:
+  /* Undo everything.  */
+  for (;;)
+    {
+      /* Descend on left branch.  */
+      stack_ptr->rightp = false;
+      node = node->left;
+      stack_ptr++;
+      /* Descend on right branch.  */
+      for (;;)
+        {
+          if (node == NULL)
+            break;
+          stack_ptr->node = node;
+          stack_ptr->rightp = true;
+          node = node->right;
+          stack_ptr++;
+        }
+      /* Climb up again.  */
+      for (;;)
+        {
+          if (stack_ptr == &stack[0])
+            goto fail_done;
+          stack_ptr--;
+          if (stack_ptr->rightp)
+            break;
+        }
+      node = stack_ptr->node;
+      /* Remove the current node from the hash table.  */
+      remove_from_bucket (list, node);
+    }
+ fail_done:
+  return -1;
+}
+/* Tell GCC that the likely return value is 0.  */
+#if (__GNUC__ >= 3) || (__clang_major__ >= 4)
+# define add_nodes_to_buckets(list) \
+    __builtin_expect ((add_nodes_to_buckets) (list), 0)
+#endif
diff --git a/lib/gl_anytreehash_list2.h b/lib/gl_anytreehash_list2.h
new file mode 100644
index 0000000..338082c
--- /dev/null
+++ b/lib/gl_anytreehash_list2.h
@@ -0,0 +1,213 @@
+/* Sequential list data type implemented by a hash table with a binary tree.
+   Copyright (C) 2006-2007, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Common code of gl_avltreehash_list.c and gl_rbtreehash_list.c.  */
+
+static gl_list_node_t
+gl_tree_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+                        const void *elt)
+{
+  if (!(start_index <= end_index
+        && end_index <= (list->root != NULL ? list->root->branch_size : 0)))
+    /* Invalid arguments.  */
+    abort ();
+  {
+    size_t hashcode =
+      (list->base.hashcode_fn != NULL
+       ? list->base.hashcode_fn (elt)
+       : (size_t)(uintptr_t) elt);
+    size_t bucket = hashcode % list->table_size;
+    gl_listelement_equals_fn equals = list->base.equals_fn;
+    gl_hash_entry_t entry;
+
+    if (list->base.allow_duplicates)
+      {
+        for (entry = list->table[bucket]; entry != NULL; entry = entry->hash_next)
+          if (entry->hashcode == hashcode)
+            {
+              if (((struct gl_multiple_nodes *) entry)->magic == MULTIPLE_NODES_MAGIC)
+                {
+                  /* An entry representing multiple nodes.  */
+                  gl_oset_t nodes = ((struct gl_multiple_nodes *) entry)->nodes;
+                  /* The first node is interesting.  */
+                  gl_list_node_t node = gl_oset_first (nodes);
+                  if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+                    {
+                      /* All nodes in the entry are equal to the given ELT.  */
+                      if (start_index == 0)
+                        {
+                          /* We have to return only the one at the minimal
+                             position, and this is the first one in the ordered
+                             set.  */
+                          if (end_index == list->root->branch_size
+                              || node_position (node) < end_index)
+                            return node;
+                        }
+                      else
+                        {
+                          /* We have to return only the one at the minimal
+                             position >= start_index.  */
+                          const void *nodes_elt;
+                          if (gl_oset_search_atleast (nodes,
+                                                      compare_position_threshold,
+                                                      (void *)(uintptr_t)start_index,
+                                                      &nodes_elt))
+                            {
+                              node = (gl_list_node_t) nodes_elt;
+                              if (end_index == list->root->branch_size
+                                  || node_position (node) < end_index)
+                                return node;
+                            }
+                        }
+                      break;
+                    }
+                }
+              else
+                {
+                  /* An entry representing a single node.  */
+                  gl_list_node_t node = (struct gl_list_node_impl *) entry;
+                  if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+                    {
+                      bool position_in_bounds;
+                      if (start_index == 0 && end_index == list->root->branch_size)
+                        position_in_bounds = true;
+                      else
+                        {
+                          size_t position = node_position (node);
+                          position_in_bounds =
+                            (position >= start_index && position < end_index);
+                        }
+                      if (position_in_bounds)
+                        return node;
+                      break;
+                    }
+                }
+            }
+      }
+    else
+      {
+        /* If no duplicates are allowed, multiple nodes are not needed.  */
+        for (entry = list->table[bucket]; entry != NULL; entry = entry->hash_next)
+          if (entry->hashcode == hashcode)
+            {
+              gl_list_node_t node = (struct gl_list_node_impl *) entry;
+              if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+                {
+                  bool position_in_bounds;
+                  if (start_index == 0 && end_index == list->root->branch_size)
+                    position_in_bounds = true;
+                  else
+                    {
+                      size_t position = node_position (node);
+                      position_in_bounds =
+                        (position >= start_index && position < end_index);
+                    }
+                  if (position_in_bounds)
+                    return node;
+                  break;
+                }
+            }
+      }
+
+    return NULL;
+  }
+}
+
+static size_t
+gl_tree_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index,
+                         const void *elt)
+{
+  gl_list_node_t node =
+    gl_tree_search_from_to (list, start_index, end_index, elt);
+
+  if (node != NULL)
+    return node_position (node);
+  else
+    return (size_t)(-1);
+}
+
+static void
+gl_tree_list_free (gl_list_t list)
+{
+  if (list->base.allow_duplicates)
+    {
+      /* Free the ordered sets in the hash buckets.  */
+      size_t i;
+
+      for (i = list->table_size; i > 0; )
+        {
+          gl_hash_entry_t entry = list->table[--i];
+
+          while (entry != NULL)
+            {
+              gl_hash_entry_t next = entry->hash_next;
+
+              if (((struct gl_multiple_nodes *) entry)->magic == MULTIPLE_NODES_MAGIC)
+                {
+                  gl_oset_t nodes = ((struct gl_multiple_nodes *) entry)->nodes;
+
+                  gl_oset_free (nodes);
+                  free (entry);
+                }
+
+              entry = next;
+            }
+        }
+    }
+
+  /* Iterate across all elements in post-order.  */
+  {
+    gl_list_node_t node = list->root;
+    iterstack_t stack;
+    iterstack_item_t *stack_ptr = &stack[0];
+
+    for (;;)
+      {
+        /* Descend on left branch.  */
+        for (;;)
+          {
+            if (node == NULL)
+              break;
+            stack_ptr->node = node;
+            stack_ptr->rightp = false;
+            node = node->left;
+            stack_ptr++;
+          }
+        /* Climb up again.  */
+        for (;;)
+          {
+            if (stack_ptr == &stack[0])
+              goto done_iterate;
+            stack_ptr--;
+            node = stack_ptr->node;
+            if (!stack_ptr->rightp)
+              break;
+            /* Free the current node.  */
+            if (list->base.dispose_fn != NULL)
+              list->base.dispose_fn (node->value);
+            free (node);
+          }
+        /* Descend on right branch.  */
+        stack_ptr->rightp = true;
+        node = node->right;
+        stack_ptr++;
+      }
+  }
+ done_iterate:
+  free (list->table);
+  free (list);
+}
diff --git a/lib/gl_array_list.c b/lib/gl_array_list.c
index fa8cf1e..8485d60 100644
--- a/lib/gl_array_list.c
+++ b/lib/gl_array_list.c
@@ -1,18 +1,18 @@
 /* Sequential list data type implemented by an array.
-   Copyright (C) 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2006.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
@@ -111,7 +111,7 @@
   return NULL;
 }
 
-static size_t
+static size_t _GL_ATTRIBUTE_PURE
 gl_array_size (gl_list_t list)
 {
   return list->count;
@@ -166,6 +166,24 @@
     return NULL;
 }
 
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+gl_array_first_node (gl_list_t list)
+{
+  if (list->count > 0)
+    return INDEX_TO_NODE (0);
+  else
+    return NULL;
+}
+
+static gl_list_node_t _GL_ATTRIBUTE_PURE
+gl_array_last_node (gl_list_t list)
+{
+  if (list->count > 0)
+    return INDEX_TO_NODE (list->count - 1);
+  else
+    return NULL;
+}
+
 static const void * _GL_ATTRIBUTE_PURE
 gl_array_get_at (gl_list_t list, size_t position)
 {
@@ -189,7 +207,7 @@
   return INDEX_TO_NODE (position);
 }
 
-static size_t
+static size_t _GL_ATTRIBUTE_PURE
 gl_array_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index,
                           const void *elt)
 {
@@ -232,7 +250,7 @@
   return (size_t)(-1);
 }
 
-static gl_list_node_t
+static gl_list_node_t _GL_ATTRIBUTE_PURE
 gl_array_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
                          const void *elt)
 {
@@ -441,7 +459,7 @@
 
 /* --------------------- gl_list_iterator_t Data Type --------------------- */
 
-static gl_list_iterator_t
+static gl_list_iterator_t _GL_ATTRIBUTE_PURE
 gl_array_iterator (gl_list_t list)
 {
   gl_list_iterator_t result;
@@ -459,7 +477,7 @@
   return result;
 }
 
-static gl_list_iterator_t
+static gl_list_iterator_t _GL_ATTRIBUTE_PURE
 gl_array_iterator_from_to (gl_list_t list, size_t start_index, size_t end_index)
 {
   gl_list_iterator_t result;
@@ -509,13 +527,13 @@
 }
 
 static void
-gl_array_iterator_free (gl_list_iterator_t *iterator _GL_UNUSED)
+gl_array_iterator_free (_GL_ATTRIBUTE_MAYBE_UNUSED gl_list_iterator_t *iterator)
 {
 }
 
 /* ---------------------- Sorted gl_list_t Data Type ---------------------- */
 
-static size_t
+static size_t _GL_ATTRIBUTE_PURE
 gl_array_sortedlist_indexof_from_to (gl_list_t list,
                                      gl_listelement_compar_fn compar,
                                      size_t low, size_t high,
@@ -574,7 +592,7 @@
   return (size_t)(-1);
 }
 
-static size_t
+static size_t _GL_ATTRIBUTE_PURE
 gl_array_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar,
                              const void *elt)
 {
@@ -582,7 +600,7 @@
                                               elt);
 }
 
-static gl_list_node_t
+static gl_list_node_t _GL_ATTRIBUTE_PURE
 gl_array_sortedlist_search_from_to (gl_list_t list,
                                     gl_listelement_compar_fn compar,
                                     size_t low, size_t high,
@@ -593,7 +611,7 @@
   return INDEX_TO_NODE (index);
 }
 
-static gl_list_node_t
+static gl_list_node_t _GL_ATTRIBUTE_PURE
 gl_array_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar,
                             const void *elt)
 {
@@ -651,6 +669,8 @@
     gl_array_node_nx_set_value,
     gl_array_next_node,
     gl_array_previous_node,
+    gl_array_first_node,
+    gl_array_last_node,
     gl_array_get_at,
     gl_array_nx_set_at,
     gl_array_search_from_to,
diff --git a/lib/gl_array_list.h b/lib/gl_array_list.h
index 98158fe..39276ab 100644
--- a/lib/gl_array_list.h
+++ b/lib/gl_array_list.h
@@ -1,18 +1,18 @@
 /* Sequential list data type implemented by an array.
-   Copyright (C) 2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2006.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_ARRAY_LIST_H
diff --git a/lib/gl_hash_map.c b/lib/gl_hash_map.c
new file mode 100644
index 0000000..c6d3e86
--- /dev/null
+++ b/lib/gl_hash_map.c
@@ -0,0 +1,333 @@
+/* Map data type implemented by a hash table.
+   Copyright (C) 2006, 2008-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2018.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "gl_hash_map.h"
+
+#include <stdint.h> /* for uintptr_t, SIZE_MAX */
+#include <stdlib.h>
+
+#include "xsize.h"
+
+/* --------------------------- gl_map_t Data Type --------------------------- */
+
+#include "gl_anyhash1.h"
+
+/* Concrete list node implementation, valid for this file only.  */
+struct gl_list_node_impl
+{
+  struct gl_hash_entry h;           /* hash table entry fields; must be first */
+  const void *key;
+  const void *value;
+};
+typedef struct gl_list_node_impl * gl_list_node_t;
+
+/* Concrete gl_map_impl type, valid for this file only.  */
+struct gl_map_impl
+{
+  struct gl_map_impl_base base;
+  gl_mapkey_hashcode_fn hashcode_fn;
+  /* A hash table: managed as an array of collision lists.  */
+  struct gl_hash_entry **table;
+  size_t table_size;
+  /* Number of hash table entries.  */
+  size_t count;
+};
+
+#define CONTAINER_T gl_map_t
+#define CONTAINER_COUNT(map) (map)->count
+#include "gl_anyhash2.h"
+
+/* --------------------------- gl_map_t Data Type --------------------------- */
+
+static gl_map_t
+gl_hash_nx_create_empty (gl_map_implementation_t implementation,
+                         gl_mapkey_equals_fn equals_fn,
+                         gl_mapkey_hashcode_fn hashcode_fn,
+                         gl_mapkey_dispose_fn kdispose_fn,
+                         gl_mapvalue_dispose_fn vdispose_fn)
+{
+  struct gl_map_impl *map =
+    (struct gl_map_impl *) malloc (sizeof (struct gl_map_impl));
+
+  if (map == NULL)
+    return NULL;
+
+  map->base.vtable = implementation;
+  map->base.equals_fn = equals_fn;
+  map->base.kdispose_fn = kdispose_fn;
+  map->base.vdispose_fn = vdispose_fn;
+  map->hashcode_fn = hashcode_fn;
+  map->table_size = 11;
+  map->table =
+    (gl_hash_entry_t *) calloc (map->table_size, sizeof (gl_hash_entry_t));
+  if (map->table == NULL)
+    goto fail;
+  map->count = 0;
+
+  return map;
+
+ fail:
+  free (map);
+  return NULL;
+}
+
+static size_t _GL_ATTRIBUTE_PURE
+gl_hash_size (gl_map_t map)
+{
+  return map->count;
+}
+
+static bool _GL_ATTRIBUTE_PURE
+gl_hash_search (gl_map_t map, const void *key, const void **valuep)
+{
+  size_t hashcode =
+    (map->hashcode_fn != NULL
+     ? map->hashcode_fn (key)
+     : (size_t)(uintptr_t) key);
+  size_t bucket = hashcode % map->table_size;
+  gl_mapkey_equals_fn equals = map->base.equals_fn;
+
+  /* Look for a match in the hash bucket.  */
+  gl_list_node_t node;
+
+  for (node = (gl_list_node_t) map->table[bucket];
+       node != NULL;
+       node = (gl_list_node_t) node->h.hash_next)
+    if (node->h.hashcode == hashcode
+        && (equals != NULL
+            ? equals (key, node->key)
+            : key == node->key))
+      {
+        *valuep = node->value;
+        return true;
+      }
+  return false;
+}
+
+static int
+gl_hash_nx_getput (gl_map_t map, const void *key, const void *value,
+                   const void **oldvaluep)
+{
+  size_t hashcode =
+    (map->hashcode_fn != NULL
+     ? map->hashcode_fn (key)
+     : (size_t)(uintptr_t) key);
+  size_t bucket = hashcode % map->table_size;
+  gl_mapkey_equals_fn equals = map->base.equals_fn;
+
+  /* Look for a match in the hash bucket.  */
+  {
+    gl_list_node_t node;
+
+    for (node = (gl_list_node_t) map->table[bucket];
+         node != NULL;
+         node = (gl_list_node_t) node->h.hash_next)
+      if (node->h.hashcode == hashcode
+          && (equals != NULL
+              ? equals (key, node->key)
+              : key == node->key))
+        {
+          *oldvaluep = node->value;
+          node->value = value;
+          return 0;
+        }
+  }
+
+  /* Allocate a new node.  */
+  gl_list_node_t node =
+    (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+  if (node == NULL)
+    return -1;
+
+  node->key = key;
+  node->value = value;
+  node->h.hashcode = hashcode;
+
+  /* Add node to the hash table.  */
+  node->h.hash_next = map->table[bucket];
+  map->table[bucket] = &node->h;
+
+  /* Add node to the map.  */
+  map->count++;
+
+  hash_resize_after_add (map);
+
+  return 1;
+}
+
+static bool
+gl_hash_getremove (gl_map_t map, const void *key, const void **oldvaluep)
+{
+  size_t hashcode =
+    (map->hashcode_fn != NULL
+     ? map->hashcode_fn (key)
+     : (size_t)(uintptr_t) key);
+  size_t bucket = hashcode % map->table_size;
+  gl_mapkey_equals_fn equals = map->base.equals_fn;
+
+  /* Look for the first match in the hash bucket.  */
+  gl_list_node_t *nodep;
+
+  for (nodep = (gl_list_node_t *) &map->table[bucket];
+       *nodep != NULL;
+       nodep = (gl_list_node_t *) &(*nodep)->h.hash_next)
+    {
+      gl_list_node_t node = *nodep;
+      if (node->h.hashcode == hashcode
+          && (equals != NULL
+              ? equals (key, node->key)
+              : key == node->key))
+        {
+          *oldvaluep = node->value;
+
+          /* Remove node from the hash table.  */
+          *nodep = (gl_list_node_t) node->h.hash_next;
+
+          /* Remove node from the map.  */
+          map->count--;
+
+          if (map->base.kdispose_fn != NULL)
+            map->base.kdispose_fn (node->key);
+          free (node);
+          return true;
+        }
+    }
+
+  return false;
+}
+
+static void
+gl_hash_free (gl_map_t map)
+{
+  if (map->count > 0)
+    {
+      gl_mapkey_dispose_fn kdispose = map->base.kdispose_fn;
+      gl_mapvalue_dispose_fn vdispose = map->base.vdispose_fn;
+      struct gl_hash_entry **table = map->table;
+      size_t i;
+
+      for (i = map->table_size; i > 0; )
+        {
+          gl_hash_entry_t node = table[--i];
+
+          while (node != NULL)
+            {
+              gl_hash_entry_t next = node->hash_next;
+
+              /* Free the entry.  */
+              if (vdispose != NULL)
+                vdispose (((gl_list_node_t) node)->value);
+              if (kdispose != NULL)
+                kdispose (((gl_list_node_t) node)->key);
+              free (node);
+
+              node = next;
+            }
+        }
+    }
+
+  free (map->table);
+  free (map);
+}
+
+/* ---------------------- gl_map_iterator_t Data Type ---------------------- */
+
+/* Here we iterate through the hash buckets.  Therefore the order in which the
+   pairs are returned is unpredictable.  */
+
+static gl_map_iterator_t
+gl_hash_iterator (gl_map_t map)
+{
+  gl_map_iterator_t result;
+
+  result.vtable = map->base.vtable;
+  result.map = map;
+  result.p = NULL;         /* runs through the nodes of a bucket */
+  result.i = 0;            /* index of the bucket that p points into + 1 */
+  result.j = map->table_size;
+#if defined GCC_LINT || defined lint
+  result.q = NULL;
+  result.count = 0;
+#endif
+
+  return result;
+}
+
+static bool
+gl_hash_iterator_next (gl_map_iterator_t *iterator,
+                       const void **keyp, const void **valuep)
+{
+  if (iterator->p != NULL)
+    {
+      /* We're traversing a bucket.  */
+      gl_list_node_t node = (gl_list_node_t) iterator->p;
+      *keyp = node->key;
+      *valuep = node->value;
+      iterator->p = (gl_list_node_t) node->h.hash_next;
+      return true;
+    }
+  else
+    {
+      /* Find the next bucket that is not empty.  */
+      size_t j = iterator->j;
+      size_t i = iterator->i;
+
+      if (i < j)
+        {
+          gl_hash_entry_t *table = iterator->map->table;
+          do
+            {
+              gl_list_node_t node = (gl_list_node_t) table[i++];
+              if (node != NULL)
+                {
+                  *keyp = node->key;
+                  *valuep = node->value;
+                  iterator->p = (gl_list_node_t) node->h.hash_next;
+                  iterator->i = i;
+                  return true;
+                }
+            }
+          while (i < j);
+        }
+      /* Here iterator->p is still NULL, and i == j.  */
+      iterator->i = j;
+      return false;
+    }
+}
+
+static void
+gl_hash_iterator_free (gl_map_iterator_t *iterator)
+{
+}
+
+
+const struct gl_map_implementation gl_hash_map_implementation =
+  {
+    gl_hash_nx_create_empty,
+    gl_hash_size,
+    gl_hash_search,
+    gl_hash_nx_getput,
+    gl_hash_getremove,
+    gl_hash_free,
+    gl_hash_iterator,
+    gl_hash_iterator_next,
+    gl_hash_iterator_free
+  };
diff --git a/lib/gl_hash_map.h b/lib/gl_hash_map.h
new file mode 100644
index 0000000..ee6bea4
--- /dev/null
+++ b/lib/gl_hash_map.h
@@ -0,0 +1,34 @@
+/* Map data type implemented by a hash table.
+   Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2018.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_HASH_MAP_H
+#define _GL_HASH_MAP_H
+
+#include "gl_map.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_map_implementation gl_hash_map_implementation;
+#define GL_HASH_MAP &gl_hash_map_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_HASH_MAP_H */
diff --git a/lib/gl_linked_list.c b/lib/gl_linked_list.c
new file mode 100644
index 0000000..97bdbea
--- /dev/null
+++ b/lib/gl_linked_list.c
@@ -0,0 +1,66 @@
+/* Sequential list data type implemented by a linked list.
+   Copyright (C) 2006, 2008-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "gl_linked_list.h"
+
+#include <stdlib.h>
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Generic linked list code.  */
+#include "gl_anylinked_list1.h"
+#include "gl_anylinked_list2.h"
+
+
+const struct gl_list_implementation gl_linked_list_implementation =
+  {
+    gl_linked_nx_create_empty,
+    gl_linked_nx_create,
+    gl_linked_size,
+    gl_linked_node_value,
+    gl_linked_node_nx_set_value,
+    gl_linked_next_node,
+    gl_linked_previous_node,
+    gl_linked_first_node,
+    gl_linked_last_node,
+    gl_linked_get_at,
+    gl_linked_nx_set_at,
+    gl_linked_search_from_to,
+    gl_linked_indexof_from_to,
+    gl_linked_nx_add_first,
+    gl_linked_nx_add_last,
+    gl_linked_nx_add_before,
+    gl_linked_nx_add_after,
+    gl_linked_nx_add_at,
+    gl_linked_remove_node,
+    gl_linked_remove_at,
+    gl_linked_remove,
+    gl_linked_list_free,
+    gl_linked_iterator,
+    gl_linked_iterator_from_to,
+    gl_linked_iterator_next,
+    gl_linked_iterator_free,
+    gl_linked_sortedlist_search,
+    gl_linked_sortedlist_search_from_to,
+    gl_linked_sortedlist_indexof,
+    gl_linked_sortedlist_indexof_from_to,
+    gl_linked_sortedlist_nx_add,
+    gl_linked_sortedlist_remove
+  };
diff --git a/lib/gl_linked_list.h b/lib/gl_linked_list.h
new file mode 100644
index 0000000..9b232ad
--- /dev/null
+++ b/lib/gl_linked_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by a linked list.
+   Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_LINKED_LIST_H
+#define _GL_LINKED_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_linked_list_implementation;
+#define GL_LINKED_LIST &gl_linked_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_LINKED_LIST_H */
diff --git a/lib/gl_list.c b/lib/gl_list.c
index 8793298..08d2e88 100644
--- a/lib/gl_list.c
+++ b/lib/gl_list.c
@@ -1,3 +1,21 @@
+/* Abstract sequential list data type.
+
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #include <config.h>
+
 #define GL_LIST_INLINE _GL_EXTERN_INLINE
 #include "gl_list.h"
diff --git a/lib/gl_list.h b/lib/gl_list.h
index 5f2cade..3374ae2 100644
--- a/lib/gl_list.h
+++ b/lib/gl_list.h
@@ -1,18 +1,18 @@
 /* Abstract sequential list data type.  -*- coding: utf-8 -*-
-   Copyright (C) 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2006.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_LIST_H
@@ -73,8 +73,14 @@
    gl_list_node_set_value      O(1)     O(1)     O(1)      O(1)    O((log n)²)/O(1)
    gl_list_next_node           O(1)     O(1)   O(log n)    O(1)       O(log n)
    gl_list_previous_node       O(1)     O(1)   O(log n)    O(1)       O(log n)
+   gl_list_first_node          O(1)     O(1)   O(log n)    O(1)       O(log n)
+   gl_list_last_node           O(1)     O(1)   O(log n)    O(1)       O(log n)
    gl_list_get_at              O(1)     O(n)   O(log n)    O(n)       O(log n)
+   gl_list_get_first           O(1)     O(1)   O(log n)    O(1)       O(log n)
+   gl_list_get_last            O(1)     O(1)   O(log n)    O(1)       O(log n)
    gl_list_set_at              O(1)     O(n)   O(log n)    O(n)    O((log n)²)/O(log n)
+   gl_list_set_first           O(1)     O(1)   O(log n)  O(n)/O(1) O((log n)²)/O(log n)
+   gl_list_set_last            O(1)     O(1)   O(log n)  O(n)/O(1) O((log n)²)/O(log n)
    gl_list_search              O(n)     O(n)     O(n)    O(n)/O(1)    O(log n)/O(1)
    gl_list_search_from         O(n)     O(n)     O(n)    O(n)/O(1) O((log n)²)/O(log n)
    gl_list_search_from_to      O(n)     O(n)     O(n)    O(n)/O(1) O((log n)²)/O(log n)
@@ -88,6 +94,8 @@
    gl_list_add_at              O(n)     O(n)   O(log n)    O(n)    O((log n)²)/O(log n)
    gl_list_remove_node         O(n)     O(1)   O(log n)  O(n)/O(1) O((log n)²)/O(log n)
    gl_list_remove_at           O(n)     O(n)   O(log n)    O(n)    O((log n)²)/O(log n)
+   gl_list_remove_first      O(n)/O(1)  O(1)   O(log n)  O(n)/O(1) O((log n)²)/O(log n)
+   gl_list_remove_last         O(1)     O(1)   O(log n)  O(n)/O(1) O((log n)²)/O(log n)
    gl_list_remove              O(n)     O(n)     O(n)    O(n)/O(1) O((log n)²)/O(log n)
    gl_list_iterator            O(1)     O(1)   O(log n)    O(1)       O(log n)
    gl_list_iterator_from_to    O(1)     O(n)   O(log n)    O(n)       O(log n)
@@ -130,7 +138,7 @@
 
 #if 0 /* Unless otherwise specified, these are defined inline below.  */
 
-/* Create an empty list.
+/* Creates an empty list.
    IMPLEMENTATION is one of GL_ARRAY_LIST, GL_CARRAY_LIST, GL_LINKED_LIST,
    GL_AVLTREE_LIST, GL_RBTREE_LIST, GL_LINKEDHASH_LIST, GL_AVLTREEHASH_LIST,
    GL_RBTREEHASH_LIST.
@@ -144,15 +152,18 @@
                                        gl_listelement_equals_fn equals_fn,
                                        gl_listelement_hashcode_fn hashcode_fn,
                                        gl_listelement_dispose_fn dispose_fn,
-                                       bool allow_duplicates);
-/* Likewise.  Return NULL upon out-of-memory.  */
+                                       bool allow_duplicates)
+  /*_GL_ATTRIBUTE_DEALLOC (gl_list_free, 1)*/
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
+/* Likewise.  Returns NULL upon out-of-memory.  */
 extern gl_list_t gl_list_nx_create_empty (gl_list_implementation_t implementation,
                                           gl_listelement_equals_fn equals_fn,
                                           gl_listelement_hashcode_fn hashcode_fn,
                                           gl_listelement_dispose_fn dispose_fn,
-                                          bool allow_duplicates);
+                                          bool allow_duplicates)
+  /*_GL_ATTRIBUTE_DEALLOC (gl_list_free, 1)*/;
 
-/* Create a list with given contents.
+/* Creates a list with given contents.
    IMPLEMENTATION is one of GL_ARRAY_LIST, GL_CARRAY_LIST, GL_LINKED_LIST,
    GL_AVLTREE_LIST, GL_RBTREE_LIST, GL_LINKEDHASH_LIST, GL_AVLTREEHASH_LIST,
    GL_RBTREEHASH_LIST.
@@ -169,170 +180,203 @@
                                  gl_listelement_hashcode_fn hashcode_fn,
                                  gl_listelement_dispose_fn dispose_fn,
                                  bool allow_duplicates,
-                                 size_t count, const void **contents);
-/* Likewise.  Return NULL upon out-of-memory.  */
+                                 size_t count, const void **contents)
+  /*_GL_ATTRIBUTE_DEALLOC (gl_list_free, 1)*/
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
+/* Likewise.  Returns NULL upon out-of-memory.  */
 extern gl_list_t gl_list_nx_create (gl_list_implementation_t implementation,
                                     gl_listelement_equals_fn equals_fn,
                                     gl_listelement_hashcode_fn hashcode_fn,
                                     gl_listelement_dispose_fn dispose_fn,
                                     bool allow_duplicates,
-                                    size_t count, const void **contents);
+                                    size_t count, const void **contents)
+  /*_GL_ATTRIBUTE_DEALLOC (gl_list_free, 1)*/;
 
-/* Return the current number of elements in a list.  */
+/* Returns the current number of elements in a list.  */
 extern size_t gl_list_size (gl_list_t list);
 
-/* Return the element value represented by a list node.  */
+/* Returns the element value represented by a list node.  */
 extern const void * gl_list_node_value (gl_list_t list, gl_list_node_t node);
 
-/* Replace the element value represented by a list node.  */
+/* Replaces the element value represented by a list node.  */
 /* declared in gl_xlist.h */
 extern void gl_list_node_set_value (gl_list_t list, gl_list_node_t node,
                                     const void *elt);
-/* Likewise.  Return 0 upon success, -1 upon out-of-memory.  */
+/* Likewise.  Returns 0 upon success, -1 upon out-of-memory.  */
+_GL_ATTRIBUTE_NODISCARD
 extern int gl_list_node_nx_set_value (gl_list_t list, gl_list_node_t node,
-                                      const void *elt)
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  __attribute__ ((__warn_unused_result__))
-#endif
-  ;
+                                      const void *elt);
 
-/* Return the node immediately after the given node in the list, or NULL
+/* Returns the node immediately after the given node in the list, or NULL
    if the given node is the last (rightmost) one in the list.  */
 extern gl_list_node_t gl_list_next_node (gl_list_t list, gl_list_node_t node);
 
-/* Return the node immediately before the given node in the list, or NULL
+/* Returns the node immediately before the given node in the list, or NULL
    if the given node is the first (leftmost) one in the list.  */
 extern gl_list_node_t gl_list_previous_node (gl_list_t list, gl_list_node_t node);
 
-/* Return the element at a given position in the list.
+/* Returns the first node in the list, or NULL if the list is empty.
+   This function is useful for iterating through the list like this:
+     gl_list_node_t node;
+     for (node = gl_list_first_node (list); node != NULL; node = gl_list_next_node (node))
+       ...
+ */
+extern gl_list_node_t gl_list_first_node (gl_list_t list);
+
+/* Returns the last node in the list, or NULL if the list is empty.
+   This function is useful for iterating through the list in backward order,
+   like this:
+     gl_list_node_t node;
+     for (node = gl_list_last_node (list); node != NULL; node = gl_list_previous_node (node))
+       ...
+ */
+extern gl_list_node_t gl_list_last_node (gl_list_t list);
+
+/* Returns the element at a given position in the list.
    POSITION must be >= 0 and < gl_list_size (list).  */
 extern const void * gl_list_get_at (gl_list_t list, size_t position);
 
-/* Replace the element at a given position in the list.
+/* Returns the element at the first position in the list.
+   The list must be non-empty.  */
+extern const void * gl_list_get_first (gl_list_t list);
+
+/* Returns the element at the last position in the list.
+   The list must be non-empty.  */
+extern const void * gl_list_get_last (gl_list_t list);
+
+/* Replaces the element at a given position in the list.
    POSITION must be >= 0 and < gl_list_size (list).
-   Return its node.  */
+   Returns its node.  */
 /* declared in gl_xlist.h */
 extern gl_list_node_t gl_list_set_at (gl_list_t list, size_t position,
                                       const void *elt);
-/* Likewise.  Return NULL upon out-of-memory.  */
+/* Likewise.  Returns NULL upon out-of-memory.  */
+_GL_ATTRIBUTE_NODISCARD
 extern gl_list_node_t gl_list_nx_set_at (gl_list_t list, size_t position,
-                                         const void *elt)
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  __attribute__ ((__warn_unused_result__))
-#endif
-  ;
+                                         const void *elt);
 
-/* Search whether an element is already in the list.
-   Return its node if found, or NULL if not present in the list.  */
+/* Replaces the element at the first position in the list.
+   Returns its node.
+   The list must be non-empty.  */
+/* declared in gl_xlist.h */
+extern gl_list_node_t gl_list_set_first (gl_list_t list, const void *elt);
+/* Likewise.  Returns NULL upon out-of-memory.  */
+_GL_ATTRIBUTE_NODISCARD
+extern gl_list_node_t gl_list_nx_set_first (gl_list_t list, const void *elt);
+
+/* Replaces the element at the last position in the list.
+   Returns its node.
+   The list must be non-empty.  */
+/* declared in gl_xlist.h */
+extern gl_list_node_t gl_list_set_last (gl_list_t list, const void *elt);
+/* Likewise.  Returns NULL upon out-of-memory.  */
+_GL_ATTRIBUTE_NODISCARD
+extern gl_list_node_t gl_list_nx_set_last (gl_list_t list, const void *elt);
+
+/* Searches whether an element is already in the list.
+   Returns its node if found, or NULL if not present in the list.  */
 extern gl_list_node_t gl_list_search (gl_list_t list, const void *elt);
 
-/* Search whether an element is already in the list,
+/* Searches whether an element is already in the list,
    at a position >= START_INDEX.
-   Return its node if found, or NULL if not present in the list.  */
+   Returns its node if found, or NULL if not present in the list.  */
 extern gl_list_node_t gl_list_search_from (gl_list_t list, size_t start_index,
                                            const void *elt);
 
-/* Search whether an element is already in the list,
+/* Searches whether an element is already in the list,
    at a position >= START_INDEX and < END_INDEX.
-   Return its node if found, or NULL if not present in the list.  */
+   Returns its node if found, or NULL if not present in the list.  */
 extern gl_list_node_t gl_list_search_from_to (gl_list_t list,
                                               size_t start_index,
                                               size_t end_index,
                                               const void *elt);
 
-/* Search whether an element is already in the list.
-   Return its position if found, or (size_t)(-1) if not present in the list.  */
+/* Searches whether an element is already in the list.
+   Returns its position if found, or (size_t)(-1) if not present in the list.  */
 extern size_t gl_list_indexof (gl_list_t list, const void *elt);
 
-/* Search whether an element is already in the list,
+/* Searches whether an element is already in the list,
    at a position >= START_INDEX.
-   Return its position if found, or (size_t)(-1) if not present in the list.  */
+   Returns its position if found, or (size_t)(-1) if not present in the list.  */
 extern size_t gl_list_indexof_from (gl_list_t list, size_t start_index,
                                     const void *elt);
 
-/* Search whether an element is already in the list,
+/* Searches whether an element is already in the list,
    at a position >= START_INDEX and < END_INDEX.
-   Return its position if found, or (size_t)(-1) if not present in the list.  */
+   Returns its position if found, or (size_t)(-1) if not present in the list.  */
 extern size_t gl_list_indexof_from_to (gl_list_t list,
                                        size_t start_index, size_t end_index,
                                        const void *elt);
 
-/* Add an element as the first element of the list.
-   Return its node.  */
+/* Adds an element as the first element of the list.
+   Returns its node.  */
 /* declared in gl_xlist.h */
 extern gl_list_node_t gl_list_add_first (gl_list_t list, const void *elt);
-/* Likewise.  Return NULL upon out-of-memory.  */
-extern gl_list_node_t gl_list_nx_add_first (gl_list_t list, const void *elt)
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  __attribute__ ((__warn_unused_result__))
-#endif
-  ;
+/* Likewise.  Returns NULL upon out-of-memory.  */
+_GL_ATTRIBUTE_NODISCARD
+extern gl_list_node_t gl_list_nx_add_first (gl_list_t list, const void *elt);
 
-/* Add an element as the last element of the list.
-   Return its node.  */
+/* Adds an element as the last element of the list.
+   Returns its node.  */
 /* declared in gl_xlist.h */
 extern gl_list_node_t gl_list_add_last (gl_list_t list, const void *elt);
-/* Likewise.  Return NULL upon out-of-memory.  */
-extern gl_list_node_t gl_list_nx_add_last (gl_list_t list, const void *elt)
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  __attribute__ ((__warn_unused_result__))
-#endif
-  ;
+/* Likewise.  Returns NULL upon out-of-memory.  */
+_GL_ATTRIBUTE_NODISCARD
+extern gl_list_node_t gl_list_nx_add_last (gl_list_t list, const void *elt);
 
-/* Add an element before a given element node of the list.
-   Return its node.  */
+/* Adds an element before a given element node of the list.
+   Returns its node.  */
 /* declared in gl_xlist.h */
 extern gl_list_node_t gl_list_add_before (gl_list_t list, gl_list_node_t node,
                                           const void *elt);
-/* Likewise.  Return NULL upon out-of-memory.  */
+/* Likewise.  Returns NULL upon out-of-memory.  */
+_GL_ATTRIBUTE_NODISCARD
 extern gl_list_node_t gl_list_nx_add_before (gl_list_t list,
                                              gl_list_node_t node,
-                                             const void *elt)
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  __attribute__ ((__warn_unused_result__))
-#endif
-  ;
+                                             const void *elt);
 
-/* Add an element after a given element node of the list.
-   Return its node.  */
+/* Adds an element after a given element node of the list.
+   Returns its node.  */
 /* declared in gl_xlist.h */
 extern gl_list_node_t gl_list_add_after (gl_list_t list, gl_list_node_t node,
                                          const void *elt);
-/* Likewise.  Return NULL upon out-of-memory.  */
+/* Likewise.  Returns NULL upon out-of-memory.  */
+_GL_ATTRIBUTE_NODISCARD
 extern gl_list_node_t gl_list_nx_add_after (gl_list_t list, gl_list_node_t node,
-                                            const void *elt)
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  __attribute__ ((__warn_unused_result__))
-#endif
-  ;
+                                            const void *elt);
 
-/* Add an element at a given position in the list.
+/* Adds an element at a given position in the list.
    POSITION must be >= 0 and <= gl_list_size (list).  */
 /* declared in gl_xlist.h */
 extern gl_list_node_t gl_list_add_at (gl_list_t list, size_t position,
                                       const void *elt);
-/* Likewise.  Return NULL upon out-of-memory.  */
+/* Likewise.  Returns NULL upon out-of-memory.  */
+_GL_ATTRIBUTE_NODISCARD
 extern gl_list_node_t gl_list_nx_add_at (gl_list_t list, size_t position,
-                                         const void *elt)
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  __attribute__ ((__warn_unused_result__))
-#endif
-  ;
+                                         const void *elt);
 
-/* Remove an element from the list.
-   Return true.  */
+/* Removes an element from the list.
+   Returns true.  */
 extern bool gl_list_remove_node (gl_list_t list, gl_list_node_t node);
 
-/* Remove an element at a given position from the list.
+/* Removes an element at a given position from the list.
    POSITION must be >= 0 and < gl_list_size (list).
-   Return true.  */
+   Returns true.  */
 extern bool gl_list_remove_at (gl_list_t list, size_t position);
 
-/* Search and remove an element from the list.
-   Return true if it was found and removed.  */
+/* Removes the element at the first position from the list.
+   Returns true if it was found and removed, or false if the list was empty.  */
+extern bool gl_list_remove_first (gl_list_t list);
+
+/* Removes the element at the last position from the list.
+   Returns true if it was found and removed, or false if the list was empty.  */
+extern bool gl_list_remove_last (gl_list_t list);
+
+/* Searches and removes an element from the list.
+   Returns true if it was found and removed.  */
 extern bool gl_list_remove (gl_list_t list, const void *elt);
 
-/* Free an entire list.
+/* Frees an entire list.
    (But this call does not free the elements of the list.  It only invokes
    the DISPOSE_FN on each of the elements of the list, and only if the list
    is not a sublist.)  */
@@ -361,12 +405,12 @@
 
 #if 0 /* These are defined inline below.  */
 
-/* Create an iterator traversing a list.
+/* Creates an iterator traversing a list.
    The list contents must not be modified while the iterator is in use,
    except for replacing or removing the last returned element.  */
 extern gl_list_iterator_t gl_list_iterator (gl_list_t list);
 
-/* Create an iterator traversing the element with indices i,
+/* Creates an iterator traversing the element with indices i,
    start_index <= i < end_index, of a list.
    The list contents must not be modified while the iterator is in use,
    except for replacing or removing the last returned element.  */
@@ -374,13 +418,13 @@
                                                     size_t start_index,
                                                     size_t end_index);
 
-/* If there is a next element, store the next element in *ELTP, store its
-   node in *NODEP if NODEP is non-NULL, advance the iterator and return true.
-   Otherwise, return false.  */
+/* If there is a next element, stores the next element in *ELTP, stores its
+   node in *NODEP if NODEP is non-NULL, advances the iterator and returns true.
+   Otherwise, returns false.  */
 extern bool gl_list_iterator_next (gl_list_iterator_t *iterator,
                                    const void **eltp, gl_list_node_t *nodep);
 
-/* Free an iterator.  */
+/* Frees an iterator.  */
 extern void gl_list_iterator_free (gl_list_iterator_t *iterator);
 
 #endif /* End of inline functions.  */
@@ -396,21 +440,21 @@
 
 #if 0 /* Unless otherwise specified, these are defined inline below.  */
 
-/* Search whether an element is already in the list.
+/* Searches whether an element is already in the list.
    The list is assumed to be sorted with COMPAR.
-   Return its node if found, or NULL if not present in the list.
+   Returns its node if found, or NULL if not present in the list.
    If the list contains several copies of ELT, the node of the leftmost one is
    returned.  */
 extern gl_list_node_t gl_sortedlist_search (gl_list_t list,
                                             gl_listelement_compar_fn compar,
                                             const void *elt);
 
-/* Search whether an element is already in the list.
+/* Searches whether an element is already in the list.
    The list is assumed to be sorted with COMPAR.
    Only list elements with indices >= START_INDEX and < END_INDEX are
    considered; the implementation uses these bounds to minimize the number
    of COMPAR invocations.
-   Return its node if found, or NULL if not present in the list.
+   Returns its node if found, or NULL if not present in the list.
    If the list contains several copies of ELT, the node of the leftmost one is
    returned.  */
 extern gl_list_node_t gl_sortedlist_search_from_to (gl_list_t list,
@@ -419,21 +463,21 @@
                                                     size_t end_index,
                                                     const void *elt);
 
-/* Search whether an element is already in the list.
+/* Searches whether an element is already in the list.
    The list is assumed to be sorted with COMPAR.
-   Return its position if found, or (size_t)(-1) if not present in the list.
+   Returns its position if found, or (size_t)(-1) if not present in the list.
    If the list contains several copies of ELT, the position of the leftmost one
    is returned.  */
 extern size_t gl_sortedlist_indexof (gl_list_t list,
                                      gl_listelement_compar_fn compar,
                                      const void *elt);
 
-/* Search whether an element is already in the list.
+/* Searches whether an element is already in the list.
    The list is assumed to be sorted with COMPAR.
    Only list elements with indices >= START_INDEX and < END_INDEX are
    considered; the implementation uses these bounds to minimize the number
    of COMPAR invocations.
-   Return its position if found, or (size_t)(-1) if not present in the list.
+   Returns its position if found, or (size_t)(-1) if not present in the list.
    If the list contains several copies of ELT, the position of the leftmost one
    is returned.  */
 extern size_t gl_sortedlist_indexof_from_to (gl_list_t list,
@@ -442,25 +486,22 @@
                                              size_t end_index,
                                              const void *elt);
 
-/* Add an element at the appropriate position in the list.
+/* Adds an element at the appropriate position in the list.
    The list is assumed to be sorted with COMPAR.
-   Return its node.  */
+   Returns its node.  */
 /* declared in gl_xlist.h */
 extern gl_list_node_t gl_sortedlist_add (gl_list_t list,
                                          gl_listelement_compar_fn compar,
                                          const void *elt);
-/* Likewise.  Return NULL upon out-of-memory.  */
+/* Likewise.  Returns NULL upon out-of-memory.  */
+_GL_ATTRIBUTE_NODISCARD
 extern gl_list_node_t gl_sortedlist_nx_add (gl_list_t list,
                                             gl_listelement_compar_fn compar,
-                                            const void *elt)
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  __attribute__ ((__warn_unused_result__))
-#endif
-  ;
+                                            const void *elt);
 
-/* Search and remove an element from the list.
+/* Searches and removes an element from the list.
    The list is assumed to be sorted with COMPAR.
-   Return true if it was found and removed.
+   Returns true if it was found and removed.
    If the list contains several copies of ELT, only the leftmost one is
    removed.  */
 extern bool gl_sortedlist_remove (gl_list_t list,
@@ -491,6 +532,8 @@
                             const void *elt);
   gl_list_node_t (*next_node) (gl_list_t list, gl_list_node_t node);
   gl_list_node_t (*previous_node) (gl_list_t list, gl_list_node_t node);
+  gl_list_node_t (*first_node) (gl_list_t list);
+  gl_list_node_t (*last_node) (gl_list_t list);
   const void * (*get_at) (gl_list_t list, size_t position);
   gl_list_node_t (*nx_set_at) (gl_list_t list, size_t position,
                                const void *elt);
@@ -554,7 +597,9 @@
 /* Define all functions of this file as accesses to the
    struct gl_list_implementation.  */
 
-GL_LIST_INLINE gl_list_t
+GL_LIST_INLINE
+/*_GL_ATTRIBUTE_DEALLOC (gl_list_free, 1)*/
+gl_list_t
 gl_list_nx_create_empty (gl_list_implementation_t implementation,
                          gl_listelement_equals_fn equals_fn,
                          gl_listelement_hashcode_fn hashcode_fn,
@@ -566,7 +611,9 @@
                                           allow_duplicates);
 }
 
-GL_LIST_INLINE gl_list_t
+GL_LIST_INLINE
+/*_GL_ATTRIBUTE_DEALLOC (gl_list_free, 1)*/
+gl_list_t
 gl_list_nx_create (gl_list_implementation_t implementation,
                    gl_listelement_equals_fn equals_fn,
                    gl_listelement_hashcode_fn hashcode_fn,
@@ -593,10 +640,7 @@
          ->node_value (list, node);
 }
 
-GL_LIST_INLINE int
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  __attribute__ ((__warn_unused_result__))
-#endif
+_GL_ATTRIBUTE_NODISCARD GL_LIST_INLINE int
 gl_list_node_nx_set_value (gl_list_t list, gl_list_node_t node,
                            const void *elt)
 {
@@ -618,6 +662,20 @@
          ->previous_node (list, node);
 }
 
+GL_LIST_INLINE gl_list_node_t
+gl_list_first_node (gl_list_t list)
+{
+  return ((const struct gl_list_impl_base *) list)->vtable
+         ->first_node (list);
+}
+
+GL_LIST_INLINE gl_list_node_t
+gl_list_last_node (gl_list_t list)
+{
+  return ((const struct gl_list_impl_base *) list)->vtable
+         ->last_node (list);
+}
+
 GL_LIST_INLINE const void *
 gl_list_get_at (gl_list_t list, size_t position)
 {
@@ -625,16 +683,37 @@
          ->get_at (list, position);
 }
 
-GL_LIST_INLINE gl_list_node_t
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  __attribute__ ((__warn_unused_result__))
-#endif
+GL_LIST_INLINE const void *
+gl_list_get_first (gl_list_t list)
+{
+  return gl_list_get_at (list, 0);
+}
+
+GL_LIST_INLINE const void *
+gl_list_get_last (gl_list_t list)
+{
+  return gl_list_get_at (list, gl_list_size (list) - 1);
+}
+
+_GL_ATTRIBUTE_NODISCARD GL_LIST_INLINE gl_list_node_t
 gl_list_nx_set_at (gl_list_t list, size_t position, const void *elt)
 {
   return ((const struct gl_list_impl_base *) list)->vtable
          ->nx_set_at (list, position, elt);
 }
 
+_GL_ATTRIBUTE_NODISCARD GL_LIST_INLINE gl_list_node_t
+gl_list_nx_set_first (gl_list_t list, const void *elt)
+{
+  return gl_list_nx_set_at (list, 0, elt);
+}
+
+_GL_ATTRIBUTE_NODISCARD GL_LIST_INLINE gl_list_node_t
+gl_list_nx_set_last (gl_list_t list, const void *elt)
+{
+  return gl_list_nx_set_at (list, gl_list_size (list) - 1, elt);
+}
+
 GL_LIST_INLINE gl_list_node_t
 gl_list_search (gl_list_t list, const void *elt)
 {
@@ -683,50 +762,35 @@
          ->indexof_from_to (list, start_index, end_index, elt);
 }
 
-GL_LIST_INLINE gl_list_node_t
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  __attribute__ ((__warn_unused_result__))
-#endif
+_GL_ATTRIBUTE_NODISCARD GL_LIST_INLINE gl_list_node_t
 gl_list_nx_add_first (gl_list_t list, const void *elt)
 {
   return ((const struct gl_list_impl_base *) list)->vtable
          ->nx_add_first (list, elt);
 }
 
-GL_LIST_INLINE gl_list_node_t
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  __attribute__ ((__warn_unused_result__))
-#endif
+_GL_ATTRIBUTE_NODISCARD GL_LIST_INLINE gl_list_node_t
 gl_list_nx_add_last (gl_list_t list, const void *elt)
 {
   return ((const struct gl_list_impl_base *) list)->vtable
          ->nx_add_last (list, elt);
 }
 
-GL_LIST_INLINE gl_list_node_t
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  __attribute__ ((__warn_unused_result__))
-#endif
+_GL_ATTRIBUTE_NODISCARD GL_LIST_INLINE gl_list_node_t
 gl_list_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
 {
   return ((const struct gl_list_impl_base *) list)->vtable
          ->nx_add_before (list, node, elt);
 }
 
-GL_LIST_INLINE gl_list_node_t
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  __attribute__ ((__warn_unused_result__))
-#endif
+_GL_ATTRIBUTE_NODISCARD GL_LIST_INLINE gl_list_node_t
 gl_list_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
 {
   return ((const struct gl_list_impl_base *) list)->vtable
          ->nx_add_after (list, node, elt);
 }
 
-GL_LIST_INLINE gl_list_node_t
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  __attribute__ ((__warn_unused_result__))
-#endif
+_GL_ATTRIBUTE_NODISCARD GL_LIST_INLINE gl_list_node_t
 gl_list_nx_add_at (gl_list_t list, size_t position, const void *elt)
 {
   return ((const struct gl_list_impl_base *) list)->vtable
@@ -748,6 +812,26 @@
 }
 
 GL_LIST_INLINE bool
+gl_list_remove_first (gl_list_t list)
+{
+  size_t size = gl_list_size (list);
+  if (size > 0)
+    return gl_list_remove_at (list, 0);
+  else
+    return false;
+}
+
+GL_LIST_INLINE bool
+gl_list_remove_last (gl_list_t list)
+{
+  size_t size = gl_list_size (list);
+  if (size > 0)
+    return gl_list_remove_at (list, size - 1);
+  else
+    return false;
+}
+
+GL_LIST_INLINE bool
 gl_list_remove (gl_list_t list, const void *elt)
 {
   return ((const struct gl_list_impl_base *) list)->vtable
@@ -817,10 +901,7 @@
                                        elt);
 }
 
-GL_LIST_INLINE gl_list_node_t
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  __attribute__ ((__warn_unused_result__))
-#endif
+_GL_ATTRIBUTE_NODISCARD GL_LIST_INLINE gl_list_node_t
 gl_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
 {
   return ((const struct gl_list_impl_base *) list)->vtable
diff --git a/lib/gl_map.c b/lib/gl_map.c
new file mode 100644
index 0000000..0f480f2
--- /dev/null
+++ b/lib/gl_map.c
@@ -0,0 +1,21 @@
+/* Abstract map data type.
+
+   Copyright (C) 2018-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License,
+   or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#define GL_MAP_INLINE _GL_EXTERN_INLINE
+#include "gl_map.h"
diff --git a/lib/gl_map.h b/lib/gl_map.h
new file mode 100644
index 0000000..a0c9f93
--- /dev/null
+++ b/lib/gl_map.h
@@ -0,0 +1,375 @@
+/* Abstract map data type.
+   Copyright (C) 2006-2007, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2018.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_MAP_H
+#define _GL_MAP_H
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef GL_MAP_INLINE
+# define GL_MAP_INLINE _GL_INLINE
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* gl_map is an abstract map data type.  It can contain any number of
+   (key, value) pairs, where
+     - keys and values are objects ('void *' or 'const void *' pointers),
+     - There are no (key, value1) and (key, value2) pairs with the same key
+       (in the sense of a given comparator function).
+
+   There are several implementations of this map datatype, optimized for
+   different operations or for memory.  You can start using the simplest map
+   implementation, GL_ARRAY_MAP, and switch to a different implementation
+   later, when you realize which operations are performed the most frequently.
+   The API of the different implementations is exactly the same; when switching
+   to a different implementation, you only have to change the gl_map_create
+   call.
+
+   The implementations are:
+     GL_ARRAY_MAP         a growable array
+     GL_LINKEDHASH_MAP    a hash table with a linked list
+     GL_HASH_MAP          a hash table
+
+   The memory consumption is asymptotically the same: O(1) for every pair
+   in the map.  When looking more closely at the average memory consumed
+   for an object, GL_ARRAY_MAP is the most compact representation, then comes
+   GL_HASH_MAP, and GL_LINKEDHASH_MAP needs the most memory.
+
+   The guaranteed average performance of the operations is, for a map of
+   n pairs:
+
+   Operation                  ARRAY   LINKEDHASH
+                                      HASH
+
+   gl_map_size                 O(1)   O(1)
+   gl_map_get                  O(n)   O(1)
+   gl_map_put                  O(n)   O(1)
+   gl_map_remove               O(n)   O(1)
+   gl_map_search               O(n)   O(1)
+   gl_map_iterator             O(1)   O(1)
+   gl_map_iterator_next        O(1)   O(1)
+ */
+
+/* --------------------------- gl_map_t Data Type --------------------------- */
+
+/* Type of function used to compare two keys.
+   NULL denotes pointer comparison.  */
+typedef bool (*gl_mapkey_equals_fn) (const void *key1, const void *key2);
+
+/* Type of function used to compute a hash code.
+   NULL denotes a function that depends only on the pointer itself.  */
+typedef size_t (*gl_mapkey_hashcode_fn) (const void *key);
+
+#ifndef _GL_MAP_DISPOSE_FNS_DEFINED
+
+/* Type of function used to dispose a key once a (key, value) pair is removed
+   from a map.  NULL denotes a no-op.  */
+typedef void (*gl_mapkey_dispose_fn) (const void *key);
+
+/* Type of function used to dispose a value once a (key, value) pair is removed
+   from a map.  NULL denotes a no-op.  */
+typedef void (*gl_mapvalue_dispose_fn) (const void *value);
+
+# define _GL_MAP_DISPOSE_FNS_DEFINED 1
+#endif
+
+struct gl_map_impl;
+/* Type representing an entire map.  */
+typedef struct gl_map_impl * gl_map_t;
+
+struct gl_map_implementation;
+/* Type representing a map datatype implementation.  */
+typedef const struct gl_map_implementation * gl_map_implementation_t;
+
+#if 0 /* Unless otherwise specified, these are defined inline below.  */
+
+/* Creates an empty map.
+   IMPLEMENTATION is one of GL_ARRAY_MAP, GL_LINKEDHASH_MAP, GL_HASH_MAP.
+   EQUALS_FN is a key comparison function or NULL.
+   HASHCODE_FN is a key hash code function or NULL.
+   KDISPOSE_FN is a key disposal function or NULL.
+   VDISPOSE_FN is a value disposal function or NULL.  */
+/* declared in gl_xmap.h */
+extern gl_map_t gl_map_create_empty (gl_map_implementation_t implementation,
+                                     gl_mapkey_equals_fn equals_fn,
+                                     gl_mapkey_hashcode_fn hashcode_fn,
+                                     gl_mapkey_dispose_fn kdispose_fn,
+                                     gl_mapvalue_dispose_fn vdispose_fn)
+  /*_GL_ATTRIBUTE_DEALLOC (gl_map_free, 1)*/
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
+/* Likewise.  Returns NULL upon out-of-memory.  */
+extern gl_map_t gl_map_nx_create_empty (gl_map_implementation_t implementation,
+                                        gl_mapkey_equals_fn equals_fn,
+                                        gl_mapkey_hashcode_fn hashcode_fn,
+                                        gl_mapkey_dispose_fn kdispose_fn,
+                                        gl_mapvalue_dispose_fn vdispose_fn)
+  /*_GL_ATTRIBUTE_DEALLOC (gl_map_free, 1)*/;
+
+/* Returns the current number of pairs in a map.  */
+extern size_t gl_map_size (gl_map_t map);
+
+/* Searches whether a pair with the given key is already in the map.
+   Returns the value if found, or NULL if not present in the map.  */
+extern const void * gl_map_get (gl_map_t map, const void *key);
+
+/* Searches whether a pair with the given key is already in the map.
+   Returns true and sets *VALUEP to the value if found.
+   Returns false if not present in the map.  */
+extern bool gl_map_search (gl_map_t map, const void *key, const void **valuep);
+
+/* Adds a pair to a map.
+   Returns true if a pair with the given key was not already in the map and so
+   this pair was added.
+   Returns false if a pair with the given key was already in the map and only
+   its value was replaced.  */
+/* declared in gl_xmap.h */
+extern bool gl_map_put (gl_map_t map, const void *key, const void *value);
+/* Likewise.  Returns -1 upon out-of-memory.  */
+_GL_ATTRIBUTE_NODISCARD
+extern int gl_map_nx_put (gl_map_t map, const void *key, const void *value);
+
+/* Adds a pair to a map and retrieves the previous value.
+   Returns true if a pair with the given key was not already in the map and so
+   this pair was added.
+   Returns false and sets *OLDVALUEP to the previous value, if a pair with the
+   given key was already in the map and only its value was replaced.  */
+/* declared in gl_xmap.h */
+extern bool gl_map_getput (gl_map_t map, const void *key, const void *value,
+                           const void **oldvaluep);
+/* Likewise.  Returns -1 upon out-of-memory.  */
+_GL_ATTRIBUTE_NODISCARD
+extern int gl_map_nx_getput (gl_map_t map, const void *key, const void *value,
+                             const void **oldvaluep);
+
+/* Removes a pair from a map.
+   Returns true if the key was found and its pair removed.
+   Returns false otherwise.  */
+extern bool gl_map_remove (gl_map_t map, const void *key);
+
+/* Removes a pair from a map and retrieves the previous value.
+   Returns true and sets *OLDVALUEP to the previous value, if the key was found
+   and its pair removed.
+   Returns false otherwise.  */
+extern bool gl_map_getremove (gl_map_t map, const void *key,
+                              const void **oldvaluep);
+
+/* Frees an entire map.
+   (But this call does not free the keys and values of the pairs in the map.
+   It only invokes the KDISPOSE_FN on each key and the VDISPOSE_FN on each value
+   of the pairs in the map.)  */
+extern void gl_map_free (gl_map_t map);
+
+#endif /* End of inline and gl_xmap.h-defined functions.  */
+
+/* ---------------------- gl_map_iterator_t Data Type ---------------------- */
+
+/* Functions for iterating through a map.
+   Note: Iterating through a map of type GL_HASH_MAP returns the pairs in an
+   unpredictable order.  If you need a predictable order, use GL_LINKEDHASH_MAP
+   instead of GL_HASH_MAP.  */
+
+/* Type of an iterator that traverses a map.
+   This is a fixed-size struct, so that creation of an iterator doesn't need
+   memory allocation on the heap.  */
+typedef struct
+{
+  /* For fast dispatch of gl_map_iterator_next.  */
+  const struct gl_map_implementation *vtable;
+  /* For detecting whether the last returned pair was removed.  */
+  gl_map_t map;
+  size_t count;
+  /* Other, implementation-private fields.  */
+  void *p; void *q;
+  size_t i; size_t j;
+} gl_map_iterator_t;
+
+#if 0 /* These are defined inline below.  */
+
+/* Creates an iterator traversing a map.
+   The map's contents must not be modified while the iterator is in use,
+   except for modifying the value of the last returned key or removing the
+   last returned pair.  */
+extern gl_map_iterator_t gl_map_iterator (gl_map_t map);
+
+/* If there is a next pair, stores the next pair in *KEYP and *VALUEP, advances
+   the iterator, and returns true.  Otherwise, returns false.  */
+extern bool gl_map_iterator_next (gl_map_iterator_t *iterator,
+                                  const void **keyp, const void **valuep);
+
+/* Frees an iterator.  */
+extern void gl_map_iterator_free (gl_map_iterator_t *iterator);
+
+#endif /* End of inline functions.  */
+
+/* ------------------------- Implementation Details ------------------------- */
+
+struct gl_map_implementation
+{
+  /* gl_map_t functions.  */
+  gl_map_t (*nx_create_empty) (gl_map_implementation_t implementation,
+                               gl_mapkey_equals_fn equals_fn,
+                               gl_mapkey_hashcode_fn hashcode_fn,
+                               gl_mapkey_dispose_fn kdispose_fn,
+                               gl_mapvalue_dispose_fn vdispose_fn);
+  size_t (*size) (gl_map_t map);
+  bool (*search) (gl_map_t map, const void *key, const void **valuep);
+  int (*nx_getput) (gl_map_t map, const void *key, const void *value,
+                    const void **oldvaluep);
+  bool (*getremove) (gl_map_t map, const void *key, const void **oldvaluep);
+  void (*map_free) (gl_map_t map);
+  /* gl_map_iterator_t functions.  */
+  gl_map_iterator_t (*iterator) (gl_map_t map);
+  bool (*iterator_next) (gl_map_iterator_t *iterator,
+                         const void **keyp, const void **valuep);
+  void (*iterator_free) (gl_map_iterator_t *iterator);
+};
+
+struct gl_map_impl_base
+{
+  const struct gl_map_implementation *vtable;
+  gl_mapkey_equals_fn equals_fn;
+  gl_mapkey_dispose_fn kdispose_fn;
+  gl_mapvalue_dispose_fn vdispose_fn;
+};
+
+/* Define most functions of this file as accesses to the
+   struct gl_map_implementation.  */
+
+GL_MAP_INLINE
+/*_GL_ATTRIBUTE_DEALLOC (gl_map_free, 1)*/
+gl_map_t
+gl_map_nx_create_empty (gl_map_implementation_t implementation,
+                        gl_mapkey_equals_fn equals_fn,
+                        gl_mapkey_hashcode_fn hashcode_fn,
+                        gl_mapkey_dispose_fn kdispose_fn,
+                        gl_mapvalue_dispose_fn vdispose_fn)
+{
+  return implementation->nx_create_empty (implementation,
+                                          equals_fn, hashcode_fn,
+                                          kdispose_fn, vdispose_fn);
+}
+
+GL_MAP_INLINE size_t
+gl_map_size (gl_map_t map)
+{
+  return ((const struct gl_map_impl_base *) map)->vtable->size (map);
+}
+
+GL_MAP_INLINE bool
+gl_map_search (gl_map_t map, const void *key, const void **valuep)
+{
+  return ((const struct gl_map_impl_base *) map)->vtable
+         ->search (map, key, valuep);
+}
+
+_GL_ATTRIBUTE_NODISCARD GL_MAP_INLINE int
+gl_map_nx_getput (gl_map_t map, const void *key, const void *value,
+                   const void **oldvaluep)
+{
+  return ((const struct gl_map_impl_base *) map)->vtable
+         ->nx_getput (map, key, value, oldvaluep);
+}
+
+GL_MAP_INLINE bool
+gl_map_getremove (gl_map_t map, const void *key, const void **oldvaluep)
+{
+  return ((const struct gl_map_impl_base *) map)->vtable
+         ->getremove (map, key, oldvaluep);
+}
+
+GL_MAP_INLINE void
+gl_map_free (gl_map_t map)
+{
+  ((const struct gl_map_impl_base *) map)->vtable->map_free (map);
+}
+
+GL_MAP_INLINE gl_map_iterator_t
+gl_map_iterator (gl_map_t map)
+{
+  return ((const struct gl_map_impl_base *) map)->vtable->iterator (map);
+}
+
+GL_MAP_INLINE bool
+gl_map_iterator_next (gl_map_iterator_t *iterator,
+                      const void **keyp, const void **valuep)
+{
+  return iterator->vtable->iterator_next (iterator, keyp, valuep);
+}
+
+GL_MAP_INLINE void
+gl_map_iterator_free (gl_map_iterator_t *iterator)
+{
+  iterator->vtable->iterator_free (iterator);
+}
+
+/* Define the convenience functions, that is, the functions that are independent
+   of the implementation.  */
+
+GL_MAP_INLINE const void *
+gl_map_get (gl_map_t map, const void *key)
+{
+  const void *value = NULL;
+  gl_map_search (map, key, &value);
+  return value;
+}
+
+_GL_ATTRIBUTE_NODISCARD GL_MAP_INLINE int
+gl_map_nx_put (gl_map_t map, const void *key, const void *value)
+{
+  const void *oldvalue;
+  int result = gl_map_nx_getput (map, key, value, &oldvalue);
+  if (result == 0)
+    {
+      gl_mapvalue_dispose_fn vdispose_fn =
+        ((const struct gl_map_impl_base *) map)->vdispose_fn;
+      if (vdispose_fn != NULL)
+        vdispose_fn (oldvalue);
+    }
+  return result;
+}
+
+GL_MAP_INLINE bool
+gl_map_remove (gl_map_t map, const void *key)
+{
+  const void *oldvalue;
+  bool result = gl_map_getremove (map, key, &oldvalue);
+  if (result)
+    {
+      gl_mapvalue_dispose_fn vdispose_fn =
+        ((const struct gl_map_impl_base *) map)->vdispose_fn;
+      if (vdispose_fn != NULL)
+        vdispose_fn (oldvalue);
+    }
+  return result;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif /* _GL_MAP_H */
diff --git a/lib/gl_oset.c b/lib/gl_oset.c
new file mode 100644
index 0000000..a77bbbe
--- /dev/null
+++ b/lib/gl_oset.c
@@ -0,0 +1,21 @@
+/* Abstract ordered set data type.
+
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#define GL_OSET_INLINE _GL_EXTERN_INLINE
+#include "gl_oset.h"
diff --git a/lib/gl_oset.h b/lib/gl_oset.h
new file mode 100644
index 0000000..44e7ef3
--- /dev/null
+++ b/lib/gl_oset.h
@@ -0,0 +1,342 @@
+/* Abstract ordered set data type.
+   Copyright (C) 2006-2007, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_OSET_H
+#define _GL_OSET_H
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef GL_OSET_INLINE
+# define GL_OSET_INLINE _GL_INLINE
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* gl_oset is an abstract ordered set data type.  It can contain any number
+   of objects ('void *' or 'const void *' pointers) in the order of a given
+   comparator function.  Duplicates (in the sense of the comparator) are
+   forbidden.
+
+   There are several implementations of this ordered set datatype, optimized
+   for different operations or for memory.  You can start using the simplest
+   ordered set implementation, GL_ARRAY_OSET, and switch to a different
+   implementation later, when you realize which operations are performed
+   the most frequently.  The API of the different implementations is exactly
+   the same; when switching to a different implementation, you only have to
+   change the gl_oset_create call.
+
+   The implementations are:
+     GL_ARRAY_OSET        a growable array
+     GL_AVLTREE_OSET      a binary tree (AVL tree)
+     GL_RBTREE_OSET       a binary tree (red-black tree)
+
+   The memory consumption is asymptotically the same: O(1) for every object
+   in the set.  When looking more closely at the average memory consumed
+   for an object, GL_ARRAY_OSET is the most compact representation, and
+   GL_AVLTREE_OSET, GL_RBTREE_OSET need more memory.
+
+   The guaranteed average performance of the operations is, for a set of
+   n elements:
+
+   Operation                  ARRAY     TREE
+
+   gl_oset_size                O(1)     O(1)
+   gl_oset_add                 O(n)   O(log n)
+   gl_oset_remove              O(n)   O(log n)
+   gl_oset_update              O(n)   O(log n)
+   gl_oset_search            O(log n) O(log n)
+   gl_oset_search_atleast    O(log n) O(log n)
+   gl_oset_iterator            O(1)   O(log n)
+   gl_oset_iterator_atleast  O(log n) O(log n)
+   gl_oset_iterator_next       O(1)   O(log n)
+ */
+
+/* -------------------------- gl_oset_t Data Type -------------------------- */
+
+/* Type of function used to compare two elements.  Same as for qsort().
+   NULL denotes pointer comparison.  */
+typedef int (*gl_setelement_compar_fn) (const void *elt1, const void *elt2);
+
+#ifndef _GL_SETELEMENT_DISPOSE_FN_DEFINED
+/* Type of function used to dispose an element once it's removed from a set.
+   NULL denotes a no-op.  */
+typedef void (*gl_setelement_dispose_fn) (const void *elt);
+# define _GL_SETELEMENT_DISPOSE_FN_DEFINED 1
+#endif
+
+/* Type of function used to compare an element with a threshold.
+   Returns true if the element is greater or equal than the threshold.  */
+typedef bool (*gl_setelement_threshold_fn) (const void *elt, const void *threshold);
+
+struct gl_oset_impl;
+/* Type representing an entire ordered set.  */
+typedef struct gl_oset_impl * gl_oset_t;
+
+struct gl_oset_implementation;
+/* Type representing a ordered set datatype implementation.  */
+typedef const struct gl_oset_implementation * gl_oset_implementation_t;
+
+#if 0 /* Unless otherwise specified, these are defined inline below.  */
+
+/* Creates an empty set.
+   IMPLEMENTATION is one of GL_ARRAY_OSET, GL_AVLTREE_OSET, GL_RBTREE_OSET.
+   COMPAR_FN is an element comparison function or NULL.
+   DISPOSE_FN is an element disposal function or NULL.  */
+/* declared in gl_xoset.h */
+extern gl_oset_t gl_oset_create_empty (gl_oset_implementation_t implementation,
+                                       gl_setelement_compar_fn compar_fn,
+                                       gl_setelement_dispose_fn dispose_fn)
+  /*_GL_ATTRIBUTE_DEALLOC (gl_oset_free, 1)*/
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
+/* Likewise.  Returns NULL upon out-of-memory.  */
+extern gl_oset_t gl_oset_nx_create_empty (gl_oset_implementation_t implementation,
+                                          gl_setelement_compar_fn compar_fn,
+                                          gl_setelement_dispose_fn dispose_fn)
+  /*_GL_ATTRIBUTE_DEALLOC (gl_oset_free, 1)*/;
+
+/* Returns the current number of elements in an ordered set.  */
+extern size_t gl_oset_size (gl_oset_t set);
+
+/* Searches whether an element is already in the ordered set.
+   Returns true if found, or false if not present in the set.  */
+extern bool gl_oset_search (gl_oset_t set, const void *elt);
+
+/* Searches the least element in the ordered set that compares greater or equal
+   to the given THRESHOLD.  The representation of the THRESHOLD is defined
+   by the THRESHOLD_FN.
+   Returns true and stores the found element in *ELTP if found, otherwise returns
+   false.  */
+extern bool gl_oset_search_atleast (gl_oset_t set,
+                                    gl_setelement_threshold_fn threshold_fn,
+                                    const void *threshold,
+                                    const void **eltp);
+
+/* Adds an element to an ordered set.
+   Returns true if it was not already in the set and added, false otherwise.  */
+/* declared in gl_xoset.h */
+extern bool gl_oset_add (gl_oset_t set, const void *elt);
+
+/* Likewise.  Returns -1 upon out-of-memory.  */
+_GL_ATTRIBUTE_NODISCARD
+extern int gl_oset_nx_add (gl_oset_t set, const void *elt);
+
+/* Removes an element from an ordered set.
+   Returns true if it was found and removed.  */
+extern bool gl_oset_remove (gl_oset_t set, const void *elt);
+
+/* Invokes ACTION (ELT, ACTION_DATA) and updates the given ordered set if,
+   during this invocation, the attributes/properties of the element ELT change
+   in a way that influences the comparison function.
+   Warning: During the invocation of ACTION, the ordered set is inconsistent
+   and must not be accessed!
+   Returns 1 if the position of the element in the ordered set has changed as
+   a consequence, 0 if the element stayed at the same position, or -1 if it
+   collided with another element and was therefore removed.  */
+extern int gl_oset_update (gl_oset_t set, const void *elt,
+                           void (*action) (const void *elt, void *action_data),
+                           void *action_data);
+
+/* Frees an entire ordered set.
+   (But this call does not free the elements of the set.  It only invokes
+   the DISPOSE_FN on each of the elements of the set.)  */
+extern void gl_oset_free (gl_oset_t set);
+
+#endif /* End of inline and gl_xoset.h-defined functions.  */
+
+/* --------------------- gl_oset_iterator_t Data Type --------------------- */
+
+/* Functions for iterating through an ordered set.  */
+
+/* Type of an iterator that traverses an ordered set.
+   This is a fixed-size struct, so that creation of an iterator doesn't need
+   memory allocation on the heap.  */
+typedef struct
+{
+  /* For fast dispatch of gl_oset_iterator_next.  */
+  const struct gl_oset_implementation *vtable;
+  /* For detecting whether the last returned element was removed.  */
+  gl_oset_t set;
+  size_t count;
+  /* Other, implementation-private fields.  */
+  void *p; void *q;
+  size_t i; size_t j;
+} gl_oset_iterator_t;
+
+#if 0 /* These are defined inline below.  */
+
+/* Creates an iterator traversing an ordered set.
+   The set's contents must not be modified while the iterator is in use,
+   except for removing the last returned element.  */
+extern gl_oset_iterator_t gl_oset_iterator (gl_oset_t set);
+
+/* Creates an iterator traversing the tail of an ordered set, that comprises
+   the elements that compare greater or equal to the given THRESHOLD.  The
+   representation of the THRESHOLD is defined by the THRESHOLD_FN.  */
+extern gl_oset_iterator_t gl_oset_iterator_atleast (gl_oset_t set,
+                                                    gl_setelement_threshold_fn threshold_fn,
+                                                    const void *threshold);
+
+/* If there is a next element, stores the next element in *ELTP, advances the
+   iterator and returns true.  Otherwise, returns false.  */
+extern bool gl_oset_iterator_next (gl_oset_iterator_t *iterator,
+                                   const void **eltp);
+
+/* Frees an iterator.  */
+extern void gl_oset_iterator_free (gl_oset_iterator_t *iterator);
+
+#endif /* End of inline functions.  */
+
+/* ------------------------ Implementation Details ------------------------ */
+
+struct gl_oset_implementation
+{
+  /* gl_oset_t functions.  */
+  gl_oset_t (*nx_create_empty) (gl_oset_implementation_t implementation,
+                                gl_setelement_compar_fn compar_fn,
+                                gl_setelement_dispose_fn dispose_fn);
+  size_t (*size) (gl_oset_t set);
+  bool (*search) (gl_oset_t set, const void *elt);
+  bool (*search_atleast) (gl_oset_t set,
+                          gl_setelement_threshold_fn threshold_fn,
+                          const void *threshold, const void **eltp);
+  int (*nx_add) (gl_oset_t set, const void *elt);
+  bool (*remove_elt) (gl_oset_t set, const void *elt);
+  int (*update) (gl_oset_t set, const void *elt,
+                 void (*action) (const void * /*elt*/, void * /*action_data*/),
+                 void *action_data);
+  void (*oset_free) (gl_oset_t set);
+  /* gl_oset_iterator_t functions.  */
+  gl_oset_iterator_t (*iterator) (gl_oset_t set);
+  gl_oset_iterator_t (*iterator_atleast) (gl_oset_t set,
+                                          gl_setelement_threshold_fn threshold_fn,
+                                          const void *threshold);
+  bool (*iterator_next) (gl_oset_iterator_t *iterator, const void **eltp);
+  void (*iterator_free) (gl_oset_iterator_t *iterator);
+};
+
+struct gl_oset_impl_base
+{
+  const struct gl_oset_implementation *vtable;
+  gl_setelement_compar_fn compar_fn;
+  gl_setelement_dispose_fn dispose_fn;
+};
+
+/* Define all functions of this file as accesses to the
+   struct gl_oset_implementation.  */
+
+GL_OSET_INLINE
+/*_GL_ATTRIBUTE_DEALLOC (gl_oset_free, 1)*/
+gl_oset_t
+gl_oset_nx_create_empty (gl_oset_implementation_t implementation,
+                         gl_setelement_compar_fn compar_fn,
+                         gl_setelement_dispose_fn dispose_fn)
+{
+  return implementation->nx_create_empty (implementation, compar_fn,
+                                          dispose_fn);
+}
+
+GL_OSET_INLINE size_t
+gl_oset_size (gl_oset_t set)
+{
+  return ((const struct gl_oset_impl_base *) set)->vtable->size (set);
+}
+
+GL_OSET_INLINE bool
+gl_oset_search (gl_oset_t set, const void *elt)
+{
+  return ((const struct gl_oset_impl_base *) set)->vtable->search (set, elt);
+}
+
+GL_OSET_INLINE bool
+gl_oset_search_atleast (gl_oset_t set,
+                        gl_setelement_threshold_fn threshold_fn,
+                        const void *threshold, const void **eltp)
+{
+  return ((const struct gl_oset_impl_base *) set)->vtable
+         ->search_atleast (set, threshold_fn, threshold, eltp);
+}
+
+_GL_ATTRIBUTE_NODISCARD GL_OSET_INLINE int
+gl_oset_nx_add (gl_oset_t set, const void *elt)
+{
+  return ((const struct gl_oset_impl_base *) set)->vtable->nx_add (set, elt);
+}
+
+GL_OSET_INLINE bool
+gl_oset_remove (gl_oset_t set, const void *elt)
+{
+  return ((const struct gl_oset_impl_base *) set)->vtable
+         ->remove_elt (set, elt);
+}
+
+GL_OSET_INLINE int
+gl_oset_update (gl_oset_t set, const void *elt,
+                void (*action) (const void * /*elt*/, void * /*action_data*/),
+                void *action_data)
+{
+  return ((const struct gl_oset_impl_base *) set)->vtable
+         ->update (set, elt, action, action_data);
+}
+
+GL_OSET_INLINE void
+gl_oset_free (gl_oset_t set)
+{
+  ((const struct gl_oset_impl_base *) set)->vtable->oset_free (set);
+}
+
+GL_OSET_INLINE gl_oset_iterator_t
+gl_oset_iterator (gl_oset_t set)
+{
+  return ((const struct gl_oset_impl_base *) set)->vtable->iterator (set);
+}
+
+GL_OSET_INLINE gl_oset_iterator_t
+gl_oset_iterator_atleast (gl_oset_t set,
+                          gl_setelement_threshold_fn threshold_fn,
+                          const void *threshold)
+{
+  return ((const struct gl_oset_impl_base *) set)->vtable
+         ->iterator_atleast (set, threshold_fn, threshold);
+}
+
+GL_OSET_INLINE bool
+gl_oset_iterator_next (gl_oset_iterator_t *iterator, const void **eltp)
+{
+  return iterator->vtable->iterator_next (iterator, eltp);
+}
+
+GL_OSET_INLINE void
+gl_oset_iterator_free (gl_oset_iterator_t *iterator)
+{
+  iterator->vtable->iterator_free (iterator);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif /* _GL_OSET_H */
diff --git a/lib/gl_rbtree_ordered.h b/lib/gl_rbtree_ordered.h
new file mode 100644
index 0000000..9479879
--- /dev/null
+++ b/lib/gl_rbtree_ordered.h
@@ -0,0 +1,800 @@
+/* Ordered {set,map} data type implemented by a binary tree.
+   Copyright (C) 2006-2007, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* A red-black tree is a binary tree where every node is colored black or
+   red such that
+   1. The root is black.
+   2. No red node has a red parent.
+      Or equivalently: No red node has a red child.
+   3. All paths from the root down to any NULL endpoint contain the same
+      number of black nodes.
+   Let's call this the "black-height" bh of the tree.  It follows that every
+   such path contains exactly bh black and between 0 and bh red nodes.  (The
+   extreme cases are a path containing only black nodes, and a path colored
+   alternately black-red-black-red-...-black-red.)  The height of the tree
+   therefore is >= bh, <= 2*bh.
+ */
+
+/* Color of a node.  */
+typedef enum color { BLACK, RED } color_t;
+
+/* Tree node implementation, valid for this file only.  */
+struct NODE_IMPL
+{
+  struct NODE_IMPL *left;   /* left branch, or NULL */
+  struct NODE_IMPL *right;  /* right branch, or NULL */
+  /* Parent pointer, or NULL. The parent pointer is not needed for most
+     operations.  It is needed so that a NODE_T can be returned without
+     memory allocation, on which the functions <container>_remove_node,
+     <container>_add_before, <container>_add_after can be implemented.  */
+  struct NODE_IMPL *parent;
+  color_t color;                    /* node's color */
+  NODE_PAYLOAD_FIELDS
+};
+typedef struct NODE_IMPL * NODE_T;
+
+/* Concrete CONTAINER_IMPL type, valid for this file only.  */
+struct CONTAINER_IMPL
+{
+  struct CONTAINER_IMPL_BASE base;
+  struct NODE_IMPL *root;           /* root node or NULL */
+  size_t count;                     /* number of nodes */
+};
+
+/* A red-black tree of height h has a black-height bh >= ceil(h/2) and
+   therefore at least 2^ceil(h/2) - 1 elements.  So, h <= 116 (because a tree
+   of height h >= 117 would have at least 2^59 - 1 elements, and because even
+   on 64-bit machines,
+     sizeof (NODE_IMPL) * (2^59 - 1) > 2^64
+   this would exceed the address space of the machine.  */
+#define MAXHEIGHT 116
+
+/* Rotates left a subtree.
+
+                         B                         D
+                       /   \                     /   \
+                     A       D       -->       B       E
+                            / \               / \
+                           C   E             A   C
+
+   Changes the tree structure, updates the branch sizes.
+   The caller must update the colors and register D as child of its parent.  */
+static NODE_T
+rotate_left (NODE_T b_node, NODE_T d_node)
+{
+  NODE_T c_node = d_node->left;
+
+  b_node->right = c_node;
+  d_node->left = b_node;
+
+  d_node->parent = b_node->parent;
+  b_node->parent = d_node;
+  if (c_node != NULL)
+    c_node->parent = b_node;
+
+  return d_node;
+}
+
+/* Rotates right a subtree.
+
+                           D                     B
+                         /   \                 /   \
+                       B       E     -->     A       D
+                      / \                           / \
+                     A   C                         C   E
+
+   Changes the tree structure, updates the branch sizes.
+   The caller must update the colors and register B as child of its parent.  */
+static NODE_T
+rotate_right (NODE_T b_node, NODE_T d_node)
+{
+  NODE_T c_node = b_node->right;
+
+  d_node->left = c_node;
+  b_node->right = d_node;
+
+  b_node->parent = d_node->parent;
+  d_node->parent = b_node;
+  if (c_node != NULL)
+    c_node->parent = d_node;
+
+  return b_node;
+}
+
+/* Ensures the tree is balanced, after an insertion operation.
+   Also assigns node->color.
+   parent is the given node's parent, known to be non-NULL.  */
+static void
+rebalance_after_add (CONTAINER_T container, NODE_T node, NODE_T parent)
+{
+  for (;;)
+    {
+      /* At this point, parent = node->parent != NULL.
+         Think of node->color being RED (although node->color is not yet
+         assigned.)  */
+      NODE_T grandparent;
+      NODE_T uncle;
+
+      if (parent->color == BLACK)
+        {
+          /* A RED color for node is acceptable.  */
+          node->color = RED;
+          return;
+        }
+
+      grandparent = parent->parent;
+      /* Since parent is RED, we know that
+         grandparent is != NULL and colored BLACK.  */
+
+      if (grandparent->left == parent)
+        uncle = grandparent->right;
+      else if (grandparent->right == parent)
+        uncle = grandparent->left;
+      else
+        abort ();
+
+      if (uncle != NULL && uncle->color == RED)
+        {
+          /* Change grandparent from BLACK to RED, and
+             change parent and uncle from RED to BLACK.
+             This makes it acceptable for node to be RED.  */
+          node->color = RED;
+          parent->color = uncle->color = BLACK;
+          node = grandparent;
+        }
+      else
+        {
+          /* grandparent and uncle are BLACK.  parent is RED.  node wants
+             to be RED too.
+             In this case, recoloring is not sufficient.  Need to perform
+             one or two rotations.  */
+          NODE_T *grandparentp;
+
+          if (grandparent->parent == NULL)
+            grandparentp = &container->root;
+          else if (grandparent->parent->left == grandparent)
+            grandparentp = &grandparent->parent->left;
+          else if (grandparent->parent->right == grandparent)
+            grandparentp = &grandparent->parent->right;
+          else
+            abort ();
+
+          if (grandparent->left == parent)
+            {
+              if (parent->right == node)
+                {
+                  /* Rotation between node and parent.  */
+                  grandparent->left = rotate_left (parent, node);
+                  node = parent;
+                  parent = grandparent->left;
+                }
+              /* grandparent and uncle are BLACK.  parent and node want to be
+                 RED.  parent = grandparent->left.  node = parent->left.
+
+                      grandparent              parent
+                         bh+1                   bh+1
+                         /   \                 /   \
+                     parent  uncle    -->   node  grandparent
+                      bh      bh             bh      bh
+                      / \                           / \
+                   node  C                         C  uncle
+                    bh   bh                       bh    bh
+               */
+              *grandparentp = rotate_right (parent, grandparent);
+              parent->color = BLACK;
+              node->color = grandparent->color = RED;
+            }
+          else /* grandparent->right == parent */
+            {
+              if (parent->left == node)
+                {
+                  /* Rotation between node and parent.  */
+                  grandparent->right = rotate_right (node, parent);
+                  node = parent;
+                  parent = grandparent->right;
+                }
+              /* grandparent and uncle are BLACK.  parent and node want to be
+                 RED.  parent = grandparent->right.  node = parent->right.
+
+                    grandparent                    parent
+                       bh+1                         bh+1
+                       /   \                       /   \
+                   uncle  parent     -->   grandparent  node
+                     bh     bh                  bh       bh
+                            / \                 / \
+                           C  node          uncle  C
+                          bh   bh            bh    bh
+               */
+              *grandparentp = rotate_left (grandparent, parent);
+              parent->color = BLACK;
+              node->color = grandparent->color = RED;
+            }
+          return;
+        }
+
+      /* Start again with a new (node, parent) pair.  */
+      parent = node->parent;
+
+      if (parent == NULL)
+        {
+          /* Change node's color from RED to BLACK.  This increases the
+             tree's black-height.  */
+          node->color = BLACK;
+          return;
+        }
+    }
+}
+
+/* Ensures the tree is balanced, after a deletion operation.
+   CHILD was a grandchild of PARENT and is now its child.  Between them,
+   a black node was removed.  CHILD is also black, or NULL.
+   (CHILD can also be NULL.  But PARENT is non-NULL.)  */
+static void
+rebalance_after_remove (CONTAINER_T container, NODE_T child, NODE_T parent)
+{
+  for (;;)
+    {
+      /* At this point, we reduced the black-height of the CHILD subtree by 1.
+         To make up, either look for a possibility to turn a RED to a BLACK
+         node, or try to reduce the black-height tree of CHILD's sibling
+         subtree as well.  */
+      NODE_T *parentp;
+
+      if (parent->parent == NULL)
+        parentp = &container->root;
+      else if (parent->parent->left == parent)
+        parentp = &parent->parent->left;
+      else if (parent->parent->right == parent)
+        parentp = &parent->parent->right;
+      else
+        abort ();
+
+      if (parent->left == child)
+        {
+          NODE_T sibling = parent->right;
+          /* sibling's black-height is >= 1.  In particular,
+             sibling != NULL.
+
+                      parent
+                       /   \
+                   child  sibling
+                     bh    bh+1
+           */
+
+          if (sibling->color == RED)
+            {
+              /* sibling is RED, hence parent is BLACK and sibling's children
+                 are non-NULL and BLACK.
+
+                      parent                       sibling
+                       bh+2                         bh+2
+                       /   \                        /   \
+                   child  sibling     -->       parent    SR
+                     bh    bh+1                  bh+1    bh+1
+                            / \                  / \
+                          SL   SR            child  SL
+                         bh+1 bh+1             bh  bh+1
+               */
+              *parentp = rotate_left (parent, sibling);
+              parent->color = RED;
+              sibling->color = BLACK;
+
+              /* Concentrate on the subtree of parent.  The new sibling is
+                 one of the old sibling's children, and known to be BLACK.  */
+              parentp = &sibling->left;
+              sibling = parent->right;
+            }
+          /* Now we know that sibling is BLACK.
+
+                      parent
+                       /   \
+                   child  sibling
+                     bh    bh+1
+           */
+          if (sibling->right != NULL && sibling->right->color == RED)
+            {
+              /*
+                      parent                     sibling
+                     bh+1|bh+2                  bh+1|bh+2
+                       /   \                      /   \
+                   child  sibling    -->      parent    SR
+                     bh    bh+1                bh+1    bh+1
+                            / \                / \
+                          SL   SR           child  SL
+                          bh   bh             bh   bh
+               */
+              *parentp = rotate_left (parent, sibling);
+              sibling->color = parent->color;
+              parent->color = BLACK;
+              sibling->right->color = BLACK;
+              return;
+            }
+          else if (sibling->left != NULL && sibling->left->color == RED)
+            {
+              /*
+                      parent                   parent
+                     bh+1|bh+2                bh+1|bh+2
+                       /   \                    /   \
+                   child  sibling    -->    child    SL
+                     bh    bh+1               bh    bh+1
+                            / \                     /  \
+                          SL   SR                 SLL  sibling
+                          bh   bh                 bh     bh
+                         /  \                           /   \
+                       SLL  SLR                       SLR    SR
+                       bh    bh                       bh     bh
+
+                 where SLL, SLR, SR are all black.
+               */
+              parent->right = rotate_right (sibling->left, sibling);
+              /* Change sibling from BLACK to RED and SL from RED to BLACK.  */
+              sibling->color = RED;
+              sibling = parent->right;
+              sibling->color = BLACK;
+
+              /* Now do as in the previous case.  */
+              *parentp = rotate_left (parent, sibling);
+              sibling->color = parent->color;
+              parent->color = BLACK;
+              sibling->right->color = BLACK;
+              return;
+            }
+          else
+            {
+              if (parent->color == BLACK)
+                {
+                  /* Change sibling from BLACK to RED.  Then the entire
+                     subtree at parent has decreased its black-height.
+                              parent                   parent
+                               bh+2                     bh+1
+                               /   \                    /   \
+                           child  sibling    -->    child  sibling
+                             bh    bh+1               bh     bh
+                   */
+                  sibling->color = RED;
+
+                  child = parent;
+                }
+              else
+                {
+                  /* Change parent from RED to BLACK, but compensate by
+                     changing sibling from BLACK to RED.
+                              parent                   parent
+                               bh+1                     bh+1
+                               /   \                    /   \
+                           child  sibling    -->    child  sibling
+                             bh    bh+1               bh     bh
+                   */
+                  parent->color = BLACK;
+                  sibling->color = RED;
+                  return;
+                }
+            }
+        }
+      else if (parent->right == child)
+        {
+          NODE_T sibling = parent->left;
+          /* sibling's black-height is >= 1.  In particular,
+             sibling != NULL.
+
+                      parent
+                       /   \
+                  sibling  child
+                    bh+1     bh
+           */
+
+          if (sibling->color == RED)
+            {
+              /* sibling is RED, hence parent is BLACK and sibling's children
+                 are non-NULL and BLACK.
+
+                      parent                 sibling
+                       bh+2                    bh+2
+                       /   \                  /   \
+                  sibling  child    -->     SR    parent
+                    bh+1     ch            bh+1    bh+1
+                    / \                            / \
+                  SL   SR                        SL  child
+                 bh+1 bh+1                      bh+1   bh
+               */
+              *parentp = rotate_right (sibling, parent);
+              parent->color = RED;
+              sibling->color = BLACK;
+
+              /* Concentrate on the subtree of parent.  The new sibling is
+                 one of the old sibling's children, and known to be BLACK.  */
+              parentp = &sibling->right;
+              sibling = parent->left;
+            }
+          /* Now we know that sibling is BLACK.
+
+                      parent
+                       /   \
+                  sibling  child
+                    bh+1     bh
+           */
+          if (sibling->left != NULL && sibling->left->color == RED)
+            {
+              /*
+                       parent                 sibling
+                      bh+1|bh+2              bh+1|bh+2
+                        /   \                  /   \
+                   sibling  child    -->     SL   parent
+                     bh+1     bh            bh+1   bh+1
+                     / \                           / \
+                   SL   SR                       SR  child
+                   bh   bh                       bh    bh
+               */
+              *parentp = rotate_right (sibling, parent);
+              sibling->color = parent->color;
+              parent->color = BLACK;
+              sibling->left->color = BLACK;
+              return;
+            }
+          else if (sibling->right != NULL && sibling->right->color == RED)
+            {
+              /*
+                      parent                       parent
+                     bh+1|bh+2                    bh+1|bh+2
+                       /   \                        /   \
+                   sibling  child    -->          SR    child
+                    bh+1      bh                 bh+1     bh
+                     / \                         /  \
+                   SL   SR                  sibling  SRR
+                   bh   bh                    bh      bh
+                       /  \                  /   \
+                     SRL  SRR               SL   SRL
+                     bh    bh               bh    bh
+
+                 where SL, SRL, SRR are all black.
+               */
+              parent->left = rotate_left (sibling, sibling->right);
+              /* Change sibling from BLACK to RED and SL from RED to BLACK.  */
+              sibling->color = RED;
+              sibling = parent->left;
+              sibling->color = BLACK;
+
+              /* Now do as in the previous case.  */
+              *parentp = rotate_right (sibling, parent);
+              sibling->color = parent->color;
+              parent->color = BLACK;
+              sibling->left->color = BLACK;
+              return;
+            }
+          else
+            {
+              if (parent->color == BLACK)
+                {
+                  /* Change sibling from BLACK to RED.  Then the entire
+                     subtree at parent has decreased its black-height.
+                              parent                   parent
+                               bh+2                     bh+1
+                               /   \                    /   \
+                           sibling  child    -->    sibling  child
+                            bh+1      bh              bh       bh
+                   */
+                  sibling->color = RED;
+
+                  child = parent;
+                }
+              else
+                {
+                  /* Change parent from RED to BLACK, but compensate by
+                     changing sibling from BLACK to RED.
+                              parent                   parent
+                               bh+1                     bh+1
+                               /   \                    /   \
+                           sibling  child    -->    sibling  child
+                            bh+1      bh              bh       bh
+                   */
+                  parent->color = BLACK;
+                  sibling->color = RED;
+                  return;
+                }
+            }
+        }
+      else
+        abort ();
+
+      /* Start again with a new (child, parent) pair.  */
+      parent = child->parent;
+
+#if 0 /* Already handled.  */
+      if (child != NULL && child->color == RED)
+        {
+          child->color = BLACK;
+          return;
+        }
+#endif
+
+      if (parent == NULL)
+        return;
+    }
+}
+
+static NODE_T
+gl_tree_nx_add_first (CONTAINER_T container, NODE_PAYLOAD_PARAMS)
+{
+  /* Create new node.  */
+  NODE_T new_node =
+    (struct NODE_IMPL *) malloc (sizeof (struct NODE_IMPL));
+
+  if (new_node == NULL)
+    return NULL;
+
+  new_node->left = NULL;
+  new_node->right = NULL;
+  NODE_PAYLOAD_ASSIGN(new_node)
+
+  /* Add it to the tree.  */
+  if (container->root == NULL)
+    {
+      new_node->color = BLACK;
+      container->root = new_node;
+      new_node->parent = NULL;
+    }
+  else
+    {
+      NODE_T node;
+
+      for (node = container->root; node->left != NULL; )
+        node = node->left;
+
+      node->left = new_node;
+      new_node->parent = node;
+
+      /* Color and rebalance.  */
+      rebalance_after_add (container, new_node, node);
+    }
+
+  container->count++;
+  return new_node;
+}
+
+/* Adds the already allocated NEW_NODE to the tree, right before NODE.  */
+static void
+gl_tree_add_node_before (CONTAINER_T container, NODE_T node, NODE_T new_node)
+{
+  new_node->left = NULL;
+  new_node->right = NULL;
+
+  /* Add it to the tree.  */
+  if (node->left == NULL)
+    node->left = new_node;
+  else
+    {
+      for (node = node->left; node->right != NULL; )
+        node = node->right;
+      node->right = new_node;
+    }
+  new_node->parent = node;
+
+  /* Color and rebalance.  */
+  rebalance_after_add (container, new_node, node);
+
+  container->count++;
+}
+
+static NODE_T
+gl_tree_nx_add_before (CONTAINER_T container, NODE_T node, NODE_PAYLOAD_PARAMS)
+{
+  /* Create new node.  */
+  NODE_T new_node =
+    (struct NODE_IMPL *) malloc (sizeof (struct NODE_IMPL));
+
+  if (new_node == NULL)
+    return NULL;
+
+  NODE_PAYLOAD_ASSIGN(new_node)
+
+  gl_tree_add_node_before (container, node, new_node);
+  return new_node;
+}
+
+/* Adds the already allocated NEW_NODE to the tree, right after NODE.  */
+static void
+gl_tree_add_node_after (CONTAINER_T container, NODE_T node, NODE_T new_node)
+{
+  new_node->left = NULL;
+  new_node->right = NULL;
+
+  /* Add it to the tree.  */
+  if (node->right == NULL)
+    node->right = new_node;
+  else
+    {
+      for (node = node->right; node->left != NULL; )
+        node = node->left;
+      node->left = new_node;
+    }
+  new_node->parent = node;
+
+  /* Color and rebalance.  */
+  rebalance_after_add (container, new_node, node);
+
+  container->count++;
+}
+
+static NODE_T
+gl_tree_nx_add_after (CONTAINER_T container, NODE_T node, NODE_PAYLOAD_PARAMS)
+{
+  /* Create new node.  */
+  NODE_T new_node =
+    (struct NODE_IMPL *) malloc (sizeof (struct NODE_IMPL));
+
+  if (new_node == NULL)
+    return NULL;
+
+  NODE_PAYLOAD_ASSIGN(new_node)
+
+  gl_tree_add_node_after (container, node, new_node);
+  return new_node;
+}
+
+static void
+gl_tree_remove_node_no_free (CONTAINER_T container, NODE_T node)
+{
+  NODE_T parent = node->parent;
+
+  if (node->left == NULL)
+    {
+      /* Replace node with node->right.  */
+      NODE_T child = node->right;
+
+      if (child != NULL)
+        {
+          child->parent = parent;
+          /* Since node->left == NULL, child must be RED and of height 1,
+             hence node must have been BLACK.  Recolor the child.  */
+          child->color = BLACK;
+        }
+      if (parent == NULL)
+        container->root = child;
+      else
+        {
+          if (parent->left == node)
+            parent->left = child;
+          else /* parent->right == node */
+            parent->right = child;
+
+          if (child == NULL && node->color == BLACK)
+            rebalance_after_remove (container, child, parent);
+        }
+    }
+  else if (node->right == NULL)
+    {
+      /* It is not absolutely necessary to treat this case.  But the more
+         general case below is more complicated, hence slower.  */
+      /* Replace node with node->left.  */
+      NODE_T child = node->left;
+
+      child->parent = parent;
+      /* Since node->right == NULL, child must be RED and of height 1,
+         hence node must have been BLACK.  Recolor the child.  */
+      child->color = BLACK;
+      if (parent == NULL)
+        container->root = child;
+      else
+        {
+          if (parent->left == node)
+            parent->left = child;
+          else /* parent->right == node */
+            parent->right = child;
+        }
+    }
+  else
+    {
+      /* Replace node with the rightmost element of the node->left subtree.  */
+      NODE_T subst;
+      NODE_T subst_parent;
+      NODE_T child;
+      color_t removed_color;
+
+      for (subst = node->left; subst->right != NULL; )
+        subst = subst->right;
+
+      subst_parent = subst->parent;
+
+      child = subst->left;
+
+      removed_color = subst->color;
+
+      /* The case subst_parent == node is special:  If we do nothing special,
+         we get confusion about node->left, subst->left and child->parent.
+           subst_parent == node
+           <==> The 'for' loop above terminated immediately.
+           <==> subst == subst_parent->left
+                [otherwise subst == subst_parent->right]
+         In this case, we would need to first set
+           child->parent = node; node->left = child;
+         and later - when we copy subst into node's position - again
+           child->parent = subst; subst->left = child;
+         Altogether a no-op.  */
+      if (subst_parent != node)
+        {
+          if (child != NULL)
+            child->parent = subst_parent;
+          subst_parent->right = child;
+        }
+
+      /* Copy subst into node's position.
+         (This is safer than to copy subst's value into node, keep node in
+         place, and free subst.)  */
+      if (subst_parent != node)
+        {
+          subst->left = node->left;
+          subst->left->parent = subst;
+        }
+      subst->right = node->right;
+      subst->right->parent = subst;
+      subst->color = node->color;
+      subst->parent = parent;
+      if (parent == NULL)
+        container->root = subst;
+      else if (parent->left == node)
+        parent->left = subst;
+      else /* parent->right == node */
+        parent->right = subst;
+
+      if (removed_color == BLACK)
+        {
+          if (child != NULL && child->color == RED)
+            /* Recolor the child.  */
+            child->color = BLACK;
+          else
+            /* Rebalancing starts at child's parent, that is subst_parent -
+               except when subst_parent == node.  In this case, we need to use
+               its replacement, subst.  */
+            rebalance_after_remove (container, child,
+                                    subst_parent != node ? subst_parent : subst);
+        }
+    }
+
+  container->count--;
+}
+
+static bool
+gl_tree_remove_node (CONTAINER_T container, NODE_T node)
+{
+  gl_tree_remove_node_no_free (container, node);
+  NODE_PAYLOAD_DISPOSE (container, node)
+  free (node);
+  return true;
+}
+
+/* For debugging.  */
+static unsigned int
+check_invariants (NODE_T node, NODE_T parent, size_t *counterp)
+{
+  unsigned int left_blackheight =
+    (node->left != NULL ? check_invariants (node->left, node, counterp) : 0);
+  unsigned int right_blackheight =
+    (node->right != NULL ? check_invariants (node->right, node, counterp) : 0);
+
+  if (!(node->parent == parent))
+    abort ();
+  if (!(node->color == BLACK || node->color == RED))
+    abort ();
+  if (parent == NULL && !(node->color == BLACK))
+    abort ();
+  if (!(left_blackheight == right_blackheight))
+    abort ();
+
+  (*counterp)++;
+
+  return left_blackheight + (node->color == BLACK ? 1 : 0);
+}
diff --git a/lib/gl_rbtree_oset.c b/lib/gl_rbtree_oset.c
new file mode 100644
index 0000000..d266f04
--- /dev/null
+++ b/lib/gl_rbtree_oset.c
@@ -0,0 +1,73 @@
+/* Ordered set data type implemented by a binary tree.
+   Copyright (C) 2006-2007, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "gl_rbtree_oset.h"
+
+#include <stdlib.h>
+
+/* -------------------------- gl_oset_t Data Type -------------------------- */
+
+/* Parameterization of gl_rbtree_ordered.h.  */
+#define CONTAINER_T gl_oset_t
+#define CONTAINER_IMPL gl_oset_impl
+#define CONTAINER_IMPL_BASE gl_oset_impl_base
+#define NODE_IMPL gl_oset_node_impl
+#define NODE_T gl_oset_node_t
+#define NODE_PAYLOAD_FIELDS \
+  const void *value;
+#define NODE_PAYLOAD_PARAMS \
+  const void *elt
+#define NODE_PAYLOAD_ASSIGN(node) \
+  node->value = elt;
+#define NODE_PAYLOAD_DISPOSE(container, node) \
+  if (container->base.dispose_fn != NULL) \
+    container->base.dispose_fn (node->value);
+
+#include "gl_rbtree_ordered.h"
+
+/* Generic binary tree code.  */
+#include "gl_anytree_oset.h"
+
+/* For debugging.  */
+void
+gl_rbtree_oset_check_invariants (gl_oset_t set)
+{
+  size_t counter = 0;
+  if (set->root != NULL)
+    check_invariants (set->root, NULL, &counter);
+  if (!(set->count == counter))
+    abort ();
+}
+
+const struct gl_oset_implementation gl_rbtree_oset_implementation =
+  {
+    gl_tree_nx_create_empty,
+    gl_tree_size,
+    gl_tree_search,
+    gl_tree_search_atleast,
+    gl_tree_nx_add,
+    gl_tree_remove,
+    gl_tree_update,
+    gl_tree_oset_free,
+    gl_tree_iterator,
+    gl_tree_iterator_atleast,
+    gl_tree_iterator_next,
+    gl_tree_iterator_free
+  };
diff --git a/lib/gl_rbtree_oset.h b/lib/gl_rbtree_oset.h
new file mode 100644
index 0000000..4308806
--- /dev/null
+++ b/lib/gl_rbtree_oset.h
@@ -0,0 +1,34 @@
+/* Ordered set data type implemented by a binary tree.
+   Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_RBTREE_OSET_H
+#define _GL_RBTREE_OSET_H
+
+#include "gl_oset.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_oset_implementation gl_rbtree_oset_implementation;
+#define GL_RBTREE_OSET &gl_rbtree_oset_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_RBTREE_OSET_H */
diff --git a/lib/gl_rbtreehash_list.c b/lib/gl_rbtreehash_list.c
new file mode 100644
index 0000000..d8fcb8e
--- /dev/null
+++ b/lib/gl_rbtreehash_list.c
@@ -0,0 +1,129 @@
+/* Sequential list data type implemented by a hash table with a binary tree.
+   Copyright (C) 2006, 2008-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "gl_rbtreehash_list.h"
+
+#include <stdint.h> /* for uintptr_t, SIZE_MAX */
+#include <stdlib.h>
+
+#include "gl_rbtree_oset.h"
+#include "xsize.h"
+
+#define WITH_HASHTABLE 1
+
+/* Which kind of binary trees to use for ordered sets.  Quite arbitrary.  */
+#define OSET_TREE_FLAVOR GL_RBTREE_OSET
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Generic hash-table code: Type definitions.  */
+#include "gl_anyhash1.h"
+
+/* Generic red-black tree code: Type definitions.  */
+#include "gl_anyrbtree_list1.h"
+
+/* Generic hash-table code: Low-level code.  */
+#define CONTAINER_T gl_list_t
+#define CONTAINER_COUNT(list) \
+  ((list)->root != NULL ? (list)->root->branch_size : 0)
+#include "gl_anyhash2.h"
+
+/* Generic binary tree code: Type definitions.  */
+#include "gl_anytree_list1.h"
+
+/* Hash-table with binary tree code: Handling of hash buckets.  */
+#include "gl_anytreehash_list1.h"
+
+/* Generic red-black tree code: Insertion/deletion algorithms.  */
+#include "gl_anyrbtree_list2.h"
+
+/* Generic binary tree code: Functions taking advantage of the hash table.  */
+#include "gl_anytreehash_list2.h"
+
+/* Generic binary tree code: All other functions.  */
+#include "gl_anytree_list2.h"
+
+/* For debugging.  */
+static unsigned int
+check_invariants (gl_list_node_t node, gl_list_node_t parent)
+{
+  unsigned int left_blackheight =
+    (node->left != NULL ? check_invariants (node->left, node) : 0);
+  unsigned int right_blackheight =
+    (node->right != NULL ? check_invariants (node->right, node) : 0);
+
+  if (!(node->parent == parent))
+    abort ();
+  if (!(node->branch_size
+        == (node->left != NULL ? node->left->branch_size : 0)
+           + 1 + (node->right != NULL ? node->right->branch_size : 0)))
+    abort ();
+  if (!(node->color == BLACK || node->color == RED))
+    abort ();
+  if (parent == NULL && !(node->color == BLACK))
+    abort ();
+  if (!(left_blackheight == right_blackheight))
+    abort ();
+
+  return left_blackheight + (node->color == BLACK ? 1 : 0);
+}
+void
+gl_rbtreehash_list_check_invariants (gl_list_t list)
+{
+  if (list->root != NULL)
+    check_invariants (list->root, NULL);
+}
+
+
+const struct gl_list_implementation gl_rbtreehash_list_implementation =
+  {
+    gl_tree_nx_create_empty,
+    gl_tree_nx_create,
+    gl_tree_size,
+    gl_tree_node_value,
+    gl_tree_node_nx_set_value,
+    gl_tree_next_node,
+    gl_tree_previous_node,
+    gl_tree_first_node,
+    gl_tree_last_node,
+    gl_tree_get_at,
+    gl_tree_nx_set_at,
+    gl_tree_search_from_to,
+    gl_tree_indexof_from_to,
+    gl_tree_nx_add_first,
+    gl_tree_nx_add_last,
+    gl_tree_nx_add_before,
+    gl_tree_nx_add_after,
+    gl_tree_nx_add_at,
+    gl_tree_remove_node,
+    gl_tree_remove_at,
+    gl_tree_remove,
+    gl_tree_list_free,
+    gl_tree_iterator,
+    gl_tree_iterator_from_to,
+    gl_tree_iterator_next,
+    gl_tree_iterator_free,
+    gl_tree_sortedlist_search,
+    gl_tree_sortedlist_search_from_to,
+    gl_tree_sortedlist_indexof,
+    gl_tree_sortedlist_indexof_from_to,
+    gl_tree_sortedlist_nx_add,
+    gl_tree_sortedlist_remove
+  };
diff --git a/lib/gl_rbtreehash_list.h b/lib/gl_rbtreehash_list.h
new file mode 100644
index 0000000..dbfc5eb
--- /dev/null
+++ b/lib/gl_rbtreehash_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by a hash table with a binary tree.
+   Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_RBTREEHASH_LIST_H
+#define _GL_RBTREEHASH_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_rbtreehash_list_implementation;
+#define GL_RBTREEHASH_LIST &gl_rbtreehash_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_RBTREEHASH_LIST_H */
diff --git a/lib/gl_xlist.c b/lib/gl_xlist.c
index fe3c893..16ca55f 100644
--- a/lib/gl_xlist.c
+++ b/lib/gl_xlist.c
@@ -1,3 +1,21 @@
+/* Abstract sequential list data type, with out-of-memory checking.
+
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License,
+   or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #include <config.h>
+
 #define GL_XLIST_INLINE _GL_EXTERN_INLINE
 #include "gl_xlist.h"
diff --git a/lib/gl_xlist.h b/lib/gl_xlist.h
index 87885c3..7e66ab2 100644
--- a/lib/gl_xlist.h
+++ b/lib/gl_xlist.h
@@ -1,5 +1,5 @@
 /* Abstract sequential list data type, with out-of-memory checking.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2009.
 
    This program is free software: you can redistribute it and/or modify
@@ -41,17 +41,23 @@
                                        gl_listelement_equals_fn equals_fn,
                                        gl_listelement_hashcode_fn hashcode_fn,
                                        gl_listelement_dispose_fn dispose_fn,
-                                       bool allow_duplicates);
+                                       bool allow_duplicates)
+  /*_GL_ATTRIBUTE_DEALLOC (gl_list_free, 1)*/
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
 extern gl_list_t gl_list_create (gl_list_implementation_t implementation,
                                  gl_listelement_equals_fn equals_fn,
                                  gl_listelement_hashcode_fn hashcode_fn,
                                  gl_listelement_dispose_fn dispose_fn,
                                  bool allow_duplicates,
-                                 size_t count, const void **contents);
+                                 size_t count, const void **contents)
+  /*_GL_ATTRIBUTE_DEALLOC (gl_list_free, 1)*/
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
 extern void gl_list_node_set_value (gl_list_t list, gl_list_node_t node,
                                     const void *elt);
 extern gl_list_node_t gl_list_set_at (gl_list_t list, size_t position,
                                       const void *elt);
+extern gl_list_node_t gl_list_set_first (gl_list_t list, const void *elt);
+extern gl_list_node_t gl_list_set_last (gl_list_t list, const void *elt);
 extern gl_list_node_t gl_list_add_first (gl_list_t list, const void *elt);
 extern gl_list_node_t gl_list_add_last (gl_list_t list, const void *elt);
 extern gl_list_node_t gl_list_add_before (gl_list_t list, gl_list_node_t node,
@@ -65,7 +71,10 @@
                                          const void *elt);
 #endif
 
-GL_XLIST_INLINE gl_list_t
+GL_XLIST_INLINE
+/*_GL_ATTRIBUTE_DEALLOC (gl_list_free, 1)*/
+_GL_ATTRIBUTE_RETURNS_NONNULL
+gl_list_t
 gl_list_create_empty (gl_list_implementation_t implementation,
                       gl_listelement_equals_fn equals_fn,
                       gl_listelement_hashcode_fn hashcode_fn,
@@ -80,7 +89,10 @@
   return result;
 }
 
-GL_XLIST_INLINE gl_list_t
+GL_XLIST_INLINE
+/*_GL_ATTRIBUTE_DEALLOC (gl_list_free, 1)*/
+_GL_ATTRIBUTE_RETURNS_NONNULL
+gl_list_t
 gl_list_create (gl_list_implementation_t implementation,
                 gl_listelement_equals_fn equals_fn,
                 gl_listelement_hashcode_fn hashcode_fn,
@@ -114,6 +126,24 @@
 }
 
 GL_XLIST_INLINE gl_list_node_t
+gl_list_set_first (gl_list_t list, const void *elt)
+{
+  gl_list_node_t result = gl_list_nx_set_first (list, elt);
+  if (result == NULL)
+    xalloc_die ();
+  return result;
+}
+
+GL_XLIST_INLINE gl_list_node_t
+gl_list_set_last (gl_list_t list, const void *elt)
+{
+  gl_list_node_t result = gl_list_nx_set_last (list, elt);
+  if (result == NULL)
+    xalloc_die ();
+  return result;
+}
+
+GL_XLIST_INLINE gl_list_node_t
 gl_list_add_first (gl_list_t list, const void *elt)
 {
   gl_list_node_t result = gl_list_nx_add_first (list, elt);
diff --git a/lib/gl_xmap.c b/lib/gl_xmap.c
new file mode 100644
index 0000000..866a7cb
--- /dev/null
+++ b/lib/gl_xmap.c
@@ -0,0 +1,21 @@
+/* Abstract map data type, with out-of-memory checking.
+
+   Copyright (C) 2018-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License,
+   or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#define GL_XMAP_INLINE _GL_EXTERN_INLINE
+#include "gl_xmap.h"
diff --git a/lib/gl_xmap.h b/lib/gl_xmap.h
new file mode 100644
index 0000000..01bb9de
--- /dev/null
+++ b/lib/gl_xmap.h
@@ -0,0 +1,96 @@
+/* Abstract map data type, with out-of-memory checking.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2018.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_XMAP_H
+#define _GL_XMAP_H
+
+#include "gl_map.h"
+#include "xalloc.h"
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef GL_XMAP_INLINE
+# define GL_XMAP_INLINE _GL_INLINE
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* These functions are thin wrappers around the corresponding functions with
+   _nx_ infix from gl_map.h.  Upon out-of-memory, they invoke xalloc_die (),
+   instead of returning an error indicator.  */
+#if 0 /* These are defined inline below.  */
+extern gl_map_t gl_map_create_empty (gl_map_implementation_t implementation,
+                                     gl_mapkey_equals_fn equals_fn,
+                                     gl_mapkey_hashcode_fn hashcode_fn,
+                                     gl_mapkey_dispose_fn kdispose_fn,
+                                     gl_mapvalue_dispose_fn vdispose_fn)
+  /*_GL_ATTRIBUTE_DEALLOC (gl_map_free, 1)*/
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
+extern bool gl_map_put (gl_map_t map, const void *key, const void *value);
+extern bool gl_map_getput (gl_map_t map, const void *key, const void *value,
+                           const void **oldvaluep);
+#endif
+
+GL_XMAP_INLINE
+/*_GL_ATTRIBUTE_DEALLOC (gl_map_free, 1)*/
+_GL_ATTRIBUTE_RETURNS_NONNULL
+gl_map_t
+gl_map_create_empty (gl_map_implementation_t implementation,
+                     gl_mapkey_equals_fn equals_fn,
+                     gl_mapkey_hashcode_fn hashcode_fn,
+                     gl_mapkey_dispose_fn kdispose_fn,
+                     gl_mapvalue_dispose_fn vdispose_fn)
+{
+  gl_map_t result =
+    gl_map_nx_create_empty (implementation, equals_fn, hashcode_fn,
+                            kdispose_fn, vdispose_fn);
+  if (result == NULL)
+    xalloc_die ();
+  return result;
+}
+
+GL_XMAP_INLINE bool
+gl_map_put (gl_map_t map, const void *key, const void *value)
+{
+  int result = gl_map_nx_put (map, key, value);
+  if (result < 0)
+    xalloc_die ();
+  return result;
+}
+
+GL_XMAP_INLINE bool
+gl_map_getput (gl_map_t map, const void *key, const void *value,
+               const void **oldvaluep)
+{
+  int result = gl_map_nx_getput (map, key, value, oldvaluep);
+  if (result < 0)
+    xalloc_die ();
+  return result;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif /* _GL_XMAP_H */
diff --git a/lib/glthread/lock.c b/lib/glthread/lock.c
index e471188..44335e3 100644
--- a/lib/glthread/lock.c
+++ b/lib/glthread/lock.c
@@ -1,18 +1,18 @@
 /* Locking in multithreaded situations.
-   Copyright (C) 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2005.
    Based on GCC's gthr-posix.h, gthr-posix95.h.  */
@@ -254,7 +254,7 @@
 
 # if HAVE_PTHREAD_RWLOCK && (HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER || (defined PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP && (__GNU_LIBRARY__ > 1)))
 
-#  ifdef PTHREAD_RWLOCK_INITIALIZER
+#  if defined PTHREAD_RWLOCK_INITIALIZER || defined PTHREAD_RWLOCK_INITIALIZER_NP
 
 #   if !HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER
      /* glibc with bug https://sourceware.org/bugzilla/show_bug.cgi?id=13701 */
@@ -718,6 +718,26 @@
     return 0;
 }
 
+# if !(PTHREAD_IN_USE_DETECTION_HARD || USE_POSIX_THREADS_WEAK)
+
+int
+glthread_once_multithreaded (pthread_once_t *once_control,
+                             void (*init_function) (void))
+{
+  int err = pthread_once (once_control, init_function);
+  if (err == ENOSYS)
+    {
+      /* This happens on FreeBSD 11: The pthread_once function in libc returns
+         ENOSYS.  */
+      if (glthread_once_singlethreaded (once_control))
+        init_function ();
+      return 0;
+    }
+  return err;
+}
+
+# endif
+
 #endif
 
 /* ========================================================================= */
diff --git a/lib/glthread/lock.h b/lib/glthread/lock.h
index c190e2e..cc4c519 100644
--- a/lib/glthread/lock.h
+++ b/lib/glthread/lock.h
@@ -1,18 +1,18 @@
 /* Locking in multithreaded situations.
-   Copyright (C) 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2005.
    Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-win32.h.  */
@@ -81,7 +81,9 @@
 #include <stdlib.h>
 
 #if !defined c11_threads_in_use
-# if HAVE_THREADS_H && USE_POSIX_THREADS_WEAK
+# if HAVE_THREADS_H && USE_POSIX_THREADS_FROM_LIBC
+#  define c11_threads_in_use() 1
+# elif HAVE_THREADS_H && USE_POSIX_THREADS_WEAK
 #  include <threads.h>
 #  pragma weak thrd_exit
 #  define c11_threads_in_use() (thrd_exit != NULL)
@@ -308,7 +310,7 @@
 
 # if HAVE_PTHREAD_RWLOCK && (HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER || (defined PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP && (__GNU_LIBRARY__ > 1)))
 
-#  ifdef PTHREAD_RWLOCK_INITIALIZER
+#  if defined PTHREAD_RWLOCK_INITIALIZER || defined PTHREAD_RWLOCK_INITIALIZER_NP
 
 typedef pthread_rwlock_t gl_rwlock_t;
 #   define gl_rwlock_define(STORAGECLASS, NAME) \
@@ -316,8 +318,13 @@
 #   define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
       STORAGECLASS pthread_rwlock_t NAME = gl_rwlock_initializer;
 #   if HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER
-#    define gl_rwlock_initializer \
-       PTHREAD_RWLOCK_INITIALIZER
+#    if defined PTHREAD_RWLOCK_INITIALIZER
+#     define gl_rwlock_initializer \
+        PTHREAD_RWLOCK_INITIALIZER
+#    else
+#     define gl_rwlock_initializer \
+        PTHREAD_RWLOCK_INITIALIZER_NP
+#    endif
 #    define glthread_rwlock_init(LOCK) \
        (pthread_in_use () ? pthread_rwlock_init (LOCK, NULL) : 0)
 #   else /* glibc with bug https://sourceware.org/bugzilla/show_bug.cgi?id=13701 */
@@ -500,10 +507,19 @@
 typedef pthread_once_t gl_once_t;
 # define gl_once_define(STORAGECLASS, NAME) \
     STORAGECLASS pthread_once_t NAME = PTHREAD_ONCE_INIT;
-# define glthread_once(ONCE_CONTROL, INITFUNCTION) \
-    (pthread_in_use ()                                                         \
-     ? pthread_once (ONCE_CONTROL, INITFUNCTION)                               \
-     : (glthread_once_singlethreaded (ONCE_CONTROL) ? (INITFUNCTION (), 0) : 0))
+# if PTHREAD_IN_USE_DETECTION_HARD || USE_POSIX_THREADS_WEAK
+#  define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+     (pthread_in_use ()                                                        \
+      ? pthread_once (ONCE_CONTROL, INITFUNCTION)                              \
+      : (glthread_once_singlethreaded (ONCE_CONTROL) ? (INITFUNCTION (), 0) : 0))
+# else
+#  define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+     (pthread_in_use ()                                                        \
+      ? glthread_once_multithreaded (ONCE_CONTROL, INITFUNCTION)               \
+      : (glthread_once_singlethreaded (ONCE_CONTROL) ? (INITFUNCTION (), 0) : 0))
+extern int glthread_once_multithreaded (pthread_once_t *once_control,
+                                        void (*init_function) (void));
+# endif
 extern int glthread_once_singlethreaded (pthread_once_t *once_control);
 
 # ifdef __cplusplus
diff --git a/lib/glthread/threadlib.c b/lib/glthread/threadlib.c
index 86947f5..793bc69 100644
--- a/lib/glthread/threadlib.c
+++ b/lib/glthread/threadlib.c
@@ -1,18 +1,18 @@
 /* Multithreading primitives.
-   Copyright (C) 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2005.  */
 
@@ -24,11 +24,44 @@
 
 /* Use the POSIX threads library.  */
 
+# include <errno.h>
 # include <pthread.h>
 # include <stdlib.h>
 
 # if PTHREAD_IN_USE_DETECTION_HARD
 
+#  if defined __FreeBSD__ || defined __DragonFly__                 /* FreeBSD */
+
+/* Test using pthread_key_create.  */
+
+int
+glthread_in_use (void)
+{
+  static int tested;
+  static int result; /* 1: linked with -lpthread, 0: only with libc */
+
+  if (!tested)
+    {
+      pthread_key_t key;
+      int err = pthread_key_create (&key, NULL);
+
+      if (err == ENOSYS)
+        result = 0;
+      else
+        {
+          result = 1;
+          if (err == 0)
+            pthread_key_delete (key);
+        }
+      tested = 1;
+    }
+  return result;
+}
+
+#  else                                                     /* Solaris, HP-UX */
+
+/* Test using pthread_create.  */
+
 /* The function to be executed by a dummy thread.  */
 static void *
 dummy_thread_func (void *arg)
@@ -62,6 +95,8 @@
   return result;
 }
 
+#  endif
+
 # endif
 
 #endif
diff --git a/lib/glthread/tls.c b/lib/glthread/tls.c
index 90a50e9..efac3bb 100644
--- a/lib/glthread/tls.c
+++ b/lib/glthread/tls.c
@@ -1,17 +1,17 @@
 /* Thread-local storage in multithreaded situations.
-   Copyright (C) 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2005.  */
diff --git a/lib/glthread/tls.h b/lib/glthread/tls.h
index 32775fc..aaaa4b6 100644
--- a/lib/glthread/tls.h
+++ b/lib/glthread/tls.h
@@ -1,17 +1,17 @@
 /* Thread-local storage in multithreaded situations.
-   Copyright (C) 2005, 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2005.  */
@@ -47,7 +47,9 @@
 #include <stdlib.h>
 
 #if !defined c11_threads_in_use
-# if HAVE_THREADS_H && USE_POSIX_THREADS_WEAK
+# if HAVE_THREADS_H && USE_POSIX_THREADS_FROM_LIBC
+#  define c11_threads_in_use() 1
+# elif HAVE_THREADS_H && USE_POSIX_THREADS_WEAK
 #  include <threads.h>
 #  pragma weak thrd_exit
 #  define c11_threads_in_use() (thrd_exit != NULL)
diff --git a/lib/gnulib.mk b/lib/gnulib.mk
index 5efd353..34d0dde 100644
--- a/lib/gnulib.mk
+++ b/lib/gnulib.mk
@@ -1,6 +1,6 @@
 ## DO NOT EDIT! GENERATED AUTOMATICALLY!
 ## Process this file with automake to produce Makefile.in.
-# Copyright (C) 2002-2019 Free Software Foundation, Inc.
+# Copyright (C) 2002-2021 Free Software Foundation, Inc.
 #
 # This file is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -39,6 +39,7 @@
 #  array-list \
 #  assert \
 #  assure \
+#  attribute \
 #  bitsetv \
 #  c-strcase \
 #  calloc-posix \
@@ -48,6 +49,7 @@
 #  configmake \
 #  dirname \
 #  error \
+#  execute \
 #  extensions \
 #  fdl \
 #  fopen-safer \
@@ -58,6 +60,7 @@
 #  git-version-gen \
 #  gitlog-to-changelog \
 #  gpl-3.0 \
+#  hash-map \
 #  intprops \
 #  inttypes \
 #  isnan \
@@ -65,6 +68,7 @@
 #  javaexec-script \
 #  ldexpl \
 #  libtextstyle-optional \
+#  linked-list \
 #  malloc-gnu \
 #  mbfile \
 #  mbswidth \
@@ -76,6 +80,8 @@
 #  progname \
 #  quote \
 #  quotearg \
+#  rbtreehash-list \
+#  readline \
 #  readme-release \
 #  realloc-posix \
 #  relocatable-prog \
@@ -86,10 +92,15 @@
 #  sprintf-posix \
 #  stdbool \
 #  stpcpy \
+#  stpncpy \
 #  strdup-posix \
 #  strerror \
+#  strtod \
 #  strverscmp \
+#  sys_ioctl \
+#  termios \
 #  timevar \
+#  unicodeio \
 #  unistd \
 #  unistd-safer \
 #  unlink \
@@ -107,6 +118,7 @@
 #  xconcat-filename \
 #  xhash \
 #  xlist \
+#  xmap \
 #  xmemdup0 \
 #  xstrndup
 
@@ -128,10 +140,19 @@
 # Use this preprocessor expression to decide whether #include_next works.
 # Do not rely on a 'configure'-time test for this, since the expression
 # might appear in an installed header, which is used by some other compiler.
-HAVE_INCLUDE_NEXT = (__GNUC__ || 60000000 <= __DECC_VER)
+HAVE_INCLUDE_NEXT = (__GNUC__ || __clang__ || 60000000 <= __DECC_VER)
 
 ## end   gnulib module absolute-header
 
+## begin gnulib module access
+
+
+EXTRA_DIST += lib/access.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/access.c
+
+## end   gnulib module access
+
 ## begin gnulib module alignof
 
 
@@ -206,6 +227,29 @@
 
 ## end   gnulib module assure
 
+## begin gnulib module at-internal
+
+if gl_GNULIB_ENABLED_260941c0e5dc67ec9e87d1fb321c300b
+lib_libbison_a_SOURCES += lib/openat-priv.h lib/openat-proc.c
+
+endif
+## end   gnulib module at-internal
+
+## begin gnulib module attribute
+
+
+EXTRA_DIST += lib/attribute.h
+
+## end   gnulib module attribute
+
+## begin gnulib module basename-lgpl
+
+lib_libbison_a_SOURCES += lib/basename-lgpl.c
+
+EXTRA_DIST += lib/basename-lgpl.h
+
+## end   gnulib module basename-lgpl
+
 ## begin gnulib module binary-io
 
 lib_libbison_a_SOURCES += lib/binary-io.h lib/binary-io.c
@@ -253,6 +297,15 @@
 
 ## end   gnulib module c-strcaseeq
 
+## begin gnulib module calloc-gnu
+
+
+EXTRA_DIST += lib/calloc.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/calloc.c
+
+## end   gnulib module calloc-gnu
+
 ## begin gnulib module calloc-posix
 
 
@@ -262,6 +315,14 @@
 
 ## end   gnulib module calloc-posix
 
+## begin gnulib module canonicalize
+
+lib_libbison_a_SOURCES += lib/canonicalize.c
+
+EXTRA_DIST += lib/canonicalize.h
+
+## end   gnulib module canonicalize
+
 ## begin gnulib module canonicalize-lgpl
 
 
@@ -279,6 +340,17 @@
 
 ## end   gnulib module careadlinkat
 
+## begin gnulib module chdir-long
+
+if gl_GNULIB_ENABLED_8198daae261b932d64a998f8586f5005
+
+endif
+EXTRA_DIST += lib/chdir-long.c lib/chdir-long.h
+
+EXTRA_lib_libbison_a_SOURCES += lib/chdir-long.c
+
+## end   gnulib module chdir-long
+
 ## begin gnulib module cloexec
 
 lib_libbison_a_SOURCES += lib/cloexec.c
@@ -304,6 +376,17 @@
 
 ## end   gnulib module close-stream
 
+## begin gnulib module closedir
+
+if gl_GNULIB_ENABLED_closedir
+
+endif
+EXTRA_DIST += lib/closedir.c lib/dirent-private.h
+
+EXTRA_lib_libbison_a_SOURCES += lib/closedir.c
+
+## end   gnulib module closedir
+
 ## begin gnulib module closeout
 
 lib_libbison_a_SOURCES += lib/closeout.c
@@ -374,6 +457,67 @@
 
 ## end   gnulib module diffseq
 
+## begin gnulib module dirent
+
+if gl_GNULIB_ENABLED_dirent
+BUILT_SOURCES += lib/dirent.h
+
+# We need the following in order to create <dirent.h> when the system
+# doesn't have one that works with the given compiler.
+lib/dirent.h: lib/dirent.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''HAVE_DIRENT_H''@|$(HAVE_DIRENT_H)|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_DIRENT_H''@|$(NEXT_DIRENT_H)|g' \
+	      -e 's/@''GNULIB_OPENDIR''@/$(GL_GNULIB_OPENDIR)/g' \
+	      -e 's/@''GNULIB_READDIR''@/$(GL_GNULIB_READDIR)/g' \
+	      -e 's/@''GNULIB_REWINDDIR''@/$(GL_GNULIB_REWINDDIR)/g' \
+	      -e 's/@''GNULIB_CLOSEDIR''@/$(GL_GNULIB_CLOSEDIR)/g' \
+	      -e 's/@''GNULIB_DIRFD''@/$(GL_GNULIB_DIRFD)/g' \
+	      -e 's/@''GNULIB_FDOPENDIR''@/$(GL_GNULIB_FDOPENDIR)/g' \
+	      -e 's/@''GNULIB_SCANDIR''@/$(GL_GNULIB_SCANDIR)/g' \
+	      -e 's/@''GNULIB_ALPHASORT''@/$(GL_GNULIB_ALPHASORT)/g' \
+	      -e 's/@''HAVE_OPENDIR''@/$(HAVE_OPENDIR)/g' \
+	      -e 's/@''HAVE_READDIR''@/$(HAVE_READDIR)/g' \
+	      -e 's/@''HAVE_REWINDDIR''@/$(HAVE_REWINDDIR)/g' \
+	      -e 's/@''HAVE_CLOSEDIR''@/$(HAVE_CLOSEDIR)/g' \
+	      -e 's|@''HAVE_DECL_DIRFD''@|$(HAVE_DECL_DIRFD)|g' \
+	      -e 's|@''HAVE_DECL_FDOPENDIR''@|$(HAVE_DECL_FDOPENDIR)|g' \
+	      -e 's|@''HAVE_FDOPENDIR''@|$(HAVE_FDOPENDIR)|g' \
+	      -e 's|@''HAVE_SCANDIR''@|$(HAVE_SCANDIR)|g' \
+	      -e 's|@''HAVE_ALPHASORT''@|$(HAVE_ALPHASORT)|g' \
+	      -e 's|@''REPLACE_OPENDIR''@|$(REPLACE_OPENDIR)|g' \
+	      -e 's|@''REPLACE_CLOSEDIR''@|$(REPLACE_CLOSEDIR)|g' \
+	      -e 's|@''REPLACE_DIRFD''@|$(REPLACE_DIRFD)|g' \
+	      -e 's|@''REPLACE_FDOPENDIR''@|$(REPLACE_FDOPENDIR)|g' \
+	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+	      < $(top_srcdir)/lib/dirent.in.h; \
+	} > $@-t && \
+	mv $@-t $@
+MOSTLYCLEANFILES += lib/dirent.h lib/dirent.h-t
+
+endif
+EXTRA_DIST += lib/dirent.in.h
+
+## end   gnulib module dirent
+
+## begin gnulib module dirfd
+
+if gl_GNULIB_ENABLED_dirfd
+
+endif
+EXTRA_DIST += lib/dirfd.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/dirfd.c
+
+## end   gnulib module dirfd
+
 ## begin gnulib module dirname
 
 lib_libbison_a_SOURCES += lib/dirname.c lib/basename.c
@@ -386,7 +530,7 @@
 
 ## begin gnulib module dirname-lgpl
 
-lib_libbison_a_SOURCES += lib/dirname-lgpl.c lib/basename-lgpl.c lib/stripslash.c
+lib_libbison_a_SOURCES += lib/dirname-lgpl.c lib/stripslash.c
 
 EXTRA_DIST += lib/dirname.h
 
@@ -399,12 +543,16 @@
 
 ## end   gnulib module do-release-commit-and-tag
 
-## begin gnulib module dosname
+## begin gnulib module dup
 
+if gl_GNULIB_ENABLED_dup
 
-EXTRA_DIST += lib/dosname.h
+endif
+EXTRA_DIST += lib/dup.c
 
-## end   gnulib module dosname
+EXTRA_lib_libbison_a_SOURCES += lib/dup.c
+
+## end   gnulib module dup
 
 ## begin gnulib module dup2
 
@@ -415,6 +563,13 @@
 
 ## end   gnulib module dup2
 
+## begin gnulib module eloop-threshold
+
+
+EXTRA_DIST += lib/eloop-threshold.h
+
+## end   gnulib module eloop-threshold
+
 ## begin gnulib module errno
 
 BUILT_SOURCES += $(ERRNO_H)
@@ -458,6 +613,12 @@
 
 ## end   gnulib module error
 
+## begin gnulib module execute
+
+lib_libbison_a_SOURCES += lib/execute.h lib/execute.c
+
+## end   gnulib module execute
+
 ## begin gnulib module exitfail
 
 lib_libbison_a_SOURCES += lib/exitfail.c
@@ -472,6 +633,17 @@
 
 ## end   gnulib module fatal-signal
 
+## begin gnulib module fchdir
+
+if gl_GNULIB_ENABLED_fchdir
+
+endif
+EXTRA_DIST += lib/fchdir.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/fchdir.c
+
+## end   gnulib module fchdir
+
 ## begin gnulib module fcntl
 
 
@@ -495,11 +667,13 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \
-	      -e 's/@''GNULIB_CREAT''@/$(GNULIB_CREAT)/g' \
-	      -e 's/@''GNULIB_FCNTL''@/$(GNULIB_FCNTL)/g' \
-	      -e 's/@''GNULIB_NONBLOCKING''@/$(GNULIB_NONBLOCKING)/g' \
-	      -e 's/@''GNULIB_OPEN''@/$(GNULIB_OPEN)/g' \
-	      -e 's/@''GNULIB_OPENAT''@/$(GNULIB_OPENAT)/g' \
+	      -e 's/@''GNULIB_CREAT''@/$(GL_GNULIB_CREAT)/g' \
+	      -e 's/@''GNULIB_FCNTL''@/$(GL_GNULIB_FCNTL)/g' \
+	      -e 's/@''GNULIB_NONBLOCKING''@/$(GL_GNULIB_NONBLOCKING)/g' \
+	      -e 's/@''GNULIB_OPEN''@/$(GL_GNULIB_OPEN)/g' \
+	      -e 's/@''GNULIB_OPENAT''@/$(GL_GNULIB_OPENAT)/g' \
+	      -e 's/@''GNULIB_MDA_CREAT''@/$(GL_GNULIB_MDA_CREAT)/g' \
+	      -e 's/@''GNULIB_MDA_OPEN''@/$(GL_GNULIB_MDA_OPEN)/g' \
 	      -e 's|@''HAVE_FCNTL''@|$(HAVE_FCNTL)|g' \
 	      -e 's|@''HAVE_OPENAT''@|$(HAVE_OPENAT)|g' \
 	      -e 's|@''REPLACE_CREAT''@|$(REPLACE_CREAT)|g' \
@@ -534,6 +708,45 @@
 
 ## end   gnulib module fd-safer-flag
 
+## begin gnulib module fdopendir
+
+if gl_GNULIB_ENABLED_fdopendir
+
+endif
+EXTRA_DIST += lib/fdopendir.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/fdopendir.c
+
+## end   gnulib module fdopendir
+
+## begin gnulib module ffs
+
+if gl_GNULIB_ENABLED_ffs
+
+endif
+EXTRA_DIST += lib/ffs.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/ffs.c
+
+## end   gnulib module ffs
+
+## begin gnulib module ffsl
+
+
+EXTRA_DIST += lib/ffsl.c lib/ffsl.h
+
+EXTRA_lib_libbison_a_SOURCES += lib/ffsl.c
+
+## end   gnulib module ffsl
+
+## begin gnulib module file-set
+
+lib_libbison_a_SOURCES += lib/file-set.c
+
+EXTRA_DIST += lib/file-set.h
+
+## end   gnulib module file-set
+
 ## begin gnulib module filename
 
 
@@ -541,6 +754,22 @@
 
 ## end   gnulib module filename
 
+## begin gnulib module filenamecat-lgpl
+
+if gl_GNULIB_ENABLED_fca9852db2a43bb33f02f0fbdbc174f6
+lib_libbison_a_SOURCES += lib/filenamecat-lgpl.c
+
+endif
+EXTRA_DIST += lib/filenamecat.h
+
+## end   gnulib module filenamecat-lgpl
+
+## begin gnulib module findprog-in
+
+lib_libbison_a_SOURCES += lib/findprog.h lib/findprog-in.c
+
+## end   gnulib module findprog-in
+
 ## begin gnulib module float
 
 BUILT_SOURCES += $(FLOAT_H)
@@ -581,6 +810,15 @@
 
 ## end   gnulib module fopen
 
+## begin gnulib module fopen-gnu
+
+
+EXTRA_DIST += lib/fopen.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/fopen.c
+
+## end   gnulib module fopen-gnu
+
 ## begin gnulib module fopen-safer
 
 lib_libbison_a_SOURCES += lib/fopen-safer.c
@@ -614,6 +852,15 @@
 
 ## end   gnulib module fpucw
 
+## begin gnulib module free-posix
+
+
+EXTRA_DIST += lib/free.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/free.c
+
+## end   gnulib module free-posix
+
 ## begin gnulib module frexp-nolibm
 
 
@@ -654,6 +901,17 @@
 
 ## end   gnulib module fstat
 
+## begin gnulib module fstatat
+
+if gl_GNULIB_ENABLED_fstatat
+
+endif
+EXTRA_DIST += lib/at-func.c lib/fstatat.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/at-func.c lib/fstatat.c
+
+## end   gnulib module fstatat
+
 ## begin gnulib module fstrcmp
 
 lib_libbison_a_SOURCES += lib/fstrcmp.h lib/fstrcmp.c
@@ -676,6 +934,37 @@
 
 ## end   gnulib module gendocs
 
+## begin gnulib module getcwd
+
+
+EXTRA_DIST += lib/getcwd.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/getcwd.c
+
+## end   gnulib module getcwd
+
+## begin gnulib module getcwd-lgpl
+
+if gl_GNULIB_ENABLED_3d094ef542bfdd238a5194e172bfe5f6
+
+endif
+EXTRA_DIST += lib/getcwd-lgpl.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/getcwd-lgpl.c
+
+## end   gnulib module getcwd-lgpl
+
+## begin gnulib module getdelim
+
+if gl_GNULIB_ENABLED_getdelim
+
+endif
+EXTRA_DIST += lib/getdelim.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/getdelim.c
+
+## end   gnulib module getdelim
+
 ## begin gnulib module getdtablesize
 
 if gl_GNULIB_ENABLED_getdtablesize
@@ -695,6 +984,17 @@
 
 ## end   gnulib module gethrxtime
 
+## begin gnulib module getline
+
+if gl_GNULIB_ENABLED_getline
+
+endif
+EXTRA_DIST += lib/getline.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/getline.c
+
+## end   gnulib module getline
+
 ## begin gnulib module getopt-posix
 
 BUILT_SOURCES += $(GETOPT_H) $(GETOPT_CDEFS_H)
@@ -804,6 +1104,15 @@
 
 ## end   gnulib module gnupload
 
+## begin gnulib module gperf
+
+GPERF = gperf
+V_GPERF = $(V_GPERF_@AM_V@)
+V_GPERF_ = $(V_GPERF_@AM_DEFAULT_V@)
+V_GPERF_0 = @echo "  GPERF   " $@;
+
+## end   gnulib module gperf
+
 ## begin gnulib module hard-locale
 
 if gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76
@@ -822,6 +1131,26 @@
 
 ## end   gnulib module hash
 
+## begin gnulib module hash-map
+
+lib_libbison_a_SOURCES += lib/gl_hash_map.h lib/gl_hash_map.c lib/gl_anyhash1.h lib/gl_anyhash2.h lib/gl_anyhash_primes.h
+
+## end   gnulib module hash-map
+
+## begin gnulib module hash-pjw
+
+lib_libbison_a_SOURCES += lib/hash-pjw.h lib/hash-pjw.c
+
+## end   gnulib module hash-pjw
+
+## begin gnulib module hash-triple-simple
+
+lib_libbison_a_SOURCES += lib/hash-triple-simple.c
+
+EXTRA_DIST += lib/hash-triple.h
+
+## end   gnulib module hash-triple-simple
+
 ## begin gnulib module havelib
 
 
@@ -829,6 +1158,103 @@
 
 ## end   gnulib module havelib
 
+## begin gnulib module ialloc
+
+lib_libbison_a_SOURCES += lib/ialloc.c
+
+EXTRA_DIST += lib/ialloc.h
+
+## end   gnulib module ialloc
+
+## begin gnulib module iconv-h
+
+BUILT_SOURCES += $(ICONV_H)
+
+# We need the following in order to create <iconv.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_ICONV_H
+lib/iconv.h: lib/iconv.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_ICONV_H''@|$(NEXT_ICONV_H)|g' \
+	      -e 's/@''GNULIB_ICONV''@/$(GL_GNULIB_ICONV)/g' \
+	      -e 's|@''ICONV_CONST''@|$(ICONV_CONST)|g' \
+	      -e 's|@''REPLACE_ICONV''@|$(REPLACE_ICONV)|g' \
+	      -e 's|@''REPLACE_ICONV_OPEN''@|$(REPLACE_ICONV_OPEN)|g' \
+	      -e 's|@''REPLACE_ICONV_UTF''@|$(REPLACE_ICONV_UTF)|g' \
+	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+	      < $(top_srcdir)/lib/iconv.in.h; \
+	} > $@-t && \
+	mv $@-t $@
+else
+lib/iconv.h: $(top_builddir)/config.status
+	rm -f $@
+endif
+MOSTLYCLEANFILES += lib/iconv.h lib/iconv.h-t
+
+EXTRA_DIST += lib/iconv.in.h
+
+## end   gnulib module iconv-h
+
+## begin gnulib module iconv_open
+
+$(top_srcdir)/lib/iconv_open-aix.h: $(top_srcdir)/lib/iconv_open-aix.gperf
+	$(V_GPERF)$(GPERF) -m 10 $(top_srcdir)/lib/iconv_open-aix.gperf > $(top_srcdir)/lib/iconv_open-aix.h-t && \
+	mv $(top_srcdir)/lib/iconv_open-aix.h-t $(top_srcdir)/lib/iconv_open-aix.h
+$(top_srcdir)/lib/iconv_open-hpux.h: $(top_srcdir)/lib/iconv_open-hpux.gperf
+	$(V_GPERF)$(GPERF) -m 10 $(top_srcdir)/lib/iconv_open-hpux.gperf > $(top_srcdir)/lib/iconv_open-hpux.h-t && \
+	mv $(top_srcdir)/lib/iconv_open-hpux.h-t $(top_srcdir)/lib/iconv_open-hpux.h
+$(top_srcdir)/lib/iconv_open-irix.h: $(top_srcdir)/lib/iconv_open-irix.gperf
+	$(V_GPERF)$(GPERF) -m 10 $(top_srcdir)/lib/iconv_open-irix.gperf > $(top_srcdir)/lib/iconv_open-irix.h-t && \
+	mv $(top_srcdir)/lib/iconv_open-irix.h-t $(top_srcdir)/lib/iconv_open-irix.h
+$(top_srcdir)/lib/iconv_open-osf.h: $(top_srcdir)/lib/iconv_open-osf.gperf
+	$(V_GPERF)$(GPERF) -m 10 $(top_srcdir)/lib/iconv_open-osf.gperf > $(top_srcdir)/lib/iconv_open-osf.h-t && \
+	mv $(top_srcdir)/lib/iconv_open-osf.h-t $(top_srcdir)/lib/iconv_open-osf.h
+$(top_srcdir)/lib/iconv_open-solaris.h: $(top_srcdir)/lib/iconv_open-solaris.gperf
+	$(V_GPERF)$(GPERF) -m 10 $(top_srcdir)/lib/iconv_open-solaris.gperf > $(top_srcdir)/lib/iconv_open-solaris.h-t && \
+	mv $(top_srcdir)/lib/iconv_open-solaris.h-t $(top_srcdir)/lib/iconv_open-solaris.h
+$(top_srcdir)/lib/iconv_open-zos.h: $(top_srcdir)/lib/iconv_open-zos.gperf
+	$(V_GPERF)$(GPERF) -m 10 $(top_srcdir)/lib/iconv_open-zos.gperf > $(top_srcdir)/lib/iconv_open-zos.h-t && \
+	mv $(top_srcdir)/lib/iconv_open-zos.h-t $(top_srcdir)/lib/iconv_open-zos.h
+BUILT_SOURCES        += lib/iconv_open-aix.h lib/iconv_open-hpux.h lib/iconv_open-irix.h lib/iconv_open-osf.h lib/iconv_open-solaris.h lib/iconv_open-zos.h
+MOSTLYCLEANFILES     += lib/iconv_open-aix.h-t lib/iconv_open-hpux.h-t lib/iconv_open-irix.h-t lib/iconv_open-osf.h-t lib/iconv_open-solaris.h-t lib/iconv_open-zos.h-t
+MAINTAINERCLEANFILES += lib/iconv_open-aix.h lib/iconv_open-hpux.h lib/iconv_open-irix.h lib/iconv_open-osf.h lib/iconv_open-solaris.h lib/iconv_open-zos.h
+EXTRA_DIST           += lib/iconv_open-aix.h lib/iconv_open-hpux.h lib/iconv_open-irix.h lib/iconv_open-osf.h lib/iconv_open-solaris.h lib/iconv_open-zos.h
+
+EXTRA_DIST += lib/iconv.c lib/iconv_close.c lib/iconv_open-aix.gperf lib/iconv_open-hpux.gperf lib/iconv_open-irix.gperf lib/iconv_open-osf.gperf lib/iconv_open-solaris.gperf lib/iconv_open-zos.gperf lib/iconv_open.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/iconv.c lib/iconv_close.c lib/iconv_open.c
+
+## end   gnulib module iconv_open
+
+## begin gnulib module idx
+
+lib_libbison_a_SOURCES += lib/idx.h
+
+## end   gnulib module idx
+
+## begin gnulib module integer_length
+
+lib_libbison_a_SOURCES += lib/integer_length.c
+
+EXTRA_DIST += lib/float+.h lib/integer_length.h
+
+## end   gnulib module integer_length
+
+## begin gnulib module integer_length_l
+
+lib_libbison_a_SOURCES += lib/integer_length_l.c
+
+EXTRA_DIST += lib/integer_length.h
+
+## end   gnulib module integer_length_l
+
 ## begin gnulib module intprops
 
 
@@ -850,15 +1276,12 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_INTTYPES_H''@|$(NEXT_INTTYPES_H)|g' \
-	      -e 's/@''PRI_MACROS_BROKEN''@/$(PRI_MACROS_BROKEN)/g' \
 	      -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
-	      -e 's/@''HAVE_LONG_LONG_INT''@/$(HAVE_LONG_LONG_INT)/g' \
-	      -e 's/@''HAVE_UNSIGNED_LONG_LONG_INT''@/$(HAVE_UNSIGNED_LONG_LONG_INT)/g' \
 	      -e 's/@''PRIPTR_PREFIX''@/$(PRIPTR_PREFIX)/g' \
-	      -e 's/@''GNULIB_IMAXABS''@/$(GNULIB_IMAXABS)/g' \
-	      -e 's/@''GNULIB_IMAXDIV''@/$(GNULIB_IMAXDIV)/g' \
-	      -e 's/@''GNULIB_STRTOIMAX''@/$(GNULIB_STRTOIMAX)/g' \
-	      -e 's/@''GNULIB_STRTOUMAX''@/$(GNULIB_STRTOUMAX)/g' \
+	      -e 's/@''GNULIB_IMAXABS''@/$(GL_GNULIB_IMAXABS)/g' \
+	      -e 's/@''GNULIB_IMAXDIV''@/$(GL_GNULIB_IMAXDIV)/g' \
+	      -e 's/@''GNULIB_STRTOIMAX''@/$(GL_GNULIB_STRTOIMAX)/g' \
+	      -e 's/@''GNULIB_STRTOUMAX''@/$(GL_GNULIB_STRTOUMAX)/g' \
 	      -e 's/@''HAVE_DECL_IMAXABS''@/$(HAVE_DECL_IMAXABS)/g' \
 	      -e 's/@''HAVE_DECL_IMAXDIV''@/$(HAVE_DECL_IMAXDIV)/g' \
 	      -e 's/@''HAVE_DECL_STRTOIMAX''@/$(HAVE_DECL_STRTOIMAX)/g' \
@@ -947,6 +1370,24 @@
 
 ## end   gnulib module iswblank
 
+## begin gnulib module iswdigit
+
+
+EXTRA_DIST += lib/iswdigit.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/iswdigit.c
+
+## end   gnulib module iswdigit
+
+## begin gnulib module iswxdigit
+
+
+EXTRA_DIST += lib/iswxdigit.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/iswxdigit.c
+
+## end   gnulib module iswxdigit
+
 ## begin gnulib module javacomp-script
 
 
@@ -972,9 +1413,7 @@
 
 ## begin gnulib module libc-config
 
-if gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467
 
-endif
 EXTRA_DIST += lib/cdefs.h lib/libc-config.h
 
 ## end   gnulib module libc-config
@@ -1030,6 +1469,12 @@
 
 ## end   gnulib module limits-h
 
+## begin gnulib module linked-list
+
+lib_libbison_a_SOURCES += lib/gl_linked_list.h lib/gl_linked_list.c lib/gl_anylinked_list1.h lib/gl_anylinked_list2.h
+
+## end   gnulib module linked-list
+
 ## begin gnulib module list
 
 lib_libbison_a_SOURCES += lib/gl_list.h lib/gl_list.c
@@ -1044,16 +1489,49 @@
 
 ## end   gnulib module localcharset
 
-## begin gnulib module localtime-buffer
+## begin gnulib module locale
 
-if gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9
+if gl_GNULIB_ENABLED_locale
+BUILT_SOURCES += lib/locale.h
+
+# We need the following in order to create <locale.h> when the system
+# doesn't have one that provides all definitions.
+lib/locale.h: lib/locale.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_LOCALE_H''@|$(NEXT_LOCALE_H)|g' \
+	      -e 's/@''GNULIB_LOCALECONV''@/$(GL_GNULIB_LOCALECONV)/g' \
+	      -e 's/@''GNULIB_SETLOCALE''@/$(GL_GNULIB_SETLOCALE)/g' \
+	      -e 's/@''GNULIB_SETLOCALE_NULL''@/$(GL_GNULIB_SETLOCALE_NULL)/g' \
+	      -e 's/@''GNULIB_DUPLOCALE''@/$(GL_GNULIB_DUPLOCALE)/g' \
+	      -e 's/@''GNULIB_LOCALENAME''@/$(GL_GNULIB_LOCALENAME)/g' \
+	      -e 's|@''HAVE_NEWLOCALE''@|$(HAVE_NEWLOCALE)|g' \
+	      -e 's|@''HAVE_DUPLOCALE''@|$(HAVE_DUPLOCALE)|g' \
+	      -e 's|@''HAVE_FREELOCALE''@|$(HAVE_FREELOCALE)|g' \
+	      -e 's|@''HAVE_XLOCALE_H''@|$(HAVE_XLOCALE_H)|g' \
+	      -e 's|@''REPLACE_LOCALECONV''@|$(REPLACE_LOCALECONV)|g' \
+	      -e 's|@''REPLACE_SETLOCALE''@|$(REPLACE_SETLOCALE)|g' \
+	      -e 's|@''REPLACE_NEWLOCALE''@|$(REPLACE_NEWLOCALE)|g' \
+	      -e 's|@''REPLACE_DUPLOCALE''@|$(REPLACE_DUPLOCALE)|g' \
+	      -e 's|@''REPLACE_FREELOCALE''@|$(REPLACE_FREELOCALE)|g' \
+	      -e 's|@''REPLACE_STRUCT_LCONV''@|$(REPLACE_STRUCT_LCONV)|g' \
+	      -e 's|@''LOCALENAME_ENHANCE_LOCALE_FUNCS''@|$(LOCALENAME_ENHANCE_LOCALE_FUNCS)|g' \
+	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+	      < $(top_srcdir)/lib/locale.in.h; \
+	} > $@-t && \
+	mv $@-t $@
+MOSTLYCLEANFILES += lib/locale.h lib/locale.h-t
 
 endif
-EXTRA_DIST += lib/localtime-buffer.c lib/localtime-buffer.h
+EXTRA_DIST += lib/locale.in.h
 
-EXTRA_lib_libbison_a_SOURCES += lib/localtime-buffer.c
-
-## end   gnulib module localtime-buffer
+## end   gnulib module locale
 
 ## begin gnulib module lock
 
@@ -1106,6 +1584,12 @@
 
 ## end   gnulib module malloca
 
+## begin gnulib module map
+
+lib_libbison_a_SOURCES += lib/gl_map.h lib/gl_map.c
+
+## end   gnulib module map
+
 ## begin gnulib module math
 
 BUILT_SOURCES += lib/math.h
@@ -1121,102 +1605,108 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_AS_FIRST_DIRECTIVE_MATH_H''@|$(NEXT_AS_FIRST_DIRECTIVE_MATH_H)|g' \
-	      -e 's/@''GNULIB_ACOSF''@/$(GNULIB_ACOSF)/g' \
-	      -e 's/@''GNULIB_ACOSL''@/$(GNULIB_ACOSL)/g' \
-	      -e 's/@''GNULIB_ASINF''@/$(GNULIB_ASINF)/g' \
-	      -e 's/@''GNULIB_ASINL''@/$(GNULIB_ASINL)/g' \
-	      -e 's/@''GNULIB_ATANF''@/$(GNULIB_ATANF)/g' \
-	      -e 's/@''GNULIB_ATANL''@/$(GNULIB_ATANL)/g' \
-	      -e 's/@''GNULIB_ATAN2F''@/$(GNULIB_ATAN2F)/g' \
-	      -e 's/@''GNULIB_CBRT''@/$(GNULIB_CBRT)/g' \
-	      -e 's/@''GNULIB_CBRTF''@/$(GNULIB_CBRTF)/g' \
-	      -e 's/@''GNULIB_CBRTL''@/$(GNULIB_CBRTL)/g' \
-	      -e 's/@''GNULIB_CEIL''@/$(GNULIB_CEIL)/g' \
-	      -e 's/@''GNULIB_CEILF''@/$(GNULIB_CEILF)/g' \
-	      -e 's/@''GNULIB_CEILL''@/$(GNULIB_CEILL)/g' \
-	      -e 's/@''GNULIB_COPYSIGN''@/$(GNULIB_COPYSIGN)/g' \
-	      -e 's/@''GNULIB_COPYSIGNF''@/$(GNULIB_COPYSIGNF)/g' \
-	      -e 's/@''GNULIB_COPYSIGNL''@/$(GNULIB_COPYSIGNL)/g' \
-	      -e 's/@''GNULIB_COSF''@/$(GNULIB_COSF)/g' \
-	      -e 's/@''GNULIB_COSL''@/$(GNULIB_COSL)/g' \
-	      -e 's/@''GNULIB_COSHF''@/$(GNULIB_COSHF)/g' \
-	      -e 's/@''GNULIB_EXPF''@/$(GNULIB_EXPF)/g' \
-	      -e 's/@''GNULIB_EXPL''@/$(GNULIB_EXPL)/g' \
-	      -e 's/@''GNULIB_EXP2''@/$(GNULIB_EXP2)/g' \
-	      -e 's/@''GNULIB_EXP2F''@/$(GNULIB_EXP2F)/g' \
-	      -e 's/@''GNULIB_EXP2L''@/$(GNULIB_EXP2L)/g' \
-	      -e 's/@''GNULIB_EXPM1''@/$(GNULIB_EXPM1)/g' \
-	      -e 's/@''GNULIB_EXPM1F''@/$(GNULIB_EXPM1F)/g' \
-	      -e 's/@''GNULIB_EXPM1L''@/$(GNULIB_EXPM1L)/g' \
-	      -e 's/@''GNULIB_FABSF''@/$(GNULIB_FABSF)/g' \
-	      -e 's/@''GNULIB_FABSL''@/$(GNULIB_FABSL)/g' \
-	      -e 's/@''GNULIB_FLOOR''@/$(GNULIB_FLOOR)/g' \
-	      -e 's/@''GNULIB_FLOORF''@/$(GNULIB_FLOORF)/g' \
-	      -e 's/@''GNULIB_FLOORL''@/$(GNULIB_FLOORL)/g' \
-	      -e 's/@''GNULIB_FMA''@/$(GNULIB_FMA)/g' \
-	      -e 's/@''GNULIB_FMAF''@/$(GNULIB_FMAF)/g' \
-	      -e 's/@''GNULIB_FMAL''@/$(GNULIB_FMAL)/g' \
-	      -e 's/@''GNULIB_FMOD''@/$(GNULIB_FMOD)/g' \
-	      -e 's/@''GNULIB_FMODF''@/$(GNULIB_FMODF)/g' \
-	      -e 's/@''GNULIB_FMODL''@/$(GNULIB_FMODL)/g' \
-	      -e 's/@''GNULIB_FREXPF''@/$(GNULIB_FREXPF)/g' \
-	      -e 's/@''GNULIB_FREXP''@/$(GNULIB_FREXP)/g' \
-	      -e 's/@''GNULIB_FREXPL''@/$(GNULIB_FREXPL)/g' \
-	      -e 's/@''GNULIB_HYPOT''@/$(GNULIB_HYPOT)/g' \
-	      -e 's/@''GNULIB_HYPOTF''@/$(GNULIB_HYPOTF)/g' \
-	      -e 's/@''GNULIB_HYPOTL''@/$(GNULIB_HYPOTL)/g' \
+	      -e 's/@''GNULIB_ACOSF''@/$(GL_GNULIB_ACOSF)/g' \
+	      -e 's/@''GNULIB_ACOSL''@/$(GL_GNULIB_ACOSL)/g' \
+	      -e 's/@''GNULIB_ASINF''@/$(GL_GNULIB_ASINF)/g' \
+	      -e 's/@''GNULIB_ASINL''@/$(GL_GNULIB_ASINL)/g' \
+	      -e 's/@''GNULIB_ATANF''@/$(GL_GNULIB_ATANF)/g' \
+	      -e 's/@''GNULIB_ATANL''@/$(GL_GNULIB_ATANL)/g' \
+	      -e 's/@''GNULIB_ATAN2F''@/$(GL_GNULIB_ATAN2F)/g' \
+	      -e 's/@''GNULIB_CBRT''@/$(GL_GNULIB_CBRT)/g' \
+	      -e 's/@''GNULIB_CBRTF''@/$(GL_GNULIB_CBRTF)/g' \
+	      -e 's/@''GNULIB_CBRTL''@/$(GL_GNULIB_CBRTL)/g' \
+	      -e 's/@''GNULIB_CEIL''@/$(GL_GNULIB_CEIL)/g' \
+	      -e 's/@''GNULIB_CEILF''@/$(GL_GNULIB_CEILF)/g' \
+	      -e 's/@''GNULIB_CEILL''@/$(GL_GNULIB_CEILL)/g' \
+	      -e 's/@''GNULIB_COPYSIGN''@/$(GL_GNULIB_COPYSIGN)/g' \
+	      -e 's/@''GNULIB_COPYSIGNF''@/$(GL_GNULIB_COPYSIGNF)/g' \
+	      -e 's/@''GNULIB_COPYSIGNL''@/$(GL_GNULIB_COPYSIGNL)/g' \
+	      -e 's/@''GNULIB_COSF''@/$(GL_GNULIB_COSF)/g' \
+	      -e 's/@''GNULIB_COSL''@/$(GL_GNULIB_COSL)/g' \
+	      -e 's/@''GNULIB_COSHF''@/$(GL_GNULIB_COSHF)/g' \
+	      -e 's/@''GNULIB_EXPF''@/$(GL_GNULIB_EXPF)/g' \
+	      -e 's/@''GNULIB_EXPL''@/$(GL_GNULIB_EXPL)/g' \
+	      -e 's/@''GNULIB_EXP2''@/$(GL_GNULIB_EXP2)/g' \
+	      -e 's/@''GNULIB_EXP2F''@/$(GL_GNULIB_EXP2F)/g' \
+	      -e 's/@''GNULIB_EXP2L''@/$(GL_GNULIB_EXP2L)/g' \
+	      -e 's/@''GNULIB_EXPM1''@/$(GL_GNULIB_EXPM1)/g' \
+	      -e 's/@''GNULIB_EXPM1F''@/$(GL_GNULIB_EXPM1F)/g' \
+	      -e 's/@''GNULIB_EXPM1L''@/$(GL_GNULIB_EXPM1L)/g' \
+	      -e 's/@''GNULIB_FABSF''@/$(GL_GNULIB_FABSF)/g' \
+	      -e 's/@''GNULIB_FABSL''@/$(GL_GNULIB_FABSL)/g' \
+	      -e 's/@''GNULIB_FLOOR''@/$(GL_GNULIB_FLOOR)/g' \
+	      -e 's/@''GNULIB_FLOORF''@/$(GL_GNULIB_FLOORF)/g' \
+	      -e 's/@''GNULIB_FLOORL''@/$(GL_GNULIB_FLOORL)/g' \
+	      -e 's/@''GNULIB_FMA''@/$(GL_GNULIB_FMA)/g' \
+	      -e 's/@''GNULIB_FMAF''@/$(GL_GNULIB_FMAF)/g' \
+	      -e 's/@''GNULIB_FMAL''@/$(GL_GNULIB_FMAL)/g' \
+	      -e 's/@''GNULIB_FMOD''@/$(GL_GNULIB_FMOD)/g' \
+	      -e 's/@''GNULIB_FMODF''@/$(GL_GNULIB_FMODF)/g' \
+	      -e 's/@''GNULIB_FMODL''@/$(GL_GNULIB_FMODL)/g' \
+	      -e 's/@''GNULIB_FREXPF''@/$(GL_GNULIB_FREXPF)/g' \
+	      -e 's/@''GNULIB_FREXP''@/$(GL_GNULIB_FREXP)/g' \
+	      -e 's/@''GNULIB_FREXPL''@/$(GL_GNULIB_FREXPL)/g' \
+	      -e 's/@''GNULIB_HYPOT''@/$(GL_GNULIB_HYPOT)/g' \
+	      -e 's/@''GNULIB_HYPOTF''@/$(GL_GNULIB_HYPOTF)/g' \
+	      -e 's/@''GNULIB_HYPOTL''@/$(GL_GNULIB_HYPOTL)/g' \
 	      < $(top_srcdir)/lib/math.in.h | \
-	  sed -e 's/@''GNULIB_ILOGB''@/$(GNULIB_ILOGB)/g' \
-	      -e 's/@''GNULIB_ILOGBF''@/$(GNULIB_ILOGBF)/g' \
-	      -e 's/@''GNULIB_ILOGBL''@/$(GNULIB_ILOGBL)/g' \
-	      -e 's/@''GNULIB_ISFINITE''@/$(GNULIB_ISFINITE)/g' \
-	      -e 's/@''GNULIB_ISINF''@/$(GNULIB_ISINF)/g' \
-	      -e 's/@''GNULIB_ISNAN''@/$(GNULIB_ISNAN)/g' \
-	      -e 's/@''GNULIB_ISNANF''@/$(GNULIB_ISNANF)/g' \
-	      -e 's/@''GNULIB_ISNAND''@/$(GNULIB_ISNAND)/g' \
-	      -e 's/@''GNULIB_ISNANL''@/$(GNULIB_ISNANL)/g' \
-	      -e 's/@''GNULIB_LDEXPF''@/$(GNULIB_LDEXPF)/g' \
-	      -e 's/@''GNULIB_LDEXPL''@/$(GNULIB_LDEXPL)/g' \
-	      -e 's/@''GNULIB_LOG''@/$(GNULIB_LOG)/g' \
-	      -e 's/@''GNULIB_LOGF''@/$(GNULIB_LOGF)/g' \
-	      -e 's/@''GNULIB_LOGL''@/$(GNULIB_LOGL)/g' \
-	      -e 's/@''GNULIB_LOG10''@/$(GNULIB_LOG10)/g' \
-	      -e 's/@''GNULIB_LOG10F''@/$(GNULIB_LOG10F)/g' \
-	      -e 's/@''GNULIB_LOG10L''@/$(GNULIB_LOG10L)/g' \
-	      -e 's/@''GNULIB_LOG1P''@/$(GNULIB_LOG1P)/g' \
-	      -e 's/@''GNULIB_LOG1PF''@/$(GNULIB_LOG1PF)/g' \
-	      -e 's/@''GNULIB_LOG1PL''@/$(GNULIB_LOG1PL)/g' \
-	      -e 's/@''GNULIB_LOG2''@/$(GNULIB_LOG2)/g' \
-	      -e 's/@''GNULIB_LOG2F''@/$(GNULIB_LOG2F)/g' \
-	      -e 's/@''GNULIB_LOG2L''@/$(GNULIB_LOG2L)/g' \
-	      -e 's/@''GNULIB_LOGB''@/$(GNULIB_LOGB)/g' \
-	      -e 's/@''GNULIB_LOGBF''@/$(GNULIB_LOGBF)/g' \
-	      -e 's/@''GNULIB_LOGBL''@/$(GNULIB_LOGBL)/g' \
-	      -e 's/@''GNULIB_MODF''@/$(GNULIB_MODF)/g' \
-	      -e 's/@''GNULIB_MODFF''@/$(GNULIB_MODFF)/g' \
-	      -e 's/@''GNULIB_MODFL''@/$(GNULIB_MODFL)/g' \
-	      -e 's/@''GNULIB_POWF''@/$(GNULIB_POWF)/g' \
-	      -e 's/@''GNULIB_REMAINDER''@/$(GNULIB_REMAINDER)/g' \
-	      -e 's/@''GNULIB_REMAINDERF''@/$(GNULIB_REMAINDERF)/g' \
-	      -e 's/@''GNULIB_REMAINDERL''@/$(GNULIB_REMAINDERL)/g' \
-	      -e 's/@''GNULIB_RINT''@/$(GNULIB_RINT)/g' \
-	      -e 's/@''GNULIB_RINTF''@/$(GNULIB_RINTF)/g' \
-	      -e 's/@''GNULIB_RINTL''@/$(GNULIB_RINTL)/g' \
-	      -e 's/@''GNULIB_ROUND''@/$(GNULIB_ROUND)/g' \
-	      -e 's/@''GNULIB_ROUNDF''@/$(GNULIB_ROUNDF)/g' \
-	      -e 's/@''GNULIB_ROUNDL''@/$(GNULIB_ROUNDL)/g' \
-	      -e 's/@''GNULIB_SIGNBIT''@/$(GNULIB_SIGNBIT)/g' \
-	      -e 's/@''GNULIB_SINF''@/$(GNULIB_SINF)/g' \
-	      -e 's/@''GNULIB_SINL''@/$(GNULIB_SINL)/g' \
-	      -e 's/@''GNULIB_SINHF''@/$(GNULIB_SINHF)/g' \
-	      -e 's/@''GNULIB_SQRTF''@/$(GNULIB_SQRTF)/g' \
-	      -e 's/@''GNULIB_SQRTL''@/$(GNULIB_SQRTL)/g' \
-	      -e 's/@''GNULIB_TANF''@/$(GNULIB_TANF)/g' \
-	      -e 's/@''GNULIB_TANL''@/$(GNULIB_TANL)/g' \
-	      -e 's/@''GNULIB_TANHF''@/$(GNULIB_TANHF)/g' \
-	      -e 's/@''GNULIB_TRUNC''@/$(GNULIB_TRUNC)/g' \
-	      -e 's/@''GNULIB_TRUNCF''@/$(GNULIB_TRUNCF)/g' \
-	      -e 's/@''GNULIB_TRUNCL''@/$(GNULIB_TRUNCL)/g' \
+	  sed -e 's/@''GNULIB_ILOGB''@/$(GL_GNULIB_ILOGB)/g' \
+	      -e 's/@''GNULIB_ILOGBF''@/$(GL_GNULIB_ILOGBF)/g' \
+	      -e 's/@''GNULIB_ILOGBL''@/$(GL_GNULIB_ILOGBL)/g' \
+	      -e 's/@''GNULIB_ISFINITE''@/$(GL_GNULIB_ISFINITE)/g' \
+	      -e 's/@''GNULIB_ISINF''@/$(GL_GNULIB_ISINF)/g' \
+	      -e 's/@''GNULIB_ISNAN''@/$(GL_GNULIB_ISNAN)/g' \
+	      -e 's/@''GNULIB_ISNANF''@/$(GL_GNULIB_ISNANF)/g' \
+	      -e 's/@''GNULIB_ISNAND''@/$(GL_GNULIB_ISNAND)/g' \
+	      -e 's/@''GNULIB_ISNANL''@/$(GL_GNULIB_ISNANL)/g' \
+	      -e 's/@''GNULIB_LDEXPF''@/$(GL_GNULIB_LDEXPF)/g' \
+	      -e 's/@''GNULIB_LDEXPL''@/$(GL_GNULIB_LDEXPL)/g' \
+	      -e 's/@''GNULIB_LOG''@/$(GL_GNULIB_LOG)/g' \
+	      -e 's/@''GNULIB_LOGF''@/$(GL_GNULIB_LOGF)/g' \
+	      -e 's/@''GNULIB_LOGL''@/$(GL_GNULIB_LOGL)/g' \
+	      -e 's/@''GNULIB_LOG10''@/$(GL_GNULIB_LOG10)/g' \
+	      -e 's/@''GNULIB_LOG10F''@/$(GL_GNULIB_LOG10F)/g' \
+	      -e 's/@''GNULIB_LOG10L''@/$(GL_GNULIB_LOG10L)/g' \
+	      -e 's/@''GNULIB_LOG1P''@/$(GL_GNULIB_LOG1P)/g' \
+	      -e 's/@''GNULIB_LOG1PF''@/$(GL_GNULIB_LOG1PF)/g' \
+	      -e 's/@''GNULIB_LOG1PL''@/$(GL_GNULIB_LOG1PL)/g' \
+	      -e 's/@''GNULIB_LOG2''@/$(GL_GNULIB_LOG2)/g' \
+	      -e 's/@''GNULIB_LOG2F''@/$(GL_GNULIB_LOG2F)/g' \
+	      -e 's/@''GNULIB_LOG2L''@/$(GL_GNULIB_LOG2L)/g' \
+	      -e 's/@''GNULIB_LOGB''@/$(GL_GNULIB_LOGB)/g' \
+	      -e 's/@''GNULIB_LOGBF''@/$(GL_GNULIB_LOGBF)/g' \
+	      -e 's/@''GNULIB_LOGBL''@/$(GL_GNULIB_LOGBL)/g' \
+	      -e 's/@''GNULIB_MODF''@/$(GL_GNULIB_MODF)/g' \
+	      -e 's/@''GNULIB_MODFF''@/$(GL_GNULIB_MODFF)/g' \
+	      -e 's/@''GNULIB_MODFL''@/$(GL_GNULIB_MODFL)/g' \
+	      -e 's/@''GNULIB_POWF''@/$(GL_GNULIB_POWF)/g' \
+	      -e 's/@''GNULIB_REMAINDER''@/$(GL_GNULIB_REMAINDER)/g' \
+	      -e 's/@''GNULIB_REMAINDERF''@/$(GL_GNULIB_REMAINDERF)/g' \
+	      -e 's/@''GNULIB_REMAINDERL''@/$(GL_GNULIB_REMAINDERL)/g' \
+	      -e 's/@''GNULIB_RINT''@/$(GL_GNULIB_RINT)/g' \
+	      -e 's/@''GNULIB_RINTF''@/$(GL_GNULIB_RINTF)/g' \
+	      -e 's/@''GNULIB_RINTL''@/$(GL_GNULIB_RINTL)/g' \
+	      -e 's/@''GNULIB_ROUND''@/$(GL_GNULIB_ROUND)/g' \
+	      -e 's/@''GNULIB_ROUNDF''@/$(GL_GNULIB_ROUNDF)/g' \
+	      -e 's/@''GNULIB_ROUNDL''@/$(GL_GNULIB_ROUNDL)/g' \
+	      -e 's/@''GNULIB_SIGNBIT''@/$(GL_GNULIB_SIGNBIT)/g' \
+	      -e 's/@''GNULIB_SINF''@/$(GL_GNULIB_SINF)/g' \
+	      -e 's/@''GNULIB_SINL''@/$(GL_GNULIB_SINL)/g' \
+	      -e 's/@''GNULIB_SINHF''@/$(GL_GNULIB_SINHF)/g' \
+	      -e 's/@''GNULIB_SQRTF''@/$(GL_GNULIB_SQRTF)/g' \
+	      -e 's/@''GNULIB_SQRTL''@/$(GL_GNULIB_SQRTL)/g' \
+	      -e 's/@''GNULIB_TANF''@/$(GL_GNULIB_TANF)/g' \
+	      -e 's/@''GNULIB_TANL''@/$(GL_GNULIB_TANL)/g' \
+	      -e 's/@''GNULIB_TANHF''@/$(GL_GNULIB_TANHF)/g' \
+	      -e 's/@''GNULIB_TRUNC''@/$(GL_GNULIB_TRUNC)/g' \
+	      -e 's/@''GNULIB_TRUNCF''@/$(GL_GNULIB_TRUNCF)/g' \
+	      -e 's/@''GNULIB_TRUNCL''@/$(GL_GNULIB_TRUNCL)/g' \
+	      -e 's/@''GNULIB_MDA_J0''@/$(GL_GNULIB_MDA_J0)/g' \
+	      -e 's/@''GNULIB_MDA_J1''@/$(GL_GNULIB_MDA_J1)/g' \
+	      -e 's/@''GNULIB_MDA_JN''@/$(GL_GNULIB_MDA_JN)/g' \
+	      -e 's/@''GNULIB_MDA_Y0''@/$(GL_GNULIB_MDA_Y0)/g' \
+	      -e 's/@''GNULIB_MDA_Y1''@/$(GL_GNULIB_MDA_Y1)/g' \
+	      -e 's/@''GNULIB_MDA_YN''@/$(GL_GNULIB_MDA_YN)/g' \
 	  | \
 	  sed -e 's|@''HAVE_ACOSF''@|$(HAVE_ACOSF)|g' \
 	      -e 's|@''HAVE_ACOSL''@|$(HAVE_ACOSL)|g' \
@@ -1385,7 +1875,7 @@
 	      -e 's|@''REPLACE_ROUNDF''@|$(REPLACE_ROUNDF)|g' \
 	      -e 's|@''REPLACE_ROUNDL''@|$(REPLACE_ROUNDL)|g' \
 	      -e 's|@''REPLACE_SIGNBIT''@|$(REPLACE_SIGNBIT)|g' \
-	      -e 's|@''REPLACE_SIGNBIT_USING_GCC''@|$(REPLACE_SIGNBIT_USING_GCC)|g' \
+	      -e 's|@''REPLACE_SIGNBIT_USING_BUILTINS''@|$(REPLACE_SIGNBIT_USING_BUILTINS)|g' \
 	      -e 's|@''REPLACE_SINF''@|$(REPLACE_SINF)|g' \
 	      -e 's|@''REPLACE_SINHF''@|$(REPLACE_SINHF)|g' \
 	      -e 's|@''REPLACE_SQRTF''@|$(REPLACE_SQRTF)|g' \
@@ -1423,9 +1913,9 @@
 ## begin gnulib module mbrtowc
 
 
-EXTRA_DIST += lib/mbrtowc.c
+EXTRA_DIST += lib/lc-charset-dispatch.c lib/lc-charset-dispatch.h lib/mbrtowc-impl-utf8.h lib/mbrtowc-impl.h lib/mbrtowc.c lib/mbtowc-lock.c lib/mbtowc-lock.h lib/windows-initguard.h
 
-EXTRA_lib_libbison_a_SOURCES += lib/mbrtowc.c
+EXTRA_lib_libbison_a_SOURCES += lib/lc-charset-dispatch.c lib/mbrtowc.c lib/mbtowc-lock.c
 
 ## end   gnulib module mbrtowc
 
@@ -1453,6 +1943,26 @@
 
 ## end   gnulib module memchr
 
+## begin gnulib module mempcpy
+
+
+EXTRA_DIST += lib/mempcpy.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/mempcpy.c
+
+## end   gnulib module mempcpy
+
+## begin gnulib module memrchr
+
+if gl_GNULIB_ENABLED_memrchr
+
+endif
+EXTRA_DIST += lib/memrchr.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/memrchr.c
+
+## end   gnulib module memrchr
+
 ## begin gnulib module minmax
 
 lib_libbison_a_SOURCES += lib/minmax.h
@@ -1511,6 +2021,51 @@
 
 ## end   gnulib module open
 
+## begin gnulib module openat
+
+if gl_GNULIB_ENABLED_openat
+
+endif
+EXTRA_DIST += lib/openat.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/openat.c
+
+## end   gnulib module openat
+
+## begin gnulib module openat-die
+
+if gl_GNULIB_ENABLED_1840129d490f3a00c8a098316d0fa345
+lib_libbison_a_SOURCES += lib/openat-die.c
+
+endif
+## end   gnulib module openat-die
+
+## begin gnulib module openat-h
+
+if gl_GNULIB_ENABLED_03e0aaad4cb89ca757653bd367a6ccb7
+
+endif
+EXTRA_DIST += lib/openat.h
+
+## end   gnulib module openat-h
+
+## begin gnulib module opendir
+
+if gl_GNULIB_ENABLED_opendir
+
+endif
+EXTRA_DIST += lib/dirent-private.h lib/opendir.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/opendir.c
+
+## end   gnulib module opendir
+
+## begin gnulib module oset
+
+lib_libbison_a_SOURCES += lib/gl_oset.h lib/gl_oset.c
+
+## end   gnulib module oset
+
 ## begin gnulib module pathmax
 
 
@@ -1527,6 +2082,15 @@
 
 ## end   gnulib module perror
 
+## begin gnulib module pipe-posix
+
+
+EXTRA_DIST += lib/pipe.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/pipe.c
+
+## end   gnulib module pipe-posix
+
 ## begin gnulib module pipe2
 
 lib_libbison_a_SOURCES += lib/pipe2.c
@@ -1539,6 +2103,15 @@
 
 ## end   gnulib module pipe2-safer
 
+## begin gnulib module posix_spawn
+
+
+EXTRA_DIST += lib/spawn.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/spawn.c
+
+## end   gnulib module posix_spawn
+
 ## begin gnulib module posix_spawn-internal
 
 if gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7
@@ -1550,6 +2123,15 @@
 
 ## end   gnulib module posix_spawn-internal
 
+## begin gnulib module posix_spawn_file_actions_addchdir
+
+
+EXTRA_DIST += lib/spawn_faction_addchdir.c lib/spawn_int.h
+
+EXTRA_lib_libbison_a_SOURCES += lib/spawn_faction_addchdir.c
+
+## end   gnulib module posix_spawn_file_actions_addchdir
+
 ## begin gnulib module posix_spawn_file_actions_addclose
 
 
@@ -1622,6 +2204,15 @@
 
 ## end   gnulib module posix_spawnattr_setflags
 
+## begin gnulib module posix_spawnattr_setpgroup
+
+
+EXTRA_DIST += lib/spawnattr_setpgroup.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/spawnattr_setpgroup.c
+
+## end   gnulib module posix_spawnattr_setpgroup
+
 ## begin gnulib module posix_spawnattr_setsigmask
 
 
@@ -1699,15 +2290,45 @@
 
 ## begin gnulib module rawmemchr
 
-if gl_GNULIB_ENABLED_rawmemchr
 
-endif
 EXTRA_DIST += lib/rawmemchr.c lib/rawmemchr.valgrind
 
 EXTRA_lib_libbison_a_SOURCES += lib/rawmemchr.c
 
 ## end   gnulib module rawmemchr
 
+## begin gnulib module rbtree-oset
+
+lib_libbison_a_SOURCES += lib/gl_rbtree_oset.h lib/gl_rbtree_oset.c lib/gl_rbtree_ordered.h lib/gl_anytree_oset.h
+
+## end   gnulib module rbtree-oset
+
+## begin gnulib module rbtreehash-list
+
+lib_libbison_a_SOURCES += lib/gl_rbtreehash_list.h lib/gl_rbtreehash_list.c lib/gl_anyhash1.h lib/gl_anyhash2.h lib/gl_anyhash_primes.h lib/gl_anyrbtree_list1.h lib/gl_anyrbtree_list2.h lib/gl_anytree_list1.h lib/gl_anytree_list2.h lib/gl_anytreehash_list1.h lib/gl_anytreehash_list2.h
+
+## end   gnulib module rbtreehash-list
+
+## begin gnulib module readdir
+
+if gl_GNULIB_ENABLED_readdir
+
+endif
+EXTRA_DIST += lib/dirent-private.h lib/readdir.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/readdir.c
+
+## end   gnulib module readdir
+
+## begin gnulib module readline
+
+
+EXTRA_DIST += lib/readline.c lib/readline.h
+
+EXTRA_lib_libbison_a_SOURCES += lib/readline.c
+
+## end   gnulib module readline
+
 ## begin gnulib module readlink
 
 
@@ -1717,6 +2338,15 @@
 
 ## end   gnulib module readlink
 
+## begin gnulib module realloc-gnu
+
+
+EXTRA_DIST += lib/realloc.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/realloc.c
+
+## end   gnulib module realloc-gnu
+
 ## begin gnulib module realloc-posix
 
 
@@ -1726,6 +2356,15 @@
 
 ## end   gnulib module realloc-posix
 
+## begin gnulib module reallocarray
+
+
+EXTRA_DIST += lib/reallocarray.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/reallocarray.c
+
+## end   gnulib module reallocarray
+
 ## begin gnulib module relocatable-prog
 
 DEFS += -DEXEEXT=\"@EXEEXT@\"
@@ -1756,7 +2395,7 @@
 ## begin gnulib module relocatable-prog-wrapper
 
 
-EXTRA_DIST += lib/allocator.c lib/allocator.h lib/areadlink.c lib/areadlink.h lib/c-ctype.c lib/c-ctype.h lib/canonicalize-lgpl.c lib/careadlinkat.c lib/careadlinkat.h lib/lstat.c lib/malloca.c lib/malloca.h lib/progname.c lib/progname.h lib/progreloc.c lib/readlink.c lib/relocatable.c lib/relocatable.h lib/relocwrapper.c lib/setenv.c lib/stat.c
+EXTRA_DIST += lib/allocator.c lib/allocator.h lib/areadlink.c lib/areadlink.h lib/c-ctype.c lib/c-ctype.h lib/canonicalize-lgpl.c lib/careadlinkat.c lib/careadlinkat.h lib/free.c lib/malloc.c lib/malloc/scratch_buffer.h lib/malloc/scratch_buffer_dupfree.c lib/malloc/scratch_buffer_grow.c lib/malloc/scratch_buffer_grow_preserve.c lib/malloc/scratch_buffer_set_array_size.c lib/malloca.c lib/malloca.h lib/mempcpy.c lib/progname.c lib/progname.h lib/progreloc.c lib/rawmemchr.c lib/readlink.c lib/realloc.c lib/relocatable.c lib/relocatable.h lib/relocwrapper.c lib/scratch_buffer.h lib/setenv.c lib/stat.c
 
 EXTRA_DIST += $(top_srcdir)/build-aux/install-reloc
 
@@ -1778,6 +2417,17 @@
 
 ## end   gnulib module rename
 
+## begin gnulib module rewinddir
+
+if gl_GNULIB_ENABLED_rewinddir
+
+endif
+EXTRA_DIST += lib/dirent-private.h lib/rewinddir.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/rewinddir.c
+
+## end   gnulib module rewinddir
+
 ## begin gnulib module rmdir
 
 if gl_GNULIB_ENABLED_rmdir
@@ -1791,13 +2441,21 @@
 
 ## begin gnulib module same-inode
 
-if gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62
 
-endif
 EXTRA_DIST += lib/same-inode.h
 
 ## end   gnulib module same-inode
 
+## begin gnulib module save-cwd
+
+if gl_GNULIB_ENABLED_d4850532688ba16d685f036076611f21
+lib_libbison_a_SOURCES += lib/save-cwd.c
+
+endif
+EXTRA_DIST += lib/save-cwd.h
+
+## end   gnulib module save-cwd
+
 ## begin gnulib module sched
 
 BUILT_SOURCES += lib/sched.h
@@ -1815,7 +2473,7 @@
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_SCHED_H''@|$(NEXT_SCHED_H)|g' \
 	      -e 's|@''HAVE_STRUCT_SCHED_PARAM''@|$(HAVE_STRUCT_SCHED_PARAM)|g' \
-	      -e 's/@''GNULIB_SCHED_YIELD''@/$(GNULIB_SCHED_YIELD)/g' \
+	      -e 's/@''GNULIB_SCHED_YIELD''@/$(GL_GNULIB_SCHED_YIELD)/g' \
 	      -e 's|@''HAVE_SCHED_YIELD''@|$(HAVE_SCHED_YIELD)|g' \
 	      -e 's|@''REPLACE_SCHED_YIELD''@|$(REPLACE_SCHED_YIELD)|g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
@@ -1829,6 +2487,41 @@
 
 ## end   gnulib module sched
 
+## begin gnulib module scratch_buffer
+
+BUILT_SOURCES += lib/malloc/scratch_buffer.gl.h
+
+lib/malloc/scratch_buffer.gl.h: lib/malloc/scratch_buffer.h
+	$(AM_V_at)$(MKDIR_P) lib/malloc
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  sed -e 's|__always_inline|inline _GL_ATTRIBUTE_ALWAYS_INLINE|g' \
+	      -e 's|__glibc_likely|_GL_LIKELY|g' \
+	      -e 's|__glibc_unlikely|_GL_UNLIKELY|g' \
+	      -e '/libc_hidden_proto/d' \
+	      < $(top_srcdir)/lib/malloc/scratch_buffer.h; \
+	} > $@-t && \
+	mv $@-t $@
+MOSTLYCLEANFILES += lib/malloc/scratch_buffer.gl.h lib/malloc/scratch_buffer.gl.h-t
+
+lib_libbison_a_SOURCES += lib/malloc/scratch_buffer_dupfree.c                 lib/malloc/scratch_buffer_grow.c                 lib/malloc/scratch_buffer_grow_preserve.c                 lib/malloc/scratch_buffer_set_array_size.c
+
+EXTRA_DIST += lib/malloc/scratch_buffer.h lib/scratch_buffer.h
+
+## end   gnulib module scratch_buffer
+
+## begin gnulib module setlocale-null
+
+if gl_GNULIB_ENABLED_e7e881d32ca02f1c997b13c737c64bbd
+lib_libbison_a_SOURCES += lib/setlocale_null.c
+
+endif
+EXTRA_DIST += lib/setlocale-lock.c lib/setlocale_null.h lib/windows-initguard.h
+
+EXTRA_lib_libbison_a_SOURCES += lib/setlocale-lock.c
+
+## end   gnulib module setlocale-null
+
 ## begin gnulib module sigaction
 
 lib_libbison_a_SOURCES += lib/sig-handler.c
@@ -1853,11 +2546,11 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_SIGNAL_H''@|$(NEXT_SIGNAL_H)|g' \
-	      -e 's/@''GNULIB_PTHREAD_SIGMASK''@/$(GNULIB_PTHREAD_SIGMASK)/g' \
-	      -e 's/@''GNULIB_RAISE''@/$(GNULIB_RAISE)/g' \
-	      -e 's/@''GNULIB_SIGNAL_H_SIGPIPE''@/$(GNULIB_SIGNAL_H_SIGPIPE)/g' \
-	      -e 's/@''GNULIB_SIGPROCMASK''@/$(GNULIB_SIGPROCMASK)/g' \
-	      -e 's/@''GNULIB_SIGACTION''@/$(GNULIB_SIGACTION)/g' \
+	      -e 's/@''GNULIB_PTHREAD_SIGMASK''@/$(GL_GNULIB_PTHREAD_SIGMASK)/g' \
+	      -e 's/@''GNULIB_RAISE''@/$(GL_GNULIB_RAISE)/g' \
+	      -e 's/@''GNULIB_SIGNAL_H_SIGPIPE''@/$(GL_GNULIB_SIGNAL_H_SIGPIPE)/g' \
+	      -e 's/@''GNULIB_SIGPROCMASK''@/$(GL_GNULIB_SIGPROCMASK)/g' \
+	      -e 's/@''GNULIB_SIGACTION''@/$(GL_GNULIB_SIGACTION)/g' \
 	      -e 's|@''HAVE_POSIX_SIGNALBLOCKING''@|$(HAVE_POSIX_SIGNALBLOCKING)|g' \
 	      -e 's|@''HAVE_PTHREAD_SIGMASK''@|$(HAVE_PTHREAD_SIGMASK)|g' \
 	      -e 's|@''HAVE_RAISE''@|$(HAVE_RAISE)|g' \
@@ -1977,29 +2670,29 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_SPAWN_H''@|$(NEXT_SPAWN_H)|g' \
-	      -e 's/@''GNULIB_POSIX_SPAWN''@/$(GNULIB_POSIX_SPAWN)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNP''@/$(GNULIB_POSIX_SPAWNP)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_INIT''@/$(GNULIB_POSIX_SPAWNATTR_INIT)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETFLAGS''@/$(GNULIB_POSIX_SPAWNATTR_GETFLAGS)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETFLAGS''@/$(GNULIB_POSIX_SPAWNATTR_SETFLAGS)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETPGROUP''@/$(GNULIB_POSIX_SPAWNATTR_GETPGROUP)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETPGROUP''@/$(GNULIB_POSIX_SPAWNATTR_SETPGROUP)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM''@/$(GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM''@/$(GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY''@/$(GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY''@/$(GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT''@/$(GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT''@/$(GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSIGMASK''@/$(GNULIB_POSIX_SPAWNATTR_GETSIGMASK)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSIGMASK''@/$(GNULIB_POSIX_SPAWNATTR_SETSIGMASK)/g' \
-	      -e 's/@''GNULIB_POSIX_SPAWNATTR_DESTROY''@/$(GNULIB_POSIX_SPAWNATTR_DESTROY)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWN''@/$(GL_GNULIB_POSIX_SPAWN)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNP''@/$(GL_GNULIB_POSIX_SPAWNP)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT''@/$(GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR''@/$(GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE''@/$(GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2''@/$(GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR''@/$(GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN''@/$(GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY''@/$(GL_GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_INIT''@/$(GL_GNULIB_POSIX_SPAWNATTR_INIT)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETFLAGS''@/$(GL_GNULIB_POSIX_SPAWNATTR_GETFLAGS)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETFLAGS''@/$(GL_GNULIB_POSIX_SPAWNATTR_SETFLAGS)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETPGROUP''@/$(GL_GNULIB_POSIX_SPAWNATTR_GETPGROUP)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETPGROUP''@/$(GL_GNULIB_POSIX_SPAWNATTR_SETPGROUP)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM''@/$(GL_GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM''@/$(GL_GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY''@/$(GL_GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY''@/$(GL_GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT''@/$(GL_GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT''@/$(GL_GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSIGMASK''@/$(GL_GNULIB_POSIX_SPAWNATTR_GETSIGMASK)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSIGMASK''@/$(GL_GNULIB_POSIX_SPAWNATTR_SETSIGMASK)/g' \
+	      -e 's/@''GNULIB_POSIX_SPAWNATTR_DESTROY''@/$(GL_GNULIB_POSIX_SPAWNATTR_DESTROY)/g' \
 	      -e 's|@''HAVE_POSIX_SPAWN''@|$(HAVE_POSIX_SPAWN)|g' \
 	      -e 's|@''HAVE_POSIX_SPAWNATTR_T''@|$(HAVE_POSIX_SPAWNATTR_T)|g' \
 	      -e 's|@''HAVE_POSIX_SPAWN_FILE_ACTIONS_T''@|$(HAVE_POSIX_SPAWN_FILE_ACTIONS_T)|g' \
@@ -2025,7 +2718,11 @@
 
 ## begin gnulib module spawn-pipe
 
-lib_libbison_a_SOURCES += lib/spawn-pipe.h lib/spawn-pipe.c lib/w32spawn.h
+lib_libbison_a_SOURCES += lib/spawn-pipe.h lib/spawn-pipe.c
+
+EXTRA_DIST += lib/os2-spawn.c lib/os2-spawn.h
+
+EXTRA_lib_libbison_a_SOURCES += lib/os2-spawn.c
 
 ## end   gnulib module spawn-pipe
 
@@ -2040,9 +2737,7 @@
 
 ## begin gnulib module stat
 
-if gl_GNULIB_ENABLED_stat
 
-endif
 EXTRA_DIST += lib/stat-w32.c lib/stat-w32.h lib/stat.c
 
 EXTRA_lib_libbison_a_SOURCES += lib/stat-w32.c lib/stat.c
@@ -2059,6 +2754,29 @@
 
 ## end   gnulib module stat-time
 
+## begin gnulib module stdalign
+
+BUILT_SOURCES += $(STDALIGN_H)
+
+# We need the following in order to create <stdalign.h> when the system
+# doesn't have one that works.
+if GL_GENERATE_STDALIGN_H
+lib/stdalign.h: lib/stdalign.in.h $(top_builddir)/config.status
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  cat $(top_srcdir)/lib/stdalign.in.h; \
+	} > $@-t && \
+	mv $@-t $@
+else
+lib/stdalign.h: $(top_builddir)/config.status
+	rm -f $@
+endif
+MOSTLYCLEANFILES += lib/stdalign.h lib/stdalign.h-t
+
+EXTRA_DIST += lib/stdalign.in.h
+
+## end   gnulib module stdalign
+
 ## begin gnulib module stdbool
 
 BUILT_SOURCES += $(STDBOOL_H)
@@ -2135,8 +2853,6 @@
 	      -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \
 	      -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \
 	      -e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \
-	      -e 's/@''HAVE_LONG_LONG_INT''@/$(HAVE_LONG_LONG_INT)/g' \
-	      -e 's/@''HAVE_UNSIGNED_LONG_LONG_INT''@/$(HAVE_UNSIGNED_LONG_LONG_INT)/g' \
 	      -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
 	      -e 's/@''BITSIZEOF_PTRDIFF_T''@/$(BITSIZEOF_PTRDIFF_T)/g' \
 	      -e 's/@''PTRDIFF_T_SUFFIX''@/$(PTRDIFF_T_SUFFIX)/g' \
@@ -2151,7 +2867,7 @@
 	      -e 's/@''BITSIZEOF_WINT_T''@/$(BITSIZEOF_WINT_T)/g' \
 	      -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \
 	      -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \
-	      -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \
+	      -e 's/@''GNULIBHEADERS_OVERRIDE_WINT_T''@/$(GNULIBHEADERS_OVERRIDE_WINT_T)/g' \
 	      < $(top_srcdir)/lib/stdint.in.h; \
 	} > $@-t && \
 	mv $@-t $@
@@ -2179,61 +2895,68 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \
-	      -e 's/@''GNULIB_DPRINTF''@/$(GNULIB_DPRINTF)/g' \
-	      -e 's/@''GNULIB_FCLOSE''@/$(GNULIB_FCLOSE)/g' \
-	      -e 's/@''GNULIB_FDOPEN''@/$(GNULIB_FDOPEN)/g' \
-	      -e 's/@''GNULIB_FFLUSH''@/$(GNULIB_FFLUSH)/g' \
-	      -e 's/@''GNULIB_FGETC''@/$(GNULIB_FGETC)/g' \
-	      -e 's/@''GNULIB_FGETS''@/$(GNULIB_FGETS)/g' \
-	      -e 's/@''GNULIB_FOPEN''@/$(GNULIB_FOPEN)/g' \
-	      -e 's/@''GNULIB_FPRINTF''@/$(GNULIB_FPRINTF)/g' \
-	      -e 's/@''GNULIB_FPRINTF_POSIX''@/$(GNULIB_FPRINTF_POSIX)/g' \
-	      -e 's/@''GNULIB_FPURGE''@/$(GNULIB_FPURGE)/g' \
-	      -e 's/@''GNULIB_FPUTC''@/$(GNULIB_FPUTC)/g' \
-	      -e 's/@''GNULIB_FPUTS''@/$(GNULIB_FPUTS)/g' \
-	      -e 's/@''GNULIB_FREAD''@/$(GNULIB_FREAD)/g' \
-	      -e 's/@''GNULIB_FREOPEN''@/$(GNULIB_FREOPEN)/g' \
-	      -e 's/@''GNULIB_FSCANF''@/$(GNULIB_FSCANF)/g' \
-	      -e 's/@''GNULIB_FSEEK''@/$(GNULIB_FSEEK)/g' \
-	      -e 's/@''GNULIB_FSEEKO''@/$(GNULIB_FSEEKO)/g' \
-	      -e 's/@''GNULIB_FTELL''@/$(GNULIB_FTELL)/g' \
-	      -e 's/@''GNULIB_FTELLO''@/$(GNULIB_FTELLO)/g' \
-	      -e 's/@''GNULIB_FWRITE''@/$(GNULIB_FWRITE)/g' \
-	      -e 's/@''GNULIB_GETC''@/$(GNULIB_GETC)/g' \
-	      -e 's/@''GNULIB_GETCHAR''@/$(GNULIB_GETCHAR)/g' \
-	      -e 's/@''GNULIB_GETDELIM''@/$(GNULIB_GETDELIM)/g' \
-	      -e 's/@''GNULIB_GETLINE''@/$(GNULIB_GETLINE)/g' \
-	      -e 's/@''GNULIB_OBSTACK_PRINTF''@/$(GNULIB_OBSTACK_PRINTF)/g' \
-	      -e 's/@''GNULIB_OBSTACK_PRINTF_POSIX''@/$(GNULIB_OBSTACK_PRINTF_POSIX)/g' \
-	      -e 's/@''GNULIB_PCLOSE''@/$(GNULIB_PCLOSE)/g' \
-	      -e 's/@''GNULIB_PERROR''@/$(GNULIB_PERROR)/g' \
-	      -e 's/@''GNULIB_POPEN''@/$(GNULIB_POPEN)/g' \
-	      -e 's/@''GNULIB_PRINTF''@/$(GNULIB_PRINTF)/g' \
-	      -e 's/@''GNULIB_PRINTF_POSIX''@/$(GNULIB_PRINTF_POSIX)/g' \
-	      -e 's/@''GNULIB_PUTC''@/$(GNULIB_PUTC)/g' \
-	      -e 's/@''GNULIB_PUTCHAR''@/$(GNULIB_PUTCHAR)/g' \
-	      -e 's/@''GNULIB_PUTS''@/$(GNULIB_PUTS)/g' \
-	      -e 's/@''GNULIB_REMOVE''@/$(GNULIB_REMOVE)/g' \
-	      -e 's/@''GNULIB_RENAME''@/$(GNULIB_RENAME)/g' \
-	      -e 's/@''GNULIB_RENAMEAT''@/$(GNULIB_RENAMEAT)/g' \
-	      -e 's/@''GNULIB_SCANF''@/$(GNULIB_SCANF)/g' \
-	      -e 's/@''GNULIB_SNPRINTF''@/$(GNULIB_SNPRINTF)/g' \
-	      -e 's/@''GNULIB_SPRINTF_POSIX''@/$(GNULIB_SPRINTF_POSIX)/g' \
-	      -e 's/@''GNULIB_STDIO_H_NONBLOCKING''@/$(GNULIB_STDIO_H_NONBLOCKING)/g' \
-	      -e 's/@''GNULIB_STDIO_H_SIGPIPE''@/$(GNULIB_STDIO_H_SIGPIPE)/g' \
-	      -e 's/@''GNULIB_TMPFILE''@/$(GNULIB_TMPFILE)/g' \
-	      -e 's/@''GNULIB_VASPRINTF''@/$(GNULIB_VASPRINTF)/g' \
-	      -e 's/@''GNULIB_VDPRINTF''@/$(GNULIB_VDPRINTF)/g' \
-	      -e 's/@''GNULIB_VFPRINTF''@/$(GNULIB_VFPRINTF)/g' \
-	      -e 's/@''GNULIB_VFPRINTF_POSIX''@/$(GNULIB_VFPRINTF_POSIX)/g' \
-	      -e 's/@''GNULIB_VFSCANF''@/$(GNULIB_VFSCANF)/g' \
-	      -e 's/@''GNULIB_VSCANF''@/$(GNULIB_VSCANF)/g' \
-	      -e 's/@''GNULIB_VPRINTF''@/$(GNULIB_VPRINTF)/g' \
-	      -e 's/@''GNULIB_VPRINTF_POSIX''@/$(GNULIB_VPRINTF_POSIX)/g' \
-	      -e 's/@''GNULIB_VSNPRINTF''@/$(GNULIB_VSNPRINTF)/g' \
-	      -e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GNULIB_VSPRINTF_POSIX)/g' \
+	      -e 's/@''GNULIB_DPRINTF''@/$(GL_GNULIB_DPRINTF)/g' \
+	      -e 's/@''GNULIB_FCLOSE''@/$(GL_GNULIB_FCLOSE)/g' \
+	      -e 's/@''GNULIB_FDOPEN''@/$(GL_GNULIB_FDOPEN)/g' \
+	      -e 's/@''GNULIB_FFLUSH''@/$(GL_GNULIB_FFLUSH)/g' \
+	      -e 's/@''GNULIB_FGETC''@/$(GL_GNULIB_FGETC)/g' \
+	      -e 's/@''GNULIB_FGETS''@/$(GL_GNULIB_FGETS)/g' \
+	      -e 's/@''GNULIB_FOPEN''@/$(GL_GNULIB_FOPEN)/g' \
+	      -e 's/@''GNULIB_FPRINTF''@/$(GL_GNULIB_FPRINTF)/g' \
+	      -e 's/@''GNULIB_FPRINTF_POSIX''@/$(GL_GNULIB_FPRINTF_POSIX)/g' \
+	      -e 's/@''GNULIB_FPURGE''@/$(GL_GNULIB_FPURGE)/g' \
+	      -e 's/@''GNULIB_FPUTC''@/$(GL_GNULIB_FPUTC)/g' \
+	      -e 's/@''GNULIB_FPUTS''@/$(GL_GNULIB_FPUTS)/g' \
+	      -e 's/@''GNULIB_FREAD''@/$(GL_GNULIB_FREAD)/g' \
+	      -e 's/@''GNULIB_FREOPEN''@/$(GL_GNULIB_FREOPEN)/g' \
+	      -e 's/@''GNULIB_FSCANF''@/$(GL_GNULIB_FSCANF)/g' \
+	      -e 's/@''GNULIB_FSEEK''@/$(GL_GNULIB_FSEEK)/g' \
+	      -e 's/@''GNULIB_FSEEKO''@/$(GL_GNULIB_FSEEKO)/g' \
+	      -e 's/@''GNULIB_FTELL''@/$(GL_GNULIB_FTELL)/g' \
+	      -e 's/@''GNULIB_FTELLO''@/$(GL_GNULIB_FTELLO)/g' \
+	      -e 's/@''GNULIB_FWRITE''@/$(GL_GNULIB_FWRITE)/g' \
+	      -e 's/@''GNULIB_GETC''@/$(GL_GNULIB_GETC)/g' \
+	      -e 's/@''GNULIB_GETCHAR''@/$(GL_GNULIB_GETCHAR)/g' \
+	      -e 's/@''GNULIB_GETDELIM''@/$(GL_GNULIB_GETDELIM)/g' \
+	      -e 's/@''GNULIB_GETLINE''@/$(GL_GNULIB_GETLINE)/g' \
+	      -e 's/@''GNULIB_OBSTACK_PRINTF''@/$(GL_GNULIB_OBSTACK_PRINTF)/g' \
+	      -e 's/@''GNULIB_OBSTACK_PRINTF_POSIX''@/$(GL_GNULIB_OBSTACK_PRINTF_POSIX)/g' \
+	      -e 's/@''GNULIB_PCLOSE''@/$(GL_GNULIB_PCLOSE)/g' \
+	      -e 's/@''GNULIB_PERROR''@/$(GL_GNULIB_PERROR)/g' \
+	      -e 's/@''GNULIB_POPEN''@/$(GL_GNULIB_POPEN)/g' \
+	      -e 's/@''GNULIB_PRINTF''@/$(GL_GNULIB_PRINTF)/g' \
+	      -e 's/@''GNULIB_PRINTF_POSIX''@/$(GL_GNULIB_PRINTF_POSIX)/g' \
+	      -e 's/@''GNULIB_PUTC''@/$(GL_GNULIB_PUTC)/g' \
+	      -e 's/@''GNULIB_PUTCHAR''@/$(GL_GNULIB_PUTCHAR)/g' \
+	      -e 's/@''GNULIB_PUTS''@/$(GL_GNULIB_PUTS)/g' \
+	      -e 's/@''GNULIB_REMOVE''@/$(GL_GNULIB_REMOVE)/g' \
+	      -e 's/@''GNULIB_RENAME''@/$(GL_GNULIB_RENAME)/g' \
+	      -e 's/@''GNULIB_RENAMEAT''@/$(GL_GNULIB_RENAMEAT)/g' \
+	      -e 's/@''GNULIB_SCANF''@/$(GL_GNULIB_SCANF)/g' \
+	      -e 's/@''GNULIB_SNPRINTF''@/$(GL_GNULIB_SNPRINTF)/g' \
+	      -e 's/@''GNULIB_SPRINTF_POSIX''@/$(GL_GNULIB_SPRINTF_POSIX)/g' \
+	      -e 's/@''GNULIB_STDIO_H_NONBLOCKING''@/$(GL_GNULIB_STDIO_H_NONBLOCKING)/g' \
+	      -e 's/@''GNULIB_STDIO_H_SIGPIPE''@/$(GL_GNULIB_STDIO_H_SIGPIPE)/g' \
+	      -e 's/@''GNULIB_TMPFILE''@/$(GL_GNULIB_TMPFILE)/g' \
+	      -e 's/@''GNULIB_VASPRINTF''@/$(GL_GNULIB_VASPRINTF)/g' \
+	      -e 's/@''GNULIB_VDPRINTF''@/$(GL_GNULIB_VDPRINTF)/g' \
+	      -e 's/@''GNULIB_VFPRINTF''@/$(GL_GNULIB_VFPRINTF)/g' \
+	      -e 's/@''GNULIB_VFPRINTF_POSIX''@/$(GL_GNULIB_VFPRINTF_POSIX)/g' \
+	      -e 's/@''GNULIB_VFSCANF''@/$(GL_GNULIB_VFSCANF)/g' \
+	      -e 's/@''GNULIB_VSCANF''@/$(GL_GNULIB_VSCANF)/g' \
+	      -e 's/@''GNULIB_VPRINTF''@/$(GL_GNULIB_VPRINTF)/g' \
+	      -e 's/@''GNULIB_VPRINTF_POSIX''@/$(GL_GNULIB_VPRINTF_POSIX)/g' \
+	      -e 's/@''GNULIB_VSNPRINTF''@/$(GL_GNULIB_VSNPRINTF)/g' \
+	      -e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GL_GNULIB_VSPRINTF_POSIX)/g' \
+	      -e 's/@''GNULIB_MDA_FCLOSEALL''@/$(GL_GNULIB_MDA_FCLOSEALL)/g' \
+	      -e 's/@''GNULIB_MDA_FDOPEN''@/$(GL_GNULIB_MDA_FDOPEN)/g' \
+	      -e 's/@''GNULIB_MDA_FILENO''@/$(GL_GNULIB_MDA_FILENO)/g' \
+	      -e 's/@''GNULIB_MDA_GETW''@/$(GL_GNULIB_MDA_GETW)/g' \
+	      -e 's/@''GNULIB_MDA_PUTW''@/$(GL_GNULIB_MDA_PUTW)/g' \
+	      -e 's/@''GNULIB_MDA_TEMPNAM''@/$(GL_GNULIB_MDA_TEMPNAM)/g' \
 	      < $(top_srcdir)/lib/stdio.in.h | \
-	  sed -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \
+	  sed -e 's|@''HAVE_DECL_FCLOSEALL''@|$(HAVE_DECL_FCLOSEALL)|g' \
+	      -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \
 	      -e 's|@''HAVE_DECL_FSEEKO''@|$(HAVE_DECL_FSEEKO)|g' \
 	      -e 's|@''HAVE_DECL_FTELLO''@|$(HAVE_DECL_FTELLO)|g' \
 	      -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \
@@ -2308,45 +3031,59 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \
-	      -e 's/@''GNULIB__EXIT''@/$(GNULIB__EXIT)/g' \
-	      -e 's/@''GNULIB_ATOLL''@/$(GNULIB_ATOLL)/g' \
-	      -e 's/@''GNULIB_CALLOC_POSIX''@/$(GNULIB_CALLOC_POSIX)/g' \
-	      -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GNULIB_CANONICALIZE_FILE_NAME)/g' \
-	      -e 's/@''GNULIB_GETLOADAVG''@/$(GNULIB_GETLOADAVG)/g' \
-	      -e 's/@''GNULIB_GETSUBOPT''@/$(GNULIB_GETSUBOPT)/g' \
-	      -e 's/@''GNULIB_GRANTPT''@/$(GNULIB_GRANTPT)/g' \
-	      -e 's/@''GNULIB_MALLOC_POSIX''@/$(GNULIB_MALLOC_POSIX)/g' \
-	      -e 's/@''GNULIB_MBTOWC''@/$(GNULIB_MBTOWC)/g' \
-	      -e 's/@''GNULIB_MKDTEMP''@/$(GNULIB_MKDTEMP)/g' \
-	      -e 's/@''GNULIB_MKOSTEMP''@/$(GNULIB_MKOSTEMP)/g' \
-	      -e 's/@''GNULIB_MKOSTEMPS''@/$(GNULIB_MKOSTEMPS)/g' \
-	      -e 's/@''GNULIB_MKSTEMP''@/$(GNULIB_MKSTEMP)/g' \
-	      -e 's/@''GNULIB_MKSTEMPS''@/$(GNULIB_MKSTEMPS)/g' \
-	      -e 's/@''GNULIB_POSIX_OPENPT''@/$(GNULIB_POSIX_OPENPT)/g' \
-	      -e 's/@''GNULIB_PTSNAME''@/$(GNULIB_PTSNAME)/g' \
-	      -e 's/@''GNULIB_PTSNAME_R''@/$(GNULIB_PTSNAME_R)/g' \
-	      -e 's/@''GNULIB_PUTENV''@/$(GNULIB_PUTENV)/g' \
-	      -e 's/@''GNULIB_QSORT_R''@/$(GNULIB_QSORT_R)/g' \
-	      -e 's/@''GNULIB_RANDOM''@/$(GNULIB_RANDOM)/g' \
-	      -e 's/@''GNULIB_RANDOM_R''@/$(GNULIB_RANDOM_R)/g' \
-	      -e 's/@''GNULIB_REALLOC_POSIX''@/$(GNULIB_REALLOC_POSIX)/g' \
-	      -e 's/@''GNULIB_REALLOCARRAY''@/$(GNULIB_REALLOCARRAY)/g' \
-	      -e 's/@''GNULIB_REALPATH''@/$(GNULIB_REALPATH)/g' \
-	      -e 's/@''GNULIB_RPMATCH''@/$(GNULIB_RPMATCH)/g' \
-	      -e 's/@''GNULIB_SECURE_GETENV''@/$(GNULIB_SECURE_GETENV)/g' \
-	      -e 's/@''GNULIB_SETENV''@/$(GNULIB_SETENV)/g' \
-	      -e 's/@''GNULIB_STRTOD''@/$(GNULIB_STRTOD)/g' \
-	      -e 's/@''GNULIB_STRTOLD''@/$(GNULIB_STRTOLD)/g' \
-	      -e 's/@''GNULIB_STRTOLL''@/$(GNULIB_STRTOLL)/g' \
-	      -e 's/@''GNULIB_STRTOULL''@/$(GNULIB_STRTOULL)/g' \
-	      -e 's/@''GNULIB_SYSTEM_POSIX''@/$(GNULIB_SYSTEM_POSIX)/g' \
-	      -e 's/@''GNULIB_UNLOCKPT''@/$(GNULIB_UNLOCKPT)/g' \
-	      -e 's/@''GNULIB_UNSETENV''@/$(GNULIB_UNSETENV)/g' \
-	      -e 's/@''GNULIB_WCTOMB''@/$(GNULIB_WCTOMB)/g' \
+	      -e 's/@''GNULIB__EXIT''@/$(GL_GNULIB__EXIT)/g' \
+	      -e 's/@''GNULIB_ALIGNED_ALLOC''@/$(GL_GNULIB_ALIGNED_ALLOC)/g' \
+	      -e 's/@''GNULIB_ATOLL''@/$(GL_GNULIB_ATOLL)/g' \
+	      -e 's/@''GNULIB_CALLOC_POSIX''@/$(GL_GNULIB_CALLOC_POSIX)/g' \
+	      -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GL_GNULIB_CANONICALIZE_FILE_NAME)/g' \
+	      -e 's/@''GNULIB_FREE_POSIX''@/$(GL_GNULIB_FREE_POSIX)/g' \
+	      -e 's/@''GNULIB_GETLOADAVG''@/$(GL_GNULIB_GETLOADAVG)/g' \
+	      -e 's/@''GNULIB_GETSUBOPT''@/$(GL_GNULIB_GETSUBOPT)/g' \
+	      -e 's/@''GNULIB_GRANTPT''@/$(GL_GNULIB_GRANTPT)/g' \
+	      -e 's/@''GNULIB_MALLOC_POSIX''@/$(GL_GNULIB_MALLOC_POSIX)/g' \
+	      -e 's/@''GNULIB_MBTOWC''@/$(GL_GNULIB_MBTOWC)/g' \
+	      -e 's/@''GNULIB_MKDTEMP''@/$(GL_GNULIB_MKDTEMP)/g' \
+	      -e 's/@''GNULIB_MKOSTEMP''@/$(GL_GNULIB_MKOSTEMP)/g' \
+	      -e 's/@''GNULIB_MKOSTEMPS''@/$(GL_GNULIB_MKOSTEMPS)/g' \
+	      -e 's/@''GNULIB_MKSTEMP''@/$(GL_GNULIB_MKSTEMP)/g' \
+	      -e 's/@''GNULIB_MKSTEMPS''@/$(GL_GNULIB_MKSTEMPS)/g' \
+	      -e 's/@''GNULIB_POSIX_MEMALIGN''@/$(GL_GNULIB_POSIX_MEMALIGN)/g' \
+	      -e 's/@''GNULIB_POSIX_OPENPT''@/$(GL_GNULIB_POSIX_OPENPT)/g' \
+	      -e 's/@''GNULIB_PTSNAME''@/$(GL_GNULIB_PTSNAME)/g' \
+	      -e 's/@''GNULIB_PTSNAME_R''@/$(GL_GNULIB_PTSNAME_R)/g' \
+	      -e 's/@''GNULIB_PUTENV''@/$(GL_GNULIB_PUTENV)/g' \
+	      -e 's/@''GNULIB_QSORT_R''@/$(GL_GNULIB_QSORT_R)/g' \
+	      -e 's/@''GNULIB_RANDOM''@/$(GL_GNULIB_RANDOM)/g' \
+	      -e 's/@''GNULIB_RANDOM_R''@/$(GL_GNULIB_RANDOM_R)/g' \
+	      -e 's/@''GNULIB_REALLOC_POSIX''@/$(GL_GNULIB_REALLOC_POSIX)/g' \
+	      -e 's/@''GNULIB_REALLOCARRAY''@/$(GL_GNULIB_REALLOCARRAY)/g' \
+	      -e 's/@''GNULIB_REALPATH''@/$(GL_GNULIB_REALPATH)/g' \
+	      -e 's/@''GNULIB_RPMATCH''@/$(GL_GNULIB_RPMATCH)/g' \
+	      -e 's/@''GNULIB_SECURE_GETENV''@/$(GL_GNULIB_SECURE_GETENV)/g' \
+	      -e 's/@''GNULIB_SETENV''@/$(GL_GNULIB_SETENV)/g' \
+	      -e 's/@''GNULIB_STRTOD''@/$(GL_GNULIB_STRTOD)/g' \
+	      -e 's/@''GNULIB_STRTOL''@/$(GL_GNULIB_STRTOL)/g' \
+	      -e 's/@''GNULIB_STRTOLD''@/$(GL_GNULIB_STRTOLD)/g' \
+	      -e 's/@''GNULIB_STRTOLL''@/$(GL_GNULIB_STRTOLL)/g' \
+	      -e 's/@''GNULIB_STRTOUL''@/$(GL_GNULIB_STRTOUL)/g' \
+	      -e 's/@''GNULIB_STRTOULL''@/$(GL_GNULIB_STRTOULL)/g' \
+	      -e 's/@''GNULIB_SYSTEM_POSIX''@/$(GL_GNULIB_SYSTEM_POSIX)/g' \
+	      -e 's/@''GNULIB_UNLOCKPT''@/$(GL_GNULIB_UNLOCKPT)/g' \
+	      -e 's/@''GNULIB_UNSETENV''@/$(GL_GNULIB_UNSETENV)/g' \
+	      -e 's/@''GNULIB_WCTOMB''@/$(GL_GNULIB_WCTOMB)/g' \
+	      -e 's/@''GNULIB_MDA_ECVT''@/$(GL_GNULIB_MDA_ECVT)/g' \
+	      -e 's/@''GNULIB_MDA_FCVT''@/$(GL_GNULIB_MDA_FCVT)/g' \
+	      -e 's/@''GNULIB_MDA_GCVT''@/$(GL_GNULIB_MDA_GCVT)/g' \
+	      -e 's/@''GNULIB_MDA_MKTEMP''@/$(GL_GNULIB_MDA_MKTEMP)/g' \
+	      -e 's/@''GNULIB_MDA_PUTENV''@/$(GL_GNULIB_MDA_PUTENV)/g' \
 	      < $(top_srcdir)/lib/stdlib.in.h | \
 	  sed -e 's|@''HAVE__EXIT''@|$(HAVE__EXIT)|g' \
+	      -e 's|@''HAVE_ALIGNED_ALLOC''@|$(HAVE_ALIGNED_ALLOC)|g' \
 	      -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \
 	      -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \
+	      -e 's|@''HAVE_DECL_ECVT''@|$(HAVE_DECL_ECVT)|g' \
+	      -e 's|@''HAVE_DECL_FCVT''@|$(HAVE_DECL_FCVT)|g' \
+	      -e 's|@''HAVE_DECL_GCVT''@|$(HAVE_DECL_GCVT)|g' \
 	      -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \
 	      -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \
 	      -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \
@@ -2358,6 +3095,7 @@
 	      -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \
 	      -e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \
 	      -e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \
+	      -e 's|@''HAVE_POSIX_MEMALIGN''@|$(HAVE_POSIX_MEMALIGN)|g' \
 	      -e 's|@''HAVE_POSIX_OPENPT''@|$(HAVE_POSIX_OPENPT)|g' \
 	      -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \
 	      -e 's|@''HAVE_PTSNAME_R''@|$(HAVE_PTSNAME_R)|g' \
@@ -2373,19 +3111,24 @@
 	      -e 's|@''HAVE_SETSTATE''@|$(HAVE_SETSTATE)|g' \
 	      -e 's|@''HAVE_DECL_SETSTATE''@|$(HAVE_DECL_SETSTATE)|g' \
 	      -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \
+	      -e 's|@''HAVE_STRTOL''@|$(HAVE_STRTOL)|g' \
 	      -e 's|@''HAVE_STRTOLD''@|$(HAVE_STRTOLD)|g' \
 	      -e 's|@''HAVE_STRTOLL''@|$(HAVE_STRTOLL)|g' \
+	      -e 's|@''HAVE_STRTOUL''@|$(HAVE_STRTOUL)|g' \
 	      -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \
 	      -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \
 	      -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \
 	      -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \
 	      -e 's|@''HAVE_DECL_UNSETENV''@|$(HAVE_DECL_UNSETENV)|g' \
+	      -e 's|@''REPLACE_ALIGNED_ALLOC''@|$(REPLACE_ALIGNED_ALLOC)|g' \
 	      -e 's|@''REPLACE_CALLOC''@|$(REPLACE_CALLOC)|g' \
 	      -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \
+	      -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \
 	      -e 's|@''REPLACE_INITSTATE''@|$(REPLACE_INITSTATE)|g' \
 	      -e 's|@''REPLACE_MALLOC''@|$(REPLACE_MALLOC)|g' \
 	      -e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \
 	      -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \
+	      -e 's|@''REPLACE_POSIX_MEMALIGN''@|$(REPLACE_POSIX_MEMALIGN)|g' \
 	      -e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \
 	      -e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \
 	      -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \
@@ -2393,11 +3136,16 @@
 	      -e 's|@''REPLACE_RANDOM''@|$(REPLACE_RANDOM)|g' \
 	      -e 's|@''REPLACE_RANDOM_R''@|$(REPLACE_RANDOM_R)|g' \
 	      -e 's|@''REPLACE_REALLOC''@|$(REPLACE_REALLOC)|g' \
+	      -e 's|@''REPLACE_REALLOCARRAY''@|$(REPLACE_REALLOCARRAY)|g' \
 	      -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \
 	      -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \
 	      -e 's|@''REPLACE_SETSTATE''@|$(REPLACE_SETSTATE)|g' \
 	      -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \
+	      -e 's|@''REPLACE_STRTOL''@|$(REPLACE_STRTOL)|g' \
 	      -e 's|@''REPLACE_STRTOLD''@|$(REPLACE_STRTOLD)|g' \
+	      -e 's|@''REPLACE_STRTOLL''@|$(REPLACE_STRTOLL)|g' \
+	      -e 's|@''REPLACE_STRTOUL''@|$(REPLACE_STRTOUL)|g' \
+	      -e 's|@''REPLACE_STRTOULL''@|$(REPLACE_STRTOULL)|g' \
 	      -e 's|@''REPLACE_UNSETENV''@|$(REPLACE_UNSETENV)|g' \
 	      -e 's|@''REPLACE_WCTOMB''@|$(REPLACE_WCTOMB)|g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
@@ -2421,6 +3169,15 @@
 
 ## end   gnulib module stpcpy
 
+## begin gnulib module stpncpy
+
+
+EXTRA_DIST += lib/stpncpy.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/stpncpy.c
+
+## end   gnulib module stpncpy
+
 ## begin gnulib module strchrnul
 
 if gl_GNULIB_ENABLED_strchrnul
@@ -2493,50 +3250,54 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \
-	      -e 's/@''GNULIB_EXPLICIT_BZERO''@/$(GNULIB_EXPLICIT_BZERO)/g' \
-	      -e 's/@''GNULIB_FFSL''@/$(GNULIB_FFSL)/g' \
-	      -e 's/@''GNULIB_FFSLL''@/$(GNULIB_FFSLL)/g' \
-	      -e 's/@''GNULIB_MBSLEN''@/$(GNULIB_MBSLEN)/g' \
-	      -e 's/@''GNULIB_MBSNLEN''@/$(GNULIB_MBSNLEN)/g' \
-	      -e 's/@''GNULIB_MBSCHR''@/$(GNULIB_MBSCHR)/g' \
-	      -e 's/@''GNULIB_MBSRCHR''@/$(GNULIB_MBSRCHR)/g' \
-	      -e 's/@''GNULIB_MBSSTR''@/$(GNULIB_MBSSTR)/g' \
-	      -e 's/@''GNULIB_MBSCASECMP''@/$(GNULIB_MBSCASECMP)/g' \
-	      -e 's/@''GNULIB_MBSNCASECMP''@/$(GNULIB_MBSNCASECMP)/g' \
-	      -e 's/@''GNULIB_MBSPCASECMP''@/$(GNULIB_MBSPCASECMP)/g' \
-	      -e 's/@''GNULIB_MBSCASESTR''@/$(GNULIB_MBSCASESTR)/g' \
-	      -e 's/@''GNULIB_MBSCSPN''@/$(GNULIB_MBSCSPN)/g' \
-	      -e 's/@''GNULIB_MBSPBRK''@/$(GNULIB_MBSPBRK)/g' \
-	      -e 's/@''GNULIB_MBSSPN''@/$(GNULIB_MBSSPN)/g' \
-	      -e 's/@''GNULIB_MBSSEP''@/$(GNULIB_MBSSEP)/g' \
-	      -e 's/@''GNULIB_MBSTOK_R''@/$(GNULIB_MBSTOK_R)/g' \
-	      -e 's/@''GNULIB_MEMCHR''@/$(GNULIB_MEMCHR)/g' \
-	      -e 's/@''GNULIB_MEMMEM''@/$(GNULIB_MEMMEM)/g' \
-	      -e 's/@''GNULIB_MEMPCPY''@/$(GNULIB_MEMPCPY)/g' \
-	      -e 's/@''GNULIB_MEMRCHR''@/$(GNULIB_MEMRCHR)/g' \
-	      -e 's/@''GNULIB_RAWMEMCHR''@/$(GNULIB_RAWMEMCHR)/g' \
-	      -e 's/@''GNULIB_STPCPY''@/$(GNULIB_STPCPY)/g' \
-	      -e 's/@''GNULIB_STPNCPY''@/$(GNULIB_STPNCPY)/g' \
-	      -e 's/@''GNULIB_STRCHRNUL''@/$(GNULIB_STRCHRNUL)/g' \
-	      -e 's/@''GNULIB_STRDUP''@/$(GNULIB_STRDUP)/g' \
-	      -e 's/@''GNULIB_STRNCAT''@/$(GNULIB_STRNCAT)/g' \
-	      -e 's/@''GNULIB_STRNDUP''@/$(GNULIB_STRNDUP)/g' \
-	      -e 's/@''GNULIB_STRNLEN''@/$(GNULIB_STRNLEN)/g' \
-	      -e 's/@''GNULIB_STRPBRK''@/$(GNULIB_STRPBRK)/g' \
-	      -e 's/@''GNULIB_STRSEP''@/$(GNULIB_STRSEP)/g' \
-	      -e 's/@''GNULIB_STRSTR''@/$(GNULIB_STRSTR)/g' \
-	      -e 's/@''GNULIB_STRCASESTR''@/$(GNULIB_STRCASESTR)/g' \
-	      -e 's/@''GNULIB_STRTOK_R''@/$(GNULIB_STRTOK_R)/g' \
-	      -e 's/@''GNULIB_STRERROR''@/$(GNULIB_STRERROR)/g' \
-	      -e 's/@''GNULIB_STRERROR_R''@/$(GNULIB_STRERROR_R)/g' \
-	      -e 's/@''GNULIB_STRSIGNAL''@/$(GNULIB_STRSIGNAL)/g' \
-	      -e 's/@''GNULIB_STRVERSCMP''@/$(GNULIB_STRVERSCMP)/g' \
+	      -e 's/@''GNULIB_EXPLICIT_BZERO''@/$(GL_GNULIB_EXPLICIT_BZERO)/g' \
+	      -e 's/@''GNULIB_FFSL''@/$(GL_GNULIB_FFSL)/g' \
+	      -e 's/@''GNULIB_FFSLL''@/$(GL_GNULIB_FFSLL)/g' \
+	      -e 's/@''GNULIB_MBSLEN''@/$(GL_GNULIB_MBSLEN)/g' \
+	      -e 's/@''GNULIB_MBSNLEN''@/$(GL_GNULIB_MBSNLEN)/g' \
+	      -e 's/@''GNULIB_MBSCHR''@/$(GL_GNULIB_MBSCHR)/g' \
+	      -e 's/@''GNULIB_MBSRCHR''@/$(GL_GNULIB_MBSRCHR)/g' \
+	      -e 's/@''GNULIB_MBSSTR''@/$(GL_GNULIB_MBSSTR)/g' \
+	      -e 's/@''GNULIB_MBSCASECMP''@/$(GL_GNULIB_MBSCASECMP)/g' \
+	      -e 's/@''GNULIB_MBSNCASECMP''@/$(GL_GNULIB_MBSNCASECMP)/g' \
+	      -e 's/@''GNULIB_MBSPCASECMP''@/$(GL_GNULIB_MBSPCASECMP)/g' \
+	      -e 's/@''GNULIB_MBSCASESTR''@/$(GL_GNULIB_MBSCASESTR)/g' \
+	      -e 's/@''GNULIB_MBSCSPN''@/$(GL_GNULIB_MBSCSPN)/g' \
+	      -e 's/@''GNULIB_MBSPBRK''@/$(GL_GNULIB_MBSPBRK)/g' \
+	      -e 's/@''GNULIB_MBSSPN''@/$(GL_GNULIB_MBSSPN)/g' \
+	      -e 's/@''GNULIB_MBSSEP''@/$(GL_GNULIB_MBSSEP)/g' \
+	      -e 's/@''GNULIB_MBSTOK_R''@/$(GL_GNULIB_MBSTOK_R)/g' \
+	      -e 's/@''GNULIB_MEMCHR''@/$(GL_GNULIB_MEMCHR)/g' \
+	      -e 's/@''GNULIB_MEMMEM''@/$(GL_GNULIB_MEMMEM)/g' \
+	      -e 's/@''GNULIB_MEMPCPY''@/$(GL_GNULIB_MEMPCPY)/g' \
+	      -e 's/@''GNULIB_MEMRCHR''@/$(GL_GNULIB_MEMRCHR)/g' \
+	      -e 's/@''GNULIB_RAWMEMCHR''@/$(GL_GNULIB_RAWMEMCHR)/g' \
+	      -e 's/@''GNULIB_STPCPY''@/$(GL_GNULIB_STPCPY)/g' \
+	      -e 's/@''GNULIB_STPNCPY''@/$(GL_GNULIB_STPNCPY)/g' \
+	      -e 's/@''GNULIB_STRCHRNUL''@/$(GL_GNULIB_STRCHRNUL)/g' \
+	      -e 's/@''GNULIB_STRDUP''@/$(GL_GNULIB_STRDUP)/g' \
+	      -e 's/@''GNULIB_STRNCAT''@/$(GL_GNULIB_STRNCAT)/g' \
+	      -e 's/@''GNULIB_STRNDUP''@/$(GL_GNULIB_STRNDUP)/g' \
+	      -e 's/@''GNULIB_STRNLEN''@/$(GL_GNULIB_STRNLEN)/g' \
+	      -e 's/@''GNULIB_STRPBRK''@/$(GL_GNULIB_STRPBRK)/g' \
+	      -e 's/@''GNULIB_STRSEP''@/$(GL_GNULIB_STRSEP)/g' \
+	      -e 's/@''GNULIB_STRSTR''@/$(GL_GNULIB_STRSTR)/g' \
+	      -e 's/@''GNULIB_STRCASESTR''@/$(GL_GNULIB_STRCASESTR)/g' \
+	      -e 's/@''GNULIB_STRTOK_R''@/$(GL_GNULIB_STRTOK_R)/g' \
+	      -e 's/@''GNULIB_STRERROR''@/$(GL_GNULIB_STRERROR)/g' \
+	      -e 's/@''GNULIB_STRERROR_R''@/$(GL_GNULIB_STRERROR_R)/g' \
+	      -e 's/@''GNULIB_STRERRORNAME_NP''@/$(GL_GNULIB_STRERRORNAME_NP)/g' \
+	      -e 's/@''GNULIB_SIGABBREV_NP''@/$(GL_GNULIB_SIGABBREV_NP)/g' \
+	      -e 's/@''GNULIB_SIGDESCR_NP''@/$(GL_GNULIB_SIGDESCR_NP)/g' \
+	      -e 's/@''GNULIB_STRSIGNAL''@/$(GL_GNULIB_STRSIGNAL)/g' \
+	      -e 's/@''GNULIB_STRVERSCMP''@/$(GL_GNULIB_STRVERSCMP)/g' \
+	      -e 's/@''GNULIB_MDA_MEMCCPY''@/$(GL_GNULIB_MDA_MEMCCPY)/g' \
+	      -e 's/@''GNULIB_MDA_STRDUP''@/$(GL_GNULIB_MDA_STRDUP)/g' \
 	      < $(top_srcdir)/lib/string.in.h | \
 	  sed -e 's|@''HAVE_EXPLICIT_BZERO''@|$(HAVE_EXPLICIT_BZERO)|g' \
 	      -e 's|@''HAVE_FFSL''@|$(HAVE_FFSL)|g' \
 	      -e 's|@''HAVE_FFSLL''@|$(HAVE_FFSLL)|g' \
 	      -e 's|@''HAVE_MBSLEN''@|$(HAVE_MBSLEN)|g' \
-	      -e 's|@''HAVE_MEMCHR''@|$(HAVE_MEMCHR)|g' \
 	      -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \
 	      -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \
 	      -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \
@@ -2552,10 +3313,15 @@
 	      -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \
 	      -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \
 	      -e 's|@''HAVE_DECL_STRERROR_R''@|$(HAVE_DECL_STRERROR_R)|g' \
+	      -e 's|@''HAVE_STRERRORNAME_NP''@|$(HAVE_STRERRORNAME_NP)|g' \
+	      -e 's|@''HAVE_SIGABBREV_NP''@|$(HAVE_SIGABBREV_NP)|g' \
+	      -e 's|@''HAVE_SIGDESCR_NP''@|$(HAVE_SIGDESCR_NP)|g' \
 	      -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \
 	      -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \
+	      -e 's|@''REPLACE_FFSLL''@|$(REPLACE_FFSLL)|g' \
 	      -e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \
 	      -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \
+	      -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \
 	      -e 's|@''REPLACE_STPNCPY''@|$(REPLACE_STPNCPY)|g' \
 	      -e 's|@''REPLACE_STRCHRNUL''@|$(REPLACE_STRCHRNUL)|g' \
 	      -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \
@@ -2567,6 +3333,7 @@
 	      -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \
 	      -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \
 	      -e 's|@''REPLACE_STRERROR_R''@|$(REPLACE_STRERROR_R)|g' \
+	      -e 's|@''REPLACE_STRERRORNAME_NP''@|$(REPLACE_STRERRORNAME_NP)|g' \
 	      -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \
 	      -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
@@ -2581,6 +3348,39 @@
 
 ## end   gnulib module string
 
+## begin gnulib module strings
+
+if gl_GNULIB_ENABLED_strings
+BUILT_SOURCES += lib/strings.h
+
+# We need the following in order to create <strings.h> when the system
+# doesn't have one that works with the given compiler.
+lib/strings.h: lib/strings.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''HAVE_STRINGS_H''@|$(HAVE_STRINGS_H)|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_STRINGS_H''@|$(NEXT_STRINGS_H)|g' \
+	      -e 's/@''GNULIB_FFS''@/$(GL_GNULIB_FFS)/g' \
+	      -e 's|@''HAVE_FFS''@|$(HAVE_FFS)|g' \
+	      -e 's|@''HAVE_STRCASECMP''@|$(HAVE_STRCASECMP)|g' \
+	      -e 's|@''HAVE_DECL_STRNCASECMP''@|$(HAVE_DECL_STRNCASECMP)|g' \
+	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+	      < $(top_srcdir)/lib/strings.in.h; \
+	} > $@-t && \
+	mv $@-t $@
+MOSTLYCLEANFILES += lib/strings.h lib/strings.h-t
+
+endif
+EXTRA_DIST += lib/strings.in.h
+
+## end   gnulib module strings
+
 ## begin gnulib module strndup
 
 
@@ -2601,6 +3401,15 @@
 
 ## end   gnulib module strnlen
 
+## begin gnulib module strtod
+
+
+EXTRA_DIST += lib/strtod.c
+
+EXTRA_lib_libbison_a_SOURCES += lib/strtod.c
+
+## end   gnulib module strtod
+
 ## begin gnulib module strverscmp
 
 
@@ -2610,6 +3419,38 @@
 
 ## end   gnulib module strverscmp
 
+## begin gnulib module sys_ioctl
+
+BUILT_SOURCES += lib/sys/ioctl.h
+
+# We need the following in order to create <sys/ioctl.h> when the system
+# does not have a complete one.
+lib/sys/ioctl.h: lib/sys_ioctl.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+	$(AM_V_at)$(MKDIR_P) lib/sys
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''HAVE_SYS_IOCTL_H''@|$(HAVE_SYS_IOCTL_H)|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_SYS_IOCTL_H''@|$(NEXT_SYS_IOCTL_H)|g' \
+	      -e 's/@''GNULIB_IOCTL''@/$(GL_GNULIB_IOCTL)/g' \
+	      -e 's|@''SYS_IOCTL_H_HAVE_WINSOCK2_H''@|$(SYS_IOCTL_H_HAVE_WINSOCK2_H)|g' \
+	      -e 's|@''SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \
+	      -e 's|@''REPLACE_IOCTL''@|$(REPLACE_IOCTL)|g' \
+	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+	      < $(top_srcdir)/lib/sys_ioctl.in.h; \
+	} > $@-t && \
+	mv $@-t $@
+MOSTLYCLEANFILES += lib/sys/ioctl.h lib/sys/ioctl.h-t
+MOSTLYCLEANDIRS += lib/sys
+
+EXTRA_DIST += lib/sys_ioctl.in.h
+
+## end   gnulib module sys_ioctl
+
 ## begin gnulib module sys_resource
 
 BUILT_SOURCES += lib/sys/resource.h
@@ -2626,7 +3467,7 @@
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_SYS_RESOURCE_H''@|$(NEXT_SYS_RESOURCE_H)|g' \
 	      -e 's|@''HAVE_SYS_RESOURCE_H''@|$(HAVE_SYS_RESOURCE_H)|g' \
-	      -e 's/@''GNULIB_GETRUSAGE''@/$(GNULIB_GETRUSAGE)/g' \
+	      -e 's/@''GNULIB_GETRUSAGE''@/$(GL_GNULIB_GETRUSAGE)/g' \
 	      -e 's/@''HAVE_GETRUSAGE''@/$(HAVE_GETRUSAGE)/g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
 	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
@@ -2643,7 +3484,6 @@
 
 ## begin gnulib module sys_stat
 
-if gl_GNULIB_ENABLED_sys_stat
 BUILT_SOURCES += lib/sys/stat.h
 
 # We need the following in order to create <sys/stat.h> when the system
@@ -2659,23 +3499,29 @@
 	      -e 's|@''NEXT_SYS_STAT_H''@|$(NEXT_SYS_STAT_H)|g' \
 	      -e 's|@''WINDOWS_64_BIT_ST_SIZE''@|$(WINDOWS_64_BIT_ST_SIZE)|g' \
 	      -e 's|@''WINDOWS_STAT_TIMESPEC''@|$(WINDOWS_STAT_TIMESPEC)|g' \
-	      -e 's/@''GNULIB_FCHMODAT''@/$(GNULIB_FCHMODAT)/g' \
-	      -e 's/@''GNULIB_FSTAT''@/$(GNULIB_FSTAT)/g' \
-	      -e 's/@''GNULIB_FSTATAT''@/$(GNULIB_FSTATAT)/g' \
-	      -e 's/@''GNULIB_FUTIMENS''@/$(GNULIB_FUTIMENS)/g' \
-	      -e 's/@''GNULIB_LCHMOD''@/$(GNULIB_LCHMOD)/g' \
-	      -e 's/@''GNULIB_LSTAT''@/$(GNULIB_LSTAT)/g' \
-	      -e 's/@''GNULIB_MKDIRAT''@/$(GNULIB_MKDIRAT)/g' \
-	      -e 's/@''GNULIB_MKFIFO''@/$(GNULIB_MKFIFO)/g' \
-	      -e 's/@''GNULIB_MKFIFOAT''@/$(GNULIB_MKFIFOAT)/g' \
-	      -e 's/@''GNULIB_MKNOD''@/$(GNULIB_MKNOD)/g' \
-	      -e 's/@''GNULIB_MKNODAT''@/$(GNULIB_MKNODAT)/g' \
-	      -e 's/@''GNULIB_STAT''@/$(GNULIB_STAT)/g' \
-	      -e 's/@''GNULIB_UTIMENSAT''@/$(GNULIB_UTIMENSAT)/g' \
-	      -e 's/@''GNULIB_OVERRIDES_STRUCT_STAT''@/$(GNULIB_OVERRIDES_STRUCT_STAT)/g' \
+	      -e 's/@''GNULIB_FCHMODAT''@/$(GL_GNULIB_FCHMODAT)/g' \
+	      -e 's/@''GNULIB_FSTAT''@/$(GL_GNULIB_FSTAT)/g' \
+	      -e 's/@''GNULIB_FSTATAT''@/$(GL_GNULIB_FSTATAT)/g' \
+	      -e 's/@''GNULIB_FUTIMENS''@/$(GL_GNULIB_FUTIMENS)/g' \
+	      -e 's/@''GNULIB_GETUMASK''@/$(GL_GNULIB_GETUMASK)/g' \
+	      -e 's/@''GNULIB_LCHMOD''@/$(GL_GNULIB_LCHMOD)/g' \
+	      -e 's/@''GNULIB_LSTAT''@/$(GL_GNULIB_LSTAT)/g' \
+	      -e 's/@''GNULIB_MKDIR''@/$(GL_GNULIB_MKDIR)/g' \
+	      -e 's/@''GNULIB_MKDIRAT''@/$(GL_GNULIB_MKDIRAT)/g' \
+	      -e 's/@''GNULIB_MKFIFO''@/$(GL_GNULIB_MKFIFO)/g' \
+	      -e 's/@''GNULIB_MKFIFOAT''@/$(GL_GNULIB_MKFIFOAT)/g' \
+	      -e 's/@''GNULIB_MKNOD''@/$(GL_GNULIB_MKNOD)/g' \
+	      -e 's/@''GNULIB_MKNODAT''@/$(GL_GNULIB_MKNODAT)/g' \
+	      -e 's/@''GNULIB_STAT''@/$(GL_GNULIB_STAT)/g' \
+	      -e 's/@''GNULIB_UTIMENSAT''@/$(GL_GNULIB_UTIMENSAT)/g' \
+	      -e 's/@''GNULIB_OVERRIDES_STRUCT_STAT''@/$(GL_GNULIB_OVERRIDES_STRUCT_STAT)/g' \
+	      -e 's/@''GNULIB_MDA_CHMOD''@/$(GL_GNULIB_MDA_CHMOD)/g' \
+	      -e 's/@''GNULIB_MDA_MKDIR''@/$(GL_GNULIB_MDA_MKDIR)/g' \
+	      -e 's/@''GNULIB_MDA_UMASK''@/$(GL_GNULIB_MDA_UMASK)/g' \
 	      -e 's|@''HAVE_FCHMODAT''@|$(HAVE_FCHMODAT)|g' \
 	      -e 's|@''HAVE_FSTATAT''@|$(HAVE_FSTATAT)|g' \
 	      -e 's|@''HAVE_FUTIMENS''@|$(HAVE_FUTIMENS)|g' \
+	      -e 's|@''HAVE_GETUMASK''@|$(HAVE_GETUMASK)|g' \
 	      -e 's|@''HAVE_LCHMOD''@|$(HAVE_LCHMOD)|g' \
 	      -e 's|@''HAVE_LSTAT''@|$(HAVE_LSTAT)|g' \
 	      -e 's|@''HAVE_MKDIRAT''@|$(HAVE_MKDIRAT)|g' \
@@ -2684,13 +3530,16 @@
 	      -e 's|@''HAVE_MKNOD''@|$(HAVE_MKNOD)|g' \
 	      -e 's|@''HAVE_MKNODAT''@|$(HAVE_MKNODAT)|g' \
 	      -e 's|@''HAVE_UTIMENSAT''@|$(HAVE_UTIMENSAT)|g' \
+	      -e 's|@''REPLACE_FCHMODAT''@|$(REPLACE_FCHMODAT)|g' \
 	      -e 's|@''REPLACE_FSTAT''@|$(REPLACE_FSTAT)|g' \
 	      -e 's|@''REPLACE_FSTATAT''@|$(REPLACE_FSTATAT)|g' \
 	      -e 's|@''REPLACE_FUTIMENS''@|$(REPLACE_FUTIMENS)|g' \
 	      -e 's|@''REPLACE_LSTAT''@|$(REPLACE_LSTAT)|g' \
 	      -e 's|@''REPLACE_MKDIR''@|$(REPLACE_MKDIR)|g' \
 	      -e 's|@''REPLACE_MKFIFO''@|$(REPLACE_MKFIFO)|g' \
+	      -e 's|@''REPLACE_MKFIFOAT''@|$(REPLACE_MKFIFOAT)|g' \
 	      -e 's|@''REPLACE_MKNOD''@|$(REPLACE_MKNOD)|g' \
+	      -e 's|@''REPLACE_MKNODAT''@|$(REPLACE_MKNODAT)|g' \
 	      -e 's|@''REPLACE_STAT''@|$(REPLACE_STAT)|g' \
 	      -e 's|@''REPLACE_UTIMENSAT''@|$(REPLACE_UTIMENSAT)|g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
@@ -2702,7 +3551,6 @@
 MOSTLYCLEANFILES += lib/sys/stat.h lib/sys/stat.h-t
 MOSTLYCLEANDIRS += lib/sys
 
-endif
 EXTRA_DIST += lib/sys_stat.in.h
 
 ## end   gnulib module sys_stat
@@ -2723,7 +3571,7 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_SYS_TIME_H''@|$(NEXT_SYS_TIME_H)|g' \
-	      -e 's/@''GNULIB_GETTIMEOFDAY''@/$(GNULIB_GETTIMEOFDAY)/g' \
+	      -e 's/@''GNULIB_GETTIMEOFDAY''@/$(GL_GNULIB_GETTIMEOFDAY)/g' \
 	      -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \
 	      -e 's/@''HAVE_GETTIMEOFDAY''@/$(HAVE_GETTIMEOFDAY)/g' \
 	      -e 's/@''HAVE_STRUCT_TIMEVAL''@/$(HAVE_STRUCT_TIMEVAL)/g' \
@@ -2757,7 +3605,7 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_SYS_TIMES_H''@|$(NEXT_SYS_TIMES_H)|g' \
-	      -e 's/@''GNULIB_TIMES''@/$(GNULIB_TIMES)/g' \
+	      -e 's/@''GNULIB_TIMES''@/$(GL_GNULIB_TIMES)/g' \
 	      -e 's|@''HAVE_STRUCT_TMS''@|$(HAVE_STRUCT_TMS)|g' \
 	      -e 's|@''HAVE_TIMES''@|$(HAVE_TIMES)|g' \
 	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
@@ -2813,7 +3661,7 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_SYS_WAIT_H''@|$(NEXT_SYS_WAIT_H)|g' \
-	      -e 's/@''GNULIB_WAITPID''@/$(GNULIB_WAITPID)/g' \
+	      -e 's/@''GNULIB_WAITPID''@/$(GL_GNULIB_WAITPID)/g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
 	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
 	      < $(top_srcdir)/lib/sys_wait.in.h; \
@@ -2826,6 +3674,41 @@
 
 ## end   gnulib module sys_wait
 
+## begin gnulib module termios
+
+BUILT_SOURCES += lib/termios.h
+
+# We need the following in order to create <termios.h> when the system
+# version does not have all declarations.
+lib/termios.h: lib/termios.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+	      -e 's|@''NEXT_TERMIOS_H''@|$(NEXT_TERMIOS_H)|g' \
+	      -e 's/@''GNULIB_TCGETSID''@/$(GL_GNULIB_TCGETSID)/g' \
+	      -e 's|@''HAVE_DECL_TCGETSID''@|$(HAVE_DECL_TCGETSID)|g' \
+	      -e 's|@''HAVE_TERMIOS_H''@|$(HAVE_TERMIOS_H)|g' \
+	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+	    < $(top_srcdir)/lib/termios.in.h; \
+	} > $@-t && \
+	mv $@-t $@
+MOSTLYCLEANFILES += lib/termios.h lib/termios.h-t
+
+EXTRA_DIST += lib/termios.in.h
+
+## end   gnulib module termios
+
+## begin gnulib module thread-optim
+
+
+EXTRA_DIST += lib/thread-optim.h
+
+## end   gnulib module thread-optim
+
 ## begin gnulib module threadlib
 
 lib_libbison_a_SOURCES += lib/glthread/threadlib.c
@@ -2846,22 +3729,24 @@
 	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_TIME_H''@|$(NEXT_TIME_H)|g' \
-	      -e 's/@''GNULIB_CTIME''@/$(GNULIB_CTIME)/g' \
-	      -e 's/@''GNULIB_LOCALTIME''@/$(GNULIB_LOCALTIME)/g' \
-	      -e 's/@''GNULIB_MKTIME''@/$(GNULIB_MKTIME)/g' \
-	      -e 's/@''GNULIB_NANOSLEEP''@/$(GNULIB_NANOSLEEP)/g' \
-	      -e 's/@''GNULIB_STRFTIME''@/$(GNULIB_STRFTIME)/g' \
-	      -e 's/@''GNULIB_STRPTIME''@/$(GNULIB_STRPTIME)/g' \
-	      -e 's/@''GNULIB_TIMEGM''@/$(GNULIB_TIMEGM)/g' \
-	      -e 's/@''GNULIB_TIME_R''@/$(GNULIB_TIME_R)/g' \
-	      -e 's/@''GNULIB_TIME_RZ''@/$(GNULIB_TIME_RZ)/g' \
-	      -e 's/@''GNULIB_TZSET''@/$(GNULIB_TZSET)/g' \
+	      -e 's/@''GNULIB_CTIME''@/$(GL_GNULIB_CTIME)/g' \
+	      -e 's/@''GNULIB_LOCALTIME''@/$(GL_GNULIB_LOCALTIME)/g' \
+	      -e 's/@''GNULIB_MKTIME''@/$(GL_GNULIB_MKTIME)/g' \
+	      -e 's/@''GNULIB_NANOSLEEP''@/$(GL_GNULIB_NANOSLEEP)/g' \
+	      -e 's/@''GNULIB_STRFTIME''@/$(GL_GNULIB_STRFTIME)/g' \
+	      -e 's/@''GNULIB_STRPTIME''@/$(GL_GNULIB_STRPTIME)/g' \
+	      -e 's/@''GNULIB_TIMEGM''@/$(GL_GNULIB_TIMEGM)/g' \
+	      -e 's/@''GNULIB_TIMESPEC_GET''@/$(GL_GNULIB_TIMESPEC_GET)/g' \
+	      -e 's/@''GNULIB_TIME_R''@/$(GL_GNULIB_TIME_R)/g' \
+	      -e 's/@''GNULIB_TIME_RZ''@/$(GL_GNULIB_TIME_RZ)/g' \
+	      -e 's/@''GNULIB_TZSET''@/$(GL_GNULIB_TZSET)/g' \
+	      -e 's/@''GNULIB_MDA_TZSET''@/$(GL_GNULIB_MDA_TZSET)/g' \
 	      -e 's|@''HAVE_DECL_LOCALTIME_R''@|$(HAVE_DECL_LOCALTIME_R)|g' \
 	      -e 's|@''HAVE_NANOSLEEP''@|$(HAVE_NANOSLEEP)|g' \
 	      -e 's|@''HAVE_STRPTIME''@|$(HAVE_STRPTIME)|g' \
 	      -e 's|@''HAVE_TIMEGM''@|$(HAVE_TIMEGM)|g' \
+	      -e 's|@''HAVE_TIMESPEC_GET''@|$(HAVE_TIMESPEC_GET)|g' \
 	      -e 's|@''HAVE_TIMEZONE_T''@|$(HAVE_TIMEZONE_T)|g' \
-	      -e 's|@''HAVE_TZSET''@|$(HAVE_TZSET)|g' \
 	      -e 's|@''REPLACE_CTIME''@|$(REPLACE_CTIME)|g' \
 	      -e 's|@''REPLACE_GMTIME''@|$(REPLACE_GMTIME)|g' \
 	      -e 's|@''REPLACE_LOCALTIME''@|$(REPLACE_LOCALTIME)|g' \
@@ -2875,6 +3760,7 @@
 	      -e 's|@''SYS_TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(SYS_TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \
 	      -e 's|@''TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \
 	      -e 's|@''UNISTD_H_DEFINES_STRUCT_TIMESPEC''@|$(UNISTD_H_DEFINES_STRUCT_TIMESPEC)|g' \
+	      -e 's|@''TIME_H_DEFINES_TIME_UTC''@|$(TIME_H_DEFINES_TIME_UTC)|g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
 	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
 	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
@@ -2909,6 +3795,12 @@
 
 ## end   gnulib module tls
 
+## begin gnulib module unicodeio
+
+lib_libbison_a_SOURCES += lib/unicodeio.h lib/unicodeio.c
+
+## end   gnulib module unicodeio
+
 ## begin gnulib module unistd
 
 BUILT_SOURCES += lib/unistd.h
@@ -2926,65 +3818,95 @@
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \
 	      -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \
-	      -e 's/@''GNULIB_ACCESS''@/$(GNULIB_ACCESS)/g' \
-	      -e 's/@''GNULIB_CHDIR''@/$(GNULIB_CHDIR)/g' \
-	      -e 's/@''GNULIB_CHOWN''@/$(GNULIB_CHOWN)/g' \
-	      -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \
-	      -e 's/@''GNULIB_COPY_FILE_RANGE''@/$(GNULIB_COPY_FILE_RANGE)/g' \
-	      -e 's/@''GNULIB_DUP''@/$(GNULIB_DUP)/g' \
-	      -e 's/@''GNULIB_DUP2''@/$(GNULIB_DUP2)/g' \
-	      -e 's/@''GNULIB_DUP3''@/$(GNULIB_DUP3)/g' \
-	      -e 's/@''GNULIB_ENVIRON''@/$(GNULIB_ENVIRON)/g' \
-	      -e 's/@''GNULIB_EUIDACCESS''@/$(GNULIB_EUIDACCESS)/g' \
-	      -e 's/@''GNULIB_FACCESSAT''@/$(GNULIB_FACCESSAT)/g' \
-	      -e 's/@''GNULIB_FCHDIR''@/$(GNULIB_FCHDIR)/g' \
-	      -e 's/@''GNULIB_FCHOWNAT''@/$(GNULIB_FCHOWNAT)/g' \
-	      -e 's/@''GNULIB_FDATASYNC''@/$(GNULIB_FDATASYNC)/g' \
-	      -e 's/@''GNULIB_FSYNC''@/$(GNULIB_FSYNC)/g' \
-	      -e 's/@''GNULIB_FTRUNCATE''@/$(GNULIB_FTRUNCATE)/g' \
-	      -e 's/@''GNULIB_GETCWD''@/$(GNULIB_GETCWD)/g' \
-	      -e 's/@''GNULIB_GETDOMAINNAME''@/$(GNULIB_GETDOMAINNAME)/g' \
-	      -e 's/@''GNULIB_GETDTABLESIZE''@/$(GNULIB_GETDTABLESIZE)/g' \
-	      -e 's/@''GNULIB_GETGROUPS''@/$(GNULIB_GETGROUPS)/g' \
-	      -e 's/@''GNULIB_GETHOSTNAME''@/$(GNULIB_GETHOSTNAME)/g' \
-	      -e 's/@''GNULIB_GETLOGIN''@/$(GNULIB_GETLOGIN)/g' \
-	      -e 's/@''GNULIB_GETLOGIN_R''@/$(GNULIB_GETLOGIN_R)/g' \
-	      -e 's/@''GNULIB_GETPAGESIZE''@/$(GNULIB_GETPAGESIZE)/g' \
-	      -e 's/@''GNULIB_GETPASS''@/$(GNULIB_GETPASS)/g' \
-	      -e 's/@''GNULIB_GETUSERSHELL''@/$(GNULIB_GETUSERSHELL)/g' \
-	      -e 's/@''GNULIB_GROUP_MEMBER''@/$(GNULIB_GROUP_MEMBER)/g' \
-	      -e 's/@''GNULIB_ISATTY''@/$(GNULIB_ISATTY)/g' \
-	      -e 's/@''GNULIB_LCHOWN''@/$(GNULIB_LCHOWN)/g' \
-	      -e 's/@''GNULIB_LINK''@/$(GNULIB_LINK)/g' \
-	      -e 's/@''GNULIB_LINKAT''@/$(GNULIB_LINKAT)/g' \
-	      -e 's/@''GNULIB_LSEEK''@/$(GNULIB_LSEEK)/g' \
-	      -e 's/@''GNULIB_PIPE''@/$(GNULIB_PIPE)/g' \
-	      -e 's/@''GNULIB_PIPE2''@/$(GNULIB_PIPE2)/g' \
-	      -e 's/@''GNULIB_PREAD''@/$(GNULIB_PREAD)/g' \
-	      -e 's/@''GNULIB_PWRITE''@/$(GNULIB_PWRITE)/g' \
-	      -e 's/@''GNULIB_READ''@/$(GNULIB_READ)/g' \
-	      -e 's/@''GNULIB_READLINK''@/$(GNULIB_READLINK)/g' \
-	      -e 's/@''GNULIB_READLINKAT''@/$(GNULIB_READLINKAT)/g' \
-	      -e 's/@''GNULIB_RMDIR''@/$(GNULIB_RMDIR)/g' \
-	      -e 's/@''GNULIB_SETHOSTNAME''@/$(GNULIB_SETHOSTNAME)/g' \
-	      -e 's/@''GNULIB_SLEEP''@/$(GNULIB_SLEEP)/g' \
-	      -e 's/@''GNULIB_SYMLINK''@/$(GNULIB_SYMLINK)/g' \
-	      -e 's/@''GNULIB_SYMLINKAT''@/$(GNULIB_SYMLINKAT)/g' \
-	      -e 's/@''GNULIB_TRUNCATE''@/$(GNULIB_TRUNCATE)/g' \
-	      -e 's/@''GNULIB_TTYNAME_R''@/$(GNULIB_TTYNAME_R)/g' \
-	      -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GNULIB_GL_UNISTD_H_GETOPT)/g' \
-	      -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GNULIB_UNISTD_H_NONBLOCKING)/g' \
-	      -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GNULIB_UNISTD_H_SIGPIPE)/g' \
-	      -e 's/@''GNULIB_UNLINK''@/$(GNULIB_UNLINK)/g' \
-	      -e 's/@''GNULIB_UNLINKAT''@/$(GNULIB_UNLINKAT)/g' \
-	      -e 's/@''GNULIB_USLEEP''@/$(GNULIB_USLEEP)/g' \
-	      -e 's/@''GNULIB_WRITE''@/$(GNULIB_WRITE)/g' \
+	      -e 's/@''GNULIB_ACCESS''@/$(GL_GNULIB_ACCESS)/g' \
+	      -e 's/@''GNULIB_CHDIR''@/$(GL_GNULIB_CHDIR)/g' \
+	      -e 's/@''GNULIB_CHOWN''@/$(GL_GNULIB_CHOWN)/g' \
+	      -e 's/@''GNULIB_CLOSE''@/$(GL_GNULIB_CLOSE)/g' \
+	      -e 's/@''GNULIB_COPY_FILE_RANGE''@/$(GL_GNULIB_COPY_FILE_RANGE)/g' \
+	      -e 's/@''GNULIB_DUP''@/$(GL_GNULIB_DUP)/g' \
+	      -e 's/@''GNULIB_DUP2''@/$(GL_GNULIB_DUP2)/g' \
+	      -e 's/@''GNULIB_DUP3''@/$(GL_GNULIB_DUP3)/g' \
+	      -e 's/@''GNULIB_ENVIRON''@/$(GL_GNULIB_ENVIRON)/g' \
+	      -e 's/@''GNULIB_EUIDACCESS''@/$(GL_GNULIB_EUIDACCESS)/g' \
+	      -e 's/@''GNULIB_EXECL''@/$(GL_GNULIB_EXECL)/g' \
+	      -e 's/@''GNULIB_EXECLE''@/$(GL_GNULIB_EXECLE)/g' \
+	      -e 's/@''GNULIB_EXECLP''@/$(GL_GNULIB_EXECLP)/g' \
+	      -e 's/@''GNULIB_EXECV''@/$(GL_GNULIB_EXECV)/g' \
+	      -e 's/@''GNULIB_EXECVE''@/$(GL_GNULIB_EXECVE)/g' \
+	      -e 's/@''GNULIB_EXECVP''@/$(GL_GNULIB_EXECVP)/g' \
+	      -e 's/@''GNULIB_EXECVPE''@/$(GL_GNULIB_EXECVPE)/g' \
+	      -e 's/@''GNULIB_FACCESSAT''@/$(GL_GNULIB_FACCESSAT)/g' \
+	      -e 's/@''GNULIB_FCHDIR''@/$(GL_GNULIB_FCHDIR)/g' \
+	      -e 's/@''GNULIB_FCHOWNAT''@/$(GL_GNULIB_FCHOWNAT)/g' \
+	      -e 's/@''GNULIB_FDATASYNC''@/$(GL_GNULIB_FDATASYNC)/g' \
+	      -e 's/@''GNULIB_FSYNC''@/$(GL_GNULIB_FSYNC)/g' \
+	      -e 's/@''GNULIB_FTRUNCATE''@/$(GL_GNULIB_FTRUNCATE)/g' \
+	      -e 's/@''GNULIB_GETCWD''@/$(GL_GNULIB_GETCWD)/g' \
+	      -e 's/@''GNULIB_GETDOMAINNAME''@/$(GL_GNULIB_GETDOMAINNAME)/g' \
+	      -e 's/@''GNULIB_GETDTABLESIZE''@/$(GL_GNULIB_GETDTABLESIZE)/g' \
+	      -e 's/@''GNULIB_GETENTROPY''@/$(GL_GNULIB_GETENTROPY)/g' \
+	      -e 's/@''GNULIB_GETGROUPS''@/$(GL_GNULIB_GETGROUPS)/g' \
+	      -e 's/@''GNULIB_GETHOSTNAME''@/$(GL_GNULIB_GETHOSTNAME)/g' \
+	      -e 's/@''GNULIB_GETLOGIN''@/$(GL_GNULIB_GETLOGIN)/g' \
+	      -e 's/@''GNULIB_GETLOGIN_R''@/$(GL_GNULIB_GETLOGIN_R)/g' \
+	      -e 's/@''GNULIB_GETOPT_POSIX''@/$(GL_GNULIB_GETOPT_POSIX)/g' \
+	      -e 's/@''GNULIB_GETPAGESIZE''@/$(GL_GNULIB_GETPAGESIZE)/g' \
+	      -e 's/@''GNULIB_GETPASS''@/$(GL_GNULIB_GETPASS)/g' \
+	      -e 's/@''GNULIB_GETUSERSHELL''@/$(GL_GNULIB_GETUSERSHELL)/g' \
+	      -e 's/@''GNULIB_GROUP_MEMBER''@/$(GL_GNULIB_GROUP_MEMBER)/g' \
+	      -e 's/@''GNULIB_ISATTY''@/$(GL_GNULIB_ISATTY)/g' \
+	      -e 's/@''GNULIB_LCHOWN''@/$(GL_GNULIB_LCHOWN)/g' \
+	      -e 's/@''GNULIB_LINK''@/$(GL_GNULIB_LINK)/g' \
+	      -e 's/@''GNULIB_LINKAT''@/$(GL_GNULIB_LINKAT)/g' \
+	      -e 's/@''GNULIB_LSEEK''@/$(GL_GNULIB_LSEEK)/g' \
+	      -e 's/@''GNULIB_PIPE''@/$(GL_GNULIB_PIPE)/g' \
+	      -e 's/@''GNULIB_PIPE2''@/$(GL_GNULIB_PIPE2)/g' \
+	      -e 's/@''GNULIB_PREAD''@/$(GL_GNULIB_PREAD)/g' \
+	      -e 's/@''GNULIB_PWRITE''@/$(GL_GNULIB_PWRITE)/g' \
+	      -e 's/@''GNULIB_READ''@/$(GL_GNULIB_READ)/g' \
+	      -e 's/@''GNULIB_READLINK''@/$(GL_GNULIB_READLINK)/g' \
+	      -e 's/@''GNULIB_READLINKAT''@/$(GL_GNULIB_READLINKAT)/g' \
+	      -e 's/@''GNULIB_RMDIR''@/$(GL_GNULIB_RMDIR)/g' \
+	      -e 's/@''GNULIB_SETHOSTNAME''@/$(GL_GNULIB_SETHOSTNAME)/g' \
+	      -e 's/@''GNULIB_SLEEP''@/$(GL_GNULIB_SLEEP)/g' \
+	      -e 's/@''GNULIB_SYMLINK''@/$(GL_GNULIB_SYMLINK)/g' \
+	      -e 's/@''GNULIB_SYMLINKAT''@/$(GL_GNULIB_SYMLINKAT)/g' \
+	      -e 's/@''GNULIB_TRUNCATE''@/$(GL_GNULIB_TRUNCATE)/g' \
+	      -e 's/@''GNULIB_TTYNAME_R''@/$(GL_GNULIB_TTYNAME_R)/g' \
+	      -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GL_GNULIB_UNISTD_H_GETOPT)/g' \
+	      -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GL_GNULIB_UNISTD_H_NONBLOCKING)/g' \
+	      -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GL_GNULIB_UNISTD_H_SIGPIPE)/g' \
+	      -e 's/@''GNULIB_UNLINK''@/$(GL_GNULIB_UNLINK)/g' \
+	      -e 's/@''GNULIB_UNLINKAT''@/$(GL_GNULIB_UNLINKAT)/g' \
+	      -e 's/@''GNULIB_USLEEP''@/$(GL_GNULIB_USLEEP)/g' \
+	      -e 's/@''GNULIB_WRITE''@/$(GL_GNULIB_WRITE)/g' \
+	      -e 's/@''GNULIB_MDA_ACCESS''@/$(GL_GNULIB_MDA_ACCESS)/g' \
+	      -e 's/@''GNULIB_MDA_CHDIR''@/$(GL_GNULIB_MDA_CHDIR)/g' \
+	      -e 's/@''GNULIB_MDA_CLOSE''@/$(GL_GNULIB_MDA_CLOSE)/g' \
+	      -e 's/@''GNULIB_MDA_DUP''@/$(GL_GNULIB_MDA_DUP)/g' \
+	      -e 's/@''GNULIB_MDA_DUP2''@/$(GL_GNULIB_MDA_DUP2)/g' \
+	      -e 's/@''GNULIB_MDA_EXECL''@/$(GL_GNULIB_MDA_EXECL)/g' \
+	      -e 's/@''GNULIB_MDA_EXECLE''@/$(GL_GNULIB_MDA_EXECLE)/g' \
+	      -e 's/@''GNULIB_MDA_EXECLP''@/$(GL_GNULIB_MDA_EXECLP)/g' \
+	      -e 's/@''GNULIB_MDA_EXECV''@/$(GL_GNULIB_MDA_EXECV)/g' \
+	      -e 's/@''GNULIB_MDA_EXECVE''@/$(GL_GNULIB_MDA_EXECVE)/g' \
+	      -e 's/@''GNULIB_MDA_EXECVP''@/$(GL_GNULIB_MDA_EXECVP)/g' \
+	      -e 's/@''GNULIB_MDA_EXECVPE''@/$(GL_GNULIB_MDA_EXECVPE)/g' \
+	      -e 's/@''GNULIB_MDA_GETCWD''@/$(GL_GNULIB_MDA_GETCWD)/g' \
+	      -e 's/@''GNULIB_MDA_GETPID''@/$(GL_GNULIB_MDA_GETPID)/g' \
+	      -e 's/@''GNULIB_MDA_ISATTY''@/$(GL_GNULIB_MDA_ISATTY)/g' \
+	      -e 's/@''GNULIB_MDA_LSEEK''@/$(GL_GNULIB_MDA_LSEEK)/g' \
+	      -e 's/@''GNULIB_MDA_READ''@/$(GL_GNULIB_MDA_READ)/g' \
+	      -e 's/@''GNULIB_MDA_RMDIR''@/$(GL_GNULIB_MDA_RMDIR)/g' \
+	      -e 's/@''GNULIB_MDA_SWAB''@/$(GL_GNULIB_MDA_SWAB)/g' \
+	      -e 's/@''GNULIB_MDA_UNLINK''@/$(GL_GNULIB_MDA_UNLINK)/g' \
+	      -e 's/@''GNULIB_MDA_WRITE''@/$(GL_GNULIB_MDA_WRITE)/g' \
 	      < $(top_srcdir)/lib/unistd.in.h | \
 	  sed -e 's|@''HAVE_CHOWN''@|$(HAVE_CHOWN)|g' \
 	      -e 's|@''HAVE_COPY_FILE_RANGE''@|$(HAVE_COPY_FILE_RANGE)|g' \
-	      -e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \
 	      -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \
 	      -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \
+	      -e 's|@''HAVE_EXECVPE''@|$(HAVE_EXECVPE)|g' \
 	      -e 's|@''HAVE_FACCESSAT''@|$(HAVE_FACCESSAT)|g' \
 	      -e 's|@''HAVE_FCHDIR''@|$(HAVE_FCHDIR)|g' \
 	      -e 's|@''HAVE_FCHOWNAT''@|$(HAVE_FCHOWNAT)|g' \
@@ -2992,6 +3914,7 @@
 	      -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \
 	      -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \
 	      -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \
+	      -e 's|@''HAVE_GETENTROPY''@|$(HAVE_GETENTROPY)|g' \
 	      -e 's|@''HAVE_GETGROUPS''@|$(HAVE_GETGROUPS)|g' \
 	      -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \
 	      -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \
@@ -3013,6 +3936,7 @@
 	      -e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \
 	      -e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \
 	      -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \
+	      -e 's|@''HAVE_DECL_EXECVPE''@|$(HAVE_DECL_EXECVPE)|g' \
 	      -e 's|@''HAVE_DECL_FCHDIR''@|$(HAVE_DECL_FCHDIR)|g' \
 	      -e 's|@''HAVE_DECL_FDATASYNC''@|$(HAVE_DECL_FDATASYNC)|g' \
 	      -e 's|@''HAVE_DECL_GETDOMAINNAME''@|$(HAVE_DECL_GETDOMAINNAME)|g' \
@@ -3031,6 +3955,13 @@
 	      -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \
 	      -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \
 	      -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \
+	      -e 's|@''REPLACE_EXECL''@|$(REPLACE_EXECL)|g' \
+	      -e 's|@''REPLACE_EXECLE''@|$(REPLACE_EXECLE)|g' \
+	      -e 's|@''REPLACE_EXECLP''@|$(REPLACE_EXECLP)|g' \
+	      -e 's|@''REPLACE_EXECV''@|$(REPLACE_EXECV)|g' \
+	      -e 's|@''REPLACE_EXECVE''@|$(REPLACE_EXECVE)|g' \
+	      -e 's|@''REPLACE_EXECVP''@|$(REPLACE_EXECVP)|g' \
+	      -e 's|@''REPLACE_EXECVPE''@|$(REPLACE_EXECVPE)|g' \
 	      -e 's|@''REPLACE_FACCESSAT''@|$(REPLACE_FACCESSAT)|g' \
 	      -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \
 	      -e 's|@''REPLACE_FTRUNCATE''@|$(REPLACE_FTRUNCATE)|g' \
@@ -3061,6 +3992,7 @@
 	      -e 's|@''REPLACE_UNLINKAT''@|$(REPLACE_UNLINKAT)|g' \
 	      -e 's|@''REPLACE_USLEEP''@|$(REPLACE_USLEEP)|g' \
 	      -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \
+	      -e 's|@''UNISTD_H_HAVE_SYS_RANDOM_H''@|$(UNISTD_H_HAVE_SYS_RANDOM_H)|g' \
 	      -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \
 	      -e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
@@ -3082,6 +4014,38 @@
 
 ## end   gnulib module unistd-safer
 
+## begin gnulib module unistr/base
+
+BUILT_SOURCES += $(LIBUNISTRING_UNISTR_H)
+
+lib/unistr.h: lib/unistr.in.h
+	$(AM_V_GEN)rm -f $@-t $@ && \
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  cat $(top_srcdir)/lib/unistr.in.h; \
+	} > $@-t && \
+	mv -f $@-t $@
+MOSTLYCLEANFILES += lib/unistr.h lib/unistr.h-t
+
+EXTRA_DIST += lib/unistr.in.h
+
+## end   gnulib module unistr/base
+
+## begin gnulib module unistr/u8-mbtoucr
+
+if LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR
+lib_libbison_a_SOURCES += lib/unistr/u8-mbtoucr.c
+endif
+
+## end   gnulib module unistr/u8-mbtoucr
+
+## begin gnulib module unistr/u8-uctomb
+
+if LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB
+lib_libbison_a_SOURCES += lib/unistr/u8-uctomb.c lib/unistr/u8-uctomb-aux.c
+endif
+
+## end   gnulib module unistr/u8-uctomb
+
 ## begin gnulib module unitypes
 
 BUILT_SOURCES += $(LIBUNISTRING_UNITYPES_H)
@@ -3133,12 +4097,12 @@
 
 ## end   gnulib module unlink
 
-## begin gnulib module unlocked-io
+## begin gnulib module unlocked-io-internal
 
 
 EXTRA_DIST += lib/unlocked-io.h
 
-## end   gnulib module unlocked-io
+## end   gnulib module unlocked-io-internal
 
 ## begin gnulib module unsetenv
 
@@ -3256,47 +4220,49 @@
 	      -e 's|@''NEXT_WCHAR_H''@|$(NEXT_WCHAR_H)|g' \
 	      -e 's|@''HAVE_WCHAR_H''@|$(HAVE_WCHAR_H)|g' \
 	      -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \
-	      -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \
-	      -e 's/@''GNULIB_BTOWC''@/$(GNULIB_BTOWC)/g' \
-	      -e 's/@''GNULIB_WCTOB''@/$(GNULIB_WCTOB)/g' \
-	      -e 's/@''GNULIB_MBSINIT''@/$(GNULIB_MBSINIT)/g' \
-	      -e 's/@''GNULIB_MBRTOWC''@/$(GNULIB_MBRTOWC)/g' \
-	      -e 's/@''GNULIB_MBRLEN''@/$(GNULIB_MBRLEN)/g' \
-	      -e 's/@''GNULIB_MBSRTOWCS''@/$(GNULIB_MBSRTOWCS)/g' \
-	      -e 's/@''GNULIB_MBSNRTOWCS''@/$(GNULIB_MBSNRTOWCS)/g' \
-	      -e 's/@''GNULIB_WCRTOMB''@/$(GNULIB_WCRTOMB)/g' \
-	      -e 's/@''GNULIB_WCSRTOMBS''@/$(GNULIB_WCSRTOMBS)/g' \
-	      -e 's/@''GNULIB_WCSNRTOMBS''@/$(GNULIB_WCSNRTOMBS)/g' \
-	      -e 's/@''GNULIB_WCWIDTH''@/$(GNULIB_WCWIDTH)/g' \
-	      -e 's/@''GNULIB_WMEMCHR''@/$(GNULIB_WMEMCHR)/g' \
-	      -e 's/@''GNULIB_WMEMCMP''@/$(GNULIB_WMEMCMP)/g' \
-	      -e 's/@''GNULIB_WMEMCPY''@/$(GNULIB_WMEMCPY)/g' \
-	      -e 's/@''GNULIB_WMEMMOVE''@/$(GNULIB_WMEMMOVE)/g' \
-	      -e 's/@''GNULIB_WMEMSET''@/$(GNULIB_WMEMSET)/g' \
-	      -e 's/@''GNULIB_WCSLEN''@/$(GNULIB_WCSLEN)/g' \
-	      -e 's/@''GNULIB_WCSNLEN''@/$(GNULIB_WCSNLEN)/g' \
-	      -e 's/@''GNULIB_WCSCPY''@/$(GNULIB_WCSCPY)/g' \
-	      -e 's/@''GNULIB_WCPCPY''@/$(GNULIB_WCPCPY)/g' \
-	      -e 's/@''GNULIB_WCSNCPY''@/$(GNULIB_WCSNCPY)/g' \
-	      -e 's/@''GNULIB_WCPNCPY''@/$(GNULIB_WCPNCPY)/g' \
-	      -e 's/@''GNULIB_WCSCAT''@/$(GNULIB_WCSCAT)/g' \
-	      -e 's/@''GNULIB_WCSNCAT''@/$(GNULIB_WCSNCAT)/g' \
-	      -e 's/@''GNULIB_WCSCMP''@/$(GNULIB_WCSCMP)/g' \
-	      -e 's/@''GNULIB_WCSNCMP''@/$(GNULIB_WCSNCMP)/g' \
-	      -e 's/@''GNULIB_WCSCASECMP''@/$(GNULIB_WCSCASECMP)/g' \
-	      -e 's/@''GNULIB_WCSNCASECMP''@/$(GNULIB_WCSNCASECMP)/g' \
-	      -e 's/@''GNULIB_WCSCOLL''@/$(GNULIB_WCSCOLL)/g' \
-	      -e 's/@''GNULIB_WCSXFRM''@/$(GNULIB_WCSXFRM)/g' \
-	      -e 's/@''GNULIB_WCSDUP''@/$(GNULIB_WCSDUP)/g' \
-	      -e 's/@''GNULIB_WCSCHR''@/$(GNULIB_WCSCHR)/g' \
-	      -e 's/@''GNULIB_WCSRCHR''@/$(GNULIB_WCSRCHR)/g' \
-	      -e 's/@''GNULIB_WCSCSPN''@/$(GNULIB_WCSCSPN)/g' \
-	      -e 's/@''GNULIB_WCSSPN''@/$(GNULIB_WCSSPN)/g' \
-	      -e 's/@''GNULIB_WCSPBRK''@/$(GNULIB_WCSPBRK)/g' \
-	      -e 's/@''GNULIB_WCSSTR''@/$(GNULIB_WCSSTR)/g' \
-	      -e 's/@''GNULIB_WCSTOK''@/$(GNULIB_WCSTOK)/g' \
-	      -e 's/@''GNULIB_WCSWIDTH''@/$(GNULIB_WCSWIDTH)/g' \
-	      -e 's/@''GNULIB_WCSFTIME''@/$(GNULIB_WCSFTIME)/g' \
+	      -e 's/@''GNULIBHEADERS_OVERRIDE_WINT_T''@/$(GNULIBHEADERS_OVERRIDE_WINT_T)/g' \
+	      -e 's/@''GNULIB_BTOWC''@/$(GL_GNULIB_BTOWC)/g' \
+	      -e 's/@''GNULIB_WCTOB''@/$(GL_GNULIB_WCTOB)/g' \
+	      -e 's/@''GNULIB_MBSINIT''@/$(GL_GNULIB_MBSINIT)/g' \
+	      -e 's/@''GNULIB_MBRTOWC''@/$(GL_GNULIB_MBRTOWC)/g' \
+	      -e 's/@''GNULIB_MBRLEN''@/$(GL_GNULIB_MBRLEN)/g' \
+	      -e 's/@''GNULIB_MBSRTOWCS''@/$(GL_GNULIB_MBSRTOWCS)/g' \
+	      -e 's/@''GNULIB_MBSNRTOWCS''@/$(GL_GNULIB_MBSNRTOWCS)/g' \
+	      -e 's/@''GNULIB_WCRTOMB''@/$(GL_GNULIB_WCRTOMB)/g' \
+	      -e 's/@''GNULIB_WCSRTOMBS''@/$(GL_GNULIB_WCSRTOMBS)/g' \
+	      -e 's/@''GNULIB_WCSNRTOMBS''@/$(GL_GNULIB_WCSNRTOMBS)/g' \
+	      -e 's/@''GNULIB_WCWIDTH''@/$(GL_GNULIB_WCWIDTH)/g' \
+	      -e 's/@''GNULIB_WMEMCHR''@/$(GL_GNULIB_WMEMCHR)/g' \
+	      -e 's/@''GNULIB_WMEMCMP''@/$(GL_GNULIB_WMEMCMP)/g' \
+	      -e 's/@''GNULIB_WMEMCPY''@/$(GL_GNULIB_WMEMCPY)/g' \
+	      -e 's/@''GNULIB_WMEMMOVE''@/$(GL_GNULIB_WMEMMOVE)/g' \
+	      -e 's/@''GNULIB_WMEMPCPY''@/$(GL_GNULIB_WMEMPCPY)/g' \
+	      -e 's/@''GNULIB_WMEMSET''@/$(GL_GNULIB_WMEMSET)/g' \
+	      -e 's/@''GNULIB_WCSLEN''@/$(GL_GNULIB_WCSLEN)/g' \
+	      -e 's/@''GNULIB_WCSNLEN''@/$(GL_GNULIB_WCSNLEN)/g' \
+	      -e 's/@''GNULIB_WCSCPY''@/$(GL_GNULIB_WCSCPY)/g' \
+	      -e 's/@''GNULIB_WCPCPY''@/$(GL_GNULIB_WCPCPY)/g' \
+	      -e 's/@''GNULIB_WCSNCPY''@/$(GL_GNULIB_WCSNCPY)/g' \
+	      -e 's/@''GNULIB_WCPNCPY''@/$(GL_GNULIB_WCPNCPY)/g' \
+	      -e 's/@''GNULIB_WCSCAT''@/$(GL_GNULIB_WCSCAT)/g' \
+	      -e 's/@''GNULIB_WCSNCAT''@/$(GL_GNULIB_WCSNCAT)/g' \
+	      -e 's/@''GNULIB_WCSCMP''@/$(GL_GNULIB_WCSCMP)/g' \
+	      -e 's/@''GNULIB_WCSNCMP''@/$(GL_GNULIB_WCSNCMP)/g' \
+	      -e 's/@''GNULIB_WCSCASECMP''@/$(GL_GNULIB_WCSCASECMP)/g' \
+	      -e 's/@''GNULIB_WCSNCASECMP''@/$(GL_GNULIB_WCSNCASECMP)/g' \
+	      -e 's/@''GNULIB_WCSCOLL''@/$(GL_GNULIB_WCSCOLL)/g' \
+	      -e 's/@''GNULIB_WCSXFRM''@/$(GL_GNULIB_WCSXFRM)/g' \
+	      -e 's/@''GNULIB_WCSDUP''@/$(GL_GNULIB_WCSDUP)/g' \
+	      -e 's/@''GNULIB_WCSCHR''@/$(GL_GNULIB_WCSCHR)/g' \
+	      -e 's/@''GNULIB_WCSRCHR''@/$(GL_GNULIB_WCSRCHR)/g' \
+	      -e 's/@''GNULIB_WCSCSPN''@/$(GL_GNULIB_WCSCSPN)/g' \
+	      -e 's/@''GNULIB_WCSSPN''@/$(GL_GNULIB_WCSSPN)/g' \
+	      -e 's/@''GNULIB_WCSPBRK''@/$(GL_GNULIB_WCSPBRK)/g' \
+	      -e 's/@''GNULIB_WCSSTR''@/$(GL_GNULIB_WCSSTR)/g' \
+	      -e 's/@''GNULIB_WCSTOK''@/$(GL_GNULIB_WCSTOK)/g' \
+	      -e 's/@''GNULIB_WCSWIDTH''@/$(GL_GNULIB_WCSWIDTH)/g' \
+	      -e 's/@''GNULIB_WCSFTIME''@/$(GL_GNULIB_WCSFTIME)/g' \
+	      -e 's/@''GNULIB_MDA_WCSDUP''@/$(GL_GNULIB_MDA_WCSDUP)/g' \
 	      < $(top_srcdir)/lib/wchar.in.h | \
 	  sed -e 's|@''HAVE_WINT_T''@|$(HAVE_WINT_T)|g' \
 	      -e 's|@''HAVE_BTOWC''@|$(HAVE_BTOWC)|g' \
@@ -3312,6 +4278,7 @@
 	      -e 's|@''HAVE_WMEMCMP''@|$(HAVE_WMEMCMP)|g' \
 	      -e 's|@''HAVE_WMEMCPY''@|$(HAVE_WMEMCPY)|g' \
 	      -e 's|@''HAVE_WMEMMOVE''@|$(HAVE_WMEMMOVE)|g' \
+	      -e 's|@''HAVE_WMEMPCPY''@|$(HAVE_WMEMPCPY)|g' \
 	      -e 's|@''HAVE_WMEMSET''@|$(HAVE_WMEMSET)|g' \
 	      -e 's|@''HAVE_WCSLEN''@|$(HAVE_WCSLEN)|g' \
 	      -e 's|@''HAVE_WCSNLEN''@|$(HAVE_WCSNLEN)|g' \
@@ -3338,11 +4305,13 @@
 	      -e 's|@''HAVE_WCSWIDTH''@|$(HAVE_WCSWIDTH)|g' \
 	      -e 's|@''HAVE_WCSFTIME''@|$(HAVE_WCSFTIME)|g' \
 	      -e 's|@''HAVE_DECL_WCTOB''@|$(HAVE_DECL_WCTOB)|g' \
+	      -e 's|@''HAVE_DECL_WCSDUP''@|$(HAVE_DECL_WCSDUP)|g' \
 	      -e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \
 	  | \
 	  sed -e 's|@''REPLACE_MBSTATE_T''@|$(REPLACE_MBSTATE_T)|g' \
 	      -e 's|@''REPLACE_BTOWC''@|$(REPLACE_BTOWC)|g' \
 	      -e 's|@''REPLACE_WCTOB''@|$(REPLACE_WCTOB)|g' \
+	      -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \
 	      -e 's|@''REPLACE_MBSINIT''@|$(REPLACE_MBSINIT)|g' \
 	      -e 's|@''REPLACE_MBRTOWC''@|$(REPLACE_MBRTOWC)|g' \
 	      -e 's|@''REPLACE_MBRLEN''@|$(REPLACE_MBRLEN)|g' \
@@ -3383,18 +4352,22 @@
 	      -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
 	      -e 's|@''NEXT_WCTYPE_H''@|$(NEXT_WCTYPE_H)|g' \
 	      -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \
-	      -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \
-	      -e 's/@''GNULIB_ISWBLANK''@/$(GNULIB_ISWBLANK)/g' \
-	      -e 's/@''GNULIB_WCTYPE''@/$(GNULIB_WCTYPE)/g' \
-	      -e 's/@''GNULIB_ISWCTYPE''@/$(GNULIB_ISWCTYPE)/g' \
-	      -e 's/@''GNULIB_WCTRANS''@/$(GNULIB_WCTRANS)/g' \
-	      -e 's/@''GNULIB_TOWCTRANS''@/$(GNULIB_TOWCTRANS)/g' \
+	      -e 's/@''GNULIBHEADERS_OVERRIDE_WINT_T''@/$(GNULIBHEADERS_OVERRIDE_WINT_T)/g' \
+	      -e 's/@''GNULIB_ISWBLANK''@/$(GL_GNULIB_ISWBLANK)/g' \
+	      -e 's/@''GNULIB_ISWDIGIT''@/$(GL_GNULIB_ISWDIGIT)/g' \
+	      -e 's/@''GNULIB_ISWXDIGIT''@/$(GL_GNULIB_ISWXDIGIT)/g' \
+	      -e 's/@''GNULIB_WCTYPE''@/$(GL_GNULIB_WCTYPE)/g' \
+	      -e 's/@''GNULIB_ISWCTYPE''@/$(GL_GNULIB_ISWCTYPE)/g' \
+	      -e 's/@''GNULIB_WCTRANS''@/$(GL_GNULIB_WCTRANS)/g' \
+	      -e 's/@''GNULIB_TOWCTRANS''@/$(GL_GNULIB_TOWCTRANS)/g' \
 	      -e 's/@''HAVE_ISWBLANK''@/$(HAVE_ISWBLANK)/g' \
 	      -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \
 	      -e 's/@''HAVE_WCTYPE_T''@/$(HAVE_WCTYPE_T)/g' \
 	      -e 's/@''HAVE_WCTRANS_T''@/$(HAVE_WCTRANS_T)/g' \
 	      -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \
 	      -e 's/@''REPLACE_ISWBLANK''@/$(REPLACE_ISWBLANK)/g' \
+	      -e 's/@''REPLACE_ISWDIGIT''@/$(REPLACE_ISWDIGIT)/g' \
+	      -e 's/@''REPLACE_ISWXDIGIT''@/$(REPLACE_ISWXDIGIT)/g' \
 	      -e 's/@''REPLACE_ISWCNTRL''@/$(REPLACE_ISWCNTRL)/g' \
 	      -e 's/@''REPLACE_TOWLOWER''@/$(REPLACE_TOWLOWER)/g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
@@ -3461,6 +4434,15 @@
 
 ## end   gnulib module windows-rwlock
 
+## begin gnulib module windows-spawn
+
+
+EXTRA_DIST += lib/windows-spawn.c lib/windows-spawn.h
+
+EXTRA_lib_libbison_a_SOURCES += lib/windows-spawn.c
+
+## end   gnulib module windows-spawn
+
 ## begin gnulib module windows-tls
 
 if gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d
@@ -3484,6 +4466,8 @@
 
 lib_libbison_a_SOURCES += lib/xalloc-die.c
 
+EXTRA_DIST += lib/xalloc.h
+
 ## end   gnulib module xalloc-die
 
 ## begin gnulib module xalloc-oversized
@@ -3513,12 +4497,15 @@
 
 ## end   gnulib module xlist
 
+## begin gnulib module xmap
+
+lib_libbison_a_SOURCES += lib/gl_xmap.h lib/gl_xmap.c
+
+## end   gnulib module xmap
+
 ## begin gnulib module xmemdup0
 
-
-EXTRA_DIST += lib/xmemdup0.c lib/xmemdup0.h
-
-EXTRA_lib_libbison_a_SOURCES += lib/xmemdup0.c
+lib_libbison_a_SOURCES += lib/xmemdup0.h lib/xmemdup0.c
 
 ## end   gnulib module xmemdup0
 
diff --git a/lib/hard-locale.c b/lib/hard-locale.c
index dcfcad6..8b6802d 100644
--- a/lib/hard-locale.c
+++ b/lib/hard-locale.c
@@ -1,19 +1,19 @@
 /* hard-locale.c -- Determine whether a locale is hard.
 
-   Copyright (C) 1997-1999, 2002-2004, 2006-2007, 2009-2019 Free Software
+   Copyright (C) 1997-1999, 2002-2004, 2006-2007, 2009-2021 Free Software
    Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
@@ -21,52 +21,15 @@
 #include "hard-locale.h"
 
 #include <locale.h>
-#include <stdlib.h>
 #include <string.h>
 
-#ifdef __GLIBC__
-# define GLIBC_VERSION __GLIBC__
-#elif defined __UCLIBC__
-# define GLIBC_VERSION 2
-#else
-# define GLIBC_VERSION 0
-#endif
-
-/* Return true if the current CATEGORY locale is hard, i.e. if you
-   can't get away with assuming traditional C or POSIX behavior.  */
 bool
 hard_locale (int category)
 {
-  bool hard = true;
-  char const *p = setlocale (category, NULL);
+  char locale[SETLOCALE_NULL_MAX];
 
-  if (p)
-    {
-      if (2 <= GLIBC_VERSION)
-        {
-          if (strcmp (p, "C") == 0 || strcmp (p, "POSIX") == 0)
-            hard = false;
-        }
-      else
-        {
-          char *locale = strdup (p);
-          if (locale)
-            {
-              /* Temporarily set the locale to the "C" and "POSIX" locales
-                 to find their names, so that we can determine whether one
-                 or the other is the caller's locale.  */
-              if (((p = setlocale (category, "C"))
-                   && strcmp (p, locale) == 0)
-                  || ((p = setlocale (category, "POSIX"))
-                      && strcmp (p, locale) == 0))
-                hard = false;
+  if (setlocale_null_r (category, locale, sizeof (locale)))
+    return false;
 
-              /* Restore the caller's locale.  */
-              setlocale (category, locale);
-              free (locale);
-            }
-        }
-    }
-
-  return hard;
+  return !(strcmp (locale, "C") == 0 || strcmp (locale, "POSIX") == 0);
 }
diff --git a/lib/hard-locale.h b/lib/hard-locale.h
index 8f1da96..eba6601 100644
--- a/lib/hard-locale.h
+++ b/lib/hard-locale.h
@@ -1,18 +1,18 @@
 /* Determine whether a locale is hard.
 
-   Copyright (C) 1999, 2003-2004, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2003-2004, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef HARD_LOCALE_H_
@@ -20,6 +20,9 @@
 
 # include <stdbool.h>
 
-bool hard_locale (int);
+/* Return true if the specified CATEGORY of the current locale is hard, i.e.
+   different from the C or POSIX locale that has a fixed behavior.
+   CATEGORY must be one of the LC_* values, but not LC_ALL.  */
+extern bool hard_locale (int category);
 
 #endif /* HARD_LOCALE_H_ */
diff --git a/lib/hash-pjw.c b/lib/hash-pjw.c
new file mode 100644
index 0000000..19e7762
--- /dev/null
+++ b/lib/hash-pjw.c
@@ -0,0 +1,40 @@
+/* hash-pjw.c -- compute a hash value from a NUL-terminated string.
+
+   Copyright (C) 2001, 2003, 2006, 2009-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "hash-pjw.h"
+
+#include <limits.h>
+
+#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
+
+/* A hash function for NUL-terminated char* strings using
+   the method described by Bruno Haible.
+   See https://www.haible.de/bruno/hashfunc.html.  */
+
+size_t
+hash_pjw (const void *x, size_t tablesize)
+{
+  const char *s;
+  size_t h = 0;
+
+  for (s = x; *s; s++)
+    h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+
+  return h % tablesize;
+}
diff --git a/lib/hash-pjw.h b/lib/hash-pjw.h
new file mode 100644
index 0000000..cb18cf3
--- /dev/null
+++ b/lib/hash-pjw.h
@@ -0,0 +1,23 @@
+/* hash-pjw.h -- declaration for a simple hash function
+   Copyright (C) 2001, 2003, 2009-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <stddef.h>
+
+/* Compute a hash code for a NUL-terminated string starting at X,
+   and return the hash code modulo TABLESIZE.
+   The result is platform dependent: it depends on the size of the 'size_t'
+   type and on the signedness of the 'char' type.  */
+extern size_t hash_pjw (void const *x, size_t tablesize) _GL_ATTRIBUTE_PURE;
diff --git a/lib/hash-triple-simple.c b/lib/hash-triple-simple.c
new file mode 100644
index 0000000..f382538
--- /dev/null
+++ b/lib/hash-triple-simple.c
@@ -0,0 +1,59 @@
+/* Hash functions for file-related triples: name, device, inode.
+   Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+/* Specification.  */
+#include "hash-triple.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "hash-pjw.h"
+#include "same-inode.h"
+
+#define STREQ(a, b) (strcmp (a, b) == 0)
+
+/* Hash an F_triple, and *do* consider the file name.  */
+size_t
+triple_hash (void const *x, size_t table_size)
+{
+  struct F_triple const *p = x;
+  size_t tmp = hash_pjw (p->name, table_size);
+
+  /* Ignoring the device number here should be fine.  */
+  return (tmp ^ p->st_ino) % table_size;
+}
+
+/* Compare two F_triple structs.  */
+bool
+triple_compare_ino_str (void const *x, void const *y)
+{
+  struct F_triple const *a = x;
+  struct F_triple const *b = y;
+  return (SAME_INODE (*a, *b) && STREQ (a->name, b->name)) ? true : false;
+}
+
+/* Free an F_triple.  */
+void
+triple_free (void *x)
+{
+  struct F_triple *a = x;
+  free (a->name);
+  free (a);
+}
diff --git a/lib/hash-triple.h b/lib/hash-triple.h
new file mode 100644
index 0000000..896d3d2
--- /dev/null
+++ b/lib/hash-triple.h
@@ -0,0 +1,46 @@
+/* Hash functions for file-related (name, device, inode) triples.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Jim Meyering, 2007.  */
+
+#ifndef HASH_TRIPLE_H
+#define HASH_TRIPLE_H
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdbool.h>
+
+/* Describe a just-created or just-renamed destination file.  */
+struct F_triple
+{
+  char *name;
+  ino_t st_ino;
+  dev_t st_dev;
+};
+
+/* Defined in module 'hash-triple-simple'.  */
+
+extern size_t triple_hash (void const *x, size_t table_size) _GL_ATTRIBUTE_PURE;
+extern bool triple_compare_ino_str (void const *x, void const *y)
+  _GL_ATTRIBUTE_PURE;
+extern void triple_free (void *x);
+
+/* Defined in module 'hash-triple'.  */
+extern size_t triple_hash_no_name (void const *x, size_t table_size)
+  _GL_ATTRIBUTE_PURE;
+extern bool triple_compare (void const *x, void const *y);
+
+#endif
diff --git a/lib/hash.c b/lib/hash.c
index 9e1f8e8..5f5f8fc 100644
--- a/lib/hash.c
+++ b/lib/hash.c
@@ -1,20 +1,20 @@
 /* hash - hashing table processing.
 
-   Copyright (C) 1998-2004, 2006-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 1998-2004, 2006-2007, 2009-2021 Free Software Foundation, Inc.
 
    Written by Jim Meyering, 1992.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* A generic hash table package.  */
@@ -138,38 +138,24 @@
 
 /* Information and lookup.  */
 
-/* The following few functions provide information about the overall hash
-   table organization: the number of entries, number of buckets and maximum
-   length of buckets.  */
-
-/* Return the number of buckets in the hash table.  The table size, the total
-   number of buckets (used plus unused), or the maximum number of slots, are
-   the same quantity.  */
-
 size_t
 hash_get_n_buckets (const Hash_table *table)
 {
   return table->n_buckets;
 }
 
-/* Return the number of slots in use (non-empty buckets).  */
-
 size_t
 hash_get_n_buckets_used (const Hash_table *table)
 {
   return table->n_buckets_used;
 }
 
-/* Return the number of active entries.  */
-
 size_t
 hash_get_n_entries (const Hash_table *table)
 {
   return table->n_entries;
 }
 
-/* Return the length of the longest chain (bucket).  */
-
 size_t
 hash_get_max_bucket_length (const Hash_table *table)
 {
@@ -194,9 +180,6 @@
   return max_bucket_length;
 }
 
-/* Do a mild validation of a hash table, by traversing it and checking two
-   statistics.  */
-
 bool
 hash_table_ok (const Hash_table *table)
 {
@@ -254,9 +237,6 @@
   return table->bucket + n;
 }
 
-/* If ENTRY matches an entry already in the hash table, return the
-   entry from the table.  Otherwise, return NULL.  */
-
 void *
 hash_lookup (const Hash_table *table, const void *entry)
 {
@@ -275,15 +255,6 @@
 
 /* Walking.  */
 
-/* The functions in this page traverse the hash table and process the
-   contained entries.  For the traversal to work properly, the hash table
-   should not be resized nor modified while any particular entry is being
-   processed.  In particular, entries should not be added, and an entry
-   may be removed only if there is no shrink threshold and the entry being
-   removed has already been passed to hash_get_next.  */
-
-/* Return the first data in the table, or NULL if the table is empty.  */
-
 void *
 hash_get_first (const Hash_table *table)
 {
@@ -299,10 +270,6 @@
       return bucket->data;
 }
 
-/* Return the user data for the entry following ENTRY, where ENTRY has been
-   returned by a previous call to either 'hash_get_first' or 'hash_get_next'.
-   Return NULL if there are no more entries.  */
-
 void *
 hash_get_next (const Hash_table *table, const void *entry)
 {
@@ -328,10 +295,6 @@
   return NULL;
 }
 
-/* Fill BUFFER with pointers to active user entries in the hash table, then
-   return the number of pointers copied.  Do not copy more than BUFFER_SIZE
-   pointers.  */
-
 size_t
 hash_get_entries (const Hash_table *table, void **buffer,
                   size_t buffer_size)
@@ -356,14 +319,6 @@
   return counter;
 }
 
-/* Call a PROCESSOR function for each entry of a hash table, and return the
-   number of entries for which the processor function returned success.  A
-   pointer to some PROCESSOR_DATA which will be made available to each call to
-   the processor function.  The PROCESSOR accepts two arguments: the first is
-   the user entry being walked into, the second is the value of PROCESSOR_DATA
-   as received.  The walking continue for as long as the PROCESSOR function
-   returns nonzero.  When it returns zero, the walking is interrupted.  */
-
 size_t
 hash_do_for_each (const Hash_table *table, Hash_processor processor,
                   void *processor_data)
@@ -390,9 +345,6 @@
 
 /* Allocation and clean-up.  */
 
-/* Return a hash index for a NUL-terminated STRING between 0 and N_BUCKETS-1.
-   This is a convenience routine for constructing other hashing functions.  */
-
 #if USE_DIFF_HASH
 
 /* About hashings, Paul Eggert writes to me (FP), on 1994-01-01: "Please see
@@ -546,7 +498,7 @@
   if (!tuning->is_n_buckets)
     {
       float new_candidate = candidate / tuning->growth_threshold;
-      if (SIZE_MAX <= new_candidate)
+      if ((float) SIZE_MAX <= new_candidate)
         return 0;
       candidate = new_candidate;
     }
@@ -556,40 +508,6 @@
   return candidate;
 }
 
-/* Allocate and return a new hash table, or NULL upon failure.  The initial
-   number of buckets is automatically selected so as to _guarantee_ that you
-   may insert at least CANDIDATE different user entries before any growth of
-   the hash table size occurs.  So, if have a reasonably tight a-priori upper
-   bound on the number of entries you intend to insert in the hash table, you
-   may save some table memory and insertion time, by specifying it here.  If
-   the IS_N_BUCKETS field of the TUNING structure is true, the CANDIDATE
-   argument has its meaning changed to the wanted number of buckets.
-
-   TUNING points to a structure of user-supplied values, in case some fine
-   tuning is wanted over the default behavior of the hasher.  If TUNING is
-   NULL, the default tuning parameters are used instead.  If TUNING is
-   provided but the values requested are out of bounds or might cause
-   rounding errors, return NULL.
-
-   The user-supplied HASHER function, when not NULL, accepts two
-   arguments ENTRY and TABLE_SIZE.  It computes, by hashing ENTRY contents, a
-   slot number for that entry which should be in the range 0..TABLE_SIZE-1.
-   This slot number is then returned.
-
-   The user-supplied COMPARATOR function, when not NULL, accepts two
-   arguments pointing to user data, it then returns true for a pair of entries
-   that compare equal, or false otherwise.  This function is internally called
-   on entries which are already known to hash to the same bucket index,
-   but which are distinct pointers.
-
-   The user-supplied DATA_FREER function, when not NULL, may be later called
-   with the user data as an argument, just before the entry containing the
-   data gets freed.  This happens from within 'hash_free' or 'hash_clear'.
-   You should specify this function only if you want these functions to free
-   all of your 'data' data.  This is typically the case when your data is
-   simply an auxiliary struct that you have malloc'd to aggregate several
-   values.  */
-
 Hash_table *
 hash_initialize (size_t candidate, const Hash_tuning *tuning,
                  Hash_hasher hasher, Hash_comparator comparator,
@@ -645,10 +563,6 @@
   return NULL;
 }
 
-/* Make all buckets empty, placing any chained entries on the free list.
-   Apply the user-specified function data_freer (if any) to the datas of any
-   affected entries.  */
-
 void
 hash_clear (Hash_table *table)
 {
@@ -687,11 +601,6 @@
   table->n_entries = 0;
 }
 
-/* Reclaim all storage associated with a hash table.  If a data_freer
-   function has been supplied by the user when the hash table was created,
-   this function applies it to the data of each entry before freeing that
-   entry.  */
-
 void
 hash_free (Hash_table *table)
 {
@@ -931,14 +840,6 @@
   return true;
 }
 
-/* For an already existing hash table, change the number of buckets through
-   specifying CANDIDATE.  The contents of the hash table are preserved.  The
-   new number of buckets is automatically selected so as to _guarantee_ that
-   the table may receive at least CANDIDATE different user entries, including
-   those already in the table, before any other growth of the hash table size
-   occurs.  If TUNING->IS_N_BUCKETS is true, then CANDIDATE specifies the
-   exact number of buckets desired.  Return true iff the rehash succeeded.  */
-
 bool
 hash_rehash (Hash_table *table, size_t candidate)
 {
@@ -1018,22 +919,6 @@
   return false;
 }
 
-/* Insert ENTRY into hash TABLE if there is not already a matching entry.
-
-   Return -1 upon memory allocation failure.
-   Return 1 if insertion succeeded.
-   Return 0 if there is already a matching entry in the table,
-   and in that case, if MATCHED_ENT is non-NULL, set *MATCHED_ENT
-   to that entry.
-
-   This interface is easier to use than hash_insert when you must
-   distinguish between the latter two cases.  More importantly,
-   hash_insert is unusable for some types of ENTRY values.  When using
-   hash_insert, the only way to distinguish those cases is to compare
-   the return value and ENTRY.  That works only when you can have two
-   different ENTRY values that point to data that compares "equal".  Thus,
-   when the ENTRY value is a simple scalar, you must use
-   hash_insert_if_absent.  ENTRY must not be NULL.  */
 int
 hash_insert_if_absent (Hash_table *table, void const *entry,
                        void const **matched_ent)
@@ -1076,7 +961,7 @@
              : (table->n_buckets * tuning->growth_factor
                 * tuning->growth_threshold));
 
-          if (SIZE_MAX <= candidate)
+          if ((float) SIZE_MAX <= candidate)
             return -1;
 
           /* If the rehash fails, arrange to return NULL.  */
@@ -1116,12 +1001,6 @@
   return 1;
 }
 
-/* If ENTRY matches an entry already in the hash table, return the pointer
-   to the entry from the table.  Otherwise, insert ENTRY and return ENTRY.
-   Return NULL if the storage required for insertion cannot be allocated.
-   This implementation does not support duplicate entries or insertion of
-   NULL.  */
-
 void *
 hash_insert (Hash_table *table, void const *entry)
 {
@@ -1132,12 +1011,8 @@
           : (void *) (err == 0 ? matched_ent : entry));
 }
 
-/* If ENTRY is already in the table, remove it and return the just-deleted
-   data (the user may want to deallocate its storage).  If ENTRY is not in the
-   table, don't modify the table and return NULL.  */
-
 void *
-hash_delete (Hash_table *table, const void *entry)
+hash_remove (Hash_table *table, const void *entry)
 {
   void *data;
   struct hash_entry *bucket;
@@ -1196,6 +1071,12 @@
   return data;
 }
 
+void *
+hash_delete (Hash_table *table, const void *entry)
+{
+  return hash_remove (table, entry);
+}
+
 /* Testing.  */
 
 #if TESTING
diff --git a/lib/hash.h b/lib/hash.h
index 8f2e459..5877b57 100644
--- a/lib/hash.h
+++ b/lib/hash.h
@@ -1,19 +1,19 @@
 /* hash - hashing table processing.
-   Copyright (C) 1998-1999, 2001, 2003, 2009-2019 Free Software Foundation,
+   Copyright (C) 1998-1999, 2001, 2003, 2009-2021 Free Software Foundation,
    Inc.
    Written by Jim Meyering <meyering@ascend.com>, 1998.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* A generic hash table package.  */
@@ -27,29 +27,10 @@
 # include <stdio.h>
 # include <stdbool.h>
 
-/* The __attribute__ feature is available in gcc versions 2.5 and later.
-   The warn_unused_result attribute appeared first in gcc-3.4.0.  */
-# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-#  define _GL_ATTRIBUTE_WUR __attribute__ ((__warn_unused_result__))
-# else
-#  define _GL_ATTRIBUTE_WUR /* empty */
+# ifdef __cplusplus
+extern "C" {
 # endif
 
-# ifndef _GL_ATTRIBUTE_DEPRECATED
-/* The __attribute__((__deprecated__)) feature
-   is available in gcc versions 3.1 and newer.  */
-#  if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 1)
-#   define _GL_ATTRIBUTE_DEPRECATED /* empty */
-#  else
-#   define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__))
-#  endif
-# endif
-
-typedef size_t (*Hash_hasher) (const void *, size_t);
-typedef bool (*Hash_comparator) (const void *, const void *);
-typedef void (*Hash_data_freer) (void *);
-typedef bool (*Hash_processor) (void *, void *);
-
 struct hash_tuning
   {
     /* This structure is mainly used for 'hash_initialize', see the block
@@ -68,39 +49,216 @@
 
 typedef struct hash_table Hash_table;
 
-/* Information and lookup.  */
-size_t hash_get_n_buckets (const Hash_table *) _GL_ATTRIBUTE_PURE;
-size_t hash_get_n_buckets_used (const Hash_table *) _GL_ATTRIBUTE_PURE;
-size_t hash_get_n_entries (const Hash_table *) _GL_ATTRIBUTE_PURE;
-size_t hash_get_max_bucket_length (const Hash_table *) _GL_ATTRIBUTE_PURE;
-bool hash_table_ok (const Hash_table *) _GL_ATTRIBUTE_PURE;
-void hash_print_statistics (const Hash_table *, FILE *);
-void *hash_lookup (const Hash_table *, const void *);
+/*
+ * Information and lookup.
+ */
 
-/* Walking.  */
-void *hash_get_first (const Hash_table *) _GL_ATTRIBUTE_PURE;
-void *hash_get_next (const Hash_table *, const void *);
-size_t hash_get_entries (const Hash_table *, void **, size_t);
-size_t hash_do_for_each (const Hash_table *, Hash_processor, void *);
+/* The following few functions provide information about the overall hash
+   table organization: the number of entries, number of buckets and maximum
+   length of buckets.  */
 
-/* Allocation and clean-up.  */
-size_t hash_string (const char *, size_t) _GL_ATTRIBUTE_PURE;
-void hash_reset_tuning (Hash_tuning *);
-Hash_table *hash_initialize (size_t, const Hash_tuning *,
-                             Hash_hasher, Hash_comparator,
-                             Hash_data_freer) _GL_ATTRIBUTE_WUR;
-Hash_table *hash_xinitialize (size_t, const Hash_tuning *,
-                              Hash_hasher, Hash_comparator,
-                              Hash_data_freer) _GL_ATTRIBUTE_WUR;
-void hash_clear (Hash_table *);
-void hash_free (Hash_table *);
+/* Return the number of buckets in the hash table.  The table size, the total
+   number of buckets (used plus unused), or the maximum number of slots, are
+   the same quantity.  */
+extern size_t hash_get_n_buckets (const Hash_table *table)
+       _GL_ATTRIBUTE_PURE;
 
-/* Insertion and deletion.  */
-bool hash_rehash (Hash_table *, size_t) _GL_ATTRIBUTE_WUR;
-void *hash_insert (Hash_table *, const void *) _GL_ATTRIBUTE_WUR;
+/* Return the number of slots in use (non-empty buckets).  */
+extern size_t hash_get_n_buckets_used (const Hash_table *table)
+       _GL_ATTRIBUTE_PURE;
 
-int hash_insert_if_absent (Hash_table *table, const void *entry,
-                           const void **matched_ent);
-void *hash_delete (Hash_table *, const void *);
+/* Return the number of active entries.  */
+extern size_t hash_get_n_entries (const Hash_table *table)
+       _GL_ATTRIBUTE_PURE;
+
+/* Return the length of the longest chain (bucket).  */
+extern size_t hash_get_max_bucket_length (const Hash_table *table)
+       _GL_ATTRIBUTE_PURE;
+
+/* Do a mild validation of a hash table, by traversing it and checking two
+   statistics.  */
+extern bool hash_table_ok (const Hash_table *table)
+       _GL_ATTRIBUTE_PURE;
+
+extern void hash_print_statistics (const Hash_table *table, FILE *stream);
+
+/* If ENTRY matches an entry already in the hash table, return the
+   entry from the table.  Otherwise, return NULL.  */
+extern void *hash_lookup (const Hash_table *table, const void *entry);
+
+/*
+ * Walking.
+ */
+
+/* The functions in this page traverse the hash table and process the
+   contained entries.  For the traversal to work properly, the hash table
+   should not be resized nor modified while any particular entry is being
+   processed.  In particular, entries should not be added, and an entry
+   may be removed only if there is no shrink threshold and the entry being
+   removed has already been passed to hash_get_next.  */
+
+/* Return the first data in the table, or NULL if the table is empty.  */
+extern void *hash_get_first (const Hash_table *table)
+       _GL_ATTRIBUTE_PURE;
+
+/* Return the user data for the entry following ENTRY, where ENTRY has been
+   returned by a previous call to either 'hash_get_first' or 'hash_get_next'.
+   Return NULL if there are no more entries.  */
+extern void *hash_get_next (const Hash_table *table, const void *entry);
+
+/* Fill BUFFER with pointers to active user entries in the hash table, then
+   return the number of pointers copied.  Do not copy more than BUFFER_SIZE
+   pointers.  */
+extern size_t hash_get_entries (const Hash_table *table, void **buffer,
+                                size_t buffer_size);
+
+typedef bool (*Hash_processor) (void *entry, void *processor_data);
+
+/* Call a PROCESSOR function for each entry of a hash table, and return the
+   number of entries for which the processor function returned success.  A
+   pointer to some PROCESSOR_DATA which will be made available to each call to
+   the processor function.  The PROCESSOR accepts two arguments: the first is
+   the user entry being walked into, the second is the value of PROCESSOR_DATA
+   as received.  The walking continue for as long as the PROCESSOR function
+   returns nonzero.  When it returns zero, the walking is interrupted.  */
+extern size_t hash_do_for_each (const Hash_table *table,
+                                Hash_processor processor, void *processor_data);
+
+/*
+ * Allocation and clean-up.
+ */
+
+/* Return a hash index for a NUL-terminated STRING between 0 and N_BUCKETS-1.
+   This is a convenience routine for constructing other hashing functions.  */
+extern size_t hash_string (const char *string, size_t n_buckets)
+       _GL_ATTRIBUTE_PURE;
+
+extern void hash_reset_tuning (Hash_tuning *tuning);
+
+typedef size_t (*Hash_hasher) (const void *entry, size_t table_size);
+typedef bool (*Hash_comparator) (const void *entry1, const void *entry2);
+typedef void (*Hash_data_freer) (void *entry);
+
+/* Reclaim all storage associated with a hash table.  If a data_freer
+   function has been supplied by the user when the hash table was created,
+   this function applies it to the data of each entry before freeing that
+   entry.  */
+extern void hash_free (Hash_table *table);
+
+/* Allocate and return a new hash table, or NULL upon failure.  The initial
+   number of buckets is automatically selected so as to _guarantee_ that you
+   may insert at least CANDIDATE different user entries before any growth of
+   the hash table size occurs.  So, if have a reasonably tight a-priori upper
+   bound on the number of entries you intend to insert in the hash table, you
+   may save some table memory and insertion time, by specifying it here.  If
+   the IS_N_BUCKETS field of the TUNING structure is true, the CANDIDATE
+   argument has its meaning changed to the wanted number of buckets.
+
+   TUNING points to a structure of user-supplied values, in case some fine
+   tuning is wanted over the default behavior of the hasher.  If TUNING is
+   NULL, the default tuning parameters are used instead.  If TUNING is
+   provided but the values requested are out of bounds or might cause
+   rounding errors, return NULL.
+
+   The user-supplied HASHER function, when not NULL, accepts two
+   arguments ENTRY and TABLE_SIZE.  It computes, by hashing ENTRY contents, a
+   slot number for that entry which should be in the range 0..TABLE_SIZE-1.
+   This slot number is then returned.
+
+   The user-supplied COMPARATOR function, when not NULL, accepts two
+   arguments pointing to user data, it then returns true for a pair of entries
+   that compare equal, or false otherwise.  This function is internally called
+   on entries which are already known to hash to the same bucket index,
+   but which are distinct pointers.
+
+   The user-supplied DATA_FREER function, when not NULL, may be later called
+   with the user data as an argument, just before the entry containing the
+   data gets freed.  This happens from within 'hash_free' or 'hash_clear'.
+   You should specify this function only if you want these functions to free
+   all of your 'data' data.  This is typically the case when your data is
+   simply an auxiliary struct that you have malloc'd to aggregate several
+   values.  */
+_GL_ATTRIBUTE_NODISCARD
+extern Hash_table *hash_initialize (size_t candidate,
+                                    const Hash_tuning *tuning,
+                                    Hash_hasher hasher,
+                                    Hash_comparator comparator,
+                                    Hash_data_freer data_freer)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (hash_free, 1);
+
+/* Same as hash_initialize, but invokes xalloc_die on memory exhaustion.  */
+/* This function is defined by module 'xhash'.  */
+_GL_ATTRIBUTE_NODISCARD
+extern Hash_table *hash_xinitialize (size_t candidate,
+                                     const Hash_tuning *tuning,
+                                     Hash_hasher hasher,
+                                     Hash_comparator comparator,
+                                     Hash_data_freer data_freer)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (hash_free, 1)
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
+
+/* Make all buckets empty, placing any chained entries on the free list.
+   Apply the user-specified function data_freer (if any) to the datas of any
+   affected entries.  */
+extern void hash_clear (Hash_table *table);
+
+/*
+ * Insertion and deletion.
+ */
+
+/* For an already existing hash table, change the number of buckets through
+   specifying CANDIDATE.  The contents of the hash table are preserved.  The
+   new number of buckets is automatically selected so as to _guarantee_ that
+   the table may receive at least CANDIDATE different user entries, including
+   those already in the table, before any other growth of the hash table size
+   occurs.  If TUNING->IS_N_BUCKETS is true, then CANDIDATE specifies the
+   exact number of buckets desired.  Return true iff the rehash succeeded.  */
+_GL_ATTRIBUTE_NODISCARD
+extern bool hash_rehash (Hash_table *table, size_t candidate);
+
+/* If ENTRY matches an entry already in the hash table, return the pointer
+   to the entry from the table.  Otherwise, insert ENTRY and return ENTRY.
+   Return NULL if the storage required for insertion cannot be allocated.
+   This implementation does not support duplicate entries or insertion of
+   NULL.  */
+_GL_ATTRIBUTE_NODISCARD
+extern void *hash_insert (Hash_table *table, const void *entry);
+
+/* Same as hash_insert, but invokes xalloc_die on memory exhaustion.  */
+/* This function is defined by module 'xhash'.  */
+extern void *hash_xinsert (Hash_table *table, const void *entry);
+
+/* Insert ENTRY into hash TABLE if there is not already a matching entry.
+
+   Return -1 upon memory allocation failure.
+   Return 1 if insertion succeeded.
+   Return 0 if there is already a matching entry in the table,
+   and in that case, if MATCHED_ENT is non-NULL, set *MATCHED_ENT
+   to that entry.
+
+   This interface is easier to use than hash_insert when you must
+   distinguish between the latter two cases.  More importantly,
+   hash_insert is unusable for some types of ENTRY values.  When using
+   hash_insert, the only way to distinguish those cases is to compare
+   the return value and ENTRY.  That works only when you can have two
+   different ENTRY values that point to data that compares "equal".  Thus,
+   when the ENTRY value is a simple scalar, you must use
+   hash_insert_if_absent.  ENTRY must not be NULL.  */
+extern int hash_insert_if_absent (Hash_table *table, const void *entry,
+                                  const void **matched_ent);
+
+/* If ENTRY is already in the table, remove it and return the just-deleted
+   data (the user may want to deallocate its storage).  If ENTRY is not in the
+   table, don't modify the table and return NULL.  */
+extern void *hash_remove (Hash_table *table, const void *entry);
+
+/* Same as hash_remove.  This interface is deprecated.
+   FIXME: Remove in 2022.  */
+_GL_ATTRIBUTE_DEPRECATED
+extern void *hash_delete (Hash_table *table, const void *entry);
+
+# ifdef __cplusplus
+}
+# endif
 
 #endif
diff --git a/lib/ialloc.c b/lib/ialloc.c
new file mode 100644
index 0000000..f506b84
--- /dev/null
+++ b/lib/ialloc.c
@@ -0,0 +1,21 @@
+/* malloc with idx_t rather than size_t
+
+   Copyright 2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#define IALLOC_INLINE _GL_EXTERN_INLINE
+#include "ialloc.h"
diff --git a/lib/ialloc.h b/lib/ialloc.h
new file mode 100644
index 0000000..5ceda46
--- /dev/null
+++ b/lib/ialloc.h
@@ -0,0 +1,100 @@
+/* ialloc.h -- malloc with idx_t rather than size_t
+
+   Copyright 2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef IALLOC_H_
+#define IALLOC_H_
+
+#include "idx.h"
+
+#include <errno.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef IALLOC_INLINE
+# define IALLOC_INLINE _GL_INLINE
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+IALLOC_INLINE void * _GL_ATTRIBUTE_COLD
+_gl_alloc_nomem (void)
+{
+  errno = ENOMEM;
+  return NULL;
+}
+
+IALLOC_INLINE
+_GL_ATTRIBUTE_MALLOC /*_GL_ATTRIBUTE_DEALLOC_FREE*/
+void *
+imalloc (idx_t s)
+{
+  return s <= SIZE_MAX ? malloc (s) : _gl_alloc_nomem ();
+}
+
+IALLOC_INLINE
+/*_GL_ATTRIBUTE_DEALLOC_FREE*/
+void *
+irealloc (void *p, idx_t s)
+{
+  /* Work around GNU realloc glitch by treating a zero size as if it
+     were 1, so that returning NULL is equivalent to failing.  */
+  return s <= SIZE_MAX ? realloc (p, s | !s) : _gl_alloc_nomem ();
+}
+
+IALLOC_INLINE
+_GL_ATTRIBUTE_MALLOC /*_GL_ATTRIBUTE_DEALLOC_FREE*/
+void *
+icalloc (idx_t n, idx_t s)
+{
+  if (SIZE_MAX < n)
+    {
+      if (s != 0)
+        return _gl_alloc_nomem ();
+      n = 0;
+    }
+  if (SIZE_MAX < s)
+    {
+      if (n != 0)
+        return _gl_alloc_nomem ();
+      s = 0;
+    }
+  return calloc (n, s);
+}
+
+IALLOC_INLINE void *
+ireallocarray (void *p, idx_t n, idx_t s)
+{
+  /* Work around GNU reallocarray glitch by treating a zero size as if
+     it were 1, so that returning NULL is equivalent to failing.  */
+  if (n == 0 || s == 0)
+    n = s = 1;
+  return (n <= SIZE_MAX && s <= SIZE_MAX
+          ? reallocarray (p, n, s)
+          : _gl_alloc_nomem ());
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/lib/iconv.c b/lib/iconv.c
new file mode 100644
index 0000000..bf51493
--- /dev/null
+++ b/lib/iconv.c
@@ -0,0 +1,446 @@
+/* Character set conversion.
+   Copyright (C) 1999-2001, 2007, 2009-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <iconv.h>
+
+#include <stddef.h>
+
+#if REPLACE_ICONV_UTF
+# include <errno.h>
+# include <stdint.h>
+# include <stdlib.h>
+# include "unistr.h"
+#endif
+
+#if REPLACE_ICONV_UTF
+
+/* UTF-{16,32}{BE,LE} converters taken from GNU libiconv 1.11.  */
+
+/* Return code if invalid. (xxx_mbtowc) */
+# define RET_ILSEQ      -1
+/* Return code if no bytes were read. (xxx_mbtowc) */
+# define RET_TOOFEW     -2
+
+/* Return code if invalid. (xxx_wctomb) */
+# define RET_ILUNI      -1
+/* Return code if output buffer is too small. (xxx_wctomb, xxx_reset) */
+# define RET_TOOSMALL   -2
+
+/*
+ * UTF-16BE
+ */
+
+/* Specification: RFC 2781 */
+
+static int
+utf16be_mbtowc (ucs4_t *pwc, const unsigned char *s, size_t n)
+{
+  if (n >= 2)
+    {
+      ucs4_t wc = (s[0] << 8) + s[1];
+      if (wc >= 0xd800 && wc < 0xdc00)
+        {
+          if (n >= 4)
+            {
+              ucs4_t wc2 = (s[2] << 8) + s[3];
+              if (!(wc2 >= 0xdc00 && wc2 < 0xe000))
+                return RET_ILSEQ;
+              *pwc = 0x10000 + ((wc - 0xd800) << 10) + (wc2 - 0xdc00);
+              return 4;
+            }
+        }
+      else if (wc >= 0xdc00 && wc < 0xe000)
+        {
+          return RET_ILSEQ;
+        }
+      else
+        {
+          *pwc = wc;
+          return 2;
+        }
+    }
+  return RET_TOOFEW;
+}
+
+static int
+utf16be_wctomb (unsigned char *r, ucs4_t wc, size_t n)
+{
+  if (!(wc >= 0xd800 && wc < 0xe000))
+    {
+      if (wc < 0x10000)
+        {
+          if (n >= 2)
+            {
+              r[0] = (unsigned char) (wc >> 8);
+              r[1] = (unsigned char) wc;
+              return 2;
+            }
+          else
+            return RET_TOOSMALL;
+        }
+      else if (wc < 0x110000)
+        {
+          if (n >= 4)
+            {
+              ucs4_t wc1 = 0xd800 + ((wc - 0x10000) >> 10);
+              ucs4_t wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff);
+              r[0] = (unsigned char) (wc1 >> 8);
+              r[1] = (unsigned char) wc1;
+              r[2] = (unsigned char) (wc2 >> 8);
+              r[3] = (unsigned char) wc2;
+              return 4;
+            }
+          else
+            return RET_TOOSMALL;
+        }
+    }
+  return RET_ILUNI;
+}
+
+/*
+ * UTF-16LE
+ */
+
+/* Specification: RFC 2781 */
+
+static int
+utf16le_mbtowc (ucs4_t *pwc, const unsigned char *s, size_t n)
+{
+  if (n >= 2)
+    {
+      ucs4_t wc = s[0] + (s[1] << 8);
+      if (wc >= 0xd800 && wc < 0xdc00)
+        {
+          if (n >= 4)
+            {
+              ucs4_t wc2 = s[2] + (s[3] << 8);
+              if (!(wc2 >= 0xdc00 && wc2 < 0xe000))
+                return RET_ILSEQ;
+              *pwc = 0x10000 + ((wc - 0xd800) << 10) + (wc2 - 0xdc00);
+              return 4;
+            }
+        }
+      else if (wc >= 0xdc00 && wc < 0xe000)
+        {
+          return RET_ILSEQ;
+        }
+      else
+        {
+          *pwc = wc;
+          return 2;
+        }
+    }
+  return RET_TOOFEW;
+}
+
+static int
+utf16le_wctomb (unsigned char *r, ucs4_t wc, size_t n)
+{
+  if (!(wc >= 0xd800 && wc < 0xe000))
+    {
+      if (wc < 0x10000)
+        {
+          if (n >= 2)
+            {
+              r[0] = (unsigned char) wc;
+              r[1] = (unsigned char) (wc >> 8);
+              return 2;
+            }
+          else
+            return RET_TOOSMALL;
+        }
+      else if (wc < 0x110000)
+        {
+          if (n >= 4)
+            {
+              ucs4_t wc1 = 0xd800 + ((wc - 0x10000) >> 10);
+              ucs4_t wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff);
+              r[0] = (unsigned char) wc1;
+              r[1] = (unsigned char) (wc1 >> 8);
+              r[2] = (unsigned char) wc2;
+              r[3] = (unsigned char) (wc2 >> 8);
+              return 4;
+            }
+          else
+            return RET_TOOSMALL;
+        }
+    }
+  return RET_ILUNI;
+}
+
+/*
+ * UTF-32BE
+ */
+
+/* Specification: Unicode 3.1 Standard Annex #19 */
+
+static int
+utf32be_mbtowc (ucs4_t *pwc, const unsigned char *s, size_t n)
+{
+  if (n >= 4)
+    {
+      ucs4_t wc = (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3];
+      if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000))
+        {
+          *pwc = wc;
+          return 4;
+        }
+      else
+        return RET_ILSEQ;
+    }
+  return RET_TOOFEW;
+}
+
+static int
+utf32be_wctomb (unsigned char *r, ucs4_t wc, size_t n)
+{
+  if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000))
+    {
+      if (n >= 4)
+        {
+          r[0] = 0;
+          r[1] = (unsigned char) (wc >> 16);
+          r[2] = (unsigned char) (wc >> 8);
+          r[3] = (unsigned char) wc;
+          return 4;
+        }
+      else
+        return RET_TOOSMALL;
+    }
+  return RET_ILUNI;
+}
+
+/*
+ * UTF-32LE
+ */
+
+/* Specification: Unicode 3.1 Standard Annex #19 */
+
+static int
+utf32le_mbtowc (ucs4_t *pwc, const unsigned char *s, size_t n)
+{
+  if (n >= 4)
+    {
+      ucs4_t wc = s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24);
+      if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000))
+        {
+          *pwc = wc;
+          return 4;
+        }
+      else
+        return RET_ILSEQ;
+    }
+  return RET_TOOFEW;
+}
+
+static int
+utf32le_wctomb (unsigned char *r, ucs4_t wc, size_t n)
+{
+  if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000))
+    {
+      if (n >= 4)
+        {
+          r[0] = (unsigned char) wc;
+          r[1] = (unsigned char) (wc >> 8);
+          r[2] = (unsigned char) (wc >> 16);
+          r[3] = 0;
+          return 4;
+        }
+      else
+        return RET_TOOSMALL;
+    }
+  return RET_ILUNI;
+}
+
+#endif
+
+size_t
+rpl_iconv (iconv_t cd,
+           ICONV_CONST char **inbuf, size_t *inbytesleft,
+           char **outbuf, size_t *outbytesleft)
+#undef iconv
+{
+#if REPLACE_ICONV_UTF
+  switch ((uintptr_t) cd)
+    {
+      {
+        int (*xxx_wctomb) (unsigned char *, ucs4_t, size_t);
+
+        case (uintptr_t) _ICONV_UTF8_UTF16BE:
+          xxx_wctomb = utf16be_wctomb;
+          goto loop_from_utf8;
+        case (uintptr_t) _ICONV_UTF8_UTF16LE:
+          xxx_wctomb = utf16le_wctomb;
+          goto loop_from_utf8;
+        case (uintptr_t) _ICONV_UTF8_UTF32BE:
+          xxx_wctomb = utf32be_wctomb;
+          goto loop_from_utf8;
+        case (uintptr_t) _ICONV_UTF8_UTF32LE:
+          xxx_wctomb = utf32le_wctomb;
+          goto loop_from_utf8;
+
+       loop_from_utf8:
+        if (inbuf == NULL || *inbuf == NULL)
+          return 0;
+        {
+          ICONV_CONST char *inptr = *inbuf;
+          size_t inleft = *inbytesleft;
+          char *outptr = *outbuf;
+          size_t outleft = *outbytesleft;
+          size_t res = 0;
+          while (inleft > 0)
+            {
+              ucs4_t uc;
+              int m = u8_mbtoucr (&uc, (const uint8_t *) inptr, inleft);
+              if (m <= 0)
+                {
+                  if (m == -1)
+                    {
+                      errno = EILSEQ;
+                      res = (size_t)(-1);
+                      break;
+                    }
+                  if (m == -2)
+                    {
+                      errno = EINVAL;
+                      res = (size_t)(-1);
+                      break;
+                    }
+                  abort ();
+                }
+              else
+                {
+                  int n = xxx_wctomb ((uint8_t *) outptr, uc, outleft);
+                  if (n < 0)
+                    {
+                      if (n == RET_ILUNI)
+                        {
+                          errno = EILSEQ;
+                          res = (size_t)(-1);
+                          break;
+                        }
+                      if (n == RET_TOOSMALL)
+                        {
+                          errno = E2BIG;
+                          res = (size_t)(-1);
+                          break;
+                        }
+                      abort ();
+                    }
+                  else
+                    {
+                      inptr += m;
+                      inleft -= m;
+                      outptr += n;
+                      outleft -= n;
+                    }
+                }
+            }
+          *inbuf = inptr;
+          *inbytesleft = inleft;
+          *outbuf = outptr;
+          *outbytesleft = outleft;
+          return res;
+        }
+      }
+
+      {
+        int (*xxx_mbtowc) (ucs4_t *, const unsigned char *, size_t);
+
+        case (uintptr_t) _ICONV_UTF16BE_UTF8:
+          xxx_mbtowc = utf16be_mbtowc;
+          goto loop_to_utf8;
+        case (uintptr_t) _ICONV_UTF16LE_UTF8:
+          xxx_mbtowc = utf16le_mbtowc;
+          goto loop_to_utf8;
+        case (uintptr_t) _ICONV_UTF32BE_UTF8:
+          xxx_mbtowc = utf32be_mbtowc;
+          goto loop_to_utf8;
+        case (uintptr_t) _ICONV_UTF32LE_UTF8:
+          xxx_mbtowc = utf32le_mbtowc;
+          goto loop_to_utf8;
+
+       loop_to_utf8:
+        if (inbuf == NULL || *inbuf == NULL)
+          return 0;
+        {
+          ICONV_CONST char *inptr = *inbuf;
+          size_t inleft = *inbytesleft;
+          char *outptr = *outbuf;
+          size_t outleft = *outbytesleft;
+          size_t res = 0;
+          while (inleft > 0)
+            {
+              ucs4_t uc;
+              int m = xxx_mbtowc (&uc, (const uint8_t *) inptr, inleft);
+              if (m <= 0)
+                {
+                  if (m == RET_ILSEQ)
+                    {
+                      errno = EILSEQ;
+                      res = (size_t)(-1);
+                      break;
+                    }
+                  if (m == RET_TOOFEW)
+                    {
+                      errno = EINVAL;
+                      res = (size_t)(-1);
+                      break;
+                    }
+                  abort ();
+                }
+              else
+                {
+                  int n = u8_uctomb ((uint8_t *) outptr, uc, outleft);
+                  if (n < 0)
+                    {
+                      if (n == -1)
+                        {
+                          errno = EILSEQ;
+                          res = (size_t)(-1);
+                          break;
+                        }
+                      if (n == -2)
+                        {
+                          errno = E2BIG;
+                          res = (size_t)(-1);
+                          break;
+                        }
+                      abort ();
+                    }
+                  else
+                    {
+                      inptr += m;
+                      inleft -= m;
+                      outptr += n;
+                      outleft -= n;
+                    }
+                }
+            }
+          *inbuf = inptr;
+          *inbytesleft = inleft;
+          *outbuf = outptr;
+          *outbytesleft = outleft;
+          return res;
+        }
+      }
+    }
+#endif
+  return iconv (cd, inbuf, inbytesleft, outbuf, outbytesleft);
+}
diff --git a/lib/iconv.in.h b/lib/iconv.in.h
new file mode 100644
index 0000000..3a2f94e
--- /dev/null
+++ b/lib/iconv.in.h
@@ -0,0 +1,127 @@
+/* A GNU-like <iconv.h>.
+
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _@GUARD_PREFIX@_ICONV_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard.  */
+#@INCLUDE_NEXT@ @NEXT_ICONV_H@
+
+#ifndef _@GUARD_PREFIX@_ICONV_H
+#define _@GUARD_PREFIX@_ICONV_H
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
+
+#if @GNULIB_ICONV@
+# if @REPLACE_ICONV_OPEN@
+/* An iconv_open wrapper that supports the IANA standardized encoding names
+   ("ISO-8859-1" etc.) as far as possible.  */
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define iconv_open rpl_iconv_open
+#  endif
+_GL_FUNCDECL_RPL (iconv_open, iconv_t,
+                  (const char *tocode, const char *fromcode)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (iconv_open, iconv_t,
+                  (const char *tocode, const char *fromcode));
+# else
+_GL_CXXALIAS_SYS (iconv_open, iconv_t,
+                  (const char *tocode, const char *fromcode));
+# endif
+_GL_CXXALIASWARN (iconv_open);
+#elif defined GNULIB_POSIXCHECK
+# undef iconv_open
+# if HAVE_RAW_DECL_ICONV_OPEN
+_GL_WARN_ON_USE (iconv_open, "iconv_open is not working correctly everywhere - "
+                 "use gnulib module iconv for portability");
+# endif
+#endif
+
+#if @REPLACE_ICONV_UTF@
+/* Special constants for supporting UTF-{16,32}{BE,LE} encodings.
+   Not public.  */
+# define _ICONV_UTF8_UTF16BE (iconv_t)(-161)
+# define _ICONV_UTF8_UTF16LE (iconv_t)(-162)
+# define _ICONV_UTF8_UTF32BE (iconv_t)(-163)
+# define _ICONV_UTF8_UTF32LE (iconv_t)(-164)
+# define _ICONV_UTF16BE_UTF8 (iconv_t)(-165)
+# define _ICONV_UTF16LE_UTF8 (iconv_t)(-166)
+# define _ICONV_UTF32BE_UTF8 (iconv_t)(-167)
+# define _ICONV_UTF32LE_UTF8 (iconv_t)(-168)
+#endif
+
+#if @GNULIB_ICONV@
+# if @REPLACE_ICONV@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define iconv rpl_iconv
+#  endif
+_GL_FUNCDECL_RPL (iconv, size_t,
+                  (iconv_t cd,
+                   @ICONV_CONST@ char **restrict inbuf,
+                   size_t *restrict inbytesleft,
+                   char **restrict outbuf, size_t *restrict outbytesleft));
+_GL_CXXALIAS_RPL (iconv, size_t,
+                  (iconv_t cd,
+                   @ICONV_CONST@ char **restrict inbuf,
+                   size_t *restrict inbytesleft,
+                   char **restrict outbuf, size_t *restrict outbytesleft));
+# else
+/* Need to cast, because on some versions of Solaris, ICONV_CONST does
+   not have the right value for C++.  */
+_GL_CXXALIAS_SYS_CAST (iconv, size_t,
+                       (iconv_t cd,
+                        @ICONV_CONST@ char **restrict inbuf,
+                        size_t *restrict inbytesleft,
+                        char **restrict outbuf, size_t *restrict outbytesleft));
+# endif
+_GL_CXXALIASWARN (iconv);
+# ifndef ICONV_CONST
+#  define ICONV_CONST @ICONV_CONST@
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef iconv
+# if HAVE_RAW_DECL_ICONV
+_GL_WARN_ON_USE (iconv, "iconv is not working correctly everywhere - "
+                 "use gnulib module iconv for portability");
+# endif
+#endif
+
+#if @GNULIB_ICONV@
+# if @REPLACE_ICONV@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define iconv_close rpl_iconv_close
+#  endif
+_GL_FUNCDECL_RPL (iconv_close, int, (iconv_t cd));
+_GL_CXXALIAS_RPL (iconv_close, int, (iconv_t cd));
+# else
+_GL_CXXALIAS_SYS (iconv_close, int, (iconv_t cd));
+# endif
+_GL_CXXALIASWARN (iconv_close);
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_ICONV_H */
+#endif /* _@GUARD_PREFIX@_ICONV_H */
diff --git a/lib/iconv_close.c b/lib/iconv_close.c
new file mode 100644
index 0000000..7429b92
--- /dev/null
+++ b/lib/iconv_close.c
@@ -0,0 +1,43 @@
+/* Character set conversion.
+   Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <iconv.h>
+
+#include <stdint.h>
+
+int
+rpl_iconv_close (iconv_t cd)
+#undef iconv_close
+{
+#if REPLACE_ICONV_UTF
+  switch ((uintptr_t) cd)
+    {
+    case (uintptr_t) _ICONV_UTF8_UTF16BE:
+    case (uintptr_t) _ICONV_UTF8_UTF16LE:
+    case (uintptr_t) _ICONV_UTF8_UTF32BE:
+    case (uintptr_t) _ICONV_UTF8_UTF32LE:
+    case (uintptr_t) _ICONV_UTF16BE_UTF8:
+    case (uintptr_t) _ICONV_UTF16LE_UTF8:
+    case (uintptr_t) _ICONV_UTF32BE_UTF8:
+    case (uintptr_t) _ICONV_UTF32LE_UTF8:
+      return 0;
+    }
+#endif
+  return iconv_close (cd);
+}
diff --git a/lib/iconv_open-aix.gperf b/lib/iconv_open-aix.gperf
new file mode 100644
index 0000000..d073759
--- /dev/null
+++ b/lib/iconv_open-aix.gperf
@@ -0,0 +1,60 @@
+/* Character set conversion.
+   Copyright (C) 2007, 2020-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+%struct-type
+%language=ANSI-C
+%define slot-name standard_name
+%define hash-function-name mapping_hash
+%define lookup-function-name mapping_lookup
+%readonly-tables
+%global-table
+%define word-array-name mappings
+%pic
+%%
+# On AIX 5.1, look in /usr/lib/nls/loc/uconvTable.
+ISO-8859-1, "ISO8859-1"
+ISO-8859-2, "ISO8859-2"
+ISO-8859-3, "ISO8859-3"
+ISO-8859-4, "ISO8859-4"
+ISO-8859-5, "ISO8859-5"
+ISO-8859-6, "ISO8859-6"
+ISO-8859-7, "ISO8859-7"
+ISO-8859-8, "ISO8859-8"
+ISO-8859-9, "ISO8859-9"
+ISO-8859-15, "ISO8859-15"
+CP437, "IBM-437"
+CP850, "IBM-850"
+CP852, "IBM-852"
+CP856, "IBM-856"
+CP857, "IBM-857"
+CP861, "IBM-861"
+CP865, "IBM-865"
+CP869, "IBM-869"
+ISO-8859-13, "IBM-921"
+CP922, "IBM-922"
+CP932, "IBM-932"
+CP943, "IBM-943"
+CP1046, "IBM-1046"
+CP1124, "IBM-1124"
+CP1125, "IBM-1125"
+CP1129, "IBM-1129"
+CP1252, "IBM-1252"
+GB2312, "IBM-eucCN"
+EUC-JP, "IBM-eucJP"
+EUC-KR, "IBM-eucKR"
+EUC-TW, "IBM-eucTW"
+BIG5, "big5"
diff --git a/lib/iconv_open-aix.h b/lib/iconv_open-aix.h
new file mode 100644
index 0000000..f0c9d48
--- /dev/null
+++ b/lib/iconv_open-aix.h
@@ -0,0 +1,250 @@
+/* ANSI-C code produced by gperf version 3.0.3 */
+/* Command-line: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/gperf -m 10 /Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf  */
+/* Computed positions: -k'4,$' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+#line 17 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+
+#define TOTAL_KEYWORDS 32
+#define MIN_WORD_LENGTH 4
+#define MAX_WORD_LENGTH 11
+#define MIN_HASH_VALUE 6
+#define MAX_HASH_VALUE 44
+/* maximum key range = 39, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+mapping_hash (register const char *str, register unsigned int len)
+{
+  static const unsigned char asso_values[] =
+    {
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45,  0,  4, 25,
+       0, 11, 24,  9, 17,  3, 14, 21, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+       3, 45,  1, 45, 45, 45, 45,  0, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+      45, 45, 45, 45, 45, 45, 45, 45
+    };
+  return len + asso_values[(unsigned char)str[3]+2] + asso_values[(unsigned char)str[len - 1]];
+}
+
+struct stringpool_t
+  {
+    char stringpool_str6[sizeof("EUC-TW")];
+    char stringpool_str7[sizeof("EUC-KR")];
+    char stringpool_str8[sizeof("CP852")];
+    char stringpool_str9[sizeof("EUC-JP")];
+    char stringpool_str10[sizeof("ISO-8859-2")];
+    char stringpool_str11[sizeof("CP857")];
+    char stringpool_str12[sizeof("CP850")];
+    char stringpool_str13[sizeof("ISO-8859-7")];
+    char stringpool_str14[sizeof("CP932")];
+    char stringpool_str15[sizeof("GB2312")];
+    char stringpool_str16[sizeof("BIG5")];
+    char stringpool_str17[sizeof("CP437")];
+    char stringpool_str19[sizeof("ISO-8859-5")];
+    char stringpool_str20[sizeof("ISO-8859-15")];
+    char stringpool_str21[sizeof("ISO-8859-3")];
+    char stringpool_str22[sizeof("ISO-8859-13")];
+    char stringpool_str23[sizeof("CP1046")];
+    char stringpool_str24[sizeof("ISO-8859-8")];
+    char stringpool_str25[sizeof("CP856")];
+    char stringpool_str26[sizeof("CP1125")];
+    char stringpool_str27[sizeof("ISO-8859-6")];
+    char stringpool_str28[sizeof("CP865")];
+    char stringpool_str29[sizeof("CP922")];
+    char stringpool_str30[sizeof("CP1252")];
+    char stringpool_str31[sizeof("ISO-8859-9")];
+    char stringpool_str33[sizeof("CP943")];
+    char stringpool_str34[sizeof("ISO-8859-4")];
+    char stringpool_str35[sizeof("ISO-8859-1")];
+    char stringpool_str38[sizeof("CP1129")];
+    char stringpool_str40[sizeof("CP869")];
+    char stringpool_str41[sizeof("CP1124")];
+    char stringpool_str44[sizeof("CP861")];
+  };
+static const struct stringpool_t stringpool_contents =
+  {
+    "EUC-TW",
+    "EUC-KR",
+    "CP852",
+    "EUC-JP",
+    "ISO-8859-2",
+    "CP857",
+    "CP850",
+    "ISO-8859-7",
+    "CP932",
+    "GB2312",
+    "BIG5",
+    "CP437",
+    "ISO-8859-5",
+    "ISO-8859-15",
+    "ISO-8859-3",
+    "ISO-8859-13",
+    "CP1046",
+    "ISO-8859-8",
+    "CP856",
+    "CP1125",
+    "ISO-8859-6",
+    "CP865",
+    "CP922",
+    "CP1252",
+    "ISO-8859-9",
+    "CP943",
+    "ISO-8859-4",
+    "ISO-8859-1",
+    "CP1129",
+    "CP869",
+    "CP1124",
+    "CP861"
+  };
+#define stringpool ((const char *) &stringpool_contents)
+
+static const struct mapping mappings[] =
+  {
+    {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+#line 59 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str6), "IBM-eucTW"},
+#line 58 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str7), "IBM-eucKR"},
+#line 41 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str8), "IBM-852"},
+#line 57 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str9), "IBM-eucJP"},
+#line 30 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str10), "ISO8859-2"},
+#line 43 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str11), "IBM-857"},
+#line 40 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str12), "IBM-850"},
+#line 35 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str13), "ISO8859-7"},
+#line 49 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str14), "IBM-932"},
+#line 56 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str15), "IBM-eucCN"},
+#line 60 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str16), "big5"},
+#line 39 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str17), "IBM-437"},
+    {-1},
+#line 33 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str19), "ISO8859-5"},
+#line 38 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str20), "ISO8859-15"},
+#line 31 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str21), "ISO8859-3"},
+#line 47 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str22), "IBM-921"},
+#line 51 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str23), "IBM-1046"},
+#line 36 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str24), "ISO8859-8"},
+#line 42 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str25), "IBM-856"},
+#line 53 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str26), "IBM-1125"},
+#line 34 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str27), "ISO8859-6"},
+#line 45 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str28), "IBM-865"},
+#line 48 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str29), "IBM-922"},
+#line 55 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str30), "IBM-1252"},
+#line 37 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str31), "ISO8859-9"},
+    {-1},
+#line 50 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str33), "IBM-943"},
+#line 32 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str34), "ISO8859-4"},
+#line 29 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str35), "ISO8859-1"},
+    {-1}, {-1},
+#line 54 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str38), "IBM-1129"},
+    {-1},
+#line 46 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str40), "IBM-869"},
+#line 52 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str41), "IBM-1124"},
+    {-1}, {-1},
+#line 44 "/Users/akim/src/gnu/bison/lib/iconv_open-aix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str44), "IBM-861"}
+  };
+
+const struct mapping *
+mapping_lookup (register const char *str, register unsigned int len)
+{
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      unsigned int key = mapping_hash (str, len);
+
+      if (key <= MAX_HASH_VALUE)
+        {
+          register int o = mappings[key].standard_name;
+          if (o >= 0)
+            {
+              register const char *s = o + stringpool;
+
+              if (*str == *s && !strcmp (str + 1, s + 1))
+                return &mappings[key];
+            }
+        }
+    }
+  return 0;
+}
diff --git a/lib/iconv_open-hpux.gperf b/lib/iconv_open-hpux.gperf
new file mode 100644
index 0000000..f4664d6
--- /dev/null
+++ b/lib/iconv_open-hpux.gperf
@@ -0,0 +1,72 @@
+/* Character set conversion.
+   Copyright (C) 2007, 2020-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+struct mapping { int standard_name; const char vendor_name[9 + 1]; };
+%struct-type
+%language=ANSI-C
+%define slot-name standard_name
+%define hash-function-name mapping_hash
+%define lookup-function-name mapping_lookup
+%readonly-tables
+%global-table
+%define word-array-name mappings
+%pic
+%%
+# On HP-UX 11.11, look in /usr/lib/nls/iconv.
+ISO-8859-1, "iso88591"
+ISO-8859-2, "iso88592"
+ISO-8859-5, "iso88595"
+ISO-8859-6, "iso88596"
+ISO-8859-7, "iso88597"
+ISO-8859-8, "iso88598"
+ISO-8859-9, "iso88599"
+ISO-8859-15, "iso885915"
+CP437, "cp437"
+CP775, "cp775"
+CP850, "cp850"
+CP852, "cp852"
+CP855, "cp855"
+CP857, "cp857"
+CP861, "cp861"
+CP862, "cp862"
+CP864, "cp864"
+CP865, "cp865"
+CP866, "cp866"
+CP869, "cp869"
+CP874, "cp874"
+CP1250, "cp1250"
+CP1251, "cp1251"
+CP1252, "cp1252"
+CP1253, "cp1253"
+CP1254, "cp1254"
+CP1255, "cp1255"
+CP1256, "cp1256"
+CP1257, "cp1257"
+CP1258, "cp1258"
+HP-ROMAN8, "roman8"
+HP-ARABIC8, "arabic8"
+HP-GREEK8, "greek8"
+HP-HEBREW8, "hebrew8"
+HP-TURKISH8, "turkish8"
+HP-KANA8, "kana8"
+TIS-620, "tis620"
+GB2312, "hp15CN"
+EUC-JP, "eucJP"
+EUC-KR, "eucKR"
+EUC-TW, "eucTW"
+BIG5, "big5"
+SHIFT_JIS, "sjis"
+UTF-8, "utf8"
diff --git a/lib/iconv_open-hpux.h b/lib/iconv_open-hpux.h
new file mode 100644
index 0000000..89876b9
--- /dev/null
+++ b/lib/iconv_open-hpux.h
@@ -0,0 +1,293 @@
+/* ANSI-C code produced by gperf version 3.0.3 */
+/* Command-line: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/gperf -m 10 /Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf  */
+/* Computed positions: -k'4,$' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+#line 17 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+struct mapping { int standard_name; const char vendor_name[9 + 1]; };
+
+#define TOTAL_KEYWORDS 44
+#define MIN_WORD_LENGTH 4
+#define MAX_WORD_LENGTH 11
+#define MIN_HASH_VALUE 6
+#define MAX_HASH_VALUE 49
+/* maximum key range = 44, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+mapping_hash (register const char *str, register unsigned int len)
+{
+  static const unsigned char asso_values[] =
+    {
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50,  1,  2,
+      24, 43,  5, 10,  0, 13, 32,  3, 19, 18,
+      50, 50, 50, 50, 50, 50, 50, 50, 50,  5,
+      50, 50, 50, 50, 14,  5,  0, 50, 50,  0,
+      27, 50, 12, 14, 50, 50,  0,  5,  2, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+      50, 50, 50, 50, 50, 50, 50, 50, 50, 50
+    };
+  return len + asso_values[(unsigned char)str[3]+4] + asso_values[(unsigned char)str[len - 1]];
+}
+
+struct stringpool_t
+  {
+    char stringpool_str6[sizeof("CP1256")];
+    char stringpool_str7[sizeof("CP1250")];
+    char stringpool_str8[sizeof("CP1251")];
+    char stringpool_str9[sizeof("CP850")];
+    char stringpool_str10[sizeof("TIS-620")];
+    char stringpool_str11[sizeof("CP1254")];
+    char stringpool_str12[sizeof("ISO-8859-6")];
+    char stringpool_str13[sizeof("EUC-TW")];
+    char stringpool_str14[sizeof("ISO-8859-1")];
+    char stringpool_str15[sizeof("ISO-8859-9")];
+    char stringpool_str16[sizeof("CP1255")];
+    char stringpool_str17[sizeof("BIG5")];
+    char stringpool_str18[sizeof("CP855")];
+    char stringpool_str19[sizeof("CP1257")];
+    char stringpool_str20[sizeof("EUC-KR")];
+    char stringpool_str21[sizeof("CP857")];
+    char stringpool_str22[sizeof("ISO-8859-5")];
+    char stringpool_str23[sizeof("ISO-8859-15")];
+    char stringpool_str24[sizeof("CP866")];
+    char stringpool_str25[sizeof("ISO-8859-7")];
+    char stringpool_str26[sizeof("CP861")];
+    char stringpool_str27[sizeof("CP869")];
+    char stringpool_str28[sizeof("CP874")];
+    char stringpool_str29[sizeof("CP864")];
+    char stringpool_str30[sizeof("CP1252")];
+    char stringpool_str31[sizeof("CP437")];
+    char stringpool_str32[sizeof("CP852")];
+    char stringpool_str33[sizeof("CP775")];
+    char stringpool_str34[sizeof("CP865")];
+    char stringpool_str35[sizeof("EUC-JP")];
+    char stringpool_str36[sizeof("ISO-8859-2")];
+    char stringpool_str37[sizeof("SHIFT_JIS")];
+    char stringpool_str38[sizeof("CP1258")];
+    char stringpool_str39[sizeof("UTF-8")];
+    char stringpool_str40[sizeof("HP-KANA8")];
+    char stringpool_str41[sizeof("HP-ROMAN8")];
+    char stringpool_str42[sizeof("HP-HEBREW8")];
+    char stringpool_str43[sizeof("GB2312")];
+    char stringpool_str44[sizeof("ISO-8859-8")];
+    char stringpool_str45[sizeof("HP-TURKISH8")];
+    char stringpool_str46[sizeof("HP-GREEK8")];
+    char stringpool_str47[sizeof("HP-ARABIC8")];
+    char stringpool_str48[sizeof("CP862")];
+    char stringpool_str49[sizeof("CP1253")];
+  };
+static const struct stringpool_t stringpool_contents =
+  {
+    "CP1256",
+    "CP1250",
+    "CP1251",
+    "CP850",
+    "TIS-620",
+    "CP1254",
+    "ISO-8859-6",
+    "EUC-TW",
+    "ISO-8859-1",
+    "ISO-8859-9",
+    "CP1255",
+    "BIG5",
+    "CP855",
+    "CP1257",
+    "EUC-KR",
+    "CP857",
+    "ISO-8859-5",
+    "ISO-8859-15",
+    "CP866",
+    "ISO-8859-7",
+    "CP861",
+    "CP869",
+    "CP874",
+    "CP864",
+    "CP1252",
+    "CP437",
+    "CP852",
+    "CP775",
+    "CP865",
+    "EUC-JP",
+    "ISO-8859-2",
+    "SHIFT_JIS",
+    "CP1258",
+    "UTF-8",
+    "HP-KANA8",
+    "HP-ROMAN8",
+    "HP-HEBREW8",
+    "GB2312",
+    "ISO-8859-8",
+    "HP-TURKISH8",
+    "HP-GREEK8",
+    "HP-ARABIC8",
+    "CP862",
+    "CP1253"
+  };
+#define stringpool ((const char *) &stringpool_contents)
+
+static const struct mapping mappings[] =
+  {
+    {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+#line 56 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str6), "cp1256"},
+#line 50 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str7), "cp1250"},
+#line 51 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str8), "cp1251"},
+#line 39 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str9), "cp850"},
+#line 65 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str10), "tis620"},
+#line 54 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str11), "cp1254"},
+#line 32 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str12), "iso88596"},
+#line 69 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str13), "eucTW"},
+#line 29 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str14), "iso88591"},
+#line 35 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str15), "iso88599"},
+#line 55 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str16), "cp1255"},
+#line 70 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str17), "big5"},
+#line 41 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str18), "cp855"},
+#line 57 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str19), "cp1257"},
+#line 68 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str20), "eucKR"},
+#line 42 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str21), "cp857"},
+#line 31 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str22), "iso88595"},
+#line 36 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str23), "iso885915"},
+#line 47 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str24), "cp866"},
+#line 33 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str25), "iso88597"},
+#line 43 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str26), "cp861"},
+#line 48 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str27), "cp869"},
+#line 49 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str28), "cp874"},
+#line 45 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str29), "cp864"},
+#line 52 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str30), "cp1252"},
+#line 37 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str31), "cp437"},
+#line 40 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str32), "cp852"},
+#line 38 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str33), "cp775"},
+#line 46 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str34), "cp865"},
+#line 67 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str35), "eucJP"},
+#line 30 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str36), "iso88592"},
+#line 71 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str37), "sjis"},
+#line 58 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str38), "cp1258"},
+#line 72 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str39), "utf8"},
+#line 64 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str40), "kana8"},
+#line 59 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str41), "roman8"},
+#line 62 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str42), "hebrew8"},
+#line 66 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str43), "hp15CN"},
+#line 34 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str44), "iso88598"},
+#line 63 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str45), "turkish8"},
+#line 61 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str46), "greek8"},
+#line 60 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str47), "arabic8"},
+#line 44 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str48), "cp862"},
+#line 53 "/Users/akim/src/gnu/bison/lib/iconv_open-hpux.gperf"
+    {offsetof(struct stringpool_t, stringpool_str49), "cp1253"}
+  };
+
+const struct mapping *
+mapping_lookup (register const char *str, register unsigned int len)
+{
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      unsigned int key = mapping_hash (str, len);
+
+      if (key <= MAX_HASH_VALUE)
+        {
+          register int o = mappings[key].standard_name;
+          if (o >= 0)
+            {
+              register const char *s = o + stringpool;
+
+              if (*str == *s && !strcmp (str + 1, s + 1))
+                return &mappings[key];
+            }
+        }
+    }
+  return 0;
+}
diff --git a/lib/iconv_open-irix.gperf b/lib/iconv_open-irix.gperf
new file mode 100644
index 0000000..9885d92
--- /dev/null
+++ b/lib/iconv_open-irix.gperf
@@ -0,0 +1,47 @@
+/* Character set conversion.
+   Copyright (C) 2007, 2020-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+%struct-type
+%language=ANSI-C
+%define slot-name standard_name
+%define hash-function-name mapping_hash
+%define lookup-function-name mapping_lookup
+%readonly-tables
+%global-table
+%define word-array-name mappings
+%pic
+%%
+# On IRIX 6.5, look in /usr/lib/iconv and /usr/lib/international/encodings.
+ISO-8859-1, "ISO8859-1"
+ISO-8859-2, "ISO8859-2"
+ISO-8859-3, "ISO8859-3"
+ISO-8859-4, "ISO8859-4"
+ISO-8859-5, "ISO8859-5"
+ISO-8859-6, "ISO8859-6"
+ISO-8859-7, "ISO8859-7"
+ISO-8859-8, "ISO8859-8"
+ISO-8859-9, "ISO8859-9"
+ISO-8859-15, "ISO8859-15"
+KOI8-R, "KOI8"
+CP855, "DOS855"
+CP1251, "WIN1251"
+GB2312, "eucCN"
+EUC-JP, "eucJP"
+EUC-KR, "eucKR"
+EUC-TW, "eucTW"
+SHIFT_JIS, "sjis"
+TIS-620, "TIS620"
diff --git a/lib/iconv_open-irix.h b/lib/iconv_open-irix.h
new file mode 100644
index 0000000..3b5e1d5
--- /dev/null
+++ b/lib/iconv_open-irix.h
@@ -0,0 +1,193 @@
+/* ANSI-C code produced by gperf version 3.0.3 */
+/* Command-line: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/gperf -m 10 /Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf  */
+/* Computed positions: -k'1,$' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+#line 17 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+
+#define TOTAL_KEYWORDS 19
+#define MIN_WORD_LENGTH 5
+#define MAX_WORD_LENGTH 11
+#define MIN_HASH_VALUE 5
+#define MAX_HASH_VALUE 23
+/* maximum key range = 19, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+mapping_hash (register const char *str, register unsigned int len)
+{
+  static const unsigned char asso_values[] =
+    {
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24,  8,  2,
+       5, 12, 11,  0, 10,  9,  8,  7, 24, 24,
+      24, 24, 24, 24, 24, 24, 24,  0, 24,  0,
+      24,  5, 24,  0, 24,  7, 24, 24, 24, 24,
+       7, 24,  1,  0,  8, 24, 24,  0, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+      24, 24, 24, 24, 24, 24
+    };
+  return len + asso_values[(unsigned char)str[len - 1]] + asso_values[(unsigned char)str[0]];
+}
+
+struct stringpool_t
+  {
+    char stringpool_str5[sizeof("CP855")];
+    char stringpool_str6[sizeof("EUC-TW")];
+    char stringpool_str7[sizeof("EUC-KR")];
+    char stringpool_str8[sizeof("CP1251")];
+    char stringpool_str9[sizeof("SHIFT_JIS")];
+    char stringpool_str10[sizeof("ISO-8859-5")];
+    char stringpool_str11[sizeof("ISO-8859-15")];
+    char stringpool_str12[sizeof("ISO-8859-1")];
+    char stringpool_str13[sizeof("EUC-JP")];
+    char stringpool_str14[sizeof("KOI8-R")];
+    char stringpool_str15[sizeof("ISO-8859-2")];
+    char stringpool_str16[sizeof("GB2312")];
+    char stringpool_str17[sizeof("ISO-8859-9")];
+    char stringpool_str18[sizeof("ISO-8859-8")];
+    char stringpool_str19[sizeof("ISO-8859-7")];
+    char stringpool_str20[sizeof("ISO-8859-6")];
+    char stringpool_str21[sizeof("ISO-8859-4")];
+    char stringpool_str22[sizeof("ISO-8859-3")];
+    char stringpool_str23[sizeof("TIS-620")];
+  };
+static const struct stringpool_t stringpool_contents =
+  {
+    "CP855",
+    "EUC-TW",
+    "EUC-KR",
+    "CP1251",
+    "SHIFT_JIS",
+    "ISO-8859-5",
+    "ISO-8859-15",
+    "ISO-8859-1",
+    "EUC-JP",
+    "KOI8-R",
+    "ISO-8859-2",
+    "GB2312",
+    "ISO-8859-9",
+    "ISO-8859-8",
+    "ISO-8859-7",
+    "ISO-8859-6",
+    "ISO-8859-4",
+    "ISO-8859-3",
+    "TIS-620"
+  };
+#define stringpool ((const char *) &stringpool_contents)
+
+static const struct mapping mappings[] =
+  {
+    {-1}, {-1}, {-1}, {-1}, {-1},
+#line 40 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str5), "DOS855"},
+#line 45 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str6), "eucTW"},
+#line 44 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str7), "eucKR"},
+#line 41 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str8), "WIN1251"},
+#line 46 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str9), "sjis"},
+#line 33 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str10), "ISO8859-5"},
+#line 38 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str11), "ISO8859-15"},
+#line 29 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str12), "ISO8859-1"},
+#line 43 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str13), "eucJP"},
+#line 39 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str14), "KOI8"},
+#line 30 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str15), "ISO8859-2"},
+#line 42 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str16), "eucCN"},
+#line 37 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str17), "ISO8859-9"},
+#line 36 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str18), "ISO8859-8"},
+#line 35 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str19), "ISO8859-7"},
+#line 34 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str20), "ISO8859-6"},
+#line 32 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str21), "ISO8859-4"},
+#line 31 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str22), "ISO8859-3"},
+#line 47 "/Users/akim/src/gnu/bison/lib/iconv_open-irix.gperf"
+    {offsetof(struct stringpool_t, stringpool_str23), "TIS620"}
+  };
+
+const struct mapping *
+mapping_lookup (register const char *str, register unsigned int len)
+{
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      unsigned int key = mapping_hash (str, len);
+
+      if (key <= MAX_HASH_VALUE)
+        {
+          register int o = mappings[key].standard_name;
+          if (o >= 0)
+            {
+              register const char *s = o + stringpool;
+
+              if (*str == *s && !strcmp (str + 1, s + 1))
+                return &mappings[key];
+            }
+        }
+    }
+  return 0;
+}
diff --git a/lib/iconv_open-osf.gperf b/lib/iconv_open-osf.gperf
new file mode 100644
index 0000000..d818d79
--- /dev/null
+++ b/lib/iconv_open-osf.gperf
@@ -0,0 +1,66 @@
+/* Character set conversion.
+   Copyright (C) 2007, 2020-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+%struct-type
+%language=ANSI-C
+%define slot-name standard_name
+%define hash-function-name mapping_hash
+%define lookup-function-name mapping_lookup
+%readonly-tables
+%global-table
+%define word-array-name mappings
+%pic
+%%
+# On OSF/1 5.1, look in /usr/lib/nls/loc/iconv.
+ISO-8859-1, "ISO8859-1"
+ISO-8859-2, "ISO8859-2"
+ISO-8859-3, "ISO8859-3"
+ISO-8859-4, "ISO8859-4"
+ISO-8859-5, "ISO8859-5"
+ISO-8859-6, "ISO8859-6"
+ISO-8859-7, "ISO8859-7"
+ISO-8859-8, "ISO8859-8"
+ISO-8859-9, "ISO8859-9"
+ISO-8859-15, "ISO8859-15"
+CP437, "cp437"
+CP775, "cp775"
+CP850, "cp850"
+CP852, "cp852"
+CP855, "cp855"
+CP857, "cp857"
+CP861, "cp861"
+CP862, "cp862"
+CP865, "cp865"
+CP866, "cp866"
+CP869, "cp869"
+CP874, "cp874"
+CP949, "KSC5601"
+CP1250, "cp1250"
+CP1251, "cp1251"
+CP1252, "cp1252"
+CP1253, "cp1253"
+CP1254, "cp1254"
+CP1255, "cp1255"
+CP1256, "cp1256"
+CP1257, "cp1257"
+CP1258, "cp1258"
+EUC-JP, "eucJP"
+EUC-KR, "eucKR"
+EUC-TW, "eucTW"
+BIG5, "big5"
+SHIFT_JIS, "SJIS"
+TIS-620, "TACTIS"
diff --git a/lib/iconv_open-osf.h b/lib/iconv_open-osf.h
new file mode 100644
index 0000000..61b275b
--- /dev/null
+++ b/lib/iconv_open-osf.h
@@ -0,0 +1,272 @@
+/* ANSI-C code produced by gperf version 3.0.3 */
+/* Command-line: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/gperf -m 10 /Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf  */
+/* Computed positions: -k'4,$' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+#line 17 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+
+#define TOTAL_KEYWORDS 38
+#define MIN_WORD_LENGTH 4
+#define MAX_WORD_LENGTH 11
+#define MIN_HASH_VALUE 6
+#define MAX_HASH_VALUE 47
+/* maximum key range = 42, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+mapping_hash (register const char *str, register unsigned int len)
+{
+  static const unsigned char asso_values[] =
+    {
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48,  2, 29,
+      24, 34, 31,  0, 15, 14, 10, 13,  2, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48,  7, 48, 48, 48, 48, 48, 48,
+      11, 48,  2,  7, 48, 48, 48,  1, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+      48, 48, 48, 48, 48, 48, 48, 48, 48
+    };
+  return len + asso_values[(unsigned char)str[3]+3] + asso_values[(unsigned char)str[len - 1]];
+}
+
+struct stringpool_t
+  {
+    char stringpool_str6[sizeof("CP1255")];
+    char stringpool_str7[sizeof("CP775")];
+    char stringpool_str8[sizeof("CP1250")];
+    char stringpool_str9[sizeof("EUC-TW")];
+    char stringpool_str10[sizeof("EUC-KR")];
+    char stringpool_str11[sizeof("TIS-620")];
+    char stringpool_str12[sizeof("ISO-8859-5")];
+    char stringpool_str13[sizeof("ISO-8859-15")];
+    char stringpool_str14[sizeof("BIG5")];
+    char stringpool_str15[sizeof("CP855")];
+    char stringpool_str16[sizeof("CP1258")];
+    char stringpool_str17[sizeof("CP850")];
+    char stringpool_str18[sizeof("CP865")];
+    char stringpool_str19[sizeof("EUC-JP")];
+    char stringpool_str20[sizeof("CP1257")];
+    char stringpool_str21[sizeof("CP1256")];
+    char stringpool_str22[sizeof("ISO-8859-8")];
+    char stringpool_str23[sizeof("SHIFT_JIS")];
+    char stringpool_str25[sizeof("ISO-8859-9")];
+    char stringpool_str26[sizeof("ISO-8859-7")];
+    char stringpool_str27[sizeof("ISO-8859-6")];
+    char stringpool_str29[sizeof("CP857")];
+    char stringpool_str30[sizeof("CP1252")];
+    char stringpool_str31[sizeof("CP869")];
+    char stringpool_str32[sizeof("CP949")];
+    char stringpool_str33[sizeof("CP866")];
+    char stringpool_str34[sizeof("CP437")];
+    char stringpool_str35[sizeof("CP1251")];
+    char stringpool_str36[sizeof("ISO-8859-2")];
+    char stringpool_str37[sizeof("CP1254")];
+    char stringpool_str38[sizeof("CP874")];
+    char stringpool_str39[sizeof("CP852")];
+    char stringpool_str40[sizeof("CP1253")];
+    char stringpool_str41[sizeof("ISO-8859-1")];
+    char stringpool_str42[sizeof("CP862")];
+    char stringpool_str43[sizeof("ISO-8859-4")];
+    char stringpool_str46[sizeof("ISO-8859-3")];
+    char stringpool_str47[sizeof("CP861")];
+  };
+static const struct stringpool_t stringpool_contents =
+  {
+    "CP1255",
+    "CP775",
+    "CP1250",
+    "EUC-TW",
+    "EUC-KR",
+    "TIS-620",
+    "ISO-8859-5",
+    "ISO-8859-15",
+    "BIG5",
+    "CP855",
+    "CP1258",
+    "CP850",
+    "CP865",
+    "EUC-JP",
+    "CP1257",
+    "CP1256",
+    "ISO-8859-8",
+    "SHIFT_JIS",
+    "ISO-8859-9",
+    "ISO-8859-7",
+    "ISO-8859-6",
+    "CP857",
+    "CP1252",
+    "CP869",
+    "CP949",
+    "CP866",
+    "CP437",
+    "CP1251",
+    "ISO-8859-2",
+    "CP1254",
+    "CP874",
+    "CP852",
+    "CP1253",
+    "ISO-8859-1",
+    "CP862",
+    "ISO-8859-4",
+    "ISO-8859-3",
+    "CP861"
+  };
+#define stringpool ((const char *) &stringpool_contents)
+
+static const struct mapping mappings[] =
+  {
+    {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+#line 57 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str6), "cp1255"},
+#line 40 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str7), "cp775"},
+#line 52 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str8), "cp1250"},
+#line 63 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str9), "eucTW"},
+#line 62 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str10), "eucKR"},
+#line 66 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str11), "TACTIS"},
+#line 33 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str12), "ISO8859-5"},
+#line 38 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str13), "ISO8859-15"},
+#line 64 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str14), "big5"},
+#line 43 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str15), "cp855"},
+#line 60 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str16), "cp1258"},
+#line 41 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str17), "cp850"},
+#line 47 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str18), "cp865"},
+#line 61 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str19), "eucJP"},
+#line 59 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str20), "cp1257"},
+#line 58 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str21), "cp1256"},
+#line 36 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str22), "ISO8859-8"},
+#line 65 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str23), "SJIS"},
+    {-1},
+#line 37 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str25), "ISO8859-9"},
+#line 35 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str26), "ISO8859-7"},
+#line 34 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str27), "ISO8859-6"},
+    {-1},
+#line 44 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str29), "cp857"},
+#line 54 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str30), "cp1252"},
+#line 49 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str31), "cp869"},
+#line 51 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str32), "KSC5601"},
+#line 48 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str33), "cp866"},
+#line 39 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str34), "cp437"},
+#line 53 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str35), "cp1251"},
+#line 30 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str36), "ISO8859-2"},
+#line 56 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str37), "cp1254"},
+#line 50 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str38), "cp874"},
+#line 42 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str39), "cp852"},
+#line 55 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str40), "cp1253"},
+#line 29 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str41), "ISO8859-1"},
+#line 46 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str42), "cp862"},
+#line 32 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str43), "ISO8859-4"},
+    {-1}, {-1},
+#line 31 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str46), "ISO8859-3"},
+#line 45 "/Users/akim/src/gnu/bison/lib/iconv_open-osf.gperf"
+    {offsetof(struct stringpool_t, stringpool_str47), "cp861"}
+  };
+
+const struct mapping *
+mapping_lookup (register const char *str, register unsigned int len)
+{
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      unsigned int key = mapping_hash (str, len);
+
+      if (key <= MAX_HASH_VALUE)
+        {
+          register int o = mappings[key].standard_name;
+          if (o >= 0)
+            {
+              register const char *s = o + stringpool;
+
+              if (*str == *s && !strcmp (str + 1, s + 1))
+                return &mappings[key];
+            }
+        }
+    }
+  return 0;
+}
diff --git a/lib/iconv_open-solaris.gperf b/lib/iconv_open-solaris.gperf
new file mode 100644
index 0000000..648dd3a
--- /dev/null
+++ b/lib/iconv_open-solaris.gperf
@@ -0,0 +1,46 @@
+/* Character set conversion.
+   Copyright (C) 2007, 2009, 2020-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+%struct-type
+%language=ANSI-C
+%define slot-name standard_name
+%define hash-function-name mapping_hash
+%define lookup-function-name mapping_lookup
+%readonly-tables
+%global-table
+%define word-array-name mappings
+%pic
+%%
+# On Solaris 10, look in the "iconv -l" output. Some aliases are advertised but
+# not actually supported by the iconv() function and by the 'iconv' program.
+# For example:
+#   $ echo abc | iconv -f 646 -t ISO-8859-1
+#   Not supported 646 to ISO-8859-1
+#   $ echo abc | iconv -f 646 -t ISO8859-1
+$   abc
+ASCII, "646"
+ISO-8859-1, "ISO8859-1"
+ISO-8859-2, "ISO8859-2"
+ISO-8859-3, "ISO8859-3"
+ISO-8859-4, "ISO8859-4"
+ISO-8859-5, "ISO8859-5"
+ISO-8859-6, "ISO8859-6"
+ISO-8859-7, "ISO8859-7"
+ISO-8859-8, "ISO8859-8"
+ISO-8859-9, "ISO8859-9"
+ISO-8859-15, "ISO8859-15"
+CP1251, "ansi-1251"
diff --git a/lib/iconv_open-solaris.h b/lib/iconv_open-solaris.h
new file mode 100644
index 0000000..7a76384
--- /dev/null
+++ b/lib/iconv_open-solaris.h
@@ -0,0 +1,184 @@
+/* ANSI-C code produced by gperf version 3.0.3 */
+/* Command-line: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/gperf -m 10 /Users/akim/src/gnu/bison/lib/iconv_open-solaris.gperf  */
+/* Computed positions: -k'10' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+#line 17 "/Users/akim/src/gnu/bison/lib/iconv_open-solaris.gperf"
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+
+#define TOTAL_KEYWORDS 13
+#define MIN_WORD_LENGTH 5
+#define MAX_WORD_LENGTH 11
+#define MIN_HASH_VALUE 5
+#define MAX_HASH_VALUE 19
+/* maximum key range = 15, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+mapping_hash (register const char *str, register unsigned int len)
+{
+  static const unsigned char asso_values[] =
+    {
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20,  0,
+       9,  8,  7,  6,  5,  4,  3,  2, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+      20, 20, 20, 20, 20, 20
+    };
+  register unsigned int hval = len;
+
+  switch (hval)
+    {
+      default:
+        hval += asso_values[(unsigned char)str[9]];
+      /*FALLTHROUGH*/
+      case 9:
+      case 8:
+      case 7:
+      case 6:
+      case 5:
+        break;
+    }
+  return hval;
+}
+
+struct stringpool_t
+  {
+    char stringpool_str5[sizeof("ASCII")];
+    char stringpool_str6[sizeof("CP1251")];
+    char stringpool_str7[sizeof("$   abc")];
+    char stringpool_str10[sizeof("ISO-8859-1")];
+    char stringpool_str11[sizeof("ISO-8859-15")];
+    char stringpool_str12[sizeof("ISO-8859-9")];
+    char stringpool_str13[sizeof("ISO-8859-8")];
+    char stringpool_str14[sizeof("ISO-8859-7")];
+    char stringpool_str15[sizeof("ISO-8859-6")];
+    char stringpool_str16[sizeof("ISO-8859-5")];
+    char stringpool_str17[sizeof("ISO-8859-4")];
+    char stringpool_str18[sizeof("ISO-8859-3")];
+    char stringpool_str19[sizeof("ISO-8859-2")];
+  };
+static const struct stringpool_t stringpool_contents =
+  {
+    "ASCII",
+    "CP1251",
+    "$   abc",
+    "ISO-8859-1",
+    "ISO-8859-15",
+    "ISO-8859-9",
+    "ISO-8859-8",
+    "ISO-8859-7",
+    "ISO-8859-6",
+    "ISO-8859-5",
+    "ISO-8859-4",
+    "ISO-8859-3",
+    "ISO-8859-2"
+  };
+#define stringpool ((const char *) &stringpool_contents)
+
+static const struct mapping mappings[] =
+  {
+    {-1}, {-1}, {-1}, {-1}, {-1},
+#line 35 "/Users/akim/src/gnu/bison/lib/iconv_open-solaris.gperf"
+    {offsetof(struct stringpool_t, stringpool_str5), "646"},
+#line 46 "/Users/akim/src/gnu/bison/lib/iconv_open-solaris.gperf"
+    {offsetof(struct stringpool_t, stringpool_str6), "ansi-1251"},
+#line 34 "/Users/akim/src/gnu/bison/lib/iconv_open-solaris.gperf"
+    {offsetof(struct stringpool_t, stringpool_str7)},
+    {-1}, {-1},
+#line 36 "/Users/akim/src/gnu/bison/lib/iconv_open-solaris.gperf"
+    {offsetof(struct stringpool_t, stringpool_str10), "ISO8859-1"},
+#line 45 "/Users/akim/src/gnu/bison/lib/iconv_open-solaris.gperf"
+    {offsetof(struct stringpool_t, stringpool_str11), "ISO8859-15"},
+#line 44 "/Users/akim/src/gnu/bison/lib/iconv_open-solaris.gperf"
+    {offsetof(struct stringpool_t, stringpool_str12), "ISO8859-9"},
+#line 43 "/Users/akim/src/gnu/bison/lib/iconv_open-solaris.gperf"
+    {offsetof(struct stringpool_t, stringpool_str13), "ISO8859-8"},
+#line 42 "/Users/akim/src/gnu/bison/lib/iconv_open-solaris.gperf"
+    {offsetof(struct stringpool_t, stringpool_str14), "ISO8859-7"},
+#line 41 "/Users/akim/src/gnu/bison/lib/iconv_open-solaris.gperf"
+    {offsetof(struct stringpool_t, stringpool_str15), "ISO8859-6"},
+#line 40 "/Users/akim/src/gnu/bison/lib/iconv_open-solaris.gperf"
+    {offsetof(struct stringpool_t, stringpool_str16), "ISO8859-5"},
+#line 39 "/Users/akim/src/gnu/bison/lib/iconv_open-solaris.gperf"
+    {offsetof(struct stringpool_t, stringpool_str17), "ISO8859-4"},
+#line 38 "/Users/akim/src/gnu/bison/lib/iconv_open-solaris.gperf"
+    {offsetof(struct stringpool_t, stringpool_str18), "ISO8859-3"},
+#line 37 "/Users/akim/src/gnu/bison/lib/iconv_open-solaris.gperf"
+    {offsetof(struct stringpool_t, stringpool_str19), "ISO8859-2"}
+  };
+
+const struct mapping *
+mapping_lookup (register const char *str, register unsigned int len)
+{
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      unsigned int key = mapping_hash (str, len);
+
+      if (key <= MAX_HASH_VALUE)
+        {
+          register int o = mappings[key].standard_name;
+          if (o >= 0)
+            {
+              register const char *s = o + stringpool;
+
+              if (*str == *s && !strcmp (str + 1, s + 1))
+                return &mappings[key];
+            }
+        }
+    }
+  return 0;
+}
diff --git a/lib/iconv_open-zos.gperf b/lib/iconv_open-zos.gperf
new file mode 100644
index 0000000..1c3552e
--- /dev/null
+++ b/lib/iconv_open-zos.gperf
@@ -0,0 +1,76 @@
+/* Character set conversion.
+   Copyright (C) 2019-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+%struct-type
+%language=ANSI-C
+%define slot-name standard_name
+%define hash-function-name mapping_hash
+%define lookup-function-name mapping_lookup
+%readonly-tables
+%global-table
+%define word-array-name mappings
+%pic
+%%
+ASCII, "00367"
+ISO-8859-1, "ISO8859-1"
+ISO-8859-2, "ISO8859-2"
+ISO-8859-3, "00913"
+ISO-8859-4, "ISO8859-4"
+ISO-8859-5, "ISO8859-5"
+ISO-8859-6, "ISO8859-6"
+ISO-8859-7, "ISO8859-7"
+ISO-8859-8, "05012"
+ISO-8859-9, "ISO8859-9"
+ISO-8859-13, "ISO8859-13"
+ISO-8859-15, "ISO8859-15"
+KOI8-R, "00878"
+KOI8-U, "01168"
+CP437, "IBM-437"
+CP775, "00775"
+CP850, "09042"
+CP852, "IBM-852"
+CP855, "13143"
+CP856, "IBM-856"
+CP857, "00857"
+CP861, "IBM-861"
+CP862, "IBM-862"
+CP864, "IBM-864"
+CP865, "00865"
+CP866, "04962"
+CP869, "IBM-869"
+CP874, "TIS-620"
+CP922, "IBM-922"
+CP932, "IBM-943"
+CP943, "IBM-943"
+CP949, "IBM-1363"
+CP1046, "IBM-1046"
+CP1124, "IBM-1124"
+CP1125, "IBM-1125"
+CP1129, "01129"
+CP1131, "01131"
+CP1250, "IBM-5346"
+CP1251, "IBM-5347"
+CP1252, "IBM-5348"
+CP1253, "IBM-5349"
+CP1254, "IBM-5350"
+CP1255, "09447"
+CP1256, "09448"
+CP1257, "09449"
+GB2312, "IBM-eucCN"
+EUC-JP, "01350"
+EUC-KR, "IBM-eucKR"
+GBK, "IBM-1386"
diff --git a/lib/iconv_open-zos.h b/lib/iconv_open-zos.h
new file mode 100644
index 0000000..b819ae0
--- /dev/null
+++ b/lib/iconv_open-zos.h
@@ -0,0 +1,329 @@
+/* ANSI-C code produced by gperf version 3.0.3 */
+/* Command-line: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/gperf -m 10 /Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf  */
+/* Computed positions: -k'4,$' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+#line 17 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+
+#define TOTAL_KEYWORDS 49
+#define MIN_WORD_LENGTH 3
+#define MAX_WORD_LENGTH 11
+#define MIN_HASH_VALUE 3
+#define MAX_HASH_VALUE 64
+/* maximum key range = 62, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+mapping_hash (register const char *str, register unsigned int len)
+{
+  static const unsigned char asso_values[] =
+    {
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 16, 38,
+      14,  1, 32, 22, 29,  3,  0,  7, 40,  2,
+       5, 18, 23, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65,  0, 65,  0, 65, 65, 65,  0,
+      43, 65,  1, 65, 65,  8, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+      65, 65
+    };
+  register unsigned int hval = len;
+
+  switch (hval)
+    {
+      default:
+        hval += asso_values[(unsigned char)str[3]+6];
+      /*FALLTHROUGH*/
+      case 3:
+        break;
+    }
+  return hval + asso_values[(unsigned char)str[len - 1]];
+}
+
+struct stringpool_t
+  {
+    char stringpool_str3[sizeof("GBK")];
+    char stringpool_str5[sizeof("ASCII")];
+    char stringpool_str7[sizeof("CP1253")];
+    char stringpool_str8[sizeof("EUC-KR")];
+    char stringpool_str9[sizeof("CP1257")];
+    char stringpool_str10[sizeof("CP857")];
+    char stringpool_str11[sizeof("ISO-8859-8")];
+    char stringpool_str12[sizeof("ISO-8859-3")];
+    char stringpool_str13[sizeof("ISO-8859-13")];
+    char stringpool_str14[sizeof("ISO-8859-7")];
+    char stringpool_str15[sizeof("CP437")];
+    char stringpool_str16[sizeof("CP1129")];
+    char stringpool_str17[sizeof("CP869")];
+    char stringpool_str18[sizeof("ISO-8859-9")];
+    char stringpool_str19[sizeof("CP922")];
+    char stringpool_str20[sizeof("CP1252")];
+    char stringpool_str21[sizeof("CP852")];
+    char stringpool_str22[sizeof("CP1250")];
+    char stringpool_str23[sizeof("CP850")];
+    char stringpool_str24[sizeof("CP862")];
+    char stringpool_str25[sizeof("ISO-8859-2")];
+    char stringpool_str26[sizeof("CP932")];
+    char stringpool_str27[sizeof("GB2312")];
+    char stringpool_str28[sizeof("CP1255")];
+    char stringpool_str29[sizeof("CP855")];
+    char stringpool_str30[sizeof("KOI8-R")];
+    char stringpool_str31[sizeof("CP1125")];
+    char stringpool_str32[sizeof("CP865")];
+    char stringpool_str33[sizeof("ISO-8859-5")];
+    char stringpool_str34[sizeof("ISO-8859-15")];
+    char stringpool_str35[sizeof("CP1256")];
+    char stringpool_str36[sizeof("CP856")];
+    char stringpool_str37[sizeof("KOI8-U")];
+    char stringpool_str38[sizeof("CP1254")];
+    char stringpool_str39[sizeof("CP866")];
+    char stringpool_str40[sizeof("ISO-8859-6")];
+    char stringpool_str41[sizeof("CP1124")];
+    char stringpool_str42[sizeof("CP864")];
+    char stringpool_str43[sizeof("ISO-8859-4")];
+    char stringpool_str44[sizeof("CP1251")];
+    char stringpool_str45[sizeof("CP775")];
+    char stringpool_str46[sizeof("CP943")];
+    char stringpool_str47[sizeof("CP1131")];
+    char stringpool_str48[sizeof("CP861")];
+    char stringpool_str49[sizeof("ISO-8859-1")];
+    char stringpool_str50[sizeof("EUC-JP")];
+    char stringpool_str52[sizeof("CP949")];
+    char stringpool_str55[sizeof("CP874")];
+    char stringpool_str64[sizeof("CP1046")];
+  };
+static const struct stringpool_t stringpool_contents =
+  {
+    "GBK",
+    "ASCII",
+    "CP1253",
+    "EUC-KR",
+    "CP1257",
+    "CP857",
+    "ISO-8859-8",
+    "ISO-8859-3",
+    "ISO-8859-13",
+    "ISO-8859-7",
+    "CP437",
+    "CP1129",
+    "CP869",
+    "ISO-8859-9",
+    "CP922",
+    "CP1252",
+    "CP852",
+    "CP1250",
+    "CP850",
+    "CP862",
+    "ISO-8859-2",
+    "CP932",
+    "GB2312",
+    "CP1255",
+    "CP855",
+    "KOI8-R",
+    "CP1125",
+    "CP865",
+    "ISO-8859-5",
+    "ISO-8859-15",
+    "CP1256",
+    "CP856",
+    "KOI8-U",
+    "CP1254",
+    "CP866",
+    "ISO-8859-6",
+    "CP1124",
+    "CP864",
+    "ISO-8859-4",
+    "CP1251",
+    "CP775",
+    "CP943",
+    "CP1131",
+    "CP861",
+    "ISO-8859-1",
+    "EUC-JP",
+    "CP949",
+    "CP874",
+    "CP1046"
+  };
+#define stringpool ((const char *) &stringpool_contents)
+
+static const struct mapping mappings[] =
+  {
+    {-1}, {-1}, {-1},
+#line 76 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str3), "IBM-1386"},
+    {-1},
+#line 28 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str5), "00367"},
+    {-1},
+#line 68 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str7), "IBM-5349"},
+#line 75 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str8), "IBM-eucKR"},
+#line 72 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str9), "09449"},
+#line 48 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str10), "00857"},
+#line 36 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str11), "05012"},
+#line 31 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str12), "00913"},
+#line 38 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str13), "ISO8859-13"},
+#line 35 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str14), "ISO8859-7"},
+#line 42 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str15), "IBM-437"},
+#line 63 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str16), "01129"},
+#line 54 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str17), "IBM-869"},
+#line 37 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str18), "ISO8859-9"},
+#line 56 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str19), "IBM-922"},
+#line 67 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str20), "IBM-5348"},
+#line 45 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str21), "IBM-852"},
+#line 65 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str22), "IBM-5346"},
+#line 44 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str23), "09042"},
+#line 50 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str24), "IBM-862"},
+#line 30 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str25), "ISO8859-2"},
+#line 57 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str26), "IBM-943"},
+#line 73 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str27), "IBM-eucCN"},
+#line 70 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str28), "09447"},
+#line 46 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str29), "13143"},
+#line 40 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str30), "00878"},
+#line 62 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str31), "IBM-1125"},
+#line 52 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str32), "00865"},
+#line 33 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str33), "ISO8859-5"},
+#line 39 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str34), "ISO8859-15"},
+#line 71 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str35), "09448"},
+#line 47 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str36), "IBM-856"},
+#line 41 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str37), "01168"},
+#line 69 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str38), "IBM-5350"},
+#line 53 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str39), "04962"},
+#line 34 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str40), "ISO8859-6"},
+#line 61 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str41), "IBM-1124"},
+#line 51 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str42), "IBM-864"},
+#line 32 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str43), "ISO8859-4"},
+#line 66 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str44), "IBM-5347"},
+#line 43 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str45), "00775"},
+#line 58 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str46), "IBM-943"},
+#line 64 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str47), "01131"},
+#line 49 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str48), "IBM-861"},
+#line 29 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str49), "ISO8859-1"},
+#line 74 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str50), "01350"},
+    {-1},
+#line 59 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str52), "IBM-1363"},
+    {-1}, {-1},
+#line 55 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str55), "TIS-620"},
+    {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+#line 60 "/Users/akim/src/gnu/bison/lib/iconv_open-zos.gperf"
+    {offsetof(struct stringpool_t, stringpool_str64), "IBM-1046"}
+  };
+
+const struct mapping *
+mapping_lookup (register const char *str, register unsigned int len)
+{
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      unsigned int key = mapping_hash (str, len);
+
+      if (key <= MAX_HASH_VALUE)
+        {
+          register int o = mappings[key].standard_name;
+          if (o >= 0)
+            {
+              register const char *s = o + stringpool;
+
+              if (*str == *s && !strcmp (str + 1, s + 1))
+                return &mappings[key];
+            }
+        }
+    }
+  return 0;
+}
diff --git a/lib/iconv_open.c b/lib/iconv_open.c
new file mode 100644
index 0000000..e573556
--- /dev/null
+++ b/lib/iconv_open.c
@@ -0,0 +1,173 @@
+/* Character set conversion.
+   Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <iconv.h>
+
+#include <errno.h>
+#include <string.h>
+#include "c-ctype.h"
+#include "c-strcase.h"
+
+#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
+
+/* Namespace cleanliness.  */
+#define mapping_lookup rpl_iconv_open_mapping_lookup
+
+/* The macro ICONV_FLAVOR is defined to one of these or undefined.  */
+
+#define ICONV_FLAVOR_AIX "iconv_open-aix.h"
+#define ICONV_FLAVOR_HPUX "iconv_open-hpux.h"
+#define ICONV_FLAVOR_IRIX "iconv_open-irix.h"
+#define ICONV_FLAVOR_OSF "iconv_open-osf.h"
+#define ICONV_FLAVOR_SOLARIS "iconv_open-solaris.h"
+#define ICONV_FLAVOR_ZOS "iconv_open-zos.h"
+
+#ifdef ICONV_FLAVOR
+# include ICONV_FLAVOR
+#endif
+
+iconv_t
+rpl_iconv_open (const char *tocode, const char *fromcode)
+#undef iconv_open
+{
+  char fromcode_upper[32];
+  char tocode_upper[32];
+  char *fromcode_upper_end;
+  char *tocode_upper_end;
+
+#if REPLACE_ICONV_UTF
+  /* Special handling of conversion between UTF-8 and UTF-{16,32}{BE,LE}.
+     Do this here, before calling the real iconv_open(), because  OSF/1 5.1
+     iconv() to these encoding inserts a BOM, which is wrong.
+     We do not need to handle conversion between arbitrary encodings and
+     UTF-{16,32}{BE,LE}, because the 'striconveh' module implements two-step
+     conversion through UTF-8.
+     The _ICONV_* constants are chosen to be disjoint from any iconv_t
+     returned by the system's iconv_open() functions.  Recall that iconv_t
+     is a scalar type.  */
+  if (c_toupper (fromcode[0]) == 'U'
+      && c_toupper (fromcode[1]) == 'T'
+      && c_toupper (fromcode[2]) == 'F'
+      && fromcode[3] == '-')
+    {
+      if (c_toupper (tocode[0]) == 'U'
+          && c_toupper (tocode[1]) == 'T'
+          && c_toupper (tocode[2]) == 'F'
+          && tocode[3] == '-')
+        {
+          if (strcmp (fromcode + 4, "8") == 0)
+            {
+              if (c_strcasecmp (tocode + 4, "16BE") == 0)
+                return _ICONV_UTF8_UTF16BE;
+              if (c_strcasecmp (tocode + 4, "16LE") == 0)
+                return _ICONV_UTF8_UTF16LE;
+              if (c_strcasecmp (tocode + 4, "32BE") == 0)
+                return _ICONV_UTF8_UTF32BE;
+              if (c_strcasecmp (tocode + 4, "32LE") == 0)
+                return _ICONV_UTF8_UTF32LE;
+            }
+          else if (strcmp (tocode + 4, "8") == 0)
+            {
+              if (c_strcasecmp (fromcode + 4, "16BE") == 0)
+                return _ICONV_UTF16BE_UTF8;
+              if (c_strcasecmp (fromcode + 4, "16LE") == 0)
+                return _ICONV_UTF16LE_UTF8;
+              if (c_strcasecmp (fromcode + 4, "32BE") == 0)
+                return _ICONV_UTF32BE_UTF8;
+              if (c_strcasecmp (fromcode + 4, "32LE") == 0)
+                return _ICONV_UTF32LE_UTF8;
+            }
+        }
+    }
+#endif
+
+  /* Do *not* add special support for 8-bit encodings like ASCII or ISO-8859-1
+     here.  This would lead to programs that work in some locales (such as the
+     "C" or "en_US" locales) but do not work in East Asian locales.  It is
+     better if programmers make their programs depend on GNU libiconv (except
+     on glibc systems), e.g. by using the AM_ICONV macro and documenting the
+     dependency in an INSTALL or DEPENDENCIES file.  */
+
+  /* Try with the original names first.
+     This covers the case when fromcode or tocode is a lowercase encoding name
+     that is understood by the system's iconv_open but not listed in our
+     mappings table.  */
+  {
+    iconv_t cd = iconv_open (tocode, fromcode);
+    if (cd != (iconv_t)(-1))
+      return cd;
+  }
+
+  /* Convert the encodings to upper case, because
+       1. in the arguments of iconv_open() on AIX, HP-UX, and OSF/1 the case
+          matters,
+       2. it makes searching in the table faster.  */
+  {
+    const char *p = fromcode;
+    char *q = fromcode_upper;
+    while ((*q = c_toupper (*p)) != '\0')
+      {
+        p++;
+        q++;
+        if (q == &fromcode_upper[SIZEOF (fromcode_upper)])
+          {
+            errno = EINVAL;
+            return (iconv_t)(-1);
+          }
+      }
+    fromcode_upper_end = q;
+  }
+
+  {
+    const char *p = tocode;
+    char *q = tocode_upper;
+    while ((*q = c_toupper (*p)) != '\0')
+      {
+        p++;
+        q++;
+        if (q == &tocode_upper[SIZEOF (tocode_upper)])
+          {
+            errno = EINVAL;
+            return (iconv_t)(-1);
+          }
+      }
+    tocode_upper_end = q;
+  }
+
+#ifdef ICONV_FLAVOR
+  /* Apply the mappings.  */
+  {
+    const struct mapping *m =
+      mapping_lookup (fromcode_upper, fromcode_upper_end - fromcode_upper);
+
+    fromcode = (m != NULL ? m->vendor_name : fromcode_upper);
+  }
+  {
+    const struct mapping *m =
+      mapping_lookup (tocode_upper, tocode_upper_end - tocode_upper);
+
+    tocode = (m != NULL ? m->vendor_name : tocode_upper);
+  }
+#else
+  fromcode = fromcode_upper;
+  tocode = tocode_upper;
+#endif
+
+  return iconv_open (tocode, fromcode);
+}
diff --git a/lib/idx.h b/lib/idx.h
new file mode 100644
index 0000000..54ad5d8
--- /dev/null
+++ b/lib/idx.h
@@ -0,0 +1,134 @@
+/* A type for indices and sizes.
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _IDX_H
+#define _IDX_H
+
+/* Get ptrdiff_t.  */
+#include <stddef.h>
+
+/* Get PTRDIFF_MAX.  */
+#include <stdint.h>
+
+/* The type 'idx_t' holds an (array) index or an (object) size.
+   Its implementation promotes to a signed integer type,
+   which can hold the values
+     0..2^63-1 (on 64-bit platforms) or
+     0..2^31-1 (on 32-bit platforms).
+
+   Why a signed integer type?
+
+     * Security: Signed types can be checked for overflow via
+       '-fsanitize=undefined', but unsigned types cannot.
+
+     * Comparisons without surprises: ISO C99 § 6.3.1.8 specifies a few
+       surprising results for comparisons, such as
+
+           (int) -3 < (unsigned long) 7  =>  false
+           (int) -3 < (unsigned int) 7   =>  false
+       and on 32-bit machines:
+           (long) -3 < (unsigned int) 7  =>  false
+
+       This is surprising because the natural comparison order is by
+       value in the realm of infinite-precision signed integers (ℤ).
+
+       The best way to get rid of such surprises is to use signed types
+       for numerical integer values, and use unsigned types only for
+       bit masks and enums.
+
+   Why not use 'size_t' directly?
+
+     * Because 'size_t' is an unsigned type, and a signed type is better.
+       See above.
+
+   Why not use 'ssize_t'?
+
+     * 'ptrdiff_t' is more portable; it is standardized by ISO C
+       whereas 'ssize_t' is standardized only by POSIX.
+
+     * 'ssize_t' is not required to be as wide as 'size_t', and some
+       now-obsolete POSIX platforms had 'size_t' wider than 'ssize_t'.
+
+     * Conversely, some now-obsolete platforms had 'ptrdiff_t' wider
+       than 'size_t', which can be a win and conforms to POSIX.
+
+   Won't this cause a problem with objects larger than PTRDIFF_MAX?
+
+     * Typical modern or large platforms do not allocate such objects,
+       so this is not much of a problem in practice; for example, you
+       can safely write 'idx_t len = strlen (s);'.  To port to older
+       small platforms where allocations larger than PTRDIFF_MAX could
+       in theory be a problem, you can use Gnulib's ialloc module, or
+       functions like ximalloc in Gnulib's xalloc module.
+
+   Why not use 'ptrdiff_t' directly?
+
+     * Maintainability: When reading and modifying code, it helps to know that
+       a certain variable cannot have negative values.  For example, when you
+       have a loop
+
+         int n = ...;
+         for (int i = 0; i < n; i++) ...
+
+       or
+
+         ptrdiff_t n = ...;
+         for (ptrdiff_t i = 0; i < n; i++) ...
+
+       you have to ask yourself "what if n < 0?".  Whereas in
+
+         idx_t n = ...;
+         for (idx_t i = 0; i < n; i++) ...
+
+       you know that this case cannot happen.
+
+       Similarly, when a programmer writes
+
+         idx_t = ptr2 - ptr1;
+
+       there is an implied assertion that ptr1 and ptr2 point into the same
+       object and that ptr1 <= ptr2.
+
+     * Being future-proof: In the future, range types (integers which are
+       constrained to a certain range of values) may be added to C compilers
+       or to the C standard.  Several programming languages (Ada, Haskell,
+       Common Lisp, Pascal) already have range types.  Such range types may
+       help producing good code and good warnings.  The type 'idx_t' could
+       then be typedef'ed to a range type that is signed after promotion.  */
+
+/* In the future, idx_t could be typedef'ed to a signed range type.
+   The clang "extended integer types", supported in Clang 11 or newer
+   <https://clang.llvm.org/docs/LanguageExtensions.html#extended-integer-types>,
+   are a special case of range types.  However, these types don't support binary
+   operators with plain integer types (e.g. expressions such as x > 1).
+   Therefore, they don't behave like signed types (and not like unsigned types
+   either).  So, we cannot use them here.  */
+
+/* Use the signed type 'ptrdiff_t'.  */
+/* Note: ISO C does not mandate that 'size_t' and 'ptrdiff_t' have the same
+   size, but it is so on all platforms we have seen since 1990.  */
+typedef ptrdiff_t idx_t;
+
+/* IDX_MAX is the maximum value of an idx_t.  */
+#define IDX_MAX PTRDIFF_MAX
+
+/* So far no need has been found for an IDX_WIDTH macro.
+   Perhaps there should be another macro IDX_VALUE_BITS that does not
+   count the sign bit and is therefore one less than PTRDIFF_WIDTH.  */
+
+#endif /* _IDX_H */
diff --git a/lib/integer_length.c b/lib/integer_length.c
new file mode 100644
index 0000000..b033ac5
--- /dev/null
+++ b/lib/integer_length.c
@@ -0,0 +1,153 @@
+/* integer_length - find most significant bit in an 'unsigned int'.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2011.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "integer_length.h"
+
+#include <limits.h>
+
+#include "float+.h"
+
+#if defined _MSC_VER && !(__clang_major__ >= 4)
+# include <intrin.h>
+#endif
+
+#define NBITS (sizeof (unsigned int) * CHAR_BIT)
+
+int
+integer_length (unsigned int x)
+{
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__clang_major__ >= 4)
+  if (x == 0)
+    return 0;
+  else
+    return NBITS - __builtin_clz (x);
+#elif defined _MSC_VER
+  /* _BitScanReverse
+     <https://docs.microsoft.com/en-us/cpp/intrinsics/bitscanreverse-bitscanreverse64> */
+  unsigned long bit;
+  if (_BitScanReverse (&bit, x))
+    return bit + 1;
+  else
+    return 0;
+#else
+# if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
+  if (NBITS <= DBL_MANT_BIT)
+    {
+      /* Use 'double' operations.
+         Assumes an IEEE 754 'double' implementation.  */
+#  define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7)
+#  define DBL_EXP_BIAS (DBL_EXP_MASK / 2 - 1)
+#  define NWORDS \
+    ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+      typedef union { double value; unsigned int word[NWORDS]; }
+              memory_double;
+
+      if (x == 0)
+        return 0;
+      else
+        {
+          memory_double m;
+          unsigned int exponent;
+
+          if (1)
+            {
+              /* Use a single integer to floating-point conversion.  */
+              m.value = x;
+            }
+          else
+            {
+              /* Use a single floating-point subtraction.  */
+              /* 2^(DBL_MANT_DIG-1).  */
+              static const double TWO_DBL_MANT_DIG =
+                /* Assume DBL_MANT_DIG <= 5 * 31.
+                   Use the identity
+                   n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5).  */
+                (double) (1U << ((DBL_MANT_DIG - 1) / 5))
+                * (double) (1U << ((DBL_MANT_DIG - 1 + 1) / 5))
+                * (double) (1U << ((DBL_MANT_DIG - 1 + 2) / 5))
+                * (double) (1U << ((DBL_MANT_DIG - 1 + 3) / 5))
+                * (double) (1U << ((DBL_MANT_DIG - 1 + 4) / 5));
+
+              /* Construct 2^(DBL_MANT_DIG-1) + x by hand.  */
+              m.word[DBL_EXPBIT0_WORD] =
+                (DBL_MANT_DIG + DBL_EXP_BIAS) << DBL_EXPBIT0_BIT;
+              m.word[1 - DBL_EXPBIT0_WORD] = x;
+
+              /* Subtract 2^(DBL_MANT_DIG-1).  */
+              m.value = m.value - TWO_DBL_MANT_DIG;
+            }
+
+          exponent =
+            (m.word[DBL_EXPBIT0_WORD] >> DBL_EXPBIT0_BIT) & DBL_EXP_MASK;
+          return exponent - DBL_EXP_BIAS;
+        }
+    }
+  else
+# endif
+    if (NBITS == 32)
+      {
+        /* 6 comparisons.  */
+        if (x != 0)
+          {
+            int result = 1;
+            if (x >= 0x10000)
+              {
+                x = x >> 16;
+                result += 16;
+              }
+            if (x >= 0x100)
+              {
+                x = x >> 8;
+                result += 8;
+              }
+            if (x >= 0x10)
+              {
+                x = x >> 4;
+                result += 4;
+              }
+            if (x >= 0x4)
+              {
+                x = x >> 2;
+                result += 2;
+              }
+            if (x >= 0x2)
+              {
+                x = x >> 1;
+                result += 1;
+              }
+            return result;
+          }
+        else
+          return 0;
+      }
+    else
+      {
+        /* Naive loop.
+           Works for any value of NBITS.  */
+        int j;
+
+        for (j = NBITS - 1; j >= 0; j--)
+          if (x & (1U << j))
+            return j + 1;
+        return 0;
+      }
+#endif
+}
diff --git a/lib/integer_length.h b/lib/integer_length.h
new file mode 100644
index 0000000..9bff7d5
--- /dev/null
+++ b/lib/integer_length.h
@@ -0,0 +1,47 @@
+/* integer_length - find most significant bit in an unsigned integer.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2011.  */
+
+#ifndef _INTEGER_LENGTH_H
+#define _INTEGER_LENGTH_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* These functions return the minimum number of bits required to represent
+   the given unsigned integer.
+   For non-zero values, this is the position of the most significant bit
+   that is set, plus one.  For zero, it is 0.  */
+
+/* Returns the integer length of x.
+   The result is >= 0, <= sizeof (unsigned int) * CHAR_BIT.  */
+extern int integer_length (unsigned int x);
+
+/* Returns the integer length of x.
+   The result is >= 0, <= sizeof (unsigned long) * CHAR_BIT.  */
+extern int integer_length_l (unsigned long x);
+
+/* Returns the integer length of x.
+   The result is >= 0, <= sizeof (unsigned long long) * CHAR_BIT.  */
+extern int integer_length_ll (unsigned long long x);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _INTEGER_LENGTH_H */
diff --git a/lib/integer_length_l.c b/lib/integer_length_l.c
new file mode 100644
index 0000000..a197524
--- /dev/null
+++ b/lib/integer_length_l.c
@@ -0,0 +1,109 @@
+/* integer_length_l - find most significant bit in an 'unsigned long'.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2011.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "integer_length.h"
+
+#include <limits.h>
+#include <stddef.h>
+
+#undef MIN
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+
+#ifdef USE_LONG_LONG
+# define FUNC integer_length_ll
+# define TYPE unsigned long long
+# define GCC_BUILTIN __builtin_clzll
+# ifdef _WIN64
+#  define MSVC_BUILTIN _BitScanReverse64
+# endif
+#else
+# define FUNC integer_length_l
+# define TYPE unsigned long
+# define GCC_BUILTIN __builtin_clzl
+# define MSVC_BUILTIN _BitScanReverse
+#endif
+
+#if defined _MSC_VER && !(__clang_major__ >= 4)
+# include <intrin.h>
+/* Copied from integer_length.c.  */
+static inline int
+integer_length (unsigned int x)
+{
+  /* _BitScanReverse
+     <https://docs.microsoft.com/en-us/cpp/intrinsics/bitscanreverse-bitscanreverse64> */
+  unsigned long bit;
+  if (_BitScanReverse (&bit, x))
+    return bit + 1;
+  else
+    return 0;
+}
+#endif
+
+#define NBITS (sizeof (TYPE) * CHAR_BIT)
+
+/* Modify shift count to be in bounds, even in dead code, otherwise GCC
+   emits warnings "right shift count >= width of type".  */
+#define MSC(i) MIN (i, NBITS - 1)
+
+int
+FUNC (TYPE x)
+{
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__clang_major__ >= 4)
+  if (x == 0)
+    return 0;
+  else
+    return NBITS - GCC_BUILTIN (x);
+#elif defined _MSC_VER && defined MSVC_BUILTIN
+  /* _BitScanReverse, _BitScanReverse64
+     <https://docs.microsoft.com/en-us/cpp/intrinsics/bitscanreverse-bitscanreverse64> */
+  unsigned long bit;
+  if (MSVC_BUILTIN (&bit, x))
+    return bit + 1;
+  else
+    return 0;
+#else
+  /* Split x into chunks, and look at one chunk after the other.  */
+  if (sizeof (TYPE) > 2 * sizeof (unsigned int))
+    {
+      /* Generic loop.  */
+      size_t i;
+
+      for (i = (sizeof (TYPE) - 1) / sizeof (unsigned int); i >= 2; i--)
+        {
+          unsigned int y = x >> (i * sizeof (unsigned int) * CHAR_BIT);
+          if (y != 0)
+            return i * sizeof (unsigned int) * CHAR_BIT + integer_length (y);
+        }
+    }
+
+  /* Unrolled the last 2 loop rounds.  */
+  /* i = 1 */
+  if (sizeof (TYPE) > 1 * sizeof (unsigned int))
+    {
+      unsigned int y = x >> MSC (1 * sizeof (unsigned int) * CHAR_BIT);
+      if (y != 0)
+        return 1 * sizeof (unsigned int) * CHAR_BIT + integer_length (y);
+    }
+
+  /* i = 0 */
+  return integer_length ((unsigned int) x);
+#endif
+}
diff --git a/lib/intprops.h b/lib/intprops.h
index 0c3963d..9d10028 100644
--- a/lib/intprops.h
+++ b/lib/intprops.h
@@ -1,18 +1,18 @@
 /* intprops.h -- properties of integer types
 
-   Copyright (C) 2001-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2.1 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Paul Eggert.  */
@@ -48,7 +48,7 @@
 /* Minimum and maximum values for integer types and expressions.  */
 
 /* The width in bits of the integer type or expression T.
-   Do not evaluate T.
+   Do not evaluate T.  T must not be a bit-field expression.
    Padding bits are not supported; this is checked at compile-time below.  */
 #define TYPE_WIDTH(t) (sizeof (t) * CHAR_BIT)
 
@@ -70,7 +70,7 @@
    ? _GL_SIGNED_INT_MAXIMUM (e)                                         \
    : _GL_INT_NEGATE_CONVERT (e, 1))
 #define _GL_SIGNED_INT_MAXIMUM(e)                                       \
-  (((_GL_INT_CONVERT (e, 1) << (TYPE_WIDTH ((e) + 0) - 2)) - 1) * 2 + 1)
+  (((_GL_INT_CONVERT (e, 1) << (TYPE_WIDTH (+ (e)) - 2)) - 1) * 2 + 1)
 
 /* Work around OpenVMS incompatibility with C99.  */
 #if !defined LLONG_MAX && defined __INT64_MAX
@@ -86,6 +86,7 @@
 /* Does the __typeof__ keyword work?  This could be done by
    'configure', but for now it's easier to do it by hand.  */
 #if (2 <= __GNUC__ \
+     || (4 <= __clang_major__) \
      || (1210 <= __IBMC__ && defined __IBM__TYPEOF__) \
      || (0x5110 <= __SUNPRO_C && !__STDC__))
 # define _GL_HAVE___TYPEOF__ 1
@@ -94,8 +95,9 @@
 #endif
 
 /* Return 1 if the integer type or expression T might be signed.  Return 0
-   if it is definitely unsigned.  This macro does not evaluate its argument,
-   and expands to an integer constant expression.  */
+   if it is definitely unsigned.  T must not be a bit-field expression.
+   This macro does not evaluate its argument, and expands to an
+   integer constant expression.  */
 #if _GL_HAVE___TYPEOF__
 # define _GL_SIGNED_TYPE_OR_EXPR(t) TYPE_SIGNED (__typeof__ (t))
 #else
@@ -108,6 +110,8 @@
 #define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485)
 
 /* Bound on length of the string representing an integer type or expression T.
+   T must not be a bit-field expression.
+
    Subtract 1 for the sign bit if T is signed, and then add 1 more for
    a minus sign if needed.
 
@@ -119,7 +123,7 @@
    + _GL_SIGNED_TYPE_OR_EXPR (t))
 
 /* Bound on buffer size needed to represent an integer type or expression T,
-   including the terminating null.  */
+   including the terminating null.  T must not be a bit-field expression.  */
 #define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
 
 
@@ -129,7 +133,8 @@
    operators might not yield numerically correct answers due to
    arithmetic overflow.  They do not rely on undefined or
    implementation-defined behavior.  Their implementations are simple
-   and straightforward, but they are a bit harder to use than the
+   and straightforward, but they are harder to use and may be less
+   efficient than the INT_<op>_WRAPV, INT_<op>_OK, and
    INT_<op>_OVERFLOW macros described below.
 
    Example usage:
@@ -154,6 +159,9 @@
    must have minimum value MIN and maximum MAX.  Unsigned types should
    use a zero MIN of the proper type.
 
+   Because all arguments are subject to integer promotions, these
+   macros typically do not work on types narrower than 'int'.
+
    These macros are tuned for constant MIN and MAX.  For commutative
    operations such as A + B, they are also tuned for constant B.  */
 
@@ -222,7 +230,9 @@
 
 /* True if __builtin_add_overflow (A, B, P) and __builtin_sub_overflow
    (A, B, P) work when P is non-null.  */
-#if 5 <= __GNUC__ && !defined __ICC
+/* __builtin_{add,sub}_overflow exists but is not reliable in GCC 5.x and 6.x,
+   see <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98269>.  */
+#if 7 <= __GNUC__ && !defined __ICC
 # define _GL_HAS_BUILTIN_ADD_OVERFLOW 1
 #elif defined __has_builtin
 # define _GL_HAS_BUILTIN_ADD_OVERFLOW __has_builtin (__builtin_add_overflow)
@@ -239,8 +249,18 @@
 #endif
 
 /* True if __builtin_add_overflow_p (A, B, C) works, and similarly for
-   __builtin_mul_overflow_p and __builtin_mul_overflow_p.  */
-#define _GL_HAS_BUILTIN_OVERFLOW_P (7 <= __GNUC__)
+   __builtin_sub_overflow_p and __builtin_mul_overflow_p.  */
+#if defined __clang__ || defined __ICC
+/* Clang 11 lacks __builtin_mul_overflow_p, and even if it did it
+   would presumably run afoul of Clang bug 16404.  ICC 2021.1's
+   __builtin_add_overflow_p etc. are not treated as integral constant
+   expressions even when all arguments are.  */
+# define _GL_HAS_BUILTIN_OVERFLOW_P 0
+#elif defined __has_builtin
+# define _GL_HAS_BUILTIN_OVERFLOW_P __has_builtin (__builtin_mul_overflow_p)
+#else
+# define _GL_HAS_BUILTIN_OVERFLOW_P (7 <= __GNUC__)
+#endif
 
 /* The _GL*_OVERFLOW macros have the same restrictions as the
    *_RANGE_OVERFLOW macros, except that they do not assume that operands
@@ -323,9 +343,15 @@
    arguments should not have side effects.
 
    The WRAPV macros are not constant expressions.  They support only
-   +, binary -, and *.  Because the WRAPV macros convert the result,
-   they report overflow in different circumstances than the OVERFLOW
-   macros do.
+   +, binary -, and *.
+
+   Because the WRAPV macros convert the result, they report overflow
+   in different circumstances than the OVERFLOW macros do.  For
+   example, in the typical case with 16-bit 'short' and 32-bit 'int',
+   if A, B and R are all of type 'short' then INT_ADD_OVERFLOW (A, B)
+   returns false because the addition cannot overflow after A and B
+   are converted to 'int', whereas INT_ADD_WRAPV (A, B, &R) returns
+   true or false depending on whether the sum fits into 'short'.
 
    These macros are tuned for their last input argument being a constant.
 
@@ -373,8 +399,9 @@
    _GL_INT_OP_WRAPV (a, b, r, -, _GL_INT_SUBTRACT_RANGE_OVERFLOW)
 #endif
 #if _GL_HAS_BUILTIN_MUL_OVERFLOW
-# if (9 < __GNUC__ + (3 <= __GNUC_MINOR__) \
-      || (__GNUC__ == 8 && 4 <= __GNUC_MINOR__))
+# if ((9 < __GNUC__ + (3 <= __GNUC_MINOR__) \
+       || (__GNUC__ == 8 && 4 <= __GNUC_MINOR__)) \
+      && !defined __ICC)
 #  define INT_MULTIPLY_WRAPV(a, b, r) __builtin_mul_overflow (a, b, r)
 # else
    /* Work around GCC bug 91450.  */
@@ -395,7 +422,7 @@
    For now, assume all versions of GCC-like compilers generate bogus
    warnings for _Generic.  This matters only for compilers that
    lack relevant builtins.  */
-#if __GNUC__
+#if __GNUC__ || defined __clang__
 # define _GL__GENERIC_BOGUS 1
 #else
 # define _GL__GENERIC_BOGUS 0
@@ -565,7 +592,7 @@
       ? (EXPR_SIGNED (_GL_INT_CONVERT (tmax, b)) \
          ? (a) < (tmax) / (b) \
          : ((INT_NEGATE_OVERFLOW (b) \
-             ? _GL_INT_CONVERT (b, tmax) >> (TYPE_WIDTH (b) - 1) \
+             ? _GL_INT_CONVERT (b, tmax) >> (TYPE_WIDTH (+ (b)) - 1) \
              : (tmax) / -(b)) \
             <= -1 - (a))) \
       : INT_NEGATE_OVERFLOW (_GL_INT_CONVERT (b, tmin)) && (b) == -1 \
@@ -581,4 +608,33 @@
          : (tmin) / (a) < (b)) \
       : (tmax) / (b) < (a)))
 
+/* The following macros compute A + B, A - B, and A * B, respectively.
+   If no overflow occurs, they set *R to the result and return 1;
+   otherwise, they return 0 and may modify *R.
+
+   Example usage:
+
+     long int result;
+     if (INT_ADD_OK (a, b, &result))
+       printf ("result is %ld\n", result);
+     else
+       printf ("overflow\n");
+
+   A, B, and *R should be integers; they need not be the same type,
+   and they need not be all signed or all unsigned.
+
+   These macros work correctly on all known practical hosts, and do not rely
+   on undefined behavior due to signed arithmetic overflow.
+
+   These macros are not constant expressions.
+
+   These macros may evaluate their arguments zero or multiple times, so the
+   arguments should not have side effects.
+
+   These macros are tuned for B being a constant.  */
+
+#define INT_ADD_OK(a, b, r) ! INT_ADD_WRAPV (a, b, r)
+#define INT_SUBTRACT_OK(a, b, r) ! INT_SUBTRACT_WRAPV (a, b, r)
+#define INT_MULTIPLY_OK(a, b, r) ! INT_MULTIPLY_WRAPV (a, b, r)
+
 #endif /* _GL_INTPROPS_H */
diff --git a/lib/inttypes.in.h b/lib/inttypes.in.h
index 49bcbc1..41cb422 100644
--- a/lib/inttypes.in.h
+++ b/lib/inttypes.in.h
@@ -1,18 +1,18 @@
-/* Copyright (C) 2006-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2006-2021 Free Software Foundation, Inc.
    Written by Paul Eggert, Bruno Haible, Derek Price.
    This file is part of gnulib.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /*
@@ -38,6 +38,8 @@
 #  endif
 
 #  @INCLUDE_NEXT@ @NEXT_INTTYPES_H@
+
+#  define _GL_FINISHED_INCLUDING_SYSTEM_INTTYPES_H
 # endif
 #endif
 
@@ -76,110 +78,92 @@
 # define _LONG_LONG_FORMAT_PREFIX "ll"
 #endif
 
-#if !defined PRId8 || @PRI_MACROS_BROKEN@
-# undef PRId8
+#if !defined PRId8
 # ifdef INT8_MAX
 #  define PRId8 "d"
 # endif
 #endif
-#if !defined PRIi8 || @PRI_MACROS_BROKEN@
-# undef PRIi8
+#if !defined PRIi8
 # ifdef INT8_MAX
 #  define PRIi8 "i"
 # endif
 #endif
-#if !defined PRIo8 || @PRI_MACROS_BROKEN@
-# undef PRIo8
+#if !defined PRIo8
 # ifdef UINT8_MAX
 #  define PRIo8 "o"
 # endif
 #endif
-#if !defined PRIu8 || @PRI_MACROS_BROKEN@
-# undef PRIu8
+#if !defined PRIu8
 # ifdef UINT8_MAX
 #  define PRIu8 "u"
 # endif
 #endif
-#if !defined PRIx8 || @PRI_MACROS_BROKEN@
-# undef PRIx8
+#if !defined PRIx8
 # ifdef UINT8_MAX
 #  define PRIx8 "x"
 # endif
 #endif
-#if !defined PRIX8 || @PRI_MACROS_BROKEN@
-# undef PRIX8
+#if !defined PRIX8
 # ifdef UINT8_MAX
 #  define PRIX8 "X"
 # endif
 #endif
-#if !defined PRId16 || @PRI_MACROS_BROKEN@
-# undef PRId16
+#if !defined PRId16
 # ifdef INT16_MAX
 #  define PRId16 "d"
 # endif
 #endif
-#if !defined PRIi16 || @PRI_MACROS_BROKEN@
-# undef PRIi16
+#if !defined PRIi16
 # ifdef INT16_MAX
 #  define PRIi16 "i"
 # endif
 #endif
-#if !defined PRIo16 || @PRI_MACROS_BROKEN@
-# undef PRIo16
+#if !defined PRIo16
 # ifdef UINT16_MAX
 #  define PRIo16 "o"
 # endif
 #endif
-#if !defined PRIu16 || @PRI_MACROS_BROKEN@
-# undef PRIu16
+#if !defined PRIu16
 # ifdef UINT16_MAX
 #  define PRIu16 "u"
 # endif
 #endif
-#if !defined PRIx16 || @PRI_MACROS_BROKEN@
-# undef PRIx16
+#if !defined PRIx16
 # ifdef UINT16_MAX
 #  define PRIx16 "x"
 # endif
 #endif
-#if !defined PRIX16 || @PRI_MACROS_BROKEN@
-# undef PRIX16
+#if !defined PRIX16
 # ifdef UINT16_MAX
 #  define PRIX16 "X"
 # endif
 #endif
-#if !defined PRId32 || @PRI_MACROS_BROKEN@
-# undef PRId32
+#if !defined PRId32
 # ifdef INT32_MAX
 #  define PRId32 "d"
 # endif
 #endif
-#if !defined PRIi32 || @PRI_MACROS_BROKEN@
-# undef PRIi32
+#if !defined PRIi32
 # ifdef INT32_MAX
 #  define PRIi32 "i"
 # endif
 #endif
-#if !defined PRIo32 || @PRI_MACROS_BROKEN@
-# undef PRIo32
+#if !defined PRIo32
 # ifdef UINT32_MAX
 #  define PRIo32 "o"
 # endif
 #endif
-#if !defined PRIu32 || @PRI_MACROS_BROKEN@
-# undef PRIu32
+#if !defined PRIu32
 # ifdef UINT32_MAX
 #  define PRIu32 "u"
 # endif
 #endif
-#if !defined PRIx32 || @PRI_MACROS_BROKEN@
-# undef PRIx32
+#if !defined PRIx32
 # ifdef UINT32_MAX
 #  define PRIx32 "x"
 # endif
 #endif
-#if !defined PRIX32 || @PRI_MACROS_BROKEN@
-# undef PRIX32
+#if !defined PRIX32
 # ifdef UINT32_MAX
 #  define PRIX32 "X"
 # endif
@@ -189,15 +173,13 @@
 #  define _PRI64_PREFIX "l"
 # elif defined _MSC_VER || defined __MINGW32__
 #  define _PRI64_PREFIX "I64"
-# elif @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+# elif LONG_MAX >> 30 == 1
 #  define _PRI64_PREFIX _LONG_LONG_FORMAT_PREFIX
 # endif
-# if !defined PRId64 || @PRI_MACROS_BROKEN@
-#  undef PRId64
+# if !defined PRId64
 #  define PRId64 _PRI64_PREFIX "d"
 # endif
-# if !defined PRIi64 || @PRI_MACROS_BROKEN@
-#  undef PRIi64
+# if !defined PRIi64
 #  define PRIi64 _PRI64_PREFIX "i"
 # endif
 #endif
@@ -206,266 +188,220 @@
 #  define _PRIu64_PREFIX "l"
 # elif defined _MSC_VER || defined __MINGW32__
 #  define _PRIu64_PREFIX "I64"
-# elif @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+# elif ULONG_MAX >> 31 == 1
 #  define _PRIu64_PREFIX _LONG_LONG_FORMAT_PREFIX
 # endif
-# if !defined PRIo64 || @PRI_MACROS_BROKEN@
-#  undef PRIo64
+# if !defined PRIo64
 #  define PRIo64 _PRIu64_PREFIX "o"
 # endif
-# if !defined PRIu64 || @PRI_MACROS_BROKEN@
-#  undef PRIu64
+# if !defined PRIu64
 #  define PRIu64 _PRIu64_PREFIX "u"
 # endif
-# if !defined PRIx64 || @PRI_MACROS_BROKEN@
-#  undef PRIx64
+# if !defined PRIx64
 #  define PRIx64 _PRIu64_PREFIX "x"
 # endif
-# if !defined PRIX64 || @PRI_MACROS_BROKEN@
-#  undef PRIX64
+# if !defined PRIX64
 #  define PRIX64 _PRIu64_PREFIX "X"
 # endif
 #endif
 
-#if !defined PRIdLEAST8 || @PRI_MACROS_BROKEN@
-# undef PRIdLEAST8
+#if !defined PRIdLEAST8
 # define PRIdLEAST8 "d"
 #endif
-#if !defined PRIiLEAST8 || @PRI_MACROS_BROKEN@
-# undef PRIiLEAST8
+#if !defined PRIiLEAST8
 # define PRIiLEAST8 "i"
 #endif
-#if !defined PRIoLEAST8 || @PRI_MACROS_BROKEN@
-# undef PRIoLEAST8
+#if !defined PRIoLEAST8
 # define PRIoLEAST8 "o"
 #endif
-#if !defined PRIuLEAST8 || @PRI_MACROS_BROKEN@
-# undef PRIuLEAST8
+#if !defined PRIuLEAST8
 # define PRIuLEAST8 "u"
 #endif
-#if !defined PRIxLEAST8 || @PRI_MACROS_BROKEN@
-# undef PRIxLEAST8
+#if !defined PRIxLEAST8
 # define PRIxLEAST8 "x"
 #endif
-#if !defined PRIXLEAST8 || @PRI_MACROS_BROKEN@
-# undef PRIXLEAST8
+#if !defined PRIXLEAST8
 # define PRIXLEAST8 "X"
 #endif
-#if !defined PRIdLEAST16 || @PRI_MACROS_BROKEN@
-# undef PRIdLEAST16
+#if !defined PRIdLEAST16
 # define PRIdLEAST16 "d"
 #endif
-#if !defined PRIiLEAST16 || @PRI_MACROS_BROKEN@
-# undef PRIiLEAST16
+#if !defined PRIiLEAST16
 # define PRIiLEAST16 "i"
 #endif
-#if !defined PRIoLEAST16 || @PRI_MACROS_BROKEN@
-# undef PRIoLEAST16
+#if !defined PRIoLEAST16
 # define PRIoLEAST16 "o"
 #endif
-#if !defined PRIuLEAST16 || @PRI_MACROS_BROKEN@
-# undef PRIuLEAST16
+#if !defined PRIuLEAST16
 # define PRIuLEAST16 "u"
 #endif
-#if !defined PRIxLEAST16 || @PRI_MACROS_BROKEN@
-# undef PRIxLEAST16
+#if !defined PRIxLEAST16
 # define PRIxLEAST16 "x"
 #endif
-#if !defined PRIXLEAST16 || @PRI_MACROS_BROKEN@
-# undef PRIXLEAST16
+#if !defined PRIXLEAST16
 # define PRIXLEAST16 "X"
 #endif
-#if !defined PRIdLEAST32 || @PRI_MACROS_BROKEN@
-# undef PRIdLEAST32
+#if !defined PRIdLEAST32
 # define PRIdLEAST32 "d"
 #endif
-#if !defined PRIiLEAST32 || @PRI_MACROS_BROKEN@
-# undef PRIiLEAST32
+#if !defined PRIiLEAST32
 # define PRIiLEAST32 "i"
 #endif
-#if !defined PRIoLEAST32 || @PRI_MACROS_BROKEN@
-# undef PRIoLEAST32
+#if !defined PRIoLEAST32
 # define PRIoLEAST32 "o"
 #endif
-#if !defined PRIuLEAST32 || @PRI_MACROS_BROKEN@
-# undef PRIuLEAST32
+#if !defined PRIuLEAST32
 # define PRIuLEAST32 "u"
 #endif
-#if !defined PRIxLEAST32 || @PRI_MACROS_BROKEN@
-# undef PRIxLEAST32
+#if !defined PRIxLEAST32
 # define PRIxLEAST32 "x"
 #endif
-#if !defined PRIXLEAST32 || @PRI_MACROS_BROKEN@
-# undef PRIXLEAST32
+#if !defined PRIXLEAST32
 # define PRIXLEAST32 "X"
 #endif
 #ifdef INT64_MAX
-# if !defined PRIdLEAST64 || @PRI_MACROS_BROKEN@
-#  undef PRIdLEAST64
+# if !defined PRIdLEAST64
 #  define PRIdLEAST64 PRId64
 # endif
-# if !defined PRIiLEAST64 || @PRI_MACROS_BROKEN@
-#  undef PRIiLEAST64
+# if !defined PRIiLEAST64
 #  define PRIiLEAST64 PRIi64
 # endif
 #endif
 #ifdef UINT64_MAX
-# if !defined PRIoLEAST64 || @PRI_MACROS_BROKEN@
-#  undef PRIoLEAST64
+# if !defined PRIoLEAST64
 #  define PRIoLEAST64 PRIo64
 # endif
-# if !defined PRIuLEAST64 || @PRI_MACROS_BROKEN@
-#  undef PRIuLEAST64
+# if !defined PRIuLEAST64
 #  define PRIuLEAST64 PRIu64
 # endif
-# if !defined PRIxLEAST64 || @PRI_MACROS_BROKEN@
-#  undef PRIxLEAST64
+# if !defined PRIxLEAST64
 #  define PRIxLEAST64 PRIx64
 # endif
-# if !defined PRIXLEAST64 || @PRI_MACROS_BROKEN@
-#  undef PRIXLEAST64
+# if !defined PRIXLEAST64
 #  define PRIXLEAST64 PRIX64
 # endif
 #endif
 
-#if !defined PRIdFAST8 || @PRI_MACROS_BROKEN@
-# undef PRIdFAST8
+#if !defined PRIdFAST8
 # if INT_FAST8_MAX > INT32_MAX
 #  define PRIdFAST8 PRId64
 # else
 #  define PRIdFAST8 "d"
 # endif
 #endif
-#if !defined PRIiFAST8 || @PRI_MACROS_BROKEN@
-# undef PRIiFAST8
+#if !defined PRIiFAST8
 # if INT_FAST8_MAX > INT32_MAX
 #  define PRIiFAST8 PRIi64
 # else
 #  define PRIiFAST8 "i"
 # endif
 #endif
-#if !defined PRIoFAST8 || @PRI_MACROS_BROKEN@
-# undef PRIoFAST8
+#if !defined PRIoFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define PRIoFAST8 PRIo64
 # else
 #  define PRIoFAST8 "o"
 # endif
 #endif
-#if !defined PRIuFAST8 || @PRI_MACROS_BROKEN@
-# undef PRIuFAST8
+#if !defined PRIuFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define PRIuFAST8 PRIu64
 # else
 #  define PRIuFAST8 "u"
 # endif
 #endif
-#if !defined PRIxFAST8 || @PRI_MACROS_BROKEN@
-# undef PRIxFAST8
+#if !defined PRIxFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define PRIxFAST8 PRIx64
 # else
 #  define PRIxFAST8 "x"
 # endif
 #endif
-#if !defined PRIXFAST8 || @PRI_MACROS_BROKEN@
-# undef PRIXFAST8
+#if !defined PRIXFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define PRIXFAST8 PRIX64
 # else
 #  define PRIXFAST8 "X"
 # endif
 #endif
-#if !defined PRIdFAST16 || @PRI_MACROS_BROKEN@
-# undef PRIdFAST16
+#if !defined PRIdFAST16
 # if INT_FAST16_MAX > INT32_MAX
 #  define PRIdFAST16 PRId64
 # else
 #  define PRIdFAST16 "d"
 # endif
 #endif
-#if !defined PRIiFAST16 || @PRI_MACROS_BROKEN@
-# undef PRIiFAST16
+#if !defined PRIiFAST16
 # if INT_FAST16_MAX > INT32_MAX
 #  define PRIiFAST16 PRIi64
 # else
 #  define PRIiFAST16 "i"
 # endif
 #endif
-#if !defined PRIoFAST16 || @PRI_MACROS_BROKEN@
-# undef PRIoFAST16
+#if !defined PRIoFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define PRIoFAST16 PRIo64
 # else
 #  define PRIoFAST16 "o"
 # endif
 #endif
-#if !defined PRIuFAST16 || @PRI_MACROS_BROKEN@
-# undef PRIuFAST16
+#if !defined PRIuFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define PRIuFAST16 PRIu64
 # else
 #  define PRIuFAST16 "u"
 # endif
 #endif
-#if !defined PRIxFAST16 || @PRI_MACROS_BROKEN@
-# undef PRIxFAST16
+#if !defined PRIxFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define PRIxFAST16 PRIx64
 # else
 #  define PRIxFAST16 "x"
 # endif
 #endif
-#if !defined PRIXFAST16 || @PRI_MACROS_BROKEN@
-# undef PRIXFAST16
+#if !defined PRIXFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define PRIXFAST16 PRIX64
 # else
 #  define PRIXFAST16 "X"
 # endif
 #endif
-#if !defined PRIdFAST32 || @PRI_MACROS_BROKEN@
-# undef PRIdFAST32
+#if !defined PRIdFAST32
 # if INT_FAST32_MAX > INT32_MAX
 #  define PRIdFAST32 PRId64
 # else
 #  define PRIdFAST32 "d"
 # endif
 #endif
-#if !defined PRIiFAST32 || @PRI_MACROS_BROKEN@
-# undef PRIiFAST32
+#if !defined PRIiFAST32
 # if INT_FAST32_MAX > INT32_MAX
 #  define PRIiFAST32 PRIi64
 # else
 #  define PRIiFAST32 "i"
 # endif
 #endif
-#if !defined PRIoFAST32 || @PRI_MACROS_BROKEN@
-# undef PRIoFAST32
+#if !defined PRIoFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define PRIoFAST32 PRIo64
 # else
 #  define PRIoFAST32 "o"
 # endif
 #endif
-#if !defined PRIuFAST32 || @PRI_MACROS_BROKEN@
-# undef PRIuFAST32
+#if !defined PRIuFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define PRIuFAST32 PRIu64
 # else
 #  define PRIuFAST32 "u"
 # endif
 #endif
-#if !defined PRIxFAST32 || @PRI_MACROS_BROKEN@
-# undef PRIxFAST32
+#if !defined PRIxFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define PRIxFAST32 PRIx64
 # else
 #  define PRIxFAST32 "x"
 # endif
 #endif
-#if !defined PRIXFAST32 || @PRI_MACROS_BROKEN@
-# undef PRIXFAST32
+#if !defined PRIXFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define PRIXFAST32 PRIX64
 # else
@@ -473,76 +409,64 @@
 # endif
 #endif
 #ifdef INT64_MAX
-# if !defined PRIdFAST64 || @PRI_MACROS_BROKEN@
-#  undef PRIdFAST64
+# if !defined PRIdFAST64
 #  define PRIdFAST64 PRId64
 # endif
-# if !defined PRIiFAST64 || @PRI_MACROS_BROKEN@
-#  undef PRIiFAST64
+# if !defined PRIiFAST64
 #  define PRIiFAST64 PRIi64
 # endif
 #endif
 #ifdef UINT64_MAX
-# if !defined PRIoFAST64 || @PRI_MACROS_BROKEN@
-#  undef PRIoFAST64
+# if !defined PRIoFAST64
 #  define PRIoFAST64 PRIo64
 # endif
-# if !defined PRIuFAST64 || @PRI_MACROS_BROKEN@
-#  undef PRIuFAST64
+# if !defined PRIuFAST64
 #  define PRIuFAST64 PRIu64
 # endif
-# if !defined PRIxFAST64 || @PRI_MACROS_BROKEN@
-#  undef PRIxFAST64
+# if !defined PRIxFAST64
 #  define PRIxFAST64 PRIx64
 # endif
-# if !defined PRIXFAST64 || @PRI_MACROS_BROKEN@
-#  undef PRIXFAST64
+# if !defined PRIXFAST64
 #  define PRIXFAST64 PRIX64
 # endif
 #endif
 
-#if !defined PRIdMAX || @PRI_MACROS_BROKEN@
-# undef PRIdMAX
+#if !defined PRIdMAX
 # if @INT32_MAX_LT_INTMAX_MAX@
 #  define PRIdMAX PRId64
 # else
 #  define PRIdMAX "ld"
 # endif
 #endif
-#if !defined PRIiMAX || @PRI_MACROS_BROKEN@
-# undef PRIiMAX
+#if !defined PRIiMAX
 # if @INT32_MAX_LT_INTMAX_MAX@
 #  define PRIiMAX PRIi64
 # else
 #  define PRIiMAX "li"
 # endif
 #endif
-#if !defined PRIoMAX || @PRI_MACROS_BROKEN@
-# undef PRIoMAX
+#if !defined PRIoMAX
 # if @UINT32_MAX_LT_UINTMAX_MAX@
 #  define PRIoMAX PRIo64
 # else
 #  define PRIoMAX "lo"
 # endif
 #endif
-#if !defined PRIuMAX || @PRI_MACROS_BROKEN@
-# undef PRIuMAX
+#if !defined PRIuMAX
 # if @UINT32_MAX_LT_UINTMAX_MAX@
 #  define PRIuMAX PRIu64
 # else
 #  define PRIuMAX "lu"
 # endif
 #endif
-#if !defined PRIxMAX || @PRI_MACROS_BROKEN@
-# undef PRIxMAX
+#if !defined PRIxMAX
 # if @UINT32_MAX_LT_UINTMAX_MAX@
 #  define PRIxMAX PRIx64
 # else
 #  define PRIxMAX "lx"
 # endif
 #endif
-#if !defined PRIXMAX || @PRI_MACROS_BROKEN@
-# undef PRIXMAX
+#if !defined PRIXMAX
 # if @UINT32_MAX_LT_UINTMAX_MAX@
 #  define PRIXMAX PRIX64
 # else
@@ -550,129 +474,108 @@
 # endif
 #endif
 
-#if !defined PRIdPTR || @PRI_MACROS_BROKEN@
-# undef PRIdPTR
+#if !defined PRIdPTR
 # ifdef INTPTR_MAX
 #  define PRIdPTR @PRIPTR_PREFIX@ "d"
 # endif
 #endif
-#if !defined PRIiPTR || @PRI_MACROS_BROKEN@
-# undef PRIiPTR
+#if !defined PRIiPTR
 # ifdef INTPTR_MAX
 #  define PRIiPTR @PRIPTR_PREFIX@ "i"
 # endif
 #endif
-#if !defined PRIoPTR || @PRI_MACROS_BROKEN@
-# undef PRIoPTR
+#if !defined PRIoPTR
 # ifdef UINTPTR_MAX
 #  define PRIoPTR @PRIPTR_PREFIX@ "o"
 # endif
 #endif
-#if !defined PRIuPTR || @PRI_MACROS_BROKEN@
-# undef PRIuPTR
+#if !defined PRIuPTR
 # ifdef UINTPTR_MAX
 #  define PRIuPTR @PRIPTR_PREFIX@ "u"
 # endif
 #endif
-#if !defined PRIxPTR || @PRI_MACROS_BROKEN@
-# undef PRIxPTR
+#if !defined PRIxPTR
 # ifdef UINTPTR_MAX
 #  define PRIxPTR @PRIPTR_PREFIX@ "x"
 # endif
 #endif
-#if !defined PRIXPTR || @PRI_MACROS_BROKEN@
-# undef PRIXPTR
+#if !defined PRIXPTR
 # ifdef UINTPTR_MAX
 #  define PRIXPTR @PRIPTR_PREFIX@ "X"
 # endif
 #endif
 
-#if !defined SCNd8 || @PRI_MACROS_BROKEN@
-# undef SCNd8
+#if !defined SCNd8
 # ifdef INT8_MAX
 #  define SCNd8 "hhd"
 # endif
 #endif
-#if !defined SCNi8 || @PRI_MACROS_BROKEN@
-# undef SCNi8
+#if !defined SCNi8
 # ifdef INT8_MAX
 #  define SCNi8 "hhi"
 # endif
 #endif
-#if !defined SCNo8 || @PRI_MACROS_BROKEN@
-# undef SCNo8
+#if !defined SCNo8
 # ifdef UINT8_MAX
 #  define SCNo8 "hho"
 # endif
 #endif
-#if !defined SCNu8 || @PRI_MACROS_BROKEN@
-# undef SCNu8
+#if !defined SCNu8
 # ifdef UINT8_MAX
 #  define SCNu8 "hhu"
 # endif
 #endif
-#if !defined SCNx8 || @PRI_MACROS_BROKEN@
-# undef SCNx8
+#if !defined SCNx8
 # ifdef UINT8_MAX
 #  define SCNx8 "hhx"
 # endif
 #endif
-#if !defined SCNd16 || @PRI_MACROS_BROKEN@
-# undef SCNd16
+#if !defined SCNd16
 # ifdef INT16_MAX
 #  define SCNd16 "hd"
 # endif
 #endif
-#if !defined SCNi16 || @PRI_MACROS_BROKEN@
-# undef SCNi16
+#if !defined SCNi16
 # ifdef INT16_MAX
 #  define SCNi16 "hi"
 # endif
 #endif
-#if !defined SCNo16 || @PRI_MACROS_BROKEN@
-# undef SCNo16
+#if !defined SCNo16
 # ifdef UINT16_MAX
 #  define SCNo16 "ho"
 # endif
 #endif
-#if !defined SCNu16 || @PRI_MACROS_BROKEN@
-# undef SCNu16
+#if !defined SCNu16
 # ifdef UINT16_MAX
 #  define SCNu16 "hu"
 # endif
 #endif
-#if !defined SCNx16 || @PRI_MACROS_BROKEN@
-# undef SCNx16
+#if !defined SCNx16
 # ifdef UINT16_MAX
 #  define SCNx16 "hx"
 # endif
 #endif
-#if !defined SCNd32 || @PRI_MACROS_BROKEN@
-# undef SCNd32
+#if !defined SCNd32
 # ifdef INT32_MAX
 #  define SCNd32 "d"
 # endif
 #endif
-#if !defined SCNi32 || @PRI_MACROS_BROKEN@
-# undef SCNi32
+#if !defined SCNi32
 # ifdef INT32_MAX
 #  define SCNi32 "i"
 # endif
 #endif
-#if !defined SCNo32 || @PRI_MACROS_BROKEN@
-# undef SCNo32
+#if !defined SCNo32
 # ifdef UINT32_MAX
 #  define SCNo32 "o"
 # endif
 #endif
-#if !defined SCNu32 || @PRI_MACROS_BROKEN@
-# undef SCNu32
+#if !defined SCNu32
 # ifdef UINT32_MAX
 #  define SCNu32 "u"
 # endif
 #endif
-#if !defined SCNx32 || @PRI_MACROS_BROKEN@
-# undef SCNx32
+#if !defined SCNx32
 # ifdef UINT32_MAX
 #  define SCNx32 "x"
 # endif
@@ -682,15 +585,13 @@
 #  define _SCN64_PREFIX "l"
 # elif defined _MSC_VER || defined __MINGW32__
 #  define _SCN64_PREFIX "I64"
-# elif @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+# elif LONG_MAX >> 30 == 1
 #  define _SCN64_PREFIX _LONG_LONG_FORMAT_PREFIX
 # endif
-# if !defined SCNd64 || @PRI_MACROS_BROKEN@
-#  undef SCNd64
+# if !defined SCNd64
 #  define SCNd64 _SCN64_PREFIX "d"
 # endif
-# if !defined SCNi64 || @PRI_MACROS_BROKEN@
-#  undef SCNi64
+# if !defined SCNi64
 #  define SCNi64 _SCN64_PREFIX "i"
 # endif
 #endif
@@ -699,110 +600,86 @@
 #  define _SCNu64_PREFIX "l"
 # elif defined _MSC_VER || defined __MINGW32__
 #  define _SCNu64_PREFIX "I64"
-# elif @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+# elif ULONG_MAX >> 31 == 1
 #  define _SCNu64_PREFIX _LONG_LONG_FORMAT_PREFIX
 # endif
-# if !defined SCNo64 || @PRI_MACROS_BROKEN@
-#  undef SCNo64
+# if !defined SCNo64
 #  define SCNo64 _SCNu64_PREFIX "o"
 # endif
-# if !defined SCNu64 || @PRI_MACROS_BROKEN@
-#  undef SCNu64
+# if !defined SCNu64
 #  define SCNu64 _SCNu64_PREFIX "u"
 # endif
-# if !defined SCNx64 || @PRI_MACROS_BROKEN@
-#  undef SCNx64
+# if !defined SCNx64
 #  define SCNx64 _SCNu64_PREFIX "x"
 # endif
 #endif
 
-#if !defined SCNdLEAST8 || @PRI_MACROS_BROKEN@
-# undef SCNdLEAST8
+#if !defined SCNdLEAST8
 # define SCNdLEAST8 "hhd"
 #endif
-#if !defined SCNiLEAST8 || @PRI_MACROS_BROKEN@
-# undef SCNiLEAST8
+#if !defined SCNiLEAST8
 # define SCNiLEAST8 "hhi"
 #endif
-#if !defined SCNoLEAST8 || @PRI_MACROS_BROKEN@
-# undef SCNoLEAST8
+#if !defined SCNoLEAST8
 # define SCNoLEAST8 "hho"
 #endif
-#if !defined SCNuLEAST8 || @PRI_MACROS_BROKEN@
-# undef SCNuLEAST8
+#if !defined SCNuLEAST8
 # define SCNuLEAST8 "hhu"
 #endif
-#if !defined SCNxLEAST8 || @PRI_MACROS_BROKEN@
-# undef SCNxLEAST8
+#if !defined SCNxLEAST8
 # define SCNxLEAST8 "hhx"
 #endif
-#if !defined SCNdLEAST16 || @PRI_MACROS_BROKEN@
-# undef SCNdLEAST16
+#if !defined SCNdLEAST16
 # define SCNdLEAST16 "hd"
 #endif
-#if !defined SCNiLEAST16 || @PRI_MACROS_BROKEN@
-# undef SCNiLEAST16
+#if !defined SCNiLEAST16
 # define SCNiLEAST16 "hi"
 #endif
-#if !defined SCNoLEAST16 || @PRI_MACROS_BROKEN@
-# undef SCNoLEAST16
+#if !defined SCNoLEAST16
 # define SCNoLEAST16 "ho"
 #endif
-#if !defined SCNuLEAST16 || @PRI_MACROS_BROKEN@
-# undef SCNuLEAST16
+#if !defined SCNuLEAST16
 # define SCNuLEAST16 "hu"
 #endif
-#if !defined SCNxLEAST16 || @PRI_MACROS_BROKEN@
-# undef SCNxLEAST16
+#if !defined SCNxLEAST16
 # define SCNxLEAST16 "hx"
 #endif
-#if !defined SCNdLEAST32 || @PRI_MACROS_BROKEN@
-# undef SCNdLEAST32
+#if !defined SCNdLEAST32
 # define SCNdLEAST32 "d"
 #endif
-#if !defined SCNiLEAST32 || @PRI_MACROS_BROKEN@
-# undef SCNiLEAST32
+#if !defined SCNiLEAST32
 # define SCNiLEAST32 "i"
 #endif
-#if !defined SCNoLEAST32 || @PRI_MACROS_BROKEN@
-# undef SCNoLEAST32
+#if !defined SCNoLEAST32
 # define SCNoLEAST32 "o"
 #endif
-#if !defined SCNuLEAST32 || @PRI_MACROS_BROKEN@
-# undef SCNuLEAST32
+#if !defined SCNuLEAST32
 # define SCNuLEAST32 "u"
 #endif
-#if !defined SCNxLEAST32 || @PRI_MACROS_BROKEN@
-# undef SCNxLEAST32
+#if !defined SCNxLEAST32
 # define SCNxLEAST32 "x"
 #endif
 #ifdef INT64_MAX
-# if !defined SCNdLEAST64 || @PRI_MACROS_BROKEN@
-#  undef SCNdLEAST64
+# if !defined SCNdLEAST64
 #  define SCNdLEAST64 SCNd64
 # endif
-# if !defined SCNiLEAST64 || @PRI_MACROS_BROKEN@
-#  undef SCNiLEAST64
+# if !defined SCNiLEAST64
 #  define SCNiLEAST64 SCNi64
 # endif
 #endif
 #ifdef UINT64_MAX
-# if !defined SCNoLEAST64 || @PRI_MACROS_BROKEN@
-#  undef SCNoLEAST64
+# if !defined SCNoLEAST64
 #  define SCNoLEAST64 SCNo64
 # endif
-# if !defined SCNuLEAST64 || @PRI_MACROS_BROKEN@
-#  undef SCNuLEAST64
+# if !defined SCNuLEAST64
 #  define SCNuLEAST64 SCNu64
 # endif
-# if !defined SCNxLEAST64 || @PRI_MACROS_BROKEN@
-#  undef SCNxLEAST64
+# if !defined SCNxLEAST64
 #  define SCNxLEAST64 SCNx64
 # endif
 #endif
 
-#if !defined SCNdFAST8 || @PRI_MACROS_BROKEN@
-# undef SCNdFAST8
+#if !defined SCNdFAST8
 # if INT_FAST8_MAX > INT32_MAX
 #  define SCNdFAST8 SCNd64
 # elif INT_FAST8_MAX == 0x7fff
@@ -813,8 +690,7 @@
 #  define SCNdFAST8 "d"
 # endif
 #endif
-#if !defined SCNiFAST8 || @PRI_MACROS_BROKEN@
-# undef SCNiFAST8
+#if !defined SCNiFAST8
 # if INT_FAST8_MAX > INT32_MAX
 #  define SCNiFAST8 SCNi64
 # elif INT_FAST8_MAX == 0x7fff
@@ -825,8 +701,7 @@
 #  define SCNiFAST8 "i"
 # endif
 #endif
-#if !defined SCNoFAST8 || @PRI_MACROS_BROKEN@
-# undef SCNoFAST8
+#if !defined SCNoFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define SCNoFAST8 SCNo64
 # elif UINT_FAST8_MAX == 0xffff
@@ -837,8 +712,7 @@
 #  define SCNoFAST8 "o"
 # endif
 #endif
-#if !defined SCNuFAST8 || @PRI_MACROS_BROKEN@
-# undef SCNuFAST8
+#if !defined SCNuFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define SCNuFAST8 SCNu64
 # elif UINT_FAST8_MAX == 0xffff
@@ -849,8 +723,7 @@
 #  define SCNuFAST8 "u"
 # endif
 #endif
-#if !defined SCNxFAST8 || @PRI_MACROS_BROKEN@
-# undef SCNxFAST8
+#if !defined SCNxFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define SCNxFAST8 SCNx64
 # elif UINT_FAST8_MAX == 0xffff
@@ -861,8 +734,7 @@
 #  define SCNxFAST8 "x"
 # endif
 #endif
-#if !defined SCNdFAST16 || @PRI_MACROS_BROKEN@
-# undef SCNdFAST16
+#if !defined SCNdFAST16
 # if INT_FAST16_MAX > INT32_MAX
 #  define SCNdFAST16 SCNd64
 # elif INT_FAST16_MAX == 0x7fff
@@ -871,8 +743,7 @@
 #  define SCNdFAST16 "d"
 # endif
 #endif
-#if !defined SCNiFAST16 || @PRI_MACROS_BROKEN@
-# undef SCNiFAST16
+#if !defined SCNiFAST16
 # if INT_FAST16_MAX > INT32_MAX
 #  define SCNiFAST16 SCNi64
 # elif INT_FAST16_MAX == 0x7fff
@@ -881,8 +752,7 @@
 #  define SCNiFAST16 "i"
 # endif
 #endif
-#if !defined SCNoFAST16 || @PRI_MACROS_BROKEN@
-# undef SCNoFAST16
+#if !defined SCNoFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define SCNoFAST16 SCNo64
 # elif UINT_FAST16_MAX == 0xffff
@@ -891,8 +761,7 @@
 #  define SCNoFAST16 "o"
 # endif
 #endif
-#if !defined SCNuFAST16 || @PRI_MACROS_BROKEN@
-# undef SCNuFAST16
+#if !defined SCNuFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define SCNuFAST16 SCNu64
 # elif UINT_FAST16_MAX == 0xffff
@@ -901,8 +770,7 @@
 #  define SCNuFAST16 "u"
 # endif
 #endif
-#if !defined SCNxFAST16 || @PRI_MACROS_BROKEN@
-# undef SCNxFAST16
+#if !defined SCNxFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define SCNxFAST16 SCNx64
 # elif UINT_FAST16_MAX == 0xffff
@@ -911,40 +779,35 @@
 #  define SCNxFAST16 "x"
 # endif
 #endif
-#if !defined SCNdFAST32 || @PRI_MACROS_BROKEN@
-# undef SCNdFAST32
+#if !defined SCNdFAST32
 # if INT_FAST32_MAX > INT32_MAX
 #  define SCNdFAST32 SCNd64
 # else
 #  define SCNdFAST32 "d"
 # endif
 #endif
-#if !defined SCNiFAST32 || @PRI_MACROS_BROKEN@
-# undef SCNiFAST32
+#if !defined SCNiFAST32
 # if INT_FAST32_MAX > INT32_MAX
 #  define SCNiFAST32 SCNi64
 # else
 #  define SCNiFAST32 "i"
 # endif
 #endif
-#if !defined SCNoFAST32 || @PRI_MACROS_BROKEN@
-# undef SCNoFAST32
+#if !defined SCNoFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define SCNoFAST32 SCNo64
 # else
 #  define SCNoFAST32 "o"
 # endif
 #endif
-#if !defined SCNuFAST32 || @PRI_MACROS_BROKEN@
-# undef SCNuFAST32
+#if !defined SCNuFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define SCNuFAST32 SCNu64
 # else
 #  define SCNuFAST32 "u"
 # endif
 #endif
-#if !defined SCNxFAST32 || @PRI_MACROS_BROKEN@
-# undef SCNxFAST32
+#if !defined SCNxFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define SCNxFAST32 SCNx64
 # else
@@ -952,64 +815,54 @@
 # endif
 #endif
 #ifdef INT64_MAX
-# if !defined SCNdFAST64 || @PRI_MACROS_BROKEN@
-#  undef SCNdFAST64
+# if !defined SCNdFAST64
 #  define SCNdFAST64 SCNd64
 # endif
-# if !defined SCNiFAST64 || @PRI_MACROS_BROKEN@
-#  undef SCNiFAST64
+# if !defined SCNiFAST64
 #  define SCNiFAST64 SCNi64
 # endif
 #endif
 #ifdef UINT64_MAX
-# if !defined SCNoFAST64 || @PRI_MACROS_BROKEN@
-#  undef SCNoFAST64
+# if !defined SCNoFAST64
 #  define SCNoFAST64 SCNo64
 # endif
-# if !defined SCNuFAST64 || @PRI_MACROS_BROKEN@
-#  undef SCNuFAST64
+# if !defined SCNuFAST64
 #  define SCNuFAST64 SCNu64
 # endif
-# if !defined SCNxFAST64 || @PRI_MACROS_BROKEN@
-#  undef SCNxFAST64
+# if !defined SCNxFAST64
 #  define SCNxFAST64 SCNx64
 # endif
 #endif
 
-#if !defined SCNdMAX || @PRI_MACROS_BROKEN@
-# undef SCNdMAX
+#if !defined SCNdMAX
 # if @INT32_MAX_LT_INTMAX_MAX@
 #  define SCNdMAX SCNd64
 # else
 #  define SCNdMAX "ld"
 # endif
 #endif
-#if !defined SCNiMAX || @PRI_MACROS_BROKEN@
-# undef SCNiMAX
+#if !defined SCNiMAX
 # if @INT32_MAX_LT_INTMAX_MAX@
 #  define SCNiMAX SCNi64
 # else
 #  define SCNiMAX "li"
 # endif
 #endif
-#if !defined SCNoMAX || @PRI_MACROS_BROKEN@
-# undef SCNoMAX
+#if !defined SCNoMAX
 # if @UINT32_MAX_LT_UINTMAX_MAX@
 #  define SCNoMAX SCNo64
 # else
 #  define SCNoMAX "lo"
 # endif
 #endif
-#if !defined SCNuMAX || @PRI_MACROS_BROKEN@
-# undef SCNuMAX
+#if !defined SCNuMAX
 # if @UINT32_MAX_LT_UINTMAX_MAX@
 #  define SCNuMAX SCNu64
 # else
 #  define SCNuMAX "lu"
 # endif
 #endif
-#if !defined SCNxMAX || @PRI_MACROS_BROKEN@
-# undef SCNxMAX
+#if !defined SCNxMAX
 # if @UINT32_MAX_LT_UINTMAX_MAX@
 #  define SCNxMAX SCNx64
 # else
@@ -1017,32 +870,27 @@
 # endif
 #endif
 
-#if !defined SCNdPTR || @PRI_MACROS_BROKEN@
-# undef SCNdPTR
+#if !defined SCNdPTR
 # ifdef INTPTR_MAX
 #  define SCNdPTR @PRIPTR_PREFIX@ "d"
 # endif
 #endif
-#if !defined SCNiPTR || @PRI_MACROS_BROKEN@
-# undef SCNiPTR
+#if !defined SCNiPTR
 # ifdef INTPTR_MAX
 #  define SCNiPTR @PRIPTR_PREFIX@ "i"
 # endif
 #endif
-#if !defined SCNoPTR || @PRI_MACROS_BROKEN@
-# undef SCNoPTR
+#if !defined SCNoPTR
 # ifdef UINTPTR_MAX
 #  define SCNoPTR @PRIPTR_PREFIX@ "o"
 # endif
 #endif
-#if !defined SCNuPTR || @PRI_MACROS_BROKEN@
-# undef SCNuPTR
+#if !defined SCNuPTR
 # ifdef UINTPTR_MAX
 #  define SCNuPTR @PRIPTR_PREFIX@ "u"
 # endif
 #endif
-#if !defined SCNxPTR || @PRI_MACROS_BROKEN@
-# undef SCNxPTR
+#if !defined SCNxPTR
 # ifdef UINTPTR_MAX
 #  define SCNxPTR @PRIPTR_PREFIX@ "x"
 # endif
@@ -1091,15 +939,19 @@
 #   define strtoimax rpl_strtoimax
 #  endif
 _GL_FUNCDECL_RPL (strtoimax, intmax_t,
-                  (const char *, char **, int) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtoimax, intmax_t, (const char *, char **, int));
+                  (const char *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoimax, intmax_t,
+                  (const char *restrict, char **restrict, int));
 # else
 #  if !@HAVE_DECL_STRTOIMAX@
 #   undef strtoimax
 _GL_FUNCDECL_SYS (strtoimax, intmax_t,
-                  (const char *, char **, int) _GL_ARG_NONNULL ((1)));
+                  (const char *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (strtoimax, intmax_t, (const char *, char **, int));
+_GL_CXXALIAS_SYS (strtoimax, intmax_t,
+                  (const char *restrict, char **restrict, int));
 # endif
 _GL_CXXALIASWARN (strtoimax);
 #elif defined GNULIB_POSIXCHECK
@@ -1117,15 +969,19 @@
 #   define strtoumax rpl_strtoumax
 #  endif
 _GL_FUNCDECL_RPL (strtoumax, uintmax_t,
-                  (const char *, char **, int) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtoumax, uintmax_t, (const char *, char **, int));
+                  (const char *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoumax, uintmax_t,
+                  (const char *restrict, char **restrict, int));
 # else
 #  if !@HAVE_DECL_STRTOUMAX@
 #   undef strtoumax
 _GL_FUNCDECL_SYS (strtoumax, uintmax_t,
-                  (const char *, char **, int) _GL_ARG_NONNULL ((1)));
+                  (const char *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (strtoumax, uintmax_t, (const char *, char **, int));
+_GL_CXXALIAS_SYS (strtoumax, uintmax_t,
+                  (const char *restrict, char **restrict, int));
 # endif
 _GL_CXXALIASWARN (strtoumax);
 #elif defined GNULIB_POSIXCHECK
diff --git a/lib/isnan.c b/lib/isnan.c
index c399c18..ed3452f 100644
--- a/lib/isnan.c
+++ b/lib/isnan.c
@@ -1,17 +1,17 @@
 /* Test for NaN that does not need libm.
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2007.  */
diff --git a/lib/isnand-nolibm.h b/lib/isnand-nolibm.h
index 174c61e..df64f4e 100644
--- a/lib/isnand-nolibm.h
+++ b/lib/isnand-nolibm.h
@@ -1,24 +1,24 @@
 /* Test for NaN that does not need libm.
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if HAVE_ISNAND_IN_LIBC
 /* Get declaration of isnan macro.  */
 # include <math.h>
-# if __GNUC__ >= 4
-   /* GCC 4.0 and newer provides three built-ins for isnan.  */
+# if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+   /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.  */
 #  undef isnand
 #  define isnand(x) __builtin_isnan ((double)(x))
 # else
diff --git a/lib/isnand.c b/lib/isnand.c
index c3cd315..7c5df90 100644
--- a/lib/isnand.c
+++ b/lib/isnand.c
@@ -1,17 +1,17 @@
 /* Test for NaN that does not need libm.
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2008.  */
diff --git a/lib/isnanf-nolibm.h b/lib/isnanf-nolibm.h
index 73937a2..bd85811 100644
--- a/lib/isnanf-nolibm.h
+++ b/lib/isnanf-nolibm.h
@@ -1,26 +1,27 @@
 /* Test for NaN that does not need libm.
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if HAVE_ISNANF_IN_LIBC
 /* Get declaration of isnan macro or (older) isnanf function.  */
 # include <math.h>
-# if __GNUC__ >= 4
-   /* GCC 4.0 and newer provides three built-ins for isnan.  */
+# if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+   /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
+      GCC >= 4.0 also provides __builtin_isnanf, but clang doesn't.  */
 #  undef isnanf
-#  define isnanf(x) __builtin_isnanf ((float)(x))
+#  define isnanf(x) __builtin_isnan ((float)(x))
 # elif defined isnan
 #  undef isnanf
 #  define isnanf(x) isnan ((float)(x))
diff --git a/lib/isnanf.c b/lib/isnanf.c
index 8bc58eb..3b60340 100644
--- a/lib/isnanf.c
+++ b/lib/isnanf.c
@@ -1,17 +1,17 @@
 /* Test for NaN that does not need libm.
-   Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2007.  */
diff --git a/lib/isnanl-nolibm.h b/lib/isnanl-nolibm.h
index fdedf56..41fe156 100644
--- a/lib/isnanl-nolibm.h
+++ b/lib/isnanl-nolibm.h
@@ -1,26 +1,27 @@
 /* Test for NaN that does not need libm.
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if HAVE_ISNANL_IN_LIBC
 /* Get declaration of isnan macro or (older) isnanl function.  */
 # include <math.h>
-# if __GNUC__ >= 4
-   /* GCC 4.0 and newer provides three built-ins for isnan.  */
+# if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+   /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
+      GCC >= 4.0 also provides __builtin_isnanl, but clang doesn't.  */
 #  undef isnanl
-#  define isnanl(x) __builtin_isnanl ((long double)(x))
+#  define isnanl(x) __builtin_isnan ((long double)(x))
 # elif defined isnan
 #  undef isnanl
 #  define isnanl(x) isnan ((long double)(x))
diff --git a/lib/isnanl.c b/lib/isnanl.c
index 99afd29..e8dedf0 100644
--- a/lib/isnanl.c
+++ b/lib/isnanl.c
@@ -1,17 +1,17 @@
 /* Test for NaN that does not need libm.
-   Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2007.  */
diff --git a/lib/iswblank.c b/lib/iswblank.c
index 6d7a6df..55628ec 100644
--- a/lib/iswblank.c
+++ b/lib/iswblank.c
@@ -1,18 +1,18 @@
 /* Test wide character for being blank.
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
diff --git a/lib/iswdigit.c b/lib/iswdigit.c
new file mode 100644
index 0000000..8ec9a6e
--- /dev/null
+++ b/lib/iswdigit.c
@@ -0,0 +1,26 @@
+/* Test wide character for being a digit.
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <wctype.h>
+
+int
+iswdigit (wint_t wc)
+{
+  return wc >= '0' && wc <= '9';
+}
diff --git a/lib/iswxdigit.c b/lib/iswxdigit.c
new file mode 100644
index 0000000..fcdcdba
--- /dev/null
+++ b/lib/iswxdigit.c
@@ -0,0 +1,33 @@
+/* Test wide character for being a hexadecimal digit.
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <wctype.h>
+
+int
+iswxdigit (wint_t wc)
+{
+  return ((wc >= '0' && wc <= '9')
+#if 'A' == 0x41 && 'a' == 0x61
+          /* Optimization, assuming ASCII */
+          || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F')
+#else
+          || (wc >= 'A' && wc <= 'F') || (wc >= 'a' && wc <= 'f')
+#endif
+         );
+}
diff --git a/lib/itold.c b/lib/itold.c
index bca01eb..7984866 100644
--- a/lib/itold.c
+++ b/lib/itold.c
@@ -1,18 +1,18 @@
 /* Replacement for 'int' to 'long double' conversion routine.
-   Copyright (C) 2011-2019 Free Software Foundation, Inc.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2011.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/lc-charset-dispatch.c b/lib/lc-charset-dispatch.c
new file mode 100644
index 0000000..88a0bd3
--- /dev/null
+++ b/lib/lc-charset-dispatch.c
@@ -0,0 +1,82 @@
+/* Dispatching based on the current locale's character encoding.
+   Copyright (C) 2018-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2018.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "lc-charset-dispatch.h"
+
+#if GNULIB_defined_mbstate_t
+
+# include "localcharset.h"
+# include "streq.h"
+
+# if GNULIB_WCHAR_SINGLE_LOCALE
+/* When we know that the locale does not change, provide a speedup by
+   caching the value of locale_encoding_classification.  */
+#  define locale_encoding_classification_cached locale_encoding_classification
+# else
+/* By default, don't make assumptions, hence no caching.  */
+#  define locale_encoding_classification_uncached locale_encoding_classification
+# endif
+
+# if GNULIB_WCHAR_SINGLE_LOCALE
+static inline
+# endif
+enc_t
+locale_encoding_classification_uncached (void)
+{
+  const char *encoding = locale_charset ();
+  if (STREQ_OPT (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0))
+    return enc_utf8;
+  if (STREQ_OPT (encoding, "EUC-JP", 'E', 'U', 'C', '-', 'J', 'P', 0, 0, 0))
+    return enc_eucjp;
+  if (STREQ_OPT (encoding, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
+      || STREQ_OPT (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0)
+      || STREQ_OPT (encoding, "BIG5", 'B', 'I', 'G', '5', 0, 0, 0, 0, 0))
+    return enc_94;
+  if (STREQ_OPT (encoding, "EUC-TW", 'E', 'U', 'C', '-', 'T', 'W', 0, 0, 0))
+    return enc_euctw;
+  if (STREQ_OPT (encoding, "GB18030", 'G', 'B', '1', '8', '0', '3', '0', 0, 0))
+    return enc_gb18030;
+  if (STREQ_OPT (encoding, "SJIS", 'S', 'J', 'I', 'S', 0, 0, 0, 0, 0))
+    return enc_sjis;
+  return enc_other;
+}
+
+# if GNULIB_WCHAR_SINGLE_LOCALE
+
+static int cached_locale_enc = -1;
+
+enc_t
+locale_encoding_classification_cached (void)
+{
+  if (cached_locale_enc < 0)
+    cached_locale_enc = locale_encoding_classification_uncached ();
+  return cached_locale_enc;
+}
+
+# endif
+
+#else
+
+/* This declaration is solely to ensure that after preprocessing
+   this file is never empty.  */
+typedef int dummy;
+
+#endif
diff --git a/lib/lc-charset-dispatch.h b/lib/lc-charset-dispatch.h
new file mode 100644
index 0000000..59b485d
--- /dev/null
+++ b/lib/lc-charset-dispatch.h
@@ -0,0 +1,40 @@
+/* Dispatching based on the current locale's character encoding.
+   Copyright (C) 2018-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2018.  */
+
+#include <wchar.h>
+
+#if GNULIB_defined_mbstate_t
+
+/* A classification of special values of the encoding of the current locale.  */
+typedef enum
+  {
+    enc_other,      /* other */
+    enc_utf8,       /* UTF-8 */
+    enc_eucjp,      /* EUC-JP */
+    enc_94,         /* EUC-KR, GB2312, BIG5 */
+    enc_euctw,      /* EUC-TW */
+    enc_gb18030,    /* GB18030 */
+    enc_sjis        /* SJIS */
+  }
+  enc_t;
+
+/* Returns a classification of special values of the encoding of the current
+   locale.  */
+extern enc_t locale_encoding_classification (void);
+
+#endif
diff --git a/lib/ldexpl.c b/lib/ldexpl.c
index 05a05ca..6f9ce9d 100644
--- a/lib/ldexpl.c
+++ b/lib/ldexpl.c
@@ -1,21 +1,21 @@
 /* Emulation for ldexpl.
    Contributed by Paolo Bonzini
 
-   Copyright 2002-2003, 2007-2019 Free Software Foundation, Inc.
+   Copyright 2002-2003, 2007-2021 Free Software Foundation, Inc.
 
    This file is part of gnulib.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/libc-config.h b/lib/libc-config.h
index 57c6966..886c11f 100644
--- a/lib/libc-config.h
+++ b/lib/libc-config.h
@@ -1,18 +1,18 @@
 /* System definitions for code taken from the GNU C Library
 
-   Copyright 2017-2019 Free Software Foundation, Inc.
+   Copyright 2017-2021 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public
+   modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
-   version 3 of the License, or (at your option) any later version.
+   version 2.1 of the License, or (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
+   You should have received a copy of the GNU Lesser General Public
    License along with this program; if not, see
    <https://www.gnu.org/licenses/>.  */
 
@@ -28,14 +28,17 @@
 
    When compiled as part of glibc this is a no-op; when compiled as
    part of Gnulib this includes Gnulib's <config.h> and defines macros
-   that glibc library code would normally assume.  */
+   that glibc library code would normally assume.
+
+   Note: This header file MUST NOT be included by public header files
+   of Gnulib.  */
 
 #include <config.h>
 
 /* On glibc this includes <features.h> and <sys/cdefs.h> and #defines
-   _FEATURES_H, __WORDSIZE, and __set_errno.  On FreeBSD 11 it
-   includes <sys/cdefs.h> which defines __nonnull.  Elsewhere it
-   is harmless.  */
+   _FEATURES_H, __WORDSIZE, and __set_errno.  On FreeBSD 11 and
+   DragonFlyBSD 5.9 it includes <sys/cdefs.h> which defines __nonnull.
+   Elsewhere it is harmless.  */
 #include <errno.h>
 
 /* From glibc <errno.h>.  */
@@ -55,114 +58,127 @@
 
 #ifndef __glibc_clang_prereq
 # if defined __clang_major__ && defined __clang_minor__
-#  define __glibc_clang_prereq(maj, min) \
-     ((maj) < __clang_major__ + ((min) <= __clang_minor__))
+#  ifdef __apple_build_version__
+/* Apple for some reason renumbers __clang_major__ and __clang_minor__.
+   Gnulib code uses only __glibc_clang_prereq (3, 5); map it to
+   6000000 <= __apple_build_version__.  Support for other calls to
+   __glibc_clang_prereq can be added here as needed.  */
+#   define __glibc_clang_prereq(maj, min) \
+      ((maj) == 3 && (min) == 5 ? 6000000 <= __apple_build_version__ : 0)
+#  else
+#   define __glibc_clang_prereq(maj, min) \
+      ((maj) < __clang_major__ + ((min) <= __clang_minor__))
+#  endif
 # else
 #  define __glibc_clang_prereq(maj, min) 0
 # endif
 #endif
 
-
-/* Prepare to include <cdefs.h>, which is our copy of glibc
-   <sys/cdefs.h>.  */
+#ifndef __attribute_nonnull__
+/* <sys/cdefs.h> either does not exist, or is too old for Gnulib.
+   Prepare to include <cdefs.h>, which is Gnulib's version of a
+   more-recent glibc <sys/cdefs.h>.  */
 
 /* Define _FEATURES_H so that <cdefs.h> does not include <features.h>.  */
-#ifndef _FEATURES_H
-# define _FEATURES_H 1
-#endif
-/* Define __WORDSIZE so that <cdefs.h> does not attempt to include
-   nonexistent files.  Make it a syntax error, since Gnulib does not
-   use __WORDSIZE now, and if Gnulib uses it later the syntax error
-   will let us know that __WORDSIZE needs configuring.  */
-#ifndef __WORDSIZE
-# define __WORDSIZE %%%
-#endif
+# ifndef _FEATURES_H
+#  define _FEATURES_H 1
+# endif
+/* Define __GNULIB_CDEFS so that <cdefs.h> does not attempt to include
+   nonexistent files.  */
+# define __GNULIB_CDEFS
 /* Undef the macros unconditionally defined by our copy of glibc
    <sys/cdefs.h>, so that they do not clash with any system-defined
    versions.  */
-#undef _SYS_CDEFS_H
-#undef __ASMNAME
-#undef __ASMNAME2
-#undef __BEGIN_DECLS
-#undef __CONCAT
-#undef __END_DECLS
-#undef __HAVE_GENERIC_SELECTION
-#undef __LDBL_COMPAT
-#undef __LDBL_REDIR
-#undef __LDBL_REDIR1
-#undef __LDBL_REDIR1_DECL
-#undef __LDBL_REDIR1_NTH
-#undef __LDBL_REDIR_DECL
-#undef __LDBL_REDIR_NTH
-#undef __LEAF
-#undef __LEAF_ATTR
-#undef __NTH
-#undef __NTHNL
-#undef __P
-#undef __PMT
-#undef __REDIRECT
-#undef __REDIRECT_LDBL
-#undef __REDIRECT_NTH
-#undef __REDIRECT_NTHNL
-#undef __REDIRECT_NTH_LDBL
-#undef __STRING
-#undef __THROW
-#undef __THROWNL
-#undef __always_inline
-#undef __attribute__
-#undef __attribute_alloc_size__
-#undef __attribute_artificial__
-#undef __attribute_const__
-#undef __attribute_deprecated__
-#undef __attribute_deprecated_msg__
-#undef __attribute_format_arg__
-#undef __attribute_format_strfmon__
-#undef __attribute_malloc__
-#undef __attribute_noinline__
-#undef __attribute_nonstring__
-#undef __attribute_pure__
-#undef __attribute_used__
-#undef __attribute_warn_unused_result__
-#undef __bos
-#undef __bos0
-#undef __errordecl
-#undef __extension__
-#undef __extern_always_inline
-#undef __extern_inline
-#undef __flexarr
-#undef __fortify_function
-#undef __glibc_c99_flexarr_available
-#undef __glibc_clang_has_extension
-#undef __glibc_likely
-#undef __glibc_macro_warning
-#undef __glibc_macro_warning1
-#undef __glibc_unlikely
-#undef __inline
-#undef __ptr_t
-#undef __restrict
-#undef __restrict_arr
-#undef __va_arg_pack
-#undef __va_arg_pack_len
-#undef __warnattr
-#undef __warndecl
+# undef _SYS_CDEFS_H
+# undef __ASMNAME
+# undef __ASMNAME2
+# undef __BEGIN_DECLS
+# undef __CONCAT
+# undef __END_DECLS
+# undef __HAVE_GENERIC_SELECTION
+# undef __LDBL_COMPAT
+# undef __LDBL_REDIR
+# undef __LDBL_REDIR1
+# undef __LDBL_REDIR1_DECL
+# undef __LDBL_REDIR1_NTH
+# undef __LDBL_REDIR2_DECL
+# undef __LDBL_REDIR_DECL
+# undef __LDBL_REDIR_NTH
+# undef __LEAF
+# undef __LEAF_ATTR
+# undef __NTH
+# undef __NTHNL
+# undef __REDIRECT
+# undef __REDIRECT_LDBL
+# undef __REDIRECT_NTH
+# undef __REDIRECT_NTHNL
+# undef __REDIRECT_NTH_LDBL
+# undef __STRING
+# undef __THROW
+# undef __THROWNL
+# undef __attr_access
+# undef __attr_access_none
+# undef __attr_dealloc
+# undef __attr_dealloc_free
+# undef __attribute__
+# undef __attribute_alloc_size__
+# undef __attribute_artificial__
+# undef __attribute_const__
+# undef __attribute_deprecated__
+# undef __attribute_deprecated_msg__
+# undef __attribute_format_arg__
+# undef __attribute_format_strfmon__
+# undef __attribute_malloc__
+# undef __attribute_noinline__
+# undef __attribute_nonstring__
+# undef __attribute_pure__
+# undef __attribute_returns_twice__
+# undef __attribute_used__
+# undef __attribute_warn_unused_result__
+# undef __bos
+# undef __bos0
+# undef __errordecl
+# undef __extension__
+# undef __extern_always_inline
+# undef __extern_inline
+# undef __flexarr
+# undef __fortify_function
+# undef __glibc_c99_flexarr_available
+# undef __glibc_has_attribute
+# undef __glibc_has_builtin
+# undef __glibc_has_extension
+# undef __glibc_macro_warning
+# undef __glibc_macro_warning1
+# undef __glibc_objsize
+# undef __glibc_objsize0
+# undef __glibc_unlikely
+# undef __inline
+# undef __ptr_t
+# undef __restrict
+# undef __restrict_arr
+# undef __va_arg_pack
+# undef __va_arg_pack_len
+# undef __warnattr
 
 /* Include our copy of glibc <sys/cdefs.h>.  */
-#include <cdefs.h>
+# include <cdefs.h>
 
 /* <cdefs.h> __inline is too pessimistic for non-GCC.  */
-#undef __inline
-#ifndef HAVE___INLINE
-# if 199901 <= __STDC_VERSION__ || defined inline
-#  define __inline inline
-# else
-#  define __inline
+# undef __inline
+# ifndef HAVE___INLINE
+#  if 199901 <= __STDC_VERSION__ || defined inline
+#   define __inline inline
+#  else
+#   define __inline
+#  endif
 # endif
-#endif
+
+#endif /* defined __glibc_likely */
 
 
 /* A substitute for glibc <libc-symbols.h>, good enough for Gnulib.  */
 #define attribute_hidden
-#define libc_hidden_proto(name, ...)
+#define libc_hidden_proto(name)
 #define libc_hidden_def(name)
 #define libc_hidden_weak(name)
 #define libc_hidden_ver(local, name)
@@ -171,4 +187,5 @@
 
 /* A substitute for glibc <shlib-compat.h>, good enough for Gnulib.  */
 #define SHLIB_COMPAT(lib, introduced, obsoleted) 0
-#define versioned_symbol(lib, local, symbol, version)
+#define compat_symbol(lib, local, symbol, version) extern int dummy
+#define versioned_symbol(lib, local, symbol, version) extern int dummy
diff --git a/lib/limits.in.h b/lib/limits.in.h
index 39750b3..2ecafeb 100644
--- a/lib/limits.in.h
+++ b/lib/limits.in.h
@@ -1,30 +1,46 @@
 /* A GNU-like <limits.h>.
 
-   Copyright 2016-2019 Free Software Foundation, Inc.
+   Copyright 2016-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License
-   as published by the Free Software Foundation; either version 3, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
-
-#ifndef _@GUARD_PREFIX@_LIMITS_H
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 @PRAGMA_SYSTEM_HEADER@
 #endif
 @PRAGMA_COLUMNS@
 
-/* The include_next requires a split double-inclusion guard.  */
+#if defined _GL_ALREADY_INCLUDING_LIMITS_H
+/* Special invocation convention:
+   On Haiku/x86_64, we have a sequence of nested includes
+   <limits.h> -> <syslimits.h> -> <limits.h>.
+   In this situation, LONG_MAX and INT_MAX are not yet defined,
+   therefore we should not attempt to define LONG_BIT.  */
+
 #@INCLUDE_NEXT@ @NEXT_LIMITS_H@
 
+#else
+/* Normal invocation convention.  */
+
+#ifndef _@GUARD_PREFIX@_LIMITS_H
+
+# define _GL_ALREADY_INCLUDING_LIMITS_H
+
+/* The include_next requires a split double-inclusion guard.  */
+# @INCLUDE_NEXT@ @NEXT_LIMITS_H@
+
+# undef _GL_ALREADY_INCLUDING_LIMITS_H
+
 #ifndef _@GUARD_PREFIX@_LIMITS_H
 #define _@GUARD_PREFIX@_LIMITS_H
 
@@ -83,10 +99,11 @@
 # endif
 #endif
 
-/* Macros specified by ISO/IEC TS 18661-1:2014.  */
+/* Macros specified by C2x and by ISO/IEC TS 18661-1:2014.  */
 
 #if (! defined ULLONG_WIDTH                                             \
-     && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__))
+     && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__ \
+         || (defined __STDC_VERSION__ && 201710 < __STDC_VERSION__)))
 # define CHAR_WIDTH _GL_INTEGER_WIDTH (CHAR_MIN, CHAR_MAX)
 # define SCHAR_WIDTH _GL_INTEGER_WIDTH (SCHAR_MIN, SCHAR_MAX)
 # define UCHAR_WIDTH _GL_INTEGER_WIDTH (0, UCHAR_MAX)
@@ -98,7 +115,17 @@
 # define ULONG_WIDTH _GL_INTEGER_WIDTH (0, ULONG_MAX)
 # define LLONG_WIDTH _GL_INTEGER_WIDTH (LLONG_MIN, LLONG_MAX)
 # define ULLONG_WIDTH _GL_INTEGER_WIDTH (0, ULLONG_MAX)
-#endif /* !ULLONG_WIDTH && (_GNU_SOURCE || __STDC_WANT_IEC_60559_BFP_EXT__) */
+#endif
+
+/* Macros specified by C2x.  */
+
+#if (! defined BOOL_WIDTH \
+     && (defined _GNU_SOURCE \
+         || (defined __STDC_VERSION__ && 201710 < __STDC_VERSION__)))
+# define BOOL_MAX 1
+# define BOOL_WIDTH 1
+#endif
 
 #endif /* _@GUARD_PREFIX@_LIMITS_H */
 #endif /* _@GUARD_PREFIX@_LIMITS_H */
+#endif
diff --git a/lib/local.mk b/lib/local.mk
index 8112080..792a2bf 100644
--- a/lib/local.mk
+++ b/lib/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2001-2015, 2018-2019 Free Software Foundation, Inc.
+## Copyright (C) 2001-2015, 2018-2021 Free Software Foundation, Inc.
 ##
 ## This program is free software: you can redistribute it and/or modify
 ## it under the terms of the GNU General Public License as published by
@@ -11,7 +11,7 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 include lib/gnulib.mk
 
diff --git a/lib/localcharset.c b/lib/localcharset.c
index f44d8d8..3c50858 100644
--- a/lib/localcharset.c
+++ b/lib/localcharset.c
@@ -1,19 +1,19 @@
 /* Determine a canonical name for the current locale's character encoding.
 
-   Copyright (C) 2000-2006, 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2000-2006, 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>.  */
 
@@ -58,6 +58,9 @@
 #elif defined WINDOWS_NATIVE
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
+  /* For the use of setlocale() below, the Gnulib override in setlocale.c is
+     not needed; see the platform lists in setlocale_null.m4.  */
+# undef setlocale
 #endif
 #if defined OS2
 # define INCL_DOS
@@ -78,7 +81,7 @@
 /* With glibc-2.1 or newer, we don't need any canonicalization,
    because glibc has iconv and both glibc and libiconv support all
    GNU canonical names directly.  */
-# if !((defined __GNU_LIBRARY__ && __GLIBC__ >= 2) || defined __UCLIBC__ || defined MUSL)
+# if !((defined __GNU_LIBRARY__ && __GLIBC__ >= 2) || defined __UCLIBC__)
 
 struct table_entry
 {
@@ -150,7 +153,8 @@
     { "ISO8859-2",  "ISO-8859-2" },
     { "ISO8859-4",  "ISO-8859-4" },
     { "ISO8859-5",  "ISO-8859-5" },
-    { "ISO8859-7",  "ISO-8859-7" }
+    { "ISO8859-7",  "ISO-8859-7" },
+    { "US-ASCII",   "ASCII" }
 #   define alias_table_defined
 #  endif
 #  if defined __APPLE__ && defined __MACH__                 /* Mac OS X */
@@ -812,8 +816,11 @@
 
 
 /* Determine the current locale's character encoding, and canonicalize it
-   into one of the canonical names listed in localcharset.h.
-   The result must not be freed; it is statically allocated.
+   into one of the canonical names listed below.
+   The result must not be freed; it is statically allocated.  The result
+   becomes invalid when setlocale() is used to change the global locale, or
+   when the value of one of the environment variables LC_ALL, LC_CTYPE, LANG
+   is changed; threads in multithreaded programs should not do this.
    If the canonical name cannot be determined, the result is a non-canonical
    name.  */
 
@@ -825,6 +832,13 @@
 {
   const char *codeset;
 
+  /* This function must be multithread-safe.  To achieve this without using
+     thread-local storage, we use a simple strcpy or memcpy to fill this static
+     buffer.  Filling it through, for example, strcpy + strcat would not be
+     guaranteed to leave the buffer's contents intact if another thread is
+     currently accessing it.  If necessary, the contents is first assembled in
+     a stack-allocated buffer.  */
+
 #if HAVE_LANGINFO_CODESET || defined WINDOWS_NATIVE || defined OS2
 
 # if HAVE_LANGINFO_CODESET
@@ -839,7 +853,7 @@
   if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0)
     {
       const char *locale;
-      static char buf[2 + 10 + 1];
+      static char resultbuf[2 + 10 + 1];
 
       locale = getenv ("LC_ALL");
       if (locale == NULL || locale[0] == '\0')
@@ -863,11 +877,12 @@
               modifier = strchr (dot, '@');
               if (modifier == NULL)
                 return dot;
-              if (modifier - dot < sizeof (buf))
+              if (modifier - dot < sizeof (resultbuf))
                 {
-                  memcpy (buf, dot, modifier - dot);
-                  buf [modifier - dot] = '\0';
-                  return buf;
+                  /* This way of filling resultbuf is multithread-safe.  */
+                  memcpy (resultbuf, dot, modifier - dot);
+                  resultbuf [modifier - dot] = '\0';
+                  return resultbuf;
                 }
             }
         }
@@ -883,8 +898,13 @@
          converting to GetConsoleOutputCP().  This leads to correct results,
          except when SetConsoleOutputCP has been called and a raster font is
          in use.  */
-      sprintf (buf, "CP%u", GetACP ());
-      codeset = buf;
+      {
+        char buf[2 + 10 + 1];
+
+        sprintf (buf, "CP%u", GetACP ());
+        strcpy (resultbuf, buf);
+        codeset = resultbuf;
+      }
     }
 #  endif
 
@@ -894,34 +914,28 @@
 
 # elif defined WINDOWS_NATIVE
 
-  static char buf[2 + 10 + 1];
+  char buf[2 + 10 + 1];
+  static char resultbuf[2 + 10 + 1];
 
   /* The Windows API has a function returning the locale's codepage as
      a number, but the value doesn't change according to what the
      'setlocale' call specified.  So we use it as a last resort, in
      case the string returned by 'setlocale' doesn't specify the
      codepage.  */
-  char *current_locale = setlocale (LC_ALL, NULL);
-  char *pdot;
+  char *current_locale = setlocale (LC_CTYPE, NULL);
+  char *pdot = strrchr (current_locale, '.');
 
-  /* If they set different locales for different categories,
-     'setlocale' will return a semi-colon separated list of locale
-     values.  To make sure we use the correct one, we choose LC_CTYPE.  */
-  if (strchr (current_locale, ';'))
-    current_locale = setlocale (LC_CTYPE, NULL);
-
-  pdot = strrchr (current_locale, '.');
   if (pdot && 2 + strlen (pdot + 1) + 1 <= sizeof (buf))
     sprintf (buf, "CP%s", pdot + 1);
   else
     {
       /* The Windows API has a function returning the locale's codepage as a
-        number: GetACP().
-        When the output goes to a console window, it needs to be provided in
-        GetOEMCP() encoding if the console is using a raster font, or in
-        GetConsoleOutputCP() encoding if it is using a TrueType font.
-        But in GUI programs and for output sent to files and pipes, GetACP()
-        encoding is the best bet.  */
+         number: GetACP().
+         When the output goes to a console window, it needs to be provided in
+         GetOEMCP() encoding if the console is using a raster font, or in
+         GetConsoleOutputCP() encoding if it is using a TrueType font.
+         But in GUI programs and for output sent to files and pipes, GetACP()
+         encoding is the best bet.  */
       sprintf (buf, "CP%u", GetACP ());
     }
   /* For a locale name such as "French_France.65001", in Windows 10,
@@ -929,12 +943,15 @@
   if (strcmp (buf + 2, "65001") == 0 || strcmp (buf + 2, "utf8") == 0)
     codeset = "UTF-8";
   else
-    codeset = buf;
+    {
+      strcpy (resultbuf, buf);
+      codeset = resultbuf;
+    }
 
 # elif defined OS2
 
   const char *locale;
-  static char buf[2 + 10 + 1];
+  static char resultbuf[2 + 10 + 1];
   ULONG cp[3];
   ULONG cplen;
 
@@ -963,11 +980,12 @@
           modifier = strchr (dot, '@');
           if (modifier == NULL)
             return dot;
-          if (modifier - dot < sizeof (buf))
+          if (modifier - dot < sizeof (resultbuf))
             {
-              memcpy (buf, dot, modifier - dot);
-              buf [modifier - dot] = '\0';
-              return buf;
+              /* This way of filling resultbuf is multithread-safe.  */
+              memcpy (resultbuf, dot, modifier - dot);
+              resultbuf [modifier - dot] = '\0';
+              return resultbuf;
             }
         }
 
@@ -983,8 +1001,11 @@
         codeset = "";
       else
         {
+          char buf[2 + 10 + 1];
+
           sprintf (buf, "CP%u", cp[0]);
-          codeset = buf;
+          strcpy (resultbuf, buf);
+          codeset = resultbuf;
         }
     }
 
diff --git a/lib/localcharset.h b/lib/localcharset.h
index 7d0d771..0ff4954 100644
--- a/lib/localcharset.h
+++ b/lib/localcharset.h
@@ -1,19 +1,19 @@
 /* Determine a canonical name for the current locale's character encoding.
-   Copyright (C) 2000-2003, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2000-2003, 2009-2021 Free Software Foundation, Inc.
    This file is part of the GNU CHARSET Library.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _LOCALCHARSET_H
 #define _LOCALCHARSET_H
@@ -26,7 +26,10 @@
 
 /* Determine the current locale's character encoding, and canonicalize it
    into one of the canonical names listed below.
-   The result must not be freed; it is statically allocated.
+   The result must not be freed; it is statically allocated.  The result
+   becomes invalid when setlocale() is used to change the global locale, or
+   when the value of one of the environment variables LC_ALL, LC_CTYPE, LANG
+   is changed; threads in multithreaded programs should not do this.
    If the canonical name cannot be determined, the result is a non-canonical
    name.  */
 extern const char * locale_charset (void);
@@ -45,15 +48,15 @@
                                     (darwin = Mac OS X, windows = native Windows)
 
    ASCII, ANSI_X3.4-1968       glibc solaris freebsd netbsd darwin minix cygwin
-   ISO-8859-1              Y   glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
-   ISO-8859-2              Y   glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
+   ISO-8859-1              Y   glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin zos
+   ISO-8859-2              Y   glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin zos
    ISO-8859-3              Y   glibc solaris cygwin
    ISO-8859-4              Y   hpux osf solaris freebsd netbsd openbsd darwin
-   ISO-8859-5              Y   glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
+   ISO-8859-5              Y   glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin zos
    ISO-8859-6              Y   glibc aix hpux solaris cygwin
-   ISO-8859-7              Y   glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
-   ISO-8859-8              Y   glibc aix hpux osf solaris cygwin
-   ISO-8859-9              Y   glibc aix hpux irix osf solaris freebsd darwin cygwin
+   ISO-8859-7              Y   glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin zos
+   ISO-8859-8              Y   glibc aix hpux osf solaris cygwin zos
+   ISO-8859-9              Y   glibc aix hpux irix osf solaris freebsd darwin cygwin zos
    ISO-8859-13                 glibc hpux solaris freebsd netbsd openbsd darwin cygwin
    ISO-8859-14                 glibc cygwin
    ISO-8859-15                 glibc aix irix osf solaris freebsd netbsd openbsd darwin cygwin
@@ -76,7 +79,7 @@
    CP874                       windows dos
    CP922                       aix
    CP932                       aix cygwin windows dos
-   CP943                       aix
+   CP943                       aix zos
    CP949                       osf darwin windows dos
    CP950                       windows dos
    CP1046                      aix
@@ -92,17 +95,17 @@
    CP1255                      glibc windows
    CP1256                      windows
    CP1257                      windows
-   GB2312                  Y   glibc aix hpux irix solaris freebsd netbsd darwin cygwin
+   GB2312                  Y   glibc aix hpux irix solaris freebsd netbsd darwin cygwin zos
    EUC-JP                  Y   glibc aix hpux irix osf solaris freebsd netbsd darwin cygwin
-   EUC-KR                  Y   glibc aix hpux irix osf solaris freebsd netbsd darwin cygwin
+   EUC-KR                  Y   glibc aix hpux irix osf solaris freebsd netbsd darwin cygwin zos
    EUC-TW                      glibc aix hpux irix osf solaris netbsd
-   BIG5                    Y   glibc aix hpux osf solaris freebsd netbsd darwin cygwin
+   BIG5                    Y   glibc aix hpux osf solaris freebsd netbsd darwin cygwin zos
    BIG5-HKSCS                  glibc hpux solaris netbsd darwin
    GBK                         glibc aix osf solaris freebsd darwin cygwin windows dos
    GB18030                     glibc hpux solaris freebsd netbsd darwin
    SHIFT_JIS               Y   hpux osf solaris freebsd netbsd darwin
    JOHAB                       glibc solaris windows
-   TIS-620                     glibc aix hpux osf solaris cygwin
+   TIS-620                     glibc aix hpux osf solaris cygwin zos
    VISCII                  Y   glibc
    TCVN5712-1                  glibc
    ARMSCII-8                   glibc freebsd netbsd darwin
@@ -116,7 +119,7 @@
    HP-KANA8                    hpux
    DEC-KANJI                   osf
    DEC-HANYU                   osf
-   UTF-8                   Y   glibc aix hpux osf solaris netbsd darwin cygwin
+   UTF-8                   Y   glibc aix hpux osf solaris netbsd darwin cygwin zos
 
    Note: Names which are not marked as being a MIME name should not be used in
    Internet protocols for information interchange (mail, news, etc.).
diff --git a/lib/locale.in.h b/lib/locale.in.h
new file mode 100644
index 0000000..1063070
--- /dev/null
+++ b/lib/locale.in.h
@@ -0,0 +1,305 @@
+/* A POSIX <locale.h>.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if (defined _WIN32 && !defined __CYGWIN__ && defined __need_locale_t) \
+    || defined _GL_ALREADY_INCLUDING_LOCALE_H
+
+/* Special invocation convention:
+   - Inside mingw header files,
+   - To handle Solaris header files (through Solaris 10) when combined
+     with gettext's libintl.h.  */
+
+#@INCLUDE_NEXT@ @NEXT_LOCALE_H@
+
+#else
+/* Normal invocation convention.  */
+
+#ifndef _@GUARD_PREFIX@_LOCALE_H
+
+#define _GL_ALREADY_INCLUDING_LOCALE_H
+
+/* The include_next requires a split double-inclusion guard.  */
+#@INCLUDE_NEXT@ @NEXT_LOCALE_H@
+
+#undef _GL_ALREADY_INCLUDING_LOCALE_H
+
+#ifndef _@GUARD_PREFIX@_LOCALE_H
+#define _@GUARD_PREFIX@_LOCALE_H
+
+/* NetBSD 5.0 mis-defines NULL.  */
+#include <stddef.h>
+
+/* Mac OS X 10.5 defines the locale_t type in <xlocale.h>.  */
+#if @HAVE_XLOCALE_H@
+# include <xlocale.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
+/* The LC_MESSAGES locale category is specified in POSIX, but not in ISO C.
+   On systems that don't define it, use the same value as GNU libintl.  */
+#if !defined LC_MESSAGES
+# define LC_MESSAGES 1729
+#endif
+
+/* On native Windows with MSVC, 'struct lconv' lacks the members int_p_* and
+   int_n_*.  Instead of overriding 'struct lconv', merely define these member
+   names as macros.  This avoids trouble in C++ mode.  */
+#if defined _MSC_VER
+# define int_p_cs_precedes   p_cs_precedes
+# define int_p_sign_posn     p_sign_posn
+# define int_p_sep_by_space  p_sep_by_space
+# define int_n_cs_precedes   n_cs_precedes
+# define int_n_sign_posn     n_sign_posn
+# define int_n_sep_by_space  n_sep_by_space
+#endif
+
+/* Bionic libc's 'struct lconv' is just a dummy.  */
+#if @REPLACE_STRUCT_LCONV@
+# define lconv rpl_lconv
+struct lconv
+{
+  /* All 'char *' are actually 'const char *'.  */
+
+  /* Members that depend on the LC_NUMERIC category of the locale.  See
+     <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_04> */
+
+  /* Symbol used as decimal point.  */
+  char *decimal_point;
+  /* Symbol used to separate groups of digits to the left of the decimal
+     point.  */
+  char *thousands_sep;
+  /* Definition of the size of groups of digits to the left of the decimal
+     point.  */
+  char *grouping;
+
+  /* Members that depend on the LC_MONETARY category of the locale.  See
+     <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_03> */
+
+  /* Symbol used as decimal point.  */
+  char *mon_decimal_point;
+  /* Symbol used to separate groups of digits to the left of the decimal
+     point.  */
+  char *mon_thousands_sep;
+  /* Definition of the size of groups of digits to the left of the decimal
+     point.  */
+  char *mon_grouping;
+  /* Sign used to indicate a value >= 0.  */
+  char *positive_sign;
+  /* Sign used to indicate a value < 0.  */
+  char *negative_sign;
+
+  /* For formatting local currency.  */
+  /* Currency symbol (3 characters) followed by separator (1 character).  */
+  char *currency_symbol;
+  /* Number of digits after the decimal point.  */
+  char frac_digits;
+  /* For values >= 0: 1 if the currency symbol precedes the number, 0 if it
+     comes after the number.  */
+  char p_cs_precedes;
+  /* For values >= 0: Position of the sign.  */
+  char p_sign_posn;
+  /* For values >= 0: Placement of spaces between currency symbol, sign, and
+     number.  */
+  char p_sep_by_space;
+  /* For values < 0: 1 if the currency symbol precedes the number, 0 if it
+     comes after the number.  */
+  char n_cs_precedes;
+  /* For values < 0: Position of the sign.  */
+  char n_sign_posn;
+  /* For values < 0: Placement of spaces between currency symbol, sign, and
+     number.  */
+  char n_sep_by_space;
+
+  /* For formatting international currency.  */
+  /* Currency symbol (3 characters) followed by separator (1 character).  */
+  char *int_curr_symbol;
+  /* Number of digits after the decimal point.  */
+  char int_frac_digits;
+  /* For values >= 0: 1 if the currency symbol precedes the number, 0 if it
+     comes after the number.  */
+  char int_p_cs_precedes;
+  /* For values >= 0: Position of the sign.  */
+  char int_p_sign_posn;
+  /* For values >= 0: Placement of spaces between currency symbol, sign, and
+     number.  */
+  char int_p_sep_by_space;
+  /* For values < 0: 1 if the currency symbol precedes the number, 0 if it
+     comes after the number.  */
+  char int_n_cs_precedes;
+  /* For values < 0: Position of the sign.  */
+  char int_n_sign_posn;
+  /* For values < 0: Placement of spaces between currency symbol, sign, and
+     number.  */
+  char int_n_sep_by_space;
+};
+#endif
+
+#if @GNULIB_LOCALECONV@
+# if @REPLACE_LOCALECONV@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef localeconv
+#   define localeconv rpl_localeconv
+#  endif
+_GL_FUNCDECL_RPL (localeconv, struct lconv *, (void));
+_GL_CXXALIAS_RPL (localeconv, struct lconv *, (void));
+# else
+_GL_CXXALIAS_SYS (localeconv, struct lconv *, (void));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (localeconv);
+# endif
+#elif @REPLACE_STRUCT_LCONV@
+# undef localeconv
+# define localeconv localeconv_used_without_requesting_gnulib_module_localeconv
+#elif defined GNULIB_POSIXCHECK
+# undef localeconv
+# if HAVE_RAW_DECL_LOCALECONV
+_GL_WARN_ON_USE (localeconv,
+                 "localeconv returns too few information on some platforms - "
+                 "use gnulib module localeconv for portability");
+# endif
+#endif
+
+#if @GNULIB_SETLOCALE@
+# if @REPLACE_SETLOCALE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef setlocale
+#   define setlocale rpl_setlocale
+#   define GNULIB_defined_setlocale 1
+#  endif
+_GL_FUNCDECL_RPL (setlocale, char *, (int category, const char *locale));
+_GL_CXXALIAS_RPL (setlocale, char *, (int category, const char *locale));
+# else
+_GL_CXXALIAS_SYS (setlocale, char *, (int category, const char *locale));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (setlocale);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef setlocale
+# if HAVE_RAW_DECL_SETLOCALE
+_GL_WARN_ON_USE (setlocale, "setlocale works differently on native Windows - "
+                 "use gnulib module setlocale for portability");
+# endif
+#endif
+
+#if @GNULIB_SETLOCALE_NULL@
+/* Included here for convenience.  */
+# include "setlocale_null.h"
+#endif
+
+#if /*@GNULIB_NEWLOCALE@ ||*/ (@GNULIB_LOCALENAME@ && @LOCALENAME_ENHANCE_LOCALE_FUNCS@ && @HAVE_NEWLOCALE@)
+# if @REPLACE_NEWLOCALE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef newlocale
+#   define newlocale rpl_newlocale
+#   define GNULIB_defined_newlocale 1
+#  endif
+_GL_FUNCDECL_RPL (newlocale, locale_t,
+                  (int category_mask, const char *name, locale_t base)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (newlocale, locale_t,
+                  (int category_mask, const char *name, locale_t base));
+# else
+#  if @HAVE_NEWLOCALE@
+_GL_CXXALIAS_SYS (newlocale, locale_t,
+                  (int category_mask, const char *name, locale_t base));
+#  endif
+# endif
+# if @HAVE_NEWLOCALE@
+_GL_CXXALIASWARN (newlocale);
+# endif
+# if @HAVE_NEWLOCALE@ || @REPLACE_NEWLOCALE@
+#  ifndef HAVE_WORKING_NEWLOCALE
+#   define HAVE_WORKING_NEWLOCALE 1
+#  endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef newlocale
+# if HAVE_RAW_DECL_NEWLOCALE
+_GL_WARN_ON_USE (newlocale, "newlocale is not portable");
+# endif
+#endif
+
+#if @GNULIB_DUPLOCALE@ || (@GNULIB_LOCALENAME@ && @LOCALENAME_ENHANCE_LOCALE_FUNCS@ && @HAVE_DUPLOCALE@)
+# if @REPLACE_DUPLOCALE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef duplocale
+#   define duplocale rpl_duplocale
+#   define GNULIB_defined_duplocale 1
+#  endif
+_GL_FUNCDECL_RPL (duplocale, locale_t, (locale_t locale) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (duplocale, locale_t, (locale_t locale));
+# else
+#  if @HAVE_DUPLOCALE@
+_GL_CXXALIAS_SYS (duplocale, locale_t, (locale_t locale));
+#  endif
+# endif
+# if @HAVE_DUPLOCALE@
+_GL_CXXALIASWARN (duplocale);
+# endif
+# if @HAVE_DUPLOCALE@ || @REPLACE_DUPLOCALE@
+#  ifndef HAVE_WORKING_DUPLOCALE
+#   define HAVE_WORKING_DUPLOCALE 1
+#  endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef duplocale
+# if HAVE_RAW_DECL_DUPLOCALE
+_GL_WARN_ON_USE (duplocale, "duplocale is buggy on some glibc systems - "
+                 "use gnulib module duplocale for portability");
+# endif
+#endif
+
+#if /*@GNULIB_FREELOCALE@ ||*/ (@GNULIB_LOCALENAME@ && @LOCALENAME_ENHANCE_LOCALE_FUNCS@ && @HAVE_FREELOCALE@)
+# if @REPLACE_FREELOCALE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef freelocale
+#   define freelocale rpl_freelocale
+#   define GNULIB_defined_freelocale 1
+#  endif
+_GL_FUNCDECL_RPL (freelocale, void, (locale_t locale) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (freelocale, void, (locale_t locale));
+# else
+#  if @HAVE_FREELOCALE@
+/* Need to cast, because on FreeBSD and Mac OS X 10.13, the return type is
+                                   int.  */
+_GL_CXXALIAS_SYS_CAST (freelocale, void, (locale_t locale));
+#  endif
+# endif
+# if @HAVE_FREELOCALE@
+_GL_CXXALIASWARN (freelocale);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef freelocale
+# if HAVE_RAW_DECL_FREELOCALE
+_GL_WARN_ON_USE (freelocale, "freelocale is not portable");
+# endif
+#endif
+
+#endif /* _@GUARD_PREFIX@_LOCALE_H */
+#endif /* _@GUARD_PREFIX@_LOCALE_H */
+#endif /* !(__need_locale_t || _GL_ALREADY_INCLUDING_LOCALE_H) */
diff --git a/lib/localtime-buffer.c b/lib/localtime-buffer.c
deleted file mode 100644
index b65ea45..0000000
--- a/lib/localtime-buffer.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Provide access to the last buffer returned by localtime() or gmtime().
-
-   Copyright (C) 2001-2003, 2005-2007, 2009-2019 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
-
-/* written by Jim Meyering */
-
-#include <config.h>
-
-/* Specification.  */
-#include "localtime-buffer.h"
-
-#if GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME
-
-static struct tm tm_zero_buffer;
-struct tm *localtime_buffer_addr = &tm_zero_buffer;
-
-/* This is a wrapper for localtime.
-
-   On the first call, record the address of the static buffer that
-   localtime uses for its result.  */
-
-struct tm *
-rpl_localtime (time_t const *timep)
-#undef localtime
-{
-  struct tm *tm = localtime (timep);
-
-  if (localtime_buffer_addr == &tm_zero_buffer)
-    localtime_buffer_addr = tm;
-
-  return tm;
-}
-
-/* Same as above, since gmtime and localtime use the same buffer.  */
-struct tm *
-rpl_gmtime (time_t const *timep)
-#undef gmtime
-{
-  struct tm *tm = gmtime (timep);
-
-  if (localtime_buffer_addr == &tm_zero_buffer)
-    localtime_buffer_addr = tm;
-
-  return tm;
-}
-
-#endif
diff --git a/lib/localtime-buffer.h b/lib/localtime-buffer.h
deleted file mode 100644
index 031111a..0000000
--- a/lib/localtime-buffer.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Provide access to the last buffer returned by localtime() or gmtime().
-
-   Copyright (C) 2001-2003, 2005-2007, 2009-2019 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
-
-/* written by Jim Meyering */
-
-#include <time.h>
-
-#if GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME
-
-/* The address of the last buffer returned by localtime() or gmtime().  */
-extern struct tm *localtime_buffer_addr;
-
-#endif
diff --git a/lib/lstat.c b/lib/lstat.c
index a3e40d8..7de0bf1 100644
--- a/lib/lstat.c
+++ b/lib/lstat.c
@@ -1,18 +1,18 @@
 /* Work around a bug of lstat on some systems
 
-   Copyright (C) 1997-2006, 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 1997-2006, 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* written by Jim Meyering */
diff --git a/lib/main.c b/lib/main.c
index f183119..7895ab1 100644
--- a/lib/main.c
+++ b/lib/main.c
@@ -1,6 +1,6 @@
 /* Yacc library main function.
 
-   Copyright (C) 2002, 2009-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 2002, 2009-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include <locale.h>
diff --git a/lib/malloc.c b/lib/malloc.c
index 76e6ff7..0d8b359 100644
--- a/lib/malloc.c
+++ b/lib/malloc.c
@@ -1,51 +1,46 @@
 /* malloc() function that is glibc compatible.
 
-   Copyright (C) 1997-1998, 2006-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 1997-1998, 2006-2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* written by Jim Meyering and Bruno Haible */
 
 #define _GL_USE_STDLIB_ALLOC 1
 #include <config.h>
-/* Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h.  */
-#ifdef malloc
-# define NEED_MALLOC_GNU 1
-# undef malloc
-/* Whereas the gnulib module 'malloc-gnu' defines HAVE_MALLOC_GNU.  */
-#elif GNULIB_MALLOC_GNU && !HAVE_MALLOC_GNU
-# define NEED_MALLOC_GNU 1
-#endif
 
 #include <stdlib.h>
 
 #include <errno.h>
 
-/* Allocate an N-byte block of memory from the heap.
-   If N is zero, allocate a 1-byte block.  */
+#include "xalloc-oversized.h"
+
+/* Allocate an N-byte block of memory from the heap, even if N is 0.  */
 
 void *
 rpl_malloc (size_t n)
 {
-  void *result;
-
-#if NEED_MALLOC_GNU
   if (n == 0)
     n = 1;
-#endif
 
-  result = malloc (n);
+  if (xalloc_oversized (n, 1))
+    {
+      errno = ENOMEM;
+      return NULL;
+    }
+
+  void *result = malloc (n);
 
 #if !HAVE_MALLOC_POSIX
   if (result == NULL)
diff --git a/lib/malloc/scratch_buffer.h b/lib/malloc/scratch_buffer.h
new file mode 100644
index 0000000..36d0bef
--- /dev/null
+++ b/lib/malloc/scratch_buffer.h
@@ -0,0 +1,151 @@
+/* Variable-sized buffer with on-stack default allocation.
+   Copyright (C) 2015-2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _SCRATCH_BUFFER_H
+#define _SCRATCH_BUFFER_H
+
+/* Scratch buffers with a default stack allocation and fallback to
+   heap allocation.  It is expected that this function is used in this
+   way:
+
+     struct scratch_buffer tmpbuf;
+     scratch_buffer_init (&tmpbuf);
+
+     while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
+       if (!scratch_buffer_grow (&tmpbuf))
+	 return -1;
+
+     scratch_buffer_free (&tmpbuf);
+     return 0;
+
+   The allocation functions (scratch_buffer_grow,
+   scratch_buffer_grow_preserve, scratch_buffer_set_array_size) make
+   sure that the heap allocation, if any, is freed, so that the code
+   above does not have a memory leak.  The buffer still remains in a
+   state that can be deallocated using scratch_buffer_free, so a loop
+   like this is valid as well:
+
+     struct scratch_buffer tmpbuf;
+     scratch_buffer_init (&tmpbuf);
+
+     while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
+       if (!scratch_buffer_grow (&tmpbuf))
+	 break;
+
+     scratch_buffer_free (&tmpbuf);
+
+   scratch_buffer_grow and scratch_buffer_grow_preserve are guaranteed
+   to grow the buffer by at least 512 bytes.  This means that when
+   using the scratch buffer as a backing store for a non-character
+   array whose element size, in bytes, is 512 or smaller, the scratch
+   buffer only has to grow once to make room for at least one more
+   element.
+*/
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+/* Scratch buffer.  Must be initialized with scratch_buffer_init
+   before its use.  */
+struct scratch_buffer {
+  void *data;    /* Pointer to the beginning of the scratch area.  */
+  size_t length; /* Allocated space at the data pointer, in bytes.  */
+  union { max_align_t __align; char __c[1024]; } __space;
+};
+
+/* Initializes *BUFFER so that BUFFER->data points to BUFFER->__space
+   and BUFFER->length reflects the available space.  */
+static inline void
+scratch_buffer_init (struct scratch_buffer *buffer)
+{
+  buffer->data = buffer->__space.__c;
+  buffer->length = sizeof (buffer->__space);
+}
+
+/* Deallocates *BUFFER (if it was heap-allocated).  */
+static inline void
+scratch_buffer_free (struct scratch_buffer *buffer)
+{
+  if (buffer->data != buffer->__space.__c)
+    free (buffer->data);
+}
+
+/* Grow *BUFFER by some arbitrary amount.  The buffer contents is NOT
+   preserved.  Return true on success, false on allocation failure (in
+   which case the old buffer is freed).  On success, the new buffer is
+   larger than the previous size.  On failure, *BUFFER is deallocated,
+   but remains in a free-able state, and errno is set.  */
+bool __libc_scratch_buffer_grow (struct scratch_buffer *buffer);
+libc_hidden_proto (__libc_scratch_buffer_grow)
+
+/* Alias for __libc_scratch_buffer_grow.  */
+static __always_inline bool
+scratch_buffer_grow (struct scratch_buffer *buffer)
+{
+  return __glibc_likely (__libc_scratch_buffer_grow (buffer));
+}
+
+/* Like __libc_scratch_buffer_grow, but preserve the old buffer
+   contents on success, as a prefix of the new buffer.  */
+bool __libc_scratch_buffer_grow_preserve (struct scratch_buffer *buffer);
+libc_hidden_proto (__libc_scratch_buffer_grow_preserve)
+
+/* Alias for __libc_scratch_buffer_grow_preserve.  */
+static __always_inline bool
+scratch_buffer_grow_preserve (struct scratch_buffer *buffer)
+{
+  return __glibc_likely (__libc_scratch_buffer_grow_preserve (buffer));
+}
+
+/* Grow *BUFFER so that it can store at least NELEM elements of SIZE
+   bytes.  The buffer contents are NOT preserved.  Both NELEM and SIZE
+   can be zero.  Return true on success, false on allocation failure
+   (in which case the old buffer is freed, but *BUFFER remains in a
+   free-able state, and errno is set).  It is unspecified whether this
+   function can reduce the array size.  */
+bool __libc_scratch_buffer_set_array_size (struct scratch_buffer *buffer,
+					   size_t nelem, size_t size);
+libc_hidden_proto (__libc_scratch_buffer_set_array_size)
+
+/* Alias for __libc_scratch_set_array_size.  */
+static __always_inline bool
+scratch_buffer_set_array_size (struct scratch_buffer *buffer,
+			       size_t nelem, size_t size)
+{
+  return __glibc_likely (__libc_scratch_buffer_set_array_size
+			 (buffer, nelem, size));
+}
+
+/* Return a copy of *BUFFER's first SIZE bytes as a heap-allocated block,
+   deallocating *BUFFER if it was heap-allocated.  SIZE must be at
+   most *BUFFER's size.  Return NULL (setting errno) on memory
+   exhaustion.  */
+void *__libc_scratch_buffer_dupfree (struct scratch_buffer *buffer,
+                                     size_t size);
+libc_hidden_proto (__libc_scratch_buffer_dupfree)
+
+/* Alias for __libc_scratch_dupfree.  */
+static __always_inline void *
+scratch_buffer_dupfree (struct scratch_buffer *buffer, size_t size)
+{
+  void *r = __libc_scratch_buffer_dupfree (buffer, size);
+  return __glibc_likely (r != NULL) ? r : NULL;
+}
+
+#endif /* _SCRATCH_BUFFER_H */
diff --git a/lib/malloc/scratch_buffer_dupfree.c b/lib/malloc/scratch_buffer_dupfree.c
new file mode 100644
index 0000000..07363b9
--- /dev/null
+++ b/lib/malloc/scratch_buffer_dupfree.c
@@ -0,0 +1,41 @@
+/* Variable-sized buffer with on-stack default allocation.
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _LIBC
+# include <libc-config.h>
+#endif
+
+#include <scratch_buffer.h>
+#include <string.h>
+
+void *
+__libc_scratch_buffer_dupfree (struct scratch_buffer *buffer, size_t size)
+{
+  void *data = buffer->data;
+  if (data == buffer->__space.__c)
+    {
+      void *copy = malloc (size);
+      return copy != NULL ? memcpy (copy, data, size) : NULL;
+    }
+  else
+    {
+      void *copy = realloc (data, size);
+      return copy != NULL ? copy : data;
+    }
+}
+libc_hidden_def (__libc_scratch_buffer_dupfree)
diff --git a/lib/malloc/scratch_buffer_grow.c b/lib/malloc/scratch_buffer_grow.c
new file mode 100644
index 0000000..22c8c77
--- /dev/null
+++ b/lib/malloc/scratch_buffer_grow.c
@@ -0,0 +1,56 @@
+/* Variable-sized buffer with on-stack default allocation.
+   Copyright (C) 2015-2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _LIBC
+# include <libc-config.h>
+#endif
+
+#include <scratch_buffer.h>
+#include <errno.h>
+
+bool
+__libc_scratch_buffer_grow (struct scratch_buffer *buffer)
+{
+  void *new_ptr;
+  size_t new_length = buffer->length * 2;
+
+  /* Discard old buffer.  */
+  scratch_buffer_free (buffer);
+
+  /* Check for overflow.  */
+  if (__glibc_likely (new_length >= buffer->length))
+    new_ptr = malloc (new_length);
+  else
+    {
+      __set_errno (ENOMEM);
+      new_ptr = NULL;
+    }
+
+  if (__glibc_unlikely (new_ptr == NULL))
+    {
+      /* Buffer must remain valid to free.  */
+      scratch_buffer_init (buffer);
+      return false;
+    }
+
+  /* Install new heap-based buffer.  */
+  buffer->data = new_ptr;
+  buffer->length = new_length;
+  return true;
+}
+libc_hidden_def (__libc_scratch_buffer_grow)
diff --git a/lib/malloc/scratch_buffer_grow_preserve.c b/lib/malloc/scratch_buffer_grow_preserve.c
new file mode 100644
index 0000000..2b2b819
--- /dev/null
+++ b/lib/malloc/scratch_buffer_grow_preserve.c
@@ -0,0 +1,67 @@
+/* Variable-sized buffer with on-stack default allocation.
+   Copyright (C) 2015-2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _LIBC
+# include <libc-config.h>
+#endif
+
+#include <scratch_buffer.h>
+#include <errno.h>
+#include <string.h>
+
+bool
+__libc_scratch_buffer_grow_preserve (struct scratch_buffer *buffer)
+{
+  size_t new_length = 2 * buffer->length;
+  void *new_ptr;
+
+  if (buffer->data == buffer->__space.__c)
+    {
+      /* Move buffer to the heap.  No overflow is possible because
+	 buffer->length describes a small buffer on the stack.  */
+      new_ptr = malloc (new_length);
+      if (new_ptr == NULL)
+	return false;
+      memcpy (new_ptr, buffer->__space.__c, buffer->length);
+    }
+  else
+    {
+      /* Buffer was already on the heap.  Check for overflow.  */
+      if (__glibc_likely (new_length >= buffer->length))
+	new_ptr = realloc (buffer->data, new_length);
+      else
+	{
+	  __set_errno (ENOMEM);
+	  new_ptr = NULL;
+	}
+
+      if (__glibc_unlikely (new_ptr == NULL))
+	{
+	  /* Deallocate, but buffer must remain valid to free.  */
+	  free (buffer->data);
+	  scratch_buffer_init (buffer);
+	  return false;
+	}
+    }
+
+  /* Install new heap-based buffer.  */
+  buffer->data = new_ptr;
+  buffer->length = new_length;
+  return true;
+}
+libc_hidden_def (__libc_scratch_buffer_grow_preserve)
diff --git a/lib/malloc/scratch_buffer_set_array_size.c b/lib/malloc/scratch_buffer_set_array_size.c
new file mode 100644
index 0000000..a47f927
--- /dev/null
+++ b/lib/malloc/scratch_buffer_set_array_size.c
@@ -0,0 +1,64 @@
+/* Variable-sized buffer with on-stack default allocation.
+   Copyright (C) 2015-2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _LIBC
+# include <libc-config.h>
+#endif
+
+#include <scratch_buffer.h>
+#include <errno.h>
+#include <limits.h>
+
+bool
+__libc_scratch_buffer_set_array_size (struct scratch_buffer *buffer,
+				      size_t nelem, size_t size)
+{
+  size_t new_length = nelem * size;
+
+  /* Avoid overflow check if both values are small. */
+  if ((nelem | size) >> (sizeof (size_t) * CHAR_BIT / 2) != 0
+      && nelem != 0 && size != new_length / nelem)
+    {
+      /* Overflow.  Discard the old buffer, but it must remain valid
+	 to free.  */
+      scratch_buffer_free (buffer);
+      scratch_buffer_init (buffer);
+      __set_errno (ENOMEM);
+      return false;
+    }
+
+  if (new_length <= buffer->length)
+    return true;
+
+  /* Discard old buffer.  */
+  scratch_buffer_free (buffer);
+
+  char *new_ptr = malloc (new_length);
+  if (new_ptr == NULL)
+    {
+      /* Buffer must remain valid to free.  */
+      scratch_buffer_init (buffer);
+      return false;
+    }
+
+  /* Install new heap-based buffer.  */
+  buffer->data = new_ptr;
+  buffer->length = new_length;
+  return true;
+}
+libc_hidden_def (__libc_scratch_buffer_set_array_size)
diff --git a/lib/malloca.c b/lib/malloca.c
index f60c5fb..b488423 100644
--- a/lib/malloca.c
+++ b/lib/malloca.c
@@ -1,19 +1,19 @@
 /* Safe automatic memory allocation.
-   Copyright (C) 2003, 2006-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2006-2007, 2009-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2003, 2018.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #define _GL_USE_STDLIB_ALLOC 1
 #include <config.h>
@@ -21,6 +21,8 @@
 /* Specification.  */
 #include "malloca.h"
 
+#include "idx.h"
+#include "intprops.h"
 #include "verify.h"
 
 /* The speed critical point in this file is freea() applied to an alloca()
@@ -45,24 +47,30 @@
 #if HAVE_ALLOCA
   /* Allocate one more word, used to determine the address to pass to freea(),
      and room for the alignment ≡ sa_alignment_max mod 2*sa_alignment_max.  */
-  size_t nplus = n + sizeof (small_t) + 2 * sa_alignment_max - 1;
-
-  if (nplus >= n)
+  uintptr_t alignment2_mask = 2 * sa_alignment_max - 1;
+  int plus = sizeof (small_t) + alignment2_mask;
+  idx_t nplus;
+  if (!INT_ADD_WRAPV (n, plus, &nplus) && !xalloc_oversized (nplus, 1))
     {
       char *mem = (char *) malloc (nplus);
 
       if (mem != NULL)
         {
-          char *p =
-            (char *)((((uintptr_t)mem + sizeof (small_t) + sa_alignment_max - 1)
-                      & ~(uintptr_t)(2 * sa_alignment_max - 1))
-                     + sa_alignment_max);
+          uintptr_t umem = (uintptr_t)mem, umemplus;
+          /* The INT_ADD_WRAPV avoids signed integer overflow on
+             theoretical platforms where UINTPTR_MAX <= INT_MAX.  */
+          INT_ADD_WRAPV (umem, sizeof (small_t) + sa_alignment_max - 1,
+                         &umemplus);
+          idx_t offset = ((umemplus & ~alignment2_mask)
+                          + sa_alignment_max - umem);
+          void *vp = mem + offset;
+          small_t *p = vp;
           /* Here p >= mem + sizeof (small_t),
              and p <= mem + sizeof (small_t) + 2 * sa_alignment_max - 1
              hence p + n <= mem + nplus.
              So, the memory range [p, p+n) lies in the allocated memory range
              [mem, mem + nplus).  */
-          ((small_t *) p)[-1] = p - mem;
+          p[-1] = offset;
           /* p ≡ sa_alignment_max mod 2*sa_alignment_max.  */
           return p;
         }
diff --git a/lib/malloca.h b/lib/malloca.h
index d80c316..7eb63d2 100644
--- a/lib/malloca.h
+++ b/lib/malloca.h
@@ -1,19 +1,19 @@
 /* Safe automatic memory allocation.
-   Copyright (C) 2003-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003-2007, 2009-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2003.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _MALLOCA_H
 #define _MALLOCA_H
@@ -51,6 +51,13 @@
 # define safe_alloca(N) ((void) (N), NULL)
 #endif
 
+/* Free a block of memory allocated through malloca().  */
+#if HAVE_ALLOCA
+extern void freea (void *p);
+#else
+# define freea free
+#endif
+
 /* malloca(N) is a safe variant of alloca(N).  It allocates N bytes of
    memory allocated on the stack, that must be freed using freea() before
    the function returns.  Upon failure, it returns NULL.  */
@@ -65,20 +72,16 @@
 # define malloca(N) \
   mmalloca (N)
 #endif
-extern void * mmalloca (size_t n);
-
-/* Free a block of memory allocated through malloca().  */
-#if HAVE_ALLOCA
-extern void freea (void *p);
-#else
-# define freea free
-#endif
+extern void *mmalloca (size_t n)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (freea, 1)
+  _GL_ATTRIBUTE_ALLOC_SIZE ((1));
 
 /* nmalloca(N,S) is an overflow-safe variant of malloca (N * S).
    It allocates an array of N objects, each with S bytes of memory,
-   on the stack.  S must be positive and N must be nonnegative.
+   on the stack.  N and S should be nonnegative and free of side effects.
    The array must be freed using freea() before the function returns.  */
-#define nmalloca(n, s) (xalloc_oversized (n, s) ? NULL : malloca ((n) * (s)))
+#define nmalloca(n, s) \
+  (xalloc_oversized (n, s) ? NULL : malloca ((n) * (size_t) (s)))
 
 
 #ifdef __cplusplus
@@ -89,7 +92,7 @@
 /* ------------------- Auxiliary, non-public definitions ------------------- */
 
 /* Determine the alignment of a type at compile time.  */
-#if defined __GNUC__ || defined __IBM__ALIGNOF__
+#if defined __GNUC__ || defined __clang__ || defined __IBM__ALIGNOF__
 # define sa_alignof __alignof__
 #elif defined __cplusplus
   template <class type> struct sa_alignof_helper { char __slot1; type __slot2; };
@@ -112,14 +115,10 @@
    among all elementary types.  */
   sa_alignment_long = sa_alignof (long),
   sa_alignment_double = sa_alignof (double),
-#if HAVE_LONG_LONG_INT
   sa_alignment_longlong = sa_alignof (long long),
-#endif
   sa_alignment_longdouble = sa_alignof (long double),
   sa_alignment_max = ((sa_alignment_long - 1) | (sa_alignment_double - 1)
-#if HAVE_LONG_LONG_INT
                       | (sa_alignment_longlong - 1)
-#endif
                       | (sa_alignment_longdouble - 1)
                      ) + 1
 };
diff --git a/lib/math.c b/lib/math.c
index ba2a6ab..3ffd1d7 100644
--- a/lib/math.c
+++ b/lib/math.c
@@ -1,4 +1,22 @@
+/* Inline functions for <math.h>.
+
+   Copyright (C) 2012-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #include <config.h>
+
 #define _GL_MATH_INLINE _GL_EXTERN_INLINE
 #include "math.h"
 typedef int dummy;
diff --git a/lib/math.in.h b/lib/math.in.h
index 3bb9663..c87cc12 100644
--- a/lib/math.in.h
+++ b/lib/math.in.h
@@ -1,18 +1,18 @@
 /* A GNU-like <math.h>.
 
-   Copyright (C) 2002-2003, 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002-2003, 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _@GUARD_PREFIX@_MATH_H
@@ -22,9 +22,24 @@
 #endif
 @PRAGMA_COLUMNS@
 
-/* The include_next requires a split double-inclusion guard.  */
+#if defined _GL_INCLUDING_MATH_H
+/* Special invocation convention:
+   - On FreeBSD 12.2 we have a sequence of nested includes
+     <math.h> -> <stdlib.h> -> <sys/wait.h> -> <sys/types.h> -> <sys/select.h>
+       -> <signal.h> -> <pthread.h> -> <stdlib.h> -> <math.h>
+     In this situation, the functions are not yet declared, therefore we cannot
+     provide the C++ aliases.  */
+
 #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_MATH_H@
 
+#else
+/* Normal invocation convention.  */
+
+/* The include_next requires a split double-inclusion guard.  */
+#define _GL_INCLUDING_MATH_H
+#@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_MATH_H@
+#undef _GL_INCLUDING_MATH_H
+
 #ifndef _@GUARD_PREFIX@_MATH_H
 #define _@GUARD_PREFIX@_MATH_H
 
@@ -41,6 +56,16 @@
 # define _GL_MATH_INLINE _GL_INLINE
 #endif
 
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The attribute __const__ was added in gcc 2.95.  */
+#ifndef _GL_ATTRIBUTE_CONST
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) || defined __clang__
+#  define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
+# else
+#  define _GL_ATTRIBUTE_CONST /* empty */
+# endif
+#endif
+
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
@@ -255,7 +280,9 @@
 _GL_FUNCDECL_SYS (acosl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (acosl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (acosl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef acosl
 # if HAVE_RAW_DECL_ACOSL
@@ -295,7 +322,9 @@
 _GL_FUNCDECL_SYS (asinl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (asinl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (asinl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef asinl
 # if HAVE_RAW_DECL_ASINL
@@ -335,7 +364,9 @@
 _GL_FUNCDECL_SYS (atanl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (atanl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (atanl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef atanl
 # if HAVE_RAW_DECL_ATANL
@@ -399,7 +430,7 @@
 # endif
 _GL_CXXALIAS_SYS (cbrt, double, (double x));
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (cbrt);
+_GL_CXXALIASWARN1 (cbrt, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef cbrt
@@ -469,7 +500,7 @@
 _GL_CXXALIAS_SYS (ceil, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (ceil);
+_GL_CXXALIASWARN1 (ceil, double, (double x));
 # endif
 #endif
 
@@ -488,7 +519,9 @@
 #  endif
 _GL_CXXALIAS_SYS (ceill, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (ceill);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef ceill
 # if HAVE_RAW_DECL_CEILL
@@ -500,6 +533,7 @@
 
 #if @GNULIB_COPYSIGNF@
 # if !@HAVE_DECL_COPYSIGNF@
+#  undef copysignf
 _GL_FUNCDECL_SYS (copysignf, float, (float x, float y));
 # endif
 _GL_CXXALIAS_SYS (copysignf, float, (float x, float y));
@@ -518,7 +552,7 @@
 # endif
 _GL_CXXALIAS_SYS (copysign, double, (double x, double y));
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (copysign);
+_GL_CXXALIASWARN1 (copysign, double, (double x, double y));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef copysign
@@ -573,7 +607,9 @@
 _GL_FUNCDECL_SYS (cosl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (cosl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (cosl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef cosl
 # if HAVE_RAW_DECL_COSL
@@ -647,7 +683,9 @@
 #  endif
 _GL_CXXALIAS_SYS (expl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (expl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef expl
 # if HAVE_RAW_DECL_EXPL
@@ -686,7 +724,7 @@
 _GL_CXXALIAS_SYS (exp2, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (exp2);
+_GL_CXXALIASWARN1 (exp2, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef exp2
@@ -759,7 +797,7 @@
 _GL_CXXALIAS_SYS (expm1, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (expm1);
+_GL_CXXALIASWARN1 (expm1, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef expm1
@@ -802,7 +840,9 @@
 _GL_FUNCDECL_SYS (fabsf, float, (float x));
 # endif
 _GL_CXXALIAS_SYS (fabsf, float, (float x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fabsf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef fabsf
 # if HAVE_RAW_DECL_FABSF
@@ -826,7 +866,9 @@
 #  endif
 _GL_CXXALIAS_SYS (fabsl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fabsl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef fabsl
 # if HAVE_RAW_DECL_FABSL
@@ -872,7 +914,7 @@
 _GL_CXXALIAS_SYS (floor, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (floor);
+_GL_CXXALIASWARN1 (floor, double, (double x));
 # endif
 #endif
 
@@ -891,7 +933,9 @@
 #  endif
 _GL_CXXALIAS_SYS (floorl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (floorl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef floorl
 # if HAVE_RAW_DECL_FLOORL
@@ -911,6 +955,7 @@
 _GL_CXXALIAS_RPL (fmaf, float, (float x, float y, float z));
 # else
 #  if !@HAVE_FMAF@
+#   undef fmaf
 _GL_FUNCDECL_SYS (fmaf, float, (float x, float y, float z));
 #  endif
 _GL_CXXALIAS_SYS (fmaf, float, (float x, float y, float z));
@@ -934,12 +979,13 @@
 _GL_CXXALIAS_RPL (fma, double, (double x, double y, double z));
 # else
 #  if !@HAVE_FMA@
+#   undef fma
 _GL_FUNCDECL_SYS (fma, double, (double x, double y, double z));
 #  endif
 _GL_CXXALIAS_SYS (fma, double, (double x, double y, double z));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fma);
+_GL_CXXALIASWARN1 (fma, double, (double x, double y, double z));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef fma
@@ -1016,7 +1062,7 @@
 _GL_CXXALIAS_SYS (fmod, double, (double x, double y));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fmod);
+_GL_CXXALIASWARN1 (fmod, double, (double x, double y));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef fmod
@@ -1041,7 +1087,9 @@
 #  endif
 _GL_CXXALIAS_SYS (fmodl, long double, (long double x, long double y));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fmodl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef fmodl
 # if HAVE_RAW_DECL_FMODL
@@ -1073,7 +1121,9 @@
 #  endif
 _GL_CXXALIAS_SYS (frexpf, float, (float x, int *expptr));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (frexpf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef frexpf
 # if HAVE_RAW_DECL_FREXPF
@@ -1135,7 +1185,9 @@
 # endif
 #endif
 #if @GNULIB_FREXPL@ && !(@REPLACE_FREXPL@ && !@HAVE_DECL_FREXPL@)
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (frexpl);
+# endif
 #endif
 #if !@GNULIB_FREXPL@ && defined GNULIB_POSIXCHECK
 # undef frexpl
@@ -1161,7 +1213,9 @@
 #  endif
 _GL_CXXALIAS_SYS (hypotf, float, (float x, float y));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (hypotf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef hypotf
 # if HAVE_RAW_DECL_HYPOTF
@@ -1183,7 +1237,7 @@
 _GL_CXXALIAS_SYS (hypot, double, (double x, double y));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (hypot);
+_GL_CXXALIASWARN1 (hypot, double, (double x, double y));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef hypot
@@ -1208,7 +1262,9 @@
 #  endif
 _GL_CXXALIAS_SYS (hypotl, long double, (long double x, long double y));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (hypotl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef hypotl
 # if HAVE_RAW_DECL_HYPOTL
@@ -1256,7 +1312,7 @@
 _GL_CXXALIAS_SYS (ilogb, int, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (ilogb);
+_GL_CXXALIASWARN1 (ilogb, int, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef ilogb
@@ -1276,6 +1332,7 @@
 _GL_CXXALIAS_RPL (ilogbl, int, (long double x));
 # else
 #  if !@HAVE_ILOGBL@
+#   undef ilogbl
 _GL_FUNCDECL_SYS (ilogbl, int, (long double x));
 #  endif
 _GL_CXXALIAS_SYS (ilogbl, int, (long double x));
@@ -1290,6 +1347,55 @@
 #endif
 
 
+#if @GNULIB_MDA_J0@
+/* On native Windows, map 'j0' to '_j0', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::j0 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef j0
+#   define j0 _j0
+#  endif
+_GL_CXXALIAS_MDA (j0, double, (double x));
+# else
+_GL_CXXALIAS_SYS (j0, double, (double x));
+# endif
+_GL_CXXALIASWARN (j0);
+#endif
+
+#if @GNULIB_MDA_J1@
+/* On native Windows, map 'j1' to '_j1', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::j1 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef j1
+#   define j1 _j1
+#  endif
+_GL_CXXALIAS_MDA (j1, double, (double x));
+# else
+_GL_CXXALIAS_SYS (j1, double, (double x));
+# endif
+_GL_CXXALIASWARN (j1);
+#endif
+
+#if @GNULIB_MDA_JN@
+/* On native Windows, map 'jn' to '_jn', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::jn always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef jn
+#   define jn _jn
+#  endif
+_GL_CXXALIAS_MDA (jn, double, (int n, double x));
+# else
+_GL_CXXALIAS_SYS (jn, double, (int n, double x));
+# endif
+_GL_CXXALIASWARN (jn);
+#endif
+
+
 /* Return x * 2^exp.  */
 #if @GNULIB_LDEXPF@
 # if !@HAVE_LDEXPF@
@@ -1297,7 +1403,9 @@
 _GL_FUNCDECL_SYS (ldexpf, float, (float x, int exp));
 # endif
 _GL_CXXALIAS_SYS (ldexpf, float, (float x, int exp));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (ldexpf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef ldexpf
 # if HAVE_RAW_DECL_LDEXPF
@@ -1323,7 +1431,9 @@
 # endif
 #endif
 #if @GNULIB_LDEXPL@
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (ldexpl);
+# endif
 #endif
 #if !@GNULIB_LDEXPL@ && defined GNULIB_POSIXCHECK
 # undef ldexpl
@@ -1370,7 +1480,7 @@
 _GL_CXXALIAS_SYS (log, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log);
+_GL_CXXALIASWARN1 (log, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef log
@@ -1395,7 +1505,9 @@
 #  endif
 _GL_CXXALIAS_SYS (logl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (logl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef logl
 # if HAVE_RAW_DECL_LOGL
@@ -1441,7 +1553,7 @@
 _GL_CXXALIAS_SYS (log10, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log10);
+_GL_CXXALIASWARN1 (log10, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef log10
@@ -1466,7 +1578,9 @@
 #  endif
 _GL_CXXALIAS_SYS (log10l, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (log10l);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef log10l
 # if HAVE_RAW_DECL_LOG10L
@@ -1514,7 +1628,7 @@
 _GL_CXXALIAS_SYS (log1p, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log1p);
+_GL_CXXALIASWARN1 (log1p, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef log1p
@@ -1588,7 +1702,7 @@
 _GL_CXXALIAS_SYS (log2, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log2);
+_GL_CXXALIASWARN1 (log2, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef log2
@@ -1660,7 +1774,7 @@
 _GL_CXXALIAS_SYS (logb, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (logb);
+_GL_CXXALIASWARN1 (logb, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef logb
@@ -1730,7 +1844,7 @@
 _GL_CXXALIAS_SYS (modf, double, (double x, double *iptr));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (modf);
+_GL_CXXALIASWARN1 (modf, double, (double x, double *iptr));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef modf
@@ -1757,7 +1871,9 @@
 #  endif
 _GL_CXXALIAS_SYS (modfl, long double, (long double x, long double *iptr));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (modfl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef modfl
 # if HAVE_RAW_DECL_MODFL
@@ -1821,7 +1937,7 @@
 _GL_CXXALIAS_SYS (remainder, double, (double x, double y));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (remainder);
+_GL_CXXALIASWARN1 (remainder, double, (double x, double y));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef remainder
@@ -1878,7 +1994,7 @@
 # endif
 _GL_CXXALIAS_SYS (rint, double, (double x));
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (rint);
+_GL_CXXALIASWARN1 (rint, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef rint
@@ -1950,7 +2066,7 @@
 _GL_CXXALIAS_SYS (round, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (round);
+_GL_CXXALIASWARN1 (round, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef round
@@ -1997,7 +2113,7 @@
 _GL_CXXALIAS_RPL (sinf, float, (float x));
 # else
 #  if !@HAVE_SINF@
- #  undef sinf
+#   undef sinf
 _GL_FUNCDECL_SYS (sinf, float, (float x));
 #  endif
 _GL_CXXALIAS_SYS (sinf, float, (float x));
@@ -2017,7 +2133,9 @@
 _GL_FUNCDECL_SYS (sinl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (sinl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (sinl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef sinl
 # if HAVE_RAW_DECL_SINL
@@ -2091,7 +2209,9 @@
 #  endif
 _GL_CXXALIAS_SYS (sqrtl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (sqrtl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef sqrtl
 # if HAVE_RAW_DECL_SQRTL
@@ -2131,7 +2251,9 @@
 _GL_FUNCDECL_SYS (tanl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (tanl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (tanl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef tanl
 # if HAVE_RAW_DECL_TANL
@@ -2204,7 +2326,7 @@
 _GL_CXXALIAS_SYS (trunc, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (trunc);
+_GL_CXXALIASWARN1 (trunc, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef trunc
@@ -2238,6 +2360,55 @@
 #endif
 
 
+#if @GNULIB_MDA_Y0@
+/* On native Windows, map 'y0' to '_y0', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::y0 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef y0
+#   define y0 _y0
+#  endif
+_GL_CXXALIAS_MDA (y0, double, (double x));
+# else
+_GL_CXXALIAS_SYS (y0, double, (double x));
+# endif
+_GL_CXXALIASWARN (y0);
+#endif
+
+#if @GNULIB_MDA_Y1@
+/* On native Windows, map 'y1' to '_y1', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::y1 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef y1
+#   define y1 _y1
+#  endif
+_GL_CXXALIAS_MDA (y1, double, (double x));
+# else
+_GL_CXXALIAS_SYS (y1, double, (double x));
+# endif
+_GL_CXXALIASWARN (y1);
+#endif
+
+#if @GNULIB_MDA_YN@
+/* On native Windows, map 'yn' to '_yn', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::yn always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef yn
+#   define yn _yn
+#  endif
+_GL_CXXALIAS_MDA (yn, double, (int n, double x));
+# else
+_GL_CXXALIAS_SYS (yn, double, (int n, double x));
+# endif
+_GL_CXXALIASWARN (yn);
+#endif
+
+
 /* Definitions of function-like macros come here, after the function
    declarations.  */
 
@@ -2257,7 +2428,7 @@
 #  if defined isfinite || defined GNULIB_NAMESPACE
 _GL_MATH_CXX_REAL_FLOATING_DECL_1 (isfinite)
 #   undef isfinite
-#   if __GNUC__ >= 6 || (defined __clang__ && !defined _AIX)
+#   if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || defined _AIX || (defined _WIN32 && !defined __CYGWIN__)))
   /* This platform's <cmath> possibly defines isfinite through a set of inline
      functions.  */
 _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isfinite, rpl_isfinite, bool)
@@ -2291,7 +2462,7 @@
 #  if defined isinf || defined GNULIB_NAMESPACE
 _GL_MATH_CXX_REAL_FLOATING_DECL_1 (isinf)
 #   undef isinf
-#   if __GNUC__ >= 6 || defined __clang__
+#   if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || (defined _WIN32 && !defined __CYGWIN__)))
   /* This platform's <cmath> possibly defines isinf through a set of inline
      functions.  */
 _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isinf, rpl_isinf, bool)
@@ -2315,10 +2486,11 @@
 # if @HAVE_ISNANF@
 /* The original <math.h> included above provides a declaration of isnan macro
    or (older) isnanf function.  */
-#  if __GNUC__ >= 4
-    /* GCC 4.0 and newer provides three built-ins for isnan.  */
+#  if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+    /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
+       GCC >= 4.0 also provides __builtin_isnanf, but clang doesn't.  */
 #   undef isnanf
-#   define isnanf(x) __builtin_isnanf ((float)(x))
+#   define isnanf(x) __builtin_isnan ((float)(x))
 #  elif defined isnan
 #   undef isnanf
 #   define isnanf(x) isnan ((float)(x))
@@ -2338,8 +2510,8 @@
 # if @HAVE_ISNAND@
 /* The original <math.h> included above provides a declaration of isnan
    macro.  */
-#  if __GNUC__ >= 4
-    /* GCC 4.0 and newer provides three built-ins for isnan.  */
+#  if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+    /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.  */
 #   undef isnand
 #   define isnand(x) __builtin_isnan ((double)(x))
 #  else
@@ -2359,10 +2531,11 @@
 # if @HAVE_ISNANL@
 /* The original <math.h> included above provides a declaration of isnan
    macro or (older) isnanl function.  */
-#  if __GNUC__ >= 4
-    /* GCC 4.0 and newer provides three built-ins for isnan.  */
+#  if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+    /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
+       GCC >= 4.0 also provides __builtin_isnanl, but clang doesn't.  */
 #   undef isnanl
-#   define isnanl(x) __builtin_isnanl ((long double)(x))
+#   define isnanl(x) __builtin_isnan ((long double)(x))
 #  elif defined isnan
 #   undef isnanl
 #   define isnanl(x) isnan ((long double)(x))
@@ -2382,20 +2555,20 @@
    isnanf.h (e.g.) here, because those may end up being macros
    that recursively expand back to isnan.  So use the gnulib
    replacements for them directly. */
-#  if @HAVE_ISNANF@ && __GNUC__ >= 4
-#   define gl_isnan_f(x) __builtin_isnanf ((float)(x))
+#  if @HAVE_ISNANF@ && (__GNUC__ >= 4) || (__clang_major__ >= 4)
+#   define gl_isnan_f(x) __builtin_isnan ((float)(x))
 #  else
 _GL_EXTERN_C int rpl_isnanf (float x);
 #   define gl_isnan_f(x) rpl_isnanf (x)
 #  endif
-#  if @HAVE_ISNAND@ && __GNUC__ >= 4
+#  if @HAVE_ISNAND@ && (__GNUC__ >= 4) || (__clang_major__ >= 4)
 #   define gl_isnan_d(x) __builtin_isnan ((double)(x))
 #  else
 _GL_EXTERN_C int rpl_isnand (double x);
 #   define gl_isnan_d(x) rpl_isnand (x)
 #  endif
-#  if @HAVE_ISNANL@ && __GNUC__ >= 4
-#   define gl_isnan_l(x) __builtin_isnanl ((long double)(x))
+#  if @HAVE_ISNANL@ && (__GNUC__ >= 4) || (__clang_major__ >= 4)
+#   define gl_isnan_l(x) __builtin_isnan ((long double)(x))
 #  else
 _GL_EXTERN_C int rpl_isnanl (long double x) _GL_ATTRIBUTE_CONST;
 #   define gl_isnan_l(x) rpl_isnanl (x)
@@ -2405,18 +2578,18 @@
    (sizeof (x) == sizeof (long double) ? gl_isnan_l (x) : \
     sizeof (x) == sizeof (double) ? gl_isnan_d (x) : \
     gl_isnan_f (x))
-# elif __GNUC__ >= 4
+# elif (__GNUC__ >= 4) || (__clang_major__ >= 4)
 #  undef isnan
 #  define isnan(x) \
-   (sizeof (x) == sizeof (long double) ? __builtin_isnanl ((long double)(x)) : \
+   (sizeof (x) == sizeof (long double) ? __builtin_isnan ((long double)(x)) : \
     sizeof (x) == sizeof (double) ? __builtin_isnan ((double)(x)) : \
-    __builtin_isnanf ((float)(x)))
+    __builtin_isnan ((float)(x)))
 # endif
 # ifdef __cplusplus
 #  if defined isnan || defined GNULIB_NAMESPACE
 _GL_MATH_CXX_REAL_FLOATING_DECL_1 (isnan)
 #   undef isnan
-#   if __GNUC__ >= 6 || defined __clang__
+#   if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__ && __clang_major__ < 12) || (defined __FreeBSD__ && __clang_major__ < 7) || defined __OpenBSD__ || (defined _WIN32 && !defined __CYGWIN__)))
   /* This platform's <cmath> possibly defines isnan through a set of inline
      functions.  */
 _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isnan, rpl_isnan, bool)
@@ -2441,10 +2614,10 @@
 
 
 #if @GNULIB_SIGNBIT@
-# if (@REPLACE_SIGNBIT_USING_GCC@ \
+# if (@REPLACE_SIGNBIT_USING_BUILTINS@ \
       && (!defined __cplusplus || __cplusplus < 201103))
 #  undef signbit
-   /* GCC 4.0 and newer provides three built-ins for signbit.  */
+   /* GCC >= 4.0 and clang provide three built-ins for signbit.  */
 #  define signbit(x) \
    (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
     sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
@@ -2455,7 +2628,7 @@
 _GL_EXTERN_C int gl_signbitf (float arg);
 _GL_EXTERN_C int gl_signbitd (double arg);
 _GL_EXTERN_C int gl_signbitl (long double arg);
-#  if __GNUC__ >= 2 && !defined __STRICT_ANSI__
+#  if (__GNUC__ >= 2 || defined __clang__) && !defined __STRICT_ANSI__
 #   define _GL_NUM_UINT_WORDS(type) \
       ((sizeof (type) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
 #   if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT && !defined gl_signbitf
@@ -2499,7 +2672,7 @@
 #  if defined signbit || defined GNULIB_NAMESPACE
 _GL_MATH_CXX_REAL_FLOATING_DECL_1 (signbit)
 #   undef signbit
-#   if __GNUC__ >= 6 || (defined __clang__ && !defined _AIX)
+#   if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || defined _AIX || (defined _WIN32 && !defined __CYGWIN__)))
   /* This platform's <cmath> possibly defines signbit through a set of inline
      functions.  */
 _GL_MATH_CXX_REAL_FLOATING_DECL_2 (signbit, rpl_signbit, bool)
@@ -2520,4 +2693,5 @@
 _GL_INLINE_HEADER_END
 
 #endif /* _@GUARD_PREFIX@_MATH_H */
+#endif /* _GL_INCLUDING_MATH_H */
 #endif /* _@GUARD_PREFIX@_MATH_H */
diff --git a/lib/mbchar.c b/lib/mbchar.c
index aa8012b..a466257 100644
--- a/lib/mbchar.c
+++ b/lib/mbchar.c
@@ -1,16 +1,16 @@
-/* Copyright (C) 2001, 2006, 2009-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2006, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 
diff --git a/lib/mbchar.h b/lib/mbchar.h
index 2d26075..704814a 100644
--- a/lib/mbchar.h
+++ b/lib/mbchar.h
@@ -1,17 +1,17 @@
 /* Multibyte character data type.
-   Copyright (C) 2001, 2005-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2005-2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>.  */
@@ -146,13 +146,6 @@
 
 #include <stdbool.h>
 #include <string.h>
-
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
-   <wchar.h>.  */
-#include <stdio.h>
-#include <time.h>
 #include <wchar.h>
 #include <wctype.h>
 
diff --git a/lib/mbfile.c b/lib/mbfile.c
index b0a468e..ab88d6d 100644
--- a/lib/mbfile.c
+++ b/lib/mbfile.c
@@ -1,3 +1,20 @@
+/* Multibyte character I/O: macros for multi-byte encodings.
+   Copyright (C) 2012-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #include <config.h>
+
 #define MBFILE_INLINE _GL_EXTERN_INLINE
 #include "mbfile.h"
diff --git a/lib/mbfile.h b/lib/mbfile.h
index 211f073..899a114 100644
--- a/lib/mbfile.h
+++ b/lib/mbfile.h
@@ -1,17 +1,17 @@
 /* Multibyte character I/O: macros for multi-byte encodings.
-   Copyright (C) 2001, 2005, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2005, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Mitsuru Chinen <mchinen@yamato.ibm.com>
@@ -51,13 +51,6 @@
 #include <stdbool.h>
 #include <stdio.h>
 #include <string.h>
-
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
-   <wchar.h>.  */
-#include <stdio.h>
-#include <time.h>
 #include <wchar.h>
 
 #include "mbchar.h"
diff --git a/lib/mbrtowc-impl-utf8.h b/lib/mbrtowc-impl-utf8.h
new file mode 100644
index 0000000..330fb10
--- /dev/null
+++ b/lib/mbrtowc-impl-utf8.h
@@ -0,0 +1,138 @@
+/* Convert multibyte character to wide character.
+   Copyright (C) 1999-2002, 2005-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008.  */
+
+/* This file contains the part of the body of the mbrtowc and mbrtoc32 functions
+   that handles the special case of the UTF-8 encoding.  */
+
+        /* Cf. unistr/u8-mbtouc.c.  */
+        unsigned char c = (unsigned char) p[0];
+
+        if (c < 0x80)
+          {
+            if (pwc != NULL)
+              *pwc = c;
+            res = (c == 0 ? 0 : 1);
+            goto success;
+          }
+        if (c >= 0xc2)
+          {
+            if (c < 0xe0)
+              {
+                if (m == 1)
+                  goto incomplete;
+                else /* m >= 2 */
+                  {
+                    unsigned char c2 = (unsigned char) p[1];
+
+                    if ((c2 ^ 0x80) < 0x40)
+                      {
+                        if (pwc != NULL)
+                          *pwc = ((unsigned int) (c & 0x1f) << 6)
+                                 | (unsigned int) (c2 ^ 0x80);
+                        res = 2;
+                        goto success;
+                      }
+                  }
+              }
+            else if (c < 0xf0)
+              {
+                if (m == 1)
+                  goto incomplete;
+                else
+                  {
+                    unsigned char c2 = (unsigned char) p[1];
+
+                    if ((c2 ^ 0x80) < 0x40
+                        && (c >= 0xe1 || c2 >= 0xa0)
+                        && (c != 0xed || c2 < 0xa0))
+                      {
+                        if (m == 2)
+                          goto incomplete;
+                        else /* m >= 3 */
+                          {
+                            unsigned char c3 = (unsigned char) p[2];
+
+                            if ((c3 ^ 0x80) < 0x40)
+                              {
+                                unsigned int wc =
+                                  (((unsigned int) (c & 0x0f) << 12)
+                                   | ((unsigned int) (c2 ^ 0x80) << 6)
+                                   | (unsigned int) (c3 ^ 0x80));
+
+                                if (FITS_IN_CHAR_TYPE (wc))
+                                  {
+                                    if (pwc != NULL)
+                                      *pwc = wc;
+                                    res = 3;
+                                    goto success;
+                                  }
+                              }
+                          }
+                      }
+                  }
+              }
+            else if (c <= 0xf4)
+              {
+                if (m == 1)
+                  goto incomplete;
+                else
+                  {
+                    unsigned char c2 = (unsigned char) p[1];
+
+                    if ((c2 ^ 0x80) < 0x40
+                        && (c >= 0xf1 || c2 >= 0x90)
+                        && (c < 0xf4 || (/* c == 0xf4 && */ c2 < 0x90)))
+                      {
+                        if (m == 2)
+                          goto incomplete;
+                        else
+                          {
+                            unsigned char c3 = (unsigned char) p[2];
+
+                            if ((c3 ^ 0x80) < 0x40)
+                              {
+                                if (m == 3)
+                                  goto incomplete;
+                                else /* m >= 4 */
+                                  {
+                                    unsigned char c4 = (unsigned char) p[3];
+
+                                    if ((c4 ^ 0x80) < 0x40)
+                                      {
+                                        unsigned int wc =
+                                          (((unsigned int) (c & 0x07) << 18)
+                                           | ((unsigned int) (c2 ^ 0x80) << 12)
+                                           | ((unsigned int) (c3 ^ 0x80) << 6)
+                                           | (unsigned int) (c4 ^ 0x80));
+
+                                        if (FITS_IN_CHAR_TYPE (wc))
+                                          {
+                                            if (pwc != NULL)
+                                              *pwc = wc;
+                                            res = 4;
+                                            goto success;
+                                          }
+                                      }
+                                  }
+                              }
+                          }
+                      }
+                  }
+              }
+          }
+        goto invalid;
diff --git a/lib/mbrtowc-impl.h b/lib/mbrtowc-impl.h
new file mode 100644
index 0000000..bc3e688
--- /dev/null
+++ b/lib/mbrtowc-impl.h
@@ -0,0 +1,262 @@
+/* Convert multibyte character to wide character.
+   Copyright (C) 1999-2002, 2005-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008.  */
+
+/* This file contains the body of the mbrtowc and mbrtoc32 functions,
+   when GNULIB_defined_mbstate_t is defined.  */
+
+  char *pstate = (char *)ps;
+
+  if (s == NULL)
+    {
+      pwc = NULL;
+      s = "";
+      n = 1;
+    }
+
+  if (n == 0)
+    return (size_t)(-2);
+
+  /* Here n > 0.  */
+
+  if (pstate == NULL)
+    pstate = internal_state;
+
+  {
+    size_t nstate = pstate[0];
+    char buf[4];
+    const char *p;
+    size_t m;
+    enc_t enc;
+    int res;
+
+    switch (nstate)
+      {
+      case 0:
+        p = s;
+        m = n;
+        break;
+      case 3:
+        buf[2] = pstate[3];
+        FALLTHROUGH;
+      case 2:
+        buf[1] = pstate[2];
+        FALLTHROUGH;
+      case 1:
+        buf[0] = pstate[1];
+        p = buf;
+        m = nstate;
+        buf[m++] = s[0];
+        if (n >= 2 && m < 4)
+          {
+            buf[m++] = s[1];
+            if (n >= 3 && m < 4)
+              buf[m++] = s[2];
+          }
+        break;
+      default:
+        errno = EINVAL;
+        return (size_t)(-1);
+      }
+
+    /* Here m > 0.  */
+
+    enc = locale_encoding_classification ();
+
+    if (enc == enc_utf8) /* UTF-8 */
+      {
+        /* Achieve
+             - multi-thread safety and
+             - the ability to produce wide character values > WCHAR_MAX
+           by not calling mbtowc() at all.  */
+#include "mbrtowc-impl-utf8.h"
+      }
+    else
+      {
+        /* The hidden internal state of mbtowc would make this function not
+           multi-thread safe.  Achieve multi-thread safety through a lock.  */
+        wchar_t wc;
+        res = mbtowc_with_lock (&wc, p, m);
+
+        if (res >= 0)
+          {
+            if ((wc == 0) != (res == 0))
+              abort ();
+            if (pwc != NULL)
+              *pwc = wc;
+            goto success;
+          }
+
+        /* mbtowc does not distinguish between invalid and incomplete multibyte
+           sequences.  But mbrtowc needs to make this distinction.
+           There are two possible approaches:
+             - Use iconv() and its return value.
+             - Use built-in knowledge about the possible encodings.
+           Given the low quality of implementation of iconv() on the systems
+           that lack mbrtowc(), we use the second approach.
+           The possible encodings are:
+             - 8-bit encodings,
+             - EUC-JP, EUC-KR, GB2312, EUC-TW, BIG5, GB18030, SJIS,
+             - UTF-8 (already handled above).
+           Use specialized code for each.  */
+        if (m >= 4 || m >= MB_CUR_MAX)
+          goto invalid;
+        /* Here MB_CUR_MAX > 1 and 0 < m < 4.  */
+        switch (enc)
+          {
+          /* As a reference for this code, you can use the GNU libiconv
+             implementation.  Look for uses of the RET_TOOFEW macro.  */
+
+          case enc_eucjp: /* EUC-JP */
+            {
+              if (m == 1)
+                {
+                  unsigned char c = (unsigned char) p[0];
+
+                  if ((c >= 0xa1 && c < 0xff) || c == 0x8e || c == 0x8f)
+                    goto incomplete;
+                }
+              if (m == 2)
+                {
+                  unsigned char c = (unsigned char) p[0];
+
+                  if (c == 0x8f)
+                    {
+                      unsigned char c2 = (unsigned char) p[1];
+
+                      if (c2 >= 0xa1 && c2 < 0xff)
+                        goto incomplete;
+                    }
+                }
+              goto invalid;
+            }
+
+          case enc_94: /* EUC-KR, GB2312, BIG5 */
+            {
+              if (m == 1)
+                {
+                  unsigned char c = (unsigned char) p[0];
+
+                  if (c >= 0xa1 && c < 0xff)
+                    goto incomplete;
+                }
+              goto invalid;
+            }
+
+          case enc_euctw: /* EUC-TW */
+            {
+              if (m == 1)
+                {
+                  unsigned char c = (unsigned char) p[0];
+
+                  if ((c >= 0xa1 && c < 0xff) || c == 0x8e)
+                    goto incomplete;
+                }
+              else /* m == 2 || m == 3 */
+                {
+                  unsigned char c = (unsigned char) p[0];
+
+                  if (c == 0x8e)
+                    goto incomplete;
+                }
+              goto invalid;
+            }
+
+          case enc_gb18030: /* GB18030 */
+            {
+              if (m == 1)
+                {
+                  unsigned char c = (unsigned char) p[0];
+
+                  if ((c >= 0x90 && c <= 0xe3) || (c >= 0xf8 && c <= 0xfe))
+                    goto incomplete;
+                }
+              else /* m == 2 || m == 3 */
+                {
+                  unsigned char c = (unsigned char) p[0];
+
+                  if (c >= 0x90 && c <= 0xe3)
+                    {
+                      unsigned char c2 = (unsigned char) p[1];
+
+                      if (c2 >= 0x30 && c2 <= 0x39)
+                        {
+                          if (m == 2)
+                            goto incomplete;
+                          else /* m == 3 */
+                            {
+                              unsigned char c3 = (unsigned char) p[2];
+
+                              if (c3 >= 0x81 && c3 <= 0xfe)
+                                goto incomplete;
+                            }
+                        }
+                    }
+                }
+              goto invalid;
+            }
+
+          case enc_sjis: /* SJIS */
+            {
+              if (m == 1)
+                {
+                  unsigned char c = (unsigned char) p[0];
+
+                  if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)
+                      || (c >= 0xf0 && c <= 0xf9))
+                    goto incomplete;
+                }
+              goto invalid;
+            }
+
+          default:
+            /* An unknown multibyte encoding.  */
+            goto incomplete;
+          }
+      }
+
+   success:
+    /* res >= 0 is the corrected return value of
+       mbtowc_with_lock (&wc, p, m).  */
+    if (nstate >= (res > 0 ? res : 1))
+      abort ();
+    res -= nstate;
+    pstate[0] = 0;
+    return res;
+
+   incomplete:
+    {
+      size_t k = nstate;
+      /* Here 0 <= k < m < 4.  */
+      pstate[++k] = s[0];
+      if (k < m)
+        {
+          pstate[++k] = s[1];
+          if (k < m)
+            pstate[++k] = s[2];
+        }
+      if (k != m)
+        abort ();
+    }
+    pstate[0] = m;
+    return (size_t)(-2);
+
+   invalid:
+    errno = EILSEQ;
+    /* The conversion state is undefined, says POSIX.  */
+    return (size_t)(-1);
+  }
diff --git a/lib/mbrtowc.c b/lib/mbrtowc.c
index 1aad22c..8832f6e 100644
--- a/lib/mbrtowc.c
+++ b/lib/mbrtowc.c
@@ -1,18 +1,18 @@
 /* Convert multibyte character to wide character.
-   Copyright (C) 1999-2002, 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 1999-2002, 2005-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2008.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
@@ -20,441 +20,59 @@
 /* Specification.  */
 #include <wchar.h>
 
-#if C_LOCALE_MAYBE_EILSEQ
-# include "hard-locale.h"
-# include <locale.h>
-#endif
-
 #if GNULIB_defined_mbstate_t
-/* Implement mbrtowc() on top of mbtowc().  */
+/* Implement mbrtowc() on top of mbtowc() for the non-UTF-8 locales
+   and directly for the UTF-8 locales.  */
 
 # include <errno.h>
+# include <stdint.h>
 # include <stdlib.h>
 
-# include "localcharset.h"
-# include "streq.h"
-# include "verify.h"
-# include "glthread/lock.h"
+# if defined _WIN32 && !defined __CYGWIN__
 
-# ifndef FALLTHROUGH
-#  if __GNUC__ < 7
-#   define FALLTHROUGH ((void) 0)
+#  define WIN32_LEAN_AND_MEAN  /* avoid including junk */
+#  include <windows.h>
+
+# elif HAVE_PTHREAD_API
+
+#  include <pthread.h>
+#  if HAVE_THREADS_H && HAVE_WEAK_SYMBOLS
+#   include <threads.h>
+#   pragma weak thrd_exit
+#   define c11_threads_in_use() (thrd_exit != NULL)
 #  else
-#   define FALLTHROUGH __attribute__ ((__fallthrough__))
+#   define c11_threads_in_use() 0
 #  endif
+
+# elif HAVE_THREADS_H
+
+#  include <threads.h>
+
 # endif
 
-/* Returns a classification of special values of the encoding of the current
-   locale.  */
-typedef enum {
-  enc_other,      /* other */
-  enc_utf8,       /* UTF-8 */
-  enc_eucjp,      /* EUC-JP */
-  enc_94,         /* EUC-KR, GB2312, BIG5 */
-  enc_euctw,      /* EUC-TW */
-  enc_gb18030,    /* GB18030 */
-  enc_sjis        /* SJIS */
-} enc_t;
-static inline enc_t
-locale_enc (void)
-{
-  const char *encoding = locale_charset ();
-  if (STREQ_OPT (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0))
-    return enc_utf8;
-  if (STREQ_OPT (encoding, "EUC-JP", 'E', 'U', 'C', '-', 'J', 'P', 0, 0, 0))
-    return enc_eucjp;
-  if (STREQ_OPT (encoding, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
-      || STREQ_OPT (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0)
-      || STREQ_OPT (encoding, "BIG5", 'B', 'I', 'G', '5', 0, 0, 0, 0, 0))
-    return enc_94;
-  if (STREQ_OPT (encoding, "EUC-TW", 'E', 'U', 'C', '-', 'T', 'W', 0, 0, 0))
-    return enc_euctw;
-  if (STREQ_OPT (encoding, "GB18030", 'G', 'B', '1', '8', '0', '3', '0', 0, 0))
-    return enc_gb18030;
-  if (STREQ_OPT (encoding, "SJIS", 'S', 'J', 'I', 'S', 0, 0, 0, 0, 0))
-    return enc_sjis;
-  return enc_other;
-}
-
-# if GNULIB_WCHAR_SINGLE
-/* When we know that the locale does not change, provide a speedup by
-   caching the value of locale_enc.  */
-static int cached_locale_enc = -1;
-static inline enc_t
-locale_enc_cached (void)
-{
-  if (cached_locale_enc < 0)
-    cached_locale_enc = locale_enc ();
-  return cached_locale_enc;
-}
-# else
-/* By default, don't make assumptions, hence no caching.  */
-#  define locale_enc_cached locale_enc
-# endif
-
-/* This lock protects the internal state of mbtowc against multiple simultaneous
-   calls of mbrtowc.  */
-gl_lock_define_initialized(static, mbtowc_lock)
+# include "attribute.h"
+# include "verify.h"
+# include "lc-charset-dispatch.h"
+# include "mbtowc-lock.h"
 
 verify (sizeof (mbstate_t) >= 4);
-
 static char internal_state[4];
 
 size_t
 mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
 {
-  char *pstate = (char *)ps;
-
-  if (s == NULL)
-    {
-      pwc = NULL;
-      s = "";
-      n = 1;
-    }
-
-  if (n == 0)
-    return (size_t)(-2);
-
-  /* Here n > 0.  */
-
-  if (pstate == NULL)
-    pstate = internal_state;
-
-  {
-    size_t nstate = pstate[0];
-    char buf[4];
-    const char *p;
-    size_t m;
-    enc_t enc;
-    int res;
-
-    switch (nstate)
-      {
-      case 0:
-        p = s;
-        m = n;
-        break;
-      case 3:
-        buf[2] = pstate[3];
-        FALLTHROUGH;
-      case 2:
-        buf[1] = pstate[2];
-        FALLTHROUGH;
-      case 1:
-        buf[0] = pstate[1];
-        p = buf;
-        m = nstate;
-        buf[m++] = s[0];
-        if (n >= 2 && m < 4)
-          {
-            buf[m++] = s[1];
-            if (n >= 3 && m < 4)
-              buf[m++] = s[2];
-          }
-        break;
-      default:
-        errno = EINVAL;
-        return (size_t)(-1);
-      }
-
-    /* Here m > 0.  */
-
-    enc = locale_enc_cached ();
-
-    if (enc == enc_utf8) /* UTF-8 */
-      {
-        /* Achieve multi-thread safety by not calling mbtowc() at all.  */
-        /* Cf. unistr/u8-mbtouc.c.  */
-        unsigned char c = (unsigned char) p[0];
-
-        if (c < 0x80)
-          {
-            if (pwc != NULL)
-              *pwc = c;
-            res = (c == 0 ? 0 : 1);
-            goto success;
-          }
-        if (c >= 0xc2)
-          {
-            if (c < 0xe0)
-              {
-                if (m == 1)
-                  goto incomplete;
-                else /* m >= 2 */
-                  {
-                    unsigned char c2 = (unsigned char) p[1];
-
-                    if ((c2 ^ 0x80) < 0x40)
-                      {
-                        if (pwc != NULL)
-                          *pwc = ((unsigned int) (c & 0x1f) << 6)
-                                 | (unsigned int) (c2 ^ 0x80);
-                        res = 2;
-                        goto success;
-                      }
-                  }
-              }
-            else if (c < 0xf0)
-              {
-                if (m == 1)
-                  goto incomplete;
-                else
-                  {
-                    unsigned char c2 = (unsigned char) p[1];
-
-                    if ((c2 ^ 0x80) < 0x40
-                        && (c >= 0xe1 || c2 >= 0xa0)
-                        && (c != 0xed || c2 < 0xa0))
-                      {
-                        if (m == 2)
-                          goto incomplete;
-                        else /* m >= 3 */
-                          {
-                            unsigned char c3 = (unsigned char) p[2];
-
-                            if ((c3 ^ 0x80) < 0x40)
-                              {
-                                if (pwc != NULL)
-                                  *pwc = ((unsigned int) (c & 0x0f) << 12)
-                                         | ((unsigned int) (c2 ^ 0x80) << 6)
-                                         | (unsigned int) (c3 ^ 0x80);
-                                res = 3;
-                                goto success;
-                              }
-                          }
-                      }
-                  }
-              }
-            else if (c <= 0xf4)
-              {
-                if (m == 1)
-                  goto incomplete;
-                else
-                  {
-                    unsigned char c2 = (unsigned char) p[1];
-
-                    if ((c2 ^ 0x80) < 0x40
-                        && (c >= 0xf1 || c2 >= 0x90)
-                        && (c < 0xf4 || (c == 0xf4 && c2 < 0x90)))
-                      {
-                        if (m == 2)
-                          goto incomplete;
-                        else
-                          {
-                            unsigned char c3 = (unsigned char) p[2];
-
-                            if ((c3 ^ 0x80) < 0x40)
-                              {
-                                if (m == 3)
-                                  goto incomplete;
-                                else /* m >= 4 */
-                                  {
-                                    unsigned char c4 = (unsigned char) p[3];
-
-                                    if ((c4 ^ 0x80) < 0x40)
-                                      {
-                                        if (pwc != NULL)
-                                          *pwc = ((unsigned int) (c & 0x07) << 18)
-                                                 | ((unsigned int) (c2 ^ 0x80) << 12)
-                                                 | ((unsigned int) (c3 ^ 0x80) << 6)
-                                                 | (unsigned int) (c4 ^ 0x80);
-                                        res = 4;
-                                        goto success;
-                                      }
-                                  }
-                              }
-                          }
-                      }
-                  }
-              }
-          }
-        goto invalid;
-      }
-    else
-      {
-        /* The hidden internal state of mbtowc would make this function not
-           multi-thread safe.  Achieve multi-thread safety through a lock.  */
-        gl_lock_lock (mbtowc_lock);
-
-        /* Put the hidden internal state of mbtowc into its initial state.
-           This is needed at least with glibc, uClibc, and MSVC CRT.
-           See <https://sourceware.org/bugzilla/show_bug.cgi?id=9674>.  */
-        mbtowc (NULL, NULL, 0);
-
-        res = mbtowc (pwc, p, m);
-
-        gl_lock_unlock (mbtowc_lock);
-
-        if (res >= 0)
-          {
-            if (pwc != NULL && ((*pwc == 0) != (res == 0)))
-              abort ();
-            goto success;
-          }
-
-        /* mbtowc does not distinguish between invalid and incomplete multibyte
-           sequences.  But mbrtowc needs to make this distinction.
-           There are two possible approaches:
-             - Use iconv() and its return value.
-             - Use built-in knowledge about the possible encodings.
-           Given the low quality of implementation of iconv() on the systems
-           that lack mbrtowc(), we use the second approach.
-           The possible encodings are:
-             - 8-bit encodings,
-             - EUC-JP, EUC-KR, GB2312, EUC-TW, BIG5, GB18030, SJIS,
-             - UTF-8 (already handled above).
-           Use specialized code for each.  */
-        if (m >= 4 || m >= MB_CUR_MAX)
-          goto invalid;
-        /* Here MB_CUR_MAX > 1 and 0 < m < 4.  */
-        switch (enc)
-          {
-          /* As a reference for this code, you can use the GNU libiconv
-             implementation.  Look for uses of the RET_TOOFEW macro.  */
-
-          case enc_eucjp: /* EUC-JP */
-            {
-              if (m == 1)
-                {
-                  unsigned char c = (unsigned char) p[0];
-
-                  if ((c >= 0xa1 && c < 0xff) || c == 0x8e || c == 0x8f)
-                    goto incomplete;
-                }
-              if (m == 2)
-                {
-                  unsigned char c = (unsigned char) p[0];
-
-                  if (c == 0x8f)
-                    {
-                      unsigned char c2 = (unsigned char) p[1];
-
-                      if (c2 >= 0xa1 && c2 < 0xff)
-                        goto incomplete;
-                    }
-                }
-              goto invalid;
-            }
-
-          case enc_94: /* EUC-KR, GB2312, BIG5 */
-            {
-              if (m == 1)
-                {
-                  unsigned char c = (unsigned char) p[0];
-
-                  if (c >= 0xa1 && c < 0xff)
-                    goto incomplete;
-                }
-              goto invalid;
-            }
-
-          case enc_euctw: /* EUC-TW */
-            {
-              if (m == 1)
-                {
-                  unsigned char c = (unsigned char) p[0];
-
-                  if ((c >= 0xa1 && c < 0xff) || c == 0x8e)
-                    goto incomplete;
-                }
-              else /* m == 2 || m == 3 */
-                {
-                  unsigned char c = (unsigned char) p[0];
-
-                  if (c == 0x8e)
-                    goto incomplete;
-                }
-              goto invalid;
-            }
-
-          case enc_gb18030: /* GB18030 */
-            {
-              if (m == 1)
-                {
-                  unsigned char c = (unsigned char) p[0];
-
-                  if ((c >= 0x90 && c <= 0xe3) || (c >= 0xf8 && c <= 0xfe))
-                    goto incomplete;
-                }
-              else /* m == 2 || m == 3 */
-                {
-                  unsigned char c = (unsigned char) p[0];
-
-                  if (c >= 0x90 && c <= 0xe3)
-                    {
-                      unsigned char c2 = (unsigned char) p[1];
-
-                      if (c2 >= 0x30 && c2 <= 0x39)
-                        {
-                          if (m == 2)
-                            goto incomplete;
-                          else /* m == 3 */
-                            {
-                              unsigned char c3 = (unsigned char) p[2];
-
-                              if (c3 >= 0x81 && c3 <= 0xfe)
-                                goto incomplete;
-                            }
-                        }
-                    }
-                }
-              goto invalid;
-            }
-
-          case enc_sjis: /* SJIS */
-            {
-              if (m == 1)
-                {
-                  unsigned char c = (unsigned char) p[0];
-
-                  if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)
-                      || (c >= 0xf0 && c <= 0xf9))
-                    goto incomplete;
-                }
-              goto invalid;
-            }
-
-          default:
-            /* An unknown multibyte encoding.  */
-            goto incomplete;
-          }
-      }
-
-   success:
-    /* res >= 0 is the corrected return value of mbtowc (pwc, p, m).  */
-    if (nstate >= (res > 0 ? res : 1))
-      abort ();
-    res -= nstate;
-    pstate[0] = 0;
-    return res;
-
-   incomplete:
-    {
-      size_t k = nstate;
-      /* Here 0 <= k < m < 4.  */
-      pstate[++k] = s[0];
-      if (k < m)
-        {
-          pstate[++k] = s[1];
-          if (k < m)
-            pstate[++k] = s[2];
-        }
-      if (k != m)
-        abort ();
-    }
-    pstate[0] = m;
-    return (size_t)(-2);
-
-   invalid:
-    errno = EILSEQ;
-    /* The conversion state is undefined, says POSIX.  */
-    return (size_t)(-1);
-  }
+# define FITS_IN_CHAR_TYPE(wc)  ((wc) <= WCHAR_MAX)
+# include "mbrtowc-impl.h"
 }
 
 #else
 /* Override the system's mbrtowc() function.  */
 
+# if MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ
+#  include "hard-locale.h"
+#  include <locale.h>
+# endif
+
 # undef mbrtowc
 
 size_t
@@ -512,14 +130,20 @@
   }
 # endif
 
+# if MBRTOWC_STORES_INCOMPLETE_BUG
+  ret = mbrtowc (&wc, s, n, ps);
+  if (ret < (size_t) -2 && pwc != NULL)
+    *pwc = wc;
+# else
   ret = mbrtowc (pwc, s, n, ps);
+# endif
 
 # if MBRTOWC_NUL_RETVAL_BUG
   if (ret < (size_t) -2 && !*pwc)
     return 0;
 # endif
 
-# if C_LOCALE_MAYBE_EILSEQ
+# if MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ
   if ((size_t) -2 <= ret && n != 0 && ! hard_locale (LC_CTYPE))
     {
       unsigned char uc = *s;
diff --git a/lib/mbsinit.c b/lib/mbsinit.c
index 5ecaef7..f440155 100644
--- a/lib/mbsinit.c
+++ b/lib/mbsinit.c
@@ -1,18 +1,18 @@
 /* Test for initial conversion state.
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2008.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
@@ -56,13 +56,10 @@
 {
 # if defined _WIN32 && !defined __CYGWIN__
   /* Native Windows.  */
-#  ifdef __MINGW32__
-  /* On mingw, 'mbstate_t' is defined as 'int'.  */
-  return ps == NULL || *ps == 0;
-#  else
-  /* MSVC defines 'mbstate_t' as an 8-byte struct; the first 4-bytes matter.  */
+  /* MSVC defines 'mbstate_t' as an 8-byte struct; the first 4 bytes matter.
+     On mingw, 'mbstate_t' is sometimes defined as 'int', sometimes defined as
+     an 8-byte struct, of which the first 4 bytes matter.  */
   return ps == NULL || *(const unsigned int *)ps == 0;
-#  endif
 # else
   /* Minix, HP-UX 11.00, Solaris 2.6, Interix, ...  */
   /* Maybe this definition works, maybe not...  */
diff --git a/lib/mbswidth.c b/lib/mbswidth.c
index 408a15e..7f59935 100644
--- a/lib/mbswidth.c
+++ b/lib/mbswidth.c
@@ -1,5 +1,5 @@
 /* Determine the number of screen columns needed for a string.
-   Copyright (C) 2000-2019 Free Software Foundation, Inc.
+   Copyright (C) 2000-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/mbswidth.h b/lib/mbswidth.h
index 2b5c53c..ec39d73 100644
--- a/lib/mbswidth.h
+++ b/lib/mbswidth.h
@@ -1,5 +1,5 @@
 /* Determine the number of screen columns needed for a string.
-   Copyright (C) 2000-2004, 2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2000-2004, 2007, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -18,12 +18,7 @@
 
 /* Avoid a clash of our mbswidth() with a function of the same name defined
    in UnixWare 7.1.1 <wchar.h>.  We need this #include before the #define
-   below.
-   However, we don't want to #include <wchar.h> on all platforms because
-   - Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-     <wchar.h>.
-   - BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
-     <wchar.h>.  */
+   below.  */
 #if HAVE_DECL_MBSWIDTH_IN_WCHAR_H
 # include <wchar.h>
 #endif
diff --git a/lib/mbtowc-lock.c b/lib/mbtowc-lock.c
new file mode 100644
index 0000000..0f7ae6c
--- /dev/null
+++ b/lib/mbtowc-lock.c
@@ -0,0 +1,150 @@
+/* Return the internal lock used by mbrtowc and mbrtoc32.
+   Copyright (C) 2019-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2019-2020.  */
+
+#include <config.h>
+
+/* When it is known that the gl_get_mbtowc_lock function is defined
+   by a dependency library, it should not be defined here.  */
+#if OMIT_MBTOWC_LOCK
+
+/* This declaration is solely to ensure that after preprocessing
+   this file is never empty.  */
+typedef int dummy;
+
+#else
+
+/* This file defines the internal lock used by mbrtowc and mbrtoc32.
+   It is a separate compilation unit, so that only one copy of it is
+   present when linking statically.  */
+
+/* Prohibit renaming this symbol.  */
+# undef gl_get_mbtowc_lock
+
+/* Macro for exporting a symbol (function, not variable) defined in this file,
+   when compiled into a shared library.  */
+# ifndef DLL_EXPORTED
+#  if HAVE_VISIBILITY
+  /* Override the effect of the compiler option '-fvisibility=hidden'.  */
+#   define DLL_EXPORTED __attribute__((__visibility__("default")))
+#  elif defined _WIN32 || defined __CYGWIN__
+#   define DLL_EXPORTED __declspec(dllexport)
+#  else
+#   define DLL_EXPORTED
+#  endif
+# endif
+
+# if defined _WIN32 && !defined __CYGWIN__
+
+#  define WIN32_LEAN_AND_MEAN  /* avoid including junk */
+#  include <windows.h>
+
+#  include "windows-initguard.h"
+
+/* The return type is a 'CRITICAL_SECTION *', not a 'glwthread_mutex_t *',
+   because the latter is not guaranteed to be a stable ABI in the future.  */
+
+/* Make sure the function gets exported from DLLs.  */
+DLL_EXPORTED CRITICAL_SECTION *gl_get_mbtowc_lock (void);
+
+static glwthread_initguard_t guard = GLWTHREAD_INITGUARD_INIT;
+static CRITICAL_SECTION lock;
+
+/* Returns the internal lock used by mbrtowc and mbrtoc32.  */
+CRITICAL_SECTION *
+gl_get_mbtowc_lock (void)
+{
+  if (!guard.done)
+    {
+      if (InterlockedIncrement (&guard.started) == 0)
+        {
+          /* This thread is the first one to need the lock.  Initialize it.  */
+          InitializeCriticalSection (&lock);
+          guard.done = 1;
+        }
+      else
+        {
+          /* Don't let guard.started grow and wrap around.  */
+          InterlockedDecrement (&guard.started);
+          /* Yield the CPU while waiting for another thread to finish
+             initializing this mutex.  */
+          while (!guard.done)
+            Sleep (0);
+        }
+    }
+  return &lock;
+}
+
+# elif HAVE_PTHREAD_API
+
+#  include <pthread.h>
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+/* Make sure the function gets exported from shared libraries.  */
+DLL_EXPORTED pthread_mutex_t *gl_get_mbtowc_lock (void);
+
+/* Returns the internal lock used by mbrtowc and mbrtoc32.  */
+pthread_mutex_t *
+gl_get_mbtowc_lock (void)
+{
+  return &mutex;
+}
+
+# elif HAVE_THREADS_H
+
+#  include <threads.h>
+#  include <stdlib.h>
+
+static int volatile init_needed = 1;
+static once_flag init_once = ONCE_FLAG_INIT;
+static mtx_t mutex;
+
+static void
+atomic_init (void)
+{
+  if (mtx_init (&mutex, mtx_plain) != thrd_success)
+    abort ();
+  init_needed = 0;
+}
+
+/* Make sure the function gets exported from shared libraries.  */
+DLL_EXPORTED mtx_t *gl_get_mbtowc_lock (void);
+
+/* Returns the internal lock used by mbrtowc and mbrtoc32.  */
+mtx_t *
+gl_get_mbtowc_lock (void)
+{
+  if (init_needed)
+    call_once (&init_once, atomic_init);
+  return &mutex;
+}
+
+# endif
+
+# if (defined _WIN32 || defined __CYGWIN__) && !defined _MSC_VER
+/* Make sure the '__declspec(dllimport)' in mbrtowc.c and mbrtoc32.c does not
+   cause a link failure when no DLLs are involved.  */
+#  if defined _WIN64 || defined _LP64
+#   define IMP(x) __imp_##x
+#  else
+#   define IMP(x) _imp__##x
+#  endif
+void * IMP(gl_get_mbtowc_lock) = &gl_get_mbtowc_lock;
+# endif
+
+#endif
diff --git a/lib/mbtowc-lock.h b/lib/mbtowc-lock.h
new file mode 100644
index 0000000..d31b0b6
--- /dev/null
+++ b/lib/mbtowc-lock.h
@@ -0,0 +1,125 @@
+/* Use the internal lock used by mbrtowc and mbrtoc32.
+   Copyright (C) 2019-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2019-2020.  */
+
+/* Use a lock, so that no two threads can invoke mbtowc at the same time.  */
+
+static inline int
+mbtowc_unlocked (wchar_t *pwc, const char *p, size_t m)
+{
+  /* Put the hidden internal state of mbtowc into its initial state.
+     This is needed at least with glibc, uClibc, and MSVC CRT.
+     See <https://sourceware.org/bugzilla/show_bug.cgi?id=9674>.  */
+  mbtowc (NULL, NULL, 0);
+
+  return mbtowc (pwc, p, m);
+}
+
+/* Prohibit renaming this symbol.  */
+#undef gl_get_mbtowc_lock
+
+#if GNULIB_MBRTOWC_SINGLE_THREAD
+
+/* All uses of this function are in a single thread.  No locking needed.  */
+
+static int
+mbtowc_with_lock (wchar_t *pwc, const char *p, size_t m)
+{
+  return mbtowc_unlocked (pwc, p, m);
+}
+
+#elif defined _WIN32 && !defined __CYGWIN__
+
+extern __declspec(dllimport) CRITICAL_SECTION *gl_get_mbtowc_lock (void);
+
+static int
+mbtowc_with_lock (wchar_t *pwc, const char *p, size_t m)
+{
+  CRITICAL_SECTION *lock = gl_get_mbtowc_lock ();
+  int ret;
+
+  EnterCriticalSection (lock);
+  ret = mbtowc_unlocked (pwc, p, m);
+  LeaveCriticalSection (lock);
+
+  return ret;
+}
+
+#elif HAVE_PTHREAD_API /* AIX, IRIX, Cygwin */
+
+extern
+# if defined _WIN32 || defined __CYGWIN__
+  __declspec(dllimport)
+# endif
+  pthread_mutex_t *gl_get_mbtowc_lock (void);
+
+# if HAVE_WEAK_SYMBOLS /* IRIX */
+
+   /* Avoid the need to link with '-lpthread'.  */
+#  pragma weak pthread_mutex_lock
+#  pragma weak pthread_mutex_unlock
+
+   /* Determine whether libpthread is in use.  */
+#  pragma weak pthread_mutexattr_gettype
+   /* See the comments in lock.h.  */
+#  define pthread_in_use() \
+     (pthread_mutexattr_gettype != NULL || c11_threads_in_use ())
+
+# else
+#  define pthread_in_use() 1
+# endif
+
+static int
+mbtowc_with_lock (wchar_t *pwc, const char *p, size_t m)
+{
+  if (pthread_in_use())
+    {
+      pthread_mutex_t *lock = gl_get_mbtowc_lock ();
+      int ret;
+
+      if (pthread_mutex_lock (lock))
+        abort ();
+      ret = mbtowc_unlocked (pwc, p, m);
+      if (pthread_mutex_unlock (lock))
+        abort ();
+
+      return ret;
+    }
+  else
+    return mbtowc_unlocked (pwc, p, m);
+}
+
+#elif HAVE_THREADS_H
+
+extern mtx_t *gl_get_mbtowc_lock (void);
+
+static int
+mbtowc_with_lock (wchar_t *pwc, const char *p, size_t m)
+{
+  mtx_t *lock = gl_get_mbtowc_lock ();
+  int ret;
+
+  if (mtx_lock (lock) != thrd_success)
+    abort ();
+  ret = mbtowc_unlocked (pwc, p, m);
+  if (mtx_unlock (lock) != thrd_success)
+    abort ();
+
+  return ret;
+}
+
+#endif
diff --git a/lib/memchr.c b/lib/memchr.c
index 4e0c5f9..56fd59d 100644
--- a/lib/memchr.c
+++ b/lib/memchr.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2019
+/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2021
    Free Software Foundation, Inc.
 
    Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
@@ -7,21 +7,21 @@
    adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
    and implemented by Roland McGrath (roland@ai.mit.edu).
 
-NOTE: The canonical source of this file is maintained with the GNU C Library.
-Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+   NOTE: The canonical source of this file is maintained with the GNU C Library.
+   Bugs can be reported to bug-glibc@prep.ai.mit.edu.
 
-This program is free software: you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3 of the License, or any
-later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _LIBC
 # include <config.h>
diff --git a/lib/memchr.valgrind b/lib/memchr.valgrind
index 1d60e29..4f16481 100644
--- a/lib/memchr.valgrind
+++ b/lib/memchr.valgrind
@@ -1,18 +1,18 @@
 # Suppress a valgrind message about use of uninitialized memory in memchr().
 
-# Copyright (C) 2009-2019 Free Software Foundation, Inc.
+# Copyright (C) 2009-2021 Free Software Foundation, Inc.
 #
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
+# This file is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of the
+# License, or (at your option) any later version.
 #
-# This program is distributed in the hope that it will be useful,
+# This file is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
+# GNU Lesser General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License
+# You should have received a copy of the GNU Lesser General Public License
 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 # POSIX states that when the character is found, memchr must not read extra
diff --git a/lib/mempcpy.c b/lib/mempcpy.c
new file mode 100644
index 0000000..cacacdb
--- /dev/null
+++ b/lib/mempcpy.c
@@ -0,0 +1,33 @@
+/* Copy memory area and return pointer after last written byte.
+   Copyright (C) 2003, 2007, 2009-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <string.h>
+
+/* A function definition is only needed if HAVE_MEMPCPY is not defined.  */
+#if !HAVE_MEMPCPY
+
+/* Copy N bytes of SRC to DEST, return pointer to bytes after the
+   last written byte.  */
+void *
+mempcpy (void *dest, const void *src, size_t n)
+{
+  return (char *) memcpy (dest, src, n) + n;
+}
+
+#endif
diff --git a/lib/memrchr.c b/lib/memrchr.c
new file mode 100644
index 0000000..e0d47d1
--- /dev/null
+++ b/lib/memrchr.c
@@ -0,0 +1,161 @@
+/* memrchr -- find the last occurrence of a byte in a memory block
+
+   Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2021 Free Software
+   Foundation, Inc.
+
+   Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
+   with help from Dan Sahlin (dan@sics.se) and
+   commentary by Jim Blandy (jimb@ai.mit.edu);
+   adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
+   and implemented by Roland McGrath (roland@ai.mit.edu).
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#if defined _LIBC
+# include <memcopy.h>
+#else
+# include <config.h>
+# define reg_char char
+#endif
+
+#include <string.h>
+#include <limits.h>
+
+#undef __memrchr
+#ifdef _LIBC
+# undef memrchr
+#endif
+
+#ifndef weak_alias
+# define __memrchr memrchr
+#endif
+
+/* Search no more than N bytes of S for C.  */
+void *
+__memrchr (void const *s, int c_in, size_t n)
+{
+  /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
+     long instead of a 64-bit uintmax_t tends to give better
+     performance.  On 64-bit hardware, unsigned long is generally 64
+     bits already.  Change this typedef to experiment with
+     performance.  */
+  typedef unsigned long int longword;
+
+  const unsigned char *char_ptr;
+  const longword *longword_ptr;
+  longword repeated_one;
+  longword repeated_c;
+  unsigned reg_char c;
+
+  c = (unsigned char) c_in;
+
+  /* Handle the last few bytes by reading one byte at a time.
+     Do this until CHAR_PTR is aligned on a longword boundary.  */
+  for (char_ptr = (const unsigned char *) s + n;
+       n > 0 && (size_t) char_ptr % sizeof (longword) != 0;
+       --n)
+    if (*--char_ptr == c)
+      return (void *) char_ptr;
+
+  longword_ptr = (const void *) char_ptr;
+
+  /* All these elucidatory comments refer to 4-byte longwords,
+     but the theory applies equally well to any size longwords.  */
+
+  /* Compute auxiliary longword values:
+     repeated_one is a value which has a 1 in every byte.
+     repeated_c has c in every byte.  */
+  repeated_one = 0x01010101;
+  repeated_c = c | (c << 8);
+  repeated_c |= repeated_c << 16;
+  if (0xffffffffU < (longword) -1)
+    {
+      repeated_one |= repeated_one << 31 << 1;
+      repeated_c |= repeated_c << 31 << 1;
+      if (8 < sizeof (longword))
+        {
+          size_t i;
+
+          for (i = 64; i < sizeof (longword) * 8; i *= 2)
+            {
+              repeated_one |= repeated_one << i;
+              repeated_c |= repeated_c << i;
+            }
+        }
+    }
+
+  /* Instead of the traditional loop which tests each byte, we will test a
+     longword at a time.  The tricky part is testing if *any of the four*
+     bytes in the longword in question are equal to c.  We first use an xor
+     with repeated_c.  This reduces the task to testing whether *any of the
+     four* bytes in longword1 is zero.
+
+     We compute tmp =
+       ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+     That is, we perform the following operations:
+       1. Subtract repeated_one.
+       2. & ~longword1.
+       3. & a mask consisting of 0x80 in every byte.
+     Consider what happens in each byte:
+       - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
+         and step 3 transforms it into 0x80.  A carry can also be propagated
+         to more significant bytes.
+       - If a byte of longword1 is nonzero, let its lowest 1 bit be at
+         position k (0 <= k <= 7); so the lowest k bits are 0.  After step 1,
+         the byte ends in a single bit of value 0 and k bits of value 1.
+         After step 2, the result is just k bits of value 1: 2^k - 1.  After
+         step 3, the result is 0.  And no carry is produced.
+     So, if longword1 has only non-zero bytes, tmp is zero.
+     Whereas if longword1 has a zero byte, call j the position of the least
+     significant zero byte.  Then the result has a zero at positions 0, ...,
+     j-1 and a 0x80 at position j.  We cannot predict the result at the more
+     significant bytes (positions j+1..3), but it does not matter since we
+     already have a non-zero bit at position 8*j+7.
+
+     So, the test whether any byte in longword1 is zero is equivalent to
+     testing whether tmp is nonzero.  */
+
+  while (n >= sizeof (longword))
+    {
+      longword longword1 = *--longword_ptr ^ repeated_c;
+
+      if ((((longword1 - repeated_one) & ~longword1)
+           & (repeated_one << 7)) != 0)
+        {
+          longword_ptr++;
+          break;
+        }
+      n -= sizeof (longword);
+    }
+
+  char_ptr = (const unsigned char *) longword_ptr;
+
+  /* At this point, we know that either n < sizeof (longword), or one of the
+     sizeof (longword) bytes starting at char_ptr is == c.  On little-endian
+     machines, we could determine the first such byte without any further
+     memory accesses, just by looking at the tmp result from the last loop
+     iteration.  But this does not work on big-endian machines.  Choose code
+     that works in both cases.  */
+
+  while (n-- > 0)
+    {
+      if (*--char_ptr == c)
+        return (void *) char_ptr;
+    }
+
+  return NULL;
+}
+#ifdef weak_alias
+weak_alias (__memrchr, memrchr)
+#endif
diff --git a/lib/minmax.h b/lib/minmax.h
index d7f6bea..a03361b 100644
--- a/lib/minmax.h
+++ b/lib/minmax.h
@@ -1,19 +1,19 @@
 /* MIN, MAX macros.
-   Copyright (C) 1995, 1998, 2001, 2003, 2005, 2009-2019 Free Software
+   Copyright (C) 1995, 1998, 2001, 2003, 2005, 2009-2021 Free Software
    Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _MINMAX_H
 #define _MINMAX_H
diff --git a/lib/msvc-inval.c b/lib/msvc-inval.c
index 75b5a07..a23dac9 100644
--- a/lib/msvc-inval.c
+++ b/lib/msvc-inval.c
@@ -1,18 +1,18 @@
 /* Invalid parameter handler for MSVC runtime libraries.
-   Copyright (C) 2011-2019 Free Software Foundation, Inc.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
diff --git a/lib/msvc-inval.h b/lib/msvc-inval.h
index 9d3aa1f..e115a35 100644
--- a/lib/msvc-inval.h
+++ b/lib/msvc-inval.h
@@ -1,18 +1,18 @@
 /* Invalid parameter handler for MSVC runtime libraries.
-   Copyright (C) 2011-2019 Free Software Foundation, Inc.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _MSVC_INVAL_H
 #define _MSVC_INVAL_H
diff --git a/lib/msvc-nothrow.c b/lib/msvc-nothrow.c
index 49b709c..d3c1f54 100644
--- a/lib/msvc-nothrow.c
+++ b/lib/msvc-nothrow.c
@@ -1,19 +1,19 @@
 /* Wrappers that don't throw invalid parameter notifications
    with MSVC runtime libraries.
-   Copyright (C) 2011-2019 Free Software Foundation, Inc.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
diff --git a/lib/msvc-nothrow.h b/lib/msvc-nothrow.h
index 8d3ca78..057b5dd 100644
--- a/lib/msvc-nothrow.h
+++ b/lib/msvc-nothrow.h
@@ -1,19 +1,19 @@
 /* Wrappers that don't throw invalid parameter notifications
    with MSVC runtime libraries.
-   Copyright (C) 2011-2019 Free Software Foundation, Inc.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _MSVC_NOTHROW_H
 #define _MSVC_NOTHROW_H
diff --git a/lib/obstack.c b/lib/obstack.c
index abdd713..3017b58 100644
--- a/lib/obstack.c
+++ b/lib/obstack.c
@@ -1,20 +1,19 @@
 /* obstack.c - subroutines used implicitly by object stack macros
-   Copyright (C) 1988-2019 Free Software Foundation, Inc.
+   Copyright (C) 1988-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public
-   License as published by the Free Software Foundation; either
-   version 3 of the License, or (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
 
-   The GNU C Library is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 
 #ifdef _LIBC
@@ -326,7 +325,7 @@
 #   include <libio/iolibio.h>
 #  endif
 
-static _Noreturn void
+static __attribute_noreturn__ void
 print_and_abort (void)
 {
   /* Don't change any of these strings.  Yes, it would be possible to add
diff --git a/lib/obstack.h b/lib/obstack.h
index 9fc6455..92aa49f 100644
--- a/lib/obstack.h
+++ b/lib/obstack.h
@@ -1,20 +1,19 @@
 /* obstack.h - object stack macros
-   Copyright (C) 1988-2019 Free Software Foundation, Inc.
+   Copyright (C) 1988-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public
-   License as published by the Free Software Foundation; either
-   version 3 of the License, or (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
 
-   The GNU C Library is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Summary:
 
@@ -153,7 +152,7 @@
 
 /* Not the same as _Noreturn, since it also works with function pointers.  */
 #ifndef __attribute_noreturn__
-# if 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
+# if 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || defined __clang__ || 0x5110 <= __SUNPRO_C
 #  define __attribute_noreturn__ __attribute__ ((__noreturn__))
 # else
 #  define __attribute_noreturn__
@@ -283,8 +282,9 @@
 
 #define obstack_memory_used(h) _obstack_memory_used (h)
 
-#if defined __GNUC__
-# if !defined __GNUC_MINOR__ || __GNUC__ * 1000 + __GNUC_MINOR__ < 2008
+#if defined __GNUC__ || defined __clang__
+# if !(defined __GNUC_MINOR__ && __GNUC__ * 1000 + __GNUC_MINOR__ >= 2008 \
+       || defined __clang__)
 #  define __extension__
 # endif
 
diff --git a/lib/obstack_printf.c b/lib/obstack_printf.c
index 42bf09e..e540c33 100644
--- a/lib/obstack_printf.c
+++ b/lib/obstack_printf.c
@@ -1,18 +1,18 @@
 /* Formatted output to obstacks.
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License,
+   or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
diff --git a/lib/open.c b/lib/open.c
index 0c2742b..372cda8 100644
--- a/lib/open.c
+++ b/lib/open.c
@@ -1,17 +1,17 @@
 /* Open a descriptor to a file.
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2007.  */
@@ -30,7 +30,11 @@
 static int
 orig_open (const char *filename, int flags, mode_t mode)
 {
+#if defined _WIN32 && !defined __CYGWIN__
+  return _open (filename, flags, mode);
+#else
   return open (filename, flags, mode);
+#endif
 }
 
 /* Specification.  */
@@ -110,7 +114,9 @@
          directories,
        - if O_WRONLY or O_RDWR is specified, open() must fail because the
          file does not contain a '.' directory.  */
-  if (flags & (O_CREAT | O_WRONLY | O_RDWR))
+  if ((flags & O_CREAT)
+      || (flags & O_ACCMODE) == O_RDWR
+      || (flags & O_ACCMODE) == O_WRONLY)
     {
       size_t len = strlen (filename);
       if (len > 0 && filename[len - 1] == '/')
@@ -122,7 +128,7 @@
 #endif
 
   fd = orig_open (filename,
-                  flags & ~(have_cloexec <= 0 ? O_CLOEXEC : 0), mode);
+                  flags & ~(have_cloexec < 0 ? O_CLOEXEC : 0), mode);
 
   if (flags & O_CLOEXEC)
     {
diff --git a/lib/openat-die.c b/lib/openat-die.c
new file mode 100644
index 0000000..f30e210
--- /dev/null
+++ b/lib/openat-die.c
@@ -0,0 +1,62 @@
+/* Report a save- or restore-cwd failure in our openat replacement and then exit.
+
+   Copyright (C) 2005-2006, 2008-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "openat.h"
+
+#include <stdlib.h>
+
+#ifndef GNULIB_LIBPOSIX
+# include "error.h"
+#endif
+
+#include "exitfail.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+_Noreturn void
+openat_save_fail (int errnum)
+{
+#ifndef GNULIB_LIBPOSIX
+  error (exit_failure, errnum,
+         _("unable to record current working directory"));
+#endif
+  /* _Noreturn cannot be applied to error, since it returns
+     when its first argument is 0.  To help compilers understand that this
+     function does not return, call abort.  Also, the abort is a
+     safety feature if exit_failure is 0 (which shouldn't happen).  */
+  abort ();
+}
+
+
+/* Exit with an error about failure to restore the working directory
+   during an openat emulation.  The caller must ensure that fd 2 is
+   not a just-opened fd, even when openat_safer is not in use.  */
+
+_Noreturn void
+openat_restore_fail (int errnum)
+{
+#ifndef GNULIB_LIBPOSIX
+  error (exit_failure, errnum,
+         _("failed to return to initial working directory"));
+#endif
+
+  /* As above.  */
+  abort ();
+}
diff --git a/lib/openat-priv.h b/lib/openat-priv.h
new file mode 100644
index 0000000..5c42d03
--- /dev/null
+++ b/lib/openat-priv.h
@@ -0,0 +1,64 @@
+/* Internals for openat-like functions.
+
+   Copyright (C) 2005-2006, 2009-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* written by Jim Meyering */
+
+#ifndef _GL_HEADER_OPENAT_PRIV
+#define _GL_HEADER_OPENAT_PRIV
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+/* Maximum number of bytes that it is safe to allocate as a single
+   array on the stack, and that is known as a compile-time constant.
+   The assumption is that we'll touch the array very quickly, or a
+   temporary very near the array, provoking an out-of-memory trap.  On
+   some operating systems, there is only one guard page for the stack,
+   and a page size can be as small as 4096 bytes.  Subtract 64 in the
+   hope that this will let the compiler touch a nearby temporary and
+   provoke a trap.  */
+#define SAFER_ALLOCA_MAX (4096 - 64)
+
+#define SAFER_ALLOCA(m) ((m) < SAFER_ALLOCA_MAX ? (m) : SAFER_ALLOCA_MAX)
+
+#if defined PATH_MAX
+# define OPENAT_BUFFER_SIZE SAFER_ALLOCA (PATH_MAX)
+#elif defined _XOPEN_PATH_MAX
+# define OPENAT_BUFFER_SIZE SAFER_ALLOCA (_XOPEN_PATH_MAX)
+#else
+# define OPENAT_BUFFER_SIZE SAFER_ALLOCA (1024)
+#endif
+
+char *openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file);
+
+/* Trying to access a BUILD_PROC_NAME file will fail on systems without
+   /proc support, and even on systems *with* ProcFS support.  Return
+   nonzero if the failure may be legitimate, e.g., because /proc is not
+   readable, or the particular .../fd/N directory is not present.  */
+#define EXPECTED_ERRNO(Errno)                   \
+  ((Errno) == ENOTDIR || (Errno) == ENOENT      \
+   || (Errno) == EPERM || (Errno) == EACCES     \
+   || (Errno) == ENOSYS /* Solaris 8 */         \
+   || (Errno) == EOPNOTSUPP /* FreeBSD */)
+
+/* Wrapper function shared among linkat and renameat.  */
+int at_func2 (int fd1, char const *file1,
+              int fd2, char const *file2,
+              int (*func) (char const *file1, char const *file2));
+
+#endif /* _GL_HEADER_OPENAT_PRIV */
diff --git a/lib/openat-proc.c b/lib/openat-proc.c
new file mode 100644
index 0000000..4f8be90
--- /dev/null
+++ b/lib/openat-proc.c
@@ -0,0 +1,135 @@
+/* Create /proc/self/fd-related names for subfiles of open directories.
+
+   Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Paul Eggert.  */
+
+#include <config.h>
+
+#include "openat-priv.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifdef __KLIBC__
+# include <InnoTekLIBC/backend.h>
+#endif
+
+#include "intprops.h"
+
+/* Set BUF to the name of the subfile of the directory identified by
+   FD, where the subfile is named FILE.  If successful, return BUF if
+   the result fits in BUF, dynamically allocated memory otherwise.
+   Return NULL (setting errno) on error.  */
+char *
+openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file)
+{
+  char *result = buf;
+  int dirlen;
+
+  /* Make sure the caller gets ENOENT when appropriate.  */
+  if (!*file)
+    {
+      buf[0] = '\0';
+      return buf;
+    }
+
+#ifndef __KLIBC__
+# define PROC_SELF_FD_FORMAT "/proc/self/fd/%d/"
+  {
+    enum {
+      PROC_SELF_FD_DIR_SIZE_BOUND
+        = (sizeof PROC_SELF_FD_FORMAT - (sizeof "%d" - 1)
+           + INT_STRLEN_BOUND (int))
+    };
+
+    static int proc_status = 0;
+    if (! proc_status)
+      {
+        /* Set PROC_STATUS to a positive value if /proc/self/fd is
+           reliable, and a negative value otherwise.  Solaris 10
+           /proc/self/fd mishandles "..", and any file name might expand
+           to ".." after symbolic link expansion, so avoid /proc/self/fd
+           if it mishandles "..".  Solaris 10 has openat, but this
+           problem is exhibited on code that built on Solaris 8 and
+           running on Solaris 10.  */
+
+        int proc_self_fd =
+          open ("/proc/self/fd",
+                O_SEARCH | O_DIRECTORY | O_NOCTTY | O_NONBLOCK | O_CLOEXEC);
+        if (proc_self_fd < 0)
+          proc_status = -1;
+        else
+          {
+            /* Detect whether /proc/self/fd/%i/../fd exists, where %i is the
+               number of a file descriptor open on /proc/self/fd.  On Linux,
+               that name resolves to /proc/self/fd, which was opened above.
+               However, on Solaris, it may resolve to /proc/self/fd/fd, which
+               cannot exist, since all names in /proc/self/fd are numeric.  */
+            char dotdot_buf[PROC_SELF_FD_DIR_SIZE_BOUND + sizeof "../fd" - 1];
+            sprintf (dotdot_buf, PROC_SELF_FD_FORMAT "../fd", proc_self_fd);
+            proc_status = access (dotdot_buf, F_OK) ? -1 : 1;
+            close (proc_self_fd);
+          }
+      }
+
+    if (proc_status < 0)
+      return NULL;
+    else
+      {
+        size_t bufsize = PROC_SELF_FD_DIR_SIZE_BOUND + strlen (file);
+        if (OPENAT_BUFFER_SIZE < bufsize)
+          {
+            result = malloc (bufsize);
+            if (! result)
+              return NULL;
+          }
+
+        dirlen = sprintf (result, PROC_SELF_FD_FORMAT, fd);
+      }
+  }
+#else
+  /* OS/2 kLIBC provides a function to retrieve a path from a fd.  */
+  {
+    char dir[_MAX_PATH];
+    size_t bufsize;
+
+    if (__libc_Back_ioFHToPath (fd, dir, sizeof dir))
+      return NULL;
+
+    dirlen = strlen (dir);
+    bufsize = dirlen + 1 + strlen (file) + 1; /* 1 for '/', 1 for null */
+    if (OPENAT_BUFFER_SIZE < bufsize)
+      {
+        result = malloc (bufsize);
+        if (! result)
+          return NULL;
+      }
+
+    strcpy (result, dir);
+    result[dirlen++] = '/';
+  }
+#endif
+
+  strcpy (result + dirlen, file);
+  return result;
+}
diff --git a/lib/openat.c b/lib/openat.c
new file mode 100644
index 0000000..ac92374
--- /dev/null
+++ b/lib/openat.c
@@ -0,0 +1,312 @@
+/* provide a replacement openat function
+   Copyright (C) 2004-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* written by Jim Meyering */
+
+/* If the user's config.h happens to include <fcntl.h>, let it include only
+   the system's <fcntl.h> here, so that orig_openat doesn't recurse to
+   rpl_openat.  */
+#define __need_system_fcntl_h
+#include <config.h>
+
+/* Get the original definition of open.  It might be defined as a macro.  */
+#include <fcntl.h>
+#include <sys/types.h>
+#undef __need_system_fcntl_h
+
+#if HAVE_OPENAT
+static int
+orig_openat (int fd, char const *filename, int flags, mode_t mode)
+{
+  return openat (fd, filename, flags, mode);
+}
+#endif
+
+/* Write "fcntl.h" here, not <fcntl.h>, otherwise OSF/1 5.1 DTK cc eliminates
+   this include because of the preliminary #include <fcntl.h> above.  */
+#include "fcntl.h"
+
+#include "openat.h"
+
+#include "cloexec.h"
+
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+#if HAVE_OPENAT
+
+/* Like openat, but support O_CLOEXEC and work around Solaris 9 bugs
+   with trailing slash.  */
+int
+rpl_openat (int dfd, char const *filename, int flags, ...)
+{
+  /* 0 = unknown, 1 = yes, -1 = no.  */
+#if GNULIB_defined_O_CLOEXEC
+  int have_cloexec = -1;
+#else
+  static int have_cloexec;
+#endif
+
+  mode_t mode;
+  int fd;
+
+  mode = 0;
+  if (flags & O_CREAT)
+    {
+      va_list arg;
+      va_start (arg, flags);
+
+      /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+         creates crashing code when 'mode_t' is smaller than 'int'.  */
+      mode = va_arg (arg, PROMOTED_MODE_T);
+
+      va_end (arg);
+    }
+
+# if OPEN_TRAILING_SLASH_BUG
+  /* Fail if one of O_CREAT, O_WRONLY, O_RDWR is specified and the filename
+     ends in a slash, as POSIX says such a filename must name a directory
+     <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13>:
+       "A pathname that contains at least one non-<slash> character and that
+        ends with one or more trailing <slash> characters shall not be resolved
+        successfully unless the last pathname component before the trailing
+        <slash> characters names an existing directory"
+     If the named file already exists as a directory, then
+       - if O_CREAT is specified, open() must fail because of the semantics
+         of O_CREAT,
+       - if O_WRONLY or O_RDWR is specified, open() must fail because POSIX
+         <https://pubs.opengroup.org/onlinepubs/9699919799/functions/openat.html>
+         says that it fails with errno = EISDIR in this case.
+     If the named file does not exist or does not name a directory, then
+       - if O_CREAT is specified, open() must fail since open() cannot create
+         directories,
+       - if O_WRONLY or O_RDWR is specified, open() must fail because the
+         file does not contain a '.' directory.  */
+  if ((flags & O_CREAT)
+      || (flags & O_ACCMODE) == O_RDWR
+      || (flags & O_ACCMODE) == O_WRONLY)
+    {
+      size_t len = strlen (filename);
+      if (len > 0 && filename[len - 1] == '/')
+        {
+          errno = EISDIR;
+          return -1;
+        }
+    }
+# endif
+
+  fd = orig_openat (dfd, filename,
+                    flags & ~(have_cloexec < 0 ? O_CLOEXEC : 0), mode);
+
+  if (flags & O_CLOEXEC)
+    {
+      if (! have_cloexec)
+        {
+          if (0 <= fd)
+            have_cloexec = 1;
+          else if (errno == EINVAL)
+            {
+              fd = orig_openat (dfd, filename, flags & ~O_CLOEXEC, mode);
+              have_cloexec = -1;
+            }
+        }
+      if (have_cloexec < 0 && 0 <= fd)
+        set_cloexec_flag (fd, true);
+    }
+
+
+# if OPEN_TRAILING_SLASH_BUG
+  /* If the filename ends in a slash and fd does not refer to a directory,
+     then fail.
+     Rationale: POSIX says such a filename must name a directory
+     <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13>:
+       "A pathname that contains at least one non-<slash> character and that
+        ends with one or more trailing <slash> characters shall not be resolved
+        successfully unless the last pathname component before the trailing
+        <slash> characters names an existing directory"
+     If the named file without the slash is not a directory, open() must fail
+     with ENOTDIR.  */
+  if (fd >= 0)
+    {
+      /* We know len is positive, since open did not fail with ENOENT.  */
+      size_t len = strlen (filename);
+      if (filename[len - 1] == '/')
+        {
+          struct stat statbuf;
+
+          if (fstat (fd, &statbuf) >= 0 && !S_ISDIR (statbuf.st_mode))
+            {
+              close (fd);
+              errno = ENOTDIR;
+              return -1;
+            }
+        }
+    }
+# endif
+
+  return fd;
+}
+
+#else /* !HAVE_OPENAT */
+
+# include "filename.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
+# include "openat-priv.h"
+# include "save-cwd.h"
+
+/* Replacement for Solaris' openat function.
+   <https://www.google.com/search?q=openat+site:docs.oracle.com>
+   First, try to simulate it via open ("/proc/self/fd/FD/FILE").
+   Failing that, simulate it by doing save_cwd/fchdir/open/restore_cwd.
+   If either the save_cwd or the restore_cwd fails (relatively unlikely),
+   then give a diagnostic and exit nonzero.
+   Otherwise, upon failure, set errno and return -1, as openat does.
+   Upon successful completion, return a file descriptor.  */
+int
+openat (int fd, char const *file, int flags, ...)
+{
+  mode_t mode = 0;
+
+  if (flags & O_CREAT)
+    {
+      va_list arg;
+      va_start (arg, flags);
+
+      /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+         creates crashing code when 'mode_t' is smaller than 'int'.  */
+      mode = va_arg (arg, PROMOTED_MODE_T);
+
+      va_end (arg);
+    }
+
+  return openat_permissive (fd, file, flags, mode, NULL);
+}
+
+/* Like openat (FD, FILE, FLAGS, MODE), but if CWD_ERRNO is
+   nonnull, set *CWD_ERRNO to an errno value if unable to save
+   or restore the initial working directory.  This is needed only
+   the first time remove.c's remove_dir opens a command-line
+   directory argument.
+
+   If a previous attempt to restore the current working directory
+   failed, then we must not even try to access a '.'-relative name.
+   It is the caller's responsibility not to call this function
+   in that case.  */
+
+int
+openat_permissive (int fd, char const *file, int flags, mode_t mode,
+                   int *cwd_errno)
+{
+  struct saved_cwd saved_cwd;
+  int saved_errno;
+  int err;
+  bool save_ok;
+
+  if (fd == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file))
+    return open (file, flags, mode);
+
+  {
+    char buf[OPENAT_BUFFER_SIZE];
+    char *proc_file = openat_proc_name (buf, fd, file);
+    if (proc_file)
+      {
+        int open_result = open (proc_file, flags, mode);
+        int open_errno = errno;
+        if (proc_file != buf)
+          free (proc_file);
+        /* If the syscall succeeds, or if it fails with an unexpected
+           errno value, then return right away.  Otherwise, fall through
+           and resort to using save_cwd/restore_cwd.  */
+        if (0 <= open_result || ! EXPECTED_ERRNO (open_errno))
+          {
+            errno = open_errno;
+            return open_result;
+          }
+      }
+  }
+
+  save_ok = (save_cwd (&saved_cwd) == 0);
+  if (! save_ok)
+    {
+      if (! cwd_errno)
+        openat_save_fail (errno);
+      *cwd_errno = errno;
+    }
+  if (0 <= fd && fd == saved_cwd.desc)
+    {
+      /* If saving the working directory collides with the user's
+         requested fd, then the user's fd must have been closed to
+         begin with.  */
+      free_cwd (&saved_cwd);
+      errno = EBADF;
+      return -1;
+    }
+
+  err = fchdir (fd);
+  saved_errno = errno;
+
+  if (! err)
+    {
+      err = open (file, flags, mode);
+      saved_errno = errno;
+      if (save_ok && restore_cwd (&saved_cwd) != 0)
+        {
+          if (! cwd_errno)
+            {
+              /* Don't write a message to just-created fd 2.  */
+              saved_errno = errno;
+              if (err == STDERR_FILENO)
+                close (err);
+              openat_restore_fail (saved_errno);
+            }
+          *cwd_errno = errno;
+        }
+    }
+
+  free_cwd (&saved_cwd);
+  errno = saved_errno;
+  return err;
+}
+
+/* Return true if our openat implementation must resort to
+   using save_cwd and restore_cwd.  */
+bool
+openat_needs_fchdir (void)
+{
+  bool needs_fchdir = true;
+  int fd = open ("/", O_SEARCH | O_CLOEXEC);
+
+  if (0 <= fd)
+    {
+      char buf[OPENAT_BUFFER_SIZE];
+      char *proc_file = openat_proc_name (buf, fd, ".");
+      if (proc_file)
+        {
+          needs_fchdir = false;
+          if (proc_file != buf)
+            free (proc_file);
+        }
+      close (fd);
+    }
+
+  return needs_fchdir;
+}
+
+#endif /* !HAVE_OPENAT */
diff --git a/lib/openat.h b/lib/openat.h
new file mode 100644
index 0000000..7098124
--- /dev/null
+++ b/lib/openat.h
@@ -0,0 +1,123 @@
+/* provide a replacement openat function
+   Copyright (C) 2004-2006, 2008-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* written by Jim Meyering */
+
+#ifndef _GL_HEADER_OPENAT
+#define _GL_HEADER_OPENAT
+
+#include <fcntl.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdbool.h>
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+
+#if !HAVE_OPENAT
+
+int openat_permissive (int fd, char const *file, int flags, mode_t mode,
+                       int *cwd_errno);
+bool openat_needs_fchdir (void);
+
+#else
+
+# define openat_permissive(Fd, File, Flags, Mode, Cwd_errno) \
+    openat (Fd, File, Flags, Mode)
+# define openat_needs_fchdir() false
+
+#endif
+
+_Noreturn void openat_restore_fail (int);
+_Noreturn void openat_save_fail (int);
+
+/* Using these function names makes application code
+   slightly more readable than it would be with
+   fchownat (..., 0) or fchownat (..., AT_SYMLINK_NOFOLLOW).  */
+
+#if GNULIB_CHOWNAT
+
+# ifndef CHOWNAT_INLINE
+#  define CHOWNAT_INLINE _GL_INLINE
+# endif
+
+CHOWNAT_INLINE int
+chownat (int fd, char const *file, uid_t owner, gid_t group)
+{
+  return fchownat (fd, file, owner, group, 0);
+}
+
+CHOWNAT_INLINE int
+lchownat (int fd, char const *file, uid_t owner, gid_t group)
+{
+  return fchownat (fd, file, owner, group, AT_SYMLINK_NOFOLLOW);
+}
+
+#endif
+
+#if GNULIB_CHMODAT
+
+# ifndef CHMODAT_INLINE
+#  define CHMODAT_INLINE _GL_INLINE
+# endif
+
+CHMODAT_INLINE int
+chmodat (int fd, char const *file, mode_t mode)
+{
+  return fchmodat (fd, file, mode, 0);
+}
+
+CHMODAT_INLINE int
+lchmodat (int fd, char const *file, mode_t mode)
+{
+  return fchmodat (fd, file, mode, AT_SYMLINK_NOFOLLOW);
+}
+
+#endif
+
+#if GNULIB_STATAT
+
+# ifndef STATAT_INLINE
+#  define STATAT_INLINE _GL_INLINE
+# endif
+
+STATAT_INLINE int
+statat (int fd, char const *name, struct stat *st)
+{
+  return fstatat (fd, name, st, 0);
+}
+
+STATAT_INLINE int
+lstatat (int fd, char const *name, struct stat *st)
+{
+  return fstatat (fd, name, st, AT_SYMLINK_NOFOLLOW);
+}
+
+#endif
+
+/* For now, there are no wrappers named laccessat or leuidaccessat,
+   since gnulib doesn't support faccessat(,AT_SYMLINK_NOFOLLOW) and
+   since access rights on symlinks are of limited utility.  Likewise,
+   wrappers are not provided for accessat or euidaccessat, so as to
+   avoid dragging in -lgen on some platforms.  */
+
+_GL_INLINE_HEADER_END
+
+#endif /* _GL_HEADER_OPENAT */
diff --git a/lib/opendir.c b/lib/opendir.c
new file mode 100644
index 0000000..2b86529
--- /dev/null
+++ b/lib/opendir.c
@@ -0,0 +1,179 @@
+/* Start reading the entries of a directory.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <dirent.h>
+
+#include <errno.h>
+#include <stddef.h>
+
+#if HAVE_OPENDIR
+
+/* Override opendir(), to keep track of the open file descriptors.
+   Needed because there is a function dirfd().  */
+
+#else
+
+# include <stdlib.h>
+
+# include "dirent-private.h"
+# include "filename.h"
+
+#endif
+
+#if REPLACE_FCHDIR
+# include <unistd.h>
+#endif
+
+#ifdef __KLIBC__
+# include <io.h>
+# include <fcntl.h>
+#endif
+
+#if defined _WIN32 && ! defined __CYGWIN__
+/* Don't assume that UNICODE is not defined.  */
+# undef WIN32_FIND_DATA
+# define WIN32_FIND_DATA WIN32_FIND_DATAA
+# undef GetFullPathName
+# define GetFullPathName GetFullPathNameA
+# undef FindFirstFile
+# define FindFirstFile FindFirstFileA
+#endif
+
+DIR *
+opendir (const char *dir_name)
+{
+#if HAVE_OPENDIR
+# undef opendir
+  DIR *dirp;
+
+  dirp = opendir (dir_name);
+  if (dirp == NULL)
+    return NULL;
+
+# ifdef __KLIBC__
+  {
+    int fd = open (dir_name, O_RDONLY);
+    if (fd == -1 || _gl_register_dirp_fd (fd, dirp))
+      {
+        int saved_errno = errno;
+
+        close (fd);
+        closedir (dirp);
+
+        errno = saved_errno;
+
+        return NULL;
+      }
+  }
+# endif
+#else
+
+  char dir_name_mask[MAX_PATH + 1 + 1 + 1];
+  int status;
+  HANDLE current;
+  WIN32_FIND_DATA entry;
+  struct gl_directory *dirp;
+
+  if (dir_name[0] == '\0')
+    {
+      errno = ENOENT;
+      return NULL;
+    }
+
+  /* Make the dir_name absolute, so that we continue reading the same
+     directory if the current directory changed between this opendir()
+     call and a subsequent rewinddir() call.  */
+  if (!GetFullPathName (dir_name, MAX_PATH, dir_name_mask, NULL))
+    {
+      errno = EINVAL;
+      return NULL;
+    }
+
+  /* Append the mask.
+     "*" and "*.*" appear to be equivalent.  */
+  {
+    char *p;
+
+    p = dir_name_mask + strlen (dir_name_mask);
+    if (p > dir_name_mask && !ISSLASH (p[-1]))
+      *p++ = '\\';
+    *p++ = '*';
+    *p = '\0';
+  }
+
+  /* Start searching the directory.  */
+  status = -1;
+  current = FindFirstFile (dir_name_mask, &entry);
+  if (current == INVALID_HANDLE_VALUE)
+    {
+      switch (GetLastError ())
+        {
+        case ERROR_FILE_NOT_FOUND:
+          status = -2;
+          break;
+        case ERROR_PATH_NOT_FOUND:
+          errno = ENOENT;
+          return NULL;
+        case ERROR_DIRECTORY:
+          errno = ENOTDIR;
+          return NULL;
+        case ERROR_ACCESS_DENIED:
+          errno = EACCES;
+          return NULL;
+        default:
+          errno = EIO;
+          return NULL;
+        }
+    }
+
+  /* Allocate the result.  */
+  dirp =
+    (struct gl_directory *)
+    malloc (offsetof (struct gl_directory, dir_name_mask[0])
+            + strlen (dir_name_mask) + 1);
+  if (dirp == NULL)
+    {
+      if (current != INVALID_HANDLE_VALUE)
+        FindClose (current);
+      errno = ENOMEM;
+      return NULL;
+    }
+  dirp->status = status;
+  dirp->current = current;
+  if (status == -1)
+    memcpy (&dirp->entry, &entry, sizeof (WIN32_FIND_DATA));
+  strcpy (dirp->dir_name_mask, dir_name_mask);
+
+#endif
+
+#if REPLACE_FCHDIR
+  {
+    int fd = dirfd (dirp);
+    if (0 <= fd && _gl_register_fd (fd, dir_name) != fd)
+      {
+        int saved_errno = errno;
+        closedir (dirp);
+        errno = saved_errno;
+        return NULL;
+      }
+  }
+#endif
+
+  return dirp;
+}
diff --git a/lib/os2-spawn.c b/lib/os2-spawn.c
new file mode 100644
index 0000000..d877bc6
--- /dev/null
+++ b/lib/os2-spawn.c
@@ -0,0 +1,155 @@
+/* Auxiliary functions for the creation of subprocesses.  OS/2 kLIBC API.
+   Copyright (C) 2001, 2003-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "os2-spawn.h"
+
+/* Get _open_osfhandle().  */
+#include <io.h>
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "cloexec.h"
+#include "error.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+
+/* Duplicates a file handle, making the copy uninheritable.
+   Returns -1 for a file handle that is equivalent to closed.  */
+static int
+dup_noinherit (int fd)
+{
+  fd = dup_cloexec (fd);
+  if (fd < 0 && errno == EMFILE)
+    error (EXIT_FAILURE, errno, _("_open_osfhandle failed"));
+
+  return fd;
+}
+
+/* Returns a file descriptor equivalent to FD, except that the resulting file
+   descriptor is none of STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO.
+   FD must be open and non-inheritable.  The result will be non-inheritable as
+   well.
+   If FD < 0, FD itself is returned.  */
+static int
+fd_safer_noinherit (int fd)
+{
+  if (STDIN_FILENO <= fd && fd <= STDERR_FILENO)
+    {
+      /* The recursion depth is at most 3.  */
+      int nfd = fd_safer_noinherit (dup_noinherit (fd));
+      int saved_errno = errno;
+      close (fd);
+      errno = saved_errno;
+      return nfd;
+    }
+  return fd;
+}
+
+int
+dup_safer_noinherit (int fd)
+{
+  return fd_safer_noinherit (dup_noinherit (fd));
+}
+
+void
+undup_safer_noinherit (int tempfd, int origfd)
+{
+  if (tempfd >= 0)
+    {
+      if (dup2 (tempfd, origfd) < 0)
+        error (EXIT_FAILURE, errno, _("cannot restore fd %d: dup2 failed"),
+               origfd);
+      close (tempfd);
+    }
+  else
+    {
+      /* origfd was closed or open to no handle at all.  Set it to a closed
+         state.  This is (nearly) equivalent to the original state.  */
+      close (origfd);
+    }
+}
+
+const char **
+prepare_spawn (const char * const *argv, char **mem_to_free)
+{
+  size_t argc;
+  const char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = (const char **) malloc ((1 + argc + 1) * sizeof (const char *));
+  if (new_argv == NULL)
+    return NULL;
+
+  /* Add an element upfront that can be used when argv[0] turns out to be a
+     script, not a program.
+     On Unix, this would be "/bin/sh".  */
+  new_argv[0] = "sh.exe";
+
+  /* Put quoted arguments into the new argument vector.  */
+  size_t needed_size = 0;
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+      const char *quoted_string = (string[0] == '\0' ? "\"\"" : string);
+      size_t length = strlen (quoted_string);
+      needed_size += length + 1;
+    }
+
+  char *mem;
+  if (needed_size == 0)
+    mem = NULL;
+  else
+    {
+      mem = (char *) malloc (needed_size);
+      if (mem == NULL)
+        {
+          /* Memory allocation failure.  */
+          free (new_argv);
+          errno = ENOMEM;
+          return NULL;
+        }
+    }
+  *mem_to_free = mem;
+
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      new_argv[1 + i] = mem;
+      const char *quoted_string = (string[0] == '\0' ? "\"\"" : string);
+      size_t length = strlen (quoted_string);
+      memcpy (mem, quoted_string, length + 1);
+      mem += length + 1;
+    }
+  new_argv[1 + argc] = NULL;
+
+  return new_argv;
+}
diff --git a/lib/os2-spawn.h b/lib/os2-spawn.h
new file mode 100644
index 0000000..761e260
--- /dev/null
+++ b/lib/os2-spawn.h
@@ -0,0 +1,33 @@
+/* Auxiliary functions for the creation of subprocesses.  OS/2 kLIBC API.
+   Copyright (C) 2001, 2003-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _OS2_SPAWN_H
+#define _OS2_SPAWN_H
+
+/* Duplicates a file handle, making the copy uninheritable and ensuring the
+   result is none of STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO.
+   Returns -1 for a file handle that is equivalent to closed.  */
+extern int dup_safer_noinherit (int fd);
+
+/* Undoes the effect of TEMPFD = dup_safer_noinherit (ORIGFD);  */
+extern void undup_safer_noinherit (int tempfd, int origfd);
+
+/* Prepares an argument vector before calling spawn().  */
+extern const char ** prepare_spawn (const char * const *argv,
+                                    char **mem_to_free);
+
+#endif /* _OS2_SPAWN_H */
diff --git a/lib/path-join.c b/lib/path-join.c
index 7278742..32e7f00 100644
--- a/lib/path-join.c
+++ b/lib/path-join.c
@@ -1,5 +1,5 @@
 /* Concatenate path components.
-   Copyright (C) 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2018-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by the
diff --git a/lib/path-join.h b/lib/path-join.h
index 0ac7055..18b6190 100644
--- a/lib/path-join.h
+++ b/lib/path-join.h
@@ -1,5 +1,5 @@
 /* Concatenate path components.
-   Copyright (C) 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2018-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by the
diff --git a/lib/pathmax.h b/lib/pathmax.h
index 4287d15..716f4a9 100644
--- a/lib/pathmax.h
+++ b/lib/pathmax.h
@@ -1,19 +1,19 @@
 /* Define PATH_MAX somehow.  Requires sys/types.h.
-   Copyright (C) 1992, 1999, 2001, 2003, 2005, 2009-2019 Free Software
+   Copyright (C) 1992, 1999, 2001, 2003, 2005, 2009-2021 Free Software
    Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _PATHMAX_H
 # define _PATHMAX_H
diff --git a/lib/perror.c b/lib/perror.c
index 91221f9..d02b4f6 100644
--- a/lib/perror.c
+++ b/lib/perror.c
@@ -1,18 +1,18 @@
 /* Print a message describing error code.
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
    Written by Bruno Haible and Simon Josefsson.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/pipe-safer.c b/lib/pipe-safer.c
index 6201739..efa4bd6 100644
--- a/lib/pipe-safer.c
+++ b/lib/pipe-safer.c
@@ -1,5 +1,5 @@
 /* Invoke pipe, but avoid some glitches.
-   Copyright (C) 2005-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2006, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -30,7 +30,6 @@
 int
 pipe_safer (int fd[2])
 {
-#if HAVE_PIPE
   if (pipe (fd) == 0)
     {
       int i;
@@ -39,18 +38,15 @@
           fd[i] = fd_safer (fd[i]);
           if (fd[i] < 0)
             {
-              int e = errno;
+              int saved_errno = errno;
               close (fd[1 - i]);
-              errno = e;
+              errno = saved_errno;
               return -1;
             }
         }
 
       return 0;
     }
-#else
-  errno = ENOSYS;
-#endif
 
   return -1;
 }
diff --git a/lib/pipe.c b/lib/pipe.c
new file mode 100644
index 0000000..fc978f2
--- /dev/null
+++ b/lib/pipe.c
@@ -0,0 +1,50 @@
+/* Create a pipe.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <unistd.h>
+
+#if defined _WIN32 && ! defined __CYGWIN__
+/* Native Windows API.  */
+
+/* Get _pipe().  */
+# include <io.h>
+
+/* Get _O_BINARY.  */
+# include <fcntl.h>
+
+int
+pipe (int fd[2])
+{
+  /* Mingw changes fd to {-1,-1} on failure, but this violates
+     http://austingroupbugs.net/view.php?id=467 */
+  int tmp[2];
+  int result = _pipe (tmp, 4096, _O_BINARY);
+  if (!result)
+    {
+      fd[0] = tmp[0];
+      fd[1] = tmp[1];
+    }
+  return result;
+}
+
+#else
+
+# error "This platform lacks a pipe function, and Gnulib doesn't provide a replacement. This is a bug in Gnulib."
+
+#endif
diff --git a/lib/pipe2-safer.c b/lib/pipe2-safer.c
index 390d96b..c17f4d5 100644
--- a/lib/pipe2-safer.c
+++ b/lib/pipe2-safer.c
@@ -1,5 +1,5 @@
 /* Invoke pipe2, but avoid some glitches.
-   Copyright (C) 2005-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2006, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/pipe2.c b/lib/pipe2.c
index 134d9f1..9ba8c3b 100644
--- a/lib/pipe2.c
+++ b/lib/pipe2.c
@@ -1,18 +1,18 @@
 /* Create a pipe, with specific opening flags.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
diff --git a/lib/printf-args.c b/lib/printf-args.c
index e45cfbe..b822682 100644
--- a/lib/printf-args.c
+++ b/lib/printf-args.c
@@ -1,19 +1,19 @@
 /* Decomposed printf argument list.
-   Copyright (C) 1999, 2002-2003, 2005-2007, 2009-2019 Free Software
+   Copyright (C) 1999, 2002-2003, 2005-2007, 2009-2021 Free Software
    Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* This file can be parametrized with the following macros:
      ENABLE_UNISTDIO    Set to 1 to enable the unistdio extensions.
@@ -65,14 +65,12 @@
       case TYPE_ULONGINT:
         ap->a.a_ulongint = va_arg (args, unsigned long int);
         break;
-#if HAVE_LONG_LONG_INT
       case TYPE_LONGLONGINT:
         ap->a.a_longlongint = va_arg (args, long long int);
         break;
       case TYPE_ULONGLONGINT:
         ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
         break;
-#endif
       case TYPE_DOUBLE:
         ap->a.a_double = va_arg (args, double);
         break;
@@ -135,11 +133,9 @@
       case TYPE_COUNT_LONGINT_POINTER:
         ap->a.a_count_longint_pointer = va_arg (args, long int *);
         break;
-#if HAVE_LONG_LONG_INT
       case TYPE_COUNT_LONGLONGINT_POINTER:
         ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
         break;
-#endif
 #if ENABLE_UNISTDIO
       /* The unistdio extensions.  */
       case TYPE_U8_STRING:
diff --git a/lib/printf-args.h b/lib/printf-args.h
index 866cba0..c8d9174 100644
--- a/lib/printf-args.h
+++ b/lib/printf-args.h
@@ -1,19 +1,19 @@
 /* Decomposed printf argument list.
-   Copyright (C) 1999, 2002-2003, 2006-2007, 2011-2019 Free Software
+   Copyright (C) 1999, 2002-2003, 2006-2007, 2011-2021 Free Software
    Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _PRINTF_ARGS_H
 #define _PRINTF_ARGS_H
@@ -57,10 +57,8 @@
   TYPE_UINT,
   TYPE_LONGINT,
   TYPE_ULONGINT,
-#if HAVE_LONG_LONG_INT
   TYPE_LONGLONGINT,
   TYPE_ULONGLONGINT,
-#endif
   TYPE_DOUBLE,
   TYPE_LONGDOUBLE,
   TYPE_CHAR,
@@ -75,10 +73,8 @@
   TYPE_COUNT_SCHAR_POINTER,
   TYPE_COUNT_SHORT_POINTER,
   TYPE_COUNT_INT_POINTER,
-  TYPE_COUNT_LONGINT_POINTER
-#if HAVE_LONG_LONG_INT
-, TYPE_COUNT_LONGLONGINT_POINTER
-#endif
+  TYPE_COUNT_LONGINT_POINTER,
+  TYPE_COUNT_LONGLONGINT_POINTER
 #if ENABLE_UNISTDIO
   /* The unistdio extensions.  */
 , TYPE_U8_STRING
@@ -101,10 +97,8 @@
     unsigned int                a_uint;
     long int                    a_longint;
     unsigned long int           a_ulongint;
-#if HAVE_LONG_LONG_INT
     long long int               a_longlongint;
     unsigned long long int      a_ulonglongint;
-#endif
     float                       a_float;
     double                      a_double;
     long double                 a_longdouble;
@@ -121,9 +115,7 @@
     short *                     a_count_short_pointer;
     int *                       a_count_int_pointer;
     long int *                  a_count_longint_pointer;
-#if HAVE_LONG_LONG_INT
     long long int *             a_count_longlongint_pointer;
-#endif
 #if ENABLE_UNISTDIO
     /* The unistdio extensions.  */
     const uint8_t *             a_u8_string;
diff --git a/lib/printf-frexp.c b/lib/printf-frexp.c
index 77eafab..07a70f6 100644
--- a/lib/printf-frexp.c
+++ b/lib/printf-frexp.c
@@ -1,17 +1,17 @@
 /* Split a double into fraction and mantissa, for hexadecimal printf.
-   Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if ! defined USE_LONG_DOUBLE
diff --git a/lib/printf-frexp.h b/lib/printf-frexp.h
index 9310734..3192703 100644
--- a/lib/printf-frexp.h
+++ b/lib/printf-frexp.h
@@ -1,17 +1,17 @@
 /* Split a double into fraction and mantissa, for hexadecimal printf.
-   Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Write a finite, positive number x as
diff --git a/lib/printf-frexpl.c b/lib/printf-frexpl.c
index 693b889..936c59c 100644
--- a/lib/printf-frexpl.c
+++ b/lib/printf-frexpl.c
@@ -1,17 +1,17 @@
 /* Split a 'long double' into fraction and mantissa, for hexadecimal printf.
-   Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/printf-frexpl.h b/lib/printf-frexpl.h
index 2760769..d5f3e84 100644
--- a/lib/printf-frexpl.h
+++ b/lib/printf-frexpl.h
@@ -1,17 +1,17 @@
 /* Split a 'long double' into fraction and mantissa, for hexadecimal printf.
-   Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Write a finite, positive number x as
diff --git a/lib/printf-parse.c b/lib/printf-parse.c
index 8596fd5..f21cc17 100644
--- a/lib/printf-parse.c
+++ b/lib/printf-parse.c
@@ -1,18 +1,18 @@
 /* Formatted output to strings.
-   Copyright (C) 1999-2000, 2002-2003, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 1999-2000, 2002-2003, 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* This file can be parametrized with the following macros:
      CHAR_T             The element type of the format string.
@@ -48,16 +48,7 @@
 #include <stddef.h>
 
 /* Get intmax_t.  */
-#if defined IN_LIBINTL || defined IN_LIBASPRINTF
-# if HAVE_STDINT_H_WITH_UINTMAX
-#  include <stdint.h>
-# endif
-# if HAVE_INTTYPES_H_WITH_UINTMAX
-#  include <inttypes.h>
-# endif
-#else
-# include <stdint.h>
-#endif
+#include <stdint.h>
 
 /* malloc(), realloc(), free().  */
 #include <stdlib.h>
@@ -447,14 +438,12 @@
               switch (c)
                 {
                 case 'd': case 'i':
-#if HAVE_LONG_LONG_INT
-                  /* If 'long long' exists and is larger than 'long':  */
+                  /* If 'long long' is larger than 'long':  */
                   if (flags >= 16 || (flags & 4))
                     type = TYPE_LONGLONGINT;
                   else
-#endif
-                  /* If 'long long' exists and is the same as 'long', we parse
-                     "lld" into TYPE_LONGINT.  */
+                  /* If 'long long' is the same as 'long', we parse "lld" into
+                     TYPE_LONGINT.  */
                   if (flags >= 8)
                     type = TYPE_LONGINT;
                   else if (flags & 2)
@@ -465,14 +454,12 @@
                     type = TYPE_INT;
                   break;
                 case 'o': case 'u': case 'x': case 'X':
-#if HAVE_LONG_LONG_INT
-                  /* If 'long long' exists and is larger than 'long':  */
+                  /* If 'unsigned long long' is larger than 'unsigned long':  */
                   if (flags >= 16 || (flags & 4))
                     type = TYPE_ULONGLONGINT;
                   else
-#endif
-                  /* If 'unsigned long long' exists and is the same as
-                     'unsigned long', we parse "llu" into TYPE_ULONGINT.  */
+                  /* If 'unsigned long long' is the same as 'unsigned long', we
+                     parse "llu" into TYPE_ULONGINT.  */
                   if (flags >= 8)
                     type = TYPE_ULONGINT;
                   else if (flags & 2)
@@ -525,14 +512,12 @@
                   type = TYPE_POINTER;
                   break;
                 case 'n':
-#if HAVE_LONG_LONG_INT
-                  /* If 'long long' exists and is larger than 'long':  */
+                  /* If 'long long' is larger than 'long':  */
                   if (flags >= 16 || (flags & 4))
                     type = TYPE_COUNT_LONGLONGINT_POINTER;
                   else
-#endif
-                  /* If 'long long' exists and is the same as 'long', we parse
-                     "lln" into TYPE_COUNT_LONGINT_POINTER.  */
+                  /* If 'long long' is the same as 'long', we parse "lln" into
+                     TYPE_COUNT_LONGINT_POINTER.  */
                   if (flags >= 8)
                     type = TYPE_COUNT_LONGINT_POINTER;
                   else if (flags & 2)
diff --git a/lib/printf-parse.h b/lib/printf-parse.h
index 746bb3f..77b7409 100644
--- a/lib/printf-parse.h
+++ b/lib/printf-parse.h
@@ -1,19 +1,19 @@
 /* Parse printf format string.
-   Copyright (C) 1999, 2002-2003, 2005, 2007, 2010-2019 Free Software
+   Copyright (C) 1999, 2002-2003, 2005, 2007, 2010-2021 Free Software
    Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _PRINTF_PARSE_H
 #define _PRINTF_PARSE_H
diff --git a/lib/printf.c b/lib/printf.c
index b57ae91..b15e1a3 100644
--- a/lib/printf.c
+++ b/lib/printf.c
@@ -1,17 +1,17 @@
 /* Formatted output to a stream.
-   Copyright (C) 2007, 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2010-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if 1
diff --git a/lib/progname.c b/lib/progname.c
index a42b7fa..fd7acae 100644
--- a/lib/progname.c
+++ b/lib/progname.c
@@ -1,5 +1,5 @@
 /* Program name management.
-   Copyright (C) 2001-2003, 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2003, 2005-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2001.
 
    This program is free software: you can redistribute it and/or modify
diff --git a/lib/progname.h b/lib/progname.h
index c726e97..bf3513d 100644
--- a/lib/progname.h
+++ b/lib/progname.h
@@ -1,5 +1,5 @@
 /* Program name management.
-   Copyright (C) 2001-2004, 2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2004, 2006, 2009-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2001.
 
    This program is free software: you can redistribute it and/or modify
diff --git a/lib/progreloc.c b/lib/progreloc.c
index 9d81efa..1aa74ae 100644
--- a/lib/progreloc.c
+++ b/lib/progreloc.c
@@ -1,5 +1,5 @@
 /* Provide relocatable programs.
-   Copyright (C) 2003-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2003.
 
    This program is free software: you can redistribute it and/or modify
@@ -70,14 +70,25 @@
 # define O_EXEC O_RDONLY /* This is often close enough in older systems.  */
 #endif
 
+#if defined IN_RELOCWRAPPER && (!defined O_CLOEXEC || GNULIB_defined_O_CLOEXEC)
+# undef O_CLOEXEC
+# define O_CLOEXEC 0
+#endif
+
 /* Declare canonicalize_file_name.
    The <stdlib.h> included above may be the system's one, not the gnulib
    one.  */
 extern char * canonicalize_file_name (const char *name);
 
+#if defined WINDOWS_NATIVE
+/* Don't assume that UNICODE is not defined.  */
+# undef GetModuleFileName
+# define GetModuleFileName GetModuleFileNameA
+#endif
+
 /* Pathname support.
-   ISSLASH(C)           tests whether C is a directory separator character.
-   IS_PATH_WITH_DIR(P)  tests whether P contains a directory specification.
+   ISSLASH(C)                tests whether C is a directory separator character.
+   IS_FILE_NAME_WITH_DIR(P)  tests whether P contains a directory specification.
  */
 #if (defined _WIN32 && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
   /* Native Windows, OS/2, DOS */
@@ -85,13 +96,13 @@
 # define HAS_DEVICE(P) \
     ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
      && (P)[1] == ':')
-# define IS_PATH_WITH_DIR(P) \
+# define IS_FILE_NAME_WITH_DIR(P) \
     (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
 # define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
 #else
   /* Unix */
 # define ISSLASH(C) ((C) == '/')
-# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+# define IS_FILE_NAME_WITH_DIR(P) (strchr (P, '/') != NULL)
 # define FILE_SYSTEM_PREFIX_LEN(P) 0
 #endif
 
@@ -154,7 +165,7 @@
 /* Define this function only when it's needed.  */
 #if !(defined WINDOWS_NATIVE || defined __EMX__)
 
-/* Tests whether a given pathname may belong to the executable.  */
+/* Tests whether a given filename may belong to the executable.  */
 static bool
 maybe_executable (const char *filename)
 {
@@ -173,18 +184,20 @@
       struct stat statfile;
 
       if (fstat (executable_fd, &statexe) >= 0)
-        {
-          if (stat (filename, &statfile) < 0)
-            return false;
-          if (!(statfile.st_dev
+        return (stat (filename, &statfile) >= 0
+                && statfile.st_dev
                 && statfile.st_dev == statexe.st_dev
-                && statfile.st_ino == statexe.st_ino))
-            return false;
-        }
+                && statfile.st_ino == statexe.st_ino);
     }
 # endif
 
-  return true;
+  /* Check that the filename does not point to a directory.  */
+  {
+    struct stat statfile;
+
+    return (stat (filename, &statfile) >= 0
+            && ! S_ISDIR (statfile.st_mode));
+  }
 }
 
 #endif
@@ -206,7 +219,7 @@
   int length = GetModuleFileName (NULL, location, sizeof (location));
   if (length < 0)
     return NULL;
-  if (!IS_PATH_WITH_DIR (location))
+  if (!IS_FILE_NAME_WITH_DIR (location))
     /* Shouldn't happen.  */
     return NULL;
   return xstrdup (location);
@@ -240,7 +253,7 @@
     if (link != NULL && link[0] != '[')
       return link;
     if (executable_fd < 0)
-      executable_fd = open ("/proc/self/exe", O_EXEC, 0);
+      executable_fd = open ("/proc/self/exe", O_EXEC | O_CLOEXEC, 0);
 
     {
       char buf[6+10+5];
@@ -249,7 +262,7 @@
       if (link != NULL && link[0] != '[')
         return link;
       if (executable_fd < 0)
-        executable_fd = open (buf, O_EXEC, 0);
+        executable_fd = open (buf, O_EXEC | O_CLOEXEC, 0);
     }
   }
 # endif
@@ -296,7 +309,7 @@
      the current directory.  */
   {
     char namebuf[4096];
-    int fd = open ("/proc/self/execname", O_RDONLY, 0);
+    int fd = open ("/proc/self/execname", O_RDONLY | O_CLOEXEC, 0);
     if (fd >= 0)
       {
         size_t len = full_read (fd, namebuf, sizeof (namebuf));
@@ -319,7 +332,7 @@
     if (link != NULL)
       return link;
     if (executable_fd < 0)
-      executable_fd = open ("/proc/self/exe", O_EXEC, 0);
+      executable_fd = open ("/proc/self/exe", O_EXEC | O_CLOEXEC, 0);
   }
 # endif
 # if HAVE_MACH_O_DYLD_H && HAVE__NSGETEXECUTABLEPATH
diff --git a/lib/quote.h b/lib/quote.h
index 5cef8ff..3204997 100644
--- a/lib/quote.h
+++ b/lib/quote.h
@@ -1,6 +1,6 @@
 /* quote.h - prototypes for quote.c
 
-   Copyright (C) 1998-2001, 2003, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 1998-2001, 2003, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/quotearg.c b/lib/quotearg.c
index 773d53f..dc4babc 100644
--- a/lib/quotearg.c
+++ b/lib/quotearg.c
@@ -1,6 +1,6 @@
 /* quotearg.c - quote arguments for output
 
-   Copyright (C) 1998-2002, 2004-2019 Free Software Foundation, Inc.
+   Copyright (C) 1998-2002, 2004-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -29,6 +29,7 @@
 #include "quotearg.h"
 #include "quote.h"
 
+#include "attribute.h"
 #include "minmax.h"
 #include "xalloc.h"
 #include "c-strcaseeq.h"
@@ -54,14 +55,6 @@
 
 #define INT_BITS (sizeof (int) * CHAR_BIT)
 
-#ifndef FALLTHROUGH
-# if __GNUC__ < 7
-#  define FALLTHROUGH ((void) 0)
-# else
-#  define FALLTHROUGH __attribute__ ((__fallthrough__))
-# endif
-#endif
-
 struct quoting_options
 {
   /* Basic quoting style.  */
@@ -794,7 +787,6 @@
   return r;
 }
 
-/* Equivalent to quotearg_alloc (ARG, ARGSIZE, NULL, O).  */
 char *
 quotearg_alloc (char const *arg, size_t argsize,
                 struct quoting_options const *o)
@@ -871,7 +863,8 @@
    OPTIONS specifies the quoting options.
    The returned value points to static storage that can be
    reused by the next call to this function with the same value of N.
-   N must be nonnegative.  N is deliberately declared with type "int"
+   N must be nonnegative; it is typically small, and must be
+   less than MIN (INT_MAX, IDX_MAX).  The type of N is signed
    to allow for future extensions (using negative values).  */
 static char *
 quotearg_n_options (int n, char const *arg, size_t argsize,
@@ -881,22 +874,21 @@
 
   struct slotvec *sv = slotvec;
 
-  if (n < 0)
+  int nslots_max = MIN (INT_MAX, IDX_MAX);
+  if (! (0 <= n && n < nslots_max))
     abort ();
 
   if (nslots <= n)
     {
       bool preallocated = (sv == &slotvec0);
-      int nmax = MIN (INT_MAX, MIN (PTRDIFF_MAX, SIZE_MAX) / sizeof *sv) - 1;
+      idx_t new_nslots = nslots;
 
-      if (nmax < n)
-        xalloc_die ();
-
-      slotvec = sv = xrealloc (preallocated ? NULL : sv, (n + 1) * sizeof *sv);
+      slotvec = sv = xpalloc (preallocated ? NULL : sv, &new_nslots,
+                              n - nslots + 1, nslots_max, sizeof *sv);
       if (preallocated)
         *sv = slotvec0;
-      memset (sv + nslots, 0, (n + 1 - nslots) * sizeof *sv);
-      nslots = n + 1;
+      memset (sv + nslots, 0, (new_nslots - nslots) * sizeof *sv);
+      nslots = new_nslots;
     }
 
   {
diff --git a/lib/quotearg.h b/lib/quotearg.h
index 0f07e02..f5644b8 100644
--- a/lib/quotearg.h
+++ b/lib/quotearg.h
@@ -1,6 +1,6 @@
 /* quotearg.h - quote arguments for output
 
-   Copyright (C) 1998-2002, 2004, 2006, 2008-2019 Free Software Foundation,
+   Copyright (C) 1998-2002, 2004, 2006, 2008-2021 Free Software Foundation,
    Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -21,7 +21,7 @@
 #ifndef QUOTEARG_H_
 # define QUOTEARG_H_ 1
 
-# include <stddef.h>
+# include <stdlib.h>
 
 /* Basic quoting styles.  For each style, an example is given on the
    input strings "simple", "\0 \t\n'\"\033?""?/\\", and "a:b", using
@@ -275,7 +275,9 @@
 /* Allocate a new set of quoting options, with contents initially identical
    to O if O is not null, or to the default if O is null.
    It is the caller's responsibility to free the result.  */
-struct quoting_options *clone_quoting_options (struct quoting_options *o);
+struct quoting_options *clone_quoting_options (struct quoting_options *o)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
 
 /* Get the value of O's quoting style.  If O is null, use the default.  */
 enum quoting_style get_quoting_style (struct quoting_options const *o);
@@ -323,7 +325,7 @@
    On output, BUFFER might contain embedded null bytes if ARGSIZE was
    not -1, the style of O does not use backslash escapes, and the
    flags of O do not request elision of null bytes.*/
-size_t quotearg_buffer (char *buffer, size_t buffersize,
+size_t quotearg_buffer (char *restrict buffer, size_t buffersize,
                         char const *arg, size_t argsize,
                         struct quoting_options const *o);
 
@@ -331,7 +333,9 @@
    buffer.  It is the caller's responsibility to free the result.  The
    result will not contain embedded null bytes.  */
 char *quotearg_alloc (char const *arg, size_t argsize,
-                      struct quoting_options const *o);
+                      struct quoting_options const *o)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
 
 /* Like quotearg_alloc, except that the length of the result,
    excluding the terminating null byte, is stored into SIZE if it is
@@ -340,7 +344,9 @@
    backslash escapes, and the flags of O do not request elision of
    null bytes.*/
 char *quotearg_alloc_mem (char const *arg, size_t argsize,
-                          size_t *size, struct quoting_options const *o);
+                          size_t *size, struct quoting_options const *o)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
 
 /* Use storage slot N to return a quoted version of the string ARG.
    Use the default quoting options.
diff --git a/lib/raise.c b/lib/raise.c
index e750b7a..37c100d 100644
--- a/lib/raise.c
+++ b/lib/raise.c
@@ -1,18 +1,18 @@
 /* Provide a non-threads replacement for the POSIX raise function.
 
-   Copyright (C) 2002-2003, 2005-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002-2003, 2005-2006, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* written by Jim Meyering and Bruno Haible */
diff --git a/lib/rawmemchr.c b/lib/rawmemchr.c
index 7df6151..e7a00b8 100644
--- a/lib/rawmemchr.c
+++ b/lib/rawmemchr.c
@@ -1,17 +1,17 @@
 /* Searching in a string.
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
@@ -19,68 +19,57 @@
 /* Specification.  */
 #include <string.h>
 
+/* A function definition is only needed if HAVE_RAWMEMCHR is not defined.  */
+#if !HAVE_RAWMEMCHR
+
+# include <limits.h>
+# include <stdalign.h>
+# include <stdint.h>
+
+# include "verify.h"
+
 /* Find the first occurrence of C in S.  */
 void *
 rawmemchr (const void *s, int c_in)
 {
-  /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
-     long instead of a 64-bit uintmax_t tends to give better
-     performance.  On 64-bit hardware, unsigned long is generally 64
-     bits already.  Change this typedef to experiment with
-     performance.  */
-  typedef unsigned long int longword;
+  /* Change this typedef to experiment with performance.  */
+  typedef uintptr_t longword;
+  /* If you change the "uintptr_t", you should change UINTPTR_WIDTH to match.
+     This verifies that the type does not have padding bits.  */
+  verify (UINTPTR_WIDTH == UCHAR_WIDTH * sizeof (longword));
 
   const unsigned char *char_ptr;
-  const longword *longword_ptr;
-  longword repeated_one;
-  longword repeated_c;
-  unsigned char c;
-
-  c = (unsigned char) c_in;
+  unsigned char c = c_in;
 
   /* Handle the first few bytes by reading one byte at a time.
      Do this until CHAR_PTR is aligned on a longword boundary.  */
   for (char_ptr = (const unsigned char *) s;
-       (size_t) char_ptr % sizeof (longword) != 0;
+       (uintptr_t) char_ptr % alignof (longword) != 0;
        ++char_ptr)
     if (*char_ptr == c)
       return (void *) char_ptr;
 
-  longword_ptr = (const longword *) char_ptr;
-
-  /* All these elucidatory comments refer to 4-byte longwords,
-     but the theory applies equally well to any size longwords.  */
+  longword const *longword_ptr = s = char_ptr;
 
   /* Compute auxiliary longword values:
      repeated_one is a value which has a 1 in every byte.
      repeated_c has c in every byte.  */
-  repeated_one = 0x01010101;
-  repeated_c = c | (c << 8);
-  repeated_c |= repeated_c << 16;
-  if (0xffffffffU < (longword) -1)
-    {
-      repeated_one |= repeated_one << 31 << 1;
-      repeated_c |= repeated_c << 31 << 1;
-      if (8 < sizeof (longword))
-        {
-          size_t i;
-
-          for (i = 64; i < sizeof (longword) * 8; i *= 2)
-            {
-              repeated_one |= repeated_one << i;
-              repeated_c |= repeated_c << i;
-            }
-        }
-    }
+  longword repeated_one = (longword) -1 / UCHAR_MAX;
+  longword repeated_c = repeated_one * c;
+  longword repeated_hibit = repeated_one * (UCHAR_MAX / 2 + 1);
 
   /* Instead of the traditional loop which tests each byte, we will
-     test a longword at a time.  The tricky part is testing if *any of
-     the four* bytes in the longword in question are equal to NUL or
+     test a longword at a time.  The tricky part is testing if any of
+     the bytes in the longword in question are equal to
      c.  We first use an xor with repeated_c.  This reduces the task
-     to testing whether *any of the four* bytes in longword1 is zero.
+     to testing whether any of the bytes in longword1 is zero.
+
+     (The following comments assume 8-bit bytes, as POSIX requires;
+     the code's use of UCHAR_MAX should work even if bytes have more
+     than 8 bits.)
 
      We compute tmp =
-       ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+       ((longword1 - repeated_one) & ~longword1) & (repeated_one * 0x80).
      That is, we perform the following operations:
        1. Subtract repeated_one.
        2. & ~longword1.
@@ -114,23 +103,23 @@
     {
       longword longword1 = *longword_ptr ^ repeated_c;
 
-      if ((((longword1 - repeated_one) & ~longword1)
-           & (repeated_one << 7)) != 0)
+      if ((((longword1 - repeated_one) & ~longword1) & repeated_hibit) != 0)
         break;
       longword_ptr++;
     }
 
-  char_ptr = (const unsigned char *) longword_ptr;
+  char_ptr = s = longword_ptr;
 
   /* At this point, we know that one of the sizeof (longword) bytes
-     starting at char_ptr is == c.  On little-endian machines, we
+     starting at char_ptr is == c.  If we knew endianness, we
      could determine the first such byte without any further memory
      accesses, just by looking at the tmp result from the last loop
-     iteration.  But this does not work on big-endian machines.
-     Choose code that works in both cases.  */
+     iteration.  However, the following simple and portable code does
+     not attempt this potential optimization.  */
 
-  char_ptr = (unsigned char *) longword_ptr;
   while (*char_ptr != c)
     char_ptr++;
   return (void *) char_ptr;
 }
+
+#endif
diff --git a/lib/rawmemchr.valgrind b/lib/rawmemchr.valgrind
index 3d91a72..d489c32 100644
--- a/lib/rawmemchr.valgrind
+++ b/lib/rawmemchr.valgrind
@@ -1,18 +1,18 @@
 # Suppress a valgrind message about use of uninitialized memory in rawmemchr().
 
-# Copyright (C) 2008-2019 Free Software Foundation, Inc.
+# Copyright (C) 2008-2021 Free Software Foundation, Inc.
 #
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
+# This file is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of the
+# License, or (at your option) any later version.
 #
-# This program is distributed in the hope that it will be useful,
+# This file is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
+# GNU Lesser General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License
+# You should have received a copy of the GNU Lesser General Public License
 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 # This use is OK because it provides only a speedup.
diff --git a/lib/readdir.c b/lib/readdir.c
new file mode 100644
index 0000000..9e8e1c3
--- /dev/null
+++ b/lib/readdir.c
@@ -0,0 +1,102 @@
+/* Read the next entry of a directory.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <dirent.h>
+
+#include <errno.h>
+#include <stddef.h>
+
+#include "dirent-private.h"
+
+/* Don't assume that UNICODE is not defined.  */
+#undef FindNextFile
+#define FindNextFile FindNextFileA
+
+struct dirent *
+readdir (DIR *dirp)
+{
+  char type;
+  struct dirent *result;
+
+  /* There is no need to add code to produce entries for "." and "..".
+     According to the POSIX:2008 section "4.12 Pathname Resolution"
+     <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html>
+     "." and ".." are syntactic entities.
+     POSIX also says:
+       "If entries for dot or dot-dot exist, one entry shall be returned
+        for dot and one entry shall be returned for dot-dot; otherwise,
+        they shall not be returned."  */
+
+  switch (dirp->status)
+    {
+    case -2:
+      /* End of directory already reached.  */
+      return NULL;
+    case -1:
+      break;
+    case 0:
+      if (!FindNextFile (dirp->current, &dirp->entry))
+        {
+          switch (GetLastError ())
+            {
+            case ERROR_NO_MORE_FILES:
+              dirp->status = -2;
+              return NULL;
+            default:
+              errno = EIO;
+              return NULL;
+            }
+        }
+      break;
+    default:
+      errno = dirp->status;
+      return NULL;
+    }
+
+  dirp->status = 0;
+
+  if (dirp->entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+    type = DT_DIR;
+  else if (dirp->entry.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
+    type = DT_LNK;
+  else if ((dirp->entry.dwFileAttributes
+            & ~(FILE_ATTRIBUTE_READONLY
+                | FILE_ATTRIBUTE_HIDDEN
+                | FILE_ATTRIBUTE_SYSTEM
+                | FILE_ATTRIBUTE_ARCHIVE
+                | FILE_ATTRIBUTE_NORMAL
+                | FILE_ATTRIBUTE_TEMPORARY
+                | FILE_ATTRIBUTE_SPARSE_FILE
+                | FILE_ATTRIBUTE_COMPRESSED
+                | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
+                | FILE_ATTRIBUTE_ENCRYPTED)) == 0)
+    /* Devices like COM1, LPT1, NUL would also have the attributes 0x20 but
+       they cannot occur here.  */
+    type = DT_REG;
+  else
+    type = DT_UNKNOWN;
+
+  /* Reuse the memory of dirp->entry for the result.  */
+  result =
+    (struct dirent *)
+    ((char *) dirp->entry.cFileName - offsetof (struct dirent, d_name[0]));
+  result->d_type = type;
+
+  return result;
+}
diff --git a/lib/readline.c b/lib/readline.c
new file mode 100644
index 0000000..14de8c8
--- /dev/null
+++ b/lib/readline.c
@@ -0,0 +1,55 @@
+/* readline.c --- Simple implementation of readline.
+   Copyright (C) 2005-2007, 2009-2021 Free Software Foundation, Inc.
+   Written by Simon Josefsson
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* This module is intended to be used when the application only needs
+   the readline interface.  If you need more functions from the
+   readline library, it is recommended to require the readline library
+   (or improve this module) rather than #if-protect part of your
+   application (doing so would add assumptions of this module into
+   your application).  The application should use #include
+   "readline.h", that header file will include <readline/readline.h>
+   if the real library is present on the system. */
+
+/* Get specification. */
+#include "readline.h"
+
+#include <stdio.h>
+#include <string.h>
+
+char *
+readline (const char *prompt)
+{
+  char *out = NULL;
+  size_t size = 0;
+
+  if (prompt)
+    {
+      fputs (prompt, stdout);
+      fflush (stdout);
+    }
+
+  if (getline (&out, &size, stdin) < 0)
+    return NULL;
+
+  while (*out && (out[strlen (out) - 1] == '\r'
+                  || out[strlen (out) - 1] == '\n'))
+    out[strlen (out) - 1] = '\0';
+
+  return out;
+}
diff --git a/lib/readline.h b/lib/readline.h
new file mode 100644
index 0000000..e4b6f9b
--- /dev/null
+++ b/lib/readline.h
@@ -0,0 +1,36 @@
+/* readline.h --- Simple implementation of readline.
+   Copyright (C) 2005, 2009-2021 Free Software Foundation, Inc.
+   Written by Simon Josefsson
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef GL_READLINE_H
+#define GL_READLINE_H
+
+#if HAVE_READLINE_READLINE_H
+/* <readline/readline.h> makes use of the FILE type without including
+   <stdio.h> itself. */
+# include <stdio.h>
+# include <readline/readline.h>
+#else
+# include <stdlib.h>
+/* Prints a prompt PROMPT and then reads and returns a single line of
+   text from the user.  If PROMPT is NULL or the empty string, no
+   prompt is displayed.  The returned line is allocated with malloc;
+   the caller should free the line when it has finished with it. */
+extern char *readline (const char *prompt)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
+#endif
+
+#endif /* GL_READLINE_H */
diff --git a/lib/readlink.c b/lib/readlink.c
index bf71109..ad4d51d 100644
--- a/lib/readlink.c
+++ b/lib/readlink.c
@@ -1,17 +1,17 @@
-/* Stub for readlink().
-   Copyright (C) 2003-2007, 2009-2019 Free Software Foundation, Inc.
+/* Read the contents of a symbolic link.
+   Copyright (C) 2003-2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
@@ -29,15 +29,15 @@
    such as DJGPP 2.03 and mingw32.  */
 
 ssize_t
-readlink (const char *name, char *buf _GL_UNUSED,
-          size_t bufsize _GL_UNUSED)
+readlink (char const *file, _GL_UNUSED char *buf,
+          _GL_UNUSED size_t bufsize)
 {
   struct stat statbuf;
 
   /* In general we should use lstat() here, not stat().  But on platforms
      without symbolic links, lstat() - if it exists - would be equivalent to
      stat(), therefore we can use stat().  This saves us a configure check.  */
-  if (stat (name, &statbuf) >= 0)
+  if (stat (file, &statbuf) >= 0)
     errno = EINVAL;
   return -1;
 }
@@ -51,24 +51,54 @@
    for Solaris 9.  */
 
 ssize_t
-rpl_readlink (const char *name, char *buf, size_t bufsize)
+rpl_readlink (char const *file, char *buf, size_t bufsize)
 {
 # if READLINK_TRAILING_SLASH_BUG
-  size_t len = strlen (name);
-  if (len && name[len - 1] == '/')
+  size_t file_len = strlen (file);
+  if (file_len && file[file_len - 1] == '/')
     {
-      /* Even if name without the slash is a symlink to a directory,
+      /* Even if FILE without the slash is a symlink to a directory,
          both lstat() and stat() must resolve the trailing slash to
          the directory rather than the symlink.  We can therefore
          safely use stat() to distinguish between EINVAL and
          ENOTDIR/ENOENT, avoiding extra overhead of rpl_lstat().  */
       struct stat st;
-      if (stat (name, &st) == 0)
+      if (stat (file, &st) == 0 || errno == EOVERFLOW)
         errno = EINVAL;
       return -1;
     }
 # endif /* READLINK_TRAILING_SLASH_BUG */
-  return readlink (name, buf, bufsize);
+
+  ssize_t r = readlink (file, buf, bufsize);
+
+# if READLINK_TRUNCATE_BUG
+  if (r < 0 && errno == ERANGE)
+    {
+      /* Try again with a bigger buffer.  This is just for test cases;
+         real code invariably discards short reads.  */
+      char stackbuf[4032];
+      r = readlink (file, stackbuf, sizeof stackbuf);
+      if (r < 0)
+        {
+          if (errno == ERANGE)
+            {
+              /* Clear the buffer, which is good enough for real code.
+                 Thankfully, no test cases try short reads of enormous
+                 symlinks and what would be the point anyway?  */
+              r = bufsize;
+              memset (buf, 0, r);
+            }
+        }
+      else
+        {
+          if (bufsize < r)
+            r = bufsize;
+          memcpy (buf, stackbuf, r);
+        }
+    }
+# endif
+
+  return r;
 }
 
 #endif /* HAVE_READLINK */
diff --git a/lib/realloc.c b/lib/realloc.c
index a81ce3b..af03f0c 100644
--- a/lib/realloc.c
+++ b/lib/realloc.c
@@ -1,76 +1,60 @@
 /* realloc() function that is glibc compatible.
 
-   Copyright (C) 1997, 2003-2004, 2006-2007, 2009-2019 Free Software
+   Copyright (C) 1997, 2003-2004, 2006-2007, 2009-2021 Free Software
    Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* written by Jim Meyering and Bruno Haible */
 
-#define _GL_USE_STDLIB_ALLOC 1
 #include <config.h>
 
-/* Only the AC_FUNC_REALLOC macro defines 'realloc' already in config.h.  */
-#ifdef realloc
-# define NEED_REALLOC_GNU 1
-/* Whereas the gnulib module 'realloc-gnu' defines HAVE_REALLOC_GNU.  */
-#elif GNULIB_REALLOC_GNU && !HAVE_REALLOC_GNU
-# define NEED_REALLOC_GNU 1
-#endif
-
-/* Infer the properties of the system's malloc function.
-   The gnulib module 'malloc-gnu' defines HAVE_MALLOC_GNU.  */
-#if GNULIB_MALLOC_GNU && HAVE_MALLOC_GNU
-# define SYSTEM_MALLOC_GLIBC_COMPATIBLE 1
-#endif
-
 #include <stdlib.h>
 
 #include <errno.h>
 
+#include "xalloc-oversized.h"
+
+/* Call the system's realloc below.  This file does not define
+   _GL_USE_STDLIB_ALLOC because it needs Gnulib's malloc if present.  */
+#undef realloc
+
 /* Change the size of an allocated block of memory P to N bytes,
-   with error checking.  If N is zero, change it to 1.  If P is NULL,
-   use malloc.  */
+   with error checking.  If P is NULL, use malloc.  Otherwise if N is zero,
+   free P and return NULL.  */
 
 void *
 rpl_realloc (void *p, size_t n)
 {
-  void *result;
+  if (p == NULL)
+    return malloc (n);
 
-#if NEED_REALLOC_GNU
   if (n == 0)
     {
-      n = 1;
-
-      /* In theory realloc might fail, so don't rely on it to free.  */
       free (p);
-      p = NULL;
+      return NULL;
     }
-#endif
 
-  if (p == NULL)
+  if (xalloc_oversized (n, 1))
     {
-#if GNULIB_REALLOC_GNU && !NEED_REALLOC_GNU && !SYSTEM_MALLOC_GLIBC_COMPATIBLE
-      if (n == 0)
-        n = 1;
-#endif
-      result = malloc (n);
+      errno = ENOMEM;
+      return NULL;
     }
-  else
-    result = realloc (p, n);
 
-#if !HAVE_REALLOC_POSIX
+  void *result = realloc (p, n);
+
+#if !HAVE_MALLOC_POSIX
   if (result == NULL)
     errno = ENOMEM;
 #endif
diff --git a/lib/reallocarray.c b/lib/reallocarray.c
new file mode 100644
index 0000000..1fb2f3c
--- /dev/null
+++ b/lib/reallocarray.c
@@ -0,0 +1,39 @@
+/* reallocarray function that is glibc compatible.
+
+   Copyright (C) 2017-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* written by Darshit Shah */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <errno.h>
+
+#include "intprops.h"
+
+void *
+reallocarray (void *ptr, size_t nmemb, size_t size)
+{
+  size_t nbytes;
+  if (INT_MULTIPLY_WRAPV (nmemb, size, &nbytes))
+    {
+      errno = ENOMEM;
+      return NULL;
+    }
+
+  /* Rely on the semantics of GNU realloc.  */
+  return realloc (ptr, nbytes);
+}
diff --git a/lib/relocatable.c b/lib/relocatable.c
index de431e7..a682912 100644
--- a/lib/relocatable.c
+++ b/lib/relocatable.c
@@ -1,18 +1,18 @@
 /* Provide relocatable packages.
-   Copyright (C) 2003-2006, 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003-2006, 2008-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2003.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 
@@ -65,6 +65,12 @@
 # include <libintl.h>
 #endif
 
+#if defined _WIN32 && !defined __CYGWIN__
+/* Don't assume that UNICODE is not defined.  */
+# undef GetModuleFileName
+# define GetModuleFileName GetModuleFileNameA
+#endif
+
 /* Faked cheap 'bool'.  */
 #undef bool
 #undef false
@@ -74,8 +80,8 @@
 #define true 1
 
 /* Pathname support.
-   ISSLASH(C)           tests whether C is a directory separator character.
-   IS_PATH_WITH_DIR(P)  tests whether P contains a directory specification.
+   ISSLASH(C)                tests whether C is a directory separator character.
+   IS_FILE_NAME_WITH_DIR(P)  tests whether P contains a directory specification.
  */
 #if (defined _WIN32 && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
   /* Native Windows, OS/2, DOS */
@@ -83,13 +89,13 @@
 # define HAS_DEVICE(P) \
     ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
      && (P)[1] == ':')
-# define IS_PATH_WITH_DIR(P) \
+# define IS_FILE_NAME_WITH_DIR(P) \
     (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
 # define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
 #else
   /* Unix */
 # define ISSLASH(C) ((C) == '/')
-# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+# define IS_FILE_NAME_WITH_DIR(P) (strchr (P, '/') != NULL)
 # define FILE_SYSTEM_PREFIX_LEN(P) 0
 #endif
 
@@ -317,7 +323,10 @@
    supports longer file names
    (see <https://cygwin.com/ml/cygwin/2011-01/msg00410.html>).  */
 
-/* Determine the full pathname of the shared library when it is loaded.  */
+/* Determine the full pathname of the shared library when it is loaded.
+
+   Documentation:
+   <https://docs.microsoft.com/en-us/windows/win32/dlls/dllmain>  */
 
 BOOL WINAPI
 DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved)
@@ -333,11 +342,17 @@
         /* Shouldn't happen.  */
         return FALSE;
 
-      if (!IS_PATH_WITH_DIR (location))
+      if (!IS_FILE_NAME_WITH_DIR (location))
         /* Shouldn't happen.  */
         return FALSE;
 
-      shared_library_fullname = strdup (location);
+      /* Avoid a memory leak when the same DLL get attached, detached,
+         attached, detached, and so on.  This happens e.g. when a spell
+         checker DLL is used repeatedly by a mail program.  */
+      if (!(shared_library_fullname != NULL
+            && strcmp (shared_library_fullname, location) == 0))
+        /* Remember the full pathname of the shared library.  */
+        shared_library_fullname = strdup (location);
     }
 
   return TRUE;
diff --git a/lib/relocatable.h b/lib/relocatable.h
index 896a7e5..2ffb75e 100644
--- a/lib/relocatable.h
+++ b/lib/relocatable.h
@@ -1,23 +1,25 @@
 /* Provide relocatable packages.
-   Copyright (C) 2003, 2005, 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2005, 2008-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2003.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _RELOCATABLE_H
 #define _RELOCATABLE_H
 
+#include <stdlib.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -83,7 +85,8 @@
    Returns it, freshly allocated.  Returns NULL upon failure.  */
 extern char * compute_curr_prefix (const char *orig_installprefix,
                                    const char *orig_installdir,
-                                   const char *curr_pathname);
+                                   const char *curr_pathname)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
 
 #else
 
diff --git a/lib/relocwrapper.c b/lib/relocwrapper.c
index 421b4b5..771da89 100644
--- a/lib/relocwrapper.c
+++ b/lib/relocwrapper.c
@@ -1,5 +1,5 @@
 /* Relocating wrapper program.
-   Copyright (C) 2003, 2005-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2005-2007, 2009-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2003.
 
    This program is free software: you can redistribute it and/or modify
@@ -19,18 +19,36 @@
    relocwrapper
     -> progname
     -> progreloc
+       -> stat
+          -> filename
+          -> pathmax
+          -> verify
        -> areadlink
           -> careadlinkat
              -> allocator
           -> readlink
              -> stat
-                -> dosname
-                -> pathmax
-                -> verify
        -> canonicalize-lgpl
-          -> malloca
-          -> lstat
+          -> libc-config
+          -> errno
+          -> fcntl-h
+          -> stdbool
+          -> sys_stat
+          -> unistd
+          -> eloop-threshold
+          -> filename
+          -> idx
+          -> intprops
+          -> scratch_buffer
+             -> malloc-posix
+             -> realloc-posix
+             -> free-posix
+          -> pathmax
+          -> mempcpy
+          -> rawmemchr
           -> readlink
+          -> stat
+          -> double-slash-root
     -> relocatable
     -> setenv
        -> malloca
diff --git a/lib/rename.c b/lib/rename.c
index 9d88e5c..2f40ccf 100644
--- a/lib/rename.c
+++ b/lib/rename.c
@@ -1,18 +1,18 @@
 /* Work around rename bugs in some systems.
 
-   Copyright (C) 2001-2003, 2005-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2003, 2005-2006, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Volker Borchert, Eric Blake.  */
@@ -39,6 +39,10 @@
 
 # include "dirname.h"
 
+/* Don't assume that UNICODE is not defined.  */
+# undef MoveFileEx
+# define MoveFileEx MoveFileExA
+
 /* Rename the file SRC to DST.  This replacement is necessary on
    Windows, on which the system rename function will not replace
    an existing DST.  */
@@ -161,10 +165,8 @@
         }
       if (rmdir (dst))
         {
-          error = errno;
           free (src_temp);
           free (dst_temp);
-          errno = error;
           return -1;
         }
       free (src_temp);
@@ -285,7 +287,7 @@
   char *dst_temp = (char *) dst;
   bool src_slash;
   bool dst_slash;
-  bool dst_exists _GL_UNUSED;
+  _GL_UNUSED bool dst_exists;
   int ret_val = -1;
   int rename_errno = ENOTDIR;
   struct stat src_st;
diff --git a/lib/rewinddir.c b/lib/rewinddir.c
new file mode 100644
index 0000000..9680caa
--- /dev/null
+++ b/lib/rewinddir.c
@@ -0,0 +1,53 @@
+/* Restart reading the entries of a directory from the beginning.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <dirent.h>
+
+#include <errno.h>
+
+#include "dirent-private.h"
+
+/* Don't assume that UNICODE is not defined.  */
+#undef FindFirstFile
+#define FindFirstFile FindFirstFileA
+
+void
+rewinddir (DIR *dirp)
+{
+  /* Like in closedir().  */
+  if (dirp->current != INVALID_HANDLE_VALUE)
+    FindClose (dirp->current);
+
+  /* Like in opendir().  */
+  dirp->status = -1;
+  dirp->current = FindFirstFile (dirp->dir_name_mask, &dirp->entry);
+  if (dirp->current == INVALID_HANDLE_VALUE)
+    {
+      switch (GetLastError ())
+        {
+        case ERROR_FILE_NOT_FOUND:
+          dirp->status = -2;
+          break;
+        default:
+          /* Save the error code for the next readdir() call.  */
+          dirp->status = ENOENT;
+          break;
+        }
+    }
+}
diff --git a/lib/rmdir.c b/lib/rmdir.c
index 1d08822..6295e41 100644
--- a/lib/rmdir.c
+++ b/lib/rmdir.c
@@ -1,19 +1,19 @@
 /* Work around rmdir bugs.
 
-   Copyright (C) 1988, 1990, 1999, 2003-2006, 2009-2019 Free Software
+   Copyright (C) 1988, 1990, 1999, 2003-2006, 2009-2021 Free Software
    Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
@@ -23,9 +23,12 @@
 #include <errno.h>
 #include <string.h>
 
-#include "dosname.h"
+#include "filename.h"
 
 #undef rmdir
+#if defined _WIN32 && !defined __CYGWIN__
+# define rmdir _rmdir
+#endif
 
 /* Remove directory DIR.
    Return 0 if successful, -1 if not.  */
diff --git a/lib/same-inode.h b/lib/same-inode.h
index 06655b6..c727777 100644
--- a/lib/same-inode.h
+++ b/lib/same-inode.h
@@ -1,18 +1,18 @@
 /* Determine whether two stat buffers are known to refer to the same file.
 
-   Copyright (C) 2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef SAME_INODE_H
diff --git a/lib/save-cwd.c b/lib/save-cwd.c
new file mode 100644
index 0000000..0a18bc5
--- /dev/null
+++ b/lib/save-cwd.c
@@ -0,0 +1,97 @@
+/* save-cwd.c -- Save and restore current working directory.
+
+   Copyright (C) 1995, 1997-1998, 2003-2006, 2009-2021 Free Software
+   Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Jim Meyering.  */
+
+#include <config.h>
+
+#include "save-cwd.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "chdir-long.h"
+#include "unistd--.h"
+
+#if GNULIB_FCNTL_SAFER
+# include "fcntl--.h"
+#else
+# define GNULIB_FCNTL_SAFER 0
+#endif
+
+/* Record the location of the current working directory in CWD so that
+   the program may change to other directories and later use restore_cwd
+   to return to the recorded location.  This function may allocate
+   space using malloc (via getcwd) or leave a file descriptor open;
+   use free_cwd to perform the necessary free or close.  Upon failure,
+   no memory is allocated, any locally opened file descriptors are
+   closed;  return non-zero -- in that case, free_cwd need not be
+   called, but doing so is ok.  Otherwise, return zero.
+
+   The _raison d'etre_ for this interface is that the working directory
+   is sometimes inaccessible, and getcwd is not robust or as efficient.
+   So, we prefer to use the open/fchdir approach, but fall back on
+   getcwd if necessary.  This module works for most cases with just
+   the getcwd-lgpl module, but to be truly robust, use the getcwd module.
+
+   Some systems lack fchdir altogether: e.g., OS/2, pre-2001 Cygwin,
+   SCO Xenix.  Also, SunOS 4 and Irix 5.3 provide the function, yet it
+   doesn't work for partitions on which auditing is enabled.  If
+   you're still using an obsolete system with these problems, please
+   send email to the maintainer of this code.  */
+
+int
+save_cwd (struct saved_cwd *cwd)
+{
+  cwd->name = NULL;
+
+  cwd->desc = open (".", O_SEARCH | O_CLOEXEC);
+  if (!GNULIB_FCNTL_SAFER)
+    cwd->desc = fd_safer_flag (cwd->desc, O_CLOEXEC);
+  if (cwd->desc < 0)
+    {
+      cwd->name = getcwd (NULL, 0);
+      return cwd->name ? 0 : -1;
+    }
+
+  return 0;
+}
+
+/* Change to recorded location, CWD, in directory hierarchy.
+   Upon failure, return -1 (errno is set by chdir or fchdir).
+   Upon success, return zero.  */
+
+int
+restore_cwd (const struct saved_cwd *cwd)
+{
+  if (0 <= cwd->desc)
+    return fchdir (cwd->desc);
+  else
+    return chdir_long (cwd->name);
+}
+
+void
+free_cwd (struct saved_cwd *cwd)
+{
+  if (cwd->desc >= 0)
+    close (cwd->desc);
+  free (cwd->name);
+}
diff --git a/lib/save-cwd.h b/lib/save-cwd.h
new file mode 100644
index 0000000..3cefba5
--- /dev/null
+++ b/lib/save-cwd.h
@@ -0,0 +1,34 @@
+/* Save and restore current working directory.
+
+   Copyright (C) 1995, 1997-1998, 2003, 2009-2021 Free Software Foundation,
+   Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Jim Meyering.  */
+
+#ifndef SAVE_CWD_H
+# define SAVE_CWD_H 1
+
+struct saved_cwd
+  {
+    int desc;
+    char *name;
+  };
+
+int save_cwd (struct saved_cwd *cwd);
+int restore_cwd (const struct saved_cwd *cwd);
+void free_cwd (struct saved_cwd *cwd);
+
+#endif /* SAVE_CWD_H */
diff --git a/lib/sched.in.h b/lib/sched.in.h
index af4b55a..cdfe1ae 100644
--- a/lib/sched.in.h
+++ b/lib/sched.in.h
@@ -1,17 +1,17 @@
 /* A GNU-like <sched.h>.
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _@GUARD_PREFIX@_SCHED_H
@@ -84,7 +84,9 @@
 #  endif
 _GL_CXXALIAS_SYS (sched_yield, int, (void));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (sched_yield);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef sched_yield
 # if HAVE_RAW_DECL_SCHED_YIELD
diff --git a/lib/scratch_buffer.h b/lib/scratch_buffer.h
new file mode 100644
index 0000000..8873577
--- /dev/null
+++ b/lib/scratch_buffer.h
@@ -0,0 +1,127 @@
+/* Variable-sized buffer with on-stack default allocation.
+   Copyright (C) 2017-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Paul Eggert, 2017.  */
+
+#ifndef _GL_SCRATCH_BUFFER_H
+#define _GL_SCRATCH_BUFFER_H
+
+/* Scratch buffers with a default stack allocation and fallback to
+   heap allocation.  It is expected that this function is used in this
+   way:
+
+     struct scratch_buffer tmpbuf;
+     scratch_buffer_init (&tmpbuf);
+
+     while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
+       if (!scratch_buffer_grow (&tmpbuf))
+         return -1;
+
+     scratch_buffer_free (&tmpbuf);
+     return 0;
+
+   The allocation functions (scratch_buffer_grow,
+   scratch_buffer_grow_preserve, scratch_buffer_set_array_size) make
+   sure that the heap allocation, if any, is freed, so that the code
+   above does not have a memory leak.  The buffer still remains in a
+   state that can be deallocated using scratch_buffer_free, so a loop
+   like this is valid as well:
+
+     struct scratch_buffer tmpbuf;
+     scratch_buffer_init (&tmpbuf);
+
+     while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
+       if (!scratch_buffer_grow (&tmpbuf))
+         break;
+
+     scratch_buffer_free (&tmpbuf);
+
+   scratch_buffer_grow and scratch_buffer_grow_preserve are guaranteed
+   to grow the buffer by at least 512 bytes.  This means that when
+   using the scratch buffer as a backing store for a non-character
+   array whose element size, in bytes, is 512 or smaller, the scratch
+   buffer only has to grow once to make room for at least one more
+   element.
+*/
+
+/* Scratch buffer.  Must be initialized with scratch_buffer_init
+   before its use.  */
+struct scratch_buffer;
+
+/* Initializes *BUFFER so that BUFFER->data points to BUFFER->__space
+   and BUFFER->length reflects the available space.  */
+#if 0
+extern void scratch_buffer_init (struct scratch_buffer *buffer);
+#endif
+
+/* Deallocates *BUFFER (if it was heap-allocated).  */
+#if 0
+extern void scratch_buffer_free (struct scratch_buffer *buffer);
+#endif
+
+/* Grow *BUFFER by some arbitrary amount.  The buffer contents is NOT
+   preserved.  Return true on success, false on allocation failure (in
+   which case the old buffer is freed).  On success, the new buffer is
+   larger than the previous size.  On failure, *BUFFER is deallocated,
+   but remains in a free-able state, and errno is set.  */
+#if 0
+extern bool scratch_buffer_grow (struct scratch_buffer *buffer);
+#endif
+
+/* Like scratch_buffer_grow, but preserve the old buffer
+   contents on success, as a prefix of the new buffer.  */
+#if 0
+extern bool scratch_buffer_grow_preserve (struct scratch_buffer *buffer);
+#endif
+
+/* Grow *BUFFER so that it can store at least NELEM elements of SIZE
+   bytes.  The buffer contents are NOT preserved.  Both NELEM and SIZE
+   can be zero.  Return true on success, false on allocation failure
+   (in which case the old buffer is freed, but *BUFFER remains in a
+   free-able state, and errno is set).  It is unspecified whether this
+   function can reduce the array size.  */
+#if 0
+extern bool scratch_buffer_set_array_size (struct scratch_buffer *buffer,
+                                           size_t nelem, size_t size);
+#endif
+
+/* Return a copy of *BUFFER's first SIZE bytes as a heap-allocated block,
+   deallocating *BUFFER if it was heap-allocated.  SIZE must be at
+   most *BUFFER's size.  Return NULL (setting errno) on memory
+   exhaustion.  */
+#if 0
+extern void *scratch_buffer_dupfree (struct scratch_buffer *buffer,
+                                     size_t size);
+#endif
+
+
+/* The implementation is imported from glibc.  */
+
+/* Avoid possible conflicts with symbols exported by the GNU libc.  */
+#define __libc_scratch_buffer_dupfree gl_scratch_buffer_dupfree
+#define __libc_scratch_buffer_grow gl_scratch_buffer_grow
+#define __libc_scratch_buffer_grow_preserve gl_scratch_buffer_grow_preserve
+#define __libc_scratch_buffer_set_array_size gl_scratch_buffer_set_array_size
+
+#ifndef _GL_LIKELY
+/* Rely on __builtin_expect, as provided by the module 'builtin-expect'.  */
+# define _GL_LIKELY(cond) __builtin_expect ((cond), 1)
+# define _GL_UNLIKELY(cond) __builtin_expect ((cond), 0)
+#endif
+
+#include <malloc/scratch_buffer.gl.h>
+
+#endif /* _GL_SCRATCH_BUFFER_H */
diff --git a/lib/setenv.c b/lib/setenv.c
index 733b257..3ad3477 100644
--- a/lib/setenv.c
+++ b/lib/setenv.c
@@ -1,17 +1,17 @@
-/* Copyright (C) 1992, 1995-2003, 2005-2019 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1995-2003, 2005-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if !_LIBC
@@ -72,7 +72,7 @@
    values are from a small set.  Outside glibc this will eat up all
    memory after a while.  */
 #if defined _LIBC || (defined HAVE_SEARCH_H && defined HAVE_TSEARCH \
-                      && defined __GNUC__)
+                      && (defined __GNUC__ || defined __clang__))
 # define USE_TSEARCH    1
 # include <search.h>
 typedef int (*compar_fn_t) (const void *, const void *);
diff --git a/lib/setlocale-lock.c b/lib/setlocale-lock.c
new file mode 100644
index 0000000..53e231c
--- /dev/null
+++ b/lib/setlocale-lock.c
@@ -0,0 +1,150 @@
+/* Return the internal lock used by setlocale_null_r.
+   Copyright (C) 2019-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2019.  */
+
+#include <config.h>
+
+/* When it is known that the gl_get_setlocale_null_lock function is defined
+   by a dependency library, it should not be defined here.  */
+#if OMIT_SETLOCALE_LOCK
+
+/* This declaration is solely to ensure that after preprocessing
+   this file is never empty.  */
+typedef int dummy;
+
+#else
+
+/* This file defines the internal lock used by setlocale_null_r.
+   It is a separate compilation unit, so that only one copy of it is
+   present when linking statically.  */
+
+/* Prohibit renaming this symbol.  */
+# undef gl_get_setlocale_null_lock
+
+/* Macro for exporting a symbol (function, not variable) defined in this file,
+   when compiled into a shared library.  */
+# ifndef DLL_EXPORTED
+#  if HAVE_VISIBILITY
+  /* Override the effect of the compiler option '-fvisibility=hidden'.  */
+#   define DLL_EXPORTED __attribute__((__visibility__("default")))
+#  elif defined _WIN32 || defined __CYGWIN__
+#   define DLL_EXPORTED __declspec(dllexport)
+#  else
+#   define DLL_EXPORTED
+#  endif
+# endif
+
+# if defined _WIN32 && !defined __CYGWIN__
+
+#  define WIN32_LEAN_AND_MEAN  /* avoid including junk */
+#  include <windows.h>
+
+#  include "windows-initguard.h"
+
+/* The return type is a 'CRITICAL_SECTION *', not a 'glwthread_mutex_t *',
+   because the latter is not guaranteed to be a stable ABI in the future.  */
+
+/* Make sure the function gets exported from DLLs.  */
+DLL_EXPORTED CRITICAL_SECTION *gl_get_setlocale_null_lock (void);
+
+static glwthread_initguard_t guard = GLWTHREAD_INITGUARD_INIT;
+static CRITICAL_SECTION lock;
+
+/* Returns the internal lock used by setlocale_null_r.  */
+CRITICAL_SECTION *
+gl_get_setlocale_null_lock (void)
+{
+  if (!guard.done)
+    {
+      if (InterlockedIncrement (&guard.started) == 0)
+        {
+          /* This thread is the first one to need the lock.  Initialize it.  */
+          InitializeCriticalSection (&lock);
+          guard.done = 1;
+        }
+      else
+        {
+          /* Don't let guard.started grow and wrap around.  */
+          InterlockedDecrement (&guard.started);
+          /* Yield the CPU while waiting for another thread to finish
+             initializing this mutex.  */
+          while (!guard.done)
+            Sleep (0);
+        }
+    }
+  return &lock;
+}
+
+# elif HAVE_PTHREAD_API
+
+#  include <pthread.h>
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+/* Make sure the function gets exported from shared libraries.  */
+DLL_EXPORTED pthread_mutex_t *gl_get_setlocale_null_lock (void);
+
+/* Returns the internal lock used by setlocale_null_r.  */
+pthread_mutex_t *
+gl_get_setlocale_null_lock (void)
+{
+  return &mutex;
+}
+
+# elif HAVE_THREADS_H
+
+#  include <threads.h>
+#  include <stdlib.h>
+
+static int volatile init_needed = 1;
+static once_flag init_once = ONCE_FLAG_INIT;
+static mtx_t mutex;
+
+static void
+atomic_init (void)
+{
+  if (mtx_init (&mutex, mtx_plain) != thrd_success)
+    abort ();
+  init_needed = 0;
+}
+
+/* Make sure the function gets exported from shared libraries.  */
+DLL_EXPORTED mtx_t *gl_get_setlocale_null_lock (void);
+
+/* Returns the internal lock used by setlocale_null_r.  */
+mtx_t *
+gl_get_setlocale_null_lock (void)
+{
+  if (init_needed)
+    call_once (&init_once, atomic_init);
+  return &mutex;
+}
+
+# endif
+
+# if (defined _WIN32 || defined __CYGWIN__) && !defined _MSC_VER
+/* Make sure the '__declspec(dllimport)' in setlocale_null.c does not cause
+   a link failure when no DLLs are involved.  */
+#  if defined _WIN64 || defined _LP64
+#   define IMP(x) __imp_##x
+#  else
+#   define IMP(x) _imp__##x
+#  endif
+void * IMP(gl_get_setlocale_null_lock) = &gl_get_setlocale_null_lock;
+# endif
+
+#endif
diff --git a/lib/setlocale_null.c b/lib/setlocale_null.c
new file mode 100644
index 0000000..dbfda25
--- /dev/null
+++ b/lib/setlocale_null.c
@@ -0,0 +1,411 @@
+/* Query the name of the current global locale.
+   Copyright (C) 2019-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2019.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "setlocale_null.h"
+
+#include <errno.h>
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#if defined _WIN32 && !defined __CYGWIN__
+# include <wchar.h>
+#endif
+
+#if !(SETLOCALE_NULL_ALL_MTSAFE && SETLOCALE_NULL_ONE_MTSAFE)
+# if defined _WIN32 && !defined __CYGWIN__
+
+#  define WIN32_LEAN_AND_MEAN  /* avoid including junk */
+#  include <windows.h>
+
+# elif HAVE_PTHREAD_API
+
+#  include <pthread.h>
+#  if HAVE_THREADS_H && HAVE_WEAK_SYMBOLS
+#   include <threads.h>
+#   pragma weak thrd_exit
+#   define c11_threads_in_use() (thrd_exit != NULL)
+#  else
+#   define c11_threads_in_use() 0
+#  endif
+
+# elif HAVE_THREADS_H
+
+#  include <threads.h>
+
+# endif
+#endif
+
+/* Use the system's setlocale() function, not the gnulib override, here.  */
+#undef setlocale
+
+static const char *
+setlocale_null_androidfix (int category)
+{
+  const char *result = setlocale (category, NULL);
+
+#ifdef __ANDROID__
+  if (result == NULL)
+    switch (category)
+      {
+      case LC_CTYPE:
+      case LC_NUMERIC:
+      case LC_TIME:
+      case LC_COLLATE:
+      case LC_MONETARY:
+      case LC_MESSAGES:
+      case LC_ALL:
+      case LC_PAPER:
+      case LC_NAME:
+      case LC_ADDRESS:
+      case LC_TELEPHONE:
+      case LC_MEASUREMENT:
+        result = "C";
+        break;
+      default:
+        break;
+      }
+#endif
+
+  return result;
+}
+
+static int
+setlocale_null_unlocked (int category, char *buf, size_t bufsize)
+{
+#if defined _WIN32 && !defined __CYGWIN__ && defined _MSC_VER
+  /* On native Windows, nowadays, the setlocale() implementation is based
+     on _wsetlocale() and uses malloc() for the result.  We are better off
+     using _wsetlocale() directly.  */
+  const wchar_t *result = _wsetlocale (category, NULL);
+
+  if (result == NULL)
+    {
+      /* CATEGORY is invalid.  */
+      if (bufsize > 0)
+        /* Return an empty string in BUF.
+           This is a convenience for callers that don't want to write explicit
+           code for handling EINVAL.  */
+        buf[0] = '\0';
+      return EINVAL;
+    }
+  else
+    {
+      size_t length = wcslen (result);
+      if (length < bufsize)
+        {
+          size_t i;
+
+          /* Convert wchar_t[] -> char[], assuming plain ASCII.  */
+          for (i = 0; i <= length; i++)
+            buf[i] = result[i];
+
+          return 0;
+        }
+      else
+        {
+          if (bufsize > 0)
+            {
+              /* Return a truncated result in BUF.
+                 This is a convenience for callers that don't want to write
+                 explicit code for handling ERANGE.  */
+              size_t i;
+
+              /* Convert wchar_t[] -> char[], assuming plain ASCII.  */
+              for (i = 0; i < bufsize; i++)
+                buf[i] = result[i];
+              buf[bufsize - 1] = '\0';
+            }
+          return ERANGE;
+        }
+    }
+#else
+  const char *result = setlocale_null_androidfix (category);
+
+  if (result == NULL)
+    {
+      /* CATEGORY is invalid.  */
+      if (bufsize > 0)
+        /* Return an empty string in BUF.
+           This is a convenience for callers that don't want to write explicit
+           code for handling EINVAL.  */
+        buf[0] = '\0';
+      return EINVAL;
+    }
+  else
+    {
+      size_t length = strlen (result);
+      if (length < bufsize)
+        {
+          memcpy (buf, result, length + 1);
+          return 0;
+        }
+      else
+        {
+          if (bufsize > 0)
+            {
+              /* Return a truncated result in BUF.
+                 This is a convenience for callers that don't want to write
+                 explicit code for handling ERANGE.  */
+              memcpy (buf, result, bufsize - 1);
+              buf[bufsize - 1] = '\0';
+            }
+          return ERANGE;
+        }
+    }
+#endif
+}
+
+#if !(SETLOCALE_NULL_ALL_MTSAFE && SETLOCALE_NULL_ONE_MTSAFE) /* musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin */
+
+/* Use a lock, so that no two threads can invoke setlocale_null_unlocked
+   at the same time.  */
+
+/* Prohibit renaming this symbol.  */
+# undef gl_get_setlocale_null_lock
+
+# if defined _WIN32 && !defined __CYGWIN__
+
+extern __declspec(dllimport) CRITICAL_SECTION *gl_get_setlocale_null_lock (void);
+
+static int
+setlocale_null_with_lock (int category, char *buf, size_t bufsize)
+{
+  CRITICAL_SECTION *lock = gl_get_setlocale_null_lock ();
+  int ret;
+
+  EnterCriticalSection (lock);
+  ret = setlocale_null_unlocked (category, buf, bufsize);
+  LeaveCriticalSection (lock);
+
+  return ret;
+}
+
+# elif HAVE_PTHREAD_API /* musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin */
+
+extern
+#  if defined _WIN32 || defined __CYGWIN__
+  __declspec(dllimport)
+#  endif
+  pthread_mutex_t *gl_get_setlocale_null_lock (void);
+
+#  if HAVE_WEAK_SYMBOLS /* musl libc, FreeBSD, NetBSD, OpenBSD, Haiku */
+
+    /* Avoid the need to link with '-lpthread'.  */
+#   pragma weak pthread_mutex_lock
+#   pragma weak pthread_mutex_unlock
+
+    /* Determine whether libpthread is in use.  */
+#   pragma weak pthread_mutexattr_gettype
+    /* See the comments in lock.h.  */
+#   define pthread_in_use() \
+      (pthread_mutexattr_gettype != NULL || c11_threads_in_use ())
+
+#  else
+#   define pthread_in_use() 1
+#  endif
+
+static int
+setlocale_null_with_lock (int category, char *buf, size_t bufsize)
+{
+  if (pthread_in_use())
+    {
+      pthread_mutex_t *lock = gl_get_setlocale_null_lock ();
+      int ret;
+
+      if (pthread_mutex_lock (lock))
+        abort ();
+      ret = setlocale_null_unlocked (category, buf, bufsize);
+      if (pthread_mutex_unlock (lock))
+        abort ();
+
+      return ret;
+    }
+  else
+    return setlocale_null_unlocked (category, buf, bufsize);
+}
+
+# elif HAVE_THREADS_H
+
+extern mtx_t *gl_get_setlocale_null_lock (void);
+
+static int
+setlocale_null_with_lock (int category, char *buf, size_t bufsize)
+{
+  mtx_t *lock = gl_get_setlocale_null_lock ();
+  int ret;
+
+  if (mtx_lock (lock) != thrd_success)
+    abort ();
+  ret = setlocale_null_unlocked (category, buf, bufsize);
+  if (mtx_unlock (lock) != thrd_success)
+    abort ();
+
+  return ret;
+}
+
+# endif
+
+#endif
+
+int
+setlocale_null_r (int category, char *buf, size_t bufsize)
+{
+#if SETLOCALE_NULL_ALL_MTSAFE
+# if SETLOCALE_NULL_ONE_MTSAFE
+
+  return setlocale_null_unlocked (category, buf, bufsize);
+
+# else
+
+  if (category == LC_ALL)
+    return setlocale_null_unlocked (category, buf, bufsize);
+  else
+    return setlocale_null_with_lock (category, buf, bufsize);
+
+# endif
+#else
+# if SETLOCALE_NULL_ONE_MTSAFE
+
+  if (category == LC_ALL)
+    return setlocale_null_with_lock (category, buf, bufsize);
+  else
+    return setlocale_null_unlocked (category, buf, bufsize);
+
+# else
+
+  return setlocale_null_with_lock (category, buf, bufsize);
+
+# endif
+#endif
+}
+
+const char *
+setlocale_null (int category)
+{
+#if SETLOCALE_NULL_ALL_MTSAFE && SETLOCALE_NULL_ONE_MTSAFE
+  return setlocale_null_androidfix (category);
+#else
+
+  /* This call must be multithread-safe.  To achieve this without using
+     thread-local storage:
+       1. We use a specific static buffer for each possible CATEGORY
+          argument.  So that different threads can call setlocale_mtsafe
+          with different CATEGORY arguments, without interfering.
+       2. We use a simple strcpy or memcpy to fill this static buffer.
+          Filling it through, for example, strcpy + strcat would not be
+          guaranteed to leave the buffer's contents intact if another thread
+          is currently accessing it.  If necessary, the contents is first
+          assembled in a stack-allocated buffer.  */
+  if (category == LC_ALL)
+    {
+# if SETLOCALE_NULL_ALL_MTSAFE
+      return setlocale_null_androidfix (LC_ALL);
+# else
+      char buf[SETLOCALE_NULL_ALL_MAX];
+      static char resultbuf[SETLOCALE_NULL_ALL_MAX];
+
+      if (setlocale_null_r (LC_ALL, buf, sizeof (buf)))
+        return "C";
+      strcpy (resultbuf, buf);
+      return resultbuf;
+# endif
+    }
+  else
+    {
+# if SETLOCALE_NULL_ONE_MTSAFE
+      return setlocale_null_androidfix (category);
+# else
+      enum
+        {
+          LC_CTYPE_INDEX,
+          LC_NUMERIC_INDEX,
+          LC_TIME_INDEX,
+          LC_COLLATE_INDEX,
+          LC_MONETARY_INDEX,
+          LC_MESSAGES_INDEX,
+#  ifdef LC_PAPER
+          LC_PAPER_INDEX,
+#  endif
+#  ifdef LC_NAME
+          LC_NAME_INDEX,
+#  endif
+#  ifdef LC_ADDRESS
+          LC_ADDRESS_INDEX,
+#  endif
+#  ifdef LC_TELEPHONE
+          LC_TELEPHONE_INDEX,
+#  endif
+#  ifdef LC_MEASUREMENT
+          LC_MEASUREMENT_INDEX,
+#  endif
+#  ifdef LC_IDENTIFICATION
+          LC_IDENTIFICATION_INDEX,
+#  endif
+          LC_INDICES_COUNT
+        }
+        i;
+      char buf[SETLOCALE_NULL_MAX];
+      static char resultbuf[LC_INDICES_COUNT][SETLOCALE_NULL_MAX];
+      int err;
+
+      err = setlocale_null_r (category, buf, sizeof (buf));
+      if (err == EINVAL)
+        return NULL;
+      if (err)
+        return "C";
+
+      switch (category)
+        {
+        case LC_CTYPE:          i = LC_CTYPE_INDEX;          break;
+        case LC_NUMERIC:        i = LC_NUMERIC_INDEX;        break;
+        case LC_TIME:           i = LC_TIME_INDEX;           break;
+        case LC_COLLATE:        i = LC_COLLATE_INDEX;        break;
+        case LC_MONETARY:       i = LC_MONETARY_INDEX;       break;
+        case LC_MESSAGES:       i = LC_MESSAGES_INDEX;       break;
+#  ifdef LC_PAPER
+        case LC_PAPER:          i = LC_PAPER_INDEX;          break;
+#  endif
+#  ifdef LC_NAME
+        case LC_NAME:           i = LC_NAME_INDEX;           break;
+#  endif
+#  ifdef LC_ADDRESS
+        case LC_ADDRESS:        i = LC_ADDRESS_INDEX;        break;
+#  endif
+#  ifdef LC_TELEPHONE
+        case LC_TELEPHONE:      i = LC_TELEPHONE_INDEX;      break;
+#  endif
+#  ifdef LC_MEASUREMENT
+        case LC_MEASUREMENT:    i = LC_MEASUREMENT_INDEX;    break;
+#  endif
+#  ifdef LC_IDENTIFICATION
+        case LC_IDENTIFICATION: i = LC_IDENTIFICATION_INDEX; break;
+#  endif
+        default:
+          /* If you get here, a #ifdef LC_xxx is missing.  */
+          abort ();
+        }
+
+      strcpy (resultbuf[i], buf);
+      return resultbuf[i];
+# endif
+    }
+#endif
+}
diff --git a/lib/setlocale_null.h b/lib/setlocale_null.h
new file mode 100644
index 0000000..00c42e2
--- /dev/null
+++ b/lib/setlocale_null.h
@@ -0,0 +1,82 @@
+/* Query the name of the current global locale.
+   Copyright (C) 2019-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2019.  */
+
+#ifndef _SETLOCALE_NULL_H
+#define _SETLOCALE_NULL_H
+
+#include <stddef.h>
+
+#include "arg-nonnull.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Recommended size of a buffer for a locale name for a single category.
+   On glibc systems, you can have locale names that are relative file names;
+   assume a maximum length 256.
+   In native Windows, in 2018 the longest locale name was of length 58
+   ("FYRO Macedonian_Former Yugoslav Republic of Macedonia.1251").  */
+#define SETLOCALE_NULL_MAX (256+1)
+
+/* Recommended size of a buffer for a locale name with all categories.
+   On glibc systems, you can have locale names that are relative file names;
+   assume maximum length 256 for each.  There are 12 categories; so, the
+   maximum total length is 148+12*256.
+   In native Windows, there are 5 categories, and the maximum total length is
+   55+5*58.  */
+#define SETLOCALE_NULL_ALL_MAX (148+12*256+1)
+
+/* setlocale_null_r (CATEGORY, BUF, BUFSIZE) is like setlocale (CATEGORY, NULL),
+   except that
+     - it is guaranteed to be multithread-safe,
+     - it returns the resulting locale category name or locale name in the
+       user-supplied buffer BUF, which must be BUFSIZE bytes long.
+   The recommended minimum buffer size is
+     - SETLOCALE_NULL_MAX for CATEGORY != LC_ALL, and
+     - SETLOCALE_NULL_ALL_MAX for CATEGORY == LC_ALL.
+   The return value is an error code: 0 if the call is successful, EINVAL if
+   CATEGORY is invalid, or ERANGE if BUFSIZE is smaller than the length needed
+   size (including the trailing NUL byte).  In the latter case, a truncated
+   result is returned in BUF, but still NUL-terminated if BUFSIZE > 0.
+   For this call to be multithread-safe, *all* calls to
+   setlocale (CATEGORY, NULL) in all other threads must have been converted
+   to use setlocale_null_r or setlocale_null as well, and the other threads
+   must not make other setlocale invocations (since changing the global locale
+   has side effects on all threads).  */
+extern int setlocale_null_r (int category, char *buf, size_t bufsize)
+  _GL_ARG_NONNULL ((2));
+
+/* setlocale_null (CATEGORY) is like setlocale (CATEGORY, NULL), except that
+   it is guaranteed to be multithread-safe.
+   The return value is NULL if CATEGORY is invalid.
+   For this call to be multithread-safe, *all* calls to
+   setlocale (CATEGORY, NULL) in all other threads must have been converted
+   to use setlocale_null_r or setlocale_null as well, and the other threads
+   must not make other setlocale invocations (since changing the global locale
+   has side effects on all threads).  */
+extern const char *setlocale_null (int category);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SETLOCALE_NULL_H */
diff --git a/lib/sig-handler.c b/lib/sig-handler.c
index 52c3621..6257914 100644
--- a/lib/sig-handler.c
+++ b/lib/sig-handler.c
@@ -1,3 +1,21 @@
+/* Convenience declarations when working with <signal.h>.
+
+   Copyright (C) 2012-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #include <config.h>
+
 #define SIG_HANDLER_INLINE _GL_EXTERN_INLINE
 #include "sig-handler.h"
diff --git a/lib/sig-handler.h b/lib/sig-handler.h
index b289473..0ce5897 100644
--- a/lib/sig-handler.h
+++ b/lib/sig-handler.h
@@ -1,18 +1,18 @@
 /* Convenience declarations when working with <signal.h>.
 
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_SIG_HANDLER_H
diff --git a/lib/sigaction.c b/lib/sigaction.c
index abedfdc..e1ace46 100644
--- a/lib/sigaction.c
+++ b/lib/sigaction.c
@@ -1,18 +1,18 @@
 /* POSIX compatible signal blocking.
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
    Written by Eric Blake <ebb9@byu.net>, 2008.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/signal.in.h b/lib/signal.in.h
index b4e432d..275da8c 100644
--- a/lib/signal.in.h
+++ b/lib/signal.in.h
@@ -1,18 +1,18 @@
 /* A GNU-like <signal.h>.
 
-   Copyright (C) 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
@@ -55,13 +55,13 @@
 #ifndef _@GUARD_PREFIX@_SIGNAL_H
 #define _@GUARD_PREFIX@_SIGNAL_H
 
-/* Mac OS X 10.3, FreeBSD 6.4, OpenBSD 3.8, OSF/1 4.0, Solaris 2.6, Android
-   declare pthread_sigmask in <pthread.h>, not in <signal.h>.
+/* Mac OS X 10.3, FreeBSD 6.4, OpenBSD 3.8, OSF/1 4.0, Solaris 2.6, Android,
+   OS/2 kLIBC declare pthread_sigmask in <pthread.h>, not in <signal.h>.
    But avoid namespace pollution on glibc systems.*/
 #if (@GNULIB_PTHREAD_SIGMASK@ || defined GNULIB_POSIXCHECK) \
     && ((defined __APPLE__ && defined __MACH__) \
         || defined __FreeBSD__ || defined __OpenBSD__ || defined __osf__ \
-        || defined __sun || defined __ANDROID__) \
+        || defined __sun || defined __ANDROID__ || defined __KLIBC__) \
     && ! defined __GLIBC__
 # include <pthread.h>
 #endif
@@ -133,16 +133,24 @@
 #   define pthread_sigmask rpl_pthread_sigmask
 #  endif
 _GL_FUNCDECL_RPL (pthread_sigmask, int,
-                  (int how, const sigset_t *new_mask, sigset_t *old_mask));
+                  (int how,
+                   const sigset_t *restrict new_mask,
+                   sigset_t *restrict old_mask));
 _GL_CXXALIAS_RPL (pthread_sigmask, int,
-                  (int how, const sigset_t *new_mask, sigset_t *old_mask));
+                  (int how,
+                   const sigset_t *restrict new_mask,
+                   sigset_t *restrict old_mask));
 # else
 #  if !(@HAVE_PTHREAD_SIGMASK@ || defined pthread_sigmask)
 _GL_FUNCDECL_SYS (pthread_sigmask, int,
-                  (int how, const sigset_t *new_mask, sigset_t *old_mask));
+                  (int how,
+                   const sigset_t *restrict new_mask,
+                   sigset_t *restrict old_mask));
 #  endif
 _GL_CXXALIAS_SYS (pthread_sigmask, int,
-                  (int how, const sigset_t *new_mask, sigset_t *old_mask));
+                  (int how,
+                   const sigset_t *restrict new_mask,
+                   sigset_t *restrict old_mask));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (pthread_sigmask);
@@ -295,10 +303,14 @@
 #  define SIG_SETMASK 1  /* blocked_set = *set; */
 #  define SIG_UNBLOCK 2  /* blocked_set = blocked_set & ~*set; */
 _GL_FUNCDECL_SYS (sigprocmask, int,
-                  (int operation, const sigset_t *set, sigset_t *old_set));
+                  (int operation,
+                   const sigset_t *restrict set,
+                   sigset_t *restrict old_set));
 # endif
 _GL_CXXALIAS_SYS (sigprocmask, int,
-                  (int operation, const sigset_t *set, sigset_t *old_set));
+                  (int operation,
+                   const sigset_t *restrict set,
+                   sigset_t *restrict old_set));
 _GL_CXXALIASWARN (sigprocmask);
 
 /* Install the handler FUNC for signal SIG, and return the previous
@@ -322,6 +334,12 @@
 _GL_CXXALIAS_RPL (signal, _gl_function_taking_int_returning_void_t,
                   (int sig, _gl_function_taking_int_returning_void_t func));
 # else
+/* On OpenBSD, the declaration of 'signal' may not be present at this point,
+   because it occurs in <sys/signal.h>, not <signal.h> directly.  */
+#  if defined __OpenBSD__
+_GL_FUNCDECL_SYS (signal, _gl_function_taking_int_returning_void_t,
+                  (int sig, _gl_function_taking_int_returning_void_t func));
+#  endif
 _GL_CXXALIAS_SYS (signal, _gl_function_taking_int_returning_void_t,
                   (int sig, _gl_function_taking_int_returning_void_t func));
 # endif
diff --git a/lib/signbitd.c b/lib/signbitd.c
index 9eb7d3a..2259771 100644
--- a/lib/signbitd.c
+++ b/lib/signbitd.c
@@ -1,17 +1,17 @@
 /* signbit() macro: Determine the sign bit of a floating-point number.
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/signbitf.c b/lib/signbitf.c
index 86595e5..b196d9a 100644
--- a/lib/signbitf.c
+++ b/lib/signbitf.c
@@ -1,17 +1,17 @@
 /* signbit() macro: Determine the sign bit of a floating-point number.
-   Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/signbitl.c b/lib/signbitl.c
index 79f4992..f73802d 100644
--- a/lib/signbitl.c
+++ b/lib/signbitl.c
@@ -1,17 +1,17 @@
 /* signbit() macro: Determine the sign bit of a floating-point number.
-   Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/sigprocmask.c b/lib/sigprocmask.c
index d6cd3f8..c479204 100644
--- a/lib/sigprocmask.c
+++ b/lib/sigprocmask.c
@@ -1,18 +1,18 @@
 /* POSIX compatible signal blocking.
-   Copyright (C) 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2006.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/size_max.h b/lib/size_max.h
index e265fb9..1186ba9 100644
--- a/lib/size_max.h
+++ b/lib/size_max.h
@@ -1,19 +1,19 @@
 /* size_max.h -- declare SIZE_MAX through system headers
-   Copyright (C) 2005-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2006, 2009-2021 Free Software Foundation, Inc.
    Written by Simon Josefsson.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef GNULIB_SIZE_MAX_H
 #define GNULIB_SIZE_MAX_H
diff --git a/lib/snprintf.c b/lib/snprintf.c
index 5cf1ede..a589cf1 100644
--- a/lib/snprintf.c
+++ b/lib/snprintf.c
@@ -1,19 +1,19 @@
 /* Formatted output to strings.
-   Copyright (C) 2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2006-2021 Free Software Foundation, Inc.
    Written by Simon Josefsson and Paul Eggert.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
diff --git a/lib/spawn-pipe.c b/lib/spawn-pipe.c
index 3af5167..cedd48a 100644
--- a/lib/spawn-pipe.c
+++ b/lib/spawn-pipe.c
@@ -1,5 +1,5 @@
 /* Creation of subprocesses, communicating via pipes.
-   Copyright (C) 2001-2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2004, 2006-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <haible@clisp.cons.org>, 2001.
 
    This program is free software: you can redistribute it and/or modify
@@ -32,19 +32,47 @@
 #include <signal.h>
 #include <unistd.h>
 
+#include "canonicalize.h"
 #include "error.h"
 #include "fatal-signal.h"
+#include "filename.h"
+#include "findprog.h"
 #include "unistd-safer.h"
 #include "wait-process.h"
+#include "xalloc.h"
 #include "gettext.h"
 
 #define _(str) gettext (str)
 
-#if (defined _WIN32 && ! defined __CYGWIN__) || defined __KLIBC__
+
+/* Choice of implementation for native Windows.
+   - Define to 0 to use the posix_spawn facility (modules 'posix_spawn' and
+     'posix_spawnp'), that is based on the module 'windows-spawn'.
+   - Define to 1 to use the older code, that uses the module 'windows-spawn'
+     directly.
+   You can set this macro from a Makefile or at configure time, from the
+   CPPFLAGS.  */
+#ifndef SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN
+# define SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN 0
+#endif
+
+
+#if (defined _WIN32 && !defined __CYGWIN__) && SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN
 
 /* Native Windows API.  */
+# if GNULIB_MSVC_NOTHROW
+#  include "msvc-nothrow.h"
+# else
+#  include <io.h>
+# endif
 # include <process.h>
-# include "w32spawn.h"
+# include "windows-spawn.h"
+
+#elif defined __KLIBC__
+
+/* OS/2 kLIBC API.  */
+# include <process.h>
+# include "os2-spawn.h"
 
 #else
 
@@ -74,7 +102,7 @@
 #undef close /* avoid warning related to gnulib module unistd */
 #define close nonintr_close
 
-#if defined _WIN32 && ! defined __CYGWIN__
+#if (defined _WIN32 && !defined __CYGWIN__) && SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN
 static int
 nonintr_open (const char *pathname, int oflag, mode_t mode)
 {
@@ -108,33 +136,81 @@
  */
 static pid_t
 create_pipe (const char *progname,
-             const char *prog_path, char **prog_argv,
+             const char *prog_path,
+             const char * const *prog_argv,
+             const char *directory,
              bool pipe_stdin, bool pipe_stdout,
              const char *prog_stdin, const char *prog_stdout,
              bool null_stderr,
              bool slave_process, bool exit_on_error,
              int fd[2])
 {
-#if (defined _WIN32 && ! defined __CYGWIN__) || defined __KLIBC__
+  int saved_errno;
+  char *prog_path_to_free = NULL;
+
+  if (directory != NULL)
+    {
+      /* If a change of directory is requested, make sure PROG_PATH is absolute
+         before we do so.  This is needed because
+           - posix_spawn and posix_spawnp are required to resolve a relative
+             PROG_PATH *after* changing the directory.  See
+             <https://www.austingroupbugs.net/view.php?id=1208>:
+               "if this pathname does not start with a <slash> it shall be
+                interpreted relative to the working directory of the child
+                process _after_ all file_actions have been performed."
+             But this would be a surprising application behaviour, possibly
+             even security relevant.
+           - For the Windows CreateProcess() function, it is unspecified whether
+             a relative file name is interpreted to the parent's current
+             directory or to the specified directory.  See
+             <https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa>  */
+      if (! IS_ABSOLUTE_FILE_NAME (prog_path))
+        {
+          const char *resolved_prog =
+            find_in_given_path (prog_path, getenv ("PATH"), NULL, false);
+          if (resolved_prog == NULL)
+            goto fail_with_errno;
+          if (resolved_prog != prog_path)
+            prog_path_to_free = (char *) resolved_prog;
+          prog_path = resolved_prog;
+
+          if (! IS_ABSOLUTE_FILE_NAME (prog_path))
+            {
+              char *absolute_prog =
+                canonicalize_filename_mode (prog_path, CAN_MISSING | CAN_NOLINKS);
+              if (absolute_prog == NULL)
+                {
+                  free (prog_path_to_free);
+                  goto fail_with_errno;
+                }
+              free (prog_path_to_free);
+              prog_path_to_free = absolute_prog;
+              prog_path = absolute_prog;
+
+              if (! IS_ABSOLUTE_FILE_NAME (prog_path))
+                abort ();
+            }
+        }
+    }
+
+#if ((defined _WIN32 && !defined __CYGWIN__) && SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN) || defined __KLIBC__
 
   /* Native Windows API.
-     This uses _pipe(), dup2(), and spawnv().  It could also be implemented
+     This uses _pipe(), dup2(), and _spawnv().  It could also be implemented
      using the low-level functions CreatePipe(), DuplicateHandle(),
      CreateProcess() and _open_osfhandle(); see the GNU make and GNU clisp
      and cvs source code.  */
+  char *argv_mem_to_free;
   int ifd[2];
   int ofd[2];
-  int orig_stdin;
-  int orig_stdout;
-  int orig_stderr;
   int child;
   int nulloutfd;
   int stdinfd;
   int stdoutfd;
-  int saved_errno;
 
-  /* FIXME: Need to free memory allocated by prepare_spawn.  */
-  prog_argv = prepare_spawn (prog_argv);
+  const char **argv = prepare_spawn (prog_argv, &argv_mem_to_free);
+  if (argv == NULL)
+    xalloc_die ();
 
   if (pipe_stdout)
     if (pipe2_safer (ifd, O_BINARY | O_CLOEXEC) < 0)
@@ -151,6 +227,130 @@
  *
  */
 
+  child = -1;
+
+# if (defined _WIN32 && !defined __CYGWIN__) && SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN
+  bool must_close_ifd1 = pipe_stdout;
+  bool must_close_ofd0 = pipe_stdin;
+
+  /* Create standard file handles of child process.  */
+  HANDLE stdin_handle = INVALID_HANDLE_VALUE;
+  HANDLE stdout_handle = INVALID_HANDLE_VALUE;
+  nulloutfd = -1;
+  stdinfd = -1;
+  stdoutfd = -1;
+  if ((!null_stderr
+       || (nulloutfd = open ("NUL", O_RDWR, 0)) >= 0)
+      && (pipe_stdin
+          || prog_stdin == NULL
+          || (stdinfd = open (prog_stdin, O_RDONLY, 0)) >= 0)
+      && (pipe_stdout
+          || prog_stdout == NULL
+          || (stdoutfd = open (prog_stdout, O_WRONLY, 0)) >= 0))
+    /* The child process doesn't inherit ifd[0], ifd[1], ofd[0], ofd[1],
+       but it inherits the three STD*_FILENO for which we pass the handles.  */
+    /* Pass the environment explicitly.  This is needed if the program has
+       modified the environment using putenv() or [un]setenv().  On Windows,
+       processes have two environments, one in the "environment block" of the
+       process and managed through SetEnvironmentVariable(), and one inside the
+       process, in the location retrieved by the 'environ' macro.  If we were
+       to pass NULL, the child process would inherit a copy of the environment
+       block - ignoring the effects of putenv() and [un]setenv().  */
+    {
+      stdin_handle =
+        (HANDLE) _get_osfhandle (pipe_stdin ? ofd[0] :
+                                 prog_stdin == NULL ? STDIN_FILENO : stdinfd);
+      if (pipe_stdin)
+        {
+          HANDLE curr_process = GetCurrentProcess ();
+          HANDLE duplicate;
+          if (!DuplicateHandle (curr_process, stdin_handle,
+                                curr_process, &duplicate,
+                                0, TRUE, DUPLICATE_SAME_ACCESS))
+            {
+              errno = EBADF; /* arbitrary */
+              goto failed;
+            }
+          must_close_ofd0 = false;
+          close (ofd[0]); /* implies CloseHandle (stdin_handle); */
+          stdin_handle = duplicate;
+        }
+      stdout_handle =
+        (HANDLE) _get_osfhandle (pipe_stdout ? ifd[1] :
+                                 prog_stdout == NULL ? STDOUT_FILENO : stdoutfd);
+      if (pipe_stdout)
+        {
+          HANDLE curr_process = GetCurrentProcess ();
+          HANDLE duplicate;
+          if (!DuplicateHandle (curr_process, stdout_handle,
+                                curr_process, &duplicate,
+                                0, TRUE, DUPLICATE_SAME_ACCESS))
+            {
+              errno = EBADF; /* arbitrary */
+              goto failed;
+            }
+          must_close_ifd1 = false;
+          close (ifd[1]); /* implies CloseHandle (stdout_handle); */
+          stdout_handle = duplicate;
+        }
+      HANDLE stderr_handle =
+        (HANDLE) _get_osfhandle (null_stderr ? nulloutfd : STDERR_FILENO);
+
+      child = spawnpvech (P_NOWAIT, prog_path, argv + 1,
+                          (const char * const *) environ, directory,
+                          stdin_handle, stdout_handle, stderr_handle);
+#  if 0 /* Executing arbitrary files as shell scripts is unsecure.  */
+      if (child == -1 && errno == ENOEXEC)
+        {
+          /* prog is not a native executable.  Try to execute it as a
+             shell script.  Note that prepare_spawn() has already prepended
+             a hidden element "sh.exe" to argv.  */
+          argv[1] = prog_path;
+          child = spawnpvech (P_NOWAIT, argv[0], argv,
+                              (const char * const *) environ, directory,
+                              stdin_handle, stdout_handle, stderr_handle);
+        }
+#  endif
+    }
+ failed:
+  if (child == -1)
+    saved_errno = errno;
+  if (stdinfd >= 0)
+    close (stdinfd);
+  if (stdoutfd >= 0)
+    close (stdoutfd);
+  if (nulloutfd >= 0)
+    close (nulloutfd);
+
+  if (pipe_stdin)
+    {
+      if (must_close_ofd0)
+        close (ofd[0]);
+      else
+        if (stdin_handle != INVALID_HANDLE_VALUE)
+          CloseHandle (stdin_handle);
+    }
+  if (pipe_stdout)
+    {
+      if (must_close_ifd1)
+        close (ifd[1]);
+      else
+        if (stdout_handle != INVALID_HANDLE_VALUE)
+          CloseHandle (stdout_handle);
+    }
+
+# else /* __KLIBC__ */
+  if (!(directory == NULL || strcmp (directory, ".") == 0))
+    {
+      /* A directory argument is not supported in this implementation.  */
+      saved_errno = EINVAL;
+      goto fail_with_saved_errno;
+    }
+
+  int orig_stdin;
+  int orig_stdout;
+  int orig_stderr;
+
   /* Save standard file handles of parent process.  */
   if (pipe_stdin || prog_stdin != NULL)
     orig_stdin = dup_safer_noinherit (STDIN_FILENO);
@@ -158,7 +358,6 @@
     orig_stdout = dup_safer_noinherit (STDOUT_FILENO);
   if (null_stderr)
     orig_stderr = dup_safer_noinherit (STDERR_FILENO);
-  child = -1;
 
   /* Create standard file handles of child process.  */
   nulloutfd = -1;
@@ -186,26 +385,19 @@
     /* The child process doesn't inherit ifd[0], ifd[1], ofd[0], ofd[1],
        but it inherits all open()ed or dup2()ed file handles (which is what
        we want in the case of STD*_FILENO).  */
-    /* Use spawnvpe and pass the environment explicitly.  This is needed if
-       the program has modified the environment using putenv() or [un]setenv().
-       On Windows, programs have two environments, one in the "environment
-       block" of the process and managed through SetEnvironmentVariable(), and
-       one inside the process, in the location retrieved by the 'environ'
-       macro.  When using spawnvp() without 'e', the child process inherits a
-       copy of the environment block - ignoring the effects of putenv() and
-       [un]setenv().  */
     {
-      child = spawnvpe (P_NOWAIT, prog_path, (const char **) prog_argv,
-                        (const char **) environ);
-      if (child < 0 && errno == ENOEXEC)
+      child = _spawnvpe (P_NOWAIT, prog_path, argv + 1,
+                         (const char **) environ);
+#  if 0 /* Executing arbitrary files as shell scripts is unsecure.  */
+      if (child == -1 && errno == ENOEXEC)
         {
           /* prog is not a native executable.  Try to execute it as a
              shell script.  Note that prepare_spawn() has already prepended
-             a hidden element "sh.exe" to prog_argv.  */
-          --prog_argv;
-          child = spawnvpe (P_NOWAIT, prog_argv[0], (const char **) prog_argv,
-                            (const char **) environ);
+             a hidden element "sh.exe" to argv.  */
+          child = _spawnvpe (P_NOWAIT, argv[0], argv,
+                             (const char **) environ);
         }
+#  endif
     }
   if (child == -1)
     saved_errno = errno;
@@ -228,17 +420,19 @@
     close (ofd[0]);
   if (pipe_stdout)
     close (ifd[1]);
+# endif
+
+  free (argv);
+  free (argv_mem_to_free);
+  free (prog_path_to_free);
+
   if (child == -1)
     {
-      if (exit_on_error || !null_stderr)
-        error (exit_on_error ? EXIT_FAILURE : 0, saved_errno,
-               _("%s subprocess failed"), progname);
       if (pipe_stdout)
         close (ifd[0]);
       if (pipe_stdin)
         close (ofd[1]);
-      errno = saved_errno;
-      return -1;
+      goto fail_with_saved_errno;
     }
 
   if (pipe_stdout)
@@ -324,18 +518,33 @@
                                                           prog_stdout, O_WRONLY,
                                                           0))
                  != 0)
+          || (directory != NULL
+              && (err = posix_spawn_file_actions_addchdir (&actions,
+                                                           directory)))
           || (slave_process
               && ((err = posix_spawnattr_init (&attrs)) != 0
                   || (attrs_allocated = true,
+# if defined _WIN32 && !defined __CYGWIN__
+                      (err = posix_spawnattr_setpgroup (&attrs, 0)) != 0
+                      || (err = posix_spawnattr_setflags (&attrs,
+                                                         POSIX_SPAWN_SETPGROUP))
+                         != 0
+# else
                       (err = posix_spawnattr_setsigmask (&attrs,
                                                          &blocked_signals))
                       != 0
                       || (err = posix_spawnattr_setflags (&attrs,
                                                         POSIX_SPAWN_SETSIGMASK))
-                         != 0)))
-          || (err = posix_spawnp (&child, prog_path, &actions,
-                                  attrs_allocated ? &attrs : NULL, prog_argv,
-                                  environ))
+                         != 0
+# endif
+             )   )   )
+          || (err = (directory != NULL
+                     ? posix_spawn (&child, prog_path, &actions,
+                                    attrs_allocated ? &attrs : NULL,
+                                    (char * const *) prog_argv, environ)
+                     : posix_spawnp (&child, prog_path, &actions,
+                                     attrs_allocated ? &attrs : NULL,
+                                     (char * const *) prog_argv, environ)))
              != 0))
     {
       if (actions_allocated)
@@ -344,9 +553,6 @@
         posix_spawnattr_destroy (&attrs);
       if (slave_process)
         unblock_fatal_signals ();
-      if (exit_on_error || !null_stderr)
-        error (exit_on_error ? EXIT_FAILURE : 0, err,
-               _("%s subprocess failed"), progname);
       if (pipe_stdout)
         {
           close (ifd[0]);
@@ -357,8 +563,9 @@
           close (ofd[0]);
           close (ofd[1]);
         }
-      errno = err;
-      return -1;
+      free (prog_path_to_free);
+      saved_errno = err;
+      goto fail_with_saved_errno;
     }
   posix_spawn_file_actions_destroy (&actions);
   if (attrs_allocated)
@@ -372,6 +579,7 @@
     close (ofd[0]);
   if (pipe_stdout)
     close (ifd[1]);
+  free (prog_path_to_free);
 
   if (pipe_stdout)
     fd[0] = ifd[0];
@@ -380,6 +588,15 @@
   return child;
 
 #endif
+
+ fail_with_errno:
+  saved_errno = errno;
+ fail_with_saved_errno:
+  if (exit_on_error || !null_stderr)
+    error (exit_on_error ? EXIT_FAILURE : 0, saved_errno,
+           _("%s subprocess failed"), progname);
+  errno = saved_errno;
+  return -1;
 }
 
 /* Open a bidirectional pipe.
@@ -392,12 +609,13 @@
  */
 pid_t
 create_pipe_bidi (const char *progname,
-                  const char *prog_path, char **prog_argv,
+                  const char *prog_path, const char * const *prog_argv,
+                  const char *directory,
                   bool null_stderr,
                   bool slave_process, bool exit_on_error,
                   int fd[2])
 {
-  pid_t result = create_pipe (progname, prog_path, prog_argv,
+  pid_t result = create_pipe (progname, prog_path, prog_argv, directory,
                               true, true, NULL, NULL,
                               null_stderr, slave_process, exit_on_error,
                               fd);
@@ -413,13 +631,14 @@
  */
 pid_t
 create_pipe_in (const char *progname,
-                const char *prog_path, char **prog_argv,
+                const char *prog_path, const char * const *prog_argv,
+                const char *directory,
                 const char *prog_stdin, bool null_stderr,
                 bool slave_process, bool exit_on_error,
                 int fd[1])
 {
   int iofd[2];
-  pid_t result = create_pipe (progname, prog_path, prog_argv,
+  pid_t result = create_pipe (progname, prog_path, prog_argv, directory,
                               false, true, prog_stdin, NULL,
                               null_stderr, slave_process, exit_on_error,
                               iofd);
@@ -437,13 +656,14 @@
  */
 pid_t
 create_pipe_out (const char *progname,
-                 const char *prog_path, char **prog_argv,
+                 const char *prog_path, const char * const *prog_argv,
+                 const char *directory,
                  const char *prog_stdout, bool null_stderr,
                  bool slave_process, bool exit_on_error,
                  int fd[1])
 {
   int iofd[2];
-  pid_t result = create_pipe (progname, prog_path, prog_argv,
+  pid_t result = create_pipe (progname, prog_path, prog_argv, directory,
                               true, false, NULL, prog_stdout,
                               null_stderr, slave_process, exit_on_error,
                               iofd);
diff --git a/lib/spawn-pipe.h b/lib/spawn-pipe.h
index 0d70968..e3b6e04 100644
--- a/lib/spawn-pipe.h
+++ b/lib/spawn-pipe.h
@@ -1,5 +1,5 @@
 /* Creation of subprocesses, communicating via pipes.
-   Copyright (C) 2001-2003, 2006, 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2003, 2006, 2008-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <haible@clisp.cons.org>, 2001.
 
    This program is free software: you can redistribute it and/or modify
@@ -42,6 +42,19 @@
    After finishing communication, the caller should call wait_subprocess()
    to get rid of the subprocess in the process table.
 
+   progname is the name of the program to be executed by the subprocess, used
+   for error messages.
+   prog_path is the file name of the program to be executed by the subprocess.
+   If it contains no slashes, a search is conducted in $PATH.  An operating
+   system dependent suffix is added, if necessary.
+   prog_argv is the array of strings that the subprocess shall receive in
+   argv[].  It is a NULL-terminated array.  prog_argv[0] should normally be
+   identical to prog_path.
+
+   If directory is not NULL, the subprocess is started in that directory.  If
+   prog_path is a relative file name, it resolved before changing to that
+   directory.  The current directory of the current process remains unchanged.
+
    If slave_process is true, the child process will be terminated when its
    creator receives a catchable fatal signal or exits normally.  If
    slave_process is false, the child process will continue running in this
@@ -83,7 +96,9 @@
  * signal and the EPIPE error code.
  */
 extern pid_t create_pipe_out (const char *progname,
-                              const char *prog_path, char **prog_argv,
+                              const char *prog_path,
+                              const char * const *prog_argv,
+                              const char *directory,
                               const char *prog_stdout, bool null_stderr,
                               bool slave_process, bool exit_on_error,
                               int fd[1]);
@@ -96,7 +111,9 @@
  *
  */
 extern pid_t create_pipe_in (const char *progname,
-                             const char *prog_path, char **prog_argv,
+                             const char *prog_path,
+                             const char * const *prog_argv,
+                             const char *directory,
                              const char *prog_stdin, bool null_stderr,
                              bool slave_process, bool exit_on_error,
                              int fd[1]);
@@ -124,7 +141,9 @@
  *    input.  But you are currently busy reading from it.
  */
 extern pid_t create_pipe_bidi (const char *progname,
-                               const char *prog_path, char **prog_argv,
+                               const char *prog_path,
+                               const char * const *prog_argv,
+                               const char *directory,
                                bool null_stderr,
                                bool slave_process, bool exit_on_error,
                                int fd[2]);
diff --git a/lib/spawn.c b/lib/spawn.c
new file mode 100644
index 0000000..46f9ca3
--- /dev/null
+++ b/lib/spawn.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 2000, 2009-2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <spawn.h>
+
+#include "spawn_int.h"
+
+/* Spawn a new process executing PATH with the attributes describes in *ATTRP.
+   Before running the process perform the actions described in FILE-ACTIONS. */
+int
+posix_spawn (pid_t *pid, const char *path,
+             const posix_spawn_file_actions_t *file_actions,
+             const posix_spawnattr_t *attrp, char *const argv[],
+             char *const envp[])
+{
+  return __spawni (pid, path, file_actions, attrp,
+                   (const char * const *) argv, (const char * const *) envp, 0);
+}
diff --git a/lib/spawn.in.h b/lib/spawn.in.h
index 09c66f5..7709278 100644
--- a/lib/spawn.in.h
+++ b/lib/spawn.in.h
@@ -1,30 +1,47 @@
 /* Definitions for POSIX spawn interface.
-   Copyright (C) 2000, 2003-2004, 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2003-2004, 2008-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
-#ifndef _@GUARD_PREFIX@_SPAWN_H
-
 #if __GNUC__ >= 3
 @PRAGMA_SYSTEM_HEADER@
 #endif
 @PRAGMA_COLUMNS@
 
+#if defined _GL_ALREADY_INCLUDING_SPAWN_H
+/* Special invocation convention:
+   On OS/2 kLIBC, <spawn.h> includes <signal.h>. Then <signal.h> ->
+   <pthread.h> -> <sched.h> -> <spawn.h> are included by GNULIB.
+   In this situation, struct sched_param is not yet defined.  */
+
+#@INCLUDE_NEXT@ @NEXT_SPAWN_H@
+
+#else
+
+#ifndef _@GUARD_PREFIX@_SPAWN_H
+/* Normal invocation convention.  */
+
 /* The include_next requires a split double-inclusion guard.  */
 #if @HAVE_SPAWN_H@
+
+# define _GL_ALREADY_INCLUDING_SPAWN_H
+
 # @INCLUDE_NEXT@ @NEXT_SPAWN_H@
+
+# define _GL_ALREADY_INCLUDING_SPAWN_H
+
 #endif
 
 #ifndef _@GUARD_PREFIX@_SPAWN_H
@@ -43,28 +60,35 @@
 # define __THROW
 #endif
 
-/* GCC 2.95 and later have "__restrict"; C99 compilers have
+/* For plain 'restrict', use glibc's __restrict if defined.
+   Otherwise, GCC 2.95 and later have "__restrict"; C99 compilers have
    "restrict", and "configure" may have defined "restrict".
    Other compilers use __restrict, __restrict__, and _Restrict, and
    'configure' might #define 'restrict' to those words, so pick a
    different name.  */
 #ifndef _Restrict_
-# if 199901L <= __STDC_VERSION__
-#  define _Restrict_ restrict
-# elif 2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)
+# if defined __restrict \
+     || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+     || __clang_major__ >= 3
 #  define _Restrict_ __restrict
+# elif 199901L <= __STDC_VERSION__ || defined restrict
+#  define _Restrict_ restrict
 # else
 #  define _Restrict_
 # endif
 #endif
-/* gcc 3.1 and up support the [restrict] syntax.  Don't trust
-   sys/cdefs.h's definition of __restrict_arr, though, as it
-   mishandles gcc -ansi -pedantic.  */
+/* For the ISO C99 syntax
+     array_name[restrict]
+   use glibc's __restrict_arr if available.
+   Otherwise, GCC 3.1 and clang support this syntax (but not in C++ mode).
+   Other ISO C99 compilers support it as well.  */
 #ifndef _Restrict_arr_
-# if ((199901L <= __STDC_VERSION__                                      \
-       || ((3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__))     \
-           && !defined __STRICT_ANSI__))                                        \
-      && !defined __GNUG__)
+# ifdef __restrict_arr
+#  define _Restrict_arr_ __restrict_arr
+# elif ((199901L <= __STDC_VERSION__ \
+         || 3 < __GNUC__ + (1 <= __GNUC_MINOR__) \
+         || __clang_major__ >= 3) \
+        && !defined __cplusplus)
 #  define _Restrict_arr_ _Restrict_
 # else
 #  define _Restrict_arr_
@@ -604,7 +628,9 @@
                   (const posix_spawnattr_t *_Restrict_ __attr,
                    int *_Restrict_ __schedpolicy));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (posix_spawnattr_getschedpolicy);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef posix_spawnattr_getschedpolicy
 # if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSCHEDPOLICY
@@ -634,7 +660,9 @@
 _GL_CXXALIAS_SYS (posix_spawnattr_setschedpolicy, int,
                   (posix_spawnattr_t *__attr, int __schedpolicy));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (posix_spawnattr_setschedpolicy);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef posix_spawnattr_setschedpolicy
 # if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSCHEDPOLICY
@@ -668,7 +696,9 @@
                   (const posix_spawnattr_t *_Restrict_ __attr,
                    struct sched_param *_Restrict_ __schedparam));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (posix_spawnattr_getschedparam);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef posix_spawnattr_getschedparam
 # if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSCHEDPARAM
@@ -702,7 +732,9 @@
                   (posix_spawnattr_t *_Restrict_ __attr,
                    const struct sched_param *_Restrict_ __schedparam));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (posix_spawnattr_setschedparam);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef posix_spawnattr_setschedparam
 # if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSCHEDPARAM
@@ -957,3 +989,4 @@
 
 #endif /* _@GUARD_PREFIX@_SPAWN_H */
 #endif /* _@GUARD_PREFIX@_SPAWN_H */
+#endif
diff --git a/lib/spawn_faction_addchdir.c b/lib/spawn_faction_addchdir.c
new file mode 100644
index 0000000..e5848a9
--- /dev/null
+++ b/lib/spawn_faction_addchdir.c
@@ -0,0 +1,70 @@
+/* Copyright (C) 2018-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <spawn.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if REPLACE_POSIX_SPAWN
+# include "spawn_int.h"
+#endif
+
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+   'chdir' to the given directory during the 'spawn' call.  */
+int
+posix_spawn_file_actions_addchdir (posix_spawn_file_actions_t *file_actions,
+                                   const char *path)
+#undef posix_spawn_file_actions_addchdir
+{
+#if !REPLACE_POSIX_SPAWN
+  return posix_spawn_file_actions_addchdir_np (file_actions, path);
+#else
+  {
+    /* Copy PATH, because the caller may free it before calling posix_spawn()
+       or posix_spawnp().  */
+    char *path_copy = strdup (path);
+    if (path_copy == NULL)
+      return ENOMEM;
+
+    /* Allocate more memory if needed.  */
+    if (file_actions->_used == file_actions->_allocated
+        && __posix_spawn_file_actions_realloc (file_actions) != 0)
+      {
+        /* This can only mean we ran out of memory.  */
+        free (path_copy);
+        return ENOMEM;
+      }
+
+    {
+      struct __spawn_action *rec;
+
+      /* Add the new value.  */
+      rec = &file_actions->_actions[file_actions->_used];
+      rec->tag = spawn_do_chdir;
+      rec->action.chdir_action.path = path_copy;
+
+      /* Account for the new entry.  */
+      ++file_actions->_used;
+
+      return 0;
+    }
+  }
+#endif
+}
diff --git a/lib/spawn_faction_addclose.c b/lib/spawn_faction_addclose.c
index 3ad244a..22cb851 100644
--- a/lib/spawn_faction_addclose.c
+++ b/lib/spawn_faction_addclose.c
@@ -1,17 +1,17 @@
-/* Copyright (C) 2000, 2009-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2009-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/spawn_faction_adddup2.c b/lib/spawn_faction_adddup2.c
index cbc97e0..4d63fae 100644
--- a/lib/spawn_faction_adddup2.c
+++ b/lib/spawn_faction_adddup2.c
@@ -1,17 +1,17 @@
-/* Copyright (C) 2000, 2009-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2009-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/spawn_faction_addopen.c b/lib/spawn_faction_addopen.c
index ab4f727..43d20b5 100644
--- a/lib/spawn_faction_addopen.c
+++ b/lib/spawn_faction_addopen.c
@@ -1,17 +1,17 @@
-/* Copyright (C) 2000, 2009-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2009-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/spawn_faction_destroy.c b/lib/spawn_faction_destroy.c
index d7156a0..87e435a 100644
--- a/lib/spawn_faction_destroy.c
+++ b/lib/spawn_faction_destroy.c
@@ -1,17 +1,17 @@
-/* Copyright (C) 2000, 2009-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2009-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
@@ -42,9 +42,11 @@
       switch (sa->tag)
         {
         case spawn_do_open:
-        case spawn_do_chdir:
           free (sa->action.open_action.path);
           break;
+        case spawn_do_chdir:
+          free (sa->action.chdir_action.path);
+          break;
         default:
           /* No cleanup required.  */
           break;
diff --git a/lib/spawn_faction_init.c b/lib/spawn_faction_init.c
index 72e2c73..2635110 100644
--- a/lib/spawn_faction_init.c
+++ b/lib/spawn_faction_init.c
@@ -1,17 +1,17 @@
-/* Copyright (C) 2000, 2009-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2009-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/spawn_int.h b/lib/spawn_int.h
index bcf8bbf..a6b7959 100644
--- a/lib/spawn_int.h
+++ b/lib/spawn_int.h
@@ -1,17 +1,17 @@
-/* Copyright (C) 2000, 2008-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2008-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <sys/types.h>
@@ -68,5 +68,5 @@
 #endif
 extern int __spawni (pid_t *pid, const char *path,
                      const posix_spawn_file_actions_t *file_actions,
-                     const posix_spawnattr_t *attrp, char *const argv[],
-                     char *const envp[], int use_path);
+                     const posix_spawnattr_t *attrp, const char *const argv[],
+                     const char *const envp[], int use_path);
diff --git a/lib/spawnattr_destroy.c b/lib/spawnattr_destroy.c
index 01bd927..f9c9a3c 100644
--- a/lib/spawnattr_destroy.c
+++ b/lib/spawnattr_destroy.c
@@ -1,17 +1,17 @@
-/* Copyright (C) 2000, 2009-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2009-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/spawnattr_init.c b/lib/spawnattr_init.c
index 6fd6ca9..5a03993 100644
--- a/lib/spawnattr_init.c
+++ b/lib/spawnattr_init.c
@@ -1,17 +1,17 @@
-/* Copyright (C) 2000, 2009-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2009-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/spawnattr_setflags.c b/lib/spawnattr_setflags.c
index a8f557c..c46dced 100644
--- a/lib/spawnattr_setflags.c
+++ b/lib/spawnattr_setflags.c
@@ -1,17 +1,17 @@
-/* Copyright (C) 2000, 2004, 2009-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2004, 2009-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/spawnattr_setpgroup.c b/lib/spawnattr_setpgroup.c
new file mode 100644
index 0000000..57a7d54
--- /dev/null
+++ b/lib/spawnattr_setpgroup.c
@@ -0,0 +1,32 @@
+/* Copyright (C) 2000, 2009-2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Store process group ID in the attribute structure.  */
+int
+posix_spawnattr_setpgroup (posix_spawnattr_t *attr, pid_t pgroup)
+{
+  /* Store the process group ID.  */
+  attr->_pgrp = pgroup;
+
+  return 0;
+}
diff --git a/lib/spawnattr_setsigmask.c b/lib/spawnattr_setsigmask.c
index e1713c5..e91e777 100644
--- a/lib/spawnattr_setsigmask.c
+++ b/lib/spawnattr_setsigmask.c
@@ -1,17 +1,17 @@
-/* Copyright (C) 2000, 2009-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2009-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/spawni.c b/lib/spawni.c
index 087f45c..1ae0ddb 100644
--- a/lib/spawni.c
+++ b/lib/spawni.c
@@ -1,18 +1,18 @@
 /* Guts of POSIX spawn interface.  Generic POSIX.1 version.
-   Copyright (C) 2000-2006, 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2000-2006, 2008-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
@@ -75,9 +75,6 @@
 # define sigprocmask __sigprocmask
 # define strchrnul __strchrnul
 # define vfork __vfork
-#else
-# undef internal_function
-# define internal_function /* empty */
 #endif
 
 
@@ -90,56 +87,644 @@
 
 
 #if defined _WIN32 && ! defined __CYGWIN__
-
 /* Native Windows API.  */
-int
-__spawni (pid_t *pid, const char *file,
-          const posix_spawn_file_actions_t *file_actions,
-          const posix_spawnattr_t *attrp, char *const argv[],
-          char *const envp[], int use_path)
+
+/* Get declarations of the native Windows API functions.  */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+# include <stdbool.h>
+# include <stdio.h>
+
+# include "filename.h"
+# include "concat-filename.h"
+# include "findprog.h"
+# include "malloca.h"
+# include "windows-spawn.h"
+
+/* Don't assume that UNICODE is not defined.  */
+# undef CreateFile
+# define CreateFile CreateFileA
+# undef STARTUPINFO
+# define STARTUPINFO STARTUPINFOA
+# undef CreateProcess
+# define CreateProcess CreateProcessA
+
+/* Grows inh_handles->count so that it becomes > newfd.
+   Returns 0 upon success.  In case of failure, -1 is returned, with errno set.
+ */
+static int
+grow_inheritable_handles (struct inheritable_handles *inh_handles, int newfd)
 {
-  /* Not yet implemented.  */
-  return ENOSYS;
+  if (inh_handles->allocated <= newfd)
+    {
+      size_t new_allocated = 2 * inh_handles->allocated + 1;
+      if (new_allocated <= newfd)
+        new_allocated = newfd + 1;
+      HANDLE *new_handles_array =
+        (HANDLE *)
+        realloc (inh_handles->handles, new_allocated * sizeof (HANDLE));
+      if (new_handles_array == NULL)
+        {
+          errno = ENOMEM;
+          return -1;
+        }
+      unsigned char *new_flags_array =
+        (unsigned char *)
+        realloc (inh_handles->flags, new_allocated * sizeof (unsigned char));
+      if (new_flags_array == NULL)
+        {
+          free (new_handles_array);
+          errno = ENOMEM;
+          return -1;
+        }
+      inh_handles->allocated = new_allocated;
+      inh_handles->handles = new_handles_array;
+      inh_handles->flags = new_flags_array;
+    }
+
+  HANDLE *handles = inh_handles->handles;
+
+  for (; inh_handles->count <= newfd; inh_handles->count++)
+    handles[inh_handles->count] = INVALID_HANDLE_VALUE;
+
+  return 0;
+}
+
+/* Reduces inh_handles->count to the minimum needed.  */
+static void
+shrink_inheritable_handles (struct inheritable_handles *inh_handles)
+{
+  HANDLE *handles = inh_handles->handles;
+
+  while (inh_handles->count > 3
+         && handles[inh_handles->count - 1] == INVALID_HANDLE_VALUE)
+    inh_handles->count--;
+}
+
+/* Closes all handles in inh_handles.  */
+static void
+close_inheritable_handles (struct inheritable_handles *inh_handles)
+{
+  HANDLE *handles = inh_handles->handles;
+  size_t handles_count = inh_handles->count;
+  unsigned int fd;
+
+  for (fd = 0; fd < handles_count; fd++)
+    {
+      HANDLE handle = handles[fd];
+
+      if (handle != INVALID_HANDLE_VALUE)
+        CloseHandle (handle);
+    }
+}
+
+/* Tests whether a memory region, starting at P and N bytes long, contains only
+   zeroes.  */
+static bool
+memiszero (const void *p, size_t n)
+{
+  const char *cp = p;
+  for (; n > 0; cp++, n--)
+    if (*cp != 0)
+      return 0;
+  return 1;
+}
+
+/* Tests whether *S contains no signals.  */
+static bool
+sigisempty (const sigset_t *s)
+{
+  return memiszero (s, sizeof (sigset_t));
+}
+
+/* Opens a HANDLE to a file.
+   Upon failure, returns INVALID_HANDLE_VALUE with errno set.  */
+static HANDLE
+open_handle (const char *name, int flags, mode_t mode)
+{
+  /* To ease portability.  Like in open.c.  */
+  if (strcmp (name, "/dev/null") == 0)
+    name = "NUL";
+
+  /* POSIX <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13>
+     specifies: "More than two leading <slash> characters shall be treated as
+     a single <slash> character."  */
+  if (ISSLASH (name[0]) && ISSLASH (name[1]) && ISSLASH (name[2]))
+    {
+      name += 2;
+      while (ISSLASH (name[1]))
+        name++;
+    }
+
+  size_t len = strlen (name);
+  size_t drive_prefix_len = (HAS_DEVICE (name) ? 2 : 0);
+
+  /* Remove trailing slashes (except the very first one, at position
+     drive_prefix_len), but remember their presence.  */
+  size_t rlen;
+  bool check_dir = false;
+
+  rlen = len;
+  while (rlen > drive_prefix_len && ISSLASH (name[rlen-1]))
+    {
+      check_dir = true;
+      if (rlen == drive_prefix_len + 1)
+        break;
+      rlen--;
+    }
+
+  /* Handle '' and 'C:'.  */
+  if (!check_dir && rlen == drive_prefix_len)
+    {
+      errno = ENOENT;
+      return INVALID_HANDLE_VALUE;
+    }
+
+  /* Handle '\\'.  */
+  if (rlen == 1 && ISSLASH (name[0]) && len >= 2)
+    {
+      errno = ENOENT;
+      return INVALID_HANDLE_VALUE;
+    }
+
+  const char *rname;
+  char *malloca_rname;
+  if (rlen == len)
+    {
+      rname = name;
+      malloca_rname = NULL;
+    }
+  else
+    {
+      malloca_rname = malloca (rlen + 1);
+      if (malloca_rname == NULL)
+        {
+          errno = ENOMEM;
+          return INVALID_HANDLE_VALUE;
+        }
+      memcpy (malloca_rname, name, rlen);
+      malloca_rname[rlen] = '\0';
+      rname = malloca_rname;
+    }
+
+  /* For the meaning of the flags, see
+     <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/open-wopen>  */
+  /* Open a handle to the file.
+     CreateFile
+     <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea>
+     <https://docs.microsoft.com/en-us/windows/desktop/FileIO/creating-and-opening-files>  */
+  HANDLE handle =
+    CreateFile (rname,
+                ((flags & (O_WRONLY | O_RDWR)) != 0
+                 ? GENERIC_READ | GENERIC_WRITE
+                 : GENERIC_READ),
+                FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+                NULL,
+                ((flags & O_CREAT) != 0
+                 ? ((flags & O_EXCL) != 0
+                    ? CREATE_NEW
+                    : ((flags & O_TRUNC) != 0 ? CREATE_ALWAYS : OPEN_ALWAYS))
+                 : ((flags & O_TRUNC) != 0
+                    ? TRUNCATE_EXISTING
+                    : OPEN_EXISTING)),
+                /* FILE_FLAG_BACKUP_SEMANTICS is useful for opening directories,
+                   which is out-of-scope here.  */
+                /* FILE_FLAG_POSIX_SEMANTICS (treat file names that differ only
+                   in case as different) makes sense only when applied to *all*
+                   filesystem operations.  */
+                /* FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_POSIX_SEMANTICS */
+                FILE_ATTRIBUTE_NORMAL
+                | ((flags & O_TEMPORARY) != 0 ? FILE_FLAG_DELETE_ON_CLOSE : 0)
+                | ((flags & O_SEQUENTIAL ) != 0 ? FILE_FLAG_SEQUENTIAL_SCAN : 0)
+                | ((flags & O_RANDOM) != 0 ? FILE_FLAG_RANDOM_ACCESS : 0),
+                NULL);
+  if (handle == INVALID_HANDLE_VALUE)
+    switch (GetLastError ())
+      {
+      /* Some of these errors probably cannot happen with the specific flags
+         that we pass to CreateFile.  But who knows...  */
+      case ERROR_FILE_NOT_FOUND: /* The last component of rname does not exist.  */
+      case ERROR_PATH_NOT_FOUND: /* Some directory component in rname does not exist.  */
+      case ERROR_BAD_PATHNAME:   /* rname is such as '\\server'.  */
+      case ERROR_BAD_NETPATH:    /* rname is such as '\\nonexistentserver\share'.  */
+      case ERROR_BAD_NET_NAME:   /* rname is such as '\\server\nonexistentshare'.  */
+      case ERROR_INVALID_NAME:   /* rname contains wildcards, misplaced colon, etc.  */
+      case ERROR_DIRECTORY:
+        errno = ENOENT;
+        break;
+
+      case ERROR_ACCESS_DENIED:  /* rname is such as 'C:\System Volume Information\foo'.  */
+      case ERROR_SHARING_VIOLATION: /* rname is such as 'C:\pagefile.sys'.  */
+                                    /* XXX map to EACCES or EPERM? */
+        errno = EACCES;
+        break;
+
+      case ERROR_OUTOFMEMORY:
+        errno = ENOMEM;
+        break;
+
+      case ERROR_WRITE_PROTECT:
+        errno = EROFS;
+        break;
+
+      case ERROR_WRITE_FAULT:
+      case ERROR_READ_FAULT:
+      case ERROR_GEN_FAILURE:
+        errno = EIO;
+        break;
+
+      case ERROR_BUFFER_OVERFLOW:
+      case ERROR_FILENAME_EXCED_RANGE:
+        errno = ENAMETOOLONG;
+        break;
+
+      case ERROR_DELETE_PENDING: /* XXX map to EACCES or EPERM? */
+        errno = EPERM;
+        break;
+
+      default:
+        errno = EINVAL;
+        break;
+      }
+
+  if (malloca_rname != NULL)
+    {
+      int saved_errno = errno;
+      freea (malloca_rname);
+      errno = saved_errno;
+    }
+  return handle;
+}
+
+/* Executes an 'open' action.
+   Returns 0 upon success.  In case of failure, -1 is returned, with errno set.
+ */
+static int
+do_open (struct inheritable_handles *inh_handles, int newfd,
+         const char *filename, const char *directory,
+         int flags, mode_t mode, HANDLE curr_process)
+{
+  if (!(newfd >= 0 && newfd < _getmaxstdio ()))
+    {
+      errno = EBADF;
+      return -1;
+    }
+  if (grow_inheritable_handles (inh_handles, newfd) < 0)
+    return -1;
+  if (inh_handles->handles[newfd] != INVALID_HANDLE_VALUE
+      && !CloseHandle (inh_handles->handles[newfd]))
+    {
+      errno = EIO;
+      return -1;
+    }
+  if (filename == NULL)
+    {
+      errno = EINVAL;
+      return -1;
+    }
+  char *filename_to_free = NULL;
+  if (directory != NULL && IS_RELATIVE_FILE_NAME (filename))
+    {
+      char *real_filename = concatenated_filename (directory, filename, NULL);
+      if (real_filename == NULL)
+        {
+          errno = ENOMEM;
+          return -1;
+        }
+      filename = real_filename;
+      filename_to_free = real_filename;
+    }
+  HANDLE handle = open_handle (filename, flags, mode);
+  if (handle == INVALID_HANDLE_VALUE)
+    {
+      free (filename_to_free);
+      return -1;
+    }
+  free (filename_to_free);
+  /* Duplicate the handle, so that it becomes inheritable.  */
+  if (!DuplicateHandle (curr_process, handle,
+                        curr_process, &inh_handles->handles[newfd],
+                        0, TRUE,
+                        DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))
+    {
+      errno = EBADF; /* arbitrary */
+      return -1;
+    }
+  inh_handles->flags[newfd] = ((flags & O_APPEND) != 0 ? 32 : 0);
+  return 0;
+}
+
+/* Executes a 'dup2' action.
+   Returns 0 upon success.  In case of failure, -1 is returned, with errno set.
+ */
+static int
+do_dup2 (struct inheritable_handles *inh_handles, int oldfd, int newfd,
+         HANDLE curr_process)
+{
+  if (!(oldfd >= 0 && oldfd < inh_handles->count
+        && inh_handles->handles[oldfd] != INVALID_HANDLE_VALUE))
+    {
+      errno = EBADF;
+      return -1;
+    }
+  if (!(newfd >= 0 && newfd < _getmaxstdio ()))
+    {
+      errno = EBADF;
+      return -1;
+    }
+  if (newfd != oldfd)
+    {
+      if (grow_inheritable_handles (inh_handles, newfd) < 0)
+        return -1;
+      if (inh_handles->handles[newfd] != INVALID_HANDLE_VALUE
+          && !CloseHandle (inh_handles->handles[newfd]))
+        {
+          errno = EIO;
+          return -1;
+        }
+      /* Duplicate the handle, so that it a forthcoming do_close action on oldfd
+         has no effect on newfd.  */
+      if (!DuplicateHandle (curr_process, inh_handles->handles[oldfd],
+                            curr_process, &inh_handles->handles[newfd],
+                            0, TRUE, DUPLICATE_SAME_ACCESS))
+        {
+          errno = EBADF; /* arbitrary */
+          return -1;
+        }
+      inh_handles->flags[newfd] = 0;
+    }
+  return 0;
+}
+
+/* Executes a 'close' action.
+   Returns 0 upon success.  In case of failure, -1 is returned, with errno set.
+ */
+static int
+do_close (struct inheritable_handles *inh_handles, int fd)
+{
+  if (!(fd >= 0 && fd < inh_handles->count
+        && inh_handles->handles[fd] != INVALID_HANDLE_VALUE))
+    {
+      errno = EBADF;
+      return -1;
+    }
+  if (!CloseHandle (inh_handles->handles[fd]))
+    {
+      errno = EIO;
+      return -1;
+    }
+  inh_handles->handles[fd] = INVALID_HANDLE_VALUE;
+  return 0;
+}
+
+int
+__spawni (pid_t *pid, const char *prog_filename,
+          const posix_spawn_file_actions_t *file_actions,
+          const posix_spawnattr_t *attrp, const char *const prog_argv[],
+          const char *const envp[], int use_path)
+{
+  /* Validate the arguments.  */
+  if (prog_filename == NULL
+      || (attrp != NULL
+          && ((attrp->_flags & ~POSIX_SPAWN_SETPGROUP) != 0
+              || attrp->_pgrp != 0
+              || ! sigisempty (&attrp->_sd)
+              || ! sigisempty (&attrp->_ss)
+              || attrp->_sp.sched_priority != 0
+              || attrp->_policy != 0)))
+    return EINVAL;
+
+  /* Process group handling:
+     Native Windows does not have the concept of process group, but it has the
+     concept of a console attached to a process.
+     So, we interpret the three cases as follows:
+       - Flag POSIX_SPAWN_SETPGROUP not set: Means, the child process is in the
+         same process group as the parent process.  We interpret this as a
+         request to reuse the same console.
+       - Flag POSIX_SPAWN_SETPGROUP set with attrp->_pgrp == 0: Means the child
+         process starts a process group of its own.  See
+         <https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_getpgroup.html>
+         <https://pubs.opengroup.org/onlinepubs/9699919799/functions/setpgrp.html>
+         We interpret this as a request to detach from the current console.
+       - Flag POSIX_SPAWN_SETPGROUP set with attrp->_pgrp != 0: Means the child
+         process joins another, existing process group.  See
+         <https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_getpgroup.html>
+         <https://pubs.opengroup.org/onlinepubs/9699919799/functions/setpgid.html>
+         We don't support this case; it produces error EINVAL above.  */
+  /* <https://docs.microsoft.com/en-us/windows/win32/procthread/process-creation-flags>  */
+  DWORD process_creation_flags =
+    (attrp != NULL && (attrp->_flags & POSIX_SPAWN_SETPGROUP) != 0 ? DETACHED_PROCESS : 0);
+
+  char *argv_mem_to_free;
+  const char **argv = prepare_spawn (prog_argv, &argv_mem_to_free);
+  if (argv == NULL)
+    return errno; /* errno is set here */
+  argv++;
+
+  /* Compose the command.  */
+  char *command = compose_command (argv);
+  if (command == NULL)
+    {
+      free (argv_mem_to_free);
+      return ENOMEM;
+    }
+
+  /* Copy *ENVP into a contiguous block of memory.  */
+  char *envblock;
+  if (envp == NULL)
+    envblock = NULL;
+  else
+    {
+      envblock = compose_envblock (envp);
+      if (envblock == NULL)
+        {
+          free (command);
+          free (argv_mem_to_free);
+          return ENOMEM;
+        }
+    }
+
+  /* Set up the array of handles to inherit.
+     Duplicate each handle, so that a spawn_do_close action (below) has no
+     effect on the file descriptors of the current process.  Alternatively,
+     we could store, for each handle, a bit that tells whether it is shared
+     with the current process.  But this is simpler.  */
+  struct inheritable_handles inh_handles;
+  if (init_inheritable_handles (&inh_handles, true) < 0)
+    goto failed_1;
+
+  /* Directory in which to execute the new process.  */
+  const char *directory = NULL;
+
+  /* Execute the file_actions, modifying the inh_handles instead of the
+     file descriptors of the current process.  */
+  if (file_actions != NULL)
+    {
+      HANDLE curr_process = GetCurrentProcess ();
+      int cnt;
+
+      for (cnt = 0; cnt < file_actions->_used; ++cnt)
+        {
+          struct __spawn_action *action = &file_actions->_actions[cnt];
+
+          switch (action->tag)
+            {
+            case spawn_do_close:
+              {
+                int fd = action->action.close_action.fd;
+                if (do_close (&inh_handles, fd) < 0)
+                  goto failed_2;
+              }
+              break;
+
+            case spawn_do_open:
+              {
+                int newfd = action->action.open_action.fd;
+                const char *filename = action->action.open_action.path;
+                int flags = action->action.open_action.oflag;
+                mode_t mode = action->action.open_action.mode;
+                if (do_open (&inh_handles, newfd, filename, directory,
+                             flags, mode, curr_process)
+                    < 0)
+                  goto failed_2;
+              }
+              break;
+
+            case spawn_do_dup2:
+              {
+                int oldfd = action->action.dup2_action.fd;
+                int newfd = action->action.dup2_action.newfd;
+                if (do_dup2 (&inh_handles, oldfd, newfd, curr_process) < 0)
+                  goto failed_2;
+              }
+              break;
+
+            case spawn_do_chdir:
+              {
+                char *newdir = action->action.chdir_action.path;
+                if (directory != NULL && IS_RELATIVE_FILE_NAME (newdir))
+                  {
+                    newdir = concatenated_filename (directory, newdir, NULL);
+                    if (newdir == NULL)
+                      {
+                        errno = ENOMEM;
+                        goto failed_2;
+                      }
+                  }
+                directory = newdir;
+              }
+              break;
+
+            case spawn_do_fchdir:
+              /* Not supported in this implementation.  */
+              errno = EINVAL;
+              goto failed_2;
+            }
+        }
+    }
+
+  /* Reduce inh_handles.count to the minimum needed.  */
+  shrink_inheritable_handles (&inh_handles);
+
+  /* CreateProcess
+     <https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa>  */
+  /* STARTUPINFO
+     <https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-startupinfoa>  */
+  STARTUPINFO sinfo;
+  sinfo.cb = sizeof (STARTUPINFO);
+  sinfo.lpReserved = NULL;
+  sinfo.lpDesktop = NULL;
+  sinfo.lpTitle = NULL;
+  if (compose_handles_block (&inh_handles, &sinfo) < 0)
+    goto failed_2;
+
+  /* Perform the PATH search now, considering the final DIRECTORY.  */
+  char *resolved_prog_filename_to_free = NULL;
+  {
+    const char *resolved_prog_filename =
+      find_in_given_path (prog_filename, use_path ? getenv ("PATH") : "",
+                          directory, false);
+    if (resolved_prog_filename == NULL)
+      goto failed_3;
+    if (resolved_prog_filename != prog_filename)
+      resolved_prog_filename_to_free = (char *) resolved_prog_filename;
+    prog_filename = resolved_prog_filename;
+  }
+
+  PROCESS_INFORMATION pinfo;
+  if (!CreateProcess (prog_filename, command, NULL, NULL, TRUE,
+                      process_creation_flags, envblock, directory, &sinfo,
+                      &pinfo))
+    {
+      DWORD error = GetLastError ();
+
+      free (resolved_prog_filename_to_free);
+      free (sinfo.lpReserved2);
+      close_inheritable_handles (&inh_handles);
+      free_inheritable_handles (&inh_handles);
+      free (envblock);
+      free (command);
+      free (argv_mem_to_free);
+
+      return convert_CreateProcess_error (error);
+    }
+
+  if (pinfo.hThread)
+    CloseHandle (pinfo.hThread);
+
+  free (resolved_prog_filename_to_free);
+  free (sinfo.lpReserved2);
+  close_inheritable_handles (&inh_handles);
+  free_inheritable_handles (&inh_handles);
+  free (envblock);
+  free (command);
+  free (argv_mem_to_free);
+
+  if (pid != NULL)
+    *pid = (intptr_t) pinfo.hProcess;
+  return 0;
+
+ failed_3:
+  {
+    int saved_errno = errno;
+    free (sinfo.lpReserved2);
+    close_inheritable_handles (&inh_handles);
+    free_inheritable_handles (&inh_handles);
+    free (envblock);
+    free (command);
+    free (argv_mem_to_free);
+    return saved_errno;
+  }
+
+ failed_2:
+  {
+    int saved_errno = errno;
+    close_inheritable_handles (&inh_handles);
+    free_inheritable_handles (&inh_handles);
+    free (envblock);
+    free (command);
+    free (argv_mem_to_free);
+    return saved_errno;
+  }
+
+ failed_1:
+  free (envblock);
+  free (command);
+  free (argv_mem_to_free);
+  return errno;
 }
 
 #else
 
 
-/* The file is accessible but it is not an executable file.  Invoke
-   the shell to interpret it as a script.  */
-static void
-internal_function
-script_execute (const char *file, char *const argv[], char *const envp[])
-{
-  /* Count the arguments.  */
-  int argc = 0;
-  while (argv[argc++])
-    ;
-
-  /* Construct an argument list for the shell.  */
-  {
-    char **new_argv = (char **) alloca ((argc + 1) * sizeof (char *));
-    new_argv[0] = (char *) _PATH_BSHELL;
-    new_argv[1] = (char *) file;
-    while (argc > 1)
-      {
-        new_argv[argc] = argv[argc - 1];
-        --argc;
-      }
-
-    /* Execute the shell.  */
-    execve (new_argv[0], new_argv, envp);
-  }
-}
-
-
 /* Spawn a new process executing PATH with the attributes describes in *ATTRP.
    Before running the process perform the actions described in FILE-ACTIONS. */
 int
 __spawni (pid_t *pid, const char *file,
           const posix_spawn_file_actions_t *file_actions,
-          const posix_spawnattr_t *attrp, char *const argv[],
-          char *const envp[], int use_path)
+          const posix_spawnattr_t *attrp, const char *const argv[],
+          const char *const envp[], int use_path)
 {
   pid_t new_pid;
   char *path, *p, *name;
@@ -303,10 +888,7 @@
   if (! use_path || strchr (file, '/') != NULL)
     {
       /* The FILE parameter is actually a path.  */
-      execve (file, argv, envp);
-
-      if (errno == ENOEXEC)
-        script_execute (file, argv, envp);
+      execve (file, (char * const *) argv, (char * const *) envp);
 
       /* Oh, oh.  'execve' returns.  This is bad.  */
       _exit (SPAWN_ERROR);
@@ -354,10 +936,7 @@
         startp = (char *) memcpy (name - (p - path), path, p - path);
 
       /* Try to execute this name.  If it works, execv will not return.  */
-      execve (startp, argv, envp);
-
-      if (errno == ENOEXEC)
-        script_execute (startp, argv, envp);
+      execve (startp, (char * const *) argv, (char * const *) envp);
 
       switch (errno)
         {
diff --git a/lib/spawnp.c b/lib/spawnp.c
index 0f15069..df39eff 100644
--- a/lib/spawnp.c
+++ b/lib/spawnp.c
@@ -1,17 +1,17 @@
-/* Copyright (C) 2000, 2009-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2009-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
@@ -29,5 +29,6 @@
               const posix_spawnattr_t *attrp, char *const argv[],
               char *const envp[])
 {
-  return __spawni (pid, file, file_actions, attrp, argv, envp, 1);
+  return __spawni (pid, file, file_actions, attrp,
+                   (const char * const *) argv, (const char * const *) envp, 1);
 }
diff --git a/lib/sprintf.c b/lib/sprintf.c
index 6f49cdd..f559cfe 100644
--- a/lib/sprintf.c
+++ b/lib/sprintf.c
@@ -1,17 +1,17 @@
 /* Formatted output to strings.
-   Copyright (C) 2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if 1
diff --git a/lib/stat-time.c b/lib/stat-time.c
index 81b83dd..7b92792 100644
--- a/lib/stat-time.c
+++ b/lib/stat-time.c
@@ -1,3 +1,21 @@
+/* stat-related time functions.
+
+   Copyright (C) 2012-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #include <config.h>
+
 #define _GL_STAT_TIME_INLINE _GL_EXTERN_INLINE
 #include "stat-time.h"
diff --git a/lib/stat-time.h b/lib/stat-time.h
index 38a1f55..6b2cc68 100644
--- a/lib/stat-time.h
+++ b/lib/stat-time.h
@@ -1,18 +1,18 @@
 /* stat-related time functions.
 
-   Copyright (C) 2005, 2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Paul Eggert.  */
@@ -102,7 +102,7 @@
 
 /* Return the nanosecond component of *ST's birth time.  */
 _GL_STAT_TIME_INLINE long int _GL_ATTRIBUTE_PURE
-get_stat_birthtime_ns (struct stat const *st _GL_UNUSED)
+get_stat_birthtime_ns (_GL_UNUSED struct stat const *st)
 {
 # if defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC
   return STAT_TIMESPEC (st, st_birthtim).tv_nsec;
@@ -158,7 +158,7 @@
 /* Return *ST's birth time, if available; otherwise return a value
    with tv_sec and tv_nsec both equal to -1.  */
 _GL_STAT_TIME_INLINE struct timespec _GL_ATTRIBUTE_PURE
-get_stat_birthtime (struct stat const *st _GL_UNUSED)
+get_stat_birthtime (_GL_UNUSED struct stat const *st)
 {
   struct timespec t;
 
@@ -208,7 +208,7 @@
    errno to EOVERFLOW if normalization overflowed.  This function
    is intended to be private to this .h file.  */
 _GL_STAT_TIME_INLINE int
-stat_time_normalize (int result, struct stat *st _GL_UNUSED)
+stat_time_normalize (int result, _GL_UNUSED struct stat *st)
 {
 #if defined __sun && defined STAT_TIMESPEC
   if (result == 0)
diff --git a/lib/stat-w32.c b/lib/stat-w32.c
index 60fe5f6..4164199 100644
--- a/lib/stat-w32.c
+++ b/lib/stat-w32.c
@@ -1,17 +1,17 @@
 /* Core of implementation of fstat and stat for native Windows.
-   Copyright (C) 2017-2019 Free Software Foundation, Inc.
+   Copyright (C) 2017-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible.  */
@@ -20,9 +20,23 @@
 
 #if defined _WIN32 && ! defined __CYGWIN__
 
-/* Ensure that <windows.h> defines FILE_ID_INFO.  */
-#undef _WIN32_WINNT
-#define _WIN32_WINNT _WIN32_WINNT_WIN8
+/* Attempt to make <windows.h> define FILE_ID_INFO.
+   But ensure that the redefinition of _WIN32_WINNT does not make us assume
+   Windows Vista or newer when building for an older version of Windows.  */
+#if HAVE_SDKDDKVER_H
+# include <sdkddkver.h>
+# if _WIN32_WINNT >= _WIN32_WINNT_VISTA
+#  define WIN32_ASSUME_VISTA 1
+# else
+#  define WIN32_ASSUME_VISTA 0
+# endif
+# if !defined _WIN32_WINNT || (_WIN32_WINNT < _WIN32_WINNT_WIN8)
+#  undef _WIN32_WINNT
+#  define _WIN32_WINNT _WIN32_WINNT_WIN8
+# endif
+#else
+# define WIN32_ASSUME_VISTA (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
+#endif
 
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -38,21 +52,34 @@
 #include "pathmax.h"
 #include "verify.h"
 
-/* Avoid warnings from gcc -Wcast-function-type.  */
-#define GetProcAddress \
-  (void *) GetProcAddress
+/* Don't assume that UNICODE is not defined.  */
+#undef LoadLibrary
+#define LoadLibrary LoadLibraryA
+#undef GetFinalPathNameByHandle
+#define GetFinalPathNameByHandle GetFinalPathNameByHandleA
 
-#if _GL_WINDOWS_STAT_INODES == 2
+/* Older mingw headers do not define VOLUME_NAME_NONE.  */
+#ifndef VOLUME_NAME_NONE
+# define VOLUME_NAME_NONE 4
+#endif
+
+#if !WIN32_ASSUME_VISTA
+
+/* Avoid warnings from gcc -Wcast-function-type.  */
+# define GetProcAddress \
+   (void *) GetProcAddress
+
+# if _GL_WINDOWS_STAT_INODES == 2
 /* GetFileInformationByHandleEx was introduced only in Windows Vista.  */
 typedef DWORD (WINAPI * GetFileInformationByHandleExFuncType) (HANDLE hFile,
                                                                FILE_INFO_BY_HANDLE_CLASS fiClass,
                                                                LPVOID lpBuffer,
                                                                DWORD dwBufferSize);
 static GetFileInformationByHandleExFuncType GetFileInformationByHandleExFunc = NULL;
-#endif
+# endif
 /* GetFinalPathNameByHandle was introduced only in Windows Vista.  */
 typedef DWORD (WINAPI * GetFinalPathNameByHandleFuncType) (HANDLE hFile,
-                                                           LPTSTR lpFilePath,
+                                                           LPSTR lpFilePath,
                                                            DWORD lenFilePath,
                                                            DWORD dwFlags);
 static GetFinalPathNameByHandleFuncType GetFinalPathNameByHandleFunc = NULL;
@@ -64,16 +91,23 @@
   HMODULE kernel32 = LoadLibrary ("kernel32.dll");
   if (kernel32 != NULL)
     {
-#if _GL_WINDOWS_STAT_INODES == 2
+# if _GL_WINDOWS_STAT_INODES == 2
       GetFileInformationByHandleExFunc =
         (GetFileInformationByHandleExFuncType) GetProcAddress (kernel32, "GetFileInformationByHandleEx");
-#endif
+# endif
       GetFinalPathNameByHandleFunc =
         (GetFinalPathNameByHandleFuncType) GetProcAddress (kernel32, "GetFinalPathNameByHandleA");
     }
   initialized = TRUE;
 }
 
+#else
+
+# define GetFileInformationByHandleExFunc GetFileInformationByHandleEx
+# define GetFinalPathNameByHandleFunc GetFinalPathNameByHandle
+
+#endif
+
 /* Converts a FILETIME to GMT time since 1970-01-01 00:00:00.  */
 #if _GL_WINDOWS_STAT_TIMESPEC
 struct timespec
@@ -132,8 +166,10 @@
   DWORD type = GetFileType (h);
   if (type == FILE_TYPE_DISK)
     {
+#if !WIN32_ASSUME_VISTA
       if (!initialized)
         initialize ();
+#endif
 
       /* st_mode can be determined through
          GetFileAttributesEx
diff --git a/lib/stat-w32.h b/lib/stat-w32.h
index 6b961d7..5b56c09 100644
--- a/lib/stat-w32.h
+++ b/lib/stat-w32.h
@@ -1,17 +1,17 @@
 /* Core of implementation of fstat and stat for native Windows.
-   Copyright (C) 2017-2019 Free Software Foundation, Inc.
+   Copyright (C) 2017-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _STAT_W32_H
diff --git a/lib/stat.c b/lib/stat.c
index e3248a8..bc9a767 100644
--- a/lib/stat.c
+++ b/lib/stat.c
@@ -1,17 +1,17 @@
 /* Work around platform bugs in stat.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Eric Blake and Bruno Haible.  */
@@ -65,6 +65,13 @@
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
 # include "stat-w32.h"
+/* Don't assume that UNICODE is not defined.  */
+# undef WIN32_FIND_DATA
+# define WIN32_FIND_DATA WIN32_FIND_DATAA
+# undef CreateFile
+# define CreateFile CreateFileA
+# undef FindFirstFile
+# define FindFirstFile FindFirstFileA
 #endif
 
 #ifdef WINDOWS_NATIVE
diff --git a/lib/stdalign.in.h b/lib/stdalign.in.h
new file mode 100644
index 0000000..592d58e
--- /dev/null
+++ b/lib/stdalign.in.h
@@ -0,0 +1,127 @@
+/* A substitute for ISO C11 <stdalign.h>.
+
+   Copyright 2011-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Paul Eggert and Bruno Haible.  */
+
+#ifndef _GL_STDALIGN_H
+#define _GL_STDALIGN_H
+
+/* ISO C11 <stdalign.h> for platforms that lack it.
+
+   References:
+   ISO C11 (latest free draft
+   <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf>)
+   sections 6.5.3.4, 6.7.5, 7.15.
+   C++11 (latest free draft
+   <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf>)
+   section 18.10. */
+
+/* alignof (TYPE), also known as _Alignof (TYPE), yields the alignment
+   requirement of a structure member (i.e., slot or field) that is of
+   type TYPE, as an integer constant expression.
+
+   This differs from GCC's and clang's __alignof__ operator, which can
+   yield a better-performing alignment for an object of that type.  For
+   example, on x86 with GCC and on Linux/x86 with clang,
+   __alignof__ (double) and __alignof__ (long long) are 8, whereas
+   alignof (double) and alignof (long long) are 4 unless the option
+   '-malign-double' is used.
+
+   The result cannot be used as a value for an 'enum' constant, if you
+   want to be portable to HP-UX 10.20 cc and AIX 3.2.5 xlc.
+
+   Include <stddef.h> for offsetof.  */
+#include <stddef.h>
+
+/* FreeBSD 9.1 <sys/cdefs.h>, included by <stddef.h> and lots of other
+   standard headers, defines conflicting implementations of _Alignas
+   and _Alignof that are no better than ours; override them.  */
+#undef _Alignas
+#undef _Alignof
+
+/* GCC releases before GCC 4.9 had a bug in _Alignof.  See GCC bug 52023
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023>.
+   clang versions < 8.0.0 have the same bug.  */
+#if (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112 \
+     || (defined __GNUC__ && __GNUC__ < 4 + (__GNUC_MINOR__ < 9) \
+         && !defined __clang__) \
+     || (defined __clang__ && __clang_major__ < 8))
+# ifdef __cplusplus
+#  if 201103 <= __cplusplus
+#   define _Alignof(type) alignof (type)
+#  else
+   template <class __t> struct __alignof_helper { char __a; __t __b; };
+#   define _Alignof(type) offsetof (__alignof_helper<type>, __b)
+#  endif
+# else
+#  define _Alignof(type) offsetof (struct { char __a; type __b; }, __b)
+# endif
+#endif
+#if ! (defined __cplusplus && 201103 <= __cplusplus)
+# define alignof _Alignof
+#endif
+#define __alignof_is_defined 1
+
+/* alignas (A), also known as _Alignas (A), aligns a variable or type
+   to the alignment A, where A is an integer constant expression.  For
+   example:
+
+      int alignas (8) foo;
+      struct s { int a; int alignas (8) bar; };
+
+   aligns the address of FOO and the offset of BAR to be multiples of 8.
+
+   A should be a power of two that is at least the type's alignment
+   and at most the implementation's alignment limit.  This limit is
+   2**28 on typical GNUish hosts, and 2**13 on MSVC.  To be portable
+   to MSVC through at least version 10.0, A should be an integer
+   constant, as MSVC does not support expressions such as 1 << 3.
+   To be portable to Sun C 5.11, do not align auto variables to
+   anything stricter than their default alignment.
+
+   The following C11 requirements are not supported here:
+
+     - If A is zero, alignas has no effect.
+     - alignas can be used multiple times; the strictest one wins.
+     - alignas (TYPE) is equivalent to alignas (alignof (TYPE)).
+
+   */
+
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112
+# if defined __cplusplus && 201103 <= __cplusplus
+#  define _Alignas(a) alignas (a)
+# elif (!defined __attribute__ \
+        && ((defined __APPLE__ && defined __MACH__ \
+             ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__) \
+             : __GNUC__ && !defined __ibmxl__) \
+            || (4 <= __clang_major__) \
+            || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \
+            || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__))
+#  define _Alignas(a) __attribute__ ((__aligned__ (a)))
+# elif 1300 <= _MSC_VER
+#  define _Alignas(a) __declspec (align (a))
+# endif
+#endif
+#if ((defined _Alignas && ! (defined __cplusplus && 201103 <= __cplusplus)) \
+     || (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__))
+# define alignas _Alignas
+#endif
+#if defined alignas || (defined __cplusplus && 201103 <= __cplusplus)
+# define __alignas_is_defined 1
+#endif
+
+#endif /* _GL_STDALIGN_H */
diff --git a/lib/stdbool.in.h b/lib/stdbool.in.h
index 8158b00..2a1992d 100644
--- a/lib/stdbool.in.h
+++ b/lib/stdbool.in.h
@@ -1,18 +1,18 @@
-/* Copyright (C) 2001-2003, 2006-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2001-2003, 2006-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <haible@clisp.cons.org>, 2001.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_STDBOOL_H
 #define _GL_STDBOOL_H
diff --git a/lib/stddef.in.h b/lib/stddef.in.h
index 945f192..42290d4 100644
--- a/lib/stddef.in.h
+++ b/lib/stddef.in.h
@@ -1,19 +1,19 @@
 /* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues.
 
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Eric Blake.  */
 
@@ -42,6 +42,13 @@
 #   define _GL_STDDEF_WINT_T
 #  endif
 #  @INCLUDE_NEXT@ @NEXT_STDDEF_H@
+   /* On TinyCC, make sure that the macros that indicate the special invocation
+      convention get undefined.  */
+#  undef __need_wchar_t
+#  undef __need_size_t
+#  undef __need_ptrdiff_t
+#  undef __need_NULL
+#  undef __need_wint_t
 # endif
 
 #else
@@ -49,6 +56,23 @@
 
 # ifndef _@GUARD_PREFIX@_STDDEF_H
 
+/* On AIX 7.2, with xlc in 64-bit mode, <stddef.h> defines max_align_t to a
+   type with alignment 4, but 'long' has alignment 8.  */
+#  if defined _AIX && defined __LP64__
+#   if !GNULIB_defined_max_align_t
+#    ifdef _MAX_ALIGN_T
+/* /usr/include/stddef.h has already defined max_align_t.  Override it.  */
+typedef long rpl_max_align_t;
+#     define max_align_t rpl_max_align_t
+#    else
+/* Prevent /usr/include/stddef.h from defining max_align_t.  */
+typedef long max_align_t;
+#     define _MAX_ALIGN_T
+#    endif
+#    define GNULIB_defined_max_align_t 1
+#   endif
+#  endif
+
 /* The include_next requires a split double-inclusion guard.  */
 
 #  @INCLUDE_NEXT@ @NEXT_STDDEF_H@
@@ -83,20 +107,28 @@
 
 /* Some platforms lack max_align_t.  The check for _GCC_MAX_ALIGN_T is
    a hack in case the configure-time test was done with g++ even though
-   we are currently compiling with gcc.  */
-#if ! (@HAVE_MAX_ALIGN_T@ || defined _GCC_MAX_ALIGN_T)
-# if !GNULIB_defined_max_align_t
+   we are currently compiling with gcc.
+   On MSVC, max_align_t is defined only in C++ mode, after <cstddef> was
+   included.  Its definition is good since it has an alignment of 8 (on x86
+   and x86_64).
+   Similarly on OS/2 kLIBC.  */
+#if (defined _MSC_VER || (defined __KLIBC__ && !defined __LIBCN__)) \
+    && defined __cplusplus
+# include <cstddef>
+#else
+# if ! (@HAVE_MAX_ALIGN_T@ || (defined _GCC_MAX_ALIGN_T && !defined __clang__))
+#  if !GNULIB_defined_max_align_t
 /* On the x86, the maximum storage alignment of double, long, etc. is 4,
    but GCC's C11 ABI for x86 says that max_align_t has an alignment of 8,
    and the C11 standard allows this.  Work around this problem by
    using __alignof__ (which returns 8 for double) rather than _Alignof
    (which returns 4), and align each union member accordingly.  */
-#  ifdef __GNUC__
-#   define _GL_STDDEF_ALIGNAS(type) \
-      __attribute__ ((__aligned__ (__alignof__ (type))))
-#  else
-#   define _GL_STDDEF_ALIGNAS(type) /* */
-#  endif
+#   if defined __GNUC__ || (__clang_major__ >= 4)
+#    define _GL_STDDEF_ALIGNAS(type) \
+       __attribute__ ((__aligned__ (__alignof__ (type))))
+#   else
+#    define _GL_STDDEF_ALIGNAS(type) /* */
+#   endif
 typedef union
 {
   char *__p _GL_STDDEF_ALIGNAS (char *);
@@ -104,8 +136,9 @@
   long double __ld _GL_STDDEF_ALIGNAS (long double);
   long int __i _GL_STDDEF_ALIGNAS (long int);
 } rpl_max_align_t;
-#  define max_align_t rpl_max_align_t
-#  define GNULIB_defined_max_align_t 1
+#   define max_align_t rpl_max_align_t
+#   define GNULIB_defined_max_align_t 1
+#  endif
 # endif
 #endif
 
diff --git a/lib/stdint.in.h b/lib/stdint.in.h
index 39b6a4f..85c5418 100644
--- a/lib/stdint.in.h
+++ b/lib/stdint.in.h
@@ -1,19 +1,19 @@
-/* Copyright (C) 2001-2002, 2004-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2001-2002, 2004-2021 Free Software Foundation, Inc.
    Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood.
    This file is part of gnulib.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /*
  * ISO C 99 <stdint.h> for platforms that lack it.
@@ -85,7 +85,7 @@
 
 /* Override WINT_MIN and WINT_MAX if gnulib's <wchar.h> or <wctype.h> overrides
    wint_t.  */
-#if @GNULIB_OVERRIDES_WINT_T@
+#if @GNULIBHEADERS_OVERRIDE_WINT_T@
 # undef WINT_MIN
 # undef WINT_MAX
 # define WINT_MIN 0x0U
@@ -188,7 +188,7 @@
 typedef __int64 gl_int64_t;
 #   define int64_t gl_int64_t
 #   define GL_INT64_T
-#  elif @HAVE_LONG_LONG_INT@
+#  else
 #   undef int64_t
 typedef long long int gl_int64_t;
 #   define int64_t gl_int64_t
@@ -209,7 +209,7 @@
 typedef unsigned __int64 gl_uint64_t;
 #   define uint64_t gl_uint64_t
 #   define GL_UINT64_T
-#  elif @HAVE_UNSIGNED_LONG_LONG_INT@
+#  else
 #   undef uint64_t
 typedef unsigned long long int gl_uint64_t;
 #   define uint64_t gl_uint64_t
@@ -302,12 +302,11 @@
 /* kLIBC's <stdint.h> defines _INTPTR_T_DECLARED and needs its own
    definitions of intptr_t and uintptr_t (which use int and unsigned)
    to avoid clashes with declarations of system functions like sbrk.
-   Similarly, mingw 5.22 <crtdefs.h> defines _INTPTR_T_DEFINED and
-   _UINTPTR_T_DEFINED and needs its own definitions of intptr_t and
+   Similarly, MinGW WSL-5.4.1 <stdint.h> needs its own intptr_t and
    uintptr_t to avoid conflicting declarations of system functions like
    _findclose in <io.h>.  */
 # if !((defined __KLIBC__ && defined _INTPTR_T_DECLARED) \
-       || (defined __MINGW32__ && defined _INTPTR_T_DEFINED && defined _UINTPTR_T_DEFINED))
+       || defined __MINGW32__)
 #  undef intptr_t
 #  undef uintptr_t
 #  ifdef _WIN64
@@ -333,7 +332,7 @@
 # ifndef INTMAX_MAX
 #  undef INTMAX_C
 #  undef intmax_t
-#  if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+#  if LONG_MAX >> 30 == 1
 typedef long long int gl_intmax_t;
 #   define intmax_t gl_intmax_t
 #  elif defined GL_INT64_T
@@ -347,7 +346,7 @@
 # ifndef UINTMAX_MAX
 #  undef UINTMAX_C
 #  undef uintmax_t
-#  if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+#  if ULONG_MAX >> 31 == 1
 typedef unsigned long long int gl_uintmax_t;
 #   define uintmax_t gl_uintmax_t
 #  elif defined GL_UINT64_T
@@ -580,11 +579,6 @@
    <wchar.h> -> <stdio.h> -> <getopt.h> -> <stdlib.h>, and the latter includes
    <stdint.h> and assumes its types are already defined.  */
 # if @HAVE_WCHAR_H@ && ! (defined WCHAR_MIN && defined WCHAR_MAX)
-  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-     included before <wchar.h>.  */
-#  include <stddef.h>
-#  include <stdio.h>
-#  include <time.h>
 #  define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
 #  include <wchar.h>
 #  undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
@@ -604,7 +598,7 @@
 /* wint_t limits */
 /* If gnulib's <wchar.h> or <wctype.h> overrides wint_t, @WINT_T_SUFFIX@ is not
    accurate, therefore use the definitions from above.  */
-# if !@GNULIB_OVERRIDES_WINT_T@
+# if !@GNULIBHEADERS_OVERRIDE_WINT_T@
 #  undef WINT_MIN
 #  undef WINT_MAX
 #  if @HAVE_SIGNED_WINT_T@
@@ -647,21 +641,21 @@
 #  define INT64_C(x) x##L
 # elif defined _MSC_VER
 #  define INT64_C(x) x##i64
-# elif @HAVE_LONG_LONG_INT@
+# else
 #  define INT64_C(x) x##LL
 # endif
 # if ULONG_MAX >> 31 >> 31 >> 1 == 1
 #  define UINT64_C(x) x##UL
 # elif defined _MSC_VER
 #  define UINT64_C(x) x##ui64
-# elif @HAVE_UNSIGNED_LONG_LONG_INT@
+# else
 #  define UINT64_C(x) x##ULL
 # endif
 
 /* 7.18.4.2. Macros for greatest-width integer constants */
 
 # ifndef INTMAX_C
-#  if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+#  if LONG_MAX >> 30 == 1
 #   define INTMAX_C(x)   x##LL
 #  elif defined GL_INT64_T
 #   define INTMAX_C(x)   INT64_C(x)
@@ -671,7 +665,7 @@
 # endif
 
 # ifndef UINTMAX_C
-#  if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+#  if ULONG_MAX >> 31 == 1
 #   define UINTMAX_C(x)  x##ULL
 #  elif defined GL_UINT64_T
 #   define UINTMAX_C(x)  UINT64_C(x)
diff --git a/lib/stdio--.h b/lib/stdio--.h
index fb63d30..bb931d7 100644
--- a/lib/stdio--.h
+++ b/lib/stdio--.h
@@ -1,6 +1,6 @@
 /* Like stdio.h, but redefine some names to avoid glitches.
 
-   Copyright (C) 2005-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2006, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/stdio-impl.h b/lib/stdio-impl.h
index d496257..3fa94b4 100644
--- a/lib/stdio-impl.h
+++ b/lib/stdio-impl.h
@@ -1,17 +1,17 @@
 /* Implementation details of FILE streams.
-   Copyright (C) 2007-2008, 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2008, 2010-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Many stdio implementations have the same logic and therefore can share
@@ -175,7 +175,7 @@
 #  define fp_ fp
 # endif
 
-# if defined _SCO_DS                /* OpenServer */
+# if defined _SCO_DS || (defined __SCO_VERSION__ || defined __sysv5__)  /* OpenServer 5, OpenServer 6, UnixWare 7 */
 #  define _cnt __cnt
 #  define _ptr __ptr
 #  define _base __base
diff --git a/lib/stdio-safer.h b/lib/stdio-safer.h
index 790846c..53ee971 100644
--- a/lib/stdio-safer.h
+++ b/lib/stdio-safer.h
@@ -1,6 +1,6 @@
 /* Invoke stdio functions, but avoid some glitches.
 
-   Copyright (C) 2001, 2003, 2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2003, 2006, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -20,17 +20,21 @@
 #include <stdio.h>
 
 #if GNULIB_FOPEN_SAFER
-FILE *fopen_safer (char const *, char const *);
+FILE *fopen_safer (char const *, char const *)
+  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1);
 #endif
 
 #if GNULIB_FREOPEN_SAFER
-FILE *freopen_safer (char const *, char const *, FILE *);
+FILE *freopen_safer (char const *, char const *, FILE *)
+  _GL_ARG_NONNULL ((2, 3));
 #endif
 
 #if GNULIB_POPEN_SAFER
-FILE *popen_safer (char const *, char const *);
+FILE *popen_safer (char const *, char const *)
+  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1);
 #endif
 
 #if GNULIB_TMPFILE_SAFER
-FILE *tmpfile_safer (void);
+FILE *tmpfile_safer (void)
+  _GL_ATTRIBUTE_DEALLOC (fclose, 1);
 #endif
diff --git a/lib/stdio.in.h b/lib/stdio.in.h
index 7c283ad..0ca2c8e 100644
--- a/lib/stdio.in.h
+++ b/lib/stdio.in.h
@@ -1,19 +1,19 @@
 /* A GNU-like <stdio.h>.
 
-   Copyright (C) 2004, 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 @PRAGMA_SYSTEM_HEADER@
@@ -56,61 +56,6 @@
    May also define off_t to a 64-bit type on native Windows.  */
 #include <sys/types.h>
 
-/* The __attribute__ feature is available in gcc versions 2.5 and later.
-   The __-protected variants of the attributes 'format' and 'printf' are
-   accepted by gcc versions 2.6.4 (effectively 2.7) and later.
-   We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
-   gnulib and libintl do '#define printf __printf__' when they override
-   the 'printf' function.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
-# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
-#else
-# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_PRINTF
-   indicates to GCC that the function takes a format string and arguments,
-   where the format string directives are the ones standardized by ISO C99
-   and POSIX.  */
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
-# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
-   _GL_ATTRIBUTE_FORMAT ((__gnu_printf__, formatstring_parameter, first_argument))
-#else
-# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
-   _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF,
-   except that it indicates to GCC that the supported format string directives
-   are the ones of the system printf(), rather than the ones standardized by
-   ISO C99 and POSIX.  */
-#if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
-# define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
-  _GL_ATTRIBUTE_FORMAT_PRINTF (formatstring_parameter, first_argument)
-#else
-# define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
-  _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_SCANF
-   indicates to GCC that the function takes a format string and arguments,
-   where the format string directives are the ones standardized by ISO C99
-   and POSIX.  */
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
-# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
-   _GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument))
-#else
-# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
-   _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF,
-   except that it indicates to GCC that the supported format string directives
-   are the ones of the system scanf(), rather than the ones standardized by
-   ISO C99 and POSIX.  */
-#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \
-  _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
-
 /* Solaris 10 and NetBSD 7.0 declare renameat in <unistd.h>, not in <stdio.h>.  */
 /* But in any case avoid namespace pollution on glibc systems.  */
 #if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && (defined __sun || defined __NetBSD__) \
@@ -146,6 +91,88 @@
 #endif
 
 
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.  */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if __GNUC__ >= 11
+#  define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+#  define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The __-protected variants of the attributes 'format' and 'printf' are
+   accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+   We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
+   gnulib and libintl do '#define printf __printf__' when they override
+   the 'printf' function.  */
+#ifndef _GL_ATTRIBUTE_FORMAT
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || defined __clang__
+#  define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+# else
+#  define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
+# endif
+#endif
+
+/* An __attribute__ __format__ specifier for a function that takes a format
+   string and arguments, where the format string directives are the ones
+   standardized by ISO C99 and POSIX.
+   _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD  */
+/* __gnu_printf__ is supported in GCC >= 4.4.  */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __gnu_printf__
+#else
+# define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __printf__
+#endif
+
+/* An __attribute__ __format__ specifier for a function that takes a format
+   string and arguments, where the format string directives are the ones of the
+   system printf(), rather than the ones standardized by ISO C99 and POSIX.
+   _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM  */
+/* On mingw, Gnulib sets __USE_MINGW_ANSI_STDIO in order to get closer to
+   the standards.  The macro GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU indicates
+   whether this change is effective.  On older mingw, it is not.  */
+#if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
+# define _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD
+#else
+# define _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM __printf__
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD
+   indicates to GCC that the function takes a format string and arguments,
+   where the format string directives are the ones standardized by ISO C99
+   and POSIX.  */
+#define _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD(formatstring_parameter, first_argument) \
+  _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, formatstring_parameter, first_argument))
+
+/* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD,
+   except that it indicates to GCC that the supported format string directives
+   are the ones of the system printf(), rather than the ones standardized by
+   ISO C99 and POSIX.  */
+#define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
+  _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM, formatstring_parameter, first_argument))
+
+/* _GL_ATTRIBUTE_FORMAT_SCANF
+   indicates to GCC that the function takes a format string and arguments,
+   where the format string directives are the ones standardized by ISO C99
+   and POSIX.  */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
+   _GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument))
+#else
+# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
+   _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF,
+   except that it indicates to GCC that the supported format string directives
+   are the ones of the system scanf(), rather than the ones standardized by
+   ISO C99 and POSIX.  */
+#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \
+  _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
+
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
@@ -171,17 +198,17 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define dprintf rpl_dprintf
 #  endif
-_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *restrict format, ...)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                                 _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *format, ...));
+_GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *restrict format, ...));
 # else
 #  if !@HAVE_DPRINTF@
-_GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+_GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *restrict format, ...)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                                 _GL_ARG_NONNULL ((2)));
 #  endif
-_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *format, ...));
+_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *restrict format, ...));
 # endif
 _GL_CXXALIASWARN (dprintf);
 #elif defined GNULIB_POSIXCHECK
@@ -213,24 +240,84 @@
                  "use gnulib module fclose for portable POSIX compliance");
 #endif
 
+#if @GNULIB_MDA_FCLOSEALL@
+/* On native Windows, map 'fcloseall' to '_fcloseall', so that -loldnames is
+   not required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::fcloseall on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fcloseall
+#   define fcloseall _fcloseall
+#  endif
+_GL_CXXALIAS_MDA (fcloseall, int, (void));
+# else
+#  if @HAVE_DECL_FCLOSEALL@
+#   if defined __FreeBSD__ || defined __DragonFly__
+_GL_CXXALIAS_SYS (fcloseall, void, (void));
+#   else
+_GL_CXXALIAS_SYS (fcloseall, int, (void));
+#   endif
+#  endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_FCLOSEALL@
+_GL_CXXALIASWARN (fcloseall);
+# endif
+#endif
+
 #if @GNULIB_FDOPEN@
 # if @REPLACE_FDOPEN@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef fdopen
 #   define fdopen rpl_fdopen
 #  endif
-_GL_FUNCDECL_RPL (fdopen, FILE *, (int fd, const char *mode)
-                                  _GL_ARG_NONNULL ((2)));
+_GL_FUNCDECL_RPL (fdopen, FILE *,
+                  (int fd, const char *mode)
+                  _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
 _GL_CXXALIAS_RPL (fdopen, FILE *, (int fd, const char *mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fdopen
+#   define fdopen _fdopen
+#  endif
+_GL_CXXALIAS_MDA (fdopen, FILE *, (int fd, const char *mode));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate fdopen with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (fdopen, FILE *,
+                  (int fd, const char *mode)
+                  _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+#  endif
 _GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
 # endif
 _GL_CXXALIASWARN (fdopen);
-#elif defined GNULIB_POSIXCHECK
-# undef fdopen
+#else
+# if @GNULIB_FCLOSE@ && __GNUC__ >= 11 && !defined fdopen
+/* For -Wmismatched-dealloc: Associate fdopen with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (fdopen, FILE *,
+                  (int fd, const char *mode)
+                  _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef fdopen
 /* Assume fdopen is always declared.  */
 _GL_WARN_ON_USE (fdopen, "fdopen on native Windows platforms is not POSIX compliant - "
                  "use gnulib module fdopen for portability");
+# elif @GNULIB_MDA_FDOPEN@
+/* On native Windows, map 'fdopen' to '_fdopen', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::fdopen always.  */
+#  if defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef fdopen
+#    define fdopen _fdopen
+#   endif
+_GL_CXXALIAS_MDA (fdopen, FILE *, (int fd, const char *mode));
+#  else
+_GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
+#  endif
+_GL_CXXALIASWARN (fdopen);
+# endif
 #endif
 
 #if @GNULIB_FFLUSH@
@@ -281,37 +368,73 @@
 #   undef fgets
 #   define fgets rpl_fgets
 #  endif
-_GL_FUNCDECL_RPL (fgets, char *, (char *s, int n, FILE *stream)
-                                 _GL_ARG_NONNULL ((1, 3)));
-_GL_CXXALIAS_RPL (fgets, char *, (char *s, int n, FILE *stream));
+_GL_FUNCDECL_RPL (fgets, char *,
+                  (char *restrict s, int n, FILE *restrict stream)
+                  _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (fgets, char *,
+                  (char *restrict s, int n, FILE *restrict stream));
 # else
-_GL_CXXALIAS_SYS (fgets, char *, (char *s, int n, FILE *stream));
+_GL_CXXALIAS_SYS (fgets, char *,
+                  (char *restrict s, int n, FILE *restrict stream));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fgets);
 # endif
 #endif
 
+#if @GNULIB_MDA_FILENO@
+/* On native Windows, map 'fileno' to '_fileno', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::fileno always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fileno
+#   define fileno _fileno
+#  endif
+_GL_CXXALIAS_MDA (fileno, int, (FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (fileno, int, (FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (fileno);
+#endif
+
 #if @GNULIB_FOPEN@
 # if @REPLACE_FOPEN@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef fopen
 #   define fopen rpl_fopen
 #  endif
-_GL_FUNCDECL_RPL (fopen, FILE *, (const char *filename, const char *mode)
-                                 _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (fopen, FILE *, (const char *filename, const char *mode));
+_GL_FUNCDECL_RPL (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+_GL_CXXALIAS_RPL (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode));
 # else
-_GL_CXXALIAS_SYS (fopen, FILE *, (const char *filename, const char *mode));
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate fopen with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+#  endif
+_GL_CXXALIAS_SYS (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fopen);
 # endif
-#elif defined GNULIB_POSIXCHECK
-# undef fopen
+#else
+# if @GNULIB_FCLOSE@ && __GNUC__ >= 11 && !defined fopen
+/* For -Wmismatched-dealloc: Associate fopen with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef fopen
 /* Assume fopen is always declared.  */
 _GL_WARN_ON_USE (fopen, "fopen on native Windows platforms is not POSIX compliant - "
                  "use gnulib module fopen for portability");
+# endif
 #endif
 
 #if @GNULIB_FPRINTF_POSIX@ || @GNULIB_FPRINTF@
@@ -322,17 +445,21 @@
 #  endif
 #  define GNULIB_overrides_fprintf 1
 #  if @GNULIB_FPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
-_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
-                                _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (fprintf, int,
+                  (FILE *restrict fp, const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
 #  else
-_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3)
-                                _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (fprintf, int,
+                  (FILE *restrict fp, const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
 #  endif
-_GL_CXXALIAS_RPL (fprintf, int, (FILE *fp, const char *format, ...));
+_GL_CXXALIAS_RPL (fprintf, int,
+                  (FILE *restrict fp, const char *restrict format, ...));
 # else
-_GL_CXXALIAS_SYS (fprintf, int, (FILE *fp, const char *format, ...));
+_GL_CXXALIAS_SYS (fprintf, int,
+                  (FILE *restrict fp, const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fprintf);
@@ -398,11 +525,14 @@
 #   undef fputs
 #   define fputs rpl_fputs
 #  endif
-_GL_FUNCDECL_RPL (fputs, int, (const char *string, FILE *stream)
-                              _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (fputs, int, (const char *string, FILE *stream));
+_GL_FUNCDECL_RPL (fputs, int,
+                  (const char *restrict string, FILE *restrict stream)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fputs, int,
+                  (const char *restrict string, FILE *restrict stream));
 # else
-_GL_CXXALIAS_SYS (fputs, int, (const char *string, FILE *stream));
+_GL_CXXALIAS_SYS (fputs, int,
+                  (const char *restrict string, FILE *restrict stream));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fputs);
@@ -415,11 +545,17 @@
 #   undef fread
 #   define fread rpl_fread
 #  endif
-_GL_FUNCDECL_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream)
-                                 _GL_ARG_NONNULL ((4)));
-_GL_CXXALIAS_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream));
+_GL_FUNCDECL_RPL (fread, size_t,
+                  (void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream)
+                  _GL_ARG_NONNULL ((4)));
+_GL_CXXALIAS_RPL (fread, size_t,
+                  (void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream));
 # else
-_GL_CXXALIAS_SYS (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream));
+_GL_CXXALIAS_SYS (fread, size_t,
+                  (void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fread);
@@ -433,13 +569,16 @@
 #   define freopen rpl_freopen
 #  endif
 _GL_FUNCDECL_RPL (freopen, FILE *,
-                  (const char *filename, const char *mode, FILE *stream)
+                  (const char *restrict filename, const char *restrict mode,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((2, 3)));
 _GL_CXXALIAS_RPL (freopen, FILE *,
-                  (const char *filename, const char *mode, FILE *stream));
+                  (const char *restrict filename, const char *restrict mode,
+                   FILE *restrict stream));
 # else
 _GL_CXXALIAS_SYS (freopen, FILE *,
-                  (const char *filename, const char *mode, FILE *stream));
+                  (const char *restrict filename, const char *restrict mode,
+                   FILE *restrict stream));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (freopen);
@@ -458,12 +597,15 @@
 #   undef fscanf
 #   define fscanf rpl_fscanf
 #  endif
-_GL_FUNCDECL_RPL (fscanf, int, (FILE *stream, const char *format, ...)
-                               _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3)
-                               _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (fscanf, int, (FILE *stream, const char *format, ...));
+_GL_FUNCDECL_RPL (fscanf, int,
+                  (FILE *restrict stream, const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fscanf, int,
+                  (FILE *restrict stream, const char *restrict format, ...));
 # else
-_GL_CXXALIAS_SYS (fscanf, int, (FILE *stream, const char *format, ...));
+_GL_CXXALIAS_SYS (fscanf, int,
+                  (FILE *restrict stream, const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fscanf);
@@ -634,13 +776,16 @@
 #   define fwrite rpl_fwrite
 #  endif
 _GL_FUNCDECL_RPL (fwrite, size_t,
-                  (const void *ptr, size_t s, size_t n, FILE *stream)
+                  (const void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 4)));
 _GL_CXXALIAS_RPL (fwrite, size_t,
-                  (const void *ptr, size_t s, size_t n, FILE *stream));
+                  (const void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream));
 # else
 _GL_CXXALIAS_SYS (fwrite, size_t,
-                  (const void *ptr, size_t s, size_t n, FILE *stream));
+                  (const void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream));
 
 /* Work around bug 11959 when fortifying glibc 2.4 through 2.15
    <https://sourceware.org/bugzilla/show_bug.cgi?id=11959>,
@@ -715,22 +860,26 @@
 #   define getdelim rpl_getdelim
 #  endif
 _GL_FUNCDECL_RPL (getdelim, ssize_t,
-                  (char **lineptr, size_t *linesize, int delimiter,
-                   FILE *stream)
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   int delimiter,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 2, 4)));
 _GL_CXXALIAS_RPL (getdelim, ssize_t,
-                  (char **lineptr, size_t *linesize, int delimiter,
-                   FILE *stream));
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   int delimiter,
+                   FILE *restrict stream));
 # else
 #  if !@HAVE_DECL_GETDELIM@
 _GL_FUNCDECL_SYS (getdelim, ssize_t,
-                  (char **lineptr, size_t *linesize, int delimiter,
-                   FILE *stream)
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   int delimiter,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 2, 4)));
 #  endif
 _GL_CXXALIAS_SYS (getdelim, ssize_t,
-                  (char **lineptr, size_t *linesize, int delimiter,
-                   FILE *stream));
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   int delimiter,
+                   FILE *restrict stream));
 # endif
 _GL_CXXALIASWARN (getdelim);
 #elif defined GNULIB_POSIXCHECK
@@ -754,18 +903,22 @@
 #   define getline rpl_getline
 #  endif
 _GL_FUNCDECL_RPL (getline, ssize_t,
-                  (char **lineptr, size_t *linesize, FILE *stream)
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 2, 3)));
 _GL_CXXALIAS_RPL (getline, ssize_t,
-                  (char **lineptr, size_t *linesize, FILE *stream));
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   FILE *restrict stream));
 # else
 #  if !@HAVE_DECL_GETLINE@
 _GL_FUNCDECL_SYS (getline, ssize_t,
-                  (char **lineptr, size_t *linesize, FILE *stream)
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 2, 3)));
 #  endif
 _GL_CXXALIAS_SYS (getline, ssize_t,
-                  (char **lineptr, size_t *linesize, FILE *stream));
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   FILE *restrict stream));
 # endif
 # if @HAVE_DECL_GETLINE@
 _GL_CXXALIASWARN (getline);
@@ -786,6 +939,22 @@
 _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
 #endif
 
+#if @GNULIB_MDA_GETW@
+/* On native Windows, map 'getw' to '_getw', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::getw always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getw
+#   define getw _getw
+#  endif
+_GL_CXXALIAS_MDA (getw, int, (FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (getw, int, (FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (getw);
+#endif
+
 #if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@
 struct obstack;
 /* Grow an obstack with formatted output.  Return the number of
@@ -799,7 +968,7 @@
 #  endif
 _GL_FUNCDECL_RPL (obstack_printf, int,
                   (struct obstack *obs, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (obstack_printf, int,
                   (struct obstack *obs, const char *format, ...));
@@ -807,7 +976,7 @@
 #  if !@HAVE_DECL_OBSTACK_PRINTF@
 _GL_FUNCDECL_SYS (obstack_printf, int,
                   (struct obstack *obs, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (obstack_printf, int,
@@ -820,7 +989,7 @@
 #  endif
 _GL_FUNCDECL_RPL (obstack_vprintf, int,
                   (struct obstack *obs, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (obstack_vprintf, int,
                   (struct obstack *obs, const char *format, va_list args));
@@ -828,7 +997,7 @@
 #  if !@HAVE_DECL_OBSTACK_PRINTF@
 _GL_FUNCDECL_SYS (obstack_vprintf, int,
                   (struct obstack *obs, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (obstack_vprintf, int,
@@ -880,43 +1049,53 @@
 #   undef popen
 #   define popen rpl_popen
 #  endif
-_GL_FUNCDECL_RPL (popen, FILE *, (const char *cmd, const char *mode)
-                                 _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (popen, FILE *,
+                  (const char *cmd, const char *mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
 _GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode));
 # else
-#  if !@HAVE_POPEN@
-_GL_FUNCDECL_SYS (popen, FILE *, (const char *cmd, const char *mode)
-                                 _GL_ARG_NONNULL ((1, 2)));
+#  if !@HAVE_POPEN@ || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (popen, FILE *,
+                  (const char *cmd, const char *mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
 #  endif
 _GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode));
 # endif
 _GL_CXXALIASWARN (popen);
-#elif defined GNULIB_POSIXCHECK
-# undef popen
-# if HAVE_RAW_DECL_POPEN
+#else
+# if @GNULIB_PCLOSE@ && __GNUC__ >= 11 && !defined popen
+/* For -Wmismatched-dealloc: Associate popen with pclose or rpl_pclose.  */
+_GL_FUNCDECL_SYS (popen, FILE *,
+                  (const char *cmd, const char *mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef popen
+#  if HAVE_RAW_DECL_POPEN
 _GL_WARN_ON_USE (popen, "popen is buggy on some platforms - "
                  "use gnulib module popen or pipe for more portability");
+#  endif
 # endif
 #endif
 
 #if @GNULIB_PRINTF_POSIX@ || @GNULIB_PRINTF@
 # if (@GNULIB_PRINTF_POSIX@ && @REPLACE_PRINTF@) \
      || (@GNULIB_PRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
-#  if defined __GNUC__
+#  if defined __GNUC__ || defined __clang__
 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 /* Don't break __attribute__((format(printf,M,N))).  */
 #    define printf __printf__
 #   endif
 #   if @GNULIB_PRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
 _GL_FUNCDECL_RPL_1 (__printf__, int,
-                    (const char *format, ...)
+                    (const char *restrict format, ...)
                     __asm__ (@ASM_SYMBOL_PREFIX@
                              _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
-                    _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2)
+                    _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 2)
                     _GL_ARG_NONNULL ((1)));
 #   else
 _GL_FUNCDECL_RPL_1 (__printf__, int,
-                    (const char *format, ...)
+                    (const char *restrict format, ...)
                     __asm__ (@ASM_SYMBOL_PREFIX@
                              _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
                     _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 2)
@@ -928,14 +1107,14 @@
 #    define printf rpl_printf
 #   endif
 _GL_FUNCDECL_RPL (printf, int,
-                  (const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2)
+                  (const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 2)
                   _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (printf, int, (const char *format, ...));
+_GL_CXXALIAS_RPL (printf, int, (const char *restrict format, ...));
 #  endif
 #  define GNULIB_overrides_printf 1
 # else
-_GL_CXXALIAS_SYS (printf, int, (const char *format, ...));
+_GL_CXXALIAS_SYS (printf, int, (const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (printf);
@@ -999,6 +1178,22 @@
 # endif
 #endif
 
+#if @GNULIB_MDA_PUTW@
+/* On native Windows, map 'putw' to '_putw', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::putw always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef putw
+#   define putw _putw
+#  endif
+_GL_CXXALIAS_MDA (putw, int, (int w, FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (putw, int, (int w, FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (putw);
+#endif
+
 #if @GNULIB_REMOVE@
 # if @REPLACE_REMOVE@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
@@ -1076,31 +1271,31 @@
 
 #if @GNULIB_SCANF@
 # if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
-#  if defined __GNUC__
+#  if defined __GNUC__ || defined __clang__
 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #    undef scanf
 /* Don't break __attribute__((format(scanf,M,N))).  */
 #    define scanf __scanf__
 #   endif
 _GL_FUNCDECL_RPL_1 (__scanf__, int,
-                    (const char *format, ...)
+                    (const char *restrict format, ...)
                     __asm__ (@ASM_SYMBOL_PREFIX@
                              _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_scanf))
                     _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
                     _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *format, ...));
+_GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *restrict format, ...));
 #  else
 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #    undef scanf
 #    define scanf rpl_scanf
 #   endif
-_GL_FUNCDECL_RPL (scanf, int, (const char *format, ...)
+_GL_FUNCDECL_RPL (scanf, int, (const char *restrict format, ...)
                               _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
                               _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (scanf, int, (const char *format, ...));
+_GL_CXXALIAS_RPL (scanf, int, (const char *restrict format, ...));
 #  endif
 # else
-_GL_CXXALIAS_SYS (scanf, int, (const char *format, ...));
+_GL_CXXALIAS_SYS (scanf, int, (const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (scanf);
@@ -1112,23 +1307,30 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define snprintf rpl_snprintf
 #  endif
+#  define GNULIB_overrides_snprintf 1
 _GL_FUNCDECL_RPL (snprintf, int,
-                  (char *str, size_t size, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4)
+                  (char *restrict str, size_t size,
+                   const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 4)
                   _GL_ARG_NONNULL ((3)));
 _GL_CXXALIAS_RPL (snprintf, int,
-                  (char *str, size_t size, const char *format, ...));
+                  (char *restrict str, size_t size,
+                   const char *restrict format, ...));
 # else
 #  if !@HAVE_DECL_SNPRINTF@
 _GL_FUNCDECL_SYS (snprintf, int,
-                  (char *str, size_t size, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4)
+                  (char *restrict str, size_t size,
+                   const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 4)
                   _GL_ARG_NONNULL ((3)));
 #  endif
 _GL_CXXALIAS_SYS (snprintf, int,
-                  (char *str, size_t size, const char *format, ...));
+                  (char *restrict str, size_t size,
+                   const char *restrict format, ...));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (snprintf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef snprintf
 # if HAVE_RAW_DECL_SNPRINTF
@@ -1151,12 +1353,16 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define sprintf rpl_sprintf
 #  endif
-_GL_FUNCDECL_RPL (sprintf, int, (char *str, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
-                                _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (sprintf, int, (char *str, const char *format, ...));
+#  define GNULIB_overrides_sprintf 1
+_GL_FUNCDECL_RPL (sprintf, int,
+                  (char *restrict str, const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (sprintf, int,
+                  (char *restrict str, const char *restrict format, ...));
 # else
-_GL_CXXALIAS_SYS (sprintf, int, (char *str, const char *format, ...));
+_GL_CXXALIAS_SYS (sprintf, int,
+                  (char *restrict str, const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (sprintf);
@@ -1169,24 +1375,53 @@
                  "POSIX compliance");
 #endif
 
+#if @GNULIB_MDA_TEMPNAM@
+/* On native Windows, map 'tempnam' to '_tempnam', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::tempnam always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef tempnam
+#   define tempnam _tempnam
+#  endif
+_GL_CXXALIAS_MDA (tempnam, char *, (const char *dir, const char *prefix));
+# else
+_GL_CXXALIAS_SYS (tempnam, char *, (const char *dir, const char *prefix));
+# endif
+_GL_CXXALIASWARN (tempnam);
+#endif
+
 #if @GNULIB_TMPFILE@
 # if @REPLACE_TMPFILE@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define tmpfile rpl_tmpfile
 #  endif
-_GL_FUNCDECL_RPL (tmpfile, FILE *, (void));
+_GL_FUNCDECL_RPL (tmpfile, FILE *, (void)
+                                   _GL_ATTRIBUTE_DEALLOC (fclose, 1));
 _GL_CXXALIAS_RPL (tmpfile, FILE *, (void));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate tmpfile with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (tmpfile, FILE *, (void)
+                                   _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+#  endif
 _GL_CXXALIAS_SYS (tmpfile, FILE *, (void));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (tmpfile);
 # endif
-#elif defined GNULIB_POSIXCHECK
-# undef tmpfile
-# if HAVE_RAW_DECL_TMPFILE
+#else
+# if @GNULIB_FCLOSE@ && __GNUC__ >= 11 && !defined tmpfile
+/* For -Wmismatched-dealloc: Associate tmpfile with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (tmpfile, FILE *, (void)
+                                   _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef tmpfile
+#  if HAVE_RAW_DECL_TMPFILE
 _GL_WARN_ON_USE (tmpfile, "tmpfile is not usable on mingw - "
                  "use gnulib module tmpfile for portability");
+#  endif
 # endif
 #endif
 
@@ -1199,9 +1434,10 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define asprintf rpl_asprintf
 #  endif
+#  define GNULIB_overrides_asprintf
 _GL_FUNCDECL_RPL (asprintf, int,
                   (char **result, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (asprintf, int,
                   (char **result, const char *format, ...));
@@ -1209,7 +1445,7 @@
 #  if !@HAVE_VASPRINTF@
 _GL_FUNCDECL_SYS (asprintf, int,
                   (char **result, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (asprintf, int,
@@ -1220,9 +1456,10 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define vasprintf rpl_vasprintf
 #  endif
+#  define GNULIB_overrides_vasprintf 1
 _GL_FUNCDECL_RPL (vasprintf, int,
                   (char **result, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (vasprintf, int,
                   (char **result, const char *format, va_list args));
@@ -1230,7 +1467,7 @@
 #  if !@HAVE_VASPRINTF@
 _GL_FUNCDECL_SYS (vasprintf, int,
                   (char **result, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (vasprintf, int,
@@ -1244,22 +1481,27 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define vdprintf rpl_vdprintf
 #  endif
-_GL_FUNCDECL_RPL (vdprintf, int, (int fd, const char *format, va_list args)
-                                 _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
-                                 _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (vdprintf, int, (int fd, const char *format, va_list args));
+_GL_FUNCDECL_RPL (vdprintf, int,
+                  (int fd, const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (vdprintf, int,
+                  (int fd, const char *restrict format, va_list args));
 # else
 #  if !@HAVE_VDPRINTF@
-_GL_FUNCDECL_SYS (vdprintf, int, (int fd, const char *format, va_list args)
-                                 _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
-                                 _GL_ARG_NONNULL ((2)));
+_GL_FUNCDECL_SYS (vdprintf, int,
+                  (int fd, const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+                  _GL_ARG_NONNULL ((2)));
 #  endif
 /* Need to cast, because on Solaris, the third parameter will likely be
                                                     __va_list args.  */
 _GL_CXXALIAS_SYS_CAST (vdprintf, int,
-                       (int fd, const char *format, va_list args));
+                       (int fd, const char *restrict format, va_list args));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vdprintf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef vdprintf
 # if HAVE_RAW_DECL_VDPRINTF
@@ -1276,21 +1518,28 @@
 #  endif
 #  define GNULIB_overrides_vfprintf 1
 #  if @GNULIB_VFPRINTF_POSIX@
-_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)
-                                 _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
-                                 _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (vfprintf, int,
+                  (FILE *restrict fp,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+                  _GL_ARG_NONNULL ((1, 2)));
 #  else
-_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)
-                                 _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0)
-                                 _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (vfprintf, int,
+                  (FILE *restrict fp,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0)
+                  _GL_ARG_NONNULL ((1, 2)));
 #  endif
-_GL_CXXALIAS_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args));
+_GL_CXXALIAS_RPL (vfprintf, int,
+                  (FILE *restrict fp,
+                   const char *restrict format, va_list args));
 # else
 /* Need to cast, because on Solaris, the third parameter is
                                                       __va_list args
    and GCC's fixincludes did not change this to __gnuc_va_list.  */
 _GL_CXXALIAS_SYS_CAST (vfprintf, int,
-                       (FILE *fp, const char *format, va_list args));
+                       (FILE *restrict fp,
+                        const char *restrict format, va_list args));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vfprintf);
@@ -1313,16 +1562,21 @@
 #   define vfscanf rpl_vfscanf
 #  endif
 _GL_FUNCDECL_RPL (vfscanf, int,
-                  (FILE *stream, const char *format, va_list args)
+                  (FILE *restrict stream,
+                   const char *restrict format, va_list args)
                   _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (vfscanf, int,
-                  (FILE *stream, const char *format, va_list args));
+                  (FILE *restrict stream,
+                   const char *restrict format, va_list args));
 # else
 _GL_CXXALIAS_SYS (vfscanf, int,
-                  (FILE *stream, const char *format, va_list args));
+                  (FILE *restrict stream,
+                   const char *restrict format, va_list args));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vfscanf);
+# endif
 #endif
 
 #if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VPRINTF@
@@ -1333,20 +1587,21 @@
 #  endif
 #  define GNULIB_overrides_vprintf 1
 #  if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
-_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (1, 0)
+_GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 0)
                                 _GL_ARG_NONNULL ((1)));
 #  else
-_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args)
+_GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args)
                                 _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 0)
                                 _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_RPL (vprintf, int, (const char *format, va_list args));
+_GL_CXXALIAS_RPL (vprintf, int, (const char *restrict format, va_list args));
 # else
 /* Need to cast, because on Solaris, the second parameter is
                                                           __va_list args
    and GCC's fixincludes did not change this to __gnuc_va_list.  */
-_GL_CXXALIAS_SYS_CAST (vprintf, int, (const char *format, va_list args));
+_GL_CXXALIAS_SYS_CAST (vprintf, int,
+                       (const char *restrict format, va_list args));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vprintf);
@@ -1368,14 +1623,16 @@
 #   undef vscanf
 #   define vscanf rpl_vscanf
 #  endif
-_GL_FUNCDECL_RPL (vscanf, int, (const char *format, va_list args)
+_GL_FUNCDECL_RPL (vscanf, int, (const char *restrict format, va_list args)
                                _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 0)
                                _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (vscanf, int, (const char *format, va_list args));
+_GL_CXXALIAS_RPL (vscanf, int, (const char *restrict format, va_list args));
 # else
-_GL_CXXALIAS_SYS (vscanf, int, (const char *format, va_list args));
+_GL_CXXALIAS_SYS (vscanf, int, (const char *restrict format, va_list args));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vscanf);
+# endif
 #endif
 
 #if @GNULIB_VSNPRINTF@
@@ -1383,23 +1640,30 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define vsnprintf rpl_vsnprintf
 #  endif
+#  define GNULIB_overrides_vsnprintf 1
 _GL_FUNCDECL_RPL (vsnprintf, int,
-                  (char *str, size_t size, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0)
+                  (char *restrict str, size_t size,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0)
                   _GL_ARG_NONNULL ((3)));
 _GL_CXXALIAS_RPL (vsnprintf, int,
-                  (char *str, size_t size, const char *format, va_list args));
+                  (char *restrict str, size_t size,
+                   const char *restrict format, va_list args));
 # else
 #  if !@HAVE_DECL_VSNPRINTF@
 _GL_FUNCDECL_SYS (vsnprintf, int,
-                  (char *str, size_t size, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0)
+                  (char *restrict str, size_t size,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0)
                   _GL_ARG_NONNULL ((3)));
 #  endif
 _GL_CXXALIAS_SYS (vsnprintf, int,
-                  (char *str, size_t size, const char *format, va_list args));
+                  (char *restrict str, size_t size,
+                   const char *restrict format, va_list args));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vsnprintf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef vsnprintf
 # if HAVE_RAW_DECL_VSNPRINTF
@@ -1413,18 +1677,22 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define vsprintf rpl_vsprintf
 #  endif
+#  define GNULIB_overrides_vsprintf 1
 _GL_FUNCDECL_RPL (vsprintf, int,
-                  (char *str, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  (char *restrict str,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (vsprintf, int,
-                  (char *str, const char *format, va_list args));
+                  (char *restrict str,
+                   const char *restrict format, va_list args));
 # else
 /* Need to cast, because on Solaris, the third parameter is
                                                        __va_list args
    and GCC's fixincludes did not change this to __gnuc_va_list.  */
 _GL_CXXALIAS_SYS_CAST (vsprintf, int,
-                       (char *str, const char *format, va_list args));
+                       (char *restrict str,
+                        const char *restrict format, va_list args));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vsprintf);
diff --git a/lib/stdlib.in.h b/lib/stdlib.in.h
index 2d02b4b..0855112 100644
--- a/lib/stdlib.in.h
+++ b/lib/stdlib.in.h
@@ -1,18 +1,18 @@
 /* A GNU-like <stdlib.h>.
 
-   Copyright (C) 1995, 2001-2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 1995, 2001-2004, 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
@@ -53,8 +53,8 @@
 # include <sys/loadavg.h>
 #endif
 
-/* Native Windows platforms declare mktemp() in <io.h>.  */
-#if 0 && (defined _WIN32 && ! defined __CYGWIN__)
+/* Native Windows platforms declare _mktemp() in <io.h>.  */
+#if defined _WIN32 && !defined __CYGWIN__
 # include <io.h>
 #endif
 
@@ -99,12 +99,43 @@
 # include <unistd.h>
 #endif
 
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.  */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if __GNUC__ >= 11
+#  define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+#  define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
+   can be freed via 'free'; it can be used only after declaring 'free'.  */
+/* Applies to: functions.  Cannot be used on inline functions.  */
+#ifndef _GL_ATTRIBUTE_DEALLOC_FREE
+# define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (free, 1)
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+   allocated memory.  */
+/* Applies to: functions.  */
+#ifndef _GL_ATTRIBUTE_MALLOC
+# if __GNUC__ >= 3 || defined __clang__
+#  define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+#  define _GL_ATTRIBUTE_MALLOC
+# endif
+#endif
+
 /* The __attribute__ feature is available in gcc versions 2.5 and later.
    The attribute __pure__ was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define _GL_ATTRIBUTE_PURE /* empty */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
 #endif
 
 /* The definition of _Noreturn is copied here.  */
@@ -147,6 +178,69 @@
 #endif
 
 
+#if @GNULIB_FREE_POSIX@
+# if @REPLACE_FREE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef free
+#   define free rpl_free
+#  endif
+_GL_FUNCDECL_RPL (free, void, (void *ptr));
+_GL_CXXALIAS_RPL (free, void, (void *ptr));
+# else
+_GL_CXXALIAS_SYS (free, void, (void *ptr));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (free);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef free
+/* Assume free is always declared.  */
+_GL_WARN_ON_USE (free, "free is not future POSIX compliant everywhere - "
+                 "use gnulib module free for portability");
+#endif
+
+
+/* Allocate memory with indefinite extent and specified alignment.  */
+#if @GNULIB_ALIGNED_ALLOC@
+# if @REPLACE_ALIGNED_ALLOC@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef aligned_alloc
+#   define aligned_alloc rpl_aligned_alloc
+#  endif
+_GL_FUNCDECL_RPL (aligned_alloc, void *,
+                  (size_t alignment, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+_GL_CXXALIAS_RPL (aligned_alloc, void *, (size_t alignment, size_t size));
+# else
+#  if @HAVE_ALIGNED_ALLOC@
+#   if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate aligned_alloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (aligned_alloc, void *,
+                  (size_t alignment, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#   endif
+_GL_CXXALIAS_SYS (aligned_alloc, void *, (size_t alignment, size_t size));
+#  endif
+# endif
+# if @HAVE_ALIGNED_ALLOC@
+_GL_CXXALIASWARN (aligned_alloc);
+# endif
+#else
+# if @GNULIB_FREE_POSIX@ && __GNUC__ >= 11 && !defined aligned_alloc
+/* For -Wmismatched-dealloc: Associate aligned_alloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (aligned_alloc, void *,
+                  (size_t alignment, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef aligned_alloc
+#  if HAVE_RAW_DECL_ALIGNED_ALLOC
+_GL_WARN_ON_USE (aligned_alloc, "aligned_alloc is not portable - "
+                 "use gnulib module aligned_alloc for portability");
+#  endif
+# endif
+#endif
+
 #if @GNULIB_ATOLL@
 /* Parse a signed decimal integer.
    Returns the value of the integer.  Errors are not detected.  */
@@ -171,19 +265,35 @@
 #   undef calloc
 #   define calloc rpl_calloc
 #  endif
-_GL_FUNCDECL_RPL (calloc, void *, (size_t nmemb, size_t size));
+_GL_FUNCDECL_RPL (calloc, void *,
+                  (size_t nmemb, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (calloc, void *, (size_t nmemb, size_t size));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate calloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (calloc, void *,
+                  (size_t nmemb, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#  endif
 _GL_CXXALIAS_SYS (calloc, void *, (size_t nmemb, size_t size));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (calloc);
 # endif
-#elif defined GNULIB_POSIXCHECK
-# undef calloc
+#else
+# if @GNULIB_FREE_POSIX@ && __GNUC__ >= 11 && !defined calloc
+/* For -Wmismatched-dealloc: Associate calloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (calloc, void *,
+                  (size_t nmemb, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef calloc
 /* Assume calloc is always declared.  */
 _GL_WARN_ON_USE (calloc, "calloc is not POSIX compliant everywhere - "
                  "use gnulib module calloc-posix for portability");
+# endif
 #endif
 
 #if @GNULIB_CANONICALIZE_FILE_NAME@
@@ -191,23 +301,108 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define canonicalize_file_name rpl_canonicalize_file_name
 #  endif
-_GL_FUNCDECL_RPL (canonicalize_file_name, char *, (const char *name)
-                                                  _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_RPL (canonicalize_file_name, char *,
+                  (const char *name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (canonicalize_file_name, char *, (const char *name));
 # else
-#  if !@HAVE_CANONICALIZE_FILE_NAME@
-_GL_FUNCDECL_SYS (canonicalize_file_name, char *, (const char *name)
-                                                  _GL_ARG_NONNULL ((1)));
+#  if !@HAVE_CANONICALIZE_FILE_NAME@ || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (canonicalize_file_name, char *,
+                  (const char *name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 #  endif
 _GL_CXXALIAS_SYS (canonicalize_file_name, char *, (const char *name));
 # endif
+# ifndef GNULIB_defined_canonicalize_file_name
+#  define GNULIB_defined_canonicalize_file_name \
+     (!@HAVE_CANONICALIZE_FILE_NAME@ || @REPLACE_CANONICALIZE_FILE_NAME@)
+# endif
 _GL_CXXALIASWARN (canonicalize_file_name);
-#elif defined GNULIB_POSIXCHECK
-# undef canonicalize_file_name
-# if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
+#else
+# if @GNULIB_FREE_POSIX@ && __GNUC__ >= 11 && !defined canonicalize_file_name
+/* For -Wmismatched-dealloc: Associate canonicalize_file_name with free or
+   rpl_free.  */
+_GL_FUNCDECL_SYS (canonicalize_file_name, char *,
+                  (const char *name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef canonicalize_file_name
+#  if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
 _GL_WARN_ON_USE (canonicalize_file_name,
                  "canonicalize_file_name is unportable - "
                  "use gnulib module canonicalize-lgpl for portability");
+#  endif
+# endif
+#endif
+
+#if @GNULIB_MDA_ECVT@
+/* On native Windows, map 'ecvt' to '_ecvt', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::ecvt on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef ecvt
+#   define ecvt _ecvt
+#  endif
+_GL_CXXALIAS_MDA (ecvt, char *,
+                  (double number, int ndigits, int *decptp, int *signp));
+# else
+#  if @HAVE_DECL_ECVT@
+_GL_CXXALIAS_SYS (ecvt, char *,
+                  (double number, int ndigits, int *decptp, int *signp));
+#  endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_ECVT@
+_GL_CXXALIASWARN (ecvt);
+# endif
+#endif
+
+#if @GNULIB_MDA_FCVT@
+/* On native Windows, map 'fcvt' to '_fcvt', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::fcvt on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fcvt
+#   define fcvt _fcvt
+#  endif
+_GL_CXXALIAS_MDA (fcvt, char *,
+                  (double number, int ndigits, int *decptp, int *signp));
+# else
+#  if @HAVE_DECL_FCVT@
+_GL_CXXALIAS_SYS (fcvt, char *,
+                  (double number, int ndigits, int *decptp, int *signp));
+#  endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_FCVT@
+_GL_CXXALIASWARN (fcvt);
+# endif
+#endif
+
+#if @GNULIB_MDA_GCVT@
+/* On native Windows, map 'gcvt' to '_gcvt', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::gcvt on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef gcvt
+#   define gcvt _gcvt
+#  endif
+_GL_CXXALIAS_MDA (gcvt, char *, (double number, int ndigits, char *buf));
+# else
+#  if @HAVE_DECL_GCVT@
+_GL_CXXALIAS_SYS (gcvt, char *, (double number, int ndigits, char *buf));
+#  endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_GCVT@
+_GL_CXXALIASWARN (gcvt);
 # endif
 #endif
 
@@ -285,19 +480,35 @@
 #   undef malloc
 #   define malloc rpl_malloc
 #  endif
-_GL_FUNCDECL_RPL (malloc, void *, (size_t size));
+_GL_FUNCDECL_RPL (malloc, void *,
+                  (size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (malloc, void *, (size_t size));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate malloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (malloc, void *,
+                  (size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#  endif
 _GL_CXXALIAS_SYS (malloc, void *, (size_t size));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (malloc);
 # endif
-#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
-# undef malloc
+#else
+# if @GNULIB_FREE_POSIX@ && __GNUC__ >= 11 && !defined malloc
+/* For -Wmismatched-dealloc: Associate malloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (malloc, void *,
+                  (size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+#  undef malloc
 /* Assume malloc is always declared.  */
 _GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - "
                  "use gnulib module malloc-posix for portability");
+# endif
 #endif
 
 /* Convert a multibyte character to a wide character.  */
@@ -307,13 +518,17 @@
 #   undef mbtowc
 #   define mbtowc rpl_mbtowc
 #  endif
-_GL_FUNCDECL_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
-_GL_CXXALIAS_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+_GL_FUNCDECL_RPL (mbtowc, int,
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n));
+_GL_CXXALIAS_RPL (mbtowc, int,
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n));
 # else
 #  if !@HAVE_MBTOWC@
-_GL_FUNCDECL_SYS (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+_GL_FUNCDECL_SYS (mbtowc, int,
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n));
 #  endif
-_GL_CXXALIAS_SYS (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+_GL_CXXALIAS_SYS (mbtowc, int,
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (mbtowc);
@@ -458,6 +673,51 @@
 # endif
 #endif
 
+#if @GNULIB_MDA_MKTEMP@
+/* On native Windows, map 'mktemp' to '_mktemp', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::mktemp always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef mktemp
+#   define mktemp _mktemp
+#  endif
+_GL_CXXALIAS_MDA (mktemp, char *, (char * /*template*/));
+# else
+_GL_CXXALIAS_SYS (mktemp, char *, (char * /*template*/));
+# endif
+_GL_CXXALIASWARN (mktemp);
+#endif
+
+/* Allocate memory with indefinite extent and specified alignment.  */
+#if @GNULIB_POSIX_MEMALIGN@
+# if @REPLACE_POSIX_MEMALIGN@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef posix_memalign
+#   define posix_memalign rpl_posix_memalign
+#  endif
+_GL_FUNCDECL_RPL (posix_memalign, int,
+                  (void **memptr, size_t alignment, size_t size)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_memalign, int,
+                  (void **memptr, size_t alignment, size_t size));
+# else
+#  if @HAVE_POSIX_MEMALIGN@
+_GL_CXXALIAS_SYS (posix_memalign, int,
+                  (void **memptr, size_t alignment, size_t size));
+#  endif
+# endif
+# if @HAVE_POSIX_MEMALIGN@
+_GL_CXXALIASWARN (posix_memalign);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_memalign
+# if HAVE_RAW_DECL_POSIX_MEMALIGN
+_GL_WARN_ON_USE (posix_memalign, "posix_memalign is not portable - "
+                 "use gnulib module posix_memalign for portability");
+# endif
+#endif
+
 #if @GNULIB_POSIX_OPENPT@
 /* Return an FD open to the master side of a pseudo-terminal.  Flags should
    include O_RDWR, and may also include O_NOCTTY.  */
@@ -516,6 +776,9 @@
 #  endif
 _GL_CXXALIAS_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
 # endif
+# ifndef GNULIB_defined_ptsname_r
+#  define GNULIB_defined_ptsname_r (!@HAVE_PTSNAME_R@ || @REPLACE_PTSNAME_R@)
+# endif
 _GL_CXXALIASWARN (ptsname_r);
 #elif defined GNULIB_POSIXCHECK
 # undef ptsname_r
@@ -533,6 +796,28 @@
 #  endif
 _GL_FUNCDECL_RPL (putenv, int, (char *string) _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (putenv, int, (char *string));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef putenv
+#   define putenv _putenv
+#  endif
+_GL_CXXALIAS_MDA (putenv, int, (char *string));
+# else
+_GL_CXXALIAS_SYS (putenv, int, (char *string));
+# endif
+_GL_CXXALIASWARN (putenv);
+#elif @GNULIB_MDA_PUTENV@
+/* On native Windows, map 'putenv' to '_putenv', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::putenv always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef putenv
+#   define putenv _putenv
+#  endif
+/* Need to cast, because on mingw, the parameter is either
+   'const char *string' or 'char *string'.  */
+_GL_CXXALIAS_MDA_CAST (putenv, int, (char *string));
 # else
 _GL_CXXALIAS_SYS (putenv, int, (char *string));
 # endif
@@ -599,7 +884,9 @@
 #  if !@HAVE_RANDOM@
 _GL_FUNCDECL_SYS (random, long, (void));
 #  endif
-_GL_CXXALIAS_SYS (random, long, (void));
+/* Need to cast, because on Haiku, the return type is
+                               int.  */
+_GL_CXXALIAS_SYS_CAST (random, long, (void));
 # endif
 _GL_CXXALIASWARN (random);
 #elif defined GNULIB_POSIXCHECK
@@ -766,9 +1053,11 @@
                    struct random_data *rand_state)
                   _GL_ARG_NONNULL ((2, 4)));
 #  endif
-_GL_CXXALIAS_SYS (initstate_r, int,
-                  (unsigned int seed, char *buf, size_t buf_size,
-                   struct random_data *rand_state));
+/* Need to cast, because on Haiku, the third parameter is
+                                                     unsigned long buf_size.  */
+_GL_CXXALIAS_SYS_CAST (initstate_r, int,
+                       (unsigned int seed, char *buf, size_t buf_size,
+                        struct random_data *rand_state));
 # endif
 _GL_CXXALIASWARN (initstate_r);
 #elif defined GNULIB_POSIXCHECK
@@ -796,8 +1085,10 @@
                   (char *arg_state, struct random_data *rand_state)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
-_GL_CXXALIAS_SYS (setstate_r, int,
-                  (char *arg_state, struct random_data *rand_state));
+/* Need to cast, because on Haiku, the first parameter is
+                        void *arg_state.  */
+_GL_CXXALIAS_SYS_CAST (setstate_r, int,
+                       (char *arg_state, struct random_data *rand_state));
 # endif
 _GL_CXXALIASWARN (setstate_r);
 #elif defined GNULIB_POSIXCHECK
@@ -816,29 +1107,53 @@
 #   undef realloc
 #   define realloc rpl_realloc
 #  endif
-_GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size));
+_GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size)
+                                   _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (realloc, void *, (void *ptr, size_t size));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate realloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (realloc, void *, (void *ptr, size_t size)
+                                   _GL_ATTRIBUTE_DEALLOC_FREE);
+#  endif
 _GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (realloc);
 # endif
-#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
-# undef realloc
+#else
+# if @GNULIB_FREE_POSIX@ && __GNUC__ >= 11 && !defined realloc
+/* For -Wmismatched-dealloc: Associate realloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (realloc, void *, (void *ptr, size_t size)
+                                   _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+#  undef realloc
 /* Assume realloc is always declared.  */
 _GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - "
                  "use gnulib module realloc-posix for portability");
+# endif
 #endif
 
 
 #if @GNULIB_REALLOCARRAY@
-# if ! @HAVE_REALLOCARRAY@
+# if @REPLACE_REALLOCARRAY@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef reallocarray
+#   define reallocarray rpl_reallocarray
+#  endif
+_GL_FUNCDECL_RPL (reallocarray, void *,
+                  (void *ptr, size_t nmemb, size_t size));
+_GL_CXXALIAS_RPL (reallocarray, void *,
+                  (void *ptr, size_t nmemb, size_t size));
+# else
+#  if ! @HAVE_REALLOCARRAY@
 _GL_FUNCDECL_SYS (reallocarray, void *,
                   (void *ptr, size_t nmemb, size_t size));
-# endif
+#  endif
 _GL_CXXALIAS_SYS (reallocarray, void *,
                   (void *ptr, size_t nmemb, size_t size));
+# endif
 _GL_CXXALIASWARN (reallocarray);
 #elif defined GNULIB_POSIXCHECK
 # undef reallocarray
@@ -853,15 +1168,19 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define realpath rpl_realpath
 #  endif
-_GL_FUNCDECL_RPL (realpath, char *, (const char *name, char *resolved)
-                                    _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (realpath, char *, (const char *name, char *resolved));
+_GL_FUNCDECL_RPL (realpath, char *,
+                  (const char *restrict name, char *restrict resolved)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (realpath, char *,
+                  (const char *restrict name, char *restrict resolved));
 # else
 #  if !@HAVE_REALPATH@
-_GL_FUNCDECL_SYS (realpath, char *, (const char *name, char *resolved)
-                                    _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_SYS (realpath, char *,
+                  (const char *restrict name, char *restrict resolved)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (realpath, char *, (const char *name, char *resolved));
+_GL_CXXALIAS_SYS (realpath, char *,
+                  (const char *restrict name, char *restrict resolved));
 # endif
 _GL_CXXALIASWARN (realpath);
 #elif defined GNULIB_POSIXCHECK
@@ -944,15 +1263,19 @@
 #   define strtod rpl_strtod
 #  endif
 #  define GNULIB_defined_strtod_function 1
-_GL_FUNCDECL_RPL (strtod, double, (const char *str, char **endp)
-                                  _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtod, double, (const char *str, char **endp));
+_GL_FUNCDECL_RPL (strtod, double,
+                  (const char *restrict str, char **restrict endp)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtod, double,
+                  (const char *restrict str, char **restrict endp));
 # else
 #  if !@HAVE_STRTOD@
-_GL_FUNCDECL_SYS (strtod, double, (const char *str, char **endp)
-                                  _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_SYS (strtod, double,
+                  (const char *restrict str, char **restrict endp)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (strtod, double, (const char *str, char **endp));
+_GL_CXXALIAS_SYS (strtod, double,
+                  (const char *restrict str, char **restrict endp));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (strtod);
@@ -972,15 +1295,19 @@
 #   define strtold rpl_strtold
 #  endif
 #  define GNULIB_defined_strtold_function 1
-_GL_FUNCDECL_RPL (strtold, long double, (const char *str, char **endp)
-                                        _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtold, long double, (const char *str, char **endp));
+_GL_FUNCDECL_RPL (strtold, long double,
+                  (const char *restrict str, char **restrict endp)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtold, long double,
+                  (const char *restrict str, char **restrict endp));
 # else
 #  if !@HAVE_STRTOLD@
-_GL_FUNCDECL_SYS (strtold, long double, (const char *str, char **endp)
-                                        _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_SYS (strtold, long double,
+                  (const char *restrict str, char **restrict endp)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (strtold, long double, (const char *str, char **endp));
+_GL_CXXALIAS_SYS (strtold, long double,
+                  (const char *restrict str, char **restrict endp));
 # endif
 _GL_CXXALIASWARN (strtold);
 #elif defined GNULIB_POSIXCHECK
@@ -991,6 +1318,47 @@
 # endif
 #endif
 
+#if @GNULIB_STRTOL@
+/* Parse a signed integer whose textual representation starts at STRING.
+   The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+   it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+   "0x").
+   If ENDPTR is not NULL, the address of the first byte after the integer is
+   stored in *ENDPTR.
+   Upon overflow, the return value is LONG_MAX or LONG_MIN, and errno is set
+   to ERANGE.  */
+# if @REPLACE_STRTOL@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtol rpl_strtol
+#  endif
+#  define GNULIB_defined_strtol_function 1
+_GL_FUNCDECL_RPL (strtol, long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtol, long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# else
+#  if !@HAVE_STRTOL@
+_GL_FUNCDECL_SYS (strtol, long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strtol, long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# endif
+_GL_CXXALIASWARN (strtol);
+#elif defined GNULIB_POSIXCHECK
+# undef strtol
+# if HAVE_RAW_DECL_STRTOL
+_GL_WARN_ON_USE (strtol, "strtol is unportable - "
+                 "use gnulib module strtol for portability");
+# endif
+#endif
+
 #if @GNULIB_STRTOLL@
 /* Parse a signed integer whose textual representation starts at STRING.
    The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
@@ -1000,13 +1368,29 @@
    stored in *ENDPTR.
    Upon overflow, the return value is LLONG_MAX or LLONG_MIN, and errno is set
    to ERANGE.  */
-# if !@HAVE_STRTOLL@
-_GL_FUNCDECL_SYS (strtoll, long long,
-                  (const char *string, char **endptr, int base)
+# if @REPLACE_STRTOLL@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtoll rpl_strtoll
+#  endif
+#  define GNULIB_defined_strtoll_function 1
+_GL_FUNCDECL_RPL (strtoll, long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
                   _GL_ARG_NONNULL ((1)));
-# endif
+_GL_CXXALIAS_RPL (strtoll, long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# else
+#  if !@HAVE_STRTOLL@
+_GL_FUNCDECL_SYS (strtoll, long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
 _GL_CXXALIAS_SYS (strtoll, long long,
-                  (const char *string, char **endptr, int base));
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# endif
 _GL_CXXALIASWARN (strtoll);
 #elif defined GNULIB_POSIXCHECK
 # undef strtoll
@@ -1016,6 +1400,46 @@
 # endif
 #endif
 
+#if @GNULIB_STRTOUL@
+/* Parse an unsigned integer whose textual representation starts at STRING.
+   The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+   it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+   "0x").
+   If ENDPTR is not NULL, the address of the first byte after the integer is
+   stored in *ENDPTR.
+   Upon overflow, the return value is ULONG_MAX, and errno is set to ERANGE.  */
+# if @REPLACE_STRTOUL@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtoul rpl_strtoul
+#  endif
+#  define GNULIB_defined_strtoul_function 1
+_GL_FUNCDECL_RPL (strtoul, unsigned long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoul, unsigned long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# else
+#  if !@HAVE_STRTOUL@
+_GL_FUNCDECL_SYS (strtoul, unsigned long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strtoul, unsigned long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# endif
+_GL_CXXALIASWARN (strtoul);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoul
+# if HAVE_RAW_DECL_STRTOUL
+_GL_WARN_ON_USE (strtoul, "strtoul is unportable - "
+                 "use gnulib module strtoul for portability");
+# endif
+#endif
+
 #if @GNULIB_STRTOULL@
 /* Parse an unsigned integer whose textual representation starts at STRING.
    The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
@@ -1025,13 +1449,29 @@
    stored in *ENDPTR.
    Upon overflow, the return value is ULLONG_MAX, and errno is set to
    ERANGE.  */
-# if !@HAVE_STRTOULL@
-_GL_FUNCDECL_SYS (strtoull, unsigned long long,
-                  (const char *string, char **endptr, int base)
+# if @REPLACE_STRTOULL@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtoull rpl_strtoull
+#  endif
+#  define GNULIB_defined_strtoull_function 1
+_GL_FUNCDECL_RPL (strtoull, unsigned long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
                   _GL_ARG_NONNULL ((1)));
-# endif
+_GL_CXXALIAS_RPL (strtoull, unsigned long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# else
+#  if !@HAVE_STRTOULL@
+_GL_FUNCDECL_SYS (strtoull, unsigned long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
 _GL_CXXALIAS_SYS (strtoull, unsigned long long,
-                  (const char *string, char **endptr, int base));
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# endif
 _GL_CXXALIASWARN (strtoull);
 #elif defined GNULIB_POSIXCHECK
 # undef strtoull
diff --git a/lib/stpcpy.c b/lib/stpcpy.c
index a1d32fd..c312fe4 100644
--- a/lib/stpcpy.c
+++ b/lib/stpcpy.c
@@ -1,21 +1,21 @@
 /* stpcpy.c -- copy a string and return pointer to end of new string
-   Copyright (C) 1992, 1995, 1997-1998, 2006, 2009-2019 Free Software
+   Copyright (C) 1992, 1995, 1997-1998, 2006, 2009-2021 Free Software
    Foundation, Inc.
 
    NOTE: The canonical source of this file is maintained with the GNU C Library.
    Bugs can be reported to bug-glibc@prep.ai.mit.edu.
 
-   This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 3 of the License, or any
-   later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/stpncpy.c b/lib/stpncpy.c
new file mode 100644
index 0000000..c3096b3
--- /dev/null
+++ b/lib/stpncpy.c
@@ -0,0 +1,92 @@
+/* Copyright (C) 1993, 1995-1997, 2002-2003, 2005-2007, 2009-2021 Free Software
+ * Foundation, Inc.
+
+   NOTE: The canonical source of this file is maintained with the GNU C Library.
+   Bugs can be reported to bug-glibc@gnu.org.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* This is almost copied from strncpy.c, written by Torbjorn Granlund.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <string.h>
+
+#ifndef weak_alias
+# define __stpncpy stpncpy
+#endif
+
+/* Copy no more than N bytes of SRC to DST, returning a pointer past the
+   last non-NUL byte written into DST.  */
+char *
+(__stpncpy) (char *dest, const char *src, size_t n)
+{
+  char c;
+  char *s = dest;
+
+  if (n >= 4)
+    {
+      size_t n4 = n >> 2;
+
+      for (;;)
+        {
+          c = *src++;
+          *dest++ = c;
+          if (c == '\0')
+            break;
+          c = *src++;
+          *dest++ = c;
+          if (c == '\0')
+            break;
+          c = *src++;
+          *dest++ = c;
+          if (c == '\0')
+            break;
+          c = *src++;
+          *dest++ = c;
+          if (c == '\0')
+            break;
+          if (--n4 == 0)
+            goto last_chars;
+        }
+      n -= dest - s;
+      goto zero_fill;
+    }
+
+ last_chars:
+  n &= 3;
+  if (n == 0)
+    return dest;
+
+  for (;;)
+    {
+      c = *src++;
+      --n;
+      *dest++ = c;
+      if (c == '\0')
+        break;
+      if (n == 0)
+        return dest;
+    }
+
+ zero_fill:
+  while (n-- > 0)
+    dest[n] = '\0';
+
+  return dest - 1;
+}
+#ifdef weak_alias
+weak_alias (__stpncpy, stpncpy)
+#endif
diff --git a/lib/strchrnul.c b/lib/strchrnul.c
index 0f5dd81..7a69a4b 100644
--- a/lib/strchrnul.c
+++ b/lib/strchrnul.c
@@ -1,17 +1,17 @@
 /* Searching in a string.
-   Copyright (C) 2003, 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/strchrnul.valgrind b/lib/strchrnul.valgrind
index 781d037..85d2170 100644
--- a/lib/strchrnul.valgrind
+++ b/lib/strchrnul.valgrind
@@ -1,18 +1,18 @@
 # Suppress a valgrind message about use of uninitialized memory in strchrnul().
 
-# Copyright (C) 2008-2019 Free Software Foundation, Inc.
+# Copyright (C) 2008-2021 Free Software Foundation, Inc.
 #
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
+# This file is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of the
+# License, or (at your option) any later version.
 #
-# This program is distributed in the hope that it will be useful,
+# This file is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
+# GNU Lesser General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License
+# You should have received a copy of the GNU Lesser General Public License
 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 # This use is OK because it provides only a speedup.
diff --git a/lib/strdup.c b/lib/strdup.c
index 717cf65..e5d4d75 100644
--- a/lib/strdup.c
+++ b/lib/strdup.c
@@ -1,20 +1,20 @@
-/* Copyright (C) 1991, 1996-1998, 2002-2004, 2006-2007, 2009-2019 Free Software
+/* Copyright (C) 1991, 1996-1998, 2002-2004, 2006-2007, 2009-2021 Free Software
    Foundation, Inc.
 
    This file is part of the GNU C Library.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _LIBC
 # include <config.h>
diff --git a/lib/streq.h b/lib/streq.h
index 326537b..adabd15 100644
--- a/lib/streq.h
+++ b/lib/streq.h
@@ -1,17 +1,17 @@
 /* Optimized string comparison.
-   Copyright (C) 2001-2002, 2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2002, 2007, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>.  */
@@ -29,7 +29,7 @@
 
 /* Help GCC to generate good code for string comparisons with
    immediate strings. */
-#if defined (__GNUC__) && defined (__OPTIMIZE__)
+#if (defined __GNUC__ || defined __clang__) && defined __OPTIMIZE__
 
 static inline int
 streq9 (const char *s1, const char *s2)
diff --git a/lib/strerror-override.c b/lib/strerror-override.c
index 558a010..e76d55d 100644
--- a/lib/strerror-override.c
+++ b/lib/strerror-override.c
@@ -1,18 +1,18 @@
 /* strerror-override.c --- POSIX compatible system error routine
 
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2010.  */
@@ -29,6 +29,8 @@
 # endif
 #endif
 
+#if !GNULIB_defined_strerror_override_macro
+
 /* If ERRNUM maps to an errno value defined by gnulib, return a string
    describing the error.  Otherwise return NULL.  */
 const char *
@@ -37,12 +39,12 @@
   /* These error messages are taken from glibc/sysdeps/gnu/errlist.c.  */
   switch (errnum)
     {
-#if REPLACE_STRERROR_0
+# if REPLACE_STRERROR_0
     case 0:
       return "Success";
-#endif
+# endif
 
-#if GNULIB_defined_ESOCK /* native Windows platforms with older <errno.h> */
+# if GNULIB_defined_ESOCK /* native Windows platforms with older <errno.h> */
     case EINPROGRESS:
       return "Operation now in progress";
     case EALREADY:
@@ -89,8 +91,8 @@
       return "No route to host";
     case EWOULDBLOCK:
       return "Operation would block";
-#endif
-#if GNULIB_defined_ESTREAMS /* native Windows platforms with older <errno.h> */
+# endif
+# if GNULIB_defined_ESTREAMS /* native Windows platforms with older <errno.h> */
     case ETXTBSY:
       return "Text file busy";
     case ENODATA:
@@ -103,8 +105,8 @@
       return "Timer expired";
     case EOTHER:
       return "Other error";
-#endif
-#if GNULIB_defined_EWINSOCK /* native Windows platforms */
+# endif
+# if GNULIB_defined_EWINSOCK /* native Windows platforms */
     case ESOCKTNOSUPPORT:
       return "Socket type not supported";
     case EPFNOSUPPORT:
@@ -125,7 +127,7 @@
       return "Stale NFS file handle";
     case EREMOTE:
       return "Object is remote";
-# if HAVE_WINSOCK2_H
+#  if HAVE_WINSOCK2_H
       /* WSA_INVALID_HANDLE maps to EBADF */
       /* WSA_NOT_ENOUGH_MEMORY maps to ENOMEM */
       /* WSA_INVALID_PARAMETER maps to EINVAL */
@@ -213,90 +215,92 @@
     case WSANO_DATA:
       return "Valid name, no data record of requested type";
       /* WSA_QOS_* omitted */
+#  endif
 # endif
-#endif
 
-#if GNULIB_defined_ENOMSG
+# if GNULIB_defined_ENOMSG
     case ENOMSG:
       return "No message of desired type";
-#endif
+# endif
 
-#if GNULIB_defined_EIDRM
+# if GNULIB_defined_EIDRM
     case EIDRM:
       return "Identifier removed";
-#endif
+# endif
 
-#if GNULIB_defined_ENOLINK
+# if GNULIB_defined_ENOLINK
     case ENOLINK:
       return "Link has been severed";
-#endif
+# endif
 
-#if GNULIB_defined_EPROTO
+# if GNULIB_defined_EPROTO
     case EPROTO:
       return "Protocol error";
-#endif
+# endif
 
-#if GNULIB_defined_EMULTIHOP
+# if GNULIB_defined_EMULTIHOP
     case EMULTIHOP:
       return "Multihop attempted";
-#endif
+# endif
 
-#if GNULIB_defined_EBADMSG
+# if GNULIB_defined_EBADMSG
     case EBADMSG:
       return "Bad message";
-#endif
+# endif
 
-#if GNULIB_defined_EOVERFLOW
+# if GNULIB_defined_EOVERFLOW
     case EOVERFLOW:
       return "Value too large for defined data type";
-#endif
+# endif
 
-#if GNULIB_defined_ENOTSUP
+# if GNULIB_defined_ENOTSUP
     case ENOTSUP:
       return "Not supported";
-#endif
+# endif
 
-#if GNULIB_defined_ENETRESET
+# if GNULIB_defined_ENETRESET
     case ENETRESET:
       return "Network dropped connection on reset";
-#endif
+# endif
 
-#if GNULIB_defined_ECONNABORTED
+# if GNULIB_defined_ECONNABORTED
     case ECONNABORTED:
       return "Software caused connection abort";
-#endif
+# endif
 
-#if GNULIB_defined_ESTALE
+# if GNULIB_defined_ESTALE
     case ESTALE:
       return "Stale NFS file handle";
-#endif
+# endif
 
-#if GNULIB_defined_EDQUOT
+# if GNULIB_defined_EDQUOT
     case EDQUOT:
       return "Disk quota exceeded";
-#endif
+# endif
 
-#if GNULIB_defined_ECANCELED
+# if GNULIB_defined_ECANCELED
     case ECANCELED:
       return "Operation canceled";
-#endif
+# endif
 
-#if GNULIB_defined_EOWNERDEAD
+# if GNULIB_defined_EOWNERDEAD
     case EOWNERDEAD:
       return "Owner died";
-#endif
+# endif
 
-#if GNULIB_defined_ENOTRECOVERABLE
+# if GNULIB_defined_ENOTRECOVERABLE
     case ENOTRECOVERABLE:
       return "State not recoverable";
-#endif
+# endif
 
-#if GNULIB_defined_EILSEQ
+# if GNULIB_defined_EILSEQ
     case EILSEQ:
       return "Invalid or incomplete multibyte or wide character";
-#endif
+# endif
 
     default:
       return NULL;
     }
 }
+
+#endif
diff --git a/lib/strerror-override.h b/lib/strerror-override.h
index 255febc..9cfc5ad 100644
--- a/lib/strerror-override.h
+++ b/lib/strerror-override.h
@@ -1,18 +1,18 @@
 /* strerror-override.h --- POSIX compatible system error routine
 
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_STRERROR_OVERRIDE_H
@@ -51,6 +51,7 @@
 extern const char *strerror_override (int errnum) _GL_ATTRIBUTE_CONST;
 # else
 #  define strerror_override(ignored) NULL
+#  define GNULIB_defined_strerror_override_macro 1
 # endif
 
 #endif /* _GL_STRERROR_OVERRIDE_H */
diff --git a/lib/strerror.c b/lib/strerror.c
index f5900fd..83926df 100644
--- a/lib/strerror.c
+++ b/lib/strerror.c
@@ -1,18 +1,18 @@
 /* strerror.c --- POSIX compatible system error routine
 
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/strerror_r.c b/lib/strerror_r.c
index 85b9c6b..90043c2 100644
--- a/lib/strerror_r.c
+++ b/lib/strerror_r.c
@@ -1,18 +1,18 @@
 /* strerror_r.c --- POSIX compatible system error routine
 
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2010.  */
@@ -34,33 +34,26 @@
 
 #include "strerror-override.h"
 
-#if (__GLIBC__ >= 2 || defined __UCLIBC__ || defined __CYGWIN__) && HAVE___XPG_STRERROR_R /* glibc >= 2.3.4, cygwin >= 1.7.9 */
+#if STRERROR_R_CHAR_P
 
-# define USE_XPG_STRERROR_R 1
-extern
-#ifdef __cplusplus
-"C"
-#endif
-int __xpg_strerror_r (int errnum, char *buf, size_t buflen);
+# if HAVE___XPG_STRERROR_R
+_GL_EXTERN_C int __xpg_strerror_r (int errnum, char *buf, size_t buflen);
+# endif
 
-#elif HAVE_DECL_STRERROR_R && !(__GLIBC__ >= 2 || defined __UCLIBC__ || defined __CYGWIN__)
+#elif HAVE_DECL_STRERROR_R
 
-/* The system's strerror_r function is OK, except that its third argument
+/* The system's strerror_r function's API is OK, except that its third argument
    is 'int', not 'size_t', or its return type is wrong.  */
 
 # include <limits.h>
 
-# define USE_SYSTEM_STRERROR_R 1
-
-#else /* (__GLIBC__ >= 2 || defined __UCLIBC__ || defined __CYGWIN__ ? !HAVE___XPG_STRERROR_R : !HAVE_DECL_STRERROR_R) */
+#else
 
 /* Use the system's strerror().  Exclude glibc and cygwin because the
    system strerror_r has the wrong return type, and cygwin 1.7.9
    strerror_r clobbers strerror.  */
 # undef strerror
 
-# define USE_SYSTEM_STRERROR 1
-
 # if defined __NetBSD__ || defined __hpux || (defined _WIN32 && !defined __CYGWIN__) || defined __sgi || (defined __sun && !defined _LP64) || defined __CYGWIN__
 
 /* No locking needed.  */
@@ -120,6 +113,7 @@
     buf[buflen - 1] = '\0';
   return result;
 }
+# undef snprintf
 # define snprintf local_snprintf
 #endif
 
@@ -165,22 +159,28 @@
     int ret;
     int saved_errno = errno;
 
-#if USE_XPG_STRERROR_R
+#if STRERROR_R_CHAR_P
 
     {
+      ret = 0;
+
+# if HAVE___XPG_STRERROR_R
       ret = __xpg_strerror_r (errnum, buf, buflen);
       if (ret < 0)
         ret = errno;
+# endif
+
       if (!*buf)
         {
           /* glibc 2.13 would not touch buf on err, so we have to fall
              back to GNU strerror_r which always returns a thread-safe
              untruncated string to (partially) copy into our buf.  */
-          safe_copy (buf, buflen, strerror_r (errnum, buf, buflen));
+          char *errstring = strerror_r (errnum, buf, buflen);
+          ret = errstring ? safe_copy (buf, buflen, errstring) : errno;
         }
     }
 
-#elif USE_SYSTEM_STRERROR_R
+#elif HAVE_DECL_STRERROR_R
 
     if (buflen > INT_MAX)
       buflen = INT_MAX;
@@ -244,7 +244,7 @@
       }
 # endif
 
-#else /* USE_SYSTEM_STRERROR */
+#else /* strerror_r is not declared.  */
 
     /* Try to do what strerror (errnum) does, but without clobbering the
        buffer used by strerror().  */
diff --git a/lib/string.in.h b/lib/string.in.h
index 9b8ced2..8977153 100644
--- a/lib/string.in.h
+++ b/lib/string.in.h
@@ -1,19 +1,19 @@
 /* A GNU-like <string.h>.
 
-   Copyright (C) 1995-1996, 2001-2019 Free Software Foundation, Inc.
+   Copyright (C) 1995-1996, 2001-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 @PRAGMA_SYSTEM_HEADER@
@@ -52,14 +52,6 @@
 # include <wchar.h>
 #endif
 
-/* The __attribute__ feature is available in gcc versions 2.5 and later.
-   The attribute __pure__ was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define _GL_ATTRIBUTE_PURE /* empty */
-#endif
-
 /* NetBSD 5.0 declares strsignal in <unistd.h>, not in <string.h>.  */
 /* But in any case avoid namespace pollution on glibc systems.  */
 #if (@GNULIB_STRSIGNAL@ || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \
@@ -67,12 +59,37 @@
 # include <unistd.h>
 #endif
 
+/* AIX 7.2 declares ffsl and ffsll in <strings.h>, not in <string.h>.  */
+/* But in any case avoid namespace pollution on glibc systems.  */
+#if ((@GNULIB_FFSL@ || @GNULIB_FFSLL@ || defined GNULIB_POSIXCHECK) \
+     && defined _AIX) \
+    && ! defined __GLIBC__
+# include <strings.h>
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The attribute __pure__ was added in gcc 2.96.  */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
+#endif
+
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 
+/* Declare 'free' if needed for _GL_ATTRIBUTE_DEALLOC_FREE.  */
+#if (@REPLACE_FREE@ && !defined free \
+     && !(defined __cplusplus && defined GNULIB_NAMESPACE))
+_GL_EXTERN_C void free (void *);
+# define free rpl_free
+#endif
+_GL_EXTERN_C void free (void *);
 
 /* Clear a block of memory.  The compiler will not delete a call to
    this function, even if the block is dead after the call.  */
@@ -108,10 +125,18 @@
 
 /* Find the index of the least-significant set bit.  */
 #if @GNULIB_FFSLL@
-# if !@HAVE_FFSLL@
+# if @REPLACE_FFSLL@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define ffsll rpl_ffsll
+#  endif
+_GL_FUNCDECL_RPL (ffsll, int, (long long int i));
+_GL_CXXALIAS_RPL (ffsll, int, (long long int i));
+# else
+#  if !@HAVE_FFSLL@
 _GL_FUNCDECL_SYS (ffsll, int, (long long int i));
-# endif
+#  endif
 _GL_CXXALIAS_SYS (ffsll, int, (long long int i));
+# endif
 _GL_CXXALIASWARN (ffsll);
 #elif defined GNULIB_POSIXCHECK
 # undef ffsll
@@ -121,10 +146,30 @@
 #endif
 
 
+#if @GNULIB_MDA_MEMCCPY@
+/* On native Windows, map 'memccpy' to '_memccpy', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::memccpy always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef memccpy
+#   define memccpy _memccpy
+#  endif
+_GL_CXXALIAS_MDA (memccpy, void *,
+                  (void *dest, const void *src, int c, size_t n));
+# else
+_GL_CXXALIAS_SYS (memccpy, void *,
+                  (void *dest, const void *src, int c, size_t n));
+# endif
+_GL_CXXALIASWARN (memccpy);
+#endif
+
+
 /* Return the first instance of C within N bytes of S, or NULL.  */
 #if @GNULIB_MEMCHR@
 # if @REPLACE_MEMCHR@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef memchr
 #   define memchr rpl_memchr
 #  endif
 _GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n)
@@ -132,11 +177,6 @@
                                   _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n));
 # else
-#  if ! @HAVE_MEMCHR@
-_GL_FUNCDECL_SYS (memchr, void *, (void const *__s, int __c, size_t __n)
-                                  _GL_ATTRIBUTE_PURE
-                                  _GL_ARG_NONNULL ((1)));
-#  endif
   /* On some systems, this function is defined as an overloaded function:
        extern "C" { const void * std::memchr (const void *, int, size_t); }
        extern "C++" { void * std::memchr (void *, int, size_t); }  */
@@ -332,9 +372,11 @@
    GB18030 and the character to be searched is a digit.  */
 # undef strchr
 /* Assume strchr is always declared.  */
-_GL_WARN_ON_USE (strchr, "strchr cannot work correctly on character strings "
-                 "in some multibyte locales - "
-                 "use mbschr if you care about internationalization");
+_GL_WARN_ON_USE_CXX (strchr,
+                     const char *, char *, (const char *, int),
+                     "strchr cannot work correctly on character strings "
+                     "in some multibyte locales - "
+                     "use mbschr if you care about internationalization");
 #endif
 
 /* Find the first occurrence of C in S or the final NUL byte.  */
@@ -383,24 +425,62 @@
 #   undef strdup
 #   define strdup rpl_strdup
 #  endif
-_GL_FUNCDECL_RPL (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_RPL (strdup, char *,
+                  (char const *__s)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (strdup, char *, (char const *__s));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strdup
+#   define strdup _strdup
+#  endif
+_GL_CXXALIAS_MDA (strdup, char *, (char const *__s));
 # else
 #  if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
     /* strdup exists as a function and as a macro.  Get rid of the macro.  */
 #   undef strdup
 #  endif
-#  if !(@HAVE_DECL_STRDUP@ || defined strdup)
-_GL_FUNCDECL_SYS (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
+#  if (!@HAVE_DECL_STRDUP@ || __GNUC__ >= 11) && !defined strdup
+_GL_FUNCDECL_SYS (strdup, char *,
+                  (char const *__s)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 #  endif
 _GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
 # endif
 _GL_CXXALIASWARN (strdup);
-#elif defined GNULIB_POSIXCHECK
-# undef strdup
-# if HAVE_RAW_DECL_STRDUP
+#else
+# if __GNUC__ >= 11 && !defined strdup
+/* For -Wmismatched-dealloc: Associate strdup with free or rpl_free.  */
+_GL_FUNCDECL_SYS (strdup, char *,
+                  (char const *__s)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef strdup
+#  if HAVE_RAW_DECL_STRDUP
 _GL_WARN_ON_USE (strdup, "strdup is unportable - "
                  "use gnulib module strdup for portability");
+#  endif
+# elif @GNULIB_MDA_STRDUP@
+/* On native Windows, map 'creat' to '_creat', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::strdup always.  */
+#  if defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef strdup
+#    define strdup _strdup
+#   endif
+_GL_CXXALIAS_MDA (strdup, char *, (char const *__s));
+#  else
+#   if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
+#    undef strdup
+#   endif
+_GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
+#  endif
+_GL_CXXALIASWARN (strdup);
 # endif
 #endif
 
@@ -411,11 +491,14 @@
 #   undef strncat
 #   define strncat rpl_strncat
 #  endif
-_GL_FUNCDECL_RPL (strncat, char *, (char *dest, const char *src, size_t n)
-                                   _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (strncat, char *, (char *dest, const char *src, size_t n));
+_GL_FUNCDECL_RPL (strncat, char *,
+                  (char *restrict dest, const char *restrict src, size_t n)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strncat, char *,
+                  (char *restrict dest, const char *restrict src, size_t n));
 # else
-_GL_CXXALIAS_SYS (strncat, char *, (char *dest, const char *src, size_t n));
+_GL_CXXALIAS_SYS (strncat, char *,
+                  (char *restrict dest, const char *restrict src, size_t n));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (strncat);
@@ -523,15 +606,19 @@
    locale encoding is GB18030 and one of the characters to be searched is a
    digit.  */
 #  undef strpbrk
-_GL_WARN_ON_USE (strpbrk, "strpbrk cannot work correctly on character strings "
-                 "in multibyte locales - "
-                 "use mbspbrk if you care about internationalization");
+_GL_WARN_ON_USE_CXX (strpbrk,
+                     const char *, char *, (const char *, const char *),
+                     "strpbrk cannot work correctly on character strings "
+                     "in multibyte locales - "
+                     "use mbspbrk if you care about internationalization");
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef strpbrk
 # if HAVE_RAW_DECL_STRPBRK
-_GL_WARN_ON_USE (strpbrk, "strpbrk is unportable - "
-                 "use gnulib module strpbrk for portability");
+_GL_WARN_ON_USE_CXX (strpbrk,
+                     const char *, char *, (const char *, const char *),
+                     "strpbrk is unportable - "
+                     "use gnulib module strpbrk for portability");
 # endif
 #endif
 
@@ -550,9 +637,11 @@
    GB18030 and the character to be searched is a digit.  */
 # undef strrchr
 /* Assume strrchr is always declared.  */
-_GL_WARN_ON_USE (strrchr, "strrchr cannot work correctly on character strings "
-                 "in some multibyte locales - "
-                 "use mbsrchr if you care about internationalization");
+_GL_WARN_ON_USE_CXX (strrchr,
+                     const char *, char *, (const char *, int),
+                     "strrchr cannot work correctly on character strings "
+                     "in some multibyte locales - "
+                     "use mbsrchr if you care about internationalization");
 #endif
 
 /* Search the next delimiter (char listed in DELIM) starting at *STRINGP.
@@ -966,7 +1055,8 @@
    Caveat: The identity of the delimiting character is lost.
 
    See also mbssep().  */
-_GL_EXTERN_C char * mbstok_r (char *string, const char *delim, char **save_ptr)
+_GL_EXTERN_C char * mbstok_r (char *restrict string, const char *delim,
+                              char **save_ptr)
      _GL_ARG_NONNULL ((2, 3));
 #endif
 
@@ -1021,6 +1111,60 @@
 # endif
 #endif
 
+/* Return the name of the system error code ERRNUM.  */
+#if @GNULIB_STRERRORNAME_NP@
+# if @REPLACE_STRERRORNAME_NP@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strerrorname_np
+#   define strerrorname_np rpl_strerrorname_np
+#  endif
+_GL_FUNCDECL_RPL (strerrorname_np, const char *, (int errnum));
+_GL_CXXALIAS_RPL (strerrorname_np, const char *, (int errnum));
+# else
+#  if !@HAVE_STRERRORNAME_NP@
+_GL_FUNCDECL_SYS (strerrorname_np, const char *, (int errnum));
+#  endif
+_GL_CXXALIAS_SYS (strerrorname_np, const char *, (int errnum));
+# endif
+_GL_CXXALIASWARN (strerrorname_np);
+#elif defined GNULIB_POSIXCHECK
+# undef strerrorname_np
+# if HAVE_RAW_DECL_STRERRORNAME_NP
+_GL_WARN_ON_USE (strerrorname_np, "strerrorname_np is unportable - "
+                 "use gnulib module strerrorname_np for portability");
+# endif
+#endif
+
+/* Return an abbreviation string for the signal number SIG.  */
+#if @GNULIB_SIGABBREV_NP@
+# if ! @HAVE_SIGABBREV_NP@
+_GL_FUNCDECL_SYS (sigabbrev_np, const char *, (int sig));
+# endif
+_GL_CXXALIAS_SYS (sigabbrev_np, const char *, (int sig));
+_GL_CXXALIASWARN (sigabbrev_np);
+#elif defined GNULIB_POSIXCHECK
+# undef sigabbrev_np
+# if HAVE_RAW_DECL_SIGABBREV_NP
+_GL_WARN_ON_USE (sigabbrev_np, "sigabbrev_np is unportable - "
+                 "use gnulib module sigabbrev_np for portability");
+# endif
+#endif
+
+/* Return an English description string for the signal number SIG.  */
+#if @GNULIB_SIGDESCR_NP@
+# if ! @HAVE_SIGDESCR_NP@
+_GL_FUNCDECL_SYS (sigdescr_np, const char *, (int sig));
+# endif
+_GL_CXXALIAS_SYS (sigdescr_np, const char *, (int sig));
+_GL_CXXALIASWARN (sigdescr_np);
+#elif defined GNULIB_POSIXCHECK
+# undef sigdescr_np
+# if HAVE_RAW_DECL_SIGDESCR_NP
+_GL_WARN_ON_USE (sigdescr_np, "sigdescr_np is unportable - "
+                 "use gnulib module sigdescr_np for portability");
+# endif
+#endif
+
 #if @GNULIB_STRSIGNAL@
 # if @REPLACE_STRSIGNAL@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
diff --git a/lib/strings.in.h b/lib/strings.in.h
new file mode 100644
index 0000000..07aed18
--- /dev/null
+++ b/lib/strings.in.h
@@ -0,0 +1,122 @@
+/* A substitute <strings.h>.
+
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _@GUARD_PREFIX@_STRINGS_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* Minix 3.1.8 has a bug: <sys/types.h> must be included before <strings.h>.
+   But avoid namespace pollution on glibc systems.  */
+#if defined __minix && !defined __GLIBC__
+# include <sys/types.h>
+#endif
+
+/* The include_next requires a split double-inclusion guard.  */
+#if @HAVE_STRINGS_H@
+# @INCLUDE_NEXT@ @NEXT_STRINGS_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_STRINGS_H
+#define _@GUARD_PREFIX@_STRINGS_H
+
+#if ! @HAVE_DECL_STRNCASECMP@
+/* Get size_t.  */
+# include <stddef.h>
+#endif
+
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+  /* Find the index of the least-significant set bit.  */
+#if @GNULIB_FFS@
+# if !@HAVE_FFS@
+_GL_FUNCDECL_SYS (ffs, int, (int i));
+# endif
+_GL_CXXALIAS_SYS (ffs, int, (int i));
+_GL_CXXALIASWARN (ffs);
+#elif defined GNULIB_POSIXCHECK
+# undef ffs
+# if HAVE_RAW_DECL_FFS
+_GL_WARN_ON_USE (ffs, "ffs is not portable - use the ffs module");
+# endif
+#endif
+
+/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
+   greater than zero if S1 is lexicographically less than, equal to or greater
+   than S2.
+   Note: This function does not work in multibyte locales.  */
+#if ! @HAVE_STRCASECMP@
+extern int strcasecmp (char const *s1, char const *s2)
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+#if defined GNULIB_POSIXCHECK
+/* strcasecmp() does not work with multibyte strings:
+   POSIX says that it operates on "strings", and "string" in POSIX is defined
+   as a sequence of bytes, not of characters.   */
+# undef strcasecmp
+# if HAVE_RAW_DECL_STRCASECMP
+_GL_WARN_ON_USE (strcasecmp, "strcasecmp cannot work correctly on character "
+                 "strings in multibyte locales - "
+                 "use mbscasecmp if you care about "
+                 "internationalization, or use c_strcasecmp , "
+                 "gnulib module c-strcase) if you want a locale "
+                 "independent function");
+# endif
+#endif
+
+/* Compare no more than N bytes of strings S1 and S2, ignoring case,
+   returning less than, equal to or greater than zero if S1 is
+   lexicographically less than, equal to or greater than S2.
+   Note: This function cannot work correctly in multibyte locales.  */
+#if ! @HAVE_DECL_STRNCASECMP@
+extern int strncasecmp (char const *s1, char const *s2, size_t n)
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+#if defined GNULIB_POSIXCHECK
+/* strncasecmp() does not work with multibyte strings:
+   POSIX says that it operates on "strings", and "string" in POSIX is defined
+   as a sequence of bytes, not of characters.  */
+# undef strncasecmp
+# if HAVE_RAW_DECL_STRNCASECMP
+_GL_WARN_ON_USE (strncasecmp, "strncasecmp cannot work correctly on character "
+                 "strings in multibyte locales - "
+                 "use mbsncasecmp or mbspcasecmp if you care about "
+                 "internationalization, or use c_strncasecmp , "
+                 "gnulib module c-strcase) if you want a locale "
+                 "independent function");
+# endif
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _@GUARD_PREFIX@_STRING_H */
+#endif /* _@GUARD_PREFIX@_STRING_H */
diff --git a/lib/stripslash.c b/lib/stripslash.c
index dfc15b4..99bfbe6 100644
--- a/lib/stripslash.c
+++ b/lib/stripslash.c
@@ -1,19 +1,19 @@
 /* stripslash.c -- remove redundant trailing slashes from a file name
 
-   Copyright (C) 1990, 2001, 2003-2006, 2009-2019 Free Software Foundation,
+   Copyright (C) 1990, 2001, 2003-2006, 2009-2021 Free Software Foundation,
    Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/strndup.c b/lib/strndup.c
index 5b74828..8e66f28 100644
--- a/lib/strndup.c
+++ b/lib/strndup.c
@@ -1,20 +1,20 @@
 /* A replacement function, for systems that lack strndup.
 
-   Copyright (C) 1996-1998, 2001-2003, 2005-2007, 2009-2019 Free Software
+   Copyright (C) 1996-1998, 2001-2003, 2005-2007, 2009-2021 Free Software
    Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 3, or (at your option) any
-   later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
diff --git a/lib/strnlen.c b/lib/strnlen.c
index 9fb6635..ded06ce 100644
--- a/lib/strnlen.c
+++ b/lib/strnlen.c
@@ -1,19 +1,19 @@
 /* Find the length of STRING, but scan at most MAXLEN characters.
-   Copyright (C) 2005-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2007, 2009-2021 Free Software Foundation, Inc.
    Written by Simon Josefsson.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
diff --git a/lib/strtod.c b/lib/strtod.c
new file mode 100644
index 0000000..1585498
--- /dev/null
+++ b/lib/strtod.c
@@ -0,0 +1,486 @@
+/* Copyright (C) 1991-1992, 1997, 1999, 2003, 2006, 2008-2021 Free Software
+   Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#if ! defined USE_LONG_DOUBLE
+# include <config.h>
+#endif
+
+/* Specification.  */
+#include <stdlib.h>
+
+#include <ctype.h>      /* isspace() */
+#include <errno.h>
+#include <float.h>      /* {DBL,LDBL}_{MIN,MAX} */
+#include <limits.h>     /* LONG_{MIN,MAX} */
+#include <locale.h>     /* localeconv() */
+#include <math.h>       /* NAN */
+#include <stdbool.h>
+#include <stdio.h>      /* sprintf() */
+#include <string.h>     /* strdup() */
+#if HAVE_NL_LANGINFO
+# include <langinfo.h>
+#endif
+
+#include "c-ctype.h"
+
+#undef MIN
+#undef MAX
+#ifdef USE_LONG_DOUBLE
+# define STRTOD strtold
+# define LDEXP ldexpl
+# if defined __hpux && defined __hppa
+   /* We cannot call strtold on HP-UX/hppa, because its return type is a struct,
+      not a 'long double'.  */
+#  define HAVE_UNDERLYING_STRTOD 0
+# elif STRTOLD_HAS_UNDERFLOW_BUG
+   /* strtold would not set errno=ERANGE upon underflow.  */
+#  define HAVE_UNDERLYING_STRTOD 0
+# else
+#  define HAVE_UNDERLYING_STRTOD HAVE_STRTOLD
+# endif
+# define DOUBLE long double
+# define MIN LDBL_MIN
+# define MAX LDBL_MAX
+# define L_(literal) literal##L
+#else
+# define STRTOD strtod
+# define LDEXP ldexp
+# define HAVE_UNDERLYING_STRTOD 1
+# define DOUBLE double
+# define MIN DBL_MIN
+# define MAX DBL_MAX
+# define L_(literal) literal
+#endif
+
+#if (defined USE_LONG_DOUBLE ? HAVE_LDEXPM_IN_LIBC : HAVE_LDEXP_IN_LIBC)
+# define USE_LDEXP 1
+#else
+# define USE_LDEXP 0
+#endif
+
+/* Return true if C is a space in the current locale, avoiding
+   problems with signed char and isspace.  */
+static bool
+locale_isspace (char c)
+{
+  unsigned char uc = c;
+  return isspace (uc) != 0;
+}
+
+/* Determine the decimal-point character according to the current locale.  */
+static char
+decimal_point_char (void)
+{
+  const char *point;
+  /* Determine it in a multithread-safe way.  We know nl_langinfo is
+     multithread-safe on glibc systems and Mac OS X systems, but is not required
+     to be multithread-safe by POSIX.  sprintf(), however, is multithread-safe.
+     localeconv() is rarely multithread-safe.  */
+#if HAVE_NL_LANGINFO && (__GLIBC__ || defined __UCLIBC__ || (defined __APPLE__ && defined __MACH__))
+  point = nl_langinfo (RADIXCHAR);
+#elif 1
+  char pointbuf[5];
+  sprintf (pointbuf, "%#.0f", 1.0);
+  point = &pointbuf[1];
+#else
+  point = localeconv () -> decimal_point;
+#endif
+  /* The decimal point is always a single byte: either '.' or ','.  */
+  return (point[0] != '\0' ? point[0] : '.');
+}
+
+#if !USE_LDEXP
+ #undef LDEXP
+ #define LDEXP dummy_ldexp
+ /* A dummy definition that will never be invoked.  */
+ static DOUBLE LDEXP (_GL_UNUSED DOUBLE x, _GL_UNUSED int exponent)
+ {
+   abort ();
+   return L_(0.0);
+ }
+#endif
+
+/* Return X * BASE**EXPONENT.  Return an extreme value and set errno
+   to ERANGE if underflow or overflow occurs.  */
+static DOUBLE
+scale_radix_exp (DOUBLE x, int radix, long int exponent)
+{
+  /* If RADIX == 10, this code is neither precise nor fast; it is
+     merely a straightforward and relatively portable approximation.
+     If N == 2, this code is precise on a radix-2 implementation,
+     albeit perhaps not fast if ldexp is not in libc.  */
+
+  long int e = exponent;
+
+  if (USE_LDEXP && radix == 2)
+    return LDEXP (x, e < INT_MIN ? INT_MIN : INT_MAX < e ? INT_MAX : e);
+  else
+    {
+      DOUBLE r = x;
+
+      if (r != 0)
+        {
+          if (e < 0)
+            {
+              while (e++ != 0)
+                {
+                  r /= radix;
+                  if (r == 0 && x != 0)
+                    {
+                      errno = ERANGE;
+                      break;
+                    }
+                }
+            }
+          else
+            {
+              while (e-- != 0)
+                {
+                  if (r < -MAX / radix)
+                    {
+                      errno = ERANGE;
+                      return -HUGE_VAL;
+                    }
+                  else if (MAX / radix < r)
+                    {
+                      errno = ERANGE;
+                      return HUGE_VAL;
+                    }
+                  else
+                    r *= radix;
+                }
+            }
+        }
+
+      return r;
+    }
+}
+
+/* Parse a number at NPTR; this is a bit like strtol (NPTR, ENDPTR)
+   except there are no leading spaces or signs or "0x", and ENDPTR is
+   nonnull.  The number uses a base BASE (either 10 or 16) fraction, a
+   radix RADIX (either 10 or 2) exponent, and exponent character
+   EXPCHAR.  BASE is RADIX**RADIX_MULTIPLIER.  */
+static DOUBLE
+parse_number (const char *nptr,
+              int base, int radix, int radix_multiplier, char radixchar,
+              char expchar,
+              char **endptr)
+{
+  const char *s = nptr;
+  const char *digits_start;
+  const char *digits_end;
+  const char *radixchar_ptr;
+  long int exponent;
+  DOUBLE num;
+
+  /* First, determine the start and end of the digit sequence.  */
+  digits_start = s;
+  radixchar_ptr = NULL;
+  for (;; ++s)
+    {
+      if (base == 16 ? c_isxdigit (*s) : c_isdigit (*s))
+        ;
+      else if (radixchar_ptr == NULL && *s == radixchar)
+        {
+          /* Record that we have found the decimal point.  */
+          radixchar_ptr = s;
+        }
+      else
+        /* Any other character terminates the digit sequence.  */
+        break;
+    }
+  digits_end = s;
+  /* Now radixchar_ptr == NULL or
+     digits_start <= radixchar_ptr < digits_end.  */
+
+  if (false)
+    { /* Unoptimized.  */
+      exponent =
+        (radixchar_ptr != NULL
+         ? - (long int) (digits_end - radixchar_ptr - 1)
+         : 0);
+    }
+  else
+    { /* Remove trailing zero digits.  This reduces rounding errors for
+         inputs such as 1.0000000000 or 10000000000e-10.  */
+      while (digits_end > digits_start)
+        {
+          if (digits_end - 1 == radixchar_ptr || *(digits_end - 1) == '0')
+            digits_end--;
+          else
+            break;
+        }
+      exponent =
+        (radixchar_ptr != NULL
+         ? (digits_end > radixchar_ptr
+            ? - (long int) (digits_end - radixchar_ptr - 1)
+            : (long int) (radixchar_ptr - digits_end))
+         : (long int) (s - digits_end));
+    }
+
+  /* Then, convert the digit sequence to a number.  */
+  {
+    const char *dp;
+    num = 0;
+    for (dp = digits_start; dp < digits_end; dp++)
+      if (dp != radixchar_ptr)
+        {
+          int digit;
+
+          /* Make sure that multiplication by BASE will not overflow.  */
+          if (!(num <= MAX / base))
+            {
+              /* The value of the digit and all subsequent digits don't matter,
+                 since we have already gotten as many digits as can be
+                 represented in a 'DOUBLE'.  This doesn't necessarily mean that
+                 the result will overflow: The exponent may reduce it to within
+                 range.  */
+              exponent +=
+                (digits_end - dp)
+                - (radixchar_ptr >= dp && radixchar_ptr < digits_end ? 1 : 0);
+              break;
+            }
+
+          /* Eat the next digit.  */
+          if (c_isdigit (*dp))
+            digit = *dp - '0';
+          else if (base == 16 && c_isxdigit (*dp))
+            digit = c_tolower (*dp) - ('a' - 10);
+          else
+            abort ();
+          num = num * base + digit;
+        }
+  }
+
+  exponent = exponent * radix_multiplier;
+
+  /* Finally, parse the exponent.  */
+  if (c_tolower (*s) == expchar && ! locale_isspace (s[1]))
+    {
+      /* Add any given exponent to the implicit one.  */
+      int saved_errno = errno;
+      char *end;
+      long int value = strtol (s + 1, &end, 10);
+      errno = saved_errno;
+
+      if (s + 1 != end)
+        {
+          /* Skip past the exponent, and add in the implicit exponent,
+             resulting in an extreme value on overflow.  */
+          s = end;
+          exponent =
+            (exponent < 0
+             ? (value < LONG_MIN - exponent ? LONG_MIN : exponent + value)
+             : (LONG_MAX - exponent < value ? LONG_MAX : exponent + value));
+        }
+    }
+
+  *endptr = (char *) s;
+  return scale_radix_exp (num, radix, exponent);
+}
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+   ICC 10.0 has a bug when optimizing the expression -zero.
+   The expression -MIN * MIN does not work when cross-compiling
+   to PowerPC on Mac OS X 10.5.  */
+static DOUBLE
+minus_zero (void)
+{
+#if defined __hpux || defined __sgi || defined __ICC
+  return -MIN * MIN;
+#else
+  return -0.0;
+#endif
+}
+
+/* Convert NPTR to a DOUBLE.  If ENDPTR is not NULL, a pointer to the
+   character after the last one used in the number is put in *ENDPTR.  */
+DOUBLE
+STRTOD (const char *nptr, char **endptr)
+#if HAVE_UNDERLYING_STRTOD
+# ifdef USE_LONG_DOUBLE
+#  undef strtold
+# else
+#  undef strtod
+# endif
+#else
+# undef STRTOD
+# define STRTOD(NPTR,ENDPTR) \
+   parse_number (NPTR, 10, 10, 1, radixchar, 'e', ENDPTR)
+#endif
+/* From here on, STRTOD refers to the underlying implementation.  It needs
+   to handle only finite unsigned decimal numbers with non-null ENDPTR.  */
+{
+  char radixchar;
+  bool negative = false;
+
+  /* The number so far.  */
+  DOUBLE num;
+
+  const char *s = nptr;
+  const char *end;
+  char *endbuf;
+  int saved_errno = errno;
+
+  radixchar = decimal_point_char ();
+
+  /* Eat whitespace.  */
+  while (locale_isspace (*s))
+    ++s;
+
+  /* Get the sign.  */
+  negative = *s == '-';
+  if (*s == '-' || *s == '+')
+    ++s;
+
+  num = STRTOD (s, &endbuf);
+  end = endbuf;
+
+  if (c_isdigit (s[*s == radixchar]))
+    {
+      /* If a hex float was converted incorrectly, do it ourselves.
+         If the string starts with "0x" but does not contain digits,
+         consume the "0" ourselves.  If a hex float is followed by a
+         'p' but no exponent, then adjust the end pointer.  */
+      if (*s == '0' && c_tolower (s[1]) == 'x')
+        {
+          if (! c_isxdigit (s[2 + (s[2] == radixchar)]))
+            {
+              end = s + 1;
+
+              /* strtod() on z/OS returns ERANGE for "0x".  */
+              errno = saved_errno;
+            }
+          else if (end <= s + 2)
+            {
+              num = parse_number (s + 2, 16, 2, 4, radixchar, 'p', &endbuf);
+              end = endbuf;
+            }
+          else
+            {
+              const char *p = s + 2;
+              while (p < end && c_tolower (*p) != 'p')
+                p++;
+              if (p < end && ! c_isdigit (p[1 + (p[1] == '-' || p[1] == '+')]))
+                {
+                  char *dup = strdup (s);
+                  errno = saved_errno;
+                  if (!dup)
+                    {
+                      /* Not really our day, is it.  Rounding errors are
+                         better than outright failure.  */
+                      num =
+                        parse_number (s + 2, 16, 2, 4, radixchar, 'p', &endbuf);
+                    }
+                  else
+                    {
+                      dup[p - s] = '\0';
+                      num = STRTOD (dup, &endbuf);
+                      saved_errno = errno;
+                      free (dup);
+                      errno = saved_errno;
+                    }
+                  end = p;
+                }
+            }
+        }
+      else
+        {
+          /* If "1e 1" was misparsed as 10.0 instead of 1.0, re-do the
+             underlying STRTOD on a copy of the original string
+             truncated to avoid the bug.  */
+          const char *e = s + 1;
+          while (e < end && c_tolower (*e) != 'e')
+            e++;
+          if (e < end && ! c_isdigit (e[1 + (e[1] == '-' || e[1] == '+')]))
+            {
+              char *dup = strdup (s);
+              errno = saved_errno;
+              if (!dup)
+                {
+                  /* Not really our day, is it.  Rounding errors are
+                     better than outright failure.  */
+                  num = parse_number (s, 10, 10, 1, radixchar, 'e', &endbuf);
+                }
+              else
+                {
+                  dup[e - s] = '\0';
+                  num = STRTOD (dup, &endbuf);
+                  saved_errno = errno;
+                  free (dup);
+                  errno = saved_errno;
+                }
+              end = e;
+            }
+        }
+
+      s = end;
+    }
+
+  /* Check for infinities and NaNs.  */
+  else if (c_tolower (*s) == 'i'
+           && c_tolower (s[1]) == 'n'
+           && c_tolower (s[2]) == 'f')
+    {
+      s += 3;
+      if (c_tolower (*s) == 'i'
+          && c_tolower (s[1]) == 'n'
+          && c_tolower (s[2]) == 'i'
+          && c_tolower (s[3]) == 't'
+          && c_tolower (s[4]) == 'y')
+        s += 5;
+      num = HUGE_VAL;
+      errno = saved_errno;
+    }
+  else if (c_tolower (*s) == 'n'
+           && c_tolower (s[1]) == 'a'
+           && c_tolower (s[2]) == 'n')
+    {
+      s += 3;
+      if (*s == '(')
+        {
+          const char *p = s + 1;
+          while (c_isalnum (*p))
+            p++;
+          if (*p == ')')
+            s = p + 1;
+        }
+
+      /* If the underlying implementation misparsed the NaN, assume
+         its result is incorrect, and return a NaN.  Normally it's
+         better to use the underlying implementation's result, since a
+         nice implementation populates the bits of the NaN according
+         to interpreting n-char-sequence as a hexadecimal number.  */
+      if (s != end || num == num)
+        num = NAN;
+      errno = saved_errno;
+    }
+  else
+    {
+      /* No conversion could be performed.  */
+      errno = EINVAL;
+      s = nptr;
+    }
+
+  if (endptr != NULL)
+    *endptr = (char *) s;
+  /* Special case -0.0, since at least ICC miscompiles negation.  We
+     can't use copysign(), as that drags in -lm on some platforms.  */
+  if (!num && negative)
+    return minus_zero ();
+  return negative ? -num : num;
+}
diff --git a/lib/strverscmp.c b/lib/strverscmp.c
index b54898e..2dcf359 100644
--- a/lib/strverscmp.c
+++ b/lib/strverscmp.c
@@ -1,19 +1,19 @@
 /* Compare strings while treating digits characters numerically.
-   Copyright (C) 1997-2019 Free Software Foundation, Inc.
+   Copyright (C) 1997-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Jean-François Bignolles <bignolle@ecoledoc.ibp.fr>, 1997.
 
    The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public
+   modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
-   version 3 of the License, or (at your option) any later version.
+   version 2.1 of the License, or (at your option) any later version.
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
+   You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
diff --git a/lib/sys_ioctl.in.h b/lib/sys_ioctl.in.h
new file mode 100644
index 0000000..f1b2a1b
--- /dev/null
+++ b/lib/sys_ioctl.in.h
@@ -0,0 +1,79 @@
+/* Substitute for and wrapper around <sys/ioctl.h>.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _@GUARD_PREFIX@_SYS_IOCTL_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard.  */
+#if @HAVE_SYS_IOCTL_H@
+# @INCLUDE_NEXT@ @NEXT_SYS_IOCTL_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_SYS_IOCTL_H
+#define _@GUARD_PREFIX@_SYS_IOCTL_H
+
+/* AIX 5.1 and Solaris 10 declare ioctl() in <unistd.h> and in <stropts.h>,
+   but not in <sys/ioctl.h>.
+   Haiku declares ioctl() in <unistd.h>, but not in <sys/ioctl.h>.
+   But avoid namespace pollution on glibc systems.  */
+#ifndef __GLIBC__
+# include <unistd.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
+
+/* Declare overridden functions.  */
+
+#if @GNULIB_IOCTL@
+# if @REPLACE_IOCTL@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef ioctl
+#   define ioctl rpl_ioctl
+#  endif
+_GL_FUNCDECL_RPL (ioctl, int,
+                  (int fd, int request, ... /* {void *,char *} arg */));
+_GL_CXXALIAS_RPL (ioctl, int,
+                  (int fd, int request, ... /* {void *,char *} arg */));
+# else
+#  if @SYS_IOCTL_H_HAVE_WINSOCK2_H@ || 1
+_GL_FUNCDECL_SYS (ioctl, int,
+                  (int fd, int request, ... /* {void *,char *} arg */));
+#  endif
+_GL_CXXALIAS_SYS (ioctl, int,
+                  (int fd, int request, ... /* {void *,char *} arg */));
+# endif
+_GL_CXXALIASWARN (ioctl);
+#elif @SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+# undef ioctl
+# define ioctl ioctl_used_without_requesting_gnulib_module_ioctl
+#elif defined GNULIB_POSIXCHECK
+# undef ioctl
+# if HAVE_RAW_DECL_IOCTL
+_GL_WARN_ON_USE (ioctl, "ioctl does not portably work on sockets - "
+                 "use gnulib module ioctl for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SYS_IOCTL_H */
+#endif /* _@GUARD_PREFIX@_SYS_IOCTL_H */
diff --git a/lib/sys_resource.in.h b/lib/sys_resource.in.h
index 69483cf..9882073 100644
--- a/lib/sys_resource.in.h
+++ b/lib/sys_resource.in.h
@@ -1,18 +1,18 @@
 /* Substitute for <sys/resource.h>.
-   Copyright (C) 2012-2019 Free Software Foundation, Inc.
+   Copyright (C) 2012-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 # if __GNUC__ >= 3
 @PRAGMA_SYSTEM_HEADER@
diff --git a/lib/sys_stat.in.h b/lib/sys_stat.in.h
index 9ddd1a8..babe3db 100644
--- a/lib/sys_stat.in.h
+++ b/lib/sys_stat.in.h
@@ -1,18 +1,18 @@
 /* Provide a more complete sys/stat.h header file.
-   Copyright (C) 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Eric Blake, Paul Eggert, and Jim Meyering.  */
 
@@ -375,11 +375,11 @@
 # define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH)
 #endif
 
-/* S_IXUGO is a common extension to POSIX.  */
+/* Although S_IXUGO and S_IRWXUGO are not specified by POSIX and are
+   not implemented in GNU/Linux, some Gnulib-using apps use the macros.  */
 #if !S_IXUGO
 # define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH)
 #endif
-
 #ifndef S_IRWXUGO
 # define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO)
 #endif
@@ -391,14 +391,44 @@
 #endif
 
 
+#if @GNULIB_MDA_CHMOD@
+/* On native Windows, map 'chmod' to '_chmod', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::chmod always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef chmod
+#   define chmod _chmod
+#  endif
+/* Need to cast, because in mingw the last argument is 'int mode'.  */
+_GL_CXXALIAS_MDA_CAST (chmod, int, (const char *filename, mode_t mode));
+# else
+_GL_CXXALIAS_SYS (chmod, int, (const char *filename, mode_t mode));
+# endif
+_GL_CXXALIASWARN (chmod);
+#endif
+
+
 #if @GNULIB_FCHMODAT@
-# if !@HAVE_FCHMODAT@
+# if @REPLACE_FCHMODAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fchmodat
+#   define fchmodat rpl_fchmodat
+#  endif
+_GL_FUNCDECL_RPL (fchmodat, int,
+                  (int fd, char const *file, mode_t mode, int flag)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (fchmodat, int,
+                  (int fd, char const *file, mode_t mode, int flag));
+# else
+#  if !@HAVE_FCHMODAT@
 _GL_FUNCDECL_SYS (fchmodat, int,
                   (int fd, char const *file, mode_t mode, int flag)
                   _GL_ARG_NONNULL ((2)));
-# endif
+#  endif
 _GL_CXXALIAS_SYS (fchmodat, int,
                   (int fd, char const *file, mode_t mode, int flag));
+# endif
 _GL_CXXALIASWARN (fchmodat);
 #elif defined GNULIB_POSIXCHECK
 # undef fchmodat
@@ -420,7 +450,9 @@
 # else
 _GL_CXXALIAS_SYS (fstat, int, (int fd, struct stat *buf));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fstat);
+# endif
 #elif @GNULIB_OVERRIDES_STRUCT_STAT@
 # undef fstat
 # define fstat fstat_used_without_requesting_gnulib_module_fstat
@@ -443,18 +475,22 @@
 #   define fstatat rpl_fstatat
 #  endif
 _GL_FUNCDECL_RPL (fstatat, int,
-                  (int fd, char const *name, struct stat *st, int flags)
+                  (int fd, char const *restrict name, struct stat *restrict st,
+                   int flags)
                   _GL_ARG_NONNULL ((2, 3)));
 _GL_CXXALIAS_RPL (fstatat, int,
-                  (int fd, char const *name, struct stat *st, int flags));
+                  (int fd, char const *restrict name, struct stat *restrict st,
+                   int flags));
 # else
 #  if !@HAVE_FSTATAT@
 _GL_FUNCDECL_SYS (fstatat, int,
-                  (int fd, char const *name, struct stat *st, int flags)
+                  (int fd, char const *restrict name, struct stat *restrict st,
+                   int flags)
                   _GL_ARG_NONNULL ((2, 3)));
 #  endif
 _GL_CXXALIAS_SYS (fstatat, int,
-                  (int fd, char const *name, struct stat *st, int flags));
+                  (int fd, char const *restrict name, struct stat *restrict st,
+                   int flags));
 # endif
 _GL_CXXALIASWARN (fstatat);
 #elif @GNULIB_OVERRIDES_STRUCT_STAT@
@@ -499,34 +535,32 @@
 #endif
 
 
+#if @GNULIB_GETUMASK@
+# if !@HAVE_GETUMASK@
+_GL_FUNCDECL_SYS (getumask, mode_t, (void));
+# endif
+_GL_CXXALIAS_SYS (getumask, mode_t, (void));
+# if @HAVE_GETUMASK@
+_GL_CXXALIASWARN (getumask);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getumask
+# if HAVE_RAW_DECL_GETUMASK
+_GL_WARN_ON_USE (getumask, "getumask is not portable - "
+                 "use gnulib module getumask for portability");
+# endif
+#endif
+
+
 #if @GNULIB_LCHMOD@
 /* Change the mode of FILENAME to MODE, without dereferencing it if FILENAME
    denotes a symbolic link.  */
-# if !@HAVE_LCHMOD@
-/* The lchmod replacement follows symbolic links.  Callers should take
-   this into account; lchmod should be applied only to arguments that
-   are known to not be symbolic links.  On hosts that lack lchmod,
-   this can lead to race conditions between the check and the
-   invocation of lchmod, but we know of no workarounds that are
-   reliable in general.  You might try requesting support for lchmod
-   from your operating system supplier.  */
-#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-#   define lchmod chmod
-#  endif
-/* Need to cast, because on mingw, the second parameter of chmod is
-                                                int mode.  */
-_GL_CXXALIAS_RPL_CAST_1 (lchmod, chmod, int,
-                         (const char *filename, mode_t mode));
-# else
-#  if 0 /* assume already declared */
+# if !@HAVE_LCHMOD@ || defined __hpux
 _GL_FUNCDECL_SYS (lchmod, int, (const char *filename, mode_t mode)
                                _GL_ARG_NONNULL ((1)));
-#  endif
+# endif
 _GL_CXXALIAS_SYS (lchmod, int, (const char *filename, mode_t mode));
-# endif
-# if @HAVE_LCHMOD@
 _GL_CXXALIASWARN (lchmod);
-# endif
 #elif defined GNULIB_POSIXCHECK
 # undef lchmod
 # if HAVE_RAW_DECL_LCHMOD
@@ -543,17 +577,21 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define lstat stat
 #  endif
-_GL_CXXALIAS_RPL_1 (lstat, stat, int, (const char *name, struct stat *buf));
+_GL_CXXALIAS_RPL_1 (lstat, stat, int,
+                    (const char *restrict name, struct stat *restrict buf));
 # elif @REPLACE_LSTAT@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef lstat
 #   define lstat rpl_lstat
 #  endif
-_GL_FUNCDECL_RPL (lstat, int, (const char *name, struct stat *buf)
-                              _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (lstat, int, (const char *name, struct stat *buf));
+_GL_FUNCDECL_RPL (lstat, int,
+                  (const char *restrict name, struct stat *restrict buf)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (lstat, int,
+                  (const char *restrict name, struct stat *restrict buf));
 # else
-_GL_CXXALIAS_SYS (lstat, int, (const char *name, struct stat *buf));
+_GL_CXXALIAS_SYS (lstat, int,
+                  (const char *restrict name, struct stat *restrict buf));
 # endif
 # if @HAVE_LSTAT@
 _GL_CXXALIASWARN (lstat);
@@ -570,21 +608,20 @@
 #endif
 
 
-#if @REPLACE_MKDIR@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-#  undef mkdir
-#  define mkdir rpl_mkdir
-# endif
+#if @GNULIB_MKDIR@
+# if @REPLACE_MKDIR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef mkdir
+#   define mkdir rpl_mkdir
+#  endif
 _GL_FUNCDECL_RPL (mkdir, int, (char const *name, mode_t mode)
-                              _GL_ARG_NONNULL ((1)));
+                               _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode));
-#else
+# elif defined _WIN32 && !defined __CYGWIN__
 /* mingw's _mkdir() function has 1 argument, but we pass 2 arguments.
    Additionally, it declares _mkdir (and depending on compile flags, an
    alias mkdir), only in the nonstandard includes <direct.h> and <io.h>,
    which are included above.  */
-# if defined _WIN32 && ! defined __CYGWIN__
-
 #  if !GNULIB_defined_rpl_mkdir
 static int
 rpl_mkdir (char const *name, mode_t mode)
@@ -593,16 +630,44 @@
 }
 #   define GNULIB_defined_rpl_mkdir 1
 #  endif
-
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef mkdir
 #   define mkdir rpl_mkdir
 #  endif
 _GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode));
 # else
 _GL_CXXALIAS_SYS (mkdir, int, (char const *name, mode_t mode));
 # endif
-#endif
 _GL_CXXALIASWARN (mkdir);
+#elif defined GNULIB_POSIXCHECK
+# undef mkdir
+# if HAVE_RAW_DECL_MKDIR
+_GL_WARN_ON_USE (mkdir, "mkdir does not always support two parameters - "
+                 "use gnulib module mkdir for portability");
+# endif
+#elif @GNULIB_MDA_MKDIR@
+/* On native Windows, map 'mkdir' to '_mkdir', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::mkdir always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !GNULIB_defined_rpl_mkdir
+static int
+rpl_mkdir (char const *name, mode_t mode)
+{
+  return _mkdir (name);
+}
+#   define GNULIB_defined_rpl_mkdir 1
+#  endif
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef mkdir
+#   define mkdir rpl_mkdir
+#  endif
+_GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode));
+# else
+_GL_CXXALIAS_SYS (mkdir, int, (char const *name, mode_t mode));
+# endif
+_GL_CXXALIASWARN (mkdir);
+#endif
 
 
 #if @GNULIB_MKDIRAT@
@@ -648,11 +713,21 @@
 
 
 #if @GNULIB_MKFIFOAT@
-# if !@HAVE_MKFIFOAT@
+# if @REPLACE_MKFIFOAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef mkfifoat
+#   define mkfifoat rpl_mkfifoat
+#  endif
+_GL_FUNCDECL_RPL (mkfifoat, int, (int fd, char const *file, mode_t mode)
+                                 _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (mkfifoat, int, (int fd, char const *file, mode_t mode));
+# else
+#  if !@HAVE_MKFIFOAT@
 _GL_FUNCDECL_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode)
                                  _GL_ARG_NONNULL ((2)));
-# endif
+#  endif
 _GL_CXXALIAS_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode));
+# endif
 _GL_CXXALIASWARN (mkfifoat);
 #elif defined GNULIB_POSIXCHECK
 # undef mkfifoat
@@ -691,13 +766,25 @@
 
 
 #if @GNULIB_MKNODAT@
-# if !@HAVE_MKNODAT@
+# if @REPLACE_MKNODAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef mknodat
+#   define mknodat rpl_mknodat
+#  endif
+_GL_FUNCDECL_RPL (mknodat, int,
+                  (int fd, char const *file, mode_t mode, dev_t dev)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (mknodat, int,
+                  (int fd, char const *file, mode_t mode, dev_t dev));
+# else
+#  if !@HAVE_MKNODAT@
 _GL_FUNCDECL_SYS (mknodat, int,
                   (int fd, char const *file, mode_t mode, dev_t dev)
                   _GL_ARG_NONNULL ((2)));
-# endif
+#  endif
 _GL_CXXALIAS_SYS (mknodat, int,
                   (int fd, char const *file, mode_t mode, dev_t dev));
+# endif
 _GL_CXXALIASWARN (mknodat);
 #elif defined GNULIB_POSIXCHECK
 # undef mknodat
@@ -766,7 +853,7 @@
 #    define stat(name, st) rpl_stat (name, st)
 #   endif /* !_LARGE_FILES */
 #  endif /* !@GNULIB_OVERRIDES_STRUCT_STAT@ */
-_GL_EXTERN_C int stat (const char *name, struct stat *buf)
+_GL_EXTERN_C int stat (const char *restrict name, struct stat *restrict buf)
                       _GL_ARG_NONNULL ((1, 2));
 # endif
 #elif @GNULIB_OVERRIDES_STRUCT_STAT@
@@ -782,6 +869,24 @@
 #endif
 
 
+#if @GNULIB_MDA_UMASK@
+/* On native Windows, map 'umask' to '_umask', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::umask always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef umask
+#   define umask _umask
+#  endif
+/* Need to cast, because in mingw the last argument is 'int mode'.  */
+_GL_CXXALIAS_MDA_CAST (umask, mode_t, (mode_t mask));
+# else
+_GL_CXXALIAS_SYS (umask, mode_t, (mode_t mask));
+# endif
+_GL_CXXALIASWARN (umask);
+#endif
+
+
 #if @GNULIB_UTIMENSAT@
 /* Use the rpl_ prefix also on Solaris <= 9, because on Solaris 9 our utimensat
    implementation relies on futimesat, which on Solaris 10 makes an invocation
diff --git a/lib/sys_time.in.h b/lib/sys_time.in.h
index d6c215e..8035fbe 100644
--- a/lib/sys_time.in.h
+++ b/lib/sys_time.in.h
@@ -1,19 +1,19 @@
 /* Provide a more complete sys/time.h.
 
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Paul Eggert.  */
 
@@ -135,7 +135,7 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef close
 #   define close close_used_without_including_unistd_h
-#  else
+#  elif !defined __clang__
      _GL_WARN_ON_USE (close,
                       "close() used without including <unistd.h>");
 #  endif
diff --git a/lib/sys_times.in.h b/lib/sys_times.in.h
index 2010822..85b728f 100644
--- a/lib/sys_times.in.h
+++ b/lib/sys_times.in.h
@@ -1,18 +1,18 @@
 /* Provide a sys/times.h header file.
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Simon Josefsson <simon@josefsson.org>, 2008.  */
 
diff --git a/lib/sys_types.in.h b/lib/sys_types.in.h
index 237e206..2079d72 100644
--- a/lib/sys_types.in.h
+++ b/lib/sys_types.in.h
@@ -1,19 +1,19 @@
 /* Provide a more complete sys/types.h.
 
-   Copyright (C) 2011-2019 Free Software Foundation, Inc.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 @PRAGMA_SYSTEM_HEADER@
diff --git a/lib/sys_wait.in.h b/lib/sys_wait.in.h
index 0de5d8f..446c66b 100644
--- a/lib/sys_wait.in.h
+++ b/lib/sys_wait.in.h
@@ -1,18 +1,18 @@
 /* A POSIX-like <sys/wait.h>.
-   Copyright (C) 2001-2003, 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2003, 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 
 #ifndef _@GUARD_PREFIX@_SYS_WAIT_H
diff --git a/lib/termios.in.h b/lib/termios.in.h
new file mode 100644
index 0000000..facd596
--- /dev/null
+++ b/lib/termios.in.h
@@ -0,0 +1,73 @@
+/* Substitute for and wrapper around <termios.h>.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _@GUARD_PREFIX@_TERMIOS_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* On HP-UX 11.00, some of the function declarations in <sys/termio.h>,
+   included by <termios.h>, are not protected by extern "C".  Enforce
+   "C" linkage for these functions nevertheless.  */
+#if defined __hpux && defined __cplusplus
+# include <sys/types.h>
+# include <sys/ioctl.h>
+extern "C" {
+# include <sys/termio.h>
+}
+#endif
+
+/* The include_next requires a split double-inclusion guard.  */
+#if @HAVE_TERMIOS_H@
+# @INCLUDE_NEXT@ @NEXT_TERMIOS_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_TERMIOS_H
+#define _@GUARD_PREFIX@_TERMIOS_H
+
+/* Get pid_t.  */
+#include <sys/types.h>
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
+
+/* Declare overridden functions.  */
+
+#if @GNULIB_TCGETSID@
+/* Return the session ID of the controlling terminal of the current process.
+   The argument is a descriptor if this controlling terminal.
+   Return -1, with errno set, upon failure.  errno = ENOSYS means that the
+   function is unsupported.  */
+# if !@HAVE_DECL_TCGETSID@
+_GL_FUNCDECL_SYS (tcgetsid, pid_t, (int fd));
+# endif
+_GL_CXXALIAS_SYS (tcgetsid, pid_t, (int fd));
+_GL_CXXALIASWARN (tcgetsid);
+#elif defined GNULIB_POSIXCHECK
+# undef tcgetsid
+# if HAVE_RAW_DECL_TCGETSID
+_GL_WARN_ON_USE (tcgetsid, "tcgetsid is not portable - "
+                 "use gnulib module tcgetsid for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_TERMIOS_H */
+#endif /* _@GUARD_PREFIX@_TERMIOS_H */
diff --git a/lib/textstyle.in.h b/lib/textstyle.in.h
index 42abbab..2b823f1 100644
--- a/lib/textstyle.in.h
+++ b/lib/textstyle.in.h
@@ -1,5 +1,5 @@
 /* Dummy replacement for part of the public API of the libtextstyle library.
-   Copyright (C) 2006-2007, 2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2007, 2019-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -42,6 +42,32 @@
 # include <termios.h>
 #endif
 
+/* An __attribute__ __format__ specifier for a function that takes a format
+   string and arguments, where the format string directives are the ones
+   standardized by ISO C99 and POSIX.
+   _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD  */
+/* __gnu_printf__ is supported in GCC >= 4.4.  */
+#ifndef _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD
+# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+#  define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __gnu_printf__
+# else
+#  define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __printf__
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_MAYBE_UNUSED declares that it is not a programming mistake if
+   the entity is not used.  The compiler should not warn if the entity is not
+   used.  */
+#ifndef _GL_ATTRIBUTE_MAYBE_UNUSED
+# if 0 /* no GCC or clang version supports this yet */
+#  define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
+# elif defined __GNUC__ || defined __clang__
+#  define _GL_ATTRIBUTE_MAYBE_UNUSED __attribute__ ((__unused__))
+# else
+#  define _GL_ATTRIBUTE_MAYBE_UNUSED
+# endif
+#endif
+
 /* ----------------------------- From ostream.h ----------------------------- */
 
 /* Describes the scope of a flush operation.  */
@@ -115,8 +141,8 @@
 
 static inline ptrdiff_t ostream_printf (ostream_t stream,
                                         const char *format, ...)
-#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ > 3
-  __attribute__ ((__format__ (__printf__, 2, 3)))
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || defined __clang__
+  __attribute__ ((__format__ (_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 2, 3)))
 #endif
   ;
 static inline ptrdiff_t
@@ -140,8 +166,8 @@
 
 static inline ptrdiff_t ostream_vprintf (ostream_t stream,
                                          const char *format, va_list args)
-#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ > 3
-  __attribute__ ((__format__ (__printf__, 2, 0)))
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || defined __clang__
+  __attribute__ ((__format__ (_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 2, 0)))
 #endif
   ;
 static inline ptrdiff_t
@@ -167,38 +193,38 @@
 #define styled_ostream_free ostream_free
 
 static inline void
-styled_ostream_begin_use_class (styled_ostream_t stream _GL_UNUSED,
-                                const char *classname _GL_UNUSED)
+styled_ostream_begin_use_class (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream,
+                                _GL_ATTRIBUTE_MAYBE_UNUSED const char *classname)
 {
 }
 
 static inline void
-styled_ostream_end_use_class (styled_ostream_t stream _GL_UNUSED,
-                              const char *classname _GL_UNUSED)
+styled_ostream_end_use_class (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream,
+                              _GL_ATTRIBUTE_MAYBE_UNUSED const char *classname)
 {
 }
 
 static inline const char *
-styled_ostream_get_hyperlink_ref (styled_ostream_t stream _GL_UNUSED)
+styled_ostream_get_hyperlink_ref (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream)
 {
   return NULL;
 }
 
 static inline const char *
-styled_ostream_get_hyperlink_id (styled_ostream_t stream _GL_UNUSED)
+styled_ostream_get_hyperlink_id (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream)
 {
   return NULL;
 }
 
 static inline void
-styled_ostream_set_hyperlink (styled_ostream_t stream _GL_UNUSED,
-                              const char *ref _GL_UNUSED,
-                              const char *id _GL_UNUSED)
+styled_ostream_set_hyperlink (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream,
+                              _GL_ATTRIBUTE_MAYBE_UNUSED const char *ref,
+                              _GL_ATTRIBUTE_MAYBE_UNUSED const char *id)
 {
 }
 
 static inline void
-styled_ostream_flush_to_current_style (styled_ostream_t stream _GL_UNUSED)
+styled_ostream_flush_to_current_style (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream)
 {
 }
 
@@ -225,8 +251,8 @@
 #define fd_ostream_free ostream_free
 
 static inline fd_ostream_t
-fd_ostream_create (int fd, const char *filename _GL_UNUSED,
-                   bool buffered _GL_UNUSED)
+fd_ostream_create (int fd, _GL_ATTRIBUTE_MAYBE_UNUSED const char *filename,
+                   _GL_ATTRIBUTE_MAYBE_UNUSED bool buffered)
 {
   if (fd == 1)
     return stdout;
@@ -272,81 +298,81 @@
 #define term_ostream_free ostream_free
 
 static inline term_color_t
-term_ostream_get_color (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_color (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return COLOR_DEFAULT;
 }
 
 static inline void
-term_ostream_set_color (term_ostream_t stream _GL_UNUSED,
-                        term_color_t color _GL_UNUSED)
+term_ostream_set_color (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                        _GL_ATTRIBUTE_MAYBE_UNUSED term_color_t color)
 {
 }
 
 static inline term_color_t
-term_ostream_get_bgcolor (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_bgcolor (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return COLOR_DEFAULT;
 }
 
 static inline void
-term_ostream_set_bgcolor (term_ostream_t stream _GL_UNUSED,
-                          term_color_t color _GL_UNUSED)
+term_ostream_set_bgcolor (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                          _GL_ATTRIBUTE_MAYBE_UNUSED term_color_t color)
 {
 }
 
 static inline term_weight_t
-term_ostream_get_weight (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_weight (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return WEIGHT_DEFAULT;
 }
 
 static inline void
-term_ostream_set_weight (term_ostream_t stream _GL_UNUSED,
-                         term_weight_t weight _GL_UNUSED)
+term_ostream_set_weight (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                         _GL_ATTRIBUTE_MAYBE_UNUSED term_weight_t weight)
 {
 }
 
 static inline term_posture_t
-term_ostream_get_posture (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_posture (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return POSTURE_DEFAULT;
 }
 
 static inline void
-term_ostream_set_posture (term_ostream_t stream _GL_UNUSED,
-                          term_posture_t posture _GL_UNUSED)
+term_ostream_set_posture (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                          _GL_ATTRIBUTE_MAYBE_UNUSED term_posture_t posture)
 {
 }
 
 static inline term_underline_t
-term_ostream_get_underline (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_underline (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return UNDERLINE_DEFAULT;
 }
 
 static inline void
-term_ostream_set_underline (term_ostream_t stream _GL_UNUSED,
-                            term_underline_t underline _GL_UNUSED)
+term_ostream_set_underline (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED term_underline_t underline)
 {
 }
 
 static inline const char *
-term_ostream_get_hyperlink_ref (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_hyperlink_ref (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return NULL;
 }
 
 static inline const char *
-term_ostream_get_hyperlink_id (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_hyperlink_id (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return NULL;
 }
 
 static inline void
-term_ostream_set_hyperlink (term_ostream_t stream _GL_UNUSED,
-                            const char *ref _GL_UNUSED,
-                            const char *id _GL_UNUSED)
+term_ostream_set_hyperlink (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED const char *ref,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED const char *id)
 {
 }
 
@@ -374,7 +400,7 @@
 
 static inline term_ostream_t
 term_ostream_create (int fd, const char *filename,
-                     ttyctl_t tty_control _GL_UNUSED)
+                     _GL_ATTRIBUTE_MAYBE_UNUSED ttyctl_t tty_control)
 {
   return fd_ostream_create (fd, filename, true);
 }
@@ -395,8 +421,8 @@
 
 static inline term_styled_ostream_t
 term_styled_ostream_create (int fd, const char *filename,
-                            ttyctl_t tty_control _GL_UNUSED,
-                            const char *css_filename _GL_UNUSED)
+                            _GL_ATTRIBUTE_MAYBE_UNUSED ttyctl_t tty_control,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED const char *css_filename)
 {
   return fd_ostream_create (fd, filename, true);
 }
@@ -406,8 +432,8 @@
 typedef styled_ostream_t html_styled_ostream_t;
 
 static inline html_styled_ostream_t
-html_styled_ostream_create (ostream_t destination _GL_UNUSED,
-                            const char *css_filename _GL_UNUSED)
+html_styled_ostream_create (_GL_ATTRIBUTE_MAYBE_UNUSED ostream_t destination,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED const char *css_filename)
 {
   abort ();
   return NULL;
@@ -423,13 +449,13 @@
 #define style_file_name NULL
 
 static inline bool
-handle_color_option (const char *option _GL_UNUSED)
+handle_color_option (_GL_ATTRIBUTE_MAYBE_UNUSED const char *option)
 {
   return false;
 }
 
 static inline void
-handle_style_option (const char *option _GL_UNUSED)
+handle_style_option (_GL_ATTRIBUTE_MAYBE_UNUSED const char *option)
 {
 }
 
@@ -440,10 +466,10 @@
 }
 
 static inline void
-style_file_prepare (const char *style_file_envvar _GL_UNUSED,
-                    const char *stylesdir_envvar _GL_UNUSED,
-                    const char *stylesdir_after_install _GL_UNUSED,
-                    const char *default_style_file _GL_UNUSED)
+style_file_prepare (_GL_ATTRIBUTE_MAYBE_UNUSED const char *style_file_envvar,
+                    _GL_ATTRIBUTE_MAYBE_UNUSED const char *stylesdir_envvar,
+                    _GL_ATTRIBUTE_MAYBE_UNUSED const char *stylesdir_after_install,
+                    _GL_ATTRIBUTE_MAYBE_UNUSED const char *default_style_file)
 {
 }
 
@@ -451,14 +477,14 @@
 
 static inline styled_ostream_t
 styled_ostream_create (int fd, const char *filename,
-                       ttyctl_t tty_control _GL_UNUSED,
-                       const char *css_filename _GL_UNUSED)
+                       _GL_ATTRIBUTE_MAYBE_UNUSED ttyctl_t tty_control,
+                       _GL_ATTRIBUTE_MAYBE_UNUSED const char *css_filename)
 {
   return fd_ostream_create (fd, filename, true);
 }
 
 static inline void
-libtextstyle_set_failure_exit_code (int exit_code _GL_UNUSED)
+libtextstyle_set_failure_exit_code (_GL_ATTRIBUTE_MAYBE_UNUSED int exit_code)
 {
 }
 
diff --git a/lib/thread-optim.h b/lib/thread-optim.h
new file mode 100644
index 0000000..0a4ba16
--- /dev/null
+++ b/lib/thread-optim.h
@@ -0,0 +1,60 @@
+/* Optimization of multithreaded code.
+
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2020.  */
+
+#ifndef _THREAD_OPTIM_H
+#define _THREAD_OPTIM_H
+
+/* This file defines a way to optimize multithreaded code for the single-thread
+   case, based on the variable '__libc_single_threaded', defined in
+   glibc >= 2.32.  */
+
+/* Typical use: In a block or function, use
+
+     bool mt = gl_multithreaded ();
+     ...
+     if (mt)
+       if (pthread_mutex_lock (&lock)) abort ();
+     ...
+     if (mt)
+       if (pthread_mutex_unlock (&lock)) abort ();
+
+   The gl_multithreaded () invocation determines whether the program currently
+   is multithreaded.
+
+   if (mt) STATEMENT executes STATEMENT in the multithreaded case, and skips
+   it in the single-threaded case.
+
+   The code between the gl_multithreaded () invocation and any use of the
+   variable 'mt' must not create threads or invoke functions that may
+   indirectly create threads (e.g. 'dlopen' may, indirectly through C++
+   initializers of global variables in the shared library being opened,
+   create threads).
+
+   The lock here is meant to synchronize threads in the same process.  The
+   same optimization cannot be applied to locks that synchronize different
+   processes (e.g. through shared memory mappings).  */
+
+#if HAVE_SYS_SINGLE_THREADED_H /* glibc >= 2.32 */
+# include <sys/single_threaded.h>
+# define gl_multithreaded()  !__libc_single_threaded
+#else
+# define gl_multithreaded()  1
+#endif
+
+#endif /* _THREAD_OPTIM_H */
diff --git a/lib/time.in.h b/lib/time.in.h
index 1b3bf3e..a73fe59 100644
--- a/lib/time.in.h
+++ b/lib/time.in.h
@@ -1,19 +1,19 @@
 /* A more-standard <time.h>.
 
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 @PRAGMA_SYSTEM_HEADER@
@@ -101,6 +101,25 @@
 #  define GNULIB_defined_struct_time_t_must_be_integral 1
 # endif
 
+/* Define TIME_UTC, a positive integer constant used for timespec_get().  */
+# if ! @TIME_H_DEFINES_TIME_UTC@
+#  if !GNULIB_defined_TIME_UTC
+#   define TIME_UTC 1
+#   define GNULIB_defined_TIME_UTC 1
+#  endif
+# endif
+
+/* Set *TS to the current time, and return BASE.
+   Upon failure, return 0.  */
+# if @GNULIB_TIMESPEC_GET@
+#  if ! @HAVE_TIMESPEC_GET@
+_GL_FUNCDECL_SYS (timespec_get, int, (struct timespec *ts, int base)
+                                     _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (timespec_get, int, (struct timespec *ts, int base));
+_GL_CXXALIASWARN (timespec_get);
+# endif
+
 /* Sleep for at least RQTP seconds unless interrupted,  If interrupted,
    return -1 and store the remaining time into RMTP.  See
    <https://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html>.  */
@@ -135,10 +154,27 @@
 #   endif
 _GL_FUNCDECL_RPL (tzset, void, (void));
 _GL_CXXALIAS_RPL (tzset, void, (void));
-#  else
-#   if ! @HAVE_TZSET@
-_GL_FUNCDECL_SYS (tzset, void, (void));
+#  elif defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef tzset
+#    define tzset _tzset
 #   endif
+_GL_CXXALIAS_MDA (tzset, void, (void));
+#  else
+_GL_CXXALIAS_SYS (tzset, void, (void));
+#  endif
+_GL_CXXALIASWARN (tzset);
+# elif @GNULIB_MDA_TZSET@
+/* On native Windows, map 'tzset' to '_tzset', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::tzset always.  */
+#  if defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef tzset
+#    define tzset _tzset
+#   endif
+_GL_CXXALIAS_MDA (tzset, void, (void));
+#  else
 _GL_CXXALIAS_SYS (tzset, void, (void));
 #  endif
 _GL_CXXALIASWARN (tzset);
@@ -286,14 +322,17 @@
 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #    define strftime rpl_strftime
 #   endif
-_GL_FUNCDECL_RPL (strftime, size_t, (char *__buf, size_t __bufsize,
-                                     const char *__fmt, const struct tm *__tp)
-                                    _GL_ARG_NONNULL ((1, 3, 4)));
-_GL_CXXALIAS_RPL (strftime, size_t, (char *__buf, size_t __bufsize,
-                                     const char *__fmt, const struct tm *__tp));
+_GL_FUNCDECL_RPL (strftime, size_t,
+                  (char *restrict __buf, size_t __bufsize,
+                   const char *restrict __fmt, const struct tm *restrict __tp)
+                  _GL_ARG_NONNULL ((1, 3, 4)));
+_GL_CXXALIAS_RPL (strftime, size_t,
+                  (char *restrict __buf, size_t __bufsize,
+                   const char *restrict __fmt, const struct tm *restrict __tp));
 #  else
-_GL_CXXALIAS_SYS (strftime, size_t, (char *__buf, size_t __bufsize,
-                                     const char *__fmt, const struct tm *__tp));
+_GL_CXXALIAS_SYS (strftime, size_t,
+                  (char *restrict __buf, size_t __bufsize,
+                   const char *restrict __fmt, const struct tm *restrict __tp));
 #  endif
 #  if __GLIBC__ >= 2
 _GL_CXXALIASWARN (strftime);
@@ -301,22 +340,60 @@
 # endif
 
 # if defined _GNU_SOURCE && @GNULIB_TIME_RZ@ && ! @HAVE_TIMEZONE_T@
+/* Functions that use a first-class time zone data type, instead of
+   relying on an implicit global time zone.
+   Inspired by NetBSD.  */
+
+/* Represents a time zone.
+   (timezone_t) NULL stands for UTC.  */
 typedef struct tm_zone *timezone_t;
+
+/* tzalloc (name)
+   Returns a time zone object for the given time zone NAME.  This object
+   represents the time zone that other functions would use it the TZ
+   environment variable was set to NAME.
+   If NAME is NULL, the result represents the time zone that other functions
+   would use it the TZ environment variable was unset.
+   May return NULL if NAME is invalid (this is platform dependent) or
+   upon memory allocation failure.  */
 _GL_FUNCDECL_SYS (tzalloc, timezone_t, (char const *__name));
 _GL_CXXALIAS_SYS (tzalloc, timezone_t, (char const *__name));
+
+/* tzfree (tz)
+   Frees a time zone object.
+   The argument must have been returned by tzalloc().  */
 _GL_FUNCDECL_SYS (tzfree, void, (timezone_t __tz));
 _GL_CXXALIAS_SYS (tzfree, void, (timezone_t __tz));
+
+/* localtime_rz (tz, &t, &result)
+   Converts an absolute time T to a broken-down time RESULT, assuming the
+   time zone TZ.
+   This function is like 'localtime_r', but relies on the argument TZ instead
+   of an implicit global time zone.  */
 _GL_FUNCDECL_SYS (localtime_rz, struct tm *,
                   (timezone_t __tz, time_t const *restrict __timer,
                    struct tm *restrict __result) _GL_ARG_NONNULL ((2, 3)));
 _GL_CXXALIAS_SYS (localtime_rz, struct tm *,
                   (timezone_t __tz, time_t const *restrict __timer,
                    struct tm *restrict __result));
+
+/* mktime_z (tz, &tm)
+   Normalizes the broken-down time TM and converts it to an absolute time,
+   assuming the time zone TZ.  Returns the absolute time.
+   This function is like 'mktime', but relies on the argument TZ instead
+   of an implicit global time zone.  */
 _GL_FUNCDECL_SYS (mktime_z, time_t,
-                  (timezone_t __tz, struct tm *restrict __result)
+                  (timezone_t __tz, struct tm *restrict __tm)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_SYS (mktime_z, time_t,
-                  (timezone_t __tz, struct tm *restrict __result));
+                  (timezone_t __tz, struct tm *restrict __tm));
+
+/* Time zone abbreviation strings (returned by 'localtime_rz' or 'mktime_z'
+   in the 'tm_zone' member of 'struct tm') are valid as long as
+     - the 'struct tm' argument is not destroyed or overwritten,
+   and
+     - the 'timezone_t' argument is not freed through tzfree().  */
+
 # endif
 
 /* Convert TM to a time_t value, assuming UTC.  */
@@ -347,17 +424,17 @@
 # endif
 # if defined GNULIB_POSIXCHECK
 #  undef asctime_r
-_GL_WARN_ON_USE (asctime, "asctime_r can overrun buffers in some cases - "
+_GL_WARN_ON_USE (asctime_r, "asctime_r can overrun buffers in some cases - "
                  "better use strftime (or even sprintf) instead");
 # endif
 # if defined GNULIB_POSIXCHECK
 #  undef ctime
-_GL_WARN_ON_USE (asctime, "ctime can overrun buffers in some cases - "
+_GL_WARN_ON_USE (ctime, "ctime can overrun buffers in some cases - "
                  "better use strftime (or even sprintf) instead");
 # endif
 # if defined GNULIB_POSIXCHECK
 #  undef ctime_r
-_GL_WARN_ON_USE (asctime, "ctime_r can overrun buffers in some cases - "
+_GL_WARN_ON_USE (ctime_r, "ctime_r can overrun buffers in some cases - "
                  "better use strftime (or even sprintf) instead");
 # endif
 
diff --git a/lib/timespec.c b/lib/timespec.c
index 2b6098e..957b5fb 100644
--- a/lib/timespec.c
+++ b/lib/timespec.c
@@ -1,3 +1,21 @@
+/* Inline functions for <timespec.h>.
+
+   Copyright (C) 2012-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #include <config.h>
+
 #define _GL_TIMESPEC_INLINE _GL_EXTERN_INLINE
 #include "timespec.h"
diff --git a/lib/timespec.h b/lib/timespec.h
index 26f1bc1..94a5db7 100644
--- a/lib/timespec.h
+++ b/lib/timespec.h
@@ -1,19 +1,19 @@
 /* timespec -- System time interface
 
-   Copyright (C) 2000, 2002, 2004-2005, 2007, 2009-2019 Free Software
+   Copyright (C) 2000, 2002, 2004-2005, 2007, 2009-2021 Free Software
    Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if ! defined TIMESPEC_H
@@ -34,7 +34,6 @@
 #endif
 
 #include "arg-nonnull.h"
-#include "verify.h"
 
 /* Inverse resolution of timespec timestamps (in units per second),
    and log base 10 of the inverse resolution.  */
@@ -59,46 +58,12 @@
   return r;
 }
 
-/* Return negative, zero, positive if A < B, A == B, A > B, respectively.
-
-   For each timestamp T, this code assumes that either:
-
-     * T.tv_nsec is in the range 0..999999999; or
-     * T.tv_sec corresponds to a valid leap second on a host that supports
-       leap seconds, and T.tv_nsec is in the range 1000000000..1999999999; or
-     * T.tv_sec is the minimum time_t value and T.tv_nsec is -1; or
-       T.tv_sec is the maximum time_t value and T.tv_nsec is 2000000000.
-       This allows for special struct timespec values that are less or
-       greater than all possible valid timestamps.
-
-   In all these cases, it is safe to subtract two tv_nsec values and
-   convert the result to integer without worrying about overflow on
-   any platform of interest to the GNU project, since all such
-   platforms have 32-bit int or wider.
-
-   Replacing "a.tv_nsec - b.tv_nsec" with something like
-   "a.tv_nsec < b.tv_nsec ? -1 : a.tv_nsec > b.tv_nsec" would cause
-   this function to work in some cases where the above assumption is
-   violated, but not in all cases (e.g., a.tv_sec==1, a.tv_nsec==-2,
-   b.tv_sec==0, b.tv_nsec==999999999) and is arguably not worth the
-   extra instructions.  Using a subtraction has the advantage of
-   detecting some invalid cases on platforms that detect integer
-   overflow.  */
+/* Return negative, zero, positive if A < B, A == B, A > B, respectively.  */
 
 _GL_TIMESPEC_INLINE int _GL_ATTRIBUTE_PURE
 timespec_cmp (struct timespec a, struct timespec b)
 {
-  if (a.tv_sec < b.tv_sec)
-    return -1;
-  if (a.tv_sec > b.tv_sec)
-    return 1;
-
-  /* Pacify gcc -Wstrict-overflow (bleeding-edge circa 2017-10-02).  See:
-     https://lists.gnu.org/r/bug-gnulib/2017-10/msg00006.html  */
-  assume (-1 <= a.tv_nsec && a.tv_nsec <= 2 * TIMESPEC_HZ);
-  assume (-1 <= b.tv_nsec && b.tv_nsec <= 2 * TIMESPEC_HZ);
-
-  return a.tv_nsec - b.tv_nsec;
+  return 2 * _GL_CMP (a.tv_sec, b.tv_sec) + _GL_CMP (a.tv_nsec, b.tv_nsec);
 }
 
 /* Return -1, 0, 1, depending on the sign of A.  A.tv_nsec must be
@@ -106,7 +71,7 @@
 _GL_TIMESPEC_INLINE int _GL_ATTRIBUTE_PURE
 timespec_sign (struct timespec a)
 {
-  return a.tv_sec < 0 ? -1 : a.tv_sec || a.tv_nsec;
+  return _GL_CMP (a.tv_sec, 0) + (!a.tv_sec & !!a.tv_nsec);
 }
 
 struct timespec timespec_add (struct timespec, struct timespec)
diff --git a/lib/timevar.c b/lib/timevar.c
index 511ee9d..2907790 100644
--- a/lib/timevar.c
+++ b/lib/timevar.c
@@ -1,6 +1,6 @@
 /* Timing variables for measuring compiler performance.
 
-   Copyright (C) 2000, 2002, 2004, 2006, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2000, 2002, 2004, 2006, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    Contributed by Alex Samuel <samuel@codesourcery.com>
diff --git a/lib/timevar.def b/lib/timevar.def
index 9de9b81..ef7be20 100644
--- a/lib/timevar.def
+++ b/lib/timevar.def
@@ -1,7 +1,7 @@
 /* This file contains the definitions for timing variables used to -*- C -*-
    measure run-time performance of the compiler.
 
-   Copyright (C) 2002, 2007, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2002, 2007, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    Contributed by Akim Demaille <akim@freefriends.org>.
@@ -19,7 +19,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* This file contains timing variable definitions, used by timevar.h
    and timevar.c.
@@ -53,6 +53,7 @@
 /* Time spent outputting results.  */
 DEFTIMEVAR (tv_report                , "outputting report")
 DEFTIMEVAR (tv_graph                 , "outputting graph")
+DEFTIMEVAR (tv_html                  , "outputting html")
 DEFTIMEVAR (tv_xml                   , "outputting xml")
 DEFTIMEVAR (tv_actions               , "parser action tables")
 DEFTIMEVAR (tv_parser                , "outputting parser")
diff --git a/lib/timevar.h b/lib/timevar.h
index 6f7efe2..50f8c33 100644
--- a/lib/timevar.h
+++ b/lib/timevar.h
@@ -1,6 +1,6 @@
 /* Timing variables for measuring application performance.
 
-   Copyright (C) 2000, 2002, 2004, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2000, 2002, 2004, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    Contributed by Alex Samuel <samuel@codesourcery.com>
diff --git a/lib/unicodeio.c b/lib/unicodeio.c
new file mode 100644
index 0000000..0b058c3
--- /dev/null
+++ b/lib/unicodeio.c
@@ -0,0 +1,232 @@
+/* Unicode character output to streams with locale dependent encoding.
+
+   Copyright (C) 2000-2003, 2006, 2008-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <haible@clisp.cons.org>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "unicodeio.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#if HAVE_ICONV
+# include <iconv.h>
+#endif
+
+#include <error.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+#include "localcharset.h"
+#include "unistr.h"
+
+/* When we pass a Unicode character to iconv(), we must pass it in a
+   suitable encoding. The standardized Unicode encodings are
+   UTF-8, UCS-2, UCS-4, UTF-16, UTF-16BE, UTF-16LE, UTF-7.
+   UCS-2 supports only characters up to \U0000FFFF.
+   UTF-16 and variants support only characters up to \U0010FFFF.
+   UTF-7 is way too complex and not supported by glibc-2.1.
+   UCS-4 specification leaves doubts about endianness and byte order
+   mark. glibc currently interprets it as big endian without byte order
+   mark, but this is not backed by an RFC.
+   So we use UTF-8. It supports characters up to \U7FFFFFFF and is
+   unambiguously defined.  */
+
+/* Luckily, the encoding's name is platform independent.  */
+#define UTF8_NAME "UTF-8"
+
+/* Converts the Unicode character CODE to its multibyte representation
+   in the current locale and calls the SUCCESS callback on the resulting
+   byte sequence.  If an error occurs, invokes the FAILURE callback instead,
+   passing it CODE and an English error string.
+   Returns whatever the callback returned.
+   Assumes that the locale doesn't change between two calls.  */
+long
+unicode_to_mb (unsigned int code,
+               long (*success) (const char *buf, size_t buflen,
+                                void *callback_arg),
+               long (*failure) (unsigned int code, const char *msg,
+                                void *callback_arg),
+               void *callback_arg)
+{
+  static int initialized;
+  static int is_utf8;
+#if HAVE_ICONV
+  static iconv_t utf8_to_local;
+#endif
+
+  char inbuf[6];
+  int count;
+
+  if (!initialized)
+    {
+      const char *charset = locale_charset ();
+
+      is_utf8 = !strcmp (charset, UTF8_NAME);
+#if HAVE_ICONV
+      if (!is_utf8)
+        {
+          utf8_to_local = iconv_open (charset, UTF8_NAME);
+          if (utf8_to_local == (iconv_t)(-1))
+            /* For an unknown encoding, assume ASCII.  */
+            utf8_to_local = iconv_open ("ASCII", UTF8_NAME);
+        }
+#endif
+      initialized = 1;
+    }
+
+  /* Test whether the utf8_to_local converter is available at all.  */
+  if (!is_utf8)
+    {
+#if HAVE_ICONV
+      if (utf8_to_local == (iconv_t)(-1))
+        return failure (code, N_("iconv function not usable"), callback_arg);
+#else
+      return failure (code, N_("iconv function not available"), callback_arg);
+#endif
+    }
+
+  /* Convert the character to UTF-8.  */
+  count = u8_uctomb ((unsigned char *) inbuf, code, sizeof (inbuf));
+  if (count < 0)
+    return failure (code, N_("character out of range"), callback_arg);
+
+#if HAVE_ICONV
+  if (!is_utf8)
+    {
+      char outbuf[25];
+      const char *inptr;
+      size_t inbytesleft;
+      char *outptr;
+      size_t outbytesleft;
+      size_t res;
+
+      inptr = inbuf;
+      inbytesleft = count;
+      outptr = outbuf;
+      outbytesleft = sizeof (outbuf);
+
+      /* Convert the character from UTF-8 to the locale's charset.  */
+      res = iconv (utf8_to_local,
+                   (ICONV_CONST char **)&inptr, &inbytesleft,
+                   &outptr, &outbytesleft);
+      /* Analyze what iconv() actually did and distinguish replacements
+         that are OK (no need to invoke the FAILURE callback), such as
+           - replacing GREEK SMALL LETTER MU with MICRO SIGN, or
+           - replacing FULLWIDTH COLON with ':', or
+           - replacing a Unicode TAG character (U+E00xx) with an empty string,
+         from replacements that are worse than the FAILURE callback, such as
+           - replacing 'ç' with '?' (NetBSD, Solaris 11) or '*' (musl) or
+             NUL (IRIX).  */
+      if (inbytesleft > 0 || res == (size_t)(-1)
+          /* Irix iconv() inserts a NUL byte if it cannot convert.  */
+# if !defined _LIBICONV_VERSION && (defined sgi || defined __sgi)
+          || (res > 0 && code != 0 && outptr - outbuf == 1 && *outbuf == '\0')
+# endif
+          /* FreeBSD iconv(), NetBSD iconv(), and Solaris 11 iconv() insert
+             a '?' if they cannot convert.  */
+# if !defined _LIBICONV_VERSION
+          || (res > 0 && outptr - outbuf == 1 && *outbuf == '?')
+# endif
+          /* musl libc iconv() inserts a '*' if it cannot convert.  */
+# if !defined _LIBICONV_VERSION && MUSL_LIBC
+          || (res > 0 && outptr - outbuf == 1 && *outbuf == '*')
+# endif
+         )
+        return failure (code, NULL, callback_arg);
+
+      /* Avoid glibc-2.1 bug and Solaris 7 bug.  */
+# if defined _LIBICONV_VERSION \
+    || !(((__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) \
+          && !defined __UCLIBC__) \
+         || defined __sun)
+
+      /* Get back to the initial shift state.  */
+      res = iconv (utf8_to_local, NULL, NULL, &outptr, &outbytesleft);
+      if (res == (size_t)(-1))
+        return failure (code, NULL, callback_arg);
+# endif
+
+      return success (outbuf, outptr - outbuf, callback_arg);
+    }
+#endif
+
+  /* At this point, is_utf8 is true, so no conversion is needed.  */
+  return success (inbuf, count, callback_arg);
+}
+
+/* Simple success callback that outputs the converted string.
+   The STREAM is passed as callback_arg.  */
+long
+fwrite_success_callback (const char *buf, size_t buflen, void *callback_arg)
+{
+  FILE *stream = (FILE *) callback_arg;
+
+  /* The return value of fwrite can be ignored here, because under normal
+     conditions (STREAM is an open stream and not wide-character oriented)
+     when fwrite() returns a value != buflen it also sets STREAM's error
+     indicator.  */
+  fwrite (buf, 1, buflen, stream);
+  return 0;
+}
+
+/* Simple failure callback that displays an error and exits.  */
+static long
+exit_failure_callback (unsigned int code, const char *msg,
+                       _GL_UNUSED void *callback_arg)
+{
+  if (msg == NULL)
+    error (1, 0, _("cannot convert U+%04X to local character set"), code);
+  else
+    error (1, 0, _("cannot convert U+%04X to local character set: %s"), code,
+           gettext (msg));
+  return -1;
+}
+
+/* Simple failure callback that displays a fallback representation in plain
+   ASCII, using the same notation as ISO C99 strings.  */
+static long
+fallback_failure_callback (unsigned int code,
+                           _GL_UNUSED const char *msg,
+                           void *callback_arg)
+{
+  FILE *stream = (FILE *) callback_arg;
+
+  if (code < 0x10000)
+    fprintf (stream, "\\u%04X", code);
+  else
+    fprintf (stream, "\\U%08X", code);
+  return -1;
+}
+
+/* Outputs the Unicode character CODE to the output stream STREAM.
+   Upon failure, exit if exit_on_error is true, otherwise output a fallback
+   notation.  */
+void
+print_unicode_char (FILE *stream, unsigned int code, int exit_on_error)
+{
+  unicode_to_mb (code, fwrite_success_callback,
+                 exit_on_error
+                 ? exit_failure_callback
+                 : fallback_failure_callback,
+                 stream);
+}
diff --git a/lib/unicodeio.h b/lib/unicodeio.h
new file mode 100644
index 0000000..d9e32af
--- /dev/null
+++ b/lib/unicodeio.h
@@ -0,0 +1,48 @@
+/* Unicode character output to streams with locale dependent encoding.
+
+   Copyright (C) 2000-2003, 2005, 2008-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef UNICODEIO_H
+# define UNICODEIO_H
+
+# include <stddef.h>
+# include <stdio.h>
+
+/* Converts the Unicode character CODE to its multibyte representation
+   in the current locale and calls the SUCCESS callback on the resulting
+   byte sequence.  If an error occurs, invokes the FAILURE callback instead,
+   passing it CODE and an English error string.
+   Returns whatever the callback returned.
+   Assumes that the locale doesn't change between two calls.  */
+extern long unicode_to_mb (unsigned int code,
+                           long (*success) (const char *buf, size_t buflen,
+                                            void *callback_arg),
+                           long (*failure) (unsigned int code, const char *msg,
+                                            void *callback_arg),
+                           void *callback_arg);
+
+/* Outputs the Unicode character CODE to the output stream STREAM.
+   Upon failure, exit if exit_on_error is true, otherwise output a fallback
+   notation.  */
+extern void print_unicode_char (FILE *stream, unsigned int code,
+                                int exit_on_error);
+
+/* Simple success callback that outputs the converted string.
+   The STREAM is passed as callback_arg.  */
+extern long fwrite_success_callback (const char *buf, size_t buflen,
+                                     void *callback_arg);
+
+#endif
diff --git a/lib/unistd--.h b/lib/unistd--.h
index 1268854..5e6ecb0 100644
--- a/lib/unistd--.h
+++ b/lib/unistd--.h
@@ -1,6 +1,6 @@
 /* Like unistd.h, but redefine some names to avoid glitches.
 
-   Copyright (C) 2005, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/unistd-safer.h b/lib/unistd-safer.h
index 8eebffc..541bafe 100644
--- a/lib/unistd-safer.h
+++ b/lib/unistd-safer.h
@@ -1,6 +1,6 @@
 /* Invoke unistd-like functions, but avoid some glitches.
 
-   Copyright (C) 2001, 2003, 2005, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2003, 2005, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/unistd.c b/lib/unistd.c
index 72bad1c..0763456 100644
--- a/lib/unistd.c
+++ b/lib/unistd.c
@@ -1,4 +1,22 @@
+/* Inline functions for <unistd.h>.
+
+   Copyright (C) 2012-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #include <config.h>
+
 #define _GL_UNISTD_INLINE _GL_EXTERN_INLINE
 #include "unistd.h"
 typedef int dummy;
diff --git a/lib/unistd.in.h b/lib/unistd.in.h
index 4700ccb..73c882f 100644
--- a/lib/unistd.in.h
+++ b/lib/unistd.in.h
@@ -1,18 +1,18 @@
 /* Substitute for and wrapper around <unistd.h>.
-   Copyright (C) 2003-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _@GUARD_PREFIX@_UNISTD_H
 
@@ -21,7 +21,7 @@
 #endif
 @PRAGMA_COLUMNS@
 
-#ifdef _GL_INCLUDING_UNISTD_H
+#if @HAVE_UNISTD_H@ && defined _GL_INCLUDING_UNISTD_H
 /* Special invocation convention:
    - On Mac OS X 10.3.9 we have a sequence of nested includes
      <unistd.h> -> <signal.h> -> <pthread.h> -> <unistd.h>
@@ -93,20 +93,18 @@
 # undef __need_system_stdlib_h
 #endif
 
-/* Native Windows platforms declare chdir, getcwd, rmdir in
+/* Native Windows platforms declare _chdir, _getcwd, _rmdir in
    <io.h> and/or <direct.h>, not in <unistd.h>.
-   They also declare access(), chmod(), close(), dup(), dup2(), isatty(),
-   lseek(), read(), unlink(), write() in <io.h>.  */
-#if ((@GNULIB_CHDIR@ || @GNULIB_GETCWD@ || @GNULIB_RMDIR@ \
-      || defined GNULIB_POSIXCHECK) \
-     && (defined _WIN32 && ! defined __CYGWIN__))
-# include <io.h>     /* mingw32, mingw64 */
-# include <direct.h> /* mingw64, MSVC 9 */
-#elif (@GNULIB_CLOSE@ || @GNULIB_DUP@ || @GNULIB_DUP2@ || @GNULIB_ISATTY@ \
-       || @GNULIB_LSEEK@ || @GNULIB_READ@ || @GNULIB_UNLINK@ || @GNULIB_WRITE@ \
-       || defined GNULIB_POSIXCHECK) \
-      && (defined _WIN32 && ! defined __CYGWIN__)
+   They also declare _access(), _chmod(), _close(), _dup(), _dup2(), _isatty(),
+   _lseek(), _read(), _unlink(), _write() in <io.h>.  */
+#if defined _WIN32 && !defined __CYGWIN__
 # include <io.h>
+# include <direct.h>
+#endif
+
+/* Native Windows platforms declare _execl*, _execv* in <process.h>.  */
+#if defined _WIN32 && !defined __CYGWIN__
+# include <process.h>
 #endif
 
 /* AIX and OSF/1 5.1 declare getdomainname in <netdb.h>, not in <unistd.h>.
@@ -118,6 +116,17 @@
 # include <netdb.h>
 #endif
 
+/* Mac OS X 10.13, Solaris 11.4, and Android 9.0 declare getentropy in
+   <sys/random.h>, not in <unistd.h>.  */
+/* But avoid namespace pollution on glibc systems.  */
+#if (@GNULIB_GETENTROPY@ || defined GNULIB_POSIXCHECK) \
+    && ((defined __APPLE__ && defined __MACH__) || defined __sun \
+        || defined __ANDROID__) \
+    && @UNISTD_H_HAVE_SYS_RANDOM_H@ \
+    && !defined __GLIBC__
+# include <sys/random.h>
+#endif
+
 /* Android 4.3 declares fchownat in <sys/stat.h>, not in <unistd.h>.  */
 /* But avoid namespace pollution on glibc systems.  */
 #if (@GNULIB_FCHOWNAT@ || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \
@@ -127,11 +136,8 @@
 
 /* MSVC defines off_t in <sys/types.h>.
    May also define off_t to a 64-bit type on native Windows.  */
-/* But avoid namespace pollution on glibc systems.  */
-#ifndef __GLIBC__
-/* Get off_t, ssize_t.  */
-# include <sys/types.h>
-#endif
+/* Get off_t, ssize_t, mode_t.  */
+#include <sys/types.h>
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 
@@ -141,7 +147,7 @@
 
 
 /* Get getopt(), optarg, optind, opterr, optopt.  */
-#if @GNULIB_UNISTD_H_GETOPT@ && !defined _GL_SYSTEM_GETOPT
+#if @GNULIB_GETOPT_POSIX@ && @GNULIB_UNISTD_H_GETOPT@ && !defined _GL_SYSTEM_GETOPT
 # include <getopt-cdefs.h>
 # include <getopt-pfx-core.h>
 #endif
@@ -262,6 +268,12 @@
 _GL_FUNCDECL_RPL (access, int, (const char *file, int mode)
                                _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (access, int, (const char *file, int mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef access
+#   define access _access
+#  endif
+_GL_CXXALIAS_MDA (access, int, (const char *file, int mode));
 # else
 _GL_CXXALIAS_SYS (access, int, (const char *file, int mode));
 # endif
@@ -275,11 +287,33 @@
                  "also, this function is a security risk - "
                  "use the gnulib module faccessat instead");
 # endif
+#elif @GNULIB_MDA_ACCESS@
+/* On native Windows, map 'access' to '_access', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::access always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef access
+#   define access _access
+#  endif
+_GL_CXXALIAS_MDA (access, int, (const char *file, int mode));
+# else
+_GL_CXXALIAS_SYS (access, int, (const char *file, int mode));
+# endif
+_GL_CXXALIASWARN (access);
 #endif
 
 
 #if @GNULIB_CHDIR@
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef chdir
+#   define chdir _chdir
+#  endif
+_GL_CXXALIAS_MDA (chdir, int, (const char *file));
+# else
 _GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
+# endif
 _GL_CXXALIASWARN (chdir);
 #elif defined GNULIB_POSIXCHECK
 # undef chdir
@@ -287,6 +321,20 @@
 _GL_WARN_ON_USE (chown, "chdir is not always in <unistd.h> - "
                  "use gnulib module chdir for portability");
 # endif
+#elif @GNULIB_MDA_CHDIR@
+/* On native Windows, map 'chdir' to '_chdir', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::chdir always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef chdir
+#   define chdir _chdir
+#  endif
+_GL_CXXALIAS_MDA (chdir, int, (const char *file));
+# else
+_GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIASWARN (chdir);
 #endif
 
 
@@ -331,6 +379,12 @@
 #  endif
 _GL_FUNCDECL_RPL (close, int, (int fd));
 _GL_CXXALIAS_RPL (close, int, (int fd));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef close
+#   define close _close
+#  endif
+_GL_CXXALIAS_MDA (close, int, (int fd));
 # else
 _GL_CXXALIAS_SYS (close, int, (int fd));
 # endif
@@ -343,6 +397,20 @@
 /* Assume close is always declared.  */
 _GL_WARN_ON_USE (close, "close does not portably work on sockets - "
                  "use gnulib module close for portability");
+#elif @GNULIB_MDA_CLOSE@
+/* On native Windows, map 'close' to '_close', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::close always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef close
+#   define close _close
+#  endif
+_GL_CXXALIAS_MDA (close, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (close, int, (int fd));
+# endif
+_GL_CXXALIASWARN (close);
 #endif
 
 
@@ -357,10 +425,11 @@
 # endif
 _GL_CXXALIASWARN (copy_file_range);
 #elif defined GNULIB_POSIXCHECK
-/* Assume copy_file_range is always declared.  */
+# if HAVE_RAW_DECL_COPY_FILE_RANGE
 _GL_WARN_ON_USE (copy_file_range,
                  "copy_file_range is unportable - "
                  "use gnulib module copy_file_range for portability");
+# endif
 #endif
 
 
@@ -371,6 +440,12 @@
 #  endif
 _GL_FUNCDECL_RPL (dup, int, (int oldfd));
 _GL_CXXALIAS_RPL (dup, int, (int oldfd));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dup
+#   define dup _dup
+#  endif
+_GL_CXXALIAS_MDA (dup, int, (int oldfd));
 # else
 _GL_CXXALIAS_SYS (dup, int, (int oldfd));
 # endif
@@ -381,6 +456,20 @@
 _GL_WARN_ON_USE (dup, "dup is unportable - "
                  "use gnulib module dup for portability");
 # endif
+#elif @GNULIB_MDA_DUP@
+/* On native Windows, map 'dup' to '_dup', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::dup always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dup
+#   define dup _dup
+#  endif
+_GL_CXXALIAS_MDA (dup, int, (int oldfd));
+# else
+_GL_CXXALIAS_SYS (dup, int, (int oldfd));
+# endif
+_GL_CXXALIASWARN (dup);
 #endif
 
 
@@ -396,10 +485,13 @@
 #  endif
 _GL_FUNCDECL_RPL (dup2, int, (int oldfd, int newfd));
 _GL_CXXALIAS_RPL (dup2, int, (int oldfd, int newfd));
-# else
-#  if !@HAVE_DUP2@
-_GL_FUNCDECL_SYS (dup2, int, (int oldfd, int newfd));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dup2
+#   define dup2 _dup2
 #  endif
+_GL_CXXALIAS_MDA (dup2, int, (int oldfd, int newfd));
+# else
 _GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
 # endif
 _GL_CXXALIASWARN (dup2);
@@ -409,6 +501,20 @@
 _GL_WARN_ON_USE (dup2, "dup2 is unportable - "
                  "use gnulib module dup2 for portability");
 # endif
+#elif @GNULIB_MDA_DUP2@
+/* On native Windows, map 'dup2' to '_dup2', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::dup2 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dup2
+#   define dup2 _dup2
+#  endif
+_GL_CXXALIAS_MDA (dup2, int, (int oldfd, int newfd));
+# else
+_GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
+# endif
+_GL_CXXALIASWARN (dup2);
 #endif
 
 
@@ -509,6 +615,282 @@
 #endif
 
 
+#if @GNULIB_EXECL@
+# if @REPLACE_EXECL@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execl
+#   define execl rpl_execl
+#  endif
+_GL_FUNCDECL_RPL (execl, int, (const char *program, const char *arg, ...)
+                              _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execl, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execl, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execl);
+#elif defined GNULIB_POSIXCHECK
+# undef execl
+# if HAVE_RAW_DECL_EXECL
+_GL_WARN_ON_USE (execl, "execl behaves very differently on mingw - "
+                 "use gnulib module execl for portability");
+# endif
+#elif @GNULIB_MDA_EXECL@
+/* On native Windows, map 'execl' to '_execl', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execl always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execl
+#   define execl _execl
+#  endif
+_GL_CXXALIAS_MDA (execl, intptr_t, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execl, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execl);
+#endif
+
+#if @GNULIB_EXECLE@
+# if @REPLACE_EXECLE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execle
+#   define execle rpl_execle
+#  endif
+_GL_FUNCDECL_RPL (execle, int, (const char *program, const char *arg, ...)
+                               _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execle, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execle, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execle);
+#elif defined GNULIB_POSIXCHECK
+# undef execle
+# if HAVE_RAW_DECL_EXECLE
+_GL_WARN_ON_USE (execle, "execle behaves very differently on mingw - "
+                 "use gnulib module execle for portability");
+# endif
+#elif @GNULIB_MDA_EXECLE@
+/* On native Windows, map 'execle' to '_execle', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execle always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execle
+#   define execle _execle
+#  endif
+_GL_CXXALIAS_MDA (execle, intptr_t,
+                  (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execle, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execle);
+#endif
+
+#if @GNULIB_EXECLP@
+# if @REPLACE_EXECLP@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execlp
+#   define execlp rpl_execlp
+#  endif
+_GL_FUNCDECL_RPL (execlp, int, (const char *program, const char *arg, ...)
+                               _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execlp, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execlp, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execlp);
+#elif defined GNULIB_POSIXCHECK
+# undef execlp
+# if HAVE_RAW_DECL_EXECLP
+_GL_WARN_ON_USE (execlp, "execlp behaves very differently on mingw - "
+                 "use gnulib module execlp for portability");
+# endif
+#elif @GNULIB_MDA_EXECLP@
+/* On native Windows, map 'execlp' to '_execlp', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execlp always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execlp
+#   define execlp _execlp
+#  endif
+_GL_CXXALIAS_MDA (execlp, intptr_t,
+                  (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execlp, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execlp);
+#endif
+
+
+#if @GNULIB_EXECV@
+# if @REPLACE_EXECV@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execv
+#   define execv rpl_execv
+#  endif
+_GL_FUNCDECL_RPL (execv, int, (const char *program, char * const *argv)
+                              _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execv, int, (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execv, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execv);
+#elif defined GNULIB_POSIXCHECK
+# undef execv
+# if HAVE_RAW_DECL_EXECV
+_GL_WARN_ON_USE (execv, "execv behaves very differently on mingw - "
+                 "use gnulib module execv for portability");
+# endif
+#elif @GNULIB_MDA_EXECV@
+/* On native Windows, map 'execv' to '_execv', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execv always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execv
+#   define execv _execv
+#  endif
+_GL_CXXALIAS_MDA_CAST (execv, intptr_t,
+                       (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execv, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execv);
+#endif
+
+#if @GNULIB_EXECVE@
+# if @REPLACE_EXECVE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execve
+#   define execve rpl_execve
+#  endif
+_GL_FUNCDECL_RPL (execve, int,
+                  (const char *program, char * const *argv, char * const *env)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execve, int,
+                  (const char *program, char * const *argv, char * const *env));
+# else
+_GL_CXXALIAS_SYS (execve, int,
+                  (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execve);
+#elif defined GNULIB_POSIXCHECK
+# undef execve
+# if HAVE_RAW_DECL_EXECVE
+_GL_WARN_ON_USE (execve, "execve behaves very differently on mingw - "
+                 "use gnulib module execve for portability");
+# endif
+#elif @GNULIB_MDA_EXECVE@
+/* On native Windows, map 'execve' to '_execve', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execve always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execve
+#   define execve _execve
+#  endif
+_GL_CXXALIAS_MDA_CAST (execve, intptr_t,
+                       (const char *program, char * const *argv,
+                        char * const *env));
+# else
+_GL_CXXALIAS_SYS (execve, int,
+                  (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execve);
+#endif
+
+#if @GNULIB_EXECVP@
+# if @REPLACE_EXECVP@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execvp
+#   define execvp rpl_execvp
+#  endif
+_GL_FUNCDECL_RPL (execvp, int, (const char *program, char * const *argv)
+                               _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execvp, int, (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execvp, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execvp);
+#elif defined GNULIB_POSIXCHECK
+# undef execvp
+# if HAVE_RAW_DECL_EXECVP
+_GL_WARN_ON_USE (execvp, "execvp behaves very differently on mingw - "
+                 "use gnulib module execvp for portability");
+# endif
+#elif @GNULIB_MDA_EXECVP@
+/* On native Windows, map 'execvp' to '_execvp', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execvp always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execvp
+#   define execvp _execvp
+#  endif
+_GL_CXXALIAS_MDA_CAST (execvp, intptr_t,
+                       (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execvp, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execvp);
+#endif
+
+#if @GNULIB_EXECVPE@
+# if @REPLACE_EXECVPE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execvpe
+#   define execvpe rpl_execvpe
+#  endif
+_GL_FUNCDECL_RPL (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env));
+# else
+#  if !@HAVE_DECL_EXECVPE@
+_GL_FUNCDECL_SYS (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execvpe);
+#elif defined GNULIB_POSIXCHECK
+# undef execvpe
+# if HAVE_RAW_DECL_EXECVPE
+_GL_WARN_ON_USE (execvpe, "execvpe behaves very differently on mingw - "
+                 "use gnulib module execvpe for portability");
+# endif
+#elif @GNULIB_MDA_EXECVPE@
+/* On native Windows, map 'execvpe' to '_execvpe', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execvpe on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execvpe
+#   define execvpe _execvpe
+#  endif
+_GL_CXXALIAS_MDA_CAST (execvpe, intptr_t,
+                       (const char *program, char * const *argv,
+                        char * const *env));
+# elif @HAVE_EXECVPE@
+#  if !@HAVE_DECL_EXECVPE@
+_GL_FUNCDECL_SYS (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env));
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_EXECVPE@
+_GL_CXXALIASWARN (execvpe);
+# endif
+#endif
+
+
 #if @GNULIB_FACCESSAT@
 # if @REPLACE_FACCESSAT@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
@@ -596,7 +978,7 @@
 # undef fchownat
 # if HAVE_RAW_DECL_FCHOWNAT
 _GL_WARN_ON_USE (fchownat, "fchownat is not portable - "
-                 "use gnulib module openat for portability");
+                 "use gnulib module fchownat for portability");
 # endif
 #endif
 
@@ -684,6 +1066,12 @@
 #  endif
 _GL_FUNCDECL_RPL (getcwd, char *, (char *buf, size_t size));
 _GL_CXXALIAS_RPL (getcwd, char *, (char *buf, size_t size));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getcwd
+#   define getcwd _getcwd
+#  endif
+_GL_CXXALIAS_MDA (getcwd, char *, (char *buf, size_t size));
 # else
 /* Need to cast, because on mingw, the second parameter is
                                                    int size.  */
@@ -696,6 +1084,22 @@
 _GL_WARN_ON_USE (getcwd, "getcwd is unportable - "
                  "use gnulib module getcwd for portability");
 # endif
+#elif @GNULIB_MDA_GETCWD@
+/* On native Windows, map 'getcwd' to '_getcwd', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::getcwd always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getcwd
+#   define getcwd _getcwd
+#  endif
+/* Need to cast, because on mingw, the second parameter is either
+   'int size' or 'size_t size'.  */
+_GL_CXXALIAS_MDA_CAST (getcwd, char *, (char *buf, size_t size));
+# else
+_GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size));
+# endif
+_GL_CXXALIASWARN (getcwd);
 #endif
 
 
@@ -763,6 +1167,22 @@
 #endif
 
 
+#if @GNULIB_GETENTROPY@
+/* Fill a buffer with random bytes.  */
+# if !@HAVE_GETENTROPY@
+_GL_FUNCDECL_SYS (getentropy, int, (void *buffer, size_t length));
+# endif
+_GL_CXXALIAS_SYS (getentropy, int, (void *buffer, size_t length));
+_GL_CXXALIASWARN (getentropy);
+#elif defined GNULIB_POSIXCHECK
+# undef getentropy
+# if HAVE_RAW_DECL_GETENTROPY
+_GL_WARN_ON_USE (getentropy, "getentropy is unportable - "
+                 "use gnulib module getentropy for portability");
+# endif
+#endif
+
+
 #if @GNULIB_GETGROUPS@
 /* Return the supplemental groups that the current process belongs to.
    It is unspecified whether the effective group id is in the list.
@@ -905,6 +1325,11 @@
 _GL_FUNCDECL_RPL (getpagesize, int, (void));
 _GL_CXXALIAS_RPL (getpagesize, int, (void));
 # else
+/* On HP-UX, getpagesize exists, but it is not declared in <unistd.h> even if
+   the compiler options -D_HPUX_SOURCE -D_XOPEN_SOURCE=600 are used.  */
+#  if defined __hpux
+_GL_FUNCDECL_SYS (getpagesize, int, (void));
+#  endif
 #  if !@HAVE_GETPAGESIZE@
 #   if !defined getpagesize
 /* This is for POSIX systems.  */
@@ -1009,6 +1434,23 @@
 #endif
 
 
+#if @GNULIB_MDA_GETPID@
+/* On native Windows, map 'getpid' to '_getpid', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::getpid always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getpid
+#   define getpid _getpid
+#  endif
+_GL_CXXALIAS_MDA (getpid, int, (void));
+# else
+_GL_CXXALIAS_SYS (getpid, pid_t, (void));
+# endif
+_GL_CXXALIASWARN (getpid);
+#endif
+
+
 #if @GNULIB_GETUSERSHELL@
 /* Return the next valid login shell on the system, or NULL when the end of
    the list has been reached.  */
@@ -1079,8 +1521,15 @@
 #   undef isatty
 #   define isatty rpl_isatty
 #  endif
+#  define GNULIB_defined_isatty 1
 _GL_FUNCDECL_RPL (isatty, int, (int fd));
 _GL_CXXALIAS_RPL (isatty, int, (int fd));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef isatty
+#   define isatty _isatty
+#  endif
+_GL_CXXALIAS_MDA (isatty, int, (int fd));
 # else
 _GL_CXXALIAS_SYS (isatty, int, (int fd));
 # endif
@@ -1091,6 +1540,20 @@
 _GL_WARN_ON_USE (isatty, "isatty has portability problems on native Windows - "
                  "use gnulib module isatty for portability");
 # endif
+#elif @GNULIB_MDA_ISATTY@
+/* On native Windows, map 'isatty' to '_isatty', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::isatty always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef isatty
+#   define isatty _isatty
+#  endif
+_GL_CXXALIAS_MDA (isatty, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (isatty, int, (int fd));
+# endif
+_GL_CXXALIASWARN (isatty);
 #endif
 
 
@@ -1202,6 +1665,12 @@
 #  endif
 _GL_FUNCDECL_RPL (lseek, off_t, (int fd, off_t offset, int whence));
 _GL_CXXALIAS_RPL (lseek, off_t, (int fd, off_t offset, int whence));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef lseek
+#   define lseek _lseek
+#  endif
+_GL_CXXALIAS_MDA (lseek, off_t, (int fd, off_t offset, int whence));
 # else
 _GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
 # endif
@@ -1212,6 +1681,20 @@
 _GL_WARN_ON_USE (lseek, "lseek does not fail with ESPIPE on pipes on some "
                  "systems - use gnulib module lseek for portability");
 # endif
+#elif @GNULIB_MDA_LSEEK@
+/* On native Windows, map 'lseek' to '_lseek', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::lseek always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef lseek
+#   define lseek _lseek
+#  endif
+_GL_CXXALIAS_MDA (lseek, long, (int fd, long offset, int whence));
+# else
+_GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
+# endif
+_GL_CXXALIASWARN (lseek);
 #endif
 
 
@@ -1344,11 +1827,32 @@
 _GL_FUNCDECL_RPL (read, ssize_t, (int fd, void *buf, size_t count)
                                  _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (read, ssize_t, (int fd, void *buf, size_t count));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef read
+#   define read _read
+#  endif
+_GL_CXXALIAS_MDA (read, ssize_t, (int fd, void *buf, size_t count));
 # else
-/* Need to cast, because on mingw, the third parameter is
-                                                          unsigned int count
-   and the return type is 'int'.  */
-_GL_CXXALIAS_SYS_CAST (read, ssize_t, (int fd, void *buf, size_t count));
+_GL_CXXALIAS_SYS (read, ssize_t, (int fd, void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (read);
+#elif @GNULIB_MDA_READ@
+/* On native Windows, map 'read' to '_read', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::read always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef read
+#   define read _read
+#  endif
+#  ifdef __MINGW32__
+_GL_CXXALIAS_MDA (read, int, (int fd, void *buf, unsigned int count));
+#  else
+_GL_CXXALIAS_MDA (read, ssize_t, (int fd, void *buf, unsigned int count));
+#  endif
+# else
+_GL_CXXALIAS_SYS (read, ssize_t, (int fd, void *buf, size_t count));
 # endif
 _GL_CXXALIASWARN (read);
 #endif
@@ -1365,18 +1869,22 @@
 #   define readlink rpl_readlink
 #  endif
 _GL_FUNCDECL_RPL (readlink, ssize_t,
-                  (const char *file, char *buf, size_t bufsize)
+                  (const char *restrict file,
+                   char *restrict buf, size_t bufsize)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (readlink, ssize_t,
-                  (const char *file, char *buf, size_t bufsize));
+                  (const char *restrict file,
+                   char *restrict buf, size_t bufsize));
 # else
 #  if !@HAVE_READLINK@
 _GL_FUNCDECL_SYS (readlink, ssize_t,
-                  (const char *file, char *buf, size_t bufsize)
+                  (const char *restrict file,
+                   char *restrict buf, size_t bufsize)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (readlink, ssize_t,
-                  (const char *file, char *buf, size_t bufsize));
+                  (const char *restrict file,
+                   char *restrict buf, size_t bufsize));
 # endif
 _GL_CXXALIASWARN (readlink);
 #elif defined GNULIB_POSIXCHECK
@@ -1394,18 +1902,22 @@
 #   define readlinkat rpl_readlinkat
 #  endif
 _GL_FUNCDECL_RPL (readlinkat, ssize_t,
-                  (int fd, char const *file, char *buf, size_t len)
+                  (int fd, char const *restrict file,
+                   char *restrict buf, size_t len)
                   _GL_ARG_NONNULL ((2, 3)));
 _GL_CXXALIAS_RPL (readlinkat, ssize_t,
-                  (int fd, char const *file, char *buf, size_t len));
+                  (int fd, char const *restrict file,
+                   char *restrict buf, size_t len));
 # else
 #  if !@HAVE_READLINKAT@
 _GL_FUNCDECL_SYS (readlinkat, ssize_t,
-                  (int fd, char const *file, char *buf, size_t len)
+                  (int fd, char const *restrict file,
+                   char *restrict buf, size_t len)
                   _GL_ARG_NONNULL ((2, 3)));
 #  endif
 _GL_CXXALIAS_SYS (readlinkat, ssize_t,
-                  (int fd, char const *file, char *buf, size_t len));
+                  (int fd, char const *restrict file,
+                   char *restrict buf, size_t len));
 # endif
 _GL_CXXALIASWARN (readlinkat);
 #elif defined GNULIB_POSIXCHECK
@@ -1425,6 +1937,12 @@
 #  endif
 _GL_FUNCDECL_RPL (rmdir, int, (char const *name) _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (rmdir, int, (char const *name));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef rmdir
+#   define rmdir _rmdir
+#  endif
+_GL_CXXALIAS_MDA (rmdir, int, (char const *name));
 # else
 _GL_CXXALIAS_SYS (rmdir, int, (char const *name));
 # endif
@@ -1435,6 +1953,20 @@
 _GL_WARN_ON_USE (rmdir, "rmdir is unportable - "
                  "use gnulib module rmdir for portability");
 # endif
+#elif @GNULIB_MDA_RMDIR@
+/* On native Windows, map 'rmdir' to '_rmdir', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::rmdir always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef rmdir
+#   define rmdir _rmdir
+#  endif
+_GL_CXXALIAS_MDA (rmdir, int, (char const *name));
+# else
+_GL_CXXALIAS_SYS (rmdir, int, (char const *name));
+# endif
+_GL_CXXALIASWARN (rmdir);
 #endif
 
 
@@ -1493,6 +2025,31 @@
 #endif
 
 
+#if @GNULIB_MDA_SWAB@
+/* On native Windows, map 'swab' to '_swab', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::swab always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef swab
+#   define swab _swab
+#  endif
+/* Need to cast, because in old mingw the arguments are
+                             (const char *from, char *to, size_t n).  */
+_GL_CXXALIAS_MDA_CAST (swab, void, (char *from, char *to, int n));
+# else
+#  if defined __hpux /* HP-UX */
+_GL_CXXALIAS_SYS (swab, void, (const char *from, char *to, int n));
+#  elif defined __sun && !defined _XPG4 /* Solaris */
+_GL_CXXALIAS_SYS (swab, void, (const char *from, char *to, ssize_t n));
+#  else
+_GL_CXXALIAS_SYS (swab, void, (const void *from, void *to, ssize_t n));
+#  endif
+# endif
+_GL_CXXALIASWARN (swab);
+#endif
+
+
 #if @GNULIB_SYMLINK@
 # if @REPLACE_SYMLINK@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
@@ -1617,6 +2174,12 @@
 #  endif
 _GL_FUNCDECL_RPL (unlink, int, (char const *file) _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (unlink, int, (char const *file));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef unlink
+#   define unlink _unlink
+#  endif
+_GL_CXXALIAS_MDA (unlink, int, (char const *file));
 # else
 _GL_CXXALIAS_SYS (unlink, int, (char const *file));
 # endif
@@ -1627,6 +2190,20 @@
 _GL_WARN_ON_USE (unlink, "unlink is not portable - "
                  "use gnulib module unlink for portability");
 # endif
+#elif @GNULIB_MDA_UNLINK@
+/* On native Windows, map 'unlink' to '_unlink', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::unlink always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef unlink
+#   define unlink _unlink
+#  endif
+_GL_CXXALIAS_MDA (unlink, int, (char const *file));
+# else
+_GL_CXXALIAS_SYS (unlink, int, (char const *file));
+# endif
+_GL_CXXALIASWARN (unlink);
 #endif
 
 
@@ -1651,7 +2228,7 @@
 # undef unlinkat
 # if HAVE_RAW_DECL_UNLINKAT
 _GL_WARN_ON_USE (unlinkat, "unlinkat is not portable - "
-                 "use gnulib module openat for portability");
+                 "use gnulib module unlinkat for portability");
 # endif
 #endif
 
@@ -1672,7 +2249,9 @@
 #  if !@HAVE_USLEEP@
 _GL_FUNCDECL_SYS (usleep, int, (useconds_t n));
 #  endif
-_GL_CXXALIAS_SYS (usleep, int, (useconds_t n));
+/* Need to cast, because on Haiku, the first parameter is
+                                     unsigned int n.  */
+_GL_CXXALIAS_SYS_CAST (usleep, int, (useconds_t n));
 # endif
 _GL_CXXALIASWARN (usleep);
 #elif defined GNULIB_POSIXCHECK
@@ -1696,11 +2275,32 @@
 _GL_FUNCDECL_RPL (write, ssize_t, (int fd, const void *buf, size_t count)
                                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (write, ssize_t, (int fd, const void *buf, size_t count));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef write
+#   define write _write
+#  endif
+_GL_CXXALIAS_MDA (write, ssize_t, (int fd, const void *buf, size_t count));
 # else
-/* Need to cast, because on mingw, the third parameter is
-                                                             unsigned int count
-   and the return type is 'int'.  */
-_GL_CXXALIAS_SYS_CAST (write, ssize_t, (int fd, const void *buf, size_t count));
+_GL_CXXALIAS_SYS (write, ssize_t, (int fd, const void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (write);
+#elif @GNULIB_MDA_WRITE@
+/* On native Windows, map 'write' to '_write', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::write always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef write
+#   define write _write
+#  endif
+#  ifdef __MINGW32__
+_GL_CXXALIAS_MDA (write, int, (int fd, const void *buf, unsigned int count));
+#  else
+_GL_CXXALIAS_MDA (write, ssize_t, (int fd, const void *buf, unsigned int count));
+#  endif
+# else
+_GL_CXXALIAS_SYS (write, ssize_t, (int fd, const void *buf, size_t count));
 # endif
 _GL_CXXALIASWARN (write);
 #endif
diff --git a/lib/unistr.in.h b/lib/unistr.in.h
new file mode 100644
index 0000000..3b38207
--- /dev/null
+++ b/lib/unistr.in.h
@@ -0,0 +1,753 @@
+/* Elementary Unicode string functions.
+   Copyright (C) 2001-2002, 2005-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _UNISTR_H
+#define _UNISTR_H
+
+#include "unitypes.h"
+
+/* Get bool.  */
+#include <stdbool.h>
+
+/* Get size_t, ptrdiff_t.  */
+#include <stddef.h>
+
+/* Get free().  */
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Conventions:
+
+   All functions prefixed with u8_ operate on UTF-8 encoded strings.
+   Their unit is an uint8_t (1 byte).
+
+   All functions prefixed with u16_ operate on UTF-16 encoded strings.
+   Their unit is an uint16_t (a 2-byte word).
+
+   All functions prefixed with u32_ operate on UCS-4 encoded strings.
+   Their unit is an uint32_t (a 4-byte word).
+
+   All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
+   n units.
+
+   All arguments starting with "str" and the arguments of functions starting
+   with u8_str/u16_str/u32_str denote a NUL terminated string, i.e. a string
+   which terminates at the first NUL unit.  This termination unit is
+   considered part of the string for all memory allocation purposes, but
+   is not considered part of the string for all other logical purposes.
+
+   Functions returning a string result take a (resultbuf, lengthp) argument
+   pair.  If resultbuf is not NULL and the result fits into *lengthp units,
+   it is put in resultbuf, and resultbuf is returned.  Otherwise, a freshly
+   allocated string is returned.  In both cases, *lengthp is set to the
+   length (number of units) of the returned string.  In case of error,
+   NULL is returned and errno is set.  */
+
+
+/* Elementary string checks.  */
+
+/* Check whether an UTF-8 string is well-formed.
+   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
+extern const uint8_t *
+       u8_check (const uint8_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Check whether an UTF-16 string is well-formed.
+   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
+extern const uint16_t *
+       u16_check (const uint16_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Check whether an UCS-4 string is well-formed.
+   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
+extern const uint32_t *
+       u32_check (const uint32_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+
+/* Elementary string conversions.  */
+
+/* Convert an UTF-8 string to an UTF-16 string.  */
+extern uint16_t *
+       u8_to_u16 (const uint8_t *s, size_t n, uint16_t *resultbuf,
+                  size_t *lengthp);
+
+/* Convert an UTF-8 string to an UCS-4 string.  */
+extern uint32_t *
+       u8_to_u32 (const uint8_t *s, size_t n, uint32_t *resultbuf,
+                  size_t *lengthp);
+
+/* Convert an UTF-16 string to an UTF-8 string.  */
+extern uint8_t *
+       u16_to_u8 (const uint16_t *s, size_t n, uint8_t *resultbuf,
+                  size_t *lengthp);
+
+/* Convert an UTF-16 string to an UCS-4 string.  */
+extern uint32_t *
+       u16_to_u32 (const uint16_t *s, size_t n, uint32_t *resultbuf,
+                   size_t *lengthp);
+
+/* Convert an UCS-4 string to an UTF-8 string.  */
+extern uint8_t *
+       u32_to_u8 (const uint32_t *s, size_t n, uint8_t *resultbuf,
+                  size_t *lengthp);
+
+/* Convert an UCS-4 string to an UTF-16 string.  */
+extern uint16_t *
+       u32_to_u16 (const uint32_t *s, size_t n, uint16_t *resultbuf,
+                   size_t *lengthp);
+
+
+/* Elementary string functions.  */
+
+/* Return the length (number of units) of the first character in S, which is
+   no longer than N.  Return 0 if it is the NUL character.  Return -1 upon
+   failure.  */
+/* Similar to mblen(), except that s must not be NULL.  */
+extern int
+       u8_mblen (const uint8_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_mblen (const uint16_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_mblen (const uint32_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the length (number of units) of the first character in S, putting
+   its 'ucs4_t' representation in *PUC.  Upon failure, *PUC is set to 0xfffd,
+   and an appropriate number of units is returned.
+   The number of available units, N, must be > 0.  */
+/* Similar to mbtowc(), except that puc and s must not be NULL, n must be > 0,
+   and the NUL character is not treated specially.  */
+/* The variants with _unsafe suffix are for backward compatibility with
+   libunistring versions < 0.9.7.  */
+
+#if GNULIB_UNISTR_U8_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n);
+# else
+extern int
+       u8_mbtouc_unsafe_aux (ucs4_t *puc, const uint8_t *s, size_t n);
+static inline int
+u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+  uint8_t c = *s;
+
+  if (c < 0x80)
+    {
+      *puc = c;
+      return 1;
+    }
+  else
+    return u8_mbtouc_unsafe_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n);
+# else
+extern int
+       u16_mbtouc_unsafe_aux (ucs4_t *puc, const uint16_t *s, size_t n);
+static inline int
+u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+  uint16_t c = *s;
+
+  if (c < 0xd800 || c >= 0xe000)
+    {
+      *puc = c;
+      return 1;
+    }
+  else
+    return u16_mbtouc_unsafe_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u32_mbtouc_unsafe (ucs4_t *puc, const uint32_t *s, size_t n);
+# else
+static inline int
+u32_mbtouc_unsafe (ucs4_t *puc,
+                   const uint32_t *s, _GL_ATTRIBUTE_MAYBE_UNUSED size_t n)
+{
+  uint32_t c = *s;
+
+  if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+    *puc = c;
+  else
+    /* invalid multibyte character */
+    *puc = 0xfffd;
+  return 1;
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U8_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n);
+# else
+extern int
+       u8_mbtouc_aux (ucs4_t *puc, const uint8_t *s, size_t n);
+static inline int
+u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+  uint8_t c = *s;
+
+  if (c < 0x80)
+    {
+      *puc = c;
+      return 1;
+    }
+  else
+    return u8_mbtouc_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n);
+# else
+extern int
+       u16_mbtouc_aux (ucs4_t *puc, const uint16_t *s, size_t n);
+static inline int
+u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+  uint16_t c = *s;
+
+  if (c < 0xd800 || c >= 0xe000)
+    {
+      *puc = c;
+      return 1;
+    }
+  else
+    return u16_mbtouc_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n);
+# else
+static inline int
+u32_mbtouc (ucs4_t *puc, const uint32_t *s,
+            _GL_ATTRIBUTE_MAYBE_UNUSED size_t n)
+{
+  uint32_t c = *s;
+
+  if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+    *puc = c;
+  else
+    /* invalid multibyte character */
+    *puc = 0xfffd;
+  return 1;
+}
+# endif
+#endif
+
+/* Return the length (number of units) of the first character in S, putting
+   its 'ucs4_t' representation in *PUC.  Upon failure, *PUC is set to 0xfffd,
+   and -1 is returned for an invalid sequence of units, -2 is returned for an
+   incomplete sequence of units.
+   The number of available units, N, must be > 0.  */
+/* Similar to u*_mbtouc(), except that the return value gives more details
+   about the failure, similar to mbrtowc().  */
+
+#if GNULIB_UNISTR_U8_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+       u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n);
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+       u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n);
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+       u32_mbtoucr (ucs4_t *puc, const uint32_t *s, size_t n);
+#endif
+
+/* Put the multibyte character represented by UC in S, returning its
+   length.  Return -1 upon failure, -2 if the number of available units, N,
+   is too small.  The latter case cannot occur if N >= 6/2/1, respectively.  */
+/* Similar to wctomb(), except that s must not be NULL, and the argument n
+   must be specified.  */
+
+#if GNULIB_UNISTR_U8_UCTOMB || HAVE_LIBUNISTRING
+/* Auxiliary function, also used by u8_chr, u8_strchr, u8_strrchr.  */
+extern int
+       u8_uctomb_aux (uint8_t *s, ucs4_t uc, ptrdiff_t n);
+# if !HAVE_INLINE
+extern int
+       u8_uctomb (uint8_t *s, ucs4_t uc, ptrdiff_t n);
+# else
+static inline int
+u8_uctomb (uint8_t *s, ucs4_t uc, ptrdiff_t n)
+{
+  if (uc < 0x80 && n > 0)
+    {
+      s[0] = uc;
+      return 1;
+    }
+  else
+    return u8_uctomb_aux (s, uc, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_UCTOMB || HAVE_LIBUNISTRING
+/* Auxiliary function, also used by u16_chr, u16_strchr, u16_strrchr.  */
+extern int
+       u16_uctomb_aux (uint16_t *s, ucs4_t uc, ptrdiff_t n);
+# if !HAVE_INLINE
+extern int
+       u16_uctomb (uint16_t *s, ucs4_t uc, ptrdiff_t n);
+# else
+static inline int
+u16_uctomb (uint16_t *s, ucs4_t uc, ptrdiff_t n)
+{
+  if (uc < 0xd800 && n > 0)
+    {
+      s[0] = uc;
+      return 1;
+    }
+  else
+    return u16_uctomb_aux (s, uc, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_UCTOMB || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u32_uctomb (uint32_t *s, ucs4_t uc, ptrdiff_t n);
+# else
+static inline int
+u32_uctomb (uint32_t *s, ucs4_t uc, ptrdiff_t n)
+{
+  if (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000))
+    {
+      if (n > 0)
+        {
+          *s = uc;
+          return 1;
+        }
+      else
+        return -2;
+    }
+  else
+    return -1;
+}
+# endif
+#endif
+
+/* Copy N units from SRC to DEST.  */
+/* Similar to memcpy().  */
+extern uint8_t *
+       u8_cpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_cpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_cpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Copy N units from SRC to DEST, guaranteeing correct behavior for
+   overlapping memory areas.  */
+/* Similar to memmove().  */
+extern uint8_t *
+       u8_move (uint8_t *dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_move (uint16_t *dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_move (uint32_t *dest, const uint32_t *src, size_t n);
+
+/* Set the first N characters of S to UC.  UC should be a character that
+   occupies only 1 unit.  */
+/* Similar to memset().  */
+extern uint8_t *
+       u8_set (uint8_t *s, ucs4_t uc, size_t n);
+extern uint16_t *
+       u16_set (uint16_t *s, ucs4_t uc, size_t n);
+extern uint32_t *
+       u32_set (uint32_t *s, ucs4_t uc, size_t n);
+
+/* Compare S1 and S2, each of length N.  */
+/* Similar to memcmp().  */
+extern int
+       u8_cmp (const uint8_t *s1, const uint8_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_cmp (const uint16_t *s1, const uint16_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_cmp (const uint32_t *s1, const uint32_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Compare S1 and S2.  */
+/* Similar to the gnulib function memcmp2().  */
+extern int
+       u8_cmp2 (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_cmp2 (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_cmp2 (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2)
+       _UC_ATTRIBUTE_PURE;
+
+/* Search the string at S for UC.  */
+/* Similar to memchr().  */
+extern uint8_t *
+       u8_chr (const uint8_t *s, size_t n, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_chr (const uint16_t *s, size_t n, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_chr (const uint32_t *s, size_t n, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+
+/* Count the number of Unicode characters in the N units from S.  */
+/* Similar to mbsnlen().  */
+extern size_t
+       u8_mbsnlen (const uint8_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_mbsnlen (const uint16_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_mbsnlen (const uint32_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Elementary string functions with memory allocation.  */
+
+/* Make a freshly allocated copy of S, of length N.  */
+extern uint8_t *
+       u8_cpy_alloc (const uint8_t *s, size_t n);
+extern uint16_t *
+       u16_cpy_alloc (const uint16_t *s, size_t n);
+extern uint32_t *
+       u32_cpy_alloc (const uint32_t *s, size_t n);
+
+/* Elementary string functions on NUL terminated strings.  */
+
+/* Return the length (number of units) of the first character in S.
+   Return 0 if it is the NUL character.  Return -1 upon failure.  */
+extern int
+       u8_strmblen (const uint8_t *s)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_strmblen (const uint16_t *s)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_strmblen (const uint32_t *s)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the length (number of units) of the first character in S, putting
+   its 'ucs4_t' representation in *PUC.  Return 0 if it is the NUL
+   character.  Return -1 upon failure.  */
+extern int
+       u8_strmbtouc (ucs4_t *puc, const uint8_t *s);
+extern int
+       u16_strmbtouc (ucs4_t *puc, const uint16_t *s);
+extern int
+       u32_strmbtouc (ucs4_t *puc, const uint32_t *s);
+
+/* Forward iteration step.  Advances the pointer past the next character,
+   or returns NULL if the end of the string has been reached.  Puts the
+   character's 'ucs4_t' representation in *PUC.  */
+extern const uint8_t *
+       u8_next (ucs4_t *puc, const uint8_t *s);
+extern const uint16_t *
+       u16_next (ucs4_t *puc, const uint16_t *s);
+extern const uint32_t *
+       u32_next (ucs4_t *puc, const uint32_t *s);
+
+/* Backward iteration step.  Advances the pointer to point to the previous
+   character, or returns NULL if the beginning of the string had been reached.
+   Puts the character's 'ucs4_t' representation in *PUC.  */
+extern const uint8_t *
+       u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start);
+extern const uint16_t *
+       u16_prev (ucs4_t *puc, const uint16_t *s, const uint16_t *start);
+extern const uint32_t *
+       u32_prev (ucs4_t *puc, const uint32_t *s, const uint32_t *start);
+
+/* Return the number of units in S.  */
+/* Similar to strlen(), wcslen().  */
+extern size_t
+       u8_strlen (const uint8_t *s)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_strlen (const uint16_t *s)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_strlen (const uint32_t *s)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the number of units in S, but at most MAXLEN.  */
+/* Similar to strnlen(), wcsnlen().  */
+extern size_t
+       u8_strnlen (const uint8_t *s, size_t maxlen)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_strnlen (const uint16_t *s, size_t maxlen)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_strnlen (const uint32_t *s, size_t maxlen)
+       _UC_ATTRIBUTE_PURE;
+
+/* Copy SRC to DEST.  */
+/* Similar to strcpy(), wcscpy().  */
+extern uint8_t *
+       u8_strcpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
+extern uint16_t *
+       u16_strcpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
+extern uint32_t *
+       u32_strcpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
+
+/* Copy SRC to DEST, returning the address of the terminating NUL in DEST.  */
+/* Similar to stpcpy().  */
+extern uint8_t *
+       u8_stpcpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
+extern uint16_t *
+       u16_stpcpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
+extern uint32_t *
+       u32_stpcpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
+
+/* Copy no more than N units of SRC to DEST.  */
+/* Similar to strncpy(), wcsncpy().  */
+extern uint8_t *
+       u8_strncpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_strncpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_strncpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Copy no more than N units of SRC to DEST.  Return a pointer past the last
+   non-NUL unit written into DEST.  */
+/* Similar to stpncpy().  */
+extern uint8_t *
+       u8_stpncpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_stpncpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_stpncpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Append SRC onto DEST.  */
+/* Similar to strcat(), wcscat().  */
+extern uint8_t *
+       u8_strcat (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
+extern uint16_t *
+       u16_strcat (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
+extern uint32_t *
+       u32_strcat (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
+
+/* Append no more than N units of SRC onto DEST.  */
+/* Similar to strncat(), wcsncat().  */
+extern uint8_t *
+       u8_strncat (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_strncat (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_strncat (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Compare S1 and S2.  */
+/* Similar to strcmp(), wcscmp().  */
+#ifdef __sun
+/* Avoid a collision with the u8_strcmp() function in Solaris 11 libc.  */
+extern int
+       u8_strcmp_gnu (const uint8_t *s1, const uint8_t *s2)
+       _UC_ATTRIBUTE_PURE;
+# define u8_strcmp u8_strcmp_gnu
+#else
+extern int
+       u8_strcmp (const uint8_t *s1, const uint8_t *s2)
+       _UC_ATTRIBUTE_PURE;
+#endif
+extern int
+       u16_strcmp (const uint16_t *s1, const uint16_t *s2)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_strcmp (const uint32_t *s1, const uint32_t *s2)
+       _UC_ATTRIBUTE_PURE;
+
+/* Compare S1 and S2 using the collation rules of the current locale.
+   Return -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2.
+   Upon failure, set errno and return any value.  */
+/* Similar to strcoll(), wcscoll().  */
+extern int
+       u8_strcoll (const uint8_t *s1, const uint8_t *s2);
+extern int
+       u16_strcoll (const uint16_t *s1, const uint16_t *s2);
+extern int
+       u32_strcoll (const uint32_t *s1, const uint32_t *s2);
+
+/* Compare no more than N units of S1 and S2.  */
+/* Similar to strncmp(), wcsncmp().  */
+extern int
+       u8_strncmp (const uint8_t *s1, const uint8_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_strncmp (const uint16_t *s1, const uint16_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_strncmp (const uint32_t *s1, const uint32_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Duplicate S, returning an identical malloc'd string.  */
+/* Similar to strdup(), wcsdup().  */
+extern uint8_t *
+       u8_strdup (const uint8_t *s)
+       _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
+extern uint16_t *
+       u16_strdup (const uint16_t *s)
+       _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
+extern uint32_t *
+       u32_strdup (const uint32_t *s)
+       _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
+
+/* Find the first occurrence of UC in STR.  */
+/* Similar to strchr(), wcschr().  */
+extern uint8_t *
+       u8_strchr (const uint8_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_strchr (const uint16_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_strchr (const uint32_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+
+/* Find the last occurrence of UC in STR.  */
+/* Similar to strrchr(), wcsrchr().  */
+extern uint8_t *
+       u8_strrchr (const uint8_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_strrchr (const uint16_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_strrchr (const uint32_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the length of the initial segment of STR which consists entirely
+   of Unicode characters not in REJECT.  */
+/* Similar to strcspn(), wcscspn().  */
+extern size_t
+       u8_strcspn (const uint8_t *str, const uint8_t *reject)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_strcspn (const uint16_t *str, const uint16_t *reject)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_strcspn (const uint32_t *str, const uint32_t *reject)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the length of the initial segment of STR which consists entirely
+   of Unicode characters in ACCEPT.  */
+/* Similar to strspn(), wcsspn().  */
+extern size_t
+       u8_strspn (const uint8_t *str, const uint8_t *accept)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_strspn (const uint16_t *str, const uint16_t *accept)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_strspn (const uint32_t *str, const uint32_t *accept)
+       _UC_ATTRIBUTE_PURE;
+
+/* Find the first occurrence in STR of any character in ACCEPT.  */
+/* Similar to strpbrk(), wcspbrk().  */
+extern uint8_t *
+       u8_strpbrk (const uint8_t *str, const uint8_t *accept)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_strpbrk (const uint16_t *str, const uint16_t *accept)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_strpbrk (const uint32_t *str, const uint32_t *accept)
+       _UC_ATTRIBUTE_PURE;
+
+/* Find the first occurrence of NEEDLE in HAYSTACK.  */
+/* Similar to strstr(), wcsstr().  */
+extern uint8_t *
+       u8_strstr (const uint8_t *haystack, const uint8_t *needle)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_strstr (const uint16_t *haystack, const uint16_t *needle)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_strstr (const uint32_t *haystack, const uint32_t *needle)
+       _UC_ATTRIBUTE_PURE;
+
+/* Test whether STR starts with PREFIX.  */
+extern bool
+       u8_startswith (const uint8_t *str, const uint8_t *prefix)
+       _UC_ATTRIBUTE_PURE;
+extern bool
+       u16_startswith (const uint16_t *str, const uint16_t *prefix)
+       _UC_ATTRIBUTE_PURE;
+extern bool
+       u32_startswith (const uint32_t *str, const uint32_t *prefix)
+       _UC_ATTRIBUTE_PURE;
+
+/* Test whether STR ends with SUFFIX.  */
+extern bool
+       u8_endswith (const uint8_t *str, const uint8_t *suffix)
+       _UC_ATTRIBUTE_PURE;
+extern bool
+       u16_endswith (const uint16_t *str, const uint16_t *suffix)
+       _UC_ATTRIBUTE_PURE;
+extern bool
+       u32_endswith (const uint32_t *str, const uint32_t *suffix)
+       _UC_ATTRIBUTE_PURE;
+
+/* Divide STR into tokens separated by characters in DELIM.
+   This interface is actually more similar to wcstok than to strtok.  */
+/* Similar to strtok_r(), wcstok().  */
+extern uint8_t *
+       u8_strtok (uint8_t *_UC_RESTRICT str, const uint8_t *delim,
+                  uint8_t **ptr);
+extern uint16_t *
+       u16_strtok (uint16_t *_UC_RESTRICT str, const uint16_t *delim,
+                   uint16_t **ptr);
+extern uint32_t *
+       u32_strtok (uint32_t *_UC_RESTRICT str, const uint32_t *delim,
+                   uint32_t **ptr);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNISTR_H */
diff --git a/lib/unistr/u8-mbtoucr.c b/lib/unistr/u8-mbtoucr.c
new file mode 100644
index 0000000..77a6cac
--- /dev/null
+++ b/lib/unistr/u8-mbtoucr.c
@@ -0,0 +1,142 @@
+/* Look at first character in UTF-8 string, returning an error code.
+   Copyright (C) 1999-2002, 2006-2007, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "unistr.h"
+
+int
+u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+  uint8_t c = *s;
+
+  if (c < 0x80)
+    {
+      *puc = c;
+      return 1;
+    }
+  else if (c >= 0xc2)
+    {
+      if (c < 0xe0)
+        {
+          if (n >= 2)
+            {
+              if ((s[1] ^ 0x80) < 0x40)
+                {
+                  *puc = ((unsigned int) (c & 0x1f) << 6)
+                         | (unsigned int) (s[1] ^ 0x80);
+                  return 2;
+                }
+              /* invalid multibyte character */
+            }
+          else
+            {
+              /* incomplete multibyte character */
+              *puc = 0xfffd;
+              return -2;
+            }
+        }
+      else if (c < 0xf0)
+        {
+          if (n >= 2)
+            {
+              if ((s[1] ^ 0x80) < 0x40
+                  && (c >= 0xe1 || s[1] >= 0xa0)
+                  && (c != 0xed || s[1] < 0xa0))
+                {
+                  if (n >= 3)
+                    {
+                      if ((s[2] ^ 0x80) < 0x40)
+                        {
+                          *puc = ((unsigned int) (c & 0x0f) << 12)
+                                 | ((unsigned int) (s[1] ^ 0x80) << 6)
+                                 | (unsigned int) (s[2] ^ 0x80);
+                          return 3;
+                        }
+                      /* invalid multibyte character */
+                    }
+                  else
+                    {
+                      /* incomplete multibyte character */
+                      *puc = 0xfffd;
+                      return -2;
+                    }
+                }
+              /* invalid multibyte character */
+            }
+          else
+            {
+              /* incomplete multibyte character */
+              *puc = 0xfffd;
+              return -2;
+            }
+        }
+      else if (c < 0xf8)
+        {
+          if (n >= 2)
+            {
+              if ((s[1] ^ 0x80) < 0x40
+                  && (c >= 0xf1 || s[1] >= 0x90)
+                  && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90)))
+                {
+                  if (n >= 3)
+                    {
+                      if ((s[2] ^ 0x80) < 0x40)
+                        {
+                          if (n >= 4)
+                            {
+                              if ((s[3] ^ 0x80) < 0x40)
+                                {
+                                  *puc = ((unsigned int) (c & 0x07) << 18)
+                                         | ((unsigned int) (s[1] ^ 0x80) << 12)
+                                         | ((unsigned int) (s[2] ^ 0x80) << 6)
+                                         | (unsigned int) (s[3] ^ 0x80);
+                                  return 4;
+                                }
+                              /* invalid multibyte character */
+                            }
+                          else
+                            {
+                              /* incomplete multibyte character */
+                              *puc = 0xfffd;
+                              return -2;
+                            }
+                        }
+                      /* invalid multibyte character */
+                    }
+                  else
+                    {
+                      /* incomplete multibyte character */
+                      *puc = 0xfffd;
+                      return -2;
+                    }
+                }
+              /* invalid multibyte character */
+            }
+          else
+            {
+              /* incomplete multibyte character */
+              *puc = 0xfffd;
+              return -2;
+            }
+        }
+    }
+  /* invalid multibyte character */
+  *puc = 0xfffd;
+  return -1;
+}
diff --git a/lib/unistr/u8-uctomb-aux.c b/lib/unistr/u8-uctomb-aux.c
new file mode 100644
index 0000000..2be1cfb
--- /dev/null
+++ b/lib/unistr/u8-uctomb-aux.c
@@ -0,0 +1,60 @@
+/* Conversion UCS-4 to UTF-8.
+   Copyright (C) 2002, 2006-2007, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "unistr.h"
+
+#include "attribute.h"
+
+int
+u8_uctomb_aux (uint8_t *s, ucs4_t uc, ptrdiff_t n)
+{
+  int count;
+
+  if (uc < 0x80)
+    /* The case n >= 1 is already handled by the caller.  */
+    return -2;
+  else if (uc < 0x800)
+    count = 2;
+  else if (uc < 0x10000)
+    {
+      if (uc < 0xd800 || uc >= 0xe000)
+        count = 3;
+      else
+        return -1;
+    }
+  else if (uc < 0x110000)
+    count = 4;
+  else
+    return -1;
+
+  if (n < count)
+    return -2;
+
+  switch (count) /* note: code falls through cases! */
+    {
+    case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000;
+      FALLTHROUGH;
+    case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800;
+      FALLTHROUGH;
+    case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0;
+  /*case 1:*/ s[0] = uc;
+    }
+  return count;
+}
diff --git a/lib/unistr/u8-uctomb.c b/lib/unistr/u8-uctomb.c
new file mode 100644
index 0000000..e2577c6
--- /dev/null
+++ b/lib/unistr/u8-uctomb.c
@@ -0,0 +1,79 @@
+/* Store a character in UTF-8 string.
+   Copyright (C) 2002, 2005-2006, 2009-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u8_uctomb as 'extern', not 'static inline'.  */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification.  */
+#include "unistr.h"
+
+#include "attribute.h"
+
+#if !HAVE_INLINE
+
+int
+u8_uctomb (uint8_t *s, ucs4_t uc, ptrdiff_t n)
+{
+  if (uc < 0x80)
+    {
+      if (n > 0)
+        {
+          s[0] = uc;
+          return 1;
+        }
+      /* else return -2, below.  */
+    }
+  else
+    {
+      int count;
+
+      if (uc < 0x800)
+        count = 2;
+      else if (uc < 0x10000)
+        {
+          if (uc < 0xd800 || uc >= 0xe000)
+            count = 3;
+          else
+            return -1;
+        }
+      else if (uc < 0x110000)
+        count = 4;
+      else
+        return -1;
+
+      if (n >= count)
+        {
+          switch (count) /* note: code falls through cases! */
+            {
+            case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000;
+              FALLTHROUGH;
+            case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800;
+              FALLTHROUGH;
+            case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0;
+          /*case 1:*/ s[0] = uc;
+            }
+          return count;
+        }
+    }
+  return -2;
+}
+
+#endif
diff --git a/lib/unitypes.in.h b/lib/unitypes.in.h
index 631654b..82ee0de 100644
--- a/lib/unitypes.in.h
+++ b/lib/unitypes.in.h
@@ -1,17 +1,17 @@
 /* Elementary types and macros for the GNU UniString library.
-   Copyright (C) 2002, 2005-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2005-2006, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _UNITYPES_H
@@ -26,7 +26,7 @@
 /* Attribute of a function whose result depends only on the arguments
    (not pointers!) and which has no side effects.  */
 #ifndef _UC_ATTRIBUTE_CONST
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) || defined __clang__
 #  define _UC_ATTRIBUTE_CONST __attribute__ ((__const__))
 # else
 #  define _UC_ATTRIBUTE_CONST
@@ -36,11 +36,26 @@
 /* Attribute of a function whose result depends only on the arguments
    (possibly pointers) and global memory, and which has no side effects.  */
 #ifndef _UC_ATTRIBUTE_PURE
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
 #  define _UC_ATTRIBUTE_PURE __attribute__ ((__pure__))
 # else
 #  define _UC_ATTRIBUTE_PURE
 # endif
 #endif
 
+/* Qualifier in a function declaration, that asserts that the caller must
+   pass a pointer to a different object in the specified pointer argument
+   than in the other pointer arguments.  */
+#ifndef _UC_RESTRICT
+# if defined __restrict \
+     || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+     || __clang_major__ >= 3
+#  define _UC_RESTRICT __restrict
+# elif 199901L <= __STDC_VERSION__ || defined restrict
+#  define _UC_RESTRICT restrict
+# else
+#  define _UC_RESTRICT
+# endif
+#endif
+
 #endif /* _UNITYPES_H */
diff --git a/lib/uniwidth.in.h b/lib/uniwidth.in.h
index 80c5eea..0859254 100644
--- a/lib/uniwidth.in.h
+++ b/lib/uniwidth.in.h
@@ -1,18 +1,18 @@
 /* Display width functions.
-   Copyright (C) 2001-2002, 2005, 2007, 2009-2019 Free Software Foundation,
+   Copyright (C) 2001-2002, 2005, 2007, 2009-2021 Free Software Foundation,
    Inc.
 
-   This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _UNIWIDTH_H
diff --git a/lib/uniwidth/cjk.h b/lib/uniwidth/cjk.h
index 9870422..1853ceb 100644
--- a/lib/uniwidth/cjk.h
+++ b/lib/uniwidth/cjk.h
@@ -1,18 +1,18 @@
 /* Test for CJK encoding.
-   Copyright (C) 2001-2002, 2005-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2002, 2005-2007, 2009-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2002.
 
-   This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include "streq.h"
diff --git a/lib/uniwidth/width.c b/lib/uniwidth/width.c
index a7f59b1..9ba07d3 100644
--- a/lib/uniwidth/width.c
+++ b/lib/uniwidth/width.c
@@ -1,18 +1,18 @@
 /* Determine display width of Unicode character.
-   Copyright (C) 2001-2002, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2002, 2006-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2002.
 
-   This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
diff --git a/lib/unlink.c b/lib/unlink.c
index 90dc9d3..1bc00fb 100644
--- a/lib/unlink.c
+++ b/lib/unlink.c
@@ -1,18 +1,18 @@
 /* Work around unlink bugs.
 
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
@@ -24,9 +24,12 @@
 #include <string.h>
 #include <sys/stat.h>
 
-#include "dosname.h"
+#include "filename.h"
 
 #undef unlink
+#if defined _WIN32 && !defined __CYGWIN__
+# define unlink _unlink
+#endif
 
 /* Remove file NAME.
    Return 0 if successful, -1 if not.  */
@@ -60,15 +63,12 @@
          can't delete a directory via a symlink.  */
       struct stat st;
       result = lstat (name, &st);
-      if (result == 0)
+      if (result == 0 || errno == EOVERFLOW)
         {
           /* Trailing NUL will overwrite the trailing slash.  */
           char *short_name = malloc (len);
           if (!short_name)
-            {
-              errno = EPERM;
-              return -1;
-            }
+            return -1;
           memcpy (short_name, name, len);
           while (len && ISSLASH (short_name[len - 1]))
             short_name[--len] = '\0';
@@ -79,6 +79,7 @@
               return -1;
             }
           free (short_name);
+          result = 0;
         }
     }
   if (!result)
diff --git a/lib/unlocked-io.h b/lib/unlocked-io.h
index ee1c062..ca184b3 100644
--- a/lib/unlocked-io.h
+++ b/lib/unlocked-io.h
@@ -1,6 +1,6 @@
 /* Prefer faster, non-thread-safe stdio functions if available.
 
-   Copyright (C) 2001-2004, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2004, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -33,91 +33,91 @@
 
 # include <stdio.h>
 
-# if HAVE_DECL_CLEARERR_UNLOCKED
+# if HAVE_DECL_CLEARERR_UNLOCKED || defined clearerr_unlocked
 #  undef clearerr
 #  define clearerr(x) clearerr_unlocked (x)
 # else
 #  define clearerr_unlocked(x) clearerr (x)
 # endif
 
-# if HAVE_DECL_FEOF_UNLOCKED
+# if HAVE_DECL_FEOF_UNLOCKED || defined feof_unlocked
 #  undef feof
 #  define feof(x) feof_unlocked (x)
 # else
 #  define feof_unlocked(x) feof (x)
 # endif
 
-# if HAVE_DECL_FERROR_UNLOCKED
+# if HAVE_DECL_FERROR_UNLOCKED || defined ferror_unlocked
 #  undef ferror
 #  define ferror(x) ferror_unlocked (x)
 # else
 #  define ferror_unlocked(x) ferror (x)
 # endif
 
-# if HAVE_DECL_FFLUSH_UNLOCKED
+# if HAVE_DECL_FFLUSH_UNLOCKED || defined fflush_unlocked
 #  undef fflush
 #  define fflush(x) fflush_unlocked (x)
 # else
 #  define fflush_unlocked(x) fflush (x)
 # endif
 
-# if HAVE_DECL_FGETS_UNLOCKED
+# if HAVE_DECL_FGETS_UNLOCKED || defined fgets_unlocked
 #  undef fgets
 #  define fgets(x,y,z) fgets_unlocked (x,y,z)
 # else
 #  define fgets_unlocked(x,y,z) fgets (x,y,z)
 # endif
 
-# if HAVE_DECL_FPUTC_UNLOCKED
+# if HAVE_DECL_FPUTC_UNLOCKED || defined fputc_unlocked
 #  undef fputc
 #  define fputc(x,y) fputc_unlocked (x,y)
 # else
 #  define fputc_unlocked(x,y) fputc (x,y)
 # endif
 
-# if HAVE_DECL_FPUTS_UNLOCKED
+# if HAVE_DECL_FPUTS_UNLOCKED || defined fputs_unlocked
 #  undef fputs
 #  define fputs(x,y) fputs_unlocked (x,y)
 # else
 #  define fputs_unlocked(x,y) fputs (x,y)
 # endif
 
-# if HAVE_DECL_FREAD_UNLOCKED
+# if HAVE_DECL_FREAD_UNLOCKED || defined fread_unlocked
 #  undef fread
 #  define fread(w,x,y,z) fread_unlocked (w,x,y,z)
 # else
 #  define fread_unlocked(w,x,y,z) fread (w,x,y,z)
 # endif
 
-# if HAVE_DECL_FWRITE_UNLOCKED
+# if HAVE_DECL_FWRITE_UNLOCKED || defined fwrite_unlocked
 #  undef fwrite
 #  define fwrite(w,x,y,z) fwrite_unlocked (w,x,y,z)
 # else
 #  define fwrite_unlocked(w,x,y,z) fwrite (w,x,y,z)
 # endif
 
-# if HAVE_DECL_GETC_UNLOCKED
+# if HAVE_DECL_GETC_UNLOCKED || defined get_unlocked
 #  undef getc
 #  define getc(x) getc_unlocked (x)
 # else
 #  define getc_unlocked(x) getc (x)
 # endif
 
-# if HAVE_DECL_GETCHAR_UNLOCKED
+# if HAVE_DECL_GETCHAR_UNLOCKED || defined getchar_unlocked
 #  undef getchar
 #  define getchar() getchar_unlocked ()
 # else
 #  define getchar_unlocked() getchar ()
 # endif
 
-# if HAVE_DECL_PUTC_UNLOCKED
+# if HAVE_DECL_PUTC_UNLOCKED || defined putc_unlocked
 #  undef putc
 #  define putc(x,y) putc_unlocked (x,y)
 # else
 #  define putc_unlocked(x,y) putc (x,y)
 # endif
 
-# if HAVE_DECL_PUTCHAR_UNLOCKED
+# if HAVE_DECL_PUTCHAR_UNLOCKED || defined putchar_unlocked
 #  undef putchar
 #  define putchar(x) putchar_unlocked (x)
 # else
diff --git a/lib/unsetenv.c b/lib/unsetenv.c
index 0199280..b2e910e 100644
--- a/lib/unsetenv.c
+++ b/lib/unsetenv.c
@@ -1,17 +1,17 @@
-/* Copyright (C) 1992, 1995-2002, 2005-2019 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1995-2002, 2005-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Don't use __attribute__ __nonnull__ in this compilation unit.  Otherwise gcc
diff --git a/lib/vasnprintf.c b/lib/vasnprintf.c
index b3854e3..d9b669d 100644
--- a/lib/vasnprintf.c
+++ b/lib/vasnprintf.c
@@ -1,18 +1,18 @@
 /* vsprintf with automatic memory allocation.
-   Copyright (C) 1999, 2002-2019 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2002-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* This file can be parametrized with the following macros:
      VASNPRINTF         The name of the function being defined.
@@ -41,7 +41,14 @@
      DCHAR_CONV_FROM_ENCODING A function to convert from char[] to DCHAR[].
      DCHAR_IS_UINT8_T   Set to 1 if DCHAR_T is uint8_t.
      DCHAR_IS_UINT16_T  Set to 1 if DCHAR_T is uint16_t.
-     DCHAR_IS_UINT32_T  Set to 1 if DCHAR_T is uint32_t.  */
+     DCHAR_IS_UINT32_T  Set to 1 if DCHAR_T is uint32_t.
+     ENABLE_UNISTDIO    Set to 1 to enable the unistdio extensions.
+     ENABLE_WCHAR_FALLBACK  Set to 1 to avoid EILSEQ during conversion of wide
+                        characters (wchar_t) and wide character strings
+                        (wchar_t[]) to multibyte sequences.  The fallback is the
+                        hexadecimal escape syntax (\unnnn or \Unnnnnnnn) or,
+                        if wchar_t is not Unicode encoded, \wnnnn or \Wnnnnnnnn.
+ */
 
 /* Tell glibc's <stdio.h> to provide a prototype for snprintf().
    This must come before <config.h> because <config.h> may include
@@ -53,10 +60,16 @@
 #ifndef VASNPRINTF
 # include <config.h>
 #endif
-#ifndef IN_LIBINTL
-# include <alloca.h>
+
+/* As of GCC 11.2.1, gcc -Wanalyzer-too-complex reports that main's
+   use of CHECK macros expands to code that is too complicated for gcc
+   -fanalyzer.  Suppress the resulting bogus warnings.  */
+#if 10 <= __GNUC__
+# pragma GCC diagnostic ignored "-Wanalyzer-null-argument"
 #endif
 
+#include <alloca.h>
+
 /* Specification.  */
 #ifndef VASNPRINTF
 # if WIDE_CHAR_VERSION
@@ -87,6 +100,7 @@
 /* Checked size_t computations.  */
 #include "xsize.h"
 
+#include "attribute.h"
 #include "verify.h"
 
 #if (NEED_PRINTF_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
@@ -118,14 +132,6 @@
 # include "fpucw.h"
 #endif
 
-#ifndef FALLTHROUGH
-# if __GNUC__ < 7
-#  define FALLTHROUGH ((void) 0)
-# else
-#  define FALLTHROUGH __attribute__ ((__fallthrough__))
-# endif
-#endif
-
 /* Default parameters.  */
 #ifndef VASNPRINTF
 # if WIDE_CHAR_VERSION
@@ -277,6 +283,74 @@
 # endif
 #endif
 
+#if (((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL) || ENABLE_WCHAR_FALLBACK) && HAVE_WCHAR_T) || (ENABLE_WCHAR_FALLBACK && HAVE_WINT_T)) && !WIDE_CHAR_VERSION
+# if ENABLE_WCHAR_FALLBACK
+static size_t
+wctomb_fallback (char *s, wchar_t wc)
+{
+  static char hex[16] = "0123456789ABCDEF";
+
+  s[0] = '\\';
+  if (sizeof (wchar_t) > 2 && wc > 0xffff)
+    {
+#  if __STDC_ISO_10646__ || (__GLIBC__ >= 2) || (defined _WIN32 || defined __CYGWIN__)
+      s[1] = 'U';
+#  else
+      s[1] = 'W';
+#  endif
+      s[2] = hex[(wc & 0xf0000000U) >> 28];
+      s[3] = hex[(wc & 0xf000000U) >> 24];
+      s[4] = hex[(wc & 0xf00000U) >> 20];
+      s[5] = hex[(wc & 0xf0000U) >> 16];
+      s[6] = hex[(wc & 0xf000U) >> 12];
+      s[7] = hex[(wc & 0xf00U) >> 8];
+      s[8] = hex[(wc & 0xf0U) >> 4];
+      s[9] = hex[wc & 0xfU];
+      return 10;
+    }
+  else
+    {
+#  if __STDC_ISO_10646__ || (__GLIBC__ >= 2) || (defined _WIN32 || defined __CYGWIN__)
+      s[1] = 'u';
+#  else
+      s[1] = 'w';
+#  endif
+      s[2] = hex[(wc & 0xf000U) >> 12];
+      s[3] = hex[(wc & 0xf00U) >> 8];
+      s[4] = hex[(wc & 0xf0U) >> 4];
+      s[5] = hex[wc & 0xfU];
+      return 6;
+    }
+}
+#  if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+static size_t
+local_wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
+{
+  size_t count = wcrtomb (s, wc, ps);
+  if (count == (size_t)(-1))
+    count = wctomb_fallback (s, wc);
+  return count;
+}
+#  else
+static int
+local_wctomb (char *s, wchar_t wc)
+{
+  int count = wctomb (s, wc);
+  if (count < 0)
+    count = wctomb_fallback (s, wc);
+  return count;
+}
+#   define local_wcrtomb(S, WC, PS)  local_wctomb ((S), (WC))
+#  endif
+# else
+#  if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+#   define local_wcrtomb(S, WC, PS)  wcrtomb ((S), (WC), (PS))
+#  else
+#   define local_wcrtomb(S, WC, PS)  wctomb ((S), (WC))
+#  endif
+# endif
+#endif
+
 #if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
 /* Determine the decimal-point character according to the current locale.  */
 # ifndef decimal_point_char_defined
@@ -565,7 +639,8 @@
         mp_limb_t msd = b_ptr[b_len - 1]; /* = b[n-1], > 0 */
         /* Determine s = GMP_LIMB_BITS - integer_length (msd).
            Code copied from gnulib's integer_length.c.  */
-# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) \
+     || (__clang_major__ >= 4)
         s = __builtin_clz (msd);
 # else
 #  if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
@@ -1553,16 +1628,13 @@
   switch (conversion)
     {
     case 'd': case 'i': case 'u':
-# if HAVE_LONG_LONG_INT
       if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
         tmp_length =
           (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
                           * 0.30103 /* binary -> decimal */
                          )
           + 1; /* turn floor into ceil */
-      else
-# endif
-      if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+      else if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
         tmp_length =
           (unsigned int) (sizeof (unsigned long) * CHAR_BIT
                           * 0.30103 /* binary -> decimal */
@@ -1583,16 +1655,13 @@
       break;
 
     case 'o':
-# if HAVE_LONG_LONG_INT
       if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
         tmp_length =
           (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
                           * 0.333334 /* binary -> octal */
                          )
           + 1; /* turn floor into ceil */
-      else
-# endif
-      if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+      else if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
         tmp_length =
           (unsigned int) (sizeof (unsigned long) * CHAR_BIT
                           * 0.333334 /* binary -> octal */
@@ -1611,16 +1680,13 @@
       break;
 
     case 'x': case 'X':
-# if HAVE_LONG_LONG_INT
       if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
         tmp_length =
           (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
                           * 0.25 /* binary -> hexadecimal */
                          )
           + 1; /* turn floor into ceil */
-      else
-# endif
-      if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+      else if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
         tmp_length =
           (unsigned int) (sizeof (unsigned long) * CHAR_BIT
                           * 0.25 /* binary -> hexadecimal */
@@ -1686,7 +1752,13 @@
     case 'c':
 # if HAVE_WINT_T && !WIDE_CHAR_VERSION
       if (type == TYPE_WIDE_CHAR)
-        tmp_length = MB_CUR_MAX;
+        {
+          tmp_length = MB_CUR_MAX;
+#  if ENABLE_WCHAR_FALLBACK
+          if (tmp_length < (sizeof (wchar_t) > 2 ? 10 : 6))
+            tmp_length = (sizeof (wchar_t) > 2 ? 10 : 6);
+#  endif
+        }
       else
 # endif
         tmp_length = 1;
@@ -1793,6 +1865,7 @@
     /* errno is already set.  */
     return NULL;
 
+  /* Frees the memory allocated by this function.  Preserves errno.  */
 #define CLEANUP() \
   if (d.dir != d.direct_alloc_dir)                                      \
     free (d.dir);                                                       \
@@ -1857,7 +1930,7 @@
 
     /* Ensures that allocated >= needed.  Aborts through a jump to
        out_of_memory if needed is SIZE_MAX or otherwise too big.  */
-#define ENSURE_ALLOCATION(needed) \
+#define ENSURE_ALLOCATION_ELSE(needed, oom_statement) \
     if ((needed) > allocated)                                                \
       {                                                                      \
         size_t memory_size;                                                  \
@@ -1868,17 +1941,19 @@
           allocated = (needed);                                              \
         memory_size = xtimes (allocated, sizeof (DCHAR_T));                  \
         if (size_overflow_p (memory_size))                                   \
-          goto out_of_memory;                                                \
+          oom_statement                                                      \
         if (result == resultbuf || result == NULL)                           \
           memory = (DCHAR_T *) malloc (memory_size);                         \
         else                                                                 \
           memory = (DCHAR_T *) realloc (result, memory_size);                \
         if (memory == NULL)                                                  \
-          goto out_of_memory;                                                \
+          oom_statement                                                      \
         if (result == resultbuf && length > 0)                               \
           DCHAR_CPY (memory, result, length);                                \
         result = memory;                                                     \
       }
+#define ENSURE_ALLOCATION(needed) \
+  ENSURE_ALLOCATION_ELSE((needed), goto out_of_memory; )
 
     for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++)
       {
@@ -1939,11 +2014,9 @@
                   case TYPE_COUNT_LONGINT_POINTER:
                     *a.arg[dp->arg_index].a.a_count_longint_pointer = length;
                     break;
-#if HAVE_LONG_LONG_INT
                   case TYPE_COUNT_LONGLONGINT_POINTER:
                     *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;
                     break;
-#endif
                   default:
                     abort ();
                   }
@@ -2119,18 +2192,17 @@
 #  endif
                         if (converted == NULL)
                           {
-                            int saved_errno = errno;
                             if (!(result == resultbuf || result == NULL))
                               free (result);
                             if (buf_malloced != NULL)
                               free (buf_malloced);
                             CLEANUP ();
-                            errno = saved_errno;
                             return NULL;
                           }
                         if (converted != result + length)
                           {
-                            ENSURE_ALLOCATION (xsum (length, converted_len));
+                            ENSURE_ALLOCATION_ELSE (xsum (length, converted_len),
+                                                    { free (converted); goto out_of_memory; });
                             DCHAR_CPY (result + length, converted, converted_len);
                             free (converted);
                           }
@@ -2245,18 +2317,17 @@
 #  endif
                         if (converted == NULL)
                           {
-                            int saved_errno = errno;
                             if (!(result == resultbuf || result == NULL))
                               free (result);
                             if (buf_malloced != NULL)
                               free (buf_malloced);
                             CLEANUP ();
-                            errno = saved_errno;
                             return NULL;
                           }
                         if (converted != result + length)
                           {
-                            ENSURE_ALLOCATION (xsum (length, converted_len));
+                            ENSURE_ALLOCATION_ELSE (xsum (length, converted_len),
+                                                    { free (converted); goto out_of_memory; });
                             DCHAR_CPY (result + length, converted, converted_len);
                             free (converted);
                           }
@@ -2371,18 +2442,17 @@
 #  endif
                         if (converted == NULL)
                           {
-                            int saved_errno = errno;
                             if (!(result == resultbuf || result == NULL))
                               free (result);
                             if (buf_malloced != NULL)
                               free (buf_malloced);
                             CLEANUP ();
-                            errno = saved_errno;
                             return NULL;
                           }
                         if (converted != result + length)
                           {
-                            ENSURE_ALLOCATION (xsum (length, converted_len));
+                            ENSURE_ALLOCATION_ELSE (xsum (length, converted_len),
+                                                    { free (converted); goto out_of_memory; });
                             DCHAR_CPY (result + length, converted, converted_len);
                             free (converted);
                           }
@@ -2405,7 +2475,7 @@
                   }
               }
 #endif
-#if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL)) && HAVE_WCHAR_T
+#if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL) || ENABLE_WCHAR_FALLBACK) && HAVE_WCHAR_T
             else if (dp->conversion == 's'
 # if WIDE_CHAR_VERSION
                      && a.arg[dp->arg_index].type != TYPE_WIDE_STRING
@@ -2680,11 +2750,7 @@
                           if (*arg_end == 0)
                             /* Found the terminating null wide character.  */
                             break;
-#  if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
-                          count = wcrtomb (cbuf, *arg_end, &state);
-#  else
-                          count = wctomb (cbuf, *arg_end);
-#  endif
+                          count = local_wcrtomb (cbuf, *arg_end, &state);
                           if (count < 0)
                             {
                               /* Cannot convert.  */
@@ -2725,11 +2791,7 @@
                           if (*arg_end == 0)
                             /* Found the terminating null wide character.  */
                             break;
-#  if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
-                          count = wcrtomb (cbuf, *arg_end, &state);
-#  else
-                          count = wctomb (cbuf, *arg_end);
-#  endif
+                          count = local_wcrtomb (cbuf, *arg_end, &state);
                           if (count < 0)
                             {
                               /* Cannot convert.  */
@@ -2774,11 +2836,7 @@
 
                         if (*arg == 0)
                           abort ();
-#   if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
-                        count = wcrtomb (cbuf, *arg, &state);
-#   else
-                        count = wctomb (cbuf, *arg);
-#   endif
+                        count = local_wcrtomb (cbuf, *arg, &state);
                         if (count <= 0)
                           /* Inconsistency.  */
                           abort ();
@@ -2800,14 +2858,12 @@
                                               NULL, &tmpdst_len);
                   if (tmpdst == NULL)
                     {
-                      int saved_errno = errno;
                       free (tmpsrc);
                       if (!(result == resultbuf || result == NULL))
                         free (result);
                       if (buf_malloced != NULL)
                         free (buf_malloced);
                       CLEANUP ();
-                      errno = saved_errno;
                       return NULL;
                     }
                   free (tmpsrc);
@@ -2855,11 +2911,7 @@
 
                           if (*arg == 0)
                             abort ();
-#   if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
-                          count = wcrtomb (cbuf, *arg, &state);
-#   else
-                          count = wctomb (cbuf, *arg);
-#   endif
+                          count = local_wcrtomb (cbuf, *arg, &state);
                           if (count <= 0)
                             /* Inconsistency.  */
                             abort ();
@@ -2884,11 +2936,7 @@
 
                           if (*arg == 0)
                             abort ();
-#   if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
-                          count = wcrtomb (cbuf, *arg, &state);
-#   else
-                          count = wctomb (cbuf, *arg);
-#   endif
+                          count = local_wcrtomb (cbuf, *arg, &state);
                           if (count <= 0)
                             {
                               /* Cannot convert.  */
@@ -2907,7 +2955,8 @@
                         }
                     }
 #  else
-                  ENSURE_ALLOCATION (xsum (length, tmpdst_len));
+                  ENSURE_ALLOCATION_ELSE (xsum (length, tmpdst_len),
+                                          { free (tmpdst); goto out_of_memory; });
                   DCHAR_CPY (result + length, tmpdst, tmpdst_len);
                   free (tmpdst);
                   length += tmpdst_len;
@@ -2924,6 +2973,209 @@
 # endif
               }
 #endif
+#if ENABLE_WCHAR_FALLBACK && HAVE_WINT_T && !WIDE_CHAR_VERSION
+            else if (dp->conversion == 'c'
+                     && a.arg[dp->arg_index].type == TYPE_WIDE_CHAR)
+              {
+                /* Implement the 'lc' directive ourselves, in order to provide
+                   the fallback that avoids EILSEQ.  */
+                int flags = dp->flags;
+                int has_width;
+                size_t width;
+
+                has_width = 0;
+                width = 0;
+                if (dp->width_start != dp->width_end)
+                  {
+                    if (dp->width_arg_index != ARG_NONE)
+                      {
+                        int arg;
+
+                        if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+                          abort ();
+                        arg = a.arg[dp->width_arg_index].a.a_int;
+                        width = arg;
+                        if (arg < 0)
+                          {
+                            /* "A negative field width is taken as a '-' flag
+                                followed by a positive field width."  */
+                            flags |= FLAG_LEFT;
+                            width = -width;
+                          }
+                      }
+                    else
+                      {
+                        const FCHAR_T *digitp = dp->width_start;
+
+                        do
+                          width = xsum (xtimes (width, 10), *digitp++ - '0');
+                        while (digitp != dp->width_end);
+                      }
+                    has_width = 1;
+                  }
+
+                /* %lc in vasnprintf.  See the specification of fprintf.  */
+                {
+                  wchar_t arg = (wchar_t) a.arg[dp->arg_index].a.a_wide_char;
+                  size_t characters;
+# if !DCHAR_IS_TCHAR
+                  /* This code assumes that TCHAR_T is 'char'.  */
+                  verify (sizeof (TCHAR_T) == 1);
+                  TCHAR_T tmpsrc[64]; /* Assume MB_CUR_MAX <= 64.  */
+                  DCHAR_T *tmpdst;
+                  size_t tmpdst_len;
+# endif
+                  size_t w;
+
+# if DCHAR_IS_TCHAR
+                  if (has_width)
+# endif
+                    {
+                      /* Count the number of bytes.  */
+                      characters = 0;
+                      if (arg != 0)
+                        {
+                          char cbuf[64]; /* Assume MB_CUR_MAX <= 64.  */
+                          int count;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+                          mbstate_t state;
+                          memset (&state, '\0', sizeof (mbstate_t));
+# endif
+
+                          count = local_wcrtomb (cbuf, arg, &state);
+                          if (count < 0)
+                            /* Inconsistency.  */
+                            abort ();
+                          characters = count;
+                        }
+                    }
+# if DCHAR_IS_TCHAR
+                  else
+                    {
+                      /* The number of bytes doesn't matter.  */
+                      characters = 0;
+                    }
+# endif
+
+# if !DCHAR_IS_TCHAR
+                  /* Convert the string into a piece of temporary memory.  */
+                  if (characters > 0) /* implies arg != 0 */
+                    {
+                      char cbuf[64]; /* Assume MB_CUR_MAX <= 64.  */
+                      int count;
+#  if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+                      mbstate_t state;
+                      memset (&state, '\0', sizeof (mbstate_t));
+#  endif
+
+                      count = local_wcrtomb (cbuf, arg, &state);
+                      if (count <= 0)
+                        /* Inconsistency.  */
+                        abort ();
+                      memcpy (tmpsrc, cbuf, count);
+                    }
+
+                  /* Convert from TCHAR_T[] to DCHAR_T[].  */
+                  tmpdst =
+                    DCHAR_CONV_FROM_ENCODING (locale_charset (),
+                                              iconveh_question_mark,
+                                              tmpsrc, characters,
+                                              NULL,
+                                              NULL, &tmpdst_len);
+                  if (tmpdst == NULL)
+                    {
+                      if (!(result == resultbuf || result == NULL))
+                        free (result);
+                      if (buf_malloced != NULL)
+                        free (buf_malloced);
+                      CLEANUP ();
+                      return NULL;
+                    }
+# endif
+
+                  if (has_width)
+                    {
+# if ENABLE_UNISTDIO
+                      /* Outside POSIX, it's preferable to compare the width
+                         against the number of _characters_ of the converted
+                         value.  */
+                      w = DCHAR_MBSNLEN (result + length, characters);
+# else
+                      /* The width is compared against the number of _bytes_
+                         of the converted value, says POSIX.  */
+                      w = characters;
+# endif
+                    }
+                  else
+                    /* w doesn't matter.  */
+                    w = 0;
+
+                  if (w < width && !(dp->flags & FLAG_LEFT))
+                    {
+                      size_t n = width - w;
+                      ENSURE_ALLOCATION (xsum (length, n));
+                      DCHAR_SET (result + length, ' ', n);
+                      length += n;
+                    }
+
+# if DCHAR_IS_TCHAR
+                  if (has_width)
+                    {
+                      /* We know the number of bytes in advance.  */
+                      ENSURE_ALLOCATION (xsum (length, characters));
+                      if (characters > 0) /* implies arg != 0 */
+                        {
+                          int count;
+#  if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+                          mbstate_t state;
+                          memset (&state, '\0', sizeof (mbstate_t));
+#  endif
+
+                          count = local_wcrtomb (result + length, arg, &state);
+                          if (count <= 0)
+                            /* Inconsistency.  */
+                            abort ();
+                          length += count;
+                        }
+                    }
+                  else
+                    {
+                      if (arg != 0)
+                        {
+                          char cbuf[64]; /* Assume MB_CUR_MAX <= 64.  */
+                          int count;
+#  if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+                          mbstate_t state;
+                          memset (&state, '\0', sizeof (mbstate_t));
+#  endif
+
+                          count = local_wcrtomb (cbuf, arg, &state);
+                          if (count <= 0)
+                            /* Inconsistency.  */
+                            abort ();
+                          ENSURE_ALLOCATION (xsum (length, count));
+                          memcpy (result + length, cbuf, count);
+                          length += count;
+                        }
+                    }
+# else
+                  ENSURE_ALLOCATION_ELSE (xsum (length, tmpdst_len),
+                                          { free (tmpdst); goto out_of_memory; });
+                  DCHAR_CPY (result + length, tmpdst, tmpdst_len);
+                  free (tmpdst);
+                  length += tmpdst_len;
+# endif
+
+                  if (w < width && (dp->flags & FLAG_LEFT))
+                    {
+                      size_t n = width - w;
+                      ENSURE_ALLOCATION (xsum (length, n));
+                      DCHAR_SET (result + length, ' ', n);
+                      length += n;
+                    }
+                }
+              }
+#endif
 #if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
             else if ((dp->conversion == 'a' || dp->conversion == 'A')
 # if !(NEED_PRINTF_DIRECTIVE_A || (NEED_PRINTF_LONG_DOUBLE && NEED_PRINTF_DOUBLE))
@@ -4835,17 +5087,15 @@
 
                 switch (type)
                   {
-#if HAVE_LONG_LONG_INT
                   case TYPE_LONGLONGINT:
                   case TYPE_ULONGLONGINT:
-# if defined _WIN32 && ! defined __CYGWIN__
+#if defined _WIN32 && ! defined __CYGWIN__
                     *fbp++ = 'I';
                     *fbp++ = '6';
                     *fbp++ = '4';
                     break;
-# else
+#else
                     *fbp++ = 'l';
-# endif
 #endif
                     FALLTHROUGH;
                   case TYPE_LONGINT:
@@ -4871,39 +5121,32 @@
 #endif
                   *fbp = dp->conversion;
 #if USE_SNPRINTF
-# if ! (((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3))        \
-         && !defined __UCLIBC__)                                            \
-        || (defined __APPLE__ && defined __MACH__)                          \
-        || defined __ANDROID__                                              \
-        || (defined _WIN32 && ! defined __CYGWIN__))
-                fbp[1] = '%';
-                fbp[2] = 'n';
-                fbp[3] = '\0';
-# else
-                /* On glibc2 systems from glibc >= 2.3 - probably also older
-                   ones - we know that snprintf's return value conforms to
-                   ISO C 99: the tests gl_SNPRINTF_RETVAL_C99 and
-                   gl_SNPRINTF_TRUNCATION_C99 pass.
-                   Therefore we can avoid using %n in this situation.
-                   On glibc2 systems from 2004-10-18 or newer, the use of %n
-                   in format strings in writable memory may crash the program
-                   (if compiled with _FORTIFY_SOURCE=2), so we should avoid it
-                   in this situation.  */
-                /* On Mac OS X 10.3 or newer, we know that snprintf's return
-                   value conforms to ISO C 99: the tests gl_SNPRINTF_RETVAL_C99
-                   and gl_SNPRINTF_TRUNCATION_C99 pass.
-                   Therefore we can avoid using %n in this situation.
-                   On Mac OS X 10.13 or newer, the use of %n in format strings
-                   in writable memory by default crashes the program, so we
-                   should avoid it in this situation.  */
-                /* On Android, we know that snprintf's return value conforms to
-                   ISO C 99: the tests gl_SNPRINTF_RETVAL_C99 and
-                   gl_SNPRINTF_TRUNCATION_C99 pass.
-                   Therefore we can avoid using %n in this situation.
-                   Starting on 2018-03-07, the use of %n in format strings
-                   produces a fatal error (see
-                   <https://android.googlesource.com/platform/bionic/+/41398d03b7e8e0dfb951660ae713e682e9fc0336>),
-                   so we should avoid it.  */
+# if ((HAVE_SNPRINTF_RETVAL_C99 && HAVE_SNPRINTF_TRUNCATION_C99)            \
+      || ((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3))       \
+          && !defined __UCLIBC__)                                           \
+      || (defined __APPLE__ && defined __MACH__)                            \
+      || defined __ANDROID__                                                \
+      || (defined _WIN32 && ! defined __CYGWIN__))
+                /* On systems where we know that snprintf's return value
+                   conforms to ISO C 99 (HAVE_SNPRINTF_RETVAL_C99) and that
+                   snprintf always produces NUL-terminated strings
+                   (HAVE_SNPRINTF_TRUNCATION_C99), it is possible to avoid
+                   using %n.  And it is desirable to do so, because more and
+                   more platforms no longer support %n, for "security reasons".
+                   In particular, the following platforms:
+                     - On glibc2 systems from 2004-10-18 or newer, the use of
+                       %n in format strings in writable memory may crash the
+                       program (if compiled with _FORTIFY_SOURCE=2).
+                     - On Mac OS X 10.13 or newer, the use of %n in format
+                       strings in writable memory by default crashes the
+                       program.
+                     - On Android, starting on 2018-03-07, the use of %n in
+                       format strings produces a fatal error (see
+                       <https://android.googlesource.com/platform/bionic/+/41398d03b7e8e0dfb951660ae713e682e9fc0336>).
+                   On these platforms, HAVE_SNPRINTF_RETVAL_C99 and
+                   HAVE_SNPRINTF_TRUNCATION_C99 are 1. We have listed them
+                   explicitly in the condition above, in case of cross-
+                   compilation (just to be sure).  */
                 /* On native Windows systems (such as mingw), we can avoid using
                    %n because:
                      - Although the gl_SNPRINTF_TRUNCATION_C99 test fails,
@@ -4920,6 +5163,10 @@
                      <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/set-printf-count-output>
                    So we should avoid %n in this situation.  */
                 fbp[1] = '\0';
+# else           /* AIX <= 5.1, HP-UX, IRIX, OSF/1, Solaris <= 9, BeOS */
+                fbp[1] = '%';
+                fbp[2] = 'n';
+                fbp[3] = '\0';
 # endif
 #else
                 fbp[1] = '\0';
@@ -5063,7 +5310,6 @@
                           SNPRINTF_BUF (arg);
                         }
                         break;
-#if HAVE_LONG_LONG_INT
                       case TYPE_LONGLONGINT:
                         {
                           long long int arg = a.arg[dp->arg_index].a.a_longlongint;
@@ -5076,7 +5322,6 @@
                           SNPRINTF_BUF (arg);
                         }
                         break;
-#endif
                       case TYPE_DOUBLE:
                         {
                           double arg = a.arg[dp->arg_index].a.a_double;
@@ -5208,15 +5453,14 @@
                     /* Attempt to handle failure.  */
                     if (count < 0)
                       {
-                        /* SNPRINTF or sprintf failed.  Save and use the errno
-                           that it has set, if any.  */
-                        int saved_errno = errno;
-                        if (saved_errno == 0)
+                        /* SNPRINTF or sprintf failed.  Use the errno that it
+                           has set, if any.  */
+                        if (errno == 0)
                           {
                             if (dp->conversion == 'c' || dp->conversion == 's')
-                              saved_errno = EILSEQ;
+                              errno = EILSEQ;
                             else
-                              saved_errno = EINVAL;
+                              errno = EINVAL;
                           }
 
                         if (!(result == resultbuf || result == NULL))
@@ -5225,7 +5469,6 @@
                           free (buf_malloced);
                         CLEANUP ();
 
-                        errno = saved_errno;
                         return NULL;
                       }
 
@@ -5361,16 +5604,15 @@
                                                     NULL, &tmpdst_len);
                         if (tmpdst == NULL)
                           {
-                            int saved_errno = errno;
                             if (!(result == resultbuf || result == NULL))
                               free (result);
                             if (buf_malloced != NULL)
                               free (buf_malloced);
                             CLEANUP ();
-                            errno = saved_errno;
                             return NULL;
                           }
-                        ENSURE_ALLOCATION (xsum (length, tmpdst_len));
+                        ENSURE_ALLOCATION_ELSE (xsum (length, tmpdst_len),
+                                                { free (tmpdst); goto out_of_memory; });
                         DCHAR_CPY (result + length, tmpdst, tmpdst_len);
                         free (tmpdst);
                         count = tmpdst_len;
diff --git a/lib/vasnprintf.h b/lib/vasnprintf.h
index 5b192b2..9b02cdf 100644
--- a/lib/vasnprintf.h
+++ b/lib/vasnprintf.h
@@ -1,18 +1,18 @@
 /* vsprintf with automatic memory allocation.
-   Copyright (C) 2002-2004, 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002-2004, 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _VASNPRINTF_H
 #define _VASNPRINTF_H
@@ -23,17 +23,8 @@
 /* Get size_t.  */
 #include <stddef.h>
 
-/* The __attribute__ feature is available in gcc versions 2.5 and later.
-   The __-protected variants of the attributes 'format' and 'printf' are
-   accepted by gcc versions 2.6.4 (effectively 2.7) and later.
-   We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
-   gnulib and libintl do '#define printf __printf__' when they override
-   the 'printf' function.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
-# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
-#else
-# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
-#endif
+/* Get _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD.  */
+#include <stdio.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -67,10 +58,12 @@
 # define asnprintf rpl_asnprintf
 # define vasnprintf rpl_vasnprintf
 #endif
-extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
-       _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 4));
-extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
-       _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 0));
+extern char * asnprintf (char *restrict resultbuf, size_t *lengthp,
+                         const char *format, ...)
+       _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 3, 4));
+extern char * vasnprintf (char *restrict resultbuf, size_t *lengthp,
+                          const char *format, va_list args)
+       _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 3, 0));
 
 #ifdef __cplusplus
 }
diff --git a/lib/vasprintf.c b/lib/vasprintf.c
index f5857ca..fe8b14f 100644
--- a/lib/vasprintf.c
+++ b/lib/vasprintf.c
@@ -1,18 +1,18 @@
 /* Formatted output to strings.
-   Copyright (C) 1999, 2002, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2002, 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
diff --git a/lib/verify.h b/lib/verify.h
index a58005c..a8ca59b 100644
--- a/lib/verify.h
+++ b/lib/verify.h
@@ -1,18 +1,18 @@
 /* Compile-time assert-like macros.
 
-   Copyright (C) 2005-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2006, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Paul Eggert, Bruno Haible, and Jim Meyering.  */
@@ -22,12 +22,10 @@
 
 
 /* Define _GL_HAVE__STATIC_ASSERT to 1 if _Static_assert (R, DIAGNOSTIC)
-   works as per C11.  This is supported by GCC 4.6.0 and later, in C
-   mode.
+   works as per C11.  This is supported by GCC 4.6.0+ and by clang 4+.
 
    Define _GL_HAVE__STATIC_ASSERT1 to 1 if _Static_assert (R) works as
-   per C2X, and define _GL_HAVE_STATIC_ASSERT1 if static_assert (R)
-   works as per C++17.  This is supported by GCC 9.1 and later.
+   per C2x.  This is supported by GCC 9.1+.
 
    Support compilers claiming conformance to the relevant standard,
    and also support GCC when not pedantic.  If we were willing to slow
@@ -35,17 +33,14 @@
    since this affects only the quality of diagnostics, why bother?  */
 #ifndef __cplusplus
 # if (201112L <= __STDC_VERSION__ \
-      || (!defined __STRICT_ANSI__ && 4 < __GNUC__ + (6 <= __GNUC_MINOR__)))
+      || (!defined __STRICT_ANSI__ \
+          && (4 < __GNUC__ + (6 <= __GNUC_MINOR__) || 4 <= __clang_major__)))
 #  define _GL_HAVE__STATIC_ASSERT 1
 # endif
 # if (202000L <= __STDC_VERSION__ \
       || (!defined __STRICT_ANSI__ && 9 <= __GNUC__))
 #  define _GL_HAVE__STATIC_ASSERT1 1
 # endif
-#else
-# if 201703L <= __cplusplus || 9 <= __GNUC__
-#  define _GL_HAVE_STATIC_ASSERT1 1
-# endif
 #endif
 
 /* FreeBSD 9.1 <sys/cdefs.h>, included by <stddef.h> and lots of other
@@ -207,12 +202,14 @@
 
    This macro requires three or more arguments but uses at most the first
    two, so that the _Static_assert macro optionally defined below supports
-   both the C11 two-argument syntax and the C2X one-argument syntax.
+   both the C11 two-argument syntax and the C2x one-argument syntax.
 
    Unfortunately, unlike C11, this implementation must appear as an
    ordinary declaration, and cannot appear inside struct { ... }.  */
 
-#if defined _GL_HAVE__STATIC_ASSERT
+#if 200410 <= __cpp_static_assert
+# define _GL_VERIFY(R, DIAGNOSTIC, ...) static_assert (R, DIAGNOSTIC)
+#elif defined _GL_HAVE__STATIC_ASSERT
 # define _GL_VERIFY(R, DIAGNOSTIC, ...) _Static_assert (R, DIAGNOSTIC)
 #else
 # define _GL_VERIFY(R, DIAGNOSTIC, ...)                                \
@@ -226,7 +223,7 @@
 #  define _Static_assert(...) \
      _GL_VERIFY (__VA_ARGS__, "static assertion failed", -)
 # endif
-# if !defined _GL_HAVE_STATIC_ASSERT1 && !defined static_assert
+# if __cpp_static_assert < 201411 && !defined static_assert
 #  define static_assert _Static_assert /* C11 requires this #define.  */
 # endif
 #endif
@@ -277,10 +274,27 @@
 #endif
 
 /* Assume that R always holds.  Behavior is undefined if R is false,
-   fails to evaluate, or has side effects.  Although assuming R can
-   help a compiler generate better code or diagnostics, performance
-   can suffer if R uses hard-to-optimize features such as function
-   calls not inlined by the compiler.  */
+   fails to evaluate, or has side effects.
+
+   'assume (R)' is a directive from the programmer telling the
+   compiler that R is true so the compiler needn't generate code to
+   test R.  This is why 'assume' is in verify.h: it's related to
+   static checking (in this case, static checking done by the
+   programmer), not dynamic checking.
+
+   'assume (R)' can affect compilation of all the code, not just code
+   that happens to be executed after the assume (R) is "executed".
+   For example, if the code mistakenly does 'assert (R); assume (R);'
+   the compiler is entitled to optimize away the 'assert (R)'.
+
+   Although assuming R can help a compiler generate better code or
+   diagnostics, performance can suffer if R uses hard-to-optimize
+   features such as function calls not inlined by the compiler.
+
+   Avoid Clang's __builtin_assume, as it breaks GNU Emacs master
+   as of 2020-08-23T21:09:49Z!eggert@cs.ucla.edu; see
+   <https://bugs.gnu.org/43152#71>.  It's not known whether this breakage
+   is a Clang bug or an Emacs bug; play it safe for now.  */
 
 #if _GL_HAS_BUILTIN_UNREACHABLE
 # define assume(R) ((R) ? (void) 0 : __builtin_unreachable ())
diff --git a/lib/vfprintf.c b/lib/vfprintf.c
index 23a90a8..ac53977 100644
--- a/lib/vfprintf.c
+++ b/lib/vfprintf.c
@@ -1,17 +1,17 @@
 /* Formatted output to a stream.
-   Copyright (C) 2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if 1
@@ -52,11 +52,7 @@
   if (fwrite (output, 1, len, fp) < len)
     {
       if (output != buf)
-        {
-          int saved_errno = errno;
-          free (output);
-          errno = saved_errno;
-        }
+        free (output);
       return -1;
     }
 
diff --git a/lib/vsnprintf.c b/lib/vsnprintf.c
index 3dc7954..2af3faa 100644
--- a/lib/vsnprintf.c
+++ b/lib/vsnprintf.c
@@ -1,19 +1,19 @@
 /* Formatted output to strings.
-   Copyright (C) 2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2006-2021 Free Software Foundation, Inc.
    Written by Simon Josefsson and Yoann Vandoorselaere <yoann@prelude-ids.org>.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if 1
 # include <config.h>
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index aa2e089..eb35de5 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -1,17 +1,17 @@
 /* Formatted output to strings.
-   Copyright (C) 2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if 1
diff --git a/lib/w32spawn.h b/lib/w32spawn.h
deleted file mode 100644
index 941ff1a..0000000
--- a/lib/w32spawn.h
+++ /dev/null
@@ -1,233 +0,0 @@
-/* Auxiliary functions for the creation of subprocesses.  Native Windows API.
-   Copyright (C) 2001, 2003-2019 Free Software Foundation, Inc.
-   Written by Bruno Haible <bruno@clisp.org>, 2003.
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
-
-#ifndef __KLIBC__
-/* Get declarations of the native Windows API functions.  */
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-#endif
-
-/* Get _open_osfhandle().  */
-#include <io.h>
-
-#include <stdbool.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-
-/* Get _get_osfhandle().  */
-# if GNULIB_MSVC_NOTHROW
-#  include "msvc-nothrow.h"
-# else
-#  include <io.h>
-# endif
-
-#include "cloexec.h"
-#include "xalloc.h"
-
-/* Duplicates a file handle, making the copy uninheritable.
-   Returns -1 for a file handle that is equivalent to closed.  */
-static int
-dup_noinherit (int fd)
-{
-  fd = dup_cloexec (fd);
-  if (fd < 0 && errno == EMFILE)
-    error (EXIT_FAILURE, errno, _("_open_osfhandle failed"));
-
-  return fd;
-}
-
-/* Returns a file descriptor equivalent to FD, except that the resulting file
-   descriptor is none of STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO.
-   FD must be open and non-inheritable.  The result will be non-inheritable as
-   well.
-   If FD < 0, FD itself is returned.  */
-static int
-fd_safer_noinherit (int fd)
-{
-  if (STDIN_FILENO <= fd && fd <= STDERR_FILENO)
-    {
-      /* The recursion depth is at most 3.  */
-      int nfd = fd_safer_noinherit (dup_noinherit (fd));
-      int saved_errno = errno;
-      close (fd);
-      errno = saved_errno;
-      return nfd;
-    }
-  return fd;
-}
-
-/* Duplicates a file handle, making the copy uninheritable and ensuring the
-   result is none of STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO.
-   Returns -1 for a file handle that is equivalent to closed.  */
-static int
-dup_safer_noinherit (int fd)
-{
-  return fd_safer_noinherit (dup_noinherit (fd));
-}
-
-/* Undoes the effect of TEMPFD = dup_safer_noinherit (ORIGFD);  */
-static void
-undup_safer_noinherit (int tempfd, int origfd)
-{
-  if (tempfd >= 0)
-    {
-      if (dup2 (tempfd, origfd) < 0)
-        error (EXIT_FAILURE, errno, _("cannot restore fd %d: dup2 failed"),
-               origfd);
-      close (tempfd);
-    }
-  else
-    {
-      /* origfd was closed or open to no handle at all.  Set it to a closed
-         state.  This is (nearly) equivalent to the original state.  */
-      close (origfd);
-    }
-}
-
-/* Prepares an argument vector before calling spawn().
-   Note that spawn() does not by itself call the command interpreter
-     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
-      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-         GetVersionEx(&v);
-         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
-      }) ? "cmd.exe" : "command.com").
-   Instead it simply concatenates the arguments, separated by ' ', and calls
-   CreateProcess().  We must quote the arguments since Windows CreateProcess()
-   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
-   special way:
-   - Space and tab are interpreted as delimiters. They are not treated as
-     delimiters if they are surrounded by double quotes: "...".
-   - Unescaped double quotes are removed from the input. Their only effect is
-     that within double quotes, space and tab are treated like normal
-     characters.
-   - Backslashes not followed by double quotes are not special.
-   - But 2*n+1 backslashes followed by a double quote become
-     n backslashes followed by a double quote (n >= 0):
-       \" -> "
-       \\\" -> \"
-       \\\\\" -> \\"
-   - '*', '?' characters may get expanded through wildcard expansion in the
-     callee: By default, in the callee, the initialization code before main()
-     takes the result of GetCommandLine(), wildcard-expands it, and passes it
-     to main(). The exceptions to this rule are:
-       - programs that inspect GetCommandLine() and ignore argv,
-       - mingw programs that have a global variable 'int _CRT_glob = 0;',
-       - Cygwin programs, when invoked from a Cygwin program.
- */
-#ifndef __KLIBC__
-# define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037*?"
-# define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-#else
-# define SHELL_SPECIAL_CHARS ""
-# define SHELL_SPACE_CHARS ""
-#endif
-static char **
-prepare_spawn (char **argv)
-{
-  size_t argc;
-  char **new_argv;
-  size_t i;
-
-  /* Count number of arguments.  */
-  for (argc = 0; argv[argc] != NULL; argc++)
-    ;
-
-  /* Allocate new argument vector.  */
-  new_argv = XNMALLOC (1 + argc + 1, char *);
-
-  /* Add an element upfront that can be used when argv[0] turns out to be a
-     script, not a program.
-     On Unix, this would be "/bin/sh". On native Windows, "sh" is actually
-     "sh.exe".  We have to omit the directory part and rely on the search in
-     PATH, because the mingw "mount points" are not visible inside Windows
-     CreateProcess().  */
-  *new_argv++ = "sh.exe";
-
-  /* Put quoted arguments into the new argument vector.  */
-  for (i = 0; i < argc; i++)
-    {
-      const char *string = argv[i];
-
-      if (string[0] == '\0')
-        new_argv[i] = xstrdup ("\"\"");
-      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
-        {
-          bool quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
-          size_t length;
-          unsigned int backslashes;
-          const char *s;
-          char *quoted_string;
-          char *p;
-
-          length = 0;
-          backslashes = 0;
-          if (quote_around)
-            length++;
-          for (s = string; *s != '\0'; s++)
-            {
-              char c = *s;
-              if (c == '"')
-                length += backslashes + 1;
-              length++;
-              if (c == '\\')
-                backslashes++;
-              else
-                backslashes = 0;
-            }
-          if (quote_around)
-            length += backslashes + 1;
-
-          quoted_string = (char *) xmalloc (length + 1);
-
-          p = quoted_string;
-          backslashes = 0;
-          if (quote_around)
-            *p++ = '"';
-          for (s = string; *s != '\0'; s++)
-            {
-              char c = *s;
-              if (c == '"')
-                {
-                  unsigned int j;
-                  for (j = backslashes + 1; j > 0; j--)
-                    *p++ = '\\';
-                }
-              *p++ = c;
-              if (c == '\\')
-                backslashes++;
-              else
-                backslashes = 0;
-            }
-          if (quote_around)
-            {
-              unsigned int j;
-              for (j = backslashes; j > 0; j--)
-                *p++ = '\\';
-              *p++ = '"';
-            }
-          *p = '\0';
-
-          new_argv[i] = quoted_string;
-        }
-      else
-        new_argv[i] = (char *) string;
-    }
-  new_argv[argc] = NULL;
-
-  return new_argv;
-}
diff --git a/lib/wait-process.c b/lib/wait-process.c
index 7c69933..9b48b6a 100644
--- a/lib/wait-process.c
+++ b/lib/wait-process.c
@@ -1,5 +1,5 @@
 /* Waiting for a subprocess to finish.
-   Copyright (C) 2001-2003, 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2003, 2005-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <haible@clisp.cons.org>, 2001.
 
    This program is free software: you can redistribute it and/or modify
@@ -44,7 +44,7 @@
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
 
-/* The return value of spawnvp() is really a process handle as returned
+/* The return value of _spawnvp() is really a process handle as returned
    by CreateProcess().  Therefore we can kill it using TerminateProcess.  */
 # define kill(pid,sig) TerminateProcess ((HANDLE) (pid), sig)
 
@@ -105,7 +105,7 @@
 /* The cleanup action, taking a signal argument.
    It gets called asynchronously.  */
 static _GL_ASYNC_SAFE void
-cleanup_slaves_action (int sig _GL_UNUSED)
+cleanup_slaves_action (_GL_UNUSED int sig)
 {
   cleanup_slaves ();
 }
@@ -121,7 +121,8 @@
   if (!cleanup_slaves_registered)
     {
       atexit (cleanup_slaves);
-      at_fatal_signal (cleanup_slaves_action);
+      if (at_fatal_signal (cleanup_slaves_action) < 0)
+        xalloc_die ();
       cleanup_slaves_registered = true;
     }
 
diff --git a/lib/wait-process.h b/lib/wait-process.h
index 08470fb..1a3567a 100644
--- a/lib/wait-process.h
+++ b/lib/wait-process.h
@@ -1,5 +1,5 @@
 /* Waiting for a subprocess to finish.
-   Copyright (C) 2001-2003, 2006, 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2003, 2006, 2008-2021 Free Software Foundation, Inc.
    Written by Bruno Haible <haible@clisp.cons.org>, 2001.
 
    This program is free software: you can redistribute it and/or modify
diff --git a/lib/waitpid.c b/lib/waitpid.c
index a9dace6..7b32499 100644
--- a/lib/waitpid.c
+++ b/lib/waitpid.c
@@ -1,18 +1,18 @@
 /* Wait for process state change.
-   Copyright (C) 2001-2003, 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2003, 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
diff --git a/lib/warn-on-use.h b/lib/warn-on-use.h
index 7d11a15..612937ab 100644
--- a/lib/warn-on-use.h
+++ b/lib/warn-on-use.h
@@ -1,17 +1,17 @@
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -87,6 +87,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -99,24 +106,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
diff --git a/lib/wchar.in.h b/lib/wchar.in.h
index 8a899cd..acb9d4e 100644
--- a/lib/wchar.in.h
+++ b/lib/wchar.in.h
@@ -1,19 +1,19 @@
 /* A substitute for ISO C99 <wchar.h>, for platforms that have issues.
 
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Eric Blake.  */
 
@@ -33,7 +33,8 @@
 #if (((defined __need_mbstate_t || defined __need_wint_t)               \
       && !defined __MINGW32__)                                          \
      || (defined __hpux                                                 \
-         && ((defined _INTTYPES_INCLUDED && !defined strtoimax)         \
+         && ((defined _INTTYPES_INCLUDED                                \
+              && !defined _GL_FINISHED_INCLUDING_SYSTEM_INTTYPES_H)     \
              || defined _GL_JUST_INCLUDE_SYSTEM_WCHAR_H))               \
      || (defined __MINGW32__ && defined __STRING_H_SOURCED__)           \
      || defined _GL_ALREADY_INCLUDING_WCHAR_H)
@@ -64,20 +65,12 @@
 # include <features.h> /* for __GLIBC__ */
 #endif
 
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.
-   In some builds of uClibc, <wchar.h> is nonexistent and wchar_t is defined
+/* In some builds of uClibc, <wchar.h> is nonexistent and wchar_t is defined
    by <stddef.h>.
    But avoid namespace pollution on glibc systems.  */
 #if !(defined __GLIBC__ && !defined __UCLIBC__)
 # include <stddef.h>
 #endif
-#ifndef __GLIBC__
-# include <stdio.h>
-# include <time.h>
-#endif
 
 /* Include the original <wchar.h> if it exists.
    Some builds of uClibc lack it.  */
@@ -93,10 +86,12 @@
 
 /* The __attribute__ feature is available in gcc versions 2.5 and later.
    The attribute __pure__ was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define _GL_ATTRIBUTE_PURE /* empty */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
 #endif
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
@@ -116,7 +111,7 @@
 /* mingw and MSVC define wint_t as 'unsigned short' in <crtdefs.h> or
    <stddef.h>.  This is too small: ISO C 99 section 7.24.1.(2) says that
    wint_t must be "unchanged by default argument promotions".  Override it.  */
-# if @GNULIB_OVERRIDES_WINT_T@
+# if @GNULIBHEADERS_OVERRIDE_WINT_T@
 #  if !GNULIB_defined_wint_t
 #   if @HAVE_CRTDEFS_H@
 #    include <crtdefs.h>
@@ -137,16 +132,27 @@
 
 /* Override mbstate_t if it is too small.
    On IRIX 6.5, sizeof (mbstate_t) == 1, which is not sufficient for
-   implementing mbrtowc for encodings like UTF-8.  */
-#if !(@HAVE_MBSINIT@ && @HAVE_MBRTOWC@) || @REPLACE_MBSTATE_T@
+   implementing mbrtowc for encodings like UTF-8.
+   On AIX and MSVC, mbrtowc needs to be overridden, but mbstate_t exists and is
+   large enough and overriding it would cause problems in C++ mode.  */
+#if !(((defined _WIN32 && !defined __CYGWIN__) || @HAVE_MBSINIT@) && @HAVE_MBRTOWC@) || @REPLACE_MBSTATE_T@
 # if !GNULIB_defined_mbstate_t
+#  if !(defined _AIX || defined _MSC_VER)
 typedef int rpl_mbstate_t;
-#  undef mbstate_t
-#  define mbstate_t rpl_mbstate_t
+#   undef mbstate_t
+#   define mbstate_t rpl_mbstate_t
+#  endif
 #  define GNULIB_defined_mbstate_t 1
 # endif
 #endif
 
+/* Declare 'free' if needed for _GL_ATTRIBUTE_DEALLOC_FREE.  */
+#if (@REPLACE_FREE@ && !defined free \
+     && !(defined __cplusplus && defined GNULIB_NAMESPACE))
+_GL_EXTERN_C void free (void *);
+# define free rpl_free
+#endif
+_GL_EXTERN_C void free (void *);
 
 /* Convert a single-byte character to a wide character.  */
 #if @GNULIB_BTOWC@
@@ -239,16 +245,20 @@
 #   define mbrtowc rpl_mbrtowc
 #  endif
 _GL_FUNCDECL_RPL (mbrtowc, size_t,
-                  (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n,
+                   mbstate_t *restrict ps));
 _GL_CXXALIAS_RPL (mbrtowc, size_t,
-                  (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n,
+                   mbstate_t *restrict ps));
 # else
 #  if !@HAVE_MBRTOWC@
 _GL_FUNCDECL_SYS (mbrtowc, size_t,
-                  (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n,
+                   mbstate_t *restrict ps));
 #  endif
 _GL_CXXALIAS_SYS (mbrtowc, size_t,
-                  (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n,
+                   mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (mbrtowc);
@@ -269,13 +279,17 @@
 #   undef mbrlen
 #   define mbrlen rpl_mbrlen
 #  endif
-_GL_FUNCDECL_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
-_GL_CXXALIAS_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
+_GL_FUNCDECL_RPL (mbrlen, size_t,
+                  (const char *restrict s, size_t n, mbstate_t *restrict ps));
+_GL_CXXALIAS_RPL (mbrlen, size_t,
+                  (const char *restrict s, size_t n, mbstate_t *restrict ps));
 # else
 #  if !@HAVE_MBRLEN@
-_GL_FUNCDECL_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
+_GL_FUNCDECL_SYS (mbrlen, size_t,
+                  (const char *restrict s, size_t n, mbstate_t *restrict ps));
 #  endif
-_GL_CXXALIAS_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
+_GL_CXXALIAS_SYS (mbrlen, size_t,
+                  (const char *restrict s, size_t n, mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (mbrlen);
@@ -297,20 +311,26 @@
 #   define mbsrtowcs rpl_mbsrtowcs
 #  endif
 _GL_FUNCDECL_RPL (mbsrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (mbsrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t len,
-                   mbstate_t *ps));
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t len,
+                   mbstate_t *restrict ps));
 # else
 #  if !@HAVE_MBSRTOWCS@
 _GL_FUNCDECL_SYS (mbsrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 #  endif
 _GL_CXXALIAS_SYS (mbsrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t len,
-                   mbstate_t *ps));
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t len,
+                   mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (mbsrtowcs);
@@ -332,22 +352,26 @@
 #   define mbsnrtowcs rpl_mbsnrtowcs
 #  endif
 _GL_FUNCDECL_RPL (mbsnrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps)
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t srclen, size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (mbsnrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps));
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t srclen, size_t len,
+                   mbstate_t *restrict ps));
 # else
 #  if !@HAVE_MBSNRTOWCS@
 _GL_FUNCDECL_SYS (mbsnrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps)
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t srclen, size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 #  endif
 _GL_CXXALIAS_SYS (mbsnrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps));
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t srclen, size_t len,
+                   mbstate_t *restrict ps));
 # endif
 _GL_CXXALIASWARN (mbsnrtowcs);
 #elif defined GNULIB_POSIXCHECK
@@ -366,13 +390,17 @@
 #   undef wcrtomb
 #   define wcrtomb rpl_wcrtomb
 #  endif
-_GL_FUNCDECL_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
-_GL_CXXALIAS_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
+_GL_FUNCDECL_RPL (wcrtomb, size_t,
+                  (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
+_GL_CXXALIAS_RPL (wcrtomb, size_t,
+                  (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
 # else
 #  if !@HAVE_WCRTOMB@
-_GL_FUNCDECL_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
+_GL_FUNCDECL_SYS (wcrtomb, size_t,
+                  (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
 #  endif
-_GL_CXXALIAS_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
+_GL_CXXALIAS_SYS (wcrtomb, size_t,
+                  (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcrtomb);
@@ -394,20 +422,26 @@
 #   define wcsrtombs rpl_wcsrtombs
 #  endif
 _GL_FUNCDECL_RPL (wcsrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
+                  (char *restrict dest, const wchar_t **restrict srcp,
+                   size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (wcsrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t len,
-                   mbstate_t *ps));
+                  (char *restrict dest, const wchar_t **restrict srcp,
+                   size_t len,
+                   mbstate_t *restrict ps));
 # else
 #  if !@HAVE_WCSRTOMBS@
 _GL_FUNCDECL_SYS (wcsrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
+                  (char *restrict dest, const wchar_t **restrict srcp,
+                   size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 #  endif
 _GL_CXXALIAS_SYS (wcsrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t len,
-                   mbstate_t *ps));
+                  (char *restrict dest, const wchar_t **restrict srcp,
+                   size_t len,
+                   mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsrtombs);
@@ -429,22 +463,30 @@
 #   define wcsnrtombs rpl_wcsnrtombs
 #  endif
 _GL_FUNCDECL_RPL (wcsnrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps)
+                  (char *restrict dest,
+                   const wchar_t **restrict srcp, size_t srclen,
+                   size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (wcsnrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps));
+                  (char *restrict dest,
+                   const wchar_t **restrict srcp, size_t srclen,
+                   size_t len,
+                   mbstate_t *restrict ps));
 # else
 #  if !@HAVE_WCSNRTOMBS@ || (defined __cplusplus && defined __sun)
 _GL_FUNCDECL_SYS (wcsnrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps)
+                  (char *restrict dest,
+                   const wchar_t **restrict srcp, size_t srclen,
+                   size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 #  endif
 _GL_CXXALIAS_SYS (wcsnrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps));
+                  (char *restrict dest,
+                   const wchar_t **restrict srcp, size_t srclen,
+                   size_t len,
+                   mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsnrtombs);
@@ -542,10 +584,12 @@
 #if @GNULIB_WMEMCPY@
 # if !@HAVE_WMEMCPY@
 _GL_FUNCDECL_SYS (wmemcpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # endif
 _GL_CXXALIAS_SYS (wmemcpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wmemcpy);
 # endif
@@ -579,6 +623,29 @@
 #endif
 
 
+/* Copy N wide characters of SRC to DEST.
+   Return pointer to wide characters after the last written wide character.  */
+#if @GNULIB_WMEMPCPY@
+# if !@HAVE_WMEMPCPY@
+_GL_FUNCDECL_SYS (wmempcpy, wchar_t *,
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wmempcpy, wchar_t *,
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wmempcpy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmempcpy
+# if HAVE_RAW_DECL_WMEMPCPY
+_GL_WARN_ON_USE (wmempcpy, "wmempcpy is unportable - "
+                 "use gnulib module wmempcpy for portability");
+# endif
+#endif
+
+
 /* Set N wide characters of S to C.  */
 #if @GNULIB_WMEMSET@
 # if !@HAVE_WMEMSET@
@@ -635,9 +702,11 @@
 /* Copy SRC to DEST.  */
 #if @GNULIB_WCSCPY@
 # if !@HAVE_WCSCPY@
-_GL_FUNCDECL_SYS (wcscpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_FUNCDECL_SYS (wcscpy, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # endif
-_GL_CXXALIAS_SYS (wcscpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_CXXALIAS_SYS (wcscpy, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcscpy);
 # endif
@@ -653,9 +722,11 @@
 /* Copy SRC to DEST, returning the address of the terminating L'\0' in DEST.  */
 #if @GNULIB_WCPCPY@
 # if !@HAVE_WCPCPY@
-_GL_FUNCDECL_SYS (wcpcpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_FUNCDECL_SYS (wcpcpy, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # endif
-_GL_CXXALIAS_SYS (wcpcpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_CXXALIAS_SYS (wcpcpy, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 _GL_CXXALIASWARN (wcpcpy);
 #elif defined GNULIB_POSIXCHECK
 # undef wcpcpy
@@ -670,10 +741,12 @@
 #if @GNULIB_WCSNCPY@
 # if !@HAVE_WCSNCPY@
 _GL_FUNCDECL_SYS (wcsncpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # endif
 _GL_CXXALIAS_SYS (wcsncpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsncpy);
 # endif
@@ -691,10 +764,12 @@
 #if @GNULIB_WCPNCPY@
 # if !@HAVE_WCPNCPY@
 _GL_FUNCDECL_SYS (wcpncpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # endif
 _GL_CXXALIAS_SYS (wcpncpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 _GL_CXXALIASWARN (wcpncpy);
 #elif defined GNULIB_POSIXCHECK
 # undef wcpncpy
@@ -708,9 +783,11 @@
 /* Append SRC onto DEST.  */
 #if @GNULIB_WCSCAT@
 # if !@HAVE_WCSCAT@
-_GL_FUNCDECL_SYS (wcscat, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_FUNCDECL_SYS (wcscat, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # endif
-_GL_CXXALIAS_SYS (wcscat, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_CXXALIAS_SYS (wcscat, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcscat);
 # endif
@@ -727,10 +804,12 @@
 #if @GNULIB_WCSNCAT@
 # if !@HAVE_WCSNCAT@
 _GL_FUNCDECL_SYS (wcsncat, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest, const wchar_t *restrict src,
+                   size_t n));
 # endif
 _GL_CXXALIAS_SYS (wcsncat, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest, const wchar_t *restrict src,
+                   size_t n));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsncat);
 # endif
@@ -843,9 +922,11 @@
    original strings.  */
 #if @GNULIB_WCSXFRM@
 # if !@HAVE_WCSXFRM@
-_GL_FUNCDECL_SYS (wcsxfrm, size_t, (wchar_t *s1, const wchar_t *s2, size_t n));
+_GL_FUNCDECL_SYS (wcsxfrm, size_t,
+                  (wchar_t *restrict s1, const wchar_t *restrict s2, size_t n));
 # endif
-_GL_CXXALIAS_SYS (wcsxfrm, size_t, (wchar_t *s1, const wchar_t *s2, size_t n));
+_GL_CXXALIAS_SYS (wcsxfrm, size_t,
+                  (wchar_t *restrict s1, const wchar_t *restrict s2, size_t n));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsxfrm);
 # endif
@@ -860,16 +941,55 @@
 
 /* Duplicate S, returning an identical malloc'd string.  */
 #if @GNULIB_WCSDUP@
-# if !@HAVE_WCSDUP@
-_GL_FUNCDECL_SYS (wcsdup, wchar_t *, (const wchar_t *s));
-# endif
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef wcsdup
+#   define wcsdup _wcsdup
+#  endif
+_GL_CXXALIAS_MDA (wcsdup, wchar_t *, (const wchar_t *s));
+# else
+#  if !@HAVE_WCSDUP@ || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
+                  (const wchar_t *s)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#  endif
 _GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s));
+# endif
 _GL_CXXALIASWARN (wcsdup);
-#elif defined GNULIB_POSIXCHECK
-# undef wcsdup
-# if HAVE_RAW_DECL_WCSDUP
+#else
+# if __GNUC__ >= 11 && !defined wcsdup
+/* For -Wmismatched-dealloc: Associate wcsdup with free or rpl_free.  */
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
+                  (const wchar_t *s)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef wcsdup
+#  if HAVE_RAW_DECL_WCSDUP
 _GL_WARN_ON_USE (wcsdup, "wcsdup is unportable - "
                  "use gnulib module wcsdup for portability");
+#  endif
+# elif @GNULIB_MDA_WCSDUP@
+/* On native Windows, map 'wcsdup' to '_wcsdup', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::wcsdup always.  */
+#  if defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef wcsdup
+#    define wcsdup _wcsdup
+#   endif
+_GL_CXXALIAS_MDA (wcsdup, wchar_t *, (const wchar_t *s));
+#  else
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
+                  (const wchar_t *s)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#   if @HAVE_DECL_WCSDUP@
+_GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s));
+#   endif
+#  endif
+#  if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_WCSDUP@
+_GL_CXXALIASWARN (wcsdup);
+#  endif
 # endif
 #endif
 
@@ -1011,7 +1131,8 @@
 #if @GNULIB_WCSSTR@
 # if !@HAVE_WCSSTR@
 _GL_FUNCDECL_SYS (wcsstr, wchar_t *,
-                  (const wchar_t *haystack, const wchar_t *needle)
+                  (const wchar_t *restrict haystack,
+                   const wchar_t *restrict needle)
                   _GL_ATTRIBUTE_PURE);
 # endif
   /* On some systems, this function is defined as an overloaded function:
@@ -1020,14 +1141,18 @@
          wchar_t * std::wcsstr (wchar_t *, const wchar_t *);
        }  */
 _GL_CXXALIAS_SYS_CAST2 (wcsstr,
-                        wchar_t *, (const wchar_t *, const wchar_t *),
-                        const wchar_t *, (const wchar_t *, const wchar_t *));
+                        wchar_t *,
+                        (const wchar_t *restrict, const wchar_t *restrict),
+                        const wchar_t *,
+                        (const wchar_t *restrict, const wchar_t *restrict));
 # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
      && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
 _GL_CXXALIASWARN1 (wcsstr, wchar_t *,
-                   (wchar_t *haystack, const wchar_t *needle));
+                   (wchar_t *restrict haystack,
+                    const wchar_t *restrict needle));
 _GL_CXXALIASWARN1 (wcsstr, const wchar_t *,
-                   (const wchar_t *haystack, const wchar_t *needle));
+                   (const wchar_t *restrict haystack,
+                    const wchar_t *restrict needle));
 # elif __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsstr);
 # endif
@@ -1048,16 +1173,20 @@
 #   define wcstok rpl_wcstok
 #  endif
 _GL_FUNCDECL_RPL (wcstok, wchar_t *,
-                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+                  (wchar_t *restrict wcs, const wchar_t *restrict delim,
+                   wchar_t **restrict ptr));
 _GL_CXXALIAS_RPL (wcstok, wchar_t *,
-                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+                  (wchar_t *restrict wcs, const wchar_t *restrict delim,
+                   wchar_t **restrict ptr));
 # else
 #  if !@HAVE_WCSTOK@
 _GL_FUNCDECL_SYS (wcstok, wchar_t *,
-                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+                  (wchar_t *restrict wcs, const wchar_t *restrict delim,
+                   wchar_t **restrict ptr));
 #  endif
 _GL_CXXALIAS_SYS (wcstok, wchar_t *,
-                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+                  (wchar_t *restrict wcs, const wchar_t *restrict delim,
+                   wchar_t **restrict ptr));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcstok);
@@ -1109,19 +1238,27 @@
 #   undef wcsftime
 #   define wcsftime rpl_wcsftime
 #  endif
-_GL_FUNCDECL_RPL (wcsftime, size_t, (wchar_t *__buf, size_t __bufsize,
-                                     const wchar_t *__fmt, const struct tm *__tp)
-                                    _GL_ARG_NONNULL ((1, 3, 4)));
-_GL_CXXALIAS_RPL (wcsftime, size_t, (wchar_t *__buf, size_t __bufsize,
-                                     const wchar_t *__fmt, const struct tm *__tp));
+_GL_FUNCDECL_RPL (wcsftime, size_t,
+                  (wchar_t *restrict __buf, size_t __bufsize,
+                   const wchar_t *restrict __fmt,
+                   const struct tm *restrict __tp)
+                  _GL_ARG_NONNULL ((1, 3, 4)));
+_GL_CXXALIAS_RPL (wcsftime, size_t,
+                  (wchar_t *restrict __buf, size_t __bufsize,
+                   const wchar_t *restrict __fmt,
+                   const struct tm *restrict __tp));
 # else
 #  if !@HAVE_WCSFTIME@
-_GL_FUNCDECL_SYS (wcsftime, size_t, (wchar_t *__buf, size_t __bufsize,
-                                     const wchar_t *__fmt, const struct tm *__tp)
-                                    _GL_ARG_NONNULL ((1, 3, 4)));
+_GL_FUNCDECL_SYS (wcsftime, size_t,
+                  (wchar_t *restrict __buf, size_t __bufsize,
+                   const wchar_t *restrict __fmt,
+                   const struct tm *restrict __tp)
+                  _GL_ARG_NONNULL ((1, 3, 4)));
 #  endif
-_GL_CXXALIAS_SYS (wcsftime, size_t, (wchar_t *__buf, size_t __bufsize,
-                                     const wchar_t *__fmt, const struct tm *__tp));
+_GL_CXXALIAS_SYS (wcsftime, size_t,
+                  (wchar_t *restrict __buf, size_t __bufsize,
+                   const wchar_t *restrict __fmt,
+                   const struct tm *restrict __tp));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsftime);
diff --git a/lib/wctype-h.c b/lib/wctype-h.c
index bb5f847..150221d 100644
--- a/lib/wctype-h.c
+++ b/lib/wctype-h.c
@@ -1,4 +1,23 @@
+/* Inline functions for <wctype.h>.
+
+   Copyright (C) 2012-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 /* Normally this would be wctype.c, but that name's already taken.  */
+
 #include <config.h>
+
 #define _GL_WCTYPE_INLINE _GL_EXTERN_INLINE
 #include "wctype.h"
diff --git a/lib/wctype.in.h b/lib/wctype.in.h
index 0cc7512..652d811 100644
--- a/lib/wctype.in.h
+++ b/lib/wctype.in.h
@@ -1,19 +1,19 @@
 /* A substitute for ISO C99 <wctype.h>, for platforms that lack it.
 
-   Copyright (C) 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible and Paul Eggert.  */
 
@@ -45,14 +45,7 @@
 #ifndef _@GUARD_PREFIX@_WCTYPE_H
 
 #if @HAVE_WINT_T@
-/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.
-   Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-# include <stddef.h>
-# include <stdio.h>
-# include <time.h>
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
 # include <wchar.h>
 #endif
 
@@ -110,7 +103,7 @@
 /* mingw and MSVC define wint_t as 'unsigned short' in <crtdefs.h> or
    <stddef.h>.  This is too small: ISO C 99 section 7.24.1.(2) says that
    wint_t must be "unchanged by default argument promotions".  Override it.  */
-# if @GNULIB_OVERRIDES_WINT_T@
+# if @GNULIBHEADERS_OVERRIDE_WINT_T@
 #  if !GNULIB_defined_wint_t
 #   if @HAVE_CRTDEFS_H@
 #    include <crtdefs.h>
@@ -139,7 +132,7 @@
    same way, or not at all.  */
 # if ! @HAVE_ISWCNTRL@ || @REPLACE_ISWCNTRL@
 
-#  if @GNULIB_OVERRIDES_WINT_T@ /* implies @REPLACE_ISWCNTRL@ */
+#  if @GNULIBHEADERS_OVERRIDE_WINT_T@ /* implies @REPLACE_ISWCNTRL@ */
 
 _GL_WCTYPE_INLINE int
 rpl_iswalnum (wint_t wc)
@@ -168,7 +161,7 @@
 _GL_WCTYPE_INLINE int
 rpl_iswdigit (wint_t wc)
 {
-  return ((wchar_t) wc == wc ? iswdigit ((wchar_t) wc) : 0);
+  return ((wchar_t) wc == wc ? wc >= '0' && wc <= '9' : 0);
 }
 
 _GL_WCTYPE_INLINE int
@@ -210,7 +203,10 @@
 _GL_WCTYPE_INLINE int
 rpl_iswxdigit (wint_t wc)
 {
-  return ((wchar_t) wc == wc ? iswxdigit ((wchar_t) wc) : 0);
+  return ((wchar_t) wc == wc
+          ? (wc >= '0' && wc <= '9')
+            || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F')
+          : 0);
 }
 
 _GL_WCTYPE_INLINE wint_t
@@ -348,7 +344,7 @@
 }
 
 _GL_WCTYPE_INLINE int
-#   if @REPLACE_ISWCNTRL@
+#   if @REPLACE_ISWDIGIT@
 rpl_iswdigit
 #   else
 iswdigit
@@ -428,7 +424,7 @@
 }
 
 _GL_WCTYPE_INLINE int
-#   if @REPLACE_ISWCNTRL@
+#   if @REPLACE_ISWXDIGIT@
 rpl_iswxdigit
 #   else
 iswxdigit
@@ -463,21 +459,44 @@
 
 #  endif
 
-# elif @GNULIB_ISWBLANK@ && (! @HAVE_ISWBLANK@ || @REPLACE_ISWBLANK@)
-/* Only the iswblank function is missing.  */
+# else
+/* Only some of the functions are missing or broken.  */
 
-#  if @REPLACE_ISWBLANK@
-#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-#    define iswblank rpl_iswblank
-#   endif
+#  if @GNULIB_ISWBLANK@ && (! @HAVE_ISWBLANK@ || @REPLACE_ISWBLANK@)
+/* Only the iswblank function is missing.  */
+#   if @REPLACE_ISWBLANK@
+#    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#     define iswblank rpl_iswblank
+#    endif
 _GL_FUNCDECL_RPL (iswblank, int, (wint_t wc));
-#  else
+#   else
 _GL_FUNCDECL_SYS (iswblank, int, (wint_t wc));
+#   endif
+#  endif
+
+#  if @GNULIB_ISWDIGIT@
+#   if @REPLACE_ISWDIGIT@
+#    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#     undef iswdigit
+#     define iswdigit rpl_iswdigit
+#    endif
+_GL_FUNCDECL_RPL (iswdigit, int, (wint_t wc));
+#   endif
+#  endif
+
+#  if @GNULIB_ISWXDIGIT@
+#   if @REPLACE_ISWXDIGIT@
+#    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#     undef iswxdigit
+#     define iswxdigit rpl_iswxdigit
+#    endif
+_GL_FUNCDECL_RPL (iswxdigit, int, (wint_t wc));
+#   endif
 #  endif
 
 # endif
 
-# if defined __MINGW32__ && !@GNULIB_OVERRIDES_WINT_T@
+# if defined __MINGW32__ && !@GNULIBHEADERS_OVERRIDE_WINT_T@
 
 /* On native Windows, wchar_t is uint16_t, and wint_t is uint32_t.
    The functions towlower and towupper are implemented in the MSVCRT library
@@ -510,35 +529,69 @@
 #   define towupper rpl_towupper
 #  endif
 
-# endif /* __MINGW32__ && !@GNULIB_OVERRIDES_WINT_T@ */
+# endif /* __MINGW32__ && !@GNULIBHEADERS_OVERRIDE_WINT_T@ */
 
 # define GNULIB_defined_wctype_functions 1
 #endif
 
 #if @REPLACE_ISWCNTRL@
 _GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
 #else
 _GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc));
+#endif
+#if @GNULIB_ISWDIGIT@
+# if @REPLACE_ISWDIGIT@
+_GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
+# else
 _GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc));
+# endif
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswlower, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswprint, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswspace, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswupper, int, (wint_t wc));
+#endif
+#if @GNULIB_ISWXDIGIT@
+# if @REPLACE_ISWXDIGIT@
+_GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
+# else
 _GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc));
+# endif
 #endif
 #if __GLIBC__ >= 2
 _GL_CXXALIASWARN (iswalnum);
@@ -593,7 +646,7 @@
    The argument WC must be either a wchar_t value or WEOF.
    The argument DESC must have been returned by the wctype() function.  */
 #if @GNULIB_ISWCTYPE@
-# if @GNULIB_OVERRIDES_WINT_T@
+# if @GNULIBHEADERS_OVERRIDE_WINT_T@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef iswctype
 #   define iswctype rpl_iswctype
diff --git a/lib/wcwidth.c b/lib/wcwidth.c
index 1f081cc..7f11211 100644
--- a/lib/wcwidth.c
+++ b/lib/wcwidth.c
@@ -1,17 +1,17 @@
 /* Determine the number of screen columns needed for a character.
-   Copyright (C) 2006-2007, 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2007, 2010-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
@@ -34,7 +34,7 @@
   return STREQ_OPT (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0);
 }
 
-#if GNULIB_WCHAR_SINGLE
+#if GNULIB_WCHAR_SINGLE_LOCALE
 /* When we know that the locale does not change, provide a speedup by
    caching the value of is_locale_utf8.  */
 static int cached_is_locale_utf8 = -1;
diff --git a/lib/windows-initguard.h b/lib/windows-initguard.h
index 8aefd0b..7999b23 100644
--- a/lib/windows-initguard.h
+++ b/lib/windows-initguard.h
@@ -1,18 +1,18 @@
 /* Init guards, somewhat like spinlocks (native Windows implementation).
-   Copyright (C) 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2005.
    Based on GCC's gthr-win32.h.  */
diff --git a/lib/windows-mutex.c b/lib/windows-mutex.c
index 9433881..2edfeaa 100644
--- a/lib/windows-mutex.c
+++ b/lib/windows-mutex.c
@@ -1,18 +1,18 @@
 /* Plain mutexes (native Windows implementation).
-   Copyright (C) 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2005.
    Based on GCC's gthr-win32.h.  */
diff --git a/lib/windows-mutex.h b/lib/windows-mutex.h
index 5364f92..5ecf9f8 100644
--- a/lib/windows-mutex.h
+++ b/lib/windows-mutex.h
@@ -1,18 +1,18 @@
 /* Plain mutexes (native Windows implementation).
-   Copyright (C) 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2005.
    Based on GCC's gthr-win32.h.  */
diff --git a/lib/windows-once.c b/lib/windows-once.c
index 455c50e..8dcd37c 100644
--- a/lib/windows-once.c
+++ b/lib/windows-once.c
@@ -1,18 +1,18 @@
 /* Once-only control (native Windows implementation).
-   Copyright (C) 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2005.
    Based on GCC's gthr-win32.h.  */
diff --git a/lib/windows-once.h b/lib/windows-once.h
index 1599983..58632f9 100644
--- a/lib/windows-once.h
+++ b/lib/windows-once.h
@@ -1,18 +1,18 @@
 /* Once-only control (native Windows implementation).
-   Copyright (C) 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2005.
    Based on GCC's gthr-win32.h.  */
diff --git a/lib/windows-recmutex.c b/lib/windows-recmutex.c
index 7e6e446..cfc94b4 100644
--- a/lib/windows-recmutex.c
+++ b/lib/windows-recmutex.c
@@ -1,18 +1,18 @@
 /* Plain recursive mutexes (native Windows implementation).
-   Copyright (C) 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2005.
    Based on GCC's gthr-win32.h.  */
diff --git a/lib/windows-recmutex.h b/lib/windows-recmutex.h
index d143108..174fe73 100644
--- a/lib/windows-recmutex.h
+++ b/lib/windows-recmutex.h
@@ -1,18 +1,18 @@
 /* Plain recursive mutexes (native Windows implementation).
-   Copyright (C) 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2005.
    Based on GCC's gthr-win32.h.  */
diff --git a/lib/windows-rwlock.c b/lib/windows-rwlock.c
index 9207d1b..d63936c 100644
--- a/lib/windows-rwlock.c
+++ b/lib/windows-rwlock.c
@@ -1,18 +1,18 @@
 /* Read-write locks (native Windows implementation).
-   Copyright (C) 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2005.
    Based on GCC's gthr-win32.h.  */
@@ -25,6 +25,10 @@
 #include <errno.h>
 #include <stdlib.h>
 
+/* Don't assume that UNICODE is not defined.  */
+#undef CreateEvent
+#define CreateEvent CreateEventA
+
 /* In this file, the waitqueues are implemented as circular arrays.  */
 #define glwthread_waitqueue_t glwthread_carray_waitqueue_t
 
diff --git a/lib/windows-rwlock.h b/lib/windows-rwlock.h
index 9002040..280c9f2 100644
--- a/lib/windows-rwlock.h
+++ b/lib/windows-rwlock.h
@@ -1,18 +1,18 @@
 /* Read-write locks (native Windows implementation).
-   Copyright (C) 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2005.
    Based on GCC's gthr-win32.h.  */
diff --git a/lib/windows-spawn.c b/lib/windows-spawn.c
new file mode 100644
index 0000000..fe0d88b
--- /dev/null
+++ b/lib/windows-spawn.c
@@ -0,0 +1,727 @@
+/* Auxiliary functions for the creation of subprocesses.  Native Windows API.
+   Copyright (C) 2001, 2003-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "windows-spawn.h"
+
+/* Get declarations of the native Windows API functions.  */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+/* Get _get_osfhandle().  */
+#if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+#else
+# include <io.h>
+#endif
+#include <process.h>
+
+#include "findprog.h"
+
+/* Don't assume that UNICODE is not defined.  */
+#undef STARTUPINFO
+#define STARTUPINFO STARTUPINFOA
+#undef CreateProcess
+#define CreateProcess CreateProcessA
+
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037*?"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+
+/* Returns the length of a quoted argument string.  */
+static size_t
+quoted_arg_length (const char *string)
+{
+  bool quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+  size_t length;
+  unsigned int backslashes;
+  const char *s;
+
+  length = 0;
+  backslashes = 0;
+  if (quote_around)
+    length++;
+  for (s = string; *s != '\0'; s++)
+    {
+      char c = *s;
+      if (c == '"')
+        length += backslashes + 1;
+      length++;
+      if (c == '\\')
+        backslashes++;
+      else
+        backslashes = 0;
+    }
+  if (quote_around)
+    length += backslashes + 1;
+
+  return length;
+}
+
+/* Produces a quoted argument string.
+   Stores exactly quoted_arg_length (STRING) + 1 bytes, including the final
+   NUL byte, at MEM.
+   Returns a pointer past the stored quoted argument string.  */
+static char *
+quoted_arg_string (const char *string, char *mem)
+{
+  bool quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+  char *p;
+  unsigned int backslashes;
+  const char *s;
+
+  p = mem;
+  backslashes = 0;
+  if (quote_around)
+    *p++ = '"';
+  for (s = string; *s != '\0'; s++)
+    {
+      char c = *s;
+      if (c == '"')
+        {
+          unsigned int j;
+          for (j = backslashes + 1; j > 0; j--)
+            *p++ = '\\';
+        }
+      *p++ = c;
+      if (c == '\\')
+        backslashes++;
+      else
+        backslashes = 0;
+    }
+  if (quote_around)
+    {
+      unsigned int j;
+      for (j = backslashes; j > 0; j--)
+        *p++ = '\\';
+      *p++ = '"';
+    }
+  *p++ = '\0';
+
+  return p;
+}
+
+const char **
+prepare_spawn (const char * const *argv, char **mem_to_free)
+{
+  size_t argc;
+  const char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = (const char **) malloc ((1 + argc + 1) * sizeof (const char *));
+
+  /* Add an element upfront that can be used when argv[0] turns out to be a
+     script, not a program.
+     On Unix, this would be "/bin/sh". On native Windows, "sh" is actually
+     "sh.exe".  We have to omit the directory part and rely on the search in
+     PATH, because the mingw "mount points" are not visible inside Windows
+     CreateProcess().  */
+  new_argv[0] = "sh.exe";
+
+  /* Put quoted arguments into the new argument vector.  */
+  size_t needed_size = 0;
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+      size_t length;
+
+      if (string[0] == '\0')
+        length = strlen ("\"\"");
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+        length = quoted_arg_length (string);
+      else
+        length = strlen (string);
+      needed_size += length + 1;
+    }
+
+  char *mem;
+  if (needed_size == 0)
+    mem = NULL;
+  else
+    {
+      mem = (char *) malloc (needed_size);
+      if (mem == NULL)
+        {
+          /* Memory allocation failure.  */
+          free (new_argv);
+          errno = ENOMEM;
+          return NULL;
+        }
+    }
+  *mem_to_free = mem;
+
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      new_argv[1 + i] = mem;
+      if (string[0] == '\0')
+        {
+          size_t length = strlen ("\"\"");
+          memcpy (mem, "\"\"", length + 1);
+          mem += length + 1;
+        }
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+        {
+          mem = quoted_arg_string (string, mem);
+        }
+      else
+        {
+          size_t length = strlen (string);
+          memcpy (mem, string, length + 1);
+          mem += length + 1;
+        }
+    }
+  new_argv[1 + argc] = NULL;
+
+  return new_argv;
+}
+
+char *
+compose_command (const char * const *argv)
+{
+  /* Just concatenate the argv[] strings, separated by spaces.  */
+  char *command;
+
+  /* Determine the size of the needed block of memory.  */
+  size_t total_size = 0;
+  const char * const *ap;
+  const char *p;
+  for (ap = argv; (p = *ap) != NULL; ap++)
+    total_size += strlen (p) + 1;
+  size_t command_size = (total_size > 0 ? total_size : 1);
+
+  /* Allocate the block of memory.  */
+  command = (char *) malloc (command_size);
+  if (command == NULL)
+    {
+      errno = ENOMEM;
+      return NULL;
+    }
+
+  /* Fill it.  */
+  if (total_size > 0)
+    {
+      char *cp = command;
+      for (ap = argv; (p = *ap) != NULL; ap++)
+        {
+          size_t size = strlen (p) + 1;
+          memcpy (cp, p, size - 1);
+          cp += size;
+          cp[-1] = ' ';
+        }
+      cp[-1] = '\0';
+    }
+  else
+    *command = '\0';
+
+  return command;
+}
+
+char *
+compose_envblock (const char * const *envp)
+{
+  /* This is a bit hairy, because we don't have a lock that would prevent other
+     threads from making modifications in ENVP.  So, just make sure we don't
+     crash; but if other threads are making modifications, part of the result
+     may be wrong.  */
+ retry:
+  {
+    /* Guess the size of the needed block of memory.
+       The guess will be exact if other threads don't make modifications.  */
+    size_t total_size = 0;
+    const char * const *ep;
+    const char *p;
+    for (ep = envp; (p = *ep) != NULL; ep++)
+      total_size += strlen (p) + 1;
+    size_t envblock_size = total_size;
+
+    /* Allocate the block of memory.  */
+    char *envblock = (char *) malloc (envblock_size + 1);
+    if (envblock == NULL)
+      {
+        errno = ENOMEM;
+        return NULL;
+      }
+    size_t envblock_used = 0;
+    for (ep = envp; (p = *ep) != NULL; ep++)
+      {
+        size_t size = strlen (p) + 1;
+        if (envblock_used + size > envblock_size)
+          {
+            /* Other threads did modifications.  Need more memory.  */
+            envblock_size += envblock_size / 2;
+            if (envblock_used + size > envblock_size)
+              envblock_size = envblock_used + size;
+
+            char *new_envblock = (char *) realloc (envblock, envblock_size + 1);
+            if (new_envblock == NULL)
+              {
+                free (envblock);
+                errno = ENOMEM;
+                return NULL;
+              }
+            envblock = new_envblock;
+          }
+        memcpy (envblock + envblock_used, p, size);
+        envblock_used += size;
+        if (envblock[envblock_used - 1] != '\0')
+          {
+            /* Other threads did modifications.  Restart.  */
+            free (envblock);
+            goto retry;
+          }
+      }
+    envblock[envblock_used] = '\0';
+    return envblock;
+  }
+}
+
+int
+init_inheritable_handles (struct inheritable_handles *inh_handles,
+                          bool duplicate)
+{
+  /* Determine the minimal count of handles we need to care about.  */
+  size_t handles_count;
+  {
+    /* _getmaxstdio
+       <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/getmaxstdio>
+       Default value is 512.  */
+    unsigned int fdmax = _getmaxstdio ();
+    if (fdmax < 3)
+      fdmax = 3;
+    for (; fdmax > 3; fdmax--)
+      {
+        unsigned int fd = fdmax - 1;
+        /* _get_osfhandle
+           <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/get-osfhandle>  */
+        HANDLE handle = (HANDLE) _get_osfhandle (fd);
+        if (handle != INVALID_HANDLE_VALUE)
+          {
+            DWORD hflags;
+            /* GetHandleInformation
+               <https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-gethandleinformation>  */
+            if (GetHandleInformation (handle, &hflags))
+              {
+                if ((hflags & HANDLE_FLAG_INHERIT) != 0)
+                  /* fd denotes an inheritable descriptor.  */
+                  break;
+              }
+          }
+      }
+    handles_count = fdmax;
+  }
+  /* Note: handles_count >= 3.  */
+
+  /* Allocate the arrays.  */
+  size_t handles_allocated = handles_count;
+  HANDLE *handles_array =
+    (HANDLE *) malloc (handles_allocated * sizeof (HANDLE));
+  if (handles_array == NULL)
+    {
+      errno = ENOMEM;
+      return -1;
+    }
+  unsigned char *flags_array =
+    (unsigned char *) malloc (handles_allocated * sizeof (unsigned char));
+  if (flags_array == NULL)
+    {
+      free (handles_array);
+      errno = ENOMEM;
+      return -1;
+    }
+
+  /* Fill in the two arrays.  */
+  {
+    HANDLE curr_process = (duplicate ? GetCurrentProcess () : INVALID_HANDLE_VALUE);
+    unsigned int fd;
+    for (fd = 0; fd < handles_count; fd++)
+      {
+        handles_array[fd] = INVALID_HANDLE_VALUE;
+        /* _get_osfhandle
+           <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/get-osfhandle>  */
+        HANDLE handle = (HANDLE) _get_osfhandle (fd);
+        if (handle != INVALID_HANDLE_VALUE)
+          {
+            DWORD hflags;
+            /* GetHandleInformation
+               <https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-gethandleinformation>  */
+            if (GetHandleInformation (handle, &hflags))
+              {
+                if ((hflags & HANDLE_FLAG_INHERIT) != 0)
+                  {
+                    /* fd denotes an inheritable descriptor.  */
+                    if (duplicate)
+                      {
+                        if (!DuplicateHandle (curr_process, handle,
+                                              curr_process, &handles_array[fd],
+                                              0, TRUE, DUPLICATE_SAME_ACCESS))
+                          {
+                            unsigned int i;
+                            for (i = 0; i < fd; i++)
+                              if (handles_array[i] != INVALID_HANDLE_VALUE)
+                                CloseHandle (handles_array[i]);
+                            free (flags_array);
+                            free (handles_array);
+                            errno = EBADF; /* arbitrary */
+                            return -1;
+                          }
+                      }
+                    else
+                      handles_array[fd] = handle;
+
+                    flags_array[fd] = 0;
+                  }
+              }
+          }
+      }
+  }
+
+  /* Return the result.  */
+  inh_handles->count = handles_count;
+  inh_handles->allocated = handles_allocated;
+  inh_handles->handles = handles_array;
+  inh_handles->flags = flags_array;
+  return 0;
+}
+
+int
+compose_handles_block (const struct inheritable_handles *inh_handles,
+                       STARTUPINFO *sinfo)
+{
+  /* STARTUPINFO
+     <https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-startupinfoa>  */
+  sinfo->dwFlags = STARTF_USESTDHANDLES;
+  sinfo->hStdInput  = inh_handles->handles[0];
+  sinfo->hStdOutput = inh_handles->handles[1];
+  sinfo->hStdError  = inh_handles->handles[2];
+
+  /* On newer versions of Windows, more file descriptors / handles than the
+     first three can be passed.
+     The format is as follows: Let N be an exclusive upper bound for the file
+     descriptors to be passed. Two arrays are constructed in memory:
+       - flags[0..N-1], of element type 'unsigned char',
+       - handles[0..N-1], of element type 'HANDLE' or 'intptr_t'.
+     For used entries, handles[i] is the handle, and flags[i] is a set of flags,
+     a combination of:
+        1 for open file descriptors,
+       64 for handles of type FILE_TYPE_CHAR,
+        8 for handles of type FILE_TYPE_PIPE,
+       32 for O_APPEND.
+     For unused entries - this may include any of the first three, since they
+     are already passed above -, handles[i] is INVALID_HANDLE_VALUE and flags[i]
+     is zero.
+     lpReserved2 now is a pointer to the concatenation (without padding) of:
+       - an 'unsigned int' whose value is N,
+       - the contents of the flags[0..N-1] array,
+       - the contents of the handles[0..N-1] array.
+     cbReserved2 is the size (in bytes) of the object at lpReserved2.  */
+
+  size_t handles_count = inh_handles->count;
+
+  sinfo->cbReserved2 =
+    sizeof (unsigned int)
+    + handles_count * sizeof (unsigned char)
+    + handles_count * sizeof (HANDLE);
+  /* Add some padding, so that we can work with a properly aligned HANDLE
+     array.  */
+  char *hblock = (char *) malloc (sinfo->cbReserved2 + (sizeof (HANDLE) - 1));
+  if (hblock == NULL)
+    {
+      errno = ENOMEM;
+      return -1;
+    }
+  unsigned char *flags = (unsigned char *) (hblock + sizeof (unsigned int));
+  char *handles = (char *) (flags + handles_count);
+  HANDLE *handles_aligned =
+    (HANDLE *) (((uintptr_t) handles + (sizeof (HANDLE) - 1))
+                & - (uintptr_t) sizeof (HANDLE));
+
+  * (unsigned int *) hblock = handles_count;
+  {
+    unsigned int fd;
+    for (fd = 0; fd < handles_count; fd++)
+      {
+        handles_aligned[fd] = INVALID_HANDLE_VALUE;
+        flags[fd] = 0;
+
+        HANDLE handle = inh_handles->handles[fd];
+        if (handle != INVALID_HANDLE_VALUE
+            /* The first three are possibly already passed above.
+               But they need to passed here as well, if they have some flags.  */
+            && (fd >= 3 || inh_handles->flags[fd] != 0))
+          {
+            DWORD hflags;
+            /* GetHandleInformation
+               <https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-gethandleinformation>  */
+            if (GetHandleInformation (handle, &hflags))
+              {
+                if ((hflags & HANDLE_FLAG_INHERIT) != 0)
+                  {
+                    /* fd denotes an inheritable descriptor.  */
+                    handles_aligned[fd] = handle;
+                    /* On Microsoft Windows, it would be sufficient to set
+                       flags[fd] = 1.  But on ReactOS or Wine, adding the bit
+                       that indicates the handle type may be necessary.  So,
+                       just do it everywhere.  */
+                    flags[fd] = 1 | inh_handles->flags[fd];
+                    switch (GetFileType (handle))
+                      {
+                      case FILE_TYPE_CHAR:
+                        flags[fd] |= 64;
+                        break;
+                      case FILE_TYPE_PIPE:
+                        flags[fd] |= 8;
+                        break;
+                      default:
+                        break;
+                      }
+                  }
+                else
+                  /* We shouldn't have any non-inheritable handles in
+                     inh_handles->handles.  */
+                  abort ();
+              }
+          }
+      }
+  }
+  if (handles != (char *) handles_aligned)
+    memmove (handles, (char *) handles_aligned, handles_count * sizeof (HANDLE));
+
+  sinfo->lpReserved2 = (BYTE *) hblock;
+
+  return 0;
+}
+
+void
+free_inheritable_handles (struct inheritable_handles *inh_handles)
+{
+  free (inh_handles->flags);
+  free (inh_handles->handles);
+}
+
+int
+convert_CreateProcess_error (DWORD error)
+{
+  /* Some of these errors probably cannot happen.  But who knows...  */
+  switch (error)
+    {
+    case ERROR_FILE_NOT_FOUND:
+    case ERROR_PATH_NOT_FOUND:
+    case ERROR_BAD_PATHNAME:
+    case ERROR_BAD_NET_NAME:
+    case ERROR_INVALID_NAME:
+    case ERROR_DIRECTORY:
+      return ENOENT;
+      break;
+
+    case ERROR_ACCESS_DENIED:
+    case ERROR_SHARING_VIOLATION:
+      return EACCES;
+      break;
+
+    case ERROR_OUTOFMEMORY:
+      return ENOMEM;
+      break;
+
+    case ERROR_BUFFER_OVERFLOW:
+    case ERROR_FILENAME_EXCED_RANGE:
+      return ENAMETOOLONG;
+      break;
+
+    case ERROR_BAD_FORMAT:
+    case ERROR_BAD_EXE_FORMAT:
+      return ENOEXEC;
+      break;
+
+    default:
+      return EINVAL;
+      break;
+    }
+}
+
+intptr_t
+spawnpvech (int mode,
+            const char *progname, const char * const *argv,
+            const char * const *envp,
+            const char *currdir,
+            HANDLE stdin_handle, HANDLE stdout_handle, HANDLE stderr_handle)
+{
+  /* Validate the arguments.  */
+  if (!(mode == P_WAIT
+        || mode == P_NOWAIT
+        || mode == P_DETACH
+        || mode == P_OVERLAY)
+      || progname == NULL || argv == NULL)
+    {
+      errno = EINVAL;
+      return -1;
+    }
+
+  /* Implement the 'p' letter: search for PROGNAME in getenv ("PATH").  */
+  const char *resolved_progname =
+    find_in_given_path (progname, getenv ("PATH"), NULL, false);
+  if (resolved_progname == NULL)
+    return -1;
+
+  /* Compose the command.  */
+  char *command = compose_command (argv);
+  if (command == NULL)
+    goto out_of_memory_1;
+
+  /* Copy *ENVP into a contiguous block of memory.  */
+  char *envblock;
+  if (envp == NULL)
+    envblock = NULL;
+  else
+    {
+      envblock = compose_envblock (envp);
+      if (envblock == NULL)
+        goto out_of_memory_2;
+    }
+
+  /* Collect the inheritable handles.  */
+  struct inheritable_handles inh_handles;
+  if (init_inheritable_handles (&inh_handles, false) < 0)
+    {
+      int saved_errno = errno;
+      if (envblock != NULL)
+        free (envblock);
+      free (command);
+      if (resolved_progname != progname)
+        free ((char *) resolved_progname);
+      errno = saved_errno;
+      return -1;
+    }
+  inh_handles.handles[0] = stdin_handle;  inh_handles.flags[0] = 0;
+  inh_handles.handles[1] = stdout_handle; inh_handles.flags[1] = 0;
+  inh_handles.handles[2] = stderr_handle; inh_handles.flags[2] = 0;
+
+  /* CreateProcess
+     <https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa>  */
+  /* <https://docs.microsoft.com/en-us/windows/win32/procthread/process-creation-flags>  */
+  DWORD process_creation_flags = (mode == P_DETACH ? DETACHED_PROCESS : 0);
+  /* STARTUPINFO
+     <https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-startupinfoa>  */
+  STARTUPINFO sinfo;
+  sinfo.cb = sizeof (STARTUPINFO);
+  sinfo.lpReserved = NULL;
+  sinfo.lpDesktop = NULL;
+  sinfo.lpTitle = NULL;
+  if (compose_handles_block (&inh_handles, &sinfo) < 0)
+    {
+      int saved_errno = errno;
+      free_inheritable_handles (&inh_handles);
+      if (envblock != NULL)
+        free (envblock);
+      free (command);
+      if (resolved_progname != progname)
+        free ((char *) resolved_progname);
+      errno = saved_errno;
+      return -1;
+    }
+
+  PROCESS_INFORMATION pinfo;
+  if (!CreateProcess (resolved_progname, command, NULL, NULL, TRUE,
+                      process_creation_flags, envblock, currdir, &sinfo,
+                      &pinfo))
+    {
+      DWORD error = GetLastError ();
+
+      free (sinfo.lpReserved2);
+      free_inheritable_handles (&inh_handles);
+      if (envblock != NULL)
+        free (envblock);
+      free (command);
+      if (resolved_progname != progname)
+        free ((char *) resolved_progname);
+
+      errno = convert_CreateProcess_error (error);
+      return -1;
+    }
+
+  if (pinfo.hThread)
+    CloseHandle (pinfo.hThread);
+  free (sinfo.lpReserved2);
+  free_inheritable_handles (&inh_handles);
+  if (envblock != NULL)
+    free (envblock);
+  free (command);
+  if (resolved_progname != progname)
+    free ((char *) resolved_progname);
+
+  switch (mode)
+    {
+    case P_WAIT:
+      {
+        /* Wait until it terminates.  Then get its exit status code.  */
+        switch (WaitForSingleObject (pinfo.hProcess, INFINITE))
+          {
+          case WAIT_OBJECT_0:
+            break;
+          case WAIT_FAILED:
+            errno = ECHILD;
+            return -1;
+          default:
+            abort ();
+          }
+
+        DWORD exit_code;
+        if (!GetExitCodeProcess (pinfo.hProcess, &exit_code))
+          {
+            errno = ECHILD;
+            return -1;
+          }
+        CloseHandle (pinfo.hProcess);
+        return exit_code;
+      }
+
+    case P_NOWAIT:
+      /* Return pinfo.hProcess, not pinfo.dwProcessId.  */
+      return (intptr_t) pinfo.hProcess;
+
+    case P_DETACH:
+    case P_OVERLAY:
+      CloseHandle (pinfo.hProcess);
+      return 0;
+
+    default:
+      /* Already checked above.  */
+      abort ();
+    }
+
+  /*NOTREACHED*/
+ out_of_memory_2:
+  free (command);
+ out_of_memory_1:
+  if (resolved_progname != progname)
+    free ((char *) resolved_progname);
+  errno = ENOMEM;
+  return -1;
+}
diff --git a/lib/windows-spawn.h b/lib/windows-spawn.h
new file mode 100644
index 0000000..5ba4664
--- /dev/null
+++ b/lib/windows-spawn.h
@@ -0,0 +1,157 @@
+/* Auxiliary functions for the creation of subprocesses.  Native Windows API.
+   Copyright (C) 2001, 2003-2021 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _WINDOWS_SPAWN_H
+#define _WINDOWS_SPAWN_H
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+/* Get declarations of the native Windows API functions.  */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+
+/* Prepares an argument vector before calling spawn().
+
+   Note that spawn() does not by itself call the command interpreter
+     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+         GetVersionEx(&v);
+         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+      }) ? "cmd.exe" : "command.com").
+   Instead it simply concatenates the arguments, separated by ' ', and calls
+   CreateProcess().  We must quote the arguments since Windows CreateProcess()
+   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+   special way:
+   - Space and tab are interpreted as delimiters. They are not treated as
+     delimiters if they are surrounded by double quotes: "...".
+   - Unescaped double quotes are removed from the input. Their only effect is
+     that within double quotes, space and tab are treated like normal
+     characters.
+   - Backslashes not followed by double quotes are not special.
+   - But 2*n+1 backslashes followed by a double quote become
+     n backslashes followed by a double quote (n >= 0):
+       \" -> "
+       \\\" -> \"
+       \\\\\" -> \\"
+   - '*', '?' characters may get expanded through wildcard expansion in the
+     callee: By default, in the callee, the initialization code before main()
+     takes the result of GetCommandLine(), wildcard-expands it, and passes it
+     to main(). The exceptions to this rule are:
+       - programs that inspect GetCommandLine() and ignore argv,
+       - mingw programs that have a global variable 'int _CRT_glob = 0;',
+       - Cygwin programs, when invoked from a Cygwin program.
+
+   prepare_spawn creates and returns a new argument vector, where the arguments
+   are appropriately quoted and an additional argument "sh.exe" has been added
+   at the beginning.  The new argument vector is freshly allocated.  The memory
+   for all its elements is allocated within *MEM_TO_FREE, which is freshly
+   allocated as well.  In case of memory allocation failure, NULL is returned,
+   with errno set.
+ */
+extern const char ** prepare_spawn (const char * const *argv,
+                                    char **mem_to_free);
+
+/* Composes the command to be passed to CreateProcess().
+   ARGV must contain appropriately quoted arguments, as returned by
+   prepare_spawn.
+   Returns a freshly allocated string.  In case of memory allocation failure,
+   NULL is returned, with errno set.  */
+extern char * compose_command (const char * const *argv)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
+
+/* Composes the block of memory that contains the environment variables.
+   ENVP must contain an environment (a NULL-terminated array of string of the
+   form VARIABLE=VALUE).
+   Returns a freshly allocated block of memory.  In case of memory allocation
+   failure, NULL is returned, with errno set.  */
+extern char * compose_envblock (const char * const *envp)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
+
+
+/* This struct keeps track of which handles to pass to a subprocess, and with
+   which flags.  All of the handles here are inheritable.
+   Regarding handle inheritance, see
+   <https://docs.microsoft.com/en-us/windows/win32/sysinfo/handle-inheritance>  */
+struct inheritable_handles
+{
+  /* The number of occupied entries in the two arrays below.
+     3 <= count <= allocated.  */
+  size_t count;
+  /* The number of allocated entries in the two arrays below.  */
+  size_t allocated;
+  /* handles[0..count-1] are the occupied entries.
+     handles[fd] is either INVALID_HANDLE_VALUE or an inheritable handle.  */
+  HANDLE *handles;
+  /* flags[0..count-1] are the occupied entries.
+     flags[fd] is only relevant if handles[fd] != INVALID_HANDLE_VALUE.
+     It is a bit mask consisting of:
+       - 32 for O_APPEND.
+   */
+  unsigned char *flags;
+};
+
+/* Initializes a set of inheritable handles, filling in all inheritable handles
+   assigned to file descriptors.
+   If DUPLICATE is true, the handles stored in the set are duplicates.
+   Returns 0 upon success.  In case of failure, -1 is returned, with errno set.
+ */
+extern int init_inheritable_handles (struct inheritable_handles *inh_handles,
+                                     bool duplicate);
+
+/* Fills a set of inheritable handles into a STARTUPINFO for CreateProcess().
+   Returns 0 upon success.  In case of failure, -1 is returned, with errno set.
+ */
+extern int compose_handles_block (const struct inheritable_handles *inh_handles,
+                                  STARTUPINFOA *sinfo);
+
+/* Frees the memory held by a set of inheritable handles.  */
+extern void free_inheritable_handles (struct inheritable_handles *inh_handles);
+
+
+/* Converts a CreateProcess() error code (retrieved through GetLastError()) to
+   an errno value.  */
+extern int convert_CreateProcess_error (DWORD error);
+
+
+/* Creates a subprocess.
+   MODE is either P_WAIT or P_NOWAIT.
+   PROGNAME is the program to invoke.
+   ARGV is the NULL-terminated array of arguments, ARGV[0] being PROGNAME by
+   convention.
+   ENVP is the NULL-terminated set of environment variable assignments, or NULL
+   to inherit the initial environ variable assignments from the caller and
+   ignore all calls to putenv(), setenv(), unsetenv() done in the caller.
+   CURRDIR is the directory in which to start the program, or NULL to inherit
+   the working directory from the caller.
+   STDIN_HANDLE, STDOUT_HANDLE, STDERR_HANDLE are the handles to use for the
+   first three file descriptors in the callee process.
+   Returns
+     - 0 for success (if MODE is P_WAIT), or
+     - a handle that be passed to _cwait (on Windows) or waitpid (on OS/2), or
+     - -1 upon error, with errno set.
+ */
+extern intptr_t spawnpvech (int mode,
+                            const char *progname, const char * const *argv,
+                            const char * const *envp,
+                            const char *currdir,
+                            HANDLE stdin_handle, HANDLE stdout_handle,
+                            HANDLE stderr_handle);
+
+#endif /* _WINDOWS_SPAWN_H */
diff --git a/lib/windows-tls.c b/lib/windows-tls.c
index 2e1b702..dfadcfd 100644
--- a/lib/windows-tls.c
+++ b/lib/windows-tls.c
@@ -1,17 +1,17 @@
 /* Thread-local storage (native Windows implementation).
-   Copyright (C) 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2005.  */
diff --git a/lib/windows-tls.h b/lib/windows-tls.h
index 3bccd2e..c822d25 100644
--- a/lib/windows-tls.h
+++ b/lib/windows-tls.h
@@ -1,17 +1,17 @@
 /* Thread-local storage (native Windows implementation).
-   Copyright (C) 2005-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2005.  */
diff --git a/lib/xalloc-die.c b/lib/xalloc-die.c
index 295f8d8..1bf0a9e 100644
--- a/lib/xalloc-die.c
+++ b/lib/xalloc-die.c
@@ -1,6 +1,6 @@
 /* Report a memory allocation failure and exit.
 
-   Copyright (C) 1997-2000, 2002-2004, 2006, 2009-2019 Free Software
+   Copyright (C) 1997-2000, 2002-2004, 2006, 2009-2021 Free Software
    Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
diff --git a/lib/xalloc-oversized.h b/lib/xalloc-oversized.h
index e3068c8..4184f33 100644
--- a/lib/xalloc-oversized.h
+++ b/lib/xalloc-oversized.h
@@ -1,18 +1,18 @@
 /* xalloc-oversized.h -- memory allocation size checking
 
-   Copyright (C) 1990-2000, 2003-2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 1990-2000, 2003-2004, 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef XALLOC_OVERSIZED_H_
@@ -21,34 +21,39 @@
 #include <stddef.h>
 #include <stdint.h>
 
-/* True if N * S would overflow in a size_t calculation,
-   or would generate a value larger than PTRDIFF_MAX.
+/* True if N * S does not fit into both ptrdiff_t and size_t.
+   N and S should be nonnegative and free of side effects.
    This expands to a constant expression if N and S are both constants.
-   By gnulib convention, SIZE_MAX represents overflow in size
+   By gnulib convention, SIZE_MAX represents overflow in size_t
    calculations, so the conservative size_t-based dividend to use here
    is SIZE_MAX - 1.  */
 #define __xalloc_oversized(n, s) \
-  ((size_t) (PTRDIFF_MAX < SIZE_MAX ? PTRDIFF_MAX : SIZE_MAX - 1) / (s) < (n))
+  ((s) != 0 \
+   && ((size_t) (PTRDIFF_MAX < SIZE_MAX ? PTRDIFF_MAX : SIZE_MAX - 1) / (s) \
+       < (n)))
 
-#if PTRDIFF_MAX < SIZE_MAX
-typedef ptrdiff_t __xalloc_count_type;
-#else
-typedef size_t __xalloc_count_type;
-#endif
+/* Return 1 if and only if an array of N objects, each of size S,
+   cannot exist reliably because its total size in bytes would exceed
+   MIN (PTRDIFF_MAX, SIZE_MAX - 1).
 
-/* Return 1 if an array of N objects, each of size S, cannot exist
-   reliably due to size or ptrdiff_t arithmetic overflow.  S must be
-   positive and N must be nonnegative.  This is a macro, not a
-   function, so that it works correctly even when SIZE_MAX < N.  */
+   N and S should be nonnegative and free of side effects.
 
-#if 7 <= __GNUC__
+   Warning: (xalloc_oversized (N, S) ? NULL : malloc (N * S)) can
+   misbehave if N and S are both narrower than ptrdiff_t and size_t,
+   and can be rewritten as (xalloc_oversized (N, S) ?  NULL
+   : malloc (N * (size_t) S)).
+
+   This is a macro, not a function, so that it works even if an
+   argument exceeds MAX (PTRDIFF_MAX, SIZE_MAX).  */
+#if 7 <= __GNUC__ && !defined __clang__ && PTRDIFF_MAX < SIZE_MAX
 # define xalloc_oversized(n, s) \
-   __builtin_mul_overflow_p (n, s, (__xalloc_count_type) 1)
-#elif 5 <= __GNUC__ && !defined __ICC && !__STRICT_ANSI__
+   __builtin_mul_overflow_p (n, s, (ptrdiff_t) 1)
+#elif (5 <= __GNUC__ && !defined __ICC && !__STRICT_ANSI__ \
+       && PTRDIFF_MAX < SIZE_MAX)
 # define xalloc_oversized(n, s) \
    (__builtin_constant_p (n) && __builtin_constant_p (s) \
     ? __xalloc_oversized (n, s) \
-    : ({ __xalloc_count_type __xalloc_count; \
+    : ({ ptrdiff_t __xalloc_count; \
          __builtin_mul_overflow (n, s, &__xalloc_count); }))
 
 /* Other compilers use integer division; this may be slower but is
diff --git a/lib/xalloc.h b/lib/xalloc.h
index fc7e86b..ee07113 100644
--- a/lib/xalloc.h
+++ b/lib/xalloc.h
@@ -1,6 +1,6 @@
 /* xalloc.h -- malloc with out-of-memory checking
 
-   Copyright (C) 1990-2000, 2003-2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 1990-2000, 2003-2004, 2006-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -19,9 +19,13 @@
 #define XALLOC_H_
 
 #include <stddef.h>
+#include <stdlib.h>
 #include <stdint.h>
 
-#include "xalloc-oversized.h"
+#if GNULIB_XALLOC
+# include "idx.h"
+# include "intprops.h"
+#endif
 
 #ifndef _GL_INLINE_HEADER_BEGIN
  #error "Please include config.h first."
@@ -31,38 +35,69 @@
 # define XALLOC_INLINE _GL_INLINE
 #endif
 
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 
-#if ! defined __clang__ && \
-    (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
-# define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
-#else
-# define _GL_ATTRIBUTE_ALLOC_SIZE(args)
-#endif
+#if GNULIB_XALLOC_DIE
 
 /* This function is always triggered when memory is exhausted.
    It must be defined by the application, either explicitly
    or by using gnulib's xalloc-die module.  This is the
    function to call when one wants the program to die because of a
    memory allocation failure.  */
-extern _Noreturn void xalloc_die (void);
+/*extern*/ _Noreturn void xalloc_die (void);
+
+#endif /* GNULIB_XALLOC_DIE */
+
+#if GNULIB_XALLOC
 
 void *xmalloc (size_t s)
-      _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_ALLOC_SIZE ((1)) _GL_ATTRIBUTE_RETURNS_NONNULL;
+void *ximalloc (idx_t s)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_ALLOC_SIZE ((1)) _GL_ATTRIBUTE_RETURNS_NONNULL;
 void *xzalloc (size_t s)
-      _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_ALLOC_SIZE ((1)) _GL_ATTRIBUTE_RETURNS_NONNULL;
+void *xizalloc (idx_t s)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_ALLOC_SIZE ((1)) _GL_ATTRIBUTE_RETURNS_NONNULL;
 void *xcalloc (size_t n, size_t s)
-      _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2));
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2)) _GL_ATTRIBUTE_RETURNS_NONNULL;
+void *xicalloc (idx_t n, idx_t s)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2)) _GL_ATTRIBUTE_RETURNS_NONNULL;
 void *xrealloc (void *p, size_t s)
-      _GL_ATTRIBUTE_ALLOC_SIZE ((2));
-void *x2realloc (void *p, size_t *pn);
+  _GL_ATTRIBUTE_ALLOC_SIZE ((2));
+void *xirealloc (void *p, idx_t s)
+  _GL_ATTRIBUTE_ALLOC_SIZE ((2)) _GL_ATTRIBUTE_RETURNS_NONNULL;
+void *xreallocarray (void *p, size_t n, size_t s)
+  _GL_ATTRIBUTE_ALLOC_SIZE ((2, 3));
+void *xireallocarray (void *p, idx_t n, idx_t s)
+  _GL_ATTRIBUTE_ALLOC_SIZE ((2, 3)) _GL_ATTRIBUTE_RETURNS_NONNULL;
+void *x2realloc (void *p, size_t *ps) /* superseded by xpalloc */
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
+void *x2nrealloc (void *p, size_t *pn, size_t s) /* superseded by xpalloc */
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
+void *xpalloc (void *pa, idx_t *pn, idx_t n_incr_min, ptrdiff_t n_max, idx_t s)
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
 void *xmemdup (void const *p, size_t s)
-      _GL_ATTRIBUTE_ALLOC_SIZE ((2));
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_ALLOC_SIZE ((2)) _GL_ATTRIBUTE_RETURNS_NONNULL;
+void *ximemdup (void const *p, idx_t s)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_ALLOC_SIZE ((2)) _GL_ATTRIBUTE_RETURNS_NONNULL;
+char *ximemdup0 (void const *p, idx_t s)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
 char *xstrdup (char const *str)
-      _GL_ATTRIBUTE_MALLOC;
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
 
 /* In the following macros, T must be an elementary or structure/union or
    typedef'ed type, or a pointer to such a type.  To apply one of the
@@ -71,155 +106,60 @@
 
 /* Allocate an object of type T dynamically, with error checking.  */
 /* extern t *XMALLOC (typename t); */
-#define XMALLOC(t) ((t *) xmalloc (sizeof (t)))
+# define XMALLOC(t) ((t *) xmalloc (sizeof (t)))
 
 /* Allocate memory for N elements of type T, with error checking.  */
 /* extern t *XNMALLOC (size_t n, typename t); */
-#define XNMALLOC(n, t) \
-   ((t *) (sizeof (t) == 1 ? xmalloc (n) : xnmalloc (n, sizeof (t))))
+# define XNMALLOC(n, t) \
+    ((t *) (sizeof (t) == 1 ? xmalloc (n) : xnmalloc (n, sizeof (t))))
 
 /* Allocate an object of type T dynamically, with error checking,
    and zero it.  */
 /* extern t *XZALLOC (typename t); */
-#define XZALLOC(t) ((t *) xzalloc (sizeof (t)))
+# define XZALLOC(t) ((t *) xzalloc (sizeof (t)))
 
 /* Allocate memory for N elements of type T, with error checking,
    and zero it.  */
 /* extern t *XCALLOC (size_t n, typename t); */
-#define XCALLOC(n, t) \
-   ((t *) (sizeof (t) == 1 ? xzalloc (n) : xcalloc (n, sizeof (t))))
+# define XCALLOC(n, t) \
+    ((t *) (sizeof (t) == 1 ? xzalloc (n) : xcalloc (n, sizeof (t))))
 
 
 /* Allocate an array of N objects, each with S bytes of memory,
    dynamically, with error checking.  S must be nonzero.  */
 
-XALLOC_INLINE void *xnmalloc (size_t n, size_t s)
-                    _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2));
-XALLOC_INLINE void *
-xnmalloc (size_t n, size_t s)
-{
-  if (xalloc_oversized (n, s))
-    xalloc_die ();
-  return xmalloc (n * s);
-}
+void *xnmalloc (size_t n, size_t s)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2)) _GL_ATTRIBUTE_RETURNS_NONNULL;
 
+/* FIXME: Deprecate this in favor of xreallocarray?  */
 /* Change the size of an allocated block of memory P to an array of N
    objects each of S bytes, with error checking.  S must be nonzero.  */
 
 XALLOC_INLINE void *xnrealloc (void *p, size_t n, size_t s)
-                    _GL_ATTRIBUTE_ALLOC_SIZE ((2, 3));
+  _GL_ATTRIBUTE_ALLOC_SIZE ((2, 3));
 XALLOC_INLINE void *
 xnrealloc (void *p, size_t n, size_t s)
 {
-  if (xalloc_oversized (n, s))
-    xalloc_die ();
-  return xrealloc (p, n * s);
-}
-
-/* If P is null, allocate a block of at least *PN such objects;
-   otherwise, reallocate P so that it contains more than *PN objects
-   each of S bytes.  S must be nonzero.  Set *PN to the new number of
-   objects, and return the pointer to the new block.  *PN is never set
-   to zero, and the returned pointer is never null.
-
-   Repeated reallocations are guaranteed to make progress, either by
-   allocating an initial block with a nonzero size, or by allocating a
-   larger block.
-
-   In the following implementation, nonzero sizes are increased by a
-   factor of approximately 1.5 so that repeated reallocations have
-   O(N) overall cost rather than O(N**2) cost, but the
-   specification for this function does not guarantee that rate.
-
-   Here is an example of use:
-
-     int *p = NULL;
-     size_t used = 0;
-     size_t allocated = 0;
-
-     void
-     append_int (int value)
-       {
-         if (used == allocated)
-           p = x2nrealloc (p, &allocated, sizeof *p);
-         p[used++] = value;
-       }
-
-   This causes x2nrealloc to allocate a block of some nonzero size the
-   first time it is called.
-
-   To have finer-grained control over the initial size, set *PN to a
-   nonzero value before calling this function with P == NULL.  For
-   example:
-
-     int *p = NULL;
-     size_t used = 0;
-     size_t allocated = 0;
-     size_t allocated1 = 1000;
-
-     void
-     append_int (int value)
-       {
-         if (used == allocated)
-           {
-             p = x2nrealloc (p, &allocated1, sizeof *p);
-             allocated = allocated1;
-           }
-         p[used++] = value;
-       }
-
-   */
-
-XALLOC_INLINE void *
-x2nrealloc (void *p, size_t *pn, size_t s)
-{
-  size_t n = *pn;
-
-  if (! p)
-    {
-      if (! n)
-        {
-          /* The approximate size to use for initial small allocation
-             requests, when the invoking code specifies an old size of
-             zero.  This is the largest "small" request for the GNU C
-             library malloc.  */
-          enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 };
-
-          n = DEFAULT_MXFAST / s;
-          n += !n;
-        }
-      if (xalloc_oversized (n, s))
-        xalloc_die ();
-    }
-  else
-    {
-      /* Set N = floor (1.5 * N) + 1 so that progress is made even if N == 0.
-         Check for overflow, so that N * S stays in both ptrdiff_t and
-         size_t range.  The check may be slightly conservative, but an
-         exact check isn't worth the trouble.  */
-      if ((PTRDIFF_MAX < SIZE_MAX ? PTRDIFF_MAX : SIZE_MAX) / 3 * 2 / s
-          <= n)
-        xalloc_die ();
-      n += n / 2 + 1;
-    }
-
-  *pn = n;
-  return xrealloc (p, n * s);
+  return xreallocarray (p, n, s);
 }
 
 /* Return a pointer to a new buffer of N bytes.  This is like xmalloc,
    except it returns char *.  */
 
-XALLOC_INLINE char *xcharalloc (size_t n)
-                    _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
-XALLOC_INLINE char *
-xcharalloc (size_t n)
-{
-  return XNMALLOC (n, char);
-}
+char *xcharalloc (size_t n)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_ALLOC_SIZE ((1)) _GL_ATTRIBUTE_RETURNS_NONNULL;
+
+#endif /* GNULIB_XALLOC */
+
 
 #ifdef __cplusplus
 }
+#endif
+
+
+#if GNULIB_XALLOC && defined __cplusplus
 
 /* C++ does not allow conversions from void * to other pointer types
    without a cast.  Use templates to work around the problem when
@@ -232,9 +172,16 @@
 }
 
 template <typename T> inline T *
+xreallocarray (T *p, size_t n, size_t s)
+{
+  return (T *) xreallocarray ((void *) p, n, s);
+}
+
+/* FIXME: Deprecate this in favor of xreallocarray?  */
+template <typename T> inline T *
 xnrealloc (T *p, size_t n, size_t s)
 {
-  return (T *) xnrealloc ((void *) p, n, s);
+  return xreallocarray (p, n, s);
 }
 
 template <typename T> inline T *
@@ -255,7 +202,8 @@
   return (T *) xmemdup ((void const *) p, s);
 }
 
-#endif
+#endif /* GNULIB_XALLOC && C++ */
+
 
 _GL_INLINE_HEADER_END
 
diff --git a/lib/xconcat-filename.c b/lib/xconcat-filename.c
index ad2d5f6..63769d4 100644
--- a/lib/xconcat-filename.c
+++ b/lib/xconcat-filename.c
@@ -1,5 +1,5 @@
 /* Construct a full filename from a directory and a relative filename.
-   Copyright (C) 2001-2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2004, 2006-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by the
diff --git a/lib/xhash.c b/lib/xhash.c
index 9b2bcdb..a212221 100644
--- a/lib/xhash.c
+++ b/lib/xhash.c
@@ -1,6 +1,6 @@
 /* hash - hashing table processing.
 
-   Copyright (C) 2019 Free Software Foundation, Inc.
+   Copyright (C) 2019-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -22,9 +22,6 @@
 
 #include "xalloc.h"
 
-/* Same as hash_initialize, but invokes xalloc_die on memory
-   exhaustion.  */
-
 Hash_table *
 hash_xinitialize (size_t candidate, const Hash_tuning *tuning,
                   Hash_hasher hasher, Hash_comparator comparator,
@@ -36,3 +33,12 @@
     xalloc_die ();
   return res;
 }
+
+void *
+hash_xinsert (Hash_table *table, void const *entry)
+{
+  void *res = hash_insert (table, entry);
+  if (!res)
+    xalloc_die ();
+  return res;
+}
diff --git a/lib/xmalloc.c b/lib/xmalloc.c
index cbe9a4f..51a0832 100644
--- a/lib/xmalloc.c
+++ b/lib/xmalloc.c
@@ -1,6 +1,6 @@
 /* xmalloc.c -- malloc with out of memory checking
 
-   Copyright (C) 1990-2000, 2002-2006, 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 1990-2000, 2002-2006, 2008-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -21,59 +21,249 @@
 
 #include "xalloc.h"
 
+#include "ialloc.h"
+#include "intprops.h"
+#include "minmax.h"
+
 #include <stdlib.h>
 #include <string.h>
 
-/* 1 if calloc is known to be compatible with GNU calloc.  This
-   matters if we are not also using the calloc module, which defines
-   HAVE_CALLOC_GNU and supports the GNU API even on non-GNU platforms.  */
-#if defined HAVE_CALLOC_GNU || (defined __GLIBC__ && !defined __UCLIBC__)
-enum { HAVE_GNU_CALLOC = 1 };
-#else
-enum { HAVE_GNU_CALLOC = 0 };
-#endif
-
-/* Allocate N bytes of memory dynamically, with error checking.  */
-
-void *
-xmalloc (size_t n)
+static void * _GL_ATTRIBUTE_PURE
+nonnull (void *p)
 {
-  void *p = malloc (n);
-  if (!p && n != 0)
+  if (!p)
     xalloc_die ();
   return p;
 }
 
-/* Change the size of an allocated block of memory P to N bytes,
+/* Allocate S bytes of memory dynamically, with error checking.  */
+
+void *
+xmalloc (size_t s)
+{
+  return nonnull (malloc (s));
+}
+
+void *
+ximalloc (idx_t s)
+{
+  return nonnull (imalloc (s));
+}
+
+char *
+xcharalloc (size_t n)
+{
+  return XNMALLOC (n, char);
+}
+
+/* Change the size of an allocated block of memory P to S bytes,
    with error checking.  */
 
 void *
-xrealloc (void *p, size_t n)
+xrealloc (void *p, size_t s)
 {
-  if (!n && p)
-    {
-      /* The GNU and C99 realloc behaviors disagree here.  Act like
-         GNU, even if the underlying realloc is C99.  */
-      free (p);
-      return NULL;
-    }
-
-  p = realloc (p, n);
-  if (!p && n)
+  void *r = realloc (p, s);
+  if (!r && (!p || s))
     xalloc_die ();
-  return p;
+  return r;
 }
 
-/* If P is null, allocate a block of at least *PN bytes; otherwise,
-   reallocate P so that it contains more than *PN bytes.  *PN must be
-   nonzero unless P is null.  Set *PN to the new block's size, and
-   return the pointer to the new block.  *PN is never set to zero, and
+void *
+xirealloc (void *p, idx_t s)
+{
+  return nonnull (irealloc (p, s));
+}
+
+/* Change the size of an allocated block of memory P to an array of N
+   objects each of S bytes, with error checking.  */
+
+void *
+xreallocarray (void *p, size_t n, size_t s)
+{
+  void *r = reallocarray (p, n, s);
+  if (!r && (!p || (n && s)))
+    xalloc_die ();
+  return r;
+}
+
+void *
+xireallocarray (void *p, idx_t n, idx_t s)
+{
+  return nonnull (ireallocarray (p, n, s));
+}
+
+/* Allocate an array of N objects, each with S bytes of memory,
+   dynamically, with error checking.  S must be nonzero.  */
+
+void *
+xnmalloc (size_t n, size_t s)
+{
+  return xreallocarray (NULL, n, s);
+}
+
+/* If P is null, allocate a block of at least *PS bytes; otherwise,
+   reallocate P so that it contains more than *PS bytes.  *PS must be
+   nonzero unless P is null.  Set *PS to the new block's size, and
+   return the pointer to the new block.  *PS is never set to zero, and
    the returned pointer is never null.  */
 
 void *
-x2realloc (void *p, size_t *pn)
+x2realloc (void *p, size_t *ps)
 {
-  return x2nrealloc (p, pn, 1);
+  return x2nrealloc (p, ps, 1);
+}
+
+/* If P is null, allocate a block of at least *PN such objects;
+   otherwise, reallocate P so that it contains more than *PN objects
+   each of S bytes.  S must be nonzero.  Set *PN to the new number of
+   objects, and return the pointer to the new block.  *PN is never set
+   to zero, and the returned pointer is never null.
+
+   Repeated reallocations are guaranteed to make progress, either by
+   allocating an initial block with a nonzero size, or by allocating a
+   larger block.
+
+   In the following implementation, nonzero sizes are increased by a
+   factor of approximately 1.5 so that repeated reallocations have
+   O(N) overall cost rather than O(N**2) cost, but the
+   specification for this function does not guarantee that rate.
+
+   Here is an example of use:
+
+     int *p = NULL;
+     size_t used = 0;
+     size_t allocated = 0;
+
+     void
+     append_int (int value)
+       {
+         if (used == allocated)
+           p = x2nrealloc (p, &allocated, sizeof *p);
+         p[used++] = value;
+       }
+
+   This causes x2nrealloc to allocate a block of some nonzero size the
+   first time it is called.
+
+   To have finer-grained control over the initial size, set *PN to a
+   nonzero value before calling this function with P == NULL.  For
+   example:
+
+     int *p = NULL;
+     size_t used = 0;
+     size_t allocated = 0;
+     size_t allocated1 = 1000;
+
+     void
+     append_int (int value)
+       {
+         if (used == allocated)
+           {
+             p = x2nrealloc (p, &allocated1, sizeof *p);
+             allocated = allocated1;
+           }
+         p[used++] = value;
+       }
+
+   */
+
+void *
+x2nrealloc (void *p, size_t *pn, size_t s)
+{
+  size_t n = *pn;
+
+  if (! p)
+    {
+      if (! n)
+        {
+          /* The approximate size to use for initial small allocation
+             requests, when the invoking code specifies an old size of
+             zero.  This is the largest "small" request for the GNU C
+             library malloc.  */
+          enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 };
+
+          n = DEFAULT_MXFAST / s;
+          n += !n;
+        }
+    }
+  else
+    {
+      /* Set N = floor (1.5 * N) + 1 to make progress even if N == 0.  */
+      if (INT_ADD_WRAPV (n, (n >> 1) + 1, &n))
+        xalloc_die ();
+    }
+
+  p = xreallocarray (p, n, s);
+  *pn = n;
+  return p;
+}
+
+/* Grow PA, which points to an array of *PN items, and return the
+   location of the reallocated array, updating *PN to reflect its
+   new size.  The new array will contain at least N_INCR_MIN more
+   items, but will not contain more than N_MAX items total.
+   S is the size of each item, in bytes.
+
+   S and N_INCR_MIN must be positive.  *PN must be
+   nonnegative.  If N_MAX is -1, it is treated as if it were
+   infinity.
+
+   If PA is null, then allocate a new array instead of reallocating
+   the old one.
+
+   Thus, to grow an array A without saving its old contents, do
+   { free (A); A = xpalloc (NULL, &AITEMS, ...); }.  */
+
+void *
+xpalloc (void *pa, idx_t *pn, idx_t n_incr_min, ptrdiff_t n_max, idx_t s)
+{
+  idx_t n0 = *pn;
+
+  /* The approximate size to use for initial small allocation
+     requests.  This is the largest "small" request for the GNU C
+     library malloc.  */
+  enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 };
+
+  /* If the array is tiny, grow it to about (but no greater than)
+     DEFAULT_MXFAST bytes.  Otherwise, grow it by about 50%.
+     Adjust the growth according to three constraints: N_INCR_MIN,
+     N_MAX, and what the C language can represent safely.  */
+
+  idx_t n;
+  if (INT_ADD_WRAPV (n0, n0 >> 1, &n))
+    n = IDX_MAX;
+  if (0 <= n_max && n_max < n)
+    n = n_max;
+
+  /* NBYTES is of a type suitable for holding the count of bytes in an object.
+     This is typically idx_t, but it should be size_t on (theoretical?)
+     platforms where SIZE_MAX < IDX_MAX so xpalloc does not pass
+     values greater than SIZE_MAX to xrealloc.  */
+#if IDX_MAX <= SIZE_MAX
+  idx_t nbytes;
+#else
+  size_t nbytes;
+#endif
+  idx_t adjusted_nbytes
+    = (INT_MULTIPLY_WRAPV (n, s, &nbytes)
+       ? MIN (IDX_MAX, SIZE_MAX)
+       : nbytes < DEFAULT_MXFAST ? DEFAULT_MXFAST : 0);
+  if (adjusted_nbytes)
+    {
+      n = adjusted_nbytes / s;
+      nbytes = adjusted_nbytes - adjusted_nbytes % s;
+    }
+
+  if (! pa)
+    *pn = 0;
+  if (n - n0 < n_incr_min
+      && (INT_ADD_WRAPV (n0, n_incr_min, &n)
+          || (0 <= n_max && n_max < n)
+          || INT_MULTIPLY_WRAPV (n, s, &nbytes)))
+    xalloc_die ();
+  pa = xrealloc (pa, nbytes);
+  *pn = n;
+  return pa;
 }
 
 /* Allocate S bytes of zeroed memory dynamically, with error checking.
@@ -83,7 +273,13 @@
 void *
 xzalloc (size_t s)
 {
-  return memset (xmalloc (s), 0, s);
+  return xcalloc (s, 1);
+}
+
+void *
+xizalloc (idx_t s)
+{
+  return xicalloc (s, 1);
 }
 
 /* Allocate zeroed memory for N elements of S bytes, with error
@@ -92,15 +288,13 @@
 void *
 xcalloc (size_t n, size_t s)
 {
-  void *p;
-  /* Test for overflow, since objects with size greater than
-     PTRDIFF_MAX cause pointer subtraction to go awry.  Omit size-zero
-     tests if HAVE_GNU_CALLOC, since GNU calloc never returns NULL if
-     successful.  */
-  if (xalloc_oversized (n, s)
-      || (! (p = calloc (n, s)) && (HAVE_GNU_CALLOC || n != 0)))
-    xalloc_die ();
-  return p;
+  return nonnull (calloc (n, s));
+}
+
+void *
+xicalloc (idx_t n, idx_t s)
+{
+  return nonnull (icalloc (n, s));
 }
 
 /* Clone an object P of size S, with error checking.  There's no need
@@ -113,6 +307,23 @@
   return memcpy (xmalloc (s), p, s);
 }
 
+void *
+ximemdup (void const *p, idx_t s)
+{
+  return memcpy (ximalloc (s), p, s);
+}
+
+/* Clone an object P of size S, with error checking.  Append
+   a terminating NUL byte.  */
+
+char *
+ximemdup0 (void const *p, idx_t s)
+{
+  char *result = ximalloc (s + 1);
+  result[s] = 0;
+  return memcpy (result, p, s);
+}
+
 /* Clone STRING.  */
 
 char *
diff --git a/lib/xmemdup0.c b/lib/xmemdup0.c
index 57c1b59..2590ff5 100644
--- a/lib/xmemdup0.c
+++ b/lib/xmemdup0.c
@@ -1,6 +1,6 @@
 /* xmemdup0.c -- copy a block of arbitrary bytes, plus a trailing NUL
 
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/xmemdup0.h b/lib/xmemdup0.h
index 768f0b2..6e34348 100644
--- a/lib/xmemdup0.h
+++ b/lib/xmemdup0.h
@@ -1,6 +1,6 @@
 /* xmemdup0.h -- copy a block of arbitrary bytes, plus a trailing NUL
 
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -18,14 +18,16 @@
 #ifndef XMEMDUP_H_
 # define XMEMDUP_H_
 
-# include <stddef.h>
+# include <stdlib.h>
 
 
 # ifdef __cplusplus
 extern "C" {
 # endif
 
-char *xmemdup0 (void const *p, size_t s);
+char *xmemdup0 (void const *p, size_t s)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
 
 # ifdef __cplusplus
 }
diff --git a/lib/xreadlink.c b/lib/xreadlink.c
index 59cfde9..d9348b5 100644
--- a/lib/xreadlink.c
+++ b/lib/xreadlink.c
@@ -1,6 +1,6 @@
 /* xreadlink.c -- readlink wrapper to return the link name in malloc'd storage
 
-   Copyright (C) 2001, 2003-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2003-2007, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/xreadlink.h b/lib/xreadlink.h
index 583205b..fb7cea7 100644
--- a/lib/xreadlink.h
+++ b/lib/xreadlink.h
@@ -1,6 +1,6 @@
 /* Reading symbolic links without size limitation.
 
-   Copyright (C) 2001, 2003-2004, 2007, 2009-2019 Free Software Foundation,
+   Copyright (C) 2001, 2003-2004, 2007, 2009-2021 Free Software Foundation,
    Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -18,8 +18,12 @@
 
 /* Written by Jim Meyering <jim@meyering.net>  */
 
-extern char *xreadlink (char const *filename);
+#include <stdlib.h>
+
+extern char *xreadlink (char const *filename)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
 
 #if GNULIB_XREADLINKAT
-extern char *xreadlinkat (int fd, char const *filename);
+extern char *xreadlinkat (int fd, char const *filename)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
 #endif
diff --git a/lib/xsize.c b/lib/xsize.c
index 4b4914c..b3d73a2 100644
--- a/lib/xsize.c
+++ b/lib/xsize.c
@@ -1,3 +1,21 @@
+/* Checked size_t computations.
+
+   Copyright (C) 2012-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #include <config.h>
+
 #define XSIZE_INLINE _GL_EXTERN_INLINE
 #include "xsize.h"
diff --git a/lib/xsize.h b/lib/xsize.h
index ecfd478..91fa877 100644
--- a/lib/xsize.h
+++ b/lib/xsize.h
@@ -1,19 +1,19 @@
 /* xsize.h -- Checked size_t computations.
 
-   Copyright (C) 2003, 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _XSIZE_H
 #define _XSIZE_H
@@ -27,6 +27,9 @@
 # include <stdint.h>
 #endif
 
+/* Get ATTRIBUTE_PURE.  */
+#include "attribute.h"
+
 #ifndef _GL_INLINE_HEADER_BEGIN
  #error "Please include config.h first."
 #endif
@@ -56,10 +59,7 @@
   ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX)
 
 /* Sum of two sizes, with overflow check.  */
-XSIZE_INLINE size_t
-#if __GNUC__ >= 3
-__attribute__ ((__pure__))
-#endif
+XSIZE_INLINE size_t ATTRIBUTE_PURE
 xsum (size_t size1, size_t size2)
 {
   size_t sum = size1 + size2;
@@ -67,30 +67,21 @@
 }
 
 /* Sum of three sizes, with overflow check.  */
-XSIZE_INLINE size_t
-#if __GNUC__ >= 3
-__attribute__ ((__pure__))
-#endif
+XSIZE_INLINE size_t ATTRIBUTE_PURE
 xsum3 (size_t size1, size_t size2, size_t size3)
 {
   return xsum (xsum (size1, size2), size3);
 }
 
 /* Sum of four sizes, with overflow check.  */
-XSIZE_INLINE size_t
-#if __GNUC__ >= 3
-__attribute__ ((__pure__))
-#endif
+XSIZE_INLINE size_t ATTRIBUTE_PURE
 xsum4 (size_t size1, size_t size2, size_t size3, size_t size4)
 {
   return xsum (xsum (xsum (size1, size2), size3), size4);
 }
 
 /* Maximum of two sizes, with overflow check.  */
-XSIZE_INLINE size_t
-#if __GNUC__ >= 3
-__attribute__ ((__pure__))
-#endif
+XSIZE_INLINE size_t ATTRIBUTE_PURE
 xmax (size_t size1, size_t size2)
 {
   /* No explicit check is needed here, because for any n:
diff --git a/lib/xstrndup.c b/lib/xstrndup.c
index a973829..9cf22be 100644
--- a/lib/xstrndup.c
+++ b/lib/xstrndup.c
@@ -1,6 +1,6 @@
 /* Duplicate a bounded initial segment of a string, with out-of-memory
    checking.
-   Copyright (C) 2003, 2006-2007, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2006-2007, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
diff --git a/lib/xstrndup.h b/lib/xstrndup.h
index 360ccfd..dc4f6e2 100644
--- a/lib/xstrndup.h
+++ b/lib/xstrndup.h
@@ -1,6 +1,6 @@
 /* Duplicate a bounded initial segment of a string, with out-of-memory
    checking.
-   Copyright (C) 2003, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -15,9 +15,11 @@
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
-#include <stddef.h>
+#include <stdlib.h>
 
 /* Return a newly allocated copy of at most N bytes of STRING.
    In other words, return a copy of the initial segment of length N of
    STRING.  */
-extern char *xstrndup (const char *string, size_t n) _GL_ATTRIBUTE_MALLOC;
+extern char *xstrndup (const char *string, size_t n)
+  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+  _GL_ATTRIBUTE_RETURNS_NONNULL;
diff --git a/lib/xtime.c b/lib/xtime.c
index e608f69..1a7403e 100644
--- a/lib/xtime.c
+++ b/lib/xtime.c
@@ -1,3 +1,21 @@
+/* xtime -- extended-resolution integer timestamps
+
+   Copyright (C) 2012-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License,
+   or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
 #include <config.h>
+
 #define XTIME_INLINE _GL_EXTERN_INLINE
 #include "xtime.h"
diff --git a/lib/xtime.h b/lib/xtime.h
index 9edd123..40226bb 100644
--- a/lib/xtime.h
+++ b/lib/xtime.h
@@ -1,6 +1,6 @@
 /* xtime -- extended-resolution integer timestamps
 
-   Copyright (C) 2005-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2005-2006, 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -29,40 +29,27 @@
 #endif
 
 /* xtime_t is a signed type used for timestamps.  It is an integer
-   type that is a count of nanoseconds -- except for obsolescent hosts
-   without sufficiently-wide integers, where it is a count of
-   seconds.  */
-#if HAVE_LONG_LONG_INT
+   type that is a count of nanoseconds.  */
 typedef long long int xtime_t;
-# define XTIME_PRECISION 1000000000
-#else
-# include <limits.h>
-typedef long int xtime_t;
-# if LONG_MAX >> 31 >> 31 == 0
-#  define XTIME_PRECISION 1
-# else
-#  define XTIME_PRECISION 1000000000
-# endif
-#endif
+#define XTIME_PRECISION 1000000000
 
 #ifdef  __cplusplus
 extern "C" {
 #endif
 
 /* Return an extended time value that contains S seconds and NS
-   nanoseconds.  */
+   nanoseconds.  S and NS should be nonnegative; otherwise, integer
+   overflow can occur even if the result is in range.  */
 XTIME_INLINE xtime_t
 xtime_make (xtime_t s, long int ns)
 {
-  const long int giga = 1000 * 1000 * 1000;
-  s += ns / giga;
-  ns %= giga;
-  if (XTIME_PRECISION == 1)
-    return s;
-  else
-    return XTIME_PRECISION * s + ns;
+  return XTIME_PRECISION * s + ns;
 }
 
+/* The following functions split an extended time value:
+   T = XTIME_PRECISION * xtime_sec (T) + xtime_nsec (T)
+   with  0 <= xtime_nsec (T) < XTIME_PRECISION.  */
+
 /* Return the number of seconds in T, which must be nonnegative.  */
 XTIME_INLINE xtime_t
 xtime_nonnegative_sec (xtime_t t)
@@ -74,11 +61,7 @@
 XTIME_INLINE xtime_t
 xtime_sec (xtime_t t)
 {
-  return (XTIME_PRECISION == 1
-          ? t
-          : t < 0
-          ? (t + XTIME_PRECISION - 1) / XTIME_PRECISION - 1
-          : xtime_nonnegative_sec (t));
+  return (t + (t < 0)) / XTIME_PRECISION - (t < 0);
 }
 
 /* Return the number of nanoseconds in T, which must be nonnegative.  */
diff --git a/lib/yyerror.c b/lib/yyerror.c
index 4bd9e4b..9551868 100644
--- a/lib/yyerror.c
+++ b/lib/yyerror.c
@@ -1,6 +1,6 @@
 /* Yacc library error-printing function.
 
-   Copyright (C) 2002, 2009-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 2002, 2009-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
diff --git a/linux_glibc-lib/Android.bp b/linux_glibc-lib/Android.bp
index d689b61..d84edb1 100644
--- a/linux_glibc-lib/Android.bp
+++ b/linux_glibc-lib/Android.bp
@@ -23,6 +23,7 @@
                 "lib/c-ctype.c",
                 "lib/c-strcasecmp.c",
                 "lib/c-strncasecmp.c",
+                "lib/canonicalize.c",
                 "lib/careadlinkat.c",
                 "lib/cloexec.c",
                 "lib/close-stream.c",
@@ -32,29 +33,46 @@
                 "lib/dirname.c",
                 "lib/dup-safer-flag.c",
                 "lib/dup-safer.c",
+                "lib/execute.c",
                 "lib/exitfail.c",
                 "lib/fatal-signal.c",
                 "lib/fcntl.c",
                 "lib/fd-safer-flag.c",
                 "lib/fd-safer.c",
+                "lib/file-set.c",
+                "lib/findprog-in.c",
                 "lib/fopen-safer.c",
+                "lib/free.c",
                 "lib/fstrcmp.c",
                 "lib/get-errno.c",
                 "lib/gethrxtime.c",
                 "lib/getprogname.c",
                 "lib/gettime.c",
                 "lib/gl_array_list.c",
+                "lib/gl_hash_map.c",
+                "lib/gl_linked_list.c",
                 "lib/gl_list.c",
+                "lib/gl_map.c",
+                "lib/gl_oset.c",
+                "lib/gl_rbtree_oset.c",
+                "lib/gl_rbtreehash_list.c",
                 "lib/gl_xlist.c",
+                "lib/gl_xmap.c",
                 "lib/glthread/lock.c",
                 "lib/glthread/threadlib.c",
                 "lib/glthread/tls.c",
                 "lib/hard-locale.c",
+                "lib/hash-pjw.c",
+                "lib/hash-triple-simple.c",
                 "lib/hash.c",
-                "lib/isnand.c",
-                "lib/isnanf.c",
-                "lib/isnanl.c",
+                "lib/ialloc.c",
+                "lib/integer_length.c",
+                "lib/integer_length_l.c",
                 "lib/localcharset.c",
+                "lib/malloc/scratch_buffer_dupfree.c",
+                "lib/malloc/scratch_buffer_grow.c",
+                "lib/malloc/scratch_buffer_grow_preserve.c",
+                "lib/malloc/scratch_buffer_set_array_size.c",
                 "lib/math.c",
                 "lib/mbchar.c",
                 "lib/mbfile.c",
@@ -72,13 +90,34 @@
                 "lib/progname.c",
                 "lib/progreloc.c",
                 "lib/quotearg.c",
+                "lib/readline.c",
+                "lib/reallocarray.c",
                 "lib/relocatable.c",
+                "lib/setlocale_null.c",
                 "lib/sig-handler.c",
                 "lib/spawn-pipe.c",
+                "lib/spawn.c",
+                "lib/spawn_faction_addchdir.c",
+                "lib/spawn_faction_addclose.c",
+                "lib/spawn_faction_adddup2.c",
+                "lib/spawn_faction_addopen.c",
+                "lib/spawn_faction_destroy.c",
+                "lib/spawn_faction_init.c",
+                "lib/spawnattr_destroy.c",
+                "lib/spawnattr_init.c",
+                "lib/spawnattr_setflags.c",
+                "lib/spawnattr_setpgroup.c",
+                "lib/spawnattr_setsigmask.c",
+                "lib/spawni.c",
+                "lib/spawnp.c",
                 "lib/stripslash.c",
                 "lib/timespec.c",
                 "lib/timevar.c",
+                "lib/unicodeio.c",
                 "lib/unistd.c",
+                "lib/unistr/u8-mbtoucr.c",
+                "lib/unistr/u8-uctomb-aux.c",
+                "lib/unistr/u8-uctomb.c",
                 "lib/uniwidth/width.c",
                 "lib/vasnprintf.c",
                 "lib/wait-process.c",
@@ -109,22 +148,27 @@
                 "src/closure.c",
                 "src/complain.c",
                 "src/conflicts.c",
+                "src/counterexample.c",
+                "src/derivation.c",
                 "src/derives.c",
                 "src/files.c",
                 "src/fixits.c",
                 "src/getargs.c",
+                "src/glyphs.c",
                 "src/gram.c",
                 "src/graphviz.c",
                 "src/ielr.c",
                 "src/lalr.c",
                 "src/location.c",
                 "src/lr0.c",
+                "src/lssi.c",
                 "src/main.c",
                 "src/muscle-tab.c",
                 "src/named-ref.c",
                 "src/nullable.c",
                 "src/output.c",
                 "src/parse-gram.c",
+                "src/parse-simulation.c",
                 "src/print-graph.c",
                 "src/print-xml.c",
                 "src/print.c",
@@ -134,7 +178,9 @@
                 "src/scan-code-c.c",
                 "src/scan-gram-c.c",
                 "src/scan-skel-c.c",
+                "src/state-item.c",
                 "src/state.c",
+                "src/strversion.c",
                 "src/symlist.c",
                 "src/symtab.c",
                 "src/tables.c",
diff --git a/linux_glibc-lib/alloca.h b/linux_glibc-lib/alloca.h
index ec2c08e..181db57 100644
--- a/linux_glibc-lib/alloca.h
+++ b/linux_glibc-lib/alloca.h
@@ -1,23 +1,21 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Memory allocation on the stack.
 
-   Copyright (C) 1995, 1999, 2001-2004, 2006-2019 Free Software Foundation,
+   Copyright (C) 1995, 1999, 2001-2004, 2006-2021 Free Software Foundation,
    Inc.
 
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
-   License along with this program; if not, see
-   <https://www.gnu.org/licenses/>.
-  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
    means there is a real alloca function.  */
@@ -36,13 +34,16 @@
  */
 
 #ifndef alloca
-# ifdef __GNUC__
-   /* Some version of mingw have an <alloca.h> that causes trouble when
-      included after 'alloca' gets defined as a macro.  As a workaround, include
-      this <alloca.h> first and define 'alloca' as a macro afterwards.  */
-#  if (defined _WIN32 && ! defined __CYGWIN__) && 1
-#   include_next <alloca.h>
-#  endif
+  /* Some version of mingw have an <alloca.h> that causes trouble when
+     included after 'alloca' gets defined as a macro.  As a workaround,
+     include this <alloca.h> first and define 'alloca' as a macro afterwards
+     if needed.  */
+# if defined __GNUC__ && (defined _WIN32 && ! defined __CYGWIN__) && 1
+#  include_next <alloca.h>
+# endif
+#endif
+#ifndef alloca
+# if defined __GNUC__ || (__clang_major__ >= 4)
 #  define alloca __builtin_alloca
 # elif defined _AIX
 #  define alloca __alloca
diff --git a/linux_glibc-lib/config.h b/linux_glibc-lib/config.h
index 4f2d6a3..1862752 100644
--- a/linux_glibc-lib/config.h
+++ b/linux_glibc-lib/config.h
@@ -23,17 +23,9 @@
    non-IEEE-754 'long double' values. */
 #define CHECK_PRINTF_SAFE 1
 
-/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
-   systems. This function is required for `alloca.c' support on those systems.
-   */
-/* #undef CRAY_STACKSEG_END */
-
-/* Define to 1 if using `alloca.c'. */
+/* Define to 1 if using 'alloca.c'. */
 /* #undef C_ALLOCA */
 
-/* Define to 1 if the C locale may have encoding errors. */
-#define C_LOCALE_MAYBE_EILSEQ 1
-
 /* Define as the bit index in the word where to find bit 0 of the exponent of
    'double'. */
 #define DBL_EXPBIT0_BIT 20
@@ -47,9 +39,22 @@
 /* Define as the word index where to find the sign of 'double'. */
 /* #undef DBL_SIGNBIT_WORD */
 
+/* the name of the file descriptor member of DIR */
+/* #undef DIR_FD_MEMBER_NAME */
+
+#ifdef DIR_FD_MEMBER_NAME
+# define DIR_TO_FD(Dir_p) ((Dir_p)->DIR_FD_MEMBER_NAME)
+#else
+# define DIR_TO_FD(Dir_p) -1
+#endif
+
+
 /* Define to 1 if // is a file system root distinct from /. */
 /* #undef DOUBLE_SLASH_IS_DISTINCT_ROOT */
 
+/* Define if struct dirent has a member d_ino that actually works. */
+#define D_INO_IN_DIRENT 1
+
 /* Define to 1 if translation of program messages to the user's native
    language is requested. */
 /* #undef ENABLE_NLS */
@@ -77,17 +82,22 @@
 /* #undef FOPEN_TRAILING_SLASH_BUG */
 
 /* Define to 1 if realpath() can malloc memory, always gives an absolute path,
-   and handles trailing slash correctly. */
-#define FUNC_REALPATH_WORKS 1
+   and handles a trailing slash correctly. */
+/* #undef FUNC_REALPATH_NEARLY_WORKS */
 
-/* Define if gettimeofday clobbers the localtime buffer. */
-/* #undef GETTIMEOFDAY_CLOBBERS_LOCALTIME */
+/* Define to 1 if realpath() can malloc memory, always gives an absolute path,
+   and handles leading slashes and a trailing slash correctly. */
+#define FUNC_REALPATH_WORKS 1
 
 /* Define this to 'void' or 'struct timezone' to match the system's
    declaration of the second argument to gettimeofday. */
 #define GETTIMEOFDAY_TIMEZONE struct timezone
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module canonicalize shall be considered present. */
+#define GNULIB_CANONICALIZE 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module canonicalize-lgpl shall be considered present. */
 #define GNULIB_CANONICALIZE_LGPL 1
 
@@ -100,10 +110,18 @@
 #define GNULIB_DIRNAME 1
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module fdopendir shall be considered present. */
+/* #undef GNULIB_FDOPENDIR */
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module fd-safer-flag shall be considered present. */
 #define GNULIB_FD_SAFER_FLAG 1
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module fopen-gnu shall be considered present. */
+#define GNULIB_FOPEN_GNU 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module fopen-safer shall be considered present. */
 #define GNULIB_FOPEN_SAFER 1
 
@@ -112,18 +130,22 @@
 #define GNULIB_FSCANF 1
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module getcwd shall be considered present. */
+#define GNULIB_GETCWD 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module lock shall be considered present. */
 #define GNULIB_LOCK 1
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
-   whether the gnulib module malloc-gnu shall be considered present. */
-#define GNULIB_MALLOC_GNU 1
-
-/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module msvc-nothrow shall be considered present. */
 #define GNULIB_MSVC_NOTHROW 1
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module openat shall be considered present. */
+/* #undef GNULIB_OPENAT */
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module pipe2-safer shall be considered present. */
 #define GNULIB_PIPE2_SAFER 1
 
@@ -132,6 +154,10 @@
 /* #undef GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU */
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module reallocarray shall be considered present. */
+#define GNULIB_REALLOCARRAY 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module scanf shall be considered present. */
 #define GNULIB_SCANF 1
 
@@ -139,6 +165,14 @@
    whether the gnulib module snprintf shall be considered present. */
 #define GNULIB_SNPRINTF 1
 
+/* Define to 1 if you want the FILE stream functions getc, putc, etc. to use
+   unlocked I/O if available, throughout the package. Unlocked I/O can improve
+   performance, sometimes dramatically. But unlocked I/O is safe only in
+   single-threaded programs, as well as in multithreaded programs for which
+   you can guarantee that every FILE stream, including stdin, stdout, stderr,
+   is used only in a single thread. */
+#define GNULIB_STDIO_SINGLE_THREAD 1
+
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module strerror shall be considered present. */
 #define GNULIB_STRERROR 1
@@ -147,9 +181,15 @@
    whether the gnulib module strerror_r-posix shall be considered present. */
 /* #undef GNULIB_STRERROR_R_POSIX */
 
+/* Define to 1 when the gnulib module access should be tested. */
+#define GNULIB_TEST_ACCESS 1
+
 /* Define to 1 when the gnulib module calloc-posix should be tested. */
 #define GNULIB_TEST_CALLOC_POSIX 1
 
+/* Define to 1 when the gnulib module canonicalize should be tested. */
+#define GNULIB_TEST_CANONICALIZE 1
+
 /* Define to 1 when the gnulib module canonicalize_file_name should be tested.
    */
 #define GNULIB_TEST_CANONICALIZE_FILE_NAME 1
@@ -163,36 +203,102 @@
 /* Define to 1 when the gnulib module close should be tested. */
 #define GNULIB_TEST_CLOSE 1
 
+/* Define to 1 when the gnulib module closedir should be tested. */
+/* #undef GNULIB_TEST_CLOSEDIR */
+
+/* Define to 1 when the gnulib module dirfd should be tested. */
+/* #undef GNULIB_TEST_DIRFD */
+
+/* Define to 1 when the gnulib module dup should be tested. */
+/* #undef GNULIB_TEST_DUP */
+
 /* Define to 1 when the gnulib module dup2 should be tested. */
 #define GNULIB_TEST_DUP2 1
 
 /* Define to 1 when the gnulib module environ should be tested. */
 #define GNULIB_TEST_ENVIRON 1
 
+/* Define to 1 when the gnulib module fchdir should be tested. */
+/* #undef GNULIB_TEST_FCHDIR */
+
 /* Define to 1 when the gnulib module fcntl should be tested. */
 #define GNULIB_TEST_FCNTL 1
 
+/* Define to 1 when the gnulib module fdopendir should be tested. */
+/* #undef GNULIB_TEST_FDOPENDIR */
+
+/* Define to 1 when the gnulib module ffsl should be tested. */
+#define GNULIB_TEST_FFSL 1
+
+/* Define to 1 when the gnulib module fgetc should be tested. */
+#define GNULIB_TEST_FGETC 1
+
+/* Define to 1 when the gnulib module fgets should be tested. */
+#define GNULIB_TEST_FGETS 1
+
 /* Define to 1 when the gnulib module fopen should be tested. */
 #define GNULIB_TEST_FOPEN 1
 
+/* Define to 1 when the gnulib module fprintf should be tested. */
+#define GNULIB_TEST_FPRINTF 1
+
 /* Define to 1 when the gnulib module fprintf-posix should be tested. */
 #define GNULIB_TEST_FPRINTF_POSIX 1
 
+/* Define to 1 when the gnulib module fputc should be tested. */
+#define GNULIB_TEST_FPUTC 1
+
+/* Define to 1 when the gnulib module fputs should be tested. */
+#define GNULIB_TEST_FPUTS 1
+
+/* Define to 1 when the gnulib module fread should be tested. */
+#define GNULIB_TEST_FREAD 1
+
+/* Define to 1 when the gnulib module free-posix should be tested. */
+#define GNULIB_TEST_FREE_POSIX 1
+
 /* Define to 1 when the gnulib module frexp should be tested. */
 #define GNULIB_TEST_FREXP 1
 
 /* Define to 1 when the gnulib module frexpl should be tested. */
 #define GNULIB_TEST_FREXPL 1
 
+/* Define to 1 when the gnulib module fscanf should be tested. */
+#define GNULIB_TEST_FSCANF 1
+
 /* Define to 1 when the gnulib module fstat should be tested. */
 /* #undef GNULIB_TEST_FSTAT */
 
+/* Define to 1 when the gnulib module fstatat should be tested. */
+/* #undef GNULIB_TEST_FSTATAT */
+
 /* Define to 1 when the gnulib module fsync should be tested. */
 #define GNULIB_TEST_FSYNC 1
 
+/* Define to 1 when the gnulib module fwrite should be tested. */
+#define GNULIB_TEST_FWRITE 1
+
+/* Define to 1 when the gnulib module getc should be tested. */
+#define GNULIB_TEST_GETC 1
+
+/* Define to 1 when the gnulib module getchar should be tested. */
+#define GNULIB_TEST_GETCHAR 1
+
+/* Define to 1 when the gnulib module getcwd should be tested. */
+#define GNULIB_TEST_GETCWD 1
+
+/* Define to 1 when the gnulib module getdelim should be tested. */
+/* #undef GNULIB_TEST_GETDELIM */
+
 /* Define to 1 when the gnulib module getdtablesize should be tested. */
 #define GNULIB_TEST_GETDTABLESIZE 1
 
+/* Define to 1 when the gnulib module getline should be tested. */
+#define GNULIB_TEST_GETLINE 1
+
+/* Define to 1 when the gnulib module getopt-posix should be tested. */
+#define GNULIB_TEST_GETOPT_POSIX 1
+
 /* Define to 1 when the gnulib module getrusage should be tested. */
 #define GNULIB_TEST_GETRUSAGE 1
 
@@ -214,6 +320,12 @@
 /* Define to 1 when the gnulib module iswblank should be tested. */
 #define GNULIB_TEST_ISWBLANK 1
 
+/* Define to 1 when the gnulib module iswdigit should be tested. */
+#define GNULIB_TEST_ISWDIGIT 1
+
+/* Define to 1 when the gnulib module iswxdigit should be tested. */
+#define GNULIB_TEST_ISWXDIGIT 1
+
 /* Define to 1 when the gnulib module ldexpl should be tested. */
 #define GNULIB_TEST_LDEXPL 1
 
@@ -232,18 +344,36 @@
 /* Define to 1 when the gnulib module memchr should be tested. */
 #define GNULIB_TEST_MEMCHR 1
 
+/* Define to 1 when the gnulib module mempcpy should be tested. */
+#define GNULIB_TEST_MEMPCPY 1
+
+/* Define to 1 when the gnulib module memrchr should be tested. */
+/* #undef GNULIB_TEST_MEMRCHR */
+
 /* Define to 1 when the gnulib module obstack-printf should be tested. */
 #define GNULIB_TEST_OBSTACK_PRINTF 1
 
 /* Define to 1 when the gnulib module open should be tested. */
 #define GNULIB_TEST_OPEN 1
 
+/* Define to 1 when the gnulib module openat should be tested. */
+/* #undef GNULIB_TEST_OPENAT */
+
+/* Define to 1 when the gnulib module opendir should be tested. */
+/* #undef GNULIB_TEST_OPENDIR */
+
 /* Define to 1 when the gnulib module perror should be tested. */
 #define GNULIB_TEST_PERROR 1
 
+/* Define to 1 when the gnulib module pipe should be tested. */
+#define GNULIB_TEST_PIPE 1
+
 /* Define to 1 when the gnulib module pipe2 should be tested. */
 #define GNULIB_TEST_PIPE2 1
 
+/* Define to 1 when the gnulib module posix_spawn should be tested. */
+#define GNULIB_TEST_POSIX_SPAWN 1
+
 /* Define to 1 when the gnulib module posix_spawnattr_destroy should be
    tested. */
 #define GNULIB_TEST_POSIX_SPAWNATTR_DESTROY 1
@@ -256,6 +386,10 @@
    tested. */
 #define GNULIB_TEST_POSIX_SPAWNATTR_SETFLAGS 1
 
+/* Define to 1 when the gnulib module posix_spawnattr_setpgroup should be
+   tested. */
+#define GNULIB_TEST_POSIX_SPAWNATTR_SETPGROUP 1
+
 /* Define to 1 when the gnulib module posix_spawnattr_setsigmask should be
    tested. */
 #define GNULIB_TEST_POSIX_SPAWNATTR_SETSIGMASK 1
@@ -263,6 +397,10 @@
 /* Define to 1 when the gnulib module posix_spawnp should be tested. */
 #define GNULIB_TEST_POSIX_SPAWNP 1
 
+/* Define to 1 when the gnulib module posix_spawn_file_actions_addchdir should
+   be tested. */
+#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR 1
+
 /* Define to 1 when the gnulib module posix_spawn_file_actions_addclose should
    be tested. */
 #define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE 1
@@ -283,18 +421,36 @@
    tested. */
 #define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_INIT 1
 
+/* Define to 1 when the gnulib module printf should be tested. */
+#define GNULIB_TEST_PRINTF 1
+
 /* Define to 1 when the gnulib module printf-posix should be tested. */
 #define GNULIB_TEST_PRINTF_POSIX 1
 
+/* Define to 1 when the gnulib module putc should be tested. */
+#define GNULIB_TEST_PUTC 1
+
+/* Define to 1 when the gnulib module putchar should be tested. */
+#define GNULIB_TEST_PUTCHAR 1
+
+/* Define to 1 when the gnulib module puts should be tested. */
+#define GNULIB_TEST_PUTS 1
+
 /* Define to 1 when the gnulib module raise should be tested. */
 #define GNULIB_TEST_RAISE 1
 
 /* Define to 1 when the gnulib module rawmemchr should be tested. */
-/* #undef GNULIB_TEST_RAWMEMCHR */
+#define GNULIB_TEST_RAWMEMCHR 1
+
+/* Define to 1 when the gnulib module readdir should be tested. */
+/* #undef GNULIB_TEST_READDIR */
 
 /* Define to 1 when the gnulib module readlink should be tested. */
 #define GNULIB_TEST_READLINK 1
 
+/* Define to 1 when the gnulib module reallocarray should be tested. */
+#define GNULIB_TEST_REALLOCARRAY 1
+
 /* Define to 1 when the gnulib module realloc-posix should be tested. */
 #define GNULIB_TEST_REALLOC_POSIX 1
 
@@ -304,9 +460,18 @@
 /* Define to 1 when the gnulib module rename should be tested. */
 #define GNULIB_TEST_RENAME 1
 
+/* Define to 1 when the gnulib module rewinddir should be tested. */
+/* #undef GNULIB_TEST_REWINDDIR */
+
 /* Define to 1 when the gnulib module rmdir should be tested. */
 /* #undef GNULIB_TEST_RMDIR */
 
+/* Define to 1 when the gnulib module scanf should be tested. */
+#define GNULIB_TEST_SCANF 1
+
+/* Define to 1 when the gnulib module setlocale_null should be tested. */
+#define GNULIB_TEST_SETLOCALE_NULL 1
+
 /* Define to 1 when the gnulib module sigaction should be tested. */
 #define GNULIB_TEST_SIGACTION 1
 
@@ -323,13 +488,16 @@
 #define GNULIB_TEST_SPRINTF_POSIX 1
 
 /* Define to 1 when the gnulib module stat should be tested. */
-/* #undef GNULIB_TEST_STAT */
+#define GNULIB_TEST_STAT 1
 
 /* Define to 1 when the gnulib module stpcpy should be tested. */
 #define GNULIB_TEST_STPCPY 1
 
+/* Define to 1 when the gnulib module stpncpy should be tested. */
+#define GNULIB_TEST_STPNCPY 1
+
 /* Define to 1 when the gnulib module strchrnul should be tested. */
-/* #undef GNULIB_TEST_STRCHRNUL */
+#define GNULIB_TEST_STRCHRNUL 1
 
 /* Define to 1 when the gnulib module strdup should be tested. */
 #define GNULIB_TEST_STRDUP 1
@@ -346,6 +514,9 @@
 /* Define to 1 when the gnulib module strnlen should be tested. */
 /* #undef GNULIB_TEST_STRNLEN */
 
+/* Define to 1 when the gnulib module strtod should be tested. */
+#define GNULIB_TEST_STRTOD 1
+
 /* Define to 1 when the gnulib module strverscmp should be tested. */
 #define GNULIB_TEST_STRVERSCMP 1
 
@@ -358,9 +529,15 @@
 /* Define to 1 when the gnulib module vasprintf should be tested. */
 #define GNULIB_TEST_VASPRINTF 1
 
+/* Define to 1 when the gnulib module vfprintf should be tested. */
+#define GNULIB_TEST_VFPRINTF 1
+
 /* Define to 1 when the gnulib module vfprintf-posix should be tested. */
 /* #undef GNULIB_TEST_VFPRINTF_POSIX */
 
+/* Define to 1 when the gnulib module vprintf should be tested. */
+#define GNULIB_TEST_VPRINTF 1
+
 /* Define to 1 when the gnulib module vsnprintf should be tested. */
 #define GNULIB_TEST_VSNPRINTF 1
 
@@ -373,6 +550,26 @@
 /* Define to 1 when the gnulib module wcwidth should be tested. */
 #define GNULIB_TEST_WCWIDTH 1
 
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module unistr/u8-mbtoucr shall be considered present. */
+#define GNULIB_UNISTR_U8_MBTOUCR 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module unistr/u8-uctomb shall be considered present. */
+#define GNULIB_UNISTR_U8_UCTOMB 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module vfprintf-posix shall be considered present. */
+/* #undef GNULIB_VFPRINTF_POSIX */
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module xalloc shall be considered present. */
+#define GNULIB_XALLOC 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module xalloc-die shall be considered present. */
+#define GNULIB_XALLOC_DIE 1
+
 /* Define if your system defines TIOCGWINSZ in sys/ioctl.h. */
 #define GWINSZ_IN_SYS_IOCTL 1
 
@@ -380,8 +577,7 @@
    may be supplied by this distribution. */
 #define HAVE_ALLOCA 1
 
-/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
-   */
+/* Define to 1 if <alloca.h> works. */
 #define HAVE_ALLOCA_H 1
 
 /* Define if you have an arithmetic hrtime_t type. */
@@ -390,9 +586,6 @@
 /* Define to 1 if you have the <bp-sym.h> header file. */
 /* #undef HAVE_BP_SYM_H */
 
-/* Define if the 'calloc' function is POSIX compliant. */
-#define HAVE_CALLOC_POSIX 1
-
 /* Define to 1 if you have the `canonicalize_file_name' function. */
 #define HAVE_CANONICALIZE_FILE_NAME 1
 
@@ -413,8 +606,11 @@
 /* Define to 1 if you have the `clock_settime' function. */
 #define HAVE_CLOCK_SETTIME 1
 
+/* Define to 1 if you have the `closedir' function. */
+/* #undef HAVE_CLOSEDIR */
+
 /* Define to 1 if you have the `confstr' function. */
-/* #undef HAVE_CONFSTR */
+#define HAVE_CONFSTR 1
 
 /* Define if the copysignf function is declared in <math.h> and available in
    libc. */
@@ -458,6 +654,34 @@
    don't. */
 /* #undef HAVE_DECL_COPYSIGNL */
 
+/* Define to 1 if you have the declaration of `dirfd', and to 0 if you don't.
+   */
+/* #undef HAVE_DECL_DIRFD */
+
+/* Define to 1 if you have the declaration of `ecvt', and to 0 if you don't.
+   */
+#define HAVE_DECL_ECVT 1
+
+/* Define to 1 if you have the declaration of `execvpe', and to 0 if you
+   don't. */
+#define HAVE_DECL_EXECVPE 1
+
+/* Define to 1 if you have the declaration of `fchdir', and to 0 if you don't.
+   */
+#define HAVE_DECL_FCHDIR 1
+
+/* Define to 1 if you have the declaration of `fcloseall', and to 0 if you
+   don't. */
+#define HAVE_DECL_FCLOSEALL 1
+
+/* Define to 1 if you have the declaration of `fcvt', and to 0 if you don't.
+   */
+#define HAVE_DECL_FCVT 1
+
+/* Define to 1 if you have the declaration of `fdopendir', and to 0 if you
+   don't. */
+/* #undef HAVE_DECL_FDOPENDIR */
+
 /* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you
    don't. */
 #define HAVE_DECL_FEOF_UNLOCKED 1
@@ -490,14 +714,26 @@
    you don't. */
 #define HAVE_DECL_FWRITE_UNLOCKED 1
 
+/* Define to 1 if you have the declaration of `gcvt', and to 0 if you don't.
+   */
+#define HAVE_DECL_GCVT 1
+
 /* Define to 1 if you have the declaration of `getchar_unlocked', and to 0 if
    you don't. */
 #define HAVE_DECL_GETCHAR_UNLOCKED 1
 
+/* Define to 1 if you have the declaration of `getcwd', and to 0 if you don't.
+   */
+#define HAVE_DECL_GETCWD 1
+
 /* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you
    don't. */
 #define HAVE_DECL_GETC_UNLOCKED 1
 
+/* Define to 1 if you have the declaration of `getdelim', and to 0 if you
+   don't. */
+#define HAVE_DECL_GETDELIM 1
+
 /* Define to 1 if you have the declaration of `getdtablesize', and to 0 if you
    don't. */
 #define HAVE_DECL_GETDTABLESIZE 1
@@ -506,6 +742,10 @@
    don't. */
 #define HAVE_DECL_GETHRTIME 0
 
+/* Define to 1 if you have the declaration of `getline', and to 0 if you
+   don't. */
+#define HAVE_DECL_GETLINE 1
+
 /* Define to 1 if you have the declaration of `iswblank', and to 0 if you
    don't. */
 #define HAVE_DECL_ISWBLANK 1
@@ -522,10 +762,18 @@
    otherwise. */
 #define HAVE_DECL_MBSWIDTH_IN_WCHAR_H 0
 
+/* Define to 1 if you have the declaration of `memrchr', and to 0 if you
+   don't. */
+#define HAVE_DECL_MEMRCHR 1
+
 /* Define to 1 if you have the declaration of `obstack_printf', and to 0 if
    you don't. */
 #define HAVE_DECL_OBSTACK_PRINTF 1
 
+/* Define to 1 if you have the declaration of `posix_spawn', and to 0 if you
+   don't. */
+#define HAVE_DECL_POSIX_SPAWN 1
+
 /* Define to 1 if you have the declaration of `program_invocation_name', and
    to 0 if you don't. */
 #define HAVE_DECL_PROGRAM_INVOCATION_NAME 1
@@ -550,6 +798,10 @@
    don't. */
 #define HAVE_DECL_SNPRINTF 1
 
+/* Define to 1 if you have the declaration of `stpncpy', and to 0 if you
+   don't. */
+#define HAVE_DECL_STPNCPY 1
+
 /* Define to 1 if you have the declaration of `strdup', and to 0 if you don't.
    */
 #define HAVE_DECL_STRDUP 1
@@ -578,6 +830,10 @@
    don't. */
 #define HAVE_DECL_VSNPRINTF 1
 
+/* Define to 1 if you have the declaration of `wcsdup', and to 0 if you don't.
+   */
+#define HAVE_DECL_WCSDUP 1
+
 /* Define to 1 if you have the declaration of `wcwidth', and to 0 if you
    don't. */
 #define HAVE_DECL_WCWIDTH 1
@@ -594,30 +850,64 @@
    don't. */
 #define HAVE_DECL___FPENDING 1
 
-/* Define to 1 if you have the 'dup2' function. */
-#define HAVE_DUP2 1
+/* Define to 1 if you have the <dirent.h> header file. */
+#define HAVE_DIRENT_H 1
+
+/* Define to 1 if you have the `dirfd' function. */
+/* #undef HAVE_DIRFD */
 
 /* Define if you have the declaration of environ. */
 #define HAVE_ENVIRON_DECL 1
 
+/* Define to 1 if you have the `faccessat' function. */
+#define HAVE_FACCESSAT 1
+
+/* Define to 1 if you have the `fchdir' function. */
+#define HAVE_FCHDIR 1
+
 /* Define to 1 if you have the `fcntl' function. */
 #define HAVE_FCNTL 1
 
+/* Define to 1 if you have the `fdopendir' function. */
+#define HAVE_FDOPENDIR 1
+
 /* Define to 1 if you have the <features.h> header file. */
 #define HAVE_FEATURES_H 1
 
+/* Define to 1 if you have the `ffsl' function. */
+#define HAVE_FFSL 1
+
+/* Define to 1 if you have the `flockfile' function. */
+/* #undef HAVE_FLOCKFILE */
+
+/* Define if the 'free' function is guaranteed to preserve errno. */
+/* #undef HAVE_FREE_POSIX */
+
 /* Define if the frexpl function is available in libc. */
 #define HAVE_FREXPL_IN_LIBC 1
 
 /* Define if the frexp function is available in libc. */
 #define HAVE_FREXP_IN_LIBC 1
 
+/* Define to 1 if you have the `fstatat' function. */
+#define HAVE_FSTATAT 1
+
 /* Define to 1 if you have the `fsync' function. */
 #define HAVE_FSYNC 1
 
+/* Define to 1 if you have the `funlockfile' function. */
+/* #undef HAVE_FUNLOCKFILE */
+
 /* Define to 1 if you have the `getcwd' function. */
 #define HAVE_GETCWD 1
 
+/* Define to 1 if getcwd works, but with shorter paths than is generally
+   tested with the replacement. */
+/* #undef HAVE_GETCWD_SHORTER */
+
+/* Define to 1 if you have the `getdelim' function. */
+#define HAVE_GETDELIM 1
+
 /* Define to 1 if you have the `getdtablesize' function. */
 #define HAVE_GETDTABLESIZE 1
 
@@ -630,6 +920,9 @@
 /* Define to 1 if you have the `getopt_long_only' function. */
 #define HAVE_GETOPT_LONG_ONLY 1
 
+/* Define to 1 if the system has the 'getpagesize' function. */
+#define HAVE_GETPAGESIZE 1
+
 /* Define to 1 if you have the `getprogname' function. */
 /* #undef HAVE_GETPROGNAME */
 
@@ -643,7 +936,15 @@
 #define HAVE_GETTIMEOFDAY 1
 
 /* Define if you have the iconv() function and it works. */
-/* #undef HAVE_ICONV */
+#define HAVE_ICONV 1
+
+/* Define to 1 if you have the <iconv.h> header file. */
+#define HAVE_ICONV_H 1
+
+/* Define to 1 if the compiler supports one of the keywords 'inline',
+   '__inline__', '__inline' and effectively inlines functions marked as such.
+   */
+/* #undef HAVE_INLINE */
 
 /* Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>. */
 #define HAVE_INTMAX_T 1
@@ -665,7 +966,7 @@
 /* #undef HAVE_ISNANF_IN_LIBC */
 
 /* Define if the isnan(long double) function is available in libc. */
-/* #undef HAVE_ISNANL_IN_LIBC */
+#define HAVE_ISNANL_IN_LIBC 1
 
 /* Define to 1 if you have the `iswblank' function. */
 #define HAVE_ISWBLANK 1
@@ -706,11 +1007,7 @@
 /* Define to 1 if you have the <mach-o/dyld.h> header file. */
 /* #undef HAVE_MACH_O_DYLD_H */
 
-/* Define to 1 if your system has a GNU libc compatible 'malloc' function, and
-   to 0 otherwise. */
-#define HAVE_MALLOC_GNU 1
-
-/* Define if the 'malloc' function is POSIX compliant. */
+/* Define if malloc, realloc, and calloc set errno on allocation failure. */
 #define HAVE_MALLOC_POSIX 1
 
 /* Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including
@@ -729,12 +1026,22 @@
 /* Define to 1 if <wchar.h> declares mbstate_t. */
 #define HAVE_MBSTATE_T 1
 
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
+/* Define to 1 if you have the `mempcpy' function. */
+#define HAVE_MEMPCPY 1
+
+/* Define to 1 if you have the `memrchr' function. */
+/* #undef HAVE_MEMRCHR */
 
 /* Define to 1 if you have the `microuptime' function. */
 /* #undef HAVE_MICROUPTIME */
 
+/* Define to 1 if getcwd minimally works, that is, its result can be trusted
+   when it succeeds. */
+#define HAVE_MINIMALLY_WORKING_GETCWD 1
+
+/* Define to 1 if you have the <minix/config.h> header file. */
+/* #undef HAVE_MINIX_CONFIG_H */
+
 /* Define to 1 if <limits.h> defines the MIN and MAX macros. */
 /* #undef HAVE_MINMAX_IN_LIMITS_H */
 
@@ -760,8 +1067,18 @@
 /* Define to 1 if you have the `obstack_printf' function. */
 #define HAVE_OBSTACK_PRINTF 1
 
+/* Define to 1 if you have the `openat' function. */
+#define HAVE_OPENAT 1
+
+/* Define to 1 if you have the `opendir' function. */
+/* #undef HAVE_OPENDIR */
+
+/* Define to 1 if getcwd works, except it sometimes fails when it shouldn't,
+   setting errno to ERANGE, ENAMETOOLONG, or ENOENT. */
+/* #undef HAVE_PARTLY_WORKING_GETCWD */
+
 /* Define to 1 if you have the <paths.h> header file. */
-/* #undef HAVE_PATHS_H */
+#define HAVE_PATHS_H 1
 
 /* Define to 1 if you have the `pipe' function. */
 #define HAVE_PIPE 1
@@ -775,9 +1092,20 @@
 /* Define to 1 if the system has the type `posix_spawnattr_t'. */
 #define HAVE_POSIX_SPAWNATTR_T 1
 
+/* Define to 1 if you have the `posix_spawn_file_actions_addchdir' function.
+   */
+/* #undef HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR */
+
+/* Define to 1 if you have the `posix_spawn_file_actions_addchdir_np'
+   function. */
+/* #undef HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR_NP */
+
 /* Define to 1 if the system has the type `posix_spawn_file_actions_t'. */
 #define HAVE_POSIX_SPAWN_FILE_ACTIONS_T 1
 
+/* Define if you have the <pthread.h> header and the POSIX threads API. */
+#define HAVE_PTHREAD_API 1
+
 /* Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE. */
 #define HAVE_PTHREAD_MUTEX_RECURSIVE 1
 
@@ -792,7 +1120,19 @@
 #define HAVE_RAISE 1
 
 /* Define to 1 if you have the `rawmemchr' function. */
-/* #undef HAVE_RAWMEMCHR */
+#define HAVE_RAWMEMCHR 1
+
+/* Define to 1 if you have the `readdir' function. */
+/* #undef HAVE_READDIR */
+
+/* Define if you have the readline library. */
+/* #undef HAVE_READLINE */
+
+/* Define to 1 if you have the <readline/history.h> header file. */
+/* #undef HAVE_READLINE_HISTORY_H */
+
+/* Define to 1 if you have the <readline/readline.h> header file. */
+/* #undef HAVE_READLINE_READLINE_H */
 
 /* Define to 1 if you have the `readlink' function. */
 #define HAVE_READLINK 1
@@ -800,12 +1140,15 @@
 /* Define to 1 if you have the `readlinkat' function. */
 #define HAVE_READLINKAT 1
 
-/* Define if the 'realloc' function is POSIX compliant. */
-#define HAVE_REALLOC_POSIX 1
+/* Define to 1 if you have the `reallocarray' function. */
+/* #undef HAVE_REALLOCARRAY */
 
 /* Define to 1 if you have the `realpath' function. */
 #define HAVE_REALPATH 1
 
+/* Define to 1 if you have the `rewinddir' function. */
+/* #undef HAVE_REWINDDIR */
+
 /* Define to 1 if 'long double' and 'double' have the same representation. */
 /* #undef HAVE_SAME_LONG_DOUBLE_AS_DOUBLE */
 
@@ -813,10 +1156,13 @@
 #define HAVE_SCHED_H 1
 
 /* Define to 1 if you have the `sched_setparam' function. */
-/* #undef HAVE_SCHED_SETPARAM */
+#define HAVE_SCHED_SETPARAM 1
 
 /* Define to 1 if you have the `sched_setscheduler' function. */
-/* #undef HAVE_SCHED_SETSCHEDULER */
+#define HAVE_SCHED_SETSCHEDULER 1
+
+/* Define to 1 if you have the <sdkddkver.h> header file. */
+/* #undef HAVE_SDKDDKVER_H */
 
 /* Define to 1 if you have the <search.h> header file. */
 #define HAVE_SEARCH_H 1
@@ -825,13 +1171,13 @@
 /* #undef HAVE_SETDTABLESIZE */
 
 /* Define to 1 if you have the `setegid' function. */
-/* #undef HAVE_SETEGID */
+#define HAVE_SETEGID 1
 
 /* Define to 1 if you have the `setenv' function. */
 #define HAVE_SETENV 1
 
 /* Define to 1 if you have the `seteuid' function. */
-/* #undef HAVE_SETEUID */
+#define HAVE_SETEUID 1
 
 /* Define to 1 if you have the `setlocale' function. */
 #define HAVE_SETLOCALE 1
@@ -871,6 +1217,10 @@
    buffer had been large enough. */
 #define HAVE_SNPRINTF_RETVAL_C99 1
 
+/* Define if the string produced by the snprintf function is always NUL
+   terminated. */
+#define HAVE_SNPRINTF_TRUNCATION_C99 1
+
 /* Define to 1 if you have the <spawn.h> header file. */
 #define HAVE_SPAWN_H 1
 
@@ -884,17 +1234,20 @@
 /* Define to 1 if you have the <stdio_ext.h> header file. */
 #define HAVE_STDIO_EXT_H 1
 
+/* Define to 1 if you have the <stdio.h> header file. */
+#define HAVE_STDIO_H 1
+
 /* Define to 1 if you have the <stdlib.h> header file. */
 #define HAVE_STDLIB_H 1
 
 /* Define to 1 if you have the `stpcpy' function. */
 #define HAVE_STPCPY 1
 
-/* Define to 1 if you have the `strchrnul' function. */
-/* #undef HAVE_STRCHRNUL */
+/* Define if you have the stpncpy() function and it works. */
+#define HAVE_STPNCPY 1
 
-/* Define to 1 if you have the `strdup' function. */
-#define HAVE_STRDUP 1
+/* Define to 1 if you have the `strchrnul' function. */
+#define HAVE_STRCHRNUL 1
 
 /* Define to 1 if you have the `strerror_r' function. */
 #define HAVE_STRERROR_R 1
@@ -953,6 +1306,9 @@
 /* Define to 1 if you have the <sys/inttypes.h> header file. */
 /* #undef HAVE_SYS_INTTYPES_H */
 
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#define HAVE_SYS_IOCTL_H 1
+
 /* Define to 1 if you have the <sys/mman.h> header file. */
 #define HAVE_SYS_MMAN_H 1
 
@@ -962,6 +1318,9 @@
 /* Define to 1 if you have the <sys/resource.h> header file. */
 #define HAVE_SYS_RESOURCE_H 1
 
+/* Define to 1 if you have the <sys/single_threaded.h> header file. */
+/* #undef HAVE_SYS_SINGLE_THREADED_H */
+
 /* Define to 1 if you have the <sys/socket.h> header file. */
 #define HAVE_SYS_SOCKET_H 1
 
@@ -983,6 +1342,12 @@
 /* Define to 1 if you have the `tcdrain' function. */
 #define HAVE_TCDRAIN 1
 
+/* Define to 1 if you have the <termios.h> header file. */
+#define HAVE_TERMIOS_H 1
+
+/* Define to 1 if you have the `thrd_create' function. */
+/* #undef HAVE_THRD_CREATE */
+
 /* Define to 1 if you have the <threads.h> header file. */
 /* #undef HAVE_THREADS_H */
 
@@ -1011,7 +1376,11 @@
 #define HAVE_VASPRINTF 1
 
 /* Define to 1 if you have the `vfork' function. */
-/* #undef HAVE_VFORK */
+#define HAVE_VFORK 1
+
+/* Define to 1 or 0, depending whether the compiler supports simple visibility
+   declarations. */
+/* #undef HAVE_VISIBILITY */
 
 /* Define to 1 if you have the `vsnprintf' function. */
 #define HAVE_VSNPRINTF 1
@@ -1040,18 +1409,29 @@
 /* Define to 1 if you have the `wcwidth' function. */
 #define HAVE_WCWIDTH 1
 
+/* Define to 1 if the compiler and linker support weak declarations of
+   symbols. */
+#define HAVE_WEAK_SYMBOLS 1
+
 /* Define to 1 if you have the <winsock2.h> header file. */
 /* #undef HAVE_WINSOCK2_H */
 
 /* Define if you have the 'wint_t' type. */
 #define HAVE_WINT_T 1
 
+/* Define to 1 if fstatat (..., 0) works. For example, it does not work in AIX
+   7.1. */
+/* #undef HAVE_WORKING_FSTATAT_ZERO_FLAG */
+
 /* Define to 1 if O_NOATIME works. */
 #define HAVE_WORKING_O_NOATIME 1
 
 /* Define to 1 if O_NOFOLLOW works. */
 #define HAVE_WORKING_O_NOFOLLOW 1
 
+/* Define to 1 if you have the <xlocale.h> header file. */
+#define HAVE_XLOCALE_H 1
+
 /* Define to 1 if the system has the type `_Bool'. */
 #define HAVE__BOOL 1
 
@@ -1061,24 +1441,41 @@
 /* Define to 1 if you have the `_set_invalid_parameter_handler' function. */
 /* #undef HAVE__SET_INVALID_PARAMETER_HANDLER */
 
+/* Define to 1 if the compiler supports __builtin_expect,
+   and to 2 if <builtins.h> does.  */
+#define HAVE___BUILTIN_EXPECT 1
+#ifndef HAVE___BUILTIN_EXPECT
+# define __builtin_expect(e, c) (e)
+#elif HAVE___BUILTIN_EXPECT == 2
+# include <builtins.h>
+#endif
+    
+
 /* Define to 1 if you have the `__fseterr' function. */
 /* #undef HAVE___FSETERR */
 
 /* Define to 1 if the compiler supports the keyword '__inline'. */
-/* #undef HAVE___INLINE */
+#define HAVE___INLINE 1
 
 /* Define to 1 if you have the `__xpg_strerror_r' function. */
 #define HAVE___XPG_STRERROR_R 1
 
+/* Define as const if the declaration of iconv() needs const. */
+#define ICONV_CONST 
+
+/* Define to a symbolic name denoting the flavor of iconv_open()
+   implementation. */
+/* #undef ICONV_FLAVOR */
+
 /* Define to the value of ${prefix}, as a string. */
 #define INSTALLPREFIX "/nonexistent"
 
 /* Define as the bit index in the word where to find bit 0 of the exponent of
    'long double'. */
-#define LDBL_EXPBIT0_BIT 0
+/* #undef LDBL_EXPBIT0_BIT */
 
 /* Define as the word index where to find the exponent of 'long double'. */
-#define LDBL_EXPBIT0_WORD 2
+/* #undef LDBL_EXPBIT0_WORD */
 
 /* Define as the bit index in the word where to find the sign of 'long
    double'. */
@@ -1107,6 +1504,10 @@
    */
 /* #undef MBRTOWC_EMPTY_INPUT_BUG */
 
+/* Define if the mbrtowc function may signal encoding errors in the C locale.
+   */
+#define MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ 1
+
 /* Define if the mbrtowc function has the NULL pwc argument bug. */
 /* #undef MBRTOWC_NULL_ARG1_BUG */
 
@@ -1119,12 +1520,19 @@
 /* Define if the mbrtowc function returns a wrong return value. */
 /* #undef MBRTOWC_RETVAL_BUG */
 
+/* Define if the mbrtowc function stores a wide character when reporting
+   incomplete input. */
+/* #undef MBRTOWC_STORES_INCOMPLETE_BUG */
+
 /* Use GNU style printf and scanf.  */
 #ifndef __USE_MINGW_ANSI_STDIO
 # define __USE_MINGW_ANSI_STDIO 1
 #endif
 
 
+/* Define to 1 on musl libc. */
+/* #undef MUSL_LIBC */
+
 /* Define to 1 if assertions should be disabled. */
 /* #undef NDEBUG */
 
@@ -1186,25 +1594,22 @@
 #define PACKAGE_BUGREPORT "bug-bison@gnu.org"
 
 /* The copyright year for this package */
-#define PACKAGE_COPYRIGHT_YEAR 2019
+#define PACKAGE_COPYRIGHT_YEAR 2021
 
 /* Define to the full name of this package. */
 #define PACKAGE_NAME "GNU Bison"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "GNU Bison 3.5"
+#define PACKAGE_STRING "GNU Bison 3.8.2"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "bison"
 
 /* Define to the home page for this package. */
-#define PACKAGE_URL "http://www.gnu.org/software/bison/"
+#define PACKAGE_URL "https://www.gnu.org/software/bison/"
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "3.5"
-
-/* Define if <inttypes.h> exists and defines unusable PRI* macros. */
-/* #undef PRI_MACROS_BROKEN */
+#define PACKAGE_VERSION "3.8.2"
 
 /* Define to the type that is the result of default argument promotions of
    type mode_t. */
@@ -1220,6 +1625,10 @@
 /* Define to 1 if readlink fails to recognize a trailing slash. */
 /* #undef READLINK_TRAILING_SLASH_BUG */
 
+/* Define to 1 if readlink sets errno instead of truncating a too-long link.
+   */
+/* #undef READLINK_TRUNCATE_BUG */
+
 /* Define if rename does not work when the destination file exists, as on
    Cygwin 1.5 or Windows. */
 /* #undef RENAME_DEST_EXISTS_BUG */
@@ -1236,6 +1645,12 @@
    such as on Solaris 9 or cygwin 1.5. */
 /* #undef RENAME_TRAILING_SLASH_SOURCE_BUG */
 
+/* Define to 1 if gnulib's dirfd() replacement is used. */
+/* #undef REPLACE_DIRFD */
+
+/* Define to 1 if gnulib's fchdir() replacement is used. */
+/* #undef REPLACE_FCHDIR */
+
 /* Define if fprintf is overridden by a POSIX compliant gnulib implementation.
    */
 /* #undef REPLACE_FPRINTF_POSIX */
@@ -1244,8 +1659,12 @@
    slash */
 /* #undef REPLACE_FUNC_STAT_FILE */
 
+/* Define to 1 if open() should work around the inability to open a directory.
+   */
+/* #undef REPLACE_OPEN_DIRECTORY */
+
 /* Define if gnulib uses its own posix_spawn and posix_spawnp functions. */
-/* #undef REPLACE_POSIX_SPAWN */
+#define REPLACE_POSIX_SPAWN 1
 
 /* Define if printf is overridden by a POSIX compliant gnulib implementation.
    */
@@ -1261,9 +1680,17 @@
    implementation. */
 /* #undef REPLACE_VFPRINTF_POSIX */
 
+/* Define to 1 if setlocale (LC_ALL, NULL) is multithread-safe. */
+#define SETLOCALE_NULL_ALL_MTSAFE 1
+
+/* Define to 1 if setlocale (category, NULL) is multithread-safe. */
+#define SETLOCALE_NULL_ONE_MTSAFE 1
+
 /* File name of the Bourne shell.  */
-#if defined __CYGWIN__ || defined __ANDROID__
+#if (defined _WIN32 && !defined __CYGWIN__) || defined __CYGWIN__ || defined __ANDROID__
 /* Omit the directory part because
+   - For native Windows programs in a Cygwin environment, the Cygwin mounts
+     are not visible.
    - For 32-bit Cygwin programs in a 64-bit Cygwin environment, the Cygwin
      mounts are not visible.
    - On Android, /bin/sh does not exist. It's /system/bin/sh instead.  */
@@ -1297,7 +1724,9 @@
 /* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
 /* #undef STAT_MACROS_BROKEN */
 
-/* Define to 1 if you have the ANSI C header files. */
+/* Define to 1 if all of the C90 standard headers exist (not just the ones
+   required in a freestanding environment). This macro is provided for
+   backward compatibility; new code need not use it. */
 #define STDC_HEADERS 1
 
 /* Define to 1 if strerror_r returns char *. */
@@ -1324,6 +1753,10 @@
 /* Define if the POSIX multithreading library can be used. */
 #define USE_POSIX_THREADS 1
 
+/* Define if references to the POSIX multithreading library are satisfied by
+   libc. */
+/* #undef USE_POSIX_THREADS_FROM_LIBC */
+
 /* Define if references to the POSIX multithreading library should be made
    weak. */
 #define USE_POSIX_THREADS_WEAK 1
@@ -1336,19 +1769,44 @@
 #ifndef _DARWIN_C_SOURCE
 # define _DARWIN_C_SOURCE 1
 #endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# define __EXTENSIONS__ 1
+#endif
 /* Enable GNU extensions on systems that have them.  */
 #ifndef _GNU_SOURCE
 # define _GNU_SOURCE 1
 #endif
-/* Enable NetBSD extensions on NetBSD.  */
+/* Enable X/Open compliant socket functions that do not require linking
+   with -lxnet on HP-UX 11.11.  */
+#ifndef _HPUX_ALT_XOPEN_SOCKET_API
+# define _HPUX_ALT_XOPEN_SOCKET_API 1
+#endif
+/* Identify the host operating system as Minix.
+   This macro does not affect the system headers' behavior.
+   A future release of Autoconf may stop defining this macro.  */
+#ifndef _MINIX
+/* # undef _MINIX */
+#endif
+/* Enable general extensions on NetBSD.
+   Enable NetBSD compatibility extensions on Minix.  */
 #ifndef _NETBSD_SOURCE
 # define _NETBSD_SOURCE 1
 #endif
-/* Enable OpenBSD extensions on NetBSD.  */
+/* Enable OpenBSD compatibility extensions on NetBSD.
+   Oddly enough, this does nothing on OpenBSD.  */
 #ifndef _OPENBSD_SOURCE
 # define _OPENBSD_SOURCE 1
 #endif
-/* Enable threading extensions on Solaris.  */
+/* Define to 1 if needed for POSIX-compatible behavior.  */
+#ifndef _POSIX_SOURCE
+/* # undef _POSIX_SOURCE */
+#endif
+/* Define to 2 if needed for POSIX-compatible behavior.  */
+#ifndef _POSIX_1_SOURCE
+/* # undef _POSIX_1_SOURCE */
+#endif
+/* Enable POSIX-compatible threading on Solaris.  */
 #ifndef _POSIX_PTHREAD_SEMANTICS
 # define _POSIX_PTHREAD_SEMANTICS 1
 #endif
@@ -1384,33 +1842,21 @@
 #ifndef _TANDEM_SOURCE
 # define _TANDEM_SOURCE 1
 #endif
-/* Enable X/Open extensions if necessary.  HP-UX 11.11 defines
-   mbstate_t only if _XOPEN_SOURCE is defined to 500, regardless of
-   whether compiling with -Ae or -D_HPUX_SOURCE=1.  */
+/* Enable X/Open extensions.  Define to 500 only if necessary
+   to make mbstate_t available.  */
 #ifndef _XOPEN_SOURCE
 /* # undef _XOPEN_SOURCE */
 #endif
-/* Enable X/Open compliant socket functions that do not require linking
-   with -lxnet on HP-UX 11.11.  */
-#ifndef _HPUX_ALT_XOPEN_SOCKET_API
-# define _HPUX_ALT_XOPEN_SOCKET_API 1
-#endif
-/* Enable general extensions on Solaris.  */
-#ifndef __EXTENSIONS__
-# define __EXTENSIONS__ 1
-#endif
 
 
-/* Define to 1 if you want getc etc. to use unlocked I/O if available.
-   Unlocked I/O can improve performance in unithreaded apps, but it is not
-   safe for multithreaded apps. */
-#define USE_UNLOCKED_IO 1
+/* An alias of GNULIB_STDIO_SINGLE_THREAD. */
+#define USE_UNLOCKED_IO GNULIB_STDIO_SINGLE_THREAD
 
 /* Define if the native Windows multithreading API can be used. */
 /* #undef USE_WINDOWS_THREADS */
 
 /* Version number of package */
-#define VERSION "3.5"
+#define VERSION "3.8.2"
 
 /* Define to 1 if unsetenv returns void instead of int. */
 /* #undef VOID_UNSETENV */
@@ -1445,20 +1891,26 @@
    `char[]'. */
 /* #undef YYTEXT_POINTER */
 
-/* Enable large inode numbers on Mac OS X 10.5. */
-#define _DARWIN_USE_64_BIT_INODE 1
-
 /* Number of bits in a file offset, on hosts where this is settable. */
 /* #undef _FILE_OFFSET_BITS */
 
+/* True if the compiler says it groks GNU C version MAJOR.MINOR.  */
+#if defined __GNUC__ && defined __GNUC_MINOR__
+# define _GL_GNUC_PREREQ(major, minor) \
+    ((major) < __GNUC__ + ((minor) <= __GNUC_MINOR__))
+#else
+# define _GL_GNUC_PREREQ(major, minor) 0
+#endif
+
+
+/* Define to enable the declarations of ISO C 11 types and functions. */
+/* #undef _ISOC11_SOURCE */
+
 /* Define for large files, on AIX-style hosts. */
 /* #undef _LARGE_FILES */
 
-/* Define to 1 if on MINIX. */
-/* #undef _MINIX */
-
-/* Define to 1 to make NetBSD features available. MINIX 3 needs this. */
-#define _NETBSD_SOURCE 1
+/* Define to 1 on Solaris. */
+/* #undef _LCONV_C99 */
 
 /* The _Noreturn keyword of C11.  */
 #ifndef _Noreturn
@@ -1474,10 +1926,14 @@
        this syntax with 'extern'.  */
 #  define _Noreturn [[noreturn]]
 # elif ((!defined __cplusplus || defined __clang__) \
-        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)  \
-            || 4 < __GNUC__ + (7 <= __GNUC_MINOR__)))
+        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
+            || (!defined __STRICT_ANSI__ \
+                && (_GL_GNUC_PREREQ (4, 7) \
+                    || (defined __apple_build_version__ \
+                        ? 6000000 <= __apple_build_version__ \
+                        : 3 < __clang_major__ + (5 <= __clang_minor__))))))
    /* _Noreturn works as-is.  */
-# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
+# elif _GL_GNUC_PREREQ (2, 8) || defined __clang__ || 0x5110 <= __SUNPRO_C
 #  define _Noreturn __attribute__ ((__noreturn__))
 # elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
 #  define _Noreturn __declspec (noreturn)
@@ -1487,12 +1943,8 @@
 #endif
 
 
-/* Define to 2 if the system does not provide POSIX.1 features except with
-   this defined. */
-/* #undef _POSIX_1_SOURCE */
-
-/* Define to 1 if you need to in order for 'stat' and other things to work. */
-/* #undef _POSIX_SOURCE */
+/* Number of bits in a timestamp, on hosts where this is settable. */
+/* #undef _TIME_BITS */
 
 /* For standard stat data types on VMS. */
 #define _USE_STD_STAT 1
@@ -1501,6 +1953,9 @@
    used. */
 /* #undef __GETOPT_PREFIX */
 
+/* For 64-bit time_t on 32-bit mingw. */
+/* #undef __MINGW_USE_VC2005_COMPAT */
+
 /* Define to 1 if the system <stdint.h> predates C++11. */
 /* #undef __STDC_CONSTANT_MACROS */
 
@@ -1534,6 +1989,368 @@
 #define _GL_ASYNC_SAFE
 
 
+/* Attributes.  */
+#if (defined __has_attribute \
+     && (!defined __clang_minor__ \
+         || 3 < __clang_major__ + (5 <= __clang_minor__)))
+# define _GL_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__)
+#else
+# define _GL_HAS_ATTRIBUTE(attr) _GL_ATTR_##attr
+# define _GL_ATTR_alloc_size _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_always_inline _GL_GNUC_PREREQ (3, 2)
+# define _GL_ATTR_artificial _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_cold _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_const _GL_GNUC_PREREQ (2, 95)
+# define _GL_ATTR_deprecated _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_diagnose_if 0
+# define _GL_ATTR_error _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_externally_visible _GL_GNUC_PREREQ (4, 1)
+# define _GL_ATTR_fallthrough _GL_GNUC_PREREQ (7, 0)
+# define _GL_ATTR_format _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_leaf _GL_GNUC_PREREQ (4, 6)
+# define _GL_ATTR_malloc _GL_GNUC_PREREQ (3, 0)
+# ifdef _ICC
+#  define _GL_ATTR_may_alias 0
+# else
+#  define _GL_ATTR_may_alias _GL_GNUC_PREREQ (3, 3)
+# endif
+# define _GL_ATTR_noinline _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_nonnull _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_nonstring _GL_GNUC_PREREQ (8, 0)
+# define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96)
+# define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9)
+# define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0)
+# define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4)
+#endif
+
+#ifdef __has_c_attribute
+# define _GL_HAS_C_ATTRIBUTE(attr) __has_c_attribute (__##attr##__)
+#else
+# define _GL_HAS_C_ATTRIBUTE(attr) 0
+#endif
+
+
+/* _GL_ATTRIBUTE_ALLOC_SIZE ((N)) declares that the Nth argument of the function
+   is the size of the returned memory block.
+   _GL_ATTRIBUTE_ALLOC_SIZE ((M, N)) declares that the Mth argument multiplied
+   by the Nth argument of the function is the size of the returned memory block.
+ */
+/* Applies to: function, pointer to function, function types.  */
+#if _GL_HAS_ATTRIBUTE (alloc_size)
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
+#else
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args)
+#endif
+
+/* _GL_ATTRIBUTE_ALWAYS_INLINE tells that the compiler should always inline the
+   function and report an error if it cannot do so.  */
+/* Applies to: function.  */
+#if _GL_HAS_ATTRIBUTE (always_inline)
+# define _GL_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__))
+#else
+# define _GL_ATTRIBUTE_ALWAYS_INLINE
+#endif
+
+/* _GL_ATTRIBUTE_ARTIFICIAL declares that the function is not important to show
+    in stack traces when debugging.  The compiler should omit the function from
+    stack traces.  */
+/* Applies to: function.  */
+#if _GL_HAS_ATTRIBUTE (artificial)
+# define _GL_ATTRIBUTE_ARTIFICIAL __attribute__ ((__artificial__))
+#else
+# define _GL_ATTRIBUTE_ARTIFICIAL
+#endif
+
+/* _GL_ATTRIBUTE_COLD declares that the function is rarely executed.  */
+/* Applies to: functions.  */
+/* Avoid __attribute__ ((cold)) on MinGW; see thread starting at
+   <https://lists.gnu.org/r/emacs-devel/2019-04/msg01152.html>.
+   Also, Oracle Studio 12.6 requires 'cold' not '__cold__'.  */
+#if _GL_HAS_ATTRIBUTE (cold) && !defined __MINGW32__
+# ifndef __SUNPRO_C
+#  define _GL_ATTRIBUTE_COLD __attribute__ ((__cold__))
+# else
+#  define _GL_ATTRIBUTE_COLD __attribute__ ((cold))
+# endif
+#else
+# define _GL_ATTRIBUTE_COLD
+#endif
+
+/* _GL_ATTRIBUTE_CONST declares that it is OK for a compiler to omit duplicate
+   calls to the function with the same arguments.
+   This attribute is safe for a function that neither depends on nor affects
+   observable state, and always returns exactly once - e.g., does not loop
+   forever, and does not call longjmp.
+   (This attribute is stricter than _GL_ATTRIBUTE_PURE.)  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (const)
+# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
+#else
+# define _GL_ATTRIBUTE_CONST
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.
+   _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
+   can be freed via 'free'; it can be used only after declaring 'free'.  */
+/* Applies to: functions.  Cannot be used on inline functions.  */
+#if _GL_GNUC_PREREQ (11, 0)
+# define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+#else
+# define _GL_ATTRIBUTE_DEALLOC(f, i)
+#endif
+#define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (free, 1)
+
+/* _GL_ATTRIBUTE_DEPRECATED: Declares that an entity is deprecated.
+   The compiler may warn if the entity is used.  */
+/* Applies to:
+     - function, variable,
+     - struct, union, struct/union member,
+     - enumeration, enumeration item,
+     - typedef,
+   in C++ also: namespace, class, template specialization.  */
+#if _GL_HAS_C_ATTRIBUTE (deprecated)
+# define _GL_ATTRIBUTE_DEPRECATED [[__deprecated__]]
+#elif _GL_HAS_ATTRIBUTE (deprecated)
+# define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__))
+#else
+# define _GL_ATTRIBUTE_DEPRECATED
+#endif
+
+/* _GL_ATTRIBUTE_ERROR(msg) requests an error if a function is called and
+   the function call is not optimized away.
+   _GL_ATTRIBUTE_WARNING(msg) requests a warning if a function is called and
+   the function call is not optimized away.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (error)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__error__ (msg)))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__warning__ (msg)))
+#elif _GL_HAS_ATTRIBUTE (diagnose_if)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__diagnose_if__ (1, msg, "error")))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#else
+# define _GL_ATTRIBUTE_ERROR(msg)
+# define _GL_ATTRIBUTE_WARNING(msg)
+#endif
+
+/* _GL_ATTRIBUTE_EXTERNALLY_VISIBLE declares that the entity should remain
+   visible to debuggers etc., even with '-fwhole-program'.  */
+/* Applies to: functions, variables.  */
+#if _GL_HAS_ATTRIBUTE (externally_visible)
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((externally_visible))
+#else
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
+#endif
+
+/* _GL_ATTRIBUTE_FALLTHROUGH declares that it is not a programming mistake if
+   the control flow falls through to the immediately following 'case' or
+   'default' label.  The compiler should not warn in this case.  */
+/* Applies to: Empty statement (;), inside a 'switch' statement.  */
+/* Always expands to something.  */
+#if _GL_HAS_C_ATTRIBUTE (fallthrough)
+# define _GL_ATTRIBUTE_FALLTHROUGH [[__fallthrough__]]
+#elif _GL_HAS_ATTRIBUTE (fallthrough)
+# define _GL_ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__))
+#else
+# define _GL_ATTRIBUTE_FALLTHROUGH ((void) 0)
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK))
+   declares that the STRING-INDEXth function argument is a format string of
+   style ARCHETYPE, which is one of:
+     printf, gnu_printf
+     scanf, gnu_scanf,
+     strftime, gnu_strftime,
+     strfmon,
+   or the same thing prefixed and suffixed with '__'.
+   If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK
+   are suitable for the format string.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (format)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define _GL_ATTRIBUTE_FORMAT(spec)
+#endif
+
+/* _GL_ATTRIBUTE_LEAF declares that if the function is called from some other
+   compilation unit, it executes code from that unit only by return or by
+   exception handling.  This declaration lets the compiler optimize that unit
+   more aggressively.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (leaf)
+# define _GL_ATTRIBUTE_LEAF __attribute__ ((__leaf__))
+#else
+# define _GL_ATTRIBUTE_LEAF
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+   allocated memory.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (malloc)
+# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+#else
+# define _GL_ATTRIBUTE_MALLOC
+#endif
+
+/* _GL_ATTRIBUTE_MAY_ALIAS declares that pointers to the type may point to the
+   same storage as pointers to other types.  Thus this declaration disables
+   strict aliasing optimization.  */
+/* Applies to: types.  */
+/* Oracle Studio 12.6 mishandles may_alias despite __has_attribute OK.  */
+#if _GL_HAS_ATTRIBUTE (may_alias) && !defined __SUNPRO_C
+# define _GL_ATTRIBUTE_MAY_ALIAS __attribute__ ((__may_alias__))
+#else
+# define _GL_ATTRIBUTE_MAY_ALIAS
+#endif
+
+/* _GL_ATTRIBUTE_MAYBE_UNUSED declares that it is not a programming mistake if
+   the entity is not used.  The compiler should not warn if the entity is not
+   used.  */
+/* Applies to:
+     - function, variable,
+     - struct, union, struct/union member,
+     - enumeration, enumeration item,
+     - typedef,
+   in C++ also: class.  */
+/* In C++ and C2x, this is spelled [[__maybe_unused__]].
+   GCC's syntax is __attribute__ ((__unused__)).
+   clang supports both syntaxes.  */
+#if _GL_HAS_C_ATTRIBUTE (maybe_unused)
+# define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
+#else
+# define _GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_UNUSED
+#endif
+/* Alternative spelling of this macro, for convenience.  */
+#define _GL_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
+/* Earlier spellings of this macro.  */
+#define _UNUSED_PARAMETER_ _GL_ATTRIBUTE_MAYBE_UNUSED
+
+/* _GL_ATTRIBUTE_NODISCARD declares that the caller of the function should not
+   discard the return value.  The compiler may warn if the caller does not use
+   the return value, unless the caller uses something like ignore_value.  */
+/* Applies to: function, enumeration, class.  */
+#if _GL_HAS_C_ATTRIBUTE (nodiscard)
+# define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]]
+#elif _GL_HAS_ATTRIBUTE (warn_unused_result)
+# define _GL_ATTRIBUTE_NODISCARD __attribute__ ((__warn_unused_result__))
+#else
+# define _GL_ATTRIBUTE_NODISCARD
+#endif
+
+/* _GL_ATTRIBUTE_NOINLINE tells that the compiler should not inline the
+   function.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (noinline)
+# define _GL_ATTRIBUTE_NOINLINE __attribute__ ((__noinline__))
+#else
+# define _GL_ATTRIBUTE_NOINLINE
+#endif
+
+/* _GL_ATTRIBUTE_NONNULL ((N1, N2,...)) declares that the arguments N1, N2,...
+   must not be NULL.
+   _GL_ATTRIBUTE_NONNULL () declares that all pointer arguments must not be
+   null.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (nonnull)
+# define _GL_ATTRIBUTE_NONNULL(args) __attribute__ ((__nonnull__ args))
+#else
+# define _GL_ATTRIBUTE_NONNULL(args)
+#endif
+
+/* _GL_ATTRIBUTE_NONSTRING declares that the contents of a character array is
+   not meant to be NUL-terminated.  */
+/* Applies to: struct/union members and variables that are arrays of element
+   type '[[un]signed] char'.  */
+#if _GL_HAS_ATTRIBUTE (nonstring)
+# define _GL_ATTRIBUTE_NONSTRING __attribute__ ((__nonstring__))
+#else
+# define _GL_ATTRIBUTE_NONSTRING
+#endif
+
+/* There is no _GL_ATTRIBUTE_NORETURN; use _Noreturn instead.  */
+
+/* _GL_ATTRIBUTE_NOTHROW declares that the function does not throw exceptions.
+ */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (nothrow) && !defined __cplusplus
+# define _GL_ATTRIBUTE_NOTHROW __attribute__ ((__nothrow__))
+#else
+# define _GL_ATTRIBUTE_NOTHROW
+#endif
+
+/* _GL_ATTRIBUTE_PACKED declares:
+   For struct members: The member has the smallest possible alignment.
+   For struct, union, class: All members have the smallest possible alignment,
+   minimizing the memory required.  */
+/* Applies to: struct members, struct, union,
+   in C++ also: class.  */
+#if _GL_HAS_ATTRIBUTE (packed)
+# define _GL_ATTRIBUTE_PACKED __attribute__ ((__packed__))
+#else
+# define _GL_ATTRIBUTE_PACKED
+#endif
+
+/* _GL_ATTRIBUTE_PURE declares that It is OK for a compiler to omit duplicate
+   calls to the function with the same arguments if observable state is not
+   changed between calls.
+   This attribute is safe for a function that does not affect
+   observable state, and always returns exactly once.
+   (This attribute is looser than _GL_ATTRIBUTE_CONST.)  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (pure)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE
+#endif
+
+/* _GL_ATTRIBUTE_RETURNS_NONNULL declares that the function's return value is
+   a non-NULL pointer.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (returns_nonnull)
+# define _GL_ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__))
+#else
+# define _GL_ATTRIBUTE_RETURNS_NONNULL
+#endif
+
+/* _GL_ATTRIBUTE_SENTINEL(pos) declares that the variadic function expects a
+   trailing NULL argument.
+   _GL_ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99).
+   _GL_ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (sentinel)
+# define _GL_ATTRIBUTE_SENTINEL(pos) __attribute__ ((__sentinel__ pos))
+#else
+# define _GL_ATTRIBUTE_SENTINEL(pos)
+#endif
+
+/* A helper macro.  Don't use it directly.  */
+#if _GL_HAS_ATTRIBUTE (unused)
+# define _GL_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#else
+# define _GL_ATTRIBUTE_UNUSED
+#endif
+
+
+/* _GL_UNUSED_LABEL; declares that it is not a programming mistake if the
+   immediately preceding label is not used.  The compiler should not warn
+   if the label is not used.  */
+/* Applies to: label (both in C and C++).  */
+/* Note that g++ < 4.5 does not support the '__attribute__ ((__unused__)) ;'
+   syntax.  But clang does.  */
+#if !(defined __cplusplus && !_GL_GNUC_PREREQ (4, 5)) || defined __clang__
+# define _GL_UNUSED_LABEL _GL_ATTRIBUTE_UNUSED
+#else
+# define _GL_UNUSED_LABEL
+#endif
+
+
+/* Define as 'access' if you don't have the eaccess() function. */
+/* #undef eaccess */
+
 /* Please see the Gnulib manual for how to use these macros.
 
    Suppress extern inline with HP-UX cc, as it appears to be broken; see
@@ -1543,7 +2360,8 @@
    mishandles inline functions that call each other.  E.g., for 'inline void f
    (void) { } inline void g (void) { f (); }', c99 incorrectly complains
    'reference to static identifier "f" in extern inline function'.
-   This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16.
+   This bug was observed with Oracle Developer Studio 12.6
+   (Sun C 5.15 SunOS_sparc 2017/05/30).
 
    Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
    on configurations that mistakenly use 'static inline' to implement
@@ -1609,8 +2427,8 @@
 # define _GL_EXTERN_INLINE extern
 # define _GL_EXTERN_INLINE_IN_USE
 #else
-# define _GL_INLINE static _GL_UNUSED
-# define _GL_EXTERN_INLINE static _GL_UNUSED
+# define _GL_INLINE _GL_UNUSED static
+# define _GL_EXTERN_INLINE _GL_UNUSED static
 #endif
 
 /* In GCC 4.6 (inclusive) to 5.1 (exclusive),
@@ -1663,13 +2481,29 @@
 /* Define to a type if <wchar.h> does not define. */
 /* #undef mbstate_t */
 
+/* _GL_CMP (n1, n2) performs a three-valued comparison on n1 vs. n2, where
+   n1 and n2 are expressions without side effects, that evaluate to real
+   numbers (excluding NaN).
+   It returns
+     1  if n1 > n2
+     0  if n1 == n2
+     -1 if n1 < n2
+   The naïve code   (n1 > n2 ? 1 : n1 < n2 ? -1 : 0)  produces a conditional
+   jump with nearly all GCC versions up to GCC 10.
+   This variant     (n1 < n2 ? -1 : n1 > n2)  produces a conditional with many
+   GCC versions up to GCC 9.
+   The better code  (n1 > n2) - (n1 < n2)  from Hacker's Delight § 2-9
+   avoids conditional jumps in all GCC versions >= 3.4.  */
+#define _GL_CMP(n1, n2) (((n1) > (n2)) - ((n1) < (n2)))
+
+
 /* Define to `int' if <sys/types.h> does not define. */
 /* #undef mode_t */
 
 /* Define to the type of st_nlink in struct stat, or a supertype. */
 /* #undef nlink_t */
 
-/* Define to `int' if <sys/types.h> does not define. */
+/* Define as a signed integer type capable of holding a process identifier. */
 /* #undef pid_t */
 
 /* Define as the type of the result of subtracting two pointers, if the system
@@ -1678,14 +2512,15 @@
 
 /* Define to the equivalent of the C99 'restrict' keyword, or to
    nothing if this is not supported.  Do not define if restrict is
-   supported directly.  */
-#define restrict __restrict
-/* Work around a bug in Sun C++: it does not support _Restrict or
-   __restrict__, even though the corresponding Sun C compiler ends up with
-   "#define restrict _Restrict" or "#define restrict __restrict__" in the
-   previous line.  Perhaps some future version of Sun C++ will work with
-   restrict; if so, hopefully it defines __RESTRICT like Sun C does.  */
-#if defined __SUNPRO_CC && !defined __RESTRICT
+   supported only directly.  */
+#define restrict __restrict__
+/* Work around a bug in older versions of Sun C++, which did not
+   #define __restrict__ or support _Restrict or __restrict__
+   even though the corresponding Sun C compiler ended up with
+   "#define restrict _Restrict" or "#define restrict __restrict__"
+   in the previous line.  This workaround can be removed once
+   we assume Oracle Developer Studio 12.5 (2016) or later.  */
+#if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__
 # define _Restrict
 # define __restrict__
 #endif
@@ -1703,46 +2538,18 @@
 /* Define to `int' if <sys/types.h> doesn't define. */
 /* #undef uid_t */
 
-/* Define as a marker that can be attached to declarations that might not
-    be used.  This helps to reduce warnings, such as from
-    GCC -Wunused-parameter.  */
-#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
-# define _GL_UNUSED __attribute__ ((__unused__))
-#else
-# define _GL_UNUSED
-#endif
-/* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name
-   is a misnomer outside of parameter lists.  */
-#define _UNUSED_PARAMETER_ _GL_UNUSED
 
-/* gcc supports the "unused" attribute on possibly unused labels, and
-   g++ has since version 4.5.  Note to support C++ as well as C,
-   _GL_UNUSED_LABEL should be used with a trailing ;  */
-#if !defined __cplusplus || __GNUC__ > 4 \
-    || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
-# define _GL_UNUSED_LABEL _GL_UNUSED
-#else
-# define _GL_UNUSED_LABEL
-#endif
-
-/* The __pure__ attribute was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define _GL_ATTRIBUTE_PURE /* empty */
-#endif
-
-/* The __const__ attribute was added in gcc 2.95.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
-# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
-#else
-# define _GL_ATTRIBUTE_CONST /* empty */
-#endif
-
-/* The __malloc__ attribute was added in gcc 3.  */
-#if 3 <= __GNUC__
-# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
-#else
-# define _GL_ATTRIBUTE_MALLOC /* empty */
-#endif
-
+  /* This definition is a duplicate of the one in unitypes.h.
+     It is here so that we can cope with an older version of unitypes.h
+     that does not contain this definition and that is pre-installed among
+     the public header files.  */
+  # if defined __restrict \
+       || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+       || __clang_major__ >= 3
+  #  define _UC_RESTRICT __restrict
+  # elif 199901L <= __STDC_VERSION__ || defined restrict
+  #  define _UC_RESTRICT restrict
+  # else
+  #  define _UC_RESTRICT
+  # endif
+  
diff --git a/linux_glibc-lib/configmake.h b/linux_glibc-lib/configmake.h
index 346e670..d5bc692 100644
--- a/linux_glibc-lib/configmake.h
+++ b/linux_glibc-lib/configmake.h
@@ -3,10 +3,10 @@
 # include <winsock2.h> /* avoid mingw pollution on DATADIR */
 #endif
 #define PREFIX "/nonexistent"
-#define EXEC_PREFIX "/nonexistent/linux-x86"
-#define BINDIR "/nonexistent/linux-x86/bin"
-#define SBINDIR "/nonexistent/linux-x86/sbin"
-#define LIBEXECDIR "/nonexistent/linux-x86/libexec"
+#define EXEC_PREFIX "/nonexistent/linux_glibc-x86"
+#define BINDIR "/nonexistent/linux_glibc-x86/bin"
+#define SBINDIR "/nonexistent/linux_glibc-x86/sbin"
+#define LIBEXECDIR "/nonexistent/linux_glibc-x86/libexec"
 #define DATAROOTDIR "/nonexistent/common"
 #define DATADIR "/nonexistent/common"
 #define SYSCONFDIR "/nonexistent/etc"
@@ -21,11 +21,11 @@
 #define DVIDIR "/nonexistent/common/doc/bison"
 #define PDFDIR "/nonexistent/common/doc/bison"
 #define PSDIR "/nonexistent/common/doc/bison"
-#define LIBDIR "/nonexistent/linux-x86/lib"
+#define LIBDIR "/nonexistent/linux_glibc-x86/lib"
 #define LISPDIR "/nonexistent/common/emacs/site-lisp"
 #define LOCALEDIR "/nonexistent/common/locale"
 #define MANDIR "/nonexistent/common/man"
 #define PKGDATADIR "/nonexistent/common/bison"
 #define PKGINCLUDEDIR "/nonexistent/include/bison"
-#define PKGLIBDIR "/nonexistent/linux-x86/lib/bison"
-#define PKGLIBEXECDIR "/nonexistent/linux-x86/libexec/bison"
+#define PKGLIBDIR "/nonexistent/linux_glibc-x86/lib/bison"
+#define PKGLIBEXECDIR "/nonexistent/linux_glibc-x86/libexec/bison"
diff --git a/linux_glibc-lib/fcntl.h b/linux_glibc-lib/fcntl.h
index 0a9908e..8816732 100644
--- a/linux_glibc-lib/fcntl.h
+++ b/linux_glibc-lib/fcntl.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Like <fcntl.h>, but with non-working flags defined to 0.
 
-   Copyright (C) 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* written by Paul Eggert */
@@ -82,19 +82,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -229,6 +229,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -254,6 +264,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -351,7 +369,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -379,14 +397,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -400,26 +415,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -428,19 +443,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -516,6 +531,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -528,24 +550,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -571,6 +604,12 @@
 _GL_FUNCDECL_RPL (creat, int, (const char *filename, mode_t mode)
                              _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (creat, int, (const char *filename, mode_t mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef creat
+#   define creat _creat
+#  endif
+_GL_CXXALIAS_MDA (creat, int, (const char *filename, mode_t mode));
 # else
 _GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode));
 # endif
@@ -580,6 +619,21 @@
 /* Assume creat is always declared.  */
 _GL_WARN_ON_USE (creat, "creat is not always POSIX compliant - "
                  "use gnulib module creat for portability");
+#elif 1
+/* On native Windows, map 'creat' to '_creat', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::creat always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef creat
+#   define creat _creat
+#  endif
+/* Need to cast, because in mingw the last argument is 'int mode'.  */
+_GL_CXXALIAS_MDA_CAST (creat, int, (const char *filename, mode_t mode));
+# else
+_GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode));
+# endif
+_GL_CXXALIASWARN (creat);
 #endif
 
 #if 1
@@ -590,9 +644,15 @@
 #  endif
 _GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...));
 _GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...));
+#  if !GNULIB_defined_rpl_fcntl
+#   define GNULIB_defined_rpl_fcntl 1
+#  endif
 # else
 #  if !1
 _GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...));
+#   if !GNULIB_defined_fcntl
+#    define GNULIB_defined_fcntl 1
+#   endif
 #  endif
 _GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...));
 # endif
@@ -614,6 +674,12 @@
 _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
                              _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef open
+#   define open _open
+#  endif
+_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
 # else
 _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
 # endif
@@ -627,6 +693,22 @@
 /* Assume open is always declared.  */
 _GL_WARN_ON_USE (open, "open is not always POSIX compliant - "
                  "use gnulib module open for portability");
+#elif 1
+/* On native Windows, map 'open' to '_open', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::open always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef open
+#   define open _open
+#  endif
+_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+# else
+_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+# endif
+# if !defined __hpux
+_GL_CXXALIASWARN (open);
+# endif
 #endif
 
 #if 0
diff --git a/linux_glibc-lib/iconv.h b/linux_glibc-lib/iconv.h
new file mode 100644
index 0000000..ca9f1e2
--- /dev/null
+++ b/linux_glibc-lib/iconv.h
@@ -0,0 +1,634 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* A GNU-like <iconv.h>.
+
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_ICONV_H
+
+#if __GNUC__ >= 3
+#pragma GCC system_header
+#endif
+
+
+/* The include_next requires a split double-inclusion guard.  */
+#include_next <iconv.h>
+
+#ifndef _GL_ICONV_H
+#define _GL_ICONV_H
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+/* C++ compatible function declaration macros.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_CXXDEFS_H
+#define _GL_CXXDEFS_H
+
+/* Begin/end the GNULIB_NAMESPACE namespace.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
+# define _GL_END_NAMESPACE }
+#else
+# define _GL_BEGIN_NAMESPACE
+# define _GL_END_NAMESPACE
+#endif
+
+/* The three most frequent use cases of these macros are:
+
+   * For providing a substitute for a function that is missing on some
+     platforms, but is declared and works fine on the platforms on which
+     it exists:
+
+       #if @GNULIB_FOO@
+       # if !@HAVE_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       # endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on all platforms,
+     but is broken/insufficient and needs to be replaced on some platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on some platforms
+     but is broken/insufficient and needs to be replaced on some of them and
+     is additionally either missing or undeclared on some other platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       #  if !@HAVE_FOO@   or   if !@HAVE_DECL_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       #  endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+*/
+
+/* _GL_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#if defined __cplusplus
+# define _GL_EXTERN_C extern "C"
+#else
+# define _GL_EXTERN_C extern
+#endif
+
+/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
+   declares a replacement function, named rpl_func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
+  _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
+#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype rpl_func parameters_and_attributes
+
+/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
+   declares the system function, named func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype func parameters_and_attributes
+
+/* _GL_CXXALIAS_RPL (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+
+   Wrapping rpl_func in an object with an inline conversion operator
+   avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::rpl_func;                                  \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
+   is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
+   except that the C function rpl_func may have a slightly different
+   declaration.  A cast is used to silence the "invalid conversion" error
+   that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                     \
+    {                                                              \
+      static const struct _gl_ ## func ## _wrapper                 \
+      {                                                            \
+        typedef rettype (*type) parameters;                        \
+                                                                   \
+        inline operator type () const                              \
+        {                                                          \
+          return reinterpret_cast<type>(::rpl_func);               \
+        }                                                          \
+      } func = {};                                                 \
+    }                                                              \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_SYS (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to the system provided function func, if GNULIB_NAMESPACE
+   is defined.
+   Example:
+     _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+
+   Wrapping func in an object with an inline conversion operator
+   avoids a reference to func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS(func,rettype,parameters)            \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::func;                                      \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                          \
+    {                                                   \
+      static const struct _gl_ ## func ## _wrapper      \
+      {                                                 \
+        typedef rettype (*type) parameters;             \
+                                                        \
+        inline operator type () const                   \
+        {                                               \
+          return reinterpret_cast<type>(::func);        \
+        }                                               \
+      } func = {};                                      \
+    }                                                   \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function is picked among a set of overloaded functions,
+   namely the one with rettype2 and parameters2.  Two consecutive casts
+   are used to silence the "cannot find a match" and "invalid conversion"
+   errors that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+  /* The outer cast must be a reinterpret_cast.
+     The inner cast: When the function is defined as a set of overloaded
+     functions, it works as a static_cast<>, choosing the designated variant.
+     When the function is defined as a single variant, it works as a
+     reinterpret_cast<>. The parenthesized cast syntax works both ways.  */
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    namespace GNULIB_NAMESPACE                                                \
+    {                                                                         \
+      static const struct _gl_ ## func ## _wrapper                            \
+      {                                                                       \
+        typedef rettype (*type) parameters;                                   \
+                                                                              \
+        inline operator type () const                                         \
+        {                                                                     \
+          return reinterpret_cast<type>((rettype2 (*) parameters2)(::func));  \
+        }                                                                     \
+      } func = {};                                                            \
+    }                                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN (func);
+   causes a warning to be emitted when ::func is used but not when
+   GNULIB_NAMESPACE::func is used.  func must be defined without overloaded
+   variants.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN(func) \
+   _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN_1(func,namespace) \
+   _GL_CXXALIASWARN_2 (func, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+    _GL_WARN_ON_USE (func, \
+                     "The symbol ::" #func " refers to the system function. " \
+                     "Use " #namespace "::" #func " instead.")
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     extern __typeof__ (func) func
+# else
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN(func) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
+   causes a warning to be emitted when the given overloaded variant of ::func
+   is used but not when GNULIB_NAMESPACE::func is used.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+   _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
+                        GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
+   _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
+                         "The symbol ::" #func " refers to the system function. " \
+                         "Use " #namespace "::" #func " instead.")
+# else
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+#endif /* _GL_CXXDEFS_H */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+/* A C macro for declaring that specific arguments must not be NULL.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
+   that the values passed as arguments n, ..., m must be non-NULL pointers.
+   n = 1 stands for the first argument, n = 2 for the second argument etc.  */
+#ifndef _GL_ARG_NONNULL
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
+#  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
+# else
+#  define _GL_ARG_NONNULL(params)
+# endif
+#endif
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+/* A C macro for emitting warnings if a function is used.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
+   for FUNCTION which will then trigger a compiler warning containing
+   the text of "literal string" anywhere that function is called, if
+   supported by the compiler.  If the compiler does not support this
+   feature, the macro expands to an unused extern declaration.
+
+   _GL_WARN_ON_USE_ATTRIBUTE ("literal string") expands to the
+   attribute used in _GL_WARN_ON_USE.  If the compiler does not support
+   this feature, it expands to empty.
+
+   These macros are useful for marking a function as a potential
+   portability trap, with the intent that "literal string" include
+   instructions on the replacement function that should be used
+   instead.
+   _GL_WARN_ON_USE is for functions with 'extern' linkage.
+   _GL_WARN_ON_USE_ATTRIBUTE is for functions with 'static' or 'inline'
+   linkage.
+
+   However, one of the reasons that a function is a portability trap is
+   if it has the wrong signature.  Declaring FUNCTION with a different
+   signature in C is a compilation error, so this macro must use the
+   same type as any existing declaration so that programs that avoid
+   the problematic FUNCTION do not fail to compile merely because they
+   included a header that poisoned the function.  But this implies that
+   _GL_WARN_ON_USE is only safe to use if FUNCTION is known to already
+   have a declaration.  Use of this macro implies that there must not
+   be any other macro hiding the declaration of FUNCTION; but
+   undefining FUNCTION first is part of the poisoning process anyway
+   (although for symbols that are provided only via a macro, the result
+   is a compilation error rather than a warning containing
+   "literal string").  Also note that in C++, it is only safe to use if
+   FUNCTION has no overloads.
+
+   For an example, it is possible to poison 'getline' by:
+   - adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
+     [getline]) in configure.ac, which potentially defines
+     HAVE_RAW_DECL_GETLINE
+   - adding this code to a header that wraps the system <stdio.h>:
+     #undef getline
+     #if HAVE_RAW_DECL_GETLINE
+     _GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
+       "not universally present; use the gnulib module getline");
+     #endif
+
+   It is not possible to directly poison global variables.  But it is
+   possible to write a wrapper accessor function, and poison that
+   (less common usage, like &environ, will cause a compilation error
+   rather than issue the nice warning, but the end result of informing
+   the developer about their portability problem is still achieved):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     rpl_environ (void) { return &environ; }
+     _GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   or better (avoiding contradictory use of 'static' and 'extern'):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     _GL_WARN_ON_USE_ATTRIBUTE ("environ is not always properly declared")
+     rpl_environ (void) { return &environ; }
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   */
+#ifndef _GL_WARN_ON_USE
+
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# else /* Unsupported.  */
+#  define _GL_WARN_ON_USE(function, message) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# endif
+#endif
+
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
+   This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
+   not work in this case.  */
+#ifndef _GL_WARN_ON_USE_CXX
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
+# endif
+#endif
+
+/* _GL_WARN_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#ifndef _GL_WARN_EXTERN_C
+# if defined __cplusplus
+#  define _GL_WARN_EXTERN_C extern "C"
+# else
+#  define _GL_WARN_EXTERN_C extern
+# endif
+#endif
+
+
+#if 1
+# if 0
+/* An iconv_open wrapper that supports the IANA standardized encoding names
+   ("ISO-8859-1" etc.) as far as possible.  */
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define iconv_open rpl_iconv_open
+#  endif
+_GL_FUNCDECL_RPL (iconv_open, iconv_t,
+                  (const char *tocode, const char *fromcode)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (iconv_open, iconv_t,
+                  (const char *tocode, const char *fromcode));
+# else
+_GL_CXXALIAS_SYS (iconv_open, iconv_t,
+                  (const char *tocode, const char *fromcode));
+# endif
+_GL_CXXALIASWARN (iconv_open);
+#elif defined GNULIB_POSIXCHECK
+# undef iconv_open
+# if HAVE_RAW_DECL_ICONV_OPEN
+_GL_WARN_ON_USE (iconv_open, "iconv_open is not working correctly everywhere - "
+                 "use gnulib module iconv for portability");
+# endif
+#endif
+
+#if 0
+/* Special constants for supporting UTF-{16,32}{BE,LE} encodings.
+   Not public.  */
+# define _ICONV_UTF8_UTF16BE (iconv_t)(-161)
+# define _ICONV_UTF8_UTF16LE (iconv_t)(-162)
+# define _ICONV_UTF8_UTF32BE (iconv_t)(-163)
+# define _ICONV_UTF8_UTF32LE (iconv_t)(-164)
+# define _ICONV_UTF16BE_UTF8 (iconv_t)(-165)
+# define _ICONV_UTF16LE_UTF8 (iconv_t)(-166)
+# define _ICONV_UTF32BE_UTF8 (iconv_t)(-167)
+# define _ICONV_UTF32LE_UTF8 (iconv_t)(-168)
+#endif
+
+#if 1
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define iconv rpl_iconv
+#  endif
+_GL_FUNCDECL_RPL (iconv, size_t,
+                  (iconv_t cd,
+                    char **restrict inbuf,
+                   size_t *restrict inbytesleft,
+                   char **restrict outbuf, size_t *restrict outbytesleft));
+_GL_CXXALIAS_RPL (iconv, size_t,
+                  (iconv_t cd,
+                    char **restrict inbuf,
+                   size_t *restrict inbytesleft,
+                   char **restrict outbuf, size_t *restrict outbytesleft));
+# else
+/* Need to cast, because on some versions of Solaris, ICONV_CONST does
+   not have the right value for C++.  */
+_GL_CXXALIAS_SYS_CAST (iconv, size_t,
+                       (iconv_t cd,
+                         char **restrict inbuf,
+                        size_t *restrict inbytesleft,
+                        char **restrict outbuf, size_t *restrict outbytesleft));
+# endif
+_GL_CXXALIASWARN (iconv);
+# ifndef ICONV_CONST
+#  define ICONV_CONST 
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef iconv
+# if HAVE_RAW_DECL_ICONV
+_GL_WARN_ON_USE (iconv, "iconv is not working correctly everywhere - "
+                 "use gnulib module iconv for portability");
+# endif
+#endif
+
+#if 1
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define iconv_close rpl_iconv_close
+#  endif
+_GL_FUNCDECL_RPL (iconv_close, int, (iconv_t cd));
+_GL_CXXALIAS_RPL (iconv_close, int, (iconv_t cd));
+# else
+_GL_CXXALIAS_SYS (iconv_close, int, (iconv_t cd));
+# endif
+_GL_CXXALIASWARN (iconv_close);
+#endif
+
+
+#endif /* _GL_ICONV_H */
+#endif /* _GL_ICONV_H */
diff --git a/linux_glibc-lib/inttypes.h b/linux_glibc-lib/inttypes.h
index 9c46e85..8c933a9 100644
--- a/linux_glibc-lib/inttypes.h
+++ b/linux_glibc-lib/inttypes.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
-/* Copyright (C) 2006-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2006-2021 Free Software Foundation, Inc.
    Written by Paul Eggert, Bruno Haible, Derek Price.
    This file is part of gnulib.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /*
@@ -39,6 +39,8 @@
 #  endif
 
 #  include_next <inttypes.h>
+
+#  define _GL_FINISHED_INCLUDING_SYSTEM_INTTYPES_H
 # endif
 #endif
 
@@ -63,19 +65,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -210,6 +212,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -235,6 +247,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -332,7 +352,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -360,14 +380,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -381,26 +398,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -409,19 +426,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -497,6 +514,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -509,24 +533,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -550,110 +585,92 @@
 # define _LONG_LONG_FORMAT_PREFIX "ll"
 #endif
 
-#if !defined PRId8 || 0
-# undef PRId8
+#if !defined PRId8
 # ifdef INT8_MAX
 #  define PRId8 "d"
 # endif
 #endif
-#if !defined PRIi8 || 0
-# undef PRIi8
+#if !defined PRIi8
 # ifdef INT8_MAX
 #  define PRIi8 "i"
 # endif
 #endif
-#if !defined PRIo8 || 0
-# undef PRIo8
+#if !defined PRIo8
 # ifdef UINT8_MAX
 #  define PRIo8 "o"
 # endif
 #endif
-#if !defined PRIu8 || 0
-# undef PRIu8
+#if !defined PRIu8
 # ifdef UINT8_MAX
 #  define PRIu8 "u"
 # endif
 #endif
-#if !defined PRIx8 || 0
-# undef PRIx8
+#if !defined PRIx8
 # ifdef UINT8_MAX
 #  define PRIx8 "x"
 # endif
 #endif
-#if !defined PRIX8 || 0
-# undef PRIX8
+#if !defined PRIX8
 # ifdef UINT8_MAX
 #  define PRIX8 "X"
 # endif
 #endif
-#if !defined PRId16 || 0
-# undef PRId16
+#if !defined PRId16
 # ifdef INT16_MAX
 #  define PRId16 "d"
 # endif
 #endif
-#if !defined PRIi16 || 0
-# undef PRIi16
+#if !defined PRIi16
 # ifdef INT16_MAX
 #  define PRIi16 "i"
 # endif
 #endif
-#if !defined PRIo16 || 0
-# undef PRIo16
+#if !defined PRIo16
 # ifdef UINT16_MAX
 #  define PRIo16 "o"
 # endif
 #endif
-#if !defined PRIu16 || 0
-# undef PRIu16
+#if !defined PRIu16
 # ifdef UINT16_MAX
 #  define PRIu16 "u"
 # endif
 #endif
-#if !defined PRIx16 || 0
-# undef PRIx16
+#if !defined PRIx16
 # ifdef UINT16_MAX
 #  define PRIx16 "x"
 # endif
 #endif
-#if !defined PRIX16 || 0
-# undef PRIX16
+#if !defined PRIX16
 # ifdef UINT16_MAX
 #  define PRIX16 "X"
 # endif
 #endif
-#if !defined PRId32 || 0
-# undef PRId32
+#if !defined PRId32
 # ifdef INT32_MAX
 #  define PRId32 "d"
 # endif
 #endif
-#if !defined PRIi32 || 0
-# undef PRIi32
+#if !defined PRIi32
 # ifdef INT32_MAX
 #  define PRIi32 "i"
 # endif
 #endif
-#if !defined PRIo32 || 0
-# undef PRIo32
+#if !defined PRIo32
 # ifdef UINT32_MAX
 #  define PRIo32 "o"
 # endif
 #endif
-#if !defined PRIu32 || 0
-# undef PRIu32
+#if !defined PRIu32
 # ifdef UINT32_MAX
 #  define PRIu32 "u"
 # endif
 #endif
-#if !defined PRIx32 || 0
-# undef PRIx32
+#if !defined PRIx32
 # ifdef UINT32_MAX
 #  define PRIx32 "x"
 # endif
 #endif
-#if !defined PRIX32 || 0
-# undef PRIX32
+#if !defined PRIX32
 # ifdef UINT32_MAX
 #  define PRIX32 "X"
 # endif
@@ -663,15 +680,13 @@
 #  define _PRI64_PREFIX "l"
 # elif defined _MSC_VER || defined __MINGW32__
 #  define _PRI64_PREFIX "I64"
-# elif 1 && LONG_MAX >> 30 == 1
+# elif LONG_MAX >> 30 == 1
 #  define _PRI64_PREFIX _LONG_LONG_FORMAT_PREFIX
 # endif
-# if !defined PRId64 || 0
-#  undef PRId64
+# if !defined PRId64
 #  define PRId64 _PRI64_PREFIX "d"
 # endif
-# if !defined PRIi64 || 0
-#  undef PRIi64
+# if !defined PRIi64
 #  define PRIi64 _PRI64_PREFIX "i"
 # endif
 #endif
@@ -680,266 +695,220 @@
 #  define _PRIu64_PREFIX "l"
 # elif defined _MSC_VER || defined __MINGW32__
 #  define _PRIu64_PREFIX "I64"
-# elif 1 && ULONG_MAX >> 31 == 1
+# elif ULONG_MAX >> 31 == 1
 #  define _PRIu64_PREFIX _LONG_LONG_FORMAT_PREFIX
 # endif
-# if !defined PRIo64 || 0
-#  undef PRIo64
+# if !defined PRIo64
 #  define PRIo64 _PRIu64_PREFIX "o"
 # endif
-# if !defined PRIu64 || 0
-#  undef PRIu64
+# if !defined PRIu64
 #  define PRIu64 _PRIu64_PREFIX "u"
 # endif
-# if !defined PRIx64 || 0
-#  undef PRIx64
+# if !defined PRIx64
 #  define PRIx64 _PRIu64_PREFIX "x"
 # endif
-# if !defined PRIX64 || 0
-#  undef PRIX64
+# if !defined PRIX64
 #  define PRIX64 _PRIu64_PREFIX "X"
 # endif
 #endif
 
-#if !defined PRIdLEAST8 || 0
-# undef PRIdLEAST8
+#if !defined PRIdLEAST8
 # define PRIdLEAST8 "d"
 #endif
-#if !defined PRIiLEAST8 || 0
-# undef PRIiLEAST8
+#if !defined PRIiLEAST8
 # define PRIiLEAST8 "i"
 #endif
-#if !defined PRIoLEAST8 || 0
-# undef PRIoLEAST8
+#if !defined PRIoLEAST8
 # define PRIoLEAST8 "o"
 #endif
-#if !defined PRIuLEAST8 || 0
-# undef PRIuLEAST8
+#if !defined PRIuLEAST8
 # define PRIuLEAST8 "u"
 #endif
-#if !defined PRIxLEAST8 || 0
-# undef PRIxLEAST8
+#if !defined PRIxLEAST8
 # define PRIxLEAST8 "x"
 #endif
-#if !defined PRIXLEAST8 || 0
-# undef PRIXLEAST8
+#if !defined PRIXLEAST8
 # define PRIXLEAST8 "X"
 #endif
-#if !defined PRIdLEAST16 || 0
-# undef PRIdLEAST16
+#if !defined PRIdLEAST16
 # define PRIdLEAST16 "d"
 #endif
-#if !defined PRIiLEAST16 || 0
-# undef PRIiLEAST16
+#if !defined PRIiLEAST16
 # define PRIiLEAST16 "i"
 #endif
-#if !defined PRIoLEAST16 || 0
-# undef PRIoLEAST16
+#if !defined PRIoLEAST16
 # define PRIoLEAST16 "o"
 #endif
-#if !defined PRIuLEAST16 || 0
-# undef PRIuLEAST16
+#if !defined PRIuLEAST16
 # define PRIuLEAST16 "u"
 #endif
-#if !defined PRIxLEAST16 || 0
-# undef PRIxLEAST16
+#if !defined PRIxLEAST16
 # define PRIxLEAST16 "x"
 #endif
-#if !defined PRIXLEAST16 || 0
-# undef PRIXLEAST16
+#if !defined PRIXLEAST16
 # define PRIXLEAST16 "X"
 #endif
-#if !defined PRIdLEAST32 || 0
-# undef PRIdLEAST32
+#if !defined PRIdLEAST32
 # define PRIdLEAST32 "d"
 #endif
-#if !defined PRIiLEAST32 || 0
-# undef PRIiLEAST32
+#if !defined PRIiLEAST32
 # define PRIiLEAST32 "i"
 #endif
-#if !defined PRIoLEAST32 || 0
-# undef PRIoLEAST32
+#if !defined PRIoLEAST32
 # define PRIoLEAST32 "o"
 #endif
-#if !defined PRIuLEAST32 || 0
-# undef PRIuLEAST32
+#if !defined PRIuLEAST32
 # define PRIuLEAST32 "u"
 #endif
-#if !defined PRIxLEAST32 || 0
-# undef PRIxLEAST32
+#if !defined PRIxLEAST32
 # define PRIxLEAST32 "x"
 #endif
-#if !defined PRIXLEAST32 || 0
-# undef PRIXLEAST32
+#if !defined PRIXLEAST32
 # define PRIXLEAST32 "X"
 #endif
 #ifdef INT64_MAX
-# if !defined PRIdLEAST64 || 0
-#  undef PRIdLEAST64
+# if !defined PRIdLEAST64
 #  define PRIdLEAST64 PRId64
 # endif
-# if !defined PRIiLEAST64 || 0
-#  undef PRIiLEAST64
+# if !defined PRIiLEAST64
 #  define PRIiLEAST64 PRIi64
 # endif
 #endif
 #ifdef UINT64_MAX
-# if !defined PRIoLEAST64 || 0
-#  undef PRIoLEAST64
+# if !defined PRIoLEAST64
 #  define PRIoLEAST64 PRIo64
 # endif
-# if !defined PRIuLEAST64 || 0
-#  undef PRIuLEAST64
+# if !defined PRIuLEAST64
 #  define PRIuLEAST64 PRIu64
 # endif
-# if !defined PRIxLEAST64 || 0
-#  undef PRIxLEAST64
+# if !defined PRIxLEAST64
 #  define PRIxLEAST64 PRIx64
 # endif
-# if !defined PRIXLEAST64 || 0
-#  undef PRIXLEAST64
+# if !defined PRIXLEAST64
 #  define PRIXLEAST64 PRIX64
 # endif
 #endif
 
-#if !defined PRIdFAST8 || 0
-# undef PRIdFAST8
+#if !defined PRIdFAST8
 # if INT_FAST8_MAX > INT32_MAX
 #  define PRIdFAST8 PRId64
 # else
 #  define PRIdFAST8 "d"
 # endif
 #endif
-#if !defined PRIiFAST8 || 0
-# undef PRIiFAST8
+#if !defined PRIiFAST8
 # if INT_FAST8_MAX > INT32_MAX
 #  define PRIiFAST8 PRIi64
 # else
 #  define PRIiFAST8 "i"
 # endif
 #endif
-#if !defined PRIoFAST8 || 0
-# undef PRIoFAST8
+#if !defined PRIoFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define PRIoFAST8 PRIo64
 # else
 #  define PRIoFAST8 "o"
 # endif
 #endif
-#if !defined PRIuFAST8 || 0
-# undef PRIuFAST8
+#if !defined PRIuFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define PRIuFAST8 PRIu64
 # else
 #  define PRIuFAST8 "u"
 # endif
 #endif
-#if !defined PRIxFAST8 || 0
-# undef PRIxFAST8
+#if !defined PRIxFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define PRIxFAST8 PRIx64
 # else
 #  define PRIxFAST8 "x"
 # endif
 #endif
-#if !defined PRIXFAST8 || 0
-# undef PRIXFAST8
+#if !defined PRIXFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define PRIXFAST8 PRIX64
 # else
 #  define PRIXFAST8 "X"
 # endif
 #endif
-#if !defined PRIdFAST16 || 0
-# undef PRIdFAST16
+#if !defined PRIdFAST16
 # if INT_FAST16_MAX > INT32_MAX
 #  define PRIdFAST16 PRId64
 # else
 #  define PRIdFAST16 "d"
 # endif
 #endif
-#if !defined PRIiFAST16 || 0
-# undef PRIiFAST16
+#if !defined PRIiFAST16
 # if INT_FAST16_MAX > INT32_MAX
 #  define PRIiFAST16 PRIi64
 # else
 #  define PRIiFAST16 "i"
 # endif
 #endif
-#if !defined PRIoFAST16 || 0
-# undef PRIoFAST16
+#if !defined PRIoFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define PRIoFAST16 PRIo64
 # else
 #  define PRIoFAST16 "o"
 # endif
 #endif
-#if !defined PRIuFAST16 || 0
-# undef PRIuFAST16
+#if !defined PRIuFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define PRIuFAST16 PRIu64
 # else
 #  define PRIuFAST16 "u"
 # endif
 #endif
-#if !defined PRIxFAST16 || 0
-# undef PRIxFAST16
+#if !defined PRIxFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define PRIxFAST16 PRIx64
 # else
 #  define PRIxFAST16 "x"
 # endif
 #endif
-#if !defined PRIXFAST16 || 0
-# undef PRIXFAST16
+#if !defined PRIXFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define PRIXFAST16 PRIX64
 # else
 #  define PRIXFAST16 "X"
 # endif
 #endif
-#if !defined PRIdFAST32 || 0
-# undef PRIdFAST32
+#if !defined PRIdFAST32
 # if INT_FAST32_MAX > INT32_MAX
 #  define PRIdFAST32 PRId64
 # else
 #  define PRIdFAST32 "d"
 # endif
 #endif
-#if !defined PRIiFAST32 || 0
-# undef PRIiFAST32
+#if !defined PRIiFAST32
 # if INT_FAST32_MAX > INT32_MAX
 #  define PRIiFAST32 PRIi64
 # else
 #  define PRIiFAST32 "i"
 # endif
 #endif
-#if !defined PRIoFAST32 || 0
-# undef PRIoFAST32
+#if !defined PRIoFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define PRIoFAST32 PRIo64
 # else
 #  define PRIoFAST32 "o"
 # endif
 #endif
-#if !defined PRIuFAST32 || 0
-# undef PRIuFAST32
+#if !defined PRIuFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define PRIuFAST32 PRIu64
 # else
 #  define PRIuFAST32 "u"
 # endif
 #endif
-#if !defined PRIxFAST32 || 0
-# undef PRIxFAST32
+#if !defined PRIxFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define PRIxFAST32 PRIx64
 # else
 #  define PRIxFAST32 "x"
 # endif
 #endif
-#if !defined PRIXFAST32 || 0
-# undef PRIXFAST32
+#if !defined PRIXFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define PRIXFAST32 PRIX64
 # else
@@ -947,76 +916,64 @@
 # endif
 #endif
 #ifdef INT64_MAX
-# if !defined PRIdFAST64 || 0
-#  undef PRIdFAST64
+# if !defined PRIdFAST64
 #  define PRIdFAST64 PRId64
 # endif
-# if !defined PRIiFAST64 || 0
-#  undef PRIiFAST64
+# if !defined PRIiFAST64
 #  define PRIiFAST64 PRIi64
 # endif
 #endif
 #ifdef UINT64_MAX
-# if !defined PRIoFAST64 || 0
-#  undef PRIoFAST64
+# if !defined PRIoFAST64
 #  define PRIoFAST64 PRIo64
 # endif
-# if !defined PRIuFAST64 || 0
-#  undef PRIuFAST64
+# if !defined PRIuFAST64
 #  define PRIuFAST64 PRIu64
 # endif
-# if !defined PRIxFAST64 || 0
-#  undef PRIxFAST64
+# if !defined PRIxFAST64
 #  define PRIxFAST64 PRIx64
 # endif
-# if !defined PRIXFAST64 || 0
-#  undef PRIXFAST64
+# if !defined PRIXFAST64
 #  define PRIXFAST64 PRIX64
 # endif
 #endif
 
-#if !defined PRIdMAX || 0
-# undef PRIdMAX
+#if !defined PRIdMAX
 # if 1
 #  define PRIdMAX PRId64
 # else
 #  define PRIdMAX "ld"
 # endif
 #endif
-#if !defined PRIiMAX || 0
-# undef PRIiMAX
+#if !defined PRIiMAX
 # if 1
 #  define PRIiMAX PRIi64
 # else
 #  define PRIiMAX "li"
 # endif
 #endif
-#if !defined PRIoMAX || 0
-# undef PRIoMAX
+#if !defined PRIoMAX
 # if 1
 #  define PRIoMAX PRIo64
 # else
 #  define PRIoMAX "lo"
 # endif
 #endif
-#if !defined PRIuMAX || 0
-# undef PRIuMAX
+#if !defined PRIuMAX
 # if 1
 #  define PRIuMAX PRIu64
 # else
 #  define PRIuMAX "lu"
 # endif
 #endif
-#if !defined PRIxMAX || 0
-# undef PRIxMAX
+#if !defined PRIxMAX
 # if 1
 #  define PRIxMAX PRIx64
 # else
 #  define PRIxMAX "lx"
 # endif
 #endif
-#if !defined PRIXMAX || 0
-# undef PRIXMAX
+#if !defined PRIXMAX
 # if 1
 #  define PRIXMAX PRIX64
 # else
@@ -1024,129 +981,108 @@
 # endif
 #endif
 
-#if !defined PRIdPTR || 0
-# undef PRIdPTR
+#if !defined PRIdPTR
 # ifdef INTPTR_MAX
 #  define PRIdPTR "l" "d"
 # endif
 #endif
-#if !defined PRIiPTR || 0
-# undef PRIiPTR
+#if !defined PRIiPTR
 # ifdef INTPTR_MAX
 #  define PRIiPTR "l" "i"
 # endif
 #endif
-#if !defined PRIoPTR || 0
-# undef PRIoPTR
+#if !defined PRIoPTR
 # ifdef UINTPTR_MAX
 #  define PRIoPTR "l" "o"
 # endif
 #endif
-#if !defined PRIuPTR || 0
-# undef PRIuPTR
+#if !defined PRIuPTR
 # ifdef UINTPTR_MAX
 #  define PRIuPTR "l" "u"
 # endif
 #endif
-#if !defined PRIxPTR || 0
-# undef PRIxPTR
+#if !defined PRIxPTR
 # ifdef UINTPTR_MAX
 #  define PRIxPTR "l" "x"
 # endif
 #endif
-#if !defined PRIXPTR || 0
-# undef PRIXPTR
+#if !defined PRIXPTR
 # ifdef UINTPTR_MAX
 #  define PRIXPTR "l" "X"
 # endif
 #endif
 
-#if !defined SCNd8 || 0
-# undef SCNd8
+#if !defined SCNd8
 # ifdef INT8_MAX
 #  define SCNd8 "hhd"
 # endif
 #endif
-#if !defined SCNi8 || 0
-# undef SCNi8
+#if !defined SCNi8
 # ifdef INT8_MAX
 #  define SCNi8 "hhi"
 # endif
 #endif
-#if !defined SCNo8 || 0
-# undef SCNo8
+#if !defined SCNo8
 # ifdef UINT8_MAX
 #  define SCNo8 "hho"
 # endif
 #endif
-#if !defined SCNu8 || 0
-# undef SCNu8
+#if !defined SCNu8
 # ifdef UINT8_MAX
 #  define SCNu8 "hhu"
 # endif
 #endif
-#if !defined SCNx8 || 0
-# undef SCNx8
+#if !defined SCNx8
 # ifdef UINT8_MAX
 #  define SCNx8 "hhx"
 # endif
 #endif
-#if !defined SCNd16 || 0
-# undef SCNd16
+#if !defined SCNd16
 # ifdef INT16_MAX
 #  define SCNd16 "hd"
 # endif
 #endif
-#if !defined SCNi16 || 0
-# undef SCNi16
+#if !defined SCNi16
 # ifdef INT16_MAX
 #  define SCNi16 "hi"
 # endif
 #endif
-#if !defined SCNo16 || 0
-# undef SCNo16
+#if !defined SCNo16
 # ifdef UINT16_MAX
 #  define SCNo16 "ho"
 # endif
 #endif
-#if !defined SCNu16 || 0
-# undef SCNu16
+#if !defined SCNu16
 # ifdef UINT16_MAX
 #  define SCNu16 "hu"
 # endif
 #endif
-#if !defined SCNx16 || 0
-# undef SCNx16
+#if !defined SCNx16
 # ifdef UINT16_MAX
 #  define SCNx16 "hx"
 # endif
 #endif
-#if !defined SCNd32 || 0
-# undef SCNd32
+#if !defined SCNd32
 # ifdef INT32_MAX
 #  define SCNd32 "d"
 # endif
 #endif
-#if !defined SCNi32 || 0
-# undef SCNi32
+#if !defined SCNi32
 # ifdef INT32_MAX
 #  define SCNi32 "i"
 # endif
 #endif
-#if !defined SCNo32 || 0
-# undef SCNo32
+#if !defined SCNo32
 # ifdef UINT32_MAX
 #  define SCNo32 "o"
 # endif
 #endif
-#if !defined SCNu32 || 0
-# undef SCNu32
+#if !defined SCNu32
 # ifdef UINT32_MAX
 #  define SCNu32 "u"
 # endif
 #endif
-#if !defined SCNx32 || 0
-# undef SCNx32
+#if !defined SCNx32
 # ifdef UINT32_MAX
 #  define SCNx32 "x"
 # endif
@@ -1156,15 +1092,13 @@
 #  define _SCN64_PREFIX "l"
 # elif defined _MSC_VER || defined __MINGW32__
 #  define _SCN64_PREFIX "I64"
-# elif 1 && LONG_MAX >> 30 == 1
+# elif LONG_MAX >> 30 == 1
 #  define _SCN64_PREFIX _LONG_LONG_FORMAT_PREFIX
 # endif
-# if !defined SCNd64 || 0
-#  undef SCNd64
+# if !defined SCNd64
 #  define SCNd64 _SCN64_PREFIX "d"
 # endif
-# if !defined SCNi64 || 0
-#  undef SCNi64
+# if !defined SCNi64
 #  define SCNi64 _SCN64_PREFIX "i"
 # endif
 #endif
@@ -1173,110 +1107,86 @@
 #  define _SCNu64_PREFIX "l"
 # elif defined _MSC_VER || defined __MINGW32__
 #  define _SCNu64_PREFIX "I64"
-# elif 1 && ULONG_MAX >> 31 == 1
+# elif ULONG_MAX >> 31 == 1
 #  define _SCNu64_PREFIX _LONG_LONG_FORMAT_PREFIX
 # endif
-# if !defined SCNo64 || 0
-#  undef SCNo64
+# if !defined SCNo64
 #  define SCNo64 _SCNu64_PREFIX "o"
 # endif
-# if !defined SCNu64 || 0
-#  undef SCNu64
+# if !defined SCNu64
 #  define SCNu64 _SCNu64_PREFIX "u"
 # endif
-# if !defined SCNx64 || 0
-#  undef SCNx64
+# if !defined SCNx64
 #  define SCNx64 _SCNu64_PREFIX "x"
 # endif
 #endif
 
-#if !defined SCNdLEAST8 || 0
-# undef SCNdLEAST8
+#if !defined SCNdLEAST8
 # define SCNdLEAST8 "hhd"
 #endif
-#if !defined SCNiLEAST8 || 0
-# undef SCNiLEAST8
+#if !defined SCNiLEAST8
 # define SCNiLEAST8 "hhi"
 #endif
-#if !defined SCNoLEAST8 || 0
-# undef SCNoLEAST8
+#if !defined SCNoLEAST8
 # define SCNoLEAST8 "hho"
 #endif
-#if !defined SCNuLEAST8 || 0
-# undef SCNuLEAST8
+#if !defined SCNuLEAST8
 # define SCNuLEAST8 "hhu"
 #endif
-#if !defined SCNxLEAST8 || 0
-# undef SCNxLEAST8
+#if !defined SCNxLEAST8
 # define SCNxLEAST8 "hhx"
 #endif
-#if !defined SCNdLEAST16 || 0
-# undef SCNdLEAST16
+#if !defined SCNdLEAST16
 # define SCNdLEAST16 "hd"
 #endif
-#if !defined SCNiLEAST16 || 0
-# undef SCNiLEAST16
+#if !defined SCNiLEAST16
 # define SCNiLEAST16 "hi"
 #endif
-#if !defined SCNoLEAST16 || 0
-# undef SCNoLEAST16
+#if !defined SCNoLEAST16
 # define SCNoLEAST16 "ho"
 #endif
-#if !defined SCNuLEAST16 || 0
-# undef SCNuLEAST16
+#if !defined SCNuLEAST16
 # define SCNuLEAST16 "hu"
 #endif
-#if !defined SCNxLEAST16 || 0
-# undef SCNxLEAST16
+#if !defined SCNxLEAST16
 # define SCNxLEAST16 "hx"
 #endif
-#if !defined SCNdLEAST32 || 0
-# undef SCNdLEAST32
+#if !defined SCNdLEAST32
 # define SCNdLEAST32 "d"
 #endif
-#if !defined SCNiLEAST32 || 0
-# undef SCNiLEAST32
+#if !defined SCNiLEAST32
 # define SCNiLEAST32 "i"
 #endif
-#if !defined SCNoLEAST32 || 0
-# undef SCNoLEAST32
+#if !defined SCNoLEAST32
 # define SCNoLEAST32 "o"
 #endif
-#if !defined SCNuLEAST32 || 0
-# undef SCNuLEAST32
+#if !defined SCNuLEAST32
 # define SCNuLEAST32 "u"
 #endif
-#if !defined SCNxLEAST32 || 0
-# undef SCNxLEAST32
+#if !defined SCNxLEAST32
 # define SCNxLEAST32 "x"
 #endif
 #ifdef INT64_MAX
-# if !defined SCNdLEAST64 || 0
-#  undef SCNdLEAST64
+# if !defined SCNdLEAST64
 #  define SCNdLEAST64 SCNd64
 # endif
-# if !defined SCNiLEAST64 || 0
-#  undef SCNiLEAST64
+# if !defined SCNiLEAST64
 #  define SCNiLEAST64 SCNi64
 # endif
 #endif
 #ifdef UINT64_MAX
-# if !defined SCNoLEAST64 || 0
-#  undef SCNoLEAST64
+# if !defined SCNoLEAST64
 #  define SCNoLEAST64 SCNo64
 # endif
-# if !defined SCNuLEAST64 || 0
-#  undef SCNuLEAST64
+# if !defined SCNuLEAST64
 #  define SCNuLEAST64 SCNu64
 # endif
-# if !defined SCNxLEAST64 || 0
-#  undef SCNxLEAST64
+# if !defined SCNxLEAST64
 #  define SCNxLEAST64 SCNx64
 # endif
 #endif
 
-#if !defined SCNdFAST8 || 0
-# undef SCNdFAST8
+#if !defined SCNdFAST8
 # if INT_FAST8_MAX > INT32_MAX
 #  define SCNdFAST8 SCNd64
 # elif INT_FAST8_MAX == 0x7fff
@@ -1287,8 +1197,7 @@
 #  define SCNdFAST8 "d"
 # endif
 #endif
-#if !defined SCNiFAST8 || 0
-# undef SCNiFAST8
+#if !defined SCNiFAST8
 # if INT_FAST8_MAX > INT32_MAX
 #  define SCNiFAST8 SCNi64
 # elif INT_FAST8_MAX == 0x7fff
@@ -1299,8 +1208,7 @@
 #  define SCNiFAST8 "i"
 # endif
 #endif
-#if !defined SCNoFAST8 || 0
-# undef SCNoFAST8
+#if !defined SCNoFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define SCNoFAST8 SCNo64
 # elif UINT_FAST8_MAX == 0xffff
@@ -1311,8 +1219,7 @@
 #  define SCNoFAST8 "o"
 # endif
 #endif
-#if !defined SCNuFAST8 || 0
-# undef SCNuFAST8
+#if !defined SCNuFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define SCNuFAST8 SCNu64
 # elif UINT_FAST8_MAX == 0xffff
@@ -1323,8 +1230,7 @@
 #  define SCNuFAST8 "u"
 # endif
 #endif
-#if !defined SCNxFAST8 || 0
-# undef SCNxFAST8
+#if !defined SCNxFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define SCNxFAST8 SCNx64
 # elif UINT_FAST8_MAX == 0xffff
@@ -1335,8 +1241,7 @@
 #  define SCNxFAST8 "x"
 # endif
 #endif
-#if !defined SCNdFAST16 || 0
-# undef SCNdFAST16
+#if !defined SCNdFAST16
 # if INT_FAST16_MAX > INT32_MAX
 #  define SCNdFAST16 SCNd64
 # elif INT_FAST16_MAX == 0x7fff
@@ -1345,8 +1250,7 @@
 #  define SCNdFAST16 "d"
 # endif
 #endif
-#if !defined SCNiFAST16 || 0
-# undef SCNiFAST16
+#if !defined SCNiFAST16
 # if INT_FAST16_MAX > INT32_MAX
 #  define SCNiFAST16 SCNi64
 # elif INT_FAST16_MAX == 0x7fff
@@ -1355,8 +1259,7 @@
 #  define SCNiFAST16 "i"
 # endif
 #endif
-#if !defined SCNoFAST16 || 0
-# undef SCNoFAST16
+#if !defined SCNoFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define SCNoFAST16 SCNo64
 # elif UINT_FAST16_MAX == 0xffff
@@ -1365,8 +1268,7 @@
 #  define SCNoFAST16 "o"
 # endif
 #endif
-#if !defined SCNuFAST16 || 0
-# undef SCNuFAST16
+#if !defined SCNuFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define SCNuFAST16 SCNu64
 # elif UINT_FAST16_MAX == 0xffff
@@ -1375,8 +1277,7 @@
 #  define SCNuFAST16 "u"
 # endif
 #endif
-#if !defined SCNxFAST16 || 0
-# undef SCNxFAST16
+#if !defined SCNxFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define SCNxFAST16 SCNx64
 # elif UINT_FAST16_MAX == 0xffff
@@ -1385,40 +1286,35 @@
 #  define SCNxFAST16 "x"
 # endif
 #endif
-#if !defined SCNdFAST32 || 0
-# undef SCNdFAST32
+#if !defined SCNdFAST32
 # if INT_FAST32_MAX > INT32_MAX
 #  define SCNdFAST32 SCNd64
 # else
 #  define SCNdFAST32 "d"
 # endif
 #endif
-#if !defined SCNiFAST32 || 0
-# undef SCNiFAST32
+#if !defined SCNiFAST32
 # if INT_FAST32_MAX > INT32_MAX
 #  define SCNiFAST32 SCNi64
 # else
 #  define SCNiFAST32 "i"
 # endif
 #endif
-#if !defined SCNoFAST32 || 0
-# undef SCNoFAST32
+#if !defined SCNoFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define SCNoFAST32 SCNo64
 # else
 #  define SCNoFAST32 "o"
 # endif
 #endif
-#if !defined SCNuFAST32 || 0
-# undef SCNuFAST32
+#if !defined SCNuFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define SCNuFAST32 SCNu64
 # else
 #  define SCNuFAST32 "u"
 # endif
 #endif
-#if !defined SCNxFAST32 || 0
-# undef SCNxFAST32
+#if !defined SCNxFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define SCNxFAST32 SCNx64
 # else
@@ -1426,64 +1322,54 @@
 # endif
 #endif
 #ifdef INT64_MAX
-# if !defined SCNdFAST64 || 0
-#  undef SCNdFAST64
+# if !defined SCNdFAST64
 #  define SCNdFAST64 SCNd64
 # endif
-# if !defined SCNiFAST64 || 0
-#  undef SCNiFAST64
+# if !defined SCNiFAST64
 #  define SCNiFAST64 SCNi64
 # endif
 #endif
 #ifdef UINT64_MAX
-# if !defined SCNoFAST64 || 0
-#  undef SCNoFAST64
+# if !defined SCNoFAST64
 #  define SCNoFAST64 SCNo64
 # endif
-# if !defined SCNuFAST64 || 0
-#  undef SCNuFAST64
+# if !defined SCNuFAST64
 #  define SCNuFAST64 SCNu64
 # endif
-# if !defined SCNxFAST64 || 0
-#  undef SCNxFAST64
+# if !defined SCNxFAST64
 #  define SCNxFAST64 SCNx64
 # endif
 #endif
 
-#if !defined SCNdMAX || 0
-# undef SCNdMAX
+#if !defined SCNdMAX
 # if 1
 #  define SCNdMAX SCNd64
 # else
 #  define SCNdMAX "ld"
 # endif
 #endif
-#if !defined SCNiMAX || 0
-# undef SCNiMAX
+#if !defined SCNiMAX
 # if 1
 #  define SCNiMAX SCNi64
 # else
 #  define SCNiMAX "li"
 # endif
 #endif
-#if !defined SCNoMAX || 0
-# undef SCNoMAX
+#if !defined SCNoMAX
 # if 1
 #  define SCNoMAX SCNo64
 # else
 #  define SCNoMAX "lo"
 # endif
 #endif
-#if !defined SCNuMAX || 0
-# undef SCNuMAX
+#if !defined SCNuMAX
 # if 1
 #  define SCNuMAX SCNu64
 # else
 #  define SCNuMAX "lu"
 # endif
 #endif
-#if !defined SCNxMAX || 0
-# undef SCNxMAX
+#if !defined SCNxMAX
 # if 1
 #  define SCNxMAX SCNx64
 # else
@@ -1491,32 +1377,27 @@
 # endif
 #endif
 
-#if !defined SCNdPTR || 0
-# undef SCNdPTR
+#if !defined SCNdPTR
 # ifdef INTPTR_MAX
 #  define SCNdPTR "l" "d"
 # endif
 #endif
-#if !defined SCNiPTR || 0
-# undef SCNiPTR
+#if !defined SCNiPTR
 # ifdef INTPTR_MAX
 #  define SCNiPTR "l" "i"
 # endif
 #endif
-#if !defined SCNoPTR || 0
-# undef SCNoPTR
+#if !defined SCNoPTR
 # ifdef UINTPTR_MAX
 #  define SCNoPTR "l" "o"
 # endif
 #endif
-#if !defined SCNuPTR || 0
-# undef SCNuPTR
+#if !defined SCNuPTR
 # ifdef UINTPTR_MAX
 #  define SCNuPTR "l" "u"
 # endif
 #endif
-#if !defined SCNxPTR || 0
-# undef SCNxPTR
+#if !defined SCNxPTR
 # ifdef UINTPTR_MAX
 #  define SCNxPTR "l" "x"
 # endif
@@ -1565,15 +1446,19 @@
 #   define strtoimax rpl_strtoimax
 #  endif
 _GL_FUNCDECL_RPL (strtoimax, intmax_t,
-                  (const char *, char **, int) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtoimax, intmax_t, (const char *, char **, int));
+                  (const char *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoimax, intmax_t,
+                  (const char *restrict, char **restrict, int));
 # else
 #  if !1
 #   undef strtoimax
 _GL_FUNCDECL_SYS (strtoimax, intmax_t,
-                  (const char *, char **, int) _GL_ARG_NONNULL ((1)));
+                  (const char *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (strtoimax, intmax_t, (const char *, char **, int));
+_GL_CXXALIAS_SYS (strtoimax, intmax_t,
+                  (const char *restrict, char **restrict, int));
 # endif
 _GL_CXXALIASWARN (strtoimax);
 #elif defined GNULIB_POSIXCHECK
@@ -1591,15 +1476,19 @@
 #   define strtoumax rpl_strtoumax
 #  endif
 _GL_FUNCDECL_RPL (strtoumax, uintmax_t,
-                  (const char *, char **, int) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtoumax, uintmax_t, (const char *, char **, int));
+                  (const char *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoumax, uintmax_t,
+                  (const char *restrict, char **restrict, int));
 # else
 #  if !1
 #   undef strtoumax
 _GL_FUNCDECL_SYS (strtoumax, uintmax_t,
-                  (const char *, char **, int) _GL_ARG_NONNULL ((1)));
+                  (const char *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (strtoumax, uintmax_t, (const char *, char **, int));
+_GL_CXXALIAS_SYS (strtoumax, uintmax_t,
+                  (const char *restrict, char **restrict, int));
 # endif
 _GL_CXXALIASWARN (strtoumax);
 #elif defined GNULIB_POSIXCHECK
diff --git a/linux_glibc-lib/limits.h b/linux_glibc-lib/limits.h
index 6fea064..bf2dca2 100644
--- a/linux_glibc-lib/limits.h
+++ b/linux_glibc-lib/limits.h
@@ -1,31 +1,47 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <limits.h>.
 
-   Copyright 2016-2019 Free Software Foundation, Inc.
+   Copyright 2016-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License
-   as published by the Free Software Foundation; either version 3, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
-
-#ifndef _GL_LIMITS_H
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 #pragma GCC system_header
 #endif
 
 
-/* The include_next requires a split double-inclusion guard.  */
+#if defined _GL_ALREADY_INCLUDING_LIMITS_H
+/* Special invocation convention:
+   On Haiku/x86_64, we have a sequence of nested includes
+   <limits.h> -> <syslimits.h> -> <limits.h>.
+   In this situation, LONG_MAX and INT_MAX are not yet defined,
+   therefore we should not attempt to define LONG_BIT.  */
+
 #include_next <limits.h>
 
+#else
+/* Normal invocation convention.  */
+
+#ifndef _GL_LIMITS_H
+
+# define _GL_ALREADY_INCLUDING_LIMITS_H
+
+/* The include_next requires a split double-inclusion guard.  */
+# include_next <limits.h>
+
+# undef _GL_ALREADY_INCLUDING_LIMITS_H
+
 #ifndef _GL_LIMITS_H
 #define _GL_LIMITS_H
 
@@ -84,10 +100,11 @@
 # endif
 #endif
 
-/* Macros specified by ISO/IEC TS 18661-1:2014.  */
+/* Macros specified by C2x and by ISO/IEC TS 18661-1:2014.  */
 
 #if (! defined ULLONG_WIDTH                                             \
-     && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__))
+     && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__ \
+         || (defined __STDC_VERSION__ && 201710 < __STDC_VERSION__)))
 # define CHAR_WIDTH _GL_INTEGER_WIDTH (CHAR_MIN, CHAR_MAX)
 # define SCHAR_WIDTH _GL_INTEGER_WIDTH (SCHAR_MIN, SCHAR_MAX)
 # define UCHAR_WIDTH _GL_INTEGER_WIDTH (0, UCHAR_MAX)
@@ -99,7 +116,17 @@
 # define ULONG_WIDTH _GL_INTEGER_WIDTH (0, ULONG_MAX)
 # define LLONG_WIDTH _GL_INTEGER_WIDTH (LLONG_MIN, LLONG_MAX)
 # define ULLONG_WIDTH _GL_INTEGER_WIDTH (0, ULLONG_MAX)
-#endif /* !ULLONG_WIDTH && (_GNU_SOURCE || __STDC_WANT_IEC_60559_BFP_EXT__) */
+#endif
+
+/* Macros specified by C2x.  */
+
+#if (! defined BOOL_WIDTH \
+     && (defined _GNU_SOURCE \
+         || (defined __STDC_VERSION__ && 201710 < __STDC_VERSION__)))
+# define BOOL_MAX 1
+# define BOOL_WIDTH 1
+#endif
 
 #endif /* _GL_LIMITS_H */
 #endif /* _GL_LIMITS_H */
+#endif
diff --git a/linux_glibc-lib/locale.h b/linux_glibc-lib/locale.h
new file mode 100644
index 0000000..82c8fa3
--- /dev/null
+++ b/linux_glibc-lib/locale.h
@@ -0,0 +1,812 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* A POSIX <locale.h>.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#if __GNUC__ >= 3
+#pragma GCC system_header
+#endif
+
+
+#if (defined _WIN32 && !defined __CYGWIN__ && defined __need_locale_t) \
+    || defined _GL_ALREADY_INCLUDING_LOCALE_H
+
+/* Special invocation convention:
+   - Inside mingw header files,
+   - To handle Solaris header files (through Solaris 10) when combined
+     with gettext's libintl.h.  */
+
+#include_next <locale.h>
+
+#else
+/* Normal invocation convention.  */
+
+#ifndef _GL_LOCALE_H
+
+#define _GL_ALREADY_INCLUDING_LOCALE_H
+
+/* The include_next requires a split double-inclusion guard.  */
+#include_next <locale.h>
+
+#undef _GL_ALREADY_INCLUDING_LOCALE_H
+
+#ifndef _GL_LOCALE_H
+#define _GL_LOCALE_H
+
+/* NetBSD 5.0 mis-defines NULL.  */
+#include <stddef.h>
+
+/* Mac OS X 10.5 defines the locale_t type in <xlocale.h>.  */
+#if 1
+# include <xlocale.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+/* C++ compatible function declaration macros.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_CXXDEFS_H
+#define _GL_CXXDEFS_H
+
+/* Begin/end the GNULIB_NAMESPACE namespace.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
+# define _GL_END_NAMESPACE }
+#else
+# define _GL_BEGIN_NAMESPACE
+# define _GL_END_NAMESPACE
+#endif
+
+/* The three most frequent use cases of these macros are:
+
+   * For providing a substitute for a function that is missing on some
+     platforms, but is declared and works fine on the platforms on which
+     it exists:
+
+       #if @GNULIB_FOO@
+       # if !@HAVE_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       # endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on all platforms,
+     but is broken/insufficient and needs to be replaced on some platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on some platforms
+     but is broken/insufficient and needs to be replaced on some of them and
+     is additionally either missing or undeclared on some other platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       #  if !@HAVE_FOO@   or   if !@HAVE_DECL_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       #  endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+*/
+
+/* _GL_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#if defined __cplusplus
+# define _GL_EXTERN_C extern "C"
+#else
+# define _GL_EXTERN_C extern
+#endif
+
+/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
+   declares a replacement function, named rpl_func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
+  _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
+#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype rpl_func parameters_and_attributes
+
+/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
+   declares the system function, named func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype func parameters_and_attributes
+
+/* _GL_CXXALIAS_RPL (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+
+   Wrapping rpl_func in an object with an inline conversion operator
+   avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::rpl_func;                                  \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
+   is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
+   except that the C function rpl_func may have a slightly different
+   declaration.  A cast is used to silence the "invalid conversion" error
+   that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                     \
+    {                                                              \
+      static const struct _gl_ ## func ## _wrapper                 \
+      {                                                            \
+        typedef rettype (*type) parameters;                        \
+                                                                   \
+        inline operator type () const                              \
+        {                                                          \
+          return reinterpret_cast<type>(::rpl_func);               \
+        }                                                          \
+      } func = {};                                                 \
+    }                                                              \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_SYS (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to the system provided function func, if GNULIB_NAMESPACE
+   is defined.
+   Example:
+     _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+
+   Wrapping func in an object with an inline conversion operator
+   avoids a reference to func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS(func,rettype,parameters)            \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::func;                                      \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                          \
+    {                                                   \
+      static const struct _gl_ ## func ## _wrapper      \
+      {                                                 \
+        typedef rettype (*type) parameters;             \
+                                                        \
+        inline operator type () const                   \
+        {                                               \
+          return reinterpret_cast<type>(::func);        \
+        }                                               \
+      } func = {};                                      \
+    }                                                   \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function is picked among a set of overloaded functions,
+   namely the one with rettype2 and parameters2.  Two consecutive casts
+   are used to silence the "cannot find a match" and "invalid conversion"
+   errors that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+  /* The outer cast must be a reinterpret_cast.
+     The inner cast: When the function is defined as a set of overloaded
+     functions, it works as a static_cast<>, choosing the designated variant.
+     When the function is defined as a single variant, it works as a
+     reinterpret_cast<>. The parenthesized cast syntax works both ways.  */
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    namespace GNULIB_NAMESPACE                                                \
+    {                                                                         \
+      static const struct _gl_ ## func ## _wrapper                            \
+      {                                                                       \
+        typedef rettype (*type) parameters;                                   \
+                                                                              \
+        inline operator type () const                                         \
+        {                                                                     \
+          return reinterpret_cast<type>((rettype2 (*) parameters2)(::func));  \
+        }                                                                     \
+      } func = {};                                                            \
+    }                                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN (func);
+   causes a warning to be emitted when ::func is used but not when
+   GNULIB_NAMESPACE::func is used.  func must be defined without overloaded
+   variants.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN(func) \
+   _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN_1(func,namespace) \
+   _GL_CXXALIASWARN_2 (func, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+    _GL_WARN_ON_USE (func, \
+                     "The symbol ::" #func " refers to the system function. " \
+                     "Use " #namespace "::" #func " instead.")
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     extern __typeof__ (func) func
+# else
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN(func) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
+   causes a warning to be emitted when the given overloaded variant of ::func
+   is used but not when GNULIB_NAMESPACE::func is used.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+   _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
+                        GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
+   _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
+                         "The symbol ::" #func " refers to the system function. " \
+                         "Use " #namespace "::" #func " instead.")
+# else
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+#endif /* _GL_CXXDEFS_H */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+/* A C macro for declaring that specific arguments must not be NULL.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
+   that the values passed as arguments n, ..., m must be non-NULL pointers.
+   n = 1 stands for the first argument, n = 2 for the second argument etc.  */
+#ifndef _GL_ARG_NONNULL
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
+#  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
+# else
+#  define _GL_ARG_NONNULL(params)
+# endif
+#endif
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+/* A C macro for emitting warnings if a function is used.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
+   for FUNCTION which will then trigger a compiler warning containing
+   the text of "literal string" anywhere that function is called, if
+   supported by the compiler.  If the compiler does not support this
+   feature, the macro expands to an unused extern declaration.
+
+   _GL_WARN_ON_USE_ATTRIBUTE ("literal string") expands to the
+   attribute used in _GL_WARN_ON_USE.  If the compiler does not support
+   this feature, it expands to empty.
+
+   These macros are useful for marking a function as a potential
+   portability trap, with the intent that "literal string" include
+   instructions on the replacement function that should be used
+   instead.
+   _GL_WARN_ON_USE is for functions with 'extern' linkage.
+   _GL_WARN_ON_USE_ATTRIBUTE is for functions with 'static' or 'inline'
+   linkage.
+
+   However, one of the reasons that a function is a portability trap is
+   if it has the wrong signature.  Declaring FUNCTION with a different
+   signature in C is a compilation error, so this macro must use the
+   same type as any existing declaration so that programs that avoid
+   the problematic FUNCTION do not fail to compile merely because they
+   included a header that poisoned the function.  But this implies that
+   _GL_WARN_ON_USE is only safe to use if FUNCTION is known to already
+   have a declaration.  Use of this macro implies that there must not
+   be any other macro hiding the declaration of FUNCTION; but
+   undefining FUNCTION first is part of the poisoning process anyway
+   (although for symbols that are provided only via a macro, the result
+   is a compilation error rather than a warning containing
+   "literal string").  Also note that in C++, it is only safe to use if
+   FUNCTION has no overloads.
+
+   For an example, it is possible to poison 'getline' by:
+   - adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
+     [getline]) in configure.ac, which potentially defines
+     HAVE_RAW_DECL_GETLINE
+   - adding this code to a header that wraps the system <stdio.h>:
+     #undef getline
+     #if HAVE_RAW_DECL_GETLINE
+     _GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
+       "not universally present; use the gnulib module getline");
+     #endif
+
+   It is not possible to directly poison global variables.  But it is
+   possible to write a wrapper accessor function, and poison that
+   (less common usage, like &environ, will cause a compilation error
+   rather than issue the nice warning, but the end result of informing
+   the developer about their portability problem is still achieved):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     rpl_environ (void) { return &environ; }
+     _GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   or better (avoiding contradictory use of 'static' and 'extern'):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     _GL_WARN_ON_USE_ATTRIBUTE ("environ is not always properly declared")
+     rpl_environ (void) { return &environ; }
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   */
+#ifndef _GL_WARN_ON_USE
+
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# else /* Unsupported.  */
+#  define _GL_WARN_ON_USE(function, message) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# endif
+#endif
+
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
+   This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
+   not work in this case.  */
+#ifndef _GL_WARN_ON_USE_CXX
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
+# endif
+#endif
+
+/* _GL_WARN_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#ifndef _GL_WARN_EXTERN_C
+# if defined __cplusplus
+#  define _GL_WARN_EXTERN_C extern "C"
+# else
+#  define _GL_WARN_EXTERN_C extern
+# endif
+#endif
+
+/* The LC_MESSAGES locale category is specified in POSIX, but not in ISO C.
+   On systems that don't define it, use the same value as GNU libintl.  */
+#if !defined LC_MESSAGES
+# define LC_MESSAGES 1729
+#endif
+
+/* On native Windows with MSVC, 'struct lconv' lacks the members int_p_* and
+   int_n_*.  Instead of overriding 'struct lconv', merely define these member
+   names as macros.  This avoids trouble in C++ mode.  */
+#if defined _MSC_VER
+# define int_p_cs_precedes   p_cs_precedes
+# define int_p_sign_posn     p_sign_posn
+# define int_p_sep_by_space  p_sep_by_space
+# define int_n_cs_precedes   n_cs_precedes
+# define int_n_sign_posn     n_sign_posn
+# define int_n_sep_by_space  n_sep_by_space
+#endif
+
+/* Bionic libc's 'struct lconv' is just a dummy.  */
+#if 0
+# define lconv rpl_lconv
+struct lconv
+{
+  /* All 'char *' are actually 'const char *'.  */
+
+  /* Members that depend on the LC_NUMERIC category of the locale.  See
+     <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_04> */
+
+  /* Symbol used as decimal point.  */
+  char *decimal_point;
+  /* Symbol used to separate groups of digits to the left of the decimal
+     point.  */
+  char *thousands_sep;
+  /* Definition of the size of groups of digits to the left of the decimal
+     point.  */
+  char *grouping;
+
+  /* Members that depend on the LC_MONETARY category of the locale.  See
+     <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_03> */
+
+  /* Symbol used as decimal point.  */
+  char *mon_decimal_point;
+  /* Symbol used to separate groups of digits to the left of the decimal
+     point.  */
+  char *mon_thousands_sep;
+  /* Definition of the size of groups of digits to the left of the decimal
+     point.  */
+  char *mon_grouping;
+  /* Sign used to indicate a value >= 0.  */
+  char *positive_sign;
+  /* Sign used to indicate a value < 0.  */
+  char *negative_sign;
+
+  /* For formatting local currency.  */
+  /* Currency symbol (3 characters) followed by separator (1 character).  */
+  char *currency_symbol;
+  /* Number of digits after the decimal point.  */
+  char frac_digits;
+  /* For values >= 0: 1 if the currency symbol precedes the number, 0 if it
+     comes after the number.  */
+  char p_cs_precedes;
+  /* For values >= 0: Position of the sign.  */
+  char p_sign_posn;
+  /* For values >= 0: Placement of spaces between currency symbol, sign, and
+     number.  */
+  char p_sep_by_space;
+  /* For values < 0: 1 if the currency symbol precedes the number, 0 if it
+     comes after the number.  */
+  char n_cs_precedes;
+  /* For values < 0: Position of the sign.  */
+  char n_sign_posn;
+  /* For values < 0: Placement of spaces between currency symbol, sign, and
+     number.  */
+  char n_sep_by_space;
+
+  /* For formatting international currency.  */
+  /* Currency symbol (3 characters) followed by separator (1 character).  */
+  char *int_curr_symbol;
+  /* Number of digits after the decimal point.  */
+  char int_frac_digits;
+  /* For values >= 0: 1 if the currency symbol precedes the number, 0 if it
+     comes after the number.  */
+  char int_p_cs_precedes;
+  /* For values >= 0: Position of the sign.  */
+  char int_p_sign_posn;
+  /* For values >= 0: Placement of spaces between currency symbol, sign, and
+     number.  */
+  char int_p_sep_by_space;
+  /* For values < 0: 1 if the currency symbol precedes the number, 0 if it
+     comes after the number.  */
+  char int_n_cs_precedes;
+  /* For values < 0: Position of the sign.  */
+  char int_n_sign_posn;
+  /* For values < 0: Placement of spaces between currency symbol, sign, and
+     number.  */
+  char int_n_sep_by_space;
+};
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef localeconv
+#   define localeconv rpl_localeconv
+#  endif
+_GL_FUNCDECL_RPL (localeconv, struct lconv *, (void));
+_GL_CXXALIAS_RPL (localeconv, struct lconv *, (void));
+# else
+_GL_CXXALIAS_SYS (localeconv, struct lconv *, (void));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (localeconv);
+# endif
+#elif 0
+# undef localeconv
+# define localeconv localeconv_used_without_requesting_gnulib_module_localeconv
+#elif defined GNULIB_POSIXCHECK
+# undef localeconv
+# if HAVE_RAW_DECL_LOCALECONV
+_GL_WARN_ON_USE (localeconv,
+                 "localeconv returns too few information on some platforms - "
+                 "use gnulib module localeconv for portability");
+# endif
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef setlocale
+#   define setlocale rpl_setlocale
+#   define GNULIB_defined_setlocale 1
+#  endif
+_GL_FUNCDECL_RPL (setlocale, char *, (int category, const char *locale));
+_GL_CXXALIAS_RPL (setlocale, char *, (int category, const char *locale));
+# else
+_GL_CXXALIAS_SYS (setlocale, char *, (int category, const char *locale));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (setlocale);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef setlocale
+# if HAVE_RAW_DECL_SETLOCALE
+_GL_WARN_ON_USE (setlocale, "setlocale works differently on native Windows - "
+                 "use gnulib module setlocale for portability");
+# endif
+#endif
+
+#if 1
+/* Included here for convenience.  */
+# include "setlocale_null.h"
+#endif
+
+#if /*@GNULIB_NEWLOCALE@ ||*/ (0 && 0 && 1)
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef newlocale
+#   define newlocale rpl_newlocale
+#   define GNULIB_defined_newlocale 1
+#  endif
+_GL_FUNCDECL_RPL (newlocale, locale_t,
+                  (int category_mask, const char *name, locale_t base)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (newlocale, locale_t,
+                  (int category_mask, const char *name, locale_t base));
+# else
+#  if 1
+_GL_CXXALIAS_SYS (newlocale, locale_t,
+                  (int category_mask, const char *name, locale_t base));
+#  endif
+# endif
+# if 1
+_GL_CXXALIASWARN (newlocale);
+# endif
+# if 1 || 0
+#  ifndef HAVE_WORKING_NEWLOCALE
+#   define HAVE_WORKING_NEWLOCALE 1
+#  endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef newlocale
+# if HAVE_RAW_DECL_NEWLOCALE
+_GL_WARN_ON_USE (newlocale, "newlocale is not portable");
+# endif
+#endif
+
+#if 0 || (0 && 0 && 1)
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef duplocale
+#   define duplocale rpl_duplocale
+#   define GNULIB_defined_duplocale 1
+#  endif
+_GL_FUNCDECL_RPL (duplocale, locale_t, (locale_t locale) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (duplocale, locale_t, (locale_t locale));
+# else
+#  if 1
+_GL_CXXALIAS_SYS (duplocale, locale_t, (locale_t locale));
+#  endif
+# endif
+# if 1
+_GL_CXXALIASWARN (duplocale);
+# endif
+# if 1 || 0
+#  ifndef HAVE_WORKING_DUPLOCALE
+#   define HAVE_WORKING_DUPLOCALE 1
+#  endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef duplocale
+# if HAVE_RAW_DECL_DUPLOCALE
+_GL_WARN_ON_USE (duplocale, "duplocale is buggy on some glibc systems - "
+                 "use gnulib module duplocale for portability");
+# endif
+#endif
+
+#if /*@GNULIB_FREELOCALE@ ||*/ (0 && 0 && 1)
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef freelocale
+#   define freelocale rpl_freelocale
+#   define GNULIB_defined_freelocale 1
+#  endif
+_GL_FUNCDECL_RPL (freelocale, void, (locale_t locale) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (freelocale, void, (locale_t locale));
+# else
+#  if 1
+/* Need to cast, because on FreeBSD and Mac OS X 10.13, the return type is
+                                   int.  */
+_GL_CXXALIAS_SYS_CAST (freelocale, void, (locale_t locale));
+#  endif
+# endif
+# if 1
+_GL_CXXALIASWARN (freelocale);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef freelocale
+# if HAVE_RAW_DECL_FREELOCALE
+_GL_WARN_ON_USE (freelocale, "freelocale is not portable");
+# endif
+#endif
+
+#endif /* _GL_LOCALE_H */
+#endif /* _GL_LOCALE_H */
+#endif /* !(__need_locale_t || _GL_ALREADY_INCLUDING_LOCALE_H) */
diff --git a/linux_glibc-lib/malloc/scratch_buffer.gl.h b/linux_glibc-lib/malloc/scratch_buffer.gl.h
new file mode 100644
index 0000000..1870f8e
--- /dev/null
+++ b/linux_glibc-lib/malloc/scratch_buffer.gl.h
@@ -0,0 +1,148 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Variable-sized buffer with on-stack default allocation.
+   Copyright (C) 2015-2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _SCRATCH_BUFFER_H
+#define _SCRATCH_BUFFER_H
+
+/* Scratch buffers with a default stack allocation and fallback to
+   heap allocation.  It is expected that this function is used in this
+   way:
+
+     struct scratch_buffer tmpbuf;
+     scratch_buffer_init (&tmpbuf);
+
+     while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
+       if (!scratch_buffer_grow (&tmpbuf))
+	 return -1;
+
+     scratch_buffer_free (&tmpbuf);
+     return 0;
+
+   The allocation functions (scratch_buffer_grow,
+   scratch_buffer_grow_preserve, scratch_buffer_set_array_size) make
+   sure that the heap allocation, if any, is freed, so that the code
+   above does not have a memory leak.  The buffer still remains in a
+   state that can be deallocated using scratch_buffer_free, so a loop
+   like this is valid as well:
+
+     struct scratch_buffer tmpbuf;
+     scratch_buffer_init (&tmpbuf);
+
+     while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
+       if (!scratch_buffer_grow (&tmpbuf))
+	 break;
+
+     scratch_buffer_free (&tmpbuf);
+
+   scratch_buffer_grow and scratch_buffer_grow_preserve are guaranteed
+   to grow the buffer by at least 512 bytes.  This means that when
+   using the scratch buffer as a backing store for a non-character
+   array whose element size, in bytes, is 512 or smaller, the scratch
+   buffer only has to grow once to make room for at least one more
+   element.
+*/
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+/* Scratch buffer.  Must be initialized with scratch_buffer_init
+   before its use.  */
+struct scratch_buffer {
+  void *data;    /* Pointer to the beginning of the scratch area.  */
+  size_t length; /* Allocated space at the data pointer, in bytes.  */
+  union { max_align_t __align; char __c[1024]; } __space;
+};
+
+/* Initializes *BUFFER so that BUFFER->data points to BUFFER->__space
+   and BUFFER->length reflects the available space.  */
+static inline void
+scratch_buffer_init (struct scratch_buffer *buffer)
+{
+  buffer->data = buffer->__space.__c;
+  buffer->length = sizeof (buffer->__space);
+}
+
+/* Deallocates *BUFFER (if it was heap-allocated).  */
+static inline void
+scratch_buffer_free (struct scratch_buffer *buffer)
+{
+  if (buffer->data != buffer->__space.__c)
+    free (buffer->data);
+}
+
+/* Grow *BUFFER by some arbitrary amount.  The buffer contents is NOT
+   preserved.  Return true on success, false on allocation failure (in
+   which case the old buffer is freed).  On success, the new buffer is
+   larger than the previous size.  On failure, *BUFFER is deallocated,
+   but remains in a free-able state, and errno is set.  */
+bool __libc_scratch_buffer_grow (struct scratch_buffer *buffer);
+
+/* Alias for __libc_scratch_buffer_grow.  */
+static inline _GL_ATTRIBUTE_ALWAYS_INLINE bool
+scratch_buffer_grow (struct scratch_buffer *buffer)
+{
+  return _GL_LIKELY (__libc_scratch_buffer_grow (buffer));
+}
+
+/* Like __libc_scratch_buffer_grow, but preserve the old buffer
+   contents on success, as a prefix of the new buffer.  */
+bool __libc_scratch_buffer_grow_preserve (struct scratch_buffer *buffer);
+
+/* Alias for __libc_scratch_buffer_grow_preserve.  */
+static inline _GL_ATTRIBUTE_ALWAYS_INLINE bool
+scratch_buffer_grow_preserve (struct scratch_buffer *buffer)
+{
+  return _GL_LIKELY (__libc_scratch_buffer_grow_preserve (buffer));
+}
+
+/* Grow *BUFFER so that it can store at least NELEM elements of SIZE
+   bytes.  The buffer contents are NOT preserved.  Both NELEM and SIZE
+   can be zero.  Return true on success, false on allocation failure
+   (in which case the old buffer is freed, but *BUFFER remains in a
+   free-able state, and errno is set).  It is unspecified whether this
+   function can reduce the array size.  */
+bool __libc_scratch_buffer_set_array_size (struct scratch_buffer *buffer,
+					   size_t nelem, size_t size);
+
+/* Alias for __libc_scratch_set_array_size.  */
+static inline _GL_ATTRIBUTE_ALWAYS_INLINE bool
+scratch_buffer_set_array_size (struct scratch_buffer *buffer,
+			       size_t nelem, size_t size)
+{
+  return _GL_LIKELY (__libc_scratch_buffer_set_array_size
+			 (buffer, nelem, size));
+}
+
+/* Return a copy of *BUFFER's first SIZE bytes as a heap-allocated block,
+   deallocating *BUFFER if it was heap-allocated.  SIZE must be at
+   most *BUFFER's size.  Return NULL (setting errno) on memory
+   exhaustion.  */
+void *__libc_scratch_buffer_dupfree (struct scratch_buffer *buffer,
+                                     size_t size);
+
+/* Alias for __libc_scratch_dupfree.  */
+static inline _GL_ATTRIBUTE_ALWAYS_INLINE void *
+scratch_buffer_dupfree (struct scratch_buffer *buffer, size_t size)
+{
+  void *r = __libc_scratch_buffer_dupfree (buffer, size);
+  return _GL_LIKELY (r != NULL) ? r : NULL;
+}
+
+#endif /* _SCRATCH_BUFFER_H */
diff --git a/linux_glibc-lib/math.h b/linux_glibc-lib/math.h
index d2a223a..f879672 100644
--- a/linux_glibc-lib/math.h
+++ b/linux_glibc-lib/math.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <math.h>.
 
-   Copyright (C) 2002-2003, 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002-2003, 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_MATH_H
@@ -23,9 +23,24 @@
 #endif
 
 
-/* The include_next requires a split double-inclusion guard.  */
+#if defined _GL_INCLUDING_MATH_H
+/* Special invocation convention:
+   - On FreeBSD 12.2 we have a sequence of nested includes
+     <math.h> -> <stdlib.h> -> <sys/wait.h> -> <sys/types.h> -> <sys/select.h>
+       -> <signal.h> -> <pthread.h> -> <stdlib.h> -> <math.h>
+     In this situation, the functions are not yet declared, therefore we cannot
+     provide the C++ aliases.  */
+
 #include_next <math.h>
 
+#else
+/* Normal invocation convention.  */
+
+/* The include_next requires a split double-inclusion guard.  */
+#define _GL_INCLUDING_MATH_H
+#include_next <math.h>
+#undef _GL_INCLUDING_MATH_H
+
 #ifndef _GL_MATH_H
 #define _GL_MATH_H
 
@@ -42,21 +57,31 @@
 # define _GL_MATH_INLINE _GL_INLINE
 #endif
 
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The attribute __const__ was added in gcc 2.95.  */
+#ifndef _GL_ATTRIBUTE_CONST
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) || defined __clang__
+#  define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
+# else
+#  define _GL_ATTRIBUTE_CONST /* empty */
+# endif
+#endif
+
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -191,6 +216,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -216,6 +251,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -313,7 +356,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -341,14 +384,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -362,26 +402,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -390,19 +430,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -478,6 +518,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -490,24 +537,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -729,7 +787,9 @@
 _GL_FUNCDECL_SYS (acosl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (acosl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (acosl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef acosl
 # if HAVE_RAW_DECL_ACOSL
@@ -769,7 +829,9 @@
 _GL_FUNCDECL_SYS (asinl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (asinl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (asinl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef asinl
 # if HAVE_RAW_DECL_ASINL
@@ -809,7 +871,9 @@
 _GL_FUNCDECL_SYS (atanl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (atanl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (atanl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef atanl
 # if HAVE_RAW_DECL_ATANL
@@ -873,7 +937,7 @@
 # endif
 _GL_CXXALIAS_SYS (cbrt, double, (double x));
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (cbrt);
+_GL_CXXALIASWARN1 (cbrt, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef cbrt
@@ -943,7 +1007,7 @@
 _GL_CXXALIAS_SYS (ceil, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (ceil);
+_GL_CXXALIASWARN1 (ceil, double, (double x));
 # endif
 #endif
 
@@ -962,7 +1026,9 @@
 #  endif
 _GL_CXXALIAS_SYS (ceill, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (ceill);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef ceill
 # if HAVE_RAW_DECL_CEILL
@@ -974,6 +1040,7 @@
 
 #if 0
 # if !1
+#  undef copysignf
 _GL_FUNCDECL_SYS (copysignf, float, (float x, float y));
 # endif
 _GL_CXXALIAS_SYS (copysignf, float, (float x, float y));
@@ -992,7 +1059,7 @@
 # endif
 _GL_CXXALIAS_SYS (copysign, double, (double x, double y));
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (copysign);
+_GL_CXXALIASWARN1 (copysign, double, (double x, double y));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef copysign
@@ -1047,7 +1114,9 @@
 _GL_FUNCDECL_SYS (cosl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (cosl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (cosl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef cosl
 # if HAVE_RAW_DECL_COSL
@@ -1121,7 +1190,9 @@
 #  endif
 _GL_CXXALIAS_SYS (expl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (expl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef expl
 # if HAVE_RAW_DECL_EXPL
@@ -1160,7 +1231,7 @@
 _GL_CXXALIAS_SYS (exp2, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (exp2);
+_GL_CXXALIASWARN1 (exp2, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef exp2
@@ -1233,7 +1304,7 @@
 _GL_CXXALIAS_SYS (expm1, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (expm1);
+_GL_CXXALIASWARN1 (expm1, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef expm1
@@ -1276,7 +1347,9 @@
 _GL_FUNCDECL_SYS (fabsf, float, (float x));
 # endif
 _GL_CXXALIAS_SYS (fabsf, float, (float x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fabsf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef fabsf
 # if HAVE_RAW_DECL_FABSF
@@ -1300,7 +1373,9 @@
 #  endif
 _GL_CXXALIAS_SYS (fabsl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fabsl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef fabsl
 # if HAVE_RAW_DECL_FABSL
@@ -1346,7 +1421,7 @@
 _GL_CXXALIAS_SYS (floor, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (floor);
+_GL_CXXALIASWARN1 (floor, double, (double x));
 # endif
 #endif
 
@@ -1365,7 +1440,9 @@
 #  endif
 _GL_CXXALIAS_SYS (floorl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (floorl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef floorl
 # if HAVE_RAW_DECL_FLOORL
@@ -1385,6 +1462,7 @@
 _GL_CXXALIAS_RPL (fmaf, float, (float x, float y, float z));
 # else
 #  if !1
+#   undef fmaf
 _GL_FUNCDECL_SYS (fmaf, float, (float x, float y, float z));
 #  endif
 _GL_CXXALIAS_SYS (fmaf, float, (float x, float y, float z));
@@ -1408,12 +1486,13 @@
 _GL_CXXALIAS_RPL (fma, double, (double x, double y, double z));
 # else
 #  if !1
+#   undef fma
 _GL_FUNCDECL_SYS (fma, double, (double x, double y, double z));
 #  endif
 _GL_CXXALIAS_SYS (fma, double, (double x, double y, double z));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fma);
+_GL_CXXALIASWARN1 (fma, double, (double x, double y, double z));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef fma
@@ -1490,7 +1569,7 @@
 _GL_CXXALIAS_SYS (fmod, double, (double x, double y));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fmod);
+_GL_CXXALIASWARN1 (fmod, double, (double x, double y));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef fmod
@@ -1515,7 +1594,9 @@
 #  endif
 _GL_CXXALIAS_SYS (fmodl, long double, (long double x, long double y));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fmodl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef fmodl
 # if HAVE_RAW_DECL_FMODL
@@ -1547,7 +1628,9 @@
 #  endif
 _GL_CXXALIAS_SYS (frexpf, float, (float x, int *expptr));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (frexpf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef frexpf
 # if HAVE_RAW_DECL_FREXPF
@@ -1609,7 +1692,9 @@
 # endif
 #endif
 #if 1 && !(0 && !1)
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (frexpl);
+# endif
 #endif
 #if !1 && defined GNULIB_POSIXCHECK
 # undef frexpl
@@ -1635,7 +1720,9 @@
 #  endif
 _GL_CXXALIAS_SYS (hypotf, float, (float x, float y));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (hypotf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef hypotf
 # if HAVE_RAW_DECL_HYPOTF
@@ -1657,7 +1744,7 @@
 _GL_CXXALIAS_SYS (hypot, double, (double x, double y));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (hypot);
+_GL_CXXALIASWARN1 (hypot, double, (double x, double y));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef hypot
@@ -1682,7 +1769,9 @@
 #  endif
 _GL_CXXALIAS_SYS (hypotl, long double, (long double x, long double y));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (hypotl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef hypotl
 # if HAVE_RAW_DECL_HYPOTL
@@ -1730,7 +1819,7 @@
 _GL_CXXALIAS_SYS (ilogb, int, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (ilogb);
+_GL_CXXALIASWARN1 (ilogb, int, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef ilogb
@@ -1750,6 +1839,7 @@
 _GL_CXXALIAS_RPL (ilogbl, int, (long double x));
 # else
 #  if !1
+#   undef ilogbl
 _GL_FUNCDECL_SYS (ilogbl, int, (long double x));
 #  endif
 _GL_CXXALIAS_SYS (ilogbl, int, (long double x));
@@ -1764,6 +1854,55 @@
 #endif
 
 
+#if 1
+/* On native Windows, map 'j0' to '_j0', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::j0 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef j0
+#   define j0 _j0
+#  endif
+_GL_CXXALIAS_MDA (j0, double, (double x));
+# else
+_GL_CXXALIAS_SYS (j0, double, (double x));
+# endif
+_GL_CXXALIASWARN (j0);
+#endif
+
+#if 1
+/* On native Windows, map 'j1' to '_j1', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::j1 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef j1
+#   define j1 _j1
+#  endif
+_GL_CXXALIAS_MDA (j1, double, (double x));
+# else
+_GL_CXXALIAS_SYS (j1, double, (double x));
+# endif
+_GL_CXXALIASWARN (j1);
+#endif
+
+#if 1
+/* On native Windows, map 'jn' to '_jn', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::jn always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef jn
+#   define jn _jn
+#  endif
+_GL_CXXALIAS_MDA (jn, double, (int n, double x));
+# else
+_GL_CXXALIAS_SYS (jn, double, (int n, double x));
+# endif
+_GL_CXXALIASWARN (jn);
+#endif
+
+
 /* Return x * 2^exp.  */
 #if 0
 # if !1
@@ -1771,7 +1910,9 @@
 _GL_FUNCDECL_SYS (ldexpf, float, (float x, int exp));
 # endif
 _GL_CXXALIAS_SYS (ldexpf, float, (float x, int exp));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (ldexpf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef ldexpf
 # if HAVE_RAW_DECL_LDEXPF
@@ -1797,7 +1938,9 @@
 # endif
 #endif
 #if 1
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (ldexpl);
+# endif
 #endif
 #if !1 && defined GNULIB_POSIXCHECK
 # undef ldexpl
@@ -1844,7 +1987,7 @@
 _GL_CXXALIAS_SYS (log, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log);
+_GL_CXXALIASWARN1 (log, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef log
@@ -1869,7 +2012,9 @@
 #  endif
 _GL_CXXALIAS_SYS (logl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (logl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef logl
 # if HAVE_RAW_DECL_LOGL
@@ -1915,7 +2060,7 @@
 _GL_CXXALIAS_SYS (log10, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log10);
+_GL_CXXALIASWARN1 (log10, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef log10
@@ -1940,7 +2085,9 @@
 #  endif
 _GL_CXXALIAS_SYS (log10l, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (log10l);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef log10l
 # if HAVE_RAW_DECL_LOG10L
@@ -1988,7 +2135,7 @@
 _GL_CXXALIAS_SYS (log1p, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log1p);
+_GL_CXXALIASWARN1 (log1p, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef log1p
@@ -2062,7 +2209,7 @@
 _GL_CXXALIAS_SYS (log2, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log2);
+_GL_CXXALIASWARN1 (log2, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef log2
@@ -2134,7 +2281,7 @@
 _GL_CXXALIAS_SYS (logb, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (logb);
+_GL_CXXALIASWARN1 (logb, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef logb
@@ -2204,7 +2351,7 @@
 _GL_CXXALIAS_SYS (modf, double, (double x, double *iptr));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (modf);
+_GL_CXXALIASWARN1 (modf, double, (double x, double *iptr));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef modf
@@ -2231,7 +2378,9 @@
 #  endif
 _GL_CXXALIAS_SYS (modfl, long double, (long double x, long double *iptr));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (modfl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef modfl
 # if HAVE_RAW_DECL_MODFL
@@ -2295,7 +2444,7 @@
 _GL_CXXALIAS_SYS (remainder, double, (double x, double y));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (remainder);
+_GL_CXXALIASWARN1 (remainder, double, (double x, double y));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef remainder
@@ -2352,7 +2501,7 @@
 # endif
 _GL_CXXALIAS_SYS (rint, double, (double x));
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (rint);
+_GL_CXXALIASWARN1 (rint, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef rint
@@ -2424,7 +2573,7 @@
 _GL_CXXALIAS_SYS (round, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (round);
+_GL_CXXALIASWARN1 (round, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef round
@@ -2471,7 +2620,7 @@
 _GL_CXXALIAS_RPL (sinf, float, (float x));
 # else
 #  if !1
- #  undef sinf
+#   undef sinf
 _GL_FUNCDECL_SYS (sinf, float, (float x));
 #  endif
 _GL_CXXALIAS_SYS (sinf, float, (float x));
@@ -2491,7 +2640,9 @@
 _GL_FUNCDECL_SYS (sinl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (sinl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (sinl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef sinl
 # if HAVE_RAW_DECL_SINL
@@ -2565,7 +2716,9 @@
 #  endif
 _GL_CXXALIAS_SYS (sqrtl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (sqrtl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef sqrtl
 # if HAVE_RAW_DECL_SQRTL
@@ -2605,7 +2758,9 @@
 _GL_FUNCDECL_SYS (tanl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (tanl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (tanl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef tanl
 # if HAVE_RAW_DECL_TANL
@@ -2678,7 +2833,7 @@
 _GL_CXXALIAS_SYS (trunc, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (trunc);
+_GL_CXXALIASWARN1 (trunc, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef trunc
@@ -2712,6 +2867,55 @@
 #endif
 
 
+#if 1
+/* On native Windows, map 'y0' to '_y0', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::y0 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef y0
+#   define y0 _y0
+#  endif
+_GL_CXXALIAS_MDA (y0, double, (double x));
+# else
+_GL_CXXALIAS_SYS (y0, double, (double x));
+# endif
+_GL_CXXALIASWARN (y0);
+#endif
+
+#if 1
+/* On native Windows, map 'y1' to '_y1', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::y1 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef y1
+#   define y1 _y1
+#  endif
+_GL_CXXALIAS_MDA (y1, double, (double x));
+# else
+_GL_CXXALIAS_SYS (y1, double, (double x));
+# endif
+_GL_CXXALIASWARN (y1);
+#endif
+
+#if 1
+/* On native Windows, map 'yn' to '_yn', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::yn always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef yn
+#   define yn _yn
+#  endif
+_GL_CXXALIAS_MDA (yn, double, (int n, double x));
+# else
+_GL_CXXALIAS_SYS (yn, double, (int n, double x));
+# endif
+_GL_CXXALIASWARN (yn);
+#endif
+
+
 /* Definitions of function-like macros come here, after the function
    declarations.  */
 
@@ -2731,7 +2935,7 @@
 #  if defined isfinite || defined GNULIB_NAMESPACE
 _GL_MATH_CXX_REAL_FLOATING_DECL_1 (isfinite)
 #   undef isfinite
-#   if __GNUC__ >= 6 || (defined __clang__ && !defined _AIX)
+#   if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || defined _AIX || (defined _WIN32 && !defined __CYGWIN__)))
   /* This platform's <cmath> possibly defines isfinite through a set of inline
      functions.  */
 _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isfinite, rpl_isfinite, bool)
@@ -2765,7 +2969,7 @@
 #  if defined isinf || defined GNULIB_NAMESPACE
 _GL_MATH_CXX_REAL_FLOATING_DECL_1 (isinf)
 #   undef isinf
-#   if __GNUC__ >= 6 || defined __clang__
+#   if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || (defined _WIN32 && !defined __CYGWIN__)))
   /* This platform's <cmath> possibly defines isinf through a set of inline
      functions.  */
 _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isinf, rpl_isinf, bool)
@@ -2786,13 +2990,14 @@
 
 #if 1
 /* Test for NaN for 'float' numbers.  */
-# if 0
+# if 1
 /* The original <math.h> included above provides a declaration of isnan macro
    or (older) isnanf function.  */
-#  if __GNUC__ >= 4
-    /* GCC 4.0 and newer provides three built-ins for isnan.  */
+#  if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+    /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
+       GCC >= 4.0 also provides __builtin_isnanf, but clang doesn't.  */
 #   undef isnanf
-#   define isnanf(x) __builtin_isnanf ((float)(x))
+#   define isnanf(x) __builtin_isnan ((float)(x))
 #  elif defined isnan
 #   undef isnanf
 #   define isnanf(x) isnan ((float)(x))
@@ -2812,8 +3017,8 @@
 # if 1
 /* The original <math.h> included above provides a declaration of isnan
    macro.  */
-#  if __GNUC__ >= 4
-    /* GCC 4.0 and newer provides three built-ins for isnan.  */
+#  if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+    /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.  */
 #   undef isnand
 #   define isnand(x) __builtin_isnan ((double)(x))
 #  else
@@ -2830,13 +3035,14 @@
 
 #if 1
 /* Test for NaN for 'long double' numbers.  */
-# if 0
+# if 1
 /* The original <math.h> included above provides a declaration of isnan
    macro or (older) isnanl function.  */
-#  if __GNUC__ >= 4
-    /* GCC 4.0 and newer provides three built-ins for isnan.  */
+#  if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+    /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
+       GCC >= 4.0 also provides __builtin_isnanl, but clang doesn't.  */
 #   undef isnanl
-#   define isnanl(x) __builtin_isnanl ((long double)(x))
+#   define isnanl(x) __builtin_isnan ((long double)(x))
 #  elif defined isnan
 #   undef isnanl
 #   define isnanl(x) isnan ((long double)(x))
@@ -2851,25 +3057,25 @@
 
 /* This must come *after* the snippets for GNULIB_ISNANF and GNULIB_ISNANL!  */
 #if 1
-# if 1
+# if 0
 /* We can't just use the isnanf macro (e.g.) as exposed by
    isnanf.h (e.g.) here, because those may end up being macros
    that recursively expand back to isnan.  So use the gnulib
    replacements for them directly. */
-#  if 0 && __GNUC__ >= 4
-#   define gl_isnan_f(x) __builtin_isnanf ((float)(x))
+#  if 1 && (__GNUC__ >= 4) || (__clang_major__ >= 4)
+#   define gl_isnan_f(x) __builtin_isnan ((float)(x))
 #  else
 _GL_EXTERN_C int rpl_isnanf (float x);
 #   define gl_isnan_f(x) rpl_isnanf (x)
 #  endif
-#  if 1 && __GNUC__ >= 4
+#  if 1 && (__GNUC__ >= 4) || (__clang_major__ >= 4)
 #   define gl_isnan_d(x) __builtin_isnan ((double)(x))
 #  else
 _GL_EXTERN_C int rpl_isnand (double x);
 #   define gl_isnan_d(x) rpl_isnand (x)
 #  endif
-#  if 0 && __GNUC__ >= 4
-#   define gl_isnan_l(x) __builtin_isnanl ((long double)(x))
+#  if 1 && (__GNUC__ >= 4) || (__clang_major__ >= 4)
+#   define gl_isnan_l(x) __builtin_isnan ((long double)(x))
 #  else
 _GL_EXTERN_C int rpl_isnanl (long double x) _GL_ATTRIBUTE_CONST;
 #   define gl_isnan_l(x) rpl_isnanl (x)
@@ -2879,18 +3085,18 @@
    (sizeof (x) == sizeof (long double) ? gl_isnan_l (x) : \
     sizeof (x) == sizeof (double) ? gl_isnan_d (x) : \
     gl_isnan_f (x))
-# elif __GNUC__ >= 4
+# elif (__GNUC__ >= 4) || (__clang_major__ >= 4)
 #  undef isnan
 #  define isnan(x) \
-   (sizeof (x) == sizeof (long double) ? __builtin_isnanl ((long double)(x)) : \
+   (sizeof (x) == sizeof (long double) ? __builtin_isnan ((long double)(x)) : \
     sizeof (x) == sizeof (double) ? __builtin_isnan ((double)(x)) : \
-    __builtin_isnanf ((float)(x)))
+    __builtin_isnan ((float)(x)))
 # endif
 # ifdef __cplusplus
 #  if defined isnan || defined GNULIB_NAMESPACE
 _GL_MATH_CXX_REAL_FLOATING_DECL_1 (isnan)
 #   undef isnan
-#   if __GNUC__ >= 6 || defined __clang__
+#   if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__ && __clang_major__ < 12) || (defined __FreeBSD__ && __clang_major__ < 7) || defined __OpenBSD__ || (defined _WIN32 && !defined __CYGWIN__)))
   /* This platform's <cmath> possibly defines isnan through a set of inline
      functions.  */
 _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isnan, rpl_isnan, bool)
@@ -2918,7 +3124,7 @@
 # if (1 \
       && (!defined __cplusplus || __cplusplus < 201103))
 #  undef signbit
-   /* GCC 4.0 and newer provides three built-ins for signbit.  */
+   /* GCC >= 4.0 and clang provide three built-ins for signbit.  */
 #  define signbit(x) \
    (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
     sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
@@ -2929,7 +3135,7 @@
 _GL_EXTERN_C int gl_signbitf (float arg);
 _GL_EXTERN_C int gl_signbitd (double arg);
 _GL_EXTERN_C int gl_signbitl (long double arg);
-#  if __GNUC__ >= 2 && !defined __STRICT_ANSI__
+#  if (__GNUC__ >= 2 || defined __clang__) && !defined __STRICT_ANSI__
 #   define _GL_NUM_UINT_WORDS(type) \
       ((sizeof (type) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
 #   if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT && !defined gl_signbitf
@@ -2973,7 +3179,7 @@
 #  if defined signbit || defined GNULIB_NAMESPACE
 _GL_MATH_CXX_REAL_FLOATING_DECL_1 (signbit)
 #   undef signbit
-#   if __GNUC__ >= 6 || (defined __clang__ && !defined _AIX)
+#   if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || defined _AIX || (defined _WIN32 && !defined __CYGWIN__)))
   /* This platform's <cmath> possibly defines signbit through a set of inline
      functions.  */
 _GL_MATH_CXX_REAL_FLOATING_DECL_2 (signbit, rpl_signbit, bool)
@@ -2994,4 +3200,5 @@
 _GL_INLINE_HEADER_END
 
 #endif /* _GL_MATH_H */
+#endif /* _GL_INCLUDING_MATH_H */
 #endif /* _GL_MATH_H */
diff --git a/linux_glibc-lib/sched.h b/linux_glibc-lib/sched.h
index 41a8c71..9936111 100644
--- a/linux_glibc-lib/sched.h
+++ b/linux_glibc-lib/sched.h
@@ -1,18 +1,18 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <sched.h>.
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_SCHED_H
@@ -51,19 +51,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -198,6 +198,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -223,6 +233,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -320,7 +338,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -348,14 +366,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -369,19 +384,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -457,6 +472,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -469,24 +491,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -532,7 +565,9 @@
 #  endif
 _GL_CXXALIAS_SYS (sched_yield, int, (void));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (sched_yield);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef sched_yield
 # if HAVE_RAW_DECL_SCHED_YIELD
diff --git a/linux_glibc-lib/signal.h b/linux_glibc-lib/signal.h
index 2784a60..7ec43df 100644
--- a/linux_glibc-lib/signal.h
+++ b/linux_glibc-lib/signal.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <signal.h>.
 
-   Copyright (C) 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
@@ -56,32 +56,32 @@
 #ifndef _GL_SIGNAL_H
 #define _GL_SIGNAL_H
 
-/* Mac OS X 10.3, FreeBSD 6.4, OpenBSD 3.8, OSF/1 4.0, Solaris 2.6, Android
-   declare pthread_sigmask in <pthread.h>, not in <signal.h>.
+/* Mac OS X 10.3, FreeBSD 6.4, OpenBSD 3.8, OSF/1 4.0, Solaris 2.6, Android,
+   OS/2 kLIBC declare pthread_sigmask in <pthread.h>, not in <signal.h>.
    But avoid namespace pollution on glibc systems.*/
 #if (0 || defined GNULIB_POSIXCHECK) \
     && ((defined __APPLE__ && defined __MACH__) \
         || defined __FreeBSD__ || defined __OpenBSD__ || defined __osf__ \
-        || defined __sun || defined __ANDROID__) \
+        || defined __sun || defined __ANDROID__ || defined __KLIBC__) \
     && ! defined __GLIBC__
 # include <pthread.h>
 #endif
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -216,6 +216,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -241,6 +251,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -338,7 +356,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -366,14 +384,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -387,26 +402,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -415,19 +430,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -503,6 +518,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -515,24 +537,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -607,16 +640,24 @@
 #   define pthread_sigmask rpl_pthread_sigmask
 #  endif
 _GL_FUNCDECL_RPL (pthread_sigmask, int,
-                  (int how, const sigset_t *new_mask, sigset_t *old_mask));
+                  (int how,
+                   const sigset_t *restrict new_mask,
+                   sigset_t *restrict old_mask));
 _GL_CXXALIAS_RPL (pthread_sigmask, int,
-                  (int how, const sigset_t *new_mask, sigset_t *old_mask));
+                  (int how,
+                   const sigset_t *restrict new_mask,
+                   sigset_t *restrict old_mask));
 # else
 #  if !(1 || defined pthread_sigmask)
 _GL_FUNCDECL_SYS (pthread_sigmask, int,
-                  (int how, const sigset_t *new_mask, sigset_t *old_mask));
+                  (int how,
+                   const sigset_t *restrict new_mask,
+                   sigset_t *restrict old_mask));
 #  endif
 _GL_CXXALIAS_SYS (pthread_sigmask, int,
-                  (int how, const sigset_t *new_mask, sigset_t *old_mask));
+                  (int how,
+                   const sigset_t *restrict new_mask,
+                   sigset_t *restrict old_mask));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (pthread_sigmask);
@@ -769,10 +810,14 @@
 #  define SIG_SETMASK 1  /* blocked_set = *set; */
 #  define SIG_UNBLOCK 2  /* blocked_set = blocked_set & ~*set; */
 _GL_FUNCDECL_SYS (sigprocmask, int,
-                  (int operation, const sigset_t *set, sigset_t *old_set));
+                  (int operation,
+                   const sigset_t *restrict set,
+                   sigset_t *restrict old_set));
 # endif
 _GL_CXXALIAS_SYS (sigprocmask, int,
-                  (int operation, const sigset_t *set, sigset_t *old_set));
+                  (int operation,
+                   const sigset_t *restrict set,
+                   sigset_t *restrict old_set));
 _GL_CXXALIASWARN (sigprocmask);
 
 /* Install the handler FUNC for signal SIG, and return the previous
@@ -796,6 +841,12 @@
 _GL_CXXALIAS_RPL (signal, _gl_function_taking_int_returning_void_t,
                   (int sig, _gl_function_taking_int_returning_void_t func));
 # else
+/* On OpenBSD, the declaration of 'signal' may not be present at this point,
+   because it occurs in <sys/signal.h>, not <signal.h> directly.  */
+#  if defined __OpenBSD__
+_GL_FUNCDECL_SYS (signal, _gl_function_taking_int_returning_void_t,
+                  (int sig, _gl_function_taking_int_returning_void_t func));
+#  endif
 _GL_CXXALIAS_SYS (signal, _gl_function_taking_int_returning_void_t,
                   (int sig, _gl_function_taking_int_returning_void_t func));
 # endif
diff --git a/linux_glibc-lib/spawn.h b/linux_glibc-lib/spawn.h
index a8a4934..9fdc500 100644
--- a/linux_glibc-lib/spawn.h
+++ b/linux_glibc-lib/spawn.h
@@ -1,31 +1,48 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Definitions for POSIX spawn interface.
-   Copyright (C) 2000, 2003-2004, 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2003-2004, 2008-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
-#ifndef _GL_SPAWN_H
-
 #if __GNUC__ >= 3
 #pragma GCC system_header
 #endif
 
 
+#if defined _GL_ALREADY_INCLUDING_SPAWN_H
+/* Special invocation convention:
+   On OS/2 kLIBC, <spawn.h> includes <signal.h>. Then <signal.h> ->
+   <pthread.h> -> <sched.h> -> <spawn.h> are included by GNULIB.
+   In this situation, struct sched_param is not yet defined.  */
+
+#include_next <spawn.h>
+
+#else
+
+#ifndef _GL_SPAWN_H
+/* Normal invocation convention.  */
+
 /* The include_next requires a split double-inclusion guard.  */
 #if 1
+
+# define _GL_ALREADY_INCLUDING_SPAWN_H
+
 # include_next <spawn.h>
+
+# define _GL_ALREADY_INCLUDING_SPAWN_H
+
 #endif
 
 #ifndef _GL_SPAWN_H
@@ -44,28 +61,35 @@
 # define __THROW
 #endif
 
-/* GCC 2.95 and later have "__restrict"; C99 compilers have
+/* For plain 'restrict', use glibc's __restrict if defined.
+   Otherwise, GCC 2.95 and later have "__restrict"; C99 compilers have
    "restrict", and "configure" may have defined "restrict".
    Other compilers use __restrict, __restrict__, and _Restrict, and
    'configure' might #define 'restrict' to those words, so pick a
    different name.  */
 #ifndef _Restrict_
-# if 199901L <= __STDC_VERSION__
-#  define _Restrict_ restrict
-# elif 2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)
+# if defined __restrict \
+     || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+     || __clang_major__ >= 3
 #  define _Restrict_ __restrict
+# elif 199901L <= __STDC_VERSION__ || defined restrict
+#  define _Restrict_ restrict
 # else
 #  define _Restrict_
 # endif
 #endif
-/* gcc 3.1 and up support the [restrict] syntax.  Don't trust
-   sys/cdefs.h's definition of __restrict_arr, though, as it
-   mishandles gcc -ansi -pedantic.  */
+/* For the ISO C99 syntax
+     array_name[restrict]
+   use glibc's __restrict_arr if available.
+   Otherwise, GCC 3.1 and clang support this syntax (but not in C++ mode).
+   Other ISO C99 compilers support it as well.  */
 #ifndef _Restrict_arr_
-# if ((199901L <= __STDC_VERSION__                                      \
-       || ((3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__))     \
-           && !defined __STRICT_ANSI__))                                        \
-      && !defined __GNUG__)
+# ifdef __restrict_arr
+#  define _Restrict_arr_ __restrict_arr
+# elif ((199901L <= __STDC_VERSION__ \
+         || 3 < __GNUC__ + (1 <= __GNUC_MINOR__) \
+         || __clang_major__ >= 3) \
+        && !defined __cplusplus)
 #  define _Restrict_arr_ _Restrict_
 # else
 #  define _Restrict_arr_
@@ -74,19 +98,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -221,6 +245,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -246,6 +280,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -343,7 +385,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -371,14 +413,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -392,26 +431,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -420,19 +459,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -508,6 +547,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -520,24 +566,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -553,10 +610,10 @@
 
 
 /* Data structure to contain attributes for thread creation.  */
-#if 0 || (1 && !1)
+#if 1 || (1 && !1)
 # define posix_spawnattr_t rpl_posix_spawnattr_t
 #endif
-#if 0 || !1 || !1
+#if 1 || !1 || !1
 # if !GNULIB_defined_posix_spawnattr_t
 typedef struct
 {
@@ -575,10 +632,10 @@
 
 /* Data structure to contain information about the actions to be
    performed in the new process with respect to file descriptors.  */
-#if 0 || (1 && !1)
+#if 1 || (1 && !1)
 # define posix_spawn_file_actions_t rpl_posix_spawn_file_actions_t
 #endif
-#if 0 || !1 || !1
+#if 1 || !1 || !1
 # if !GNULIB_defined_posix_spawn_file_actions_t
 typedef struct
 {
@@ -602,7 +659,7 @@
 #  define POSIX_SPAWN_SETSCHEDULER 0
 # endif
 #else
-# if 0
+# if 1
 /* Use the values from the system, for better compatibility.  */
 /* But this implementation does not support AIX extensions.  */
 #  undef POSIX_SPAWN_FORK_HANDLERS
@@ -640,13 +697,13 @@
 #endif
 
 
-#if 0
+#if 1
 /* Spawn a new process executing PATH with the attributes describes in *ATTRP.
    Before running the process perform the actions described in FILE-ACTIONS.
 
    This function is a possible cancellation points and therefore not
    marked with __THROW. */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawn rpl_posix_spawn
 #  endif
@@ -698,7 +755,7 @@
 
    This function is a possible cancellation points and therefore not
    marked with __THROW.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnp rpl_posix_spawnp
 #  endif
@@ -740,7 +797,7 @@
 
 #if 1
 /* Initialize data structure with attributes for 'spawn' to default values.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_init rpl_posix_spawnattr_init
 #  endif
@@ -765,7 +822,7 @@
 
 #if 1
 /* Free resources associated with ATTR.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_destroy rpl_posix_spawnattr_destroy
 #  endif
@@ -792,7 +849,7 @@
 #if 0
 /* Store signal mask for signals with default handling from ATTR in
    SIGDEFAULT.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_getsigdefault rpl_posix_spawnattr_getsigdefault
 #  endif
@@ -826,7 +883,7 @@
 
 #if 0
 /* Set signal mask for signals with default handling in ATTR to SIGDEFAULT.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_setsigdefault rpl_posix_spawnattr_setsigdefault
 #  endif
@@ -860,7 +917,7 @@
 
 #if 0
 /* Store signal mask for the new process from ATTR in SIGMASK.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_getsigmask rpl_posix_spawnattr_getsigmask
 #  endif
@@ -894,7 +951,7 @@
 
 #if 1
 /* Set signal mask for the new process in ATTR to SIGMASK.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_setsigmask rpl_posix_spawnattr_setsigmask
 #  endif
@@ -928,7 +985,7 @@
 
 #if 0
 /* Get flag word from the attribute structure.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_getflags rpl_posix_spawnattr_getflags
 #  endif
@@ -962,7 +1019,7 @@
 
 #if 1
 /* Store flags in the attribute structure.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_setflags rpl_posix_spawnattr_setflags
 #  endif
@@ -992,7 +1049,7 @@
 
 #if 0
 /* Get process group ID from the attribute structure.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_getpgroup rpl_posix_spawnattr_getpgroup
 #  endif
@@ -1024,9 +1081,9 @@
 # endif
 #endif
 
-#if 0
+#if 1
 /* Store process group ID in the attribute structure.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_setpgroup rpl_posix_spawnattr_setpgroup
 #  endif
@@ -1056,7 +1113,7 @@
 
 #if 0
 /* Get scheduling policy from the attribute structure.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_getschedpolicy rpl_posix_spawnattr_getschedpolicy
 #  endif
@@ -1078,7 +1135,9 @@
                   (const posix_spawnattr_t *_Restrict_ __attr,
                    int *_Restrict_ __schedpolicy));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (posix_spawnattr_getschedpolicy);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef posix_spawnattr_getschedpolicy
 # if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSCHEDPOLICY
@@ -1090,7 +1149,7 @@
 
 #if 0
 /* Store scheduling policy in the attribute structure.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_setschedpolicy rpl_posix_spawnattr_setschedpolicy
 #  endif
@@ -1108,7 +1167,9 @@
 _GL_CXXALIAS_SYS (posix_spawnattr_setschedpolicy, int,
                   (posix_spawnattr_t *__attr, int __schedpolicy));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (posix_spawnattr_setschedpolicy);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef posix_spawnattr_setschedpolicy
 # if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSCHEDPOLICY
@@ -1120,7 +1181,7 @@
 
 #if 0
 /* Get scheduling parameters from the attribute structure.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_getschedparam rpl_posix_spawnattr_getschedparam
 #  endif
@@ -1142,7 +1203,9 @@
                   (const posix_spawnattr_t *_Restrict_ __attr,
                    struct sched_param *_Restrict_ __schedparam));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (posix_spawnattr_getschedparam);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef posix_spawnattr_getschedparam
 # if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSCHEDPARAM
@@ -1154,7 +1217,7 @@
 
 #if 0
 /* Store scheduling parameters in the attribute structure.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawnattr_setschedparam rpl_posix_spawnattr_setschedparam
 #  endif
@@ -1176,7 +1239,9 @@
                   (posix_spawnattr_t *_Restrict_ __attr,
                    const struct sched_param *_Restrict_ __schedparam));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (posix_spawnattr_setschedparam);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef posix_spawnattr_setschedparam
 # if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSCHEDPARAM
@@ -1189,7 +1254,7 @@
 
 #if 1
 /* Initialize data structure for file attribute for 'spawn' call.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawn_file_actions_init rpl_posix_spawn_file_actions_init
 #  endif
@@ -1219,7 +1284,7 @@
 
 #if 1
 /* Free resources associated with FILE-ACTIONS.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawn_file_actions_destroy rpl_posix_spawn_file_actions_destroy
 #  endif
@@ -1250,7 +1315,7 @@
 #if 1
 /* Add an action to FILE-ACTIONS which tells the implementation to call
    'open' for the given file during the 'spawn' call.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawn_file_actions_addopen rpl_posix_spawn_file_actions_addopen
 #  endif
@@ -1291,7 +1356,7 @@
 #if 1
 /* Add an action to FILE-ACTIONS which tells the implementation to call
    'close' for the given file descriptor during the 'spawn' call.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawn_file_actions_addclose rpl_posix_spawn_file_actions_addclose
 #  endif
@@ -1324,7 +1389,7 @@
 #if 1
 /* Add an action to FILE-ACTIONS which tells the implementation to call
    'dup2' for the given file descriptors during the 'spawn' call.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawn_file_actions_adddup2 rpl_posix_spawn_file_actions_adddup2
 #  endif
@@ -1358,7 +1423,7 @@
 # endif
 #endif
 
-#if 0
+#if 1
 /* Add an action to FILE-ACTIONS which tells the implementation to call
    'chdir' to the given directory during the 'spawn' call.  */
 # if 0
@@ -1373,7 +1438,7 @@
                   (posix_spawn_file_actions_t *_Restrict_ __file_actions,
                    const char *_Restrict_ __path));
 # else
-#  if !1
+#  if !0
 _GL_FUNCDECL_SYS (posix_spawn_file_actions_addchdir, int,
                   (posix_spawn_file_actions_t *_Restrict_ __file_actions,
                    const char *_Restrict_ __path)
@@ -1431,3 +1496,4 @@
 
 #endif /* _GL_SPAWN_H */
 #endif /* _GL_SPAWN_H */
+#endif
diff --git a/linux_glibc-lib/stdint.h b/linux_glibc-lib/stdint.h
index b0af07f..1735ed5 100644
--- a/linux_glibc-lib/stdint.h
+++ b/linux_glibc-lib/stdint.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
-/* Copyright (C) 2001-2002, 2004-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2001-2002, 2004-2021 Free Software Foundation, Inc.
    Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood.
    This file is part of gnulib.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /*
  * ISO C 99 <stdint.h> for platforms that lack it.
@@ -189,7 +189,7 @@
 typedef __int64 gl_int64_t;
 #   define int64_t gl_int64_t
 #   define GL_INT64_T
-#  elif 1
+#  else
 #   undef int64_t
 typedef long long int gl_int64_t;
 #   define int64_t gl_int64_t
@@ -210,7 +210,7 @@
 typedef unsigned __int64 gl_uint64_t;
 #   define uint64_t gl_uint64_t
 #   define GL_UINT64_T
-#  elif 1
+#  else
 #   undef uint64_t
 typedef unsigned long long int gl_uint64_t;
 #   define uint64_t gl_uint64_t
@@ -303,12 +303,11 @@
 /* kLIBC's <stdint.h> defines _INTPTR_T_DECLARED and needs its own
    definitions of intptr_t and uintptr_t (which use int and unsigned)
    to avoid clashes with declarations of system functions like sbrk.
-   Similarly, mingw 5.22 <crtdefs.h> defines _INTPTR_T_DEFINED and
-   _UINTPTR_T_DEFINED and needs its own definitions of intptr_t and
+   Similarly, MinGW WSL-5.4.1 <stdint.h> needs its own intptr_t and
    uintptr_t to avoid conflicting declarations of system functions like
    _findclose in <io.h>.  */
 # if !((defined __KLIBC__ && defined _INTPTR_T_DECLARED) \
-       || (defined __MINGW32__ && defined _INTPTR_T_DEFINED && defined _UINTPTR_T_DEFINED))
+       || defined __MINGW32__)
 #  undef intptr_t
 #  undef uintptr_t
 #  ifdef _WIN64
@@ -334,7 +333,7 @@
 # ifndef INTMAX_MAX
 #  undef INTMAX_C
 #  undef intmax_t
-#  if 1 && LONG_MAX >> 30 == 1
+#  if LONG_MAX >> 30 == 1
 typedef long long int gl_intmax_t;
 #   define intmax_t gl_intmax_t
 #  elif defined GL_INT64_T
@@ -348,7 +347,7 @@
 # ifndef UINTMAX_MAX
 #  undef UINTMAX_C
 #  undef uintmax_t
-#  if 1 && ULONG_MAX >> 31 == 1
+#  if ULONG_MAX >> 31 == 1
 typedef unsigned long long int gl_uintmax_t;
 #   define uintmax_t gl_uintmax_t
 #  elif defined GL_UINT64_T
@@ -581,11 +580,6 @@
    <wchar.h> -> <stdio.h> -> <getopt.h> -> <stdlib.h>, and the latter includes
    <stdint.h> and assumes its types are already defined.  */
 # if 1 && ! (defined WCHAR_MIN && defined WCHAR_MAX)
-  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-     included before <wchar.h>.  */
-#  include <stddef.h>
-#  include <stdio.h>
-#  include <time.h>
 #  define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
 #  include <wchar.h>
 #  undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
@@ -648,21 +642,21 @@
 #  define INT64_C(x) x##L
 # elif defined _MSC_VER
 #  define INT64_C(x) x##i64
-# elif 1
+# else
 #  define INT64_C(x) x##LL
 # endif
 # if ULONG_MAX >> 31 >> 31 >> 1 == 1
 #  define UINT64_C(x) x##UL
 # elif defined _MSC_VER
 #  define UINT64_C(x) x##ui64
-# elif 1
+# else
 #  define UINT64_C(x) x##ULL
 # endif
 
 /* 7.18.4.2. Macros for greatest-width integer constants */
 
 # ifndef INTMAX_C
-#  if 1 && LONG_MAX >> 30 == 1
+#  if LONG_MAX >> 30 == 1
 #   define INTMAX_C(x)   x##LL
 #  elif defined GL_INT64_T
 #   define INTMAX_C(x)   INT64_C(x)
@@ -672,7 +666,7 @@
 # endif
 
 # ifndef UINTMAX_C
-#  if 1 && ULONG_MAX >> 31 == 1
+#  if ULONG_MAX >> 31 == 1
 #   define UINTMAX_C(x)  x##ULL
 #  elif defined GL_UINT64_T
 #   define UINTMAX_C(x)  UINT64_C(x)
diff --git a/linux_glibc-lib/stdio.h b/linux_glibc-lib/stdio.h
index 5c925f0..de236e9 100644
--- a/linux_glibc-lib/stdio.h
+++ b/linux_glibc-lib/stdio.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <stdio.h>.
 
-   Copyright (C) 2004, 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 #pragma GCC system_header
@@ -57,61 +57,6 @@
    May also define off_t to a 64-bit type on native Windows.  */
 #include <sys/types.h>
 
-/* The __attribute__ feature is available in gcc versions 2.5 and later.
-   The __-protected variants of the attributes 'format' and 'printf' are
-   accepted by gcc versions 2.6.4 (effectively 2.7) and later.
-   We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
-   gnulib and libintl do '#define printf __printf__' when they override
-   the 'printf' function.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
-# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
-#else
-# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_PRINTF
-   indicates to GCC that the function takes a format string and arguments,
-   where the format string directives are the ones standardized by ISO C99
-   and POSIX.  */
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
-# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
-   _GL_ATTRIBUTE_FORMAT ((__gnu_printf__, formatstring_parameter, first_argument))
-#else
-# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
-   _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF,
-   except that it indicates to GCC that the supported format string directives
-   are the ones of the system printf(), rather than the ones standardized by
-   ISO C99 and POSIX.  */
-#if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
-# define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
-  _GL_ATTRIBUTE_FORMAT_PRINTF (formatstring_parameter, first_argument)
-#else
-# define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
-  _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_SCANF
-   indicates to GCC that the function takes a format string and arguments,
-   where the format string directives are the ones standardized by ISO C99
-   and POSIX.  */
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
-# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
-   _GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument))
-#else
-# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
-   _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF,
-   except that it indicates to GCC that the supported format string directives
-   are the ones of the system scanf(), rather than the ones standardized by
-   ISO C99 and POSIX.  */
-#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \
-  _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
-
 /* Solaris 10 and NetBSD 7.0 declare renameat in <unistd.h>, not in <stdio.h>.  */
 /* But in any case avoid namespace pollution on glibc systems.  */
 #if (0 || defined GNULIB_POSIXCHECK) && (defined __sun || defined __NetBSD__) \
@@ -147,21 +92,103 @@
 #endif
 
 
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.  */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if __GNUC__ >= 11
+#  define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+#  define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The __-protected variants of the attributes 'format' and 'printf' are
+   accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+   We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
+   gnulib and libintl do '#define printf __printf__' when they override
+   the 'printf' function.  */
+#ifndef _GL_ATTRIBUTE_FORMAT
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || defined __clang__
+#  define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+# else
+#  define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
+# endif
+#endif
+
+/* An __attribute__ __format__ specifier for a function that takes a format
+   string and arguments, where the format string directives are the ones
+   standardized by ISO C99 and POSIX.
+   _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD  */
+/* __gnu_printf__ is supported in GCC >= 4.4.  */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __gnu_printf__
+#else
+# define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __printf__
+#endif
+
+/* An __attribute__ __format__ specifier for a function that takes a format
+   string and arguments, where the format string directives are the ones of the
+   system printf(), rather than the ones standardized by ISO C99 and POSIX.
+   _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM  */
+/* On mingw, Gnulib sets __USE_MINGW_ANSI_STDIO in order to get closer to
+   the standards.  The macro GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU indicates
+   whether this change is effective.  On older mingw, it is not.  */
+#if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
+# define _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD
+#else
+# define _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM __printf__
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD
+   indicates to GCC that the function takes a format string and arguments,
+   where the format string directives are the ones standardized by ISO C99
+   and POSIX.  */
+#define _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD(formatstring_parameter, first_argument) \
+  _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, formatstring_parameter, first_argument))
+
+/* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD,
+   except that it indicates to GCC that the supported format string directives
+   are the ones of the system printf(), rather than the ones standardized by
+   ISO C99 and POSIX.  */
+#define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
+  _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM, formatstring_parameter, first_argument))
+
+/* _GL_ATTRIBUTE_FORMAT_SCANF
+   indicates to GCC that the function takes a format string and arguments,
+   where the format string directives are the ones standardized by ISO C99
+   and POSIX.  */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
+   _GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument))
+#else
+# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
+   _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF,
+   except that it indicates to GCC that the supported format string directives
+   are the ones of the system scanf(), rather than the ones standardized by
+   ISO C99 and POSIX.  */
+#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \
+  _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
+
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -296,6 +323,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -321,6 +358,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -418,7 +463,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -446,14 +491,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -467,26 +509,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -495,19 +537,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -583,6 +625,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -595,24 +644,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -645,17 +705,17 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define dprintf rpl_dprintf
 #  endif
-_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *restrict format, ...)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                                 _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *format, ...));
+_GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *restrict format, ...));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+_GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *restrict format, ...)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                                 _GL_ARG_NONNULL ((2)));
 #  endif
-_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *format, ...));
+_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *restrict format, ...));
 # endif
 _GL_CXXALIASWARN (dprintf);
 #elif defined GNULIB_POSIXCHECK
@@ -687,24 +747,84 @@
                  "use gnulib module fclose for portable POSIX compliance");
 #endif
 
+#if 1
+/* On native Windows, map 'fcloseall' to '_fcloseall', so that -loldnames is
+   not required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::fcloseall on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fcloseall
+#   define fcloseall _fcloseall
+#  endif
+_GL_CXXALIAS_MDA (fcloseall, int, (void));
+# else
+#  if 1
+#   if defined __FreeBSD__ || defined __DragonFly__
+_GL_CXXALIAS_SYS (fcloseall, void, (void));
+#   else
+_GL_CXXALIAS_SYS (fcloseall, int, (void));
+#   endif
+#  endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || 1
+_GL_CXXALIASWARN (fcloseall);
+# endif
+#endif
+
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef fdopen
 #   define fdopen rpl_fdopen
 #  endif
-_GL_FUNCDECL_RPL (fdopen, FILE *, (int fd, const char *mode)
-                                  _GL_ARG_NONNULL ((2)));
+_GL_FUNCDECL_RPL (fdopen, FILE *,
+                  (int fd, const char *mode)
+                  _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
 _GL_CXXALIAS_RPL (fdopen, FILE *, (int fd, const char *mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fdopen
+#   define fdopen _fdopen
+#  endif
+_GL_CXXALIAS_MDA (fdopen, FILE *, (int fd, const char *mode));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate fdopen with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (fdopen, FILE *,
+                  (int fd, const char *mode)
+                  _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+#  endif
 _GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
 # endif
 _GL_CXXALIASWARN (fdopen);
-#elif defined GNULIB_POSIXCHECK
-# undef fdopen
+#else
+# if 0 && __GNUC__ >= 11 && !defined fdopen
+/* For -Wmismatched-dealloc: Associate fdopen with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (fdopen, FILE *,
+                  (int fd, const char *mode)
+                  _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef fdopen
 /* Assume fdopen is always declared.  */
 _GL_WARN_ON_USE (fdopen, "fdopen on native Windows platforms is not POSIX compliant - "
                  "use gnulib module fdopen for portability");
+# elif 1
+/* On native Windows, map 'fdopen' to '_fdopen', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::fdopen always.  */
+#  if defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef fdopen
+#    define fdopen _fdopen
+#   endif
+_GL_CXXALIAS_MDA (fdopen, FILE *, (int fd, const char *mode));
+#  else
+_GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
+#  endif
+_GL_CXXALIASWARN (fdopen);
+# endif
 #endif
 
 #if 0
@@ -755,11 +875,14 @@
 #   undef fgets
 #   define fgets rpl_fgets
 #  endif
-_GL_FUNCDECL_RPL (fgets, char *, (char *s, int n, FILE *stream)
-                                 _GL_ARG_NONNULL ((1, 3)));
-_GL_CXXALIAS_RPL (fgets, char *, (char *s, int n, FILE *stream));
+_GL_FUNCDECL_RPL (fgets, char *,
+                  (char *restrict s, int n, FILE *restrict stream)
+                  _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (fgets, char *,
+                  (char *restrict s, int n, FILE *restrict stream));
 # else
-_GL_CXXALIAS_SYS (fgets, char *, (char *s, int n, FILE *stream));
+_GL_CXXALIAS_SYS (fgets, char *,
+                  (char *restrict s, int n, FILE *restrict stream));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fgets);
@@ -767,25 +890,58 @@
 #endif
 
 #if 1
+/* On native Windows, map 'fileno' to '_fileno', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::fileno always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fileno
+#   define fileno _fileno
+#  endif
+_GL_CXXALIAS_MDA (fileno, int, (FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (fileno, int, (FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (fileno);
+#endif
+
+#if 1
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef fopen
 #   define fopen rpl_fopen
 #  endif
-_GL_FUNCDECL_RPL (fopen, FILE *, (const char *filename, const char *mode)
-                                 _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (fopen, FILE *, (const char *filename, const char *mode));
+_GL_FUNCDECL_RPL (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+_GL_CXXALIAS_RPL (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode));
 # else
-_GL_CXXALIAS_SYS (fopen, FILE *, (const char *filename, const char *mode));
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate fopen with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+#  endif
+_GL_CXXALIAS_SYS (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fopen);
 # endif
-#elif defined GNULIB_POSIXCHECK
-# undef fopen
+#else
+# if 0 && __GNUC__ >= 11 && !defined fopen
+/* For -Wmismatched-dealloc: Associate fopen with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef fopen
 /* Assume fopen is always declared.  */
 _GL_WARN_ON_USE (fopen, "fopen on native Windows platforms is not POSIX compliant - "
                  "use gnulib module fopen for portability");
+# endif
 #endif
 
 #if 1 || 1
@@ -796,17 +952,21 @@
 #  endif
 #  define GNULIB_overrides_fprintf 1
 #  if 1 || 0
-_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
-                                _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (fprintf, int,
+                  (FILE *restrict fp, const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
 #  else
-_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3)
-                                _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (fprintf, int,
+                  (FILE *restrict fp, const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
 #  endif
-_GL_CXXALIAS_RPL (fprintf, int, (FILE *fp, const char *format, ...));
+_GL_CXXALIAS_RPL (fprintf, int,
+                  (FILE *restrict fp, const char *restrict format, ...));
 # else
-_GL_CXXALIAS_SYS (fprintf, int, (FILE *fp, const char *format, ...));
+_GL_CXXALIAS_SYS (fprintf, int,
+                  (FILE *restrict fp, const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fprintf);
@@ -872,11 +1032,14 @@
 #   undef fputs
 #   define fputs rpl_fputs
 #  endif
-_GL_FUNCDECL_RPL (fputs, int, (const char *string, FILE *stream)
-                              _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (fputs, int, (const char *string, FILE *stream));
+_GL_FUNCDECL_RPL (fputs, int,
+                  (const char *restrict string, FILE *restrict stream)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fputs, int,
+                  (const char *restrict string, FILE *restrict stream));
 # else
-_GL_CXXALIAS_SYS (fputs, int, (const char *string, FILE *stream));
+_GL_CXXALIAS_SYS (fputs, int,
+                  (const char *restrict string, FILE *restrict stream));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fputs);
@@ -889,11 +1052,17 @@
 #   undef fread
 #   define fread rpl_fread
 #  endif
-_GL_FUNCDECL_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream)
-                                 _GL_ARG_NONNULL ((4)));
-_GL_CXXALIAS_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream));
+_GL_FUNCDECL_RPL (fread, size_t,
+                  (void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream)
+                  _GL_ARG_NONNULL ((4)));
+_GL_CXXALIAS_RPL (fread, size_t,
+                  (void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream));
 # else
-_GL_CXXALIAS_SYS (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream));
+_GL_CXXALIAS_SYS (fread, size_t,
+                  (void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fread);
@@ -907,13 +1076,16 @@
 #   define freopen rpl_freopen
 #  endif
 _GL_FUNCDECL_RPL (freopen, FILE *,
-                  (const char *filename, const char *mode, FILE *stream)
+                  (const char *restrict filename, const char *restrict mode,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((2, 3)));
 _GL_CXXALIAS_RPL (freopen, FILE *,
-                  (const char *filename, const char *mode, FILE *stream));
+                  (const char *restrict filename, const char *restrict mode,
+                   FILE *restrict stream));
 # else
 _GL_CXXALIAS_SYS (freopen, FILE *,
-                  (const char *filename, const char *mode, FILE *stream));
+                  (const char *restrict filename, const char *restrict mode,
+                   FILE *restrict stream));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (freopen);
@@ -932,12 +1104,15 @@
 #   undef fscanf
 #   define fscanf rpl_fscanf
 #  endif
-_GL_FUNCDECL_RPL (fscanf, int, (FILE *stream, const char *format, ...)
-                               _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3)
-                               _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (fscanf, int, (FILE *stream, const char *format, ...));
+_GL_FUNCDECL_RPL (fscanf, int,
+                  (FILE *restrict stream, const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fscanf, int,
+                  (FILE *restrict stream, const char *restrict format, ...));
 # else
-_GL_CXXALIAS_SYS (fscanf, int, (FILE *stream, const char *format, ...));
+_GL_CXXALIAS_SYS (fscanf, int,
+                  (FILE *restrict stream, const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fscanf);
@@ -1108,13 +1283,16 @@
 #   define fwrite rpl_fwrite
 #  endif
 _GL_FUNCDECL_RPL (fwrite, size_t,
-                  (const void *ptr, size_t s, size_t n, FILE *stream)
+                  (const void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 4)));
 _GL_CXXALIAS_RPL (fwrite, size_t,
-                  (const void *ptr, size_t s, size_t n, FILE *stream));
+                  (const void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream));
 # else
 _GL_CXXALIAS_SYS (fwrite, size_t,
-                  (const void *ptr, size_t s, size_t n, FILE *stream));
+                  (const void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream));
 
 /* Work around bug 11959 when fortifying glibc 2.4 through 2.15
    <https://sourceware.org/bugzilla/show_bug.cgi?id=11959>,
@@ -1189,22 +1367,26 @@
 #   define getdelim rpl_getdelim
 #  endif
 _GL_FUNCDECL_RPL (getdelim, ssize_t,
-                  (char **lineptr, size_t *linesize, int delimiter,
-                   FILE *stream)
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   int delimiter,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 2, 4)));
 _GL_CXXALIAS_RPL (getdelim, ssize_t,
-                  (char **lineptr, size_t *linesize, int delimiter,
-                   FILE *stream));
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   int delimiter,
+                   FILE *restrict stream));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (getdelim, ssize_t,
-                  (char **lineptr, size_t *linesize, int delimiter,
-                   FILE *stream)
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   int delimiter,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 2, 4)));
 #  endif
 _GL_CXXALIAS_SYS (getdelim, ssize_t,
-                  (char **lineptr, size_t *linesize, int delimiter,
-                   FILE *stream));
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   int delimiter,
+                   FILE *restrict stream));
 # endif
 _GL_CXXALIASWARN (getdelim);
 #elif defined GNULIB_POSIXCHECK
@@ -1215,7 +1397,7 @@
 # endif
 #endif
 
-#if 0
+#if 1
 /* Read a line, up to (and including) the next newline, from STREAM, store it
    in *LINEPTR (and NUL-terminate it).
    *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
@@ -1228,18 +1410,22 @@
 #   define getline rpl_getline
 #  endif
 _GL_FUNCDECL_RPL (getline, ssize_t,
-                  (char **lineptr, size_t *linesize, FILE *stream)
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 2, 3)));
 _GL_CXXALIAS_RPL (getline, ssize_t,
-                  (char **lineptr, size_t *linesize, FILE *stream));
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   FILE *restrict stream));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (getline, ssize_t,
-                  (char **lineptr, size_t *linesize, FILE *stream)
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 2, 3)));
 #  endif
 _GL_CXXALIAS_SYS (getline, ssize_t,
-                  (char **lineptr, size_t *linesize, FILE *stream));
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   FILE *restrict stream));
 # endif
 # if 1
 _GL_CXXALIASWARN (getline);
@@ -1260,6 +1446,22 @@
 _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
 #endif
 
+#if 1
+/* On native Windows, map 'getw' to '_getw', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::getw always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getw
+#   define getw _getw
+#  endif
+_GL_CXXALIAS_MDA (getw, int, (FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (getw, int, (FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (getw);
+#endif
+
 #if 1 || 0
 struct obstack;
 /* Grow an obstack with formatted output.  Return the number of
@@ -1273,7 +1475,7 @@
 #  endif
 _GL_FUNCDECL_RPL (obstack_printf, int,
                   (struct obstack *obs, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (obstack_printf, int,
                   (struct obstack *obs, const char *format, ...));
@@ -1281,7 +1483,7 @@
 #  if !1
 _GL_FUNCDECL_SYS (obstack_printf, int,
                   (struct obstack *obs, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (obstack_printf, int,
@@ -1294,7 +1496,7 @@
 #  endif
 _GL_FUNCDECL_RPL (obstack_vprintf, int,
                   (struct obstack *obs, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (obstack_vprintf, int,
                   (struct obstack *obs, const char *format, va_list args));
@@ -1302,7 +1504,7 @@
 #  if !1
 _GL_FUNCDECL_SYS (obstack_vprintf, int,
                   (struct obstack *obs, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (obstack_vprintf, int,
@@ -1354,43 +1556,53 @@
 #   undef popen
 #   define popen rpl_popen
 #  endif
-_GL_FUNCDECL_RPL (popen, FILE *, (const char *cmd, const char *mode)
-                                 _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (popen, FILE *,
+                  (const char *cmd, const char *mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
 _GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode));
 # else
-#  if !1
-_GL_FUNCDECL_SYS (popen, FILE *, (const char *cmd, const char *mode)
-                                 _GL_ARG_NONNULL ((1, 2)));
+#  if !1 || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (popen, FILE *,
+                  (const char *cmd, const char *mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
 #  endif
 _GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode));
 # endif
 _GL_CXXALIASWARN (popen);
-#elif defined GNULIB_POSIXCHECK
-# undef popen
-# if HAVE_RAW_DECL_POPEN
+#else
+# if 0 && __GNUC__ >= 11 && !defined popen
+/* For -Wmismatched-dealloc: Associate popen with pclose or rpl_pclose.  */
+_GL_FUNCDECL_SYS (popen, FILE *,
+                  (const char *cmd, const char *mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef popen
+#  if HAVE_RAW_DECL_POPEN
 _GL_WARN_ON_USE (popen, "popen is buggy on some platforms - "
                  "use gnulib module popen or pipe for more portability");
+#  endif
 # endif
 #endif
 
 #if 1 || 1
 # if (1 && 0) \
      || (1 && 0 && (0 || 0))
-#  if defined __GNUC__
+#  if defined __GNUC__ || defined __clang__
 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 /* Don't break __attribute__((format(printf,M,N))).  */
 #    define printf __printf__
 #   endif
 #   if 1 || 0
 _GL_FUNCDECL_RPL_1 (__printf__, int,
-                    (const char *format, ...)
+                    (const char *restrict format, ...)
                     __asm__ (""
                              _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
-                    _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2)
+                    _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 2)
                     _GL_ARG_NONNULL ((1)));
 #   else
 _GL_FUNCDECL_RPL_1 (__printf__, int,
-                    (const char *format, ...)
+                    (const char *restrict format, ...)
                     __asm__ (""
                              _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
                     _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 2)
@@ -1402,14 +1614,14 @@
 #    define printf rpl_printf
 #   endif
 _GL_FUNCDECL_RPL (printf, int,
-                  (const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2)
+                  (const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 2)
                   _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (printf, int, (const char *format, ...));
+_GL_CXXALIAS_RPL (printf, int, (const char *restrict format, ...));
 #  endif
 #  define GNULIB_overrides_printf 1
 # else
-_GL_CXXALIAS_SYS (printf, int, (const char *format, ...));
+_GL_CXXALIAS_SYS (printf, int, (const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (printf);
@@ -1473,6 +1685,22 @@
 # endif
 #endif
 
+#if 1
+/* On native Windows, map 'putw' to '_putw', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::putw always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef putw
+#   define putw _putw
+#  endif
+_GL_CXXALIAS_MDA (putw, int, (int w, FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (putw, int, (int w, FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (putw);
+#endif
+
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
@@ -1550,31 +1778,31 @@
 
 #if 1
 # if 0 && 0
-#  if defined __GNUC__
+#  if defined __GNUC__ || defined __clang__
 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #    undef scanf
 /* Don't break __attribute__((format(scanf,M,N))).  */
 #    define scanf __scanf__
 #   endif
 _GL_FUNCDECL_RPL_1 (__scanf__, int,
-                    (const char *format, ...)
+                    (const char *restrict format, ...)
                     __asm__ (""
                              _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_scanf))
                     _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
                     _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *format, ...));
+_GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *restrict format, ...));
 #  else
 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #    undef scanf
 #    define scanf rpl_scanf
 #   endif
-_GL_FUNCDECL_RPL (scanf, int, (const char *format, ...)
+_GL_FUNCDECL_RPL (scanf, int, (const char *restrict format, ...)
                               _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
                               _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (scanf, int, (const char *format, ...));
+_GL_CXXALIAS_RPL (scanf, int, (const char *restrict format, ...));
 #  endif
 # else
-_GL_CXXALIAS_SYS (scanf, int, (const char *format, ...));
+_GL_CXXALIAS_SYS (scanf, int, (const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (scanf);
@@ -1586,23 +1814,30 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define snprintf rpl_snprintf
 #  endif
+#  define GNULIB_overrides_snprintf 1
 _GL_FUNCDECL_RPL (snprintf, int,
-                  (char *str, size_t size, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4)
+                  (char *restrict str, size_t size,
+                   const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 4)
                   _GL_ARG_NONNULL ((3)));
 _GL_CXXALIAS_RPL (snprintf, int,
-                  (char *str, size_t size, const char *format, ...));
+                  (char *restrict str, size_t size,
+                   const char *restrict format, ...));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (snprintf, int,
-                  (char *str, size_t size, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4)
+                  (char *restrict str, size_t size,
+                   const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 4)
                   _GL_ARG_NONNULL ((3)));
 #  endif
 _GL_CXXALIAS_SYS (snprintf, int,
-                  (char *str, size_t size, const char *format, ...));
+                  (char *restrict str, size_t size,
+                   const char *restrict format, ...));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (snprintf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef snprintf
 # if HAVE_RAW_DECL_SNPRINTF
@@ -1625,12 +1860,16 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define sprintf rpl_sprintf
 #  endif
-_GL_FUNCDECL_RPL (sprintf, int, (char *str, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
-                                _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (sprintf, int, (char *str, const char *format, ...));
+#  define GNULIB_overrides_sprintf 1
+_GL_FUNCDECL_RPL (sprintf, int,
+                  (char *restrict str, const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (sprintf, int,
+                  (char *restrict str, const char *restrict format, ...));
 # else
-_GL_CXXALIAS_SYS (sprintf, int, (char *str, const char *format, ...));
+_GL_CXXALIAS_SYS (sprintf, int,
+                  (char *restrict str, const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (sprintf);
@@ -1643,24 +1882,53 @@
                  "POSIX compliance");
 #endif
 
+#if 1
+/* On native Windows, map 'tempnam' to '_tempnam', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::tempnam always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef tempnam
+#   define tempnam _tempnam
+#  endif
+_GL_CXXALIAS_MDA (tempnam, char *, (const char *dir, const char *prefix));
+# else
+_GL_CXXALIAS_SYS (tempnam, char *, (const char *dir, const char *prefix));
+# endif
+_GL_CXXALIASWARN (tempnam);
+#endif
+
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define tmpfile rpl_tmpfile
 #  endif
-_GL_FUNCDECL_RPL (tmpfile, FILE *, (void));
+_GL_FUNCDECL_RPL (tmpfile, FILE *, (void)
+                                   _GL_ATTRIBUTE_DEALLOC (fclose, 1));
 _GL_CXXALIAS_RPL (tmpfile, FILE *, (void));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate tmpfile with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (tmpfile, FILE *, (void)
+                                   _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+#  endif
 _GL_CXXALIAS_SYS (tmpfile, FILE *, (void));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (tmpfile);
 # endif
-#elif defined GNULIB_POSIXCHECK
-# undef tmpfile
-# if HAVE_RAW_DECL_TMPFILE
+#else
+# if 0 && __GNUC__ >= 11 && !defined tmpfile
+/* For -Wmismatched-dealloc: Associate tmpfile with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (tmpfile, FILE *, (void)
+                                   _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef tmpfile
+#  if HAVE_RAW_DECL_TMPFILE
 _GL_WARN_ON_USE (tmpfile, "tmpfile is not usable on mingw - "
                  "use gnulib module tmpfile for portability");
+#  endif
 # endif
 #endif
 
@@ -1673,9 +1941,10 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define asprintf rpl_asprintf
 #  endif
+#  define GNULIB_overrides_asprintf
 _GL_FUNCDECL_RPL (asprintf, int,
                   (char **result, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (asprintf, int,
                   (char **result, const char *format, ...));
@@ -1683,7 +1952,7 @@
 #  if !1
 _GL_FUNCDECL_SYS (asprintf, int,
                   (char **result, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (asprintf, int,
@@ -1694,9 +1963,10 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define vasprintf rpl_vasprintf
 #  endif
+#  define GNULIB_overrides_vasprintf 1
 _GL_FUNCDECL_RPL (vasprintf, int,
                   (char **result, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (vasprintf, int,
                   (char **result, const char *format, va_list args));
@@ -1704,7 +1974,7 @@
 #  if !1
 _GL_FUNCDECL_SYS (vasprintf, int,
                   (char **result, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (vasprintf, int,
@@ -1718,22 +1988,27 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define vdprintf rpl_vdprintf
 #  endif
-_GL_FUNCDECL_RPL (vdprintf, int, (int fd, const char *format, va_list args)
-                                 _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
-                                 _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (vdprintf, int, (int fd, const char *format, va_list args));
+_GL_FUNCDECL_RPL (vdprintf, int,
+                  (int fd, const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (vdprintf, int,
+                  (int fd, const char *restrict format, va_list args));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (vdprintf, int, (int fd, const char *format, va_list args)
-                                 _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
-                                 _GL_ARG_NONNULL ((2)));
+_GL_FUNCDECL_SYS (vdprintf, int,
+                  (int fd, const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+                  _GL_ARG_NONNULL ((2)));
 #  endif
 /* Need to cast, because on Solaris, the third parameter will likely be
                                                     __va_list args.  */
 _GL_CXXALIAS_SYS_CAST (vdprintf, int,
-                       (int fd, const char *format, va_list args));
+                       (int fd, const char *restrict format, va_list args));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vdprintf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef vdprintf
 # if HAVE_RAW_DECL_VDPRINTF
@@ -1750,21 +2025,28 @@
 #  endif
 #  define GNULIB_overrides_vfprintf 1
 #  if 0
-_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)
-                                 _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
-                                 _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (vfprintf, int,
+                  (FILE *restrict fp,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+                  _GL_ARG_NONNULL ((1, 2)));
 #  else
-_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)
-                                 _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0)
-                                 _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (vfprintf, int,
+                  (FILE *restrict fp,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0)
+                  _GL_ARG_NONNULL ((1, 2)));
 #  endif
-_GL_CXXALIAS_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args));
+_GL_CXXALIAS_RPL (vfprintf, int,
+                  (FILE *restrict fp,
+                   const char *restrict format, va_list args));
 # else
 /* Need to cast, because on Solaris, the third parameter is
                                                       __va_list args
    and GCC's fixincludes did not change this to __gnuc_va_list.  */
 _GL_CXXALIAS_SYS_CAST (vfprintf, int,
-                       (FILE *fp, const char *format, va_list args));
+                       (FILE *restrict fp,
+                        const char *restrict format, va_list args));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vfprintf);
@@ -1787,16 +2069,21 @@
 #   define vfscanf rpl_vfscanf
 #  endif
 _GL_FUNCDECL_RPL (vfscanf, int,
-                  (FILE *stream, const char *format, va_list args)
+                  (FILE *restrict stream,
+                   const char *restrict format, va_list args)
                   _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (vfscanf, int,
-                  (FILE *stream, const char *format, va_list args));
+                  (FILE *restrict stream,
+                   const char *restrict format, va_list args));
 # else
 _GL_CXXALIAS_SYS (vfscanf, int,
-                  (FILE *stream, const char *format, va_list args));
+                  (FILE *restrict stream,
+                   const char *restrict format, va_list args));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vfscanf);
+# endif
 #endif
 
 #if 0 || 1
@@ -1807,20 +2094,21 @@
 #  endif
 #  define GNULIB_overrides_vprintf 1
 #  if 0 || 0
-_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (1, 0)
+_GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 0)
                                 _GL_ARG_NONNULL ((1)));
 #  else
-_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args)
+_GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args)
                                 _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 0)
                                 _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_RPL (vprintf, int, (const char *format, va_list args));
+_GL_CXXALIAS_RPL (vprintf, int, (const char *restrict format, va_list args));
 # else
 /* Need to cast, because on Solaris, the second parameter is
                                                           __va_list args
    and GCC's fixincludes did not change this to __gnuc_va_list.  */
-_GL_CXXALIAS_SYS_CAST (vprintf, int, (const char *format, va_list args));
+_GL_CXXALIAS_SYS_CAST (vprintf, int,
+                       (const char *restrict format, va_list args));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vprintf);
@@ -1842,14 +2130,16 @@
 #   undef vscanf
 #   define vscanf rpl_vscanf
 #  endif
-_GL_FUNCDECL_RPL (vscanf, int, (const char *format, va_list args)
+_GL_FUNCDECL_RPL (vscanf, int, (const char *restrict format, va_list args)
                                _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 0)
                                _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (vscanf, int, (const char *format, va_list args));
+_GL_CXXALIAS_RPL (vscanf, int, (const char *restrict format, va_list args));
 # else
-_GL_CXXALIAS_SYS (vscanf, int, (const char *format, va_list args));
+_GL_CXXALIAS_SYS (vscanf, int, (const char *restrict format, va_list args));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vscanf);
+# endif
 #endif
 
 #if 1
@@ -1857,23 +2147,30 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define vsnprintf rpl_vsnprintf
 #  endif
+#  define GNULIB_overrides_vsnprintf 1
 _GL_FUNCDECL_RPL (vsnprintf, int,
-                  (char *str, size_t size, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0)
+                  (char *restrict str, size_t size,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0)
                   _GL_ARG_NONNULL ((3)));
 _GL_CXXALIAS_RPL (vsnprintf, int,
-                  (char *str, size_t size, const char *format, va_list args));
+                  (char *restrict str, size_t size,
+                   const char *restrict format, va_list args));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (vsnprintf, int,
-                  (char *str, size_t size, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0)
+                  (char *restrict str, size_t size,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0)
                   _GL_ARG_NONNULL ((3)));
 #  endif
 _GL_CXXALIAS_SYS (vsnprintf, int,
-                  (char *str, size_t size, const char *format, va_list args));
+                  (char *restrict str, size_t size,
+                   const char *restrict format, va_list args));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vsnprintf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef vsnprintf
 # if HAVE_RAW_DECL_VSNPRINTF
@@ -1887,18 +2184,22 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define vsprintf rpl_vsprintf
 #  endif
+#  define GNULIB_overrides_vsprintf 1
 _GL_FUNCDECL_RPL (vsprintf, int,
-                  (char *str, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  (char *restrict str,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (vsprintf, int,
-                  (char *str, const char *format, va_list args));
+                  (char *restrict str,
+                   const char *restrict format, va_list args));
 # else
 /* Need to cast, because on Solaris, the third parameter is
                                                        __va_list args
    and GCC's fixincludes did not change this to __gnuc_va_list.  */
 _GL_CXXALIAS_SYS_CAST (vsprintf, int,
-                       (char *str, const char *format, va_list args));
+                       (char *restrict str,
+                        const char *restrict format, va_list args));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vsprintf);
diff --git a/linux_glibc-lib/stdlib.h b/linux_glibc-lib/stdlib.h
index 7f31b59..0a76af4 100644
--- a/linux_glibc-lib/stdlib.h
+++ b/linux_glibc-lib/stdlib.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <stdlib.h>.
 
-   Copyright (C) 1995, 2001-2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 1995, 2001-2004, 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
@@ -54,8 +54,8 @@
 # include <sys/loadavg.h>
 #endif
 
-/* Native Windows platforms declare mktemp() in <io.h>.  */
-#if 0 && (defined _WIN32 && ! defined __CYGWIN__)
+/* Native Windows platforms declare _mktemp() in <io.h>.  */
+#if defined _WIN32 && !defined __CYGWIN__
 # include <io.h>
 #endif
 
@@ -100,29 +100,60 @@
 # include <unistd.h>
 #endif
 
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.  */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if __GNUC__ >= 11
+#  define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+#  define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
+   can be freed via 'free'; it can be used only after declaring 'free'.  */
+/* Applies to: functions.  Cannot be used on inline functions.  */
+#ifndef _GL_ATTRIBUTE_DEALLOC_FREE
+# define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (free, 1)
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+   allocated memory.  */
+/* Applies to: functions.  */
+#ifndef _GL_ATTRIBUTE_MALLOC
+# if __GNUC__ >= 3 || defined __clang__
+#  define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+#  define _GL_ATTRIBUTE_MALLOC
+# endif
+#endif
+
 /* The __attribute__ feature is available in gcc versions 2.5 and later.
    The attribute __pure__ was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define _GL_ATTRIBUTE_PURE /* empty */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
 #endif
 
 /* The definition of _Noreturn is copied here.  */
 /* A C macro for declaring that a function does not return.
-   Copyright (C) 2011-2019 Free Software Foundation, Inc.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _Noreturn
@@ -137,11 +168,16 @@
        AIX system header files and several gnulib header files use precisely
        this syntax with 'extern'.  */
 #  define _Noreturn [[noreturn]]
-# elif ((!defined __cplusplus || defined __clang__)                     \
-        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)  \
-            || 4 < __GNUC__ + (7 <= __GNUC_MINOR__)))
+# elif ((!defined __cplusplus || defined __clang__) \
+        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
+            || (!defined __STRICT_ANSI__ \
+                && (4 < __GNUC__ + (7 <= __GNUC_MINOR__) \
+                    || (defined __apple_build_version__ \
+                        ? 6000000 <= __apple_build_version__ \
+                        : 3 < __clang_major__ + (5 <= __clang_minor__))))))
    /* _Noreturn works as-is.  */
-# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
+# elif (2 < __GNUC__ + (8 <= __GNUC_MINOR__) || defined __clang__ \
+        || 0x5110 <= __SUNPRO_C)
 #  define _Noreturn __attribute__ ((__noreturn__))
 # elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
 #  define _Noreturn __declspec (noreturn)
@@ -152,19 +188,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -299,6 +335,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -324,6 +370,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -421,7 +475,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -449,14 +503,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -470,26 +521,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -498,19 +549,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -586,6 +637,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -598,24 +656,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -661,6 +730,69 @@
 #endif
 
 
+#if 1
+# if 1
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef free
+#   define free rpl_free
+#  endif
+_GL_FUNCDECL_RPL (free, void, (void *ptr));
+_GL_CXXALIAS_RPL (free, void, (void *ptr));
+# else
+_GL_CXXALIAS_SYS (free, void, (void *ptr));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (free);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef free
+/* Assume free is always declared.  */
+_GL_WARN_ON_USE (free, "free is not future POSIX compliant everywhere - "
+                 "use gnulib module free for portability");
+#endif
+
+
+/* Allocate memory with indefinite extent and specified alignment.  */
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef aligned_alloc
+#   define aligned_alloc rpl_aligned_alloc
+#  endif
+_GL_FUNCDECL_RPL (aligned_alloc, void *,
+                  (size_t alignment, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+_GL_CXXALIAS_RPL (aligned_alloc, void *, (size_t alignment, size_t size));
+# else
+#  if 1
+#   if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate aligned_alloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (aligned_alloc, void *,
+                  (size_t alignment, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#   endif
+_GL_CXXALIAS_SYS (aligned_alloc, void *, (size_t alignment, size_t size));
+#  endif
+# endif
+# if 1
+_GL_CXXALIASWARN (aligned_alloc);
+# endif
+#else
+# if 1 && __GNUC__ >= 11 && !defined aligned_alloc
+/* For -Wmismatched-dealloc: Associate aligned_alloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (aligned_alloc, void *,
+                  (size_t alignment, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef aligned_alloc
+#  if HAVE_RAW_DECL_ALIGNED_ALLOC
+_GL_WARN_ON_USE (aligned_alloc, "aligned_alloc is not portable - "
+                 "use gnulib module aligned_alloc for portability");
+#  endif
+# endif
+#endif
+
 #if 0
 /* Parse a signed decimal integer.
    Returns the value of the integer.  Errors are not detected.  */
@@ -685,19 +817,35 @@
 #   undef calloc
 #   define calloc rpl_calloc
 #  endif
-_GL_FUNCDECL_RPL (calloc, void *, (size_t nmemb, size_t size));
+_GL_FUNCDECL_RPL (calloc, void *,
+                  (size_t nmemb, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (calloc, void *, (size_t nmemb, size_t size));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate calloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (calloc, void *,
+                  (size_t nmemb, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#  endif
 _GL_CXXALIAS_SYS (calloc, void *, (size_t nmemb, size_t size));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (calloc);
 # endif
-#elif defined GNULIB_POSIXCHECK
-# undef calloc
+#else
+# if 1 && __GNUC__ >= 11 && !defined calloc
+/* For -Wmismatched-dealloc: Associate calloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (calloc, void *,
+                  (size_t nmemb, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef calloc
 /* Assume calloc is always declared.  */
 _GL_WARN_ON_USE (calloc, "calloc is not POSIX compliant everywhere - "
                  "use gnulib module calloc-posix for portability");
+# endif
 #endif
 
 #if 1
@@ -705,23 +853,108 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define canonicalize_file_name rpl_canonicalize_file_name
 #  endif
-_GL_FUNCDECL_RPL (canonicalize_file_name, char *, (const char *name)
-                                                  _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_RPL (canonicalize_file_name, char *,
+                  (const char *name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (canonicalize_file_name, char *, (const char *name));
 # else
-#  if !1
-_GL_FUNCDECL_SYS (canonicalize_file_name, char *, (const char *name)
-                                                  _GL_ARG_NONNULL ((1)));
+#  if !1 || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (canonicalize_file_name, char *,
+                  (const char *name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 #  endif
 _GL_CXXALIAS_SYS (canonicalize_file_name, char *, (const char *name));
 # endif
+# ifndef GNULIB_defined_canonicalize_file_name
+#  define GNULIB_defined_canonicalize_file_name \
+     (!1 || 0)
+# endif
 _GL_CXXALIASWARN (canonicalize_file_name);
-#elif defined GNULIB_POSIXCHECK
-# undef canonicalize_file_name
-# if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
+#else
+# if 1 && __GNUC__ >= 11 && !defined canonicalize_file_name
+/* For -Wmismatched-dealloc: Associate canonicalize_file_name with free or
+   rpl_free.  */
+_GL_FUNCDECL_SYS (canonicalize_file_name, char *,
+                  (const char *name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef canonicalize_file_name
+#  if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
 _GL_WARN_ON_USE (canonicalize_file_name,
                  "canonicalize_file_name is unportable - "
                  "use gnulib module canonicalize-lgpl for portability");
+#  endif
+# endif
+#endif
+
+#if 1
+/* On native Windows, map 'ecvt' to '_ecvt', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::ecvt on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef ecvt
+#   define ecvt _ecvt
+#  endif
+_GL_CXXALIAS_MDA (ecvt, char *,
+                  (double number, int ndigits, int *decptp, int *signp));
+# else
+#  if 1
+_GL_CXXALIAS_SYS (ecvt, char *,
+                  (double number, int ndigits, int *decptp, int *signp));
+#  endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || 1
+_GL_CXXALIASWARN (ecvt);
+# endif
+#endif
+
+#if 1
+/* On native Windows, map 'fcvt' to '_fcvt', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::fcvt on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fcvt
+#   define fcvt _fcvt
+#  endif
+_GL_CXXALIAS_MDA (fcvt, char *,
+                  (double number, int ndigits, int *decptp, int *signp));
+# else
+#  if 1
+_GL_CXXALIAS_SYS (fcvt, char *,
+                  (double number, int ndigits, int *decptp, int *signp));
+#  endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || 1
+_GL_CXXALIASWARN (fcvt);
+# endif
+#endif
+
+#if 1
+/* On native Windows, map 'gcvt' to '_gcvt', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::gcvt on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef gcvt
+#   define gcvt _gcvt
+#  endif
+_GL_CXXALIAS_MDA (gcvt, char *, (double number, int ndigits, char *buf));
+# else
+#  if 1
+_GL_CXXALIAS_SYS (gcvt, char *, (double number, int ndigits, char *buf));
+#  endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || 1
+_GL_CXXALIASWARN (gcvt);
 # endif
 #endif
 
@@ -799,19 +1032,35 @@
 #   undef malloc
 #   define malloc rpl_malloc
 #  endif
-_GL_FUNCDECL_RPL (malloc, void *, (size_t size));
+_GL_FUNCDECL_RPL (malloc, void *,
+                  (size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (malloc, void *, (size_t size));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate malloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (malloc, void *,
+                  (size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#  endif
 _GL_CXXALIAS_SYS (malloc, void *, (size_t size));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (malloc);
 # endif
-#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
-# undef malloc
+#else
+# if 1 && __GNUC__ >= 11 && !defined malloc
+/* For -Wmismatched-dealloc: Associate malloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (malloc, void *,
+                  (size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+#  undef malloc
 /* Assume malloc is always declared.  */
 _GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - "
                  "use gnulib module malloc-posix for portability");
+# endif
 #endif
 
 /* Convert a multibyte character to a wide character.  */
@@ -821,13 +1070,17 @@
 #   undef mbtowc
 #   define mbtowc rpl_mbtowc
 #  endif
-_GL_FUNCDECL_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
-_GL_CXXALIAS_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+_GL_FUNCDECL_RPL (mbtowc, int,
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n));
+_GL_CXXALIAS_RPL (mbtowc, int,
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+_GL_FUNCDECL_SYS (mbtowc, int,
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n));
 #  endif
-_GL_CXXALIAS_SYS (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+_GL_CXXALIAS_SYS (mbtowc, int,
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (mbtowc);
@@ -972,6 +1225,51 @@
 # endif
 #endif
 
+#if 1
+/* On native Windows, map 'mktemp' to '_mktemp', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::mktemp always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef mktemp
+#   define mktemp _mktemp
+#  endif
+_GL_CXXALIAS_MDA (mktemp, char *, (char * /*template*/));
+# else
+_GL_CXXALIAS_SYS (mktemp, char *, (char * /*template*/));
+# endif
+_GL_CXXALIASWARN (mktemp);
+#endif
+
+/* Allocate memory with indefinite extent and specified alignment.  */
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef posix_memalign
+#   define posix_memalign rpl_posix_memalign
+#  endif
+_GL_FUNCDECL_RPL (posix_memalign, int,
+                  (void **memptr, size_t alignment, size_t size)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_memalign, int,
+                  (void **memptr, size_t alignment, size_t size));
+# else
+#  if 1
+_GL_CXXALIAS_SYS (posix_memalign, int,
+                  (void **memptr, size_t alignment, size_t size));
+#  endif
+# endif
+# if 1
+_GL_CXXALIASWARN (posix_memalign);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_memalign
+# if HAVE_RAW_DECL_POSIX_MEMALIGN
+_GL_WARN_ON_USE (posix_memalign, "posix_memalign is not portable - "
+                 "use gnulib module posix_memalign for portability");
+# endif
+#endif
+
 #if 0
 /* Return an FD open to the master side of a pseudo-terminal.  Flags should
    include O_RDWR, and may also include O_NOCTTY.  */
@@ -1030,6 +1328,9 @@
 #  endif
 _GL_CXXALIAS_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
 # endif
+# ifndef GNULIB_defined_ptsname_r
+#  define GNULIB_defined_ptsname_r (!1 || 0)
+# endif
 _GL_CXXALIASWARN (ptsname_r);
 #elif defined GNULIB_POSIXCHECK
 # undef ptsname_r
@@ -1047,6 +1348,28 @@
 #  endif
 _GL_FUNCDECL_RPL (putenv, int, (char *string) _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (putenv, int, (char *string));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef putenv
+#   define putenv _putenv
+#  endif
+_GL_CXXALIAS_MDA (putenv, int, (char *string));
+# else
+_GL_CXXALIAS_SYS (putenv, int, (char *string));
+# endif
+_GL_CXXALIASWARN (putenv);
+#elif 1
+/* On native Windows, map 'putenv' to '_putenv', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::putenv always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef putenv
+#   define putenv _putenv
+#  endif
+/* Need to cast, because on mingw, the parameter is either
+   'const char *string' or 'char *string'.  */
+_GL_CXXALIAS_MDA_CAST (putenv, int, (char *string));
 # else
 _GL_CXXALIAS_SYS (putenv, int, (char *string));
 # endif
@@ -1113,7 +1436,9 @@
 #  if !1
 _GL_FUNCDECL_SYS (random, long, (void));
 #  endif
-_GL_CXXALIAS_SYS (random, long, (void));
+/* Need to cast, because on Haiku, the return type is
+                               int.  */
+_GL_CXXALIAS_SYS_CAST (random, long, (void));
 # endif
 _GL_CXXALIASWARN (random);
 #elif defined GNULIB_POSIXCHECK
@@ -1280,9 +1605,11 @@
                    struct random_data *rand_state)
                   _GL_ARG_NONNULL ((2, 4)));
 #  endif
-_GL_CXXALIAS_SYS (initstate_r, int,
-                  (unsigned int seed, char *buf, size_t buf_size,
-                   struct random_data *rand_state));
+/* Need to cast, because on Haiku, the third parameter is
+                                                     unsigned long buf_size.  */
+_GL_CXXALIAS_SYS_CAST (initstate_r, int,
+                       (unsigned int seed, char *buf, size_t buf_size,
+                        struct random_data *rand_state));
 # endif
 _GL_CXXALIASWARN (initstate_r);
 #elif defined GNULIB_POSIXCHECK
@@ -1310,8 +1637,10 @@
                   (char *arg_state, struct random_data *rand_state)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
-_GL_CXXALIAS_SYS (setstate_r, int,
-                  (char *arg_state, struct random_data *rand_state));
+/* Need to cast, because on Haiku, the first parameter is
+                        void *arg_state.  */
+_GL_CXXALIAS_SYS_CAST (setstate_r, int,
+                       (char *arg_state, struct random_data *rand_state));
 # endif
 _GL_CXXALIASWARN (setstate_r);
 #elif defined GNULIB_POSIXCHECK
@@ -1330,29 +1659,53 @@
 #   undef realloc
 #   define realloc rpl_realloc
 #  endif
-_GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size));
+_GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size)
+                                   _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (realloc, void *, (void *ptr, size_t size));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate realloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (realloc, void *, (void *ptr, size_t size)
+                                   _GL_ATTRIBUTE_DEALLOC_FREE);
+#  endif
 _GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (realloc);
 # endif
-#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
-# undef realloc
+#else
+# if 1 && __GNUC__ >= 11 && !defined realloc
+/* For -Wmismatched-dealloc: Associate realloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (realloc, void *, (void *ptr, size_t size)
+                                   _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+#  undef realloc
 /* Assume realloc is always declared.  */
 _GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - "
                  "use gnulib module realloc-posix for portability");
+# endif
 #endif
 
 
-#if 0
-# if ! 1
+#if 1
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef reallocarray
+#   define reallocarray rpl_reallocarray
+#  endif
+_GL_FUNCDECL_RPL (reallocarray, void *,
+                  (void *ptr, size_t nmemb, size_t size));
+_GL_CXXALIAS_RPL (reallocarray, void *,
+                  (void *ptr, size_t nmemb, size_t size));
+# else
+#  if ! 0
 _GL_FUNCDECL_SYS (reallocarray, void *,
                   (void *ptr, size_t nmemb, size_t size));
-# endif
+#  endif
 _GL_CXXALIAS_SYS (reallocarray, void *,
                   (void *ptr, size_t nmemb, size_t size));
+# endif
 _GL_CXXALIASWARN (reallocarray);
 #elif defined GNULIB_POSIXCHECK
 # undef reallocarray
@@ -1367,15 +1720,19 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define realpath rpl_realpath
 #  endif
-_GL_FUNCDECL_RPL (realpath, char *, (const char *name, char *resolved)
-                                    _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (realpath, char *, (const char *name, char *resolved));
+_GL_FUNCDECL_RPL (realpath, char *,
+                  (const char *restrict name, char *restrict resolved)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (realpath, char *,
+                  (const char *restrict name, char *restrict resolved));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (realpath, char *, (const char *name, char *resolved)
-                                    _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_SYS (realpath, char *,
+                  (const char *restrict name, char *restrict resolved)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (realpath, char *, (const char *name, char *resolved));
+_GL_CXXALIAS_SYS (realpath, char *,
+                  (const char *restrict name, char *restrict resolved));
 # endif
 _GL_CXXALIASWARN (realpath);
 #elif defined GNULIB_POSIXCHECK
@@ -1451,22 +1808,26 @@
 # endif
 #endif
 
-#if 0
+#if 1
  /* Parse a double from STRING, updating ENDP if appropriate.  */
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define strtod rpl_strtod
 #  endif
 #  define GNULIB_defined_strtod_function 1
-_GL_FUNCDECL_RPL (strtod, double, (const char *str, char **endp)
-                                  _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtod, double, (const char *str, char **endp));
+_GL_FUNCDECL_RPL (strtod, double,
+                  (const char *restrict str, char **restrict endp)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtod, double,
+                  (const char *restrict str, char **restrict endp));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (strtod, double, (const char *str, char **endp)
-                                  _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_SYS (strtod, double,
+                  (const char *restrict str, char **restrict endp)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (strtod, double, (const char *str, char **endp));
+_GL_CXXALIAS_SYS (strtod, double,
+                  (const char *restrict str, char **restrict endp));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (strtod);
@@ -1486,15 +1847,19 @@
 #   define strtold rpl_strtold
 #  endif
 #  define GNULIB_defined_strtold_function 1
-_GL_FUNCDECL_RPL (strtold, long double, (const char *str, char **endp)
-                                        _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtold, long double, (const char *str, char **endp));
+_GL_FUNCDECL_RPL (strtold, long double,
+                  (const char *restrict str, char **restrict endp)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtold, long double,
+                  (const char *restrict str, char **restrict endp));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (strtold, long double, (const char *str, char **endp)
-                                        _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_SYS (strtold, long double,
+                  (const char *restrict str, char **restrict endp)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (strtold, long double, (const char *str, char **endp));
+_GL_CXXALIAS_SYS (strtold, long double,
+                  (const char *restrict str, char **restrict endp));
 # endif
 _GL_CXXALIASWARN (strtold);
 #elif defined GNULIB_POSIXCHECK
@@ -1512,15 +1877,72 @@
    "0x").
    If ENDPTR is not NULL, the address of the first byte after the integer is
    stored in *ENDPTR.
+   Upon overflow, the return value is LONG_MAX or LONG_MIN, and errno is set
+   to ERANGE.  */
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtol rpl_strtol
+#  endif
+#  define GNULIB_defined_strtol_function 1
+_GL_FUNCDECL_RPL (strtol, long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtol, long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (strtol, long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strtol, long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# endif
+_GL_CXXALIASWARN (strtol);
+#elif defined GNULIB_POSIXCHECK
+# undef strtol
+# if HAVE_RAW_DECL_STRTOL
+_GL_WARN_ON_USE (strtol, "strtol is unportable - "
+                 "use gnulib module strtol for portability");
+# endif
+#endif
+
+#if 0
+/* Parse a signed integer whose textual representation starts at STRING.
+   The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+   it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+   "0x").
+   If ENDPTR is not NULL, the address of the first byte after the integer is
+   stored in *ENDPTR.
    Upon overflow, the return value is LLONG_MAX or LLONG_MIN, and errno is set
    to ERANGE.  */
-# if !1
-_GL_FUNCDECL_SYS (strtoll, long long,
-                  (const char *string, char **endptr, int base)
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtoll rpl_strtoll
+#  endif
+#  define GNULIB_defined_strtoll_function 1
+_GL_FUNCDECL_RPL (strtoll, long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
                   _GL_ARG_NONNULL ((1)));
-# endif
+_GL_CXXALIAS_RPL (strtoll, long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (strtoll, long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
 _GL_CXXALIAS_SYS (strtoll, long long,
-                  (const char *string, char **endptr, int base));
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# endif
 _GL_CXXALIASWARN (strtoll);
 #elif defined GNULIB_POSIXCHECK
 # undef strtoll
@@ -1537,15 +1959,71 @@
    "0x").
    If ENDPTR is not NULL, the address of the first byte after the integer is
    stored in *ENDPTR.
+   Upon overflow, the return value is ULONG_MAX, and errno is set to ERANGE.  */
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtoul rpl_strtoul
+#  endif
+#  define GNULIB_defined_strtoul_function 1
+_GL_FUNCDECL_RPL (strtoul, unsigned long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoul, unsigned long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (strtoul, unsigned long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strtoul, unsigned long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# endif
+_GL_CXXALIASWARN (strtoul);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoul
+# if HAVE_RAW_DECL_STRTOUL
+_GL_WARN_ON_USE (strtoul, "strtoul is unportable - "
+                 "use gnulib module strtoul for portability");
+# endif
+#endif
+
+#if 0
+/* Parse an unsigned integer whose textual representation starts at STRING.
+   The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+   it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+   "0x").
+   If ENDPTR is not NULL, the address of the first byte after the integer is
+   stored in *ENDPTR.
    Upon overflow, the return value is ULLONG_MAX, and errno is set to
    ERANGE.  */
-# if !1
-_GL_FUNCDECL_SYS (strtoull, unsigned long long,
-                  (const char *string, char **endptr, int base)
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtoull rpl_strtoull
+#  endif
+#  define GNULIB_defined_strtoull_function 1
+_GL_FUNCDECL_RPL (strtoull, unsigned long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
                   _GL_ARG_NONNULL ((1)));
-# endif
+_GL_CXXALIAS_RPL (strtoull, unsigned long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (strtoull, unsigned long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
 _GL_CXXALIAS_SYS (strtoull, unsigned long long,
-                  (const char *string, char **endptr, int base));
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# endif
 _GL_CXXALIASWARN (strtoull);
 #elif defined GNULIB_POSIXCHECK
 # undef strtoull
diff --git a/linux_glibc-lib/string.h b/linux_glibc-lib/string.h
index c8332ad..ad52e06 100644
--- a/linux_glibc-lib/string.h
+++ b/linux_glibc-lib/string.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <string.h>.
 
-   Copyright (C) 1995-1996, 2001-2019 Free Software Foundation, Inc.
+   Copyright (C) 1995-1996, 2001-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 #pragma GCC system_header
@@ -53,14 +53,6 @@
 # include <wchar.h>
 #endif
 
-/* The __attribute__ feature is available in gcc versions 2.5 and later.
-   The attribute __pure__ was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define _GL_ATTRIBUTE_PURE /* empty */
-#endif
-
 /* NetBSD 5.0 declares strsignal in <unistd.h>, not in <string.h>.  */
 /* But in any case avoid namespace pollution on glibc systems.  */
 #if (0 || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \
@@ -68,21 +60,39 @@
 # include <unistd.h>
 #endif
 
+/* AIX 7.2 declares ffsl and ffsll in <strings.h>, not in <string.h>.  */
+/* But in any case avoid namespace pollution on glibc systems.  */
+#if ((1 || 0 || defined GNULIB_POSIXCHECK) \
+     && defined _AIX) \
+    && ! defined __GLIBC__
+# include <strings.h>
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The attribute __pure__ was added in gcc 2.96.  */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
+#endif
+
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -217,6 +227,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -242,6 +262,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -339,7 +367,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -367,14 +395,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -388,26 +413,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -416,19 +441,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -504,6 +529,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -516,24 +548,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -547,6 +590,13 @@
 # endif
 #endif
 
+/* Declare 'free' if needed for _GL_ATTRIBUTE_DEALLOC_FREE.  */
+#if (1 && !defined free \
+     && !(defined __cplusplus && defined GNULIB_NAMESPACE))
+_GL_EXTERN_C void free (void *);
+# define free rpl_free
+#endif
+_GL_EXTERN_C void free (void *);
 
 /* Clear a block of memory.  The compiler will not delete a call to
    this function, even if the block is dead after the call.  */
@@ -566,7 +616,7 @@
 #endif
 
 /* Find the index of the least-significant set bit.  */
-#if 0
+#if 1
 # if !1
 _GL_FUNCDECL_SYS (ffsl, int, (long int i));
 # endif
@@ -582,10 +632,18 @@
 
 /* Find the index of the least-significant set bit.  */
 #if 0
-# if !1
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define ffsll rpl_ffsll
+#  endif
+_GL_FUNCDECL_RPL (ffsll, int, (long long int i));
+_GL_CXXALIAS_RPL (ffsll, int, (long long int i));
+# else
+#  if !1
 _GL_FUNCDECL_SYS (ffsll, int, (long long int i));
-# endif
+#  endif
 _GL_CXXALIAS_SYS (ffsll, int, (long long int i));
+# endif
 _GL_CXXALIASWARN (ffsll);
 #elif defined GNULIB_POSIXCHECK
 # undef ffsll
@@ -595,10 +653,30 @@
 #endif
 
 
+#if 1
+/* On native Windows, map 'memccpy' to '_memccpy', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::memccpy always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef memccpy
+#   define memccpy _memccpy
+#  endif
+_GL_CXXALIAS_MDA (memccpy, void *,
+                  (void *dest, const void *src, int c, size_t n));
+# else
+_GL_CXXALIAS_SYS (memccpy, void *,
+                  (void *dest, const void *src, int c, size_t n));
+# endif
+_GL_CXXALIASWARN (memccpy);
+#endif
+
+
 /* Return the first instance of C within N bytes of S, or NULL.  */
 #if 1
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef memchr
 #   define memchr rpl_memchr
 #  endif
 _GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n)
@@ -606,11 +684,6 @@
                                   _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n));
 # else
-#  if ! 1
-_GL_FUNCDECL_SYS (memchr, void *, (void const *__s, int __c, size_t __n)
-                                  _GL_ATTRIBUTE_PURE
-                                  _GL_ARG_NONNULL ((1)));
-#  endif
   /* On some systems, this function is defined as an overloaded function:
        extern "C" { const void * std::memchr (const void *, int, size_t); }
        extern "C++" { void * std::memchr (void *, int, size_t); }  */
@@ -671,7 +744,7 @@
 
 /* Copy N bytes of SRC to DEST, return pointer to bytes after the
    last written byte.  */
-#if 0
+#if 1
 # if ! 1
 _GL_FUNCDECL_SYS (mempcpy, void *,
                   (void *restrict __dest, void const *restrict __src,
@@ -721,7 +794,7 @@
 /* Find the first occurrence of C in S.  More efficient than
    memchr(S,C,N), at the expense of undefined behavior if C does not
    occur within N bytes.  */
-#if 0
+#if 1
 # if ! 1
 _GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in)
                                      _GL_ATTRIBUTE_PURE
@@ -768,7 +841,7 @@
 
 /* Copy no more than N bytes of SRC to DST, returning a pointer past the
    last non-NUL byte written into DST.  */
-#if 0
+#if 1
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef stpncpy
@@ -806,13 +879,15 @@
    GB18030 and the character to be searched is a digit.  */
 # undef strchr
 /* Assume strchr is always declared.  */
-_GL_WARN_ON_USE (strchr, "strchr cannot work correctly on character strings "
-                 "in some multibyte locales - "
-                 "use mbschr if you care about internationalization");
+_GL_WARN_ON_USE_CXX (strchr,
+                     const char *, char *, (const char *, int),
+                     "strchr cannot work correctly on character strings "
+                     "in some multibyte locales - "
+                     "use mbschr if you care about internationalization");
 #endif
 
 /* Find the first occurrence of C in S or the final NUL byte.  */
-#if 0
+#if 1
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define strchrnul rpl_strchrnul
@@ -857,24 +932,62 @@
 #   undef strdup
 #   define strdup rpl_strdup
 #  endif
-_GL_FUNCDECL_RPL (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_RPL (strdup, char *,
+                  (char const *__s)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (strdup, char *, (char const *__s));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strdup
+#   define strdup _strdup
+#  endif
+_GL_CXXALIAS_MDA (strdup, char *, (char const *__s));
 # else
 #  if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
     /* strdup exists as a function and as a macro.  Get rid of the macro.  */
 #   undef strdup
 #  endif
-#  if !(1 || defined strdup)
-_GL_FUNCDECL_SYS (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
+#  if (!1 || __GNUC__ >= 11) && !defined strdup
+_GL_FUNCDECL_SYS (strdup, char *,
+                  (char const *__s)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 #  endif
 _GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
 # endif
 _GL_CXXALIASWARN (strdup);
-#elif defined GNULIB_POSIXCHECK
-# undef strdup
-# if HAVE_RAW_DECL_STRDUP
+#else
+# if __GNUC__ >= 11 && !defined strdup
+/* For -Wmismatched-dealloc: Associate strdup with free or rpl_free.  */
+_GL_FUNCDECL_SYS (strdup, char *,
+                  (char const *__s)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef strdup
+#  if HAVE_RAW_DECL_STRDUP
 _GL_WARN_ON_USE (strdup, "strdup is unportable - "
                  "use gnulib module strdup for portability");
+#  endif
+# elif 1
+/* On native Windows, map 'creat' to '_creat', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::strdup always.  */
+#  if defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef strdup
+#    define strdup _strdup
+#   endif
+_GL_CXXALIAS_MDA (strdup, char *, (char const *__s));
+#  else
+#   if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
+#    undef strdup
+#   endif
+_GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
+#  endif
+_GL_CXXALIASWARN (strdup);
 # endif
 #endif
 
@@ -885,11 +998,14 @@
 #   undef strncat
 #   define strncat rpl_strncat
 #  endif
-_GL_FUNCDECL_RPL (strncat, char *, (char *dest, const char *src, size_t n)
-                                   _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (strncat, char *, (char *dest, const char *src, size_t n));
+_GL_FUNCDECL_RPL (strncat, char *,
+                  (char *restrict dest, const char *restrict src, size_t n)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strncat, char *,
+                  (char *restrict dest, const char *restrict src, size_t n));
 # else
-_GL_CXXALIAS_SYS (strncat, char *, (char *dest, const char *src, size_t n));
+_GL_CXXALIAS_SYS (strncat, char *,
+                  (char *restrict dest, const char *restrict src, size_t n));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (strncat);
@@ -997,15 +1113,19 @@
    locale encoding is GB18030 and one of the characters to be searched is a
    digit.  */
 #  undef strpbrk
-_GL_WARN_ON_USE (strpbrk, "strpbrk cannot work correctly on character strings "
-                 "in multibyte locales - "
-                 "use mbspbrk if you care about internationalization");
+_GL_WARN_ON_USE_CXX (strpbrk,
+                     const char *, char *, (const char *, const char *),
+                     "strpbrk cannot work correctly on character strings "
+                     "in multibyte locales - "
+                     "use mbspbrk if you care about internationalization");
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef strpbrk
 # if HAVE_RAW_DECL_STRPBRK
-_GL_WARN_ON_USE (strpbrk, "strpbrk is unportable - "
-                 "use gnulib module strpbrk for portability");
+_GL_WARN_ON_USE_CXX (strpbrk,
+                     const char *, char *, (const char *, const char *),
+                     "strpbrk is unportable - "
+                     "use gnulib module strpbrk for portability");
 # endif
 #endif
 
@@ -1024,9 +1144,11 @@
    GB18030 and the character to be searched is a digit.  */
 # undef strrchr
 /* Assume strrchr is always declared.  */
-_GL_WARN_ON_USE (strrchr, "strrchr cannot work correctly on character strings "
-                 "in some multibyte locales - "
-                 "use mbsrchr if you care about internationalization");
+_GL_WARN_ON_USE_CXX (strrchr,
+                     const char *, char *, (const char *, int),
+                     "strrchr cannot work correctly on character strings "
+                     "in some multibyte locales - "
+                     "use mbsrchr if you care about internationalization");
 #endif
 
 /* Search the next delimiter (char listed in DELIM) starting at *STRINGP.
@@ -1440,7 +1562,8 @@
    Caveat: The identity of the delimiting character is lost.
 
    See also mbssep().  */
-_GL_EXTERN_C char * mbstok_r (char *string, const char *delim, char **save_ptr)
+_GL_EXTERN_C char * mbstok_r (char *restrict string, const char *delim,
+                              char **save_ptr)
      _GL_ARG_NONNULL ((2, 3));
 #endif
 
@@ -1495,6 +1618,60 @@
 # endif
 #endif
 
+/* Return the name of the system error code ERRNUM.  */
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strerrorname_np
+#   define strerrorname_np rpl_strerrorname_np
+#  endif
+_GL_FUNCDECL_RPL (strerrorname_np, const char *, (int errnum));
+_GL_CXXALIAS_RPL (strerrorname_np, const char *, (int errnum));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (strerrorname_np, const char *, (int errnum));
+#  endif
+_GL_CXXALIAS_SYS (strerrorname_np, const char *, (int errnum));
+# endif
+_GL_CXXALIASWARN (strerrorname_np);
+#elif defined GNULIB_POSIXCHECK
+# undef strerrorname_np
+# if HAVE_RAW_DECL_STRERRORNAME_NP
+_GL_WARN_ON_USE (strerrorname_np, "strerrorname_np is unportable - "
+                 "use gnulib module strerrorname_np for portability");
+# endif
+#endif
+
+/* Return an abbreviation string for the signal number SIG.  */
+#if 0
+# if ! 1
+_GL_FUNCDECL_SYS (sigabbrev_np, const char *, (int sig));
+# endif
+_GL_CXXALIAS_SYS (sigabbrev_np, const char *, (int sig));
+_GL_CXXALIASWARN (sigabbrev_np);
+#elif defined GNULIB_POSIXCHECK
+# undef sigabbrev_np
+# if HAVE_RAW_DECL_SIGABBREV_NP
+_GL_WARN_ON_USE (sigabbrev_np, "sigabbrev_np is unportable - "
+                 "use gnulib module sigabbrev_np for portability");
+# endif
+#endif
+
+/* Return an English description string for the signal number SIG.  */
+#if 0
+# if ! 1
+_GL_FUNCDECL_SYS (sigdescr_np, const char *, (int sig));
+# endif
+_GL_CXXALIAS_SYS (sigdescr_np, const char *, (int sig));
+_GL_CXXALIASWARN (sigdescr_np);
+#elif defined GNULIB_POSIXCHECK
+# undef sigdescr_np
+# if HAVE_RAW_DECL_SIGDESCR_NP
+_GL_WARN_ON_USE (sigdescr_np, "sigdescr_np is unportable - "
+                 "use gnulib module sigdescr_np for portability");
+# endif
+#endif
+
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
diff --git a/linux_glibc-lib/termios.h b/linux_glibc-lib/termios.h
new file mode 100644
index 0000000..5865c9c
--- /dev/null
+++ b/linux_glibc-lib/termios.h
@@ -0,0 +1,554 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Substitute for and wrapper around <termios.h>.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_TERMIOS_H
+
+#if __GNUC__ >= 3
+#pragma GCC system_header
+#endif
+
+
+/* On HP-UX 11.00, some of the function declarations in <sys/termio.h>,
+   included by <termios.h>, are not protected by extern "C".  Enforce
+   "C" linkage for these functions nevertheless.  */
+#if defined __hpux && defined __cplusplus
+# include <sys/types.h>
+# include <sys/ioctl.h>
+extern "C" {
+# include <sys/termio.h>
+}
+#endif
+
+/* The include_next requires a split double-inclusion guard.  */
+#if 1
+# include_next <termios.h>
+#endif
+
+#ifndef _GL_TERMIOS_H
+#define _GL_TERMIOS_H
+
+/* Get pid_t.  */
+#include <sys/types.h>
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+/* C++ compatible function declaration macros.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_CXXDEFS_H
+#define _GL_CXXDEFS_H
+
+/* Begin/end the GNULIB_NAMESPACE namespace.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
+# define _GL_END_NAMESPACE }
+#else
+# define _GL_BEGIN_NAMESPACE
+# define _GL_END_NAMESPACE
+#endif
+
+/* The three most frequent use cases of these macros are:
+
+   * For providing a substitute for a function that is missing on some
+     platforms, but is declared and works fine on the platforms on which
+     it exists:
+
+       #if @GNULIB_FOO@
+       # if !@HAVE_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       # endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on all platforms,
+     but is broken/insufficient and needs to be replaced on some platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on some platforms
+     but is broken/insufficient and needs to be replaced on some of them and
+     is additionally either missing or undeclared on some other platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       #  if !@HAVE_FOO@   or   if !@HAVE_DECL_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       #  endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+*/
+
+/* _GL_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#if defined __cplusplus
+# define _GL_EXTERN_C extern "C"
+#else
+# define _GL_EXTERN_C extern
+#endif
+
+/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
+   declares a replacement function, named rpl_func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
+  _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
+#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype rpl_func parameters_and_attributes
+
+/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
+   declares the system function, named func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype func parameters_and_attributes
+
+/* _GL_CXXALIAS_RPL (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+
+   Wrapping rpl_func in an object with an inline conversion operator
+   avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::rpl_func;                                  \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
+   is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
+   except that the C function rpl_func may have a slightly different
+   declaration.  A cast is used to silence the "invalid conversion" error
+   that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                     \
+    {                                                              \
+      static const struct _gl_ ## func ## _wrapper                 \
+      {                                                            \
+        typedef rettype (*type) parameters;                        \
+                                                                   \
+        inline operator type () const                              \
+        {                                                          \
+          return reinterpret_cast<type>(::rpl_func);               \
+        }                                                          \
+      } func = {};                                                 \
+    }                                                              \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_SYS (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to the system provided function func, if GNULIB_NAMESPACE
+   is defined.
+   Example:
+     _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+
+   Wrapping func in an object with an inline conversion operator
+   avoids a reference to func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS(func,rettype,parameters)            \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::func;                                      \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                          \
+    {                                                   \
+      static const struct _gl_ ## func ## _wrapper      \
+      {                                                 \
+        typedef rettype (*type) parameters;             \
+                                                        \
+        inline operator type () const                   \
+        {                                               \
+          return reinterpret_cast<type>(::func);        \
+        }                                               \
+      } func = {};                                      \
+    }                                                   \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function is picked among a set of overloaded functions,
+   namely the one with rettype2 and parameters2.  Two consecutive casts
+   are used to silence the "cannot find a match" and "invalid conversion"
+   errors that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+  /* The outer cast must be a reinterpret_cast.
+     The inner cast: When the function is defined as a set of overloaded
+     functions, it works as a static_cast<>, choosing the designated variant.
+     When the function is defined as a single variant, it works as a
+     reinterpret_cast<>. The parenthesized cast syntax works both ways.  */
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    namespace GNULIB_NAMESPACE                                                \
+    {                                                                         \
+      static const struct _gl_ ## func ## _wrapper                            \
+      {                                                                       \
+        typedef rettype (*type) parameters;                                   \
+                                                                              \
+        inline operator type () const                                         \
+        {                                                                     \
+          return reinterpret_cast<type>((rettype2 (*) parameters2)(::func));  \
+        }                                                                     \
+      } func = {};                                                            \
+    }                                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN (func);
+   causes a warning to be emitted when ::func is used but not when
+   GNULIB_NAMESPACE::func is used.  func must be defined without overloaded
+   variants.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN(func) \
+   _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN_1(func,namespace) \
+   _GL_CXXALIASWARN_2 (func, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+    _GL_WARN_ON_USE (func, \
+                     "The symbol ::" #func " refers to the system function. " \
+                     "Use " #namespace "::" #func " instead.")
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     extern __typeof__ (func) func
+# else
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN(func) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
+   causes a warning to be emitted when the given overloaded variant of ::func
+   is used but not when GNULIB_NAMESPACE::func is used.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+   _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
+                        GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
+   _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
+                         "The symbol ::" #func " refers to the system function. " \
+                         "Use " #namespace "::" #func " instead.")
+# else
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+#endif /* _GL_CXXDEFS_H */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+/* A C macro for emitting warnings if a function is used.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
+   for FUNCTION which will then trigger a compiler warning containing
+   the text of "literal string" anywhere that function is called, if
+   supported by the compiler.  If the compiler does not support this
+   feature, the macro expands to an unused extern declaration.
+
+   _GL_WARN_ON_USE_ATTRIBUTE ("literal string") expands to the
+   attribute used in _GL_WARN_ON_USE.  If the compiler does not support
+   this feature, it expands to empty.
+
+   These macros are useful for marking a function as a potential
+   portability trap, with the intent that "literal string" include
+   instructions on the replacement function that should be used
+   instead.
+   _GL_WARN_ON_USE is for functions with 'extern' linkage.
+   _GL_WARN_ON_USE_ATTRIBUTE is for functions with 'static' or 'inline'
+   linkage.
+
+   However, one of the reasons that a function is a portability trap is
+   if it has the wrong signature.  Declaring FUNCTION with a different
+   signature in C is a compilation error, so this macro must use the
+   same type as any existing declaration so that programs that avoid
+   the problematic FUNCTION do not fail to compile merely because they
+   included a header that poisoned the function.  But this implies that
+   _GL_WARN_ON_USE is only safe to use if FUNCTION is known to already
+   have a declaration.  Use of this macro implies that there must not
+   be any other macro hiding the declaration of FUNCTION; but
+   undefining FUNCTION first is part of the poisoning process anyway
+   (although for symbols that are provided only via a macro, the result
+   is a compilation error rather than a warning containing
+   "literal string").  Also note that in C++, it is only safe to use if
+   FUNCTION has no overloads.
+
+   For an example, it is possible to poison 'getline' by:
+   - adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
+     [getline]) in configure.ac, which potentially defines
+     HAVE_RAW_DECL_GETLINE
+   - adding this code to a header that wraps the system <stdio.h>:
+     #undef getline
+     #if HAVE_RAW_DECL_GETLINE
+     _GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
+       "not universally present; use the gnulib module getline");
+     #endif
+
+   It is not possible to directly poison global variables.  But it is
+   possible to write a wrapper accessor function, and poison that
+   (less common usage, like &environ, will cause a compilation error
+   rather than issue the nice warning, but the end result of informing
+   the developer about their portability problem is still achieved):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     rpl_environ (void) { return &environ; }
+     _GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   or better (avoiding contradictory use of 'static' and 'extern'):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     _GL_WARN_ON_USE_ATTRIBUTE ("environ is not always properly declared")
+     rpl_environ (void) { return &environ; }
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   */
+#ifndef _GL_WARN_ON_USE
+
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# else /* Unsupported.  */
+#  define _GL_WARN_ON_USE(function, message) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# endif
+#endif
+
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
+   This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
+   not work in this case.  */
+#ifndef _GL_WARN_ON_USE_CXX
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
+# endif
+#endif
+
+/* _GL_WARN_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#ifndef _GL_WARN_EXTERN_C
+# if defined __cplusplus
+#  define _GL_WARN_EXTERN_C extern "C"
+# else
+#  define _GL_WARN_EXTERN_C extern
+# endif
+#endif
+
+
+/* Declare overridden functions.  */
+
+#if 0
+/* Return the session ID of the controlling terminal of the current process.
+   The argument is a descriptor if this controlling terminal.
+   Return -1, with errno set, upon failure.  errno = ENOSYS means that the
+   function is unsupported.  */
+# if !1
+_GL_FUNCDECL_SYS (tcgetsid, pid_t, (int fd));
+# endif
+_GL_CXXALIAS_SYS (tcgetsid, pid_t, (int fd));
+_GL_CXXALIASWARN (tcgetsid);
+#elif defined GNULIB_POSIXCHECK
+# undef tcgetsid
+# if HAVE_RAW_DECL_TCGETSID
+_GL_WARN_ON_USE (tcgetsid, "tcgetsid is not portable - "
+                 "use gnulib module tcgetsid for portability");
+# endif
+#endif
+
+
+#endif /* _GL_TERMIOS_H */
+#endif /* _GL_TERMIOS_H */
diff --git a/linux_glibc-lib/textstyle.h b/linux_glibc-lib/textstyle.h
index 3011cad..42fddfc 100644
--- a/linux_glibc-lib/textstyle.h
+++ b/linux_glibc-lib/textstyle.h
@@ -1,6 +1,6 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Dummy replacement for part of the public API of the libtextstyle library.
-   Copyright (C) 2006-2007, 2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2007, 2019-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -43,6 +43,32 @@
 # include <termios.h>
 #endif
 
+/* An __attribute__ __format__ specifier for a function that takes a format
+   string and arguments, where the format string directives are the ones
+   standardized by ISO C99 and POSIX.
+   _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD  */
+/* __gnu_printf__ is supported in GCC >= 4.4.  */
+#ifndef _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD
+# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+#  define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __gnu_printf__
+# else
+#  define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __printf__
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_MAYBE_UNUSED declares that it is not a programming mistake if
+   the entity is not used.  The compiler should not warn if the entity is not
+   used.  */
+#ifndef _GL_ATTRIBUTE_MAYBE_UNUSED
+# if 0 /* no GCC or clang version supports this yet */
+#  define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
+# elif defined __GNUC__ || defined __clang__
+#  define _GL_ATTRIBUTE_MAYBE_UNUSED __attribute__ ((__unused__))
+# else
+#  define _GL_ATTRIBUTE_MAYBE_UNUSED
+# endif
+#endif
+
 /* ----------------------------- From ostream.h ----------------------------- */
 
 /* Describes the scope of a flush operation.  */
@@ -116,8 +142,8 @@
 
 static inline ptrdiff_t ostream_printf (ostream_t stream,
                                         const char *format, ...)
-#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ > 3
-  __attribute__ ((__format__ (__printf__, 2, 3)))
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || defined __clang__
+  __attribute__ ((__format__ (_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 2, 3)))
 #endif
   ;
 static inline ptrdiff_t
@@ -141,8 +167,8 @@
 
 static inline ptrdiff_t ostream_vprintf (ostream_t stream,
                                          const char *format, va_list args)
-#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ > 3
-  __attribute__ ((__format__ (__printf__, 2, 0)))
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || defined __clang__
+  __attribute__ ((__format__ (_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 2, 0)))
 #endif
   ;
 static inline ptrdiff_t
@@ -168,38 +194,38 @@
 #define styled_ostream_free ostream_free
 
 static inline void
-styled_ostream_begin_use_class (styled_ostream_t stream _GL_UNUSED,
-                                const char *classname _GL_UNUSED)
+styled_ostream_begin_use_class (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream,
+                                _GL_ATTRIBUTE_MAYBE_UNUSED const char *classname)
 {
 }
 
 static inline void
-styled_ostream_end_use_class (styled_ostream_t stream _GL_UNUSED,
-                              const char *classname _GL_UNUSED)
+styled_ostream_end_use_class (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream,
+                              _GL_ATTRIBUTE_MAYBE_UNUSED const char *classname)
 {
 }
 
 static inline const char *
-styled_ostream_get_hyperlink_ref (styled_ostream_t stream _GL_UNUSED)
+styled_ostream_get_hyperlink_ref (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream)
 {
   return NULL;
 }
 
 static inline const char *
-styled_ostream_get_hyperlink_id (styled_ostream_t stream _GL_UNUSED)
+styled_ostream_get_hyperlink_id (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream)
 {
   return NULL;
 }
 
 static inline void
-styled_ostream_set_hyperlink (styled_ostream_t stream _GL_UNUSED,
-                              const char *ref _GL_UNUSED,
-                              const char *id _GL_UNUSED)
+styled_ostream_set_hyperlink (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream,
+                              _GL_ATTRIBUTE_MAYBE_UNUSED const char *ref,
+                              _GL_ATTRIBUTE_MAYBE_UNUSED const char *id)
 {
 }
 
 static inline void
-styled_ostream_flush_to_current_style (styled_ostream_t stream _GL_UNUSED)
+styled_ostream_flush_to_current_style (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream)
 {
 }
 
@@ -226,8 +252,8 @@
 #define fd_ostream_free ostream_free
 
 static inline fd_ostream_t
-fd_ostream_create (int fd, const char *filename _GL_UNUSED,
-                   bool buffered _GL_UNUSED)
+fd_ostream_create (int fd, _GL_ATTRIBUTE_MAYBE_UNUSED const char *filename,
+                   _GL_ATTRIBUTE_MAYBE_UNUSED bool buffered)
 {
   if (fd == 1)
     return stdout;
@@ -273,81 +299,81 @@
 #define term_ostream_free ostream_free
 
 static inline term_color_t
-term_ostream_get_color (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_color (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return COLOR_DEFAULT;
 }
 
 static inline void
-term_ostream_set_color (term_ostream_t stream _GL_UNUSED,
-                        term_color_t color _GL_UNUSED)
+term_ostream_set_color (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                        _GL_ATTRIBUTE_MAYBE_UNUSED term_color_t color)
 {
 }
 
 static inline term_color_t
-term_ostream_get_bgcolor (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_bgcolor (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return COLOR_DEFAULT;
 }
 
 static inline void
-term_ostream_set_bgcolor (term_ostream_t stream _GL_UNUSED,
-                          term_color_t color _GL_UNUSED)
+term_ostream_set_bgcolor (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                          _GL_ATTRIBUTE_MAYBE_UNUSED term_color_t color)
 {
 }
 
 static inline term_weight_t
-term_ostream_get_weight (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_weight (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return WEIGHT_DEFAULT;
 }
 
 static inline void
-term_ostream_set_weight (term_ostream_t stream _GL_UNUSED,
-                         term_weight_t weight _GL_UNUSED)
+term_ostream_set_weight (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                         _GL_ATTRIBUTE_MAYBE_UNUSED term_weight_t weight)
 {
 }
 
 static inline term_posture_t
-term_ostream_get_posture (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_posture (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return POSTURE_DEFAULT;
 }
 
 static inline void
-term_ostream_set_posture (term_ostream_t stream _GL_UNUSED,
-                          term_posture_t posture _GL_UNUSED)
+term_ostream_set_posture (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                          _GL_ATTRIBUTE_MAYBE_UNUSED term_posture_t posture)
 {
 }
 
 static inline term_underline_t
-term_ostream_get_underline (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_underline (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return UNDERLINE_DEFAULT;
 }
 
 static inline void
-term_ostream_set_underline (term_ostream_t stream _GL_UNUSED,
-                            term_underline_t underline _GL_UNUSED)
+term_ostream_set_underline (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED term_underline_t underline)
 {
 }
 
 static inline const char *
-term_ostream_get_hyperlink_ref (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_hyperlink_ref (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return NULL;
 }
 
 static inline const char *
-term_ostream_get_hyperlink_id (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_hyperlink_id (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return NULL;
 }
 
 static inline void
-term_ostream_set_hyperlink (term_ostream_t stream _GL_UNUSED,
-                            const char *ref _GL_UNUSED,
-                            const char *id _GL_UNUSED)
+term_ostream_set_hyperlink (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED const char *ref,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED const char *id)
 {
 }
 
@@ -375,7 +401,7 @@
 
 static inline term_ostream_t
 term_ostream_create (int fd, const char *filename,
-                     ttyctl_t tty_control _GL_UNUSED)
+                     _GL_ATTRIBUTE_MAYBE_UNUSED ttyctl_t tty_control)
 {
   return fd_ostream_create (fd, filename, true);
 }
@@ -396,8 +422,8 @@
 
 static inline term_styled_ostream_t
 term_styled_ostream_create (int fd, const char *filename,
-                            ttyctl_t tty_control _GL_UNUSED,
-                            const char *css_filename _GL_UNUSED)
+                            _GL_ATTRIBUTE_MAYBE_UNUSED ttyctl_t tty_control,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED const char *css_filename)
 {
   return fd_ostream_create (fd, filename, true);
 }
@@ -407,8 +433,8 @@
 typedef styled_ostream_t html_styled_ostream_t;
 
 static inline html_styled_ostream_t
-html_styled_ostream_create (ostream_t destination _GL_UNUSED,
-                            const char *css_filename _GL_UNUSED)
+html_styled_ostream_create (_GL_ATTRIBUTE_MAYBE_UNUSED ostream_t destination,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED const char *css_filename)
 {
   abort ();
   return NULL;
@@ -424,13 +450,13 @@
 #define style_file_name NULL
 
 static inline bool
-handle_color_option (const char *option _GL_UNUSED)
+handle_color_option (_GL_ATTRIBUTE_MAYBE_UNUSED const char *option)
 {
   return false;
 }
 
 static inline void
-handle_style_option (const char *option _GL_UNUSED)
+handle_style_option (_GL_ATTRIBUTE_MAYBE_UNUSED const char *option)
 {
 }
 
@@ -441,10 +467,10 @@
 }
 
 static inline void
-style_file_prepare (const char *style_file_envvar _GL_UNUSED,
-                    const char *stylesdir_envvar _GL_UNUSED,
-                    const char *stylesdir_after_install _GL_UNUSED,
-                    const char *default_style_file _GL_UNUSED)
+style_file_prepare (_GL_ATTRIBUTE_MAYBE_UNUSED const char *style_file_envvar,
+                    _GL_ATTRIBUTE_MAYBE_UNUSED const char *stylesdir_envvar,
+                    _GL_ATTRIBUTE_MAYBE_UNUSED const char *stylesdir_after_install,
+                    _GL_ATTRIBUTE_MAYBE_UNUSED const char *default_style_file)
 {
 }
 
@@ -452,14 +478,14 @@
 
 static inline styled_ostream_t
 styled_ostream_create (int fd, const char *filename,
-                       ttyctl_t tty_control _GL_UNUSED,
-                       const char *css_filename _GL_UNUSED)
+                       _GL_ATTRIBUTE_MAYBE_UNUSED ttyctl_t tty_control,
+                       _GL_ATTRIBUTE_MAYBE_UNUSED const char *css_filename)
 {
   return fd_ostream_create (fd, filename, true);
 }
 
 static inline void
-libtextstyle_set_failure_exit_code (int exit_code _GL_UNUSED)
+libtextstyle_set_failure_exit_code (_GL_ATTRIBUTE_MAYBE_UNUSED int exit_code)
 {
 }
 
diff --git a/linux_glibc-lib/time.h b/linux_glibc-lib/time.h
index 1262e7c..1d9ad11 100644
--- a/linux_glibc-lib/time.h
+++ b/linux_glibc-lib/time.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A more-standard <time.h>.
 
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 #pragma GCC system_header
@@ -51,19 +51,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -198,6 +198,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -223,6 +233,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -320,7 +338,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -348,14 +366,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -369,26 +384,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -397,19 +412,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -485,6 +500,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -497,24 +519,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -575,6 +608,25 @@
 #  define GNULIB_defined_struct_time_t_must_be_integral 1
 # endif
 
+/* Define TIME_UTC, a positive integer constant used for timespec_get().  */
+# if ! 1
+#  if !GNULIB_defined_TIME_UTC
+#   define TIME_UTC 1
+#   define GNULIB_defined_TIME_UTC 1
+#  endif
+# endif
+
+/* Set *TS to the current time, and return BASE.
+   Upon failure, return 0.  */
+# if 0
+#  if ! 1
+_GL_FUNCDECL_SYS (timespec_get, int, (struct timespec *ts, int base)
+                                     _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (timespec_get, int, (struct timespec *ts, int base));
+_GL_CXXALIASWARN (timespec_get);
+# endif
+
 /* Sleep for at least RQTP seconds unless interrupted,  If interrupted,
    return -1 and store the remaining time into RMTP.  See
    <https://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html>.  */
@@ -609,10 +661,27 @@
 #   endif
 _GL_FUNCDECL_RPL (tzset, void, (void));
 _GL_CXXALIAS_RPL (tzset, void, (void));
-#  else
-#   if ! 1
-_GL_FUNCDECL_SYS (tzset, void, (void));
+#  elif defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef tzset
+#    define tzset _tzset
 #   endif
+_GL_CXXALIAS_MDA (tzset, void, (void));
+#  else
+_GL_CXXALIAS_SYS (tzset, void, (void));
+#  endif
+_GL_CXXALIASWARN (tzset);
+# elif 1
+/* On native Windows, map 'tzset' to '_tzset', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::tzset always.  */
+#  if defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef tzset
+#    define tzset _tzset
+#   endif
+_GL_CXXALIAS_MDA (tzset, void, (void));
+#  else
 _GL_CXXALIAS_SYS (tzset, void, (void));
 #  endif
 _GL_CXXALIASWARN (tzset);
@@ -760,14 +829,17 @@
 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #    define strftime rpl_strftime
 #   endif
-_GL_FUNCDECL_RPL (strftime, size_t, (char *__buf, size_t __bufsize,
-                                     const char *__fmt, const struct tm *__tp)
-                                    _GL_ARG_NONNULL ((1, 3, 4)));
-_GL_CXXALIAS_RPL (strftime, size_t, (char *__buf, size_t __bufsize,
-                                     const char *__fmt, const struct tm *__tp));
+_GL_FUNCDECL_RPL (strftime, size_t,
+                  (char *restrict __buf, size_t __bufsize,
+                   const char *restrict __fmt, const struct tm *restrict __tp)
+                  _GL_ARG_NONNULL ((1, 3, 4)));
+_GL_CXXALIAS_RPL (strftime, size_t,
+                  (char *restrict __buf, size_t __bufsize,
+                   const char *restrict __fmt, const struct tm *restrict __tp));
 #  else
-_GL_CXXALIAS_SYS (strftime, size_t, (char *__buf, size_t __bufsize,
-                                     const char *__fmt, const struct tm *__tp));
+_GL_CXXALIAS_SYS (strftime, size_t,
+                  (char *restrict __buf, size_t __bufsize,
+                   const char *restrict __fmt, const struct tm *restrict __tp));
 #  endif
 #  if __GLIBC__ >= 2
 _GL_CXXALIASWARN (strftime);
@@ -775,22 +847,60 @@
 # endif
 
 # if defined _GNU_SOURCE && 0 && ! 0
+/* Functions that use a first-class time zone data type, instead of
+   relying on an implicit global time zone.
+   Inspired by NetBSD.  */
+
+/* Represents a time zone.
+   (timezone_t) NULL stands for UTC.  */
 typedef struct tm_zone *timezone_t;
+
+/* tzalloc (name)
+   Returns a time zone object for the given time zone NAME.  This object
+   represents the time zone that other functions would use it the TZ
+   environment variable was set to NAME.
+   If NAME is NULL, the result represents the time zone that other functions
+   would use it the TZ environment variable was unset.
+   May return NULL if NAME is invalid (this is platform dependent) or
+   upon memory allocation failure.  */
 _GL_FUNCDECL_SYS (tzalloc, timezone_t, (char const *__name));
 _GL_CXXALIAS_SYS (tzalloc, timezone_t, (char const *__name));
+
+/* tzfree (tz)
+   Frees a time zone object.
+   The argument must have been returned by tzalloc().  */
 _GL_FUNCDECL_SYS (tzfree, void, (timezone_t __tz));
 _GL_CXXALIAS_SYS (tzfree, void, (timezone_t __tz));
+
+/* localtime_rz (tz, &t, &result)
+   Converts an absolute time T to a broken-down time RESULT, assuming the
+   time zone TZ.
+   This function is like 'localtime_r', but relies on the argument TZ instead
+   of an implicit global time zone.  */
 _GL_FUNCDECL_SYS (localtime_rz, struct tm *,
                   (timezone_t __tz, time_t const *restrict __timer,
                    struct tm *restrict __result) _GL_ARG_NONNULL ((2, 3)));
 _GL_CXXALIAS_SYS (localtime_rz, struct tm *,
                   (timezone_t __tz, time_t const *restrict __timer,
                    struct tm *restrict __result));
+
+/* mktime_z (tz, &tm)
+   Normalizes the broken-down time TM and converts it to an absolute time,
+   assuming the time zone TZ.  Returns the absolute time.
+   This function is like 'mktime', but relies on the argument TZ instead
+   of an implicit global time zone.  */
 _GL_FUNCDECL_SYS (mktime_z, time_t,
-                  (timezone_t __tz, struct tm *restrict __result)
+                  (timezone_t __tz, struct tm *restrict __tm)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_SYS (mktime_z, time_t,
-                  (timezone_t __tz, struct tm *restrict __result));
+                  (timezone_t __tz, struct tm *restrict __tm));
+
+/* Time zone abbreviation strings (returned by 'localtime_rz' or 'mktime_z'
+   in the 'tm_zone' member of 'struct tm') are valid as long as
+     - the 'struct tm' argument is not destroyed or overwritten,
+   and
+     - the 'timezone_t' argument is not freed through tzfree().  */
+
 # endif
 
 /* Convert TM to a time_t value, assuming UTC.  */
@@ -821,17 +931,17 @@
 # endif
 # if defined GNULIB_POSIXCHECK
 #  undef asctime_r
-_GL_WARN_ON_USE (asctime, "asctime_r can overrun buffers in some cases - "
+_GL_WARN_ON_USE (asctime_r, "asctime_r can overrun buffers in some cases - "
                  "better use strftime (or even sprintf) instead");
 # endif
 # if defined GNULIB_POSIXCHECK
 #  undef ctime
-_GL_WARN_ON_USE (asctime, "ctime can overrun buffers in some cases - "
+_GL_WARN_ON_USE (ctime, "ctime can overrun buffers in some cases - "
                  "better use strftime (or even sprintf) instead");
 # endif
 # if defined GNULIB_POSIXCHECK
 #  undef ctime_r
-_GL_WARN_ON_USE (asctime, "ctime_r can overrun buffers in some cases - "
+_GL_WARN_ON_USE (ctime_r, "ctime_r can overrun buffers in some cases - "
                  "better use strftime (or even sprintf) instead");
 # endif
 
diff --git a/linux_glibc-lib/unistd.h b/linux_glibc-lib/unistd.h
index 2ca53ba..563589f 100644
--- a/linux_glibc-lib/unistd.h
+++ b/linux_glibc-lib/unistd.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Substitute for and wrapper around <unistd.h>.
-   Copyright (C) 2003-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_UNISTD_H
 
@@ -22,7 +22,7 @@
 #endif
 
 
-#ifdef _GL_INCLUDING_UNISTD_H
+#if 1 && defined _GL_INCLUDING_UNISTD_H
 /* Special invocation convention:
    - On Mac OS X 10.3.9 we have a sequence of nested includes
      <unistd.h> -> <signal.h> -> <pthread.h> -> <unistd.h>
@@ -94,20 +94,18 @@
 # undef __need_system_stdlib_h
 #endif
 
-/* Native Windows platforms declare chdir, getcwd, rmdir in
+/* Native Windows platforms declare _chdir, _getcwd, _rmdir in
    <io.h> and/or <direct.h>, not in <unistd.h>.
-   They also declare access(), chmod(), close(), dup(), dup2(), isatty(),
-   lseek(), read(), unlink(), write() in <io.h>.  */
-#if ((0 || 0 || 0 \
-      || defined GNULIB_POSIXCHECK) \
-     && (defined _WIN32 && ! defined __CYGWIN__))
-# include <io.h>     /* mingw32, mingw64 */
-# include <direct.h> /* mingw64, MSVC 9 */
-#elif (1 || 0 || 1 || 0 \
-       || 0 || 0 || 1 || 0 \
-       || defined GNULIB_POSIXCHECK) \
-      && (defined _WIN32 && ! defined __CYGWIN__)
+   They also declare _access(), _chmod(), _close(), _dup(), _dup2(), _isatty(),
+   _lseek(), _read(), _unlink(), _write() in <io.h>.  */
+#if defined _WIN32 && !defined __CYGWIN__
 # include <io.h>
+# include <direct.h>
+#endif
+
+/* Native Windows platforms declare _execl*, _execv* in <process.h>.  */
+#if defined _WIN32 && !defined __CYGWIN__
+# include <process.h>
 #endif
 
 /* AIX and OSF/1 5.1 declare getdomainname in <netdb.h>, not in <unistd.h>.
@@ -119,6 +117,17 @@
 # include <netdb.h>
 #endif
 
+/* Mac OS X 10.13, Solaris 11.4, and Android 9.0 declare getentropy in
+   <sys/random.h>, not in <unistd.h>.  */
+/* But avoid namespace pollution on glibc systems.  */
+#if (0 || defined GNULIB_POSIXCHECK) \
+    && ((defined __APPLE__ && defined __MACH__) || defined __sun \
+        || defined __ANDROID__) \
+    && 0 \
+    && !defined __GLIBC__
+# include <sys/random.h>
+#endif
+
 /* Android 4.3 declares fchownat in <sys/stat.h>, not in <unistd.h>.  */
 /* But avoid namespace pollution on glibc systems.  */
 #if (0 || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \
@@ -128,27 +137,24 @@
 
 /* MSVC defines off_t in <sys/types.h>.
    May also define off_t to a 64-bit type on native Windows.  */
-/* But avoid namespace pollution on glibc systems.  */
-#ifndef __GLIBC__
-/* Get off_t, ssize_t.  */
-# include <sys/types.h>
-#endif
+/* Get off_t, ssize_t, mode_t.  */
+#include <sys/types.h>
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -283,6 +289,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -308,6 +324,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -405,7 +429,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -433,14 +457,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -454,26 +475,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -482,19 +503,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -570,6 +591,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -582,24 +610,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -615,7 +654,7 @@
 
 
 /* Get getopt(), optarg, optind, opterr, optopt.  */
-#if 0 && !defined _GL_SYSTEM_GETOPT
+#if 1 && 00 && !defined _GL_SYSTEM_GETOPT
 # include <getopt-cdefs.h>
 # include <getopt-pfx-core.h>
 #endif
@@ -727,7 +766,7 @@
 /* Declare overridden functions.  */
 
 
-#if 0
+#if 1
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef access
@@ -736,6 +775,12 @@
 _GL_FUNCDECL_RPL (access, int, (const char *file, int mode)
                                _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (access, int, (const char *file, int mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef access
+#   define access _access
+#  endif
+_GL_CXXALIAS_MDA (access, int, (const char *file, int mode));
 # else
 _GL_CXXALIAS_SYS (access, int, (const char *file, int mode));
 # endif
@@ -749,11 +794,33 @@
                  "also, this function is a security risk - "
                  "use the gnulib module faccessat instead");
 # endif
+#elif 1
+/* On native Windows, map 'access' to '_access', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::access always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef access
+#   define access _access
+#  endif
+_GL_CXXALIAS_MDA (access, int, (const char *file, int mode));
+# else
+_GL_CXXALIAS_SYS (access, int, (const char *file, int mode));
+# endif
+_GL_CXXALIASWARN (access);
 #endif
 
 
 #if 0
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef chdir
+#   define chdir _chdir
+#  endif
+_GL_CXXALIAS_MDA (chdir, int, (const char *file));
+# else
 _GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
+# endif
 _GL_CXXALIASWARN (chdir);
 #elif defined GNULIB_POSIXCHECK
 # undef chdir
@@ -761,6 +828,20 @@
 _GL_WARN_ON_USE (chown, "chdir is not always in <unistd.h> - "
                  "use gnulib module chdir for portability");
 # endif
+#elif 1
+/* On native Windows, map 'chdir' to '_chdir', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::chdir always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef chdir
+#   define chdir _chdir
+#  endif
+_GL_CXXALIAS_MDA (chdir, int, (const char *file));
+# else
+_GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIASWARN (chdir);
 #endif
 
 
@@ -805,6 +886,12 @@
 #  endif
 _GL_FUNCDECL_RPL (close, int, (int fd));
 _GL_CXXALIAS_RPL (close, int, (int fd));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef close
+#   define close _close
+#  endif
+_GL_CXXALIAS_MDA (close, int, (int fd));
 # else
 _GL_CXXALIAS_SYS (close, int, (int fd));
 # endif
@@ -817,6 +904,20 @@
 /* Assume close is always declared.  */
 _GL_WARN_ON_USE (close, "close does not portably work on sockets - "
                  "use gnulib module close for portability");
+#elif 1
+/* On native Windows, map 'close' to '_close', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::close always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef close
+#   define close _close
+#  endif
+_GL_CXXALIAS_MDA (close, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (close, int, (int fd));
+# endif
+_GL_CXXALIASWARN (close);
 #endif
 
 
@@ -831,10 +932,11 @@
 # endif
 _GL_CXXALIASWARN (copy_file_range);
 #elif defined GNULIB_POSIXCHECK
-/* Assume copy_file_range is always declared.  */
+# if HAVE_RAW_DECL_COPY_FILE_RANGE
 _GL_WARN_ON_USE (copy_file_range,
                  "copy_file_range is unportable - "
                  "use gnulib module copy_file_range for portability");
+# endif
 #endif
 
 
@@ -845,6 +947,12 @@
 #  endif
 _GL_FUNCDECL_RPL (dup, int, (int oldfd));
 _GL_CXXALIAS_RPL (dup, int, (int oldfd));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dup
+#   define dup _dup
+#  endif
+_GL_CXXALIAS_MDA (dup, int, (int oldfd));
 # else
 _GL_CXXALIAS_SYS (dup, int, (int oldfd));
 # endif
@@ -855,6 +963,20 @@
 _GL_WARN_ON_USE (dup, "dup is unportable - "
                  "use gnulib module dup for portability");
 # endif
+#elif 1
+/* On native Windows, map 'dup' to '_dup', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::dup always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dup
+#   define dup _dup
+#  endif
+_GL_CXXALIAS_MDA (dup, int, (int oldfd));
+# else
+_GL_CXXALIAS_SYS (dup, int, (int oldfd));
+# endif
+_GL_CXXALIASWARN (dup);
 #endif
 
 
@@ -870,10 +992,13 @@
 #  endif
 _GL_FUNCDECL_RPL (dup2, int, (int oldfd, int newfd));
 _GL_CXXALIAS_RPL (dup2, int, (int oldfd, int newfd));
-# else
-#  if !1
-_GL_FUNCDECL_SYS (dup2, int, (int oldfd, int newfd));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dup2
+#   define dup2 _dup2
 #  endif
+_GL_CXXALIAS_MDA (dup2, int, (int oldfd, int newfd));
+# else
 _GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
 # endif
 _GL_CXXALIASWARN (dup2);
@@ -883,6 +1008,20 @@
 _GL_WARN_ON_USE (dup2, "dup2 is unportable - "
                  "use gnulib module dup2 for portability");
 # endif
+#elif 1
+/* On native Windows, map 'dup2' to '_dup2', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::dup2 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dup2
+#   define dup2 _dup2
+#  endif
+_GL_CXXALIAS_MDA (dup2, int, (int oldfd, int newfd));
+# else
+_GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
+# endif
+_GL_CXXALIASWARN (dup2);
 #endif
 
 
@@ -986,6 +1125,282 @@
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execl
+#   define execl rpl_execl
+#  endif
+_GL_FUNCDECL_RPL (execl, int, (const char *program, const char *arg, ...)
+                              _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execl, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execl, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execl);
+#elif defined GNULIB_POSIXCHECK
+# undef execl
+# if HAVE_RAW_DECL_EXECL
+_GL_WARN_ON_USE (execl, "execl behaves very differently on mingw - "
+                 "use gnulib module execl for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execl' to '_execl', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execl always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execl
+#   define execl _execl
+#  endif
+_GL_CXXALIAS_MDA (execl, intptr_t, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execl, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execl);
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execle
+#   define execle rpl_execle
+#  endif
+_GL_FUNCDECL_RPL (execle, int, (const char *program, const char *arg, ...)
+                               _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execle, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execle, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execle);
+#elif defined GNULIB_POSIXCHECK
+# undef execle
+# if HAVE_RAW_DECL_EXECLE
+_GL_WARN_ON_USE (execle, "execle behaves very differently on mingw - "
+                 "use gnulib module execle for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execle' to '_execle', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execle always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execle
+#   define execle _execle
+#  endif
+_GL_CXXALIAS_MDA (execle, intptr_t,
+                  (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execle, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execle);
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execlp
+#   define execlp rpl_execlp
+#  endif
+_GL_FUNCDECL_RPL (execlp, int, (const char *program, const char *arg, ...)
+                               _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execlp, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execlp, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execlp);
+#elif defined GNULIB_POSIXCHECK
+# undef execlp
+# if HAVE_RAW_DECL_EXECLP
+_GL_WARN_ON_USE (execlp, "execlp behaves very differently on mingw - "
+                 "use gnulib module execlp for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execlp' to '_execlp', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execlp always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execlp
+#   define execlp _execlp
+#  endif
+_GL_CXXALIAS_MDA (execlp, intptr_t,
+                  (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execlp, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execlp);
+#endif
+
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execv
+#   define execv rpl_execv
+#  endif
+_GL_FUNCDECL_RPL (execv, int, (const char *program, char * const *argv)
+                              _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execv, int, (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execv, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execv);
+#elif defined GNULIB_POSIXCHECK
+# undef execv
+# if HAVE_RAW_DECL_EXECV
+_GL_WARN_ON_USE (execv, "execv behaves very differently on mingw - "
+                 "use gnulib module execv for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execv' to '_execv', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execv always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execv
+#   define execv _execv
+#  endif
+_GL_CXXALIAS_MDA_CAST (execv, intptr_t,
+                       (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execv, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execv);
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execve
+#   define execve rpl_execve
+#  endif
+_GL_FUNCDECL_RPL (execve, int,
+                  (const char *program, char * const *argv, char * const *env)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execve, int,
+                  (const char *program, char * const *argv, char * const *env));
+# else
+_GL_CXXALIAS_SYS (execve, int,
+                  (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execve);
+#elif defined GNULIB_POSIXCHECK
+# undef execve
+# if HAVE_RAW_DECL_EXECVE
+_GL_WARN_ON_USE (execve, "execve behaves very differently on mingw - "
+                 "use gnulib module execve for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execve' to '_execve', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execve always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execve
+#   define execve _execve
+#  endif
+_GL_CXXALIAS_MDA_CAST (execve, intptr_t,
+                       (const char *program, char * const *argv,
+                        char * const *env));
+# else
+_GL_CXXALIAS_SYS (execve, int,
+                  (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execve);
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execvp
+#   define execvp rpl_execvp
+#  endif
+_GL_FUNCDECL_RPL (execvp, int, (const char *program, char * const *argv)
+                               _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execvp, int, (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execvp, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execvp);
+#elif defined GNULIB_POSIXCHECK
+# undef execvp
+# if HAVE_RAW_DECL_EXECVP
+_GL_WARN_ON_USE (execvp, "execvp behaves very differently on mingw - "
+                 "use gnulib module execvp for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execvp' to '_execvp', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execvp always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execvp
+#   define execvp _execvp
+#  endif
+_GL_CXXALIAS_MDA_CAST (execvp, intptr_t,
+                       (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execvp, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execvp);
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execvpe
+#   define execvpe rpl_execvpe
+#  endif
+_GL_FUNCDECL_RPL (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execvpe);
+#elif defined GNULIB_POSIXCHECK
+# undef execvpe
+# if HAVE_RAW_DECL_EXECVPE
+_GL_WARN_ON_USE (execvpe, "execvpe behaves very differently on mingw - "
+                 "use gnulib module execvpe for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execvpe' to '_execvpe', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execvpe on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execvpe
+#   define execvpe _execvpe
+#  endif
+_GL_CXXALIAS_MDA_CAST (execvpe, intptr_t,
+                       (const char *program, char * const *argv,
+                        char * const *env));
+# elif 1
+#  if !1
+_GL_FUNCDECL_SYS (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env));
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || 1
+_GL_CXXALIASWARN (execvpe);
+# endif
+#endif
+
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef faccessat
 #   define faccessat rpl_faccessat
 #  endif
@@ -1070,7 +1485,7 @@
 # undef fchownat
 # if HAVE_RAW_DECL_FCHOWNAT
 _GL_WARN_ON_USE (fchownat, "fchownat is not portable - "
-                 "use gnulib module openat for portability");
+                 "use gnulib module fchownat for portability");
 # endif
 #endif
 
@@ -1141,7 +1556,7 @@
 #endif
 
 
-#if 0
+#if 1
 /* Get the name of the current working directory, and put it in SIZE bytes
    of BUF.
    Return BUF if successful, or NULL if the directory couldn't be determined
@@ -1158,6 +1573,12 @@
 #  endif
 _GL_FUNCDECL_RPL (getcwd, char *, (char *buf, size_t size));
 _GL_CXXALIAS_RPL (getcwd, char *, (char *buf, size_t size));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getcwd
+#   define getcwd _getcwd
+#  endif
+_GL_CXXALIAS_MDA (getcwd, char *, (char *buf, size_t size));
 # else
 /* Need to cast, because on mingw, the second parameter is
                                                    int size.  */
@@ -1170,6 +1591,22 @@
 _GL_WARN_ON_USE (getcwd, "getcwd is unportable - "
                  "use gnulib module getcwd for portability");
 # endif
+#elif 1
+/* On native Windows, map 'getcwd' to '_getcwd', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::getcwd always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getcwd
+#   define getcwd _getcwd
+#  endif
+/* Need to cast, because on mingw, the second parameter is either
+   'int size' or 'size_t size'.  */
+_GL_CXXALIAS_MDA_CAST (getcwd, char *, (char *buf, size_t size));
+# else
+_GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size));
+# endif
+_GL_CXXALIASWARN (getcwd);
 #endif
 
 
@@ -1238,6 +1675,22 @@
 
 
 #if 0
+/* Fill a buffer with random bytes.  */
+# if !1
+_GL_FUNCDECL_SYS (getentropy, int, (void *buffer, size_t length));
+# endif
+_GL_CXXALIAS_SYS (getentropy, int, (void *buffer, size_t length));
+_GL_CXXALIASWARN (getentropy);
+#elif defined GNULIB_POSIXCHECK
+# undef getentropy
+# if HAVE_RAW_DECL_GETENTROPY
+_GL_WARN_ON_USE (getentropy, "getentropy is unportable - "
+                 "use gnulib module getentropy for portability");
+# endif
+#endif
+
+
+#if 0
 /* Return the supplemental groups that the current process belongs to.
    It is unspecified whether the effective group id is in the list.
    If N is 0, return the group count; otherwise, N describes how many
@@ -1379,6 +1832,11 @@
 _GL_FUNCDECL_RPL (getpagesize, int, (void));
 _GL_CXXALIAS_RPL (getpagesize, int, (void));
 # else
+/* On HP-UX, getpagesize exists, but it is not declared in <unistd.h> even if
+   the compiler options -D_HPUX_SOURCE -D_XOPEN_SOURCE=600 are used.  */
+#  if defined __hpux
+_GL_FUNCDECL_SYS (getpagesize, int, (void));
+#  endif
 #  if !1
 #   if !defined getpagesize
 /* This is for POSIX systems.  */
@@ -1483,6 +1941,23 @@
 #endif
 
 
+#if 1
+/* On native Windows, map 'getpid' to '_getpid', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::getpid always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getpid
+#   define getpid _getpid
+#  endif
+_GL_CXXALIAS_MDA (getpid, int, (void));
+# else
+_GL_CXXALIAS_SYS (getpid, pid_t, (void));
+# endif
+_GL_CXXALIASWARN (getpid);
+#endif
+
+
 #if 0
 /* Return the next valid login shell on the system, or NULL when the end of
    the list has been reached.  */
@@ -1553,8 +2028,15 @@
 #   undef isatty
 #   define isatty rpl_isatty
 #  endif
+#  define GNULIB_defined_isatty 1
 _GL_FUNCDECL_RPL (isatty, int, (int fd));
 _GL_CXXALIAS_RPL (isatty, int, (int fd));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef isatty
+#   define isatty _isatty
+#  endif
+_GL_CXXALIAS_MDA (isatty, int, (int fd));
 # else
 _GL_CXXALIAS_SYS (isatty, int, (int fd));
 # endif
@@ -1565,6 +2047,20 @@
 _GL_WARN_ON_USE (isatty, "isatty has portability problems on native Windows - "
                  "use gnulib module isatty for portability");
 # endif
+#elif 1
+/* On native Windows, map 'isatty' to '_isatty', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::isatty always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef isatty
+#   define isatty _isatty
+#  endif
+_GL_CXXALIAS_MDA (isatty, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (isatty, int, (int fd));
+# endif
+_GL_CXXALIASWARN (isatty);
 #endif
 
 
@@ -1676,6 +2172,12 @@
 #  endif
 _GL_FUNCDECL_RPL (lseek, off_t, (int fd, off_t offset, int whence));
 _GL_CXXALIAS_RPL (lseek, off_t, (int fd, off_t offset, int whence));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef lseek
+#   define lseek _lseek
+#  endif
+_GL_CXXALIAS_MDA (lseek, off_t, (int fd, off_t offset, int whence));
 # else
 _GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
 # endif
@@ -1686,10 +2188,24 @@
 _GL_WARN_ON_USE (lseek, "lseek does not fail with ESPIPE on pipes on some "
                  "systems - use gnulib module lseek for portability");
 # endif
+#elif 1
+/* On native Windows, map 'lseek' to '_lseek', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::lseek always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef lseek
+#   define lseek _lseek
+#  endif
+_GL_CXXALIAS_MDA (lseek, long, (int fd, long offset, int whence));
+# else
+_GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
+# endif
+_GL_CXXALIASWARN (lseek);
 #endif
 
 
-#if 0
+#if 1
 /* Create a pipe, defaulting to O_BINARY mode.
    Store the read-end as fd[0] and the write-end as fd[1].
    Return 0 upon success, or -1 with errno set upon failure.  */
@@ -1818,11 +2334,32 @@
 _GL_FUNCDECL_RPL (read, ssize_t, (int fd, void *buf, size_t count)
                                  _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (read, ssize_t, (int fd, void *buf, size_t count));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef read
+#   define read _read
+#  endif
+_GL_CXXALIAS_MDA (read, ssize_t, (int fd, void *buf, size_t count));
 # else
-/* Need to cast, because on mingw, the third parameter is
-                                                          unsigned int count
-   and the return type is 'int'.  */
-_GL_CXXALIAS_SYS_CAST (read, ssize_t, (int fd, void *buf, size_t count));
+_GL_CXXALIAS_SYS (read, ssize_t, (int fd, void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (read);
+#elif 1
+/* On native Windows, map 'read' to '_read', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::read always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef read
+#   define read _read
+#  endif
+#  ifdef __MINGW32__
+_GL_CXXALIAS_MDA (read, int, (int fd, void *buf, unsigned int count));
+#  else
+_GL_CXXALIAS_MDA (read, ssize_t, (int fd, void *buf, unsigned int count));
+#  endif
+# else
+_GL_CXXALIAS_SYS (read, ssize_t, (int fd, void *buf, size_t count));
 # endif
 _GL_CXXALIASWARN (read);
 #endif
@@ -1839,18 +2376,22 @@
 #   define readlink rpl_readlink
 #  endif
 _GL_FUNCDECL_RPL (readlink, ssize_t,
-                  (const char *file, char *buf, size_t bufsize)
+                  (const char *restrict file,
+                   char *restrict buf, size_t bufsize)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (readlink, ssize_t,
-                  (const char *file, char *buf, size_t bufsize));
+                  (const char *restrict file,
+                   char *restrict buf, size_t bufsize));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (readlink, ssize_t,
-                  (const char *file, char *buf, size_t bufsize)
+                  (const char *restrict file,
+                   char *restrict buf, size_t bufsize)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (readlink, ssize_t,
-                  (const char *file, char *buf, size_t bufsize));
+                  (const char *restrict file,
+                   char *restrict buf, size_t bufsize));
 # endif
 _GL_CXXALIASWARN (readlink);
 #elif defined GNULIB_POSIXCHECK
@@ -1868,18 +2409,22 @@
 #   define readlinkat rpl_readlinkat
 #  endif
 _GL_FUNCDECL_RPL (readlinkat, ssize_t,
-                  (int fd, char const *file, char *buf, size_t len)
+                  (int fd, char const *restrict file,
+                   char *restrict buf, size_t len)
                   _GL_ARG_NONNULL ((2, 3)));
 _GL_CXXALIAS_RPL (readlinkat, ssize_t,
-                  (int fd, char const *file, char *buf, size_t len));
+                  (int fd, char const *restrict file,
+                   char *restrict buf, size_t len));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (readlinkat, ssize_t,
-                  (int fd, char const *file, char *buf, size_t len)
+                  (int fd, char const *restrict file,
+                   char *restrict buf, size_t len)
                   _GL_ARG_NONNULL ((2, 3)));
 #  endif
 _GL_CXXALIAS_SYS (readlinkat, ssize_t,
-                  (int fd, char const *file, char *buf, size_t len));
+                  (int fd, char const *restrict file,
+                   char *restrict buf, size_t len));
 # endif
 _GL_CXXALIASWARN (readlinkat);
 #elif defined GNULIB_POSIXCHECK
@@ -1899,6 +2444,12 @@
 #  endif
 _GL_FUNCDECL_RPL (rmdir, int, (char const *name) _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (rmdir, int, (char const *name));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef rmdir
+#   define rmdir _rmdir
+#  endif
+_GL_CXXALIAS_MDA (rmdir, int, (char const *name));
 # else
 _GL_CXXALIAS_SYS (rmdir, int, (char const *name));
 # endif
@@ -1909,6 +2460,20 @@
 _GL_WARN_ON_USE (rmdir, "rmdir is unportable - "
                  "use gnulib module rmdir for portability");
 # endif
+#elif 1
+/* On native Windows, map 'rmdir' to '_rmdir', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::rmdir always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef rmdir
+#   define rmdir _rmdir
+#  endif
+_GL_CXXALIAS_MDA (rmdir, int, (char const *name));
+# else
+_GL_CXXALIAS_SYS (rmdir, int, (char const *name));
+# endif
+_GL_CXXALIASWARN (rmdir);
 #endif
 
 
@@ -1967,6 +2532,31 @@
 #endif
 
 
+#if 1
+/* On native Windows, map 'swab' to '_swab', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::swab always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef swab
+#   define swab _swab
+#  endif
+/* Need to cast, because in old mingw the arguments are
+                             (const char *from, char *to, size_t n).  */
+_GL_CXXALIAS_MDA_CAST (swab, void, (char *from, char *to, int n));
+# else
+#  if defined __hpux /* HP-UX */
+_GL_CXXALIAS_SYS (swab, void, (const char *from, char *to, int n));
+#  elif defined __sun && !defined _XPG4 /* Solaris */
+_GL_CXXALIAS_SYS (swab, void, (const char *from, char *to, ssize_t n));
+#  else
+_GL_CXXALIAS_SYS (swab, void, (const void *from, void *to, ssize_t n));
+#  endif
+# endif
+_GL_CXXALIASWARN (swab);
+#endif
+
+
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
@@ -2091,6 +2681,12 @@
 #  endif
 _GL_FUNCDECL_RPL (unlink, int, (char const *file) _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (unlink, int, (char const *file));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef unlink
+#   define unlink _unlink
+#  endif
+_GL_CXXALIAS_MDA (unlink, int, (char const *file));
 # else
 _GL_CXXALIAS_SYS (unlink, int, (char const *file));
 # endif
@@ -2101,6 +2697,20 @@
 _GL_WARN_ON_USE (unlink, "unlink is not portable - "
                  "use gnulib module unlink for portability");
 # endif
+#elif 1
+/* On native Windows, map 'unlink' to '_unlink', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::unlink always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef unlink
+#   define unlink _unlink
+#  endif
+_GL_CXXALIAS_MDA (unlink, int, (char const *file));
+# else
+_GL_CXXALIAS_SYS (unlink, int, (char const *file));
+# endif
+_GL_CXXALIASWARN (unlink);
 #endif
 
 
@@ -2125,7 +2735,7 @@
 # undef unlinkat
 # if HAVE_RAW_DECL_UNLINKAT
 _GL_WARN_ON_USE (unlinkat, "unlinkat is not portable - "
-                 "use gnulib module openat for portability");
+                 "use gnulib module unlinkat for portability");
 # endif
 #endif
 
@@ -2146,7 +2756,9 @@
 #  if !1
 _GL_FUNCDECL_SYS (usleep, int, (useconds_t n));
 #  endif
-_GL_CXXALIAS_SYS (usleep, int, (useconds_t n));
+/* Need to cast, because on Haiku, the first parameter is
+                                     unsigned int n.  */
+_GL_CXXALIAS_SYS_CAST (usleep, int, (useconds_t n));
 # endif
 _GL_CXXALIASWARN (usleep);
 #elif defined GNULIB_POSIXCHECK
@@ -2170,11 +2782,32 @@
 _GL_FUNCDECL_RPL (write, ssize_t, (int fd, const void *buf, size_t count)
                                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (write, ssize_t, (int fd, const void *buf, size_t count));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef write
+#   define write _write
+#  endif
+_GL_CXXALIAS_MDA (write, ssize_t, (int fd, const void *buf, size_t count));
 # else
-/* Need to cast, because on mingw, the third parameter is
-                                                             unsigned int count
-   and the return type is 'int'.  */
-_GL_CXXALIAS_SYS_CAST (write, ssize_t, (int fd, const void *buf, size_t count));
+_GL_CXXALIAS_SYS (write, ssize_t, (int fd, const void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (write);
+#elif 1
+/* On native Windows, map 'write' to '_write', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::write always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef write
+#   define write _write
+#  endif
+#  ifdef __MINGW32__
+_GL_CXXALIAS_MDA (write, int, (int fd, const void *buf, unsigned int count));
+#  else
+_GL_CXXALIAS_MDA (write, ssize_t, (int fd, const void *buf, unsigned int count));
+#  endif
+# else
+_GL_CXXALIAS_SYS (write, ssize_t, (int fd, const void *buf, size_t count));
 # endif
 _GL_CXXALIASWARN (write);
 #endif
diff --git a/linux_glibc-lib/unistr.h b/linux_glibc-lib/unistr.h
new file mode 100644
index 0000000..f6963df
--- /dev/null
+++ b/linux_glibc-lib/unistr.h
@@ -0,0 +1,754 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Elementary Unicode string functions.
+   Copyright (C) 2001-2002, 2005-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _UNISTR_H
+#define _UNISTR_H
+
+#include "unitypes.h"
+
+/* Get bool.  */
+#include <stdbool.h>
+
+/* Get size_t, ptrdiff_t.  */
+#include <stddef.h>
+
+/* Get free().  */
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Conventions:
+
+   All functions prefixed with u8_ operate on UTF-8 encoded strings.
+   Their unit is an uint8_t (1 byte).
+
+   All functions prefixed with u16_ operate on UTF-16 encoded strings.
+   Their unit is an uint16_t (a 2-byte word).
+
+   All functions prefixed with u32_ operate on UCS-4 encoded strings.
+   Their unit is an uint32_t (a 4-byte word).
+
+   All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
+   n units.
+
+   All arguments starting with "str" and the arguments of functions starting
+   with u8_str/u16_str/u32_str denote a NUL terminated string, i.e. a string
+   which terminates at the first NUL unit.  This termination unit is
+   considered part of the string for all memory allocation purposes, but
+   is not considered part of the string for all other logical purposes.
+
+   Functions returning a string result take a (resultbuf, lengthp) argument
+   pair.  If resultbuf is not NULL and the result fits into *lengthp units,
+   it is put in resultbuf, and resultbuf is returned.  Otherwise, a freshly
+   allocated string is returned.  In both cases, *lengthp is set to the
+   length (number of units) of the returned string.  In case of error,
+   NULL is returned and errno is set.  */
+
+
+/* Elementary string checks.  */
+
+/* Check whether an UTF-8 string is well-formed.
+   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
+extern const uint8_t *
+       u8_check (const uint8_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Check whether an UTF-16 string is well-formed.
+   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
+extern const uint16_t *
+       u16_check (const uint16_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Check whether an UCS-4 string is well-formed.
+   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
+extern const uint32_t *
+       u32_check (const uint32_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+
+/* Elementary string conversions.  */
+
+/* Convert an UTF-8 string to an UTF-16 string.  */
+extern uint16_t *
+       u8_to_u16 (const uint8_t *s, size_t n, uint16_t *resultbuf,
+                  size_t *lengthp);
+
+/* Convert an UTF-8 string to an UCS-4 string.  */
+extern uint32_t *
+       u8_to_u32 (const uint8_t *s, size_t n, uint32_t *resultbuf,
+                  size_t *lengthp);
+
+/* Convert an UTF-16 string to an UTF-8 string.  */
+extern uint8_t *
+       u16_to_u8 (const uint16_t *s, size_t n, uint8_t *resultbuf,
+                  size_t *lengthp);
+
+/* Convert an UTF-16 string to an UCS-4 string.  */
+extern uint32_t *
+       u16_to_u32 (const uint16_t *s, size_t n, uint32_t *resultbuf,
+                   size_t *lengthp);
+
+/* Convert an UCS-4 string to an UTF-8 string.  */
+extern uint8_t *
+       u32_to_u8 (const uint32_t *s, size_t n, uint8_t *resultbuf,
+                  size_t *lengthp);
+
+/* Convert an UCS-4 string to an UTF-16 string.  */
+extern uint16_t *
+       u32_to_u16 (const uint32_t *s, size_t n, uint16_t *resultbuf,
+                   size_t *lengthp);
+
+
+/* Elementary string functions.  */
+
+/* Return the length (number of units) of the first character in S, which is
+   no longer than N.  Return 0 if it is the NUL character.  Return -1 upon
+   failure.  */
+/* Similar to mblen(), except that s must not be NULL.  */
+extern int
+       u8_mblen (const uint8_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_mblen (const uint16_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_mblen (const uint32_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the length (number of units) of the first character in S, putting
+   its 'ucs4_t' representation in *PUC.  Upon failure, *PUC is set to 0xfffd,
+   and an appropriate number of units is returned.
+   The number of available units, N, must be > 0.  */
+/* Similar to mbtowc(), except that puc and s must not be NULL, n must be > 0,
+   and the NUL character is not treated specially.  */
+/* The variants with _unsafe suffix are for backward compatibility with
+   libunistring versions < 0.9.7.  */
+
+#if GNULIB_UNISTR_U8_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n);
+# else
+extern int
+       u8_mbtouc_unsafe_aux (ucs4_t *puc, const uint8_t *s, size_t n);
+static inline int
+u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+  uint8_t c = *s;
+
+  if (c < 0x80)
+    {
+      *puc = c;
+      return 1;
+    }
+  else
+    return u8_mbtouc_unsafe_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n);
+# else
+extern int
+       u16_mbtouc_unsafe_aux (ucs4_t *puc, const uint16_t *s, size_t n);
+static inline int
+u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+  uint16_t c = *s;
+
+  if (c < 0xd800 || c >= 0xe000)
+    {
+      *puc = c;
+      return 1;
+    }
+  else
+    return u16_mbtouc_unsafe_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u32_mbtouc_unsafe (ucs4_t *puc, const uint32_t *s, size_t n);
+# else
+static inline int
+u32_mbtouc_unsafe (ucs4_t *puc,
+                   const uint32_t *s, _GL_ATTRIBUTE_MAYBE_UNUSED size_t n)
+{
+  uint32_t c = *s;
+
+  if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+    *puc = c;
+  else
+    /* invalid multibyte character */
+    *puc = 0xfffd;
+  return 1;
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U8_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n);
+# else
+extern int
+       u8_mbtouc_aux (ucs4_t *puc, const uint8_t *s, size_t n);
+static inline int
+u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+  uint8_t c = *s;
+
+  if (c < 0x80)
+    {
+      *puc = c;
+      return 1;
+    }
+  else
+    return u8_mbtouc_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n);
+# else
+extern int
+       u16_mbtouc_aux (ucs4_t *puc, const uint16_t *s, size_t n);
+static inline int
+u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+  uint16_t c = *s;
+
+  if (c < 0xd800 || c >= 0xe000)
+    {
+      *puc = c;
+      return 1;
+    }
+  else
+    return u16_mbtouc_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n);
+# else
+static inline int
+u32_mbtouc (ucs4_t *puc, const uint32_t *s,
+            _GL_ATTRIBUTE_MAYBE_UNUSED size_t n)
+{
+  uint32_t c = *s;
+
+  if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+    *puc = c;
+  else
+    /* invalid multibyte character */
+    *puc = 0xfffd;
+  return 1;
+}
+# endif
+#endif
+
+/* Return the length (number of units) of the first character in S, putting
+   its 'ucs4_t' representation in *PUC.  Upon failure, *PUC is set to 0xfffd,
+   and -1 is returned for an invalid sequence of units, -2 is returned for an
+   incomplete sequence of units.
+   The number of available units, N, must be > 0.  */
+/* Similar to u*_mbtouc(), except that the return value gives more details
+   about the failure, similar to mbrtowc().  */
+
+#if GNULIB_UNISTR_U8_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+       u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n);
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+       u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n);
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+       u32_mbtoucr (ucs4_t *puc, const uint32_t *s, size_t n);
+#endif
+
+/* Put the multibyte character represented by UC in S, returning its
+   length.  Return -1 upon failure, -2 if the number of available units, N,
+   is too small.  The latter case cannot occur if N >= 6/2/1, respectively.  */
+/* Similar to wctomb(), except that s must not be NULL, and the argument n
+   must be specified.  */
+
+#if GNULIB_UNISTR_U8_UCTOMB || HAVE_LIBUNISTRING
+/* Auxiliary function, also used by u8_chr, u8_strchr, u8_strrchr.  */
+extern int
+       u8_uctomb_aux (uint8_t *s, ucs4_t uc, ptrdiff_t n);
+# if !HAVE_INLINE
+extern int
+       u8_uctomb (uint8_t *s, ucs4_t uc, ptrdiff_t n);
+# else
+static inline int
+u8_uctomb (uint8_t *s, ucs4_t uc, ptrdiff_t n)
+{
+  if (uc < 0x80 && n > 0)
+    {
+      s[0] = uc;
+      return 1;
+    }
+  else
+    return u8_uctomb_aux (s, uc, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_UCTOMB || HAVE_LIBUNISTRING
+/* Auxiliary function, also used by u16_chr, u16_strchr, u16_strrchr.  */
+extern int
+       u16_uctomb_aux (uint16_t *s, ucs4_t uc, ptrdiff_t n);
+# if !HAVE_INLINE
+extern int
+       u16_uctomb (uint16_t *s, ucs4_t uc, ptrdiff_t n);
+# else
+static inline int
+u16_uctomb (uint16_t *s, ucs4_t uc, ptrdiff_t n)
+{
+  if (uc < 0xd800 && n > 0)
+    {
+      s[0] = uc;
+      return 1;
+    }
+  else
+    return u16_uctomb_aux (s, uc, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_UCTOMB || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u32_uctomb (uint32_t *s, ucs4_t uc, ptrdiff_t n);
+# else
+static inline int
+u32_uctomb (uint32_t *s, ucs4_t uc, ptrdiff_t n)
+{
+  if (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000))
+    {
+      if (n > 0)
+        {
+          *s = uc;
+          return 1;
+        }
+      else
+        return -2;
+    }
+  else
+    return -1;
+}
+# endif
+#endif
+
+/* Copy N units from SRC to DEST.  */
+/* Similar to memcpy().  */
+extern uint8_t *
+       u8_cpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_cpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_cpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Copy N units from SRC to DEST, guaranteeing correct behavior for
+   overlapping memory areas.  */
+/* Similar to memmove().  */
+extern uint8_t *
+       u8_move (uint8_t *dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_move (uint16_t *dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_move (uint32_t *dest, const uint32_t *src, size_t n);
+
+/* Set the first N characters of S to UC.  UC should be a character that
+   occupies only 1 unit.  */
+/* Similar to memset().  */
+extern uint8_t *
+       u8_set (uint8_t *s, ucs4_t uc, size_t n);
+extern uint16_t *
+       u16_set (uint16_t *s, ucs4_t uc, size_t n);
+extern uint32_t *
+       u32_set (uint32_t *s, ucs4_t uc, size_t n);
+
+/* Compare S1 and S2, each of length N.  */
+/* Similar to memcmp().  */
+extern int
+       u8_cmp (const uint8_t *s1, const uint8_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_cmp (const uint16_t *s1, const uint16_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_cmp (const uint32_t *s1, const uint32_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Compare S1 and S2.  */
+/* Similar to the gnulib function memcmp2().  */
+extern int
+       u8_cmp2 (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_cmp2 (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_cmp2 (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2)
+       _UC_ATTRIBUTE_PURE;
+
+/* Search the string at S for UC.  */
+/* Similar to memchr().  */
+extern uint8_t *
+       u8_chr (const uint8_t *s, size_t n, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_chr (const uint16_t *s, size_t n, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_chr (const uint32_t *s, size_t n, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+
+/* Count the number of Unicode characters in the N units from S.  */
+/* Similar to mbsnlen().  */
+extern size_t
+       u8_mbsnlen (const uint8_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_mbsnlen (const uint16_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_mbsnlen (const uint32_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Elementary string functions with memory allocation.  */
+
+/* Make a freshly allocated copy of S, of length N.  */
+extern uint8_t *
+       u8_cpy_alloc (const uint8_t *s, size_t n);
+extern uint16_t *
+       u16_cpy_alloc (const uint16_t *s, size_t n);
+extern uint32_t *
+       u32_cpy_alloc (const uint32_t *s, size_t n);
+
+/* Elementary string functions on NUL terminated strings.  */
+
+/* Return the length (number of units) of the first character in S.
+   Return 0 if it is the NUL character.  Return -1 upon failure.  */
+extern int
+       u8_strmblen (const uint8_t *s)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_strmblen (const uint16_t *s)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_strmblen (const uint32_t *s)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the length (number of units) of the first character in S, putting
+   its 'ucs4_t' representation in *PUC.  Return 0 if it is the NUL
+   character.  Return -1 upon failure.  */
+extern int
+       u8_strmbtouc (ucs4_t *puc, const uint8_t *s);
+extern int
+       u16_strmbtouc (ucs4_t *puc, const uint16_t *s);
+extern int
+       u32_strmbtouc (ucs4_t *puc, const uint32_t *s);
+
+/* Forward iteration step.  Advances the pointer past the next character,
+   or returns NULL if the end of the string has been reached.  Puts the
+   character's 'ucs4_t' representation in *PUC.  */
+extern const uint8_t *
+       u8_next (ucs4_t *puc, const uint8_t *s);
+extern const uint16_t *
+       u16_next (ucs4_t *puc, const uint16_t *s);
+extern const uint32_t *
+       u32_next (ucs4_t *puc, const uint32_t *s);
+
+/* Backward iteration step.  Advances the pointer to point to the previous
+   character, or returns NULL if the beginning of the string had been reached.
+   Puts the character's 'ucs4_t' representation in *PUC.  */
+extern const uint8_t *
+       u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start);
+extern const uint16_t *
+       u16_prev (ucs4_t *puc, const uint16_t *s, const uint16_t *start);
+extern const uint32_t *
+       u32_prev (ucs4_t *puc, const uint32_t *s, const uint32_t *start);
+
+/* Return the number of units in S.  */
+/* Similar to strlen(), wcslen().  */
+extern size_t
+       u8_strlen (const uint8_t *s)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_strlen (const uint16_t *s)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_strlen (const uint32_t *s)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the number of units in S, but at most MAXLEN.  */
+/* Similar to strnlen(), wcsnlen().  */
+extern size_t
+       u8_strnlen (const uint8_t *s, size_t maxlen)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_strnlen (const uint16_t *s, size_t maxlen)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_strnlen (const uint32_t *s, size_t maxlen)
+       _UC_ATTRIBUTE_PURE;
+
+/* Copy SRC to DEST.  */
+/* Similar to strcpy(), wcscpy().  */
+extern uint8_t *
+       u8_strcpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
+extern uint16_t *
+       u16_strcpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
+extern uint32_t *
+       u32_strcpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
+
+/* Copy SRC to DEST, returning the address of the terminating NUL in DEST.  */
+/* Similar to stpcpy().  */
+extern uint8_t *
+       u8_stpcpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
+extern uint16_t *
+       u16_stpcpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
+extern uint32_t *
+       u32_stpcpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
+
+/* Copy no more than N units of SRC to DEST.  */
+/* Similar to strncpy(), wcsncpy().  */
+extern uint8_t *
+       u8_strncpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_strncpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_strncpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Copy no more than N units of SRC to DEST.  Return a pointer past the last
+   non-NUL unit written into DEST.  */
+/* Similar to stpncpy().  */
+extern uint8_t *
+       u8_stpncpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_stpncpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_stpncpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Append SRC onto DEST.  */
+/* Similar to strcat(), wcscat().  */
+extern uint8_t *
+       u8_strcat (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
+extern uint16_t *
+       u16_strcat (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
+extern uint32_t *
+       u32_strcat (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
+
+/* Append no more than N units of SRC onto DEST.  */
+/* Similar to strncat(), wcsncat().  */
+extern uint8_t *
+       u8_strncat (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_strncat (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_strncat (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Compare S1 and S2.  */
+/* Similar to strcmp(), wcscmp().  */
+#ifdef __sun
+/* Avoid a collision with the u8_strcmp() function in Solaris 11 libc.  */
+extern int
+       u8_strcmp_gnu (const uint8_t *s1, const uint8_t *s2)
+       _UC_ATTRIBUTE_PURE;
+# define u8_strcmp u8_strcmp_gnu
+#else
+extern int
+       u8_strcmp (const uint8_t *s1, const uint8_t *s2)
+       _UC_ATTRIBUTE_PURE;
+#endif
+extern int
+       u16_strcmp (const uint16_t *s1, const uint16_t *s2)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_strcmp (const uint32_t *s1, const uint32_t *s2)
+       _UC_ATTRIBUTE_PURE;
+
+/* Compare S1 and S2 using the collation rules of the current locale.
+   Return -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2.
+   Upon failure, set errno and return any value.  */
+/* Similar to strcoll(), wcscoll().  */
+extern int
+       u8_strcoll (const uint8_t *s1, const uint8_t *s2);
+extern int
+       u16_strcoll (const uint16_t *s1, const uint16_t *s2);
+extern int
+       u32_strcoll (const uint32_t *s1, const uint32_t *s2);
+
+/* Compare no more than N units of S1 and S2.  */
+/* Similar to strncmp(), wcsncmp().  */
+extern int
+       u8_strncmp (const uint8_t *s1, const uint8_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_strncmp (const uint16_t *s1, const uint16_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_strncmp (const uint32_t *s1, const uint32_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Duplicate S, returning an identical malloc'd string.  */
+/* Similar to strdup(), wcsdup().  */
+extern uint8_t *
+       u8_strdup (const uint8_t *s)
+       _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
+extern uint16_t *
+       u16_strdup (const uint16_t *s)
+       _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
+extern uint32_t *
+       u32_strdup (const uint32_t *s)
+       _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
+
+/* Find the first occurrence of UC in STR.  */
+/* Similar to strchr(), wcschr().  */
+extern uint8_t *
+       u8_strchr (const uint8_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_strchr (const uint16_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_strchr (const uint32_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+
+/* Find the last occurrence of UC in STR.  */
+/* Similar to strrchr(), wcsrchr().  */
+extern uint8_t *
+       u8_strrchr (const uint8_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_strrchr (const uint16_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_strrchr (const uint32_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the length of the initial segment of STR which consists entirely
+   of Unicode characters not in REJECT.  */
+/* Similar to strcspn(), wcscspn().  */
+extern size_t
+       u8_strcspn (const uint8_t *str, const uint8_t *reject)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_strcspn (const uint16_t *str, const uint16_t *reject)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_strcspn (const uint32_t *str, const uint32_t *reject)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the length of the initial segment of STR which consists entirely
+   of Unicode characters in ACCEPT.  */
+/* Similar to strspn(), wcsspn().  */
+extern size_t
+       u8_strspn (const uint8_t *str, const uint8_t *accept)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_strspn (const uint16_t *str, const uint16_t *accept)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_strspn (const uint32_t *str, const uint32_t *accept)
+       _UC_ATTRIBUTE_PURE;
+
+/* Find the first occurrence in STR of any character in ACCEPT.  */
+/* Similar to strpbrk(), wcspbrk().  */
+extern uint8_t *
+       u8_strpbrk (const uint8_t *str, const uint8_t *accept)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_strpbrk (const uint16_t *str, const uint16_t *accept)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_strpbrk (const uint32_t *str, const uint32_t *accept)
+       _UC_ATTRIBUTE_PURE;
+
+/* Find the first occurrence of NEEDLE in HAYSTACK.  */
+/* Similar to strstr(), wcsstr().  */
+extern uint8_t *
+       u8_strstr (const uint8_t *haystack, const uint8_t *needle)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_strstr (const uint16_t *haystack, const uint16_t *needle)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_strstr (const uint32_t *haystack, const uint32_t *needle)
+       _UC_ATTRIBUTE_PURE;
+
+/* Test whether STR starts with PREFIX.  */
+extern bool
+       u8_startswith (const uint8_t *str, const uint8_t *prefix)
+       _UC_ATTRIBUTE_PURE;
+extern bool
+       u16_startswith (const uint16_t *str, const uint16_t *prefix)
+       _UC_ATTRIBUTE_PURE;
+extern bool
+       u32_startswith (const uint32_t *str, const uint32_t *prefix)
+       _UC_ATTRIBUTE_PURE;
+
+/* Test whether STR ends with SUFFIX.  */
+extern bool
+       u8_endswith (const uint8_t *str, const uint8_t *suffix)
+       _UC_ATTRIBUTE_PURE;
+extern bool
+       u16_endswith (const uint16_t *str, const uint16_t *suffix)
+       _UC_ATTRIBUTE_PURE;
+extern bool
+       u32_endswith (const uint32_t *str, const uint32_t *suffix)
+       _UC_ATTRIBUTE_PURE;
+
+/* Divide STR into tokens separated by characters in DELIM.
+   This interface is actually more similar to wcstok than to strtok.  */
+/* Similar to strtok_r(), wcstok().  */
+extern uint8_t *
+       u8_strtok (uint8_t *_UC_RESTRICT str, const uint8_t *delim,
+                  uint8_t **ptr);
+extern uint16_t *
+       u16_strtok (uint16_t *_UC_RESTRICT str, const uint16_t *delim,
+                   uint16_t **ptr);
+extern uint32_t *
+       u32_strtok (uint32_t *_UC_RESTRICT str, const uint32_t *delim,
+                   uint32_t **ptr);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNISTR_H */
diff --git a/linux_glibc-lib/unitypes.h b/linux_glibc-lib/unitypes.h
index 8ce4661..ec472d5 100644
--- a/linux_glibc-lib/unitypes.h
+++ b/linux_glibc-lib/unitypes.h
@@ -1,18 +1,18 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Elementary types and macros for the GNU UniString library.
-   Copyright (C) 2002, 2005-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2005-2006, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _UNITYPES_H
@@ -27,7 +27,7 @@
 /* Attribute of a function whose result depends only on the arguments
    (not pointers!) and which has no side effects.  */
 #ifndef _UC_ATTRIBUTE_CONST
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) || defined __clang__
 #  define _UC_ATTRIBUTE_CONST __attribute__ ((__const__))
 # else
 #  define _UC_ATTRIBUTE_CONST
@@ -37,11 +37,26 @@
 /* Attribute of a function whose result depends only on the arguments
    (possibly pointers) and global memory, and which has no side effects.  */
 #ifndef _UC_ATTRIBUTE_PURE
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
 #  define _UC_ATTRIBUTE_PURE __attribute__ ((__pure__))
 # else
 #  define _UC_ATTRIBUTE_PURE
 # endif
 #endif
 
+/* Qualifier in a function declaration, that asserts that the caller must
+   pass a pointer to a different object in the specified pointer argument
+   than in the other pointer arguments.  */
+#ifndef _UC_RESTRICT
+# if defined __restrict \
+     || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+     || __clang_major__ >= 3
+#  define _UC_RESTRICT __restrict
+# elif 199901L <= __STDC_VERSION__ || defined restrict
+#  define _UC_RESTRICT restrict
+# else
+#  define _UC_RESTRICT
+# endif
+#endif
+
 #endif /* _UNITYPES_H */
diff --git a/linux_glibc-lib/uniwidth.h b/linux_glibc-lib/uniwidth.h
index cb79a70..7980449 100644
--- a/linux_glibc-lib/uniwidth.h
+++ b/linux_glibc-lib/uniwidth.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Display width functions.
-   Copyright (C) 2001-2002, 2005, 2007, 2009-2019 Free Software Foundation,
+   Copyright (C) 2001-2002, 2005, 2007, 2009-2021 Free Software Foundation,
    Inc.
 
-   This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _UNIWIDTH_H
diff --git a/linux_glibc-lib/wchar.h b/linux_glibc-lib/wchar.h
index dec7a74..a28dda3 100644
--- a/linux_glibc-lib/wchar.h
+++ b/linux_glibc-lib/wchar.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A substitute for ISO C99 <wchar.h>, for platforms that have issues.
 
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Eric Blake.  */
 
@@ -34,7 +34,8 @@
 #if (((defined __need_mbstate_t || defined __need_wint_t)               \
       && !defined __MINGW32__)                                          \
      || (defined __hpux                                                 \
-         && ((defined _INTTYPES_INCLUDED && !defined strtoimax)         \
+         && ((defined _INTTYPES_INCLUDED                                \
+              && !defined _GL_FINISHED_INCLUDING_SYSTEM_INTTYPES_H)     \
              || defined _GL_JUST_INCLUDE_SYSTEM_WCHAR_H))               \
      || (defined __MINGW32__ && defined __STRING_H_SOURCED__)           \
      || defined _GL_ALREADY_INCLUDING_WCHAR_H)
@@ -65,20 +66,12 @@
 # include <features.h> /* for __GLIBC__ */
 #endif
 
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.
-   In some builds of uClibc, <wchar.h> is nonexistent and wchar_t is defined
+/* In some builds of uClibc, <wchar.h> is nonexistent and wchar_t is defined
    by <stddef.h>.
    But avoid namespace pollution on glibc systems.  */
 #if !(defined __GLIBC__ && !defined __UCLIBC__)
 # include <stddef.h>
 #endif
-#ifndef __GLIBC__
-# include <stdio.h>
-# include <time.h>
-#endif
 
 /* Include the original <wchar.h> if it exists.
    Some builds of uClibc lack it.  */
@@ -94,27 +87,29 @@
 
 /* The __attribute__ feature is available in gcc versions 2.5 and later.
    The attribute __pure__ was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define _GL_ATTRIBUTE_PURE /* empty */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
 #endif
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -249,6 +244,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -274,6 +279,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -371,7 +384,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -399,14 +412,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -420,26 +430,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -448,19 +458,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -536,6 +546,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -548,24 +565,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -611,16 +639,27 @@
 
 /* Override mbstate_t if it is too small.
    On IRIX 6.5, sizeof (mbstate_t) == 1, which is not sufficient for
-   implementing mbrtowc for encodings like UTF-8.  */
-#if !(1 && 1) || 0
+   implementing mbrtowc for encodings like UTF-8.
+   On AIX and MSVC, mbrtowc needs to be overridden, but mbstate_t exists and is
+   large enough and overriding it would cause problems in C++ mode.  */
+#if !(((defined _WIN32 && !defined __CYGWIN__) || 1) && 1) || 0
 # if !GNULIB_defined_mbstate_t
+#  if !(defined _AIX || defined _MSC_VER)
 typedef int rpl_mbstate_t;
-#  undef mbstate_t
-#  define mbstate_t rpl_mbstate_t
+#   undef mbstate_t
+#   define mbstate_t rpl_mbstate_t
+#  endif
 #  define GNULIB_defined_mbstate_t 1
 # endif
 #endif
 
+/* Declare 'free' if needed for _GL_ATTRIBUTE_DEALLOC_FREE.  */
+#if (1 && !defined free \
+     && !(defined __cplusplus && defined GNULIB_NAMESPACE))
+_GL_EXTERN_C void free (void *);
+# define free rpl_free
+#endif
+_GL_EXTERN_C void free (void *);
 
 /* Convert a single-byte character to a wide character.  */
 #if 0
@@ -713,16 +752,20 @@
 #   define mbrtowc rpl_mbrtowc
 #  endif
 _GL_FUNCDECL_RPL (mbrtowc, size_t,
-                  (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n,
+                   mbstate_t *restrict ps));
 _GL_CXXALIAS_RPL (mbrtowc, size_t,
-                  (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n,
+                   mbstate_t *restrict ps));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (mbrtowc, size_t,
-                  (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n,
+                   mbstate_t *restrict ps));
 #  endif
 _GL_CXXALIAS_SYS (mbrtowc, size_t,
-                  (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n,
+                   mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (mbrtowc);
@@ -743,13 +786,17 @@
 #   undef mbrlen
 #   define mbrlen rpl_mbrlen
 #  endif
-_GL_FUNCDECL_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
-_GL_CXXALIAS_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
+_GL_FUNCDECL_RPL (mbrlen, size_t,
+                  (const char *restrict s, size_t n, mbstate_t *restrict ps));
+_GL_CXXALIAS_RPL (mbrlen, size_t,
+                  (const char *restrict s, size_t n, mbstate_t *restrict ps));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
+_GL_FUNCDECL_SYS (mbrlen, size_t,
+                  (const char *restrict s, size_t n, mbstate_t *restrict ps));
 #  endif
-_GL_CXXALIAS_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
+_GL_CXXALIAS_SYS (mbrlen, size_t,
+                  (const char *restrict s, size_t n, mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (mbrlen);
@@ -771,20 +818,26 @@
 #   define mbsrtowcs rpl_mbsrtowcs
 #  endif
 _GL_FUNCDECL_RPL (mbsrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (mbsrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t len,
-                   mbstate_t *ps));
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t len,
+                   mbstate_t *restrict ps));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (mbsrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 #  endif
 _GL_CXXALIAS_SYS (mbsrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t len,
-                   mbstate_t *ps));
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t len,
+                   mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (mbsrtowcs);
@@ -806,22 +859,26 @@
 #   define mbsnrtowcs rpl_mbsnrtowcs
 #  endif
 _GL_FUNCDECL_RPL (mbsnrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps)
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t srclen, size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (mbsnrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps));
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t srclen, size_t len,
+                   mbstate_t *restrict ps));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (mbsnrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps)
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t srclen, size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 #  endif
 _GL_CXXALIAS_SYS (mbsnrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps));
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t srclen, size_t len,
+                   mbstate_t *restrict ps));
 # endif
 _GL_CXXALIASWARN (mbsnrtowcs);
 #elif defined GNULIB_POSIXCHECK
@@ -840,13 +897,17 @@
 #   undef wcrtomb
 #   define wcrtomb rpl_wcrtomb
 #  endif
-_GL_FUNCDECL_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
-_GL_CXXALIAS_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
+_GL_FUNCDECL_RPL (wcrtomb, size_t,
+                  (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
+_GL_CXXALIAS_RPL (wcrtomb, size_t,
+                  (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
+_GL_FUNCDECL_SYS (wcrtomb, size_t,
+                  (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
 #  endif
-_GL_CXXALIAS_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
+_GL_CXXALIAS_SYS (wcrtomb, size_t,
+                  (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcrtomb);
@@ -868,20 +929,26 @@
 #   define wcsrtombs rpl_wcsrtombs
 #  endif
 _GL_FUNCDECL_RPL (wcsrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
+                  (char *restrict dest, const wchar_t **restrict srcp,
+                   size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (wcsrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t len,
-                   mbstate_t *ps));
+                  (char *restrict dest, const wchar_t **restrict srcp,
+                   size_t len,
+                   mbstate_t *restrict ps));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (wcsrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
+                  (char *restrict dest, const wchar_t **restrict srcp,
+                   size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 #  endif
 _GL_CXXALIAS_SYS (wcsrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t len,
-                   mbstate_t *ps));
+                  (char *restrict dest, const wchar_t **restrict srcp,
+                   size_t len,
+                   mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsrtombs);
@@ -903,22 +970,30 @@
 #   define wcsnrtombs rpl_wcsnrtombs
 #  endif
 _GL_FUNCDECL_RPL (wcsnrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps)
+                  (char *restrict dest,
+                   const wchar_t **restrict srcp, size_t srclen,
+                   size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (wcsnrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps));
+                  (char *restrict dest,
+                   const wchar_t **restrict srcp, size_t srclen,
+                   size_t len,
+                   mbstate_t *restrict ps));
 # else
 #  if !1 || (defined __cplusplus && defined __sun)
 _GL_FUNCDECL_SYS (wcsnrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps)
+                  (char *restrict dest,
+                   const wchar_t **restrict srcp, size_t srclen,
+                   size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 #  endif
 _GL_CXXALIAS_SYS (wcsnrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps));
+                  (char *restrict dest,
+                   const wchar_t **restrict srcp, size_t srclen,
+                   size_t len,
+                   mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsnrtombs);
@@ -1016,10 +1091,12 @@
 #if 0
 # if !1
 _GL_FUNCDECL_SYS (wmemcpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # endif
 _GL_CXXALIAS_SYS (wmemcpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wmemcpy);
 # endif
@@ -1053,6 +1130,29 @@
 #endif
 
 
+/* Copy N wide characters of SRC to DEST.
+   Return pointer to wide characters after the last written wide character.  */
+#if 0
+# if !1
+_GL_FUNCDECL_SYS (wmempcpy, wchar_t *,
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wmempcpy, wchar_t *,
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wmempcpy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmempcpy
+# if HAVE_RAW_DECL_WMEMPCPY
+_GL_WARN_ON_USE (wmempcpy, "wmempcpy is unportable - "
+                 "use gnulib module wmempcpy for portability");
+# endif
+#endif
+
+
 /* Set N wide characters of S to C.  */
 #if 0
 # if !1
@@ -1109,9 +1209,11 @@
 /* Copy SRC to DEST.  */
 #if 0
 # if !1
-_GL_FUNCDECL_SYS (wcscpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_FUNCDECL_SYS (wcscpy, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # endif
-_GL_CXXALIAS_SYS (wcscpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_CXXALIAS_SYS (wcscpy, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcscpy);
 # endif
@@ -1127,9 +1229,11 @@
 /* Copy SRC to DEST, returning the address of the terminating L'\0' in DEST.  */
 #if 0
 # if !1
-_GL_FUNCDECL_SYS (wcpcpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_FUNCDECL_SYS (wcpcpy, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # endif
-_GL_CXXALIAS_SYS (wcpcpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_CXXALIAS_SYS (wcpcpy, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 _GL_CXXALIASWARN (wcpcpy);
 #elif defined GNULIB_POSIXCHECK
 # undef wcpcpy
@@ -1144,10 +1248,12 @@
 #if 0
 # if !1
 _GL_FUNCDECL_SYS (wcsncpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # endif
 _GL_CXXALIAS_SYS (wcsncpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsncpy);
 # endif
@@ -1165,10 +1271,12 @@
 #if 0
 # if !1
 _GL_FUNCDECL_SYS (wcpncpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # endif
 _GL_CXXALIAS_SYS (wcpncpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 _GL_CXXALIASWARN (wcpncpy);
 #elif defined GNULIB_POSIXCHECK
 # undef wcpncpy
@@ -1182,9 +1290,11 @@
 /* Append SRC onto DEST.  */
 #if 0
 # if !1
-_GL_FUNCDECL_SYS (wcscat, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_FUNCDECL_SYS (wcscat, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # endif
-_GL_CXXALIAS_SYS (wcscat, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_CXXALIAS_SYS (wcscat, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcscat);
 # endif
@@ -1201,10 +1311,12 @@
 #if 0
 # if !1
 _GL_FUNCDECL_SYS (wcsncat, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest, const wchar_t *restrict src,
+                   size_t n));
 # endif
 _GL_CXXALIAS_SYS (wcsncat, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest, const wchar_t *restrict src,
+                   size_t n));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsncat);
 # endif
@@ -1317,9 +1429,11 @@
    original strings.  */
 #if 0
 # if !1
-_GL_FUNCDECL_SYS (wcsxfrm, size_t, (wchar_t *s1, const wchar_t *s2, size_t n));
+_GL_FUNCDECL_SYS (wcsxfrm, size_t,
+                  (wchar_t *restrict s1, const wchar_t *restrict s2, size_t n));
 # endif
-_GL_CXXALIAS_SYS (wcsxfrm, size_t, (wchar_t *s1, const wchar_t *s2, size_t n));
+_GL_CXXALIAS_SYS (wcsxfrm, size_t,
+                  (wchar_t *restrict s1, const wchar_t *restrict s2, size_t n));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsxfrm);
 # endif
@@ -1334,16 +1448,55 @@
 
 /* Duplicate S, returning an identical malloc'd string.  */
 #if 0
-# if !1
-_GL_FUNCDECL_SYS (wcsdup, wchar_t *, (const wchar_t *s));
-# endif
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef wcsdup
+#   define wcsdup _wcsdup
+#  endif
+_GL_CXXALIAS_MDA (wcsdup, wchar_t *, (const wchar_t *s));
+# else
+#  if !1 || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
+                  (const wchar_t *s)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#  endif
 _GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s));
+# endif
 _GL_CXXALIASWARN (wcsdup);
-#elif defined GNULIB_POSIXCHECK
-# undef wcsdup
-# if HAVE_RAW_DECL_WCSDUP
+#else
+# if __GNUC__ >= 11 && !defined wcsdup
+/* For -Wmismatched-dealloc: Associate wcsdup with free or rpl_free.  */
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
+                  (const wchar_t *s)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef wcsdup
+#  if HAVE_RAW_DECL_WCSDUP
 _GL_WARN_ON_USE (wcsdup, "wcsdup is unportable - "
                  "use gnulib module wcsdup for portability");
+#  endif
+# elif 1
+/* On native Windows, map 'wcsdup' to '_wcsdup', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::wcsdup always.  */
+#  if defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef wcsdup
+#    define wcsdup _wcsdup
+#   endif
+_GL_CXXALIAS_MDA (wcsdup, wchar_t *, (const wchar_t *s));
+#  else
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
+                  (const wchar_t *s)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#   if 1
+_GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s));
+#   endif
+#  endif
+#  if (defined _WIN32 && !defined __CYGWIN__) || 1
+_GL_CXXALIASWARN (wcsdup);
+#  endif
 # endif
 #endif
 
@@ -1485,7 +1638,8 @@
 #if 0
 # if !1
 _GL_FUNCDECL_SYS (wcsstr, wchar_t *,
-                  (const wchar_t *haystack, const wchar_t *needle)
+                  (const wchar_t *restrict haystack,
+                   const wchar_t *restrict needle)
                   _GL_ATTRIBUTE_PURE);
 # endif
   /* On some systems, this function is defined as an overloaded function:
@@ -1494,14 +1648,18 @@
          wchar_t * std::wcsstr (wchar_t *, const wchar_t *);
        }  */
 _GL_CXXALIAS_SYS_CAST2 (wcsstr,
-                        wchar_t *, (const wchar_t *, const wchar_t *),
-                        const wchar_t *, (const wchar_t *, const wchar_t *));
+                        wchar_t *,
+                        (const wchar_t *restrict, const wchar_t *restrict),
+                        const wchar_t *,
+                        (const wchar_t *restrict, const wchar_t *restrict));
 # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
      && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
 _GL_CXXALIASWARN1 (wcsstr, wchar_t *,
-                   (wchar_t *haystack, const wchar_t *needle));
+                   (wchar_t *restrict haystack,
+                    const wchar_t *restrict needle));
 _GL_CXXALIASWARN1 (wcsstr, const wchar_t *,
-                   (const wchar_t *haystack, const wchar_t *needle));
+                   (const wchar_t *restrict haystack,
+                    const wchar_t *restrict needle));
 # elif __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsstr);
 # endif
@@ -1522,16 +1680,20 @@
 #   define wcstok rpl_wcstok
 #  endif
 _GL_FUNCDECL_RPL (wcstok, wchar_t *,
-                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+                  (wchar_t *restrict wcs, const wchar_t *restrict delim,
+                   wchar_t **restrict ptr));
 _GL_CXXALIAS_RPL (wcstok, wchar_t *,
-                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+                  (wchar_t *restrict wcs, const wchar_t *restrict delim,
+                   wchar_t **restrict ptr));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (wcstok, wchar_t *,
-                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+                  (wchar_t *restrict wcs, const wchar_t *restrict delim,
+                   wchar_t **restrict ptr));
 #  endif
 _GL_CXXALIAS_SYS (wcstok, wchar_t *,
-                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+                  (wchar_t *restrict wcs, const wchar_t *restrict delim,
+                   wchar_t **restrict ptr));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcstok);
@@ -1583,19 +1745,27 @@
 #   undef wcsftime
 #   define wcsftime rpl_wcsftime
 #  endif
-_GL_FUNCDECL_RPL (wcsftime, size_t, (wchar_t *__buf, size_t __bufsize,
-                                     const wchar_t *__fmt, const struct tm *__tp)
-                                    _GL_ARG_NONNULL ((1, 3, 4)));
-_GL_CXXALIAS_RPL (wcsftime, size_t, (wchar_t *__buf, size_t __bufsize,
-                                     const wchar_t *__fmt, const struct tm *__tp));
+_GL_FUNCDECL_RPL (wcsftime, size_t,
+                  (wchar_t *restrict __buf, size_t __bufsize,
+                   const wchar_t *restrict __fmt,
+                   const struct tm *restrict __tp)
+                  _GL_ARG_NONNULL ((1, 3, 4)));
+_GL_CXXALIAS_RPL (wcsftime, size_t,
+                  (wchar_t *restrict __buf, size_t __bufsize,
+                   const wchar_t *restrict __fmt,
+                   const struct tm *restrict __tp));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (wcsftime, size_t, (wchar_t *__buf, size_t __bufsize,
-                                     const wchar_t *__fmt, const struct tm *__tp)
-                                    _GL_ARG_NONNULL ((1, 3, 4)));
+_GL_FUNCDECL_SYS (wcsftime, size_t,
+                  (wchar_t *restrict __buf, size_t __bufsize,
+                   const wchar_t *restrict __fmt,
+                   const struct tm *restrict __tp)
+                  _GL_ARG_NONNULL ((1, 3, 4)));
 #  endif
-_GL_CXXALIAS_SYS (wcsftime, size_t, (wchar_t *__buf, size_t __bufsize,
-                                     const wchar_t *__fmt, const struct tm *__tp));
+_GL_CXXALIAS_SYS (wcsftime, size_t,
+                  (wchar_t *restrict __buf, size_t __bufsize,
+                   const wchar_t *restrict __fmt,
+                   const struct tm *restrict __tp));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsftime);
diff --git a/linux_glibc-lib/wctype.h b/linux_glibc-lib/wctype.h
index 3055531..e593107 100644
--- a/linux_glibc-lib/wctype.h
+++ b/linux_glibc-lib/wctype.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A substitute for ISO C99 <wctype.h>, for platforms that lack it.
 
-   Copyright (C) 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible and Paul Eggert.  */
 
@@ -46,14 +46,7 @@
 #ifndef _GL_WCTYPE_H
 
 #if 1
-/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.
-   Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-# include <stddef.h>
-# include <stdio.h>
-# include <time.h>
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
 # include <wchar.h>
 #endif
 
@@ -86,19 +79,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -233,6 +226,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -258,6 +261,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -355,7 +366,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -383,14 +394,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -404,19 +412,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -492,6 +500,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -504,24 +519,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -616,7 +642,7 @@
 _GL_WCTYPE_INLINE int
 rpl_iswdigit (wint_t wc)
 {
-  return ((wchar_t) wc == wc ? iswdigit ((wchar_t) wc) : 0);
+  return ((wchar_t) wc == wc ? wc >= '0' && wc <= '9' : 0);
 }
 
 _GL_WCTYPE_INLINE int
@@ -658,7 +684,10 @@
 _GL_WCTYPE_INLINE int
 rpl_iswxdigit (wint_t wc)
 {
-  return ((wchar_t) wc == wc ? iswxdigit ((wchar_t) wc) : 0);
+  return ((wchar_t) wc == wc
+          ? (wc >= '0' && wc <= '9')
+            || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F')
+          : 0);
 }
 
 _GL_WCTYPE_INLINE wint_t
@@ -911,16 +940,39 @@
 
 #  endif
 
-# elif 1 && (! 1 || 0)
-/* Only the iswblank function is missing.  */
+# else
+/* Only some of the functions are missing or broken.  */
 
-#  if 0
-#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-#    define iswblank rpl_iswblank
-#   endif
+#  if 1 && (! 1 || 0)
+/* Only the iswblank function is missing.  */
+#   if 0
+#    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#     define iswblank rpl_iswblank
+#    endif
 _GL_FUNCDECL_RPL (iswblank, int, (wint_t wc));
-#  else
+#   else
 _GL_FUNCDECL_SYS (iswblank, int, (wint_t wc));
+#   endif
+#  endif
+
+#  if 1
+#   if 0
+#    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#     undef iswdigit
+#     define iswdigit rpl_iswdigit
+#    endif
+_GL_FUNCDECL_RPL (iswdigit, int, (wint_t wc));
+#   endif
+#  endif
+
+#  if 1
+#   if 0
+#    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#     undef iswxdigit
+#     define iswxdigit rpl_iswxdigit
+#    endif
+_GL_FUNCDECL_RPL (iswxdigit, int, (wint_t wc));
+#   endif
 #  endif
 
 # endif
@@ -965,28 +1017,62 @@
 
 #if 0
 _GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
 #else
 _GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc));
+#endif
+#if 1
+# if 0
+_GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
+# else
 _GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc));
+# endif
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswlower, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswprint, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswspace, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswupper, int, (wint_t wc));
+#endif
+#if 1
+# if 0
+_GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
+# else
 _GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc));
+# endif
 #endif
 #if __GLIBC__ >= 2
 _GL_CXXALIASWARN (iswalnum);
diff --git a/linux_musl-lib/Android.bp b/linux_musl-lib/Android.bp
index f91f4af..9228624 100644
--- a/linux_musl-lib/Android.bp
+++ b/linux_musl-lib/Android.bp
@@ -24,6 +24,7 @@
                 "lib/c-strcasecmp.c",
                 "lib/c-strncasecmp.c",
                 "lib/canonicalize-lgpl.c",
+                "lib/canonicalize.c",
                 "lib/careadlinkat.c",
                 "lib/cloexec.c",
                 "lib/close-stream.c",
@@ -34,31 +35,48 @@
                 "lib/dup-safer-flag.c",
                 "lib/dup-safer.c",
                 "lib/error.c",
+                "lib/execute.c",
                 "lib/exitfail.c",
                 "lib/fatal-signal.c",
                 "lib/fcntl.c",
                 "lib/fd-safer-flag.c",
                 "lib/fd-safer.c",
+                "lib/file-set.c",
+                "lib/findprog-in.c",
                 "lib/fopen-safer.c",
+                "lib/free.c",
                 "lib/fstrcmp.c",
                 "lib/get-errno.c",
+                "lib/getcwd.c",
                 "lib/gethrxtime.c",
                 "lib/getopt.c",
                 "lib/getopt1.c",
                 "lib/getprogname.c",
                 "lib/gettime.c",
                 "lib/gl_array_list.c",
+                "lib/gl_hash_map.c",
+                "lib/gl_linked_list.c",
                 "lib/gl_list.c",
+                "lib/gl_map.c",
+                "lib/gl_oset.c",
+                "lib/gl_rbtree_oset.c",
+                "lib/gl_rbtreehash_list.c",
                 "lib/gl_xlist.c",
+                "lib/gl_xmap.c",
                 "lib/glthread/lock.c",
                 "lib/glthread/threadlib.c",
                 "lib/glthread/tls.c",
+                "lib/hash-pjw.c",
+                "lib/hash-triple-simple.c",
                 "lib/hash.c",
-                "lib/isnand.c",
-                "lib/isnanf.c",
-                "lib/isnanl.c",
+                "lib/ialloc.c",
+                "lib/integer_length.c",
+                "lib/integer_length_l.c",
                 "lib/localcharset.c",
-                "lib/malloca.c",
+                "lib/malloc/scratch_buffer_dupfree.c",
+                "lib/malloc/scratch_buffer_grow.c",
+                "lib/malloc/scratch_buffer_grow_preserve.c",
+                "lib/malloc/scratch_buffer_set_array_size.c",
                 "lib/math.c",
                 "lib/mbchar.c",
                 "lib/mbfile.c",
@@ -76,16 +94,22 @@
                 "lib/progname.c",
                 "lib/progreloc.c",
                 "lib/quotearg.c",
+                "lib/rawmemchr.c",
+                "lib/readline.c",
                 "lib/relocatable.c",
                 "lib/sig-handler.c",
                 "lib/spawn-pipe.c",
-                "lib/spawn_faction_addclose.c",
+                "lib/spawn_faction_addchdir.c",
                 "lib/spawn_faction_adddup2.c",
                 "lib/spawn_faction_addopen.c",
                 "lib/stripslash.c",
                 "lib/timespec.c",
                 "lib/timevar.c",
+                "lib/unicodeio.c",
                 "lib/unistd.c",
+                "lib/unistr/u8-mbtoucr.c",
+                "lib/unistr/u8-uctomb-aux.c",
+                "lib/unistr/u8-uctomb.c",
                 "lib/uniwidth/width.c",
                 "lib/vasnprintf.c",
                 "lib/wait-process.c",
@@ -116,22 +140,27 @@
                 "src/closure.c",
                 "src/complain.c",
                 "src/conflicts.c",
+                "src/counterexample.c",
+                "src/derivation.c",
                 "src/derives.c",
                 "src/files.c",
                 "src/fixits.c",
                 "src/getargs.c",
+                "src/glyphs.c",
                 "src/gram.c",
                 "src/graphviz.c",
                 "src/ielr.c",
                 "src/lalr.c",
                 "src/location.c",
                 "src/lr0.c",
+                "src/lssi.c",
                 "src/main.c",
                 "src/muscle-tab.c",
                 "src/named-ref.c",
                 "src/nullable.c",
                 "src/output.c",
                 "src/parse-gram.c",
+                "src/parse-simulation.c",
                 "src/print-graph.c",
                 "src/print-xml.c",
                 "src/print.c",
@@ -141,7 +170,9 @@
                 "src/scan-code-c.c",
                 "src/scan-gram-c.c",
                 "src/scan-skel-c.c",
+                "src/state-item.c",
                 "src/state.c",
+                "src/strversion.c",
                 "src/symlist.c",
                 "src/symtab.c",
                 "src/tables.c",
diff --git a/linux_musl-lib/alloca.h b/linux_musl-lib/alloca.h
index ec2c08e..181db57 100644
--- a/linux_musl-lib/alloca.h
+++ b/linux_musl-lib/alloca.h
@@ -1,23 +1,21 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Memory allocation on the stack.
 
-   Copyright (C) 1995, 1999, 2001-2004, 2006-2019 Free Software Foundation,
+   Copyright (C) 1995, 1999, 2001-2004, 2006-2021 Free Software Foundation,
    Inc.
 
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
-   License along with this program; if not, see
-   <https://www.gnu.org/licenses/>.
-  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
    means there is a real alloca function.  */
@@ -36,13 +34,16 @@
  */
 
 #ifndef alloca
-# ifdef __GNUC__
-   /* Some version of mingw have an <alloca.h> that causes trouble when
-      included after 'alloca' gets defined as a macro.  As a workaround, include
-      this <alloca.h> first and define 'alloca' as a macro afterwards.  */
-#  if (defined _WIN32 && ! defined __CYGWIN__) && 1
-#   include_next <alloca.h>
-#  endif
+  /* Some version of mingw have an <alloca.h> that causes trouble when
+     included after 'alloca' gets defined as a macro.  As a workaround,
+     include this <alloca.h> first and define 'alloca' as a macro afterwards
+     if needed.  */
+# if defined __GNUC__ && (defined _WIN32 && ! defined __CYGWIN__) && 1
+#  include_next <alloca.h>
+# endif
+#endif
+#ifndef alloca
+# if defined __GNUC__ || (__clang_major__ >= 4)
 #  define alloca __builtin_alloca
 # elif defined _AIX
 #  define alloca __alloca
diff --git a/linux_musl-lib/config.h b/linux_musl-lib/config.h
index bf7d5b2..eab781e 100644
--- a/linux_musl-lib/config.h
+++ b/linux_musl-lib/config.h
@@ -23,17 +23,9 @@
    non-IEEE-754 'long double' values. */
 #define CHECK_PRINTF_SAFE 1
 
-/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
-   systems. This function is required for `alloca.c' support on those systems.
-   */
-/* #undef CRAY_STACKSEG_END */
-
-/* Define to 1 if using `alloca.c'. */
+/* Define to 1 if using 'alloca.c'. */
 /* #undef C_ALLOCA */
 
-/* Define to 1 if the C locale may have encoding errors. */
-/* #undef C_LOCALE_MAYBE_EILSEQ */
-
 /* Define as the bit index in the word where to find bit 0 of the exponent of
    'double'. */
 #define DBL_EXPBIT0_BIT 20
@@ -47,9 +39,22 @@
 /* Define as the word index where to find the sign of 'double'. */
 /* #undef DBL_SIGNBIT_WORD */
 
+/* the name of the file descriptor member of DIR */
+/* #undef DIR_FD_MEMBER_NAME */
+
+#ifdef DIR_FD_MEMBER_NAME
+# define DIR_TO_FD(Dir_p) ((Dir_p)->DIR_FD_MEMBER_NAME)
+#else
+# define DIR_TO_FD(Dir_p) -1
+#endif
+
+
 /* Define to 1 if // is a file system root distinct from /. */
 /* #undef DOUBLE_SLASH_IS_DISTINCT_ROOT */
 
+/* Define if struct dirent has a member d_ino that actually works. */
+#define D_INO_IN_DIRENT 1
+
 /* Define to 1 if translation of program messages to the user's native
    language is requested. */
 /* #undef ENABLE_NLS */
@@ -77,17 +82,22 @@
 /* #undef FOPEN_TRAILING_SLASH_BUG */
 
 /* Define to 1 if realpath() can malloc memory, always gives an absolute path,
-   and handles trailing slash correctly. */
-#define FUNC_REALPATH_WORKS 1
+   and handles a trailing slash correctly. */
+#define FUNC_REALPATH_NEARLY_WORKS 1
 
-/* Define if gettimeofday clobbers the localtime buffer. */
-/* #undef GETTIMEOFDAY_CLOBBERS_LOCALTIME */
+/* Define to 1 if realpath() can malloc memory, always gives an absolute path,
+   and handles leading slashes and a trailing slash correctly. */
+/* #undef FUNC_REALPATH_WORKS */
 
 /* Define this to 'void' or 'struct timezone' to match the system's
    declaration of the second argument to gettimeofday. */
 #define GETTIMEOFDAY_TIMEZONE void
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module canonicalize shall be considered present. */
+#define GNULIB_CANONICALIZE 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module canonicalize-lgpl shall be considered present. */
 #define GNULIB_CANONICALIZE_LGPL 1
 
@@ -100,10 +110,18 @@
 #define GNULIB_DIRNAME 1
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module fdopendir shall be considered present. */
+#define GNULIB_FDOPENDIR 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module fd-safer-flag shall be considered present. */
 #define GNULIB_FD_SAFER_FLAG 1
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module fopen-gnu shall be considered present. */
+#define GNULIB_FOPEN_GNU 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module fopen-safer shall be considered present. */
 #define GNULIB_FOPEN_SAFER 1
 
@@ -112,18 +130,22 @@
 #define GNULIB_FSCANF 1
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module getcwd shall be considered present. */
+#define GNULIB_GETCWD 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module lock shall be considered present. */
 #define GNULIB_LOCK 1
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
-   whether the gnulib module malloc-gnu shall be considered present. */
-#define GNULIB_MALLOC_GNU 1
-
-/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module msvc-nothrow shall be considered present. */
 #define GNULIB_MSVC_NOTHROW 1
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module openat shall be considered present. */
+#define GNULIB_OPENAT 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module pipe2-safer shall be considered present. */
 #define GNULIB_PIPE2_SAFER 1
 
@@ -132,6 +154,10 @@
 /* #undef GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU */
 
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module reallocarray shall be considered present. */
+#define GNULIB_REALLOCARRAY 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module scanf shall be considered present. */
 #define GNULIB_SCANF 1
 
@@ -139,6 +165,14 @@
    whether the gnulib module snprintf shall be considered present. */
 #define GNULIB_SNPRINTF 1
 
+/* Define to 1 if you want the FILE stream functions getc, putc, etc. to use
+   unlocked I/O if available, throughout the package. Unlocked I/O can improve
+   performance, sometimes dramatically. But unlocked I/O is safe only in
+   single-threaded programs, as well as in multithreaded programs for which
+   you can guarantee that every FILE stream, including stdin, stdout, stderr,
+   is used only in a single thread. */
+#define GNULIB_STDIO_SINGLE_THREAD 1
+
 /* Define to a C preprocessor expression that evaluates to 1 or 0, depending
    whether the gnulib module strerror shall be considered present. */
 #define GNULIB_STRERROR 1
@@ -147,9 +181,15 @@
    whether the gnulib module strerror_r-posix shall be considered present. */
 /* #undef GNULIB_STRERROR_R_POSIX */
 
+/* Define to 1 when the gnulib module access should be tested. */
+#define GNULIB_TEST_ACCESS 1
+
 /* Define to 1 when the gnulib module calloc-posix should be tested. */
 #define GNULIB_TEST_CALLOC_POSIX 1
 
+/* Define to 1 when the gnulib module canonicalize should be tested. */
+#define GNULIB_TEST_CANONICALIZE 1
+
 /* Define to 1 when the gnulib module canonicalize_file_name should be tested.
    */
 #define GNULIB_TEST_CANONICALIZE_FILE_NAME 1
@@ -163,36 +203,102 @@
 /* Define to 1 when the gnulib module close should be tested. */
 #define GNULIB_TEST_CLOSE 1
 
+/* Define to 1 when the gnulib module closedir should be tested. */
+#define GNULIB_TEST_CLOSEDIR 1
+
+/* Define to 1 when the gnulib module dirfd should be tested. */
+/* #undef GNULIB_TEST_DIRFD */
+
+/* Define to 1 when the gnulib module dup should be tested. */
+/* #undef GNULIB_TEST_DUP */
+
 /* Define to 1 when the gnulib module dup2 should be tested. */
 #define GNULIB_TEST_DUP2 1
 
 /* Define to 1 when the gnulib module environ should be tested. */
 #define GNULIB_TEST_ENVIRON 1
 
+/* Define to 1 when the gnulib module fchdir should be tested. */
+/* #undef GNULIB_TEST_FCHDIR */
+
 /* Define to 1 when the gnulib module fcntl should be tested. */
 #define GNULIB_TEST_FCNTL 1
 
+/* Define to 1 when the gnulib module fdopendir should be tested. */
+#define GNULIB_TEST_FDOPENDIR 1
+
+/* Define to 1 when the gnulib module ffsl should be tested. */
+#define GNULIB_TEST_FFSL 1
+
+/* Define to 1 when the gnulib module fgetc should be tested. */
+#define GNULIB_TEST_FGETC 1
+
+/* Define to 1 when the gnulib module fgets should be tested. */
+#define GNULIB_TEST_FGETS 1
+
 /* Define to 1 when the gnulib module fopen should be tested. */
 #define GNULIB_TEST_FOPEN 1
 
+/* Define to 1 when the gnulib module fprintf should be tested. */
+#define GNULIB_TEST_FPRINTF 1
+
 /* Define to 1 when the gnulib module fprintf-posix should be tested. */
 #define GNULIB_TEST_FPRINTF_POSIX 1
 
+/* Define to 1 when the gnulib module fputc should be tested. */
+#define GNULIB_TEST_FPUTC 1
+
+/* Define to 1 when the gnulib module fputs should be tested. */
+#define GNULIB_TEST_FPUTS 1
+
+/* Define to 1 when the gnulib module fread should be tested. */
+#define GNULIB_TEST_FREAD 1
+
+/* Define to 1 when the gnulib module free-posix should be tested. */
+#define GNULIB_TEST_FREE_POSIX 1
+
 /* Define to 1 when the gnulib module frexp should be tested. */
 #define GNULIB_TEST_FREXP 1
 
 /* Define to 1 when the gnulib module frexpl should be tested. */
 #define GNULIB_TEST_FREXPL 1
 
+/* Define to 1 when the gnulib module fscanf should be tested. */
+#define GNULIB_TEST_FSCANF 1
+
 /* Define to 1 when the gnulib module fstat should be tested. */
-/* #undef GNULIB_TEST_FSTAT */
+#define GNULIB_TEST_FSTAT 1
+
+/* Define to 1 when the gnulib module fstatat should be tested. */
+#define GNULIB_TEST_FSTATAT 1
 
 /* Define to 1 when the gnulib module fsync should be tested. */
 #define GNULIB_TEST_FSYNC 1
 
+/* Define to 1 when the gnulib module fwrite should be tested. */
+#define GNULIB_TEST_FWRITE 1
+
+/* Define to 1 when the gnulib module getc should be tested. */
+#define GNULIB_TEST_GETC 1
+
+/* Define to 1 when the gnulib module getchar should be tested. */
+#define GNULIB_TEST_GETCHAR 1
+
+/* Define to 1 when the gnulib module getcwd should be tested. */
+#define GNULIB_TEST_GETCWD 1
+
+/* Define to 1 when the gnulib module getdelim should be tested. */
+/* #undef GNULIB_TEST_GETDELIM */
+
 /* Define to 1 when the gnulib module getdtablesize should be tested. */
 #define GNULIB_TEST_GETDTABLESIZE 1
 
+/* Define to 1 when the gnulib module getline should be tested. */
+#define GNULIB_TEST_GETLINE 1
+
+/* Define to 1 when the gnulib module getopt-posix should be tested. */
+#define GNULIB_TEST_GETOPT_POSIX 1
+
 /* Define to 1 when the gnulib module getrusage should be tested. */
 #define GNULIB_TEST_GETRUSAGE 1
 
@@ -214,11 +320,17 @@
 /* Define to 1 when the gnulib module iswblank should be tested. */
 #define GNULIB_TEST_ISWBLANK 1
 
+/* Define to 1 when the gnulib module iswdigit should be tested. */
+#define GNULIB_TEST_ISWDIGIT 1
+
+/* Define to 1 when the gnulib module iswxdigit should be tested. */
+#define GNULIB_TEST_ISWXDIGIT 1
+
 /* Define to 1 when the gnulib module ldexpl should be tested. */
 #define GNULIB_TEST_LDEXPL 1
 
 /* Define to 1 when the gnulib module lstat should be tested. */
-#define GNULIB_TEST_LSTAT 1
+/* #undef GNULIB_TEST_LSTAT */
 
 /* Define to 1 when the gnulib module malloc-posix should be tested. */
 #define GNULIB_TEST_MALLOC_POSIX 1
@@ -232,18 +344,36 @@
 /* Define to 1 when the gnulib module memchr should be tested. */
 #define GNULIB_TEST_MEMCHR 1
 
+/* Define to 1 when the gnulib module mempcpy should be tested. */
+#define GNULIB_TEST_MEMPCPY 1
+
+/* Define to 1 when the gnulib module memrchr should be tested. */
+/* #undef GNULIB_TEST_MEMRCHR */
+
 /* Define to 1 when the gnulib module obstack-printf should be tested. */
 #define GNULIB_TEST_OBSTACK_PRINTF 1
 
 /* Define to 1 when the gnulib module open should be tested. */
 #define GNULIB_TEST_OPEN 1
 
+/* Define to 1 when the gnulib module openat should be tested. */
+#define GNULIB_TEST_OPENAT 1
+
+/* Define to 1 when the gnulib module opendir should be tested. */
+#define GNULIB_TEST_OPENDIR 1
+
 /* Define to 1 when the gnulib module perror should be tested. */
 #define GNULIB_TEST_PERROR 1
 
+/* Define to 1 when the gnulib module pipe should be tested. */
+#define GNULIB_TEST_PIPE 1
+
 /* Define to 1 when the gnulib module pipe2 should be tested. */
 #define GNULIB_TEST_PIPE2 1
 
+/* Define to 1 when the gnulib module posix_spawn should be tested. */
+#define GNULIB_TEST_POSIX_SPAWN 1
+
 /* Define to 1 when the gnulib module posix_spawnattr_destroy should be
    tested. */
 #define GNULIB_TEST_POSIX_SPAWNATTR_DESTROY 1
@@ -256,6 +386,10 @@
    tested. */
 #define GNULIB_TEST_POSIX_SPAWNATTR_SETFLAGS 1
 
+/* Define to 1 when the gnulib module posix_spawnattr_setpgroup should be
+   tested. */
+#define GNULIB_TEST_POSIX_SPAWNATTR_SETPGROUP 1
+
 /* Define to 1 when the gnulib module posix_spawnattr_setsigmask should be
    tested. */
 #define GNULIB_TEST_POSIX_SPAWNATTR_SETSIGMASK 1
@@ -263,6 +397,10 @@
 /* Define to 1 when the gnulib module posix_spawnp should be tested. */
 #define GNULIB_TEST_POSIX_SPAWNP 1
 
+/* Define to 1 when the gnulib module posix_spawn_file_actions_addchdir should
+   be tested. */
+#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR 1
+
 /* Define to 1 when the gnulib module posix_spawn_file_actions_addclose should
    be tested. */
 #define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE 1
@@ -283,18 +421,36 @@
    tested. */
 #define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_INIT 1
 
+/* Define to 1 when the gnulib module printf should be tested. */
+#define GNULIB_TEST_PRINTF 1
+
 /* Define to 1 when the gnulib module printf-posix should be tested. */
 #define GNULIB_TEST_PRINTF_POSIX 1
 
+/* Define to 1 when the gnulib module putc should be tested. */
+#define GNULIB_TEST_PUTC 1
+
+/* Define to 1 when the gnulib module putchar should be tested. */
+#define GNULIB_TEST_PUTCHAR 1
+
+/* Define to 1 when the gnulib module puts should be tested. */
+#define GNULIB_TEST_PUTS 1
+
 /* Define to 1 when the gnulib module raise should be tested. */
 #define GNULIB_TEST_RAISE 1
 
 /* Define to 1 when the gnulib module rawmemchr should be tested. */
-/* #undef GNULIB_TEST_RAWMEMCHR */
+#define GNULIB_TEST_RAWMEMCHR 1
+
+/* Define to 1 when the gnulib module readdir should be tested. */
+#define GNULIB_TEST_READDIR 1
 
 /* Define to 1 when the gnulib module readlink should be tested. */
 #define GNULIB_TEST_READLINK 1
 
+/* Define to 1 when the gnulib module reallocarray should be tested. */
+#define GNULIB_TEST_REALLOCARRAY 1
+
 /* Define to 1 when the gnulib module realloc-posix should be tested. */
 #define GNULIB_TEST_REALLOC_POSIX 1
 
@@ -304,9 +460,18 @@
 /* Define to 1 when the gnulib module rename should be tested. */
 #define GNULIB_TEST_RENAME 1
 
+/* Define to 1 when the gnulib module rewinddir should be tested. */
+#define GNULIB_TEST_REWINDDIR 1
+
 /* Define to 1 when the gnulib module rmdir should be tested. */
 /* #undef GNULIB_TEST_RMDIR */
 
+/* Define to 1 when the gnulib module scanf should be tested. */
+#define GNULIB_TEST_SCANF 1
+
+/* Define to 1 when the gnulib module setlocale_null should be tested. */
+/* #undef GNULIB_TEST_SETLOCALE_NULL */
+
 /* Define to 1 when the gnulib module sigaction should be tested. */
 #define GNULIB_TEST_SIGACTION 1
 
@@ -323,11 +488,14 @@
 #define GNULIB_TEST_SPRINTF_POSIX 1
 
 /* Define to 1 when the gnulib module stat should be tested. */
-/* #undef GNULIB_TEST_STAT */
+#define GNULIB_TEST_STAT 1
 
 /* Define to 1 when the gnulib module stpcpy should be tested. */
 #define GNULIB_TEST_STPCPY 1
 
+/* Define to 1 when the gnulib module stpncpy should be tested. */
+#define GNULIB_TEST_STPNCPY 1
+
 /* Define to 1 when the gnulib module strchrnul should be tested. */
 /* #undef GNULIB_TEST_STRCHRNUL */
 
@@ -346,6 +514,9 @@
 /* Define to 1 when the gnulib module strnlen should be tested. */
 /* #undef GNULIB_TEST_STRNLEN */
 
+/* Define to 1 when the gnulib module strtod should be tested. */
+#define GNULIB_TEST_STRTOD 1
+
 /* Define to 1 when the gnulib module strverscmp should be tested. */
 #define GNULIB_TEST_STRVERSCMP 1
 
@@ -358,9 +529,15 @@
 /* Define to 1 when the gnulib module vasprintf should be tested. */
 #define GNULIB_TEST_VASPRINTF 1
 
+/* Define to 1 when the gnulib module vfprintf should be tested. */
+#define GNULIB_TEST_VFPRINTF 1
+
 /* Define to 1 when the gnulib module vfprintf-posix should be tested. */
 /* #undef GNULIB_TEST_VFPRINTF_POSIX */
 
+/* Define to 1 when the gnulib module vprintf should be tested. */
+#define GNULIB_TEST_VPRINTF 1
+
 /* Define to 1 when the gnulib module vsnprintf should be tested. */
 #define GNULIB_TEST_VSNPRINTF 1
 
@@ -373,6 +550,26 @@
 /* Define to 1 when the gnulib module wcwidth should be tested. */
 #define GNULIB_TEST_WCWIDTH 1
 
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module unistr/u8-mbtoucr shall be considered present. */
+#define GNULIB_UNISTR_U8_MBTOUCR 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module unistr/u8-uctomb shall be considered present. */
+#define GNULIB_UNISTR_U8_UCTOMB 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module vfprintf-posix shall be considered present. */
+/* #undef GNULIB_VFPRINTF_POSIX */
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module xalloc shall be considered present. */
+#define GNULIB_XALLOC 1
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module xalloc-die shall be considered present. */
+#define GNULIB_XALLOC_DIE 1
+
 /* Define if your system defines TIOCGWINSZ in sys/ioctl.h. */
 #define GWINSZ_IN_SYS_IOCTL 1
 
@@ -380,8 +577,7 @@
    may be supplied by this distribution. */
 #define HAVE_ALLOCA 1
 
-/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
-   */
+/* Define to 1 if <alloca.h> works. */
 #define HAVE_ALLOCA_H 1
 
 /* Define if you have an arithmetic hrtime_t type. */
@@ -390,9 +586,6 @@
 /* Define to 1 if you have the <bp-sym.h> header file. */
 /* #undef HAVE_BP_SYM_H */
 
-/* Define if the 'calloc' function is POSIX compliant. */
-#define HAVE_CALLOC_POSIX 1
-
 /* Define to 1 if you have the `canonicalize_file_name' function. */
 /* #undef HAVE_CANONICALIZE_FILE_NAME */
 
@@ -413,6 +606,9 @@
 /* Define to 1 if you have the `clock_settime' function. */
 #define HAVE_CLOCK_SETTIME 1
 
+/* Define to 1 if you have the `closedir' function. */
+#define HAVE_CLOSEDIR 1
+
 /* Define to 1 if you have the `confstr' function. */
 /* #undef HAVE_CONFSTR */
 
@@ -458,6 +654,34 @@
    don't. */
 /* #undef HAVE_DECL_COPYSIGNL */
 
+/* Define to 1 if you have the declaration of `dirfd', and to 0 if you don't.
+   */
+/* #undef HAVE_DECL_DIRFD */
+
+/* Define to 1 if you have the declaration of `ecvt', and to 0 if you don't.
+   */
+#define HAVE_DECL_ECVT 1
+
+/* Define to 1 if you have the declaration of `execvpe', and to 0 if you
+   don't. */
+#define HAVE_DECL_EXECVPE 1
+
+/* Define to 1 if you have the declaration of `fchdir', and to 0 if you don't.
+   */
+#define HAVE_DECL_FCHDIR 1
+
+/* Define to 1 if you have the declaration of `fcloseall', and to 0 if you
+   don't. */
+#define HAVE_DECL_FCLOSEALL 0
+
+/* Define to 1 if you have the declaration of `fcvt', and to 0 if you don't.
+   */
+#define HAVE_DECL_FCVT 1
+
+/* Define to 1 if you have the declaration of `fdopendir', and to 0 if you
+   don't. */
+#define HAVE_DECL_FDOPENDIR 1
+
 /* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you
    don't. */
 #define HAVE_DECL_FEOF_UNLOCKED 1
@@ -490,14 +714,26 @@
    you don't. */
 #define HAVE_DECL_FWRITE_UNLOCKED 1
 
+/* Define to 1 if you have the declaration of `gcvt', and to 0 if you don't.
+   */
+#define HAVE_DECL_GCVT 1
+
 /* Define to 1 if you have the declaration of `getchar_unlocked', and to 0 if
    you don't. */
 #define HAVE_DECL_GETCHAR_UNLOCKED 1
 
+/* Define to 1 if you have the declaration of `getcwd', and to 0 if you don't.
+   */
+#define HAVE_DECL_GETCWD 1
+
 /* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you
    don't. */
 #define HAVE_DECL_GETC_UNLOCKED 1
 
+/* Define to 1 if you have the declaration of `getdelim', and to 0 if you
+   don't. */
+#define HAVE_DECL_GETDELIM 1
+
 /* Define to 1 if you have the declaration of `getdtablesize', and to 0 if you
    don't. */
 #define HAVE_DECL_GETDTABLESIZE 1
@@ -506,6 +742,10 @@
    don't. */
 #define HAVE_DECL_GETHRTIME 0
 
+/* Define to 1 if you have the declaration of `getline', and to 0 if you
+   don't. */
+#define HAVE_DECL_GETLINE 1
+
 /* Define to 1 if you have the declaration of `iswblank', and to 0 if you
    don't. */
 #define HAVE_DECL_ISWBLANK 1
@@ -522,10 +762,18 @@
    otherwise. */
 #define HAVE_DECL_MBSWIDTH_IN_WCHAR_H 0
 
+/* Define to 1 if you have the declaration of `memrchr', and to 0 if you
+   don't. */
+#define HAVE_DECL_MEMRCHR 1
+
 /* Define to 1 if you have the declaration of `obstack_printf', and to 0 if
    you don't. */
 #define HAVE_DECL_OBSTACK_PRINTF 0
 
+/* Define to 1 if you have the declaration of `posix_spawn', and to 0 if you
+   don't. */
+#define HAVE_DECL_POSIX_SPAWN 1
+
 /* Define to 1 if you have the declaration of `program_invocation_name', and
    to 0 if you don't. */
 #define HAVE_DECL_PROGRAM_INVOCATION_NAME 1
@@ -550,6 +798,10 @@
    don't. */
 #define HAVE_DECL_SNPRINTF 1
 
+/* Define to 1 if you have the declaration of `stpncpy', and to 0 if you
+   don't. */
+#define HAVE_DECL_STPNCPY 1
+
 /* Define to 1 if you have the declaration of `strdup', and to 0 if you don't.
    */
 #define HAVE_DECL_STRDUP 1
@@ -578,6 +830,10 @@
    don't. */
 #define HAVE_DECL_VSNPRINTF 1
 
+/* Define to 1 if you have the declaration of `wcsdup', and to 0 if you don't.
+   */
+#define HAVE_DECL_WCSDUP 1
+
 /* Define to 1 if you have the declaration of `wcwidth', and to 0 if you
    don't. */
 #define HAVE_DECL_WCWIDTH 1
@@ -594,30 +850,64 @@
    don't. */
 #define HAVE_DECL___FPENDING 1
 
-/* Define to 1 if you have the 'dup2' function. */
-#define HAVE_DUP2 1
+/* Define to 1 if you have the <dirent.h> header file. */
+#define HAVE_DIRENT_H 1
+
+/* Define to 1 if you have the `dirfd' function. */
+/* #undef HAVE_DIRFD */
 
 /* Define if you have the declaration of environ. */
 #define HAVE_ENVIRON_DECL 1
 
+/* Define to 1 if you have the `faccessat' function. */
+#define HAVE_FACCESSAT 1
+
+/* Define to 1 if you have the `fchdir' function. */
+#define HAVE_FCHDIR 1
+
 /* Define to 1 if you have the `fcntl' function. */
 #define HAVE_FCNTL 1
 
+/* Define to 1 if you have the `fdopendir' function. */
+#define HAVE_FDOPENDIR 1
+
 /* Define to 1 if you have the <features.h> header file. */
 #define HAVE_FEATURES_H 1
 
+/* Define to 1 if you have the `ffsl' function. */
+#define HAVE_FFSL 1
+
+/* Define to 1 if you have the `flockfile' function. */
+/* #undef HAVE_FLOCKFILE */
+
+/* Define if the 'free' function is guaranteed to preserve errno. */
+/* #undef HAVE_FREE_POSIX */
+
 /* Define if the frexpl function is available in libc. */
 #define HAVE_FREXPL_IN_LIBC 1
 
 /* Define if the frexp function is available in libc. */
 #define HAVE_FREXP_IN_LIBC 1
 
+/* Define to 1 if you have the `fstatat' function. */
+#define HAVE_FSTATAT 1
+
 /* Define to 1 if you have the `fsync' function. */
 #define HAVE_FSYNC 1
 
+/* Define to 1 if you have the `funlockfile' function. */
+/* #undef HAVE_FUNLOCKFILE */
+
 /* Define to 1 if you have the `getcwd' function. */
 #define HAVE_GETCWD 1
 
+/* Define to 1 if getcwd works, but with shorter paths than is generally
+   tested with the replacement. */
+/* #undef HAVE_GETCWD_SHORTER */
+
+/* Define to 1 if you have the `getdelim' function. */
+#define HAVE_GETDELIM 1
+
 /* Define to 1 if you have the `getdtablesize' function. */
 #define HAVE_GETDTABLESIZE 1
 
@@ -630,6 +920,9 @@
 /* Define to 1 if you have the `getopt_long_only' function. */
 #define HAVE_GETOPT_LONG_ONLY 1
 
+/* Define to 1 if the system has the 'getpagesize' function. */
+#define HAVE_GETPAGESIZE 1
+
 /* Define to 1 if you have the `getprogname' function. */
 /* #undef HAVE_GETPROGNAME */
 
@@ -643,7 +936,15 @@
 #define HAVE_GETTIMEOFDAY 1
 
 /* Define if you have the iconv() function and it works. */
-/* #undef HAVE_ICONV */
+#define HAVE_ICONV 1
+
+/* Define to 1 if you have the <iconv.h> header file. */
+#define HAVE_ICONV_H 1
+
+/* Define to 1 if the compiler supports one of the keywords 'inline',
+   '__inline__', '__inline' and effectively inlines functions marked as such.
+   */
+/* #undef HAVE_INLINE */
 
 /* Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>. */
 #define HAVE_INTMAX_T 1
@@ -665,7 +966,7 @@
 /* #undef HAVE_ISNANF_IN_LIBC */
 
 /* Define if the isnan(long double) function is available in libc. */
-/* #undef HAVE_ISNANL_IN_LIBC */
+#define HAVE_ISNANL_IN_LIBC 1
 
 /* Define to 1 if you have the `iswblank' function. */
 #define HAVE_ISWBLANK 1
@@ -706,11 +1007,7 @@
 /* Define to 1 if you have the <mach-o/dyld.h> header file. */
 /* #undef HAVE_MACH_O_DYLD_H */
 
-/* Define to 1 if your system has a GNU libc compatible 'malloc' function, and
-   to 0 otherwise. */
-#define HAVE_MALLOC_GNU 1
-
-/* Define if the 'malloc' function is POSIX compliant. */
+/* Define if malloc, realloc, and calloc set errno on allocation failure. */
 #define HAVE_MALLOC_POSIX 1
 
 /* Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including
@@ -729,12 +1026,22 @@
 /* Define to 1 if <wchar.h> declares mbstate_t. */
 #define HAVE_MBSTATE_T 1
 
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
+/* Define to 1 if you have the `mempcpy' function. */
+#define HAVE_MEMPCPY 1
+
+/* Define to 1 if you have the `memrchr' function. */
+/* #undef HAVE_MEMRCHR */
 
 /* Define to 1 if you have the `microuptime' function. */
 /* #undef HAVE_MICROUPTIME */
 
+/* Define to 1 if getcwd minimally works, that is, its result can be trusted
+   when it succeeds. */
+#define HAVE_MINIMALLY_WORKING_GETCWD 1
+
+/* Define to 1 if you have the <minix/config.h> header file. */
+/* #undef HAVE_MINIX_CONFIG_H */
+
 /* Define to 1 if <limits.h> defines the MIN and MAX macros. */
 /* #undef HAVE_MINMAX_IN_LIMITS_H */
 
@@ -760,6 +1067,16 @@
 /* Define to 1 if you have the `obstack_printf' function. */
 /* #undef HAVE_OBSTACK_PRINTF */
 
+/* Define to 1 if you have the `openat' function. */
+#define HAVE_OPENAT 1
+
+/* Define to 1 if you have the `opendir' function. */
+#define HAVE_OPENDIR 1
+
+/* Define to 1 if getcwd works, except it sometimes fails when it shouldn't,
+   setting errno to ERANGE, ENAMETOOLONG, or ENOENT. */
+#define HAVE_PARTLY_WORKING_GETCWD 1
+
 /* Define to 1 if you have the <paths.h> header file. */
 /* #undef HAVE_PATHS_H */
 
@@ -775,9 +1092,20 @@
 /* Define to 1 if the system has the type `posix_spawnattr_t'. */
 #define HAVE_POSIX_SPAWNATTR_T 1
 
+/* Define to 1 if you have the `posix_spawn_file_actions_addchdir' function.
+   */
+/* #undef HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR */
+
+/* Define to 1 if you have the `posix_spawn_file_actions_addchdir_np'
+   function. */
+#define HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR_NP 1
+
 /* Define to 1 if the system has the type `posix_spawn_file_actions_t'. */
 #define HAVE_POSIX_SPAWN_FILE_ACTIONS_T 1
 
+/* Define if you have the <pthread.h> header and the POSIX threads API. */
+#define HAVE_PTHREAD_API 1
+
 /* Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE. */
 #define HAVE_PTHREAD_MUTEX_RECURSIVE 1
 
@@ -794,18 +1122,33 @@
 /* Define to 1 if you have the `rawmemchr' function. */
 /* #undef HAVE_RAWMEMCHR */
 
+/* Define to 1 if you have the `readdir' function. */
+#define HAVE_READDIR 1
+
+/* Define if you have the readline library. */
+/* #undef HAVE_READLINE */
+
+/* Define to 1 if you have the <readline/history.h> header file. */
+/* #undef HAVE_READLINE_HISTORY_H */
+
+/* Define to 1 if you have the <readline/readline.h> header file. */
+/* #undef HAVE_READLINE_READLINE_H */
+
 /* Define to 1 if you have the `readlink' function. */
 #define HAVE_READLINK 1
 
 /* Define to 1 if you have the `readlinkat' function. */
 #define HAVE_READLINKAT 1
 
-/* Define if the 'realloc' function is POSIX compliant. */
-#define HAVE_REALLOC_POSIX 1
+/* Define to 1 if you have the `reallocarray' function. */
+#define HAVE_REALLOCARRAY 1
 
 /* Define to 1 if you have the `realpath' function. */
 #define HAVE_REALPATH 1
 
+/* Define to 1 if you have the `rewinddir' function. */
+#define HAVE_REWINDDIR 1
+
 /* Define to 1 if 'long double' and 'double' have the same representation. */
 /* #undef HAVE_SAME_LONG_DOUBLE_AS_DOUBLE */
 
@@ -818,6 +1161,9 @@
 /* Define to 1 if you have the `sched_setscheduler' function. */
 /* #undef HAVE_SCHED_SETSCHEDULER */
 
+/* Define to 1 if you have the <sdkddkver.h> header file. */
+/* #undef HAVE_SDKDDKVER_H */
+
 /* Define to 1 if you have the <search.h> header file. */
 #define HAVE_SEARCH_H 1
 
@@ -871,6 +1217,10 @@
    buffer had been large enough. */
 #define HAVE_SNPRINTF_RETVAL_C99 1
 
+/* Define if the string produced by the snprintf function is always NUL
+   terminated. */
+#define HAVE_SNPRINTF_TRUNCATION_C99 1
+
 /* Define to 1 if you have the <spawn.h> header file. */
 #define HAVE_SPAWN_H 1
 
@@ -884,18 +1234,21 @@
 /* Define to 1 if you have the <stdio_ext.h> header file. */
 #define HAVE_STDIO_EXT_H 1
 
+/* Define to 1 if you have the <stdio.h> header file. */
+#define HAVE_STDIO_H 1
+
 /* Define to 1 if you have the <stdlib.h> header file. */
 #define HAVE_STDLIB_H 1
 
 /* Define to 1 if you have the `stpcpy' function. */
 #define HAVE_STPCPY 1
 
+/* Define if you have the stpncpy() function and it works. */
+#define HAVE_STPNCPY 1
+
 /* Define to 1 if you have the `strchrnul' function. */
 /* #undef HAVE_STRCHRNUL */
 
-/* Define to 1 if you have the `strdup' function. */
-#define HAVE_STRDUP 1
-
 /* Define to 1 if you have the `strerror_r' function. */
 #define HAVE_STRERROR_R 1
 
@@ -948,11 +1301,14 @@
 /* #undef HAVE_SYS_BITYPES_H */
 
 /* Define to 1 if you have the <sys/cdefs.h> header file. */
-/* #undef HAVE_SYS_CDEFS_H */
+#define HAVE_SYS_CDEFS_H 1
 
 /* Define to 1 if you have the <sys/inttypes.h> header file. */
 /* #undef HAVE_SYS_INTTYPES_H */
 
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#define HAVE_SYS_IOCTL_H 1
+
 /* Define to 1 if you have the <sys/mman.h> header file. */
 #define HAVE_SYS_MMAN_H 1
 
@@ -962,6 +1318,9 @@
 /* Define to 1 if you have the <sys/resource.h> header file. */
 #define HAVE_SYS_RESOURCE_H 1
 
+/* Define to 1 if you have the <sys/single_threaded.h> header file. */
+/* #undef HAVE_SYS_SINGLE_THREADED_H */
+
 /* Define to 1 if you have the <sys/socket.h> header file. */
 #define HAVE_SYS_SOCKET_H 1
 
@@ -983,6 +1342,12 @@
 /* Define to 1 if you have the `tcdrain' function. */
 #define HAVE_TCDRAIN 1
 
+/* Define to 1 if you have the <termios.h> header file. */
+#define HAVE_TERMIOS_H 1
+
+/* Define to 1 if you have the `thrd_create' function. */
+/* #undef HAVE_THRD_CREATE */
+
 /* Define to 1 if you have the <threads.h> header file. */
 #define HAVE_THREADS_H 1
 
@@ -1013,6 +1378,10 @@
 /* Define to 1 if you have the `vfork' function. */
 /* #undef HAVE_VFORK */
 
+/* Define to 1 or 0, depending whether the compiler supports simple visibility
+   declarations. */
+/* #undef HAVE_VISIBILITY */
+
 /* Define to 1 if you have the `vsnprintf' function. */
 #define HAVE_VSNPRINTF 1
 
@@ -1040,18 +1409,29 @@
 /* Define to 1 if you have the `wcwidth' function. */
 #define HAVE_WCWIDTH 1
 
+/* Define to 1 if the compiler and linker support weak declarations of
+   symbols. */
+#define HAVE_WEAK_SYMBOLS 1
+
 /* Define to 1 if you have the <winsock2.h> header file. */
 /* #undef HAVE_WINSOCK2_H */
 
 /* Define if you have the 'wint_t' type. */
 #define HAVE_WINT_T 1
 
+/* Define to 1 if fstatat (..., 0) works. For example, it does not work in AIX
+   7.1. */
+/* #undef HAVE_WORKING_FSTATAT_ZERO_FLAG */
+
 /* Define to 1 if O_NOATIME works. */
 #define HAVE_WORKING_O_NOATIME 1
 
 /* Define to 1 if O_NOFOLLOW works. */
 #define HAVE_WORKING_O_NOFOLLOW 1
 
+/* Define to 1 if you have the <xlocale.h> header file. */
+/* #undef HAVE_XLOCALE_H */
+
 /* Define to 1 if the system has the type `_Bool'. */
 #define HAVE__BOOL 1
 
@@ -1061,24 +1441,41 @@
 /* Define to 1 if you have the `_set_invalid_parameter_handler' function. */
 /* #undef HAVE__SET_INVALID_PARAMETER_HANDLER */
 
+/* Define to 1 if the compiler supports __builtin_expect,
+   and to 2 if <builtins.h> does.  */
+#define HAVE___BUILTIN_EXPECT 1
+#ifndef HAVE___BUILTIN_EXPECT
+# define __builtin_expect(e, c) (e)
+#elif HAVE___BUILTIN_EXPECT == 2
+# include <builtins.h>
+#endif
+    
+
 /* Define to 1 if you have the `__fseterr' function. */
 #define HAVE___FSETERR 1
 
 /* Define to 1 if the compiler supports the keyword '__inline'. */
-/* #undef HAVE___INLINE */
+#define HAVE___INLINE 1
 
 /* Define to 1 if you have the `__xpg_strerror_r' function. */
 #define HAVE___XPG_STRERROR_R 1
 
+/* Define as const if the declaration of iconv() needs const. */
+#define ICONV_CONST 
+
+/* Define to a symbolic name denoting the flavor of iconv_open()
+   implementation. */
+/* #undef ICONV_FLAVOR */
+
 /* Define to the value of ${prefix}, as a string. */
 #define INSTALLPREFIX "/nonexistent"
 
 /* Define as the bit index in the word where to find bit 0 of the exponent of
    'long double'. */
-#define LDBL_EXPBIT0_BIT 0
+/* #undef LDBL_EXPBIT0_BIT */
 
 /* Define as the word index where to find the exponent of 'long double'. */
-#define LDBL_EXPBIT0_WORD 2
+/* #undef LDBL_EXPBIT0_WORD */
 
 /* Define as the bit index in the word where to find the sign of 'long
    double'. */
@@ -1107,6 +1504,10 @@
    */
 /* #undef MBRTOWC_EMPTY_INPUT_BUG */
 
+/* Define if the mbrtowc function may signal encoding errors in the C locale.
+   */
+/* #undef MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ */
+
 /* Define if the mbrtowc function has the NULL pwc argument bug. */
 /* #undef MBRTOWC_NULL_ARG1_BUG */
 
@@ -1119,12 +1520,19 @@
 /* Define if the mbrtowc function returns a wrong return value. */
 /* #undef MBRTOWC_RETVAL_BUG */
 
+/* Define if the mbrtowc function stores a wide character when reporting
+   incomplete input. */
+/* #undef MBRTOWC_STORES_INCOMPLETE_BUG */
+
 /* Use GNU style printf and scanf.  */
 #ifndef __USE_MINGW_ANSI_STDIO
 # define __USE_MINGW_ANSI_STDIO 1
 #endif
 
 
+/* Define to 1 on musl libc. */
+/* #undef MUSL_LIBC */
+
 /* Define to 1 if assertions should be disabled. */
 /* #undef NDEBUG */
 
@@ -1186,25 +1594,22 @@
 #define PACKAGE_BUGREPORT "bug-bison@gnu.org"
 
 /* The copyright year for this package */
-#define PACKAGE_COPYRIGHT_YEAR 2019
+#define PACKAGE_COPYRIGHT_YEAR 2021
 
 /* Define to the full name of this package. */
 #define PACKAGE_NAME "GNU Bison"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "GNU Bison 3.5"
+#define PACKAGE_STRING "GNU Bison 3.8.2"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "bison"
 
 /* Define to the home page for this package. */
-#define PACKAGE_URL "http://www.gnu.org/software/bison/"
+#define PACKAGE_URL "https://www.gnu.org/software/bison/"
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "3.5"
-
-/* Define if <inttypes.h> exists and defines unusable PRI* macros. */
-/* #undef PRI_MACROS_BROKEN */
+#define PACKAGE_VERSION "3.8.2"
 
 /* Define to the type that is the result of default argument promotions of
    type mode_t. */
@@ -1220,6 +1625,10 @@
 /* Define to 1 if readlink fails to recognize a trailing slash. */
 /* #undef READLINK_TRAILING_SLASH_BUG */
 
+/* Define to 1 if readlink sets errno instead of truncating a too-long link.
+   */
+/* #undef READLINK_TRUNCATE_BUG */
+
 /* Define if rename does not work when the destination file exists, as on
    Cygwin 1.5 or Windows. */
 /* #undef RENAME_DEST_EXISTS_BUG */
@@ -1236,6 +1645,12 @@
    such as on Solaris 9 or cygwin 1.5. */
 /* #undef RENAME_TRAILING_SLASH_SOURCE_BUG */
 
+/* Define to 1 if gnulib's dirfd() replacement is used. */
+/* #undef REPLACE_DIRFD */
+
+/* Define to 1 if gnulib's fchdir() replacement is used. */
+/* #undef REPLACE_FCHDIR */
+
 /* Define if fprintf is overridden by a POSIX compliant gnulib implementation.
    */
 /* #undef REPLACE_FPRINTF_POSIX */
@@ -1244,6 +1659,10 @@
    slash */
 /* #undef REPLACE_FUNC_STAT_FILE */
 
+/* Define to 1 if open() should work around the inability to open a directory.
+   */
+/* #undef REPLACE_OPEN_DIRECTORY */
+
 /* Define if gnulib uses its own posix_spawn and posix_spawnp functions. */
 /* #undef REPLACE_POSIX_SPAWN */
 
@@ -1261,9 +1680,17 @@
    implementation. */
 /* #undef REPLACE_VFPRINTF_POSIX */
 
+/* Define to 1 if setlocale (LC_ALL, NULL) is multithread-safe. */
+#define SETLOCALE_NULL_ALL_MTSAFE 1
+
+/* Define to 1 if setlocale (category, NULL) is multithread-safe. */
+#define SETLOCALE_NULL_ONE_MTSAFE 1
+
 /* File name of the Bourne shell.  */
-#if defined __CYGWIN__ || defined __ANDROID__
+#if (defined _WIN32 && !defined __CYGWIN__) || defined __CYGWIN__ || defined __ANDROID__
 /* Omit the directory part because
+   - For native Windows programs in a Cygwin environment, the Cygwin mounts
+     are not visible.
    - For 32-bit Cygwin programs in a 64-bit Cygwin environment, the Cygwin
      mounts are not visible.
    - On Android, /bin/sh does not exist. It's /system/bin/sh instead.  */
@@ -1297,7 +1724,9 @@
 /* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
 /* #undef STAT_MACROS_BROKEN */
 
-/* Define to 1 if you have the ANSI C header files. */
+/* Define to 1 if all of the C90 standard headers exist (not just the ones
+   required in a freestanding environment). This macro is provided for
+   backward compatibility; new code need not use it. */
 #define STDC_HEADERS 1
 
 /* Define to 1 if strerror_r returns char *. */
@@ -1324,6 +1753,10 @@
 /* Define if the POSIX multithreading library can be used. */
 #define USE_POSIX_THREADS 1
 
+/* Define if references to the POSIX multithreading library are satisfied by
+   libc. */
+/* #undef USE_POSIX_THREADS_FROM_LIBC */
+
 /* Define if references to the POSIX multithreading library should be made
    weak. */
 #define USE_POSIX_THREADS_WEAK 1
@@ -1336,19 +1769,44 @@
 #ifndef _DARWIN_C_SOURCE
 # define _DARWIN_C_SOURCE 1
 #endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# define __EXTENSIONS__ 1
+#endif
 /* Enable GNU extensions on systems that have them.  */
 #ifndef _GNU_SOURCE
 # define _GNU_SOURCE 1
 #endif
-/* Enable NetBSD extensions on NetBSD.  */
+/* Enable X/Open compliant socket functions that do not require linking
+   with -lxnet on HP-UX 11.11.  */
+#ifndef _HPUX_ALT_XOPEN_SOCKET_API
+# define _HPUX_ALT_XOPEN_SOCKET_API 1
+#endif
+/* Identify the host operating system as Minix.
+   This macro does not affect the system headers' behavior.
+   A future release of Autoconf may stop defining this macro.  */
+#ifndef _MINIX
+/* # undef _MINIX */
+#endif
+/* Enable general extensions on NetBSD.
+   Enable NetBSD compatibility extensions on Minix.  */
 #ifndef _NETBSD_SOURCE
 # define _NETBSD_SOURCE 1
 #endif
-/* Enable OpenBSD extensions on NetBSD.  */
+/* Enable OpenBSD compatibility extensions on NetBSD.
+   Oddly enough, this does nothing on OpenBSD.  */
 #ifndef _OPENBSD_SOURCE
 # define _OPENBSD_SOURCE 1
 #endif
-/* Enable threading extensions on Solaris.  */
+/* Define to 1 if needed for POSIX-compatible behavior.  */
+#ifndef _POSIX_SOURCE
+/* # undef _POSIX_SOURCE */
+#endif
+/* Define to 2 if needed for POSIX-compatible behavior.  */
+#ifndef _POSIX_1_SOURCE
+/* # undef _POSIX_1_SOURCE */
+#endif
+/* Enable POSIX-compatible threading on Solaris.  */
 #ifndef _POSIX_PTHREAD_SEMANTICS
 # define _POSIX_PTHREAD_SEMANTICS 1
 #endif
@@ -1384,33 +1842,21 @@
 #ifndef _TANDEM_SOURCE
 # define _TANDEM_SOURCE 1
 #endif
-/* Enable X/Open extensions if necessary.  HP-UX 11.11 defines
-   mbstate_t only if _XOPEN_SOURCE is defined to 500, regardless of
-   whether compiling with -Ae or -D_HPUX_SOURCE=1.  */
+/* Enable X/Open extensions.  Define to 500 only if necessary
+   to make mbstate_t available.  */
 #ifndef _XOPEN_SOURCE
 /* # undef _XOPEN_SOURCE */
 #endif
-/* Enable X/Open compliant socket functions that do not require linking
-   with -lxnet on HP-UX 11.11.  */
-#ifndef _HPUX_ALT_XOPEN_SOCKET_API
-# define _HPUX_ALT_XOPEN_SOCKET_API 1
-#endif
-/* Enable general extensions on Solaris.  */
-#ifndef __EXTENSIONS__
-# define __EXTENSIONS__ 1
-#endif
 
 
-/* Define to 1 if you want getc etc. to use unlocked I/O if available.
-   Unlocked I/O can improve performance in unithreaded apps, but it is not
-   safe for multithreaded apps. */
-#define USE_UNLOCKED_IO 1
+/* An alias of GNULIB_STDIO_SINGLE_THREAD. */
+#define USE_UNLOCKED_IO GNULIB_STDIO_SINGLE_THREAD
 
 /* Define if the native Windows multithreading API can be used. */
 /* #undef USE_WINDOWS_THREADS */
 
 /* Version number of package */
-#define VERSION "3.5"
+#define VERSION "3.8.2"
 
 /* Define to 1 if unsetenv returns void instead of int. */
 /* #undef VOID_UNSETENV */
@@ -1445,20 +1891,26 @@
    `char[]'. */
 /* #undef YYTEXT_POINTER */
 
-/* Enable large inode numbers on Mac OS X 10.5. */
-#define _DARWIN_USE_64_BIT_INODE 1
-
 /* Number of bits in a file offset, on hosts where this is settable. */
 /* #undef _FILE_OFFSET_BITS */
 
+/* True if the compiler says it groks GNU C version MAJOR.MINOR.  */
+#if defined __GNUC__ && defined __GNUC_MINOR__
+# define _GL_GNUC_PREREQ(major, minor) \
+    ((major) < __GNUC__ + ((minor) <= __GNUC_MINOR__))
+#else
+# define _GL_GNUC_PREREQ(major, minor) 0
+#endif
+
+
+/* Define to enable the declarations of ISO C 11 types and functions. */
+/* #undef _ISOC11_SOURCE */
+
 /* Define for large files, on AIX-style hosts. */
 /* #undef _LARGE_FILES */
 
-/* Define to 1 if on MINIX. */
-/* #undef _MINIX */
-
-/* Define to 1 to make NetBSD features available. MINIX 3 needs this. */
-#define _NETBSD_SOURCE 1
+/* Define to 1 on Solaris. */
+/* #undef _LCONV_C99 */
 
 /* The _Noreturn keyword of C11.  */
 #ifndef _Noreturn
@@ -1474,10 +1926,14 @@
        this syntax with 'extern'.  */
 #  define _Noreturn [[noreturn]]
 # elif ((!defined __cplusplus || defined __clang__) \
-        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)  \
-            || 4 < __GNUC__ + (7 <= __GNUC_MINOR__)))
+        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
+            || (!defined __STRICT_ANSI__ \
+                && (_GL_GNUC_PREREQ (4, 7) \
+                    || (defined __apple_build_version__ \
+                        ? 6000000 <= __apple_build_version__ \
+                        : 3 < __clang_major__ + (5 <= __clang_minor__))))))
    /* _Noreturn works as-is.  */
-# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
+# elif _GL_GNUC_PREREQ (2, 8) || defined __clang__ || 0x5110 <= __SUNPRO_C
 #  define _Noreturn __attribute__ ((__noreturn__))
 # elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
 #  define _Noreturn __declspec (noreturn)
@@ -1487,12 +1943,8 @@
 #endif
 
 
-/* Define to 2 if the system does not provide POSIX.1 features except with
-   this defined. */
-/* #undef _POSIX_1_SOURCE */
-
-/* Define to 1 if you need to in order for 'stat' and other things to work. */
-/* #undef _POSIX_SOURCE */
+/* Number of bits in a timestamp, on hosts where this is settable. */
+/* #undef _TIME_BITS */
 
 /* For standard stat data types on VMS. */
 #define _USE_STD_STAT 1
@@ -1501,6 +1953,9 @@
    used. */
 #define __GETOPT_PREFIX rpl_
 
+/* For 64-bit time_t on 32-bit mingw. */
+/* #undef __MINGW_USE_VC2005_COMPAT */
+
 /* Define to 1 if the system <stdint.h> predates C++11. */
 /* #undef __STDC_CONSTANT_MACROS */
 
@@ -1534,6 +1989,368 @@
 #define _GL_ASYNC_SAFE
 
 
+/* Attributes.  */
+#if (defined __has_attribute \
+     && (!defined __clang_minor__ \
+         || 3 < __clang_major__ + (5 <= __clang_minor__)))
+# define _GL_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__)
+#else
+# define _GL_HAS_ATTRIBUTE(attr) _GL_ATTR_##attr
+# define _GL_ATTR_alloc_size _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_always_inline _GL_GNUC_PREREQ (3, 2)
+# define _GL_ATTR_artificial _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_cold _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_const _GL_GNUC_PREREQ (2, 95)
+# define _GL_ATTR_deprecated _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_diagnose_if 0
+# define _GL_ATTR_error _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_externally_visible _GL_GNUC_PREREQ (4, 1)
+# define _GL_ATTR_fallthrough _GL_GNUC_PREREQ (7, 0)
+# define _GL_ATTR_format _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_leaf _GL_GNUC_PREREQ (4, 6)
+# define _GL_ATTR_malloc _GL_GNUC_PREREQ (3, 0)
+# ifdef _ICC
+#  define _GL_ATTR_may_alias 0
+# else
+#  define _GL_ATTR_may_alias _GL_GNUC_PREREQ (3, 3)
+# endif
+# define _GL_ATTR_noinline _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_nonnull _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_nonstring _GL_GNUC_PREREQ (8, 0)
+# define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96)
+# define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9)
+# define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0)
+# define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4)
+#endif
+
+#ifdef __has_c_attribute
+# define _GL_HAS_C_ATTRIBUTE(attr) __has_c_attribute (__##attr##__)
+#else
+# define _GL_HAS_C_ATTRIBUTE(attr) 0
+#endif
+
+
+/* _GL_ATTRIBUTE_ALLOC_SIZE ((N)) declares that the Nth argument of the function
+   is the size of the returned memory block.
+   _GL_ATTRIBUTE_ALLOC_SIZE ((M, N)) declares that the Mth argument multiplied
+   by the Nth argument of the function is the size of the returned memory block.
+ */
+/* Applies to: function, pointer to function, function types.  */
+#if _GL_HAS_ATTRIBUTE (alloc_size)
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
+#else
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args)
+#endif
+
+/* _GL_ATTRIBUTE_ALWAYS_INLINE tells that the compiler should always inline the
+   function and report an error if it cannot do so.  */
+/* Applies to: function.  */
+#if _GL_HAS_ATTRIBUTE (always_inline)
+# define _GL_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__))
+#else
+# define _GL_ATTRIBUTE_ALWAYS_INLINE
+#endif
+
+/* _GL_ATTRIBUTE_ARTIFICIAL declares that the function is not important to show
+    in stack traces when debugging.  The compiler should omit the function from
+    stack traces.  */
+/* Applies to: function.  */
+#if _GL_HAS_ATTRIBUTE (artificial)
+# define _GL_ATTRIBUTE_ARTIFICIAL __attribute__ ((__artificial__))
+#else
+# define _GL_ATTRIBUTE_ARTIFICIAL
+#endif
+
+/* _GL_ATTRIBUTE_COLD declares that the function is rarely executed.  */
+/* Applies to: functions.  */
+/* Avoid __attribute__ ((cold)) on MinGW; see thread starting at
+   <https://lists.gnu.org/r/emacs-devel/2019-04/msg01152.html>.
+   Also, Oracle Studio 12.6 requires 'cold' not '__cold__'.  */
+#if _GL_HAS_ATTRIBUTE (cold) && !defined __MINGW32__
+# ifndef __SUNPRO_C
+#  define _GL_ATTRIBUTE_COLD __attribute__ ((__cold__))
+# else
+#  define _GL_ATTRIBUTE_COLD __attribute__ ((cold))
+# endif
+#else
+# define _GL_ATTRIBUTE_COLD
+#endif
+
+/* _GL_ATTRIBUTE_CONST declares that it is OK for a compiler to omit duplicate
+   calls to the function with the same arguments.
+   This attribute is safe for a function that neither depends on nor affects
+   observable state, and always returns exactly once - e.g., does not loop
+   forever, and does not call longjmp.
+   (This attribute is stricter than _GL_ATTRIBUTE_PURE.)  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (const)
+# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
+#else
+# define _GL_ATTRIBUTE_CONST
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.
+   _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
+   can be freed via 'free'; it can be used only after declaring 'free'.  */
+/* Applies to: functions.  Cannot be used on inline functions.  */
+#if _GL_GNUC_PREREQ (11, 0)
+# define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+#else
+# define _GL_ATTRIBUTE_DEALLOC(f, i)
+#endif
+#define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (free, 1)
+
+/* _GL_ATTRIBUTE_DEPRECATED: Declares that an entity is deprecated.
+   The compiler may warn if the entity is used.  */
+/* Applies to:
+     - function, variable,
+     - struct, union, struct/union member,
+     - enumeration, enumeration item,
+     - typedef,
+   in C++ also: namespace, class, template specialization.  */
+#if _GL_HAS_C_ATTRIBUTE (deprecated)
+# define _GL_ATTRIBUTE_DEPRECATED [[__deprecated__]]
+#elif _GL_HAS_ATTRIBUTE (deprecated)
+# define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__))
+#else
+# define _GL_ATTRIBUTE_DEPRECATED
+#endif
+
+/* _GL_ATTRIBUTE_ERROR(msg) requests an error if a function is called and
+   the function call is not optimized away.
+   _GL_ATTRIBUTE_WARNING(msg) requests a warning if a function is called and
+   the function call is not optimized away.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (error)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__error__ (msg)))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__warning__ (msg)))
+#elif _GL_HAS_ATTRIBUTE (diagnose_if)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__diagnose_if__ (1, msg, "error")))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#else
+# define _GL_ATTRIBUTE_ERROR(msg)
+# define _GL_ATTRIBUTE_WARNING(msg)
+#endif
+
+/* _GL_ATTRIBUTE_EXTERNALLY_VISIBLE declares that the entity should remain
+   visible to debuggers etc., even with '-fwhole-program'.  */
+/* Applies to: functions, variables.  */
+#if _GL_HAS_ATTRIBUTE (externally_visible)
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((externally_visible))
+#else
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
+#endif
+
+/* _GL_ATTRIBUTE_FALLTHROUGH declares that it is not a programming mistake if
+   the control flow falls through to the immediately following 'case' or
+   'default' label.  The compiler should not warn in this case.  */
+/* Applies to: Empty statement (;), inside a 'switch' statement.  */
+/* Always expands to something.  */
+#if _GL_HAS_C_ATTRIBUTE (fallthrough)
+# define _GL_ATTRIBUTE_FALLTHROUGH [[__fallthrough__]]
+#elif _GL_HAS_ATTRIBUTE (fallthrough)
+# define _GL_ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__))
+#else
+# define _GL_ATTRIBUTE_FALLTHROUGH ((void) 0)
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK))
+   declares that the STRING-INDEXth function argument is a format string of
+   style ARCHETYPE, which is one of:
+     printf, gnu_printf
+     scanf, gnu_scanf,
+     strftime, gnu_strftime,
+     strfmon,
+   or the same thing prefixed and suffixed with '__'.
+   If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK
+   are suitable for the format string.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (format)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define _GL_ATTRIBUTE_FORMAT(spec)
+#endif
+
+/* _GL_ATTRIBUTE_LEAF declares that if the function is called from some other
+   compilation unit, it executes code from that unit only by return or by
+   exception handling.  This declaration lets the compiler optimize that unit
+   more aggressively.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (leaf)
+# define _GL_ATTRIBUTE_LEAF __attribute__ ((__leaf__))
+#else
+# define _GL_ATTRIBUTE_LEAF
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+   allocated memory.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (malloc)
+# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+#else
+# define _GL_ATTRIBUTE_MALLOC
+#endif
+
+/* _GL_ATTRIBUTE_MAY_ALIAS declares that pointers to the type may point to the
+   same storage as pointers to other types.  Thus this declaration disables
+   strict aliasing optimization.  */
+/* Applies to: types.  */
+/* Oracle Studio 12.6 mishandles may_alias despite __has_attribute OK.  */
+#if _GL_HAS_ATTRIBUTE (may_alias) && !defined __SUNPRO_C
+# define _GL_ATTRIBUTE_MAY_ALIAS __attribute__ ((__may_alias__))
+#else
+# define _GL_ATTRIBUTE_MAY_ALIAS
+#endif
+
+/* _GL_ATTRIBUTE_MAYBE_UNUSED declares that it is not a programming mistake if
+   the entity is not used.  The compiler should not warn if the entity is not
+   used.  */
+/* Applies to:
+     - function, variable,
+     - struct, union, struct/union member,
+     - enumeration, enumeration item,
+     - typedef,
+   in C++ also: class.  */
+/* In C++ and C2x, this is spelled [[__maybe_unused__]].
+   GCC's syntax is __attribute__ ((__unused__)).
+   clang supports both syntaxes.  */
+#if _GL_HAS_C_ATTRIBUTE (maybe_unused)
+# define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
+#else
+# define _GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_UNUSED
+#endif
+/* Alternative spelling of this macro, for convenience.  */
+#define _GL_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
+/* Earlier spellings of this macro.  */
+#define _UNUSED_PARAMETER_ _GL_ATTRIBUTE_MAYBE_UNUSED
+
+/* _GL_ATTRIBUTE_NODISCARD declares that the caller of the function should not
+   discard the return value.  The compiler may warn if the caller does not use
+   the return value, unless the caller uses something like ignore_value.  */
+/* Applies to: function, enumeration, class.  */
+#if _GL_HAS_C_ATTRIBUTE (nodiscard)
+# define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]]
+#elif _GL_HAS_ATTRIBUTE (warn_unused_result)
+# define _GL_ATTRIBUTE_NODISCARD __attribute__ ((__warn_unused_result__))
+#else
+# define _GL_ATTRIBUTE_NODISCARD
+#endif
+
+/* _GL_ATTRIBUTE_NOINLINE tells that the compiler should not inline the
+   function.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (noinline)
+# define _GL_ATTRIBUTE_NOINLINE __attribute__ ((__noinline__))
+#else
+# define _GL_ATTRIBUTE_NOINLINE
+#endif
+
+/* _GL_ATTRIBUTE_NONNULL ((N1, N2,...)) declares that the arguments N1, N2,...
+   must not be NULL.
+   _GL_ATTRIBUTE_NONNULL () declares that all pointer arguments must not be
+   null.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (nonnull)
+# define _GL_ATTRIBUTE_NONNULL(args) __attribute__ ((__nonnull__ args))
+#else
+# define _GL_ATTRIBUTE_NONNULL(args)
+#endif
+
+/* _GL_ATTRIBUTE_NONSTRING declares that the contents of a character array is
+   not meant to be NUL-terminated.  */
+/* Applies to: struct/union members and variables that are arrays of element
+   type '[[un]signed] char'.  */
+#if _GL_HAS_ATTRIBUTE (nonstring)
+# define _GL_ATTRIBUTE_NONSTRING __attribute__ ((__nonstring__))
+#else
+# define _GL_ATTRIBUTE_NONSTRING
+#endif
+
+/* There is no _GL_ATTRIBUTE_NORETURN; use _Noreturn instead.  */
+
+/* _GL_ATTRIBUTE_NOTHROW declares that the function does not throw exceptions.
+ */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (nothrow) && !defined __cplusplus
+# define _GL_ATTRIBUTE_NOTHROW __attribute__ ((__nothrow__))
+#else
+# define _GL_ATTRIBUTE_NOTHROW
+#endif
+
+/* _GL_ATTRIBUTE_PACKED declares:
+   For struct members: The member has the smallest possible alignment.
+   For struct, union, class: All members have the smallest possible alignment,
+   minimizing the memory required.  */
+/* Applies to: struct members, struct, union,
+   in C++ also: class.  */
+#if _GL_HAS_ATTRIBUTE (packed)
+# define _GL_ATTRIBUTE_PACKED __attribute__ ((__packed__))
+#else
+# define _GL_ATTRIBUTE_PACKED
+#endif
+
+/* _GL_ATTRIBUTE_PURE declares that It is OK for a compiler to omit duplicate
+   calls to the function with the same arguments if observable state is not
+   changed between calls.
+   This attribute is safe for a function that does not affect
+   observable state, and always returns exactly once.
+   (This attribute is looser than _GL_ATTRIBUTE_CONST.)  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (pure)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE
+#endif
+
+/* _GL_ATTRIBUTE_RETURNS_NONNULL declares that the function's return value is
+   a non-NULL pointer.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (returns_nonnull)
+# define _GL_ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__))
+#else
+# define _GL_ATTRIBUTE_RETURNS_NONNULL
+#endif
+
+/* _GL_ATTRIBUTE_SENTINEL(pos) declares that the variadic function expects a
+   trailing NULL argument.
+   _GL_ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99).
+   _GL_ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (sentinel)
+# define _GL_ATTRIBUTE_SENTINEL(pos) __attribute__ ((__sentinel__ pos))
+#else
+# define _GL_ATTRIBUTE_SENTINEL(pos)
+#endif
+
+/* A helper macro.  Don't use it directly.  */
+#if _GL_HAS_ATTRIBUTE (unused)
+# define _GL_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#else
+# define _GL_ATTRIBUTE_UNUSED
+#endif
+
+
+/* _GL_UNUSED_LABEL; declares that it is not a programming mistake if the
+   immediately preceding label is not used.  The compiler should not warn
+   if the label is not used.  */
+/* Applies to: label (both in C and C++).  */
+/* Note that g++ < 4.5 does not support the '__attribute__ ((__unused__)) ;'
+   syntax.  But clang does.  */
+#if !(defined __cplusplus && !_GL_GNUC_PREREQ (4, 5)) || defined __clang__
+# define _GL_UNUSED_LABEL _GL_ATTRIBUTE_UNUSED
+#else
+# define _GL_UNUSED_LABEL
+#endif
+
+
+/* Define as 'access' if you don't have the eaccess() function. */
+/* #undef eaccess */
+
 /* Please see the Gnulib manual for how to use these macros.
 
    Suppress extern inline with HP-UX cc, as it appears to be broken; see
@@ -1543,7 +2360,8 @@
    mishandles inline functions that call each other.  E.g., for 'inline void f
    (void) { } inline void g (void) { f (); }', c99 incorrectly complains
    'reference to static identifier "f" in extern inline function'.
-   This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16.
+   This bug was observed with Oracle Developer Studio 12.6
+   (Sun C 5.15 SunOS_sparc 2017/05/30).
 
    Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
    on configurations that mistakenly use 'static inline' to implement
@@ -1609,8 +2427,8 @@
 # define _GL_EXTERN_INLINE extern
 # define _GL_EXTERN_INLINE_IN_USE
 #else
-# define _GL_INLINE static _GL_UNUSED
-# define _GL_EXTERN_INLINE static _GL_UNUSED
+# define _GL_INLINE _GL_UNUSED static
+# define _GL_EXTERN_INLINE _GL_UNUSED static
 #endif
 
 /* In GCC 4.6 (inclusive) to 5.1 (exclusive),
@@ -1663,13 +2481,29 @@
 /* Define to a type if <wchar.h> does not define. */
 /* #undef mbstate_t */
 
+/* _GL_CMP (n1, n2) performs a three-valued comparison on n1 vs. n2, where
+   n1 and n2 are expressions without side effects, that evaluate to real
+   numbers (excluding NaN).
+   It returns
+     1  if n1 > n2
+     0  if n1 == n2
+     -1 if n1 < n2
+   The naïve code   (n1 > n2 ? 1 : n1 < n2 ? -1 : 0)  produces a conditional
+   jump with nearly all GCC versions up to GCC 10.
+   This variant     (n1 < n2 ? -1 : n1 > n2)  produces a conditional with many
+   GCC versions up to GCC 9.
+   The better code  (n1 > n2) - (n1 < n2)  from Hacker's Delight § 2-9
+   avoids conditional jumps in all GCC versions >= 3.4.  */
+#define _GL_CMP(n1, n2) (((n1) > (n2)) - ((n1) < (n2)))
+
+
 /* Define to `int' if <sys/types.h> does not define. */
 /* #undef mode_t */
 
 /* Define to the type of st_nlink in struct stat, or a supertype. */
 /* #undef nlink_t */
 
-/* Define to `int' if <sys/types.h> does not define. */
+/* Define as a signed integer type capable of holding a process identifier. */
 /* #undef pid_t */
 
 /* Define as the type of the result of subtracting two pointers, if the system
@@ -1678,14 +2512,15 @@
 
 /* Define to the equivalent of the C99 'restrict' keyword, or to
    nothing if this is not supported.  Do not define if restrict is
-   supported directly.  */
-#define restrict __restrict
-/* Work around a bug in Sun C++: it does not support _Restrict or
-   __restrict__, even though the corresponding Sun C compiler ends up with
-   "#define restrict _Restrict" or "#define restrict __restrict__" in the
-   previous line.  Perhaps some future version of Sun C++ will work with
-   restrict; if so, hopefully it defines __RESTRICT like Sun C does.  */
-#if defined __SUNPRO_CC && !defined __RESTRICT
+   supported only directly.  */
+#define restrict __restrict__
+/* Work around a bug in older versions of Sun C++, which did not
+   #define __restrict__ or support _Restrict or __restrict__
+   even though the corresponding Sun C compiler ended up with
+   "#define restrict _Restrict" or "#define restrict __restrict__"
+   in the previous line.  This workaround can be removed once
+   we assume Oracle Developer Studio 12.5 (2016) or later.  */
+#if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__
 # define _Restrict
 # define __restrict__
 #endif
@@ -1703,46 +2538,18 @@
 /* Define to `int' if <sys/types.h> doesn't define. */
 /* #undef uid_t */
 
-/* Define as a marker that can be attached to declarations that might not
-    be used.  This helps to reduce warnings, such as from
-    GCC -Wunused-parameter.  */
-#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
-# define _GL_UNUSED __attribute__ ((__unused__))
-#else
-# define _GL_UNUSED
-#endif
-/* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name
-   is a misnomer outside of parameter lists.  */
-#define _UNUSED_PARAMETER_ _GL_UNUSED
 
-/* gcc supports the "unused" attribute on possibly unused labels, and
-   g++ has since version 4.5.  Note to support C++ as well as C,
-   _GL_UNUSED_LABEL should be used with a trailing ;  */
-#if !defined __cplusplus || __GNUC__ > 4 \
-    || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
-# define _GL_UNUSED_LABEL _GL_UNUSED
-#else
-# define _GL_UNUSED_LABEL
-#endif
-
-/* The __pure__ attribute was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define _GL_ATTRIBUTE_PURE /* empty */
-#endif
-
-/* The __const__ attribute was added in gcc 2.95.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
-# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
-#else
-# define _GL_ATTRIBUTE_CONST /* empty */
-#endif
-
-/* The __malloc__ attribute was added in gcc 3.  */
-#if 3 <= __GNUC__
-# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
-#else
-# define _GL_ATTRIBUTE_MALLOC /* empty */
-#endif
-
+  /* This definition is a duplicate of the one in unitypes.h.
+     It is here so that we can cope with an older version of unitypes.h
+     that does not contain this definition and that is pre-installed among
+     the public header files.  */
+  # if defined __restrict \
+       || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+       || __clang_major__ >= 3
+  #  define _UC_RESTRICT __restrict
+  # elif 199901L <= __STDC_VERSION__ || defined restrict
+  #  define _UC_RESTRICT restrict
+  # else
+  #  define _UC_RESTRICT
+  # endif
+  
diff --git a/linux_musl-lib/dirent.h b/linux_musl-lib/dirent.h
new file mode 100644
index 0000000..f9e238f
--- /dev/null
+++ b/linux_musl-lib/dirent.h
@@ -0,0 +1,828 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* A GNU-like <dirent.h>.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_DIRENT_H
+
+#if __GNUC__ >= 3
+#pragma GCC system_header
+#endif
+
+
+/* The include_next requires a split double-inclusion guard.  */
+#if 1
+# include_next <dirent.h>
+#endif
+
+#ifndef _GL_DIRENT_H
+#define _GL_DIRENT_H
+
+/* Get ino_t.  Needed on some systems, including glibc 2.8.  */
+#include <sys/types.h>
+
+#if !1
+/* Define types DIR and 'struct dirent'.  */
+# if !GNULIB_defined_struct_dirent
+struct dirent
+{
+  char d_type;
+  char d_name[1];
+};
+/* Possible values for 'd_type'.  */
+#  define DT_UNKNOWN 0
+#  define DT_FIFO    1          /* FIFO */
+#  define DT_CHR     2          /* character device */
+#  define DT_DIR     4          /* directory */
+#  define DT_BLK     6          /* block device */
+#  define DT_REG     8          /* regular file */
+#  define DT_LNK    10          /* symbolic link */
+#  define DT_SOCK   12          /* socket */
+#  define DT_WHT    14          /* whiteout */
+typedef struct gl_directory DIR;
+#  define GNULIB_defined_struct_dirent 1
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.  */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if __GNUC__ >= 11
+#  define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+#  define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+   allocated memory.  */
+/* Applies to: functions.  */
+#ifndef _GL_ATTRIBUTE_MALLOC
+# if __GNUC__ >= 3 || defined __clang__
+#  define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+#  define _GL_ATTRIBUTE_MALLOC
+# endif
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The attribute __pure__ was added in gcc 2.96.  */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+/* C++ compatible function declaration macros.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_CXXDEFS_H
+#define _GL_CXXDEFS_H
+
+/* Begin/end the GNULIB_NAMESPACE namespace.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
+# define _GL_END_NAMESPACE }
+#else
+# define _GL_BEGIN_NAMESPACE
+# define _GL_END_NAMESPACE
+#endif
+
+/* The three most frequent use cases of these macros are:
+
+   * For providing a substitute for a function that is missing on some
+     platforms, but is declared and works fine on the platforms on which
+     it exists:
+
+       #if @GNULIB_FOO@
+       # if !@HAVE_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       # endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on all platforms,
+     but is broken/insufficient and needs to be replaced on some platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on some platforms
+     but is broken/insufficient and needs to be replaced on some of them and
+     is additionally either missing or undeclared on some other platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       #  if !@HAVE_FOO@   or   if !@HAVE_DECL_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       #  endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+*/
+
+/* _GL_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#if defined __cplusplus
+# define _GL_EXTERN_C extern "C"
+#else
+# define _GL_EXTERN_C extern
+#endif
+
+/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
+   declares a replacement function, named rpl_func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
+  _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
+#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype rpl_func parameters_and_attributes
+
+/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
+   declares the system function, named func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype func parameters_and_attributes
+
+/* _GL_CXXALIAS_RPL (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+
+   Wrapping rpl_func in an object with an inline conversion operator
+   avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::rpl_func;                                  \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
+   is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
+   except that the C function rpl_func may have a slightly different
+   declaration.  A cast is used to silence the "invalid conversion" error
+   that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                     \
+    {                                                              \
+      static const struct _gl_ ## func ## _wrapper                 \
+      {                                                            \
+        typedef rettype (*type) parameters;                        \
+                                                                   \
+        inline operator type () const                              \
+        {                                                          \
+          return reinterpret_cast<type>(::rpl_func);               \
+        }                                                          \
+      } func = {};                                                 \
+    }                                                              \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_SYS (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to the system provided function func, if GNULIB_NAMESPACE
+   is defined.
+   Example:
+     _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+
+   Wrapping func in an object with an inline conversion operator
+   avoids a reference to func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS(func,rettype,parameters)            \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::func;                                      \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                          \
+    {                                                   \
+      static const struct _gl_ ## func ## _wrapper      \
+      {                                                 \
+        typedef rettype (*type) parameters;             \
+                                                        \
+        inline operator type () const                   \
+        {                                               \
+          return reinterpret_cast<type>(::func);        \
+        }                                               \
+      } func = {};                                      \
+    }                                                   \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function is picked among a set of overloaded functions,
+   namely the one with rettype2 and parameters2.  Two consecutive casts
+   are used to silence the "cannot find a match" and "invalid conversion"
+   errors that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+  /* The outer cast must be a reinterpret_cast.
+     The inner cast: When the function is defined as a set of overloaded
+     functions, it works as a static_cast<>, choosing the designated variant.
+     When the function is defined as a single variant, it works as a
+     reinterpret_cast<>. The parenthesized cast syntax works both ways.  */
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    namespace GNULIB_NAMESPACE                                                \
+    {                                                                         \
+      static const struct _gl_ ## func ## _wrapper                            \
+      {                                                                       \
+        typedef rettype (*type) parameters;                                   \
+                                                                              \
+        inline operator type () const                                         \
+        {                                                                     \
+          return reinterpret_cast<type>((rettype2 (*) parameters2)(::func));  \
+        }                                                                     \
+      } func = {};                                                            \
+    }                                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN (func);
+   causes a warning to be emitted when ::func is used but not when
+   GNULIB_NAMESPACE::func is used.  func must be defined without overloaded
+   variants.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN(func) \
+   _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN_1(func,namespace) \
+   _GL_CXXALIASWARN_2 (func, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+    _GL_WARN_ON_USE (func, \
+                     "The symbol ::" #func " refers to the system function. " \
+                     "Use " #namespace "::" #func " instead.")
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     extern __typeof__ (func) func
+# else
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN(func) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
+   causes a warning to be emitted when the given overloaded variant of ::func
+   is used but not when GNULIB_NAMESPACE::func is used.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+   _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
+                        GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
+   _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
+                         "The symbol ::" #func " refers to the system function. " \
+                         "Use " #namespace "::" #func " instead.")
+# else
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+#endif /* _GL_CXXDEFS_H */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+/* A C macro for declaring that specific arguments must not be NULL.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
+   that the values passed as arguments n, ..., m must be non-NULL pointers.
+   n = 1 stands for the first argument, n = 2 for the second argument etc.  */
+#ifndef _GL_ARG_NONNULL
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
+#  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
+# else
+#  define _GL_ARG_NONNULL(params)
+# endif
+#endif
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+/* A C macro for emitting warnings if a function is used.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
+   for FUNCTION which will then trigger a compiler warning containing
+   the text of "literal string" anywhere that function is called, if
+   supported by the compiler.  If the compiler does not support this
+   feature, the macro expands to an unused extern declaration.
+
+   _GL_WARN_ON_USE_ATTRIBUTE ("literal string") expands to the
+   attribute used in _GL_WARN_ON_USE.  If the compiler does not support
+   this feature, it expands to empty.
+
+   These macros are useful for marking a function as a potential
+   portability trap, with the intent that "literal string" include
+   instructions on the replacement function that should be used
+   instead.
+   _GL_WARN_ON_USE is for functions with 'extern' linkage.
+   _GL_WARN_ON_USE_ATTRIBUTE is for functions with 'static' or 'inline'
+   linkage.
+
+   However, one of the reasons that a function is a portability trap is
+   if it has the wrong signature.  Declaring FUNCTION with a different
+   signature in C is a compilation error, so this macro must use the
+   same type as any existing declaration so that programs that avoid
+   the problematic FUNCTION do not fail to compile merely because they
+   included a header that poisoned the function.  But this implies that
+   _GL_WARN_ON_USE is only safe to use if FUNCTION is known to already
+   have a declaration.  Use of this macro implies that there must not
+   be any other macro hiding the declaration of FUNCTION; but
+   undefining FUNCTION first is part of the poisoning process anyway
+   (although for symbols that are provided only via a macro, the result
+   is a compilation error rather than a warning containing
+   "literal string").  Also note that in C++, it is only safe to use if
+   FUNCTION has no overloads.
+
+   For an example, it is possible to poison 'getline' by:
+   - adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
+     [getline]) in configure.ac, which potentially defines
+     HAVE_RAW_DECL_GETLINE
+   - adding this code to a header that wraps the system <stdio.h>:
+     #undef getline
+     #if HAVE_RAW_DECL_GETLINE
+     _GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
+       "not universally present; use the gnulib module getline");
+     #endif
+
+   It is not possible to directly poison global variables.  But it is
+   possible to write a wrapper accessor function, and poison that
+   (less common usage, like &environ, will cause a compilation error
+   rather than issue the nice warning, but the end result of informing
+   the developer about their portability problem is still achieved):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     rpl_environ (void) { return &environ; }
+     _GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   or better (avoiding contradictory use of 'static' and 'extern'):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     _GL_WARN_ON_USE_ATTRIBUTE ("environ is not always properly declared")
+     rpl_environ (void) { return &environ; }
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   */
+#ifndef _GL_WARN_ON_USE
+
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# else /* Unsupported.  */
+#  define _GL_WARN_ON_USE(function, message) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# endif
+#endif
+
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
+   This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
+   not work in this case.  */
+#ifndef _GL_WARN_ON_USE_CXX
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
+# endif
+#endif
+
+/* _GL_WARN_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#ifndef _GL_WARN_EXTERN_C
+# if defined __cplusplus
+#  define _GL_WARN_EXTERN_C extern "C"
+# else
+#  define _GL_WARN_EXTERN_C extern
+# endif
+#endif
+
+
+/* Declare overridden functions.  */
+
+#if 1
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef closedir
+#   define closedir rpl_closedir
+#   define GNULIB_defined_closedir 1
+#  endif
+_GL_FUNCDECL_RPL (closedir, int, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (closedir, int, (DIR *dirp));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (closedir, int, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (closedir, int, (DIR *dirp));
+# endif
+_GL_CXXALIASWARN (closedir);
+#elif defined GNULIB_POSIXCHECK
+# undef closedir
+# if HAVE_RAW_DECL_CLOSEDIR
+_GL_WARN_ON_USE (closedir, "closedir is not portable - "
+                 "use gnulib module closedir for portability");
+# endif
+#endif
+
+#if 1
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef opendir
+#   define opendir rpl_opendir
+#   define GNULIB_defined_opendir 1
+#  endif
+_GL_FUNCDECL_RPL (opendir, DIR *,
+                  (const char *dir_name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+_GL_CXXALIAS_RPL (opendir, DIR *, (const char *dir_name));
+# else
+#  if !1 || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (opendir, DIR *,
+                  (const char *dir_name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+#  endif
+_GL_CXXALIAS_SYS (opendir, DIR *, (const char *dir_name));
+# endif
+_GL_CXXALIASWARN (opendir);
+#else
+# if 1 && __GNUC__ >= 11 && !defined opendir
+/* For -Wmismatched-dealloc: Associate opendir with closedir or
+   rpl_closedir.  */
+_GL_FUNCDECL_SYS (opendir, DIR *,
+                  (const char *dir_name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef opendir
+#  if HAVE_RAW_DECL_OPENDIR
+_GL_WARN_ON_USE (opendir, "opendir is not portable - "
+                 "use gnulib module opendir for portability");
+#  endif
+# endif
+#endif
+
+#if 1
+# if !1
+_GL_FUNCDECL_SYS (readdir, struct dirent *, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (readdir, struct dirent *, (DIR *dirp));
+_GL_CXXALIASWARN (readdir);
+#elif defined GNULIB_POSIXCHECK
+# undef readdir
+# if HAVE_RAW_DECL_READDIR
+_GL_WARN_ON_USE (readdir, "readdir is not portable - "
+                 "use gnulib module readdir for portability");
+# endif
+#endif
+
+#if 1
+# if !1
+_GL_FUNCDECL_SYS (rewinddir, void, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (rewinddir, void, (DIR *dirp));
+_GL_CXXALIASWARN (rewinddir);
+#elif defined GNULIB_POSIXCHECK
+# undef rewinddir
+# if HAVE_RAW_DECL_REWINDDIR
+_GL_WARN_ON_USE (rewinddir, "rewinddir is not portable - "
+                 "use gnulib module rewinddir for portability");
+# endif
+#endif
+
+#if 0
+/* Return the file descriptor associated with the given directory stream,
+   or -1 if none exists.  */
+# if 0
+/* On kLIBC, dirfd() is a macro that does not work.  Undefine it.  */
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) || defined dirfd
+#   undef dirfd
+#   define dirfd rpl_dirfd
+#  endif
+_GL_FUNCDECL_RPL (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (dirfd, int, (DIR *));
+
+#  ifdef __KLIBC__
+/* Gnulib internal hooks needed to maintain the dirfd metadata.  */
+_GL_EXTERN_C int _gl_register_dirp_fd (int fd, DIR *dirp)
+     _GL_ARG_NONNULL ((2));
+_GL_EXTERN_C void _gl_unregister_dirp_fd (int fd);
+#  endif
+# else
+#  if defined __cplusplus && defined GNULIB_NAMESPACE && defined dirfd
+    /* dirfd is defined as a macro and not as a function.
+       Turn it into a function and get rid of the macro.  */
+static inline int (dirfd) (DIR *dp) { return dirfd (dp); }
+#   undef dirfd
+#  endif
+#  if !(1 || defined dirfd)
+_GL_FUNCDECL_SYS (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (dirfd, int, (DIR *));
+# endif
+_GL_CXXALIASWARN (dirfd);
+#elif defined GNULIB_POSIXCHECK
+# undef dirfd
+# if HAVE_RAW_DECL_DIRFD
+_GL_WARN_ON_USE (dirfd, "dirfd is unportable - "
+                 "use gnulib module dirfd for portability");
+# endif
+#endif
+
+#if 1
+/* Open a directory stream visiting the given directory file
+   descriptor.  Return NULL and set errno if fd is not visiting a
+   directory.  On success, this function consumes fd (it will be
+   implicitly closed either by this function or by a subsequent
+   closedir).  */
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fdopendir
+#   define fdopendir rpl_fdopendir
+#  endif
+_GL_FUNCDECL_RPL (fdopendir, DIR *,
+                  (int fd)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+_GL_CXXALIAS_RPL (fdopendir, DIR *, (int fd));
+# else
+#  if !1 || !1 || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (fdopendir, DIR *,
+                  (int fd)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+#  endif
+_GL_CXXALIAS_SYS (fdopendir, DIR *, (int fd));
+# endif
+_GL_CXXALIASWARN (fdopendir);
+#else
+# if 1 && __GNUC__ >= 11 && !defined fdopendir
+/* For -Wmismatched-dealloc: Associate fdopendir with closedir or
+   rpl_closedir.  */
+_GL_FUNCDECL_SYS (fdopendir, DIR *,
+                  (int fd)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef fdopendir
+#  if HAVE_RAW_DECL_FDOPENDIR
+_GL_WARN_ON_USE (fdopendir, "fdopendir is unportable - "
+                 "use gnulib module fdopendir for portability");
+#  endif
+# endif
+#endif
+
+#if 0
+/* Scan the directory DIR, calling FILTER on each directory entry.
+   Entries for which FILTER returns nonzero are individually malloc'd,
+   sorted using qsort with CMP, and collected in a malloc'd array in
+   *NAMELIST.  Returns the number of entries selected, or -1 on error.  */
+# if !1
+_GL_FUNCDECL_SYS (scandir, int,
+                  (const char *dir, struct dirent ***namelist,
+                   int (*filter) (const struct dirent *),
+                   int (*cmp) (const struct dirent **, const struct dirent **))
+                  _GL_ARG_NONNULL ((1, 2, 4)));
+# endif
+/* Need to cast, because on glibc systems, the fourth parameter is
+                        int (*cmp) (const void *, const void *).  */
+_GL_CXXALIAS_SYS_CAST (scandir, int,
+                       (const char *dir, struct dirent ***namelist,
+                        int (*filter) (const struct dirent *),
+                        int (*cmp) (const struct dirent **, const struct dirent **)));
+_GL_CXXALIASWARN (scandir);
+#elif defined GNULIB_POSIXCHECK
+# undef scandir
+# if HAVE_RAW_DECL_SCANDIR
+_GL_WARN_ON_USE (scandir, "scandir is unportable - "
+                 "use gnulib module scandir for portability");
+# endif
+#endif
+
+#if 0
+/* Compare two 'struct dirent' entries alphabetically.  */
+# if !1
+_GL_FUNCDECL_SYS (alphasort, int,
+                  (const struct dirent **, const struct dirent **)
+                  _GL_ATTRIBUTE_PURE
+                  _GL_ARG_NONNULL ((1, 2)));
+# endif
+/* Need to cast, because on glibc systems, the parameters are
+                       (const void *, const void *).  */
+_GL_CXXALIAS_SYS_CAST (alphasort, int,
+                       (const struct dirent **, const struct dirent **));
+_GL_CXXALIASWARN (alphasort);
+#elif defined GNULIB_POSIXCHECK
+# undef alphasort
+# if HAVE_RAW_DECL_ALPHASORT
+_GL_WARN_ON_USE (alphasort, "alphasort is unportable - "
+                 "use gnulib module alphasort for portability");
+# endif
+#endif
+
+
+#endif /* _GL_DIRENT_H */
+#endif /* _GL_DIRENT_H */
diff --git a/linux_musl-lib/fcntl.h b/linux_musl-lib/fcntl.h
index 0a9908e..84a183b 100644
--- a/linux_musl-lib/fcntl.h
+++ b/linux_musl-lib/fcntl.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Like <fcntl.h>, but with non-working flags defined to 0.
 
-   Copyright (C) 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* written by Paul Eggert */
@@ -82,19 +82,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -229,6 +229,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -254,6 +264,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -351,7 +369,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -379,14 +397,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -400,26 +415,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -428,19 +443,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -516,6 +531,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -528,24 +550,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -571,6 +604,12 @@
 _GL_FUNCDECL_RPL (creat, int, (const char *filename, mode_t mode)
                              _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (creat, int, (const char *filename, mode_t mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef creat
+#   define creat _creat
+#  endif
+_GL_CXXALIAS_MDA (creat, int, (const char *filename, mode_t mode));
 # else
 _GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode));
 # endif
@@ -580,6 +619,21 @@
 /* Assume creat is always declared.  */
 _GL_WARN_ON_USE (creat, "creat is not always POSIX compliant - "
                  "use gnulib module creat for portability");
+#elif 1
+/* On native Windows, map 'creat' to '_creat', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::creat always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef creat
+#   define creat _creat
+#  endif
+/* Need to cast, because in mingw the last argument is 'int mode'.  */
+_GL_CXXALIAS_MDA_CAST (creat, int, (const char *filename, mode_t mode));
+# else
+_GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode));
+# endif
+_GL_CXXALIASWARN (creat);
 #endif
 
 #if 1
@@ -590,9 +644,15 @@
 #  endif
 _GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...));
 _GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...));
+#  if !GNULIB_defined_rpl_fcntl
+#   define GNULIB_defined_rpl_fcntl 1
+#  endif
 # else
 #  if !1
 _GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...));
+#   if !GNULIB_defined_fcntl
+#    define GNULIB_defined_fcntl 1
+#   endif
 #  endif
 _GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...));
 # endif
@@ -614,6 +674,12 @@
 _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
                              _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef open
+#   define open _open
+#  endif
+_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
 # else
 _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
 # endif
@@ -627,9 +693,25 @@
 /* Assume open is always declared.  */
 _GL_WARN_ON_USE (open, "open is not always POSIX compliant - "
                  "use gnulib module open for portability");
+#elif 1
+/* On native Windows, map 'open' to '_open', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::open always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef open
+#   define open _open
+#  endif
+_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+# else
+_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+# endif
+# if !defined __hpux
+_GL_CXXALIASWARN (open);
+# endif
 #endif
 
-#if 0
+#if 1
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef openat
diff --git a/linux_musl-lib/getopt-cdefs.h b/linux_musl-lib/getopt-cdefs.h
index 3202a10..33d7c09 100644
--- a/linux_musl-lib/getopt-cdefs.h
+++ b/linux_musl-lib/getopt-cdefs.h
@@ -1,23 +1,22 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* getopt-on-non-glibc compatibility macros.
-   Copyright (C) 1989-2019 Free Software Foundation, Inc.
+   Copyright (C) 1989-2021 Free Software Foundation, Inc.
    This file is part of gnulib.
    Unlike most of the getopt implementation, it is NOT shared
    with the GNU C Library.
 
-   This file is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 3 of
-   the License, or (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This file is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
-   License along with gnulib; if not, see
-   <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GETOPT_CDEFS_H
 #define _GETOPT_CDEFS_H 1
@@ -29,7 +28,7 @@
 /* getopt-core.h and getopt-ext.h are shared with GNU libc, and expect
    a number of the internal macros supplied to GNU libc's headers by
    sys/cdefs.h.  Provide fallback definitions for all of them.  */
-#if 0
+#if 1
 # include <sys/cdefs.h>
 #endif
 
@@ -58,7 +57,7 @@
 #endif
 
 #ifndef __THROW
-# if defined __cplusplus && __GNUC_PREREQ (2,8)
+# if defined __cplusplus && (__GNUC_PREREQ (2,8) || __clang_major__ >= 4)
 #  define __THROW       throw ()
 # else
 #  define __THROW
diff --git a/linux_musl-lib/getopt.h b/linux_musl-lib/getopt.h
index 632b49b..2524034 100644
--- a/linux_musl-lib/getopt.h
+++ b/linux_musl-lib/getopt.h
@@ -1,23 +1,23 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Declarations for getopt.
-   Copyright (C) 1989-2019 Free Software Foundation, Inc.
+   Copyright (C) 1989-2021 Free Software Foundation, Inc.
    This file is part of gnulib.
    Unlike most of the getopt implementation, it is NOT shared
    with the GNU C Library, which supplies a different version of
    this file.
 
-   This file is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 3 of
-   the License, or (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This file is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public
-   License along with gnulib; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_GETOPT_H
 
@@ -55,26 +55,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
diff --git a/linux_musl-lib/iconv.h b/linux_musl-lib/iconv.h
new file mode 100644
index 0000000..ca9f1e2
--- /dev/null
+++ b/linux_musl-lib/iconv.h
@@ -0,0 +1,634 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* A GNU-like <iconv.h>.
+
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_ICONV_H
+
+#if __GNUC__ >= 3
+#pragma GCC system_header
+#endif
+
+
+/* The include_next requires a split double-inclusion guard.  */
+#include_next <iconv.h>
+
+#ifndef _GL_ICONV_H
+#define _GL_ICONV_H
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+/* C++ compatible function declaration macros.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_CXXDEFS_H
+#define _GL_CXXDEFS_H
+
+/* Begin/end the GNULIB_NAMESPACE namespace.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
+# define _GL_END_NAMESPACE }
+#else
+# define _GL_BEGIN_NAMESPACE
+# define _GL_END_NAMESPACE
+#endif
+
+/* The three most frequent use cases of these macros are:
+
+   * For providing a substitute for a function that is missing on some
+     platforms, but is declared and works fine on the platforms on which
+     it exists:
+
+       #if @GNULIB_FOO@
+       # if !@HAVE_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       # endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on all platforms,
+     but is broken/insufficient and needs to be replaced on some platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on some platforms
+     but is broken/insufficient and needs to be replaced on some of them and
+     is additionally either missing or undeclared on some other platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       #  if !@HAVE_FOO@   or   if !@HAVE_DECL_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       #  endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+*/
+
+/* _GL_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#if defined __cplusplus
+# define _GL_EXTERN_C extern "C"
+#else
+# define _GL_EXTERN_C extern
+#endif
+
+/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
+   declares a replacement function, named rpl_func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
+  _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
+#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype rpl_func parameters_and_attributes
+
+/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
+   declares the system function, named func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype func parameters_and_attributes
+
+/* _GL_CXXALIAS_RPL (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+
+   Wrapping rpl_func in an object with an inline conversion operator
+   avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::rpl_func;                                  \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
+   is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
+   except that the C function rpl_func may have a slightly different
+   declaration.  A cast is used to silence the "invalid conversion" error
+   that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                     \
+    {                                                              \
+      static const struct _gl_ ## func ## _wrapper                 \
+      {                                                            \
+        typedef rettype (*type) parameters;                        \
+                                                                   \
+        inline operator type () const                              \
+        {                                                          \
+          return reinterpret_cast<type>(::rpl_func);               \
+        }                                                          \
+      } func = {};                                                 \
+    }                                                              \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_SYS (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to the system provided function func, if GNULIB_NAMESPACE
+   is defined.
+   Example:
+     _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+
+   Wrapping func in an object with an inline conversion operator
+   avoids a reference to func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS(func,rettype,parameters)            \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::func;                                      \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                          \
+    {                                                   \
+      static const struct _gl_ ## func ## _wrapper      \
+      {                                                 \
+        typedef rettype (*type) parameters;             \
+                                                        \
+        inline operator type () const                   \
+        {                                               \
+          return reinterpret_cast<type>(::func);        \
+        }                                               \
+      } func = {};                                      \
+    }                                                   \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function is picked among a set of overloaded functions,
+   namely the one with rettype2 and parameters2.  Two consecutive casts
+   are used to silence the "cannot find a match" and "invalid conversion"
+   errors that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+  /* The outer cast must be a reinterpret_cast.
+     The inner cast: When the function is defined as a set of overloaded
+     functions, it works as a static_cast<>, choosing the designated variant.
+     When the function is defined as a single variant, it works as a
+     reinterpret_cast<>. The parenthesized cast syntax works both ways.  */
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    namespace GNULIB_NAMESPACE                                                \
+    {                                                                         \
+      static const struct _gl_ ## func ## _wrapper                            \
+      {                                                                       \
+        typedef rettype (*type) parameters;                                   \
+                                                                              \
+        inline operator type () const                                         \
+        {                                                                     \
+          return reinterpret_cast<type>((rettype2 (*) parameters2)(::func));  \
+        }                                                                     \
+      } func = {};                                                            \
+    }                                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN (func);
+   causes a warning to be emitted when ::func is used but not when
+   GNULIB_NAMESPACE::func is used.  func must be defined without overloaded
+   variants.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN(func) \
+   _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN_1(func,namespace) \
+   _GL_CXXALIASWARN_2 (func, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+    _GL_WARN_ON_USE (func, \
+                     "The symbol ::" #func " refers to the system function. " \
+                     "Use " #namespace "::" #func " instead.")
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     extern __typeof__ (func) func
+# else
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN(func) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
+   causes a warning to be emitted when the given overloaded variant of ::func
+   is used but not when GNULIB_NAMESPACE::func is used.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+   _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
+                        GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
+   _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
+                         "The symbol ::" #func " refers to the system function. " \
+                         "Use " #namespace "::" #func " instead.")
+# else
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+#endif /* _GL_CXXDEFS_H */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+/* A C macro for declaring that specific arguments must not be NULL.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
+   that the values passed as arguments n, ..., m must be non-NULL pointers.
+   n = 1 stands for the first argument, n = 2 for the second argument etc.  */
+#ifndef _GL_ARG_NONNULL
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
+#  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
+# else
+#  define _GL_ARG_NONNULL(params)
+# endif
+#endif
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+/* A C macro for emitting warnings if a function is used.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
+   for FUNCTION which will then trigger a compiler warning containing
+   the text of "literal string" anywhere that function is called, if
+   supported by the compiler.  If the compiler does not support this
+   feature, the macro expands to an unused extern declaration.
+
+   _GL_WARN_ON_USE_ATTRIBUTE ("literal string") expands to the
+   attribute used in _GL_WARN_ON_USE.  If the compiler does not support
+   this feature, it expands to empty.
+
+   These macros are useful for marking a function as a potential
+   portability trap, with the intent that "literal string" include
+   instructions on the replacement function that should be used
+   instead.
+   _GL_WARN_ON_USE is for functions with 'extern' linkage.
+   _GL_WARN_ON_USE_ATTRIBUTE is for functions with 'static' or 'inline'
+   linkage.
+
+   However, one of the reasons that a function is a portability trap is
+   if it has the wrong signature.  Declaring FUNCTION with a different
+   signature in C is a compilation error, so this macro must use the
+   same type as any existing declaration so that programs that avoid
+   the problematic FUNCTION do not fail to compile merely because they
+   included a header that poisoned the function.  But this implies that
+   _GL_WARN_ON_USE is only safe to use if FUNCTION is known to already
+   have a declaration.  Use of this macro implies that there must not
+   be any other macro hiding the declaration of FUNCTION; but
+   undefining FUNCTION first is part of the poisoning process anyway
+   (although for symbols that are provided only via a macro, the result
+   is a compilation error rather than a warning containing
+   "literal string").  Also note that in C++, it is only safe to use if
+   FUNCTION has no overloads.
+
+   For an example, it is possible to poison 'getline' by:
+   - adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
+     [getline]) in configure.ac, which potentially defines
+     HAVE_RAW_DECL_GETLINE
+   - adding this code to a header that wraps the system <stdio.h>:
+     #undef getline
+     #if HAVE_RAW_DECL_GETLINE
+     _GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
+       "not universally present; use the gnulib module getline");
+     #endif
+
+   It is not possible to directly poison global variables.  But it is
+   possible to write a wrapper accessor function, and poison that
+   (less common usage, like &environ, will cause a compilation error
+   rather than issue the nice warning, but the end result of informing
+   the developer about their portability problem is still achieved):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     rpl_environ (void) { return &environ; }
+     _GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   or better (avoiding contradictory use of 'static' and 'extern'):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     _GL_WARN_ON_USE_ATTRIBUTE ("environ is not always properly declared")
+     rpl_environ (void) { return &environ; }
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   */
+#ifndef _GL_WARN_ON_USE
+
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# else /* Unsupported.  */
+#  define _GL_WARN_ON_USE(function, message) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# endif
+#endif
+
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
+   This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
+   not work in this case.  */
+#ifndef _GL_WARN_ON_USE_CXX
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
+# endif
+#endif
+
+/* _GL_WARN_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#ifndef _GL_WARN_EXTERN_C
+# if defined __cplusplus
+#  define _GL_WARN_EXTERN_C extern "C"
+# else
+#  define _GL_WARN_EXTERN_C extern
+# endif
+#endif
+
+
+#if 1
+# if 0
+/* An iconv_open wrapper that supports the IANA standardized encoding names
+   ("ISO-8859-1" etc.) as far as possible.  */
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define iconv_open rpl_iconv_open
+#  endif
+_GL_FUNCDECL_RPL (iconv_open, iconv_t,
+                  (const char *tocode, const char *fromcode)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (iconv_open, iconv_t,
+                  (const char *tocode, const char *fromcode));
+# else
+_GL_CXXALIAS_SYS (iconv_open, iconv_t,
+                  (const char *tocode, const char *fromcode));
+# endif
+_GL_CXXALIASWARN (iconv_open);
+#elif defined GNULIB_POSIXCHECK
+# undef iconv_open
+# if HAVE_RAW_DECL_ICONV_OPEN
+_GL_WARN_ON_USE (iconv_open, "iconv_open is not working correctly everywhere - "
+                 "use gnulib module iconv for portability");
+# endif
+#endif
+
+#if 0
+/* Special constants for supporting UTF-{16,32}{BE,LE} encodings.
+   Not public.  */
+# define _ICONV_UTF8_UTF16BE (iconv_t)(-161)
+# define _ICONV_UTF8_UTF16LE (iconv_t)(-162)
+# define _ICONV_UTF8_UTF32BE (iconv_t)(-163)
+# define _ICONV_UTF8_UTF32LE (iconv_t)(-164)
+# define _ICONV_UTF16BE_UTF8 (iconv_t)(-165)
+# define _ICONV_UTF16LE_UTF8 (iconv_t)(-166)
+# define _ICONV_UTF32BE_UTF8 (iconv_t)(-167)
+# define _ICONV_UTF32LE_UTF8 (iconv_t)(-168)
+#endif
+
+#if 1
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define iconv rpl_iconv
+#  endif
+_GL_FUNCDECL_RPL (iconv, size_t,
+                  (iconv_t cd,
+                    char **restrict inbuf,
+                   size_t *restrict inbytesleft,
+                   char **restrict outbuf, size_t *restrict outbytesleft));
+_GL_CXXALIAS_RPL (iconv, size_t,
+                  (iconv_t cd,
+                    char **restrict inbuf,
+                   size_t *restrict inbytesleft,
+                   char **restrict outbuf, size_t *restrict outbytesleft));
+# else
+/* Need to cast, because on some versions of Solaris, ICONV_CONST does
+   not have the right value for C++.  */
+_GL_CXXALIAS_SYS_CAST (iconv, size_t,
+                       (iconv_t cd,
+                         char **restrict inbuf,
+                        size_t *restrict inbytesleft,
+                        char **restrict outbuf, size_t *restrict outbytesleft));
+# endif
+_GL_CXXALIASWARN (iconv);
+# ifndef ICONV_CONST
+#  define ICONV_CONST 
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef iconv
+# if HAVE_RAW_DECL_ICONV
+_GL_WARN_ON_USE (iconv, "iconv is not working correctly everywhere - "
+                 "use gnulib module iconv for portability");
+# endif
+#endif
+
+#if 1
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define iconv_close rpl_iconv_close
+#  endif
+_GL_FUNCDECL_RPL (iconv_close, int, (iconv_t cd));
+_GL_CXXALIAS_RPL (iconv_close, int, (iconv_t cd));
+# else
+_GL_CXXALIAS_SYS (iconv_close, int, (iconv_t cd));
+# endif
+_GL_CXXALIASWARN (iconv_close);
+#endif
+
+
+#endif /* _GL_ICONV_H */
+#endif /* _GL_ICONV_H */
diff --git a/linux_musl-lib/inttypes.h b/linux_musl-lib/inttypes.h
index 9c46e85..8c933a9 100644
--- a/linux_musl-lib/inttypes.h
+++ b/linux_musl-lib/inttypes.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
-/* Copyright (C) 2006-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2006-2021 Free Software Foundation, Inc.
    Written by Paul Eggert, Bruno Haible, Derek Price.
    This file is part of gnulib.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /*
@@ -39,6 +39,8 @@
 #  endif
 
 #  include_next <inttypes.h>
+
+#  define _GL_FINISHED_INCLUDING_SYSTEM_INTTYPES_H
 # endif
 #endif
 
@@ -63,19 +65,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -210,6 +212,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -235,6 +247,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -332,7 +352,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -360,14 +380,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -381,26 +398,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -409,19 +426,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -497,6 +514,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -509,24 +533,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -550,110 +585,92 @@
 # define _LONG_LONG_FORMAT_PREFIX "ll"
 #endif
 
-#if !defined PRId8 || 0
-# undef PRId8
+#if !defined PRId8
 # ifdef INT8_MAX
 #  define PRId8 "d"
 # endif
 #endif
-#if !defined PRIi8 || 0
-# undef PRIi8
+#if !defined PRIi8
 # ifdef INT8_MAX
 #  define PRIi8 "i"
 # endif
 #endif
-#if !defined PRIo8 || 0
-# undef PRIo8
+#if !defined PRIo8
 # ifdef UINT8_MAX
 #  define PRIo8 "o"
 # endif
 #endif
-#if !defined PRIu8 || 0
-# undef PRIu8
+#if !defined PRIu8
 # ifdef UINT8_MAX
 #  define PRIu8 "u"
 # endif
 #endif
-#if !defined PRIx8 || 0
-# undef PRIx8
+#if !defined PRIx8
 # ifdef UINT8_MAX
 #  define PRIx8 "x"
 # endif
 #endif
-#if !defined PRIX8 || 0
-# undef PRIX8
+#if !defined PRIX8
 # ifdef UINT8_MAX
 #  define PRIX8 "X"
 # endif
 #endif
-#if !defined PRId16 || 0
-# undef PRId16
+#if !defined PRId16
 # ifdef INT16_MAX
 #  define PRId16 "d"
 # endif
 #endif
-#if !defined PRIi16 || 0
-# undef PRIi16
+#if !defined PRIi16
 # ifdef INT16_MAX
 #  define PRIi16 "i"
 # endif
 #endif
-#if !defined PRIo16 || 0
-# undef PRIo16
+#if !defined PRIo16
 # ifdef UINT16_MAX
 #  define PRIo16 "o"
 # endif
 #endif
-#if !defined PRIu16 || 0
-# undef PRIu16
+#if !defined PRIu16
 # ifdef UINT16_MAX
 #  define PRIu16 "u"
 # endif
 #endif
-#if !defined PRIx16 || 0
-# undef PRIx16
+#if !defined PRIx16
 # ifdef UINT16_MAX
 #  define PRIx16 "x"
 # endif
 #endif
-#if !defined PRIX16 || 0
-# undef PRIX16
+#if !defined PRIX16
 # ifdef UINT16_MAX
 #  define PRIX16 "X"
 # endif
 #endif
-#if !defined PRId32 || 0
-# undef PRId32
+#if !defined PRId32
 # ifdef INT32_MAX
 #  define PRId32 "d"
 # endif
 #endif
-#if !defined PRIi32 || 0
-# undef PRIi32
+#if !defined PRIi32
 # ifdef INT32_MAX
 #  define PRIi32 "i"
 # endif
 #endif
-#if !defined PRIo32 || 0
-# undef PRIo32
+#if !defined PRIo32
 # ifdef UINT32_MAX
 #  define PRIo32 "o"
 # endif
 #endif
-#if !defined PRIu32 || 0
-# undef PRIu32
+#if !defined PRIu32
 # ifdef UINT32_MAX
 #  define PRIu32 "u"
 # endif
 #endif
-#if !defined PRIx32 || 0
-# undef PRIx32
+#if !defined PRIx32
 # ifdef UINT32_MAX
 #  define PRIx32 "x"
 # endif
 #endif
-#if !defined PRIX32 || 0
-# undef PRIX32
+#if !defined PRIX32
 # ifdef UINT32_MAX
 #  define PRIX32 "X"
 # endif
@@ -663,15 +680,13 @@
 #  define _PRI64_PREFIX "l"
 # elif defined _MSC_VER || defined __MINGW32__
 #  define _PRI64_PREFIX "I64"
-# elif 1 && LONG_MAX >> 30 == 1
+# elif LONG_MAX >> 30 == 1
 #  define _PRI64_PREFIX _LONG_LONG_FORMAT_PREFIX
 # endif
-# if !defined PRId64 || 0
-#  undef PRId64
+# if !defined PRId64
 #  define PRId64 _PRI64_PREFIX "d"
 # endif
-# if !defined PRIi64 || 0
-#  undef PRIi64
+# if !defined PRIi64
 #  define PRIi64 _PRI64_PREFIX "i"
 # endif
 #endif
@@ -680,266 +695,220 @@
 #  define _PRIu64_PREFIX "l"
 # elif defined _MSC_VER || defined __MINGW32__
 #  define _PRIu64_PREFIX "I64"
-# elif 1 && ULONG_MAX >> 31 == 1
+# elif ULONG_MAX >> 31 == 1
 #  define _PRIu64_PREFIX _LONG_LONG_FORMAT_PREFIX
 # endif
-# if !defined PRIo64 || 0
-#  undef PRIo64
+# if !defined PRIo64
 #  define PRIo64 _PRIu64_PREFIX "o"
 # endif
-# if !defined PRIu64 || 0
-#  undef PRIu64
+# if !defined PRIu64
 #  define PRIu64 _PRIu64_PREFIX "u"
 # endif
-# if !defined PRIx64 || 0
-#  undef PRIx64
+# if !defined PRIx64
 #  define PRIx64 _PRIu64_PREFIX "x"
 # endif
-# if !defined PRIX64 || 0
-#  undef PRIX64
+# if !defined PRIX64
 #  define PRIX64 _PRIu64_PREFIX "X"
 # endif
 #endif
 
-#if !defined PRIdLEAST8 || 0
-# undef PRIdLEAST8
+#if !defined PRIdLEAST8
 # define PRIdLEAST8 "d"
 #endif
-#if !defined PRIiLEAST8 || 0
-# undef PRIiLEAST8
+#if !defined PRIiLEAST8
 # define PRIiLEAST8 "i"
 #endif
-#if !defined PRIoLEAST8 || 0
-# undef PRIoLEAST8
+#if !defined PRIoLEAST8
 # define PRIoLEAST8 "o"
 #endif
-#if !defined PRIuLEAST8 || 0
-# undef PRIuLEAST8
+#if !defined PRIuLEAST8
 # define PRIuLEAST8 "u"
 #endif
-#if !defined PRIxLEAST8 || 0
-# undef PRIxLEAST8
+#if !defined PRIxLEAST8
 # define PRIxLEAST8 "x"
 #endif
-#if !defined PRIXLEAST8 || 0
-# undef PRIXLEAST8
+#if !defined PRIXLEAST8
 # define PRIXLEAST8 "X"
 #endif
-#if !defined PRIdLEAST16 || 0
-# undef PRIdLEAST16
+#if !defined PRIdLEAST16
 # define PRIdLEAST16 "d"
 #endif
-#if !defined PRIiLEAST16 || 0
-# undef PRIiLEAST16
+#if !defined PRIiLEAST16
 # define PRIiLEAST16 "i"
 #endif
-#if !defined PRIoLEAST16 || 0
-# undef PRIoLEAST16
+#if !defined PRIoLEAST16
 # define PRIoLEAST16 "o"
 #endif
-#if !defined PRIuLEAST16 || 0
-# undef PRIuLEAST16
+#if !defined PRIuLEAST16
 # define PRIuLEAST16 "u"
 #endif
-#if !defined PRIxLEAST16 || 0
-# undef PRIxLEAST16
+#if !defined PRIxLEAST16
 # define PRIxLEAST16 "x"
 #endif
-#if !defined PRIXLEAST16 || 0
-# undef PRIXLEAST16
+#if !defined PRIXLEAST16
 # define PRIXLEAST16 "X"
 #endif
-#if !defined PRIdLEAST32 || 0
-# undef PRIdLEAST32
+#if !defined PRIdLEAST32
 # define PRIdLEAST32 "d"
 #endif
-#if !defined PRIiLEAST32 || 0
-# undef PRIiLEAST32
+#if !defined PRIiLEAST32
 # define PRIiLEAST32 "i"
 #endif
-#if !defined PRIoLEAST32 || 0
-# undef PRIoLEAST32
+#if !defined PRIoLEAST32
 # define PRIoLEAST32 "o"
 #endif
-#if !defined PRIuLEAST32 || 0
-# undef PRIuLEAST32
+#if !defined PRIuLEAST32
 # define PRIuLEAST32 "u"
 #endif
-#if !defined PRIxLEAST32 || 0
-# undef PRIxLEAST32
+#if !defined PRIxLEAST32
 # define PRIxLEAST32 "x"
 #endif
-#if !defined PRIXLEAST32 || 0
-# undef PRIXLEAST32
+#if !defined PRIXLEAST32
 # define PRIXLEAST32 "X"
 #endif
 #ifdef INT64_MAX
-# if !defined PRIdLEAST64 || 0
-#  undef PRIdLEAST64
+# if !defined PRIdLEAST64
 #  define PRIdLEAST64 PRId64
 # endif
-# if !defined PRIiLEAST64 || 0
-#  undef PRIiLEAST64
+# if !defined PRIiLEAST64
 #  define PRIiLEAST64 PRIi64
 # endif
 #endif
 #ifdef UINT64_MAX
-# if !defined PRIoLEAST64 || 0
-#  undef PRIoLEAST64
+# if !defined PRIoLEAST64
 #  define PRIoLEAST64 PRIo64
 # endif
-# if !defined PRIuLEAST64 || 0
-#  undef PRIuLEAST64
+# if !defined PRIuLEAST64
 #  define PRIuLEAST64 PRIu64
 # endif
-# if !defined PRIxLEAST64 || 0
-#  undef PRIxLEAST64
+# if !defined PRIxLEAST64
 #  define PRIxLEAST64 PRIx64
 # endif
-# if !defined PRIXLEAST64 || 0
-#  undef PRIXLEAST64
+# if !defined PRIXLEAST64
 #  define PRIXLEAST64 PRIX64
 # endif
 #endif
 
-#if !defined PRIdFAST8 || 0
-# undef PRIdFAST8
+#if !defined PRIdFAST8
 # if INT_FAST8_MAX > INT32_MAX
 #  define PRIdFAST8 PRId64
 # else
 #  define PRIdFAST8 "d"
 # endif
 #endif
-#if !defined PRIiFAST8 || 0
-# undef PRIiFAST8
+#if !defined PRIiFAST8
 # if INT_FAST8_MAX > INT32_MAX
 #  define PRIiFAST8 PRIi64
 # else
 #  define PRIiFAST8 "i"
 # endif
 #endif
-#if !defined PRIoFAST8 || 0
-# undef PRIoFAST8
+#if !defined PRIoFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define PRIoFAST8 PRIo64
 # else
 #  define PRIoFAST8 "o"
 # endif
 #endif
-#if !defined PRIuFAST8 || 0
-# undef PRIuFAST8
+#if !defined PRIuFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define PRIuFAST8 PRIu64
 # else
 #  define PRIuFAST8 "u"
 # endif
 #endif
-#if !defined PRIxFAST8 || 0
-# undef PRIxFAST8
+#if !defined PRIxFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define PRIxFAST8 PRIx64
 # else
 #  define PRIxFAST8 "x"
 # endif
 #endif
-#if !defined PRIXFAST8 || 0
-# undef PRIXFAST8
+#if !defined PRIXFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define PRIXFAST8 PRIX64
 # else
 #  define PRIXFAST8 "X"
 # endif
 #endif
-#if !defined PRIdFAST16 || 0
-# undef PRIdFAST16
+#if !defined PRIdFAST16
 # if INT_FAST16_MAX > INT32_MAX
 #  define PRIdFAST16 PRId64
 # else
 #  define PRIdFAST16 "d"
 # endif
 #endif
-#if !defined PRIiFAST16 || 0
-# undef PRIiFAST16
+#if !defined PRIiFAST16
 # if INT_FAST16_MAX > INT32_MAX
 #  define PRIiFAST16 PRIi64
 # else
 #  define PRIiFAST16 "i"
 # endif
 #endif
-#if !defined PRIoFAST16 || 0
-# undef PRIoFAST16
+#if !defined PRIoFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define PRIoFAST16 PRIo64
 # else
 #  define PRIoFAST16 "o"
 # endif
 #endif
-#if !defined PRIuFAST16 || 0
-# undef PRIuFAST16
+#if !defined PRIuFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define PRIuFAST16 PRIu64
 # else
 #  define PRIuFAST16 "u"
 # endif
 #endif
-#if !defined PRIxFAST16 || 0
-# undef PRIxFAST16
+#if !defined PRIxFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define PRIxFAST16 PRIx64
 # else
 #  define PRIxFAST16 "x"
 # endif
 #endif
-#if !defined PRIXFAST16 || 0
-# undef PRIXFAST16
+#if !defined PRIXFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define PRIXFAST16 PRIX64
 # else
 #  define PRIXFAST16 "X"
 # endif
 #endif
-#if !defined PRIdFAST32 || 0
-# undef PRIdFAST32
+#if !defined PRIdFAST32
 # if INT_FAST32_MAX > INT32_MAX
 #  define PRIdFAST32 PRId64
 # else
 #  define PRIdFAST32 "d"
 # endif
 #endif
-#if !defined PRIiFAST32 || 0
-# undef PRIiFAST32
+#if !defined PRIiFAST32
 # if INT_FAST32_MAX > INT32_MAX
 #  define PRIiFAST32 PRIi64
 # else
 #  define PRIiFAST32 "i"
 # endif
 #endif
-#if !defined PRIoFAST32 || 0
-# undef PRIoFAST32
+#if !defined PRIoFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define PRIoFAST32 PRIo64
 # else
 #  define PRIoFAST32 "o"
 # endif
 #endif
-#if !defined PRIuFAST32 || 0
-# undef PRIuFAST32
+#if !defined PRIuFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define PRIuFAST32 PRIu64
 # else
 #  define PRIuFAST32 "u"
 # endif
 #endif
-#if !defined PRIxFAST32 || 0
-# undef PRIxFAST32
+#if !defined PRIxFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define PRIxFAST32 PRIx64
 # else
 #  define PRIxFAST32 "x"
 # endif
 #endif
-#if !defined PRIXFAST32 || 0
-# undef PRIXFAST32
+#if !defined PRIXFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define PRIXFAST32 PRIX64
 # else
@@ -947,76 +916,64 @@
 # endif
 #endif
 #ifdef INT64_MAX
-# if !defined PRIdFAST64 || 0
-#  undef PRIdFAST64
+# if !defined PRIdFAST64
 #  define PRIdFAST64 PRId64
 # endif
-# if !defined PRIiFAST64 || 0
-#  undef PRIiFAST64
+# if !defined PRIiFAST64
 #  define PRIiFAST64 PRIi64
 # endif
 #endif
 #ifdef UINT64_MAX
-# if !defined PRIoFAST64 || 0
-#  undef PRIoFAST64
+# if !defined PRIoFAST64
 #  define PRIoFAST64 PRIo64
 # endif
-# if !defined PRIuFAST64 || 0
-#  undef PRIuFAST64
+# if !defined PRIuFAST64
 #  define PRIuFAST64 PRIu64
 # endif
-# if !defined PRIxFAST64 || 0
-#  undef PRIxFAST64
+# if !defined PRIxFAST64
 #  define PRIxFAST64 PRIx64
 # endif
-# if !defined PRIXFAST64 || 0
-#  undef PRIXFAST64
+# if !defined PRIXFAST64
 #  define PRIXFAST64 PRIX64
 # endif
 #endif
 
-#if !defined PRIdMAX || 0
-# undef PRIdMAX
+#if !defined PRIdMAX
 # if 1
 #  define PRIdMAX PRId64
 # else
 #  define PRIdMAX "ld"
 # endif
 #endif
-#if !defined PRIiMAX || 0
-# undef PRIiMAX
+#if !defined PRIiMAX
 # if 1
 #  define PRIiMAX PRIi64
 # else
 #  define PRIiMAX "li"
 # endif
 #endif
-#if !defined PRIoMAX || 0
-# undef PRIoMAX
+#if !defined PRIoMAX
 # if 1
 #  define PRIoMAX PRIo64
 # else
 #  define PRIoMAX "lo"
 # endif
 #endif
-#if !defined PRIuMAX || 0
-# undef PRIuMAX
+#if !defined PRIuMAX
 # if 1
 #  define PRIuMAX PRIu64
 # else
 #  define PRIuMAX "lu"
 # endif
 #endif
-#if !defined PRIxMAX || 0
-# undef PRIxMAX
+#if !defined PRIxMAX
 # if 1
 #  define PRIxMAX PRIx64
 # else
 #  define PRIxMAX "lx"
 # endif
 #endif
-#if !defined PRIXMAX || 0
-# undef PRIXMAX
+#if !defined PRIXMAX
 # if 1
 #  define PRIXMAX PRIX64
 # else
@@ -1024,129 +981,108 @@
 # endif
 #endif
 
-#if !defined PRIdPTR || 0
-# undef PRIdPTR
+#if !defined PRIdPTR
 # ifdef INTPTR_MAX
 #  define PRIdPTR "l" "d"
 # endif
 #endif
-#if !defined PRIiPTR || 0
-# undef PRIiPTR
+#if !defined PRIiPTR
 # ifdef INTPTR_MAX
 #  define PRIiPTR "l" "i"
 # endif
 #endif
-#if !defined PRIoPTR || 0
-# undef PRIoPTR
+#if !defined PRIoPTR
 # ifdef UINTPTR_MAX
 #  define PRIoPTR "l" "o"
 # endif
 #endif
-#if !defined PRIuPTR || 0
-# undef PRIuPTR
+#if !defined PRIuPTR
 # ifdef UINTPTR_MAX
 #  define PRIuPTR "l" "u"
 # endif
 #endif
-#if !defined PRIxPTR || 0
-# undef PRIxPTR
+#if !defined PRIxPTR
 # ifdef UINTPTR_MAX
 #  define PRIxPTR "l" "x"
 # endif
 #endif
-#if !defined PRIXPTR || 0
-# undef PRIXPTR
+#if !defined PRIXPTR
 # ifdef UINTPTR_MAX
 #  define PRIXPTR "l" "X"
 # endif
 #endif
 
-#if !defined SCNd8 || 0
-# undef SCNd8
+#if !defined SCNd8
 # ifdef INT8_MAX
 #  define SCNd8 "hhd"
 # endif
 #endif
-#if !defined SCNi8 || 0
-# undef SCNi8
+#if !defined SCNi8
 # ifdef INT8_MAX
 #  define SCNi8 "hhi"
 # endif
 #endif
-#if !defined SCNo8 || 0
-# undef SCNo8
+#if !defined SCNo8
 # ifdef UINT8_MAX
 #  define SCNo8 "hho"
 # endif
 #endif
-#if !defined SCNu8 || 0
-# undef SCNu8
+#if !defined SCNu8
 # ifdef UINT8_MAX
 #  define SCNu8 "hhu"
 # endif
 #endif
-#if !defined SCNx8 || 0
-# undef SCNx8
+#if !defined SCNx8
 # ifdef UINT8_MAX
 #  define SCNx8 "hhx"
 # endif
 #endif
-#if !defined SCNd16 || 0
-# undef SCNd16
+#if !defined SCNd16
 # ifdef INT16_MAX
 #  define SCNd16 "hd"
 # endif
 #endif
-#if !defined SCNi16 || 0
-# undef SCNi16
+#if !defined SCNi16
 # ifdef INT16_MAX
 #  define SCNi16 "hi"
 # endif
 #endif
-#if !defined SCNo16 || 0
-# undef SCNo16
+#if !defined SCNo16
 # ifdef UINT16_MAX
 #  define SCNo16 "ho"
 # endif
 #endif
-#if !defined SCNu16 || 0
-# undef SCNu16
+#if !defined SCNu16
 # ifdef UINT16_MAX
 #  define SCNu16 "hu"
 # endif
 #endif
-#if !defined SCNx16 || 0
-# undef SCNx16
+#if !defined SCNx16
 # ifdef UINT16_MAX
 #  define SCNx16 "hx"
 # endif
 #endif
-#if !defined SCNd32 || 0
-# undef SCNd32
+#if !defined SCNd32
 # ifdef INT32_MAX
 #  define SCNd32 "d"
 # endif
 #endif
-#if !defined SCNi32 || 0
-# undef SCNi32
+#if !defined SCNi32
 # ifdef INT32_MAX
 #  define SCNi32 "i"
 # endif
 #endif
-#if !defined SCNo32 || 0
-# undef SCNo32
+#if !defined SCNo32
 # ifdef UINT32_MAX
 #  define SCNo32 "o"
 # endif
 #endif
-#if !defined SCNu32 || 0
-# undef SCNu32
+#if !defined SCNu32
 # ifdef UINT32_MAX
 #  define SCNu32 "u"
 # endif
 #endif
-#if !defined SCNx32 || 0
-# undef SCNx32
+#if !defined SCNx32
 # ifdef UINT32_MAX
 #  define SCNx32 "x"
 # endif
@@ -1156,15 +1092,13 @@
 #  define _SCN64_PREFIX "l"
 # elif defined _MSC_VER || defined __MINGW32__
 #  define _SCN64_PREFIX "I64"
-# elif 1 && LONG_MAX >> 30 == 1
+# elif LONG_MAX >> 30 == 1
 #  define _SCN64_PREFIX _LONG_LONG_FORMAT_PREFIX
 # endif
-# if !defined SCNd64 || 0
-#  undef SCNd64
+# if !defined SCNd64
 #  define SCNd64 _SCN64_PREFIX "d"
 # endif
-# if !defined SCNi64 || 0
-#  undef SCNi64
+# if !defined SCNi64
 #  define SCNi64 _SCN64_PREFIX "i"
 # endif
 #endif
@@ -1173,110 +1107,86 @@
 #  define _SCNu64_PREFIX "l"
 # elif defined _MSC_VER || defined __MINGW32__
 #  define _SCNu64_PREFIX "I64"
-# elif 1 && ULONG_MAX >> 31 == 1
+# elif ULONG_MAX >> 31 == 1
 #  define _SCNu64_PREFIX _LONG_LONG_FORMAT_PREFIX
 # endif
-# if !defined SCNo64 || 0
-#  undef SCNo64
+# if !defined SCNo64
 #  define SCNo64 _SCNu64_PREFIX "o"
 # endif
-# if !defined SCNu64 || 0
-#  undef SCNu64
+# if !defined SCNu64
 #  define SCNu64 _SCNu64_PREFIX "u"
 # endif
-# if !defined SCNx64 || 0
-#  undef SCNx64
+# if !defined SCNx64
 #  define SCNx64 _SCNu64_PREFIX "x"
 # endif
 #endif
 
-#if !defined SCNdLEAST8 || 0
-# undef SCNdLEAST8
+#if !defined SCNdLEAST8
 # define SCNdLEAST8 "hhd"
 #endif
-#if !defined SCNiLEAST8 || 0
-# undef SCNiLEAST8
+#if !defined SCNiLEAST8
 # define SCNiLEAST8 "hhi"
 #endif
-#if !defined SCNoLEAST8 || 0
-# undef SCNoLEAST8
+#if !defined SCNoLEAST8
 # define SCNoLEAST8 "hho"
 #endif
-#if !defined SCNuLEAST8 || 0
-# undef SCNuLEAST8
+#if !defined SCNuLEAST8
 # define SCNuLEAST8 "hhu"
 #endif
-#if !defined SCNxLEAST8 || 0
-# undef SCNxLEAST8
+#if !defined SCNxLEAST8
 # define SCNxLEAST8 "hhx"
 #endif
-#if !defined SCNdLEAST16 || 0
-# undef SCNdLEAST16
+#if !defined SCNdLEAST16
 # define SCNdLEAST16 "hd"
 #endif
-#if !defined SCNiLEAST16 || 0
-# undef SCNiLEAST16
+#if !defined SCNiLEAST16
 # define SCNiLEAST16 "hi"
 #endif
-#if !defined SCNoLEAST16 || 0
-# undef SCNoLEAST16
+#if !defined SCNoLEAST16
 # define SCNoLEAST16 "ho"
 #endif
-#if !defined SCNuLEAST16 || 0
-# undef SCNuLEAST16
+#if !defined SCNuLEAST16
 # define SCNuLEAST16 "hu"
 #endif
-#if !defined SCNxLEAST16 || 0
-# undef SCNxLEAST16
+#if !defined SCNxLEAST16
 # define SCNxLEAST16 "hx"
 #endif
-#if !defined SCNdLEAST32 || 0
-# undef SCNdLEAST32
+#if !defined SCNdLEAST32
 # define SCNdLEAST32 "d"
 #endif
-#if !defined SCNiLEAST32 || 0
-# undef SCNiLEAST32
+#if !defined SCNiLEAST32
 # define SCNiLEAST32 "i"
 #endif
-#if !defined SCNoLEAST32 || 0
-# undef SCNoLEAST32
+#if !defined SCNoLEAST32
 # define SCNoLEAST32 "o"
 #endif
-#if !defined SCNuLEAST32 || 0
-# undef SCNuLEAST32
+#if !defined SCNuLEAST32
 # define SCNuLEAST32 "u"
 #endif
-#if !defined SCNxLEAST32 || 0
-# undef SCNxLEAST32
+#if !defined SCNxLEAST32
 # define SCNxLEAST32 "x"
 #endif
 #ifdef INT64_MAX
-# if !defined SCNdLEAST64 || 0
-#  undef SCNdLEAST64
+# if !defined SCNdLEAST64
 #  define SCNdLEAST64 SCNd64
 # endif
-# if !defined SCNiLEAST64 || 0
-#  undef SCNiLEAST64
+# if !defined SCNiLEAST64
 #  define SCNiLEAST64 SCNi64
 # endif
 #endif
 #ifdef UINT64_MAX
-# if !defined SCNoLEAST64 || 0
-#  undef SCNoLEAST64
+# if !defined SCNoLEAST64
 #  define SCNoLEAST64 SCNo64
 # endif
-# if !defined SCNuLEAST64 || 0
-#  undef SCNuLEAST64
+# if !defined SCNuLEAST64
 #  define SCNuLEAST64 SCNu64
 # endif
-# if !defined SCNxLEAST64 || 0
-#  undef SCNxLEAST64
+# if !defined SCNxLEAST64
 #  define SCNxLEAST64 SCNx64
 # endif
 #endif
 
-#if !defined SCNdFAST8 || 0
-# undef SCNdFAST8
+#if !defined SCNdFAST8
 # if INT_FAST8_MAX > INT32_MAX
 #  define SCNdFAST8 SCNd64
 # elif INT_FAST8_MAX == 0x7fff
@@ -1287,8 +1197,7 @@
 #  define SCNdFAST8 "d"
 # endif
 #endif
-#if !defined SCNiFAST8 || 0
-# undef SCNiFAST8
+#if !defined SCNiFAST8
 # if INT_FAST8_MAX > INT32_MAX
 #  define SCNiFAST8 SCNi64
 # elif INT_FAST8_MAX == 0x7fff
@@ -1299,8 +1208,7 @@
 #  define SCNiFAST8 "i"
 # endif
 #endif
-#if !defined SCNoFAST8 || 0
-# undef SCNoFAST8
+#if !defined SCNoFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define SCNoFAST8 SCNo64
 # elif UINT_FAST8_MAX == 0xffff
@@ -1311,8 +1219,7 @@
 #  define SCNoFAST8 "o"
 # endif
 #endif
-#if !defined SCNuFAST8 || 0
-# undef SCNuFAST8
+#if !defined SCNuFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define SCNuFAST8 SCNu64
 # elif UINT_FAST8_MAX == 0xffff
@@ -1323,8 +1230,7 @@
 #  define SCNuFAST8 "u"
 # endif
 #endif
-#if !defined SCNxFAST8 || 0
-# undef SCNxFAST8
+#if !defined SCNxFAST8
 # if UINT_FAST8_MAX > UINT32_MAX
 #  define SCNxFAST8 SCNx64
 # elif UINT_FAST8_MAX == 0xffff
@@ -1335,8 +1241,7 @@
 #  define SCNxFAST8 "x"
 # endif
 #endif
-#if !defined SCNdFAST16 || 0
-# undef SCNdFAST16
+#if !defined SCNdFAST16
 # if INT_FAST16_MAX > INT32_MAX
 #  define SCNdFAST16 SCNd64
 # elif INT_FAST16_MAX == 0x7fff
@@ -1345,8 +1250,7 @@
 #  define SCNdFAST16 "d"
 # endif
 #endif
-#if !defined SCNiFAST16 || 0
-# undef SCNiFAST16
+#if !defined SCNiFAST16
 # if INT_FAST16_MAX > INT32_MAX
 #  define SCNiFAST16 SCNi64
 # elif INT_FAST16_MAX == 0x7fff
@@ -1355,8 +1259,7 @@
 #  define SCNiFAST16 "i"
 # endif
 #endif
-#if !defined SCNoFAST16 || 0
-# undef SCNoFAST16
+#if !defined SCNoFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define SCNoFAST16 SCNo64
 # elif UINT_FAST16_MAX == 0xffff
@@ -1365,8 +1268,7 @@
 #  define SCNoFAST16 "o"
 # endif
 #endif
-#if !defined SCNuFAST16 || 0
-# undef SCNuFAST16
+#if !defined SCNuFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define SCNuFAST16 SCNu64
 # elif UINT_FAST16_MAX == 0xffff
@@ -1375,8 +1277,7 @@
 #  define SCNuFAST16 "u"
 # endif
 #endif
-#if !defined SCNxFAST16 || 0
-# undef SCNxFAST16
+#if !defined SCNxFAST16
 # if UINT_FAST16_MAX > UINT32_MAX
 #  define SCNxFAST16 SCNx64
 # elif UINT_FAST16_MAX == 0xffff
@@ -1385,40 +1286,35 @@
 #  define SCNxFAST16 "x"
 # endif
 #endif
-#if !defined SCNdFAST32 || 0
-# undef SCNdFAST32
+#if !defined SCNdFAST32
 # if INT_FAST32_MAX > INT32_MAX
 #  define SCNdFAST32 SCNd64
 # else
 #  define SCNdFAST32 "d"
 # endif
 #endif
-#if !defined SCNiFAST32 || 0
-# undef SCNiFAST32
+#if !defined SCNiFAST32
 # if INT_FAST32_MAX > INT32_MAX
 #  define SCNiFAST32 SCNi64
 # else
 #  define SCNiFAST32 "i"
 # endif
 #endif
-#if !defined SCNoFAST32 || 0
-# undef SCNoFAST32
+#if !defined SCNoFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define SCNoFAST32 SCNo64
 # else
 #  define SCNoFAST32 "o"
 # endif
 #endif
-#if !defined SCNuFAST32 || 0
-# undef SCNuFAST32
+#if !defined SCNuFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define SCNuFAST32 SCNu64
 # else
 #  define SCNuFAST32 "u"
 # endif
 #endif
-#if !defined SCNxFAST32 || 0
-# undef SCNxFAST32
+#if !defined SCNxFAST32
 # if UINT_FAST32_MAX > UINT32_MAX
 #  define SCNxFAST32 SCNx64
 # else
@@ -1426,64 +1322,54 @@
 # endif
 #endif
 #ifdef INT64_MAX
-# if !defined SCNdFAST64 || 0
-#  undef SCNdFAST64
+# if !defined SCNdFAST64
 #  define SCNdFAST64 SCNd64
 # endif
-# if !defined SCNiFAST64 || 0
-#  undef SCNiFAST64
+# if !defined SCNiFAST64
 #  define SCNiFAST64 SCNi64
 # endif
 #endif
 #ifdef UINT64_MAX
-# if !defined SCNoFAST64 || 0
-#  undef SCNoFAST64
+# if !defined SCNoFAST64
 #  define SCNoFAST64 SCNo64
 # endif
-# if !defined SCNuFAST64 || 0
-#  undef SCNuFAST64
+# if !defined SCNuFAST64
 #  define SCNuFAST64 SCNu64
 # endif
-# if !defined SCNxFAST64 || 0
-#  undef SCNxFAST64
+# if !defined SCNxFAST64
 #  define SCNxFAST64 SCNx64
 # endif
 #endif
 
-#if !defined SCNdMAX || 0
-# undef SCNdMAX
+#if !defined SCNdMAX
 # if 1
 #  define SCNdMAX SCNd64
 # else
 #  define SCNdMAX "ld"
 # endif
 #endif
-#if !defined SCNiMAX || 0
-# undef SCNiMAX
+#if !defined SCNiMAX
 # if 1
 #  define SCNiMAX SCNi64
 # else
 #  define SCNiMAX "li"
 # endif
 #endif
-#if !defined SCNoMAX || 0
-# undef SCNoMAX
+#if !defined SCNoMAX
 # if 1
 #  define SCNoMAX SCNo64
 # else
 #  define SCNoMAX "lo"
 # endif
 #endif
-#if !defined SCNuMAX || 0
-# undef SCNuMAX
+#if !defined SCNuMAX
 # if 1
 #  define SCNuMAX SCNu64
 # else
 #  define SCNuMAX "lu"
 # endif
 #endif
-#if !defined SCNxMAX || 0
-# undef SCNxMAX
+#if !defined SCNxMAX
 # if 1
 #  define SCNxMAX SCNx64
 # else
@@ -1491,32 +1377,27 @@
 # endif
 #endif
 
-#if !defined SCNdPTR || 0
-# undef SCNdPTR
+#if !defined SCNdPTR
 # ifdef INTPTR_MAX
 #  define SCNdPTR "l" "d"
 # endif
 #endif
-#if !defined SCNiPTR || 0
-# undef SCNiPTR
+#if !defined SCNiPTR
 # ifdef INTPTR_MAX
 #  define SCNiPTR "l" "i"
 # endif
 #endif
-#if !defined SCNoPTR || 0
-# undef SCNoPTR
+#if !defined SCNoPTR
 # ifdef UINTPTR_MAX
 #  define SCNoPTR "l" "o"
 # endif
 #endif
-#if !defined SCNuPTR || 0
-# undef SCNuPTR
+#if !defined SCNuPTR
 # ifdef UINTPTR_MAX
 #  define SCNuPTR "l" "u"
 # endif
 #endif
-#if !defined SCNxPTR || 0
-# undef SCNxPTR
+#if !defined SCNxPTR
 # ifdef UINTPTR_MAX
 #  define SCNxPTR "l" "x"
 # endif
@@ -1565,15 +1446,19 @@
 #   define strtoimax rpl_strtoimax
 #  endif
 _GL_FUNCDECL_RPL (strtoimax, intmax_t,
-                  (const char *, char **, int) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtoimax, intmax_t, (const char *, char **, int));
+                  (const char *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoimax, intmax_t,
+                  (const char *restrict, char **restrict, int));
 # else
 #  if !1
 #   undef strtoimax
 _GL_FUNCDECL_SYS (strtoimax, intmax_t,
-                  (const char *, char **, int) _GL_ARG_NONNULL ((1)));
+                  (const char *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (strtoimax, intmax_t, (const char *, char **, int));
+_GL_CXXALIAS_SYS (strtoimax, intmax_t,
+                  (const char *restrict, char **restrict, int));
 # endif
 _GL_CXXALIASWARN (strtoimax);
 #elif defined GNULIB_POSIXCHECK
@@ -1591,15 +1476,19 @@
 #   define strtoumax rpl_strtoumax
 #  endif
 _GL_FUNCDECL_RPL (strtoumax, uintmax_t,
-                  (const char *, char **, int) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtoumax, uintmax_t, (const char *, char **, int));
+                  (const char *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoumax, uintmax_t,
+                  (const char *restrict, char **restrict, int));
 # else
 #  if !1
 #   undef strtoumax
 _GL_FUNCDECL_SYS (strtoumax, uintmax_t,
-                  (const char *, char **, int) _GL_ARG_NONNULL ((1)));
+                  (const char *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (strtoumax, uintmax_t, (const char *, char **, int));
+_GL_CXXALIAS_SYS (strtoumax, uintmax_t,
+                  (const char *restrict, char **restrict, int));
 # endif
 _GL_CXXALIASWARN (strtoumax);
 #elif defined GNULIB_POSIXCHECK
diff --git a/linux_musl-lib/limits.h b/linux_musl-lib/limits.h
index 6fea064..bf2dca2 100644
--- a/linux_musl-lib/limits.h
+++ b/linux_musl-lib/limits.h
@@ -1,31 +1,47 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <limits.h>.
 
-   Copyright 2016-2019 Free Software Foundation, Inc.
+   Copyright 2016-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License
-   as published by the Free Software Foundation; either version 3, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
-
-#ifndef _GL_LIMITS_H
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 #pragma GCC system_header
 #endif
 
 
-/* The include_next requires a split double-inclusion guard.  */
+#if defined _GL_ALREADY_INCLUDING_LIMITS_H
+/* Special invocation convention:
+   On Haiku/x86_64, we have a sequence of nested includes
+   <limits.h> -> <syslimits.h> -> <limits.h>.
+   In this situation, LONG_MAX and INT_MAX are not yet defined,
+   therefore we should not attempt to define LONG_BIT.  */
+
 #include_next <limits.h>
 
+#else
+/* Normal invocation convention.  */
+
+#ifndef _GL_LIMITS_H
+
+# define _GL_ALREADY_INCLUDING_LIMITS_H
+
+/* The include_next requires a split double-inclusion guard.  */
+# include_next <limits.h>
+
+# undef _GL_ALREADY_INCLUDING_LIMITS_H
+
 #ifndef _GL_LIMITS_H
 #define _GL_LIMITS_H
 
@@ -84,10 +100,11 @@
 # endif
 #endif
 
-/* Macros specified by ISO/IEC TS 18661-1:2014.  */
+/* Macros specified by C2x and by ISO/IEC TS 18661-1:2014.  */
 
 #if (! defined ULLONG_WIDTH                                             \
-     && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__))
+     && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__ \
+         || (defined __STDC_VERSION__ && 201710 < __STDC_VERSION__)))
 # define CHAR_WIDTH _GL_INTEGER_WIDTH (CHAR_MIN, CHAR_MAX)
 # define SCHAR_WIDTH _GL_INTEGER_WIDTH (SCHAR_MIN, SCHAR_MAX)
 # define UCHAR_WIDTH _GL_INTEGER_WIDTH (0, UCHAR_MAX)
@@ -99,7 +116,17 @@
 # define ULONG_WIDTH _GL_INTEGER_WIDTH (0, ULONG_MAX)
 # define LLONG_WIDTH _GL_INTEGER_WIDTH (LLONG_MIN, LLONG_MAX)
 # define ULLONG_WIDTH _GL_INTEGER_WIDTH (0, ULLONG_MAX)
-#endif /* !ULLONG_WIDTH && (_GNU_SOURCE || __STDC_WANT_IEC_60559_BFP_EXT__) */
+#endif
+
+/* Macros specified by C2x.  */
+
+#if (! defined BOOL_WIDTH \
+     && (defined _GNU_SOURCE \
+         || (defined __STDC_VERSION__ && 201710 < __STDC_VERSION__)))
+# define BOOL_MAX 1
+# define BOOL_WIDTH 1
+#endif
 
 #endif /* _GL_LIMITS_H */
 #endif /* _GL_LIMITS_H */
+#endif
diff --git a/linux_musl-lib/malloc/scratch_buffer.gl.h b/linux_musl-lib/malloc/scratch_buffer.gl.h
new file mode 100644
index 0000000..1870f8e
--- /dev/null
+++ b/linux_musl-lib/malloc/scratch_buffer.gl.h
@@ -0,0 +1,148 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Variable-sized buffer with on-stack default allocation.
+   Copyright (C) 2015-2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _SCRATCH_BUFFER_H
+#define _SCRATCH_BUFFER_H
+
+/* Scratch buffers with a default stack allocation and fallback to
+   heap allocation.  It is expected that this function is used in this
+   way:
+
+     struct scratch_buffer tmpbuf;
+     scratch_buffer_init (&tmpbuf);
+
+     while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
+       if (!scratch_buffer_grow (&tmpbuf))
+	 return -1;
+
+     scratch_buffer_free (&tmpbuf);
+     return 0;
+
+   The allocation functions (scratch_buffer_grow,
+   scratch_buffer_grow_preserve, scratch_buffer_set_array_size) make
+   sure that the heap allocation, if any, is freed, so that the code
+   above does not have a memory leak.  The buffer still remains in a
+   state that can be deallocated using scratch_buffer_free, so a loop
+   like this is valid as well:
+
+     struct scratch_buffer tmpbuf;
+     scratch_buffer_init (&tmpbuf);
+
+     while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
+       if (!scratch_buffer_grow (&tmpbuf))
+	 break;
+
+     scratch_buffer_free (&tmpbuf);
+
+   scratch_buffer_grow and scratch_buffer_grow_preserve are guaranteed
+   to grow the buffer by at least 512 bytes.  This means that when
+   using the scratch buffer as a backing store for a non-character
+   array whose element size, in bytes, is 512 or smaller, the scratch
+   buffer only has to grow once to make room for at least one more
+   element.
+*/
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+/* Scratch buffer.  Must be initialized with scratch_buffer_init
+   before its use.  */
+struct scratch_buffer {
+  void *data;    /* Pointer to the beginning of the scratch area.  */
+  size_t length; /* Allocated space at the data pointer, in bytes.  */
+  union { max_align_t __align; char __c[1024]; } __space;
+};
+
+/* Initializes *BUFFER so that BUFFER->data points to BUFFER->__space
+   and BUFFER->length reflects the available space.  */
+static inline void
+scratch_buffer_init (struct scratch_buffer *buffer)
+{
+  buffer->data = buffer->__space.__c;
+  buffer->length = sizeof (buffer->__space);
+}
+
+/* Deallocates *BUFFER (if it was heap-allocated).  */
+static inline void
+scratch_buffer_free (struct scratch_buffer *buffer)
+{
+  if (buffer->data != buffer->__space.__c)
+    free (buffer->data);
+}
+
+/* Grow *BUFFER by some arbitrary amount.  The buffer contents is NOT
+   preserved.  Return true on success, false on allocation failure (in
+   which case the old buffer is freed).  On success, the new buffer is
+   larger than the previous size.  On failure, *BUFFER is deallocated,
+   but remains in a free-able state, and errno is set.  */
+bool __libc_scratch_buffer_grow (struct scratch_buffer *buffer);
+
+/* Alias for __libc_scratch_buffer_grow.  */
+static inline _GL_ATTRIBUTE_ALWAYS_INLINE bool
+scratch_buffer_grow (struct scratch_buffer *buffer)
+{
+  return _GL_LIKELY (__libc_scratch_buffer_grow (buffer));
+}
+
+/* Like __libc_scratch_buffer_grow, but preserve the old buffer
+   contents on success, as a prefix of the new buffer.  */
+bool __libc_scratch_buffer_grow_preserve (struct scratch_buffer *buffer);
+
+/* Alias for __libc_scratch_buffer_grow_preserve.  */
+static inline _GL_ATTRIBUTE_ALWAYS_INLINE bool
+scratch_buffer_grow_preserve (struct scratch_buffer *buffer)
+{
+  return _GL_LIKELY (__libc_scratch_buffer_grow_preserve (buffer));
+}
+
+/* Grow *BUFFER so that it can store at least NELEM elements of SIZE
+   bytes.  The buffer contents are NOT preserved.  Both NELEM and SIZE
+   can be zero.  Return true on success, false on allocation failure
+   (in which case the old buffer is freed, but *BUFFER remains in a
+   free-able state, and errno is set).  It is unspecified whether this
+   function can reduce the array size.  */
+bool __libc_scratch_buffer_set_array_size (struct scratch_buffer *buffer,
+					   size_t nelem, size_t size);
+
+/* Alias for __libc_scratch_set_array_size.  */
+static inline _GL_ATTRIBUTE_ALWAYS_INLINE bool
+scratch_buffer_set_array_size (struct scratch_buffer *buffer,
+			       size_t nelem, size_t size)
+{
+  return _GL_LIKELY (__libc_scratch_buffer_set_array_size
+			 (buffer, nelem, size));
+}
+
+/* Return a copy of *BUFFER's first SIZE bytes as a heap-allocated block,
+   deallocating *BUFFER if it was heap-allocated.  SIZE must be at
+   most *BUFFER's size.  Return NULL (setting errno) on memory
+   exhaustion.  */
+void *__libc_scratch_buffer_dupfree (struct scratch_buffer *buffer,
+                                     size_t size);
+
+/* Alias for __libc_scratch_dupfree.  */
+static inline _GL_ATTRIBUTE_ALWAYS_INLINE void *
+scratch_buffer_dupfree (struct scratch_buffer *buffer, size_t size)
+{
+  void *r = __libc_scratch_buffer_dupfree (buffer, size);
+  return _GL_LIKELY (r != NULL) ? r : NULL;
+}
+
+#endif /* _SCRATCH_BUFFER_H */
diff --git a/linux_musl-lib/math.h b/linux_musl-lib/math.h
index d2a223a..f879672 100644
--- a/linux_musl-lib/math.h
+++ b/linux_musl-lib/math.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <math.h>.
 
-   Copyright (C) 2002-2003, 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002-2003, 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_MATH_H
@@ -23,9 +23,24 @@
 #endif
 
 
-/* The include_next requires a split double-inclusion guard.  */
+#if defined _GL_INCLUDING_MATH_H
+/* Special invocation convention:
+   - On FreeBSD 12.2 we have a sequence of nested includes
+     <math.h> -> <stdlib.h> -> <sys/wait.h> -> <sys/types.h> -> <sys/select.h>
+       -> <signal.h> -> <pthread.h> -> <stdlib.h> -> <math.h>
+     In this situation, the functions are not yet declared, therefore we cannot
+     provide the C++ aliases.  */
+
 #include_next <math.h>
 
+#else
+/* Normal invocation convention.  */
+
+/* The include_next requires a split double-inclusion guard.  */
+#define _GL_INCLUDING_MATH_H
+#include_next <math.h>
+#undef _GL_INCLUDING_MATH_H
+
 #ifndef _GL_MATH_H
 #define _GL_MATH_H
 
@@ -42,21 +57,31 @@
 # define _GL_MATH_INLINE _GL_INLINE
 #endif
 
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The attribute __const__ was added in gcc 2.95.  */
+#ifndef _GL_ATTRIBUTE_CONST
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) || defined __clang__
+#  define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
+# else
+#  define _GL_ATTRIBUTE_CONST /* empty */
+# endif
+#endif
+
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -191,6 +216,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -216,6 +251,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -313,7 +356,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -341,14 +384,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -362,26 +402,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -390,19 +430,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -478,6 +518,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -490,24 +537,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -729,7 +787,9 @@
 _GL_FUNCDECL_SYS (acosl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (acosl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (acosl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef acosl
 # if HAVE_RAW_DECL_ACOSL
@@ -769,7 +829,9 @@
 _GL_FUNCDECL_SYS (asinl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (asinl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (asinl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef asinl
 # if HAVE_RAW_DECL_ASINL
@@ -809,7 +871,9 @@
 _GL_FUNCDECL_SYS (atanl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (atanl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (atanl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef atanl
 # if HAVE_RAW_DECL_ATANL
@@ -873,7 +937,7 @@
 # endif
 _GL_CXXALIAS_SYS (cbrt, double, (double x));
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (cbrt);
+_GL_CXXALIASWARN1 (cbrt, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef cbrt
@@ -943,7 +1007,7 @@
 _GL_CXXALIAS_SYS (ceil, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (ceil);
+_GL_CXXALIASWARN1 (ceil, double, (double x));
 # endif
 #endif
 
@@ -962,7 +1026,9 @@
 #  endif
 _GL_CXXALIAS_SYS (ceill, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (ceill);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef ceill
 # if HAVE_RAW_DECL_CEILL
@@ -974,6 +1040,7 @@
 
 #if 0
 # if !1
+#  undef copysignf
 _GL_FUNCDECL_SYS (copysignf, float, (float x, float y));
 # endif
 _GL_CXXALIAS_SYS (copysignf, float, (float x, float y));
@@ -992,7 +1059,7 @@
 # endif
 _GL_CXXALIAS_SYS (copysign, double, (double x, double y));
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (copysign);
+_GL_CXXALIASWARN1 (copysign, double, (double x, double y));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef copysign
@@ -1047,7 +1114,9 @@
 _GL_FUNCDECL_SYS (cosl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (cosl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (cosl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef cosl
 # if HAVE_RAW_DECL_COSL
@@ -1121,7 +1190,9 @@
 #  endif
 _GL_CXXALIAS_SYS (expl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (expl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef expl
 # if HAVE_RAW_DECL_EXPL
@@ -1160,7 +1231,7 @@
 _GL_CXXALIAS_SYS (exp2, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (exp2);
+_GL_CXXALIASWARN1 (exp2, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef exp2
@@ -1233,7 +1304,7 @@
 _GL_CXXALIAS_SYS (expm1, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (expm1);
+_GL_CXXALIASWARN1 (expm1, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef expm1
@@ -1276,7 +1347,9 @@
 _GL_FUNCDECL_SYS (fabsf, float, (float x));
 # endif
 _GL_CXXALIAS_SYS (fabsf, float, (float x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fabsf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef fabsf
 # if HAVE_RAW_DECL_FABSF
@@ -1300,7 +1373,9 @@
 #  endif
 _GL_CXXALIAS_SYS (fabsl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fabsl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef fabsl
 # if HAVE_RAW_DECL_FABSL
@@ -1346,7 +1421,7 @@
 _GL_CXXALIAS_SYS (floor, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (floor);
+_GL_CXXALIASWARN1 (floor, double, (double x));
 # endif
 #endif
 
@@ -1365,7 +1440,9 @@
 #  endif
 _GL_CXXALIAS_SYS (floorl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (floorl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef floorl
 # if HAVE_RAW_DECL_FLOORL
@@ -1385,6 +1462,7 @@
 _GL_CXXALIAS_RPL (fmaf, float, (float x, float y, float z));
 # else
 #  if !1
+#   undef fmaf
 _GL_FUNCDECL_SYS (fmaf, float, (float x, float y, float z));
 #  endif
 _GL_CXXALIAS_SYS (fmaf, float, (float x, float y, float z));
@@ -1408,12 +1486,13 @@
 _GL_CXXALIAS_RPL (fma, double, (double x, double y, double z));
 # else
 #  if !1
+#   undef fma
 _GL_FUNCDECL_SYS (fma, double, (double x, double y, double z));
 #  endif
 _GL_CXXALIAS_SYS (fma, double, (double x, double y, double z));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fma);
+_GL_CXXALIASWARN1 (fma, double, (double x, double y, double z));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef fma
@@ -1490,7 +1569,7 @@
 _GL_CXXALIAS_SYS (fmod, double, (double x, double y));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fmod);
+_GL_CXXALIASWARN1 (fmod, double, (double x, double y));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef fmod
@@ -1515,7 +1594,9 @@
 #  endif
 _GL_CXXALIAS_SYS (fmodl, long double, (long double x, long double y));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fmodl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef fmodl
 # if HAVE_RAW_DECL_FMODL
@@ -1547,7 +1628,9 @@
 #  endif
 _GL_CXXALIAS_SYS (frexpf, float, (float x, int *expptr));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (frexpf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef frexpf
 # if HAVE_RAW_DECL_FREXPF
@@ -1609,7 +1692,9 @@
 # endif
 #endif
 #if 1 && !(0 && !1)
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (frexpl);
+# endif
 #endif
 #if !1 && defined GNULIB_POSIXCHECK
 # undef frexpl
@@ -1635,7 +1720,9 @@
 #  endif
 _GL_CXXALIAS_SYS (hypotf, float, (float x, float y));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (hypotf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef hypotf
 # if HAVE_RAW_DECL_HYPOTF
@@ -1657,7 +1744,7 @@
 _GL_CXXALIAS_SYS (hypot, double, (double x, double y));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (hypot);
+_GL_CXXALIASWARN1 (hypot, double, (double x, double y));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef hypot
@@ -1682,7 +1769,9 @@
 #  endif
 _GL_CXXALIAS_SYS (hypotl, long double, (long double x, long double y));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (hypotl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef hypotl
 # if HAVE_RAW_DECL_HYPOTL
@@ -1730,7 +1819,7 @@
 _GL_CXXALIAS_SYS (ilogb, int, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (ilogb);
+_GL_CXXALIASWARN1 (ilogb, int, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef ilogb
@@ -1750,6 +1839,7 @@
 _GL_CXXALIAS_RPL (ilogbl, int, (long double x));
 # else
 #  if !1
+#   undef ilogbl
 _GL_FUNCDECL_SYS (ilogbl, int, (long double x));
 #  endif
 _GL_CXXALIAS_SYS (ilogbl, int, (long double x));
@@ -1764,6 +1854,55 @@
 #endif
 
 
+#if 1
+/* On native Windows, map 'j0' to '_j0', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::j0 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef j0
+#   define j0 _j0
+#  endif
+_GL_CXXALIAS_MDA (j0, double, (double x));
+# else
+_GL_CXXALIAS_SYS (j0, double, (double x));
+# endif
+_GL_CXXALIASWARN (j0);
+#endif
+
+#if 1
+/* On native Windows, map 'j1' to '_j1', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::j1 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef j1
+#   define j1 _j1
+#  endif
+_GL_CXXALIAS_MDA (j1, double, (double x));
+# else
+_GL_CXXALIAS_SYS (j1, double, (double x));
+# endif
+_GL_CXXALIASWARN (j1);
+#endif
+
+#if 1
+/* On native Windows, map 'jn' to '_jn', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::jn always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef jn
+#   define jn _jn
+#  endif
+_GL_CXXALIAS_MDA (jn, double, (int n, double x));
+# else
+_GL_CXXALIAS_SYS (jn, double, (int n, double x));
+# endif
+_GL_CXXALIASWARN (jn);
+#endif
+
+
 /* Return x * 2^exp.  */
 #if 0
 # if !1
@@ -1771,7 +1910,9 @@
 _GL_FUNCDECL_SYS (ldexpf, float, (float x, int exp));
 # endif
 _GL_CXXALIAS_SYS (ldexpf, float, (float x, int exp));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (ldexpf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef ldexpf
 # if HAVE_RAW_DECL_LDEXPF
@@ -1797,7 +1938,9 @@
 # endif
 #endif
 #if 1
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (ldexpl);
+# endif
 #endif
 #if !1 && defined GNULIB_POSIXCHECK
 # undef ldexpl
@@ -1844,7 +1987,7 @@
 _GL_CXXALIAS_SYS (log, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log);
+_GL_CXXALIASWARN1 (log, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef log
@@ -1869,7 +2012,9 @@
 #  endif
 _GL_CXXALIAS_SYS (logl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (logl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef logl
 # if HAVE_RAW_DECL_LOGL
@@ -1915,7 +2060,7 @@
 _GL_CXXALIAS_SYS (log10, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log10);
+_GL_CXXALIASWARN1 (log10, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef log10
@@ -1940,7 +2085,9 @@
 #  endif
 _GL_CXXALIAS_SYS (log10l, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (log10l);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef log10l
 # if HAVE_RAW_DECL_LOG10L
@@ -1988,7 +2135,7 @@
 _GL_CXXALIAS_SYS (log1p, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log1p);
+_GL_CXXALIASWARN1 (log1p, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef log1p
@@ -2062,7 +2209,7 @@
 _GL_CXXALIAS_SYS (log2, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log2);
+_GL_CXXALIASWARN1 (log2, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef log2
@@ -2134,7 +2281,7 @@
 _GL_CXXALIAS_SYS (logb, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (logb);
+_GL_CXXALIASWARN1 (logb, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef logb
@@ -2204,7 +2351,7 @@
 _GL_CXXALIAS_SYS (modf, double, (double x, double *iptr));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (modf);
+_GL_CXXALIASWARN1 (modf, double, (double x, double *iptr));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef modf
@@ -2231,7 +2378,9 @@
 #  endif
 _GL_CXXALIAS_SYS (modfl, long double, (long double x, long double *iptr));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (modfl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef modfl
 # if HAVE_RAW_DECL_MODFL
@@ -2295,7 +2444,7 @@
 _GL_CXXALIAS_SYS (remainder, double, (double x, double y));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (remainder);
+_GL_CXXALIASWARN1 (remainder, double, (double x, double y));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef remainder
@@ -2352,7 +2501,7 @@
 # endif
 _GL_CXXALIAS_SYS (rint, double, (double x));
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (rint);
+_GL_CXXALIASWARN1 (rint, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef rint
@@ -2424,7 +2573,7 @@
 _GL_CXXALIAS_SYS (round, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (round);
+_GL_CXXALIASWARN1 (round, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef round
@@ -2471,7 +2620,7 @@
 _GL_CXXALIAS_RPL (sinf, float, (float x));
 # else
 #  if !1
- #  undef sinf
+#   undef sinf
 _GL_FUNCDECL_SYS (sinf, float, (float x));
 #  endif
 _GL_CXXALIAS_SYS (sinf, float, (float x));
@@ -2491,7 +2640,9 @@
 _GL_FUNCDECL_SYS (sinl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (sinl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (sinl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef sinl
 # if HAVE_RAW_DECL_SINL
@@ -2565,7 +2716,9 @@
 #  endif
 _GL_CXXALIAS_SYS (sqrtl, long double, (long double x));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (sqrtl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef sqrtl
 # if HAVE_RAW_DECL_SQRTL
@@ -2605,7 +2758,9 @@
 _GL_FUNCDECL_SYS (tanl, long double, (long double x));
 # endif
 _GL_CXXALIAS_SYS (tanl, long double, (long double x));
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (tanl);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef tanl
 # if HAVE_RAW_DECL_TANL
@@ -2678,7 +2833,7 @@
 _GL_CXXALIAS_SYS (trunc, double, (double x));
 # endif
 # if __GLIBC__ >= 2
-_GL_CXXALIASWARN (trunc);
+_GL_CXXALIASWARN1 (trunc, double, (double x));
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef trunc
@@ -2712,6 +2867,55 @@
 #endif
 
 
+#if 1
+/* On native Windows, map 'y0' to '_y0', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::y0 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef y0
+#   define y0 _y0
+#  endif
+_GL_CXXALIAS_MDA (y0, double, (double x));
+# else
+_GL_CXXALIAS_SYS (y0, double, (double x));
+# endif
+_GL_CXXALIASWARN (y0);
+#endif
+
+#if 1
+/* On native Windows, map 'y1' to '_y1', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::y1 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef y1
+#   define y1 _y1
+#  endif
+_GL_CXXALIAS_MDA (y1, double, (double x));
+# else
+_GL_CXXALIAS_SYS (y1, double, (double x));
+# endif
+_GL_CXXALIASWARN (y1);
+#endif
+
+#if 1
+/* On native Windows, map 'yn' to '_yn', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::yn always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef yn
+#   define yn _yn
+#  endif
+_GL_CXXALIAS_MDA (yn, double, (int n, double x));
+# else
+_GL_CXXALIAS_SYS (yn, double, (int n, double x));
+# endif
+_GL_CXXALIASWARN (yn);
+#endif
+
+
 /* Definitions of function-like macros come here, after the function
    declarations.  */
 
@@ -2731,7 +2935,7 @@
 #  if defined isfinite || defined GNULIB_NAMESPACE
 _GL_MATH_CXX_REAL_FLOATING_DECL_1 (isfinite)
 #   undef isfinite
-#   if __GNUC__ >= 6 || (defined __clang__ && !defined _AIX)
+#   if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || defined _AIX || (defined _WIN32 && !defined __CYGWIN__)))
   /* This platform's <cmath> possibly defines isfinite through a set of inline
      functions.  */
 _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isfinite, rpl_isfinite, bool)
@@ -2765,7 +2969,7 @@
 #  if defined isinf || defined GNULIB_NAMESPACE
 _GL_MATH_CXX_REAL_FLOATING_DECL_1 (isinf)
 #   undef isinf
-#   if __GNUC__ >= 6 || defined __clang__
+#   if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || (defined _WIN32 && !defined __CYGWIN__)))
   /* This platform's <cmath> possibly defines isinf through a set of inline
      functions.  */
 _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isinf, rpl_isinf, bool)
@@ -2786,13 +2990,14 @@
 
 #if 1
 /* Test for NaN for 'float' numbers.  */
-# if 0
+# if 1
 /* The original <math.h> included above provides a declaration of isnan macro
    or (older) isnanf function.  */
-#  if __GNUC__ >= 4
-    /* GCC 4.0 and newer provides three built-ins for isnan.  */
+#  if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+    /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
+       GCC >= 4.0 also provides __builtin_isnanf, but clang doesn't.  */
 #   undef isnanf
-#   define isnanf(x) __builtin_isnanf ((float)(x))
+#   define isnanf(x) __builtin_isnan ((float)(x))
 #  elif defined isnan
 #   undef isnanf
 #   define isnanf(x) isnan ((float)(x))
@@ -2812,8 +3017,8 @@
 # if 1
 /* The original <math.h> included above provides a declaration of isnan
    macro.  */
-#  if __GNUC__ >= 4
-    /* GCC 4.0 and newer provides three built-ins for isnan.  */
+#  if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+    /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.  */
 #   undef isnand
 #   define isnand(x) __builtin_isnan ((double)(x))
 #  else
@@ -2830,13 +3035,14 @@
 
 #if 1
 /* Test for NaN for 'long double' numbers.  */
-# if 0
+# if 1
 /* The original <math.h> included above provides a declaration of isnan
    macro or (older) isnanl function.  */
-#  if __GNUC__ >= 4
-    /* GCC 4.0 and newer provides three built-ins for isnan.  */
+#  if (__GNUC__ >= 4) || (__clang_major__ >= 4)
+    /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
+       GCC >= 4.0 also provides __builtin_isnanl, but clang doesn't.  */
 #   undef isnanl
-#   define isnanl(x) __builtin_isnanl ((long double)(x))
+#   define isnanl(x) __builtin_isnan ((long double)(x))
 #  elif defined isnan
 #   undef isnanl
 #   define isnanl(x) isnan ((long double)(x))
@@ -2851,25 +3057,25 @@
 
 /* This must come *after* the snippets for GNULIB_ISNANF and GNULIB_ISNANL!  */
 #if 1
-# if 1
+# if 0
 /* We can't just use the isnanf macro (e.g.) as exposed by
    isnanf.h (e.g.) here, because those may end up being macros
    that recursively expand back to isnan.  So use the gnulib
    replacements for them directly. */
-#  if 0 && __GNUC__ >= 4
-#   define gl_isnan_f(x) __builtin_isnanf ((float)(x))
+#  if 1 && (__GNUC__ >= 4) || (__clang_major__ >= 4)
+#   define gl_isnan_f(x) __builtin_isnan ((float)(x))
 #  else
 _GL_EXTERN_C int rpl_isnanf (float x);
 #   define gl_isnan_f(x) rpl_isnanf (x)
 #  endif
-#  if 1 && __GNUC__ >= 4
+#  if 1 && (__GNUC__ >= 4) || (__clang_major__ >= 4)
 #   define gl_isnan_d(x) __builtin_isnan ((double)(x))
 #  else
 _GL_EXTERN_C int rpl_isnand (double x);
 #   define gl_isnan_d(x) rpl_isnand (x)
 #  endif
-#  if 0 && __GNUC__ >= 4
-#   define gl_isnan_l(x) __builtin_isnanl ((long double)(x))
+#  if 1 && (__GNUC__ >= 4) || (__clang_major__ >= 4)
+#   define gl_isnan_l(x) __builtin_isnan ((long double)(x))
 #  else
 _GL_EXTERN_C int rpl_isnanl (long double x) _GL_ATTRIBUTE_CONST;
 #   define gl_isnan_l(x) rpl_isnanl (x)
@@ -2879,18 +3085,18 @@
    (sizeof (x) == sizeof (long double) ? gl_isnan_l (x) : \
     sizeof (x) == sizeof (double) ? gl_isnan_d (x) : \
     gl_isnan_f (x))
-# elif __GNUC__ >= 4
+# elif (__GNUC__ >= 4) || (__clang_major__ >= 4)
 #  undef isnan
 #  define isnan(x) \
-   (sizeof (x) == sizeof (long double) ? __builtin_isnanl ((long double)(x)) : \
+   (sizeof (x) == sizeof (long double) ? __builtin_isnan ((long double)(x)) : \
     sizeof (x) == sizeof (double) ? __builtin_isnan ((double)(x)) : \
-    __builtin_isnanf ((float)(x)))
+    __builtin_isnan ((float)(x)))
 # endif
 # ifdef __cplusplus
 #  if defined isnan || defined GNULIB_NAMESPACE
 _GL_MATH_CXX_REAL_FLOATING_DECL_1 (isnan)
 #   undef isnan
-#   if __GNUC__ >= 6 || defined __clang__
+#   if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__ && __clang_major__ < 12) || (defined __FreeBSD__ && __clang_major__ < 7) || defined __OpenBSD__ || (defined _WIN32 && !defined __CYGWIN__)))
   /* This platform's <cmath> possibly defines isnan through a set of inline
      functions.  */
 _GL_MATH_CXX_REAL_FLOATING_DECL_2 (isnan, rpl_isnan, bool)
@@ -2918,7 +3124,7 @@
 # if (1 \
       && (!defined __cplusplus || __cplusplus < 201103))
 #  undef signbit
-   /* GCC 4.0 and newer provides three built-ins for signbit.  */
+   /* GCC >= 4.0 and clang provide three built-ins for signbit.  */
 #  define signbit(x) \
    (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
     sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
@@ -2929,7 +3135,7 @@
 _GL_EXTERN_C int gl_signbitf (float arg);
 _GL_EXTERN_C int gl_signbitd (double arg);
 _GL_EXTERN_C int gl_signbitl (long double arg);
-#  if __GNUC__ >= 2 && !defined __STRICT_ANSI__
+#  if (__GNUC__ >= 2 || defined __clang__) && !defined __STRICT_ANSI__
 #   define _GL_NUM_UINT_WORDS(type) \
       ((sizeof (type) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
 #   if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT && !defined gl_signbitf
@@ -2973,7 +3179,7 @@
 #  if defined signbit || defined GNULIB_NAMESPACE
 _GL_MATH_CXX_REAL_FLOATING_DECL_1 (signbit)
 #   undef signbit
-#   if __GNUC__ >= 6 || (defined __clang__ && !defined _AIX)
+#   if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || defined _AIX || (defined _WIN32 && !defined __CYGWIN__)))
   /* This platform's <cmath> possibly defines signbit through a set of inline
      functions.  */
 _GL_MATH_CXX_REAL_FLOATING_DECL_2 (signbit, rpl_signbit, bool)
@@ -2994,4 +3200,5 @@
 _GL_INLINE_HEADER_END
 
 #endif /* _GL_MATH_H */
+#endif /* _GL_INCLUDING_MATH_H */
 #endif /* _GL_MATH_H */
diff --git a/linux_musl-lib/sched.h b/linux_musl-lib/sched.h
index 0f277ba..9936111 100644
--- a/linux_musl-lib/sched.h
+++ b/linux_musl-lib/sched.h
@@ -1,18 +1,18 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <sched.h>.
-   Copyright (C) 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_SCHED_H
@@ -24,7 +24,7 @@
 
 /* The include_next requires a split double-inclusion guard.  */
 #if 1
-# if 0
+# if 1
 #  include <sys/cdefs.h>
 # endif
 # include_next <sched.h>
@@ -51,19 +51,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -198,6 +198,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -223,6 +233,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -320,7 +338,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -348,14 +366,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -369,19 +384,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -457,6 +472,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -469,24 +491,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -532,7 +565,9 @@
 #  endif
 _GL_CXXALIAS_SYS (sched_yield, int, (void));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (sched_yield);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef sched_yield
 # if HAVE_RAW_DECL_SCHED_YIELD
diff --git a/linux_musl-lib/signal.h b/linux_musl-lib/signal.h
index 2784a60..7ec43df 100644
--- a/linux_musl-lib/signal.h
+++ b/linux_musl-lib/signal.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <signal.h>.
 
-   Copyright (C) 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
@@ -56,32 +56,32 @@
 #ifndef _GL_SIGNAL_H
 #define _GL_SIGNAL_H
 
-/* Mac OS X 10.3, FreeBSD 6.4, OpenBSD 3.8, OSF/1 4.0, Solaris 2.6, Android
-   declare pthread_sigmask in <pthread.h>, not in <signal.h>.
+/* Mac OS X 10.3, FreeBSD 6.4, OpenBSD 3.8, OSF/1 4.0, Solaris 2.6, Android,
+   OS/2 kLIBC declare pthread_sigmask in <pthread.h>, not in <signal.h>.
    But avoid namespace pollution on glibc systems.*/
 #if (0 || defined GNULIB_POSIXCHECK) \
     && ((defined __APPLE__ && defined __MACH__) \
         || defined __FreeBSD__ || defined __OpenBSD__ || defined __osf__ \
-        || defined __sun || defined __ANDROID__) \
+        || defined __sun || defined __ANDROID__ || defined __KLIBC__) \
     && ! defined __GLIBC__
 # include <pthread.h>
 #endif
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -216,6 +216,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -241,6 +251,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -338,7 +356,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -366,14 +384,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -387,26 +402,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -415,19 +430,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -503,6 +518,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -515,24 +537,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -607,16 +640,24 @@
 #   define pthread_sigmask rpl_pthread_sigmask
 #  endif
 _GL_FUNCDECL_RPL (pthread_sigmask, int,
-                  (int how, const sigset_t *new_mask, sigset_t *old_mask));
+                  (int how,
+                   const sigset_t *restrict new_mask,
+                   sigset_t *restrict old_mask));
 _GL_CXXALIAS_RPL (pthread_sigmask, int,
-                  (int how, const sigset_t *new_mask, sigset_t *old_mask));
+                  (int how,
+                   const sigset_t *restrict new_mask,
+                   sigset_t *restrict old_mask));
 # else
 #  if !(1 || defined pthread_sigmask)
 _GL_FUNCDECL_SYS (pthread_sigmask, int,
-                  (int how, const sigset_t *new_mask, sigset_t *old_mask));
+                  (int how,
+                   const sigset_t *restrict new_mask,
+                   sigset_t *restrict old_mask));
 #  endif
 _GL_CXXALIAS_SYS (pthread_sigmask, int,
-                  (int how, const sigset_t *new_mask, sigset_t *old_mask));
+                  (int how,
+                   const sigset_t *restrict new_mask,
+                   sigset_t *restrict old_mask));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (pthread_sigmask);
@@ -769,10 +810,14 @@
 #  define SIG_SETMASK 1  /* blocked_set = *set; */
 #  define SIG_UNBLOCK 2  /* blocked_set = blocked_set & ~*set; */
 _GL_FUNCDECL_SYS (sigprocmask, int,
-                  (int operation, const sigset_t *set, sigset_t *old_set));
+                  (int operation,
+                   const sigset_t *restrict set,
+                   sigset_t *restrict old_set));
 # endif
 _GL_CXXALIAS_SYS (sigprocmask, int,
-                  (int operation, const sigset_t *set, sigset_t *old_set));
+                  (int operation,
+                   const sigset_t *restrict set,
+                   sigset_t *restrict old_set));
 _GL_CXXALIASWARN (sigprocmask);
 
 /* Install the handler FUNC for signal SIG, and return the previous
@@ -796,6 +841,12 @@
 _GL_CXXALIAS_RPL (signal, _gl_function_taking_int_returning_void_t,
                   (int sig, _gl_function_taking_int_returning_void_t func));
 # else
+/* On OpenBSD, the declaration of 'signal' may not be present at this point,
+   because it occurs in <sys/signal.h>, not <signal.h> directly.  */
+#  if defined __OpenBSD__
+_GL_FUNCDECL_SYS (signal, _gl_function_taking_int_returning_void_t,
+                  (int sig, _gl_function_taking_int_returning_void_t func));
+#  endif
 _GL_CXXALIAS_SYS (signal, _gl_function_taking_int_returning_void_t,
                   (int sig, _gl_function_taking_int_returning_void_t func));
 # endif
diff --git a/linux_musl-lib/spawn.h b/linux_musl-lib/spawn.h
index 80a7e69..22fa987 100644
--- a/linux_musl-lib/spawn.h
+++ b/linux_musl-lib/spawn.h
@@ -1,31 +1,48 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Definitions for POSIX spawn interface.
-   Copyright (C) 2000, 2003-2004, 2008-2019 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2003-2004, 2008-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
-#ifndef _GL_SPAWN_H
-
 #if __GNUC__ >= 3
 #pragma GCC system_header
 #endif
 
 
+#if defined _GL_ALREADY_INCLUDING_SPAWN_H
+/* Special invocation convention:
+   On OS/2 kLIBC, <spawn.h> includes <signal.h>. Then <signal.h> ->
+   <pthread.h> -> <sched.h> -> <spawn.h> are included by GNULIB.
+   In this situation, struct sched_param is not yet defined.  */
+
+#include_next <spawn.h>
+
+#else
+
+#ifndef _GL_SPAWN_H
+/* Normal invocation convention.  */
+
 /* The include_next requires a split double-inclusion guard.  */
 #if 1
+
+# define _GL_ALREADY_INCLUDING_SPAWN_H
+
 # include_next <spawn.h>
+
+# define _GL_ALREADY_INCLUDING_SPAWN_H
+
 #endif
 
 #ifndef _GL_SPAWN_H
@@ -44,28 +61,35 @@
 # define __THROW
 #endif
 
-/* GCC 2.95 and later have "__restrict"; C99 compilers have
+/* For plain 'restrict', use glibc's __restrict if defined.
+   Otherwise, GCC 2.95 and later have "__restrict"; C99 compilers have
    "restrict", and "configure" may have defined "restrict".
    Other compilers use __restrict, __restrict__, and _Restrict, and
    'configure' might #define 'restrict' to those words, so pick a
    different name.  */
 #ifndef _Restrict_
-# if 199901L <= __STDC_VERSION__
-#  define _Restrict_ restrict
-# elif 2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)
+# if defined __restrict \
+     || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+     || __clang_major__ >= 3
 #  define _Restrict_ __restrict
+# elif 199901L <= __STDC_VERSION__ || defined restrict
+#  define _Restrict_ restrict
 # else
 #  define _Restrict_
 # endif
 #endif
-/* gcc 3.1 and up support the [restrict] syntax.  Don't trust
-   sys/cdefs.h's definition of __restrict_arr, though, as it
-   mishandles gcc -ansi -pedantic.  */
+/* For the ISO C99 syntax
+     array_name[restrict]
+   use glibc's __restrict_arr if available.
+   Otherwise, GCC 3.1 and clang support this syntax (but not in C++ mode).
+   Other ISO C99 compilers support it as well.  */
 #ifndef _Restrict_arr_
-# if ((199901L <= __STDC_VERSION__                                      \
-       || ((3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__))     \
-           && !defined __STRICT_ANSI__))                                        \
-      && !defined __GNUG__)
+# ifdef __restrict_arr
+#  define _Restrict_arr_ __restrict_arr
+# elif ((199901L <= __STDC_VERSION__ \
+         || 3 < __GNUC__ + (1 <= __GNUC_MINOR__) \
+         || __clang_major__ >= 3) \
+        && !defined __cplusplus)
 #  define _Restrict_arr_ _Restrict_
 # else
 #  define _Restrict_arr_
@@ -74,19 +98,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -221,6 +245,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -246,6 +280,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -343,7 +385,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -371,14 +413,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -392,26 +431,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -420,19 +459,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -508,6 +547,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -520,24 +566,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -640,7 +697,7 @@
 #endif
 
 
-#if 0
+#if 1
 /* Spawn a new process executing PATH with the attributes describes in *ATTRP.
    Before running the process perform the actions described in FILE-ACTIONS.
 
@@ -1024,7 +1081,7 @@
 # endif
 #endif
 
-#if 0
+#if 1
 /* Store process group ID in the attribute structure.  */
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
@@ -1078,7 +1135,9 @@
                   (const posix_spawnattr_t *_Restrict_ __attr,
                    int *_Restrict_ __schedpolicy));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (posix_spawnattr_getschedpolicy);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef posix_spawnattr_getschedpolicy
 # if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSCHEDPOLICY
@@ -1108,7 +1167,9 @@
 _GL_CXXALIAS_SYS (posix_spawnattr_setschedpolicy, int,
                   (posix_spawnattr_t *__attr, int __schedpolicy));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (posix_spawnattr_setschedpolicy);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef posix_spawnattr_setschedpolicy
 # if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSCHEDPOLICY
@@ -1142,7 +1203,9 @@
                   (const posix_spawnattr_t *_Restrict_ __attr,
                    struct sched_param *_Restrict_ __schedparam));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (posix_spawnattr_getschedparam);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef posix_spawnattr_getschedparam
 # if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSCHEDPARAM
@@ -1176,7 +1239,9 @@
                   (posix_spawnattr_t *_Restrict_ __attr,
                    const struct sched_param *_Restrict_ __schedparam));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (posix_spawnattr_setschedparam);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef posix_spawnattr_setschedparam
 # if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSCHEDPARAM
@@ -1291,7 +1356,7 @@
 #if 1
 /* Add an action to FILE-ACTIONS which tells the implementation to call
    'close' for the given file descriptor during the 'spawn' call.  */
-# if 1
+# if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawn_file_actions_addclose rpl_posix_spawn_file_actions_addclose
 #  endif
@@ -1358,7 +1423,7 @@
 # endif
 #endif
 
-#if 0
+#if 1
 /* Add an action to FILE-ACTIONS which tells the implementation to call
    'chdir' to the given directory during the 'spawn' call.  */
 # if 0
@@ -1373,7 +1438,7 @@
                   (posix_spawn_file_actions_t *_Restrict_ __file_actions,
                    const char *_Restrict_ __path));
 # else
-#  if !1
+#  if !0
 _GL_FUNCDECL_SYS (posix_spawn_file_actions_addchdir, int,
                   (posix_spawn_file_actions_t *_Restrict_ __file_actions,
                    const char *_Restrict_ __path)
@@ -1431,3 +1496,4 @@
 
 #endif /* _GL_SPAWN_H */
 #endif /* _GL_SPAWN_H */
+#endif
diff --git a/linux_musl-lib/stdint.h b/linux_musl-lib/stdint.h
index b0af07f..1735ed5 100644
--- a/linux_musl-lib/stdint.h
+++ b/linux_musl-lib/stdint.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
-/* Copyright (C) 2001-2002, 2004-2019 Free Software Foundation, Inc.
+/* Copyright (C) 2001-2002, 2004-2021 Free Software Foundation, Inc.
    Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood.
    This file is part of gnulib.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /*
  * ISO C 99 <stdint.h> for platforms that lack it.
@@ -189,7 +189,7 @@
 typedef __int64 gl_int64_t;
 #   define int64_t gl_int64_t
 #   define GL_INT64_T
-#  elif 1
+#  else
 #   undef int64_t
 typedef long long int gl_int64_t;
 #   define int64_t gl_int64_t
@@ -210,7 +210,7 @@
 typedef unsigned __int64 gl_uint64_t;
 #   define uint64_t gl_uint64_t
 #   define GL_UINT64_T
-#  elif 1
+#  else
 #   undef uint64_t
 typedef unsigned long long int gl_uint64_t;
 #   define uint64_t gl_uint64_t
@@ -303,12 +303,11 @@
 /* kLIBC's <stdint.h> defines _INTPTR_T_DECLARED and needs its own
    definitions of intptr_t and uintptr_t (which use int and unsigned)
    to avoid clashes with declarations of system functions like sbrk.
-   Similarly, mingw 5.22 <crtdefs.h> defines _INTPTR_T_DEFINED and
-   _UINTPTR_T_DEFINED and needs its own definitions of intptr_t and
+   Similarly, MinGW WSL-5.4.1 <stdint.h> needs its own intptr_t and
    uintptr_t to avoid conflicting declarations of system functions like
    _findclose in <io.h>.  */
 # if !((defined __KLIBC__ && defined _INTPTR_T_DECLARED) \
-       || (defined __MINGW32__ && defined _INTPTR_T_DEFINED && defined _UINTPTR_T_DEFINED))
+       || defined __MINGW32__)
 #  undef intptr_t
 #  undef uintptr_t
 #  ifdef _WIN64
@@ -334,7 +333,7 @@
 # ifndef INTMAX_MAX
 #  undef INTMAX_C
 #  undef intmax_t
-#  if 1 && LONG_MAX >> 30 == 1
+#  if LONG_MAX >> 30 == 1
 typedef long long int gl_intmax_t;
 #   define intmax_t gl_intmax_t
 #  elif defined GL_INT64_T
@@ -348,7 +347,7 @@
 # ifndef UINTMAX_MAX
 #  undef UINTMAX_C
 #  undef uintmax_t
-#  if 1 && ULONG_MAX >> 31 == 1
+#  if ULONG_MAX >> 31 == 1
 typedef unsigned long long int gl_uintmax_t;
 #   define uintmax_t gl_uintmax_t
 #  elif defined GL_UINT64_T
@@ -581,11 +580,6 @@
    <wchar.h> -> <stdio.h> -> <getopt.h> -> <stdlib.h>, and the latter includes
    <stdint.h> and assumes its types are already defined.  */
 # if 1 && ! (defined WCHAR_MIN && defined WCHAR_MAX)
-  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-     included before <wchar.h>.  */
-#  include <stddef.h>
-#  include <stdio.h>
-#  include <time.h>
 #  define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
 #  include <wchar.h>
 #  undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
@@ -648,21 +642,21 @@
 #  define INT64_C(x) x##L
 # elif defined _MSC_VER
 #  define INT64_C(x) x##i64
-# elif 1
+# else
 #  define INT64_C(x) x##LL
 # endif
 # if ULONG_MAX >> 31 >> 31 >> 1 == 1
 #  define UINT64_C(x) x##UL
 # elif defined _MSC_VER
 #  define UINT64_C(x) x##ui64
-# elif 1
+# else
 #  define UINT64_C(x) x##ULL
 # endif
 
 /* 7.18.4.2. Macros for greatest-width integer constants */
 
 # ifndef INTMAX_C
-#  if 1 && LONG_MAX >> 30 == 1
+#  if LONG_MAX >> 30 == 1
 #   define INTMAX_C(x)   x##LL
 #  elif defined GL_INT64_T
 #   define INTMAX_C(x)   INT64_C(x)
@@ -672,7 +666,7 @@
 # endif
 
 # ifndef UINTMAX_C
-#  if 1 && ULONG_MAX >> 31 == 1
+#  if ULONG_MAX >> 31 == 1
 #   define UINTMAX_C(x)  x##ULL
 #  elif defined GL_UINT64_T
 #   define UINTMAX_C(x)  UINT64_C(x)
diff --git a/linux_musl-lib/stdio.h b/linux_musl-lib/stdio.h
index e200742..295eaff 100644
--- a/linux_musl-lib/stdio.h
+++ b/linux_musl-lib/stdio.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <stdio.h>.
 
-   Copyright (C) 2004, 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 #pragma GCC system_header
@@ -57,61 +57,6 @@
    May also define off_t to a 64-bit type on native Windows.  */
 #include <sys/types.h>
 
-/* The __attribute__ feature is available in gcc versions 2.5 and later.
-   The __-protected variants of the attributes 'format' and 'printf' are
-   accepted by gcc versions 2.6.4 (effectively 2.7) and later.
-   We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
-   gnulib and libintl do '#define printf __printf__' when they override
-   the 'printf' function.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
-# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
-#else
-# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_PRINTF
-   indicates to GCC that the function takes a format string and arguments,
-   where the format string directives are the ones standardized by ISO C99
-   and POSIX.  */
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
-# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
-   _GL_ATTRIBUTE_FORMAT ((__gnu_printf__, formatstring_parameter, first_argument))
-#else
-# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
-   _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF,
-   except that it indicates to GCC that the supported format string directives
-   are the ones of the system printf(), rather than the ones standardized by
-   ISO C99 and POSIX.  */
-#if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
-# define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
-  _GL_ATTRIBUTE_FORMAT_PRINTF (formatstring_parameter, first_argument)
-#else
-# define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
-  _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_SCANF
-   indicates to GCC that the function takes a format string and arguments,
-   where the format string directives are the ones standardized by ISO C99
-   and POSIX.  */
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
-# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
-   _GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument))
-#else
-# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
-   _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF,
-   except that it indicates to GCC that the supported format string directives
-   are the ones of the system scanf(), rather than the ones standardized by
-   ISO C99 and POSIX.  */
-#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \
-  _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
-
 /* Solaris 10 and NetBSD 7.0 declare renameat in <unistd.h>, not in <stdio.h>.  */
 /* But in any case avoid namespace pollution on glibc systems.  */
 #if (0 || defined GNULIB_POSIXCHECK) && (defined __sun || defined __NetBSD__) \
@@ -147,21 +92,103 @@
 #endif
 
 
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.  */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if __GNUC__ >= 11
+#  define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+#  define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The __-protected variants of the attributes 'format' and 'printf' are
+   accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+   We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
+   gnulib and libintl do '#define printf __printf__' when they override
+   the 'printf' function.  */
+#ifndef _GL_ATTRIBUTE_FORMAT
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || defined __clang__
+#  define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+# else
+#  define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
+# endif
+#endif
+
+/* An __attribute__ __format__ specifier for a function that takes a format
+   string and arguments, where the format string directives are the ones
+   standardized by ISO C99 and POSIX.
+   _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD  */
+/* __gnu_printf__ is supported in GCC >= 4.4.  */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __gnu_printf__
+#else
+# define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __printf__
+#endif
+
+/* An __attribute__ __format__ specifier for a function that takes a format
+   string and arguments, where the format string directives are the ones of the
+   system printf(), rather than the ones standardized by ISO C99 and POSIX.
+   _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM  */
+/* On mingw, Gnulib sets __USE_MINGW_ANSI_STDIO in order to get closer to
+   the standards.  The macro GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU indicates
+   whether this change is effective.  On older mingw, it is not.  */
+#if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
+# define _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD
+#else
+# define _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM __printf__
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD
+   indicates to GCC that the function takes a format string and arguments,
+   where the format string directives are the ones standardized by ISO C99
+   and POSIX.  */
+#define _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD(formatstring_parameter, first_argument) \
+  _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, formatstring_parameter, first_argument))
+
+/* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD,
+   except that it indicates to GCC that the supported format string directives
+   are the ones of the system printf(), rather than the ones standardized by
+   ISO C99 and POSIX.  */
+#define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
+  _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM, formatstring_parameter, first_argument))
+
+/* _GL_ATTRIBUTE_FORMAT_SCANF
+   indicates to GCC that the function takes a format string and arguments,
+   where the format string directives are the ones standardized by ISO C99
+   and POSIX.  */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
+   _GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument))
+#else
+# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
+   _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF,
+   except that it indicates to GCC that the supported format string directives
+   are the ones of the system scanf(), rather than the ones standardized by
+   ISO C99 and POSIX.  */
+#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \
+  _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
+
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -296,6 +323,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -321,6 +358,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -418,7 +463,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -446,14 +491,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -467,26 +509,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -495,19 +537,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -583,6 +625,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -595,24 +644,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -645,17 +705,17 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define dprintf rpl_dprintf
 #  endif
-_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *restrict format, ...)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                                 _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *format, ...));
+_GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *restrict format, ...));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+_GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *restrict format, ...)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                                 _GL_ARG_NONNULL ((2)));
 #  endif
-_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *format, ...));
+_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *restrict format, ...));
 # endif
 _GL_CXXALIASWARN (dprintf);
 #elif defined GNULIB_POSIXCHECK
@@ -687,24 +747,84 @@
                  "use gnulib module fclose for portable POSIX compliance");
 #endif
 
+#if 1
+/* On native Windows, map 'fcloseall' to '_fcloseall', so that -loldnames is
+   not required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::fcloseall on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fcloseall
+#   define fcloseall _fcloseall
+#  endif
+_GL_CXXALIAS_MDA (fcloseall, int, (void));
+# else
+#  if 0
+#   if defined __FreeBSD__ || defined __DragonFly__
+_GL_CXXALIAS_SYS (fcloseall, void, (void));
+#   else
+_GL_CXXALIAS_SYS (fcloseall, int, (void));
+#   endif
+#  endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || 0
+_GL_CXXALIASWARN (fcloseall);
+# endif
+#endif
+
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef fdopen
 #   define fdopen rpl_fdopen
 #  endif
-_GL_FUNCDECL_RPL (fdopen, FILE *, (int fd, const char *mode)
-                                  _GL_ARG_NONNULL ((2)));
+_GL_FUNCDECL_RPL (fdopen, FILE *,
+                  (int fd, const char *mode)
+                  _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
 _GL_CXXALIAS_RPL (fdopen, FILE *, (int fd, const char *mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fdopen
+#   define fdopen _fdopen
+#  endif
+_GL_CXXALIAS_MDA (fdopen, FILE *, (int fd, const char *mode));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate fdopen with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (fdopen, FILE *,
+                  (int fd, const char *mode)
+                  _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+#  endif
 _GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
 # endif
 _GL_CXXALIASWARN (fdopen);
-#elif defined GNULIB_POSIXCHECK
-# undef fdopen
+#else
+# if 0 && __GNUC__ >= 11 && !defined fdopen
+/* For -Wmismatched-dealloc: Associate fdopen with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (fdopen, FILE *,
+                  (int fd, const char *mode)
+                  _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef fdopen
 /* Assume fdopen is always declared.  */
 _GL_WARN_ON_USE (fdopen, "fdopen on native Windows platforms is not POSIX compliant - "
                  "use gnulib module fdopen for portability");
+# elif 1
+/* On native Windows, map 'fdopen' to '_fdopen', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::fdopen always.  */
+#  if defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef fdopen
+#    define fdopen _fdopen
+#   endif
+_GL_CXXALIAS_MDA (fdopen, FILE *, (int fd, const char *mode));
+#  else
+_GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
+#  endif
+_GL_CXXALIASWARN (fdopen);
+# endif
 #endif
 
 #if 0
@@ -755,11 +875,14 @@
 #   undef fgets
 #   define fgets rpl_fgets
 #  endif
-_GL_FUNCDECL_RPL (fgets, char *, (char *s, int n, FILE *stream)
-                                 _GL_ARG_NONNULL ((1, 3)));
-_GL_CXXALIAS_RPL (fgets, char *, (char *s, int n, FILE *stream));
+_GL_FUNCDECL_RPL (fgets, char *,
+                  (char *restrict s, int n, FILE *restrict stream)
+                  _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (fgets, char *,
+                  (char *restrict s, int n, FILE *restrict stream));
 # else
-_GL_CXXALIAS_SYS (fgets, char *, (char *s, int n, FILE *stream));
+_GL_CXXALIAS_SYS (fgets, char *,
+                  (char *restrict s, int n, FILE *restrict stream));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fgets);
@@ -767,25 +890,58 @@
 #endif
 
 #if 1
+/* On native Windows, map 'fileno' to '_fileno', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::fileno always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fileno
+#   define fileno _fileno
+#  endif
+_GL_CXXALIAS_MDA (fileno, int, (FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (fileno, int, (FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (fileno);
+#endif
+
+#if 1
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef fopen
 #   define fopen rpl_fopen
 #  endif
-_GL_FUNCDECL_RPL (fopen, FILE *, (const char *filename, const char *mode)
-                                 _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (fopen, FILE *, (const char *filename, const char *mode));
+_GL_FUNCDECL_RPL (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+_GL_CXXALIAS_RPL (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode));
 # else
-_GL_CXXALIAS_SYS (fopen, FILE *, (const char *filename, const char *mode));
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate fopen with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+#  endif
+_GL_CXXALIAS_SYS (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fopen);
 # endif
-#elif defined GNULIB_POSIXCHECK
-# undef fopen
+#else
+# if 0 && __GNUC__ >= 11 && !defined fopen
+/* For -Wmismatched-dealloc: Associate fopen with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (fopen, FILE *,
+                  (const char *restrict filename, const char *restrict mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef fopen
 /* Assume fopen is always declared.  */
 _GL_WARN_ON_USE (fopen, "fopen on native Windows platforms is not POSIX compliant - "
                  "use gnulib module fopen for portability");
+# endif
 #endif
 
 #if 1 || 1
@@ -796,17 +952,21 @@
 #  endif
 #  define GNULIB_overrides_fprintf 1
 #  if 1 || 0
-_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
-                                _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (fprintf, int,
+                  (FILE *restrict fp, const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
 #  else
-_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3)
-                                _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (fprintf, int,
+                  (FILE *restrict fp, const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
 #  endif
-_GL_CXXALIAS_RPL (fprintf, int, (FILE *fp, const char *format, ...));
+_GL_CXXALIAS_RPL (fprintf, int,
+                  (FILE *restrict fp, const char *restrict format, ...));
 # else
-_GL_CXXALIAS_SYS (fprintf, int, (FILE *fp, const char *format, ...));
+_GL_CXXALIAS_SYS (fprintf, int,
+                  (FILE *restrict fp, const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fprintf);
@@ -872,11 +1032,14 @@
 #   undef fputs
 #   define fputs rpl_fputs
 #  endif
-_GL_FUNCDECL_RPL (fputs, int, (const char *string, FILE *stream)
-                              _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (fputs, int, (const char *string, FILE *stream));
+_GL_FUNCDECL_RPL (fputs, int,
+                  (const char *restrict string, FILE *restrict stream)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fputs, int,
+                  (const char *restrict string, FILE *restrict stream));
 # else
-_GL_CXXALIAS_SYS (fputs, int, (const char *string, FILE *stream));
+_GL_CXXALIAS_SYS (fputs, int,
+                  (const char *restrict string, FILE *restrict stream));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fputs);
@@ -889,11 +1052,17 @@
 #   undef fread
 #   define fread rpl_fread
 #  endif
-_GL_FUNCDECL_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream)
-                                 _GL_ARG_NONNULL ((4)));
-_GL_CXXALIAS_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream));
+_GL_FUNCDECL_RPL (fread, size_t,
+                  (void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream)
+                  _GL_ARG_NONNULL ((4)));
+_GL_CXXALIAS_RPL (fread, size_t,
+                  (void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream));
 # else
-_GL_CXXALIAS_SYS (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream));
+_GL_CXXALIAS_SYS (fread, size_t,
+                  (void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fread);
@@ -907,13 +1076,16 @@
 #   define freopen rpl_freopen
 #  endif
 _GL_FUNCDECL_RPL (freopen, FILE *,
-                  (const char *filename, const char *mode, FILE *stream)
+                  (const char *restrict filename, const char *restrict mode,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((2, 3)));
 _GL_CXXALIAS_RPL (freopen, FILE *,
-                  (const char *filename, const char *mode, FILE *stream));
+                  (const char *restrict filename, const char *restrict mode,
+                   FILE *restrict stream));
 # else
 _GL_CXXALIAS_SYS (freopen, FILE *,
-                  (const char *filename, const char *mode, FILE *stream));
+                  (const char *restrict filename, const char *restrict mode,
+                   FILE *restrict stream));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (freopen);
@@ -932,12 +1104,15 @@
 #   undef fscanf
 #   define fscanf rpl_fscanf
 #  endif
-_GL_FUNCDECL_RPL (fscanf, int, (FILE *stream, const char *format, ...)
-                               _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3)
-                               _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (fscanf, int, (FILE *stream, const char *format, ...));
+_GL_FUNCDECL_RPL (fscanf, int,
+                  (FILE *restrict stream, const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fscanf, int,
+                  (FILE *restrict stream, const char *restrict format, ...));
 # else
-_GL_CXXALIAS_SYS (fscanf, int, (FILE *stream, const char *format, ...));
+_GL_CXXALIAS_SYS (fscanf, int,
+                  (FILE *restrict stream, const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (fscanf);
@@ -1108,13 +1283,16 @@
 #   define fwrite rpl_fwrite
 #  endif
 _GL_FUNCDECL_RPL (fwrite, size_t,
-                  (const void *ptr, size_t s, size_t n, FILE *stream)
+                  (const void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 4)));
 _GL_CXXALIAS_RPL (fwrite, size_t,
-                  (const void *ptr, size_t s, size_t n, FILE *stream));
+                  (const void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream));
 # else
 _GL_CXXALIAS_SYS (fwrite, size_t,
-                  (const void *ptr, size_t s, size_t n, FILE *stream));
+                  (const void *restrict ptr, size_t s, size_t n,
+                   FILE *restrict stream));
 
 /* Work around bug 11959 when fortifying glibc 2.4 through 2.15
    <https://sourceware.org/bugzilla/show_bug.cgi?id=11959>,
@@ -1189,22 +1367,26 @@
 #   define getdelim rpl_getdelim
 #  endif
 _GL_FUNCDECL_RPL (getdelim, ssize_t,
-                  (char **lineptr, size_t *linesize, int delimiter,
-                   FILE *stream)
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   int delimiter,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 2, 4)));
 _GL_CXXALIAS_RPL (getdelim, ssize_t,
-                  (char **lineptr, size_t *linesize, int delimiter,
-                   FILE *stream));
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   int delimiter,
+                   FILE *restrict stream));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (getdelim, ssize_t,
-                  (char **lineptr, size_t *linesize, int delimiter,
-                   FILE *stream)
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   int delimiter,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 2, 4)));
 #  endif
 _GL_CXXALIAS_SYS (getdelim, ssize_t,
-                  (char **lineptr, size_t *linesize, int delimiter,
-                   FILE *stream));
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   int delimiter,
+                   FILE *restrict stream));
 # endif
 _GL_CXXALIASWARN (getdelim);
 #elif defined GNULIB_POSIXCHECK
@@ -1215,7 +1397,7 @@
 # endif
 #endif
 
-#if 0
+#if 1
 /* Read a line, up to (and including) the next newline, from STREAM, store it
    in *LINEPTR (and NUL-terminate it).
    *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
@@ -1228,18 +1410,22 @@
 #   define getline rpl_getline
 #  endif
 _GL_FUNCDECL_RPL (getline, ssize_t,
-                  (char **lineptr, size_t *linesize, FILE *stream)
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 2, 3)));
 _GL_CXXALIAS_RPL (getline, ssize_t,
-                  (char **lineptr, size_t *linesize, FILE *stream));
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   FILE *restrict stream));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (getline, ssize_t,
-                  (char **lineptr, size_t *linesize, FILE *stream)
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   FILE *restrict stream)
                   _GL_ARG_NONNULL ((1, 2, 3)));
 #  endif
 _GL_CXXALIAS_SYS (getline, ssize_t,
-                  (char **lineptr, size_t *linesize, FILE *stream));
+                  (char **restrict lineptr, size_t *restrict linesize,
+                   FILE *restrict stream));
 # endif
 # if 1
 _GL_CXXALIASWARN (getline);
@@ -1260,6 +1446,22 @@
 _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
 #endif
 
+#if 1
+/* On native Windows, map 'getw' to '_getw', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::getw always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getw
+#   define getw _getw
+#  endif
+_GL_CXXALIAS_MDA (getw, int, (FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (getw, int, (FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (getw);
+#endif
+
 #if 1 || 0
 struct obstack;
 /* Grow an obstack with formatted output.  Return the number of
@@ -1273,7 +1475,7 @@
 #  endif
 _GL_FUNCDECL_RPL (obstack_printf, int,
                   (struct obstack *obs, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (obstack_printf, int,
                   (struct obstack *obs, const char *format, ...));
@@ -1281,7 +1483,7 @@
 #  if !0
 _GL_FUNCDECL_SYS (obstack_printf, int,
                   (struct obstack *obs, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (obstack_printf, int,
@@ -1294,7 +1496,7 @@
 #  endif
 _GL_FUNCDECL_RPL (obstack_vprintf, int,
                   (struct obstack *obs, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (obstack_vprintf, int,
                   (struct obstack *obs, const char *format, va_list args));
@@ -1302,7 +1504,7 @@
 #  if !0
 _GL_FUNCDECL_SYS (obstack_vprintf, int,
                   (struct obstack *obs, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (obstack_vprintf, int,
@@ -1354,43 +1556,53 @@
 #   undef popen
 #   define popen rpl_popen
 #  endif
-_GL_FUNCDECL_RPL (popen, FILE *, (const char *cmd, const char *mode)
-                                 _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (popen, FILE *,
+                  (const char *cmd, const char *mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
 _GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode));
 # else
-#  if !1
-_GL_FUNCDECL_SYS (popen, FILE *, (const char *cmd, const char *mode)
-                                 _GL_ARG_NONNULL ((1, 2)));
+#  if !1 || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (popen, FILE *,
+                  (const char *cmd, const char *mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
 #  endif
 _GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode));
 # endif
 _GL_CXXALIASWARN (popen);
-#elif defined GNULIB_POSIXCHECK
-# undef popen
-# if HAVE_RAW_DECL_POPEN
+#else
+# if 0 && __GNUC__ >= 11 && !defined popen
+/* For -Wmismatched-dealloc: Associate popen with pclose or rpl_pclose.  */
+_GL_FUNCDECL_SYS (popen, FILE *,
+                  (const char *cmd, const char *mode)
+                  _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef popen
+#  if HAVE_RAW_DECL_POPEN
 _GL_WARN_ON_USE (popen, "popen is buggy on some platforms - "
                  "use gnulib module popen or pipe for more portability");
+#  endif
 # endif
 #endif
 
 #if 1 || 1
 # if (1 && 0) \
      || (1 && 0 && (0 || 0))
-#  if defined __GNUC__
+#  if defined __GNUC__ || defined __clang__
 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 /* Don't break __attribute__((format(printf,M,N))).  */
 #    define printf __printf__
 #   endif
 #   if 1 || 0
 _GL_FUNCDECL_RPL_1 (__printf__, int,
-                    (const char *format, ...)
+                    (const char *restrict format, ...)
                     __asm__ (""
                              _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
-                    _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2)
+                    _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 2)
                     _GL_ARG_NONNULL ((1)));
 #   else
 _GL_FUNCDECL_RPL_1 (__printf__, int,
-                    (const char *format, ...)
+                    (const char *restrict format, ...)
                     __asm__ (""
                              _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
                     _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 2)
@@ -1402,14 +1614,14 @@
 #    define printf rpl_printf
 #   endif
 _GL_FUNCDECL_RPL (printf, int,
-                  (const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2)
+                  (const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 2)
                   _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (printf, int, (const char *format, ...));
+_GL_CXXALIAS_RPL (printf, int, (const char *restrict format, ...));
 #  endif
 #  define GNULIB_overrides_printf 1
 # else
-_GL_CXXALIAS_SYS (printf, int, (const char *format, ...));
+_GL_CXXALIAS_SYS (printf, int, (const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (printf);
@@ -1473,6 +1685,22 @@
 # endif
 #endif
 
+#if 1
+/* On native Windows, map 'putw' to '_putw', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::putw always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef putw
+#   define putw _putw
+#  endif
+_GL_CXXALIAS_MDA (putw, int, (int w, FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (putw, int, (int w, FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (putw);
+#endif
+
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
@@ -1550,31 +1778,31 @@
 
 #if 1
 # if 0 && 0
-#  if defined __GNUC__
+#  if defined __GNUC__ || defined __clang__
 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #    undef scanf
 /* Don't break __attribute__((format(scanf,M,N))).  */
 #    define scanf __scanf__
 #   endif
 _GL_FUNCDECL_RPL_1 (__scanf__, int,
-                    (const char *format, ...)
+                    (const char *restrict format, ...)
                     __asm__ (""
                              _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_scanf))
                     _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
                     _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *format, ...));
+_GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *restrict format, ...));
 #  else
 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #    undef scanf
 #    define scanf rpl_scanf
 #   endif
-_GL_FUNCDECL_RPL (scanf, int, (const char *format, ...)
+_GL_FUNCDECL_RPL (scanf, int, (const char *restrict format, ...)
                               _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
                               _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (scanf, int, (const char *format, ...));
+_GL_CXXALIAS_RPL (scanf, int, (const char *restrict format, ...));
 #  endif
 # else
-_GL_CXXALIAS_SYS (scanf, int, (const char *format, ...));
+_GL_CXXALIAS_SYS (scanf, int, (const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (scanf);
@@ -1586,23 +1814,30 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define snprintf rpl_snprintf
 #  endif
+#  define GNULIB_overrides_snprintf 1
 _GL_FUNCDECL_RPL (snprintf, int,
-                  (char *str, size_t size, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4)
+                  (char *restrict str, size_t size,
+                   const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 4)
                   _GL_ARG_NONNULL ((3)));
 _GL_CXXALIAS_RPL (snprintf, int,
-                  (char *str, size_t size, const char *format, ...));
+                  (char *restrict str, size_t size,
+                   const char *restrict format, ...));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (snprintf, int,
-                  (char *str, size_t size, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4)
+                  (char *restrict str, size_t size,
+                   const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 4)
                   _GL_ARG_NONNULL ((3)));
 #  endif
 _GL_CXXALIAS_SYS (snprintf, int,
-                  (char *str, size_t size, const char *format, ...));
+                  (char *restrict str, size_t size,
+                   const char *restrict format, ...));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (snprintf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef snprintf
 # if HAVE_RAW_DECL_SNPRINTF
@@ -1625,12 +1860,16 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define sprintf rpl_sprintf
 #  endif
-_GL_FUNCDECL_RPL (sprintf, int, (char *str, const char *format, ...)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
-                                _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (sprintf, int, (char *str, const char *format, ...));
+#  define GNULIB_overrides_sprintf 1
+_GL_FUNCDECL_RPL (sprintf, int,
+                  (char *restrict str, const char *restrict format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (sprintf, int,
+                  (char *restrict str, const char *restrict format, ...));
 # else
-_GL_CXXALIAS_SYS (sprintf, int, (char *str, const char *format, ...));
+_GL_CXXALIAS_SYS (sprintf, int,
+                  (char *restrict str, const char *restrict format, ...));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (sprintf);
@@ -1643,24 +1882,53 @@
                  "POSIX compliance");
 #endif
 
+#if 1
+/* On native Windows, map 'tempnam' to '_tempnam', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::tempnam always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef tempnam
+#   define tempnam _tempnam
+#  endif
+_GL_CXXALIAS_MDA (tempnam, char *, (const char *dir, const char *prefix));
+# else
+_GL_CXXALIAS_SYS (tempnam, char *, (const char *dir, const char *prefix));
+# endif
+_GL_CXXALIASWARN (tempnam);
+#endif
+
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define tmpfile rpl_tmpfile
 #  endif
-_GL_FUNCDECL_RPL (tmpfile, FILE *, (void));
+_GL_FUNCDECL_RPL (tmpfile, FILE *, (void)
+                                   _GL_ATTRIBUTE_DEALLOC (fclose, 1));
 _GL_CXXALIAS_RPL (tmpfile, FILE *, (void));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate tmpfile with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (tmpfile, FILE *, (void)
+                                   _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+#  endif
 _GL_CXXALIAS_SYS (tmpfile, FILE *, (void));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (tmpfile);
 # endif
-#elif defined GNULIB_POSIXCHECK
-# undef tmpfile
-# if HAVE_RAW_DECL_TMPFILE
+#else
+# if 0 && __GNUC__ >= 11 && !defined tmpfile
+/* For -Wmismatched-dealloc: Associate tmpfile with fclose or rpl_fclose.  */
+_GL_FUNCDECL_SYS (tmpfile, FILE *, (void)
+                                   _GL_ATTRIBUTE_DEALLOC (fclose, 1));
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef tmpfile
+#  if HAVE_RAW_DECL_TMPFILE
 _GL_WARN_ON_USE (tmpfile, "tmpfile is not usable on mingw - "
                  "use gnulib module tmpfile for portability");
+#  endif
 # endif
 #endif
 
@@ -1673,9 +1941,10 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define asprintf rpl_asprintf
 #  endif
+#  define GNULIB_overrides_asprintf
 _GL_FUNCDECL_RPL (asprintf, int,
                   (char **result, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (asprintf, int,
                   (char **result, const char *format, ...));
@@ -1683,7 +1952,7 @@
 #  if !1
 _GL_FUNCDECL_SYS (asprintf, int,
                   (char **result, const char *format, ...)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (asprintf, int,
@@ -1694,9 +1963,10 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define vasprintf rpl_vasprintf
 #  endif
+#  define GNULIB_overrides_vasprintf 1
 _GL_FUNCDECL_RPL (vasprintf, int,
                   (char **result, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (vasprintf, int,
                   (char **result, const char *format, va_list args));
@@ -1704,7 +1974,7 @@
 #  if !1
 _GL_FUNCDECL_SYS (vasprintf, int,
                   (char **result, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (vasprintf, int,
@@ -1718,22 +1988,27 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define vdprintf rpl_vdprintf
 #  endif
-_GL_FUNCDECL_RPL (vdprintf, int, (int fd, const char *format, va_list args)
-                                 _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
-                                 _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (vdprintf, int, (int fd, const char *format, va_list args));
+_GL_FUNCDECL_RPL (vdprintf, int,
+                  (int fd, const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (vdprintf, int,
+                  (int fd, const char *restrict format, va_list args));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (vdprintf, int, (int fd, const char *format, va_list args)
-                                 _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
-                                 _GL_ARG_NONNULL ((2)));
+_GL_FUNCDECL_SYS (vdprintf, int,
+                  (int fd, const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+                  _GL_ARG_NONNULL ((2)));
 #  endif
 /* Need to cast, because on Solaris, the third parameter will likely be
                                                     __va_list args.  */
 _GL_CXXALIAS_SYS_CAST (vdprintf, int,
-                       (int fd, const char *format, va_list args));
+                       (int fd, const char *restrict format, va_list args));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vdprintf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef vdprintf
 # if HAVE_RAW_DECL_VDPRINTF
@@ -1750,21 +2025,28 @@
 #  endif
 #  define GNULIB_overrides_vfprintf 1
 #  if 0
-_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)
-                                 _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
-                                 _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (vfprintf, int,
+                  (FILE *restrict fp,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+                  _GL_ARG_NONNULL ((1, 2)));
 #  else
-_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)
-                                 _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0)
-                                 _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (vfprintf, int,
+                  (FILE *restrict fp,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0)
+                  _GL_ARG_NONNULL ((1, 2)));
 #  endif
-_GL_CXXALIAS_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args));
+_GL_CXXALIAS_RPL (vfprintf, int,
+                  (FILE *restrict fp,
+                   const char *restrict format, va_list args));
 # else
 /* Need to cast, because on Solaris, the third parameter is
                                                       __va_list args
    and GCC's fixincludes did not change this to __gnuc_va_list.  */
 _GL_CXXALIAS_SYS_CAST (vfprintf, int,
-                       (FILE *fp, const char *format, va_list args));
+                       (FILE *restrict fp,
+                        const char *restrict format, va_list args));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vfprintf);
@@ -1787,16 +2069,21 @@
 #   define vfscanf rpl_vfscanf
 #  endif
 _GL_FUNCDECL_RPL (vfscanf, int,
-                  (FILE *stream, const char *format, va_list args)
+                  (FILE *restrict stream,
+                   const char *restrict format, va_list args)
                   _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (vfscanf, int,
-                  (FILE *stream, const char *format, va_list args));
+                  (FILE *restrict stream,
+                   const char *restrict format, va_list args));
 # else
 _GL_CXXALIAS_SYS (vfscanf, int,
-                  (FILE *stream, const char *format, va_list args));
+                  (FILE *restrict stream,
+                   const char *restrict format, va_list args));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vfscanf);
+# endif
 #endif
 
 #if 0 || 1
@@ -1807,20 +2094,21 @@
 #  endif
 #  define GNULIB_overrides_vprintf 1
 #  if 0 || 0
-_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args)
-                                _GL_ATTRIBUTE_FORMAT_PRINTF (1, 0)
+_GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 0)
                                 _GL_ARG_NONNULL ((1)));
 #  else
-_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args)
+_GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args)
                                 _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 0)
                                 _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_RPL (vprintf, int, (const char *format, va_list args));
+_GL_CXXALIAS_RPL (vprintf, int, (const char *restrict format, va_list args));
 # else
 /* Need to cast, because on Solaris, the second parameter is
                                                           __va_list args
    and GCC's fixincludes did not change this to __gnuc_va_list.  */
-_GL_CXXALIAS_SYS_CAST (vprintf, int, (const char *format, va_list args));
+_GL_CXXALIAS_SYS_CAST (vprintf, int,
+                       (const char *restrict format, va_list args));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vprintf);
@@ -1842,14 +2130,16 @@
 #   undef vscanf
 #   define vscanf rpl_vscanf
 #  endif
-_GL_FUNCDECL_RPL (vscanf, int, (const char *format, va_list args)
+_GL_FUNCDECL_RPL (vscanf, int, (const char *restrict format, va_list args)
                                _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 0)
                                _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (vscanf, int, (const char *format, va_list args));
+_GL_CXXALIAS_RPL (vscanf, int, (const char *restrict format, va_list args));
 # else
-_GL_CXXALIAS_SYS (vscanf, int, (const char *format, va_list args));
+_GL_CXXALIAS_SYS (vscanf, int, (const char *restrict format, va_list args));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vscanf);
+# endif
 #endif
 
 #if 1
@@ -1857,23 +2147,30 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define vsnprintf rpl_vsnprintf
 #  endif
+#  define GNULIB_overrides_vsnprintf 1
 _GL_FUNCDECL_RPL (vsnprintf, int,
-                  (char *str, size_t size, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0)
+                  (char *restrict str, size_t size,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0)
                   _GL_ARG_NONNULL ((3)));
 _GL_CXXALIAS_RPL (vsnprintf, int,
-                  (char *str, size_t size, const char *format, va_list args));
+                  (char *restrict str, size_t size,
+                   const char *restrict format, va_list args));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (vsnprintf, int,
-                  (char *str, size_t size, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0)
+                  (char *restrict str, size_t size,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0)
                   _GL_ARG_NONNULL ((3)));
 #  endif
 _GL_CXXALIAS_SYS (vsnprintf, int,
-                  (char *str, size_t size, const char *format, va_list args));
+                  (char *restrict str, size_t size,
+                   const char *restrict format, va_list args));
 # endif
+# if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vsnprintf);
+# endif
 #elif defined GNULIB_POSIXCHECK
 # undef vsnprintf
 # if HAVE_RAW_DECL_VSNPRINTF
@@ -1887,18 +2184,22 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define vsprintf rpl_vsprintf
 #  endif
+#  define GNULIB_overrides_vsprintf 1
 _GL_FUNCDECL_RPL (vsprintf, int,
-                  (char *str, const char *format, va_list args)
-                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  (char *restrict str,
+                   const char *restrict format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (vsprintf, int,
-                  (char *str, const char *format, va_list args));
+                  (char *restrict str,
+                   const char *restrict format, va_list args));
 # else
 /* Need to cast, because on Solaris, the third parameter is
                                                        __va_list args
    and GCC's fixincludes did not change this to __gnuc_va_list.  */
 _GL_CXXALIAS_SYS_CAST (vsprintf, int,
-                       (char *str, const char *format, va_list args));
+                       (char *restrict str,
+                        const char *restrict format, va_list args));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (vsprintf);
diff --git a/linux_musl-lib/stdlib.h b/linux_musl-lib/stdlib.h
index e126aab..38cd3d1 100644
--- a/linux_musl-lib/stdlib.h
+++ b/linux_musl-lib/stdlib.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <stdlib.h>.
 
-   Copyright (C) 1995, 2001-2004, 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 1995, 2001-2004, 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
@@ -54,8 +54,8 @@
 # include <sys/loadavg.h>
 #endif
 
-/* Native Windows platforms declare mktemp() in <io.h>.  */
-#if 0 && (defined _WIN32 && ! defined __CYGWIN__)
+/* Native Windows platforms declare _mktemp() in <io.h>.  */
+#if defined _WIN32 && !defined __CYGWIN__
 # include <io.h>
 #endif
 
@@ -100,29 +100,60 @@
 # include <unistd.h>
 #endif
 
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.  */
+#ifndef _GL_ATTRIBUTE_DEALLOC
+# if __GNUC__ >= 11
+#  define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+# else
+#  define _GL_ATTRIBUTE_DEALLOC(f, i)
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
+   can be freed via 'free'; it can be used only after declaring 'free'.  */
+/* Applies to: functions.  Cannot be used on inline functions.  */
+#ifndef _GL_ATTRIBUTE_DEALLOC_FREE
+# define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (free, 1)
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+   allocated memory.  */
+/* Applies to: functions.  */
+#ifndef _GL_ATTRIBUTE_MALLOC
+# if __GNUC__ >= 3 || defined __clang__
+#  define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+#  define _GL_ATTRIBUTE_MALLOC
+# endif
+#endif
+
 /* The __attribute__ feature is available in gcc versions 2.5 and later.
    The attribute __pure__ was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define _GL_ATTRIBUTE_PURE /* empty */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
 #endif
 
 /* The definition of _Noreturn is copied here.  */
 /* A C macro for declaring that a function does not return.
-   Copyright (C) 2011-2019 Free Software Foundation, Inc.
+   Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _Noreturn
@@ -137,11 +168,16 @@
        AIX system header files and several gnulib header files use precisely
        this syntax with 'extern'.  */
 #  define _Noreturn [[noreturn]]
-# elif ((!defined __cplusplus || defined __clang__)                     \
-        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)  \
-            || 4 < __GNUC__ + (7 <= __GNUC_MINOR__)))
+# elif ((!defined __cplusplus || defined __clang__) \
+        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
+            || (!defined __STRICT_ANSI__ \
+                && (4 < __GNUC__ + (7 <= __GNUC_MINOR__) \
+                    || (defined __apple_build_version__ \
+                        ? 6000000 <= __apple_build_version__ \
+                        : 3 < __clang_major__ + (5 <= __clang_minor__))))))
    /* _Noreturn works as-is.  */
-# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
+# elif (2 < __GNUC__ + (8 <= __GNUC_MINOR__) || defined __clang__ \
+        || 0x5110 <= __SUNPRO_C)
 #  define _Noreturn __attribute__ ((__noreturn__))
 # elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
 #  define _Noreturn __declspec (noreturn)
@@ -152,19 +188,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -299,6 +335,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -324,6 +370,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -421,7 +475,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -449,14 +503,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -470,26 +521,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -498,19 +549,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -586,6 +637,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -598,24 +656,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -661,6 +730,69 @@
 #endif
 
 
+#if 1
+# if 1
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef free
+#   define free rpl_free
+#  endif
+_GL_FUNCDECL_RPL (free, void, (void *ptr));
+_GL_CXXALIAS_RPL (free, void, (void *ptr));
+# else
+_GL_CXXALIAS_SYS (free, void, (void *ptr));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (free);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef free
+/* Assume free is always declared.  */
+_GL_WARN_ON_USE (free, "free is not future POSIX compliant everywhere - "
+                 "use gnulib module free for portability");
+#endif
+
+
+/* Allocate memory with indefinite extent and specified alignment.  */
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef aligned_alloc
+#   define aligned_alloc rpl_aligned_alloc
+#  endif
+_GL_FUNCDECL_RPL (aligned_alloc, void *,
+                  (size_t alignment, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+_GL_CXXALIAS_RPL (aligned_alloc, void *, (size_t alignment, size_t size));
+# else
+#  if 1
+#   if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate aligned_alloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (aligned_alloc, void *,
+                  (size_t alignment, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#   endif
+_GL_CXXALIAS_SYS (aligned_alloc, void *, (size_t alignment, size_t size));
+#  endif
+# endif
+# if 1
+_GL_CXXALIASWARN (aligned_alloc);
+# endif
+#else
+# if 1 && __GNUC__ >= 11 && !defined aligned_alloc
+/* For -Wmismatched-dealloc: Associate aligned_alloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (aligned_alloc, void *,
+                  (size_t alignment, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef aligned_alloc
+#  if HAVE_RAW_DECL_ALIGNED_ALLOC
+_GL_WARN_ON_USE (aligned_alloc, "aligned_alloc is not portable - "
+                 "use gnulib module aligned_alloc for portability");
+#  endif
+# endif
+#endif
+
 #if 0
 /* Parse a signed decimal integer.
    Returns the value of the integer.  Errors are not detected.  */
@@ -685,19 +817,35 @@
 #   undef calloc
 #   define calloc rpl_calloc
 #  endif
-_GL_FUNCDECL_RPL (calloc, void *, (size_t nmemb, size_t size));
+_GL_FUNCDECL_RPL (calloc, void *,
+                  (size_t nmemb, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (calloc, void *, (size_t nmemb, size_t size));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate calloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (calloc, void *,
+                  (size_t nmemb, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#  endif
 _GL_CXXALIAS_SYS (calloc, void *, (size_t nmemb, size_t size));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (calloc);
 # endif
-#elif defined GNULIB_POSIXCHECK
-# undef calloc
+#else
+# if 1 && __GNUC__ >= 11 && !defined calloc
+/* For -Wmismatched-dealloc: Associate calloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (calloc, void *,
+                  (size_t nmemb, size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef calloc
 /* Assume calloc is always declared.  */
 _GL_WARN_ON_USE (calloc, "calloc is not POSIX compliant everywhere - "
                  "use gnulib module calloc-posix for portability");
+# endif
 #endif
 
 #if 1
@@ -705,23 +853,108 @@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define canonicalize_file_name rpl_canonicalize_file_name
 #  endif
-_GL_FUNCDECL_RPL (canonicalize_file_name, char *, (const char *name)
-                                                  _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_RPL (canonicalize_file_name, char *,
+                  (const char *name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (canonicalize_file_name, char *, (const char *name));
 # else
-#  if !0
-_GL_FUNCDECL_SYS (canonicalize_file_name, char *, (const char *name)
-                                                  _GL_ARG_NONNULL ((1)));
+#  if !0 || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (canonicalize_file_name, char *,
+                  (const char *name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 #  endif
 _GL_CXXALIAS_SYS (canonicalize_file_name, char *, (const char *name));
 # endif
+# ifndef GNULIB_defined_canonicalize_file_name
+#  define GNULIB_defined_canonicalize_file_name \
+     (!0 || 0)
+# endif
 _GL_CXXALIASWARN (canonicalize_file_name);
-#elif defined GNULIB_POSIXCHECK
-# undef canonicalize_file_name
-# if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
+#else
+# if 1 && __GNUC__ >= 11 && !defined canonicalize_file_name
+/* For -Wmismatched-dealloc: Associate canonicalize_file_name with free or
+   rpl_free.  */
+_GL_FUNCDECL_SYS (canonicalize_file_name, char *,
+                  (const char *name)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef canonicalize_file_name
+#  if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
 _GL_WARN_ON_USE (canonicalize_file_name,
                  "canonicalize_file_name is unportable - "
                  "use gnulib module canonicalize-lgpl for portability");
+#  endif
+# endif
+#endif
+
+#if 1
+/* On native Windows, map 'ecvt' to '_ecvt', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::ecvt on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef ecvt
+#   define ecvt _ecvt
+#  endif
+_GL_CXXALIAS_MDA (ecvt, char *,
+                  (double number, int ndigits, int *decptp, int *signp));
+# else
+#  if 1
+_GL_CXXALIAS_SYS (ecvt, char *,
+                  (double number, int ndigits, int *decptp, int *signp));
+#  endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || 1
+_GL_CXXALIASWARN (ecvt);
+# endif
+#endif
+
+#if 1
+/* On native Windows, map 'fcvt' to '_fcvt', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::fcvt on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fcvt
+#   define fcvt _fcvt
+#  endif
+_GL_CXXALIAS_MDA (fcvt, char *,
+                  (double number, int ndigits, int *decptp, int *signp));
+# else
+#  if 1
+_GL_CXXALIAS_SYS (fcvt, char *,
+                  (double number, int ndigits, int *decptp, int *signp));
+#  endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || 1
+_GL_CXXALIASWARN (fcvt);
+# endif
+#endif
+
+#if 1
+/* On native Windows, map 'gcvt' to '_gcvt', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::gcvt on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef gcvt
+#   define gcvt _gcvt
+#  endif
+_GL_CXXALIAS_MDA (gcvt, char *, (double number, int ndigits, char *buf));
+# else
+#  if 1
+_GL_CXXALIAS_SYS (gcvt, char *, (double number, int ndigits, char *buf));
+#  endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || 1
+_GL_CXXALIASWARN (gcvt);
 # endif
 #endif
 
@@ -799,19 +1032,35 @@
 #   undef malloc
 #   define malloc rpl_malloc
 #  endif
-_GL_FUNCDECL_RPL (malloc, void *, (size_t size));
+_GL_FUNCDECL_RPL (malloc, void *,
+                  (size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (malloc, void *, (size_t size));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate malloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (malloc, void *,
+                  (size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#  endif
 _GL_CXXALIAS_SYS (malloc, void *, (size_t size));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (malloc);
 # endif
-#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
-# undef malloc
+#else
+# if 1 && __GNUC__ >= 11 && !defined malloc
+/* For -Wmismatched-dealloc: Associate malloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (malloc, void *,
+                  (size_t size)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+#  undef malloc
 /* Assume malloc is always declared.  */
 _GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - "
                  "use gnulib module malloc-posix for portability");
+# endif
 #endif
 
 /* Convert a multibyte character to a wide character.  */
@@ -821,13 +1070,17 @@
 #   undef mbtowc
 #   define mbtowc rpl_mbtowc
 #  endif
-_GL_FUNCDECL_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
-_GL_CXXALIAS_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+_GL_FUNCDECL_RPL (mbtowc, int,
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n));
+_GL_CXXALIAS_RPL (mbtowc, int,
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+_GL_FUNCDECL_SYS (mbtowc, int,
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n));
 #  endif
-_GL_CXXALIAS_SYS (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+_GL_CXXALIAS_SYS (mbtowc, int,
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (mbtowc);
@@ -972,6 +1225,51 @@
 # endif
 #endif
 
+#if 1
+/* On native Windows, map 'mktemp' to '_mktemp', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::mktemp always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef mktemp
+#   define mktemp _mktemp
+#  endif
+_GL_CXXALIAS_MDA (mktemp, char *, (char * /*template*/));
+# else
+_GL_CXXALIAS_SYS (mktemp, char *, (char * /*template*/));
+# endif
+_GL_CXXALIASWARN (mktemp);
+#endif
+
+/* Allocate memory with indefinite extent and specified alignment.  */
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef posix_memalign
+#   define posix_memalign rpl_posix_memalign
+#  endif
+_GL_FUNCDECL_RPL (posix_memalign, int,
+                  (void **memptr, size_t alignment, size_t size)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_memalign, int,
+                  (void **memptr, size_t alignment, size_t size));
+# else
+#  if 1
+_GL_CXXALIAS_SYS (posix_memalign, int,
+                  (void **memptr, size_t alignment, size_t size));
+#  endif
+# endif
+# if 1
+_GL_CXXALIASWARN (posix_memalign);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_memalign
+# if HAVE_RAW_DECL_POSIX_MEMALIGN
+_GL_WARN_ON_USE (posix_memalign, "posix_memalign is not portable - "
+                 "use gnulib module posix_memalign for portability");
+# endif
+#endif
+
 #if 0
 /* Return an FD open to the master side of a pseudo-terminal.  Flags should
    include O_RDWR, and may also include O_NOCTTY.  */
@@ -1030,6 +1328,9 @@
 #  endif
 _GL_CXXALIAS_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
 # endif
+# ifndef GNULIB_defined_ptsname_r
+#  define GNULIB_defined_ptsname_r (!1 || 0)
+# endif
 _GL_CXXALIASWARN (ptsname_r);
 #elif defined GNULIB_POSIXCHECK
 # undef ptsname_r
@@ -1047,6 +1348,28 @@
 #  endif
 _GL_FUNCDECL_RPL (putenv, int, (char *string) _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (putenv, int, (char *string));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef putenv
+#   define putenv _putenv
+#  endif
+_GL_CXXALIAS_MDA (putenv, int, (char *string));
+# else
+_GL_CXXALIAS_SYS (putenv, int, (char *string));
+# endif
+_GL_CXXALIASWARN (putenv);
+#elif 1
+/* On native Windows, map 'putenv' to '_putenv', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::putenv always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef putenv
+#   define putenv _putenv
+#  endif
+/* Need to cast, because on mingw, the parameter is either
+   'const char *string' or 'char *string'.  */
+_GL_CXXALIAS_MDA_CAST (putenv, int, (char *string));
 # else
 _GL_CXXALIAS_SYS (putenv, int, (char *string));
 # endif
@@ -1113,7 +1436,9 @@
 #  if !1
 _GL_FUNCDECL_SYS (random, long, (void));
 #  endif
-_GL_CXXALIAS_SYS (random, long, (void));
+/* Need to cast, because on Haiku, the return type is
+                               int.  */
+_GL_CXXALIAS_SYS_CAST (random, long, (void));
 # endif
 _GL_CXXALIASWARN (random);
 #elif defined GNULIB_POSIXCHECK
@@ -1280,9 +1605,11 @@
                    struct random_data *rand_state)
                   _GL_ARG_NONNULL ((2, 4)));
 #  endif
-_GL_CXXALIAS_SYS (initstate_r, int,
-                  (unsigned int seed, char *buf, size_t buf_size,
-                   struct random_data *rand_state));
+/* Need to cast, because on Haiku, the third parameter is
+                                                     unsigned long buf_size.  */
+_GL_CXXALIAS_SYS_CAST (initstate_r, int,
+                       (unsigned int seed, char *buf, size_t buf_size,
+                        struct random_data *rand_state));
 # endif
 _GL_CXXALIASWARN (initstate_r);
 #elif defined GNULIB_POSIXCHECK
@@ -1310,8 +1637,10 @@
                   (char *arg_state, struct random_data *rand_state)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
-_GL_CXXALIAS_SYS (setstate_r, int,
-                  (char *arg_state, struct random_data *rand_state));
+/* Need to cast, because on Haiku, the first parameter is
+                        void *arg_state.  */
+_GL_CXXALIAS_SYS_CAST (setstate_r, int,
+                       (char *arg_state, struct random_data *rand_state));
 # endif
 _GL_CXXALIASWARN (setstate_r);
 #elif defined GNULIB_POSIXCHECK
@@ -1330,29 +1659,53 @@
 #   undef realloc
 #   define realloc rpl_realloc
 #  endif
-_GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size));
+_GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size)
+                                   _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (realloc, void *, (void *ptr, size_t size));
 # else
+#  if __GNUC__ >= 11
+/* For -Wmismatched-dealloc: Associate realloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (realloc, void *, (void *ptr, size_t size)
+                                   _GL_ATTRIBUTE_DEALLOC_FREE);
+#  endif
 _GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (realloc);
 # endif
-#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
-# undef realloc
+#else
+# if 1 && __GNUC__ >= 11 && !defined realloc
+/* For -Wmismatched-dealloc: Associate realloc with free or rpl_free.  */
+_GL_FUNCDECL_SYS (realloc, void *, (void *ptr, size_t size)
+                                   _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+#  undef realloc
 /* Assume realloc is always declared.  */
 _GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - "
                  "use gnulib module realloc-posix for portability");
+# endif
 #endif
 
 
-#if 0
-# if ! 1
+#if 1
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef reallocarray
+#   define reallocarray rpl_reallocarray
+#  endif
+_GL_FUNCDECL_RPL (reallocarray, void *,
+                  (void *ptr, size_t nmemb, size_t size));
+_GL_CXXALIAS_RPL (reallocarray, void *,
+                  (void *ptr, size_t nmemb, size_t size));
+# else
+#  if ! 1
 _GL_FUNCDECL_SYS (reallocarray, void *,
                   (void *ptr, size_t nmemb, size_t size));
-# endif
+#  endif
 _GL_CXXALIAS_SYS (reallocarray, void *,
                   (void *ptr, size_t nmemb, size_t size));
+# endif
 _GL_CXXALIASWARN (reallocarray);
 #elif defined GNULIB_POSIXCHECK
 # undef reallocarray
@@ -1363,19 +1716,23 @@
 #endif
 
 #if 1
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define realpath rpl_realpath
 #  endif
-_GL_FUNCDECL_RPL (realpath, char *, (const char *name, char *resolved)
-                                    _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (realpath, char *, (const char *name, char *resolved));
+_GL_FUNCDECL_RPL (realpath, char *,
+                  (const char *restrict name, char *restrict resolved)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (realpath, char *,
+                  (const char *restrict name, char *restrict resolved));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (realpath, char *, (const char *name, char *resolved)
-                                    _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_SYS (realpath, char *,
+                  (const char *restrict name, char *restrict resolved)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (realpath, char *, (const char *name, char *resolved));
+_GL_CXXALIAS_SYS (realpath, char *,
+                  (const char *restrict name, char *restrict resolved));
 # endif
 _GL_CXXALIASWARN (realpath);
 #elif defined GNULIB_POSIXCHECK
@@ -1451,22 +1808,26 @@
 # endif
 #endif
 
-#if 0
+#if 1
  /* Parse a double from STRING, updating ENDP if appropriate.  */
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define strtod rpl_strtod
 #  endif
 #  define GNULIB_defined_strtod_function 1
-_GL_FUNCDECL_RPL (strtod, double, (const char *str, char **endp)
-                                  _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtod, double, (const char *str, char **endp));
+_GL_FUNCDECL_RPL (strtod, double,
+                  (const char *restrict str, char **restrict endp)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtod, double,
+                  (const char *restrict str, char **restrict endp));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (strtod, double, (const char *str, char **endp)
-                                  _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_SYS (strtod, double,
+                  (const char *restrict str, char **restrict endp)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (strtod, double, (const char *str, char **endp));
+_GL_CXXALIAS_SYS (strtod, double,
+                  (const char *restrict str, char **restrict endp));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (strtod);
@@ -1486,15 +1847,19 @@
 #   define strtold rpl_strtold
 #  endif
 #  define GNULIB_defined_strtold_function 1
-_GL_FUNCDECL_RPL (strtold, long double, (const char *str, char **endp)
-                                        _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtold, long double, (const char *str, char **endp));
+_GL_FUNCDECL_RPL (strtold, long double,
+                  (const char *restrict str, char **restrict endp)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtold, long double,
+                  (const char *restrict str, char **restrict endp));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (strtold, long double, (const char *str, char **endp)
-                                        _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_SYS (strtold, long double,
+                  (const char *restrict str, char **restrict endp)
+                  _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (strtold, long double, (const char *str, char **endp));
+_GL_CXXALIAS_SYS (strtold, long double,
+                  (const char *restrict str, char **restrict endp));
 # endif
 _GL_CXXALIASWARN (strtold);
 #elif defined GNULIB_POSIXCHECK
@@ -1512,15 +1877,72 @@
    "0x").
    If ENDPTR is not NULL, the address of the first byte after the integer is
    stored in *ENDPTR.
+   Upon overflow, the return value is LONG_MAX or LONG_MIN, and errno is set
+   to ERANGE.  */
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtol rpl_strtol
+#  endif
+#  define GNULIB_defined_strtol_function 1
+_GL_FUNCDECL_RPL (strtol, long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtol, long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (strtol, long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strtol, long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# endif
+_GL_CXXALIASWARN (strtol);
+#elif defined GNULIB_POSIXCHECK
+# undef strtol
+# if HAVE_RAW_DECL_STRTOL
+_GL_WARN_ON_USE (strtol, "strtol is unportable - "
+                 "use gnulib module strtol for portability");
+# endif
+#endif
+
+#if 0
+/* Parse a signed integer whose textual representation starts at STRING.
+   The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+   it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+   "0x").
+   If ENDPTR is not NULL, the address of the first byte after the integer is
+   stored in *ENDPTR.
    Upon overflow, the return value is LLONG_MAX or LLONG_MIN, and errno is set
    to ERANGE.  */
-# if !1
-_GL_FUNCDECL_SYS (strtoll, long long,
-                  (const char *string, char **endptr, int base)
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtoll rpl_strtoll
+#  endif
+#  define GNULIB_defined_strtoll_function 1
+_GL_FUNCDECL_RPL (strtoll, long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
                   _GL_ARG_NONNULL ((1)));
-# endif
+_GL_CXXALIAS_RPL (strtoll, long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (strtoll, long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
 _GL_CXXALIAS_SYS (strtoll, long long,
-                  (const char *string, char **endptr, int base));
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# endif
 _GL_CXXALIASWARN (strtoll);
 #elif defined GNULIB_POSIXCHECK
 # undef strtoll
@@ -1537,15 +1959,71 @@
    "0x").
    If ENDPTR is not NULL, the address of the first byte after the integer is
    stored in *ENDPTR.
+   Upon overflow, the return value is ULONG_MAX, and errno is set to ERANGE.  */
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtoul rpl_strtoul
+#  endif
+#  define GNULIB_defined_strtoul_function 1
+_GL_FUNCDECL_RPL (strtoul, unsigned long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoul, unsigned long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (strtoul, unsigned long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strtoul, unsigned long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# endif
+_GL_CXXALIASWARN (strtoul);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoul
+# if HAVE_RAW_DECL_STRTOUL
+_GL_WARN_ON_USE (strtoul, "strtoul is unportable - "
+                 "use gnulib module strtoul for portability");
+# endif
+#endif
+
+#if 0
+/* Parse an unsigned integer whose textual representation starts at STRING.
+   The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+   it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+   "0x").
+   If ENDPTR is not NULL, the address of the first byte after the integer is
+   stored in *ENDPTR.
    Upon overflow, the return value is ULLONG_MAX, and errno is set to
    ERANGE.  */
-# if !1
-_GL_FUNCDECL_SYS (strtoull, unsigned long long,
-                  (const char *string, char **endptr, int base)
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtoull rpl_strtoull
+#  endif
+#  define GNULIB_defined_strtoull_function 1
+_GL_FUNCDECL_RPL (strtoull, unsigned long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
                   _GL_ARG_NONNULL ((1)));
-# endif
+_GL_CXXALIAS_RPL (strtoull, unsigned long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (strtoull, unsigned long long,
+                  (const char *restrict string, char **restrict endptr,
+                   int base)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
 _GL_CXXALIAS_SYS (strtoull, unsigned long long,
-                  (const char *string, char **endptr, int base));
+                  (const char *restrict string, char **restrict endptr,
+                   int base));
+# endif
 _GL_CXXALIASWARN (strtoull);
 #elif defined GNULIB_POSIXCHECK
 # undef strtoull
diff --git a/linux_musl-lib/string.h b/linux_musl-lib/string.h
index 0ed1438..b6a66e5 100644
--- a/linux_musl-lib/string.h
+++ b/linux_musl-lib/string.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A GNU-like <string.h>.
 
-   Copyright (C) 1995-1996, 2001-2019 Free Software Foundation, Inc.
+   Copyright (C) 1995-1996, 2001-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 #pragma GCC system_header
@@ -53,14 +53,6 @@
 # include <wchar.h>
 #endif
 
-/* The __attribute__ feature is available in gcc versions 2.5 and later.
-   The attribute __pure__ was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define _GL_ATTRIBUTE_PURE /* empty */
-#endif
-
 /* NetBSD 5.0 declares strsignal in <unistd.h>, not in <string.h>.  */
 /* But in any case avoid namespace pollution on glibc systems.  */
 #if (0 || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \
@@ -68,21 +60,39 @@
 # include <unistd.h>
 #endif
 
+/* AIX 7.2 declares ffsl and ffsll in <strings.h>, not in <string.h>.  */
+/* But in any case avoid namespace pollution on glibc systems.  */
+#if ((1 || 0 || defined GNULIB_POSIXCHECK) \
+     && defined _AIX) \
+    && ! defined __GLIBC__
+# include <strings.h>
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The attribute __pure__ was added in gcc 2.96.  */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
+#endif
+
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -217,6 +227,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -242,6 +262,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -339,7 +367,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -367,14 +395,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -388,26 +413,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -416,19 +441,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -504,6 +529,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -516,24 +548,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -547,6 +590,13 @@
 # endif
 #endif
 
+/* Declare 'free' if needed for _GL_ATTRIBUTE_DEALLOC_FREE.  */
+#if (1 && !defined free \
+     && !(defined __cplusplus && defined GNULIB_NAMESPACE))
+_GL_EXTERN_C void free (void *);
+# define free rpl_free
+#endif
+_GL_EXTERN_C void free (void *);
 
 /* Clear a block of memory.  The compiler will not delete a call to
    this function, even if the block is dead after the call.  */
@@ -566,7 +616,7 @@
 #endif
 
 /* Find the index of the least-significant set bit.  */
-#if 0
+#if 1
 # if !1
 _GL_FUNCDECL_SYS (ffsl, int, (long int i));
 # endif
@@ -582,10 +632,18 @@
 
 /* Find the index of the least-significant set bit.  */
 #if 0
-# if !1
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define ffsll rpl_ffsll
+#  endif
+_GL_FUNCDECL_RPL (ffsll, int, (long long int i));
+_GL_CXXALIAS_RPL (ffsll, int, (long long int i));
+# else
+#  if !1
 _GL_FUNCDECL_SYS (ffsll, int, (long long int i));
-# endif
+#  endif
 _GL_CXXALIAS_SYS (ffsll, int, (long long int i));
+# endif
 _GL_CXXALIASWARN (ffsll);
 #elif defined GNULIB_POSIXCHECK
 # undef ffsll
@@ -595,10 +653,30 @@
 #endif
 
 
+#if 1
+/* On native Windows, map 'memccpy' to '_memccpy', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::memccpy always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef memccpy
+#   define memccpy _memccpy
+#  endif
+_GL_CXXALIAS_MDA (memccpy, void *,
+                  (void *dest, const void *src, int c, size_t n));
+# else
+_GL_CXXALIAS_SYS (memccpy, void *,
+                  (void *dest, const void *src, int c, size_t n));
+# endif
+_GL_CXXALIASWARN (memccpy);
+#endif
+
+
 /* Return the first instance of C within N bytes of S, or NULL.  */
 #if 1
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef memchr
 #   define memchr rpl_memchr
 #  endif
 _GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n)
@@ -606,11 +684,6 @@
                                   _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n));
 # else
-#  if ! 1
-_GL_FUNCDECL_SYS (memchr, void *, (void const *__s, int __c, size_t __n)
-                                  _GL_ATTRIBUTE_PURE
-                                  _GL_ARG_NONNULL ((1)));
-#  endif
   /* On some systems, this function is defined as an overloaded function:
        extern "C" { const void * std::memchr (const void *, int, size_t); }
        extern "C++" { void * std::memchr (void *, int, size_t); }  */
@@ -671,7 +744,7 @@
 
 /* Copy N bytes of SRC to DEST, return pointer to bytes after the
    last written byte.  */
-#if 0
+#if 1
 # if ! 1
 _GL_FUNCDECL_SYS (mempcpy, void *,
                   (void *restrict __dest, void const *restrict __src,
@@ -721,8 +794,8 @@
 /* Find the first occurrence of C in S.  More efficient than
    memchr(S,C,N), at the expense of undefined behavior if C does not
    occur within N bytes.  */
-#if 0
-# if ! 1
+#if 1
+# if ! 0
 _GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in)
                                      _GL_ATTRIBUTE_PURE
                                      _GL_ARG_NONNULL ((1)));
@@ -768,7 +841,7 @@
 
 /* Copy no more than N bytes of SRC to DST, returning a pointer past the
    last non-NUL byte written into DST.  */
-#if 0
+#if 1
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef stpncpy
@@ -806,9 +879,11 @@
    GB18030 and the character to be searched is a digit.  */
 # undef strchr
 /* Assume strchr is always declared.  */
-_GL_WARN_ON_USE (strchr, "strchr cannot work correctly on character strings "
-                 "in some multibyte locales - "
-                 "use mbschr if you care about internationalization");
+_GL_WARN_ON_USE_CXX (strchr,
+                     const char *, char *, (const char *, int),
+                     "strchr cannot work correctly on character strings "
+                     "in some multibyte locales - "
+                     "use mbschr if you care about internationalization");
 #endif
 
 /* Find the first occurrence of C in S or the final NUL byte.  */
@@ -857,24 +932,62 @@
 #   undef strdup
 #   define strdup rpl_strdup
 #  endif
-_GL_FUNCDECL_RPL (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
+_GL_FUNCDECL_RPL (strdup, char *,
+                  (char const *__s)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 _GL_CXXALIAS_RPL (strdup, char *, (char const *__s));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strdup
+#   define strdup _strdup
+#  endif
+_GL_CXXALIAS_MDA (strdup, char *, (char const *__s));
 # else
 #  if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
     /* strdup exists as a function and as a macro.  Get rid of the macro.  */
 #   undef strdup
 #  endif
-#  if !(1 || defined strdup)
-_GL_FUNCDECL_SYS (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
+#  if (!1 || __GNUC__ >= 11) && !defined strdup
+_GL_FUNCDECL_SYS (strdup, char *,
+                  (char const *__s)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
 #  endif
 _GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
 # endif
 _GL_CXXALIASWARN (strdup);
-#elif defined GNULIB_POSIXCHECK
-# undef strdup
-# if HAVE_RAW_DECL_STRDUP
+#else
+# if __GNUC__ >= 11 && !defined strdup
+/* For -Wmismatched-dealloc: Associate strdup with free or rpl_free.  */
+_GL_FUNCDECL_SYS (strdup, char *,
+                  (char const *__s)
+                  _GL_ARG_NONNULL ((1))
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef strdup
+#  if HAVE_RAW_DECL_STRDUP
 _GL_WARN_ON_USE (strdup, "strdup is unportable - "
                  "use gnulib module strdup for portability");
+#  endif
+# elif 1
+/* On native Windows, map 'creat' to '_creat', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::strdup always.  */
+#  if defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef strdup
+#    define strdup _strdup
+#   endif
+_GL_CXXALIAS_MDA (strdup, char *, (char const *__s));
+#  else
+#   if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
+#    undef strdup
+#   endif
+_GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
+#  endif
+_GL_CXXALIASWARN (strdup);
 # endif
 #endif
 
@@ -885,11 +998,14 @@
 #   undef strncat
 #   define strncat rpl_strncat
 #  endif
-_GL_FUNCDECL_RPL (strncat, char *, (char *dest, const char *src, size_t n)
-                                   _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (strncat, char *, (char *dest, const char *src, size_t n));
+_GL_FUNCDECL_RPL (strncat, char *,
+                  (char *restrict dest, const char *restrict src, size_t n)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strncat, char *,
+                  (char *restrict dest, const char *restrict src, size_t n));
 # else
-_GL_CXXALIAS_SYS (strncat, char *, (char *dest, const char *src, size_t n));
+_GL_CXXALIAS_SYS (strncat, char *,
+                  (char *restrict dest, const char *restrict src, size_t n));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (strncat);
@@ -997,15 +1113,19 @@
    locale encoding is GB18030 and one of the characters to be searched is a
    digit.  */
 #  undef strpbrk
-_GL_WARN_ON_USE (strpbrk, "strpbrk cannot work correctly on character strings "
-                 "in multibyte locales - "
-                 "use mbspbrk if you care about internationalization");
+_GL_WARN_ON_USE_CXX (strpbrk,
+                     const char *, char *, (const char *, const char *),
+                     "strpbrk cannot work correctly on character strings "
+                     "in multibyte locales - "
+                     "use mbspbrk if you care about internationalization");
 # endif
 #elif defined GNULIB_POSIXCHECK
 # undef strpbrk
 # if HAVE_RAW_DECL_STRPBRK
-_GL_WARN_ON_USE (strpbrk, "strpbrk is unportable - "
-                 "use gnulib module strpbrk for portability");
+_GL_WARN_ON_USE_CXX (strpbrk,
+                     const char *, char *, (const char *, const char *),
+                     "strpbrk is unportable - "
+                     "use gnulib module strpbrk for portability");
 # endif
 #endif
 
@@ -1024,9 +1144,11 @@
    GB18030 and the character to be searched is a digit.  */
 # undef strrchr
 /* Assume strrchr is always declared.  */
-_GL_WARN_ON_USE (strrchr, "strrchr cannot work correctly on character strings "
-                 "in some multibyte locales - "
-                 "use mbsrchr if you care about internationalization");
+_GL_WARN_ON_USE_CXX (strrchr,
+                     const char *, char *, (const char *, int),
+                     "strrchr cannot work correctly on character strings "
+                     "in some multibyte locales - "
+                     "use mbsrchr if you care about internationalization");
 #endif
 
 /* Search the next delimiter (char listed in DELIM) starting at *STRINGP.
@@ -1440,7 +1562,8 @@
    Caveat: The identity of the delimiting character is lost.
 
    See also mbssep().  */
-_GL_EXTERN_C char * mbstok_r (char *string, const char *delim, char **save_ptr)
+_GL_EXTERN_C char * mbstok_r (char *restrict string, const char *delim,
+                              char **save_ptr)
      _GL_ARG_NONNULL ((2, 3));
 #endif
 
@@ -1495,6 +1618,60 @@
 # endif
 #endif
 
+/* Return the name of the system error code ERRNUM.  */
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strerrorname_np
+#   define strerrorname_np rpl_strerrorname_np
+#  endif
+_GL_FUNCDECL_RPL (strerrorname_np, const char *, (int errnum));
+_GL_CXXALIAS_RPL (strerrorname_np, const char *, (int errnum));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (strerrorname_np, const char *, (int errnum));
+#  endif
+_GL_CXXALIAS_SYS (strerrorname_np, const char *, (int errnum));
+# endif
+_GL_CXXALIASWARN (strerrorname_np);
+#elif defined GNULIB_POSIXCHECK
+# undef strerrorname_np
+# if HAVE_RAW_DECL_STRERRORNAME_NP
+_GL_WARN_ON_USE (strerrorname_np, "strerrorname_np is unportable - "
+                 "use gnulib module strerrorname_np for portability");
+# endif
+#endif
+
+/* Return an abbreviation string for the signal number SIG.  */
+#if 0
+# if ! 1
+_GL_FUNCDECL_SYS (sigabbrev_np, const char *, (int sig));
+# endif
+_GL_CXXALIAS_SYS (sigabbrev_np, const char *, (int sig));
+_GL_CXXALIASWARN (sigabbrev_np);
+#elif defined GNULIB_POSIXCHECK
+# undef sigabbrev_np
+# if HAVE_RAW_DECL_SIGABBREV_NP
+_GL_WARN_ON_USE (sigabbrev_np, "sigabbrev_np is unportable - "
+                 "use gnulib module sigabbrev_np for portability");
+# endif
+#endif
+
+/* Return an English description string for the signal number SIG.  */
+#if 0
+# if ! 1
+_GL_FUNCDECL_SYS (sigdescr_np, const char *, (int sig));
+# endif
+_GL_CXXALIAS_SYS (sigdescr_np, const char *, (int sig));
+_GL_CXXALIASWARN (sigdescr_np);
+#elif defined GNULIB_POSIXCHECK
+# undef sigdescr_np
+# if HAVE_RAW_DECL_SIGDESCR_NP
+_GL_WARN_ON_USE (sigdescr_np, "sigdescr_np is unportable - "
+                 "use gnulib module sigdescr_np for portability");
+# endif
+#endif
+
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
diff --git a/linux_musl-lib/termios.h b/linux_musl-lib/termios.h
new file mode 100644
index 0000000..5865c9c
--- /dev/null
+++ b/linux_musl-lib/termios.h
@@ -0,0 +1,554 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Substitute for and wrapper around <termios.h>.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_TERMIOS_H
+
+#if __GNUC__ >= 3
+#pragma GCC system_header
+#endif
+
+
+/* On HP-UX 11.00, some of the function declarations in <sys/termio.h>,
+   included by <termios.h>, are not protected by extern "C".  Enforce
+   "C" linkage for these functions nevertheless.  */
+#if defined __hpux && defined __cplusplus
+# include <sys/types.h>
+# include <sys/ioctl.h>
+extern "C" {
+# include <sys/termio.h>
+}
+#endif
+
+/* The include_next requires a split double-inclusion guard.  */
+#if 1
+# include_next <termios.h>
+#endif
+
+#ifndef _GL_TERMIOS_H
+#define _GL_TERMIOS_H
+
+/* Get pid_t.  */
+#include <sys/types.h>
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+/* C++ compatible function declaration macros.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_CXXDEFS_H
+#define _GL_CXXDEFS_H
+
+/* Begin/end the GNULIB_NAMESPACE namespace.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
+# define _GL_END_NAMESPACE }
+#else
+# define _GL_BEGIN_NAMESPACE
+# define _GL_END_NAMESPACE
+#endif
+
+/* The three most frequent use cases of these macros are:
+
+   * For providing a substitute for a function that is missing on some
+     platforms, but is declared and works fine on the platforms on which
+     it exists:
+
+       #if @GNULIB_FOO@
+       # if !@HAVE_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       # endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on all platforms,
+     but is broken/insufficient and needs to be replaced on some platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on some platforms
+     but is broken/insufficient and needs to be replaced on some of them and
+     is additionally either missing or undeclared on some other platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       #  if !@HAVE_FOO@   or   if !@HAVE_DECL_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       #  endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+*/
+
+/* _GL_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#if defined __cplusplus
+# define _GL_EXTERN_C extern "C"
+#else
+# define _GL_EXTERN_C extern
+#endif
+
+/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
+   declares a replacement function, named rpl_func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
+  _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
+#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype rpl_func parameters_and_attributes
+
+/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
+   declares the system function, named func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype func parameters_and_attributes
+
+/* _GL_CXXALIAS_RPL (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+
+   Wrapping rpl_func in an object with an inline conversion operator
+   avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::rpl_func;                                  \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
+   is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
+   except that the C function rpl_func may have a slightly different
+   declaration.  A cast is used to silence the "invalid conversion" error
+   that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                     \
+    {                                                              \
+      static const struct _gl_ ## func ## _wrapper                 \
+      {                                                            \
+        typedef rettype (*type) parameters;                        \
+                                                                   \
+        inline operator type () const                              \
+        {                                                          \
+          return reinterpret_cast<type>(::rpl_func);               \
+        }                                                          \
+      } func = {};                                                 \
+    }                                                              \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_SYS (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to the system provided function func, if GNULIB_NAMESPACE
+   is defined.
+   Example:
+     _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+
+   Wrapping func in an object with an inline conversion operator
+   avoids a reference to func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS(func,rettype,parameters)            \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::func;                                      \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                          \
+    {                                                   \
+      static const struct _gl_ ## func ## _wrapper      \
+      {                                                 \
+        typedef rettype (*type) parameters;             \
+                                                        \
+        inline operator type () const                   \
+        {                                               \
+          return reinterpret_cast<type>(::func);        \
+        }                                               \
+      } func = {};                                      \
+    }                                                   \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function is picked among a set of overloaded functions,
+   namely the one with rettype2 and parameters2.  Two consecutive casts
+   are used to silence the "cannot find a match" and "invalid conversion"
+   errors that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+  /* The outer cast must be a reinterpret_cast.
+     The inner cast: When the function is defined as a set of overloaded
+     functions, it works as a static_cast<>, choosing the designated variant.
+     When the function is defined as a single variant, it works as a
+     reinterpret_cast<>. The parenthesized cast syntax works both ways.  */
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    namespace GNULIB_NAMESPACE                                                \
+    {                                                                         \
+      static const struct _gl_ ## func ## _wrapper                            \
+      {                                                                       \
+        typedef rettype (*type) parameters;                                   \
+                                                                              \
+        inline operator type () const                                         \
+        {                                                                     \
+          return reinterpret_cast<type>((rettype2 (*) parameters2)(::func));  \
+        }                                                                     \
+      } func = {};                                                            \
+    }                                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN (func);
+   causes a warning to be emitted when ::func is used but not when
+   GNULIB_NAMESPACE::func is used.  func must be defined without overloaded
+   variants.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN(func) \
+   _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN_1(func,namespace) \
+   _GL_CXXALIASWARN_2 (func, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+    _GL_WARN_ON_USE (func, \
+                     "The symbol ::" #func " refers to the system function. " \
+                     "Use " #namespace "::" #func " instead.")
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     extern __typeof__ (func) func
+# else
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN(func) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
+   causes a warning to be emitted when the given overloaded variant of ::func
+   is used but not when GNULIB_NAMESPACE::func is used.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+   _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
+                        GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
+   _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
+                         "The symbol ::" #func " refers to the system function. " \
+                         "Use " #namespace "::" #func " instead.")
+# else
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+#endif /* _GL_CXXDEFS_H */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+/* A C macro for emitting warnings if a function is used.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
+   for FUNCTION which will then trigger a compiler warning containing
+   the text of "literal string" anywhere that function is called, if
+   supported by the compiler.  If the compiler does not support this
+   feature, the macro expands to an unused extern declaration.
+
+   _GL_WARN_ON_USE_ATTRIBUTE ("literal string") expands to the
+   attribute used in _GL_WARN_ON_USE.  If the compiler does not support
+   this feature, it expands to empty.
+
+   These macros are useful for marking a function as a potential
+   portability trap, with the intent that "literal string" include
+   instructions on the replacement function that should be used
+   instead.
+   _GL_WARN_ON_USE is for functions with 'extern' linkage.
+   _GL_WARN_ON_USE_ATTRIBUTE is for functions with 'static' or 'inline'
+   linkage.
+
+   However, one of the reasons that a function is a portability trap is
+   if it has the wrong signature.  Declaring FUNCTION with a different
+   signature in C is a compilation error, so this macro must use the
+   same type as any existing declaration so that programs that avoid
+   the problematic FUNCTION do not fail to compile merely because they
+   included a header that poisoned the function.  But this implies that
+   _GL_WARN_ON_USE is only safe to use if FUNCTION is known to already
+   have a declaration.  Use of this macro implies that there must not
+   be any other macro hiding the declaration of FUNCTION; but
+   undefining FUNCTION first is part of the poisoning process anyway
+   (although for symbols that are provided only via a macro, the result
+   is a compilation error rather than a warning containing
+   "literal string").  Also note that in C++, it is only safe to use if
+   FUNCTION has no overloads.
+
+   For an example, it is possible to poison 'getline' by:
+   - adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
+     [getline]) in configure.ac, which potentially defines
+     HAVE_RAW_DECL_GETLINE
+   - adding this code to a header that wraps the system <stdio.h>:
+     #undef getline
+     #if HAVE_RAW_DECL_GETLINE
+     _GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
+       "not universally present; use the gnulib module getline");
+     #endif
+
+   It is not possible to directly poison global variables.  But it is
+   possible to write a wrapper accessor function, and poison that
+   (less common usage, like &environ, will cause a compilation error
+   rather than issue the nice warning, but the end result of informing
+   the developer about their portability problem is still achieved):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     rpl_environ (void) { return &environ; }
+     _GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   or better (avoiding contradictory use of 'static' and 'extern'):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     _GL_WARN_ON_USE_ATTRIBUTE ("environ is not always properly declared")
+     rpl_environ (void) { return &environ; }
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   */
+#ifndef _GL_WARN_ON_USE
+
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# else /* Unsupported.  */
+#  define _GL_WARN_ON_USE(function, message) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# endif
+#endif
+
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
+   This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
+   not work in this case.  */
+#ifndef _GL_WARN_ON_USE_CXX
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
+# endif
+#endif
+
+/* _GL_WARN_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#ifndef _GL_WARN_EXTERN_C
+# if defined __cplusplus
+#  define _GL_WARN_EXTERN_C extern "C"
+# else
+#  define _GL_WARN_EXTERN_C extern
+# endif
+#endif
+
+
+/* Declare overridden functions.  */
+
+#if 0
+/* Return the session ID of the controlling terminal of the current process.
+   The argument is a descriptor if this controlling terminal.
+   Return -1, with errno set, upon failure.  errno = ENOSYS means that the
+   function is unsupported.  */
+# if !1
+_GL_FUNCDECL_SYS (tcgetsid, pid_t, (int fd));
+# endif
+_GL_CXXALIAS_SYS (tcgetsid, pid_t, (int fd));
+_GL_CXXALIASWARN (tcgetsid);
+#elif defined GNULIB_POSIXCHECK
+# undef tcgetsid
+# if HAVE_RAW_DECL_TCGETSID
+_GL_WARN_ON_USE (tcgetsid, "tcgetsid is not portable - "
+                 "use gnulib module tcgetsid for portability");
+# endif
+#endif
+
+
+#endif /* _GL_TERMIOS_H */
+#endif /* _GL_TERMIOS_H */
diff --git a/linux_musl-lib/textstyle.h b/linux_musl-lib/textstyle.h
index 3011cad..42fddfc 100644
--- a/linux_musl-lib/textstyle.h
+++ b/linux_musl-lib/textstyle.h
@@ -1,6 +1,6 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Dummy replacement for part of the public API of the libtextstyle library.
-   Copyright (C) 2006-2007, 2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2007, 2019-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -43,6 +43,32 @@
 # include <termios.h>
 #endif
 
+/* An __attribute__ __format__ specifier for a function that takes a format
+   string and arguments, where the format string directives are the ones
+   standardized by ISO C99 and POSIX.
+   _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD  */
+/* __gnu_printf__ is supported in GCC >= 4.4.  */
+#ifndef _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD
+# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+#  define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __gnu_printf__
+# else
+#  define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __printf__
+# endif
+#endif
+
+/* _GL_ATTRIBUTE_MAYBE_UNUSED declares that it is not a programming mistake if
+   the entity is not used.  The compiler should not warn if the entity is not
+   used.  */
+#ifndef _GL_ATTRIBUTE_MAYBE_UNUSED
+# if 0 /* no GCC or clang version supports this yet */
+#  define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
+# elif defined __GNUC__ || defined __clang__
+#  define _GL_ATTRIBUTE_MAYBE_UNUSED __attribute__ ((__unused__))
+# else
+#  define _GL_ATTRIBUTE_MAYBE_UNUSED
+# endif
+#endif
+
 /* ----------------------------- From ostream.h ----------------------------- */
 
 /* Describes the scope of a flush operation.  */
@@ -116,8 +142,8 @@
 
 static inline ptrdiff_t ostream_printf (ostream_t stream,
                                         const char *format, ...)
-#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ > 3
-  __attribute__ ((__format__ (__printf__, 2, 3)))
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || defined __clang__
+  __attribute__ ((__format__ (_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 2, 3)))
 #endif
   ;
 static inline ptrdiff_t
@@ -141,8 +167,8 @@
 
 static inline ptrdiff_t ostream_vprintf (ostream_t stream,
                                          const char *format, va_list args)
-#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ > 3
-  __attribute__ ((__format__ (__printf__, 2, 0)))
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || defined __clang__
+  __attribute__ ((__format__ (_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 2, 0)))
 #endif
   ;
 static inline ptrdiff_t
@@ -168,38 +194,38 @@
 #define styled_ostream_free ostream_free
 
 static inline void
-styled_ostream_begin_use_class (styled_ostream_t stream _GL_UNUSED,
-                                const char *classname _GL_UNUSED)
+styled_ostream_begin_use_class (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream,
+                                _GL_ATTRIBUTE_MAYBE_UNUSED const char *classname)
 {
 }
 
 static inline void
-styled_ostream_end_use_class (styled_ostream_t stream _GL_UNUSED,
-                              const char *classname _GL_UNUSED)
+styled_ostream_end_use_class (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream,
+                              _GL_ATTRIBUTE_MAYBE_UNUSED const char *classname)
 {
 }
 
 static inline const char *
-styled_ostream_get_hyperlink_ref (styled_ostream_t stream _GL_UNUSED)
+styled_ostream_get_hyperlink_ref (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream)
 {
   return NULL;
 }
 
 static inline const char *
-styled_ostream_get_hyperlink_id (styled_ostream_t stream _GL_UNUSED)
+styled_ostream_get_hyperlink_id (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream)
 {
   return NULL;
 }
 
 static inline void
-styled_ostream_set_hyperlink (styled_ostream_t stream _GL_UNUSED,
-                              const char *ref _GL_UNUSED,
-                              const char *id _GL_UNUSED)
+styled_ostream_set_hyperlink (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream,
+                              _GL_ATTRIBUTE_MAYBE_UNUSED const char *ref,
+                              _GL_ATTRIBUTE_MAYBE_UNUSED const char *id)
 {
 }
 
 static inline void
-styled_ostream_flush_to_current_style (styled_ostream_t stream _GL_UNUSED)
+styled_ostream_flush_to_current_style (_GL_ATTRIBUTE_MAYBE_UNUSED styled_ostream_t stream)
 {
 }
 
@@ -226,8 +252,8 @@
 #define fd_ostream_free ostream_free
 
 static inline fd_ostream_t
-fd_ostream_create (int fd, const char *filename _GL_UNUSED,
-                   bool buffered _GL_UNUSED)
+fd_ostream_create (int fd, _GL_ATTRIBUTE_MAYBE_UNUSED const char *filename,
+                   _GL_ATTRIBUTE_MAYBE_UNUSED bool buffered)
 {
   if (fd == 1)
     return stdout;
@@ -273,81 +299,81 @@
 #define term_ostream_free ostream_free
 
 static inline term_color_t
-term_ostream_get_color (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_color (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return COLOR_DEFAULT;
 }
 
 static inline void
-term_ostream_set_color (term_ostream_t stream _GL_UNUSED,
-                        term_color_t color _GL_UNUSED)
+term_ostream_set_color (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                        _GL_ATTRIBUTE_MAYBE_UNUSED term_color_t color)
 {
 }
 
 static inline term_color_t
-term_ostream_get_bgcolor (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_bgcolor (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return COLOR_DEFAULT;
 }
 
 static inline void
-term_ostream_set_bgcolor (term_ostream_t stream _GL_UNUSED,
-                          term_color_t color _GL_UNUSED)
+term_ostream_set_bgcolor (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                          _GL_ATTRIBUTE_MAYBE_UNUSED term_color_t color)
 {
 }
 
 static inline term_weight_t
-term_ostream_get_weight (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_weight (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return WEIGHT_DEFAULT;
 }
 
 static inline void
-term_ostream_set_weight (term_ostream_t stream _GL_UNUSED,
-                         term_weight_t weight _GL_UNUSED)
+term_ostream_set_weight (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                         _GL_ATTRIBUTE_MAYBE_UNUSED term_weight_t weight)
 {
 }
 
 static inline term_posture_t
-term_ostream_get_posture (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_posture (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return POSTURE_DEFAULT;
 }
 
 static inline void
-term_ostream_set_posture (term_ostream_t stream _GL_UNUSED,
-                          term_posture_t posture _GL_UNUSED)
+term_ostream_set_posture (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                          _GL_ATTRIBUTE_MAYBE_UNUSED term_posture_t posture)
 {
 }
 
 static inline term_underline_t
-term_ostream_get_underline (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_underline (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return UNDERLINE_DEFAULT;
 }
 
 static inline void
-term_ostream_set_underline (term_ostream_t stream _GL_UNUSED,
-                            term_underline_t underline _GL_UNUSED)
+term_ostream_set_underline (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED term_underline_t underline)
 {
 }
 
 static inline const char *
-term_ostream_get_hyperlink_ref (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_hyperlink_ref (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return NULL;
 }
 
 static inline const char *
-term_ostream_get_hyperlink_id (term_ostream_t stream _GL_UNUSED)
+term_ostream_get_hyperlink_id (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream)
 {
   return NULL;
 }
 
 static inline void
-term_ostream_set_hyperlink (term_ostream_t stream _GL_UNUSED,
-                            const char *ref _GL_UNUSED,
-                            const char *id _GL_UNUSED)
+term_ostream_set_hyperlink (_GL_ATTRIBUTE_MAYBE_UNUSED term_ostream_t stream,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED const char *ref,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED const char *id)
 {
 }
 
@@ -375,7 +401,7 @@
 
 static inline term_ostream_t
 term_ostream_create (int fd, const char *filename,
-                     ttyctl_t tty_control _GL_UNUSED)
+                     _GL_ATTRIBUTE_MAYBE_UNUSED ttyctl_t tty_control)
 {
   return fd_ostream_create (fd, filename, true);
 }
@@ -396,8 +422,8 @@
 
 static inline term_styled_ostream_t
 term_styled_ostream_create (int fd, const char *filename,
-                            ttyctl_t tty_control _GL_UNUSED,
-                            const char *css_filename _GL_UNUSED)
+                            _GL_ATTRIBUTE_MAYBE_UNUSED ttyctl_t tty_control,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED const char *css_filename)
 {
   return fd_ostream_create (fd, filename, true);
 }
@@ -407,8 +433,8 @@
 typedef styled_ostream_t html_styled_ostream_t;
 
 static inline html_styled_ostream_t
-html_styled_ostream_create (ostream_t destination _GL_UNUSED,
-                            const char *css_filename _GL_UNUSED)
+html_styled_ostream_create (_GL_ATTRIBUTE_MAYBE_UNUSED ostream_t destination,
+                            _GL_ATTRIBUTE_MAYBE_UNUSED const char *css_filename)
 {
   abort ();
   return NULL;
@@ -424,13 +450,13 @@
 #define style_file_name NULL
 
 static inline bool
-handle_color_option (const char *option _GL_UNUSED)
+handle_color_option (_GL_ATTRIBUTE_MAYBE_UNUSED const char *option)
 {
   return false;
 }
 
 static inline void
-handle_style_option (const char *option _GL_UNUSED)
+handle_style_option (_GL_ATTRIBUTE_MAYBE_UNUSED const char *option)
 {
 }
 
@@ -441,10 +467,10 @@
 }
 
 static inline void
-style_file_prepare (const char *style_file_envvar _GL_UNUSED,
-                    const char *stylesdir_envvar _GL_UNUSED,
-                    const char *stylesdir_after_install _GL_UNUSED,
-                    const char *default_style_file _GL_UNUSED)
+style_file_prepare (_GL_ATTRIBUTE_MAYBE_UNUSED const char *style_file_envvar,
+                    _GL_ATTRIBUTE_MAYBE_UNUSED const char *stylesdir_envvar,
+                    _GL_ATTRIBUTE_MAYBE_UNUSED const char *stylesdir_after_install,
+                    _GL_ATTRIBUTE_MAYBE_UNUSED const char *default_style_file)
 {
 }
 
@@ -452,14 +478,14 @@
 
 static inline styled_ostream_t
 styled_ostream_create (int fd, const char *filename,
-                       ttyctl_t tty_control _GL_UNUSED,
-                       const char *css_filename _GL_UNUSED)
+                       _GL_ATTRIBUTE_MAYBE_UNUSED ttyctl_t tty_control,
+                       _GL_ATTRIBUTE_MAYBE_UNUSED const char *css_filename)
 {
   return fd_ostream_create (fd, filename, true);
 }
 
 static inline void
-libtextstyle_set_failure_exit_code (int exit_code _GL_UNUSED)
+libtextstyle_set_failure_exit_code (_GL_ATTRIBUTE_MAYBE_UNUSED int exit_code)
 {
 }
 
diff --git a/linux_musl-lib/time.h b/linux_musl-lib/time.h
index 1262e7c..1d9ad11 100644
--- a/linux_musl-lib/time.h
+++ b/linux_musl-lib/time.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A more-standard <time.h>.
 
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #if __GNUC__ >= 3
 #pragma GCC system_header
@@ -51,19 +51,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -198,6 +198,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -223,6 +233,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -320,7 +338,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -348,14 +366,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -369,26 +384,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -397,19 +412,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -485,6 +500,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -497,24 +519,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -575,6 +608,25 @@
 #  define GNULIB_defined_struct_time_t_must_be_integral 1
 # endif
 
+/* Define TIME_UTC, a positive integer constant used for timespec_get().  */
+# if ! 1
+#  if !GNULIB_defined_TIME_UTC
+#   define TIME_UTC 1
+#   define GNULIB_defined_TIME_UTC 1
+#  endif
+# endif
+
+/* Set *TS to the current time, and return BASE.
+   Upon failure, return 0.  */
+# if 0
+#  if ! 1
+_GL_FUNCDECL_SYS (timespec_get, int, (struct timespec *ts, int base)
+                                     _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (timespec_get, int, (struct timespec *ts, int base));
+_GL_CXXALIASWARN (timespec_get);
+# endif
+
 /* Sleep for at least RQTP seconds unless interrupted,  If interrupted,
    return -1 and store the remaining time into RMTP.  See
    <https://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html>.  */
@@ -609,10 +661,27 @@
 #   endif
 _GL_FUNCDECL_RPL (tzset, void, (void));
 _GL_CXXALIAS_RPL (tzset, void, (void));
-#  else
-#   if ! 1
-_GL_FUNCDECL_SYS (tzset, void, (void));
+#  elif defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef tzset
+#    define tzset _tzset
 #   endif
+_GL_CXXALIAS_MDA (tzset, void, (void));
+#  else
+_GL_CXXALIAS_SYS (tzset, void, (void));
+#  endif
+_GL_CXXALIASWARN (tzset);
+# elif 1
+/* On native Windows, map 'tzset' to '_tzset', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::tzset always.  */
+#  if defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef tzset
+#    define tzset _tzset
+#   endif
+_GL_CXXALIAS_MDA (tzset, void, (void));
+#  else
 _GL_CXXALIAS_SYS (tzset, void, (void));
 #  endif
 _GL_CXXALIASWARN (tzset);
@@ -760,14 +829,17 @@
 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #    define strftime rpl_strftime
 #   endif
-_GL_FUNCDECL_RPL (strftime, size_t, (char *__buf, size_t __bufsize,
-                                     const char *__fmt, const struct tm *__tp)
-                                    _GL_ARG_NONNULL ((1, 3, 4)));
-_GL_CXXALIAS_RPL (strftime, size_t, (char *__buf, size_t __bufsize,
-                                     const char *__fmt, const struct tm *__tp));
+_GL_FUNCDECL_RPL (strftime, size_t,
+                  (char *restrict __buf, size_t __bufsize,
+                   const char *restrict __fmt, const struct tm *restrict __tp)
+                  _GL_ARG_NONNULL ((1, 3, 4)));
+_GL_CXXALIAS_RPL (strftime, size_t,
+                  (char *restrict __buf, size_t __bufsize,
+                   const char *restrict __fmt, const struct tm *restrict __tp));
 #  else
-_GL_CXXALIAS_SYS (strftime, size_t, (char *__buf, size_t __bufsize,
-                                     const char *__fmt, const struct tm *__tp));
+_GL_CXXALIAS_SYS (strftime, size_t,
+                  (char *restrict __buf, size_t __bufsize,
+                   const char *restrict __fmt, const struct tm *restrict __tp));
 #  endif
 #  if __GLIBC__ >= 2
 _GL_CXXALIASWARN (strftime);
@@ -775,22 +847,60 @@
 # endif
 
 # if defined _GNU_SOURCE && 0 && ! 0
+/* Functions that use a first-class time zone data type, instead of
+   relying on an implicit global time zone.
+   Inspired by NetBSD.  */
+
+/* Represents a time zone.
+   (timezone_t) NULL stands for UTC.  */
 typedef struct tm_zone *timezone_t;
+
+/* tzalloc (name)
+   Returns a time zone object for the given time zone NAME.  This object
+   represents the time zone that other functions would use it the TZ
+   environment variable was set to NAME.
+   If NAME is NULL, the result represents the time zone that other functions
+   would use it the TZ environment variable was unset.
+   May return NULL if NAME is invalid (this is platform dependent) or
+   upon memory allocation failure.  */
 _GL_FUNCDECL_SYS (tzalloc, timezone_t, (char const *__name));
 _GL_CXXALIAS_SYS (tzalloc, timezone_t, (char const *__name));
+
+/* tzfree (tz)
+   Frees a time zone object.
+   The argument must have been returned by tzalloc().  */
 _GL_FUNCDECL_SYS (tzfree, void, (timezone_t __tz));
 _GL_CXXALIAS_SYS (tzfree, void, (timezone_t __tz));
+
+/* localtime_rz (tz, &t, &result)
+   Converts an absolute time T to a broken-down time RESULT, assuming the
+   time zone TZ.
+   This function is like 'localtime_r', but relies on the argument TZ instead
+   of an implicit global time zone.  */
 _GL_FUNCDECL_SYS (localtime_rz, struct tm *,
                   (timezone_t __tz, time_t const *restrict __timer,
                    struct tm *restrict __result) _GL_ARG_NONNULL ((2, 3)));
 _GL_CXXALIAS_SYS (localtime_rz, struct tm *,
                   (timezone_t __tz, time_t const *restrict __timer,
                    struct tm *restrict __result));
+
+/* mktime_z (tz, &tm)
+   Normalizes the broken-down time TM and converts it to an absolute time,
+   assuming the time zone TZ.  Returns the absolute time.
+   This function is like 'mktime', but relies on the argument TZ instead
+   of an implicit global time zone.  */
 _GL_FUNCDECL_SYS (mktime_z, time_t,
-                  (timezone_t __tz, struct tm *restrict __result)
+                  (timezone_t __tz, struct tm *restrict __tm)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_SYS (mktime_z, time_t,
-                  (timezone_t __tz, struct tm *restrict __result));
+                  (timezone_t __tz, struct tm *restrict __tm));
+
+/* Time zone abbreviation strings (returned by 'localtime_rz' or 'mktime_z'
+   in the 'tm_zone' member of 'struct tm') are valid as long as
+     - the 'struct tm' argument is not destroyed or overwritten,
+   and
+     - the 'timezone_t' argument is not freed through tzfree().  */
+
 # endif
 
 /* Convert TM to a time_t value, assuming UTC.  */
@@ -821,17 +931,17 @@
 # endif
 # if defined GNULIB_POSIXCHECK
 #  undef asctime_r
-_GL_WARN_ON_USE (asctime, "asctime_r can overrun buffers in some cases - "
+_GL_WARN_ON_USE (asctime_r, "asctime_r can overrun buffers in some cases - "
                  "better use strftime (or even sprintf) instead");
 # endif
 # if defined GNULIB_POSIXCHECK
 #  undef ctime
-_GL_WARN_ON_USE (asctime, "ctime can overrun buffers in some cases - "
+_GL_WARN_ON_USE (ctime, "ctime can overrun buffers in some cases - "
                  "better use strftime (or even sprintf) instead");
 # endif
 # if defined GNULIB_POSIXCHECK
 #  undef ctime_r
-_GL_WARN_ON_USE (asctime, "ctime_r can overrun buffers in some cases - "
+_GL_WARN_ON_USE (ctime_r, "ctime_r can overrun buffers in some cases - "
                  "better use strftime (or even sprintf) instead");
 # endif
 
diff --git a/linux_musl-lib/unistd.h b/linux_musl-lib/unistd.h
index 36df1c4..7cec3f2 100644
--- a/linux_musl-lib/unistd.h
+++ b/linux_musl-lib/unistd.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Substitute for and wrapper around <unistd.h>.
-   Copyright (C) 2003-2019 Free Software Foundation, Inc.
+   Copyright (C) 2003-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_UNISTD_H
 
@@ -22,7 +22,7 @@
 #endif
 
 
-#ifdef _GL_INCLUDING_UNISTD_H
+#if 1 && defined _GL_INCLUDING_UNISTD_H
 /* Special invocation convention:
    - On Mac OS X 10.3.9 we have a sequence of nested includes
      <unistd.h> -> <signal.h> -> <pthread.h> -> <unistd.h>
@@ -94,20 +94,18 @@
 # undef __need_system_stdlib_h
 #endif
 
-/* Native Windows platforms declare chdir, getcwd, rmdir in
+/* Native Windows platforms declare _chdir, _getcwd, _rmdir in
    <io.h> and/or <direct.h>, not in <unistd.h>.
-   They also declare access(), chmod(), close(), dup(), dup2(), isatty(),
-   lseek(), read(), unlink(), write() in <io.h>.  */
-#if ((0 || 0 || 0 \
-      || defined GNULIB_POSIXCHECK) \
-     && (defined _WIN32 && ! defined __CYGWIN__))
-# include <io.h>     /* mingw32, mingw64 */
-# include <direct.h> /* mingw64, MSVC 9 */
-#elif (1 || 0 || 1 || 0 \
-       || 0 || 0 || 1 || 0 \
-       || defined GNULIB_POSIXCHECK) \
-      && (defined _WIN32 && ! defined __CYGWIN__)
+   They also declare _access(), _chmod(), _close(), _dup(), _dup2(), _isatty(),
+   _lseek(), _read(), _unlink(), _write() in <io.h>.  */
+#if defined _WIN32 && !defined __CYGWIN__
 # include <io.h>
+# include <direct.h>
+#endif
+
+/* Native Windows platforms declare _execl*, _execv* in <process.h>.  */
+#if defined _WIN32 && !defined __CYGWIN__
+# include <process.h>
 #endif
 
 /* AIX and OSF/1 5.1 declare getdomainname in <netdb.h>, not in <unistd.h>.
@@ -119,6 +117,17 @@
 # include <netdb.h>
 #endif
 
+/* Mac OS X 10.13, Solaris 11.4, and Android 9.0 declare getentropy in
+   <sys/random.h>, not in <unistd.h>.  */
+/* But avoid namespace pollution on glibc systems.  */
+#if (0 || defined GNULIB_POSIXCHECK) \
+    && ((defined __APPLE__ && defined __MACH__) || defined __sun \
+        || defined __ANDROID__) \
+    && 0 \
+    && !defined __GLIBC__
+# include <sys/random.h>
+#endif
+
 /* Android 4.3 declares fchownat in <sys/stat.h>, not in <unistd.h>.  */
 /* But avoid namespace pollution on glibc systems.  */
 #if (0 || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \
@@ -128,27 +137,24 @@
 
 /* MSVC defines off_t in <sys/types.h>.
    May also define off_t to a 64-bit type on native Windows.  */
-/* But avoid namespace pollution on glibc systems.  */
-#ifndef __GLIBC__
-/* Get off_t, ssize_t.  */
-# include <sys/types.h>
-#endif
+/* Get off_t, ssize_t, mode_t.  */
+#include <sys/types.h>
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -283,6 +289,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -308,6 +324,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -405,7 +429,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -433,14 +457,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -454,26 +475,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -482,19 +503,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -570,6 +591,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -582,24 +610,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -615,7 +654,7 @@
 
 
 /* Get getopt(), optarg, optind, opterr, optopt.  */
-#if 01 && !defined _GL_SYSTEM_GETOPT
+#if 1 && 01 && !defined _GL_SYSTEM_GETOPT
 # include <getopt-cdefs.h>
 # include <getopt-pfx-core.h>
 #endif
@@ -727,7 +766,7 @@
 /* Declare overridden functions.  */
 
 
-#if 0
+#if 1
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef access
@@ -736,6 +775,12 @@
 _GL_FUNCDECL_RPL (access, int, (const char *file, int mode)
                                _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (access, int, (const char *file, int mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef access
+#   define access _access
+#  endif
+_GL_CXXALIAS_MDA (access, int, (const char *file, int mode));
 # else
 _GL_CXXALIAS_SYS (access, int, (const char *file, int mode));
 # endif
@@ -749,11 +794,33 @@
                  "also, this function is a security risk - "
                  "use the gnulib module faccessat instead");
 # endif
+#elif 1
+/* On native Windows, map 'access' to '_access', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::access always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef access
+#   define access _access
+#  endif
+_GL_CXXALIAS_MDA (access, int, (const char *file, int mode));
+# else
+_GL_CXXALIAS_SYS (access, int, (const char *file, int mode));
+# endif
+_GL_CXXALIASWARN (access);
 #endif
 
 
 #if 0
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef chdir
+#   define chdir _chdir
+#  endif
+_GL_CXXALIAS_MDA (chdir, int, (const char *file));
+# else
 _GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
+# endif
 _GL_CXXALIASWARN (chdir);
 #elif defined GNULIB_POSIXCHECK
 # undef chdir
@@ -761,6 +828,20 @@
 _GL_WARN_ON_USE (chown, "chdir is not always in <unistd.h> - "
                  "use gnulib module chdir for portability");
 # endif
+#elif 1
+/* On native Windows, map 'chdir' to '_chdir', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::chdir always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef chdir
+#   define chdir _chdir
+#  endif
+_GL_CXXALIAS_MDA (chdir, int, (const char *file));
+# else
+_GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIASWARN (chdir);
 #endif
 
 
@@ -805,6 +886,12 @@
 #  endif
 _GL_FUNCDECL_RPL (close, int, (int fd));
 _GL_CXXALIAS_RPL (close, int, (int fd));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef close
+#   define close _close
+#  endif
+_GL_CXXALIAS_MDA (close, int, (int fd));
 # else
 _GL_CXXALIAS_SYS (close, int, (int fd));
 # endif
@@ -817,6 +904,20 @@
 /* Assume close is always declared.  */
 _GL_WARN_ON_USE (close, "close does not portably work on sockets - "
                  "use gnulib module close for portability");
+#elif 1
+/* On native Windows, map 'close' to '_close', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::close always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef close
+#   define close _close
+#  endif
+_GL_CXXALIAS_MDA (close, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (close, int, (int fd));
+# endif
+_GL_CXXALIASWARN (close);
 #endif
 
 
@@ -831,10 +932,11 @@
 # endif
 _GL_CXXALIASWARN (copy_file_range);
 #elif defined GNULIB_POSIXCHECK
-/* Assume copy_file_range is always declared.  */
+# if HAVE_RAW_DECL_COPY_FILE_RANGE
 _GL_WARN_ON_USE (copy_file_range,
                  "copy_file_range is unportable - "
                  "use gnulib module copy_file_range for portability");
+# endif
 #endif
 
 
@@ -845,6 +947,12 @@
 #  endif
 _GL_FUNCDECL_RPL (dup, int, (int oldfd));
 _GL_CXXALIAS_RPL (dup, int, (int oldfd));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dup
+#   define dup _dup
+#  endif
+_GL_CXXALIAS_MDA (dup, int, (int oldfd));
 # else
 _GL_CXXALIAS_SYS (dup, int, (int oldfd));
 # endif
@@ -855,6 +963,20 @@
 _GL_WARN_ON_USE (dup, "dup is unportable - "
                  "use gnulib module dup for portability");
 # endif
+#elif 1
+/* On native Windows, map 'dup' to '_dup', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::dup always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dup
+#   define dup _dup
+#  endif
+_GL_CXXALIAS_MDA (dup, int, (int oldfd));
+# else
+_GL_CXXALIAS_SYS (dup, int, (int oldfd));
+# endif
+_GL_CXXALIASWARN (dup);
 #endif
 
 
@@ -870,10 +992,13 @@
 #  endif
 _GL_FUNCDECL_RPL (dup2, int, (int oldfd, int newfd));
 _GL_CXXALIAS_RPL (dup2, int, (int oldfd, int newfd));
-# else
-#  if !1
-_GL_FUNCDECL_SYS (dup2, int, (int oldfd, int newfd));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dup2
+#   define dup2 _dup2
 #  endif
+_GL_CXXALIAS_MDA (dup2, int, (int oldfd, int newfd));
+# else
 _GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
 # endif
 _GL_CXXALIASWARN (dup2);
@@ -883,6 +1008,20 @@
 _GL_WARN_ON_USE (dup2, "dup2 is unportable - "
                  "use gnulib module dup2 for portability");
 # endif
+#elif 1
+/* On native Windows, map 'dup2' to '_dup2', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::dup2 always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef dup2
+#   define dup2 _dup2
+#  endif
+_GL_CXXALIAS_MDA (dup2, int, (int oldfd, int newfd));
+# else
+_GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
+# endif
+_GL_CXXALIASWARN (dup2);
 #endif
 
 
@@ -986,6 +1125,282 @@
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execl
+#   define execl rpl_execl
+#  endif
+_GL_FUNCDECL_RPL (execl, int, (const char *program, const char *arg, ...)
+                              _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execl, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execl, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execl);
+#elif defined GNULIB_POSIXCHECK
+# undef execl
+# if HAVE_RAW_DECL_EXECL
+_GL_WARN_ON_USE (execl, "execl behaves very differently on mingw - "
+                 "use gnulib module execl for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execl' to '_execl', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execl always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execl
+#   define execl _execl
+#  endif
+_GL_CXXALIAS_MDA (execl, intptr_t, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execl, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execl);
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execle
+#   define execle rpl_execle
+#  endif
+_GL_FUNCDECL_RPL (execle, int, (const char *program, const char *arg, ...)
+                               _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execle, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execle, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execle);
+#elif defined GNULIB_POSIXCHECK
+# undef execle
+# if HAVE_RAW_DECL_EXECLE
+_GL_WARN_ON_USE (execle, "execle behaves very differently on mingw - "
+                 "use gnulib module execle for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execle' to '_execle', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execle always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execle
+#   define execle _execle
+#  endif
+_GL_CXXALIAS_MDA (execle, intptr_t,
+                  (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execle, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execle);
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execlp
+#   define execlp rpl_execlp
+#  endif
+_GL_FUNCDECL_RPL (execlp, int, (const char *program, const char *arg, ...)
+                               _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execlp, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execlp, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execlp);
+#elif defined GNULIB_POSIXCHECK
+# undef execlp
+# if HAVE_RAW_DECL_EXECLP
+_GL_WARN_ON_USE (execlp, "execlp behaves very differently on mingw - "
+                 "use gnulib module execlp for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execlp' to '_execlp', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execlp always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execlp
+#   define execlp _execlp
+#  endif
+_GL_CXXALIAS_MDA (execlp, intptr_t,
+                  (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execlp, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execlp);
+#endif
+
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execv
+#   define execv rpl_execv
+#  endif
+_GL_FUNCDECL_RPL (execv, int, (const char *program, char * const *argv)
+                              _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execv, int, (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execv, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execv);
+#elif defined GNULIB_POSIXCHECK
+# undef execv
+# if HAVE_RAW_DECL_EXECV
+_GL_WARN_ON_USE (execv, "execv behaves very differently on mingw - "
+                 "use gnulib module execv for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execv' to '_execv', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execv always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execv
+#   define execv _execv
+#  endif
+_GL_CXXALIAS_MDA_CAST (execv, intptr_t,
+                       (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execv, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execv);
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execve
+#   define execve rpl_execve
+#  endif
+_GL_FUNCDECL_RPL (execve, int,
+                  (const char *program, char * const *argv, char * const *env)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execve, int,
+                  (const char *program, char * const *argv, char * const *env));
+# else
+_GL_CXXALIAS_SYS (execve, int,
+                  (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execve);
+#elif defined GNULIB_POSIXCHECK
+# undef execve
+# if HAVE_RAW_DECL_EXECVE
+_GL_WARN_ON_USE (execve, "execve behaves very differently on mingw - "
+                 "use gnulib module execve for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execve' to '_execve', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execve always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execve
+#   define execve _execve
+#  endif
+_GL_CXXALIAS_MDA_CAST (execve, intptr_t,
+                       (const char *program, char * const *argv,
+                        char * const *env));
+# else
+_GL_CXXALIAS_SYS (execve, int,
+                  (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execve);
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execvp
+#   define execvp rpl_execvp
+#  endif
+_GL_FUNCDECL_RPL (execvp, int, (const char *program, char * const *argv)
+                               _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execvp, int, (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execvp, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execvp);
+#elif defined GNULIB_POSIXCHECK
+# undef execvp
+# if HAVE_RAW_DECL_EXECVP
+_GL_WARN_ON_USE (execvp, "execvp behaves very differently on mingw - "
+                 "use gnulib module execvp for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execvp' to '_execvp', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execvp always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execvp
+#   define execvp _execvp
+#  endif
+_GL_CXXALIAS_MDA_CAST (execvp, intptr_t,
+                       (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execvp, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execvp);
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execvpe
+#   define execvpe rpl_execvpe
+#  endif
+_GL_FUNCDECL_RPL (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env));
+# else
+#  if !1
+_GL_FUNCDECL_SYS (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execvpe);
+#elif defined GNULIB_POSIXCHECK
+# undef execvpe
+# if HAVE_RAW_DECL_EXECVPE
+_GL_WARN_ON_USE (execvpe, "execvpe behaves very differently on mingw - "
+                 "use gnulib module execvpe for portability");
+# endif
+#elif 1
+/* On native Windows, map 'execvpe' to '_execvpe', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::execvpe on all platforms that have
+   it.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef execvpe
+#   define execvpe _execvpe
+#  endif
+_GL_CXXALIAS_MDA_CAST (execvpe, intptr_t,
+                       (const char *program, char * const *argv,
+                        char * const *env));
+# elif 1
+#  if !1
+_GL_FUNCDECL_SYS (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (execvpe, int,
+                  (const char *program, char * const *argv, char * const *env));
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || 1
+_GL_CXXALIASWARN (execvpe);
+# endif
+#endif
+
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   undef faccessat
 #   define faccessat rpl_faccessat
 #  endif
@@ -1070,7 +1485,7 @@
 # undef fchownat
 # if HAVE_RAW_DECL_FCHOWNAT
 _GL_WARN_ON_USE (fchownat, "fchownat is not portable - "
-                 "use gnulib module openat for portability");
+                 "use gnulib module fchownat for portability");
 # endif
 #endif
 
@@ -1141,7 +1556,7 @@
 #endif
 
 
-#if 0
+#if 1
 /* Get the name of the current working directory, and put it in SIZE bytes
    of BUF.
    Return BUF if successful, or NULL if the directory couldn't be determined
@@ -1152,12 +1567,18 @@
    extension: If BUF is NULL, an array is allocated with 'malloc'; the array
    is SIZE bytes long, unless SIZE == 0, in which case it is as big as
    necessary.  */
-# if 0
+# if 1
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define getcwd rpl_getcwd
 #  endif
 _GL_FUNCDECL_RPL (getcwd, char *, (char *buf, size_t size));
 _GL_CXXALIAS_RPL (getcwd, char *, (char *buf, size_t size));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getcwd
+#   define getcwd _getcwd
+#  endif
+_GL_CXXALIAS_MDA (getcwd, char *, (char *buf, size_t size));
 # else
 /* Need to cast, because on mingw, the second parameter is
                                                    int size.  */
@@ -1170,6 +1591,22 @@
 _GL_WARN_ON_USE (getcwd, "getcwd is unportable - "
                  "use gnulib module getcwd for portability");
 # endif
+#elif 1
+/* On native Windows, map 'getcwd' to '_getcwd', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::getcwd always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getcwd
+#   define getcwd _getcwd
+#  endif
+/* Need to cast, because on mingw, the second parameter is either
+   'int size' or 'size_t size'.  */
+_GL_CXXALIAS_MDA_CAST (getcwd, char *, (char *buf, size_t size));
+# else
+_GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size));
+# endif
+_GL_CXXALIASWARN (getcwd);
 #endif
 
 
@@ -1238,6 +1675,22 @@
 
 
 #if 0
+/* Fill a buffer with random bytes.  */
+# if !1
+_GL_FUNCDECL_SYS (getentropy, int, (void *buffer, size_t length));
+# endif
+_GL_CXXALIAS_SYS (getentropy, int, (void *buffer, size_t length));
+_GL_CXXALIASWARN (getentropy);
+#elif defined GNULIB_POSIXCHECK
+# undef getentropy
+# if HAVE_RAW_DECL_GETENTROPY
+_GL_WARN_ON_USE (getentropy, "getentropy is unportable - "
+                 "use gnulib module getentropy for portability");
+# endif
+#endif
+
+
+#if 0
 /* Return the supplemental groups that the current process belongs to.
    It is unspecified whether the effective group id is in the list.
    If N is 0, return the group count; otherwise, N describes how many
@@ -1379,6 +1832,11 @@
 _GL_FUNCDECL_RPL (getpagesize, int, (void));
 _GL_CXXALIAS_RPL (getpagesize, int, (void));
 # else
+/* On HP-UX, getpagesize exists, but it is not declared in <unistd.h> even if
+   the compiler options -D_HPUX_SOURCE -D_XOPEN_SOURCE=600 are used.  */
+#  if defined __hpux
+_GL_FUNCDECL_SYS (getpagesize, int, (void));
+#  endif
 #  if !1
 #   if !defined getpagesize
 /* This is for POSIX systems.  */
@@ -1483,6 +1941,23 @@
 #endif
 
 
+#if 1
+/* On native Windows, map 'getpid' to '_getpid', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::getpid always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getpid
+#   define getpid _getpid
+#  endif
+_GL_CXXALIAS_MDA (getpid, int, (void));
+# else
+_GL_CXXALIAS_SYS (getpid, pid_t, (void));
+# endif
+_GL_CXXALIASWARN (getpid);
+#endif
+
+
 #if 0
 /* Return the next valid login shell on the system, or NULL when the end of
    the list has been reached.  */
@@ -1553,8 +2028,15 @@
 #   undef isatty
 #   define isatty rpl_isatty
 #  endif
+#  define GNULIB_defined_isatty 1
 _GL_FUNCDECL_RPL (isatty, int, (int fd));
 _GL_CXXALIAS_RPL (isatty, int, (int fd));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef isatty
+#   define isatty _isatty
+#  endif
+_GL_CXXALIAS_MDA (isatty, int, (int fd));
 # else
 _GL_CXXALIAS_SYS (isatty, int, (int fd));
 # endif
@@ -1565,6 +2047,20 @@
 _GL_WARN_ON_USE (isatty, "isatty has portability problems on native Windows - "
                  "use gnulib module isatty for portability");
 # endif
+#elif 1
+/* On native Windows, map 'isatty' to '_isatty', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::isatty always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef isatty
+#   define isatty _isatty
+#  endif
+_GL_CXXALIAS_MDA (isatty, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (isatty, int, (int fd));
+# endif
+_GL_CXXALIASWARN (isatty);
 #endif
 
 
@@ -1676,6 +2172,12 @@
 #  endif
 _GL_FUNCDECL_RPL (lseek, off_t, (int fd, off_t offset, int whence));
 _GL_CXXALIAS_RPL (lseek, off_t, (int fd, off_t offset, int whence));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef lseek
+#   define lseek _lseek
+#  endif
+_GL_CXXALIAS_MDA (lseek, off_t, (int fd, off_t offset, int whence));
 # else
 _GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
 # endif
@@ -1686,10 +2188,24 @@
 _GL_WARN_ON_USE (lseek, "lseek does not fail with ESPIPE on pipes on some "
                  "systems - use gnulib module lseek for portability");
 # endif
+#elif 1
+/* On native Windows, map 'lseek' to '_lseek', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::lseek always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef lseek
+#   define lseek _lseek
+#  endif
+_GL_CXXALIAS_MDA (lseek, long, (int fd, long offset, int whence));
+# else
+_GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
+# endif
+_GL_CXXALIASWARN (lseek);
 #endif
 
 
-#if 0
+#if 1
 /* Create a pipe, defaulting to O_BINARY mode.
    Store the read-end as fd[0] and the write-end as fd[1].
    Return 0 upon success, or -1 with errno set upon failure.  */
@@ -1818,11 +2334,32 @@
 _GL_FUNCDECL_RPL (read, ssize_t, (int fd, void *buf, size_t count)
                                  _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (read, ssize_t, (int fd, void *buf, size_t count));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef read
+#   define read _read
+#  endif
+_GL_CXXALIAS_MDA (read, ssize_t, (int fd, void *buf, size_t count));
 # else
-/* Need to cast, because on mingw, the third parameter is
-                                                          unsigned int count
-   and the return type is 'int'.  */
-_GL_CXXALIAS_SYS_CAST (read, ssize_t, (int fd, void *buf, size_t count));
+_GL_CXXALIAS_SYS (read, ssize_t, (int fd, void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (read);
+#elif 1
+/* On native Windows, map 'read' to '_read', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::read always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef read
+#   define read _read
+#  endif
+#  ifdef __MINGW32__
+_GL_CXXALIAS_MDA (read, int, (int fd, void *buf, unsigned int count));
+#  else
+_GL_CXXALIAS_MDA (read, ssize_t, (int fd, void *buf, unsigned int count));
+#  endif
+# else
+_GL_CXXALIAS_SYS (read, ssize_t, (int fd, void *buf, size_t count));
 # endif
 _GL_CXXALIASWARN (read);
 #endif
@@ -1839,18 +2376,22 @@
 #   define readlink rpl_readlink
 #  endif
 _GL_FUNCDECL_RPL (readlink, ssize_t,
-                  (const char *file, char *buf, size_t bufsize)
+                  (const char *restrict file,
+                   char *restrict buf, size_t bufsize)
                   _GL_ARG_NONNULL ((1, 2)));
 _GL_CXXALIAS_RPL (readlink, ssize_t,
-                  (const char *file, char *buf, size_t bufsize));
+                  (const char *restrict file,
+                   char *restrict buf, size_t bufsize));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (readlink, ssize_t,
-                  (const char *file, char *buf, size_t bufsize)
+                  (const char *restrict file,
+                   char *restrict buf, size_t bufsize)
                   _GL_ARG_NONNULL ((1, 2)));
 #  endif
 _GL_CXXALIAS_SYS (readlink, ssize_t,
-                  (const char *file, char *buf, size_t bufsize));
+                  (const char *restrict file,
+                   char *restrict buf, size_t bufsize));
 # endif
 _GL_CXXALIASWARN (readlink);
 #elif defined GNULIB_POSIXCHECK
@@ -1868,18 +2409,22 @@
 #   define readlinkat rpl_readlinkat
 #  endif
 _GL_FUNCDECL_RPL (readlinkat, ssize_t,
-                  (int fd, char const *file, char *buf, size_t len)
+                  (int fd, char const *restrict file,
+                   char *restrict buf, size_t len)
                   _GL_ARG_NONNULL ((2, 3)));
 _GL_CXXALIAS_RPL (readlinkat, ssize_t,
-                  (int fd, char const *file, char *buf, size_t len));
+                  (int fd, char const *restrict file,
+                   char *restrict buf, size_t len));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (readlinkat, ssize_t,
-                  (int fd, char const *file, char *buf, size_t len)
+                  (int fd, char const *restrict file,
+                   char *restrict buf, size_t len)
                   _GL_ARG_NONNULL ((2, 3)));
 #  endif
 _GL_CXXALIAS_SYS (readlinkat, ssize_t,
-                  (int fd, char const *file, char *buf, size_t len));
+                  (int fd, char const *restrict file,
+                   char *restrict buf, size_t len));
 # endif
 _GL_CXXALIASWARN (readlinkat);
 #elif defined GNULIB_POSIXCHECK
@@ -1899,6 +2444,12 @@
 #  endif
 _GL_FUNCDECL_RPL (rmdir, int, (char const *name) _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (rmdir, int, (char const *name));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef rmdir
+#   define rmdir _rmdir
+#  endif
+_GL_CXXALIAS_MDA (rmdir, int, (char const *name));
 # else
 _GL_CXXALIAS_SYS (rmdir, int, (char const *name));
 # endif
@@ -1909,6 +2460,20 @@
 _GL_WARN_ON_USE (rmdir, "rmdir is unportable - "
                  "use gnulib module rmdir for portability");
 # endif
+#elif 1
+/* On native Windows, map 'rmdir' to '_rmdir', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::rmdir always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef rmdir
+#   define rmdir _rmdir
+#  endif
+_GL_CXXALIAS_MDA (rmdir, int, (char const *name));
+# else
+_GL_CXXALIAS_SYS (rmdir, int, (char const *name));
+# endif
+_GL_CXXALIASWARN (rmdir);
 #endif
 
 
@@ -1967,6 +2532,31 @@
 #endif
 
 
+#if 1
+/* On native Windows, map 'swab' to '_swab', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::swab always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef swab
+#   define swab _swab
+#  endif
+/* Need to cast, because in old mingw the arguments are
+                             (const char *from, char *to, size_t n).  */
+_GL_CXXALIAS_MDA_CAST (swab, void, (char *from, char *to, int n));
+# else
+#  if defined __hpux /* HP-UX */
+_GL_CXXALIAS_SYS (swab, void, (const char *from, char *to, int n));
+#  elif defined __sun && !defined _XPG4 /* Solaris */
+_GL_CXXALIAS_SYS (swab, void, (const char *from, char *to, ssize_t n));
+#  else
+_GL_CXXALIAS_SYS (swab, void, (const void *from, void *to, ssize_t n));
+#  endif
+# endif
+_GL_CXXALIASWARN (swab);
+#endif
+
+
 #if 0
 # if 0
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
@@ -2091,6 +2681,12 @@
 #  endif
 _GL_FUNCDECL_RPL (unlink, int, (char const *file) _GL_ARG_NONNULL ((1)));
 _GL_CXXALIAS_RPL (unlink, int, (char const *file));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef unlink
+#   define unlink _unlink
+#  endif
+_GL_CXXALIAS_MDA (unlink, int, (char const *file));
 # else
 _GL_CXXALIAS_SYS (unlink, int, (char const *file));
 # endif
@@ -2101,6 +2697,20 @@
 _GL_WARN_ON_USE (unlink, "unlink is not portable - "
                  "use gnulib module unlink for portability");
 # endif
+#elif 1
+/* On native Windows, map 'unlink' to '_unlink', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::unlink always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef unlink
+#   define unlink _unlink
+#  endif
+_GL_CXXALIAS_MDA (unlink, int, (char const *file));
+# else
+_GL_CXXALIAS_SYS (unlink, int, (char const *file));
+# endif
+_GL_CXXALIASWARN (unlink);
 #endif
 
 
@@ -2125,7 +2735,7 @@
 # undef unlinkat
 # if HAVE_RAW_DECL_UNLINKAT
 _GL_WARN_ON_USE (unlinkat, "unlinkat is not portable - "
-                 "use gnulib module openat for portability");
+                 "use gnulib module unlinkat for portability");
 # endif
 #endif
 
@@ -2146,7 +2756,9 @@
 #  if !1
 _GL_FUNCDECL_SYS (usleep, int, (useconds_t n));
 #  endif
-_GL_CXXALIAS_SYS (usleep, int, (useconds_t n));
+/* Need to cast, because on Haiku, the first parameter is
+                                     unsigned int n.  */
+_GL_CXXALIAS_SYS_CAST (usleep, int, (useconds_t n));
 # endif
 _GL_CXXALIASWARN (usleep);
 #elif defined GNULIB_POSIXCHECK
@@ -2170,11 +2782,32 @@
 _GL_FUNCDECL_RPL (write, ssize_t, (int fd, const void *buf, size_t count)
                                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (write, ssize_t, (int fd, const void *buf, size_t count));
+# elif defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef write
+#   define write _write
+#  endif
+_GL_CXXALIAS_MDA (write, ssize_t, (int fd, const void *buf, size_t count));
 # else
-/* Need to cast, because on mingw, the third parameter is
-                                                             unsigned int count
-   and the return type is 'int'.  */
-_GL_CXXALIAS_SYS_CAST (write, ssize_t, (int fd, const void *buf, size_t count));
+_GL_CXXALIAS_SYS (write, ssize_t, (int fd, const void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (write);
+#elif 1
+/* On native Windows, map 'write' to '_write', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::write always.  */
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef write
+#   define write _write
+#  endif
+#  ifdef __MINGW32__
+_GL_CXXALIAS_MDA (write, int, (int fd, const void *buf, unsigned int count));
+#  else
+_GL_CXXALIAS_MDA (write, ssize_t, (int fd, const void *buf, unsigned int count));
+#  endif
+# else
+_GL_CXXALIAS_SYS (write, ssize_t, (int fd, const void *buf, size_t count));
 # endif
 _GL_CXXALIASWARN (write);
 #endif
diff --git a/linux_musl-lib/unistr.h b/linux_musl-lib/unistr.h
new file mode 100644
index 0000000..f6963df
--- /dev/null
+++ b/linux_musl-lib/unistr.h
@@ -0,0 +1,754 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Elementary Unicode string functions.
+   Copyright (C) 2001-2002, 2005-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _UNISTR_H
+#define _UNISTR_H
+
+#include "unitypes.h"
+
+/* Get bool.  */
+#include <stdbool.h>
+
+/* Get size_t, ptrdiff_t.  */
+#include <stddef.h>
+
+/* Get free().  */
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Conventions:
+
+   All functions prefixed with u8_ operate on UTF-8 encoded strings.
+   Their unit is an uint8_t (1 byte).
+
+   All functions prefixed with u16_ operate on UTF-16 encoded strings.
+   Their unit is an uint16_t (a 2-byte word).
+
+   All functions prefixed with u32_ operate on UCS-4 encoded strings.
+   Their unit is an uint32_t (a 4-byte word).
+
+   All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
+   n units.
+
+   All arguments starting with "str" and the arguments of functions starting
+   with u8_str/u16_str/u32_str denote a NUL terminated string, i.e. a string
+   which terminates at the first NUL unit.  This termination unit is
+   considered part of the string for all memory allocation purposes, but
+   is not considered part of the string for all other logical purposes.
+
+   Functions returning a string result take a (resultbuf, lengthp) argument
+   pair.  If resultbuf is not NULL and the result fits into *lengthp units,
+   it is put in resultbuf, and resultbuf is returned.  Otherwise, a freshly
+   allocated string is returned.  In both cases, *lengthp is set to the
+   length (number of units) of the returned string.  In case of error,
+   NULL is returned and errno is set.  */
+
+
+/* Elementary string checks.  */
+
+/* Check whether an UTF-8 string is well-formed.
+   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
+extern const uint8_t *
+       u8_check (const uint8_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Check whether an UTF-16 string is well-formed.
+   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
+extern const uint16_t *
+       u16_check (const uint16_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Check whether an UCS-4 string is well-formed.
+   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
+extern const uint32_t *
+       u32_check (const uint32_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+
+/* Elementary string conversions.  */
+
+/* Convert an UTF-8 string to an UTF-16 string.  */
+extern uint16_t *
+       u8_to_u16 (const uint8_t *s, size_t n, uint16_t *resultbuf,
+                  size_t *lengthp);
+
+/* Convert an UTF-8 string to an UCS-4 string.  */
+extern uint32_t *
+       u8_to_u32 (const uint8_t *s, size_t n, uint32_t *resultbuf,
+                  size_t *lengthp);
+
+/* Convert an UTF-16 string to an UTF-8 string.  */
+extern uint8_t *
+       u16_to_u8 (const uint16_t *s, size_t n, uint8_t *resultbuf,
+                  size_t *lengthp);
+
+/* Convert an UTF-16 string to an UCS-4 string.  */
+extern uint32_t *
+       u16_to_u32 (const uint16_t *s, size_t n, uint32_t *resultbuf,
+                   size_t *lengthp);
+
+/* Convert an UCS-4 string to an UTF-8 string.  */
+extern uint8_t *
+       u32_to_u8 (const uint32_t *s, size_t n, uint8_t *resultbuf,
+                  size_t *lengthp);
+
+/* Convert an UCS-4 string to an UTF-16 string.  */
+extern uint16_t *
+       u32_to_u16 (const uint32_t *s, size_t n, uint16_t *resultbuf,
+                   size_t *lengthp);
+
+
+/* Elementary string functions.  */
+
+/* Return the length (number of units) of the first character in S, which is
+   no longer than N.  Return 0 if it is the NUL character.  Return -1 upon
+   failure.  */
+/* Similar to mblen(), except that s must not be NULL.  */
+extern int
+       u8_mblen (const uint8_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_mblen (const uint16_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_mblen (const uint32_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the length (number of units) of the first character in S, putting
+   its 'ucs4_t' representation in *PUC.  Upon failure, *PUC is set to 0xfffd,
+   and an appropriate number of units is returned.
+   The number of available units, N, must be > 0.  */
+/* Similar to mbtowc(), except that puc and s must not be NULL, n must be > 0,
+   and the NUL character is not treated specially.  */
+/* The variants with _unsafe suffix are for backward compatibility with
+   libunistring versions < 0.9.7.  */
+
+#if GNULIB_UNISTR_U8_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n);
+# else
+extern int
+       u8_mbtouc_unsafe_aux (ucs4_t *puc, const uint8_t *s, size_t n);
+static inline int
+u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+  uint8_t c = *s;
+
+  if (c < 0x80)
+    {
+      *puc = c;
+      return 1;
+    }
+  else
+    return u8_mbtouc_unsafe_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n);
+# else
+extern int
+       u16_mbtouc_unsafe_aux (ucs4_t *puc, const uint16_t *s, size_t n);
+static inline int
+u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+  uint16_t c = *s;
+
+  if (c < 0xd800 || c >= 0xe000)
+    {
+      *puc = c;
+      return 1;
+    }
+  else
+    return u16_mbtouc_unsafe_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u32_mbtouc_unsafe (ucs4_t *puc, const uint32_t *s, size_t n);
+# else
+static inline int
+u32_mbtouc_unsafe (ucs4_t *puc,
+                   const uint32_t *s, _GL_ATTRIBUTE_MAYBE_UNUSED size_t n)
+{
+  uint32_t c = *s;
+
+  if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+    *puc = c;
+  else
+    /* invalid multibyte character */
+    *puc = 0xfffd;
+  return 1;
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U8_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n);
+# else
+extern int
+       u8_mbtouc_aux (ucs4_t *puc, const uint8_t *s, size_t n);
+static inline int
+u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+  uint8_t c = *s;
+
+  if (c < 0x80)
+    {
+      *puc = c;
+      return 1;
+    }
+  else
+    return u8_mbtouc_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n);
+# else
+extern int
+       u16_mbtouc_aux (ucs4_t *puc, const uint16_t *s, size_t n);
+static inline int
+u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+  uint16_t c = *s;
+
+  if (c < 0xd800 || c >= 0xe000)
+    {
+      *puc = c;
+      return 1;
+    }
+  else
+    return u16_mbtouc_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n);
+# else
+static inline int
+u32_mbtouc (ucs4_t *puc, const uint32_t *s,
+            _GL_ATTRIBUTE_MAYBE_UNUSED size_t n)
+{
+  uint32_t c = *s;
+
+  if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+    *puc = c;
+  else
+    /* invalid multibyte character */
+    *puc = 0xfffd;
+  return 1;
+}
+# endif
+#endif
+
+/* Return the length (number of units) of the first character in S, putting
+   its 'ucs4_t' representation in *PUC.  Upon failure, *PUC is set to 0xfffd,
+   and -1 is returned for an invalid sequence of units, -2 is returned for an
+   incomplete sequence of units.
+   The number of available units, N, must be > 0.  */
+/* Similar to u*_mbtouc(), except that the return value gives more details
+   about the failure, similar to mbrtowc().  */
+
+#if GNULIB_UNISTR_U8_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+       u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n);
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+       u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n);
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+       u32_mbtoucr (ucs4_t *puc, const uint32_t *s, size_t n);
+#endif
+
+/* Put the multibyte character represented by UC in S, returning its
+   length.  Return -1 upon failure, -2 if the number of available units, N,
+   is too small.  The latter case cannot occur if N >= 6/2/1, respectively.  */
+/* Similar to wctomb(), except that s must not be NULL, and the argument n
+   must be specified.  */
+
+#if GNULIB_UNISTR_U8_UCTOMB || HAVE_LIBUNISTRING
+/* Auxiliary function, also used by u8_chr, u8_strchr, u8_strrchr.  */
+extern int
+       u8_uctomb_aux (uint8_t *s, ucs4_t uc, ptrdiff_t n);
+# if !HAVE_INLINE
+extern int
+       u8_uctomb (uint8_t *s, ucs4_t uc, ptrdiff_t n);
+# else
+static inline int
+u8_uctomb (uint8_t *s, ucs4_t uc, ptrdiff_t n)
+{
+  if (uc < 0x80 && n > 0)
+    {
+      s[0] = uc;
+      return 1;
+    }
+  else
+    return u8_uctomb_aux (s, uc, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_UCTOMB || HAVE_LIBUNISTRING
+/* Auxiliary function, also used by u16_chr, u16_strchr, u16_strrchr.  */
+extern int
+       u16_uctomb_aux (uint16_t *s, ucs4_t uc, ptrdiff_t n);
+# if !HAVE_INLINE
+extern int
+       u16_uctomb (uint16_t *s, ucs4_t uc, ptrdiff_t n);
+# else
+static inline int
+u16_uctomb (uint16_t *s, ucs4_t uc, ptrdiff_t n)
+{
+  if (uc < 0xd800 && n > 0)
+    {
+      s[0] = uc;
+      return 1;
+    }
+  else
+    return u16_uctomb_aux (s, uc, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_UCTOMB || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+       u32_uctomb (uint32_t *s, ucs4_t uc, ptrdiff_t n);
+# else
+static inline int
+u32_uctomb (uint32_t *s, ucs4_t uc, ptrdiff_t n)
+{
+  if (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000))
+    {
+      if (n > 0)
+        {
+          *s = uc;
+          return 1;
+        }
+      else
+        return -2;
+    }
+  else
+    return -1;
+}
+# endif
+#endif
+
+/* Copy N units from SRC to DEST.  */
+/* Similar to memcpy().  */
+extern uint8_t *
+       u8_cpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_cpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_cpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Copy N units from SRC to DEST, guaranteeing correct behavior for
+   overlapping memory areas.  */
+/* Similar to memmove().  */
+extern uint8_t *
+       u8_move (uint8_t *dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_move (uint16_t *dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_move (uint32_t *dest, const uint32_t *src, size_t n);
+
+/* Set the first N characters of S to UC.  UC should be a character that
+   occupies only 1 unit.  */
+/* Similar to memset().  */
+extern uint8_t *
+       u8_set (uint8_t *s, ucs4_t uc, size_t n);
+extern uint16_t *
+       u16_set (uint16_t *s, ucs4_t uc, size_t n);
+extern uint32_t *
+       u32_set (uint32_t *s, ucs4_t uc, size_t n);
+
+/* Compare S1 and S2, each of length N.  */
+/* Similar to memcmp().  */
+extern int
+       u8_cmp (const uint8_t *s1, const uint8_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_cmp (const uint16_t *s1, const uint16_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_cmp (const uint32_t *s1, const uint32_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Compare S1 and S2.  */
+/* Similar to the gnulib function memcmp2().  */
+extern int
+       u8_cmp2 (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_cmp2 (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_cmp2 (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2)
+       _UC_ATTRIBUTE_PURE;
+
+/* Search the string at S for UC.  */
+/* Similar to memchr().  */
+extern uint8_t *
+       u8_chr (const uint8_t *s, size_t n, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_chr (const uint16_t *s, size_t n, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_chr (const uint32_t *s, size_t n, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+
+/* Count the number of Unicode characters in the N units from S.  */
+/* Similar to mbsnlen().  */
+extern size_t
+       u8_mbsnlen (const uint8_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_mbsnlen (const uint16_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_mbsnlen (const uint32_t *s, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Elementary string functions with memory allocation.  */
+
+/* Make a freshly allocated copy of S, of length N.  */
+extern uint8_t *
+       u8_cpy_alloc (const uint8_t *s, size_t n);
+extern uint16_t *
+       u16_cpy_alloc (const uint16_t *s, size_t n);
+extern uint32_t *
+       u32_cpy_alloc (const uint32_t *s, size_t n);
+
+/* Elementary string functions on NUL terminated strings.  */
+
+/* Return the length (number of units) of the first character in S.
+   Return 0 if it is the NUL character.  Return -1 upon failure.  */
+extern int
+       u8_strmblen (const uint8_t *s)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_strmblen (const uint16_t *s)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_strmblen (const uint32_t *s)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the length (number of units) of the first character in S, putting
+   its 'ucs4_t' representation in *PUC.  Return 0 if it is the NUL
+   character.  Return -1 upon failure.  */
+extern int
+       u8_strmbtouc (ucs4_t *puc, const uint8_t *s);
+extern int
+       u16_strmbtouc (ucs4_t *puc, const uint16_t *s);
+extern int
+       u32_strmbtouc (ucs4_t *puc, const uint32_t *s);
+
+/* Forward iteration step.  Advances the pointer past the next character,
+   or returns NULL if the end of the string has been reached.  Puts the
+   character's 'ucs4_t' representation in *PUC.  */
+extern const uint8_t *
+       u8_next (ucs4_t *puc, const uint8_t *s);
+extern const uint16_t *
+       u16_next (ucs4_t *puc, const uint16_t *s);
+extern const uint32_t *
+       u32_next (ucs4_t *puc, const uint32_t *s);
+
+/* Backward iteration step.  Advances the pointer to point to the previous
+   character, or returns NULL if the beginning of the string had been reached.
+   Puts the character's 'ucs4_t' representation in *PUC.  */
+extern const uint8_t *
+       u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start);
+extern const uint16_t *
+       u16_prev (ucs4_t *puc, const uint16_t *s, const uint16_t *start);
+extern const uint32_t *
+       u32_prev (ucs4_t *puc, const uint32_t *s, const uint32_t *start);
+
+/* Return the number of units in S.  */
+/* Similar to strlen(), wcslen().  */
+extern size_t
+       u8_strlen (const uint8_t *s)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_strlen (const uint16_t *s)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_strlen (const uint32_t *s)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the number of units in S, but at most MAXLEN.  */
+/* Similar to strnlen(), wcsnlen().  */
+extern size_t
+       u8_strnlen (const uint8_t *s, size_t maxlen)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_strnlen (const uint16_t *s, size_t maxlen)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_strnlen (const uint32_t *s, size_t maxlen)
+       _UC_ATTRIBUTE_PURE;
+
+/* Copy SRC to DEST.  */
+/* Similar to strcpy(), wcscpy().  */
+extern uint8_t *
+       u8_strcpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
+extern uint16_t *
+       u16_strcpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
+extern uint32_t *
+       u32_strcpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
+
+/* Copy SRC to DEST, returning the address of the terminating NUL in DEST.  */
+/* Similar to stpcpy().  */
+extern uint8_t *
+       u8_stpcpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
+extern uint16_t *
+       u16_stpcpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
+extern uint32_t *
+       u32_stpcpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
+
+/* Copy no more than N units of SRC to DEST.  */
+/* Similar to strncpy(), wcsncpy().  */
+extern uint8_t *
+       u8_strncpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_strncpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_strncpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Copy no more than N units of SRC to DEST.  Return a pointer past the last
+   non-NUL unit written into DEST.  */
+/* Similar to stpncpy().  */
+extern uint8_t *
+       u8_stpncpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_stpncpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_stpncpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Append SRC onto DEST.  */
+/* Similar to strcat(), wcscat().  */
+extern uint8_t *
+       u8_strcat (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
+extern uint16_t *
+       u16_strcat (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
+extern uint32_t *
+       u32_strcat (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
+
+/* Append no more than N units of SRC onto DEST.  */
+/* Similar to strncat(), wcsncat().  */
+extern uint8_t *
+       u8_strncat (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+       u16_strncat (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+       u32_strncat (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Compare S1 and S2.  */
+/* Similar to strcmp(), wcscmp().  */
+#ifdef __sun
+/* Avoid a collision with the u8_strcmp() function in Solaris 11 libc.  */
+extern int
+       u8_strcmp_gnu (const uint8_t *s1, const uint8_t *s2)
+       _UC_ATTRIBUTE_PURE;
+# define u8_strcmp u8_strcmp_gnu
+#else
+extern int
+       u8_strcmp (const uint8_t *s1, const uint8_t *s2)
+       _UC_ATTRIBUTE_PURE;
+#endif
+extern int
+       u16_strcmp (const uint16_t *s1, const uint16_t *s2)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_strcmp (const uint32_t *s1, const uint32_t *s2)
+       _UC_ATTRIBUTE_PURE;
+
+/* Compare S1 and S2 using the collation rules of the current locale.
+   Return -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2.
+   Upon failure, set errno and return any value.  */
+/* Similar to strcoll(), wcscoll().  */
+extern int
+       u8_strcoll (const uint8_t *s1, const uint8_t *s2);
+extern int
+       u16_strcoll (const uint16_t *s1, const uint16_t *s2);
+extern int
+       u32_strcoll (const uint32_t *s1, const uint32_t *s2);
+
+/* Compare no more than N units of S1 and S2.  */
+/* Similar to strncmp(), wcsncmp().  */
+extern int
+       u8_strncmp (const uint8_t *s1, const uint8_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u16_strncmp (const uint16_t *s1, const uint16_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+extern int
+       u32_strncmp (const uint32_t *s1, const uint32_t *s2, size_t n)
+       _UC_ATTRIBUTE_PURE;
+
+/* Duplicate S, returning an identical malloc'd string.  */
+/* Similar to strdup(), wcsdup().  */
+extern uint8_t *
+       u8_strdup (const uint8_t *s)
+       _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
+extern uint16_t *
+       u16_strdup (const uint16_t *s)
+       _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
+extern uint32_t *
+       u32_strdup (const uint32_t *s)
+       _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
+
+/* Find the first occurrence of UC in STR.  */
+/* Similar to strchr(), wcschr().  */
+extern uint8_t *
+       u8_strchr (const uint8_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_strchr (const uint16_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_strchr (const uint32_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+
+/* Find the last occurrence of UC in STR.  */
+/* Similar to strrchr(), wcsrchr().  */
+extern uint8_t *
+       u8_strrchr (const uint8_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_strrchr (const uint16_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_strrchr (const uint32_t *str, ucs4_t uc)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the length of the initial segment of STR which consists entirely
+   of Unicode characters not in REJECT.  */
+/* Similar to strcspn(), wcscspn().  */
+extern size_t
+       u8_strcspn (const uint8_t *str, const uint8_t *reject)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_strcspn (const uint16_t *str, const uint16_t *reject)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_strcspn (const uint32_t *str, const uint32_t *reject)
+       _UC_ATTRIBUTE_PURE;
+
+/* Return the length of the initial segment of STR which consists entirely
+   of Unicode characters in ACCEPT.  */
+/* Similar to strspn(), wcsspn().  */
+extern size_t
+       u8_strspn (const uint8_t *str, const uint8_t *accept)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u16_strspn (const uint16_t *str, const uint16_t *accept)
+       _UC_ATTRIBUTE_PURE;
+extern size_t
+       u32_strspn (const uint32_t *str, const uint32_t *accept)
+       _UC_ATTRIBUTE_PURE;
+
+/* Find the first occurrence in STR of any character in ACCEPT.  */
+/* Similar to strpbrk(), wcspbrk().  */
+extern uint8_t *
+       u8_strpbrk (const uint8_t *str, const uint8_t *accept)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_strpbrk (const uint16_t *str, const uint16_t *accept)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_strpbrk (const uint32_t *str, const uint32_t *accept)
+       _UC_ATTRIBUTE_PURE;
+
+/* Find the first occurrence of NEEDLE in HAYSTACK.  */
+/* Similar to strstr(), wcsstr().  */
+extern uint8_t *
+       u8_strstr (const uint8_t *haystack, const uint8_t *needle)
+       _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+       u16_strstr (const uint16_t *haystack, const uint16_t *needle)
+       _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+       u32_strstr (const uint32_t *haystack, const uint32_t *needle)
+       _UC_ATTRIBUTE_PURE;
+
+/* Test whether STR starts with PREFIX.  */
+extern bool
+       u8_startswith (const uint8_t *str, const uint8_t *prefix)
+       _UC_ATTRIBUTE_PURE;
+extern bool
+       u16_startswith (const uint16_t *str, const uint16_t *prefix)
+       _UC_ATTRIBUTE_PURE;
+extern bool
+       u32_startswith (const uint32_t *str, const uint32_t *prefix)
+       _UC_ATTRIBUTE_PURE;
+
+/* Test whether STR ends with SUFFIX.  */
+extern bool
+       u8_endswith (const uint8_t *str, const uint8_t *suffix)
+       _UC_ATTRIBUTE_PURE;
+extern bool
+       u16_endswith (const uint16_t *str, const uint16_t *suffix)
+       _UC_ATTRIBUTE_PURE;
+extern bool
+       u32_endswith (const uint32_t *str, const uint32_t *suffix)
+       _UC_ATTRIBUTE_PURE;
+
+/* Divide STR into tokens separated by characters in DELIM.
+   This interface is actually more similar to wcstok than to strtok.  */
+/* Similar to strtok_r(), wcstok().  */
+extern uint8_t *
+       u8_strtok (uint8_t *_UC_RESTRICT str, const uint8_t *delim,
+                  uint8_t **ptr);
+extern uint16_t *
+       u16_strtok (uint16_t *_UC_RESTRICT str, const uint16_t *delim,
+                   uint16_t **ptr);
+extern uint32_t *
+       u32_strtok (uint32_t *_UC_RESTRICT str, const uint32_t *delim,
+                   uint32_t **ptr);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNISTR_H */
diff --git a/linux_musl-lib/unitypes.h b/linux_musl-lib/unitypes.h
index 8ce4661..ec472d5 100644
--- a/linux_musl-lib/unitypes.h
+++ b/linux_musl-lib/unitypes.h
@@ -1,18 +1,18 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Elementary types and macros for the GNU UniString library.
-   Copyright (C) 2002, 2005-2006, 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2005-2006, 2009-2021 Free Software Foundation, Inc.
 
-   This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _UNITYPES_H
@@ -27,7 +27,7 @@
 /* Attribute of a function whose result depends only on the arguments
    (not pointers!) and which has no side effects.  */
 #ifndef _UC_ATTRIBUTE_CONST
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) || defined __clang__
 #  define _UC_ATTRIBUTE_CONST __attribute__ ((__const__))
 # else
 #  define _UC_ATTRIBUTE_CONST
@@ -37,11 +37,26 @@
 /* Attribute of a function whose result depends only on the arguments
    (possibly pointers) and global memory, and which has no side effects.  */
 #ifndef _UC_ATTRIBUTE_PURE
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
 #  define _UC_ATTRIBUTE_PURE __attribute__ ((__pure__))
 # else
 #  define _UC_ATTRIBUTE_PURE
 # endif
 #endif
 
+/* Qualifier in a function declaration, that asserts that the caller must
+   pass a pointer to a different object in the specified pointer argument
+   than in the other pointer arguments.  */
+#ifndef _UC_RESTRICT
+# if defined __restrict \
+     || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+     || __clang_major__ >= 3
+#  define _UC_RESTRICT __restrict
+# elif 199901L <= __STDC_VERSION__ || defined restrict
+#  define _UC_RESTRICT restrict
+# else
+#  define _UC_RESTRICT
+# endif
+#endif
+
 #endif /* _UNITYPES_H */
diff --git a/linux_musl-lib/uniwidth.h b/linux_musl-lib/uniwidth.h
index cb79a70..7980449 100644
--- a/linux_musl-lib/uniwidth.h
+++ b/linux_musl-lib/uniwidth.h
@@ -1,19 +1,19 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* Display width functions.
-   Copyright (C) 2001-2002, 2005, 2007, 2009-2019 Free Software Foundation,
+   Copyright (C) 2001-2002, 2005, 2007, 2009-2021 Free Software Foundation,
    Inc.
 
-   This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _UNIWIDTH_H
diff --git a/linux_musl-lib/wchar.h b/linux_musl-lib/wchar.h
index d02029a..e5f5f8f 100644
--- a/linux_musl-lib/wchar.h
+++ b/linux_musl-lib/wchar.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A substitute for ISO C99 <wchar.h>, for platforms that have issues.
 
-   Copyright (C) 2007-2019 Free Software Foundation, Inc.
+   Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Eric Blake.  */
 
@@ -34,7 +34,8 @@
 #if (((defined __need_mbstate_t || defined __need_wint_t)               \
       && !defined __MINGW32__)                                          \
      || (defined __hpux                                                 \
-         && ((defined _INTTYPES_INCLUDED && !defined strtoimax)         \
+         && ((defined _INTTYPES_INCLUDED                                \
+              && !defined _GL_FINISHED_INCLUDING_SYSTEM_INTTYPES_H)     \
              || defined _GL_JUST_INCLUDE_SYSTEM_WCHAR_H))               \
      || (defined __MINGW32__ && defined __STRING_H_SOURCED__)           \
      || defined _GL_ALREADY_INCLUDING_WCHAR_H)
@@ -65,20 +66,12 @@
 # include <features.h> /* for __GLIBC__ */
 #endif
 
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.
-   In some builds of uClibc, <wchar.h> is nonexistent and wchar_t is defined
+/* In some builds of uClibc, <wchar.h> is nonexistent and wchar_t is defined
    by <stddef.h>.
    But avoid namespace pollution on glibc systems.  */
 #if !(defined __GLIBC__ && !defined __UCLIBC__)
 # include <stddef.h>
 #endif
-#ifndef __GLIBC__
-# include <stdio.h>
-# include <time.h>
-#endif
 
 /* Include the original <wchar.h> if it exists.
    Some builds of uClibc lack it.  */
@@ -94,27 +87,29 @@
 
 /* The __attribute__ feature is available in gcc versions 2.5 and later.
    The attribute __pure__ was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define _GL_ATTRIBUTE_PURE /* empty */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
 #endif
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -249,6 +244,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -274,6 +279,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -371,7 +384,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -399,14 +412,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -420,26 +430,26 @@
 
 /* The definition of _GL_ARG_NONNULL is copied here.  */
 /* A C macro for declaring that specific arguments must not be NULL.
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
    that the values passed as arguments n, ..., m must be non-NULL pointers.
    n = 1 stands for the first argument, n = 2 for the second argument etc.  */
 #ifndef _GL_ARG_NONNULL
-# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
 #  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
 # else
 #  define _GL_ARG_NONNULL(params)
@@ -448,19 +458,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -536,6 +546,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -548,24 +565,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -611,16 +639,27 @@
 
 /* Override mbstate_t if it is too small.
    On IRIX 6.5, sizeof (mbstate_t) == 1, which is not sufficient for
-   implementing mbrtowc for encodings like UTF-8.  */
-#if !(1 && 1) || 0
+   implementing mbrtowc for encodings like UTF-8.
+   On AIX and MSVC, mbrtowc needs to be overridden, but mbstate_t exists and is
+   large enough and overriding it would cause problems in C++ mode.  */
+#if !(((defined _WIN32 && !defined __CYGWIN__) || 1) && 1) || 0
 # if !GNULIB_defined_mbstate_t
+#  if !(defined _AIX || defined _MSC_VER)
 typedef int rpl_mbstate_t;
-#  undef mbstate_t
-#  define mbstate_t rpl_mbstate_t
+#   undef mbstate_t
+#   define mbstate_t rpl_mbstate_t
+#  endif
 #  define GNULIB_defined_mbstate_t 1
 # endif
 #endif
 
+/* Declare 'free' if needed for _GL_ATTRIBUTE_DEALLOC_FREE.  */
+#if (1 && !defined free \
+     && !(defined __cplusplus && defined GNULIB_NAMESPACE))
+_GL_EXTERN_C void free (void *);
+# define free rpl_free
+#endif
+_GL_EXTERN_C void free (void *);
 
 /* Convert a single-byte character to a wide character.  */
 #if 0
@@ -713,16 +752,20 @@
 #   define mbrtowc rpl_mbrtowc
 #  endif
 _GL_FUNCDECL_RPL (mbrtowc, size_t,
-                  (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n,
+                   mbstate_t *restrict ps));
 _GL_CXXALIAS_RPL (mbrtowc, size_t,
-                  (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n,
+                   mbstate_t *restrict ps));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (mbrtowc, size_t,
-                  (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n,
+                   mbstate_t *restrict ps));
 #  endif
 _GL_CXXALIAS_SYS (mbrtowc, size_t,
-                  (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+                  (wchar_t *restrict pwc, const char *restrict s, size_t n,
+                   mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (mbrtowc);
@@ -743,13 +786,17 @@
 #   undef mbrlen
 #   define mbrlen rpl_mbrlen
 #  endif
-_GL_FUNCDECL_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
-_GL_CXXALIAS_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
+_GL_FUNCDECL_RPL (mbrlen, size_t,
+                  (const char *restrict s, size_t n, mbstate_t *restrict ps));
+_GL_CXXALIAS_RPL (mbrlen, size_t,
+                  (const char *restrict s, size_t n, mbstate_t *restrict ps));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
+_GL_FUNCDECL_SYS (mbrlen, size_t,
+                  (const char *restrict s, size_t n, mbstate_t *restrict ps));
 #  endif
-_GL_CXXALIAS_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
+_GL_CXXALIAS_SYS (mbrlen, size_t,
+                  (const char *restrict s, size_t n, mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (mbrlen);
@@ -771,20 +818,26 @@
 #   define mbsrtowcs rpl_mbsrtowcs
 #  endif
 _GL_FUNCDECL_RPL (mbsrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (mbsrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t len,
-                   mbstate_t *ps));
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t len,
+                   mbstate_t *restrict ps));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (mbsrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 #  endif
 _GL_CXXALIAS_SYS (mbsrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t len,
-                   mbstate_t *ps));
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t len,
+                   mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (mbsrtowcs);
@@ -806,22 +859,26 @@
 #   define mbsnrtowcs rpl_mbsnrtowcs
 #  endif
 _GL_FUNCDECL_RPL (mbsnrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps)
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t srclen, size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (mbsnrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps));
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t srclen, size_t len,
+                   mbstate_t *restrict ps));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (mbsnrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps)
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t srclen, size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 #  endif
 _GL_CXXALIAS_SYS (mbsnrtowcs, size_t,
-                  (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps));
+                  (wchar_t *restrict dest,
+                   const char **restrict srcp, size_t srclen, size_t len,
+                   mbstate_t *restrict ps));
 # endif
 _GL_CXXALIASWARN (mbsnrtowcs);
 #elif defined GNULIB_POSIXCHECK
@@ -840,13 +897,17 @@
 #   undef wcrtomb
 #   define wcrtomb rpl_wcrtomb
 #  endif
-_GL_FUNCDECL_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
-_GL_CXXALIAS_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
+_GL_FUNCDECL_RPL (wcrtomb, size_t,
+                  (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
+_GL_CXXALIAS_RPL (wcrtomb, size_t,
+                  (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
+_GL_FUNCDECL_SYS (wcrtomb, size_t,
+                  (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
 #  endif
-_GL_CXXALIAS_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
+_GL_CXXALIAS_SYS (wcrtomb, size_t,
+                  (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcrtomb);
@@ -868,20 +929,26 @@
 #   define wcsrtombs rpl_wcsrtombs
 #  endif
 _GL_FUNCDECL_RPL (wcsrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
+                  (char *restrict dest, const wchar_t **restrict srcp,
+                   size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (wcsrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t len,
-                   mbstate_t *ps));
+                  (char *restrict dest, const wchar_t **restrict srcp,
+                   size_t len,
+                   mbstate_t *restrict ps));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (wcsrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
+                  (char *restrict dest, const wchar_t **restrict srcp,
+                   size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 #  endif
 _GL_CXXALIAS_SYS (wcsrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t len,
-                   mbstate_t *ps));
+                  (char *restrict dest, const wchar_t **restrict srcp,
+                   size_t len,
+                   mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsrtombs);
@@ -903,22 +970,30 @@
 #   define wcsnrtombs rpl_wcsnrtombs
 #  endif
 _GL_FUNCDECL_RPL (wcsnrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps)
+                  (char *restrict dest,
+                   const wchar_t **restrict srcp, size_t srclen,
+                   size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 _GL_CXXALIAS_RPL (wcsnrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps));
+                  (char *restrict dest,
+                   const wchar_t **restrict srcp, size_t srclen,
+                   size_t len,
+                   mbstate_t *restrict ps));
 # else
 #  if !1 || (defined __cplusplus && defined __sun)
 _GL_FUNCDECL_SYS (wcsnrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps)
+                  (char *restrict dest,
+                   const wchar_t **restrict srcp, size_t srclen,
+                   size_t len,
+                   mbstate_t *restrict ps)
                   _GL_ARG_NONNULL ((2)));
 #  endif
 _GL_CXXALIAS_SYS (wcsnrtombs, size_t,
-                  (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
-                   mbstate_t *ps));
+                  (char *restrict dest,
+                   const wchar_t **restrict srcp, size_t srclen,
+                   size_t len,
+                   mbstate_t *restrict ps));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsnrtombs);
@@ -1016,10 +1091,12 @@
 #if 0
 # if !1
 _GL_FUNCDECL_SYS (wmemcpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # endif
 _GL_CXXALIAS_SYS (wmemcpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wmemcpy);
 # endif
@@ -1053,6 +1130,29 @@
 #endif
 
 
+/* Copy N wide characters of SRC to DEST.
+   Return pointer to wide characters after the last written wide character.  */
+#if 0
+# if !1
+_GL_FUNCDECL_SYS (wmempcpy, wchar_t *,
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wmempcpy, wchar_t *,
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wmempcpy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmempcpy
+# if HAVE_RAW_DECL_WMEMPCPY
+_GL_WARN_ON_USE (wmempcpy, "wmempcpy is unportable - "
+                 "use gnulib module wmempcpy for portability");
+# endif
+#endif
+
+
 /* Set N wide characters of S to C.  */
 #if 0
 # if !1
@@ -1109,9 +1209,11 @@
 /* Copy SRC to DEST.  */
 #if 0
 # if !1
-_GL_FUNCDECL_SYS (wcscpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_FUNCDECL_SYS (wcscpy, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # endif
-_GL_CXXALIAS_SYS (wcscpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_CXXALIAS_SYS (wcscpy, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcscpy);
 # endif
@@ -1127,9 +1229,11 @@
 /* Copy SRC to DEST, returning the address of the terminating L'\0' in DEST.  */
 #if 0
 # if !1
-_GL_FUNCDECL_SYS (wcpcpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_FUNCDECL_SYS (wcpcpy, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # endif
-_GL_CXXALIAS_SYS (wcpcpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_CXXALIAS_SYS (wcpcpy, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 _GL_CXXALIASWARN (wcpcpy);
 #elif defined GNULIB_POSIXCHECK
 # undef wcpcpy
@@ -1144,10 +1248,12 @@
 #if 0
 # if !1
 _GL_FUNCDECL_SYS (wcsncpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # endif
 _GL_CXXALIAS_SYS (wcsncpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsncpy);
 # endif
@@ -1165,10 +1271,12 @@
 #if 0
 # if !1
 _GL_FUNCDECL_SYS (wcpncpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 # endif
 _GL_CXXALIAS_SYS (wcpncpy, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest,
+                   const wchar_t *restrict src, size_t n));
 _GL_CXXALIASWARN (wcpncpy);
 #elif defined GNULIB_POSIXCHECK
 # undef wcpncpy
@@ -1182,9 +1290,11 @@
 /* Append SRC onto DEST.  */
 #if 0
 # if !1
-_GL_FUNCDECL_SYS (wcscat, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_FUNCDECL_SYS (wcscat, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # endif
-_GL_CXXALIAS_SYS (wcscat, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_CXXALIAS_SYS (wcscat, wchar_t *,
+                  (wchar_t *restrict dest, const wchar_t *restrict src));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcscat);
 # endif
@@ -1201,10 +1311,12 @@
 #if 0
 # if !1
 _GL_FUNCDECL_SYS (wcsncat, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest, const wchar_t *restrict src,
+                   size_t n));
 # endif
 _GL_CXXALIAS_SYS (wcsncat, wchar_t *,
-                  (wchar_t *dest, const wchar_t *src, size_t n));
+                  (wchar_t *restrict dest, const wchar_t *restrict src,
+                   size_t n));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsncat);
 # endif
@@ -1317,9 +1429,11 @@
    original strings.  */
 #if 0
 # if !1
-_GL_FUNCDECL_SYS (wcsxfrm, size_t, (wchar_t *s1, const wchar_t *s2, size_t n));
+_GL_FUNCDECL_SYS (wcsxfrm, size_t,
+                  (wchar_t *restrict s1, const wchar_t *restrict s2, size_t n));
 # endif
-_GL_CXXALIAS_SYS (wcsxfrm, size_t, (wchar_t *s1, const wchar_t *s2, size_t n));
+_GL_CXXALIAS_SYS (wcsxfrm, size_t,
+                  (wchar_t *restrict s1, const wchar_t *restrict s2, size_t n));
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsxfrm);
 # endif
@@ -1334,16 +1448,55 @@
 
 /* Duplicate S, returning an identical malloc'd string.  */
 #if 0
-# if !1
-_GL_FUNCDECL_SYS (wcsdup, wchar_t *, (const wchar_t *s));
-# endif
+# if defined _WIN32 && !defined __CYGWIN__
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef wcsdup
+#   define wcsdup _wcsdup
+#  endif
+_GL_CXXALIAS_MDA (wcsdup, wchar_t *, (const wchar_t *s));
+# else
+#  if !1 || __GNUC__ >= 11
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
+                  (const wchar_t *s)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#  endif
 _GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s));
+# endif
 _GL_CXXALIASWARN (wcsdup);
-#elif defined GNULIB_POSIXCHECK
-# undef wcsdup
-# if HAVE_RAW_DECL_WCSDUP
+#else
+# if __GNUC__ >= 11 && !defined wcsdup
+/* For -Wmismatched-dealloc: Associate wcsdup with free or rpl_free.  */
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
+                  (const wchar_t *s)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+# endif
+# if defined GNULIB_POSIXCHECK
+#  undef wcsdup
+#  if HAVE_RAW_DECL_WCSDUP
 _GL_WARN_ON_USE (wcsdup, "wcsdup is unportable - "
                  "use gnulib module wcsdup for portability");
+#  endif
+# elif 1
+/* On native Windows, map 'wcsdup' to '_wcsdup', so that -loldnames is not
+   required.  In C++ with GNULIB_NAMESPACE, avoid differences between
+   platforms by defining GNULIB_NAMESPACE::wcsdup always.  */
+#  if defined _WIN32 && !defined __CYGWIN__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef wcsdup
+#    define wcsdup _wcsdup
+#   endif
+_GL_CXXALIAS_MDA (wcsdup, wchar_t *, (const wchar_t *s));
+#  else
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
+                  (const wchar_t *s)
+                  _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
+#   if 1
+_GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s));
+#   endif
+#  endif
+#  if (defined _WIN32 && !defined __CYGWIN__) || 1
+_GL_CXXALIASWARN (wcsdup);
+#  endif
 # endif
 #endif
 
@@ -1485,7 +1638,8 @@
 #if 0
 # if !1
 _GL_FUNCDECL_SYS (wcsstr, wchar_t *,
-                  (const wchar_t *haystack, const wchar_t *needle)
+                  (const wchar_t *restrict haystack,
+                   const wchar_t *restrict needle)
                   _GL_ATTRIBUTE_PURE);
 # endif
   /* On some systems, this function is defined as an overloaded function:
@@ -1494,14 +1648,18 @@
          wchar_t * std::wcsstr (wchar_t *, const wchar_t *);
        }  */
 _GL_CXXALIAS_SYS_CAST2 (wcsstr,
-                        wchar_t *, (const wchar_t *, const wchar_t *),
-                        const wchar_t *, (const wchar_t *, const wchar_t *));
+                        wchar_t *,
+                        (const wchar_t *restrict, const wchar_t *restrict),
+                        const wchar_t *,
+                        (const wchar_t *restrict, const wchar_t *restrict));
 # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
      && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
 _GL_CXXALIASWARN1 (wcsstr, wchar_t *,
-                   (wchar_t *haystack, const wchar_t *needle));
+                   (wchar_t *restrict haystack,
+                    const wchar_t *restrict needle));
 _GL_CXXALIASWARN1 (wcsstr, const wchar_t *,
-                   (const wchar_t *haystack, const wchar_t *needle));
+                   (const wchar_t *restrict haystack,
+                    const wchar_t *restrict needle));
 # elif __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsstr);
 # endif
@@ -1522,16 +1680,20 @@
 #   define wcstok rpl_wcstok
 #  endif
 _GL_FUNCDECL_RPL (wcstok, wchar_t *,
-                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+                  (wchar_t *restrict wcs, const wchar_t *restrict delim,
+                   wchar_t **restrict ptr));
 _GL_CXXALIAS_RPL (wcstok, wchar_t *,
-                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+                  (wchar_t *restrict wcs, const wchar_t *restrict delim,
+                   wchar_t **restrict ptr));
 # else
 #  if !1
 _GL_FUNCDECL_SYS (wcstok, wchar_t *,
-                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+                  (wchar_t *restrict wcs, const wchar_t *restrict delim,
+                   wchar_t **restrict ptr));
 #  endif
 _GL_CXXALIAS_SYS (wcstok, wchar_t *,
-                  (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+                  (wchar_t *restrict wcs, const wchar_t *restrict delim,
+                   wchar_t **restrict ptr));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcstok);
@@ -1583,19 +1745,27 @@
 #   undef wcsftime
 #   define wcsftime rpl_wcsftime
 #  endif
-_GL_FUNCDECL_RPL (wcsftime, size_t, (wchar_t *__buf, size_t __bufsize,
-                                     const wchar_t *__fmt, const struct tm *__tp)
-                                    _GL_ARG_NONNULL ((1, 3, 4)));
-_GL_CXXALIAS_RPL (wcsftime, size_t, (wchar_t *__buf, size_t __bufsize,
-                                     const wchar_t *__fmt, const struct tm *__tp));
+_GL_FUNCDECL_RPL (wcsftime, size_t,
+                  (wchar_t *restrict __buf, size_t __bufsize,
+                   const wchar_t *restrict __fmt,
+                   const struct tm *restrict __tp)
+                  _GL_ARG_NONNULL ((1, 3, 4)));
+_GL_CXXALIAS_RPL (wcsftime, size_t,
+                  (wchar_t *restrict __buf, size_t __bufsize,
+                   const wchar_t *restrict __fmt,
+                   const struct tm *restrict __tp));
 # else
 #  if !1
-_GL_FUNCDECL_SYS (wcsftime, size_t, (wchar_t *__buf, size_t __bufsize,
-                                     const wchar_t *__fmt, const struct tm *__tp)
-                                    _GL_ARG_NONNULL ((1, 3, 4)));
+_GL_FUNCDECL_SYS (wcsftime, size_t,
+                  (wchar_t *restrict __buf, size_t __bufsize,
+                   const wchar_t *restrict __fmt,
+                   const struct tm *restrict __tp)
+                  _GL_ARG_NONNULL ((1, 3, 4)));
 #  endif
-_GL_CXXALIAS_SYS (wcsftime, size_t, (wchar_t *__buf, size_t __bufsize,
-                                     const wchar_t *__fmt, const struct tm *__tp));
+_GL_CXXALIAS_SYS (wcsftime, size_t,
+                  (wchar_t *restrict __buf, size_t __bufsize,
+                   const wchar_t *restrict __fmt,
+                   const struct tm *restrict __tp));
 # endif
 # if __GLIBC__ >= 2
 _GL_CXXALIASWARN (wcsftime);
diff --git a/linux_musl-lib/wctype.h b/linux_musl-lib/wctype.h
index 3055531..e593107 100644
--- a/linux_musl-lib/wctype.h
+++ b/linux_musl-lib/wctype.h
@@ -1,20 +1,20 @@
 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 /* A substitute for ISO C99 <wctype.h>, for platforms that lack it.
 
-   Copyright (C) 2006-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2021 Free Software Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,
+   This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+   GNU Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Bruno Haible and Paul Eggert.  */
 
@@ -46,14 +46,7 @@
 #ifndef _GL_WCTYPE_H
 
 #if 1
-/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.
-   Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-# include <stddef.h>
-# include <stdio.h>
-# include <time.h>
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
 # include <wchar.h>
 #endif
 
@@ -86,19 +79,19 @@
 
 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
 /* C++ compatible function declaration macros.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef _GL_CXXDEFS_H
@@ -233,6 +226,16 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+   is to be used when func is a Microsoft deprecated alias, on native Windows.
+   It declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to _func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
    is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
    except that the C function rpl_func may have a slightly different
@@ -258,6 +261,14 @@
     _GL_EXTERN_C int _gl_cxxalias_dummy
 #endif
 
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_MDA (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
 /* _GL_CXXALIAS_SYS (func, rettype, parameters);
    declares a C++ alias called GNULIB_NAMESPACE::func
    that redirects to the system provided function func, if GNULIB_NAMESPACE
@@ -355,7 +366,7 @@
    _GL_CXXALIASWARN_2 (func, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN_2(func,namespace) \
     _GL_WARN_ON_USE (func, \
                      "The symbol ::" #func " refers to the system function. " \
@@ -383,14 +394,11 @@
    _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
 /* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
    we enable the warning only when not optimizing.  */
-# if !__OPTIMIZE__
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+    _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
                          "The symbol ::" #func " refers to the system function. " \
                          "Use " #namespace "::" #func " instead.")
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
-#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
-     extern __typeof__ (func) func
 # else
 #  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
      _GL_EXTERN_C int _gl_cxxalias_dummy
@@ -404,19 +412,19 @@
 
 /* The definition of _GL_WARN_ON_USE is copied here.  */
 /* A C macro for emitting warnings if a function is used.
-   Copyright (C) 2010-2019 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3 of the License, or
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* _GL_WARN_ON_USE (function, "literal string") issues a declaration
@@ -492,6 +500,13 @@
 extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
 #  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
   __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__diagnose_if__ (1, message, "warning")))
 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
 #  define _GL_WARN_ON_USE(function, message) \
@@ -504,24 +519,35 @@
 # endif
 #endif
 
-/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
-   is like _GL_WARN_ON_USE (function, "string"), except that the function is
-   declared with the given prototype, consisting of return type, parameters,
-   and attributes.
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+   is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+   function is declared with the given prototype, consisting of return type,
+   parameters, and attributes.
    This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
    not work in this case.  */
 #ifndef _GL_WARN_ON_USE_CXX
-# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes \
-     __attribute__ ((__warning__ (msg)))
-# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# if !defined __cplusplus
+#  define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+     _GL_WARN_ON_USE (function, msg)
+# else
+#  if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+  __attribute__ ((__warning__ (msg)))
+#  elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+  __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#  elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
 /* Verify the existence of the function.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
-extern rettype function parameters_and_attributes
-# else /* Unsupported.  */
-#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+#  else /* Unsupported.  */
+#   define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
 _GL_WARN_EXTERN_C int _gl_warn_on_use
+#  endif
 # endif
 #endif
 
@@ -616,7 +642,7 @@
 _GL_WCTYPE_INLINE int
 rpl_iswdigit (wint_t wc)
 {
-  return ((wchar_t) wc == wc ? iswdigit ((wchar_t) wc) : 0);
+  return ((wchar_t) wc == wc ? wc >= '0' && wc <= '9' : 0);
 }
 
 _GL_WCTYPE_INLINE int
@@ -658,7 +684,10 @@
 _GL_WCTYPE_INLINE int
 rpl_iswxdigit (wint_t wc)
 {
-  return ((wchar_t) wc == wc ? iswxdigit ((wchar_t) wc) : 0);
+  return ((wchar_t) wc == wc
+          ? (wc >= '0' && wc <= '9')
+            || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F')
+          : 0);
 }
 
 _GL_WCTYPE_INLINE wint_t
@@ -911,16 +940,39 @@
 
 #  endif
 
-# elif 1 && (! 1 || 0)
-/* Only the iswblank function is missing.  */
+# else
+/* Only some of the functions are missing or broken.  */
 
-#  if 0
-#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-#    define iswblank rpl_iswblank
-#   endif
+#  if 1 && (! 1 || 0)
+/* Only the iswblank function is missing.  */
+#   if 0
+#    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#     define iswblank rpl_iswblank
+#    endif
 _GL_FUNCDECL_RPL (iswblank, int, (wint_t wc));
-#  else
+#   else
 _GL_FUNCDECL_SYS (iswblank, int, (wint_t wc));
+#   endif
+#  endif
+
+#  if 1
+#   if 0
+#    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#     undef iswdigit
+#     define iswdigit rpl_iswdigit
+#    endif
+_GL_FUNCDECL_RPL (iswdigit, int, (wint_t wc));
+#   endif
+#  endif
+
+#  if 1
+#   if 0
+#    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#     undef iswxdigit
+#     define iswxdigit rpl_iswxdigit
+#    endif
+_GL_FUNCDECL_RPL (iswxdigit, int, (wint_t wc));
+#   endif
 #  endif
 
 # endif
@@ -965,28 +1017,62 @@
 
 #if 0
 _GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
-_GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
 #else
 _GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc));
+#endif
+#if 1
+# if 0
+_GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
+# else
 _GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc));
+# endif
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswlower, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswprint, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswspace, int, (wint_t wc));
+#endif
+#if 0
+_GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
+#else
 _GL_CXXALIAS_SYS (iswupper, int, (wint_t wc));
+#endif
+#if 1
+# if 0
+_GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
+# else
 _GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc));
+# endif
 #endif
 #if __GLIBC__ >= 2
 _GL_CXXALIASWARN (iswalnum);
diff --git a/m4/00gnulib.m4 b/m4/00gnulib.m4
index e3e0fb6..9ba1743 100644
--- a/m4/00gnulib.m4
+++ b/m4/00gnulib.m4
@@ -1,43 +1,82 @@
-# 00gnulib.m4 serial 3
-dnl Copyright (C) 2009-2019 Free Software Foundation, Inc.
+# 00gnulib.m4 serial 8
+dnl Copyright (C) 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl This file must be named something that sorts before all other
-dnl gnulib-provided .m4 files.  It is needed until such time as we can
-dnl assume Autoconf 2.64, with its improved AC_DEFUN_ONCE and
-dnl m4_divert semantics.
+dnl gnulib-provided .m4 files.  It is needed until the clang fix has
+dnl been included in Autoconf.
 
-# Until autoconf 2.63, handling of the diversion stack required m4_init
-# to be called first; but this does not happen with aclocal.  Wrapping
-# the entire execution in another layer of the diversion stack fixes this.
-# Worse, prior to autoconf 2.62, m4_wrap depended on the underlying m4
-# for whether it was FIFO or LIFO; in order to properly balance with
-# m4_init, we need to undo our push just before anything wrapped within
-# the m4_init body.  The way to ensure this is to wrap both sides of
-# m4_init with a one-shot macro that does the pop at the right time.
-m4_ifndef([_m4_divert_diversion],
-[m4_divert_push([KILL])
-m4_define([gl_divert_fixup], [m4_divert_pop()m4_define([$0])])
-m4_define([m4_init],
-  [gl_divert_fixup()]m4_defn([m4_init])[gl_divert_fixup()])])
-
-
-# AC_DEFUN_ONCE([NAME], VALUE)
-# ----------------------------
-# Define NAME to expand to VALUE on the first use (whether by direct
-# expansion, or by AC_REQUIRE), and to nothing on all subsequent uses.
-# Avoid bugs in AC_REQUIRE in Autoconf 2.63 and earlier.  This
-# definition is slower than the version in Autoconf 2.64, because it
-# can only use interfaces that existed since 2.59; but it achieves the
-# same effect.  Quoting is necessary to avoid confusing Automake.
-m4_version_prereq([2.63.263], [],
-[m4_define([AC][_DEFUN_ONCE],
-  [AC][_DEFUN([$1],
-    [AC_REQUIRE([_gl_DEFUN_ONCE([$1])],
-      [m4_indir([_gl_DEFUN_ONCE([$1])])])])]dnl
-[AC][_DEFUN([_gl_DEFUN_ONCE([$1])], [$2])])])
+# The following definitions arrange to use a compiler option
+# -Werror=implicit-function-declaration in AC_CHECK_DECL, when the
+# compiler is clang.  Without it, clang implicitly declares "known"
+# library functions in C mode, but not in C++ mode, which would cause
+# Gnulib to omit a declaration and thus later produce an error in C++
+# mode.  As of clang 9.0, these "known" functions are identified through
+# LIBBUILTIN invocations in the LLVM source file
+# llvm/tools/clang/include/clang/Basic/Builtins.def.
+# It's not possible to AC_REQUIRE the extra tests from AC_CHECK_DECL,
+# because AC_CHECK_DECL, like other Autoconf built-ins, is not supposed
+# to AC_REQUIRE anything: some configure.ac files have their first
+# AC_CHECK_DECL executed conditionally.  Therefore append the extra tests
+# to AC_PROG_CC.
+AC_DEFUN([gl_COMPILER_CLANG],
+[
+dnl AC_REQUIRE([AC_PROG_CC])
+  AC_CACHE_CHECK([whether the compiler is clang],
+    [gl_cv_compiler_clang],
+    [dnl Use _AC_COMPILE_IFELSE instead of AC_EGREP_CPP, to avoid error
+     dnl "circular dependency of AC_LANG_COMPILER(C)" if AC_PROG_CC has
+     dnl not yet been invoked.
+     _AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM([[
+           #ifdef __clang__
+           barfbarf
+           #endif
+           ]],[[]])
+        ],
+        [gl_cv_compiler_clang=no],
+        [gl_cv_compiler_clang=yes])
+    ])
+])
+AC_DEFUN([gl_COMPILER_PREPARE_CHECK_DECL],
+[
+dnl AC_REQUIRE([AC_PROG_CC])
+dnl AC_REQUIRE([gl_COMPILER_CLANG])
+  AC_CACHE_CHECK([for compiler option needed when checking for declarations],
+    [gl_cv_compiler_check_decl_option],
+    [if test $gl_cv_compiler_clang = yes; then
+       dnl Test whether the compiler supports the option
+       dnl '-Werror=implicit-function-declaration'.
+       save_ac_compile="$ac_compile"
+       ac_compile="$ac_compile -Werror=implicit-function-declaration"
+       dnl Use _AC_COMPILE_IFELSE instead of AC_COMPILE_IFELSE, to avoid a
+       dnl warning "AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS".
+       _AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[]])],
+         [gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration'],
+         [gl_cv_compiler_check_decl_option=none])
+       ac_compile="$save_ac_compile"
+     else
+       gl_cv_compiler_check_decl_option=none
+     fi
+    ])
+  if test "x$gl_cv_compiler_check_decl_option" != xnone; then
+    ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option"
+  else
+    ac_compile_for_check_decl="$ac_compile"
+  fi
+])
+dnl Redefine _AC_CHECK_DECL_BODY so that it references ac_compile_for_check_decl
+dnl instead of ac_compile.  If, for whatever reason, the override of AC_PROG_CC
+dnl in zzgnulib.m4 is inactive, use the original ac_compile.
+m4_define([_AC_CHECK_DECL_BODY],
+[  ac_save_ac_compile="$ac_compile"
+  if test -n "$ac_compile_for_check_decl"; then
+    ac_compile="$ac_compile_for_check_decl"
+  fi]
+m4_defn([_AC_CHECK_DECL_BODY])[  ac_compile="$ac_save_ac_compile"
+])
 
 # gl_00GNULIB
 # -----------
diff --git a/m4/__inline.m4 b/m4/__inline.m4
index e1aa310..b28cc6a 100644
--- a/m4/__inline.m4
+++ b/m4/__inline.m4
@@ -1,5 +1,5 @@
 # Test for __inline keyword
-dnl Copyright 2017-2019 Free Software Foundation, Inc.
+dnl Copyright 2017-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/absolute-header.m4 b/m4/absolute-header.m4
index a8f2cba..52d80d0 100644
--- a/m4/absolute-header.m4
+++ b/m4/absolute-header.m4
@@ -1,5 +1,5 @@
-# absolute-header.m4 serial 16
-dnl Copyright (C) 2006-2019 Free Software Foundation, Inc.
+# absolute-header.m4 serial 17
+dnl Copyright (C) 2006-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -22,23 +22,21 @@
 AC_DEFUN([gl_ABSOLUTE_HEADER],
 [AC_REQUIRE([AC_CANONICAL_HOST])
 AC_LANG_PREPROC_REQUIRE()dnl
-dnl FIXME: gl_absolute_header and ac_header_exists must be used unquoted
-dnl until we can assume autoconf 2.64 or newer.
 m4_foreach_w([gl_HEADER_NAME], [$1],
   [AS_VAR_PUSHDEF([gl_absolute_header],
                   [gl_cv_absolute_]m4_defn([gl_HEADER_NAME]))dnl
   AC_CACHE_CHECK([absolute name of <]m4_defn([gl_HEADER_NAME])[>],
-    m4_defn([gl_absolute_header]),
+    [gl_absolute_header],
     [AS_VAR_PUSHDEF([ac_header_exists],
                     [ac_cv_header_]m4_defn([gl_HEADER_NAME]))dnl
     AC_CHECK_HEADERS_ONCE(m4_defn([gl_HEADER_NAME]))dnl
-    if test AS_VAR_GET(ac_header_exists) = yes; then
+    if test AS_VAR_GET([ac_header_exists]) = yes; then
       gl_ABSOLUTE_HEADER_ONE(m4_defn([gl_HEADER_NAME]))
     fi
     AS_VAR_POPDEF([ac_header_exists])dnl
     ])dnl
   AC_DEFINE_UNQUOTED(AS_TR_CPP([ABSOLUTE_]m4_defn([gl_HEADER_NAME])),
-                     ["AS_VAR_GET(gl_absolute_header)"],
+                     ["AS_VAR_GET([gl_absolute_header])"],
                      [Define this to an absolute name of <]m4_defn([gl_HEADER_NAME])[>.])
   AS_VAR_POPDEF([gl_absolute_header])dnl
 ])dnl
diff --git a/m4/access.m4 b/m4/access.m4
new file mode 100644
index 0000000..1194114
--- /dev/null
+++ b/m4/access.m4
@@ -0,0 +1,16 @@
+# access.m4 serial 1
+dnl Copyright (C) 2019-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ACCESS],
+[
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  dnl On native Windows, access (= _access) does not support the X_OK mode.
+  dnl It works by chance on some versions of mingw.
+  case "$host_os" in
+    mingw*) REPLACE_ACCESS=1 ;;
+  esac
+])
diff --git a/m4/alloca.m4 b/m4/alloca.m4
index 29bd289..ba2f679 100644
--- a/m4/alloca.m4
+++ b/m4/alloca.m4
@@ -1,5 +1,5 @@
-# alloca.m4 serial 15
-dnl Copyright (C) 2002-2004, 2006-2007, 2009-2019 Free Software Foundation,
+# alloca.m4 serial 20
+dnl Copyright (C) 2002-2004, 2006-2007, 2009-2021 Free Software Foundation,
 dnl Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -50,13 +50,13 @@
 # STACK_DIRECTION is already handled by AC_FUNC_ALLOCA.
 AC_DEFUN([gl_PREREQ_ALLOCA], [:])
 
-# This works around a bug in autoconf <= 2.68.
-# See <https://lists.gnu.org/r/bug-gnulib/2011-06/msg00277.html>.
+m4_version_prereq([2.70], [], [
 
-m4_version_prereq([2.69], [] ,[
-
-# This is taken from the following Autoconf patch:
-# https://git.savannah.gnu.org/gitweb/?p=autoconf.git;a=commitdiff;h=6cd9f12520b0d6f76d3230d7565feba1ecf29497
+# This works around a bug in autoconf <= 2.68 and has simplifications
+# from 2.70.  See:
+# https://lists.gnu.org/r/bug-gnulib/2011-06/msg00277.html
+# https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=6cd9f12520b0d6f76d3230d7565feba1ecf29497
+# https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=15edf7fd8094fd14a89d9891dd72a9624762597a
 
 # _AC_LIBOBJ_ALLOCA
 # -----------------
@@ -72,26 +72,6 @@
 AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.$ac_objext])dnl
 AC_DEFINE(C_ALLOCA, 1, [Define to 1 if using 'alloca.c'.])
 
-AC_CACHE_CHECK(whether 'alloca.c' needs Cray hooks, ac_cv_os_cray,
-[AC_EGREP_CPP(webecray,
-[#if defined CRAY && ! defined CRAY2
-webecray
-#else
-wenotbecray
-#endif
-], ac_cv_os_cray=yes, ac_cv_os_cray=no)])
-if test $ac_cv_os_cray = yes; then
-  for ac_func in _getb67 GETB67 getb67; do
-    AC_CHECK_FUNC($ac_func,
-                  [AC_DEFINE_UNQUOTED(CRAY_STACKSEG_END, $ac_func,
-                                      [Define to one of '_getb67', 'GETB67',
-                                       'getb67' for Cray-2 and Cray-YMP
-                                       systems. This function is required for
-                                       'alloca.c' support on those systems.])
-    break])
-  done
-fi
-
 AC_CACHE_CHECK([stack direction for C alloca],
                [ac_cv_c_stack_direction],
 [AC_RUN_IFELSE([AC_LANG_SOURCE(
@@ -122,7 +102,7 @@
         STACK_DIRECTION > 0 => grows toward higher addresses
         STACK_DIRECTION < 0 => grows toward lower addresses
         STACK_DIRECTION = 0 => direction of growth unknown */
-@%:@undef STACK_DIRECTION])dnl
+#undef STACK_DIRECTION])dnl
 AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction)
 ])# _AC_LIBOBJ_ALLOCA
 ])
diff --git a/m4/asm-underscore.m4 b/m4/asm-underscore.m4
index 0f6bee4..93b98be 100644
--- a/m4/asm-underscore.m4
+++ b/m4/asm-underscore.m4
@@ -1,5 +1,5 @@
-# asm-underscore.m4 serial 4
-dnl Copyright (C) 2010-2019 Free Software Foundation, Inc.
+# asm-underscore.m4 serial 5
+dnl Copyright (C) 2010-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -63,8 +63,19 @@
 MicrosoftCompiler
 #endif
     ],
-    [gl_asmext='asm'
-     gl_c_asm_opt='-c -Fa'
+    [dnl Microsoft's 'cl' and 'clang-cl' produce an .asm file, whereas 'clang'
+     dnl produces a .s file. Need to distinguish 'clang' and 'clang-cl'.
+     rm -f conftest*
+     echo 'int dummy;' > conftest.c
+     AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c) >/dev/null 2>&1
+     if test -f conftest.o; then
+       gl_asmext='s'
+       gl_c_asm_opt='-S'
+     else
+       gl_asmext='asm'
+       gl_c_asm_opt='-c -Fa'
+     fi
+     rm -f conftest*
     ],
     [gl_asmext='s'
      gl_c_asm_opt='-S'
diff --git a/m4/assert.m4 b/m4/assert.m4
index 15048a7..b5e56d7 100644
--- a/m4/assert.m4
+++ b/m4/assert.m4
@@ -1,6 +1,6 @@
 #serial 7
 
-# Copyright (C) 1998-1999, 2001, 2004, 2008-2019 Free Software Foundation, Inc.
+# Copyright (C) 1998-1999, 2001, 2004, 2008-2021 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
diff --git a/m4/bison-check-compiler-flag.m4 b/m4/bison-check-compiler-flag.m4
index 7a2db57..fc30a29 100644
--- a/m4/bison-check-compiler-flag.m4
+++ b/m4/bison-check-compiler-flag.m4
@@ -2,7 +2,7 @@
 
 # serial 1
 
-# Copyright (C) 2018 Free Software Foundation, # Inc.
+# Copyright (C) 2018-2021 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
diff --git a/m4/bison-cxx-std.m4 b/m4/bison-cxx-std.m4
index afef998..dd8a534 100644
--- a/m4/bison-cxx-std.m4
+++ b/m4/bison-cxx-std.m4
@@ -1,28 +1,28 @@
 # bison-cxx-std.m4 serial 1
 
-# Copyright (C) 2018 Free Software Foundation, # Inc.
+# Copyright (C) 2018-2021 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 m4_define([_BISON_CXXSTD_98_snippet],
-[#include <vector>
-
-typedef std::vector<int> ints;
-])
+[[]])
 
 m4_define([_BISON_CXXSTD_03_snippet],
-[])
+[[]])
 
 m4_define([_BISON_CXXSTD_11_snippet],
-[#include <algorithm>
+[[  // C++11
+#include <algorithm>
+#include <cassert>
 #include <memory>
 #include <set>
 #include <sstream>
 #include <string>
+#include <utility> // std::swap
+#include <vector>
 
-  // C++11
   template <typename T>
   struct check
   {
@@ -66,10 +66,26 @@
 
   // GCC 4.8.2 on Solaris 11.3 does not support to_string.
   auto e = std::to_string(42);
-])
+
+  // Needed by glr2.cc.
+  void cxx11_vector_data ()
+  {
+    std::vector<int> ints;
+    ints.emplace_back (42);
+    assert (ints.data () == &ints[0]);
+  }
+
+  // Needed by glr2.cc.
+  void cxx11_array_swap ()
+  {
+    int i0[4] = { 1, 2, 3, 4 };
+    int i1[4] = { 5, 6, 7, 8 };
+    std::swap (i0, i1);
+  }
+]])
 
 m4_define([_BISON_CXXSTD_14_snippet],
-[  // C++14
+[[  // C++14
   void mismatch()
   {
     using ints = std::vector<int>;
@@ -78,20 +94,24 @@
     std::mismatch(std::begin(v1), std::end(v1),
                   std::begin(v2), std::end(v2));
   }
-])
+]])
 
 m4_define([_BISON_CXXSTD_17_snippet],
-[  // C++17
+[[  // C++17
   namespace ns1::ns2::ns3 {}
 
 #include <optional>
   auto opt_string = std::optional<std::string>{};
   auto out = std::ostringstream{};
-])
+]])
 
-m4_define([_BISON_CXXSTD_2A_snippet],
-[  // C++2A
-])
+m4_define([_BISON_CXXSTD_20_snippet],
+[[  // C++20
+]])
+
+m4_define([_BISON_CXXSTD_2B_snippet],
+[[  // C++2B
+]])
 
 
 m4_define([_BISON_CXXSTD_testbody(98)],
@@ -129,14 +149,25 @@
 _BISON_CXXSTD_17_snippet
 ])])
 
-m4_define([_BISON_CXXSTD_testbody(2a)],
+m4_define([_BISON_CXXSTD_testbody(20)],
 [AC_LANG_PROGRAM([
 _BISON_CXXSTD_98_snippet
 _BISON_CXXSTD_03_snippet
 _BISON_CXXSTD_11_snippet
 _BISON_CXXSTD_14_snippet
 _BISON_CXXSTD_17_snippet
-_BISON_CXXSTD_2A_snippet
+_BISON_CXXSTD_20_snippet
+])])
+
+m4_define([_BISON_CXXSTD_testbody(2b)],
+[AC_LANG_PROGRAM([
+_BISON_CXXSTD_98_snippet
+_BISON_CXXSTD_03_snippet
+_BISON_CXXSTD_11_snippet
+_BISON_CXXSTD_14_snippet
+_BISON_CXXSTD_17_snippet
+_BISON_CXXSTD_20_snippet
+_BISON_CXXSTD_2B_snippet
 ])])
 
 
@@ -148,7 +179,7 @@
 
 # BISON_CXXSTD(STD)
 # -----------------
-# Check whether the C++ compiler support STD (11, 98, 2a, etc.).
+# Check whether the C++ compiler supports STD (11, 98, 2b, etc.).
 # If it does, AC_SUBST 'CXX<STD>_CXXFLAGS' to the corresponding flags.
 AC_DEFUN([BISON_CXXSTD],
 [AC_REQUIRE([AC_PROG_CXX])
diff --git a/m4/bison-i18n.m4 b/m4/bison-i18n.m4
index a45df0d..59ab5c4 100644
--- a/m4/bison-i18n.m4
+++ b/m4/bison-i18n.m4
@@ -1,6 +1,6 @@
 # bison-i18n.m4 serial 2
 
-dnl Copyright (C) 2005-2006, 2009-2015, 2018-2019 Free Software
+dnl Copyright (C) 2005-2006, 2009-2015, 2018-2021 Free Software
 dnl Foundation, Inc.
 
 dnl This file is free software; the Free Software Foundation
diff --git a/m4/builtin-expect.m4 b/m4/builtin-expect.m4
new file mode 100644
index 0000000..c584116
--- /dev/null
+++ b/m4/builtin-expect.m4
@@ -0,0 +1,49 @@
+dnl Check for __builtin_expect.
+
+dnl Copyright 2016-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Paul Eggert.
+
+AC_DEFUN([gl___BUILTIN_EXPECT],
+[
+  AC_CACHE_CHECK([for __builtin_expect],
+    [gl_cv___builtin_expect],
+    [AC_LINK_IFELSE(
+       [AC_LANG_SOURCE([[
+         int
+         main (int argc, char **argv)
+         {
+           argc = __builtin_expect (argc, 100);
+           return argv[argc != 100][0];
+         }]])],
+       [gl_cv___builtin_expect=yes],
+       [AC_LINK_IFELSE(
+          [AC_LANG_SOURCE([[
+             #include <builtins.h>
+             int
+             main (int argc, char **argv)
+             {
+               argc = __builtin_expect (argc, 100);
+               return argv[argc != 100][0];
+             }]])],
+          [gl_cv___builtin_expect="in <builtins.h>"],
+          [gl_cv___builtin_expect=no])])])
+  if test "$gl_cv___builtin_expect" = yes; then
+    AC_DEFINE([HAVE___BUILTIN_EXPECT], [1])
+  elif test "$gl_cv___builtin_expect" = "in <builtins.h>"; then
+    AC_DEFINE([HAVE___BUILTIN_EXPECT], [2])
+  fi
+  AH_VERBATIM([HAVE___BUILTIN_EXPECT],
+    [/* Define to 1 if the compiler supports __builtin_expect,
+   and to 2 if <builtins.h> does.  */
+#undef HAVE___BUILTIN_EXPECT
+#ifndef HAVE___BUILTIN_EXPECT
+# define __builtin_expect(e, c) (e)
+#elif HAVE___BUILTIN_EXPECT == 2
+# include <builtins.h>
+#endif
+    ])
+])
diff --git a/m4/c-working.m4 b/m4/c-working.m4
index 33f7d7f..0fcc512 100644
--- a/m4/c-working.m4
+++ b/m4/c-working.m4
@@ -1,6 +1,6 @@
 # Sanity test a C compiler.
 
-# Copyright (C) 2006, 2009-2015, 2018-2019 Free Software Foundation,
+# Copyright (C) 2006, 2009-2015, 2018-2021 Free Software Foundation,
 # Inc.
 #
 # This program is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 # Written by Paul Eggert.
 
diff --git a/m4/calloc.m4 b/m4/calloc.m4
index 15fb07c..fe12b15 100644
--- a/m4/calloc.m4
+++ b/m4/calloc.m4
@@ -1,6 +1,6 @@
-# calloc.m4 serial 20
+# calloc.m4 serial 27
 
-# Copyright (C) 2004-2019 Free Software Foundation, Inc.
+# Copyright (C) 2004-2021 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -14,80 +14,69 @@
 
 # _AC_FUNC_CALLOC_IF([IF-WORKS], [IF-NOT])
 # -------------------------------------
-# If 'calloc (0, 0)' is properly handled, run IF-WORKS, otherwise, IF-NOT.
+# If calloc is compatible with GNU calloc, run IF-WORKS, otherwise, IF-NOT.
 AC_DEFUN([_AC_FUNC_CALLOC_IF],
 [
-  AC_REQUIRE([AC_TYPE_SIZE_T])dnl
   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
-  AC_CACHE_CHECK([for GNU libc compatible calloc],
+  AC_CACHE_CHECK([whether calloc (0, n) and calloc (n, 0) return nonnull],
     [ac_cv_func_calloc_0_nonnull],
-    [AC_RUN_IFELSE(
-       [AC_LANG_PROGRAM(
-          [AC_INCLUDES_DEFAULT],
-          [[int result = 0;
-            char *p = calloc (0, 0);
-            if (!p)
-              result |= 1;
-            free (p);
-            p = calloc ((size_t) -1 / 8 + 1, 8);
-            if (p)
-              result |= 2;
-            free (p);
-            return result;
-          ]])],
-       [ac_cv_func_calloc_0_nonnull=yes],
-       [ac_cv_func_calloc_0_nonnull=no],
-       [case "$host_os" in
-                         # Guess yes on glibc systems.
-          *-gnu* | gnu*) ac_cv_func_calloc_0_nonnull="guessing yes" ;;
-                         # Guess yes on musl systems.
-          *-musl*)       ac_cv_func_calloc_0_nonnull="guessing yes" ;;
-                         # Guess yes on native Windows.
-          mingw*)        ac_cv_func_calloc_0_nonnull="guessing yes" ;;
-                         # If we don't know, obey --enable-cross-guesses.
-          *)             ac_cv_func_calloc_0_nonnull="$gl_cross_guess_normal" ;;
-        esac
-       ])])
-  case "$ac_cv_func_calloc_0_nonnull" in
-    *yes)
-      $1
-      ;;
-    *)
-      $2
-      ;;
-  esac
-])# AC_FUNC_CALLOC
+    [if test $cross_compiling != yes; then
+       ac_cv_func_calloc_0_nonnull=yes
+       AC_RUN_IFELSE(
+         [AC_LANG_PROGRAM(
+            [AC_INCLUDES_DEFAULT],
+            [[int result = 0;
+              char * volatile p = calloc (0, 0);
+              if (!p)
+                result |= 1;
+              free (p);
+              return result;
+            ]])],
+         [],
+         [ac_cv_func_calloc_0_nonnull=no])
+     else
+       case "$host_os" in
+                        # Guess yes on glibc systems.
+         *-gnu* | gnu*) ac_cv_func_calloc_0_nonnull="guessing yes" ;;
+                        # Guess yes on musl systems.
+         *-musl*)       ac_cv_func_calloc_0_nonnull="guessing yes" ;;
+                        # Guess yes on native Windows.
+         mingw*)        ac_cv_func_calloc_0_nonnull="guessing yes" ;;
+                        # If we don't know, obey --enable-cross-guesses.
+         *)             ac_cv_func_calloc_0_nonnull="$gl_cross_guess_normal" ;;
+       esac
+     fi
+    ])
+  AS_CASE([$ac_cv_func_calloc_0_nonnull], [*yes], [$1], [$2])
+])
 
 
 # gl_FUNC_CALLOC_GNU
 # ------------------
-# Report whether 'calloc (0, 0)' is properly handled, and replace calloc if
-# needed.
+# Replace calloc if it is not compatible with GNU libc.
 AC_DEFUN([gl_FUNC_CALLOC_GNU],
 [
   AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
-  _AC_FUNC_CALLOC_IF(
-    [AC_DEFINE([HAVE_CALLOC_GNU], [1],
-               [Define to 1 if your system has a GNU libc compatible 'calloc'
-                function, and to 0 otherwise.])],
-    [AC_DEFINE([HAVE_CALLOC_GNU], [0])
-     REPLACE_CALLOC=1
-    ])
+  AC_REQUIRE([gl_FUNC_CALLOC_POSIX])
+  if test $REPLACE_CALLOC = 0; then
+    _AC_FUNC_CALLOC_IF([], [REPLACE_CALLOC=1])
+  fi
 ])# gl_FUNC_CALLOC_GNU
 
-
 # gl_FUNC_CALLOC_POSIX
 # --------------------
 # Test whether 'calloc' is POSIX compliant (sets errno to ENOMEM when it
-# fails), and replace calloc if it is not.
+# fails, and doesn't mess up with ptrdiff_t or size_t overflow),
+# and replace calloc if it is not.
 AC_DEFUN([gl_FUNC_CALLOC_POSIX],
 [
   AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
-  AC_REQUIRE([gl_CHECK_MALLOC_POSIX])
-  if test $gl_cv_func_malloc_posix = yes; then
-    AC_DEFINE([HAVE_CALLOC_POSIX], [1],
-      [Define if the 'calloc' function is POSIX compliant.])
-  else
+  AC_REQUIRE([gl_FUNC_MALLOC_POSIX])
+  if test $REPLACE_MALLOC = 1; then
     REPLACE_CALLOC=1
   fi
+  dnl Although in theory we should also test for size_t overflow,
+  dnl in practice testing for ptrdiff_t overflow suffices
+  dnl since PTRDIFF_MAX <= SIZE_MAX on all known Gnulib porting targets.
+  dnl A separate size_t test would slow down 'configure'.
 ])
diff --git a/m4/canonicalize.m4 b/m4/canonicalize.m4
index cb0896f..0dfb2da 100644
--- a/m4/canonicalize.m4
+++ b/m4/canonicalize.m4
@@ -1,6 +1,6 @@
-# canonicalize.m4 serial 31
+# canonicalize.m4 serial 37
 
-dnl Copyright (C) 2003-2007, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2003-2007, 2009-2021 Free Software Foundation, Inc.
 
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -11,7 +11,8 @@
 AC_DEFUN([gl_FUNC_CANONICALIZE_FILENAME_MODE],
 [
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
-  AC_CHECK_FUNCS_ONCE([canonicalize_file_name])
+  AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
+  AC_CHECK_FUNCS_ONCE([canonicalize_file_name faccessat])
   AC_REQUIRE([gl_DOUBLE_SLASH_ROOT])
   AC_REQUIRE([gl_FUNC_REALPATH_WORKS])
   if test $ac_cv_func_canonicalize_file_name = no; then
@@ -56,7 +57,17 @@
 AC_DEFUN([gl_CANONICALIZE_LGPL_SEPARATE],
 [
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
-  AC_CHECK_FUNCS_ONCE([canonicalize_file_name getcwd readlink])
+  AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
+  AC_CHECK_FUNCS_ONCE([canonicalize_file_name faccessat])
+
+  dnl On native Windows, we use _getcwd(), regardless whether getcwd() is
+  dnl available through the linker option '-loldnames'.
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  case "$host_os" in
+    mingw*) ;;
+    *)      AC_CHECK_FUNCS([getcwd]) ;;
+  esac
+
   AC_REQUIRE([gl_DOUBLE_SLASH_ROOT])
   AC_REQUIRE([gl_FUNC_REALPATH_WORKS])
   AC_CHECK_HEADERS_ONCE([sys/param.h])
@@ -67,67 +78,106 @@
 # so is the latter.
 AC_DEFUN([gl_FUNC_REALPATH_WORKS],
 [
-  AC_CHECK_FUNCS_ONCE([realpath])
+  AC_CHECK_FUNCS_ONCE([realpath lstat])
   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
   AC_CACHE_CHECK([whether realpath works], [gl_cv_func_realpath_works], [
+    rm -rf conftest.a conftest.d
     touch conftest.a
+    # Assume that if we have lstat, we can also check symlinks.
+    if test $ac_cv_func_lstat = yes; then
+      ln -s conftest.a conftest.l
+    fi
     mkdir conftest.d
     AC_RUN_IFELSE([
       AC_LANG_PROGRAM([[
         ]GL_NOCRASH[
+        #include <errno.h>
         #include <stdlib.h>
         #include <string.h>
       ]], [[
         int result = 0;
+        /* This test fails on Solaris 10.  */
         {
           char *name = realpath ("conftest.a", NULL);
           if (!(name && *name == '/'))
             result |= 1;
           free (name);
         }
+        /* This test fails on older versions of Cygwin.  */
         {
           char *name = realpath ("conftest.b/../conftest.a", NULL);
           if (name != NULL)
             result |= 2;
           free (name);
         }
+        /* This test fails on Cygwin 2.9.  */
+        #if HAVE_LSTAT
         {
-          char *name = realpath ("conftest.a/", NULL);
-          if (name != NULL)
+          char *name = realpath ("conftest.l/../conftest.a", NULL);
+          if (name != NULL || errno != ENOTDIR)
             result |= 4;
           free (name);
         }
+        #endif
+        /* This test fails on Mac OS X 10.13, OpenBSD 6.0.  */
+        {
+          char *name = realpath ("conftest.a/", NULL);
+          if (name != NULL)
+            result |= 8;
+          free (name);
+        }
+        /* This test fails on AIX 7, Solaris 10.  */
         {
           char *name1 = realpath (".", NULL);
           char *name2 = realpath ("conftest.d//./..", NULL);
           if (! name1 || ! name2 || strcmp (name1, name2))
-            result |= 8;
+            result |= 16;
           free (name1);
           free (name2);
         }
+        #ifdef __linux__
+        /* On Linux, // is the same as /. See also double-slash-root.m4.
+           realpath() should respect this.
+           This test fails on musl libc 1.2.2.  */
+        {
+          char *name = realpath ("//", NULL);
+          if (! name || strcmp (name, "/"))
+            result |= 32;
+          free (name);
+        }
+        #endif
         return result;
       ]])
      ],
      [gl_cv_func_realpath_works=yes],
-     [gl_cv_func_realpath_works=no],
+     [case $? in
+        32) gl_cv_func_realpath_works=nearly ;;
+        *)  gl_cv_func_realpath_works=no ;;
+      esac
+     ],
      [case "$host_os" in
                        # Guess yes on glibc systems.
         *-gnu* | gnu*) gl_cv_func_realpath_works="guessing yes" ;;
-                       # Guess yes on musl systems.
-        *-musl*)       gl_cv_func_realpath_works="guessing yes" ;;
+                       # Guess 'nearly' on musl systems.
+        *-musl*)       gl_cv_func_realpath_works="guessing nearly" ;;
+                       # Guess no on Cygwin.
+        cygwin*)       gl_cv_func_realpath_works="guessing no" ;;
                        # Guess no on native Windows.
         mingw*)        gl_cv_func_realpath_works="guessing no" ;;
                        # If we don't know, obey --enable-cross-guesses.
         *)             gl_cv_func_realpath_works="$gl_cross_guess_normal" ;;
       esac
      ])
-    rm -rf conftest.a conftest.d
+    rm -rf conftest.a conftest.l conftest.d
   ])
   case "$gl_cv_func_realpath_works" in
     *yes)
-      AC_DEFINE([FUNC_REALPATH_WORKS], [1], [Define to 1 if realpath()
-        can malloc memory, always gives an absolute path, and handles
-        trailing slash correctly.])
+      AC_DEFINE([FUNC_REALPATH_WORKS], [1],
+        [Define to 1 if realpath() can malloc memory, always gives an absolute path, and handles leading slashes and a trailing slash correctly.])
+      ;;
+    *nearly)
+      AC_DEFINE([FUNC_REALPATH_NEARLY_WORKS], [1],
+        [Define to 1 if realpath() can malloc memory, always gives an absolute path, and handles a trailing slash correctly.])
       ;;
   esac
 ])
diff --git a/m4/chdir-long.m4 b/m4/chdir-long.m4
new file mode 100644
index 0000000..e5cd8df
--- /dev/null
+++ b/m4/chdir-long.m4
@@ -0,0 +1,30 @@
+#serial 17
+
+# Use Gnulib's robust chdir function.
+# It can handle arbitrarily long directory names, which means
+# that when it is given the name of an existing directory, it
+# never fails with ENAMETOOLONG.
+# Arrange to compile chdir-long.c only on systems that define PATH_MAX.
+
+dnl Copyright (C) 2004-2007, 2009-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Jim Meyering.
+
+AC_DEFUN([gl_FUNC_CHDIR_LONG],
+[
+  AC_REQUIRE([gl_PATHMAX_SNIPPET_PREREQ])
+  AC_CACHE_CHECK([whether this system supports file names of any length],
+    [gl_cv_have_unlimited_file_name_length],
+    [AC_EGREP_CPP([have_arbitrary_file_name_length_limit],
+                  gl_PATHMAX_SNIPPET[
+#ifdef PATH_MAX
+have_arbitrary_file_name_length_limit
+#endif],
+    [gl_cv_have_unlimited_file_name_length=no],
+    [gl_cv_have_unlimited_file_name_length=yes])])
+])
+
+AC_DEFUN([gl_PREREQ_CHDIR_LONG], [:])
diff --git a/m4/clock_time.m4 b/m4/clock_time.m4
index 8f7a7fc..c3b9e7e 100644
--- a/m4/clock_time.m4
+++ b/m4/clock_time.m4
@@ -1,5 +1,5 @@
 # clock_time.m4 serial 10
-dnl Copyright (C) 2002-2006, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2002-2006, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/close.m4 b/m4/close.m4
index 7013a13..77a5047 100644
--- a/m4/close.m4
+++ b/m4/close.m4
@@ -1,5 +1,5 @@
 # close.m4 serial 9
-dnl Copyright (C) 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/closedir.m4 b/m4/closedir.m4
new file mode 100644
index 0000000..fc55a21
--- /dev/null
+++ b/m4/closedir.m4
@@ -0,0 +1,31 @@
+# closedir.m4 serial 6
+dnl Copyright (C) 2011-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_CLOSEDIR],
+[
+  AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+  AC_CHECK_FUNCS([closedir])
+  if test $ac_cv_func_closedir = no; then
+    HAVE_CLOSEDIR=0
+  fi
+  dnl Replace closedir() for supporting the gnulib-defined fchdir() function,
+  dnl to keep fchdir's bookkeeping up-to-date.
+  m4_ifdef([gl_FUNC_FCHDIR], [
+    gl_TEST_FCHDIR
+    if test $HAVE_FCHDIR = 0; then
+      if test $HAVE_CLOSEDIR = 1; then
+        REPLACE_CLOSEDIR=1
+      fi
+    fi
+  ])
+  dnl Replace closedir() for supporting the gnulib-defined dirfd() function.
+  case $host_os,$HAVE_CLOSEDIR in
+    os2*,1)
+      REPLACE_CLOSEDIR=1;;
+  esac
+])
diff --git a/m4/codeset.m4 b/m4/codeset.m4
index 280f556..629f4ee 100644
--- a/m4/codeset.m4
+++ b/m4/codeset.m4
@@ -1,5 +1,5 @@
 # codeset.m4 serial 5 (gettext-0.18.2)
-dnl Copyright (C) 2000-2002, 2006, 2008-2014, 2016, 2019 Free Software
+dnl Copyright (C) 2000-2002, 2006, 2008-2014, 2016, 2019-2021 Free Software
 dnl Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
diff --git a/m4/config-h.m4 b/m4/config-h.m4
index 7379df7..b3be47b 100644
--- a/m4/config-h.m4
+++ b/m4/config-h.m4
@@ -1,6 +1,6 @@
 # Say that -DHAVE_CONFIG_H is not needed.
 
-dnl Copyright (C) 2006, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/configmake.m4 b/m4/configmake.m4
index 0571952..d4f20ee 100644
--- a/m4/configmake.m4
+++ b/m4/configmake.m4
@@ -1,5 +1,5 @@
-# configmake.m4 serial 3
-dnl Copyright (C) 2010-2019 Free Software Foundation, Inc.
+# configmake.m4 serial 4
+dnl Copyright (C) 2010-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -9,7 +9,7 @@
 # gl_CONFIGMAKE_PREP
 # ------------------
 # Guarantee all of the standard directory variables, even when used with
-# autoconf 2.63 (runstatedir wasn't supported before 2.70) or
+# autoconf 2.64 (runstatedir wasn't supported before 2.70) or
 # automake 1.11 (runstatedir isn't supported even in 1.16.1).
 AC_DEFUN([gl_CONFIGMAKE_PREP],
 [
diff --git a/m4/cxx.m4 b/m4/cxx.m4
index 6e9c891..1172f55 100644
--- a/m4/cxx.m4
+++ b/m4/cxx.m4
@@ -1,7 +1,7 @@
 # -*- Autoconf -*-
 # Sanity-test a C++ compiler.
 #
-# Copyright (C) 2004, 2006, 2009-2015, 2018-2019 Free Software
+# Copyright (C) 2004, 2006, 2009-2015, 2018-2021 Free Software
 # Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
@@ -15,7 +15,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 # Written by Paul Eggert.
 
@@ -27,12 +27,13 @@
     bison_cv_cxx_works=no
     AC_COMPILE_IFELSE(
       [AC_LANG_PROGRAM(
-         [#include <cstdlib>
+         [[
+          #include <cstdlib>
           #include <iostream>
           #include <map>
           #include <string>
-          using namespace std;],
-         [std::cerr << "";
+          using namespace std;]],
+         [[std::cerr << "";
           cout << "";
           typedef std::pair<unsigned, int> uipair;
           std::map<unsigned, int> m;
@@ -40,7 +41,7 @@
           m.insert (uipair (4, -4));
           for (i = m.begin (); i != m.end (); ++i)
             if (i->first != 4)
-              return 1;])],
+              return 1;]])],
       [AS_IF([AC_TRY_COMMAND([$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD])],
          [AS_IF([test "$cross_compiling" = yes],
             [bison_cv_cxx_works=cross],
diff --git a/m4/d-ino.m4 b/m4/d-ino.m4
new file mode 100644
index 0000000..e4dcfeb
--- /dev/null
+++ b/m4/d-ino.m4
@@ -0,0 +1,60 @@
+# serial 20
+
+dnl From Jim Meyering.
+dnl
+dnl Check whether struct dirent has a member named d_ino.
+dnl
+
+# Copyright (C) 1997, 1999-2001, 2003-2004, 2006-2007, 2009-2021 Free Software
+# Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_CHECK_TYPE_STRUCT_DIRENT_D_INO],
+  [AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+   AC_CACHE_CHECK([for d_ino member in directory struct],
+                  [gl_cv_struct_dirent_d_ino],
+     [AC_RUN_IFELSE(
+        [AC_LANG_PROGRAM(
+           [[#include <sys/types.h>
+             #include <sys/stat.h>
+             #include <dirent.h>
+           ]],
+           [[DIR *dp = opendir (".");
+             struct dirent *e;
+             struct stat st;
+             if (! dp)
+               return 1;
+             e = readdir (dp);
+             if (! e)
+               { closedir (dp); return 2; }
+             if (lstat (e->d_name, &st) != 0)
+               { closedir (dp); return 3; }
+             if (e->d_ino != st.st_ino)
+               { closedir (dp); return 4; }
+             closedir (dp);
+             return 0;
+           ]])],
+           [gl_cv_struct_dirent_d_ino=yes],
+           [gl_cv_struct_dirent_d_ino=no],
+           [case "$host_os" in
+                            # Guess yes on glibc systems with Linux kernel.
+              linux*-gnu*)  gl_cv_struct_dirent_d_ino="guessing yes" ;;
+                            # Guess yes on musl systems with Linux kernel.
+              linux*-musl*) gl_cv_struct_dirent_d_ino="guessing yes" ;;
+                            # Guess no on native Windows.
+              mingw*)       gl_cv_struct_dirent_d_ino="guessing no" ;;
+                            # If we don't know, obey --enable-cross-guesses.
+              *)            gl_cv_struct_dirent_d_ino="$gl_cross_guess_normal" ;;
+            esac
+           ])])
+   case "$gl_cv_struct_dirent_d_ino" in
+     *yes)
+       AC_DEFINE([D_INO_IN_DIRENT], [1],
+         [Define if struct dirent has a member d_ino that actually works.])
+       ;;
+   esac
+  ]
+)
diff --git a/m4/dirent_h.m4 b/m4/dirent_h.m4
new file mode 100644
index 0000000..17e2a20
--- /dev/null
+++ b/m4/dirent_h.m4
@@ -0,0 +1,79 @@
+# dirent_h.m4 serial 19
+dnl Copyright (C) 2008-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Bruno Haible.
+
+AC_DEFUN_ONCE([gl_DIRENT_H],
+[
+  dnl Ensure to expand the default settings once only, before all statements
+  dnl that occur in other macros.
+  AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+
+  dnl <dirent.h> is always overridden, because of GNULIB_POSIXCHECK.
+  gl_CHECK_NEXT_HEADERS([dirent.h])
+  if test $ac_cv_header_dirent_h = yes; then
+    HAVE_DIRENT_H=1
+  else
+    HAVE_DIRENT_H=0
+  fi
+  AC_SUBST([HAVE_DIRENT_H])
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use.
+  gl_WARN_ON_USE_PREPARE([[#include <dirent.h>
+    ]], [alphasort closedir dirfd fdopendir opendir readdir rewinddir scandir])
+])
+
+# gl_DIRENT_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
+AC_DEFUN([gl_DIRENT_MODULE_INDICATOR],
+[
+  dnl Ensure to expand the default settings once only.
+  gl_DIRENT_H_REQUIRE_DEFAULTS
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+  dnl Define it also as a C macro, for the benefit of the unit tests.
+  gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_DIRENT_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_DIRENT_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_UNISTD_H_REQUIRE_DEFAULTS dnl for REPLACE_FCHDIR
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_OPENDIR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_READDIR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REWINDDIR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CLOSEDIR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DIRFD])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FDOPENDIR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SCANDIR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ALPHASORT])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_DIRENT_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_DIRENT_H_DEFAULTS],
+[
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  HAVE_OPENDIR=1;       AC_SUBST([HAVE_OPENDIR])
+  HAVE_READDIR=1;       AC_SUBST([HAVE_READDIR])
+  HAVE_REWINDDIR=1;     AC_SUBST([HAVE_REWINDDIR])
+  HAVE_CLOSEDIR=1;      AC_SUBST([HAVE_CLOSEDIR])
+  HAVE_DECL_DIRFD=1;    AC_SUBST([HAVE_DECL_DIRFD])
+  HAVE_DECL_FDOPENDIR=1;AC_SUBST([HAVE_DECL_FDOPENDIR])
+  HAVE_FDOPENDIR=1;     AC_SUBST([HAVE_FDOPENDIR])
+  HAVE_SCANDIR=1;       AC_SUBST([HAVE_SCANDIR])
+  HAVE_ALPHASORT=1;     AC_SUBST([HAVE_ALPHASORT])
+  REPLACE_OPENDIR=0;    AC_SUBST([REPLACE_OPENDIR])
+  REPLACE_CLOSEDIR=0;   AC_SUBST([REPLACE_CLOSEDIR])
+  REPLACE_DIRFD=0;      AC_SUBST([REPLACE_DIRFD])
+  REPLACE_FDOPENDIR=0;  AC_SUBST([REPLACE_FDOPENDIR])
+])
diff --git a/m4/dirfd.m4 b/m4/dirfd.m4
new file mode 100644
index 0000000..3c9ce5d
--- /dev/null
+++ b/m4/dirfd.m4
@@ -0,0 +1,86 @@
+# serial 26   -*- Autoconf -*-
+
+dnl Find out how to get the file descriptor associated with an open DIR*.
+
+# Copyright (C) 2001-2006, 2008-2021 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+dnl From Jim Meyering
+
+AC_DEFUN([gl_FUNC_DIRFD],
+[
+  AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+  dnl Persuade glibc <dirent.h> to declare dirfd().
+  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+  AC_CHECK_FUNCS([dirfd])
+  AC_CHECK_DECLS([dirfd], , ,
+    [[#include <sys/types.h>
+      #include <dirent.h>]])
+  if test $ac_cv_have_decl_dirfd = no; then
+    HAVE_DECL_DIRFD=0
+  fi
+
+  AC_CACHE_CHECK([whether dirfd is a macro],
+    [gl_cv_func_dirfd_macro],
+    [AC_EGREP_CPP([dirent_header_defines_dirfd], [
+#include <sys/types.h>
+#include <dirent.h>
+#ifdef dirfd
+ dirent_header_defines_dirfd
+#endif],
+       [gl_cv_func_dirfd_macro=yes],
+       [gl_cv_func_dirfd_macro=no])])
+
+  # Use the replacement if we have no function or macro with that name,
+  # or if OS/2 kLIBC whose dirfd() does not work.
+  # Replace only if the system declares dirfd already.
+  case $ac_cv_func_dirfd,$gl_cv_func_dirfd_macro,$host_os,$ac_cv_have_decl_dirfd in
+    no,no,*,yes | *,*,os2*,yes)
+      REPLACE_DIRFD=1
+      AC_DEFINE([REPLACE_DIRFD], [1],
+        [Define to 1 if gnulib's dirfd() replacement is used.]);;
+  esac
+])
+
+dnl Prerequisites of lib/dirfd.c.
+AC_DEFUN([gl_PREREQ_DIRFD],
+[
+  AC_CACHE_CHECK([how to get the file descriptor associated with an open DIR*],
+                 [gl_cv_sys_dir_fd_member_name],
+    [
+      dirfd_save_CFLAGS=$CFLAGS
+      for ac_expr in d_fd dd_fd; do
+
+        CFLAGS="$CFLAGS -DDIR_FD_MEMBER_NAME=$ac_expr"
+        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+           #include <sys/types.h>
+           #include <dirent.h>]],
+          [[DIR *dir_p = opendir("."); (void) dir_p->DIR_FD_MEMBER_NAME;]])],
+          [dir_fd_found=yes]
+        )
+        CFLAGS=$dirfd_save_CFLAGS
+        test "$dir_fd_found" = yes && break
+      done
+      test "$dir_fd_found" = yes || ac_expr=no_such_member
+
+      gl_cv_sys_dir_fd_member_name=$ac_expr
+    ]
+  )
+  if test $gl_cv_sys_dir_fd_member_name != no_such_member; then
+    AC_DEFINE_UNQUOTED([DIR_FD_MEMBER_NAME],
+      [$gl_cv_sys_dir_fd_member_name],
+      [the name of the file descriptor member of DIR])
+  fi
+  AH_VERBATIM([DIR_TO_FD],
+              [#ifdef DIR_FD_MEMBER_NAME
+# define DIR_TO_FD(Dir_p) ((Dir_p)->DIR_FD_MEMBER_NAME)
+#else
+# define DIR_TO_FD(Dir_p) -1
+#endif
+])
+])
diff --git a/m4/dirname.m4 b/m4/dirname.m4
deleted file mode 100644
index 32141ae..0000000
--- a/m4/dirname.m4
+++ /dev/null
@@ -1,19 +0,0 @@
-#serial 10   -*- autoconf -*-
-dnl Copyright (C) 2002-2006, 2009-2019 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_DIRNAME],
-[
-  AC_REQUIRE([gl_DIRNAME_LGPL])
-])
-
-AC_DEFUN([gl_DIRNAME_LGPL],
-[
-  dnl Prerequisites of lib/dirname.h.
-  AC_REQUIRE([gl_DOUBLE_SLASH_ROOT])
-
-  dnl No prerequisites of lib/basename-lgpl.c, lib/dirname-lgpl.c,
-  dnl lib/stripslash.c.
-])
diff --git a/m4/double-slash-root.m4 b/m4/double-slash-root.m4
index 0c5afb1..c9bbcef 100644
--- a/m4/double-slash-root.m4
+++ b/m4/double-slash-root.m4
@@ -1,5 +1,5 @@
 # double-slash-root.m4 serial 4   -*- Autoconf -*-
-dnl Copyright (C) 2006, 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2006, 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/dup.m4 b/m4/dup.m4
new file mode 100644
index 0000000..433a466
--- /dev/null
+++ b/m4/dup.m4
@@ -0,0 +1,54 @@
+# dup.m4 serial 7
+dnl Copyright (C) 2011-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_DUP],
+[
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  m4_ifdef([gl_MSVC_INVAL], [
+    AC_REQUIRE([gl_MSVC_INVAL])
+    if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+      REPLACE_DUP=1
+    fi
+  ])
+  dnl Replace dup() for supporting the gnulib-defined fchdir() function,
+  dnl to keep fchdir's bookkeeping up-to-date.
+  m4_ifdef([gl_FUNC_FCHDIR], [
+    gl_TEST_FCHDIR
+    if test $HAVE_FCHDIR = 0; then
+      REPLACE_DUP=1
+    fi
+  ])
+  AC_CACHE_CHECK([whether dup works], [gl_cv_func_dup_works],
+    [AC_RUN_IFELSE(
+      [AC_LANG_PROGRAM([[#include <unistd.h>
+                         #include <fcntl.h>
+                         #include <errno.h>
+                       ]GL_MDA_DEFINES],
+         [[/* On OS/2 kLIBC, dup does not work on a directory fd.  */
+           int fd = open (".", O_RDONLY);
+           return fd < 0 ? 1 : dup (fd) < 0 ? 2 : 0;
+         ]])
+      ],
+      [gl_cv_func_dup_works=yes],
+      [gl_cv_func_dup_works=no],
+      [case "$host_os" in
+                 # Guess no on native Windows.
+         mingw*) gl_cv_func_dup_works="guessing no" ;;
+         *)      gl_cv_func_dup_works="guessing yes" ;;
+       esac
+      ])
+    ])
+  case "$gl_cv_func_dup_works" in
+    *yes) ;;
+    *)
+      REPLACE_DUP=1
+      ;;
+  esac
+])
+
+# Prerequisites of lib/dup.c.
+AC_DEFUN([gl_PREREQ_DUP], [:])
diff --git a/m4/dup2.m4 b/m4/dup2.m4
index b314247..0753a32 100644
--- a/m4/dup2.m4
+++ b/m4/dup2.m4
@@ -1,5 +1,5 @@
-#serial 25
-dnl Copyright (C) 2002, 2005, 2007, 2009-2019 Free Software Foundation, Inc.
+#serial 27
+dnl Copyright (C) 2002, 2005, 2007, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -8,107 +8,95 @@
 [
   AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
   AC_REQUIRE([AC_CANONICAL_HOST])
-  m4_ifdef([gl_FUNC_DUP2_OBSOLETE], [
-    AC_CHECK_FUNCS_ONCE([dup2])
-    if test $ac_cv_func_dup2 = no; then
-      HAVE_DUP2=0
-    fi
-  ], [
-    AC_DEFINE([HAVE_DUP2], [1], [Define to 1 if you have the 'dup2' function.])
-  ])
-  if test $HAVE_DUP2 = 1; then
-    AC_CACHE_CHECK([whether dup2 works], [gl_cv_func_dup2_works],
-      [AC_RUN_IFELSE([
-         AC_LANG_PROGRAM(
-           [[#include <errno.h>
-             #include <fcntl.h>
-             #include <limits.h>
-             #include <sys/resource.h>
-             #include <unistd.h>
-             #ifndef RLIM_SAVED_CUR
-             # define RLIM_SAVED_CUR RLIM_INFINITY
-             #endif
-             #ifndef RLIM_SAVED_MAX
-             # define RLIM_SAVED_MAX RLIM_INFINITY
-             #endif
-           ]],
-           [[int result = 0;
-             int bad_fd = INT_MAX;
-             struct rlimit rlim;
-             if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
-                 && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX
-                 && rlim.rlim_cur != RLIM_INFINITY
-                 && rlim.rlim_cur != RLIM_SAVED_MAX
-                 && rlim.rlim_cur != RLIM_SAVED_CUR)
-               bad_fd = rlim.rlim_cur;
-             #ifdef FD_CLOEXEC
-               if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1)
-                 result |= 1;
-             #endif
-             if (dup2 (1, 1) != 1)
-               result |= 2;
-             #ifdef FD_CLOEXEC
-               if (fcntl (1, F_GETFD) != FD_CLOEXEC)
-                 result |= 4;
-             #endif
-             close (0);
-             if (dup2 (0, 0) != -1)
-               result |= 8;
-             /* Many gnulib modules require POSIX conformance of EBADF.  */
-             if (dup2 (2, bad_fd) == -1 && errno != EBADF)
-               result |= 16;
-             /* Flush out some cygwin core dumps.  */
-             if (dup2 (2, -1) != -1 || errno != EBADF)
-               result |= 32;
-             dup2 (2, 255);
-             dup2 (2, 256);
-             /* On OS/2 kLIBC, dup2() does not work on a directory fd.  */
-             {
-               int fd = open (".", O_RDONLY);
-               if (fd == -1)
-                 result |= 64;
-               else if (dup2 (fd, fd + 1) == -1)
-                 result |= 128;
-
-               close (fd);
-             }
-             return result;]])
-        ],
-        [gl_cv_func_dup2_works=yes], [gl_cv_func_dup2_works=no],
-        [case "$host_os" in
-           mingw*) # on this platform, dup2 always returns 0 for success
-             gl_cv_func_dup2_works="guessing no" ;;
-           cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0
-             gl_cv_func_dup2_works="guessing no" ;;
-           aix* | freebsd*)
-                   # on AIX 7.1 and FreeBSD 6.1, dup2 (1,toobig) gives EMFILE,
-                   # not EBADF.
-             gl_cv_func_dup2_works="guessing no" ;;
-           haiku*) # on Haiku alpha 2, dup2(1, 1) resets FD_CLOEXEC.
-             gl_cv_func_dup2_works="guessing no" ;;
-           *-android*) # implemented using dup3(), which fails if oldfd == newfd
-             gl_cv_func_dup2_works="guessing no" ;;
-           os2*) # on OS/2 kLIBC, dup2() does not work on a directory fd.
-             gl_cv_func_dup2_works="guessing no" ;;
-           *) gl_cv_func_dup2_works="guessing yes" ;;
-         esac])
-      ])
-    case "$gl_cv_func_dup2_works" in
-      *yes) ;;
-      *)
-        REPLACE_DUP2=1
-        AC_CHECK_FUNCS([setdtablesize])
-        ;;
-    esac
-  fi
+  AC_CACHE_CHECK([whether dup2 works], [gl_cv_func_dup2_works],
+    [AC_RUN_IFELSE([
+       AC_LANG_PROGRAM(
+         [[#include <errno.h>
+           #include <fcntl.h>
+           #include <limits.h>
+           #include <sys/resource.h>
+           #include <unistd.h>
+           ]GL_MDA_DEFINES[
+           #ifndef RLIM_SAVED_CUR
+           # define RLIM_SAVED_CUR RLIM_INFINITY
+           #endif
+           #ifndef RLIM_SAVED_MAX
+           # define RLIM_SAVED_MAX RLIM_INFINITY
+           #endif
+         ]],
+         [[int result = 0;
+           int bad_fd = INT_MAX;
+           struct rlimit rlim;
+           if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
+               && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX
+               && rlim.rlim_cur != RLIM_INFINITY
+               && rlim.rlim_cur != RLIM_SAVED_MAX
+               && rlim.rlim_cur != RLIM_SAVED_CUR)
+             bad_fd = rlim.rlim_cur;
+           #ifdef FD_CLOEXEC
+             if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1)
+               result |= 1;
+           #endif
+           if (dup2 (1, 1) != 1)
+             result |= 2;
+           #ifdef FD_CLOEXEC
+             if (fcntl (1, F_GETFD) != FD_CLOEXEC)
+               result |= 4;
+           #endif
+           close (0);
+           if (dup2 (0, 0) != -1)
+             result |= 8;
+           /* Many gnulib modules require POSIX conformance of EBADF.  */
+           if (dup2 (2, bad_fd) == -1 && errno != EBADF)
+             result |= 16;
+           /* Flush out some cygwin core dumps.  */
+           if (dup2 (2, -1) != -1 || errno != EBADF)
+             result |= 32;
+           dup2 (2, 255);
+           dup2 (2, 256);
+           /* On OS/2 kLIBC, dup2() does not work on a directory fd.  */
+           {
+             int fd = open (".", O_RDONLY);
+             if (fd == -1)
+               result |= 64;
+             else if (dup2 (fd, fd + 1) == -1)
+               result |= 128;
+             close (fd);
+           }
+           return result;]])
+      ],
+      [gl_cv_func_dup2_works=yes], [gl_cv_func_dup2_works=no],
+      [case "$host_os" in
+         mingw*) # on this platform, dup2 always returns 0 for success
+           gl_cv_func_dup2_works="guessing no" ;;
+         cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0
+           gl_cv_func_dup2_works="guessing no" ;;
+         aix* | freebsd*)
+                 # on AIX 7.1 and FreeBSD 6.1, dup2 (1,toobig) gives EMFILE,
+                 # not EBADF.
+           gl_cv_func_dup2_works="guessing no" ;;
+         haiku*) # on Haiku alpha 2, dup2(1, 1) resets FD_CLOEXEC.
+           gl_cv_func_dup2_works="guessing no" ;;
+         *-android*) # implemented using dup3(), which fails if oldfd == newfd
+           gl_cv_func_dup2_works="guessing no" ;;
+         os2*) # on OS/2 kLIBC, dup2() does not work on a directory fd.
+           gl_cv_func_dup2_works="guessing no" ;;
+         *) gl_cv_func_dup2_works="guessing yes" ;;
+       esac])
+    ])
+  case "$gl_cv_func_dup2_works" in
+    *yes) ;;
+    *)
+      REPLACE_DUP2=1
+      AC_CHECK_FUNCS([setdtablesize])
+      ;;
+  esac
   dnl Replace dup2() for supporting the gnulib-defined fchdir() function,
   dnl to keep fchdir's bookkeeping up-to-date.
   m4_ifdef([gl_FUNC_FCHDIR], [
     gl_TEST_FCHDIR
     if test $HAVE_FCHDIR = 0; then
-      if test $HAVE_DUP2 = 1; then
-        REPLACE_DUP2=1
-      fi
+      REPLACE_DUP2=1
     fi
   ])
 ])
diff --git a/m4/eaccess.m4 b/m4/eaccess.m4
new file mode 100644
index 0000000..924eacb
--- /dev/null
+++ b/m4/eaccess.m4
@@ -0,0 +1,12 @@
+# eaccess.m4 serial 2
+dnl Copyright (C) 2003, 2009-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_EACCESS],
+[
+  AC_CHECK_FUNC([eaccess], ,
+    [AC_DEFINE([eaccess], [access],
+       [Define as 'access' if you don't have the eaccess() function.])])
+])
diff --git a/m4/eealloc.m4 b/m4/eealloc.m4
index 2a4b120..002f0c8 100644
--- a/m4/eealloc.m4
+++ b/m4/eealloc.m4
@@ -1,5 +1,5 @@
 # eealloc.m4 serial 3
-dnl Copyright (C) 2003, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2003, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/environ.m4 b/m4/environ.m4
index c1a6fa3..ae53291 100644
--- a/m4/environ.m4
+++ b/m4/environ.m4
@@ -1,5 +1,5 @@
-# environ.m4 serial 7
-dnl Copyright (C) 2001-2004, 2006-2019 Free Software Foundation, Inc.
+# environ.m4 serial 8
+dnl Copyright (C) 2001-2004, 2006-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -33,7 +33,8 @@
     [AC_COMPILE_IFELSE(
        [AC_LANG_PROGRAM(
           [[$1
-            extern struct { int foo; } $2;]],
+            typedef struct { int foo; } foo_t;
+            extern foo_t $2;]],
           [[$2.foo = 1;]])],
        [gt_cv_var=no],
        [gt_cv_var=yes])])
diff --git a/m4/errno_h.m4 b/m4/errno_h.m4
index 2388854..51dfe92 100644
--- a/m4/errno_h.m4
+++ b/m4/errno_h.m4
@@ -1,5 +1,5 @@
 # errno_h.m4 serial 13
-dnl Copyright (C) 2004, 2006, 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2004, 2006, 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/error.m4 b/m4/error.m4
index 393adb5..8e3cf95 100644
--- a/m4/error.m4
+++ b/m4/error.m4
@@ -1,6 +1,6 @@
-#serial 14
+#serial 15
 
-# Copyright (C) 1996-1998, 2001-2004, 2009-2019 Free Software Foundation, Inc.
+# Copyright (C) 1996-1998, 2001-2004, 2009-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -22,6 +22,10 @@
 # Prerequisites of lib/error.c.
 AC_DEFUN([gl_PREREQ_ERROR],
 [
+  dnl Use system extensions on Android, so that AC_FUNC_STRERROR_R
+  dnl discovers the GNU API for strerror_r on Android API level 23 and later.
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
   AC_REQUIRE([AC_FUNC_STRERROR_R])
   :
 ])
diff --git a/m4/execute.m4 b/m4/execute.m4
new file mode 100644
index 0000000..b5eab80
--- /dev/null
+++ b/m4/execute.m4
@@ -0,0 +1,11 @@
+# execute.m4 serial 5
+dnl Copyright (C) 2003, 2008-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_EXECUTE],
+[
+  dnl Prerequisites of lib/execute.c.
+  AC_REQUIRE([AC_TYPE_MODE_T])
+])
diff --git a/m4/exponentd.m4 b/m4/exponentd.m4
index 90870df..fb136f4 100644
--- a/m4/exponentd.m4
+++ b/m4/exponentd.m4
@@ -1,5 +1,5 @@
 # exponentd.m4 serial 3
-dnl Copyright (C) 2007-2008, 2010-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007-2008, 2010-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/exponentf.m4 b/m4/exponentf.m4
index cf8306b..308d023 100644
--- a/m4/exponentf.m4
+++ b/m4/exponentf.m4
@@ -1,5 +1,5 @@
 # exponentf.m4 serial 2
-dnl Copyright (C) 2007-2008, 2010-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007-2008, 2010-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/exponentl.m4 b/m4/exponentl.m4
index 4064981..508fe93 100644
--- a/m4/exponentl.m4
+++ b/m4/exponentl.m4
@@ -1,5 +1,5 @@
-# exponentl.m4 serial 4
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+# exponentl.m4 serial 5
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -22,14 +22,14 @@
         memory_long_double;
 static unsigned int ored_words[NWORDS];
 static unsigned int anded_words[NWORDS];
-static void add_to_ored_words (long double x)
+static void add_to_ored_words (long double *x)
 {
   memory_long_double m;
   size_t i;
   /* Clear it first, in case
      sizeof (long double) < sizeof (memory_long_double).  */
   memset (&m, 0, sizeof (memory_long_double));
-  m.value = x;
+  m.value = *x;
   for (i = 0; i < NWORDS; i++)
     {
       ored_words[i] |= m.word[i];
@@ -38,17 +38,15 @@
 }
 int main ()
 {
+  static long double samples[5] = { 0.25L, 0.5L, 1.0L, 2.0L, 4.0L };
   size_t j;
   FILE *fp = fopen ("conftest.out", "w");
   if (fp == NULL)
     return 1;
   for (j = 0; j < NWORDS; j++)
     anded_words[j] = ~ (unsigned int) 0;
-  add_to_ored_words (0.25L);
-  add_to_ored_words (0.5L);
-  add_to_ored_words (1.0L);
-  add_to_ored_words (2.0L);
-  add_to_ored_words (4.0L);
+  for (j = 0; j < 5; j++)
+    add_to_ored_words (&samples[j]);
   /* Remove bits that are common (e.g. if representation of the first mantissa
      bit is explicit).  */
   for (j = 0; j < NWORDS; j++)
diff --git a/m4/extensions.m4 b/m4/extensions.m4
index fd1ce81..5792a95 100644
--- a/m4/extensions.m4
+++ b/m4/extensions.m4
@@ -1,14 +1,19 @@
-# serial 18  -*- Autoconf -*-
+# serial 22  -*- Autoconf -*-
 # Enable extensions on systems that normally disable them.
 
-# Copyright (C) 2003, 2006-2019 Free Software Foundation, Inc.
+# Copyright (C) 2003, 2006-2021 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
+dnl Define to empty for the benefit of Autoconf 2.69 and earlier, so that
+dnl AC_USE_SYSTEM_EXTENSIONS (below) can be used unchanged from Autoconf 2.70+.
+m4_ifndef([AC_CHECK_INCLUDES_DEFAULT],
+  [AC_DEFUN([AC_CHECK_INCLUDES_DEFAULT], [])])
+
 # This definition of AC_USE_SYSTEM_EXTENSIONS is stolen from git
 # Autoconf.  Perhaps we can remove this once we can assume Autoconf
-# 2.70 or later everywhere, but since Autoconf mutates rapidly
+# is recent-enough everywhere, but since Autoconf mutates rapidly
 # enough in this area it's likely we'll need to redefine
 # AC_USE_SYSTEM_EXTENSIONS for quite some time.
 
@@ -26,36 +31,27 @@
 #      its dependencies. This will ensure that the gl_USE_SYSTEM_EXTENSIONS
 #      invocation occurs in gl_EARLY, not in gl_INIT.
 
+m4_version_prereq([2.70.1], [], [
+
 # AC_USE_SYSTEM_EXTENSIONS
 # ------------------------
 # Enable extensions on systems that normally disable them,
 # typically due to standards-conformance issues.
-#
-# Remember that #undef in AH_VERBATIM gets replaced with #define by
-# AC_DEFINE.  The goal here is to define all known feature-enabling
-# macros, then, if reports of conflicts are made, disable macros that
-# cause problems on some platforms (such as __EXTENSIONS__).
+# We unconditionally define as many of the known feature-enabling
+# as possible, reserving conditional behavior for macros that are
+# known to cause problems on some platforms (such as __EXTENSIONS__).
 AC_DEFUN_ONCE([AC_USE_SYSTEM_EXTENSIONS],
-[AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl
+[AC_BEFORE([$0], [AC_PREPROC_IFELSE])dnl
+AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl
+AC_BEFORE([$0], [AC_LINK_IFELSE])dnl
 AC_BEFORE([$0], [AC_RUN_IFELSE])dnl
-
-  AC_CHECK_HEADER([minix/config.h], [MINIX=yes], [MINIX=])
-  if test "$MINIX" = yes; then
-    AC_DEFINE([_POSIX_SOURCE], [1],
-      [Define to 1 if you need to in order for 'stat' and other
-       things to work.])
-    AC_DEFINE([_POSIX_1_SOURCE], [2],
-      [Define to 2 if the system does not provide POSIX.1 features
-       except with this defined.])
-    AC_DEFINE([_MINIX], [1],
-      [Define to 1 if on MINIX.])
-    AC_DEFINE([_NETBSD_SOURCE], [1],
-      [Define to 1 to make NetBSD features available.  MINIX 3 needs this.])
-  fi
-
+AC_BEFORE([$0], [AC_CHECK_INCLUDES_DEFAULT])dnl
+dnl #undef in AH_VERBATIM gets replaced with #define by AC_DEFINE.
 dnl Use a different key than __EXTENSIONS__, as that name broke existing
 dnl configure.ac when using autoheader 2.62.
-  AH_VERBATIM([USE_SYSTEM_EXTENSIONS],
+dnl The macros below are in alphabetical order ignoring leading _ or __
+dnl prefixes.
+AH_VERBATIM([USE_SYSTEM_EXTENSIONS],
 [/* Enable extensions on AIX 3, Interix.  */
 #ifndef _ALL_SOURCE
 # undef _ALL_SOURCE
@@ -64,19 +60,44 @@
 #ifndef _DARWIN_C_SOURCE
 # undef _DARWIN_C_SOURCE
 #endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
 /* Enable GNU extensions on systems that have them.  */
 #ifndef _GNU_SOURCE
 # undef _GNU_SOURCE
 #endif
-/* Enable NetBSD extensions on NetBSD.  */
+/* Enable X/Open compliant socket functions that do not require linking
+   with -lxnet on HP-UX 11.11.  */
+#ifndef _HPUX_ALT_XOPEN_SOCKET_API
+# undef _HPUX_ALT_XOPEN_SOCKET_API
+#endif
+/* Identify the host operating system as Minix.
+   This macro does not affect the system headers' behavior.
+   A future release of Autoconf may stop defining this macro.  */
+#ifndef _MINIX
+# undef _MINIX
+#endif
+/* Enable general extensions on NetBSD.
+   Enable NetBSD compatibility extensions on Minix.  */
 #ifndef _NETBSD_SOURCE
 # undef _NETBSD_SOURCE
 #endif
-/* Enable OpenBSD extensions on NetBSD.  */
+/* Enable OpenBSD compatibility extensions on NetBSD.
+   Oddly enough, this does nothing on OpenBSD.  */
 #ifndef _OPENBSD_SOURCE
 # undef _OPENBSD_SOURCE
 #endif
-/* Enable threading extensions on Solaris.  */
+/* Define to 1 if needed for POSIX-compatible behavior.  */
+#ifndef _POSIX_SOURCE
+# undef _POSIX_SOURCE
+#endif
+/* Define to 2 if needed for POSIX-compatible behavior.  */
+#ifndef _POSIX_1_SOURCE
+# undef _POSIX_1_SOURCE
+#endif
+/* Enable POSIX-compatible threading on Solaris.  */
 #ifndef _POSIX_PTHREAD_SEMANTICS
 # undef _POSIX_PTHREAD_SEMANTICS
 #endif
@@ -112,22 +133,19 @@
 #ifndef _TANDEM_SOURCE
 # undef _TANDEM_SOURCE
 #endif
-/* Enable X/Open extensions if necessary.  HP-UX 11.11 defines
-   mbstate_t only if _XOPEN_SOURCE is defined to 500, regardless of
-   whether compiling with -Ae or -D_HPUX_SOURCE=1.  */
+/* Enable X/Open extensions.  Define to 500 only if necessary
+   to make mbstate_t available.  */
 #ifndef _XOPEN_SOURCE
 # undef _XOPEN_SOURCE
 #endif
-/* Enable X/Open compliant socket functions that do not require linking
-   with -lxnet on HP-UX 11.11.  */
-#ifndef _HPUX_ALT_XOPEN_SOCKET_API
-# undef _HPUX_ALT_XOPEN_SOCKET_API
-#endif
-/* Enable general extensions on Solaris.  */
-#ifndef __EXTENSIONS__
-# undef __EXTENSIONS__
-#endif
-])
+])dnl
+
+  AC_REQUIRE([AC_CHECK_INCLUDES_DEFAULT])dnl
+  _AC_CHECK_HEADER_ONCE([wchar.h])
+  _AC_CHECK_HEADER_ONCE([minix/config.h])
+
+dnl Defining __EXTENSIONS__ may break the system headers on some systems.
+dnl (FIXME: Which ones?)
   AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__],
     [ac_cv_safe_to_define___extensions__],
     [AC_COMPILE_IFELSE(
@@ -136,11 +154,33 @@
           ]AC_INCLUDES_DEFAULT])],
        [ac_cv_safe_to_define___extensions__=yes],
        [ac_cv_safe_to_define___extensions__=no])])
-  test $ac_cv_safe_to_define___extensions__ = yes &&
-    AC_DEFINE([__EXTENSIONS__])
+
+dnl HP-UX 11.11 defines mbstate_t only if _XOPEN_SOURCE is defined to
+dnl 500, regardless of whether compiling with -Ae or -D_HPUX_SOURCE=1.
+dnl But defining _XOPEN_SOURCE may turn *off* extensions on platforms
+dnl not covered by turn-on-extensions macros (notably Dragonfly, Free,
+dnl and OpenBSD, which don't have any equivalent of _NETBSD_SOURCE) so
+dnl it should only be defined when necessary.
+  AC_CACHE_CHECK([whether _XOPEN_SOURCE should be defined],
+    [ac_cv_should_define__xopen_source],
+    [ac_cv_should_define__xopen_source=no
+    AS_IF([test $ac_cv_header_wchar_h = yes],
+      [AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM([[
+          #include <wchar.h>
+          mbstate_t x;]])],
+        [],
+        [AC_COMPILE_IFELSE(
+          [AC_LANG_PROGRAM([[
+            #define _XOPEN_SOURCE 500
+            #include <wchar.h>
+            mbstate_t x;]])],
+          [ac_cv_should_define__xopen_source=yes])])])])
+
   AC_DEFINE([_ALL_SOURCE])
   AC_DEFINE([_DARWIN_C_SOURCE])
   AC_DEFINE([_GNU_SOURCE])
+  AC_DEFINE([_HPUX_ALT_XOPEN_SOCKET_API])
   AC_DEFINE([_NETBSD_SOURCE])
   AC_DEFINE([_OPENBSD_SOURCE])
   AC_DEFINE([_POSIX_PTHREAD_SEMANTICS])
@@ -152,24 +192,18 @@
   AC_DEFINE([__STDC_WANT_LIB_EXT2__])
   AC_DEFINE([__STDC_WANT_MATH_SPEC_FUNCS__])
   AC_DEFINE([_TANDEM_SOURCE])
-  AC_CACHE_CHECK([whether _XOPEN_SOURCE should be defined],
-    [ac_cv_should_define__xopen_source],
-    [ac_cv_should_define__xopen_source=no
-     AC_COMPILE_IFELSE(
-       [AC_LANG_PROGRAM([[
-          #include <wchar.h>
-          mbstate_t x;]])],
-       [],
-       [AC_COMPILE_IFELSE(
-          [AC_LANG_PROGRAM([[
-             #define _XOPEN_SOURCE 500
-             #include <wchar.h>
-             mbstate_t x;]])],
-          [ac_cv_should_define__xopen_source=yes])])])
-  test $ac_cv_should_define__xopen_source = yes &&
-    AC_DEFINE([_XOPEN_SOURCE], [500])
-  AC_DEFINE([_HPUX_ALT_XOPEN_SOCKET_API])
+  AS_IF([test $ac_cv_header_minix_config_h = yes],
+    [MINIX=yes
+    AC_DEFINE([_MINIX])
+    AC_DEFINE([_POSIX_SOURCE])
+    AC_DEFINE([_POSIX_1_SOURCE], [2])],
+    [MINIX=])
+  AS_IF([test $ac_cv_safe_to_define___extensions__ = yes],
+    [AC_DEFINE([__EXTENSIONS__])])
+  AS_IF([test $ac_cv_should_define__xopen_source = yes],
+    [AC_DEFINE([_XOPEN_SOURCE], [500])])
 ])# AC_USE_SYSTEM_EXTENSIONS
+])
 
 # gl_USE_SYSTEM_EXTENSIONS
 # ------------------------
@@ -177,13 +211,17 @@
 # typically due to standards-conformance issues.
 AC_DEFUN_ONCE([gl_USE_SYSTEM_EXTENSIONS],
 [
-  dnl Require this macro before AC_USE_SYSTEM_EXTENSIONS.
-  dnl gnulib does not need it. But if it gets required by third-party macros
-  dnl after AC_USE_SYSTEM_EXTENSIONS is required, autoconf 2.62..2.63 emit a
-  dnl warning: "AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS".
-  dnl Note: We can do this only for one of the macros AC_AIX, AC_GNU_SOURCE,
-  dnl AC_MINIX. If people still use AC_AIX or AC_MINIX, they are out of luck.
-  AC_REQUIRE([AC_GNU_SOURCE])
-
   AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+  dnl On OpenBSD 6.8 with GCC, the include files contain a couple of
+  dnl definitions that are only activated with an explicit -D_ISOC11_SOURCE.
+  dnl That's because this version of GCC (4.2.1) supports the option
+  dnl '-std=gnu99' but not the option '-std=gnu11'.
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  case "$host_os" in
+    openbsd*)
+      AC_DEFINE([_ISOC11_SOURCE], [1],
+        [Define to enable the declarations of ISO C 11 types and functions.])
+      ;;
+  esac
 ])
diff --git a/m4/extern-inline.m4 b/m4/extern-inline.m4
index 84421ce..a4ac5ea 100644
--- a/m4/extern-inline.m4
+++ b/m4/extern-inline.m4
@@ -1,6 +1,6 @@
 dnl 'extern inline' a la ISO C99.
 
-dnl Copyright 2012-2019 Free Software Foundation, Inc.
+dnl Copyright 2012-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -17,7 +17,8 @@
    mishandles inline functions that call each other.  E.g., for 'inline void f
    (void) { } inline void g (void) { f (); }', c99 incorrectly complains
    'reference to static identifier "f" in extern inline function'.
-   This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16.
+   This bug was observed with Oracle Developer Studio 12.6
+   (Sun C 5.15 SunOS_sparc 2017/05/30).
 
    Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
    on configurations that mistakenly use 'static inline' to implement
@@ -83,8 +84,8 @@
 # define _GL_EXTERN_INLINE extern
 # define _GL_EXTERN_INLINE_IN_USE
 #else
-# define _GL_INLINE static _GL_UNUSED
-# define _GL_EXTERN_INLINE static _GL_UNUSED
+# define _GL_INLINE _GL_UNUSED static
+# define _GL_EXTERN_INLINE _GL_UNUSED static
 #endif
 
 /* In GCC 4.6 (inclusive) to 5.1 (exclusive),
diff --git a/m4/fatal-signal.m4 b/m4/fatal-signal.m4
index 349c1f7..7c69c69 100644
--- a/m4/fatal-signal.m4
+++ b/m4/fatal-signal.m4
@@ -1,5 +1,5 @@
 # fatal-signal.m4 serial 9
-dnl Copyright (C) 2003-2004, 2006, 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2003-2004, 2006, 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/fchdir.m4 b/m4/fchdir.m4
new file mode 100644
index 0000000..5d2fab7
--- /dev/null
+++ b/m4/fchdir.m4
@@ -0,0 +1,68 @@
+# fchdir.m4 serial 26
+dnl Copyright (C) 2006-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FCHDIR],
+[
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+  AC_CHECK_DECLS_ONCE([fchdir])
+  if test $ac_cv_have_decl_fchdir = no; then
+    HAVE_DECL_FCHDIR=0
+  fi
+
+  AC_REQUIRE([gl_TEST_FCHDIR])
+  if test $HAVE_FCHDIR = 0; then
+    AC_LIBOBJ([fchdir])
+    gl_PREREQ_FCHDIR
+    AC_DEFINE([REPLACE_FCHDIR], [1],
+      [Define to 1 if gnulib's fchdir() replacement is used.])
+    dnl We must also replace anything that can manipulate a directory fd,
+    dnl to keep our bookkeeping up-to-date.  We don't have to replace
+    dnl fstatat, since no platform has fstatat but lacks fchdir.
+    AC_CACHE_CHECK([whether open can visit directories],
+      [gl_cv_func_open_directory_works],
+      [AC_RUN_IFELSE(
+         [AC_LANG_PROGRAM(
+            [[#include <fcntl.h>
+            ]GL_MDA_DEFINES],
+            [[return open(".", O_RDONLY) < 0;]])],
+         [gl_cv_func_open_directory_works=yes],
+         [gl_cv_func_open_directory_works=no],
+         [case "$host_os" in
+                             # Guess yes on Linux systems.
+            linux-* | linux) gl_cv_func_open_directory_works="guessing yes" ;;
+                             # Guess yes on glibc systems.
+            *-gnu* | gnu*)   gl_cv_func_open_directory_works="guessing yes" ;;
+                             # Guess no on native Windows.
+            mingw*)          gl_cv_func_open_directory_works="guessing no" ;;
+                             # If we don't know, obey --enable-cross-guesses.
+            *)               gl_cv_func_open_directory_works="$gl_cross_guess_normal" ;;
+          esac
+         ])])
+    case "$gl_cv_func_open_directory_works" in
+      *yes) ;;
+      *)
+        AC_DEFINE([REPLACE_OPEN_DIRECTORY], [1], [Define to 1 if open() should
+work around the inability to open a directory.])
+        ;;
+    esac
+  fi
+])
+
+# Determine whether to use the overrides in lib/fchdir.c.
+AC_DEFUN([gl_TEST_FCHDIR],
+[
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  AC_CHECK_FUNCS_ONCE([fchdir])
+  if test $ac_cv_func_fchdir = no; then
+    HAVE_FCHDIR=0
+  fi
+])
+
+# Prerequisites of lib/fchdir.c.
+AC_DEFUN([gl_PREREQ_FCHDIR], [:])
diff --git a/m4/fcntl-o.m4 b/m4/fcntl-o.m4
index 6ab3387..7c459ad 100644
--- a/m4/fcntl-o.m4
+++ b/m4/fcntl-o.m4
@@ -1,5 +1,5 @@
-# fcntl-o.m4 serial 6
-dnl Copyright (C) 2006, 2009-2019 Free Software Foundation, Inc.
+# fcntl-o.m4 serial 7
+dnl Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -32,6 +32,7 @@
            # defined sleep(n) _sleep ((n) * 1000)
            #endif
            #include <fcntl.h>
+           ]GL_MDA_DEFINES[
            #ifndef O_NOATIME
             #define O_NOATIME 0
            #endif
diff --git a/m4/fcntl.m4 b/m4/fcntl.m4
index e409e96..f626434 100644
--- a/m4/fcntl.m4
+++ b/m4/fcntl.m4
@@ -1,5 +1,5 @@
-# fcntl.m4 serial 9
-dnl Copyright (C) 2009-2019 Free Software Foundation, Inc.
+# fcntl.m4 serial 11
+dnl Copyright (C) 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -34,6 +34,7 @@
               #include <limits.h>
               #include <sys/resource.h>
               #include <unistd.h>
+              ]GL_MDA_DEFINES[
               #ifndef RLIM_SAVED_CUR
               # define RLIM_SAVED_CUR RLIM_INFINITY
               #endif
@@ -80,15 +81,29 @@
           behavior does not match POSIX]) ;;
     esac
 
-    dnl Many systems lack F_DUPFD_CLOEXEC
+    dnl Many systems lack F_DUPFD_CLOEXEC.
+    dnl NetBSD 9.0 declares F_DUPFD_CLOEXEC but it works only like F_DUPFD.
     AC_CACHE_CHECK([whether fcntl understands F_DUPFD_CLOEXEC],
       [gl_cv_func_fcntl_f_dupfd_cloexec],
-      [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
-#include <fcntl.h>
-#ifndef F_DUPFD_CLOEXEC
-choke me
-#endif
-         ]])],
+      [AC_RUN_IFELSE(
+         [AC_LANG_SOURCE(
+            [[#include <fcntl.h>
+              #include <unistd.h>
+              int main (int argc, char *argv[])
+              {
+                if (argc == 1)
+                  /* parent process */
+                  {
+                    if (fcntl (1, F_DUPFD_CLOEXEC, 10) < 0)
+                      return 1;
+                    return execl ("./conftest", "./conftest", "child", NULL);
+                  }
+                else
+                  /* child process */
+                  return (fcntl (10, F_GETFL) < 0 ? 0 : 42);
+              }
+            ]])
+         ],
          [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
 #ifdef __linux__
 /* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace
@@ -97,12 +112,22 @@
 #endif
            ]])],
            [gl_cv_func_fcntl_f_dupfd_cloexec=yes],
-           [gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"])],
-         [gl_cv_func_fcntl_f_dupfd_cloexec=no])])
-    if test "$gl_cv_func_fcntl_f_dupfd_cloexec" != yes; then
-      gl_REPLACE_FCNTL
-      dnl No witness macro needed for this bug.
-    fi
+           [gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"])
+         ],
+         [gl_cv_func_fcntl_f_dupfd_cloexec=no],
+         [case "$host_os" in
+                     # Guess no on NetBSD.
+            netbsd*) gl_cv_func_fcntl_f_dupfd_cloexec="guessing no" ;;
+            *)       gl_cv_func_fcntl_f_dupfd_cloexec="$gl_cross_guess_normal" ;;
+          esac
+         ])
+      ])
+    case "$gl_cv_func_fcntl_f_dupfd_cloexec" in
+      *yes) ;;
+      *)    gl_REPLACE_FCNTL
+            dnl No witness macro needed for this bug.
+            ;;
+    esac
   fi
   dnl Replace fcntl() for supporting the gnulib-defined fchdir() function,
   dnl to keep fchdir's bookkeeping up-to-date.
diff --git a/m4/fcntl_h.m4 b/m4/fcntl_h.m4
index 60dc5e2..aba4473 100644
--- a/m4/fcntl_h.m4
+++ b/m4/fcntl_h.m4
@@ -1,13 +1,13 @@
-# serial 16
+# serial 20
 # Configure fcntl.h.
-dnl Copyright (C) 2006-2007, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2006-2007, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl Written by Paul Eggert.
 
-AC_DEFUN([gl_FCNTL_H],
+AC_DEFUN_ONCE([gl_FCNTL_H],
 [
   AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
   AC_REQUIRE([gl_FCNTL_O_FLAGS])
@@ -26,22 +26,40 @@
     ]], [fcntl openat])
 ])
 
+# gl_FCNTL_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_FCNTL_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_FCNTL_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_FCNTL_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_FCNTL_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CREAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FCNTL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_NONBLOCKING])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_OPEN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_OPENAT])
+    dnl Support Microsoft deprecated alias function names by default.
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_CREAT], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_OPEN], [1])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_FCNTL_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_FCNTL_H_DEFAULTS],
 [
-  GNULIB_CREAT=0;        AC_SUBST([GNULIB_CREAT])
-  GNULIB_FCNTL=0;        AC_SUBST([GNULIB_FCNTL])
-  GNULIB_NONBLOCKING=0;  AC_SUBST([GNULIB_NONBLOCKING])
-  GNULIB_OPEN=0;         AC_SUBST([GNULIB_OPEN])
-  GNULIB_OPENAT=0;       AC_SUBST([GNULIB_OPENAT])
   dnl Assume proper GNU behavior unless another module says otherwise.
   HAVE_FCNTL=1;          AC_SUBST([HAVE_FCNTL])
   HAVE_OPENAT=1;         AC_SUBST([HAVE_OPENAT])
diff --git a/m4/fdopendir.m4 b/m4/fdopendir.m4
new file mode 100644
index 0000000..d428380
--- /dev/null
+++ b/m4/fdopendir.m4
@@ -0,0 +1,67 @@
+# serial 14
+# See if we need to provide fdopendir.
+
+dnl Copyright (C) 2009-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Eric Blake.
+
+AC_DEFUN([gl_FUNC_FDOPENDIR],
+[
+  AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+  dnl FreeBSD 7.3 has the function, but failed to declare it.
+  AC_CHECK_DECLS([fdopendir], [], [HAVE_DECL_FDOPENDIR=0], [[
+#include <dirent.h>
+    ]])
+  AC_CHECK_FUNCS_ONCE([fdopendir])
+  if test $ac_cv_func_fdopendir = no; then
+    HAVE_FDOPENDIR=0
+  else
+    AC_CACHE_CHECK([whether fdopendir works],
+      [gl_cv_func_fdopendir_works],
+      [AC_RUN_IFELSE(
+         [AC_LANG_PROGRAM([[
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+]GL_MDA_DEFINES[
+#if !HAVE_DECL_FDOPENDIR
+extern
+# ifdef __cplusplus
+"C"
+# endif
+DIR *fdopendir (int);
+#endif
+]],
+            [[int result = 0;
+              int fd = open ("conftest.c", O_RDONLY);
+              if (fd < 0) result |= 1;
+              if (fdopendir (fd)) result |= 2;
+              if (close (fd)) result |= 4;
+              return result;
+            ]])],
+         [gl_cv_func_fdopendir_works=yes],
+         [gl_cv_func_fdopendir_works=no],
+         [case "$host_os" in
+                     # Guess yes on glibc systems.
+            *-gnu*)  gl_cv_func_fdopendir_works="guessing yes" ;;
+                     # Guess yes on musl systems.
+            *-musl*) gl_cv_func_fdopendir_works="guessing yes" ;;
+                     # If we don't know, obey --enable-cross-guesses.
+            *)       gl_cv_func_fdopendir_works="$gl_cross_guess_normal" ;;
+          esac
+         ])])
+    case "$gl_cv_func_fdopendir_works" in
+      *yes) ;;
+      *)
+        REPLACE_FDOPENDIR=1
+        ;;
+    esac
+  fi
+])
diff --git a/m4/ffs.m4 b/m4/ffs.m4
new file mode 100644
index 0000000..6488f4a
--- /dev/null
+++ b/m4/ffs.m4
@@ -0,0 +1,32 @@
+# ffs.m4 serial 5
+dnl Copyright (C) 2011-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FFS],
+[
+  AC_REQUIRE([gl_STRINGS_H_DEFAULTS])
+
+  dnl We can't use AC_CHECK_FUNC here, because ffs() is defined as a
+  dnl static inline function when compiling for Android 4.2 or older.
+  dnl But require that ffs() is declared; otherwise we may be using
+  dnl the GCC built-in function, which leads to warnings
+  dnl "warning: implicit declaration of function 'ffs'".
+  AC_CACHE_CHECK([for ffs], [gl_cv_func_ffs],
+    [AC_LINK_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <strings.h>
+            int x;
+          ]],
+          [[int (*func) (int) = ffs;
+            return func (x);
+          ]])
+       ],
+       [gl_cv_func_ffs=yes],
+       [gl_cv_func_ffs=no])
+    ])
+  if test $gl_cv_func_ffs = no; then
+    HAVE_FFS=0
+  fi
+])
diff --git a/m4/ffsl.m4 b/m4/ffsl.m4
new file mode 100644
index 0000000..45d8f14
--- /dev/null
+++ b/m4/ffsl.m4
@@ -0,0 +1,18 @@
+# ffsl.m4 serial 2
+dnl Copyright (C) 2011-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FFSL],
+[
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
+
+  dnl Persuade glibc <string.h> to declare ffsl().
+  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+  AC_CHECK_FUNCS_ONCE([ffsl])
+  if test $ac_cv_func_ffsl = no; then
+    HAVE_FFSL=0
+  fi
+])
diff --git a/m4/filenamecat.m4 b/m4/filenamecat.m4
new file mode 100644
index 0000000..e6eac12
--- /dev/null
+++ b/m4/filenamecat.m4
@@ -0,0 +1,16 @@
+# filenamecat.m4 serial 11
+dnl Copyright (C) 2002-2006, 2009-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FILE_NAME_CONCAT],
+[
+  AC_REQUIRE([gl_FILE_NAME_CONCAT_LGPL])
+])
+
+AC_DEFUN([gl_FILE_NAME_CONCAT_LGPL],
+[
+  dnl Prerequisites of lib/filenamecat-lgpl.c.
+  AC_CHECK_FUNCS_ONCE([mempcpy])
+])
diff --git a/m4/findprog-in.m4 b/m4/findprog-in.m4
new file mode 100644
index 0000000..3ee6579
--- /dev/null
+++ b/m4/findprog-in.m4
@@ -0,0 +1,11 @@
+# findprog-in.m4 serial 1
+dnl Copyright (C) 2003, 2009-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FINDPROG_IN],
+[
+  dnl Prerequisites of lib/findprog-in.c.
+  AC_REQUIRE([gl_FUNC_EACCESS])
+])
diff --git a/m4/flex.m4 b/m4/flex.m4
index ed230a2..914989c 100644
--- a/m4/flex.m4
+++ b/m4/flex.m4
@@ -1,5 +1,5 @@
 # flex.m4 serial 2
-# Copyright (C) 2012-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2012-2015, 2018-2021 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -41,6 +41,22 @@
 fi
 ])
 
+
+AC_CACHE_CHECK([whether flex supports --header=FILE],
+                [ac_cv_prog_lex_supports_header_opt],
+[if _AC_DO_VAR([LEX --header=conftest.h conftest.l]); then
+  ac_cv_prog_lex_supports_header_opt=yes
+else
+  ac_cv_prog_lex_supports_header_opt=no
+fi
+])
+if test "$ac_cv_prog_lex_supports_header_opt" = yes; then
+  FLEX_SUPPORTS_HEADER_OPT=true
+else
+  FLEX_SUPPORTS_HEADER_OPT=false
+fi
+
+
 cat >conftest.l <<_ACEOF[
 %%
 a { ECHO; }
diff --git a/m4/float_h.m4 b/m4/float_h.m4
index 1cd28a0..ba38a28 100644
--- a/m4/float_h.m4
+++ b/m4/float_h.m4
@@ -1,5 +1,5 @@
 # float_h.m4 serial 12
-dnl Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/fopen.m4 b/m4/fopen.m4
index 8a6e0ea..4ed7dce 100644
--- a/m4/fopen.m4
+++ b/m4/fopen.m4
@@ -1,5 +1,5 @@
-# fopen.m4 serial 10
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+# fopen.m4 serial 12
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -58,5 +58,91 @@
   esac
 ])
 
+AC_DEFUN([gl_FUNC_FOPEN_GNU],
+[
+  AC_REQUIRE([gl_FUNC_FOPEN])
+  AC_CACHE_CHECK([whether fopen supports the mode character 'x'],
+    [gl_cv_func_fopen_mode_x],
+    [rm -f conftest.x
+     AC_RUN_IFELSE(
+       [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <errno.h>
+int main ()
+{
+  FILE *fp;
+  fp = fopen ("conftest.x", "w");
+  fclose (fp);
+  fp = fopen ("conftest.x", "wx");
+  if (fp != NULL)
+    /* 'x' ignored */
+    return 1;
+  else if (errno == EEXIST)
+    return 0;
+  else
+    /* 'x' rejected */
+    return 2;
+}]])],
+       [gl_cv_func_fopen_mode_x=yes],
+       [gl_cv_func_fopen_mode_x=no],
+       [case "$host_os" in
+          # Guess yes on glibc and musl systems.
+          linux*-gnu* | gnu* | kfreebsd*-gnu | *-musl*)
+            gl_cv_func_fopen_mode_x="guessing yes" ;;
+          # If we don't know, obey --enable-cross-guesses.
+          *)
+            gl_cv_func_fopen_mode_x="$gl_cross_guess_normal" ;;
+        esac
+       ])
+     rm -f conftest.x
+    ])
+  AC_CACHE_CHECK([whether fopen supports the mode character 'e'],
+    [gl_cv_func_fopen_mode_e],
+    [echo foo > conftest.x
+     AC_RUN_IFELSE(
+       [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <errno.h>
+#include <fcntl.h>
+]GL_MDA_DEFINES[
+int main ()
+{
+  FILE *fp = fopen ("conftest.x", "re");
+  if (fp != NULL)
+    {
+      if (fcntl (fileno (fp), F_GETFD) & FD_CLOEXEC)
+        return 0;
+      else
+        /* 'e' ignored */
+        return 1;
+    }
+  else
+    /* 'e' rejected */
+    return 2;
+}]])],
+       [gl_cv_func_fopen_mode_e=yes],
+       [gl_cv_func_fopen_mode_e=no],
+       [case "$host_os" in
+          # Guess yes on glibc and musl systems.
+          linux*-gnu* | gnu* | kfreebsd*-gnu | *-musl*)
+            gl_cv_func_fopen_mode_e="guessing yes" ;;
+          # Guess no on native Windows.
+          mingw*)
+            gl_cv_func_fopen_mode_e="guessing no" ;;
+          # If we don't know, obey --enable-cross-guesses.
+          *)
+            gl_cv_func_fopen_mode_e="$gl_cross_guess_normal" ;;
+        esac
+       ])
+     rm -f conftest.x
+    ])
+  case "$gl_cv_func_fopen_mode_x" in
+    *no) REPLACE_FOPEN=1 ;;
+  esac
+  case "$gl_cv_func_fopen_mode_e" in
+    *no) REPLACE_FOPEN=1 ;;
+  esac
+])
+
 # Prerequisites of lib/fopen.c.
 AC_DEFUN([gl_PREREQ_FOPEN], [:])
diff --git a/m4/fpending.m4 b/m4/fpending.m4
index 402ec40..131356a 100644
--- a/m4/fpending.m4
+++ b/m4/fpending.m4
@@ -1,6 +1,6 @@
-# serial 22
+# serial 23
 
-# Copyright (C) 2000-2001, 2004-2019 Free Software Foundation, Inc.
+# Copyright (C) 2000-2001, 2004-2021 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -25,7 +25,7 @@
   AC_CACHE_CHECK([for __fpending], [gl_cv_func___fpending],
     [
       AC_LINK_IFELSE(
-        [AC_LANG_PROGRAM([$fp_headers],
+        [AC_LANG_PROGRAM([[$fp_headers]],
            [[return ! __fpending (stdin);]])],
         [gl_cv_func___fpending=yes],
         [gl_cv_func___fpending=no])
diff --git a/m4/fpieee.m4 b/m4/fpieee.m4
index ea1d5da..3f16957 100644
--- a/m4/fpieee.m4
+++ b/m4/fpieee.m4
@@ -1,5 +1,5 @@
 # fpieee.m4 serial 2  -*- coding: utf-8 -*-
-dnl Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/fprintf-posix.m4 b/m4/fprintf-posix.m4
index 17206e6..9958109 100644
--- a/m4/fprintf-posix.m4
+++ b/m4/fprintf-posix.m4
@@ -1,5 +1,5 @@
 # fprintf-posix.m4 serial 14
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/free.m4 b/m4/free.m4
new file mode 100644
index 0000000..a7923b9
--- /dev/null
+++ b/m4/free.m4
@@ -0,0 +1,52 @@
+# free.m4 serial 6
+# Copyright (C) 2003-2005, 2009-2021 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Written by Paul Eggert and Bruno Haible.
+
+AC_DEFUN([gl_FUNC_FREE],
+[
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+
+  dnl In the next release of POSIX, free must preserve errno.
+  dnl https://www.austingroupbugs.net/view.php?id=385
+  dnl https://sourceware.org/bugzilla/show_bug.cgi?id=17924
+  dnl So far, we know of three platforms that do this:
+  dnl * glibc >= 2.33, thanks to the fix for this bug:
+  dnl   <https://sourceware.org/bugzilla/show_bug.cgi?id=17924>
+  dnl * OpenBSD >= 4.5, thanks to this commit:
+  dnl   <https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/malloc.c.diff?r1=1.100&r2=1.101&f=h>
+  dnl * Solaris, because its malloc() implementation is based on brk(),
+  dnl   not mmap(); hence its free() implementation makes no system calls.
+  dnl For other platforms, you can only be sure if they state it in their
+  dnl documentation, or by code inspection of the free() implementation in libc.
+  AC_CACHE_CHECK([whether free is known to preserve errno],
+    [gl_cv_func_free_preserves_errno],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <stdlib.h>
+          ]],
+          [[#if 2 < __GLIBC__ + (33 <= __GLIBC_MINOR__)
+            #elif defined __OpenBSD__
+            #elif defined __sun
+            #else
+              #error "'free' is not known to preserve errno"
+            #endif
+          ]])],
+       [gl_cv_func_free_preserves_errno=yes],
+       [gl_cv_func_free_preserves_errno=no])
+    ])
+
+  case $gl_cv_func_free_preserves_errno in
+   *yes)
+    AC_DEFINE([HAVE_FREE_POSIX], [1],
+      [Define if the 'free' function is guaranteed to preserve errno.])
+    ;;
+   *) REPLACE_FREE=1 ;;
+  esac
+])
+
+# Prerequisites of lib/free.c.
+AC_DEFUN([gl_PREREQ_FREE], [:])
diff --git a/m4/frexp.m4 b/m4/frexp.m4
index 990fce6..04248b0 100644
--- a/m4/frexp.m4
+++ b/m4/frexp.m4
@@ -1,5 +1,5 @@
 # frexp.m4 serial 16
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/frexpl.m4 b/m4/frexpl.m4
index 53eed55..32f1eac 100644
--- a/m4/frexpl.m4
+++ b/m4/frexpl.m4
@@ -1,5 +1,5 @@
-# frexpl.m4 serial 21
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+# frexpl.m4 serial 22
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -150,6 +150,7 @@
 "C"
 #endif
 long double frexpl (long double, int *);
+long double zero = 0.0L;
 int main()
 {
   int result = 0;
@@ -207,7 +208,8 @@
       }
   }
   /* Test on infinite numbers.  */
-  x = 1.0L / 0.0L;
+  /* The Microsoft MSVC 14 compiler chokes on the expression 1.0 / 0.0.  */
+  x = 1.0L / zero;
   {
     int exp;
     long double y = frexpl (x, &exp);
diff --git a/m4/fseterr.m4 b/m4/fseterr.m4
index e2b97a5..abc652a 100644
--- a/m4/fseterr.m4
+++ b/m4/fseterr.m4
@@ -1,5 +1,5 @@
 # fseterr.m4 serial 1
-dnl Copyright (C) 2012-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2012-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/fstat.m4 b/m4/fstat.m4
index 2a59c8f..cdaca80 100644
--- a/m4/fstat.m4
+++ b/m4/fstat.m4
@@ -1,5 +1,5 @@
-# fstat.m4 serial 6
-dnl Copyright (C) 2011-2019 Free Software Foundation, Inc.
+# fstat.m4 serial 8
+dnl Copyright (C) 2011-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -34,6 +34,7 @@
 
 # Prerequisites of lib/fstat.c and lib/stat-w32.c.
 AC_DEFUN([gl_PREREQ_FSTAT], [
-  AC_REQUIRE([gl_HEADER_SYS_STAT_H])
+  AC_REQUIRE([gl_SYS_STAT_H])
+  AC_REQUIRE([gl_PREREQ_STAT_W32])
   :
 ])
diff --git a/m4/fstatat.m4 b/m4/fstatat.m4
new file mode 100644
index 0000000..d730e46
--- /dev/null
+++ b/m4/fstatat.m4
@@ -0,0 +1,65 @@
+# fstatat.m4 serial 4
+dnl Copyright (C) 2004-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Jim Meyering.
+
+# If we have the fstatat function, and it has the bug (in AIX 7.1)
+# that it does not fill in st_size correctly, use the replacement function.
+AC_DEFUN([gl_FUNC_FSTATAT],
+[
+  AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+  AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_CHECK_FUNCS_ONCE([fstatat])
+
+  if test $ac_cv_func_fstatat = no; then
+    HAVE_FSTATAT=0
+  else
+    dnl Test for an AIX 7.1 bug; see
+    dnl <https://lists.gnu.org/r/bug-tar/2011-09/msg00015.html>.
+    AC_CACHE_CHECK([whether fstatat (..., 0) works],
+      [gl_cv_func_fstatat_zero_flag],
+      [AC_RUN_IFELSE(
+         [AC_LANG_SOURCE(
+            [[
+              #include <fcntl.h>
+              #include <sys/stat.h>
+              int
+              main (void)
+              {
+                struct stat a;
+                return fstatat (AT_FDCWD, ".", &a, 0) != 0;
+              }
+            ]])],
+         [gl_cv_func_fstatat_zero_flag=yes],
+         [gl_cv_func_fstatat_zero_flag=no],
+         [case "$host_os" in
+            aix*) gl_cv_func_fstatat_zero_flag="guessing no";;
+            *)    gl_cv_func_fstatat_zero_flag="guessing yes";;
+          esac
+         ])
+      ])
+
+    case $gl_cv_func_fstatat_zero_flag+$gl_cv_func_lstat_dereferences_slashed_symlink in
+    *yes+*yes) ;;
+    *) REPLACE_FSTATAT=1 ;;
+    esac
+
+    case $host_os in
+      solaris*)
+        REPLACE_FSTATAT=1 ;;
+    esac
+
+    case $REPLACE_FSTATAT,$gl_cv_func_fstatat_zero_flag in
+      1,*yes)
+         AC_DEFINE([HAVE_WORKING_FSTATAT_ZERO_FLAG], [1],
+           [Define to 1 if fstatat (..., 0) works.
+            For example, it does not work in AIX 7.1.])
+         ;;
+    esac
+  fi
+])
diff --git a/m4/fsync.m4 b/m4/fsync.m4
index 1b94a25..6dc8cd1 100644
--- a/m4/fsync.m4
+++ b/m4/fsync.m4
@@ -1,5 +1,5 @@
 # fsync.m4 serial 2
-dnl Copyright (C) 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/getcwd-abort-bug.m4 b/m4/getcwd-abort-bug.m4
new file mode 100644
index 0000000..bd32de1
--- /dev/null
+++ b/m4/getcwd-abort-bug.m4
@@ -0,0 +1,158 @@
+# serial 16
+# Determine whether getcwd aborts when the length of the working directory
+# name is unusually large.  Any length between 4k and 16k trigger the bug
+# when using glibc-2.4.90-9 or older.
+
+# Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# From Jim Meyering
+
+# gl_FUNC_GETCWD_ABORT_BUG([ACTION-IF-BUGGY[, ACTION-IF-WORKS]])
+AC_DEFUN([gl_FUNC_GETCWD_ABORT_BUG],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  AC_CHECK_DECLS_ONCE([getcwd])
+  AC_CHECK_HEADERS_ONCE([unistd.h])
+  AC_REQUIRE([gl_PATHMAX_SNIPPET_PREREQ])
+
+  gl_CHECK_FUNC_GETPAGESIZE
+  if test $gl_cv_func_getpagesize = yes; then
+    AC_DEFINE_UNQUOTED([HAVE_GETPAGESIZE], [1],
+      [Define to 1 if the system has the 'getpagesize' function.])
+  fi
+
+  AC_CACHE_CHECK([whether getcwd succeeds when 4k < cwd_length < 16k],
+    [gl_cv_func_getcwd_succeeds_beyond_4k],
+    [# Remove any remnants of a previous test.
+     rm -rf confdir-14B---
+     # Arrange for deletion of the temporary directory this test creates.
+     ac_clean_files="$ac_clean_files confdir-14B---"
+     dnl Please keep this in sync with tests/test-getcwd.c.
+     AC_RUN_IFELSE(
+       [AC_LANG_SOURCE(
+          [[
+#include <errno.h>
+#include <stdlib.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#else /* on Windows with MSVC */
+# include <direct.h>
+#endif
+#include <string.h>
+#include <sys/stat.h>
+
+]gl_PATHMAX_SNIPPET[
+]GL_MDA_DEFINES[
+
+#ifndef S_IRWXU
+# define S_IRWXU 0700
+#endif
+
+/* FIXME: skip the run-test altogether on systems without getpagesize.  */
+#if ! HAVE_GETPAGESIZE
+# define getpagesize() 0
+#endif
+
+/* This size is chosen to be larger than PATH_MAX (4k), yet smaller than
+   the 16kB pagesize on ia64 linux.  Those conditions make the code below
+   trigger a bug in glibc's getcwd implementation before 2.4.90-10.  */
+#define TARGET_LEN (5 * 1024)
+
+int
+main ()
+{
+  char *cwd;
+  size_t initial_cwd_len;
+  int fail = 0;
+
+  /* The bug is triggered when PATH_MAX < getpagesize (), so skip
+     this relatively expensive and invasive test if that's not true.  */
+#ifdef PATH_MAX
+  int bug_possible = PATH_MAX < getpagesize ();
+#else
+  int bug_possible = 0;
+#endif
+  if (! bug_possible)
+    return 0;
+
+  cwd = getcwd (NULL, 0);
+  if (cwd == NULL)
+    return 2;
+
+  initial_cwd_len = strlen (cwd);
+  free (cwd);
+
+  if (1)
+    {
+      static char const dir_name[] = "confdir-14B---";
+      size_t desired_depth = ((TARGET_LEN - 1 - initial_cwd_len)
+                              / sizeof dir_name);
+      size_t d;
+      for (d = 0; d < desired_depth; d++)
+        {
+          if (mkdir (dir_name, S_IRWXU) < 0 || chdir (dir_name) < 0)
+            {
+              if (! (errno == ERANGE || errno == ENAMETOOLONG
+                     || errno == ENOENT))
+                fail = 3; /* Unable to construct deep hierarchy.  */
+              break;
+            }
+        }
+
+      /* If libc has the bug in question, this invocation of getcwd
+         results in a failed assertion.  */
+      cwd = getcwd (NULL, 0);
+      if (cwd == NULL)
+        fail = 4; /* getcwd didn't assert, but it failed for a long name
+                     where the answer could have been learned.  */
+      free (cwd);
+
+      /* Call rmdir first, in case the above chdir failed.  */
+      rmdir (dir_name);
+      while (0 < d--)
+        {
+          if (chdir ("..") < 0)
+            {
+              fail = 5;
+              break;
+            }
+          rmdir (dir_name);
+        }
+    }
+
+  return fail;
+}
+          ]])],
+       [gl_cv_func_getcwd_succeeds_beyond_4k=yes],
+       [dnl An abort will provoke an exit code of something like 134 (128 + 6).
+        dnl An exit code of 4 can also occur (for example in
+        dnl musl libc 1.2.2/powerpc64le, NetBSD 9.0, OpenBSD 6.7:
+        dnl getcwd (NULL, 0) fails rather than returning a string longer than
+        dnl PATH_MAX.  This may be POSIX compliant (in some interpretations of
+        dnl POSIX).  But gnulib's getcwd module wants to provide a non-NULL
+        dnl value in this case.
+        ret=$?
+        if test $ret -ge 128 || test $ret = 4; then
+          gl_cv_func_getcwd_succeeds_beyond_4k=no
+        else
+          gl_cv_func_getcwd_succeeds_beyond_4k=yes
+        fi
+       ],
+       [case "$host_os" in
+             # Guess no otherwise, even on glibc systems and musl systems.
+          *) gl_cv_func_getcwd_succeeds_beyond_4k="guessing no"
+        esac
+       ])
+    ])
+  case "$gl_cv_func_getcwd_succeeds_beyond_4k" in
+    *no)
+      $1
+      ;;
+    *)
+      $2
+      ;;
+  esac
+])
diff --git a/m4/getcwd-path-max.m4 b/m4/getcwd-path-max.m4
new file mode 100644
index 0000000..4238ae7
--- /dev/null
+++ b/m4/getcwd-path-max.m4
@@ -0,0 +1,236 @@
+# serial 25
+# Check for several getcwd bugs with long file names.
+# If so, arrange to compile the wrapper function.
+
+# This is necessary for at least GNU libc on linux-2.4.19 and 2.4.20.
+# I've heard that this is due to a Linux kernel bug, and that it has
+# been fixed between 2.4.21-pre3 and 2.4.21-pre4.
+
+# Copyright (C) 2003-2007, 2009-2021 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# From Jim Meyering
+
+AC_DEFUN([gl_FUNC_GETCWD_PATH_MAX],
+[
+  AC_CHECK_DECLS_ONCE([getcwd])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+  AC_CHECK_HEADERS_ONCE([unistd.h])
+  AC_REQUIRE([gl_PATHMAX_SNIPPET_PREREQ])
+  AC_CACHE_CHECK([whether getcwd handles long file names properly],
+    [gl_cv_func_getcwd_path_max],
+    [# Arrange for deletion of the temporary directory this test creates.
+     ac_clean_files="$ac_clean_files confdir3"
+     dnl Please keep this in sync with tests/test-getcwd.c.
+     AC_RUN_IFELSE(
+       [AC_LANG_SOURCE(
+          [[
+#include <errno.h>
+#include <stdlib.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#else
+# include <direct.h>
+#endif
+#include <string.h>
+#include <limits.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+]gl_PATHMAX_SNIPPET[
+
+#ifndef AT_FDCWD
+# define AT_FDCWD 0
+#endif
+#ifdef ENAMETOOLONG
+# define is_ENAMETOOLONG(x) ((x) == ENAMETOOLONG)
+#else
+# define is_ENAMETOOLONG(x) 0
+#endif
+
+/* Use the getcwd function, not any macro.  */
+#undef getcwd
+
+]GL_MDA_DEFINES[
+
+#ifndef S_IRWXU
+# define S_IRWXU 0700
+#endif
+
+/* The length of this name must be 8.  */
+#define DIR_NAME "confdir3"
+#define DIR_NAME_LEN 8
+#define DIR_NAME_SIZE (DIR_NAME_LEN + 1)
+
+/* The length of "../".  */
+#define DOTDOTSLASH_LEN 3
+
+/* Leftover bytes in the buffer, to work around library or OS bugs.  */
+#define BUF_SLOP 20
+
+int
+main ()
+{
+#ifndef PATH_MAX
+  /* The Hurd doesn't define this, so getcwd can't exhibit the bug --
+     at least not on a local file system.  And if we were to start worrying
+     about remote file systems, we'd have to enable the wrapper function
+     all of the time, just to be safe.  That's not worth the cost.  */
+  exit (0);
+#elif ((INT_MAX / (DIR_NAME_SIZE / DOTDOTSLASH_LEN + 1) \
+        - DIR_NAME_SIZE - BUF_SLOP) \
+       <= PATH_MAX)
+  /* FIXME: Assuming there's a system for which this is true,
+     this should be done in a compile test.  */
+  exit (0);
+#else
+  char buf[PATH_MAX * (DIR_NAME_SIZE / DOTDOTSLASH_LEN + 1)
+           + DIR_NAME_SIZE + BUF_SLOP];
+  char *cwd = getcwd (buf, PATH_MAX);
+  size_t initial_cwd_len;
+  size_t cwd_len;
+  int fail = 0;
+  size_t n_chdirs = 0;
+
+  if (cwd == NULL)
+    exit (10);
+
+  cwd_len = initial_cwd_len = strlen (cwd);
+
+  while (1)
+    {
+      size_t dotdot_max = PATH_MAX * (DIR_NAME_SIZE / DOTDOTSLASH_LEN);
+      char *c = NULL;
+
+      cwd_len += DIR_NAME_SIZE;
+      /* If mkdir or chdir fails, it could be that this system cannot create
+         any file with an absolute name longer than PATH_MAX, such as cygwin.
+         If so, leave fail as 0, because the current working directory can't
+         be too long for getcwd if it can't even be created.  On Linux with
+         the 9p file system, mkdir fails with error EINVAL when cwd_len gets
+         too long; ignore this failure because the getcwd() system call
+         produces good results whereas the gnulib substitute calls getdents64
+         which fails with error EPROTO.
+         For other errors, be pessimistic and consider that as a failure,
+         too.  */
+      if (mkdir (DIR_NAME, S_IRWXU) < 0 || chdir (DIR_NAME) < 0)
+        {
+          if (! (errno == ERANGE || is_ENAMETOOLONG (errno)))
+            #ifdef __linux__
+            if (! (errno == EINVAL))
+            #endif
+              fail = 20;
+          break;
+        }
+
+      if (PATH_MAX <= cwd_len && cwd_len < PATH_MAX + DIR_NAME_SIZE)
+        {
+          struct stat sb;
+
+          c = getcwd (buf, PATH_MAX);
+          if (!c && errno == ENOENT)
+            {
+              fail = 11;
+              break;
+            }
+          if (c)
+            {
+              fail = 31;
+              break;
+            }
+          if (! (errno == ERANGE || is_ENAMETOOLONG (errno)))
+            {
+              fail = 21;
+              break;
+            }
+
+          /* Our replacement needs to be able to stat() long ../../paths,
+             so generate a path larger than PATH_MAX to check,
+             avoiding the replacement if we can't stat().  */
+          c = getcwd (buf, cwd_len + 1);
+          if (c && !AT_FDCWD && stat (c, &sb) != 0 && is_ENAMETOOLONG (errno))
+            {
+              fail = 32;
+              break;
+            }
+        }
+
+      if (dotdot_max <= cwd_len - initial_cwd_len)
+        {
+          if (dotdot_max + DIR_NAME_SIZE < cwd_len - initial_cwd_len)
+            break;
+          c = getcwd (buf, cwd_len + 1);
+          if (!c)
+            {
+              if (! (errno == ERANGE || errno == ENOENT
+                     || is_ENAMETOOLONG (errno)))
+                {
+                  fail = 22;
+                  break;
+                }
+              if (AT_FDCWD || errno == ERANGE || errno == ENOENT)
+                {
+                  fail = 12;
+                  break;
+                }
+            }
+        }
+
+      if (c && strlen (c) != cwd_len)
+        {
+          fail = 23;
+          break;
+        }
+      ++n_chdirs;
+    }
+
+  /* Leaving behind such a deep directory is not polite.
+     So clean up here, right away, even though the driving
+     shell script would also clean up.  */
+  {
+    size_t i;
+
+    /* Try rmdir first, in case the chdir failed.  */
+    rmdir (DIR_NAME);
+    for (i = 0; i <= n_chdirs; i++)
+      {
+        if (chdir ("..") < 0)
+          break;
+        if (rmdir (DIR_NAME) != 0)
+          break;
+      }
+  }
+
+  exit (fail);
+#endif
+}
+          ]])],
+       [gl_cv_func_getcwd_path_max=yes],
+       [case $? in
+        10|11|12) gl_cv_func_getcwd_path_max='no, but it is partly working';;
+        31) gl_cv_func_getcwd_path_max='no, it has the AIX bug';;
+        32) gl_cv_func_getcwd_path_max='yes, but with shorter paths';;
+        *) gl_cv_func_getcwd_path_max=no;;
+        esac],
+       [# Cross-compilation guesses:
+        case "$host_os" in
+          aix*) # On AIX, it has the AIX bug.
+            gl_cv_func_getcwd_path_max='guessing no, it has the AIX bug' ;;
+          gnu*) # On Hurd, it is 'yes'.
+            gl_cv_func_getcwd_path_max='guessing yes' ;;
+          linux* | kfreebsd*)
+            # On older Linux+glibc it's 'no, but it is partly working',
+            # on newer Linux+glibc it's 'yes'.
+            # On Linux+musl libc, it's 'no, but it is partly working'.
+            # On kFreeBSD+glibc, it's 'no, but it is partly working'.
+            gl_cv_func_getcwd_path_max='guessing no, but it is partly working' ;;
+          *) # If we don't know, obey --enable-cross-guesses.
+            gl_cv_func_getcwd_path_max="$gl_cross_guess_normal" ;;
+        esac
+       ])
+    ])
+])
diff --git a/m4/getcwd.m4 b/m4/getcwd.m4
new file mode 100644
index 0000000..6ec7a94
--- /dev/null
+++ b/m4/getcwd.m4
@@ -0,0 +1,166 @@
+# getcwd.m4 - check for working getcwd that is compatible with glibc
+
+# Copyright (C) 2001, 2003-2007, 2009-2021 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Written by Paul Eggert.
+# serial 19
+
+AC_DEFUN([gl_FUNC_GETCWD_NULL],
+  [
+   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+   AC_CHECK_HEADERS_ONCE([unistd.h])
+   AC_CACHE_CHECK([whether getcwd (NULL, 0) allocates memory for result],
+     [gl_cv_func_getcwd_null],
+     [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#	 include <stdlib.h>
+#        if HAVE_UNISTD_H
+#         include <unistd.h>
+#        else /* on Windows with MSVC */
+#         include <direct.h>
+#        endif
+         ]GL_MDA_DEFINES[
+#        ifndef getcwd
+         char *getcwd ();
+#        endif
+]], [[
+#if defined _WIN32 && ! defined __CYGWIN__
+/* mingw cwd does not start with '/', but _getcwd does allocate.
+   However, mingw fails to honor non-zero size.  */
+#else
+           if (chdir ("/") != 0)
+             return 1;
+           else
+             {
+               char *f = getcwd (NULL, 0);
+               if (! f)
+                 return 2;
+               if (f[0] != '/')
+                 { free (f); return 3; }
+               if (f[1] != '\0')
+                 { free (f); return 4; }
+               free (f);
+               return 0;
+             }
+#endif
+         ]])],
+        [gl_cv_func_getcwd_null=yes],
+        [gl_cv_func_getcwd_null=no],
+        [[case "$host_os" in
+                           # Guess yes on glibc systems.
+            *-gnu* | gnu*) gl_cv_func_getcwd_null="guessing yes";;
+                           # Guess yes on musl systems.
+            *-musl*)       gl_cv_func_getcwd_null="guessing yes";;
+                           # Guess yes on Cygwin.
+            cygwin*)       gl_cv_func_getcwd_null="guessing yes";;
+                           # If we don't know, obey --enable-cross-guesses.
+            *)             gl_cv_func_getcwd_null="$gl_cross_guess_normal";;
+          esac
+        ]])])
+])
+
+AC_DEFUN([gl_FUNC_GETCWD_SIGNATURE],
+[
+  AC_CACHE_CHECK([for getcwd with POSIX signature],
+    [gl_cv_func_getcwd_posix_signature],
+    [AC_COMPILE_IFELSE(
+      [AC_LANG_PROGRAM(
+         [[#include <unistd.h>
+         ]GL_MDA_DEFINES],
+         [[extern
+           #ifdef __cplusplus
+           "C"
+           #endif
+           char *getcwd (char *, size_t);
+         ]])
+      ],
+      [gl_cv_func_getcwd_posix_signature=yes],
+      [gl_cv_func_getcwd_posix_signature=no])
+   ])
+])
+
+dnl Guarantee that getcwd will malloc with a NULL first argument.  Assumes
+dnl that either the system getcwd is robust, or that calling code is okay
+dnl with spurious failures when run from a directory with an absolute name
+dnl larger than 4k bytes.
+dnl
+dnl Assumes that getcwd exists; if you are worried about obsolete
+dnl platforms that lacked getcwd(), then you need to use the GPL module.
+AC_DEFUN([gl_FUNC_GETCWD_LGPL],
+[
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  AC_REQUIRE([gl_FUNC_GETCWD_NULL])
+  AC_REQUIRE([gl_FUNC_GETCWD_SIGNATURE])
+
+  case $gl_cv_func_getcwd_null,$gl_cv_func_getcwd_posix_signature in
+  *yes,yes) ;;
+  *)
+    dnl Minimal replacement lib/getcwd-lgpl.c.
+    REPLACE_GETCWD=1
+    ;;
+  esac
+])
+
+dnl Check for all known getcwd bugs; useful for a program likely to be
+dnl executed from an arbitrary location.
+AC_DEFUN([gl_FUNC_GETCWD],
+[
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  AC_REQUIRE([gl_FUNC_GETCWD_NULL])
+  AC_REQUIRE([gl_FUNC_GETCWD_SIGNATURE])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+  gl_abort_bug=no
+  case "$host_os" in
+    mingw*)
+      gl_cv_func_getcwd_path_max=yes
+      ;;
+    *)
+      gl_FUNC_GETCWD_PATH_MAX
+      case "$gl_cv_func_getcwd_null" in
+        *yes)
+          gl_FUNC_GETCWD_ABORT_BUG([gl_abort_bug=yes])
+          ;;
+      esac
+      ;;
+  esac
+  dnl Define HAVE_MINIMALLY_WORKING_GETCWD and HAVE_PARTLY_WORKING_GETCWD
+  dnl if appropriate.
+  case "$gl_cv_func_getcwd_path_max" in
+    *"no" | *"no, it has the AIX bug") ;;
+    *)
+      AC_DEFINE([HAVE_MINIMALLY_WORKING_GETCWD], [1],
+        [Define to 1 if getcwd minimally works, that is, its result can be
+         trusted when it succeeds.])
+      ;;
+  esac
+  case "$gl_cv_func_getcwd_path_max" in
+    *"no, but it is partly working")
+      AC_DEFINE([HAVE_PARTLY_WORKING_GETCWD], [1],
+        [Define to 1 if getcwd works, except it sometimes fails when it
+         shouldn't, setting errno to ERANGE, ENAMETOOLONG, or ENOENT.])
+      ;;
+    *"yes, but with shorter paths")
+      AC_DEFINE([HAVE_GETCWD_SHORTER], [1],
+        [Define to 1 if getcwd works, but with shorter paths
+         than is generally tested with the replacement.])
+      ;;
+  esac
+
+  if { case "$gl_cv_func_getcwd_null" in *yes) false;; *) true;; esac; } \
+     || test $gl_cv_func_getcwd_posix_signature != yes \
+     || { case "$gl_cv_func_getcwd_path_max" in *yes*) false;; *) true;; esac; } \
+     || test $gl_abort_bug = yes; then
+    REPLACE_GETCWD=1
+  fi
+])
+
+# Prerequisites of lib/getcwd.c, when full replacement is in effect.
+AC_DEFUN([gl_PREREQ_GETCWD],
+[
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+  AC_REQUIRE([gl_CHECK_TYPE_STRUCT_DIRENT_D_INO])
+  :
+])
diff --git a/m4/getdelim.m4 b/m4/getdelim.m4
new file mode 100644
index 0000000..244a731
--- /dev/null
+++ b/m4/getdelim.m4
@@ -0,0 +1,99 @@
+# getdelim.m4 serial 15
+
+dnl Copyright (C) 2005-2007, 2009-2021 Free Software Foundation, Inc.
+dnl
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_PREREQ([2.59])
+
+AC_DEFUN([gl_FUNC_GETDELIM],
+[
+  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+  dnl Persuade glibc <stdio.h> to declare getdelim().
+  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+  AC_CHECK_DECLS_ONCE([getdelim])
+
+  AC_CHECK_FUNCS_ONCE([getdelim])
+  if test $ac_cv_func_getdelim = yes; then
+    HAVE_GETDELIM=1
+    dnl Found it in some library.  Verify that it works.
+    AC_CACHE_CHECK([for working getdelim function],
+      [gl_cv_func_working_getdelim],
+      [echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data
+       AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#    include <stdio.h>
+#    include <stdlib.h>
+#    include <string.h>
+    int main ()
+    {
+      FILE *in = fopen ("./conftest.data", "r");
+      if (!in)
+        return 1;
+      {
+        /* Test result for a NULL buffer and a zero size.
+           Based on a test program from Karl Heuer.  */
+        char *line = NULL;
+        size_t siz = 0;
+        int len = getdelim (&line, &siz, '\n', in);
+        if (!(len == 4 && line && strcmp (line, "foo\n") == 0))
+          { free (line); fclose (in); return 2; }
+        free (line);
+      }
+      {
+        /* Test result for a NULL buffer and a non-zero size.
+           This crashes on FreeBSD 8.0.  */
+        char *line = NULL;
+        size_t siz = (size_t)(~0) / 4;
+        if (getdelim (&line, &siz, '\n', in) == -1)
+          { fclose (in); return 3; }
+        free (line);
+      }
+      fclose (in);
+      return 0;
+    }
+    ]])],
+         [gl_cv_func_working_getdelim=yes],
+         [gl_cv_func_working_getdelim=no],
+         [dnl We're cross compiling.
+          dnl Guess it works on glibc2 systems and musl systems.
+          AC_EGREP_CPP([Lucky GNU user],
+            [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2) && !defined __UCLIBC__
+  Lucky GNU user
+ #endif
+#endif
+            ],
+            [gl_cv_func_working_getdelim="guessing yes"],
+            [case "$host_os" in
+               *-musl*) gl_cv_func_working_getdelim="guessing yes" ;;
+               *)       gl_cv_func_working_getdelim="$gl_cross_guess_normal" ;;
+             esac
+            ])
+         ])
+      ])
+    case "$gl_cv_func_working_getdelim" in
+      *yes) ;;
+      *) REPLACE_GETDELIM=1 ;;
+    esac
+  else
+    HAVE_GETDELIM=0
+  fi
+
+  if test $ac_cv_have_decl_getdelim = no; then
+    HAVE_DECL_GETDELIM=0
+  fi
+])
+
+# Prerequisites of lib/getdelim.c.
+AC_DEFUN([gl_PREREQ_GETDELIM],
+[
+  AC_CHECK_FUNCS([flockfile funlockfile])
+  AC_CHECK_DECLS([getc_unlocked])
+])
diff --git a/m4/getdtablesize.m4 b/m4/getdtablesize.m4
index 96aa241..8fbc941 100644
--- a/m4/getdtablesize.m4
+++ b/m4/getdtablesize.m4
@@ -1,5 +1,5 @@
-# getdtablesize.m4 serial 7
-dnl Copyright (C) 2008-2019 Free Software Foundation, Inc.
+# getdtablesize.m4 serial 8
+dnl Copyright (C) 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -29,13 +29,16 @@
            dnl correctly require setrlimit before getdtablesize() can report
            dnl a larger value.
            AC_RUN_IFELSE([
-             AC_LANG_PROGRAM([[#include <unistd.h>]],
-               [int size = getdtablesize();
-                if (dup2 (0, getdtablesize()) != -1)
-                  return 1;
-                if (size != getdtablesize())
-                  return 2;
-               ])],
+             AC_LANG_PROGRAM(
+               [[#include <unistd.h>]
+                GL_MDA_DEFINES
+               ],
+               [[int size = getdtablesize();
+                 if (dup2 (0, getdtablesize()) != -1)
+                   return 1;
+                 if (size != getdtablesize())
+                   return 2;
+               ]])],
              [gl_cv_func_getdtablesize_works=yes],
              [gl_cv_func_getdtablesize_works=no],
              [case "$host_os" in
diff --git a/m4/gethrxtime.m4 b/m4/gethrxtime.m4
index 6444fad..0e1863f 100644
--- a/m4/gethrxtime.m4
+++ b/m4/gethrxtime.m4
@@ -1,5 +1,5 @@
-# gethrxtime.m4 serial 12
-dnl Copyright (C) 2005-2006, 2008-2019 Free Software Foundation, Inc.
+# gethrxtime.m4 serial 13
+dnl Copyright (C) 2005-2006, 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -62,6 +62,5 @@
 # Prerequisites of lib/xtime.h.
 AC_DEFUN([gl_XTIME],
 [
-  AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
   :
 ])
diff --git a/m4/getline.m4 b/m4/getline.m4
new file mode 100644
index 0000000..58b27c7
--- /dev/null
+++ b/m4/getline.m4
@@ -0,0 +1,109 @@
+# getline.m4 serial 30
+
+dnl Copyright (C) 1998-2003, 2005-2007, 2009-2021 Free Software Foundation,
+dnl Inc.
+dnl
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_PREREQ([2.59])
+
+dnl See if there's a working, system-supplied version of the getline function.
+dnl We can't just do AC_REPLACE_FUNCS([getline]) because some systems
+dnl have a function by that name in -linet that doesn't have anything
+dnl to do with the function we need.
+AC_DEFUN([gl_FUNC_GETLINE],
+[
+  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+  dnl Persuade glibc <stdio.h> to declare getline().
+  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+  AC_CHECK_DECLS_ONCE([getline])
+
+  gl_getline_needs_run_time_check=no
+  AC_CHECK_FUNC([getline],
+                [dnl Found it in some library.  Verify that it works.
+                 gl_getline_needs_run_time_check=yes],
+                [am_cv_func_working_getline=no])
+  if test $gl_getline_needs_run_time_check = yes; then
+    AC_CACHE_CHECK([for working getline function],
+      [am_cv_func_working_getline],
+      [echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data
+       AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#    include <stdio.h>
+#    include <stdlib.h>
+#    include <string.h>
+    int main ()
+    {
+      FILE *in = fopen ("./conftest.data", "r");
+      if (!in)
+        return 1;
+      {
+        /* Test result for a NULL buffer and a zero size.
+           Based on a test program from Karl Heuer.  */
+        char *line = NULL;
+        size_t siz = 0;
+        int len = getline (&line, &siz, in);
+        if (!(len == 4 && line && strcmp (line, "foo\n") == 0))
+          { free (line); fclose (in); return 2; }
+        free (line);
+      }
+      {
+        /* Test result for a NULL buffer and a non-zero size.
+           This crashes on FreeBSD 8.0.  */
+        char *line = NULL;
+        size_t siz = (size_t)(~0) / 4;
+        if (getline (&line, &siz, in) == -1)
+          { fclose (in); return 3; }
+        free (line);
+      }
+      fclose (in);
+      return 0;
+    }
+    ]])],
+         [am_cv_func_working_getline=yes],
+         [am_cv_func_working_getline=no],
+         [dnl We're cross compiling.
+          dnl Guess it works on glibc2 systems and musl systems.
+          AC_EGREP_CPP([Lucky GNU user],
+            [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2) && !defined __UCLIBC__
+  Lucky GNU user
+ #endif
+#endif
+            ],
+            [am_cv_func_working_getline="guessing yes"],
+            [case "$host_os" in
+               *-musl*) am_cv_func_working_getline="guessing yes" ;;
+               *)       am_cv_func_working_getline="$gl_cross_guess_normal" ;;
+             esac
+            ])
+         ])
+      ])
+  fi
+
+  if test $ac_cv_have_decl_getline = no; then
+    HAVE_DECL_GETLINE=0
+  fi
+
+  case "$am_cv_func_working_getline" in
+    *yes) ;;
+    *)
+      dnl Set REPLACE_GETLINE always: Even if we have not found the broken
+      dnl getline function among $LIBS, it may exist in libinet and the
+      dnl executable may be linked with -linet.
+      REPLACE_GETLINE=1
+      ;;
+  esac
+])
+
+# Prerequisites of lib/getline.c.
+AC_DEFUN([gl_PREREQ_GETLINE],
+[
+  :
+])
diff --git a/m4/getopt.m4 b/m4/getopt.m4
index 8cc7827..bb95c5e 100644
--- a/m4/getopt.m4
+++ b/m4/getopt.m4
@@ -1,5 +1,5 @@
 # getopt.m4 serial 47
-dnl Copyright (C) 2002-2006, 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2002-2006, 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/getpagesize.m4 b/m4/getpagesize.m4
new file mode 100644
index 0000000..7e61801
--- /dev/null
+++ b/m4/getpagesize.m4
@@ -0,0 +1,49 @@
+# getpagesize.m4 serial 10
+dnl Copyright (C) 2002, 2004-2005, 2007, 2009-2021 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_GETPAGESIZE],
+[
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  gl_CHECK_FUNC_GETPAGESIZE
+  if test $gl_cv_func_getpagesize = no; then
+    HAVE_GETPAGESIZE=0
+    AC_CHECK_HEADERS([OS.h])
+    if test $ac_cv_header_OS_h = yes; then
+      HAVE_OS_H=1
+    fi
+    AC_CHECK_HEADERS([sys/param.h])
+    if test $ac_cv_header_sys_param_h = yes; then
+      HAVE_SYS_PARAM_H=1
+    fi
+  fi
+  case "$host_os" in
+    mingw*)
+      REPLACE_GETPAGESIZE=1
+      ;;
+  esac
+  dnl Also check whether it's declared.
+  dnl mingw has getpagesize() in libgcc.a but doesn't declare it.
+  AC_CHECK_DECL([getpagesize], , [HAVE_DECL_GETPAGESIZE=0])
+])
+
+dnl Tests whether the function getpagesize() exists.
+dnl Sets gl_cv_func_getpagesize.
+AC_DEFUN([gl_CHECK_FUNC_GETPAGESIZE],
+[
+  dnl We can't use AC_CHECK_FUNC here, because getpagesize() is defined as a
+  dnl static inline function when compiling for Android 4.4 or older.
+  AC_CACHE_CHECK([for getpagesize], [gl_cv_func_getpagesize],
+    [AC_LINK_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <unistd.h>]],
+          [[return getpagesize();]])
+       ],
+       [gl_cv_func_getpagesize=yes],
+       [gl_cv_func_getpagesize=no])
+    ])
+])
diff --git a/m4/getprogname.m4 b/m4/getprogname.m4
index 4a96d06..65917d6 100644
--- a/m4/getprogname.m4
+++ b/m4/getprogname.m4
@@ -1,6 +1,6 @@
 # getprogname.m4 - check for getprogname or replacements for it
 
-# Copyright (C) 2016-2019 Free Software Foundation, Inc.
+# Copyright (C) 2016-2021 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
diff --git a/m4/getrusage.m4 b/m4/getrusage.m4
index 181fa22..15bd76d 100644
--- a/m4/getrusage.m4
+++ b/m4/getrusage.m4
@@ -1,5 +1,5 @@
 # getrusage.m4 serial 1
-dnl Copyright (C) 2012-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2012-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/gettime.m4 b/m4/gettime.m4
index 60d8ea1..de7c330 100644
--- a/m4/gettime.m4
+++ b/m4/gettime.m4
@@ -1,5 +1,5 @@
 # gettime.m4 serial 9
-dnl Copyright (C) 2002, 2004-2006, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2002, 2004-2006, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/gettimeofday.m4 b/m4/gettimeofday.m4
index 7eebabd..37c5440 100644
--- a/m4/gettimeofday.m4
+++ b/m4/gettimeofday.m4
@@ -1,6 +1,6 @@
-# serial 27
+# serial 29
 
-# Copyright (C) 2001-2003, 2005, 2007, 2009-2019 Free Software Foundation, Inc.
+# Copyright (C) 2001-2003, 2005, 2007, 2009-2021 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -9,17 +9,16 @@
 
 AC_DEFUN([gl_FUNC_GETTIMEOFDAY],
 [
-  AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS])
+  AC_REQUIRE([gl_SYS_TIME_H_DEFAULTS])
   AC_REQUIRE([AC_C_RESTRICT])
   AC_REQUIRE([AC_CANONICAL_HOST])
-  AC_REQUIRE([gl_HEADER_SYS_TIME_H])
+  AC_REQUIRE([gl_SYS_TIME_H])
   AC_CHECK_FUNCS_ONCE([gettimeofday])
 
   gl_gettimeofday_timezone=void
   if test $ac_cv_func_gettimeofday != yes; then
     HAVE_GETTIMEOFDAY=0
   else
-    gl_FUNC_GETTIMEOFDAY_CLOBBER
     AC_CACHE_CHECK([for gettimeofday with POSIX signature],
       [gl_cv_func_gettimeofday_posix_signature],
       [AC_COMPILE_IFELSE(
@@ -66,63 +65,5 @@
      declaration of the second argument to gettimeofday.])
 ])
 
-
-dnl See if gettimeofday clobbers the static buffer that localtime uses
-dnl for its return value.  The gettimeofday function from Mac OS X 10.0.4
-dnl (i.e., Darwin 1.3.7) has this problem.
-dnl
-dnl If it does, then arrange to use gettimeofday and localtime only via
-dnl the wrapper functions that work around the problem.
-
-AC_DEFUN([gl_FUNC_GETTIMEOFDAY_CLOBBER],
-[
- AC_REQUIRE([gl_HEADER_SYS_TIME_H])
- AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
- AC_REQUIRE([gl_LOCALTIME_BUFFER_DEFAULTS])
-
- AC_CACHE_CHECK([whether gettimeofday clobbers localtime buffer],
-  [gl_cv_func_gettimeofday_clobber],
-  [AC_RUN_IFELSE(
-     [AC_LANG_PROGRAM(
-        [[#include <string.h>
-          #include <sys/time.h>
-          #include <time.h>
-          #include <stdlib.h>
-        ]],
-        [[
-          time_t t = 0;
-          struct tm *lt;
-          struct tm saved_lt;
-          struct timeval tv;
-          lt = localtime (&t);
-          saved_lt = *lt;
-          gettimeofday (&tv, NULL);
-          return memcmp (lt, &saved_lt, sizeof (struct tm)) != 0;
-        ]])],
-     [gl_cv_func_gettimeofday_clobber=no],
-     [gl_cv_func_gettimeofday_clobber=yes],
-     [# When cross-compiling:
-      case "$host_os" in
-                       # Guess all is fine on glibc systems.
-        *-gnu* | gnu*) gl_cv_func_gettimeofday_clobber="guessing no" ;;
-                       # Guess all is fine on musl systems.
-        *-musl*)       gl_cv_func_gettimeofday_clobber="guessing no" ;;
-                       # Guess no on native Windows.
-        mingw*)        gl_cv_func_gettimeofday_clobber="guessing no" ;;
-                       # If we don't know, obey --enable-cross-guesses.
-        *)             gl_cv_func_gettimeofday_clobber="$gl_cross_guess_inverted" ;;
-      esac
-     ])])
-
- case "$gl_cv_func_gettimeofday_clobber" in
-   *yes)
-     REPLACE_GETTIMEOFDAY=1
-     AC_DEFINE([GETTIMEOFDAY_CLOBBERS_LOCALTIME], [1],
-       [Define if gettimeofday clobbers the localtime buffer.])
-     gl_LOCALTIME_BUFFER_NEEDED
-     ;;
- esac
-])
-
 # Prerequisites of lib/gettimeofday.c.
 AC_DEFUN([gl_PREREQ_GETTIMEOFDAY], [:])
diff --git a/m4/gnulib-common.m4 b/m4/gnulib-common.m4
index d8f0d3f..12b19db 100644
--- a/m4/gnulib-common.m4
+++ b/m4/gnulib-common.m4
@@ -1,5 +1,5 @@
-# gnulib-common.m4 serial 46
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+# gnulib-common.m4 serial 67
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -12,8 +12,18 @@
   dnl Use AC_REQUIRE here, so that the code is expanded once only.
   AC_REQUIRE([gl_00GNULIB])
   AC_REQUIRE([gl_COMMON_BODY])
+  AC_REQUIRE([gl_ZZGNULIB])
 ])
 AC_DEFUN([gl_COMMON_BODY], [
+  AH_VERBATIM([_GL_GNUC_PREREQ],
+[/* True if the compiler says it groks GNU C version MAJOR.MINOR.  */
+#if defined __GNUC__ && defined __GNUC_MINOR__
+# define _GL_GNUC_PREREQ(major, minor) \
+    ((major) < __GNUC__ + ((minor) <= __GNUC_MINOR__))
+#else
+# define _GL_GNUC_PREREQ(major, minor) 0
+#endif
+])
   AH_VERBATIM([_Noreturn],
 [/* The _Noreturn keyword of C11.  */
 #ifndef _Noreturn
@@ -29,10 +39,14 @@
        this syntax with 'extern'.  */
 #  define _Noreturn [[noreturn]]
 # elif ((!defined __cplusplus || defined __clang__) \
-        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)  \
-            || 4 < __GNUC__ + (7 <= __GNUC_MINOR__)))
+        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
+            || (!defined __STRICT_ANSI__ \
+                && (_GL_GNUC_PREREQ (4, 7) \
+                    || (defined __apple_build_version__ \
+                        ? 6000000 <= __apple_build_version__ \
+                        : 3 < __clang_major__ + (5 <= __clang_minor__))))))
    /* _Noreturn works as-is.  */
-# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
+# elif _GL_GNUC_PREREQ (2, 8) || defined __clang__ || 0x5110 <= __SUNPRO_C
 #  define _Noreturn __attribute__ ((__noreturn__))
 # elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
 #  define _Noreturn __declspec (noreturn)
@@ -51,48 +65,365 @@
 #if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__
 # define __GNUC_STDC_INLINE__ 1
 #endif])
-  AH_VERBATIM([unused_parameter],
-[/* Define as a marker that can be attached to declarations that might not
-    be used.  This helps to reduce warnings, such as from
-    GCC -Wunused-parameter.  */
-#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
-# define _GL_UNUSED __attribute__ ((__unused__))
+  AH_VERBATIM([attribute],
+[/* Attributes.  */
+#if (defined __has_attribute \
+     && (!defined __clang_minor__ \
+         || 3 < __clang_major__ + (5 <= __clang_minor__)))
+# define _GL_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__)
 #else
-# define _GL_UNUSED
-#endif
-/* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name
-   is a misnomer outside of parameter lists.  */
-#define _UNUSED_PARAMETER_ _GL_UNUSED
-
-/* gcc supports the "unused" attribute on possibly unused labels, and
-   g++ has since version 4.5.  Note to support C++ as well as C,
-   _GL_UNUSED_LABEL should be used with a trailing ;  */
-#if !defined __cplusplus || __GNUC__ > 4 \
-    || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
-# define _GL_UNUSED_LABEL _GL_UNUSED
-#else
-# define _GL_UNUSED_LABEL
+# define _GL_HAS_ATTRIBUTE(attr) _GL_ATTR_##attr
+# define _GL_ATTR_alloc_size _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_always_inline _GL_GNUC_PREREQ (3, 2)
+# define _GL_ATTR_artificial _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_cold _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_const _GL_GNUC_PREREQ (2, 95)
+# define _GL_ATTR_deprecated _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_diagnose_if 0
+# define _GL_ATTR_error _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_externally_visible _GL_GNUC_PREREQ (4, 1)
+# define _GL_ATTR_fallthrough _GL_GNUC_PREREQ (7, 0)
+# define _GL_ATTR_format _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_leaf _GL_GNUC_PREREQ (4, 6)
+# define _GL_ATTR_malloc _GL_GNUC_PREREQ (3, 0)
+# ifdef _ICC
+#  define _GL_ATTR_may_alias 0
+# else
+#  define _GL_ATTR_may_alias _GL_GNUC_PREREQ (3, 3)
+# endif
+# define _GL_ATTR_noinline _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_nonnull _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_nonstring _GL_GNUC_PREREQ (8, 0)
+# define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96)
+# define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9)
+# define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0)
+# define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4)
 #endif
 
-/* The __pure__ attribute was added in gcc 2.96.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#ifdef __has_c_attribute
+# define _GL_HAS_C_ATTRIBUTE(attr) __has_c_attribute (__##attr##__)
 #else
-# define _GL_ATTRIBUTE_PURE /* empty */
+# define _GL_HAS_C_ATTRIBUTE(attr) 0
 #endif
 
-/* The __const__ attribute was added in gcc 2.95.  */
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
+]dnl There is no _GL_ATTRIBUTE_ALIGNED; use stdalign's _Alignas instead.
+[
+/* _GL_ATTRIBUTE_ALLOC_SIZE ((N)) declares that the Nth argument of the function
+   is the size of the returned memory block.
+   _GL_ATTRIBUTE_ALLOC_SIZE ((M, N)) declares that the Mth argument multiplied
+   by the Nth argument of the function is the size of the returned memory block.
+ */
+/* Applies to: function, pointer to function, function types.  */
+#if _GL_HAS_ATTRIBUTE (alloc_size)
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
+#else
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args)
+#endif
+
+/* _GL_ATTRIBUTE_ALWAYS_INLINE tells that the compiler should always inline the
+   function and report an error if it cannot do so.  */
+/* Applies to: function.  */
+#if _GL_HAS_ATTRIBUTE (always_inline)
+# define _GL_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__))
+#else
+# define _GL_ATTRIBUTE_ALWAYS_INLINE
+#endif
+
+/* _GL_ATTRIBUTE_ARTIFICIAL declares that the function is not important to show
+    in stack traces when debugging.  The compiler should omit the function from
+    stack traces.  */
+/* Applies to: function.  */
+#if _GL_HAS_ATTRIBUTE (artificial)
+# define _GL_ATTRIBUTE_ARTIFICIAL __attribute__ ((__artificial__))
+#else
+# define _GL_ATTRIBUTE_ARTIFICIAL
+#endif
+
+/* _GL_ATTRIBUTE_COLD declares that the function is rarely executed.  */
+/* Applies to: functions.  */
+/* Avoid __attribute__ ((cold)) on MinGW; see thread starting at
+   <https://lists.gnu.org/r/emacs-devel/2019-04/msg01152.html>.
+   Also, Oracle Studio 12.6 requires 'cold' not '__cold__'.  */
+#if _GL_HAS_ATTRIBUTE (cold) && !defined __MINGW32__
+# ifndef __SUNPRO_C
+#  define _GL_ATTRIBUTE_COLD __attribute__ ((__cold__))
+# else
+#  define _GL_ATTRIBUTE_COLD __attribute__ ((cold))
+# endif
+#else
+# define _GL_ATTRIBUTE_COLD
+#endif
+
+/* _GL_ATTRIBUTE_CONST declares that it is OK for a compiler to omit duplicate
+   calls to the function with the same arguments.
+   This attribute is safe for a function that neither depends on nor affects
+   observable state, and always returns exactly once - e.g., does not loop
+   forever, and does not call longjmp.
+   (This attribute is stricter than _GL_ATTRIBUTE_PURE.)  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (const)
 # define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
 #else
-# define _GL_ATTRIBUTE_CONST /* empty */
+# define _GL_ATTRIBUTE_CONST
 #endif
 
-/* The __malloc__ attribute was added in gcc 3.  */
-#if 3 <= __GNUC__
+/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
+   that can be freed by passing them as the Ith argument to the
+   function F.
+   _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
+   can be freed via 'free'; it can be used only after declaring 'free'.  */
+/* Applies to: functions.  Cannot be used on inline functions.  */
+#if _GL_GNUC_PREREQ (11, 0)
+# define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
+#else
+# define _GL_ATTRIBUTE_DEALLOC(f, i)
+#endif
+#define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (free, 1)
+
+/* _GL_ATTRIBUTE_DEPRECATED: Declares that an entity is deprecated.
+   The compiler may warn if the entity is used.  */
+/* Applies to:
+     - function, variable,
+     - struct, union, struct/union member,
+     - enumeration, enumeration item,
+     - typedef,
+   in C++ also: namespace, class, template specialization.  */
+#if _GL_HAS_C_ATTRIBUTE (deprecated)
+# define _GL_ATTRIBUTE_DEPRECATED [[__deprecated__]]
+#elif _GL_HAS_ATTRIBUTE (deprecated)
+# define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__))
+#else
+# define _GL_ATTRIBUTE_DEPRECATED
+#endif
+
+/* _GL_ATTRIBUTE_ERROR(msg) requests an error if a function is called and
+   the function call is not optimized away.
+   _GL_ATTRIBUTE_WARNING(msg) requests a warning if a function is called and
+   the function call is not optimized away.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (error)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__error__ (msg)))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__warning__ (msg)))
+#elif _GL_HAS_ATTRIBUTE (diagnose_if)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__diagnose_if__ (1, msg, "error")))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#else
+# define _GL_ATTRIBUTE_ERROR(msg)
+# define _GL_ATTRIBUTE_WARNING(msg)
+#endif
+
+/* _GL_ATTRIBUTE_EXTERNALLY_VISIBLE declares that the entity should remain
+   visible to debuggers etc., even with '-fwhole-program'.  */
+/* Applies to: functions, variables.  */
+#if _GL_HAS_ATTRIBUTE (externally_visible)
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((externally_visible))
+#else
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
+#endif
+
+/* _GL_ATTRIBUTE_FALLTHROUGH declares that it is not a programming mistake if
+   the control flow falls through to the immediately following 'case' or
+   'default' label.  The compiler should not warn in this case.  */
+/* Applies to: Empty statement (;), inside a 'switch' statement.  */
+/* Always expands to something.  */
+#if _GL_HAS_C_ATTRIBUTE (fallthrough)
+# define _GL_ATTRIBUTE_FALLTHROUGH [[__fallthrough__]]
+#elif _GL_HAS_ATTRIBUTE (fallthrough)
+# define _GL_ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__))
+#else
+# define _GL_ATTRIBUTE_FALLTHROUGH ((void) 0)
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK))
+   declares that the STRING-INDEXth function argument is a format string of
+   style ARCHETYPE, which is one of:
+     printf, gnu_printf
+     scanf, gnu_scanf,
+     strftime, gnu_strftime,
+     strfmon,
+   or the same thing prefixed and suffixed with '__'.
+   If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK
+   are suitable for the format string.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (format)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define _GL_ATTRIBUTE_FORMAT(spec)
+#endif
+
+/* _GL_ATTRIBUTE_LEAF declares that if the function is called from some other
+   compilation unit, it executes code from that unit only by return or by
+   exception handling.  This declaration lets the compiler optimize that unit
+   more aggressively.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (leaf)
+# define _GL_ATTRIBUTE_LEAF __attribute__ ((__leaf__))
+#else
+# define _GL_ATTRIBUTE_LEAF
+#endif
+
+/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
+   allocated memory.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (malloc)
 # define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
 #else
-# define _GL_ATTRIBUTE_MALLOC /* empty */
+# define _GL_ATTRIBUTE_MALLOC
+#endif
+
+/* _GL_ATTRIBUTE_MAY_ALIAS declares that pointers to the type may point to the
+   same storage as pointers to other types.  Thus this declaration disables
+   strict aliasing optimization.  */
+/* Applies to: types.  */
+/* Oracle Studio 12.6 mishandles may_alias despite __has_attribute OK.  */
+#if _GL_HAS_ATTRIBUTE (may_alias) && !defined __SUNPRO_C
+# define _GL_ATTRIBUTE_MAY_ALIAS __attribute__ ((__may_alias__))
+#else
+# define _GL_ATTRIBUTE_MAY_ALIAS
+#endif
+
+/* _GL_ATTRIBUTE_MAYBE_UNUSED declares that it is not a programming mistake if
+   the entity is not used.  The compiler should not warn if the entity is not
+   used.  */
+/* Applies to:
+     - function, variable,
+     - struct, union, struct/union member,
+     - enumeration, enumeration item,
+     - typedef,
+   in C++ also: class.  */
+/* In C++ and C2x, this is spelled [[__maybe_unused__]].
+   GCC's syntax is __attribute__ ((__unused__)).
+   clang supports both syntaxes.  */
+#if _GL_HAS_C_ATTRIBUTE (maybe_unused)
+# define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
+#else
+# define _GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_UNUSED
+#endif
+/* Alternative spelling of this macro, for convenience.  */
+#define _GL_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
+/* Earlier spellings of this macro.  */
+#define _UNUSED_PARAMETER_ _GL_ATTRIBUTE_MAYBE_UNUSED
+
+/* _GL_ATTRIBUTE_NODISCARD declares that the caller of the function should not
+   discard the return value.  The compiler may warn if the caller does not use
+   the return value, unless the caller uses something like ignore_value.  */
+/* Applies to: function, enumeration, class.  */
+#if _GL_HAS_C_ATTRIBUTE (nodiscard)
+# define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]]
+#elif _GL_HAS_ATTRIBUTE (warn_unused_result)
+# define _GL_ATTRIBUTE_NODISCARD __attribute__ ((__warn_unused_result__))
+#else
+# define _GL_ATTRIBUTE_NODISCARD
+#endif
+
+/* _GL_ATTRIBUTE_NOINLINE tells that the compiler should not inline the
+   function.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (noinline)
+# define _GL_ATTRIBUTE_NOINLINE __attribute__ ((__noinline__))
+#else
+# define _GL_ATTRIBUTE_NOINLINE
+#endif
+
+/* _GL_ATTRIBUTE_NONNULL ((N1, N2,...)) declares that the arguments N1, N2,...
+   must not be NULL.
+   _GL_ATTRIBUTE_NONNULL () declares that all pointer arguments must not be
+   null.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (nonnull)
+# define _GL_ATTRIBUTE_NONNULL(args) __attribute__ ((__nonnull__ args))
+#else
+# define _GL_ATTRIBUTE_NONNULL(args)
+#endif
+
+/* _GL_ATTRIBUTE_NONSTRING declares that the contents of a character array is
+   not meant to be NUL-terminated.  */
+/* Applies to: struct/union members and variables that are arrays of element
+   type '[[un]signed] char'.  */
+#if _GL_HAS_ATTRIBUTE (nonstring)
+# define _GL_ATTRIBUTE_NONSTRING __attribute__ ((__nonstring__))
+#else
+# define _GL_ATTRIBUTE_NONSTRING
+#endif
+
+/* There is no _GL_ATTRIBUTE_NORETURN; use _Noreturn instead.  */
+
+/* _GL_ATTRIBUTE_NOTHROW declares that the function does not throw exceptions.
+ */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (nothrow) && !defined __cplusplus
+# define _GL_ATTRIBUTE_NOTHROW __attribute__ ((__nothrow__))
+#else
+# define _GL_ATTRIBUTE_NOTHROW
+#endif
+
+/* _GL_ATTRIBUTE_PACKED declares:
+   For struct members: The member has the smallest possible alignment.
+   For struct, union, class: All members have the smallest possible alignment,
+   minimizing the memory required.  */
+/* Applies to: struct members, struct, union,
+   in C++ also: class.  */
+#if _GL_HAS_ATTRIBUTE (packed)
+# define _GL_ATTRIBUTE_PACKED __attribute__ ((__packed__))
+#else
+# define _GL_ATTRIBUTE_PACKED
+#endif
+
+/* _GL_ATTRIBUTE_PURE declares that It is OK for a compiler to omit duplicate
+   calls to the function with the same arguments if observable state is not
+   changed between calls.
+   This attribute is safe for a function that does not affect
+   observable state, and always returns exactly once.
+   (This attribute is looser than _GL_ATTRIBUTE_CONST.)  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (pure)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE
+#endif
+
+/* _GL_ATTRIBUTE_RETURNS_NONNULL declares that the function's return value is
+   a non-NULL pointer.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (returns_nonnull)
+# define _GL_ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__))
+#else
+# define _GL_ATTRIBUTE_RETURNS_NONNULL
+#endif
+
+/* _GL_ATTRIBUTE_SENTINEL(pos) declares that the variadic function expects a
+   trailing NULL argument.
+   _GL_ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99).
+   _GL_ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL.  */
+/* Applies to: functions.  */
+#if _GL_HAS_ATTRIBUTE (sentinel)
+# define _GL_ATTRIBUTE_SENTINEL(pos) __attribute__ ((__sentinel__ pos))
+#else
+# define _GL_ATTRIBUTE_SENTINEL(pos)
+#endif
+
+/* A helper macro.  Don't use it directly.  */
+#if _GL_HAS_ATTRIBUTE (unused)
+# define _GL_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#else
+# define _GL_ATTRIBUTE_UNUSED
+#endif
+
+]dnl There is no _GL_ATTRIBUTE_VISIBILITY; see m4/visibility.m4 instead.
+[
+/* _GL_UNUSED_LABEL; declares that it is not a programming mistake if the
+   immediately preceding label is not used.  The compiler should not warn
+   if the label is not used.  */
+/* Applies to: label (both in C and C++).  */
+/* Note that g++ < 4.5 does not support the '__attribute__ ((__unused__)) ;'
+   syntax.  But clang does.  */
+#if !(defined __cplusplus && !_GL_GNUC_PREREQ (4, 5)) || defined __clang__
+# define _GL_UNUSED_LABEL _GL_ATTRIBUTE_UNUSED
+#else
+# define _GL_UNUSED_LABEL
 #endif
 ])
   AH_VERBATIM([async_safe],
@@ -122,6 +453,22 @@
        errno.  */
 #define _GL_ASYNC_SAFE
 ])
+  AH_VERBATIM([micro_optimizations],
+[/* _GL_CMP (n1, n2) performs a three-valued comparison on n1 vs. n2, where
+   n1 and n2 are expressions without side effects, that evaluate to real
+   numbers (excluding NaN).
+   It returns
+     1  if n1 > n2
+     0  if n1 == n2
+     -1 if n1 < n2
+   The naïve code   (n1 > n2 ? 1 : n1 < n2 ? -1 : 0)  produces a conditional
+   jump with nearly all GCC versions up to GCC 10.
+   This variant     (n1 < n2 ? -1 : n1 > n2)  produces a conditional with many
+   GCC versions up to GCC 9.
+   The better code  (n1 > n2) - (n1 < n2)  from Hacker's Delight § 2-9
+   avoids conditional jumps in all GCC versions >= 3.4.  */
+#define _GL_CMP(n1, n2) (((n1) > (n2)) - ((n1) < (n2)))
+])
   dnl Hint which direction to take regarding cross-compilation guesses:
   dnl When a user installs a program on a platform they are not intimately
   dnl familiar with, --enable-cross-guesses=conservative is the appropriate
@@ -157,6 +504,16 @@
   export LIBC_FATAL_STDERR_
 ])
 
+# gl_MODULE_INDICATOR_INIT_VARIABLE([variablename])
+# gl_MODULE_INDICATOR_INIT_VARIABLE([variablename], [initialvalue])
+# initializes the shell variable that indicates the presence of the given module
+# as a C preprocessor expression.
+AC_DEFUN([gl_MODULE_INDICATOR_INIT_VARIABLE],
+[
+  GL_MODULE_INDICATOR_PREFIX[]_[$1]=m4_if([$2], , [0], [$2])
+  AC_SUBST(GL_MODULE_INDICATOR_PREFIX[]_[$1])
+])
+
 # gl_MODULE_INDICATOR_CONDITION
 # expands to a C preprocessor expression that evaluates to 1 or 0, depending
 # whether a gnulib module that has been requested shall be considered present
@@ -169,9 +526,9 @@
 AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE],
 [
   gl_MODULE_INDICATOR_SET_VARIABLE_AUX(
-    [GNULIB_[]m4_translit([[$1]],
-                          [abcdefghijklmnopqrstuvwxyz./-],
-                          [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])],
+    [GL_MODULE_INDICATOR_PREFIX[]_GNULIB_[]m4_translit([[$1]],
+                                                       [abcdefghijklmnopqrstuvwxyz./-],
+                                                       [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])],
     [gl_MODULE_INDICATOR_CONDITION])
 ])
 
@@ -283,34 +640,20 @@
   AC_SUBST([HAVE_FEATURES_H])
 ])
 
-# AS_VAR_IF(VAR, VALUE, [IF-MATCH], [IF-NOT-MATCH])
-# ----------------------------------------------------
-# Backport of autoconf-2.63b's macro.
-# Remove this macro when we can assume autoconf >= 2.64.
-m4_ifndef([AS_VAR_IF],
-[m4_define([AS_VAR_IF],
-[AS_IF([test x"AS_VAR_GET([$1])" = x""$2], [$3], [$4])])])
-
 # gl_PROG_CC_C99
 # Modifies the value of the shell variable CC in an attempt to make $CC
 # understand ISO C99 source code.
-# This is like AC_PROG_CC_C99, except that
-# - AC_PROG_CC_C99 does not mix well with AC_PROG_CC_STDC
-#   <https://lists.gnu.org/r/bug-gnulib/2011-09/msg00367.html>,
-#   but many more packages use AC_PROG_CC_STDC than AC_PROG_CC_C99
-#   <https://lists.gnu.org/r/bug-gnulib/2011-09/msg00441.html>.
-# Remaining problems:
-# - When AC_PROG_CC_STDC is invoked twice, it adds the C99 enabling options
-#   to CC twice
-#   <https://lists.gnu.org/r/bug-gnulib/2011-09/msg00431.html>.
-# - AC_PROG_CC_STDC is likely to change now that C11 is an ISO standard.
 AC_DEFUN([gl_PROG_CC_C99],
 [
-  dnl Change that version number to the minimum Autoconf version that supports
-  dnl mixing AC_PROG_CC_C99 calls with AC_PROG_CC_STDC calls.
-  m4_version_prereq([9.0],
-    [AC_REQUIRE([AC_PROG_CC_C99])],
-    [AC_REQUIRE([AC_PROG_CC_STDC])])
+  dnl Just use AC_PROG_CC_C99.
+  dnl When AC_PROG_CC_C99 and AC_PROG_CC_STDC are used together, the substituted
+  dnl value of CC will contain the C99 enabling options twice. But this is only
+  dnl a cosmetic problem.
+  dnl With Autoconf >= 2.70, use AC_PROG_CC since it implies AC_PROG_CC_C99;
+  dnl this avoids a "warning: The macro `AC_PROG_CC_C99' is obsolete."
+  m4_version_prereq([2.70],
+    [AC_REQUIRE([AC_PROG_CC])],
+    [AC_REQUIRE([AC_PROG_CC_C99])])
 ])
 
 # gl_PROG_AR_RANLIB
@@ -384,16 +727,16 @@
 ])
 
 # AC_C_RESTRICT
-# This definition is copied from post-2.69 Autoconf and overrides the
-# AC_C_RESTRICT macro from autoconf 2.60..2.69.  It can be removed
-# once autoconf >= 2.70 can be assumed.  It's painful to check version
-# numbers, and in practice this macro is more up-to-date than Autoconf
-# is, so override Autoconf unconditionally.
+# This definition is copied from post-2.70 Autoconf and overrides the
+# AC_C_RESTRICT macro from autoconf 2.60..2.70.
+m4_version_prereq([2.70.1], [], [
 AC_DEFUN([AC_C_RESTRICT],
 [AC_CACHE_CHECK([for C/C++ restrict keyword], [ac_cv_c_restrict],
   [ac_cv_c_restrict=no
-   # The order here caters to the fact that C++ does not require restrict.
-   for ac_kw in __restrict __restrict__ _Restrict restrict; do
+   # Put '__restrict__' first, to avoid problems with glibc and non-GCC; see:
+   # https://lists.gnu.org/archive/html/bug-autoconf/2016-02/msg00006.html
+   # Put 'restrict' last, because C++ lacks it.
+   for ac_kw in __restrict__ __restrict _Restrict restrict; do
      AC_COMPILE_IFELSE(
       [AC_LANG_PROGRAM(
          [[typedef int *int_ptr;
@@ -413,14 +756,15 @@
  AH_VERBATIM([restrict],
 [/* Define to the equivalent of the C99 'restrict' keyword, or to
    nothing if this is not supported.  Do not define if restrict is
-   supported directly.  */
+   supported only directly.  */
 #undef restrict
-/* Work around a bug in Sun C++: it does not support _Restrict or
-   __restrict__, even though the corresponding Sun C compiler ends up with
-   "#define restrict _Restrict" or "#define restrict __restrict__" in the
-   previous line.  Perhaps some future version of Sun C++ will work with
-   restrict; if so, hopefully it defines __RESTRICT like Sun C does.  */
-#if defined __SUNPRO_CC && !defined __RESTRICT
+/* Work around a bug in older versions of Sun C++, which did not
+   #define __restrict__ or support _Restrict or __restrict__
+   even though the corresponding Sun C compiler ended up with
+   "#define restrict _Restrict" or "#define restrict __restrict__"
+   in the previous line.  This workaround can be removed once
+   we assume Oracle Developer Studio 12.5 (2016) or later.  */
+#if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__
 # define _Restrict
 # define __restrict__
 #endif])
@@ -430,6 +774,7 @@
    *)  AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;;
  esac
 ])# AC_C_RESTRICT
+])
 
 # gl_BIGENDIAN
 # is like AC_C_BIGENDIAN, except that it can be AC_REQUIREd.
@@ -440,6 +785,22 @@
   AC_C_BIGENDIAN
 ])
 
+# A temporary file descriptor.
+# Must be less than 10, because dash 0.5.8 does not support redirections
+# with multi-digit file descriptors.
+m4_define([GL_TMP_FD], 9)
+
+# gl_SILENT(command)
+# executes command, but without the normal configure output.
+# This is useful when you want to invoke AC_CACHE_CHECK (or AC_CHECK_FUNC etc.)
+# inside another AC_CACHE_CHECK.
+AC_DEFUN([gl_SILENT],
+[
+  exec GL_TMP_FD>&AS_MESSAGE_FD AS_MESSAGE_FD>/dev/null
+  $1
+  exec AS_MESSAGE_FD>&GL_TMP_FD GL_TMP_FD>&-
+])
+
 # gl_CACHE_VAL_SILENT(cache-id, command-to-set-it)
 # is like AC_CACHE_VAL(cache-id, command-to-set-it), except that it does not
 # output a spurious "(cached)" mark in the midst of other configure output.
@@ -447,12 +808,143 @@
 # by an AC_MSG_CHECKING/AC_MSG_RESULT pair.
 AC_DEFUN([gl_CACHE_VAL_SILENT],
 [
-  saved_as_echo_n="$as_echo_n"
-  as_echo_n=':'
-  AC_CACHE_VAL([$1], [$2])
-  as_echo_n="$saved_as_echo_n"
+  gl_SILENT([
+    AC_CACHE_VAL([$1], [$2])
+  ])
 ])
 
-# AS_VAR_COPY was added in autoconf 2.63b
-m4_define_default([AS_VAR_COPY],
-[AS_LITERAL_IF([$1[]$2], [$1=$$2], [eval $1=\$$2])])
+# gl_CC_ALLOW_WARNINGS
+# sets and substitutes a variable GL_CFLAG_ALLOW_WARNINGS, to a $(CC) option
+# that reverts a preceding '-Werror' option, if available.
+# This is expected to be '-Wno-error' on gcc, clang (except clang/MSVC), xlclang
+# and empty otherwise.
+AC_DEFUN([gl_CC_ALLOW_WARNINGS],
+[
+  AC_REQUIRE([AC_PROG_CC])
+  AC_CACHE_CHECK([for C compiler option to allow warnings],
+    [gl_cv_cc_wallow],
+    [rm -f conftest*
+     echo 'int dummy;' > conftest.c
+     AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c 2>conftest1.err]) >/dev/null
+     AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -Wno-error -c conftest.c 2>conftest2.err]) >/dev/null
+     dnl Test the number of error output lines, because AIX xlc accepts the
+     dnl option '-Wno-error', just to produce a warning
+     dnl "Option -Wno-error was incorrectly specified. The option will be ignored."
+     dnl afterwards.
+     if test $? = 0 && test `wc -l < conftest1.err` = `wc -l < conftest2.err`; then
+       gl_cv_cc_wallow='-Wno-error'
+     else
+       gl_cv_cc_wallow=none
+     fi
+     rm -f conftest*
+    ])
+  case "$gl_cv_cc_wallow" in
+    none) GL_CFLAG_ALLOW_WARNINGS='' ;;
+    *)    GL_CFLAG_ALLOW_WARNINGS="$gl_cv_cc_wallow" ;;
+  esac
+  AC_SUBST([GL_CFLAG_ALLOW_WARNINGS])
+])
+
+# gl_CXX_ALLOW_WARNINGS
+# sets and substitutes a variable GL_CXXFLAG_ALLOW_WARNINGS, to a $(CC) option
+# that reverts a preceding '-Werror' option, if available.
+AC_DEFUN([gl_CXX_ALLOW_WARNINGS],
+[
+  dnl Requires AC_PROG_CXX or gl_PROG_ANSI_CXX.
+  if test -n "$CXX" && test "$CXX" != no; then
+    AC_CACHE_CHECK([for C++ compiler option to allow warnings],
+      [gl_cv_cxx_wallow],
+      [rm -f conftest*
+       echo 'int dummy;' > conftest.cc
+       AC_TRY_COMMAND([${CXX-c++} $CXXFLAGS $CPPFLAGS -c conftest.cc 2>conftest1.err]) >/dev/null
+       AC_TRY_COMMAND([${CXX-c++} $CXXFLAGS $CPPFLAGS -Wno-error -c conftest.cc 2>conftest2.err]) >/dev/null
+       dnl Test the number of error output lines, because AIX xlC accepts the
+       dnl option '-Wno-error', just to produce a warning
+       dnl "Option -Wno-error was incorrectly specified. The option will be ignored."
+       dnl afterwards.
+       if test $? = 0 && test `wc -l < conftest1.err` = `wc -l < conftest2.err`; then
+         gl_cv_cxx_wallow='-Wno-error'
+       else
+         gl_cv_cxx_wallow=none
+       fi
+       rm -f conftest*
+      ])
+    case "$gl_cv_cxx_wallow" in
+      none) GL_CXXFLAG_ALLOW_WARNINGS='' ;;
+      *)    GL_CXXFLAG_ALLOW_WARNINGS="$gl_cv_cxx_wallow" ;;
+    esac
+  else
+    GL_CXXFLAG_ALLOW_WARNINGS=''
+  fi
+  AC_SUBST([GL_CXXFLAG_ALLOW_WARNINGS])
+])
+
+dnl Expands to some code for use in .c programs that, on native Windows, defines
+dnl the Microsoft deprecated alias function names to the underscore-prefixed
+dnl actual function names. With this macro, these function names are available
+dnl without linking with '-loldnames' and without generating warnings.
+dnl Usage: Use it after all system header files are included.
+dnl          #include <...>
+dnl          #include <...>
+dnl          ]GL_MDA_DEFINES[
+dnl          ...
+AC_DEFUN([GL_MDA_DEFINES],[
+AC_REQUIRE([_GL_MDA_DEFINES])
+[$gl_mda_defines]
+])
+AC_DEFUN([_GL_MDA_DEFINES],
+[gl_mda_defines='
+#if defined _WIN32 && !defined __CYGWIN__
+#define access    _access
+#define chdir     _chdir
+#define chmod     _chmod
+#define close     _close
+#define creat     _creat
+#define dup       _dup
+#define dup2      _dup2
+#define ecvt      _ecvt
+#define execl     _execl
+#define execle    _execle
+#define execlp    _execlp
+#define execv     _execv
+#define execve    _execve
+#define execvp    _execvp
+#define execvpe   _execvpe
+#define fcloseall _fcloseall
+#define fcvt      _fcvt
+#define fdopen    _fdopen
+#define fileno    _fileno
+#define gcvt      _gcvt
+#define getcwd    _getcwd
+#define getpid    _getpid
+#define getw      _getw
+#define isatty    _isatty
+#define j0        _j0
+#define j1        _j1
+#define jn        _jn
+#define lfind     _lfind
+#define lsearch   _lsearch
+#define lseek     _lseek
+#define memccpy   _memccpy
+#define mkdir     _mkdir
+#define mktemp    _mktemp
+#define open      _open
+#define putenv    _putenv
+#define putw      _putw
+#define read      _read
+#define rmdir     _rmdir
+#define strdup    _strdup
+#define swab      _swab
+#define tempnam   _tempnam
+#define tzset     _tzset
+#define umask     _umask
+#define unlink    _unlink
+#define utime     _utime
+#define wcsdup    _wcsdup
+#define write     _write
+#define y0        _y0
+#define y1        _y1
+#define yn        _yn
+#endif
+'
+])
diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4
index b92ae9f..62fe46e 100644
--- a/m4/gnulib-comp.m4
+++ b/m4/gnulib-comp.m4
@@ -1,5 +1,5 @@
 # DO NOT EDIT! GENERATED AUTOMATICALLY!
-# Copyright (C) 2002-2019 Free Software Foundation, Inc.
+# Copyright (C) 2002-2021 Free Software Foundation, Inc.
 #
 # This file is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -44,6 +44,7 @@
 
   AC_REQUIRE([AM_PROG_CC_C_O])
   # Code from module absolute-header:
+  # Code from module access:
   # Code from module alignof:
   # Code from module alloca-opt:
   # Code from module allocator:
@@ -53,63 +54,90 @@
   # Code from module array-list:
   # Code from module assert:
   # Code from module assure:
+  # Code from module at-internal:
+  # Code from module attribute:
+  # Code from module basename-lgpl:
   # Code from module binary-io:
   # Code from module bitrotate:
   # Code from module bitset:
   # Code from module bitsetv:
+  # Code from module builtin-expect:
   # Code from module c-ctype:
   # Code from module c-strcase:
   # Code from module c-strcaseeq:
   # Code from module c99:
+  # Code from module calloc-gnu:
   # Code from module calloc-posix:
+  # Code from module canonicalize:
   # Code from module canonicalize-lgpl:
   # Code from module careadlinkat:
   # Code from module chdir:
+  # Code from module chdir-long:
   # Code from module clock-time:
   # Code from module cloexec:
   # Code from module close:
   # Code from module close-stream:
+  # Code from module closedir:
   # Code from module closeout:
   # Code from module concat-filename:
   # Code from module config-h:
   # Code from module configmake:
+  # Code from module d-ino:
   # Code from module diffseq:
+  # Code from module dirent:
+  # Code from module dirfd:
   # Code from module dirname:
   # Code from module dirname-lgpl:
   # Code from module do-release-commit-and-tag:
-  # Code from module dosname:
   # Code from module double-slash-root:
+  # Code from module dup:
   # Code from module dup2:
+  # Code from module eloop-threshold:
   # Code from module environ:
   # Code from module errno:
   # Code from module error:
+  # Code from module execute:
   # Code from module exitfail:
   # Code from module extensions:
   # Code from module extern-inline:
   # Code from module fatal-signal:
+  # Code from module fchdir:
   # Code from module fcntl:
   # Code from module fcntl-h:
   # Code from module fd-hook:
   # Code from module fd-safer-flag:
   # Code from module fdl:
+  # Code from module fdopendir:
+  # Code from module ffs:
+  # Code from module ffsl:
+  # Code from module file-set:
   # Code from module filename:
+  # Code from module filenamecat-lgpl:
+  # Code from module findprog-in:
   # Code from module float:
   # Code from module fopen:
+  # Code from module fopen-gnu:
   # Code from module fopen-safer:
   # Code from module fpending:
   # Code from module fpieee:
   AC_REQUIRE([gl_FP_IEEE])
   # Code from module fprintf-posix:
   # Code from module fpucw:
+  # Code from module free-posix:
   # Code from module frexp-nolibm:
   # Code from module frexpl-nolibm:
   # Code from module fseterr:
   # Code from module fstat:
+  # Code from module fstatat:
   # Code from module fstrcmp:
   # Code from module fsync:
   # Code from module gendocs:
+  # Code from module getcwd:
+  # Code from module getcwd-lgpl:
+  # Code from module getdelim:
   # Code from module getdtablesize:
   # Code from module gethrxtime:
+  # Code from module getline:
   # Code from module getopt-gnu:
   # Code from module getopt-posix:
   # Code from module getprogname:
@@ -122,11 +150,23 @@
   # Code from module gnu-web-doc-update:
   # Code from module gnumakefile:
   # Code from module gnupload:
+  # Code from module gperf:
   # Code from module gpl-3.0:
   # Code from module hard-locale:
   # Code from module hash:
+  # Code from module hash-map:
+  # Code from module hash-pjw:
+  # Code from module hash-triple-simple:
   # Code from module havelib:
+  # Code from module ialloc:
+  # Code from module iconv:
+  # Code from module iconv-h:
+  # Code from module iconv_open:
+  # Code from module idx:
   # Code from module include_next:
+  # Code from module inline:
+  # Code from module integer_length:
+  # Code from module integer_length_l:
   # Code from module intprops:
   # Code from module inttypes:
   # Code from module inttypes-incomplete:
@@ -138,25 +178,30 @@
   # Code from module isnanl:
   # Code from module isnanl-nolibm:
   # Code from module iswblank:
+  # Code from module iswdigit:
+  # Code from module iswxdigit:
   # Code from module javacomp-script:
   # Code from module javaexec-script:
   # Code from module largefile:
   AC_REQUIRE([AC_SYS_LARGEFILE])
+  AC_REQUIRE([gl_YEAR2038_EARLY])
   # Code from module ldexp:
   # Code from module ldexpl:
   # Code from module libc-config:
   # Code from module libtextstyle:
   # Code from module libtextstyle-optional:
   # Code from module limits-h:
+  # Code from module linked-list:
   # Code from module list:
   # Code from module localcharset:
-  # Code from module localtime-buffer:
+  # Code from module locale:
   # Code from module lock:
   # Code from module lstat:
   # Code from module maintainer-makefile:
   # Code from module malloc-gnu:
   # Code from module malloc-posix:
   # Code from module malloca:
+  # Code from module map:
   # Code from module math:
   # Code from module mbchar:
   # Code from module mbfile:
@@ -164,6 +209,8 @@
   # Code from module mbsinit:
   # Code from module mbswidth:
   # Code from module memchr:
+  # Code from module mempcpy:
+  # Code from module memrchr:
   # Code from module minmax:
   # Code from module msvc-inval:
   # Code from module msvc-nothrow:
@@ -173,11 +220,19 @@
   # Code from module obstack:
   # Code from module obstack-printf:
   # Code from module open:
+  # Code from module openat:
+  # Code from module openat-die:
+  # Code from module openat-h:
+  # Code from module opendir:
+  # Code from module oset:
   # Code from module pathmax:
   # Code from module perror:
+  # Code from module pipe-posix:
   # Code from module pipe2:
   # Code from module pipe2-safer:
+  # Code from module posix_spawn:
   # Code from module posix_spawn-internal:
+  # Code from module posix_spawn_file_actions_addchdir:
   # Code from module posix_spawn_file_actions_addclose:
   # Code from module posix_spawn_file_actions_adddup2:
   # Code from module posix_spawn_file_actions_addopen:
@@ -186,6 +241,7 @@
   # Code from module posix_spawnattr_destroy:
   # Code from module posix_spawnattr_init:
   # Code from module posix_spawnattr_setflags:
+  # Code from module posix_spawnattr_setpgroup:
   # Code from module posix_spawnattr_setsigmask:
   # Code from module posix_spawnp:
   # Code from module printf-frexp:
@@ -198,16 +254,27 @@
   # Code from module quotearg-simple:
   # Code from module raise:
   # Code from module rawmemchr:
+  # Code from module rbtree-oset:
+  # Code from module rbtreehash-list:
+  # Code from module readdir:
+  # Code from module readline:
   # Code from module readlink:
   # Code from module readme-release:
+  # Code from module realloc-gnu:
   # Code from module realloc-posix:
+  # Code from module reallocarray:
   # Code from module relocatable-prog:
   # Code from module relocatable-prog-wrapper:
+  AC_REQUIRE([AC_SYS_LARGEFILE])
   # Code from module relocatable-script:
   # Code from module rename:
+  # Code from module rewinddir:
   # Code from module rmdir:
   # Code from module same-inode:
+  # Code from module save-cwd:
   # Code from module sched:
+  # Code from module scratch_buffer:
+  # Code from module setlocale-null:
   # Code from module sh-filename:
   # Code from module sigaction:
   # Code from module signal-h:
@@ -227,12 +294,14 @@
   # Code from module stat:
   # Code from module stat-time:
   # Code from module std-gnu11:
+  # Code from module stdalign:
   # Code from module stdbool:
   # Code from module stddef:
   # Code from module stdint:
   # Code from module stdio:
   # Code from module stdlib:
   # Code from module stpcpy:
+  # Code from module stpncpy:
   # Code from module strchrnul:
   # Code from module strdup-posix:
   # Code from module streq:
@@ -240,28 +309,38 @@
   # Code from module strerror-override:
   # Code from module strerror_r-posix:
   # Code from module string:
+  # Code from module strings:
   # Code from module strndup:
   # Code from module strnlen:
+  # Code from module strtod:
   # Code from module strverscmp:
+  # Code from module sys_ioctl:
   # Code from module sys_resource:
   # Code from module sys_stat:
   # Code from module sys_time:
   # Code from module sys_times:
   # Code from module sys_types:
   # Code from module sys_wait:
+  # Code from module termios:
+  # Code from module thread-optim:
   # Code from module threadlib:
   gl_THREADLIB_EARLY
   # Code from module time:
   # Code from module timespec:
   # Code from module timevar:
   # Code from module tls:
+  # Code from module unicodeio:
   # Code from module unistd:
   # Code from module unistd-safer:
+  # Code from module unistr/base:
+  # Code from module unistr/u8-mbtoucr:
+  # Code from module unistr/u8-uctomb:
   # Code from module unitypes:
   # Code from module uniwidth/base:
   # Code from module uniwidth/width:
   # Code from module unlink:
   # Code from module unlocked-io:
+  # Code from module unlocked-io-internal:
   # Code from module unsetenv:
   # Code from module update-copyright:
   # Code from module useless-if-before-free:
@@ -284,6 +363,7 @@
   # Code from module windows-once:
   # Code from module windows-recmutex:
   # Code from module windows-rwlock:
+  # Code from module windows-spawn:
   # Code from module windows-tls:
   # Code from module winsz-ioctl:
   # Code from module winsz-termios:
@@ -293,6 +373,7 @@
   # Code from module xconcat-filename:
   # Code from module xhash:
   # Code from module xlist:
+  # Code from module xmap:
   # Code from module xmemdup0:
   # Code from module xreadlink:
   # Code from module xsize:
@@ -313,15 +394,32 @@
   m4_pushdef([AC_LIBSOURCES], m4_defn([gl_LIBSOURCES]))
   m4_pushdef([gl_LIBSOURCES_LIST], [])
   m4_pushdef([gl_LIBSOURCES_DIR], [])
+  m4_pushdef([GL_MACRO_PREFIX], [gl])
+  m4_pushdef([GL_MODULE_INDICATOR_PREFIX], [GL])
   gl_COMMON
   gl_source_base='lib'
+  gl_FUNC_ACCESS
+  if test $REPLACE_ACCESS = 1; then
+    AC_LIBOBJ([access])
+  fi
+  gl_UNISTD_MODULE_INDICATOR([access])
   gl_FUNC_ALLOCA
   gl_ASSERT
+  AC_REQUIRE([AC_C_INLINE])
+  gl___BUILTIN_EXPECT
+  gl_FUNC_CALLOC_GNU
+  if test $REPLACE_CALLOC = 1; then
+    AC_LIBOBJ([calloc])
+  fi
   gl_FUNC_CALLOC_POSIX
   if test $REPLACE_CALLOC = 1; then
     AC_LIBOBJ([calloc])
   fi
   gl_STDLIB_MODULE_INDICATOR([calloc-posix])
+  gl_FUNC_CANONICALIZE_FILENAME_MODE
+  gl_MODULE_INDICATOR([canonicalize])
+  gl_MODULE_INDICATOR_FOR_TESTS([canonicalize])
+  gl_STDLIB_MODULE_INDICATOR([canonicalize_file_name])
   gl_CANONICALIZE_LGPL
   if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then
     AC_LIBOBJ([canonicalize-lgpl])
@@ -329,6 +427,7 @@
   gl_MODULE_INDICATOR([canonicalize-lgpl])
   gl_STDLIB_MODULE_INDICATOR([canonicalize_file_name])
   gl_STDLIB_MODULE_INDICATOR([realpath])
+  AC_REQUIRE([AC_C_RESTRICT])
   AC_CHECK_FUNCS_ONCE([readlinkat])
   gl_CLOCK_TIME
   gl_MODULE_INDICATOR_FOR_TESTS([cloexec])
@@ -340,12 +439,10 @@
   gl_MODULE_INDICATOR([close-stream])
   gl_CONFIG_H
   gl_CONFIGMAKE_PREP
-  gl_DIRNAME
   gl_MODULE_INDICATOR([dirname])
-  gl_DIRNAME_LGPL
   gl_DOUBLE_SLASH_ROOT
   gl_FUNC_DUP2
-  if test $HAVE_DUP2 = 0 || test $REPLACE_DUP2 = 1; then
+  if test $REPLACE_DUP2 = 1; then
     AC_LIBOBJ([dup2])
     gl_PREREQ_DUP2
   fi
@@ -354,13 +451,14 @@
   gl_UNISTD_MODULE_INDICATOR([environ])
   gl_HEADER_ERRNO_H
   gl_ERROR
-  if test $ac_cv_lib_error_at_line = no; then
+  AS_IF([test "$ac_cv_lib_error_at_line" = no], [
     AC_LIBOBJ([error])
     gl_PREREQ_ERROR
-  fi
+  ])
   m4_ifdef([AM_XGETTEXT_OPTION],
     [AM_][XGETTEXT_OPTION([--flag=error:3:c-format])
      AM_][XGETTEXT_OPTION([--flag=error_at_line:5:c-format])])
+  gl_EXECUTE
   AC_REQUIRE([gl_EXTERN_INLINE])
   gl_FATAL_SIGNAL
   gl_FUNC_FCNTL
@@ -369,7 +467,14 @@
   fi
   gl_FCNTL_MODULE_INDICATOR([fcntl])
   gl_FCNTL_H
+  gl_FCNTL_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR([fd-safer-flag])
+  gl_FUNC_FFSL
+  if test $HAVE_FFSL = 0; then
+    AC_LIBOBJ([ffsl])
+  fi
+  gl_STRING_MODULE_INDICATOR([ffsl])
+  gl_FINDPROG_IN
   gl_FLOAT_H
   if test $REPLACE_FLOAT_LDBL = 1; then
     AC_LIBOBJ([float])
@@ -383,6 +488,12 @@
     gl_PREREQ_FOPEN
   fi
   gl_STDIO_MODULE_INDICATOR([fopen])
+  gl_FUNC_FOPEN_GNU
+  if test $REPLACE_FOPEN = 1; then
+    AC_LIBOBJ([fopen])
+    gl_PREREQ_FOPEN
+  fi
+  gl_MODULE_INDICATOR([fopen-gnu])
   gl_MODULE_INDICATOR([fopen-safer])
   gl_FUNC_FPENDING
   if test $gl_cv_func___fpending = no; then
@@ -390,6 +501,12 @@
   fi
   gl_FUNC_FPRINTF_POSIX
   gl_STDIO_MODULE_INDICATOR([fprintf-posix])
+  gl_FUNC_FREE
+  if test $REPLACE_FREE = 1; then
+    AC_LIBOBJ([free])
+    gl_PREREQ_FREE
+  fi
+  gl_STDLIB_MODULE_INDICATOR([free-posix])
   gl_FUNC_FREXP_NO_LIBM
   if test $gl_func_frexp_no_libm != yes; then
     AC_LIBOBJ([frexp])
@@ -406,6 +523,13 @@
     gl_PREREQ_FSYNC
   fi
   gl_UNISTD_MODULE_INDICATOR([fsync])
+  gl_FUNC_GETCWD
+  if test $REPLACE_GETCWD = 1; then
+    AC_LIBOBJ([getcwd])
+    gl_PREREQ_GETCWD
+  fi
+  gl_MODULE_INDICATOR([getcwd])
+  gl_UNISTD_MODULE_INDICATOR([getcwd])
   gl_GETHRXTIME
   gl_FUNC_GETOPT_GNU
   dnl Because of the way gl_FUNC_GETOPT_GNU is implemented (the gl_getopt_required
@@ -415,10 +539,11 @@
   if test $REPLACE_GETOPT = 1; then
     AC_LIBOBJ([getopt])
     AC_LIBOBJ([getopt1])
-    dnl Arrange for unistd.h to include getopt.h.
-    GNULIB_GL_UNISTD_H_GETOPT=1
+    dnl Define the substituted variable GNULIB_UNISTD_H_GETOPT to 1.
+    gl_UNISTD_H_REQUIRE_DEFAULTS
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNISTD_H_GETOPT], [1])
   fi
-  AC_SUBST([GNULIB_GL_UNISTD_H_GETOPT])
+  gl_UNISTD_MODULE_INDICATOR([getopt-posix])
   gl_FUNC_GETPROGNAME
   gl_FUNC_GETRUSAGE
   if test $HAVE_GETRUSAGE = 0; then
@@ -444,8 +569,25 @@
           m4_defn([m4_PACKAGE_VERSION])), [1], [],
         [AC_CONFIG_LINKS([$GNUmakefile:$GNUmakefile], [],
           [GNUmakefile=$GNUmakefile])])
+  AC_DEFUN([gl_HAVE_MODULE_HAVELIB])
+  AM_ICONV
+  m4_ifdef([gl_ICONV_MODULE_INDICATOR],
+    [gl_ICONV_MODULE_INDICATOR([iconv])])
+  gl_ICONV_H
+  gl_ICONV_H_REQUIRE_DEFAULTS
+  gl_FUNC_ICONV_OPEN
+  if test $REPLACE_ICONV_OPEN = 1; then
+    AC_LIBOBJ([iconv_open])
+  fi
+  if test $REPLACE_ICONV = 1; then
+    AC_LIBOBJ([iconv])
+    AC_LIBOBJ([iconv_close])
+  fi
+  gl_INLINE
+  AC_REQUIRE([gl_DOUBLE_EXPONENT_LOCATION])
   gl_INTTYPES_H
   gl_INTTYPES_INCOMPLETE
+  gl_INTTYPES_H_REQUIRE_DEFAULTS
   gl_ISNAN
   gl_MATH_MODULE_INDICATOR([isnan])
   gl_FUNC_ISNAND
@@ -494,6 +636,24 @@
     fi
   fi
   gl_WCTYPE_MODULE_INDICATOR([iswblank])
+  gl_FUNC_ISWDIGIT
+  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+    :
+  else
+    if test $REPLACE_ISWDIGIT = 1; then
+      AC_LIBOBJ([iswdigit])
+    fi
+  fi
+  gl_WCTYPE_MODULE_INDICATOR([iswdigit])
+  gl_FUNC_ISWXDIGIT
+  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+    :
+  else
+    if test $REPLACE_ISWXDIGIT = 1; then
+      AC_LIBOBJ([iswxdigit])
+    fi
+  fi
+  gl_WCTYPE_MODULE_INDICATOR([iswxdigit])
   # You need to invoke gt_JAVACOMP yourself, possibly with arguments.
   AC_CONFIG_FILES([javacomp.sh:build-aux/javacomp.sh.in])
   # You need to invoke gt_JAVAEXEC yourself, possibly with arguments.
@@ -504,8 +664,9 @@
     AC_LIBOBJ([ldexpl])
   fi
   gl_MATH_MODULE_INDICATOR([ldexpl])
-  gl_LIBTEXTSTYLE
-  gl_LIBTEXTSTYLE_OPTIONAL
+  gl___INLINE
+  # You need to invoke gl_LIBTEXTSTYLE yourself, possibly with arguments.
+  # You need to invoke gl_LIBTEXTSTYLE_OPTIONAL yourself, possibly with arguments.
   gl_LIMITS_H
   gl_LOCALCHARSET
   dnl For backward compatibility. Some packages still use this.
@@ -521,18 +682,23 @@
   if test $REPLACE_MALLOC = 1; then
     AC_LIBOBJ([malloc])
   fi
-  gl_MODULE_INDICATOR([malloc-gnu])
-  gl_FUNC_MALLOC_POSIX
+  AC_REQUIRE([gl_FUNC_MALLOC_POSIX])
   if test $REPLACE_MALLOC = 1; then
     AC_LIBOBJ([malloc])
   fi
   gl_STDLIB_MODULE_INDICATOR([malloc-posix])
   gl_MATH_H
+  gl_MATH_H_REQUIRE_DEFAULTS
   gl_MBCHAR
   gl_MBFILE
   gl_FUNC_MBRTOWC
   if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then
     AC_LIBOBJ([mbrtowc])
+    if test $REPLACE_MBSTATE_T = 1; then
+      AC_LIBOBJ([lc-charset-dispatch])
+      AC_LIBOBJ([mbtowc-lock])
+      gl_PREREQ_MBTOWC_LOCK
+    fi
     gl_PREREQ_MBRTOWC
   fi
   gl_WCHAR_MODULE_INDICATOR([mbrtowc])
@@ -544,11 +710,17 @@
   gl_WCHAR_MODULE_INDICATOR([mbsinit])
   gl_MBSWIDTH
   gl_FUNC_MEMCHR
-  if test $HAVE_MEMCHR = 0 || test $REPLACE_MEMCHR = 1; then
+  if test $REPLACE_MEMCHR = 1; then
     AC_LIBOBJ([memchr])
     gl_PREREQ_MEMCHR
   fi
   gl_STRING_MODULE_INDICATOR([memchr])
+  gl_FUNC_MEMPCPY
+  if test $HAVE_MEMPCPY = 0; then
+    AC_LIBOBJ([mempcpy])
+    gl_PREREQ_MEMPCPY
+  fi
+  gl_STRING_MODULE_INDICATOR([mempcpy])
   gl_MINMAX
   AC_REQUIRE([gl_MSVC_INVAL])
   if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
@@ -587,9 +759,24 @@
     AC_LIBOBJ([perror])
   fi
   gl_STRING_MODULE_INDICATOR([perror])
+  gl_FUNC_PIPE
+  if test $HAVE_PIPE = 0; then
+    AC_LIBOBJ([pipe])
+  fi
+  gl_UNISTD_MODULE_INDICATOR([pipe])
   gl_FUNC_PIPE2
   gl_UNISTD_MODULE_INDICATOR([pipe2])
   gl_MODULE_INDICATOR([pipe2-safer])
+  gl_POSIX_SPAWN
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+    AC_LIBOBJ([spawn])
+  fi
+  gl_SPAWN_MODULE_INDICATOR([posix_spawn])
+  gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = 0 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = 1; then
+    AC_LIBOBJ([spawn_faction_addchdir])
+  fi
+  gl_SPAWN_MODULE_INDICATOR([posix_spawn_file_actions_addchdir])
   gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE
   if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = 1; then
     AC_LIBOBJ([spawn_faction_addclose])
@@ -632,6 +819,11 @@
   gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_setflags])
   gl_POSIX_SPAWN
   if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+    AC_LIBOBJ([spawnattr_setpgroup])
+  fi
+  gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_setpgroup])
+  gl_POSIX_SPAWN
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
     AC_LIBOBJ([spawnattr_setsigmask])
   fi
   gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_setsigmask])
@@ -655,24 +847,53 @@
     gl_PREREQ_RAISE
   fi
   gl_SIGNAL_MODULE_INDICATOR([raise])
+  gl_FUNC_RAWMEMCHR
+  if test $HAVE_RAWMEMCHR = 0; then
+    AC_LIBOBJ([rawmemchr])
+    gl_PREREQ_RAWMEMCHR
+  fi
+  gl_STRING_MODULE_INDICATOR([rawmemchr])
+  AC_REQUIRE([AC_C_INLINE])
+  gl_FUNC_READLINE
+  if test "$gl_cv_lib_readline" = no; then
+    AC_LIBOBJ([readline])
+    gl_PREREQ_READLINE
+  fi
   gl_FUNC_READLINK
   if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then
     AC_LIBOBJ([readlink])
     gl_PREREQ_READLINK
   fi
   gl_UNISTD_MODULE_INDICATOR([readlink])
+  gl_FUNC_REALLOC_GNU
+  if test $REPLACE_REALLOC = 1; then
+    AC_LIBOBJ([realloc])
+  fi
   gl_FUNC_REALLOC_POSIX
   if test $REPLACE_REALLOC = 1; then
     AC_LIBOBJ([realloc])
   fi
   gl_STDLIB_MODULE_INDICATOR([realloc-posix])
+  gl_FUNC_REALLOCARRAY
+  if test $HAVE_REALLOCARRAY = 0 || test $REPLACE_REALLOCARRAY = 1; then
+    AC_LIBOBJ([reallocarray])
+    gl_PREREQ_REALLOCARRAY
+  fi
+  gl_MODULE_INDICATOR([reallocarray])
+  gl_STDLIB_MODULE_INDICATOR([reallocarray])
   gl_RELOCATABLE([$gl_source_base])
   if test $RELOCATABLE = yes; then
     AC_LIBOBJ([progreloc])
     AC_LIBOBJ([relocatable])
   fi
+  AC_REQUIRE([AC_C_RESTRICT])
   gl_FUNC_READLINK_SEPARATE
   gl_CANONICALIZE_LGPL_SEPARATE
+  gl_FUNC_MALLOC_POSIX
+  gl_FUNC_REALLOC_POSIX
+  gl_FUNC_FREE
+  gl_FUNC_MEMPCPY
+  gl_FUNC_RAWMEMCHR
   gl_MALLOCA
   gl_RELOCATABLE_LIBRARY
   gl_FUNC_SETENV_SEPARATE
@@ -685,6 +906,8 @@
   fi
   gl_STDIO_MODULE_INDICATOR([rename])
   gl_SCHED_H
+  gl_SCHED_H_REQUIRE_DEFAULTS
+  AC_PROG_MKDIR_P
   gl_SIGACTION
   if test $HAVE_SIGACTION = 0; then
     AC_LIBOBJ([sigaction])
@@ -692,6 +915,7 @@
   fi
   gl_SIGNAL_MODULE_INDICATOR([sigaction])
   gl_SIGNAL_H
+  gl_SIGNAL_H_REQUIRE_DEFAULTS
   gl_SIGNBIT
   if test $REPLACE_SIGNBIT = 1; then
     AC_LIBOBJ([signbitf])
@@ -711,23 +935,74 @@
   gl_MODULE_INDICATOR([snprintf])
   gl_FUNC_SNPRINTF_POSIX
   gl_SPAWN_H
+  gl_SPAWN_H_REQUIRE_DEFAULTS
   gl_SPAWN_PIPE
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  case "$host_os" in
+    os2*)
+      AC_LIBOBJ([os2-spawn])
+      ;;
+  esac
   gl_FUNC_SPRINTF_POSIX
   gl_STDIO_MODULE_INDICATOR([sprintf-posix])
   gt_TYPE_SSIZE_T
+  gl_FUNC_STAT
+  if test $REPLACE_STAT = 1; then
+    AC_LIBOBJ([stat])
+    case "$host_os" in
+      mingw*)
+        AC_LIBOBJ([stat-w32])
+        ;;
+    esac
+    gl_PREREQ_STAT
+  fi
+  gl_SYS_STAT_MODULE_INDICATOR([stat])
+  gl_STDALIGN_H
   AM_STDBOOL_H
   gl_STDDEF_H
+  gl_STDDEF_H_REQUIRE_DEFAULTS
   gl_STDINT_H
   gl_STDIO_H
+  gl_STDIO_H_REQUIRE_DEFAULTS
+  dnl No need to create extra modules for these functions. Everyone who uses
+  dnl <stdio.h> likely needs them.
+  gl_STDIO_MODULE_INDICATOR([fscanf])
+  gl_MODULE_INDICATOR([fscanf])
+  gl_STDIO_MODULE_INDICATOR([scanf])
+  gl_MODULE_INDICATOR([scanf])
+  gl_STDIO_MODULE_INDICATOR([fgetc])
+  gl_STDIO_MODULE_INDICATOR([getc])
+  gl_STDIO_MODULE_INDICATOR([getchar])
+  gl_STDIO_MODULE_INDICATOR([fgets])
+  gl_STDIO_MODULE_INDICATOR([fread])
+  dnl No need to create extra modules for these functions. Everyone who uses
+  dnl <stdio.h> likely needs them.
+  gl_STDIO_MODULE_INDICATOR([fprintf])
+  gl_STDIO_MODULE_INDICATOR([printf])
+  gl_STDIO_MODULE_INDICATOR([vfprintf])
+  gl_STDIO_MODULE_INDICATOR([vprintf])
+  gl_STDIO_MODULE_INDICATOR([fputc])
+  gl_STDIO_MODULE_INDICATOR([putc])
+  gl_STDIO_MODULE_INDICATOR([putchar])
+  gl_STDIO_MODULE_INDICATOR([fputs])
+  gl_STDIO_MODULE_INDICATOR([puts])
+  gl_STDIO_MODULE_INDICATOR([fwrite])
   gl_STDLIB_H
+  gl_STDLIB_H_REQUIRE_DEFAULTS
   gl_FUNC_STPCPY
   if test $HAVE_STPCPY = 0; then
     AC_LIBOBJ([stpcpy])
     gl_PREREQ_STPCPY
   fi
   gl_STRING_MODULE_INDICATOR([stpcpy])
+  gl_FUNC_STPNCPY
+  if test $HAVE_STPNCPY = 0 || test $REPLACE_STPNCPY = 1; then
+    AC_LIBOBJ([stpncpy])
+    gl_PREREQ_STPNCPY
+  fi
+  gl_STRING_MODULE_INDICATOR([stpncpy])
   gl_FUNC_STRDUP_POSIX
-  if test $ac_cv_func_strdup = no || test $REPLACE_STRDUP = 1; then
+  if test $REPLACE_STRDUP = 1; then
     AC_LIBOBJ([strdup])
     gl_PREREQ_STRDUP
   fi
@@ -738,42 +1013,96 @@
   fi
   gl_MODULE_INDICATOR([strerror])
   gl_STRING_MODULE_INDICATOR([strerror])
-  gl_HEADER_STRING_H
+  gl_STRING_H
+  gl_STRING_H_REQUIRE_DEFAULTS
   gl_FUNC_STRNDUP
   if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then
     AC_LIBOBJ([strndup])
   fi
   gl_STRING_MODULE_INDICATOR([strndup])
+  gl_FUNC_STRTOD
+  if test $HAVE_STRTOD = 0 || test $REPLACE_STRTOD = 1; then
+    AC_LIBOBJ([strtod])
+    gl_PREREQ_STRTOD
+  fi
+  gl_STDLIB_MODULE_INDICATOR([strtod])
   gl_FUNC_STRVERSCMP
   if test $HAVE_STRVERSCMP = 0; then
     AC_LIBOBJ([strverscmp])
     gl_PREREQ_STRVERSCMP
   fi
   gl_STRING_MODULE_INDICATOR([strverscmp])
-  gl_HEADER_SYS_RESOURCE
+  gl_SYS_IOCTL_H
+  gl_SYS_IOCTL_H_REQUIRE_DEFAULTS
   AC_PROG_MKDIR_P
-  gl_HEADER_SYS_TIME_H
+  gl_SYS_RESOURCE_H
+  gl_SYS_RESOURCE_H_REQUIRE_DEFAULTS
+  AC_PROG_MKDIR_P
+  gl_SYS_STAT_H
+  gl_SYS_STAT_H_REQUIRE_DEFAULTS
+  AC_PROG_MKDIR_P
+  gl_SYS_TIME_H
+  gl_SYS_TIME_H_REQUIRE_DEFAULTS
   AC_PROG_MKDIR_P
   gl_SYS_TIMES_H
+  gl_SYS_TIMES_H_REQUIRE_DEFAULTS
   AC_PROG_MKDIR_P
   gl_SYS_TYPES_H
+  gl_SYS_TYPES_H_REQUIRE_DEFAULTS
   AC_PROG_MKDIR_P
   gl_SYS_WAIT_H
+  gl_SYS_WAIT_H_REQUIRE_DEFAULTS
   AC_PROG_MKDIR_P
+  gl_TERMIOS_H
+  gl_TERMIOS_H_REQUIRE_DEFAULTS
+  AC_CHECK_HEADERS([sys/single_threaded.h])
   AC_REQUIRE([gl_THREADLIB])
-  gl_HEADER_TIME_H
+  gl_TIME_H
+  gl_TIME_H_REQUIRE_DEFAULTS
   gl_TIMESPEC
   gl_TLS
+  gl_UNICODEIO
   gl_UNISTD_H
+  gl_UNISTD_H_REQUIRE_DEFAULTS
   gl_UNISTD_SAFER
-  gl_LIBUNISTRING_LIBHEADER([0.9.4], [unitypes.h])
-  gl_LIBUNISTRING_LIBHEADER([0.9.4], [uniwidth.h])
+  gl_LIBUNISTRING_LIBHEADER([0.9.11], [unistr.h])
+  gl_MODULE_INDICATOR([unistr/u8-mbtoucr])
+  gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-mbtoucr])
+  gl_MODULE_INDICATOR([unistr/u8-uctomb])
+  gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-uctomb])
+  gl_LIBUNISTRING_LIBHEADER([0.9.11], [unitypes.h])
+  AH_VERBATIM([unitypes_restrict], [
+  /* This definition is a duplicate of the one in unitypes.h.
+     It is here so that we can cope with an older version of unitypes.h
+     that does not contain this definition and that is pre-installed among
+     the public header files.  */
+  # if defined __restrict \
+       || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+       || __clang_major__ >= 3
+  #  define _UC_RESTRICT __restrict
+  # elif 199901L <= __STDC_VERSION__ || defined restrict
+  #  define _UC_RESTRICT restrict
+  # else
+  #  define _UC_RESTRICT
+  # endif
+  ])
+  gl_LIBUNISTRING_LIBHEADER([0.9.11], [uniwidth.h])
   gl_LIBUNISTRING_MODULE([0.9.8], [uniwidth/width])
   gl_FUNC_UNLINK
   if test $REPLACE_UNLINK = 1; then
     AC_LIBOBJ([unlink])
   fi
   gl_UNISTD_MODULE_INDICATOR([unlink])
+  AC_DEFINE([GNULIB_STDIO_SINGLE_THREAD], [1],
+    [Define to 1 if you want the FILE stream functions getc, putc, etc.
+     to use unlocked I/O if available, throughout the package.
+     Unlocked I/O can improve performance, sometimes dramatically.
+     But unlocked I/O is safe only in single-threaded programs,
+     as well as in multithreaded programs for which you can guarantee that
+     every FILE stream, including stdin, stdout, stderr, is used only
+     in a single thread.])
+  AC_DEFINE([USE_UNLOCKED_IO], [GNULIB_STDIO_SINGLE_THREAD],
+    [An alias of GNULIB_STDIO_SINGLE_THREAD.])
   gl_FUNC_GLIBC_UNLOCKED_IO
   gl_FUNC_UNSETENV
   if test $HAVE_UNSETENV = 0 || test $REPLACE_UNSETENV = 1; then
@@ -781,6 +1110,7 @@
     gl_PREREQ_UNSETENV
   fi
   gl_STDLIB_MODULE_INDICATOR([unsetenv])
+  AC_REQUIRE([AC_C_RESTRICT])
   gl_FUNC_VASNPRINTF
   gl_FUNC_VASPRINTF
   gl_STDIO_MODULE_INDICATOR([vasprintf])
@@ -800,50 +1130,86 @@
   fi
   gl_SYS_WAIT_MODULE_INDICATOR([waitpid])
   gl_WCHAR_H
+  gl_WCHAR_H_REQUIRE_DEFAULTS
   gl_WCTYPE_H
+  gl_WCTYPE_H_REQUIRE_DEFAULTS
   gl_FUNC_WCWIDTH
   if test $HAVE_WCWIDTH = 0 || test $REPLACE_WCWIDTH = 1; then
     AC_LIBOBJ([wcwidth])
     gl_PREREQ_WCWIDTH
   fi
   gl_WCHAR_MODULE_INDICATOR([wcwidth])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  case "$host_os" in
+    mingw*)
+      AC_LIBOBJ([windows-spawn])
+      ;;
+  esac
   gl_HEADER_TIOCGWINSZ_NEEDS_SYS_IOCTL
   gl_HEADER_TIOCGWINSZ_IN_TERMIOS_H
   gl_WINSIZE_IN_PTEM
   gl_XALLOC
-  AC_LIBOBJ([xmemdup0])
+  gl_MODULE_INDICATOR([xalloc])
+  gl_MODULE_INDICATOR([xalloc-die])
   gl_XSIZE
   gl_XSTRNDUP
+  gl_gnulib_enabled_260941c0e5dc67ec9e87d1fb321c300b=false
   gl_gnulib_enabled_chdir=false
+  gl_gnulib_enabled_8198daae261b932d64a998f8586f5005=false
+  gl_gnulib_enabled_closedir=false
+  gl_gnulib_enabled_75c65a2c014cf8235dd95289676302a4=false
+  gl_gnulib_enabled_dirent=false
+  gl_gnulib_enabled_dirfd=false
+  gl_gnulib_enabled_dup=false
+  gl_gnulib_enabled_fchdir=false
   gl_gnulib_enabled_43fe87a341d9b4b93c47c3ad819a5239=false
+  gl_gnulib_enabled_fdopendir=false
+  gl_gnulib_enabled_ffs=false
+  gl_gnulib_enabled_fca9852db2a43bb33f02f0fbdbc174f6=false
   gl_gnulib_enabled_fseterr=false
   gl_gnulib_enabled_fstat=false
+  gl_gnulib_enabled_fstatat=false
+  gl_gnulib_enabled_3d094ef542bfdd238a5194e172bfe5f6=false
+  gl_gnulib_enabled_getdelim=false
   gl_gnulib_enabled_getdtablesize=false
+  gl_gnulib_enabled_getline=false
   gl_gnulib_enabled_30838f5439487421042f2225bed3af76=false
   gl_gnulib_enabled_3f0e593033d1fc2c127581960f641b66=false
   gl_gnulib_enabled_ldexp=false
-  gl_gnulib_enabled_21ee726a3540c09237a8e70c0baf7467=false
-  gl_gnulib_enabled_2049e887c7e5308faad27b3f894bb8c9=false
+  gl_gnulib_enabled_locale=false
   gl_gnulib_enabled_lstat=false
   gl_gnulib_enabled_malloca=false
+  gl_gnulib_enabled_memrchr=false
+  gl_gnulib_enabled_openat=false
+  gl_gnulib_enabled_1840129d490f3a00c8a098316d0fa345=false
+  gl_gnulib_enabled_03e0aaad4cb89ca757653bd367a6ccb7=false
+  gl_gnulib_enabled_opendir=false
   gl_gnulib_enabled_332607f759618fb73dfc3076748afea7=false
-  gl_gnulib_enabled_rawmemchr=false
+  gl_gnulib_enabled_readdir=false
+  gl_gnulib_enabled_rewinddir=false
   gl_gnulib_enabled_rmdir=false
-  gl_gnulib_enabled_9bc5f216d57e231e4834049d67d0db62=false
+  gl_gnulib_enabled_d4850532688ba16d685f036076611f21=false
+  gl_gnulib_enabled_e7e881d32ca02f1c997b13c737c64bbd=false
   gl_gnulib_enabled_cdeb0f2aaf9d280baa6526bfa1b07f70=false
-  gl_gnulib_enabled_stat=false
   gl_gnulib_enabled_0137e3d3638b33e5819d132d0b23165c=false
   gl_gnulib_enabled_strchrnul=false
   gl_gnulib_enabled_dbb57f49352be8fb86869629a254fb72=false
   gl_gnulib_enabled_1f32594a85e6221ba15f884daeee8c2a=false
+  gl_gnulib_enabled_strings=false
   gl_gnulib_enabled_strnlen=false
-  gl_gnulib_enabled_sys_stat=false
   gl_gnulib_enabled_ed5616be3593d355b981ffab56b9f37b=false
   gl_gnulib_enabled_503a4cb75d69c787103d0aa2ab7d8440=false
   gl_gnulib_enabled_68a4501daeca58988392c7e60b4917ab=false
   gl_gnulib_enabled_f0efff84a70f4afba30902bb8ffe9354=false
   gl_gnulib_enabled_8bb827fe37eaccf1b97feb0c87bc92ef=false
   gl_gnulib_enabled_48b2271240803e4879464b755748a89d=false
+  func_gl_gnulib_m4code_260941c0e5dc67ec9e87d1fb321c300b ()
+  {
+    if ! $gl_gnulib_enabled_260941c0e5dc67ec9e87d1fb321c300b; then
+      AC_REQUIRE([AC_CANONICAL_HOST])
+      gl_gnulib_enabled_260941c0e5dc67ec9e87d1fb321c300b=true
+    fi
+  }
   func_gl_gnulib_m4code_chdir ()
   {
     if ! $gl_gnulib_enabled_chdir; then
@@ -851,12 +1217,171 @@
       gl_gnulib_enabled_chdir=true
     fi
   }
+  func_gl_gnulib_m4code_8198daae261b932d64a998f8586f5005 ()
+  {
+    if ! $gl_gnulib_enabled_8198daae261b932d64a998f8586f5005; then
+      gl_FUNC_CHDIR_LONG
+      if test $gl_cv_have_unlimited_file_name_length = no; then
+        AC_LIBOBJ([chdir-long])
+        gl_PREREQ_CHDIR_LONG
+      fi
+      gl_gnulib_enabled_8198daae261b932d64a998f8586f5005=true
+      func_gl_gnulib_m4code_chdir
+      if test $gl_cv_have_unlimited_file_name_length = no; then
+        func_gl_gnulib_m4code_fchdir
+      fi
+      if test $gl_cv_have_unlimited_file_name_length = no; then
+        func_gl_gnulib_m4code_memrchr
+      fi
+      if test $gl_cv_have_unlimited_file_name_length = no; then
+        func_gl_gnulib_m4code_openat
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_closedir ()
+  {
+    if ! $gl_gnulib_enabled_closedir; then
+      gl_FUNC_CLOSEDIR
+      if test $HAVE_CLOSEDIR = 0 || test $REPLACE_CLOSEDIR = 1; then
+        AC_LIBOBJ([closedir])
+      fi
+      gl_DIRENT_MODULE_INDICATOR([closedir])
+      gl_gnulib_enabled_closedir=true
+      func_gl_gnulib_m4code_dirent
+      if test $HAVE_CLOSEDIR = 0 || test $REPLACE_CLOSEDIR = 1; then
+        func_gl_gnulib_m4code_dirfd
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_75c65a2c014cf8235dd95289676302a4 ()
+  {
+    if ! $gl_gnulib_enabled_75c65a2c014cf8235dd95289676302a4; then
+      gl_CHECK_TYPE_STRUCT_DIRENT_D_INO
+      gl_gnulib_enabled_75c65a2c014cf8235dd95289676302a4=true
+    fi
+  }
+  func_gl_gnulib_m4code_dirent ()
+  {
+    if ! $gl_gnulib_enabled_dirent; then
+      gl_DIRENT_H
+      gl_DIRENT_H_REQUIRE_DEFAULTS
+      gl_gnulib_enabled_dirent=true
+    fi
+  }
+  func_gl_gnulib_m4code_dirfd ()
+  {
+    if ! $gl_gnulib_enabled_dirfd; then
+      gl_FUNC_DIRFD
+      if test $ac_cv_func_dirfd = no && test $gl_cv_func_dirfd_macro = no \
+         || test $REPLACE_DIRFD = 1; then
+        AC_LIBOBJ([dirfd])
+        gl_PREREQ_DIRFD
+      fi
+      gl_DIRENT_MODULE_INDICATOR([dirfd])
+      gl_gnulib_enabled_dirfd=true
+      func_gl_gnulib_m4code_dirent
+    fi
+  }
+  func_gl_gnulib_m4code_dup ()
+  {
+    if ! $gl_gnulib_enabled_dup; then
+      gl_FUNC_DUP
+      if test $REPLACE_DUP = 1; then
+        AC_LIBOBJ([dup])
+        gl_PREREQ_DUP
+      fi
+      gl_UNISTD_MODULE_INDICATOR([dup])
+      gl_gnulib_enabled_dup=true
+    fi
+  }
+  func_gl_gnulib_m4code_fchdir ()
+  {
+    if ! $gl_gnulib_enabled_fchdir; then
+      gl_FUNC_FCHDIR
+      gl_UNISTD_MODULE_INDICATOR([fchdir])
+      gl_gnulib_enabled_fchdir=true
+      if test $HAVE_FCHDIR = 0; then
+        func_gl_gnulib_m4code_chdir
+      fi
+      if test $HAVE_FCHDIR = 0; then
+        func_gl_gnulib_m4code_dirent
+      fi
+      if test $HAVE_FCHDIR = 0; then
+        func_gl_gnulib_m4code_dirfd
+      fi
+      if test $HAVE_FCHDIR = 0; then
+        func_gl_gnulib_m4code_fca9852db2a43bb33f02f0fbdbc174f6
+      fi
+      if test $HAVE_FCHDIR = 0; then
+        func_gl_gnulib_m4code_fstat
+      fi
+      if test $HAVE_FCHDIR = 0; then
+        func_gl_gnulib_m4code_3d094ef542bfdd238a5194e172bfe5f6
+      fi
+    fi
+  }
   func_gl_gnulib_m4code_43fe87a341d9b4b93c47c3ad819a5239 ()
   {
     if ! $gl_gnulib_enabled_43fe87a341d9b4b93c47c3ad819a5239; then
       gl_gnulib_enabled_43fe87a341d9b4b93c47c3ad819a5239=true
     fi
   }
+  func_gl_gnulib_m4code_fdopendir ()
+  {
+    if ! $gl_gnulib_enabled_fdopendir; then
+      gl_FUNC_FDOPENDIR
+      if test $HAVE_FDOPENDIR = 0 || test $REPLACE_FDOPENDIR = 1; then
+        AC_LIBOBJ([fdopendir])
+      fi
+      gl_DIRENT_MODULE_INDICATOR([fdopendir])
+      gl_MODULE_INDICATOR([fdopendir])
+      gl_gnulib_enabled_fdopendir=true
+      if test $HAVE_FDOPENDIR = 0; then
+        func_gl_gnulib_m4code_260941c0e5dc67ec9e87d1fb321c300b
+      fi
+      func_gl_gnulib_m4code_dirent
+      if test $HAVE_FDOPENDIR = 0; then
+        func_gl_gnulib_m4code_dirfd
+      fi
+      if test $HAVE_FDOPENDIR = 0; then
+        func_gl_gnulib_m4code_dup
+      fi
+      if test $HAVE_FDOPENDIR = 0; then
+        func_gl_gnulib_m4code_fchdir
+      fi
+      if test $HAVE_FDOPENDIR = 0; then
+        func_gl_gnulib_m4code_fstat
+      fi
+      if test $HAVE_FDOPENDIR = 0; then
+        func_gl_gnulib_m4code_1840129d490f3a00c8a098316d0fa345
+      fi
+      if test $HAVE_FDOPENDIR = 0; then
+        func_gl_gnulib_m4code_opendir
+      fi
+      if test $HAVE_FDOPENDIR = 0; then
+        func_gl_gnulib_m4code_d4850532688ba16d685f036076611f21
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_ffs ()
+  {
+    if ! $gl_gnulib_enabled_ffs; then
+      gl_FUNC_FFS
+      if test $HAVE_FFS = 0; then
+        AC_LIBOBJ([ffs])
+      fi
+      gl_STRINGS_MODULE_INDICATOR([ffs])
+      gl_gnulib_enabled_ffs=true
+      func_gl_gnulib_m4code_strings
+    fi
+  }
+  func_gl_gnulib_m4code_fca9852db2a43bb33f02f0fbdbc174f6 ()
+  {
+    if ! $gl_gnulib_enabled_fca9852db2a43bb33f02f0fbdbc174f6; then
+      gl_FILE_NAME_CONCAT_LGPL
+      gl_gnulib_enabled_fca9852db2a43bb33f02f0fbdbc174f6=true
+    fi
+  }
   func_gl_gnulib_m4code_fseterr ()
   {
     if ! $gl_gnulib_enabled_fseterr; then
@@ -885,7 +1410,61 @@
       if test $REPLACE_FSTAT = 1; then
         func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c
       fi
-      func_gl_gnulib_m4code_sys_stat
+    fi
+  }
+  func_gl_gnulib_m4code_fstatat ()
+  {
+    if ! $gl_gnulib_enabled_fstatat; then
+      gl_FUNC_FSTATAT
+      if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+        AC_LIBOBJ([fstatat])
+      fi
+      gl_SYS_STAT_MODULE_INDICATOR([fstatat])
+      gl_gnulib_enabled_fstatat=true
+      if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+        func_gl_gnulib_m4code_260941c0e5dc67ec9e87d1fb321c300b
+      fi
+      if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+        func_gl_gnulib_m4code_fchdir
+      fi
+      if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+        func_gl_gnulib_m4code_lstat
+      fi
+      if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+        func_gl_gnulib_m4code_1840129d490f3a00c8a098316d0fa345
+      fi
+      if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+        func_gl_gnulib_m4code_03e0aaad4cb89ca757653bd367a6ccb7
+      fi
+      if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+        func_gl_gnulib_m4code_d4850532688ba16d685f036076611f21
+      fi
+      if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+        func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_3d094ef542bfdd238a5194e172bfe5f6 ()
+  {
+    if ! $gl_gnulib_enabled_3d094ef542bfdd238a5194e172bfe5f6; then
+      gl_FUNC_GETCWD_LGPL
+      if test $REPLACE_GETCWD = 1; then
+        AC_LIBOBJ([getcwd-lgpl])
+      fi
+      gl_UNISTD_MODULE_INDICATOR([getcwd])
+      gl_gnulib_enabled_3d094ef542bfdd238a5194e172bfe5f6=true
+    fi
+  }
+  func_gl_gnulib_m4code_getdelim ()
+  {
+    if ! $gl_gnulib_enabled_getdelim; then
+      gl_FUNC_GETDELIM
+      if test $HAVE_GETDELIM = 0 || test $REPLACE_GETDELIM = 1; then
+        AC_LIBOBJ([getdelim])
+        gl_PREREQ_GETDELIM
+      fi
+      gl_STDIO_MODULE_INDICATOR([getdelim])
+      gl_gnulib_enabled_getdelim=true
     fi
   }
   func_gl_gnulib_m4code_getdtablesize ()
@@ -900,10 +1479,29 @@
       gl_gnulib_enabled_getdtablesize=true
     fi
   }
+  func_gl_gnulib_m4code_getline ()
+  {
+    if ! $gl_gnulib_enabled_getline; then
+      gl_FUNC_GETLINE
+      if test $REPLACE_GETLINE = 1; then
+        AC_LIBOBJ([getline])
+        gl_PREREQ_GETLINE
+      fi
+      gl_STDIO_MODULE_INDICATOR([getline])
+      gl_gnulib_enabled_getline=true
+      if test $REPLACE_GETLINE = 1; then
+        func_gl_gnulib_m4code_getdelim
+      fi
+    fi
+  }
   func_gl_gnulib_m4code_30838f5439487421042f2225bed3af76 ()
   {
     if ! $gl_gnulib_enabled_30838f5439487421042f2225bed3af76; then
+      AC_REQUIRE([gl_FUNC_SETLOCALE_NULL])
+      LIB_HARD_LOCALE="$LIB_SETLOCALE_NULL"
+      AC_SUBST([LIB_HARD_LOCALE])
       gl_gnulib_enabled_30838f5439487421042f2225bed3af76=true
+      func_gl_gnulib_m4code_e7e881d32ca02f1c997b13c737c64bbd
     fi
   }
   func_gl_gnulib_m4code_3f0e593033d1fc2c127581960f641b66 ()
@@ -924,19 +1522,12 @@
       gl_gnulib_enabled_ldexp=true
     fi
   }
-  func_gl_gnulib_m4code_21ee726a3540c09237a8e70c0baf7467 ()
+  func_gl_gnulib_m4code_locale ()
   {
-    if ! $gl_gnulib_enabled_21ee726a3540c09237a8e70c0baf7467; then
-      gl___INLINE
-      gl_gnulib_enabled_21ee726a3540c09237a8e70c0baf7467=true
-    fi
-  }
-  func_gl_gnulib_m4code_2049e887c7e5308faad27b3f894bb8c9 ()
-  {
-    if ! $gl_gnulib_enabled_2049e887c7e5308faad27b3f894bb8c9; then
-      AC_REQUIRE([gl_LOCALTIME_BUFFER_DEFAULTS])
-      AC_LIBOBJ([localtime-buffer])
-      gl_gnulib_enabled_2049e887c7e5308faad27b3f894bb8c9=true
+    if ! $gl_gnulib_enabled_locale; then
+      gl_LOCALE_H
+      gl_LOCALE_H_REQUIRE_DEFAULTS
+      gl_gnulib_enabled_locale=true
     fi
   }
   func_gl_gnulib_m4code_lstat ()
@@ -950,12 +1541,8 @@
       gl_SYS_STAT_MODULE_INDICATOR([lstat])
       gl_gnulib_enabled_lstat=true
       if test $REPLACE_LSTAT = 1; then
-        func_gl_gnulib_m4code_stat
-      fi
-      if test $REPLACE_LSTAT = 1; then
         func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c
       fi
-      func_gl_gnulib_m4code_sys_stat
     fi
   }
   func_gl_gnulib_m4code_malloca ()
@@ -965,6 +1552,80 @@
       gl_gnulib_enabled_malloca=true
     fi
   }
+  func_gl_gnulib_m4code_memrchr ()
+  {
+    if ! $gl_gnulib_enabled_memrchr; then
+      gl_FUNC_MEMRCHR
+      if test $ac_cv_func_memrchr = no; then
+        AC_LIBOBJ([memrchr])
+        gl_PREREQ_MEMRCHR
+      fi
+      gl_STRING_MODULE_INDICATOR([memrchr])
+      gl_gnulib_enabled_memrchr=true
+    fi
+  }
+  func_gl_gnulib_m4code_openat ()
+  {
+    if ! $gl_gnulib_enabled_openat; then
+      gl_FUNC_OPENAT
+      if test $HAVE_OPENAT = 0 || test $REPLACE_OPENAT = 1; then
+        AC_LIBOBJ([openat])
+        gl_PREREQ_OPENAT
+      fi
+      gl_MODULE_INDICATOR([openat]) dnl for lib/getcwd.c
+      gl_FCNTL_MODULE_INDICATOR([openat])
+      gl_gnulib_enabled_openat=true
+      if test $HAVE_OPENAT = 0; then
+        func_gl_gnulib_m4code_260941c0e5dc67ec9e87d1fb321c300b
+      fi
+      if test $HAVE_OPENAT = 0; then
+        func_gl_gnulib_m4code_fchdir
+      fi
+      if test $REPLACE_OPENAT = 1; then
+        func_gl_gnulib_m4code_fstat
+      fi
+      if test $HAVE_OPENAT = 0; then
+        func_gl_gnulib_m4code_1840129d490f3a00c8a098316d0fa345
+      fi
+      if test $HAVE_OPENAT = 0 || test $REPLACE_OPENAT = 1; then
+        func_gl_gnulib_m4code_03e0aaad4cb89ca757653bd367a6ccb7
+      fi
+      if test $HAVE_OPENAT = 0; then
+        func_gl_gnulib_m4code_d4850532688ba16d685f036076611f21
+      fi
+    fi
+  }
+  func_gl_gnulib_m4code_1840129d490f3a00c8a098316d0fa345 ()
+  {
+    if ! $gl_gnulib_enabled_1840129d490f3a00c8a098316d0fa345; then
+      gl_gnulib_enabled_1840129d490f3a00c8a098316d0fa345=true
+      func_gl_gnulib_m4code_03e0aaad4cb89ca757653bd367a6ccb7
+    fi
+  }
+  func_gl_gnulib_m4code_03e0aaad4cb89ca757653bd367a6ccb7 ()
+  {
+    if ! $gl_gnulib_enabled_03e0aaad4cb89ca757653bd367a6ccb7; then
+      gl_gnulib_enabled_03e0aaad4cb89ca757653bd367a6ccb7=true
+    fi
+  }
+  func_gl_gnulib_m4code_opendir ()
+  {
+    if ! $gl_gnulib_enabled_opendir; then
+      gl_FUNC_OPENDIR
+      if test $HAVE_OPENDIR = 0 || test $REPLACE_OPENDIR = 1; then
+        AC_LIBOBJ([opendir])
+      fi
+      gl_DIRENT_MODULE_INDICATOR([opendir])
+      gl_gnulib_enabled_opendir=true
+      if test $HAVE_OPENDIR = 0 || test $REPLACE_OPENDIR = 1; then
+        func_gl_gnulib_m4code_closedir
+      fi
+      func_gl_gnulib_m4code_dirent
+      if test $HAVE_OPENDIR = 0 || test $REPLACE_OPENDIR = 1; then
+        func_gl_gnulib_m4code_dirfd
+      fi
+    fi
+  }
   func_gl_gnulib_m4code_332607f759618fb73dfc3076748afea7 ()
   {
     if ! $gl_gnulib_enabled_332607f759618fb73dfc3076748afea7; then
@@ -974,20 +1635,35 @@
         gl_PREREQ_POSIX_SPAWN_INTERNAL
       fi
       gl_gnulib_enabled_332607f759618fb73dfc3076748afea7=true
+      if test $HAVE_POSIX_SPAWN = 0; then
+        func_gl_gnulib_m4code_malloca
+      fi
       func_gl_gnulib_m4code_cdeb0f2aaf9d280baa6526bfa1b07f70
       func_gl_gnulib_m4code_strchrnul
     fi
   }
-  func_gl_gnulib_m4code_rawmemchr ()
+  func_gl_gnulib_m4code_readdir ()
   {
-    if ! $gl_gnulib_enabled_rawmemchr; then
-      gl_FUNC_RAWMEMCHR
-      if test $HAVE_RAWMEMCHR = 0; then
-        AC_LIBOBJ([rawmemchr])
-        gl_PREREQ_RAWMEMCHR
+    if ! $gl_gnulib_enabled_readdir; then
+      gl_FUNC_READDIR
+      if test $HAVE_READDIR = 0; then
+        AC_LIBOBJ([readdir])
       fi
-      gl_STRING_MODULE_INDICATOR([rawmemchr])
-      gl_gnulib_enabled_rawmemchr=true
+      gl_DIRENT_MODULE_INDICATOR([readdir])
+      gl_gnulib_enabled_readdir=true
+      func_gl_gnulib_m4code_dirent
+    fi
+  }
+  func_gl_gnulib_m4code_rewinddir ()
+  {
+    if ! $gl_gnulib_enabled_rewinddir; then
+      gl_FUNC_REWINDDIR
+      if test $HAVE_REWINDDIR = 0; then
+        AC_LIBOBJ([rewinddir])
+      fi
+      gl_DIRENT_MODULE_INDICATOR([rewinddir])
+      gl_gnulib_enabled_rewinddir=true
+      func_gl_gnulib_m4code_dirent
     fi
   }
   func_gl_gnulib_m4code_rmdir ()
@@ -999,15 +1675,29 @@
       fi
       gl_UNISTD_MODULE_INDICATOR([rmdir])
       gl_gnulib_enabled_rmdir=true
-      if test $REPLACE_RMDIR = 1; then
-        func_gl_gnulib_m4code_sys_stat
-      fi
     fi
   }
-  func_gl_gnulib_m4code_9bc5f216d57e231e4834049d67d0db62 ()
+  func_gl_gnulib_m4code_d4850532688ba16d685f036076611f21 ()
   {
-    if ! $gl_gnulib_enabled_9bc5f216d57e231e4834049d67d0db62; then
-      gl_gnulib_enabled_9bc5f216d57e231e4834049d67d0db62=true
+    if ! $gl_gnulib_enabled_d4850532688ba16d685f036076611f21; then
+      gl_SAVE_CWD
+      gl_gnulib_enabled_d4850532688ba16d685f036076611f21=true
+      func_gl_gnulib_m4code_8198daae261b932d64a998f8586f5005
+      func_gl_gnulib_m4code_fchdir
+      func_gl_gnulib_m4code_3d094ef542bfdd238a5194e172bfe5f6
+    fi
+  }
+  func_gl_gnulib_m4code_e7e881d32ca02f1c997b13c737c64bbd ()
+  {
+    if ! $gl_gnulib_enabled_e7e881d32ca02f1c997b13c737c64bbd; then
+      gl_FUNC_SETLOCALE_NULL
+      if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then
+        AC_LIBOBJ([setlocale-lock])
+        gl_PREREQ_SETLOCALE_LOCK
+      fi
+      gl_LOCALE_MODULE_INDICATOR([setlocale_null])
+      gl_gnulib_enabled_e7e881d32ca02f1c997b13c737c64bbd=true
+      func_gl_gnulib_m4code_locale
     fi
   }
   func_gl_gnulib_m4code_cdeb0f2aaf9d280baa6526bfa1b07f70 ()
@@ -1017,30 +1707,6 @@
       gl_gnulib_enabled_cdeb0f2aaf9d280baa6526bfa1b07f70=true
     fi
   }
-  func_gl_gnulib_m4code_stat ()
-  {
-    if ! $gl_gnulib_enabled_stat; then
-      gl_FUNC_STAT
-      if test $REPLACE_STAT = 1; then
-        AC_LIBOBJ([stat])
-        case "$host_os" in
-          mingw*)
-            AC_LIBOBJ([stat-w32])
-            ;;
-        esac
-        gl_PREREQ_STAT
-      fi
-      gl_SYS_STAT_MODULE_INDICATOR([stat])
-      gl_gnulib_enabled_stat=true
-      if test $REPLACE_STAT = 1; then
-        func_gl_gnulib_m4code_malloca
-      fi
-      if test $REPLACE_STAT = 1; then
-        func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c
-      fi
-      func_gl_gnulib_m4code_sys_stat
-    fi
-  }
   func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c ()
   {
     if ! $gl_gnulib_enabled_0137e3d3638b33e5819d132d0b23165c; then
@@ -1059,9 +1725,6 @@
       fi
       gl_STRING_MODULE_INDICATOR([strchrnul])
       gl_gnulib_enabled_strchrnul=true
-      if test $HAVE_STRCHRNUL = 0 || test $REPLACE_STRCHRNUL = 1; then
-        func_gl_gnulib_m4code_rawmemchr
-      fi
     fi
   }
   func_gl_gnulib_m4code_dbb57f49352be8fb86869629a254fb72 ()
@@ -1080,10 +1743,10 @@
   {
     if ! $gl_gnulib_enabled_1f32594a85e6221ba15f884daeee8c2a; then
       gl_FUNC_STRERROR_R
-      if test $HAVE_DECL_STRERROR_R = 0 || test $REPLACE_STRERROR_R = 1; then
+      AS_IF([test $HAVE_DECL_STRERROR_R = 0 || test $REPLACE_STRERROR_R = 1], [
         AC_LIBOBJ([strerror_r])
         gl_PREREQ_STRERROR_R
-      fi
+      ])
       gl_STRING_MODULE_INDICATOR([strerror_r])
       dnl For the modules argp, error.
       gl_MODULE_INDICATOR([strerror_r-posix])
@@ -1093,6 +1756,14 @@
       fi
     fi
   }
+  func_gl_gnulib_m4code_strings ()
+  {
+    if ! $gl_gnulib_enabled_strings; then
+      gl_STRINGS_H
+      gl_STRINGS_H_REQUIRE_DEFAULTS
+      gl_gnulib_enabled_strings=true
+    fi
+  }
   func_gl_gnulib_m4code_strnlen ()
   {
     if ! $gl_gnulib_enabled_strnlen; then
@@ -1105,19 +1776,12 @@
       gl_gnulib_enabled_strnlen=true
     fi
   }
-  func_gl_gnulib_m4code_sys_stat ()
-  {
-    if ! $gl_gnulib_enabled_sys_stat; then
-      gl_HEADER_SYS_STAT_H
-      AC_PROG_MKDIR_P
-      gl_gnulib_enabled_sys_stat=true
-    fi
-  }
   func_gl_gnulib_m4code_ed5616be3593d355b981ffab56b9f37b ()
   {
     if ! $gl_gnulib_enabled_ed5616be3593d355b981ffab56b9f37b; then
       gl_FUNC_VFPRINTF_POSIX
       gl_STDIO_MODULE_INDICATOR([vfprintf-posix])
+      gl_MODULE_INDICATOR([vfprintf-posix])
       gl_gnulib_enabled_ed5616be3593d355b981ffab56b9f37b=true
       if test $REPLACE_VFPRINTF = 1; then
         func_gl_gnulib_m4code_fseterr
@@ -1185,29 +1849,47 @@
       func_gl_gnulib_m4code_68a4501daeca58988392c7e60b4917ab
     fi
   }
-  if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then
-    func_gl_gnulib_m4code_lstat
-  fi
-  if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then
-    func_gl_gnulib_m4code_malloca
-  fi
-  if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then
-    func_gl_gnulib_m4code_sys_stat
-  fi
   if test $REPLACE_CLOSE = 1; then
     func_gl_gnulib_m4code_43fe87a341d9b4b93c47c3ad819a5239
   fi
   if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then
     func_gl_gnulib_m4code_getdtablesize
   fi
+  if test $HAVE_FFSL = 0; then
+    func_gl_gnulib_m4code_ffs
+  fi
   if test $REPLACE_FOPEN = 1; then
     func_gl_gnulib_m4code_fstat
   fi
   if test $REPLACE_FPRINTF = 1; then
     func_gl_gnulib_m4code_fseterr
   fi
-  if test $NEED_LOCALTIME_BUFFER = 1; then
-    func_gl_gnulib_m4code_2049e887c7e5308faad27b3f894bb8c9
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_closedir
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_75c65a2c014cf8235dd95289676302a4
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_fdopendir
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_fstat
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_fstatat
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_openat
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_opendir
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_readdir
+  fi
+  if test $REPLACE_GETCWD = 1; then
+    func_gl_gnulib_m4code_rewinddir
   fi
   if { test $HAVE_DECL_LDEXPL = 0 || test $gl_func_ldexpl = no; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
     func_gl_gnulib_m4code_ldexp
@@ -1224,21 +1906,21 @@
   if test $gl_threads_api = windows; then
     func_gl_gnulib_m4code_8bb827fe37eaccf1b97feb0c87bc92ef
   fi
-  if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then
+  if { test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; } && test $REPLACE_MBSTATE_T = 0; then
     func_gl_gnulib_m4code_30838f5439487421042f2225bed3af76
   fi
   if test $REPLACE_OPEN = 1; then
     func_gl_gnulib_m4code_fstat
   fi
-  if test $REPLACE_OPEN = 1; then
-    func_gl_gnulib_m4code_stat
-  fi
   if test $REPLACE_PERROR = 1; then
     func_gl_gnulib_m4code_dbb57f49352be8fb86869629a254fb72
   fi
   if test $REPLACE_PERROR = 1; then
     func_gl_gnulib_m4code_1f32594a85e6221ba15f884daeee8c2a
   fi
+  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+    func_gl_gnulib_m4code_332607f759618fb73dfc3076748afea7
+  fi
   if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = 1; then
     func_gl_gnulib_m4code_getdtablesize
   fi
@@ -1254,8 +1936,8 @@
   if test $REPLACE_PRINTF = 1; then
     func_gl_gnulib_m4code_ed5616be3593d355b981ffab56b9f37b
   fi
-  if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then
-    func_gl_gnulib_m4code_stat
+  if test "$gl_cv_lib_readline" = no; then
+    func_gl_gnulib_m4code_getline
   fi
   if test $REPLACE_RENAME = 1; then
     func_gl_gnulib_m4code_chdir
@@ -1266,21 +1948,21 @@
   if test $REPLACE_RENAME = 1; then
     func_gl_gnulib_m4code_rmdir
   fi
-  if test $REPLACE_RENAME = 1; then
-    func_gl_gnulib_m4code_9bc5f216d57e231e4834049d67d0db62
-  fi
   if test $REPLACE_SIGNBIT = 1; then
     func_gl_gnulib_m4code_3f0e593033d1fc2c127581960f641b66
   fi
+  if test $REPLACE_STAT = 1; then
+    func_gl_gnulib_m4code_malloca
+  fi
+  if test $REPLACE_STAT = 1; then
+    func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c
+  fi
   if test $REPLACE_STRERROR = 1; then
     func_gl_gnulib_m4code_dbb57f49352be8fb86869629a254fb72
   fi
   if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then
     func_gl_gnulib_m4code_strnlen
   fi
-  if test $HAVE_STRVERSCMP = 0; then
-    func_gl_gnulib_m4code_21ee726a3540c09237a8e70c0baf7467
-  fi
   if test $gl_threads_api = windows; then
     func_gl_gnulib_m4code_48b2271240803e4879464b755748a89d
   fi
@@ -1288,30 +1970,50 @@
     func_gl_gnulib_m4code_lstat
   fi
   m4_pattern_allow([^gl_GNULIB_ENABLED_])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_260941c0e5dc67ec9e87d1fb321c300b], [$gl_gnulib_enabled_260941c0e5dc67ec9e87d1fb321c300b])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_chdir], [$gl_gnulib_enabled_chdir])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_8198daae261b932d64a998f8586f5005], [$gl_gnulib_enabled_8198daae261b932d64a998f8586f5005])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_closedir], [$gl_gnulib_enabled_closedir])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_75c65a2c014cf8235dd95289676302a4], [$gl_gnulib_enabled_75c65a2c014cf8235dd95289676302a4])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_dirent], [$gl_gnulib_enabled_dirent])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_dirfd], [$gl_gnulib_enabled_dirfd])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_dup], [$gl_gnulib_enabled_dup])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_fchdir], [$gl_gnulib_enabled_fchdir])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239], [$gl_gnulib_enabled_43fe87a341d9b4b93c47c3ad819a5239])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_fdopendir], [$gl_gnulib_enabled_fdopendir])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_ffs], [$gl_gnulib_enabled_ffs])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_fca9852db2a43bb33f02f0fbdbc174f6], [$gl_gnulib_enabled_fca9852db2a43bb33f02f0fbdbc174f6])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_fseterr], [$gl_gnulib_enabled_fseterr])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_fstat], [$gl_gnulib_enabled_fstat])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_fstatat], [$gl_gnulib_enabled_fstatat])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_3d094ef542bfdd238a5194e172bfe5f6], [$gl_gnulib_enabled_3d094ef542bfdd238a5194e172bfe5f6])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_getdelim], [$gl_gnulib_enabled_getdelim])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_getdtablesize], [$gl_gnulib_enabled_getdtablesize])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_getline], [$gl_gnulib_enabled_getline])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76], [$gl_gnulib_enabled_30838f5439487421042f2225bed3af76])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66], [$gl_gnulib_enabled_3f0e593033d1fc2c127581960f641b66])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_ldexp], [$gl_gnulib_enabled_ldexp])
-  AM_CONDITIONAL([gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467], [$gl_gnulib_enabled_21ee726a3540c09237a8e70c0baf7467])
-  AM_CONDITIONAL([gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9], [$gl_gnulib_enabled_2049e887c7e5308faad27b3f894bb8c9])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_locale], [$gl_gnulib_enabled_locale])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_lstat], [$gl_gnulib_enabled_lstat])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_malloca], [$gl_gnulib_enabled_malloca])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_memrchr], [$gl_gnulib_enabled_memrchr])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_openat], [$gl_gnulib_enabled_openat])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_1840129d490f3a00c8a098316d0fa345], [$gl_gnulib_enabled_1840129d490f3a00c8a098316d0fa345])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_03e0aaad4cb89ca757653bd367a6ccb7], [$gl_gnulib_enabled_03e0aaad4cb89ca757653bd367a6ccb7])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_opendir], [$gl_gnulib_enabled_opendir])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7], [$gl_gnulib_enabled_332607f759618fb73dfc3076748afea7])
-  AM_CONDITIONAL([gl_GNULIB_ENABLED_rawmemchr], [$gl_gnulib_enabled_rawmemchr])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_readdir], [$gl_gnulib_enabled_readdir])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_rewinddir], [$gl_gnulib_enabled_rewinddir])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_rmdir], [$gl_gnulib_enabled_rmdir])
-  AM_CONDITIONAL([gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62], [$gl_gnulib_enabled_9bc5f216d57e231e4834049d67d0db62])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_d4850532688ba16d685f036076611f21], [$gl_gnulib_enabled_d4850532688ba16d685f036076611f21])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_e7e881d32ca02f1c997b13c737c64bbd], [$gl_gnulib_enabled_e7e881d32ca02f1c997b13c737c64bbd])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70], [$gl_gnulib_enabled_cdeb0f2aaf9d280baa6526bfa1b07f70])
-  AM_CONDITIONAL([gl_GNULIB_ENABLED_stat], [$gl_gnulib_enabled_stat])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c], [$gl_gnulib_enabled_0137e3d3638b33e5819d132d0b23165c])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_strchrnul], [$gl_gnulib_enabled_strchrnul])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72], [$gl_gnulib_enabled_dbb57f49352be8fb86869629a254fb72])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a], [$gl_gnulib_enabled_1f32594a85e6221ba15f884daeee8c2a])
+  AM_CONDITIONAL([gl_GNULIB_ENABLED_strings], [$gl_gnulib_enabled_strings])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_strnlen], [$gl_gnulib_enabled_strnlen])
-  AM_CONDITIONAL([gl_GNULIB_ENABLED_sys_stat], [$gl_gnulib_enabled_sys_stat])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b], [$gl_gnulib_enabled_ed5616be3593d355b981ffab56b9f37b])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440], [$gl_gnulib_enabled_503a4cb75d69c787103d0aa2ab7d8440])
   AM_CONDITIONAL([gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab], [$gl_gnulib_enabled_68a4501daeca58988392c7e60b4917ab])
@@ -1330,6 +2032,8 @@
       m4_if(m4_sysval, [0], [],
         [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])])
   ])
+  m4_popdef([GL_MODULE_INDICATOR_PREFIX])
+  m4_popdef([GL_MACRO_PREFIX])
   m4_popdef([gl_LIBSOURCES_DIR])
   m4_popdef([gl_LIBSOURCES_LIST])
   m4_popdef([AC_LIBSOURCES])
@@ -1356,6 +2060,8 @@
   m4_pushdef([AC_LIBSOURCES], m4_defn([gltests_LIBSOURCES]))
   m4_pushdef([gltests_LIBSOURCES_LIST], [])
   m4_pushdef([gltests_LIBSOURCES_DIR], [])
+  m4_pushdef([GL_MACRO_PREFIX], [gltests])
+  m4_pushdef([GL_MODULE_INDICATOR_PREFIX], [GL])
   gl_COMMON
   gl_source_base='tests'
 changequote(,)dnl
@@ -1377,6 +2083,8 @@
       m4_if(m4_sysval, [0], [],
         [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])])
   ])
+  m4_popdef([GL_MODULE_INDICATOR_PREFIX])
+  m4_popdef([GL_MACRO_PREFIX])
   m4_popdef([gltests_LIBSOURCES_DIR])
   m4_popdef([gltests_LIBSOURCES_LIST])
   m4_popdef([AC_LIBSOURCES])
@@ -1484,6 +2192,7 @@
   doc/gpl-3.0.texi
   doc/relocatable.texi
   lib/_Noreturn.h
+  lib/access.c
   lib/alignof.h
   lib/alloca.in.h
   lib/allocator.c
@@ -1496,7 +2205,10 @@
   lib/asnprintf.c
   lib/asprintf.c
   lib/assure.h
+  lib/at-func.c
+  lib/attribute.h
   lib/basename-lgpl.c
+  lib/basename-lgpl.h
   lib/basename.c
   lib/binary-io.c
   lib/binary-io.h
@@ -1526,40 +2238,62 @@
   lib/c-strncasecmp.c
   lib/calloc.c
   lib/canonicalize-lgpl.c
+  lib/canonicalize.c
+  lib/canonicalize.h
   lib/careadlinkat.c
   lib/careadlinkat.h
   lib/cdefs.h
+  lib/chdir-long.c
+  lib/chdir-long.h
   lib/cloexec.c
   lib/cloexec.h
   lib/close-stream.c
   lib/close-stream.h
   lib/close.c
+  lib/closedir.c
   lib/closeout.c
   lib/closeout.h
   lib/concat-filename.c
   lib/concat-filename.h
   lib/diffseq.h
+  lib/dirent-private.h
+  lib/dirent.in.h
+  lib/dirfd.c
   lib/dirname-lgpl.c
   lib/dirname.c
   lib/dirname.h
-  lib/dosname.h
   lib/dup-safer-flag.c
   lib/dup-safer.c
+  lib/dup.c
   lib/dup2.c
+  lib/eloop-threshold.h
   lib/errno.in.h
   lib/error.c
   lib/error.h
+  lib/execute.c
+  lib/execute.h
   lib/exitfail.c
   lib/exitfail.h
   lib/fatal-signal.c
   lib/fatal-signal.h
+  lib/fchdir.c
   lib/fcntl.c
   lib/fcntl.in.h
   lib/fd-hook.c
   lib/fd-hook.h
   lib/fd-safer-flag.c
   lib/fd-safer.c
+  lib/fdopendir.c
+  lib/ffs.c
+  lib/ffsl.c
+  lib/ffsl.h
+  lib/file-set.c
+  lib/file-set.h
   lib/filename.h
+  lib/filenamecat-lgpl.c
+  lib/filenamecat.h
+  lib/findprog-in.c
+  lib/findprog.h
   lib/float+.h
   lib/float.c
   lib/float.in.h
@@ -1569,17 +2303,23 @@
   lib/fpending.h
   lib/fprintf.c
   lib/fpucw.h
+  lib/free.c
   lib/frexp.c
   lib/frexpl.c
   lib/fseterr.c
   lib/fseterr.h
   lib/fstat.c
+  lib/fstatat.c
   lib/fstrcmp.c
   lib/fstrcmp.h
   lib/fsync.c
+  lib/getcwd-lgpl.c
+  lib/getcwd.c
+  lib/getdelim.c
   lib/getdtablesize.c
   lib/gethrxtime.c
   lib/gethrxtime.h
+  lib/getline.c
   lib/getopt-cdefs.in.h
   lib/getopt-core.h
   lib/getopt-ext.h
@@ -1595,12 +2335,39 @@
   lib/gettext.h
   lib/gettime.c
   lib/gettimeofday.c
+  lib/gl_anyhash1.h
+  lib/gl_anyhash2.h
+  lib/gl_anyhash_primes.h
+  lib/gl_anylinked_list1.h
+  lib/gl_anylinked_list2.h
+  lib/gl_anyrbtree_list1.h
+  lib/gl_anyrbtree_list2.h
+  lib/gl_anytree_list1.h
+  lib/gl_anytree_list2.h
+  lib/gl_anytree_oset.h
+  lib/gl_anytreehash_list1.h
+  lib/gl_anytreehash_list2.h
   lib/gl_array_list.c
   lib/gl_array_list.h
+  lib/gl_hash_map.c
+  lib/gl_hash_map.h
+  lib/gl_linked_list.c
+  lib/gl_linked_list.h
   lib/gl_list.c
   lib/gl_list.h
+  lib/gl_map.c
+  lib/gl_map.h
+  lib/gl_oset.c
+  lib/gl_oset.h
+  lib/gl_rbtree_ordered.h
+  lib/gl_rbtree_oset.c
+  lib/gl_rbtree_oset.h
+  lib/gl_rbtreehash_list.c
+  lib/gl_rbtreehash_list.h
   lib/gl_xlist.c
   lib/gl_xlist.h
+  lib/gl_xmap.c
+  lib/gl_xmap.h
   lib/glthread/lock.c
   lib/glthread/lock.h
   lib/glthread/threadlib.c
@@ -1608,8 +2375,28 @@
   lib/glthread/tls.h
   lib/hard-locale.c
   lib/hard-locale.h
+  lib/hash-pjw.c
+  lib/hash-pjw.h
+  lib/hash-triple-simple.c
+  lib/hash-triple.h
   lib/hash.c
   lib/hash.h
+  lib/ialloc.c
+  lib/ialloc.h
+  lib/iconv.c
+  lib/iconv.in.h
+  lib/iconv_close.c
+  lib/iconv_open-aix.gperf
+  lib/iconv_open-hpux.gperf
+  lib/iconv_open-irix.gperf
+  lib/iconv_open-osf.gperf
+  lib/iconv_open-solaris.gperf
+  lib/iconv_open-zos.gperf
+  lib/iconv_open.c
+  lib/idx.h
+  lib/integer_length.c
+  lib/integer_length.h
+  lib/integer_length_l.c
   lib/intprops.h
   lib/inttypes.in.h
   lib/isnan.c
@@ -1620,16 +2407,24 @@
   lib/isnanl-nolibm.h
   lib/isnanl.c
   lib/iswblank.c
+  lib/iswdigit.c
+  lib/iswxdigit.c
   lib/itold.c
+  lib/lc-charset-dispatch.c
+  lib/lc-charset-dispatch.h
   lib/ldexpl.c
   lib/libc-config.h
   lib/limits.in.h
   lib/localcharset.c
   lib/localcharset.h
-  lib/localtime-buffer.c
-  lib/localtime-buffer.h
+  lib/locale.in.h
   lib/lstat.c
   lib/malloc.c
+  lib/malloc/scratch_buffer.h
+  lib/malloc/scratch_buffer_dupfree.c
+  lib/malloc/scratch_buffer_grow.c
+  lib/malloc/scratch_buffer_grow_preserve.c
+  lib/malloc/scratch_buffer_set_array_size.c
   lib/malloca.c
   lib/malloca.h
   lib/math.c
@@ -1638,12 +2433,18 @@
   lib/mbchar.h
   lib/mbfile.c
   lib/mbfile.h
+  lib/mbrtowc-impl-utf8.h
+  lib/mbrtowc-impl.h
   lib/mbrtowc.c
   lib/mbsinit.c
   lib/mbswidth.c
   lib/mbswidth.h
+  lib/mbtowc-lock.c
+  lib/mbtowc-lock.h
   lib/memchr.c
   lib/memchr.valgrind
+  lib/mempcpy.c
+  lib/memrchr.c
   lib/minmax.h
   lib/msvc-inval.c
   lib/msvc-inval.h
@@ -1653,9 +2454,18 @@
   lib/obstack.h
   lib/obstack_printf.c
   lib/open.c
+  lib/openat-die.c
+  lib/openat-priv.h
+  lib/openat-proc.c
+  lib/openat.c
+  lib/openat.h
+  lib/opendir.c
+  lib/os2-spawn.c
+  lib/os2-spawn.h
   lib/pathmax.h
   lib/perror.c
   lib/pipe-safer.c
+  lib/pipe.c
   lib/pipe2-safer.c
   lib/pipe2.c
   lib/printf-args.c
@@ -1676,16 +2486,27 @@
   lib/raise.c
   lib/rawmemchr.c
   lib/rawmemchr.valgrind
+  lib/readdir.c
+  lib/readline.c
+  lib/readline.h
   lib/readlink.c
   lib/realloc.c
+  lib/reallocarray.c
   lib/relocatable.c
   lib/relocatable.h
   lib/relocwrapper.c
   lib/rename.c
+  lib/rewinddir.c
   lib/rmdir.c
   lib/same-inode.h
+  lib/save-cwd.c
+  lib/save-cwd.h
   lib/sched.in.h
+  lib/scratch_buffer.h
   lib/setenv.c
+  lib/setlocale-lock.c
+  lib/setlocale_null.c
+  lib/setlocale_null.h
   lib/sig-handler.c
   lib/sig-handler.h
   lib/sigaction.c
@@ -1698,7 +2519,9 @@
   lib/snprintf.c
   lib/spawn-pipe.c
   lib/spawn-pipe.h
+  lib/spawn.c
   lib/spawn.in.h
+  lib/spawn_faction_addchdir.c
   lib/spawn_faction_addclose.c
   lib/spawn_faction_adddup2.c
   lib/spawn_faction_addopen.c
@@ -1708,6 +2531,7 @@
   lib/spawnattr_destroy.c
   lib/spawnattr_init.c
   lib/spawnattr_setflags.c
+  lib/spawnattr_setpgroup.c
   lib/spawnattr_setsigmask.c
   lib/spawni.c
   lib/spawnp.c
@@ -1717,6 +2541,7 @@
   lib/stat-w32.c
   lib/stat-w32.h
   lib/stat.c
+  lib/stdalign.in.h
   lib/stdbool.in.h
   lib/stddef.in.h
   lib/stdint.in.h
@@ -1726,6 +2551,7 @@
   lib/stdio.in.h
   lib/stdlib.in.h
   lib/stpcpy.c
+  lib/stpncpy.c
   lib/strchrnul.c
   lib/strchrnul.valgrind
   lib/strdup.c
@@ -1735,26 +2561,37 @@
   lib/strerror.c
   lib/strerror_r.c
   lib/string.in.h
+  lib/strings.in.h
   lib/stripslash.c
   lib/strndup.c
   lib/strnlen.c
+  lib/strtod.c
   lib/strverscmp.c
+  lib/sys_ioctl.in.h
   lib/sys_resource.in.h
   lib/sys_stat.in.h
   lib/sys_time.in.h
   lib/sys_times.in.h
   lib/sys_types.in.h
   lib/sys_wait.in.h
+  lib/termios.in.h
   lib/textstyle.in.h
+  lib/thread-optim.h
   lib/time.in.h
   lib/timespec.c
   lib/timespec.h
   lib/timevar.c
   lib/timevar.h
+  lib/unicodeio.c
+  lib/unicodeio.h
   lib/unistd--.h
   lib/unistd-safer.h
   lib/unistd.c
   lib/unistd.in.h
+  lib/unistr.in.h
+  lib/unistr/u8-mbtoucr.c
+  lib/unistr/u8-uctomb-aux.c
+  lib/unistr/u8-uctomb.c
   lib/unitypes.in.h
   lib/uniwidth.in.h
   lib/uniwidth/cjk.h
@@ -1769,7 +2606,6 @@
   lib/vfprintf.c
   lib/vsnprintf.c
   lib/vsprintf.c
-  lib/w32spawn.h
   lib/wait-process.c
   lib/wait-process.h
   lib/waitpid.c
@@ -1787,6 +2623,8 @@
   lib/windows-recmutex.h
   lib/windows-rwlock.c
   lib/windows-rwlock.h
+  lib/windows-spawn.c
+  lib/windows-spawn.h
   lib/windows-tls.c
   lib/windows-tls.h
   lib/xalloc-die.c
@@ -1808,54 +2646,80 @@
   m4/00gnulib.m4
   m4/__inline.m4
   m4/absolute-header.m4
+  m4/access.m4
   m4/alloca.m4
   m4/asm-underscore.m4
   m4/assert.m4
+  m4/builtin-expect.m4
   m4/calloc.m4
   m4/canonicalize.m4
+  m4/chdir-long.m4
   m4/clock_time.m4
   m4/close.m4
+  m4/closedir.m4
   m4/codeset.m4
   m4/config-h.m4
   m4/configmake.m4
-  m4/dirname.m4
+  m4/d-ino.m4
+  m4/dirent_h.m4
+  m4/dirfd.m4
   m4/double-slash-root.m4
+  m4/dup.m4
   m4/dup2.m4
+  m4/eaccess.m4
   m4/eealloc.m4
   m4/environ.m4
   m4/errno_h.m4
   m4/error.m4
+  m4/execute.m4
   m4/exponentd.m4
   m4/exponentf.m4
   m4/exponentl.m4
   m4/extensions.m4
   m4/extern-inline.m4
   m4/fatal-signal.m4
+  m4/fchdir.m4
   m4/fcntl-o.m4
   m4/fcntl.m4
   m4/fcntl_h.m4
+  m4/fdopendir.m4
+  m4/ffs.m4
+  m4/ffsl.m4
+  m4/filenamecat.m4
+  m4/findprog-in.m4
   m4/float_h.m4
   m4/fopen.m4
   m4/fpending.m4
   m4/fpieee.m4
   m4/fprintf-posix.m4
+  m4/free.m4
   m4/frexp.m4
   m4/frexpl.m4
   m4/fseterr.m4
   m4/fstat.m4
+  m4/fstatat.m4
   m4/fsync.m4
+  m4/getcwd-abort-bug.m4
+  m4/getcwd-path-max.m4
+  m4/getcwd.m4
+  m4/getdelim.m4
   m4/getdtablesize.m4
   m4/gethrxtime.m4
+  m4/getline.m4
   m4/getopt.m4
+  m4/getpagesize.m4
   m4/getprogname.m4
   m4/getrusage.m4
   m4/gettime.m4
   m4/gettimeofday.m4
   m4/gnulib-common.m4
   m4/host-cpu-c-abi.m4
+  m4/iconv.m4
+  m4/iconv_h.m4
+  m4/iconv_open.m4
   m4/include_next.m4
+  m4/inline.m4
   m4/intmax_t.m4
-  m4/inttypes-pri.m4
   m4/inttypes.m4
   m4/inttypes_h.m4
   m4/isnan.m4
@@ -1863,6 +2727,8 @@
   m4/isnanf.m4
   m4/isnanl.m4
   m4/iswblank.m4
+  m4/iswdigit.m4
+  m4/iswxdigit.m4
   m4/javacomp.m4
   m4/javaexec.m4
   m4/jm-winsz1.m4
@@ -1881,9 +2747,8 @@
   m4/locale-fr.m4
   m4/locale-ja.m4
   m4/locale-zh.m4
-  m4/localtime-buffer.m4
+  m4/locale_h.m4
   m4/lock.m4
-  m4/longlong.m4
   m4/lstat.m4
   m4/malloc.m4
   m4/malloca.m4
@@ -1895,12 +2760,15 @@
   m4/mbstate_t.m4
   m4/mbswidth.m4
   m4/memchr.m4
+  m4/mempcpy.m4
+  m4/memrchr.m4
   m4/minmax.m4
   m4/mmap-anon.m4
   m4/mode_t.m4
   m4/msvc-inval.m4
   m4/msvc-nothrow.m4
   m4/multiarch.m4
+  m4/musl.m4
   m4/nocrash.m4
   m4/non-recursive-gnulib-prefix-hack.m4
   m4/obstack-printf.m4
@@ -1909,10 +2777,15 @@
   m4/open-cloexec.m4
   m4/open-slash.m4
   m4/open.m4
+  m4/openat.m4
+  m4/opendir.m4
   m4/pathmax.m4
   m4/perror.m4
+  m4/pid_t.m4
+  m4/pipe.m4
   m4/pipe2.m4
   m4/posix_spawn.m4
+  m4/posix_spawn_faction_addchdir.m4
   m4/printf-frexp.m4
   m4/printf-frexpl.m4
   m4/printf-posix-rpl.m4
@@ -1922,14 +2795,20 @@
   m4/quotearg.m4
   m4/raise.m4
   m4/rawmemchr.m4
+  m4/readdir.m4
+  m4/readline.m4
   m4/readlink.m4
   m4/realloc.m4
+  m4/reallocarray.m4
   m4/relocatable-lib.m4
   m4/relocatable.m4
   m4/rename.m4
+  m4/rewinddir.m4
   m4/rmdir.m4
+  m4/save-cwd.m4
   m4/sched_h.m4
   m4/setenv.m4
+  m4/setlocale_null.m4
   m4/sh-filename.m4
   m4/sig_atomic_t.m4
   m4/sigaction.m4
@@ -1946,6 +2825,7 @@
   m4/stat-time.m4
   m4/stat.m4
   m4/std-gnu11.m4
+  m4/stdalign.m4
   m4/stdbool.m4
   m4/stddef_h.m4
   m4/stdint.m4
@@ -1953,14 +2833,18 @@
   m4/stdio_h.m4
   m4/stdlib_h.m4
   m4/stpcpy.m4
+  m4/stpncpy.m4
   m4/strchrnul.m4
   m4/strdup.m4
   m4/strerror.m4
   m4/strerror_r.m4
   m4/string_h.m4
+  m4/strings_h.m4
   m4/strndup.m4
   m4/strnlen.m4
+  m4/strtod.m4
   m4/strverscmp.m4
+  m4/sys_ioctl_h.m4
   m4/sys_resource_h.m4
   m4/sys_socket_h.m4
   m4/sys_stat_h.m4
@@ -1968,10 +2852,12 @@
   m4/sys_times_h.m4
   m4/sys_types_h.m4
   m4/sys_wait_h.m4
+  m4/termios_h.m4
   m4/threadlib.m4
   m4/time_h.m4
   m4/timespec.m4
   m4/tls.m4
+  m4/unicodeio.m4
   m4/unistd-safer.m4
   m4/unistd_h.m4
   m4/unlink.m4
@@ -1980,6 +2866,7 @@
   m4/vasprintf-posix.m4
   m4/vasprintf.m4
   m4/vfprintf-posix.m4
+  m4/visibility.m4
   m4/vsnprintf-posix.m4
   m4/vsnprintf.m4
   m4/vsprintf-posix.m4
@@ -1995,6 +2882,8 @@
   m4/xalloc.m4
   m4/xsize.m4
   m4/xstrndup.m4
+  m4/year2038.m4
+  m4/zzgnulib.m4
   top/GNUmakefile
   top/README-release
   top/maint.mk
diff --git a/m4/host-cpu-c-abi.m4 b/m4/host-cpu-c-abi.m4
index 6fc31bc..64e28b1 100644
--- a/m4/host-cpu-c-abi.m4
+++ b/m4/host-cpu-c-abi.m4
@@ -1,5 +1,5 @@
-# host-cpu-c-abi.m4 serial 13
-dnl Copyright (C) 2002-2019 Free Software Foundation, Inc.
+# host-cpu-c-abi.m4 serial 14
+dnl Copyright (C) 2002-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -211,7 +211,7 @@
          # be generating 64-bit code.
          AC_COMPILE_IFELSE(
            [AC_LANG_SOURCE(
-              [[#if defined __powerpc64__ || defined _ARCH_PPC64
+              [[#if defined __powerpc64__ || defined __LP64__
                  int ok;
                 #else
                  error fail
@@ -605,7 +605,7 @@
            # be generating 64-bit code.
            AC_COMPILE_IFELSE(
              [AC_LANG_SOURCE(
-                [[#if defined __powerpc64__ || defined _ARCH_PPC64
+                [[#if defined __powerpc64__ || defined __LP64__
                    int ok;
                   #else
                    error fail
diff --git a/m4/iconv.m4 b/m4/iconv.m4
index 4b29c5f..d0e61de 100644
--- a/m4/iconv.m4
+++ b/m4/iconv.m4
@@ -1,11 +1,18 @@
-# iconv.m4 serial 18 (gettext-0.18.2)
-dnl Copyright (C) 2000-2002, 2007-2014 Free Software Foundation, Inc.
+# iconv.m4 serial 24
+dnl Copyright (C) 2000-2002, 2007-2014, 2016-2021 Free Software Foundation,
+dnl Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl From Bruno Haible.
 
+AC_PREREQ([2.64])
+
+dnl Note: AM_ICONV is documented in the GNU gettext manual
+dnl <https://www.gnu.org/software/gettext/manual/html_node/AM_005fICONV.html>.
+dnl Don't make changes that are incompatible with that documentation!
+
 AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
 [
   dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
@@ -72,27 +79,34 @@
       if test $am_cv_lib_iconv = yes; then
         LIBS="$LIBS $LIBICONV"
       fi
-      AC_RUN_IFELSE(
-        [AC_LANG_SOURCE([[
+      am_cv_func_iconv_works=no
+      for ac_iconv_const in '' 'const'; do
+        AC_RUN_IFELSE(
+          [AC_LANG_PROGRAM(
+             [[
 #include <iconv.h>
 #include <string.h>
-int main ()
-{
-  int result = 0;
-  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
-     returns.  */
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+             ]],
+             [[int result = 0;
+  /* Test against AIX 5.1...7.2 bug: Failures are not distinguishable from
+     successful returns.  This is even documented in
+     <https://www.ibm.com/support/knowledgecenter/ssw_aix_72/i_bostechref/iconv.html> */
   {
     iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
     if (cd_utf8_to_88591 != (iconv_t)(-1))
       {
-        static const char input[] = "\342\202\254"; /* EURO SIGN */
+        static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
         char buf[10];
-        const char *inptr = input;
+        ICONV_CONST char *inptr = input;
         size_t inbytesleft = strlen (input);
         char *outptr = buf;
         size_t outbytesleft = sizeof (buf);
         size_t res = iconv (cd_utf8_to_88591,
-                            (char **) &inptr, &inbytesleft,
+                            &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if (res == 0)
           result |= 1;
@@ -105,14 +119,14 @@
     iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
     if (cd_ascii_to_88591 != (iconv_t)(-1))
       {
-        static const char input[] = "\263";
+        static ICONV_CONST char input[] = "\263";
         char buf[10];
-        const char *inptr = input;
+        ICONV_CONST char *inptr = input;
         size_t inbytesleft = strlen (input);
         char *outptr = buf;
         size_t outbytesleft = sizeof (buf);
         size_t res = iconv (cd_ascii_to_88591,
-                            (char **) &inptr, &inbytesleft,
+                            &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if (res == 0)
           result |= 2;
@@ -124,14 +138,14 @@
     iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
     if (cd_88591_to_utf8 != (iconv_t)(-1))
       {
-        static const char input[] = "\304";
+        static ICONV_CONST char input[] = "\304";
         static char buf[2] = { (char)0xDE, (char)0xAD };
-        const char *inptr = input;
+        ICONV_CONST char *inptr = input;
         size_t inbytesleft = 1;
         char *outptr = buf;
         size_t outbytesleft = 1;
         size_t res = iconv (cd_88591_to_utf8,
-                            (char **) &inptr, &inbytesleft,
+                            &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
           result |= 4;
@@ -144,14 +158,14 @@
     iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
     if (cd_88591_to_utf8 != (iconv_t)(-1))
       {
-        static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+        static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
         char buf[50];
-        const char *inptr = input;
+        ICONV_CONST char *inptr = input;
         size_t inbytesleft = strlen (input);
         char *outptr = buf;
         size_t outbytesleft = sizeof (buf);
         size_t res = iconv (cd_88591_to_utf8,
-                            (char **) &inptr, &inbytesleft,
+                            &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if ((int)res > 0)
           result |= 8;
@@ -161,27 +175,36 @@
 #endif
   /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
      provided.  */
-  if (/* Try standardized names.  */
-      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
-      /* Try IRIX, OSF/1 names.  */
-      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
-      /* Try AIX names.  */
-      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
-      /* Try HP-UX names.  */
-      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
-    result |= 16;
+  {
+    /* Try standardized names.  */
+    iconv_t cd1 = iconv_open ("UTF-8", "EUC-JP");
+    /* Try IRIX, OSF/1 names.  */
+    iconv_t cd2 = iconv_open ("UTF-8", "eucJP");
+    /* Try AIX names.  */
+    iconv_t cd3 = iconv_open ("UTF-8", "IBM-eucJP");
+    /* Try HP-UX names.  */
+    iconv_t cd4 = iconv_open ("utf8", "eucJP");
+    if (cd1 == (iconv_t)(-1) && cd2 == (iconv_t)(-1)
+        && cd3 == (iconv_t)(-1) && cd4 == (iconv_t)(-1))
+      result |= 16;
+    if (cd1 != (iconv_t)(-1))
+      iconv_close (cd1);
+    if (cd2 != (iconv_t)(-1))
+      iconv_close (cd2);
+    if (cd3 != (iconv_t)(-1))
+      iconv_close (cd3);
+    if (cd4 != (iconv_t)(-1))
+      iconv_close (cd4);
+  }
   return result;
-}]])],
-        [am_cv_func_iconv_works=yes],
-        [am_cv_func_iconv_works=no],
-        [
-changequote(,)dnl
-         case "$host_os" in
-           aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
-           *)            am_cv_func_iconv_works="guessing yes" ;;
-         esac
-changequote([,])dnl
-        ])
+]])],
+          [am_cv_func_iconv_works=yes], ,
+          [case "$host_os" in
+             aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+             *)            am_cv_func_iconv_works="guessing yes" ;;
+           esac])
+        test "$am_cv_func_iconv_works" = no || break
+      done
       LIBS="$am_save_LIBS"
     ])
     case "$am_cv_func_iconv_works" in
@@ -209,8 +232,7 @@
   AC_SUBST([LTLIBICONV])
 ])
 
-dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to
-dnl avoid warnings like
+dnl Define AM_ICONV using AC_DEFUN_ONCE, in order to avoid warnings like
 dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required".
 dnl This is tricky because of the way 'aclocal' is implemented:
 dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN.
@@ -218,51 +240,44 @@
 dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions.
 dnl   Otherwise aclocal would emit many "Use of uninitialized value $1"
 dnl   warnings.
-m4_define([gl_iconv_AC_DEFUN],
-  m4_version_prereq([2.64],
-    [[AC_DEFUN_ONCE(
-        [$1], [$2])]],
-    [m4_ifdef([gl_00GNULIB],
-       [[AC_DEFUN_ONCE(
-           [$1], [$2])]],
-       [[AC_DEFUN(
-           [$1], [$2])]])]))
-gl_iconv_AC_DEFUN([AM_ICONV],
+AC_DEFUN_ONCE([AM_ICONV],
 [
   AM_ICONV_LINK
   if test "$am_cv_func_iconv" = yes; then
-    AC_MSG_CHECKING([for iconv declaration])
-    AC_CACHE_VAL([am_cv_proto_iconv], [
-      AC_COMPILE_IFELSE(
-        [AC_LANG_PROGRAM(
-           [[
+    AC_CACHE_CHECK([whether iconv is compatible with its POSIX signature],
+      [gl_cv_iconv_nonconst],
+      [AC_COMPILE_IFELSE(
+         [AC_LANG_PROGRAM(
+            [[
 #include <stdlib.h>
 #include <iconv.h>
 extern
 #ifdef __cplusplus
 "C"
 #endif
-#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus)
 size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
-#else
-size_t iconv();
-#endif
-           ]],
-           [[]])],
-        [am_cv_proto_iconv_arg1=""],
-        [am_cv_proto_iconv_arg1="const"])
-      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
-    am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
-    AC_MSG_RESULT([
-         $am_cv_proto_iconv])
-    AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
-      [Define as const if the declaration of iconv() needs const.])
-    dnl Also substitute ICONV_CONST in the gnulib generated <iconv.h>.
-    m4_ifdef([gl_ICONV_H_DEFAULTS],
-      [AC_REQUIRE([gl_ICONV_H_DEFAULTS])
-       if test -n "$am_cv_proto_iconv_arg1"; then
-         ICONV_CONST="const"
-       fi
+            ]],
+            [[]])],
+         [gl_cv_iconv_nonconst=yes],
+         [gl_cv_iconv_nonconst=no])
       ])
+  else
+    dnl When compiling GNU libiconv on a system that does not have iconv yet,
+    dnl pick the POSIX compliant declaration without 'const'.
+    gl_cv_iconv_nonconst=yes
   fi
+  if test $gl_cv_iconv_nonconst = yes; then
+    iconv_arg1=""
+  else
+    iconv_arg1="const"
+  fi
+  AC_DEFINE_UNQUOTED([ICONV_CONST], [$iconv_arg1],
+    [Define as const if the declaration of iconv() needs const.])
+  dnl Also substitute ICONV_CONST in the gnulib generated <iconv.h>.
+  m4_ifdef([gl_ICONV_H_DEFAULTS],
+    [AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+     if test $gl_cv_iconv_nonconst != yes; then
+       ICONV_CONST="const"
+     fi
+    ])
 ])
diff --git a/m4/iconv_h.m4 b/m4/iconv_h.m4
new file mode 100644
index 0000000..2940988
--- /dev/null
+++ b/m4/iconv_h.m4
@@ -0,0 +1,72 @@
+# iconv_h.m4 serial 15
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_ICONV_H],
+[
+  AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+
+  dnl Execute this unconditionally, because ICONV_H may be set by other
+  dnl modules, after this code is executed.
+  gl_CHECK_NEXT_HEADERS([iconv.h])
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use, and which is not
+  dnl guaranteed by C89.
+  gl_WARN_ON_USE_PREPARE([[#include <iconv.h>
+    ]], [iconv iconv_open])
+
+  AC_REQUIRE([AC_C_RESTRICT])
+])
+
+dnl Unconditionally enables the replacement of <iconv.h>.
+AC_DEFUN([gl_REPLACE_ICONV_H],
+[
+  gl_ICONV_H_REQUIRE_DEFAULTS
+  ICONV_H='iconv.h'
+  AM_CONDITIONAL([GL_GENERATE_ICONV_H], [test -n "$ICONV_H"])
+])
+
+# gl_ICONV_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
+AC_DEFUN([gl_ICONV_MODULE_INDICATOR],
+[
+  dnl Ensure to expand the default settings once only.
+  gl_ICONV_H_REQUIRE_DEFAULTS
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+])
+
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_ICONV_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_ICONV_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ICONV])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_ICONV_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_ICONV_H_DEFAULTS],
+[
+  m4_ifdef([gl_ANSI_CXX], [AC_REQUIRE([gl_ANSI_CXX])])
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  ICONV_CONST=;         AC_SUBST([ICONV_CONST])
+  REPLACE_ICONV=0;      AC_SUBST([REPLACE_ICONV])
+  REPLACE_ICONV_OPEN=0; AC_SUBST([REPLACE_ICONV_OPEN])
+  REPLACE_ICONV_UTF=0;  AC_SUBST([REPLACE_ICONV_UTF])
+  ICONV_H='';           AC_SUBST([ICONV_H])
+  m4_ifdef([gl_POSIXCHECK],
+    [ICONV_H='iconv.h'],
+    [if m4_ifdef([gl_ANSI_CXX], [test "$CXX" != no], [false]); then
+       dnl Override <fnmatch.h> always, to support the C++ GNULIB_NAMESPACE.
+       ICONV_H='iconv.h'
+     fi
+    ])
+  AM_CONDITIONAL([GL_GENERATE_ICONV_H], [test -n "$ICONV_H"])
+])
diff --git a/m4/iconv_open.m4 b/m4/iconv_open.m4
new file mode 100644
index 0000000..61b6af4
--- /dev/null
+++ b/m4/iconv_open.m4
@@ -0,0 +1,60 @@
+# iconv_open.m4 serial 16
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ICONV_OPEN],
+[
+  AC_REQUIRE([AM_ICONV])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+  if test "$am_cv_func_iconv" = yes; then
+    dnl Provide the <iconv.h> override, for the sake of the C++ aliases.
+    gl_REPLACE_ICONV_H
+    dnl Test whether iconv_open accepts standardized encoding names.
+    dnl We know that GNU libiconv and GNU libc do.
+    AC_EGREP_CPP([gnu_iconv], [
+      #include <iconv.h>
+      #if defined _LIBICONV_VERSION || (defined __GLIBC__ && !defined __UCLIBC__)
+       gnu_iconv
+      #endif
+      ], [gl_func_iconv_gnu=yes], [gl_func_iconv_gnu=no])
+    if test $gl_func_iconv_gnu = no; then
+      iconv_flavor=
+      case "$host_os" in
+        aix*)         iconv_flavor=ICONV_FLAVOR_AIX ;;
+        irix*)        iconv_flavor=ICONV_FLAVOR_IRIX ;;
+        hpux*)        iconv_flavor=ICONV_FLAVOR_HPUX ;;
+        osf*)         iconv_flavor=ICONV_FLAVOR_OSF ;;
+        solaris*)     iconv_flavor=ICONV_FLAVOR_SOLARIS ;;
+        openedition*) iconv_flavor=ICONV_FLAVOR_ZOS ;;
+      esac
+      if test -n "$iconv_flavor"; then
+        AC_DEFINE_UNQUOTED([ICONV_FLAVOR], [$iconv_flavor],
+          [Define to a symbolic name denoting the flavor of iconv_open()
+           implementation.])
+        gl_REPLACE_ICONV_OPEN
+      fi
+    fi
+    m4_ifdef([gl_FUNC_ICONV_OPEN_UTF_SUPPORT], [
+      gl_FUNC_ICONV_OPEN_UTF_SUPPORT
+      case "$gl_cv_func_iconv_supports_utf" in
+        *yes) ;;
+        *)
+          REPLACE_ICONV_UTF=1
+          AC_DEFINE([REPLACE_ICONV_UTF], [1],
+            [Define if the iconv() functions are enhanced to handle the UTF-{16,32}{BE,LE} encodings.])
+          REPLACE_ICONV=1
+          gl_REPLACE_ICONV_OPEN
+          ;;
+      esac
+    ])
+  fi
+])
+
+AC_DEFUN([gl_REPLACE_ICONV_OPEN],
+[
+  gl_REPLACE_ICONV_H
+  REPLACE_ICONV_OPEN=1
+])
diff --git a/m4/include_next.m4 b/m4/include_next.m4
index 86eb2c9..bdd542b 100644
--- a/m4/include_next.m4
+++ b/m4/include_next.m4
@@ -1,5 +1,5 @@
-# include_next.m4 serial 24
-dnl Copyright (C) 2006-2019 Free Software Foundation, Inc.
+# include_next.m4 serial 26
+dnl Copyright (C) 2006-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -106,19 +106,21 @@
   AC_SUBST([INCLUDE_NEXT])
   AC_SUBST([INCLUDE_NEXT_AS_FIRST_DIRECTIVE])
   AC_SUBST([PRAGMA_SYSTEM_HEADER])
-  AC_CACHE_CHECK([whether system header files limit the line length],
-    [gl_cv_pragma_columns],
-    [dnl HP NonStop systems, which define __TANDEM, have this misfeature.
-     AC_EGREP_CPP([choke me],
+
+  dnl HP NonStop systems, which define __TANDEM, limit the line length
+  dnl after including some system header files.
+  AC_CACHE_CHECK([whether source code line length is unlimited],
+    [gl_cv_source_line_length_unlimited],
+    [AC_EGREP_CPP([choke me],
        [
 #ifdef __TANDEM
 choke me
 #endif
        ],
-       [gl_cv_pragma_columns=yes],
-       [gl_cv_pragma_columns=no])
+       [gl_cv_source_line_length_unlimited=no],
+       [gl_cv_source_line_length_unlimited=yes])
     ])
-  if test $gl_cv_pragma_columns = yes; then
+  if test $gl_cv_source_line_length_unlimited = no; then
     PRAGMA_COLUMNS="#pragma COLUMNS 10000"
   else
     PRAGMA_COLUMNS=
@@ -176,42 +178,40 @@
     [AC_CHECK_HEADERS_ONCE([$1])
     ])
 
-dnl FIXME: gl_next_header and gl_header_exists must be used unquoted
-dnl until we can assume autoconf 2.64 or newer.
   m4_foreach_w([gl_HEADER_NAME], [$1],
     [AS_VAR_PUSHDEF([gl_next_header],
                     [gl_cv_next_]m4_defn([gl_HEADER_NAME]))
      if test $gl_cv_have_include_next = yes; then
-       AS_VAR_SET(gl_next_header, ['<'gl_HEADER_NAME'>'])
+       AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>'])
      else
        AC_CACHE_CHECK(
          [absolute name of <]m4_defn([gl_HEADER_NAME])[>],
-         m4_defn([gl_next_header]),
+         [gl_next_header],
          [m4_if([$2], [check],
             [AS_VAR_PUSHDEF([gl_header_exists],
                             [ac_cv_header_]m4_defn([gl_HEADER_NAME]))
-             if test AS_VAR_GET(gl_header_exists) = yes; then
+             if test AS_VAR_GET([gl_header_exists]) = yes; then
              AS_VAR_POPDEF([gl_header_exists])
             ])
            gl_ABSOLUTE_HEADER_ONE(gl_HEADER_NAME)
            AS_VAR_COPY([gl_header], [gl_cv_absolute_]AS_TR_SH(gl_HEADER_NAME))
-           AS_VAR_SET(gl_next_header, ['"'$gl_header'"'])
+           AS_VAR_SET([gl_next_header], ['"'$gl_header'"'])
           m4_if([$2], [check],
             [else
-               AS_VAR_SET(gl_next_header, ['<'gl_HEADER_NAME'>'])
+               AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>'])
              fi
             ])
          ])
      fi
      AC_SUBST(
        AS_TR_CPP([NEXT_]m4_defn([gl_HEADER_NAME])),
-       [AS_VAR_GET(gl_next_header)])
+       [AS_VAR_GET([gl_next_header])])
      if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
        # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
        gl_next_as_first_directive='<'gl_HEADER_NAME'>'
      else
        # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
-       gl_next_as_first_directive=AS_VAR_GET(gl_next_header)
+       gl_next_as_first_directive=AS_VAR_GET([gl_next_header])
      fi
      AC_SUBST(
        AS_TR_CPP([NEXT_AS_FIRST_DIRECTIVE_]m4_defn([gl_HEADER_NAME])),
diff --git a/m4/inline.m4 b/m4/inline.m4
new file mode 100644
index 0000000..04fc774
--- /dev/null
+++ b/m4/inline.m4
@@ -0,0 +1,40 @@
+# inline.m4 serial 4
+dnl Copyright (C) 2006, 2009-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Test for the 'inline' keyword or equivalent.
+dnl Define 'inline' to a supported equivalent, or to nothing if not supported,
+dnl like AC_C_INLINE does.  Also, define HAVE_INLINE if 'inline' or an
+dnl equivalent is effectively supported, i.e. if the compiler is likely to
+dnl drop unused 'static inline' functions.
+AC_DEFUN([gl_INLINE],
+[
+  AC_REQUIRE([AC_C_INLINE])
+  AC_CACHE_CHECK([whether the compiler generally respects inline],
+    [gl_cv_c_inline_effective],
+    [if test $ac_cv_c_inline = no; then
+       gl_cv_c_inline_effective=no
+     else
+       dnl GCC defines __NO_INLINE__ if not optimizing or if -fno-inline is
+       dnl specified.
+       dnl Use AC_COMPILE_IFELSE here, not AC_EGREP_CPP, because the result
+       dnl depends on optimization flags, which can be in CFLAGS.
+       dnl (AC_EGREP_CPP looks only at the CPPFLAGS.)
+       AC_COMPILE_IFELSE(
+         [AC_LANG_PROGRAM([[]],
+           [[#ifdef __NO_INLINE__
+               #error "inline is not effective"
+             #endif]])],
+         [gl_cv_c_inline_effective=yes],
+         [gl_cv_c_inline_effective=no])
+     fi
+    ])
+  if test $gl_cv_c_inline_effective = yes; then
+    AC_DEFINE([HAVE_INLINE], [1],
+      [Define to 1 if the compiler supports one of the keywords
+       'inline', '__inline__', '__inline' and effectively inlines
+       functions marked as such.])
+  fi
+])
diff --git a/m4/intmax_t.m4 b/m4/intmax_t.m4
index 5ded16e..63c4b41 100644
--- a/m4/intmax_t.m4
+++ b/m4/intmax_t.m4
@@ -1,5 +1,5 @@
-# intmax_t.m4 serial 8
-dnl Copyright (C) 1997-2004, 2006-2007, 2009-2019 Free Software Foundation,
+# intmax_t.m4 serial 9
+dnl Copyright (C) 1997-2004, 2006-2007, 2009-2021 Free Software Foundation,
 dnl Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -19,11 +19,7 @@
   AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
   AC_REQUIRE([gl_AC_HEADER_STDINT_H])
   if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then
-    AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
-    test $ac_cv_type_long_long_int = yes \
-      && ac_type='long long' \
-      || ac_type='long'
-    AC_DEFINE_UNQUOTED([intmax_t], [$ac_type],
+    AC_DEFINE_UNQUOTED([intmax_t], [long long],
      [Define to long or long long if <inttypes.h> and <stdint.h> don't define.])
   else
     AC_DEFINE([HAVE_INTMAX_T], [1],
@@ -57,11 +53,7 @@
     AC_DEFINE([HAVE_INTMAX_T], [1],
       [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
   else
-    AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
-    test $ac_cv_type_long_long_int = yes \
-      && ac_type='long long' \
-      || ac_type='long'
-    AC_DEFINE_UNQUOTED([intmax_t], [$ac_type],
+    AC_DEFINE_UNQUOTED([intmax_t], [long long],
      [Define to long or long long if <stdint.h> and <inttypes.h> don't define.])
   fi
 ])
diff --git a/m4/inttypes-pri.m4 b/m4/inttypes-pri.m4
deleted file mode 100644
index 38fe118..0000000
--- a/m4/inttypes-pri.m4
+++ /dev/null
@@ -1,42 +0,0 @@
-# inttypes-pri.m4 serial 7 (gettext-0.18.2)
-dnl Copyright (C) 1997-2002, 2006, 2008-2019 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl From Bruno Haible.
-
-AC_PREREQ([2.53])
-
-# Define PRI_MACROS_BROKEN if <inttypes.h> exists and defines the PRI*
-# macros to non-string values.  This is the case on AIX 4.3.3.
-
-AC_DEFUN([gt_INTTYPES_PRI],
-[
-  AC_CHECK_HEADERS([inttypes.h])
-  if test $ac_cv_header_inttypes_h = yes; then
-    AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken],
-      [gt_cv_inttypes_pri_broken],
-      [
-        AC_COMPILE_IFELSE(
-          [AC_LANG_PROGRAM(
-             [[
-#include <inttypes.h>
-#ifdef PRId32
-char *p = PRId32;
-#endif
-             ]],
-             [[]])],
-          [gt_cv_inttypes_pri_broken=no],
-          [gt_cv_inttypes_pri_broken=yes])
-      ])
-  fi
-  if test "$gt_cv_inttypes_pri_broken" = yes; then
-    AC_DEFINE_UNQUOTED([PRI_MACROS_BROKEN], [1],
-      [Define if <inttypes.h> exists and defines unusable PRI* macros.])
-    PRI_MACROS_BROKEN=1
-  else
-    PRI_MACROS_BROKEN=0
-  fi
-  AC_SUBST([PRI_MACROS_BROKEN])
-])
diff --git a/m4/inttypes.m4 b/m4/inttypes.m4
index c58a1be..64b1de5 100644
--- a/m4/inttypes.m4
+++ b/m4/inttypes.m4
@@ -1,5 +1,5 @@
-# inttypes.m4 serial 27
-dnl Copyright (C) 2006-2019 Free Software Foundation, Inc.
+# inttypes.m4 serial 35
+dnl Copyright (C) 2006-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -7,7 +7,7 @@
 dnl From Derek Price, Bruno Haible.
 dnl Test whether <inttypes.h> is supported or must be substituted.
 
-AC_DEFUN([gl_INTTYPES_H],
+AC_DEFUN_ONCE([gl_INTTYPES_H],
 [
   AC_REQUIRE([gl_INTTYPES_INCOMPLETE])
   gl_INTTYPES_PRI_SCN
@@ -28,17 +28,26 @@
   dnl corresponding gnulib module is not in use.
   gl_WARN_ON_USE_PREPARE([[#include <inttypes.h>
     ]], [imaxabs imaxdiv strtoimax strtoumax])
+
+  AC_REQUIRE([AC_C_RESTRICT])
 ])
 
 # Ensure that the PRI* and SCN* macros are defined appropriately.
 AC_DEFUN([gl_INTTYPES_PRI_SCN],
 [
-  AC_REQUIRE([gt_INTTYPES_PRI])
-
   PRIPTR_PREFIX=
   if test -n "$STDINT_H"; then
-    dnl Using the gnulib <stdint.h>. It always defines intptr_t to 'long'.
-    PRIPTR_PREFIX='"l"'
+    dnl Using the gnulib <stdint.h>. It defines intptr_t to 'long' or
+    dnl 'long long', depending on _WIN64.
+    AC_COMPILE_IFELSE(
+      [AC_LANG_PROGRAM([[
+         #ifdef _WIN64
+         LLP64
+         #endif
+         ]])
+      ],
+      [PRIPTR_PREFIX='"l"'],
+      [PRIPTR_PREFIX='"ll"'])
   else
     dnl Using the system's <stdint.h>.
     for glpfx in '' l ll I64; do
@@ -113,10 +122,8 @@
 
             #if $2
              #define CONDITION ($3)
-            #elif HAVE_LONG_LONG_INT
-             #define CONDITION ($4)
             #else
-             #define CONDITION 0
+             #define CONDITION ($4)
             #endif
             int test[CONDITION ? 1 : -1];]])],
        [gl_cv_test_$1=yes],
@@ -129,19 +136,34 @@
   AC_SUBST([$1])
 ])
 
+# gl_INTTYPES_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_INTTYPES_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_INTTYPES_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_INTTYPES_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_INTTYPES_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_INTTYPES_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_IMAXABS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_IMAXDIV])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOIMAX])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOUMAX])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_INTTYPES_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_INTTYPES_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_INTTYPES_H_DEFAULTS],
 [
-  GNULIB_IMAXABS=0;      AC_SUBST([GNULIB_IMAXABS])
-  GNULIB_IMAXDIV=0;      AC_SUBST([GNULIB_IMAXDIV])
-  GNULIB_STRTOIMAX=0;    AC_SUBST([GNULIB_STRTOIMAX])
-  GNULIB_STRTOUMAX=0;    AC_SUBST([GNULIB_STRTOUMAX])
   dnl Assume proper GNU behavior unless another module says otherwise.
   HAVE_DECL_IMAXABS=1;   AC_SUBST([HAVE_DECL_IMAXABS])
   HAVE_DECL_IMAXDIV=1;   AC_SUBST([HAVE_DECL_IMAXDIV])
@@ -152,7 +174,6 @@
   REPLACE_STRTOUMAX=0;   AC_SUBST([REPLACE_STRTOUMAX])
   INT32_MAX_LT_INTMAX_MAX=1;  AC_SUBST([INT32_MAX_LT_INTMAX_MAX])
   INT64_MAX_EQ_LONG_MAX='defined _LP64';  AC_SUBST([INT64_MAX_EQ_LONG_MAX])
-  PRI_MACROS_BROKEN=0;   AC_SUBST([PRI_MACROS_BROKEN])
   PRIPTR_PREFIX=__PRIPTR_PREFIX;  AC_SUBST([PRIPTR_PREFIX])
   UINT32_MAX_LT_UINTMAX_MAX=1;  AC_SUBST([UINT32_MAX_LT_UINTMAX_MAX])
   UINT64_MAX_EQ_ULONG_MAX='defined _LP64';  AC_SUBST([UINT64_MAX_EQ_ULONG_MAX])
diff --git a/m4/inttypes_h.m4 b/m4/inttypes_h.m4
index d20422a..672a93e 100644
--- a/m4/inttypes_h.m4
+++ b/m4/inttypes_h.m4
@@ -1,5 +1,5 @@
 # inttypes_h.m4 serial 10
-dnl Copyright (C) 1997-2004, 2006, 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 1997-2004, 2006, 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/isnan.m4 b/m4/isnan.m4
index f4d185b..e0bc03f 100644
--- a/m4/isnan.m4
+++ b/m4/isnan.m4
@@ -1,5 +1,5 @@
 # isnan.m4 serial 5
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/isnand.m4 b/m4/isnand.m4
index 31af024..fc79f0b 100644
--- a/m4/isnand.m4
+++ b/m4/isnand.m4
@@ -1,5 +1,5 @@
-# isnand.m4 serial 11
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+# isnand.m4 serial 12
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -58,7 +58,7 @@
       AC_LINK_IFELSE(
         [AC_LANG_PROGRAM(
            [[#include <math.h>
-             #if __GNUC__ >= 4
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
              # undef isnand
              # define isnand(x) __builtin_isnan ((double)(x))
              #elif defined isnan
@@ -81,7 +81,7 @@
       AC_LINK_IFELSE(
         [AC_LANG_PROGRAM(
            [[#include <math.h>
-             #if __GNUC__ >= 4
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
              # undef isnand
              # define isnand(x) __builtin_isnan ((double)(x))
              #else
diff --git a/m4/isnanf.m4 b/m4/isnanf.m4
index f03f37d..d0f6a56 100644
--- a/m4/isnanf.m4
+++ b/m4/isnanf.m4
@@ -1,5 +1,5 @@
-# isnanf.m4 serial 15
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+# isnanf.m4 serial 18
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -74,9 +74,9 @@
       AC_LINK_IFELSE(
         [AC_LANG_PROGRAM(
            [[#include <math.h>
-             #if __GNUC__ >= 4
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
              # undef isnanf
-             # define isnanf(x) __builtin_isnanf ((float)(x))
+             # define isnanf(x) __builtin_isnan ((float)(x))
              #elif defined isnan
              # undef isnanf
              # define isnanf(x) isnan ((float)(x))
@@ -99,9 +99,9 @@
       AC_LINK_IFELSE(
         [AC_LANG_PROGRAM(
            [[#include <math.h>
-             #if __GNUC__ >= 4
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
              # undef isnanf
-             # define isnanf(x) __builtin_isnanf ((float)(x))
+             # define isnanf(x) __builtin_isnan ((float)(x))
              #elif defined isnan
              # undef isnanf
              # define isnanf(x) isnan ((float)(x))
@@ -127,9 +127,9 @@
       AC_RUN_IFELSE(
         [AC_LANG_SOURCE([[
 #include <math.h>
-#if __GNUC__ >= 4
+#if (__GNUC__ >= 4) || (__clang_major__ >= 4)
 # undef isnanf
-# define isnanf(x) __builtin_isnanf ((float)(x))
+# define isnanf(x) __builtin_isnan ((float)(x))
 #elif defined isnan
 # undef isnanf
 # define isnanf(x) isnan ((float)(x))
@@ -169,7 +169,7 @@
       m.value = NaN ();
       /* Set the bits below the exponent to 01111...111.  */
       m.word[0] &= -1U << FLT_EXPBIT0_BIT;
-      m.word[0] |= 1U << (FLT_EXPBIT0_BIT - 1) - 1;
+      m.word[0] |= (1U << (FLT_EXPBIT0_BIT - 1)) - 1;
       if (!isnanf (m.value))
         result |= 4;
     }
diff --git a/m4/isnanl.m4 b/m4/isnanl.m4
index 3bef867..1ef16f5 100644
--- a/m4/isnanl.m4
+++ b/m4/isnanl.m4
@@ -1,5 +1,5 @@
-# isnanl.m4 serial 20
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+# isnanl.m4 serial 22
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -68,9 +68,9 @@
       AC_LINK_IFELSE(
         [AC_LANG_PROGRAM(
            [[#include <math.h>
-             #if __GNUC__ >= 4
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
              # undef isnanl
-             # define isnanl(x) __builtin_isnanl ((long double)(x))
+             # define isnanl(x) __builtin_isnan ((long double)(x))
              #elif defined isnan
              # undef isnanl
              # define isnanl(x) isnan ((long double)(x))
@@ -93,9 +93,9 @@
       AC_LINK_IFELSE(
         [AC_LANG_PROGRAM(
            [[#include <math.h>
-             #if __GNUC__ >= 4
+             #if (__GNUC__ >= 4) || (__clang_major__ >= 4)
              # undef isnanl
-             # define isnanl(x) __builtin_isnanl ((long double)(x))
+             # define isnanl(x) __builtin_isnan ((long double)(x))
              #elif defined isnan
              # undef isnanl
              # define isnanl(x) isnan ((long double)(x))
@@ -123,9 +123,9 @@
 #include <float.h>
 #include <limits.h>
 #include <math.h>
-#if __GNUC__ >= 4
+#if (__GNUC__ >= 4) || (__clang_major__ >= 4)
 # undef isnanl
-# define isnanl(x) __builtin_isnanl ((long double)(x))
+# define isnanl(x) __builtin_isnan ((long double)(x))
 #elif defined isnan
 # undef isnanl
 # define isnanl(x) isnan ((long double)(x))
diff --git a/m4/iswblank.m4 b/m4/iswblank.m4
index ad216cc..84fd838 100644
--- a/m4/iswblank.m4
+++ b/m4/iswblank.m4
@@ -1,5 +1,5 @@
-# iswblank.m4 serial 4
-dnl Copyright (C) 2011-2019 Free Software Foundation, Inc.
+# iswblank.m4 serial 5
+dnl Copyright (C) 2011-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -12,16 +12,9 @@
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
   AC_CHECK_FUNCS_ONCE([iswblank])
   AC_CHECK_DECLS([iswblank], , , [[
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
-   before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-#include <wctype.h>
-]])
+    #include <wchar.h>
+    #include <wctype.h>
+  ]])
   if test $ac_cv_func_iswblank = no; then
     HAVE_ISWBLANK=0
     if test $ac_cv_have_decl_iswblank = yes; then
diff --git a/m4/iswdigit.m4 b/m4/iswdigit.m4
new file mode 100644
index 0000000..de4ffce
--- /dev/null
+++ b/m4/iswdigit.m4
@@ -0,0 +1,115 @@
+# iswdigit.m4 serial 3
+dnl Copyright (C) 2020-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ISWDIGIT],
+[
+  AC_REQUIRE([gl_WCTYPE_H_DEFAULTS])
+  AC_REQUIRE([gl_WCTYPE_H])
+  AC_REQUIRE([gt_LOCALE_FR])
+  AC_REQUIRE([gt_LOCALE_JA])
+  AC_REQUIRE([gt_LOCALE_FR_UTF8])
+  AC_REQUIRE([gt_LOCALE_ZH_CN])
+
+  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+    dnl <wctype.h> redefines iswdigit already.
+    REPLACE_ISWDIGIT="$REPLACE_ISWCNTRL"
+  else
+    AC_CACHE_CHECK([whether iswdigit is ISO C compliant],
+      [gl_cv_func_iswdigit_works],
+      [
+       dnl Initial guess, used when cross-compiling or when no suitable locale
+       dnl is present.
+changequote(,)dnl
+       case "$host_os" in
+         # Guess no on FreeBSD, NetBSD, Solaris, native Windows.
+         freebsd* | dragonfly* | netbsd* | solaris* | mingw*)
+           gl_cv_func_iswdigit_works="guessing no" ;;
+         # Guess yes otherwise.
+         *) gl_cv_func_iswdigit_works="guessing yes" ;;
+       esac
+changequote([,])dnl
+       if test $LOCALE_FR != none || test $LOCALE_JA != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_ZH_CN != none; then
+         AC_RUN_IFELSE(
+           [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+/* Returns the value of iswdigit for the multibyte character s[0..n-1].  */
+static int
+for_character (const char *s, size_t n)
+{
+  mbstate_t state;
+  wchar_t wc;
+  size_t ret;
+
+  memset (&state, '\0', sizeof (mbstate_t));
+  wc = (wchar_t) 0xBADFACE;
+  ret = mbrtowc (&wc, s, n, &state);
+  if (ret != n)
+    abort ();
+
+  return iswdigit (wc);
+}
+
+int
+main (int argc, char *argv[])
+{
+  int is;
+  int result = 0;
+
+  if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
+    {
+      /* This fails on mingw, MSVC 14.  */
+      /* U+00B2 SUPERSCRIPT TWO */
+      is = for_character ("\262", 1);
+      if (!(is == 0))
+        result |= 1;
+    }
+  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+    {
+      /* This fails on NetBSD 8.0.  */
+      /* U+FF11 FULLWIDTH DIGIT ONE */
+      is = for_character ("\243\261", 2);
+      if (!(is == 0))
+        result |= 2;
+    }
+  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+    {
+      /* This fails on FreeBSD 13.0, NetBSD 8.0, MSVC 14.  */
+      /* U+0663 ARABIC-INDIC DIGIT THREE */
+      is = for_character ("\331\243", 2);
+      if (!(is == 0))
+        result |= 4;
+      /* This fails on FreeBSD 13.0, NetBSD 8.0, MSVC 14.  */
+      /* U+FF11 FULLWIDTH DIGIT ONE */
+      is = for_character ("\357\274\221", 3);
+      if (!(is == 0))
+        result |= 8;
+    }
+  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+    {
+      /* This fails on NetBSD 8.0, Solaris 10, Solaris 11.4.  */
+      /* U+FF11 FULLWIDTH DIGIT ONE */
+      is = for_character ("\243\261", 2);
+      if (!(is == 0))
+        result |= 16;
+    }
+  return result;
+}]])],
+           [gl_cv_func_iswdigit_works=yes],
+           [gl_cv_func_iswdigit_works=no],
+           [:])
+       fi
+      ])
+    case "$gl_cv_func_iswdigit_works" in
+      *yes) ;;
+      *) REPLACE_ISWDIGIT=1 ;;
+    esac
+  fi
+])
diff --git a/m4/iswxdigit.m4 b/m4/iswxdigit.m4
new file mode 100644
index 0000000..f96d735
--- /dev/null
+++ b/m4/iswxdigit.m4
@@ -0,0 +1,106 @@
+# iswxdigit.m4 serial 3
+dnl Copyright (C) 2020-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ISWXDIGIT],
+[
+  AC_REQUIRE([gl_WCTYPE_H_DEFAULTS])
+  AC_REQUIRE([gl_WCTYPE_H])
+  AC_REQUIRE([gt_LOCALE_JA])
+  AC_REQUIRE([gt_LOCALE_FR_UTF8])
+  AC_REQUIRE([gt_LOCALE_ZH_CN])
+
+  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+    dnl <wctype.h> redefines iswxdigit already.
+    REPLACE_ISWXDIGIT="$REPLACE_ISWCNTRL"
+  else
+    AC_CACHE_CHECK([whether iswxdigit is ISO C compliant],
+      [gl_cv_func_iswxdigit_works],
+      [
+       dnl Initial guess, used when cross-compiling or when no suitable locale
+       dnl is present.
+changequote(,)dnl
+       case "$host_os" in
+         # Guess no on FreeBSD, NetBSD, Solaris, native Windows.
+         freebsd* | dragonfly* | netbsd* | solaris* | mingw*)
+           gl_cv_func_iswxdigit_works="guessing no" ;;
+         # Guess yes otherwise.
+         *) gl_cv_func_iswxdigit_works="guessing yes" ;;
+       esac
+changequote([,])dnl
+       if test $LOCALE_JA != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_ZH_CN != none; then
+         AC_RUN_IFELSE(
+           [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+/* Returns the value of iswxdigit for the multibyte character s[0..n-1].  */
+static int
+for_character (const char *s, size_t n)
+{
+  mbstate_t state;
+  wchar_t wc;
+  size_t ret;
+
+  memset (&state, '\0', sizeof (mbstate_t));
+  wc = (wchar_t) 0xBADFACE;
+  ret = mbrtowc (&wc, s, n, &state);
+  if (ret != n)
+    abort ();
+
+  return iswxdigit (wc);
+}
+
+int
+main (int argc, char *argv[])
+{
+  int is;
+  int result = 0;
+
+  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+    {
+      /* This fails on NetBSD 8.0.  */
+      /* U+FF21 FULLWIDTH LATIN CAPITAL LETTER A */
+      is = for_character ("\243\301", 2);
+      if (!(is == 0))
+        result |= 1;
+    }
+  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+    {
+      /* This fails on FreeBSD 13.0.  */
+      /* U+0663 ARABIC-INDIC DIGIT THREE */
+      is = for_character ("\331\243", 2);
+      if (!(is == 0))
+        result |= 2;
+      /* This fails on MSVC 14.  */
+      /* U+FF21 FULLWIDTH LATIN CAPITAL LETTER A */
+      is = for_character ("\357\274\241", 3);
+      if (!(is == 0))
+        result |= 4;
+    }
+  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+    {
+      /* This fails on Solaris 10, Solaris 11.4.  */
+      /* U+FF11 FULLWIDTH DIGIT ONE */
+      is = for_character ("\243\261", 2);
+      if (!(is == 0))
+        result |= 8;
+    }
+  return result;
+}]])],
+           [gl_cv_func_iswxdigit_works=yes],
+           [gl_cv_func_iswxdigit_works=no],
+           [:])
+       fi
+      ])
+    case "$gl_cv_func_iswxdigit_works" in
+      *yes) ;;
+      *) REPLACE_ISWXDIGIT=1 ;;
+    esac
+  fi
+])
diff --git a/m4/javacomp.m4 b/m4/javacomp.m4
index a6bb708..dcaab05 100644
--- a/m4/javacomp.m4
+++ b/m4/javacomp.m4
@@ -1,5 +1,5 @@
-# javacomp.m4 serial 17
-dnl Copyright (C) 2001-2003, 2006-2007, 2009-2019 Free Software Foundation,
+# javacomp.m4 serial 18
+dnl Copyright (C) 2001-2003, 2006-2007, 2009-2021 Free Software Foundation,
 dnl Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -85,7 +85,7 @@
 
 AC_DEFUN([gt_JAVACOMP],
 [
-  ifelse([$2], [], [AC_REQUIRE([gt_JAVAEXEC])], [])
+  m4_if([$2], [], [AC_REQUIRE([gt_JAVAEXEC])], [])
   AC_EGREP_CPP([yes], [
 #if defined _WIN32 || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
   yes
@@ -95,7 +95,7 @@
   test -n "$source_version" || {
     AC_MSG_ERROR([missing source-version argument to gt_@&t@JAVACOMP])
   }
-  ifelse([$2], [],
+  m4_if([$2], [],
     [if test -n "$HAVE_JAVAEXEC"; then
        dnl Use $CONF_JAVA to determine the JVM's version.
 changequote(,)dnl
diff --git a/m4/javaexec.m4 b/m4/javaexec.m4
index 82d1853..556af3c 100644
--- a/m4/javaexec.m4
+++ b/m4/javaexec.m4
@@ -1,5 +1,5 @@
-# javaexec.m4 serial 6
-dnl Copyright (C) 2001-2003, 2006, 2009-2019 Free Software Foundation, Inc.
+# javaexec.m4 serial 7
+dnl Copyright (C) 2001-2003, 2006, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -37,14 +37,14 @@
     popdef([AC_MSG_RESULT])dnl
     popdef([AC_CHECKING])dnl
     popdef([AC_MSG_CHECKING])dnl
-    ifelse([$1], , , [
+    m4_if([$1], , , [
       save_CLASSPATH="$CLASSPATH"
       CLASSPATH="$2"${CLASSPATH+"$CLASSPATH_SEPARATOR$CLASSPATH"}
       ])
     export CLASSPATH
     if test -n "$HAVE_GIJ_IN_PATH" \
        && gij --version >/dev/null 2>/dev/null \
-       ifelse([$1], , , [&& {
+       m4_if([$1], , , [&& {
          echo "$as_me:__oline__: gij $1" >&AS_MESSAGE_LOG_FD
          gij $1 >&AS_MESSAGE_LOG_FD 2>&1
        }]); then
@@ -53,7 +53,7 @@
     else
       if test -n "$HAVE_JAVA_IN_PATH" \
          && java -version >/dev/null 2>/dev/null \
-         ifelse([$1], , , [&& {
+         m4_if([$1], , , [&& {
            echo "$as_me:__oline__: gij $1" >&AS_MESSAGE_LOG_FD
            java $1 >&AS_MESSAGE_LOG_FD 2>&1
          }]); then
@@ -62,7 +62,7 @@
       else
         if test -n "$HAVE_JRE_IN_PATH" \
            && (jre >/dev/null 2>/dev/null || test $? = 1) \
-           ifelse([$1], , , [&& {
+           m4_if([$1], , , [&& {
              echo "$as_me:__oline__: gij $1" >&AS_MESSAGE_LOG_FD
              jre $1 >&AS_MESSAGE_LOG_FD 2>&1
            }]); then
@@ -71,7 +71,7 @@
         else
           if test -n "$HAVE_JVIEW_IN_PATH" \
              && (jview -? >/dev/null 2>/dev/null || test $? = 1) \
-             ifelse([$1], , , [&& {
+             m4_if([$1], , , [&& {
                echo "$as_me:__oline__: gij $1" >&AS_MESSAGE_LOG_FD
                jview $1 >&AS_MESSAGE_LOG_FD 2>&1
              }]); then
@@ -83,7 +83,7 @@
         fi
       fi
     fi
-    ifelse([$1], , , [
+    m4_if([$1], , , [
       CLASSPATH="$save_CLASSPATH"
     ])
   fi
diff --git a/m4/jm-winsz1.m4 b/m4/jm-winsz1.m4
index 3ec0130..6353b96 100644
--- a/m4/jm-winsz1.m4
+++ b/m4/jm-winsz1.m4
@@ -1,6 +1,6 @@
 # serial 12
 
-# Copyright (C) 1996, 1999, 2001-2002, 2004, 2006, 2009-2019 Free Software
+# Copyright (C) 1996, 1999, 2001-2002, 2004, 2006, 2009-2021 Free Software
 # Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
diff --git a/m4/jm-winsz2.m4 b/m4/jm-winsz2.m4
index b0aa9dd..ed839cb 100644
--- a/m4/jm-winsz2.m4
+++ b/m4/jm-winsz2.m4
@@ -1,6 +1,6 @@
 # serial 8
 
-# Copyright (C) 1996, 1999, 2001, 2004, 2009-2019 Free Software Foundation,
+# Copyright (C) 1996, 1999, 2001, 2004, 2009-2021 Free Software Foundation,
 # Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
diff --git a/m4/largefile.m4 b/m4/largefile.m4
index c6dd9a1..fbde5e6 100644
--- a/m4/largefile.m4
+++ b/m4/largefile.m4
@@ -1,28 +1,47 @@
 # Enable large files on systems where this is not the default.
+# Enable support for files on Linux file systems with 64-bit inode numbers.
 
-# Copyright 1992-1996, 1998-2019 Free Software Foundation, Inc.
+# Copyright 1992-1996, 1998-2021 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# The following implementation works around a problem in autoconf <= 2.69;
+# The following macro works around a problem in Autoconf's AC_FUNC_FSEEKO:
+# It does not set _LARGEFILE_SOURCE=1 on HP-UX/ia64 32-bit, although this
+# setting of _LARGEFILE_SOURCE is needed so that <stdio.h> declares fseeko
+# and ftello in C++ mode as well.
+AC_DEFUN([gl_SET_LARGEFILE_SOURCE],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_FUNC_FSEEKO
+  case "$host_os" in
+    hpux*)
+      AC_DEFINE([_LARGEFILE_SOURCE], [1],
+        [Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2).])
+      ;;
+  esac
+])
+
+# Work around a problem in Autoconf through at least 2.71 on glibc 2.34+
+# with _TIME_BITS.  Also, work around a problem in autoconf <= 2.69:
 # AC_SYS_LARGEFILE does not configure for large inodes on Mac OS X 10.5,
 # or configures them incorrectly in some cases.
-m4_version_prereq([2.70], [] ,[
+m4_version_prereq([2.70], [], [
 
 # _AC_SYS_LARGEFILE_TEST_INCLUDES
 # -------------------------------
 m4_define([_AC_SYS_LARGEFILE_TEST_INCLUDES],
-[@%:@include <sys/types.h>
+[#include <sys/types.h>
  /* Check that off_t can represent 2**63 - 1 correctly.
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
     since some C++ compilers masquerading as C compilers
     incorrectly reject 9223372036854775807.  */
-@%:@define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
   int off_t_is_large[[(LARGE_OFF_T % 2147483629 == 721
                        && LARGE_OFF_T % 2147483647 == 1)
                       ? 1 : -1]];[]dnl
 ])
+])# m4_version_prereq 2.70
 
 
 # _AC_SYS_LARGEFILE_MACRO_VALUE(C-MACRO, VALUE,
@@ -37,7 +56,8 @@
     [AC_LANG_PROGRAM([$5], [$6])],
     [$3=no; break])
   m4_ifval([$6], [AC_LINK_IFELSE], [AC_COMPILE_IFELSE])(
-    [AC_LANG_PROGRAM([@%:@define $1 $2
+    [AC_LANG_PROGRAM([#undef $1
+#define $1 $2
 $5], [$6])],
     [$3=$2; break])
   $3=unknown
@@ -57,12 +77,14 @@
 # one must use special compiler options to get large-file access to work.
 # For more details about this brain damage please see:
 # http://www.unix.org/version2/whatsnew/lfs20mar.html
+# Additionally, on Linux file systems with 64-bit inodes a file that happens
+# to have a 64-bit inode number cannot be accessed by 32-bit applications on
+# Linux x86/x86_64.  This can occur with file systems such as XFS and NFS.
 AC_DEFUN([AC_SYS_LARGEFILE],
 [AC_ARG_ENABLE(largefile,
                [  --disable-largefile     omit support for large files])
-if test "$enable_largefile" != no; then
-
-  AC_CACHE_CHECK([for special C compiler options needed for large files],
+AS_IF([test "$enable_largefile" != no],
+ [AC_CACHE_CHECK([for special C compiler options needed for large files],
     ac_cv_sys_largefile_CC,
     [ac_cv_sys_largefile_CC=no
      if test "$GCC" != yes; then
@@ -87,18 +109,15 @@
     ac_cv_sys_file_offset_bits,
     [Number of bits in a file offset, on hosts where this is settable.],
     [_AC_SYS_LARGEFILE_TEST_INCLUDES])
-  if test $ac_cv_sys_file_offset_bits = unknown; then
-    _AC_SYS_LARGEFILE_MACRO_VALUE(_LARGE_FILES, 1,
-      ac_cv_sys_large_files,
-      [Define for large files, on AIX-style hosts.],
-      [_AC_SYS_LARGEFILE_TEST_INCLUDES])
-  fi
-
-  AC_DEFINE([_DARWIN_USE_64_BIT_INODE], [1],
-    [Enable large inode numbers on Mac OS X 10.5.])
-fi
+  AS_CASE([$ac_cv_sys_file_offset_bits],
+    [unknown],
+      [_AC_SYS_LARGEFILE_MACRO_VALUE([_LARGE_FILES], [1],
+         [ac_cv_sys_large_files],
+         [Define for large files, on AIX-style hosts.],
+         [_AC_SYS_LARGEFILE_TEST_INCLUDES])],
+    [64],
+      [gl_YEAR2038_BODY([])])])
 ])# AC_SYS_LARGEFILE
-])# m4_version_prereq 2.70
 
 # Enable large files on systems where this is implemented by Gnulib, not by the
 # system headers.
diff --git a/m4/ldexp.m4 b/m4/ldexp.m4
index 3763168..cb7ce64 100644
--- a/m4/ldexp.m4
+++ b/m4/ldexp.m4
@@ -1,5 +1,5 @@
 # ldexp.m4 serial 1
-dnl Copyright (C) 2010-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2010-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/ldexpl.m4 b/m4/ldexpl.m4
index bae6de3..5dabf76 100644
--- a/m4/ldexpl.m4
+++ b/m4/ldexpl.m4
@@ -1,5 +1,5 @@
 # ldexpl.m4 serial 17
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4
index a187196..076358d 100644
--- a/m4/lib-ld.m4
+++ b/m4/lib-ld.m4
@@ -1,5 +1,5 @@
-# lib-ld.m4 serial 9
-dnl Copyright (C) 1996-2003, 2009-2019 Free Software Foundation, Inc.
+# lib-ld.m4 serial 10
+dnl Copyright (C) 1996-2003, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -122,7 +122,7 @@
       *-*-aix*)
         AC_COMPILE_IFELSE(
           [AC_LANG_SOURCE(
-             [[#if defined __powerpc64__ || defined _ARCH_PPC64
+             [[#if defined __powerpc64__ || defined __LP64__
                 int ok;
                #else
                 error fail
diff --git a/m4/lib-link.m4 b/m4/lib-link.m4
index b9fa364..787efab 100644
--- a/m4/lib-link.m4
+++ b/m4/lib-link.m4
@@ -1,5 +1,5 @@
-# lib-link.m4 serial 31
-dnl Copyright (C) 2001-2019 Free Software Foundation, Inc.
+# lib-link.m4 serial 32
+dnl Copyright (C) 2001-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -631,7 +631,20 @@
                     ;;
                   -l*)
                     dnl Handle this in the next round.
-                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    dnl But on GNU systems, ignore -lc options, because
+                    dnl   - linking with libc is the default anyway,
+                    dnl   - linking with libc.a may produce an error
+                    dnl     "/usr/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `/usr/lib/libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink with -pie"
+                    dnl     or may produce an executable that always crashes, see
+                    dnl     <https://lists.gnu.org/archive/html/grep-devel/2020-09/msg00052.html>.
+                    dep=`echo "X$dep" | sed -e 's/^X-l//'`
+                    if test "X$dep" != Xc \
+                       || case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) false ;;
+                            *)                          true ;;
+                          esac; then
+                      names_next_round="$names_next_round $dep"
+                    fi
                     ;;
                   *.la)
                     dnl Handle this in the next round. Throw away the .la's
diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4
index 52ea5ae..3c94db0 100644
--- a/m4/lib-prefix.m4
+++ b/m4/lib-prefix.m4
@@ -1,5 +1,5 @@
-# lib-prefix.m4 serial 17
-dnl Copyright (C) 2001-2005, 2008-2019 Free Software Foundation, Inc.
+# lib-prefix.m4 serial 19
+dnl Copyright (C) 2001-2005, 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -180,8 +180,8 @@
        ],
        [gl_cv_elf=yes],
        [gl_cv_elf=no])
-     ])
-  if test $gl_cv_elf; then
+    ])
+  if test $gl_cv_elf = yes; then
     # Extract the ELF class of a file (5th byte) in decimal.
     # Cf. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header
     if od -A x < /dev/null >/dev/null 2>/dev/null; then
@@ -198,20 +198,23 @@
         echo
       }
     fi
+    # Use 'expr', not 'test', to compare the values of func_elfclass, because on
+    # Solaris 11 OpenIndiana and Solaris 11 OmniOS, the result is 001 or 002,
+    # not 1 or 2.
 changequote(,)dnl
     case $HOST_CPU_C_ABI_32BIT in
       yes)
         # 32-bit ABI.
         acl_is_expected_elfclass ()
         {
-          test "`func_elfclass | sed -e 's/[ 	]//g'`" = 1
+          expr "`func_elfclass | sed -e 's/[ 	]//g'`" = 1 > /dev/null
         }
         ;;
       no)
         # 64-bit ABI.
         acl_is_expected_elfclass ()
         {
-          test "`func_elfclass | sed -e 's/[ 	]//g'`" = 2
+          expr "`func_elfclass | sed -e 's/[ 	]//g'`" = 2 > /dev/null
         }
         ;;
       *)
diff --git a/m4/libtextstyle-optional.m4 b/m4/libtextstyle-optional.m4
index 16c8f16..2422de1 100644
--- a/m4/libtextstyle-optional.m4
+++ b/m4/libtextstyle-optional.m4
@@ -1,14 +1,18 @@
-# libtextstyle-optional.m4 serial 1
-dnl Copyright (C) 2019 Free Software Foundation, Inc.
+# libtextstyle-optional.m4 serial 2
+dnl Copyright (C) 2019-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl From Bruno Haible.
 
-dnl gl_LIBTEXTSTYLE_OPTIONAL
-dnl Searches for an installed libtextstyle or uses the included source code
-dnl parts that define only part of the API and does not do any styling.
+dnl gl_LIBTEXTSTYLE_OPTIONAL([MINIMUM-VERSION])
+dnl Searches for an installed libtextstyle with version >= MINIMUM-VERSION
+dnl   MINIMUM-VERSION = 0.20      - the first release in 2019
+dnl   MINIMUM-VERSION = 0.20.5    - adds hyperlink support and ostream_printf
+dnl   MINIMUM-VERSION unspecified - the newest release
+dnl or uses the included source code parts that define only part of the API
+dnl and do not do any styling.
 dnl If found, it sets and AC_SUBSTs HAVE_LIBTEXTSTYLE=yes and the LIBTEXTSTYLE
 dnl and LTLIBTEXTSTYLE variables, and augments the CPPFLAGS variable, and
 dnl #defines HAVE_LIBTEXTSTYLE to 1.
@@ -17,7 +21,7 @@
 
 AC_DEFUN([gl_LIBTEXTSTYLE_OPTIONAL],
 [
-  AC_REQUIRE([gl_LIBTEXTSTYLE])
+  gl_LIBTEXTSTYLE([$1])
   if test $HAVE_LIBTEXTSTYLE = yes; then
     TEXTSTYLE_H=
   else
diff --git a/m4/libtextstyle.m4 b/m4/libtextstyle.m4
index b71e786..6ae5261 100644
--- a/m4/libtextstyle.m4
+++ b/m4/libtextstyle.m4
@@ -1,13 +1,16 @@
-# libtextstyle.m4 serial 1
-dnl Copyright (C) 2019 Free Software Foundation, Inc.
+# libtextstyle.m4 serial 3
+dnl Copyright (C) 2019-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl From Bruno Haible.
 
-dnl gl_LIBTEXTSTYLE
-dnl Searches for an installed libtextstyle.
+dnl gl_LIBTEXTSTYLE([MINIMUM-VERSION])
+dnl Searches for an installed libtextstyle with version >= MINIMUM-VERSION.
+dnl   MINIMUM-VERSION = 0.20      - the first release in 2019
+dnl   MINIMUM-VERSION = 0.20.5    - adds hyperlink support and ostream_printf
+dnl   MINIMUM-VERSION unspecified - the newest release
 dnl If found, it sets and AC_SUBSTs HAVE_LIBTEXTSTYLE=yes and the LIBTEXTSTYLE
 dnl and LTLIBTEXTSTYLE variables, and augments the CPPFLAGS variable, and
 dnl #defines HAVE_LIBTEXTSTYLE to 1.
@@ -16,7 +19,41 @@
 
 AC_DEFUN([gl_LIBTEXTSTYLE],
 [
+  AC_REQUIRE([gl_LIBTEXTSTYLE_INITIALIZE])
+  AC_REQUIRE([gl_LIBTEXTSTYLE_SEARCH])
+  pushdef([MINVERSION], m4_if([$1], [], [gl_LIBTEXTSTYLE_NEWEST_VERSION], [$1]))
+  dnl Signal a fatal error if MINVERSION is not among the allowed values.
+  m4_if(m4_if(MINVERSION, [0.20], [x], [])m4_if(MINVERSION, [0.20.5], [x], []), [],
+    [m4_fatal([The argument to gl_LIBTEXTSTYLE or gl_LIBTEXTSTYLE_OPTIONAL is not one of the expected values.])])
+  dnl Store the specified minimum version in gl_libtextstyle_minversion.
+  dnl (This needs to be outside the m4_if. m4_divert_text inside m4_if does
+  dnl not work reliably in Autoconf 2.69.)
+  m4_divert_text([INIT_PREPARE],
+    [gl_libtextstyle_minversion="$gl_libtextstyle_minversion MINVERSION "])
+  popdef([MINVERSION])
+])
+
+AC_DEFUN([gl_LIBTEXTSTYLE_NEWEST_VERSION], [0.20.5])
+
+AC_DEFUN([gl_LIBTEXTSTYLE_INITIALIZE],
+[
+  m4_divert_text([DEFAULTS], [gl_libtextstyle_minversion=' 0.20 '])
+])
+
+AC_DEFUN([gl_LIBTEXTSTYLE_SEARCH],
+[
+  dnl $gl_libtextstyle_minversion evaluates to a space-separated list of
+  dnl specified minimum versions. The maximum of these requirement matters.
+  case "$gl_libtextstyle_minversion" in
+    *" 0.20.5 "*)
+      snippet='styled_ostream_t s = term_styled_ostream_create(1,"",TTYCTL_AUTO,"");
+               ostream_printf(s,"%d",42);'
+      ;;
+    *" 0.20 "*)
+      snippet='term_styled_ostream_create(1,"",TTYCTL_AUTO,"");'
+      ;;
+  esac
   AC_LIB_HAVE_LINKFLAGS([textstyle], [],
-    [#include <textstyle.h>], [term_styled_ostream_create(1,"",TTYCTL_AUTO,"");],
+    [#include <textstyle.h>], [$snippet],
     [no])
 ])
diff --git a/m4/libunistring-base.m4 b/m4/libunistring-base.m4
index 829e71c..657bc0d 100644
--- a/m4/libunistring-base.m4
+++ b/m4/libunistring-base.m4
@@ -1,5 +1,5 @@
 # libunistring-base.m4 serial 5
-dnl Copyright (C) 2010-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2010-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/limits-h.m4 b/m4/limits-h.m4
index 68f724c..00c9fe9 100644
--- a/m4/limits-h.m4
+++ b/m4/limits-h.m4
@@ -1,6 +1,6 @@
 dnl Check whether limits.h has needed features.
 
-dnl Copyright 2016-2019 Free Software Foundation, Inc.
+dnl Copyright 2016-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -11,7 +11,7 @@
 [
   gl_CHECK_NEXT_HEADERS([limits.h])
 
-  AC_CACHE_CHECK([whether limits.h has LLONG_MAX, WORD_BIT, ULLONG_WIDTH etc.],
+  AC_CACHE_CHECK([whether limits.h has WORD_BIT, BOOL_WIDTH etc.],
     [gl_cv_header_limits_width],
     [AC_COMPILE_IFELSE(
        [AC_LANG_PROGRAM(
@@ -22,6 +22,7 @@
             long long llm = LLONG_MAX;
             int wb = WORD_BIT;
             int ullw = ULLONG_WIDTH;
+            int bw = BOOL_WIDTH;
           ]])],
        [gl_cv_header_limits_width=yes],
        [gl_cv_header_limits_width=no])])
diff --git a/m4/localcharset.m4 b/m4/localcharset.m4
index 2a7f82d..04389fc 100644
--- a/m4/localcharset.m4
+++ b/m4/localcharset.m4
@@ -1,5 +1,5 @@
 # localcharset.m4 serial 8
-dnl Copyright (C) 2002, 2004, 2006, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2002, 2004, 2006, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/locale-fr.m4 b/m4/locale-fr.m4
index cfa068d..b61df7e 100644
--- a/m4/locale-fr.m4
+++ b/m4/locale-fr.m4
@@ -1,5 +1,5 @@
-# locale-fr.m4 serial 19
-dnl Copyright (C) 2003, 2005-2019 Free Software Foundation, Inc.
+# locale-fr.m4 serial 20
+dnl Copyright (C) 2003, 2005-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -12,8 +12,7 @@
   AC_REQUIRE([AC_CANONICAL_HOST])
   AC_REQUIRE([AM_LANGINFO_CODESET])
   AC_CACHE_CHECK([for a traditional french locale], [gt_cv_locale_fr], [
-    AC_LANG_CONFTEST([AC_LANG_SOURCE([
-changequote(,)dnl
+    AC_LANG_CONFTEST([AC_LANG_SOURCE([[
 #include <locale.h>
 #include <time.h>
 #if HAVE_LANGINFO_CODESET
@@ -78,8 +77,7 @@
   return 0;
 #endif
 }
-changequote([,])dnl
-      ])])
+      ]])])
     if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
       case "$host_os" in
         # Handle native Windows specially, because there setlocale() interprets
@@ -143,8 +141,7 @@
 [
   AC_REQUIRE([AM_LANGINFO_CODESET])
   AC_CACHE_CHECK([for a french Unicode locale], [gt_cv_locale_fr_utf8], [
-    AC_LANG_CONFTEST([AC_LANG_SOURCE([
-changequote(,)dnl
+    AC_LANG_CONFTEST([AC_LANG_SOURCE([[
 #include <locale.h>
 #include <time.h>
 #if HAVE_LANGINFO_CODESET
@@ -206,8 +203,7 @@
 #endif
   return 0;
 }
-changequote([,])dnl
-      ])])
+      ]])])
     if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
       case "$host_os" in
         # Handle native Windows specially, because there setlocale() interprets
diff --git a/m4/locale-ja.m4 b/m4/locale-ja.m4
index 487f68b..cd94288 100644
--- a/m4/locale-ja.m4
+++ b/m4/locale-ja.m4
@@ -1,5 +1,5 @@
-# locale-ja.m4 serial 14
-dnl Copyright (C) 2003, 2005-2019 Free Software Foundation, Inc.
+# locale-ja.m4 serial 15
+dnl Copyright (C) 2003, 2005-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -12,8 +12,7 @@
   AC_REQUIRE([AC_CANONICAL_HOST])
   AC_REQUIRE([AM_LANGINFO_CODESET])
   AC_CACHE_CHECK([for a traditional japanese locale], [gt_cv_locale_ja], [
-    AC_LANG_CONFTEST([AC_LANG_SOURCE([
-changequote(,)dnl
+    AC_LANG_CONFTEST([AC_LANG_SOURCE([[
 #include <locale.h>
 #include <time.h>
 #if HAVE_LANGINFO_CODESET
@@ -82,8 +81,7 @@
   return 0;
 #endif
 }
-changequote([,])dnl
-      ])])
+      ]])])
     if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
       case "$host_os" in
         # Handle native Windows specially, because there setlocale() interprets
diff --git a/m4/locale-zh.m4 b/m4/locale-zh.m4
index 8b81326..1228be8 100644
--- a/m4/locale-zh.m4
+++ b/m4/locale-zh.m4
@@ -1,5 +1,5 @@
-# locale-zh.m4 serial 14
-dnl Copyright (C) 2003, 2005-2019 Free Software Foundation, Inc.
+# locale-zh.m4 serial 15
+dnl Copyright (C) 2003, 2005-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -12,8 +12,7 @@
   AC_REQUIRE([AC_CANONICAL_HOST])
   AC_REQUIRE([AM_LANGINFO_CODESET])
   AC_CACHE_CHECK([for a transitional chinese locale], [gt_cv_locale_zh_CN], [
-    AC_LANG_CONFTEST([AC_LANG_SOURCE([
-changequote(,)dnl
+    AC_LANG_CONFTEST([AC_LANG_SOURCE([[
 #include <locale.h>
 #include <stdlib.h>
 #include <time.h>
@@ -83,8 +82,7 @@
   return 0;
 #endif
 }
-changequote([,])dnl
-      ])])
+      ]])])
     if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
       case "$host_os" in
         # Handle native Windows specially, because there setlocale() interprets
diff --git a/m4/locale_h.m4 b/m4/locale_h.m4
new file mode 100644
index 0000000..444a381
--- /dev/null
+++ b/m4/locale_h.m4
@@ -0,0 +1,174 @@
+# locale_h.m4 serial 28
+dnl Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_LOCALE_H],
+[
+  dnl Ensure to expand the default settings once only, before all statements
+  dnl that occur in other macros.
+  AC_REQUIRE([gl_LOCALE_H_DEFAULTS])
+
+  dnl Persuade glibc <locale.h> to define locale_t and the int_p_*, int_n_*
+  dnl members of 'struct lconv'.
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+  dnl If <stddef.h> is replaced, then <locale.h> must also be replaced.
+  AC_REQUIRE([gl_STDDEF_H])
+
+  AC_REQUIRE([gl_LOCALE_T])
+
+  dnl Solaris 11.0 defines the int_p_*, int_n_* members of 'struct lconv'
+  dnl only if _LCONV_C99 is defined.
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  case "$host_os" in
+    solaris*)
+      AC_DEFINE([_LCONV_C99], [1], [Define to 1 on Solaris.])
+      ;;
+  esac
+
+  AC_CACHE_CHECK([whether locale.h conforms to POSIX:2001],
+    [gl_cv_header_locale_h_posix2001],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <locale.h>
+            int x = LC_MESSAGES;
+            int y = sizeof (((struct lconv *) 0)->decimal_point);]],
+          [[]])],
+       [gl_cv_header_locale_h_posix2001=yes],
+       [gl_cv_header_locale_h_posix2001=no])])
+
+  dnl Check whether 'struct lconv' is complete.
+  dnl Bionic libc's 'struct lconv' is just a dummy.
+  dnl On OpenBSD 4.9, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.x,
+  dnl mingw, MSVC 9, it lacks the int_p_* and int_n_* members.
+  AC_CACHE_CHECK([whether struct lconv is properly defined],
+    [gl_cv_sys_struct_lconv_ok],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <locale.h>
+            struct lconv l;
+            int x = sizeof (l.decimal_point);
+            int y = sizeof (l.int_p_cs_precedes);]],
+          [[]])],
+       [gl_cv_sys_struct_lconv_ok=yes],
+       [gl_cv_sys_struct_lconv_ok=no])
+    ])
+  if test $gl_cv_sys_struct_lconv_ok = no; then
+    dnl On native Windows with MSVC, merely define these member names as macros.
+    dnl This avoids trouble in C++ mode.
+    case "$host_os" in
+      mingw*)
+        AC_EGREP_CPP([Special], [
+#ifdef _MSC_VER
+ Special
+#endif
+          ],
+          [],
+          [REPLACE_STRUCT_LCONV=1])
+        ;;
+      *) REPLACE_STRUCT_LCONV=1 ;;
+    esac
+  fi
+
+  dnl <locale.h> is always overridden, because of GNULIB_POSIXCHECK.
+  gl_NEXT_HEADERS([locale.h])
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use.
+  gl_WARN_ON_USE_PREPARE([[#include <locale.h>
+/* Some systems provide declarations in a non-standard header.  */
+#if HAVE_XLOCALE_H
+# include <xlocale.h>
+#endif
+    ]],
+    [setlocale newlocale duplocale freelocale])
+])
+
+dnl Checks to determine whether the system has the locale_t type,
+dnl and how to obtain it.
+AC_DEFUN([gl_LOCALE_T],
+[
+  dnl Persuade glibc and Solaris <locale.h> to define locale_t.
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+  dnl Check whether use of locale_t requires inclusion of <xlocale.h>,
+  dnl e.g. on Mac OS X 10.5. If <locale.h> does not define locale_t by
+  dnl itself, we assume that <xlocale.h> will do so.
+  AC_CACHE_CHECK([whether locale.h defines locale_t],
+    [gl_cv_header_locale_has_locale_t],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <locale.h>
+            locale_t x;]],
+          [[]])],
+       [gl_cv_header_locale_has_locale_t=yes],
+       [gl_cv_header_locale_has_locale_t=no])
+    ])
+
+  dnl Check for <xlocale.h>.
+  AC_CHECK_HEADERS_ONCE([xlocale.h])
+  if test $ac_cv_header_xlocale_h = yes; then
+    HAVE_XLOCALE_H=1
+    if test $gl_cv_header_locale_has_locale_t = yes; then
+      gl_cv_header_locale_h_needs_xlocale_h=no
+    else
+      gl_cv_header_locale_h_needs_xlocale_h=yes
+    fi
+    HAVE_LOCALE_T=1
+  else
+    HAVE_XLOCALE_H=0
+    gl_cv_header_locale_h_needs_xlocale_h=no
+    if test $gl_cv_header_locale_has_locale_t = yes; then
+      HAVE_LOCALE_T=1
+    else
+      HAVE_LOCALE_T=0
+    fi
+  fi
+  AC_SUBST([HAVE_XLOCALE_H])
+])
+
+# gl_LOCALE_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
+AC_DEFUN([gl_LOCALE_MODULE_INDICATOR],
+[
+  dnl Ensure to expand the default settings once only.
+  gl_LOCALE_H_REQUIRE_DEFAULTS
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+  dnl Define it also as a C macro, for the benefit of the unit tests.
+  gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_LOCALE_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_LOCALE_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOCALECONV])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SETLOCALE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SETLOCALE_NULL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DUPLOCALE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOCALENAME])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_LOCALE_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_LOCALE_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_LOCALE_H_DEFAULTS],
+[
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  HAVE_NEWLOCALE=1;       AC_SUBST([HAVE_NEWLOCALE])
+  HAVE_DUPLOCALE=1;       AC_SUBST([HAVE_DUPLOCALE])
+  HAVE_FREELOCALE=1;      AC_SUBST([HAVE_FREELOCALE])
+  REPLACE_LOCALECONV=0;   AC_SUBST([REPLACE_LOCALECONV])
+  REPLACE_SETLOCALE=0;    AC_SUBST([REPLACE_SETLOCALE])
+  REPLACE_NEWLOCALE=0;    AC_SUBST([REPLACE_NEWLOCALE])
+  REPLACE_DUPLOCALE=0;    AC_SUBST([REPLACE_DUPLOCALE])
+  REPLACE_FREELOCALE=0;   AC_SUBST([REPLACE_FREELOCALE])
+  REPLACE_STRUCT_LCONV=0; AC_SUBST([REPLACE_STRUCT_LCONV])
+  LOCALENAME_ENHANCE_LOCALE_FUNCS=0; AC_SUBST([LOCALENAME_ENHANCE_LOCALE_FUNCS])
+])
diff --git a/m4/localtime-buffer.m4 b/m4/localtime-buffer.m4
deleted file mode 100644
index 6d99828..0000000
--- a/m4/localtime-buffer.m4
+++ /dev/null
@@ -1,21 +0,0 @@
-# localtime-buffer.m4 serial 1
-dnl Copyright (C) 2017-2019 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_LOCALTIME_BUFFER_DEFAULTS],
-[
-  NEED_LOCALTIME_BUFFER=0
-])
-
-dnl Macro invoked from other modules, to signal that the compilation of
-dnl module 'localtime-buffer' is needed.
-AC_DEFUN([gl_LOCALTIME_BUFFER_NEEDED],
-[
-  AC_REQUIRE([gl_LOCALTIME_BUFFER_DEFAULTS])
-  AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
-  NEED_LOCALTIME_BUFFER=1
-  REPLACE_GMTIME=1
-  REPLACE_LOCALTIME=1
-])
diff --git a/m4/lock.m4 b/m4/lock.m4
index 93b76fa..d68c12d 100644
--- a/m4/lock.m4
+++ b/m4/lock.m4
@@ -1,5 +1,5 @@
 # lock.m4 serial 14
-dnl Copyright (C) 2005-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2005-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/longlong.m4 b/m4/longlong.m4
deleted file mode 100644
index 08d0e36..0000000
--- a/m4/longlong.m4
+++ /dev/null
@@ -1,113 +0,0 @@
-# longlong.m4 serial 18
-dnl Copyright (C) 1999-2007, 2009-2019 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl From Paul Eggert.
-
-AC_PREREQ([2.62])
-
-# Define HAVE_LONG_LONG_INT if 'long long int' works.
-# This can be faster than what's in Autoconf 2.62 through 2.68.
-
-# Note: If the type 'long long int' exists but is only 32 bits large
-# (as on some very old compilers), HAVE_LONG_LONG_INT will not be
-# defined. In this case you can treat 'long long int' like 'long int'.
-
-AC_DEFUN([AC_TYPE_LONG_LONG_INT],
-[
-  AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
-  AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
-     [ac_cv_type_long_long_int=yes
-      if test "x${ac_cv_prog_cc_c99-no}" = xno; then
-        ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int
-        if test $ac_cv_type_long_long_int = yes; then
-          dnl Catch a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
-          dnl If cross compiling, assume the bug is not important, since
-          dnl nobody cross compiles for this platform as far as we know.
-          AC_RUN_IFELSE(
-            [AC_LANG_PROGRAM(
-               [[@%:@include <limits.h>
-                 @%:@ifndef LLONG_MAX
-                 @%:@ define HALF \
-                          (1LL << (sizeof (long long int) * CHAR_BIT - 2))
-                 @%:@ define LLONG_MAX (HALF - 1 + HALF)
-                 @%:@endif]],
-               [[long long int n = 1;
-                 int i;
-                 for (i = 0; ; i++)
-                   {
-                     long long int m = n << i;
-                     if (m >> i != n)
-                       return 1;
-                     if (LLONG_MAX / 2 < m)
-                       break;
-                   }
-                 return 0;]])],
-            [],
-            [ac_cv_type_long_long_int=no],
-            [:])
-        fi
-      fi])
-  if test $ac_cv_type_long_long_int = yes; then
-    AC_DEFINE([HAVE_LONG_LONG_INT], [1],
-      [Define to 1 if the system has the type 'long long int'.])
-  fi
-])
-
-# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
-# This can be faster than what's in Autoconf 2.62 through 2.68.
-
-# Note: If the type 'unsigned long long int' exists but is only 32 bits
-# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
-# will not be defined. In this case you can treat 'unsigned long long int'
-# like 'unsigned long int'.
-
-AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
-[
-  AC_CACHE_CHECK([for unsigned long long int],
-    [ac_cv_type_unsigned_long_long_int],
-    [ac_cv_type_unsigned_long_long_int=yes
-     if test "x${ac_cv_prog_cc_c99-no}" = xno; then
-       AC_LINK_IFELSE(
-         [_AC_TYPE_LONG_LONG_SNIPPET],
-         [],
-         [ac_cv_type_unsigned_long_long_int=no])
-     fi])
-  if test $ac_cv_type_unsigned_long_long_int = yes; then
-    AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
-      [Define to 1 if the system has the type 'unsigned long long int'.])
-  fi
-])
-
-# Expands to a C program that can be used to test for simultaneous support
-# of 'long long' and 'unsigned long long'. We don't want to say that
-# 'long long' is available if 'unsigned long long' is not, or vice versa,
-# because too many programs rely on the symmetry between signed and unsigned
-# integer types (excluding 'bool').
-AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
-[
-  AC_LANG_PROGRAM(
-    [[/* For now, do not test the preprocessor; as of 2007 there are too many
-         implementations with broken preprocessors.  Perhaps this can
-         be revisited in 2012.  In the meantime, code should not expect
-         #if to work with literals wider than 32 bits.  */
-      /* Test literals.  */
-      long long int ll = 9223372036854775807ll;
-      long long int nll = -9223372036854775807LL;
-      unsigned long long int ull = 18446744073709551615ULL;
-      /* Test constant expressions.   */
-      typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
-                     ? 1 : -1)];
-      typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
-                     ? 1 : -1)];
-      int i = 63;]],
-    [[/* Test availability of runtime routines for shift and division.  */
-      long long int llmax = 9223372036854775807ll;
-      unsigned long long int ullmax = 18446744073709551615ull;
-      return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
-              | (llmax / ll) | (llmax % ll)
-              | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
-              | (ullmax / ull) | (ullmax % ull));]])
-])
diff --git a/m4/lstat.m4 b/m4/lstat.m4
index be6d3f2..62e9db2 100644
--- a/m4/lstat.m4
+++ b/m4/lstat.m4
@@ -1,6 +1,6 @@
 # serial 33
 
-# Copyright (C) 1997-2001, 2003-2019 Free Software Foundation, Inc.
+# Copyright (C) 1997-2001, 2003-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
diff --git a/m4/m4.m4 b/m4/m4.m4
index e10197b..5146230 100644
--- a/m4/m4.m4
+++ b/m4/m4.m4
@@ -1,6 +1,6 @@
 # m4.m4 serial 12
 
-# Copyright (C) 2000, 2006-2017 Free Software Foundation, Inc.
+# Copyright (C) 2000, 2006-2017, 2020 Free Software Foundation, Inc.
 
 # Copying and distribution of this file, with or without modification,
 # are permitted in any medium without royalty provided the copyright
diff --git a/m4/malloc.m4 b/m4/malloc.m4
index 6555dee..972e808 100644
--- a/m4/malloc.m4
+++ b/m4/malloc.m4
@@ -1,27 +1,21 @@
-# malloc.m4 serial 20
-dnl Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+# malloc.m4 serial 27
+dnl Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 # This is adapted with modifications from upstream Autoconf here:
-# https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=04be2b7a29d65d9a08e64e8e56e594c91749598c
+# https://git.savannah.gnu.org/cgit/autoconf.git/tree/lib/autoconf/functions.m4?id=v2.70#n949
 AC_DEFUN([_AC_FUNC_MALLOC_IF],
 [
-  AC_REQUIRE([AC_HEADER_STDC])dnl
   AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles
-  AC_CHECK_HEADERS([stdlib.h])
-  AC_CACHE_CHECK([for GNU libc compatible malloc],
+  AC_CACHE_CHECK([whether malloc (0) returns nonnull],
     [ac_cv_func_malloc_0_nonnull],
     [AC_RUN_IFELSE(
        [AC_LANG_PROGRAM(
-          [[#if defined STDC_HEADERS || defined HAVE_STDLIB_H
-            # include <stdlib.h>
-            #else
-            char *malloc ();
-            #endif
+          [[#include <stdlib.h>
           ]],
-          [[char *p = malloc (0);
+          [[void *p = malloc (0);
             int result = !p;
             free (p);
             return result;]])
@@ -30,75 +24,151 @@
        [ac_cv_func_malloc_0_nonnull=no],
        [case "$host_os" in
           # Guess yes on platforms where we know the result.
-          *-gnu* | gnu* | *-musl* | freebsd* | netbsd* | openbsd* \
-          | hpux* | solaris* | cygwin* | mingw*)
+          *-gnu* | freebsd* | netbsd* | openbsd* | bitrig* \
+          | gnu* | *-musl* | midnightbsd* \
+          | hpux* | solaris* | cygwin* | mingw* | msys* )
             ac_cv_func_malloc_0_nonnull="guessing yes" ;;
           # If we don't know, obey --enable-cross-guesses.
           *) ac_cv_func_malloc_0_nonnull="$gl_cross_guess_normal" ;;
         esac
        ])
     ])
-  case "$ac_cv_func_malloc_0_nonnull" in
-    *yes)
-      $1
-      ;;
-    *)
-      $2
-      ;;
-  esac
+  AS_CASE([$ac_cv_func_malloc_0_nonnull], [*yes], [$1], [$2])
 ])# _AC_FUNC_MALLOC_IF
 
 # gl_FUNC_MALLOC_GNU
 # ------------------
-# Test whether 'malloc (0)' is handled like in GNU libc, and replace malloc if
-# it is not.
+# Replace malloc if it is not compatible with GNU libc.
 AC_DEFUN([gl_FUNC_MALLOC_GNU],
 [
   AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
-  dnl _AC_FUNC_MALLOC_IF is defined in Autoconf.
-  _AC_FUNC_MALLOC_IF(
-    [AC_DEFINE([HAVE_MALLOC_GNU], [1],
-               [Define to 1 if your system has a GNU libc compatible 'malloc'
-                function, and to 0 otherwise.])],
-    [AC_DEFINE([HAVE_MALLOC_GNU], [0])
-     REPLACE_MALLOC=1
+  AC_REQUIRE([gl_FUNC_MALLOC_POSIX])
+  if test $REPLACE_MALLOC = 0; then
+    _AC_FUNC_MALLOC_IF([], [REPLACE_MALLOC=1])
+  fi
+])
+
+# gl_FUNC_MALLOC_PTRDIFF
+# ----------------------
+# Test whether malloc (N) reliably fails when N exceeds PTRDIFF_MAX,
+# and replace malloc otherwise.
+AC_DEFUN([gl_FUNC_MALLOC_PTRDIFF],
+[
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  AC_REQUIRE([gl_CHECK_MALLOC_PTRDIFF])
+  test "$gl_cv_malloc_ptrdiff" = yes || REPLACE_MALLOC=1
+])
+
+# Test whether malloc, realloc, calloc refuse to create objects
+# larger than what can be expressed in ptrdiff_t.
+# Set gl_cv_func_malloc_gnu to yes or no accordingly.
+AC_DEFUN([gl_CHECK_MALLOC_PTRDIFF],
+[
+  AC_CACHE_CHECK([whether malloc is ptrdiff_t safe],
+    [gl_cv_malloc_ptrdiff],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <stdint.h>
+          ]],
+          [[/* 64-bit ptrdiff_t is so wide that no practical platform
+               can exceed it.  */
+            #define WIDE_PTRDIFF (PTRDIFF_MAX >> 31 >> 31 != 0)
+
+            /* On rare machines where size_t fits in ptrdiff_t there
+               is no problem.  */
+            #define NARROW_SIZE (SIZE_MAX <= PTRDIFF_MAX)
+
+            /* glibc 2.30 and later malloc refuses to exceed ptrdiff_t
+               bounds even on 32-bit platforms.  We don't know which
+               non-glibc systems are safe.  */
+            #define KNOWN_SAFE (2 < __GLIBC__ + (30 <= __GLIBC_MINOR__))
+
+            #if WIDE_PTRDIFF || NARROW_SIZE || KNOWN_SAFE
+              return 0;
+            #else
+              #error "malloc might not be ptrdiff_t safe"
+              syntax error
+            #endif
+          ]])],
+       [gl_cv_malloc_ptrdiff=yes],
+       [gl_cv_malloc_ptrdiff=no])
     ])
 ])
 
 # gl_FUNC_MALLOC_POSIX
 # --------------------
 # Test whether 'malloc' is POSIX compliant (sets errno to ENOMEM when it
-# fails), and replace malloc if it is not.
+# fails, and doesn't mess up with ptrdiff_t overflow), and replace
+# malloc if it is not.
 AC_DEFUN([gl_FUNC_MALLOC_POSIX],
 [
   AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  AC_REQUIRE([gl_FUNC_MALLOC_PTRDIFF])
   AC_REQUIRE([gl_CHECK_MALLOC_POSIX])
-  if test $gl_cv_func_malloc_posix = yes; then
+  if test "$gl_cv_func_malloc_posix" = yes; then
     AC_DEFINE([HAVE_MALLOC_POSIX], [1],
-      [Define if the 'malloc' function is POSIX compliant.])
+      [Define if malloc, realloc, and calloc set errno on allocation failure.])
   else
     REPLACE_MALLOC=1
   fi
 ])
 
-# Test whether malloc, realloc, calloc are POSIX compliant,
+# Test whether malloc, realloc, calloc set errno to ENOMEM on failure.
 # Set gl_cv_func_malloc_posix to yes or no accordingly.
 AC_DEFUN([gl_CHECK_MALLOC_POSIX],
 [
-  AC_CACHE_CHECK([whether malloc, realloc, calloc are POSIX compliant],
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_CACHE_CHECK([whether malloc, realloc, calloc set errno on failure],
     [gl_cv_func_malloc_posix],
     [
       dnl It is too dangerous to try to allocate a large amount of memory:
       dnl some systems go to their knees when you do that. So assume that
-      dnl all Unix implementations of the function are POSIX compliant.
-      AC_COMPILE_IFELSE(
-        [AC_LANG_PROGRAM(
-           [[]],
-           [[#if defined _WIN32 && ! defined __CYGWIN__
-             choke me
-             #endif
-            ]])],
-        [gl_cv_func_malloc_posix=yes],
-        [gl_cv_func_malloc_posix=no])
+      dnl all Unix implementations of the function set errno on failure,
+      dnl except on those platforms where we have seen 'test-malloc-gnu',
+      dnl 'test-realloc-gnu', 'test-calloc-gnu' fail.
+      case "$host_os" in
+        mingw*)
+          gl_cv_func_malloc_posix=no ;;
+        irix* | solaris*)
+          dnl On IRIX 6.5, the three functions return NULL with errno unset
+          dnl when the argument is larger than PTRDIFF_MAX.
+          dnl On Solaris 11.3, the three functions return NULL with errno set
+          dnl to EAGAIN, not ENOMEM, when the argument is larger than
+          dnl PTRDIFF_MAX.
+          dnl Here is a test program:
+m4_divert_push([KILL])
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#define ptrdiff_t long
+#ifndef PTRDIFF_MAX
+# define PTRDIFF_MAX ((ptrdiff_t) ((1UL << (8 * sizeof (ptrdiff_t) - 1)) - 1))
+#endif
+
+int main ()
+{
+  void *p;
+
+  fprintf (stderr, "PTRDIFF_MAX = %lu\n", (unsigned long) PTRDIFF_MAX);
+
+  errno = 0;
+  p = malloc ((unsigned long) PTRDIFF_MAX + 1);
+  fprintf (stderr, "p=%p errno=%d\n", p, errno);
+
+  errno = 0;
+  p = calloc (PTRDIFF_MAX / 2 + 1, 2);
+  fprintf (stderr, "p=%p errno=%d\n", p, errno);
+
+  errno = 0;
+  p = realloc (NULL, (unsigned long) PTRDIFF_MAX + 1);
+  fprintf (stderr, "p=%p errno=%d\n", p, errno);
+
+  return 0;
+}
+m4_divert_pop([KILL])
+          gl_cv_func_malloc_posix=no ;;
+        *)
+          gl_cv_func_malloc_posix=yes ;;
+      esac
     ])
 ])
diff --git a/m4/malloca.m4 b/m4/malloca.m4
index 820f40a..06ed2c6 100644
--- a/m4/malloca.m4
+++ b/m4/malloca.m4
@@ -1,5 +1,5 @@
-# malloca.m4 serial 1
-dnl Copyright (C) 2003-2004, 2006-2007, 2009-2019 Free Software Foundation,
+# malloca.m4 serial 2
+dnl Copyright (C) 2003-2004, 2006-2007, 2009-2021 Free Software Foundation,
 dnl Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -11,5 +11,4 @@
   dnl @ALLOCA@ and @LTALLOCA@.
   dnl gl_FUNC_ALLOCA   dnl Already brought in by the module dependencies.
   AC_REQUIRE([gl_EEMALLOC])
-  AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
 ])
diff --git a/m4/math_h.m4 b/m4/math_h.m4
index 3d5af84..b3a10c3 100644
--- a/m4/math_h.m4
+++ b/m4/math_h.m4
@@ -1,16 +1,16 @@
-# math_h.m4 serial 119
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+# math_h.m4 serial 125
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
-AC_DEFUN([gl_MATH_H],
+AC_DEFUN_ONCE([gl_MATH_H],
 [
   AC_REQUIRE([gl_MATH_H_DEFAULTS])
   gl_CHECK_NEXT_HEADERS([math.h])
 
   AC_CACHE_CHECK([whether NAN macro works], [gl_cv_header_math_nan_works],
-    [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <math.h>]],
+    [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <math.h>]],
       [[/* Solaris 10 has a broken definition of NAN.  Other platforms
         fail to provide NAN, or provide it only in C99 mode; this
         test only needs to fail when NAN is provided but wrong.  */
@@ -25,7 +25,7 @@
     REPLACE_NAN=1
   fi
   AC_CACHE_CHECK([whether HUGE_VAL works], [gl_cv_header_math_huge_val_works],
-    [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <math.h>]],
+    [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <math.h>]],
       [[/* Solaris 10 has a broken definition of HUGE_VAL.  */
          double d = HUGE_VAL;
          return d == 0;]])],
@@ -53,288 +53,310 @@
      tanf tanl tanhf trunc truncf truncl])
 ])
 
+# gl_MATH_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_MATH_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_MATH_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_MATH_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_MATH_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_MATH_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ACOSF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ACOSL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ASINF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ASINL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ATANF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ATANL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ATAN2F])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CBRT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CBRTF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CBRTL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CEIL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CEILF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CEILL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COPYSIGN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COPYSIGNF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COPYSIGNL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COSF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COSL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COSHF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXP2])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXP2F])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXP2L])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPM1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPM1F])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPM1L])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FABSF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FABSL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FLOOR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FLOORF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FLOORL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMA])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMAF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMAL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMOD])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMODF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMODL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREXPF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREXP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREXPL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_HYPOT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_HYPOTF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_HYPOTL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ILOGB])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ILOGBF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ILOGBL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISFINITE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISINF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISNAN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISNANF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISNAND])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISNANL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LDEXPF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LDEXPL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOGF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOGL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG10])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG10F])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG10L])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG1P])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG1PF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG1PL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG2])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG2F])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG2L])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOGB])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOGBF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOGBL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MODF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MODFF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MODFL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POWF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REMAINDER])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REMAINDERF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REMAINDERL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RINT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RINTF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RINTL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ROUND])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ROUNDF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ROUNDL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SIGNBIT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SINF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SINL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SINHF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SQRTF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SQRTL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TANF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TANL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TANHF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TRUNC])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TRUNCF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TRUNCL])
+    dnl Support Microsoft deprecated alias function names by default.
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_J0], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_J1], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_JN], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_Y0], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_Y1], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_YN], [1])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_MATH_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_MATH_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_MATH_H_DEFAULTS],
 [
-  GNULIB_ACOSF=0;      AC_SUBST([GNULIB_ACOSF])
-  GNULIB_ACOSL=0;      AC_SUBST([GNULIB_ACOSL])
-  GNULIB_ASINF=0;      AC_SUBST([GNULIB_ASINF])
-  GNULIB_ASINL=0;      AC_SUBST([GNULIB_ASINL])
-  GNULIB_ATANF=0;      AC_SUBST([GNULIB_ATANF])
-  GNULIB_ATANL=0;      AC_SUBST([GNULIB_ATANL])
-  GNULIB_ATAN2F=0;     AC_SUBST([GNULIB_ATAN2F])
-  GNULIB_CBRT=0;       AC_SUBST([GNULIB_CBRT])
-  GNULIB_CBRTF=0;      AC_SUBST([GNULIB_CBRTF])
-  GNULIB_CBRTL=0;      AC_SUBST([GNULIB_CBRTL])
-  GNULIB_CEIL=0;       AC_SUBST([GNULIB_CEIL])
-  GNULIB_CEILF=0;      AC_SUBST([GNULIB_CEILF])
-  GNULIB_CEILL=0;      AC_SUBST([GNULIB_CEILL])
-  GNULIB_COPYSIGN=0;   AC_SUBST([GNULIB_COPYSIGN])
-  GNULIB_COPYSIGNF=0;  AC_SUBST([GNULIB_COPYSIGNF])
-  GNULIB_COPYSIGNL=0;  AC_SUBST([GNULIB_COPYSIGNL])
-  GNULIB_COSF=0;       AC_SUBST([GNULIB_COSF])
-  GNULIB_COSL=0;       AC_SUBST([GNULIB_COSL])
-  GNULIB_COSHF=0;      AC_SUBST([GNULIB_COSHF])
-  GNULIB_EXPF=0;       AC_SUBST([GNULIB_EXPF])
-  GNULIB_EXPL=0;       AC_SUBST([GNULIB_EXPL])
-  GNULIB_EXP2=0;       AC_SUBST([GNULIB_EXP2])
-  GNULIB_EXP2F=0;      AC_SUBST([GNULIB_EXP2F])
-  GNULIB_EXP2L=0;      AC_SUBST([GNULIB_EXP2L])
-  GNULIB_EXPM1=0;      AC_SUBST([GNULIB_EXPM1])
-  GNULIB_EXPM1F=0;     AC_SUBST([GNULIB_EXPM1F])
-  GNULIB_EXPM1L=0;     AC_SUBST([GNULIB_EXPM1L])
-  GNULIB_FABSF=0;      AC_SUBST([GNULIB_FABSF])
-  GNULIB_FABSL=0;      AC_SUBST([GNULIB_FABSL])
-  GNULIB_FLOOR=0;      AC_SUBST([GNULIB_FLOOR])
-  GNULIB_FLOORF=0;     AC_SUBST([GNULIB_FLOORF])
-  GNULIB_FLOORL=0;     AC_SUBST([GNULIB_FLOORL])
-  GNULIB_FMA=0;        AC_SUBST([GNULIB_FMA])
-  GNULIB_FMAF=0;       AC_SUBST([GNULIB_FMAF])
-  GNULIB_FMAL=0;       AC_SUBST([GNULIB_FMAL])
-  GNULIB_FMOD=0;       AC_SUBST([GNULIB_FMOD])
-  GNULIB_FMODF=0;      AC_SUBST([GNULIB_FMODF])
-  GNULIB_FMODL=0;      AC_SUBST([GNULIB_FMODL])
-  GNULIB_FREXPF=0;     AC_SUBST([GNULIB_FREXPF])
-  GNULIB_FREXP=0;      AC_SUBST([GNULIB_FREXP])
-  GNULIB_FREXPL=0;     AC_SUBST([GNULIB_FREXPL])
-  GNULIB_HYPOT=0;      AC_SUBST([GNULIB_HYPOT])
-  GNULIB_HYPOTF=0;     AC_SUBST([GNULIB_HYPOTF])
-  GNULIB_HYPOTL=0;     AC_SUBST([GNULIB_HYPOTL])
-  GNULIB_ILOGB=0;      AC_SUBST([GNULIB_ILOGB])
-  GNULIB_ILOGBF=0;     AC_SUBST([GNULIB_ILOGBF])
-  GNULIB_ILOGBL=0;     AC_SUBST([GNULIB_ILOGBL])
-  GNULIB_ISFINITE=0;   AC_SUBST([GNULIB_ISFINITE])
-  GNULIB_ISINF=0;      AC_SUBST([GNULIB_ISINF])
-  GNULIB_ISNAN=0;      AC_SUBST([GNULIB_ISNAN])
-  GNULIB_ISNANF=0;     AC_SUBST([GNULIB_ISNANF])
-  GNULIB_ISNAND=0;     AC_SUBST([GNULIB_ISNAND])
-  GNULIB_ISNANL=0;     AC_SUBST([GNULIB_ISNANL])
-  GNULIB_LDEXPF=0;     AC_SUBST([GNULIB_LDEXPF])
-  GNULIB_LDEXPL=0;     AC_SUBST([GNULIB_LDEXPL])
-  GNULIB_LOG=0;        AC_SUBST([GNULIB_LOG])
-  GNULIB_LOGF=0;       AC_SUBST([GNULIB_LOGF])
-  GNULIB_LOGL=0;       AC_SUBST([GNULIB_LOGL])
-  GNULIB_LOG10=0;      AC_SUBST([GNULIB_LOG10])
-  GNULIB_LOG10F=0;     AC_SUBST([GNULIB_LOG10F])
-  GNULIB_LOG10L=0;     AC_SUBST([GNULIB_LOG10L])
-  GNULIB_LOG1P=0;      AC_SUBST([GNULIB_LOG1P])
-  GNULIB_LOG1PF=0;     AC_SUBST([GNULIB_LOG1PF])
-  GNULIB_LOG1PL=0;     AC_SUBST([GNULIB_LOG1PL])
-  GNULIB_LOG2=0;       AC_SUBST([GNULIB_LOG2])
-  GNULIB_LOG2F=0;      AC_SUBST([GNULIB_LOG2F])
-  GNULIB_LOG2L=0;      AC_SUBST([GNULIB_LOG2L])
-  GNULIB_LOGB=0;       AC_SUBST([GNULIB_LOGB])
-  GNULIB_LOGBF=0;      AC_SUBST([GNULIB_LOGBF])
-  GNULIB_LOGBL=0;      AC_SUBST([GNULIB_LOGBL])
-  GNULIB_MODF=0;       AC_SUBST([GNULIB_MODF])
-  GNULIB_MODFF=0;      AC_SUBST([GNULIB_MODFF])
-  GNULIB_MODFL=0;      AC_SUBST([GNULIB_MODFL])
-  GNULIB_POWF=0;       AC_SUBST([GNULIB_POWF])
-  GNULIB_REMAINDER=0;  AC_SUBST([GNULIB_REMAINDER])
-  GNULIB_REMAINDERF=0; AC_SUBST([GNULIB_REMAINDERF])
-  GNULIB_REMAINDERL=0; AC_SUBST([GNULIB_REMAINDERL])
-  GNULIB_RINT=0;       AC_SUBST([GNULIB_RINT])
-  GNULIB_RINTF=0;      AC_SUBST([GNULIB_RINTF])
-  GNULIB_RINTL=0;      AC_SUBST([GNULIB_RINTL])
-  GNULIB_ROUND=0;      AC_SUBST([GNULIB_ROUND])
-  GNULIB_ROUNDF=0;     AC_SUBST([GNULIB_ROUNDF])
-  GNULIB_ROUNDL=0;     AC_SUBST([GNULIB_ROUNDL])
-  GNULIB_SIGNBIT=0;    AC_SUBST([GNULIB_SIGNBIT])
-  GNULIB_SINF=0;       AC_SUBST([GNULIB_SINF])
-  GNULIB_SINL=0;       AC_SUBST([GNULIB_SINL])
-  GNULIB_SINHF=0;      AC_SUBST([GNULIB_SINHF])
-  GNULIB_SQRTF=0;      AC_SUBST([GNULIB_SQRTF])
-  GNULIB_SQRTL=0;      AC_SUBST([GNULIB_SQRTL])
-  GNULIB_TANF=0;       AC_SUBST([GNULIB_TANF])
-  GNULIB_TANL=0;       AC_SUBST([GNULIB_TANL])
-  GNULIB_TANHF=0;      AC_SUBST([GNULIB_TANHF])
-  GNULIB_TRUNC=0;      AC_SUBST([GNULIB_TRUNC])
-  GNULIB_TRUNCF=0;     AC_SUBST([GNULIB_TRUNCF])
-  GNULIB_TRUNCL=0;     AC_SUBST([GNULIB_TRUNCL])
   dnl Assume proper GNU behavior unless another module says otherwise.
-  HAVE_ACOSF=1;                AC_SUBST([HAVE_ACOSF])
-  HAVE_ACOSL=1;                AC_SUBST([HAVE_ACOSL])
-  HAVE_ASINF=1;                AC_SUBST([HAVE_ASINF])
-  HAVE_ASINL=1;                AC_SUBST([HAVE_ASINL])
-  HAVE_ATANF=1;                AC_SUBST([HAVE_ATANF])
-  HAVE_ATANL=1;                AC_SUBST([HAVE_ATANL])
-  HAVE_ATAN2F=1;               AC_SUBST([HAVE_ATAN2F])
-  HAVE_CBRT=1;                 AC_SUBST([HAVE_CBRT])
-  HAVE_CBRTF=1;                AC_SUBST([HAVE_CBRTF])
-  HAVE_CBRTL=1;                AC_SUBST([HAVE_CBRTL])
-  HAVE_COPYSIGN=1;             AC_SUBST([HAVE_COPYSIGN])
-  HAVE_COPYSIGNL=1;            AC_SUBST([HAVE_COPYSIGNL])
-  HAVE_COSF=1;                 AC_SUBST([HAVE_COSF])
-  HAVE_COSL=1;                 AC_SUBST([HAVE_COSL])
-  HAVE_COSHF=1;                AC_SUBST([HAVE_COSHF])
-  HAVE_EXPF=1;                 AC_SUBST([HAVE_EXPF])
-  HAVE_EXPL=1;                 AC_SUBST([HAVE_EXPL])
-  HAVE_EXPM1=1;                AC_SUBST([HAVE_EXPM1])
-  HAVE_EXPM1F=1;               AC_SUBST([HAVE_EXPM1F])
-  HAVE_FABSF=1;                AC_SUBST([HAVE_FABSF])
-  HAVE_FABSL=1;                AC_SUBST([HAVE_FABSL])
-  HAVE_FMA=1;                  AC_SUBST([HAVE_FMA])
-  HAVE_FMAF=1;                 AC_SUBST([HAVE_FMAF])
-  HAVE_FMAL=1;                 AC_SUBST([HAVE_FMAL])
-  HAVE_FMODF=1;                AC_SUBST([HAVE_FMODF])
-  HAVE_FMODL=1;                AC_SUBST([HAVE_FMODL])
-  HAVE_FREXPF=1;               AC_SUBST([HAVE_FREXPF])
-  HAVE_HYPOTF=1;               AC_SUBST([HAVE_HYPOTF])
-  HAVE_HYPOTL=1;               AC_SUBST([HAVE_HYPOTL])
-  HAVE_ILOGB=1;                AC_SUBST([HAVE_ILOGB])
-  HAVE_ILOGBF=1;               AC_SUBST([HAVE_ILOGBF])
-  HAVE_ILOGBL=1;               AC_SUBST([HAVE_ILOGBL])
-  HAVE_ISNANF=1;               AC_SUBST([HAVE_ISNANF])
-  HAVE_ISNAND=1;               AC_SUBST([HAVE_ISNAND])
-  HAVE_ISNANL=1;               AC_SUBST([HAVE_ISNANL])
-  HAVE_LDEXPF=1;               AC_SUBST([HAVE_LDEXPF])
-  HAVE_LOGF=1;                 AC_SUBST([HAVE_LOGF])
-  HAVE_LOGL=1;                 AC_SUBST([HAVE_LOGL])
-  HAVE_LOG10F=1;               AC_SUBST([HAVE_LOG10F])
-  HAVE_LOG10L=1;               AC_SUBST([HAVE_LOG10L])
-  HAVE_LOG1P=1;                AC_SUBST([HAVE_LOG1P])
-  HAVE_LOG1PF=1;               AC_SUBST([HAVE_LOG1PF])
-  HAVE_LOG1PL=1;               AC_SUBST([HAVE_LOG1PL])
-  HAVE_LOGBF=1;                AC_SUBST([HAVE_LOGBF])
-  HAVE_LOGBL=1;                AC_SUBST([HAVE_LOGBL])
-  HAVE_MODFF=1;                AC_SUBST([HAVE_MODFF])
-  HAVE_MODFL=1;                AC_SUBST([HAVE_MODFL])
-  HAVE_POWF=1;                 AC_SUBST([HAVE_POWF])
-  HAVE_REMAINDER=1;            AC_SUBST([HAVE_REMAINDER])
-  HAVE_REMAINDERF=1;           AC_SUBST([HAVE_REMAINDERF])
-  HAVE_RINT=1;                 AC_SUBST([HAVE_RINT])
-  HAVE_RINTL=1;                AC_SUBST([HAVE_RINTL])
-  HAVE_SINF=1;                 AC_SUBST([HAVE_SINF])
-  HAVE_SINL=1;                 AC_SUBST([HAVE_SINL])
-  HAVE_SINHF=1;                AC_SUBST([HAVE_SINHF])
-  HAVE_SQRTF=1;                AC_SUBST([HAVE_SQRTF])
-  HAVE_SQRTL=1;                AC_SUBST([HAVE_SQRTL])
-  HAVE_TANF=1;                 AC_SUBST([HAVE_TANF])
-  HAVE_TANL=1;                 AC_SUBST([HAVE_TANL])
-  HAVE_TANHF=1;                AC_SUBST([HAVE_TANHF])
-  HAVE_DECL_ACOSL=1;           AC_SUBST([HAVE_DECL_ACOSL])
-  HAVE_DECL_ASINL=1;           AC_SUBST([HAVE_DECL_ASINL])
-  HAVE_DECL_ATANL=1;           AC_SUBST([HAVE_DECL_ATANL])
-  HAVE_DECL_CBRTF=1;           AC_SUBST([HAVE_DECL_CBRTF])
-  HAVE_DECL_CBRTL=1;           AC_SUBST([HAVE_DECL_CBRTL])
-  HAVE_DECL_CEILF=1;           AC_SUBST([HAVE_DECL_CEILF])
-  HAVE_DECL_CEILL=1;           AC_SUBST([HAVE_DECL_CEILL])
-  HAVE_DECL_COPYSIGNF=1;       AC_SUBST([HAVE_DECL_COPYSIGNF])
-  HAVE_DECL_COSL=1;            AC_SUBST([HAVE_DECL_COSL])
-  HAVE_DECL_EXPL=1;            AC_SUBST([HAVE_DECL_EXPL])
-  HAVE_DECL_EXP2=1;            AC_SUBST([HAVE_DECL_EXP2])
-  HAVE_DECL_EXP2F=1;           AC_SUBST([HAVE_DECL_EXP2F])
-  HAVE_DECL_EXP2L=1;           AC_SUBST([HAVE_DECL_EXP2L])
-  HAVE_DECL_EXPM1L=1;          AC_SUBST([HAVE_DECL_EXPM1L])
-  HAVE_DECL_FLOORF=1;          AC_SUBST([HAVE_DECL_FLOORF])
-  HAVE_DECL_FLOORL=1;          AC_SUBST([HAVE_DECL_FLOORL])
-  HAVE_DECL_FREXPL=1;          AC_SUBST([HAVE_DECL_FREXPL])
-  HAVE_DECL_LDEXPL=1;          AC_SUBST([HAVE_DECL_LDEXPL])
-  HAVE_DECL_LOGL=1;            AC_SUBST([HAVE_DECL_LOGL])
-  HAVE_DECL_LOG10L=1;          AC_SUBST([HAVE_DECL_LOG10L])
-  HAVE_DECL_LOG2=1;            AC_SUBST([HAVE_DECL_LOG2])
-  HAVE_DECL_LOG2F=1;           AC_SUBST([HAVE_DECL_LOG2F])
-  HAVE_DECL_LOG2L=1;           AC_SUBST([HAVE_DECL_LOG2L])
-  HAVE_DECL_LOGB=1;            AC_SUBST([HAVE_DECL_LOGB])
-  HAVE_DECL_REMAINDER=1;       AC_SUBST([HAVE_DECL_REMAINDER])
-  HAVE_DECL_REMAINDERL=1;      AC_SUBST([HAVE_DECL_REMAINDERL])
-  HAVE_DECL_RINTF=1;           AC_SUBST([HAVE_DECL_RINTF])
-  HAVE_DECL_ROUND=1;           AC_SUBST([HAVE_DECL_ROUND])
-  HAVE_DECL_ROUNDF=1;          AC_SUBST([HAVE_DECL_ROUNDF])
-  HAVE_DECL_ROUNDL=1;          AC_SUBST([HAVE_DECL_ROUNDL])
-  HAVE_DECL_SINL=1;            AC_SUBST([HAVE_DECL_SINL])
-  HAVE_DECL_SQRTL=1;           AC_SUBST([HAVE_DECL_SQRTL])
-  HAVE_DECL_TANL=1;            AC_SUBST([HAVE_DECL_TANL])
-  HAVE_DECL_TRUNC=1;           AC_SUBST([HAVE_DECL_TRUNC])
-  HAVE_DECL_TRUNCF=1;          AC_SUBST([HAVE_DECL_TRUNCF])
-  HAVE_DECL_TRUNCL=1;          AC_SUBST([HAVE_DECL_TRUNCL])
-  REPLACE_ACOSF=0;             AC_SUBST([REPLACE_ACOSF])
-  REPLACE_ASINF=0;             AC_SUBST([REPLACE_ASINF])
-  REPLACE_ATANF=0;             AC_SUBST([REPLACE_ATANF])
-  REPLACE_ATAN2F=0;            AC_SUBST([REPLACE_ATAN2F])
-  REPLACE_CBRTF=0;             AC_SUBST([REPLACE_CBRTF])
-  REPLACE_CBRTL=0;             AC_SUBST([REPLACE_CBRTL])
-  REPLACE_CEIL=0;              AC_SUBST([REPLACE_CEIL])
-  REPLACE_CEILF=0;             AC_SUBST([REPLACE_CEILF])
-  REPLACE_CEILL=0;             AC_SUBST([REPLACE_CEILL])
-  REPLACE_COSF=0;              AC_SUBST([REPLACE_COSF])
-  REPLACE_COSHF=0;             AC_SUBST([REPLACE_COSHF])
-  REPLACE_EXPF=0;              AC_SUBST([REPLACE_EXPF])
-  REPLACE_EXPL=0;              AC_SUBST([REPLACE_EXPL])
-  REPLACE_EXPM1=0;             AC_SUBST([REPLACE_EXPM1])
-  REPLACE_EXPM1F=0;            AC_SUBST([REPLACE_EXPM1F])
-  REPLACE_EXPM1L=0;            AC_SUBST([REPLACE_EXPM1L])
-  REPLACE_EXP2=0;              AC_SUBST([REPLACE_EXP2])
-  REPLACE_EXP2L=0;             AC_SUBST([REPLACE_EXP2L])
-  REPLACE_FABSL=0;             AC_SUBST([REPLACE_FABSL])
-  REPLACE_FLOOR=0;             AC_SUBST([REPLACE_FLOOR])
-  REPLACE_FLOORF=0;            AC_SUBST([REPLACE_FLOORF])
-  REPLACE_FLOORL=0;            AC_SUBST([REPLACE_FLOORL])
-  REPLACE_FMA=0;               AC_SUBST([REPLACE_FMA])
-  REPLACE_FMAF=0;              AC_SUBST([REPLACE_FMAF])
-  REPLACE_FMAL=0;              AC_SUBST([REPLACE_FMAL])
-  REPLACE_FMOD=0;              AC_SUBST([REPLACE_FMOD])
-  REPLACE_FMODF=0;             AC_SUBST([REPLACE_FMODF])
-  REPLACE_FMODL=0;             AC_SUBST([REPLACE_FMODL])
-  REPLACE_FREXPF=0;            AC_SUBST([REPLACE_FREXPF])
-  REPLACE_FREXP=0;             AC_SUBST([REPLACE_FREXP])
-  REPLACE_FREXPL=0;            AC_SUBST([REPLACE_FREXPL])
-  REPLACE_HUGE_VAL=0;          AC_SUBST([REPLACE_HUGE_VAL])
-  REPLACE_HYPOT=0;             AC_SUBST([REPLACE_HYPOT])
-  REPLACE_HYPOTF=0;            AC_SUBST([REPLACE_HYPOTF])
-  REPLACE_HYPOTL=0;            AC_SUBST([REPLACE_HYPOTL])
-  REPLACE_ILOGB=0;             AC_SUBST([REPLACE_ILOGB])
-  REPLACE_ILOGBF=0;            AC_SUBST([REPLACE_ILOGBF])
-  REPLACE_ILOGBL=0;            AC_SUBST([REPLACE_ILOGBL])
-  REPLACE_ISFINITE=0;          AC_SUBST([REPLACE_ISFINITE])
-  REPLACE_ISINF=0;             AC_SUBST([REPLACE_ISINF])
-  REPLACE_ISNAN=0;             AC_SUBST([REPLACE_ISNAN])
-  REPLACE_LDEXPL=0;            AC_SUBST([REPLACE_LDEXPL])
-  REPLACE_LOG=0;               AC_SUBST([REPLACE_LOG])
-  REPLACE_LOGF=0;              AC_SUBST([REPLACE_LOGF])
-  REPLACE_LOGL=0;              AC_SUBST([REPLACE_LOGL])
-  REPLACE_LOG10=0;             AC_SUBST([REPLACE_LOG10])
-  REPLACE_LOG10F=0;            AC_SUBST([REPLACE_LOG10F])
-  REPLACE_LOG10L=0;            AC_SUBST([REPLACE_LOG10L])
-  REPLACE_LOG1P=0;             AC_SUBST([REPLACE_LOG1P])
-  REPLACE_LOG1PF=0;            AC_SUBST([REPLACE_LOG1PF])
-  REPLACE_LOG1PL=0;            AC_SUBST([REPLACE_LOG1PL])
-  REPLACE_LOG2=0;              AC_SUBST([REPLACE_LOG2])
-  REPLACE_LOG2F=0;             AC_SUBST([REPLACE_LOG2F])
-  REPLACE_LOG2L=0;             AC_SUBST([REPLACE_LOG2L])
-  REPLACE_LOGB=0;              AC_SUBST([REPLACE_LOGB])
-  REPLACE_LOGBF=0;             AC_SUBST([REPLACE_LOGBF])
-  REPLACE_LOGBL=0;             AC_SUBST([REPLACE_LOGBL])
-  REPLACE_MODF=0;              AC_SUBST([REPLACE_MODF])
-  REPLACE_MODFF=0;             AC_SUBST([REPLACE_MODFF])
-  REPLACE_MODFL=0;             AC_SUBST([REPLACE_MODFL])
-  REPLACE_NAN=0;               AC_SUBST([REPLACE_NAN])
-  REPLACE_REMAINDER=0;         AC_SUBST([REPLACE_REMAINDER])
-  REPLACE_REMAINDERF=0;        AC_SUBST([REPLACE_REMAINDERF])
-  REPLACE_REMAINDERL=0;        AC_SUBST([REPLACE_REMAINDERL])
-  REPLACE_RINTL=0;             AC_SUBST([REPLACE_RINTL])
-  REPLACE_ROUND=0;             AC_SUBST([REPLACE_ROUND])
-  REPLACE_ROUNDF=0;            AC_SUBST([REPLACE_ROUNDF])
-  REPLACE_ROUNDL=0;            AC_SUBST([REPLACE_ROUNDL])
-  REPLACE_SIGNBIT=0;           AC_SUBST([REPLACE_SIGNBIT])
-  REPLACE_SIGNBIT_USING_GCC=0; AC_SUBST([REPLACE_SIGNBIT_USING_GCC])
-  REPLACE_SINF=0;              AC_SUBST([REPLACE_SINF])
-  REPLACE_SINHF=0;             AC_SUBST([REPLACE_SINHF])
-  REPLACE_SQRTF=0;             AC_SUBST([REPLACE_SQRTF])
-  REPLACE_SQRTL=0;             AC_SUBST([REPLACE_SQRTL])
-  REPLACE_TANF=0;              AC_SUBST([REPLACE_TANF])
-  REPLACE_TANHF=0;             AC_SUBST([REPLACE_TANHF])
-  REPLACE_TRUNC=0;             AC_SUBST([REPLACE_TRUNC])
-  REPLACE_TRUNCF=0;            AC_SUBST([REPLACE_TRUNCF])
-  REPLACE_TRUNCL=0;            AC_SUBST([REPLACE_TRUNCL])
+  HAVE_ACOSF=1;                     AC_SUBST([HAVE_ACOSF])
+  HAVE_ACOSL=1;                     AC_SUBST([HAVE_ACOSL])
+  HAVE_ASINF=1;                     AC_SUBST([HAVE_ASINF])
+  HAVE_ASINL=1;                     AC_SUBST([HAVE_ASINL])
+  HAVE_ATANF=1;                     AC_SUBST([HAVE_ATANF])
+  HAVE_ATANL=1;                     AC_SUBST([HAVE_ATANL])
+  HAVE_ATAN2F=1;                    AC_SUBST([HAVE_ATAN2F])
+  HAVE_CBRT=1;                      AC_SUBST([HAVE_CBRT])
+  HAVE_CBRTF=1;                     AC_SUBST([HAVE_CBRTF])
+  HAVE_CBRTL=1;                     AC_SUBST([HAVE_CBRTL])
+  HAVE_COPYSIGN=1;                  AC_SUBST([HAVE_COPYSIGN])
+  HAVE_COPYSIGNL=1;                 AC_SUBST([HAVE_COPYSIGNL])
+  HAVE_COSF=1;                      AC_SUBST([HAVE_COSF])
+  HAVE_COSL=1;                      AC_SUBST([HAVE_COSL])
+  HAVE_COSHF=1;                     AC_SUBST([HAVE_COSHF])
+  HAVE_EXPF=1;                      AC_SUBST([HAVE_EXPF])
+  HAVE_EXPL=1;                      AC_SUBST([HAVE_EXPL])
+  HAVE_EXPM1=1;                     AC_SUBST([HAVE_EXPM1])
+  HAVE_EXPM1F=1;                    AC_SUBST([HAVE_EXPM1F])
+  HAVE_FABSF=1;                     AC_SUBST([HAVE_FABSF])
+  HAVE_FABSL=1;                     AC_SUBST([HAVE_FABSL])
+  HAVE_FMA=1;                       AC_SUBST([HAVE_FMA])
+  HAVE_FMAF=1;                      AC_SUBST([HAVE_FMAF])
+  HAVE_FMAL=1;                      AC_SUBST([HAVE_FMAL])
+  HAVE_FMODF=1;                     AC_SUBST([HAVE_FMODF])
+  HAVE_FMODL=1;                     AC_SUBST([HAVE_FMODL])
+  HAVE_FREXPF=1;                    AC_SUBST([HAVE_FREXPF])
+  HAVE_HYPOTF=1;                    AC_SUBST([HAVE_HYPOTF])
+  HAVE_HYPOTL=1;                    AC_SUBST([HAVE_HYPOTL])
+  HAVE_ILOGB=1;                     AC_SUBST([HAVE_ILOGB])
+  HAVE_ILOGBF=1;                    AC_SUBST([HAVE_ILOGBF])
+  HAVE_ILOGBL=1;                    AC_SUBST([HAVE_ILOGBL])
+  HAVE_ISNANF=1;                    AC_SUBST([HAVE_ISNANF])
+  HAVE_ISNAND=1;                    AC_SUBST([HAVE_ISNAND])
+  HAVE_ISNANL=1;                    AC_SUBST([HAVE_ISNANL])
+  HAVE_LDEXPF=1;                    AC_SUBST([HAVE_LDEXPF])
+  HAVE_LOGF=1;                      AC_SUBST([HAVE_LOGF])
+  HAVE_LOGL=1;                      AC_SUBST([HAVE_LOGL])
+  HAVE_LOG10F=1;                    AC_SUBST([HAVE_LOG10F])
+  HAVE_LOG10L=1;                    AC_SUBST([HAVE_LOG10L])
+  HAVE_LOG1P=1;                     AC_SUBST([HAVE_LOG1P])
+  HAVE_LOG1PF=1;                    AC_SUBST([HAVE_LOG1PF])
+  HAVE_LOG1PL=1;                    AC_SUBST([HAVE_LOG1PL])
+  HAVE_LOGBF=1;                     AC_SUBST([HAVE_LOGBF])
+  HAVE_LOGBL=1;                     AC_SUBST([HAVE_LOGBL])
+  HAVE_MODFF=1;                     AC_SUBST([HAVE_MODFF])
+  HAVE_MODFL=1;                     AC_SUBST([HAVE_MODFL])
+  HAVE_POWF=1;                      AC_SUBST([HAVE_POWF])
+  HAVE_REMAINDER=1;                 AC_SUBST([HAVE_REMAINDER])
+  HAVE_REMAINDERF=1;                AC_SUBST([HAVE_REMAINDERF])
+  HAVE_RINT=1;                      AC_SUBST([HAVE_RINT])
+  HAVE_RINTL=1;                     AC_SUBST([HAVE_RINTL])
+  HAVE_SINF=1;                      AC_SUBST([HAVE_SINF])
+  HAVE_SINL=1;                      AC_SUBST([HAVE_SINL])
+  HAVE_SINHF=1;                     AC_SUBST([HAVE_SINHF])
+  HAVE_SQRTF=1;                     AC_SUBST([HAVE_SQRTF])
+  HAVE_SQRTL=1;                     AC_SUBST([HAVE_SQRTL])
+  HAVE_TANF=1;                      AC_SUBST([HAVE_TANF])
+  HAVE_TANL=1;                      AC_SUBST([HAVE_TANL])
+  HAVE_TANHF=1;                     AC_SUBST([HAVE_TANHF])
+  HAVE_DECL_ACOSL=1;                AC_SUBST([HAVE_DECL_ACOSL])
+  HAVE_DECL_ASINL=1;                AC_SUBST([HAVE_DECL_ASINL])
+  HAVE_DECL_ATANL=1;                AC_SUBST([HAVE_DECL_ATANL])
+  HAVE_DECL_CBRTF=1;                AC_SUBST([HAVE_DECL_CBRTF])
+  HAVE_DECL_CBRTL=1;                AC_SUBST([HAVE_DECL_CBRTL])
+  HAVE_DECL_CEILF=1;                AC_SUBST([HAVE_DECL_CEILF])
+  HAVE_DECL_CEILL=1;                AC_SUBST([HAVE_DECL_CEILL])
+  HAVE_DECL_COPYSIGNF=1;            AC_SUBST([HAVE_DECL_COPYSIGNF])
+  HAVE_DECL_COSL=1;                 AC_SUBST([HAVE_DECL_COSL])
+  HAVE_DECL_EXPL=1;                 AC_SUBST([HAVE_DECL_EXPL])
+  HAVE_DECL_EXP2=1;                 AC_SUBST([HAVE_DECL_EXP2])
+  HAVE_DECL_EXP2F=1;                AC_SUBST([HAVE_DECL_EXP2F])
+  HAVE_DECL_EXP2L=1;                AC_SUBST([HAVE_DECL_EXP2L])
+  HAVE_DECL_EXPM1L=1;               AC_SUBST([HAVE_DECL_EXPM1L])
+  HAVE_DECL_FLOORF=1;               AC_SUBST([HAVE_DECL_FLOORF])
+  HAVE_DECL_FLOORL=1;               AC_SUBST([HAVE_DECL_FLOORL])
+  HAVE_DECL_FREXPL=1;               AC_SUBST([HAVE_DECL_FREXPL])
+  HAVE_DECL_LDEXPL=1;               AC_SUBST([HAVE_DECL_LDEXPL])
+  HAVE_DECL_LOGL=1;                 AC_SUBST([HAVE_DECL_LOGL])
+  HAVE_DECL_LOG10L=1;               AC_SUBST([HAVE_DECL_LOG10L])
+  HAVE_DECL_LOG2=1;                 AC_SUBST([HAVE_DECL_LOG2])
+  HAVE_DECL_LOG2F=1;                AC_SUBST([HAVE_DECL_LOG2F])
+  HAVE_DECL_LOG2L=1;                AC_SUBST([HAVE_DECL_LOG2L])
+  HAVE_DECL_LOGB=1;                 AC_SUBST([HAVE_DECL_LOGB])
+  HAVE_DECL_REMAINDER=1;            AC_SUBST([HAVE_DECL_REMAINDER])
+  HAVE_DECL_REMAINDERL=1;           AC_SUBST([HAVE_DECL_REMAINDERL])
+  HAVE_DECL_RINTF=1;                AC_SUBST([HAVE_DECL_RINTF])
+  HAVE_DECL_ROUND=1;                AC_SUBST([HAVE_DECL_ROUND])
+  HAVE_DECL_ROUNDF=1;               AC_SUBST([HAVE_DECL_ROUNDF])
+  HAVE_DECL_ROUNDL=1;               AC_SUBST([HAVE_DECL_ROUNDL])
+  HAVE_DECL_SINL=1;                 AC_SUBST([HAVE_DECL_SINL])
+  HAVE_DECL_SQRTL=1;                AC_SUBST([HAVE_DECL_SQRTL])
+  HAVE_DECL_TANL=1;                 AC_SUBST([HAVE_DECL_TANL])
+  HAVE_DECL_TRUNC=1;                AC_SUBST([HAVE_DECL_TRUNC])
+  HAVE_DECL_TRUNCF=1;               AC_SUBST([HAVE_DECL_TRUNCF])
+  HAVE_DECL_TRUNCL=1;               AC_SUBST([HAVE_DECL_TRUNCL])
+  REPLACE_ACOSF=0;                  AC_SUBST([REPLACE_ACOSF])
+  REPLACE_ASINF=0;                  AC_SUBST([REPLACE_ASINF])
+  REPLACE_ATANF=0;                  AC_SUBST([REPLACE_ATANF])
+  REPLACE_ATAN2F=0;                 AC_SUBST([REPLACE_ATAN2F])
+  REPLACE_CBRTF=0;                  AC_SUBST([REPLACE_CBRTF])
+  REPLACE_CBRTL=0;                  AC_SUBST([REPLACE_CBRTL])
+  REPLACE_CEIL=0;                   AC_SUBST([REPLACE_CEIL])
+  REPLACE_CEILF=0;                  AC_SUBST([REPLACE_CEILF])
+  REPLACE_CEILL=0;                  AC_SUBST([REPLACE_CEILL])
+  REPLACE_COSF=0;                   AC_SUBST([REPLACE_COSF])
+  REPLACE_COSHF=0;                  AC_SUBST([REPLACE_COSHF])
+  REPLACE_EXPF=0;                   AC_SUBST([REPLACE_EXPF])
+  REPLACE_EXPL=0;                   AC_SUBST([REPLACE_EXPL])
+  REPLACE_EXPM1=0;                  AC_SUBST([REPLACE_EXPM1])
+  REPLACE_EXPM1F=0;                 AC_SUBST([REPLACE_EXPM1F])
+  REPLACE_EXPM1L=0;                 AC_SUBST([REPLACE_EXPM1L])
+  REPLACE_EXP2=0;                   AC_SUBST([REPLACE_EXP2])
+  REPLACE_EXP2L=0;                  AC_SUBST([REPLACE_EXP2L])
+  REPLACE_FABSL=0;                  AC_SUBST([REPLACE_FABSL])
+  REPLACE_FLOOR=0;                  AC_SUBST([REPLACE_FLOOR])
+  REPLACE_FLOORF=0;                 AC_SUBST([REPLACE_FLOORF])
+  REPLACE_FLOORL=0;                 AC_SUBST([REPLACE_FLOORL])
+  REPLACE_FMA=0;                    AC_SUBST([REPLACE_FMA])
+  REPLACE_FMAF=0;                   AC_SUBST([REPLACE_FMAF])
+  REPLACE_FMAL=0;                   AC_SUBST([REPLACE_FMAL])
+  REPLACE_FMOD=0;                   AC_SUBST([REPLACE_FMOD])
+  REPLACE_FMODF=0;                  AC_SUBST([REPLACE_FMODF])
+  REPLACE_FMODL=0;                  AC_SUBST([REPLACE_FMODL])
+  REPLACE_FREXPF=0;                 AC_SUBST([REPLACE_FREXPF])
+  REPLACE_FREXP=0;                  AC_SUBST([REPLACE_FREXP])
+  REPLACE_FREXPL=0;                 AC_SUBST([REPLACE_FREXPL])
+  REPLACE_HUGE_VAL=0;               AC_SUBST([REPLACE_HUGE_VAL])
+  REPLACE_HYPOT=0;                  AC_SUBST([REPLACE_HYPOT])
+  REPLACE_HYPOTF=0;                 AC_SUBST([REPLACE_HYPOTF])
+  REPLACE_HYPOTL=0;                 AC_SUBST([REPLACE_HYPOTL])
+  REPLACE_ILOGB=0;                  AC_SUBST([REPLACE_ILOGB])
+  REPLACE_ILOGBF=0;                 AC_SUBST([REPLACE_ILOGBF])
+  REPLACE_ILOGBL=0;                 AC_SUBST([REPLACE_ILOGBL])
+  REPLACE_ISFINITE=0;               AC_SUBST([REPLACE_ISFINITE])
+  REPLACE_ISINF=0;                  AC_SUBST([REPLACE_ISINF])
+  REPLACE_ISNAN=0;                  AC_SUBST([REPLACE_ISNAN])
+  REPLACE_LDEXPL=0;                 AC_SUBST([REPLACE_LDEXPL])
+  REPLACE_LOG=0;                    AC_SUBST([REPLACE_LOG])
+  REPLACE_LOGF=0;                   AC_SUBST([REPLACE_LOGF])
+  REPLACE_LOGL=0;                   AC_SUBST([REPLACE_LOGL])
+  REPLACE_LOG10=0;                  AC_SUBST([REPLACE_LOG10])
+  REPLACE_LOG10F=0;                 AC_SUBST([REPLACE_LOG10F])
+  REPLACE_LOG10L=0;                 AC_SUBST([REPLACE_LOG10L])
+  REPLACE_LOG1P=0;                  AC_SUBST([REPLACE_LOG1P])
+  REPLACE_LOG1PF=0;                 AC_SUBST([REPLACE_LOG1PF])
+  REPLACE_LOG1PL=0;                 AC_SUBST([REPLACE_LOG1PL])
+  REPLACE_LOG2=0;                   AC_SUBST([REPLACE_LOG2])
+  REPLACE_LOG2F=0;                  AC_SUBST([REPLACE_LOG2F])
+  REPLACE_LOG2L=0;                  AC_SUBST([REPLACE_LOG2L])
+  REPLACE_LOGB=0;                   AC_SUBST([REPLACE_LOGB])
+  REPLACE_LOGBF=0;                  AC_SUBST([REPLACE_LOGBF])
+  REPLACE_LOGBL=0;                  AC_SUBST([REPLACE_LOGBL])
+  REPLACE_MODF=0;                   AC_SUBST([REPLACE_MODF])
+  REPLACE_MODFF=0;                  AC_SUBST([REPLACE_MODFF])
+  REPLACE_MODFL=0;                  AC_SUBST([REPLACE_MODFL])
+  REPLACE_NAN=0;                    AC_SUBST([REPLACE_NAN])
+  REPLACE_REMAINDER=0;              AC_SUBST([REPLACE_REMAINDER])
+  REPLACE_REMAINDERF=0;             AC_SUBST([REPLACE_REMAINDERF])
+  REPLACE_REMAINDERL=0;             AC_SUBST([REPLACE_REMAINDERL])
+  REPLACE_RINTL=0;                  AC_SUBST([REPLACE_RINTL])
+  REPLACE_ROUND=0;                  AC_SUBST([REPLACE_ROUND])
+  REPLACE_ROUNDF=0;                 AC_SUBST([REPLACE_ROUNDF])
+  REPLACE_ROUNDL=0;                 AC_SUBST([REPLACE_ROUNDL])
+  REPLACE_SIGNBIT=0;                AC_SUBST([REPLACE_SIGNBIT])
+  REPLACE_SIGNBIT_USING_BUILTINS=0; AC_SUBST([REPLACE_SIGNBIT_USING_BUILTINS])
+  REPLACE_SINF=0;                   AC_SUBST([REPLACE_SINF])
+  REPLACE_SINHF=0;                  AC_SUBST([REPLACE_SINHF])
+  REPLACE_SQRTF=0;                  AC_SUBST([REPLACE_SQRTF])
+  REPLACE_SQRTL=0;                  AC_SUBST([REPLACE_SQRTL])
+  REPLACE_TANF=0;                   AC_SUBST([REPLACE_TANF])
+  REPLACE_TANHF=0;                  AC_SUBST([REPLACE_TANHF])
+  REPLACE_TRUNC=0;                  AC_SUBST([REPLACE_TRUNC])
+  REPLACE_TRUNCF=0;                 AC_SUBST([REPLACE_TRUNCF])
+  REPLACE_TRUNCL=0;                 AC_SUBST([REPLACE_TRUNCL])
 ])
 
 # gl_LONG_DOUBLE_VS_DOUBLE
diff --git a/m4/mbchar.m4 b/m4/mbchar.m4
index 3d16342..b6842bb 100644
--- a/m4/mbchar.m4
+++ b/m4/mbchar.m4
@@ -1,5 +1,5 @@
 # mbchar.m4 serial 9
-dnl Copyright (C) 2005-2007, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2005-2007, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/mbfile.m4 b/m4/mbfile.m4
index 2797a57..f6c3fe7 100644
--- a/m4/mbfile.m4
+++ b/m4/mbfile.m4
@@ -1,5 +1,5 @@
 # mbfile.m4 serial 7
-dnl Copyright (C) 2005, 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2005, 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/mbrtowc.m4 b/m4/mbrtowc.m4
index 16e166b..1d4e73d 100644
--- a/m4/mbrtowc.m4
+++ b/m4/mbrtowc.m4
@@ -1,5 +1,5 @@
-# mbrtowc.m4 serial 33  -*- coding: utf-8 -*-
-dnl Copyright (C) 2001-2002, 2004-2005, 2008-2019 Free Software Foundation,
+# mbrtowc.m4 serial 38  -*- coding: utf-8 -*-
+dnl Copyright (C) 2001-2002, 2004-2005, 2008-2021 Free Software Foundation,
 dnl Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -8,6 +8,8 @@
 AC_DEFUN([gl_FUNC_MBRTOWC],
 [
   AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+  AC_REQUIRE([gl_PTHREADLIB])
+  AC_CHECK_HEADERS_ONCE([threads.h])
 
   AC_REQUIRE([AC_TYPE_MBSTATE_T])
   gl_MBSTATE_T_BROKEN
@@ -16,15 +18,8 @@
   if test $ac_cv_func_mbrtowc = no; then
     HAVE_MBRTOWC=0
     AC_CHECK_DECLS([mbrtowc],,, [[
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-]])
+      #include <wchar.h>
+    ]])
     if test $ac_cv_have_decl_mbrtowc = yes; then
       dnl On Minix 3.1.8, the system's <wchar.h> declares mbrtowc() although
       dnl it does not have the function. Avoid a collision with gnulib's
@@ -39,6 +34,7 @@
       gl_MBRTOWC_NULL_ARG2
       gl_MBRTOWC_RETVAL
       gl_MBRTOWC_NUL_RETVAL
+      gl_MBRTOWC_STORES_INCOMPLETE
       gl_MBRTOWC_EMPTY_INPUT
       gl_MBRTOWC_C_LOCALE
       case "$gl_cv_func_mbrtowc_null_arg1" in
@@ -69,6 +65,13 @@
            REPLACE_MBRTOWC=1
            ;;
       esac
+      case "$gl_cv_func_mbrtowc_stores_incomplete" in
+        *no) ;;
+        *) AC_DEFINE([MBRTOWC_STORES_INCOMPLETE_BUG], [1],
+             [Define if the mbrtowc function stores a wide character when reporting incomplete input.])
+           REPLACE_MBRTOWC=1
+           ;;
+      esac
       case "$gl_cv_func_mbrtowc_empty_input" in
         *yes) ;;
         *) AC_DEFINE([MBRTOWC_EMPTY_INPUT_BUG], [1],
@@ -77,15 +80,32 @@
            REPLACE_MBRTOWC=1
            ;;
       esac
-      case $gl_cv_C_locale_sans_EILSEQ in
+      case "$gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" in
         *yes) ;;
-        *) AC_DEFINE([C_LOCALE_MAYBE_EILSEQ], [1],
-             [Define to 1 if the C locale may have encoding errors.])
+        *) AC_DEFINE([MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ], [1],
+             [Define if the mbrtowc function may signal encoding errors in the C locale.])
            REPLACE_MBRTOWC=1
            ;;
       esac
     fi
   fi
+  if test $REPLACE_MBSTATE_T = 1; then
+    case "$host_os" in
+      mingw*) LIB_MBRTOWC= ;;
+      *)
+        gl_WEAK_SYMBOLS
+        case "$gl_cv_have_weak" in
+          *yes) LIB_MBRTOWC= ;;
+          *)    LIB_MBRTOWC="$LIBPTHREAD" ;;
+        esac
+        ;;
+    esac
+  else
+    LIB_MBRTOWC=
+  fi
+  dnl LIB_MBRTOWC is expected to be '-pthread' or '-lpthread' on AIX
+  dnl with gcc or xlc, and empty otherwise.
+  AC_SUBST([LIB_MBRTOWC])
 ])
 
 dnl Test whether mbsinit() and mbrtowc() need to be overridden in a way that
@@ -97,11 +117,19 @@
 AC_DEFUN([gl_MBSTATE_T_BROKEN],
 [
   AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST])
 
   AC_REQUIRE([AC_TYPE_MBSTATE_T])
   AC_CHECK_FUNCS_ONCE([mbsinit])
   AC_CHECK_FUNCS_ONCE([mbrtowc])
-  if test $ac_cv_func_mbsinit = yes && test $ac_cv_func_mbrtowc = yes; then
+  dnl On native Windows, we know exactly how mbsinit() behaves and don't need
+  dnl to override it, even if - like on MSVC - mbsinit() is only defined as
+  dnl an inline function, not as a global function.
+  if case "$host_os" in
+       mingw*) true ;;
+       *) test $ac_cv_func_mbsinit = yes ;;
+     esac \
+    && test $ac_cv_func_mbrtowc = yes; then
     gl_MBRTOWC_INCOMPLETE_STATE
     gl_MBRTOWC_SANITYCHECK
     REPLACE_MBSTATE_T=0
@@ -146,13 +174,6 @@
           [AC_LANG_SOURCE([[
 #include <locale.h>
 #include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
 #include <wchar.h>
 int main ()
 {
@@ -178,13 +199,6 @@
             [AC_LANG_SOURCE([[
 #include <locale.h>
 #include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
 #include <wchar.h>
 int main ()
 {
@@ -236,13 +250,6 @@
 #include <locale.h>
 #include <stdlib.h>
 #include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
 #include <wchar.h>
 int main ()
 {
@@ -296,13 +303,6 @@
 #include <locale.h>
 #include <stdlib.h>
 #include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
 #include <wchar.h>
 int main ()
 {
@@ -365,13 +365,6 @@
           [AC_LANG_SOURCE([[
 #include <locale.h>
 #include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
 #include <wchar.h>
 int main ()
 {
@@ -427,13 +420,6 @@
           [AC_LANG_SOURCE([[
 #include <locale.h>
 #include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
 #include <wchar.h>
 int main ()
 {
@@ -555,13 +541,6 @@
           [AC_LANG_SOURCE([[
 #include <locale.h>
 #include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
 #include <wchar.h>
 int main ()
 {
@@ -584,6 +563,112 @@
     ])
 ])
 
+dnl Test whether mbrtowc stores a wide character when reporting incomplete
+dnl input.
+
+AC_DEFUN([gl_MBRTOWC_STORES_INCOMPLETE],
+[
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  AC_CACHE_CHECK([whether mbrtowc stores incomplete characters],
+    [gl_cv_func_mbrtowc_stores_incomplete],
+    [
+     dnl Initial guess, used when cross-compiling or when no suitable locale
+     dnl is present.
+changequote(,)dnl
+     case "$host_os" in
+               # Guess yes on native Windows.
+       mingw*) gl_cv_func_mbrtowc_stores_incomplete="guessing yes" ;;
+       *)      gl_cv_func_mbrtowc_stores_incomplete="guessing no" ;;
+     esac
+changequote([,])dnl
+     case "$host_os" in
+       mingw*)
+         AC_RUN_IFELSE(
+           [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+  int result = 0;
+  if (setlocale (LC_ALL, "French_France.65001") != NULL)
+    {
+      wchar_t wc = (wchar_t) 0xBADFACE;
+      mbstate_t state;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2)
+          && wc != (wchar_t) 0xBADFACE)
+        result |= 1;
+    }
+  if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL)
+    {
+      wchar_t wc = (wchar_t) 0xBADFACE;
+      mbstate_t state;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, "\226", 1, &state) == (size_t)(-2)
+          && wc != (wchar_t) 0xBADFACE)
+        result |= 2;
+    }
+  if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL)
+    {
+      wchar_t wc = (wchar_t) 0xBADFACE;
+      mbstate_t state;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, "\245", 1, &state) == (size_t)(-2)
+          && wc != (wchar_t) 0xBADFACE)
+        result |= 4;
+    }
+  if (setlocale (LC_ALL, "Chinese_China.936") != NULL)
+    {
+      wchar_t wc = (wchar_t) 0xBADFACE;
+      mbstate_t state;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, "\261", 1, &state) == (size_t)(-2)
+          && wc != (wchar_t) 0xBADFACE)
+        result |= 8;
+    }
+  return result;
+}]])],
+           [gl_cv_func_mbrtowc_stores_incomplete=no],
+           [gl_cv_func_mbrtowc_stores_incomplete=yes],
+           [:])
+         ;;
+       *)
+         AC_REQUIRE([gt_LOCALE_FR_UTF8])
+         if test $LOCALE_FR_UTF8 != none; then
+           AC_RUN_IFELSE(
+             [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+    {
+      wchar_t wc = (wchar_t) 0xBADFACE;
+      mbstate_t state;
+
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2)
+          && wc != (wchar_t) 0xBADFACE)
+        return 1;
+    }
+  return 0;
+}]])],
+             [gl_cv_func_mbrtowc_stores_incomplete=no],
+             [gl_cv_func_mbrtowc_stores_incomplete=yes],
+             [:])
+         fi
+         ;;
+     esac
+    ])
+])
+
 dnl Test whether mbrtowc returns the correct value on empty input.
 
 AC_DEFUN([gl_MBRTOWC_EMPTY_INPUT],
@@ -629,11 +714,11 @@
 [
   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
   AC_CACHE_CHECK([whether the C locale is free of encoding errors],
-    [gl_cv_C_locale_sans_EILSEQ],
+    [gl_cv_func_mbrtowc_C_locale_sans_EILSEQ],
     [
      dnl Initial guess, used when cross-compiling or when no suitable locale
      dnl is present.
-     gl_cv_C_locale_sans_EILSEQ="$gl_cross_guess_normal"
+     gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="$gl_cross_guess_normal"
 
      AC_RUN_IFELSE(
        [AC_LANG_PROGRAM(
@@ -656,22 +741,28 @@
               }
             return 0;
           ]])],
-      [gl_cv_C_locale_sans_EILSEQ=yes],
-      [gl_cv_C_locale_sans_EILSEQ=no],
+      [gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=yes],
+      [gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=no],
       [case "$host_os" in
                  # Guess yes on native Windows.
-         mingw*) gl_cv_C_locale_sans_EILSEQ="guessing yes" ;;
+         mingw*) gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="guessing yes" ;;
        esac
       ])
     ])
 ])
 
-# Prerequisites of lib/mbrtowc.c.
+# Prerequisites of lib/mbrtowc.c and lib/lc-charset-dispatch.c.
 AC_DEFUN([gl_PREREQ_MBRTOWC], [
   AC_REQUIRE([AC_C_INLINE])
   :
 ])
 
+# Prerequisites of lib/mbtowc-lock.c.
+AC_DEFUN([gl_PREREQ_MBTOWC_LOCK],
+[
+  gl_VISIBILITY
+])
+
 
 dnl From Paul Eggert
 
@@ -684,14 +775,7 @@
     [gl_cv_func_mbrtowc],
     [AC_LINK_IFELSE(
        [AC_LANG_PROGRAM(
-            [[/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
-                 included before <wchar.h>.
-                 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
-                 must be included before <wchar.h>.  */
-              #include <stddef.h>
-              #include <stdio.h>
-              #include <time.h>
-              #include <wchar.h>]],
+            [[#include <wchar.h>]],
             [[wchar_t wc;
               char const s[] = "";
               size_t n = 1;
diff --git a/m4/mbsinit.m4 b/m4/mbsinit.m4
index e2f45e7..dc6e10d 100644
--- a/m4/mbsinit.m4
+++ b/m4/mbsinit.m4
@@ -1,5 +1,5 @@
-# mbsinit.m4 serial 8
-dnl Copyright (C) 2008, 2010-2019 Free Software Foundation, Inc.
+# mbsinit.m4 serial 9
+dnl Copyright (C) 2008, 2010-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -16,15 +16,8 @@
   if test $ac_cv_func_mbsinit = no; then
     HAVE_MBSINIT=0
     AC_CHECK_DECLS([mbsinit],,, [[
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-]])
+      #include <wchar.h>
+    ]])
     if test $ac_cv_have_decl_mbsinit = yes; then
       dnl On Minix 3.1.8, the system's <wchar.h> declares mbsinit() although
       dnl it does not have the function. Avoid a collision with gnulib's
diff --git a/m4/mbstate_t.m4 b/m4/mbstate_t.m4
index f669753..e7fe358 100644
--- a/m4/mbstate_t.m4
+++ b/m4/mbstate_t.m4
@@ -1,5 +1,5 @@
-# mbstate_t.m4 serial 13
-dnl Copyright (C) 2000-2002, 2008-2019 Free Software Foundation, Inc.
+# mbstate_t.m4 serial 14
+dnl Copyright (C) 2000-2002, 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -20,14 +20,7 @@
      [AC_COMPILE_IFELSE(
         [AC_LANG_PROGRAM(
            [AC_INCLUDES_DEFAULT[
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>]],
+             #include <wchar.h>]],
            [[mbstate_t x; return sizeof x;]])],
         [ac_cv_type_mbstate_t=yes],
         [ac_cv_type_mbstate_t=no])])
diff --git a/m4/mbswidth.m4 b/m4/mbswidth.m4
index bf0860c..a55f062 100644
--- a/m4/mbswidth.m4
+++ b/m4/mbswidth.m4
@@ -1,5 +1,5 @@
-# mbswidth.m4 serial 18
-dnl Copyright (C) 2000-2002, 2004, 2006-2019 Free Software Foundation, Inc.
+# mbswidth.m4 serial 19
+dnl Copyright (C) 2000-2002, 2004, 2006-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -18,19 +18,10 @@
     [ac_cv_have_decl_mbswidth],
     [AC_COMPILE_IFELSE(
        [AC_LANG_PROGRAM(
-          [[
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
-   before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
+          [[#include <wchar.h>
           ]],
-          [[
-  char *p = (char *) mbswidth;
-  return !p;
+          [[char *p = (char *) mbswidth;
+            return !p;
           ]])],
        [ac_cv_have_decl_mbswidth=yes],
        [ac_cv_have_decl_mbswidth=no])])
diff --git a/m4/memchr.m4 b/m4/memchr.m4
index c12d20a..ca08192 100644
--- a/m4/memchr.m4
+++ b/m4/memchr.m4
@@ -1,5 +1,5 @@
-# memchr.m4 serial 15
-dnl Copyright (C) 2002-2004, 2009-2019 Free Software Foundation, Inc.
+# memchr.m4 serial 18
+dnl Copyright (C) 2002-2004, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -13,27 +13,18 @@
   AC_CHECK_HEADERS_ONCE([sys/mman.h])
   AC_CHECK_FUNCS_ONCE([mprotect])
 
-  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
-  m4_ifdef([gl_FUNC_MEMCHR_OBSOLETE], [
-    dnl These days, we assume memchr is present.  But if support for old
-    dnl platforms is desired:
-    AC_CHECK_FUNCS_ONCE([memchr])
-    if test $ac_cv_func_memchr = no; then
-      HAVE_MEMCHR=0
-    fi
-  ])
-  if test $HAVE_MEMCHR = 1; then
-    # Detect platform-specific bugs in some versions of glibc:
-    # memchr should not dereference anything with length 0
-    #   https://bugzilla.redhat.com/show_bug.cgi?id=499689
-    # memchr should not dereference overestimated length after a match
-    #   https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737
-    #   https://sourceware.org/bugzilla/show_bug.cgi?id=10162
-    # memchr should cast the second argument to 'unsigned char'.
-    #   This bug exists in Android 4.3.
-    # Assume that memchr works on platforms that lack mprotect.
-    AC_CACHE_CHECK([whether memchr works], [gl_cv_func_memchr_works],
-      [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
+  # Detect platform-specific bugs in some versions of glibc:
+  # memchr should not dereference anything with length 0
+  #   https://bugzilla.redhat.com/show_bug.cgi?id=499689
+  # memchr should not dereference overestimated length after a match
+  #   https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737
+  #   https://sourceware.org/bugzilla/show_bug.cgi?id=10162
+  # memchr should cast the second argument to 'unsigned char'.
+  #   This bug exists in Android 4.3.
+  # Assume that memchr works on platforms that lack mprotect.
+  AC_CACHE_CHECK([whether memchr works], [gl_cv_func_memchr_works],
+    [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
 #include <string.h>
 #if HAVE_SYS_MMAN_H
 # include <fcntl.h>
@@ -68,6 +59,7 @@
 #endif
   if (fence)
     {
+      /* Test against bugs on glibc systems.  */
       if (memchr (fence, 0, 0))
         result |= 1;
       strcpy (fence - 9, "12345678");
@@ -75,6 +67,9 @@
         result |= 2;
       if (memchr (fence - 1, 0, 3) != fence - 1)
         result |= 4;
+      /* Test against bug on AIX 7.2.  */
+      if (memchr (fence - 4, '6', 16) != fence - 4)
+        result |= 8;
     }
   /* Test against bug on Android 4.3.  */
   {
@@ -83,27 +78,26 @@
     input[1] = 'b';
     input[2] = 'c';
     if (memchr (input, 0x789abc00 | 'b', 3) != input + 1)
-      result |= 8;
+      result |= 16;
   }
   return result;
 ]])],
-         [gl_cv_func_memchr_works=yes],
-         [gl_cv_func_memchr_works=no],
-         [case "$host_os" in
-                             # Guess no on Android.
-            linux*-android*) gl_cv_func_memchr_works="guessing no" ;;
-                             # Guess yes on native Windows.
-            mingw*)          gl_cv_func_memchr_works="guessing yes" ;;
-                             # If we don't know, obey --enable-cross-guesses.
-            *)               gl_cv_func_memchr_works="$gl_cross_guess_normal" ;;
-          esac
-         ])
-      ])
-    case "$gl_cv_func_memchr_works" in
-      *yes) ;;
-      *) REPLACE_MEMCHR=1 ;;
-    esac
-  fi
+       [gl_cv_func_memchr_works=yes],
+       [gl_cv_func_memchr_works=no],
+       [case "$host_os" in
+                           # Guess no on Android.
+          linux*-android*) gl_cv_func_memchr_works="guessing no" ;;
+                           # Guess yes on native Windows.
+          mingw*)          gl_cv_func_memchr_works="guessing yes" ;;
+                           # If we don't know, obey --enable-cross-guesses.
+          *)               gl_cv_func_memchr_works="$gl_cross_guess_normal" ;;
+        esac
+       ])
+    ])
+  case "$gl_cv_func_memchr_works" in
+    *yes) ;;
+    *) REPLACE_MEMCHR=1 ;;
+  esac
 ])
 
 # Prerequisites of lib/memchr.c.
diff --git a/m4/mempcpy.m4 b/m4/mempcpy.m4
new file mode 100644
index 0000000..f9d9ec8
--- /dev/null
+++ b/m4/mempcpy.m4
@@ -0,0 +1,26 @@
+# mempcpy.m4 serial 12
+dnl Copyright (C) 2003-2004, 2006-2007, 2009-2021 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MEMPCPY],
+[
+  dnl Persuade glibc <string.h> to declare mempcpy().
+  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+  dnl The mempcpy() declaration in lib/string.in.h uses 'restrict'.
+  AC_REQUIRE([AC_C_RESTRICT])
+
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
+  AC_CHECK_FUNCS([mempcpy])
+  if test $ac_cv_func_mempcpy = no; then
+    HAVE_MEMPCPY=0
+  fi
+])
+
+# Prerequisites of lib/mempcpy.c.
+AC_DEFUN([gl_PREREQ_MEMPCPY], [
+  :
+])
diff --git a/m4/memrchr.m4 b/m4/memrchr.m4
new file mode 100644
index 0000000..40f61c5
--- /dev/null
+++ b/m4/memrchr.m4
@@ -0,0 +1,23 @@
+# memrchr.m4 serial 11
+dnl Copyright (C) 2002-2003, 2005-2007, 2009-2021 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_MEMRCHR],
+[
+  dnl Persuade glibc <string.h> to declare memrchr().
+  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
+  AC_CHECK_DECLS_ONCE([memrchr])
+  if test $ac_cv_have_decl_memrchr = no; then
+    HAVE_DECL_MEMRCHR=0
+  fi
+
+  AC_CHECK_FUNCS([memrchr])
+])
+
+# Prerequisites of lib/memrchr.c.
+AC_DEFUN([gl_PREREQ_MEMRCHR], [:])
diff --git a/m4/minmax.m4 b/m4/minmax.m4
index 1e0d30b..e21a687 100644
--- a/m4/minmax.m4
+++ b/m4/minmax.m4
@@ -1,5 +1,5 @@
 # minmax.m4 serial 4
-dnl Copyright (C) 2005, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2005, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/mmap-anon.m4 b/m4/mmap-anon.m4
index 50c3808..e47aa2d 100644
--- a/m4/mmap-anon.m4
+++ b/m4/mmap-anon.m4
@@ -1,5 +1,5 @@
-# mmap-anon.m4 serial 10
-dnl Copyright (C) 2005, 2007, 2009-2019 Free Software Foundation, Inc.
+# mmap-anon.m4 serial 12
+dnl Copyright (C) 2005, 2007, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -9,11 +9,11 @@
 # - On Linux, AIX, OSF/1, Solaris, Cygwin, Interix, Haiku, both MAP_ANONYMOUS
 #   and MAP_ANON exist and have the same value.
 # - On HP-UX, only MAP_ANONYMOUS exists.
-# - On Mac OS X, FreeBSD, NetBSD, OpenBSD, only MAP_ANON exists.
+# - On Mac OS X, FreeBSD, NetBSD, OpenBSD, Minix, only MAP_ANON exists.
 # - On IRIX, neither exists, and a file descriptor opened to /dev/zero must be
 #   used.
 
-AC_DEFUN([gl_FUNC_MMAP_ANON],
+AC_DEFUN_ONCE([gl_FUNC_MMAP_ANON],
 [
   dnl Persuade glibc <sys/mman.h> to define MAP_ANONYMOUS.
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
diff --git a/m4/mode_t.m4 b/m4/mode_t.m4
index ba840dc..3bd4b89 100644
--- a/m4/mode_t.m4
+++ b/m4/mode_t.m4
@@ -1,5 +1,5 @@
 # mode_t.m4 serial 2
-dnl Copyright (C) 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/msvc-inval.m4 b/m4/msvc-inval.m4
index 4b95876..3ba5b4e 100644
--- a/m4/msvc-inval.m4
+++ b/m4/msvc-inval.m4
@@ -1,5 +1,5 @@
 # msvc-inval.m4 serial 1
-dnl Copyright (C) 2011-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2011-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/msvc-nothrow.m4 b/m4/msvc-nothrow.m4
index 7e73b40..aae25ce 100644
--- a/m4/msvc-nothrow.m4
+++ b/m4/msvc-nothrow.m4
@@ -1,5 +1,5 @@
 # msvc-nothrow.m4 serial 1
-dnl Copyright (C) 2011-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2011-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/multiarch.m4 b/m4/multiarch.m4
index d48316e..f1678d9 100644
--- a/m4/multiarch.m4
+++ b/m4/multiarch.m4
@@ -1,5 +1,5 @@
-# multiarch.m4 serial 7
-dnl Copyright (C) 2008-2019 Free Software Foundation, Inc.
+# multiarch.m4 serial 9
+dnl Copyright (C) 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -21,37 +21,40 @@
 AC_DEFUN_ONCE([gl_MULTIARCH],
 [
   dnl Code similar to autoconf-2.63 AC_C_BIGENDIAN.
-  gl_cv_c_multiarch=no
-  AC_COMPILE_IFELSE(
-    [AC_LANG_SOURCE(
-      [[#ifndef __APPLE_CC__
-         not a universal capable compiler
-        #endif
-        typedef int dummy;
-      ]])],
-    [
-     dnl Check for potential -arch flags.  It is not universal unless
-     dnl there are at least two -arch flags with different values.
-     arch=
-     prev=
-     for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do
-       if test -n "$prev"; then
-         case $word in
-           i?86 | x86_64 | ppc | ppc64)
-             if test -z "$arch" || test "$arch" = "$word"; then
-               arch="$word"
-             else
-               gl_cv_c_multiarch=yes
-             fi
-             ;;
-         esac
-         prev=
-       else
-         if test "x$word" = "x-arch"; then
-           prev=arch
-         fi
-       fi
-     done
+  AC_CACHE_CHECK([whether the compiler produces multi-arch binaries],
+    [gl_cv_c_multiarch],
+    [gl_cv_c_multiarch=no
+     AC_COMPILE_IFELSE(
+       [AC_LANG_SOURCE(
+         [[#ifndef __APPLE_CC__
+            not a universal capable compiler
+           #endif
+           typedef int dummy;
+         ]])],
+       [
+        dnl Check for potential -arch flags.  It is not universal unless
+        dnl there are at least two -arch flags with different values.
+        arch=
+        prev=
+        for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do
+          if test -n "$prev"; then
+            case $word in
+              i?86 | x86_64 | ppc | ppc64 | arm | arm64)
+                if test -z "$arch" || test "$arch" = "$word"; then
+                  arch="$word"
+                else
+                  gl_cv_c_multiarch=yes
+                fi
+                ;;
+            esac
+            prev=
+          else
+            if test "x$word" = "x-arch"; then
+              prev=arch
+            fi
+          fi
+        done
+       ])
     ])
   if test $gl_cv_c_multiarch = yes; then
     APPLE_UNIVERSAL_BUILD=1
diff --git a/m4/musl.m4 b/m4/musl.m4
new file mode 100644
index 0000000..60bd62a
--- /dev/null
+++ b/m4/musl.m4
@@ -0,0 +1,18 @@
+# musl.m4 serial 3
+dnl Copyright (C) 2019-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Test for musl libc, despite the musl libc authors don't like it
+# <https://wiki.musl-libc.org/faq.html>
+# <https://lists.gnu.org/archive/html/bug-gnulib/2018-02/msg00079.html>.
+# From Bruno Haible.
+
+AC_DEFUN_ONCE([gl_MUSL_LIBC],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  case "$host_os" in
+    *-musl*) AC_DEFINE([MUSL_LIBC], [1], [Define to 1 on musl libc.]) ;;
+  esac
+])
diff --git a/m4/nocrash.m4 b/m4/nocrash.m4
index 8577038..27412cd 100644
--- a/m4/nocrash.m4
+++ b/m4/nocrash.m4
@@ -1,5 +1,5 @@
 # nocrash.m4 serial 5
-dnl Copyright (C) 2005, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2005, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/non-recursive-gnulib-prefix-hack.m4 b/m4/non-recursive-gnulib-prefix-hack.m4
index eef7e75..bd3bb52 100644
--- a/m4/non-recursive-gnulib-prefix-hack.m4
+++ b/m4/non-recursive-gnulib-prefix-hack.m4
@@ -1,4 +1,4 @@
-dnl Copyright (C) 2012-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2012-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/obstack-printf.m4 b/m4/obstack-printf.m4
index deea045..ebfc768 100644
--- a/m4/obstack-printf.m4
+++ b/m4/obstack-printf.m4
@@ -1,5 +1,5 @@
 # obstack-printf.m4 serial 4
-dnl Copyright (C) 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/obstack.m4 b/m4/obstack.m4
index b56fca4..e363d01 100644
--- a/m4/obstack.m4
+++ b/m4/obstack.m4
@@ -1,6 +1,6 @@
 # See if we need to provide obstacks.
 
-dnl Copyright 1996-2019 Free Software Foundation, Inc.
+dnl Copyright 1996-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/off_t.m4 b/m4/off_t.m4
index 711a2d4..bdec43c 100644
--- a/m4/off_t.m4
+++ b/m4/off_t.m4
@@ -1,5 +1,5 @@
 # off_t.m4 serial 1
-dnl Copyright (C) 2012-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2012-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/open-cloexec.m4 b/m4/open-cloexec.m4
index 52498d9..542a90f 100644
--- a/m4/open-cloexec.m4
+++ b/m4/open-cloexec.m4
@@ -1,6 +1,6 @@
 # Test whether O_CLOEXEC is defined.
 
-dnl Copyright 2017-2019 Free Software Foundation, Inc.
+dnl Copyright 2017-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/open-slash.m4 b/m4/open-slash.m4
index a8756ae..e619039 100644
--- a/m4/open-slash.m4
+++ b/m4/open-slash.m4
@@ -1,5 +1,5 @@
-# open-slash.m4 serial 1
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+# open-slash.m4 serial 2
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -25,6 +25,7 @@
 #if HAVE_UNISTD_H
 # include <unistd.h>
 #endif
+]GL_MDA_DEFINES[
 int main ()
 {
   int result = 0;
diff --git a/m4/open.m4 b/m4/open.m4
index 6cf0beb..c634386 100644
--- a/m4/open.m4
+++ b/m4/open.m4
@@ -1,5 +1,5 @@
 # open.m4 serial 15
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/openat.m4 b/m4/openat.m4
new file mode 100644
index 0000000..eba0f51
--- /dev/null
+++ b/m4/openat.m4
@@ -0,0 +1,38 @@
+# serial 46
+# See if we need to use our replacement for Solaris' openat et al functions.
+
+dnl Copyright (C) 2004-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Written by Jim Meyering.
+
+AC_DEFUN([gl_FUNC_OPENAT],
+[
+  AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+  AC_CHECK_FUNCS_ONCE([openat])
+  AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
+  AC_REQUIRE([gl_PREPROC_O_CLOEXEC])
+  case $ac_cv_func_openat+$gl_cv_func_lstat_dereferences_slashed_symlink+$gl_cv_macro_O_CLOEXEC in
+  yes+*yes+yes)
+    ;;
+  yes+*)
+    # Solaris 10 lacks O_CLOEXEC.
+    # Solaris 9 has *at functions, but uniformly mishandles trailing
+    # slash in all of them.
+    REPLACE_OPENAT=1
+    ;;
+  *)
+    HAVE_OPENAT=0
+    ;;
+  esac
+])
+
+# Prerequisites of lib/openat.c.
+AC_DEFUN([gl_PREREQ_OPENAT],
+[
+  AC_REQUIRE([gl_PROMOTED_TYPE_MODE_T])
+  :
+])
diff --git a/m4/opendir.m4 b/m4/opendir.m4
new file mode 100644
index 0000000..517edae
--- /dev/null
+++ b/m4/opendir.m4
@@ -0,0 +1,32 @@
+# opendir.m4 serial 5
+dnl Copyright (C) 2011-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_OPENDIR],
+[
+  AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+  AC_CHECK_FUNCS([opendir])
+  if test $ac_cv_func_opendir = no; then
+    HAVE_OPENDIR=0
+  fi
+  dnl Replace opendir() for supporting the gnulib-defined fchdir() function,
+  dnl to keep fchdir's bookkeeping up-to-date.
+  m4_ifdef([gl_FUNC_FCHDIR], [
+    gl_TEST_FCHDIR
+    if test $HAVE_FCHDIR = 0; then
+      if test $HAVE_OPENDIR = 1; then
+        REPLACE_OPENDIR=1
+      fi
+    fi
+  ])
+  dnl Replace opendir() on OS/2 kLIBC to support dirfd() function replaced
+  dnl by gnulib.
+  case $host_os,$HAVE_OPENDIR in
+    os2*,1)
+      REPLACE_OPENDIR=1;;
+  esac
+])
diff --git a/m4/pathmax.m4 b/m4/pathmax.m4
index 0770aca..e67c656 100644
--- a/m4/pathmax.m4
+++ b/m4/pathmax.m4
@@ -1,5 +1,5 @@
 # pathmax.m4 serial 11
-dnl Copyright (C) 2002-2003, 2005-2006, 2009-2019 Free Software Foundation,
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2021 Free Software Foundation,
 dnl Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
diff --git a/m4/perror.m4 b/m4/perror.m4
index 8e9a3a8..9f2ac2d 100644
--- a/m4/perror.m4
+++ b/m4/perror.m4
@@ -1,5 +1,5 @@
 # perror.m4 serial 9
-dnl Copyright (C) 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/pipe.m4 b/m4/pipe.m4
new file mode 100644
index 0000000..89d666d
--- /dev/null
+++ b/m4/pipe.m4
@@ -0,0 +1,15 @@
+# pipe.m4 serial 2
+dnl Copyright (C) 2010-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_PIPE],
+[
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+  AC_CHECK_FUNCS_ONCE([pipe])
+  if test $ac_cv_func_pipe != yes; then
+    HAVE_PIPE=0
+  fi
+])
diff --git a/m4/pipe2.m4 b/m4/pipe2.m4
index 03008eb..43d547c 100644
--- a/m4/pipe2.m4
+++ b/m4/pipe2.m4
@@ -1,5 +1,5 @@
 # pipe2.m4 serial 2
-dnl Copyright (C) 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/posix_spawn.m4 b/m4/posix_spawn.m4
index 0128390..b358da6 100644
--- a/m4/posix_spawn.m4
+++ b/m4/posix_spawn.m4
@@ -1,5 +1,5 @@
-# posix_spawn.m4 serial 17
-dnl Copyright (C) 2008-2019 Free Software Foundation, Inc.
+# posix_spawn.m4 serial 22
+dnl Copyright (C) 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -32,6 +32,7 @@
   dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getsigmask])
   dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setsigmask])
   dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_destroy])
+  AC_CHECK_DECLS([posix_spawn], , , [[#include <spawn.h>]])
   if test $ac_cv_func_posix_spawn = yes; then
     m4_ifdef([gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR],
       [dnl Module 'posix_spawn_file_actions_addchdir' is present.
@@ -54,40 +55,63 @@
     if test $REPLACE_POSIX_SPAWN = 0; then
       gl_POSIX_SPAWN_WORKS
       case "$gl_cv_func_posix_spawn_works" in
-        *yes)
-          dnl Assume that these functions are available if POSIX_SPAWN_SETSCHEDULER
-          dnl evaluates to nonzero.
-          dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getschedpolicy])
-          dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setschedpolicy])
-          AC_CACHE_CHECK([whether posix_spawnattr_setschedpolicy is supported],
-            [gl_cv_func_spawnattr_setschedpolicy],
-            [AC_EGREP_CPP([POSIX scheduling supported], [
+        *yes) ;;
+        *) REPLACE_POSIX_SPAWN=1 ;;
+      esac
+    fi
+    if test $REPLACE_POSIX_SPAWN = 0; then
+      gl_POSIX_SPAWN_SECURE
+      case "$gl_cv_func_posix_spawn_secure_exec" in
+        *yes) ;;
+        *) REPLACE_POSIX_SPAWN=1 ;;
+      esac
+      case "$gl_cv_func_posix_spawnp_secure_exec" in
+        *yes) ;;
+        *) REPLACE_POSIX_SPAWN=1 ;;
+      esac
+    fi
+    if test $REPLACE_POSIX_SPAWN = 0; then
+      dnl Assume that these functions are available if POSIX_SPAWN_SETSCHEDULER
+      dnl evaluates to nonzero.
+      dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getschedpolicy])
+      dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setschedpolicy])
+      AC_CACHE_CHECK([whether posix_spawnattr_setschedpolicy is supported],
+        [gl_cv_func_spawnattr_setschedpolicy],
+        [AC_EGREP_CPP([POSIX scheduling supported], [
 #include <spawn.h>
 #if POSIX_SPAWN_SETSCHEDULER
  POSIX scheduling supported
 #endif
 ],
-               [gl_cv_func_spawnattr_setschedpolicy=yes],
-               [gl_cv_func_spawnattr_setschedpolicy=no])
-            ])
-          dnl Assume that these functions are available if POSIX_SPAWN_SETSCHEDPARAM
-          dnl evaluates to nonzero.
-          dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getschedparam])
-          dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setschedparam])
-          AC_CACHE_CHECK([whether posix_spawnattr_setschedparam is supported],
-            [gl_cv_func_spawnattr_setschedparam],
-            [AC_EGREP_CPP([POSIX scheduling supported], [
+           [gl_cv_func_spawnattr_setschedpolicy=yes],
+           [gl_cv_func_spawnattr_setschedpolicy=no])
+        ])
+      dnl Assume that these functions are available if POSIX_SPAWN_SETSCHEDPARAM
+      dnl evaluates to nonzero.
+      dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getschedparam])
+      dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setschedparam])
+      AC_CACHE_CHECK([whether posix_spawnattr_setschedparam is supported],
+        [gl_cv_func_spawnattr_setschedparam],
+        [AC_EGREP_CPP([POSIX scheduling supported], [
 #include <spawn.h>
 #if POSIX_SPAWN_SETSCHEDPARAM
  POSIX scheduling supported
 #endif
 ],
-               [gl_cv_func_spawnattr_setschedparam=yes],
-               [gl_cv_func_spawnattr_setschedparam=no])
-            ])
-          ;;
-        *) REPLACE_POSIX_SPAWN=1 ;;
-      esac
+           [gl_cv_func_spawnattr_setschedparam=yes],
+           [gl_cv_func_spawnattr_setschedparam=no])
+        ])
+    fi
+  else
+    dnl The system does not have the main function. Therefore we have to
+    dnl provide our own implementation. This implies to define our own
+    dnl posix_spawn_file_actions_t and posix_spawnattr_t types.
+    if test $ac_cv_have_decl_posix_spawn = yes; then
+      dnl The system declares posix_spawn() already. This declaration uses
+      dnl the original posix_spawn_file_actions_t and posix_spawnattr_t types.
+      dnl But we need a declaration with our own posix_spawn_file_actions_t and
+      dnl posix_spawnattr_t types.
+      REPLACE_POSIX_SPAWN=1
     fi
   fi
   if test $ac_cv_func_posix_spawn != yes || test $REPLACE_POSIX_SPAWN = 1; then
@@ -123,6 +147,7 @@
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/wait.h>
+]GL_MDA_DEFINES[
 
 extern char **environ;
 
@@ -266,6 +291,7 @@
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/wait.h>
+]GL_MDA_DEFINES[
 
 extern char **environ;
 
@@ -415,6 +441,114 @@
     ])
 ])
 
+dnl Test whether posix_spawn and posix_spawnp are secure.
+AC_DEFUN([gl_POSIX_SPAWN_SECURE],
+[
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  dnl On many platforms, posix_spawn or posix_spawnp allow executing a
+  dnl script without a '#!' marker as a shell script. This is unsecure.
+  AC_CACHE_CHECK([whether posix_spawn rejects scripts without shebang],
+    [gl_cv_func_posix_spawn_secure_exec],
+    [echo ':' > conftest.scr
+     chmod a+x conftest.scr
+     AC_RUN_IFELSE([AC_LANG_SOURCE([[
+       #include <errno.h>
+       #include <spawn.h>
+       #include <stddef.h>
+       #include <sys/types.h>
+       #include <sys/wait.h>
+       int
+       main ()
+       {
+         const char *prog_path = "./conftest.scr";
+         const char *prog_argv[2] = { prog_path, NULL };
+         const char *environment[2] = { "PATH=.", NULL };
+         pid_t child;
+         int status;
+         int err = posix_spawn (&child, prog_path, NULL, NULL,
+                                (char **) prog_argv, (char **) environment);
+         if (err == ENOEXEC)
+           return 0;
+         if (err != 0)
+           return 1;
+         status = 0;
+         while (waitpid (child, &status, 0) != child)
+           ;
+         if (!WIFEXITED (status))
+           return 2;
+         if (WEXITSTATUS (status) != 127)
+           return 3;
+         return 0;
+       }
+       ]])],
+       [gl_cv_func_posix_spawn_secure_exec=yes],
+       [gl_cv_func_posix_spawn_secure_exec=no],
+       [case "$host_os" in
+          # Guess no on GNU/Hurd.
+          gnu*)
+            gl_cv_func_posix_spawn_secure_exec="guessing no" ;;
+          # Guess yes on all other platforms.
+          *)
+            gl_cv_func_posix_spawn_secure_exec="guessing yes" ;;
+        esac
+       ])
+     rm -f conftest.scr
+    ])
+  AC_CACHE_CHECK([whether posix_spawnp rejects scripts without shebang],
+    [gl_cv_func_posix_spawnp_secure_exec],
+    [echo ':' > conftest.scr
+     chmod a+x conftest.scr
+     AC_RUN_IFELSE([AC_LANG_SOURCE([[
+       #include <errno.h>
+       #include <spawn.h>
+       #include <stddef.h>
+       #include <sys/types.h>
+       #include <sys/wait.h>
+       int
+       main ()
+       {
+         const char *prog_path = "./conftest.scr";
+         const char *prog_argv[2] = { prog_path, NULL };
+         const char *environment[2] = { "PATH=.", NULL };
+         pid_t child;
+         int status;
+         int err = posix_spawnp (&child, prog_path, NULL, NULL,
+                                 (char **) prog_argv, (char **) environment);
+         if (err == ENOEXEC)
+           return 0;
+         if (err != 0)
+           return 1;
+         status = 0;
+         while (waitpid (child, &status, 0) != child)
+           ;
+         if (!WIFEXITED (status))
+           return 2;
+         if (WEXITSTATUS (status) != 127)
+           return 3;
+         return 0;
+       }
+       ]])],
+       [gl_cv_func_posix_spawnp_secure_exec=yes],
+       [gl_cv_func_posix_spawnp_secure_exec=no],
+       [case "$host_os" in
+          # Guess yes on glibc systems (glibc >= 2.15 actually) except GNU/Hurd,
+          # musl libc, NetBSD.
+          *-gnu* | *-musl* | netbsd*)
+            gl_cv_func_posix_spawnp_secure_exec="guessing yes" ;;
+          # Guess no on GNU/Hurd, macOS, FreeBSD, OpenBSD, AIX, Solaris, Cygwin.
+          gnu* | darwin* | freebsd* | dragonfly* | midnightbsd* | openbsd* | \
+          aix* | solaris* | cygwin*)
+            gl_cv_func_posix_spawnp_secure_exec="guessing no" ;;
+          # If we don't know, obey --enable-cross-guesses.
+          *)
+            gl_cv_func_posix_spawnp_secure_exec="$gl_cross_guess_normal" ;;
+        esac
+       ])
+     rm -f conftest.scr
+    ])
+])
+
 # Prerequisites of lib/spawni.c.
 AC_DEFUN([gl_PREREQ_POSIX_SPAWN_INTERNAL],
 [
@@ -431,8 +565,8 @@
   if test $REPLACE_POSIX_SPAWN = 1; then
     REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=1
   else
-    dnl On musl libc and Solaris 11.0, posix_spawn_file_actions_addclose
-    dnl succeeds even if the fd argument is out of range.
+    dnl On musl libc, posix_spawn_file_actions_addclose succeeds even if the fd
+    dnl argument is negative.
     AC_CACHE_CHECK([whether posix_spawn_file_actions_addclose works],
       [gl_cv_func_posix_spawn_file_actions_addclose_works],
       [AC_RUN_IFELSE(
@@ -443,7 +577,7 @@
   posix_spawn_file_actions_t actions;
   if (posix_spawn_file_actions_init (&actions) != 0)
     return 1;
-  if (posix_spawn_file_actions_addclose (&actions, 10000000) == 0)
+  if (posix_spawn_file_actions_addclose (&actions, -5) == 0)
     return 2;
   return 0;
 }]])],
diff --git a/m4/posix_spawn_faction_addchdir.m4 b/m4/posix_spawn_faction_addchdir.m4
new file mode 100644
index 0000000..8ad40ed
--- /dev/null
+++ b/m4/posix_spawn_faction_addchdir.m4
@@ -0,0 +1,20 @@
+# posix_spawn_faction_addchdir.m4 serial 1
+dnl Copyright (C) 2018-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR],
+[
+  AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+  AC_REQUIRE([AC_PROG_CC])
+  gl_POSIX_SPAWN
+  AC_CHECK_FUNCS_ONCE([posix_spawn_file_actions_addchdir posix_spawn_file_actions_addchdir_np])
+  if test $ac_cv_func_posix_spawn_file_actions_addchdir = yes; then
+    dnl This function is not yet standardized. Therefore override the
+    dnl system's implementation always.
+    REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=1
+  else
+    HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=0
+  fi
+])
diff --git a/m4/printf-frexp.m4 b/m4/printf-frexp.m4
index 4d4aae5..33bcc4a 100644
--- a/m4/printf-frexp.m4
+++ b/m4/printf-frexp.m4
@@ -1,5 +1,5 @@
 # printf-frexp.m4 serial 5
-dnl Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/printf-frexpl.m4 b/m4/printf-frexpl.m4
index 6835612..c127a60 100644
--- a/m4/printf-frexpl.m4
+++ b/m4/printf-frexpl.m4
@@ -1,5 +1,5 @@
 # printf-frexpl.m4 serial 10
-dnl Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/printf-posix-rpl.m4 b/m4/printf-posix-rpl.m4
index b98da6f..c9be8a7 100644
--- a/m4/printf-posix-rpl.m4
+++ b/m4/printf-posix-rpl.m4
@@ -1,5 +1,5 @@
 # printf-posix-rpl.m4 serial 4
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/printf.m4 b/m4/printf.m4
index d59db20..284c7c5 100644
--- a/m4/printf.m4
+++ b/m4/printf.m4
@@ -1,5 +1,5 @@
-# printf.m4 serial 62
-dnl Copyright (C) 2003, 2007-2019 Free Software Foundation, Inc.
+# printf.m4 serial 73
+dnl Copyright (C) 2003, 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -67,6 +67,7 @@
                                  # Guess yes on FreeBSD >= 5.
            freebsd[1-4].*)       gl_cv_func_printf_sizes_c99="guessing no";;
            freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
+           midnightbsd*)         gl_cv_func_printf_sizes_c99="guessing yes";;
                                  # Guess yes on Mac OS X >= 10.3.
            darwin[1-6].*)        gl_cv_func_printf_sizes_c99="guessing no";;
            darwin*)              gl_cv_func_printf_sizes_c99="guessing yes";;
@@ -247,6 +248,7 @@
                                  # Guess yes on FreeBSD >= 6.
            freebsd[1-5].*)       gl_cv_func_printf_infinite="guessing no";;
            freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";;
+           midnightbsd*)         gl_cv_func_printf_infinite="guessing yes";;
                                  # Guess yes on Mac OS X >= 10.3.
            darwin[1-6].*)        gl_cv_func_printf_infinite="guessing no";;
            darwin*)              gl_cv_func_printf_infinite="guessing yes";;
@@ -257,6 +259,9 @@
            netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
                                  gl_cv_func_printf_infinite="guessing no";;
            netbsd*)              gl_cv_func_printf_infinite="guessing yes";;
+                                 # Guess yes on OpenBSD >= 6.0.
+           openbsd[1-5].*)       gl_cv_func_printf_infinite="guessing no";;
+           openbsd*)             gl_cv_func_printf_infinite="guessing yes";;
                                  # Guess yes on BeOS.
            beos*)                gl_cv_func_printf_infinite="guessing yes";;
                                  # Guess no on Android.
@@ -466,9 +471,13 @@
                                          # Guess yes on FreeBSD >= 6.
                    freebsd[1-5].*)       gl_cv_func_printf_infinite_long_double="guessing no";;
                    freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+                   midnightbsd*)         gl_cv_func_printf_infinite_long_double="guessing yes";;
                                          # Guess yes on HP-UX >= 11.
                    hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";;
                    hpux*)                gl_cv_func_printf_infinite_long_double="guessing yes";;
+                                         # Guess yes on OpenBSD >= 6.0.
+                   openbsd[1-5].*)       gl_cv_func_printf_infinite_long_double="guessing no";;
+                   openbsd*)             gl_cv_func_printf_infinite_long_double="guessing yes";;
                                          # Guess no on Android.
                    linux*-android*)      gl_cv_func_printf_infinite_long_double="guessing no";;
 changequote([,])dnl
@@ -528,7 +537,7 @@
           && strcmp (buf, "-0X6.488P-1 33") != 0
           && strcmp (buf, "-0XC.91P-2 33") != 0))
     result |= 2;
-  /* This catches a FreeBSD 6.1 bug: it doesn't round.  */
+  /* This catches a FreeBSD 13.0 bug: it doesn't round.  */
   if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0
       || (strcmp (buf, "0x1.83p+0 33") != 0
           && strcmp (buf, "0x3.05p-1 33") != 0
@@ -638,9 +647,13 @@
                                  # Guess yes on FreeBSD >= 6.
            freebsd[1-5].*)       gl_cv_func_printf_directive_f="guessing no";;
            freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
+           midnightbsd*)         gl_cv_func_printf_directive_f="guessing yes";;
                                  # Guess yes on Mac OS X >= 10.3.
            darwin[1-6].*)        gl_cv_func_printf_directive_f="guessing no";;
            darwin*)              gl_cv_func_printf_directive_f="guessing yes";;
+                                 # Guess yes on OpenBSD >= 6.0.
+           openbsd[1-5].*)       gl_cv_func_printf_directive_f="guessing no";;
+           openbsd*)             gl_cv_func_printf_directive_f="guessing yes";;
                                  # Guess yes on Solaris >= 2.10.
            solaris2.[1-9][0-9]*) gl_cv_func_printf_directive_f="guessing yes";;
            solaris*)             gl_cv_func_printf_directive_f="guessing no";;
@@ -680,7 +693,10 @@
 #include <stdlib.h>
 #include <string.h>
 #ifdef _MSC_VER
-/* See page about "Parameter Validation" on msdn.microsoft.com.  */
+#include <inttypes.h>
+/* See page about "Parameter Validation" on msdn.microsoft.com.
+   <https://docs.microsoft.com/en-us/cpp/c-runtime-library/parameter-validation>
+   <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/set-invalid-parameter-handler-set-thread-local-invalid-parameter-handler>  */
 static void cdecl
 invalid_parameter_handler (const wchar_t *expression,
                            const wchar_t *function,
@@ -711,6 +727,16 @@
         [gl_cv_func_printf_directive_n=yes],
         [gl_cv_func_printf_directive_n=no],
         [case "$host_os" in
+                            # Guess no on glibc when _FORTIFY_SOURCE >= 2.
+           *-gnu* | gnu*)   AC_COMPILE_IFELSE(
+                              [AC_LANG_SOURCE(
+                                 [[#if _FORTIFY_SOURCE >= 2
+                                    error fail
+                                   #endif
+                                 ]])],
+                              [gl_cv_func_printf_directive_n="guessing yes"],
+                              [gl_cv_func_printf_directive_n="guessing no"])
+                            ;;
                             # Guess no on Android.
            linux*-android*) gl_cv_func_printf_directive_n="guessing no";;
                             # Guess no on native Windows.
@@ -737,13 +763,7 @@
     [
       AC_RUN_IFELSE(
         [AC_LANG_SOURCE([[
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
 #include <stdio.h>
-#include <time.h>
 #include <wchar.h>
 #include <string.h>
 int main ()
@@ -791,7 +811,9 @@
         [
 changequote(,)dnl
          case "$host_os" in
-           openbsd*)        gl_cv_func_printf_directive_ls="guessing no";;
+                            # Guess yes on OpenBSD >= 6.0.
+           openbsd[1-5].*)  gl_cv_func_printf_directive_ls="guessing no";;
+           openbsd*)        gl_cv_func_printf_directive_ls="guessing yes";;
            irix*)           gl_cv_func_printf_directive_ls="guessing no";;
            solaris*)        gl_cv_func_printf_directive_ls="guessing no";;
            cygwin*)         gl_cv_func_printf_directive_ls="guessing no";;
@@ -1059,9 +1081,8 @@
       gl_cv_func_printf_enomem="guessing no"
       if test "$cross_compiling" = no; then
         if test $APPLE_UNIVERSAL_BUILD = 0; then
-          AC_LANG_CONFTEST([AC_LANG_SOURCE([
+          AC_LANG_CONFTEST([AC_LANG_SOURCE([[
 ]GL_NOCRASH[
-changequote(,)dnl
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/time.h>
@@ -1106,8 +1127,7 @@
   ret = printf ("%.5000000f", 1.0);
   return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
 }
-changequote([,])dnl
-          ])])
+          ]])])
           if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
             (./conftest 2>&AS_MESSAGE_LOG_FD
              result=$?
@@ -1176,7 +1196,7 @@
 dnl terminated. (ISO C99, POSIX:2001)
 dnl Result is gl_cv_func_snprintf_truncation_c99.
 
-AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99],
+AC_DEFUN_ONCE([gl_SNPRINTF_TRUNCATION_C99],
 [
   AC_REQUIRE([AC_PROG_CC])
   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
@@ -1223,6 +1243,7 @@
                                  # Guess yes on FreeBSD >= 5.
            freebsd[1-4].*)       gl_cv_func_snprintf_truncation_c99="guessing no";;
            freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+           midnightbsd*)         gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                  # Guess yes on Mac OS X >= 10.3.
            darwin[1-6].*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
            darwin*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
@@ -1327,6 +1348,7 @@
                                  # Guess yes on FreeBSD >= 5.
            freebsd[1-4].*)       gl_cv_func_snprintf_retval_c99="guessing no";;
            freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+           midnightbsd*)         gl_cv_func_snprintf_retval_c99="guessing yes";;
                                  # Guess yes on Mac OS X >= 10.3.
            darwin[1-6].*)        gl_cv_func_snprintf_retval_c99="guessing no";;
            darwin*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
@@ -1412,15 +1434,24 @@
         [gl_cv_func_snprintf_directive_n=yes],
         [gl_cv_func_snprintf_directive_n=no],
         [
-changequote(,)dnl
          case "$host_os" in
-                                 # Guess yes on glibc systems.
-           *-gnu* | gnu*)        gl_cv_func_snprintf_directive_n="guessing yes";;
+                                 # Guess no on glibc when _FORTIFY_SOURCE >= 2.
+           *-gnu* | gnu*)        AC_COMPILE_IFELSE(
+                                   [AC_LANG_SOURCE(
+                                      [[#if _FORTIFY_SOURCE >= 2
+                                         error fail
+                                        #endif
+                                      ]])],
+                                   [gl_cv_func_snprintf_directive_n="guessing yes"],
+                                   [gl_cv_func_snprintf_directive_n="guessing no"])
+                                 ;;
+changequote(,)dnl
                                  # Guess yes on musl systems.
            *-musl*)              gl_cv_func_snprintf_directive_n="guessing yes";;
                                  # Guess yes on FreeBSD >= 5.
            freebsd[1-4].*)       gl_cv_func_snprintf_directive_n="guessing no";;
            freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
+           midnightbsd*)         gl_cv_func_snprintf_directive_n="guessing yes";;
                                  # Guess yes on Mac OS X >= 10.3.
            darwin[1-6].*)        gl_cv_func_snprintf_directive_n="guessing no";;
            darwin*)              gl_cv_func_snprintf_directive_n="guessing yes";;
@@ -1448,8 +1479,8 @@
            mingw*)               gl_cv_func_snprintf_directive_n="guessing no";;
                                  # If we don't know, obey --enable-cross-guesses.
            *)                    gl_cv_func_snprintf_directive_n="$gl_cross_guess_normal";;
-         esac
 changequote([,])dnl
+         esac
         ])
     ])
 ])
@@ -1577,6 +1608,7 @@
                                  # Guess yes on FreeBSD >= 5.
            freebsd[1-4].*)       gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
            freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+           midnightbsd*)         gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                  # Guess yes on Mac OS X >= 10.3.
            darwin[1-6].*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
            darwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
@@ -1658,9 +1690,12 @@
 dnl                                  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
 dnl   glibc 2.5                      .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
 dnl   glibc 2.3.6                    .  .  .  .  #  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
+dnl   FreeBSD 13.0                   .  .  .  .  #  .  .  .  .  .  .  .  .  #  .  .  .  .  .  .
 dnl   FreeBSD 5.4, 6.1               .  .  .  .  #  .  .  .  .  .  .  #  .  #  .  .  .  .  .  .
+dnl   Mac OS X 10.13.5               .  .  .  #  #  .  #  .  .  .  .  .  .  .  .  .  .  #  .  .
 dnl   Mac OS X 10.5.8                .  .  .  #  #  .  .  .  .  .  .  #  .  .  .  .  .  .  .  .
 dnl   Mac OS X 10.3.9                .  .  .  .  #  .  .  .  .  .  .  #  .  #  .  .  .  .  .  .
+dnl   OpenBSD 6.0, 6.7               .  .  .  .  #  .  .  .  .  .  .  .  .  #  .  .  .  .  .  .
 dnl   OpenBSD 3.9, 4.0               .  .  #  #  #  #  .  #  .  #  .  #  .  #  .  .  .  .  .  .
 dnl   Cygwin 1.7.0 (2009)            .  .  .  #  .  .  .  ?  .  .  .  .  .  ?  .  .  .  .  .  .
 dnl   Cygwin 1.5.25 (2008)           .  .  .  #  #  .  .  #  .  .  .  .  .  #  .  .  .  .  .  .
@@ -1680,6 +1715,7 @@
 dnl   IRIX 6.5                       #  .  #  #  #  #  .  #  .  .  .  #  .  .  .  .  #  .  .  .
 dnl   OSF/1 5.1                      #  .  #  #  #  #  .  .  .  .  .  #  .  .  .  .  #  .  .  #
 dnl   OSF/1 4.0d                     #  .  #  #  #  #  .  .  .  .  .  #  .  .  #  #  #  #  #  #
+dnl   NetBSD 9.0                     .  .  .  .  #  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
 dnl   NetBSD 5.0                     .  .  .  #  #  .  .  .  .  .  .  #  .  #  .  .  .  .  .  .
 dnl   NetBSD 4.0                     .  ?  ?  ?  ?  ?  .  ?  .  ?  ?  ?  ?  ?  .  .  .  ?  ?  ?
 dnl   NetBSD 3.0                     .  .  .  .  #  #  .  ?  #  #  ?  #  .  #  .  .  .  .  .  .
diff --git a/m4/pthread_rwlock_rdlock.m4 b/m4/pthread_rwlock_rdlock.m4
index 87886a3..a5fbead 100644
--- a/m4/pthread_rwlock_rdlock.m4
+++ b/m4/pthread_rwlock_rdlock.m4
@@ -1,5 +1,5 @@
 # pthread_rwlock_rdlock.m4 serial 4
-dnl Copyright (C) 2017-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2017-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/quote.m4 b/m4/quote.m4
index feaa735..be205c0 100644
--- a/m4/quote.m4
+++ b/m4/quote.m4
@@ -1,5 +1,5 @@
 # quote.m4 serial 6
-dnl Copyright (C) 2002-2003, 2005-2006, 2009-2019 Free Software Foundation,
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2021 Free Software Foundation,
 dnl Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
diff --git a/m4/quotearg.m4 b/m4/quotearg.m4
index c478f50..19067f5 100644
--- a/m4/quotearg.m4
+++ b/m4/quotearg.m4
@@ -1,10 +1,11 @@
-# quotearg.m4 serial 9
-dnl Copyright (C) 2002, 2004-2019 Free Software Foundation, Inc.
+# quotearg.m4 serial 10
+dnl Copyright (C) 2002, 2004-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 AC_DEFUN([gl_QUOTEARG],
 [
+  AC_REQUIRE([AC_C_RESTRICT])
   :
 ])
diff --git a/m4/raise.m4 b/m4/raise.m4
index f7661e6..4bf0ca9 100644
--- a/m4/raise.m4
+++ b/m4/raise.m4
@@ -1,5 +1,5 @@
 # raise.m4 serial 4
-dnl Copyright (C) 2011-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2011-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/rawmemchr.m4 b/m4/rawmemchr.m4
index 03a8804..452fab1 100644
--- a/m4/rawmemchr.m4
+++ b/m4/rawmemchr.m4
@@ -1,5 +1,5 @@
-# rawmemchr.m4 serial 2
-dnl Copyright (C) 2003, 2007-2019 Free Software Foundation, Inc.
+# rawmemchr.m4 serial 3
+dnl Copyright (C) 2003, 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -9,7 +9,7 @@
   dnl Persuade glibc <string.h> to declare rawmemchr().
   AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
 
-  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
   AC_CHECK_FUNCS([rawmemchr])
   if test $ac_cv_func_rawmemchr = no; then
     HAVE_RAWMEMCHR=0
diff --git a/m4/readdir.m4 b/m4/readdir.m4
new file mode 100644
index 0000000..94dc99c
--- /dev/null
+++ b/m4/readdir.m4
@@ -0,0 +1,15 @@
+# readdir.m4 serial 1
+dnl Copyright (C) 2011-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_READDIR],
+[
+  AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+
+  AC_CHECK_FUNCS([readdir])
+  if test $ac_cv_func_readdir = no; then
+    HAVE_READDIR=0
+  fi
+])
diff --git a/m4/readline.m4 b/m4/readline.m4
new file mode 100644
index 0000000..265dbc4
--- /dev/null
+++ b/m4/readline.m4
@@ -0,0 +1,81 @@
+# readline.m4 serial 10
+dnl Copyright (C) 2005-2006, 2009-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Simon Josefsson, with help from Bruno Haible and Oskar
+dnl Liljeblad.
+
+AC_DEFUN([gl_FUNC_READLINE],
+[
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+
+  dnl Search for libreadline and define LIBREADLINE, LTLIBREADLINE and
+  dnl INCREADLINE accordingly.
+  AC_LIB_LINKFLAGS_BODY([readline])
+
+  dnl Add $INCREADLINE to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed libreadline and not disabled its use
+  dnl via --without-libreadline-prefix, he wants to use it. The AC_LINK_IFELSE
+  dnl will then succeed.
+  am_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCREADLINE])
+
+  AC_CACHE_CHECK([for readline], [gl_cv_lib_readline], [
+    gl_cv_lib_readline=no
+    am_save_LIBS="$LIBS"
+    dnl On some systems, -lreadline doesn't link without an additional
+    dnl -lncurses or -ltermcap.
+    dnl Try -lncurses before -ltermcap, because libtermcap is insecure
+    dnl by design and obsolete since 1994. Try -lcurses last, because
+    dnl libcurses is unusable on some old Unices.
+    for extra_lib in "" ncurses termcap curses; do
+      LIBS="$am_save_LIBS $LIBREADLINE"
+      if test -n "$extra_lib"; then
+        LIBS="$LIBS -l$extra_lib"
+      fi
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>
+#include <readline/readline.h>]],
+          [[readline((char*)0);]])],
+        [if test -n "$extra_lib"; then
+           gl_cv_lib_readline="yes, requires -l$extra_lib"
+         else
+           gl_cv_lib_readline="yes"
+         fi
+        ])
+      if test "$gl_cv_lib_readline" != no; then
+        break
+      fi
+    done
+    LIBS="$am_save_LIBS"
+  ])
+
+  if test "$gl_cv_lib_readline" != no; then
+    AC_DEFINE([HAVE_READLINE], [1], [Define if you have the readline library.])
+    extra_lib=`echo "$gl_cv_lib_readline" | sed -n -e 's/yes, requires //p'`
+    if test -n "$extra_lib"; then
+      LIBREADLINE="$LIBREADLINE $extra_lib"
+      LTLIBREADLINE="$LTLIBREADLINE $extra_lib"
+    fi
+    AC_MSG_CHECKING([how to link with libreadline])
+    AC_MSG_RESULT([$LIBREADLINE])
+  else
+    dnl If $LIBREADLINE didn't lead to a usable library, we don't
+    dnl need $INCREADLINE either.
+    CPPFLAGS="$am_save_CPPFLAGS"
+    LIBREADLINE=
+    LTLIBREADLINE=
+  fi
+  AC_SUBST([LIBREADLINE])
+  AC_SUBST([LTLIBREADLINE])
+
+  AC_CHECK_HEADERS([readline/readline.h readline/history.h])
+])
+
+# Prerequisites of lib/readline.c.
+AC_DEFUN([gl_PREREQ_READLINE], [
+  :
+])
diff --git a/m4/readlink.m4 b/m4/readlink.m4
index 7aa6ce0..352788c 100644
--- a/m4/readlink.m4
+++ b/m4/readlink.m4
@@ -1,5 +1,5 @@
-# readlink.m4 serial 15
-dnl Copyright (C) 2003, 2007, 2009-2019 Free Software Foundation, Inc.
+# readlink.m4 serial 16
+dnl Copyright (C) 2003, 2007, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -23,7 +23,7 @@
     dnl Solaris 9 ignores trailing slash.
     dnl FreeBSD 7.2 dereferences only one level of links with trailing slash.
     AC_CACHE_CHECK([whether readlink handles trailing slash correctly],
-      [gl_cv_func_readlink_works],
+      [gl_cv_func_readlink_trailing_slash],
       [# We have readlink, so assume ln -s works.
        ln -s conftest.no-such conftest.link
        ln -s conftest.link conftest.lnk2
@@ -32,18 +32,22 @@
            [[#include <unistd.h>
 ]], [[char buf[20];
       return readlink ("conftest.lnk2/", buf, sizeof buf) != -1;]])],
-         [gl_cv_func_readlink_works=yes], [gl_cv_func_readlink_works=no],
+         [gl_cv_func_readlink_trailing_slash=yes],
+         [gl_cv_func_readlink_trailing_slash=no],
          [case "$host_os" in
-                             # Guess yes on Linux systems.
-            linux-* | linux) gl_cv_func_readlink_works="guessing yes" ;;
-                             # Guess yes on glibc systems.
-            *-gnu* | gnu*)   gl_cv_func_readlink_works="guessing yes" ;;
-                             # If we don't know, obey --enable-cross-guesses.
-            *)               gl_cv_func_readlink_works="$gl_cross_guess_normal" ;;
+            # Guess yes on Linux or glibc systems.
+            linux-* | linux | *-gnu* | gnu*)
+              gl_cv_func_readlink_trailing_slash="guessing yes" ;;
+            # Guess no on AIX or HP-UX.
+            aix* | hpux*)
+              gl_cv_func_readlink_trailing_slash="guessing no" ;;
+            # If we don't know, obey --enable-cross-guesses.
+            *)
+              gl_cv_func_readlink_trailing_slash="$gl_cross_guess_normal" ;;
           esac
          ])
       rm -f conftest.link conftest.lnk2])
-    case "$gl_cv_func_readlink_works" in
+    case "$gl_cv_func_readlink_trailing_slash" in
       *yes)
         if test "$gl_cv_decl_readlink_works" != yes; then
           REPLACE_READLINK=1
@@ -55,6 +59,43 @@
         REPLACE_READLINK=1
         ;;
     esac
+
+    AC_CACHE_CHECK([whether readlink truncates results correctly],
+      [gl_cv_func_readlink_truncate],
+      [# We have readlink, so assume ln -s works.
+       ln -s ab conftest.link
+       AC_RUN_IFELSE(
+         [AC_LANG_PROGRAM(
+           [[#include <unistd.h>
+]], [[char c;
+      return readlink ("conftest.link", &c, 1) != 1;]])],
+         [gl_cv_func_readlink_truncate=yes],
+         [gl_cv_func_readlink_truncate=no],
+         [case "$host_os" in
+            # Guess yes on Linux or glibc systems.
+            linux-* | linux | *-gnu* | gnu*)
+              gl_cv_func_readlink_truncate="guessing yes" ;;
+            # Guess no on AIX or HP-UX.
+            aix* | hpux*)
+              gl_cv_func_readlink_truncate="guessing no" ;;
+            # If we don't know, obey --enable-cross-guesses.
+            *)
+              gl_cv_func_readlink_truncate="$gl_cross_guess_normal" ;;
+          esac
+         ])
+      rm -f conftest.link conftest.lnk2])
+    case $gl_cv_func_readlink_truncate in
+      *yes)
+        if test "$gl_cv_decl_readlink_works" != yes; then
+          REPLACE_READLINK=1
+        fi
+        ;;
+      *)
+        AC_DEFINE([READLINK_TRUNCATE_BUG], [1], [Define to 1 if readlink
+          sets errno instead of truncating a too-long link.])
+        REPLACE_READLINK=1
+        ;;
+    esac
   fi
 ])
 
diff --git a/m4/realloc.m4 b/m4/realloc.m4
index 05e7243..0abc418 100644
--- a/m4/realloc.m4
+++ b/m4/realloc.m4
@@ -1,27 +1,21 @@
-# realloc.m4 serial 18
-dnl Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+# realloc.m4 serial 24
+dnl Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 # This is adapted with modifications from upstream Autoconf here:
-# https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=04be2b7a29d65d9a08e64e8e56e594c91749598c
+# https://git.savannah.gnu.org/cgit/autoconf.git/tree/lib/autoconf/functions.m4?id=v2.70#n1455
 AC_DEFUN([_AC_FUNC_REALLOC_IF],
 [
-  AC_REQUIRE([AC_HEADER_STDC])dnl
   AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles
-  AC_CHECK_HEADERS([stdlib.h])
-  AC_CACHE_CHECK([for GNU libc compatible realloc],
+  AC_CACHE_CHECK([whether realloc (0, 0) returns nonnull],
     [ac_cv_func_realloc_0_nonnull],
     [AC_RUN_IFELSE(
        [AC_LANG_PROGRAM(
-          [[#if defined STDC_HEADERS || defined HAVE_STDLIB_H
-            # include <stdlib.h>
-            #else
-            char *realloc ();
-            #endif
+          [[#include <stdlib.h>
           ]],
-          [[char *p = realloc (0, 0);
+          [[void *p = realloc (0, 0);
             int result = !p;
             free (p);
             return result;]])
@@ -30,53 +24,40 @@
        [ac_cv_func_realloc_0_nonnull=no],
        [case "$host_os" in
           # Guess yes on platforms where we know the result.
-          *-gnu* | gnu* | *-musl* | freebsd* | netbsd* | openbsd* \
-          | hpux* | solaris* | cygwin* | mingw*)
+          *-gnu* | freebsd* | netbsd* | openbsd* | bitrig* \
+          | gnu* | *-musl* | midnightbsd* \
+          | hpux* | solaris* | cygwin* | mingw* | msys* )
             ac_cv_func_realloc_0_nonnull="guessing yes" ;;
           # If we don't know, obey --enable-cross-guesses.
           *) ac_cv_func_realloc_0_nonnull="$gl_cross_guess_normal" ;;
         esac
        ])
     ])
-  case "$ac_cv_func_realloc_0_nonnull" in
-    *yes)
-      $1
-      ;;
-    *)
-      $2
-      ;;
-  esac
+  AS_CASE([$ac_cv_func_realloc_0_nonnull], [*yes], [$1], [$2])
 ])# AC_FUNC_REALLOC
 
 # gl_FUNC_REALLOC_GNU
 # -------------------
-# Test whether 'realloc (0, 0)' is handled like in GNU libc, and replace
-# realloc if it is not.
+# Replace realloc if it is not compatible with GNU libc.
 AC_DEFUN([gl_FUNC_REALLOC_GNU],
 [
   AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
-  dnl _AC_FUNC_REALLOC_IF is defined in Autoconf.
-  _AC_FUNC_REALLOC_IF(
-    [AC_DEFINE([HAVE_REALLOC_GNU], [1],
-               [Define to 1 if your system has a GNU libc compatible 'realloc'
-                function, and to 0 otherwise.])],
-    [AC_DEFINE([HAVE_REALLOC_GNU], [0])
-     REPLACE_REALLOC=1
-    ])
+  AC_REQUIRE([gl_FUNC_REALLOC_POSIX])
+  if test $REPLACE_REALLOC = 0; then
+    _AC_FUNC_REALLOC_IF([], [REPLACE_REALLOC=1])
+  fi
 ])# gl_FUNC_REALLOC_GNU
 
 # gl_FUNC_REALLOC_POSIX
 # ---------------------
 # Test whether 'realloc' is POSIX compliant (sets errno to ENOMEM when it
-# fails), and replace realloc if it is not.
+# fails, and doesn't mess up with ptrdiff_t overflow),
+# and replace realloc if it is not.
 AC_DEFUN([gl_FUNC_REALLOC_POSIX],
 [
   AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
-  AC_REQUIRE([gl_CHECK_MALLOC_POSIX])
-  if test $gl_cv_func_malloc_posix = yes; then
-    AC_DEFINE([HAVE_REALLOC_POSIX], [1],
-      [Define if the 'realloc' function is POSIX compliant.])
-  else
+  AC_REQUIRE([gl_FUNC_MALLOC_POSIX])
+  if test $REPLACE_MALLOC = 1; then
     REPLACE_REALLOC=1
   fi
 ])
diff --git a/m4/reallocarray.m4 b/m4/reallocarray.m4
new file mode 100644
index 0000000..9d8a626
--- /dev/null
+++ b/m4/reallocarray.m4
@@ -0,0 +1,23 @@
+# reallocarray.m4 serial 3
+dnl Copyright (C) 2017-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_REALLOCARRAY],
+[
+  dnl Persuade glibc <stdlib.h> to declare reallocarray.
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  AC_REQUIRE([gl_CHECK_MALLOC_PTRDIFF])
+  AC_CHECK_FUNCS([reallocarray])
+  if test "$ac_cv_func_reallocarray" = no; then
+    HAVE_REALLOCARRAY=0
+  elif test "$gl_cv_malloc_ptrdiff" = no; then
+    REPLACE_REALLOCARRAY=1
+  fi
+])
+
+# Prerequisites of lib/reallocarray.c.
+AC_DEFUN([gl_PREREQ_REALLOCARRAY], [:])
diff --git a/m4/relocatable-lib.m4 b/m4/relocatable-lib.m4
index 25944f5..ec8baaf 100644
--- a/m4/relocatable-lib.m4
+++ b/m4/relocatable-lib.m4
@@ -1,5 +1,5 @@
 # relocatable-lib.m4 serial 6
-dnl Copyright (C) 2003, 2005-2007, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2003, 2005-2007, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/relocatable.m4 b/m4/relocatable.m4
index 0ba1352..c11999e 100644
--- a/m4/relocatable.m4
+++ b/m4/relocatable.m4
@@ -1,5 +1,5 @@
-# relocatable.m4 serial 23
-dnl Copyright (C) 2003, 2005-2007, 2009-2019 Free Software Foundation, Inc.
+# relocatable.m4 serial 24
+dnl Copyright (C) 2003, 2005-2007, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -68,10 +68,11 @@
         fi
         ;;
 changequote(,)dnl
-      # FreeBSD >= 7.3, DragonFly >= 3.0: yes.
+      # FreeBSD >= 7.3, DragonFly >= 3.0, MidnightBSD >= 1.1: yes.
       freebsd | freebsd[1-7] | freebsd[1-6].* | freebsd7.[0-2]) ;;
       dragonfly | dragonfly[1-2] | dragonfly[1-2].*) ;;
-      freebsd* | dragonfly*) use_elf_origin_trick=yes ;;
+      midnightbsd | midnightbsd0* | midnightbsd1.0*) ;;
+      freebsd* | dragonfly* | midnightbsd*) use_elf_origin_trick=yes ;;
       # NetBSD >= 8.0: yes.
       netbsd | netbsd[1-7] | netbsd[1-7].*) ;;
       netbsdelf | netbsdelf[1-7] | netbsdelf[1-7].*) ;;
diff --git a/m4/rename.m4 b/m4/rename.m4
index b453666..8a95b8a 100644
--- a/m4/rename.m4
+++ b/m4/rename.m4
@@ -1,6 +1,6 @@
-# serial 32
+# serial 33
 
-# Copyright (C) 2001, 2003, 2005-2006, 2009-2019 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005-2006, 2009-2021 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -150,7 +150,7 @@
 #               include <stdio.h>
 #               include <stdlib.h>
 #               include <unistd.h>
-                ]],
+                ]GL_MDA_DEFINES],
                 [[int result = 0;
                   if (rename ("conftest.f", "conftest.f1"))
                     result |= 1;
diff --git a/m4/rewinddir.m4 b/m4/rewinddir.m4
new file mode 100644
index 0000000..ed25456
--- /dev/null
+++ b/m4/rewinddir.m4
@@ -0,0 +1,15 @@
+# rewinddir.m4 serial 1
+dnl Copyright (C) 2011-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_REWINDDIR],
+[
+  AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+
+  AC_CHECK_FUNCS([rewinddir])
+  if test $ac_cv_func_rewinddir = no; then
+    HAVE_REWINDDIR=0
+  fi
+])
diff --git a/m4/rmdir.m4 b/m4/rmdir.m4
index bc01778..82b9ccc 100644
--- a/m4/rmdir.m4
+++ b/m4/rmdir.m4
@@ -1,5 +1,5 @@
-# rmdir.m4 serial 17
-dnl Copyright (C) 2002, 2005, 2009-2019 Free Software Foundation, Inc.
+# rmdir.m4 serial 18
+dnl Copyright (C) 2002, 2005, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -22,15 +22,16 @@
            #else /* on Windows with MSVC */
            # include <direct.h>
            #endif
-]], [[int result = 0;
-      if (!rmdir ("conftest.file/"))
-        result |= 1;
-      else if (errno != ENOTDIR)
-        result |= 2;
-      if (!rmdir ("conftest.dir/./"))
-        result |= 4;
-      return result;
-    ]])],
+         ]GL_MDA_DEFINES],
+         [[int result = 0;
+           if (!rmdir ("conftest.file/"))
+             result |= 1;
+           else if (errno != ENOTDIR)
+             result |= 2;
+           if (!rmdir ("conftest.dir/./"))
+             result |= 4;
+           return result;
+         ]])],
        [gl_cv_func_rmdir_works=yes], [gl_cv_func_rmdir_works=no],
        [case "$host_os" in
                            # Guess yes on Linux systems.
diff --git a/m4/save-cwd.m4 b/m4/save-cwd.m4
new file mode 100644
index 0000000..74cfe96
--- /dev/null
+++ b/m4/save-cwd.m4
@@ -0,0 +1,11 @@
+# serial 10
+dnl Copyright (C) 2002-2006, 2009-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Prerequisites for lib/save-cwd.c.
+AC_DEFUN([gl_SAVE_CWD],
+[
+  AC_CHECK_FUNCS_ONCE([fchdir])
+])
diff --git a/m4/sched_h.m4 b/m4/sched_h.m4
index 2cc814e..a840e3d 100644
--- a/m4/sched_h.m4
+++ b/m4/sched_h.m4
@@ -1,15 +1,15 @@
-# sched_h.m4 serial 12
-dnl Copyright (C) 2008-2019 Free Software Foundation, Inc.
+# sched_h.m4 serial 15
+dnl Copyright (C) 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl Written by Bruno Haible.
 
-AC_DEFUN([gl_SCHED_H],
+AC_DEFUN_ONCE([gl_SCHED_H],
 [
-  dnl Use AC_REQUIRE here, so that the default behavior below is expanded
-  dnl once only, before all statements that occur in other macros.
+  dnl Ensure to expand the default settings once only, before all statements
+  dnl that occur in other macros.
   AC_REQUIRE([gl_SCHED_H_DEFAULTS])
 
   AC_REQUIRE([AC_CANONICAL_HOST])
@@ -73,18 +73,33 @@
     ]], [sched_yield])
 ])
 
+# gl_SCHED_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_SCHED_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_SCHED_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_SCHED_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_SCHED_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_SCHED_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SCHED_YIELD])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_SCHED_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_SCHED_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_SCHED_H_DEFAULTS],
 [
-  GNULIB_SCHED_YIELD=0;  AC_SUBST([GNULIB_SCHED_YIELD])
   dnl Assume proper GNU behavior unless another module says otherwise.
   HAVE_SCHED_YIELD=1;    AC_SUBST([HAVE_SCHED_YIELD])
   REPLACE_SCHED_YIELD=0; AC_SUBST([REPLACE_SCHED_YIELD])
diff --git a/m4/setenv.m4 b/m4/setenv.m4
index 6755459..f79a278 100644
--- a/m4/setenv.m4
+++ b/m4/setenv.m4
@@ -1,5 +1,5 @@
-# setenv.m4 serial 29
-dnl Copyright (C) 2001-2004, 2006-2019 Free Software Foundation, Inc.
+# setenv.m4 serial 30
+dnl Copyright (C) 2001-2004, 2006-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -106,35 +106,39 @@
     dnl OpenBSD 4.7 unsetenv("") does not fail.
     AC_CACHE_CHECK([whether unsetenv obeys POSIX],
       [gl_cv_func_unsetenv_works],
-      [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
-       #include <stdlib.h>
-       #include <errno.h>
-       extern char **environ;
-      ]], [[
-       char entry1[] = "a=1";
-       char entry2[] = "b=2";
-       char *env[] = { entry1, entry2, NULL };
-       if (putenv ((char *) "a=1")) return 1;
-       if (putenv (entry2)) return 2;
-       entry2[0] = 'a';
-       unsetenv ("a");
-       if (getenv ("a")) return 3;
-       if (!unsetenv ("") || errno != EINVAL) return 4;
-       entry2[0] = 'b';
-       environ = env;
-       if (!getenv ("a")) return 5;
-       entry2[0] = 'a';
-       unsetenv ("a");
-       if (getenv ("a")) return 6;
-      ]])],
-      [gl_cv_func_unsetenv_works=yes], [gl_cv_func_unsetenv_works=no],
-      [case "$host_os" in
-                 # Guess yes on glibc systems.
-         *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;;
-                 # If we don't know, obey --enable-cross-guesses.
-         *)      gl_cv_func_unsetenv_works="$gl_cross_guess_normal" ;;
-       esac
-      ])])
+      [AC_RUN_IFELSE(
+         [AC_LANG_PROGRAM([[
+            #include <stdlib.h>
+            #include <errno.h>
+            extern char **environ;
+           ]GL_MDA_DEFINES],
+           [[
+            char entry1[] = "a=1";
+            char entry2[] = "b=2";
+            char *env[] = { entry1, entry2, NULL };
+            if (putenv ((char *) "a=1")) return 1;
+            if (putenv (entry2)) return 2;
+            entry2[0] = 'a';
+            unsetenv ("a");
+            if (getenv ("a")) return 3;
+            if (!unsetenv ("") || errno != EINVAL) return 4;
+            entry2[0] = 'b';
+            environ = env;
+            if (!getenv ("a")) return 5;
+            entry2[0] = 'a';
+            unsetenv ("a");
+            if (getenv ("a")) return 6;
+           ]])],
+         [gl_cv_func_unsetenv_works=yes],
+         [gl_cv_func_unsetenv_works=no],
+         [case "$host_os" in
+                    # Guess yes on glibc systems.
+            *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;;
+                    # If we don't know, obey --enable-cross-guesses.
+            *)      gl_cv_func_unsetenv_works="$gl_cross_guess_normal" ;;
+          esac
+         ])
+      ])
     case "$gl_cv_func_unsetenv_works" in
       *yes) ;;
       *)
diff --git a/m4/setlocale_null.m4 b/m4/setlocale_null.m4
new file mode 100644
index 0000000..2c958ed
--- /dev/null
+++ b/m4/setlocale_null.m4
@@ -0,0 +1,98 @@
+# setlocale_null.m4 serial 5
+dnl Copyright (C) 2019-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_SETLOCALE_NULL],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_REQUIRE([gl_PTHREADLIB])
+  AC_CHECK_HEADERS_ONCE([threads.h])
+
+  AC_CACHE_CHECK([whether setlocale (LC_ALL, NULL) is multithread-safe],
+    [gl_cv_func_setlocale_null_all_mtsafe],
+    [case "$host_os" in
+       # Guess no on musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin.
+       *-musl* | darwin* | freebsd* | midnightbsd* | netbsd* | openbsd* | aix* | haiku* | cygwin*)
+         gl_cv_func_setlocale_null_all_mtsafe=no ;;
+       # Guess yes on glibc, HP-UX, IRIX, Solaris, native Windows.
+       *-gnu* | gnu* | hpux* | irix* | solaris* | mingw*)
+         gl_cv_func_setlocale_null_all_mtsafe=yes ;;
+       # If we don't know, obey --enable-cross-guesses.
+       *)
+         gl_cv_func_setlocale_null_all_mtsafe="$gl_cross_guess_normal" ;;
+     esac
+    ])
+  dnl On platforms without multithreading, there is no issue.
+  case "$host_os" in
+    mingw*) ;;
+    *)
+      if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then
+        gl_cv_func_setlocale_null_all_mtsafe="trivially yes"
+      fi
+      ;;
+  esac
+  case "$gl_cv_func_setlocale_null_all_mtsafe" in
+    *yes) SETLOCALE_NULL_ALL_MTSAFE=1 ;;
+    *)    SETLOCALE_NULL_ALL_MTSAFE=0 ;;
+  esac
+  AC_DEFINE_UNQUOTED([SETLOCALE_NULL_ALL_MTSAFE], [$SETLOCALE_NULL_ALL_MTSAFE],
+    [Define to 1 if setlocale (LC_ALL, NULL) is multithread-safe.])
+
+  dnl This is about a single category (not LC_ALL).
+  AC_CACHE_CHECK([whether setlocale (category, NULL) is multithread-safe],
+    [gl_cv_func_setlocale_null_one_mtsafe],
+    [case "$host_os" in
+       # Guess no on OpenBSD, AIX.
+       openbsd* | aix*)
+         gl_cv_func_setlocale_null_one_mtsafe=no ;;
+       # Guess yes on glibc, musl libc, macOS, FreeBSD, NetBSD, HP-UX, IRIX, Solaris, Haiku, Cygwin, native Windows.
+       *-gnu* | gnu* | *-musl* | darwin* | freebsd* | midnightbsd* | netbsd* | hpux* | irix* | solaris* | haiku* | cygwin* | mingw*)
+         gl_cv_func_setlocale_null_one_mtsafe=yes ;;
+       # If we don't know, obey --enable-cross-guesses.
+       *)
+         gl_cv_func_setlocale_null_one_mtsafe="$gl_cross_guess_normal" ;;
+     esac
+    ])
+  dnl On platforms without multithreading, there is no issue.
+  case "$host_os" in
+    mingw*) ;;
+    *)
+      if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then
+        gl_cv_func_setlocale_null_one_mtsafe="trivially yes"
+      fi
+      ;;
+  esac
+  case "$gl_cv_func_setlocale_null_one_mtsafe" in
+    *yes) SETLOCALE_NULL_ONE_MTSAFE=1 ;;
+    *)    SETLOCALE_NULL_ONE_MTSAFE=0 ;;
+  esac
+  AC_DEFINE_UNQUOTED([SETLOCALE_NULL_ONE_MTSAFE], [$SETLOCALE_NULL_ONE_MTSAFE],
+    [Define to 1 if setlocale (category, NULL) is multithread-safe.])
+
+  dnl Determine link dependencies of lib/setlocale_null.c and lib/setlocale-lock.c.
+  if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then
+    case "$host_os" in
+      mingw*) LIB_SETLOCALE_NULL= ;;
+      *)
+        gl_WEAK_SYMBOLS
+        case "$gl_cv_have_weak" in
+          *yes) LIB_SETLOCALE_NULL= ;;
+          *)    LIB_SETLOCALE_NULL="$LIBPTHREAD" ;;
+        esac
+        ;;
+    esac
+  else
+    LIB_SETLOCALE_NULL=
+  fi
+  dnl LIB_SETLOCALE_NULL is expected to be '-pthread' or '-lpthread' on AIX
+  dnl with gcc or xlc, and empty otherwise.
+  AC_SUBST([LIB_SETLOCALE_NULL])
+])
+
+# Prerequisites of lib/setlocale-lock.c.
+AC_DEFUN([gl_PREREQ_SETLOCALE_LOCK],
+[
+  gl_VISIBILITY
+])
diff --git a/m4/sh-filename.m4 b/m4/sh-filename.m4
index dc5f26d..b680fa1 100644
--- a/m4/sh-filename.m4
+++ b/m4/sh-filename.m4
@@ -1,5 +1,5 @@
-# sh-filename.m4 serial 2
-dnl Copyright (C) 2018-2019 Free Software Foundation, Inc.
+# sh-filename.m4 serial 3
+dnl Copyright (C) 2018-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -10,8 +10,10 @@
 [
   AH_VERBATIM([SH_FILENAME],
 [/* File name of the Bourne shell.  */
-#if defined __CYGWIN__ || defined __ANDROID__
+#if (defined _WIN32 && !defined __CYGWIN__) || defined __CYGWIN__ || defined __ANDROID__
 /* Omit the directory part because
+   - For native Windows programs in a Cygwin environment, the Cygwin mounts
+     are not visible.
    - For 32-bit Cygwin programs in a 64-bit Cygwin environment, the Cygwin
      mounts are not visible.
    - On Android, /bin/sh does not exist. It's /system/bin/sh instead.  */
diff --git a/m4/sig_atomic_t.m4 b/m4/sig_atomic_t.m4
index 2a31575..5940faa 100644
--- a/m4/sig_atomic_t.m4
+++ b/m4/sig_atomic_t.m4
@@ -1,5 +1,5 @@
 # sig_atomic_t.m4 serial 3
-dnl Copyright (C) 2003, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2003, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/sigaction.m4 b/m4/sigaction.m4
index 6117d1b..a8c1d15 100644
--- a/m4/sigaction.m4
+++ b/m4/sigaction.m4
@@ -1,5 +1,5 @@
 # sigaction.m4 serial 7
-dnl Copyright (C) 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/signal_h.m4 b/m4/signal_h.m4
index 3acec64..8b93880 100644
--- a/m4/signal_h.m4
+++ b/m4/signal_h.m4
@@ -1,10 +1,10 @@
-# signal_h.m4 serial 18
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+# signal_h.m4 serial 22
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
-AC_DEFUN([gl_SIGNAL_H],
+AC_DEFUN_ONCE([gl_SIGNAL_H],
 [
   AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
   AC_REQUIRE([gl_CHECK_TYPE_SIGSET_T])
@@ -34,6 +34,8 @@
     ]], [pthread_sigmask sigaction
     sigaddset sigdelset sigemptyset sigfillset sigismember
     sigpending sigprocmask])
+
+  AC_REQUIRE([AC_C_RESTRICT])
 ])
 
 AC_DEFUN([gl_CHECK_TYPE_SIGSET_T],
@@ -50,22 +52,37 @@
   fi
 ])
 
+# gl_SIGNAL_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_SIGNAL_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_SIGNAL_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_SIGNAL_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_SIGNAL_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PTHREAD_SIGMASK])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RAISE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SIGNAL_H_SIGPIPE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SIGPROCMASK])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SIGACTION])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_SIGNAL_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_SIGNAL_H_DEFAULTS],
 [
-  GNULIB_PTHREAD_SIGMASK=0;    AC_SUBST([GNULIB_PTHREAD_SIGMASK])
-  GNULIB_RAISE=0;              AC_SUBST([GNULIB_RAISE])
-  GNULIB_SIGNAL_H_SIGPIPE=0;   AC_SUBST([GNULIB_SIGNAL_H_SIGPIPE])
-  GNULIB_SIGPROCMASK=0;        AC_SUBST([GNULIB_SIGPROCMASK])
-  GNULIB_SIGACTION=0;          AC_SUBST([GNULIB_SIGACTION])
   dnl Assume proper GNU behavior unless another module says otherwise.
   HAVE_POSIX_SIGNALBLOCKING=1; AC_SUBST([HAVE_POSIX_SIGNALBLOCKING])
   HAVE_PTHREAD_SIGMASK=1;      AC_SUBST([HAVE_PTHREAD_SIGMASK])
diff --git a/m4/signalblocking.m4 b/m4/signalblocking.m4
index d722f65..bfd76b7 100644
--- a/m4/signalblocking.m4
+++ b/m4/signalblocking.m4
@@ -1,5 +1,5 @@
-# signalblocking.m4 serial 14
-dnl Copyright (C) 2001-2002, 2006-2019 Free Software Foundation, Inc.
+# signalblocking.m4 serial 17
+dnl Copyright (C) 2001-2002, 2006-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -13,11 +13,9 @@
 [
   AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
   AC_REQUIRE([gl_CHECK_TYPE_SIGSET_T])
-  if test $gl_cv_type_sigset_t = yes; then
-    AC_CHECK_FUNC([sigprocmask], [gl_cv_func_sigprocmask=1])
-  fi
-  if test -z "$gl_cv_func_sigprocmask"; then
-    HAVE_POSIX_SIGNALBLOCKING=0
+  HAVE_POSIX_SIGNALBLOCKING=0
+  if test "$gl_cv_type_sigset_t" = yes; then
+    AC_CHECK_FUNC([sigprocmask], [HAVE_POSIX_SIGNALBLOCKING=1])
   fi
 ])
 
diff --git a/m4/signbit.m4 b/m4/signbit.m4
index 2718aef..6ec70ec 100644
--- a/m4/signbit.m4
+++ b/m4/signbit.m4
@@ -1,5 +1,5 @@
-# signbit.m4 serial 19
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+# signbit.m4 serial 20
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -40,15 +40,16 @@
          esac
         ])
     ])
-  dnl GCC 4.0 and newer provides three built-ins for signbit.
+  dnl GCC >= 4.0 and clang provide three built-ins for signbit.
   dnl They can be used without warnings, also in C++, regardless of <math.h>.
   dnl But they may expand to calls to functions, which may or may not be in
   dnl libc.
-  AC_CACHE_CHECK([for signbit compiler built-ins], [gl_cv_func_signbit_gcc],
+  AC_CACHE_CHECK([for signbit compiler built-ins],
+    [gl_cv_func_signbit_builtins],
     [
       AC_RUN_IFELSE(
         [AC_LANG_SOURCE([[
-#if __GNUC__ >= 4
+#if (__GNUC__ >= 4) || (__clang_major__ >= 4)
 # define signbit(x) \
    (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
     sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
@@ -59,30 +60,30 @@
 #include <string.h>
 ]gl_SIGNBIT_TEST_PROGRAM
 ])],
-        [gl_cv_func_signbit_gcc=yes],
-        [gl_cv_func_signbit_gcc=no],
+        [gl_cv_func_signbit_builtins=yes],
+        [gl_cv_func_signbit_builtins=no],
         [case "$host_os" in
                           # Guess yes on glibc systems.
-           *-gnu* | gnu*) gl_cv_func_signbit_gcc="guessing yes" ;;
+           *-gnu* | gnu*) gl_cv_func_signbit_builtins="guessing yes" ;;
                           # Guess yes on musl systems.
-           *-musl*)       gl_cv_func_signbit_gcc="guessing yes" ;;
+           *-musl*)       gl_cv_func_signbit_builtins="guessing yes" ;;
                           # Guess yes on mingw, no on MSVC.
            mingw*)        if test -n "$GCC"; then
-                            gl_cv_func_signbit_gcc="guessing yes"
+                            gl_cv_func_signbit_builtins="guessing yes"
                           else
-                            gl_cv_func_signbit_gcc="guessing no"
+                            gl_cv_func_signbit_builtins="guessing no"
                           fi
                           ;;
                           # If we don't know, obey --enable-cross-guesses.
-           *)             gl_cv_func_signbit_gcc="$gl_cross_guess_normal" ;;
+           *)             gl_cv_func_signbit_builtins="$gl_cross_guess_normal" ;;
          esac
         ])
     ])
   dnl Use the compiler built-ins whenever possible, because they are more
   dnl efficient than the system library functions (if they exist).
-  case "$gl_cv_func_signbit_gcc" in
+  case "$gl_cv_func_signbit_builtins" in
     *yes)
-      REPLACE_SIGNBIT_USING_GCC=1
+      REPLACE_SIGNBIT_USING_BUILTINS=1
       ;;
     *)
       case "$gl_cv_func_signbit" in
diff --git a/m4/size_max.m4 b/m4/size_max.m4
index ab79052..1d41ce9 100644
--- a/m4/size_max.m4
+++ b/m4/size_max.m4
@@ -1,5 +1,5 @@
-# size_max.m4 serial 11
-dnl Copyright (C) 2003, 2005-2006, 2008-2019 Free Software Foundation, Inc.
+# size_max.m4 serial 12
+dnl Copyright (C) 2003, 2005-2006, 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -13,7 +13,7 @@
   AC_CHECK_HEADERS([stdint.h])
   dnl First test whether the system already has SIZE_MAX.
   AC_CACHE_CHECK([for SIZE_MAX], [gl_cv_size_max], [
-    gl_cv_size_max=
+    gl_cv_size_max=no
     AC_EGREP_CPP([Found it], [
 #include <limits.h>
 #if HAVE_STDINT_H
@@ -23,7 +23,7 @@
 Found it
 #endif
 ], [gl_cv_size_max=yes])
-    if test -z "$gl_cv_size_max"; then
+    if test $gl_cv_size_max != yes; then
       dnl Define it ourselves. Here we assume that the type 'size_t' is not wider
       dnl than the type 'unsigned long'. Try hard to find a definition that can
       dnl be used in a preprocessor #if, i.e. doesn't contain a cast.
diff --git a/m4/snprintf-posix.m4 b/m4/snprintf-posix.m4
index 07d48d7..36f9f4b 100644
--- a/m4/snprintf-posix.m4
+++ b/m4/snprintf-posix.m4
@@ -1,5 +1,5 @@
 # snprintf-posix.m4 serial 14
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/snprintf.m4 b/m4/snprintf.m4
index 6fd566d..8520994 100644
--- a/m4/snprintf.m4
+++ b/m4/snprintf.m4
@@ -1,5 +1,5 @@
 # snprintf.m4 serial 7
-dnl Copyright (C) 2002-2004, 2007-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2002-2004, 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/spawn-pipe.m4 b/m4/spawn-pipe.m4
index 40edebd..67eb602 100644
--- a/m4/spawn-pipe.m4
+++ b/m4/spawn-pipe.m4
@@ -1,5 +1,5 @@
 # spawn-pipe.m4 serial 2
-dnl Copyright (C) 2004, 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2004, 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/spawn_h.m4 b/m4/spawn_h.m4
index 95cb25d..134b7b9 100644
--- a/m4/spawn_h.m4
+++ b/m4/spawn_h.m4
@@ -1,15 +1,15 @@
-# spawn_h.m4 serial 18
-dnl Copyright (C) 2008-2019 Free Software Foundation, Inc.
+# spawn_h.m4 serial 21
+dnl Copyright (C) 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl Written by Bruno Haible.
 
-AC_DEFUN([gl_SPAWN_H],
+AC_DEFUN_ONCE([gl_SPAWN_H],
 [
-  dnl Use AC_REQUIRE here, so that the default behavior below is expanded
-  dnl once only, before all statements that occur in other macros.
+  dnl Ensure to expand the default settings once only, before all statements
+  dnl that occur in other macros.
   AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
 
   dnl <spawn.h> is always overridden, because of GNULIB_POSIXCHECK.
@@ -61,8 +61,8 @@
 dnl Sets ac_cv_func_posix_spawn and HAVE_POSIX_SPAWN.
 AC_DEFUN([gl_HAVE_POSIX_SPAWN],
 [
-  dnl Use AC_REQUIRE here, so that the default behavior below is expanded
-  dnl once only, before all statements that occur in other macros.
+  dnl Ensure to expand the default settings once only, before all statements
+  dnl that occur in other macros.
   AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
 
   LIB_POSIX_SPAWN=
@@ -79,40 +79,55 @@
   fi
 ])
 
+# gl_SPAWN_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_SPAWN_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_SPAWN_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_SPAWN_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_SPAWN_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWNP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWNATTR_INIT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWNATTR_GETFLAGS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWNATTR_SETFLAGS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWNATTR_GETPGROUP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWNATTR_SETPGROUP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWNATTR_GETSIGMASK])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWNATTR_SETSIGMASK])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_SPAWNATTR_DESTROY])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_SPAWN_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_SPAWN_H_DEFAULTS],
 [
-  GNULIB_POSIX_SPAWN=0;                        AC_SUBST([GNULIB_POSIX_SPAWN])
-  GNULIB_POSIX_SPAWNP=0;                       AC_SUBST([GNULIB_POSIX_SPAWNP])
-  GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT=0;      AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT])
-  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=0;  AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR])
-  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=0;  AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE])
-  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=0;   AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2])
-  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR=0; AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR])
-  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=0;   AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN])
-  GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY=0;   AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY])
-  GNULIB_POSIX_SPAWNATTR_INIT=0;               AC_SUBST([GNULIB_POSIX_SPAWNATTR_INIT])
-  GNULIB_POSIX_SPAWNATTR_GETFLAGS=0;           AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETFLAGS])
-  GNULIB_POSIX_SPAWNATTR_SETFLAGS=0;           AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETFLAGS])
-  GNULIB_POSIX_SPAWNATTR_GETPGROUP=0;          AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETPGROUP])
-  GNULIB_POSIX_SPAWNATTR_SETPGROUP=0;          AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETPGROUP])
-  GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM=0;      AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM])
-  GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM=0;      AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM])
-  GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY=0;     AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY])
-  GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY=0;     AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY])
-  GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT=0;      AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT])
-  GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT=0;      AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT])
-  GNULIB_POSIX_SPAWNATTR_GETSIGMASK=0;         AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETSIGMASK])
-  GNULIB_POSIX_SPAWNATTR_SETSIGMASK=0;         AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETSIGMASK])
-  GNULIB_POSIX_SPAWNATTR_DESTROY=0;            AC_SUBST([GNULIB_POSIX_SPAWNATTR_DESTROY])
   dnl Assume proper GNU behavior unless another module says otherwise.
   HAVE_POSIX_SPAWN=1;        AC_SUBST([HAVE_POSIX_SPAWN])
   HAVE_POSIX_SPAWNATTR_T=1;  AC_SUBST([HAVE_POSIX_SPAWNATTR_T])
diff --git a/m4/sprintf-posix.m4 b/m4/sprintf-posix.m4
index b3c36b6..0dba626 100644
--- a/m4/sprintf-posix.m4
+++ b/m4/sprintf-posix.m4
@@ -1,5 +1,5 @@
 # sprintf-posix.m4 serial 12
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/ssize_t.m4 b/m4/ssize_t.m4
index 38bcee1..f0ed509 100644
--- a/m4/ssize_t.m4
+++ b/m4/ssize_t.m4
@@ -1,5 +1,5 @@
 # ssize_t.m4 serial 5 (gettext-0.18.2)
-dnl Copyright (C) 2001-2003, 2006, 2010-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2001-2003, 2006, 2010-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/stat-time.m4 b/m4/stat-time.m4
index 1685788..df1c2a7 100644
--- a/m4/stat-time.m4
+++ b/m4/stat-time.m4
@@ -1,6 +1,6 @@
 # Checks for stat-related time functions.
 
-# Copyright (C) 1998-1999, 2001, 2003, 2005-2007, 2009-2019 Free Software
+# Copyright (C) 1998-1999, 2001, 2003, 2005-2007, 2009-2021 Free Software
 # Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
diff --git a/m4/stat.m4 b/m4/stat.m4
index 752661f..9bcdb72 100644
--- a/m4/stat.m4
+++ b/m4/stat.m4
@@ -1,6 +1,6 @@
-# serial 16
+# serial 18
 
-# Copyright (C) 2009-2019 Free Software Foundation, Inc.
+# Copyright (C) 2009-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -69,6 +69,17 @@
 
 # Prerequisites of lib/stat.c and lib/stat-w32.c.
 AC_DEFUN([gl_PREREQ_STAT], [
-  AC_REQUIRE([gl_HEADER_SYS_STAT_H])
+  AC_REQUIRE([gl_SYS_STAT_H])
+  AC_REQUIRE([gl_PREREQ_STAT_W32])
   :
 ])
+
+# Prerequisites of lib/stat-w32.c.
+AC_DEFUN([gl_PREREQ_STAT_W32], [
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  case "$host_os" in
+    mingw*)
+      AC_CHECK_HEADERS([sdkddkver.h])
+      ;;
+  esac
+])
diff --git a/m4/std-gnu11.m4 b/m4/std-gnu11.m4
deleted file mode 100644
index 23e7f75..0000000
--- a/m4/std-gnu11.m4
+++ /dev/null
@@ -1,824 +0,0 @@
-# Prefer GNU C11 and C++11 to earlier versions.  -*- coding: utf-8 -*-
-
-# This implementation is taken from GNU Autoconf lib/autoconf/c.m4
-# commit 017d5ddd82854911f0119691d91ea8a1438824d6
-# dated Sun Apr 3 13:57:17 2016 -0700
-# This implementation will be obsolete once we can assume Autoconf 2.70
-# or later is installed everywhere a Gnulib program might be developed.
-
-
-# Copyright (C) 2001-2019 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <https://www.gnu.org/licenses/>.
-
-# Written by David MacKenzie, with help from
-# Akim Demaille, Paul Eggert,
-# François Pinard, Karl Berry, Richard Pixley, Ian Lance Taylor,
-# Roland McGrath, Noah Friedman, david d zuhn, and many others.
-
-
-# AC_PROG_CC([COMPILER ...])
-# --------------------------
-# COMPILER ... is a space separated list of C compilers to search for.
-# This just gives the user an opportunity to specify an alternative
-# search list for the C compiler.
-AC_DEFUN_ONCE([AC_PROG_CC],
-[AC_LANG_PUSH(C)dnl
-AC_ARG_VAR([CC],     [C compiler command])dnl
-AC_ARG_VAR([CFLAGS], [C compiler flags])dnl
-_AC_ARG_VAR_LDFLAGS()dnl
-_AC_ARG_VAR_LIBS()dnl
-_AC_ARG_VAR_CPPFLAGS()dnl
-m4_ifval([$1],
-      [AC_CHECK_TOOLS(CC, [$1])],
-[AC_CHECK_TOOL(CC, gcc)
-if test -z "$CC"; then
-  dnl Here we want:
-  dnl	AC_CHECK_TOOL(CC, cc)
-  dnl but without the check for a tool without the prefix.
-  dnl Until the check is removed from there, copy the code:
-  if test -n "$ac_tool_prefix"; then
-    AC_CHECK_PROG(CC, [${ac_tool_prefix}cc], [${ac_tool_prefix}cc])
-  fi
-fi
-if test -z "$CC"; then
-  AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
-fi
-if test -z "$CC"; then
-  AC_CHECK_TOOLS(CC, cl.exe)
-fi
-if test -z "$CC"; then
-  AC_CHECK_TOOL(CC, clang)
-fi
-])
-
-test -z "$CC" && AC_MSG_FAILURE([no acceptable C compiler found in \$PATH])
-
-# Provide some information about the compiler.
-_AS_ECHO_LOG([checking for _AC_LANG compiler version])
-set X $ac_compile
-ac_compiler=$[2]
-for ac_option in --version -v -V -qversion -version; do
-  m4_ifdef([_AC_DO_LIMIT],[_AC_DO_LIMIT],[_AC_DO])([$ac_compiler $ac_option >&AS_MESSAGE_LOG_FD])
-done
-
-m4_expand_once([_AC_COMPILER_EXEEXT])[]dnl
-m4_expand_once([_AC_COMPILER_OBJEXT])[]dnl
-_AC_LANG_COMPILER_GNU
-if test $ac_compiler_gnu = yes; then
-  GCC=yes
-else
-  GCC=
-fi
-_AC_PROG_CC_G
-dnl
-dnl Set ac_prog_cc_stdc to the supported C version.
-dnl Also set the documented variable ac_cv_prog_cc_stdc;
-dnl its name was chosen when it was cached, but it is no longer cached.
-_AC_PROG_CC_C11([ac_prog_cc_stdc=c11
-		 ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11],
-  [_AC_PROG_CC_C99([ac_prog_cc_stdc=c99
-		    ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99],
-     [_AC_PROG_CC_C89([ac_prog_cc_stdc=c89
-		       ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89],
-		      [ac_prog_cc_stdc=no
-		       ac_cv_prog_cc_stdc=no])])])
-dnl
-AC_LANG_POP(C)dnl
-])# AC_PROG_CC
-
-
-
-# AC_PROG_CXX([LIST-OF-COMPILERS])
-# --------------------------------
-# LIST-OF-COMPILERS is a space separated list of C++ compilers to search
-# for (if not specified, a default list is used).  This just gives the
-# user an opportunity to specify an alternative search list for the C++
-# compiler.
-# aCC	HP-UX C++ compiler much better than `CC', so test before.
-# FCC   Fujitsu C++ compiler
-# KCC	KAI C++ compiler
-# RCC	Rational C++
-# xlC_r	AIX C Set++ (with support for reentrant code)
-# xlC	AIX C Set++
-AC_DEFUN([AC_PROG_CXX],
-[AC_LANG_PUSH(C++)dnl
-AC_ARG_VAR([CXX],      [C++ compiler command])dnl
-AC_ARG_VAR([CXXFLAGS], [C++ compiler flags])dnl
-_AC_ARG_VAR_LDFLAGS()dnl
-_AC_ARG_VAR_LIBS()dnl
-_AC_ARG_VAR_CPPFLAGS()dnl
-_AC_ARG_VAR_PRECIOUS([CCC])dnl
-if test -z "$CXX"; then
-  if test -n "$CCC"; then
-    CXX=$CCC
-  else
-    AC_CHECK_TOOLS(CXX,
-		   [m4_default([$1],
-			       [g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++])],
-		   g++)
-  fi
-fi
-# Provide some information about the compiler.
-_AS_ECHO_LOG([checking for _AC_LANG compiler version])
-set X $ac_compile
-ac_compiler=$[2]
-for ac_option in --version -v -V -qversion; do
-  m4_ifdef([_AC_DO_LIMIT],[_AC_DO_LIMIT],[_AC_DO])([$ac_compiler $ac_option >&AS_MESSAGE_LOG_FD])
-done
-
-m4_expand_once([_AC_COMPILER_EXEEXT])[]dnl
-m4_expand_once([_AC_COMPILER_OBJEXT])[]dnl
-_AC_LANG_COMPILER_GNU
-if test $ac_compiler_gnu = yes; then
-  GXX=yes
-else
-  GXX=
-fi
-_AC_PROG_CXX_G
-_AC_PROG_CXX_CXX11([ac_prog_cxx_stdcxx=cxx11
-		    ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11
-		    ac_cv_prog_cxx_cxx98=$ac_cv_prog_cxx_cxx11],
-   [_AC_PROG_CXX_CXX98([ac_prog_cxx_stdcxx=cxx98
-		        ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98],
-		       [ac_prog_cxx_stdcxx=no
-		        ac_cv_prog_cxx_stdcxx=no])])
-AC_LANG_POP(C++)dnl
-])# AC_PROG_CXX
-
-
-# _AC_C_STD_TRY(STANDARD, TEST-PROLOGUE, TEST-BODY, OPTION-LIST,
-#		ACTION-IF-AVAILABLE, ACTION-IF-UNAVAILABLE)
-# --------------------------------------------------------------
-# Check whether the C compiler accepts features of STANDARD (e.g `c89', `c99')
-# by trying to compile a program of TEST-PROLOGUE and TEST-BODY.  If this fails,
-# try again with each compiler option in the space-separated OPTION-LIST; if one
-# helps, append it to CC.  If eventually successful, run ACTION-IF-AVAILABLE,
-# else ACTION-IF-UNAVAILABLE.
-AC_DEFUN([_AC_C_STD_TRY],
-[AC_MSG_CHECKING([for $CC option to enable ]m4_translit($1, [c], [C])[ features])
-AC_CACHE_VAL(ac_cv_prog_cc_$1,
-[ac_cv_prog_cc_$1=no
-ac_save_CC=$CC
-AC_LANG_CONFTEST([AC_LANG_PROGRAM([$2], [$3])])
-for ac_arg in '' $4
-do
-  CC="$ac_save_CC $ac_arg"
-  _AC_COMPILE_IFELSE([], [ac_cv_prog_cc_$1=$ac_arg])
-  test "x$ac_cv_prog_cc_$1" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-])# AC_CACHE_VAL
-ac_prog_cc_stdc_options=
-case "x$ac_cv_prog_cc_$1" in
-  x)
-    AC_MSG_RESULT([none needed]) ;;
-  xno)
-    AC_MSG_RESULT([unsupported]) ;;
-  *)
-    ac_prog_cc_stdc_options=" $ac_cv_prog_cc_$1"
-    CC=$CC$ac_prog_cc_stdc_options
-    AC_MSG_RESULT([$ac_cv_prog_cc_$1]) ;;
-esac
-AS_IF([test "x$ac_cv_prog_cc_$1" != xno], [$5], [$6])
-])# _AC_C_STD_TRY
-
-# _AC_C_C99_TEST_HEADER
-# ---------------------
-# A C header suitable for testing for C99.
-AC_DEFUN([_AC_C_C99_TEST_HEADER],
-[[#include <stdarg.h>
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <wchar.h>
-#include <stdio.h>
-
-// Check varargs macros.  These examples are taken from C99 6.10.3.5.
-#define debug(...) fprintf (stderr, __VA_ARGS__)
-#define showlist(...) puts (#__VA_ARGS__)
-#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
-static void
-test_varargs_macros (void)
-{
-  int x = 1234;
-  int y = 5678;
-  debug ("Flag");
-  debug ("X = %d\n", x);
-  showlist (The first, second, and third items.);
-  report (x>y, "x is %d but y is %d", x, y);
-}
-
-// Check long long types.
-#define BIG64 18446744073709551615ull
-#define BIG32 4294967295ul
-#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
-#if !BIG_OK
-  your preprocessor is broken;
-#endif
-#if BIG_OK
-#else
-  your preprocessor is broken;
-#endif
-static long long int bignum = -9223372036854775807LL;
-static unsigned long long int ubignum = BIG64;
-
-struct incomplete_array
-{
-  int datasize;
-  double data[];
-};
-
-struct named_init {
-  int number;
-  const wchar_t *name;
-  double average;
-};
-
-typedef const char *ccp;
-
-static inline int
-test_restrict (ccp restrict text)
-{
-  // See if C++-style comments work.
-  // Iterate through items via the restricted pointer.
-  // Also check for declarations in for loops.
-  for (unsigned int i = 0; *(text+i) != '\0'; ++i)
-    continue;
-  return 0;
-}
-
-// Check varargs and va_copy.
-static bool
-test_varargs (const char *format, ...)
-{
-  va_list args;
-  va_start (args, format);
-  va_list args_copy;
-  va_copy (args_copy, args);
-
-  const char *str = "";
-  int number = 0;
-  float fnumber = 0;
-
-  while (*format)
-    {
-      switch (*format++)
-	{
-	case 's': // string
-	  str = va_arg (args_copy, const char *);
-	  break;
-	case 'd': // int
-	  number = va_arg (args_copy, int);
-	  break;
-	case 'f': // float
-	  fnumber = va_arg (args_copy, double);
-	  break;
-	default:
-	  break;
-	}
-    }
-  va_end (args_copy);
-  va_end (args);
-
-  return *str && number && fnumber;
-}]])# _AC_C_C99_TEST_HEADER
-
-# _AC_C_C99_TEST_BODY
-# -------------------
-# A C body suitable for testing for C99, assuming the corresponding header.
-AC_DEFUN([_AC_C_C99_TEST_BODY],
-[[
-  // Check bool.
-  _Bool success = false;
-
-  // Check restrict.
-  if (test_restrict ("String literal") == 0)
-    success = true;
-  char *restrict newvar = "Another string";
-
-  // Check varargs.
-  success &= test_varargs ("s, d' f .", "string", 65, 34.234);
-  test_varargs_macros ();
-
-  // Check flexible array members.
-  struct incomplete_array *ia =
-    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
-  ia->datasize = 10;
-  for (int i = 0; i < ia->datasize; ++i)
-    ia->data[i] = i * 1.234;
-
-  // Check named initializers.
-  struct named_init ni = {
-    .number = 34,
-    .name = L"Test wide string",
-    .average = 543.34343,
-  };
-
-  ni.number = 58;
-
-  int dynamic_array[ni.number];
-  dynamic_array[ni.number - 1] = 543;
-
-  // work around unused variable warnings
-  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
-	  || dynamic_array[ni.number - 1] != 543);
-]])
-
-# _AC_PROG_CC_C99 ([ACTION-IF-AVAILABLE], [ACTION-IF-UNAVAILABLE])
-# ----------------------------------------------------------------
-# If the C compiler is not in ISO C99 mode by default, try to add an
-# option to output variable CC to make it so.  This macro tries
-# various options that select ISO C99 on some system or another.  It
-# considers the compiler to be in ISO C99 mode if it handles _Bool,
-# // comments, flexible array members, inline, long long int, mixed
-# code and declarations, named initialization of structs, restrict,
-# va_copy, varargs macros, variable declarations in for loops and
-# variable length arrays.
-AC_DEFUN([_AC_PROG_CC_C99],
-[_AC_C_STD_TRY([c99],
-[_AC_C_C99_TEST_HEADER],
-[_AC_C_C99_TEST_BODY],
-dnl Try
-dnl GCC		-std=gnu99 (unused restrictive modes: -std=c99 -std=iso9899:1999)
-dnl IBM XL C	-qlanglvl=extc1x (V12.1; does not pass C11 test)
-dnl IBM XL C	-qlanglvl=extc99
-dnl		(pre-V12.1; unused restrictive mode: -qlanglvl=stdc99)
-dnl HP cc	-AC99
-dnl Intel ICC	-std=c99, -c99 (deprecated)
-dnl IRIX	-c99
-dnl Solaris	-D_STDC_C99=
-dnl		cc's -xc99 option uses linker magic to define the external
-dnl		symbol __xpg4 as if by "int __xpg4 = 1;", which enables C99
-dnl		behavior for C library functions.  This is not wanted here,
-dnl		because it means that a single module compiled with -xc99
-dnl		alters C runtime behavior for the entire program, not for
-dnl		just the module.  Instead, define the (private) symbol
-dnl		_STDC_C99, which suppresses a bogus failure in <stdbool.h>.
-dnl		The resulting compiler passes the test case here, and that's
-dnl		good enough.  For more, please see the thread starting at:
-dnl            https://lists.gnu.org/r/autoconf/2010-12/msg00059.html
-dnl Tru64	-c99
-dnl with extended modes being tried first.
-[[-std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc1x -qlanglvl=extc99]], [$1], [$2])[]dnl
-])# _AC_PROG_CC_C99
-
-
-# _AC_PROG_CC_C11 ([ACTION-IF-AVAILABLE], [ACTION-IF-UNAVAILABLE])
-# ----------------------------------------------------------------
-# If the C compiler is not in ISO C11 mode by default, try to add an
-# option to output variable CC to make it so.  This macro tries
-# various options that select ISO C11 on some system or another.  It
-# considers the compiler to be in ISO C11 mode if it handles _Alignas,
-# _Alignof, _Noreturn, _Static_assert, UTF-8 string literals,
-# duplicate typedefs, and anonymous structures and unions.
-AC_DEFUN([_AC_PROG_CC_C11],
-[_AC_C_STD_TRY([c11],
-[_AC_C_C99_TEST_HEADER[
-// Check _Alignas.
-char _Alignas (double) aligned_as_double;
-char _Alignas (0) no_special_alignment;
-extern char aligned_as_int;
-char _Alignas (0) _Alignas (int) aligned_as_int;
-
-// Check _Alignof.
-enum
-{
-  int_alignment = _Alignof (int),
-  int_array_alignment = _Alignof (int[100]),
-  char_alignment = _Alignof (char)
-};
-_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
-
-// Check _Noreturn.
-int _Noreturn does_not_return (void) { for (;;) continue; }
-
-// Check _Static_assert.
-struct test_static_assert
-{
-  int x;
-  _Static_assert (sizeof (int) <= sizeof (long int),
-                  "_Static_assert does not work in struct");
-  long int y;
-};
-
-// Check UTF-8 literals.
-#define u8 syntax error!
-char const utf8_literal[] = u8"happens to be ASCII" "another string";
-
-// Check duplicate typedefs.
-typedef long *long_ptr;
-typedef long int *long_ptr;
-typedef long_ptr long_ptr;
-
-// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
-struct anonymous
-{
-  union {
-    struct { int i; int j; };
-    struct { int k; long int l; } w;
-  };
-  int m;
-} v1;
-]],
-[_AC_C_C99_TEST_BODY[
-  v1.i = 2;
-  v1.w.k = 5;
-  _Static_assert ((offsetof (struct anonymous, i)
-		   == offsetof (struct anonymous, w.k)),
-		  "Anonymous union alignment botch");
-]],
-dnl Try
-dnl GCC		-std=gnu11 (unused restrictive mode: -std=c11)
-dnl with extended modes being tried first.
-dnl
-dnl Do not try -qlanglvl=extc1x, because IBM XL C V12.1 (the latest version as
-dnl of September 2012) does not pass the C11 test.  For now, try extc1x when
-dnl compiling the C99 test instead, since it enables _Static_assert and
-dnl _Noreturn, which is a win.  If -qlanglvl=extc11 or -qlanglvl=extc1x passes
-dnl the C11 test in some future version of IBM XL C, we'll add it here,
-dnl preferably extc11.
-[[-std=gnu11]], [$1], [$2])[]dnl
-])# _AC_PROG_CC_C11
-
-
-# AC_PROG_CC_C89
-# --------------
-# Do not use AU_ALIAS here and in AC_PROG_CC_C99 and AC_PROG_CC_STDC,
-# as that'd be incompatible with how Automake redefines AC_PROG_CC.  See
-# <https://lists.gnu.org/r/autoconf/2012-10/msg00048.html>.
-AU_DEFUN([AC_PROG_CC_C89],
-  [AC_REQUIRE([AC_PROG_CC])],
-  [$0 is obsolete; use AC_PROG_CC]
-)
-
-# AC_PROG_CC_C99
-# --------------
-AU_DEFUN([AC_PROG_CC_C99],
-  [AC_REQUIRE([AC_PROG_CC])],
-  [$0 is obsolete; use AC_PROG_CC]
-)
-
-# AC_PROG_CC_STDC
-# ---------------
-AU_DEFUN([AC_PROG_CC_STDC],
-  [AC_REQUIRE([AC_PROG_CC])],
-  [$0 is obsolete; use AC_PROG_CC]
-)
-
-
-# AC_C_PROTOTYPES
-# ---------------
-# Check if the C compiler supports prototypes, included if it needs
-# options.
-AC_DEFUN([AC_C_PROTOTYPES],
-[AC_REQUIRE([AC_PROG_CC])dnl
-if test "$ac_prog_cc_stdc" != no; then
-  AC_DEFINE(PROTOTYPES, 1,
-	    [Define to 1 if the C compiler supports function prototypes.])
-  AC_DEFINE(__PROTOTYPES, 1,
-	    [Define like PROTOTYPES; this can be used by system headers.])
-fi
-])# AC_C_PROTOTYPES
-
-
-# _AC_CXX_STD_TRY(STANDARD, TEST-PROLOGUE, TEST-BODY, OPTION-LIST,
-#		  ACTION-IF-AVAILABLE, ACTION-IF-UNAVAILABLE)
-# ----------------------------------------------------------------
-# Check whether the C++ compiler accepts features of STANDARD (e.g
-# `cxx98', `cxx11') by trying to compile a program of TEST-PROLOGUE
-# and TEST-BODY.  If this fails, try again with each compiler option
-# in the space-separated OPTION-LIST; if one helps, append it to CXX.
-# If eventually successful, run ACTION-IF-AVAILABLE, else
-# ACTION-IF-UNAVAILABLE.
-AC_DEFUN([_AC_CXX_STD_TRY],
-[AC_MSG_CHECKING([for $CXX option to enable ]m4_translit(m4_translit($1, [x], [+]), [a-z], [A-Z])[ features])
-AC_LANG_PUSH(C++)dnl
-AC_CACHE_VAL(ac_cv_prog_cxx_$1,
-[ac_cv_prog_cxx_$1=no
-ac_save_CXX=$CXX
-AC_LANG_CONFTEST([AC_LANG_PROGRAM([$2], [$3])])
-for ac_arg in '' $4
-do
-  CXX="$ac_save_CXX $ac_arg"
-  _AC_COMPILE_IFELSE([], [ac_cv_prog_cxx_$1=$ac_arg])
-  test "x$ac_cv_prog_cxx_$1" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CXX=$ac_save_CXX
-])# AC_CACHE_VAL
-ac_prog_cxx_stdcxx_options=
-case "x$ac_cv_prog_cxx_$1" in
-  x)
-    AC_MSG_RESULT([none needed]) ;;
-  xno)
-    AC_MSG_RESULT([unsupported]) ;;
-  *)
-    ac_prog_cxx_stdcxx_options=" $ac_cv_prog_cxx_$1"
-    CXX=$CXX$ac_prog_cxx_stdcxx_options
-    AC_MSG_RESULT([$ac_cv_prog_cxx_$1]) ;;
-esac
-AC_LANG_POP(C++)dnl
-AS_IF([test "x$ac_cv_prog_cxx_$1" != xno], [$5], [$6])
-])# _AC_CXX_STD_TRY
-
-# _AC_CXX_CXX98_TEST_HEADER
-# -------------------------
-# A C++ header suitable for testing for CXX98.
-AC_DEFUN([_AC_CXX_CXX98_TEST_HEADER],
-[[
-#include <algorithm>
-#include <cstdlib>
-#include <fstream>
-#include <iomanip>
-#include <iostream>
-#include <list>
-#include <map>
-#include <set>
-#include <sstream>
-#include <stdexcept>
-#include <string>
-#include <utility>
-#include <vector>
-
-namespace test {
-  typedef std::vector<std::string> string_vec;
-  typedef std::pair<int,bool> map_value;
-  typedef std::map<std::string,map_value> map_type;
-  typedef std::set<int> set_type;
-
-  template<typename T>
-  class printer {
-  public:
-    printer(std::ostringstream& os): os(os) {}
-    void operator() (T elem) { os << elem << std::endl; }
-  private:
-    std::ostringstream& os;
-  };
-}
-]])# _AC_CXX_CXX98_TEST_HEADER
-
-# _AC_CXX_CXX98_TEST_BODY
-# -----------------------
-# A C++ body suitable for testing for CXX98, assuming the corresponding header.
-AC_DEFUN([_AC_CXX_CXX98_TEST_BODY],
-[[
-
-try {
-  // Basic string.
-  std::string teststr("ASCII text");
-  teststr += " string";
-
-  // Simple vector.
-  test::string_vec testvec;
-  testvec.push_back(teststr);
-  testvec.push_back("foo");
-  testvec.push_back("bar");
-  if (testvec.size() != 3) {
-    throw std::runtime_error("vector size is not 1");
-  }
-
-  // Dump vector into stringstream and obtain string.
-  std::ostringstream os;
-  for (test::string_vec::const_iterator i = testvec.begin();
-       i != testvec.end(); ++i) {
-    if (i + 1 != testvec.end()) {
-      os << teststr << '\n';
-    }
-  }
-  // Check algorithms work.
-  std::for_each(testvec.begin(), testvec.end(), test::printer<std::string>(os));
-  std::string os_out = os.str();
-
-  // Test pair and map.
-  test::map_type testmap;
-  testmap.insert(std::make_pair(std::string("key"),
-                                std::make_pair(53,false)));
-
-  // Test set.
-  int values[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
-  test::set_type testset(values, values + sizeof(values)/sizeof(values[0]));
-  std::list<int> testlist(testset.begin(), testset.end());
-  std::copy(testset.begin(), testset.end(), std::back_inserter(testlist));
-} catch (const std::exception& e) {
-  std::cerr << "Caught exception: " << e.what() << std::endl;
-
-  // Test fstream
-  std::ofstream of("test.txt");
-  of << "Test ASCII text\n" << std::flush;
-  of << "N= " << std::hex << std::setw(8) << std::left << 534 << std::endl;
-  of.close();
-}
-std::exit(0);
-]])
-
-# _AC_CXX_CXX11_TEST_HEADER
-# -------------------------
-# A C++ header suitable for testing for CXX11.
-AC_DEFUN([_AC_CXX_CXX11_TEST_HEADER],
-[[
-#include <deque>
-#include <functional>
-#include <memory>
-#include <tuple>
-#include <array>
-#include <regex>
-#include <iostream>
-
-namespace cxx11test
-{
-  typedef std::shared_ptr<std::string> sptr;
-  typedef std::weak_ptr<std::string> wptr;
-
-  typedef std::tuple<std::string,int,double> tp;
-  typedef std::array<int, 20> int_array;
-
-  constexpr int get_val() { return 20; }
-
-  struct testinit
-  {
-    int i;
-    double d;
-  };
-
-  class delegate  {
-  public:
-    delegate(int n) : n(n) {}
-    delegate(): delegate(2354) {}
-
-    virtual int getval() { return this->n; };
-  protected:
-    int n;
-  };
-
-  class overridden : public delegate {
-  public:
-    overridden(int n): delegate(n) {}
-    virtual int getval() override final { return this->n * 2; }
-  };
-
-  class nocopy {
-  public:
-    nocopy(int i): i(i) {}
-    nocopy() = default;
-    nocopy(const nocopy&) = delete;
-    nocopy & operator=(const nocopy&) = delete;
-  private:
-    int i;
-  };
-}
-]])# _AC_CXX_CXX11_TEST_HEADER
-
-# _AC_CXX_CXX11_TEST_BODY
-# -----------------------
-# A C++ body suitable for testing for CXX11, assuming the corresponding header.
-AC_DEFUN([_AC_CXX_CXX11_TEST_BODY],
-[[
-{
-  // Test auto and decltype
-  std::deque<int> d;
-  d.push_front(43);
-  d.push_front(484);
-  d.push_front(3);
-  d.push_front(844);
-  int total = 0;
-  for (auto i = d.begin(); i != d.end(); ++i) { total += *i; }
-
-  auto a1 = 6538;
-  auto a2 = 48573953.4;
-  auto a3 = "String literal";
-
-  decltype(a2) a4 = 34895.034;
-}
-{
-  // Test constexpr
-  short sa[cxx11test::get_val()] = { 0 };
-}
-{
-  // Test initializer lists
-  cxx11test::testinit il = { 4323, 435234.23544 };
-}
-{
-  // Test range-based for and lambda
-  cxx11test::int_array array = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
-  for (int &x : array) { x += 23; }
-  std::for_each(array.begin(), array.end(), [](int v1){ std::cout << v1; });
-}
-{
-  using cxx11test::sptr;
-  using cxx11test::wptr;
-
-  sptr sp(new std::string("ASCII string"));
-  wptr wp(sp);
-  sptr sp2(wp);
-}
-{
-  cxx11test::tp tuple("test", 54, 45.53434);
-  double d = std::get<2>(tuple);
-  std::string s;
-  int i;
-  std::tie(s,i,d) = tuple;
-}
-{
-  static std::regex filename_regex("^_?([a-z0-9_.]+-)+[a-z0-9]+$");
-  std::string testmatch("Test if this string matches");
-  bool match = std::regex_search(testmatch, filename_regex);
-}
-{
-  cxx11test::int_array array = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
-  cxx11test::int_array::size_type size = array.size();
-}
-{
-  // Test constructor delegation
-  cxx11test::delegate d1;
-  cxx11test::delegate d2();
-  cxx11test::delegate d3(45);
-}
-{
-  // Test override and final
-  cxx11test::overridden o1(55464);
-}
-{
-  // Test nullptr
-  char *c = nullptr;
-}
-{
-  // Test template brackets
-  std::vector<std::pair<int,char*>> v1;
-}
-{
-  // Unicode literals
-  char const *utf8 = u8"UTF-8 string \u2500";
-  char16_t const *utf16 = u"UTF-8 string \u2500";
-  char32_t const *utf32 = U"UTF-32 string \u2500";
-}
-]])
-
-# _AC_PROG_CXX_CXX98 ([ACTION-IF-AVAILABLE], [ACTION-IF-UNAVAILABLE])
-# -------------------------------------------------------------------
-
-# If the C++ compiler is not in ISO C++98 mode by default, try to add
-# an option to output variable CXX to make it so.  This macro tries
-# various options that select ISO C++98 on some system or another.  It
-# considers the compiler to be in ISO C++98 mode if it handles basic
-# features of the std namespace including: string, containers (list,
-# map, set, vector), streams (fstreams, iostreams, stringstreams,
-# iomanip), pair, exceptions and algorithms.
-
-
-AC_DEFUN([_AC_PROG_CXX_CXX98],
-[_AC_CXX_STD_TRY([cxx98],
-[_AC_CXX_CXX98_TEST_HEADER],
-[_AC_CXX_CXX98_TEST_BODY],
-dnl Try
-dnl GCC		-std=gnu++98 (unused restrictive mode: -std=c++98)
-dnl IBM XL C	-qlanglvl=extended
-dnl HP aC++	-AA
-dnl Intel ICC	-std=gnu++98
-dnl Solaris	N/A (default)
-dnl Tru64	N/A (default, but -std gnu could be used)
-dnl with extended modes being tried first.
-[[-std=gnu++98 -std=c++98 -qlanglvl=extended -AA]], [$1], [$2])[]dnl
-])# _AC_PROG_CXX_CXX98
-
-# _AC_PROG_CXX_CXX11 ([ACTION-IF-AVAILABLE], [ACTION-IF-UNAVAILABLE])
-# -------------------------------------------------------------------
-# If the C++ compiler is not in ISO CXX11 mode by default, try to add
-# an option to output variable CXX to make it so.  This macro tries
-# various options that select ISO C++11 on some system or another.  It
-# considers the compiler to be in ISO C++11 mode if it handles all the
-# tests from the C++98 checks, plus the following: Language features
-# (auto, constexpr, decltype, default/deleted constructors, delegate
-# constructors, final, initializer lists, lambda functions, nullptr,
-# override, range-based for loops, template brackets without spaces,
-# unicode literals) and library features (array, memory (shared_ptr,
-# weak_ptr), regex and tuple types).
-AC_DEFUN([_AC_PROG_CXX_CXX11],
-[_AC_CXX_STD_TRY([cxx11],
-[_AC_CXX_CXX11_TEST_HEADER
-_AC_CXX_CXX98_TEST_HEADER],
-[_AC_CXX_CXX11_TEST_BODY
-_AC_CXX_CXX98_TEST_BODY],
-dnl Try
-dnl GCC		-std=gnu++11 (unused restrictive mode: -std=c++11) [and 0x variants]
-dnl IBM XL C	-qlanglvl=extended0x
-dnl		(pre-V12.1; unused restrictive mode: -qlanglvl=stdcxx11)
-dnl HP aC++	-AA
-dnl Intel ICC	-std=c++11 -std=c++0x
-dnl Solaris	N/A (no support)
-dnl Tru64	N/A (no support)
-dnl with extended modes being tried first.
-[[-std=gnu++11 -std=c++11 -std=gnu++0x -std=c++0x -qlanglvl=extended0x -AA]], [$1], [$2])[]dnl
-])# _AC_PROG_CXX_CXX11
diff --git a/m4/stdalign.m4 b/m4/stdalign.m4
new file mode 100644
index 0000000..e22d7f7
--- /dev/null
+++ b/m4/stdalign.m4
@@ -0,0 +1,59 @@
+# Check for stdalign.h that conforms to C11.
+
+dnl Copyright 2011-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Prepare for substituting <stdalign.h> if it is not supported.
+
+AC_DEFUN([gl_STDALIGN_H],
+[
+  AC_CACHE_CHECK([for working stdalign.h],
+    [gl_cv_header_working_stdalign_h],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <stdint.h>
+            #include <stdalign.h>
+            #include <stddef.h>
+
+            /* Test that alignof yields a result consistent with offsetof.
+               This catches GCC bug 52023
+               <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023>.  */
+            #ifdef __cplusplus
+               template <class t> struct alignof_helper { char a; t b; };
+            # define ao(type) offsetof (alignof_helper<type>, b)
+            #else
+            # define ao(type) offsetof (struct { char a; type b; }, b)
+            #endif
+            char test_double[ao (double) % _Alignof (double) == 0 ? 1 : -1];
+            char test_long[ao (long int) % _Alignof (long int) == 0 ? 1 : -1];
+            char test_alignof[alignof (double) == _Alignof (double) ? 1 : -1];
+
+            /* Test _Alignas only on platforms where gnulib can help.  */
+            #if \
+                ((defined __cplusplus && 201103 <= __cplusplus) \
+                 || (__TINYC__ && defined __attribute__) \
+                 || (defined __APPLE__ && defined __MACH__ \
+                     ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__) \
+                     : __GNUC__) \
+                 || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \
+                 || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__ \
+                 || 1300 <= _MSC_VER)
+              struct alignas_test { char c; char alignas (8) alignas_8; };
+              char test_alignas[offsetof (struct alignas_test, alignas_8) == 8
+                                ? 1 : -1];
+            #endif
+          ]])],
+       [gl_cv_header_working_stdalign_h=yes],
+       [gl_cv_header_working_stdalign_h=no])])
+
+  if test $gl_cv_header_working_stdalign_h = yes; then
+    STDALIGN_H=''
+  else
+    STDALIGN_H='stdalign.h'
+  fi
+
+  AC_SUBST([STDALIGN_H])
+  AM_CONDITIONAL([GL_GENERATE_STDALIGN_H], [test -n "$STDALIGN_H"])
+])
diff --git a/m4/stdbool.m4 b/m4/stdbool.m4
index acb8522..3169779 100644
--- a/m4/stdbool.m4
+++ b/m4/stdbool.m4
@@ -1,22 +1,36 @@
 # Check for stdbool.h that conforms to C99.
 
-dnl Copyright (C) 2002-2006, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2002-2006, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
-#serial 7
+#serial 8
 
 # Prepare for substituting <stdbool.h> if it is not supported.
 
 AC_DEFUN([AM_STDBOOL_H],
 [
   AC_REQUIRE([AC_CHECK_HEADER_STDBOOL])
+  AC_REQUIRE([AC_CANONICAL_HOST])
 
-  # Define two additional variables used in the Makefile substitution.
-
+  dnl On some platforms, <stdbool.h> does not exist or does not conform to C99.
+  dnl On Solaris 10 with CC=cc CXX=CC, <stdbool.h> exists but is not usable
+  dnl in C++ mode (and no <cstdbool> exists). In this case, we use our
+  dnl replacement, also in C mode (for binary compatibility between C and C++).
   if test "$ac_cv_header_stdbool_h" = yes; then
-    STDBOOL_H=''
+    case "$host_os" in
+      solaris*)
+        if test -z "$GCC"; then
+          STDBOOL_H='stdbool.h'
+        else
+          STDBOOL_H=''
+        fi
+        ;;
+      *)
+        STDBOOL_H=''
+        ;;
+    esac
   else
     STDBOOL_H='stdbool.h'
   fi
diff --git a/m4/stddef_h.m4 b/m4/stddef_h.m4
index 979e3cf..1303d2e 100644
--- a/m4/stddef_h.m4
+++ b/m4/stddef_h.m4
@@ -1,14 +1,19 @@
-dnl A placeholder for <stddef.h>, for platforms that have issues.
-# stddef_h.m4 serial 6
-dnl Copyright (C) 2009-2019 Free Software Foundation, Inc.
+# stddef_h.m4 serial 11
+dnl Copyright (C) 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
-AC_DEFUN([gl_STDDEF_H],
+dnl A placeholder for <stddef.h>, for platforms that have issues.
+
+AC_DEFUN_ONCE([gl_STDDEF_H],
 [
   AC_REQUIRE([gl_STDDEF_H_DEFAULTS])
   AC_REQUIRE([gt_TYPE_WCHAR_T])
+
+  dnl Persuade OpenBSD <stddef.h> to declare max_align_t.
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
   STDDEF_H=
 
   dnl Test whether the type max_align_t exists and whether its alignment
@@ -19,10 +24,17 @@
        [AC_LANG_PROGRAM(
           [[#include <stddef.h>
             unsigned int s = sizeof (max_align_t);
-            #if defined __GNUC__ || defined __IBM__ALIGNOF__
+            #if defined __GNUC__ || defined __clang__ || defined __IBM__ALIGNOF__
             int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1];
             int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1];
             #endif
+            typedef struct { char a; max_align_t b; } max_helper;
+            typedef struct { char a; long b; } long_helper;
+            typedef struct { char a; double b; } double_helper;
+            typedef struct { char a; long double b; } long_double_helper;
+            int check3[2 * (offsetof (long_helper, b) <= offsetof (max_helper, b)) - 1];
+            int check4[2 * (offsetof (double_helper, b) <= offsetof (max_helper, b)) - 1];
+            int check5[2 * (offsetof (long_double_helper, b) <= offsetof (max_helper, b)) - 1];
           ]])],
        [gl_cv_type_max_align_t=yes],
        [gl_cv_type_max_align_t=no])
@@ -56,13 +68,28 @@
   fi
 ])
 
+# gl_STDDEF_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_STDDEF_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_STDDEF_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_STDDEF_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_STDDEF_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_STDDEF_H_MODULE_INDICATOR_DEFAULTS], [
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_STDDEF_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_STDDEF_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_STDDEF_H_DEFAULTS],
 [
   dnl Assume proper GNU behavior unless another module says otherwise.
diff --git a/m4/stdint.m4 b/m4/stdint.m4
index 11d8e8e..2eb1652 100644
--- a/m4/stdint.m4
+++ b/m4/stdint.m4
@@ -1,5 +1,5 @@
-# stdint.m4 serial 53
-dnl Copyright (C) 2001-2019 Free Software Foundation, Inc.
+# stdint.m4 serial 60
+dnl Copyright (C) 2001-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -17,21 +17,12 @@
   AC_REQUIRE([gl_LIMITS_H])
   AC_REQUIRE([gt_TYPE_WINT_T])
 
-  dnl Check for long long int and unsigned long long int.
-  AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
-  if test $ac_cv_type_long_long_int = yes; then
-    HAVE_LONG_LONG_INT=1
-  else
-    HAVE_LONG_LONG_INT=0
-  fi
-  AC_SUBST([HAVE_LONG_LONG_INT])
-  AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
-  if test $ac_cv_type_unsigned_long_long_int = yes; then
-    HAVE_UNSIGNED_LONG_LONG_INT=1
-  else
-    HAVE_UNSIGNED_LONG_LONG_INT=0
-  fi
-  AC_SUBST([HAVE_UNSIGNED_LONG_LONG_INT])
+  dnl For backward compatibility. Some packages may still be testing these
+  dnl macros.
+  AC_DEFINE([HAVE_LONG_LONG_INT], [1],
+    [Define to 1 if the system has the type 'long long int'.])
+  AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
+    [Define to 1 if the system has the type 'unsigned long long int'.])
 
   dnl Check for <wchar.h>, in the same way as gl_WCHAR_H does.
   AC_CHECK_HEADERS_ONCE([wchar.h])
@@ -43,7 +34,7 @@
   AC_SUBST([HAVE_WCHAR_H])
 
   dnl Check for <inttypes.h>.
-  dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_inttypes_h.
+  AC_CHECK_HEADERS_ONCE([inttypes.h])
   if test $ac_cv_header_inttypes_h = yes; then
     HAVE_INTTYPES_H=1
   else
@@ -52,7 +43,7 @@
   AC_SUBST([HAVE_INTTYPES_H])
 
   dnl Check for <sys/types.h>.
-  dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_sys_types_h.
+  AC_CHECK_HEADERS_ONCE([sys/types.h])
   if test $ac_cv_header_sys_types_h = yes; then
     HAVE_SYS_TYPES_H=1
   else
@@ -161,7 +152,7 @@
 /* Check that SIZE_MAX has the correct type, if possible.  */
 #if 201112 <= __STDC_VERSION__
 int k = _Generic (SIZE_MAX, size_t: 0);
-#elif (2 <= __GNUC__ || defined __IBM__TYPEOF__ \
+#elif (2 <= __GNUC__ || 4 <= __clang_major__ || defined __IBM__TYPEOF__ \
        || (0x5110 <= __SUNPRO_C && !__STDC__))
 extern size_t k;
 extern __typeof__ (SIZE_MAX) k;
@@ -179,7 +170,7 @@
       PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t)
       && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t)
       ? 1 : -1;
-  /* Detect bug in FreeBSD 6.0 / ia64.  */
+  /* Detect bug in FreeBSD 6.0/ia64 and FreeBSD 13.0/arm64.  */
   int check_SIG_ATOMIC:
       SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t)
       && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t)
@@ -311,9 +302,10 @@
       HAVE_C99_STDINT_H=1
       dnl Now see whether the system <stdint.h> works without
       dnl __STDC_CONSTANT_MACROS/__STDC_LIMIT_MACROS defined.
-      AC_CACHE_CHECK([whether stdint.h predates C++11],
-        [gl_cv_header_stdint_predates_cxx11_h],
-        [gl_cv_header_stdint_predates_cxx11_h=yes
+      dnl If not, there would be problems when stdint.h is included from C++.
+      AC_CACHE_CHECK([whether stdint.h works without ISO C predefines],
+        [gl_cv_header_stdint_without_STDC_macros],
+        [gl_cv_header_stdint_without_STDC_macros=no
          AC_COMPILE_IFELSE([
            AC_LANG_PROGRAM([[
 #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
@@ -324,13 +316,14 @@
 intmax_t im = INTMAX_MAX;
 int32_t i32 = INT32_C (0x7fffffff);
            ]])],
-           [gl_cv_header_stdint_predates_cxx11_h=no])])
+           [gl_cv_header_stdint_without_STDC_macros=yes])
+        ])
 
-      if test "$gl_cv_header_stdint_predates_cxx11_h" = yes; then
+      if test $gl_cv_header_stdint_without_STDC_macros = no; then
         AC_DEFINE([__STDC_CONSTANT_MACROS], [1],
-                  [Define to 1 if the system <stdint.h> predates C++11.])
+          [Define to 1 if the system <stdint.h> predates C++11.])
         AC_DEFINE([__STDC_LIMIT_MACROS], [1],
-                  [Define to 1 if the system <stdint.h> predates C++11.])
+          [Define to 1 if the system <stdint.h> predates C++11.])
       fi
       AC_CACHE_CHECK([whether stdint.h has UINTMAX_WIDTH etc.],
         [gl_cv_header_stdint_width],
@@ -500,13 +493,9 @@
 dnl gl_STDINT_INCLUDES
 AC_DEFUN([gl_STDINT_INCLUDES],
 [[
-  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-     included before <wchar.h>.  */
   #include <stddef.h>
   #include <signal.h>
   #if HAVE_WCHAR_H
-  # include <stdio.h>
-  # include <time.h>
   # include <wchar.h>
   #endif
 ]])
@@ -538,7 +527,7 @@
   dnl requirement that wint_t is "unchanged by default argument promotions".
   dnl In this case gnulib's <wchar.h> and <wctype.h> override wint_t.
   dnl Set the variable BITSIZEOF_WINT_T accordingly.
-  if test $GNULIB_OVERRIDES_WINT_T = 1; then
+  if test $GNULIBHEADERS_OVERRIDE_WINT_T = 1; then
     BITSIZEOF_WINT_T=32
   fi
 ])
diff --git a/m4/stdint_h.m4 b/m4/stdint_h.m4
index 6d5f1af..18aa50a 100644
--- a/m4/stdint_h.m4
+++ b/m4/stdint_h.m4
@@ -1,5 +1,5 @@
 # stdint_h.m4 serial 9
-dnl Copyright (C) 1997-2004, 2006, 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 1997-2004, 2006, 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/stdio_h.m4 b/m4/stdio_h.m4
index 6c9c104..e704383 100644
--- a/m4/stdio_h.m4
+++ b/m4/stdio_h.m4
@@ -1,11 +1,12 @@
-# stdio_h.m4 serial 49
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+# stdio_h.m4 serial 56
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
-AC_DEFUN([gl_STDIO_H],
+AC_DEFUN_ONCE([gl_STDIO_H],
 [
+  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
   AH_VERBATIM([MINGW_ANSI_STDIO],
 [/* Use GNU style printf and scanf.  */
 #ifndef __USE_MINGW_ANSI_STDIO
@@ -13,7 +14,6 @@
 #endif
 ])
   AC_DEFINE([__USE_MINGW_ANSI_STDIO])
-  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
   gl_NEXT_HEADERS([stdio.h])
 
   dnl Determine whether __USE_MINGW_ANSI_STDIO makes printf and
@@ -40,17 +40,6 @@
        attribute "__gnu_printf__" instead of "__printf__"])
   fi
 
-  dnl No need to create extra modules for these functions. Everyone who uses
-  dnl <stdio.h> likely needs them.
-  GNULIB_FSCANF=1
-  gl_MODULE_INDICATOR([fscanf])
-  GNULIB_SCANF=1
-  gl_MODULE_INDICATOR([scanf])
-  GNULIB_FGETC=1
-  GNULIB_GETC=1
-  GNULIB_GETCHAR=1
-  GNULIB_FGETS=1
-  GNULIB_FREAD=1
   dnl This ifdef is necessary to avoid an error "missing file lib/stdio-read.c"
   dnl "expected source file, required through AC_LIBSOURCES, not found". It is
   dnl also an optimization, to avoid performing a configure check whose result
@@ -64,18 +53,6 @@
     fi
   ])
 
-  dnl No need to create extra modules for these functions. Everyone who uses
-  dnl <stdio.h> likely needs them.
-  GNULIB_FPRINTF=1
-  GNULIB_PRINTF=1
-  GNULIB_VFPRINTF=1
-  GNULIB_VPRINTF=1
-  GNULIB_FPUTC=1
-  GNULIB_PUTC=1
-  GNULIB_PUTCHAR=1
-  GNULIB_FPUTS=1
-  GNULIB_PUTS=1
-  GNULIB_FWRITE=1
   dnl This ifdef is necessary to avoid an error "missing file lib/stdio-write.c"
   dnl "expected source file, required through AC_LIBSOURCES, not found". It is
   dnl also an optimization, to avoid performing a configure check whose result
@@ -107,73 +84,103 @@
   gl_WARN_ON_USE_PREPARE([[#include <stdio.h>
     ]], [dprintf fpurge fseeko ftello getdelim getline gets pclose popen
     renameat snprintf tmpfile vdprintf vsnprintf])
+
+  AC_REQUIRE([AC_C_RESTRICT])
+
+  AC_CHECK_DECLS_ONCE([fcloseall])
+  if test $ac_cv_have_decl_fcloseall = no; then
+    HAVE_DECL_FCLOSEALL=0
+  fi
 ])
 
+# gl_STDIO_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_STDIO_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_STDIO_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_STDIO_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_STDIO_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DPRINTF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FCLOSE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FDOPEN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FFLUSH])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FGETC])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FGETS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FOPEN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPRINTF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPRINTF_POSIX])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPURGE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPUTC])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPUTS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREAD])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREOPEN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSCANF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSEEK])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSEEKO])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FTELL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FTELLO])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FWRITE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETC])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETCHAR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETDELIM])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETLINE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_OBSTACK_PRINTF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_OBSTACK_PRINTF_POSIX])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PCLOSE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PERROR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POPEN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PRINTF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PRINTF_POSIX])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PUTC])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PUTCHAR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PUTS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REMOVE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RENAME])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RENAMEAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SCANF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SNPRINTF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SPRINTF_POSIX])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STDIO_H_NONBLOCKING])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STDIO_H_SIGPIPE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TMPFILE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VASPRINTF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VFSCANF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VSCANF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VDPRINTF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VFPRINTF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VFPRINTF_POSIX])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VPRINTF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VPRINTF_POSIX])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VSNPRINTF])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VSPRINTF_POSIX])
+    dnl Support Microsoft deprecated alias function names by default.
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_FCLOSEALL], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_FDOPEN], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_FILENO], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_GETW], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_PUTW], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_TEMPNAM], [1])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_STDIO_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_STDIO_H_DEFAULTS],
 [
-  GNULIB_DPRINTF=0;              AC_SUBST([GNULIB_DPRINTF])
-  GNULIB_FCLOSE=0;               AC_SUBST([GNULIB_FCLOSE])
-  GNULIB_FDOPEN=0;               AC_SUBST([GNULIB_FDOPEN])
-  GNULIB_FFLUSH=0;               AC_SUBST([GNULIB_FFLUSH])
-  GNULIB_FGETC=0;                AC_SUBST([GNULIB_FGETC])
-  GNULIB_FGETS=0;                AC_SUBST([GNULIB_FGETS])
-  GNULIB_FOPEN=0;                AC_SUBST([GNULIB_FOPEN])
-  GNULIB_FPRINTF=0;              AC_SUBST([GNULIB_FPRINTF])
-  GNULIB_FPRINTF_POSIX=0;        AC_SUBST([GNULIB_FPRINTF_POSIX])
-  GNULIB_FPURGE=0;               AC_SUBST([GNULIB_FPURGE])
-  GNULIB_FPUTC=0;                AC_SUBST([GNULIB_FPUTC])
-  GNULIB_FPUTS=0;                AC_SUBST([GNULIB_FPUTS])
-  GNULIB_FREAD=0;                AC_SUBST([GNULIB_FREAD])
-  GNULIB_FREOPEN=0;              AC_SUBST([GNULIB_FREOPEN])
-  GNULIB_FSCANF=0;               AC_SUBST([GNULIB_FSCANF])
-  GNULIB_FSEEK=0;                AC_SUBST([GNULIB_FSEEK])
-  GNULIB_FSEEKO=0;               AC_SUBST([GNULIB_FSEEKO])
-  GNULIB_FTELL=0;                AC_SUBST([GNULIB_FTELL])
-  GNULIB_FTELLO=0;               AC_SUBST([GNULIB_FTELLO])
-  GNULIB_FWRITE=0;               AC_SUBST([GNULIB_FWRITE])
-  GNULIB_GETC=0;                 AC_SUBST([GNULIB_GETC])
-  GNULIB_GETCHAR=0;              AC_SUBST([GNULIB_GETCHAR])
-  GNULIB_GETDELIM=0;             AC_SUBST([GNULIB_GETDELIM])
-  GNULIB_GETLINE=0;              AC_SUBST([GNULIB_GETLINE])
-  GNULIB_OBSTACK_PRINTF=0;       AC_SUBST([GNULIB_OBSTACK_PRINTF])
-  GNULIB_OBSTACK_PRINTF_POSIX=0; AC_SUBST([GNULIB_OBSTACK_PRINTF_POSIX])
-  GNULIB_PCLOSE=0;               AC_SUBST([GNULIB_PCLOSE])
-  GNULIB_PERROR=0;               AC_SUBST([GNULIB_PERROR])
-  GNULIB_POPEN=0;                AC_SUBST([GNULIB_POPEN])
-  GNULIB_PRINTF=0;               AC_SUBST([GNULIB_PRINTF])
-  GNULIB_PRINTF_POSIX=0;         AC_SUBST([GNULIB_PRINTF_POSIX])
-  GNULIB_PUTC=0;                 AC_SUBST([GNULIB_PUTC])
-  GNULIB_PUTCHAR=0;              AC_SUBST([GNULIB_PUTCHAR])
-  GNULIB_PUTS=0;                 AC_SUBST([GNULIB_PUTS])
-  GNULIB_REMOVE=0;               AC_SUBST([GNULIB_REMOVE])
-  GNULIB_RENAME=0;               AC_SUBST([GNULIB_RENAME])
-  GNULIB_RENAMEAT=0;             AC_SUBST([GNULIB_RENAMEAT])
-  GNULIB_SCANF=0;                AC_SUBST([GNULIB_SCANF])
-  GNULIB_SNPRINTF=0;             AC_SUBST([GNULIB_SNPRINTF])
-  GNULIB_SPRINTF_POSIX=0;        AC_SUBST([GNULIB_SPRINTF_POSIX])
-  GNULIB_STDIO_H_NONBLOCKING=0;  AC_SUBST([GNULIB_STDIO_H_NONBLOCKING])
-  GNULIB_STDIO_H_SIGPIPE=0;      AC_SUBST([GNULIB_STDIO_H_SIGPIPE])
-  GNULIB_TMPFILE=0;              AC_SUBST([GNULIB_TMPFILE])
-  GNULIB_VASPRINTF=0;            AC_SUBST([GNULIB_VASPRINTF])
-  GNULIB_VFSCANF=0;              AC_SUBST([GNULIB_VFSCANF])
-  GNULIB_VSCANF=0;               AC_SUBST([GNULIB_VSCANF])
-  GNULIB_VDPRINTF=0;             AC_SUBST([GNULIB_VDPRINTF])
-  GNULIB_VFPRINTF=0;             AC_SUBST([GNULIB_VFPRINTF])
-  GNULIB_VFPRINTF_POSIX=0;       AC_SUBST([GNULIB_VFPRINTF_POSIX])
-  GNULIB_VPRINTF=0;              AC_SUBST([GNULIB_VPRINTF])
-  GNULIB_VPRINTF_POSIX=0;        AC_SUBST([GNULIB_VPRINTF_POSIX])
-  GNULIB_VSNPRINTF=0;            AC_SUBST([GNULIB_VSNPRINTF])
-  GNULIB_VSPRINTF_POSIX=0;       AC_SUBST([GNULIB_VSPRINTF_POSIX])
   dnl Assume proper GNU behavior unless another module says otherwise.
+  HAVE_DECL_FCLOSEALL=1;         AC_SUBST([HAVE_DECL_FCLOSEALL])
   HAVE_DECL_FPURGE=1;            AC_SUBST([HAVE_DECL_FPURGE])
   HAVE_DECL_FSEEKO=1;            AC_SUBST([HAVE_DECL_FSEEKO])
   HAVE_DECL_FTELLO=1;            AC_SUBST([HAVE_DECL_FTELLO])
diff --git a/m4/stdlib_h.m4 b/m4/stdlib_h.m4
index 6121602..9c1d1c7 100644
--- a/m4/stdlib_h.m4
+++ b/m4/stdlib_h.m4
@@ -1,10 +1,10 @@
-# stdlib_h.m4 serial 48
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+# stdlib_h.m4 serial 63
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
-AC_DEFUN([gl_STDLIB_H],
+AC_DEFUN_ONCE([gl_STDLIB_H],
 [
   AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
   gl_NEXT_HEADERS([stdlib.h])
@@ -22,63 +22,110 @@
 #if HAVE_RANDOM_H
 # include <random.h>
 #endif
-    ]], [_Exit atoll canonicalize_file_name getloadavg getsubopt grantpt
+    ]], [_Exit aligned_alloc atoll canonicalize_file_name free
+    getloadavg getsubopt grantpt
     initstate initstate_r mbtowc mkdtemp mkostemp mkostemps mkstemp mkstemps
-    posix_openpt ptsname ptsname_r qsort_r random random_r reallocarray
-    realpath rpmatch secure_getenv setenv setstate setstate_r srandom
-    srandom_r strtod strtold strtoll strtoull unlockpt unsetenv])
+    posix_memalign posix_openpt ptsname ptsname_r qsort_r
+    random random_r reallocarray realpath rpmatch secure_getenv setenv
+    setstate setstate_r srandom srandom_r
+    strtod strtol strtold strtoll strtoul strtoull unlockpt unsetenv])
+
+  AC_REQUIRE([AC_C_RESTRICT])
+
+  AC_CHECK_DECLS_ONCE([ecvt])
+  if test $ac_cv_have_decl_ecvt = no; then
+    HAVE_DECL_ECVT=0
+  fi
+  AC_CHECK_DECLS_ONCE([fcvt])
+  if test $ac_cv_have_decl_fcvt = no; then
+    HAVE_DECL_FCVT=0
+  fi
+  AC_CHECK_DECLS_ONCE([gcvt])
+  if test $ac_cv_have_decl_gcvt = no; then
+    HAVE_DECL_GCVT=0
+  fi
 ])
 
+# gl_STDLIB_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_STDLIB_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_STDLIB_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_STDLIB_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_STDLIB_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB__EXIT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ALIGNED_ALLOC])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ATOLL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CALLOC_POSIX])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CANONICALIZE_FILE_NAME])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREE_POSIX])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETLOADAVG])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETSUBOPT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GRANTPT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MALLOC_POSIX])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBTOWC])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKDTEMP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKOSTEMP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKOSTEMPS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKSTEMP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKSTEMPS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_MEMALIGN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_OPENPT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PTSNAME])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PTSNAME_R])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PUTENV])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_QSORT_R])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RANDOM])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RANDOM_R])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REALLOCARRAY])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REALLOC_POSIX])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REALPATH])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RPMATCH])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SECURE_GETENV])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SETENV])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOD])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOLD])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOLL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOUL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOULL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SYSTEM_POSIX])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNLOCKPT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNSETENV])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCTOMB])
+    dnl Support Microsoft deprecated alias function names by default.
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_ECVT], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_FCVT], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_GCVT], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_MKTEMP], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_PUTENV], [1])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_STDLIB_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_STDLIB_H_DEFAULTS],
 [
-  GNULIB__EXIT=0;         AC_SUBST([GNULIB__EXIT])
-  GNULIB_ATOLL=0;         AC_SUBST([GNULIB_ATOLL])
-  GNULIB_CALLOC_POSIX=0;  AC_SUBST([GNULIB_CALLOC_POSIX])
-  GNULIB_CANONICALIZE_FILE_NAME=0;  AC_SUBST([GNULIB_CANONICALIZE_FILE_NAME])
-  GNULIB_GETLOADAVG=0;    AC_SUBST([GNULIB_GETLOADAVG])
-  GNULIB_GETSUBOPT=0;     AC_SUBST([GNULIB_GETSUBOPT])
-  GNULIB_GRANTPT=0;       AC_SUBST([GNULIB_GRANTPT])
-  GNULIB_MALLOC_POSIX=0;  AC_SUBST([GNULIB_MALLOC_POSIX])
-  GNULIB_MBTOWC=0;        AC_SUBST([GNULIB_MBTOWC])
-  GNULIB_MKDTEMP=0;       AC_SUBST([GNULIB_MKDTEMP])
-  GNULIB_MKOSTEMP=0;      AC_SUBST([GNULIB_MKOSTEMP])
-  GNULIB_MKOSTEMPS=0;     AC_SUBST([GNULIB_MKOSTEMPS])
-  GNULIB_MKSTEMP=0;       AC_SUBST([GNULIB_MKSTEMP])
-  GNULIB_MKSTEMPS=0;      AC_SUBST([GNULIB_MKSTEMPS])
-  GNULIB_POSIX_OPENPT=0;  AC_SUBST([GNULIB_POSIX_OPENPT])
-  GNULIB_PTSNAME=0;       AC_SUBST([GNULIB_PTSNAME])
-  GNULIB_PTSNAME_R=0;     AC_SUBST([GNULIB_PTSNAME_R])
-  GNULIB_PUTENV=0;        AC_SUBST([GNULIB_PUTENV])
-  GNULIB_QSORT_R=0;       AC_SUBST([GNULIB_QSORT_R])
-  GNULIB_RANDOM=0;        AC_SUBST([GNULIB_RANDOM])
-  GNULIB_RANDOM_R=0;      AC_SUBST([GNULIB_RANDOM_R])
-  GNULIB_REALLOCARRAY=0;  AC_SUBST([GNULIB_REALLOCARRAY])
-  GNULIB_REALLOC_POSIX=0; AC_SUBST([GNULIB_REALLOC_POSIX])
-  GNULIB_REALPATH=0;      AC_SUBST([GNULIB_REALPATH])
-  GNULIB_RPMATCH=0;       AC_SUBST([GNULIB_RPMATCH])
-  GNULIB_SECURE_GETENV=0; AC_SUBST([GNULIB_SECURE_GETENV])
-  GNULIB_SETENV=0;        AC_SUBST([GNULIB_SETENV])
-  GNULIB_STRTOD=0;        AC_SUBST([GNULIB_STRTOD])
-  GNULIB_STRTOLD=0;       AC_SUBST([GNULIB_STRTOLD])
-  GNULIB_STRTOLL=0;       AC_SUBST([GNULIB_STRTOLL])
-  GNULIB_STRTOULL=0;      AC_SUBST([GNULIB_STRTOULL])
-  GNULIB_SYSTEM_POSIX=0;  AC_SUBST([GNULIB_SYSTEM_POSIX])
-  GNULIB_UNLOCKPT=0;      AC_SUBST([GNULIB_UNLOCKPT])
-  GNULIB_UNSETENV=0;      AC_SUBST([GNULIB_UNSETENV])
-  GNULIB_WCTOMB=0;        AC_SUBST([GNULIB_WCTOMB])
   dnl Assume proper GNU behavior unless another module says otherwise.
   HAVE__EXIT=1;              AC_SUBST([HAVE__EXIT])
+  HAVE_ALIGNED_ALLOC=1;      AC_SUBST([HAVE_ALIGNED_ALLOC])
   HAVE_ATOLL=1;              AC_SUBST([HAVE_ATOLL])
   HAVE_CANONICALIZE_FILE_NAME=1;  AC_SUBST([HAVE_CANONICALIZE_FILE_NAME])
+  HAVE_DECL_ECVT=1;          AC_SUBST([HAVE_DECL_ECVT])
+  HAVE_DECL_FCVT=1;          AC_SUBST([HAVE_DECL_FCVT])
+  HAVE_DECL_GCVT=1;          AC_SUBST([HAVE_DECL_GCVT])
   HAVE_DECL_GETLOADAVG=1;    AC_SUBST([HAVE_DECL_GETLOADAVG])
   HAVE_GETSUBOPT=1;          AC_SUBST([HAVE_GETSUBOPT])
   HAVE_GRANTPT=1;            AC_SUBST([HAVE_GRANTPT])
@@ -90,6 +137,7 @@
   HAVE_MKOSTEMPS=1;          AC_SUBST([HAVE_MKOSTEMPS])
   HAVE_MKSTEMP=1;            AC_SUBST([HAVE_MKSTEMP])
   HAVE_MKSTEMPS=1;           AC_SUBST([HAVE_MKSTEMPS])
+  HAVE_POSIX_MEMALIGN=1;     AC_SUBST([HAVE_POSIX_MEMALIGN])
   HAVE_POSIX_OPENPT=1;       AC_SUBST([HAVE_POSIX_OPENPT])
   HAVE_PTSNAME=1;            AC_SUBST([HAVE_PTSNAME])
   HAVE_PTSNAME_R=1;          AC_SUBST([HAVE_PTSNAME_R])
@@ -106,19 +154,24 @@
   HAVE_SETSTATE=1;           AC_SUBST([HAVE_SETSTATE])
   HAVE_DECL_SETSTATE=1;      AC_SUBST([HAVE_DECL_SETSTATE])
   HAVE_STRTOD=1;             AC_SUBST([HAVE_STRTOD])
+  HAVE_STRTOL=1;             AC_SUBST([HAVE_STRTOL])
   HAVE_STRTOLD=1;            AC_SUBST([HAVE_STRTOLD])
   HAVE_STRTOLL=1;            AC_SUBST([HAVE_STRTOLL])
+  HAVE_STRTOUL=1;            AC_SUBST([HAVE_STRTOUL])
   HAVE_STRTOULL=1;           AC_SUBST([HAVE_STRTOULL])
   HAVE_STRUCT_RANDOM_DATA=1; AC_SUBST([HAVE_STRUCT_RANDOM_DATA])
   HAVE_SYS_LOADAVG_H=0;      AC_SUBST([HAVE_SYS_LOADAVG_H])
   HAVE_UNLOCKPT=1;           AC_SUBST([HAVE_UNLOCKPT])
   HAVE_DECL_UNSETENV=1;      AC_SUBST([HAVE_DECL_UNSETENV])
+  REPLACE_ALIGNED_ALLOC=0;   AC_SUBST([REPLACE_ALIGNED_ALLOC])
   REPLACE_CALLOC=0;          AC_SUBST([REPLACE_CALLOC])
   REPLACE_CANONICALIZE_FILE_NAME=0;  AC_SUBST([REPLACE_CANONICALIZE_FILE_NAME])
+  REPLACE_FREE=0;            AC_SUBST([REPLACE_FREE])
   REPLACE_INITSTATE=0;       AC_SUBST([REPLACE_INITSTATE])
   REPLACE_MALLOC=0;          AC_SUBST([REPLACE_MALLOC])
   REPLACE_MBTOWC=0;          AC_SUBST([REPLACE_MBTOWC])
   REPLACE_MKSTEMP=0;         AC_SUBST([REPLACE_MKSTEMP])
+  REPLACE_POSIX_MEMALIGN=0;  AC_SUBST([REPLACE_POSIX_MEMALIGN])
   REPLACE_PTSNAME=0;         AC_SUBST([REPLACE_PTSNAME])
   REPLACE_PTSNAME_R=0;       AC_SUBST([REPLACE_PTSNAME_R])
   REPLACE_PUTENV=0;          AC_SUBST([REPLACE_PUTENV])
@@ -126,11 +179,16 @@
   REPLACE_RANDOM=0;          AC_SUBST([REPLACE_RANDOM])
   REPLACE_RANDOM_R=0;        AC_SUBST([REPLACE_RANDOM_R])
   REPLACE_REALLOC=0;         AC_SUBST([REPLACE_REALLOC])
+  REPLACE_REALLOCARRAY=0;    AC_SUBST([REPLACE_REALLOCARRAY])
   REPLACE_REALPATH=0;        AC_SUBST([REPLACE_REALPATH])
   REPLACE_SETENV=0;          AC_SUBST([REPLACE_SETENV])
   REPLACE_SETSTATE=0;        AC_SUBST([REPLACE_SETSTATE])
   REPLACE_STRTOD=0;          AC_SUBST([REPLACE_STRTOD])
+  REPLACE_STRTOL=0;          AC_SUBST([REPLACE_STRTOL])
   REPLACE_STRTOLD=0;         AC_SUBST([REPLACE_STRTOLD])
+  REPLACE_STRTOLL=0;         AC_SUBST([REPLACE_STRTOLL])
+  REPLACE_STRTOUL=0;         AC_SUBST([REPLACE_STRTOUL])
+  REPLACE_STRTOULL=0;        AC_SUBST([REPLACE_STRTOULL])
   REPLACE_UNSETENV=0;        AC_SUBST([REPLACE_UNSETENV])
   REPLACE_WCTOMB=0;          AC_SUBST([REPLACE_WCTOMB])
 ])
diff --git a/m4/stpcpy.m4 b/m4/stpcpy.m4
index 7af2e81..eb44f03 100644
--- a/m4/stpcpy.m4
+++ b/m4/stpcpy.m4
@@ -1,5 +1,5 @@
-# stpcpy.m4 serial 8
-dnl Copyright (C) 2002, 2007, 2009-2019 Free Software Foundation, Inc.
+# stpcpy.m4 serial 9
+dnl Copyright (C) 2002, 2007, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -12,7 +12,7 @@
   dnl The stpcpy() declaration in lib/string.in.h uses 'restrict'.
   AC_REQUIRE([AC_C_RESTRICT])
 
-  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
   AC_CHECK_FUNCS([stpcpy])
   if test $ac_cv_func_stpcpy = no; then
     HAVE_STPCPY=0
diff --git a/m4/stpncpy.m4 b/m4/stpncpy.m4
new file mode 100644
index 0000000..c9f6c02
--- /dev/null
+++ b/m4/stpncpy.m4
@@ -0,0 +1,105 @@
+# stpncpy.m4 serial 19
+dnl Copyright (C) 2002-2003, 2005-2007, 2009-2021 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STPNCPY],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+  dnl Persuade glibc <string.h> to declare stpncpy().
+  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+  dnl The stpncpy() declaration in lib/string.in.h uses 'restrict'.
+  AC_REQUIRE([AC_C_RESTRICT])
+
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
+
+  dnl Both glibc and AIX (4.3.3, 5.1) have an stpncpy() function
+  dnl declared in <string.h>. Its side effects are the same as those
+  dnl of strncpy():
+  dnl      stpncpy (dest, src, n)
+  dnl overwrites dest[0..n-1], min(strlen(src),n) bytes coming from src,
+  dnl and the remaining bytes being NULs.  However, the return value is
+  dnl   in glibc:   dest + min(strlen(src),n)
+  dnl   in AIX:     dest + max(0,n-1)
+  dnl Only the glibc return value is useful in practice.
+
+  AC_CHECK_DECLS_ONCE([stpncpy])
+  AC_CHECK_FUNCS_ONCE([stpncpy])
+  if test $ac_cv_func_stpncpy = yes; then
+    AC_CACHE_CHECK([for working stpncpy], [gl_cv_func_stpncpy], [
+      AC_RUN_IFELSE(
+        [AC_LANG_SOURCE([[
+#include <stdlib.h>
+#include <string.h> /* for strcpy */
+/* The stpncpy prototype is missing in <string.h> on AIX 4.  */
+#if !HAVE_DECL_STPNCPY
+extern
+# ifdef __cplusplus
+"C"
+# endif
+char *stpncpy (char *dest, const char *src, size_t n);
+#endif
+int main ()
+{
+  int result = 0;
+  const char *src = "Hello";
+  char dest[10];
+  /* AIX 4.3.3 and AIX 5.1 stpncpy() returns dest+1 here.  */
+  {
+    strcpy (dest, "\377\377\377\377\377\377");
+    if (stpncpy (dest, src, 2) != dest + 2)
+      result |= 1;
+  }
+  /* AIX 4.3.3 and AIX 5.1 stpncpy() returns dest+4 here.  */
+  {
+    strcpy (dest, "\377\377\377\377\377\377");
+    if (stpncpy (dest, src, 5) != dest + 5)
+      result |= 2;
+  }
+  /* AIX 4.3.3 and AIX 5.1 stpncpy() returns dest+6 here.  */
+  {
+    strcpy (dest, "\377\377\377\377\377\377");
+    if (stpncpy (dest, src, 7) != dest + 5)
+      result |= 4;
+  }
+  return result;
+}
+]])],
+        [gl_cv_func_stpncpy=yes],
+        [gl_cv_func_stpncpy=no],
+        [dnl Guess yes on glibc systems and musl systems.
+         AC_EGREP_CPP([Thanks for using GNU], [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+  Thanks for using GNU
+#endif
+],         [gl_cv_func_stpncpy="guessing yes"],
+           [case "$host_os" in
+              *-musl*) gl_cv_func_stpncpy="guessing yes" ;;
+              *)       gl_cv_func_stpncpy="$gl_cross_guess_normal" ;;
+            esac
+           ])
+        ])
+    ])
+    case "$gl_cv_func_stpncpy" in
+      *yes)
+        AC_DEFINE([HAVE_STPNCPY], [1],
+          [Define if you have the stpncpy() function and it works.])
+        ;;
+      *)
+        REPLACE_STPNCPY=1
+        ;;
+    esac
+  else
+    HAVE_STPNCPY=0
+  fi
+])
+
+# Prerequisites of lib/stpncpy.c.
+AC_DEFUN([gl_PREREQ_STPNCPY], [
+  :
+])
diff --git a/m4/strchrnul.m4 b/m4/strchrnul.m4
index 93cf112..ada3d15 100644
--- a/m4/strchrnul.m4
+++ b/m4/strchrnul.m4
@@ -1,5 +1,5 @@
-# strchrnul.m4 serial 9
-dnl Copyright (C) 2003, 2007, 2009-2019 Free Software Foundation, Inc.
+# strchrnul.m4 serial 10
+dnl Copyright (C) 2003, 2007, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -9,7 +9,7 @@
   dnl Persuade glibc <string.h> to declare strchrnul().
   AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
 
-  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
   AC_CHECK_FUNCS([strchrnul])
   if test $ac_cv_func_strchrnul = no; then
     HAVE_STRCHRNUL=0
diff --git a/m4/strdup.m4 b/m4/strdup.m4
index 82d7420..5b6018f 100644
--- a/m4/strdup.m4
+++ b/m4/strdup.m4
@@ -1,6 +1,6 @@
-# strdup.m4 serial 13
+# strdup.m4 serial 15
 
-dnl Copyright (C) 2002-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2002-2021 Free Software Foundation, Inc.
 
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -8,8 +8,7 @@
 
 AC_DEFUN([gl_FUNC_STRDUP],
 [
-  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
-  AC_CHECK_FUNCS_ONCE([strdup])
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
   AC_CHECK_DECLS_ONCE([strdup])
   if test $ac_cv_have_decl_strdup = no; then
     HAVE_DECL_STRDUP=0
@@ -18,13 +17,10 @@
 
 AC_DEFUN([gl_FUNC_STRDUP_POSIX],
 [
-  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
   AC_REQUIRE([gl_CHECK_MALLOC_POSIX])
-  AC_CHECK_FUNCS_ONCE([strdup])
-  if test $ac_cv_func_strdup = yes; then
-    if test $gl_cv_func_malloc_posix != yes; then
-      REPLACE_STRDUP=1
-    fi
+  if test $gl_cv_func_malloc_posix != yes; then
+    REPLACE_STRDUP=1
   fi
   AC_CHECK_DECLS_ONCE([strdup])
   if test $ac_cv_have_decl_strdup = no; then
diff --git a/m4/strerror.m4 b/m4/strerror.m4
index fbfb4e1..438ba92 100644
--- a/m4/strerror.m4
+++ b/m4/strerror.m4
@@ -1,12 +1,12 @@
-# strerror.m4 serial 21
-dnl Copyright (C) 2002, 2007-2019 Free Software Foundation, Inc.
+# strerror.m4 serial 22
+dnl Copyright (C) 2002, 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 AC_DEFUN([gl_FUNC_STRERROR],
 [
-  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
   AC_REQUIRE([gl_HEADER_ERRNO_H])
   AC_REQUIRE([gl_FUNC_STRERROR_0])
   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
diff --git a/m4/strerror_r.m4 b/m4/strerror_r.m4
index 9907113..bc40ec2 100644
--- a/m4/strerror_r.m4
+++ b/m4/strerror_r.m4
@@ -1,17 +1,14 @@
-# strerror_r.m4 serial 20
-dnl Copyright (C) 2002, 2007-2019 Free Software Foundation, Inc.
+# strerror_r.m4 serial 23
+dnl Copyright (C) 2002, 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 AC_DEFUN([gl_FUNC_STRERROR_R],
 [
-  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
   AC_REQUIRE([gl_FUNC_STRERROR_R_WORKS])
 
-  dnl Persuade Solaris <string.h> to declare strerror_r().
-  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
-
   dnl Some systems don't declare strerror_r() if _THREAD_SAFE and _REENTRANT
   dnl are not defined.
   AC_CHECK_DECLS_ONCE([strerror_r])
@@ -40,6 +37,7 @@
 
 # Prerequisites of lib/strerror_r.c.
 AC_DEFUN([gl_PREREQ_STRERROR_R], [
+  AC_REQUIRE([AC_FUNC_STRERROR_R])
   dnl glibc >= 2.3.4 and cygwin 1.7.9 have a function __xpg_strerror_r.
   AC_CHECK_FUNCS_ONCE([__xpg_strerror_r])
   AC_CHECK_FUNCS_ONCE([catgets])
@@ -52,6 +50,11 @@
 [
   AC_REQUIRE([gl_HEADER_ERRNO_H])
   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+  dnl Persuade Android <string.h> to use the GNU strerror_r API,
+  dnl and Solaris <string.h> to declare strerror_r.
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
   AC_REQUIRE([gl_FUNC_STRERROR_0])
 
   AC_CHECK_FUNCS_ONCE([strerror_r])
diff --git a/m4/string_h.m4 b/m4/string_h.m4
index 0c0e3a7..80d1e58 100644
--- a/m4/string_h.m4
+++ b/m4/string_h.m4
@@ -1,25 +1,19 @@
 # Configure a GNU-like replacement for <string.h>.
 
-# Copyright (C) 2007-2019 Free Software Foundation, Inc.
+# Copyright (C) 2007-2021 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 22
+# serial 32
 
 # Written by Paul Eggert.
 
-AC_DEFUN([gl_HEADER_STRING_H],
+AC_DEFUN_ONCE([gl_STRING_H],
 [
-  dnl Use AC_REQUIRE here, so that the default behavior below is expanded
-  dnl once only, before all statements that occur in other macros.
-  AC_REQUIRE([gl_HEADER_STRING_H_BODY])
-])
-
-AC_DEFUN([gl_HEADER_STRING_H_BODY],
-[
-  AC_REQUIRE([AC_C_RESTRICT])
-  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only, before all statements
+  dnl that occur in other macros.
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
   gl_NEXT_HEADERS([string.h])
 
   dnl Check for declarations of anything we want to poison if the
@@ -29,64 +23,86 @@
     ]],
     [ffsl ffsll memmem mempcpy memrchr rawmemchr stpcpy stpncpy strchrnul
      strdup strncat strndup strnlen strpbrk strsep strcasestr strtok_r
-     strerror_r strsignal strverscmp])
+     strerror_r strerrorname_np sigabbrev_np sigdescr_np strsignal strverscmp])
+
+  AC_REQUIRE([AC_C_RESTRICT])
 ])
 
+# gl_STRING_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_STRING_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_STRING_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
-AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS],
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_STRING_H_REQUIRE_DEFAULTS],
 [
-  GNULIB_EXPLICIT_BZERO=0; AC_SUBST([GNULIB_EXPLICIT_BZERO])
-  GNULIB_FFSL=0;        AC_SUBST([GNULIB_FFSL])
-  GNULIB_FFSLL=0;       AC_SUBST([GNULIB_FFSLL])
-  GNULIB_MEMCHR=0;      AC_SUBST([GNULIB_MEMCHR])
-  GNULIB_MEMMEM=0;      AC_SUBST([GNULIB_MEMMEM])
-  GNULIB_MEMPCPY=0;     AC_SUBST([GNULIB_MEMPCPY])
-  GNULIB_MEMRCHR=0;     AC_SUBST([GNULIB_MEMRCHR])
-  GNULIB_RAWMEMCHR=0;   AC_SUBST([GNULIB_RAWMEMCHR])
-  GNULIB_STPCPY=0;      AC_SUBST([GNULIB_STPCPY])
-  GNULIB_STPNCPY=0;     AC_SUBST([GNULIB_STPNCPY])
-  GNULIB_STRCHRNUL=0;   AC_SUBST([GNULIB_STRCHRNUL])
-  GNULIB_STRDUP=0;      AC_SUBST([GNULIB_STRDUP])
-  GNULIB_STRNCAT=0;     AC_SUBST([GNULIB_STRNCAT])
-  GNULIB_STRNDUP=0;     AC_SUBST([GNULIB_STRNDUP])
-  GNULIB_STRNLEN=0;     AC_SUBST([GNULIB_STRNLEN])
-  GNULIB_STRPBRK=0;     AC_SUBST([GNULIB_STRPBRK])
-  GNULIB_STRSEP=0;      AC_SUBST([GNULIB_STRSEP])
-  GNULIB_STRSTR=0;      AC_SUBST([GNULIB_STRSTR])
-  GNULIB_STRCASESTR=0;  AC_SUBST([GNULIB_STRCASESTR])
-  GNULIB_STRTOK_R=0;    AC_SUBST([GNULIB_STRTOK_R])
-  GNULIB_MBSLEN=0;      AC_SUBST([GNULIB_MBSLEN])
-  GNULIB_MBSNLEN=0;     AC_SUBST([GNULIB_MBSNLEN])
-  GNULIB_MBSCHR=0;      AC_SUBST([GNULIB_MBSCHR])
-  GNULIB_MBSRCHR=0;     AC_SUBST([GNULIB_MBSRCHR])
-  GNULIB_MBSSTR=0;      AC_SUBST([GNULIB_MBSSTR])
-  GNULIB_MBSCASECMP=0;  AC_SUBST([GNULIB_MBSCASECMP])
-  GNULIB_MBSNCASECMP=0; AC_SUBST([GNULIB_MBSNCASECMP])
-  GNULIB_MBSPCASECMP=0; AC_SUBST([GNULIB_MBSPCASECMP])
-  GNULIB_MBSCASESTR=0;  AC_SUBST([GNULIB_MBSCASESTR])
-  GNULIB_MBSCSPN=0;     AC_SUBST([GNULIB_MBSCSPN])
-  GNULIB_MBSPBRK=0;     AC_SUBST([GNULIB_MBSPBRK])
-  GNULIB_MBSSPN=0;      AC_SUBST([GNULIB_MBSSPN])
-  GNULIB_MBSSEP=0;      AC_SUBST([GNULIB_MBSSEP])
-  GNULIB_MBSTOK_R=0;    AC_SUBST([GNULIB_MBSTOK_R])
-  GNULIB_STRERROR=0;    AC_SUBST([GNULIB_STRERROR])
-  GNULIB_STRERROR_R=0;  AC_SUBST([GNULIB_STRERROR_R])
-  GNULIB_STRSIGNAL=0;   AC_SUBST([GNULIB_STRSIGNAL])
-  GNULIB_STRVERSCMP=0;  AC_SUBST([GNULIB_STRVERSCMP])
-  HAVE_MBSLEN=0;        AC_SUBST([HAVE_MBSLEN])
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_STRING_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPLICIT_BZERO])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FFSL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FFSLL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MEMCHR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MEMMEM])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MEMPCPY])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MEMRCHR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RAWMEMCHR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STPCPY])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STPNCPY])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRCHRNUL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRDUP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRNCAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRNDUP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRNLEN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRPBRK])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRSEP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRSTR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRCASESTR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOK_R])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSLEN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSNLEN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSCHR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSRCHR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSSTR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSCASECMP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSNCASECMP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSPCASECMP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSCASESTR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSCSPN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSPBRK])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSSPN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSSEP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSTOK_R])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRERROR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRERROR_R])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRERRORNAME_NP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SIGABBREV_NP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SIGDESCR_NP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRSIGNAL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRVERSCMP])
+    dnl Support Microsoft deprecated alias function names by default.
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_MEMCCPY], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_STRDUP], [1])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_STRING_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_STRING_H_DEFAULTS],
+[
+  HAVE_MBSLEN=0;             AC_SUBST([HAVE_MBSLEN])
   dnl Assume proper GNU behavior unless another module says otherwise.
   HAVE_EXPLICIT_BZERO=1;        AC_SUBST([HAVE_EXPLICIT_BZERO])
   HAVE_FFSL=1;                  AC_SUBST([HAVE_FFSL])
   HAVE_FFSLL=1;                 AC_SUBST([HAVE_FFSLL])
-  HAVE_MEMCHR=1;                AC_SUBST([HAVE_MEMCHR])
   HAVE_DECL_MEMMEM=1;           AC_SUBST([HAVE_DECL_MEMMEM])
   HAVE_MEMPCPY=1;               AC_SUBST([HAVE_MEMPCPY])
   HAVE_DECL_MEMRCHR=1;          AC_SUBST([HAVE_DECL_MEMRCHR])
@@ -102,8 +118,12 @@
   HAVE_STRCASESTR=1;            AC_SUBST([HAVE_STRCASESTR])
   HAVE_DECL_STRTOK_R=1;         AC_SUBST([HAVE_DECL_STRTOK_R])
   HAVE_DECL_STRERROR_R=1;       AC_SUBST([HAVE_DECL_STRERROR_R])
+  HAVE_STRERRORNAME_NP=1;       AC_SUBST([HAVE_STRERRORNAME_NP])
+  HAVE_SIGABBREV_NP=1;          AC_SUBST([HAVE_SIGABBREV_NP])
+  HAVE_SIGDESCR_NP=1;           AC_SUBST([HAVE_SIGDESCR_NP])
   HAVE_DECL_STRSIGNAL=1;        AC_SUBST([HAVE_DECL_STRSIGNAL])
   HAVE_STRVERSCMP=1;            AC_SUBST([HAVE_STRVERSCMP])
+  REPLACE_FFSLL=0;              AC_SUBST([REPLACE_FFSLL])
   REPLACE_MEMCHR=0;             AC_SUBST([REPLACE_MEMCHR])
   REPLACE_MEMMEM=0;             AC_SUBST([REPLACE_MEMMEM])
   REPLACE_STPNCPY=0;            AC_SUBST([REPLACE_STPNCPY])
@@ -117,6 +137,7 @@
   REPLACE_STRTOK_R=0;           AC_SUBST([REPLACE_STRTOK_R])
   REPLACE_STRERROR=0;           AC_SUBST([REPLACE_STRERROR])
   REPLACE_STRERROR_R=0;         AC_SUBST([REPLACE_STRERROR_R])
+  REPLACE_STRERRORNAME_NP=0;    AC_SUBST([REPLACE_STRERRORNAME_NP])
   REPLACE_STRSIGNAL=0;          AC_SUBST([REPLACE_STRSIGNAL])
   UNDEFINE_STRTOK_R=0;          AC_SUBST([UNDEFINE_STRTOK_R])
 ])
diff --git a/m4/strings_h.m4 b/m4/strings_h.m4
new file mode 100644
index 0000000..69de32a
--- /dev/null
+++ b/m4/strings_h.m4
@@ -0,0 +1,62 @@
+# Configure a replacement for <strings.h>.
+# serial 9
+
+# Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_STRINGS_H],
+[
+  dnl Ensure to expand the default settings once only, before all statements
+  dnl that occur in other macros.
+  AC_REQUIRE([gl_STRINGS_H_DEFAULTS])
+
+  gl_CHECK_NEXT_HEADERS([strings.h])
+  if test $ac_cv_header_strings_h = yes; then
+    HAVE_STRINGS_H=1
+  else
+    HAVE_STRINGS_H=0
+  fi
+  AC_SUBST([HAVE_STRINGS_H])
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use.
+  gl_WARN_ON_USE_PREPARE([[
+    /* Minix 3.1.8 has a bug: <sys/types.h> must be included before
+       <strings.h>.  */
+    #include <sys/types.h>
+    #include <strings.h>
+    ]], [ffs strcasecmp strncasecmp])
+])
+
+# gl_STRINGS_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
+AC_DEFUN([gl_STRINGS_MODULE_INDICATOR],
+[
+  dnl Ensure to expand the default settings once only.
+  gl_STRINGS_H_REQUIRE_DEFAULTS
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+])
+
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_STRINGS_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_STRINGS_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FFS])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_STRINGS_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_STRINGS_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_STRINGS_H_DEFAULTS],
+[
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  HAVE_FFS=1;              AC_SUBST([HAVE_FFS])
+  HAVE_STRCASECMP=1;       AC_SUBST([HAVE_STRCASECMP])
+  HAVE_DECL_STRNCASECMP=1; AC_SUBST([HAVE_DECL_STRNCASECMP])
+])
diff --git a/m4/strndup.m4 b/m4/strndup.m4
index 325af5d..4c9ff6e 100644
--- a/m4/strndup.m4
+++ b/m4/strndup.m4
@@ -1,5 +1,5 @@
-# strndup.m4 serial 22
-dnl Copyright (C) 2002-2003, 2005-2019 Free Software Foundation, Inc.
+# strndup.m4 serial 23
+dnl Copyright (C) 2002-2003, 2005-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -10,7 +10,7 @@
   AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
 
   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
-  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
   AC_CHECK_DECLS_ONCE([strndup])
   AC_CHECK_FUNCS_ONCE([strndup])
   if test $ac_cv_have_decl_strndup = no; then
diff --git a/m4/strnlen.m4 b/m4/strnlen.m4
index c283c3e..1d4f106 100644
--- a/m4/strnlen.m4
+++ b/m4/strnlen.m4
@@ -1,5 +1,5 @@
-# strnlen.m4 serial 13
-dnl Copyright (C) 2002-2003, 2005-2007, 2009-2019 Free Software Foundation,
+# strnlen.m4 serial 14
+dnl Copyright (C) 2002-2003, 2005-2007, 2009-2021 Free Software Foundation,
 dnl Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -7,7 +7,7 @@
 
 AC_DEFUN([gl_FUNC_STRNLEN],
 [
-  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
 
   dnl Persuade glibc <string.h> to declare strnlen().
   AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
diff --git a/m4/strtod.m4 b/m4/strtod.m4
new file mode 100644
index 0000000..6edad33
--- /dev/null
+++ b/m4/strtod.m4
@@ -0,0 +1,144 @@
+# strtod.m4 serial 26
+dnl Copyright (C) 2002-2003, 2006-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRTOD],
+[
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  m4_ifdef([gl_FUNC_STRTOD_OBSOLETE], [
+    dnl Test whether strtod is declared.
+    dnl Don't call AC_FUNC_STRTOD, because it does not have the right guess
+    dnl when cross-compiling.
+    dnl Don't call AC_CHECK_FUNCS([strtod]) because it would collide with the
+    dnl ac_cv_func_strtod variable set by the AC_FUNC_STRTOD macro.
+    AC_CHECK_DECLS_ONCE([strtod])
+    if test $ac_cv_have_decl_strtod != yes; then
+      HAVE_STRTOD=0
+    fi
+  ])
+  if test $HAVE_STRTOD = 1; then
+    AC_CACHE_CHECK([whether strtod obeys C99], [gl_cv_func_strtod_works],
+      [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <stdlib.h>
+#include <math.h>
+#include <errno.h>
+/* Compare two numbers with ==.
+   This is a separate function because IRIX 6.5 "cc -O" miscompiles an
+   'x == x' test.  */
+static int
+numeric_equal (double x, double y)
+{
+  return x == y;
+}
+]], [[
+  int result = 0;
+  {
+    /* In some old versions of Linux (2000 or before), strtod mis-parses
+       strings with leading '+'.  */
+    const char *string = " +69";
+    char *term;
+    double value = strtod (string, &term);
+    if (value != 69 || term != (string + 4))
+      result |= 1;
+  }
+  {
+    /* Under Solaris 2.4, strtod returns the wrong value for the
+       terminating character under some conditions.  */
+    const char *string = "NaN";
+    char *term;
+    strtod (string, &term);
+    if (term != string && *(term - 1) == 0)
+      result |= 2;
+  }
+  {
+    /* Older glibc and Cygwin mis-parse "-0x".  */
+    const char *string = "-0x";
+    char *term;
+    double value = strtod (string, &term);
+    double zero = 0.0;
+    if (1.0 / value != -1.0 / zero || term != (string + 2))
+      result |= 4;
+  }
+  {
+    /* Many platforms do not parse hex floats.  */
+    const char *string = "0XaP+1";
+    char *term;
+    double value = strtod (string, &term);
+    if (value != 20.0 || term != (string + 6))
+      result |= 8;
+  }
+  {
+    /* Many platforms do not parse infinities.  HP-UX 11.31 parses inf,
+       but mistakenly sets errno.  */
+    const char *string = "inf";
+    char *term;
+    double value;
+    errno = 0;
+    value = strtod (string, &term);
+    if (value != HUGE_VAL || term != (string + 3) || errno)
+      result |= 16;
+  }
+  {
+    /* glibc 2.7 and cygwin 1.5.24 misparse "nan()".  */
+    const char *string = "nan()";
+    char *term;
+    double value = strtod (string, &term);
+    if (numeric_equal (value, value) || term != (string + 5))
+      result |= 32;
+  }
+  {
+    /* darwin 10.6.1 misparses "nan(".  */
+    const char *string = "nan(";
+    char *term;
+    double value = strtod (string, &term);
+    if (numeric_equal (value, value) || term != (string + 3))
+      result |= 64;
+  }
+  return result;
+]])],
+        [gl_cv_func_strtod_works=yes],
+        [gl_cv_func_strtod_works=no],
+        [dnl The last known bugs in glibc strtod(), as of this writing,
+         dnl were fixed in version 2.8
+         AC_EGREP_CPP([Lucky user],
+           [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8) || (__GLIBC__ > 2)) \
+     && !defined __UCLIBC__
+  Lucky user
+ #endif
+#endif
+           ],
+           [gl_cv_func_strtod_works="guessing yes"],
+           [case "$host_os" in
+                       # Guess yes on musl systems.
+              *-musl*) gl_cv_func_strtod_works="guessing yes" ;;
+                       # Guess yes on native Windows.
+              mingw*)  gl_cv_func_strtod_works="guessing yes" ;;
+              *)       gl_cv_func_strtod_works="$gl_cross_guess_normal" ;;
+            esac
+           ])
+        ])
+      ])
+    case "$gl_cv_func_strtod_works" in
+      *yes) ;;
+      *)
+        REPLACE_STRTOD=1
+        ;;
+    esac
+  fi
+])
+
+# Prerequisites of lib/strtod.c.
+AC_DEFUN([gl_PREREQ_STRTOD], [
+  AC_REQUIRE([gl_CHECK_LDEXP_NO_LIBM])
+  if test $gl_cv_func_ldexp_no_libm = yes; then
+    AC_DEFINE([HAVE_LDEXP_IN_LIBC], [1],
+      [Define if the ldexp function is available in libc.])
+  fi
+  AC_CHECK_FUNCS([nl_langinfo])
+])
diff --git a/m4/strverscmp.m4 b/m4/strverscmp.m4
index ec66cdf..8644527 100644
--- a/m4/strverscmp.m4
+++ b/m4/strverscmp.m4
@@ -1,5 +1,5 @@
-# strverscmp.m4 serial 8
-dnl Copyright (C) 2002, 2005-2019 Free Software Foundation, Inc.
+# strverscmp.m4 serial 9
+dnl Copyright (C) 2002, 2005-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -9,7 +9,7 @@
   dnl Persuade glibc <string.h> to declare strverscmp().
   AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
 
-  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  AC_REQUIRE([gl_STRING_H_DEFAULTS])
   AC_CHECK_FUNCS([strverscmp])
   if test $ac_cv_func_strverscmp = no; then
     HAVE_STRVERSCMP=0
diff --git a/m4/sys_ioctl_h.m4 b/m4/sys_ioctl_h.m4
new file mode 100644
index 0000000..cd00410
--- /dev/null
+++ b/m4/sys_ioctl_h.m4
@@ -0,0 +1,79 @@
+# sys_ioctl_h.m4 serial 15
+dnl Copyright (C) 2008-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Bruno Haible.
+
+AC_DEFUN_ONCE([gl_SYS_IOCTL_H],
+[
+  dnl Ensure to expand the default settings once only, before all statements
+  dnl that occur in other macros.
+  AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS])
+
+  AC_CHECK_HEADERS_ONCE([sys/ioctl.h])
+  if test $ac_cv_header_sys_ioctl_h = yes; then
+    HAVE_SYS_IOCTL_H=1
+    dnl Test whether <sys/ioctl.h> declares ioctl(), or whether some other
+    dnl header file, such as <unistd.h> or <stropts.h>, is needed for that.
+    AC_CACHE_CHECK([whether <sys/ioctl.h> declares ioctl],
+      [gl_cv_decl_ioctl_in_sys_ioctl_h],
+      [dnl We cannot use AC_CHECK_DECL because it produces its own messages.
+       AC_COMPILE_IFELSE(
+         [AC_LANG_PROGRAM(
+            [[#include <sys/ioctl.h>]],
+            [[(void) ioctl;]])],
+         [gl_cv_decl_ioctl_in_sys_ioctl_h=yes],
+         [gl_cv_decl_ioctl_in_sys_ioctl_h=no])
+      ])
+  else
+    HAVE_SYS_IOCTL_H=0
+  fi
+  AC_SUBST([HAVE_SYS_IOCTL_H])
+  dnl <sys/ioctl.h> is always overridden, because of GNULIB_POSIXCHECK.
+  gl_CHECK_NEXT_HEADERS([sys/ioctl.h])
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use.
+  gl_WARN_ON_USE_PREPARE([[#include <sys/ioctl.h>
+/* Some platforms declare ioctl in the wrong header.  */
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <unistd.h>
+#endif
+    ]], [ioctl])
+])
+
+# gl_SYS_IOCTL_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
+AC_DEFUN([gl_SYS_IOCTL_MODULE_INDICATOR],
+[
+  dnl Ensure to expand the default settings once only.
+  gl_SYS_IOCTL_H_REQUIRE_DEFAULTS
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+  dnl Define it also as a C macro, for the benefit of the unit tests.
+  gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_SYS_IOCTL_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_SYS_IOCTL_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_IOCTL])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_SYS_IOCTL_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_SYS_IOCTL_H_DEFAULTS],
+[
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  SYS_IOCTL_H_HAVE_WINSOCK2_H=0; AC_SUBST([SYS_IOCTL_H_HAVE_WINSOCK2_H])
+  SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
+                        AC_SUBST([SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS])
+  REPLACE_IOCTL=0;      AC_SUBST([REPLACE_IOCTL])
+])
diff --git a/m4/sys_resource_h.m4 b/m4/sys_resource_h.m4
index d6225d5..0b85e7b 100644
--- a/m4/sys_resource_h.m4
+++ b/m4/sys_resource_h.m4
@@ -1,10 +1,10 @@
-# sys_resource_h.m4 serial 2
-dnl Copyright (C) 2012-2019 Free Software Foundation, Inc.
+# sys_resource_h.m4 serial 5
+dnl Copyright (C) 2012-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
-AC_DEFUN([gl_HEADER_SYS_RESOURCE],
+AC_DEFUN_ONCE([gl_SYS_RESOURCE_H],
 [
   AC_REQUIRE([gl_SYS_RESOURCE_H_DEFAULTS])
   dnl <sys/resource.h> is always overridden, because of GNULIB_POSIXCHECK.
@@ -30,18 +30,33 @@
     [getrusage])
 ])
 
+# gl_SYS_RESOURCE_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_SYS_RESOURCE_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_SYS_RESOURCE_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_SYS_RESOURCE_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_SYS_RESOURCE_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_SYS_RESOURCE_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETRUSAGE])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_SYS_RESOURCE_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_SYS_RESOURCE_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_SYS_RESOURCE_H_DEFAULTS],
 [
-  GNULIB_GETRUSAGE=0;     AC_SUBST([GNULIB_GETRUSAGE])
   dnl Assume proper GNU behavior unless another module says otherwise.
   HAVE_GETRUSAGE=1;       AC_SUBST([HAVE_GETRUSAGE])
 ])
diff --git a/m4/sys_socket_h.m4 b/m4/sys_socket_h.m4
index d0a9020..5676a0d 100644
--- a/m4/sys_socket_h.m4
+++ b/m4/sys_socket_h.m4
@@ -1,12 +1,12 @@
-# sys_socket_h.m4 serial 24
-dnl Copyright (C) 2005-2019 Free Software Foundation, Inc.
+# sys_socket_h.m4 serial 28
+dnl Copyright (C) 2005-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl From Simon Josefsson.
 
-AC_DEFUN([gl_HEADER_SYS_SOCKET],
+AC_DEFUN_ONCE([gl_SYS_SOCKET_H],
 [
   AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS])
   AC_REQUIRE([AC_CANONICAL_HOST])
@@ -95,6 +95,8 @@
 #include <sys/socket.h>
     ]], [socket connect accept bind getpeername getsockname getsockopt
     listen recv send recvfrom sendto setsockopt shutdown accept4])
+
+  AC_REQUIRE([AC_C_RESTRICT])
 ])
 
 AC_DEFUN([gl_PREREQ_SYS_H_SOCKET],
@@ -154,32 +156,47 @@
   AC_SUBST([HAVE_WS2TCPIP_H])
 ])
 
+# gl_SYS_SOCKET_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_SYS_SOCKET_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_SYS_SOCKET_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_SYS_SOCKET_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_SYS_SOCKET_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SOCKET])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CONNECT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ACCEPT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_BIND])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETPEERNAME])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETSOCKNAME])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETSOCKOPT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LISTEN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RECV])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SEND])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RECVFROM])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SENDTO])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SETSOCKOPT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SHUTDOWN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ACCEPT4])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_SYS_SOCKET_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_SYS_SOCKET_H_DEFAULTS],
 [
-  GNULIB_SOCKET=0;      AC_SUBST([GNULIB_SOCKET])
-  GNULIB_CONNECT=0;     AC_SUBST([GNULIB_CONNECT])
-  GNULIB_ACCEPT=0;      AC_SUBST([GNULIB_ACCEPT])
-  GNULIB_BIND=0;        AC_SUBST([GNULIB_BIND])
-  GNULIB_GETPEERNAME=0; AC_SUBST([GNULIB_GETPEERNAME])
-  GNULIB_GETSOCKNAME=0; AC_SUBST([GNULIB_GETSOCKNAME])
-  GNULIB_GETSOCKOPT=0;  AC_SUBST([GNULIB_GETSOCKOPT])
-  GNULIB_LISTEN=0;      AC_SUBST([GNULIB_LISTEN])
-  GNULIB_RECV=0;        AC_SUBST([GNULIB_RECV])
-  GNULIB_SEND=0;        AC_SUBST([GNULIB_SEND])
-  GNULIB_RECVFROM=0;    AC_SUBST([GNULIB_RECVFROM])
-  GNULIB_SENDTO=0;      AC_SUBST([GNULIB_SENDTO])
-  GNULIB_SETSOCKOPT=0;  AC_SUBST([GNULIB_SETSOCKOPT])
-  GNULIB_SHUTDOWN=0;    AC_SUBST([GNULIB_SHUTDOWN])
-  GNULIB_ACCEPT4=0;     AC_SUBST([GNULIB_ACCEPT4])
   HAVE_STRUCT_SOCKADDR_STORAGE=1; AC_SUBST([HAVE_STRUCT_SOCKADDR_STORAGE])
   HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=1;
                         AC_SUBST([HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY])
diff --git a/m4/sys_stat_h.m4 b/m4/sys_stat_h.m4
index 361ac3f..ac91d42 100644
--- a/m4/sys_stat_h.m4
+++ b/m4/sys_stat_h.m4
@@ -1,5 +1,5 @@
-# sys_stat_h.m4 serial 31   -*- Autoconf -*-
-dnl Copyright (C) 2006-2019 Free Software Foundation, Inc.
+# sys_stat_h.m4 serial 41   -*- Autoconf -*-
+dnl Copyright (C) 2006-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -7,7 +7,7 @@
 dnl From Eric Blake.
 dnl Provide a GNU-like <sys/stat.h>.
 
-AC_DEFUN([gl_HEADER_SYS_STAT_H],
+AC_DEFUN_ONCE([gl_SYS_STAT_H],
 [
   AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
 
@@ -46,40 +46,64 @@
   dnl Check for declarations of anything we want to poison if the
   dnl corresponding gnulib module is not in use.
   gl_WARN_ON_USE_PREPARE([[#include <sys/stat.h>
-    ]], [fchmodat fstat fstatat futimens lchmod lstat mkdirat mkfifo mkfifoat
-    mknod mknodat stat utimensat])
-]) # gl_HEADER_SYS_STAT_H
+    ]], [fchmodat fstat fstatat futimens getumask lchmod lstat
+    mkdirat mkfifo mkfifoat mknod mknodat stat utimensat])
 
+  AC_REQUIRE([AC_C_RESTRICT])
+])
+
+# gl_SYS_STAT_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_SYS_STAT_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_SYS_STAT_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_SYS_STAT_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_SYS_STAT_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_UNISTD_H_REQUIRE_DEFAULTS dnl for REPLACE_FCHDIR
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FCHMODAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSTAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSTATAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FUTIMENS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETUMASK])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LCHMOD])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LSTAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKDIR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKDIRAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKFIFO])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKFIFOAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKNOD])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKNODAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UTIMENSAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_OVERRIDES_STRUCT_STAT])
+    dnl Support Microsoft deprecated alias function names by default.
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_CHMOD], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_MKDIR], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_UMASK], [1])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_SYS_STAT_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_SYS_STAT_H_DEFAULTS],
 [
-  AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl for REPLACE_FCHDIR
-  GNULIB_FCHMODAT=0;    AC_SUBST([GNULIB_FCHMODAT])
-  GNULIB_FSTAT=0;       AC_SUBST([GNULIB_FSTAT])
-  GNULIB_FSTATAT=0;     AC_SUBST([GNULIB_FSTATAT])
-  GNULIB_FUTIMENS=0;    AC_SUBST([GNULIB_FUTIMENS])
-  GNULIB_LCHMOD=0;      AC_SUBST([GNULIB_LCHMOD])
-  GNULIB_LSTAT=0;       AC_SUBST([GNULIB_LSTAT])
-  GNULIB_MKDIRAT=0;     AC_SUBST([GNULIB_MKDIRAT])
-  GNULIB_MKFIFO=0;      AC_SUBST([GNULIB_MKFIFO])
-  GNULIB_MKFIFOAT=0;    AC_SUBST([GNULIB_MKFIFOAT])
-  GNULIB_MKNOD=0;       AC_SUBST([GNULIB_MKNOD])
-  GNULIB_MKNODAT=0;     AC_SUBST([GNULIB_MKNODAT])
-  GNULIB_STAT=0;        AC_SUBST([GNULIB_STAT])
-  GNULIB_UTIMENSAT=0;   AC_SUBST([GNULIB_UTIMENSAT])
-  GNULIB_OVERRIDES_STRUCT_STAT=0; AC_SUBST([GNULIB_OVERRIDES_STRUCT_STAT])
   dnl Assume proper GNU behavior unless another module says otherwise.
   HAVE_FCHMODAT=1;      AC_SUBST([HAVE_FCHMODAT])
   HAVE_FSTATAT=1;       AC_SUBST([HAVE_FSTATAT])
   HAVE_FUTIMENS=1;      AC_SUBST([HAVE_FUTIMENS])
+  HAVE_GETUMASK=1;      AC_SUBST([HAVE_GETUMASK])
   HAVE_LCHMOD=1;        AC_SUBST([HAVE_LCHMOD])
   HAVE_LSTAT=1;         AC_SUBST([HAVE_LSTAT])
   HAVE_MKDIRAT=1;       AC_SUBST([HAVE_MKDIRAT])
@@ -88,13 +112,16 @@
   HAVE_MKNOD=1;         AC_SUBST([HAVE_MKNOD])
   HAVE_MKNODAT=1;       AC_SUBST([HAVE_MKNODAT])
   HAVE_UTIMENSAT=1;     AC_SUBST([HAVE_UTIMENSAT])
+  REPLACE_FCHMODAT=0;   AC_SUBST([REPLACE_FCHMODAT])
   REPLACE_FSTAT=0;      AC_SUBST([REPLACE_FSTAT])
   REPLACE_FSTATAT=0;    AC_SUBST([REPLACE_FSTATAT])
   REPLACE_FUTIMENS=0;   AC_SUBST([REPLACE_FUTIMENS])
   REPLACE_LSTAT=0;      AC_SUBST([REPLACE_LSTAT])
   REPLACE_MKDIR=0;      AC_SUBST([REPLACE_MKDIR])
   REPLACE_MKFIFO=0;     AC_SUBST([REPLACE_MKFIFO])
+  REPLACE_MKFIFOAT=0;   AC_SUBST([REPLACE_MKFIFOAT])
   REPLACE_MKNOD=0;      AC_SUBST([REPLACE_MKNOD])
+  REPLACE_MKNODAT=0;    AC_SUBST([REPLACE_MKNODAT])
   REPLACE_STAT=0;       AC_SUBST([REPLACE_STAT])
   REPLACE_UTIMENSAT=0;  AC_SUBST([REPLACE_UTIMENSAT])
 ])
diff --git a/m4/sys_time_h.m4 b/m4/sys_time_h.m4
index 3d9233a..c425a96 100644
--- a/m4/sys_time_h.m4
+++ b/m4/sys_time_h.m4
@@ -1,25 +1,20 @@
 # Configure a replacement for <sys/time.h>.
-# serial 9
+# serial 12
 
-# Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+# Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 # Written by Paul Eggert and Martin Lambers.
 
-AC_DEFUN([gl_HEADER_SYS_TIME_H],
+AC_DEFUN_ONCE([gl_SYS_TIME_H],
 [
   dnl Use AC_REQUIRE here, so that the REPLACE_GETTIMEOFDAY=0 statement
   dnl below is expanded once only, before all REPLACE_GETTIMEOFDAY=1
   dnl statements that occur in other macros.
-  AC_REQUIRE([gl_HEADER_SYS_TIME_H_BODY])
-])
-
-AC_DEFUN([gl_HEADER_SYS_TIME_H_BODY],
-[
+  AC_REQUIRE([gl_SYS_TIME_H_DEFAULTS])
   AC_REQUIRE([AC_C_RESTRICT])
-  AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS])
   AC_CHECK_HEADERS_ONCE([sys/time.h])
   gl_CHECK_NEXT_HEADERS([sys/time.h])
 
@@ -89,18 +84,33 @@
     ]], [gettimeofday])
 ])
 
+# gl_SYS_TIME_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_SYS_TIME_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_SYS_TIME_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
-AC_DEFUN([gl_HEADER_SYS_TIME_H_DEFAULTS],
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_SYS_TIME_H_REQUIRE_DEFAULTS],
 [
-  GNULIB_GETTIMEOFDAY=0;     AC_SUBST([GNULIB_GETTIMEOFDAY])
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_SYS_TIME_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETTIMEOFDAY])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_SYS_TIME_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_SYS_TIME_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_SYS_TIME_H_DEFAULTS],
+[
   dnl Assume POSIX behavior unless another module says otherwise.
   HAVE_GETTIMEOFDAY=1;       AC_SUBST([HAVE_GETTIMEOFDAY])
   HAVE_STRUCT_TIMEVAL=1;     AC_SUBST([HAVE_STRUCT_TIMEVAL])
diff --git a/m4/sys_times_h.m4 b/m4/sys_times_h.m4
index 86481be..577ead6 100644
--- a/m4/sys_times_h.m4
+++ b/m4/sys_times_h.m4
@@ -1,14 +1,14 @@
 # Configure a replacement for <sys/times.h>.
-# serial 8
+# serial 11
 
-# Copyright (C) 2008-2019 Free Software Foundation, Inc.
+# Copyright (C) 2008-2021 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 # Written by Simon Josefsson.
 
-AC_DEFUN([gl_SYS_TIMES_H],
+AC_DEFUN_ONCE([gl_SYS_TIMES_H],
 [
   AC_REQUIRE([gl_SYS_TIMES_H_DEFAULTS])
 
@@ -36,16 +36,31 @@
     ]], [times])
 ])
 
+# gl_SYS_TIMES_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_SYS_TIMES_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_SYS_TIMES_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_SYS_TIMES_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_SYS_TIMES_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_SYS_TIMES_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIMES])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_SYS_TIMES_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_SYS_TIMES_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_SYS_TIMES_H_DEFAULTS],
 [
-  GNULIB_TIMES=0;     AC_SUBST([GNULIB_TIMES])
   HAVE_STRUCT_TMS=1;  AC_SUBST([HAVE_STRUCT_TMS])
   HAVE_TIMES=1;       AC_SUBST([HAVE_TIMES])
 ])
diff --git a/m4/sys_types_h.m4 b/m4/sys_types_h.m4
index be06559..6dd6fee 100644
--- a/m4/sys_types_h.m4
+++ b/m4/sys_types_h.m4
@@ -1,15 +1,16 @@
-# sys_types_h.m4 serial 9
-dnl Copyright (C) 2011-2019 Free Software Foundation, Inc.
+# sys_types_h.m4 serial 13
+dnl Copyright (C) 2011-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 AC_DEFUN_ONCE([gl_SYS_TYPES_H],
 [
+  AC_REQUIRE([gl_SYS_TYPES_H_DEFAULTS])
+
   dnl Use sane struct stat types in OpenVMS 8.2 and later.
   AC_DEFINE([_USE_STD_STAT], 1, [For standard stat data types on VMS.])
 
-  AC_REQUIRE([gl_SYS_TYPES_H_DEFAULTS])
   gl_NEXT_HEADERS([sys/types.h])
 
   dnl Ensure the type pid_t gets defined.
@@ -30,31 +31,40 @@
   AC_SUBST([WINDOWS_STAT_INODES])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_SYS_TYPES_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_SYS_TYPE_H_MODULE_INDICATOR_DEFAULTS], [
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_SYS_TYPE_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_SYS_TYPES_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_SYS_TYPES_H_DEFAULTS],
 [
 ])
 
 # This works around a buggy version in autoconf <= 2.69.
 # See <https://lists.gnu.org/r/autoconf/2016-08/msg00014.html>
+# The 2.70 version isn't quoted properly, so override it too.
 
-m4_version_prereq([2.70], [], [
-
-# This is taken from the following Autoconf patch:
-# https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=e17a30e987d7ee695fb4294a82d987ec3dc9b974
+m4_version_prereq([2.70.1], [], [
 
 m4_undefine([AC_HEADER_MAJOR])
 AC_DEFUN([AC_HEADER_MAJOR],
 [AC_CHECK_HEADERS_ONCE([sys/types.h])
 AC_CHECK_HEADER([sys/mkdev.h],
-  [AC_DEFINE([MAJOR_IN_MKDEV], [1],
-    [Define to 1 if `major', `minor', and `makedev' are declared in
-     <mkdev.h>.])])
+                [AC_DEFINE([MAJOR_IN_MKDEV], [1],
+                           [Define to 1 if `major', `minor', and `makedev' are
+                            declared in <mkdev.h>.])])
 if test $ac_cv_header_sys_mkdev_h = no; then
   AC_CHECK_HEADER([sys/sysmacros.h],
-    [AC_DEFINE([MAJOR_IN_SYSMACROS], [1],
-      [Define to 1 if `major', `minor', and `makedev' are declared in
-       <sysmacros.h>.])])
+                  [AC_DEFINE([MAJOR_IN_SYSMACROS], [1],
+                             [Define to 1 if `major', `minor', and `makedev'
+                              are declared in <sysmacros.h>.])])
 fi
-])
+])# AC_HEADER_MAJOR
 
 ])
diff --git a/m4/sys_wait_h.m4 b/m4/sys_wait_h.m4
index 6532959..d7c412a 100644
--- a/m4/sys_wait_h.m4
+++ b/m4/sys_wait_h.m4
@@ -1,10 +1,10 @@
-# sys_wait_h.m4 serial 6
-dnl Copyright (C) 2008-2019 Free Software Foundation, Inc.
+# sys_wait_h.m4 serial 9
+dnl Copyright (C) 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
-AC_DEFUN([gl_SYS_WAIT_H],
+AC_DEFUN_ONCE([gl_SYS_WAIT_H],
 [
   AC_REQUIRE([gl_SYS_WAIT_H_DEFAULTS])
 
@@ -20,17 +20,32 @@
     [waitpid])
 ])
 
+# gl_SYS_WAIT_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_SYS_WAIT_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_SYS_WAIT_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_SYS_WAIT_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_SYS_WAIT_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_SYS_WAIT_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WAITPID])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_SYS_WAIT_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_SYS_WAIT_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_SYS_WAIT_H_DEFAULTS],
 [
-  GNULIB_WAITPID=0; AC_SUBST([GNULIB_WAITPID])
   dnl Assume proper GNU behavior unless another module says otherwise.
 ])
diff --git a/m4/termios_h.m4 b/m4/termios_h.m4
new file mode 100644
index 0000000..861b232
--- /dev/null
+++ b/m4/termios_h.m4
@@ -0,0 +1,58 @@
+# termios_h.m4 serial 7
+dnl Copyright (C) 2010-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_TERMIOS_H],
+[
+  dnl Ensure to expand the default settings once only, before all statements
+  dnl that occur in other macros.
+  AC_REQUIRE([gl_TERMIOS_H_DEFAULTS])
+
+  gl_CHECK_NEXT_HEADERS([termios.h])
+  if test $ac_cv_header_termios_h != yes; then
+    HAVE_TERMIOS_H=0
+  fi
+
+  dnl Ensure the type pid_t gets defined.
+  AC_REQUIRE([AC_TYPE_PID_T])
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use, and which is not
+  dnl guaranteed by C89.
+  gl_WARN_ON_USE_PREPARE([[#include <termios.h>]],
+    [tcgetsid])
+])
+
+# gl_TERMIOS_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
+AC_DEFUN([gl_TERMIOS_MODULE_INDICATOR],
+[
+  dnl Ensure to expand the default settings once only.
+  gl_TERMIOS_H_REQUIRE_DEFAULTS
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+  dnl Define it also as a C macro, for the benefit of the unit tests.
+  gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_TERMIOS_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_TERMIOS_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TCGETSID])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_TERMIOS_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_TERMIOS_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_TERMIOS_H_DEFAULTS],
+[
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  HAVE_DECL_TCGETSID=1;   AC_SUBST([HAVE_DECL_TCGETSID])
+  HAVE_TERMIOS_H=1;       AC_SUBST([HAVE_TERMIOS_H])
+])
diff --git a/m4/threadlib.m4 b/m4/threadlib.m4
index d22e0d6..6b43bbd 100644
--- a/m4/threadlib.m4
+++ b/m4/threadlib.m4
@@ -1,5 +1,5 @@
-# threadlib.m4 serial 22
-dnl Copyright (C) 2005-2019 Free Software Foundation, Inc.
+# threadlib.m4 serial 32
+dnl Copyright (C) 2005-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -8,6 +8,164 @@
 
 AC_PREREQ([2.60])
 
+dnl The general structure of the multithreading modules in gnulib is that we
+dnl have three set of modules:
+dnl
+dnl   * POSIX API:
+dnl     pthread, which combines
+dnl       pthread-h
+dnl       pthread-thread
+dnl       pthread-once
+dnl       pthread-mutex
+dnl       pthread-rwlock
+dnl       pthread-cond
+dnl       pthread-tss
+dnl       pthread-spin
+dnl     sched_yield
+dnl
+dnl   * ISO C API:
+dnl     threads, which combines
+dnl       threads-h
+dnl       thrd
+dnl       mtx
+dnl       cnd
+dnl       tss
+dnl
+dnl   * Gnulib API, with an implementation that can be chosen at configure
+dnl     time through the option --enable-threads=...
+dnl       thread
+dnl       lock
+dnl       cond
+dnl       tls
+dnl       yield
+dnl
+dnl They are independent, except for the fact that
+dnl   - the implementation of the ISO C API may use the POSIX (or some other
+dnl     platform dependent) API,
+dnl   - the implementation of the Gnulib API may use the POSIX or ISO C or
+dnl     some other platform dependent API, depending on the --enable-threads
+dnl     option.
+dnl
+dnl This file contains macros for all of these APIs!
+
+dnl ============================================================================
+dnl Macros for all thread APIs
+
+AC_DEFUN([gl_ANYTHREADLIB_EARLY],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  if test -z "$gl_anythreadlib_early_done"; then
+    case "$host_os" in
+      osf*)
+        # On OSF/1, the compiler needs the flag -D_REENTRANT so that it
+        # groks <pthread.h>. cc also understands the flag -pthread, but
+        # we don't use it because 1. gcc-2.95 doesn't understand -pthread,
+        # 2. putting a flag into CPPFLAGS that has an effect on the linker
+        # causes the AC_LINK_IFELSE test below to succeed unexpectedly,
+        # leading to wrong values of LIBTHREAD and LTLIBTHREAD.
+        CPPFLAGS="$CPPFLAGS -D_REENTRANT"
+        ;;
+    esac
+    # Some systems optimize for single-threaded programs by default, and
+    # need special flags to disable these optimizations. For example, the
+    # definition of 'errno' in <errno.h>.
+    case "$host_os" in
+      aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
+      solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
+    esac
+    gl_anythreadlib_early_done=done
+  fi
+])
+
+dnl Checks whether the compiler and linker support weak declarations of symbols.
+
+AC_DEFUN([gl_WEAK_SYMBOLS],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_CACHE_CHECK([whether imported symbols can be declared weak],
+    [gl_cv_have_weak],
+    [case "$host_os" in
+       cygwin*)
+         dnl On Cygwin 3.2.0 with gcc 10.2, the test below would succeed, but
+         dnl programs that use pthread_in_use() with weak symbol references
+         dnl crash miserably at runtime.
+         gl_cv_have_weak="guessing no"
+         ;;
+       *)
+         gl_cv_have_weak=no
+         dnl First, test whether the compiler accepts it syntactically.
+         AC_LINK_IFELSE(
+           [AC_LANG_PROGRAM(
+              [[extern void xyzzy ();
+#pragma weak xyzzy]],
+              [[xyzzy();]])],
+           [gl_cv_have_weak=maybe])
+         if test $gl_cv_have_weak = maybe; then
+           dnl Second, test whether it actually works. On Cygwin 1.7.2, with
+           dnl gcc 4.3, symbols declared weak always evaluate to the address 0.
+           AC_RUN_IFELSE(
+             [AC_LANG_SOURCE([[
+#include <stdio.h>
+#pragma weak fputs
+int main ()
+{
+  return (fputs == NULL);
+}]])],
+             [gl_cv_have_weak=yes],
+             [gl_cv_have_weak=no],
+             [dnl When cross-compiling, assume that only ELF platforms support
+              dnl weak symbols.
+              AC_EGREP_CPP([Extensible Linking Format],
+                [#ifdef __ELF__
+                 Extensible Linking Format
+                 #endif
+                ],
+                [gl_cv_have_weak="guessing yes"],
+                [gl_cv_have_weak="guessing no"])
+             ])
+         fi
+         ;;
+     esac
+     dnl But when linking statically, weak symbols don't work.
+     case " $LDFLAGS " in
+       *" -static "*) gl_cv_have_weak=no ;;
+     esac
+     dnl Test for a bug in FreeBSD 11: A link error occurs when using a weak
+     dnl symbol and linking against a shared library that has a dependency on
+     dnl the shared library that defines the symbol.
+     case "$gl_cv_have_weak" in
+       *yes)
+         case "$host_os" in
+           freebsd* | dragonfly* | midnightbsd*)
+             : > conftest1.c
+             $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&AS_MESSAGE_LOG_FD 2>&1
+             cat <<EOF > conftest2.c
+#include <pthread.h>
+#pragma weak pthread_mutexattr_gettype
+int main ()
+{
+  return (pthread_mutexattr_gettype != NULL);
+}
+EOF
+             $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&AS_MESSAGE_LOG_FD 2>&1 \
+               || gl_cv_have_weak=no
+             rm -f conftest1.c libempty.so conftest2.c conftest
+             ;;
+         esac
+         ;;
+     esac
+    ])
+  case "$gl_cv_have_weak" in
+    *yes)
+      AC_DEFINE([HAVE_WEAK_SYMBOLS], [1],
+        [Define to 1 if the compiler and linker support weak declarations of symbols.])
+      ;;
+  esac
+])
+
+dnl ============================================================================
+dnl Macros for the POSIX API
+
 dnl gl_PTHREADLIB
 dnl -------------
 dnl Tests for the libraries needs for using the POSIX threads API.
@@ -16,8 +174,214 @@
 dnl multithread functionality. The difference between LIBPTHREAD and
 dnl LIBPMULTITHREAD is that on platforms supporting weak symbols, typically
 dnl LIBPTHREAD is empty whereas LIBPMULTITHREAD is not.
+dnl Sets the variable LIB_SCHED_YIELD to the linker options needed to use the
+dnl sched_yield() function.
 dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
 dnl multithread-safe programs.
+dnl Defines the C macro HAVE_PTHREAD_API if (at least parts of) the POSIX
+dnl threads API is available.
+
+dnl The guts of gl_PTHREADLIB. Needs to be expanded only once.
+
+AC_DEFUN([gl_PTHREADLIB_BODY],
+[
+  AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
+  if test -z "$gl_pthreadlib_body_done"; then
+    gl_pthread_api=no
+    LIBPTHREAD=
+    LIBPMULTITHREAD=
+    # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
+    # it groks <pthread.h>. It's added above, in gl_ANYTHREADLIB_EARLY.
+    AC_CHECK_HEADER([pthread.h],
+      [gl_have_pthread_h=yes], [gl_have_pthread_h=no])
+    if test "$gl_have_pthread_h" = yes; then
+      # Other possible tests:
+      #   -lpthreads (FSU threads, PCthreads)
+      #   -lgthreads
+      # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
+      # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
+      # the second one only in libpthread, and lock.c needs it.
+      #
+      # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04
+      # needs -pthread for some reason.  See:
+      # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html
+      save_LIBS=$LIBS
+      for gl_pthread in '' '-pthread'; do
+        LIBS="$LIBS $gl_pthread"
+        AC_LINK_IFELSE(
+          [AC_LANG_PROGRAM(
+             [[#include <pthread.h>
+               pthread_mutex_t m;
+               pthread_mutexattr_t ma;
+             ]],
+             [[pthread_mutex_lock (&m);
+               pthread_mutexattr_init (&ma);]])],
+          [gl_pthread_api=yes
+           LIBPTHREAD=$gl_pthread
+           LIBPMULTITHREAD=$gl_pthread])
+        LIBS=$save_LIBS
+        test $gl_pthread_api = yes && break
+      done
+      echo "$as_me:__oline__: gl_pthread_api=$gl_pthread_api" >&AS_MESSAGE_LOG_FD
+      echo "$as_me:__oline__: LIBPTHREAD=$LIBPTHREAD" >&AS_MESSAGE_LOG_FD
+
+      gl_pthread_in_glibc=no
+      # On Linux with glibc >= 2.34, libc contains the fully functional
+      # pthread functions.
+      case "$host_os" in
+        linux*)
+          AC_EGREP_CPP([Lucky user],
+            [#include <features.h>
+             #ifdef __GNU_LIBRARY__
+              #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 34) || (__GLIBC__ > 2)
+               Lucky user
+              #endif
+             #endif
+            ],
+            [gl_pthread_in_glibc=yes],
+            [])
+          ;;
+      esac
+      echo "$as_me:__oline__: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&AS_MESSAGE_LOG_FD
+
+      # Test for libpthread by looking for pthread_kill. (Not pthread_self,
+      # since it is defined as a macro on OSF/1.)
+      if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then
+        # The program links fine without libpthread. But it may actually
+        # need to link with libpthread in order to create multiple threads.
+        AC_CHECK_LIB([pthread], [pthread_kill],
+          [if test $gl_pthread_in_glibc = yes; then
+             LIBPMULTITHREAD=
+           else
+             LIBPMULTITHREAD=-lpthread
+             # On Solaris and HP-UX, most pthread functions exist also in libc.
+             # Therefore pthread_in_use() needs to actually try to create a
+             # thread: pthread_create from libc will fail, whereas
+             # pthread_create will actually create a thread.
+             # On Solaris 10 or newer, this test is no longer needed, because
+             # libc contains the fully functional pthread functions.
+             case "$host_os" in
+               solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*)
+                 AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1],
+                   [Define if the pthread_in_use() detection is hard.])
+             esac
+           fi
+          ])
+      elif test $gl_pthread_api != yes; then
+        # Some library is needed. Try libpthread and libc_r.
+        AC_CHECK_LIB([pthread], [pthread_kill],
+          [gl_pthread_api=yes
+           LIBPTHREAD=-lpthread
+           LIBPMULTITHREAD=-lpthread])
+        if test $gl_pthread_api != yes; then
+          # For FreeBSD 4.
+          AC_CHECK_LIB([c_r], [pthread_kill],
+            [gl_pthread_api=yes
+             LIBPTHREAD=-lc_r
+             LIBPMULTITHREAD=-lc_r])
+        fi
+      fi
+      echo "$as_me:__oline__: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&AS_MESSAGE_LOG_FD
+    fi
+    AC_MSG_CHECKING([whether POSIX threads API is available])
+    AC_MSG_RESULT([$gl_pthread_api])
+    AC_SUBST([LIBPTHREAD])
+    AC_SUBST([LIBPMULTITHREAD])
+    if test $gl_pthread_api = yes; then
+      AC_DEFINE([HAVE_PTHREAD_API], [1],
+        [Define if you have the <pthread.h> header and the POSIX threads API.])
+    fi
+
+    dnl On some systems, sched_yield is in librt, rather than in libpthread.
+    AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM(
+         [[#include <sched.h>]],
+         [[sched_yield ();]])],
+      [LIB_SCHED_YIELD=
+      ],
+      [dnl Solaris 7...10 has sched_yield in librt, not in libpthread or libc.
+       AC_CHECK_LIB([rt], [sched_yield], [LIB_SCHED_YIELD=-lrt],
+         [dnl Solaris 2.5.1, 2.6 has sched_yield in libposix4, not librt.
+          AC_CHECK_LIB([posix4], [sched_yield], [LIB_SCHED_YIELD=-lposix4])])
+      ])
+    AC_SUBST([LIB_SCHED_YIELD])
+
+    gl_pthreadlib_body_done=done
+  fi
+])
+
+AC_DEFUN([gl_PTHREADLIB],
+[
+  AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
+  gl_PTHREADLIB_BODY
+])
+
+dnl ============================================================================
+dnl Macros for the ISO C API
+
+dnl gl_STDTHREADLIB
+dnl ---------------
+dnl Tests for the libraries needs for using the ISO C threads API.
+dnl Sets the variable LIBSTDTHREAD to the linker options for use in a Makefile.
+dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
+dnl multithread-safe programs.
+dnl Defines the C macro HAVE_THREADS_H if (at least parts of) the ISO C threads
+dnl API is available.
+
+dnl The guts of gl_STDTHREADLIB. Needs to be expanded only once.
+
+AC_DEFUN([gl_STDTHREADLIB_BODY],
+[
+  AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  if test -z "$gl_stdthreadlib_body_done"; then
+    AC_CHECK_HEADERS_ONCE([threads.h])
+
+    case "$host_os" in
+      mingw*)
+        LIBSTDTHREAD=
+        ;;
+      *)
+        gl_PTHREADLIB_BODY
+        if test $ac_cv_header_threads_h = yes; then
+          dnl glibc >= 2.29 has thrd_create in libpthread.
+          dnl FreeBSD >= 10 has thrd_create in libstdthreads; this library depends
+          dnl on libpthread (for the symbol 'pthread_mutexattr_gettype').
+          dnl glibc >= 2.34, AIX >= 7.1, and Solaris >= 11.4 have thrd_create in
+          dnl libc.
+          AC_CHECK_FUNCS([thrd_create])
+          if test $ac_cv_func_thrd_create = yes; then
+            LIBSTDTHREAD=
+          else
+            AC_CHECK_LIB([stdthreads], [thrd_create], [
+              LIBSTDTHREAD='-lstdthreads -lpthread'
+            ], [
+              dnl Guess that thrd_create is in libpthread.
+              LIBSTDTHREAD="$LIBPMULTITHREAD"
+            ])
+          fi
+        else
+          dnl Libraries needed by thrd.c, mtx.c, cnd.c, tss.c.
+          LIBSTDTHREAD="$LIBPMULTITHREAD $LIB_SCHED_YIELD"
+        fi
+        ;;
+    esac
+    AC_SUBST([LIBSTDTHREAD])
+
+    AC_MSG_CHECKING([whether ISO C threads API is available])
+    AC_MSG_RESULT([$ac_cv_header_threads_h])
+    gl_stdthreadlib_body_done=done
+  fi
+])
+
+AC_DEFUN([gl_STDTHREADLIB],
+[
+  AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
+  gl_STDTHREADLIB_BODY
+])
+
+dnl ============================================================================
+dnl Macros for the Gnulib API
 
 dnl gl_THREADLIB
 dnl ------------
@@ -47,32 +411,6 @@
 dnl same value, and similarly $LTLIBMULTITHREAD and $LIBMULTITHREAD have the
 dnl same value. Only system libraries are needed.
 
-AC_DEFUN([gl_ANYTHREADLIB_EARLY],
-[
-  AC_REQUIRE([AC_CANONICAL_HOST])
-  if test -z "$gl_anythreadlib_early_done"; then
-    case "$host_os" in
-      osf*)
-        # On OSF/1, the compiler needs the flag -D_REENTRANT so that it
-        # groks <pthread.h>. cc also understands the flag -pthread, but
-        # we don't use it because 1. gcc-2.95 doesn't understand -pthread,
-        # 2. putting a flag into CPPFLAGS that has an effect on the linker
-        # causes the AC_LINK_IFELSE test below to succeed unexpectedly,
-        # leading to wrong values of LIBTHREAD and LTLIBTHREAD.
-        CPPFLAGS="$CPPFLAGS -D_REENTRANT"
-        ;;
-    esac
-    # Some systems optimize for single-threaded programs by default, and
-    # need special flags to disable these optimizations. For example, the
-    # definition of 'errno' in <errno.h>.
-    case "$host_os" in
-      aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
-      solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
-    esac
-    gl_anythreadlib_early_done=done
-  fi
-])
-
 AC_DEFUN([gl_THREADLIB_EARLY],
 [
   AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
@@ -97,8 +435,8 @@
     [m4_divert_text([DEFAULTS], [gl_use_threads_default=])])
   m4_divert_text([DEFAULTS], [gl_use_winpthreads_default=])
   AC_ARG_ENABLE([threads],
-AC_HELP_STRING([--enable-threads={isoc|posix|isoc+posix|windows}], [specify multithreading API])m4_ifdef([gl_THREADLIB_DEFAULT_NO], [], [
-AC_HELP_STRING([--disable-threads], [build without multithread safety])]),
+AS_HELP_STRING([--enable-threads={isoc|posix|isoc+posix|windows}], [specify multithreading API])m4_ifdef([gl_THREADLIB_DEFAULT_NO], [], [
+AS_HELP_STRING([--disable-threads], [build without multithread safety])]),
     [gl_use_threads=$enableval],
     [if test -n "$gl_use_threads_default"; then
        gl_use_threads="$gl_use_threads_default"
@@ -140,90 +478,6 @@
   fi
 ])
 
-dnl The guts of gl_PTHREADLIB. Needs to be expanded only once.
-
-AC_DEFUN([gl_PTHREADLIB_BODY],
-[
-  AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
-  if test -z "$gl_threadlib_body_done"; then
-    gl_pthread_api=no
-    LIBPTHREAD=
-    LIBPMULTITHREAD=
-    # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
-    # it groks <pthread.h>. It's added above, in gl_ANYTHREADLIB_EARLY.
-    AC_CHECK_HEADER([pthread.h],
-      [gl_have_pthread_h=yes], [gl_have_pthread_h=no])
-    if test "$gl_have_pthread_h" = yes; then
-      # Other possible tests:
-      #   -lpthreads (FSU threads, PCthreads)
-      #   -lgthreads
-      # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
-      # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
-      # the second one only in libpthread, and lock.c needs it.
-      #
-      # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04
-      # needs -pthread for some reason.  See:
-      # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html
-      save_LIBS=$LIBS
-      for gl_pthread in '' '-pthread'; do
-        LIBS="$LIBS $gl_pthread"
-        AC_LINK_IFELSE(
-          [AC_LANG_PROGRAM(
-             [[#include <pthread.h>
-               pthread_mutex_t m;
-               pthread_mutexattr_t ma;
-             ]],
-             [[pthread_mutex_lock (&m);
-               pthread_mutexattr_init (&ma);]])],
-          [gl_pthread_api=yes
-           LIBPTHREAD=$gl_pthread
-           LIBPMULTITHREAD=$gl_pthread])
-        LIBS=$save_LIBS
-        test $gl_pthread_api = yes && break
-      done
-
-      # Test for libpthread by looking for pthread_kill. (Not pthread_self,
-      # since it is defined as a macro on OSF/1.)
-      if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then
-        # The program links fine without libpthread. But it may actually
-        # need to link with libpthread in order to create multiple threads.
-        AC_CHECK_LIB([pthread], [pthread_kill],
-          [LIBPMULTITHREAD=-lpthread
-           # On Solaris and HP-UX, most pthread functions exist also in libc.
-           # Therefore pthread_in_use() needs to actually try to create a
-           # thread: pthread_create from libc will fail, whereas
-           # pthread_create will actually create a thread.
-           # On Solaris 10 or newer, this test is no longer needed, because
-           # libc contains the fully functional pthread functions.
-           case "$host_os" in
-             solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*)
-               AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1],
-                 [Define if the pthread_in_use() detection is hard.])
-           esac
-          ])
-      elif test $gl_pthread_api != yes; then
-        # Some library is needed. Try libpthread and libc_r.
-        AC_CHECK_LIB([pthread], [pthread_kill],
-          [gl_pthread_api=yes
-           LIBPTHREAD=-lpthread
-           LIBPMULTITHREAD=-lpthread])
-        if test $gl_pthread_api != yes; then
-          # For FreeBSD 4.
-          AC_CHECK_LIB([c_r], [pthread_kill],
-            [gl_pthread_api=yes
-             LIBPTHREAD=-lc_r
-             LIBPMULTITHREAD=-lc_r])
-        fi
-      fi
-    fi
-    AC_MSG_CHECKING([whether POSIX threads API is available])
-    AC_MSG_RESULT([$gl_pthread_api])
-    AC_SUBST([LIBPTHREAD])
-    AC_SUBST([LIBPMULTITHREAD])
-    gl_threadlib_body_done=done
-  fi
-])
-
 dnl The guts of gl_THREADLIB. Needs to be expanded only once.
 
 AC_DEFUN([gl_THREADLIB_BODY],
@@ -236,45 +490,7 @@
   LTLIBMULTITHREAD=
   if test "$gl_use_threads" != no; then
     dnl Check whether the compiler and linker support weak declarations.
-    AC_CACHE_CHECK([whether imported symbols can be declared weak],
-      [gl_cv_have_weak],
-      [gl_cv_have_weak=no
-       dnl First, test whether the compiler accepts it syntactically.
-       AC_LINK_IFELSE(
-         [AC_LANG_PROGRAM(
-            [[extern void xyzzy ();
-#pragma weak xyzzy]],
-            [[xyzzy();]])],
-         [gl_cv_have_weak=maybe])
-       if test $gl_cv_have_weak = maybe; then
-         dnl Second, test whether it actually works. On Cygwin 1.7.2, with
-         dnl gcc 4.3, symbols declared weak always evaluate to the address 0.
-         AC_RUN_IFELSE(
-           [AC_LANG_SOURCE([[
-#include <stdio.h>
-#pragma weak fputs
-int main ()
-{
-  return (fputs == NULL);
-}]])],
-           [gl_cv_have_weak=yes],
-           [gl_cv_have_weak=no],
-           [dnl When cross-compiling, assume that only ELF platforms support
-            dnl weak symbols.
-            AC_EGREP_CPP([Extensible Linking Format],
-              [#ifdef __ELF__
-               Extensible Linking Format
-               #endif
-              ],
-              [gl_cv_have_weak="guessing yes"],
-              [gl_cv_have_weak="guessing no"])
-           ])
-       fi
-       dnl But when linking statically, weak symbols don't work.
-       case " $LDFLAGS " in
-         *" -static "*) gl_cv_have_weak=no ;;
-       esac
-      ])
+    gl_WEAK_SYMBOLS
     if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
       dnl If we use weak symbols to implement pthread_in_use / pth_in_use /
       dnl thread_in_use, we also need to test whether the ISO C 11 thrd_create
@@ -284,20 +500,7 @@
     fi
     if test "$gl_use_threads" = isoc || test "$gl_use_threads" = isoc+posix; then
       AC_CHECK_HEADERS_ONCE([threads.h])
-      if test $ac_cv_header_threads_h = yes; then
-        gl_have_isoc_threads=
-        # Test whether both mtx_lock and cnd_timedwait exist in libc.
-        AC_LINK_IFELSE(
-          [AC_LANG_PROGRAM(
-             [[#include <threads.h>
-               #include <stddef.h>
-               mtx_t m;
-               cnd_t c;
-             ]],
-             [[mtx_lock (&m);
-               cnd_timedwait (&c, &m, NULL);]])],
-          [gl_have_isoc_threads=yes])
-      fi
+      gl_have_isoc_threads="$ac_cv_header_threads_h"
     fi
     if test "$gl_use_threads" = yes \
        || test "$gl_use_threads" = posix \
@@ -315,11 +518,25 @@
           gl_threads_api=posix
           AC_DEFINE([USE_POSIX_THREADS], [1],
             [Define if the POSIX multithreading library can be used.])
-          if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
+          if test -z "$LIBMULTITHREAD" && test -z "$LTLIBMULTITHREAD"; then
+            AC_DEFINE([USE_POSIX_THREADS_FROM_LIBC], [1],
+              [Define if references to the POSIX multithreading library are satisfied by libc.])
+          else
             if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
               AC_DEFINE([USE_POSIX_THREADS_WEAK], [1],
                 [Define if references to the POSIX multithreading library should be made weak.])
               LIBTHREAD= LTLIBTHREAD=
+            else
+              case "$host_os" in
+                freebsd* | dragonfly* | midnightbsd*)
+                  if test "x$LIBTHREAD" != "x$LIBMULTITHREAD"; then
+                    dnl If weak symbols can't tell whether pthread_create(), pthread_key_create()
+                    dnl etc. will succeed, we need a runtime test.
+                    AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1],
+                      [Define if the pthread_in_use() detection is hard.])
+                  fi
+                  ;;
+              esac
             fi
           fi
         fi
@@ -327,6 +544,9 @@
     fi
     if test $gl_threads_api = none; then
       if test "$gl_use_threads" = isoc && test "$gl_have_isoc_threads" = yes; then
+        gl_STDTHREADLIB_BODY
+        LIBTHREAD=$LIBSTDTHREAD LTLIBTHREAD=$LIBSTDTHREAD
+        LIBMULTITHREAD=$LIBSTDTHREAD LTLIBMULTITHREAD=$LIBSTDTHREAD
         gl_threads_api=isoc
         AC_DEFINE([USE_ISOC_THREADS], [1],
           [Define if the ISO C multithreading library can be used.])
@@ -356,12 +576,6 @@
   AC_SUBST([LTLIBMULTITHREAD])
 ])
 
-AC_DEFUN([gl_PTHREADLIB],
-[
-  AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
-  gl_PTHREADLIB_BODY
-])
-
 AC_DEFUN([gl_THREADLIB],
 [
   AC_REQUIRE([gl_THREADLIB_EARLY])
@@ -392,6 +606,9 @@
 ])
 
 
+dnl ============================================================================
+
+
 dnl Survey of platforms:
 dnl
 dnl Platform           Available  Compiler    Supports   test-lock
@@ -399,7 +616,9 @@
 dnl ---------------    ---------  ---------   --------   ---------
 dnl Linux 2.4/glibc    posix      -lpthread       Y      OK
 dnl
-dnl GNU Hurd/glibc     posix
+dnl Linux/glibc 2.34   posix                      Y      OK
+dnl
+dnl GNU Hurd/glibc     posix      -lpthread       Y      OK
 dnl
 dnl Ubuntu 14.04       posix      -pthread        Y      OK
 dnl
diff --git a/m4/time_h.m4 b/m4/time_h.m4
index f08f29b..b57474b 100644
--- a/m4/time_h.m4
+++ b/m4/time_h.m4
@@ -1,8 +1,8 @@
 # Configure a more-standard replacement for <time.h>.
 
-# Copyright (C) 2000-2001, 2003-2007, 2009-2019 Free Software Foundation, Inc.
+# Copyright (C) 2000-2001, 2003-2007, 2009-2021 Free Software Foundation, Inc.
 
-# serial 11
+# serial 18
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -10,19 +10,32 @@
 
 # Written by Paul Eggert and Jim Meyering.
 
-AC_DEFUN([gl_HEADER_TIME_H],
+AC_DEFUN_ONCE([gl_TIME_H],
 [
-  dnl Use AC_REQUIRE here, so that the default behavior below is expanded
-  dnl once only, before all statements that occur in other macros.
-  AC_REQUIRE([gl_HEADER_TIME_H_BODY])
-])
+  dnl Ensure to expand the default settings once only, before all statements
+  dnl that occur in other macros.
+  AC_REQUIRE([gl_TIME_H_DEFAULTS])
 
-AC_DEFUN([gl_HEADER_TIME_H_BODY],
-[
-  AC_REQUIRE([AC_C_RESTRICT])
-  AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
   gl_NEXT_HEADERS([time.h])
   AC_REQUIRE([gl_CHECK_TYPE_STRUCT_TIMESPEC])
+
+  AC_REQUIRE([AC_C_RESTRICT])
+
+  AC_CACHE_CHECK([for TIME_UTC in <time.h>],
+    [gl_cv_time_h_has_TIME_UTC],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <time.h>
+          ]],
+          [[static int x = TIME_UTC; x++;]])],
+       [gl_cv_time_h_has_TIME_UTC=yes],
+       [gl_cv_time_h_has_TIME_UTC=no])])
+  if test $gl_cv_time_h_has_TIME_UTC = yes; then
+    TIME_H_DEFINES_TIME_UTC=1
+  else
+    TIME_H_DEFINES_TIME_UTC=0
+  fi
+  AC_SUBST([TIME_H_DEFINES_TIME_UTC])
 ])
 
 dnl Check whether 'struct timespec' is declared
@@ -93,33 +106,51 @@
   AC_SUBST([UNISTD_H_DEFINES_STRUCT_TIMESPEC])
 ])
 
+# gl_TIME_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_TIME_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_TIME_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
-AC_DEFUN([gl_HEADER_TIME_H_DEFAULTS],
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_TIME_H_REQUIRE_DEFAULTS],
 [
-  GNULIB_CTIME=0;                        AC_SUBST([GNULIB_CTIME])
-  GNULIB_MKTIME=0;                       AC_SUBST([GNULIB_MKTIME])
-  GNULIB_LOCALTIME=0;                    AC_SUBST([GNULIB_LOCALTIME])
-  GNULIB_NANOSLEEP=0;                    AC_SUBST([GNULIB_NANOSLEEP])
-  GNULIB_STRFTIME=0;                     AC_SUBST([GNULIB_STRFTIME])
-  GNULIB_STRPTIME=0;                     AC_SUBST([GNULIB_STRPTIME])
-  GNULIB_TIMEGM=0;                       AC_SUBST([GNULIB_TIMEGM])
-  GNULIB_TIME_R=0;                       AC_SUBST([GNULIB_TIME_R])
-  GNULIB_TIME_RZ=0;                      AC_SUBST([GNULIB_TIME_RZ])
-  GNULIB_TZSET=0;                        AC_SUBST([GNULIB_TZSET])
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_TIME_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CTIME])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKTIME])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOCALTIME])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_NANOSLEEP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRFTIME])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRPTIME])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIMEGM])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIMESPEC_GET])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIME_R])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIME_RZ])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TZSET])
+    dnl Support Microsoft deprecated alias function names by default.
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_TZSET], [1])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_TIME_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_TIME_H_DEFAULTS])
+])
+
+AC_DEFUN([gl_TIME_H_DEFAULTS],
+[
   dnl Assume proper GNU behavior unless another module says otherwise.
   HAVE_DECL_LOCALTIME_R=1;               AC_SUBST([HAVE_DECL_LOCALTIME_R])
   HAVE_NANOSLEEP=1;                      AC_SUBST([HAVE_NANOSLEEP])
   HAVE_STRPTIME=1;                       AC_SUBST([HAVE_STRPTIME])
   HAVE_TIMEGM=1;                         AC_SUBST([HAVE_TIMEGM])
-  HAVE_TZSET=1;                          AC_SUBST([HAVE_TZSET])
+  HAVE_TIMESPEC_GET=1;                   AC_SUBST([HAVE_TIMESPEC_GET])
   dnl Even GNU libc does not have timezone_t yet.
   HAVE_TIMEZONE_T=0;                     AC_SUBST([HAVE_TIMEZONE_T])
   dnl If another module says to replace or to not replace, do that.
diff --git a/m4/timespec.m4 b/m4/timespec.m4
index 3db9943..40307d4 100644
--- a/m4/timespec.m4
+++ b/m4/timespec.m4
@@ -1,6 +1,6 @@
 #serial 15
 
-# Copyright (C) 2000-2001, 2003-2007, 2009-2019 Free Software Foundation, Inc.
+# Copyright (C) 2000-2001, 2003-2007, 2009-2021 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
diff --git a/m4/tls.m4 b/m4/tls.m4
index bfdc608..2ce6db8 100644
--- a/m4/tls.m4
+++ b/m4/tls.m4
@@ -1,5 +1,5 @@
 # tls.m4 serial 2 (gettext-0.18)
-dnl Copyright (C) 2005, 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2005, 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/unicodeio.m4 b/m4/unicodeio.m4
new file mode 100644
index 0000000..6afba0a
--- /dev/null
+++ b/m4/unicodeio.m4
@@ -0,0 +1,11 @@
+# unicodeio.m4 serial 3
+dnl Copyright (C) 2002-2003, 2009-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_UNICODEIO],
+[
+  dnl Prerequisites of lib/unicodeio.c.
+  gl_MUSL_LIBC
+])
diff --git a/m4/unistd-safer.m4 b/m4/unistd-safer.m4
index 5e2a1be..c205446 100644
--- a/m4/unistd-safer.m4
+++ b/m4/unistd-safer.m4
@@ -1,5 +1,5 @@
 #serial 9
-dnl Copyright (C) 2002, 2005-2006, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2002, 2005-2006, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/unistd_h.m4 b/m4/unistd_h.m4
index 18b7140..0ce4ea4 100644
--- a/m4/unistd_h.m4
+++ b/m4/unistd_h.m4
@@ -1,15 +1,15 @@
-# unistd_h.m4 serial 76
-dnl Copyright (C) 2006-2019 Free Software Foundation, Inc.
+# unistd_h.m4 serial 89
+dnl Copyright (C) 2006-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl Written by Simon Josefsson, Bruno Haible.
 
-AC_DEFUN([gl_UNISTD_H],
+AC_DEFUN_ONCE([gl_UNISTD_H],
 [
-  dnl Use AC_REQUIRE here, so that the default behavior below is expanded
-  dnl once only, before all statements that occur in other macros.
+  dnl Ensure to expand the default settings once only, before all statements
+  dnl that occur in other macros.
   AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
 
   gl_CHECK_NEXT_HEADERS([unistd.h])
@@ -41,84 +41,140 @@
 #  include <io.h>
 # endif
 #endif
-    ]], [access chdir chown dup dup2 dup3 environ euidaccess faccessat fchdir
+    ]], [access chdir chown copy_file_range dup dup2 dup3 environ euidaccess
+    execl execle execlp execv execve execvp execvpe
+    faccessat fchdir
     fchownat fdatasync fsync ftruncate getcwd getdomainname getdtablesize
-    getgroups gethostname getlogin getlogin_r getpagesize getpass
+    getentropy getgroups gethostname getlogin getlogin_r getpagesize getpass
     getusershell setusershell endusershell
     group_member isatty lchown link linkat lseek pipe pipe2 pread pwrite
     readlink readlinkat rmdir sethostname sleep symlink symlinkat
     truncate ttyname_r unlink unlinkat usleep])
+
+  AC_REQUIRE([AC_C_RESTRICT])
+
+  AC_CHECK_DECLS_ONCE([execvpe])
+  if test $ac_cv_have_decl_execvpe = no; then
+    HAVE_DECL_EXECVPE=0
+  fi
 ])
 
+# gl_UNISTD_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_UNISTD_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_UNISTD_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_UNISTD_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_UNISTD_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ACCESS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CHDIR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CHOWN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CLOSE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COPY_FILE_RANGE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DUP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DUP2])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DUP3])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ENVIRON])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EUIDACCESS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECLE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECLP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECV])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECVE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECVP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECVPE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FACCESSAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FCHDIR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FCHOWNAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FDATASYNC])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSYNC])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FTRUNCATE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETCWD])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETDOMAINNAME])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETDTABLESIZE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETENTROPY])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETGROUPS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETHOSTNAME])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETLOGIN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETLOGIN_R])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETOPT_POSIX])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETPAGESIZE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETPASS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETUSERSHELL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GROUP_MEMBER])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISATTY])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LCHOWN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LINK])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LINKAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LSEEK])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PIPE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PIPE2])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PREAD])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PWRITE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_READ])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_READLINK])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_READLINKAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RMDIR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SETHOSTNAME])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SLEEP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SYMLINK])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SYMLINKAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TRUNCATE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TTYNAME_R])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNISTD_H_GETOPT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNISTD_H_NONBLOCKING])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNISTD_H_SIGPIPE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNLINK])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNLINKAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_USLEEP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WRITE])
+    dnl Support Microsoft deprecated alias function names by default.
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_ACCESS], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_CHDIR], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_CLOSE], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_DUP], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_DUP2], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECL], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECLE], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECLP], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECV], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECVE], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECVP], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECVPE], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_GETCWD], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_GETPID], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_ISATTY], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_LSEEK], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_READ], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_RMDIR], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_SWAB], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_UNLINK], [1])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_WRITE], [1])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_UNISTD_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_UNISTD_H_DEFAULTS],
 [
-  GNULIB_ACCESS=0;               AC_SUBST([GNULIB_ACCESS])
-  GNULIB_CHDIR=0;                AC_SUBST([GNULIB_CHDIR])
-  GNULIB_CHOWN=0;                AC_SUBST([GNULIB_CHOWN])
-  GNULIB_CLOSE=0;                AC_SUBST([GNULIB_CLOSE])
-  GNULIB_COPY_FILE_RANGE=0;      AC_SUBST([GNULIB_COPY_FILE_RANGE])
-  GNULIB_DUP=0;                  AC_SUBST([GNULIB_DUP])
-  GNULIB_DUP2=0;                 AC_SUBST([GNULIB_DUP2])
-  GNULIB_DUP3=0;                 AC_SUBST([GNULIB_DUP3])
-  GNULIB_ENVIRON=0;              AC_SUBST([GNULIB_ENVIRON])
-  GNULIB_EUIDACCESS=0;           AC_SUBST([GNULIB_EUIDACCESS])
-  GNULIB_FACCESSAT=0;            AC_SUBST([GNULIB_FACCESSAT])
-  GNULIB_FCHDIR=0;               AC_SUBST([GNULIB_FCHDIR])
-  GNULIB_FCHOWNAT=0;             AC_SUBST([GNULIB_FCHOWNAT])
-  GNULIB_FDATASYNC=0;            AC_SUBST([GNULIB_FDATASYNC])
-  GNULIB_FSYNC=0;                AC_SUBST([GNULIB_FSYNC])
-  GNULIB_FTRUNCATE=0;            AC_SUBST([GNULIB_FTRUNCATE])
-  GNULIB_GETCWD=0;               AC_SUBST([GNULIB_GETCWD])
-  GNULIB_GETDOMAINNAME=0;        AC_SUBST([GNULIB_GETDOMAINNAME])
-  GNULIB_GETDTABLESIZE=0;        AC_SUBST([GNULIB_GETDTABLESIZE])
-  GNULIB_GETGROUPS=0;            AC_SUBST([GNULIB_GETGROUPS])
-  GNULIB_GETHOSTNAME=0;          AC_SUBST([GNULIB_GETHOSTNAME])
-  GNULIB_GETLOGIN=0;             AC_SUBST([GNULIB_GETLOGIN])
-  GNULIB_GETLOGIN_R=0;           AC_SUBST([GNULIB_GETLOGIN_R])
-  GNULIB_GETPAGESIZE=0;          AC_SUBST([GNULIB_GETPAGESIZE])
-  GNULIB_GETPASS=0;              AC_SUBST([GNULIB_GETPASS])
-  GNULIB_GETUSERSHELL=0;         AC_SUBST([GNULIB_GETUSERSHELL])
-  GNULIB_GROUP_MEMBER=0;         AC_SUBST([GNULIB_GROUP_MEMBER])
-  GNULIB_ISATTY=0;               AC_SUBST([GNULIB_ISATTY])
-  GNULIB_LCHOWN=0;               AC_SUBST([GNULIB_LCHOWN])
-  GNULIB_LINK=0;                 AC_SUBST([GNULIB_LINK])
-  GNULIB_LINKAT=0;               AC_SUBST([GNULIB_LINKAT])
-  GNULIB_LSEEK=0;                AC_SUBST([GNULIB_LSEEK])
-  GNULIB_PIPE=0;                 AC_SUBST([GNULIB_PIPE])
-  GNULIB_PIPE2=0;                AC_SUBST([GNULIB_PIPE2])
-  GNULIB_PREAD=0;                AC_SUBST([GNULIB_PREAD])
-  GNULIB_PWRITE=0;               AC_SUBST([GNULIB_PWRITE])
-  GNULIB_READ=0;                 AC_SUBST([GNULIB_READ])
-  GNULIB_READLINK=0;             AC_SUBST([GNULIB_READLINK])
-  GNULIB_READLINKAT=0;           AC_SUBST([GNULIB_READLINKAT])
-  GNULIB_RMDIR=0;                AC_SUBST([GNULIB_RMDIR])
-  GNULIB_SETHOSTNAME=0;          AC_SUBST([GNULIB_SETHOSTNAME])
-  GNULIB_SLEEP=0;                AC_SUBST([GNULIB_SLEEP])
-  GNULIB_SYMLINK=0;              AC_SUBST([GNULIB_SYMLINK])
-  GNULIB_SYMLINKAT=0;            AC_SUBST([GNULIB_SYMLINKAT])
-  GNULIB_TRUNCATE=0;             AC_SUBST([GNULIB_TRUNCATE])
-  GNULIB_TTYNAME_R=0;            AC_SUBST([GNULIB_TTYNAME_R])
-  GNULIB_UNISTD_H_NONBLOCKING=0; AC_SUBST([GNULIB_UNISTD_H_NONBLOCKING])
-  GNULIB_UNISTD_H_SIGPIPE=0;     AC_SUBST([GNULIB_UNISTD_H_SIGPIPE])
-  GNULIB_UNLINK=0;               AC_SUBST([GNULIB_UNLINK])
-  GNULIB_UNLINKAT=0;             AC_SUBST([GNULIB_UNLINKAT])
-  GNULIB_USLEEP=0;               AC_SUBST([GNULIB_USLEEP])
-  GNULIB_WRITE=0;                AC_SUBST([GNULIB_WRITE])
   dnl Assume proper GNU behavior unless another module says otherwise.
   HAVE_CHOWN=1;           AC_SUBST([HAVE_CHOWN])
   HAVE_COPY_FILE_RANGE=1; AC_SUBST([HAVE_COPY_FILE_RANGE])
-  HAVE_DUP2=1;            AC_SUBST([HAVE_DUP2])
   HAVE_DUP3=1;            AC_SUBST([HAVE_DUP3])
   HAVE_EUIDACCESS=1;      AC_SUBST([HAVE_EUIDACCESS])
+  HAVE_EXECVPE=1;         AC_SUBST([HAVE_EXECVPE])
   HAVE_FACCESSAT=1;       AC_SUBST([HAVE_FACCESSAT])
   HAVE_FCHDIR=1;          AC_SUBST([HAVE_FCHDIR])
   HAVE_FCHOWNAT=1;        AC_SUBST([HAVE_FCHOWNAT])
@@ -126,6 +182,7 @@
   HAVE_FSYNC=1;           AC_SUBST([HAVE_FSYNC])
   HAVE_FTRUNCATE=1;       AC_SUBST([HAVE_FTRUNCATE])
   HAVE_GETDTABLESIZE=1;   AC_SUBST([HAVE_GETDTABLESIZE])
+  HAVE_GETENTROPY=1;      AC_SUBST([HAVE_GETENTROPY])
   HAVE_GETGROUPS=1;       AC_SUBST([HAVE_GETGROUPS])
   HAVE_GETHOSTNAME=1;     AC_SUBST([HAVE_GETHOSTNAME])
   HAVE_GETLOGIN=1;        AC_SUBST([HAVE_GETLOGIN])
@@ -148,6 +205,7 @@
   HAVE_UNLINKAT=1;        AC_SUBST([HAVE_UNLINKAT])
   HAVE_USLEEP=1;          AC_SUBST([HAVE_USLEEP])
   HAVE_DECL_ENVIRON=1;    AC_SUBST([HAVE_DECL_ENVIRON])
+  HAVE_DECL_EXECVPE=1;    AC_SUBST([HAVE_DECL_EXECVPE])
   HAVE_DECL_FCHDIR=1;     AC_SUBST([HAVE_DECL_FCHDIR])
   HAVE_DECL_FDATASYNC=1;  AC_SUBST([HAVE_DECL_FDATASYNC])
   HAVE_DECL_GETDOMAINNAME=1; AC_SUBST([HAVE_DECL_GETDOMAINNAME])
@@ -165,6 +223,13 @@
   REPLACE_CLOSE=0;        AC_SUBST([REPLACE_CLOSE])
   REPLACE_DUP=0;          AC_SUBST([REPLACE_DUP])
   REPLACE_DUP2=0;         AC_SUBST([REPLACE_DUP2])
+  REPLACE_EXECL=0;        AC_SUBST([REPLACE_EXECL])
+  REPLACE_EXECLE=0;       AC_SUBST([REPLACE_EXECLE])
+  REPLACE_EXECLP=0;       AC_SUBST([REPLACE_EXECLP])
+  REPLACE_EXECV=0;        AC_SUBST([REPLACE_EXECV])
+  REPLACE_EXECVE=0;       AC_SUBST([REPLACE_EXECVE])
+  REPLACE_EXECVP=0;       AC_SUBST([REPLACE_EXECVP])
+  REPLACE_EXECVPE=0;      AC_SUBST([REPLACE_EXECVPE])
   REPLACE_FACCESSAT=0;    AC_SUBST([REPLACE_FACCESSAT])
   REPLACE_FCHOWNAT=0;     AC_SUBST([REPLACE_FCHOWNAT])
   REPLACE_FTRUNCATE=0;    AC_SUBST([REPLACE_FTRUNCATE])
@@ -195,6 +260,7 @@
   REPLACE_UNLINKAT=0;     AC_SUBST([REPLACE_UNLINKAT])
   REPLACE_USLEEP=0;       AC_SUBST([REPLACE_USLEEP])
   REPLACE_WRITE=0;        AC_SUBST([REPLACE_WRITE])
+  UNISTD_H_HAVE_SYS_RANDOM_H=0; AC_SUBST([UNISTD_H_HAVE_SYS_RANDOM_H])
   UNISTD_H_HAVE_WINSOCK2_H=0; AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H])
   UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
                            AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS])
diff --git a/m4/unlink.m4 b/m4/unlink.m4
index fec63c1..74e1668 100644
--- a/m4/unlink.m4
+++ b/m4/unlink.m4
@@ -1,5 +1,5 @@
-# unlink.m4 serial 14
-dnl Copyright (C) 2009-2019 Free Software Foundation, Inc.
+# unlink.m4 serial 15
+dnl Copyright (C) 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -26,7 +26,7 @@
            # include <io.h>
            #endif
            #include <errno.h>
-         ]],
+         ]GL_MDA_DEFINES],
          [[int result = 0;
            if (!unlink ("conftest.file/"))
              result |= 1;
@@ -98,6 +98,7 @@
                 # include <direct.h>
                 # include <io.h>
                 #endif
+                ]GL_MDA_DEFINES[
                 int main ()
                 {
                   int result = 0;
diff --git a/m4/unlocked-io.m4 b/m4/unlocked-io.m4
index ea55a1a..b689020 100644
--- a/m4/unlocked-io.m4
+++ b/m4/unlocked-io.m4
@@ -1,6 +1,6 @@
-# unlocked-io.m4 serial 15
+# unlocked-io.m4 serial 16
 
-# Copyright (C) 1998-2006, 2009-2019 Free Software Foundation, Inc.
+# Copyright (C) 1998-2006, 2009-2021 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -16,11 +16,6 @@
 
 AC_DEFUN([gl_FUNC_GLIBC_UNLOCKED_IO],
 [
-  AC_DEFINE([USE_UNLOCKED_IO], [1],
-    [Define to 1 if you want getc etc. to use unlocked I/O if available.
-     Unlocked I/O can improve performance in unithreaded apps,
-     but it is not safe for multithreaded apps.])
-
   dnl Persuade glibc and Solaris <stdio.h> to declare
   dnl fgets_unlocked(), fputs_unlocked() etc.
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
diff --git a/m4/vasnprintf.m4 b/m4/vasnprintf.m4
index b763a3d..483bba9 100644
--- a/m4/vasnprintf.m4
+++ b/m4/vasnprintf.m4
@@ -1,5 +1,5 @@
-# vasnprintf.m4 serial 36
-dnl Copyright (C) 2002-2004, 2006-2019 Free Software Foundation, Inc.
+# vasnprintf.m4 serial 38
+dnl Copyright (C) 2002-2004, 2006-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -32,7 +32,6 @@
 # Prerequisites of lib/printf-args.h, lib/printf-args.c.
 AC_DEFUN([gl_PREREQ_PRINTF_ARGS],
 [
-  AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
   AC_REQUIRE([gt_TYPE_WCHAR_T])
   AC_REQUIRE([gt_TYPE_WINT_T])
 ])
@@ -41,7 +40,6 @@
 AC_DEFUN([gl_PREREQ_PRINTF_PARSE],
 [
   AC_REQUIRE([gl_FEATURES_H])
-  AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
   AC_REQUIRE([gt_TYPE_WCHAR_T])
   AC_REQUIRE([gt_TYPE_WINT_T])
   AC_REQUIRE([AC_TYPE_SIZE_T])
@@ -56,7 +54,6 @@
 AC_DEFUN_ONCE([gl_PREREQ_VASNPRINTF],
 [
   AC_REQUIRE([AC_FUNC_ALLOCA])
-  AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
   AC_REQUIRE([gt_TYPE_WCHAR_T])
   AC_REQUIRE([gt_TYPE_WINT_T])
   AC_CHECK_FUNCS([snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb])
@@ -77,6 +74,16 @@
          if the buffer had been large enough.])
       ;;
   esac
+  dnl Additionally, the use of %n can be eliminated by assuming that snprintf
+  dnl always produces NUL-terminated strings (no truncation).
+  AC_REQUIRE([gl_SNPRINTF_TRUNCATION_C99])
+  case "$gl_cv_func_snprintf_truncation_c99" in
+    *yes)
+      AC_DEFINE([HAVE_SNPRINTF_TRUNCATION_C99], [1],
+        [Define if the string produced by the snprintf function is always NUL
+         terminated.])
+      ;;
+  esac
 ])
 
 # Extra prerequisites of lib/vasnprintf.c for supporting 'long double'
diff --git a/m4/vasprintf-posix.m4 b/m4/vasprintf-posix.m4
index 3b8de2a..8876dbf 100644
--- a/m4/vasprintf-posix.m4
+++ b/m4/vasprintf-posix.m4
@@ -1,5 +1,5 @@
 # vasprintf-posix.m4 serial 13
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/vasprintf.m4 b/m4/vasprintf.m4
index cd96229..a26de84 100644
--- a/m4/vasprintf.m4
+++ b/m4/vasprintf.m4
@@ -1,5 +1,5 @@
 # vasprintf.m4 serial 6
-dnl Copyright (C) 2002-2003, 2006-2007, 2009-2019 Free Software Foundation,
+dnl Copyright (C) 2002-2003, 2006-2007, 2009-2021 Free Software Foundation,
 dnl Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
diff --git a/m4/vfprintf-posix.m4 b/m4/vfprintf-posix.m4
index 94d1621..46ff940 100644
--- a/m4/vfprintf-posix.m4
+++ b/m4/vfprintf-posix.m4
@@ -1,5 +1,5 @@
 # vfprintf-posix.m4 serial 14
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/visibility.m4 b/m4/visibility.m4
new file mode 100644
index 0000000..d161bd7
--- /dev/null
+++ b/m4/visibility.m4
@@ -0,0 +1,82 @@
+# visibility.m4 serial 8
+dnl Copyright (C) 2005, 2008, 2010-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl Tests whether the compiler supports the command-line option
+dnl -fvisibility=hidden and the function and variable attributes
+dnl __attribute__((__visibility__("hidden"))) and
+dnl __attribute__((__visibility__("default"))).
+dnl Does *not* test for __visibility__("protected") - which has tricky
+dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on
+dnl Mac OS X.
+dnl Does *not* test for __visibility__("internal") - which has processor
+dnl dependent semantics.
+dnl Does *not* test for #pragma GCC visibility push(hidden) - which is
+dnl "really only recommended for legacy code".
+dnl Set the variable CFLAG_VISIBILITY.
+dnl Defines and sets the variable HAVE_VISIBILITY.
+
+AC_DEFUN([gl_VISIBILITY],
+[
+  AC_REQUIRE([AC_PROG_CC])
+  CFLAG_VISIBILITY=
+  HAVE_VISIBILITY=0
+  if test -n "$GCC"; then
+    dnl First, check whether -Werror can be added to the command line, or
+    dnl whether it leads to an error because of some other option that the
+    dnl user has put into $CC $CFLAGS $CPPFLAGS.
+    AC_CACHE_CHECK([whether the -Werror option is usable],
+      [gl_cv_cc_vis_werror],
+      [gl_save_CFLAGS="$CFLAGS"
+       CFLAGS="$CFLAGS -Werror"
+       AC_COMPILE_IFELSE(
+         [AC_LANG_PROGRAM([[]], [[]])],
+         [gl_cv_cc_vis_werror=yes],
+         [gl_cv_cc_vis_werror=no])
+       CFLAGS="$gl_save_CFLAGS"
+      ])
+    dnl Now check whether visibility declarations are supported.
+    AC_CACHE_CHECK([for simple visibility declarations],
+      [gl_cv_cc_visibility],
+      [gl_save_CFLAGS="$CFLAGS"
+       CFLAGS="$CFLAGS -fvisibility=hidden"
+       dnl We use the option -Werror and a function dummyfunc, because on some
+       dnl platforms (Cygwin 1.7) the use of -fvisibility triggers a warning
+       dnl "visibility attribute not supported in this configuration; ignored"
+       dnl at the first function definition in every compilation unit, and we
+       dnl don't want to use the option in this case.
+       if test $gl_cv_cc_vis_werror = yes; then
+         CFLAGS="$CFLAGS -Werror"
+       fi
+       AC_COMPILE_IFELSE(
+         [AC_LANG_PROGRAM(
+            [[extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+              extern __attribute__((__visibility__("default"))) int exportedvar;
+              extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+              extern __attribute__((__visibility__("default"))) int exportedfunc (void);
+              void dummyfunc (void);
+              int hiddenvar;
+              int exportedvar;
+              int hiddenfunc (void) { return 51; }
+              int exportedfunc (void) { return 1225736919; }
+              void dummyfunc (void) {}
+            ]],
+            [[]])],
+         [gl_cv_cc_visibility=yes],
+         [gl_cv_cc_visibility=no])
+       CFLAGS="$gl_save_CFLAGS"
+      ])
+    if test $gl_cv_cc_visibility = yes; then
+      CFLAG_VISIBILITY="-fvisibility=hidden"
+      HAVE_VISIBILITY=1
+    fi
+  fi
+  AC_SUBST([CFLAG_VISIBILITY])
+  AC_SUBST([HAVE_VISIBILITY])
+  AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY],
+    [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.])
+])
diff --git a/m4/vsnprintf-posix.m4 b/m4/vsnprintf-posix.m4
index f5a15be..964bb45 100644
--- a/m4/vsnprintf-posix.m4
+++ b/m4/vsnprintf-posix.m4
@@ -1,5 +1,5 @@
 # vsnprintf-posix.m4 serial 15
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/vsnprintf.m4 b/m4/vsnprintf.m4
index 739c904..5f5375e 100644
--- a/m4/vsnprintf.m4
+++ b/m4/vsnprintf.m4
@@ -1,5 +1,5 @@
 # vsnprintf.m4 serial 7
-dnl Copyright (C) 2002-2004, 2007-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2002-2004, 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/vsprintf-posix.m4 b/m4/vsprintf-posix.m4
index 7545ab7..4fe5389 100644
--- a/m4/vsprintf-posix.m4
+++ b/m4/vsprintf-posix.m4
@@ -1,5 +1,5 @@
 # vsprintf-posix.m4 serial 12
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/wait-process.m4 b/m4/wait-process.m4
index 8d579eb..ea085df 100644
--- a/m4/wait-process.m4
+++ b/m4/wait-process.m4
@@ -1,5 +1,5 @@
 # wait-process.m4 serial 6
-dnl Copyright (C) 2003, 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2003, 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/waitpid.m4 b/m4/waitpid.m4
index ead350c..53af56c 100644
--- a/m4/waitpid.m4
+++ b/m4/waitpid.m4
@@ -1,5 +1,5 @@
 # waitpid.m4 serial 2
-dnl Copyright (C) 2010-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2010-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/warn-on-use.m4 b/m4/warn-on-use.m4
index 7ebe2d3..04edfe8 100644
--- a/m4/warn-on-use.m4
+++ b/m4/warn-on-use.m4
@@ -1,5 +1,5 @@
-# warn-on-use.m4 serial 6
-dnl Copyright (C) 2010-2019 Free Software Foundation, Inc.
+# warn-on-use.m4 serial 9
+dnl Copyright (C) 2010-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -30,17 +30,15 @@
        [AH_TEMPLATE([HAVE_RAW_DECL_]AS_TR_CPP(m4_defn([gl_decl])),
          [Define to 1 if ]m4_defn([gl_decl])[ is declared even after
           undefining macros.])])dnl
-dnl FIXME: gl_Symbol must be used unquoted until we can assume
-dnl autoconf 2.64 or newer.
      for gl_func in m4_flatten([$2]); do
        AS_VAR_PUSHDEF([gl_Symbol], [gl_cv_have_raw_decl_$gl_func])dnl
        AC_CACHE_CHECK([whether $gl_func is declared without a macro],
-         gl_Symbol,
+         [gl_Symbol],
          [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$1],
-[@%:@undef $gl_func
-  (void) $gl_func;])],
-           [AS_VAR_SET(gl_Symbol, [yes])], [AS_VAR_SET(gl_Symbol, [no])])])
-       AS_VAR_IF(gl_Symbol, [yes],
+[[#undef $gl_func
+  (void) $gl_func;]])],
+           [AS_VAR_SET([gl_Symbol], [yes])], [AS_VAR_SET([gl_Symbol], [no])])])
+       AS_VAR_IF([gl_Symbol], [yes],
          [AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_RAW_DECL_$gl_func]), [1])
           dnl shortcut - if the raw declaration exists, then set a cache
           dnl variable to allow skipping any later AC_CHECK_DECL efforts
diff --git a/m4/warnings.m4 b/m4/warnings.m4
index 235cac6..9e24d89 100644
--- a/m4/warnings.m4
+++ b/m4/warnings.m4
@@ -1,5 +1,5 @@
-# warnings.m4 serial 14
-dnl Copyright (C) 2008-2019 Free Software Foundation, Inc.
+# warnings.m4 serial 16
+dnl Copyright (C) 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -23,8 +23,6 @@
 # The effects of this macro depend on the current language (_AC_LANG).
 AC_DEFUN([gl_COMPILER_OPTION_IF],
 [
-dnl FIXME: gl_Warn must be used unquoted until we can assume Autoconf
-dnl 2.64 or newer.
 AS_VAR_PUSHDEF([gl_Warn], [gl_cv_warn_[]_AC_LANG_ABBREV[]_$1])dnl
 AS_VAR_PUSHDEF([gl_Flags], [_AC_LANG_PREFIX[]FLAGS])dnl
 AS_LITERAL_IF([$1],
@@ -34,13 +32,13 @@
   -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;;
 esac
 m4_pushdef([gl_Positive], [$gl_positive])])dnl
-AC_CACHE_CHECK([whether _AC_LANG compiler handles $1], m4_defn([gl_Warn]), [
+AC_CACHE_CHECK([whether _AC_LANG compiler handles $1], [gl_Warn], [
   gl_save_compiler_FLAGS="$gl_Flags"
   gl_AS_VAR_APPEND(m4_defn([gl_Flags]),
     [" $gl_unknown_warnings_are_errors ]m4_defn([gl_Positive])["])
-  AC_LINK_IFELSE([m4_default([$4], [AC_LANG_PROGRAM([])])],
-                 [AS_VAR_SET(gl_Warn, [yes])],
-                 [AS_VAR_SET(gl_Warn, [no])])
+  AC_LINK_IFELSE([m4_default([$4], [AC_LANG_PROGRAM([[]])])],
+                 [AS_VAR_SET([gl_Warn], [yes])],
+                 [AS_VAR_SET([gl_Warn], [no])])
   gl_Flags="$gl_save_compiler_FLAGS"
 ])
 AS_VAR_IF(gl_Warn, [yes], [$2], [$3])
@@ -59,8 +57,7 @@
 [_AC_LANG_DISPATCH([$0], _AC_LANG, $@)])
 
 # Specialization for _AC_LANG = C. This macro can be AC_REQUIREd.
-# Use of m4_defun rather than AC_DEFUN works around a bug in autoconf < 2.63b.
-m4_defun([gl_UNKNOWN_WARNINGS_ARE_ERRORS(C)],
+AC_DEFUN([gl_UNKNOWN_WARNINGS_ARE_ERRORS(C)],
 [
   AC_LANG_PUSH([C])
   gl_UNKNOWN_WARNINGS_ARE_ERRORS_IMPL
@@ -68,8 +65,7 @@
 ])
 
 # Specialization for _AC_LANG = C++. This macro can be AC_REQUIREd.
-# Use of m4_defun rather than AC_DEFUN works around a bug in autoconf < 2.63b.
-m4_defun([gl_UNKNOWN_WARNINGS_ARE_ERRORS(C++)],
+AC_DEFUN([gl_UNKNOWN_WARNINGS_ARE_ERRORS(C++)],
 [
   AC_LANG_PUSH([C++])
   gl_UNKNOWN_WARNINGS_ARE_ERRORS_IMPL
@@ -77,8 +73,7 @@
 ])
 
 # Specialization for _AC_LANG = Objective C. This macro can be AC_REQUIREd.
-# Use of m4_defun rather than AC_DEFUN works around a bug in autoconf < 2.63b.
-m4_defun([gl_UNKNOWN_WARNINGS_ARE_ERRORS(Objective C)],
+AC_DEFUN([gl_UNKNOWN_WARNINGS_ARE_ERRORS(Objective C)],
 [
   AC_LANG_PUSH([Objective C])
   gl_UNKNOWN_WARNINGS_ARE_ERRORS_IMPL
diff --git a/m4/wchar_h.m4 b/m4/wchar_h.m4
index 8c6ebcc..818b319 100644
--- a/m4/wchar_h.m4
+++ b/m4/wchar_h.m4
@@ -1,15 +1,15 @@
 dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues.
 
-dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl Written by Eric Blake.
 
-# wchar_h.m4 serial 44
+# wchar_h.m4 serial 53
 
-AC_DEFUN([gl_WCHAR_H],
+AC_DEFUN_ONCE([gl_WCHAR_H],
 [
   AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
   AC_REQUIRE([gl_WCHAR_H_INLINE_OK])
@@ -40,23 +40,24 @@
   dnl Check for declarations of anything we want to poison if the
   dnl corresponding gnulib module is not in use.
   gl_WARN_ON_USE_PREPARE([[
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#if !(defined __GLIBC__ && !defined __UCLIBC__)
-# include <stddef.h>
-# include <stdio.h>
-# include <time.h>
-#endif
-#include <wchar.h>
+      #include <wchar.h>
     ]],
     [btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb
-     wcsrtombs wcsnrtombs wcwidth wmemchr wmemcmp wmemcpy wmemmove wmemset
+     wcsrtombs wcsnrtombs wcwidth
+     wmemchr wmemcmp wmemcpy wmemmove wmempcpy wmemset
      wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp
      wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr
      wcscspn wcsspn wcspbrk wcsstr wcstok wcswidth wcsftime
     ])
+
+  AC_REQUIRE([AC_C_RESTRICT])
+
+  AC_CHECK_DECLS([wcsdup], [], [], [[
+      #include <wchar.h>
+    ]])
+  if test $ac_cv_have_decl_wcsdup = no; then
+    HAVE_DECL_WCSDUP=0
+  fi
 ])
 
 dnl Check whether <wchar.h> is usable at all.
@@ -67,56 +68,49 @@
   dnl and <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>. In summary,
   dnl glibc version 2.5 or older, together with gcc version 4.3 or newer and
   dnl the option -std=c99 or -std=gnu99, leads to a broken <wchar.h>.
+  AC_REQUIRE([AC_CANONICAL_HOST])
   AC_CACHE_CHECK([whether <wchar.h> uses 'inline' correctly],
     [gl_cv_header_wchar_h_correct_inline],
     [gl_cv_header_wchar_h_correct_inline=yes
-     AC_LANG_CONFTEST([
-       AC_LANG_SOURCE([[#define wcstod renamed_wcstod
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-extern int zero (void);
-int main () { return zero(); }
-]])])
-     dnl Do not rename the object file from conftest.$ac_objext to
-     dnl conftest1.$ac_objext, as this will cause the link to fail on
-     dnl z/OS when using the XPLINK object format (due to duplicate
-     dnl CSECT names). Instead, temporarily redefine $ac_compile so
-     dnl that the object file has the latter name from the start.
-     save_ac_compile="$ac_compile"
-     ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/`
-     if echo '#include "conftest.c"' >conftest1.c &&
-        AC_TRY_EVAL([ac_compile]); then
-       AC_LANG_CONFTEST([
-         AC_LANG_SOURCE([[#define wcstod renamed_wcstod
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-int zero (void) { return 0; }
-]])])
-       dnl See note above about renaming object files.
-       ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/`
-       if echo '#include "conftest.c"' >conftest2.c &&
-          AC_TRY_EVAL([ac_compile]); then
-         if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then
-           :
-         else
-           gl_cv_header_wchar_h_correct_inline=no
+     case "$host_os" in
+       *-gnu* | gnu*)
+         AC_LANG_CONFTEST([
+           AC_LANG_SOURCE([[
+             #define wcstod renamed_wcstod
+             #include <wchar.h>
+             extern int zero (void);
+             int main () { return zero(); }
+           ]])])
+         dnl Do not rename the object file from conftest.$ac_objext to
+         dnl conftest1.$ac_objext, as this will cause the link to fail on
+         dnl z/OS when using the XPLINK object format (due to duplicate
+         dnl CSECT names). Instead, temporarily redefine $ac_compile so
+         dnl that the object file has the latter name from the start.
+         save_ac_compile="$ac_compile"
+         ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/`
+         if echo '#include "conftest.c"' >conftest1.c \
+            && AC_TRY_EVAL([ac_compile]); then
+           AC_LANG_CONFTEST([
+             AC_LANG_SOURCE([[
+               #define wcstod renamed_wcstod
+               #include <wchar.h>
+               int zero (void) { return 0; }
+             ]])])
+           dnl See note above about renaming object files.
+           ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/`
+           if echo '#include "conftest.c"' >conftest2.c \
+              && AC_TRY_EVAL([ac_compile]); then
+             if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then
+               :
+             else
+               gl_cv_header_wchar_h_correct_inline=no
+             fi
+           fi
          fi
-       fi
-     fi
-     ac_compile="$save_ac_compile"
-     rm -f conftest[12].c conftest[12].$ac_objext conftest$ac_exeext
+         ac_compile="$save_ac_compile"
+         rm -f conftest[12].c conftest[12].$ac_objext conftest$ac_exeext
+         ;;
+     esac
     ])
   if test $gl_cv_header_wchar_h_correct_inline = no; then
     AC_MSG_ERROR([<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
@@ -131,57 +125,75 @@
   fi
 ])
 
+# gl_WCHAR_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_WCHAR_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_WCHAR_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_WCHAR_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_WCHAR_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_BTOWC])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCTOB])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSINIT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBRTOWC])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBRLEN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSRTOWCS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSNRTOWCS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCRTOMB])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSRTOMBS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNRTOMBS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCWIDTH])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMCHR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMCMP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMCPY])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMMOVE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMPCPY])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMSET])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSLEN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNLEN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCPY])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCPCPY])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCPY])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCPNCPY])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCAT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCMP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCMP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCASECMP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCASECMP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCOLL])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSXFRM])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSDUP])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCHR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSRCHR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCSPN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSSPN])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSPBRK])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSSTR])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSTOK])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSWIDTH])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSFTIME])
+    dnl Support Microsoft deprecated alias function names by default.
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_WCSDUP], [1])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_WCHAR_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_WCHAR_H_DEFAULTS],
 [
-  GNULIB_BTOWC=0;       AC_SUBST([GNULIB_BTOWC])
-  GNULIB_WCTOB=0;       AC_SUBST([GNULIB_WCTOB])
-  GNULIB_MBSINIT=0;     AC_SUBST([GNULIB_MBSINIT])
-  GNULIB_MBRTOWC=0;     AC_SUBST([GNULIB_MBRTOWC])
-  GNULIB_MBRLEN=0;      AC_SUBST([GNULIB_MBRLEN])
-  GNULIB_MBSRTOWCS=0;   AC_SUBST([GNULIB_MBSRTOWCS])
-  GNULIB_MBSNRTOWCS=0;  AC_SUBST([GNULIB_MBSNRTOWCS])
-  GNULIB_WCRTOMB=0;     AC_SUBST([GNULIB_WCRTOMB])
-  GNULIB_WCSRTOMBS=0;   AC_SUBST([GNULIB_WCSRTOMBS])
-  GNULIB_WCSNRTOMBS=0;  AC_SUBST([GNULIB_WCSNRTOMBS])
-  GNULIB_WCWIDTH=0;     AC_SUBST([GNULIB_WCWIDTH])
-  GNULIB_WMEMCHR=0;     AC_SUBST([GNULIB_WMEMCHR])
-  GNULIB_WMEMCMP=0;     AC_SUBST([GNULIB_WMEMCMP])
-  GNULIB_WMEMCPY=0;     AC_SUBST([GNULIB_WMEMCPY])
-  GNULIB_WMEMMOVE=0;    AC_SUBST([GNULIB_WMEMMOVE])
-  GNULIB_WMEMSET=0;     AC_SUBST([GNULIB_WMEMSET])
-  GNULIB_WCSLEN=0;      AC_SUBST([GNULIB_WCSLEN])
-  GNULIB_WCSNLEN=0;     AC_SUBST([GNULIB_WCSNLEN])
-  GNULIB_WCSCPY=0;      AC_SUBST([GNULIB_WCSCPY])
-  GNULIB_WCPCPY=0;      AC_SUBST([GNULIB_WCPCPY])
-  GNULIB_WCSNCPY=0;     AC_SUBST([GNULIB_WCSNCPY])
-  GNULIB_WCPNCPY=0;     AC_SUBST([GNULIB_WCPNCPY])
-  GNULIB_WCSCAT=0;      AC_SUBST([GNULIB_WCSCAT])
-  GNULIB_WCSNCAT=0;     AC_SUBST([GNULIB_WCSNCAT])
-  GNULIB_WCSCMP=0;      AC_SUBST([GNULIB_WCSCMP])
-  GNULIB_WCSNCMP=0;     AC_SUBST([GNULIB_WCSNCMP])
-  GNULIB_WCSCASECMP=0;  AC_SUBST([GNULIB_WCSCASECMP])
-  GNULIB_WCSNCASECMP=0; AC_SUBST([GNULIB_WCSNCASECMP])
-  GNULIB_WCSCOLL=0;     AC_SUBST([GNULIB_WCSCOLL])
-  GNULIB_WCSXFRM=0;     AC_SUBST([GNULIB_WCSXFRM])
-  GNULIB_WCSDUP=0;      AC_SUBST([GNULIB_WCSDUP])
-  GNULIB_WCSCHR=0;      AC_SUBST([GNULIB_WCSCHR])
-  GNULIB_WCSRCHR=0;     AC_SUBST([GNULIB_WCSRCHR])
-  GNULIB_WCSCSPN=0;     AC_SUBST([GNULIB_WCSCSPN])
-  GNULIB_WCSSPN=0;      AC_SUBST([GNULIB_WCSSPN])
-  GNULIB_WCSPBRK=0;     AC_SUBST([GNULIB_WCSPBRK])
-  GNULIB_WCSSTR=0;      AC_SUBST([GNULIB_WCSSTR])
-  GNULIB_WCSTOK=0;      AC_SUBST([GNULIB_WCSTOK])
-  GNULIB_WCSWIDTH=0;    AC_SUBST([GNULIB_WCSWIDTH])
-  GNULIB_WCSFTIME=0;    AC_SUBST([GNULIB_WCSFTIME])
   dnl Assume proper GNU behavior unless another module says otherwise.
   HAVE_BTOWC=1;         AC_SUBST([HAVE_BTOWC])
   HAVE_MBSINIT=1;       AC_SUBST([HAVE_MBSINIT])
@@ -196,6 +208,7 @@
   HAVE_WMEMCMP=1;       AC_SUBST([HAVE_WMEMCMP])
   HAVE_WMEMCPY=1;       AC_SUBST([HAVE_WMEMCPY])
   HAVE_WMEMMOVE=1;      AC_SUBST([HAVE_WMEMMOVE])
+  HAVE_WMEMPCPY=1;      AC_SUBST([HAVE_WMEMPCPY])
   HAVE_WMEMSET=1;       AC_SUBST([HAVE_WMEMSET])
   HAVE_WCSLEN=1;        AC_SUBST([HAVE_WCSLEN])
   HAVE_WCSNLEN=1;       AC_SUBST([HAVE_WCSNLEN])
@@ -222,6 +235,7 @@
   HAVE_WCSWIDTH=1;      AC_SUBST([HAVE_WCSWIDTH])
   HAVE_WCSFTIME=1;      AC_SUBST([HAVE_WCSFTIME])
   HAVE_DECL_WCTOB=1;    AC_SUBST([HAVE_DECL_WCTOB])
+  HAVE_DECL_WCSDUP=1;   AC_SUBST([HAVE_DECL_WCSDUP])
   HAVE_DECL_WCWIDTH=1;  AC_SUBST([HAVE_DECL_WCWIDTH])
   REPLACE_MBSTATE_T=0;  AC_SUBST([REPLACE_MBSTATE_T])
   REPLACE_BTOWC=0;      AC_SUBST([REPLACE_BTOWC])
diff --git a/m4/wchar_t.m4 b/m4/wchar_t.m4
index 5db5815..34db10e 100644
--- a/m4/wchar_t.m4
+++ b/m4/wchar_t.m4
@@ -1,5 +1,5 @@
 # wchar_t.m4 serial 4 (gettext-0.18.2)
-dnl Copyright (C) 2002-2003, 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2002-2003, 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/wctype_h.m4 b/m4/wctype_h.m4
index d5acb72..7d74212 100644
--- a/m4/wctype_h.m4
+++ b/m4/wctype_h.m4
@@ -1,15 +1,15 @@
-# wctype_h.m4 serial 22
+# wctype_h.m4 serial 30
 
 dnl A placeholder for ISO C99 <wctype.h>, for platforms that lack it.
 
-dnl Copyright (C) 2006-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2006-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl Written by Paul Eggert.
 
-AC_DEFUN([gl_WCTYPE_H],
+AC_DEFUN_ONCE([gl_WCTYPE_H],
 [
   AC_REQUIRE([gl_WCTYPE_H_DEFAULTS])
   AC_REQUIRE([AC_PROG_CC])
@@ -41,13 +41,6 @@
         [
           AC_RUN_IFELSE(
             [AC_LANG_SOURCE([[
-               /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
-                  included before <wchar.h>.
-                  BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
-                  must be included before <wchar.h>.  */
-               #include <stddef.h>
-               #include <stdio.h>
-               #include <time.h>
                #include <wchar.h>
                #include <wctype.h>
                int main () { return iswprint ('x') == 0; }
@@ -57,7 +50,7 @@
              AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdlib.h>
                           #if __GNU_LIBRARY__ == 1
                           Linux libc5 i18n is broken.
-                          #endif]], [])],
+                          #endif]], [[]])],
               [gl_cv_func_iswcntrl_works="guessing yes"],
               [gl_cv_func_iswcntrl_works="guessing no"])
             ])
@@ -69,7 +62,7 @@
   fi
   AC_SUBST([HAVE_WCTYPE_H])
 
-  if test $GNULIB_OVERRIDES_WINT_T = 1; then
+  if test $GNULIBHEADERS_OVERRIDE_WINT_T = 1; then
     REPLACE_ISWCNTRL=1
   else
     case "$gl_cv_func_iswcntrl_works" in
@@ -92,14 +85,7 @@
       REPLACE_TOWLOWER=0
     else
       AC_CHECK_DECLS([towlower],,,
-        [[/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
-             included before <wchar.h>.
-             BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
-             must be included before <wchar.h>.  */
-          #include <stddef.h>
-          #include <stdio.h>
-          #include <time.h>
-          #include <wchar.h>
+        [[#include <wchar.h>
           #if HAVE_WCTYPE_H
           # include <wctype.h>
           #endif
@@ -128,14 +114,7 @@
   AC_CACHE_CHECK([for wctype_t], [gl_cv_type_wctype_t],
     [AC_COMPILE_IFELSE(
        [AC_LANG_PROGRAM(
-          [[/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
-               included before <wchar.h>.
-               BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
-               must be included before <wchar.h>.  */
-            #include <stddef.h>
-            #include <stdio.h>
-            #include <time.h>
-            #include <wchar.h>
+          [[#include <wchar.h>
             #if HAVE_WCTYPE_H
             # include <wctype.h>
             #endif
@@ -154,14 +133,7 @@
   AC_CACHE_CHECK([for wctrans_t], [gl_cv_type_wctrans_t],
     [AC_COMPILE_IFELSE(
        [AC_LANG_PROGRAM(
-          [[/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
-               included before <wchar.h>.
-               BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
-               must be included before <wchar.h>.  */
-            #include <stddef.h>
-            #include <stdio.h>
-            #include <time.h>
-            #include <wchar.h>
+          [[#include <wchar.h>
             #include <wctype.h>
             wctrans_t a;
           ]],
@@ -176,14 +148,7 @@
   dnl Check for declarations of anything we want to poison if the
   dnl corresponding gnulib module is not in use.
   gl_WARN_ON_USE_PREPARE([[
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
 #if !(defined __GLIBC__ && !defined __UCLIBC__)
-# include <stddef.h>
-# include <stdio.h>
-# include <time.h>
 # include <wchar.h>
 #endif
 #include <wctype.h>
@@ -192,25 +157,44 @@
     ])
 ])
 
+# gl_WCTYPE_MODULE_INDICATOR([modulename])
+# sets the shell variable that indicates the presence of the given module
+# to a C preprocessor expression that will evaluate to 1.
+# This macro invocation must not occur in macros that are AC_REQUIREd.
 AC_DEFUN([gl_WCTYPE_MODULE_INDICATOR],
 [
-  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
-  AC_REQUIRE([gl_WCTYPE_H_DEFAULTS])
+  dnl Ensure to expand the default settings once only.
+  gl_WCTYPE_H_REQUIRE_DEFAULTS
   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
   dnl Define it also as a C macro, for the benefit of the unit tests.
   gl_MODULE_INDICATOR_FOR_TESTS([$1])
 ])
 
+# Initializes the default values for AC_SUBSTed shell variables.
+# This macro must not be AC_REQUIREd.  It must only be invoked, and only
+# outside of macros or in macros that are not AC_REQUIREd.
+AC_DEFUN([gl_WCTYPE_H_REQUIRE_DEFAULTS],
+[
+  m4_defun(GL_MODULE_INDICATOR_PREFIX[_WCTYPE_H_MODULE_INDICATOR_DEFAULTS], [
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISWBLANK])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISWDIGIT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISWXDIGIT])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCTYPE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISWCTYPE])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCTRANS])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TOWCTRANS])
+  ])
+  m4_require(GL_MODULE_INDICATOR_PREFIX[_WCTYPE_H_MODULE_INDICATOR_DEFAULTS])
+  AC_REQUIRE([gl_WCTYPE_H_DEFAULTS])
+])
+
 AC_DEFUN([gl_WCTYPE_H_DEFAULTS],
 [
-  GNULIB_ISWBLANK=0;    AC_SUBST([GNULIB_ISWBLANK])
-  GNULIB_WCTYPE=0;      AC_SUBST([GNULIB_WCTYPE])
-  GNULIB_ISWCTYPE=0;    AC_SUBST([GNULIB_ISWCTYPE])
-  GNULIB_WCTRANS=0;     AC_SUBST([GNULIB_WCTRANS])
-  GNULIB_TOWCTRANS=0;   AC_SUBST([GNULIB_TOWCTRANS])
   dnl Assume proper GNU behavior unless another module says otherwise.
   HAVE_ISWBLANK=1;      AC_SUBST([HAVE_ISWBLANK])
   HAVE_WCTYPE_T=1;      AC_SUBST([HAVE_WCTYPE_T])
   HAVE_WCTRANS_T=1;     AC_SUBST([HAVE_WCTRANS_T])
   REPLACE_ISWBLANK=0;   AC_SUBST([REPLACE_ISWBLANK])
+  REPLACE_ISWDIGIT=0;   AC_SUBST([REPLACE_ISWDIGIT])
+  REPLACE_ISWXDIGIT=0;  AC_SUBST([REPLACE_ISWXDIGIT])
 ])
diff --git a/m4/wcwidth.m4 b/m4/wcwidth.m4
index cb5935a..2ac2a51 100644
--- a/m4/wcwidth.m4
+++ b/m4/wcwidth.m4
@@ -1,5 +1,5 @@
-# wcwidth.m4 serial 30
-dnl Copyright (C) 2006-2019 Free Software Foundation, Inc.
+# wcwidth.m4 serial 34
+dnl Copyright (C) 2006-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -19,17 +19,8 @@
   AC_CHECK_FUNCS_ONCE([wcwidth])
 
   AC_CHECK_DECLS([wcwidth], [], [], [[
-/* AIX 3.2.5 declares wcwidth in <string.h>. */
-#include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
-   before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
-]])
+    #include <wchar.h>
+  ]])
   if test $ac_cv_have_decl_wcwidth != yes; then
     HAVE_DECL_WCWIDTH=0
   fi
@@ -50,8 +41,10 @@
   if test $ac_cv_func_wcwidth = yes || test $gl_cv_func_wcwidth_macro = yes; then
     HAVE_WCWIDTH=1
     dnl On Mac OS X 10.3, wcwidth(0x0301) (COMBINING ACUTE ACCENT) returns 1.
-    dnl On OpenBSD 5.0, wcwidth(0x05B0) (HEBREW POINT SHEVA) returns 1.
-    dnl On OSF/1 5.1, wcwidth(0x200B) (ZERO WIDTH SPACE) returns 1.
+    dnl On NetBSD 9.0, OpenBSD 5.0, MidnightBSD 1.1,
+    dnl wcwidth(0x05B0) (HEBREW POINT SHEVA) returns 1.
+    dnl On NetBSD 9.0, MidnightBSD 1.1, OSF/1 5.1,
+    dnl wcwidth(0x200B) (ZERO WIDTH SPACE) returns 1.
     dnl On OpenBSD 5.8, wcwidth(0xFF1A) (FULLWIDTH COLON) returns 0.
     dnl This leads to bugs in 'ls' (coreutils).
     dnl On Solaris 11.4, wcwidth(0x2202) (PARTIAL DIFFERENTIAL) returns 2,
@@ -62,15 +55,6 @@
         AC_RUN_IFELSE(
           [AC_LANG_SOURCE([[
 #include <locale.h>
-/* AIX 3.2.5 declares wcwidth in <string.h>. */
-#include <string.h>
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
-   before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
 #include <wchar.h>
 #if !HAVE_DECL_WCWIDTH
 extern
diff --git a/m4/wint_t.m4 b/m4/wint_t.m4
index 61e8a23..a49c508 100644
--- a/m4/wint_t.m4
+++ b/m4/wint_t.m4
@@ -1,5 +1,5 @@
-# wint_t.m4 serial 7
-dnl Copyright (C) 2003, 2007-2019 Free Software Foundation, Inc.
+# wint_t.m4 serial 11
+dnl Copyright (C) 2003, 2007-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -14,15 +14,7 @@
   AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t],
     [AC_COMPILE_IFELSE(
        [AC_LANG_PROGRAM(
-          [[
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
-   before <wchar.h>.  */
-#include <stddef.h>
-#include <stdio.h>
-#include <time.h>
-#include <wchar.h>
+          [[#include <wchar.h>
             wint_t foo = (wchar_t)'\0';]],
           [[]])],
        [gt_cv_c_wint_t=yes],
@@ -32,33 +24,24 @@
 
     dnl Determine whether gnulib's <wchar.h> or <wctype.h> would, if present,
     dnl override 'wint_t'.
-    AC_CACHE_CHECK([whether wint_t is too small],
-      [gl_cv_type_wint_t_too_small],
+    AC_CACHE_CHECK([whether wint_t is large enough],
+      [gl_cv_type_wint_t_large_enough],
       [AC_COMPILE_IFELSE(
-           [AC_LANG_PROGRAM([[
-/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
-   <wchar.h>.
-   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
-   included before <wchar.h>.  */
-#if !(defined __GLIBC__ && !defined __UCLIBC__)
-# include <stddef.h>
-# include <stdio.h>
-# include <time.h>
-#endif
-#include <wchar.h>
+         [AC_LANG_PROGRAM(
+            [[#include <wchar.h>
               int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1];
-              ]])],
-           [gl_cv_type_wint_t_too_small=no],
-           [gl_cv_type_wint_t_too_small=yes])])
-    if test $gl_cv_type_wint_t_too_small = yes; then
-      GNULIB_OVERRIDES_WINT_T=1
+            ]])],
+         [gl_cv_type_wint_t_large_enough=yes],
+         [gl_cv_type_wint_t_large_enough=no])])
+    if test $gl_cv_type_wint_t_large_enough = no; then
+      GNULIBHEADERS_OVERRIDE_WINT_T=1
     else
-      GNULIB_OVERRIDES_WINT_T=0
+      GNULIBHEADERS_OVERRIDE_WINT_T=0
     fi
   else
-    GNULIB_OVERRIDES_WINT_T=0
+    GNULIBHEADERS_OVERRIDE_WINT_T=0
   fi
-  AC_SUBST([GNULIB_OVERRIDES_WINT_T])
+  AC_SUBST([GNULIBHEADERS_OVERRIDE_WINT_T])
 ])
 
 dnl Prerequisites of the 'wint_t' override.
diff --git a/m4/xalloc.m4 b/m4/xalloc.m4
index dfff943..8fabf1c 100644
--- a/m4/xalloc.m4
+++ b/m4/xalloc.m4
@@ -1,5 +1,5 @@
 # xalloc.m4 serial 18
-dnl Copyright (C) 2002-2006, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2002-2006, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/xsize.m4 b/m4/xsize.m4
index f2898ba..64e8a4f 100644
--- a/m4/xsize.m4
+++ b/m4/xsize.m4
@@ -1,5 +1,5 @@
 # xsize.m4 serial 5
-dnl Copyright (C) 2003-2004, 2008-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2003-2004, 2008-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/xstrndup.m4 b/m4/xstrndup.m4
index 32dc51b..cb05307 100644
--- a/m4/xstrndup.m4
+++ b/m4/xstrndup.m4
@@ -1,5 +1,5 @@
 # xstrndup.m4 serial 2
-dnl Copyright (C) 2003, 2009-2019 Free Software Foundation, Inc.
+dnl Copyright (C) 2003, 2009-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
diff --git a/m4/year2038.m4 b/m4/year2038.m4
new file mode 100644
index 0000000..da0f8d7
--- /dev/null
+++ b/m4/year2038.m4
@@ -0,0 +1,124 @@
+# year2038.m4 serial 7
+dnl Copyright (C) 2017-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Attempt to ensure that 'time_t' can go past the year 2038 and that
+dnl the functions 'time', 'stat', etc. work with post-2038 timestamps.
+
+AC_DEFUN([gl_YEAR2038_EARLY],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  case "$host_os" in
+    mingw*)
+      AC_DEFINE([__MINGW_USE_VC2005_COMPAT], [1],
+        [For 64-bit time_t on 32-bit mingw.])
+      ;;
+  esac
+])
+
+# gl_YEAR2038_TEST_INCLUDES
+# -------------------------
+AC_DEFUN([gl_YEAR2038_TEST_INCLUDES],
+[[
+  #include <time.h>
+  /* Check that time_t can represent 2**32 - 1 correctly.  */
+  #define LARGE_TIME_T \\
+    ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30)))
+  int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535
+                           && LARGE_TIME_T % 65537 == 0)
+                          ? 1 : -1];
+]])
+
+# gl_YEAR2038_BODY(REQUIRE-YEAR2038-SAFE)
+-----------------------------------------
+AC_DEFUN([gl_YEAR2038_BODY],
+[
+ AC_ARG_ENABLE([year2038],
+   [  --disable-year2038      omit support for timestamps past the year 2038])
+ AS_IF([test "$enable_year2038" != no],
+ [
+  dnl On many systems, time_t is already a 64-bit type.
+  dnl On those systems where time_t is still 32-bit, it requires kernel
+  dnl and libc support to make it 64-bit. For glibc 2.34 and later on Linux,
+  dnl defining _TIME_BITS=64 and _FILE_OFFSET_BITS=64 is needed on x86 and ARM.
+  dnl
+  dnl On native Windows, the system include files define types __time32_t
+  dnl and __time64_t. By default, time_t is an alias of
+  dnl   - __time32_t on 32-bit mingw,
+  dnl   - __time64_t on 64-bit mingw and on MSVC (since MSVC 8).
+  dnl But when compiling with -D__MINGW_USE_VC2005_COMPAT, time_t is an
+  dnl alias of __time64_t.
+  dnl And when compiling with -D_USE_32BIT_TIME_T, time_t is an alias of
+  dnl __time32_t.
+  AC_CACHE_CHECK([for time_t past the year 2038], [gl_cv_type_time_t_y2038],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_SOURCE([gl_YEAR2038_TEST_INCLUDES])],
+       [gl_cv_type_time_t_y2038=yes], [gl_cv_type_time_t_y2038=no])
+    ])
+  if test "$gl_cv_type_time_t_y2038" = no; then
+    AC_CACHE_CHECK([for 64-bit time_t with _TIME_BITS=64],
+      [gl_cv_type_time_t_bits_macro],
+      [AC_COMPILE_IFELSE(
+         [AC_LANG_SOURCE([[#define _TIME_BITS 64
+                           #define _FILE_OFFSET_BITS 64
+                           ]gl_YEAR2038_TEST_INCLUDES])],
+         [gl_cv_type_time_t_bits_macro=yes],
+         [gl_cv_type_time_t_bits_macro=no])
+      ])
+    if test "$gl_cv_type_time_t_bits_macro" = yes; then
+      AC_DEFINE([_TIME_BITS], [64],
+        [Number of bits in a timestamp, on hosts where this is settable.])
+      dnl AC_SYS_LARGFILE also defines this; it's OK if we do too.
+      AC_DEFINE([_FILE_OFFSET_BITS], [64],
+        [Number of bits in a file offset, on hosts where this is settable.])
+      gl_cv_type_time_t_y2038=yes
+    fi
+  fi
+  if test $gl_cv_type_time_t_y2038 = no; then
+    AC_COMPILE_IFELSE(
+      [AC_LANG_SOURCE(
+         [[#ifdef _USE_32BIT_TIME_T
+             int ok;
+           #else
+             error fail
+           #endif
+         ]])],
+      [AC_MSG_FAILURE(
+         [The 'time_t' type stops working after January 2038.
+          Remove _USE_32BIT_TIME_T from the compiler flags.])],
+      [# If not cross-compiling and $1 says we should check,
+       # and 'touch' works with a large timestamp, then evidently wider time_t
+       # is desired and supported, so fail and ask the builder to fix the
+       # problem.  Otherwise, just warn the builder.
+       m4_ifval([$1],
+         [if test $cross_compiling = no \
+             && TZ=UTC0 touch -t 210602070628.15 conftest.time 2>/dev/null; then
+            case `TZ=UTC0 LC_ALL=C ls -l conftest.time 2>/dev/null` in
+              *'Feb  7  2106'* | *'Feb  7 17:10'*)
+                AC_MSG_FAILURE(
+                  [The 'time_t' type stops working after January 2038,
+                   and your system appears to support a wider 'time_t'.
+                   Try configuring with 'CC="${CC} -m64"'.
+                   To build with a 32-bit time_t anyway (not recommended),
+                   configure with '--disable-year2038'.]);;
+            esac
+            rm -f conftest.time
+          fi])
+       if test "$gl_warned_about_y2038" != yes; then
+         AC_MSG_WARN(
+           [The 'time_t' type stops working after January 2038,
+            and this package needs a wider 'time_t' type
+            if there is any way to access timestamps after that.
+            Configure with 'CC="${CC} -m64"' perhaps?])
+         gl_warned_about_y2038=yes
+       fi
+      ])
+  fi])
+])
+
+AC_DEFUN([gl_YEAR2038],
+[
+  gl_YEAR2038_BODY([require-year2038-safe])
+])
diff --git a/m4/zzgnulib.m4 b/m4/zzgnulib.m4
new file mode 100644
index 0000000..b953384
--- /dev/null
+++ b/m4/zzgnulib.m4
@@ -0,0 +1,23 @@
+# zzgnulib.m4 serial 1
+dnl Copyright (C) 2020-2021 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This file must be named something that sorts after all other
+dnl package- or gnulib-provided .m4 files - at least for those packages
+dnl that redefine AC_PROG_CC.
+
+dnl Redefine AC_PROG_CC so that it ends with invocations of gl_COMPILER_CLANG
+dnl and gl_COMPILER_PREPARE_CHECK_DECL.
+m4_define([AC_PROG_CC],
+  m4_defn([AC_PROG_CC])[
+gl_COMPILER_CLANG
+gl_COMPILER_PREPARE_CHECK_DECL
+])
+
+# gl_ZZGNULIB
+# -----------
+# Witness macro that this file has been included.  Needed to force
+# Automake to include this file after all other gnulib .m4 files.
+AC_DEFUN([gl_ZZGNULIB])
diff --git a/maint.mk b/maint.mk
index b4c2762..0aa6377 100644
--- a/maint.mk
+++ b/maint.mk
@@ -2,7 +2,7 @@
 # This Makefile fragment tries to be general-purpose enough to be
 # used by many projects via the gnulib maintainer-makefile module.
 
-## Copyright (C) 2001-2019 Free Software Foundation, Inc.
+## Copyright (C) 2001-2021 Free Software Foundation, Inc.
 ##
 ## This program is free software: you can redistribute it and/or modify
 ## it under the terms of the GNU General Public License as published by
@@ -64,7 +64,11 @@
 
 # You can override this variable in cfg.mk if your gnulib submodule lives
 # in a different location.
-gnulib_dir ?= $(srcdir)/gnulib
+gnulib_dir ?= $(shell if test -d $(srcdir)/gnulib; then \
+			echo $(srcdir)/gnulib; \
+		else \
+			echo ${GNULIB_SRCDIR}; \
+		fi)
 
 # You can override this variable in cfg.mk to set your own regexp
 # matching files to ignore.
@@ -163,7 +167,7 @@
 _cfg_mk := $(wildcard $(srcdir)/cfg.mk)
 
 # Collect the names of rules starting with 'sc_'.
-syntax-check-rules := $(sort $(shell $(SED) -n \
+syntax-check-rules := $(sort $(shell env LC_ALL=C $(SED) -n \
    's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' $(srcdir)/$(ME) $(_cfg_mk)))
 .PHONY: $(syntax-check-rules)
 
@@ -442,7 +446,7 @@
 	    $(SED) -ne '/Makefile/{s/\.in$$//;p;}' |			\
 	    while read m; do						\
 	      $(MAKE) -qp -f $$m .DUMMY-TARGET 2>/dev/null |		\
-	        $(AWK) -v file=$$m -e '$($@_awk_)' || exit 1;		\
+		$(AWK) -v file=$$m -e '$($@_awk_)' || exit 1;		\
 	    done;							\
 	fi
 
@@ -915,7 +919,7 @@
 		dummy /dev/null						\
 	    && { printf '$(ME): define the above'			\
 			' via some gnulib .h file\n' 1>&2;		\
-	         exit 1; }						\
+		 exit 1; }						\
 	    || :;							\
 	fi
 # ==================================================================
@@ -1027,7 +1031,7 @@
     -e '  }'
 
 prohibit_doubled_words_ = \
-    the then in an on if is it but for or at and do to
+    the then in an on if is it but for or at and do to can
 # expand the regex before running the check to avoid using expensive captures
 prohibit_doubled_word_expanded_ = \
     $(join $(prohibit_doubled_words_),$(addprefix \s+,$(prohibit_doubled_words_)))
@@ -1405,7 +1409,7 @@
 announcement_mail_Cc_beta = $(announcement_mail_Cc_alpha)
 announcement_mail_headers_beta = $(announcement_mail_headers_alpha)
 
-announcement_mail_Cc_ ?= $(announcement_mail_Cc_$(release-type))
+announcement_Cc_ ?= $(announcement_Cc_$(release-type))
 announcement_mail_headers_ ?= $(announcement_mail_headers_$(release-type))
 announcement: NEWS ChangeLog $(rel-files)
 # Not $(AM_V_GEN) since the output of this command serves as
@@ -1422,7 +1426,6 @@
 	    --bootstrap-tools=$(bootstrap-tools)			\
 	    $$(case ,$(bootstrap-tools), in (*,gnulib,*)		\
 	       echo --gnulib-version=$(gnulib-version);; esac)		\
-	    --no-print-checksums					\
 	    $(addprefix --url-dir=, $(url_dir_list))
 
 .PHONY: release-commit
@@ -1628,12 +1631,32 @@
 	ls $(PODIR)/*.po | $(SED) 's/\.po//;s,$(PODIR)/,,' | \
 	  sort >> $(PODIR)/LINGUAS
 
- # Running indent once is not idempotent, but running it twice is.
+# Indentation
+
+indent_args ?= -ppi 1
+C_SOURCES ?= $$($(VC_LIST_EXCEPT) | grep '\.[ch]\(.in\)\?$$')
 INDENT_SOURCES ?= $(C_SOURCES)
+exclude_file_name_regexp--indent ?= $(exclude_file_name_regexp--sc_indent)
+
 .PHONY: indent
-indent:
-	indent $(INDENT_SOURCES)
-	indent $(INDENT_SOURCES)
+indent: # Running indent once is not idempotent, but running it twice is.
+	$(AM_V_GEN)indent $(indent_args) $(INDENT_SOURCES) && \
+	indent $(indent_args) $(INDENT_SOURCES)
+
+sc_indent:
+	@if ! command -v indent > /dev/null; then			\
+	    echo 1>&2 '$(ME): sc_indent: indent is missing';		\
+	else								\
+	  fail=0; files="$(INDENT_SOURCES)";				\
+	  for f in $$files; do						\
+	    indent $(indent_args) -st $$f				\
+		| indent $(indent_args) -st -				\
+		| diff -u $$f - || fail=1;				\
+	  done;								\
+	  test $$fail = 1 &&						\
+	    { echo 1>&2 '$(ME): code format error, try "make indent"';	\
+	      exit 1; } || :;						\
+	fi
 
 # If you want to set UPDATE_COPYRIGHT_* environment variables,
 # put the assignments in this variable.
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 97f2473..c964767 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,15 +1,20 @@
+examples/c/bistromathic/parse.y
+examples/java/calc/Calc.y
 src/complain.c
 src/conflicts.c
+src/counterexample.c
 src/files.c
 src/fixits.c
 src/getargs.c
 src/gram.c
 src/graphviz.c
+src/i18n-strings.c
 src/location.c
 src/main.c
 src/muscle-tab.c
 src/parse-gram.y
 src/print-graph.c
+src/print-xml.c
 src/print.c
 src/reader.c
 src/reduce.c
diff --git a/po/bg.gmo b/po/bg.gmo
index 38d1889..ad51ccc 100644
--- a/po/bg.gmo
+++ b/po/bg.gmo
Binary files differ
diff --git a/po/bg.po b/po/bg.po
index 9801037..27eab6a 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -1,14 +1,14 @@
 # Bulgarian translation of bison po-file.
-# Copyright (C) 2019 Free Software Foundation, Inc.
+# Copyright (C) 2019, 2020, 2021 Free Software Foundation, Inc.
 # This file is distributed under the same license as the bison package.
-# Alexander Shopov <ash@kambanaria.org>, 2019.
+# Alexander Shopov <ash@kambanaria.org>, 2019, 2020, 2021.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: bison 3.4.91\n"
+"Project-Id-Version: bison 3.7.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-11-23 00:03+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2021-08-13 17:14+0300\n"
 "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
 "Language-Team: Bulgarian <dict@ludost.net>\n"
 "Language: bg\n"
@@ -18,203 +18,364 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr "число"
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr "функция"
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr "променлива"
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr "грешка: деление на 0"
+
+#: examples/c/bistromathic/parse.y:372
+#, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "синтактична грешка: неправилен знак: %c"
+
+#: examples/c/bistromathic/parse.y:389
+msgid "%@: syntax error"
+msgstr "%@: синтактична грешка"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr "%@: синтактична грешка: „%u“ не се очаква"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "%@: синтактична грешка: пред „%u“ се очаква „%0e“"
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "%@: синтактична грешка: пред „%u“ се очакват „%0e“ или „%1e“"
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "%@: синтактична грешка: пред „%u“ се очакват „%0e“, „%1e“ или „%2e“"
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+"%@: синтактична грешка: пред „%u“ се очакват „%0e“, „%1e“, „%2e“ или „%3e“"
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+"%@: синтактична грешка: пред „%u“ се очакват „%0e“, „%1e“, „%2e“, „%3e“, "
+"„%4e“ или „%5e“"
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+"%@: синтактична грешка: пред „%u“ се очакват „%0e“, „%1e“, „%2e“, „%3e“, "
+"„%4e“ или „%5e“"
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+"%@: синтактична грешка: пред „%u“ се очакват „%0e“, „%1e“, „%2e“, „%3e“, "
+"„%4e“, „%5e“ или нещо друго"
+
+#: examples/java/calc/Calc.y:81
+msgid "end of line"
+msgstr "край на ред"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr "конфликти преместване/заместване (стандартно включени)"
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr "конфликти заместване/заместване (стандартно включени)"
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr "генериране на примери за конфликта"
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr "низови литерали без връзка към символ"
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr "остарели конструкции"
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, c-format
 msgid "empty rules without %empty"
 msgstr "празни правила без декларация „%empty“"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr "незададени или неизползвани стойности във вътрешни правила"
 
-#: src/complain.c:120
+#: src/complain.c:160
 msgid "useless precedence and associativity"
 msgstr "непотребни и приоритет, и асоциативност за „%s“"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr "несъвместимости с „yacc“ по POSIX"
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr "всички други предупреждения (стандартно включени)"
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
-msgstr "всички други предупреждения без „dangling-alias“ и „yacc“"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
+msgstr ""
+"всички други предупреждения без „counterexamples“, „dangling-alias“ и „yacc“"
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr "изключване на всички предупреждения от КАТЕГОРИЯта"
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr "изключване на всички предупреждения"
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr "предупрежденията от КАТЕГОРИЯта да са грешки"
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr "Категориите предупреждения включват:"
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "предупреждение"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "грешка"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "фатална грешка"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr "бележка"
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr "„yacc“ по POSIX не поддържа „%s“"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "остаряла директива „%s“, използвайте „%s“"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, c-format
 msgid "duplicate directive"
 msgstr "повторена директива"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, c-format
 msgid "duplicate directive: %s"
 msgstr "повторена директива „%s“"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "предишна декларация"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "позволено е само еднократно ползване на „%s“ за всяко правило"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+msgid "syntax error"
+msgstr "синтактична грешка"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr "„%0$s“ не се очаква"
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr "пред „%0$s“ се очаква „%1$s“"
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr "пред „%0$s“ се очакват „%1$s“ или „%2$s“"
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr "пред „%0$s“ се очакват „%1$s“, „%2$s“ или „%3$s“"
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr "пред „%0$s“ се очакват „%1$s“, „%2$s“, „%3$s“ или „%4$s“"
+
+#: src/conflicts.c:88
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "Конфликтът между правило %d и лексема „%s“ се решава като преместване"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr "Конфликтът между правило %d и лексема „%s“ се решава като извеждане"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "Конфликтът между правило %d и лексема „%s“ се решава като грешка"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Състояние %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "конфликти: %d преместване/опростяване, %d извеждане/извеждане\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "конфликти: %d преместване/извеждане\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "конфликти: %d извеждане/извеждане\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 "конфликти преместване/извеждане за правило %d: открити са %d, а се очакват %d"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 "конфликти извеждане/извеждане за правило %d: открити са %d, а се очакват %d"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "„%%expect-rr“ се отнася само за анализаторите GLR"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "конфликти преместване/извеждане: открити са %d, а се очакват %d"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d конфликт преместване/извеждане"
 msgstr[1] "%d конфликти преместване/извеждане"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "конфликти извеждане/извеждане: открити са %d, а се очакват %d"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d конфликт извеждане/извеждане"
 msgstr[1] "%d конфликти извеждане/извеждане"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+"изпълнете отново с опцията „-Wcounterexamples“, за да се генерират примери "
+"за конфликта"
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr "Пример"
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr "Първи пример"
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr "Втори пример"
+
+#: src/counterexample.c:126
+msgid "Shift derivation"
+msgstr "Получаване на преместване"
+
+#: src/counterexample.c:126
+msgid "First reduce derivation"
+msgstr "Първо получаване на извеждане"
+
+#: src/counterexample.c:128
+msgid "Reduce derivation"
+msgstr "Получаване на извеждане"
+
+#: src/counterexample.c:128
+msgid "Second reduce derivation"
+msgstr "Второ получаване на извеждане"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "конфликт преместване/извеждане при лексема „%s“"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ":"
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "конфликт извеждане/извеждане при лексема „%s“"
+msgstr[1] "конфликт извеждане/извеждане при лексеми „%s“"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: не може да се отвори"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "вх./изх. грешка"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "файл не може да се затвори"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "отказ за презаписване на входния файл „%s“"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "противоречащи си извеждания към файла „%s“"
@@ -224,96 +385,96 @@
 msgid "%s: cannot backup"
 msgstr "%s: неуспешно резервно копиране"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr "оцветяване на изхода"
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr "без оцветяване на изхода"
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr "оцветяване на изхода, ако той е на терминал"
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr "стойността на КОГАТО е една от следните:"
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr "описание на състоянията"
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
-"прибавяне на небходимото за затваряне на основните множества от елементи"
+"прибавяне на необходимото за затваряне на основните множества от елементи"
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr "изрично асоцииране на проверяваните последващи лексеми с елементите"
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 msgid "describe shift/reduce conflicts solving"
 msgstr "извеждане на решенията на конфликтите преместване/извеждане"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr "включване на цялата информация (всичко по-горе)"
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr "без извеждане на информация"
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr "ВИДОВЕте са списък от думи, разделени с „,“, измежду:"
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr "СЪОБЩЕНИЯта са списък от думи, разделени с „,“, измежду:"
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr "посочване на грешките с указател"
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr "корекции подходящи за четене от програми"
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr "без генериране на файлове"
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr "всичко по-горе"
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr "нищо от това по-горе"
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr "ФУНКЦИОНАЛНОСТите са списък от думи, разделени с „,“, измежду:"
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "За повече информация изпълнете „%s --help“.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Употреба: %s [ОПЦИЯ]… ФАЙЛ\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
@@ -322,7 +483,7 @@
 "Генериране на детерминиран LR или обобщен LR (GLR) анализатор\n"
 "ползващ таблици LALR(1), IELR(1) или канонични LR(1).\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
@@ -330,11 +491,11 @@
 "късите\n"
 "варианти.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Същото се отнася и за незадължителните аргументи.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -364,7 +525,7 @@
 "                             включване на различни ФУНКЦИОНАЛНОСТи\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -379,7 +540,7 @@
 "      --style=ФАЙЛ           файл със стилове CSS за оцветяване на\n"
 "                             диагностичните съобщения\n"
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -415,22 +576,26 @@
 "лексемите\n"
 "  -y, --yacc                       режим „yacc“ по POSIX\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
-"ИЗХОД:\n"
-"      --defines[=ФАЙЛ]       генериране и на заглавен ФАЙЛ\n"
+"ИЗХОДНИ ФАЙЛОВЕ:\n"
+"  -H, --header=[ФАЙЛ]        генериране и на заглавен ФАЙЛ\n"
 "  -d                         генериране и на заглавен ФАЙЛ без указване на "
 "име\n"
 "                             (за съвместимост с „yacc“ по POSIX)\n"
@@ -440,57 +605,57 @@
 "  -b, --file-prefix=ПРЕФИКС  ПРЕФИКС за имената на изходните файлове\n"
 "  -o, --output=ФАЙЛ          изходът да се запази в този ФАЙЛ\n"
 "  -g, --graph[=ФАЙЛ]         извеждане и на гра̀фа на автомата\n"
-"  -x, --xml[=ФАЙЛ]           извеждане на информация за автомата във формат\n"
-"                             XML\n"
+"      --html[=ФАЙЛ]          извеждане на информация за автомата във формат "
+"HTLM\n"
+"  -x, --xml[=ФАЙЛ]           извеждане на информация за автомата във формат "
+"XML\n"
+"  -M, --file-prefix-map=СТАР=НОВ\n"
+"                             замяна на СТАРия префикс с този НОВ при "
+"извеждане\n"
+"                             на пътищата към файлове\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr ""
 "Съобщавайте за програмни грешки на %s.\n"
 "За грешки в българския превод на <dict@fsa-bg.org>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "Уеб страница на „%s“: <%s>\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
-msgstr "Обща помощ за програмите на GNU: <https://www.gnu.org/gethelp/>\n"
+#: src/getargs.c:460
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
+msgstr "Обща помощ за програмите на GNU: <https://www.gnu.org/gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 "Докладвайте за грешки и проблеми с превода на <https://translationproject."
-"org/team/bg.html>\n"
+"org/team/bg.html>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr ""
 "За пълната документация изпълнете:\n"
 "  info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (Bison от GNU) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Създаден от Robert Corbett и Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Авторски права © %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -499,36 +664,41 @@
 "копиране.  Тя се разпространява БЕЗ НИКАКВИ ГАРАНЦИИ, дори и косвените за\n"
 "ПРОДАЖБА или СЪОТВЕТСТВИЕ С КАКВАТО И ДА Е УПОТРЕБА.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "грешка е да има повече от една скелетна декларация"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: неправилен език"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "декларирането на множество езици е грешка"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, c-format
+msgid "invalid argument for %s: %s"
+msgstr "неправилен аргумент за „%s“: %s"
+
+#: src/getargs.c:868
 #, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "остаряла опция „%s“, използвайте „%s“"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, c-format
 msgid "missing operand"
 msgstr "липсващ операнд"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "излишен операнд: „%s“"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Граматика"
 
@@ -545,17 +715,25 @@
 "// Уеб страница: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+msgid "end of file"
+msgstr "край на файл"
+
+#: src/i18n-strings.c:36
+msgid "invalid token"
+msgstr "неправилна лексема"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "препълване на но̀мера на ред"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "препълване на но̀мера на колона"
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
 msgstr "препълване на но̀мера на байт"
@@ -565,232 +743,277 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr "…"
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "безполезно правило за анализатора: има конфликти"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 "може да се приложат автоматични поправки.  Изпълнете отново с опцията „--"
 "update“."
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "повторна дефиниция на обявена с „%%define“ променлива: %s"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "предишна дефиниция"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: обявена с „%%define“ променлива няма стойност: %s"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "обявената с „%%define“ променлива „%s“ изисква стойности — „{…}“"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr ""
 "обявената с „%%define“ променлива „%s“ изисква стойности — ключови думи"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "обявената с „%%define“ променлива „%s“ изисква стойности — „\"{…}\"“"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "обявена с „%%define“ булева променлива е с неправилна стойност: %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "обявената с „%%define“ променлива „%s“ е с неправилна стойност: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "приета стойност: „%s“"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr "низ"
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr "низ за превод"
+
+#: src/parse-gram.y:214
+msgid "[identifier]"
+msgstr "[идентификатор]"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr "знаков литерал"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr "епилог"
+
+#: src/parse-gram.y:219
+msgid "identifier"
+msgstr "идентификатор"
+
+#: src/parse-gram.y:220
+msgid "identifier:"
+msgstr "идентификатор:"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr "<етикет>"
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr "целочислен литерал"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr "знакови литерали не може да са нетерминали"
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr "знаковите литерали са несъвместими с „%s“"
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, c-format
 msgid "definition of %s"
 msgstr "дефиниция на „%s“"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "в декларацията на параметър липсва идентификатор"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, c-format
 msgid "invalid version requirement: %s"
 msgstr "неправилно изискване за версия: „%s“"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr "изисква се версия „%s“ на bison, но наличната е „%s“"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Състояние %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr "неуспешно изпълнение на „%s“ с изходен код %d"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "преместване и преминаване към състояние %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "преминаване към състояние %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "грешка (липсва асоциативност)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "заместване чрез правило %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "приемане"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "заместване чрез правило %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$стандартно"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Терминали и правилата, в които са"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Нетерминали и правилата, в които са"
 
-#: src/print.c:416
+#: src/print.c:431
 msgid "on left:"
 msgstr "отляво:"
 
-#: src/print.c:425
+#: src/print.c:440
 msgid "on right:"
 msgstr "отдясно:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Неизползваеми правила в анализатора поради конфликти"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "множество декларации на „%s“"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr ""
 "конфликт при типа на резултата при сливащата функция „%s“: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "повтарящото се име на символа „%s“ се прескача"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "за лексемата „%s“ е дадено правило"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "конфликт в типовете за стандартното действие: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "празно правило за типизиран нетерминал, липсва действие"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "неизползвана стойност: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "изчистване на стойността: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "декларация „%%empty“ при непразно правило"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "празно правило без декларация „%%empty“"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "не е дефинирана лексема за „%%prec“: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr "само при вътрешни правила действията може да са типизирани: „%s“"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "„%s“ се отнася само за анализаторите GLR"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "„%s“ трябва да се следва от положително число"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr "„yacc“ по POSIX не поддържа типизирани действия и при вътрешни правила"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "правилото е твърде дълго"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "началният символ „%s“ не е дефиниран"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "началният символ „%s“ е лексема"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "няма правила във входната граматика"
@@ -799,261 +1022,256 @@
 msgid "rule useless in grammar"
 msgstr "безполезно правило в граматика"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "безполезни нетерминали в граматиката: „%s“"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Безполезни нетерминали в граматиката"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Неизползвани терминали в граматиката"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Безполезни правила в граматиката"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d безполезeн нетерминал в граматиката"
 msgstr[1] "%d безполезни нетерминали в граматиката"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d безполезно правило в граматиката"
 msgstr[1] "%d безполезни правила в граматиката"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "началният символ „%s“ не води до никакво изречение"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "излишна поява на „%s“"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "се отнася за „%c%s“ при „%s“"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "вероятно става дума за „%c“"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", крие „%c“"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr "при „%s“"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", не може да се достъпи от действието при вътрешно правило при $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "цяло число извън диапазона: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "неправилна препратка: „%s“"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 "синтактична грешка след „%c“, очаква се цяло число, буква, „_“, „[“ или „$“"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "символът липсва в правилото преди $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "символът липсва в правилото: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "заблуждаващ указател: „%s“"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "нееднозначен указател: „%s“"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "зададен е изричен тип в граматика без типове"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "„$$“ за вътрешното правило при $%d от %s не е с обявен тип"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "„$$“ от „%s“ е без обявен тип"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "„$%s“ от „%s“ е без обявен ти"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr "множество появи на $%d със „api.value.automove“"
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "грешно число след екраниране с „\\“: „%s“"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "излишна „,“ — приема се за празен знак"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "неправилна директива: „%s“"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "неправилен идентификатор: „%s“"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "неправилни знаци"
 msgstr[1] "неправилен клас знаци"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "неправилен знак „null“"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "неочакван идентификатор в име в квадратни скоби: „%s“"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "очаква се идентификатор"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "неправилен знак в име в квадратни скоби"
 msgstr[1] "неправилни знаци в име в квадратни скоби"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr "„yacc“ по POSIX не поддържа низови литерали"
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "празен знаков литерал"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "излишни знаци в знаковия литерал"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "грешно число след екраниране с „\\“: „%s“"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "неправилен знак след екраниране с „\\“: „%s“"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr "„yacc“ по POSIX не поддържа шестнайсетични литерали"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "в края на файл липсва „%s“"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "в края на ред липсва „%s“"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "директива „%s“ в скелета не е затворена"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "прекалено малко аргументи към директива „%s“ в скелета"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "прекалено много аргументи към директива „%s“ в скелета"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "„yacc“ по POSIX не позволява „-“ в имената на символите: „%s“"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "прекалено много символи във входната граматика (максимумът е %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "„%s“ е повторно деклариране на „%s“"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "„%s“ е повторно деклариране на „<%s>“"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "символът „%s“ е повторно деклариран като лексема"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "повторна декларация на символа „%s“ като нетерминал"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1062,103 +1280,93 @@
 "използваният символ „%s“, не е указан като лексема и няма дефинирани "
 "правила.  „%s“ ли искате да ползвате?"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "използваният символ „%s“, не е указан като лексема и няма дефинирани правила"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr "„yacc“ по POSIX ползва „%%type“ само за нетерминали"
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "повторна декларация на символа „%s“"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
-msgstr "не може да се задава изричен номер на нетерминалите"
+msgid "nonterminals cannot be given a token code"
+msgstr "нетерминалите не могат да имат код на лексема"
 
-#: src/symtab.c:575
+#: src/symtab.c:594
 #, c-format
-msgid "redefining user token number of %s"
-msgstr "повторна дефиниция на но̀мера на потребителската лексема „%s“"
+msgid "redefining code of token %s"
+msgstr "повторна дефиниция на кода на лексемата „%s“"
 
-#: src/symtab.c:578
+#: src/symtab.c:597
 #, c-format
-msgid "user token number of %s too large"
-msgstr "номерът на потребителска лексема на „%s“е прекалено голям"
+msgid "code of token %s too large"
+msgstr "кодът на потребителска лексема на „%s“ е прекалено голям"
 
-#: src/symtab.c:617
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr "низовият литерал „%s“ е без връзка към символ"
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "непотребна декларация „%s“ за типа <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "ползван е типът <%s>, който не е свързан с никой символ"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr "нетерминалите не могат да имат низови псевдоними"
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "символът „%s“ е използван повече от веднъж като низ-литерал"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "символът „%s“ отговаря на повече от един низ-литерал"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "потребителска лексема №%d е повторна декларация на „%s“"
+msgid "code %d reassigned to token %s"
+msgstr "код %d е зададен наново на лексемата „%s“"
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "предишна декларация на „%s“"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr "номерът на лексема е прекалено голям"
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "началният символ „%s“ не е дефиниран"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "началният символ „%s“ е лексема"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "непотребни и приоритет, и асоциативност за „%s“"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "непотребен приоритет за „%s“"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "непотребна асоциативност за „%s, укажете приоритет с „%%precedence“"
diff --git a/po/bison.pot b/po/bison.pot
index 223e920..3493dff 100644
--- a/po/bison.pot
+++ b/po/bison.pot
@@ -6,9 +6,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: GNU bison 3.5\n"
+"Project-Id-Version: GNU bison 3.8.2\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,201 +18,352 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, c-format
+msgid "syntax error: invalid character: %c"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:389
+msgid "%@: syntax error"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr ""
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+
+#: examples/java/calc/Calc.y:81
+msgid "end of line"
+msgstr ""
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr ""
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, c-format
 msgid "empty rules without %empty"
 msgstr ""
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr ""
 
-#: src/complain.c:120
+#: src/complain.c:160
 msgid "useless precedence and associativity"
 msgstr ""
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr ""
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr ""
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr ""
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr ""
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr ""
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr ""
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr ""
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr ""
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr ""
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, c-format
 msgid "duplicate directive"
 msgstr ""
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, c-format
 msgid "duplicate directive: %s"
 msgstr ""
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr ""
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr ""
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+msgid "syntax error"
+msgstr ""
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr ""
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr ""
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr ""
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr ""
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr ""
+
+#: src/conflicts.c:88
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr ""
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr ""
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr ""
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr ""
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr ""
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr ""
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr ""
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr ""
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+msgid "Shift derivation"
+msgstr ""
+
+#: src/counterexample.c:126
+msgid "First reduce derivation"
+msgstr ""
+
+#: src/counterexample.c:128
+msgid "Reduce derivation"
+msgstr ""
+
+#: src/counterexample.c:128
+msgid "Second reduce derivation"
+msgstr ""
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr ""
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr ""
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr ""
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr ""
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr ""
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr ""
@@ -222,111 +373,111 @@
 msgid "%s: cannot backup"
 msgstr ""
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr ""
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr ""
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr ""
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 msgid "describe shift/reduce conflicts solving"
 msgstr ""
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr ""
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr ""
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr ""
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr ""
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr ""
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr ""
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
 "\n"
 msgstr ""
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr ""
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -342,7 +493,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -351,7 +502,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -369,98 +520,101 @@
 "  -y, --yacc                       emulate POSIX Yacc\n"
 msgstr ""
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr ""
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr ""
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr ""
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr ""
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr ""
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr ""
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
 msgstr ""
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr ""
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr ""
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr ""
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, c-format
+msgid "invalid argument for %s: %s"
+msgstr ""
+
+#: src/getargs.c:868
 #, c-format
 msgid "deprecated option: %s, use %s"
 msgstr ""
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, c-format
 msgid "missing operand"
 msgstr ""
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr ""
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr ""
 
@@ -473,17 +627,25 @@
 "\n"
 msgstr ""
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+msgid "end of file"
+msgstr ""
+
+#: src/i18n-strings.c:36
+msgid "invalid token"
+msgstr ""
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr ""
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr ""
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
 msgstr ""
@@ -493,228 +655,273 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr ""
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr ""
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr ""
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr ""
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr ""
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr ""
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr ""
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr ""
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr ""
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr ""
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr ""
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr ""
+
+#: src/parse-gram.y:214
+msgid "[identifier]"
+msgstr ""
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr ""
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+msgid "identifier"
+msgstr ""
+
+#: src/parse-gram.y:220
+msgid "identifier:"
+msgstr ""
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr ""
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr ""
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr ""
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, c-format
 msgid "definition of %s"
 msgstr ""
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr ""
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, c-format
 msgid "invalid version requirement: %s"
 msgstr ""
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr ""
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr ""
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr ""
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr ""
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr ""
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr ""
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr ""
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr ""
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr ""
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr ""
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr ""
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr ""
 
-#: src/print.c:416
+#: src/print.c:431
 msgid "on left:"
 msgstr ""
 
-#: src/print.c:425
+#: src/print.c:440
 msgid "on right:"
 msgstr ""
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr ""
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr ""
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr ""
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr ""
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr ""
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr ""
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr ""
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr ""
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr ""
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr ""
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr ""
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr ""
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr ""
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr ""
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr ""
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr ""
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr ""
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr ""
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr ""
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr ""
@@ -723,362 +930,347 @@
 msgid "rule useless in grammar"
 msgstr ""
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr ""
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr ""
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr ""
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr ""
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr ""
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr ""
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr ""
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr ""
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ""
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr ""
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ""
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr ""
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr ""
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr ""
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr ""
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr ""
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr ""
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr ""
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr ""
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr ""
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr ""
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr ""
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr ""
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr ""
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr ""
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr ""
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr ""
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr ""
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr ""
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr ""
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr ""
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr ""
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr ""
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr ""
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr ""
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr ""
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr ""
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr ""
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr ""
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr ""
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr ""
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr ""
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr ""
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr ""
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, c-format
 msgid "symbol %s redeclared as a token"
 msgstr ""
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr ""
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
 "mean %s?"
 msgstr ""
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr ""
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
+msgid "nonterminals cannot be given a token code"
 msgstr ""
 
-#: src/symtab.c:575
+#: src/symtab.c:594
 #, c-format
-msgid "redefining user token number of %s"
+msgid "redefining code of token %s"
 msgstr ""
 
-#: src/symtab.c:578
+#: src/symtab.c:597
 #, c-format
-msgid "user token number of %s too large"
+msgid "code of token %s too large"
 msgstr ""
 
-#: src/symtab.c:617
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr ""
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr ""
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr ""
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr ""
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr ""
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
+msgid "code %d reassigned to token %s"
 msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr ""
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr ""
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr ""
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr ""
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr ""
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr ""
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr ""
diff --git a/po/ca.gmo b/po/ca.gmo
index 4bde54f..e4d61b4 100644
--- a/po/ca.gmo
+++ b/po/ca.gmo
Binary files differ
diff --git a/po/ca.po b/po/ca.po
index c6fbab7..4b6a63f 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison 3.0.4\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2017-02-26 20:29+0100\n"
 "Last-Translator: Walter Garcia-Fontes <walter.garcia@upf.edu>\n"
 "Language-Team: Catalan <ca@dodds.net>\n"
@@ -18,204 +18,362 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "caràcter no vàlid"
+
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "error fatal"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr ""
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "falta %s al final del fitxer"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr ""
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, fuzzy, c-format
 msgid "empty rules without %empty"
 msgstr "regla buida sense %%empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr ""
 
-#: src/complain.c:120
+#: src/complain.c:160
 #, fuzzy
 msgid "useless precedence and associativity"
 msgstr "precedència i associativitat inútils per a %s"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr ""
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr ""
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr ""
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr ""
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "advertiment"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "error"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "error fatal"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr ""
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "directiva obsoleta: %s, useu %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, fuzzy, c-format
 msgid "duplicate directive"
 msgstr "directiva obsoleta, useu %s"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, fuzzy, c-format
 msgid "duplicate directive: %s"
 msgstr "directiva obsoleta, useu %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "declaració prèvia"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "sols es permet una %s per regla"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+#, fuzzy
+msgid "syntax error"
+msgstr "error fatal"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr ""
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr ""
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr ""
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr ""
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr ""
+
+#: src/conflicts.c:88
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr ""
 "    Conflicte entre la regla %d i el testimoni %s resolt com a desplaçament"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr ""
 "    Conflicte entre la regla %d i el testimoni %s resolt com a reducció"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "    Conflicte entre la regla %d i el testimoni %s resolt com un error"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Estat %d"
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "conflictes: %d shift/reduce, %d reduce/reduce\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "conflictes: %d shift/reduce\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "conflictes: %d reduce/reduce\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, fuzzy, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "conflictes shift/reduce: %d trobats, %d esperats"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, fuzzy, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "conflictes reduce/reduce: %d trobats, %d esperats"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr s'aplica sols a analitzadors GLR"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "conflictes shift/reduce: %d trobats, %d esperats"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d conflicte shift/reduce"
 msgstr[1] "%d conflictes shift/reduce"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "conflictes reduce/reduce: %d trobats, %d esperats"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d conflicte reduce/reduce"
 msgstr[1] "%d conflictes reduce/reduce"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "declaració prèvia"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "declaració prèvia"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "declaració prèvia"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "declaració prèvia"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "%d conflicte shift/reduce"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "%d conflicte reduce/reduce"
+msgstr[1] "%d conflictes reduce/reduce"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: no es pot obrir"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "error d'entrada/sortida"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "no es pot tancar el fitxer"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "no se sobreescriurà el fitxer d'entrada %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "sortides conflictives cap al fitxer %s"
@@ -225,96 +383,96 @@
 msgid "%s: cannot backup"
 msgstr "%s: no es pot obrir"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr ""
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr ""
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr ""
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 #, fuzzy
 msgid "describe shift/reduce conflicts solving"
 msgstr "%d conflicte shift/reduce"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr ""
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr ""
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr ""
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr ""
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Proveu «%s --help» per a més informació.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Ús: %s [OPCIÓ].. FITXER\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 #, fuzzy
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
@@ -325,18 +483,18 @@
 "taules d'analitzador LALR(1), IELR(1) o LR(1) canònic. El suport per a "
 "IELR(1) i LR(1) canònic és experimental.\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "El arguments obligatoris per a opcions llargues són obligatoris també per a "
 "opcions curtes.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "El mateix és veritat per a arguments opcionals.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 #, fuzzy
 msgid ""
 "Operation Modes:\n"
@@ -366,7 +524,7 @@
 "  -f, --feature[=CARACTERISTICA] activa característiques miscel·lànies\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -375,7 +533,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, fuzzy, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -409,20 +567,24 @@
 "testimonis\n"
 "\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Sortida:\n"
 "      --defines[=FITXER]     produeix també un fitxer de capçalera\n"
@@ -437,51 +599,47 @@
 "  -x, --xml[=FITXER]         treu també un informe XML de l'automaton\n"
 "                             (l'esquema XML és experimental)\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Informa dels errors a <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "%s pàgina web: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+#, fuzzy
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
 "Ajuda general per usar el programari GNU:  <http://www.gnu.org/gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+#, fuzzy
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 "Informa dels errors de traducció a <http://translationproject.org/team/ca."
 "html>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "Per a la documentació completa, executeu: info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Escrit per Robert Corbett i Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -490,36 +648,41 @@
 "hi ha cap garantia; ni tan sols de COMERCIABILITAT o ADEQUACIÓ A UN PROPÒSIT "
 "PARTICULAR.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "les declaracions múltiples d'esquelet no són vàlides"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: llenguatge no vàlid"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "les declaracions múltiples de llenguatge no són válides"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, fuzzy, c-format
+msgid "invalid argument for %s: %s"
+msgstr "argument no vàlid %s per a %s"
+
+#: src/getargs.c:868
 #, fuzzy, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "directiva obsoleta: %s, useu %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, fuzzy, c-format
 msgid "missing operand"
 msgstr "%s: manca un operand"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "operand extra %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Gramàtica"
 
@@ -536,17 +699,27 @@
 "// Pàgina web: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+#, fuzzy
+msgid "end of file"
+msgstr "falta %s al final del fitxer"
+
+#: src/i18n-strings.c:36
+#, fuzzy
+msgid "invalid token"
+msgstr "caràcter no vàlid"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "desbordament del número de línia"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "desbordament del número de columna"
 
-#: src/location.c:155
+#: src/location.c:143
 #, fuzzy, c-format
 msgid "byte number overflow"
 msgstr "desbordament del número de línia"
@@ -556,230 +729,280 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr ""
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "la regla és inútil a l'analitzador a causa de conflictes"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "variable %%define %s redefinida"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "definició prèvia"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: variable %%define no definida %s"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "variable %%define %s redefinida"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "variable %%define %s redefinida"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "variable %%define %s redefinida"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "valor no vàlid per a la variable booleana %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "valor no vàlid per a la variable %%define %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "valor acceptat: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr ""
+
+#: src/parse-gram.y:214
+#, fuzzy
+msgid "[identifier]"
+msgstr "identificador no vàlida: %s"
+
+#: src/parse-gram.y:215
+#, fuzzy
+msgid "character literal"
+msgstr "literal de caràcters buit"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+#, fuzzy
+msgid "identifier"
+msgstr "identificador no vàlida: %s"
+
+#: src/parse-gram.y:220
+#, fuzzy
+msgid "identifier:"
+msgstr "identificador no vàlida: %s"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+#, fuzzy
+msgid "integer literal"
+msgstr "literal de caràcters buit"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr ""
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr ""
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, fuzzy, c-format
 msgid "definition of %s"
 msgstr "s'està redefinint el número de testimoni d'usuari per a %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "manca l'identificador a la declaració del paràmetre"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, fuzzy, c-format
 msgid "invalid version requirement: %s"
 msgstr "referència no vàlida: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr ""
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Estat %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr ""
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "fes un shift, i ves a l'estat %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "ves a l'estat %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "error (no-associatiu)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "redueix usant la regla %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "accepta"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "redueix usant la regla %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Terminals, amb regles on apareixen"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "No-terminals, amb regles on apareixen"
 
-#: src/print.c:416
+#: src/print.c:431
 #, fuzzy
 msgid "on left:"
 msgstr " a l'esquerra:"
 
-#: src/print.c:425
+#: src/print.c:440
 #, fuzzy
 msgid "on right:"
 msgstr " a la dreta:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Les regles són inútils a l'analitzador a causa de conflictes"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "declaracions %s múltiples"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "col·lisió de tipus de resultat a la funció merge %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "nom de símbol duplicat per a %s ignorat"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "regla donada per a %s, que és un testimoni"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "col·lisió de tipus a l'acció predeterminada: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "regla buida per a la no-terminal entrada, i cap acció"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "valor sense usar: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "valor no establert: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty a regla no buida"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "regla buida sense %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "no està definit el testimoni per a %%prec: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr ""
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s afecta sols ela analitzadors GLR"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s ha d'estar seguit per un nombre positiu"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr ""
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "la regla és massa llarga"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "el símbol d'inici %s no està definit"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "el símbol d'inici %s és un testimoni"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "no hi ea regles a la gramàtica d'entrada"
@@ -788,261 +1011,256 @@
 msgid "rule useless in grammar"
 msgstr "la regla no és útil a la gramàtica"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "la no-terminal no és útil a la gramàtica: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Les no-terminals no són útils a la gramàtica"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Hi ha terminal sense usar a la gramàtica"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Les regles són inútils a la gramàtica"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d no-terminal no útil a la gramàtica"
 msgstr[1] "%d no-terminals no útils a la gramàtica"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d regla no útil a la gramàtica"
 msgstr[1] "%d no regles no útils a la gramàtica"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "el símbol d'entrada %s no deriva cap oració"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "«%s» extraviat"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "refereix a: %c%s a %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "possiblement significava: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", amagant %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " a %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, fuzzy, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", no es pot accedir des de l'acció de regla intermèdia a $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "l'enter està fora de rang: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "referència no vàlida: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 "error de sintaxi després de «%c», s'esperava un enter, lletra, «_», «[» o «$»"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "no s'ha trobat el símbol en producció abans de $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "no s'ha trobat el símbol en producció: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "referència enganyosa: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "referència ambigua: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "s'ha donat un tipus explicit a una gramàtica sense tipus"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ per a la regla intermèdia a $%d de %s no té cap tipus declarat"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ de %s no té cap tipus declarat"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s de %s no té cap tipus declarat"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr ""
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "nombre no vàlid després de \\-escap: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "«,» extraviat serà tractat com a espai en blanc"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "directiva no vàlida: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "identificador no vàlida: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "caràcter no vàlid"
 msgstr[1] "caràcters no vàlids"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "caràcter nul no vàlid"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "identificador no esperat al nom entre parèntesis: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "s'esperava un identificador"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "caràcter no vàlid al nom entre parèntesis"
 msgstr[1] "caràcters no vàlids al nom entre parèntesis"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr ""
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "literal de caràcters buit"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "caràcters extra al literal de caràcters"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "nombre no vàlid després de \\-escap: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "caràcter no vàlid després de \\-escap: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr ""
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "falta %s al final del fitxer"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "falta %s al final de la línia"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "directiva %s sense tancar a l'esquelet"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "massa pocs argumentse per a la directiva %s a l'esquelet"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "massa arguments per a la directiva %s a l'esquelet"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc no permet guionets als noms de símbols: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "massa símbols a la gramàtica d'entrada (el límit és %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "redeclaració %s per a %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "redeclaració %s per a <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "símbol %s redeclarat"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "símbol %s redeclarat"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, fuzzy, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1050,107 +1268,112 @@
 msgstr ""
 "s'usa el símbol %s, però no està definit com un testimoni i no té cap regla"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "s'usa el símbol %s, però no està definit com un testimoni i no té cap regla"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "símbol %s redeclarat"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
+msgid "nonterminals cannot be given a token code"
 msgstr ""
 
-#: src/symtab.c:575
-#, c-format
-msgid "redefining user token number of %s"
-msgstr "s'està redefinint el número de testimoni d'usuari per a %s"
-
-#: src/symtab.c:578
+#: src/symtab.c:594
 #, fuzzy, c-format
-msgid "user token number of %s too large"
+msgid "redefining code of token %s"
 msgstr "s'està redefinint el número de testimoni d'usuari per a %s"
 
-#: src/symtab.c:617
+#: src/symtab.c:597
+#, fuzzy, c-format
+msgid "code of token %s too large"
+msgstr "s'està redefinint el número de testimoni d'usuari per a %s"
+
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "%s inútil per al tipus <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "s'usa el tipus <%s>, però no està associat a cap símbol"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr ""
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "el símbol %s s'usa més d'un cop com a una cadena de literals"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "se li ha donat al símbol %s mes d'una cadena de literals"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "redeclaració número %d de testimoni d'usuari per a %s"
+msgid "code %d reassigned to token %s"
+msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "declaració prèvia per a %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr ""
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "el símbol d'inici %s no està definit"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "el símbol d'inici %s és un testimoni"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "precedència i associativitat inútils per a %s"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "precedència inútil per a %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "associativitat inútil per a %s, useu  %%precedence"
 
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "declaracions %s múltiples"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "massa símbols a la gramàtica d'entrada (el límit és %d)"
+
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "redeclaració número %d de testimoni d'usuari per a %s"
+
 #, fuzzy
 #~ msgid "eliminate useless chain rules"
 #~ msgstr "la no-terminal no és útil a la gramàtica: %s"
@@ -1229,9 +1452,6 @@
 #~ "  'none'         inhabilita tot el de dalt\n"
 #~ "  "
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "argument no vàlid %s per a %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "argument ambigu %s per a %s"
 
@@ -1357,36 +1577,6 @@
 #~ msgid "cannot open stats file for writing"
 #~ msgstr "no es pot obrir el fitxer d'estadístiques per a escriptura"
 
-#, fuzzy
-#~| msgid "missing %s at end of file"
-#~ msgid "end \"ABC\" of file"
-#~ msgstr "falta %s al final del fitxer"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "[identifier]"
-#~ msgstr "identificador no vàlida: %s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "character literal"
-#~ msgstr "literal de caràcters buit"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier"
-#~ msgstr "identificador no vàlida: %s"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier:"
-#~ msgstr "identificador no vàlida: %s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "integer literal"
-#~ msgstr "literal de caràcters buit"
-
 #~ msgid "symbol %s redefined"
 #~ msgstr "se redefinit el símbol %s"
 
diff --git a/po/da.gmo b/po/da.gmo
index 740361e..3a677b4 100644
--- a/po/da.gmo
+++ b/po/da.gmo
Binary files differ
diff --git a/po/da.po b/po/da.po
index 09741bb..f5fa875 100644
--- a/po/da.po
+++ b/po/da.po
@@ -12,7 +12,7 @@
 msgstr ""
 "Project-Id-Version: bison 3.3.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2019-04-30 11:15+0200\n"
 "Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
 "Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
@@ -23,202 +23,360 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "ugyldigt tegn"
+
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "fatal fejl"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr ""
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "manglende %s ved slutningen af filen"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr ""
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, fuzzy, c-format
 msgid "empty rules without %empty"
 msgstr "tom regel uden %%empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr ""
 
-#: src/complain.c:120
+#: src/complain.c:160
 #, fuzzy
 msgid "useless precedence and associativity"
 msgstr "forrang og associativitet for %s kan ikke bruges"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr ""
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr ""
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr ""
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr ""
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "advarsel"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "fejl"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "fatal fejl"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr "POSIX Yacc understøtter ikke %s"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "forældet direktiv: %s, brug %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, c-format
 msgid "duplicate directive"
 msgstr "duplikeret direktiv"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, c-format
 msgid "duplicate directive: %s"
 msgstr "duplikeret direktiv: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "forrige deklaration"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "kun en %s tilladt per regel"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+#, fuzzy
+msgid "syntax error"
+msgstr "fatal fejl"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr ""
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr ""
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr ""
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr ""
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr ""
+
+#: src/conflicts.c:88
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "    Konflikt mellem regel %d og element %s løstes som skift"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr "    Konflikt mellem regel %d og element %s løstes som reducer"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "    Konflikt mellem regel %d og element %s løstes som en fejl"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Tilstand %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "konflikter: %d skift/reducer, %d reducer/reducer\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "konflikter: %d skift/reducer\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "konflikter: %d reducer/reducer\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "skift/reducer konflikter for regel %d: %d fundet, %d forventet"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "reducer/reducer-konflikter for regel %d: %d fundet, %d forventet"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr kan kun bruges ved GLR-fortolkere"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "skift/reducer konflikter: %d fundet, %d forventet"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d skift/reducer-konflikt"
 msgstr[1] "%d skift/reducer-konflikter"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "reducer/reducer-konflikter: %d fundet, %d forventet"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d reducer/reducer-konflikt"
 msgstr[1] "%d reducer/reducer-konflikter"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "forrige deklaration"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "forrige deklaration"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "forrige deklaration"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "forrige deklaration"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "%d skift/reducer-konflikt"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "%d reducer/reducer-konflikt"
+msgstr[1] "%d reducer/reducer-konflikter"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: kan ikke åbne"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "inddata/uddata-fejl"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "kan ikke lukke fil"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "nægter at overskrive inddatafilen %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "konfliktende uddata til filen %s"
@@ -228,96 +386,96 @@
 msgid "%s: cannot backup"
 msgstr "%s: kan ikke lave sikkerhedskopi"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr ""
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr ""
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr ""
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 #, fuzzy
 msgid "describe shift/reduce conflicts solving"
 msgstr "%d skift/reducer-konflikt"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr ""
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr ""
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr ""
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr ""
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Prøv med »%s --help« for yderligere information.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Brug: %s [TILVALG]... FIL\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 #, fuzzy
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
@@ -329,17 +487,17 @@
 "IELR(1)- \n"
 "og kanonisk LR(1)-understøttelse er eksperimentel.\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Tvungne argumenter til lange tilvalg er også krævet for korte tilvalg.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Det samme er gældende for valgfrie argumenter.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 #, fuzzy
 msgid ""
 "Operation Modes:\n"
@@ -370,7 +528,7 @@
 "  -f, --feature[=FUNKTION]   aktiver diverse funktioner\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -379,7 +537,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, fuzzy, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -409,20 +567,24 @@
 "no-lines                   opret ikke »#line«-direktiver\n"
 "  -k, --token-table                inkluder en tabel over elementnavne\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Uddata:\n"
 "      --defines[=FIL]        lav også en teksthovedfil\n"
@@ -437,48 +599,44 @@
 "  -x, --xml[=FIL]            lav også en XML-rapport for "
 "automaten<n                             (XML-skemaet er eksperimentel)\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Rapporter fejl til <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "%s hjemmeside: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+#, fuzzy
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr "Generel hjælp til GNU-programmer: <http://www.gnu.org/gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+#, fuzzy
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr "Rapporter oversættelsesfejl til <dansk@dansk-gruppen.dk>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "For fuldstændig dokumentation, kør: info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Skrevet af Robert Corbett og Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Ophavsret %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -487,36 +645,41 @@
 "gives INGEN garanti; selv ikke for SALGBARHED eller EGNETHED FOR ET\n"
 "BESTEMT FORMÅL.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "flere skeletdeklarationer er ugyldige"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: ugyldigt sprog"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "flere sprogdeklarationer er ugyldige"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, fuzzy, c-format
+msgid "invalid argument for %s: %s"
+msgstr "ugyldigt argument %s til %s"
+
+#: src/getargs.c:868
 #, fuzzy, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "forældet direktiv: %s, brug %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, c-format
 msgid "missing operand"
 msgstr "manglende operand"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "ekstra operand %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Grammatik"
 
@@ -533,17 +696,27 @@
 "// Hjemmeside: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+#, fuzzy
+msgid "end of file"
+msgstr "manglende %s ved slutningen af filen"
+
+#: src/i18n-strings.c:36
+#, fuzzy
+msgid "invalid token"
+msgstr "ugyldigt tegn"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "linjenummeroverløb"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "kolonnenummeroverløb"
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
 msgstr "bytenummeroverløb"
@@ -553,228 +726,278 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr ""
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "regel kan ikke bruges i fortolker på grund af konflikter"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr "fix-its kan anvendes. Kør igen med tilvalget »--update«."
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "%%define variabel %s redefineret"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "forrige definition"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: ikke defineret %%define variabel %s"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "%%define variabel %s redefineret"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "%%define variabel %s redefineret"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "%%define variabel %s redefineret"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "ugyldig værdi for %%define boolesk variabel %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "ugyldig værdi for %%define variabel %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "accepteret værdi: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr ""
+
+#: src/parse-gram.y:214
+#, fuzzy
+msgid "[identifier]"
+msgstr "ugyldig identifikator: %s"
+
+#: src/parse-gram.y:215
+#, fuzzy
+msgid "character literal"
+msgstr "tomt tegnbogstav"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+#, fuzzy
+msgid "identifier"
+msgstr "ugyldig identifikator: %s"
+
+#: src/parse-gram.y:220
+#, fuzzy
+msgid "identifier:"
+msgstr "ugyldig identifikator: %s"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+#, fuzzy
+msgid "integer literal"
+msgstr "tomt tegnbogstav"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr "tegnbogstaver kan ikke være ikketerminaler"
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, fuzzy, c-format
 msgid "character literals cannot be used together with %s"
 msgstr "tegnbogstaver kan ikke være ikketerminaler"
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, fuzzy, c-format
 msgid "definition of %s"
 msgstr "redefinition af elementnummer for %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "manglende identifikator i parameterdeklaration"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, c-format
 msgid "invalid version requirement: %s"
 msgstr "ugyldigt versionskrav: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr "kræver bison %s, men har %s"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Tilstand %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr ""
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "skift, og gå til tilstand %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "gå til tilstand %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "fejl (ikkeassociativ)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "reducer med regel %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "accepter"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "reducer med regel %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Terminaler, med regler hvor de forekommer"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Ikketerminaler, med regler hvor de forekommer"
 
-#: src/print.c:416
+#: src/print.c:431
 msgid "on left:"
 msgstr "til venstre:"
 
-#: src/print.c:425
+#: src/print.c:440
 msgid "on right:"
 msgstr "til højre:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Regel kan ikke bruges i fortolker på grund af konflikter"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "flere %s-deklarationer"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "resultattypekonflikt ved sammenfletningsfunktion %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "duplikeret symbolnavn for %s ignoreret"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "regel givet for %s som er et element"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "typekonflikt for standardhandling: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "tom regel for typet ikketerminal, og ingen handling"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "værdi er ikke anvendt: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "fjern indstilling for værdi: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty på regel der ikke er tom"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "tom regel uden %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "element for %%prec er ikke defineret: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr "kun midtregel-handlinger kan indtastes: %s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s påvirker kun GLR-fortolkere"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s skal følges af et positivt tal"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr "POSIX Yacc understøtter ikke indtastede midtregel-handlinger"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "regel er for lang"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "startsymbolet %s er ikke defineret"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "startsymbolet %s er et element"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "ingen regler i inddatagrammatikken"
@@ -783,260 +1006,255 @@
 msgid "rule useless in grammar"
 msgstr "regel ubrugelig i grammatik"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "ikketerminal kan ikke bruges i grammatik: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Ikketerminaler kan ikke bruges i grammatik"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Terminaler brugt i grammatik"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Regler kan ikke bruges i grammatik"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d ikketerminal kan ikke bruges i grammatik"
 msgstr[1] "%d ikketerminaler kan ikke bruges i grammatik"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d regel kan ikke bruges i grammatik"
 msgstr[1] "%d regler kan ikke bruges i grammatik"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "startsymbolet %s udleder ingen sætninger"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "malplaceret »%s«"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "refererer til: %c%s ved %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "betyder sandsynligvis: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", skjuler %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " ved %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", kan ikke tilgås fra midtregel-handling på $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "heltal uden for interval: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "ugyldig reference: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr "syntaksfejl efter »%c«, forventer heltal, bogstav, »_«, »[« eller »$«"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "symbol blev ikke fundet i produktion før $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "symbol blev ikke fundet i produktion: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "vildledende reference: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "tvetydig reference: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "eksplicit type angivet i utypet grammatik"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ for midtreglen ved $%d for %s har ingen erklæret type"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ for %s har ingen erklæret type"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s for %s har ingen erklæret type"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr "flere forekomster af $%d med api.value.automove"
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "ugyldigt nummer efter \\-escape: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "malplaceret »,« behandlet som blanktegn"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "ugyldigt direktiv: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "ugyldig identifikator: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "ugyldigt tegn"
 msgstr[1] "ugyldige tegn"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "ugyldigt NUL-tegn"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "uventet identifikator i navn i parentes: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "en identifikator var ventet"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "ugyldigt tegn i navn i parentes"
 msgstr[1] "ugyldige tegn i navn i parentes"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr "POSIX Yaccc understøtter ikke strengbogstaver"
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "tomt tegnbogstav"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "ekstra tegn i tegnbogstav"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "ugyldigt nummer efter \\-escape: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "ugyldigt tegn efter \\-escape: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr "POSIX Yacc understøtter ikke heksadecimale bogstaver"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "manglende %s ved slutningen af filen"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "manglende %s ved slutningen af linjen"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "uafsluttet %s-direktiv i skelet"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "for få argumenter for %s-direktiv i skelet"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "for mange argumenter for %s-direktiv i skelet"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc forbyder skråstreger i symbolnavne: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "for mange symboler i inddatagrammatik (grænsen er %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "gentagen %s-erklæring for %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "gentagen %s-erklæring for <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "symbolet %s er erklæret igen som et symbol"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "symbolet %s er erklæret igen som ikketerminal"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, fuzzy, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1044,107 +1262,115 @@
 msgstr ""
 "symbol %s bruges, men er ikke defineret som et element og har ingen regler"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "symbol %s bruges, men er ikke defineret som et element og har ingen regler"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "symbolet %s er erklæret igen"
 
-#: src/symtab.c:572
-#, c-format
-msgid "nonterminals cannot be given an explicit number"
-msgstr "ikketerminaler kan ikke gives et eksplicit nummer"
-
-#: src/symtab.c:575
-#, c-format
-msgid "redefining user token number of %s"
-msgstr "redefinition af elementnummer for %s"
-
-#: src/symtab.c:578
+#: src/symtab.c:591
 #, fuzzy, c-format
-msgid "user token number of %s too large"
+msgid "nonterminals cannot be given a token code"
+msgstr "ikketerminaler kan ikke gives et strengalias"
+
+#: src/symtab.c:594
+#, fuzzy, c-format
+msgid "redefining code of token %s"
 msgstr "redefinition af elementnummer for %s"
 
-#: src/symtab.c:617
+#: src/symtab.c:597
+#, fuzzy, c-format
+msgid "code of token %s too large"
+msgstr "redefinition af elementnummer for %s"
+
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "%s kan ikke bruges for type <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "typen <%s> bruges, men er ikke associeret til et symbol"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr "ikketerminaler kan ikke gives et strengalias"
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "symbol %s bruges mere end en gang som en bogstavelig streng"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "symbol %s har fået mere end en bogstavelig streng"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "brugerelementnummer %d gentagen erklæring for %s"
+msgid "code %d reassigned to token %s"
+msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "forrige erklæring for %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr ""
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "startsymbolet %s er ikke defineret"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "startsymbolet %s er et element"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "forrang og associativitet for %s kan ikke bruges"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "forrang for %s kan ikke bruges"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "associativitet for %s kan ikke bruges, brug %%precedence"
 
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "flere %s-deklarationer"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "for mange symboler i inddatagrammatik (grænsen er %d)"
+
+#~ msgid "nonterminals cannot be given an explicit number"
+#~ msgstr "ikketerminaler kan ikke gives et eksplicit nummer"
+
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "brugerelementnummer %d gentagen erklæring for %s"
+
 #, fuzzy
 #~ msgid "eliminate useless chain rules"
 #~ msgstr "ikketerminal kan ikke bruges i grammatik: %s"
@@ -1227,9 +1453,6 @@
 #~ "    deaktiver alle ovenstående\n"
 #~ "  "
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "ugyldigt argument %s til %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "tvetydigt argument %s til %s"
 
diff --git a/po/de.gmo b/po/de.gmo
index 5d2d584..2e5ae2b 100644
--- a/po/de.gmo
+++ b/po/de.gmo
Binary files differ
diff --git a/po/de.po b/po/de.po
index fd5eb36..e0ed4e9 100644
--- a/po/de.po
+++ b/po/de.po
@@ -2,15 +2,16 @@
 # German translation for message of GNU bison.
 # Copyright (C) 1996 Free Software Foundation, Inc.
 # Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
-# Michael Piefel <piefel@informatik.hu-berlin.de>, 2002, 2003, 2004, 2005, 2006, 2008, 2010, 2011, 2012, 2013, 2018.
+# Michael Piefel <piefel@informatik.hu-berlin.de>, 2002–2006, 2008, 2010–2013.
+# Michael Piefel <informatik.hu-berlin@piefel.de>, 2018, 2019, 2020, 2021.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: bison 3.3\n"
+"Project-Id-Version: bison 3.7.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-04-16 20:05+0200\n"
-"Last-Translator: Michael Piefel <piefel@informatik.hu-berlin.de>\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2021-08-14 18:23+0200\n"
+"Last-Translator: Michael Piefel <informatik.hu-berlin@piefel.de>\n"
 "Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
@@ -19,205 +20,359 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr "Zahl"
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr "Funktion"
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr "Variable"
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr "Fehler: Division durch Null"
+
+#: examples/c/bistromathic/parse.y:372
+#, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "Syntaxfehler: ungültiges Zeichen: %c"
+
+#: examples/c/bistromathic/parse.y:389
+msgid "%@: syntax error"
+msgstr "%@: Syntaxfehler"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr "%@: Syntaxfehler: unerwartetes %u"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "%@: Syntaxfehler: erwartete %0e vor %u"
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "%@: Syntaxfehler: erwartete %0e oder %1e vor %u"
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "%@: Syntaxfehler: erwartete %0e oder %1e oder %2e vor %u"
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr "%@: Syntaxfehler: erwartete %0e oder %1e oder %2e oder %3e vor %u"
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+"%@: Syntaxfehler: erwartete %0e oder %1e oder %2e oder %3e oder %4e vor %u"
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+"%@: Syntaxfehler: erwartete %0e oder %1e oder %2e oder %3e oder %4e oder %5e "
+"vor %u"
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+"%@: Syntaxfehler: erwartete %0e oder %1e oder %2e oder %3e oder %4e oder %5e "
+"usw. vor %u"
+
+#: examples/java/calc/Calc.y:81
+msgid "end of line"
+msgstr "Zeilenende"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
-msgstr ""
+msgstr "S/R-Konflikte (standardmäßig an)"
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
-msgstr ""
+msgstr "R/R-Konflikte (standardmäßig an)"
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr "Konflikt-Gegenbeispiele erzeugen"
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
-msgstr ""
+msgstr "nicht mit Symbol verknüpfte Zeichenkettenaliase"
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
-msgstr ""
+msgstr "veraltete Konstrukte"
 
-#: src/complain.c:118
-#, fuzzy, c-format
+#: src/complain.c:158
+#, c-format
 msgid "empty rules without %empty"
-msgstr "leere Regel ohne %%empty"
+msgstr "leere Regeln ohne %empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
-msgstr ""
+msgstr "nicht gesetzte oder nicht benutzte Werte inmitten einer Regel"
 
-#: src/complain.c:120
-#, fuzzy
+#: src/complain.c:160
 msgid "useless precedence and associativity"
-msgstr "nutzloser Vorrang und Assoziativität für %s"
+msgstr "nutzloser Vorrang und Assoziativität"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
-msgstr ""
+msgstr "Inkompatibilitäten mit POSIX-Yacc"
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
-msgstr ""
+msgstr "alle anderen Warnungen (standardmäßig an)"
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
-msgstr ""
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
+msgstr "alle Warnungen außer „counterexamples“, „dangling-alias“ und „yacc“"
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
-msgstr ""
+msgstr "Warnungen in KATEGORIE abschalten"
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
-msgstr ""
+msgstr "alle Warnungen abschalten"
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
-msgstr ""
+msgstr "Warnungen als Fehler behandeln"
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
-msgstr ""
+msgstr "Die Warnungs-Kategorien schließen ein:"
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "Warnung"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "Fehler"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "fataler Fehler"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr "Bemerkung"
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr "POSIX-Yacc akzeptiert %s nicht"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "veraltete Direktive: %s, benutzen Sie %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, c-format
 msgid "duplicate directive"
 msgstr "doppelte Direktive"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, c-format
 msgid "duplicate directive: %s"
 msgstr "doppelte Direktive: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "vorhergehende Deklaration"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "nur ein %s pro Regel erlaubt"
 
-#: src/conflicts.c:81
-#, fuzzy, c-format
+#: src/complain.c:647
+msgid "syntax error"
+msgstr "Syntaxfehler"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr "nicht erwartetes %0$s"
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr "erwartete %1$s vor %0$s"
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr "erwartete %1$s oder %2$s vor %0$s"
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr "erwartete %1$s oder %2$s oder %3$s vor %0$s"
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr "erwartete %1$s oder %2$s oder %3$s oder %4$s vor %0$s"
+
+#: src/conflicts.c:88
+#, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
-msgstr ""
-"    Konflikt zwischen Regel %d and Token %s wurde durch Schieben gelöst"
+msgstr "Konflikt zwischen Regel %d and Token %s wurde durch Schieben gelöst"
 
-#: src/conflicts.c:91
-#, fuzzy, c-format
+#: src/conflicts.c:98
+#, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
-msgstr ""
-"    Konflikt zwischen Regel %d and Token %s wurde durch Reduzierung gelöst"
+msgstr "Konflikt zwischen Regel %d and Token %s wurde durch Reduzierung gelöst"
 
-#: src/conflicts.c:100
-#, fuzzy, c-format
+#: src/conflicts.c:107
+#, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
-msgstr ""
-"    Konflikt zwischen Regel %d and Token %s wurde als Fehler betrachtet"
+msgstr "Konflikt zwischen Regel %d and Token %s wurde als Fehler betrachtet"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Zustand %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "Konflikte: %d Schiebe/Reduziere, %d Reduziere/Reduziere\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "Konflikte: %d Schiebe/Reduziere\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "Konflikte: %d Reduziere/Reduziere\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "Schiebe/Reduzier-Konflikte für Regel %d: %d gefunden, %d erwartet"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "Reduzier/Reduzier-Konflikte für Regel %d: %d gefunden, %d erwartet"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr betrifft nur GLR-Parser"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "Schiebe/Reduzier-Konflikte: %d gefunden, %d erwartet"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d Schiebe/Reduzier-Konflikt"
 msgstr[1] "%d Schiebe/Reduzier-Konflikte"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "Reduzier/Reduzier-Konflikte: %d gefunden, %d erwartet"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d Reduzier/Reduzier-Konflikt"
 msgstr[1] "%d Reduzier/Reduzier-Konflikte"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+"mit Option „-Wcounterexamples“ laufen lassen, um Konflikt-Gegenbeispiele zu "
+"erzeugen"
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr "Beispiel"
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr "Erstes Beispiel"
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr "Zweites Beispiel"
+
+#: src/counterexample.c:126
+msgid "Shift derivation"
+msgstr "Schiebe-Abweichung"
+
+#: src/counterexample.c:126
+msgid "First reduce derivation"
+msgstr "Erste Reduzier-Abweichung"
+
+#: src/counterexample.c:128
+msgid "Reduce derivation"
+msgstr "Reduzier-Abweichung"
+
+#: src/counterexample.c:128
+msgid "Second reduce derivation"
+msgstr "Zweite Reduzier-Abweichung"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "Schiebe/Reduzier-Konflikt bei Token %s"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ":"
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "Reduzier/Reduzier-Konflikt beim Token %s"
+msgstr[1] "Reduzier/Reduzier-Konflikt bei den Token %s"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: kann nicht öffnen"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "Eingabe-/Ausgabe-Fehler"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "kann Datei nicht schließen"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "werde die Eingabedatei %s nicht überschreiben"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "widersprüchliche Ausgaben in Datei %s"
@@ -227,97 +382,95 @@
 msgid "%s: cannot backup"
 msgstr "%s: kann keine Sicherung anlegen"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
-msgstr ""
+msgstr "Ausgabe einfärben"
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
-msgstr ""
+msgstr "Ausgabe nicht einfärben"
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
-msgstr ""
+msgstr "Ausgabe einfärben, wenn sie in ein Terminal geht"
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
-msgid "WHEN can be one of the following:"
-msgstr ""
-
 #: src/getargs.c:209
+msgid "WHEN can be one of the following:"
+msgstr "WANN kann eins der folgenden sein"
+
+#: src/getargs.c:222
 msgid "describe the states"
-msgstr ""
+msgstr "die Zustände beschreiben"
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
-msgstr ""
+msgstr "die Kernsymbolmengen mit ihrem Abschluss vervollständigen"
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
-msgstr ""
+msgstr "explizit Vorschautoken mit Symbolen verbinden"
 
-#: src/getargs.c:212
-#, fuzzy
+#: src/getargs.c:225
 msgid "describe shift/reduce conflicts solving"
-msgstr "%d Schiebe/Reduzier-Konflikt"
+msgstr "Auflösung von Schiebe/Reduzier-Konflikten beschreiben"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
-msgstr ""
+msgstr "alle oben genannten Informationen"
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
-msgstr ""
+msgstr "den Report abschalten"
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
-msgstr ""
+msgstr "DINGE ist eine Liste kommagetrennter Wörter aus:"
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
-msgstr ""
+msgstr "TRACES ist eine Liste kommagetrennter Wörter aus:"
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
-msgstr ""
+msgstr "Fehler mit Zirkumflexen („^“) markieren"
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
-msgstr ""
+msgstr "maschinenlesbare Fixes anzeigen"
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
-msgstr ""
+msgstr "überhaupt keine Dateien generieren"
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
-msgstr ""
+msgstr "alle oben genannten"
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
-msgstr ""
+msgstr "keins der oben genannten"
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
-msgstr ""
+msgstr "FEATURES ist eine Liste kommagetrennter Wörter aus:"
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "„%s --help“ gibt weitere Informationen.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Aufruf: %s [OPTION]... DATEI\n"
 
-#: src/getargs.c:356
-#, fuzzy
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
@@ -326,21 +479,20 @@
 "Einen deterministischen LR- oder verallgemeinerten LR-Parser (GLR) "
 "erstellen,\n"
 "unter Zuhilfenahme von LALR(1)-, IELR(1)- oder kanonischen LR(1)-Tabellen.\n"
-"Unterstützung für IELR(1) und kanonische LR(1) is experimentell.\n"
+"\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Erforderliche Argumente für lange Optionen sind auch für Kurzformen "
 "erforderlich.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Das gleiche gilt für optionale Argumente.\n"
 
-#: src/getargs.c:370
-#, fuzzy
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -355,7 +507,6 @@
 "  -f, --feature[=FEATURES]   activate miscellaneous features\n"
 "\n"
 msgstr ""
-"\n"
 "Arbeitsmodi:\n"
 "  -h, --help                 diese Hilfe anzeigen und beenden\n"
 "  -V, --version              Versionsinformation anzeigen und beenden\n"
@@ -364,14 +515,12 @@
 "                             und beenden\n"
 "      --print-datadir        Verzeichnis mit Skeletten und XSLT anzeigen\n"
 "                             und beenden\n"
-"  -u, --update               Verbesserungen an der Quellgrammatik "
-"vornehmen                             und beenden\n"
-"  -y, --yacc                 POSIX’ Yacc emulieren\n"
-"  -W, --warnings[=KATEGORIE]  Warnungen, die in KATEGORIE fallen, anzeigen\n"
-"  -f, --feature[=FEATURE]    verschiedene Features aktivieren\n"
+"  -u, --update               Verbesserungen an der Quellgrammatik vornehmen\n"
+"                             und beenden\n"
+"  -f, --feature[=FEATURES]   verschiedene Features aktivieren\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -379,9 +528,14 @@
 "      --style=FILE           specify the CSS FILE for colorizer diagnostics\n"
 "\n"
 msgstr ""
+"Diagnose:\n"
+"  -W, --warnings[=KATEGORIE]  Warnungen, die in KATEGORIE fallen, anzeigen\n"
+"      --color[=WANN]          ob die Diagnose eingefärbt werden soll\n"
+"      --style=DATEI           CSS-DATEI für Diagnose-Färbungen angeben\n"
+"\n"
 
-#: src/getargs.c:400
-#, fuzzy, c-format
+#: src/getargs.c:421
+#, c-format
 msgid ""
 "Tuning the Parser:\n"
 "  -L, --language=LANGUAGE          specify the output programming language\n"
@@ -397,93 +551,98 @@
 "  -k, --token-table                include a table of token names\n"
 "  -y, --yacc                       emulate POSIX Yacc\n"
 msgstr ""
-"Parser:\n"
-"  -L, --language=SPRACHE     die Ausgabesprache bestimmen\n"
-"  -S, --skeleton=DATEI       zu benutzende Skelettdatei angeben\n"
-"  -t, --debug                den Parser auf Ablaufverfolgung vorbereiten\n"
-"                             genau wie „-Dparse.trace“\n"
-"      --locations            Standortberechnung ermöglichen\n"
-"  -D, --define=NAME[=VALUE]        ähnlich zu „%define NAME \"VALUE\"“\n"
-"  -F, --force-define=NAME[=VALUE]  „%define NAME \"VALUE\"“ überschreiben\n"
-"  -p, --name-prefix=PRÄFIX   PRÄFIX vor alle externen Symbole setzen;\n"
-"                             veraltet, durch „-Dapi.prefix=PREFIX“ ersetzt\n"
-"  -l, --no-lines             keine „#line“-Direktiven erzeugen\n"
-"  -k, --token-table          eine Tabelle der Token-Namen mit einschließen\n"
+"Parser feinabstimmen:\n"
+"  -L, --language=SPRACHE        die Ausgabesprache bestimmen\n"
+"  -S, --skeleton=DATEI          zu benutzende Skelettdatei angeben\n"
+"  -t, --debug                   den Parser auf Ablaufverfolgung vorbereiten\n"
+"                                genau wie „-Dparse.trace“\n"
+"      --locations               Standortberechnung ermöglichen\n"
+"  -D, --define=NAME[=VALUE]        ähnlich zu „%define NAME VALUE“\n"
+"  -F, --force-define=NAME[=VALUE]  „%define NAME VALUE“ überschreiben\n"
+"  -p, --name-prefix=PRÄFIX      PRÄFIX vor alle externen Symbole setzen;\n"
+"                                veraltet, durch „-Dapi.prefix=PRÄFIX“ "
+"ersetzt\n"
+"  -l, --no-lines                keine „#line“-Direktiven erzeugen\n"
+"  -k, --token-table             eine Tabelle der Token-Namen mit "
+"einschließen\n"
+"  -y, --yacc                    POSIX-Yacc emulieren\n"
 
-#: src/getargs.c:419
-#, fuzzy
+#: src/getargs.c:438
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
-"Ausgabe:\n"
-"      --defines[=DATEI]      auch eine Header-Datei herstellen\n"
-"  -d                         genauso, aber DATEI kann nicht angegeben "
+"Ausgabedateien:\n"
+"  -H, --defines[=DATEI]         auch eine Header-Datei herstellen\n"
+"  -d                            genauso, aber DATEI kann nicht angegeben "
 "werden\n"
-"  -r, --report=DINGE         auch Details des Automaten ausgeben\n"
-"      --report-file=DATEI    Report in DATEI ausgeben\n"
-"  -v, --verbose              das Gleiche wie „--report=state“\n"
-"  -b, --file-prefix=PRÄFIX   einen PRÄFIX für Ausgabe-Dateien angeben\n"
-"  -o, --output=DATEI         Ausgabe in DATEI schreiben\n"
-"  -g, --graph[=DATEI]        auch einen Graphen des Automaten herstellen\n"
-"  -x, --xml[=DATEI]          auch einen XML-Report des Automaten herstellen\n"
-"                               (das XML-Schema ist experimentell)\n"
+"  -r, --report=DINGE            auch Details des Automaten ausgeben\n"
+"      --report-file=DATEI       Report in DATEI ausgeben\n"
+"  -v, --verbose                 das Gleiche wie „--report=state“\n"
+"  -b, --file-prefix=PRÄFIX      einen PRÄFIX für Ausgabe-Dateien angeben\n"
+"  -o, --output=DATEI            Ausgabe in DATEI schreiben\n"
+"  -g, --graph[=DATEI]           auch einen Graphen des Automaten herstellen\n"
+"      --html[=DATEI]            auch einen HTML-Report des Automaten "
+"herstellen\n"
+"  -x, --xml[=DATEI]             auch einen XML-Report des Automaten "
+"herstellen\n"
+"  -M, --file-prefix-map=ALT=NEU Präfix ALT durch NEU ersetzen beim Schreiben "
+"von\n"
+"                                Dateipfaden in Ausgabedateien\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Berichten Sie Fehler (auf Englisch, mit LC_ALL=C) an <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "Home-Page von %s: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
-"Allgemeine Hilfe zur Nutzung von GNU-Software: <http://www.gnu.org/gethelp/"
+"Allgemeine Hilfe zur Nutzung von GNU-Software: <https://www.gnu.org/gethelp/"
 ">.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
-"Berichten Sie Übersetzungsfehler an <http://translationproject.org/team/de."
+"Berichten Sie Übersetzungsfehler an <https://translationproject.org/team/de."
 "html>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "Für die vollständige Dokumentation rufen Sie „info bison“ auf.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Geschrieben von Robert Corbett und Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright © %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -492,36 +651,41 @@
 "gibt keine Garantie; auch nicht für VERKAUFBARKEIT oder FÜR SPEZIELLE "
 "ZWECKE.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "mehrfache Skelett-Deklarationen sind ungültig"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: unzulässige Sprache"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "mehrfache Sprach-Deklarationen sind ungültig"
 
-#: src/getargs.c:816
-#, fuzzy, c-format
-msgid "deprecated option: %s, use %s"
-msgstr "veraltete Direktive: %s, benutzen Sie %s"
+#: src/getargs.c:760
+#, c-format
+msgid "invalid argument for %s: %s"
+msgstr "ungültiges Argumend für %s: %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:868
+#, c-format
+msgid "deprecated option: %s, use %s"
+msgstr "veraltete Option: %s, benutzen Sie %s"
+
+#: src/getargs.c:902
 #, c-format
 msgid "missing operand"
 msgstr "fehlender Operand"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "zusätzlicher Operand %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Grammatik"
 
@@ -538,252 +702,303 @@
 "// Homepage: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+msgid "end of file"
+msgstr "Dateiende"
+
+#: src/i18n-strings.c:36
+msgid "invalid token"
+msgstr "ungültiges Token"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "Überlauf bei den Zeilennummern"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "Überlauf bei den Spaltennummern"
 
-#: src/location.c:155
-#, fuzzy, c-format
+#: src/location.c:143
+#, c-format
 msgid "byte number overflow"
-msgstr "Überlauf bei den Zeilennummern"
+msgstr "Überlauf bei den Bytenummern"
 
 #. TRANSLATORS: This is used when a line is too long, and is
 #. displayed truncated.  Use an ellipsis appropriate for your
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
-msgstr ""
+msgstr "…"
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "Regel nutzlos im Parser wegen Konflikten"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 "Automatische Korrekturen können angewandt werden. Mit „--update“ erneut "
 "starten."
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "%%define-Variable %s noch einmal definiert"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "vorhergehende Definition"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: undefinierte %%define-Variable %s"
 
-#: src/muscle-tab.c:629
-#, fuzzy, c-format
+#: src/muscle-tab.c:624
+#, c-format
 msgid "%%define variable '%s' requires '{...}' values"
-msgstr "%%define-Variable %s noch einmal definiert"
+msgstr "%%define-Variable %s benötigt „{...}“-Werte"
+
+#: src/muscle-tab.c:629
+#, c-format
+msgid "%%define variable '%s' requires keyword values"
+msgstr "%%define-Variable %s benötigt Schlüsselwort-Werte"
 
 #: src/muscle-tab.c:634
-#, fuzzy, c-format
-msgid "%%define variable '%s' requires keyword values"
-msgstr "%%define-Variable %s noch einmal definiert"
-
-#: src/muscle-tab.c:639
-#, fuzzy, c-format
+#, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
-msgstr "%%define-Variable %s noch einmal definiert"
+msgstr "%%define-Variable %s benötigt „\"...\"“-Werte"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "ungültiger Wert für Boole’sche %%define-Variable %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "ungültiger Wert für %%define-Variable %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "akzeptierte Werte: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr "Zeichenkette"
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr "übersetzbare Zeichenkette"
+
+#: src/parse-gram.y:214
+msgid "[identifier]"
+msgstr "[Bezeichner]"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr "Zeichenliteral"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr "Epilog"
+
+#: src/parse-gram.y:219
+msgid "identifier"
+msgstr "Bezeichner"
+
+#: src/parse-gram.y:220
+msgid "identifier:"
+msgstr "Bezeichner:"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr "<Tag>"
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr "Ganzzahlliteral"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr "Zeichenliterale können keine Nichtterminale sein"
 
-#: src/parse-gram.y:753
-#, fuzzy, c-format
+#: src/parse-gram.y:786
+#, c-format
 msgid "character literals cannot be used together with %s"
-msgstr "Zeichenliterale können keine Nichtterminale sein"
+msgstr "Zeichenliterale können nicht zusammen benutzt werden mit %s"
 
-#: src/parse-gram.y:758
-#, fuzzy, c-format
+#: src/parse-gram.y:789
+#, c-format
 msgid "definition of %s"
-msgstr "definiere Nutzertokennummer von %s erneut"
+msgstr "Definition von %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "fehlender Bezeichner in Parameterdeklaration"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, c-format
 msgid "invalid version requirement: %s"
 msgstr "ungültige Versionsanforderung: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr "erfordere bison %s, habe aber %s"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Zustand %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr "%s: fehlgeschlagen mit Status %d"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "schiebe und gehe zu Zustand %d über\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "gehe zu Zustand %d über\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "Fehler (nicht assoziativ)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "reduziere mit Regel %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "annehmen"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "reduziere mit Regel %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Terminale und die Regeln, in denen sie verwendet werden"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Nicht-Terminal und die Regeln, in denen sie verwendet werden"
 
-#: src/print.c:416
-#, fuzzy
+#: src/print.c:431
 msgid "on left:"
-msgstr " auf der linken Seite:"
+msgstr "auf der linken Seite:"
 
-#: src/print.c:425
-#, fuzzy
+#: src/print.c:440
 msgid "on right:"
-msgstr " auf der rechten Seite:"
+msgstr "auf der rechten Seite:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Regeln nutzlos im Parser wegen Konflikten"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "mehr als eine %s-Deklaration"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "Rückgabetyp-Konflikt in merge-Funktion %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "doppelter Symbolname für %s ignoriert"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "Regel für %s vorhanden, welches aber ein Token ist"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "Typkonflikt bei Default-Aktion: <%s> != <%s>) "
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "leere Regel für Nicht-Terminal mit Typ und keine Aktion"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "unbenutzter Wert: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "nicht gesetzter Wert: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty bei nicht-leerer Regel"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "leere Regel ohne %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "Token für %%prec ist nicht definiert: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr "nur Aktionen inmitten einer Regel können typisiert sein: %s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s betrifft nur GLR-Parser"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s muss von positiver Zahl gefolgt sein"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr "POSIX-Yacc unterstützt keine Aktion inmitten einer Regel"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "Regel ist zu lang"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "das Startsymbol %s ist undefiniert"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "das Startsymbol %s ist ein Token"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "Eingabegrammatik enthält keine Regeln"
@@ -792,880 +1007,376 @@
 msgid "rule useless in grammar"
 msgstr "Regeln nutzlos in Grammatik"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "Nicht-Terminal nutzlos in Grammatik: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Nicht-Terminale, die in Grammatik nutzlos sind"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Terminale, die in Grammatik unbenutzt sind"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Regeln, die in Grammatik nutzlos sind"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d Nicht-Terminal, das in Grammatik nutzlos ist"
 msgstr[1] "%d Nicht-Terminale, die in Grammatik nutzlos sind"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d Regel, die in Grammatik nutzlos ist"
 msgstr[1] "%d Regeln, die in Grammatik nutzlos sind"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "es lassen sich keine Sätze vom Startsymbol %s ableiten"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "herumstreunendes ‚%s‘"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "verweist auf: %c%s bei %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "meinte möglicherweise: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", versteckt dabei %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " bei %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ""
 ", kann nicht aus Aktion inmitten einer Regel bei $%d heraus zugegriffen "
 "werden"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "Ganzzahl außerhalb des Wertebereichs: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "ungültiger Verweis: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr "Syntaxfehler nach ‚%c‘, erwarte Ganzzahl, Buchstabe, ‚_‘, ‚[‘ oder ‚$‘"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "Symbol nicht in Produktion gefunden vor $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "Symbol nicht in Produktion gefunden: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "irreführender Verweis: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "mehrdeutiger Verweis: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "expliziter Typ angegeben und ungetypter Grammatik"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ für Regelmitte bei $%d von %s hat keinen deklarierten Typ"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ von %s hat keinen deklarierten Typ"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s von %s hat keinen deklarierten Typ"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr "mehrfaches Auftreten von $%d mit api.value.automove"
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "ungültige Zahl hinter \\-Flucht: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "überzähliges „,“ als Freiraum betrachtet"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "ungültige Direktive: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "ungültiger Bezeichner: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "ungültiges Zeichen"
 msgstr[1] "ungültige Zeichen"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "ungültiges Null-Zeichen"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "unerwarteter Bezeichner im geklammerten Namen: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "Bezeichner erwartet"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "ungültiges Zeichen im geklammerten Namen"
 msgstr[1] "ungültige Zeichen im geklammerten Namen"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr "POSIX-Yacc unterstützt keine Zeichenkettenliterale"
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "leeres Zeichenliteral"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "zusätzliche Zeichen in Zeichenliteral"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "ungültige Zahl hinter \\-Flucht: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "ungültiges Zeichen hinter \\-Flucht: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr "POSIX-Yacc unterstützt keine hexadezimalen Literale"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "fehlendes %s am Ende der Datei"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "fehlendes %s am Ende der Zeile"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "nicht geschlossene Direktive %s im Skelett"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "zu wenige Argumente für Direktive %s im Skelett"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "zu viele Argumente für Direktive %s im Skelett"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX-Yacc verbietet Bindestriche in Symbolnamen: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "zu viele Symbole in Eingabegrammatik (Maximum ist %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "%s erneute Deklaration für %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s erneute Deklaration für <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "Symbol %s als ein Token redeklariert"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "Symbol %s redeklariert als ein Nichtterminal"
 
-#: src/symtab.c:370
-#, fuzzy, c-format
+#: src/symtab.c:388
+#, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
 "mean %s?"
 msgstr ""
 "Symbol %s wird benutzt, ist aber nicht als Token definiert und hat keine "
-"Regel"
+"Regel; meinten Sie %s?"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "Symbol %s wird benutzt, ist aber nicht als Token definiert und hat keine "
 "Regel"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
-msgstr ""
+msgstr "POSIX-Yacc reserviert %%type für Nichtterminale"
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "Symbol %s noch einmal deklariert"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
-msgstr "Nichtterminale können nicht mit expliziter Nummer versehen werden"
+msgid "nonterminals cannot be given a token code"
+msgstr "Nichtterminale können nicht mit einem Tokencode versehen werden"
 
-#: src/symtab.c:575
+#: src/symtab.c:594
 #, c-format
-msgid "redefining user token number of %s"
-msgstr "definiere Nutzertokennummer von %s erneut"
+msgid "redefining code of token %s"
+msgstr "definiere Code des Tokens %s erneut"
 
-#: src/symtab.c:578
-#, fuzzy, c-format
-msgid "user token number of %s too large"
-msgstr "definiere Nutzertokennummer von %s erneut"
+#: src/symtab.c:597
+#, c-format
+msgid "code of token %s too large"
+msgstr "Code des Tokens %s zu groß"
 
-#: src/symtab.c:617
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
-msgstr ""
+msgstr "Zeichenkettenliteral %s nicht mit Symbol verknüpft"
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "nutzloses %s für Typ <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "Typ <%s> wird benutzt, ist aber mit keinem Symbol verknüpft"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr ""
 "Nichtterminale können nicht mit einem Zeichenkettenalias versehen werden"
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "Symbol %s wird mehr als einmal als literale Zeichenkette benutzt"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "Symbol %s wird mehr als eine literale Zeichenkette gegeben"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "Tokennummer %d erneut deklariert für %s"
+msgid "code %d reassigned to token %s"
+msgstr "Code %d dem Token %s neu zugewiesen"
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "vorhergehende Deklaration für %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
-msgstr ""
+msgstr "Tokennummer zu groß"
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "das Startsymbol %s ist undefiniert"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "das Startsymbol %s ist ein Token"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "nutzloser Vorrang und Assoziativität für %s"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "nutzloser Vorrang für %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "nutzlose Assoziativität für %s, benutzen Sie %%precedence"
 
-#, fuzzy
-#~ msgid "eliminate useless chain rules"
-#~ msgstr "Nicht-Terminal nutzlos in Grammatik: %s"
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
 
-#~ msgid "deprecated directive, use %s"
-#~ msgstr "veraltete Direktive, benutzen Sie %s"
+#~ msgid "multiple %s declarations"
+#~ msgstr "mehr als eine %s-Deklaration"
 
-#, fuzzy
-#~ msgid ""
-#~ "Warning categories include:\n"
-#~ "  'conflicts-sr'      S/R conflicts (enabled by default)\n"
-#~ "  'conflicts-rr'      R/R conflicts (enabled by default)\n"
-#~ "  'deprecated'        obsolete constructs\n"
-#~ "  'empty-rule'        empty rules without %empty\n"
-#~ "  'midrule-values'    unset or unused midrule values\n"
-#~ "  'precedence'        useless precedence and associativity\n"
-#~ "  'yacc'              incompatibilities with POSIX Yacc\n"
-#~ "  'other'             all other warnings (enabled by default)\n"
-#~ "  'all'               all the warnings except 'yacc'\n"
-#~ "  'no-CATEGORY'       turn off warnings in CATEGORY\n"
-#~ "  'none'              turn off all the warnings\n"
-#~ "  'error[=CATEGORY]'  treat warnings as errors\n"
-#~ msgstr ""
-#~ "Die Warnungs-Kategorien schließen ein:\n"
-#~ "  „midrule-values“  nicht gesetzte oder nicht benutzte Werte inmitten "
-#~ "einer Regel\n"
-#~ "  „yacc“            Inkompatibilitäten mit POSIX’ YACC\n"
-#~ "  „conflicts-sr“    S/R-Konflikte (standardmäßig an)\n"
-#~ "  „conflicts-rr“    R/R-Konflikte (standardmäßig an)\n"
-#~ "  „deprecated“      veraltete Konstrukte\n"
-#~ "  „empty-rule“      leere Regeln ohne %empty\n"
-#~ "  „precedence“      nutzloser Vorrang und Assoziativität\n"
-#~ "  „other“           alle anderen Warnungen (standardmäßig an)\n"
-#~ "  „all“             alle Warnungen außer „yacc“\n"
-#~ "  „no-KATEGORIE“    Warnungen in KATEGORIE abschalten\n"
-#~ "  „none“            alle Warnungen abschalten\n"
-#~ "  „error[=KATEGORIE]“ Warnungen als Fehler behandeln\n"
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "zu viele Symbole in Eingabegrammatik (Maximum ist %d)"
 
 #~ msgid ""
-#~ "THINGS is a list of comma separated words that can include:\n"
-#~ "  'state'        describe the states\n"
-#~ "  'itemset'      complete the core item sets with their closure\n"
-#~ "  'lookahead'    explicitly associate lookahead tokens to items\n"
-#~ "  'solved'       describe shift/reduce conflicts solving\n"
-#~ "  'all'          include all the above information\n"
-#~ "  'none'         disable the report\n"
+#~ "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e or %6e "
+#~ "before %u"
 #~ msgstr ""
-#~ "DINGE ist eine Liste kommagetrennter Wörter aus:\n"
-#~ "  „state“        die Zustände beschreiben\n"
-#~ "  „itemset“      die Kernsymbolmengen mit ihrem Abschluss "
-#~ "vervollständigen\n"
-#~ "  „lookahead“    explizit Vorschautoken mit Symbolen verbinden\n"
-#~ "  „solved“       Schiebe-/Reduzier-Konfliktlösungen beschreiben\n"
-#~ "  „all“          alle oben genannten Informationen\n"
-#~ "  „none“         den Report abschalten\n"
+#~ "%@: Syntaxfehler: erwartete %0e oder %1e oder %2e oder %3e oder %4e oder "
+#~ "%5e oder %6e vor %u"
 
-#, fuzzy
-#~ msgid ""
-#~ "FEATURES is a list of comma separated words that can include:\n"
-#~ "  'caret', 'diagnostics-show-caret'\n"
-#~ "    show errors with carets\n"
-#~ "  'fixit', 'diagnostics-parseable-fixits'\n"
-#~ "    show machine-readable fixes\n"
-#~ "  'syntax-only'\n"
-#~ "    do not generate any file\n"
-#~ "  'all'\n"
-#~ "    all of the above\n"
-#~ "  'none'\n"
-#~ "    disable all of the above\n"
-#~ "  "
-#~ msgstr ""
-#~ "FEATURE is eine Liste kommaseparierter Wörter, die einschließen können:\n"
-#~ "  „caret“        Fehler mit Zirkumflexen („^“) markieren\n"
-#~ "  „all“          alle oben genannten\n"
-#~ "  „none“         keins der oben genannten\n"
-#~ "  "
+#~ msgid "nonterminals cannot be given an explicit number"
+#~ msgstr "Nichtterminale können nicht mit expliziter Nummer versehen werden"
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "unzulässiges Argument %s für %s"
-
-#~ msgid "ambiguous argument %s for %s"
-#~ msgstr "mehrdeutiges Argument %s für %s"
-
-#~ msgid "Valid arguments are:"
-#~ msgstr "Gültige Argumente sind:"
-
-#~ msgid "write error"
-#~ msgstr "Schreibfehler"
-
-#~ msgid "Unknown system error"
-#~ msgstr "Unbekannter Systemfehler"
-
-#~ msgid "%s: option '%s%s' is ambiguous\n"
-#~ msgstr "%s: Option „%s%s“ ist mehrdeutig\n"
-
-#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
-#~ msgstr "%s: Option „%s%s“ ist mehrdeutig; möglich sind:"
-
-#~ msgid "%s: unrecognized option '%s%s'\n"
-#~ msgstr "%s: unbekannte Option „%s%s“\n"
-
-#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
-#~ msgstr "%s: Option „%s%s“ erlaubt kein Argument\n"
-
-#~ msgid "%s: option '%s%s' requires an argument\n"
-#~ msgstr "%s: Option „%s%s“ erfordert ein Argument\n"
-
-#~ msgid "%s: invalid option -- '%c'\n"
-#~ msgstr "%s: ungültige Option -- „%c“\n"
-
-#~ msgid "%s: option requires an argument -- '%c'\n"
-#~ msgstr "%s: Option erfordert ein Argument -- „%c“\n"
-
-#~ msgid "memory exhausted"
-#~ msgstr "Speicher ausgeschöpft"
-
-#~ msgid "cannot create pipe"
-#~ msgstr "kann Datei nicht schließen"
-
-#~ msgid "%s subprocess failed"
-#~ msgstr "Unterprozess %s fehlgeschlagen"
-
-#~ msgid "`"
-#~ msgstr "„"
-
-#~ msgid "'"
-#~ msgstr "“"
-
-#~ msgid "Execution times (seconds)"
-#~ msgstr "Ausführungszeiten (Sekunden)"
-
-#~ msgid "CPU user"
-#~ msgstr "CPU Nutzer"
-
-#~ msgid "CPU system"
-#~ msgstr "CPU System"
-
-#~ msgid "wall clock"
-#~ msgstr "Wanduhr"
-
-#~ msgid "_open_osfhandle failed"
-#~ msgstr "_open_osfhandle fehlgeschlagen"
-
-#~ msgid "cannot restore fd %d: dup2 failed"
-#~ msgstr ""
-#~ "kann Dateideskriptor %d nicht wieder herstellen: dup2 fehlgeschlagen"
-
-#~ msgid "%s subprocess"
-#~ msgstr "Unterprozess %s"
-
-#~ msgid "%s subprocess got fatal signal %d"
-#~ msgstr "Unterprozess %s erhielt tödliches Signal %d"
-
-#~ msgid " type %d is %s\n"
-#~ msgstr " Typ %d ist %s\n"
-
-#~ msgid "symbol %s redefined"
-#~ msgstr "Symbol %s noch einmal definiert"
-
-#~ msgid "removing of '%s' failed"
-#~ msgstr "Entfernen von „%s“ fehlgeschlagen"
-
-#~ msgid "creation of a temporary file failed"
-#~ msgstr "Erstellen einer temporären Datei fehlgeschlagen"
-
-#~ msgid "saving stdin failed"
-#~ msgstr "Speichern der Standardeingabe fehlgeschlagen"
-
-#~ msgid "saving stdout failed"
-#~ msgstr "Speichern der Standardausgabe fehlgeschlagen"
-
-#~ msgid "opening of tmpfile failed"
-#~ msgstr "Öffnen der Datei tmpfile fehlgeschlagen"
-
-#~ msgid "redirecting bison's stdout to the temporary file failed"
-#~ msgstr ""
-#~ "Umleiten der Standardausgabe von Bison in die temporäre Datei "
-#~ "fehlgeschlagen"
-
-#~ msgid "redirecting m4's stdin from the temporary file failed"
-#~ msgstr ""
-#~ "Umleiten der Standardeingabe von m4 aus der temporären Datei "
-#~ "fehlgeschlagen"
-
-#~ msgid "opening of a temporary file failed"
-#~ msgstr "Öffnen einer temporären Datei fehlgeschlagen"
-
-#~ msgid "redirecting m4's stdout to a temporary file failed"
-#~ msgstr ""
-#~ "Umleiten der Standardausgabe von m4 in eine temporäre Datei fehlgeschlagen"
-
-#~ msgid "subsidiary program '%s' interrupted"
-#~ msgstr "untergeordnetes Programm „%s“ unterbrochen"
-
-#~ msgid "subsidiary program '%s' not found"
-#~ msgstr "untergeordnetes Programm „%s“ nicht gefunden"
-
-#~ msgid "redirecting bison's stdin from the temporary file failed"
-#~ msgstr ""
-#~ "Umleiten der Standardeingabe von Bison aus der temporären Datei "
-#~ "fehlgeschlagen"
-
-#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
-#~ msgstr "%u bitset_allocs, %u freigegeben (%.2f%%).\n"
-
-#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
-#~ msgstr "%u bitset_sets, %u zwischengespeichert (%.2f%%)\n"
-
-#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
-#~ msgstr "%u bitset_resets, %u zwischengespeichert (%.2f%%)\n"
-
-#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
-#~ msgstr "%u bitset_tests, %u zwischengespeichert (%.2f%%)\n"
-
-#~ msgid "%u bitset_lists\n"
-#~ msgstr "%u bitset_lists\n"
-
-#~ msgid "count log histogram\n"
-#~ msgstr "Zähler-Histogramm\n"
-
-#~ msgid "size log histogram\n"
-#~ msgstr "Größe-Histogramm\n"
-
-#~ msgid "density histogram\n"
-#~ msgstr "Dichte-Histogramm\n"
-
-#~ msgid ""
-#~ "Bitset statistics:\n"
-#~ "\n"
-#~ msgstr ""
-#~ "Bitset-Statistiken:\n"
-#~ "\n"
-
-#~ msgid "Accumulated runs = %u\n"
-#~ msgstr "Gesammelte Durchläufe = %u\n"
-
-#~ msgid "cannot read stats file"
-#~ msgstr "kann Statistik-Datei nicht lesen"
-
-#~ msgid "bad stats file size\n"
-#~ msgstr "ungültige Statistik-Datei-Größe\n"
-
-#~ msgid "cannot write stats file"
-#~ msgstr "kann Statistik-Datei nicht schreiben"
-
-#~ msgid "cannot open stats file for writing"
-#~ msgstr "kann Statistik-Datei nicht zum Schreiben öffnen"
-
-#~ msgid " TOTAL                 :"
-#~ msgstr " ZUSAMMEN              :"
-
-#~ msgid "time in %s: %ld.%06ld (%ld%%)\n"
-#~ msgstr "Zeit in %s: %ld.%06ld (%ld%%)\n"
-
-#~ msgid "invalid $ value: $%d"
-#~ msgstr "unzulässiger $-Wert: $%d"
-
-#~ msgid "%s: option '--%s' doesn't allow an argument\n"
-#~ msgstr "%s: Option „--%s“ erlaubt kein Argument\n"
-
-#~ msgid "%s: unrecognized option '--%s'\n"
-#~ msgstr "%s: unbekannte Option „--%s“\n"
-
-#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
-#~ msgstr "%s: Option „-W %s“ erlaubt kein Argument\n"
-
-#~ msgid "%s: option '-W %s' requires an argument\n"
-#~ msgstr "%s: Option „-W %s“ erfordert ein Argument\n"
-
-#~ msgid "empty"
-#~ msgstr "leer"
-
-#~ msgid "a ';' might be needed at the end of action code"
-#~ msgstr "ein ‚;‘ könnte am Ende von Aktionscode nötig sein"
-
-#~ msgid "future versions of Bison will not add the ';'"
-#~ msgstr "zukünftige Versionen von Bison werden das ‚;‘ nicht hinzufügen"
-
-#~ msgid "use of YYFAIL, which is deprecated and will be removed"
-#~ msgstr "Benutzung von YYFAIL, was veraltet ist und bald entfernt wird"
-
-#~ msgid "redeclaration for default tagged %%destructor"
-#~ msgstr "erneute Deklaration für voreingestellten markierten %%destructor"
-
-#~ msgid "redeclaration for default tagless %%destructor"
-#~ msgstr ""
-#~ "erneute Deklaration für voreingestellten nicht-markierten %%destructor"
-
-#~ msgid "redeclaration for default tagged %%printer"
-#~ msgstr "erneute Deklaration für voreingestellten markierten %%printer"
-
-#~ msgid "redeclaration for default tagless %%printer"
-#~ msgstr "erneute Deklaration für voreingestellten nicht-markierten %%printer"
-
-#~ msgid "state %d"
-#~ msgstr "Zustand %d"
-
-#~ msgid "stray '@'"
-#~ msgstr "herumstreunendes ‚@‘"
-
-#~ msgid ""
-#~ "undefined %%define variable `%s' passed to muscle_percent_define_get_loc"
-#~ msgstr ""
-#~ "undefinierte %%define-Variable „%s“ an muscle_percent_define_get_loc "
-#~ "übergeben"
-
-#~ msgid ""
-#~ "undefined %%define variable `%s' passed to "
-#~ "muscle_percent_define_get_syncline"
-#~ msgstr ""
-#~ "undefinierte %%define-Variable „%s“ an muscle_percent_define_get_syncline "
-#~ "übergeben"
-
-#~ msgid ""
-#~ "undefined %%define variable `%s' passed to muscle_percent_define_flag_if"
-#~ msgstr ""
-#~ "undefinierte %%define-Variable „%s“ an muscle_percent_define_flag_if "
-#~ "übergeben"
-
-#~ msgid ""
-#~ "undefined %%define variable `%s' passed to "
-#~ "muscle_percent_define_check_values"
-#~ msgstr ""
-#~ "undefinierte %%define-Variable „%s“ an muscle_percent_define_check_values "
-#~ "übergeben"
-
-#~ msgid "useless nonterminal: %s"
-#~ msgstr "nutzloses Nicht-Terminal: %s"
-
-#~ msgid "Useless nonterminals"
-#~ msgstr "Nutzlose Nicht-Terminale"
-
-#~ msgid "Terminals which are not used"
-#~ msgstr "Nicht genutzte Terminale"
-
-#~ msgid "Useless rules"
-#~ msgstr "Nutzlose Regeln"
-
-#~ msgid "%d rule never reduced\n"
-#~ msgid_plural "%d rules never reduced\n"
-#~ msgstr[0] "%d Regel wurde niemals reduziert\n"
-#~ msgstr[1] "%d Regeln wurden niemals reduziert\n"
-
-#~ msgid "POSIX forbids declarations in the grammar"
-#~ msgstr "POSIX verbietet Deklarationen in der Grammatik"
-
-#~ msgid "invalid $ value"
-#~ msgstr "unzulässiger $-Wert"
-
-#~ msgid "conflicting associativities for %s (%s) and %s (%s)"
-#~ msgstr "Assoziativitäts-Werte für %s (%s) und %s (%s) widersprechen sich"
-
-#~ msgid "and"
-#~ msgstr "und"
-
-#~ msgid "conflicts: "
-#~ msgstr "Konflikte: "
-
-#~ msgid "State %d contains "
-#~ msgstr "Zustand %d enthält "
-
-#~ msgid "too many gotos (max %d)"
-#~ msgstr "zu viele Gotos (max %d)"
-
-#~ msgid "%s is invalid"
-#~ msgstr "%s ist unzulässig"
-
-#~ msgid "too many states (max %d)"
-#~ msgstr "zu viele Zustände (max %d)"
-
-#~ msgid "%s: no grammar file given\n"
-#~ msgstr "%s: keine Grammatik-Datei angegeben\n"
-
-#~ msgid "%s: extra arguments ignored after `%s'\n"
-#~ msgstr "%s: zusätzliche Argumente nach „%s“ werden ignoriert\n"
-
-#~ msgid "two @prec's in a row"
-#~ msgstr "zwei @prec-Anweisungen nacheinander"
-
-#~ msgid "only one %%dprec allowed per rule"
-#~ msgstr "nur ein %%dprec pro Regel erlaubt"
-
-#~ msgid "Entering append_states, state = %d\n"
-#~ msgstr "Betrete append_states, Zustand = %d\n"
-
-#~ msgid "Processing state %d (reached by %s)\n"
-#~ msgstr "Verarbeite Zustand %d (erreicht von %s)\n"
-
-#~ msgid "Closure: %s\n"
-#~ msgstr "Abschluss: %s\n"
-
-#~ msgid "  (rule %d)\n"
-#~ msgstr "  (Regel %d)\n"
-
-#~ msgid "input"
-#~ msgstr "Eingabe"
-
-#~ msgid "output"
-#~ msgstr "Ausgabe"
-
-#~ msgid "State %d: %d lookaheads\n"
-#~ msgstr "Zustand %d: %d Vorschauen\n"
-
-#~ msgid "   on %d (%s) -> rule %d\n"
-#~ msgstr "   auf %d (%s) -> Regel %d\n"
-
-#~ msgid "Lookaheads: END\n"
-#~ msgstr "Vorschau: ENDE\n"
-
-#~ msgid "relation_transpose: input\n"
-#~ msgstr "relation_transpose: Eingabe\n"
-
-#~ msgid "relation_transpose: output\n"
-#~ msgstr "relation_transpose: Ausgabe\n"
-
-#~ msgid "unescaped newline in constant"
-#~ msgstr "nicht maskiertes Zeilenendezeichen in Konstante"
-
-#~ msgid "octal value outside range 0...255: `\\%o'"
-#~ msgstr "oktaler Zahlenwert außerhalb des Bereichs 0...255: „\\%o“"
-
-#~ msgid "hexadecimal value above 255: `\\x%x'"
-#~ msgstr "hexadezimaler Zahlenwert größer als 255: „\\x%x“"
-
-# Oder soll man den Begriff "Escapezeichen" verwenden?
-#~ msgid "unknown escape sequence: `\\' followed by `%s'"
-#~ msgstr "unbekanntes Escapezeichen: „\\“ gefolgt von „%s“"
-
-#~ msgid "unterminated type name at end of file"
-#~ msgstr "unerwarteter Typname am Ende der Datei"
-
-#~ msgid "unterminated type name"
-#~ msgstr "unerwarteter Typname"
-
-#~ msgid "use \"...\" for multi-character literal tokens"
-#~ msgstr "für Literal mit mehreren Zeichen bitte \"...\" verwenden"
-
-#~ msgid "    $default\treduce using rule %d (%s)\n"
-#~ msgstr "    $default\treduziere mit Regel %d (%s)\n"
-
-#~ msgid "    $default\taccept\n"
-#~ msgstr "    $default\takzeptiere\n"
-
-#~ msgid "Number, Line, Rule"
-#~ msgstr "Nummer, Zeile, Regel"
-
-#~ msgid "   Skipping to next \\n"
-#~ msgstr "   Überspringe Zeichen bis zum nächsten \\n"
-
-#~ msgid "   Skipping to next %c"
-#~ msgstr "   Überspringe Zeichen bis zum nächten %c"
-
-#~ msgid "unterminated string"
-#~ msgstr "unbeendete Zeichenkette"
-
-#~ msgid "unterminated `%{' definition"
-#~ msgstr "unbeendete „%{“-Definition"
-
-#~ msgid "Premature EOF after %s"
-#~ msgstr "Vorzeitiges EOF nach %s"
-
-#~ msgid "`%s' is invalid in %s"
-#~ msgstr "„%s“ ist in %s nicht erlaubt"
-
-#~ msgid "%type declaration has no <typename>"
-#~ msgstr "%type-Deklaration hat keinen <Typ-Namen>"
-
-#~ msgid "invalid %%type declaration due to item: %s"
-#~ msgstr "ungültige %%type-Deklaration wegen: %s"
-
-#~ msgid "invalid text (%s) - number should be after identifier"
-#~ msgstr "unzulässiger Text (%s) - Zahl sollte nach Bezeichner kommen"
-
-#~ msgid "unexpected item: %s"
-#~ msgstr "unerwartetes Symbol: %s"
-
-#~ msgid "unmatched %s"
-#~ msgstr "%s ohne Gegenstück"
-
-#~ msgid "argument of %%expect is not an integer"
-#~ msgstr "Argument von %%expect ist keine ganze Zahl"
-
-#~ msgid "unrecognized item %s, expected an identifier"
-#~ msgstr "unerwartetes Symbol %s, hier wird ein Bezeichner erwartet"
-
-#~ msgid "expected string constant instead of %s"
-#~ msgstr "hier wird eine Zeichenkette erwartet, nicht %s"
-
-#~ msgid "no input grammar"
-#~ msgstr "keine Eingabe-Grammatik"
-
-#~ msgid "unknown character: %s"
-#~ msgstr "unbekanntes Zeichen: %s"
-
-#~ msgid "ill-formed rule: initial symbol not followed by colon"
-#~ msgstr ""
-#~ "falsch geformte Regel: führendes Symbol wird nicht von einem Semikolon "
-#~ "gefolgt"
-
-#~ msgid "grammar starts with vertical bar"
-#~ msgstr "Grammatik fängt mit einem vertikalen Strich („|“) an"
-
-#~ msgid "previous rule lacks an ending `;'"
-#~ msgstr "vorangehende Regel hat kein abschließendes „;“"
-
-#~ msgid "two actions at end of one rule"
-#~ msgstr "Zwei Aktionen am Ende einer Regel"
-
-#~ msgid "    $   \tgo to state %d\n"
-#~ msgstr "    $   \tgehe zu Zustand %d über\n"
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "Tokennummer %d erneut deklariert für %s"
diff --git a/po/el.gmo b/po/el.gmo
index 9ec88bf..50ff3d1 100644
--- a/po/el.gmo
+++ b/po/el.gmo
Binary files differ
diff --git a/po/el.po b/po/el.po
index c613cf5..6e1cc85 100644
--- a/po/el.po
+++ b/po/el.po
@@ -2,13 +2,13 @@
 # Copyright (C) 2008 Free Software Foundation, Inc.
 # This file is distributed under the same license as the bison package.
 #
-# Lefteris Dimitroulakis <ledimitro@gmail.com>, 2008, 2013, 2019.
+# Lefteris Dimitroulakis <ledimitro@gmail.com>, 2008, 2013, 2019, 2020, 2021.
 msgid ""
 msgstr ""
-"Project-Id-Version: bison-3.3.90\n"
+"Project-Id-Version: bison-3.6.93\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-04-30 15:11+0200\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2021-01-12 00:43+0200\n"
 "Last-Translator: Lefteris Dimitroulakis <ledimitro@gmail.com>\n"
 "Language-Team: Greek <team@lists.gnome.gr>\n"
 "Language: el\n"
@@ -17,210 +17,368 @@
 "Content-Transfer-Encoding: 8bit\n"
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=( n !=1);\n"
-"X-Generator: Lokalize 2.0\n"
+"X-Generator: Poedit 2.4.2\n"
 
-#: src/complain.c:114
-msgid "S/R conflicts (enabled by default)"
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr "αριθμός"
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr "συνάρτηση"
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr "μεταβλητή"
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
 msgstr ""
 
-#: src/complain.c:115
-msgid "R/R conflicts (enabled by default)"
-msgstr ""
-
-#: src/complain.c:116
-msgid "string aliases not attached to a symbol"
-msgstr ""
-
-#: src/complain.c:117
-msgid "obsolete constructs"
-msgstr ""
-
-#: src/complain.c:118
+#: examples/c/bistromathic/parse.y:372
 #, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "μη έγκυρος χαρακτήρας: %s"
+
+#: examples/c/bistromathic/parse.y:389
+msgid "%@: syntax error"
+msgstr "%@: συντακτικό σφάλμα"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr "%@: συντακτικό σφάλμα: μη αναμενόμενο %u"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "%@: συντακτικό σφάλμα: αναμενόταν %0e πριν από %u"
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "%@: συντακτικό σφάλμα: αναμενόταν %0e ή %1e πριν το %u"
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "%@: συντακτικό σφάλμα: αναμενόταν %0e ή %1e ή %2e πριν από %u"
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr "%@: συντακτικό σφάλμα: αναμενόταν %0e ή %1e ή %2e ή %3e πριν από %u"
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+"%@: συντακτικό σφάλμα: αναμενόταν %0e ή %1e ή %2e ή %3e ή %4e πριν από %u"
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+"%@: συντακτικό σφάλμα: αναμενόταν %0e ή %1e ή %2e ή %3e ή %4e ή %5e πριν από "
+"%u"
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+"%@: συντακτικό σφάλμα: αναμενόταν %0e ή %1e ή %2e ή %3e ή %4e ή %5e κλπ., "
+"πριν από %u"
+
+#: examples/java/calc/Calc.y:81
+msgid "end of line"
+msgstr "πέρας γραμμής"
+
+#: src/complain.c:153
+msgid "S/R conflicts (enabled by default)"
+msgstr "συγκρούσεις S/R (ενεργοποίηση εκ προεπιλογής)"
+
+#: src/complain.c:154
+msgid "R/R conflicts (enabled by default)"
+msgstr "συγκρούσεις R/R (ενεργοποίηση εκ προεπιλογής)"
+
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr "παραγωγή αντιπαραδειγμάτων συγκρούσεως"
+
+#: src/complain.c:156
+msgid "string aliases not attached to a symbol"
+msgstr "συνώνημο συμβολοσειράς μη συνδεδεμένο σε σύμβολο"
+
+#: src/complain.c:157
+msgid "obsolete constructs"
+msgstr "απαρχαιωμένες δομές"
+
+#: src/complain.c:158
+#, c-format
 msgid "empty rules without %empty"
-msgstr "κενός κανόνας χωρίς κενό %%"
+msgstr "κενοί κανόνες χωρίς %empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
-msgstr ""
+msgstr "τιμές ενδιαμέσων κανόνων μη ορισμένες ή μη χρησιμοποιούμενες"
 
-#: src/complain.c:120
-#, fuzzy
+#: src/complain.c:160
 msgid "useless precedence and associativity"
-msgstr "άχρηστη προτεραιότητα και προσεταιριστικότητα για %s"
+msgstr "άχρηστη προτεραιότητα και προσεταιριστικότητα"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
-msgstr ""
+msgstr "ασυμβατότητες με POSIX Yacc"
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
-msgstr ""
+msgstr "όλες οι άλλες προειδοποιήσεις (ενεργοποίηση από προεπιλογή)"
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
+"όλες οι προειδοποιήσεις εκτός «counterexamples», «dangling-alias» και «yacc»"
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
-msgstr ""
+msgstr "απενεργοποίηση προειδοποιήσεων στην ΚΑΤΗΓΟΡΙΑ"
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
-msgstr ""
+msgstr "απενεργοποίηση όλων των προειδοποιήσεων"
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
-msgstr ""
+msgstr "θεώρησε τις προειδοποιήσεις ως σφάλματα"
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
-msgstr ""
+msgstr "Κατηγορίες προειδοποιήσεων:"
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "προειδοποίηση"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "σφάλμα"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "μοιραίο σφάλμα"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr "σημείωση"
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr "Το POSIX Yacc δεν υποστηρίζει %s"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "οδηγία υπό κατάργηση: %s, χρησιμοποίησε %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, c-format
 msgid "duplicate directive"
 msgstr "ταυτόσημη οδηγία"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, c-format
 msgid "duplicate directive: %s"
 msgstr "ταυτόσημη οδηγία: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "προηγούμενη δήλωση"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "μόνο ένα %s ανά κανόνα επιτρέπεται"
 
-#: src/conflicts.c:81
-#, fuzzy, c-format
+#: src/complain.c:647
+msgid "syntax error"
+msgstr "συντακτικό σφάλμα"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr "μη αναμενόμενο %0$s"
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr "αναμενόταν %1$s πριν από %0$s"
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr "αναμενόταν %1$s ή %2$s πριν από %0$s"
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr "αναμενόταν %1$s ή %2$s ή %3$s πριν από %0$s"
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr "αναμενόταν %1$s ή %2$s ή %3$s ή %4$s πριν από %0$s"
+
+#: src/conflicts.c:88
+#, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr ""
 "Η σύγκρουση μεταξύ του κανόνα %d και της λεκτικής μονάδας %s επιλύθηκε ως "
 "ολίσθηση"
 
-#: src/conflicts.c:91
-#, fuzzy, c-format
+#: src/conflicts.c:98
+#, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr ""
 "Η σύγκρουση μεταξύ του κανόνα %d και της λεκτικής μονάδας %s επιλύθηκε ως "
 "ελάττωση"
 
-#: src/conflicts.c:100
-#, fuzzy, c-format
+#: src/conflicts.c:107
+#, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr ""
 "Η σύγκρουση μεταξύ του κανόνα %d και της λεκτικής μονάδας %s επιλύθηκε ως "
 "σφάλμα"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Κατάσταση %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "συγκρούσεις: %d ολίσθηση/ελάττωση, %d ελάττωση/ελάττωση\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "συγκρούσεις: %d ολίσθηση/ελάττωση\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "συγκρούσεις: %d ελάττωση/ελάττωση\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "shift/reduce συγκρούσεις για κανόνα %d: βρέθηκαν %d, αναμενόταν %d"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "reduce/reduce συγκρούσεις για κανόνα %d: βρέθηκαν %d, αναμενόταν %d"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr έχει εφαρμογή μόνο σε συντακτικούς αναλυτές GLR"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "shift/reduce συγκρούσεις: βρέθηκαν %d, αναμενόταν %d"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d σύγκρουση ολίσθηση/ελάττωση"
 msgstr[1] "ανέμενα %d συγκρούσεις ολίσθηση/ελάττωση"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "reduce/reduce συγκρούσεις: βρέθηκαν %d, αναμενόταν %d"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d σύγκρουση ελάττωση/ελάττωση"
 msgstr[1] "%d συγκρούσεις ελάττωση/ελάττωση"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+"επανεκτέλεση με την επιλογή «-Wcounterexamples» για παραγωγή "
+"αντιπαραδειγμάτων συγκρούσεως"
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr "Παράδειγμα"
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr "Πρώτο παράδειγμα"
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr "Δεύτερο παράδειγμα"
+
+#: src/counterexample.c:126
+msgid "Shift derivation"
+msgstr "Παραγωγή ολίσθησης"
+
+#: src/counterexample.c:126
+msgid "First reduce derivation"
+msgstr "Πρώτη ελάττωση"
+
+#: src/counterexample.c:128
+msgid "Reduce derivation"
+msgstr "Παραγωγή ελάττωσης"
+
+#: src/counterexample.c:128
+msgid "Second reduce derivation"
+msgstr "Δεύτερη παραγωγή ελάττωσης"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "σύγκρουση ολίσθηση/ελάττωση στη λεκτική μονάδα %s"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ":"
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "σύγκρουση ελάττωση/ελάττωση στη λεκτική μονάδα %s"
+msgstr[1] "reduce/reduce conflict on tokens %s"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: αδυναμία ανοίγματος"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "σφάλμα εισόδου/εξόδου"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "δεν μπορώ να κλείσω το αρχείο"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "άρνηση εγγραφής πάνω στο αρχείο εισόδου %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "αντικρουόμενες έξοδοι στο αρχείο %s"
@@ -230,120 +388,122 @@
 msgid "%s: cannot backup"
 msgstr "%s: αδυναμία δημιουργίας αντιγράφου ασφαλείας"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
-msgstr ""
+msgstr "χρωματισμός εξόδου"
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
-msgstr ""
+msgstr "μη χρωματισμός εξόδου"
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
-msgstr ""
+msgstr "χρωματισμός αν η συσκευή εξόδου είναι tty"
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
-msgid "WHEN can be one of the following:"
-msgstr ""
-
 #: src/getargs.c:209
+msgid "WHEN can be one of the following:"
+msgstr "ΠΌΤΕ μπορεί νάναι ένα από τα παρακάτω:"
+
+#: src/getargs.c:222
 msgid "describe the states"
-msgstr ""
+msgstr "περιγραφή των καταστάσεων"
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
-msgstr ""
+msgstr "συμπληρώστε με το κλείσιμό τους τα σύνολα των βασικών στοιχείων"
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
-msgstr ""
+msgstr "συσχετίστε σαφώς τις λεκτικές μονάδες lookahead με τα στοιχεία"
 
-#: src/getargs.c:212
-#, fuzzy
+#: src/getargs.c:225
 msgid "describe shift/reduce conflicts solving"
-msgstr "%d σύγκρουση ολίσθηση/ελάττωση"
+msgstr "περιγράφει τη λύση των συγκρούσεων με ολίσθηση/ελάττωση"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
-msgstr ""
+msgstr "να συμπεριληφθεί όλη η παραπάνω πληροφορία"
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
-msgstr ""
+msgstr "απενεργοποίηση της αναφοράς"
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
+"THINGS είναι μια λίστα λέξεων χωρισμένων με κόμματα που μπορεί να "
+"περιλαμβάνει:"
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
+"TRACES είναι μια λίστα λέξεων χωρισμένων με κόμματα που μπορεί να "
+"περιλαμβάνει:"
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
-msgstr ""
+msgstr "εμφάνισε τα σφάλματα με carets"
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
-msgstr ""
+msgstr "εμφάνισε διορθώσεις machine-readable"
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
-msgstr ""
+msgstr "μη δημιουργήσεις αρχείο"
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
-msgstr ""
+msgstr "όλα τα παραπάνω"
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
-msgstr ""
+msgstr "απενεργοποίηση όλων των παραπάνω"
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
+"FEATURES είναι μια λίστα λέξεων χωρισμένες απο κόμματα που μπορεί να "
+"περιλαμβάνει:"
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Δοκίμασε «%s --help» για περισσότερες πληροφορίες.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
-msgstr "Χρήση: %s [ΕΠΛΟΓΕΣ]... ΑΡΧΕΙΟ\n"
+msgstr "Χρήση: %s [ΕΠΙΛΟΓΗ]... ΑΡΧΕΙΟ\n"
 
-#: src/getargs.c:356
-#, fuzzy
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
 "\n"
 msgstr ""
-"Generate a deterministic LR or generalized LR (GLR) parser employing\n"
-"LALR(1), IELR(1), or canonical LR(1) parser tables.  IELR(1) and\n"
-"canonical LR(1) support is experimental.\n"
+"Παραγωγή ντετερμινιστικού LR ή γενικευμένου LR (GLR) συντακτικού αναλυτή\n"
+"με την χρήση πινάκων LALR(1), IELR(1), ή canonical LR(1) .\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Υποχρεωτικά ορίσματα σε μακρές επιλογές είναι υποχρεωτικά επίσης και στις "
 "κοντές.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Το ίδιο ισχύει και για τα μη υποχρεωτικά ορίσματα.\n"
 
-#: src/getargs.c:370
-#, fuzzy
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -358,20 +518,17 @@
 "  -f, --feature[=FEATURES]   activate miscellaneous features\n"
 "\n"
 msgstr ""
-"\n"
 "Τρόποι λειτουργίας:\n"
 "  -h, --help                 εμφάνιση αυτής εδώ της βοήθειας κι έξοδος\n"
 "  -V, --version              πληροφορίες έκδοσης κι έξοδος\n"
-"      --print-localedir      ο κατάλογος με τα δεδομένα των locale\n"
+"      --print-localedir      ο κατάλογος με τα δεδομένα των locale κι "
+"έξοδος\n"
 "      --print-datadir        ο κατάλογος με σκελετούς και XSLT κι έξοδος\n"
 "  -u, --update      εφαρμογή διορθώσεων στο αρχείο γραμματικής κι έξοδος\n"
-"  -y, --yacc                 emulate POSIX Yacc\n"
-"  -W, --warnings=[ΚΑΤΗΓΟΡΙΑ]  παρουσιάζει τις προειδοποιήσεις που ανήκουν "
-"στη ΚΑΤΗΓΟΡΙΑ\n"
 "  -f, --feature[=FEATURES]  ενεργοποίηση διαφόρων features\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -379,9 +536,15 @@
 "      --style=FILE           specify the CSS FILE for colorizer diagnostics\n"
 "\n"
 msgstr ""
+"Diagnostics:\n"
+"  -W, --warnings[=CATEGORY]  αναφορά των προειδοποιήσεων που πέφτουν στην "
+"CATEGORY\n"
+"      --color[=ΠΌΤΕ]         πότε να χρωματίζεται η διάγνωση\n"
+"      --style=FILE           specify the CSS FILE for colorizer diagnostics\n"
+"\n"
 
-#: src/getargs.c:400
-#, fuzzy, c-format
+#: src/getargs.c:421
+#, c-format
 msgid ""
 "Tuning the Parser:\n"
 "  -L, --language=LANGUAGE          specify the output programming language\n"
@@ -404,28 +567,33 @@
 "σφάλματος\n"
 "                                   το ίδιο με «-Dparse.trace»\n"
 "      --locations        ενεργοποίηση υποστήριξης θέσεως\n"
-"  -D, --define=NAME[=VALUE]        ανάλογο του «%define NAME \"VALUE\"»\n"
-"  -F, --force-define=NAME[=VALUE]  override '%define NAME \"VALUE\"'\n"
+"  -D, --define=NAME[=VALUE]        ανάλογο του '%define NAME VALUE'\n"
+"  -F, --force-define=NAME[=VALUE]  override '%define NAME VALUE'\n"
 "  -p, --name-prefix=PREFIX    πρόθεση του PREFIX στα εξωτερικά σύμβολα\n"
-"                              προς αντικατάσταση από «-Dapi.prefix=PREFIX»\n"
-"  -l, --no-lines            μη δημιουργήσεις οδηγίες «#line»\n"
+"                              προς αντικατάσταση από '-Dapi."
+"prefix={PREFIX}'\n"
+"  -l, --no-lines            μη δημιουργήσεις οδηγίες '#line'\n"
 "  -k, --token-table      να συμπεριληφθεί πίνακας με ονόματα λεκτικών "
 "μονάδων\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Έξοδος:\n"
 "      --defines[=ΑΡΧΕΙΟ]       παράγει επίσης ένα αρχείο επικεφαλίδας\n"
@@ -435,53 +603,52 @@
 "  -v, --verbose                           το ίδιο με  «--report=state»\n"
 "  -b, --file-prefix=ΠΡΟΘΕΜΑ   καθορίζει ΠΡΟΘΕΜΑ για τα αρχεία εξόδου\n"
 "  -o, --output=ΑΡΧΕΙΟ          έξοδος στο ΑΡΧΕΙΟ\n"
-"  -g, --graph[=ΑΡΧΕΙΟ]         καθορισμός σε VCG της εξόδου του αυτομάτου\n"
+"  -g, --graph[=ΑΡΧΕΙΟ]         έξοδος επίσης ενός γράφου του αυτομάτου\n"
 "  -x, --xml[=ΑΡΧΕΙΟ]           αναφορά από το αυτόματο σε μορφή XML\n"
-"                             (η μορφή XML είναι σε πειραματικό στάδιο)\n"
+"  -M, --file-prefix-map=OLD=NEW αντικατάσταση προθέματος OLD από το NEW όταν "
+"γράφει τη διαδρομή αρχείου\n"
+"                                στο αρχείο εξοδου\n"
+"\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Αναφορά σφαλμάτων σε <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "%s home page: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+#, fuzzy
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
 "Γενική βοήθεια χρήσης του λογισμικού GNU: <http://www.gnu.org/gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+#, fuzzy
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr "Αναφορά σφαλμάτων μετάφρασης <http://translationproject.org/team/>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "Για πλήρη τεκμηρίωση δώσε: info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Γράφτηκε από τους Robert Corbett και Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -489,295 +656,352 @@
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "πολλαπλές δηλώσεις σκελετού είναι μη έγκυρες"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: μη έγκυρη γλώσσα"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "πολλαπλές δηλώσεις γλώσσας είναι μη έγκυρες"
 
-#: src/getargs.c:816
-#, fuzzy, c-format
-msgid "deprecated option: %s, use %s"
-msgstr "οδηγία υπό κατάργηση: %s, χρησιμοποίησε %s"
+#: src/getargs.c:760
+#, c-format
+msgid "invalid argument for %s: %s"
+msgstr "μη έγκυρο όρισμα για %s: %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:868
+#, c-format
+msgid "deprecated option: %s, use %s"
+msgstr "μη έγκυρη επιλογή: %s, χρησιμοποίησε %s"
+
+#: src/getargs.c:902
 #, c-format
 msgid "missing operand"
-msgstr "λείπει τελεστέος"
+msgstr "τελεστέος που λείπει"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "επί πλέον τελεστέος %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Γραμματική"
 
 #: src/graphviz.c:46
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "// Generated by %s.\n"
 "// Report bugs to <%s>.\n"
 "// Home page: <%s>.\n"
 "\n"
 msgstr ""
-"\n"
 "// Generated by %s.\n"
-"// Αναφορά σφαλμάτων στο <%s>.\n"
+"// Αναφορά σφαλμάτων  <%s>.\n"
 "// Home page: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+msgid "end of file"
+msgstr "πέρας αρχείου"
+
+#: src/i18n-strings.c:36
+msgid "invalid token"
+msgstr "μη έγκυρη λεκτική μονάδα"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "υπερχείλιση αριθμού γραμμών"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "υπερχείλιση αριθμού στηλών"
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
-msgstr "υπερχείλιση byte number"
+msgstr "υπερχείλιση αριθμού byte"
 
 #. TRANSLATORS: This is used when a line is too long, and is
 #. displayed truncated.  Use an ellipsis appropriate for your
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
-msgstr ""
+msgstr "..."
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "ο κανόνας είναι άχρηστος στον αναλυτή λόγω συγκρούσεων"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
-msgstr "fix-its μπορεί να εφαρμοστεί.  Ξανατρέξε με την επιλογή '--update'."
+msgstr "fix-its μπορεί να εφαρμοστεί.  Ξανατρέξετο με την επιλογή '--update'."
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
-msgstr "%%define variable %s redefined"
+msgstr "%%define μεταβλητή %s ξαναορίστηκε"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "προηγούμενος ορισμός"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
-msgstr "%s: ακαθόριστο %%καθόρισε τη μεταβλητή %s"
+msgstr "%s: μη ορισμένη %%define μεταβλητή %s"
+
+#: src/muscle-tab.c:624
+#, c-format
+msgid "%%define variable '%s' requires '{...}' values"
+msgstr "%%define variable '%s' απαιτεί '{...}' values"
 
 #: src/muscle-tab.c:629
-#, fuzzy, c-format
-msgid "%%define variable '%s' requires '{...}' values"
-msgstr "%%define variable %s redefined"
+#, c-format
+msgid "%%define variable '%s' requires keyword values"
+msgstr "%%define variable '%s' απαιτεί keyword values"
 
 #: src/muscle-tab.c:634
-#, fuzzy, c-format
-msgid "%%define variable '%s' requires keyword values"
-msgstr "%%define variable %s redefined"
-
-#: src/muscle-tab.c:639
-#, fuzzy, c-format
+#, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
-msgstr "%%define variable %s redefined"
+msgstr "%%define variable '%s' απαιτεί '\"...\"' values"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
-msgstr "μη έγκυρη τιμή για %%καθόρισε τη μεταβλητή μπουλ %s"
+msgstr "invalid value for %%define Boolean variable %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "μη έγκυρη τιμή για %%καθόρισε τη μεταβλητή %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "αποδεκτή τιμή: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr "αλφαριθμητικό"
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr "μεταφράσιμο αλφαριθμητικό"
+
+#: src/parse-gram.y:214
+msgid "[identifier]"
+msgstr "[αναγνωριστής]"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr "κυριολεκτικός χαρακτήρας"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr "επίλογος"
+
+#: src/parse-gram.y:219
+msgid "identifier"
+msgstr "αναγνωριστής"
+
+#: src/parse-gram.y:220
+msgid "identifier:"
+msgstr "αναγνωριστής:"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr "<tag>"
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr "κυριολεκτικός ακέραιος"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr "character literals δεν μπορεί να είναι nonterminals"
 
-#: src/parse-gram.y:753
-#, fuzzy, c-format
+#: src/parse-gram.y:786
+#, c-format
 msgid "character literals cannot be used together with %s"
-msgstr "character literals δεν μπορεί να είναι nonterminals"
+msgstr "character literals δεν μπορούν να χρησιμοποιηθούν μαζί με %s"
 
-#: src/parse-gram.y:758
-#, fuzzy, c-format
+#: src/parse-gram.y:789
+#, c-format
 msgid "definition of %s"
-msgstr "ορισμός ξανά του αριθμού λεκτικής μονάδας του %s"
+msgstr "ορισμός του %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "το όνομα λείπει στη δήλωση παραμέτρου"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, c-format
 msgid "invalid version requirement: %s"
-msgstr "invalid version requirement: %s"
+msgstr "αίτηση μη έγκυρης έκδοσης: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr "απαιτεί bison %s, αλλά διαθέτει %s"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
-msgstr "Κατάσταση %d "
+msgstr "Κατάσταση %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr ""
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "ολίσθηση, και μετάβαση στη κατάσταση %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "πήγαινε στην κατάσταση %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "σφάλμα (μη προσεταιριστικό)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "ελάττωση με χρήση του κανόνα %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "αποδοχή"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "ελάττωση με χρήση του κανόνα %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Τερματικά σύμβολα, με κανόνες όπου εμφανίζονται"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Μη τερματικά σύμβολα, με κανόνες όπου εμφανίζονται"
 
-#: src/print.c:416
+#: src/print.c:431
 msgid "on left:"
 msgstr "στα αριστερά:"
 
-#: src/print.c:425
+#: src/print.c:440
 msgid "on right:"
 msgstr "στα δεξιά:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Κανόνες άχρηστοι στον αναλυτή λόγω συγκρούσεων"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "πολλαπλές δηλώσεις του %s"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "σύγκρουση παραγόμενου τύπου στη συνάρτηση συγχώνευσης %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "διπλό όνομα συμβόλου για %s αγνοήθηκε"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "κανόνας δοσμένος για %s, που είναι λεκτική μονάδα"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "σύγκρουση τύπων στην προεπιλεγμένη ενέργεια: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "κενός κανόνας για μη τερματικό σύμβολο με τύπο, και ουδεμία ενέργεια"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "μη χρησιμοποιούμενη τιμή: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "μη καθορισμένη τιμή: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%κενός ή μη κενός κανόνας"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "κενός κανόνας χωρίς κενό %%"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "λεκτική μονάδα για %%prec δεν είναικαθορισμένη: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr "only midrule actions can be typed: %s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s επηρεάζει μόνο αναλυτές GLR"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s πρέπει να ακολουθείται από θετικό αριθμό"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr "Το POSIX Yacc δεν υποστηρίζει typed midrule actions"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "κανόνας πολύ μεγάλος"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "το σύμβολο εκκίνησης %s δεν είναι καθορισμένο"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "το σύμβολο εκκίνησης  %s είναι λεκτική μονάδα"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "γραμματική εισόδου χωρίς κανόνες"
@@ -786,312 +1010,308 @@
 msgid "rule useless in grammar"
 msgstr "άχρηστος κανόνας στη γραμματική"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "μη τερματικό σύμβολο άχρηστο στη γραμματική: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Μη τερματικά σύμβολα άχρηστα στη γραμματική"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Τερματικά σύμβολα μη χρησιμοποιούμενα στη γραμματική"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Άχρηστοι κανόνες στη γραμματική"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "μη τερματικό σύμβολο %d άχρηστο στη γραμματική"
 msgstr[1] "μη τερματικά σύμβολα %d άχρηστα στη γραμματική"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "ο κανόνας %d είναι άχρηστος στη γραμματική"
 msgstr[1] "οι κανόνες %d είναι άχρηστοι στη γραμματική"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "το αρχικό σύμβολο %s δεν παράγει καμιά πρόταση"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "stray '%s'"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "refers to: %c%s at %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "πιθανή σημασία: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", απόκρυψη %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
-msgstr "σε %s"
+msgstr " σε%s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", cannot be accessed from midrule action at $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "ακέραιος εκτός ορίων: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "μη έγκυρη αναφορά: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 "συντακτικό σφάλμα μετά «%c», αναμενόταν ακέραιος, γράμμα, «_», «[», ή «$»"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "σύμβολο δεν βρέθηκε στην παραγωγή πριν $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "σύμβολο δεν βρέθηκε στην παραγωγή: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "παραπλανητική αναφορά: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "διφορούμενη αναφορά: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "ρητή δήλωση τύπου δόθηκε σε γραμματική χωρίς τύπους"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ για την midrule στο $%d του «%s» δεν έχει δηλωμένο τύπο"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ του «%s» δεν έχει δηλωμένο τύπο"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s του %s δεν έχει δηλωμένο τύπο"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr "πολλαπλές παρουσίες $%d με api.value.automove"
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "μη έγκυρος μηδενικός χαρακτήρας: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "μοναχικό « , » θεωρήθηκε ως λευκό διάστημα"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "μη έγκυρη οδηγία: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "μη έγκυρη οδηγία: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "μη έγκυρος χαρακτήρας: %s"
 msgstr[1] "μη έγκυροι χαρακτήρες: %s"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "μη έγκυρος μηδενικός χαρακτήρας"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "μη αναμενόμενο identifier στο όνομα εντός αγκυλών: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "αναμενόταν identifier"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "μη έγκυρος χαρακτήρας: %s"
 msgstr[1] "μη έγκυροι χαρακτήρες: %s"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr "Το POSIX Yacc δεν υποστηρίζει string literals"
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "κενό character literal"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "έξτρα χαρακτήρες σε character literal"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "μη έγκυρος μηδενικός χαρακτήρας: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "μη έγκυρος χαρακτήρας: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr "Το POSIX Yacc δεν υποστηρίζει δεκαεξαδικά literals"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "στο τέλος του αρχείου λείπει «%s»"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "στο τέλος της γραμμής λείπει «%s»"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "unclosed %s οδηγία στο σκελετό"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "πολύ λίγα ορίσματα για την οδηγία %s στο σκελετό"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "πάρα πολλά ορίσματα για την οδηγία %s στο σκελετό"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc απαγορεύει τις παύλες στα ονόματα συμβόλων: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "πάρα πολλά σύμβολα στη γραμματική εισόδου (το όριο είναι %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "δήλωση ξανά του %s για %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "δήλωση ξανά του %s για <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "το σύμβολο %s ξαναδηλώθηκε ως λεκτική μονάδα"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "το σύμβολο %s ξαναδηλώθηκε ως nonterminal"
 
-#: src/symtab.c:370
-#, fuzzy, c-format
+#: src/symtab.c:388
+#, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
 "mean %s?"
 msgstr ""
-"το σύμβολο %s χρησιμοποιείται, αλλά δεν καθορίζεται ως λεκτική μονάδα και "
-"δεν διαθέτει κανόνες"
+"το σύμβολο %s χρησιμοποιείται, αλλά δεν ορίζεται ως λεκτική μονάδα και δεν "
+"διαθέτει κανόνες.\n"
+"μήπως εννοείς %s;"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "το σύμβολο %s χρησιμοποιείται, αλλά δεν καθορίζεται ως λεκτική μονάδα και "
 "δεν διαθέτει κανόνες"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
-msgstr ""
+msgstr "POSIX yacc διατηρεί %%type για nonterminals"
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "το σύμβολο %s ξαναδηλώθηκε"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
-msgstr "nonterminals cannot be given an explicit number"
+msgid "nonterminals cannot be given a token code"
+msgstr "nonterminals δεν μπορούν να δεχτούν κωδικό λεκτικής μονάδας"
 
-#: src/symtab.c:575
+#: src/symtab.c:594
 #, c-format
-msgid "redefining user token number of %s"
-msgstr "ορισμός ξανά του αριθμού λεκτικής μονάδας του %s"
+msgid "redefining code of token %s"
+msgstr "ορισμός ξανά του κωδικού της λεκτικής μονάδας %s"
 
-#: src/symtab.c:578
-#, fuzzy, c-format
-msgid "user token number of %s too large"
-msgstr "ορισμός ξανά του αριθμού λεκτικής μονάδας του %s"
+#: src/symtab.c:597
+#, c-format
+msgid "code of token %s too large"
+msgstr "κωδικός λεκτικής μονάδας %s πολύ μεγάλος"
 
-#: src/symtab.c:617
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
-msgstr ""
+msgstr "string literal %s μη συνδεδεμένο σε σύμβολο"
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "άχρηστο %s για τύπο <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr ""
@@ -1099,144 +1319,61 @@
 "δεν\n"
 " διαθέτει κανόνες"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr "nonterminals cannot be given a string alias"
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr ""
 "το σύμβολο «%s» χρησιμοποιήθηκε περισσότερες από μια φορές ως κυριολεκτικό "
 "αλφαριθμητικό"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "το σύμβολο «%s» έδωσε περισσότερα του ενός κυριολεκτικά αλφαριθμητικά"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "δήλωση ξανά του αριθμού λεκτικής μονάδας %d για %s"
+msgid "code %d reassigned to token %s"
+msgstr "ο κωδικός %d ξαναδόθηκε στη λεκτική μονάδα %s"
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "προηγούμενη δήλωση για %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
-msgstr ""
+msgstr "αριθμός λεκτικής μονάδας πολύ μεγάλος"
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "το σύμβολο εκκίνησης %s δεν είναι καθορισμένο"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "το σύμβολο εκκίνησης  %s είναι λεκτική μονάδα"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "άχρηστη προτεραιότητα και προσεταιριστικότητα για %s"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "άχρηστη προτεραιότητα για %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "άχρηστη προσεταιριστικότητα για %s, χρήση προτεραιότητας %%"
 
-#, fuzzy
-#~ msgid "eliminate useless chain rules"
-#~ msgstr "μη τερματικό σύμβολο άχρηστο στη γραμματική: %s"
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
 
-#~ msgid "deprecated directive, use %s"
-#~ msgstr "οδηγία υπό κατάργηση, χρησιμοποίησε %s"
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "πολλαπλές δηλώσεις του %s"
 
-#~ msgid ""
-#~ "Warning categories include:\n"
-#~ "  'conflicts-sr'      S/R conflicts (enabled by default)\n"
-#~ "  'conflicts-rr'      R/R conflicts (enabled by default)\n"
-#~ "  'deprecated'        obsolete constructs\n"
-#~ "  'empty-rule'        empty rules without %empty\n"
-#~ "  'midrule-values'    unset or unused midrule values\n"
-#~ "  'precedence'        useless precedence and associativity\n"
-#~ "  'yacc'              incompatibilities with POSIX Yacc\n"
-#~ "  'other'             all other warnings (enabled by default)\n"
-#~ "  'all'               all the warnings except 'yacc'\n"
-#~ "  'no-CATEGORY'       turn off warnings in CATEGORY\n"
-#~ "  'none'              turn off all the warnings\n"
-#~ "  'error[=CATEGORY]'  treat warnings as errors\n"
-#~ msgstr ""
-#~ "Οι κατηγορίες προειδοποίησης περιλαμβάνουν:\n"
-#~ "  'conflicts-sr'      συγκρούσεις S/R (προεπιλογή)\n"
-#~ "  'conflicts-rr'      συγκρούσεις R/R (προεπιλογή)\n"
-#~ "  'deprecated'        καταργημένοι\n"
-#~ "  'empty-rule'       κενοί κανόνες χωρίς %empty\n"
-#~ "  'midrule-values'  μη καθορισμένες ή μη χρησιμοποιούμενες midrule "
-#~ "values\n"
-#~ "  'precedence'        άχρηστη προτεραιότητα και προσεταιριστικότητα\n"
-#~ "  'other'             όλες οι άλλες προειδοποιήσεις)\n"
-#~ "  'yacc'            ασυμβατότητες με το POSIX Yacc\n"
-#~ "  'other'    όλες οι άλλες προειδοποιήσεις (προεπιλογή)  "
-#~ "'all'               όλες οι προειδοποιήσεις εκτός «yacc»\n"
-#~ "  'no-CATEGORY'       απενεργοποίηση προειδοποιήσεων στη CATEGORY\n"
-#~ "  'none'              γενική απενεργοποίηση προειδοποιήσεων\n"
-#~ "  'error[=CATEGORY]'  θεωρεί τις προειδοποιήσεις ως σφάλματα\n"
-
-#~ msgid ""
-#~ "THINGS is a list of comma separated words that can include:\n"
-#~ "  'state'        describe the states\n"
-#~ "  'itemset'      complete the core item sets with their closure\n"
-#~ "  'lookahead'    explicitly associate lookahead tokens to items\n"
-#~ "  'solved'       describe shift/reduce conflicts solving\n"
-#~ "  'all'          include all the above information\n"
-#~ "  'none'         disable the report\n"
-#~ msgstr ""
-#~ "ΠΡΑΓΜΑΤΑ είναι μια λίστα λέξεων που χωρίζονται από κόμματα και "
-#~ "περιλαμβάνουν:\n"
-#~ "  `state'        περιγράφει καταστάσεις\n"
-#~ "  `itemset'      complete the core item sets with their closure\n"
-#~ "  `lookahead'    ρητή συσχέτιση ήδη διαβασμένων λεκτικών μονάδων με "
-#~ "items\n"
-#~ "  `solved'       περιγράφει επίλυση συγκρούσεων με ολίσθηση/ελάττωση\n"
-#~ "  `all'          περιλαμβάνει όλες τις παραπάνω πληροφορίες\n"
-#~ "  `none'         απενεργοποίηση αναφοράς\n"
-
-#~ msgid ""
-#~ "FEATURES is a list of comma separated words that can include:\n"
-#~ "  'caret', 'diagnostics-show-caret'\n"
-#~ "    show errors with carets\n"
-#~ "  'fixit', 'diagnostics-parseable-fixits'\n"
-#~ "    show machine-readable fixes\n"
-#~ "  'syntax-only'\n"
-#~ "    do not generate any file\n"
-#~ "  'all'\n"
-#~ "    all of the above\n"
-#~ "  'none'\n"
-#~ "    disable all of the above\n"
-#~ "  "
-#~ msgstr ""
-#~ "FEATURES είναι λίστα λέξεων χωριζόμενων από κόμματα που μπορεί να "
-#~ "περιλαμβάνουν:\n"
-#~ "  'caret', 'diagnostics-show-caret'\n"
-#~ "    εμφάνιση σφαλμάτων με carets\n"
-#~ "  'fixit', 'diagnostics-parseable-fixits'\n"
-#~ "    εμφάνιση machine-readable fixes\n"
-#~ "  'syntax-only'\n"
-#~ "    μην δημιουργήσεις αρχείο\n"
-#~ "  'all'\n"
-#~ "    όλα τα παραπάνω\n"
-#~ "  'none'\n"
-#~ "    απενεργοποίηση όλων των παραπάνω\n"
-#~ "  "
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "πάρα πολλά σύμβολα στη γραμματική εισόδου (το όριο είναι %d)"
diff --git a/po/eo.gmo b/po/eo.gmo
index cca0b31..87c1922 100644
--- a/po/eo.gmo
+++ b/po/eo.gmo
Binary files differ
diff --git a/po/eo.po b/po/eo.po
index bf89b5d..988974d 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -1,14 +1,14 @@
 # Esperanto translation
-# Copyright (C) 2012, 2013, 2018, 2019 Free Software Foundation, Inc.
+# Copyright (C) 2012, 2013, 2018, 2019, 2020 Free Software Foundation, Inc.
 # This file is distributed under the same license as the bison package.
-# Felipe Castro <fefcas@gmail.com>, 2012, 2013, 2018, 2019.
+# Felipe Castro <fefcas@gmail.com>, 2012, 2013, 2018, 2019, 2020.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: bison 3.3.90\n"
+"Project-Id-Version: bison 3.6.93\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-05-01 10:48-0300\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2020-12-26 11:56-0300\n"
 "Last-Translator: Felipe Castro <fefcas@gmail.com>\n"
 "Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n"
 "Language: eo\n"
@@ -17,204 +17,358 @@
 "Content-Transfer-Encoding: 8bit\n"
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n!=1);\n"
-"X-Generator: Poedit 2.0.7\n"
+"X-Generator: Poedit 2.4.2\n"
 
-#: src/complain.c:114
-msgid "S/R conflicts (enabled by default)"
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr "numero"
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr "funkcio"
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr "variablo"
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
 msgstr ""
 
-#: src/complain.c:115
-msgid "R/R conflicts (enabled by default)"
-msgstr ""
-
-#: src/complain.c:116
-msgid "string aliases not attached to a symbol"
-msgstr ""
-
-#: src/complain.c:117
-msgid "obsolete constructs"
-msgstr ""
-
-#: src/complain.c:118
+#: examples/c/bistromathic/parse.y:372
 #, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "malvalida signo"
+
+#: examples/c/bistromathic/parse.y:389
+msgid "%@: syntax error"
+msgstr "%@: sintaksa eraro"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr "%@: sintaksa eraro: neatendita %u"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "%@: sintaksa eraro: atendita %0e antaŭ %u"
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "%@: sintaksa eraro: atendita %0e aŭ %1e antaŭ %u"
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "%@: sintaksa eraro: atendita %0e aŭ %1e aŭ %2e antaŭ %u"
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr "%@: sintaksa eraro: atendita %0e aŭ %1e aŭ %2e aŭ %3e antaŭ %u"
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr "%@: sintaksa eraro: atendita %0e aŭ %1e aŭ %2e aŭ %3e aŭ %4e antaŭ %u"
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+"%@: sintaksa eraro: atendita %0e aŭ %1e aŭ %2e aŭ %3e aŭ %4e aŭ %5e antaŭ %u"
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+"%@: sintaksa eraro: atendita %0e aŭ %1e aŭ %2e aŭ %3e aŭ %4e aŭ %5e ktp., "
+"antaŭ %u"
+
+#: examples/java/calc/Calc.y:81
+msgid "end of line"
+msgstr "linifino"
+
+#: src/complain.c:153
+msgid "S/R conflicts (enabled by default)"
+msgstr "Ŝ/R-konfliktoj (aktivaj apriore)"
+
+#: src/complain.c:154
+msgid "R/R conflicts (enabled by default)"
+msgstr "R/R-konfliktoj (aktivaj apriore)"
+
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr "generi konfliktajn malekzemplojn"
+
+#: src/complain.c:156
+msgid "string aliases not attached to a symbol"
+msgstr "ĉenaj kromnomoj ne estas alkroĉita al simbolo"
+
+#: src/complain.c:157
+msgid "obsolete constructs"
+msgstr "malaktualaj konstruoj"
+
+#: src/complain.c:158
+#, c-format
 msgid "empty rules without %empty"
-msgstr "vaka regulo sen %%empty"
+msgstr "vaka regulo sen %empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
-msgstr ""
+msgstr "nedifinitaj aŭ neuzitaj valoroj midrule"
 
-#: src/complain.c:120
-#, fuzzy
+#: src/complain.c:160
 msgid "useless precedence and associativity"
-msgstr "neutila prioritato kaj asocieco por %s"
+msgstr "neutila prioritato kaj asocieco"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
-msgstr ""
+msgstr "malkongruoj kun POSIX Yacc"
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
-msgstr ""
+msgstr "ĉiuj aliaj avertoj (aktiva apriore)"
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
-msgstr ""
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
+msgstr "ĉiuj avertoj krom 'counterexamples', 'dangling-alias' kaj 'yacc'"
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
-msgstr ""
+msgstr "malaktivigi avertojn en KATEGORIO"
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
-msgstr ""
+msgstr "malaktivigi ĉiujn avertojn"
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
-msgstr ""
+msgstr "trakti avertojn kiel eraroj"
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
-msgstr ""
+msgstr "Averto-kategorioj inkluzivas:"
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "averto"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "eraro"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "neriparebla eraro"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr "rimarko"
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr "POSIX Yacc ne subtenas %s"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "evitinda instrukcio: %s, uzu %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, c-format
 msgid "duplicate directive"
 msgstr "duobligita instrukcio"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, c-format
 msgid "duplicate directive: %s"
 msgstr "duobligita instrukcio: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "antaŭa deklaro"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "nur po unu %s por regulo estas permesata"
 
-#: src/conflicts.c:81
-#, fuzzy, c-format
+#: src/complain.c:647
+msgid "syntax error"
+msgstr "sintaksa eraro"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr "neatendita %0$s"
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr "atendita %1$s antaŭ %0$s"
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr "atendita %1$s aŭ %2$s antaŭ %0$s"
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr "atendita %1$s aŭ %2$s aŭ %3$s antaŭ %0$s"
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr "atendita %1$s aŭ %2$s aŭ %3$s aŭ %4$s antaŭ %0$s"
+
+#: src/conflicts.c:88
+#, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
-msgstr "    Konflikto inter regulo %d kaj ĵetono %s estis solvata kiel ŝovo"
+msgstr "Konflikto inter regulo %d kaj ĵetono %s estis solvata kiel ŝovo"
 
-#: src/conflicts.c:91
-#, fuzzy, c-format
+#: src/conflicts.c:98
+#, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
-msgstr "    Konflikto inter regulo %d kaj ĵetono %s estis solvata kiel redukto"
+msgstr "Konflikto inter regulo %d kaj ĵetono %s estis solvata kiel redukto"
 
-#: src/conflicts.c:100
-#, fuzzy, c-format
+#: src/conflicts.c:107
+#, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
-msgstr "    Konflikto inter regulo %d kaj ĵetono %s estis solvata kiel eraro"
+msgstr "Konflikto inter regulo %d kaj ĵetono %s estis solvata kiel eraro"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Stato %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "konfliktoj: %d ŝovo/redukto, %d redukto/redukto\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "konfliktoj: %d ŝovo/redukto\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "konfliktoj: %d redukto/redukto\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "konfliktoj de ŝovo/redukto por regulo %d: %d trovitaj, %d atenditaj"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "konfliktoj de redukto/redukto por regulo %d: %d trovitaj, %d atenditaj"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr aplikeblas nur al analiziloj GLR"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "konfliktoj de ŝovo/redukto: %d trovitaj, %d atenditaj"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d konflikto de ŝovo/redukto"
 msgstr[1] "%d konfliktoj de ŝovo/redukto"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "konfliktoj de redukto/redukto: %d trovitaj, %d atenditaj"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "estis atendata %d konflikto de redukto/redukto"
 msgstr[1] "estis atendataj %d konfliktoj de redukto/redukto"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+"relanĉi kun opcio '-Wcounterexamples' por generi konfliktajn malekzemplojn"
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr "Ekzemplo"
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr "Unua ekzemplo"
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr "Dua ekzemplo"
+
+#: src/counterexample.c:126
+msgid "Shift derivation"
+msgstr "Ŝova derivo"
+
+#: src/counterexample.c:126
+msgid "First reduce derivation"
+msgstr "Unua redukta derivo"
+
+#: src/counterexample.c:128
+msgid "Reduce derivation"
+msgstr "Redukta derivo"
+
+#: src/counterexample.c:128
+msgid "Second reduce derivation"
+msgstr "Dua redukta derivo"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "ŝov/redukta konflikto ĉe ĵetono %s"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ":"
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "redukt/redukta konflikto ĉe ĵetono %s"
+msgstr[1] "redukt/redukta konflikto ĉe ĵetonoj %s"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: ne eblas malfermi"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "enig/eliga eraro"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "ne eblas fermi dosieron"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "ni rifuzas anstataŭigi la enigan dosieron %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "konfliktantaj eligoj al dosiero %s"
@@ -224,118 +378,114 @@
 msgid "%s: cannot backup"
 msgstr "%s: ne eblas sekurkopii"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
-msgstr ""
+msgstr "kolorigi la eligon"
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
-msgstr ""
+msgstr "ne kolorigi la eligon"
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
-msgstr ""
+msgstr "kolorigi se la elig-aparato estas tty"
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
-msgid "WHEN can be one of the following:"
-msgstr ""
-
 #: src/getargs.c:209
+msgid "WHEN can be one of the following:"
+msgstr "KIAM povas esti unu el la jenaj:"
+
+#: src/getargs.c:222
 msgid "describe the states"
-msgstr ""
+msgstr "priskribi la statojn"
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
-msgstr ""
+msgstr "kompletigi la kernajn erojn el la aroj per iliaj leksik-fermoj"
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
-msgstr ""
+msgstr "rekte asocii antaŭserĉajn ĵetonojn al eroj"
 
-#: src/getargs.c:212
-#, fuzzy
+#: src/getargs.c:225
 msgid "describe shift/reduce conflicts solving"
-msgstr "%d konflikto de ŝovo/redukto"
+msgstr "priskribi solvo de konflikto de ŝovo/redukto"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
-msgstr ""
+msgstr "inkluzivi ĉiujn suprajn informojn"
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
-msgstr ""
+msgstr "malaktivigi raporton"
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
-msgstr ""
+msgstr "AĴOJ estas listo da vortoj apartitaj per komoj kiuj inkluzivas:"
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
-msgstr ""
+msgstr "SPUROJ estas listo da vortoj apartitaj per komoj kiuj inkluzivas:"
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
-msgstr ""
+msgstr "montri erarojn per ĉapeloj"
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
-msgstr ""
+msgstr "montri maŝin-legeblajn riparojn"
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
-msgstr ""
+msgstr "ne generi iun ajn dosieron"
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
-msgstr ""
+msgstr "ĉiuj el la supraj"
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
-msgstr ""
+msgstr "malaktivigi ĉiujn el la supraj"
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
-msgstr ""
+msgstr "APARTAĴOJ estas listo da vortoj apartitaj per komoj kiuj inkluzivas:"
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Provu '%s --help' por pli da informo.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Uzmaniero: %s [MODIFILO]... DOSIERO\n"
 
-#: src/getargs.c:356
-#, fuzzy
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
 "\n"
 msgstr ""
 "Generi determinecan LR aŭ ĝeneralan LR (GLR) analizilon aplikante\n"
-"analiz-tabelojn LALR(1), IELR(1), aŭ kanonan LR(1).  Subteno al\n"
-"IELR(1) kaj kanona LR(1) estas eksperimenta.\n"
+"analiz-tabelojn LALR(1), IELR(1), aŭ kanonan LR(1).\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Nepraj argumentoj por longaj modifiloj ankaŭ nepras por la mallongaj.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "La samo estas vero por malnepraj argumentoj.\n"
 
-#: src/getargs.c:370
-#, fuzzy
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -350,7 +500,6 @@
 "  -f, --feature[=FEATURES]   activate miscellaneous features\n"
 "\n"
 msgstr ""
-"\n"
 "Operaciaj reĝimoj:\n"
 "  -h, --help                 montri tiun ĉi helpon kaj eliri\n"
 "  -V, --version              montri versi-informon kaj eliri\n"
@@ -361,12 +510,10 @@
 "                             kaj eliri\n"
 "  -u, --update               apliki riparojn al la fonta gramatika dosiero "
 "kaj eliri\n"
-"  -y, --yacc                 ŝajnigi POSIX Yacc\n"
-"  -W, --warnings[=KATEGORIO] raporti la avertojn apartenantajn al KATEGORIO\n"
 "  -f, --feature[=APARTAĴO]   aktivigi diversajn apartaĵojn\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -374,9 +521,14 @@
 "      --style=FILE           specify the CSS FILE for colorizer diagnostics\n"
 "\n"
 msgstr ""
+"Diagnozo:\n"
+"  -W, --warnings[=KATEGORIO] raporti avertojn el KATEGORIO\n"
+"      --color[=KIAM]         ĉu kolorigi la diagnozon\n"
+"      --style=DOSIERO        indiki la CSS-dosieron por kolorita diagnozo\n"
+"\n"
 
-#: src/getargs.c:400
-#, fuzzy, c-format
+#: src/getargs.c:421
+#, c-format
 msgid ""
 "Tuning the Parser:\n"
 "  -L, --language=LANGUAGE          specify the output programming language\n"
@@ -392,7 +544,7 @@
 "  -k, --token-table                include a table of token names\n"
 "  -y, --yacc                       emulate POSIX Yacc\n"
 msgstr ""
-"Analizilo:\n"
+"Agordo de la Analizilo:\n"
 "  -L, --language=LINGVO            indiki la eligan program-lingvon\n"
 "  -S, --skeleton=DOSIERO           indiki la skeleton uzotan\n"
 "  -t, --debug                      ekipigi la analizilon por spursekvado\n"
@@ -403,82 +555,85 @@
 "  -p, --name-prefix=PREFIKSO       antaŭmeti PREFIKSOn al la eksteraj "
 "simboloj\n"
 "                                   anstataŭiginde per '-Dapi."
-"prefix=PREFIKSO'\n"
+"prefix={PREFIKSO}'\n"
 "  -l, --no-lines                   ne generi instrukciojn '#line'\n"
-"  -k, --token-table                inkluzivigi tabelon de ĵeton-nomoj\n"
+"  -k, --token-table                inkluzivi tabelon de ĵeton-nomoj\n"
+"  -y, --yacc                       ŝajnigi POSIX Yacc\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
-"Eligo:\n"
-"      --defines[=DOSIERO]    aldone produkti kap-dosieron\n"
-"  -d                         simile sed ne povas indiki DOSIEROn (por POSIX "
-"Yacc)\n"
-"  -r, --report=AFEROJ        aldone produkti detalojn pri la roboto\n"
-"      --report-file=DOSIERO  skribi raporton al DOSIERO\n"
-"  -v, --verbose              same ol '--report=state'\n"
-"  -b, --file-prefix=PREFIKSO indiki PREFISOn por eligaj dosieroj\n"
-"  -o, --output=DOSIERO       konduki eligon al DOSIERO\n"
-"  -g, --graph[=DOSIERO]      aldone eligi grafeon pri la roboto\n"
-"  -x, --xml[=DOSIERO]        aldone eligi raporton XML pri la roboto\n"
-"                             (la XML-skemo estas eksperimenta)\n"
+"Elig-dosieroj:\n"
+"      --defines[=DOSIERO]       aldone produkti kap-dosieron\n"
+"  -d                            simile sed ne povas indiki DOSIEROn (por "
+"POSIX Yacc)\n"
+"  -r, --report=AĴOJ             aldone produkti detalojn pri la roboto\n"
+"      --report-file=DOSIERO     skribi raporton al DOSIERO\n"
+"  -v, --verbose                 same ol '--report=state'\n"
+"  -b, --file-prefix=PREFIKSO    indiki PREFIKSOn por eligaj dosieroj\n"
+"  -o, --output=DOSIERO          konduki eligon al DOSIERO\n"
+"  -g, --graph[=DOSIERO]         aldone eligi grafeon pri la roboto\n"
+"  -x, --xml[=DOSIERO]           aldone eligi raporton XML pri la roboto\n"
+"  -M, --file-prefix-map=OLD=NEW anstataŭigi prefikson OLD per NEW dum skribo "
+"de dosier-\n"
+"                                indikoj en elig-dosieroj\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Raportu program-misojn al <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "%s hejmpaĝo: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+#, fuzzy
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
 "Ĝenerala helpo por uzi programaron GNU: <http://www.gnu.org/gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+#, fuzzy
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 "Raportu traduk-misojn al <http://translationproject.org/team/eo.html>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "Por la tuta dokumentaro, lanĉu: info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU-a Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Verkita de Robert Corbett kaj Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Kopirajto (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -487,36 +642,41 @@
 "Ekzistas NENIU\n"
 "garantio; eĉ ne por MERKATIGO aŭ TAŬGO POR PRIVATA CELO.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "multoblaj deklaroj de skeleto estas malvalida"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: malvalida lingvo"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "multoblaj deklaroj de lingvo estas malvalida"
 
-#: src/getargs.c:816
-#, fuzzy, c-format
-msgid "deprecated option: %s, use %s"
-msgstr "evitinda instrukcio: %s, uzu %s"
+#: src/getargs.c:760
+#, c-format
+msgid "invalid argument for %s: %s"
+msgstr "malvalida argumento por %s: %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:868
+#, c-format
+msgid "deprecated option: %s, use %s"
+msgstr "evitinda modifilo: %s, uzu %s"
+
+#: src/getargs.c:902
 #, c-format
 msgid "missing operand"
 msgstr "mankas argumento"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "kroma argumento %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Gramatiko"
 
@@ -533,17 +693,25 @@
 "// Hejmpaĝo: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+msgid "end of file"
+msgstr "dosierfino"
+
+#: src/i18n-strings.c:36
+msgid "invalid token"
+msgstr "malvalida ĵetono"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "troa lini-numero"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "troa kolumn-numero"
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
 msgstr "troa bajt-numero"
@@ -553,228 +721,273 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
-msgstr ""
+msgstr "..."
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "regulo neutilas en analizilo pro konfliktoj"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr "fix-its povas esti aplikata. Relanĉu kun la modifilo '--update'."
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "la '%%define'-variablo %s estis redifinata"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "antaŭa difino"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: nedifinita '%%define'-variablo %s"
 
-#: src/muscle-tab.c:629
-#, fuzzy, c-format
+#: src/muscle-tab.c:624
+#, c-format
 msgid "%%define variable '%s' requires '{...}' values"
-msgstr "la '%%define'-variablo %s estis redifinata"
+msgstr "la '%%define'-variablo '%s' postulas valorojn '{...}'"
+
+#: src/muscle-tab.c:629
+#, c-format
+msgid "%%define variable '%s' requires keyword values"
+msgstr "la '%%define'-variablo %s postulas ŝlosilvortajn valorojn"
 
 #: src/muscle-tab.c:634
-#, fuzzy, c-format
-msgid "%%define variable '%s' requires keyword values"
-msgstr "la '%%define'-variablo %s estis redifinata"
-
-#: src/muscle-tab.c:639
-#, fuzzy, c-format
+#, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
-msgstr "la '%%define'-variablo %s estis redifinata"
+msgstr "la '%%define'-variablo '%s' postulas valorojn '\"...\"'"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "malvalida valoro por bulea '%%define'-variablo %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "malvalida valoro por '%%define'-variablo %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "akceptita valoro: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr "ĉeno"
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr "tradukebla ĉeno"
+
+#: src/parse-gram.y:214
+msgid "[identifier]"
+msgstr "[identigilo]"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr "signa literalo"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr "epilogo"
+
+#: src/parse-gram.y:219
+msgid "identifier"
+msgstr "identigilo"
+
+#: src/parse-gram.y:220
+msgid "identifier:"
+msgstr "identigilo:"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr "<etikedo>"
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr "entjera literalo"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
-msgstr "signaj literaloj ne povas esti sintaksaj variabloj"
+msgstr "signaj literaloj ne povas esti neterminaĵoj"
 
-#: src/parse-gram.y:753
-#, fuzzy, c-format
+#: src/parse-gram.y:786
+#, c-format
 msgid "character literals cannot be used together with %s"
-msgstr "signaj literaloj ne povas esti sintaksaj variabloj"
+msgstr "signaj literaloj ne povas esti uzataj kun %s"
 
-#: src/parse-gram.y:758
-#, fuzzy, c-format
+#: src/parse-gram.y:789
+#, c-format
 msgid "definition of %s"
-msgstr "redifinado de uzant-ĵetona nombro da %s"
+msgstr "difino de %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "mankas identigilo en deklaro de parametro"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, c-format
 msgid "invalid version requirement: %s"
 msgstr "malvalida versio-postulo: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr "postulo de bison %s, tamen estas %s"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Stato %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr ""
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "ŝovi, kaj iri al stato %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "iri al stato %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "eraro (ne-asociiga)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "redukti uzante regulon %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "akcepti"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "redukti uzante regulon %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
-msgstr "Terminaloj, kun reguloj kie ili aperas"
+msgstr "Terminaĵoj, kun reguloj kie ili aperas"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
-msgstr "Neterminaloj, kun reguloj kie ili aperas"
+msgstr "Neterminaĵoj, kun reguloj kie ili aperas"
 
-#: src/print.c:416
+#: src/print.c:431
 msgid "on left:"
 msgstr "maldekstre:"
 
-#: src/print.c:425
+#: src/print.c:440
 msgid "on right:"
-msgstr " dekstre:"
+msgstr "dekstre:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Reguloj neutilas en analizilo pro konfliktoj"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "multoblaj deklaroj %s"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "kolizio de rezulto-tipo je la kunmiksa funkcio %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "duobligita simbol-nomo por %s estas preteratentita"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "regulo celanta %s, kio estas ĵetono"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "kolizio de tipo je la apriora ago: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
-msgstr "vaka regulo por tipigita neterminalo, kaj neniu ago"
+msgstr "vaka regulo por tipigita neterminaĵo, kaj neniu ago"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "neuzita valoro: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "nedifinita valoro"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty ĉe ne-vaka regulo"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "vaka regulo sen %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "ĵetono por %%prec ne estas difinita: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr "nur agoj midrule povas esti tipigitaj: %s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s influas nur analizilojn GLR"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s devas estis sekvata de pozitiva numero"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr "POSIX Yacc ne subtenas tipigitaj agoj midrule"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "regulo tro longas"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "la ekiga simbolo %s estas nedifinita"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "la ekiga simbolo %s estas ĵetono"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "neniu regulo en eniga gramatiko"
@@ -783,376 +996,375 @@
 msgid "rule useless in grammar"
 msgstr "regulo neutilas en gramatiko"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
-msgstr "neterminalo neutilas en gramatiko: %s"
+msgstr "neterminaĵo neutilas en gramatiko: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
-msgstr "Neterminaloj neutilas en gramatiko"
+msgstr "Neterminaĵoj neutilas en gramatiko"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
-msgstr "Terminaloj neuzitaj en gramatiko"
+msgstr "Terminaĵoj neuzitaj en gramatiko"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Reguloj neutilas en gramatiko"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
-msgstr[0] "%d neterminalo neutilas en gramatiko"
-msgstr[1] "%d neterminaloj neutilas en gramatiko"
+msgstr[0] "%d neterminaĵo neutilas en gramatiko"
+msgstr[1] "%d neterminaĵoj neutilas en gramatiko"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d regulo neutilas en gramatiko"
 msgstr[1] "%d reguloj neutilas en gramatiko"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "ekiga simbolo %s ne derivas iun ajn frazon"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "perdita '%s'"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "referencas al: %c%s ĉe %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "eble signifis: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", kaŝanta %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " ĉe %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", ne povas esti alirata el ago midrule ĉe $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "entjero for de intervalo: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "malvalida referenco: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 "sintaks-eraro post '%c', estas atendata entjero, litero, '_', '[' aŭ '$'"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "simbolo ne trovita en produktado antaŭ $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "simbolo ne trovita en produktado: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "trompiga referenco: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "plursenca referenco: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "malimplica tipo liverita en netipigita gramatiko"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ por la midrule ĉe $%d de %s havas neniun deklaritan tipon"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ de %s havas neniun deklaritan tipon"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s de %s havas neniun deklaritan tipon"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr "multoblaj okazoj de $%d kun api.value.automove"
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "malvalida numero post \\-eskapo: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "perdita ',' traktita kiel blank-spaco"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "malvalida instrukcio: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "malvalida identigilo: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "malvalida signo"
 msgstr[1] "malvalidaj signoj"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "malvalida nul-signo"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "neatendata identigilo en rekt-krampigita nomo: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "identigilo estas atendata"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "malvalida signo en rekt-krampigita nomo"
 msgstr[1] "malvalidaj signoj en rekt-krampigita nomo"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr "POSIX Yacc ne subtenas ĉenajn literalojn"
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "vaka signo-litero"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "kromaj signoj en signo-litero"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "malvalida numero post \\-eskapo: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "malvalida signo post \\-eskapo: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr "POSIX Yacc ne subtenas deksesumajn literalojn"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "mankas %s ĉe la dosierfino"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "mankas %s ĉe la linifino"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "nefermita instrukcio %s en skeleto"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "tro malmultaj argumentoj por instrukcio %s en skeleto"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "tro multaj argumentoj por instrukcio %s en skeleto"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc malpermesas strekojn en simbol-nomoj: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "tro multaj simboloj en eniga gramatiko (limo estas %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "redeklaro de %s por %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "redeklaro de %s por <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "simbolo %s estas redeklarita kiel ĵetono"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, c-format
 msgid "symbol %s redeclared as a nonterminal"
-msgstr "simbolo %s estas redeklarita kiel sintaksa variablo"
+msgstr "simbolo %s estas redeklarita kiel neterminaĵo"
 
-#: src/symtab.c:370
-#, fuzzy, c-format
+#: src/symtab.c:388
+#, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
 "mean %s?"
 msgstr ""
 "simbolo %s estas uzata, sed ne estas difinita kiel ĵetono kaj havas neniun "
-"regulon"
+"regulon; ĉu vi volis %s?"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "simbolo %s estas uzata, sed ne estas difinita kiel ĵetono kaj havas neniun "
 "regulon"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
-msgstr ""
+msgstr "POSIX yacc rezervis %%type por neterminaĵoj"
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "simbolo %s estas redeklarita"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
-msgstr "sintaksaj variabloj ne povas ricevi malimplicitan numeron"
+msgid "nonterminals cannot be given a token code"
+msgstr "neterminaĵoj ne povas ricevi ĵetonan kodon"
 
-#: src/symtab.c:575
+#: src/symtab.c:594
 #, c-format
-msgid "redefining user token number of %s"
-msgstr "redifinado de uzant-ĵetona nombro da %s"
+msgid "redefining code of token %s"
+msgstr "redifinado de kodo de ĵetono %s"
 
-#: src/symtab.c:578
-#, fuzzy, c-format
-msgid "user token number of %s too large"
-msgstr "redifinado de uzant-ĵetona nombro da %s"
+#: src/symtab.c:597
+#, c-format
+msgid "code of token %s too large"
+msgstr "kodo de ĵetono %s tro larĝas"
 
-#: src/symtab.c:617
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
-msgstr ""
+msgstr "la ĉena literalo %s ne estas alkroĉita al simbolo"
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "neutila %s por tipo <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr ""
 "simbolo <%s> estas uzata, sed ne estas difinita kiel ĵetono kaj havas neniun "
 "regulon"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
-msgstr "sintaksaj variabloj ne povas ricevi ĉenan kromnomon"
+msgstr "neterminaĵoj ne povas ricevi ĉenan kromnomon"
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "simbolo %s estas uzata pli ol unufoje kiel litera ĉeno"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "al la simbolo %s estis donata pli ol unu litera ĉeno"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "redeklaro de uzant-ĵetono numero %d por %s"
+msgid "code %d reassigned to token %s"
+msgstr "kodo %d reatribuita al ĵetono %s"
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "antaŭa deklaro por %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
-msgstr ""
+msgstr "ĵeton-numero tro larĝas"
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "la ekiga simbolo %s estas nedifinita"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "la ekiga simbolo %s estas ĵetono"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "neutila prioritato kaj asocieco por %s"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "neutila prioritato por %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "neutila asocieco por %s, uzu %%precedence"
 
-#, fuzzy
-#~ msgid "eliminate useless chain rules"
-#~ msgstr "neterminalo neutilas en gramatiko: %s"
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU-a Bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "multoblaj deklaroj %s"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "tro multaj simboloj en eniga gramatiko (limo estas %d)"
+
+#~ msgid "nonterminals cannot be given an explicit number"
+#~ msgstr "neterminaĵoj ne povas ricevi malimplicitan numeron"
+
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "redeklaro de uzant-ĵetono numero %d por %s"
 
 #~ msgid "deprecated directive, use %s"
 #~ msgstr "evitinda instrukcio, uzu %s"
@@ -1230,9 +1442,6 @@
 #~ "    malebligi ĉion el supre\n"
 #~ "  "
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "malvalida argumento %s por %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "plursenca argumento %s por %s"
 
diff --git a/po/es.gmo b/po/es.gmo
index 4d24a6a..8e6e0b0 100644
--- a/po/es.gmo
+++ b/po/es.gmo
Binary files differ
diff --git a/po/es.po b/po/es.po
index e812381..d75dd67 100644
--- a/po/es.po
+++ b/po/es.po
@@ -33,7 +33,7 @@
 msgstr ""
 "Project-Id-Version: bison 3.0.2\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2014-01-03 13:48+0100\n"
 "Last-Translator: Nicolás García-Pedrajas <npedrajas@gmail.com>\n"
 "Language-Team: Spanish <es@li.org>\n"
@@ -45,69 +45,153 @@
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Lokalize 1.5\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "carácter no válido"
+
+# Duda: desconozco cuál será el convenio en la lista de correo a
+# propósito de "fatal". Por favor, comprueba que "error grave" es
+# preferido por todos los miembros a "error fatal" - cll
+# veremos que dice la mayoría, como hay otros 2 revisores
+# La verdad es que a mi lo de error fatal me suena fatal
+# ngp
+#
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "error grave"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr ""
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "fin de fichero inesperado"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr ""
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, fuzzy, c-format
 msgid "empty rules without %empty"
 msgstr "regla vacía sin %%empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr ""
 
-#: src/complain.c:120
+#: src/complain.c:160
 #, fuzzy
 msgid "useless precedence and associativity"
 msgstr "precedencia y asociatividad inútil para %s"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr ""
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr ""
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr ""
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr ""
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "aviso"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "error"
 
@@ -118,67 +202,102 @@
 # La verdad es que a mi lo de error fatal me suena fatal
 # ngp
 #
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "error grave"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr ""
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "directiva no válida: %s, use %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, fuzzy, c-format
 msgid "duplicate directive"
 msgstr "directiva no válida, use %s"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, fuzzy, c-format
 msgid "duplicate directive: %s"
 msgstr "directiva no válida, use %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "declaración previa"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "sólo se permite un %s por regla"
 
-#: src/conflicts.c:81
+# Duda: desconozco cuál será el convenio en la lista de correo a
+# propósito de "fatal". Por favor, comprueba que "error grave" es
+# preferido por todos los miembros a "error fatal" - cll
+# veremos que dice la mayoría, como hay otros 2 revisores
+# La verdad es que a mi lo de error fatal me suena fatal
+# ngp
+#
+#: src/complain.c:647
+#, fuzzy
+msgid "syntax error"
+msgstr "error grave"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr ""
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr ""
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr ""
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr ""
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr ""
+
+#: src/conflicts.c:88
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr ""
 "    El conflicto entre la regla %d y el terminal %s se resuelve como "
 "desplazamiento"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr ""
 "    El conflicto entre la regla %d y el terminal %s se resuelve como "
 "reducción"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr ""
 "    El conflicto entre la regla %d y el terminal %s se resuelve como un error"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Estado %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "conflictos: %d desplazamiento/reducción, %d reducción/reducción\n"
@@ -195,7 +314,7 @@
 # ok
 # ngp
 #
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "conflictos: %d desplazamiento/reducción\n"
@@ -212,71 +331,124 @@
 #
 # ok
 # ngp
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "conflictos: %d reducción/reducción\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, fuzzy, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "conflictos desplazamiento/reducción: %d encontrado(s), %d esperado(s)"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, fuzzy, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "conflictos reducción/reducción: %d encontrado(s), %d esperado(s)"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr afecta sólo a los analizadores GLR"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "conflictos desplazamiento/reducción: %d encontrado(s), %d esperado(s)"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d conflicto desplazamiento/reducción"
 msgstr[1] "%d conflictos desplazamiento/reducción"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "conflictos reducción/reducción: %d encontrado(s), %d esperado(s)"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d conflicto reducción/reducción"
 msgstr[1] "%d conflictos reducción/reducción"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "declaración previa"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "declaración previa"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "declaración previa"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "declaración previa"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "%d conflicto desplazamiento/reducción"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "%d conflicto reducción/reducción"
+msgstr[1] "%d conflictos reducción/reducción"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: no se puede abrir"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "error de entrada/salida"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "no se puede cerrar el fichero"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "denegación de sobreescritura del fichero de entrada %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "salidas en conflicto al fichero %s"
@@ -286,96 +458,96 @@
 msgid "%s: cannot backup"
 msgstr "%s: no se puede abrir"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr ""
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr ""
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr ""
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 #, fuzzy
 msgid "describe shift/reduce conflicts solving"
 msgstr "%d conflicto desplazamiento/reducción"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr ""
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr ""
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr ""
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr ""
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Use '%s --help' para más información.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Utilización: %s [OPCIÓN]... FICHERO\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 #, fuzzy
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
@@ -387,18 +559,18 @@
 "y LR(1) canónico es experimental.\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Los argumentos obligatorios para las opciones largas lo son también para las "
 "opciones cortas.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Lo mismo es cierto para los argumentos opcionales.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 #, fuzzy
 msgid ""
 "Operation Modes:\n"
@@ -427,7 +599,7 @@
 "  -f, --features[=CARACTERÍSTICA]  activa diversas características\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -436,7 +608,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, fuzzy, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -467,20 +639,24 @@
 "  -l, --no-lines             no genera directivas '#line'\n"
 " --k, --token-table          incluye una tabla de nombres de terminales\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Salida:\n"
 "      --defines[=FICHERO]             produce también un fichero de "
@@ -498,51 +674,47 @@
 "automaton\n"
 "                             (el esquema XML es experimental)\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Informe de los errores a <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "%s página web: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+#, fuzzy
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
 "Ayuda General del uso de software GNU: <http://www.gnu.org/gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+#, fuzzy
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 "Informe de los errores de traducción a <http://translationproject.org/team/"
 ">.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "Para la documentación completa ejecute: info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Escrito por Robert Corbett y Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -552,36 +724,41 @@
 "NINGUNA garantía; ni siquiera para COMERCIALIZACIÓN o ADAPTACIÓN PARA UN\n"
 "USO PARTICULAR\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "las múltiples declaraciones de skeleton no son válidas"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: lenguaje no válido"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "las múltiples declaraciones de lenguaje no son válidas"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, fuzzy, c-format
+msgid "invalid argument for %s: %s"
+msgstr "argumento %s no válido para %s"
+
+#: src/getargs.c:868
 #, fuzzy, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "directiva no válida: %s, use %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, fuzzy, c-format
 msgid "missing operand"
 msgstr "%s: falta un operando"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "operando extra %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Gramática"
 
@@ -598,17 +775,27 @@
 "// Página web: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+#, fuzzy
+msgid "end of file"
+msgstr "fin de fichero inesperado"
+
+#: src/i18n-strings.c:36
+#, fuzzy
+msgid "invalid token"
+msgstr "carácter no válido"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "desbordamiento del número de línea"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "desbordamiento del número de columna"
 
-#: src/location.c:155
+#: src/location.c:143
 #, fuzzy, c-format
 msgid "byte number overflow"
 msgstr "desbordamiento del número de línea"
@@ -618,230 +805,281 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr ""
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "la regla no es útil en el analizador debido a los conflictos"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "%%define variable %s redefinida"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "definición anterior"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: no definido %%define variable %s"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "%%define variable %s redefinida"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "%%define variable %s redefinida"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "%%define variable %s redefinida"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "valor no válido para %%define variable lógica %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "valor no válido %%define variable %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "valor aceptado: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+#, fuzzy
+msgid "translatable string"
+msgstr "cadena sin terminar"
+
+#: src/parse-gram.y:214
+#, fuzzy
+msgid "[identifier]"
+msgstr "identificador no válido: %s"
+
+#: src/parse-gram.y:215
+#, fuzzy
+msgid "character literal"
+msgstr "carácter literal vacío"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+#, fuzzy
+msgid "identifier"
+msgstr "identificador no válido: %s"
+
+#: src/parse-gram.y:220
+#, fuzzy
+msgid "identifier:"
+msgstr "identificador no válido: %s"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+#, fuzzy
+msgid "integer literal"
+msgstr "carácter literal vacío"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr ""
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr ""
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, fuzzy, c-format
 msgid "definition of %s"
 msgstr "redefinición del número de símbolo terminal del usuario de %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "falta el identificador el la declaración del parámetro"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, fuzzy, c-format
 msgid "invalid version requirement: %s"
 msgstr "secuencia de escape no válida: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr ""
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Estado %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, fuzzy, c-format
+msgid "%s failed with status %d"
+msgstr "falló el programa subsidiario '%s' (estado de salida %d)"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "desplazar e ir al estado %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "ir al estado %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "error (no asociativo)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "reduce usando la regla %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "aceptar"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "reduce usando la regla %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Terminales con las reglas donde aparecen"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "No terminales con las reglas donde aparecen"
 
-#: src/print.c:416
+#: src/print.c:431
 #, fuzzy
 msgid "on left:"
 msgstr " en la izquierda:"
 
-#: src/print.c:425
+#: src/print.c:440
 #, fuzzy
 msgid "on right:"
 msgstr " en la derecha:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "La regla es inútil debido a los conflictos"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "múltiples declaraciones de %s"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "tipo resultado incompatible en la función combinada %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "el nombre de símbolo duplicado para %s es ignorado"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "se ha dado una regla para %s, que es un terminal"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "incompatibilidad de tipos en la acción por defecto: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "regla vacía para un no terminal con tipo y no hay ninguna acción"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "valor no usado: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "valor no fijado: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty en regla no vacía"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "regla vacía sin %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "el terminal para %%prec no está definido: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr ""
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s afecta sólo a los analizadores GLR"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s debe estar seguido por un número positivo"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr ""
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "la regla es demasiado larga"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "el símbolo de inicio (axioma) %s no está definido"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "el símbolo de inicio (axioma) %s es un terminal"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "no hay reglas en la gramática de entrada"
@@ -850,156 +1088,161 @@
 msgid "rule useless in grammar"
 msgstr "regla inútil en la gramática"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "no terminal inútil en la gramática: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "No terminales inútiles en la gramática"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Terminales no usados en la gramática"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Reglas inútiles en la gramática"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d no terminal inútil en la gramática"
 msgstr[1] "%d no terminales inútiles en la gramática"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d regla inútil en la gramática"
 msgstr[1] "%d reglas inútiles en la gramática"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "El símbolo de inicio (axioma) %s no deriva ninguna sentencia"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "'%s' extraviado"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "se refiera a: %c%s en %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "posiblemente significa: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", %c oculto"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " en %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, fuzzy, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", no se puede acceder desde un acción en una regla interna a $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "entero fuera de rango: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "referencia no válida: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 "error de sintaxis después de '%c', se espera un entero, una letra, '_', '[', "
 "o '$'"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "símbolo no encontrado en producción antes de $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "símbolo con encontrado en producción: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "referencia engañosa: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "referencia ambigua: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "tipo explícito dado en una gramática sin tipos"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ para la regla interna en $%d de %s no tiene tipo declarado"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ de '%s' no tiene tipo declarado"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s de %s no tiene tipo declarado"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr ""
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "número no válido después de \\-escape: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "',' perdido se trató como un espacio en blanco"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "directiva no válida: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "identificador no válido: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "carácter no válido"
 msgstr[1] "caracteres no válidos"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "carácter nulo no válido"
@@ -1008,103 +1251,93 @@
 # otras, como 'inesperado'. Cualquiera es correcta, por supuesto y, en
 # este caso, la segunda me parece más apropiada - cll
 # ok - ngp
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "identificador inesperado en nombre entre corchetes: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "se espera un identificador"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "carácter no válido en nombre entre corchetes"
 msgstr[1] "caracteres no válidos en nombre entre corchetes"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr ""
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "carácter literal vacío"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "caracteres extra en carácter literal"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "número no válido después de \\-escape: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "carácter no válido después de \\-escape: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr ""
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "falta %s al final del fichero"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "falta %s al final de la línea"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "directiva %s no cerrada en skeleton"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "faltan argumentos para la directiva %s en skeleton"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "sobran argumentos para la directiva %s en skeleton"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc prohíbe guiones en los nombres de símbolos: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "demasiados símbolos en la gramática de entrada (el límite es %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "%s redeclaración de %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s redeclaración para <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "redeclarado el símbolo %s"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "redeclarado el símbolo %s"
@@ -1112,7 +1345,7 @@
 # 'token' se debe traducir como 'literal' - cll
 # en terminología de compiladores token es más un terminal - ngp
 #
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, fuzzy, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1123,109 +1356,114 @@
 # 'token' se debe traducir como 'literal' - cll
 # en terminología de compiladores token es más un terminal - ngp
 #
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "se usa el símbolo %s, pero no está definido como terminal y no tiene reglas"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "redeclarado el símbolo %s"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
+msgid "nonterminals cannot be given a token code"
 msgstr ""
 
-#: src/symtab.c:575
-#, c-format
-msgid "redefining user token number of %s"
-msgstr "redefinición del número de símbolo terminal del usuario de %s"
-
-#: src/symtab.c:578
+#: src/symtab.c:594
 #, fuzzy, c-format
-msgid "user token number of %s too large"
+msgid "redefining code of token %s"
 msgstr "redefinición del número de símbolo terminal del usuario de %s"
 
-#: src/symtab.c:617
+#: src/symtab.c:597
+#, fuzzy, c-format
+msgid "code of token %s too large"
+msgstr "redefinición del número de símbolo terminal del usuario de %s"
+
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "%s inútil para el tipo <%s>"
 
 # 'token' se debe traducir como 'literal' - cll
 # en terminología de compiladores token es más un terminal - ngp
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "se usa el tipo %s, pero no está asociado a ningún símbolo"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr ""
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "el símbolo '%s' es utilizado más de una vez como cadena literal"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "al símbolo %s se le ha dado más de una cadena literal"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "%d redeclaración del número de símbolo terminal del usuario para %s"
+msgid "code %d reassigned to token %s"
+msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "declaración previa para %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr ""
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "el símbolo de inicio (axioma) %s no está definido"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "el símbolo de inicio (axioma) %s es un terminal"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "precedencia y asociatividad inútil para %s"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "precedencia inútil para %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "asociatividad inútil para %s, use %%precedence"
 
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "múltiples declaraciones de %s"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "demasiados símbolos en la gramática de entrada (el límite es %d)"
+
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "%d redeclaración del número de símbolo terminal del usuario para %s"
+
 #, fuzzy
 #~ msgid "eliminate useless chain rules"
 #~ msgstr "no terminal inútil en la gramática: %s"
@@ -1304,9 +1542,6 @@
 #~ "  'none'         deshabilita todo lo anterior\n"
 #~ "  "
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "argumento %s no válido para %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "argumento %s ambiguo para %s"
 
@@ -1434,41 +1669,6 @@
 #~ msgid "cannot open stats file for writing"
 #~ msgstr "no pude abrir el fichero de estadísticas para escritura"
 
-#, fuzzy
-#~| msgid "unexpected end of file"
-#~ msgid "end \"ABC\" of file"
-#~ msgstr "fin de fichero inesperado"
-
-#, fuzzy
-#~| msgid "unterminated string"
-#~ msgid "translatable string"
-#~ msgstr "cadena sin terminar"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "[identifier]"
-#~ msgstr "identificador no válido: %s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "character literal"
-#~ msgstr "carácter literal vacío"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier"
-#~ msgstr "identificador no válido: %s"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier:"
-#~ msgstr "identificador no válido: %s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "integer literal"
-#~ msgstr "carácter literal vacío"
-
 #~ msgid "symbol %s redefined"
 #~ msgstr "redefinido el símbolo %s"
 
@@ -1631,9 +1831,6 @@
 #~ msgid "subsidiary program '%s' could not be invoked"
 #~ msgstr "no se pudo invocar el programa subsidiario '%s'"
 
-#~ msgid "subsidiary program '%s' failed (exit status %d)"
-#~ msgstr "falló el programa subsidiario '%s' (estado de salida %d)"
-
 #~ msgid "POSIX forbids declarations in the grammar"
 #~ msgstr "POSIX prohíbe declaraciones en a gramática"
 
diff --git a/po/et.gmo b/po/et.gmo
index 90ade2d..a133aa0 100644
--- a/po/et.gmo
+++ b/po/et.gmo
Binary files differ
diff --git a/po/et.po b/po/et.po
index e6668af..91280ce 100644
--- a/po/et.po
+++ b/po/et.po
@@ -1,14 +1,14 @@
 # This file is distributed under the same license as the bison package.
 # Estonian translations for bison.
 # Copyright (C) 2001 Free Software Foundation, Inc.
-# Toomas Soome <tsoome@me.com>, 2019.
+# Toomas Soome <tsoome@me.com>, 2021.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: bison 3.4.91\n"
+"Project-Id-Version: bison 3.7.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-11-22 15:44+0200\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2021-08-13 10:48+0300\n"
 "Last-Translator: Toomas Soome <tsoome@me.com>\n"
 "Language-Team: Estonian <linux-ee@lists.eenet.ee>\n"
 "Language: et\n"
@@ -18,204 +18,361 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr "number"
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr "funktsioon"
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr "muutuja"
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr "viga: nulliga jagamine"
+
+#: examples/c/bistromathic/parse.y:372
+#, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "süntaksi viga: vigane sümbol: %c"
+
+#: examples/c/bistromathic/parse.y:389
+msgid "%@: syntax error"
+msgstr "%@: süntaksi viga"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr "%@: süntaksi viga: ootamatu %u"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "%@: süntaksi viga: oodati %0e %u ees"
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "%@: süntaksi viga: oodati %0e või %1e %u ees"
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "%@: süntaksi viga: oodati %0e või %1e või %2e %u ees"
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr "%@: süntaksi viga: oodati %0e või %1e või %2e või %3e %u ees"
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr "%@: süntaksi viga: oodati %0e või %1e või %2e või %3e või %4e %u ees"
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+"%@: süntaksi viga: oodati %0e või %1e või %2e või %3e või %4e või %5e %u ees"
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+"%@: süntaksi viga: oodati %0e või %1e või %2e või %3e või %4e või %5e jne., "
+"%u ees"
+
+#: examples/java/calc/Calc.y:81
+msgid "end of line"
+msgstr "rea lõpp"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr "N/R konfliktid (vaikimisi lubatud)"
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr "R/R konfliktid (vaikimisi lubatud)"
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr "genereeri konflikti vastunäited"
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr "sõne aliasi ei seostatud sümboliga"
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr "aegunud konstruktsioonid"
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, c-format
 msgid "empty rules without %empty"
 msgstr "tühjad reeglid, puudub %empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr "määramata või kasutamata vahereeglite väärtused"
 
-#: src/complain.c:120
+#: src/complain.c:160
 msgid "useless precedence and associativity"
 msgstr "kasutu järjekord ja assotsiatiivsus"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr "POSIX Yacc mitteühilduvused"
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr "kõik teised hoiatused (vaikimisi lubatud)"
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
-msgstr "kõik hoiatused välja arvatud 'dangling-alias' ja 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
+msgstr ""
+"kõik hoiatused, välja arvatud 'counterexamples', 'dangling-alias' ja 'yacc'"
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr "blokeeri hoiatused antud KATEGOORIAS"
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr "blokeeri kõik hoiatused"
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr "käsitle hoiatusi vigadena"
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr "Hoiatuste kategooriad sisaldavad:"
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "hoiatus"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "viga"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "fataalne viga"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr "märkus"
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr "POSIX Yacc ei toeta %s"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "mittesoovitatav direktiiv: %s, kasutage %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, c-format
 msgid "duplicate directive"
 msgstr "duplikaat direktiiv"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, c-format
 msgid "duplicate directive: %s"
 msgstr "duplikaat direktiiv: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "eelmine deklaratsioon"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "reeglis on lubatud ainult üks %s"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+msgid "syntax error"
+msgstr "süntaksi viga"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr "ootamatu %0$s"
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr "oodati %1$s %0$s ees"
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr "oodati %1$s või %2$s %0$s ees"
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr "oodati %1$s või %2$s või %3$s %0$s ees"
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr "oodati %1$s või %2$s või %3$s või %4$s %0$s ees"
+
+#: src/conflicts.c:88
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "Konflikt reegli %d ja märgi %s vahel lahendatud nihkega"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr "Konflikt reegli %d ja märgi %s vahel lahendatud redutseerimisega"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "Konflikt reegli %d ja märgi %s vahel lahendatud veana"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Olek %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr ""
 "konfliktid: %d nihutamine/redutseerimine, %d redutseerimine/redutseerimine\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "konfliktid:  %d nihutamine/redutseerimine\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "konfliktid: %d redutseerimine/redutseerimine\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 "nihutamine/redutseerimine konfliktid reeglile %d: %d leitud, %d eeldati"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 "redutseerimine/redutseerimine konfliktid reeglile %d: %d leitud, %d eeldati"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr puudutab ainult GLR parsereid"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "nihutamine/redutseerimine konfliktid: %d leitud, %d eeldati"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d nihutamine/redutseerimine konflikt"
 msgstr[1] "%d nihutamise/redutseerimise konflikti"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "redutseerimine/redutseerimine konflikti: %d leitud, %d eeldati"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d redutseerimine/redutseerimine konflikt"
 msgstr[1] "%d redutseerimine/redutseerimine konflikti"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+"Konfliktide vastunäidete genereerimiseks käivitage võtmega '-"
+"Wcounterexamples'"
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr "Näide"
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr "Esimene näide"
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr "Teine näide"
+
+#: src/counterexample.c:126
+msgid "Shift derivation"
+msgstr "Nihutamise tuletis"
+
+#: src/counterexample.c:126
+msgid "First reduce derivation"
+msgstr "Esimene redutseerimise tuletis"
+
+#: src/counterexample.c:128
+msgid "Reduce derivation"
+msgstr "Redutseerimise tuletis"
+
+#: src/counterexample.c:128
+msgid "Second reduce derivation"
+msgstr "Teine redutseerimise tuletis"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "nihutamine/redutseerimine konflikt märgil: %s"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ":"
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "redutseerimine/redutseerimine konflikt märgil %s"
+msgstr[1] "redutseerimine/redutseerimine konflikt märkidel %s"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: ei saa avada"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "sisend/väljund viga"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "faili ei õnnestu sulgeda"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "keeldun sisendfaili %s üle kirjutamast"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "konfliktsed väljundid faili %s"
@@ -225,95 +382,95 @@
 msgid "%s: cannot backup"
 msgstr "%s: varukoopiat ei saa luua"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr "värvi väljund"
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr "ära värvi väljundit"
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr "värvi kui väljundseade on terminal"
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr "MILLAL võib olla üks järgnevaist:"
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr "kirjelda olekud"
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr "lisa baaselementide hulgale nende ümbrus"
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr "üheselt seosta edasi vaatamise märgid elementidega"
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 msgid "describe shift/reduce conflicts solving"
 msgstr "kirjelda nihutamine/redutseerimine konfliktide lahendamist"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr "kaasa kogu ülal näidatud informatsioon"
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr "blokeeri raport"
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr "ASJAD on komadega eraldatud järgnevad sõnad:"
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr "JÄLJED on komadega eraldatud järgnevad sõnad:"
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr "näita vigu katusega"
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr "näita masin-loetavaid parandusi"
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr "ära loo ühtegi faili"
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr "kõik ülaltoodu"
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr "blokeeri kõik ülaltoodu"
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr "OMADUSED on komadega eraldatud järgnevad sõnad:"
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Lisainfo saamiseks proovige '%s --help'.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Kasuta: %s [VÕTI]...FAIL\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
@@ -323,18 +480,18 @@
 "LALR(1), IELR(1) või kanoonilisi LR(1) parseri tabeleid.\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Kohustuslikud argumendid pikkadele võtmetele on kohustuslikus ka "
 "lühikestele.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Sama ka mittekohustuslike argumentide korral.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -360,7 +517,7 @@
 "töö\n"
 "  -f, --feature[=OMADUSED]   aktiveeri muid omadusi\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -374,7 +531,7 @@
 "      --style=FAIL           määra diagnostika värvimise CSS FAIL\n"
 "\n"
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -407,22 +564,26 @@
 "  -k, --token-table          lisa ka sümbolite nimede tabel\n"
 "  -y, --yacc                 emuleeri POSIX Yacc\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Väljund failid:\n"
-"      --defines[=FAIL]       loo ka päisfail\n"
+"  -H, --header=[FAIL]        loo ka päisfail\n"
 "  -d                         sama, aga faili nime ei saa määrata (POSIX "
 "Yacc)\n"
 "  -r, --report=ASJAD         väljasta automaadi kohta selgitusi\n"
@@ -431,52 +592,48 @@
 "  -b, --file-prefix=PREFIKS  kasuta väljundfailide nimedes PREFIKSit\n"
 "  -o, --output=FAIL          jäta väljund FAILi\n"
 "  -g, --graph[=FAIL]         loo automaadi kirjeldus graafina\n"
+"      --html[=FAIL]          loo automaadi HTML raport\n"
 "  -x, --xml[=FAIL]           loo automaadi XML raport\n"
+"  -M, --file-prefix-map=VANA=UUS failiteede kirjutamisel asenda prefiks\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Teatage palun vigadest aadressil <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "%s koduleht: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
-msgstr "Üldine abiinfo GNU tarkvara kohta: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
+msgstr "Üldine abiinfo GNU tarkvara kohta: <https://www.gnu.org/gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
-"Tõlkevigadest teatage palun aadressil <http://translationproject.org/team/"
-">.\n"
+"Tõlkevigadest teatage palun aadressil <https://translationproject.org/team/"
+"et.html>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "Täieliku dokumentatsiooni lugemiseks käivitage: info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Kirjutanud Robert Corbett ja Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Autoriõigus © %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -484,36 +641,41 @@
 "See on vaba tarkvara; kopeerimistingimused leiate lähtetekstidest. Garantii\n"
 "PUUDUB; ka müügiks või mingil eesmärgil kasutamiseks.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "korduvad skeleti deklaratsioonid ei ole lubatud"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: vigane keel"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "korduvad keele deklaratsioonid ei ole lubatud"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, c-format
+msgid "invalid argument for %s: %s"
+msgstr "vigane %s argument: %s"
+
+#: src/getargs.c:868
 #, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "mittesoovitatav võti: %s, kasutage %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, c-format
 msgid "missing operand"
 msgstr "puudub operand"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "liigne operand %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Grammatika"
 
@@ -530,17 +692,25 @@
 "// Koduleht: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+msgid "end of file"
+msgstr "faili lõpp"
+
+#: src/i18n-strings.c:36
+msgid "invalid token"
+msgstr "vigane sümbol"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "rea numbri ületäitumine"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "veeru numbri ületäitumine"
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
 msgstr "baidi numbri ületäitumine"
@@ -550,228 +720,273 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr "..."
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "reegel on konfliktide tõttu kasutu"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr "saadaval on parandused.  Käivitage uuesti võtmega '--update'."
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "%%define muutuja %s deklareeriti uuesti"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "eelmine deklaratsioon"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: defineerimata %%define muutuja %s"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "%%define muutuja '%s' nõuab '{...}' väärtuseid"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "%%define muutuja '%s' nõuab võtmesõnade väärtuseid"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "%%define muutuja '%s' nõuab '\"...\"' väärtuseid"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "vigane %%define tõeväärtus muutuja %s väärtus"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "vigane väärtus %%define muutujale %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "lubatud väärtus: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr "sõne"
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr "tõlgitav sõne"
+
+#: src/parse-gram.y:214
+msgid "[identifier]"
+msgstr "[identifikaator]"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr "sümbol literaal"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr "epiloog"
+
+#: src/parse-gram.y:219
+msgid "identifier"
+msgstr "identifikaator"
+
+#: src/parse-gram.y:220
+msgid "identifier:"
+msgstr "identifikaator:"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr "<märk>"
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr "number literaal"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr "sümbol literalid ei saa olla mitteterminalid"
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr "sümbol literale ei saa %s-ga koos kasutada"
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, c-format
 msgid "definition of %s"
 msgstr "%s definitsioon"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "parameetri deklaratsioonis puudub identifikaator"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, c-format
 msgid "invalid version requirement: %s"
 msgstr "vigane versiooni nõue: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr "nõuab bison %s, aga on %s"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Olek %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr "%s sai vea %d"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "nihuta ja liigu olekule %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "liigu olekule %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "viga (mitteassotsiatiivne)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "redutseerin kasutades reeglit %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "nõustun"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "redutseerin kasutades reeglit %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Terminalid, koos reeglitega kus nad ilmuvad"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Mitteterminalid, koos reeglitega kus nad ilmuvad"
 
-#: src/print.c:416
+#: src/print.c:431
 msgid "on left:"
 msgstr "vasakul:"
 
-#: src/print.c:425
+#: src/print.c:440
 msgid "on right:"
 msgstr "paremal:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Reeglid on parseris konfliktide tõttu kasutud"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "korduvad %s deklaratsioonid"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "tulemuse tüübikonflikt mestimise funktsioonis %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "ignoreerin dubleeritud sümboli nime %s"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "%s jaoks on antud reegel, aga see on märk"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "vaikimisi tegevuse tüübikonflikt: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "tüübiga mitteterminalil on tühi reegel ja puudub tegevus"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "kasutamata väärtus: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "seadmata väärtus: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty mitte-tühjal reeglil"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "tühjal reeglil puudub %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "%%prec märgend ei ole defineeritud: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr "ainult vahereeglite tegevused võivad olla tüübitud: %s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s puudutab ainult GLR parsereid"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s järel peab olema positiivne number"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr "POSIX Yacc ei toeta tüübitud vahereeglite tegevusi"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "reegel on liiga pikk"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "stardisümbol %s ei ole defineeritud"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "stardisümbol %s on märk"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "sisendgrammatikas pole reegleid"
@@ -780,260 +995,255 @@
 msgid "rule useless in grammar"
 msgstr "reegel ei ole grammatikas kasutatav"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "mitteterminal on grammatikas kasutu: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Mitteterminalid ei ole grammatikas kasutatavad"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Grammatikas mitte kasutatud terminalid"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Grammatikas kasutud reeglid"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d grammatikas kasutu mitteterminal"
 msgstr[1] "%d grammatikas kasutut mitteterminali"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d grammatikas kasutu reegel"
 msgstr[1] "%d grammatikas kasutut reeglit"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "stardisümbolist %s ei tuletata ühtegi lauset"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "liigne '%s'"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "viitab: %c%s kohal %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "arvatavasti mõeldi: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", peidab %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " kohal %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", ei saa vahereegli tegevusel kasutada kohal $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "number piiridest väljas: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "vigane viide: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr "süntaksi viga peale '%c', ootan numbrit, tähte, '_', '[' või '$'"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "sümbol puudub produktsioonis $%d ees: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "sümbol puudub produktsioonis: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "segadust tekitav viide: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "segane viide: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "tüüpimata grammatikas kasutati konkreetset tüüpi"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ vahereeglis kohal $%d '%s' ei oma deklareeritud tüüpi"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ märgil '%s' ei oma deklareeritud tüüpi"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s märgil '%s' ei oma deklareeritud tüüpi"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr "api.value.automove omab mitut $%d"
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "vigane number peale \\-jada: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "käsitlen juhuslikku ',' kui tühikut"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "vigane juhus: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "vigane identifikaator: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "vigane sümbol"
 msgstr[1] "vigased sümbolid"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "vigane null sümbol"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "nurksulgudes nimes on eeotamatu identifikaator: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "oodati identifikaatorit"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "vigane sümbol sulgudega nimes"
 msgstr[1] "vigased sümbolid sulgudega nimes"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr "POSIX Yacc ei toeta sõne literaale"
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "tühi sümbol literaal"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "liigsed sümbolid sümbol literaalis"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "vigane number peale \\-jada: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "vigane sümbol peale \\-jada: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr "POSIX Yacc ei toeta kuueteistkümnend literaale"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "faili lõpus puudub %s"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "rea lõpus puudub %s"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "skeletis on sulgemata %s direktiiv"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "skeletis on %s direktiivile liiga vähe argumente"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "skeletis on %s direktiivile liiga palju argumente"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc keelab kriipsud sümbolite nimedes: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "sisendgrammatikas on liiga palju sümboleid (piirang on %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "%s uuesti deklareerimine %s jaoks"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s deklareeriti <%s> jaoks uuesti"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "sümbol %s on uuesti deklareeritud kui märk"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "sümbol %s on uuesti deklareeritud kui mitteterminal"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1042,104 +1252,94 @@
 "kasutatakse sümbolit %s, aga see ei ole defineeritud märgina ja puuduvad "
 "reeglid; kas te pidasite silmas %s?"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "kasutatakse sümbolit %s, aga see ei ole defineeritud märgina ja puuduvad "
 "reeglid"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr "POSIX yacc reserveerib %%type mitteterminalina"
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "sümbol %s on uuesti deklareeritud"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
-msgstr "mitteterminalile ei saa anda konkreetset numbrit"
+msgid "nonterminals cannot be given a token code"
+msgstr "mitteterminalile ei saa anda märgi koodi"
 
-#: src/symtab.c:575
+#: src/symtab.c:594
 #, c-format
-msgid "redefining user token number of %s"
-msgstr "%s kasutaja märgi numbri uuesti defineerimine"
+msgid "redefining code of token %s"
+msgstr "kasutaja märgi koodi %s uuesti defineerimine"
 
-#: src/symtab.c:578
+#: src/symtab.c:597
 #, c-format
-msgid "user token number of %s too large"
-msgstr "kasutaja märgi %s number on liiga suur"
+msgid "code of token %s too large"
+msgstr "märgi %s kood on liiga suur"
 
-#: src/symtab.c:617
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr "sõne literali %s ei seostatud sümboliga"
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "kasutu %s tüübil <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "kasutatakse tüüpi <%s>, mis ei ole seostatud ühegi sümboliga"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr "mitteterminalile ei saa anda sõne aliast"
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "sümbolit %s on kasutatud enam kui kord literaal sõnena"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "sümbolile %s on antud enam kui üks literaal sõne"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "kasutaja märgi number %d uuesti deklareerimine %s jaoks"
+msgid "code %d reassigned to token %s"
+msgstr "kood %d on märgile %s ümber määratud"
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "%s eelmine deklaratsioon"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr "märgi number on liiga suur"
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "stardisümbol %s ei ole defineeritud"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "stardisümbol %s on märk"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "%s jaoks kasutu järjekord ja assotsiatiivsus"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "%s jaoks kasutu järjekord"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "%s jaoks kasutu assotsiatiivsus, kasutage %%precedence"
diff --git a/po/fi.gmo b/po/fi.gmo
index 8ce397c..c0cb971 100644
--- a/po/fi.gmo
+++ b/po/fi.gmo
Binary files differ
diff --git a/po/fi.po b/po/fi.po
index 99a77a8..fee715a 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -1,14 +1,14 @@
 # Finnish messages for bison.
-# Copyright © 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
+# Copyright © 2010, 2011, 2012, 2013, 2021 Free Software Foundation, Inc.
 # This file is distributed under the same license as the bison package.
-# Jorma Karvonen <karvonen.jorma@gmail.com>, 2009-2013.
+# Jorma Karvonen <karvonen.jorma@gmail.com>, 2009-2013, 2021.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: bison 2.7.90\n"
+"Project-Id-Version: bison 3.6.93\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2013-06-13 11:10+0300\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2021-02-20 00:40+0200\n"
 "Last-Translator: Jorma Karvonen <karvonen.jorma@gmail.com>\n"
 "Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n"
 "Language: fi\n"
@@ -17,333 +17,490 @@
 "Content-Transfer-Encoding: 8bit\n"
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.5.5\n"
+"X-Generator: Poedit 2.4.2\n"
 
-#: src/complain.c:114
-msgid "S/R conflicts (enabled by default)"
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr "numero"
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr "funktio"
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr "muuttuja"
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
 msgstr ""
 
-#: src/complain.c:115
-msgid "R/R conflicts (enabled by default)"
-msgstr ""
-
-#: src/complain.c:116
-msgid "string aliases not attached to a symbol"
-msgstr ""
-
-#: src/complain.c:117
-msgid "obsolete constructs"
-msgstr ""
-
-#: src/complain.c:118
+#: examples/c/bistromathic/parse.y:372
 #, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "virheellinen merkki: %s"
+
+#: examples/c/bistromathic/parse.y:389
+msgid "%@: syntax error"
+msgstr "%@: syntaksivirhe"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr "%@: syntaksivirhe: odottamaton %u"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "%@: syntaksivirhe: odotettiin %0e ennen %u"
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "%@: syntaksivirhe: odotettu %0e tai %1e ennen %u"
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "%@: syntaksivirhe: odotettu %0e tai %1e tai %2e ennen %u"
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr "%@: syntaksivirhe: odotettu %0e tai %1e tai %2e tai %3e ennen %u"
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+"%@: syntaksivirhe: odotettu %0e tai %1e tai %2e tai %3e tai %4e ennen %u"
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+"%@: syntaksivirhe: odotettu %0e tai %1e tai %2e tai %3e tai %4e tai %5e "
+"ennen %u"
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+"%@: syntaksivirhe: odotettu %0e tai %1e tai %2e tai %3e tai %4e tai %5e "
+"jne., ennen %u"
+
+#: examples/java/calc/Calc.y:81
+msgid "end of line"
+msgstr "rivin loppu"
+
+#: src/complain.c:153
+msgid "S/R conflicts (enabled by default)"
+msgstr "S/R-ristiriidat (käytössä oletuksena)"
+
+#: src/complain.c:154
+msgid "R/R conflicts (enabled by default)"
+msgstr "R/R-ristiriidat (käytössä oletuksena)"
+
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr "tuota counterexamples-ristiriita"
+
+#: src/complain.c:156
+msgid "string aliases not attached to a symbol"
+msgstr "merkkijonoaliaksia ei ole liitetty symboliin"
+
+#: src/complain.c:157
+msgid "obsolete constructs"
+msgstr "vanhentuneet rakenteet"
+
+#: src/complain.c:158
+#, c-format
 msgid "empty rules without %empty"
-msgstr "tyhjä sääntö ilman %%empty"
+msgstr "tyhjä sääntö ilman %empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
-msgstr ""
+msgstr "asettamattomat tai käyttämättömät keskisääntöarvot"
 
-#: src/complain.c:120
-#, fuzzy
+#: src/complain.c:160
 msgid "useless precedence and associativity"
-msgstr "kelpaamaton ensisijaisuus ja liitettävyys kohteelle %s"
+msgstr "kelpaamaton ensisijaisuus ja liitettävyys"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
-msgstr ""
+msgstr "yhteensopimattomuudet POSIX Yacc-ohjelmaan"
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
-msgstr ""
+msgstr "kaikki muut varoitukset (käytössä oletuksena)"
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
+"kaikki varoitukset paitsi 'counterexamples', 'dangling-alias' ja 'yacc'"
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
-msgstr ""
+msgstr "käännä pois varoitukset KATEGORIAssa"
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
-msgstr ""
+msgstr "käännä pois kaikki varoitukset"
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
-msgstr ""
+msgstr "kohtele varoituksia virheinä"
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
-msgstr ""
+msgstr "Varoituskategoriat sisältävät:"
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "varoitus"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "virhe"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "vakava virhe"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr "huomautus"
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
-msgstr ""
+msgstr "POSIX Yacc ei tue %s"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "vanhentunut direktiivi: %s, käytä %s"
 
-#: src/complain.c:571
-#, fuzzy, c-format
-msgid "duplicate directive"
-msgstr "vanhentunut direktiivi, käytä %s"
-
-#: src/complain.c:573
-#, fuzzy, c-format
-msgid "duplicate directive: %s"
-msgstr "vanhentunut direktiivi, käytä %s"
-
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
+#: src/complain.c:616
 #, c-format
+msgid "duplicate directive"
+msgstr "kaksoiskappaledirektiivi"
+
+#: src/complain.c:618
+#, c-format
+msgid "duplicate directive: %s"
+msgstr "kaksoiskappaledirektiivi: %s"
+
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "edellinen esittely"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "vain yksi %s on sallittu sääntöä kohden"
 
+#: src/complain.c:647
+msgid "syntax error"
+msgstr "syntaksivirhe"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr "odottamaton %0$s"
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr "odotettu %1$s ennen %0$s"
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr "odotettu %1$s tai %2$s ennen %0$s"
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr "odotettu %1$s tai %2$s tai %3$s ennen %0$s"
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr "odotettu %1$s tai %2$s tai %3s tai %4$s ennen %0$s"
+
 #  (token in computing) An atomic piece of data (esp. the text of a computer program) for which a meaning may be inferred during parsing. Also called a symbol.
 #  (token in computing) An atomic piece of data, such as a word, for which a meaning may be inferred during parsing. Also called a symbol.
-#: src/conflicts.c:81
-#, fuzzy, c-format
+#: src/conflicts.c:88
+#, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr ""
-"    Säännön %d ja merkkisymbolin %s välinen ristiriita on ratkaistu siirtona"
+"Säännön %d ja merkkisymbolin %s välinen ristiriita on ratkaistu siirtona"
 
-#: src/conflicts.c:91
-#, fuzzy, c-format
+#: src/conflicts.c:98
+#, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr ""
-"    Säännön %d ja merkkisymbolin %s välinen ristiriita on ratkaistu "
-"supistamisena"
+"Säännön %d ja merkkisymbolin %s välinen ristiriita on ratkaistu supistamisena"
 
-#: src/conflicts.c:100
-#, fuzzy, c-format
+#: src/conflicts.c:107
+#, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr ""
-"    Säännön %d ja merkkisymbolin %s välinen ristiriita on ratkaistu virheenä"
+"Säännön %d ja merkkisymbolin %s välinen ristiriita on ratkaistu virheenä"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Tila %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "ristiriidat: %d siirto/supistaminen, %d supistaminen/supistaminen\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "ristiriidat: %d siirto/supistaminen\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "ristiriidat: %d supistaminen/supistaminen\n"
 
-#: src/conflicts.c:645
-#, fuzzy, c-format
+#: src/conflicts.c:661
+#, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
-msgstr "siirto/supistaminen -ristiriitoja: %d löytyi, %d odotettiin"
+msgstr ""
+"siirto/supistaminen -ristiriitoja säännölle %d: %d löytyi, %d odotettiin"
 
-#: src/conflicts.c:651
-#, fuzzy, c-format
+#: src/conflicts.c:667
+#, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
-msgstr "supistaminen/supistaminen -ristiriitoja: %d löytyi, %d odotettiin"
+msgstr ""
+"supistaminen/supistaminen -ristiriitoja säännölle %d: %d löytyi, %d "
+"odotettiin"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr soveltuu vain GLR-jäsentimiin"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "siirto/supistaminen -ristiriitoja: %d löytyi, %d odotettiin"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d siirto/supistaminen -ristiriita"
 msgstr[1] "%d siirto/supistaminen -ristiriitaa"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "supistaminen/supistaminen -ristiriitoja: %d löytyi, %d odotettiin"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d supistaminen/supistaminen -ristiriita"
 msgstr[1] "%d supistaminen/supistaminen -ristiriitaa"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+"suorita uudelleen valitsimella '-Wcounterexamples' counterexamples-"
+"ristiriidan tuottamiseksi"
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr "Esimerkki"
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr "Ensimmäinen esimerkki"
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr "Toinen esimerkki"
+
+#: src/counterexample.c:126
+msgid "Shift derivation"
+msgstr "Siirtoderivaatio"
+
+#: src/counterexample.c:126
+msgid "First reduce derivation"
+msgstr "Ensimmäinen supistamisderivaatio"
+
+#: src/counterexample.c:128
+msgid "Reduce derivation"
+msgstr "Supistamisderivaatio"
+
+#: src/counterexample.c:128
+msgid "Second reduce derivation"
+msgstr "Toinen supistamisderivaatio"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "merkkisymbolin %s siirto/supistaminen -ristiriita"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ":"
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "supistaminen/supistaminen -ristiriita merkkisymbolissa %s"
+msgstr[1] "supistaminen/supistaminen -ristiriita merkkisymboleissa %s"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: tiedoston avaus epäonnistui"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "syöttö/tulostevirhe"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "tiedoston sulkeminen epäonnistui"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "kieltäydytään korvaamasta syötetiedostoa %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "keskenään ristiriitaisia tulosteita tiedostoon %s"
 
 #: src/fixits.c:122
-#, fuzzy, c-format
+#, c-format
 msgid "%s: cannot backup"
-msgstr "%s: tiedoston avaus epäonnistui"
+msgstr "%s: varmuuskopiointi epäonnistui"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
-msgstr ""
+msgstr "väritä tuloste"
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
-msgstr ""
+msgstr "älä väritä tulostetta"
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
-msgstr ""
+msgstr "väritä, jos tulostelaite on tty"
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
-msgid "WHEN can be one of the following:"
-msgstr ""
-
 #: src/getargs.c:209
+msgid "WHEN can be one of the following:"
+msgstr "MILLOIN voi olla yksi seuraavista:"
+
+#: src/getargs.c:222
 msgid "describe the states"
-msgstr ""
+msgstr "kuvaa tilat"
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
-msgstr ""
+msgstr "täydennä yhdinmerkintäjoukot niiden sulkemisella"
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
-msgstr ""
+msgstr "eksplisiittisesti liitä ennakointimerkkisymbolit merkintöihin"
 
-#: src/getargs.c:212
-#, fuzzy
+#: src/getargs.c:225
 msgid "describe shift/reduce conflicts solving"
-msgstr "%d siirto/supistaminen -ristiriita"
+msgstr "kuvaile siirto/supistaminen -ristiriitojen ratkaisu"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
-msgstr ""
+msgstr "sisällytä kaikki yllä oleva tieto"
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
-msgstr ""
+msgstr "ota ilmoitukset pois käytöstä"
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
-msgstr ""
+msgstr "ASIAT on pilkulla eroteltujen sanojen luettelo, joka voi sisältää:"
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
-msgstr ""
+msgstr "JÄLJET on pilkulla eroteltujen sanojen luettelo, joka voi sisältää:"
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
-msgstr ""
+msgstr "näytä virheet sirkumfleksillä"
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
-msgstr ""
+msgstr "näytä koneluettavat korjaukset"
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
-msgstr ""
+msgstr "älä tuota yhtään tiedostoa"
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
-msgstr ""
+msgstr "kaikki yllä"
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
-msgstr ""
+msgstr "poista käytöstä kaikki yllä"
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
+"OMINAISUUDET on pilkulla eroteltujen sanojen luettelo, joka voi sisältää:"
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Pyydä lisätietoja komennolla ’%s --help’.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Käyttö: %s [VALITSIN]... TIEDOSTO\n"
 
-#: src/getargs.c:356
-#, fuzzy
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
 "\n"
 msgstr ""
 "Tuota deterministinen LR- tai yleistetty LR (GLR) -jäsennin, joka käyttää\n"
-"LALR(1)-, IELR(1)-, tai kanonisia LR(1)-jäsennintauluja.  IELR(1)- ja\n"
-"kanoninen LR(1) -tuki on kokeellinen.\n"
+"LALR(1)-, IELR(1)-, tai kanonisia LR(1)-jäsennintauluja.\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Pakolliset argumentit pitkille valitsimille ovat pakollisia myös lyhyille "
 "valitsimille.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Sama pätee valinnaisille argumenteille.\n"
 
-#: src/getargs.c:370
-#, fuzzy
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -358,21 +515,21 @@
 "  -f, --feature[=FEATURES]   activate miscellaneous features\n"
 "\n"
 msgstr ""
-"\n"
 "Toimintotilat:\n"
 "  -h, --help                 näytä tämä opaste ja poistu\n"
 "  -V, --version              tulosta versiotiedot ja poistu\n"
-"      --print-localedir      tulostehakemisto, joka sisältää maa-asetuksesta "
-"riippuvaa dataa\n"
-"      --print-datadir        tulostehakemisto, joka sisältää rungot ja XSLT-"
+"      --print-localedir      tulosta hakemisto, joka sisältää maa-"
+"asetuksesta riippuvaa dataa\n"
+"                             ja poistu\n"
+"      --print-datadir        tulosta hakemisto, joka sisältää rungot ja XSLT-"
 "koodin\n"
-"  -y, --yacc                 matki POSIX Yacc -ohjelmaa\n"
-"  -W, --warnings=[KATEGORIA] raportoi tähän KATEGORIAan kuuluvat "
-"varoitukset\n"
+"                             ja poistu\n"
+"  -u, --update               toteuta korjaukset lähdekielioppitiedostoon ja "
+"poistu\n"
 "  -f, --feature[=OMINAISUUS] aktivoi sekalaiset ominaisuudet\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -380,9 +537,15 @@
 "      --style=FILE           specify the CSS FILE for colorizer diagnostics\n"
 "\n"
 msgstr ""
+"Diagnostiikka:\n"
+"  -W, --warnings[=KATEGORIA]  ilmoita KATEGORIAan kuuluvat varoitukset\n"
+"      --color[=MILLOIN]         milloin diagnostiikka väritetään\n"
+"      --style=TIEDOSTO       määritä CSS-TIEDOSTO diagnostiikan "
+"värittämiseen\n"
+"\n"
 
-#: src/getargs.c:400
-#, fuzzy, c-format
+#: src/getargs.c:421
+#, c-format
 msgid ""
 "Tuning the Parser:\n"
 "  -L, --language=LANGUAGE          specify the output programming language\n"
@@ -398,7 +561,7 @@
 "  -k, --token-table                include a table of token names\n"
 "  -y, --yacc                       emulate POSIX Yacc\n"
 msgstr ""
-"Jäsennin:\n"
+"Jäsentimen säätö:\n"
 "  -L, --language=KIELI             määrittele tulosteohjelmointikieli\n"
 "  -S, --skeleton=TIEDOSTO          määrittele käytettävä runko\n"
 "  -t, --debug                      lisää jäsennin vianjäljitykseen\n"
@@ -412,83 +575,86 @@
 "vanhentama\n"
 "  -l, --no-lines                   älä tuota ’#line’-direktiivejä\n"
 "  -k, --token-table                sisällytä merkkisymbolinimien taulu\n"
+"  -y, --yacc                       matki POSIX Yacc -ohjelmaa\n"
 "\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
-"Tuloste:\n"
+"Tulostetiedostot:\n"
 "      --defines[=TIEDOSTO]   tuota myös otsaketiedosto\n"
 "  -d                         samoin, mutta TIEDOSTOn (POSIX \n"
 "                                Yacc-yhteensopivuus)määrittely epäonnistui\n"
-"  -r, --report=THINGS        tuota myös yksityiskohdat automaatissa\n"
+"  -r, --report=ASIAT         tuota myös yksityiskohdat automaatissa\n"
 "      --report-file=TIEDOSTO kirjoita raportti TIEDOSTOon\n"
 "  -v, --verbose              sama kuin ’--report=state’\n"
 "  -b, --file-prefix=ETULIITE määrittele ETULIITE tulostetiedostoille\n"
 "  -o, --output=TIEDOSTO      jätä tuloste TIEDOSTOon\n"
 "  -g, --graph[=TIEDOSTO]     tulosta myös automaatin kaavio\n"
 "  -x, --xml[=TIEDOSTO]       tulosta myös automaatin XML-raportti\n"
-"                             (XML-skeema on kokeellinen)\n"
+"-M, --file-prefix-map=VANHA=UUSI korvaa etuliite VANHA etuliitteellä UUSI "
+"kun kirjoitetaan\n"
+"                                tiedostopolkuja tulostetiedostoissa\n"
 "\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Ilmoita virheistä (englanniksi) osoitteeseen <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "%s kotisivu: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+#, fuzzy
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
 "Yleinen opaste GNU-ohjelmistojen käyttämisestä: <http://www.gnu.org/gethelp/"
 ">.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+#, fuzzy
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 "Ilmoita käännösvirheistä osoitteeseen <translation-team-fi@lists.sourceforge."
 "net>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "Täydellisen dokumentaation saat suorittamalla komennon: info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Kirjoittajat: Robert Corbett ja Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright © %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -497,36 +663,41 @@
 "OLE MITÄÄN TAKUUTA; ei edes KAUPPAKELPOISUUDELLE tai SOPIVUUDELLE TIETTYYN "
 "TARKOITUKSEEN.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "monirunkoesittelyt ovat virheellisiä"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: virheellinen kieli"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "monikieliesittelyt ovat virheellisiä"
 
-#: src/getargs.c:816
-#, fuzzy, c-format
+#: src/getargs.c:760
+#, c-format
+msgid "invalid argument for %s: %s"
+msgstr "virheellinen argumentti kohteelle %s: %s"
+
+#: src/getargs.c:868
+#, c-format
 msgid "deprecated option: %s, use %s"
-msgstr "vanhentunut direktiivi: %s, käytä %s"
+msgstr "vanhentunut valitsin: %s, käytä %s"
 
-#: src/getargs.c:850
-#, fuzzy, c-format
+#: src/getargs.c:902
+#, c-format
 msgid "missing operand"
-msgstr "%s: puuttuva operandi"
+msgstr "puuttuva operandi"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "ylimääräinen operandi %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Kielioppi"
 
@@ -545,250 +716,302 @@
 "// Kotisivu: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+msgid "end of file"
+msgstr "tiedoston loppu"
+
+#: src/i18n-strings.c:36
+msgid "invalid token"
+msgstr "virheellinen merkkisymboli"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "rivinumeron ylivuoto"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "sarakenumeron ylivuoto"
 
-#: src/location.c:155
-#, fuzzy, c-format
+#: src/location.c:143
+#, c-format
 msgid "byte number overflow"
-msgstr "rivinumeron ylivuoto"
+msgstr "tavunumeron ylivuoto"
 
 #. TRANSLATORS: This is used when a line is too long, and is
 #. displayed truncated.  Use an ellipsis appropriate for your
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
-msgstr ""
+msgstr "..."
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "sääntö ei kelpaa jäsentimessä ristiriitojen vuoksi"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
+"korjaukset voidaan toteuttaa.  Suorita uudelleen valitsimella '--update'."
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "%%define-muuttuja %s on määritelty uudelleen"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "edellinen määrittely"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: määrittelemätön %%define-muuttuja %s"
 
-#: src/muscle-tab.c:629
-#, fuzzy, c-format
+#: src/muscle-tab.c:624
+#, c-format
 msgid "%%define variable '%s' requires '{...}' values"
-msgstr "%%define-muuttuja %s on määritelty uudelleen"
+msgstr "%%define-muuttuja ’%s’ vaatii '{...}'-arvot"
+
+#: src/muscle-tab.c:629
+#, c-format
+msgid "%%define variable '%s' requires keyword values"
+msgstr "%%define-muuttuja ’%s’ vaatii avainsana-arvot"
 
 #: src/muscle-tab.c:634
-#, fuzzy, c-format
-msgid "%%define variable '%s' requires keyword values"
-msgstr "%%define-muuttuja %s on määritelty uudelleen"
-
-#: src/muscle-tab.c:639
-#, fuzzy, c-format
+#, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
-msgstr "%%define-muuttuja %s on määritelty uudelleen"
+msgstr "%%define-muuttuja ’%s’ vaatii '\"...\"'-arvot"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "virheellinen arvo kohteelle %%define-booleanmuuttuja %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "virheellinen arvo kohteelle %%define-muuttuja %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "hyväksytty arvo: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr "merkkijono"
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr "suomennettava merkkijono"
+
+#: src/parse-gram.y:214
+msgid "[identifier]"
+msgstr "[tunnistin]"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr "merkkiliteraali"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr "epilogi"
+
+#: src/parse-gram.y:219
+msgid "identifier"
+msgstr "tunniste"
+
+#: src/parse-gram.y:220
+msgid "identifier:"
+msgstr "tunniste:"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr "<tagi>"
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr "kokonaislukuliteraali"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
-msgstr ""
+msgstr "merkkiliteraalit eivät voi olla nonterminal-symboleja"
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
-msgstr ""
+msgstr "merkkiliteraaleja ei voi käyttää yhdessä %s:n kanssa"
 
-#: src/parse-gram.y:758
-#, fuzzy, c-format
+#: src/parse-gram.y:789
+#, c-format
 msgid "definition of %s"
-msgstr "määritellään uudelleen kohteen %s käyttäjämerkkisymbolinumero"
+msgstr "%s:n määrittely"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "puuttuva tunniste parametriesittelyssä"
 
-#: src/parse-gram.y:1018
-#, fuzzy, c-format
+#: src/parse-gram.y:1062
+#, c-format
 msgid "invalid version requirement: %s"
-msgstr "virheellinen koodinvaihtosekvenssi: %s"
+msgstr "virheellinen versiovaatimus: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
-msgstr ""
+msgstr "vaatii bison %s, mutta on %s"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Tila %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr ""
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "siirto, ja siirry tilaan %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "siirry tilaan %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "virhe (ei-assosiatiivinen)\n"
 
-#: src/print.c:195
+#: src/print.c:202
+#, c-format
+msgid "accept"
+msgstr "hyväksy"
+
+#: src/print.c:204
 #, c-format
 msgid "reduce using rule %d (%s)"
 msgstr "supistaminen käyttäen sääntöä %d (%s)"
 
-#: src/print.c:198
-#, c-format
-msgid "accept"
-msgstr "accept"
-
-#: src/print.c:235 src/print.c:309
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
-msgstr "Päätteet, säännöillä missä niin tarvitaan"
+msgstr "Terminal-symbolit, säännöillä missä niin tarvitaan"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
-msgstr "Ei-päätteet, säännöillä missä niitä tarvitaan"
+msgstr "Nonterminal-symbolit, säännöillä missä niitä tarvitaan"
 
-#: src/print.c:416
-#, fuzzy
+#: src/print.c:431
 msgid "on left:"
-msgstr " vasemmalla:"
+msgstr "vasemmalla:"
 
-#: src/print.c:425
-#, fuzzy
+#: src/print.c:440
 msgid "on right:"
-msgstr " oikealla:"
+msgstr "oikealla:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Säännöt eivät kelpaa jäsentimessä ristiriitojen vuoksi"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "useita %s esittelyjä"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "tulostyyppien yhteentörmäys merge-funktiossa %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "kaksoiskappalesymbolinimi kohteelle %s ohitettiin"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "sääntö annettu kohteelle %s, joka on merkkisymboli"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "tyyppien törmäys vastakkain oletustoiminassa: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
-msgstr "tyhjä sääntö tyypitetylle ei-päätteelle, ja ei toimintoa"
+msgstr "tyhjä sääntö tyypitetylle nonterminal-symbolille, ja ei toimintoa"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "käyttämätön arvo: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "asettamaton arvo: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty ei-tyhjässä säännössä"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "tyhjä sääntö ilman %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "merkkisymbolia kohteelle %%prec ei ole määritelty: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
-msgstr ""
+msgstr "vain keskisääntötoiminnot voidaan tyypittää: %s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s vaikuttaa vain GLR-jäsentimiin"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "kohdetta %s on seurattava postiivinen numero"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
-msgstr ""
+msgstr "POSIX Yacc ei tue tyypitettyjä keskisääntötoimintoja"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "sääntö on liian pitkä"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "aloitussymboli %s on määrittelemätön"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "aloitussymboli %s on merkkisymboli"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "ei sääntöjä syötekieliopissa"
@@ -797,390 +1020,379 @@
 msgid "rule useless in grammar"
 msgstr "sääntö ei kelpaa kieliopissa"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
-msgstr "ei-pääte ei kelpaa kieliopissa: %s"
+msgstr "nonterminal-symboli ei kelpaa kieliopissa: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
-msgstr "Ei-päätteet eivät kelpaa kieliopissa"
+msgstr "Nonterminal-symbolit eivät kelpaa kieliopissa"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Päätteet ovat käyttämättömiä kieliopissa"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Säännöt eivät kelpaa kieliopissa"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
-msgstr[0] "%d ei-pääte ei kelpaa kieliopissa"
-msgstr[1] "%d ei-päätettä eivät kelpaa kieliopissa"
+msgstr[0] "%d nonterminal-symboli ei kelpaa kieliopissa"
+msgstr[1] "%d nonterminal-symbolit eivät kelpaa kieliopissa"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d sääntö on hyödytön kieliopissa"
 msgstr[1] "%d sääntöä ovat hyödyttömiä kieliopissa"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "aloitussymboli %s ei johda lauseeseen"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "yksinäinen ’%s’"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "viittaa kohteeseen: %c%s osoitteessa %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "mahdollisesti tarkoitti: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", piilotetaan %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " osoitteessa %s"
 
-#: src/scan-code.l:375
-#, fuzzy, c-format
+#: src/scan-code.l:377
+#, c-format
 msgid ", cannot be accessed from midrule action at $%d"
-msgstr ", ei kyetä käyttämään mid-rule -toimintoa osoitteessa $%d"
+msgstr ", ei kyetä käyttämään keskisääntötoiminnosta osoitteessa $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "kokonaisluku on lukualueen ulkopuolella: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "virheellinen viite: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 "syntaksivirhe merkin ’%c’ jälkeen, odotettiin kokonaislukua, kirjainta, tai "
 "merkkejä ’_’, ’[’, ’$’"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "symbolia ei löytynyt tuotannosta ennen $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "symbolia ei löytynyt tuotannosta: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "harhaanjohtava viite: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "ei-yksiselitteinen viite: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "eksplisiittinen tyyppi annettu tyypittömässä kieliopissa"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
-msgstr "$$ midrule-lohkolle osoitteessa $%d/%s ei ole esiteltyä tyyppiä"
+msgstr "$$ keskisääntölohkolle osoitteessa $%d/%s ei ole esiteltyä tyyppiä"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$/%s ei ole esitelty tyyppi"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s/%s ei ole esitelty tyyppi"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
-msgstr ""
+msgstr "useita $%d:n esiintymisiä rakenteessa api.value.automove"
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "virheellinen numero \\-koodinvaihtomerkin jälkeen: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "yksinäinen ’,’ käsitellään tyhjemerkkinä"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "virheellinen direktiivi: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "virheellinen tunniste: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "virheellinen merkki: %s"
 msgstr[1] "virheellisiä merkkejä: %s"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "virheellinen null-merkki"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "odottamaton tunniste sulkumerkillisessä nimessä: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "odotettiin tunnistetta"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "virheellinen merkki sulkeissa olevassa nimessä: %s"
 msgstr[1] "virheellisiä merkkejä sulkeissa olevassa nimessä: %s"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
-msgstr ""
+msgstr "POSIX Yacc ei tue merkkijonoliteraaleja"
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "tyhjä merkkiliteraali"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "ylimääräisiä merkkejä merkkiliteraalissa"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "virheellinen numero \\-koodinvaihtomerkin jälkeen: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "virheellinen merkki \\-koodinvaihtomerkin jälkeen: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
-msgstr ""
+msgstr "POSIX Yacc ei tue heksadesimaaliliteraaleja"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "puuttuva %s tiedoston lopussa"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "puuttuva %s rivin lopussa"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "sulkematon %s-direktiivi rungossa"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "liian vähän argumentteja %s-direktiiville rungossa"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "liian monta argumenttia %s-direktiiville rungossa"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc kieltää ajatusviivat symbolinimissä: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "liian monta symbolia syötekieliopissa (raja on %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "%s uudelleenesittely kohteelle %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s uudelleenesittely kohteelle <%s>"
 
-#: src/symtab.c:325
-#, fuzzy, c-format
+#: src/symtab.c:347
+#, c-format
 msgid "symbol %s redeclared as a token"
-msgstr "symboli %s on esitelty uudelleen"
+msgstr "symboli %s on esitelty uudelleen merkkisymbolina"
 
-#: src/symtab.c:326
-#, fuzzy, c-format
+#: src/symtab.c:348
+#, c-format
 msgid "symbol %s redeclared as a nonterminal"
-msgstr "symboli %s on esitelty uudelleen"
+msgstr "symboli %s on esitelty uudelleen nonterminal-symbolina"
 
-#: src/symtab.c:370
-#, fuzzy, c-format
+#: src/symtab.c:388
+#, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
 "mean %s?"
 msgstr ""
 "symbolia %s käytetään, mutta sitä ei ole määritelty merkkisymbolina eikä "
-"sillä ole sääntöjä"
+"sillä ole sääntöjä; tarkoititko %s?"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "symbolia %s käytetään, mutta sitä ei ole määritelty merkkisymbolina eikä "
 "sillä ole sääntöjä"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
-msgstr ""
+msgstr "POSIX yacc varaa %%type nonterminal-symboleille"
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "symboli %s on esitelty uudelleen"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
-msgstr ""
+msgid "nonterminals cannot be given a token code"
+msgstr "nonterminal-symboleja ei voida antaa merkkisymbolikoodina"
 
-#: src/symtab.c:575
+#: src/symtab.c:594
 #, c-format
-msgid "redefining user token number of %s"
-msgstr "määritellään uudelleen kohteen %s käyttäjämerkkisymbolinumero"
+msgid "redefining code of token %s"
+msgstr "määritellään uudelleen merkkisymbolin %s koodi"
 
-#: src/symtab.c:578
-#, fuzzy, c-format
-msgid "user token number of %s too large"
-msgstr "määritellään uudelleen kohteen %s käyttäjämerkkisymbolinumero"
+#: src/symtab.c:597
+#, c-format
+msgid "code of token %s too large"
+msgstr "merkkisymbolin %s koodi on liian suuri"
 
-#: src/symtab.c:617
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
-msgstr ""
+msgstr "merkkijonoliteraalia %s ei ole liitetty symboliin"
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "kelpaamaton %s tyypille <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "tyyppiä <%s> käytetään, mutta sitä ei ole liitetty mihinkään symboliin"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
-msgstr ""
+msgstr "nonterminal-symboleja ei voida antaa merkkijonoaliaksina"
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "symbolia %s on käytetty useammin kuin kerran literaalimerkkijonona"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "symboli %s on annettu useammassa kuin yhdessä literaalimerkkijonossa"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "käyttäjämerkkijononumeron %d uudelleenesittely kohteelle %s"
+msgid "code %d reassigned to token %s"
+msgstr "koodi %d liitetty uudelleen merkkisymboliin %s"
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "edellinen esittely kohteelle %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
-msgstr ""
+msgstr "merkkisymbolinumero liian suuri"
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "aloitussymboli %s on määrittelemätön"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "aloitussymboli %s on merkkisymboli"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "kelpaamaton ensisijaisuus ja liitettävyys kohteelle %s"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "kelpaamaton ensisijaisuus kohteelle %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "kelpaamaton liitettävyys kohteelle %s, käytä %%precedence"
 
-#, fuzzy
-#~ msgid "eliminate useless chain rules"
-#~ msgstr "ei-pääte ei kelpaa kieliopissa: %s"
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
 
-#~ msgid "deprecated directive, use %s"
-#~ msgstr "vanhentunut direktiivi, käytä %s"
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "useita %s esittelyjä"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "liian monta symbolia syötekieliopissa (raja on %d)"
 
 #  Koodissa midrule on keskellä oleva lohko, jota edeltää toprule ja jonka alla on bottomrule.
-#, fuzzy
 #~ msgid ""
 #~ "Warning categories include:\n"
+#~ "  'midrule-values'    unset or unused midrule values\n"
+#~ "  'yacc'              incompatibilities with POSIX Yacc\n"
 #~ "  'conflicts-sr'      S/R conflicts (enabled by default)\n"
 #~ "  'conflicts-rr'      R/R conflicts (enabled by default)\n"
 #~ "  'deprecated'        obsolete constructs\n"
 #~ "  'empty-rule'        empty rules without %empty\n"
-#~ "  'midrule-values'    unset or unused midrule values\n"
 #~ "  'precedence'        useless precedence and associativity\n"
-#~ "  'yacc'              incompatibilities with POSIX Yacc\n"
 #~ "  'other'             all other warnings (enabled by default)\n"
 #~ "  'all'               all the warnings except 'yacc'\n"
 #~ "  'no-CATEGORY'       turn off warnings in CATEGORY\n"
@@ -1188,10 +1400,10 @@
 #~ "  'error[=CATEGORY]'  treat warnings as errors\n"
 #~ msgstr ""
 #~ "Varoituskategoriat sisältävät:\n"
-#~ "  'midrule-values'    asettaa ja poistaa midrule-arvoja\n"
+#~ "  'midrule-values'    asettaa ja poistaa keskisääntöarvoja\n"
 #~ "  'yacc'              yhteensopimattomuudet POSIX YACC -ohjelman kanssa\n"
-#~ "  'conflicts-sr'      S/R-ristiriidat (oletuksena otettu käyttöön)\n"
-#~ "  'conflicts-rr'      R/R-ristiriidat (oletuksena otettu käyttöön)\n"
+#~ "  'conflicts-sr'      S/R-ristiriidat (käytössä oletuksena)\n"
+#~ "  'conflicts-rr'      R/R-ristiriidat (käytössä oletuksena)\n"
 #~ "  'deprecated'        vanhentuneet rakenteet\n"
 #~ "  'empty-rule'        tyhjät säännöt ilman %empty\n"
 #~ "  'precedence'        kelpaamaton etuoikeus ja liitännäisyys\n"
@@ -1202,7 +1414,6 @@
 #~ "KATEGORIA\n"
 #~ "  'none'              käännä pois kaikki varoitukset\n"
 #~ "  'error[=KATEGORIA]' käsittele varoituksia virheinä\n"
-#~ "\n"
 
 #~ msgid ""
 #~ "THINGS is a list of comma separated words that can include:\n"
@@ -1213,7 +1424,7 @@
 #~ "  'all'          include all the above information\n"
 #~ "  'none'         disable the report\n"
 #~ msgstr ""
-#~ "THINGS on pilkuilla eroteltu luettelo, joka voi sisältää:\n"
+#~ "ASIAT on pilkuilla eroteltu luettelo, joka voi sisältää:\n"
 #~ "  'state'        kuvaa tilat\n"
 #~ "  'itemset'      täydentää ydinalkiojoukot niiden sulkeumalla\n"
 #~ "  'lookahead'    eksplisiittisesti liittää ennakointimerkkisymbolit "
@@ -1223,19 +1434,11 @@
 #~ "  'all'          sisältää kaikki yllä mainitut tiedot\n"
 #~ "  'none'         poistaa raportoinnin\n"
 
-#, fuzzy
 #~ msgid ""
-#~ "FEATURES is a list of comma separated words that can include:\n"
-#~ "  'caret', 'diagnostics-show-caret'\n"
-#~ "    show errors with carets\n"
-#~ "  'fixit', 'diagnostics-parseable-fixits'\n"
-#~ "    show machine-readable fixes\n"
-#~ "  'syntax-only'\n"
-#~ "    do not generate any file\n"
-#~ "  'all'\n"
-#~ "    all of the above\n"
-#~ "  'none'\n"
-#~ "    disable all of the above\n"
+#~ "FEATURE is a list of comma separated words that can include:\n"
+#~ "  'caret'        show errors with carets\n"
+#~ "  'all'          all of the above\n"
+#~ "  'none'         disable all of the above\n"
 #~ "  "
 #~ msgstr ""
 #~ "OMINAISUUS on pilkulla eroteltu sanojen luettelo, joka voi sisältää:\n"
@@ -1244,8 +1447,57 @@
 #~ "  'none'         ota pois käytöstä kaikki yllä olevat\n"
 #~ "  "
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "virheellinen argumentti %s valitsimelle %s"
+#~ msgid " type %d is %s\n"
+#~ msgstr " tyyppi %d on %s\n"
+
+#~ msgid "invalid $ value: $%d"
+#~ msgstr "virheellinen $-arvo: $%d"
+
+#~ msgid "symbol %s redefined"
+#~ msgstr "symboli %s on määritelty uudelleen"
+
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "käyttäjämerkkisymbolinumeron %d uudelleenesittely kohteelle %s"
+
+#~ msgid "removing of '%s' failed"
+#~ msgstr "kohteen ’%s’ poistaminen epäonnistui"
+
+#~ msgid "creation of a temporary file failed"
+#~ msgstr "tilapäisen tiedoston luominen epäonnistui"
+
+#~ msgid "saving stdin failed"
+#~ msgstr "vakiosyötön tallentaminen epäonnistui"
+
+#~ msgid "saving stdout failed"
+#~ msgstr "vakiotulosteen tallentaminen epäonnistui"
+
+#~ msgid "opening of tmpfile failed"
+#~ msgstr "tilapäisen tiedoston tmpfile avaaminen epäonnistui"
+
+#~ msgid "redirecting bison's stdout to the temporary file failed"
+#~ msgstr ""
+#~ "bison-vakiotulosteen edelleenohjaaminen tilapäiseen tiedostoon epäonnistui"
+
+#~ msgid "redirecting m4's stdin from the temporary file failed"
+#~ msgstr ""
+#~ "m4-vakiosyötteen edelleenohjaaminen tilapäiseen tiedostoon epäonnistui"
+
+#~ msgid "opening of a temporary file failed"
+#~ msgstr "tilapäisen tiedoston avaaminen epäonnistui"
+
+#~ msgid "redirecting m4's stdout to a temporary file failed"
+#~ msgstr ""
+#~ "m4-vakiotulosteen edelleenohjaaminen tilapäiseen tiedostoon epäonnistui"
+
+#~ msgid "subsidiary program '%s' interrupted"
+#~ msgstr "tytärohjelma ’%s’ on keskeytetty"
+
+#~ msgid "subsidiary program '%s' not found"
+#~ msgstr "tytärohjelmaa ’%s’ ei löytynyt"
+
+#~ msgid "redirecting bison's stdin from the temporary file failed"
+#~ msgstr ""
+#~ "bison-vakiosyötteen edelleenohjaaminen tilapäiseen tiedostoon epäonnistui"
 
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "ei-yksiselitteinen argumentti %s valitsimelle %s"
@@ -1253,79 +1505,6 @@
 #~ msgid "Valid arguments are:"
 #~ msgstr "Mahdolliset argumentit ovat:"
 
-#~ msgid "write error"
-#~ msgstr "kirjoitusvirhe"
-
-#~ msgid "Unknown system error"
-#~ msgstr "Tuntematon järjestelmävirhe"
-
-#, fuzzy
-#~| msgid "%s: option '-W %s' is ambiguous\n"
-#~ msgid "%s: option '%s%s' is ambiguous\n"
-#~ msgstr "%s: valitsin ’-W %s’ ei ole yksiselitteinen\n"
-
-#, fuzzy
-#~| msgid "%s: option '%s' is ambiguous; possibilities:"
-#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
-#~ msgstr "%s: valitsin ’%s’ ei ole yksiselitteinen; mahdollisuudet:"
-
-#, fuzzy
-#~| msgid "%s: unrecognized option '%c%s'\n"
-#~ msgid "%s: unrecognized option '%s%s'\n"
-#~ msgstr "%s: tunnistamaton valitsin ’%c%s’\n"
-
-#, fuzzy
-#~| msgid "%s: option '%c%s' doesn't allow an argument\n"
-#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
-#~ msgstr "%s: valitsin ’%c%s’ ei salli argumenttia\n"
-
-#, fuzzy
-#~| msgid "%s: option '--%s' requires an argument\n"
-#~ msgid "%s: option '%s%s' requires an argument\n"
-#~ msgstr "%s: valitsin ’--%s’ vaatii argumentin\n"
-
-#~ msgid "%s: invalid option -- '%c'\n"
-#~ msgstr "%s: virheellinen valitsin — ’%c’\n"
-
-#~ msgid "%s: option requires an argument -- '%c'\n"
-#~ msgstr "%s: valitsin vaatii argumentin — ’%c’\n"
-
-#~ msgid "memory exhausted"
-#~ msgstr "muisti loppui"
-
-#~ msgid "cannot create pipe"
-#~ msgstr "putken luominen epäonnistui"
-
-#~ msgid "%s subprocess failed"
-#~ msgstr "%s-aliprosessi epäonnistui"
-
-#~ msgid "`"
-#~ msgstr "”"
-
-#~ msgid "'"
-#~ msgstr "”"
-
-#, fuzzy
-#~| msgid ""
-#~| "\n"
-#~| "Execution times (seconds)\n"
-#~ msgid "Execution times (seconds)"
-#~ msgstr ""
-#~ "\n"
-#~ "Suoritusajat (sekunteja)\n"
-
-#~ msgid "_open_osfhandle failed"
-#~ msgstr "_open_osfhandle epäonnistui"
-
-#~ msgid "cannot restore fd %d: dup2 failed"
-#~ msgstr "ei voida palauttaa tiedostotunnistetta %d: dup2 epäonnistui"
-
-#~ msgid "%s subprocess"
-#~ msgstr "%s-aliprosessi"
-
-#~ msgid "%s subprocess got fatal signal %d"
-#~ msgstr "%s-aliprosessi sai kohtalokkaan signaalin %d"
-
 #~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 #~ msgstr "%u bitset_allocs, %u vapautettu (%.2f%%).\n"
 
@@ -1372,103 +1551,85 @@
 #~ msgid "cannot open stats file for writing"
 #~ msgstr "stats-tiedoston avaaminen kirjoittamista varten epäonnistui"
 
-#, fuzzy
-#~| msgid "missing %s at end of file"
-#~ msgid "end \"ABC\" of file"
-#~ msgstr "puuttuva %s tiedoston lopussa"
+#~ msgid "write error"
+#~ msgstr "kirjoitusvirhe"
 
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "[identifier]"
-#~ msgstr "virheellinen tunniste: %s"
+#~ msgid "Unknown system error"
+#~ msgstr "Tuntematon järjestelmävirhe"
 
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "character literal"
-#~ msgstr "tyhjä merkkiliteraali"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier"
-#~ msgstr "virheellinen tunniste: %s"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier:"
-#~ msgstr "virheellinen tunniste: %s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "integer literal"
-#~ msgstr "tyhjä merkkiliteraali"
-
-#~ msgid "symbol %s redefined"
-#~ msgstr "symboli %s on määritelty uudelleen"
-
-#~ msgid "removing of '%s' failed"
-#~ msgstr "kohteen ’%s’ poistaminen epäonnistui"
-
-#~ msgid "creation of a temporary file failed"
-#~ msgstr "tilapäisen tiedoston luominen epäonnistui"
-
-#~ msgid "saving stdin failed"
-#~ msgstr "vakiosyötön tallentaminen epäonnistui"
-
-#~ msgid "saving stdout failed"
-#~ msgstr "vakiotulosteen tallentaminen epäonnistui"
-
-#~ msgid "opening of tmpfile failed"
-#~ msgstr "tilapäisen tiedoston tmpfile avaaminen epäonnistui"
-
-#~ msgid "redirecting bison's stdout to the temporary file failed"
-#~ msgstr ""
-#~ "bison-vakiotulosteen edelleenohjaaminen tilapäiseen tiedostoon epäonnistui"
-
-#~ msgid "redirecting m4's stdin from the temporary file failed"
-#~ msgstr ""
-#~ "m4-vakiosyötteen edelleenohjaaminen tilapäiseen tiedostoon epäonnistui"
-
-#~ msgid "opening of a temporary file failed"
-#~ msgstr "tilapäisen tiedoston avaaminen epäonnistui"
-
-#~ msgid "redirecting m4's stdout to a temporary file failed"
-#~ msgstr ""
-#~ "m4-vakiotulosteen edelleenohjaaminen tilapäiseen tiedostoon epäonnistui"
-
-#~ msgid "subsidiary program '%s' interrupted"
-#~ msgstr "tytärohjelma ’%s’ on keskeytetty"
-
-#~ msgid "subsidiary program '%s' not found"
-#~ msgstr "tytärohjelmaa ’%s’ ei löytynyt"
-
-#~ msgid "redirecting bison's stdin from the temporary file failed"
-#~ msgstr ""
-#~ "bison-vakiosyötteen edelleenohjaaminen tilapäiseen tiedostoon epäonnistui"
-
-#~ msgid " type %d is %s\n"
-#~ msgstr " tyyppi %d on %s\n"
-
-#~ msgid "invalid $ value: $%d"
-#~ msgstr "virheellinen $-arvo: $%d"
+#~ msgid "%s: option '%s' is ambiguous; possibilities:"
+#~ msgstr "%s: valitsin ’%s’ ei ole yksiselitteinen; mahdollisuudet:"
 
 #~ msgid "%s: option '--%s' doesn't allow an argument\n"
 #~ msgstr "%s: valitsin ’--%s’ ei salli argumenttia\n"
 
+#~ msgid "%s: option '%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: valitsin ’%c%s’ ei salli argumenttia\n"
+
+#~ msgid "%s: option '--%s' requires an argument\n"
+#~ msgstr "%s: valitsin ’--%s’ vaatii argumentin\n"
+
 #~ msgid "%s: unrecognized option '--%s'\n"
 #~ msgstr "%s: tunnistamaton valitsin ’--%s’\n"
 
+#~ msgid "%s: unrecognized option '%c%s'\n"
+#~ msgstr "%s: tunnistamaton valitsin ’%c%s’\n"
+
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: virheellinen valitsin — ’%c’\n"
+
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: valitsin vaatii argumentin — ’%c’\n"
+
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: valitsin ’-W %s’ ei ole yksiselitteinen\n"
+
 #~ msgid "%s: option '-W %s' doesn't allow an argument\n"
 #~ msgstr "%s: valitsin ’-W %s’ ei salli argumenttia\n"
 
 #~ msgid "%s: option '-W %s' requires an argument\n"
 #~ msgstr "%s: valitsin ’-W %s’ vaatii argumentin\n"
 
+#~ msgid "memory exhausted"
+#~ msgstr "muisti loppui"
+
+#~ msgid "cannot create pipe"
+#~ msgstr "putken luominen epäonnistui"
+
+#~ msgid "%s subprocess failed"
+#~ msgstr "%s-aliprosessi epäonnistui"
+
+#~ msgid "`"
+#~ msgstr "”"
+
+#~ msgid "'"
+#~ msgstr "”"
+
+#~ msgid ""
+#~ "\n"
+#~ "Execution times (seconds)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Suoritusajat (sekunteja)"
+
 #~ msgid " TOTAL                 :"
 #~ msgstr " YHTEENSÄ              :"
 
 #~ msgid "time in %s: %ld.%06ld (%ld%%)\n"
 #~ msgstr "aika kohteessa %s: %ld.%06ld (%ld%%)\n"
 
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle epäonnistui"
+
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "ei voida palauttaa tiedostotunnistetta %d: dup2 epäonnistui"
+
+#~ msgid "%s subprocess"
+#~ msgstr "%s-aliprosessi"
+
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "%s-aliprosessi sai kohtalokkaan signaalin %d"
+
 #~ msgid "empty"
 #~ msgstr "tyhjä"
 
@@ -1540,3 +1701,28 @@
 
 #~ msgid "%s: illegal option -- %c\n"
 #~ msgstr "%s: virheellinen valitsin — %c\n"
+
+#~ msgid ""
+#~ "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e or %6e "
+#~ "before %u"
+#~ msgstr ""
+#~ "%@: syntaksivirhe: odotettiin %0e tai %1e tai %2e tai %3e tai %4e tai %5e "
+#~ "tai %6e ennen %u"
+
+#~ msgid "nonterminals cannot be given an explicit number"
+#~ msgstr "nonterminal-symboleita ei voida antaa eksplisiittisenä numerona"
+
+#~ msgid "deprecated directive, use %s"
+#~ msgstr "vanhentunut direktiivi, käytä %s"
+
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: valitsin ’%s%s’ vaatii argumentin\n"
+
+#~ msgid "CPU user"
+#~ msgstr "Prosessorikäyttäjä"
+
+#~ msgid "CPU system"
+#~ msgstr "Prosessorijärjestelmä"
+
+#~ msgid "wall clock"
+#~ msgstr "seinäkello"
diff --git a/po/fr.gmo b/po/fr.gmo
index 76aeada..8ecd98b 100644
--- a/po/fr.gmo
+++ b/po/fr.gmo
Binary files differ
diff --git a/po/fr.po b/po/fr.po
index bc6704c..572536d 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -1,15 +1,15 @@
 # Messages français pour Bison.
-# Copyright (C) 2019 Free Software Foundation, Inc.
+# Copyright (C) 2021 Free Software Foundation, Inc.
 # This file is distributed under the same license as the bison package.
 # Michel Robitaille <robitail@IRO.UMontreal.CA>, traducteur depuis/since 1996
 # Dominique Boucher a été le traducteur de 1996 à 2000
-# Frédéric Marchal <fmarchal@perso.be>, 2019.
+# Frédéric Marchal <fmarchal@perso.be>, 2021
 msgid ""
 msgstr ""
-"Project-Id-Version: GNU bison 3.4.91\n"
+"Project-Id-Version: GNU bison 3.7.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-11-23 17:59+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2021-08-13 11:37+0200\n"
 "Last-Translator: Frédéric Marchal <fmarchal@perso.be>\n"
 "Language-Team: French <traduc@traduc.org>\n"
 "Language: fr\n"
@@ -19,203 +19,363 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n >= 2);\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr "nombre"
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr "fonction"
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr "variable"
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr "erreur: division par zéro"
+
+#: examples/c/bistromathic/parse.y:372
+#, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "erreur de syntaxe: caractère invalide : %c"
+
+#: examples/c/bistromathic/parse.y:389
+msgid "%@: syntax error"
+msgstr "%@: erreur de syntaxe"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr "%@: erreur de syntaxe : %u inattendu"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "%@: erreur de syntaxe : %0e attendu avant %u"
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "%@: erreur de syntaxe : %0e ou %1e attendu avant %u"
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "%@: erreur de syntaxe : %0e ou %1e ou %2e attendu avant %u"
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr "%@: erreur de syntaxe : %0e ou %1e ou %2e ou %3e attendu avant %u"
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+"%@: erreur de syntaxe: %0e ou %1e ou %2e ou %3e ou %4e attendu avant %u"
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+"%@: erreur de syntaxe: %0e ou %1e ou %2e ou %3e ou %4e ou %5e attendu avant "
+"%u"
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+"%@: erreur de syntaxe: %0e ou %1e ou %2e ou %3e ou %4e ou %5e etc. attendu, "
+"avant %u"
+
+#: examples/java/calc/Calc.y:81
+msgid "end of line"
+msgstr "fin de ligne"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr "conflits S/R (activé par défaut)"
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr "conflits R/R (activé par défaut)"
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr "générer les contre-exemples de conflits"
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr "l'alias chaîne n'est pas attaché à un symbole"
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr "construction obsolète"
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, c-format
 msgid "empty rules without %empty"
 msgstr "règle vide sans %empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr "valeurs de règle intermédiaire non définies ou inutilisées"
 
-#: src/complain.c:120
+#: src/complain.c:160
 msgid "useless precedence and associativity"
 msgstr "priorité et associativité inutiles"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr "incompatibilités avec POSIX Yacc"
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr "tous les autres avertissements (activé par défaut)"
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
-msgstr "tous les avertissements sauf « dangling-alias » et « yacc »"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
+msgstr ""
+"tous les avertissements sauf « counterexamples », « dangling-alias » et "
+"« yacc »"
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr "désactiver les avertissements dans CATEGORIE"
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr "désactiver tous les avertissements"
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr "traiter les avertissements comme des erreurs"
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr "Les catégories d'avertissements incluent :"
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "avertissement"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "erreur"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "erreur fatale"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr "note"
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr "POSIX Yacc ne supporte pas %s"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "directive dépréciée: %s, utilisez %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, c-format
 msgid "duplicate directive"
 msgstr "directive dupliquée"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, c-format
 msgid "duplicate directive: %s"
 msgstr "directive dupliquée: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "déclaration précédente"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "seul un %s est permis par règle"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+msgid "syntax error"
+msgstr "erreur de syntaxe"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr "%0$s inattendu"
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr "%1$s attendu avant %0$s"
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr "%1$s ou %2$s attendu avant %0$s"
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr "%1$s ou %2$s ou %3$s attendu avant %0$s"
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr "%1$s ou %2$s ou %3$s ou %4$s attendu avant %0$s"
+
+#: src/conflicts.c:88
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "Conflit entre la règle %d et le jeton %s résolu par décalage"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr "Conflit entre la règle %d et le jeton %s résolu par réduction"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "Conflit entre la règle %d et le jeton %s résolu comme étant une erreur"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "État %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "conflits: %d décalage/réduction, %d réduction/réduction\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "conflits: %d décalage/réduction\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "conflits: %d réduction/réduction\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 "conflits par décalage/réduction pour la règle %d: %d trouvés, %d attendus"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 "conflits par réduction/réduction pour la règle %d: %d trouvés, %d attendus"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr affecte seulement les analyseurs GLR"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "conflits par décalage/réduction: %d trouvés, %d attendus"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d conflit par décalage/réduction"
 msgstr[1] "%d conflits par décalage/réduction"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "conflits par réduction/réduction: %d trouvés, %d attendus"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d conflit par réduction/réduction"
 msgstr[1] "%d conflits par réduction/réduction"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+"exécutez avec l'option « -Wcounterexamples » pour générer des contre-"
+"exemples de conflits"
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr "Exemple"
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr "Premier exemple"
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr "Deuxième exemple"
+
+#: src/counterexample.c:126
+msgid "Shift derivation"
+msgstr "Dérivation par décalage"
+
+#: src/counterexample.c:126
+msgid "First reduce derivation"
+msgstr "Première dérivation par réduction"
+
+#: src/counterexample.c:128
+msgid "Reduce derivation"
+msgstr "Dérivation par réduction"
+
+#: src/counterexample.c:128
+msgid "Second reduce derivation"
+msgstr "Seconde dérivation par réduction"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "conflit par décalage/réduction sur le jeton %s"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr " :"
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "conflit par réduction/réduction sur le jeton %s"
+msgstr[1] "conflit par réduction/réduction sur les jetons %s"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: ouverture impossible"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "erreur d'entrée/sortie"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "ne peut fermer le fichier"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "refus d'écraser le fichier d'entrée %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "sorties en conflit vers le fichier %s"
@@ -225,98 +385,98 @@
 msgid "%s: cannot backup"
 msgstr "%s: archivage impossible"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr "coloriser la sortie"
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr "ne pas coloriser la sortie"
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr "coloriser si le périphérique de sortie est un tty"
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr "QUAND peut prendre l'une des valeurs suivantes :"
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr "décrire les états"
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr "compléter les ensembles d'éléments du cœur avec leurs fermetures"
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr "explicitement associer les jetons lookahead aux éléments"
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 msgid "describe shift/reduce conflicts solving"
 msgstr "décrire la solution aux conflits par décalage/réduction"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr "inclure toutes les informations ci-dessus"
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr "désactiver le rapport"
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 "CHOSES est une liste de mots séparés par des virgules pouvant contenir :"
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 "TRACES est une liste de mots séparés par des virgules pouvant contenir :"
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr "montrer les erreurs avec des curseurs"
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr "montrer les correctifs sous forme machine"
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr "ne générer aucun fichier"
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr "tous ci-dessus"
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr "désactiver tous ci-dessus"
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 "FONCTIONS est une liste de mots séparés par des virgules pouvant contenir :"
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Pour en savoir davantage, faites : « %s --help ».\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Usage: %s [OPTION]... FICHIER\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
@@ -327,18 +487,18 @@
 "LALR(1), IELR(1) ou des tables d'analyseur LR(1) canonique.\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Les paramètres requis pour les options longues sont également requis pour "
 "les options courtes.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "La même chose est vraie pour les paramètres optionnels.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -369,7 +529,7 @@
 "  -f, --feature[=FONCTIONS]  activer des fonctionnalités diverses\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -384,7 +544,7 @@
 "des diagnostiques\n"
 "\n"
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -417,78 +577,84 @@
 "  -k, --token-table                inclure la table des noms de jetons\n"
 "  -y, --yacc                       émuler Yacc en mode POSIX\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Fichiers de sortie :\n"
-"      --defines[=FICHIER]    produire un fichier d'en-tête\n"
-"  -d                         idem mais sans spécifier le FICHIER (pour le "
+"  -H, --header[=FICHIER]        produire aussi un fichier d'en-tête\n"
+"  -d                            idem mais sans spécifier le FICHIER (pour le "
 "Yacc POSIX)\n"
-"  -r, --report=CHOSES        générer les détails concernant l'automate\n"
-"      --report-file=FICHIER  écrire le rapport dans le FICHIER\n"
-"  -v, --verbose              identique à « --report=state »\n"
-"  -b, --file-prefix=PRÉFIXE  utiliser le PRÉFIXE pour le fichier de sortie\n"
-"  -o, --output=FICHIER       produire la sortie dans le FICHIER\n"
-"  -g, --graph[=FICHIER]      produire aussi un graphe de l'automate\n"
-"  -x, --xml[=FICHIER]        produire un rapport XML de l'automate\n"
+"  -r, --report=CHOSES           générer les détails concernant l'automate\n"
+"      --report-file=FICHIER     écrire le rapport dans le FICHIER\n"
+"  -v, --verbose                 identique à « --report=state »\n"
+"  -b, --file-prefix=PRÉFIXE     utiliser le PRÉFIXE pour le fichier de "
+"sortie\n"
+"  -o, --output=FICHIER          produire la sortie dans le FICHIER\n"
+"  -g, --graph[=FICHIER]         produire aussi un graphe de l'automate\n"
+"      --html[=FICHIER]          produire aussi un rapport HTML de "
+"l'automate\n"
+"  -x, --xml[=FICHIER]           produire aussi un rapport XML de l'automate\n"
+"  -M, --file-prefix-map=ANCIEN=NOUVEAU\n"
+"                                remplacer l'ANCIEN préfixe par le NOUVEAU en "
+"écrivant\n"
+"                                les chemins des fichiers dans les fichiers "
+"de sortie\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Rapportez toutes anomalies à <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "page d'accueil de %s: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
-"Aide générique sur l'utilisation des logiciels GNU: <http://www.gnu.org/help/"
-"gethelp.fr.html>.\n"
+"Aide générique sur l'utilisation des logiciels GNU: <https://www.gnu.org/"
+"help/gethelp.fr.html>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
-"Signalez les erreurs de traductions à <http://translationproject.org/team/fr."
-"html>.\n"
+"Signalez les erreurs de traductions à <https://translationproject.org/team/"
+"fr.html>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "Pour la documentation complète, exécutez: info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Écrit par Robert Corbett et Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright © %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -497,36 +663,41 @@
 "reproduction. AUCUNE garantie n'est donnée; tant pour des raisons\n"
 "COMMERCIALES que pour RÉPONDRE À UN BESOIN PARTICULIER.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "déclarations multiples de squelettes sont inacceptables"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: langage inacceptable"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "les déclarations multiples du langage sont inacceptables"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, c-format
+msgid "invalid argument for %s: %s"
+msgstr "argument invalide pour %s : %s"
+
+#: src/getargs.c:868
 #, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "option dépréciée : %s, utilisez %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, c-format
 msgid "missing operand"
 msgstr "opérande manquante"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "opérande superflu %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Grammaire"
 
@@ -543,17 +714,25 @@
 "// Page d'accueil: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+msgid "end of file"
+msgstr "fin de fichier"
+
+#: src/i18n-strings.c:36
+msgid "invalid token"
+msgstr "jeton invalide"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "débordement du nombre de lignes"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "débordement du nombre de colonnes"
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
 msgstr "débordement du nombre sur un octet"
@@ -563,231 +742,276 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr "…"
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "la règle est inutile dans l'analyseur à cause de conflits"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 "des fix-its peuvent être appliqués. Exécutez à nouveau avec l'option « --"
 "update »."
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "variable %%define %s redéfinie"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "définition précédente"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: variable %%define %s non définie"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "variable %%define « %s » requiert des valeurs « {...} »"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "variable %%define « %s » requiert des valeurs mot-clés"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "variable %%define « %s » requiert des valeurs « \"...\" »"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "valeur inacceptable pour %%define de la variable Booléenne %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "valeur inacceptable pour %%define de la variable %s : %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "valeur acceptée : %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr "chaîne"
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr "chaîne pouvant être traduite"
+
+#: src/parse-gram.y:214
+msgid "[identifier]"
+msgstr "[identificateur]"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr "caractère littéral"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr "épilogue"
+
+#: src/parse-gram.y:219
+msgid "identifier"
+msgstr "identificateur"
+
+#: src/parse-gram.y:220
+msgid "identifier:"
+msgstr "identificateur :"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr "<balise>"
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr "entier littéral"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr "les littéraux caractères ne peuvent pas être des non terminaux"
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr "les littéraux caractères ne peuvent pas être utilisés avec %s"
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, c-format
 msgid "definition of %s"
 msgstr "définition de %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "identificateur manquant dans la déclaration de paramètres"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, c-format
 msgid "invalid version requirement: %s"
 msgstr "exigence de version invalide : %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr "exige bison %s mais a %s"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "État %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr "%s a échoué avec le statut %d"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "décalage et aller à l'état %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "aller à l'état %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "erreur (non-associative)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "réduction par utilisation de la règle %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "accepter"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "réduction par utilisation de la règle %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$défaut"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Terminaux, suivis des règles où ils apparaissent"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Non-terminaux, suivis des règles où ils apparaissent"
 
-#: src/print.c:416
+#: src/print.c:431
 msgid "on left:"
 msgstr "à gauche:"
 
-#: src/print.c:425
+#: src/print.c:440
 msgid "on right:"
 msgstr "à droite:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Règles inutiles dans l'analyseur à cause de conflits"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "déclarations multiples de %s"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr ""
 "conflit dans le type du résultat de la fonction de fusion %s : <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "doublon dans le nom de symbole %s est ignoré"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "règle donnée pour %s, qui est un terminal"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "conflit de type pour l'action par défaut: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "règle vide pour un non terminal typé et aucune action"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "valeur inutilisée : $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "valeur non initialisée : $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty sur une règle non vide"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "règle vide sans %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "le jeton pour %%prec n'est pas défini : %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr "seules des actions de règles intermédiaires peuvent être typées: %s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s affecte seulement les analyseurs GLR"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s doit être suivi d'un nombre positif"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr "POSIX Yacc ne supporte pas les actions de milieu de règle typées"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "règle trop longue"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "le symbole de départ %s n'est pas défini"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "le symbole de départ %s est un terminal"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "la grammaire n'a pas de règles"
@@ -796,263 +1020,258 @@
 msgid "rule useless in grammar"
 msgstr "règle inutile dans la grammaire"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "non terminal inutile dans la grammaire : %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Non-terminaux inutiles dans la grammaire"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Terminaux inutilisés dans la grammaire"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Règles inutiles dans la grammaire"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d non terminal inutile dans la grammaire"
 msgstr[1] "%d non terminaux inutiles dans la grammaire"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d règle inutile dans la grammaire"
 msgstr[1] "%d règles inutiles dans la grammaire"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "symbole de départ %s ne produit aucune phrase"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
-msgstr "« %s » superflu"
+msgstr "« %s » égaré"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "voir %c%s à %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "signifiait probablement : %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", cache %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " à %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", n'est pas accessible depuis une action de milieu de règle à %d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "entier hors limite : %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "référence invalide : %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 "erreur de syntaxe après « %c », attendu : entier, lettre, « _ », « [ » ou "
 "« $ »"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "symbole pas trouvé en production avant $%d : %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "symbole pas trouvé en production : %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "référence trompeuse : %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "référence ambiguë : %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "type explicitement attribué à une grammaire sans type"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr ""
 "le $$ de la règle intermédiaire à $%d de « %s » n'a pas de type déclaré"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ de %s n'a pas de type déclaré"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s de %s n'a pas de type déclaré"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr "plusieurs occurrences de $%d avec api.value.automove"
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "nombre incorrect après la séquence d'échappement \\ : %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "« , » superflue traitée comme un blanc"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "directive invalide : %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "identificateur invalide : %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "caractère invalide"
 msgstr[1] "caractères invalides"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "caractère nul invalide"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "identificateur inattendu dans un nom entre accolades : %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "un identificateur est attendu"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "caractère invalide dans un nom entre accolades"
 msgstr[1] "caractères invalides dans un nom entre accolades"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr "POSIX Yacc ne supporte pas les chaînes littérales"
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "caractère littéral vide"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "caractères en trop dans le caractère littéral"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "nombre incorrect après la séquence d'échappement \\ : %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "caractère invalide après la séquence d'échappement \\ : %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr "POSIX Yacc ne supporte pas les nombres hexadécimaux littéraux"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "%s manquant en fin de fichier"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "%s manquant en fin de fichier"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "directive %s pas fermée dans le squelette"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "trop peu de paramètres pour la directive %s du squelette"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "trop de paramètres pour la directive %s du squelette"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "Le Yacc POSIX interdit les tirets dans les noms de symboles : %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "trop de symboles dans la grammaire d'entrée (limite est %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "redéclaration de %s pour %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "redéclaration de %s pour <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, c-format
 msgid "symbol %s redeclared as a token"
-msgstr "symbole %s est redéclaré comme un jeton"
+msgstr "le symbole %s est redéclaré comme un jeton"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, c-format
 msgid "symbol %s redeclared as a nonterminal"
-msgstr "symbole %s est redéclaré comme un non terminal"
+msgstr "le symbole %s est redéclaré comme un non terminal"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1061,108 +1280,120 @@
 "le symbole %s est utilisé mais ce n'est pas un jeton et il ne possède pas de "
 "règle ; vouliez-vous utiliser %s ?"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
-"le symbole %s est utilisé mais ce n'est pas un terminal et il ne possède pas "
-"de règle"
+"le symbole %s est utilisé mais ce n'est pas un jeton et il ne possède pas de "
+"règle"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr "yacc POSIX réserve %%type pour les non terminaux"
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
-msgstr "symbole %s est redéclaré"
+msgstr "le symbole %s est redéclaré"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
-msgstr "les non terminaux ne peuvent pas recevoir un nombre explicite"
+msgid "nonterminals cannot be given a token code"
+msgstr "les non terminaux ne peuvent pas recevoir un code de jeton"
 
-#: src/symtab.c:575
+#: src/symtab.c:594
 #, c-format
-msgid "redefining user token number of %s"
-msgstr "redéfinition du numéro utilisateur du jeton de %s"
+msgid "redefining code of token %s"
+msgstr "redéfinition le code du jeton %s"
 
-#: src/symtab.c:578
+#: src/symtab.c:597
 #, c-format
-msgid "user token number of %s too large"
-msgstr "le numéro utilisateur du jeton de %s est trop grand"
+msgid "code of token %s too large"
+msgstr "le code du jeton %s est trop grand"
 
-#: src/symtab.c:617
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr "le littéral caractère %s n'est pas attaché à un symbole"
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "%s inutile pour le type <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "le type <%s> est utilisé mais n'est pas associé à un symbole"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr "les non terminaux ne peuvent pas recevoir une chaîne synonyme"
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "symbole %s utilisé plus d'une fois dans une chaîne littérale"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "symbole %s présent dans plus d'une chaîne littérale"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "redéclaration du numéro de jeton utilisateur %d pour %s"
+msgid "code %d reassigned to token %s"
+msgstr "le code %d est réassigné au jeton %s"
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "déclaration précédente de %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr "numéro de jeton trop grand"
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "le symbole de départ %s n'est pas défini"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "le symbole de départ %s est un terminal"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "priorité et associativité inutiles pour %s"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "priorité inutile pour %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "associativité inutile pour %s, utilisez %%precedence"
 
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#~ msgid "multiple %s declarations"
+#~ msgstr "déclarations multiples de %s"
+
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "trop de symboles dans la grammaire d'entrée (limite est %d)"
+
+#~ msgid ""
+#~ "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e or %6e "
+#~ "before %u"
+#~ msgstr ""
+#~ "%@: erreur de syntaxe: %0e ou %1e ou %2e ou %3e ou %4e ou %5e ou %6e "
+#~ "attendu avant %u"
+
+#~ msgid "nonterminals cannot be given an explicit number"
+#~ msgstr "les non terminaux ne peuvent pas recevoir un nombre explicite"
+
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "redéclaration du numéro de jeton utilisateur %d pour %s"
+
 #~ msgid "deprecated directive, use %s"
 #~ msgstr "directive dépréciée, utilisez %s"
 
@@ -1242,9 +1473,6 @@
 #~ "    aucune de celles ci-dessus\n"
 #~ "  "
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "paramètre %s pas valable pour %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "paramètre %s ambigu pour %s"
 
diff --git a/po/ga.gmo b/po/ga.gmo
index 7d02cf2..7df73e5 100644
--- a/po/ga.gmo
+++ b/po/ga.gmo
Binary files differ
diff --git a/po/ga.po b/po/ga.po
index 28e99d8..4cacf50 100644
--- a/po/ga.po
+++ b/po/ga.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: bison 3.0.4\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2017-01-09 18:52-0500\n"
 "Last-Translator: Kevin Scannell <kscanne@gmail.com>\n"
 "Language-Team: Irish <gaeilge-gnulinux@lists.sourceforge.net>\n"
@@ -18,169 +18,292 @@
 "Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :"
 "(n>6 && n<11) ? 3 : 4;\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "carachtar neamhbhailí"
+
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "earráid chomhréire"
+
+#: examples/c/bistromathic/parse.y:390
+#, fuzzy
+msgid "%@: syntax error: unexpected %u"
+msgstr "earráid chomhréire, %s gan choinne, bhíothas ag súil le %s"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+#, fuzzy
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "earráid chomhréire, %s gan choinne, bhíothas ag súil le %s"
+
+#: examples/c/bistromathic/parse.y:399
+#, fuzzy
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "earráid chomhréire, %s gan choinne, bhíothas ag súil le %s nó %s nó %s"
+
+#: examples/c/bistromathic/parse.y:400
+#, fuzzy
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "earráid chomhréire, %s gan choinne, bhíothas ag súil le %s nó %s nó %s"
+
+#: examples/c/bistromathic/parse.y:401
+#, fuzzy
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr "earráid chomhréire, %s gan choinne, bhíothas ag súil le %s nó %s nó %s"
+
+#: examples/c/bistromathic/parse.y:402
+#, fuzzy
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr "earráid chomhréire, %s gan choinne, bhíothas ag súil le %s nó %s nó %s"
+
+#: examples/c/bistromathic/parse.y:403
+#, fuzzy
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+"earráid chomhréire, %s gan choinne, bhíothas ag súil le %s nó %s nó %s nó %s"
+
+#: examples/c/bistromathic/parse.y:404
+#, fuzzy
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+"earráid chomhréire, %s gan choinne, bhíothas ag súil le %s nó %s nó %s nó %s"
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "%s ar iarraidh ag deireadh an chomhaid"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr ""
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, fuzzy, c-format
 msgid "empty rules without %empty"
 msgstr "riail fholamh gan %%empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr ""
 
-#: src/complain.c:120
+#: src/complain.c:160
 #, fuzzy
 msgid "useless precedence and associativity"
 msgstr "tosaíocht agus comhthiomsaitheacht gan úsáid le haghaidh %s"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr ""
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr ""
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr ""
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr ""
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "rabhadh"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "earráid"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "earráid mharfach"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr ""
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "treoir dulta i léig: %s, úsáid %s ina áit"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, fuzzy, c-format
 msgid "duplicate directive"
 msgstr "treoir dulta i léig; úsáid %s ina áit"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, fuzzy, c-format
 msgid "duplicate directive: %s"
 msgstr "treoir dulta i léig; úsáid %s ina áit"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "fógra roimhe seo"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "ní cheadaítear ach %s amháin an riail"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+msgid "syntax error"
+msgstr "earráid chomhréire"
+
+#: src/complain.c:648
+#, fuzzy
+msgid "unexpected %0$s"
+msgstr "earráid chomhréire, %s gan choinne"
+
+#: src/complain.c:649
+#, fuzzy
+msgid "expected %1$s before %0$s"
+msgstr ""
+"earráid chomhréire, %s gan choinne, bhíothas ag súil le %s nó %s nó %s nó %s"
+
+#: src/complain.c:650
+#, fuzzy
+msgid "expected %1$s or %2$s before %0$s"
+msgstr ""
+"earráid chomhréire, %s gan choinne, bhíothas ag súil le %s nó %s nó %s nó %s"
+
+#: src/complain.c:651
+#, fuzzy
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr ""
+"earráid chomhréire, %s gan choinne, bhíothas ag súil le %s nó %s nó %s nó %s"
+
+#: src/complain.c:652
+#, fuzzy
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr ""
+"earráid chomhréire, %s gan choinne, bhíothas ag súil le %s nó %s nó %s nó %s"
+
+#: src/conflicts.c:88
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr ""
 "    Coinbhleacht idir riail %d agus teaghrán comharthach %s: réitíodh mar "
 "iomlaoid"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr ""
 "    Coinbhleacht idir riail %d agus teaghrán comharthach %s: réitíodh mar "
 "laghdú"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr ""
 "    Coinbhleacht idir riail %d agus teaghrán comharthach %s: réitíodh mar "
 "earráid"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Staid %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "coinbhleachtaí: %d iomlaoid/laghdú, %d laghdú/laghdú\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "coinbhleachtaí: %d iomlaoid/laghdú\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "coinbhleachtaí: %d laghdú/laghdú\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, fuzzy, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "coinbhleachtaí iomlaoid/laghdú: aimsíodh %d, bhíothas ag súil le %d"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, fuzzy, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "coinbhleachtaí laghdú/laghdú: aimsíodh %d, bhíothas ag súil le %d"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "Níl %%expect-rr in úsáid ach le parsálaithe GLR"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "coinbhleachtaí iomlaoid/laghdú: aimsíodh %d, bhíothas ag súil le %d"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
@@ -190,12 +313,12 @@
 msgstr[3] "%d gcoinbhleacht iomlaoid/laghdú"
 msgstr[4] "%d coinbhleacht iomlaoid/laghdú"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "coinbhleachtaí laghdú/laghdú: aimsíodh %d, bhíothas ag súil le %d"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
@@ -205,27 +328,83 @@
 msgstr[3] "%d gcoinbhleacht laghdú/laghdú"
 msgstr[4] "%d coinbhleacht laghdú/laghdú"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "fógra roimhe seo"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "fógra roimhe seo"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "fógra roimhe seo"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "fógra roimhe seo"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "%d choinbhleacht iomlaoid/laghdú"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "%d choinbhleacht laghdú/laghdú"
+msgstr[1] "%d choinbhleacht laghdú/laghdú"
+msgstr[2] "%d choinbhleacht laghdú/laghdú"
+msgstr[3] "%d gcoinbhleacht laghdú/laghdú"
+msgstr[4] "%d coinbhleacht laghdú/laghdú"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: ní féidir oscailt"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "earráid ionchurtha/aschurtha"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "ní féidir an comhad a dhúnadh"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "diúltaítear inchomhad %s a fhorscríobh"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "aschuir chontrártha scríofa i gcomhad %s"
@@ -235,96 +414,96 @@
 msgid "%s: cannot backup"
 msgstr "%s: ní féidir oscailt"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr ""
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr ""
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr ""
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 #, fuzzy
 msgid "describe shift/reduce conflicts solving"
 msgstr "%d choinbhleacht iomlaoid/laghdú"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr ""
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr ""
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr ""
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr ""
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Bain triail as '%s --help' chun tuilleadh eolais a fháil.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Úsáid: %s [ROGHA]... COMHAD\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 #, fuzzy
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
@@ -335,18 +514,18 @@
 "a úsáideann táblaí parsálaithe LALR(1), IELR(1), nó LR(1) canónta.\n"
 "Tacaíocht thurgnamhach amháin ar IELR(1) agus LR(1) canónta.\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Is riachtanach le rogha ghearr aon argóint atá riachtanach leis an rogha "
 "fhada.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Agus mar an gcéanna le haghaidh argóintí roghnacha freisin.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 #, fuzzy
 msgid ""
 "Operation Modes:\n"
@@ -375,7 +554,7 @@
 "  -f, --feature[=GNÉ]        cumasaigh gnéithe éagsúla\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -384,7 +563,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, fuzzy, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -417,20 +596,24 @@
 "  -k, --token-table          cuir tábla d'ainmneacha teaghrán san áireamh\n"
 "\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Aschur:\n"
 "      --defines[=COMHAD]     scríobh comhad ceanntásca freisin\n"
@@ -445,50 +628,46 @@
 "  -x, --xml[=COMHAD]         scríobh tuairisc XML ar an uathoibreán\n"
 "                             (tá an scéimre XML turgnamhach)\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Seol tuairiscí ar fhabhtanna chuig <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "Leathanach baile %s: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+#, fuzzy
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr "Cúnamh ginearálta le bogearraí GNU: <http://www.gnu.org/gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+#, fuzzy
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 "Seol tuairiscí faoi fhadhbanna leis an aistriúchán chuig <http://"
 "translationproject.org/team/>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "Le teacht ar an doiciméadú iomlán, úsáid: info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Le Robert Corbett agus Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright © %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -497,36 +676,41 @@
 "coinníollacha cóipeála.  Níl baránta ar bith ann; go fiú níl baránta ann\n"
 "d'INDÍOLTACHT nó FEILIÚNACHT D'FHEIDHM AR LEITH.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "ní cheadaítear níos mó ná creatlach amháin"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: teanga neamhbhailí"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "ní cheadaítear níos mó ná teanga amháin"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, fuzzy, c-format
+msgid "invalid argument for %s: %s"
+msgstr "argóint neamhbhailí %s chun %s"
+
+#: src/getargs.c:868
 #, fuzzy, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "treoir dulta i léig: %s, úsáid %s ina áit"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, fuzzy, c-format
 msgid "missing operand"
 msgstr "%s: oibreann ar iarraidh"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "oibreann breise %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Gramadach"
 
@@ -543,17 +727,27 @@
 "// Leathanach baile: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+#, fuzzy
+msgid "end of file"
+msgstr "%s ar iarraidh ag deireadh an chomhaid"
+
+#: src/i18n-strings.c:36
+#, fuzzy
+msgid "invalid token"
+msgstr "carachtar neamhbhailí"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "líne-uimhir thar maoil"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "uimhir an cholúin thar maoil"
 
-#: src/location.c:155
+#: src/location.c:143
 #, fuzzy, c-format
 msgid "byte number overflow"
 msgstr "líne-uimhir thar maoil"
@@ -563,233 +757,283 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr ""
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "riail gan tairbhe sa pharsálaí de bhrí coinbhleachtaí"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "sainmhíniú nua ar athróg %%define %s"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "sainmhíniú roimhe seo"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: athróg %%define %s gan sainmhíniú"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "sainmhíniú nua ar athróg %%define %s"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "sainmhíniú nua ar athróg %%define %s"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "sainmhíniú nua ar athróg %%define %s"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "luach neamhbhailí ar athróg Boole %%define %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "luach neamhbhailí ar athróg %%define %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "luach glactha: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr ""
+
+#: src/parse-gram.y:214
+#, fuzzy
+msgid "[identifier]"
+msgstr "aitheantóir neamhbhailí: %s"
+
+#: src/parse-gram.y:215
+#, fuzzy
+msgid "character literal"
+msgstr "carachtar litriúil folamh"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+#, fuzzy
+msgid "identifier"
+msgstr "aitheantóir neamhbhailí: %s"
+
+#: src/parse-gram.y:220
+#, fuzzy
+msgid "identifier:"
+msgstr "aitheantóir neamhbhailí: %s"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+#, fuzzy
+msgid "integer literal"
+msgstr "carachtar litriúil folamh"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr ""
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr ""
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, fuzzy, c-format
 msgid "definition of %s"
 msgstr "sainmhíniú nua ar an uimhir theaghráin do %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "aitheantóir ar iarraidh i bhfógra paraiméadair"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, fuzzy, c-format
 msgid "invalid version requirement: %s"
 msgstr "éalúchán neamhbhailí: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr ""
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Staid %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, fuzzy, c-format
+msgid "%s failed with status %d"
+msgstr "theip ar an fhochlár `%s' (stádas scortha %d)"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "déan iomlaoid, agus téigh go staid %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "téigh go staid %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "earráid (neamh-chomhthiomsaitheach)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "laghdaigh, ag úsáid rialach %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "glac leis"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "laghdaigh, ag úsáid rialach %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$réamhshocraithe"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Sloinn dolaghdaithe, le rialacha más cuí"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Sloinn inlaghdaithe, le rialacha más cuí"
 
-#: src/print.c:416
+#: src/print.c:431
 #, fuzzy
 msgid "on left:"
 msgstr " ar clé:"
 
-#: src/print.c:425
+#: src/print.c:440
 #, fuzzy
 msgid "on right:"
 msgstr " ar dheis:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Rialacha gan tairbhe sa pharsálaí de bhrí coinbhleachtaí"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "níos mó ná fógra amháin %s"
-
 # FRTF caismirt
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr ""
 "caismirt idir cineálacha toraidh i bhfeidhm chumaiscthe %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "rinneadh neamhaird d'ainm dúbailte ar %s"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "tugadh riail i gcomhair %s atá ina theaghrán comharthach"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "caismirt idir cineálacha leis an ghníomh réamhshocraithe: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr ""
 "riail fholamh i gcomhair teaghrán inlaghdaithe le cineál, ach níl aon ghníomh"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "luach gan úsáid: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "luach gan socrú: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty ar riail nach bhfuil folamh"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "riail fholamh gan %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "teaghrán comharthach le haghaidh %%prec gan sainmhíniú: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr ""
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "Níl %s curtha i bhfeidhm ach ar pharsálaithe GLR"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "Ní foláir uimhir dheimhneach a theacht i ndiaidh %s"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr ""
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "riail rófhada"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "siombail tosaigh %s gan sainmhíniú"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "is teaghrán comharthach í an tsiombail tosaigh %s"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "níl aon riail sa ghramadach ionchurtha"
@@ -798,24 +1042,24 @@
 msgid "rule useless in grammar"
 msgstr "riail gan tairbhe sa ghramadach"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "slonn inlaghdaithe gan tairbhe sa ghramadach: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Sloinn inlaghdaithe gan tairbhe sa ghramadach"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Sloinn dolaghdaithe gan úsáid sa ghramadach"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Rialacha gan tairbhe sa ghramadach"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
@@ -825,7 +1069,7 @@
 msgstr[3] "%d slonn inlaghdaithe gan tairbhe sa ghramadach"
 msgstr[4] "%d slonn inlaghdaithe gan tairbhe sa ghramadach"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
@@ -835,119 +1079,124 @@
 msgstr[3] "%d riail gan tairbhe sa ghramadach"
 msgstr[4] "%d riail gan tairbhe sa ghramadach"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "níl aon abairt díorthaithe ón siombail tosaigh %s"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "'%s' ar strae"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "déanann sé tagairt do: %c%s ag %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "b'fhéidir: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", %c á chur i bhfolach"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " ag %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, fuzzy, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", níl aon fháil air ó ghníomh meánrialach ag $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "slánuimhir as raon: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "tagairt neamhbhailí: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 "earráid chomhréire tar éis '%c', bhíothas ag súil le slánuimhir, litir, '_', "
 "'[', nó '$'"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "siombail gan aimsiú i riail ghramadaí roimh $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "siombail gan aimsiú i riail ghramadaí: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "tagairt mhíthreorach: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "tagairt dhébhríoch: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "cineál follasach i ngramadach gan chineálacha"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "Níl aon chineál fógartha ag $$ na meánrialach ag $%d de %s"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "Níl aon chineál fógartha ag $$ de %s"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "Níl aon chineál fógartha ag $%s de %s"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr ""
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "uimhir neamhbhailí tar éis éalúcháin-\\: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "',' ar seachrán; déileálfar leis mar spás bán"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "treoir neamhbhailí: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "aitheantóir neamhbhailí: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "carachtar neamhbhailí"
@@ -956,22 +1205,22 @@
 msgstr[3] "carachtair neamhbhailí"
 msgstr[4] "carachtair neamhbhailí"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "carachtar neamhbhailí nialasach"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "aitheantóir gan súil leis in ainm idir lúibíní: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "bhíothas ag súil le haitheantóir"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "carachtar neamhbhailí in ainm idir lúibíní"
@@ -980,92 +1229,82 @@
 msgstr[3] "carachtair neamhbhailí in ainm idir lúibíní"
 msgstr[4] "carachtair neamhbhailí in ainm idir lúibíní"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr ""
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "carachtar litriúil folamh"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "carachtair bhreise i gcarachtar litriúil"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "uimhir neamhbhailí tar éis éalúcháin-\\: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "carachtar neamhbhailí tar éis éalúcháin-\\: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr ""
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "%s ar iarraidh ag deireadh an chomhaid"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "%s ar iarraidh ag deireadh na líne"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "treoir %s gan dúnadh i gcreatlach"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "easpa argóintí do threoir %s i gcreatlach"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "an iomarca argóintí do threoir %s i gcreatlach"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "Ní cheadaíonn Yacc POSIX daiseanna in ainmneacha: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "an iomarca siombailí sa ghramadach ionchurtha (uasmhéid %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "athfhógra %s ar %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "athfhógra %s ar <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "athfhógra ar shiombail %s"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "athfhógra ar shiombail %s"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, fuzzy, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1074,108 +1313,113 @@
 "tá siombail %s in úsáid, ach níl sé ina teaghrán comharthach agus níl aon "
 "riail aici"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "tá siombail %s in úsáid, ach níl sé ina teaghrán comharthach agus níl aon "
 "riail aici"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "athfhógra ar shiombail %s"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
+msgid "nonterminals cannot be given a token code"
 msgstr ""
 
-#: src/symtab.c:575
-#, c-format
-msgid "redefining user token number of %s"
-msgstr "sainmhíniú nua ar an uimhir theaghráin do %s"
-
-#: src/symtab.c:578
+#: src/symtab.c:594
 #, fuzzy, c-format
-msgid "user token number of %s too large"
+msgid "redefining code of token %s"
 msgstr "sainmhíniú nua ar an uimhir theaghráin do %s"
 
-#: src/symtab.c:617
+#: src/symtab.c:597
+#, fuzzy, c-format
+msgid "code of token %s too large"
+msgstr "sainmhíniú nua ar an uimhir theaghráin do %s"
+
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "%s gan úsáid le haghaidh cineáil <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "tá cineál <%s> in úsáid, ach níl sé ceangailte le siombail ar bith"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr ""
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "siombail %s in úsáid níos mó ná uair amháin mar theaghrán litriúil"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "tá níos mó ná teaghrán litriúil amháin ag siombail %s"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "athfhógra ar uimhir theaghráin %d do %s"
+msgid "code %d reassigned to token %s"
+msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "fógra roimhe seo ar %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr ""
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "siombail tosaigh %s gan sainmhíniú"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "is teaghrán comharthach í an tsiombail tosaigh %s"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "tosaíocht agus comhthiomsaitheacht gan úsáid le haghaidh %s"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "tosaíocht gan úsáid le haghaidh %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "comhthiomsaitheacht gan úsáid le haghaidh %s, úsáid %%precedence"
 
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "níos mó ná fógra amháin %s"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "an iomarca siombailí sa ghramadach ionchurtha (uasmhéid %d)"
+
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "athfhógra ar uimhir theaghráin %d do %s"
+
 #, fuzzy
 #~ msgid "eliminate useless chain rules"
 #~ msgstr "slonn inlaghdaithe gan tairbhe sa ghramadach: %s"
@@ -1254,9 +1498,6 @@
 #~ "  'none'         díchumasaigh gach rud thuas\n"
 #~ "  "
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "argóint neamhbhailí %s chun %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "argóint dhébhríoch %s chun %s"
 
@@ -1382,36 +1623,6 @@
 #~ msgid "cannot open stats file for writing"
 #~ msgstr "níorbh fhéidir comhad na staitisticí a oscailt chun é a léamh"
 
-#, fuzzy
-#~| msgid "missing %s at end of file"
-#~ msgid "end \"ABC\" of file"
-#~ msgstr "%s ar iarraidh ag deireadh an chomhaid"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "[identifier]"
-#~ msgstr "aitheantóir neamhbhailí: %s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "character literal"
-#~ msgstr "carachtar litriúil folamh"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier"
-#~ msgstr "aitheantóir neamhbhailí: %s"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier:"
-#~ msgstr "aitheantóir neamhbhailí: %s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "integer literal"
-#~ msgstr "carachtar litriúil folamh"
-
 #~ msgid "symbol %s redefined"
 #~ msgstr "sainmhíniú nua ar shiombail %s"
 
@@ -1624,30 +1835,12 @@
 #~ msgid "POSIX forbids declarations in the grammar"
 #~ msgstr "Ní cheadaítear fógraí sa ghramadach de réir POSIX"
 
-#~ msgid "syntax error, unexpected %s"
-#~ msgstr "earráid chomhréire, %s gan choinne"
-
-#~ msgid "syntax error, unexpected %s, expecting %s"
-#~ msgstr "earráid chomhréire, %s gan choinne, bhíothas ag súil le %s"
-
 #~ msgid "syntax error, unexpected %s, expecting %s or %s"
 #~ msgstr "earráid chomhréire, %s gan choinne, bhíothas ag súil le %s nó %s"
 
-#~ msgid "syntax error, unexpected %s, expecting %s or %s or %s"
-#~ msgstr ""
-#~ "earráid chomhréire, %s gan choinne, bhíothas ag súil le %s nó %s nó %s"
-
-#~ msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
-#~ msgstr ""
-#~ "earráid chomhréire, %s gan choinne, bhíothas ag súil le %s nó %s nó %s nó "
-#~ "%s"
-
 #~ msgid "syntax error; also memory exhausted"
 #~ msgstr "earráid chomhréire; cuimhne ídithe freisin"
 
-#~ msgid "syntax error"
-#~ msgstr "earráid chomhréire"
-
 #~ msgid "Error: discarding"
 #~ msgstr "Earráid: curtha i leataobh"
 
@@ -1663,8 +1856,5 @@
 #~ msgid "invalid $ value"
 #~ msgstr "luach $ neamhbhailí"
 
-#~ msgid "subsidiary program `%s' failed (exit status %d)"
-#~ msgstr "theip ar an fhochlár `%s' (stádas scortha %d)"
-
 #~ msgid "conflicting associativities for %s (%s) and %s (%s)"
 #~ msgstr "comhthiomsaitheacht chontrártha idir %s (%s) agus %s (%s)"
diff --git a/po/hr.gmo b/po/hr.gmo
index 9a7f9e3..449282c 100644
--- a/po/hr.gmo
+++ b/po/hr.gmo
Binary files differ
diff --git a/po/hr.po b/po/hr.po
index 238d29a..07a559e 100644
--- a/po/hr.po
+++ b/po/hr.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: bison 2.7.1\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2013-04-18 00:00+0200\n"
 "Last-Translator: Tomislav Krznar <tomislav.krznar@gmail.com>\n"
 "Language-Team: Croatian <lokalizacija@linux.hr>\n"
@@ -21,163 +21,268 @@
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 "X-Generator: Gtranslator 2.91.6\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "neispravan znak"
+
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "kobna greška"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr ""
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "neočekivan kraj datoteke"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr ""
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, c-format
 msgid "empty rules without %empty"
 msgstr ""
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr ""
 
-#: src/complain.c:120
+#: src/complain.c:160
 #, fuzzy
 msgid "useless precedence and associativity"
 msgstr "konflikt u prethodnici za %s and %s"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr ""
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr ""
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr ""
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr ""
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "upozorenje"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "greška"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "kobna greška"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr ""
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, fuzzy, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "neispravan propis: %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, fuzzy, c-format
 msgid "duplicate directive"
 msgstr "neispravan propis: %s"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, fuzzy, c-format
 msgid "duplicate directive: %s"
 msgstr "neispravan propis: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "prethodna deklaracija"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "samo je jedan %s dozvoljen po pravilu"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+#, fuzzy
+msgid "syntax error"
+msgstr "kobna greška"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr ""
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr ""
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr ""
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr ""
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr ""
+
+#: src/conflicts.c:88
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "    Konflikt između pravila %d i simbola %s razriješen kao pomak"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr "    Konflikt između pravila %d i simbola %s razriješen kao redukcija"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "    Konflikt između pravila %d i simbola %s razriješen kao greška"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Stanje %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "konflikti: %d pomakni/reduciraj, %d reduciraj/reduciraj\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "konflikti: %d pomakni/reduciraj\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "konflikti: %d reduciraj/reduciraj\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, fuzzy, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "%d pomakni/reduciraj konflikt"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, fuzzy, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "%d pomakni/reduciraj konflikt"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr se primjenjuje samo na GLR analizatore"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, fuzzy, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "%d pomakni/reduciraj konflikt"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
@@ -185,12 +290,12 @@
 msgstr[1] "%d pomakni/reduciraj konflikta"
 msgstr[2] "%d pomakni/reduciraj konflikata"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, fuzzy, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
@@ -198,27 +303,81 @@
 msgstr[1] "očekujem %d reduciraj/reduciraj konflikta"
 msgstr[2] "očekujem %d reduciraj/reduciraj konflikata"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "prethodna deklaracija"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "prethodna deklaracija"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "prethodna deklaracija"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "prethodna deklaracija"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "%d pomakni/reduciraj konflikt"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "očekujem %d reduciraj/reduciraj konflikt"
+msgstr[1] "očekujem %d reduciraj/reduciraj konflikta"
+msgstr[2] "očekujem %d reduciraj/reduciraj konflikata"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: ne mogu otvoriti"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "ulazno/izlazna greška"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "ne mogu zatvoriti datoteku"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "odbijam pisati preko ulazne datoteke %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "konfliktni izlazi u datoteku %s"
@@ -228,96 +387,96 @@
 msgid "%s: cannot backup"
 msgstr "%s: ne mogu otvoriti"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr ""
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr ""
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr ""
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 #, fuzzy
 msgid "describe shift/reduce conflicts solving"
 msgstr "%d pomakni/reduciraj konflikt"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr ""
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr ""
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr ""
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr ""
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, fuzzy, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Pokušajte „%s --help” za više informacija.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Uporaba: %s [OPCIJA]... DATOTEKA\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 #, fuzzy
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
@@ -329,17 +488,17 @@
 "Podrška za IELR(1) i kanonski LR(1) je eksperimentalna.\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Obavezni argumenti dugačkih opcija također su obavezni za kratke opcije.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Isto vrijedi i za opcionalne argumente.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 #, fuzzy
 msgid ""
 "Operation Modes:\n"
@@ -366,7 +525,7 @@
 "  -f, --feature[=MOGUĆNOST]  aktiviraj razne mogućnosti\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -375,7 +534,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, fuzzy, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -406,20 +565,24 @@
 "  -l, --no-lines                   ne stvaraj „#line” propise\n"
 "  -k, --token-table                uključi tablicu imena simbola\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Izlaz:\n"
 "      --defines[=DATOTEKA]   također napravi datoteku zaglavlja\n"
@@ -433,50 +596,46 @@
 "  -x, --xml[=DATOTEKA]       također ispiši XML izvještaj o automatu\n"
 "                             (XML shema je eksperimentalna)\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Prijavite greške na <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "%s početna stranica: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+#, fuzzy
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
 "Općenita pomoć za korištenje GNU softvera: <http://www.gnu.org/gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+#, fuzzy
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 "Prijavite greške prijevoda na <http://translationproject.org/team/hr.html>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "Za prikaz cjelokupne dokumentacije pokrenite „info bison”.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Napisali Robert Corbett i Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright © %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -485,36 +644,41 @@
 "jamstava,\n"
 "čak ni za TRGOVINSKU PRIKLADNOST ili ODGOVARANJE ODREĐENOJ SVRSI.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "višestruke deklaracije predloška nisu ispravne"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: neispravan jezik"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "višestruke deklaracije jezika nisu ispravne"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, fuzzy, c-format
+msgid "invalid argument for %s: %s"
+msgstr "neispravan argument %s za %s"
+
+#: src/getargs.c:868
 #, fuzzy, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "neispravan propis: %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, fuzzy, c-format
 msgid "missing operand"
 msgstr "%s: nedostaje operand"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "operand viška %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Gramatika"
 
@@ -531,17 +695,27 @@
 "// Početna stranica: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+#, fuzzy
+msgid "end of file"
+msgstr "neočekivan kraj datoteke"
+
+#: src/i18n-strings.c:36
+#, fuzzy
+msgid "invalid token"
+msgstr "neispravan znak"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "preljev broja redaka"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "preljev broja stupaca"
 
-#: src/location.c:155
+#: src/location.c:143
 #, fuzzy, c-format
 msgid "byte number overflow"
 msgstr "preljev broja redaka"
@@ -551,230 +725,281 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr ""
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "pravilo beskorisno u analizatoru zbog konflikata"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "%%define varijabla %s je ponovo definirana"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "prethodna definicija"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: nedefinirana %%define varijabla %s"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "%%define varijabla %s je ponovo definirana"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "%%define varijabla %s je ponovo definirana"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "%%define varijabla %s je ponovo definirana"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "neispravna vrijednost %%define logičke varijable %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "neispravna vrijednost %%define varijable %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "prihvaćena vrijednost: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+#, fuzzy
+msgid "translatable string"
+msgstr "nezavršeni znakovni niz"
+
+#: src/parse-gram.y:214
+#, fuzzy
+msgid "[identifier]"
+msgstr "neispravan identifikator: %s"
+
+#: src/parse-gram.y:215
+#, fuzzy
+msgid "character literal"
+msgstr "prazna znakovna konstanta"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+#, fuzzy
+msgid "identifier"
+msgstr "neispravan identifikator: %s"
+
+#: src/parse-gram.y:220
+#, fuzzy
+msgid "identifier:"
+msgstr "neispravan identifikator: %s"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+#, fuzzy
+msgid "integer literal"
+msgstr "prazna znakovna konstanta"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr ""
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr ""
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, fuzzy, c-format
 msgid "definition of %s"
 msgstr "ponovo definiram broj korisničkog simbola od %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "nedostaje identifikator u deklaraciji paremetra"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, fuzzy, c-format
 msgid "invalid version requirement: %s"
 msgstr "neispravna referenca: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr ""
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Stanje %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr ""
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "pomakni i idi u stanje %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "idi u stanje %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "greška (neasocijativna)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "reduciraj koristeći pravilo %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "prihvati"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "reduciraj koristeći pravilo %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Završni znakovi, s pravilima gdje se pojavljuju"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Nezavršni znakovi, s pravilima gdje se pojavljuju"
 
-#: src/print.c:416
+#: src/print.c:431
 #, fuzzy
 msgid "on left:"
 msgstr " s lijeva:"
 
-#: src/print.c:425
+#: src/print.c:440
 #, fuzzy
 msgid "on right:"
 msgstr " s desna:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Pravila su beskorisna u analizatoru zbog konflikata"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "višestruke %s deklaracije"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "sukob rezultantne vrste u funkciji spajanja %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "dvostruko ime simbola za %s je zanemareno"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "navedeno je pravilo za %s, a to je simbol"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "sukob vrsta u zadanoj radnji: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "prazno pravilo za nezavršni znak i nema radnje"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "nekorištena vrijednost: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "nepostavljena vrijednost: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr ""
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr ""
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "simbol za %%prec nije definiran: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr ""
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s utječe samo na GLR analizatore"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "nakon %s mora slijediti pozitivan broj"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr ""
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "pravilo je predugačko"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "početni simbol %s nije definiran"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "početni simbol %s je simbol"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "nema pravila u ulaznoj gramatici"
@@ -783,24 +1008,24 @@
 msgid "rule useless in grammar"
 msgstr "pravilo je beskorisno u gramatici"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "nezavršni znak je beskoristan u gramatici: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Nezavršni znakovi beskorisni u gramatici"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Završni znakovi nekorišteni u gramatici"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Pravila beskorisna u gramatici"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
@@ -808,7 +1033,7 @@
 msgstr[1] "%d nezavršna znaka beskorisna u gramatici"
 msgstr[2] "%d nezavršnih znakova beskorisnih u gramatici"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
@@ -816,338 +1041,338 @@
 msgstr[1] "%d pravila beskorisna u gramatici"
 msgstr[2] "%d pravila beskorisnih u gramatici"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "početni simbol %s ne daje niti jednu rečenicu"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "zalutali „%s”"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "odnosi se na: %c%s na %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "vjerojatno znači: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", skrivajući %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " na %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, fuzzy, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", ne može mu pristupiti mid-rule radnja na $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "cijeli broj izvan granica: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "neispravna referenca: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 "sintaksna greška nakon „%c”, očekujem cijeli broj, slovo, „_”, „[” ili „$”"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "simbol nije pronađen u proizvodnji prije $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "simbol nije pronađen u proizvodnji: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "krivo navodeća referenca: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "višeznačna referenca: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "navedena eksplicitna vrsta u neunesenoj gramatici"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ za srednje pravilo na $%d od %s nema deklariranu vrstu"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ od %s nema deklariranu vrstu"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s od %s nema deklariranu vrstu"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr ""
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "neispravan broj nakon \\-izlaza: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "postupam sa zalutalim „,” kao praznim prostorom"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "neispravan propis: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "neispravan identifikator: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "neispravan znak"
 msgstr[1] "neispravni znakovi"
 msgstr[2] "neispravni znakovi"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "neispravan prazan znak"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "neočekivani identifikator u zagrađenom imenu: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "očekujem identifikator"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "neispravan znak u zagrađenom imenu"
 msgstr[1] "neispravni znakovi u zagrađenom imenu"
 msgstr[2] "neispravni znakovi u zagrađenom imenu"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr ""
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "prazna znakovna konstanta"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "višak znakova u znakovnoj konstanti"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "neispravan broj nakon \\-izlaza: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "neispravan znak nakon \\-izlaza: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr ""
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "nedostaje %s na kraju datoteke"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "nedostaje %s na kraju retka"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "nezatvoren %s propis u predlošku"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "premalo argumenata %s propisa u predlošku"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "premalo argumenata %s propisa u predlošku"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc zabranjuje povlake u imenima simbola: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "previše simbola u ulaznoj gramatici (ograničenje je %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "ponovna deklaracija %s za %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "ponovna deklaracija %s za <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "simbol %s ponovo deklariran"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "simbol %s ponovo deklariran"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, fuzzy, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
 "mean %s?"
 msgstr "simbol %s je korišten, ali nije definiran kao simbol i nema pravila"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr "simbol %s je korišten, ali nije definiran kao simbol i nema pravila"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "simbol %s ponovo deklariran"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
+msgid "nonterminals cannot be given a token code"
 msgstr ""
 
-#: src/symtab.c:575
-#, c-format
-msgid "redefining user token number of %s"
-msgstr "ponovo definiram broj korisničkog simbola od %s"
-
-#: src/symtab.c:578
+#: src/symtab.c:594
 #, fuzzy, c-format
-msgid "user token number of %s too large"
+msgid "redefining code of token %s"
 msgstr "ponovo definiram broj korisničkog simbola od %s"
 
-#: src/symtab.c:617
+#: src/symtab.c:597
+#, fuzzy, c-format
+msgid "code of token %s too large"
+msgstr "ponovo definiram broj korisničkog simbola od %s"
+
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr ""
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, fuzzy, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "simbol %s je korišten, ali nije definiran kao simbol i nema pravila"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr ""
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "simbol %s je korišten više puta kao konstantan niz"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "simbolu %s je dano više od jednog konstantnog niza"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "ponovna deklaracija broja korisničkog simbola %d za %s"
+msgid "code %d reassigned to token %s"
+msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "prethodna deklaracija za %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr ""
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "početni simbol %s nije definiran"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "početni simbol %s je simbol"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr ""
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, fuzzy, c-format
 msgid "useless precedence for %s"
 msgstr "konflikt u prethodnici za %s and %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr ""
 
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "višestruke %s deklaracije"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "previše simbola u ulaznoj gramatici (ograničenje je %d)"
+
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "ponovna deklaracija broja korisničkog simbola %d za %s"
+
 #, fuzzy
 #~ msgid "eliminate useless chain rules"
 #~ msgstr "nezavršni znak je beskoristan u gramatici: %s"
@@ -1223,9 +1448,6 @@
 #~ "  „none”         onemogući sve navedeno\n"
 #~ "  "
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "neispravan argument %s za %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "višeznačan argument %s za %s"
 
@@ -1351,41 +1573,6 @@
 #~ msgid "cannot open stats file for writing"
 #~ msgstr "ne mogu otvoriti datoteku stanja za pisanje"
 
-#, fuzzy
-#~| msgid "unexpected end of file"
-#~ msgid "end \"ABC\" of file"
-#~ msgstr "neočekivan kraj datoteke"
-
-#, fuzzy
-#~| msgid "unterminated string"
-#~ msgid "translatable string"
-#~ msgstr "nezavršeni znakovni niz"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "[identifier]"
-#~ msgstr "neispravan identifikator: %s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "character literal"
-#~ msgstr "prazna znakovna konstanta"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier"
-#~ msgstr "neispravan identifikator: %s"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier:"
-#~ msgstr "neispravan identifikator: %s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "integer literal"
-#~ msgstr "prazna znakovna konstanta"
-
 #~ msgid "symbol %s redefined"
 #~ msgstr "simbol %s ponovo definiran"
 
diff --git a/po/id.gmo b/po/id.gmo
index c3d2ea0..fdc2557 100644
--- a/po/id.gmo
+++ b/po/id.gmo
Binary files differ
diff --git a/po/id.po b/po/id.po
index ef679bd..bcdeee4 100644
--- a/po/id.po
+++ b/po/id.po
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: bison-2.4.1b\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2010-02-27 07:30+0700\n"
 "Last-Translator: Arif E. Nugroho <arif_endro@yahoo.com>\n"
 "Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
@@ -21,201 +21,358 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "karakter tidak valid: %s"
+
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "kesalahan fatal"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr ""
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "kehilangan `%s' di akhir file"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr ""
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, c-format
 msgid "empty rules without %empty"
 msgstr ""
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr ""
 
-#: src/complain.c:120
+#: src/complain.c:160
 msgid "useless precedence and associativity"
 msgstr ""
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr ""
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr ""
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr ""
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr ""
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "peringatan"
 
-#: src/complain.c:258
+#: src/complain.c:299
 #, fuzzy
 msgid "error"
 msgstr "Kesalahan I/O"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "kesalahan fatal"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr ""
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, fuzzy, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "direktif tidak valid: %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, fuzzy, c-format
 msgid "duplicate directive"
 msgstr "direktif tidak valid: %s"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, fuzzy, c-format
 msgid "duplicate directive: %s"
 msgstr "direktif tidak valid: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "deklarasi sebelumnya"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "hanya satu %s yang dibolehkan per aturan"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+#, fuzzy
+msgid "syntax error"
+msgstr "kesalahan fatal"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr ""
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr ""
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr ""
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr ""
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr ""
+
+#: src/conflicts.c:88
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "    Konflik antara aturan %d dan token %s diselesaikan sebagai shift"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr "    Konflik antara aturan %d dan token %s diselesaikan sebagai reduce"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr ""
 "    Konflik antara aturan %d dan token %s diselesaikan sebagai kesalahan"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "State %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "konflik: %d geser/kurangi, %d kurangi/kurangi\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "konflik: %d geser/kurangi\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "konflik: %d kurangi/kurangi\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr hanya berlaku bagi parser GLR"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, fuzzy, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "mengharapkan %d shift/reduce konflik"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, fuzzy, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "diharapkan %d kurangi/kurangi konflik"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "deklarasi sebelumnya"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "deklarasi sebelumnya"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "deklarasi sebelumnya"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "deklarasi sebelumnya"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "mengharapkan %d shift/reduce konflik"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "diharapkan %d kurangi/kurangi konflik"
+
+#: src/files.c:144
 #, fuzzy, c-format
 msgid "%s: cannot open"
 msgstr "tidak dapat membuka file `%s'"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr ""
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "tidak dapat menutup file"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "menolak untuk overwrite berkas masukan %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "output konflik ke file %s"
@@ -225,112 +382,112 @@
 msgid "%s: cannot backup"
 msgstr "tidak dapat membuka file `%s'"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr ""
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr ""
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr ""
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 #, fuzzy
 msgid "describe shift/reduce conflicts solving"
 msgstr "mengharapkan %d shift/reduce konflik"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr ""
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr ""
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr ""
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr ""
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, fuzzy, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Coba `%s --help' untuk informasi lebih lanjut.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Penggunaan: %s [OPTION]... FILE\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
 "\n"
 msgstr ""
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr "Argumen wajib untuk opsi panjang juga wajib untuk opsi pendek juga.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Itu juga benar untuk opsional argumen.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 #, fuzzy
 msgid ""
 "Operation Modes:\n"
@@ -357,7 +514,7 @@
 "  -W, --warnings=[KATEGORI]  laporkan peringatan kegagalan dalam KATEGORI\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -366,7 +523,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, fuzzy, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -394,20 +551,24 @@
 "  -n, --no-parser            hasilkan hanya tabel\n"
 "  -k, --token-table          sertakan tabel nama token\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Output:\n"
 "      --defines              juga hasilkan file header\n"
@@ -420,50 +581,44 @@
 "  -o, --output=FILE          simpan output ke FILE\n"
 "  -g, --graph                juga hasilkan deskripsi VCG automaton\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, fuzzy, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr ""
 "\n"
 "Laporkan bugs ke <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr ""
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr ""
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Written by Robert Corbett and Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -471,36 +626,41 @@
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "deklarasi kerangka ganda tidak valid"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, fuzzy, c-format
 msgid "%s: invalid language"
 msgstr "bahasa tidak valid: `%s'"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "deklarasi bahasa ganda tidak valid"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, fuzzy, c-format
+msgid "invalid argument for %s: %s"
+msgstr "argument %s tidak valid untuk %s"
+
+#: src/getargs.c:868
 #, fuzzy, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "direktif tidak valid: %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, fuzzy, c-format
 msgid "missing operand"
 msgstr "operand hilang setelah `%s'"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, fuzzy, c-format
 msgid "extra operand %s"
 msgstr "operand ekstra `%s'"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Grammar"
 
@@ -513,17 +673,27 @@
 "\n"
 msgstr ""
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+#, fuzzy
+msgid "end of file"
+msgstr "kehilangan `%s' di akhir file"
+
+#: src/i18n-strings.c:36
+#, fuzzy
+msgid "invalid token"
+msgstr "karakter tidak valid: %s"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "overflow nomor baris"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "overflow jumlah kolom"
 
-#: src/location.c:155
+#: src/location.c:143
 #, fuzzy, c-format
 msgid "byte number overflow"
 msgstr "overflow nomor baris"
@@ -533,230 +703,278 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr ""
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "aturan tidak berguna dalam parser karena konflik"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, fuzzy, c-format
 msgid "%%define variable %s redefined"
 msgstr "simbol %s didefinisikan ulang"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "definisi sebelumnya"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, fuzzy, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "nilai tidak valid untuk %%define variable `%s': `%s'"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "simbol %s didefinisikan ulang"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "simbol %s didefinisikan ulang"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "simbol %s didefinisikan ulang"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, fuzzy, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "nilai tidak valid untuk %%define Boolean variable `%s'"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, fuzzy, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "nilai tidak valid untuk %%define variable `%s': `%s'"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, fuzzy, c-format
 msgid "accepted value: %s"
 msgstr "nilai tidak digunakan: $%d"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr ""
+
+#: src/parse-gram.y:214
+#, fuzzy
+msgid "[identifier]"
+msgstr "direktif tidak valid: %s"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr ""
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+#, fuzzy
+msgid "identifier"
+msgstr "direktif tidak valid: %s"
+
+#: src/parse-gram.y:220
+#, fuzzy
+msgid "identifier:"
+msgstr "direktif tidak valid: %s"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr ""
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr ""
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr ""
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, fuzzy, c-format
 msgid "definition of %s"
 msgstr "mendefinisikan ulang nomor token user %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "identifier tidak ada dalam deklarasi parameter"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, fuzzy, c-format
 msgid "invalid version requirement: %s"
 msgstr "urutan escape tidak valid: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr ""
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, fuzzy, c-format
 msgid "State %d"
 msgstr "State %d "
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr ""
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "geser, dan ke state %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "ke state %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "kesalahan(nonasosiatif)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "kurangi gunakan aturan %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "terima"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "kurangi gunakan aturan %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Terminal, dengan aturan tempat mereka muncul"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Nonterminal, dengan aturan tempat mereka muncul"
 
-#: src/print.c:416
+#: src/print.c:431
 #, fuzzy
 msgid "on left:"
 msgstr " di kiri:"
 
-#: src/print.c:425
+#: src/print.c:440
 #, fuzzy
 msgid "on right:"
 msgstr " di kanan:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "aturan tidak berguna dalam parser karena konflik"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "deklarasi ganda %s"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, fuzzy, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "tipe hasil bentrok pada fungsi merge '%s': <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr ""
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "aturan diberikan untuk %s, yang merupakan sebuah token"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "bentrokan tipe pada aksi baku: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "aturan kosong untuk nonterminal typed, dan tidak ada aksi"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "nilai tidak digunakan: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "nilai tidak diset: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr ""
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr ""
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "tanda untuk %%prec belum didefinisikan: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr ""
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s hanya mempengaruhi parser GLR"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s harus diikuti angka positif"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr ""
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "aturan terlalu panjang"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "simbol awal %s tidak didefinisikan"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "simbol awal %s adalah sebuah token"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "tidak ada aturan dalam tata bahasa masukan"
@@ -765,259 +983,254 @@
 msgid "rule useless in grammar"
 msgstr "aturan tidak berguna dalam tata bahasa"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "bukan terminal tidak berguna dalam tata bahasa: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Bukan terminal, tidak berguna dalam tata bahasa"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Terminal tidak digunakan dalam tata bahasa"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Aturan tidak berguna dalam tata bahasa"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d bukan terminal tidak berguna dalam tata bahasa"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d aturan tidak berguna dalam tata bahasa"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "simbol awal %s tidak melahirkan kalimat"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, fuzzy, c-format
 msgid "stray '%s'"
 msgstr "kelebihan `$'"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr ""
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr ""
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ""
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr ""
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ""
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "integer ke luar batas: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, fuzzy, c-format
 msgid "invalid reference: %s"
 msgstr "direktif tidak valid: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr ""
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr ""
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr ""
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, fuzzy, c-format
 msgid "ambiguous reference: %s"
 msgstr "argumen %s ambigu untuk %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "tipe eksplisit diberikan dalam tata bahasa yang tidak diketikan"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, fuzzy, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr ""
 "$$ untuk aturan tengah di $%d dari `%s' tidak memiliki tipe yang terdeklarasi"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, fuzzy, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ dari `%s' tidak memiliki tipe yang terdeklarasi"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, fuzzy, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%d dari `%s' tidak memiliki tipe yang terdeklarasi"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr ""
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "nomor tidak valid setelah \\-escape: %s"
+
+#: src/scan-gram.l:214
 #, fuzzy, c-format
 msgid "stray ',' treated as white space"
 msgstr "stray `,' dianggap sebagai white space"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "direktif tidak valid: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, fuzzy, c-format
 msgid "invalid identifier: %s"
 msgstr "direktif tidak valid: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 #, fuzzy
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "karakter tidak valid: %s"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "karakter null tidak valid"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr ""
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr ""
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 #, fuzzy
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "karakter tidak valid setelah \\-escape: %s"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr ""
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr ""
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr ""
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "nomor tidak valid setelah \\-escape: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "karakter tidak valid setelah \\-escape: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr ""
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, fuzzy, c-format
 msgid "missing %s at end of file"
 msgstr "kehilangan `%s' di akhir file"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, fuzzy, c-format
 msgid "missing %s at end of line"
 msgstr "hilang `%s' di akhir baris"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "direktif %s tidak tertutup dalam kerangka"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "terlalu sedikit argumen untuk direktif %s dalam skeleton"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "terlalu banyak argumen untuk direktif %s dalam skeleton"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr ""
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "terlalu banyak simbol dalam grammar input (batasnya adalah %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "%s redeklarasi untuk %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s redeklarasi untuk <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "simbol %s dideklarasikan ulang"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "simbol %s dideklarasikan ulang"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, fuzzy, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1026,110 +1239,116 @@
 "simbol %s digunakan, namun tidak didefinisikan sebagai token dan tidak "
 "memiliki aturan"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "simbol %s digunakan, namun tidak didefinisikan sebagai token dan tidak "
 "memiliki aturan"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "simbol %s dideklarasikan ulang"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
+msgid "nonterminals cannot be given a token code"
 msgstr ""
 
-#: src/symtab.c:575
-#, c-format
-msgid "redefining user token number of %s"
-msgstr "mendefinisikan ulang nomor token user %s"
-
-#: src/symtab.c:578
+#: src/symtab.c:594
 #, fuzzy, c-format
-msgid "user token number of %s too large"
+msgid "redefining code of token %s"
 msgstr "mendefinisikan ulang nomor token user %s"
 
-#: src/symtab.c:617
+#: src/symtab.c:597
+#, fuzzy, c-format
+msgid "code of token %s too large"
+msgstr "mendefinisikan ulang nomor token user %s"
+
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr ""
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, fuzzy, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr ""
 "simbol %s digunakan, namun tidak didefinisikan sebagai token dan tidak "
 "memiliki aturan"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr ""
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, fuzzy, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "simbol `%s' digunakan lebih dari satu kali sebagai string literal"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, fuzzy, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "simbol `%s' diberikan lebih dari satu string literal"
 
-#: src/symtab.c:736
-#, fuzzy, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "%s redeklarasi untuk %s"
+#: src/symtab.c:752
+#, c-format
+msgid "code %d reassigned to token %s"
+msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, fuzzy, c-format
 msgid "previous declaration for %s"
 msgstr "deklarasi sebelumnya"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr ""
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "simbol awal %s tidak didefinisikan"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "simbol awal %s adalah sebuah token"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr ""
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr ""
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr ""
 
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "deklarasi ganda %s"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "terlalu banyak simbol dalam grammar input (batasnya adalah %d)"
+
+#, fuzzy
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "%s redeklarasi untuk %s"
+
 #, fuzzy
 #~ msgid "eliminate useless chain rules"
 #~ msgstr "bukan terminal tidak berguna dalam tata bahasa: %s"
@@ -1181,9 +1400,6 @@
 #~ "  `all'          sertakan semua informasi di atas\n"
 #~ "  `none'         tiadakan laporan\n"
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "argument %s tidak valid untuk %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "argumen %s ambigu untuk %s"
 
@@ -1307,26 +1523,6 @@
 #~ msgstr "Tidak dapat membuka file stat untuk ditulisi."
 
 #, fuzzy
-#~| msgid "missing `%s' at end of file"
-#~ msgid "end \"ABC\" of file"
-#~ msgstr "kehilangan `%s' di akhir file"
-
-#, fuzzy
-#~| msgid "invalid directive: %s"
-#~ msgid "[identifier]"
-#~ msgstr "direktif tidak valid: %s"
-
-#, fuzzy
-#~| msgid "invalid directive: %s"
-#~ msgid "identifier"
-#~ msgstr "direktif tidak valid: %s"
-
-#, fuzzy
-#~| msgid "invalid directive: %s"
-#~ msgid "identifier:"
-#~ msgstr "direktif tidak valid: %s"
-
-#, fuzzy
 #~| msgid "symbol %s redeclared"
 #~ msgid "symbol %s redefined"
 #~ msgstr "simbol %s dideklarasikan ulang"
diff --git a/po/it.gmo b/po/it.gmo
index 0f4be98..5ce0fa5 100644
--- a/po/it.gmo
+++ b/po/it.gmo
Binary files differ
diff --git a/po/it.po b/po/it.po
index c5d3ed0..53b7afa 100644
--- a/po/it.po
+++ b/po/it.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: bison 2.0\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2005-05-23 12:37+0100\n"
 "Last-Translator: Paolo Bonzini <bonzini@gnu.org>\n"
 "Language-Team: Italian <tp@lists.linux.it>\n"
@@ -17,203 +17,375 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "carattere non valido: %s"
+
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "errore fatale: "
+
+#: examples/c/bistromathic/parse.y:390
+#, fuzzy
+msgid "%@: syntax error: unexpected %u"
+msgstr "errore di sintassi, atteso %2$s e non %1$s"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+#, fuzzy
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "errore di sintassi, atteso %2$s e non %1$s"
+
+#: examples/c/bistromathic/parse.y:399
+#, fuzzy
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "errore di sintassi, atteso %2$s o %3$s o %4$s e non %1$s"
+
+#: examples/c/bistromathic/parse.y:400
+#, fuzzy
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "errore di sintassi, atteso %2$s o %3$s o %4$s e non %1$s"
+
+#: examples/c/bistromathic/parse.y:401
+#, fuzzy
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr "errore di sintassi, atteso %2$s o %3$s o %4$s e non %1$s"
+
+#: examples/c/bistromathic/parse.y:402
+#, fuzzy
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr "errore di sintassi, atteso %2$s o %3$s o %4$s e non %1$s"
+
+#: examples/c/bistromathic/parse.y:403
+#, fuzzy
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr "errore di sintassi, atteso %2$s o %3$s o %4$s o %5$s e non %1$s"
+
+#: examples/c/bistromathic/parse.y:404
+#, fuzzy
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr "errore di sintassi, atteso %2$s o %3$s o %4$s o %5$s e non %1$s"
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "manca un `%s' alla fine del file"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr ""
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, c-format
 msgid "empty rules without %empty"
 msgstr ""
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr ""
 
-#: src/complain.c:120
+#: src/complain.c:160
 msgid "useless precedence and associativity"
 msgstr ""
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr ""
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr ""
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr ""
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr ""
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "attenzione"
 
-#: src/complain.c:258
+#: src/complain.c:299
 #, fuzzy
 msgid "error"
 msgstr "errore di input/output"
 
-#: src/complain.c:260
+#: src/complain.c:301
 #, fuzzy
 msgid "fatal error"
 msgstr "errore fatale: "
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr ""
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, fuzzy, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "direttiva non valida: %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, fuzzy, c-format
 msgid "duplicate directive"
 msgstr "direttiva non valida: %s"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, fuzzy, c-format
 msgid "duplicate directive: %s"
 msgstr "direttiva non valida: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, fuzzy, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
+#, fuzzy
 msgid "previous declaration"
 msgstr "prima dichiarazione"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "solo un %s è permesso in una regola"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+#, fuzzy
+msgid "syntax error"
+msgstr "errore fatale: "
+
+#: src/complain.c:648
+#, fuzzy
+msgid "unexpected %0$s"
+msgstr "errore di sintassi, %s non atteso"
+
+#: src/complain.c:649
+#, fuzzy
+msgid "expected %1$s before %0$s"
+msgstr "errore di sintassi, atteso %2$s o %3$s o %4$s o %5$s e non %1$s"
+
+#: src/complain.c:650
+#, fuzzy
+msgid "expected %1$s or %2$s before %0$s"
+msgstr "errore di sintassi, atteso %2$s o %3$s o %4$s o %5$s e non %1$s"
+
+#: src/complain.c:651
+#, fuzzy
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr "errore di sintassi, atteso %2$s o %3$s o %4$s o %5$s e non %1$s"
+
+#: src/complain.c:652
+#, fuzzy
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr "errore di sintassi, atteso %2$s o %3$s o %4$s o %5$s e non %1$s"
+
+#: src/conflicts.c:88
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "    Conflitto tra la regola %d e il token %s risolto come shift"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr "    Conflitto tra la regola %d e il token %s risolto come riduzione"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "    Conflitto tra la regola %d e il token %s risolto come errore"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Stato %d"
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "conflitti: %d shift/riduzione, %d riduzione/riduzione\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr " %d conflitti shift/riduzione\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr " %d conflitti riduzione/riduzione\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr considerato solo nei parser GLR"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, fuzzy, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "atteso %d conflitto shift/riduzione"
 msgstr[1] "attesi %d conflitti shift/riduzione"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, fuzzy, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "atteso %d conflitto riduzione/riduzione"
 msgstr[1] "attesi %d conflitti riduzione/riduzione"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "prima dichiarazione"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "prima dichiarazione"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "prima dichiarazione"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "prima dichiarazione"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "atteso %d conflitto shift/riduzione"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "atteso %d conflitto riduzione/riduzione"
+msgstr[1] "attesi %d conflitti riduzione/riduzione"
+
+#: src/files.c:144
 #, fuzzy, c-format
 msgid "%s: cannot open"
 msgstr "impossibile aprire il file `%s'"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr ""
 
-#: src/files.c:143
+#: src/files.c:163
 #, fuzzy, c-format
 msgid "cannot close file"
 msgstr "impossibile chiudere il file `%s'"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr ""
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "conflitto nell'output sul file %s"
@@ -223,112 +395,112 @@
 msgid "%s: cannot backup"
 msgstr "impossibile aprire il file `%s'"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr ""
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr ""
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr ""
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 #, fuzzy
 msgid "describe shift/reduce conflicts solving"
 msgstr "atteso %d conflitto shift/riduzione"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr ""
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr ""
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr ""
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr ""
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, fuzzy, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Provare `%s --help' per ulteriori informazioni.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Utilizzo: %s [OPZIONE]... FILE\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
 "\n"
 msgstr ""
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr ""
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -344,7 +516,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -353,7 +525,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, fuzzy, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -379,20 +551,24 @@
 "  -n, --no-parser            genera le sole tabelle\n"
 "  -k, --token-table          include una tabella di nomi dei token\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Output:\n"
 "  -d, --defines              produce anche uno header\n"
@@ -402,48 +578,42 @@
 "  -o, --output=FILE          lascia l'output in FILE\n"
 "  -g, --graph                produce anche una descrizione VCG dell'automa\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, fuzzy, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Segnalare eventuali bug a <bug-bison@gnu.org>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr ""
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr ""
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Scritto da Robert Corbett e Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -452,37 +622,42 @@
 "sottoposta la copia. NON c'è ALCUNA garanzia, neanche di\n"
 "COMMERCIABILITA` o di ADEGUATEZZA AD UN PARTICOLARE SCOPO.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, fuzzy, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "dichiarazioni multiple per %s"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, fuzzy, c-format
 msgid "%s: invalid language"
 msgstr "valore $ non valido"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 #, fuzzy
 msgid "multiple language declarations are invalid"
 msgstr "dichiarazioni multiple per %s"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, fuzzy, c-format
+msgid "invalid argument for %s: %s"
+msgstr "argomento non valido %s per %s"
+
+#: src/getargs.c:868
 #, fuzzy, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "direttiva non valida: %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, fuzzy, c-format
 msgid "missing operand"
 msgstr "manca un operando dopo `%s'"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, fuzzy, c-format
 msgid "extra operand %s"
 msgstr "operando non richiesto `%s'"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Grammatica"
 
@@ -495,17 +670,27 @@
 "\n"
 msgstr ""
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+#, fuzzy
+msgid "end of file"
+msgstr "manca un `%s' alla fine del file"
+
+#: src/i18n-strings.c:36
+#, fuzzy
+msgid "invalid token"
+msgstr "carattere non valido: %s"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr ""
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr ""
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
 msgstr ""
@@ -515,233 +700,281 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr ""
 
-#: src/main.c:155
+#: src/main.c:172
 #, fuzzy
 msgid "rule useless in parser due to conflicts"
 msgstr "regola mai ridotta a causa dei conflitti"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, fuzzy, c-format
 msgid "%%define variable %s redefined"
 msgstr "simbolo %s ridefinito"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr ""
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr ""
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "simbolo %s ridefinito"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "simbolo %s ridefinito"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "simbolo %s ridefinito"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr ""
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr ""
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, fuzzy, c-format
 msgid "accepted value: %s"
 msgstr "valore non valido: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr ""
+
+#: src/parse-gram.y:214
+#, fuzzy
+msgid "[identifier]"
+msgstr "direttiva non valida: %s"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr ""
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+#, fuzzy
+msgid "identifier"
+msgstr "direttiva non valida: %s"
+
+#: src/parse-gram.y:220
+#, fuzzy
+msgid "identifier:"
+msgstr "direttiva non valida: %s"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr ""
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr ""
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr ""
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, fuzzy, c-format
 msgid "definition of %s"
 msgstr "numero di token definito dall'utente specificato due volte per %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "manca un identificatore nella dichirazione di un parametro"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, fuzzy, c-format
 msgid "invalid version requirement: %s"
 msgstr "escape non valido: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr ""
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, fuzzy, c-format
 msgid "State %d"
 msgstr "Stato %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, fuzzy, c-format
+msgid "%s failed with status %d"
+msgstr "esecuzione del programma ausiliario `%s' fallita (codice di uscita %d)"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "shift e prosecuzione allo stato %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "prosecuzione allo stato %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "errore (non associativo)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "riduzione con la regola %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "accetta"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "riduzione con la regola %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Simboli terminali e regole in cui appaiono"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Simboli nonterminali e regole in cui appaiono"
 
-#: src/print.c:416
+#: src/print.c:431
 #, fuzzy
 msgid "on left:"
 msgstr " nel primo membro:"
 
-#: src/print.c:425
+#: src/print.c:440
 #, fuzzy
 msgid "on right:"
 msgstr " nel secondo membro:"
 
-#: src/print.c:447
+#: src/print.c:462
 #, fuzzy
 msgid "Rules useless in parser due to conflicts"
 msgstr "regola mai ridotta a causa dei conflitti"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "dichiarazioni multiple per %s"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr ""
 "conflitto nei tipi del risultato della funzione di merge %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr ""
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "fornita una regola per il token %s"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "conflitto di tipo nell'azione di default: <%s> e <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "regola vuota e nessuna azione per un nonterminale con tipo"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, fuzzy, c-format
 msgid "unused value: $%d"
 msgstr "valore non valido: %s"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr ""
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr ""
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr ""
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr ""
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr ""
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s considerato solo nei parser GLR"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s deve essere seguito da un intero positivo"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr ""
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr ""
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "simbolo iniziale %s non definito"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "specificato il token %s come simbolo iniziale"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "nessuna regola nella grammatica di input"
@@ -751,371 +984,372 @@
 msgid "rule useless in grammar"
 msgstr "nessuna regola nella grammatica di input"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr ""
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 #, fuzzy
 msgid "Nonterminals useless in grammar"
 msgstr "Simboli nonterminali e regole in cui appaiono"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 #, fuzzy
 msgid "Terminals unused in grammar"
 msgstr "nessuna regola nella grammatica di input"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 #, fuzzy
 msgid "Rules useless in grammar"
 msgstr "nessuna regola nella grammatica di input"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, fuzzy, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "nessuna regola nella grammatica di input"
 msgstr[1] "nessuna regola nella grammatica di input"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "dal simbolo iniziale %s non deriva alcuna frase"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr ""
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr ""
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr ""
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ""
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr ""
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ""
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "intero fuori dai limiti: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, fuzzy, c-format
 msgid "invalid reference: %s"
 msgstr "direttiva non valida: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr ""
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr ""
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr ""
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, fuzzy, c-format
 msgid "ambiguous reference: %s"
 msgstr "argomento ambiguo %s per %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr ""
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, fuzzy, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "Manca una dichiarazione di tipo per $%d di `%s'"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, fuzzy, c-format
 msgid "$$ of %s has no declared type"
 msgstr "Manca una dichiarazione di tipo per $$ di `%s'"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, fuzzy, c-format
 msgid "$%s of %s has no declared type"
 msgstr "Manca una dichiarazione di tipo per $%d di `%s'"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr ""
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, fuzzy, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "carattere nullo non valido: %s"
+
+#: src/scan-gram.l:214
 #, fuzzy, c-format
 msgid "stray ',' treated as white space"
 msgstr "`,' inattesa interpretata come uno spazio"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "direttiva non valida: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, fuzzy, c-format
 msgid "invalid identifier: %s"
 msgstr "direttiva non valida: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 #, fuzzy
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "carattere non valido: %s"
 msgstr[1] "carattere non valido: %s"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "carattere nullo non valido"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr ""
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr ""
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 #, fuzzy
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "carattere non valido: %s"
 msgstr[1] "carattere non valido: %s"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr ""
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr ""
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr ""
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, fuzzy, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "carattere nullo non valido: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, fuzzy, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "carattere non valido: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr ""
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, fuzzy, c-format
 msgid "missing %s at end of file"
 msgstr "manca un `%s' alla fine del file"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, fuzzy, c-format
 msgid "missing %s at end of line"
 msgstr "manca un `%s' alla fine della linea"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr ""
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr ""
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr ""
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr ""
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "troppi simboli nella grammatica (il limite è %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "dichiarazione due volte di %s per %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, fuzzy, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "dichiarazione due volte di %s per %s"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "simbolo %s ridefinito"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "%d simbolo nonterminale inutilizzato"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, fuzzy, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
 "mean %s?"
 msgstr "usato il simbolo %s, ma non è un token e non ha regole"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr "usato il simbolo %s, ma non è un token e non ha regole"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, fuzzy, c-format
 msgid "symbol %s redeclared"
 msgstr "simbolo %s ridefinito"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
+msgid "nonterminals cannot be given a token code"
 msgstr ""
 
-#: src/symtab.c:575
-#, c-format
-msgid "redefining user token number of %s"
-msgstr "numero di token definito dall'utente specificato due volte per %s"
-
-#: src/symtab.c:578
+#: src/symtab.c:594
 #, fuzzy, c-format
-msgid "user token number of %s too large"
+msgid "redefining code of token %s"
 msgstr "numero di token definito dall'utente specificato due volte per %s"
 
-#: src/symtab.c:617
+#: src/symtab.c:597
+#, fuzzy, c-format
+msgid "code of token %s too large"
+msgstr "numero di token definito dall'utente specificato due volte per %s"
+
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr ""
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, fuzzy, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "usato il simbolo %s, ma non è un token e non ha regole"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr ""
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, fuzzy, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "simbolo `%s' usato più di una volta in una stringa letterale"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, fuzzy, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "il simbolo `%s' dà pi&grave; di una stringa letterale"
 
-#: src/symtab.c:736
-#, fuzzy, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "dichiarazione due volte di %s per %s"
+#: src/symtab.c:752
+#, c-format
+msgid "code %d reassigned to token %s"
+msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, fuzzy, c-format
 msgid "previous declaration for %s"
 msgstr "dichiarazione due volte di %s per %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr ""
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "simbolo iniziale %s non definito"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "specificato il token %s come simbolo iniziale"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr ""
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr ""
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr ""
 
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "dichiarazioni multiple per %s"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "troppi simboli nella grammatica (il limite è %d)"
+
+#, fuzzy
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "dichiarazione due volte di %s per %s"
+
 #, fuzzy
 #~ msgid "eliminate useless chain rules"
 #~ msgstr "Simboli nonterminali e regole in cui appaiono"
@@ -1143,9 +1377,6 @@
 #~ "  `all'          include tutte queste informazioni\n"
 #~ "  `none'         disabilita la produzione del rapporto\n"
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "argomento non valido %s per %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "argomento ambiguo %s per %s"
 
@@ -1273,26 +1504,6 @@
 #~ msgstr "Impossibile aprire in scrittura il file delle statistiche."
 
 #, fuzzy
-#~| msgid "missing `%s' at end of file"
-#~ msgid "end \"ABC\" of file"
-#~ msgstr "manca un `%s' alla fine del file"
-
-#, fuzzy
-#~| msgid "invalid directive: %s"
-#~ msgid "[identifier]"
-#~ msgstr "direttiva non valida: %s"
-
-#, fuzzy
-#~| msgid "invalid directive: %s"
-#~ msgid "identifier"
-#~ msgstr "direttiva non valida: %s"
-
-#, fuzzy
-#~| msgid "invalid directive: %s"
-#~ msgid "identifier:"
-#~ msgstr "direttiva non valida: %s"
-
-#, fuzzy
 #~| msgid "symbol %s redefined"
 #~ msgid "symbol %s redefined"
 #~ msgstr "simbolo %s ridefinito"
@@ -1407,10 +1618,6 @@
 #~ msgid "subsidiary program `%s' could not be invoked"
 #~ msgstr "impossibile invocare il programma ausiliario `%s'"
 
-#~ msgid "subsidiary program `%s' failed (exit status %d)"
-#~ msgstr ""
-#~ "esecuzione del programma ausiliario `%s' fallita (codice di uscita %d)"
-
 #~ msgid " TOTAL                 :"
 #~ msgstr " TOTALE                :"
 
@@ -1447,21 +1654,9 @@
 #~ msgid "Shifting"
 #~ msgstr "Shift"
 
-#~ msgid "syntax error, unexpected %s"
-#~ msgstr "errore di sintassi, %s non atteso"
-
-#~ msgid "syntax error, unexpected %s, expecting %s"
-#~ msgstr "errore di sintassi, atteso %2$s e non %1$s"
-
 #~ msgid "syntax error, unexpected %s, expecting %s or %s"
 #~ msgstr "errore di sintassi, atteso %2$s o %3$s e non %1$s"
 
-#~ msgid "syntax error, unexpected %s, expecting %s or %s or %s"
-#~ msgstr "errore di sintassi, atteso %2$s o %3$s o %4$s e non %1$s"
-
-#~ msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
-#~ msgstr "errore di sintassi, atteso %2$s o %3$s o %4$s o %5$s e non %1$s"
-
 #~ msgid "syntax error; also memory exhausted"
 #~ msgstr "errore di sintassi; memoria esaurita"
 
diff --git a/po/ja.gmo b/po/ja.gmo
index 8b0f7ec..f6f4b57 100644
--- a/po/ja.gmo
+++ b/po/ja.gmo
Binary files differ
diff --git a/po/ja.po b/po/ja.po
index 68e0807..783779b 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -1,16 +1,16 @@
 # Japanese message for GNU bison
-# Copyright (C) 2001, 2012, 2018 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2020 Free Software Foundation, Inc.
 # This file is distributed under the same license as the bison package.
 # Daisuke Yamashita <yamad@mb.infoweb.ne.jp>, 2001.
 # Yasuaki Taniguchi <yasuakit@gmail.com>, 2010
 # Takeshi Hamasaki <hmatrjp@users.sourceforge.jp>, 2012, 2018
-# Hiroshi Takekawa <sian@big.or.jp>, <sian.ht@gmail.com>, 2019
+# Hiroshi Takekawa <sian@big.or.jp>, <sian.ht@gmail.com>, 2019, 2020, 2021
 msgid ""
 msgstr ""
-"Project-Id-Version: GNU bison 3.4.91\n"
+"Project-Id-Version: GNU bison 3.7.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-11-25 19:20+0900\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2021-08-13 18:36+0900\n"
 "Last-Translator: Hiroshi Takekawa <sian@big.or.jp>\n"
 "Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
 "Language: ja\n"
@@ -21,199 +21,354 @@
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Poedit 2.1.1\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr "number"
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr "function"
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr "variable"
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr "エラー: 0 による除算"
+
+#: examples/c/bistromathic/parse.y:372
+#, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "文法エラー: 無効な文字: %c"
+
+#: examples/c/bistromathic/parse.y:389
+msgid "%@: syntax error"
+msgstr "%@: 文法エラー"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr "%@: 文法エラー: %u があるべきではありません"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "%@: 文法エラー: %u の前に %0e があるべきです"
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "%@: 文法エラー: %u の前に %0e か %1e があるべきです"
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "%@: 文法エラー: %u の前に %0e か %1e か %2e があるべきです"
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr "%@: 文法エラー: %u の前に %0e か %1e か %2e か %3e があるべきです"
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+"%@: 文法エラー: %u の前に %0e か %1e か %2e か %3e か %4e があるべきです"
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+"%@: 文法エラー: %u の前に %0e か %1e か %2e か %3e か %4e か %5e があるべきで"
+"す"
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+"%@: 文法エラー: %u の前に %0e か %1e か %2e か %3e か %4e か %5e などがあるべ"
+"きです"
+
+#: examples/java/calc/Calc.y:81
+msgid "end of line"
+msgstr "end of line"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr "S/R 競合 (デフォルトで有効)"
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr "R/R 競合 (デフォルトで有効)"
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr "競合の反例を生成"
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr "文字列エイリアスとシンボルの対応がない"
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr "もはや用いられないコンストラクト"
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, c-format
 msgid "empty rules without %empty"
 msgstr "%empty なしでの空の規則"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr "設定されていないか使われていない midrule 値"
 
-#: src/complain.c:120
+#: src/complain.c:160
 msgid "useless precedence and associativity"
 msgstr "意味のない precedence と associativity"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr "POSIX Yacc との非互換性"
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr "その他の警告全て (デフォルトで有効)"
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
-msgstr "'dangling-alias' と 'yacc' 以外の警告全て"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
+msgstr "'counterexamples' と 'dangling-alias' と 'yacc' 以外の警告全て"
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr "CATEGORY の警告をオフ"
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr "全ての警告をオフ"
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr "警告をエラー扱いする"
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr "含まれる警告カテゴリ:"
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "警告"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "エラー"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "致命的エラー"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr "ノート"
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr "POSIX Yacc は %s をサポートしていません"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "非推奨の指示です:%s、%s を使ってください"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, c-format
 msgid "duplicate directive"
 msgstr "重複した指示"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, c-format
 msgid "duplicate directive: %s"
 msgstr "重複した指示: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "以前の宣言"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "一つの条件部につき一つしか %s を使えません"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+msgid "syntax error"
+msgstr "文法エラー"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr "予期しない %0$s"
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr "%0$s の前に %1$s があるべきです"
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr "%0$s の前に %1$s か %2$s があるべきです"
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr "%0$s の前に %1$s か %2$s か %3$s があるべきです"
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr "%0$s の前に %1$s か %2$s か %3$s か %4$s があるべきです"
+
+#: src/conflicts.c:88
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "規則 %d とトークン %s の競合をシフトとして解決"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr "規則 %d とトークン %s の競合を還元として解決"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "規則 %d とトークン %s の競合をエラーとして解決"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "状態 %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "競合: %d シフト/還元, %d 還元/還元\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "競合: %d シフト/還元\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "競合: %d 還元/還元\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "規則 %d のシフト/還元衝突: %d 個が見つかりました、%d 個は期待通りです"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "規則 %d の還元/還元衝突: %d 個が見つかりました、%d 個は期待通りです"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr は GLR パーサにしか適用できません"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "シフト/還元衝突: %d 個が見つかりました, %d 個は期待通りです"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d 個のシフト/還元競合"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "還元/還元衝突: %d 個が見つかりました, %d 個は期待通りです"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d 還元/還元競合"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr "'-Wcounterexamples' オプションをつけて競合の反例を生成するために再実行"
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr "例"
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr "最初の例"
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr "第二の例"
+
+#: src/counterexample.c:126
+msgid "Shift derivation"
+msgstr "シフト派生"
+
+#: src/counterexample.c:126
+msgid "First reduce derivation"
+msgstr "最初還元派生"
+
+#: src/counterexample.c:128
+msgid "Reduce derivation"
+msgstr "還元派生"
+
+#: src/counterexample.c:128
+msgid "Second reduce derivation"
+msgstr "第二還元派生"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "トークン %s のシフト/還元競合"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ":"
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "トークン %s の還元/還元競合"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: 開くことができません"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "入力/出力エラーです"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "ファイルを閉じることができません"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "入力ファイル %s の上書きを拒否しました"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "ファイル %s への出力が衝突しています"
@@ -223,95 +378,95 @@
 msgid "%s: cannot backup"
 msgstr "%s: バックアップできません"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr "出力に色をつける"
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr "出力に色をつけない"
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr "出力デバイスが tty の時だけ色をつける"
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr "WHEN は以下のうちのどれかです:"
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr "状態を説明"
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr "コアアイテムセットを閉包で完成"
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr "lookahead トークンを明示的にアイテムに結合"
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 msgid "describe shift/reduce conflicts solving"
 msgstr "解決したシフト/還元について説明"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr "上記の全てを含む"
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr "レポートをしない"
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr "THINGS は以下の単語をコンマ(,)で区切ったリストです:"
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr "TRACES は以下の単語をコンマ(,)で区切ったリストです:"
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr "エラーを ^ つきで表示"
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr "修正を出力"
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr "ファイルを生成しない"
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr "上記全て有効化"
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr "上記全て無効化"
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr "FEATURES は以下の単語をコンマ(,)で区切ったリストです:"
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "`%s --help' で詳細情報を参照してください\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "使い方: %s [オプション]... ファイル\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
@@ -321,16 +476,16 @@
 "LALR(1), IELR(1), または canonical LR(1) パーサテーブルを用いて生成する。\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr "長いオプションに必須の引数は短いオプションにも必須です.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "オプションの引数についても同様です。\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -356,7 +511,7 @@
 "  -f, --feature[=FEATURES]   機能を有効にする\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -370,7 +525,7 @@
 "      --style=FILE           診断結果に色をつける CSS に FILE を使う\n"
 "\n"
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -401,77 +556,79 @@
 "  -k, --token-table          トークン名のテーブルを含める\n"
 "  -y, --yacc                 POSIX Yacc をエミュレートする\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "ファイル出力:\n"
-"      --defines[=FILE]       ヘッダも生成\n"
+"  -H, --header=[FILE]        ヘッダも生成\n"
 "  -d                         ヘッダを生成(FILE は指定できない、POSIX Yacc 向"
 "け)\n"
 "  -r, --report=THINGS        オートマトンについて詳細を出力\n"
 "      --report-file=FILE     レポートを FILE に出力\n"
-"  -v, --verbose              '--report=state' を同じ\n"
+"  -v, --verbose              '--report=state' と同じ\n"
 "  -b, --file-prefix=PREFIX   出力ファイル名の頭に PREFIX をつける\n"
 "  -o, --output=FILE          FILE に出力\n"
 "  -g, --graph[=FILE]         オートマトンのグラフも出力\n"
+"      --html[=FILE]          オートマトンを HTML 形式で出力\n"
 "  -x, --xml[=FILE]           オートマトンを XML 形式で出力\n"
+"  -M, --file-prefix-map=OLD=NEW ファイル名の先頭を OLD から NEW に置きかえ"
+"る\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "バグを発見したら <%s> 宛に報告して下さい。\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "%s のホームページ: <%s>\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
-"GNU ソフトウェアを使用する際の一般的なヘルプ: <http://www.gnu.org/gethelp/>\n"
+"GNU ソフトウェアを使用する際の一般的なヘルプ: <https://www.gnu.org/gethelp/"
+">\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 "翻訳に関するバグは<translation-team-ja@lists.sourceforge.net>に報告してくださ"
 "い。\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "充実したドキュメントは次のコマンドで表示できます: info bison\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Robert Corbett と Richard Stallman によって書かれました\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -482,36 +639,41 @@
 "これはフリーソフトウェアです -- 複製についての条件はソースを見ましょう。\n"
 "一切の保証はありません -- 商業性や目的適合性についての保証すらありません。\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "複数のスケルトンの宣言は無効です"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: 無効な言語"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "複数の言語の宣言は無効です"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, c-format
+msgid "invalid argument for %s: %s"
+msgstr "%s への無効な引数: %s"
+
+#: src/getargs.c:868
 #, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "%s は非推奨のオプションです。%s を使ってください"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, c-format
 msgid "missing operand"
 msgstr "オペランドがありません"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "余分なオペランド %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "文法"
 
@@ -528,17 +690,25 @@
 "// Home page: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+msgid "end of file"
+msgstr "ファイル末尾"
+
+#: src/i18n-strings.c:36
+msgid "invalid token"
+msgstr "不正なトークン"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "行番号がオーバーフローしました"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "列番号がオーバーフローしました"
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
 msgstr "バイト数がオーバーフローしました"
@@ -548,228 +718,273 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr "..."
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "衝突のせいでパーサ内の規則が使用できません"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr "自動的に修正できます。'--update' を付けて再度実行してください。"
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "%%define 変数 %s が再定義されました"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "前の定義"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: 未定義の %%define 変数 %s"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "%%define 変数 '%s' は '{...}' を値として必要としています"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "%%define 変数 '%s' はキーワードを値として必要としています"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "%%define 変数 '%s' は '\"...\"' を値として必要としています"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "%%define Boolean variable %s としては不正な値"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "%%define 変数 %s の値として不適切です: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "受け入れられた値: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr "文字列"
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr "翻訳可能な文字列"
+
+#: src/parse-gram.y:214
+msgid "[identifier]"
+msgstr "[識別子]"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr "文字リテラル"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr "エピローグ"
+
+#: src/parse-gram.y:219
+msgid "identifier"
+msgstr "識別子"
+
+#: src/parse-gram.y:220
+msgid "identifier:"
+msgstr "識別子:"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr "<タグ>"
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr "整数リテラル"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr "文字リテラルは非終端にはなれません"
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr "文字リテラルは %s と一緒に使えません"
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, c-format
 msgid "definition of %s"
 msgstr "%s の定義"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "パラメータの宣言に識別子がありません"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, c-format
 msgid "invalid version requirement: %s"
 msgstr "必要なバージョン指定が無効です: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr "bison %s が必要ですが、%s です。"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "状態 %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr "%s が失敗しました。ステータス: %d"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "シフトして状態 %d へ\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "状態 %d に移行\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "エラー (nonassociative)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "規則 %d を使って還元 (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "受け入れる"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "規則 %d を使って還元 (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "出現位置の規則による終端"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "出現位置の規則による非終端"
 
-#: src/print.c:416
+#: src/print.c:431
 msgid "on left:"
 msgstr "左辺:"
 
-#: src/print.c:425
+#: src/print.c:440
 msgid "on right:"
 msgstr "右辺:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "衝突のせいでパーサ内の規則が使用できません"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "%s が複数個宣言されました"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "結果のタイプがマージ関数 %s と衝突します: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "%s の重複するシンボル名を無視します"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "%s に規則が与えられ、それはトークンとなります"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "デフォルトのアクションではタイプが衝突します: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "空の型付き非終端アイテム用規則であり、動作が起りません"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "使われていない値: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "未設定の値: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "空でない規則に %%empty"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "%%empty なしで空の規則"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "%%prec に対するトークンが定義されていません: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr "midrule アクションにしか型をつけられません: %s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s は GLR パーサにしか影響しません"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s の後は正の数でなければなりません"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr "POSIX Yacc は型つき midrule アクションをサポートしていません"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "規則が長すぎます"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "開始シンボル %s は定義されていません"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "開始シンボル %s はトークンです"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "入力した文法に規則が定義されていません"
@@ -778,257 +993,252 @@
 msgid "rule useless in grammar"
 msgstr "文法中にある規則が無駄です"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "文法中の非終端が無駄です: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "文法中の非終端が無駄です"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "文法中の終端が無駄です"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "文法中の規則が無駄です"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "文法中に %d 個の無駄な非終端があります"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "文法中に %d 個の無駄な終端があります"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "開始シンボル %s はどの文にも由来しません"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "はぐれた '%s'"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "参照しています: %c%s at %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "もしかして以下を意味していますか: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", %c を隠しています"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " at %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", %d にある midrule アクションからアクセスできません"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "整数が値の範囲外です: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "無効な参照: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 "'%c' の後に文法エラーがあります。整数、文字、'_', '[','$' が来るはずです。"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "$%d の前の出力にシンボルがありません: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "結果にシンボルが見つかりません: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "紛らわしい参照: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "曖昧な参照: \"%s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "型なしの文法に明示的に型が与えられています"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ に対する $%d midrule %s が宣言された型を持っていません"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "%s の $$ に宣言のない型があります"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s の %s に宣言のない型があります"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr "api.value.automove が有効で $%d が複数回でてきます"
 
-#: src/scan-gram.l:198
-#, c-format
-msgid "stray ',' treated as white space"
-msgstr "はぐれた ',' は空白として扱われました"
-
-#: src/scan-gram.l:292
-#, c-format
-msgid "invalid directive: %s"
-msgstr "無効な指示: %s"
-
-#: src/scan-gram.l:313
-#, c-format
-msgid "invalid identifier: %s"
-msgstr "無効な識別子: %s"
-
-#: src/scan-gram.l:365
-msgid "invalid character"
-msgid_plural "invalid characters"
-msgstr[0] "無効な文"
-
-#: src/scan-gram.l:383
-#, c-format
-msgid "invalid null character"
-msgstr "無効な null 文字"
-
-#: src/scan-gram.l:437
-#, c-format
-msgid "unexpected identifier in bracketed name: %s"
-msgstr "ブラケットに囲まれた識別子としては期待されていません: %s"
-
-#: src/scan-gram.l:459
-#, c-format
-msgid "an identifier expected"
-msgstr "識別子が期待されています"
-
-#: src/scan-gram.l:464
-msgid "invalid character in bracketed name"
-msgid_plural "invalid characters in bracketed name"
-msgstr[0] "ブラケットに囲まれた名前に不正な文字があります"
-
-#: src/scan-gram.l:535
-#, c-format
-msgid "POSIX Yacc does not support string literals"
-msgstr "POSIX Yacc は文字列リテラルをサポートしていません"
-
-#: src/scan-gram.l:557
-#, c-format
-msgid "empty character literal"
-msgstr "空の文字定数"
-
-#: src/scan-gram.l:563
-#, c-format
-msgid "extra characters in character literal"
-msgstr "キャラクタリテラルに余分な文字があります"
-
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
+#: src/scan-gram.l:93
 #, c-format
 msgid "invalid number after \\-escape: %s"
 msgstr "\\ エスケープの後に不正な数字があります: %s"
 
-#: src/scan-gram.l:652
+#: src/scan-gram.l:214
+#, c-format
+msgid "stray ',' treated as white space"
+msgstr "はぐれた ',' は空白として扱われました"
+
+#: src/scan-gram.l:309
+#, c-format
+msgid "invalid directive: %s"
+msgstr "無効な指示: %s"
+
+#: src/scan-gram.l:331
+#, c-format
+msgid "invalid identifier: %s"
+msgstr "無効な識別子: %s"
+
+#: src/scan-gram.l:385
+msgid "invalid character"
+msgid_plural "invalid characters"
+msgstr[0] "無効な文"
+
+#: src/scan-gram.l:405
+#, c-format
+msgid "invalid null character"
+msgstr "無効な null 文字"
+
+#: src/scan-gram.l:463
+#, c-format
+msgid "unexpected identifier in bracketed name: %s"
+msgstr "ブラケットに囲まれた識別子としては期待されていません: %s"
+
+#: src/scan-gram.l:487
+#, c-format
+msgid "an identifier expected"
+msgstr "識別子が期待されています"
+
+#: src/scan-gram.l:494
+msgid "invalid character in bracketed name"
+msgid_plural "invalid characters in bracketed name"
+msgstr[0] "ブラケットに囲まれた名前に不正な文字があります"
+
+#: src/scan-gram.l:567 src/scan-gram.l:582
+#, c-format
+msgid "POSIX Yacc does not support string literals"
+msgstr "POSIX Yacc は文字列リテラルをサポートしていません"
+
+#: src/scan-gram.l:605
+#, c-format
+msgid "empty character literal"
+msgstr "空の文字定数"
+
+#: src/scan-gram.l:611
+#, c-format
+msgid "extra characters in character literal"
+msgstr "キャラクタリテラルに余分な文字があります"
+
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "\\ エスケープの後に不正な文字があります: %s\""
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr "POSIX Yacc は16進数リテラルをサポートしていません"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "ファイル末尾に %s がありません"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "行末に %s がありません"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "スケルトンの %s ディレクティブがクローズされていません"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "スケルトンの %s ディレクティブの引数が少なすぎます"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "スケルトンの %s ディレクティブの引数が多すぎます"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc ではシンボル名にダッシュは使えません: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "入力している文法のシンボルが多すぎます(最大 %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "%s は %s の再宣言です"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s は <%s> の再宣言です"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "シンボル %s がトークンとして再宣言されました"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "シンボル %s が非終端として再宣言されました"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1037,104 +1247,94 @@
 "シンボル %s が使われていますが、トークンとして定義されておらず、規則を持ちま"
 "せん。%s と間違えましたか?"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "シンボル %s が使われていますが、トークンとして定義されておらず、規則を持ちま"
 "せん"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr "POSIX yacc は %%type を非終端として予約しています"
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "シンボル %s が再宣言されました"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
-msgstr "非終端に明示的な数字を与えられません"
+msgid "nonterminals cannot be given a token code"
+msgstr "非終端にトークンコードは与えられません"
 
-#: src/symtab.c:575
+#: src/symtab.c:594
 #, c-format
-msgid "redefining user token number of %s"
-msgstr "%s のユーザトークンナンバーの再定義です"
+msgid "redefining code of token %s"
+msgstr "トークン %s のコードの再定義です"
 
-#: src/symtab.c:578
+#: src/symtab.c:597
 #, c-format
-msgid "user token number of %s too large"
-msgstr "%s のユーザトークンナンバーが大きすぎます"
+msgid "code of token %s too large"
+msgstr "トークン %s のコードが大きすぎます"
 
-#: src/symtab.c:617
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr "文字列リテラル %s にシンボルが割り当てられていません"
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "%s は型 <%s>無用です"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "タイプ %s が使われていますが、シンボルと対応づけられていません"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr "非終端に文字列エイリアスは与えられません"
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "シンボル %s はリテラル文字列として複数回使われました"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "シンボル %s に複数のリテラル文字列が与えられました"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "ユーザトークンナンバー %d が %s に対して再定義されました"
+msgid "code %d reassigned to token %s"
+msgstr "コード %d がトークン %s に再割り当てされました"
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "%s に対する以前の宣言"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr "トークン数が大きすぎます"
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "開始シンボル %s は定義されていません"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "開始シンボル %s はトークンです"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "%s に無用な precedence and associativity"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "%s に無用な precedence"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "%s に無用な associativity、%%precedence を使ってください"
diff --git a/po/ms.gmo b/po/ms.gmo
index dc89e86..3bf0646 100644
--- a/po/ms.gmo
+++ b/po/ms.gmo
Binary files differ
diff --git a/po/ms.po b/po/ms.po
index a96d068..27b4839 100644
--- a/po/ms.po
+++ b/po/ms.po
@@ -1,14 +1,14 @@
 # bison Bahasa Melayu (Malay) (ms).
-# Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2015, 2016, 2017, 2018, 2019 Free Software Foundation, Inc.
+# Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Free Software Foundation, Inc.
 # This file is distributed under the same license as the bison package.
-# Sharuzzaman Ahmat Raslan <sharuzzaman@gmail.com>, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2015, 2016, 2017, 2018, 2019.
+# Sharuzzaman Ahmat Raslan <sharuzzaman@gmail.com>, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2015, 2016, 2017, 2018, 2019, 2020, 2021.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: bison 3.3.90\n"
+"Project-Id-Version: bison 3.7.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-10-14 18:56+0800\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2021-09-11 20:23+0800\n"
 "Last-Translator: Sharuzzaman Ahmat Raslan <sharuzzaman@gmail.com>\n"
 "Language-Team: Malay <translation-team-ms@lists.sourceforge.net>\n"
 "Language: ms\n"
@@ -17,203 +17,427 @@
 "Content-Transfer-Encoding: 8bit\n"
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Poedit 2.2.4\n"
+"X-Generator: Poedit 3.0\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr "nombor"
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr "fungsi"
+
+#: examples/c/bistromathic/parse.y:155
+#, fuzzy
+msgid "variable"
+msgstr "%s: pembolehubah %s %%define tidak ditakrifkan"
+
+#: examples/c/bistromathic/parse.y:194
+#, fuzzy
+msgid "error: division by zero"
+msgstr "dibahagi dengan sifar"
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr ""
+"ralat sintaks selepas '%c', menjangkakan nombor, huruf, '_', '[', atau '$'"
+
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "ralat sintaks"
+
+#: examples/c/bistromathic/parse.y:390
+#, fuzzy
+msgid "%@: syntax error: unexpected %u"
+msgstr "ralat sintaks, tidak menjangka %s"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "Potong dari kursor hingga ke akhir baris"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+#, fuzzy
+msgid "generate conflict counterexamples"
+msgstr ""
+"Janakan penghurai LALR(1) dan GLR.\n"
+"\n"
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
+#, fuzzy
 msgid "obsolete constructs"
-msgstr ""
+msgstr "kemasukan `%s' usang.  Diabaikan"
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, fuzzy, c-format
 msgid "empty rules without %empty"
-msgstr "hukum kosong untuk bukan terminal ditaip, dan tiada tindakan"
+msgstr "hukum kosong tanpa %%empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
+#, fuzzy
 msgid "unset or unused midrule values"
 msgstr ""
+"Kategori amaran termasuk:\n"
+"  `midrule-values'  nilai hukumtengah nyahtetap atau tidak digunakan\n"
+"  `yacc'            tidak serasi dengan POSIX YACC\n"
+"  `all'             semua amaran\n"
+"  `no-CATEGORY'     matikan amaran dalam CATEGORY\n"
+"  `none'            matikan semua amaran\n"
+"  `error'           jadikan amaran sebagai ralat\n"
+"\n"
 
-#: src/complain.c:120
+#: src/complain.c:160
 #, fuzzy
 msgid "useless precedence and associativity"
 msgstr "keutamaan dan pengumpulan tidak berguna untuk %s"
 
-#: src/complain.c:121
+#: src/complain.c:161
+#, fuzzy
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
+"Kategori amaran termasuk:\n"
+"  `midrule-values'  nilai hukumtengah nyahtetap atau tidak digunakan\n"
+"  `yacc'            tidak serasi dengan POSIX YACC\n"
+"  `all'             semua amaran\n"
+"  `no-CATEGORY'     matikan amaran dalam CATEGORY\n"
+"  `none'            matikan semua amaran\n"
+"  `error'           jadikan amaran sebagai ralat\n"
+"\n"
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
+#, fuzzy
 msgid "turn off warnings in CATEGORY"
 msgstr ""
+"Kategori amaran termasuk:\n"
+"  `midrule-values'  nilai hukumtengah nyahtetap atau tidak digunakan\n"
+"  `yacc'            tidak serasi dengan POSIX YACC\n"
+"  `all'             semua amaran\n"
+"  `no-CATEGORY'     matikan amaran dalam CATEGORY\n"
+"  `none'            matikan semua amaran\n"
+"  `error'           jadikan amaran sebagai ralat\n"
+"\n"
 
-#: src/complain.c:125
+#: src/complain.c:165
+#, fuzzy
 msgid "turn off all the warnings"
 msgstr ""
+"Kategori amaran termasuk:\n"
+"  `midrule-values'  nilai hukumtengah nyahtetap atau tidak digunakan\n"
+"  `yacc'            tidak serasi dengan POSIX YACC\n"
+"  `all'             semua amaran\n"
+"  `no-CATEGORY'     matikan amaran dalam CATEGORY\n"
+"  `none'            matikan semua amaran\n"
+"  `error'           jadikan amaran sebagai ralat\n"
+"\n"
 
-#: src/complain.c:126
+#: src/complain.c:166
+#, fuzzy
 msgid "treat warnings as errors"
 msgstr ""
+"Kategori amaran termasuk:\n"
+"  `midrule-values'  nilai hukumtengah nyahtetap atau tidak digunakan\n"
+"  `yacc'            tidak serasi dengan POSIX YACC\n"
+"  `all'             semua amaran\n"
+"  `no-CATEGORY'     matikan amaran dalam CATEGORY\n"
+"  `none'            matikan semua amaran\n"
+"  `error'           jadikan amaran sebagai ralat\n"
+"\n"
 
-#: src/complain.c:151
+#: src/complain.c:192
+#, fuzzy
 msgid "Warning categories include:"
 msgstr ""
+"Kategori amaran termasuk:\n"
+"  `midrule-values'  nilai hukumtengah nyahtetap atau tidak digunakan\n"
+"  `yacc'            tidak serasi dengan POSIX YACC\n"
+"  `all'             semua amaran\n"
+"  `no-CATEGORY'     matikan amaran dalam CATEGORY\n"
+"  `none'            matikan semua amaran\n"
+"  `error'           jadikan amaran sebagai ralat\n"
+"\n"
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "amaran"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "ralat"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "ralat maut"
 
-#: src/complain.c:547
+#: src/complain.c:501
+#, fuzzy
+msgid "note"
+msgstr ""
+"  -S, --string[=STRING]   ambil perhatian terhadap STRING pengguna lain\n"
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr "POSIX Yacc tidak menyokong %s"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, fuzzy, c-format
 msgid "deprecated directive: %s, use %s"
-msgstr "arahan tidak sah: %s"
+msgstr "pilihan telah luput: %s, guna %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, fuzzy, c-format
 msgid "duplicate directive"
-msgstr "Salinan @E dijumpai."
+msgstr "Salinan @E dijumpai.  "
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, fuzzy, c-format
 msgid "duplicate directive: %s"
 msgstr "arahan tidak sah: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "pengisytiharan terdahulu"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "hanya satu %s dibenarkan setiap hukum"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+msgid "syntax error"
+msgstr "ralat sintaks"
+
+#: src/complain.c:648
+#, fuzzy
+msgid "unexpected %0$s"
+msgstr "%s: %s: akhir fail tidak dijangka\n"
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr ""
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr ""
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr ""
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr ""
+
+#: src/conflicts.c:88
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "    Konflik antara hukum %d dan token %s diselesaikan sebagai pindahan"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr ""
 "    Konflik antara hukum %d dan token %s diselesaikan sebagai pengurangan"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "    Konflik antara hukum %d dan token %s diselesaikan sebagai ralat"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Keadaan %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "konflik: %d pemindahan/pengurangan, %d pengurangan/pengurangan\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "konflik: %d pemindahan/pengurangan\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "konflik: %d pengurangan/pengurangan\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, fuzzy, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "konflik: %d pemindahan/pengurangan, %d pengurangan/pengurangan"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, fuzzy, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "konflik: %d pemindahan/pengurangan, %d pengurangan/pengurangan"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr hanya berkesan kepada parser GLR"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "konflik: %d pemindahan/pengurangan, %d pengurangan/pengurangan"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, fuzzy, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "jangkaan %d konflik pemindahan/pengurangan"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "konflik pengurangan/pengurangan: %d dijumpai, %d diharapkan"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, fuzzy, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "dijangkakan %d pengurangan/pengurangan konflik"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+#, fuzzy
+msgid "Example"
+msgstr "Contoh hello world"
+
+#: src/counterexample.c:122
+#, fuzzy
+msgid "First example"
+msgstr "Contoh hello"
+
+#: src/counterexample.c:124
+#, fuzzy
+msgid "Second example"
+msgstr "setuid(%lu) kedua gagal"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "pindah, dan pergi ke keadaan %d\n"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "dijangkakan %d pengurangan/pengurangan konflik"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "konflik: %d pengurangan/pengurangan\n"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "setuid(%lu) kedua gagal"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "jangkaan %d konflik pemindahan/pengurangan"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ":"
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "dijangkakan %d pengurangan/pengurangan konflik"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: tidak dapat dibuka"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "ralat masukan/keluaran"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "tidak dapat menutup fail"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "enggan untuk menulisganti fail masukan %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "keluaran berkonflik kepada fail %s"
@@ -221,122 +445,125 @@
 #: src/fixits.c:122
 #, fuzzy, c-format
 msgid "%s: cannot backup"
-msgstr "tak dapat backup %s"
+msgstr "tak dapat nyahbackup %s"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
-msgstr ""
+msgstr "warnakan keluaran"
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
-msgstr ""
+msgstr "jangan warnakan keluaran"
 
-#: src/getargs.c:175
+#: src/getargs.c:188
+#, fuzzy
 msgid "colorize if the output device is a tty"
-msgstr ""
+msgstr "jangan warnakan keluaran"
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
-msgstr ""
+msgstr "nyatakan keadaan"
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
-msgstr ""
+msgstr "lengkapkan kumpulan perkara asas dengan penutupnya"
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
-msgstr ""
+msgstr "dengan jelas kaitkan token lookahead kepada perkara"
 
-#: src/getargs.c:212
-#, fuzzy
+#: src/getargs.c:225
 msgid "describe shift/reduce conflicts solving"
-msgstr "jangkaan %d konflik pemindahan/pengurangan"
+msgstr ""
+"PERKARA adalah senarai perkataan dipisah koma yang boleh termasuk:\n"
+"  `state'        nyatakan keadaan\n"
+"  `itemset'      lengkapkan perkara asas dengan penutupnya\n"
+"  `lookahead'    dengan jelas kaitkan lookahead kepada perkara\n"
+"  `solved'       nyatakan penyelesaian konflik pemindahan/pengurangan\n"
+"  `all'          masukkan semua maklumat diatas\n"
+"  `none'         matikan laporan"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
-msgstr ""
+msgstr "masukkan semua maklumat diatas"
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
-msgstr ""
+msgstr "matikan laporan"
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
-msgstr ""
+msgstr "PERKARA adalah senarai perkataan dipisah koma yang boleh termasuk:"
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
-msgstr ""
+msgstr "KESAN adalah senarai perkataan dipisah koma yang boleh termasuk:"
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
-msgstr ""
+msgstr "papar kesilapan dengan carets"
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
-msgstr ""
+msgstr "papar pembetulan boleh dibaca mesin"
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
-msgstr ""
+msgstr "jangan jana sebarang fail"
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
-msgstr ""
+msgstr "semua di atas"
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
-msgstr ""
+msgstr "lumpuhkan semua di atas"
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
-msgstr ""
+msgstr "CIRI-CIRI adalah senarai perkataan dipisah koma yang boleh termasuk:"
 
-#: src/getargs.c:346
-#, fuzzy, c-format
+#: src/getargs.c:367
+#, c-format
 msgid "Try '%s --help' for more information.\n"
-msgstr "Cuba `%s --help' untuk lebih maklumat.\n"
+msgstr "Cuba '%s --help' untuk lebih maklumat.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Penggunaan: %s [PILIHAN]... FAIL\n"
 
-#: src/getargs.c:356
-#, fuzzy
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
 "\n"
 msgstr ""
 "Menjana penghurai LR berketentuan atau LR umum (GLR) menggunakan\n"
-"LALR(1), IELR(1), atau jadual penguhurai LR(1) berstruktur. Sokongan IELR(1) "
-"dan\n"
-"LR(1) berstruktur adalah eksperimen.\n"
+"LALR(1), IELR(1), atau jadual penguhurai LR(1) berstruktur.\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Hujah wajib kepada pilihan panjang adalah wajib untuk pilihan pendek juga.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Perkara yang sama bagi hujah pilihan.\n"
 
-#: src/getargs.c:370
-#, fuzzy
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -351,19 +578,22 @@
 "  -f, --feature[=FEATURES]   activate miscellaneous features\n"
 "\n"
 msgstr ""
-"\n"
-"Mod operasi:\n"
+"Mod Operasi:\n"
 "  -h, --help                 papar bantuan ini dan keluar\n"
 "  -V, --version              keluarkan maklumat versi dan keluar\n"
 "      --print-localedir      keluarkan direktori mengandungi data bergantung "
 "locale\n"
+"                             dan keluar\n"
 "      --print-datadir        keluarkan direktori mengandungi rangka dan "
 "XSLT\n"
-"  -y, --yacc                 tiru POSIX yacc\n"
-"  -W, --warnings=[KATEGORI]  lapor amaran yang berada dalam KATEGORI\n"
+"                             dan keluar\n"
+"  -u, --update               terap pembaikan ke fail tatabahasa sumber dan "
+"keluar\n"
+"  -f, --feature[=FEATURES]   aktifkan ciri-ciri lain\n"
+"\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -372,8 +602,8 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:400
-#, fuzzy, c-format
+#: src/getargs.c:421
+#, c-format
 msgid ""
 "Tuning the Parser:\n"
 "  -L, --language=LANGUAGE          specify the output programming language\n"
@@ -389,94 +619,93 @@
 "  -k, --token-table                include a table of token names\n"
 "  -y, --yacc                       emulate POSIX Yacc\n"
 msgstr ""
-"Penghurai:\n"
-"  -L, --language=BAHASA      nyatakan bahasa pengaturcaraan keluaran\n"
-"                             (ini adalah ciri ujikaji)\n"
-"  -S, --skeleton=FAIL        nyatakan rangka untuk digunakan\n"
-"  -t, --debug                peralatan parser untuk nyahpepijat\n"
-"      --locations            hidupkan pengiraan lokasi\n"
-"  -p, --name-prefix=AWALAN   tambah AWALAN kepada simbol luaran\n"
-"  -l, --no-lines             jangan jana arahan `#line'\n"
-"  -k, --token-table          sertakan jadual nama token\n"
-"\n"
+"Penalaan Penghurai:\n"
+"  -L, --language=BAHASA            nyatakan bahasa pengaturcaraan keluaran\n"
+"  -S, --skeleton=FAIL              nyatakan rangka untuk digunakan\n"
+"  -t, --debug                      sediakan parser untuk pengesanan\n"
+"                                   sama seperti '-Dparse.trace'\n"
+"      --locations                  hidupkan sokongan lokasi\n"
+"  -D, --define=NAME[=VALUE]        serupa dengan '%define NAME VALUE'\n"
+"  -F, --force-define=NAME[=VALUE]  atasi '%define NAME VALUE'\n"
+"  -p, --name-prefix=AWALAN         tambah AWALAN kepada simbol luaran\n"
+"                                   diusangkan oleh '-Dapi.prefix={PREFIX}'\n"
+"  -l, --no-lines                   jangan jana arahan '#line'\n"
+"  -k, --token-table                sertakan jadual nama token\n"
+"  -y, --yacc                       contohi POSIX Yacc\n"
 
-#: src/getargs.c:419
-#, fuzzy
+#: src/getargs.c:438
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
-"Keluaran:\n"
-"      --defines[=FAIL]       juga hasilkan fail pengepala\n"
-"  -d,                        sama juga tetapi tidak boleh menyatakan FAIL "
+"Fail Keluaran:\n"
+"  -H, --header=[FAIL]           juga hasilkan fail pengepala\n"
+"  -d                            sama juga tetapi tidak boleh menyatakan FAIL "
 "(untuk Yacc POSIX)\n"
-"  -r, --report=PERKARA       juga hasilkan butir terperinci bagi automaton\n"
-"      --report-file=FAIL     tulis laporan ke FAIL\n"
-"  -v, --verbose              sama seperti `--report=state'\n"
-"  -b, --file-prefix=AWALAN   nyatakan AWALAN untuk fail keluaran\n"
-"  -o, --output=FAIL          biarkan keluaran kepada FAIL\n"
-"  -g, --graph                juga hasilkan graf bagi automaton\n"
-"  -x, --xml[=FAIL]           juga hasilkan laporan XML bagi automaton\n"
-"                             (skema XML adalah masih tahap kajian)\n"
-"\n"
+"  -r, --report=PERKARA          juga hasilkan butir terperinci bagi "
+"automaton\n"
+"      --report-file=FAIL        tulis laporan ke FAIL\n"
+"  -v, --verbose                 sama seperti '--report=state'\n"
+"  -b, --file-prefix=AWALAN      nyatakan AWALAN untuk fail keluaran\n"
+"  -o, --output=FAIL             biarkan keluaran kepada FAIL\n"
+"  -g, --graph[=FAIL]            juga hasilkan graf bagi automaton\n"
+"      --html[=FAIL]             juga hasilkan laporan HTML bagi automaton\n"
+"  -x, --xml[=FAIL]              juga hasilkan laporan XML bagi automaton\n"
+"  -M, --file-prefix-map=OLD=NEW ganti prefiks OLD dengan NEW apabila menulis "
+"lokasi fail\n"
+"                                dalam fail keluaran\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Laporkan pepijat kepada <%s>.\n"
 
-#: src/getargs.c:437
-#, fuzzy, c-format
+#: src/getargs.c:459
+#, c-format
 msgid "%s home page: <%s>.\n"
-msgstr ""
-"// Dijana oleh %s.\n"
-"// Lapor pepijat ke <%s>.\n"
-"// Laman utama: <%s>.\n"
-"\n"
+msgstr "%s laman utama: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
-"Bantuan umum menggunakan perisian GNU: <http://www.gnu.org/gethelp/>.\n"
+"Bantuan umum menggunakan perisian GNU: <https://www.gnu.org/gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
-"Lapor pepijat terjemahan kepada <http://translationproject.org/team/>.\n"
+"Lapor pepijat terjemahan kepada <https://translationproject.org/team/>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "Untuk dokumentasi lengkap, laksanakan: info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Ditulis oleh Robert Corbett dan Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Hakcipta (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -485,36 +714,41 @@
 "jaminan disediakan; tidak juga untuk KEBOLEHDAGANGAN atau KEUPAYAAN UNTUK "
 "SESUATU TUJUAN KHUSUS.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "pelbagai rangka pengisytiharan tidak sah"
 
-#: src/getargs.c:520
-#, fuzzy, c-format
+#: src/getargs.c:541
+#, c-format
 msgid "%s: invalid language"
-msgstr "bahasa `%s' tidak sah"
+msgstr "%s: bahasa tidak sah"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "pelbagai pengisytiharan bahasa adalah tidak sah"
 
-#: src/getargs.c:816
-#, fuzzy, c-format
+#: src/getargs.c:760
+#, c-format
+msgid "invalid argument for %s: %s"
+msgstr "hujah tidak sah untuk %s: %s"
+
+#: src/getargs.c:868
+#, c-format
 msgid "deprecated option: %s, use %s"
-msgstr "arahan tidak sah: %s"
+msgstr "pilihan telah luput: %s, guna %s"
 
-#: src/getargs.c:850
-#, fuzzy, c-format
+#: src/getargs.c:902
+#, c-format
 msgid "missing operand"
-msgstr "operan hilang selepas `%s'"
+msgstr "operan hilang"
 
-#: src/getargs.c:852
-#, fuzzy, c-format
+#: src/getargs.c:904
+#, c-format
 msgid "extra operand %s"
-msgstr "operan tambahan `%s'"
+msgstr "operan tambahan %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Tatabahasa"
 
@@ -531,248 +765,301 @@
 "// Laman utama: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+msgid "end of file"
+msgstr "tamat fail"
+
+#: src/i18n-strings.c:36
+msgid "invalid token"
+msgstr "token tidak sah"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "nombor baris melimpah"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "nombor lajur melimpah"
 
-#: src/location.c:155
-#, fuzzy, c-format
+#: src/location.c:143
+#, c-format
 msgid "byte number overflow"
-msgstr "nombor baris melimpah"
+msgstr "nombor byte melimpah"
 
 #. TRANSLATORS: This is used when a line is too long, and is
 #. displayed truncated.  Use an ellipsis appropriate for your
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
-msgstr ""
+msgstr "..."
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "hukum tidak digunakan kerana konflik"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr "pembetulan boleh diterapkan. Ulang laksana dengan pilihan '--update'."
 
-#: src/muscle-tab.c:532
-#, fuzzy, c-format
+#: src/muscle-tab.c:528
+#, c-format
 msgid "%%define variable %s redefined"
-msgstr "nilai tidak sah untuk %%define pembolehubah Boolean `%s'"
+msgstr "pembolehubah %%define %s ditakrif semula"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, fuzzy, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
-msgstr "Takrifan sintaks untuk digunakan"
+msgstr "definisi terdahulu"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
-#, fuzzy, c-format
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
+#, c-format
 msgid "%s: undefined %%define variable %s"
-msgstr "simbol permulaan %s tidak ditakrifkan"
+msgstr "%s: pembolehubah %s %%define tidak ditakrifkan"
+
+#: src/muscle-tab.c:624
+#, c-format
+msgid "%%define variable '%s' requires '{...}' values"
+msgstr "pembolehubah '%s' %%define memerlukan nilai '{…}'"
 
 #: src/muscle-tab.c:629
-#, fuzzy, c-format
-msgid "%%define variable '%s' requires '{...}' values"
-msgstr "nilai tidak sah untuk %%define pembolehubah Boolean `%s'"
+#, c-format
+msgid "%%define variable '%s' requires keyword values"
+msgstr "pembolehubah '%s' %%define memerlukan nilai kata kunci"
 
 #: src/muscle-tab.c:634
-#, fuzzy, c-format
-msgid "%%define variable '%s' requires keyword values"
-msgstr "nilai tidak sah untuk %%define pembolehubah Boolean `%s'"
-
-#: src/muscle-tab.c:639
-#, fuzzy, c-format
+#, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
-msgstr "nilai tidak sah untuk %%define pembolehubah Boolean `%s'"
+msgstr "pembolehubah '%s' %%define memerlukan nilai '\"...\"'"
 
-#: src/muscle-tab.c:690
-#, fuzzy, c-format
+#: src/muscle-tab.c:685
+#, c-format
 msgid "invalid value for %%define Boolean variable %s"
-msgstr "nilai tidak sah untuk %%define pembolehubah Boolean `%s'"
+msgstr "nilai tidak sah untuk %%define pembolehubah Boolean %s"
 
-#: src/muscle-tab.c:744
-#, fuzzy, c-format
+#: src/muscle-tab.c:738
+#, c-format
 msgid "invalid value for %%define variable %s: %s"
-msgstr "nilai tidak sah untuk %%define pembolehubah Boolean `%s'"
+msgstr "nilai tidak sah untuk %%define pembolehubah %s: %s"
 
-#: src/muscle-tab.c:749
-#, fuzzy, c-format
+#: src/muscle-tab.c:742
+#, c-format
 msgid "accepted value: %s"
-msgstr "nilai --bytes `%s' tidak sah"
+msgstr "nilai diterima: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr "rentetan"
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr "rentetan boleh diterjemah"
+
+#: src/parse-gram.y:214
+msgid "[identifier]"
+msgstr "[pengecam]"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr "rentetan aksara"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+msgid "identifier"
+msgstr "pengecam"
+
+#: src/parse-gram.y:220
+msgid "identifier:"
+msgstr "pengecam:"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr "<tag>"
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr "literal integer"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr "aksara literal tidak boleh bukan-penamat"
 
-#: src/parse-gram.y:753
-#, fuzzy, c-format
+#: src/parse-gram.y:786
+#, c-format
 msgid "character literals cannot be used together with %s"
-msgstr "aksara literal tidak boleh bukan-penamat"
+msgstr "aksara literal tidak boleh digunakan bersama-sama dengan %s"
 
-#: src/parse-gram.y:758
-#, fuzzy, c-format
+#: src/parse-gram.y:789
+#, c-format
 msgid "definition of %s"
-msgstr "mentakrif semula nombor token pengguna %s"
+msgstr "definisi bagi %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "pengecam hilang dalam parameter pengisytiharan"
 
-#: src/parse-gram.y:1018
-#, fuzzy, c-format
+#: src/parse-gram.y:1062
+#, c-format
 msgid "invalid version requirement: %s"
-msgstr "nombor versi tidak sah `%s'"
+msgstr "keperluan versi tidak sah: %s"
 
-#: src/parse-gram.y:1032
-#, fuzzy, c-format
+#: src/parse-gram.y:1073
+#, c-format
 msgid "require bison %s, but have %s"
-msgstr "bison (GNU Bison) %s"
+msgstr "memerlukan bison %s, tetapi mempunyai %s"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Keadaan %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr "%s gagal dengan status %d"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "pindah, dan pergi ke keadaan %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "pergi ke keadaan %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "ralat (tidak bergabung)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "kurang menggunakan hukum %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "terima"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "kurang menggunakan hukum %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Terminal, dengan hukum dimana mereka kelihatan"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Tidak terminal, dengan hukum dimana mereka kelihatan"
 
-#: src/print.c:416
+#: src/print.c:431
 msgid "on left:"
 msgstr "pada kiri:"
 
-#: src/print.c:425
+#: src/print.c:440
 msgid "on right:"
 msgstr "pada kanan:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Hukum tidak digunakan dalam penghurai kerana konflik"
 
-#: src/reader.c:60
+#: src/reader.c:151
 #, c-format
-msgid "multiple %s declarations"
-msgstr "pelbagai pengisytiharan %s"
-
-#: src/reader.c:129
-#, fuzzy, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "jenis hasil bertelingkah pada fungsi gabung %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "nama simbol berulang bagi %s diabaikan"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "hukum diberi untuk %s, dimana ia adalah token"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "pertelingkahan jenis pada tindakan default: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "hukum kosong untuk bukan terminal ditaip, dan tiada tindakan"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "nilai tidak digunakan: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "nyahtetap nilai: $$"
 
-#: src/reader.c:346
-#, fuzzy, c-format
+#: src/reader.c:401
+#, c-format
 msgid "%%empty on non-empty rule"
-msgstr "hukum kosong untuk bukan terminal ditaip, dan tiada tindakan"
+msgstr "%%empty pada hukum bukan kosong"
 
-#: src/reader.c:356
-#, fuzzy, c-format
+#: src/reader.c:411
+#, c-format
 msgid "empty rule without %%empty"
-msgstr "hukum kosong untuk bukan terminal ditaip, dan tiada tindakan"
+msgstr "hukum kosong tanpa %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "tanda untuk %%prec tidak ditakrifkan: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr "hanya tindakan aturan-tengah boleh dijeniskan: %s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s hanya berkesan kepada parser GLR"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s mesti diikuti dengan nombor positif"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr "POSIX Yacc tidak menyokong jenis tindakan aturan-tengah"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "peraturan terlalu panjang"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "simbol permulaan %s tidak ditakrifkan"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "simbol permulaan %s adalah token"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "tiada hukum dalam masukan tatabahasa"
@@ -781,463 +1068,350 @@
 msgid "rule useless in grammar"
 msgstr "hukum tidak digunakan tatabahasa"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "bukan terminal tidak berguna dalam tatabahasa: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Bukan terminal tidak digunakan dalam tatabahasa"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Terminal tidak digunakan dalam tatabahasa"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Hukum tidak berguna dalam tatabahasa"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d bukan terminal tidak digunakan dalam tatabahasa"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d hukum tidak digunakan dalam tatabahasa"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "simbol permulaan %s tidak menghasilkan sebarang perkataan"
 
-#: src/scan-code.l:158
-#, fuzzy, c-format
+#: src/scan-code.l:160
+#, c-format
 msgid "stray '%s'"
-msgstr "`$' lilau"
+msgstr "'%s' sesat"
 
-#: src/scan-code.l:330
-#, fuzzy, c-format
+#: src/scan-code.l:332
+#, c-format
 msgid "refers to: %c%s at %s"
-msgstr "%s: opsyen tidak dibenarkan -- %c\n"
+msgstr "merujuk kepada: %c%s pada %s"
 
-#: src/scan-code.l:354
-#, fuzzy, c-format
+#: src/scan-code.l:356
+#, c-format
 msgid "possibly meant: %c"
-msgstr "Mungkin bukan khidmat proksi SOCKS."
+msgstr "mungkin bermaksud: %c"
 
-#: src/scan-code.l:363
-#, fuzzy, c-format
+#: src/scan-code.l:365
+#, c-format
 msgid ", hiding %c"
-msgstr "%c%c/panggilan"
+msgstr ", menyembunyikan %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " pada %s"
 
-#: src/scan-code.l:375
-#, fuzzy, c-format
+#: src/scan-code.l:377
+#, c-format
 msgid ", cannot be accessed from midrule action at $%d"
-msgstr ", tidak boleh diakses dari tindakan peraturan pertengahan di $%d"
+msgstr ", tidak boleh dicapai dari tindakan peraturan pertengahan pada $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "integer diluar julat: %s"
 
-#: src/scan-code.l:498
-#, fuzzy, c-format
+#: src/scan-code.l:505
+#, c-format
 msgid "invalid reference: %s"
-msgstr "Rujukan belakang tidak sah"
+msgstr "rujukan tidak sah: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 "ralat sintaks selepas '%c', menjangkakan nombor, huruf, '_', '[', atau '$'"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "simbol tidak dijumpai di dalam pengeluaran sebelum $%d: %.*s"
 
-#: src/scan-code.l:517
-#, fuzzy, c-format
+#: src/scan-code.l:523
+#, c-format
 msgid "symbol not found in production: %.*s"
-msgstr "simbol tidak dijumpai di dalam pengeluaran sebelum $%d: %.*s"
+msgstr "simbol tidak dijumpai di dalam pengeluaran: %.*s"
 
-#: src/scan-code.l:532
-#, fuzzy, c-format
+#: src/scan-code.l:537
+#, c-format
 msgid "misleading reference: %s"
-msgstr "Rujukan belakang tidak sah"
+msgstr "rujukan yang mengelirukan: %s"
 
-#: src/scan-code.l:548
-#, fuzzy, c-format
+#: src/scan-code.l:552
+#, c-format
 msgid "ambiguous reference: %s"
-msgstr "%s: pilihan '%s%s' adalah kabur\n"
+msgstr "rujukan yang tidak jelas: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "Jenis tidak tersirat diberikan dalam tatabahasa tanpa jenis"
 
-#: src/scan-code.l:639
-#, fuzzy, c-format
+#: src/scan-code.l:643
+#, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr ""
-"$$ untuk hukum pertengahan pada $%d bagi `%s' tidak mempunyai jenis "
-"dinyatakan"
+"$$ untuk hukum pertengahan pada $%d bagi %s tidak mempunyai jenis yang "
+"diisytiharkan"
 
-#: src/scan-code.l:645
-#, fuzzy, c-format
+#: src/scan-code.l:649
+#, c-format
 msgid "$$ of %s has no declared type"
-msgstr "$$ dari `%s' tiada jenis diisytiharkan"
+msgstr "$$ dari %s tidak mempunyai jenis yang diisytiharkan"
 
-#: src/scan-code.l:671
-#, fuzzy, c-format
+#: src/scan-code.l:675
+#, c-format
 msgid "$%s of %s has no declared type"
-msgstr "$$ bagi `%s' tiada jenis dinyatakan"
+msgstr "$%s dari %s tidak mempunyai jenis yang diisytiharkan"
 
-#: src/scan-code.l:694
-#, fuzzy, c-format
+#: src/scan-code.l:698
+#, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
-msgstr "%d tempat telah diganti"
+msgstr "pelbagai kewujudan $%d dengan api.value.automove"
 
-#: src/scan-gram.l:198
-#, fuzzy, c-format
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "nombor tidak sah selepas \\-escape: %s"
+
+#: src/scan-gram.l:214
+#, c-format
 msgid "stray ',' treated as white space"
-msgstr "`,' sesat dianggap sebagai ruang"
+msgstr "`,' sesat dianggap sebagai ruang putih"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "arahan tidak sah: %s"
 
-#: src/scan-gram.l:313
-#, fuzzy, c-format
+#: src/scan-gram.l:331
+#, c-format
 msgid "invalid identifier: %s"
-msgstr "pengenalan pembolehubah tidak sah `%s'"
+msgstr "pengenalan tidak sah: %s"
 
-#: src/scan-gram.l:365
-#, fuzzy
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
-msgstr[0] "aksara tidak sah: %s"
+msgstr[0] "aksara tidak sah"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "aksara null tidak sah"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "pengecam yang tidak dijangka dalam nama kurungan: %s"
 
-#: src/scan-gram.l:459
-#, fuzzy, c-format
+#: src/scan-gram.l:487
+#, c-format
 msgid "an identifier expected"
-msgstr "')' dijangka\n"
+msgstr "sebuah pengenalan dijangka"
 
-#: src/scan-gram.l:464
-#, fuzzy
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
-msgstr[0] "pengecam yang tidak dijangka dalam nama kurungan: %s"
+msgstr[0] "aksara tidak sah dalam nama kurungan"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr "POSIX Yacc tidak menyokong rentetan literal"
 
-#: src/scan-gram.l:557
-#, fuzzy, c-format
+#: src/scan-gram.l:605
+#, c-format
 msgid "empty character literal"
-msgstr "aksara tambahan dalam kesalahan ejaan"
+msgstr "rentetan aksara kosong"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "aksara tambahan dalam kesalahan ejaan"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, fuzzy, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "turutan escape tidak sah: %s"
-
-#: src/scan-gram.l:652
-#, fuzzy, c-format
+#: src/scan-gram.l:690
+#, c-format
 msgid "invalid character after \\-escape: %s"
-msgstr "turutan escape tidak sah: %s"
+msgstr "aksara tidak sah selepas \\-escape: %s"
 
-#: src/scan-gram.l:824
-#, fuzzy, c-format
+#: src/scan-gram.l:872
+#, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
-msgstr "POSIX Yacc tidak menyokong rentetan literal"
+msgstr "POSIX Yacc tidak menyokong rentetan hexadecimal"
 
-#: src/scan-gram.l:962
-#, fuzzy, c-format
+#: src/scan-gram.l:1010
+#, c-format
 msgid "missing %s at end of file"
-msgstr "`%s' hilang pada penghujung fail"
+msgstr "%s hilang pada penghujung fail"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "%s hilang pada penghujung baris"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "arahan %s tidak ditutup dalam rangka"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "terlalu sedikit hujah untuk arahan %s dalam rangka"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "terlalu banyak hujah untuk arahan %s dalam rangka"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc tidak membenarkan sengkang dalam nama simbol: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "terlalu banyak simbol dalam tatabahasa masukan (had adalah %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "%s pengisytiharan semula untuk %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s pengisytiharan semula untuk <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "simbol %s ditakrif semula sebagai token"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "simbol %s ditakrif semula sebagai bukan terminal"
 
-#: src/symtab.c:370
-#, fuzzy, c-format
+#: src/symtab.c:388
+#, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
 "mean %s?"
 msgstr ""
-"simbol %s digunakan, tetapi tidak ditakrifkan sebagai token atau mempunyai "
-"hukum"
+"simbol %s digunakan, tetapi tidak ditakrifkan sebagai token dan tidak "
+"mempunyai peraturan; adakah anda maksudkan %s?"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "simbol %s digunakan, tetapi tidak ditakrifkan sebagai token atau mempunyai "
 "hukum"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "simbol %s ditakrif semula"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
+msgid "nonterminals cannot be given a token code"
 msgstr ""
 
-#: src/symtab.c:575
+#: src/symtab.c:594
 #, c-format
-msgid "redefining user token number of %s"
-msgstr "mentakrif semula nombor token pengguna %s"
+msgid "redefining code of token %s"
+msgstr "mentakrif semula kod bagi token %s"
 
-#: src/symtab.c:578
-#, fuzzy, c-format
-msgid "user token number of %s too large"
-msgstr "mentakrif semula nombor token pengguna %s"
+#: src/symtab.c:597
+#, c-format
+msgid "code of token %s too large"
+msgstr "kod bagi token %s terlalu besar"
 
-#: src/symtab.c:617
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "%s tidak berguna untuk jenis <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "jenis <%s> digunakan, tetapi tidak dihubungkan ke sebarang simbol"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr ""
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "simbol %s digunakan lebih dari sekali sebagai rentetan perkataan"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "simbol %s diberikan lebih daripada satu rentetan perkataan"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "nombor token pengguna %d ditakrif semula untuk %s"
+msgid "code %d reassigned to token %s"
+msgstr "kod %d diuntukkan semula ke token %s"
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "pengisytiharan terdahulu untuk %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
-msgstr ""
+msgstr "nombor token terlalu besar"
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "simbol permulaan %s tidak ditakrifkan"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "simbol permulaan %s adalah token"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "keutamaan dan pengumpulan tidak berguna untuk %s"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "keutamaan tidak berguna untuk %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "kebolehkumpulan tidak berguna untuk %s, guna %%precendence"
-
-#, fuzzy
-#~ msgid "eliminate useless chain rules"
-#~ msgstr "bukan terminal tidak berguna dalam tatabahasa: %s"
-
-#, fuzzy
-#~| msgid "invalid directive: %s"
-#~ msgid "deprecated directive, use %s"
-#~ msgstr "arahan tidak sah: %s"
-
-#, fuzzy
-#~| msgid ""
-#~| "Warning categories include:\n"
-#~| "  `midrule-values'  unset or unused midrule values\n"
-#~| "  `yacc'            incompatibilities with POSIX YACC\n"
-#~| "  `all'             all the warnings\n"
-#~| "  `no-CATEGORY'     turn off warnings in CATEGORY\n"
-#~| "  `none'            turn off all the warnings\n"
-#~| "  `error'           treat warnings as errors\n"
-#~| "\n"
-#~ msgid ""
-#~ "Warning categories include:\n"
-#~ "  'conflicts-sr'      S/R conflicts (enabled by default)\n"
-#~ "  'conflicts-rr'      R/R conflicts (enabled by default)\n"
-#~ "  'deprecated'        obsolete constructs\n"
-#~ "  'empty-rule'        empty rules without %empty\n"
-#~ "  'midrule-values'    unset or unused midrule values\n"
-#~ "  'precedence'        useless precedence and associativity\n"
-#~ "  'yacc'              incompatibilities with POSIX Yacc\n"
-#~ "  'other'             all other warnings (enabled by default)\n"
-#~ "  'all'               all the warnings except 'yacc'\n"
-#~ "  'no-CATEGORY'       turn off warnings in CATEGORY\n"
-#~ "  'none'              turn off all the warnings\n"
-#~ "  'error[=CATEGORY]'  treat warnings as errors\n"
-#~ msgstr ""
-#~ "Kategori amaran termasuk:\n"
-#~ "  `midrule-values'  nilai hukumtengah nyahtetap atau tidak digunakan\n"
-#~ "  `yacc'            tidak serasi dengan POSIX YACC\n"
-#~ "  `all'             semua amaran\n"
-#~ "  `no-CATEGORY'     matikan amaran dalam CATEGORY\n"
-#~ "  `none'            matikan semua amaran\n"
-#~ "  `error'           jadikan amaran sebagai ralat\n"
-#~ "\n"
-
-#, fuzzy
-#~| msgid ""
-#~| "THINGS is a list of comma separated words that can include:\n"
-#~| "  `state'        describe the states\n"
-#~| "  `itemset'      complete the core item sets with their closure\n"
-#~| "  `lookahead'    explicitly associate lookahead tokens to items\n"
-#~| "  `solved'       describe shift/reduce conflicts solving\n"
-#~| "  `all'          include all the above information\n"
-#~| "  `none'         disable the report\n"
-#~ msgid ""
-#~ "THINGS is a list of comma separated words that can include:\n"
-#~ "  'state'        describe the states\n"
-#~ "  'itemset'      complete the core item sets with their closure\n"
-#~ "  'lookahead'    explicitly associate lookahead tokens to items\n"
-#~ "  'solved'       describe shift/reduce conflicts solving\n"
-#~ "  'all'          include all the above information\n"
-#~ "  'none'         disable the report\n"
-#~ msgstr ""
-#~ "PERKARA adalah senarai perkataan dipisah koma yang boleh termasuk:\n"
-#~ "  `state'        nyatakan keadaan\n"
-#~ "  `itemset'      lengkapkan set perkara asas dengan penutupnya\n"
-#~ "  `lookahead'    dengan jelas kaitkan token lookahead kepada perkara\n"
-#~ "  `solved'       nyatakan penyelesaian konflik pemindahan/pengurangan\n"
-#~ "  `all'          masukkan semua maklumat diatas\n"
-#~ "  `none'         matikan laporan\n"
-
-#, fuzzy
-#~| msgid ""
-#~| "FEATURE is a list of comma separated words that can include:\n"
-#~| "  'caret'        show errors with carets\n"
-#~| "  'all'          all of the above\n"
-#~| "  'none'         disable all of the above\n"
-#~| "  "
-#~ msgid ""
-#~ "FEATURES is a list of comma separated words that can include:\n"
-#~ "  'caret', 'diagnostics-show-caret'\n"
-#~ "    show errors with carets\n"
-#~ "  'fixit', 'diagnostics-parseable-fixits'\n"
-#~ "    show machine-readable fixes\n"
-#~ "  'syntax-only'\n"
-#~ "    do not generate any file\n"
-#~ "  'all'\n"
-#~ "    all of the above\n"
-#~ "  'none'\n"
-#~ "    disable all of the above\n"
-#~ "  "
-#~ msgstr ""
-#~ "FEATURE adalah senarai perkataan dipisahkan koma yang boleh termasuk:\n"
-#~ "   'caret'       menunjukkan kesilapan dengan carets\n"
-#~ "   'all'         semua di atas\n"
-#~ "   'none'        melumpuhkan semua di atas\n"
-#~ "  "
diff --git a/po/nb.gmo b/po/nb.gmo
index 39c3300..116023b 100644
--- a/po/nb.gmo
+++ b/po/nb.gmo
Binary files differ
diff --git a/po/nb.po b/po/nb.po
index 5d1a554..3edc273 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -22,7 +22,7 @@
 msgstr ""
 "Project-Id-Version: bison 2.0\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2005-03-01 10:06+0100\n"
 "Last-Translator: Trond Endrestøl <Trond.Endrestol@gtf.ol.no>\n"
 "Language-Team: Norwegian Bokmaal <i18n-nb@lister.ping.uio.no>\n"
@@ -33,203 +33,362 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "ugyldig tegn: %s"
+
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "alvorlig feil: "
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr ""
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "mangler «%s» ved slutten av filen"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr ""
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, c-format
 msgid "empty rules without %empty"
 msgstr ""
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr ""
 
-#: src/complain.c:120
+#: src/complain.c:160
 msgid "useless precedence and associativity"
 msgstr ""
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr ""
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr ""
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr ""
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr ""
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "advarsel"
 
-#: src/complain.c:258
+#: src/complain.c:299
 #, fuzzy
 msgid "error"
 msgstr "I/O-feil"
 
-#: src/complain.c:260
+#: src/complain.c:301
 #, fuzzy
 msgid "fatal error"
 msgstr "alvorlig feil: "
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr ""
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, fuzzy, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "ugyldig direktiv: %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, fuzzy, c-format
 msgid "duplicate directive"
 msgstr "ugyldig direktiv: %s"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, fuzzy, c-format
 msgid "duplicate directive: %s"
 msgstr "ugyldig direktiv: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, fuzzy, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
+#, fuzzy
 msgid "previous declaration"
 msgstr "første deklarasjon"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "bare en %s pr regel er tillatt"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+#, fuzzy
+msgid "syntax error"
+msgstr "alvorlig feil: "
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr ""
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr ""
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr ""
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr ""
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr ""
+
+#: src/conflicts.c:88
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "    Konflikt mellom regel %d og token %s ble løst som skift"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr "    Konflikt mellom regel %d og token %s ble løst som reduksjon"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "    Konflikt mellom regel %d og token %s ble løst som en feil"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Tilstand %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "konflikter: %d skift/reduksjon, %d reduksjon/reduksjon\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "konflikter: %d skift/reduksjon\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "konflikter: %d reduksjon/reduksjon\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr gjelder bare for GLR-parsere"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, fuzzy, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "forventet %d skift/reduksjon-konflikt"
 msgstr[1] "forventet %d skift/reduksjon-konflikter"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, fuzzy, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "forventet %d reduksjon/reduksjon-konflikt"
 msgstr[1] "forventet %d reduksjon/reduksjon-konflikter"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "første deklarasjon"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "første deklarasjon"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "første deklarasjon"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "første deklarasjon"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "forventet %d skift/reduksjon-konflikt"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "forventet %d reduksjon/reduksjon-konflikt"
+msgstr[1] "forventet %d reduksjon/reduksjon-konflikter"
+
+#: src/files.c:144
 #, fuzzy, c-format
 msgid "%s: cannot open"
 msgstr "kan ikke åpne filen «%s»"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr ""
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "kan ikke lukke filen"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr ""
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "motstridende output til fila %s"
@@ -239,112 +398,112 @@
 msgid "%s: cannot backup"
 msgstr "kan ikke åpne filen «%s»"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr ""
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr ""
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr ""
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 #, fuzzy
 msgid "describe shift/reduce conflicts solving"
 msgstr "forventet %d skift/reduksjon-konflikt"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr ""
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr ""
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr ""
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr ""
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, fuzzy, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Prøv «%s --help» for mer informasjon.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Bruksmåte: %s [VALG]... FIL\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
 "\n"
 msgstr ""
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr ""
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -360,7 +519,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -369,7 +528,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, fuzzy, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -396,20 +555,24 @@
 "  -n, --no-parser            bare generer tabellene\n"
 "  -k, --token-table          legg ved en tabell med tokennavnene\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Output:\n"
 "  -d, --defines              også lag en headerfil\n"
@@ -419,48 +582,42 @@
 "  -o, --output=FIL           send output til FIL\n"
 "  -g, --graph                også lag en VCG-beskrivelse av automaten\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, fuzzy, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Rapporter feil til <bug-bison@gnu.org>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr ""
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr ""
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Skrevet av Robert Corbett og Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -469,37 +626,42 @@
 "Det er INGEN garanti; ikke en gang for SALGBARHET eller SKIKKETHET\n"
 "FOR ET BESTEMT FORMÅL.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, fuzzy, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "flere deklarasjoner av %s"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, fuzzy, c-format
 msgid "%s: invalid language"
 msgstr "ugyldig $-verdi"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 #, fuzzy
 msgid "multiple language declarations are invalid"
 msgstr "flere deklarasjoner av %s"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, fuzzy, c-format
+msgid "invalid argument for %s: %s"
+msgstr "ugyldig argument %s for %s"
+
+#: src/getargs.c:868
 #, fuzzy, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "ugyldig direktiv: %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, fuzzy, c-format
 msgid "missing operand"
 msgstr "mangler operand etter «%s»"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, fuzzy, c-format
 msgid "extra operand %s"
 msgstr "ekstra operand «%s»"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Grammatikk"
 
@@ -512,17 +674,27 @@
 "\n"
 msgstr ""
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+#, fuzzy
+msgid "end of file"
+msgstr "mangler «%s» ved slutten av filen"
+
+#: src/i18n-strings.c:36
+#, fuzzy
+msgid "invalid token"
+msgstr "ugyldig tegn: %s"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr ""
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr ""
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
 msgstr ""
@@ -532,239 +704,287 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr ""
 
-#: src/main.c:155
+#: src/main.c:172
 #, fuzzy
 msgid "rule useless in parser due to conflicts"
 msgstr "regel ble aldri redusert på grunn av konflikter"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, fuzzy, c-format
 msgid "%%define variable %s redefined"
 msgstr "symbolet %s ble redefinert"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr ""
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr ""
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "symbolet %s ble redefinert"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "symbolet %s ble redefinert"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "symbolet %s ble redefinert"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr ""
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr ""
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, fuzzy, c-format
 msgid "accepted value: %s"
 msgstr "ugyldig verdi: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr ""
+
+#: src/parse-gram.y:214
+#, fuzzy
+msgid "[identifier]"
+msgstr "ugyldig direktiv: %s"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr ""
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+#, fuzzy
+msgid "identifier"
+msgstr "ugyldig direktiv: %s"
+
+#: src/parse-gram.y:220
+#, fuzzy
+msgid "identifier:"
+msgstr "ugyldig direktiv: %s"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr ""
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr ""
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr ""
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, fuzzy, c-format
 msgid "definition of %s"
 msgstr "redefinerer brukertokennummeret til %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "mangler identifikator i parameterdeklarasjonen"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, fuzzy, c-format
 msgid "invalid version requirement: %s"
 msgstr "ugyldig escapesekvens: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr ""
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, fuzzy, c-format
 msgid "State %d"
 msgstr "Tilstand %d "
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, fuzzy, c-format
+msgid "%s failed with status %d"
+msgstr "hjelpeprogrammet «%s» mislyktes (returverdi %d)"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "skift og gå til tilstand %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "gå til tilstand %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "feil (ikke-assosiativ)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "reduksjon ved hjelp av regel %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "aksept"
 
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "reduksjon ved hjelp av regel %d (%s)"
+
 # Det er vel ikke så mye å oversette denne med.
 # [TE, 2004-06-02]
-#: src/print.c:235 src/print.c:309
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Terminaler med regler hvor de opptrer"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Ikke-terminaler med regler hvor de opptrer"
 
-#: src/print.c:416
+#: src/print.c:431
 #, fuzzy
 msgid "on left:"
 msgstr " til venstre:"
 
-#: src/print.c:425
+#: src/print.c:440
 #, fuzzy
 msgid "on right:"
 msgstr " til høyre:"
 
-#: src/print.c:447
+#: src/print.c:462
 #, fuzzy
 msgid "Rules useless in parser due to conflicts"
 msgstr "regel ble aldri redusert på grunn av konflikter"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "flere deklarasjoner av %s"
-
 # Denne oversettelsen er en smule ullen.  Må sjekke kildekoden og prøve
 # et eksempel for å vite hva denne strengen bør oversettes med.  Dersom
 # andre har gode hint, så for all del, syng ut!  [TE, 2004-05-31]
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "kollisjon på resultattype for flettefunksjon %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr ""
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "regel er angitt for %s, som er et token"
 
 # Denne oversettelsen er også en smule ullen.
 # [TE, 2004-05-31]
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "kollisjon på type for standard handling: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "tom regel for typet ikke-terminal og ingen handling"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, fuzzy, c-format
 msgid "unused value: $%d"
 msgstr "ugyldig verdi: %s"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr ""
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr ""
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr ""
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr ""
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr ""
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s påvirker bare GLR-parsere"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s må bli fulgt av et positivt tall"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr ""
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr ""
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "startsymbolet %s er udefinert"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "startsymbolet %s er et token"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "ingen regler i den angitte grammatikken"
@@ -774,265 +994,260 @@
 msgid "rule useless in grammar"
 msgstr "ingen regler i den angitte grammatikken"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr ""
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 #, fuzzy
 msgid "Nonterminals useless in grammar"
 msgstr "Ikke-terminaler med regler hvor de opptrer"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 #, fuzzy
 msgid "Terminals unused in grammar"
 msgstr "ingen regler i den angitte grammatikken"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 #, fuzzy
 msgid "Rules useless in grammar"
 msgstr "ingen regler i den angitte grammatikken"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, fuzzy, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "ingen regler i den angitte grammatikken"
 msgstr[1] "ingen regler i den angitte grammatikken"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "startsymbolet %s avleder ingen setninger"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr ""
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr ""
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr ""
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ""
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr ""
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ""
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "heltall utenfor tallområde: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, fuzzy, c-format
 msgid "invalid reference: %s"
 msgstr "ugyldig direktiv: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr ""
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr ""
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr ""
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, fuzzy, c-format
 msgid "ambiguous reference: %s"
 msgstr "flertydig argument %s for %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr ""
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, fuzzy, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$%d av «%s» har ingen deklarert type"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, fuzzy, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ til «%s» har ingen deklarert type"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, fuzzy, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%d av «%s» har ingen deklarert type"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr ""
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, fuzzy, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "ugyldig null-tegn: %s"
+
+#: src/scan-gram.l:214
 #, fuzzy, c-format
 msgid "stray ',' treated as white space"
 msgstr "overflødig «,» ble behandlet som tomrom"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "ugyldig direktiv: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, fuzzy, c-format
 msgid "invalid identifier: %s"
 msgstr "ugyldig direktiv: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 #, fuzzy
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "ugyldig tegn: %s"
 msgstr[1] "ugyldig tegn: %s"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "ugyldig null-tegn"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr ""
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr ""
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 #, fuzzy
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "ugyldig tegn: %s"
 msgstr[1] "ugyldig tegn: %s"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr ""
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr ""
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr ""
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, fuzzy, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "ugyldig null-tegn: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, fuzzy, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "ugyldig tegn: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr ""
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, fuzzy, c-format
 msgid "missing %s at end of file"
 msgstr "mangler «%s» ved slutten av filen"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, fuzzy, c-format
 msgid "missing %s at end of line"
 msgstr "mangler «%s» på slutten av linjen"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr ""
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr ""
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr ""
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr ""
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "for mange symboler i inputgrammatikken (grensen er %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "%s er en redeklarasjon av %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, fuzzy, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s er en redeklarasjon av %s"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "symbolet %s ble redefinert"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "%d ubrukelig ikke-terminal"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, fuzzy, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1040,108 +1255,114 @@
 msgstr ""
 "symbolet %s er brukt, men er ikke definert som et token og har ingen regler"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "symbolet %s er brukt, men er ikke definert som et token og har ingen regler"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, fuzzy, c-format
 msgid "symbol %s redeclared"
 msgstr "symbolet %s ble redefinert"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
+msgid "nonterminals cannot be given a token code"
 msgstr ""
 
-#: src/symtab.c:575
-#, c-format
-msgid "redefining user token number of %s"
-msgstr "redefinerer brukertokennummeret til %s"
-
-#: src/symtab.c:578
+#: src/symtab.c:594
 #, fuzzy, c-format
-msgid "user token number of %s too large"
+msgid "redefining code of token %s"
 msgstr "redefinerer brukertokennummeret til %s"
 
-#: src/symtab.c:617
+#: src/symtab.c:597
+#, fuzzy, c-format
+msgid "code of token %s too large"
+msgstr "redefinerer brukertokennummeret til %s"
+
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr ""
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, fuzzy, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr ""
 "symbolet %s er brukt, men er ikke definert som et token og har ingen regler"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr ""
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, fuzzy, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "symbolet «%s» er brukt mer enn en gang som en literalstreng"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, fuzzy, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "symbolet «%s» er gitt mer enn en literalstreng"
 
-#: src/symtab.c:736
-#, fuzzy, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "%s er en redeklarasjon av %s"
+#: src/symtab.c:752
+#, c-format
+msgid "code %d reassigned to token %s"
+msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, fuzzy, c-format
 msgid "previous declaration for %s"
 msgstr "%s er en redeklarasjon av %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr ""
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "startsymbolet %s er udefinert"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "startsymbolet %s er et token"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr ""
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr ""
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr ""
 
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "flere deklarasjoner av %s"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "for mange symboler i inputgrammatikken (grensen er %d)"
+
+#, fuzzy
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "%s er en redeklarasjon av %s"
+
 #, fuzzy
 #~ msgid "eliminate useless chain rules"
 #~ msgstr "Ikke-terminaler med regler hvor de opptrer"
@@ -1168,9 +1389,6 @@
 #~ "  «all»          inkludere alt av den overstående informasjonen\n"
 #~ "  «none»         slå av all rapportering\n"
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "ugyldig argument %s for %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "flertydig argument %s for %s"
 
@@ -1298,26 +1516,6 @@
 #~ msgstr "Kunne ikke åpne statsfilen for skriving."
 
 #, fuzzy
-#~| msgid "missing `%s' at end of file"
-#~ msgid "end \"ABC\" of file"
-#~ msgstr "mangler «%s» ved slutten av filen"
-
-#, fuzzy
-#~| msgid "invalid directive: %s"
-#~ msgid "[identifier]"
-#~ msgstr "ugyldig direktiv: %s"
-
-#, fuzzy
-#~| msgid "invalid directive: %s"
-#~ msgid "identifier"
-#~ msgstr "ugyldig direktiv: %s"
-
-#, fuzzy
-#~| msgid "invalid directive: %s"
-#~ msgid "identifier:"
-#~ msgstr "ugyldig direktiv: %s"
-
-#, fuzzy
 #~| msgid "symbol %s redefined"
 #~ msgid "symbol %s redefined"
 #~ msgstr "symbolet %s ble redefinert"
@@ -1432,9 +1630,6 @@
 #~ msgid "subsidiary program `%s' could not be invoked"
 #~ msgstr "kunne ikke starte opp hjelpeprogrammet «%s»"
 
-#~ msgid "subsidiary program `%s' failed (exit status %d)"
-#~ msgstr "hjelpeprogrammet «%s» mislyktes (returverdi %d)"
-
 #~ msgid " TOTAL                 :"
 #~ msgstr " TOTAL                 :"
 
diff --git a/po/nl.gmo b/po/nl.gmo
index 67ab71c..9497e79 100644
--- a/po/nl.gmo
+++ b/po/nl.gmo
Binary files differ
diff --git a/po/nl.po b/po/nl.po
index d7685c7..91df269 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -12,7 +12,7 @@
 msgstr ""
 "Project-Id-Version: bison 3.3.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2019-06-17 21:12+0800\n"
 "Last-Translator: Sebastiaan Vandenbore <sebastiaan.vandenbore@gmail.com>\n"
 "Language-Team: Dutch <vertaling@vrijschrift.org>\n"
@@ -23,203 +23,361 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "ongeldig teken"
+
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "fatale fout"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr ""
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "%s ontbreekt aan einde van bestand"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr ""
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, fuzzy, c-format
 msgid "empty rules without %empty"
 msgstr "lege regel zonder %%empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr ""
 
-#: src/complain.c:120
+#: src/complain.c:160
 #, fuzzy
 msgid "useless precedence and associativity"
 msgstr "nutteloze voorrang en associativiteit voor %s"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr ""
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr ""
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr ""
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr ""
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "waarschuwing"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "fout"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "fatale fout"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr "POSIX Yacc ondersteunt %s niet"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "verouderd directief %s;  gebruik %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, c-format
 msgid "duplicate directive"
 msgstr "dubbel directief"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, c-format
 msgid "duplicate directive: %s"
 msgstr "dubbel directief: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "eerdere declaratie"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "slechts één %s is toegestaan per regel"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+#, fuzzy
+msgid "syntax error"
+msgstr "fatale fout"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr ""
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr ""
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr ""
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr ""
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr ""
+
+#: src/conflicts.c:88
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "    Conflict tussen regel %d en token %s is opgelost als shift"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr "    Conflict tussen regel %d en token %s is opgelost als reductie"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "    Conflict tussen regel %d en token %s is opgelost als een fout"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Toestand %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "conflicten: %d shift/reductie, %d reductie/reductie\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "conflicten: %d shift/reductie\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "conflicten: %d reductie/reductie\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "shift/reductie conflicten voor regel %d: %d gevonden, %d verwacht"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "reductie/reductie conflicten voor regel %d: %d gevonden, %d verwacht"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr is alleen van toepassing op GLR-parsers"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "shift/reductie-conflicten: %d gevonden, %d verwacht"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d shift/reductie-conflict"
 msgstr[1] "%d shift/reductie-conflicten"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "reductie/reductie-conflicten: %d gevonden, %d verwacht"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d reductie/reductie-conflict"
 msgstr[1] "%d reductie/reductie-conflicten"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "eerdere declaratie"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "eerdere declaratie"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "eerdere declaratie"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "eerdere declaratie"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "%d shift/reductie-conflict"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "%d reductie/reductie-conflict"
+msgstr[1] "%d reductie/reductie-conflicten"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "kan '%s' niet openen"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "invoer-/uitvoerfout"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "kan bestand niet sluiten"
 
 # Betere formulering (ik-vorm vermijden)?
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "geweigerd om invoerbestand %s te overschrijven"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "tegenstrijdige uitvoer naar bestand %s"
@@ -229,96 +387,96 @@
 msgid "%s: cannot backup"
 msgstr "%s: kan geen reservekopie maken"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr ""
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr ""
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr ""
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 #, fuzzy
 msgid "describe shift/reduce conflicts solving"
 msgstr "%d shift/reductie-conflict"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr ""
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr ""
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr ""
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr ""
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Typ '%s --help' voor meer informatie.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Gebruik:  %s [OPTIE...] BESTAND\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 #, fuzzy
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
@@ -330,17 +488,17 @@
 "Ondersteuning voor IELR(1) en canonieke LR(1) is nog experimenteel.\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Een verplicht argument bij een lange optie geldt ook voor de korte vorm.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Hetzelfde geldt voor optionele argumenten.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 #, fuzzy
 msgid ""
 "Operation Modes:\n"
@@ -371,7 +529,7 @@
 "  -f, --feature[=FUNCTIE]   bepaalde extra functies inschakelen\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -382,7 +540,7 @@
 
 # Correcte vervoeging van 'voorvoegen'?
 # Betere vertaling voor 'directives'?
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, fuzzy, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -413,20 +571,24 @@
 "  -l, --no-lines                    geen '#line'-directieven genereren\n"
 "  -k, --token-table                 ook een tabel van token-namen genereren\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Uitvoer:\n"
 "      --defines[=BESTAND]    ook een header-bestand genereren\n"
@@ -442,49 +604,45 @@
 "  -x, --xml[=BESTAND]        ook een XML-rapport over de automaat genereren\n"
 "                               (het XML-schema is experimenteel)\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Rapporteer gebreken in het programma aan <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "Webpagina van '%s': <%s>\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+#, fuzzy
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
 "Algemene hulp bij gebruik van GNU-software: <http://www.gnu.org/gethelp/>\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+#, fuzzy
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr "Meld fouten in de vertaling aan <vertaling@vrijschrift.org>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "Voor volledige documentatie, zie: 'info bison'.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Geschreven door Robert Corbett en Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -493,36 +651,41 @@
 "Er is GEEN garantie; zelfs niet voor VERKOOPBAARHEID of GESCHIKTHEID\n"
 "VOOR EEN BEPAALD DOEL.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "meerdere skeletten opgeven is niet toegestaan"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: ongeldige taal"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "meerdere talen opgeven is niet toegestaan"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, fuzzy, c-format
+msgid "invalid argument for %s: %s"
+msgstr "ongeldig argument %s voor %s"
+
+#: src/getargs.c:868
 #, fuzzy, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "verouderd directief %s;  gebruik %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, c-format
 msgid "missing operand"
 msgstr "ontbrekende operand"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "overtollige operand: %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Grammatica"
 
@@ -539,17 +702,27 @@
 "// Webpagina: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+#, fuzzy
+msgid "end of file"
+msgstr "%s ontbreekt aan einde van bestand"
+
+#: src/i18n-strings.c:36
+#, fuzzy
+msgid "invalid token"
+msgstr "ongeldig teken"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "regelnummer loopt over"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "kolomnummer loopt over"
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
 msgstr "byte nummer loopt over"
@@ -559,229 +732,279 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr ""
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "regel is nutteloos in de grammatica wegens conflicten"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr "fix-its can be applied.  Rerun with option '--update'."
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "%%define van variabele %s is opnieuw gedefinieerd"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "eerdere definitie"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: ongedefinieerde %%define van variabele %s"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "%%define van variabele %s is opnieuw gedefinieerd"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "%%define van variabele %s is opnieuw gedefinieerd"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "%%define van variabele %s is opnieuw gedefinieerd"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "ongeldige waarde voor %%define van booleaanse variabele %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "ongeldige waarde voor %%define van variabele %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "geaccepteerde waarde: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr ""
+
+#: src/parse-gram.y:214
+#, fuzzy
+msgid "[identifier]"
+msgstr "ongeldige identifier: %s"
+
+#: src/parse-gram.y:215
+#, fuzzy
+msgid "character literal"
+msgstr "leeg enkel letterteken"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+#, fuzzy
+msgid "identifier"
+msgstr "ongeldige identifier: %s"
+
+#: src/parse-gram.y:220
+#, fuzzy
+msgid "identifier:"
+msgstr "ongeldige identifier: %s"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+#, fuzzy
+msgid "integer literal"
+msgstr "leeg enkel letterteken"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr "character literals cannot be nonterminals"
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, fuzzy, c-format
 msgid "character literals cannot be used together with %s"
 msgstr "character literals cannot be nonterminals"
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, fuzzy, c-format
 msgid "definition of %s"
 msgstr "herdefinitie van het door de gebruiker gekozen tokennummer van %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "naam ontbreekt in parameterdeclaratie"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, c-format
 msgid "invalid version requirement: %s"
 msgstr "ongeldige versie-eis: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr "bison %s is vereist, maar heb %s"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Toestand %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr ""
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "shift, en ga naar toestand %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "ga naar toestand %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "fout (niet associatief)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "reduceren via regel %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "accepteer"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "reduceren via regel %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$standaard"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Eindsymbolen, met de regels waarin ze voorkomen"
 
 # Betere vertaling voor non-terminals? 'tussensymbolen'?
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Niet-eindsymbolen, met de regels waarin ze voorkomen"
 
-#: src/print.c:416
+#: src/print.c:431
 msgid "on left:"
 msgstr "links:"
 
-#: src/print.c:425
+#: src/print.c:440
 msgid "on right:"
 msgstr "rechts:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Regels die wegens conflicten nutteloos zijn in de grammatica"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "meerdere %s-declaraties"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "botsing tussen resultaattypes bij merge-functie %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "gedupliceerde symboolnaam voor %s wordt genegeerd"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "regel opgegeven voor %s, dat een token is"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "botsing tussen types bij standaardactie: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "lege regel voor niet-eindsymbool met type, en geen actie"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "waarde niet gebruikt: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "waarde niet gezet: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty op niet-lege regel"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "lege regel zonder %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "token voor %%prec is niet gedefinieerd: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr "alleen midregel-acties kunnen een type hebben: %s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s is enkel van toepassing op GLR-parsers"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s moet gevolgd worden door een positief getal"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr "POSIX Yacc ondersteunt geen midregel-acties met een type"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "regel is te lang"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "het startsymbool %s is niet gedefinieerd"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "het startsymbool %s is een token"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "invoergrammatica bevat geen regels"
@@ -790,31 +1013,31 @@
 msgid "rule useless in grammar"
 msgstr "regel is nutteloos in de grammatica"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "niet-eindsymbool is nutteloos in de grammatica: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Niet-eindsymbolen die nutteloos zijn in de grammatica"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Eindsymbolen die niet gebruikt worden in de grammatica"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Regels die nutteloos zijn in de grammatica"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d niet-eindsymbool is nutteloos in de grammatica"
 msgstr[1] "%d niet-eindsymbolen zijn nutteloos in de grammatica"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
@@ -822,234 +1045,229 @@
 msgstr[1] "%d regels zijn nutteloos in de grammatica"
 
 # Ik _denk_ dat dit correct weergeeft wat er bedoeld wordt (m.a.w. er is geen regel voor het startsymbool)
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "uit startsymbool %s kan geen enkele zin afgeleid worden"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "losse '%s'"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "refereert aan: %c%s op %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "betekent misschien: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", verstopt %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " op %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", kan niet bereikt worden vanuit midregel-actie op $%d"
 
 # Hier zou wel het bereik bij vermeld mogen worden...
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "integer valt buiten bereik: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "ongeldige referentie: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 "syntaxisfout na '%c';  verwachtte een integer, letter, '_', '[', of '$'"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "symbool niet gevonden in productie vóór $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "symbool niet gevonden in productie: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "misleidende referentie: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "niet-eenduidige referentie: %s"
 
 # betere vertaling voor 'untyped'?
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "expliciet type opgegeven in een typeloze grammatica"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ voor de midregel op $%d van %s heeft geen gedeclareerd type"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ van %s heeft geen gedeclareerd type"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s van %s heeft geen gedeclareerd type"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr "meerdere voorkomens van $%d met 'api.value.automove'"
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "ongeldig getal na \\-escape: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "losse ',' wordt behandeld als witruimte"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "ongeldige directief: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "ongeldige identifier: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "ongeldig teken"
 msgstr[1] "ongeldig tekens"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "ongeldig null-teken"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "onverwachte identifier in omhaakte naam: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "een identifier werd verwacht"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "ongeldig teken in omhaakte naam"
 msgstr[1] "ongeldig tekens in omhaakte naam"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr "POSIX Yacc ondersteunt geen letterlijke tekenreeksen"
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "leeg enkel letterteken"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "extra tekens in enkel letterteken"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "ongeldig getal na \\-escape: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "ongeldig teken na \\-escape: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr "POSIX Yacc ondersteunt geen hexadecimale letterlijke tekens"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "%s ontbreekt aan einde van bestand"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "%s ontbreekt aan einde van regel"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "onbeëindigde %s-directief in skelet"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "te weinig argumenten voor %s-directief in skelet"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "te veel argumenten voor %s-directief in skelet"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc verbiedt koppeltekens in symboolnamen: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "te veel symbolen in de invoergrammatica (de limiet is %d)"
-
 # Dit ziet er als een potentieel slechte originele string uit - wat kan er in die eerste '%s' staan?
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "%s-herdeclaratie voor %s"
 
 # Dit ziet er als een potentieel slechte originele string uit - wat kan er in die eerste '%s' staan?
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s-herdeclaratie voor <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "symbool %s opnieuw gedeclareerd als token"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "symbool %s opnieuw gedeclareerd als niet-terminaal"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, fuzzy, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1058,109 +1276,117 @@
 "symbool %s wordt gebruikt, maar is niet gedefinieerd als een token en heeft "
 "geen regels"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "symbool %s wordt gebruikt, maar is niet gedefinieerd als een token en heeft "
 "geen regels"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "symbool %s opnieuw gedeclareerd"
 
-#: src/symtab.c:572
-#, c-format
-msgid "nonterminals cannot be given an explicit number"
-msgstr "nonterminals cannot be given an explicit number"
-
-#: src/symtab.c:575
-#, c-format
-msgid "redefining user token number of %s"
-msgstr "herdefinitie van het door de gebruiker gekozen tokennummer van %s"
-
-#: src/symtab.c:578
+#: src/symtab.c:591
 #, fuzzy, c-format
-msgid "user token number of %s too large"
+msgid "nonterminals cannot be given a token code"
+msgstr "nonterminals kunnen geen tekenreeks alias krijgen"
+
+#: src/symtab.c:594
+#, fuzzy, c-format
+msgid "redefining code of token %s"
 msgstr "herdefinitie van het door de gebruiker gekozen tokennummer van %s"
 
-#: src/symtab.c:617
+#: src/symtab.c:597
+#, fuzzy, c-format
+msgid "code of token %s too large"
+msgstr "herdefinitie van het door de gebruiker gekozen tokennummer van %s"
+
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "nutteloze %s voor type <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "type <%s> wordt gebruikt, maar is niet geassocieerd met enig symbool"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr "nonterminals kunnen geen tekenreeks alias krijgen"
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "symbool %s wordt meer dan eens gebruikt als een letterlijke string"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "symbool %s krijgt meer dan één letterlijke string toegewezen"
 
-# Dit ziet er als een potentieel slechte originele string uit - wat kan er in die eerste '%s' staan?
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "herdeclaratie van door gebruiker gekozen tokennummer %d voor %s"
+msgid "code %d reassigned to token %s"
+msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "eerdere declaratie voor %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr ""
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "het startsymbool %s is niet gedefinieerd"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "het startsymbool %s is een token"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "nutteloze voorrang en associativiteit voor %s"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "nutteloze voorrang voor %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "nutteloze associativiteit voor %s;  gebruik %%precedence"
 
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "meerdere %s-declaraties"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "te veel symbolen in de invoergrammatica (de limiet is %d)"
+
+#~ msgid "nonterminals cannot be given an explicit number"
+#~ msgstr "nonterminals cannot be given an explicit number"
+
+# Dit ziet er als een potentieel slechte originele string uit - wat kan er in die eerste '%s' staan?
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "herdeclaratie van door gebruiker gekozen tokennummer %d voor %s"
+
 #, fuzzy
 #~ msgid "eliminate useless chain rules"
 #~ msgstr "niet-eindsymbool is nutteloos in de grammatica: %s"
@@ -1288,9 +1514,6 @@
 #~ msgstr ""
 #~ "omleiden van bison's standaardinvoer naar tijdelijk bestand is mislukt"
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "ongeldig argument %s voor %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "argument %s voor %s is niet eenduidig"
 
diff --git a/po/pl.gmo b/po/pl.gmo
index 7fef474..73cff93 100644
--- a/po/pl.gmo
+++ b/po/pl.gmo
Binary files differ
diff --git a/po/pl.po b/po/pl.po
index 4347aad..eeb16ad 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison 2.7.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2013-06-17 21:11+0200\n"
 "Last-Translator: Wojciech Polak <polak@gnu.org>\n"
 "Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
@@ -19,169 +19,292 @@
 "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
 "|| n%100>=20) ? 1 : 2);\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "nieprawidłowy znak"
+
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "błąd składni"
+
+#: examples/c/bistromathic/parse.y:390
+#, fuzzy
+msgid "%@: syntax error: unexpected %u"
+msgstr "błąd składni, niespodziewany symbol %s, oczekiwano %s"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+#, fuzzy
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "błąd składni, niespodziewany symbol %s, oczekiwano %s"
+
+#: examples/c/bistromathic/parse.y:399
+#, fuzzy
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "błąd składni, niespodziewany %s, oczekiwano %s lub %s lub %s"
+
+#: examples/c/bistromathic/parse.y:400
+#, fuzzy
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "błąd składni, niespodziewany %s, oczekiwano %s lub %s lub %s"
+
+#: examples/c/bistromathic/parse.y:401
+#, fuzzy
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr "błąd składni, niespodziewany %s, oczekiwano %s lub %s lub %s"
+
+#: examples/c/bistromathic/parse.y:402
+#, fuzzy
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr "błąd składni, niespodziewany %s, oczekiwano %s lub %s lub %s"
+
+#: examples/c/bistromathic/parse.y:403
+#, fuzzy
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+"błąd składni, niespodziewany symbol %s, oczekiwano %s lub %s lub %s lub %s"
+
+#: examples/c/bistromathic/parse.y:404
+#, fuzzy
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+"błąd składni, niespodziewany symbol %s, oczekiwano %s lub %s lub %s lub %s"
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "brakujący %s na końcu pliku"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr ""
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, fuzzy, c-format
 msgid "empty rules without %empty"
 msgstr "pusta reguła bez %%empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr ""
 
-#: src/complain.c:120
+#: src/complain.c:160
 #, fuzzy
 msgid "useless precedence and associativity"
 msgstr "bezużyteczne pierwszeństwo i asocjacja dla %s"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr ""
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr ""
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr ""
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr ""
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "ostrzeżenie"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "błąd"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "fatalny błąd"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr ""
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "przestarzała dyrektywa: %s, użyj %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, fuzzy, c-format
 msgid "duplicate directive"
 msgstr "przestarzała dyrektywa, użyj %s"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, fuzzy, c-format
 msgid "duplicate directive: %s"
 msgstr "przestarzała dyrektywa, użyj %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "poprzednia deklaracja"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "tylko jedno %s dozwolone na jedną regułę"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+msgid "syntax error"
+msgstr "błąd składni"
+
+#: src/complain.c:648
+#, fuzzy
+msgid "unexpected %0$s"
+msgstr "błąd składni, niespodziewany symbol %s"
+
+#: src/complain.c:649
+#, fuzzy
+msgid "expected %1$s before %0$s"
+msgstr ""
+"błąd składni, niespodziewany symbol %s, oczekiwano %s lub %s lub %s lub %s"
+
+#: src/complain.c:650
+#, fuzzy
+msgid "expected %1$s or %2$s before %0$s"
+msgstr ""
+"błąd składni, niespodziewany symbol %s, oczekiwano %s lub %s lub %s lub %s"
+
+#: src/complain.c:651
+#, fuzzy
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr ""
+"błąd składni, niespodziewany symbol %s, oczekiwano %s lub %s lub %s lub %s"
+
+#: src/complain.c:652
+#, fuzzy
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr ""
+"błąd składni, niespodziewany symbol %s, oczekiwano %s lub %s lub %s lub %s"
+
+#: src/conflicts.c:88
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr ""
 "    Konflikt pomiędzy regułą %d i symbolem leksykalnym %s rozwiązany jako "
 "przesunięcie"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr ""
 "    Konflikt pomiędzy regułą %d i symbolem leksykalnym %s rozwiązany jako "
 "redukcja"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr ""
 "    Konflikt pomiędzy regułą %d i symbolem leksykalnym %s rozwiązany jako "
 "błąd"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Stan %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "konflikty: %d przesunięcie/redukcja, %d redukcja/redukcja\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "konflikty: %d przesunięcie/redukcja\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "konflikty: %d redukcja/redukcja\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, fuzzy, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "konflikty przesunięcie/redukcja: znaleziono %d, spodziewano się %d"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, fuzzy, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "konflikty redukcja/redukcja: znaleziono %d, spodziewano się %d"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr odnosi się tylko do analizatorów składni GLR"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "konflikty przesunięcie/redukcja: znaleziono %d, spodziewano się %d"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
@@ -189,12 +312,12 @@
 msgstr[1] "%d konflikty przesunięcie/redukcja"
 msgstr[2] "%d konfliktów przesunięcie/redukcja"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "konflikty redukcja/redukcja: znaleziono %d, spodziewano się %d"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
@@ -202,27 +325,81 @@
 msgstr[1] "%d konflikty redukcja/redukcja"
 msgstr[2] "%d konfliktów redukcja/redukcja"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "poprzednia deklaracja"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "poprzednia deklaracja"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "poprzednia deklaracja"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "poprzednia deklaracja"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "%d konflikt przesunięcie/redukcja"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "%d konflikt redukcja/redukcja"
+msgstr[1] "%d konflikty redukcja/redukcja"
+msgstr[2] "%d konfliktów redukcja/redukcja"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: nie można otworzyć"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "błąd wejścia/wyjścia"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "nie można zamknąć pliku"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "odmowa nadpisania pliku wejściowego %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "konflikt wyjść do pliku %s"
@@ -232,96 +409,96 @@
 msgid "%s: cannot backup"
 msgstr "%s: nie można otworzyć"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr ""
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr ""
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr ""
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 #, fuzzy
 msgid "describe shift/reduce conflicts solving"
 msgstr "%d konflikt przesunięcie/redukcja"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr ""
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr ""
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr ""
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr ""
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Spróbuj '%s --help' aby uzyskać więcej informacji.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Użycie: %s [OPCJA]... PLIK\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 #, fuzzy
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
@@ -333,18 +510,18 @@
 "Wsparcie dla IELR(1) i kanonicznego LR(1) jest eksperymentalne.\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Obowiązkowe argumenty dla długich opcji są obowiązkowe również dla krótkich "
 "opcji.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "To samo dotyczy argumentów opcjonalnych.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 #, fuzzy
 msgid ""
 "Operation Modes:\n"
@@ -372,7 +549,7 @@
 "  -f, --feature[=FUNKCJA]    aktywuje różne funkcje programu\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -381,7 +558,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, fuzzy, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -411,20 +588,24 @@
 "  -l, --no-lines             zabrania tworzenia dyrektyw '#line'\n"
 "  -k, --token-table          dołącza tablicę nazw symboli leksykalnych\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Wyjście:\n"
 "      --defines[=PLIK]       produkuje także plik nagłówkowy\n"
@@ -439,50 +620,46 @@
 "  -x, --xml[=PLIK]           produkuje także raport XML na temat automatu\n"
 "                             (schemat XML jest eksperymentalny)\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "O błędach programu poinformuj <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "strona domowa %s: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+#, fuzzy
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr "Pomoc w używaniu oprogramowania GNU: <http://www.gnu.org/gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+#, fuzzy
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 "O błędach tłumaczenia poinformuj <translation-team-pl@lists.sourceforge."
 "net>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "Dla pełnej dokumentacji, uruchom: info bison\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Napisany przez Roberta Corbetta i Richarda Stallmana.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -492,36 +669,41 @@
 "w źródłach. Autorzy nie dają ŻADNYCH gwarancji, w tym również gwarancji\n"
 "PRZYDATNOŚCI DO SPRZEDAŻY LUB DO KONKRETNYCH CELÓW.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "wielokrotne deklaracje szkieletu są nieprawidłowe"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: nieprawidłowy język"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "wielokrotne deklaracje językowe są nieprawidłowe"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, fuzzy, c-format
+msgid "invalid argument for %s: %s"
+msgstr "nieprawidłowy argument %s dla %s"
+
+#: src/getargs.c:868
 #, fuzzy, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "przestarzała dyrektywa: %s, użyj %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, fuzzy, c-format
 msgid "missing operand"
 msgstr "%s: brakujący argument"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "dodatkowy argument %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Gramatyka"
 
@@ -538,17 +720,27 @@
 "// Strona domowa: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+#, fuzzy
+msgid "end of file"
+msgstr "brakujący %s na końcu pliku"
+
+#: src/i18n-strings.c:36
+#, fuzzy
+msgid "invalid token"
+msgstr "nieprawidłowy znak"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "przepełnienie numeru linii"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "przepełnienie numeru kolumny"
 
-#: src/location.c:155
+#: src/location.c:143
 #, fuzzy, c-format
 msgid "byte number overflow"
 msgstr "przepełnienie numeru linii"
@@ -558,231 +750,281 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr ""
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "bezużyteczna reguła w analizatorze z powodu konfliktów"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "zredefiniowana zmienna %%define %s"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "poprzednia definicja"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: niezdefiniowana zmienna %%define %s"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "zredefiniowana zmienna %%define %s"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "zredefiniowana zmienna %%define %s"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "zredefiniowana zmienna %%define %s"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "nieprawidłowa wartość dla boole'owskiej zmiennej %%define %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "nieprawidłowa wartość dla zmiennej %%define %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "zaakceptowana wartość: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr ""
+
+#: src/parse-gram.y:214
+#, fuzzy
+msgid "[identifier]"
+msgstr "nieprawidłowy identyfikator: %s"
+
+#: src/parse-gram.y:215
+#, fuzzy
+msgid "character literal"
+msgstr "pusty literalny znak"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+#, fuzzy
+msgid "identifier"
+msgstr "nieprawidłowy identyfikator: %s"
+
+#: src/parse-gram.y:220
+#, fuzzy
+msgid "identifier:"
+msgstr "nieprawidłowy identyfikator: %s"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+#, fuzzy
+msgid "integer literal"
+msgstr "pusty literalny znak"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr ""
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr ""
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, fuzzy, c-format
 msgid "definition of %s"
 msgstr "przedefiniowanie numeru symbolu leksykalnego %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "brakujący identyfikator w deklaracji parametrów"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, fuzzy, c-format
 msgid "invalid version requirement: %s"
 msgstr "nieprawidłowa sekwencja ucieczki: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr ""
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Stan %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, fuzzy, c-format
+msgid "%s failed with status %d"
+msgstr "dodatkowy program `%s' nie powiódł się (kod wyjścia %d)"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "przesunięcie, i przejście do stanu %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "przejście do stanu %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "błąd (symbol niełączący się)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "redukcja przy użyciu reguły %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "akceptowanie"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "redukcja przy użyciu reguły %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$domyślnie"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Symbole terminalne i reguły, w których występują"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Symbole nieterminalne i reguły, w których występują"
 
-#: src/print.c:416
+#: src/print.c:431
 #, fuzzy
 msgid "on left:"
 msgstr " po lewej:"
 
-#: src/print.c:425
+#: src/print.c:440
 #, fuzzy
 msgid "on right:"
 msgstr " po prawej:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Bezużyteczne reguły w analizatorze z powodu konfliktów"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "wielokrotne deklaracje %s"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "niezgodność typów powrotu przy połączeniu funkcji %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "zignorowano powtórzoną nazwę symbolu dla %s"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "reguła dana dla symbolu leksykalnego %s"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "konflikt typu w domyślnej akcji: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr ""
 "pusta reguła i brak akcji dla symbolu nieterminalnego z określeniem typu"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "nieużywana wartość: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "nieustawiona wartość: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty w niepustej regule"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "pusta reguła bez %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "symbol leksykalny dla %%prec nie jest zdefiniowany: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr ""
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s wpływa tylko na analizatory składni GLR"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "za %s musi być umieszczona liczba dodatnia"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr ""
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "zbyt długa reguła"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "symbol początkowy %s jest niezdefiniowany"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "symbol początkowy %s jest symbolem leksykalnym"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "brak reguł w gramatyce wejściowej"
@@ -791,24 +1033,24 @@
 msgid "rule useless in grammar"
 msgstr "reguła bezużyteczna w gramatyce"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "Symbol nieterminalny bezużyteczny w gramatyce: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Symbole nieterminalne bezużyteczne w gramatyce"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Nieużywane symbole terminalne w gramatyce"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Bezużyteczne reguły w gramatyce"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
@@ -816,7 +1058,7 @@
 msgstr[1] "%d bezużyteczne symbole nieterminalne w gramatyce"
 msgstr[2] "%d bezużytecznych symboli nieterminalnych w gramatyce"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
@@ -824,235 +1066,230 @@
 msgstr[1] "%d bezużyteczne reguły w gramatyce"
 msgstr[2] "%d bezużytecznych reguł w gramatyce"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "początkowy symbol %s nie dziedziczy żadnego zdania"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "zabłąkany '%s'"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "odnosi się do: %c%s w %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "może chodziło o: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", ukrywanie %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " w %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, fuzzy, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", nie jest dostępne z akcji mid-rule w $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "liczba całkowita poza zakresem: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "nieprawidłowe odwołanie: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 "błąd składni za znakiem '%c', spodziewano się liczby, litery, '_', '[', lub "
 "'$'"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "nie znaleziono symbolu w produkcji przed $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "nie znaleziono symbolu w produkcji: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "mylące odniesienie: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "niejednoznaczne odniesienie: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "jawny typ w gramatyce beztypowej"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr ""
 "$$ w pozycji $%d należący do pośredniej reguły %s nie posiada "
 "zadeklarowanego typu"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ należący do %s nie posiada zadeklarowanego typu"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s należący do %s nie posiada zadeklarowanego typu"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr ""
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "nieprawidłowa liczba po \\-escape: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "zabłąkany znak ',' potraktowany jako biały znak"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "nieprawidłowa dyrektywa: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "nieprawidłowy identyfikator: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "nieprawidłowy znak"
 msgstr[1] "nieprawidłowe znaki"
 msgstr[2] "nieprawidłowych znaków"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "nieprawidłowy pusty znak"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "niespodziewany identyfikator w nazwie: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "oczekiwano identyfikatora"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "nieprawidłowy znak w nazwie"
 msgstr[1] "nieprawidłowe znaki w nazwie"
 msgstr[2] "nieprawidłowych znaków w nazwie"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr ""
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "pusty literalny znak"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "dodatkowe znaki w literalnym znaku"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "nieprawidłowa liczba po \\-escape: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "nieprawidłowy znak po \\-escape: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr ""
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "brakujący %s na końcu pliku"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "brakujący %s na końcu linii"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "niedomknięta dyrektywa %s w szkielecie"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "za mało argumentów dla dyrektywy %s w szkielecie"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "za dużo argumentów dla dyrektywy %s w szkielecie"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc zabrania myślników w nazwach symboli: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "zbyt dużo symboli w gramatyce wejściowej (limit wynosi %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "%s redeklaracja dla %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s redeklaracja dla <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "zredefiniowany symbol %s"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "zredefiniowany symbol %s"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, fuzzy, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1061,108 +1298,113 @@
 "użyty symbol %s nie jest zdefiniowany jako symbol leksykalny i nie posiada "
 "reguł"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "użyty symbol %s nie jest zdefiniowany jako symbol leksykalny i nie posiada "
 "reguł"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "zredefiniowany symbol %s"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
+msgid "nonterminals cannot be given a token code"
 msgstr ""
 
-#: src/symtab.c:575
-#, c-format
-msgid "redefining user token number of %s"
-msgstr "przedefiniowanie numeru symbolu leksykalnego %s"
-
-#: src/symtab.c:578
+#: src/symtab.c:594
 #, fuzzy, c-format
-msgid "user token number of %s too large"
+msgid "redefining code of token %s"
 msgstr "przedefiniowanie numeru symbolu leksykalnego %s"
 
-#: src/symtab.c:617
+#: src/symtab.c:597
+#, fuzzy, c-format
+msgid "code of token %s too large"
+msgstr "przedefiniowanie numeru symbolu leksykalnego %s"
+
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "bezużyteczny %s dla typu <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "użyty typ <%s> nie jest powiązany z żadnym symbolem"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr ""
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "symbol %s użyty więcej niż jeden raz jako łańcuch literalny"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "symbol %s podany więcej niż jeden łańcuch literalny"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "redeklaracja numeru symbolu leksykalnego %d dla %s"
+msgid "code %d reassigned to token %s"
+msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "poprzednia deklaracja dla %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr ""
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "symbol początkowy %s jest niezdefiniowany"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "symbol początkowy %s jest symbolem leksykalnym"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "bezużyteczne pierwszeństwo i asocjacja dla %s"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "bezużyteczne pierwszeństwo dla %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "bezużyteczna asocjacja dla %s, użyj %%precedence"
 
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "wielokrotne deklaracje %s"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "zbyt dużo symboli w gramatyce wejściowej (limit wynosi %d)"
+
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "redeklaracja numeru symbolu leksykalnego %d dla %s"
+
 #, fuzzy
 #~ msgid "eliminate useless chain rules"
 #~ msgstr "Symbol nieterminalny bezużyteczny w gramatyce: %s"
@@ -1242,9 +1484,6 @@
 #~ "  'none'         żadne z powyższych\n"
 #~ "  "
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "nieprawidłowy argument %s dla %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "niejednoznaczny argument %s dla %s"
 
@@ -1370,36 +1609,6 @@
 #~ msgid "cannot open stats file for writing"
 #~ msgstr "nie można otworzyć pliku statystyk do zapisu"
 
-#, fuzzy
-#~| msgid "missing %s at end of file"
-#~ msgid "end \"ABC\" of file"
-#~ msgstr "brakujący %s na końcu pliku"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "[identifier]"
-#~ msgstr "nieprawidłowy identyfikator: %s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "character literal"
-#~ msgstr "pusty literalny znak"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier"
-#~ msgstr "nieprawidłowy identyfikator: %s"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier:"
-#~ msgstr "nieprawidłowy identyfikator: %s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "integer literal"
-#~ msgstr "pusty literalny znak"
-
 #~ msgid "symbol %s redefined"
 #~ msgstr "zredefiniowany symbol %s"
 
@@ -1593,9 +1802,6 @@
 #~ msgid "missing `{' in %s"
 #~ msgstr "brakuje `{' w %s"
 
-#~ msgid "subsidiary program `%s' failed (exit status %d)"
-#~ msgstr "dodatkowy program `%s' nie powiódł się (kod wyjścia %d)"
-
 #~ msgid "syntax error: cannot back up"
 #~ msgstr "błąd składni: nie można cofnąć przesunięcia symbolu leksykalnego"
 
@@ -1629,28 +1835,12 @@
 #~ msgid "POSIX forbids declarations in the grammar"
 #~ msgstr "POSIX zabrania deklaracji w gramatyce"
 
-#~ msgid "syntax error, unexpected %s"
-#~ msgstr "błąd składni, niespodziewany symbol %s"
-
-#~ msgid "syntax error, unexpected %s, expecting %s"
-#~ msgstr "błąd składni, niespodziewany symbol %s, oczekiwano %s"
-
 #~ msgid "syntax error, unexpected %s, expecting %s or %s"
 #~ msgstr "błąd składni, niespodziewany symbol %s, oczekiwano %s lub %s"
 
-#~ msgid "syntax error, unexpected %s, expecting %s or %s or %s"
-#~ msgstr "błąd składni, niespodziewany %s, oczekiwano %s lub %s lub %s"
-
-#~ msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
-#~ msgstr ""
-#~ "błąd składni, niespodziewany symbol %s, oczekiwano %s lub %s lub %s lub %s"
-
 #~ msgid "syntax error; also memory exhausted"
 #~ msgstr "błąd składni; ponadto wyczerpana pamięć"
 
-#~ msgid "syntax error"
-#~ msgstr "błąd składni"
-
 #~ msgid "Error: discarding"
 #~ msgstr "Błąd: odrzucenie"
 
diff --git a/po/pt.gmo b/po/pt.gmo
index e2a3f0d..64935dd 100644
--- a/po/pt.gmo
+++ b/po/pt.gmo
Binary files differ
diff --git a/po/pt.po b/po/pt.po
index 88b3d30..b0ebb14 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -1,15 +1,15 @@
 # Portuguese (Portugal) translation for the Bison Package.
 # Copyright (C) 2018 Free Software Foundation, Inc.
 # This file is distributed under the same license as the bison package.
-# Pedro Albuquerque <palbuquerque73@gmail.com>, 2018, 2019.
+# Pedro Albuquerque <pmra@protonmail.com>, 2018, 2019, 2020, 2021.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: bison-3.4.91\n"
+"Project-Id-Version: bison-3.7.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-11-23 07:21+0000\n"
-"Last-Translator: Pedro Albuquerque <palbuquerque73@gmail.com>\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2021-08-13 09:42+0100\n"
+"Last-Translator: Pedro Albuquerque <pmra@protonmail.com>\n"
 "Language-Team: Portuguese <translation-team-pt@lists.sourceforge.net>\n"
 "Language: pt\n"
 "MIME-Version: 1.0\n"
@@ -17,204 +17,361 @@
 "Content-Transfer-Encoding: 8bit\n"
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Gtranslator 2.91.7\n"
+"X-Generator: Poedit 2.3\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr "número"
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr "função"
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr "variável"
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr "erro: divisão por zero"
+
+#: examples/c/bistromathic/parse.y:372
+#, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "erro de sintaxe: carácter inválido: %c"
+
+#: examples/c/bistromathic/parse.y:389
+msgid "%@: syntax error"
+msgstr "%@: erro de sintaxe"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr "%@: erro de sintaxe: %u inesperado"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "%@: erro de sintaxe: esperado %0e antes de %u"
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "%@: erro de sintaxe: esperado %0e ou %1e antes de %u"
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "%@: erro de sintaxe: esperado %0e, %1e ou %2e antes de %u"
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr "%@: erro de sintaxe: esperado %0e, %1e, %2e ou %3e antes de %u"
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr "%@: erro de sintaxe: esperado %0e, %1e, %2e, %3e ou %4e antes de %u"
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+"%@: erro de sintaxe: esperado %0e, %1e, %2e, %3e, %4e ou %5e antes de %u"
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+"%@: erro de sintaxe: esperado %0e, %1e, %2e, %3e, %4e ou %5e, etc., antes de "
+"%u"
+
+#: examples/java/calc/Calc.y:81
+msgid "end of line"
+msgstr "fim de linha"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
-msgstr "conflitos S/R (activa por predefinição)"
+msgstr "Conflitos S/R (activa por predefinição)"
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
-msgstr "conflitos R/R (activa por predefinição)"
+msgstr "Conflitos R/R (activa por predefinição)"
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr "gerar contra-exemplos conflituosos"
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr "aliás de cadeia não anexados a um símbolo"
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr "construções obsoletas"
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, c-format
 msgid "empty rules without %empty"
 msgstr "regras vazias sem %empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr "valores de meia regra indefinidos ou não usados"
 
-#: src/complain.c:120
+#: src/complain.c:160
 msgid "useless precedence and associativity"
 msgstr "precedência e associatividade inúteis"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr "incompatibilidades com POSIX Yacc"
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr "todos os outros avisos (activa por predefinição)"
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
-msgstr "todos os avisos excepto \"dangling-alias\" e \"yacc\""
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
+msgstr ""
+"todos os avisos excepto \"counterexamples\", \"dangling-alias\" e \"yacc\""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr "desligar avisos em CATEGORIA"
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr "desligar todos os avisos"
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr "tratar avisos como erros"
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr "As categorias de avisos incluem:"
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "aviso"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "erro"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "erro fatal"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr "nota"
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr "POSIX Yacc não suporta %s"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "directiva obsoleta: %s, use %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, c-format
 msgid "duplicate directive"
 msgstr "directiva duplicada"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, c-format
 msgid "duplicate directive: %s"
 msgstr "directiva duplicada: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "declaração anterior"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "só uma %s permitida por regra"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+msgid "syntax error"
+msgstr "erro de sintaxe"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr "%0$s inesperado"
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr "esperado %1$s antes de %0$s"
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr "esperado %1$s ou %2$s antes de %0$s"
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr "esperado %1$s, %2$s ou %3$s antes de %0$s"
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr "esperado %1$s, %2$s, %3$s ou %4$s antes de %0$s"
+
+#: src/conflicts.c:88
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "Conflito entre regra %d e símbolo %s resolvido como troca"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr "Conflito entre regra %d e símbolo %s resolvido como redução"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "Conflito entre regra %d e símbolo %s resolvido como erro"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
-msgstr "Estado %d"
+msgstr "Estado %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "conflitos: %d troca/redução, %d redução/redução\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "conflitos: %d troca/redução\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "conflitos: %d redução/redução\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "conflitos troca/redução para a regra %d: %d encontrados, %d esperados"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 "conflitos redução/redução para a regra %d: %d encontrados, %d esperados"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr só se aplica a analisadores GLR"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "conflitos troca/redução: %d encontrados, %d esperados"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d conflito troca/redução"
 msgstr[1] "%d conflitos troca/redução"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "conflitos redução/redução: %d encontrados, %d esperados"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d conflito troca/redução"
 msgstr[1] "%d conflitos troca/redução"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+"re-executar com a opção \"-Wcounterexamples\" para gerar contra-exemplos "
+"conflituosos"
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr "Exemplo"
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr "Primeiro exemplo"
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr "Segundo exemplo"
+
+#: src/counterexample.c:126
+msgid "Shift derivation"
+msgstr "Deslocar derivação"
+
+#: src/counterexample.c:126
+msgid "First reduce derivation"
+msgstr "Primeira redução de derivação"
+
+#: src/counterexample.c:128
+msgid "Reduce derivation"
+msgstr "Reduzir derivação"
+
+#: src/counterexample.c:128
+msgid "Second reduce derivation"
+msgstr "Segunda redução de derivação"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "deslocar/reduzir conflito no símbolo %s"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ":"
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "reduzir/reduzir conflito no símbolo"
+msgstr[1] "reduzir/reduzir conflito nos símbolos %s"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: impossível abrir"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "erro de entrada/saída"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "impossível fechar o ficheiro"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "recusa de sobrescrever ficheiro de entrada %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "saidas conflituosas para ficheiro %s"
@@ -224,98 +381,98 @@
 msgid "%s: cannot backup"
 msgstr "%s: impossível criar segurança"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr "colorir a saída"
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr "não colorir a saída"
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr "colorir se o dispositivo de saída for um tty"
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr "QUANDO pode ser um dos seguintes:"
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr "descrever os estados"
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr "completar os conjuntos de itens nucleares com o seu fecho"
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr "associar explicitamente símbolos lookahead a itens"
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 msgid "describe shift/reduce conflicts solving"
 msgstr "descrever solução de conflitos troca/redução"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr "incluir toda a informação acima"
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr "desactivar o relatório"
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 "COISAS é uma lista de palavras separadas por vírgulas que pode incluir:"
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 "RASTOS é uma lista de palavras separadas por vírgulas que pode incluir:"
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr "mostrar erros com circunflexos"
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr "mostrar reparações legíveis por máquina"
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr "não gerar nenhum ficheiro"
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr "todas as acima"
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr "desactivar todas as acima"
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 "FUNCIONAL é uma lista de palavras separadas por vírgulas que pode incluir:"
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Tente \"%s --help\" para mais informação.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Uso: %s [OPÇÃO]... FICHEIRO\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
@@ -325,18 +482,18 @@
 "tabelas de análise LALR(1), IELR(1) ou LR(1) canónica.\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Argumentos obrigatórios para opções longas também são obrigatórios para "
 "opções curtas.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Igualmente verdadeiro para argumentos opcionais.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -364,7 +521,7 @@
 "  -f, --feature[=FUNCIONAL]  activa várias funcionalidades\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -379,7 +536,7 @@
 "colorido\n"
 "\n"
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -411,113 +568,123 @@
 "  -k, --token-table                incluir uma tabela de nomes de símbolos\n"
 "  -y, --yacc                       emular POSIX Yacc\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
-"Saída:\n"
-"      --defines[=FICHEIRO]   produz também um ficheiro de cabeçalho\n"
-"  -d                         igual mas sem especificar FICHEIRO (para POSIX "
-"Yacc)\n"
-"  -r, --report=COISAS        produz também detalhes do automaton\n"
-"      --report-file=FICHEIRO escreve relatório em FICHEIRO\n"
-"  -v, --verbose              igual a \"--report=state\"\n"
-"  -b, --file-prefix=PREFIXO  especifica PREFIXO para ficheiros de saída\n"
-"  -o, --output=FICHEIRO      deixar saída em FICHEIRO\n"
-"  -g, --graph[=FICHEIRO]     produz também um gráfco do automaton\n"
-"  -x, --xml[=FICHEIRO]       produz também um relatório XML do automaton\n"
+"Ficheiros de saída:\n"
+"  -H, --header=[FICH]           produzir também um ficheiro de cabeçalho\n"
+"  -d                             igual mas sem especificar FICHEIRO (para "
+"POSIX Yacc)\n"
+"  -r, --report=COISAS            produzir também detalhes do automaton\n"
+"      --report-file=FICHEIRO     escrever relatório em FICHEIRO\n"
+"  -v, --verbose                  igual a \"--report=state\"\n"
+"  -b, --file-prefix=PREFIXO      especificar PREFIXO para ficheiros de "
+"saída\n"
+"  -o, --output=FICHEIRO          deixar saída em FICHEIRO\n"
+"  -g, --graph[=FICHEIRO]         produzir também um gráfco do automaton\n"
+"      --html[=FILE]             produzir também um relatório HTML do "
+"automaton\n"
+"  -x, --xml[=FICHEIRO]           produzir também um relatório XML do "
+"automaton\n"
+"  -M, --file-prefix-map=ANT=NOVO substituir ANT por NOVO ao escrever "
+"caminhos de ficheiro\n"
+"                                 em ficheiros de saída\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Reportar erros a <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "Página inicial de %s: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
-msgstr "Ajuda geral para usar programas GNU: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
+msgstr "Ajuda geral para usar programas GNU: <https://www.gnu.org/gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
-msgstr "Reportar erros de tradução a <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
+msgstr "Reportar erros de tradução a <https://translationproject.org/team/>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "Para documentação completa, execute: info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Escrito por Robert Corbett e Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
 msgstr ""
-"é um programa gratuito; veja a fonte para condições de cópia. NÃO há "
+"Este é um programa gratuito; veja a fonte para condições de cópia. NÃO há "
 "QUALQUER\n"
 "garantia; nem mesmo para COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM PROPÓSITO "
 "PARTICULAR.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "múltiplas declarações de esqueleto são inválidas"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: linguagem inválida"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "múltiplas declarações de linguagem são inválidas"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, c-format
+msgid "invalid argument for %s: %s"
+msgstr "argumento inválido para %s: %s"
+
+#: src/getargs.c:868
 #, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "opção obsoleta: %s, use %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, c-format
 msgid "missing operand"
 msgstr "operando em falta"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "operando extra %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Gramática"
 
@@ -534,17 +701,25 @@
 "// Página inicial: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+msgid "end of file"
+msgstr "fim de ficheiro"
+
+#: src/i18n-strings.c:36
+msgid "invalid token"
+msgstr "símbolo inválido"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "transporte de nº de linha"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "transporte de nº de coluna"
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
 msgstr "transporte de nº de byte"
@@ -554,228 +729,273 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr "..."
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "regra inútil no analisador devidoa aconflitos"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr "podem ser aplicados fix-its. Re-executar com a opção \"--update\"."
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "Variável %%define %s redefinida"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "definição anterior"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: variável %%define %s indefinida"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "Variável %%define \"%s\" requer valores \"{...}\""
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "Variável %%define \"%s\" requer valores de palavra-chave"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "Variável %%define \"%s\" requer valores \"\"...\"\""
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "valor inválido para variável %%define %s booliana"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "valor inválido para variável %%define %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "valor aceite: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr "cadeia"
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr "cadeia traduzível"
+
+#: src/parse-gram.y:214
+msgid "[identifier]"
+msgstr "[identificador]"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr "literal de carácter"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr "epílogo"
+
+#: src/parse-gram.y:219
+msgid "identifier"
+msgstr "identificador"
+
+#: src/parse-gram.y:220
+msgid "identifier:"
+msgstr "identificador:"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr "<etiqueta>"
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr "literal inteiro"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr "literais de caracteres não podem ser não-terminais"
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr "literais de caracteres não podem ser usados com %s"
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, c-format
 msgid "definition of %s"
 msgstr "definição de %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "identificador em falta na declaração do parâmetro"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, c-format
 msgid "invalid version requirement: %s"
 msgstr "requerimento de versão inválido: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr "requerido bison %s, obtido %s"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Estado %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr "%s falhou com estado %d"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "troca e vai para estado %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "vai para estado %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "erro (não associativo)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "redução com regra %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "aceitar"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "redução com regra %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Terminais, com regras onde aparecem"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Não terminais, com regras onde aparecem"
 
-#: src/print.c:416
+#: src/print.c:431
 msgid "on left:"
 msgstr "à esquerda:"
 
-#: src/print.c:425
+#: src/print.c:440
 msgid "on right:"
 msgstr "à direita:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Regras inúteis no analisador devido a conflitos"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "múltiplas declarações %s"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "choque no tipo de resultado na função de união %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "nome de símbolo duplicado para %s ignorado"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "regra dada para %s, que é um símbolo"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "choque de tipo em acção predefinida: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "regra vazia para não terminais digitados e sem acção"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "valor não usado: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "valor não definido: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty em regra não-vazia"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "regra vazia sem %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "símbolo para %%prec não está definido: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr "só acções na regra podem ser inseridas: %s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s só afecta analisadores GLR"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s tem de ser seguido por um nº positivo"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr "POSIX Yacc não suporta inserção de acções na regra"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "regra muito longa"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "símbolo inicial %s indefinido"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "símbolo inicial %s é um símbolo"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "sem regras na gramática de entrada"
@@ -784,261 +1004,256 @@
 msgid "rule useless in grammar"
 msgstr "regra inútil na gramática"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "não-terminal inútil na gramática: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
-msgstr "não-terminais inúteis na gramática"
+msgstr "Não-terminais inúteis na gramática"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Terminais não usados na gramática"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Regras inúteis na gramática"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d não-terminal inútil na gramática"
 msgstr[1] "%d não-terminais inúteis na gramática"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d regra inútil na gramática"
 msgstr[1] "%d regras inúteis na gramática"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "símbolo %s inicial não deriva nenhuma frase"
 
 # pt_PT: escolhida a palavra "errante" para evitar masculino/feminino
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "\"%s\" errante"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "refere-se a: %c%s em %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "possível significado: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", a ocultar %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " em %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", não pode ser acedido de acção a meia regra em $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "inteiro fora do intervalo: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "referência inválida: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr "erro de sintaxe após \"%c\", esperado inteiro, letra, '_', '[', ou '$'"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "símbolo não encontrado em produção antes de $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "símbolo não encontrado em produção: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "referência enganosa: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "referência ambígua: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "tipo explícito indicado em gramática atípica"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ para midrule em $%d de %s não tem tipo declarado"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ de %s não tem tipo declarado"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s de %s não tem tipo declarado"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr "múltiplas ocorrências de $%d com api.value.automove"
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "número inválido após \\-escape: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "\",\" extraviada tratada como espaço"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "directiva inválida: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "identificador inválido: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "carácter inválido"
 msgstr[1] "caracteres inválidos"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "carácter nulo inválido"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "identificador inesperado em nome entre parênteses: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "esperado um identificador"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "carácter inválido em nome entre parênteses"
 msgstr[1] "caracteres inválidos em nome entre parênteses"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr "POSIX Yacc não suporta literais de cadeia"
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "literal de carácter vazio"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "caracteres extra em literal de carácter"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "número inválido após \\-escape: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "carácter inválido após \\-escape: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr "POSIX Yacc não suporta literais hexadecimais"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "%s em falta no fim do ficheiro"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "%s em falta no fim da linha"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "directiva %s por fechar no esqueleto"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "poucos argumentos na directiva %s no esqueleto"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "muitos argumentos na directiva %s no esqueleto"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc proíbe traços em nomes de símbolos: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "muitos símbolos na gramática de entrada (limite é %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "re-declaração de %s para %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "re-declaração de %s para <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "símbolo %s re-declarado como síbolo"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "símbolo %s re-declarado como não-terminal"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1047,106 +1262,118 @@
 "símbolo %s usado mas não é definido como símbolo e não tem regras; queria "
 "dizer %s?"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr "símbolo %s usado mas não é definido como símbolo  não tem regras"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr "POSIX yacc reserva o %%tipo para não-terminais"
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "símbolo %s re-declarado"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
-msgstr "não-terminais não podem receber um número explicíto"
+msgid "nonterminals cannot be given a token code"
+msgstr "não terminais não podem receber um código de símbolo"
 
-#: src/symtab.c:575
+#: src/symtab.c:594
 #, c-format
-msgid "redefining user token number of %s"
-msgstr "a redefinir número de símbolo do utilizador de %s"
+msgid "redefining code of token %s"
+msgstr "a redefinir código de símbolo %s"
 
-#: src/symtab.c:578
+#: src/symtab.c:597
 #, c-format
-msgid "user token number of %s too large"
-msgstr "número de símbolo do utilizador de %s muito grande"
+msgid "code of token %s too large"
+msgstr "código de símbolo %s muito grande"
 
-#: src/symtab.c:617
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr "literal de cadeia %s não anexado a um símbolo"
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "%s inútil para tipo <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "tipo <%s> usado mas não está associado a nenhum símbolo"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr "não terminais não podem receber um aliás de cadeia"
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "símbolo %s usado mais de uma vez como cadeia literal"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "símbolo %s tem mais de uma cadeia literal"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "re-declaração de número de símbolo do utilizador %d para %s"
+msgid "code %d reassigned to token %s"
+msgstr "código %d re-atribuído ao símbolo %s"
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "declaração anterior para %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr "número de símbolo muito grande"
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "símbolo inicial %s indefinido"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "símbolo inicial %s é um símbolo"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "precedência e associatividade inúteis para %s"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "precedência inútil para %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "associatividade inútil para %s, use %%precedência"
 
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#~ msgid "multiple %s declarations"
+#~ msgstr "múltiplas declarações %s"
+
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "muitos símbolos na gramática de entrada (limite é %d)"
+
+#~ msgid ""
+#~ "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e or %6e "
+#~ "before %u"
+#~ msgstr ""
+#~ "%@: erro de sintaxe: esperado %0e, %1e, %2e, %3e, %4e, %5e ou %6e antes "
+#~ "de %u"
+
+#~ msgid "nonterminals cannot be given an explicit number"
+#~ msgstr "não-terminais não podem receber um número explicíto"
+
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "re-declaração de número de símbolo do utilizador %d para %s"
+
 #~ msgid "deprecated directive, use %s"
 #~ msgstr "directiva obsoleta, use %s"
 
@@ -1223,9 +1450,6 @@
 #~ "    desactiva todos os acima\n"
 #~ ".."
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "argumento %s inválido para %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "argumento %s ambíguo para %s"
 
diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo
index bc484c3..c00b845 100644
--- a/po/pt_BR.gmo
+++ b/po/pt_BR.gmo
Binary files differ
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 9da4c1d..b96030c 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -1,15 +1,16 @@
 # Brazilian Portuguese translation for bison package
 # Traduções em português brasileiro para o pacote bison
-# Copyright (C) 2019 Free Software Foundation, Inc.
+# Copyright (C) 2021 Free Software Foundation, Inc.
 # This file is distributed under the same license as the bison package.
 # Alexandre Folle de Menezes <afmenez@terra.com.br>, 2002, 2003.
-# Rafael Fontenelle <rafaelff@gnome.org>, 2013-2019.
+# Rafael Fontenelle <rafaelff@gnome.org>, 2013-2021.
+#
 msgid ""
 msgstr ""
-"Project-Id-Version: bison 3.4.91\n"
+"Project-Id-Version: bison 3.7.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-11-22 10:25-0200\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2021-08-23 09:13-0300\n"
 "Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n"
 "Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge."
 "net>\n"
@@ -17,210 +18,369 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Virtaal 1.0.0-beta1\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"X-Generator: Gtranslator 40.0\n"
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr "número"
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr "função"
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr "variável"
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr "erro: divisão por zero"
+
+#: examples/c/bistromathic/parse.y:372
+#, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "erro de sintaxe: caractere inválido: %c"
+
+#: examples/c/bistromathic/parse.y:389
+msgid "%@: syntax error"
+msgstr "%@: erro de sintaxe"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr "%@: erro de sintaxe: %u inesperado"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "%@: erro de sintaxe: esperava-se %0e antes de %u"
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "%@: erro de sintaxe: esperava-se %0e ou %1e antes de %u"
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "%@: erro de sintaxe: esperava-se %0e ou %1e ou %2e antes de %u"
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr "%@: erro de sintaxe: esperava-se %0e ou %1e ou %2e ou %3e antes de %u"
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+"%@: erro de sintaxe: esperava-se %0e ou %1e ou %2e ou %3e ou %4e antes de %u"
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+"%@: erro de sintaxe: esperava-se %0e ou %1e ou %2e ou %3e ou %4e ou %5e "
+"antes de %u"
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+"%@: erro de sintaxe: esperava-se %0e ou %1e ou %2e ou %3e ou %4e ou %5e etc. "
+"antes de %u"
+
+#: examples/java/calc/Calc.y:81
+msgid "end of line"
+msgstr "final da linha"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr "conflitos de desloc./redução (habilitado por padrão)"
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr "conflitos de redução/redução (habilitado por padrão)"
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr "gera contraexemplos de conflito"
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr "aliases de strings não anexadas a um símbolo"
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr "construtos obsoletos"
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, c-format
 msgid "empty rules without %empty"
 msgstr "regras vazias sem %empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr "valores de midrule desconfigurados ou não usados"
 
-#: src/complain.c:120
+#: src/complain.c:160
 msgid "useless precedence and associativity"
 msgstr "precedência e associatividade inúteis"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr "incompatibilidades com POSIX Yacc"
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr "todos os outros avisos (habilitado por padrão)"
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
-msgstr "todos os avisos, exceto \"dangling-alias\" e \"yacc\""
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
+msgstr ""
+"todos os avisos, exceto \"counterexamples\", \"dangling-alias\" e \"yacc\""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr "desliga aviso na CATEGORIA"
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr "desliga todos os avisos"
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr "trata avisos como erros"
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr "Categorias de aviso incluem:"
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "aviso"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "erro"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "erro fatal"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr "nota"
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr "POSIX Yacc não possui suporte a %s"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "diretiva obsoleta: %s, use %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, c-format
 msgid "duplicate directive"
 msgstr "diretiva duplicada"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, c-format
 msgid "duplicate directive: %s"
 msgstr "diretiva duplicada: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "declaração anterior"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "apenas um %s é permitido por regra"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+msgid "syntax error"
+msgstr "erro de sintaxe"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr "esperava-se %0$s"
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr "esperava-se %1$s antes de %0$s"
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr "esperava-se %1$s ou %2$s antes de %0$s"
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr "esperava-se %1$s ou %2$s ou %3$s antes de %0$s"
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr "esperava-se %1$s ou %2$s ou %3$s ou %4$s antes de %0$s"
+
+#: src/conflicts.c:88
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr ""
-"Conflito entre a regra %d e a token %s resolvido como deslocamento (shift)"
+"Conflito entre a regra %d e o token %s resolvido como deslocamento (shift)"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
-msgstr "Conflito entre a regra %d e a token %s resolvido como redução (reduce)"
+msgstr "Conflito entre a regra %d e o token %s resolvido como redução (reduce)"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
-msgstr "Conflito entre a regra %d e a token %s resolvido como um erro"
+msgstr "Conflito entre a regra %d e o token %s resolvido como um erro"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Estado %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "conflitos: %d de deslocamento/redução, %d de redução/redução\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "conflitos: %d de deslocamento/redução\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "conflitos: %d de redução/redução\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 "conflitos de deslocamento/redução para a regra %d: %d encontrado(s), %d "
 "esperado(s)"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 "conflitos de redução/redução para a regra %d: %d encontrado(s), %d "
 "esperado(s)"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr é aplicável apenas a analisadores GLR"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "conflitos de deslocamento/redução: %d encontrado(s), %d esperado(s)"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d conflito de deslocamento/redução"
 msgstr[1] "%d conflitos de deslocamento/redução"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "conflitos de redução/redução: %d encontrado(s), %d esperado(s)"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d conflito de redução/redução"
 msgstr[1] "%d conflitos de redução/redução"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+"execute novamente com a opção \"-Wcounterexamples\" para gerar "
+"contraexemplos de conflito"
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr "Exemplo"
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr "Primeiro exemplo"
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr "Segundo exemplo"
+
+#: src/counterexample.c:126
+msgid "Shift derivation"
+msgstr "Derivação do deslocamento"
+
+#: src/counterexample.c:126
+msgid "First reduce derivation"
+msgstr "Primeira derivação de redução"
+
+#: src/counterexample.c:128
+msgid "Reduce derivation"
+msgstr "Derivação de redução"
+
+#: src/counterexample.c:128
+msgid "Second reduce derivation"
+msgstr "Segunda derivação de redução"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "conflito de deslocamento/redução no token %s"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ":"
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "conflito de redução/redução no token %s"
+msgstr[1] "conflito de redução/redução nos tokens %s"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: não foi possível abrir"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "erro de entrada/saída"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "não foi possível fechar o arquivo"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "recusando a sobrescrever o arquivo de entrada %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "saídas conflitantes para o arquivo %s"
@@ -230,97 +390,97 @@
 msgid "%s: cannot backup"
 msgstr "%s: não foi possível fazer cópia de segurança"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr "colore a saída"
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr "não colore a saída"
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr "colore se o dispositivo de saída for um tty"
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr "QUANDO pode ser um dos seguintes:"
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr "descreve os estados"
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr "completa os conjuntos de itens básicos com seus fechamentos"
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr "associa explicitamente as previsões com os itens"
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 msgid "describe shift/reduce conflicts solving"
 msgstr "descreve a solução de conflitos de deslocamento/redução"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr "inclui todas as informações acima"
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr "desabilita o relatório"
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr "ITENS é uma lista de palavras separadas por vírgulas que pode incluir:"
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 "RASTROS é uma lista de palavras separadas por vírgulas que pode incluir:"
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr "mostra erros com o cursor"
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr "mostra correções legíveis por máquina"
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr "não gera qualquer arquivo"
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr "todos acima"
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr "desabilita todos acima"
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 "RECURSOS é uma lista de palavras separadas por vírgula que pode incluir:"
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Tente \"%s --help\" para mais informações.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Uso: %s [OPÇÃO]... ARQUIVO\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
@@ -330,17 +490,17 @@
 "tabelas de analisadores LALR(1), IELR(1) ou LR(1) canonical.\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Argumentos obrigatórios para opções longas também o são para as curtas.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "O mesmo é verdade para os argumentos opcionais.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -367,7 +527,7 @@
 "  -f, --feature[=RECURSOS]   ativa recursos variados\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -381,7 +541,7 @@
 "      --style=ARQUIVO        colore diagnósticos usando o ARQUIVO CSS\n"
 "\n"
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -414,75 +574,81 @@
 "  -k, --token-table                inclui uma tabela de nomes de tokens\n"
 "  -y, --yacc                       emula o POSIX Yacc\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Arquivos de saída:\n"
-"      --defines[=ARQUIVO]    também produz um arquivo de cabeçalho\n"
-"  -d                         idem, mas sem especificar ARQUIVO (Yacc POSIX)\n"
-"  -r, --report=ITENS         também produz detalhes do autômato\n"
-"      --report-file=ARQUIVO  escreve o relatório para ARQUIVO\n"
-"  -v, --verbose              o mesmo que \"--report=state\"\n"
-"  -b, --file-prefix=PREFIXO  especifica o PREFIXO para os arquivos de saída\n"
-"  -o, --output=ARQUIVO       armazena a saída em ARQUIVO\n"
-"  -g, --graph[=ARQUIVO]      também produz um gráfico do autômato\n"
-"  -x, --xml[=ARQUIVO]        também produz um relatório XML do autômato\n"
+"  -H, --header=ARQUIVO]         também produz um arquivo de cabeçalho\n"
+"  -d                            idem, mas sem especificar ARQUIVO (Yacc "
+"POSIX)\n"
+"  -r, --report=ITENS            também produz detalhes do autômato\n"
+"      --report-file=ARQUIVO     escreve o relatório para ARQUIVO\n"
+"  -v, --verbose                 o mesmo que \"--report=state\"\n"
+"  -b, --file-prefix=PREFIXO     especifica o PREFIXO para os arquivos de "
+"saída\n"
+"  -o, --output=ARQUIVO          armazena a saída em ARQUIVO\n"
+"  -g, --graph[=ARQUIVO]         também produz um gráfico do autômato\n"
+"      --html[=ARQUIVO]          também produz um relatório HTML do autômato\n"
+"  -x, --xml[=ARQUIVO]           também produz um relatório XML do autômato\n"
+"  -M, --file-prefix-map=ANTIGO=NOVO\n"
+"                                substitui prefixo ANTIGO pelo NOVO ao "
+"escrever\n"
+"                                  caminhos de arquivos nos arquivos de "
+"saída\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Relate erros para <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "Página do %s: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
-msgstr "Ajuda geral no uso de software GNU: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
+msgstr "Ajuda geral no uso de software GNU: <https://www.gnu.org/gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
-"Relate erros de tradução para <http://translationproject.org/team/pt_BR."
+"Relate erros de tradução para <https://translationproject.org/team/pt_BR."
 "html>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "Para a documentação completa, execute: info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Escrito por Robert Corbett e Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright © %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -491,36 +657,41 @@
 "NÃO HÁ QUALQUER GARANTIA; nem mesmo para COMERCIALIZAÇÃO ou de ADEQUAÇÃO A\n"
 "QUALQUER PROPÓSITO EM PARTICULAR.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "declarações de múltiplos esqueletos são inválidas"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: linguagem inválida"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "declarações de múltiplas linguagens são inválidas"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, c-format
+msgid "invalid argument for %s: %s"
+msgstr "argumento inválido para %s: %s"
+
+#: src/getargs.c:868
 #, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "opção obsoleta: %s, use %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, c-format
 msgid "missing operand"
 msgstr "faltando operando"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "operando extra %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Gramática"
 
@@ -537,249 +708,303 @@
 "// Site: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+msgid "end of file"
+msgstr "final do arquivo"
+
+#: src/i18n-strings.c:36
+msgid "invalid token"
+msgstr "token inválido"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "estouro do número de linhas"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "sobrecarga de número de colunas"
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
 msgstr "estouro do número de bytes"
 
+# Caractere de reticências "…" atende bem a pt_BR, comumente usado em UTF-8
 #. TRANSLATORS: This is used when a line is too long, and is
 #. displayed truncated.  Use an ellipsis appropriate for your
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr "…"
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "regra inútil no analisador por causa de conflitos"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 "correções podem ser aplicadas. Execute novamente com a opção \"--update\"."
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "variável %%define %s redefinida"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "definição anterior"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: variável %%define indefinida %s"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "variável %%define \"%s\" requer valores \"{...}\""
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "variável %%define \"%s\" requer valores de palavra-chave"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "variável %%define \"%s\" requer valores '\"...\"'"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "valor inválido para variável booleana %%define %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "valor inválido para variável %%define %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "valor aceito: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr "string"
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr "string traduzível"
+
+#: src/parse-gram.y:214
+msgid "[identifier]"
+msgstr "[identificador]"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr "literal de caractere"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr "epílogo"
+
+#: src/parse-gram.y:219
+msgid "identifier"
+msgstr "identificador"
+
+#: src/parse-gram.y:220
+msgid "identifier:"
+msgstr "identificador:"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr "<tag>"
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr "literal de inteiro"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr "literais de caractere não podem ser não-terminais"
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr "literais de caractere não podem ser usados junto com %s"
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, c-format
 msgid "definition of %s"
 msgstr "definição de %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "identificador faltando na declaração do parâmetro"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, c-format
 msgid "invalid version requirement: %s"
 msgstr "requisito de versão inválido: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr "exibe bison %s, mas tem %s"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Estado %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr "%s falhou com status %d"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "deslocar, e ir ao estado %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "ir ao estado %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "erro (não associativo)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "reduzir usando a regra %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "aceitar"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "reduzir usando a regra %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$padrão"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Terminais, com as regras onde eles aparecem"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Não terminais com as regras onde eles aparecem"
 
-#: src/print.c:416
+#: src/print.c:431
 msgid "on left:"
 msgstr "à esquerda:"
 
-#: src/print.c:425
+#: src/print.c:440
 msgid "on right:"
 msgstr "à direita:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Regras inúteis no analisador por causa de conflitos"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "declarações de %s múltiplas"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "tipo de resultado conflita na função de mescla %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "nome de símbolo duplicado por %s ignorado"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "regra fornecida para %s, que é um token"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "conflito de tipos na ação padrão: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "regra vazia para um não-terminal com tipo, e não há ações"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "valor inútil: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "valor desconfigurado: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty em regra não vazia"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "regra vazia sem %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "token para %%prec não está definido: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr "apenas ações midrule podem sr digitadas: %s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s afeta apenas analisadores GLR"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s deve ser seguido por um número positivo"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr "POSIX Yacc não possui suporte às ações midrule digitadas"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "a regra é longa demais"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "o símbolo de início %s não está definido"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "o símbolo de início %s é um token"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "não há regras na gramática de entrada"
@@ -788,369 +1013,376 @@
 msgid "rule useless in grammar"
 msgstr "regra inútil na gramática"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "não terminal inútil na gramática: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Não terminais inúteis na gramática"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Terminais sem uso na gramática"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Regras inúteis na gramática"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d não-terminal inútil na gramática"
 msgstr[1] "%d não-terminais inúteis na gramática"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d regra inútil na gramática"
 msgstr[1] "%d regras inúteis na gramática"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "símbolo inicial %s não deriva nenhuma sentença"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "\"%s\" perdido"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "refere-se a: %c%s em %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "possível significado: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", ocultando %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " em %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", não foi possível ser acessada da ação midrule em $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "inteiro fora de faixa: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "referência inválida: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 "erro de sintaxe após \"%c\", esperava inteiro, letra, \"_\", \"[\" ou \"$\""
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "símbolo não encontrado em produção antes de $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "símbolo não encontrado em produção: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "referência enganadora: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "referência ambígua: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "tipo explícito fornecido é uma gramática sem tipo"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ para a midrule em $%d de %s não possui tipo declarado"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ de %s não possui um tipo declarado"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s de %s não possui um tipo declarado"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr "múltiplas ocorrências de $%d com api.value.automove"
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "número inválido após escape \\: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "\",\" perdida tratada como branco"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "diretiva inválida: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "identificador inválido: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "caractere inválido"
 msgstr[1] "caracteres inválidos"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "caractere nulo inválido"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "identificador inesperado em nome entre chaves: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "um identificador esperado"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "caractere inválido em nome entre chaves"
 msgstr[1] "caracteres inválidos em nome entre chaves"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr "POSIX Yacc não possui suporte a literais de string"
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "literal de caractere vazio"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "caracteres extras em literal de caractere"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "número inválido após escape \\: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "caractere inválido após escape \\: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr "POSIX Yacc não possui suporte a literais de hexadecimal"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "faltando %s no final do arquivo"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "faltando %s no final da linha"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "diretiva não fechada %s no esqueleto"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "número insuficiente de argumentos para a diretiva %s no esqueleto"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "argumentos demais para diretiva %s no esqueleto"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc proíbe traços em nomes de símbolos: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "símbolos demais na gramática de entrada (limite é %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "redeclaração de %s para %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "redeclaração de %s para <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "símbolo %s redeclarado como um token"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "símbolo %s redeclarado como um não-terminal"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
 "mean %s?"
 msgstr ""
-"símbolo %s usado, mas não definido como uma token e não tem regras; você "
-"quis dizer %s?"
+"símbolo %s usado, mas não definido como um token e não tem regras; você quis "
+"dizer %s?"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
-msgstr "símbolo %s usado, mas não definido como uma token e não tem regras"
+msgstr "símbolo %s usado, mas não definido como um token e não tem regras"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr "POSIX yacc reserva %%type para não-terminais"
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "símbolo %s redeclarado"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
-msgstr "não-terminais não podem ser fornecidos como um número explícito"
+msgid "nonterminals cannot be given a token code"
+msgstr "não-terminais não podem ser fornecidos como um código de token"
 
-#: src/symtab.c:575
+#: src/symtab.c:594
 #, c-format
-msgid "redefining user token number of %s"
-msgstr "redefinindo número de token de usuário de %s"
+msgid "redefining code of token %s"
+msgstr "redefinindo código de token %s"
 
-#: src/symtab.c:578
+#: src/symtab.c:597
 #, c-format
-msgid "user token number of %s too large"
-msgstr "número de token de usuário de %s grande demais"
+msgid "code of token %s too large"
+msgstr "código de token %s grande demais"
 
-#: src/symtab.c:617
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr "literal de strings %s não anexado a um símbolo"
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "%s inútil para o tipo <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "tipo <%s> usado, mas associado a nenhum símbolo"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr "não-terminais não podem ser fornecidos como um alias de string"
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "símbolo %s usado mais de uma vez como uma string literal"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "símbolo %s associado a mais de uma string literal"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "token de usuário de número %d com redeclaração para %s"
+msgid "code %d reassigned to token %s"
+msgstr "código %d reatribuído para token %s"
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "declaração anterior para %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr "número de token grande demais"
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "o símbolo de início %s não está definido"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "o símbolo de início %s é um terminal"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "precedência e associatividade inúteis para %s"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "precedência inútil para %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "associatividade inútil para %s, use %%precedence"
 
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#~ msgid "multiple %s declarations"
+#~ msgstr "declarações de %s múltiplas"
+
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "símbolos demais na gramática de entrada (limite é %d)"
+
+#~ msgid ""
+#~ "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e or %6e "
+#~ "before %u"
+#~ msgstr ""
+#~ "%@: erro de sintaxe: esperava-se %0e ou %1e ou %2e ou %3e ou %4e ou %5e "
+#~ "ou %6e antes de %u"
+
+#~ msgid "nonterminals cannot be given an explicit number"
+#~ msgstr "não-terminais não podem ser fornecidos como um número explícito"
+
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "token de usuário de número %d com redeclaração para %s"
+
 #~ msgid "deprecated directive, use %s"
 #~ msgstr "diretiva obsoleta, use %s"
 
@@ -1231,9 +1463,6 @@
 #~ "    desabilita todos acima\n"
 #~ "  "
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "argumento inválido %s para %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "argumento ambíguo %s para %s"
 
@@ -1511,6 +1740,3 @@
 
 #~ msgid "subsidiary program `%s' could not be invoked"
 #~ msgstr "programa subsidiário `%s' não pôde ser invocado"
-
-#~ msgid "subsidiary program `%s' failed (exit status %d)"
-#~ msgstr "programa subsidiário `%s' falhou (estado de saída %d)"
diff --git a/po/ro.gmo b/po/ro.gmo
index 17cc3bb..408b465 100644
--- a/po/ro.gmo
+++ b/po/ro.gmo
Binary files differ
diff --git a/po/ro.po b/po/ro.po
index 9302aae..38db535 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: bison 2.0a\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2005-06-03 12:00-0500\n"
 "Last-Translator: Laurentiu Buzdugan <lbuz@rolix.org>\n"
 "Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
@@ -20,205 +20,377 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "caracter invalid: %s"
+
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "eroare fatală: "
+
+#: examples/c/bistromathic/parse.y:390
+#, fuzzy
+msgid "%@: syntax error: unexpected %u"
+msgstr "eroare de sintaxă, %s neaşteptat, aştept %s"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+#, fuzzy
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "eroare de sintaxă, %s neaşteptat, aştept %s"
+
+#: examples/c/bistromathic/parse.y:399
+#, fuzzy
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "eroare de sintaxă, %s neaşteptat, aştept %s sau %s sau %s"
+
+#: examples/c/bistromathic/parse.y:400
+#, fuzzy
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "eroare de sintaxă, %s neaşteptat, aştept %s sau %s sau %s"
+
+#: examples/c/bistromathic/parse.y:401
+#, fuzzy
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr "eroare de sintaxă, %s neaşteptat, aştept %s sau %s sau %s"
+
+#: examples/c/bistromathic/parse.y:402
+#, fuzzy
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr "eroare de sintaxă, %s neaşteptat, aştept %s sau %s sau %s"
+
+#: examples/c/bistromathic/parse.y:403
+#, fuzzy
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr "eroare de sintaxă, %s neaşteptat, aştept %s sau %s sau %s sau %s"
+
+#: examples/c/bistromathic/parse.y:404
+#, fuzzy
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr "eroare de sintaxă, %s neaşteptat, aştept %s sau %s sau %s sau %s"
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "`%s' lipsă la sfârşitul fişierului"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr ""
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, c-format
 msgid "empty rules without %empty"
 msgstr ""
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr ""
 
-#: src/complain.c:120
+#: src/complain.c:160
 msgid "useless precedence and associativity"
 msgstr ""
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr ""
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr ""
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr ""
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr ""
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "avertisment"
 
-#: src/complain.c:258
+#: src/complain.c:299
 #, fuzzy
 msgid "error"
 msgstr "Eroare I/O"
 
-#: src/complain.c:260
+#: src/complain.c:301
 #, fuzzy
 msgid "fatal error"
 msgstr "eroare fatală: "
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr ""
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, fuzzy, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "directivă invalidă: %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, fuzzy, c-format
 msgid "duplicate directive"
 msgstr "directivă invalidă: %s"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, fuzzy, c-format
 msgid "duplicate directive: %s"
 msgstr "directivă invalidă: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, fuzzy, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
+#, fuzzy
 msgid "previous declaration"
 msgstr "prima declaraţie"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "un singur %s permis pe fiecare regulă"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+#, fuzzy
+msgid "syntax error"
+msgstr "eroare fatală: "
+
+#: src/complain.c:648
+#, fuzzy
+msgid "unexpected %0$s"
+msgstr "eroare de sintaxă, %s neaşteptat"
+
+#: src/complain.c:649
+#, fuzzy
+msgid "expected %1$s before %0$s"
+msgstr "eroare de sintaxă, %s neaşteptat, aştept %s sau %s sau %s sau %s"
+
+#: src/complain.c:650
+#, fuzzy
+msgid "expected %1$s or %2$s before %0$s"
+msgstr "eroare de sintaxă, %s neaşteptat, aştept %s sau %s sau %s sau %s"
+
+#: src/complain.c:651
+#, fuzzy
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr "eroare de sintaxă, %s neaşteptat, aştept %s sau %s sau %s sau %s"
+
+#: src/complain.c:652
+#, fuzzy
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr "eroare de sintaxă, %s neaşteptat, aştept %s sau %s sau %s sau %s"
+
+#: src/conflicts.c:88
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "    Conflict între regula %d şi elementul (token) %s rezolvat ca shift"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr ""
 "    Conflict între regula %d şi elementul (token) %s rezolvat ca reduce"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr ""
 "    Conflict între regula %d şi elementul (token) %s rezolvat ca eroare"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Stare %d"
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "conflicte: %d shift/reduce, %d reduce/reduce\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "conflicte: %d shift/reduce\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "conflicte: %d reduce/reduce\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%% expect-rr poate fi folosit numai pentru parsere GLR"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, fuzzy, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "am aşteptat %d conflict shift/reduce"
 msgstr[1] "am aşteptat %d conflicte shift/reduce"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, fuzzy, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "am aşteptat %d conflict reduce/reduce"
 msgstr[1] "am aşteptat %d conflicte reduce/reduce"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "prima declaraţie"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "prima declaraţie"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "prima declaraţie"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "prima declaraţie"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "am aşteptat %d conflict shift/reduce"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "am aşteptat %d conflict reduce/reduce"
+msgstr[1] "am aşteptat %d conflicte reduce/reduce"
+
+#: src/files.c:144
 #, fuzzy, c-format
 msgid "%s: cannot open"
 msgstr "nu am putut deschide fişierul `%s'"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr ""
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "nu pot închide fişierul"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr ""
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "ieşiri în conflict în fişierul %s"
@@ -228,112 +400,112 @@
 msgid "%s: cannot backup"
 msgstr "nu am putut deschide fişierul `%s'"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr ""
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr ""
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr ""
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 #, fuzzy
 msgid "describe shift/reduce conflicts solving"
 msgstr "am aşteptat %d conflict shift/reduce"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr ""
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr ""
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr ""
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr ""
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, fuzzy, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Încercaţi `%s --help' pentru informaţii suplimentare.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Folosire: %s [OPŢIUNE]... FIŞIER\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
 "\n"
 msgstr ""
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr ""
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -349,7 +521,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -358,7 +530,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, fuzzy, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -384,20 +556,24 @@
 "  -n, --no-parser            generează numai tabelele\n"
 "  -k, --token-table          include un tabel cu nume de elemente\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Ieşire:\n"
 "  -d, --defines              crează şi un fişier header\n"
@@ -407,48 +583,42 @@
 "  -o, --output=FIŞIER        crează ieşire în FIŞIER\n"
 "  -g, --graph                crează şi o descriere VCG a automaton-ului\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, fuzzy, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Raportaţi bug-uri la <bug-bison@gnu.org>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr ""
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr ""
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Scris de Robert Corbett şi Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -459,37 +629,42 @@
 "POTRIVIRE\n"
 "PENTRU UN SCOP ANUME.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, fuzzy, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "declaraţii %s multiple"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, fuzzy, c-format
 msgid "%s: invalid language"
 msgstr "valoare $ invalidă"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 #, fuzzy
 msgid "multiple language declarations are invalid"
 msgstr "declaraţii %s multiple"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, fuzzy, c-format
+msgid "invalid argument for %s: %s"
+msgstr "argument invalid %s pentru %s"
+
+#: src/getargs.c:868
 #, fuzzy, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "directivă invalidă: %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, fuzzy, c-format
 msgid "missing operand"
 msgstr "operator lipsă după `%s'"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, fuzzy, c-format
 msgid "extra operand %s"
 msgstr "extra operator `%s'"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Gramatică"
 
@@ -502,17 +677,27 @@
 "\n"
 msgstr ""
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+#, fuzzy
+msgid "end of file"
+msgstr "`%s' lipsă la sfârşitul fişierului"
+
+#: src/i18n-strings.c:36
+#, fuzzy
+msgid "invalid token"
+msgstr "caracter invalid: %s"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr ""
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr ""
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
 msgstr ""
@@ -522,233 +707,281 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr ""
 
-#: src/main.c:155
+#: src/main.c:172
 #, fuzzy
 msgid "rule useless in parser due to conflicts"
 msgstr "regula nu este redusă niciodată din cauza conflictelor"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, fuzzy, c-format
 msgid "%%define variable %s redefined"
 msgstr "simbol %s redefinit"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr ""
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr ""
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "simbol %s redefinit"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "simbol %s redefinit"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "simbol %s redefinit"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr ""
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr ""
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, fuzzy, c-format
 msgid "accepted value: %s"
 msgstr "valoare invalidă: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr ""
+
+#: src/parse-gram.y:214
+#, fuzzy
+msgid "[identifier]"
+msgstr "directivă invalidă: %s"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr ""
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+#, fuzzy
+msgid "identifier"
+msgstr "directivă invalidă: %s"
+
+#: src/parse-gram.y:220
+#, fuzzy
+msgid "identifier:"
+msgstr "directivă invalidă: %s"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr ""
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr ""
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr ""
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, fuzzy, c-format
 msgid "definition of %s"
 msgstr "numărul elementului (token) definit de utilizator redefinit pentru %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "identificator lipsă în declaraţia parametrului"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, fuzzy, c-format
 msgid "invalid version requirement: %s"
 msgstr "secvenţă escape invalidă: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr ""
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, fuzzy, c-format
 msgid "State %d"
 msgstr "Stare %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, fuzzy, c-format
+msgid "%s failed with status %d"
+msgstr "programul auxiliar `%s' a eşuat (stare de terminare %d)"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "shift, şi mergi în starea %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "mergi în starea %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "eroare (ne-asociativitate)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "reduce folosind regula %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "accept"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "reduce folosind regula %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$implicit"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Terminale, cu reguli acolo unde acestea apar"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Non-terminale, cu reguli acolo unde acestea apar"
 
-#: src/print.c:416
+#: src/print.c:431
 #, fuzzy
 msgid "on left:"
 msgstr " pe stânga:"
 
-#: src/print.c:425
+#: src/print.c:440
 #, fuzzy
 msgid "on right:"
 msgstr " pe dreapta:"
 
-#: src/print.c:447
+#: src/print.c:462
 #, fuzzy
 msgid "Rules useless in parser due to conflicts"
 msgstr "regula nu este redusă niciodată din cauza conflictelor"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "declaraţii %s multiple"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr ""
 "tipul rezultatului în conflict cu funcţia de combinare %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr ""
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "regula dată pentru %s, care este un element (token)"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "conflict de tip pentru acţiunea implicită: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "regulă vidă pentru nonterminal cu tip, şi nici o acţiune"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, fuzzy, c-format
 msgid "unused value: $%d"
 msgstr "valoare invalidă: %s"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr ""
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr ""
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr ""
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr ""
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr ""
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s afectează numai parsere GLR"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s trebuie să fie urmat de numere pozitive"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr ""
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr ""
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "simbolul de start %s nu este definit"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "simbolul de start %s este un element (token)"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "nici o regulă în gramatica furnizată"
@@ -758,265 +991,260 @@
 msgid "rule useless in grammar"
 msgstr "nici o regulă în gramatica furnizată"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr ""
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 #, fuzzy
 msgid "Nonterminals useless in grammar"
 msgstr "Non-terminale, cu reguli acolo unde acestea apar"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 #, fuzzy
 msgid "Terminals unused in grammar"
 msgstr "nici o regulă în gramatica furnizată"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 #, fuzzy
 msgid "Rules useless in grammar"
 msgstr "nici o regulă în gramatica furnizată"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, fuzzy, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "nici o regulă în gramatica furnizată"
 msgstr[1] "nici o regulă în gramatica furnizată"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "simbol de start %s nu derivează nici o propoziţie"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr ""
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr ""
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr ""
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ""
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr ""
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ""
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "întreg în afara domeniului: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, fuzzy, c-format
 msgid "invalid reference: %s"
 msgstr "directivă invalidă: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr ""
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr ""
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr ""
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, fuzzy, c-format
 msgid "ambiguous reference: %s"
 msgstr "argument ambiguu %s pentru %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr ""
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, fuzzy, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$%d a lui `%s' nu are nici un tip declarat"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, fuzzy, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ a lui `%s' nu are nici un tip declarat"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, fuzzy, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%d a lui `%s' nu are nici un tip declarat"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr ""
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, fuzzy, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "caracter null invalid: %s"
+
+#: src/scan-gram.l:214
 #, fuzzy, c-format
 msgid "stray ',' treated as white space"
 msgstr "Virgulă `,' rătăcită tratată ca spaţiu gol"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "directivă invalidă: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, fuzzy, c-format
 msgid "invalid identifier: %s"
 msgstr "directivă invalidă: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 #, fuzzy
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "caracter invalid: %s"
 msgstr[1] "caracter invalid: %s"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "caracter null invalid"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr ""
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr ""
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 #, fuzzy
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "caracter invalid: %s"
 msgstr[1] "caracter invalid: %s"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr ""
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr ""
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr ""
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, fuzzy, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "caracter null invalid: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, fuzzy, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "caracter invalid: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr ""
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, fuzzy, c-format
 msgid "missing %s at end of file"
 msgstr "`%s' lipsă la sfârşitul fişierului"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, fuzzy, c-format
 msgid "missing %s at end of line"
 msgstr "`%s' lipsă la sfârşitul liniei"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr ""
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr ""
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr ""
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr ""
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "prea multe simboluri în gramatica de intrare (limita este %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "redeclarare %s pentru %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, fuzzy, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "redeclarare %s pentru %s"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "simbol %s redefinit"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "%d nonterminal fără rost"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, fuzzy, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1025,110 +1253,116 @@
 "simbolul %s e folosit, dar nu este definit ca element (token) şi nu are nici "
 "o regulă"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "simbolul %s e folosit, dar nu este definit ca element (token) şi nu are nici "
 "o regulă"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, fuzzy, c-format
 msgid "symbol %s redeclared"
 msgstr "simbol %s redefinit"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
+msgid "nonterminals cannot be given a token code"
 msgstr ""
 
-#: src/symtab.c:575
-#, c-format
-msgid "redefining user token number of %s"
-msgstr "numărul elementului (token) definit de utilizator redefinit pentru %s"
-
-#: src/symtab.c:578
+#: src/symtab.c:594
 #, fuzzy, c-format
-msgid "user token number of %s too large"
+msgid "redefining code of token %s"
 msgstr "numărul elementului (token) definit de utilizator redefinit pentru %s"
 
-#: src/symtab.c:617
+#: src/symtab.c:597
+#, fuzzy, c-format
+msgid "code of token %s too large"
+msgstr "numărul elementului (token) definit de utilizator redefinit pentru %s"
+
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr ""
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, fuzzy, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr ""
 "simbolul %s e folosit, dar nu este definit ca element (token) şi nu are nici "
 "o regulă"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr ""
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, fuzzy, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "simbolul `%s' este folosit de mai multe ori ca şir literar"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, fuzzy, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "simbolului `%s' îi este dat mai mult de un singur şir literar"
 
-#: src/symtab.c:736
-#, fuzzy, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "redeclarare %s pentru %s"
+#: src/symtab.c:752
+#, c-format
+msgid "code %d reassigned to token %s"
+msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, fuzzy, c-format
 msgid "previous declaration for %s"
 msgstr "redeclarare %s pentru %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr ""
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "simbolul de start %s nu este definit"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "simbolul de start %s este un element (token)"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr ""
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr ""
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr ""
 
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "declaraţii %s multiple"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "prea multe simboluri în gramatica de intrare (limita este %d)"
+
+#, fuzzy
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "redeclarare %s pentru %s"
+
 #, fuzzy
 #~ msgid "eliminate useless chain rules"
 #~ msgstr "Non-terminale, cu reguli acolo unde acestea apar"
@@ -1156,9 +1390,6 @@
 #~ "  `all'          include toată informaţia de mai sus\n"
 #~ "  `none'         deactivează raportarea\n"
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "argument invalid %s pentru %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "argument ambiguu %s pentru %s"
 
@@ -1286,26 +1517,6 @@
 #~ msgstr "Nu am putut deschide fişierul de statistici pentru scriere."
 
 #, fuzzy
-#~| msgid "missing `%s' at end of file"
-#~ msgid "end \"ABC\" of file"
-#~ msgstr "`%s' lipsă la sfârşitul fişierului"
-
-#, fuzzy
-#~| msgid "invalid directive: %s"
-#~ msgid "[identifier]"
-#~ msgstr "directivă invalidă: %s"
-
-#, fuzzy
-#~| msgid "invalid directive: %s"
-#~ msgid "identifier"
-#~ msgstr "directivă invalidă: %s"
-
-#, fuzzy
-#~| msgid "invalid directive: %s"
-#~ msgid "identifier:"
-#~ msgstr "directivă invalidă: %s"
-
-#, fuzzy
 #~| msgid "symbol %s redefined"
 #~ msgid "symbol %s redefined"
 #~ msgstr "simbol %s redefinit"
@@ -1387,21 +1598,9 @@
 #~ msgid "POSIX forbids declarations in the grammar"
 #~ msgstr "POSIX interzice declaraţii în gramatică"
 
-#~ msgid "syntax error, unexpected %s"
-#~ msgstr "eroare de sintaxă, %s neaşteptat"
-
-#~ msgid "syntax error, unexpected %s, expecting %s"
-#~ msgstr "eroare de sintaxă, %s neaşteptat, aştept %s"
-
 #~ msgid "syntax error, unexpected %s, expecting %s or %s"
 #~ msgstr "eroare de sintaxă, %s neaşteptat, aştept %s sau %s"
 
-#~ msgid "syntax error, unexpected %s, expecting %s or %s or %s"
-#~ msgstr "eroare de sintaxă, %s neaşteptat, aştept %s sau %s sau %s"
-
-#~ msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
-#~ msgstr "eroare de sintaxă, %s neaşteptat, aştept %s sau %s sau %s sau %s"
-
 #~ msgid "syntax error; also memory exhausted"
 #~ msgstr "eroare de sintaxă şi memorie epuizată"
 
@@ -1479,9 +1678,6 @@
 #~ msgid "subsidiary program `%s' could not be invoked"
 #~ msgstr "programul auxiliar `%s' nu poate fi invocat"
 
-#~ msgid "subsidiary program `%s' failed (exit status %d)"
-#~ msgstr "programul auxiliar `%s' a eşuat (stare de terminare %d)"
-
 #~ msgid " TOTAL                 :"
 #~ msgstr " TOTAL                 :"
 
diff --git a/po/ru.gmo b/po/ru.gmo
index 57ab65e..3044a88 100644
--- a/po/ru.gmo
+++ b/po/ru.gmo
Binary files differ
diff --git a/po/ru.po b/po/ru.po
index 7efd8f1..18a4683 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: bison 2.4.1\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2009-02-04 19:44+0200\n"
 "Last-Translator: Pavel Maryanov <acid_jack@ukr.net>\n"
 "Language-Team: Russian <gnu@mx.ru>\n"
@@ -22,164 +22,269 @@
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "недопустимый символ: %s"
+
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "фатальная ошибка"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr ""
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "неожиданный конец файла"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr ""
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, c-format
 msgid "empty rules without %empty"
 msgstr ""
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr ""
 
-#: src/complain.c:120
+#: src/complain.c:160
 #, fuzzy
 msgid "useless precedence and associativity"
 msgstr "переопределение приоритета для %s"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr ""
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr ""
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr ""
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr ""
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "предупреждение"
 
-#: src/complain.c:258
+#: src/complain.c:299
 #, fuzzy
 msgid "error"
 msgstr "ошибка ввода-вывода"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "фатальная ошибка"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr ""
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, fuzzy, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "неверная директива: %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, fuzzy, c-format
 msgid "duplicate directive"
 msgstr "неверная директива: %s"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, fuzzy, c-format
 msgid "duplicate directive: %s"
 msgstr "неверная директива: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "предыдущее описание"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "только одно %s разрешено на правило"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+#, fuzzy
+msgid "syntax error"
+msgstr "фатальная ошибка"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr ""
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr ""
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr ""
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr ""
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr ""
+
+#: src/conflicts.c:88
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "    Конфликт между правилом %d и лексемой %s разрешен сдвигом"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr "    Конфликт между правилом %d и лексемой %s разрешен выводом"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "    Конфликт между правилом %d и лексемой %s разрешен как ошибка"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Состояние %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "конфликты: %d сдвига/вывода, %d вывода/вывода\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "конфликты: %d сдвига/вывода\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "конфликты: %d вывода/вывода\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, fuzzy, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "%d конфликт сдвига/вывода"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, fuzzy, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "%d конфликт сдвига/вывода"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr применимо только к GLR парсерам"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, fuzzy, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "%d конфликт сдвига/вывода"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
@@ -187,12 +292,12 @@
 msgstr[1] "%d конфликта сдвига/вывода"
 msgstr[2] "%d конфликтов сдвига/вывода"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr ""
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, fuzzy, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
@@ -200,27 +305,81 @@
 msgstr[1] "ожидалось %d конфликта вывода/вывода"
 msgstr[2] "ожидалось %d конфликтов вывода/вывода"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "предыдущее описание"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "предыдущее описание"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "предыдущее описание"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "предыдущее описание"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "%d конфликт сдвига/вывода"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "ожидался %d конфликт вывода/вывода"
+msgstr[1] "ожидалось %d конфликта вывода/вывода"
+msgstr[2] "ожидалось %d конфликтов вывода/вывода"
+
+#: src/files.c:144
 #, fuzzy, c-format
 msgid "%s: cannot open"
 msgstr "не удается открыть файл «%s»"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr ""
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "не удается закрыть файл"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "отказ перезаписи входного файла %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "конфликт вывода в файл %s"
@@ -230,112 +389,112 @@
 msgid "%s: cannot backup"
 msgstr "не удается открыть файл «%s»"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr ""
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr ""
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr ""
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 #, fuzzy
 msgid "describe shift/reduce conflicts solving"
 msgstr "%d конфликт сдвига/вывода"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr ""
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr ""
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr ""
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr ""
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, fuzzy, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Используйте «%s --help» для дополнительной информации.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Использование: %s [КЛЮЧИ]... ФАЙЛ\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
 "\n"
 msgstr ""
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr "Соответствующие длянные опции также соответствуют и коротким опциям.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "То-же допустимо для опциональных параметров.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 #, fuzzy
 msgid ""
 "Operation Modes:\n"
@@ -363,7 +522,7 @@
 "КАТЕГОРИЕЙ\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -372,7 +531,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, fuzzy, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -400,20 +559,24 @@
 "  -k, --token-table          включить таблицу имен лексем\n"
 "\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Вывод:\n"
 "      --defines[=ФАЙЛ]       создать также файл заголовков\n"
@@ -429,50 +592,44 @@
 "                             (сценарий XML - эксперементальный)\n"
 "\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, fuzzy, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr ""
 "\n"
 "Ошибки сообщайте по адресу <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr ""
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr ""
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Авторы: Роберт Корбет и Ричард Столмен.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -483,36 +640,41 @@
 "ПРИГОДНОСТИ\n"
 "ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "множественные описания скелета не применимо"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, fuzzy, c-format
 msgid "%s: invalid language"
 msgstr "недопустимый язык «%s»"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "множественные описания языка не применимо"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, fuzzy, c-format
+msgid "invalid argument for %s: %s"
+msgstr "недопустимый аргумент %s для %s"
+
+#: src/getargs.c:868
 #, fuzzy, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "неверная директива: %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, fuzzy, c-format
 msgid "missing operand"
 msgstr "после «%s» пропущен операнд"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, fuzzy, c-format
 msgid "extra operand %s"
 msgstr "лишний операнд «%s»"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Грамматика"
 
@@ -525,17 +687,27 @@
 "\n"
 msgstr ""
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+#, fuzzy
+msgid "end of file"
+msgstr "неожиданный конец файла"
+
+#: src/i18n-strings.c:36
+#, fuzzy
+msgid "invalid token"
+msgstr "недопустимый символ: %s"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "переполнение номера строки"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "переполнение номера столбца"
 
-#: src/location.c:155
+#: src/location.c:143
 #, fuzzy, c-format
 msgid "byte number overflow"
 msgstr "переполнение номера строки"
@@ -545,231 +717,282 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr ""
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "правило не применимо в парсере из-за конфликтов"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, fuzzy, c-format
 msgid "%%define variable %s redefined"
 msgstr "повторное определение символа %s"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, fuzzy, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
+#, fuzzy
 msgid "previous definition"
 msgstr "предыдущее описание"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr ""
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "повторное определение символа %s"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "повторное определение символа %s"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "повторное определение символа %s"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr ""
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr ""
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, fuzzy, c-format
 msgid "accepted value: %s"
 msgstr "неиспользуемая переменная: $%d"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+#, fuzzy
+msgid "translatable string"
+msgstr "незаконченная строка"
+
+#: src/parse-gram.y:214
+#, fuzzy
+msgid "[identifier]"
+msgstr "неверная директива: %s"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr ""
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+#, fuzzy
+msgid "identifier"
+msgstr "неверная директива: %s"
+
+#: src/parse-gram.y:220
+#, fuzzy
+msgid "identifier:"
+msgstr "неверная директива: %s"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr ""
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr ""
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr ""
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, fuzzy, c-format
 msgid "definition of %s"
 msgstr "переопределение номера лексемы пользователя для %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "в описании параметра отсутствует идентификатор"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, fuzzy, c-format
 msgid "invalid version requirement: %s"
 msgstr "недопустимая экранирующая последовательность: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr ""
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, fuzzy, c-format
 msgid "State %d"
 msgstr "Состояние %d "
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, fuzzy, c-format
+msgid "%s failed with status %d"
+msgstr ""
+"вспомогательная программа `%s' завершилась неудачно (код завершения %d)"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "сдвиг, и переход в состояние %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "переход в состояние %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "ошибка (неассоциативная)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "вывод с использованием правила %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "принять"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "вывод с использованием правила %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Терминальные символы с правилами, в которых они появляются"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Нетерминальные символы с правилами, в которых они появляются"
 
-#: src/print.c:416
+#: src/print.c:431
 #, fuzzy
 msgid "on left:"
 msgstr " налево:"
 
-#: src/print.c:425
+#: src/print.c:440
 #, fuzzy
 msgid "on right:"
 msgstr " направо:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Правило не применимо в парсере из-за конфликтов"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "множественное описание %s"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, fuzzy, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "конфликт типов результата при слиянии функции «%s»: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr ""
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "правило задано для %s, который является лексемой"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "конфликт типов на действии по умолчанию: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr ""
 "пустое правило для типизированного нетерминального символа, и нет действия"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "неиспользуемая переменная: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "неуказанное значение: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr ""
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr ""
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr ""
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr ""
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s влияет только на GLR парсеры"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "за %s должно следовать положительное число"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr ""
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "слишком длинное правило"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "начальный символ %s не определен"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "начальный символ %s является лексемой"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "отсутствуют правила во входной грамматике"
@@ -778,24 +1001,24 @@
 msgid "rule useless in grammar"
 msgstr "бесполезное правило в грамматике"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "нетерминал бесполезен в грамматике: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Нетерминал бесполезен в грамматике"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Терминалы не используются в грамматике"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Правила не используются в грамматике"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
@@ -803,7 +1026,7 @@
 msgstr[1] "%d нетерминала бесполезно в грамматике"
 msgstr[2] "%d нетерминалов бесполезно в грамматике"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
@@ -811,117 +1034,122 @@
 msgstr[1] "%d правила бесполезно в грамматике"
 msgstr[2] "%d правила бесполезно в грамматике"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "начальный символ %s не выводит ни одного предложения"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, fuzzy, c-format
 msgid "stray '%s'"
 msgstr "некорректный «$»"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr ""
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr ""
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ""
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr ""
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ""
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "выход за границы диапазона целого: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, fuzzy, c-format
 msgid "invalid reference: %s"
 msgstr "неверная директива: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr ""
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr ""
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, fuzzy, c-format
 msgid "misleading reference: %s"
 msgstr "переопределение приоритета для %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, fuzzy, c-format
 msgid "ambiguous reference: %s"
 msgstr "неоднозначный аргумент %s для %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "указан тип в нетипизированной грамматике"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, fuzzy, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ для правила $%d из «%s» не имеет описанного типа"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, fuzzy, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ в «%s» не имеет описанного типа"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, fuzzy, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%d из «%s» не имеет описанного типа"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr ""
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, fuzzy, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "недопустимый нулевой символ: %s"
+
+#: src/scan-gram.l:214
 #, fuzzy, c-format
 msgid "stray ',' treated as white space"
 msgstr "лишняя «,» считается пробелом"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "неверная директива: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, fuzzy, c-format
 msgid "invalid identifier: %s"
 msgstr "неверная директива: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 #, fuzzy
 msgid "invalid character"
 msgid_plural "invalid characters"
@@ -929,22 +1157,22 @@
 msgstr[1] "недопустимый символ: %s"
 msgstr[2] "недопустимый символ: %s"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "недопустимый нулевой символ"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, fuzzy, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "неожиданный элемент: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr ""
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 #, fuzzy
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
@@ -952,198 +1180,194 @@
 msgstr[1] "недопустимый символ: %s"
 msgstr[2] "недопустимый символ: %s"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr ""
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr ""
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr ""
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, fuzzy, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "недопустимый нулевой символ: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, fuzzy, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "недопустимый символ: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr ""
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, fuzzy, c-format
 msgid "missing %s at end of file"
 msgstr "отсутствует «%s» в конце файла"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, fuzzy, c-format
 msgid "missing %s at end of line"
 msgstr "отсутствует «%s» в конце строки"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr ""
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr ""
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr ""
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr ""
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "слишком много символов во входящей грамматике (максимально %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "повторное описание %s для %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s повторно описан для <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "переопределение символа %s"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "переопределение символа %s"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, fuzzy, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
 "mean %s?"
 msgstr "символ %s используется, но не определен как лексема и не имеет правил"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr "символ %s используется, но не определен как лексема и не имеет правил"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "переопределение символа %s"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
+msgid "nonterminals cannot be given a token code"
 msgstr ""
 
-#: src/symtab.c:575
-#, c-format
-msgid "redefining user token number of %s"
-msgstr "переопределение номера лексемы пользователя для %s"
-
-#: src/symtab.c:578
+#: src/symtab.c:594
 #, fuzzy, c-format
-msgid "user token number of %s too large"
+msgid "redefining code of token %s"
 msgstr "переопределение номера лексемы пользователя для %s"
 
-#: src/symtab.c:617
+#: src/symtab.c:597
+#, fuzzy, c-format
+msgid "code of token %s too large"
+msgstr "переопределение номера лексемы пользователя для %s"
+
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr ""
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, fuzzy, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "символ %s используется, но не определен как лексема и не имеет правил"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr ""
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, fuzzy, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "символ «%s» используется более одного раза как строка литерала"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, fuzzy, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "символ «%s» указан более одной строки литерала"
 
-#: src/symtab.c:736
-#, fuzzy, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "повторное описание типа для %s"
+#: src/symtab.c:752
+#, c-format
+msgid "code %d reassigned to token %s"
+msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, fuzzy, c-format
 msgid "previous declaration for %s"
 msgstr "предыдущее описание"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr ""
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "начальный символ %s не определен"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "начальный символ %s является лексемой"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr ""
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, fuzzy, c-format
 msgid "useless precedence for %s"
 msgstr "переопределение приоритета для %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr ""
 
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "множественное описание %s"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "слишком много символов во входящей грамматике (максимально %d)"
+
+#, fuzzy
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "повторное описание типа для %s"
+
 #, fuzzy
 #~ msgid "eliminate useless chain rules"
 #~ msgstr "нетерминал бесполезен в грамматике: %s"
@@ -1195,9 +1419,6 @@
 #~ "  «all»          включить всю эту информацию\n"
 #~ "  «none»         отключить отчет\n"
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "недопустимый аргумент %s для %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "неоднозначный аргумент %s для %s"
 
@@ -1325,31 +1546,6 @@
 #~ msgstr "Не удается открыть файл статистики для записи."
 
 #, fuzzy
-#~| msgid "unexpected end of file"
-#~ msgid "end \"ABC\" of file"
-#~ msgstr "неожиданный конец файла"
-
-#, fuzzy
-#~| msgid "unterminated string"
-#~ msgid "translatable string"
-#~ msgstr "незаконченная строка"
-
-#, fuzzy
-#~| msgid "invalid directive: %s"
-#~ msgid "[identifier]"
-#~ msgstr "неверная директива: %s"
-
-#, fuzzy
-#~| msgid "invalid directive: %s"
-#~ msgid "identifier"
-#~ msgstr "неверная директива: %s"
-
-#, fuzzy
-#~| msgid "invalid directive: %s"
-#~ msgid "identifier:"
-#~ msgstr "неверная директива: %s"
-
-#, fuzzy
 #~| msgid "symbol %s redeclared"
 #~ msgid "symbol %s redefined"
 #~ msgstr "переопределение символа %s"
@@ -1523,10 +1719,6 @@
 #~ msgid "conflicting associativities for %s (%s) and %s (%s)"
 #~ msgstr "противоречивые значения ассоциативности для %s (%s) и %s (%s)"
 
-#~ msgid "subsidiary program `%s' failed (exit status %d)"
-#~ msgstr ""
-#~ "вспомогательная программа `%s' завершилась неудачно (код завершения %d)"
-
 #~ msgid "too many states (max %d)"
 #~ msgstr "слишком много состояний (максимально %d)"
 
diff --git a/po/sr.gmo b/po/sr.gmo
index 7cf11e0..e238529 100644
--- a/po/sr.gmo
+++ b/po/sr.gmo
Binary files differ
diff --git a/po/sr.po b/po/sr.po
index 4063e58..02e2354 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -1,180 +1,289 @@
 # Serbian translation for bison.
-# Copyright (C) 2012 Free Software Foundation, Inc.
+# Copyright © 2020 Free Software Foundation, Inc.
 # This file is distributed under the same license as the bison package.
-# Мирослав Николић <miroslavnikolic@rocketmail.com>, 2012, 2013.
+# Мирослав Николић <miroslavnikolic@rocketmail.com>, 2012–2020.
 msgid ""
 msgstr ""
-"Project-Id-Version: bison-3.0\n"
+"Project-Id-Version: bison-3.6.93\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2013-10-02 12:00+0200\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2020-08-04 09:39+0200\n"
 "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
-"Language-Team: Serbian <gnu@prevod.org>\n"
+"Language-Team: Serbian <(nothing)>\n"
 "Language: sr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.7.1\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: src/complain.c:114
-msgid "S/R conflicts (enabled by default)"
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr "број"
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr "функција"
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr "променљива"
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
 msgstr ""
 
-#: src/complain.c:115
-msgid "R/R conflicts (enabled by default)"
-msgstr ""
-
-#: src/complain.c:116
-msgid "string aliases not attached to a symbol"
-msgstr ""
-
-#: src/complain.c:117
-msgid "obsolete constructs"
-msgstr ""
-
-#: src/complain.c:118
+#: examples/c/bistromathic/parse.y:372
 #, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "неисправан знак"
+
+#: examples/c/bistromathic/parse.y:389
+msgid "%@: syntax error"
+msgstr "%@: грешка синтаксе"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr "%@: грешка синтаксе: неочекивано „%u“"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "%@: грешка синтаксе: очекивах „%0e“ пре „%u“"
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "%@: грешка синтаксе: очекивах „%0e“ или „%1e“ пре „%u“"
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "%@: грешка синтаксе: очекивах „%0e“ или „%1e“ или „%2e“ пре „%u“"
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+"%@: грешка синтаксе: очекивах „%0e“ или „%1e“ или „%2e“ или „%3e“ пре „%u“"
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+"%@: грешка синтаксе: очекивах „%0e“ или „%1e“ или „%2e“ или „%3e“ или „%4e“ "
+"пре „%u“"
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+"%@: грешка синтаксе: очекивах „%0e“ или „%1e“ или „%2e“ или „%3e“ или „%4e“ "
+"или „%5e“ пре „%u“"
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+"%@: грешка синтаксе: очекивах „%0e“ или „%1e“ или „%2e“ или „%3e“ или „%4e“ "
+"или „%5e“ итд., пре „%u“"
+
+#: examples/java/calc/Calc.y:81
+msgid "end of line"
+msgstr "крај реда"
+
+#: src/complain.c:153
+msgid "S/R conflicts (enabled by default)"
+msgstr "С/Р сукоби (подразумевано укључено)"
+
+#: src/complain.c:154
+msgid "R/R conflicts (enabled by default)"
+msgstr "Р/Р сукоби (подразумевано укључено)"
+
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr "ствара противречне примере сукоба"
+
+#: src/complain.c:156
+msgid "string aliases not attached to a symbol"
+msgstr "алиаси ниске нису приложени уз симболе"
+
+#: src/complain.c:157
+msgid "obsolete constructs"
+msgstr "застареле конструкције"
+
+#: src/complain.c:158
+#, c-format
 msgid "empty rules without %empty"
-msgstr "празно правило без „%%empty“"
+msgstr "празна правила без „%empty“"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
-msgstr ""
+msgstr "неподешене или некоришћене вредности мид-правила"
 
-#: src/complain.c:120
-#, fuzzy
+#: src/complain.c:160
 msgid "useless precedence and associativity"
-msgstr "непотребна предност и придруживост за „%s“"
+msgstr "непотребна предност и придруживост"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
-msgstr ""
+msgstr "несагласност са „POSIX Yacc“-ом"
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
-msgstr ""
+msgstr "сва друга упозорења (подразумевано укључено)"
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
-msgstr ""
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
+msgstr "сва упозорења изузев „counterexamples“, „dangling-alias“ и „yacc“"
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
-msgstr ""
+msgstr "искључује упозорења у КАТЕГОРИЈИ"
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
-msgstr ""
+msgstr "искључује сва упозорења"
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
-msgstr ""
+msgstr "сматра упозорења грешкама"
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
-msgstr ""
+msgstr "У категорије упозорења спадају:"
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "упозорење"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "грешка"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "кобна грешка"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr "напомена"
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
-msgstr ""
+msgstr "„POSIX Yacc“ не подржава „%s“"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "застарела смерница: %s, користите „%s“"
 
-#: src/complain.c:571
-#, fuzzy, c-format
-msgid "duplicate directive"
-msgstr "застарела смерница, користите „%s“"
-
-#: src/complain.c:573
-#, fuzzy, c-format
-msgid "duplicate directive: %s"
-msgstr "застарела смерница, користите „%s“"
-
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
+#: src/complain.c:616
 #, c-format
+msgid "duplicate directive"
+msgstr "удвостручава смерницу"
+
+#: src/complain.c:618
+#, c-format
+msgid "duplicate directive: %s"
+msgstr "удвостручава смерницу: %s"
+
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "претходна објава"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "дозвољен је само један „%s“ по правилу"
 
-#: src/conflicts.c:81
-#, fuzzy, c-format
+#: src/complain.c:647
+msgid "syntax error"
+msgstr "грешка синтаксе"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr "неочекивано „%0$s“"
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr "очекивах „%1$s“ пре „%0$s“"
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr "очекивах „%1$s“ или „%2$s“ пре „%0$s“"
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr "очекивах „%1$s“ или „%2$s“ или „%3$s“ пре „%0$s“"
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr "очекивах „%1$s“ или „%2$s“ или „%3$s“ или „%4$s“ пре „%0$s“"
+
+#: src/conflicts.c:88
+#, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
-msgstr "    Сукоб правила „%d“ и симбола „%s“ је решен као помак"
+msgstr "Сукоб правила „%d“ и симбола „%s“ је решен као помак"
 
-#: src/conflicts.c:91
-#, fuzzy, c-format
+#: src/conflicts.c:98
+#, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
-msgstr "    Сукоб правила „%d“ и симбола „%s“ је решен као смањење"
+msgstr "Сукоб правила „%d“ и симбола „%s“ је решен као смањење"
 
-#: src/conflicts.c:100
-#, fuzzy, c-format
+#: src/conflicts.c:107
+#, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
-msgstr "    Сукоб правила „%d“ и симбола „%s“ је решен као грешка"
+msgstr "Сукоб правила „%d“ и симбола „%s“ је решен као грешка"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Стање: %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "сукоби: %d помак/смањење, %d смањење/смањење\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "сукоби: %d помак/смањење\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "сукоби: %d смањење/смањење\n"
 
-#: src/conflicts.c:645
-#, fuzzy, c-format
+#: src/conflicts.c:661
+#, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
-msgstr "сукоби помака/смањења: нађох %d, очекивах %d"
+msgstr "сукоби помака/смањења за правило %d: нађох %d, очекивах %d"
 
-#: src/conflicts.c:651
-#, fuzzy, c-format
+#: src/conflicts.c:667
+#, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
-msgstr "сукоби смањења/смањења: нађох %d, очекивах %d"
+msgstr "сукоби смањења/смањења за правило %d: нађох %d, очекивах %d"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
-msgstr "%%очекуј-рр се примењује само на ГЛР обрађиваче"
+msgstr "„%%expect-rr“ се примењује само на ГЛР обрађиваче"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "сукоби помака/смањења: нађох %d, очекивах %d"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
@@ -182,12 +291,12 @@
 msgstr[1] "%d сукоба помака/смањења"
 msgstr[2] "%d сукоба помака/смањења"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "сукоби смањења/смањења: нађох %d, очекивах %d"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
@@ -195,149 +304,197 @@
 msgstr[1] "%d сукоба смањења/смањења"
 msgstr[2] "%d сукоба смањења/смањења"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+"поново покрените са опцијом „-Wcounterexamples“ да створите противречне "
+"примере сукоба"
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr "Пример"
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr "Први пример"
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr "Други пример"
+
+#: src/counterexample.c:126
+msgid "Shift derivation"
+msgstr "Извод помака"
+
+#: src/counterexample.c:126
+msgid "First reduce derivation"
+msgstr "Први извод смањења"
+
+#: src/counterexample.c:128
+msgid "Reduce derivation"
+msgstr "Извод смањења"
+
+#: src/counterexample.c:128
+msgid "Second reduce derivation"
+msgstr "Други извод смањења"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "сукоб помака/смањења на скупини „%s“"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ":"
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "сукоб смањења/смањења на скупини „%s“"
+msgstr[1] "сукоб смањења/смањења на скупинама „%s“"
+msgstr[2] "сукоб смањења/смањења на скупинама „%s“"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: не могу да отворим"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "улазна/излазна грешка"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "не могу да затворим датотеку"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "одбијам да преснимим изворну датотеку „%s“"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "сукобљавам излазе у датотеку „%s“"
 
 #: src/fixits.c:122
-#, fuzzy, c-format
+#, c-format
 msgid "%s: cannot backup"
-msgstr "%s: не могу да отворим"
+msgstr "%s: не могу да направим резерву"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
-msgstr ""
+msgstr "боји излаз"
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
-msgstr ""
+msgstr "не боји излаз"
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
-msgstr ""
+msgstr "боји ако је излазни уређај конзола"
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
-msgid "WHEN can be one of the following:"
-msgstr ""
-
 #: src/getargs.c:209
+msgid "WHEN can be one of the following:"
+msgstr "КАДА може бити следеће:"
+
+#: src/getargs.c:222
 msgid "describe the states"
-msgstr ""
+msgstr "описује стања"
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
-msgstr ""
+msgstr "довршава подешавања кључне ставке са њиховим затварањем"
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
-msgstr ""
+msgstr "изричито придружује симболе тражења унапред ка ставкама"
 
-#: src/getargs.c:212
-#, fuzzy
+#: src/getargs.c:225
 msgid "describe shift/reduce conflicts solving"
-msgstr "%d сукоб помака/смањења"
+msgstr "описује решење сукоба помака/смањења"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
-msgstr ""
+msgstr "обухвата све о информацији"
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
-msgstr ""
+msgstr "искључује извештај"
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
-msgstr ""
+msgstr "СТВАРИ је списак зарезом одвојених речи у које могу да спадају:"
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
-msgstr ""
+msgstr "ТРАГОВИ је списак зарезом одвојених речи у које могу да спадају:"
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
-msgstr ""
+msgstr "приказује грешке са умецима"
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
-msgstr ""
+msgstr "приказује фиксирања читљива машинама"
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
-msgstr ""
+msgstr "не ствара никакву датотеку"
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
-msgstr ""
+msgstr "све изнад"
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
-msgstr ""
+msgstr "искључује све изнад"
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
-msgstr ""
+msgstr "ФУНКЦИЈЕ је списак зарезом одвојених речи у које могу да спадају:"
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Пробајте „%s --help“ за више података.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Употреба: %s [ОПЦИЈА]... ДАТОТЕКА\n"
 
-#: src/getargs.c:356
-#, fuzzy
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
 "\n"
 msgstr ""
 "Створите одредничко ЛР или уопштено ЛР (ГЛР) упослење обрађивача\n"
-"ЛАЛР(1), ИЕЛР(1) или табеле утврђеног ЛР(1) обрађивача. Подршка за\n"
-"ИЕЛР(1) и утврђени ЛР(1) је пробна.\n"
+"ЛАЛР(1), ИЕЛР(1) или табеле утврђеног ЛР(1) обрађивача.\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Обавезни аргументи за дуге опције су обавезни и за кратке опције такође.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Исто је тачно и за опционалне аргументе.\n"
 
-#: src/getargs.c:370
-#, fuzzy
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -352,20 +509,20 @@
 "  -f, --feature[=FEATURES]   activate miscellaneous features\n"
 "\n"
 msgstr ""
-"\n"
 "Режими деловања:\n"
 "  -h, --help                   приказује ову помоћ\n"
 "  -V, --version                исписује податке о издању и излази\n"
 "      --print-localedir        излазни директоријум који садржи месно-"
 "зависне податке\n"
+"                               и излази\n"
 "      --print-datadir          излазни директоријум који садржи структуру и "
 "ИксСЛТ\n"
-"  -y, --yacc                   опонаша ПОСИКС-ов Јацц\n"
-"  -W, --warnings[=КАТЕГОРИЈА]  извештава о упозорењима у КАТЕГОРИЈИ\n"
+"  -u, --update                 примењује фиксирања у датотеци граматике "
+"извора и излази\n"
 "  -f, --feature[=ФУНКЦИЈА]     покреће разне функције\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -373,9 +530,15 @@
 "      --style=FILE           specify the CSS FILE for colorizer diagnostics\n"
 "\n"
 msgstr ""
+"Дијагнозе:\n"
+"  -W, --warnings[=КАТЕГОРИЈА]  пријављује упозорења која се догоде у "
+"КАТЕГОРИЈИ\n"
+"      --color[=КАДА]           да ли да обоји дијагнозе\n"
+"      --style=ДАТОТЕКА         наводи ЦСС ДАТОТЕКУ за дијагностике бојитеља\n"
+"\n"
 
-#: src/getargs.c:400
-#, fuzzy, c-format
+#: src/getargs.c:421
+#, c-format
 msgid ""
 "Tuning the Parser:\n"
 "  -L, --language=LANGUAGE          specify the output programming language\n"
@@ -391,35 +554,39 @@
 "  -k, --token-table                include a table of token names\n"
 "  -y, --yacc                       emulate POSIX Yacc\n"
 msgstr ""
-"Parser:\n"
+"Подешава обрађивача:\n"
 "  -L, --language=ЈЕЗИК                наводи излазни језик програмирања\n"
 "  -S, --skeleton=ДАТОТЕКА             одређује скелет за коришћење\n"
 "  -t, --debug                         инструмент обрађивач за праћење\n"
 "                                      исти као „-Dparse.trace“\n"
 "      --locations                     укључује подршку места\n"
-"  -D, --define=НАЗИВ[=ВРЕДНОСТ]       слично као „%define НАЗИВ 'ВРЕДНОСТ'“\n"
-"  -F, --force-define=НАЗИВ[=ВЕДНОСТ]  преписује „%define НАЗИВ 'ВРЕДНОСТ'“\n"
+"  -D, --define=НАЗИВ[=ВРЕДНОСТ]       слично као „%define ВРЕДНОСТ НАЗИВА“\n"
+"  -F, --force-define=НАЗИВ[=ВЕДНОСТ]  преписује „%define ВРЕДНОСТ НАЗИВА“\n"
 "  -p, --name-prefix=ПРЕФИКС           додаје ПРЕФИКС спољним симболима\n"
 "                                      превазиђено је уз „-Dapi."
-"prefix=ПРЕФИКС“\n"
+"prefix={ПРЕФИКС}“\n"
 "  -l, --no-lines                      не ствара смерницу „#line“\n"
 "  -k, --token-table                   укључује табелу назива симбола\n"
-"\n"
+"  -y, --yacc                          опонаша „POSIX Yacc“\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Излаз:\n"
 "      --defines[=ДАТОТЕКА]    ствара датотеку заглавља\n"
@@ -432,51 +599,49 @@
 "  -o, --output=ДАТОТЕКА       исписује излаз у ДАТОТЕКУ\n"
 "  -g, --graph[=ДАТОТЕКА]      такође даје график аутомата\n"
 "  -x, --xml[=ДАТОТЕКА]        такође даје ИксМЛ извештај о аутомату\n"
-"                              (ИксМЛ шема је испитивачка)\n"
+"  -M, --file-prefix-map=OLD=NEW замењује префикс „OLD“ са „NEW“ када "
+"записује путање датотека\n"
+"                                у излазним датотекама\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Грешке пријавите на <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "Матична страница „%s“: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+#, fuzzy
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr "Општа помоћ користећи ГНУ софтвер: <http://www.gnu.org/gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+#, fuzzy
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 "Грешке у преводу пријавите на „<http://translationproject.org/team/>“.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "За потпуну документацију, покрените: „info bison“.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "бизон (Гну Бизон) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Написали су Роберт Корбет и Ричард Столман.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Ауторска права (C) %d Задужбина слободног софтвера, Доо.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -485,36 +650,41 @@
 "НИКАКВА гаранција; чак ни за ТРЖИШНУ ВРЕДНОСТ или за ИСПУЊАВАЊЕ ОДРЕЂЕНЕ "
 "ПОТРЕБЕ.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "вишеструке објаве скице су неисправне"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: неисправан језик"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "вишеструке објаве језика су неисправне"
 
-#: src/getargs.c:816
-#, fuzzy, c-format
+#: src/getargs.c:760
+#, c-format
+msgid "invalid argument for %s: %s"
+msgstr "неисправан аргумент за „%s“: %s"
+
+#: src/getargs.c:868
+#, c-format
 msgid "deprecated option: %s, use %s"
-msgstr "застарела смерница: %s, користите „%s“"
+msgstr "застарела опција: %s, користите „%s“"
 
-#: src/getargs.c:850
-#, fuzzy, c-format
+#: src/getargs.c:902
+#, c-format
 msgid "missing operand"
-msgstr "%s: недостаје операнд"
+msgstr "недостаје операнд"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "додатни операнд %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Основа"
 
@@ -531,251 +701,301 @@
 "// Страница пројекта: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+msgid "end of file"
+msgstr "крај датотеке"
+
+#: src/i18n-strings.c:36
+msgid "invalid token"
+msgstr "неисправна скупина"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "прекорачење броја редова"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "прекорачење броја колона"
 
-#: src/location.c:155
-#, fuzzy, c-format
+#: src/location.c:143
+#, c-format
 msgid "byte number overflow"
-msgstr "прекорачење броја редова"
+msgstr "прекорачење броја бајта"
 
 #. TRANSLATORS: This is used when a line is too long, and is
 #. displayed truncated.  Use an ellipsis appropriate for your
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
-msgstr ""
+msgstr "..."
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "бескорисна правила у обрађивачу због сукоба"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
-msgstr ""
+msgstr "„fix-its“ се може применити.  Поново покрените са опцијом „--update“."
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "%%define променљива „%s“ је поново одређена"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "претходна одредница"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: неодређена %%define променљива „%s“"
 
-#: src/muscle-tab.c:629
-#, fuzzy, c-format
+#: src/muscle-tab.c:624
+#, c-format
 msgid "%%define variable '%s' requires '{...}' values"
-msgstr "%%define променљива „%s“ је поново одређена"
+msgstr "%%define променљива „%s“ захтева {...} вредности"
+
+#: src/muscle-tab.c:629
+#, c-format
+msgid "%%define variable '%s' requires keyword values"
+msgstr "%%define променљива „%s“ захтева вредности кључне речи"
 
 #: src/muscle-tab.c:634
-#, fuzzy, c-format
-msgid "%%define variable '%s' requires keyword values"
-msgstr "%%define променљива „%s“ је поново одређена"
-
-#: src/muscle-tab.c:639
-#, fuzzy, c-format
+#, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
-msgstr "%%define променљива „%s“ је поново одређена"
+msgstr "%%define променљива „%s“ захтева \"...\" вредности"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "неисправна вредност %%define логичке променљиве „%s“"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "неисправна вредност %%define променљиве „%s“: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "прихваћена вредност: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr "ниска"
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr "преводива ниска"
+
+#: src/parse-gram.y:214
+msgid "[identifier]"
+msgstr "[одредник]"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr "дословност знака"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr "епилог"
+
+#: src/parse-gram.y:219
+msgid "identifier"
+msgstr "одредник"
+
+#: src/parse-gram.y:220
+msgid "identifier:"
+msgstr "одредник:"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr "<ознака>"
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr "дословност целог броја"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
-msgstr ""
+msgstr "дословности знакова не могу бити не-терминали"
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
-msgstr ""
+msgstr "дословности знакова се не могу користити са „%s“"
 
-#: src/parse-gram.y:758
-#, fuzzy, c-format
+#: src/parse-gram.y:789
+#, c-format
 msgid "definition of %s"
-msgstr "поновно одређујем број симбола корисника од %s"
+msgstr "одредница за „%s“"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "недостаје указивач у објави параметра"
 
-#: src/parse-gram.y:1018
-#, fuzzy, c-format
+#: src/parse-gram.y:1062
+#, c-format
 msgid "invalid version requirement: %s"
-msgstr "неисправна референца: %s"
+msgstr "неисправан захтев издања: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
-msgstr ""
+msgstr "захтева бизона %s, али има %s"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
-msgstr "Стање %d "
+msgstr "Стање %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr ""
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "помера, и иде на стање %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "иде на стање %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "грешка (непридруживо)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "смањује користећи правило %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "прихвата"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "смањује користећи правило %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$основно"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Терминали, са правилима где се појављују"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Нетерминали, са правилима где се појављују"
 
-#: src/print.c:416
-#, fuzzy
+#: src/print.c:431
 msgid "on left:"
-msgstr " на лево:"
+msgstr "на лево:"
 
-#: src/print.c:425
-#, fuzzy
+#: src/print.c:440
 msgid "on right:"
-msgstr " на десно:"
+msgstr "на десно:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Бескорисна правила у обрађивачу због сукоба"
 
-# bug: "multiple properties" or "multiple song"?
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "вишеструке %s објаве"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "неслагање врсте резултата функције спајања %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "занемарен је удвојени назив симбола за „%s“"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "дато је правило за %s, које је симбол"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "неслагање врсте основне радње: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "празно правило за укуцани нетерминал, и нема радње"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "неупотребљена вредност: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "неподешена вредност: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "„%%empty“ на не-празном правилу"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "празно правило без „%%empty“"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "симбол за %%prec није одређен: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
-msgstr ""
+msgstr "само радње средњег правила се могу куцати: %s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "„%s“ има дејства само на ГЛР обрађиваче"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "након %s мора да следи позитиван број"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
-msgstr ""
+msgstr "„POSIX Yacc“ не подржава куцане радње средње правила"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "правило је предуго"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "полазни симбол „%s“ није одређен"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "полазни симбол „%s“ је обележје"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "нема правила у основи улаза"
@@ -784,24 +1004,24 @@
 msgid "rule useless in grammar"
 msgstr "правило је бескорисно у основи"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "не-терминал је бескористан у основи: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Не-терминали су бескорисни у основи"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Терминали су неупотребљени у основи"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Правила су бескорисна у основи"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
@@ -809,7 +1029,7 @@
 msgstr[1] "%d не-терминала су бескорисна у основи"
 msgstr[2] "%d не-терминала је бескорисно у основи"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
@@ -817,354 +1037,352 @@
 msgstr[1] "%d правила су бескорисна у основи"
 msgstr[2] "%d правила је бескорисно у основи"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "почетни симбол %s не изводи никакав исказ"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "залутало „%s“"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "односи се на: %c%s у %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "могуће значење: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", кријем %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " у %s"
 
-#: src/scan-code.l:375
-#, fuzzy, c-format
+#: src/scan-code.l:377
+#, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", не може бити приступљен из радње средњег правила у $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "цео број је ван опсега: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "неисправна референца: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr "садржајна грешка након „%c“, очекујем цео број, слово, _, [, или $"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "симбол није пронађен у производњи пре $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "симбол није пронађен у производњи: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "неисправна референца: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "нејасна референца: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "дата је изричита врста у неуписаној основи"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ за средње правило при $%d од %s нема објављену врсту"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ од %s нема објављену врсту"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s од %s нема објављену врсту"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
-msgstr ""
+msgstr "„$%d“ се вишеструко понавља са „api.value.automove“"
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "неисправан број након „\\-escape“: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "залутали зарез (,) је схваћен као размак"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "неисправна директива: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "неисправна одређивач: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "неисправан знак"
 msgstr[1] "неисправни знаци"
 msgstr[2] "неисправни знаци"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "неисправан ништавни знак"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "неочекивани одређивач у називу у заградама: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "очекиван је одређивач"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "неисправан знак у називу у заградама"
 msgstr[1] "неисправни знаци у називу у заградама"
 msgstr[2] "неисправни знаци у називу у заградама"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
-msgstr ""
+msgstr "„POSIX Yacc“ не подржава дословности ниске"
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "дословност празног знака"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "додатни знаци у дословности знака"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "неисправан број након „\\-escape“: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "неисправан знак након „\\-escape“: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
-msgstr ""
+msgstr "„POSIX Yacc“ не подржава дословности хексадецималног"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "недостаје „%s“ на крају датотеке"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "недостаје „%s“ на крају реда"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "незатворена %s смерница у костуру"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "премало аргумената за %s смерницу у костуру"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "превише аргумената за %s смерницу у костуру"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "ПОСИКС Јацц забрањује цртице у називима симбола: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "превише симбола у улазној основи (ограничење је %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "%s поновни проглас за %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s поновни проглас за <%s>"
 
-#: src/symtab.c:325
-#, fuzzy, c-format
+#: src/symtab.c:347
+#, c-format
 msgid "symbol %s redeclared as a token"
-msgstr "симбол „%s“ је поново објављен"
+msgstr "симбол „%s“ је поново објављен као жетон"
 
-#: src/symtab.c:326
-#, fuzzy, c-format
+#: src/symtab.c:348
+#, c-format
 msgid "symbol %s redeclared as a nonterminal"
-msgstr "симбол „%s“ је поново објављен"
+msgstr "симбол „%s“ је поново објављен као не-терминал"
 
-#: src/symtab.c:370
-#, fuzzy, c-format
+#: src/symtab.c:388
+#, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
 "mean %s?"
-msgstr "коришћен је симбол „%s“, али није одређен као обележје и нема правила"
+msgstr ""
+"коришћен је симбол „%s“, али није одређен као обележје и нема правила; да ли "
+"мислите „%s“?"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr "коришћен је симбол „%s“, али није одређен као обележје и нема правила"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
-msgstr ""
+msgstr "„POSIX yacc“ резервише „%%type“ не-терминалима"
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "симбол „%s“ је поново објављен"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
-msgstr ""
+msgid "nonterminals cannot be given a token code"
+msgstr "не-терминалима се не може дати код низа"
 
-#: src/symtab.c:575
+#: src/symtab.c:594
 #, c-format
-msgid "redefining user token number of %s"
-msgstr "поновно одређујем број симбола корисника од %s"
+msgid "redefining code of token %s"
+msgstr "поновно одређујем код низа „%s“"
 
-#: src/symtab.c:578
-#, fuzzy, c-format
-msgid "user token number of %s too large"
-msgstr "поновно одређујем број симбола корисника од %s"
+#: src/symtab.c:597
+#, c-format
+msgid "code of token %s too large"
+msgstr "код низа „%s“ је превелик"
 
-#: src/symtab.c:617
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
-msgstr ""
+msgstr "дословност ниске „%s“ није приложен уз симбол"
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "непотребно „%s“ за врсту <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "врста „%s“ је употребљена, али није придружена ниједном симболу"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
-msgstr ""
+msgstr "не-терминалима се не може дати алијас ниске"
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "симбол %s је коришћен више пута као дословна ниска"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "симболу %s је дата више од једне дословне ниске"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "поновна објава броја %d корисничког симбола за %s"
+msgid "code %d reassigned to token %s"
+msgstr "код „%d“ је поново додељен низу „%s“"
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "претходна објава за %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
-msgstr ""
+msgstr "број симбола је превелик"
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "полазни симбол „%s“ није одређен"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "полазни симбол „%s“ је обележје"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "непотребна предност и придруживост за „%s“"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "непотребна предност за „%s“"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "непотребна придруживост за „%s“, користите „%%precedence“"
 
-#, fuzzy
-#~ msgid "eliminate useless chain rules"
-#~ msgstr "не-терминал је бескористан у основи: %s"
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "бизон (Гну Бизон) %s"
 
-#~ msgid "deprecated directive, use %s"
-#~ msgstr "застарела смерница, користите „%s“"
+# bug: "multiple properties" or "multiple song"?
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "вишеструке %s објаве"
 
-#, fuzzy
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "превише симбола у улазној основи (ограничење је %d)"
+
+#~ msgid "nonterminals cannot be given an explicit number"
+#~ msgstr "не-терминалима се не може дати изричит борј"
+
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "поновна објава броја %d корисничког симбола за %s"
+
 #~ msgid ""
 #~ "Warning categories include:\n"
+#~ "  'midrule-values'    unset or unused midrule values\n"
+#~ "  'yacc'              incompatibilities with POSIX Yacc\n"
 #~ "  'conflicts-sr'      S/R conflicts (enabled by default)\n"
 #~ "  'conflicts-rr'      R/R conflicts (enabled by default)\n"
 #~ "  'deprecated'        obsolete constructs\n"
 #~ "  'empty-rule'        empty rules without %empty\n"
-#~ "  'midrule-values'    unset or unused midrule values\n"
 #~ "  'precedence'        useless precedence and associativity\n"
-#~ "  'yacc'              incompatibilities with POSIX Yacc\n"
 #~ "  'other'             all other warnings (enabled by default)\n"
 #~ "  'all'               all the warnings except 'yacc'\n"
 #~ "  'no-CATEGORY'       turn off warnings in CATEGORY\n"
@@ -1203,19 +1421,11 @@
 #~ "  „all“          укључује све горње податке\n"
 #~ "  „none“         искључује извештај\n"
 
-#, fuzzy
 #~ msgid ""
-#~ "FEATURES is a list of comma separated words that can include:\n"
-#~ "  'caret', 'diagnostics-show-caret'\n"
-#~ "    show errors with carets\n"
-#~ "  'fixit', 'diagnostics-parseable-fixits'\n"
-#~ "    show machine-readable fixes\n"
-#~ "  'syntax-only'\n"
-#~ "    do not generate any file\n"
-#~ "  'all'\n"
-#~ "    all of the above\n"
-#~ "  'none'\n"
-#~ "    disable all of the above\n"
+#~ "FEATURE is a list of comma separated words that can include:\n"
+#~ "  'caret'        show errors with carets\n"
+#~ "  'all'          all of the above\n"
+#~ "  'none'         disable all of the above\n"
 #~ "  "
 #~ msgstr ""
 #~ "ФУНКЦИЈА је списак зарезом раздвојених речи који може да укључи:\n"
@@ -1224,8 +1434,56 @@
 #~ "  „none“         искључује све од горњег\n"
 #~ "  "
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "неисправан аргумент „%s“ за „%s“"
+#~ msgid " type %d is %s\n"
+#~ msgstr " врста %d је %s\n"
+
+#~ msgid "invalid $ value: $%d"
+#~ msgstr "неисправна $ вредност: $%d"
+
+#~ msgid "symbol %s redefined"
+#~ msgstr "симбол „%s“ је поново одређен"
+
+#~ msgid "removing of '%s' failed"
+#~ msgstr "није успело уклањање „%s“"
+
+#~ msgid "creation of a temporary file failed"
+#~ msgstr "стварање привремене датотеке није успело"
+
+#~ msgid "saving stdin failed"
+#~ msgstr "чување стандардног улаза није успело"
+
+#~ msgid "saving stdout failed"
+#~ msgstr "чување стандардног излаза није успело"
+
+#~ msgid "opening of tmpfile failed"
+#~ msgstr "отварање привремене датотеке није успело"
+
+#~ msgid "redirecting bison's stdout to the temporary file failed"
+#~ msgstr ""
+#~ "преусмеравање бизоновог стандардног излаза на привремену датотеку није "
+#~ "успело"
+
+#~ msgid "redirecting m4's stdin from the temporary file failed"
+#~ msgstr ""
+#~ "преусмеравање м4 стандардног улаза из привремене датотеке није успело"
+
+#~ msgid "opening of a temporary file failed"
+#~ msgstr "отварање привремене датотеке није успело"
+
+#~ msgid "redirecting m4's stdout to a temporary file failed"
+#~ msgstr ""
+#~ "преусмеравање м4 стандардног излаза на привремену датотеку није успело"
+
+#~ msgid "subsidiary program '%s' interrupted"
+#~ msgstr "прекинут је припомоћни програм „%s“"
+
+#~ msgid "subsidiary program '%s' not found"
+#~ msgstr "није пронађен припомоћни програм „%s“"
+
+#~ msgid "redirecting bison's stdin from the temporary file failed"
+#~ msgstr ""
+#~ "преусмеравање бизоновог стандардног улаза из привремене датотеке није "
+#~ "успело"
 
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "нејасан аргумент „%s“ за „%s“"
@@ -1233,80 +1491,6 @@
 #~ msgid "Valid arguments are:"
 #~ msgstr "Исправни аргументи су:"
 
-#~ msgid "write error"
-#~ msgstr "грешка уписа"
-
-#~ msgid "Unknown system error"
-#~ msgstr "Непозната грешка система"
-
-#, fuzzy
-#~| msgid "%s: option '-W %s' is ambiguous\n"
-#~ msgid "%s: option '%s%s' is ambiguous\n"
-#~ msgstr "%s: опција „-W %s“ је нејасна\n"
-
-#, fuzzy
-#~| msgid "%s: option '%s' is ambiguous; possibilities:"
-#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
-#~ msgstr "%s: опција „%s“ је нејасна; могућности:"
-
-#, fuzzy
-#~| msgid "%s: unrecognized option '%c%s'\n"
-#~ msgid "%s: unrecognized option '%s%s'\n"
-#~ msgstr "%s: непозната опција „%c%s“\n"
-
-#, fuzzy
-#~| msgid "%s: option '%c%s' doesn't allow an argument\n"
-#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
-#~ msgstr "%s: опција „%c%s“ не дозвољава аргумент\n"
-
-#, fuzzy
-#~| msgid "%s: option '--%s' requires an argument\n"
-#~ msgid "%s: option '%s%s' requires an argument\n"
-#~ msgstr "%s: опција „--%s“ захтева аргумент\n"
-
-#~ msgid "%s: invalid option -- '%c'\n"
-#~ msgstr "%s: неисправна опција -- „%c“\n"
-
-#~ msgid "%s: option requires an argument -- '%c'\n"
-#~ msgstr "%s: опција захтева аргумент -- „%c“\n"
-
-#~ msgid "memory exhausted"
-#~ msgstr "меморија је потрошена"
-
-#
-#~ msgid "cannot create pipe"
-#~ msgstr "не могу да направим спојку"
-
-#~ msgid "%s subprocess failed"
-#~ msgstr "%s потпроцес није успео"
-
-#~ msgid "`"
-#~ msgstr "„"
-
-#~ msgid "'"
-#~ msgstr "“"
-
-#, fuzzy
-#~| msgid ""
-#~| "\n"
-#~| "Execution times (seconds)\n"
-#~ msgid "Execution times (seconds)"
-#~ msgstr ""
-#~ "\n"
-#~ "Времена извршавања (у секундама)\n"
-
-#~ msgid "_open_osfhandle failed"
-#~ msgstr "„_open_osfhandle“ није успело"
-
-#~ msgid "cannot restore fd %d: dup2 failed"
-#~ msgstr "не могу да повратим фд %d: „dup2“ није успело"
-
-#~ msgid "%s subprocess"
-#~ msgstr "%s потпроцес"
-
-#~ msgid "%s subprocess got fatal signal %d"
-#~ msgstr "%s потпроцес је добио кобни сигнал %d"
-
 #~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
 #~ msgstr "%u bitset_allocs, %u ослобођено (%.2f%%).\n"
 
@@ -1354,101 +1538,82 @@
 #~ msgid "cannot open stats file for writing"
 #~ msgstr "не могу да отворим датотеку статистике за упис"
 
-#, fuzzy
-#~| msgid "missing %s at end of file"
-#~ msgid "end \"ABC\" of file"
-#~ msgstr "недостаје „%s“ на крају датотеке"
+#~ msgid "write error"
+#~ msgstr "грешка уписа"
 
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "[identifier]"
-#~ msgstr "неисправна одређивач: %s"
+#~ msgid "Unknown system error"
+#~ msgstr "Непозната грешка система"
 
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "character literal"
-#~ msgstr "дословност празног знака"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier"
-#~ msgstr "неисправна одређивач: %s"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier:"
-#~ msgstr "неисправна одређивач: %s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "integer literal"
-#~ msgstr "дословност празног знака"
-
-#~ msgid "symbol %s redefined"
-#~ msgstr "симбол „%s“ је поново одређен"
-
-#~ msgid "removing of '%s' failed"
-#~ msgstr "није успело уклањање „%s“"
-
-#~ msgid "creation of a temporary file failed"
-#~ msgstr "стварање привремене датотеке није успело"
-
-#~ msgid "saving stdin failed"
-#~ msgstr "чување стандардног улаза није успело"
-
-#~ msgid "saving stdout failed"
-#~ msgstr "чување стандардног излаза није успело"
-
-#~ msgid "opening of tmpfile failed"
-#~ msgstr "отварање привремене датотеке није успело"
-
-#~ msgid "redirecting bison's stdout to the temporary file failed"
-#~ msgstr ""
-#~ "преусмеравање бизоновог стандардног излаза на привремену датотеку није "
-#~ "успело"
-
-#~ msgid "redirecting m4's stdin from the temporary file failed"
-#~ msgstr ""
-#~ "преусмеравање м4 стандардног улаза из привремене датотеке није успело"
-
-#~ msgid "opening of a temporary file failed"
-#~ msgstr "отварање привремене датотеке није успело"
-
-#~ msgid "redirecting m4's stdout to a temporary file failed"
-#~ msgstr ""
-#~ "преусмеравање м4 стандардног излаза на привремену датотеку није успело"
-
-#~ msgid "subsidiary program '%s' interrupted"
-#~ msgstr "прекинут је припомоћни програм „%s“"
-
-#~ msgid "subsidiary program '%s' not found"
-#~ msgstr "није пронађен припомоћни програм „%s“"
-
-#~ msgid "redirecting bison's stdin from the temporary file failed"
-#~ msgstr ""
-#~ "преусмеравање бизоновог стандардног улаза из привремене датотеке није "
-#~ "успело"
-
-#~ msgid " type %d is %s\n"
-#~ msgstr " врста %d је %s\n"
-
-#~ msgid "invalid $ value: $%d"
-#~ msgstr "неисправна $ вредност: $%d"
+#~ msgid "%s: option '%s' is ambiguous; possibilities:"
+#~ msgstr "%s: опција „%s“ је нејасна; могућности:"
 
 #~ msgid "%s: option '--%s' doesn't allow an argument\n"
 #~ msgstr "%s: опција „--%s“ не дозвољава аргумент\n"
 
+#~ msgid "%s: option '%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: опција „%c%s“ не дозвољава аргумент\n"
+
+#~ msgid "%s: option '--%s' requires an argument\n"
+#~ msgstr "%s: опција „--%s“ захтева аргумент\n"
+
 #~ msgid "%s: unrecognized option '--%s'\n"
 #~ msgstr "%s: непозната опција „--%s“\n"
 
+#~ msgid "%s: unrecognized option '%c%s'\n"
+#~ msgstr "%s: непозната опција „%c%s“\n"
+
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: неисправна опција -- „%c“\n"
+
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: опција захтева аргумент -- „%c“\n"
+
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: опција „-W %s“ је нејасна\n"
+
 #~ msgid "%s: option '-W %s' doesn't allow an argument\n"
 #~ msgstr "%s: опција „-W %s“ не дозвољава аргумент\n"
 
 #~ msgid "%s: option '-W %s' requires an argument\n"
 #~ msgstr "%s: опција „-W %s“ захтева аргумент\n"
 
+#~ msgid "memory exhausted"
+#~ msgstr "меморија је потрошена"
+
+#
+#~ msgid "cannot create pipe"
+#~ msgstr "не могу да направим спојку"
+
+#~ msgid "%s subprocess failed"
+#~ msgstr "%s потпроцес није успео"
+
+#~ msgid "`"
+#~ msgstr "„"
+
+#~ msgid "'"
+#~ msgstr "“"
+
+#~ msgid ""
+#~ "\n"
+#~ "Execution times (seconds)\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Времена извршавања (у секундама)\n"
+
 #~ msgid " TOTAL                 :"
 #~ msgstr " УКУПНО                :"
 
 #~ msgid "time in %s: %ld.%06ld (%ld%%)\n"
 #~ msgstr "време у %s: %ld.%06ld (%ld%%)\n"
+
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "„_open_osfhandle“ није успело"
+
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "не могу да повратим фд %d: „dup2“ није успело"
+
+#~ msgid "%s subprocess"
+#~ msgstr "%s потпроцес"
+
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "%s потпроцес је добио кобни сигнал %d"
diff --git a/po/sv.gmo b/po/sv.gmo
index 1ed435c..e280d46 100644
--- a/po/sv.gmo
+++ b/po/sv.gmo
Binary files differ
diff --git a/po/sv.po b/po/sv.po
index 27f0306..d08b9a9 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -1,15 +1,16 @@
 # Swedish messages for bison.
-# Copyright © 2001-2006, 2008, 2010, 2011, 2012, 2013, 2015, 2018, 2019 Free Software Foundation, Inc.
+# Copyright © 2001-2006, 2008, 2010, 2011, 2012, 2013, 2015, 2018, 2019, 2020, 2021 Free Software Foundation, Inc.
 # This file is distributed under the same license as the bison package.
-# Göran Uddeborg <goeran@uddeborg.se>, 2001-2006, 2008, 2010, 2011, 2012, 2013, 2015, 2018, 2019.
+# Luna Jernberg <droidbittin@gmail.com>, 2021
+# Göran Uddeborg <goeran@uddeborg.se>, 2001-2006, 2008, 2010, 2011, 2012, 2013, 2015, 2018, 2019, 2020, 2021.
 #
-# $Revision: 1.109 $
+# $Revision: 1.126 $
 msgid ""
 msgstr ""
-"Project-Id-Version: bison 3.4.91\n"
+"Project-Id-Version: bison 3.7.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-11-22 23:10+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2021-08-30 12:00+0200\n"
 "Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
 "Language: sv\n"
@@ -19,201 +20,358 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr "tal"
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr "funktion"
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr "variabel"
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr "fel: division med noll"
+
+#: examples/c/bistromathic/parse.y:372
+#, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "syntaxfel: ogiltigt tecken: %c"
+
+#: examples/c/bistromathic/parse.y:389
+msgid "%@: syntax error"
+msgstr "%@: syntaxfel"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr "%@: syntaxfel: oväntat %u"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "%@: syntaxfel: %0e förväntades före %u"
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "%@: syntaxfel: %0e eller %1e förväntades före %u"
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "%@: syntaxfel: %0e eller %1e eller %2e förväntades före %u"
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr "%@: syntaxfel: %0e eller %1e eller %2e eller %3e förväntades före %u"
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+"%@: syntaxfel: %0e eller %1e eller %2e eller %3e eller %4e förväntades före "
+"%u"
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+"%@: syntaxfel: %0e eller %1e eller %2e eller %3e eller %4e eller %5e "
+"förväntades före %u"
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+"%@: syntaxfel: %0e eller %1e eller %2e eller %3e eller %4e eller %5e etc. "
+"förväntades före %u"
+
+#: examples/java/calc/Calc.y:81
+msgid "end of line"
+msgstr "radslut"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr "S/R-konflikter (aktiverat som standard)"
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr "R/R-konflikter (aktiverat som standard)"
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr "generera konfliktmotexempel"
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr "strängalias som inte är fästa vid en symbol"
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr "föråldrade konstruktioner"
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, c-format
 msgid "empty rules without %empty"
 msgstr "tomma regler utan %empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr "ej satta eller oanvända mittregelvärden"
 
-#: src/complain.c:120
+#: src/complain.c:160
 msgid "useless precedence and associativity"
 msgstr "oanvändbar precedens och associativitet"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr "inkompatibiliteter med POSIX Yacc"
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr "alla andra varningar (aktiverat som standard)"
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
-msgstr "alla varningarna utom ”dangling-alias” och ”yacc”"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
+msgstr "alla varningarna utom ”counterexamples”, ”dangling-alias” och ”yacc”"
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr "slå av varningar i KATEGORI"
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr "slå av alla varningarna"
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr "behandla varningar som fel"
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr "Varningskategorierna inkluderar:"
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "varning"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "fel"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "ödesdigert fel"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr "notering"
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr "POSIX Yacc stödjer inte %s"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "ogiltigt direktiv: %s, använd %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, c-format
 msgid "duplicate directive"
 msgstr "dubblerat direktiv"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, c-format
 msgid "duplicate directive: %s"
 msgstr "dubblerat direktiv: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "föregående deklaration"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "endast en %s tillåts per regel"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+msgid "syntax error"
+msgstr "syntaxfel"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr "oväntad %0$s"
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr "%1$s förväntades före %0$s"
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr "%1$s eller %2$s förväntades före %0$s"
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr "%1$s eller %2$s eller %3$s förväntades före %0$s"
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr "%1$s eller %2$s eller %3$s eller %4$s förväntades före %0$s"
+
+#: src/conflicts.c:88
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "Konflikt mellan regel %d och element %s löstes som skift"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr "Konflikt mellan regel %d och element %s löstes som reducera"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "Konflikt mellan regel %d och element %s löstes som ett fel"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Tillstånd %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "konflikter: %d skifta/reducera, %d reducera/reducera\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "konflikter: %d skifta/reducera\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "konflikter: %d reducera/reducera\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "skifta/reducerakonflikter för regel %d: %d funna, %d förväntade"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "reducera/reducerakonflikter för regel %d: %d funna, %d förväntade"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr gäller endast GLR-parsrar"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "skifta/reducerakonflikter: %d funna, %d förväntade"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d skifta/reducerakonflikt"
 msgstr[1] "%d skifta/reducerakonflikter"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "reducera/reducerakonflikter: %d funna, %d förväntade"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d reducera/reducerakonflikt"
 msgstr[1] "%d reducera/reducerakonflikter"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr "kör om med ”-Wcounterexamples” för att generera konfliktmotexempel"
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr "Exempel"
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr "Första exempel"
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr "Andra exempel"
+
+#: src/counterexample.c:126
+msgid "Shift derivation"
+msgstr "Skifthärledning"
+
+#: src/counterexample.c:126
+msgid "First reduce derivation"
+msgstr "Första reduktionshärledning"
+
+#: src/counterexample.c:128
+msgid "Reduce derivation"
+msgstr "Reduktionshärledning"
+
+#: src/counterexample.c:128
+msgid "Second reduce derivation"
+msgstr "Andra reduktionshärledning"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "skifta/reducera konflikt vid element %s"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ":"
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "Reducera/reducerakonflikt vid element %s"
+msgstr[1] "Reducera/reducerakonflikt vid element %s"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: kan inte öppna"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "in-/utfel"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "kan inte stänga fil"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "vägrar att skriva över indatafilen %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "motstridiga utmatningar till filen %s"
@@ -223,95 +381,95 @@
 msgid "%s: cannot backup"
 msgstr "%s: kan inte säkerhetskopiera"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr "färglägg utdata"
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr "färglägg inte utdata"
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr "färglägg utdata om enheten är en tty"
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr "NÄR kan vara en av följande:"
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr "beskriv tillstånden"
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr "komplettera kärnobjektmängderna med sina höljen"
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr "koppla uttryckligen framåtblickande element till objekt"
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 msgid "describe shift/reduce conflicts solving"
 msgstr "beskriv lösning av skifta/reducerakonflikter"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr "inkludera all ovanstående information"
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr "avaktivera rapporten"
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr "SAKER är en lista med kommaseparerade ord som kan innehålla:"
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr "SPÅR är en lista med kommaseparerade ord som kan innehålla:"
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr "visa fel med cirkumflex"
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr "visa maskinläsbara fixar"
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr "generera inte någon fil"
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr "alla ovanstående"
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr "avaktivera alla ovanstående"
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr "FUNKTIONER är en lista av kommaseparerade ord som kan inkludera:"
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Försök med ”%s --help” för mer information.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Användning: %s [FLAGGA]... FIL\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
@@ -321,18 +479,18 @@
 "använder LALR(1), IELR(1) eller kanonisk LR(1) parsningstabeller.\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Obligatoriska argument till långa flaggor är obligatoriska även för de "
 "korta.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Detsamma gäller valfria argument.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -361,7 +519,7 @@
 "  -f, --feature[=FUNKTIONER] aktivera diverse funktioner\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -369,13 +527,14 @@
 "      --style=FILE           specify the CSS FILE for colorizer diagnostics\n"
 "\n"
 msgstr ""
+"Diagnostik:\n"
 "  -W, --warnings[=KATEGORI]  rapportera varningarna som faller inom "
 "KATEGORI\n"
 "      --color[=NÄR]          huruvida diagnostik skall färgläggas\n"
 "      --style=FIL            ange CSS-FIL:en för färgläggning av diagnostik\n"
 "\n"
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -398,86 +557,86 @@
 "  -t, --debug                      instrumentera parsern för spårning\n"
 "                                   samma som ”-Dparse.trace”\n"
 "      --locations                  aktivera stöd för lägen\n"
-"  -D, --define=NAMN[=VÄRDE]        motsvarar '%define NAMN \"VÄRDE\"'\n"
-"  -F, --force-define=NAMN[=VÄRDE]  åsidosätt '%define NAMN \"VÄRDE\"'\n"
+"  -D, --define=NAMN[=VÄRDE]        motsvarar ”%define NAMN VÄRDE”\n"
+"  -F, --force-define=NAMN[=VÄRDE]  åsidosätt ”%define NAMN VÄRDE”\n"
 "  -p, --name-prefix=PREFIX         lägg till PREFIX före externa symboler\n"
 "                                   undanbedes till förmån för\n"
-"                                   '-Dapi.prefix=PREFIX'\n"
-"  -l, --no-lines                   generera inte \"#line\"-direktiv\n"
+"                                   ”-Dapi.prefix={PREFIX}”\n"
+"  -l, --no-lines                   generera inte ”#line”-direktiv\n"
 "  -k, --token-table                inkludera en tabell över elementnamn\n"
 "  -y, --yacc                       emulera POSIX yacc\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Utdatafiler:\n"
-"      --defines[=FIL]        skapa också en huvudfil\n"
-"  -d                         detsamma, utan att kunna ange FIL (för POSIX-"
-"Yacc)\n"
-"  -r, --report=SAKER         skapa också detaljer om automaten\n"
-"      --report-file=FIL      skriv en rapport till FIL\n"
-"  -v, --verbose              samma som ”--report=state”\n"
-"  -b, --file-prefix=PREFIX   ange ett PREFIX för utdatafiler\n"
-"  -o, --output=FIL           lägg utdata i FIL\n"
-"  -g, --graph[=FIL]          skapa också en graf av automaten\n"
-"  -x, --xml[=FIL]            skapa också en XML-rapport om automaten\n"
-"                             (XML-schemat är experimentellt)\n"
+"  -H, --header=[FIL]            skapa också en huvudfil\n"
+"  -d                            likaledes, utan att kunna ange FIL\n"
+"                                  (för POSIX-Yacc)\n"
+"  -r, --report=SAKER            skapa också detaljer om automaten\n"
+"      --report-file=FIL         skriv en rapport till FIL\n"
+"  -v, --verbose                 samma som ”--report=state”\n"
+"  -b, --file-prefix=PREFIX      ange ett PREFIX för utdatafiler\n"
+"  -o, --output=FIL              lägg utdata i FIL\n"
+"  -g, --graph[=FIL]             skapa också en graf av automaten\n"
+"      --html[=FIL]              skapa också en HTML-rapport om automaten\n"
+"  -x, --xml[=FIL]               skapa också en XML-rapport om automaten\n"
+"  -M, --file-prefix-map=GAMMALT=NYTT ersätt prefixet GAMMALT med NYTT när\n"
+"                                  filsökvägar skrivs i utmatningsfiler\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Rapportera fel till <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "%s hemsida: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
-"Allmän hjälp om att använda GNU-program: <http://www.gnu.org/gethelp/>.\n"
+"Allmän hjälp om att använda GNU-program: <https://www.gnu.org/gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 "Rapportera synpunkter på översättningen till <tp-sv@listor.tp-sv.se>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "För fullständig dokumentation, kör: info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Skriven av Robert Corbett och Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright © %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -486,36 +645,41 @@
 "finns INGEN garanti, inte ens för SÄLJBARHET eller LÄMPLIGHET FÖR ETT\n"
 "SPECIELLT ÄNDAMÅL.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "flera skelettdeklarationer är inte tillåtet"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: ogiltigt språk"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "flera språkdeklarationer är inte tillåtet"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, c-format
+msgid "invalid argument for %s: %s"
+msgstr "ogiltigt argument till %s: %s"
+
+#: src/getargs.c:868
 #, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "föråldrad flagga: %s, använd %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, c-format
 msgid "missing operand"
 msgstr "saknad operand"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "extra operand %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Grammatik"
 
@@ -532,17 +696,25 @@
 "// Hemsida: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+msgid "end of file"
+msgstr "filslut"
+
+#: src/i18n-strings.c:36
+msgid "invalid token"
+msgstr "felaktigt element"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "radnummerspill"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "kolumnnummerspill"
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
 msgstr "bytenummerspill"
@@ -552,228 +724,273 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr "…"
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "oanvändbar regel i parsern på grund av konflikter"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr "fixar kan göras.  Kör om med flaggan ”--update”."
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "%%define-variabeln %s omdefinierad"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "föregående definition"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: odefinierad  %%define-variabel %s"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "%%define-variabeln ”%s” kräver ”{…}”-värden"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "%%define-variabeln %s kräver nyckelordsvärden"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "%%define-variabeln %s kräver ”\"…\"”-värden"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "ogiltigt värde för boolesk %%define-variabel %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "ogiltigt värde för %%define-variabeln %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "accepterat värde: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr "sträng"
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr "översättningsbar sträng"
+
+#: src/parse-gram.y:214
+msgid "[identifier]"
+msgstr "[identifierare]"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr "teckenkonstant"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr "epilog"
+
+#: src/parse-gram.y:219
+msgid "identifier"
+msgstr "identifierare"
+
+#: src/parse-gram.y:220
+msgid "identifier:"
+msgstr "identifierare:"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr "<märke>"
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr "heltalskonstant"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr "teckenkonstanter kan inte vara icke-terminaler"
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr "teckenkonstanter kan inte användas tillsammans med %s"
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, c-format
 msgid "definition of %s"
 msgstr "definition av %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "identifierare saknas i parameterdeklaration"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, c-format
 msgid "invalid version requirement: %s"
 msgstr "felaktigt versionskrav: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr "behöver bison %s, men har %s"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Tillstånd %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr "%s misslyckades med status %d"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "skifta, och gå till tillstånd %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "gå till tillstånd %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "fel (ickeassociativ)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "reducera med regel %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "acceptera"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "reducera med regel %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$standard"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Terminaler, med regler där de förekommer"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Icketerminaler, med regler där de förekommer"
 
-#: src/print.c:416
+#: src/print.c:431
 msgid "on left:"
 msgstr "till vänster:"
 
-#: src/print.c:425
+#: src/print.c:440
 msgid "on right:"
 msgstr "till höger:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Oanvändbara regler i parser på grund av konflikter"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "flera %s-deklarationer"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "resultattypskonflikt vid sammanslagningsfunktion %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "duplicerat symbolnamn för %s ignorerat"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "regel given för %s, som är ett element"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "typkonflikt för standardåtgärd: <%s> <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "tom regel för typad icketerminal, och ingen åtgärd"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "oanvänt värde: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "ej satt värde: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty på en icketom regel"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "tom regel utan %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "elementet för %%prec är inte definierat: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr "endast mitt-i-regeln-åtgärder kan skrivas: %s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s påverkar endast GLR-parsrar"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s måste följas av ett positivt tal"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr "POSIX Yacc stödjer inte typade mitt-i-regeln-åtgärder"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "regeln är för lång"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "startsymbolen %s är odefinierad"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "startsymbolen %s är ett element"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "inga regler i ingrammatiken"
@@ -782,260 +999,255 @@
 msgid "rule useless in grammar"
 msgstr "oanvändbar regel i grammatiken"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "oanvändbar icketerminal i grammatiken: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Oanvändbara icketerminaler i grammatiken"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Oanvända terminaler i grammatiken"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Oanvändbara regler i grammatiken"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d oanvändbar icketerminal i grammatiken"
 msgstr[1] "%d oanvändbara icketerminaler i grammatiken"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d oanvändbar regel i grammatiken"
 msgstr[1] "%d oanvändbara regler i grammatiken"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "startsymbolen %s genererar inga meningar"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "vilsekommet ”%s”"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "refererar till: %c%s vid %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "möjligen avsett: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", döljer %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " vid %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", kan inte nås från åtgärd mitt i regeln vid $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "heltal utanför intervall: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "ogiltig referens: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr "syntaxfel efter ”%c”, siffra, bokstav, ”_”, ”[” eller ”$” förväntades"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "symbol inte funnen i produktion före $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "symbol inte funnen i produktion: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "vilseledande referens: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "tvetydigt argument: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "explicit typ given i otypad grammatik"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ för mitt-i-regeln vid $%d av %s har ingen deklarerad typ"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ för %s har ingen deklarerad typ"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s för %s har ingen deklarerad typ"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr "flera förekomster av $%d med api.value.automove"
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "ogiltigt tal efter \\-specialsekvens: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "vilsekommet ”,” hanterat som blank"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "ogiltigt direktiv: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "ogiltig identifierare: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "ogiltigt tecken"
 msgstr[1] "ogiltiga tecken"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "ogiltigt nolltecken"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "oväntad identifierare i namn inom klamrar: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "en identifierare förväntades"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "ogiltigt tecken i namn i klamrar"
 msgstr[1] "ogiltiga tecken i namn i klamrar"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr "POSIX Yacc stödjer inte strängkonstanter"
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "tom teckenkonstant"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "extra bokstäver i teckenkonstant"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "ogiltigt tal efter \\-specialsekvens: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "ogiltigt tecken efter \\-specialsekvens: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr "POSIX Yacc stödjer inte hexadecimala konstanter"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "saknat %s vid filslut"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "saknat %s vid radslut"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "oavslutat %s-direktiv i skelettet"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "för få argument till %s-direktiv i skelettet"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "för många argument till %s-direktiv i skelettet"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX-Yacc förbjuder bindestreck i symbolnamn: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "för många symboler i ingrammatiken (gränsen är %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "%s-omdeklaration för %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s-omdeklaration för <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "symbolen %s omdeklarerad som ett element"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "symbolen %s omdeklarerad som en icketerminal"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1044,104 +1256,94 @@
 "symbolen %s används, men är inte definierad som ett element och har inga "
 "regler; menade du %s?"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "symbolen %s används, men är inte definierad som ett element och har inga "
 "regler"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr "POSIX yacc reserverar %%type för icketerminaler"
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "symbolen %s omdeklarerad"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
-msgstr "icketerminaler kan inte ges ett explicit nummer"
+msgid "nonterminals cannot be given a token code"
+msgstr "icketerminaler kan inte ges en elementkod"
 
-#: src/symtab.c:575
+#: src/symtab.c:594
 #, c-format
-msgid "redefining user token number of %s"
-msgstr "omdefinition av elementnummer för %s"
+msgid "redefining code of token %s"
+msgstr "omdefinition av koden för elementet %s"
 
-#: src/symtab.c:578
+#: src/symtab.c:597
 #, c-format
-msgid "user token number of %s too large"
-msgstr "användarelementnumret för %s är för stort"
+msgid "code of token %s too large"
+msgstr "koden för elementet %s är för stor"
 
-#: src/symtab.c:617
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr "strängkonstanten %s är inte fäst vid en symbol"
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "oanvändbar %s för typen <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "typen <%s> används, men är inte associerad med någon symbol"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr "icketerminaler kan inte ges ett strängalias"
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "symbolen %s används mer än en gång som en bokstavlig sträng"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "symbolen %s har fått mer än en bokstavlig sträng"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "omdeklaration av användarelementnummer %d för %s"
+msgid "code %d reassigned to token %s"
+msgstr "koden %d omtilldelad till elementet %s"
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "föregående deklaration för %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr "elementnumret är för stort"
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "startsymbolen %s är odefinierad"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "startsymbolen %s är ett element"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "oanvändbar precedens och associativitet för %s"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "oanvändbar precedens för %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "oanvändbar associativitet för %s, använd %%precedence"
diff --git a/po/tr.gmo b/po/tr.gmo
index dda07f5..de5d224 100644
--- a/po/tr.gmo
+++ b/po/tr.gmo
Binary files differ
diff --git a/po/tr.po b/po/tr.po
index 622501c..1ff6fff 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: bison 3.0.4\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2017-09-23 13:30+0000\n"
 "Last-Translator: Mesutcan Kurt <mesutcank@gmail.com>\n"
 "Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n"
@@ -22,205 +22,363 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "X-POOTLE-MTIME: 1506173454.000000\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "geçersiz karakter"
+
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "ölümcül hata"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr ""
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "beklenmeyen dosya sonu"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr ""
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, fuzzy, c-format
 msgid "empty rules without %empty"
 msgstr "%%empty içermeyen boş kural"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr ""
 
-#: src/complain.c:120
+#: src/complain.c:160
 #, fuzzy
 msgid "useless precedence and associativity"
 msgstr "%s için yararsız önceliklendirme ve ilişkilendirme"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr ""
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr ""
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr ""
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr ""
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "uyarı"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "hata"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "ölümcül hata"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr ""
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "geçersiz yönerge: %s, %s kullan"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, fuzzy, c-format
 msgid "duplicate directive"
 msgstr "geçersiz yönerge: %s kullan"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, fuzzy, c-format
 msgid "duplicate directive: %s"
 msgstr "geçersiz yönerge: %s kullan"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "önceki bildirim"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "her kural icin sadece bir %s kullanılabilir"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+#, fuzzy
+msgid "syntax error"
+msgstr "ölümcül hata"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr ""
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr ""
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr ""
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr ""
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr ""
+
+#: src/conflicts.c:88
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr ""
 "    %d durumu %s andacı arasındaki çelişki kaydırılarak çözümlendi"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr ""
 "    %d durumu %s andacı arasındaki çelişki indirgenerek çözümlendi"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr ""
 "    %d durumu %s andacı arasındaki çelişki hata olarak çözümlendi"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Durum %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "çelişkiler: %d öteleme/indirgeme, %d indirgeme/indirgeme\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "çelişkiler: %d öteleme/indirgeme\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "çelişkiler: %d indirgeme/indirgeme\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, fuzzy, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "öteleme/indirgeme çelişkisi: %d bulunan, %d beklenen"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, fuzzy, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "indirgeme/indirgeme çelişkisi: %d bulunan, %d beklenen"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr sadece GLR ayrıştırıcıları için geçerlidir"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "öteleme/indirgeme çelişkisi: %d bulunan, %d beklenen"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d öteleme/indirgeme çelişkisi"
 msgstr[1] "%d öteleme/indirgeme çelişkileri"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "indirgeme/indirgeme çelişkisi: %d bulunan, %d beklenen"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d indirgeme/indirgeme çelişkisi"
 msgstr[1] "%d indirgeme/indirgeme çelişkisi"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "önceki bildirim"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "önceki bildirim"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "önceki bildirim"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "önceki bildirim"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "%d öteleme/indirgeme çelişkisi"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "%d indirgeme/indirgeme çelişkisi"
+msgstr[1] "%d indirgeme/indirgeme çelişkisi"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: açılamıyor"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "girdi/çıktı hatası"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "dosya kapatılamıyor"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "girdi dosyası %s in üzerine yazılma reddediliyor"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "%s dosyasına çelişen çıktılar"
@@ -230,96 +388,96 @@
 msgid "%s: cannot backup"
 msgstr "%s: açılamıyor"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr ""
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr ""
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr ""
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 #, fuzzy
 msgid "describe shift/reduce conflicts solving"
 msgstr "%d öteleme/indirgeme çelişkisi"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr ""
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr ""
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr ""
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr ""
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Daha fazla bilgi için '%s --help' yazın.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Kullanım: %s [SEÇENEK]... DOSYA\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 #, fuzzy
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
@@ -331,18 +489,18 @@
 "kanonik LR(1) desteği deneyseldir.\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Uzun seçenekler için zorunlu olan argümanlar kısa seçenekler için de "
 "zorunludur.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Aynı şey isteğe bağlı argümanlar için de doğrudur.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 #, fuzzy
 msgid ""
 "Operation Modes:\n"
@@ -369,7 +527,7 @@
 "  -f, --feature[=ÖZELLİK]    çeşitli özellikleri etkinleştir\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -378,7 +536,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, fuzzy, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -410,20 +568,24 @@
 "  -l, --no-lines                   '#line' direktiflerini oluşturma\n"
 "  -k, --token-table                token isimlerinin bir tablosunu dahil et\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Çıktı:\n"
 "      --defines[=DOSYA]       ayrıca bir başlık dosyası üret\n"
@@ -439,53 +601,49 @@
 "raporla\n"
 "                             (XML şeması deneyseldir)\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Hataları <%s> e bildirin.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "%s ana sayfası: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+#, fuzzy
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
 "GNU yazılımını kullanmak için genel yardım: <http://www.gnu.org/"
 "gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+#, fuzzy
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 "Çeviri hatalarını <http://translationproject.org/team/tr.html> a "
 "bildirin.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr ""
 "Belgelendirmenin tamamı için, şu komutu çalıştırın: info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Yazanlar: Robert Corbett ve Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Telif Hakkı (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -495,36 +653,41 @@
 "yoktur; hatta SATILABİLİRLİĞİ veya ŞAHSİ KULLANIMINIZA UYGUNLUĞU için "
 "bile garanti verilmez.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "çoklu iskeletler geçersizdir"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: geçersiz dil"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "çoklu dil bildirimleri geçersizdir"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, fuzzy, c-format
+msgid "invalid argument for %s: %s"
+msgstr "geçersiz argüman: %2$s için %1$s"
+
+#: src/getargs.c:868
 #, fuzzy, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "geçersiz yönerge: %s, %s kullan"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, fuzzy, c-format
 msgid "missing operand"
 msgstr "%s: eksik işleç"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "fazla işleç %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Gramer"
 
@@ -541,17 +704,27 @@
 "// Ana sayfa: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+#, fuzzy
+msgid "end of file"
+msgstr "beklenmeyen dosya sonu"
+
+#: src/i18n-strings.c:36
+#, fuzzy
+msgid "invalid token"
+msgstr "geçersiz karakter"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "satır sayısı taşması"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "sütun sayısı taşması"
 
-#: src/location.c:155
+#: src/location.c:143
 #, fuzzy, c-format
 msgid "byte number overflow"
 msgstr "satır sayısı taşması"
@@ -561,231 +734,282 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr ""
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "ayrıştırıcıda çeliskiler yüzünden kural yararsız"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "%%define değişken %s yeniden tanımlandı"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "önceki tanım"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: tanımsız %%define değişkeni %s"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "%%define değişken %s yeniden tanımlandı"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "%%define değişken %s yeniden tanımlandı"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "%%define değişken %s yeniden tanımlandı"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "%%define Boolean değişkeni %s için geçersiz değer"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "%%define değişkeni %s için geçersiz değer: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "kabul edilen değer: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+#, fuzzy
+msgid "translatable string"
+msgstr "sonlandırılmamış dizge"
+
+#: src/parse-gram.y:214
+#, fuzzy
+msgid "[identifier]"
+msgstr "geçersiz tanımlayıcı: %s"
+
+#: src/parse-gram.y:215
+#, fuzzy
+msgid "character literal"
+msgstr "boş karakter dizgesi"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+#, fuzzy
+msgid "identifier"
+msgstr "geçersiz tanımlayıcı: %s"
+
+#: src/parse-gram.y:220
+#, fuzzy
+msgid "identifier:"
+msgstr "geçersiz tanımlayıcı: %s"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+#, fuzzy
+msgid "integer literal"
+msgstr "boş karakter dizgesi"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr ""
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr ""
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, fuzzy, c-format
 msgid "definition of %s"
 msgstr "kullanıcı andacı %s tekrar tanımlanıyor"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "parametre bildiriminde eksik tanıtıcı"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, fuzzy, c-format
 msgid "invalid version requirement: %s"
 msgstr "geçersiz önceleme dizgesi: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr ""
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Durum %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, fuzzy, c-format
+msgid "%s failed with status %d"
+msgstr "alt program `%s' başarısız (hata kodu: %d)"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "ötele, ve durum %d'ye git\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "durum %d'ye git\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "hata (birleşmeli değil)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "kural %d (%s) ile indirgeme"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "onayla"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "kural %d (%s) ile indirgeme"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$öntanımlı"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Sabit simgeler, içinde geçtikleri kurallarla birlikte"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Sabit simgeler, içinde geçtikleri kurallarla birlikte"
 
-#: src/print.c:416
+#: src/print.c:431
 #, fuzzy
 msgid "on left:"
 msgstr " (sol tarafta):"
 
-#: src/print.c:425
+#: src/print.c:440
 #, fuzzy
 msgid "on right:"
 msgstr " (sağ tarafta):"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Ayrıştırıcıda çeliskiler yüzünden kurallar yararsız"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "çoklu %s bildirimleri"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "birleştirme fonksiyonu '%s'de sonuç tip çatışması: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "%s için çoklu sembol ismi yoksayıldı"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "bir andaç olan %s için kural verilmiş"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "öntanımlı eylem üzerinde tip çatışması: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr ""
 "Tipli değişken simge için boş kural tanımlanmış, ve eylem belirtilmemiş"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "kullanılmayan değer: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "değeri sıfırla: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "boş-olmayan kuralda %%empty"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "%%empty içermeyen boş kural"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "%%prec için simge tanımlı değil: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr ""
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s sadece GLR ayrıştırıcıları etkiler"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s'i pozitif bir sayı izlemeli"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr ""
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "kural çok uzun"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "başlangıç simgesi %s tanımlanmamış"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "başlangıç simgesi %s bir andaç"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "girdi gramer içinde kural yok"
@@ -794,262 +1018,257 @@
 msgid "rule useless in grammar"
 msgstr "gramerde kural yararsız"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "gramerde terminal olmayan yararsız: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Değişken simgeler gramerde yararsız"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Sabit simgeler gramerde kullanılmadı"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Kurallar gramerde yararsız"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d değişken simge gramerde yararsız"
 msgstr[1] "%d değişken simge gramerde yararsız"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d kural gramerde yararsız"
 msgstr[1] "%d kural gramerde yararsız"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "başlangıç simgesi %s herhangi bir cümleden türemiyor"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "fazladan '%s'"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "%c%s'i %s'te ifade ediyor"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "muhtemelen kasdedilen: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", %c gizleniyor"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " %s te"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, fuzzy, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", $%d de orta-kural eyleminden erişilemiyor"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "tam sayı kapsam dışı: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "geçersiz referans: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 "'%c'den sonra sözdizimi hatası, tamsayı, harf, '_', '[' veya '$' "
 "bekleniyor"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "sembol üründe $%d den önce bulunamadı: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "sembol üründe bulunamadı: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "yanıltıcı referans: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "belirsiz referans: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "tiplenmemiş gramer içinde verilen açık tip"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "ortakural için $$, $%d'inde %s'in tanımlı bir tipe sahip değil"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$'i %s'in tanımlı bir tipe sahip değil"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s'i %s'in tanımlı bir tipe sahip değil "
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr ""
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "\\-escape den sonra geçersiz sayı: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "fazladan `,' boşluk olarak algılandı"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "geçersiz yönerge: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "geçersiz tanımlayıcı: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "geçersiz karakter"
 msgstr[1] "geçersiz karakterler"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "geçersiz 'null' karakter"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "parantez içindeki isimde beklenmeyen tanımlayıcı: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "bir tanımlayıcı bekleniyor"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "parantez içindeki isimde geçersiz karakter"
 msgstr[1] "parantez içindeki isimde geçersiz karakterler"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr ""
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "boş karakter dizgesi"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "karakter dizgesinde fazladan karakterler"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "\\-escape den sonra geçersiz sayı: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "\\-escape den sonra geçersiz karakter: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr ""
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "dosyanın sonunda eksik %s"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "satır sonunda eksik %s"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "iskelette kapatılmamış %s direktifi"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "iskelette %s direktifi için çok az sayıda argüman"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "iskelette %s direktifi için çok fazla argüman"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc sembol isimlerinde tire kullanılmasına izin vermez: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "girdi gramerde çok fazla simge var (sınır: %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "%2$s için tekrar %1$s bildirimi"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s yeniden tanımlama <%s> için"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "sembol %s yeniden bildirildi"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "sembol %s yeniden bildirildi"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, fuzzy, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1057,107 +1276,112 @@
 msgstr ""
 "simge %s kullanılmış, fakat andaç olarak tanımlanmamış ve kuralları yok"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "simge %s kullanılmış, fakat andaç olarak tanımlanmamış ve kuralları yok"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "sembol %s yeniden bildirildi"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
+msgid "nonterminals cannot be given a token code"
 msgstr ""
 
-#: src/symtab.c:575
-#, c-format
-msgid "redefining user token number of %s"
-msgstr "kullanıcı andacı %s tekrar tanımlanıyor"
-
-#: src/symtab.c:578
+#: src/symtab.c:594
 #, fuzzy, c-format
-msgid "user token number of %s too large"
+msgid "redefining code of token %s"
 msgstr "kullanıcı andacı %s tekrar tanımlanıyor"
 
-#: src/symtab.c:617
+#: src/symtab.c:597
+#, fuzzy, c-format
+msgid "code of token %s too large"
+msgstr "kullanıcı andacı %s tekrar tanımlanıyor"
+
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "yararsız %s tip <%s> için"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "tip <%s> kullanılmış, fakat hiçbir simge ile ilişkilendirilmemiş"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr ""
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "sembol %s, yalın dizge olarak birden fazla kullanılmış"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "sembol %s birden fazla yalın dizgeye atanmış"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "kullanıcı simge sayısı %d yeniden bildirimi %s için  "
+msgid "code %d reassigned to token %s"
+msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "%s için önceki bildirim"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr ""
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "başlangıç simgesi %s tanımlanmamış"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "başlangıç simgesi %s bir andaç"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "%s için yararsız önceliklendirme ve ilişkilendirme"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "%s için yararsız önceliklendirme"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "%s için yararsız ilişkisellik, %%precedence kullanın"
 
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "çoklu %s bildirimleri"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "girdi gramerde çok fazla simge var (sınır: %d)"
+
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "kullanıcı simge sayısı %d yeniden bildirimi %s için  "
+
 #, fuzzy
 #~ msgid "eliminate useless chain rules"
 #~ msgstr "gramerde terminal olmayan yararsız: %s"
@@ -1237,9 +1461,6 @@
 #~ "  'none'         üsttekilerin tümünü engelle\n"
 #~ "  "
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "geçersiz argüman: %2$s için %1$s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "%s argümanı, %s için belirsiz"
 
@@ -1365,41 +1586,6 @@
 #~ msgid "cannot open stats file for writing"
 #~ msgstr "istatistik dosyası yazmak için açılamıyor"
 
-#, fuzzy
-#~| msgid "unexpected end of file"
-#~ msgid "end \"ABC\" of file"
-#~ msgstr "beklenmeyen dosya sonu"
-
-#, fuzzy
-#~| msgid "unterminated string"
-#~ msgid "translatable string"
-#~ msgstr "sonlandırılmamış dizge"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "[identifier]"
-#~ msgstr "geçersiz tanımlayıcı: %s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "character literal"
-#~ msgstr "boş karakter dizgesi"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier"
-#~ msgstr "geçersiz tanımlayıcı: %s"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier:"
-#~ msgstr "geçersiz tanımlayıcı: %s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "integer literal"
-#~ msgstr "boş karakter dizgesi"
-
 #~ msgid "symbol %s redefined"
 #~ msgstr "%s simgesi tekrar tanımlanmış"
 
@@ -1552,9 +1738,6 @@
 #~ msgid "missing `{' in `%s'"
 #~ msgstr "`%s' içinde eksik `{'"
 
-#~ msgid "subsidiary program `%s' failed (exit status %d)"
-#~ msgstr "alt program `%s' başarısız (hata kodu: %d)"
-
 #~ msgid "conflicting precedences for %s and %s"
 #~ msgstr "%s ve %s için çelişen öncelikler"
 
diff --git a/po/uk.gmo b/po/uk.gmo
index 49db0dc..635dde9 100644
--- a/po/uk.gmo
+++ b/po/uk.gmo
Binary files differ
diff --git a/po/uk.po b/po/uk.po
index 6e627eb..a0b2287 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -3,13 +3,13 @@
 # This file is distributed under the same license as the bison package.
 #
 # Maxim V. Dziumanenko <dziumanenko@gmail.com>, 2007.
-# Yuri Chornoivan <yurchor@ukr.net>, 2012, 2013, 2018, 2019.
+# Yuri Chornoivan <yurchor@ukr.net>, 2012, 2013, 2018, 2019, 2020, 2021.
 msgid ""
 msgstr ""
-"Project-Id-Version: bison 3.4.91\n"
+"Project-Id-Version: bison 3.7.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-11-22 14:50+0200\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2021-08-13 12:07+0300\n"
 "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
 "Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
 "Language: uk\n"
@@ -19,164 +19,273 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
 "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n"
-"X-Generator: Lokalize 20.03.70\n"
+"X-Generator: Lokalize 20.12.0\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr "число"
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr "функція"
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr "змінна"
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr "помилка: ділення на нуль"
+
+#: examples/c/bistromathic/parse.y:372
+#, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "синтаксична помилка: некоректний символ: %c"
+
+#: examples/c/bistromathic/parse.y:389
+msgid "%@: syntax error"
+msgstr "%@: синтаксична помилка"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr "%@: синтаксична помилка: неочікуване %u"
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr "%@: синтаксична помилка: мало бути %0e перед %u"
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr "%@: синтаксична помилка: мало бути %0e або %1e перед %u"
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr "%@: синтаксична помилка: мало бути %0e, або %1e, або %2e перед %u"
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+"%@: синтаксична помилка: мало бути %0e, або %1e, або %2e, або %3e перед %u"
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+"%@: синтаксична помилка: мало бути %0e, або %1e, або %2e, або %3e, або %4e "
+"перед %u"
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+"%@: синтаксична помилка: мало бути %0e, або %1e, або %2e, або %3e, або %4e, "
+"або %5e перед %u"
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+"%@: синтаксична помилка: мало бути %0e, або %1e, або %2e, або %3e, або %4e, "
+"або %5e тощо перед %u"
+
+#: examples/java/calc/Calc.y:81
+msgid "end of line"
+msgstr "кінець рядка"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr "Конфлікти З/В (типово увімкнено)"
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr "Конфлікти В/В (типово увімкнено)"
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr "створювати контрприклади конфліктів"
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr "альтернативи рядка не пов'язано із символом"
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr "застарілі конструкції"
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, c-format
 msgid "empty rules without %empty"
 msgstr "порожні правила без %empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr "невстановлені або невикористані проміжні значення"
 
-#: src/complain.c:120
+#: src/complain.c:160
 msgid "useless precedence and associativity"
 msgstr "непотрібна пріоритетність або прив’язка"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr "несумісності із Yacc з POSIX"
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr "усі інші попередження (типово увімкнено)"
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
-msgstr "усі попередження, окрім «dangling-alias» та «yacc»"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
+msgstr "усі попередження, окрім «counterexamples», «dangling-alias» та «yacc»"
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr "вимкнути попередження з категорії КАТЕГОРІЯ"
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr "вимкнути усі попередження"
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr "вважати попередження помилками"
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr "Категорії попереджень:"
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "попередження"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "помилка"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "критична помилка: "
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr "примітка"
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr "У Yacc POSIX не передбачено підтримки %s"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "застаріла інструкція: %s, скористайтеся %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, c-format
 msgid "duplicate directive"
 msgstr "дублювання інструкції"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, c-format
 msgid "duplicate directive: %s"
 msgstr "дублювання інструкції: %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "попереднє оголошення"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "у правилі допускається лише один %s"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+msgid "syntax error"
+msgstr "синтаксична помилка"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr "неочікувана %0$s"
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr "очікувалося %1$s перед %0$s"
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr "очікувалося %1$s або %2$s перед %0$s"
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr "очікувалося %1$s, або %2$s, або %3$s перед %0$s"
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr "очікувалося %1$s, або %2$s, або %3$s, або %4$s перед %0$s"
+
+#: src/conflicts.c:88
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "Конфлікт між правилом %d та лексемою %s розв'язаний зсувом"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr "Конфлікт між правилом %d та лексемою %s розв'язаний виводом"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "Конфлікт між правилом %d та лексемою %s розв'язаний як помилка"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Стан %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "конфлікти: %d зсуву/виводу, %d виводу/виводу\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "конфлікти: %d зсуву/виводу\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "конфлікти: %d виводу/виводу\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "конфлікти зсуву/виводу для правила %d: виявлено: %d, мало бути: %d"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "конфлікти виводу/виводу для правила %d: виявлено: %d, мало бути: %d"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr застосовується лише до аналізатору GLR"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "конфлікти зсуву/виводу: виявлено: %d, мало бути: %d"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
@@ -185,12 +294,12 @@
 msgstr[2] "%d конфліктів зсуву/виводу"
 msgstr[3] "%d конфлікт зсуву/виводу"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "конфлікти виводу/виводу: виявлено: %d, мало бути: %d"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
@@ -199,27 +308,80 @@
 msgstr[2] "%d конфліктів виводу/виводу"
 msgstr[3] "%d конфлікт виводу/виводу"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+"перезапустіть із параметром «-Wcounterexamples» для створення контрприкладів "
+"конфліктів"
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr "Приклад"
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr "Перший приклад"
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr "Другий приклад"
+
+#: src/counterexample.c:126
+msgid "Shift derivation"
+msgstr "Похідна зсуву"
+
+#: src/counterexample.c:126
+msgid "First reduce derivation"
+msgstr "Перша похідна стискання"
+
+#: src/counterexample.c:128
+msgid "Reduce derivation"
+msgstr "Похідна стискання"
+
+#: src/counterexample.c:128
+msgid "Second reduce derivation"
+msgstr "Друга похідна стискання"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "конфлікт зсуву або стискання на лексемі %s"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ":"
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "конфлікт стискання/стискання на лексемах %s"
+msgstr[1] "конфлікт стискання/стискання на лексемах %s"
+msgstr[2] "конфлікт стискання/стискання на лексемах %s"
+msgstr[3] "конфлікт стискання/стискання на лексемі %s"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: не вдалося відкрити"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "помилка введення-виведення"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "не вдається закрити файл"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "відмовлено у перезаписі файла вхідних даних %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "суперечливий вивід у файл %s"
@@ -229,100 +391,100 @@
 msgid "%s: cannot backup"
 msgstr "%s: не вдалося створити резервну копію"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr "розфарбувати виведені дані"
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr "не розфарбовувати виведені дані"
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr "розфарбувати, якщо пристроєм виведення є термінал (tty)"
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr "Можна визначати такі УМОВИ:"
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr "описати стани"
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr "доповнити набори основних записів завершеннями"
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr "явним чином пов'язати елементи для пошуку вперед із записами"
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 msgid "describe shift/reduce conflicts solving"
 msgstr "описувати розв'язання конфліктів зсуву/виводу"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr "включити усі вказані вище відомості"
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr "вимкнути звітування"
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 "ЕЛЕМЕНТИ — це список відокремлених комами слів, до якого може бути включено:"
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 "ТРАСУВАННЯ — це список відокремлених комами слів, до якого може бути "
 "включено:"
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr "показати помилки за допомогою каре"
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr "показати виправлення для читання комп'ютером"
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr "не створювати файлів-результатів"
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr "усе, що наведено вище"
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr "вимкнути усе, що наведено вище"
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 "МОЖЛИВОСТІ — це список відокремлених комами слів, до якого може бути "
 "включено:"
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Віддайте команду «%s --help», щоб дізнатися більше.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Використання: %s [КЛЮЧІ]... ФАЙЛ\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
@@ -331,18 +493,18 @@
 "Створити детерміністичний аналізатор LR або узагальнений LR (GLR) з\n"
 "використанням LALR(1), IELR(1) або канонічних таблиць LR(1).\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Обов’язкові аргументи для довгих форм запису параметрів є обов’язковими і "
 "для скорочених форм.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Те саме стосується необов’язкових аргументів.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -372,7 +534,7 @@
 "  -f, --feature[=МОЖЛИВОСТІ] задіяти різноманітні можливості\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -389,7 +551,7 @@
 "даних\n"
 "\n"
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -423,22 +585,26 @@
 "  -k, --token-table                включити таблицю назв елементів\n"
 "  -y, --yacc                       імітувати роботу Yacc з POSIX\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Виведення до файлів:\n"
-"      --defines[=ФАЙЛ]       створити також файл заголовків\n"
+"   -H, --header=[ФАЙЛ]       створити також файл заголовків\n"
 "  -d                         подібне, але без можливості вказати ФАЙЛ (для "
 "Yacc POSIX)\n"
 "  -r, --report=ЕЛЕМЕНТИ      також створити автоматичні записи подробиць\n"
@@ -448,54 +614,52 @@
 "  -o, --output=ФАЙЛ          вивести дані до ФАЙЛа\n"
 "  -g, --graph[=ФАЙЛ]         вивести граф автомата\n"
 "  -x, --xml[=ФАЙЛ]           вивести звіт автомата у форматі XML\n"
+"      --html[=ФАЙЛ]          також створити звіт автомата у форматі HTML\n"
+"  -M, --file-prefix-map=СТАРИЙ=НОВИЙ замінити префікс СТАРИЙ на НОВИЙ при "
+"запису шляхів до файлів\n"
+"                                у виведених файлах\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Сповіщайте про помилки за адресою <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "Домашня сторінка %s: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr ""
-"Загальна довідка щодо використання програмного забезпечення GNU: <http://www."
-"gnu.org/gethelp/>.\n"
+"Загальна довідкова інформація щодо використання програмного забезпечення "
+"GNU: <https://www.gnu.org/gethelp/>\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 "Звіти щодо вад у перекладах слід надсилати за адресами, вказаними тут: "
-"<http://translationproject.org/team/>.\n"
+"<https://translationproject.org/team/>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr ""
 "З повною документацією можна ознайомитися за допомогою команди info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Автори: Роберт Корбет та Річард Столмен.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Copyright (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -506,36 +670,41 @@
 "гарантій працездатності\n"
 "або придатності для певної мети.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "не можна використовувати декілька оголошень шаблонів"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: некоректна мова"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "визначення декількох оголошень мов є некоректним"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, c-format
+msgid "invalid argument for %s: %s"
+msgstr "некоректній аргумент %s: %s"
+
+#: src/getargs.c:868
 #, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "застарілий параметр: %s, скористайтеся замість нього %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, c-format
 msgid "missing operand"
 msgstr "пропущено операнд"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "зайвий операнд %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Граматика"
 
@@ -552,17 +721,25 @@
 "// Домашня сторінка: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+msgid "end of file"
+msgstr "кінець файла"
+
+#: src/i18n-strings.c:36
+msgid "invalid token"
+msgstr "некоректна лексема"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "переповнення номеру рядка"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "переповнення номеру стовпчика"
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
 msgstr "переповнення номеру байта"
@@ -572,230 +749,275 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr "..."
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "правило є зайвим у аналізаторі через конфлікти"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 "можна застосувати виправлення. Запустіть ще раз із параметром «--update»."
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "змінну %%define %s перевизначено"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "попереднє визначення"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: невизначена змінна %%define %s"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "змінну %%define «%s» мало бути поєднано зі значеннями «{...}»"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "змінну %%define «%s» мало бути поєднано зі значеннями ключових слів"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "змінну %%define «%s» мало бути поєднано зі значеннями «\"...\"»"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "некоректне значення булевої змінної %%define %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "некоректне значення змінної %%define %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "прийняте значення: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr "рядок"
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr "придатний до перекладу рядок"
+
+#: src/parse-gram.y:214
+msgid "[identifier]"
+msgstr "[ідентифікатор]"
+
+#: src/parse-gram.y:215
+msgid "character literal"
+msgstr "символьна стала"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr "епілог"
+
+#: src/parse-gram.y:219
+msgid "identifier"
+msgstr "ідентифікатор"
+
+#: src/parse-gram.y:220
+msgid "identifier:"
+msgstr "ідентифікатор:"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr "<теґ>"
+
+#: src/parse-gram.y:250
+msgid "integer literal"
+msgstr "цілочисельна стала"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr "символьні літерали не можуть бути нетермінальними"
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr "символьні літерали не можна використовувати разом із %s"
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, c-format
 msgid "definition of %s"
 msgstr "визначення %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "у описі параметра відсутній ідентифікатор"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, c-format
 msgid "invalid version requirement: %s"
 msgstr "некоректна вимога щодо версії: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr "потрібна версія bison %s, а маємо лише %s"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Стан %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr "помилка %s із кодом стану %d"
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "зсув, та перехід у стан %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "перехід у стан %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "помилка (не асоціативна)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "вивід з використанням правила %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "прийняти"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "вивід з використанням правила %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "Термінальні символи з правилами, у яких вони з'являються"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "Нетермінальні символи з правилами, у яких вони з'являються"
 
-#: src/print.c:416
+#: src/print.c:431
 msgid "on left:"
 msgstr "ліворуч:"
 
-#: src/print.c:425
+#: src/print.c:440
 msgid "on right:"
 msgstr "праворуч:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Правила є зайвими у аналізаторі через конфлікти"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "багатократні описи %s"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "конфлікт типів результатів під час об’єднання функції %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "проігноровано дублікат назви символу %s"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "правило задано для %s, який є лексемою"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "конфлікт типів на типовій дії: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr ""
 "порожнє правило для типізованого нетермінального символу, та відсутня дія"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "не використане значення: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "не встановлене значення: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty у непорожньому правилі"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "порожнє правило без %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "елемент %%prec не визначено: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr "типізованими можуть бути лише проміжні дії: %s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s впливає лише на аналізатори GLR"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "за %s повинно слідувати додатне число"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr "У Yacc POSIX не передбачено підтримки типізованих проміжних дій"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "правило надто довге"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "початковий символ %s невизначений"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "початковий символ %s є лексемою"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "відсутні правила у вхідній граматиці"
@@ -804,24 +1026,24 @@
 msgid "rule useless in grammar"
 msgstr "зайве правило у граматиці"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "нетермінал є зайвим у граматиці: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "Нетермінали зайві у граматиці"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "Невикористані термінали у граматиці"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Зайві правила у граматиці"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
@@ -830,7 +1052,7 @@
 msgstr[2] "%d зайвих нетерміналів у граматиці"
 msgstr[3] "%d зайвий нетермінал у граматиці"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
@@ -839,119 +1061,124 @@
 msgstr[2] "%d зайвих правил у граматиці"
 msgstr[3] "%d зайве правило у граматиці"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "початковий символ %s не виводить жодного речення"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "зайвий символ '%s'"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "посилається на: %c%s у %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "ймовірно мало бути: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", приховування %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " у %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", доступ з дії проміжного правила неможливий у $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "вихід за межі діапазону цілого числа: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "некоректне посилання: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr ""
 "синтаксична помилка після '%c'. Мало бути вказано ціле число, літеру, '_', "
 "'[' або '$'"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "у продукції не знайдено символу до $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "у продукції не знайдено символу: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "помилкове посилання: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "неоднозначне посилання: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "у нетипізованій граматиці явним чином вказано тип"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ для проміжного правила у $%d %s немає оголошеного типу"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ %s не має оголошеного типу"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s %s не має оголошеного типу"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr "декілька записів $%d із api.value.automove"
 
-#: src/scan-gram.l:198
+#: src/scan-gram.l:93
+#, c-format
+msgid "invalid number after \\-escape: %s"
+msgstr "некоректне число після екранування \\: %s"
+
+#: src/scan-gram.l:214
 #, c-format
 msgid "stray ',' treated as white space"
 msgstr "зайва кома, вважатиметься пробілом"
 
-#: src/scan-gram.l:292
+#: src/scan-gram.l:309
 #, c-format
 msgid "invalid directive: %s"
 msgstr "некоректна директива: %s"
 
-#: src/scan-gram.l:313
+#: src/scan-gram.l:331
 #, c-format
 msgid "invalid identifier: %s"
 msgstr "некоректний ідентифікатор: %s"
 
-#: src/scan-gram.l:365
+#: src/scan-gram.l:385
 msgid "invalid character"
 msgid_plural "invalid characters"
 msgstr[0] "некоректні символи"
@@ -959,22 +1186,22 @@
 msgstr[2] "некоректні символи"
 msgstr[3] "некоректний символ"
 
-#: src/scan-gram.l:383
+#: src/scan-gram.l:405
 #, c-format
 msgid "invalid null character"
 msgstr "неприпустимий null-символ"
 
-#: src/scan-gram.l:437
+#: src/scan-gram.l:463
 #, c-format
 msgid "unexpected identifier in bracketed name: %s"
 msgstr "неочікуваний ідентифікатор у назву у дужках: %s"
 
-#: src/scan-gram.l:459
+#: src/scan-gram.l:487
 #, c-format
 msgid "an identifier expected"
 msgstr "мало бути вказано ідентифікатор"
 
-#: src/scan-gram.l:464
+#: src/scan-gram.l:494
 msgid "invalid character in bracketed name"
 msgid_plural "invalid characters in bracketed name"
 msgstr[0] "некоректні символи у назві у дужках"
@@ -982,92 +1209,82 @@
 msgstr[2] "некоректні символи у назві у дужках"
 msgstr[3] "некоректний символ у назві у дужках"
 
-#: src/scan-gram.l:535
+#: src/scan-gram.l:567 src/scan-gram.l:582
 #, c-format
 msgid "POSIX Yacc does not support string literals"
 msgstr "У Yacc POSIX не передбачено підтримки рядкових літералів"
 
-#: src/scan-gram.l:557
+#: src/scan-gram.l:605
 #, c-format
 msgid "empty character literal"
 msgstr "порожня символьна стала"
 
-#: src/scan-gram.l:563
+#: src/scan-gram.l:611
 #, c-format
 msgid "extra characters in character literal"
 msgstr "зайві символи у символьній сталій"
 
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
-#, c-format
-msgid "invalid number after \\-escape: %s"
-msgstr "некоректне число після екранування \\: %s"
-
-#: src/scan-gram.l:652
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "некоректний символ після екранування \\: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr "У Yacc POSIX не передбачено підтримки шістнадцяткових літералів"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "не вистачає %s наприкінці файла"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "не вистачає %s наприкінці рядка"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "незавершена інструкція %s у шаблоні"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "занадто мало аргументів у інструкції %s шаблона"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "занадто багато аргументів у інструкції %s шаблона"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "Yacc POSIX забороняє використання дефісів у назва символів: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "надто багато символів (лексеми плюс нетермінали); максимально %d"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "повторний опис %s для %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "повторний опис %s для <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "символ %s визначений повторно як лексема"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "символ %s визначений повторно як нетермінальний"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1076,405 +1293,103 @@
 "символ %s використовується, але не визначений як лексема та не має правил; "
 "ви мали на увазі %s?"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "символ %s використовується, але не визначений як лексема та не має правил"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 "У стандарті POSIX для yacc %%type зарезервовано для нетермінальних значень"
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "символ %s визначений повторно"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
-msgstr "нетермінальні записи не можна надавати як явні числа"
+msgid "nonterminals cannot be given a token code"
+msgstr "нетермінальні записи не можна надавати як код лексеми"
 
-#: src/symtab.c:575
+#: src/symtab.c:594
 #, c-format
-msgid "redefining user token number of %s"
-msgstr "перевизначення номера лексеми користувача для %s"
+msgid "redefining code of token %s"
+msgstr "перевизначення коду лексеми %s"
 
-#: src/symtab.c:578
+#: src/symtab.c:597
 #, c-format
-msgid "user token number of %s too large"
-msgstr "номер елемента користувача для %s є надто великим"
+msgid "code of token %s too large"
+msgstr "код лексеми %s є надто великим"
 
-#: src/symtab.c:617
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr "рядковий літерал %s, який не пов'язано із символом"
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "непотрібне %s для типу <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "використано тип <%s>, але його не пов’язано з жодним символом"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr "нетермінальні записи не можна надавати як альтернативу рядка"
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "символ %s використано декілька разів як сталий рядок символів"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "символ %s вказано декілька сталих рядків (літералів)"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "повторне оголошення елемента користувача з номером %d для %s"
+msgid "code %d reassigned to token %s"
+msgstr "код %d перепризначено до лексеми %s"
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "попереднє оголошення %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
-msgstr "номер елемента є надто великим"
+msgstr "номер лексеми є надто великим"
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "початковий символ %s невизначений"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "початковий символ %s є лексемою"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "непотрібна пріоритетність або прив’язка для %s"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "непотрібна пріоритетність для %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "непотрібна прив’язка для %s, скористайтеся %%precedence"
 
-#~ msgid "deprecated directive, use %s"
-#~ msgstr "застаріла інструкція, скористайтеся %s"
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
 
-#~ msgid ""
-#~ "Warning categories include:\n"
-#~ "  'conflicts-sr'      S/R conflicts (enabled by default)\n"
-#~ "  'conflicts-rr'      R/R conflicts (enabled by default)\n"
-#~ "  'deprecated'        obsolete constructs\n"
-#~ "  'empty-rule'        empty rules without %empty\n"
-#~ "  'midrule-values'    unset or unused midrule values\n"
-#~ "  'precedence'        useless precedence and associativity\n"
-#~ "  'yacc'              incompatibilities with POSIX Yacc\n"
-#~ "  'other'             all other warnings (enabled by default)\n"
-#~ "  'all'               all the warnings except 'yacc'\n"
-#~ "  'no-CATEGORY'       turn off warnings in CATEGORY\n"
-#~ "  'none'              turn off all the warnings\n"
-#~ "  'error[=CATEGORY]'  treat warnings as errors\n"
-#~ msgstr ""
-#~ "Категорії попереджень:\n"
-#~ "  «conflicts-sr»    S/R-конфлікти (типово увімкнено)\n"
-#~ "  «conflicts-rr»    R/R conflicts (типово увімкнено)\n"
-#~ "  «deprecated»      застарілі конструкції\n"
-#~ "  «empty-rule»      порожні правила без %empty\n"
-#~ "  «midrule-values»  невстановлені або невикористані проміжні значення\n"
-#~ "  «precedence»      непотрібні пріоритетності та прив’язки\n"
-#~ "  «yacc»            несумісності з Yacc POSIX\n"
-#~ "  «other»           всі інші попередження (типово увімкнено)\n"
-#~ "  «all»             всі попередження\n"
-#~ "  «no-КАТЕГОРІЯ»    вимкнути попередження з КАТЕГОРІЇ\n"
-#~ "  «none»            вимкнути всі попередження\n"
-#~ "  «error»           вважати попередження помилками\n"
-#~ "\n"
+#~ msgid "multiple %s declarations"
+#~ msgstr "багатократні описи %s"
 
-#~ msgid ""
-#~ "THINGS is a list of comma separated words that can include:\n"
-#~ "  'state'        describe the states\n"
-#~ "  'itemset'      complete the core item sets with their closure\n"
-#~ "  'lookahead'    explicitly associate lookahead tokens to items\n"
-#~ "  'solved'       describe shift/reduce conflicts solving\n"
-#~ "  'all'          include all the above information\n"
-#~ "  'none'         disable the report\n"
-#~ msgstr ""
-#~ "THINGS - список розділених комою слів, які можуть включати:\n"
-#~ "  «state»        описує стани\n"
-#~ "  «itemset»      завершити набір елементів ядра та закрити їх\n"
-#~ "  «lookahead»    явна прив'язати ознаки lookahead до елементів\n"
-#~ "  «solved»       описати вирішення конфліктів зсуву/виводу\n"
-#~ "  «all»          включати всю наведену вище інформацію\n"
-#~ "  «none»         вимкнути звіт\n"
-
-#~ msgid ""
-#~ "FEATURES is a list of comma separated words that can include:\n"
-#~ "  'caret', 'diagnostics-show-caret'\n"
-#~ "    show errors with carets\n"
-#~ "  'fixit', 'diagnostics-parseable-fixits'\n"
-#~ "    show machine-readable fixes\n"
-#~ "  'syntax-only'\n"
-#~ "    do not generate any file\n"
-#~ "  'all'\n"
-#~ "    all of the above\n"
-#~ "  'none'\n"
-#~ "    disable all of the above\n"
-#~ "  "
-#~ msgstr ""
-#~ "МОЖЛИВОСТІ — список слів, відокремлених комами. Можливі слова:\n"
-#~ "  «caret», «diagnostics-show-caret»\n"
-#~ "    показати помилки, пов’язані з символами ^\n"
-#~ "  «fixit», «diagnostics-parseable-fixits»\n"
-#~ "    показати придатні до читання комп'ютером виправлення\n"
-#~ "  'syntax-only'\n"
-#~ "    не створювати файла результатів\n"
-#~ "  «all»\n"
-#~ "    всі, які вказано вище\n"
-#~ "  «none»\n"
-#~ "    вимкнути всі вказані вище\n"
-#~ "  "
-
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "неприпустимий аргумент %s для %s"
-
-#~ msgid "ambiguous argument %s for %s"
-#~ msgstr "неоднозначний аргумент %s для %s"
-
-#~ msgid "Valid arguments are:"
-#~ msgstr "Допустимі аргументи:"
-
-#~ msgid "write error"
-#~ msgstr "помилка запису"
-
-#~ msgid "Unknown system error"
-#~ msgstr "Невідома системна помилка"
-
-#~ msgid "%s: option '%s%s' is ambiguous\n"
-#~ msgstr "%s: параметр «%s%s» не є однозначним\n"
-
-#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
-#~ msgstr "%s: неоднозначний параметр «%s%s»; можливі варіанти:"
-
-#~ msgid "%s: unrecognized option '%s%s'\n"
-#~ msgstr "%s: невідомий параметр «%s%s»\n"
-
-#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
-#~ msgstr "%s: додавання аргументів до параметра «%s%s» не передбачено\n"
-
-#~ msgid "%s: option '%s%s' requires an argument\n"
-#~ msgstr "%s: до параметра «%s%s» слід додати аргумент\n"
-
-#~ msgid "%s: invalid option -- '%c'\n"
-#~ msgstr "%s: некоректний параметр — «%c»\n"
-
-#~ msgid "%s: option requires an argument -- '%c'\n"
-#~ msgstr "%s: до параметра слід додати аргумент — «%c»\n"
-
-#~ msgid "memory exhausted"
-#~ msgstr "пам'ять вичерпано"
-
-#~ msgid "cannot create pipe"
-#~ msgstr "не вдалося створити канал"
-
-#~ msgid "%s subprocess failed"
-#~ msgstr "Помилка підпроцесу %s"
-
-#~ msgid "`"
-#~ msgstr "`"
-
-#~ msgid "'"
-#~ msgstr "'"
-
-#~ msgid "Execution times (seconds)"
-#~ msgstr "Час виконання (у секундах)"
-
-#~ msgid "CPU user"
-#~ msgstr "Користувач процесора"
-
-#~ msgid "CPU system"
-#~ msgstr "Система процесора"
-
-#~ msgid "wall clock"
-#~ msgstr "настінний годинник"
-
-#~ msgid "_open_osfhandle failed"
-#~ msgstr "Помилка _open_osfhandle"
-
-#~ msgid "cannot restore fd %d: dup2 failed"
-#~ msgstr "Не вдалося відновити fd %d: помилка dup2"
-
-#~ msgid "%s subprocess"
-#~ msgstr "Підпроцес %s"
-
-#~ msgid "%s subprocess got fatal signal %d"
-#~ msgstr "Підпроцесом %s отримано сигнал щодо аварійного завершення %d"
-
-#~ msgid "symbol %s redefined"
-#~ msgstr "повторне визначення символу %s"
-
-#~ msgid "removing of '%s' failed"
-#~ msgstr "спроба вилучення «%s» зазнала невдачі"
-
-#~ msgid "creation of a temporary file failed"
-#~ msgstr "спроба створення тимчасового файла зазнала невдачі"
-
-#~ msgid "saving stdin failed"
-#~ msgstr "спроба збереження stdin зазнала невдачі"
-
-#~ msgid "saving stdout failed"
-#~ msgstr "спроба збереження stdout зазнала невдачі"
-
-#~ msgid "opening of tmpfile failed"
-#~ msgstr "спроба відкриття файла тимчасових даних зазнала невдачі"
-
-#~ msgid "redirecting bison's stdout to the temporary file failed"
-#~ msgstr ""
-#~ "спроба переспрямовування стандартного виведення bison до тимчасового "
-#~ "файла зазнала невдачі"
-
-#~ msgid "redirecting m4's stdin from the temporary file failed"
-#~ msgstr ""
-#~ "спроба переспрямовування стандартного джерела даних m4 з тимчасового "
-#~ "файла зазнала невдачі"
-
-#~ msgid "opening of a temporary file failed"
-#~ msgstr "не вдалося відкрити файл тимчасових даних"
-
-#~ msgid "redirecting m4's stdout to a temporary file failed"
-#~ msgstr ""
-#~ "спроба переспрямовування стандартного виведення m4 до тимчасового файла "
-#~ "зазнала невдачі"
-
-#~ msgid "subsidiary program '%s' interrupted"
-#~ msgstr "виконання допоміжної програми '%s' перервано"
-
-#~ msgid "subsidiary program '%s' not found"
-#~ msgstr "не вдалося знайти допоміжну програму '%s'"
-
-#~ msgid "redirecting bison's stdin from the temporary file failed"
-#~ msgstr ""
-#~ "спроба переспрямовування стандартного джерела даних bison з тимчасового "
-#~ "файла зазнала невдачі"
-
-#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
-#~ msgstr "%u bitset_allocs, %u звільнено (%.2f%%).\n"
-
-#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
-#~ msgstr "%u bitset_sets, %u кешовано (%.2f%%)\n"
-
-#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
-#~ msgstr "%u bitset_resets, %u кешовано (%.2f%%)\n"
-
-#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
-#~ msgstr "%u bitset_tests, %u кешовано (%.2f%%)\n"
-
-#~ msgid "%u bitset_lists\n"
-#~ msgstr "%u bitset_lists\n"
-
-#~ msgid "count log histogram\n"
-#~ msgstr "гістограма журналу лічильників\n"
-
-#~ msgid "size log histogram\n"
-#~ msgstr "гістограма журналу розміру\n"
-
-#~ msgid "density histogram\n"
-#~ msgstr "гістограма щільності\n"
-
-#~ msgid ""
-#~ "Bitset statistics:\n"
-#~ "\n"
-#~ msgstr ""
-#~ "Статистика бітових полів:\n"
-#~ "\n"
-
-#~ msgid "Accumulated runs = %u\n"
-#~ msgstr "Акумульовані запуски = %u\n"
-
-#~ msgid "cannot read stats file"
-#~ msgstr "не вдалося прочитати файл статистичних даних"
-
-#~ msgid "bad stats file size\n"
-#~ msgstr "помилковий розмір файла статистичних даних\n"
-
-#~ msgid "cannot write stats file"
-#~ msgstr "не вдалося записати файл статистичних даних."
-
-#~ msgid "cannot open stats file for writing"
-#~ msgstr "не вдалося відкрити файл статистичних даних для запису"
-
-#~ msgid " TOTAL                 :"
-#~ msgstr " ЗАГАЛОМ               :"
-
-#~ msgid "time in %s: %ld.%06ld (%ld%%)\n"
-#~ msgstr "час у %s: %ld.%06ld (%ld%%)\n"
-
-#~ msgid " type %d is %s\n"
-#~ msgstr " тип %d є %s\n"
-
-#~ msgid "invalid $ value: $%d"
-#~ msgstr "некоректне $ значення: $%d"
-
-#~ msgid "%s: option '--%s' doesn't allow an argument\n"
-#~ msgstr "%s: додавання аргументів до параметра «--%s» не передбачено\n"
-
-#~ msgid "%s: unrecognized option '--%s'\n"
-#~ msgstr "%s: невідомий параметр «--%s»\n"
-
-#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
-#~ msgstr "%s: додавання аргументів до параметра «-W %s» не передбачено\n"
-
-#~ msgid "%s: option '-W %s' requires an argument\n"
-#~ msgstr "%s: до параметра «-W %s» слід додати аргумент\n"
-
-#~ msgid "empty"
-#~ msgstr "порожній"
-
-#~ msgid "a ';' might be needed at the end of action code"
-#~ msgstr "наприкінці коду дії можливо потрібен символ ';'"
-
-#~ msgid "future versions of Bison will not add the ';'"
-#~ msgstr "у майбутніх версіях Bison символ ';' не додаватиметься"
-
-#~ msgid "use of YYFAIL, which is deprecated and will be removed"
-#~ msgstr ""
-#~ "використання YYFAIL. Вважається застарілим, буде вилучено у наступних "
-#~ "версіях."
-
-#~ msgid "redeclaration for default tagged %%destructor"
-#~ msgstr "повторне оголошення типового %%destructor з міткою"
-
-#~ msgid "redeclaration for default tagless %%destructor"
-#~ msgstr "повторне оголошення типового %%destructor без мітки"
-
-#~ msgid "redeclaration for default tagged %%printer"
-#~ msgstr "повторне оголошення типового %%printer з міткою"
-
-#~ msgid "redeclaration for default tagless %%printer"
-#~ msgstr "повторне оголошення типового %%printer без мітки"
-
-#~ msgid "state %d"
-#~ msgstr "стан %d"
-
-#~ msgid "stray '@'"
-#~ msgstr "зайвий символ '@'"
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "надто багато символів (лексеми плюс нетермінали); максимально %d"
diff --git a/po/vi.gmo b/po/vi.gmo
index a5bfbe4..fa5d51b 100644
--- a/po/vi.gmo
+++ b/po/vi.gmo
Binary files differ
diff --git a/po/vi.po b/po/vi.po
index 6335e8d..9351c0e 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: bison 3.1.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2018-11-01 14:56+0700\n"
 "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
 "Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
@@ -22,204 +22,361 @@
 "X-Language-Team-Website: <http://translationproject.org/team/vi.html>\n"
 "X-Generator: Gtranslator 2.91.7\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "ký tự không hợp lệ"
+
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "lỗi nghiêm trọng"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr ""
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "thiếu %s tại kết thúc tập tin"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr ""
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, fuzzy, c-format
 msgid "empty rules without %empty"
 msgstr "quy tắc trống rỗng không có %%empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr ""
 
-#: src/complain.c:120
+#: src/complain.c:160
 #, fuzzy
 msgid "useless precedence and associativity"
 msgstr "quyền ưu tiên và tính kết hợp vô ích đối với %s"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr ""
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr ""
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr ""
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr ""
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "cảnh báo"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "lỗi"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "lỗi nghiêm trọng"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, fuzzy, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr "POSIX Yacc không hỗ trợ thao tác midrule được định kiểu"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "chỉ thị không còn được dùng nữa: %s, dùng %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, fuzzy, c-format
 msgid "duplicate directive"
 msgstr "chỉ thị không còn được dùng nữa, dùng %s"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, fuzzy, c-format
 msgid "duplicate directive: %s"
 msgstr "chỉ thị không còn được dùng nữa, dùng %s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "khai báo trước"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "chỉ cho phép một %s cho mỗi quy tắc"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+#, fuzzy
+msgid "syntax error"
+msgstr "lỗi nghiêm trọng"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr ""
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr ""
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr ""
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr ""
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr ""
+
+#: src/conflicts.c:88
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr ""
 "    Xung đột giữa quy tắc %d và thẻ bài %s được phân giải là dịch (shift)"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr ""
 "    Xung đột giữa quy tắc %d và thẻ bài %s được phân giải là rút gọn "
 "(reduce)."
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr ""
 "    Xung đột giữa quy tắc %d và thẻ bài %s được phân giải là một lỗi (error)."
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "Tình trạng %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "xung đột: %d dịch/giảm, %d giảm/giảm\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "xung đột: %d dịch/giảm\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "xung đột: %d giảm/giảm\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, fuzzy, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "xung đột dịch/giảm: tìm thấy %d, cần %d"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, fuzzy, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "xung đột giảm/giảm: tìm thấy %d, cần %d"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr chỉ áp dụng cho bộ phân tích kiểu GLR."
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "xung đột dịch/giảm: tìm thấy %d, cần %d"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d lần xung đột dịch/giảm"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "xung đột giảm/giảm: tìm thấy %d, cần %d"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d lần xung đột giảm/giảm"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "khai báo trước"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "khai báo trước"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "khai báo trước"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "khai báo trước"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "%d lần xung đột dịch/giảm"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "%d lần xung đột giảm/giảm"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s: không thể mở"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "lỗi vào/ra"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "không thể đóng tập tin"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "từ chối ghi đè lên tập tin đầu vào %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "tập tin “%s” có nhiều kết xuất xung đột với nhau"
@@ -229,96 +386,96 @@
 msgid "%s: cannot backup"
 msgstr "%s: không thể mở"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr ""
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr ""
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr ""
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 #, fuzzy
 msgid "describe shift/reduce conflicts solving"
 msgstr "%d lần xung đột dịch/giảm"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr ""
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr ""
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr ""
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr ""
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "Hãy chạy câu lệnh “%s --help” (trợ giúp) để xem thêm thông tin.\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "Cách dùng: %s [TÙY_CHỌN]… TẬP_TIN\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 #, fuzzy
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
@@ -331,18 +488,18 @@
 "canonical LR(1) chỉ là thử nghiệm.\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr ""
 "Mọi đối số bắt buộc phải sử dụng với tùy chọn dài cũng bắt buộc với tùy chọn "
 "ngắn.\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "Cũng yêu cầu như thế đối với đối số tùy chọn.\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 #, fuzzy
 msgid ""
 "Operation Modes:\n"
@@ -370,7 +527,7 @@
 "  -f, --feature[=TÍNH-NĂNG]  kích hoạt các TÍNH-NĂNG\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -379,7 +536,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, fuzzy, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -408,20 +565,24 @@
 "  -l, --no-lines                   không tạo chỉ thị kiểu “#line”\n"
 "  -k, --token-table                bao gồm bảng các tên thẻ bài\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "Kết xuất:\n"
 "      --defines[=TẬP_TIN]    đồng thời tạo một tập tin phần đầu\n"
@@ -436,49 +597,45 @@
 "  -x, --xml[=TẬP_TIN]        cũng xuất một báo cáo XML về hàm tự động\n"
 "                              (giản đồ XML vẫn còn là thực nghiệm)\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "Hãy thông báo lỗi cho <%s>.\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "Trang chủ %s: <%s>.\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+#, fuzzy
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr "Hướng dẫn chung về phần mềm GNU: <http://www.gnu.org/gethelp/>.\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+#, fuzzy
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr ""
 "Hãy thông báo lỗi dịch cho <http://translationproject.org/team/vi.html>.\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "Để xem toàn bộ tài liệu về phần mềm này, hãy chạy lệnh: info bison.\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "Tác giả: Robert Corbett và Richard Stallman.\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "Bản quyền © %d Tổ chức Phần mềm Tự do.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -487,36 +644,41 @@
 "KHÔNG CÓ BẢO HÀNH GÌ CẢ, NGAY CẢ KHI NÓ ĐƯỢC BÁN HAY\n"
 "PHÙ HỢP CẢ VỚI MỤC ĐÍCH ĐẶC BIỆT.\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "chỉ cho phép một khai báo khung sườn"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s: ngôn ngữ không hợp lệ"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "chỉ cho phép khai báo một ngôn ngữ"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, fuzzy, c-format
+msgid "invalid argument for %s: %s"
+msgstr "đối số không hợp lệ %s cho %s"
+
+#: src/getargs.c:868
 #, fuzzy, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "chỉ thị không còn được dùng nữa: %s, dùng %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, c-format
 msgid "missing operand"
 msgstr "thiếu toán hạng"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "toán hạng bổ xung %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "Ngữ pháp"
 
@@ -533,17 +695,27 @@
 "// Trang chủ: <%s>.\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+#, fuzzy
+msgid "end of file"
+msgstr "thiếu %s tại kết thúc tập tin"
+
+#: src/i18n-strings.c:36
+#, fuzzy
+msgid "invalid token"
+msgstr "ký tự không hợp lệ"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "tràn số thứ tự dòng"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "tràn số thứ tự cột"
 
-#: src/location.c:155
+#: src/location.c:143
 #, fuzzy, c-format
 msgid "byte number overflow"
 msgstr "tràn số thứ tự dòng"
@@ -553,231 +725,281 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr ""
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "quy tắc vô ích trong bộ phân tích bởi vì các xung đột"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "%%biến định nghĩa %s bị định nghĩa lại"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "lời định nghĩa trước"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s: chưa định nghĩa %%define biến %s"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "%%biến định nghĩa %s bị định nghĩa lại"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "%%biến định nghĩa %s bị định nghĩa lại"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "%%biến định nghĩa %s bị định nghĩa lại"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "gặp giá trị sai đối với biến Bun %%define %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "gặp giá trị sai đối với biến %%define %s: %s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "giá trị được chấp nhận: %s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr ""
+
+#: src/parse-gram.y:214
+#, fuzzy
+msgid "[identifier]"
+msgstr "định danh không hợp lệ: %s"
+
+#: src/parse-gram.y:215
+#, fuzzy
+msgid "character literal"
+msgstr "ký tự trống theo kiểu văn chương"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+#, fuzzy
+msgid "identifier"
+msgstr "định danh không hợp lệ: %s"
+
+#: src/parse-gram.y:220
+#, fuzzy
+msgid "identifier:"
+msgstr "định danh không hợp lệ: %s"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+#, fuzzy
+msgid "integer literal"
+msgstr "ký tự trống theo kiểu văn chương"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr ""
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr ""
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, fuzzy, c-format
 msgid "definition of %s"
 msgstr "đang định nghĩa lại số thứ tự thẻ bài người dùng của %s"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "thiếu định danh trong khai báo tham số"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, c-format
 msgid "invalid version requirement: %s"
 msgstr "yêu cầu phiên bản không hợp lệ: %s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr "yêu cầu bison %s, nhưng chỉ có %s"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "Trạng thái %d "
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr ""
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "dịch, và chuyển sang trạng thái %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "chuyển sang tình trạng %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "lỗi (không kết hợp)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "rút gọn dùng quy tắc %d (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "chấp nhận"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "rút gọn dùng quy tắc %d (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "“Ký hiệu tận cùng”. với quy tắc nơi mà chúng xuất hiện"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "“Ký hiệu chưa tận cùng”, với quy tắc nơi mà có"
 
-#: src/print.c:416
+#: src/print.c:431
 #, fuzzy
 msgid "on left:"
 msgstr " bên trái:"
 
-#: src/print.c:425
+#: src/print.c:440
 #, fuzzy
 msgid "on right:"
 msgstr " bên phải:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "Quy tắc vô ích trong cơ chế phân tích do xung đột"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "nhiều khai báo %s"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "kết quả mâu thuẫn kiểu khi hợp vào hàm %s: <%s> != <%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "tên ký hiệu bị trùng lắp cho %s bị bỏ qua"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "đưa ra quy tắc cho %s, mà là thẻ bài"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "kiểu xung đột ở hành động mặc định: <%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr ""
 "quy tắc rỗng cho “ký hiệu chưa tận cùng” có kiểu, cũng không có hành động"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "giá trị chưa dùng: $%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "giá trị chưa đặt: $$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty trên một quy tắc không-rỗng"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "quy tắc trống rỗng không có %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "chưa xác định thẻ bài cho %%prec: %s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr "chỉ thao tác midrule có thể được định kiểu: %s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s chỉ ảnh hưởng đến cơ chế phân tích kiểu GLR"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s phải có con số dương theo sau"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr "POSIX Yacc không hỗ trợ thao tác midrule được định kiểu"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "quy tắc quá dài"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "chưa định nghĩa ký hiệu bắt đầu %s"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "ký hiệu bắt đầu %s là một thẻ bài"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "không có quy tắc trong ngữ pháp nhập vào"
@@ -786,256 +1008,251 @@
 msgid "rule useless in grammar"
 msgstr "quy tắc vô ích trong ngữ pháp"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "“ký hiệu chưa tận cùng” vô ích trong ngữ pháp: %s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "“Ký hiệu chưa tận cùng” vô ích trong ngữ pháp"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "“Ký hiệu tận cùng” chưa dùng trong ngữ pháp"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "Quy tắc vô ích trong ngữ pháp"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d “ký hiệu chưa tận cùng” vô ích trong ngữ pháp"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d quy tắc vô ích trong ngữ pháp"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "ký hiệu bắt đầu %s không nhận được câu"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "ký hiệu “%s” lạc"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "tham chiếu đến: %c%s tại %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "có lẽ có ý là: %c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ", ẩn %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " tại %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ", không thể truy cập được từ hành động quy-tắc-trung tại $%d"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "số nguyên nằm ngoài phạm vi: %s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "sai tham chiếu: %s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr "lỗi sai cú pháp sau “%c”. cần số nguyên, chữ, “_”. “[”. hoặc “$”"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "ký hiệu không tìm thấy trong thủ tục trước $%d: %.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "ký hiệu không tìm thấy trong thủ tục: %.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "tham chiếu không đúng chỗ: %s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "tham chiếu chưa rõ ràng: %s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "đưa ra kiểu dứt khoát theo ngữ cảnh không đặt kiểu"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ cho quy tắc giữa ở $%d của %s không có kiểu được khai báo"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "$$ của %s không khai báo kiểu"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "$%s của %s không khai báo kiểu"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr "xuất hiện nhiều lần của $%d với api.value.automove"
 
-#: src/scan-gram.l:198
-#, c-format
-msgid "stray ',' treated as white space"
-msgstr "dấu phẩy “,” thất lạc được coi như là khoảng trắng"
-
-#: src/scan-gram.l:292
-#, c-format
-msgid "invalid directive: %s"
-msgstr "chỉ thị không hợp lệ: %s"
-
-#: src/scan-gram.l:313
-#, c-format
-msgid "invalid identifier: %s"
-msgstr "định danh không hợp lệ: %s"
-
-#: src/scan-gram.l:365
-msgid "invalid character"
-msgid_plural "invalid characters"
-msgstr[0] "ký tự không hợp lệ"
-
-#: src/scan-gram.l:383
-#, c-format
-msgid "invalid null character"
-msgstr "ký tự vô giá trị không hợp lệ"
-
-#: src/scan-gram.l:437
-#, c-format
-msgid "unexpected identifier in bracketed name: %s"
-msgstr "không cần một định danh trong tên đặt trong dấu ngoặc: %s"
-
-#: src/scan-gram.l:459
-#, c-format
-msgid "an identifier expected"
-msgstr "cần một định danh"
-
-#: src/scan-gram.l:464
-msgid "invalid character in bracketed name"
-msgid_plural "invalid characters in bracketed name"
-msgstr[0] "ký tự không hợp lệ trong tên đặt trong dấu ngoặc"
-
-#: src/scan-gram.l:535
-#, fuzzy, c-format
-msgid "POSIX Yacc does not support string literals"
-msgstr "POSIX Yacc không hỗ trợ thao tác midrule được định kiểu"
-
-#: src/scan-gram.l:557
-#, c-format
-msgid "empty character literal"
-msgstr "ký tự trống theo kiểu văn chương"
-
-#: src/scan-gram.l:563
-#, c-format
-msgid "extra characters in character literal"
-msgstr "các ký tự mở rộng trong câu chữ"
-
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
+#: src/scan-gram.l:93
 #, c-format
 msgid "invalid number after \\-escape: %s"
 msgstr "gặp số sai nằm sau \\-escape: %s"
 
-#: src/scan-gram.l:652
+#: src/scan-gram.l:214
+#, c-format
+msgid "stray ',' treated as white space"
+msgstr "dấu phẩy “,” thất lạc được coi như là khoảng trắng"
+
+#: src/scan-gram.l:309
+#, c-format
+msgid "invalid directive: %s"
+msgstr "chỉ thị không hợp lệ: %s"
+
+#: src/scan-gram.l:331
+#, c-format
+msgid "invalid identifier: %s"
+msgstr "định danh không hợp lệ: %s"
+
+#: src/scan-gram.l:385
+msgid "invalid character"
+msgid_plural "invalid characters"
+msgstr[0] "ký tự không hợp lệ"
+
+#: src/scan-gram.l:405
+#, c-format
+msgid "invalid null character"
+msgstr "ký tự vô giá trị không hợp lệ"
+
+#: src/scan-gram.l:463
+#, c-format
+msgid "unexpected identifier in bracketed name: %s"
+msgstr "không cần một định danh trong tên đặt trong dấu ngoặc: %s"
+
+#: src/scan-gram.l:487
+#, c-format
+msgid "an identifier expected"
+msgstr "cần một định danh"
+
+#: src/scan-gram.l:494
+msgid "invalid character in bracketed name"
+msgid_plural "invalid characters in bracketed name"
+msgstr[0] "ký tự không hợp lệ trong tên đặt trong dấu ngoặc"
+
+#: src/scan-gram.l:567 src/scan-gram.l:582
+#, fuzzy, c-format
+msgid "POSIX Yacc does not support string literals"
+msgstr "POSIX Yacc không hỗ trợ thao tác midrule được định kiểu"
+
+#: src/scan-gram.l:605
+#, c-format
+msgid "empty character literal"
+msgstr "ký tự trống theo kiểu văn chương"
+
+#: src/scan-gram.l:611
+#, c-format
+msgid "extra characters in character literal"
+msgstr "các ký tự mở rộng trong câu chữ"
+
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "gặp ký tự sai nằm sau \\-escape: %s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, fuzzy, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr "POSIX Yacc không hỗ trợ thao tác midrule được định kiểu"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "thiếu %s tại kết thúc tập tin"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr "thiếu %s tại cuối dòng"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "gặp chỉ thị %s chưa đóng trong khung sườn"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "quá ít đối số cho chỉ thị %s trong khung sườn"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "quá nhiều đối số cho chỉ thị %s trong khung sườn"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc cấm chỉ sự va chạm trong các tên ký hiệu: %s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "quá nhiều ký hiệu trong ngữ pháp nhập vào (giới hạn %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "%s khai báo lại cho %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s khai báo lại cho <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "ký hiệu %s đã được khai báo lại"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "ký hiệu %s đã được khai báo lại"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, fuzzy, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
@@ -1044,108 +1261,113 @@
 "ký hiệu %s được dùng, nhưng chưa được định nghĩa như là thẻ bài, cũng không "
 "có quy tắc"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr ""
 "ký hiệu %s được dùng, nhưng chưa được định nghĩa như là thẻ bài, cũng không "
 "có quy tắc"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "ký hiệu %s đã được khai báo lại"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
+msgid "nonterminals cannot be given a token code"
 msgstr ""
 
-#: src/symtab.c:575
-#, c-format
-msgid "redefining user token number of %s"
-msgstr "đang định nghĩa lại số thứ tự thẻ bài người dùng của %s"
-
-#: src/symtab.c:578
+#: src/symtab.c:594
 #, fuzzy, c-format
-msgid "user token number of %s too large"
+msgid "redefining code of token %s"
 msgstr "đang định nghĩa lại số thứ tự thẻ bài người dùng của %s"
 
-#: src/symtab.c:617
+#: src/symtab.c:597
+#, fuzzy, c-format
+msgid "code of token %s too large"
+msgstr "đang định nghĩa lại số thứ tự thẻ bài người dùng của %s"
+
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "%s vô ích cho kiểu <%s>"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "kiểu %s được dùng, nhưng chưa được tiếp hợp với bất kỳ ký hiệu nào"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr ""
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "ký hiệu %s sử dụng cho nhiều hơn một chuỗi văn bản"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "ký hiệu %s nhận nhiều hơn một chuỗi nghĩa chữ"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "số thẻ người dùng %d khai báo lại cho %s"
+msgid "code %d reassigned to token %s"
+msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "khai báo trước đây cho %s"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr ""
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "chưa định nghĩa ký hiệu bắt đầu %s"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "ký hiệu bắt đầu %s là một thẻ bài"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "quyền ưu tiên và tính kết hợp vô ích đối với %s"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "quyền ưu tiên vô ích đối với %s"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "tính kết hợp vô ích đối với %s, dùng %%precedence"
 
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "nhiều khai báo %s"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "quá nhiều ký hiệu trong ngữ pháp nhập vào (giới hạn %d)"
+
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "số thẻ người dùng %d khai báo lại cho %s"
+
 #, fuzzy
 #~ msgid "eliminate useless chain rules"
 #~ msgstr "“ký hiệu chưa tận cùng” vô ích trong ngữ pháp: %s"
@@ -1221,9 +1443,6 @@
 #~ " * “none”        tắt tất cả các thứ ở trên\n"
 #~ "  "
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "đối số không hợp lệ %s cho %s"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "đối số chưa rõ ràng %s cho %s"
 
@@ -1342,36 +1561,6 @@
 #~ msgid "cannot open stats file for writing"
 #~ msgstr "không thể mở tập tin thống kê (stats) để ghi"
 
-#, fuzzy
-#~| msgid "missing %s at end of file"
-#~ msgid "end \"ABC\" of file"
-#~ msgstr "thiếu %s tại kết thúc tập tin"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "[identifier]"
-#~ msgstr "định danh không hợp lệ: %s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "character literal"
-#~ msgstr "ký tự trống theo kiểu văn chương"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier"
-#~ msgstr "định danh không hợp lệ: %s"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier:"
-#~ msgstr "định danh không hợp lệ: %s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "integer literal"
-#~ msgstr "ký tự trống theo kiểu văn chương"
-
 #~ msgid "symbol %s redefined"
 #~ msgstr "ký hiệu %s đã được định nghĩa lại"
 
diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo
index d94b1ce..cc34ee4 100644
--- a/po/zh_CN.gmo
+++ b/po/zh_CN.gmo
Binary files differ
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 005db27..943cd78 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: bison 3.0.4\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2015-08-27 16:52+0800\n"
 "Last-Translator: Mingye Wang <arthur200126@gmail.com>\n"
 "Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
@@ -20,200 +20,357 @@
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Poedit 1.8.4\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "无效字符"
+
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "致命错误"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr ""
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "于文件结尾缺少 %s"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr ""
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr ""
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr ""
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, fuzzy, c-format
 msgid "empty rules without %empty"
 msgstr "空的规则而无 %%empty"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr ""
 
-#: src/complain.c:120
+#: src/complain.c:160
 #, fuzzy
 msgid "useless precedence and associativity"
 msgstr "对于 %s 无作用的优先性与顺序关联性"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr ""
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr ""
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr ""
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr ""
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr ""
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr ""
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr ""
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "警告"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "错误"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "致命错误"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr ""
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "已弃用的指令:%s,应使用 %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, fuzzy, c-format
 msgid "duplicate directive"
 msgstr "已弃用的指令:%s"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, fuzzy, c-format
 msgid "duplicate directive: %s"
 msgstr "已弃用的指令:%s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "上次声明"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "每个规则只允许一个 %s"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+#, fuzzy
+msgid "syntax error"
+msgstr "致命错误"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr ""
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr ""
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr ""
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr ""
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr ""
+
+#: src/conflicts.c:88
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "    在规则 %d 与字组 %s 之间的冲突以偏移来解决"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr "    在规则 %d 与字组 %s 之间的冲突以归约来解决"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, fuzzy, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "    在规则 %d 与字组 %s 之间的冲突以视为错误来解决"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "状态 %d"
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "冲突:%d 项偏移/归约,%d 项归约/归约\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "冲突:%d 项偏移/归约\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "冲突:%d 项归约/归约\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, fuzzy, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "偏移/归约冲突:找到 %d 项,预期为 %d 项"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, fuzzy, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "归约/归约冲突:找到 %d 项,预期为 %d 项"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr 只适合 GLR 解析器"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "偏移/归约冲突:找到 %d 项,预期为 %d 项"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d 项偏移/归约冲突"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "归约/归约冲突:找到 %d 项,预期为 %d 项"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d 项归约/归约冲突"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "上次声明"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "上次声明"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "上次声明"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "上次声明"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "%d 项偏移/归约冲突"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "%d 项归约/归约冲突"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s:无法打开"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "输入/输出错误"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "无法关闭文件"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "拒绝覆盖输入文件 %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "到文件 %s 的输出冲突"
@@ -223,96 +380,96 @@
 msgid "%s: cannot backup"
 msgstr "%s:无法打开"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr ""
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr ""
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr ""
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr ""
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 #, fuzzy
 msgid "describe shift/reduce conflicts solving"
 msgstr "%d 项偏移/归约冲突"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr ""
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr ""
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr ""
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr ""
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr ""
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr ""
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "请尝试运行 %s --help 来获取更多信息。\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "用法:%s [选项]... 文件\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 #, fuzzy
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
@@ -324,16 +481,16 @@
 "规范的 LR(1) 支持是实验性质。\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr "长选项的强制参数对短选项也是强制的。\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "可选项也是如此。\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 #, fuzzy
 msgid ""
 "Operation Modes:\n"
@@ -360,7 +517,7 @@
 "  -f, --feature[=特色]       启用杂项特色\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -369,7 +526,7 @@
 "\n"
 msgstr ""
 
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, fuzzy, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -399,20 +556,24 @@
 "  -l, --no-lines                   不产生 #line 指令\n"
 "  -k, --token-table                包含字组名称的表格\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
 #, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "输出:\n"
 "      --defines[=文件]       也产生标头档\n"
@@ -426,48 +587,44 @@
 "  -x, --xml[=文件]           也输出自动作业的 XML 报告\n"
 "                             (XML 结构描述为实验性质)\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "将错误通报给 <%s>。\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "%s 首页:<%s>。\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+#, fuzzy
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr "使用 GNU 软件的一般说明:<http://www.gnu.org/gethelp/>。\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+#, fuzzy
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr "报告翻译错误给 <http://translationproject.org/team/zh_CN.html>。\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "要取得完整文档请运行:info bison。\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "由 Robert Corbett 和 Richard Stallman 编写。\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "版权所有 (C) %d Free Software Foundation, Inc.\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -475,36 +632,41 @@
 "这是自由软件;请参考源代码的版权声明。本软件不提供任何保证,甚至不会包括\n"
 "可售性或适用于任何特定目的的保证。\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "多重架构声明无效"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s:无效的语言"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "多语言声明是无效的"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, fuzzy, c-format
+msgid "invalid argument for %s: %s"
+msgstr "%2$s 的参数 %1$s 无效"
+
+#: src/getargs.c:868
 #, fuzzy, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "已弃用的指令:%s,应使用 %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, fuzzy, c-format
 msgid "missing operand"
 msgstr "%s:缺少算子"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "额外算子 %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "语法"
 
@@ -521,17 +683,27 @@
 "// 主页:<%s>。\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+#, fuzzy
+msgid "end of file"
+msgstr "于文件结尾缺少 %s"
+
+#: src/i18n-strings.c:36
+#, fuzzy
+msgid "invalid token"
+msgstr "无效字符"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "行号溢出"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "列号溢出"
 
-#: src/location.c:155
+#: src/location.c:143
 #, fuzzy, c-format
 msgid "byte number overflow"
 msgstr "行号溢出"
@@ -541,230 +713,280 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr ""
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "由于冲突,解析器中的规则不起作用"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr ""
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "%%define 变量 %s 被重新定义"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "上次定义"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s:未定义的 %%define 变量 %s"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "%%define 变量 %s 被重新定义"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "%%define 变量 %s 被重新定义"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, fuzzy, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "%%define 变量 %s 被重新定义"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "无效的值用于 %%define 布尔变量 %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "无效的值用于 %%define 变量 %s:%s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "被接受的值:%s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr ""
+
+#: src/parse-gram.y:214
+#, fuzzy
+msgid "[identifier]"
+msgstr "无效标识符:%s"
+
+#: src/parse-gram.y:215
+#, fuzzy
+msgid "character literal"
+msgstr "空的字符实字"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+#, fuzzy
+msgid "identifier"
+msgstr "无效标识符:%s"
+
+#: src/parse-gram.y:220
+#, fuzzy
+msgid "identifier:"
+msgstr "无效标识符:%s"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+#, fuzzy
+msgid "integer literal"
+msgstr "空的字符实字"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr ""
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr ""
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, fuzzy, c-format
 msgid "definition of %s"
 msgstr "重新定义 %s 的用户字组数目"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "参数声明中缺少识别符"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, fuzzy, c-format
 msgid "invalid version requirement: %s"
 msgstr "无效引用:%s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr ""
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "状态 %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr ""
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "偏移,并进入状态 %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "转到状态 %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "错误 (非相联的)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "使用规则 %d 以归约 (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "接受"
 
-#: src/print.c:235 src/print.c:309
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "使用规则 %d 以归约 (%s)"
+
+#: src/print.c:242 src/print.c:316
 msgid "$default"
 msgstr "$default"
 
-#: src/print.c:364
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "终结语词,附有它们出现处的规则"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "非终结语词,附有它们出现处的规则"
 
-#: src/print.c:416
+#: src/print.c:431
 #, fuzzy
 msgid "on left:"
 msgstr " 于左侧:"
 
-#: src/print.c:425
+#: src/print.c:440
 #, fuzzy
 msgid "on right:"
 msgstr " 于右侧:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "由于冲突,解析器中的规则不起作用"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "多次 %s 定义"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "结果类型抵触发生于合并函数 %s:<%s>!=<%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "重复的符号名称用于 %s 被忽略"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "用于 %s 这项字组的规则"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "类型与缺省动作相抵触:<%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "空白规则用于赋予类型的非终结语词,以及没有动作"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "未使用的值:$%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "未设置的值:$$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty 于非空的规则"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "空的规则而无 %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "用于 %%prec 的字组未定义:%s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr ""
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s 只影响 GLR 解析器"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s 后面只能跟正数"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr ""
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "规则过长"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "起始符号 %s 未定义"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "起始符号 %s 是一项字组"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "输入语法中没有规则"
@@ -773,362 +995,362 @@
 msgid "rule useless in grammar"
 msgstr "语法中的规则无效"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "非终结语词在文法中无用:%s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "非终结语词在文法中无用"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
 msgstr "终端机在文法中未使用"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "语法中的规则无效"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d 项非终结语词在文法中无用"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d 项规则在文法中无用"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "启始符号 %s 不衍生任何句子"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "零星的 %s"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "参考:%c%s 于 %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "可能指:%c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ",隐藏 %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " 位于 %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, fuzzy, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ",无法从 位于 $%d 的 mid-rule 动作访问"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "整数超出范围:%s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "无效引用:%s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr "语法错误发生于 %c 之后,预期为整数、字母、'_'、'[' 或 '$'"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "在 $%d 之前的结果中找不到符号:%.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "在结果中找不到符号:%.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "误导的参考:%s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "模棱两可的参考:%s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "在未定类型文法中给定明确的类型"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ 对于在 %2$s 中 $%1$d 的中段没有任何声明类型"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "%s 中的 $$ 没有任何声明类型"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "%2$s 中的 $%1$s 没有任何声明类型"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr ""
 
-#: src/scan-gram.l:198
-#, c-format
-msgid "stray ',' treated as white space"
-msgstr "零星的 ',' 将视为空白"
-
-#: src/scan-gram.l:292
-#, c-format
-msgid "invalid directive: %s"
-msgstr "无效的指令:%s"
-
-#: src/scan-gram.l:313
-#, c-format
-msgid "invalid identifier: %s"
-msgstr "无效标识符:%s"
-
-#: src/scan-gram.l:365
-msgid "invalid character"
-msgid_plural "invalid characters"
-msgstr[0] "无效字符"
-
-#: src/scan-gram.l:383
-#, c-format
-msgid "invalid null character"
-msgstr "无效的空字符"
-
-#: src/scan-gram.l:437
-#, c-format
-msgid "unexpected identifier in bracketed name: %s"
-msgstr "中括号内未预期的识别名称:%s"
-
-#: src/scan-gram.l:459
-#, c-format
-msgid "an identifier expected"
-msgstr "应有一个标识符"
-
-#: src/scan-gram.l:464
-msgid "invalid character in bracketed name"
-msgid_plural "invalid characters in bracketed name"
-msgstr[0] "中括号内无效字符"
-
-#: src/scan-gram.l:535
-#, c-format
-msgid "POSIX Yacc does not support string literals"
-msgstr ""
-
-#: src/scan-gram.l:557
-#, c-format
-msgid "empty character literal"
-msgstr "空的字符实字"
-
-#: src/scan-gram.l:563
-#, c-format
-msgid "extra characters in character literal"
-msgstr "额外字符于字符实字"
-
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
+#: src/scan-gram.l:93
 #, c-format
 msgid "invalid number after \\-escape: %s"
 msgstr "无效数字于 \\-转义之后:%s"
 
-#: src/scan-gram.l:652
+#: src/scan-gram.l:214
+#, c-format
+msgid "stray ',' treated as white space"
+msgstr "零星的 ',' 将视为空白"
+
+#: src/scan-gram.l:309
+#, c-format
+msgid "invalid directive: %s"
+msgstr "无效的指令:%s"
+
+#: src/scan-gram.l:331
+#, c-format
+msgid "invalid identifier: %s"
+msgstr "无效标识符:%s"
+
+#: src/scan-gram.l:385
+msgid "invalid character"
+msgid_plural "invalid characters"
+msgstr[0] "无效字符"
+
+#: src/scan-gram.l:405
+#, c-format
+msgid "invalid null character"
+msgstr "无效的空字符"
+
+#: src/scan-gram.l:463
+#, c-format
+msgid "unexpected identifier in bracketed name: %s"
+msgstr "中括号内未预期的识别名称:%s"
+
+#: src/scan-gram.l:487
+#, c-format
+msgid "an identifier expected"
+msgstr "应有一个标识符"
+
+#: src/scan-gram.l:494
+msgid "invalid character in bracketed name"
+msgid_plural "invalid characters in bracketed name"
+msgstr[0] "中括号内无效字符"
+
+#: src/scan-gram.l:567 src/scan-gram.l:582
+#, c-format
+msgid "POSIX Yacc does not support string literals"
+msgstr ""
+
+#: src/scan-gram.l:605
+#, c-format
+msgid "empty character literal"
+msgstr "空的字符实字"
+
+#: src/scan-gram.l:611
+#, c-format
+msgid "extra characters in character literal"
+msgstr "额外字符于字符实字"
+
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "\\-转义符号之后的无效字符:%s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr ""
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "于文件结尾缺少 %s"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr " 于列尾缺少 %s"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "在架构中有未关闭的 %s 指令"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "在架构中的 %s 指令参数太少"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "在架构中的 %s 指令参数太多"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc 禁止符号名中有破折号:%s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "输入语法中的符号过多(限制为 %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "%s 重复声明了 %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s 重复声明了 <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "符号 %s 重复声明"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, fuzzy, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "符号 %s 重复声明"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, fuzzy, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
 "mean %s?"
 msgstr "符号 %s 已使用过,但是并未定义为字组也没有规则"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr "符号 %s 已使用过,但是并未定义为字组也没有规则"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr ""
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "符号 %s 重复声明"
 
-#: src/symtab.c:572
+#: src/symtab.c:591
 #, c-format
-msgid "nonterminals cannot be given an explicit number"
+msgid "nonterminals cannot be given a token code"
 msgstr ""
 
-#: src/symtab.c:575
-#, c-format
-msgid "redefining user token number of %s"
-msgstr "重新定义 %s 的用户字组数目"
-
-#: src/symtab.c:578
+#: src/symtab.c:594
 #, fuzzy, c-format
-msgid "user token number of %s too large"
+msgid "redefining code of token %s"
 msgstr "重新定义 %s 的用户字组数目"
 
-#: src/symtab.c:617
+#: src/symtab.c:597
+#, fuzzy, c-format
+msgid "code of token %s too large"
+msgstr "重新定义 %s 的用户字组数目"
+
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr ""
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "%s 对于类型 <%s> 无作用"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "类型 <%s> 已使用过,但是并未与任何符号相关联"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr ""
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "符号 %s 超过一次使用为实字字串"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "符号 %s 给定了超过一个实字字串"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "用户字组数字 %d 被重复声明为 %s"
+msgid "code %d reassigned to token %s"
+msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "%s 的前一个声明"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr ""
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "起始符号 %s 未定义"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "起始符号 %s 是一项字组"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "对于 %s 无作用的优先性与顺序关联性"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "对于 %s 无作用的优先性"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "对于 %s 无作用的顺序关联性,使用 %%precedence"
 
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "多次 %s 定义"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "输入语法中的符号过多(限制为 %d)"
+
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "用户字组数字 %d 被重复声明为 %s"
+
 #, fuzzy
 #~ msgid "eliminate useless chain rules"
 #~ msgstr "非终结语词在文法中无用:%s"
@@ -1204,9 +1426,6 @@
 #~ "  'none'         停用以上全部\n"
 #~ "  "
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "%2$s 的参数 %1$s 无效"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "%2$s 的参数 %1$s 不明确"
 
@@ -1332,36 +1551,6 @@
 #~ msgid "cannot open stats file for writing"
 #~ msgstr "无法打开统计文件用于写入"
 
-#, fuzzy
-#~| msgid "missing %s at end of file"
-#~ msgid "end \"ABC\" of file"
-#~ msgstr "于文件结尾缺少 %s"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "[identifier]"
-#~ msgstr "无效标识符:%s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "character literal"
-#~ msgstr "空的字符实字"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier"
-#~ msgstr "无效标识符:%s"
-
-#, fuzzy
-#~| msgid "invalid identifier: %s"
-#~ msgid "identifier:"
-#~ msgstr "无效标识符:%s"
-
-#, fuzzy
-#~| msgid "empty character literal"
-#~ msgid "integer literal"
-#~ msgstr "空的字符实字"
-
 #~ msgid "symbol %s redefined"
 #~ msgstr "符号 %s 重复定义"
 
diff --git a/po/zh_TW.gmo b/po/zh_TW.gmo
index 28f8ff9..0bcb876 100644
--- a/po/zh_TW.gmo
+++ b/po/zh_TW.gmo
Binary files differ
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 083ae7a..2cabbc7 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -8,8 +8,8 @@
 msgstr ""
 "Project-Id-Version: GNU bison 3.4.91\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-11-24 23:13+0800\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2020-01-19 00:41+0800\n"
 "Last-Translator: pan93412 <pan93412@gmail.com>\n"
 "Language-Team: Chinese (traditional) <zh-l10n@lists.linux.org.tw>\n"
 "Language: zh_TW\n"
@@ -20,199 +20,357 @@
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Lokalize 19.11.80\n"
 
-#: src/complain.c:114
+#: examples/c/bistromathic/parse.y:152 examples/java/calc/Calc.y:83
+msgid "number"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:154
+msgid "function"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:155
+msgid "variable"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:194
+msgid "error: division by zero"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:372
+#, fuzzy, c-format
+msgid "syntax error: invalid character: %c"
+msgstr "無效字元"
+
+#: examples/c/bistromathic/parse.y:389
+#, fuzzy
+msgid "%@: syntax error"
+msgstr "嚴重錯誤"
+
+#: examples/c/bistromathic/parse.y:390
+msgid "%@: syntax error: unexpected %u"
+msgstr ""
+
+#. TRANSLATORS: '%@' is a location in a file, '%u' is an
+#. "unexpected token", and '%0e', '%1e'... are expected tokens
+#. at this point.
+#.
+#. For instance on the expression "1 + * 2", you'd get
+#.
+#. 1.5: syntax error: expected - or ( or number or function or variable before *
+#: examples/c/bistromathic/parse.y:398
+msgid "%@: syntax error: expected %0e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:399
+msgid "%@: syntax error: expected %0e or %1e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:400
+msgid "%@: syntax error: expected %0e or %1e or %2e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:401
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:402
+msgid "%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:403
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"
+msgstr ""
+
+#: examples/c/bistromathic/parse.y:404
+msgid ""
+"%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e etc., "
+"before %u"
+msgstr ""
+
+#: examples/java/calc/Calc.y:81
+#, fuzzy
+msgid "end of line"
+msgstr "於檔案結尾缺少 %s"
+
+#: src/complain.c:153
 msgid "S/R conflicts (enabled by default)"
 msgstr "S/R 衝突 (預設啟用)"
 
-#: src/complain.c:115
+#: src/complain.c:154
 msgid "R/R conflicts (enabled by default)"
 msgstr "R/R 衝突 (預設啟用)"
 
-#: src/complain.c:116
+#: src/complain.c:155 src/getargs.c:226
+msgid "generate conflict counterexamples"
+msgstr ""
+
+#: src/complain.c:156
 msgid "string aliases not attached to a symbol"
 msgstr "字串別名未連結至任一符號"
 
-#: src/complain.c:117
+#: src/complain.c:157
 msgid "obsolete constructs"
 msgstr "建構函式過時"
 
-#: src/complain.c:118
+#: src/complain.c:158
 #, c-format
 msgid "empty rules without %empty"
 msgstr "沒有 %empty 的空規則"
 
-#: src/complain.c:119
+#: src/complain.c:159
 msgid "unset or unused midrule values"
 msgstr "未設定或未使用的 midrule 值"
 
-#: src/complain.c:120
+#: src/complain.c:160
 msgid "useless precedence and associativity"
 msgstr "無作用的優先性與順序關聯性"
 
-#: src/complain.c:121
+#: src/complain.c:161
 msgid "incompatibilities with POSIX Yacc"
 msgstr "不相容 POSIX Yacc"
 
-#: src/complain.c:122
+#: src/complain.c:162
 msgid "all other warnings (enabled by default)"
 msgstr "其他所有錯誤 (預設啟用)"
 
-#: src/complain.c:123
-msgid "all the warnings except 'dangling-alias' and 'yacc'"
+#: src/complain.c:163
+#, fuzzy
+msgid "all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'"
 msgstr "除 'dangling-alias' 及 'yacc' 的所有警告"
 
-#: src/complain.c:124
+#: src/complain.c:164
 msgid "turn off warnings in CATEGORY"
 msgstr "關閉 <分類> 中的警告"
 
-#: src/complain.c:125
+#: src/complain.c:165
 msgid "turn off all the warnings"
 msgstr "關閉所有警告"
 
-#: src/complain.c:126
+#: src/complain.c:166
 msgid "treat warnings as errors"
 msgstr "將警告視為錯誤"
 
-#: src/complain.c:151
+#: src/complain.c:192
 msgid "Warning categories include:"
 msgstr "警告分類有:"
 
-#: src/complain.c:256
+#: src/complain.c:297
 msgid "warning"
 msgstr "警告"
 
-#: src/complain.c:258
+#: src/complain.c:299
 msgid "error"
 msgstr "錯誤"
 
-#: src/complain.c:260
+#: src/complain.c:301
 msgid "fatal error"
 msgstr "嚴重錯誤"
 
-#: src/complain.c:547
+#: src/complain.c:501
+msgid "note"
+msgstr ""
+
+#: src/complain.c:594
 #, c-format
 msgid "POSIX Yacc does not support %s"
 msgstr "POSIX Yacc 不支援 %s"
 
-#: src/complain.c:556
+#: src/complain.c:603
 #, c-format
 msgid "deprecated directive: %s, use %s"
 msgstr "不宜再用的指令:%s,應使用 %s"
 
-#: src/complain.c:571
+#: src/complain.c:616
 #, c-format
 msgid "duplicate directive"
 msgstr "指令重複"
 
-#: src/complain.c:573
+#: src/complain.c:618
 #, c-format
 msgid "duplicate directive: %s"
 msgstr "指令重複:%s"
 
-#: src/complain.c:575 src/complain.c:588 src/reader.c:136 src/symtab.c:303
-#: src/symtab.c:316 src/symtab.c:553
-#, c-format
+#: src/complain.c:619 src/complain.c:628 src/reader.c:156 src/symtab.c:330
+#: src/symtab.c:339 src/symtab.c:569
 msgid "previous declaration"
 msgstr "前次宣告"
 
-#: src/complain.c:585
+#: src/complain.c:627
 #, c-format
 msgid "only one %s allowed per rule"
 msgstr "每個規則只允許一個 %s"
 
-#: src/conflicts.c:81
+#: src/complain.c:647
+#, fuzzy
+msgid "syntax error"
+msgstr "嚴重錯誤"
+
+#: src/complain.c:648
+msgid "unexpected %0$s"
+msgstr ""
+
+#: src/complain.c:649
+msgid "expected %1$s before %0$s"
+msgstr ""
+
+#: src/complain.c:650
+msgid "expected %1$s or %2$s before %0$s"
+msgstr ""
+
+#: src/complain.c:651
+msgid "expected %1$s or %2$s or %3$s before %0$s"
+msgstr ""
+
+#: src/complain.c:652
+msgid "expected %1$s or %2$s or %3$s or %4$s before %0$s"
+msgstr ""
+
+#: src/conflicts.c:88
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as shift"
 msgstr "在規則 %d 與字組 %s 之間的衝突以偏移來解決"
 
-#: src/conflicts.c:91
+#: src/conflicts.c:98
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as reduce"
 msgstr "在規則 %d 與字組 %s 之間的衝突以縮減來解決"
 
-#: src/conflicts.c:100
+#: src/conflicts.c:107
 #, c-format
 msgid "Conflict between rule %d and token %s resolved as an error"
 msgstr "在規則 %d 與字組 %s 之間的衝突以視為錯誤來解決"
 
-#: src/conflicts.c:602
+#: src/conflicts.c:610
 #, c-format
 msgid "State %d "
 msgstr "狀態 %d "
 
-#: src/conflicts.c:605
+#: src/conflicts.c:613
 #, c-format
 msgid "conflicts: %d shift/reduce, %d reduce/reduce\n"
 msgstr "衝突:%d 項偏移/縮減,%d 項縮減/縮減\n"
 
-#: src/conflicts.c:608
+#: src/conflicts.c:616
 #, c-format
 msgid "conflicts: %d shift/reduce\n"
 msgstr "衝突:%d 項偏移/縮減\n"
 
-#: src/conflicts.c:610
+#: src/conflicts.c:618
 #, c-format
 msgid "conflicts: %d reduce/reduce\n"
 msgstr "衝突:%d 項縮減/縮減\n"
 
-#: src/conflicts.c:645
+#: src/conflicts.c:661
 #, c-format
 msgid "shift/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "規則 %d 的偏移/縮減衝突:找到 %d 項,但預期為 %d 項"
 
-#: src/conflicts.c:651
+#: src/conflicts.c:667
 #, c-format
 msgid "reduce/reduce conflicts for rule %d: %d found, %d expected"
 msgstr "規則 %d 的縮減/縮減衝突:找到 %d 項,但預期為 %d 項"
 
-#: src/conflicts.c:669
+#: src/conflicts.c:685
 #, c-format
 msgid "%%expect-rr applies only to GLR parsers"
 msgstr "%%expect-rr 只套用到 GLR 剖析器"
 
-#: src/conflicts.c:686
+#: src/conflicts.c:705
 #, c-format
 msgid "shift/reduce conflicts: %d found, %d expected"
 msgstr "偏移/縮減衝突:找到 %d 項,預期為 %d 項"
 
-#: src/conflicts.c:691
+#: src/conflicts.c:714
 #, c-format
 msgid "%d shift/reduce conflict"
 msgid_plural "%d shift/reduce conflicts"
 msgstr[0] "%d 項偏移/縮減衝突"
 
-#: src/conflicts.c:708
+#: src/conflicts.c:734
 #, c-format
 msgid "reduce/reduce conflicts: %d found, %d expected"
 msgstr "縮減/縮減衝突:找到 %d 項,預期為 %d 項"
 
-#: src/conflicts.c:713
+#: src/conflicts.c:743
 #, c-format
 msgid "%d reduce/reduce conflict"
 msgid_plural "%d reduce/reduce conflicts"
 msgstr[0] "%d 項縮減/縮減衝突"
 
-#: src/files.c:124
+#: src/conflicts.c:755
+msgid ""
+"rerun with option '-Wcounterexamples' to generate conflict counterexamples"
+msgstr ""
+
+#: src/counterexample.c:122 src/counterexample.c:124
+msgid "Example"
+msgstr ""
+
+#: src/counterexample.c:122
+msgid "First example"
+msgstr ""
+
+#: src/counterexample.c:124
+msgid "Second example"
+msgstr ""
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "Shift derivation"
+msgstr "前次宣告"
+
+#: src/counterexample.c:126
+#, fuzzy
+msgid "First reduce derivation"
+msgstr "前次宣告"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Reduce derivation"
+msgstr "前次宣告"
+
+#: src/counterexample.c:128
+#, fuzzy
+msgid "Second reduce derivation"
+msgstr "前次宣告"
+
+#: src/counterexample.c:1293 src/counterexample.c:1297
+#, fuzzy, c-format
+msgid "shift/reduce conflict on token %s"
+msgstr "%d 項偏移/縮減衝突"
+
+#: src/counterexample.c:1298 src/counterexample.c:1340
+msgid ":"
+msgstr ""
+
+#: src/counterexample.c:1328 src/counterexample.c:1336
+#, fuzzy, c-format
+msgid "reduce/reduce conflict on token %s"
+msgid_plural "reduce/reduce conflict on tokens %s"
+msgstr[0] "%d 項縮減/縮減衝突"
+
+#: src/files.c:144
 #, c-format
 msgid "%s: cannot open"
 msgstr "%s:無法開啟"
 
-#: src/files.c:140
+#: src/files.c:160
 #, c-format
 msgid "input/output error"
 msgstr "輸入/輸出錯誤"
 
-#: src/files.c:143
+#: src/files.c:163
 #, c-format
 msgid "cannot close file"
 msgstr "無法關閉檔案"
 
-#: src/files.c:374
+#: src/files.c:510
 #, c-format
 msgid "refusing to overwrite the input file %s"
 msgstr "拒絕覆寫輸入檔案 %s"
 
-#: src/files.c:382
+#: src/files.c:518
 #, c-format
 msgid "conflicting outputs to file %s"
 msgstr "輸出至檔案 %s 時發生衝突"
@@ -222,97 +380,97 @@
 msgid "%s: cannot backup"
 msgstr "%s:無法備份"
 
-#: src/getargs.c:173
+#: src/getargs.c:186
 msgid "colorize the output"
 msgstr "上色輸出"
 
-#: src/getargs.c:174
+#: src/getargs.c:187
 msgid "don't colorize the output"
 msgstr "不上色輸出"
 
-#: src/getargs.c:175
+#: src/getargs.c:188
 msgid "colorize if the output device is a tty"
 msgstr "如果輸出裝置是 tty 就上色"
 
 #. TRANSLATORS: Use the same translation for WHEN as in the
 #. --color=WHEN help message.
-#: src/getargs.c:196
+#: src/getargs.c:209
 msgid "WHEN can be one of the following:"
 msgstr "<時機> 可以是下述任一:"
 
-#: src/getargs.c:209
+#: src/getargs.c:222
 msgid "describe the states"
 msgstr "描述狀態"
 
-#: src/getargs.c:210
+#: src/getargs.c:223
 msgid "complete the core item sets with their closure"
 msgstr ""
 
-#: src/getargs.c:211
+#: src/getargs.c:224
 msgid "explicitly associate lookahead tokens to items"
 msgstr ""
 
-#: src/getargs.c:212
+#: src/getargs.c:225
 #, fuzzy
 msgid "describe shift/reduce conflicts solving"
 msgstr "%d 項偏移/縮減衝突"
 
-#: src/getargs.c:213
+#: src/getargs.c:227
 msgid "include all the above information"
 msgstr "包含所有上述資訊"
 
-#: src/getargs.c:214
+#: src/getargs.c:228
 msgid "disable the report"
 msgstr "停用報告功能"
 
 #. TRANSLATORS: Use the same translation for THINGS as in the
 #. --report=THINGS help message.
-#: src/getargs.c:235
+#: src/getargs.c:251
 msgid "THINGS is a list of comma separated words that can include:"
 msgstr "<事件> 是個以逗號分隔的字詞,可以包含:"
 
 # FOR TRANSLATORS: 目前原文字串似乎沒有 TRACES 相關的字串,維持原文。
-#: src/getargs.c:294
+#: src/getargs.c:314
 msgid "TRACES is a list of comma separated words that can include:"
 msgstr "TRACES 是個以逗號分隔的字詞,可以包含:"
 
-#: src/getargs.c:306
+#: src/getargs.c:326
 msgid "show errors with carets"
 msgstr ""
 
-#: src/getargs.c:307
+#: src/getargs.c:327
 msgid "show machine-readable fixes"
 msgstr "顯示機器可讀的修正"
 
-#: src/getargs.c:308
+#: src/getargs.c:328
 msgid "do not generate any file"
 msgstr "不產生任何檔案"
 
-#: src/getargs.c:309
+#: src/getargs.c:329
 msgid "all of the above"
 msgstr "以上全部"
 
-#: src/getargs.c:310
+#: src/getargs.c:330
 msgid "disable all of the above"
 msgstr "停用以上全部"
 
 #. TRANSLATORS: Use the same translation for FEATURES as in the
 #. --feature=FEATURES help message.
-#: src/getargs.c:332
+#: src/getargs.c:352
 msgid "FEATURES is a list of comma separated words that can include:"
 msgstr "<功能> 是個以逗號分隔的字詞,可以包含:"
 
-#: src/getargs.c:346
+#: src/getargs.c:367
 #, c-format
 msgid "Try '%s --help' for more information.\n"
 msgstr "請嘗試執行 %s --help 來獲取更多資訊。\n"
 
-#: src/getargs.c:355
+#: src/getargs.c:376
 #, c-format
 msgid "Usage: %s [OPTION]... FILE\n"
 msgstr "用法:%s [選項]… 檔案\n"
 
-#: src/getargs.c:356
+#: src/getargs.c:377
 msgid ""
 "Generate a deterministic LR or generalized LR (GLR) parser employing\n"
 "LALR(1), IELR(1), or canonical LR(1) parser tables.\n"
@@ -322,16 +480,16 @@
 "LALR(1),IELR(1),或規範的 LR(1) 剖析器表格。\n"
 "\n"
 
-#: src/getargs.c:362
+#: src/getargs.c:383
 msgid ""
 "Mandatory arguments to long options are mandatory for short options too.\n"
 msgstr "長選項的必要引數對於短選項也同樣必要。\n"
 
-#: src/getargs.c:365
+#: src/getargs.c:386
 msgid "The same is true for optional arguments.\n"
 msgstr "對於選擇性引數而言是相同的。\n"
 
-#: src/getargs.c:370
+#: src/getargs.c:391
 msgid ""
 "Operation Modes:\n"
 "  -h, --help                 display this help and exit\n"
@@ -355,7 +513,7 @@
 "  -f, --feature[=功能]       啟用雜項功能\n"
 "\n"
 
-#: src/getargs.c:386
+#: src/getargs.c:407
 msgid ""
 "Diagnostics:\n"
 "  -W, --warnings[=CATEGORY]  report the warnings falling in CATEGORY\n"
@@ -370,7 +528,7 @@
 "\n"
 
 # c-format
-#: src/getargs.c:400
+#: src/getargs.c:421
 #, c-format
 msgid ""
 "Tuning the Parser:\n"
@@ -402,19 +560,24 @@
 "\n"
 "  -y, --yacc                       模擬 POSIX Yacc\n"
 
-#: src/getargs.c:419
+#: src/getargs.c:438
+#, fuzzy
 msgid ""
 "Output Files:\n"
-"      --defines[=FILE]       also produce a header file\n"
-"  -d                         likewise but cannot specify FILE (for POSIX "
+"  -H, --header=[FILE]           also produce a header file\n"
+"  -d                            likewise but cannot specify FILE (for POSIX "
 "Yacc)\n"
-"  -r, --report=THINGS        also produce details on the automaton\n"
-"      --report-file=FILE     write report to FILE\n"
-"  -v, --verbose              same as '--report=state'\n"
-"  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n"
-"  -o, --output=FILE          leave output to FILE\n"
-"  -g, --graph[=FILE]         also output a graph of the automaton\n"
-"  -x, --xml[=FILE]           also output an XML report of the automaton\n"
+"  -r, --report=THINGS           also produce details on the automaton\n"
+"      --report-file=FILE        write report to FILE\n"
+"  -v, --verbose                 same as '--report=state'\n"
+"  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n"
+"  -o, --output=FILE             leave output to FILE\n"
+"  -g, --graph[=FILE]            also output a graph of the automaton\n"
+"      --html[=FILE]             also output an HTML report of the automaton\n"
+"  -x, --xml[=FILE]              also output an XML report of the automaton\n"
+"  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing "
+"file paths\n"
+"                                in output files\n"
 msgstr ""
 "輸出檔:\n"
 "      --defines[=檔案]       也產生標頭檔\n"
@@ -427,48 +590,44 @@
 "  -g, --graph[=檔案]         也輸出圖形的自動裝置\n"
 "  -x, --xml[=檔案]           也輸出自動作業的 XML 報告\n"
 
-#: src/getargs.c:436
+#: src/getargs.c:458
 #, c-format
 msgid "Report bugs to <%s>.\n"
 msgstr "將錯誤通報給 <%s>。\n"
 
-#: src/getargs.c:437
+#: src/getargs.c:459
 #, c-format
 msgid "%s home page: <%s>.\n"
 msgstr "%s 首頁:<%s>。\n"
 
-#: src/getargs.c:438
-msgid "General help using GNU software: <http://www.gnu.org/gethelp/>.\n"
+#: src/getargs.c:460
+#, fuzzy
+msgid "General help using GNU software: <https://www.gnu.org/gethelp/>.\n"
 msgstr "使用 GNU 軟體的一般說明:<http://www.gnu.org/gethelp/>。\n"
 
-#. TRANSLATORS: Replace LANG_CODE in this URL with your language
-#. code <http://translationproject.org/team/LANG_CODE.html> to
-#. form one of the URLs at http://translationproject.org/team/.
+#. TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+#. form one of the URLs at https://translationproject.org/team/.
 #. Otherwise, replace the entire URL with your translation team's
 #. email address.
-#: src/getargs.c:453
-msgid "Report translation bugs to <http://translationproject.org/team/>.\n"
+#: src/getargs.c:474
+#, fuzzy
+msgid "Report translation bugs to <https://translationproject.org/team/>.\n"
 msgstr "報告翻譯錯誤給 <http://translationproject.org/team/>。\n"
 
-#: src/getargs.c:456
+#: src/getargs.c:477
 msgid "For complete documentation, run: info bison.\n"
 msgstr "要取得完整文件請執行:info bison。\n"
 
-#: src/getargs.c:472
-#, c-format
-msgid "bison (GNU Bison) %s"
-msgstr "bison (GNU Bison) %s"
-
-#: src/getargs.c:474
+#: src/getargs.c:495
 msgid "Written by Robert Corbett and Richard Stallman.\n"
 msgstr "由 Robert Corbett 與 Richard Stallman 編寫。\n"
 
-#: src/getargs.c:478
+#: src/getargs.c:499
 #, c-format
 msgid "Copyright (C) %d Free Software Foundation, Inc.\n"
 msgstr "版權所有 (C) %d 自由軟體基金會。\n"
 
-#: src/getargs.c:481
+#: src/getargs.c:502
 msgid ""
 "This is free software; see the source for copying conditions.  There is NO\n"
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
@@ -476,36 +635,41 @@
 "這是自由軟體;請參考原始碼的版權聲明。本軟體不提供任何保證,甚至不會包括\n"
 "可售性或適用於任何特定目的的保證。\n"
 
-#: src/getargs.c:503
+#: src/getargs.c:524
 #, c-format
 msgid "multiple skeleton declarations are invalid"
 msgstr "多重架構宣告無效"
 
-#: src/getargs.c:520
+#: src/getargs.c:541
 #, c-format
 msgid "%s: invalid language"
 msgstr "%s:無效的語言"
 
-#: src/getargs.c:523
+#: src/getargs.c:544
 msgid "multiple language declarations are invalid"
 msgstr "多重語言宣告無效"
 
-#: src/getargs.c:816
+#: src/getargs.c:760
+#, fuzzy, c-format
+msgid "invalid argument for %s: %s"
+msgstr "%2$s 的引數 %1$s 無效"
+
+#: src/getargs.c:868
 #, c-format
 msgid "deprecated option: %s, use %s"
 msgstr "不宜再用選項:%s,請使用 %s"
 
-#: src/getargs.c:850
+#: src/getargs.c:902
 #, c-format
 msgid "missing operand"
 msgstr "缺少運算元"
 
-#: src/getargs.c:852
+#: src/getargs.c:904
 #, c-format
 msgid "extra operand %s"
 msgstr "額外運算元 %s"
 
-#: src/gram.c:218
+#: src/gram.c:222
 msgid "Grammar"
 msgstr "文法"
 
@@ -522,17 +686,27 @@
 "// 首頁:<%s>。\n"
 "\n"
 
-#: src/location.c:150 src/scan-gram.l:909
+#: src/i18n-strings.c:35
+#, fuzzy
+msgid "end of file"
+msgstr "於檔案結尾缺少 %s"
+
+#: src/i18n-strings.c:36
+#, fuzzy
+msgid "invalid token"
+msgstr "無效字元"
+
+#: src/location.c:138 src/scan-gram.l:957
 #, c-format
 msgid "line number overflow"
 msgstr "列號溢位"
 
-#: src/location.c:152
+#: src/location.c:140
 #, c-format
 msgid "column number overflow"
 msgstr "欄數溢位"
 
-#: src/location.c:155
+#: src/location.c:143
 #, c-format
 msgid "byte number overflow"
 msgstr "位元號碼溢位"
@@ -542,228 +716,278 @@
 #. language, remembering that "…" (U+2026 HORIZONTAL ELLIPSIS)
 #. sometimes misdisplays and that "..." (three ASCII periods) is a
 #. safer choice in some locales.
-#: src/location.c:250
+#: src/location.c:242
 msgid "..."
 msgstr "..."
 
-#: src/main.c:155
+#: src/main.c:172
 msgid "rule useless in parser due to conflicts"
 msgstr "規則由於衝突而在剖析器中無用"
 
-#: src/main.c:245
+#: src/main.c:274
 #, c-format
 msgid "fix-its can be applied.  Rerun with option '--update'."
 msgstr "可套用 fix-its。使用選項「--update」重新執行。"
 
-#: src/muscle-tab.c:532
+#: src/muscle-tab.c:528
 #, c-format
 msgid "%%define variable %s redefined"
 msgstr "%%define 變數 %s 被重新定義"
 
-#: src/muscle-tab.c:536 src/symtab.c:331
-#, c-format
+#: src/muscle-tab.c:531 src/symtab.c:350
 msgid "previous definition"
 msgstr "前一個定義"
 
-#: src/muscle-tab.c:595 src/muscle-tab.c:696 src/muscle-tab.c:757
+#: src/muscle-tab.c:590 src/muscle-tab.c:691 src/muscle-tab.c:750
 #, c-format
 msgid "%s: undefined %%define variable %s"
 msgstr "%s:未定義的 %%define 變數 %s"
 
-#: src/muscle-tab.c:629
+#: src/muscle-tab.c:624
 #, c-format
 msgid "%%define variable '%s' requires '{...}' values"
 msgstr "%%define 變數 '%s' 需要 '{...}' 值"
 
-#: src/muscle-tab.c:634
+#: src/muscle-tab.c:629
 #, c-format
 msgid "%%define variable '%s' requires keyword values"
 msgstr "%%define 變數 '%s' 需要關鍵字值"
 
-#: src/muscle-tab.c:639
+#: src/muscle-tab.c:634
 #, c-format
 msgid "%%define variable '%s' requires '\"...\"' values"
 msgstr "%%define 變數 '%s' 需要 '\"...\"' 值"
 
-#: src/muscle-tab.c:690
+#: src/muscle-tab.c:685
 #, c-format
 msgid "invalid value for %%define Boolean variable %s"
 msgstr "無效的值用於 %%define 布林變數 %s"
 
-#: src/muscle-tab.c:744
+#: src/muscle-tab.c:738
 #, c-format
 msgid "invalid value for %%define variable %s: %s"
 msgstr "無效的值用於 %%define 變數 %s:%s"
 
-#: src/muscle-tab.c:749
+#: src/muscle-tab.c:742
 #, c-format
 msgid "accepted value: %s"
 msgstr "被接受的值:%s"
 
-#: src/parse-gram.y:746
+#: src/parse-gram.y:168
+msgid "string"
+msgstr ""
+
+#: src/parse-gram.y:169
+msgid "translatable string"
+msgstr ""
+
+#: src/parse-gram.y:214
+#, fuzzy
+msgid "[identifier]"
+msgstr "無效的識別碼:%s"
+
+#: src/parse-gram.y:215
+#, fuzzy
+msgid "character literal"
+msgstr "空的字元實字"
+
+#: src/parse-gram.y:217
+msgid "epilogue"
+msgstr ""
+
+#: src/parse-gram.y:219
+#, fuzzy
+msgid "identifier"
+msgstr "無效的識別碼:%s"
+
+#: src/parse-gram.y:220
+#, fuzzy
+msgid "identifier:"
+msgstr "無效的識別碼:%s"
+
+#: src/parse-gram.y:225
+msgid "<tag>"
+msgstr ""
+
+#: src/parse-gram.y:250
+#, fuzzy
+msgid "integer literal"
+msgstr "空的字元實字"
+
+#: src/parse-gram.y:780
 #, c-format
 msgid "character literals cannot be nonterminals"
 msgstr "字元常值不能為非終端字元"
 
-#: src/parse-gram.y:753
+#: src/parse-gram.y:786
 #, c-format
 msgid "character literals cannot be used together with %s"
 msgstr "字元常值不能與 %s 一起使用"
 
-#: src/parse-gram.y:758
+#: src/parse-gram.y:789
 #, c-format
 msgid "definition of %s"
 msgstr "%s 重複定義"
 
-#: src/parse-gram.y:889
+#: src/parse-gram.y:940
 #, c-format
 msgid "missing identifier in parameter declaration"
 msgstr "在參數宣告中缺少識別項"
 
-#: src/parse-gram.y:1018
+#: src/parse-gram.y:1062
 #, c-format
 msgid "invalid version requirement: %s"
 msgstr "無效的版本需求:%s"
 
-#: src/parse-gram.y:1032
+#: src/parse-gram.y:1073
 #, c-format
 msgid "require bison %s, but have %s"
 msgstr "需要版本為 %s 的 bison,卻只有 %s 版本"
 
-#: src/print-graph.c:62 src/print.c:345
+#: src/print-graph.c:62 src/print.c:352
 #, c-format
 msgid "State %d"
 msgstr "狀態 %d"
 
-#: src/print.c:136
+#: src/print-xml.c:574
+#, c-format
+msgid "%s failed with status %d"
+msgstr ""
+
+#: src/print.c:143
 #, c-format
 msgid "shift, and go to state %d\n"
 msgstr "偏移,並進入狀態 %d\n"
 
-#: src/print.c:138
+#: src/print.c:145
 #, c-format
 msgid "go to state %d\n"
 msgstr "進入狀態 %d\n"
 
-#: src/print.c:173
+#: src/print.c:180
 msgid "error (nonassociative)\n"
 msgstr "錯誤 (非相聯的)\n"
 
-#: src/print.c:195
-#, c-format
-msgid "reduce using rule %d (%s)"
-msgstr "使用規則 %d 以縮減 (%s)"
-
-#: src/print.c:198
+#: src/print.c:202
 #, c-format
 msgid "accept"
 msgstr "接受"
 
-#: src/print.c:235 src/print.c:309
-msgid "$default"
-msgstr "$預設"
+#: src/print.c:204
+#, c-format
+msgid "reduce using rule %d (%s)"
+msgstr "使用規則 %d 以縮減 (%s)"
 
-#: src/print.c:364
+#: src/print.c:242 src/print.c:316
+msgid "$default"
+msgstr "$default"
+
+#: src/print.c:378
 msgid "Terminals, with rules where they appear"
 msgstr "終結語詞,附有它們出現處的規則"
 
-#: src/print.c:391
+#: src/print.c:405
 msgid "Nonterminals, with rules where they appear"
 msgstr "非終結語詞,附有它們出現處的規則"
 
-#: src/print.c:416
+#: src/print.c:431
 msgid "on left:"
 msgstr "於左側:"
 
-#: src/print.c:425
+#: src/print.c:440
 msgid "on right:"
 msgstr "於右側:"
 
-#: src/print.c:447
+#: src/print.c:462
 msgid "Rules useless in parser due to conflicts"
 msgstr "規則由於衝突而在剖析器中無用"
 
-#: src/reader.c:60
-#, c-format
-msgid "multiple %s declarations"
-msgstr "多重 %s 宣告"
-
-#: src/reader.c:129
+#: src/reader.c:151
 #, c-format
 msgid "result type clash on merge function %s: <%s> != <%s>"
 msgstr "結果型態抵觸發生於合併函式 %s:<%s>!=<%s>"
 
-#: src/reader.c:202
+#: src/reader.c:226
 #, c-format
 msgid "duplicated symbol name for %s ignored"
 msgstr "重複的符號名稱用於 %s 被忽略"
 
-#: src/reader.c:238
+#: src/reader.c:262
 #, c-format
 msgid "rule given for %s, which is a token"
 msgstr "用於 %s 這項字組的規則"
 
-#: src/reader.c:295
+#: src/reader.c:321
 #, c-format
 msgid "type clash on default action: <%s> != <%s>"
 msgstr "類型與預設動作相抵觸:<%s> != <%s>"
 
-#: src/reader.c:318
+#: src/reader.c:345
 #, c-format
 msgid "empty rule for typed nonterminal, and no action"
 msgstr "空白規則用於賦予類型的非終結語詞,以及沒有動作"
 
-#: src/reader.c:334
+#: src/reader.c:389
 #, c-format
 msgid "unused value: $%d"
 msgstr "未使用的值:$%d"
 
-#: src/reader.c:336
+#: src/reader.c:391
 #, c-format
 msgid "unset value: $$"
 msgstr "解除設定值:$$"
 
-#: src/reader.c:346
+#: src/reader.c:401
 #, c-format
 msgid "%%empty on non-empty rule"
 msgstr "%%empty 於非空的規則"
 
-#: src/reader.c:356
+#: src/reader.c:411
 #, c-format
 msgid "empty rule without %%empty"
 msgstr "空的規則而無 %%empty"
 
-#: src/reader.c:372
+#: src/reader.c:427
 #, c-format
 msgid "token for %%prec is not defined: %s"
 msgstr "用於 %%prec 的字組未定義:%s"
 
-#: src/reader.c:377
+#: src/reader.c:432
 #, c-format
 msgid "only midrule actions can be typed: %s"
 msgstr "僅能輸入 midrule 動作:%s"
 
-#: src/reader.c:504 src/reader.c:526 src/reader.c:597
+#: src/reader.c:559 src/reader.c:581 src/reader.c:652
 #, c-format
 msgid "%s affects only GLR parsers"
 msgstr "%s 只影響 GLR 剖析器"
 
-#: src/reader.c:507
+#: src/reader.c:562
 #, c-format
 msgid "%s must be followed by positive number"
 msgstr "%s 必須在正數之後"
 
-#: src/reader.c:562
+#: src/reader.c:617
 #, c-format
 msgid "POSIX Yacc does not support typed midrule actions"
 msgstr "POSIX Yacc 不支援輸入 midrule 動作"
 
-#: src/reader.c:666
+#: src/reader.c:717
 #, c-format
 msgid "rule is too long"
 msgstr "規則太長"
 
-#: src/reader.c:779
+#: src/reader.c:923
+#, c-format
+msgid "the start symbol %s is undefined"
+msgstr "未定義起始符號 %s"
+
+#: src/reader.c:933
+#, c-format
+msgid "the start symbol %s is a token"
+msgstr "起始符號 %s 是一項字組"
+
+#: src/reader.c:951
 #, c-format
 msgid "no rules in the input grammar"
 msgstr "在輸入文法中沒有規則"
@@ -772,362 +996,365 @@
 msgid "rule useless in grammar"
 msgstr "規則在文法中無用"
 
-#: src/reduce.c:280
+#: src/reduce.c:281
 #, c-format
 msgid "nonterminal useless in grammar: %s"
 msgstr "非終結語詞在文法中無用:%s"
 
-#: src/reduce.c:321
+#: src/reduce.c:322
 msgid "Nonterminals useless in grammar"
 msgstr "非終結語詞在文法中無用"
 
-#: src/reduce.c:333
+#: src/reduce.c:334
 msgid "Terminals unused in grammar"
-msgstr "終端機在文法中未使用"
+msgstr "未在文法中使用終結語詞"
 
-#: src/reduce.c:342
+#: src/reduce.c:343
 msgid "Rules useless in grammar"
 msgstr "規則在文法中無用"
 
-#: src/reduce.c:355
+#: src/reduce.c:356
 #, c-format
 msgid "%d nonterminal useless in grammar"
 msgid_plural "%d nonterminals useless in grammar"
 msgstr[0] "%d 非終結語詞在文法中無用"
 
-#: src/reduce.c:360
+#: src/reduce.c:361
 #, c-format
 msgid "%d rule useless in grammar"
 msgid_plural "%d rules useless in grammar"
 msgstr[0] "%d 規則在文法中無用"
 
-#: src/reduce.c:386
+#: src/reduce.c:392
 #, c-format
 msgid "start symbol %s does not derive any sentence"
 msgstr "啟始符號 %s 不衍生任何句子"
 
-#: src/scan-code.l:158
+#: src/scan-code.l:160
 #, c-format
 msgid "stray '%s'"
 msgstr "零星的 %s"
 
-#: src/scan-code.l:330
+#: src/scan-code.l:332
 #, c-format
 msgid "refers to: %c%s at %s"
 msgstr "參考:%c%s 於 %s"
 
-#: src/scan-code.l:354
+#: src/scan-code.l:356
 #, c-format
 msgid "possibly meant: %c"
 msgstr "可能意指:%c"
 
-#: src/scan-code.l:363
+#: src/scan-code.l:365
 #, c-format
 msgid ", hiding %c"
 msgstr ",隱藏 %c"
 
-#: src/scan-code.l:371
+#: src/scan-code.l:373
 #, c-format
 msgid " at %s"
 msgstr " 於 %s"
 
-#: src/scan-code.l:375
+#: src/scan-code.l:377
 #, c-format
 msgid ", cannot be accessed from midrule action at $%d"
 msgstr ",無法自位於 $%d 之 midrule 動作存取"
 
-#: src/scan-code.l:423 src/scan-gram.l:831
+#: src/scan-code.l:416 src/scan-gram.l:879
 #, c-format
 msgid "integer out of range: %s"
 msgstr "整數超過範圍:%s"
 
-#: src/scan-code.l:498
+#: src/scan-code.l:505
 #, c-format
 msgid "invalid reference: %s"
 msgstr "無效的參考:%s"
 
-#: src/scan-code.l:506
+#: src/scan-code.l:512
 #, c-format
 msgid "syntax error after '%c', expecting integer, letter, '_', '[', or '$'"
 msgstr "語法錯誤發生於 %c 之後,預期為整數、字母、'_'、'[' 或 '$'"
 
-#: src/scan-code.l:512
+#: src/scan-code.l:518
 #, c-format
 msgid "symbol not found in production before $%d: %.*s"
 msgstr "在 $%d 之前的結果中找不到符號:%.*s"
 
-#: src/scan-code.l:517
+#: src/scan-code.l:523
 #, c-format
 msgid "symbol not found in production: %.*s"
 msgstr "在結果中找不到符號:%.*s"
 
-#: src/scan-code.l:532
+#: src/scan-code.l:537
 #, c-format
 msgid "misleading reference: %s"
 msgstr "誤導的參考:%s"
 
-#: src/scan-code.l:548
+#: src/scan-code.l:552
 #, c-format
 msgid "ambiguous reference: %s"
 msgstr "模稜兩可的參考:%s"
 
-#: src/scan-code.l:584
+#: src/scan-code.l:588
 #, c-format
 msgid "explicit type given in untyped grammar"
 msgstr "在未定型態文法中給定明確的型態"
 
-#: src/scan-code.l:639
+#: src/scan-code.l:643
 #, c-format
 msgid "$$ for the midrule at $%d of %s has no declared type"
 msgstr "$$ 對於在 %2$s 中 $%1$d 的中段沒有任何宣告型態"
 
-#: src/scan-code.l:645
+#: src/scan-code.l:649
 #, c-format
 msgid "$$ of %s has no declared type"
 msgstr "%s 中的 $$ 沒有任何宣告型態"
 
-#: src/scan-code.l:671
+#: src/scan-code.l:675
 #, c-format
 msgid "$%s of %s has no declared type"
 msgstr "%2$s 中的 $%1$s 沒有任何宣告型態"
 
-#: src/scan-code.l:694
+#: src/scan-code.l:698
 #, c-format
 msgid "multiple occurrences of $%d with api.value.automove"
 msgstr "api.value.automove 多次發生 $%d 次"
 
-#: src/scan-gram.l:198
-#, c-format
-msgid "stray ',' treated as white space"
-msgstr "零星的 ',' 將視為空白"
-
-#: src/scan-gram.l:292
-#, c-format
-msgid "invalid directive: %s"
-msgstr "無效的指令:%s"
-
-#: src/scan-gram.l:313
-#, c-format
-msgid "invalid identifier: %s"
-msgstr "無效的識別碼:%s"
-
-#: src/scan-gram.l:365
-msgid "invalid character"
-msgid_plural "invalid characters"
-msgstr[0] "無效字元"
-
-#: src/scan-gram.l:383
-#, c-format
-msgid "invalid null character"
-msgstr "無效的空字元"
-
-#: src/scan-gram.l:437
-#, c-format
-msgid "unexpected identifier in bracketed name: %s"
-msgstr "中括號內未預期的識別名稱:%s"
-
-#: src/scan-gram.l:459
-#, c-format
-msgid "an identifier expected"
-msgstr "預期是一個識別碼"
-
-#: src/scan-gram.l:464
-msgid "invalid character in bracketed name"
-msgid_plural "invalid characters in bracketed name"
-msgstr[0] "在中括號內的名稱有無效字元"
-
-#: src/scan-gram.l:535
-#, c-format
-msgid "POSIX Yacc does not support string literals"
-msgstr "POSIX Yacc 不支援字串常值"
-
-#: src/scan-gram.l:557
-#, c-format
-msgid "empty character literal"
-msgstr "空的字元實字"
-
-#: src/scan-gram.l:563
-#, c-format
-msgid "extra characters in character literal"
-msgstr "額外字元於字元實字"
-
-#: src/scan-gram.l:612 src/scan-gram.l:622 src/scan-gram.l:640
+#: src/scan-gram.l:93
 #, c-format
 msgid "invalid number after \\-escape: %s"
 msgstr "無效數字於 \\-escape 之後:%s"
 
-#: src/scan-gram.l:652
+#: src/scan-gram.l:214
+#, c-format
+msgid "stray ',' treated as white space"
+msgstr "零星的 ',' 將視為空白"
+
+#: src/scan-gram.l:309
+#, c-format
+msgid "invalid directive: %s"
+msgstr "無效的指令:%s"
+
+#: src/scan-gram.l:331
+#, c-format
+msgid "invalid identifier: %s"
+msgstr "無效的識別碼:%s"
+
+#: src/scan-gram.l:385
+msgid "invalid character"
+msgid_plural "invalid characters"
+msgstr[0] "無效字元"
+
+#: src/scan-gram.l:405
+#, c-format
+msgid "invalid null character"
+msgstr "無效的空字元"
+
+#: src/scan-gram.l:463
+#, c-format
+msgid "unexpected identifier in bracketed name: %s"
+msgstr "中括號內未預期的識別名稱:%s"
+
+#: src/scan-gram.l:487
+#, c-format
+msgid "an identifier expected"
+msgstr "預期是一個識別碼"
+
+#: src/scan-gram.l:494
+msgid "invalid character in bracketed name"
+msgid_plural "invalid characters in bracketed name"
+msgstr[0] "在中括號內的名稱有無效字元"
+
+#: src/scan-gram.l:567 src/scan-gram.l:582
+#, c-format
+msgid "POSIX Yacc does not support string literals"
+msgstr "POSIX Yacc 不支援字串常值"
+
+#: src/scan-gram.l:605
+#, c-format
+msgid "empty character literal"
+msgstr "空的字元實字"
+
+#: src/scan-gram.l:611
+#, c-format
+msgid "extra characters in character literal"
+msgstr "額外字元於字元實字"
+
+#: src/scan-gram.l:690
 #, c-format
 msgid "invalid character after \\-escape: %s"
 msgstr "\\-跳脫符號之後的無效字元:%s"
 
-#: src/scan-gram.l:824
+#: src/scan-gram.l:872
 #, c-format
 msgid "POSIX Yacc does not support hexadecimal literals"
 msgstr "POSIX Yacc 不支援十六進位常值"
 
-#: src/scan-gram.l:962
+#: src/scan-gram.l:1010
 #, c-format
 msgid "missing %s at end of file"
 msgstr "於檔案結尾缺少 %s"
 
-#: src/scan-gram.l:973
+#: src/scan-gram.l:1021
 #, c-format
 msgid "missing %s at end of line"
 msgstr " 於列尾缺少 %s"
 
-#: src/scan-skel.l:140
+#: src/scan-skel.l:158
 #, c-format
 msgid "unclosed %s directive in skeleton"
 msgstr "在架構中有未關閉的 %s 指令"
 
-#: src/scan-skel.l:258
+#: src/scan-skel.l:269
 #, c-format
 msgid "too few arguments for %s directive in skeleton"
 msgstr "在架構中的 %s 指令引數太少"
 
-#: src/scan-skel.l:265
+#: src/scan-skel.l:276
 #, c-format
 msgid "too many arguments for %s directive in skeleton"
 msgstr "在架構中的 %s 指令引數太多"
 
-#: src/symtab.c:108
+#: src/symtab.c:129
 #, c-format
 msgid "POSIX Yacc forbids dashes in symbol names: %s"
 msgstr "POSIX Yacc 在符號名稱中禁用橫線:%s"
 
-#: src/symtab.c:118
-#, c-format
-msgid "too many symbols in input grammar (limit is %d)"
-msgstr "在輸入文法中太多符號 (限制為 %d)"
-
-#: src/symtab.c:300
+#: src/symtab.c:329
 #, c-format
 msgid "%s redeclaration for %s"
 msgstr "%s 重複宣告了 %s"
 
-#: src/symtab.c:313
+#: src/symtab.c:338
 #, c-format
 msgid "%s redeclaration for <%s>"
 msgstr "%s 重複宣告了 <%s>"
 
-#: src/symtab.c:325
+#: src/symtab.c:347
 #, c-format
 msgid "symbol %s redeclared as a token"
 msgstr "符號 %s 被重複宣告為 token"
 
-#: src/symtab.c:326
+#: src/symtab.c:348
 #, c-format
 msgid "symbol %s redeclared as a nonterminal"
 msgstr "符號 %s 被重複宣告為非終端符號"
 
-#: src/symtab.c:370
+#: src/symtab.c:388
 #, c-format
 msgid ""
 "symbol %s is used, but is not defined as a token and has no rules; did you "
 "mean %s?"
 msgstr "符號 %s 已使用過,但是並未定義為字組也沒有規則;你是說 %s 嗎?"
 
-#: src/symtab.c:380
+#: src/symtab.c:398
 #, c-format
 msgid "symbol %s is used, but is not defined as a token and has no rules"
 msgstr "符號 %s 已使用過,但是並未定義為字組也沒有規則"
 
-#: src/symtab.c:515
+#: src/symtab.c:537
 #, c-format
 msgid "POSIX yacc reserves %%type to nonterminals"
 msgstr "POSIX yacc 保留 %%type 給非終端機"
 
-#: src/symtab.c:550
+#: src/symtab.c:567
 #, c-format
 msgid "symbol %s redeclared"
 msgstr "符號 %s 被重複宣告"
 
-#: src/symtab.c:572
-#, c-format
-msgid "nonterminals cannot be given an explicit number"
-msgstr "不能向非終端字元傳入明確數字"
+#: src/symtab.c:591
+#, fuzzy, c-format
+msgid "nonterminals cannot be given a token code"
+msgstr "不能向非終端字元傳入字串別名"
 
-#: src/symtab.c:575
-#, c-format
-msgid "redefining user token number of %s"
+#: src/symtab.c:594
+#, fuzzy, c-format
+msgid "redefining code of token %s"
 msgstr "重新定義 %s 的使用者字組數目"
 
-#: src/symtab.c:578
-#, c-format
-msgid "user token number of %s too large"
+#: src/symtab.c:597
+#, fuzzy, c-format
+msgid "code of token %s too large"
 msgstr "使用者字組數 %s 太大"
 
-#: src/symtab.c:617
+#: src/symtab.c:634
 #, c-format
 msgid "string literal %s not attached to a symbol"
 msgstr "字串常值 %s 未連結至符號"
 
-#: src/symtab.c:645
+#: src/symtab.c:662
 #, c-format
 msgid "useless %s for type <%s>"
 msgstr "%s 對於類型 <%s> 無作用"
 
-#: src/symtab.c:650
+#: src/symtab.c:667
 #, c-format
 msgid "type <%s> is used, but is not associated to any symbol"
 msgstr "類型 <%s> 已使用過,但是並未與任何符號相關聯"
 
-#: src/symtab.c:695
+#: src/symtab.c:712
 #, c-format
 msgid "nonterminals cannot be given a string alias"
 msgstr "不能向非終端字元傳入字串別名"
 
-#: src/symtab.c:698
+#: src/symtab.c:715
 #, c-format
 msgid "symbol %s used more than once as a literal string"
 msgstr "符號 %s 超過一次使用為實字字串"
 
-#: src/symtab.c:701
+#: src/symtab.c:718
 #, c-format
 msgid "symbol %s given more than one literal string"
 msgstr "符號 %s 給定了超過一個實字字串"
 
-#: src/symtab.c:736
+#: src/symtab.c:752
 #, c-format
-msgid "user token number %d redeclaration for %s"
-msgstr "使用者字組數字 %d 被重複宣告為 %s"
+msgid "code %d reassigned to token %s"
+msgstr ""
 
-#: src/symtab.c:740
+#: src/symtab.c:755
 #, c-format
 msgid "previous declaration for %s"
 msgstr "%s 的前一個宣告"
 
-#: src/symtab.c:1063
+#: src/symtab.c:1083
 #, c-format
 msgid "token number too large"
 msgstr "字組數太大"
 
-#: src/symtab.c:1119
-#, c-format
-msgid "the start symbol %s is undefined"
-msgstr "未定義起始符號 %s"
-
-#: src/symtab.c:1123
-#, c-format
-msgid "the start symbol %s is a token"
-msgstr "起始符號 %s 是一項字組"
-
-#: src/symtab.c:1294
+#: src/symtab.c:1332
 #, c-format
 msgid "useless precedence and associativity for %s"
 msgstr "對於 %s 無作用的優先性與順序關聯性"
 
-#: src/symtab.c:1297
+#: src/symtab.c:1335
 #, c-format
 msgid "useless precedence for %s"
 msgstr "對於 %s 無作用的優先性"
 
-#: src/symtab.c:1301
+#: src/symtab.c:1339
 #, c-format
 msgid "useless associativity for %s, use %%precedence"
 msgstr "對於 %s 無作用的順序關聯性,使用 %%precedence"
 
+#, c-format
+#~ msgid "bison (GNU Bison) %s"
+#~ msgstr "bison (GNU Bison) %s"
+
+#, c-format
+#~ msgid "multiple %s declarations"
+#~ msgstr "多重 %s 宣告"
+
+#, c-format
+#~ msgid "too many symbols in input grammar (limit is %d)"
+#~ msgstr "在輸入文法中太多符號 (限制為 %d)"
+
+#~ msgid "nonterminals cannot be given an explicit number"
+#~ msgstr "不能向非終端字元傳入明確數字"
+
+#~ msgid "user token number %d redeclaration for %s"
+#~ msgstr "使用者字組數字 %d 被重複宣告為 %s"
+
 #~ msgid "deprecated directive, use %s"
 #~ msgstr "無效的指令:%s"
 
@@ -1204,9 +1431,6 @@
 #~ "    停用以上全部\n"
 #~ "  "
 
-#~ msgid "invalid argument %s for %s"
-#~ msgstr "%2$s 的引數 %1$s 無效"
-
 #~ msgid "ambiguous argument %s for %s"
 #~ msgstr "%2$s 的引數 %1$s 不明確"
 
diff --git a/runtime-po/LINGUAS b/runtime-po/LINGUAS
index a7aa440..7827dcf 100644
--- a/runtime-po/LINGUAS
+++ b/runtime-po/LINGUAS
@@ -32,6 +32,7 @@
 sq
 sr
 sv
+ta
 th
 tr
 uk
diff --git a/runtime-po/ast.gmo b/runtime-po/ast.gmo
index d626d2e..4594419 100644
--- a/runtime-po/ast.gmo
+++ b/runtime-po/ast.gmo
Binary files differ
diff --git a/runtime-po/ast.po b/runtime-po/ast.po
index 484e154..df68d75 100644
--- a/runtime-po/ast.po
+++ b/runtime-po/ast.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.4.1a\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2010-02-03 17:17+0100\n"
 "Last-Translator: Marquinos <maacub@gmail.com>\n"
 "Language-Team: Asturian <ubuntu-l10n-ast@lists.ubuntu.com>\n"
@@ -18,54 +18,54 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "fallu de sistasis: nun puede facese copia de seguridá"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "sistasis ye ambigüa"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "fallu de sistasis"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "fallu de sistasis, %s nun esperáu"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "fallu de sistasis, %s nun esperáu, esperáu %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "fallu de sistasis, %s nun esperáu, esperáu %s o %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "fallu de sistasis, %s nun esperáu, esperáu %s o %s o %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "fallu de sistasis, %s nun esperáu, esperáu %s o %s o %s o %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "memoria escosada"
diff --git a/runtime-po/bg.gmo b/runtime-po/bg.gmo
index d8c2f34..a96b5e1 100644
--- a/runtime-po/bg.gmo
+++ b/runtime-po/bg.gmo
Binary files differ
diff --git a/runtime-po/bg.po b/runtime-po/bg.po
index d5642de..7b181b6 100644
--- a/runtime-po/bg.po
+++ b/runtime-po/bg.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 3.3.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2019-06-20 18:38+0200\n"
 "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
 "Language-Team: Bulgarian <dict@ludost.net>\n"
@@ -17,54 +17,54 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "синтактична грешка: невъзможно връщане назад"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "нееднозначен синтаксис"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "синтактична грешка"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "синтактична грешка: не се очаква „%s“"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "синтактична грешка: не се очаква „%s“, а „%s“"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "синтактична грешка: не се очаква „%s“, а „%s“ или „%s“"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "синтактична грешка: не се очаква „%s“, а „%s“, „%s“ или „%s“"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "синтактична грешка: не се очаква „%s“, а „%s“, „%s“, „%s“ или „%s“"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "паметта е изчерпана"
diff --git a/runtime-po/bison-runtime.pot b/runtime-po/bison-runtime.pot
index 2fee370..dd3be2c 100644
--- a/runtime-po/bison-runtime.pot
+++ b/runtime-po/bison-runtime.pot
@@ -6,9 +6,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: GNU bison 3.5\n"
+"Project-Id-Version: GNU bison 3.8.2\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,54 +17,54 @@
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr ""
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr ""
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr ""
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr ""
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr ""
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr ""
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr ""
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr ""
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr ""
diff --git a/runtime-po/ca.gmo b/runtime-po/ca.gmo
index edf2c04..0f6d5d1 100644
--- a/runtime-po/ca.gmo
+++ b/runtime-po/ca.gmo
Binary files differ
diff --git a/runtime-po/ca.po b/runtime-po/ca.po
index dd02bf9..13d03b9 100644
--- a/runtime-po/ca.po
+++ b/runtime-po/ca.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 3.0.2\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2017-02-27 08:24+0100\n"
 "Last-Translator: Walter Garcia-Fontes <walter.garcia@upf.edu>\n"
 "Language-Team: Catalan <ca@dodds.net>\n"
@@ -18,54 +18,54 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "error de sintaxi: no es pot fer la còpia de seguretat"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "la sintaxi és ambigua"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "error de sintaxi"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "error de sintaxi, no s'esperava %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "error de sintaxi, no s'esperava %s, s'esperava %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "error de sintaxi, no s'esperava %s, s'esperava %s o %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "error de sintaxi, no s'esperava %s, s'esperava %s o %s o %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "error de sintaxi, no s'esperava %s, s'esperava %s o %s o %s o %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "s'ha exhaurit la memòria"
diff --git a/runtime-po/da.gmo b/runtime-po/da.gmo
index 5ad284e..537ecb5 100644
--- a/runtime-po/da.gmo
+++ b/runtime-po/da.gmo
Binary files differ
diff --git a/runtime-po/da.po b/runtime-po/da.po
index 0e1012c..599bb14 100644
--- a/runtime-po/da.po
+++ b/runtime-po/da.po
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime-2.3b\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2008-08-25 00:00+0000\n"
 "Last-Translator: Keld Simonsen <keld@dkuug.dk>\n"
 "Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
@@ -21,54 +21,54 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "syntaksfejl: kan ikke lave sikkerhedskopi"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "syntaks er tvetydig"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "syntaksfejl"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "syntaksfejl, uventet %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "syntaksfejl, uventet %s, forventede %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "syntaksfejl, uventet %s, forventede %s eller %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "syntaksfejl, uventet %s, forventede %s eller %s eller %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "syntaksfejl, uventet %s, forventede %s eller %s eller %s eller %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "hukommelsen opbrugt"
diff --git a/runtime-po/de.gmo b/runtime-po/de.gmo
index f0a7d8a..59b796c 100644
--- a/runtime-po/de.gmo
+++ b/runtime-po/de.gmo
Binary files differ
diff --git a/runtime-po/de.po b/runtime-po/de.po
index 9f086c1..eb74da9 100644
--- a/runtime-po/de.po
+++ b/runtime-po/de.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.3a\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2006-12-12 09:38+0100\n"
 "Last-Translator: Michael Piefel <piefel@informatik.hu-berlin.de>\n"
 "Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
@@ -18,55 +18,55 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "Syntaxfehler: Kann nicht zurück gehen"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "Syntax ist mehrdeutig"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "Syntaxfehler"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "Syntaxfehler, unerwartetes %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "Syntaxfehler, unerwartetes %s, hatte %s erwartet"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "Syntaxfehler, unerwartetes %s, hatte %s oder %s erwartet"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "Syntaxfehler, unerwartetes %s, hatte %s oder %s oder %s erwartet"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr ""
 "Syntaxfehler, unerwartetes %s, hatte %s oder %s oder %s oder %s erwartet"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "Speicher ausgeschöpft"
diff --git a/runtime-po/el.gmo b/runtime-po/el.gmo
index 7fcd4f9..1345f84 100644
--- a/runtime-po/el.gmo
+++ b/runtime-po/el.gmo
Binary files differ
diff --git a/runtime-po/el.po b/runtime-po/el.po
index 1464460..927e8a4 100644
--- a/runtime-po/el.po
+++ b/runtime-po/el.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime-3.3.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2019-04-29 15:49+0200\n"
 "Last-Translator: Lefteris Dimitroulakis <ledimitro@gmail.com>\n"
 "Language-Team: Greek <team@lists.gnome.gr>\n"
@@ -19,54 +19,54 @@
 "X-Generator: Lokalize 2.0\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "συντακτικό σφάλμα: δεν μπορώ να δημιουργήσω αντίγραφο ασφαλείας"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "ασαφής σύνταξη"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "συντακτικό σφάλμα"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "συντακτικό σφάλμα, αναπάντεχο %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "συντακτικό σφάλμα, αναπάντεχο %s, αναμενόμενο %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "συντακτικό σφάλμα, αναπάντεχο %s, αναμενόμενο %s ή %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "συντακτικό σφάλμα, αναπάντεχο %s, αναμενόμενο %s ή %s ή %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "συντακτικό σφάλμα, αναπάντεχο %s, αναμενόμενο %s ή %s ή %s ή %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "η μνήμη εξαντλήθηκε"
diff --git a/runtime-po/eo.gmo b/runtime-po/eo.gmo
index 8f6edd0..d2ed819 100644
--- a/runtime-po/eo.gmo
+++ b/runtime-po/eo.gmo
Binary files differ
diff --git a/runtime-po/eo.po b/runtime-po/eo.po
index a02100b..724a4ea 100644
--- a/runtime-po/eo.po
+++ b/runtime-po/eo.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 3.0.5\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2018-08-16 21:39-0300\n"
 "Last-Translator: Felipe Castro <fefcas@gmail.com>\n"
 "Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n"
@@ -18,54 +18,54 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "X-Generator: Poedit 1.8.7.1\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "sintaks-eraro: ne eblas savkopii"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "sintakso estas plursenca"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "sintaks-eraro"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "sintaks-eraro, neatendita %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "sintaks-eraro, neatendita %s, ni atendis %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "sintaks-eraro, neatendita %s, ni atendis %s aŭ %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "sintaks-eraro, neatendita %s, ni atendis %s aŭ %s aŭ %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "sintaks-eraro, neatendita %s, ni atendis %s aŭ %s aŭ %s aŭ %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "memoro entute plenigita"
diff --git a/runtime-po/es.gmo b/runtime-po/es.gmo
index 84c6932..762d03e 100644
--- a/runtime-po/es.gmo
+++ b/runtime-po/es.gmo
Binary files differ
diff --git a/runtime-po/es.po b/runtime-po/es.po
index 10638dc..22672e7 100644
--- a/runtime-po/es.po
+++ b/runtime-po/es.po
@@ -24,7 +24,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 3.0.2\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2018-03-29 11:39+0200\n"
 "Last-Translator: Francisco Javier Serrador <fserrador@gmail.com>\n"
 "Language-Team: Spanish <es@tp.org.es>\n"
@@ -36,54 +36,54 @@
 "X-Generator: Virtaal 0.7.1\n"
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "error sintáctico: no puede respaldar"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "la sintaxis es ambigua"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "error de sintaxis"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "error de sintaxis, %s inesperado"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "error de sintaxis, %s inesperado, se esperaba %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "error de sintaxis, %s inesperado, se esperaba %s o %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "error de sintaxis, %s inesperado, se esperaba %s o %s o %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "error de sintaxis, %s inesperado, se esperaba %s o %s o %s o %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "memoria agotada"
diff --git a/runtime-po/et.gmo b/runtime-po/et.gmo
index e57f93e..e34b9f5 100644
--- a/runtime-po/et.gmo
+++ b/runtime-po/et.gmo
Binary files differ
diff --git a/runtime-po/et.po b/runtime-po/et.po
index 6a544be..0acf870 100644
--- a/runtime-po/et.po
+++ b/runtime-po/et.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.6.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2013-04-04 00:39+0300\n"
 "Last-Translator: Toomas Soome <Toomas.Soome@microlink.ee>\n"
 "Language-Team: Estonian <linux-ee@lists.eenet.ee>\n"
@@ -17,54 +17,54 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "süntaksi viga: ei saa toetada"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "süntaks on segane"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "süntaksi viga"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "süntaksi viga, ootamatu %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "süntaksi viga, ootamatu %s, ootasin %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "süntaksi viga, ootamatu %s, ootasin %s või %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "süntaksi viga, ootamatu %s, ootasin %s või %s või %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "süntaksi viga, ootamatu %s, ootasin %s või %s või %s või %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "mälu on otsas"
diff --git a/runtime-po/fi.gmo b/runtime-po/fi.gmo
index c657a41..0a64937 100644
--- a/runtime-po/fi.gmo
+++ b/runtime-po/fi.gmo
Binary files differ
diff --git a/runtime-po/fi.po b/runtime-po/fi.po
index cb24062..de970ac 100644
--- a/runtime-po/fi.po
+++ b/runtime-po/fi.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.6.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2012-12-09 17:25+0200\n"
 "Last-Translator: Jorma Karvonen <karvonen.jorma@gmail.com>\n"
 "Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n"
@@ -20,54 +20,54 @@
 "X-Generator: KBabel 1.11.2\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "syntaksivirhe: ei voida tehdä varmuuskopiota"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "syntaksi on moniselitteinen"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "syntaksivirhe"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "syntaksivirhe, odottamaton %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "syntaksivirhe, odottamaton %s, odotetaan %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "syntaksivirhe, odottamaton %s, odotetaan %s tai %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "syntaksivirhe, odottamaton %s, odotetaan %s tai %s tai %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "syntaksivirhe, odottamaton %s, odotetaan %s tai %s tai %s tai %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "muisti loppui"
diff --git a/runtime-po/fr.gmo b/runtime-po/fr.gmo
index 4118e84..c247c6d 100644
--- a/runtime-po/fr.gmo
+++ b/runtime-po/fr.gmo
Binary files differ
diff --git a/runtime-po/fr.po b/runtime-po/fr.po
index ee48199..7d00a24 100644
--- a/runtime-po/fr.po
+++ b/runtime-po/fr.po
@@ -14,7 +14,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 3.0.2\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2015-04-25 16:39+0200\n"
 "Last-Translator: Stéphane Aulery <lkppo@free.fr>\n"
 "Language-Team: French <traduc@traduc.org>\n"
@@ -25,54 +25,54 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "erreur de syntaxe : retour arrière impossible"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "syntaxe ambiguë"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "erreur de syntaxe"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "erreur de syntaxe, %s inattendu"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "erreur de syntaxe, %s inattendu, attendait %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "erreur de syntaxe, %s inattendu, attendait %s ou %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "erreur de syntaxe, %s inattendu, attendait %s ou %s ou %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "erreur de syntaxe, %s inattendu, attendait %s ou %s ou %s ou %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "mémoire épuisée"
diff --git a/runtime-po/ga.gmo b/runtime-po/ga.gmo
index 6803dce..ad33af8 100644
--- a/runtime-po/ga.gmo
+++ b/runtime-po/ga.gmo
Binary files differ
diff --git a/runtime-po/ga.po b/runtime-po/ga.po
index ea5666e..bf09813 100644
--- a/runtime-po/ga.po
+++ b/runtime-po/ga.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 3.0.2\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2017-01-08 23:14-0500\n"
 "Last-Translator: Kevin Patrick Scannell <kscanne@gmail.com>\n"
 "Language-Team: Irish <gaeilge-gnulinux@lists.sourceforge.net>\n"
@@ -18,57 +18,57 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 
 # sic; níl "cúltaca" i gceist anseo
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "earráid chomhréire: ní féidir cúlú a dhéanamh"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "comhréir dhébhríoch"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "earráid chomhréire"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "earráid chomhréire, %s gan súil leis"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "earráid chomhréire, %s gan súil leis, bhíothas ag súil le %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "earráid chomhréire, %s gan súil leis, bhíothas ag súil le %s nó %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr ""
 "earráid chomhréire, %s gan súil leis, bhíothas ag súil le %s nó %s nó %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr ""
 "earráid chomhréire, %s gan súil leis, bhíothas ag súil le %s nó %s nó %s nó "
 "%s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "cuimhne ídithe"
diff --git a/runtime-po/gl.gmo b/runtime-po/gl.gmo
index 37dafc1..5bf941f 100644
--- a/runtime-po/gl.gmo
+++ b/runtime-po/gl.gmo
Binary files differ
diff --git a/runtime-po/gl.po b/runtime-po/gl.po
index f9846b6..03dc9aa 100644
--- a/runtime-po/gl.po
+++ b/runtime-po/gl.po
@@ -12,7 +12,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 3.0.2\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2015-09-09 16:02+0100\n"
 "Last-Translator: Leandro Regueiro <leandro.regueiro@gmail.com>\n"
 "Language-Team: Galician <proxecto@trasno.net>\n"
@@ -24,54 +24,54 @@
 "Plural-Forms: nplurals=2; plural=(n!=1);\n"
 "X-Generator: Poedit 1.5.4\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "erro de sintaxe: non foi posíbel realizar unha copia de seguridade"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "a sintaxe é ambigua"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "erro de sintaxe"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "erro de sintaxe, non se agardaba %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "erro de sintaxe, non se agardaba %s, agardábase %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "erro de sintaxe, non se agardaba %s, agardábase %s ou %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "erro de sintaxe, non se agardaba %s, agardábase %s ou %s ou %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "erro de sintaxe, non se agardaba %s, agardábase %s ou %s ou %s ou %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "memoria esgotada"
diff --git a/runtime-po/hr.gmo b/runtime-po/hr.gmo
index 4d47efc..16f604a 100644
--- a/runtime-po/hr.gmo
+++ b/runtime-po/hr.gmo
Binary files differ
diff --git a/runtime-po/hr.po b/runtime-po/hr.po
index cdb50a0..d82db7f 100644
--- a/runtime-po/hr.po
+++ b/runtime-po/hr.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.7.1\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2013-04-18 00:01+0200\n"
 "Last-Translator: Tomislav Krznar <tomislav.krznar@gmail.com>\n"
 "Language-Team: Croatian <lokalizacija@linux.hr>\n"
@@ -21,54 +21,54 @@
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 "X-Generator: Gtranslator 2.91.6\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "sintaksna greška: ne mogu napraviti sigurnosnu kopiju"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "sintaksa je višeznačna"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "sintaksna greška"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "sintaksna greška, neočekivani %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "sintaksna greška, neočekivani %s, očekujem %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "sintaksna greška, neočekivani %s, očekujem %s ili %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "sintaksna greška, neočekivani %s, očekujem %s, %s ili %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "sintaksna greška, neočekivani %s, očekujem %s, %s, %s ili %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "memorija iscrpljena"
diff --git a/runtime-po/hu.gmo b/runtime-po/hu.gmo
index 3cb0379..5753573 100644
--- a/runtime-po/hu.gmo
+++ b/runtime-po/hu.gmo
Binary files differ
diff --git a/runtime-po/hu.po b/runtime-po/hu.po
index 3c14e26..8da4248 100644
--- a/runtime-po/hu.po
+++ b/runtime-po/hu.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.4.3\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2010-08-30 05:23+0200\n"
 "Last-Translator: Kéménczy Kálmán <kkemenczy@gmail.com>\n"
 "Language-Team: Hungarian <translation-team-hu@lists.sourceforge.net>\n"
@@ -18,54 +18,54 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "szintaktikai hiba: nem menthető"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "kétértelmű szintaxis"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "szintaktikai hiba"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "szintaktikai hiba, nem várt %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "szintaktikai hiba, nem várt %s, várt: %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "szintaktikai hiba, nem várt %s, várt: %s, vagy %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "szintaktikai hiba, nem várt %s, várt: %s, vagy %s, vagy %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "szintaktikai hiba, nem várt %s, várt: %s, vagy %s, vagy %s, vagy %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "a memória kiürült"
diff --git a/runtime-po/ia.gmo b/runtime-po/ia.gmo
index a772bc6..45d44b0 100644
--- a/runtime-po/ia.gmo
+++ b/runtime-po/ia.gmo
Binary files differ
diff --git a/runtime-po/ia.po b/runtime-po/ia.po
index 2d184fa..5650210 100644
--- a/runtime-po/ia.po
+++ b/runtime-po/ia.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.7.1\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2013-04-15 23:43+0400\n"
 "Last-Translator: Nik Kalach <nik.kalach@inbox.ru>\n"
 "Language-Team: Interlingua <translation-team-ia@lists.sourceforge.net>\n"
@@ -17,54 +17,54 @@
 "Content-Transfer-Encoding: 8bit\n"
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "error de syntaxe: non pote reculer"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "syntaxe es ambigue"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "error de syntaxe"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "error de syntaxe, %s inexpectate"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "error de syntaxe, %s inexpectate in loco de %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "error de syntaxe, %s inexpectate in loco de %s o %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "error de syntaxe, %s inexpectate in loco de %s o %s o %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "error de syntaxe, %s inexpectate in loco de %s o %s o %s o %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "memoria exhauste"
diff --git a/runtime-po/id.gmo b/runtime-po/id.gmo
index e5a31a4..cfd65f4 100644
--- a/runtime-po/id.gmo
+++ b/runtime-po/id.gmo
Binary files differ
diff --git a/runtime-po/id.po b/runtime-po/id.po
index 47ce15d..577881b 100644
--- a/runtime-po/id.po
+++ b/runtime-po/id.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.0b.id\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2005-09-14 20:39+0700\n"
 "Last-Translator: Tedi Heriyanto <tedi_heriyanto@yahoo.com>\n"
 "Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
@@ -20,57 +20,57 @@
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: KBabel 1.10\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "kesalahan sintaks: tidak dapat membackup"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "sintaks rancu"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "kesalahan sintaks"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "kesalahan sintaks, %s tidak diharapkan"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "kesalahan sintaks, %s tidak diharapkan, mengharapkan %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "kesalahan sintaks, %s tidak diharapkan, mengharapkan %s atau %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr ""
 "kesalahan sintaks, %s tidak diharapkan, mengharapkan %s atau %s atau %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr ""
 "kesalahan sintaks, %s tidak diharapkan, mengharapkan %s atau %s atau %s atau "
 "%s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "memori habis"
diff --git a/runtime-po/it.gmo b/runtime-po/it.gmo
index f7e79b2..3b7c3d5 100644
--- a/runtime-po/it.gmo
+++ b/runtime-po/it.gmo
Binary files differ
diff --git a/runtime-po/it.po b/runtime-po/it.po
index 2169260..cc048cc 100644
--- a/runtime-po/it.po
+++ b/runtime-po/it.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.4.3\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2010-10-25 07:35+0100\n"
 "Last-Translator: Vincenzo Campanella <vinz65@gmail.com>\n"
 "Language-Team: Italian <tp@lists.linux.it>\n"
@@ -21,54 +21,54 @@
 "First-Translator: Paolo Bonzini <bonzini@gnu.org>\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "errore di sintassi: impossibile tornare indietro"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "la sintassi è ambigua"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "errore di sintassi"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "errore di sintassi, %s non atteso"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "errore di sintassi, ricevuto %s anziché %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "errore di sintassi, ricevuto %s anziché %s o %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "errore di sintassi, ricevuto %s anziché %s, %s o %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "errore di sintassi, ricevuto %s anziché %s, %s, %s o %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "memoria esaurita"
diff --git a/runtime-po/ja.gmo b/runtime-po/ja.gmo
index 710734e..f944e36 100644
--- a/runtime-po/ja.gmo
+++ b/runtime-po/ja.gmo
Binary files differ
diff --git a/runtime-po/ja.po b/runtime-po/ja.po
index c65dc2a..9675cb4 100644
--- a/runtime-po/ja.po
+++ b/runtime-po/ja.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.4\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2010-01-10 14:26+0900\n"
 "Last-Translator: Yasuaki Taniguchi <yasuakit@gmail.com>\n"
 "Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
@@ -18,55 +18,55 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "構文エラー: バックアップすることができません"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "構文が曖昧です"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "構文エラー"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "構文エラー、予期しない %s です"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "構文エラー、予期しない %s です。予期されるのは %s です"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "構文エラー、予期しない %s です。予期されるのは %s または %s です"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "構文エラー、 予期しない %s です。予期されるのは %s、%s または %s です"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr ""
 "構文エラー、予期しない %s です。予期されるのは %s、%s、%s、または %s です。"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "メモリを使い果たしました"
diff --git a/runtime-po/ky.gmo b/runtime-po/ky.gmo
index 69cc72c..5b8384f 100644
--- a/runtime-po/ky.gmo
+++ b/runtime-po/ky.gmo
Binary files differ
diff --git a/runtime-po/ky.po b/runtime-po/ky.po
index 8312810..3c206f0 100644
--- a/runtime-po/ky.po
+++ b/runtime-po/ky.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.3a\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2008-01-29 11:47+0600\n"
 "Last-Translator: Ilyas Bakirov <just_ilyas@yahoo.com>\n"
 "Language-Team: Kirghiz <i18n-team-ky-kyrgyz@lists.sourceforge.net>\n"
@@ -19,54 +19,54 @@
 "X-Poedit-Language: Kyrgyz\n"
 "X-Poedit-Country: KYRGYZSTAN\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "синтаксис катасы: көчурмө алынган жок"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "синтаксис анык эмес"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "синтаксис катасы"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "синтаксис катасы, күтүлбөгөн %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "синтаксис катасы, күтүлбөгөн %s, %s күтүлүүдө"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "синтаксис катасы, күтүлбөгөн %s, %s же %s күтүлүүдө"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "синтаксис катасы, күтүлбөгөн %s, %s же %s же %s күтүлүүдө"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "синтаксис катасы, күтүлбөгөн %s, %s же %s же %s же %s күтүлүүдө"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "эс колдонулуп бүттүү"
diff --git a/runtime-po/lt.gmo b/runtime-po/lt.gmo
index 5c7d9ef..5c26c34 100644
--- a/runtime-po/lt.gmo
+++ b/runtime-po/lt.gmo
Binary files differ
diff --git a/runtime-po/lt.po b/runtime-po/lt.po
index 2276b91..380cc81 100644
--- a/runtime-po/lt.po
+++ b/runtime-po/lt.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime-2.3a\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2008-05-14 02:10+0300\n"
 "Last-Translator: Gintautas Miliauskas <gintas@akl.lt>\n"
 "Language-Team: Lithuanian <komp_lt@konferencijos.lt>\n"
@@ -20,54 +20,54 @@
 "Plural-Forms:  nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
 "%100<10 || n%100>=20) ? 1 : 2);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "sintaksės klaida: negalima grįžti"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "sintaksė dviprasmė"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "sintaksės klaida"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "sintaksės klaida, netikėtas %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "sintaksės klaida, netikėtas %s, tikėtasi %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "sintaksės klaida, netikėtas %s, tikėtasi %s arba %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "sintaksės klaida, netikėtas %s, tikėtasi %s arba %s arba %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "sintaksės klaida, netikėtas %s, tikėtasi %s arba %s arba %s arba %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "baigėsi atmintis"
diff --git a/runtime-po/lv.gmo b/runtime-po/lv.gmo
index 7efec29..c4596ee 100644
--- a/runtime-po/lv.gmo
+++ b/runtime-po/lv.gmo
Binary files differ
diff --git a/runtime-po/lv.po b/runtime-po/lv.po
index 553ba1a..c97cd2b 100644
--- a/runtime-po/lv.po
+++ b/runtime-po/lv.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime-2.4\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2009-07-28 21:28+0200\n"
 "Last-Translator: Rihards Priedītis <rprieditis@gmail.com>\n"
 "Language-Team: Latvian <translation-team-lv@lists.sourceforge.net>\n"
@@ -21,54 +21,54 @@
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : "
 "2);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "sintakses kļūda: nevar dublēt datus"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "sintakse ir divdomīga"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "sintakses kļūda"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "sintakses kļūda, negaidīts %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "sintakses kļūda, negaidīts %s, tika gaidīts %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "sintakses kļūda, negaidīts %s, tika gaidīts %s vai %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "sintakses kļūda, negaidīts %s, tika gaidīts %s vai %s, vai %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "sintakses kļūda, negaidīts %s, tika gaidīts %s vai %s, vai %s, vai %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "izsmelta atmiņa"
diff --git a/runtime-po/ms.gmo b/runtime-po/ms.gmo
index 2ea63a8..d5689c3 100644
--- a/runtime-po/ms.gmo
+++ b/runtime-po/ms.gmo
Binary files differ
diff --git a/runtime-po/ms.po b/runtime-po/ms.po
index 49132af..d3e3eb0 100644
--- a/runtime-po/ms.po
+++ b/runtime-po/ms.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.1\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2005-10-10 10:50+0800\n"
 "Last-Translator: Sharuzzaman Ahmat Raslan <sharuzzaman@myrealbox.com>\n"
 "Language-Team: Malay <translation-team-ms@lists.sourceforge.net>\n"
@@ -19,55 +19,55 @@
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: KBabel 0.9.5\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "ralat sintaks: tidak dapat mengundur"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "sintaks adalah kabur"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "ralat sintaks"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "ralat sintaks, tidak menjangka %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "ralat sintaks, tidak menjangka %s, menjangka %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "ralat sintaks, tidak menjangka %s, menjangka %s atau %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "ralat sintaks, tidak menjangka %s, menjangka %s atau %s atau %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr ""
 "ralat sintaks, tidak menjangka %s, menjangka %s atau %s atau %s atau %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "kehabisan memori"
diff --git a/runtime-po/nb.gmo b/runtime-po/nb.gmo
index b4aea36..57f5f0e 100644
--- a/runtime-po/nb.gmo
+++ b/runtime-po/nb.gmo
Binary files differ
diff --git a/runtime-po/nb.po b/runtime-po/nb.po
index 4b7c584..9590ca9 100644
--- a/runtime-po/nb.po
+++ b/runtime-po/nb.po
@@ -22,7 +22,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.1\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2005-09-21 09:35+0200\n"
 "Last-Translator: Trond Endrestøl <Trond.Endrestol@gtf.ol.no>\n"
 "Language-Team: Norwegian Bokmaal <i18n-nb@lister.ping.uio.no>\n"
@@ -33,54 +33,54 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "syntaksfeil: kan ikke gå tilbake"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "syntaksen er flertydig"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "syntaksfeil"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "syntaksfeil, uforventet %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "syntaksfeil, uforventet %s, forventet %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "syntaksfeil, uforventet %s, forventet %s eller %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "syntaksfeil, uforventet %s, forventet %s eller %s eller %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "syntaksfeil, uforventet %s, forventet %s eller %s eller %s eller %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "minne er uttømt"
diff --git a/runtime-po/nl.gmo b/runtime-po/nl.gmo
index c578158..39f7a60 100644
--- a/runtime-po/nl.gmo
+++ b/runtime-po/nl.gmo
Binary files differ
diff --git a/runtime-po/nl.po b/runtime-po/nl.po
index 2f2a150..8c95ab8 100644
--- a/runtime-po/nl.po
+++ b/runtime-po/nl.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.1\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2005-09-21 11:22+0200\n"
 "Last-Translator: Tim Van Holder <tim.van.holder@telenet.be>\n"
 "Language-Team: Dutch <vertaling@vrijschrift.org>\n"
@@ -18,54 +18,54 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "syntaxfout: kan niet terugkeren"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "syntax is niet eenduidig"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "syntaxfout"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "syntaxfout, %s onverwacht"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "syntaxfout, %s onverwacht (%s verwacht)"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "syntaxfout, %s onverwacht (%s of %s verwacht)"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "syntaxfout, %s onverwacht (%s of %s of %s verwacht)"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "syntaxfout, %s onverwacht (%s of %s of %s of %s verwacht)"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "geen geheugen meer beschikbaar"
diff --git a/runtime-po/pl.gmo b/runtime-po/pl.gmo
index 6afe8ca..28da36f 100644
--- a/runtime-po/pl.gmo
+++ b/runtime-po/pl.gmo
Binary files differ
diff --git a/runtime-po/pl.po b/runtime-po/pl.po
index 44303c0..8c1821d 100644
--- a/runtime-po/pl.po
+++ b/runtime-po/pl.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.4.1a\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2010-01-30 19:11+0100\n"
 "Last-Translator: Wojciech Polak <polak@gnu.org>\n"
 "Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
@@ -19,55 +19,55 @@
 "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
 "|| n%100>=20) ? 1 : 2);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "błąd składni: nie można cofnąć przesunięcia symbolu leksykalnego"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "składnia jest niejednoznaczna"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "błąd składni"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "błąd składni, niespodziewany symbol %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "błąd składni, niespodziewany symbol %s, oczekiwano %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "błąd składni, niespodziewany symbol %s, oczekiwano %s lub %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "błąd składni, niespodziewany %s, oczekiwano %s lub %s lub %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr ""
 "błąd składni, niespodziewany symbol %s, oczekiwano %s lub %s lub %s lub %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "pamięć wyczerpana"
diff --git a/runtime-po/pt.gmo b/runtime-po/pt.gmo
index dfee1ae..a2bc3ea 100644
--- a/runtime-po/pt.gmo
+++ b/runtime-po/pt.gmo
Binary files differ
diff --git a/runtime-po/pt.po b/runtime-po/pt.po
index aac6129..7e08339 100644
--- a/runtime-po/pt.po
+++ b/runtime-po/pt.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime-3.0.2\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2018-03-05 06:56+0000\n"
 "Last-Translator: Pedro Albuquerque <palbuquerque73@gmail.com>\n"
 "Language-Team: Portuguese <translation-team-pt@lists.sourceforge.net>\n"
@@ -19,54 +19,54 @@
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Gtranslator 2.91.6\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "erro de sintaxe: impossível recuar"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "sintaxe ambígua"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "erro de sintaxe"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "erro de sintaxe, %s inesperado"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "erro de sintaxe, %s inesperado, esperado %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "erro de sintaxe, %s inesperado, esperado %s ou %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "erro de sintaxe, %s inesperado, esperado %s ou %s ou %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "erro de sintaxe, %s inesperado, esperado %s ou %s ou %s ou %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "memória esgotada"
diff --git a/runtime-po/pt_BR.gmo b/runtime-po/pt_BR.gmo
index 0949fea..e3dfdff 100644
--- a/runtime-po/pt_BR.gmo
+++ b/runtime-po/pt_BR.gmo
Binary files differ
diff --git a/runtime-po/pt_BR.po b/runtime-po/pt_BR.po
index 0ac4586..a649315 100644
--- a/runtime-po/pt_BR.po
+++ b/runtime-po/pt_BR.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.3a\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2007-05-03 22:39-0300\n"
 "Last-Translator: Leslie Harlley Watter <leslie@watter.org>\n"
 "Language-Team: Brazilian Portuguese <ldp-br@bazar.conectiva.com.br>\n"
@@ -17,54 +17,54 @@
 "Content-Transfer-Encoding: 8bit\n"
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "erro de sintaxe: não é possível voltar"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "a sintaxe é ambígua"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "erro de sintaxe"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "erro de sintaxe, %s não esperado"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "erro de sintaxe, %s não esperado, esperando %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "erro de sintaxe, %s não esperado, esperando %s ou %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "erro de sintaxe, %s não esperado, esperando %s ou %s ou %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "erro de sintaxe, %s não esperado, esperando %s ou %s ou %s ou %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "falta de memória"
diff --git a/runtime-po/ro.gmo b/runtime-po/ro.gmo
index 1b4650f..bdddd08 100644
--- a/runtime-po/ro.gmo
+++ b/runtime-po/ro.gmo
Binary files differ
diff --git a/runtime-po/ro.po b/runtime-po/ro.po
index 9b33e35..1445980 100644
--- a/runtime-po/ro.po
+++ b/runtime-po/ro.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.1\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2005-09-20 12:00-0500\n"
 "Last-Translator: Laurentiu Buzdugan <lbuz@rolix.org>\n"
 "Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
@@ -21,54 +21,54 @@
 "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || ((n%100) > 0 && (n"
 "%100) < 20)) ? 1 : 2);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "eroare de sintaxã: nu pot da înapoi"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "sintaxa este ambiguã"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "eroare de sintaxã"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "eroare de sintaxã, %s neaºteptat"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "eroare de sintaxã, %s neaºteptat, aºtept %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "eroare de sintaxã, %s neaºteptat, aºtept %s sau %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "eroare de sintaxã, %s neaºteptat, aºtept %s sau %s sau %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "eroare de sintaxã, %s neaºteptat, aºtept %s sau %s sau %s sau %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "memorie epuizatã"
diff --git a/runtime-po/ru.gmo b/runtime-po/ru.gmo
index 342e9db..1c9da6e 100644
--- a/runtime-po/ru.gmo
+++ b/runtime-po/ru.gmo
Binary files differ
diff --git a/runtime-po/ru.po b/runtime-po/ru.po
index a50259e..02713ff 100644
--- a/runtime-po/ru.po
+++ b/runtime-po/ru.po
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.4\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2009-02-04 19:48+0200\n"
 "Last-Translator: Pavel Maryanov <acid_jack@ukr.net>\n"
 "Language-Team: Russian <gnu@mx.ru>\n"
@@ -21,55 +21,55 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "синтаксическая ошибка: не удалось создать резервную копию"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "неоднозначный синтаксис"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "синтаксическая ошибка"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "синтаксическая ошибка, непредвиденная %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "синтаксическая ошибка, непредвиденная %s, ожидается %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "синтаксическая ошибка, непредвиденная %s, ожидается %s или %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "синтаксическая ошибка, непредвиденная %s, ожидается %s или %s, или %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr ""
 "синтаксическая ошибка, непредвиденная %s, ожидается %s или %s, или %s, или %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "недостаточно памяти"
diff --git a/runtime-po/sl.gmo b/runtime-po/sl.gmo
index 3ed67f3..fbd9328 100644
--- a/runtime-po/sl.gmo
+++ b/runtime-po/sl.gmo
Binary files differ
diff --git a/runtime-po/sl.po b/runtime-po/sl.po
index 945de45..e146388 100644
--- a/runtime-po/sl.po
+++ b/runtime-po/sl.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.5\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2012-03-05 10:15+0100\n"
 "Last-Translator: Klemen Košir <klemen.kosir@gmx.com>\n"
 "Language-Team: Slovenian <translation-team-sl@lists.sourceforge.net>\n"
@@ -20,54 +20,54 @@
 "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n"
 "%100==4 ? 3 : 0);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "skladenjska napaka: vrnitev ni mogoča"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "dvoumna skladnja"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "skladenjska napaka"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "skladenjska napaka, nepričakovan %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "skladenjska napaka, nepričakovan %s, pričakuje se %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "skladenjska napaka, nepričakovan %s, pričakuje se %s ali %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "skladenjska napaka, nepričakovan %s, pričakuje se %s , %s ali %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "skladenjska napaka, nepričakovan %s, pričakuje se %s , %s , %s ali %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "zmanjkalo je pomnilnika"
diff --git a/runtime-po/sq.gmo b/runtime-po/sq.gmo
index c47a341..cdeb0aa 100644
--- a/runtime-po/sq.gmo
+++ b/runtime-po/sq.gmo
Binary files differ
diff --git a/runtime-po/sq.po b/runtime-po/sq.po
index ef1134f..b0d3d11 100644
--- a/runtime-po/sq.po
+++ b/runtime-po/sq.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.6.2\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2012-10-08 21:35+0500\n"
 "Last-Translator: Agron Selimaj <linuxmaster@verizon.net>\n"
 "Language-Team: Albanian <translation-team-sq@lists.sourceforge.net>\n"
@@ -18,54 +18,54 @@
 "Content-Transfer-Encoding: 8bit\n"
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "gabim sintaksor: nuk mund të ruaj një kopje"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "sintaksa është e ngjashme me të tjera"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "gabim sintaksor"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "gabim sintaksor, %s i papritur"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "gabim sintaksor, %s i papritur, pritet %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "gabim sintaksor, %s i papritur, pritet %s ose %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "gabim sintaksor, %s i papritur, pritet %s ose %s ose %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "gabim sintaksor, %s i papritur, pritet %s ose %s ose %s ose %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "nuk mbeti kujtesë më"
diff --git a/runtime-po/sr.gmo b/runtime-po/sr.gmo
index 235c9c4..3da5e74 100644
--- a/runtime-po/sr.gmo
+++ b/runtime-po/sr.gmo
Binary files differ
diff --git a/runtime-po/sr.po b/runtime-po/sr.po
index 3076c6d..763cca3 100644
--- a/runtime-po/sr.po
+++ b/runtime-po/sr.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime-2.5\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2011-12-20 11:07+0200\n"
 "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
 "Language-Team: Serbian <gnu@prevod.org>\n"
@@ -19,55 +19,55 @@
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 "X-Generator: Virtaal 0.7.0\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "грешка синтаксе: не могу да се вратим горе "
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "синтакса је нејасна"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "грешка синтаксе"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "грешка синтаксе, није очекивано %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "грешка синтаксе, није очекивано %s, очекивано је %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "грешка синтаксе, није очекивано %s, очекивано је %s или %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "грешка синтаксе, није очекивано %s, очекивано је %s или %s или %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr ""
 "грешка синтаксе, није очекивано %s, очекивано је %s или %s или %s или %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "меморија је потрошена"
diff --git a/runtime-po/sv.gmo b/runtime-po/sv.gmo
index 23654a8..d0588c7 100644
--- a/runtime-po/sv.gmo
+++ b/runtime-po/sv.gmo
Binary files differ
diff --git a/runtime-po/sv.po b/runtime-po/sv.po
index c6c69f2..a416c9c 100644
--- a/runtime-po/sv.po
+++ b/runtime-po/sv.po
@@ -1,16 +1,16 @@
 # Swedish messages for bison.
-# Copyright © 2001-2006, 2008, 2010, 2012, 2019 Free Software Foundation, Inc.
+# Copyright © 2001-2006, 2008, 2010, 2012, 2019, 2020 Free Software Foundation, Inc.
 # This file is distributed under the same license as the bison package.
-# Göran Uddeborg <goeran@uddeborg.se>, 2001-2006, 2008, 2010, 2012, 2019.
+# Göran Uddeborg <goeran@uddeborg.se>, 2001-2006, 2008, 2010, 2012, 2019, 2020.
 #
-# $Revision: 1.34 $
+# $Revision: 1.36 $
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: bison-runtime 3.3.90\n"
+"Project-Id-Version: bison-runtime 3.5.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
-"PO-Revision-Date: 2019-04-29 14:42+0200\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2020-04-21 20:59+0200\n"
 "Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
 "Language: sv\n"
@@ -20,54 +20,54 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "syntaxfel: kan inte backa"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "tvetydig syntax"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "syntaxfel"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "syntaxfel, oväntad %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "syntaxfel, oväntad %s, förväntade %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "syntaxfel, oväntad %s, förväntade %s eller %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "syntaxfel, oväntad %s, förväntade %s eller %s eller %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "syntaxfel, oväntad %s, förväntade %s eller %s eller %s eller %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "minnet slut"
diff --git a/runtime-po/ta.gmo b/runtime-po/ta.gmo
new file mode 100644
index 0000000..b76db2a
--- /dev/null
+++ b/runtime-po/ta.gmo
Binary files differ
diff --git a/runtime-po/ta.po b/runtime-po/ta.po
new file mode 100644
index 0000000..f1553b5
--- /dev/null
+++ b/runtime-po/ta.po
@@ -0,0 +1,71 @@
+# Tamil messages for GNU gettext.
+# Copyright (C) 2020 Free Software Foundation, Inc.
+# This file is distributed under the same license as the bison package.
+# List of contributors follow:
+# Arun Isaac <arunisaac@systemreboot.net>, 2020
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: bison-runtime 3.3.90\n"
+"Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
+"PO-Revision-Date: 2020-03-29 02:10+0530\n"
+"Last-Translator: Arun Isaac <arunisaac@systemreboot.net>\n"
+"Language-Team: Tamil <tamil@systemreboot.net>\n"
+"Language: ta\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
+msgid "syntax error: cannot back up"
+msgstr "தொடரமைப்பு பிழை: பின் வாங்க முடியாது"
+
+#: data/skeletons/glr.c:1832
+msgid "syntax is ambiguous"
+msgstr "தொடரமைப்பு தெளிவற்றது"
+
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
+msgid "syntax error"
+msgstr "தொடரமைப்பு பிழை"
+
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
+#, c-format
+msgid "syntax error, unexpected %s"
+msgstr "தொடரமைப்பு பிழை, எதிர்பாரா %s"
+
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
+#, c-format
+msgid "syntax error, unexpected %s, expecting %s"
+msgstr "தொடரமைப்பு பிழை, எதிர்பாரா %s, எதிர்பார்த்தது %s"
+
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
+#, c-format
+msgid "syntax error, unexpected %s, expecting %s or %s"
+msgstr "தொடரமைப்பு பிழை, எதிர்பாரா %s, எதிர்பார்த்தது %s அல்லது %s"
+
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
+#, c-format
+msgid "syntax error, unexpected %s, expecting %s or %s or %s"
+msgstr "தொடரமைப்பு பிழை, எதிர்பாரா %s, எதிர்பார்த்தது %s அல்லது %s அல்லது %s"
+
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
+#, c-format
+msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
+msgstr "தொடரமைப்பு பிழை, எதிர்பாரா %s, எதிர்பார்த்தது %s அல்லது %s அல்லது %s அல்லது %s"
+
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
+msgid "memory exhausted"
+msgstr "நினைவகம் நிரம்பியது"
diff --git a/runtime-po/th.gmo b/runtime-po/th.gmo
index a1401e5..73ef2af 100644
--- a/runtime-po/th.gmo
+++ b/runtime-po/th.gmo
Binary files differ
diff --git a/runtime-po/th.po b/runtime-po/th.po
index 9d3f2f0..36948e9 100644
--- a/runtime-po/th.po
+++ b/runtime-po/th.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.4.2\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2010-03-23 01:30+0700\n"
 "Last-Translator: Seksan Poltree <seksan.poltree@gmail.com>\n"
 "Language-Team: Thai <translation-team-th@lists.sourceforge.net>\n"
@@ -21,54 +21,54 @@
 "X-Generator: Lokalize 1.0\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "ข้อผิดพลาดวากยสัมพันธ์: ไม่สามารถสำรองข้อมูล"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "วากยสัมพันธ์คลุมเครือไม่ชัดเจน"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "ข้อผิดพลาดวากยสัมพันธ์"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "ข้อผิดพลาดวากยสัมพันธ์, ไม่คาดว่าจะเป็น %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "ข้อผิดพลาดวากยสัมพันธ์, ไม่คาดว่าจะเป็น %s, คาดว่าจะเป็น %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "ข้อผิดพลาดวากยสัมพันธ์, ไม่คาดว่าจะเป็น %s, คาดว่าจะเป็น %s หรือ %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "ข้อผิดพลาดวากยสัมพันธ์, ไม่คาดว่าจะเป็น %s, คาดว่าจะเป็น %s หรือ %s หรือ %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "ข้อผิดพลาดวากยสัมพันธ์, ไม่คาดว่าจะเป็น %s, คาดว่าจะเป็น %s หรือ %s หรือ %s หรือ %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "หน่วยความจำถูกใช้จนหมดสิ้น"
diff --git a/runtime-po/tr.gmo b/runtime-po/tr.gmo
index 1ed8423..a4c65c0 100644
--- a/runtime-po/tr.gmo
+++ b/runtime-po/tr.gmo
Binary files differ
diff --git a/runtime-po/tr.po b/runtime-po/tr.po
index 05c52fc..fadfa20 100644
--- a/runtime-po/tr.po
+++ b/runtime-po/tr.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: GNU bison-runtime 2.7.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2013-06-05 12:16+0100\n"
 "Last-Translator: Volkan Gezer <vlkngzr@gmail.com>\n"
 "Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n"
@@ -21,54 +21,54 @@
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Lokalize 1.5\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "sözdizimi hatasý: yedeklenemiyor"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "sözdizimi belirsiz"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "sözdizimi hatasý"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "sözdizimi hatasý, beklenmeyen %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "sözdizimi hatasý, beklenmeyen %s, beklenen %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "sözdizimi hatasý, beklenmeyen %s, beklenen %s veya %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "sözdizimi hatasý, beklenmeyen %s, beklenen %s veya %s veya %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "sözdizimi hatasý, beklenmeyen %s, beklenen %s veya %s veya %s veya %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "bellek tükendi"
diff --git a/runtime-po/uk.gmo b/runtime-po/uk.gmo
index e9d286e..4adc008 100644
--- a/runtime-po/uk.gmo
+++ b/runtime-po/uk.gmo
Binary files differ
diff --git a/runtime-po/uk.po b/runtime-po/uk.po
index 3d22d0a..9fdeaf4 100644
--- a/runtime-po/uk.po
+++ b/runtime-po/uk.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.3a\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2007-07-13 20:35+0300\n"
 "Last-Translator: Maxim V. Dziumanenko <dziumanenko@gmail.com>\n"
 "Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n"
@@ -18,55 +18,55 @@
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "синтаксична помилка: не вдається зробити резервну копію"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "синтаксис неоднозначний"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "синтаксична помилка"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "синтаксична помилка, неочікуваний %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "синтаксична помилка, неочікуваний %s, очікувалось %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "синтаксична помилка, неочікуваний %s, очікувалось %s або %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "синтаксична помилка, неочікуваний %s, очікувалось %s, або %s, або %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr ""
 "синтаксична помилка, неочікуваний %s, очікувалось %s, або %s, або %s, або %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "пам'ять вичерпано'"
diff --git a/runtime-po/vi.gmo b/runtime-po/vi.gmo
index 12ab362..4bc0bce 100644
--- a/runtime-po/vi.gmo
+++ b/runtime-po/vi.gmo
Binary files differ
diff --git a/runtime-po/vi.po b/runtime-po/vi.po
index a2b7090..e90b096 100644
--- a/runtime-po/vi.po
+++ b/runtime-po/vi.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime-3.0\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2013-07-26 14:19+0700\n"
 "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
 "Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
@@ -24,54 +24,54 @@
 "X-Poedit-Language: Vietnamese\n"
 "X-Poedit-Country: VIET NAM\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "lỗi cú pháp: không thể sao lưu dự phòng"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "cú pháp chưa rõ ràng"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "lỗi cú pháp"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "lỗi cú pháp, gặp %s bất thường"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "lỗi cú pháp, gặp %s bất thường, cần %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "lỗi cú pháp, gặp %s bất thường, cần %s hoặc %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "lỗi cú pháp, gặp %s bất thường, cần %s hoặc %s hay %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "lỗi cú pháp, gặp %s bất thường, cần %s hoặc %s hoặc %s hay %s "
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "hết bộ nhớ"
diff --git a/runtime-po/zh_CN.gmo b/runtime-po/zh_CN.gmo
index f27efec..7f252b3 100644
--- a/runtime-po/zh_CN.gmo
+++ b/runtime-po/zh_CN.gmo
Binary files differ
diff --git a/runtime-po/zh_CN.po b/runtime-po/zh_CN.po
index 132d404..e8745ba 100644
--- a/runtime-po/zh_CN.po
+++ b/runtime-po/zh_CN.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 3.0.2\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2015-10-30 00:30-0400\n"
 "Last-Translator: Mingye Wang (Arthur2e5) <arthur200126@gmail.com>\n"
 "Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
@@ -20,54 +20,54 @@
 "X-Generator: Poedit 1.8.4\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "语法错误:无法回溯"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "语法含糊"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "语法错误"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "语法错误,非预期的 %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "语法错误,非预期的 %s,需要 %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "语法错误,非预期的 %s,需要 %s 或 %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "语法错误,非预期的 %s,需要 %s,%s 或 %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "语法错误,非预期的 %s,需要 %s,%s,%s 或 %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "内存耗尽"
diff --git a/runtime-po/zh_TW.gmo b/runtime-po/zh_TW.gmo
index 33fb739..23c9a25 100644
--- a/runtime-po/zh_TW.gmo
+++ b/runtime-po/zh_TW.gmo
Binary files differ
diff --git a/runtime-po/zh_TW.po b/runtime-po/zh_TW.po
index 4c1ea60..b511a95 100644
--- a/runtime-po/zh_TW.po
+++ b/runtime-po/zh_TW.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: bison-runtime 2.6.90\n"
 "Report-Msgid-Bugs-To: bug-bison@gnu.org\n"
-"POT-Creation-Date: 2019-12-11 07:43+0100\n"
+"POT-Creation-Date: 2021-09-25 07:43+0200\n"
 "PO-Revision-Date: 2013-02-12 23:31+0800\n"
 "Last-Translator: Wei-Lun Chao <bluebat@member.fsf.org>\n"
 "Language-Team: Chinese (traditional) <zh-l10n@linux.org.tw>\n"
@@ -18,54 +18,54 @@
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: data/skeletons/glr.c:884 data/skeletons/yacc.c:669
+#: data/skeletons/glr.c:930 data/skeletons/yacc.c:769
 msgid "syntax error: cannot back up"
 msgstr "語法錯誤:無法備份"
 
-#: data/skeletons/glr.c:1793
+#: data/skeletons/glr.c:1832
 msgid "syntax is ambiguous"
 msgstr "語法不明確"
 
-#: data/skeletons/glr.c:2079 data/skeletons/glr.c:2164
-#: data/skeletons/glr.c:2208 data/skeletons/glr.c:2446
-#: data/skeletons/lalr1.cc:1385 data/skeletons/lalr1.cc:1406
-#: data/skeletons/yacc.c:1250 data/skeletons/yacc.c:1762
-#: data/skeletons/yacc.c:1768
+#: data/skeletons/glr.c:2245 data/skeletons/glr.c:2271
+#: data/skeletons/glr.c:2324 data/skeletons/glr.c:2560
+#: data/skeletons/lalr1.cc:1054 data/skeletons/lalr1.cc:1555
+#: data/skeletons/yacc.c:1443 data/skeletons/yacc.c:2006
+#: data/skeletons/yacc.c:2010
 msgid "syntax error"
 msgstr "語法錯誤"
 
-#: data/skeletons/glr.c:2165 data/skeletons/lalr1.cc:1386
-#: data/skeletons/yacc.c:1251
+#: data/skeletons/glr.c:2272 data/skeletons/lalr1.cc:1556
+#: data/skeletons/yacc.c:1444
 #, c-format
 msgid "syntax error, unexpected %s"
 msgstr "語法錯誤,預期之外的 %s"
 
-#: data/skeletons/glr.c:2166 data/skeletons/lalr1.cc:1387
-#: data/skeletons/yacc.c:1252
+#: data/skeletons/glr.c:2273 data/skeletons/lalr1.cc:1557
+#: data/skeletons/yacc.c:1445
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s"
 msgstr "語法錯誤,預期之外的 %s,預期為 %s"
 
-#: data/skeletons/glr.c:2167 data/skeletons/lalr1.cc:1388
-#: data/skeletons/yacc.c:1253
+#: data/skeletons/glr.c:2274 data/skeletons/lalr1.cc:1558
+#: data/skeletons/yacc.c:1446
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s"
 msgstr "語法錯誤,預期之外的 %s,預期為 %s 或 %s"
 
-#: data/skeletons/glr.c:2168 data/skeletons/lalr1.cc:1389
-#: data/skeletons/yacc.c:1254
+#: data/skeletons/glr.c:2275 data/skeletons/lalr1.cc:1559
+#: data/skeletons/yacc.c:1447
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s"
 msgstr "語法錯誤,預期之外的 %s,預期為 %s、%s 或 %s"
 
-#: data/skeletons/glr.c:2169 data/skeletons/lalr1.cc:1390
-#: data/skeletons/yacc.c:1255
+#: data/skeletons/glr.c:2276 data/skeletons/lalr1.cc:1560
+#: data/skeletons/yacc.c:1448
 #, c-format
 msgid "syntax error, unexpected %s, expecting %s or %s or %s or %s"
 msgstr "語法錯誤,預期之外的 %s,預期為 %s、%s、%s 或 %s"
 
-#: data/skeletons/glr.c:2505 data/skeletons/yacc.c:1335
-#: data/skeletons/yacc.c:1337 data/skeletons/yacc.c:1526
-#: data/skeletons/yacc.c:1918
+#: data/skeletons/glr.c:2619 data/skeletons/yacc.c:1516
+#: data/skeletons/yacc.c:1518 data/skeletons/yacc.c:1748
+#: data/skeletons/yacc.c:2158
 msgid "memory exhausted"
 msgstr "記憶體耗盡"
diff --git a/src/AnnotationList.c b/src/AnnotationList.c
index cc6dc4f..26184f9 100644
--- a/src/AnnotationList.c
+++ b/src/AnnotationList.c
@@ -1,6 +1,6 @@
 /* IELR's inadequacy annotation list.
 
-   Copyright (C) 2009-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,14 +15,16 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
-#include "system.h"
 
 #include "AnnotationList.h"
-#include "lalr.h"
+
+#include "system.h"
+
 #include "ielr.h"
+#include "lalr.h"
 
 /**
  * \pre
@@ -38,15 +40,14 @@
 AnnotationList__alloc_on_obstack (ContributionIndex contribution_count,
                                   struct obstack *annotations_obstackp)
 {
-  AnnotationList *result;
-  size_t contributions_size =
-    contribution_count * sizeof result->contributions[0];
-  result = obstack_alloc (annotations_obstackp,
-                          offsetof (AnnotationList, contributions)
-                          + contributions_size);
-  result->next = NULL;
-  result->inadequacyNode = NULL;
-  return result;
+  AnnotationList *res;
+  size_t contributions_size = contribution_count * sizeof res->contributions[0];
+  res = obstack_alloc (annotations_obstackp,
+                       offsetof (AnnotationList, contributions)
+                       + contributions_size);
+  res->next = NULL;
+  res->inadequacyNode = NULL;
+  return res;
 }
 
 /**
@@ -102,13 +103,12 @@
   for (node = list; *node; node = &(*node)->next)
     {
       int cmp = 0;
-      ContributionIndex ci;
       if (self->inadequacyNode->id < (*node)->inadequacyNode->id)
         cmp = 1;
       else if ((*node)->inadequacyNode->id < self->inadequacyNode->id)
         cmp = -1;
       else
-        for (ci = 0;
+        for (ContributionIndex ci = 0;
              cmp == 0 && ci < self->inadequacyNode->contributionCount;
              ++ci)
           {
@@ -120,19 +120,16 @@
             else if (AnnotationList__isContributionAlways (*node, ci))
               cmp = 1;
             else
-              {
-                size_t item;
-                for (item = 0; cmp == 0 && item < nitems; ++item)
-                  {
-                    if (!Sbitset__test (self->contributions[ci], item))
-                      {
-                        if (Sbitset__test ((*node)->contributions[ci], item))
-                          cmp = -1;
-                      }
-                    else if (!Sbitset__test ((*node)->contributions[ci], item))
-                      cmp = 1;
-                  }
-              }
+              for (size_t item = 0; cmp == 0 && item < nitems; ++item)
+                {
+                  if (!Sbitset__test (self->contributions[ci], item))
+                    {
+                      if (Sbitset__test ((*node)->contributions[ci], item))
+                        cmp = -1;
+                    }
+                  else if (!Sbitset__test ((*node)->contributions[ci], item))
+                    cmp = 1;
+                }
           }
       if (cmp < 0)
         {
@@ -172,10 +169,10 @@
   bitset_copy (tokens, shift_tokens);
   for (int i = 0; i < reds->num; ++i)
     {
-      bitset_and (conflicted_tokens_rule, tokens, reds->lookahead_tokens[i]);
+      bitset_and (conflicted_tokens_rule, tokens, reds->lookaheads[i]);
       bitset_or (conflicted_tokens,
                  conflicted_tokens, conflicted_tokens_rule);
-      bitset_or (tokens, tokens, reds->lookahead_tokens[i]);
+      bitset_or (tokens, tokens, reds->lookaheads[i]);
       /* Check that rules are sorted on rule number or the next step in
          AnnotationList__compute_from_inadequacies will misbehave.  */
       aver (i == 0 || reds->rules[i-1] < reds->rules[i]);
@@ -188,7 +185,7 @@
 }
 
 static bool
-AnnotationList__compute_lhs_contributions (state *s, rule *the_rule,
+AnnotationList__compute_lhs_contributions (state *s, const rule *the_rule,
                                            symbol_number conflicted_token,
                                            bitsetv follow_kernel_items,
                                            bitsetv always_follows,
@@ -232,115 +229,110 @@
       annotation_node->inadequacyNode = self->inadequacyNode;
       bool potential_contribution = false;
       bitset *lookaheads = NULL;
-      {
-        for (ContributionIndex ci = 0; ci < self->inadequacyNode->contributionCount; ++ci)
-          {
-            symbol_number contribution_token =
-              InadequacyList__getContributionToken (self->inadequacyNode, ci)
-                ->content->number;
-            if (AnnotationList__isContributionAlways (self, ci))
-              {
-                annotation_node->contributions[ci] = NULL;
-                continue;
-              }
-            annotation_node->contributions[ci] =
-              Sbitset__new_on_obstack ((*predecessor)->nitems,
-                                       annotations_obstackp);
+
+      for (ContributionIndex ci = 0; ci < self->inadequacyNode->contributionCount; ++ci)
+        {
+          symbol_number contribution_token =
+            InadequacyList__getContributionToken (self->inadequacyNode, ci)
+            ->content->number;
+          if (AnnotationList__isContributionAlways (self, ci))
             {
-              size_t predecessor_item = 0;
-              Sbitset sbiter_item;
-              Sbitset__Index self_item;
-              SBITSET__FOR_EACH (self->contributions[ci], s->nitems,
-                                 sbiter_item, self_item)
-                {
-                  /* If this kernel item is the beginning of a RHS, it must be
-                     the kernel item in the start state, and so it has an empty
-                     lookahead set.  Thus, it can't contribute to inadequacies,
-                     and so it should never have been identified as a
-                     contribution.  If, instead, this kernel item is the
-                     successor of the start state's kernel item, the lookahead
-                     set is still empty, and so it also should never have been
-                     identified as a contribution.  This situation is fortunate
-                     because we want to avoid the - 2 below in both cases.  */
-                  aver (s->items[self_item] > 1);
-                  /* If this kernel item is next to the beginning of the RHS,
-                     then check all of the predecessor's goto follows for the
-                     LHS.  */
-                  if (item_number_is_rule_number (ritem[s->items[self_item]
-                                                        - 2]))
-                    {
-                      int rulei;
-                      for (rulei = s->items[self_item];
-                           !item_number_is_rule_number (ritem[rulei]);
-                           ++rulei)
-                        continue;
-                      Sbitset items;
-                      if (AnnotationList__compute_lhs_contributions (
-                            *predecessor,
-                            &rules[item_number_as_rule_number (ritem[rulei])],
-                            contribution_token,
-                            follow_kernel_items, always_follows, predecessors,
-                            item_lookahead_sets, &items, annotations_obstackp))
-                        {
-                          obstack_free (annotations_obstackp,
-                                        annotation_node->contributions[ci]);
-                          annotation_node->contributions[ci] = NULL;
-                          break;
-                        }
-                      else
-                        {
-                          Sbitset__or (annotation_node->contributions[ci],
-                                       annotation_node->contributions[ci],
-                                       items, (*predecessor)->nitems);
-                          obstack_free (annotations_obstackp, items);
-                        }
-                    }
-                  /* If this kernel item is later in the RHS, then check the
-                     predecessor item's lookahead set.  */
-                  else
-                    {
-                      /* We don't have to start the predecessor item search at
-                         the beginning every time because items from both
-                         states are sorted by their indices in ritem.  */
-                      for (;
-                           predecessor_item < (*predecessor)->nitems;
-                           ++predecessor_item)
-                        if ((*predecessor)->items[predecessor_item]
-                            == s->items[self_item] - 1)
-                          break;
-                      aver (predecessor_item != (*predecessor)->nitems);
-                      if (ielr_item_has_lookahead (*predecessor, 0,
-                                                   predecessor_item,
-                                                   contribution_token,
-                                                   predecessors,
-                                                   item_lookahead_sets))
-                        Sbitset__set (annotation_node->contributions[ci],
-                                      predecessor_item);
-                    }
-                }
+              annotation_node->contributions[ci] = NULL;
+              continue;
             }
-            if (annotation_node->contributions[ci])
+          annotation_node->contributions[ci] =
+            Sbitset__new_on_obstack ((*predecessor)->nitems,
+                                     annotations_obstackp);
+          {
+            size_t predecessor_item = 0;
+            Sbitset sbiter_item;
+            Sbitset__Index self_item;
+            SBITSET__FOR_EACH (self->contributions[ci], s->nitems,
+                               sbiter_item, self_item)
               {
-                Sbitset biter;
-                Sbitset__Index i;
-                SBITSET__FOR_EACH (annotation_node->contributions[ci],
-                                   (*predecessor)->nitems, biter, i)
+                /* If this kernel item is the beginning of a RHS, it must be
+                   the kernel item in the start state, and so it has an empty
+                   lookahead set.  Thus, it can't contribute to inadequacies,
+                   and so it should never have been identified as a
+                   contribution.  If, instead, this kernel item is the
+                   successor of the start state's kernel item, the lookahead
+                   set is still empty, and so it also should never have been
+                   identified as a contribution.  This situation is fortunate
+                   because we want to avoid the - 2 below in both cases.  */
+                aver (s->items[self_item] > 1);
+                /* If this kernel item is next to the beginning of the RHS,
+                   then check all of the predecessor's goto follows for the
+                   LHS.  */
+                if (item_number_is_rule_number (ritem[s->items[self_item] - 2]))
                   {
-                    potential_contribution = true;
-                    if (!lookaheads)
+                    Sbitset items;
+                    if (AnnotationList__compute_lhs_contributions (
+                          *predecessor,
+                          item_rule (&ritem[s->items[self_item]]),
+                          contribution_token,
+                          follow_kernel_items, always_follows, predecessors,
+                          item_lookahead_sets, &items, annotations_obstackp))
                       {
-                        lookaheads = xnmalloc ((*predecessor)->nitems,
-                                               sizeof *lookaheads);
-                        for (size_t j = 0; j < (*predecessor)->nitems; ++j)
-                          lookaheads[j] = NULL;
+                        obstack_free (annotations_obstackp,
+                                      annotation_node->contributions[ci]);
+                        annotation_node->contributions[ci] = NULL;
+                        // "Break" out of SBITSET__FOR_EACH.
+                        goto after_sbitset__for_each;
                       }
-                    if (!lookaheads[i])
-                      lookaheads[i] = bitset_create (ntokens, BITSET_FIXED);
-                    bitset_set (lookaheads[i], contribution_token);
+                    else
+                      {
+                        Sbitset__or (annotation_node->contributions[ci],
+                                     annotation_node->contributions[ci],
+                                     items, (*predecessor)->nitems);
+                        obstack_free (annotations_obstackp, items);
+                      }
+                  }
+                /* If this kernel item is later in the RHS, then check the
+                   predecessor item's lookahead set.  */
+                else
+                  {
+                    /* We don't have to start the predecessor item search at
+                       the beginning every time because items from both
+                       states are sorted by their indices in ritem.  */
+                    for (;
+                         predecessor_item < (*predecessor)->nitems;
+                         ++predecessor_item)
+                      if ((*predecessor)->items[predecessor_item]
+                          == s->items[self_item] - 1)
+                        break;
+                    aver (predecessor_item != (*predecessor)->nitems);
+                    if (ielr_item_has_lookahead (*predecessor, 0,
+                                                 predecessor_item,
+                                                 contribution_token,
+                                                 predecessors,
+                                                 item_lookahead_sets))
+                      Sbitset__set (annotation_node->contributions[ci],
+                                    predecessor_item);
                   }
               }
+          after_sbitset__for_each:;
           }
-      }
+          if (annotation_node->contributions[ci])
+            {
+              Sbitset biter;
+              Sbitset__Index i;
+              SBITSET__FOR_EACH (annotation_node->contributions[ci],
+                                 (*predecessor)->nitems, biter, i)
+                {
+                  potential_contribution = true;
+                  if (!lookaheads)
+                    {
+                      lookaheads = xnmalloc ((*predecessor)->nitems,
+                                             sizeof *lookaheads);
+                      for (size_t j = 0; j < (*predecessor)->nitems; ++j)
+                        lookaheads[j] = NULL;
+                    }
+                  if (!lookaheads[i])
+                    lookaheads[i] = bitset_create (ntokens, BITSET_FIXED);
+                  bitset_set (lookaheads[i], contribution_token);
+                }
+            }
+        }
 
       /* If the predecessor has any contributions besides just "always" and
          "never" contributions:
@@ -409,7 +401,7 @@
   struct obstack *annotations_obstackp,
   InadequacyListNodeCount *inadequacy_list_node_count)
 {
-  /* Return an empty list if s->lookahead_tokens = NULL.  */
+  /* Return an empty list if s->lookaheads = NULL.  */
   if (s->consistent)
     return;
 
@@ -425,16 +417,12 @@
   BITSET_FOR_EACH (biter_conflict, conflicted_tokens, conflicted_token, 0)
     {
       AnnotationList *annotation_node;
-      /* FIXME: Would a BITSET_FRUGAL or BITEST_SPARSE be more efficient?  Now
-         or convert it inside InadequacyList__new_conflict?  */
-      bitset actions = bitset_create (s->reductions->num + 1, BITSET_FIXED);
       ContributionIndex contribution_count = 0;
-      bool potential_contribution = false;
 
       /* Allocate the annotation node.  */
       {
         for (int rule_i = 0; rule_i < s->reductions->num; ++rule_i)
-          if (bitset_test (s->reductions->lookahead_tokens[rule_i],
+          if (bitset_test (s->reductions->lookaheads[rule_i],
                            conflicted_token))
             ++contribution_count;
         if (bitset_test (shift_tokens, conflicted_token))
@@ -444,6 +432,11 @@
                                             annotations_obstackp);
       }
 
+      /* FIXME: Would a BITSET_FRUGAL or BITEST_SPARSE be more efficient?  Now
+         or convert it inside InadequacyList__new_conflict?  */
+      bitset actions = bitset_create (s->reductions->num + 1, BITSET_FIXED);
+      bool potential_contribution = false;
+
       /* Add a contribution for each reduction that has conflicted_token as a
          lookahead.  */
       {
@@ -452,7 +445,7 @@
         for (int rule_i = 0; rule_i < s->reductions->num; ++rule_i)
           {
             rule *the_rule = s->reductions->rules[rule_i];
-            if (bitset_test (s->reductions->lookahead_tokens[rule_i],
+            if (bitset_test (s->reductions->lookaheads[rule_i],
                              conflicted_token))
               {
                 bitset_set (actions, rule_i);
@@ -464,11 +457,8 @@
                                                annotations_obstackp);
                     /* Catch item_i up to rule_i.  This works because both are
                        sorted on rule number.  */
-                    while (!item_number_is_rule_number (
-                             ritem[s->items[item_i]])
-                           || item_number_as_rule_number (
-                                ritem[s->items[item_i]])
-                              != the_rule->number)
+                    while (!item_number_is_rule_number (ritem[s->items[item_i]])
+                           || item_number_as_rule_number (ritem[s->items[item_i]]) != the_rule->number)
                       {
                         ++item_i;
                         aver (item_i < s->nitems);
@@ -571,44 +561,40 @@
   AnnotationIndex ai;
   for (a = self, ai = 0; a; a = a->next, ++ai)
     {
-      for (int j = 0; j < spaces; ++j)
-        putc (' ', stderr);
-      fprintf (stderr, "Annotation %d (manifesting state %d):\n",
+      fprintf (stderr, "%*sAnnotation %d (manifesting state %d):\n",
+               spaces, "",
                ai, a->inadequacyNode->manifestingState->number);
-      {
-        bitset_bindex rulei
-          = bitset_first (a->inadequacyNode->inadequacy.conflict.actions);
-        for (ContributionIndex ci = 0; ci < a->inadequacyNode->contributionCount; ++ci)
-          {
-            symbol_number token =
-              InadequacyList__getContributionToken (a->inadequacyNode, ci)
-                ->content->number;
-            for (int j = 0; j < spaces+2; ++j)
-              putc (' ', stderr);
-            if (ci == InadequacyList__getShiftContributionIndex (
-                        a->inadequacyNode))
-              fprintf (stderr, "Contributes shift of token %d.\n", token);
-            else
-              {
-                fprintf (stderr, "Contributes token %d", token);
-                aver (rulei != BITSET_BINDEX_MAX);
-                fprintf (stderr, " as lookahead, rule number %d",
-                         a->inadequacyNode->manifestingState
-                           ->reductions->rules[rulei]->number);
-                rulei =
-                  bitset_next (a->inadequacyNode->inadequacy.conflict.actions,
-                               rulei+1);
-                if (AnnotationList__isContributionAlways (a, ci))
-                  fprintf (stderr, " always.");
-                else
-                  {
-                    fprintf (stderr, ", items: ");
-                    Sbitset__fprint (a->contributions[ci], nitems, stderr);
-                  }
-                fprintf (stderr, "\n");
-              }
-          }
-      }
+      bitset_bindex rulei
+        = bitset_first (a->inadequacyNode->inadequacy.conflict.actions);
+      for (ContributionIndex ci = 0; ci < a->inadequacyNode->contributionCount; ++ci)
+        {
+          symbol_number token =
+            InadequacyList__getContributionToken (a->inadequacyNode, ci)
+            ->content->number;
+          fprintf (stderr, "%*s", spaces+2, "");
+          if (ci == InadequacyList__getShiftContributionIndex (
+                                                               a->inadequacyNode))
+            fprintf (stderr, "Contributes shift of token %d.\n", token);
+          else
+            {
+              fprintf (stderr, "Contributes token %d", token);
+              aver (rulei != BITSET_BINDEX_MAX);
+              fprintf (stderr, " as lookahead, rule number %d",
+                       a->inadequacyNode->manifestingState
+                       ->reductions->rules[rulei]->number);
+              rulei =
+                bitset_next (a->inadequacyNode->inadequacy.conflict.actions,
+                             rulei+1);
+              if (AnnotationList__isContributionAlways (a, ci))
+                fprintf (stderr, " always.");
+              else
+                {
+                  fprintf (stderr, ", items: ");
+                  Sbitset__fprint (a->contributions[ci], nitems, stderr);
+                }
+              fprintf (stderr, "\n");
+            }
+        }
     }
 }
 
@@ -775,8 +761,7 @@
   /* R/R conflict, so the reduction with the lowest rule number dominates.
      Fortunately, contributions are sorted by rule number.  */
   for (ContributionIndex ci = 0; ci < self->inadequacyNode->contributionCount; ++ci)
-    if (AnnotationList__stateMakesContribution (self, nitems, ci,
-                                                lookaheads))
+    if (AnnotationList__stateMakesContribution (self, nitems, ci, lookaheads))
       {
         if (require_split_stable
             && !AnnotationList__isContributionAlways (self, ci))
diff --git a/src/AnnotationList.h b/src/AnnotationList.h
index b0582fb..3c43ca9 100644
--- a/src/AnnotationList.h
+++ b/src/AnnotationList.h
@@ -1,6 +1,6 @@
 /* IELR's inadequacy annotation list.
 
-   Copyright (C) 2009-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,12 +15,13 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef ANNOTATION_LIST_H_
 # define ANNOTATION_LIST_H_
 
 # include <bitsetv.h>
+
 # include "Sbitset.h"
 # include "InadequacyList.h"
 # include "state.h"
diff --git a/src/InadequacyList.c b/src/InadequacyList.c
index 50e875b..c958f82 100644
--- a/src/InadequacyList.c
+++ b/src/InadequacyList.c
@@ -1,6 +1,6 @@
 /* IELR's inadequacy list.
 
-   Copyright (C) 2009-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,7 +15,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
diff --git a/src/InadequacyList.h b/src/InadequacyList.h
index bc27df7..98142d0 100644
--- a/src/InadequacyList.h
+++ b/src/InadequacyList.h
@@ -1,6 +1,6 @@
 /* IELR's inadequacy list.
 
-   Copyright (C) 2009-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,7 +15,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef INADEQUACY_LIST_H_
 # define INADEQUACY_LIST_H_
diff --git a/src/Sbitset.c b/src/Sbitset.c
index aaa6819..aa31885 100644
--- a/src/Sbitset.c
+++ b/src/Sbitset.c
@@ -1,6 +1,6 @@
 /* A simple, memory-efficient bitset implementation.
 
-   Copyright (C) 2009-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,7 +15,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
diff --git a/src/Sbitset.h b/src/Sbitset.h
index fc6347a..f6bd956 100644
--- a/src/Sbitset.h
+++ b/src/Sbitset.h
@@ -1,6 +1,6 @@
 /* A simple, memory-efficient bitset implementation.
 
-   Copyright (C) 2009-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,7 +15,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef SBITSET_H_
 # define SBITSET_H_
@@ -81,6 +81,8 @@
       *ptr_self = *ptr_other1 | *ptr_other2;                            \
   } while (0)
 
+/* ATTENTION: there are *two* loops here, "break" and "continue" will
+   not apply to the whole loop, just the inner one.  */
 # define SBITSET__FOR_EACH(SELF, NBITS, ITER, INDEX)                    \
   for ((ITER) = (SELF); (ITER) < (SELF) + Sbitset__nbytes (NBITS); ++(ITER)) \
     if (*(ITER) != 0)                                                   \
diff --git a/src/assoc.c b/src/assoc.c
index b0c4e09..8b883e2 100644
--- a/src/assoc.c
+++ b/src/assoc.c
@@ -1,6 +1,6 @@
 /* Associativity information.
 
-   Copyright (C) 2002, 2005-2006, 2008-2015, 2018-2019 Free Software
+   Copyright (C) 2002, 2005-2006, 2008-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
diff --git a/src/assoc.h b/src/assoc.h
index 680e2fb..1ae9d32 100644
--- a/src/assoc.h
+++ b/src/assoc.h
@@ -1,6 +1,6 @@
 /* Associativity information.
 
-   Copyright (C) 2002, 2006, 2008-2015, 2018-2019 Free Software
+   Copyright (C) 2002, 2006, 2008-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef ASSOC_H_
 # define ASSOC_H_
diff --git a/src/closure.c b/src/closure.c
index b5ed611..025f966 100644
--- a/src/closure.c
+++ b/src/closure.c
@@ -1,7 +1,7 @@
 /* Closures for Bison
 
    Copyright (C) 1984, 1989, 2000-2002, 2004-2005, 2007, 2009-2015,
-   2018-2019 Free Software Foundation, Inc.
+   2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
@@ -32,7 +32,7 @@
 #include "symtab.h"
 
 /* NITEMSET is the size of the array ITEMSET.  */
-item_number *itemset;
+item_index *itemset;
 size_t nitemset;
 
 /* RULESET contains a bit for each rule.  CLOSURE sets the bits for
@@ -54,16 +54,16 @@
 `-----------------*/
 
 static void
-closure_print (char const *title, item_number const *array, size_t size)
+closure_print (char const *title, item_index const *array, size_t size)
 {
   fprintf (stderr, "Closure: %s\n", title);
   for (size_t i = 0; i < size; ++i)
     {
       fprintf (stderr, "  %2d: .", array[i]);
       item_number *rp;
-      for (rp = &ritem[array[i]]; *rp >= 0; ++rp)
+      for (rp = &ritem[array[i]]; 0 <= *rp; ++rp)
         fprintf (stderr, " %s", symbols[*rp]->tag);
-      fprintf (stderr, "  (rule %d)\n", -*rp - 1);
+      fprintf (stderr, "  (rule %d)\n", item_number_as_rule_number (*rp));
     }
   fputs ("\n\n", stderr);
 }
@@ -104,21 +104,21 @@
   fprintf (stderr, "\n\n");
 }
 
-/*------------------------------------------------------------------.
-| Set FIRSTS to be an NVARS array of NVARS bitsets indicating which |
-| items can represent the beginning of the input corresponding to   |
-| which other items.                                                |
-|                                                                   |
-| For example, if some rule expands symbol 5 into the sequence of   |
-| symbols 8 3 20, the symbol 8 can be the beginning of the data for |
-| symbol 5, so the bit [8 - ntokens] in first[5 - ntokens] (= FIRST |
-| (5)) is set.                                                      |
-`------------------------------------------------------------------*/
+/*-------------------------------------------------------------------.
+| Set FIRSTS to be an NNTERMS array of NNTERMS bitsets indicating    |
+| which items can represent the beginning of the input corresponding |
+| to which other items.                                              |
+|                                                                    |
+| For example, if some rule expands symbol 5 into the sequence of    |
+| symbols 8 3 20, the symbol 8 can be the beginning of the data for  |
+| symbol 5, so the bit [8 - ntokens] in first[5 - ntokens] (= FIRST  |
+| (5)) is set.                                                       |
+`-------------------------------------------------------------------*/
 
 static void
 set_firsts (void)
 {
-  firsts = bitsetv_create (nvars, nvars, BITSET_FIXED);
+  firsts = bitsetv_create (nnterms, nnterms, BITSET_FIXED);
 
   for (symbol_number i = ntokens; i < nsyms; ++i)
     for (symbol_number j = 0; derives[i - ntokens][j]; ++j)
@@ -139,8 +139,8 @@
 }
 
 /*-------------------------------------------------------------------.
-| Set FDERIVES to an NVARS by NRULES matrix of bits indicating which |
-| rules can help derive the beginning of the data for each           |
+| Set FDERIVES to an NNTERMS by NRULES matrix of bits indicating     |
+| which rules can help derive the beginning of the data for each     |
 | nonterminal.                                                       |
 |                                                                    |
 | For example, if symbol 5 can be derived as the sequence of symbols |
@@ -151,7 +151,7 @@
 static void
 set_fderives (void)
 {
-  fderives = bitsetv_create (nvars, nrules, BITSET_FIXED);
+  fderives = bitsetv_create (nnterms, nrules, BITSET_FIXED);
 
   set_firsts ();
 
@@ -182,7 +182,7 @@
 
 
 void
-closure (item_number const *core, size_t n)
+closure (item_index const *core, size_t n)
 {
   if (trace_flag & trace_closure)
     closure_print ("input", core, n);
@@ -203,7 +203,7 @@
   bitset_iterator iter;
   BITSET_FOR_EACH (iter, ruleset, ruleno, 0)
     {
-      item_number itemno = rules[ruleno].rhs - ritem;
+      item_index itemno = rules[ruleno].rhs - ritem;
       while (c < n && core[c] < itemno)
         {
           itemset[nitemset] = core[c];
diff --git a/src/closure.h b/src/closure.h
index 99dee91..a928144 100644
--- a/src/closure.h
+++ b/src/closure.h
@@ -1,6 +1,6 @@
 /* Subroutines for bison
 
-   Copyright (C) 1984, 1989, 2000-2002, 2007, 2009-2015, 2018-2019 Free
+   Copyright (C) 1984, 1989, 2000-2002, 2007, 2009-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef CLOSURE_H_
 # define CLOSURE_H_
@@ -30,12 +30,12 @@
 void closure_new (int n);
 
 
-/* Given the kernel (aka core) of a state (a sorted vector of item numbers
+/* Given the kernel (aka core) of a state (a sorted vector of item indices
    ITEMS, of length N), set up RULESET and ITEMSET to indicate what
    rules could be run and which items could be accepted when those
    items are the active ones.  */
 
-void closure (item_number const *items, size_t n);
+void closure (item_index const *items, size_t n);
 
 
 /* Free ITEMSET, RULESET and internal data.  */
@@ -43,12 +43,12 @@
 void closure_free (void);
 
 
-/* ITEMSET is a sorted vector of item numbers; NITEMSET is its size
+/* ITEMSET is a sorted vector of item indices; NITEMSET is its size
    (actually, points to just beyond the end of the part of it that is
    significant).  CLOSURE places there the indices of all items which
    represent units of input that could arrive next.  */
 
-extern item_number *itemset;
+extern item_index *itemset;
 extern size_t nitemset;
 
 #endif /* !CLOSURE_H_ */
diff --git a/src/complain.c b/src/complain.c
index 7177a2b..357233e 100644
--- a/src/complain.c
+++ b/src/complain.c
@@ -1,6 +1,6 @@
 /* Declaration for error-reporting function for Bison.
 
-   Copyright (C) 2000-2002, 2004-2006, 2009-2015, 2018-2019 Free
+   Copyright (C) 2000-2002, 2004-2006, 2009-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Based on error.c and error.h,
    written by David MacKenzie <djm@gnu.ai.mit.edu>.  */
@@ -23,6 +23,7 @@
 #include "system.h"
 
 #include <argmatch.h>
+#include <c-ctype.h>
 #include <progname.h>
 #include <stdarg.h>
 #include <sys/stat.h>
@@ -34,6 +35,13 @@
 #include "getargs.h"
 #include "quote.h"
 
+// The URL of the manual page about diagnostics.  Use the per-node
+// manual, to avoid downloading repeatedly the whole manual over the
+// Internet.
+static const char *diagnostics_url
+  = "https://www.gnu.org/software/bison/manual/html_node/Diagnostics.html";
+
+
 err_status complaint_status = status_none;
 
 bool warnings_are_errors = false;
@@ -41,9 +49,9 @@
 /** Whether -Werror/-Wno-error was applied to a warning.  */
 typedef enum
   {
-    errority_unset = 0,     /** No explict status.  */
-    errority_disabled = 1,  /** Explictly disabled with -Wno-error=foo.  */
-    errority_enabled = 2    /** Explictly enabled with -Werror=foo. */
+    errority_unset = 0,     /** No explicit status.  */
+    errority_disabled = 1,  /** Explicitly disabled with -Wno-error=foo.  */
+    errority_enabled = 2    /** Explicitly enabled with -Werror=foo. */
   } errority;
 
 /** For each warning type, its errority.  */
@@ -95,6 +103,20 @@
     }
 }
 
+static void
+begin_hyperlink (FILE *out, const char *ref)
+{
+  if (out == stderr)
+    styled_ostream_set_hyperlink (errstream, ref, NULL);
+}
+
+static void
+end_hyperlink (FILE *out)
+{
+  if (out == stderr)
+    styled_ostream_set_hyperlink (errstream, NULL, NULL);
+}
+
 void
 flush (FILE *out)
 {
@@ -103,6 +125,23 @@
   fflush (out);
 }
 
+bool
+is_styled (FILE *out)
+{
+  if (out != stderr)
+    return false;
+  if (color_debug)
+    return true;
+#if HAVE_LIBTEXTSTYLE
+  return (color_mode == color_yes
+          || color_mode == color_html
+          || (color_mode == color_tty && isatty (STDERR_FILENO)));
+#else
+  return false;
+#endif
+}
+
+
 /*------------------------.
 | --warnings's handling.  |
 `------------------------*/
@@ -113,6 +152,7 @@
 {
   { "conflicts-sr",     N_("S/R conflicts (enabled by default)") },
   { "conflicts-rr",     N_("R/R conflicts (enabled by default)") },
+  { "counterexamples",  N_("generate conflict counterexamples") },
   { "dangling-alias",   N_("string aliases not attached to a symbol") },
   { "deprecated",       N_("obsolete constructs") },
   { "empty-rule",       N_("empty rules without %empty") },
@@ -120,7 +160,7 @@
   { "precedence",       N_("useless precedence and associativity") },
   { "yacc",             N_("incompatibilities with POSIX Yacc") },
   { "other",            N_("all other warnings (enabled by default)") },
-  { "all",              N_("all the warnings except 'dangling-alias' and 'yacc'") },
+  { "all",              N_("all the warnings except 'counterexamples', 'dangling-alias' and 'yacc'") },
   { "no-CATEGORY",      N_("turn off warnings in CATEGORY") },
   { "none",             N_("turn off all the warnings") },
   { "error[=CATEGORY]", N_("treat warnings as errors") },
@@ -129,18 +169,19 @@
 
 static const argmatch_warning_arg argmatch_warning_args[] =
 {
-  { "all",            Wall },
-  { "conflicts-rr",   Wconflicts_rr },
-  { "conflicts-sr",   Wconflicts_sr },
-  { "dangling-alias", Wdangling_alias },
-  { "deprecated",     Wdeprecated },
-  { "empty-rule",     Wempty_rule },
-  { "everything",     Weverything },
-  { "midrule-values", Wmidrule_values },
-  { "none",           Wnone },
-  { "other",          Wother },
-  { "precedence",     Wprecedence },
-  { "yacc",           Wyacc },
+  { "all",             Wall },
+  { "conflicts-rr",    Wconflicts_rr },
+  { "conflicts-sr",    Wconflicts_sr },
+  { "counterexamples", Wcounterexamples }, { "cex", Wcounterexamples }, // Show cex second.
+  { "dangling-alias",  Wdangling_alias },
+  { "deprecated",      Wdeprecated },
+  { "empty-rule",      Wempty_rule },
+  { "everything",      Weverything },
+  { "midrule-values",  Wmidrule_values },
+  { "none",            Wnone },
+  { "other",           Wother },
+  { "precedence",      Wprecedence },
+  { "yacc",            Wyacc },
   { NULL, Wnone }
 };
 
@@ -263,6 +304,20 @@
 }
 
 
+static void
+severity_print (severity s, FILE *out)
+{
+  if (s != severity_disabled)
+    {
+      const char* style = severity_style (s);
+      begin_use_class (style, out);
+      fprintf (out, "%s:", severity_prefix (s));
+      end_use_class (style, out);
+      fputc (' ', out);
+    }
+}
+
+
 /*-----------.
 | complain.  |
 `-----------*/
@@ -271,9 +326,7 @@
 complain_init_color (void)
 {
 #if HAVE_LIBTEXTSTYLE
-  if (color_mode == color_yes
-      || color_mode == color_html
-      || (color_mode == color_tty && isatty (STDERR_FILENO)))
+  if (is_styled (stderr))
     {
       style_file_prepare ("BISON_STYLE", "BISON_STYLEDIR", pkgdatadir (),
                           "bison-default.css");
@@ -395,9 +448,20 @@
         const char* style = severity_style (s);
         fputs (" [", out);
         begin_use_class (style, out);
-        fprintf (out, "-W%s%s",
-                 s == severity_error ? "error=" : "",
-                 argmatch_warning_argument (&w));
+        // E.g., "counterexamples".
+        const char *warning = argmatch_warning_argument (&w);
+        char ref[200];
+        snprintf (ref, sizeof ref,
+                  "%s#W%s", diagnostics_url, warning);
+        begin_hyperlink (out, ref);
+        ostream_printf (errstream,
+                        "-W%s%s",
+                        s == severity_error ? "error=" : "",
+                        warning);
+        end_hyperlink (out);
+        // Because we mix stdio with ostream I/O, we need to flush
+        // here for sake of color == debug.
+        flush (out);
         end_use_class (style, out);
         fputc (']', out);
         /* Display only the first match, the second is "-Wall".  */
@@ -409,7 +473,6 @@
  *
  * \param loc     the location, defaulting to the current file,
  *                or the program name.
- * \param indent  optional indentation for the error message.
  * \param flags   the category for this message.
  * \param sever   to decide the prefix to put before the message
  *                (e.g., "warning").
@@ -421,33 +484,21 @@
  */
 static
 void
-error_message (const location *loc, int *indent, warnings flags,
+error_message (const location *loc, warnings flags,
                severity sever, const char *message, va_list args)
 {
-  int pos = 0;
+  const char* style = flags & note ? "note" : severity_style (sever);
 
   if (loc)
-    pos += location_print (*loc, stderr);
+    location_print (*loc, stderr);
   else
-    pos += fprintf (stderr, "%s", grammar_file ? grammar_file : program_name);
-  pos += fprintf (stderr, ": ");
-
-  if (indent)
-    {
-      if (*indent)
-        sever = severity_disabled;
-      if (!*indent)
-        *indent = pos;
-      else if (*indent > pos)
-        fprintf (stderr, "%*s", *indent - pos, "");
-    }
-
-  const char* style = severity_style (sever);
+    fprintf (stderr, "%s", grammar_file ? grammar_file : program_name);
+  fprintf (stderr, ": ");
 
   if (sever != severity_disabled)
     {
       begin_use_class (style, stderr);
-      fprintf (stderr, "%s:", severity_prefix (sever));
+      fprintf (stderr, "%s:", flags & note ? _("note") : severity_prefix (sever));
       end_use_class (style, stderr);
       fputc (' ', stderr);
     }
@@ -458,34 +509,32 @@
   if (! (flags & silent) && sever != severity_disabled)
     warnings_print_categories (flags, stderr);
 
-  {
-    size_t l = strlen (message);
-    if (l < 2 || message[l - 2] != ':' || message[l - 1] != ' ')
-      {
-        putc ('\n', stderr);
-        flush (stderr);
-        if (loc && feature_flag & feature_caret && !(flags & no_caret))
-          location_caret (*loc, style, stderr);
-      }
-  }
+  size_t l = strlen (message);
+  if (l < 2 || message[l - 2] != ':' || message[l - 1] != ' ')
+    {
+      putc ('\n', stderr);
+      flush (stderr);
+      if (loc && !(flags & no_caret))
+        location_caret (*loc, style, stderr);
+    }
   flush (stderr);
 }
 
 /** Raise a complaint (fatal error, error or just warning).  */
 
 static void
-complains (const location *loc, int *indent, warnings flags,
+complains (const location *loc, warnings flags,
            const char *message, va_list args)
 {
-  severity s = warning_severity (flags);
   if ((flags & complaint) && complaint_status < status_complaint)
     complaint_status = status_complaint;
 
+  severity s = warning_severity (flags);
   if (severity_warning <= s)
     {
       if (severity_error <= s && ! complaint_status)
         complaint_status = status_warning_as_error;
-      error_message (loc, indent, flags, s, message, args);
+      error_message (loc, flags, s, message, args);
     }
 
   if (flags & fatal)
@@ -497,41 +546,39 @@
 {
   va_list args;
   va_start (args, message);
-  complains (loc, NULL, flags, message, args);
+  complains (loc, flags, message, args);
   va_end (args);
 }
 
 void
-complain_indent (location const *loc, warnings flags, int *indent,
-                 const char *message, ...)
+subcomplain (location const *loc, warnings flags, const char *message, ...)
 {
   va_list args;
   va_start (args, message);
-  complains (loc, indent, flags, message, args);
+  complains (loc, flags | note | silent, message, args);
   va_end (args);
 }
 
 void
-complain_args (location const *loc, warnings w, int *indent,
+complain_args (location const *loc, warnings w,
                int argc, char *argv[])
 {
   switch (argc)
   {
   case 1:
-    complain_indent (loc, w, indent, "%s", _(argv[0]));
+    complain (loc, w, "%s", _(argv[0]));
     break;
   case 2:
-    complain_indent (loc, w, indent, _(argv[0]), argv[1]);
+    complain (loc, w, _(argv[0]), argv[1]);
     break;
   case 3:
-    complain_indent (loc, w, indent, _(argv[0]), argv[1], argv[2]);
+    complain (loc, w, _(argv[0]), argv[1], argv[2]);
     break;
   case 4:
-    complain_indent (loc, w, indent, _(argv[0]), argv[1], argv[2], argv[3]);
+    complain (loc, w, _(argv[0]), argv[1], argv[2], argv[3]);
     break;
   case 5:
-    complain_indent (loc, w, indent, _(argv[0]), argv[1], argv[2], argv[3],
-                     argv[4]);
+    complain (loc, w, _(argv[0]), argv[1], argv[2], argv[3], argv[4]);
     break;
   default:
     complain (loc, fatal, "too many arguments for complains");
@@ -555,8 +602,7 @@
       complain (loc, Wdeprecated,
                 _("deprecated directive: %s, use %s"),
                 quote (old), quote_n (1, upd));
-      if (feature_flag & feature_caret)
-        location_caret_suggestion (*loc, upd, stderr);
+      location_caret_suggestion (*loc, upd, stderr);
       /* Register updates only if -Wdeprecated is enabled.  */
       fixits_register (loc, upd);
     }
@@ -566,13 +612,11 @@
 duplicate_directive (char const *directive,
                      location first, location second)
 {
-  int i = 0;
   if (feature_flag & feature_caret)
-    complain_indent (&second, Wother, &i, _("duplicate directive"));
+    complain (&second, Wother, _("duplicate directive"));
   else
-    complain_indent (&second, Wother, &i, _("duplicate directive: %s"), quote (directive));
-  i += SUB_INDENT;
-  complain_indent (&first, Wother, &i, _("previous declaration"));
+    complain (&second, Wother, _("duplicate directive: %s"), quote (directive));
+  subcomplain (&first, Wother, _("previous declaration"));
   fixits_register (&second, "");
 }
 
@@ -580,11 +624,57 @@
 duplicate_rule_directive (char const *directive,
                           location first, location second)
 {
-  int i = 0;
-  complain_indent (&second, complaint, &i,
-                   _("only one %s allowed per rule"), directive);
-  i += SUB_INDENT;
-  complain_indent (&first, complaint, &i,
-                   _("previous declaration"));
+  complain (&second, complaint, _("only one %s allowed per rule"), directive);
+  subcomplain (&first, complaint, _("previous declaration"));
   fixits_register (&second, "");
 }
+
+void
+syntax_error (location loc,
+              int argc, const char* argv[])
+{
+  if (complaint_status < status_complaint)
+    complaint_status = status_complaint;
+  assert (argc <= 5);
+  const char *format = NULL;
+  switch (argc)
+    {
+#define CASE(N, S)                          \
+      case N:                               \
+        format = S;                         \
+        break
+    default: /* Avoid compiler warnings. */
+      CASE (0, _("syntax error"));
+      CASE (1, _("unexpected %0$s"));
+      CASE (2, _("expected %1$s before %0$s"));
+      CASE (3, _("expected %1$s or %2$s before %0$s"));
+      CASE (4, _("expected %1$s or %2$s or %3$s before %0$s"));
+      CASE (5, _("expected %1$s or %2$s or %3$s or %4$s before %0$s"));
+#undef CASE
+    }
+  location_print (loc, stderr);
+  fputs (": ", stderr);
+  severity_print (severity_error, stderr);
+
+  while (*format)
+    if (format[0] == '%'
+        && c_isdigit (format[1])
+        && format[2] == '$'
+        && format[3] == 's'
+        && (format[1] - '0') < argc)
+      {
+        int i = format[1] - '0';
+        const char *style = i == 0 ? "unexpected" : "expected";
+        begin_use_class (style, stderr);
+        fputs (argv[i], stderr);
+        end_use_class (style, stderr);
+        format += 4;
+      }
+    else
+      {
+        fputc (*format, stderr);
+        ++format;
+      }
+  fputc ('\n', stderr);
+  location_caret (loc, "error", stderr);
+}
diff --git a/src/complain.h b/src/complain.h
index bc48d2f..fe92e7a 100644
--- a/src/complain.h
+++ b/src/complain.h
@@ -1,6 +1,6 @@
 /* Declaration for error-reporting function for Bison.
 
-   Copyright (C) 2000-2002, 2006, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2000-2002, 2006, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -14,15 +14,14 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef COMPLAIN_H_
 # define COMPLAIN_H_ 1
 
-# include "location.h"
+# include <attribute.h>
 
-/* Sub-messages indent. */
-# define SUB_INDENT (4)
+# include "location.h"
 
 /*---------------.
 | Error stream.  |
@@ -37,6 +36,8 @@
 /** Flush \a out.  */
 void flush (FILE *out);
 
+/** Whether there's styling on OUT.  */
+bool is_styled (FILE *out);
 
 /*-------------.
 | --warnings.  |
@@ -47,6 +48,7 @@
   {
     warning_conflicts_rr,
     warning_conflicts_sr,
+    warning_counterexamples,
     warning_dangling_alias,
     warning_deprecated,
     warning_empty_rule,
@@ -107,6 +109,7 @@
 
     Wconflicts_rr     = 1 << warning_conflicts_rr,
     Wconflicts_sr     = 1 << warning_conflicts_sr,
+    Wcounterexamples  = 1 << warning_counterexamples,
     Wdangling_alias   = 1 << warning_dangling_alias,
     Wdeprecated       = 1 << warning_deprecated,
     Wempty_rule       = 1 << warning_empty_rule,
@@ -119,10 +122,11 @@
     fatal             = 1 << 12, /**< All fatal errors.  */
     silent            = 1 << 13, /**< Do not display the warning type.  */
     no_caret          = 1 << 14, /**< Do not display caret location.  */
+    note              = 1 << 15, /**< Display as a note.  */
 
     /**< All above warnings.  */
     Weverything       = ~complaint & ~fatal & ~silent,
-    Wall              = Weverything & ~Wdangling_alias & ~Wyacc
+    Wall              = Weverything & ~Wcounterexamples & ~Wdangling_alias & ~Wyacc
   } warnings;
 
 /** Whether the warnings of \a flags are all unset.
@@ -134,16 +138,16 @@
 
 /** Make a complaint, with maybe a location.  */
 void complain (location const *loc, warnings flags, char const *message, ...)
-  __attribute__ ((__format__ (__printf__, 3, 4)));
+  ATTRIBUTE_FORMAT ((__printf__, 3, 4));
 
 /** Likewise, but with an \a argc/argv interface.  */
-void complain_args (location const *loc, warnings w, int *indent,
+void complain_args (location const *loc, warnings w,
                     int argc, char *arg[]);
 
-/** Make a complaint with location and some indentation.  */
-void complain_indent (location const *loc, warnings flags, int *indent,
-                      char const *message, ...)
-  __attribute__ ((__format__ (__printf__, 4, 5)));
+/** Make a subcomplain with location and note.  */
+void subcomplain (location const *loc, warnings flags,
+                  char const *message, ...)
+  ATTRIBUTE_FORMAT ((__printf__, 3, 4));
 
 
 /** GNU Bison extension not valid with POSIX Yacc.  */
@@ -161,6 +165,11 @@
 void duplicate_rule_directive (char const *directive,
                                location first, location second);
 
+/** Report a syntax error, where argv[0] is the unexpected
+    token, and argv[1...argc] are the expected ones.  */
+void syntax_error (location loc,
+                   int argc, const char* argv[]);
+
 /** Warnings treated as errors shouldn't stop the execution as regular
     errors should (because due to their nature, it is safe to go
     on). Thus, there are three possible execution statuses.  */
diff --git a/src/conflicts.c b/src/conflicts.c
index cfc729a..999dc9f 100644
--- a/src/conflicts.c
+++ b/src/conflicts.c
@@ -1,6 +1,6 @@
 /* Find and resolve or report lookahead conflicts for bison,
 
-   Copyright (C) 1984, 1989, 1992, 2000-2015, 2018-2019 Free Software
+   Copyright (C) 1984, 1989, 1992, 2000-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
@@ -25,6 +25,7 @@
 
 #include "complain.h"
 #include "conflicts.h"
+#include "counterexample.h"
 #include "files.h"
 #include "getargs.h"
 #include "gram.h"
@@ -48,6 +49,12 @@
 static bitset shift_set;
 static bitset lookahead_set;
 
+bool
+has_conflicts (const state *s)
+{
+  return conflicts[s->number];
+}
+
 
 
 enum conflict_resolution
@@ -219,7 +226,7 @@
 
 /*------------------------------------------------------------------.
 | Turn off the shift recorded for the specified token in the        |
-| specified state.  Used when we resolve a shift-reduce conflict in |
+| specified state.  Used when we resolve a shift/reduce conflict in |
 | favor of the reduction or as an error (%nonassoc).                |
 `------------------------------------------------------------------*/
 
@@ -238,19 +245,19 @@
 
 /*--------------------------------------------------------------------.
 | Turn off the reduce recorded for the specified token in the         |
-| specified lookahead set.  Used when we resolve a shift-reduce       |
+| specified lookahead set.  Used when we resolve a shift/reduce       |
 | conflict in favor of the shift or as an error (%nonassoc).          |
 `--------------------------------------------------------------------*/
 
 static void
-flush_reduce (bitset lookahead_tokens, int token)
+flush_reduce (bitset lookaheads, int token)
 {
-  bitset_reset (lookahead_tokens, token);
+  bitset_reset (lookaheads, token);
 }
 
 
 /*------------------------------------------------------------------.
-| Attempt to resolve shift-reduce conflict for one rule by means of |
+| Attempt to resolve shift/reduce conflict for one rule by means of |
 | precedence declarations.  It has already been checked that the    |
 | rule has a precedence.  A conflict is resolved by modifying the   |
 | shift or reduce tables so that there is no longer a conflict.     |
@@ -268,14 +275,14 @@
   /* Find the rule to reduce by to get precedence of reduction.  */
   rule *redrule = reds->rules[ruleno];
   int redprec = redrule->prec->prec;
-  bitset lookahead_tokens = reds->lookahead_tokens[ruleno];
+  bitset lookaheads = reds->lookaheads[ruleno];
 
   for (symbol_number i = 0; i < ntokens; ++i)
-    if (bitset_test (lookahead_tokens, i)
+    if (bitset_test (lookaheads, i)
         && bitset_test (lookahead_set, i)
         && symbols[i]->content->prec)
       {
-        /* Shift-reduce conflict occurs for token number i
+        /* Shift/reduce conflict occurs for token number i
            and it has a precedence.
            The precedence of shifting is that of token i.  */
         if (symbols[i]->content->prec < redprec)
@@ -288,7 +295,7 @@
           {
             register_precedence (i, redrule->prec->number);
             log_resolution (redrule, i, shift_resolution);
-            flush_reduce (lookahead_tokens, i);
+            flush_reduce (lookaheads, i);
           }
         else
           /* Matching precedence levels.
@@ -309,7 +316,7 @@
             case right_assoc:
               register_assoc (i, redrule->prec->number);
               log_resolution (redrule, i, right_resolution);
-              flush_reduce (lookahead_tokens, i);
+              flush_reduce (lookaheads, i);
               break;
 
             case left_assoc:
@@ -322,7 +329,7 @@
               register_assoc (i, redrule->prec->number);
               log_resolution (redrule, i, nonassoc_resolution);
               flush_shift (s, i);
-              flush_reduce (lookahead_tokens, i);
+              flush_reduce (lookaheads, i);
               /* Record an explicit error for this token.  */
               errors[(*nerrs)++] = symbols[i];
               break;
@@ -357,11 +364,12 @@
   }
 
   /* Loop over all rules which require lookahead in this state.  First
-     check for shift-reduce conflict, and try to resolve using
+     check for shift/reduce conflict, and try to resolve using
      precedence.  */
   for (int i = 0; i < reds->num; ++i)
-    if (reds->rules[i]->prec && reds->rules[i]->prec->prec
-        && !bitset_disjoint_p (reds->lookahead_tokens[i], lookahead_set))
+    if (reds->rules[i]->prec
+        && reds->rules[i]->prec->prec
+        && !bitset_disjoint_p (reds->lookaheads[i], lookahead_set))
       resolve_sr_conflict (s, i, errors, &nerrs);
 
   if (nerrs)
@@ -377,13 +385,13 @@
   /* Loop over all rules which require lookahead in this state.  Check
      for conflicts not resolved above.
 
-     reds->lookahead_tokens can be NULL if the LR type is LR(0).  */
-  if (reds->lookahead_tokens)
+     reds->lookaheads can be NULL if the LR type is LR(0).  */
+  if (reds->lookaheads)
     for (int i = 0; i < reds->num; ++i)
       {
-        if (!bitset_disjoint_p (reds->lookahead_tokens[i], lookahead_set))
+        if (!bitset_disjoint_p (reds->lookaheads[i], lookahead_set))
           conflicts[s->number] = true;
-        bitset_or (lookahead_set, lookahead_set, reds->lookahead_tokens[i]);
+        bitset_or (lookahead_set, lookahead_set, reds->lookaheads[i]);
       }
 }
 
@@ -452,7 +460,7 @@
   }
 
   for (int i = 0; i < reds->num; ++i)
-    bitset_or (lookahead_set, lookahead_set, reds->lookahead_tokens[i]);
+    bitset_or (lookahead_set, lookahead_set, reds->lookaheads[i]);
 
   bitset_and (lookahead_set, lookahead_set, shift_set);
 
@@ -491,7 +499,7 @@
     {
       int count = 0;
       for (int j = 0; j < reds->num; ++j)
-        count += bitset_test (reds->lookahead_tokens[j], i);
+        count += bitset_test (reds->lookaheads[j], i);
       if (2 <= count)
         res += count-1;
     }
@@ -526,7 +534,7 @@
   for (int i = 0; i < reds->num; ++i)
     if (reds->rules[i] == r)
       {
-        bitset lookaheads = reds->lookahead_tokens[i];
+        bitset lookaheads = reds->lookaheads[i];
         int j;
         FOR_EACH_SHIFT (trans, j)
           res += bitset_test (lookaheads, TRANSITION_SYMBOL (trans, j));
@@ -568,8 +576,8 @@
         if (reds->rules[j] != r)
           {
             bitset_and (lookaheads,
-                        reds->lookahead_tokens[i],
-                        reds->lookahead_tokens[j]);
+                        reds->lookaheads[i],
+                        reds->lookaheads[j]);
             res += bitset_count (lookaheads);
           }
   bitset_free (lookaheads);
@@ -624,12 +632,20 @@
   return count_sr_conflicts () + count_rr_conflicts ();
 }
 
-/*------------------------------.
-| Reporting per-rule conflicts. |
-`------------------------------*/
+static void
+report_counterexamples (void)
+{
+  for (state_number sn = 0; sn < nstates; ++sn)
+    if (conflicts[sn])
+      counterexample_report_state (states[sn], stderr, "");
+}
+
+/*------------------------------------------------.
+| Report per-rule %expect/%expect-rr mismatches.  |
+`------------------------------------------------*/
 
 static void
-rule_conflicts_print (void)
+report_rule_expectation_mismatches (void)
 {
   for (rule_number i = 0; i < nrules; i += 1)
     {
@@ -644,13 +660,13 @@
             complain (&r->location, complaint,
                       _("shift/reduce conflicts for rule %d:"
                         " %d found, %d expected"),
-                      r->user_number, sr, expected_sr);
+                      r->code, sr, expected_sr);
           int rr = count_rule_rr_conflicts (r);
           if (rr != expected_rr && (rr != 0 || expected_rr != -1))
             complain (&r->location, complaint,
                       _("reduce/reduce conflicts for rule %d:"
                         " %d found, %d expected"),
-                      r->user_number, rr, expected_rr);
+                      r->code, rr, expected_rr);
         }
     }
 }
@@ -662,7 +678,7 @@
 void
 conflicts_print (void)
 {
-  rule_conflicts_print ();
+  report_rule_expectation_mismatches ();
 
   if (! glr_parser && expected_rr_conflicts != -1)
     {
@@ -670,8 +686,10 @@
       expected_rr_conflicts = -1;
     }
 
-  /* Screams for factoring, but almost useless because of the
-     different strings to translate.  */
+  // The warning flags used to emit a diagnostic, if we did.
+  warnings unexpected_conflicts_warning = Wnone;
+  /* The following two blocks scream for factoring, but i18n support
+     would make it ugly.  */
   {
     int total = count_sr_conflicts ();
     /* If %expect is not used, but %expect-rr is, then expect 0 sr.  */
@@ -682,16 +700,23 @@
     if (expected != -1)
       {
         if (expected != total)
-          complain (NULL, complaint,
-                    _("shift/reduce conflicts: %d found, %d expected"),
-                    total, expected);
+          {
+            complain (NULL, complaint,
+                      _("shift/reduce conflicts: %d found, %d expected"),
+                      total, expected);
+            if (total)
+              unexpected_conflicts_warning = complaint;
+          }
       }
     else if (total)
-      complain (NULL, Wconflicts_sr,
-                ngettext ("%d shift/reduce conflict",
-                          "%d shift/reduce conflicts",
-                          total),
-                total);
+      {
+        complain (NULL, Wconflicts_sr,
+                  ngettext ("%d shift/reduce conflict",
+                            "%d shift/reduce conflicts",
+                            total),
+                  total);
+        unexpected_conflicts_warning = Wconflicts_sr;
+      }
   }
 
   {
@@ -704,17 +729,31 @@
     if (expected != -1)
       {
         if (expected != total)
-          complain (NULL, complaint,
-                    _("reduce/reduce conflicts: %d found, %d expected"),
-                    total, expected);
+          {
+            complain (NULL, complaint,
+                      _("reduce/reduce conflicts: %d found, %d expected"),
+                      total, expected);
+            if (total)
+              unexpected_conflicts_warning = complaint;
+          }
       }
     else if (total)
-      complain (NULL, Wconflicts_rr,
-                ngettext ("%d reduce/reduce conflict",
-                          "%d reduce/reduce conflicts",
-                          total),
-                total);
+      {
+        complain (NULL, Wconflicts_rr,
+                  ngettext ("%d reduce/reduce conflict",
+                            "%d reduce/reduce conflicts",
+                            total),
+                  total);
+        unexpected_conflicts_warning = Wconflicts_rr;
+      }
   }
+
+  if (warning_is_enabled (Wcounterexamples))
+    report_counterexamples ();
+  else if (unexpected_conflicts_warning != Wnone)
+    subcomplain (NULL, unexpected_conflicts_warning,
+                 _("rerun with option '-Wcounterexamples'"
+                   " to generate conflict counterexamples"));
 }
 
 void
diff --git a/src/conflicts.h b/src/conflicts.h
index c068e36..1dff0ba 100644
--- a/src/conflicts.h
+++ b/src/conflicts.h
@@ -1,6 +1,6 @@
 /* Find and resolve or report lookahead conflicts for bison,
 
-   Copyright (C) 2000-2002, 2004, 2007, 2009-2015, 2018-2019 Free
+   Copyright (C) 2000-2002, 2004, 2007, 2009-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef CONFLICTS_H_
 # define CONFLICTS_H_
@@ -41,6 +41,8 @@
 void conflicts_output (FILE *out);
 void conflicts_free (void);
 
+bool has_conflicts (const state *s);
+
 /* Were there conflicts? */
 extern int expected_sr_conflicts;
 extern int expected_rr_conflicts;
diff --git a/src/counterexample.c b/src/counterexample.c
new file mode 100644
index 0000000..ec427c1
--- /dev/null
+++ b/src/counterexample.c
@@ -0,0 +1,1400 @@
+/* Conflict counterexample generation
+
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "counterexample.h"
+
+#include "system.h"
+
+#include <errno.h>
+#include <gl_linked_list.h>
+#include <gl_rbtreehash_list.h>
+#include <hash.h>
+#include <mbswidth.h>
+#include <stdlib.h>
+#include <textstyle.h>
+#include <time.h>
+
+#include "closure.h"
+#include "complain.h"
+#include "derivation.h"
+#include "getargs.h"
+#include "gram.h"
+#include "lalr.h"
+#include "lssi.h"
+#include "nullable.h"
+#include "parse-simulation.h"
+
+
+#define TIME_LIMIT_ENFORCED true
+/** If set to false, only consider the states on the shortest
+ *  lookahead-sensitive path when constructing a unifying counterexample. */
+#define EXTENDED_SEARCH false
+
+/* costs for making various steps in a search */
+#define PRODUCTION_COST 50
+#define REDUCE_COST 1
+#define SHIFT_COST 1
+#define UNSHIFT_COST 1
+#define EXTENDED_COST 10000
+
+/** The time limit before printing an assurance message to the user to
+ *  indicate that the search is still running. */
+#define ASSURANCE_LIMIT 2.0
+
+/* The time limit before giving up looking for unifying counterexample. */
+static double time_limit = 5.0;
+
+#define CUMULATIVE_TIME_LIMIT 120.0
+
+// This is the fastest way to get the tail node from the gl_list API.
+static gl_list_node_t
+list_get_end (gl_list_t list)
+{
+  gl_list_node_t sentinel = gl_list_add_last (list, NULL);
+  gl_list_node_t res = gl_list_previous_node (list, sentinel);
+  gl_list_remove_node (list, sentinel);
+  return res;
+}
+
+typedef struct
+{
+  derivation *d1;
+  derivation *d2;
+  bool shift_reduce;
+  bool unifying;
+  bool timeout;
+} counterexample;
+
+static counterexample *
+new_counterexample (derivation *d1, derivation *d2,
+                    bool shift_reduce,
+                    bool u, bool t)
+{
+  counterexample *res = xmalloc (sizeof *res);
+  res->shift_reduce = shift_reduce;
+  if (shift_reduce)
+    {
+      // Display the shift first.
+      res->d1 = d2;
+      res->d2 = d1;
+    }
+  else
+    {
+      res->d1 = d1;
+      res->d2 = d2;
+    }
+  res->unifying = u;
+  res->timeout = t;
+  return res;
+}
+
+static void
+free_counterexample (counterexample *cex)
+{
+  derivation_free (cex->d1);
+  derivation_free (cex->d2);
+  free (cex);
+}
+
+static void
+counterexample_print (const counterexample *cex, FILE *out, const char *prefix)
+{
+  const bool flat = getenv ("YYFLAT");
+  const char *example1_label
+    = cex->unifying ? _("Example") : _("First example");
+  const char *example2_label
+    = cex->unifying ? _("Example") : _("Second example");
+  const char *deriv1_label
+    = cex->shift_reduce ? _("Shift derivation") : _("First reduce derivation");
+  const char *deriv2_label
+    = cex->shift_reduce ? _("Reduce derivation") : _("Second reduce derivation");
+  const int width =
+    max_int (max_int (mbswidth (example1_label, 0), mbswidth (example2_label, 0)),
+             max_int (mbswidth (deriv1_label, 0),   mbswidth (deriv2_label, 0)));
+  if (flat)
+    fprintf (out, "  %s%s%*s ", prefix,
+             example1_label, width - mbswidth (example1_label, 0), "");
+  else
+    fprintf (out, "  %s%s: ", prefix, example1_label);
+  derivation_print_leaves (cex->d1, out);
+  if (flat)
+    fprintf (out, "  %s%s%*s ", prefix,
+             deriv1_label, width - mbswidth (deriv1_label, 0), "");
+  else
+    fprintf (out, "  %s%s", prefix, deriv1_label);
+  derivation_print (cex->d1, out, prefix);
+
+  // If we output to the terminal (via stderr) and we have color
+  // support, display unifying examples a second time, as color allows
+  // to see the differences.
+  if (!cex->unifying || is_styled (stderr))
+    {
+      if (flat)
+        fprintf (out, "  %s%s%*s ", prefix,
+                 example2_label, width - mbswidth (example2_label, 0), "");
+      else
+        fprintf (out, "  %s%s: ", prefix, example2_label);
+      derivation_print_leaves (cex->d2, out);
+    }
+  if (flat)
+    fprintf (out, "  %s%s%*s ", prefix,
+             deriv2_label, width - mbswidth (deriv2_label, 0), "");
+  else
+    fprintf (out, "  %s%s", prefix, deriv2_label);
+  derivation_print (cex->d2, out, prefix);
+
+  if (out != stderr)
+    putc ('\n', out);
+}
+
+/*
+ *
+ * NON UNIFYING COUNTER EXAMPLES
+ *
+ */
+
+// Search node for BFS on state items
+struct si_bfs_node;
+typedef struct si_bfs_node
+{
+  state_item_number si;
+  struct si_bfs_node *parent;
+  int reference_count;
+} si_bfs_node;
+
+static si_bfs_node *
+si_bfs_new (state_item_number si, si_bfs_node *parent)
+{
+  si_bfs_node *res = xcalloc (1, sizeof *res);
+  res->si = si;
+  res->parent = parent;
+  res->reference_count = 1;
+  if (parent)
+    ++parent->reference_count;
+  return res;
+}
+
+static bool
+si_bfs_contains (const si_bfs_node *n, state_item_number sin)
+{
+  for (const si_bfs_node *search = n; search != NULL; search = search->parent)
+    if (search->si == sin)
+      return true;
+  return false;
+}
+
+static void
+si_bfs_free (si_bfs_node *n)
+{
+  if (n == NULL)
+    return;
+  --n->reference_count;
+  if (n->reference_count == 0)
+    {
+      si_bfs_free (n->parent);
+      free (n);
+    }
+}
+
+typedef gl_list_t si_bfs_node_list;
+
+/**
+ * start is a state_item such that conflict_sym is an element of FIRSTS of the
+ * nonterminal after the dot in start. Because of this, we should be able to
+ * find a production item starting with conflict_sym by only searching productions
+ * of the nonterminal and shifting over nullable nonterminals
+ *
+ * this returns the derivation of the productions that lead to conflict_sym
+ */
+static inline derivation_list
+expand_to_conflict (state_item_number start, symbol_number conflict_sym)
+{
+  si_bfs_node *init = si_bfs_new (start, NULL);
+
+  si_bfs_node_list queue
+    = gl_list_create (GL_LINKED_LIST, NULL, NULL,
+                      (gl_listelement_dispose_fn) si_bfs_free,
+                      true, 1, (const void **) &init);
+  si_bfs_node *node = NULL;
+  // breadth-first search for a path of productions to the conflict symbol
+  while (gl_list_size (queue) > 0)
+    {
+      node = (si_bfs_node *) gl_list_get_at (queue, 0);
+      state_item *silast = &state_items[node->si];
+      symbol_number sym = item_number_as_symbol_number (*silast->item);
+      if (sym == conflict_sym)
+        break;
+      if (ISVAR (sym))
+        {
+          // add each production to the search
+          bitset_iterator biter;
+          state_item_number sin;
+          bitset sib = silast->prods;
+          BITSET_FOR_EACH (biter, sib, sin, 0)
+            {
+              // ignore productions already in the path
+              if (si_bfs_contains (node, sin))
+                continue;
+              si_bfs_node *next = si_bfs_new (sin, node);
+              gl_list_add_last (queue, next);
+            }
+          // for nullable nonterminals, add its goto to the search
+          if (nullable[sym - ntokens])
+            {
+              si_bfs_node *next = si_bfs_new (silast->trans, node);
+              gl_list_add_last (queue, next);
+            }
+        }
+      gl_list_remove_at (queue, 0);
+    }
+  if (gl_list_size (queue) == 0)
+    {
+      gl_list_free (queue);
+      fputs ("Error expanding derivation\n", stderr);
+      abort ();
+    }
+
+  derivation *dinit = derivation_new_leaf (conflict_sym);
+  derivation_list result = derivation_list_new ();
+  derivation_list_append (result, dinit);
+  // iterate backwards through the generated path to create a derivation
+  // of the conflict symbol containing derivations of each production step.
+
+  for (si_bfs_node *n = node; n != NULL; n = n->parent)
+    {
+      state_item *si = &state_items[n->si];
+      item_number *pos = si->item;
+      if (SI_PRODUCTION (si))
+        {
+          item_number *i = NULL;
+          for (i = pos + 1; !item_number_is_rule_number (*i); ++i)
+            derivation_list_append (result, derivation_new_leaf (*i));
+          symbol_number lhs =
+            rules[item_number_as_rule_number (*i)].lhs->number;
+          derivation *deriv = derivation_new (lhs, result,
+                                              state_item_rule (si));
+          result = derivation_list_new ();
+          derivation_list_append (result, deriv);
+        }
+      else
+        {
+          symbol_number sym = item_number_as_symbol_number (*(pos - 1));
+          derivation *deriv = derivation_new_leaf (sym);
+          derivation_list_prepend (result, deriv);
+        }
+    }
+  gl_list_free (queue);
+  derivation_free ((derivation*)gl_list_get_at (result, 0));
+  gl_list_remove_at (result, 0);
+  return result;
+}
+
+/**
+ * Complete derivations for any pending productions in the given
+ * sequence of state-items. For example, the input could be a path
+ * of states that would give us the following input:
+ * Stmt ::= [lval ::= [VAR] '=' e ::=[ e::=['0'] '+' •
+ * So to complete the derivation of Stmt, we need an output like:
+ * Stmt ::= [lval ::= [VAR] '=' e ::=[ e::=['0'] '+' • e ] ';' ]
+ */
+static derivation *
+complete_diverging_example (symbol_number conflict_sym,
+                            state_item_list path, derivation_list derivs)
+{
+  // The idea is to transfer each pending symbol on the productions
+  // associated with the given StateItems to the resulting derivation.
+  derivation_list result = derivation_list_new ();
+  bool lookahead_required = false;
+  if (!derivs)
+    {
+      derivs = derivation_list_new ();
+      gl_list_add_last (result, derivation_dot ());
+      lookahead_required = true;
+    }
+
+  gl_list_node_t deriv = list_get_end (derivs);
+
+  // We go backwards through the path to create the derivation tree bottom-up.
+  // Effectively this loops through each production once, and generates a
+  // derivation of the left hand side by appending all of the rhs symbols.
+  // this becomes the derivation of the nonterminal after the dot in the
+  // next production, and all of the other symbols of the rule are added as normal.
+  for (gl_list_node_t state_node = list_get_end (path);
+       state_node != NULL;
+       state_node = gl_list_previous_node (path, state_node))
+    {
+      state_item *si = (state_item *) gl_list_node_value (path, state_node);
+      item_number *item = si->item;
+      item_number pos = *item;
+      // symbols after dot
+      if (gl_list_size (result) == 1 && !item_number_is_rule_number (pos)
+          && gl_list_get_at (result, 0) == derivation_dot ())
+        {
+          derivation_list_append (result,
+            derivation_new_leaf (item_number_as_symbol_number (pos)));
+          lookahead_required = false;
+        }
+      item_number *i = item;
+      // go through each symbol after the dot in the current rule, and
+      // add each symbol to its derivation.
+      for (state_item_number nsi = si - state_items;
+           !item_number_is_rule_number (*i);
+           ++i, nsi = state_items[nsi].trans)
+        {
+          // if the item is a reduction, we could skip to the wrong rule
+          // by starting at i + 1, so this continue is necessary
+          if (i == item)
+            continue;
+          symbol_number sym = item_number_as_symbol_number (*i);
+          if (!lookahead_required || sym == conflict_sym)
+            {
+              derivation_list_append (result, derivation_new_leaf (sym));
+              lookahead_required = false;
+              continue;
+            }
+          // Since PATH is a path to the conflict state-item,
+          // for a reduce conflict item, we will want to have a derivation
+          // that shows the conflict symbol from its lookahead set being used.
+          //
+          // Since reductions have the dot at the end of the item,
+          // this loop will be first executed on the last item in the path
+          // that's not a reduction. When that happens,
+          // the symbol after the dot should be a nonterminal,
+          // and we can look through successive nullable nonterminals
+          // for one with the conflict symbol in its first set.
+          if (bitset_test (FIRSTS (sym), conflict_sym))
+            {
+              lookahead_required = false;
+              derivation_list next_derivs =
+                expand_to_conflict (nsi, conflict_sym);
+              derivation *d = NULL;
+              for (gl_list_iterator_t it = gl_list_iterator (next_derivs);
+                   derivation_list_next (&it, &d);)
+                derivation_list_append (result, d);
+              i += gl_list_size (next_derivs) - 1;
+              derivation_list_free (next_derivs);
+            }
+          else if (nullable[sym - ntokens])
+            {
+              derivation *d = derivation_new_leaf (sym);
+              derivation_list_append (result, d);
+            }
+          else
+            {
+              // We found a path to the conflict item, and despite it
+              // having the conflict symbol in its lookahead, no example
+              // containing the symbol after the conflict item
+              // can be found.
+              derivation_list_append (result, derivation_new_leaf (1));
+              lookahead_required = false;
+            }
+        }
+      const rule *r = &rules[item_number_as_rule_number (*i)];
+      // add derivations for symbols before dot
+      for (i = item - 1; !item_number_is_rule_number (*i) && i >= ritem; i--)
+        {
+          gl_list_node_t p = gl_list_previous_node (path, state_node);
+          if (p)
+            state_node = p;
+          if (deriv)
+            {
+              const void *tmp_deriv = gl_list_node_value (derivs, deriv);
+              deriv = gl_list_previous_node (derivs, deriv);
+              derivation_list_prepend (result, (derivation*)tmp_deriv);
+            }
+          else
+            derivation_list_prepend (result, derivation_new_leaf (*i));
+        }
+      // completing the derivation
+      derivation *new_deriv = derivation_new (r->lhs->number, result, r);
+      result = derivation_list_new ();
+      derivation_list_append (result, new_deriv);
+    }
+  derivation *res = (derivation *) gl_list_get_at (result, 0);
+  derivation_retain (res);
+  derivation_list_free (result);
+  derivation_list_free (derivs);
+  return res;
+}
+
+/* Iterate backwards through the shifts of the path in the reduce
+   conflict, and find a path of shifts from the shift conflict that
+   goes through the same states. */
+static state_item_list
+nonunifying_shift_path (state_item_list reduce_path, state_item *shift_conflict)
+{
+  gl_list_node_t tmp = gl_list_add_last (reduce_path, NULL);
+  gl_list_node_t next_node = gl_list_previous_node (reduce_path, tmp);
+  gl_list_node_t node = gl_list_previous_node (reduce_path, next_node);
+  gl_list_remove_node (reduce_path, tmp);
+  state_item *si = shift_conflict;
+  state_item_list result =
+    gl_list_create_empty (GL_LINKED_LIST, NULL, NULL, NULL, true);
+  // FIXME: bool paths_merged;
+  for (; node != NULL; next_node = node,
+       node = gl_list_previous_node (reduce_path, node))
+    {
+      state_item *refsi =
+        (state_item *) gl_list_node_value (reduce_path, node);
+      state_item *nextrefsi =
+        (state_item *) gl_list_node_value (reduce_path, next_node);
+      if (nextrefsi == si)
+        {
+          gl_list_add_first (result, refsi);
+          si = refsi;
+          continue;
+        }
+      // skip reduction items
+      if (nextrefsi->item != refsi->item + 1 && refsi->item != ritem)
+        continue;
+
+      // bfs to find a shift to the right state
+      si_bfs_node *init = si_bfs_new (si - state_items, NULL);
+      si_bfs_node_list queue
+        = gl_list_create (GL_LINKED_LIST, NULL, NULL,
+                          (gl_listelement_dispose_fn) si_bfs_free,
+                          true, 1, (const void **) &init);
+      si_bfs_node *sis = NULL;
+      state_item *prevsi = NULL;
+      while (gl_list_size (queue) > 0)
+        {
+          sis = (si_bfs_node *) gl_list_get_at (queue, 0);
+          // if we end up in the start state, the shift couldn't be found.
+          if (sis->si == 0)
+            break;
+
+          state_item *search_si = &state_items[sis->si];
+          // if the current state-item is a production item,
+          // its reverse production items get added to the queue.
+          // Otherwise, look for a reverse transition to the target state.
+          bitset rsi = search_si->revs;
+          bitset_iterator biter;
+          state_item_number sin;
+          BITSET_FOR_EACH (biter, rsi, sin, 0)
+            {
+              prevsi = &state_items[sin];
+              if (SI_TRANSITION (search_si))
+                {
+                  if (prevsi->state == refsi->state)
+                    goto search_end;
+                }
+              else if (!si_bfs_contains (sis, sin))
+                {
+                  si_bfs_node *prevsis = si_bfs_new (sin, sis);
+                  gl_list_add_last (queue, prevsis);
+                }
+            }
+          gl_list_remove_at (queue, 0);
+        }
+    search_end:
+      // prepend path to shift we found
+      if (sis)
+        {
+          gl_list_node_t ln = gl_list_add_first (result, &state_items[sis->si]);
+          for (si_bfs_node *n = sis->parent; n; n = n->parent)
+            ln = gl_list_add_after (result, ln, &state_items[n->si]);
+
+        }
+      si = prevsi;
+      gl_list_free (queue);
+    }
+  if (trace_flag & trace_cex)
+    {
+      fputs ("SHIFT ITEM PATH:\n", stderr);
+      state_item *sip = NULL;
+      for (gl_list_iterator_t it = gl_list_iterator (result);
+           state_item_list_next (&it, &sip);
+           )
+        state_item_print (sip, stderr, "");
+    }
+  return result;
+}
+
+
+/**
+ * Construct a nonunifying counterexample from the shortest
+ * lookahead-sensitive path.
+ */
+static counterexample *
+example_from_path (bool shift_reduce,
+                   state_item_number itm2,
+                   state_item_list shortest_path, symbol_number next_sym)
+{
+  derivation *deriv1 =
+    complete_diverging_example (next_sym, shortest_path, NULL);
+  state_item_list path_2
+    = shift_reduce
+    ? nonunifying_shift_path (shortest_path, &state_items [itm2])
+    : shortest_path_from_start (itm2, next_sym);
+  derivation *deriv2 = complete_diverging_example (next_sym, path_2, NULL);
+  gl_list_free (path_2);
+  return new_counterexample (deriv1, deriv2, shift_reduce, false, true);
+}
+
+/*
+ *
+ * UNIFYING COUNTER EXAMPLES
+ *
+ */
+
+/* A search state keeps track of two parser simulations,
+ * one starting at each conflict. Complexity is a metric
+ * which sums different parser actions with varying weights.
+ */
+typedef struct
+{
+  parse_state *states[2];
+  int complexity;
+} search_state;
+
+static search_state *
+initial_search_state (state_item *conflict1, state_item *conflict2)
+{
+  search_state *res = xmalloc (sizeof *res);
+  res->states[0] = new_parse_state (conflict1);
+  res->states[1] = new_parse_state (conflict2);
+  parse_state_retain (res->states[0]);
+  parse_state_retain (res->states[1]);
+  res->complexity = 0;
+  return res;
+}
+
+static search_state *
+new_search_state (parse_state *ps1, parse_state *ps2, int complexity)
+{
+  search_state *res = xmalloc (sizeof *res);
+  res->states[0] = ps1;
+  res->states[1] = ps2;
+  parse_state_retain (res->states[0]);
+  parse_state_retain (res->states[1]);
+  res->complexity = complexity;
+  return res;
+}
+
+static search_state *
+copy_search_state (search_state *parent)
+{
+  search_state *res = xmalloc (sizeof *res);
+  *res = *parent;
+  parse_state_retain (res->states[0]);
+  parse_state_retain (res->states[1]);
+  return res;
+}
+
+static void
+search_state_free_children (search_state *ss)
+{
+  free_parse_state (ss->states[0]);
+  free_parse_state (ss->states[1]);
+}
+
+static void
+search_state_free (search_state *ss)
+{
+  if (ss == NULL)
+    return;
+  search_state_free_children (ss);
+  free (ss);
+}
+
+/* For debugging traces.  */
+static void
+search_state_print (search_state *ss)
+{
+  fputs ("CONFLICT 1 ", stderr);
+  print_parse_state (ss->states[0]);
+  fputs ("CONFLICT 2 ", stderr);
+  print_parse_state (ss->states[1]);
+  putc ('\n', stderr);
+}
+
+typedef gl_list_t search_state_list;
+
+static inline bool
+search_state_list_next (gl_list_iterator_t *it, search_state **ss)
+{
+  const void *p = NULL;
+  bool res = gl_list_iterator_next (it, &p, NULL);
+  if (res)
+    *ss = (search_state*) p;
+  else
+    gl_list_iterator_free (it);
+  return res;
+}
+
+/*
+ * When a search state is copied, this is used to
+ * directly set one of the parse states
+ */
+static inline void
+ss_set_parse_state (search_state *ss, int idx, parse_state *ps)
+{
+  free_parse_state (ss->states[idx]);
+  ss->states[idx] = ps;
+  parse_state_retain (ps);
+}
+
+/*
+ * Construct a nonunifying example from a search state
+ * which has its parse states unified at the beginning
+ * but not the end of the example.
+ */
+static counterexample *
+complete_diverging_examples (search_state *ss,
+                             symbol_number next_sym,
+                             bool shift_reduce)
+{
+  derivation *new_derivs[2];
+  for (int i = 0; i < 2; ++i)
+    {
+      state_item_list sitems;
+      derivation_list derivs;
+      parse_state_lists (ss->states[i], &sitems, &derivs);
+      new_derivs[i] = complete_diverging_example (next_sym, sitems, derivs);
+      gl_list_free (sitems);
+    }
+  return new_counterexample (new_derivs[0], new_derivs[1],
+                             shift_reduce, false, true);
+}
+
+/*
+ * Search states are stored in bundles with those that
+ * share the same complexity. This is so the priority
+ * queue takes less overhead.
+ */
+typedef struct
+{
+  search_state_list states;
+  int complexity;
+} search_state_bundle;
+
+static void
+ssb_free (search_state_bundle *ssb)
+{
+  gl_list_free (ssb->states);
+  free (ssb);
+}
+
+static size_t
+ssb_hasher (search_state_bundle *ssb)
+{
+  return ssb->complexity;
+}
+
+static int
+ssb_comp (const search_state_bundle *s1, const search_state_bundle *s2)
+{
+  return s1->complexity - s2->complexity;
+}
+
+static bool
+ssb_equals (const search_state_bundle *s1, const search_state_bundle *s2)
+{
+  return s1->complexity == s2->complexity;
+}
+
+typedef gl_list_t ssb_list;
+
+static size_t
+visited_hasher (const search_state *ss, size_t max)
+{
+  return (parse_state_hasher (ss->states[0], max)
+          + parse_state_hasher (ss->states[1], max)) % max;
+}
+
+static bool
+visited_comparator (const search_state *ss1, const search_state *ss2)
+{
+  return parse_state_comparator (ss1->states[0], ss2->states[0])
+    && parse_state_comparator (ss1->states[1], ss2->states[1]);
+}
+
+/* Priority queue for search states with minimal complexity. */
+static ssb_list ssb_queue;
+static Hash_table *visited;
+/* The set of parser states on the shortest lookahead-sensitive path. */
+static bitset scp_set = NULL;
+/* The set of parser states used for the conflict reduction rule. */
+static bitset rpp_set = NULL;
+
+static void
+ssb_append (search_state *ss)
+{
+  if (hash_lookup (visited, ss))
+    {
+      search_state_free (ss);
+      return;
+    }
+  hash_xinsert (visited, ss);
+  // if states are only referenced by the visited set,
+  // their contents should be freed as we only need
+  // the metadata necessary to compute a hash.
+  parse_state_free_contents_early (ss->states[0]);
+  parse_state_free_contents_early (ss->states[1]);
+  parse_state_retain (ss->states[0]);
+  parse_state_retain (ss->states[1]);
+  search_state_bundle *ssb = xmalloc (sizeof *ssb);
+  ssb->complexity = ss->complexity;
+  gl_list_node_t n = gl_list_search (ssb_queue, ssb);
+  if (!n)
+    {
+      ssb->states =
+        gl_list_create_empty (GL_LINKED_LIST, NULL, NULL,
+                              (gl_listelement_dispose_fn)search_state_free_children,
+                              true);
+      gl_sortedlist_add (ssb_queue, (gl_listelement_compar_fn) ssb_comp, ssb);
+    }
+  else
+    {
+      free (ssb);
+      ssb = (search_state_bundle *) gl_list_node_value (ssb_queue, n);
+    }
+  gl_list_add_last (ssb->states, ss);
+}
+
+/*
+ * The following functions perform various actions on parse states
+ * and assign complexities to the newly generated search states.
+ */
+static void
+production_step (search_state *ss, int parser_state)
+{
+  const state_item *other_si = parse_state_tail (ss->states[1 - parser_state]);
+  symbol_number other_sym = item_number_as_symbol_number (*other_si->item);
+  parse_state_list prods =
+    simulate_production (ss->states[parser_state], other_sym);
+  int complexity = ss->complexity + PRODUCTION_COST;
+
+  parse_state *ps = NULL;
+  for (gl_list_iterator_t it = gl_list_iterator (prods);
+       parse_state_list_next (&it, &ps);
+       )
+    {
+      search_state *copy = copy_search_state (ss);
+      ss_set_parse_state (copy, parser_state, ps);
+      copy->complexity = complexity;
+      ssb_append (copy);
+    }
+  gl_list_free (prods);
+}
+
+static inline int
+reduction_cost (const parse_state *ps)
+{
+  int shifts;
+  int productions;
+  parse_state_completed_steps (ps, &shifts, &productions);
+  return SHIFT_COST * shifts + PRODUCTION_COST * productions;
+}
+
+static search_state_list
+reduction_step (search_state *ss, const item_number *conflict_item,
+                int parser_state, int rule_len)
+{
+  (void) conflict_item; // FIXME: Unused
+  search_state_list result =
+    gl_list_create_empty (GL_LINKED_LIST, NULL, NULL, NULL, 1);
+
+  parse_state *ps = ss->states[parser_state];
+  const state_item *si = parse_state_tail (ps);
+  bitset symbol_set = si->lookahead;
+  parse_state *other = ss->states[1 - parser_state];
+  const state_item *other_si = parse_state_tail (other);
+  // if the other state can transition on a symbol,
+  // the reduction needs to have that symbol in its lookahead
+  if (item_number_is_symbol_number (*other_si->item))
+    {
+      symbol_number other_sym =
+        item_number_as_symbol_number (*other_si->item);
+      if (!intersect_symbol (other_sym, symbol_set))
+        return result;
+      symbol_set = bitset_create (nsyms, BITSET_FIXED);
+      bitset_set (symbol_set, other_sym);
+    }
+
+  // FIXME: search_state *new_root = copy_search_state (ss);
+  parse_state_list reduced =
+    simulate_reduction (ps, rule_len, symbol_set);
+  parse_state *reduced_ps = NULL;
+  for (gl_list_iterator_t it = gl_list_iterator (reduced);
+       parse_state_list_next (&it, &reduced_ps);
+       )
+    {
+      search_state *copy = copy_search_state (ss);
+      ss_set_parse_state (copy, parser_state, reduced_ps);
+      int r_cost = reduction_cost (reduced_ps);
+      copy->complexity += r_cost + PRODUCTION_COST + 2 * SHIFT_COST;
+      gl_list_add_last (result, copy);
+    }
+  gl_list_free (reduced);
+  if (symbol_set != si->lookahead)
+    bitset_free (symbol_set);
+  return result;
+}
+
+/**
+ * Attempt to prepend the given symbol to this search state, respecting
+ * the given subsequent next symbol on each path. If a reverse transition
+ * cannot be made on both states, possible reverse productions are prepended
+ */
+static void
+search_state_prepend (search_state *ss, symbol_number sym, bitset guide)
+{
+  (void) sym; // FIXME: Unused.
+  const state_item *si1src = parse_state_head (ss->states[0]);
+  const state_item *si2src = parse_state_head (ss->states[1]);
+
+  bool prod1 = SI_PRODUCTION (si1src);
+  // If one can make a reverse transition and the other can't, only apply
+  // the reverse productions that the other state can make in an attempt to
+  // make progress.
+  if (prod1 != SI_PRODUCTION (si2src))
+    {
+      int prod_state = prod1 ? 0 : 1;
+      parse_state_list prev = parser_prepend (ss->states[prod_state]);
+      parse_state *ps = NULL;
+      for (gl_list_iterator_t iter = gl_list_iterator (prev);
+           parse_state_list_next (&iter, &ps);
+           )
+        {
+          const state_item *psi = parse_state_head (ps);
+          bool guided = bitset_test (guide, psi->state->number);
+          if (!guided && !EXTENDED_SEARCH)
+            continue;
+
+          search_state *copy = copy_search_state (ss);
+          ss_set_parse_state (copy, prod_state, ps);
+          copy->complexity += PRODUCTION_COST;
+          if (!guided)
+            copy->complexity += EXTENDED_COST;
+          ssb_append (copy);
+        }
+      gl_list_free (prev);
+      return;
+    }
+  // The parse state heads are either both production items or both
+  // transition items. So all prepend options will either be
+  // reverse transitions or reverse productions
+  int complexity_cost = prod1 ? PRODUCTION_COST : UNSHIFT_COST;
+  complexity_cost *= 2;
+
+  parse_state_list prev1 = parser_prepend (ss->states[0]);
+  parse_state_list prev2 = parser_prepend (ss->states[1]);
+
+  // loop through each pair of possible prepend states and append search
+  // states for each pair where the parser states correspond to the same
+  // parsed input.
+  parse_state *ps1 = NULL;
+  for (gl_list_iterator_t iter1 = gl_list_iterator (prev1);
+       parse_state_list_next (&iter1, &ps1);
+       )
+    {
+      const state_item *psi1 = parse_state_head (ps1);
+      bool guided1 = bitset_test (guide, psi1->state->number);
+      if (!guided1 && !EXTENDED_SEARCH)
+        continue;
+
+      parse_state *ps2 = NULL;
+      for (gl_list_iterator_t iter2 = gl_list_iterator (prev2);
+           parse_state_list_next (&iter2, &ps2);
+           )
+        {
+          const state_item *psi2 = parse_state_head (ps2);
+
+          bool guided2 = bitset_test (guide, psi2->state->number);
+          if (!guided2 && !EXTENDED_SEARCH)
+            continue;
+          // Only consider prepend state items that share the same state.
+          if (psi1->state != psi2->state)
+            continue;
+
+          int complexity = ss->complexity;
+          if (prod1)
+            complexity += PRODUCTION_COST * 2;
+          else
+            complexity += UNSHIFT_COST * 2;
+          // penalty for not being along the guide path
+          if (!guided1 || !guided2)
+            complexity += EXTENDED_COST;
+          ssb_append (new_search_state (ps1, ps2, complexity));
+        }
+    }
+  gl_list_free (prev1);
+  gl_list_free (prev2);
+}
+
+/**
+ * Determine if the productions associated with the given parser items have
+ * the same prefix up to the dot.
+ */
+static bool
+have_common_prefix (const item_number *itm1, const item_number *itm2)
+{
+  int i = 0;
+  for (; !item_number_is_rule_number (itm1[i]); ++i)
+    if (itm1[i] != itm2[i])
+      return false;
+  return item_number_is_rule_number (itm2[i]);
+}
+
+/*
+ * The start and end locations of an item in ritem.
+ */
+static const item_number *
+item_rule_start (const item_number *item)
+{
+  const item_number *res = NULL;
+  for (res = item;
+       ritem < res && item_number_is_symbol_number (*(res - 1));
+       --res)
+    continue;
+  return res;
+}
+
+static const item_number *
+item_rule_end (const item_number *item)
+{
+  const item_number *res = NULL;
+  for (res = item; item_number_is_symbol_number (*res); ++res)
+    continue;
+  return res;
+}
+
+/*
+ * Perform the appropriate possible parser actions
+ * on a search state and add the results to the
+ * search state priority queue.
+ */
+static inline void
+generate_next_states (search_state *ss, state_item *conflict1,
+                      state_item *conflict2)
+{
+  // Compute the successor configurations.
+  parse_state *ps1 = ss->states[0];
+  parse_state *ps2 = ss->states[1];
+  const state_item *si1 = parse_state_tail (ps1);
+  const state_item *si2 = parse_state_tail (ps2);
+  bool si1reduce = item_number_is_rule_number (*si1->item);
+  bool si2reduce = item_number_is_rule_number (*si2->item);
+  if (!si1reduce && !si2reduce)
+    {
+      // Transition if both paths end at the same symbol
+      if (*si1->item == *si2->item)
+        {
+          int complexity = ss->complexity + 2 * SHIFT_COST;
+          parse_state_list trans1 = simulate_transition (ps1);
+          parse_state_list trans2 = simulate_transition (ps2);
+          parse_state *tps1 = NULL;
+          parse_state *tps2 = NULL;
+          for (gl_list_iterator_t it1 = gl_list_iterator (trans1);
+               parse_state_list_next (&it1, &tps1);
+               )
+            for (gl_list_iterator_t it2 = gl_list_iterator (trans2);
+                 parse_state_list_next (&it2, &tps2);
+                 )
+              ssb_append (new_search_state (tps1, tps2, complexity));
+          gl_list_free (trans1);
+          gl_list_free (trans2);
+        }
+
+      // Take production steps if possible.
+      production_step (ss, 0);
+      production_step (ss, 1);
+    }
+  // One of the states requires a reduction
+  else
+    {
+      const item_number *rhs1 = item_rule_start (si1->item);
+      const item_number *rhe1 = item_rule_end (si1->item);
+      int len1 = rhe1 - rhs1;
+      int size1 = parse_state_length (ps1);
+      bool ready1 = si1reduce && len1 < size1;
+
+      const item_number *rhs2 = item_rule_start (si2->item);
+      const item_number *rhe2 = item_rule_end (si2->item);
+      int len2 = rhe2 - rhs2;
+      int size2 = parse_state_length (ps2);
+      bool ready2 = si2reduce && len2 < size2;
+      // If there is a path ready for reduction without being
+      // prepended further, reduce.
+      if (ready1 && ready2)
+        {
+          search_state_list reduced1 = reduction_step (ss, conflict1->item, 0, len1);
+          gl_list_add_last (reduced1, ss);
+          search_state *red1 = NULL;
+          for (gl_list_iterator_t iter = gl_list_iterator (reduced1);
+               search_state_list_next (&iter, &red1);
+               )
+            {
+              search_state_list reduced2 =
+                reduction_step (red1, conflict2->item, 1, len2);
+              search_state *red2 = NULL;
+              for (gl_list_iterator_t iter2 = gl_list_iterator (reduced2);
+                   search_state_list_next (&iter2, &red2);
+                   )
+                ssb_append (red2);
+              // Avoid duplicates.
+              if (red1 != ss)
+                ssb_append (red1);
+              gl_list_free (reduced2);
+            }
+          gl_list_free (reduced1);
+        }
+      else if (ready1)
+        {
+          search_state_list reduced1 = reduction_step (ss, conflict1->item, 0, len1);
+          search_state *red1 = NULL;
+          for (gl_list_iterator_t iter = gl_list_iterator (reduced1);
+               search_state_list_next (&iter, &red1);
+               )
+            ssb_append (red1);
+          gl_list_free (reduced1);
+        }
+      else if (ready2)
+        {
+          search_state_list reduced2 = reduction_step (ss, conflict2->item, 1, len2);
+          search_state *red2 = NULL;
+          for (gl_list_iterator_t iter2 = gl_list_iterator (reduced2);
+               search_state_list_next (&iter2, &red2);
+               )
+            ssb_append (red2);
+          gl_list_free (reduced2);
+        }
+      /* Both states end with a reduction, yet they don't have enough symbols
+       * to reduce. This means symbols are missing from the beginning of the
+       * rule, so we must prepend */
+      else
+        {
+          const symbol_number sym
+            = si1reduce && !ready1
+            ? *(rhe1 - size1)
+            : *(rhe2 - size2);
+          search_state_prepend (ss, sym,
+                                parse_state_depth (ss->states[0]) >= 0
+                                ? rpp_set : scp_set);
+        }
+    }
+}
+
+/*
+ * Perform the actual counterexample search,
+ * keeps track of what stage of the search algorithm
+ * we are at and gives the appropriate counterexample
+ * type based off of time constraints.
+ */
+static counterexample *
+unifying_example (state_item_number itm1,
+                  state_item_number itm2,
+                  bool shift_reduce,
+                  state_item_list reduce_path, symbol_number next_sym)
+{
+  state_item *conflict1 = &state_items[itm1];
+  state_item *conflict2 = &state_items[itm2];
+  search_state *initial = initial_search_state (conflict1, conflict2);
+  ssb_queue = gl_list_create_empty (GL_RBTREEHASH_LIST,
+                                    (gl_listelement_equals_fn) ssb_equals,
+                                    (gl_listelement_hashcode_fn) ssb_hasher,
+                                    (gl_listelement_dispose_fn) ssb_free,
+                                    false);
+  visited =
+    hash_initialize (32, NULL, (Hash_hasher) visited_hasher,
+                     (Hash_comparator) visited_comparator,
+                     (Hash_data_freer) search_state_free);
+  ssb_append (initial);
+  time_t start = time (NULL);
+  bool assurance_printed = false;
+  search_state *stage3result = NULL;
+  counterexample *cex = NULL;
+  while (gl_list_size (ssb_queue) > 0)
+    {
+      const search_state_bundle *ssb = gl_list_get_at (ssb_queue, 0);
+
+      search_state *ss = NULL;
+      for (gl_list_iterator_t it = gl_list_iterator (ssb->states);
+           search_state_list_next (&it, &ss);
+           )
+        {
+          if (trace_flag & trace_cex)
+            search_state_print (ss);
+          // Stage 1/2 completing the rules containing the conflicts
+          parse_state *ps1 = ss->states[0];
+          parse_state *ps2 = ss->states[1];
+          if (parse_state_depth (ps1) < 0 && parse_state_depth (ps2) < 0)
+            {
+              // Stage 3: reduce and shift conflict items completed.
+              const state_item *si1src = parse_state_head (ps1);
+              const state_item *si2src = parse_state_head (ps2);
+              if (item_rule (si1src->item)->lhs == item_rule (si2src->item)->lhs
+                  && have_common_prefix (si1src->item, si2src->item))
+                {
+                  // Stage 4: both paths share a prefix
+                  derivation *d1 = parse_state_derivation (ps1);
+                  derivation *d2 = parse_state_derivation (ps2);
+                  if (parse_state_derivation_completed (ps1)
+                      && parse_state_derivation_completed (ps2))
+                    {
+                      // Once we have two derivations for the same symbol,
+                      // we've found a unifying counterexample.
+                      cex = new_counterexample (d1, d2, shift_reduce, true, false);
+                      derivation_retain (d1);
+                      derivation_retain (d2);
+                      goto cex_search_end;
+                    }
+                  if (!stage3result)
+                    stage3result = copy_search_state (ss);
+                }
+            }
+          if (TIME_LIMIT_ENFORCED)
+            {
+              double time_passed = difftime (time (NULL), start);
+              if (!assurance_printed && time_passed > ASSURANCE_LIMIT
+                  && stage3result)
+                {
+                  fputs ("Productions leading up to the conflict state found.  "
+                         "Still finding a possible unifying counterexample...",
+                         stderr);
+                  assurance_printed = true;
+                }
+              if (time_passed > time_limit)
+                {
+                  fprintf (stderr, "time limit exceeded: %f\n", time_passed);
+                  goto cex_search_end;
+                }
+            }
+          generate_next_states (ss, conflict1, conflict2);
+        }
+      gl_sortedlist_remove (ssb_queue,
+                            (gl_listelement_compar_fn) ssb_comp, ssb);
+    }
+cex_search_end:;
+  if (!cex)
+    {
+      // No unifying counterexamples
+      // If a search state from Stage 3 is available, use it
+      // to construct a more compact nonunifying counterexample.
+      if (stage3result)
+        cex = complete_diverging_examples (stage3result, next_sym, shift_reduce);
+      // Otherwise, construct a nonunifying counterexample that
+      // begins from the start state using the shortest
+      // lookahead-sensitive path to the reduce item.
+      else
+        cex = example_from_path (shift_reduce, itm2, reduce_path, next_sym);
+    }
+  gl_list_free (ssb_queue);
+  hash_free (visited);
+  if (stage3result)
+    search_state_free (stage3result);
+  return cex;
+}
+
+static time_t cumulative_time;
+
+void
+counterexample_init (void)
+{
+  /* Recognize $TIME_LIMIT.  Not a public feature, just to help
+     debugging.  If we need something public, a %define/-D/-F variable
+     would be more appropriate. */
+  {
+    const char *cp = getenv ("TIME_LIMIT");
+    if (cp)
+      {
+        char *end = NULL;
+        double v = strtod (cp, &end);
+        if (*end == '\0' && errno == 0)
+          time_limit = v;
+      }
+    }
+  time (&cumulative_time);
+  scp_set = bitset_create (nstates, BITSET_FIXED);
+  rpp_set = bitset_create (nstates, BITSET_FIXED);
+  state_items_init ();
+}
+
+
+void
+counterexample_free (void)
+{
+  if (scp_set)
+    {
+      bitset_free (scp_set);
+      bitset_free (rpp_set);
+      state_items_free ();
+    }
+}
+
+/**
+ * Report a counterexample for conflict on symbol next_sym
+ * between the given state-items
+ */
+static void
+counterexample_report (state_item_number itm1, state_item_number itm2,
+                       symbol_number next_sym, bool shift_reduce,
+                       FILE *out, const char *prefix)
+{
+  // Compute the shortest lookahead-sensitive path and associated sets of
+  // parser states.
+  state_item_list shortest_path = shortest_path_from_start (itm1, next_sym);
+  bool reduce_prod_reached = false;
+  const rule *reduce_rule = item_rule (state_items[itm1].item);
+
+  bitset_zero (scp_set);
+  bitset_zero (rpp_set);
+
+  state_item *si = NULL;
+  for (gl_list_iterator_t it = gl_list_iterator (shortest_path);
+       state_item_list_next (&it, &si);
+       )
+    {
+      bitset_set (scp_set, si->state->number);
+      reduce_prod_reached = reduce_prod_reached
+                          || item_rule (si->item) == reduce_rule;
+      if (reduce_prod_reached)
+        bitset_set (rpp_set, si->state->number);
+    }
+  time_t t = time (NULL);
+  counterexample *cex
+    = difftime (t, cumulative_time) < CUMULATIVE_TIME_LIMIT
+    ? unifying_example (itm1, itm2, shift_reduce, shortest_path, next_sym)
+    : example_from_path (shift_reduce, itm2, shortest_path, next_sym);
+
+  gl_list_free (shortest_path);
+  counterexample_print (cex, out, prefix);
+  free_counterexample (cex);
+}
+
+
+// ITM1 denotes a shift, ITM2 a reduce.
+static void
+counterexample_report_shift_reduce (state_item_number itm1, state_item_number itm2,
+                                    symbol_number next_sym,
+                                    FILE *out, const char *prefix)
+{
+  if (out == stderr)
+    complain (NULL, Wcounterexamples,
+              _("shift/reduce conflict on token %s"), symbols[next_sym]->tag);
+  else
+    {
+      fputs (prefix, out);
+      fprintf (out, _("shift/reduce conflict on token %s"), symbols[next_sym]->tag);
+      fprintf (out, "%s\n", _(":"));
+    }
+  // In the report, print the items.
+  if (out != stderr || trace_flag & trace_cex)
+    {
+      state_item_print (&state_items[itm1], out, prefix);
+      state_item_print (&state_items[itm2], out, prefix);
+    }
+  counterexample_report (itm1, itm2, next_sym, true, out, prefix);
+}
+
+static void
+counterexample_report_reduce_reduce (state_item_number itm1, state_item_number itm2,
+                                     bitset conflict_syms,
+                                     FILE *out, const char *prefix)
+{
+  {
+    struct obstack obstack;
+    obstack_init (&obstack);
+    bitset_iterator biter;
+    state_item_number sym;
+    const char *sep = "";
+    BITSET_FOR_EACH (biter, conflict_syms, sym, 0)
+      {
+        obstack_printf (&obstack, "%s%s", sep, symbols[sym]->tag);
+        sep = ", ";
+      }
+    char *tokens = obstack_finish0 (&obstack);
+    if (out == stderr)
+      complain (NULL, Wcounterexamples,
+                ngettext ("reduce/reduce conflict on token %s",
+                          "reduce/reduce conflict on tokens %s",
+                          bitset_count (conflict_syms)),
+                tokens);
+    else
+      {
+        fputs (prefix, out);
+        fprintf (out,
+                 ngettext ("reduce/reduce conflict on token %s",
+                           "reduce/reduce conflict on tokens %s",
+                           bitset_count (conflict_syms)),
+                 tokens);
+        fprintf (out, "%s\n", _(":"));
+      }
+    obstack_free (&obstack, NULL);
+  }
+  // In the report, print the items.
+  if (out != stderr || trace_flag & trace_cex)
+    {
+      state_item_print (&state_items[itm1], out, prefix);
+      state_item_print (&state_items[itm2], out, prefix);
+    }
+  counterexample_report (itm1, itm2, bitset_first (conflict_syms),
+                         false, out, prefix);
+}
+
+static state_item_number
+find_state_item_number (const rule *r, state_number sn)
+{
+  for (state_item_number i = state_item_map[sn]; i < state_item_map[sn + 1]; ++i)
+    if (!SI_DISABLED (i)
+        && item_number_as_rule_number (*state_items[i].item) == r->number)
+      return i;
+  abort ();
+}
+
+void
+counterexample_report_state (const state *s, FILE *out, const char *prefix)
+{
+  const state_number sn = s->number;
+  const reductions *reds = s->reductions;
+  bitset lookaheads = bitset_create (ntokens, BITSET_FIXED);
+  for (int i = 0; i < reds->num; ++i)
+    {
+      const rule *r1 = reds->rules[i];
+      const state_item_number c1 = find_state_item_number (r1, sn);
+      for (state_item_number c2 = state_item_map[sn]; c2 < state_item_map[sn + 1]; ++c2)
+        if (!SI_DISABLED (c2))
+          {
+            item_number conf = *state_items[c2].item;
+            if (item_number_is_symbol_number (conf)
+                && bitset_test (reds->lookaheads[i], conf))
+              counterexample_report_shift_reduce (c1, c2, conf, out, prefix);
+          }
+      for (int j = i+1; j < reds->num; ++j)
+        {
+          const rule *r2 = reds->rules[j];
+          // Conflicts: common lookaheads.
+          bitset_intersection (lookaheads,
+                               reds->lookaheads[i],
+                               reds->lookaheads[j]);
+          if (!bitset_empty_p (lookaheads))
+            for (state_item_number c2 = state_item_map[sn]; c2 < state_item_map[sn + 1]; ++c2)
+              if (!SI_DISABLED (c2)
+                  && item_rule (state_items[c2].item) == r2)
+                {
+                  counterexample_report_reduce_reduce (c1, c2, lookaheads, out, prefix);
+                  break;
+                }
+        }
+    }
+  bitset_free (lookaheads);
+}
diff --git a/src/counterexample.h b/src/counterexample.h
new file mode 100644
index 0000000..8f833f3
--- /dev/null
+++ b/src/counterexample.h
@@ -0,0 +1,36 @@
+/* Conflict counterexample generation
+
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef COUNTEREXAMPLE_H
+# define COUNTEREXAMPLE_H
+
+# include "state.h"
+
+// Init/deinit this module.
+void counterexample_init (void);
+void counterexample_free (void);
+
+// Print the counterexamples for the conflicts of state S.
+//
+// Used both for the warnings on the terminal (OUT = stderr, PREFIX =
+// ""), and for the reports (OUT != stderr, PREFIX != "").
+void
+counterexample_report_state (const state *s, FILE *out, const char *prefix);
+
+#endif /* COUNTEREXAMPLE_H */
diff --git a/src/derivation.c b/src/derivation.c
new file mode 100644
index 0000000..6094627
--- /dev/null
+++ b/src/derivation.c
@@ -0,0 +1,476 @@
+/* Counterexample derivation trees
+
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "derivation.h"
+#include "glyphs.h"
+
+#include <c-ctype.h>
+#include <gl_linked_list.h>
+#include <mbswidth.h>
+#include <vasnprintf.h>
+
+#include "system.h"
+#include "complain.h"
+
+struct derivation
+{
+  symbol_number sym;
+  derivation_list children;
+  int reference_count;
+  // The rule SYM -> CHILDREN.
+  const rule *rule;
+  // Color assigned for styling.  Guarantees that the derivation is
+  // always displayed with the same color, independently of the order
+  // in which the derivations are traversed.
+  int color;
+};
+
+static derivation d_dot = { -1, NULL, -1, NULL, -1 };
+
+derivation *
+derivation_dot (void)
+{
+  return &d_dot;
+}
+
+void
+derivation_list_append (derivation_list dl, derivation *d)
+{
+  derivation_retain (d);
+  gl_list_add_last (dl, d);
+}
+
+void
+derivation_list_prepend (derivation_list dl, derivation *d)
+{
+  derivation_retain (d);
+  gl_list_add_first (dl, d);
+}
+
+void derivation_list_free (derivation_list dl)
+{
+  derivation *d = NULL;
+  for (gl_list_iterator_t it = gl_list_iterator (dl);
+       derivation_list_next (&it, &d);
+       )
+    if (d != &d_dot)
+      derivation_free (d);
+  gl_list_free (dl);
+}
+
+derivation *
+derivation_new (symbol_number sym, derivation_list children,
+                const rule *r)
+{
+  derivation *res = xmalloc (sizeof *res);
+  res->sym = sym;
+  res->children = children;
+  res->reference_count = 0;
+  res->rule = r;
+  res->color = -1;
+  return res;
+}
+
+void
+derivation_retain (derivation *d)
+{
+  ++d->reference_count;
+}
+
+void
+derivation_free (derivation *d)
+{
+  if (!d)
+    return;
+  derivation_list free_queue =
+    gl_list_create (GL_LINKED_LIST, NULL, NULL, NULL, true,
+                    1, (const void **)&d);
+  while (gl_list_size (free_queue) > 0)
+    {
+      derivation *deriv = (derivation *) gl_list_get_at (free_queue, 0);
+      if (--deriv->reference_count == 0)
+        {
+          if (deriv->children)
+            {
+              derivation *child = NULL;
+              for (gl_list_iterator_t it = gl_list_iterator (deriv->children);
+                   derivation_list_next (&it, &child);
+                   )
+                if (child != &d_dot)
+                  gl_list_add_last (free_queue, child);
+              gl_list_free (deriv->children);
+            }
+          free (deriv);
+        }
+      gl_list_remove_at (free_queue, 0);
+    }
+  gl_list_free (free_queue);
+}
+
+size_t
+derivation_size (const derivation *deriv)
+{
+  if (!deriv->children)
+    return 1;
+  int size = 1;
+  derivation *child = NULL;
+  for (gl_list_iterator_t it = gl_list_iterator (deriv->children);
+       derivation_list_next (&it, &child);
+       )
+    size += derivation_size (child);
+  return size;
+}
+
+
+// Longest distance from root to leaf.
+static int
+derivation_depth (const derivation *deriv)
+{
+  if (deriv->children)
+    {
+      // Children's depth cannot be 0, even if there are no children
+      // (the case of a derivation with an empty RHS).
+      int res = 1;
+      derivation *child;
+      for (gl_list_iterator_t it = gl_list_iterator (deriv->children);
+           derivation_list_next (&it, &child);
+           )
+        res = max_int (res, derivation_depth (child));
+      return res + 1;
+    }
+  else
+    return 1;
+}
+
+static bool
+all_spaces (const char *s)
+{
+  while (c_isspace (*s))
+    s++;
+  return *s == '\0';
+}
+
+// Printing the derivation as trees without trailing spaces is
+// painful: we cannot simply pad one "column" before moving to the
+// next:
+//
+// exp
+// ↳ x1          e1  foo1                      x1
+//   ↳ x2        ↳ ε ↳ foo2                    ↳ x2
+//     ↳ x3            ↳ foo3                    ↳ x3
+//       ↳ "X" •         ↳ x1        foo4          ↳ "X"
+//                         ↳ x2      ↳ "quuux"
+//                           ↳ x3
+//                             ↳ "X"
+//
+// It's hard for a column to know that it's "last" to decide whether
+// to output the right-padding or not.  So when we need to pad on the
+// right to complete a column, we don't output the spaces, we
+// accumulate the width of padding in *PADDING.
+//
+// Each time we actually print something (non space), we flush that
+// padding.  When we _don't_ print something, its width is added to
+// the current padding.
+//
+// This function implements this.
+//
+// When COND is true, put S on OUT, preceded by *PADDING white spaces.
+// Otherwise add the width to *PADDING.  Return the width of S.
+static int
+fputs_if (bool cond, FILE *out, int *padding, const char *s)
+{
+  int res = mbswidth (s, 0);
+  if (cond && !all_spaces (s))
+    {
+      fprintf (out, "%*s%s", *padding, "", s);
+      *padding = 0;
+    }
+  else
+    {
+      *padding += res;
+    }
+  return res;
+}
+
+static int
+fprintf_if (bool cond, FILE *out, int *padding, const char *fmt, ...)
+{
+  char buf[256];
+  size_t len = sizeof (buf);
+  va_list args;
+  va_start (args, fmt);
+  char *cp = vasnprintf (buf, &len, fmt, args);
+  va_end (args);
+  if (!cp)
+    xalloc_die ();
+  int res = fputs_if (cond, out, padding, cp);
+  if (cp != buf)
+    free (cp);
+  return res;
+}
+
+// The width taken to report this derivation recursively down to its
+// leaves.
+static int
+derivation_width (const derivation *deriv)
+{
+  if (deriv->children)
+    {
+      const symbol *sym = symbols[deriv->sym];
+      int self_width = mbswidth (sym->tag, 0);
+
+      // Arrow and space.
+      int children_width = down_arrow_width;
+      children_width += snprintf (NULL, 0, "%d: ", deriv->rule->number);
+      if (gl_list_size (deriv->children) == 0)
+        // Empty rhs.
+        children_width += empty_width;
+      else
+        {
+          if (gl_list_size (deriv->children) == 1
+              && gl_list_get_first (deriv->children) == &d_dot)
+            {
+              children_width += empty_width;
+              children_width += derivation_separator_width;
+            }
+
+          derivation *child;
+          for (gl_list_iterator_t it = gl_list_iterator (deriv->children);
+               derivation_list_next (&it, &child);
+               )
+            children_width
+              += derivation_separator_width + derivation_width (child);
+          // No separator at the beginning.
+          children_width -= derivation_separator_width;
+        }
+      return max_int (self_width, children_width);
+    }
+  else if (deriv == &d_dot)
+    {
+      return dot_width;
+    }
+  else // leaf.
+    {
+      const symbol *sym = symbols[deriv->sym];
+      return mbswidth (sym->tag, 0);
+    }
+}
+
+
+// Print DERIV for DEPTH.
+//
+// The tree is printed from top to bottom with DEPTH ranging from 0 to
+// the total depth of the tree.  DERIV should only printed when we
+// reach its depth, i.e., then DEPTH is 0.
+//
+// When DEPTH is 1 and we're on a subderivation, then we print the RHS
+// of the derivation (in DEPTH 0 we printed its LHS).
+//
+// Return the "logical printed" width.  We might have not have reached
+// that width, in which case the missing spaces are in *PADDING.
+static int
+derivation_print_tree_impl (const derivation *deriv, FILE *out,
+                            int depth, int *padding)
+{
+  const int width = derivation_width (deriv);
+
+  int res = 0;
+  if (deriv->children)
+    {
+      const symbol *sym = symbols[deriv->sym];
+      char style[20];
+      snprintf (style, 20, "cex-%d", deriv->color);
+
+      if (depth == 0 || depth == 1)
+        {
+          begin_use_class (style, out);
+          begin_use_class ("cex-step", out);
+        }
+      if (depth == 0)
+        {
+          res += fputs_if (true, out, padding, sym->tag);
+        }
+      else
+        {
+          res += fputs_if (depth == 1, out, padding, down_arrow);
+          res += fprintf_if (depth == 1, out, padding, "%d: ", deriv->rule->number);
+          if (gl_list_size (deriv->children) == 0)
+            // Empty rhs.
+            res += fputs_if (depth == 1, out, padding, empty);
+          else
+            {
+              if (gl_list_size (deriv->children) == 1
+                  && gl_list_get_first (deriv->children) == &d_dot)
+                {
+                  res += fputs_if (depth == 1, out, padding, empty);
+                  res += fputs_if (depth == 1, out, padding, derivation_separator);
+                }
+
+              bool first = true;
+              derivation *child;
+              for (gl_list_iterator_t it = gl_list_iterator (deriv->children);
+                   derivation_list_next (&it, &child);
+                   )
+                {
+                  if (!first)
+                    res += fputs_if (depth == 1, out, padding, derivation_separator);
+                  res += derivation_print_tree_impl (child, out, depth - 1, padding);
+                  first = false;
+                }
+            }
+        }
+      if (depth == 0 || depth == 1)
+        {
+          end_use_class ("cex-step", out);
+          end_use_class (style, out);
+        }
+      *padding += width - res;
+      res = width;
+    }
+  else if (deriv == &d_dot)
+    {
+      if (depth == 0)
+        begin_use_class ("cex-dot", out);
+      res += fputs_if (depth == 0, out, padding, dot);
+      if (depth == 0)
+        end_use_class ("cex-dot", out);
+    }
+  else // leaf.
+    {
+      const symbol *sym = symbols[deriv->sym];
+      if (depth == 0)
+        begin_use_class ("cex-leaf", out);
+      res += fputs_if (depth == 0, out, padding, sym->tag);
+      if (depth == 0)
+        end_use_class ("cex-leaf", out);
+    }
+  return res;
+}
+
+static void
+derivation_print_tree (const derivation *deriv, FILE *out, const char *prefix)
+{
+  fputc ('\n', out);
+  for (int depth = 0, max_depth = derivation_depth (deriv);
+       depth < max_depth; ++depth)
+    {
+      int padding = 0;
+      fprintf (out, "    %s", prefix);
+      derivation_print_tree_impl (deriv, out, depth, &padding);
+      fputc ('\n', out);
+    }
+}
+
+
+/* Print DERIV, colored according to COUNTER.
+   Return false if nothing is printed.  */
+static bool
+derivation_print_flat_impl (derivation *deriv, FILE *out,
+                            bool leaves_only,
+                            int *counter, const char *prefix)
+{
+  if (deriv->children)
+    {
+      const symbol *sym = symbols[deriv->sym];
+      deriv->color = *counter;
+      ++*counter;
+      char style[20];
+      snprintf (style, 20, "cex-%d", deriv->color);
+      begin_use_class (style, out);
+
+      if (!leaves_only)
+        {
+          fputs (prefix, out);
+          begin_use_class ("cex-step", out);
+          fprintf (out, "%s %s [ ", sym->tag, arrow);
+          end_use_class ("cex-step", out);
+          prefix = "";
+        }
+      bool res = false;
+      derivation *child;
+      for (gl_list_iterator_t it = gl_list_iterator (deriv->children);
+           derivation_list_next (&it, &child);
+           )
+        {
+          if (derivation_print_flat_impl (child, out,
+                                          leaves_only, counter, prefix))
+            {
+              prefix = " ";
+              res = true;
+            }
+          else if (!leaves_only)
+            prefix = " ";
+        }
+      if (!leaves_only)
+        {
+          begin_use_class ("cex-step", out);
+          if (res)
+            fputs (" ]", out);
+          else
+            fputs ("]", out);
+          end_use_class ("cex-step", out);
+        }
+      end_use_class (style, out);
+      return res;
+    }
+  else if (deriv == &d_dot)
+    {
+      fputs (prefix, out);
+      begin_use_class ("cex-dot", out);
+      fputs (dot, out);
+      end_use_class ("cex-dot", out);
+    }
+  else // leaf.
+    {
+      fputs (prefix, out);
+      const symbol *sym = symbols[deriv->sym];
+      begin_use_class ("cex-leaf", out);
+      fprintf (out, "%s", sym->tag);
+      end_use_class ("cex-leaf", out);
+    }
+  return true;
+}
+
+static void
+derivation_print_flat (const derivation *deriv, FILE *out, const char *prefix)
+{
+  int counter = 0;
+  fputs (prefix, out);
+  derivation_print_flat_impl ((derivation *)deriv, out, false, &counter, "");
+  fputc ('\n', out);
+}
+
+void
+derivation_print_leaves (const derivation *deriv, FILE *out)
+{
+  int counter = 0;
+  derivation_print_flat_impl ((derivation *)deriv, out, true, &counter, "");
+  fputc ('\n', out);
+}
+
+void
+derivation_print (const derivation *deriv, FILE *out, const char *prefix)
+{
+  if (getenv ("YYFLAT"))
+    derivation_print_flat (deriv, out, prefix);
+  else
+    derivation_print_tree (deriv, out, prefix);
+}
diff --git a/src/derivation.h b/src/derivation.h
new file mode 100644
index 0000000..1af1d23
--- /dev/null
+++ b/src/derivation.h
@@ -0,0 +1,77 @@
+/* Counterexample derivation trees
+
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef DERIVATION_H
+# define DERIVATION_H
+
+# include <gl_linked_list.h>
+# include <gl_xlist.h>
+
+# include "gram.h"
+
+/* Derivations are trees of symbols such that each nonterminal's
+   children are symbols that produce that nonterminal if they are
+   relevant to the counterexample.  The leaves of a derivation form a
+   counterexample when printed.  */
+
+typedef gl_list_t derivation_list;
+typedef struct derivation derivation;
+
+static inline derivation_list derivation_list_new (void)
+{
+  return gl_list_create_empty (GL_LINKED_LIST, NULL, NULL, NULL, true);
+}
+
+static inline bool
+derivation_list_next (gl_list_iterator_t *it, derivation **d)
+{
+  const void *p = NULL;
+  bool res = gl_list_iterator_next (it, &p, NULL);
+  if (res)
+    *d = (derivation *) p;
+  else
+    gl_list_iterator_free (it);
+  return res;
+}
+
+void derivation_list_append (derivation_list dl, derivation *d);
+void derivation_list_prepend (derivation_list dl, derivation *d);
+void derivation_list_free (derivation_list dl);
+
+// rule_num is the number of the rule SYM -> CHILDREN.
+derivation *
+derivation_new (symbol_number sym, derivation_list children,
+                const rule *r);
+
+static inline derivation *derivation_new_leaf (symbol_number sym)
+{
+  return derivation_new (sym, NULL, NULL);
+}
+
+// Number of symbols.
+size_t derivation_size (const derivation *deriv);
+void derivation_print (const derivation *deriv, FILE *out, const char *prefix);
+void derivation_print_leaves (const derivation *deriv, FILE *out);
+void derivation_free (derivation *deriv);
+void derivation_retain (derivation *deriv);
+
+// A derivation denoting the position of the dot.
+derivation *derivation_dot (void);
+
+#endif /* DERIVATION_H */
diff --git a/src/derives.c b/src/derives.c
index 8de7986..4ea5f78 100644
--- a/src/derives.c
+++ b/src/derives.c
@@ -1,6 +1,6 @@
 /* Match rules with nonterminals for bison,
 
-   Copyright (C) 1984, 1989, 2000-2003, 2005, 2009-2015, 2018-2019 Free
+   Copyright (C) 1984, 1989, 2000-2003, 2005, 2009-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
@@ -47,7 +47,7 @@
       fprintf (stderr, "  %s derives\n", symbols[i]->tag);
       for (rule **rp = derives[i - ntokens]; *rp; ++rp)
         {
-          fprintf (stderr, "    %3d ", (*rp)->user_number);
+          fprintf (stderr, "    %3d ", (*rp)->code);
           rule_rhs_print (*rp, stderr);
           fprintf (stderr, "\n");
         }
@@ -62,7 +62,7 @@
 {
   /* DSET[NTERM - NTOKENS] -- A linked list of the numbers of the rules
      whose LHS is NTERM.  */
-  rule_list **dset = xcalloc (nvars, sizeof *dset);
+  rule_list **dset = xcalloc (nnterms, sizeof *dset);
 
   /* DELTS[RULE] -- There are NRULES rule number to attach to nterms.
      Instead of performing NRULES allocations for each, have an array
@@ -82,9 +82,9 @@
   /* DSET contains what we need under the form of a linked list.  Make
      it a single array.  */
 
-  derives = xnmalloc (nvars, sizeof *derives);
+  derives = xnmalloc (nnterms, sizeof *derives);
   /* Q is the storage for DERIVES[...] (DERIVES[0] = q).  */
-  rule **q = xnmalloc (nvars + nrules, sizeof *q);
+  rule **q = xnmalloc (nnterms + nrules, sizeof *q);
 
   for (symbol_number i = ntokens; i < nsyms; ++i)
     {
diff --git a/src/derives.h b/src/derives.h
index 521a10c..0c28a41 100644
--- a/src/derives.h
+++ b/src/derives.h
@@ -1,6 +1,6 @@
 /* Match rules with nonterminals for bison,
 
-   Copyright (C) 1984, 1989, 2000-2002, 2009-2015, 2018-2019 Free
+   Copyright (C) 1984, 1989, 2000-2002, 2009-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef DERIVES_H_
 # define DERIVES_H_
diff --git a/src/files.c b/src/files.c
index 66000ba..0ef6e9c 100644
--- a/src/files.c
+++ b/src/files.c
@@ -1,6 +1,6 @@
 /* Open and close files for Bison.
 
-   Copyright (C) 1984, 1986, 1989, 1992, 2000-2015, 2018-2019 Free
+   Copyright (C) 1984, 1986, 1989, 1992, 2000-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,19 +16,26 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
 
 #include <configmake.h> /* PKGDATADIR */
-#include <error.h>
 #include <dirname.h>
+#include <error.h>
 #include <get-errno.h>
+#include <gl_array_list.h>
+#include <gl_hash_map.h>
+#include <gl_xlist.h>
+#include <gl_xmap.h>
 #include <quote.h>
 #include <quotearg.h>
 #include <relocatable.h> /* relocate2 */
 #include <stdio-safer.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
 #include <xstrndup.h>
 
 #include "complain.h"
@@ -50,8 +57,9 @@
 location spec_name_prefix_loc = EMPTY_LOCATION_INIT;
 char *spec_verbose_file = NULL;  /* for --verbose. */
 char *spec_graph_file = NULL;    /* for -g. */
+char *spec_html_file = NULL;     /* for --html. */
 char *spec_xml_file = NULL;      /* for -x. */
-char *spec_header_file = NULL;  /* for --defines. */
+char *spec_header_file = NULL;   /* for --header. */
 char *parser_file_name;
 
 /* All computed output file names.  */
@@ -70,7 +78,7 @@
 uniqstr grammar_file = NULL;
 
 /* If --output=dir/foo.c was specified,
-   DIR_PREFIX is 'dir/' and ALL_BUT_EXT and ALL_BUT_TAB_EXT are 'dir/foo'.
+   DIR_PREFIX gis 'dir/' and ALL_BUT_EXT and ALL_BUT_TAB_EXT are 'dir/foo'.
 
    If --output=dir/foo.tab.c was specified, DIR_PREFIX is 'dir/',
    ALL_BUT_EXT is 'dir/foo.tab', and ALL_BUT_TAB_EXT is 'dir/foo'.
@@ -93,6 +101,18 @@
 static char *src_extension = NULL;
 /* Header file extension (if option '`-d'' is specified).  */
 static char *header_extension = NULL;
+
+struct prefix_map
+{
+  char *oldprefix;
+  char *newprefix;
+};
+
+static gl_list_t prefix_maps = NULL;
+
+/* Map file names to prefix-mapped file names. */
+static gl_map_t mapped_files = NULL;
+
 
 /*-----------------------------------------------------------------.
 | Return a newly allocated string composed of the concatenation of |
@@ -156,6 +176,116 @@
   return res;
 }
 
+/* The mapped name of FILENAME, allocated, if there are prefix maps.
+   Otherwise NULL.  */
+static char *
+map_file_name_alloc (char const *filename)
+{
+  struct prefix_map const *p = NULL;
+  assert (prefix_maps);
+  {
+    void const *ptr;
+    gl_list_iterator_t iter = gl_list_iterator (prefix_maps);
+    while (gl_list_iterator_next (&iter, &ptr, NULL))
+      {
+        p = ptr;
+        if (strncmp (p->oldprefix, filename, strlen (p->oldprefix)) == 0)
+          break;
+        p = NULL;
+      }
+    gl_list_iterator_free (&iter);
+  }
+
+  if (!p)
+    return xstrdup (filename);
+
+  size_t oldprefix_len = strlen (p->oldprefix);
+  size_t newprefix_len = strlen (p->newprefix);
+  char *res = xmalloc (newprefix_len + strlen (filename) - oldprefix_len + 1);
+
+  char *end = stpcpy (res, p->newprefix);
+  stpcpy (end, filename + oldprefix_len);
+
+  return res;
+}
+
+static bool
+string_equals (const void *x1, const void *x2)
+{
+  const char *s1 = x1;
+  const char *s2 = x2;
+  return STREQ (s1, s2);
+}
+
+/* A hash function for NUL-terminated char* strings using
+   the method described by Bruno Haible.
+   See https://www.haible.de/bruno/hashfunc.html.  */
+static size_t
+string_hash (const void *x)
+{
+#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
+
+  const char *s = x;
+  size_t h = 0;
+
+  for (; *s; s++)
+    h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+
+  return h;
+}
+
+static void
+string_free (const void *cp)
+{
+  void *p = (void*) cp;
+  free (p);
+}
+
+const char *
+map_file_name (char const *filename)
+{
+  if (!filename || !prefix_maps)
+    return filename;
+  if (!mapped_files)
+    mapped_files
+      = gl_map_nx_create_empty (GL_HASH_MAP,
+                                string_equals, string_hash,
+                                string_free, string_free);
+  const void *res = gl_map_get (mapped_files, filename);
+  if (!res)
+    {
+      res = map_file_name_alloc (filename);
+      gl_map_put (mapped_files, xstrdup (filename), res);
+    }
+  return res;
+}
+
+static void
+prefix_map_free (struct prefix_map *p)
+{
+  free (p->oldprefix);
+  free (p->newprefix);
+  free (p);
+}
+
+void
+add_prefix_map (char const *oldprefix, char const *newprefix)
+{
+  if (!prefix_maps)
+    prefix_maps
+      = gl_list_create_empty (GL_ARRAY_LIST,
+                              /* equals */ NULL,
+                              /* hashcode */ NULL,
+                              (gl_listelement_dispose_fn) prefix_map_free,
+                              true);
+
+  struct prefix_map *p = xmalloc (sizeof (*p));
+  p->oldprefix = xstrdup (oldprefix);
+  p->newprefix = xstrdup (newprefix);
+
+  gl_list_add_last (prefix_maps, p);
+}
+
 /*------------------------------------------------------------------.
 | Compute ALL_BUT_EXT, ALL_BUT_TAB_EXT and output files extensions. |
 `------------------------------------------------------------------*/
@@ -332,7 +462,7 @@
      ? xstrdup (spec_outfile)
      : concat2 (all_but_ext, src_extension));
 
-  if (defines_flag)
+  if (header_flag)
     {
       if (! spec_header_file)
         spec_header_file = concat2 (all_but_ext, header_extension);
@@ -341,11 +471,17 @@
   if (graph_flag)
     {
       if (! spec_graph_file)
-        spec_graph_file = concat2 (all_but_tab_ext,
-                                   304 <= required_version ? ".gv" : ".dot");
+        spec_graph_file = concat2 (all_but_tab_ext, ".gv");
       output_file_name_check (&spec_graph_file, false);
     }
 
+  if (html_flag)
+    {
+      if (! spec_html_file)
+        spec_html_file = concat2 (all_but_tab_ext, ".html");
+      output_file_name_check (&spec_html_file, false);
+    }
+
   if (xml_flag)
     {
       if (! spec_xml_file)
@@ -421,12 +557,30 @@
     }
 }
 
+char const *
+m4path (void)
+{
+  char const *m4 = getenv ("M4");
+  if (m4)
+    return m4;
+
+  /* We don't use relocate2() to store the temporary buffer and re-use
+     it, because m4path() is only called once.  */
+  char const *m4_relocated = relocate (M4);
+  struct stat buf;
+  if (stat (m4_relocated, &buf) == 0)
+    return m4_relocated;
+
+  return M4;
+}
+
 void
 output_file_names_free (void)
 {
   free (all_but_ext);
   free (spec_verbose_file);
   free (spec_graph_file);
+  free (spec_html_file);
   free (spec_xml_file);
   free (spec_header_file);
   free (parser_file_name);
@@ -435,4 +589,9 @@
     free (generated_files[i].name);
   free (generated_files);
   free (relocate_buffer);
+
+  if (prefix_maps)
+    gl_list_free (prefix_maps);
+  if (mapped_files)
+    gl_map_free (mapped_files);
 }
diff --git a/src/files.h b/src/files.h
index 5722cc7..3858477 100644
--- a/src/files.h
+++ b/src/files.h
@@ -1,6 +1,6 @@
 /* File names and variables for bison,
 
-   Copyright (C) 1984, 1989, 2000-2002, 2006-2007, 2009-2015, 2018-2019
+   Copyright (C) 1984, 1989, 2000-2002, 2006-2007, 2009-2015, 2018-2021
    Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef FILES_H_
 # define FILES_H_
@@ -44,10 +44,13 @@
 /* File name specified for the output graph.  */
 extern char *spec_graph_file;
 
-/* File name specified for the xml output.  */
+/* File name specified for the HTML output.  */
+extern char *spec_html_file;
+
+/* File name specified for the XML output.  */
 extern char *spec_xml_file;
 
-/* File name specified with --defines.  */
+/* File name specified with --header.  */
 extern char *spec_header_file;
 
 /* Directory prefix of output file names.  */
@@ -64,6 +67,9 @@
 /* Where our data files are installed.  */
 char const *pkgdatadir (void);
 
+/* Where the m4 program is installed.  */
+char const *m4path (void);
+
 void compute_output_file_names (void);
 void output_file_names_free (void);
 
@@ -82,4 +88,13 @@
 void xfclose (FILE *ptr);
 FILE *xfdopen (int fd, char const *mode);
 
+/* Given an input file path, return a string that contains the path
+   with the file prefix mapping rules applied, or NULL if the input
+   was NULL.  Do not free the return value.  */
+const char *map_file_name (char const *filename);
+
+/* Add a new file prefix mapping. If a file path starts with
+   oldprefix, it will be replaced with newprefix.  */
+void add_prefix_map (char const *oldprefix, char const *newprefix);
+
 #endif /* !FILES_H_ */
diff --git a/src/fixits.c b/src/fixits.c
index ee21789..3467cda 100644
--- a/src/fixits.c
+++ b/src/fixits.c
@@ -1,6 +1,6 @@
 /* Support for fixing grammar files.
 
-   Copyright (C) 2019 Free Software Foundation, Inc.
+   Copyright (C) 2019-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,25 +15,25 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 
 #include "fixits.h"
 
+#include <error.h>
+#include <get-errno.h>
+#include <gl_array_list.h>
+#include <gl_xlist.h>
+#include <progname.h>
+#include <quote.h>
+#include <quotearg.h>
+#include <vasnprintf.h>
+
 #include "system.h"
 
-#include "error.h"
-#include "get-errno.h"
-#include "getargs.h"
-#include "gl_array_list.h"
-#include "gl_xlist.h"
-#include "progname.h"
-#include "quote.h"
-#include "quotearg.h"
-#include "vasnprintf.h"
-
 #include "files.h"
+#include "getargs.h"
 
 typedef struct
 {
@@ -68,7 +68,7 @@
 
 /* GCC and Clang follow the same pattern.
    https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Message-Formatting-Options.html
-   http://clang.llvm.org/docs/UsersManual.html#cmdoption-fdiagnostics-parseable-fixits */
+   https://clang.llvm.org/docs/UsersManual.html#cmdoption-fdiagnostics-parseable-fixits */
 static void
 fixit_print (fixit const *f, FILE *out)
 {
@@ -124,10 +124,11 @@
   FILE *out = xfopen (input, "w");
   size_t line = 1;
   size_t offset = 1;
-  fixit const *f = NULL;
+  void const *p = NULL;
   gl_list_iterator_t iter = gl_list_iterator (fixits);
-  while (gl_list_iterator_next (&iter, (const void**) &f, NULL))
+  while (gl_list_iterator_next (&iter, &p, NULL))
     {
+      fixit const *f = p;
       /* Look for the correct line. */
       while (line < f->location.start.line)
         {
diff --git a/src/fixits.h b/src/fixits.h
index 45c2780..46440a3 100644
--- a/src/fixits.h
+++ b/src/fixits.h
@@ -1,6 +1,6 @@
 /* Support for fixing grammar files.
 
-   Copyright (C) 2019 Free Software Foundation, Inc.
+   Copyright (C) 2019-2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef FIXITS_H_
 # define FIXITS_H_ 1
diff --git a/src/flex-scanner.h b/src/flex-scanner.h
index 9e4408f..238ca88 100644
--- a/src/flex-scanner.h
+++ b/src/flex-scanner.h
@@ -1,6 +1,6 @@
 /* Common parts between scan-code.l, scan-gram.l, and scan-skel.l.
 
-   Copyright (C) 2006, 2009-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 2006, 2009-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef FLEX_PREFIX
 # error "FLEX_PREFIX not defined"
@@ -94,22 +94,33 @@
    keep (to construct ID, STRINGS etc.).  Use the following macros to
    use it.
 
-   Use STRING_GROW to append what has just been matched, and
-   STRING_FINISH to end the string (it puts the ending 0).
-   STRING_FINISH also stores this string in LAST_STRING, which can be
-   used, and which is used by STRING_FREE to free the last string.  */
+   Use STRING_GROW () to append what has just been matched, and
+   STRING_FINISH () to end the string (it puts the ending 0).
+   STRING_FINISH () also stores this string in LAST_STRING, which can be
+   used, and which is used by STRING_FREE () to free the last string.  */
 
 #ifndef FLEX_NO_OBSTACK
 
 static struct obstack obstack_for_string;
 
-# define STRING_GROW                                    \
+# define STRING_GROW()                                  \
   obstack_grow (&obstack_for_string, yytext, yyleng)
 
-# define STRING_FINISH                                  \
+# define STRING_FINISH()                                \
   (last_string = obstack_finish0 (&obstack_for_string))
 
-# define STRING_FREE                                    \
+# define STRING_1GROW(Char)                     \
+  obstack_1grow (&obstack_for_string, Char)
+
+# ifdef NDEBUG
+#  define STRING_FREE()                                 \
   obstack_free (&obstack_for_string, last_string)
+# else
+#  define STRING_FREE()                                  \
+  do {                                                   \
+    obstack_free (&obstack_for_string, last_string);     \
+    last_string = NULL;                                  \
+  } while (0)
+# endif
 
 #endif
diff --git a/src/getargs.c b/src/getargs.c
index bf4a938..ef55929 100644
--- a/src/getargs.c
+++ b/src/getargs.c
@@ -1,6 +1,6 @@
 /* Parse command line arguments for Bison.
 
-   Copyright (C) 1984, 1986, 1989, 1992, 2000-2015, 2018-2019 Free
+   Copyright (C) 1984, 1986, 1989, 1992, 2000-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "getargs.h"
@@ -38,8 +38,9 @@
 #include "output.h"
 #include "uniqstr.h"
 
-bool defines_flag = false;
+bool header_flag = false;
 bool graph_flag = false;
+bool html_flag = false;
 bool xml_flag = false;
 bool no_lines_flag = false;
 bool token_table_flag = false;
@@ -70,6 +71,18 @@
 
 typedef int* (xargmatch_fn) (const char *context, const char *arg);
 
+void
+set_yacc (location loc)
+{
+  yacc_loc = loc;
+  if (getenv ("POSIXLY_CORRECT"))
+    muscle_percent_define_insert ("posix",
+                                  loc,
+                                  muscle_keyword, "",
+                                  MUSCLE_PERCENT_DEFINE_D);
+}
+
+
 /** Decode an option's key.
  *
  *  \param opt        option being decoded.
@@ -151,8 +164,8 @@
  */
 #define FLAGS_ARGMATCH(FlagName, Args, All)                             \
   flags_argmatch ("--" #FlagName,                                       \
-                  (xargmatch_fn*) argmatch_## FlagName ## _value,        \
-                  argmatch_## FlagName ## _usage,                       \
+                  (xargmatch_fn*) argmatch_## FlagName ## _value,       \
+                  argmatch_ ## FlagName ## _usage,                      \
                   All, &FlagName ## _flag, Args)
 
 /*---------------------.
@@ -206,23 +219,26 @@
 
 static const argmatch_report_doc argmatch_report_docs[] =
 {
-  { "states",     N_("describe the states") },
-  { "itemsets",   N_("complete the core item sets with their closure") },
-  { "lookaheads", N_("explicitly associate lookahead tokens to items") },
-  { "solved",     N_("describe shift/reduce conflicts solving") },
-  { "all",        N_("include all the above information") },
-  { "none",       N_("disable the report") },
+  { "states",          N_("describe the states") },
+  { "itemsets",        N_("complete the core item sets with their closure") },
+  { "lookaheads",      N_("explicitly associate lookahead tokens to items") },
+  { "solved",          N_("describe shift/reduce conflicts solving") },
+  { "counterexamples", N_("generate conflict counterexamples") },
+  { "all",             N_("include all the above information") },
+  { "none",            N_("disable the report") },
   { NULL, NULL },
 };
 
 static const argmatch_report_arg argmatch_report_args[] =
 {
-  { "none",        report_none },
-  { "states",      report_states },
-  { "itemsets",    report_states | report_itemsets },
-  { "lookaheads",  report_states | report_lookahead_tokens },
-  { "solved",      report_states | report_solved_conflicts },
-  { "all",         report_all },
+  { "none",            report_none },
+  { "states",          report_states },
+  { "itemsets",        report_states | report_itemsets },
+  { "lookaheads",      report_states | report_lookaheads },
+  { "solved",          report_states | report_solved_conflicts },
+  { "counterexamples", report_cex },
+  { "cex",             report_cex },
+  { "all",             report_all },
   { NULL, report_none },
 };
 
@@ -257,10 +273,12 @@
   { "sets",       "grammar sets: firsts, nullable etc." },
   { "muscles",    "m4 definitions passed to the skeleton" },
   { "tools",      "m4 invocation" },
-  { "m4",         "m4 traces" },
+  { "m4-early",   "m4 traces starting from the start" },
+  { "m4",         "m4 traces starting from the skeleton evaluation" },
   { "skeleton",   "skeleton postprocessing" },
   { "time",       "time consumption" },
   { "ielr",       "IELR conversion" },
+  { "cex",        "counterexample generation"},
   { "all",        "all of the above" },
   { NULL, NULL},
 };
@@ -279,10 +297,12 @@
   { "sets",      trace_sets },
   { "muscles",   trace_muscles },
   { "tools",     trace_tools },
+  { "m4-early",  trace_m4_early },
   { "m4",        trace_m4 },
   { "skeleton",  trace_skeleton },
   { "time",      trace_time },
   { "ielr",      trace_ielr },
+  { "cex",       trace_cex },
   { "all",       trace_all },
   { NULL,        trace_none},
 };
@@ -337,7 +357,8 @@
 | Display the help message and exit STATUS.  |
 `-------------------------------------------*/
 
-static void usage (int) ATTRIBUTE_NORETURN;
+ _Noreturn
+static void usage (int);
 
 static void
 usage (int status)
@@ -414,19 +435,20 @@
 "), stdout);
       putc ('\n', stdout);
 
-      /* Keep -d and --defines separate so that ../build-aux/cross-options.pl
-       * won't assume that -d also takes an argument.  */
       fputs (_("\
 Output Files:\n\
-      --defines[=FILE]       also produce a header file\n\
-  -d                         likewise but cannot specify FILE (for POSIX Yacc)\n\
-  -r, --report=THINGS        also produce details on the automaton\n\
-      --report-file=FILE     write report to FILE\n\
-  -v, --verbose              same as '--report=state'\n\
-  -b, --file-prefix=PREFIX   specify a PREFIX for output files\n\
-  -o, --output=FILE          leave output to FILE\n\
-  -g, --graph[=FILE]         also output a graph of the automaton\n\
-  -x, --xml[=FILE]           also output an XML report of the automaton\n\
+  -H, --header=[FILE]           also produce a header file\n\
+  -d                            likewise but cannot specify FILE (for POSIX Yacc)\n\
+  -r, --report=THINGS           also produce details on the automaton\n\
+      --report-file=FILE        write report to FILE\n\
+  -v, --verbose                 same as '--report=state'\n\
+  -b, --file-prefix=PREFIX      specify a PREFIX for output files\n\
+  -o, --output=FILE             leave output to FILE\n\
+  -g, --graph[=FILE]            also output a graph of the automaton\n\
+      --html[=FILE]             also output an HTML report of the automaton\n\
+  -x, --xml[=FILE]              also output an XML report of the automaton\n\
+  -M, --file-prefix-map=OLD=NEW replace prefix OLD with NEW when writing file paths\n\
+                                in output files\n\
 "), stdout);
       putc ('\n', stdout);
 
@@ -436,7 +458,7 @@
       printf (_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
       printf (_("%s home page: <%s>.\n"), PACKAGE_NAME, PACKAGE_URL);
       fputs (_("General help using GNU software: "
-               "<http://www.gnu.org/gethelp/>.\n"),
+               "<https://www.gnu.org/gethelp/>.\n"),
              stdout);
 
 #if (defined __GLIBC__ && __GLIBC__ >= 2) && !defined __UCLIBC__
@@ -445,13 +467,12 @@
          man page.  */
       const char *lc_messages = setlocale (LC_MESSAGES, NULL);
       if (lc_messages && !STREQ (lc_messages, "en_"))
-        /* TRANSLATORS: Replace LANG_CODE in this URL with your language
-           code <http://translationproject.org/team/LANG_CODE.html> to
-           form one of the URLs at http://translationproject.org/team/.
+        /* TRANSLATORS: Replace LANG_CODE in this URL with your language code to
+           form one of the URLs at https://translationproject.org/team/.
            Otherwise, replace the entire URL with your translation team's
            email address.  */
         fputs (_("Report translation bugs to "
-                 "<http://translationproject.org/team/>.\n"), stdout);
+                 "<https://translationproject.org/team/>.\n"), stdout);
 #endif
       fputs (_("For complete documentation, run: info bison.\n"), stdout);
     }
@@ -469,7 +490,7 @@
 {
   /* Some efforts were made to ease the translators' task, please
      continue.  */
-  printf (_("bison (GNU Bison) %s"), VERSION);
+  printf ("bison (GNU Bison) %s", VERSION);
   putc ('\n', stdout);
   fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout);
   putc ('\n', stdout);
@@ -535,6 +556,7 @@
 static char const short_options[] =
   "D:"
   "F:"
+  "H::"
   "L:"
   "S:"
   "T::"
@@ -547,6 +569,7 @@
   "h"
   "k"
   "l"
+  "M:"
   "o:"
   "p:"
   "r:"
@@ -562,6 +585,7 @@
 {
   COLOR_OPTION = CHAR_MAX + 1,
   FIXED_OUTPUT_FILES_OPTION,
+  HTML_OPTION,
   LOCATIONS_OPTION,
   PRINT_DATADIR_OPTION,
   PRINT_LOCALEDIR_OPTION,
@@ -598,14 +622,17 @@
   { "yacc",           no_argument,         0, 'y' },
 
   /* Output Files. */
-  { "defines",     optional_argument,   0,   'd' },
-  { "report",      required_argument,   0,   'r' },
-  { "report-file", required_argument,   0,   REPORT_FILE_OPTION },
-  { "verbose",     no_argument,         0,   'v' },
-  { "file-prefix", required_argument,   0,   'b' },
-  { "output",      required_argument,   0,   'o' },
-  { "graph",       optional_argument,   0,   'g' },
-  { "xml",         optional_argument,   0,   'x' },
+  { "header",          optional_argument,   0,   'H' },
+  { "defines",         optional_argument,   0,   'd' },
+  { "report",          required_argument,   0,   'r' },
+  { "report-file",     required_argument,   0,   REPORT_FILE_OPTION },
+  { "verbose",         no_argument,         0,   'v' },
+  { "file-prefix",     required_argument,   0,   'b' },
+  { "output",          required_argument,   0,   'o' },
+  { "graph",           optional_argument,   0,   'g' },
+  { "html",            optional_argument,   0,   HTML_OPTION },
+  { "xml",             optional_argument,   0,   'x' },
+  { "file-prefix-map", required_argument,   0,   'M' },
 
   /* Hidden. */
   { "fixed-output-files", no_argument,       0,  FIXED_OUTPUT_FILES_OPTION },
@@ -616,8 +643,7 @@
 };
 
 /* Build a location for the current command line argument. */
-static
-location
+static location
 command_line_location (void)
 {
   location res;
@@ -707,10 +733,36 @@
         }
         break;
 
+      case 'H':
+      case 'd':
+        header_flag = true;
+        if (optarg)
+          {
+            free (spec_header_file);
+            spec_header_file = xstrdup (optarg);
+          }
+        break;
+
       case 'L':
         language_argmatch (optarg, command_line_prio, loc);
         break;
 
+      case 'M': // -MOLDPREFIX=NEWPREFIX
+        {
+          char *newprefix = strchr (optarg, '=');
+          if (newprefix)
+            {
+              *newprefix = '\0';
+              add_prefix_map (optarg, newprefix + 1);
+            }
+          else
+            {
+              complain (&loc, complaint, _("invalid argument for %s: %s"),
+                        quote ("--file-prefix-map"), quotearg_n (1, optarg));
+            }
+        }
+        break;
+
       case 'S':
         skeleton_arg (optarg, command_line_prio, loc);
         break;
@@ -735,16 +787,6 @@
         spec_file_prefix = optarg;
         break;
 
-      case 'd':
-        /* Here, the -d and --defines options are differentiated.  */
-        defines_flag = true;
-        if (optarg)
-          {
-            free (spec_header_file);
-            spec_header_file = xstrdup (optarg);
-          }
-        break;
-
       case 'g':
         graph_flag = true;
         if (optarg)
@@ -804,13 +846,23 @@
 
       case 'y':
         warning_argmatch ("yacc", 0, 0);
-        yacc_loc = loc;
+        set_yacc (loc);
         break;
 
       case COLOR_OPTION:
         /* Handled in getargs_colors. */
         break;
 
+      case HTML_OPTION:
+        html_flag = true;
+        xml_flag = true;
+        if (optarg)
+          {
+            free (spec_html_file);
+            spec_html_file = xstrdup (optarg);
+          }
+        break;
+
       case FIXED_OUTPUT_FILES_OPTION:
         complain (&loc, Wdeprecated,
                   _("deprecated option: %s, use %s"),
@@ -860,7 +912,7 @@
 void
 tr (char *s, char from, char to)
 {
-  for (; *s; s++)
+  for (; *s; ++s)
     if (*s == from)
       *s = to;
 }
diff --git a/src/getargs.h b/src/getargs.h
index ab6af6c..836c129 100644
--- a/src/getargs.h
+++ b/src/getargs.h
@@ -1,6 +1,6 @@
 /* Parse command line arguments for bison.
 
-   Copyright (C) 1984, 1986, 1989, 1992, 2000-2015, 2018-2019 Free
+   Copyright (C) 1984, 1986, 1989, 1992, 2000-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef GETARGS_H_
 # define GETARGS_H_
@@ -34,8 +34,9 @@
 /* for -I */
 extern char const *include;
 
-extern bool defines_flag;               /* for -d */
+extern bool header_flag;                /* for -d/-H */
 extern bool graph_flag;                 /* for -g */
+extern bool html_flag;                  /* for --html */
 extern bool xml_flag;                   /* for -x */
 extern bool no_lines_flag;              /* for -l */
 extern bool token_table_flag;           /* for -k */
@@ -77,8 +78,9 @@
     report_none             = 0,
     report_states           = 1 << 0,
     report_itemsets         = 1 << 1,
-    report_lookahead_tokens = 1 << 2,
+    report_lookaheads       = 1 << 2,
     report_solved_conflicts = 1 << 3,
+    report_cex              = 1 << 4,
     report_all              = ~0
   };
 /** What appears in the *.output file.  */
@@ -100,11 +102,13 @@
     trace_grammar   = 1 << 7,  /**< Reading, reducing the grammar. */
     trace_time      = 1 << 8,  /**< Time consumption. */
     trace_skeleton  = 1 << 9,  /**< Skeleton postprocessing. */
-    trace_m4        = 1 << 10, /**< M4 traces. */
-    trace_muscles   = 1 << 11, /**< M4 definitions of the muscles. */
-    trace_ielr      = 1 << 12, /**< IELR conversion. */
-    trace_closure   = 1 << 13, /**< Input/output of closure(). */
-    trace_locations = 1 << 14, /**< Full display of locations. */
+    trace_m4_early  = 1 << 10, /**< M4 early traces. */
+    trace_m4        = 1 << 11, /**< M4 traces. */
+    trace_muscles   = 1 << 12, /**< M4 definitions of the muscles. */
+    trace_ielr      = 1 << 13, /**< IELR conversion. */
+    trace_closure   = 1 << 14, /**< Input/output of closure(). */
+    trace_locations = 1 << 15, /**< Full display of locations. */
+    trace_cex       = 1 << 16, /**< Counterexample generation */
     trace_all       = ~0       /**< All of the above.  */
   };
 /** What debug items bison displays during its run.  */
@@ -136,6 +140,7 @@
 /* Used by parse-gram.y.  */
 void language_argmatch (char const *arg, int prio, location loc);
 void skeleton_arg (const char *arg, int prio, location loc);
+void set_yacc (location loc);
 
 /** In the string \c s, replace all characters \c from by \c to.  */
 void tr (char *s, char from, char to);
diff --git a/src/glyphs.c b/src/glyphs.c
new file mode 100644
index 0000000..d93fd8e
--- /dev/null
+++ b/src/glyphs.c
@@ -0,0 +1,93 @@
+/* Graphical symbols.
+
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "glyphs.h"
+
+#include <assert.h>
+#include <attribute.h>
+#include <stdbool.h>
+#include <string.h>
+#include <mbswidth.h>
+#include <unicodeio.h>
+
+
+glyph_buffer_t arrow;
+int arrow_width;
+
+glyph_buffer_t down_arrow;
+int down_arrow_width;
+
+glyph_buffer_t dot;
+int dot_width;
+
+glyph_buffer_t empty;
+int empty_width;
+
+const char *derivation_separator = " ";
+int derivation_separator_width = 1;
+
+typedef struct
+{
+  glyph_buffer_t *pbuf;
+  const char *fallback;
+} callback_arg_t;
+
+
+static long
+on_success (const char *buf, size_t buflen, void *callback_arg)
+{
+  callback_arg_t *arg = (callback_arg_t *) callback_arg;
+  assert (buflen + 1 < sizeof *arg->pbuf);
+  *stpncpy (*arg->pbuf, buf, buflen) = '\0';
+  return 1;
+}
+
+static long
+on_failure (unsigned code MAYBE_UNUSED, const char *msg MAYBE_UNUSED,
+            void *callback_arg)
+{
+  callback_arg_t *arg = (callback_arg_t *) callback_arg;
+  assert (strlen (arg->fallback) + 1 < sizeof *arg->pbuf);
+  strcpy (*arg->pbuf, arg->fallback);
+  return 0;
+}
+
+static bool
+glyph_set (glyph_buffer_t *glyph, int *width,
+           unsigned code, const char *fallback)
+{
+  callback_arg_t arg = { glyph, fallback };
+  int res = unicode_to_mb (code, on_success, on_failure, &arg);
+  *width = mbswidth (*glyph, 0);
+  return res;
+}
+
+void
+glyphs_init (void)
+{
+  glyph_set (&arrow,      &arrow_width,      0x2192, "->");
+  glyph_set (&dot,        &dot_width,        0x2022, ".");
+  glyph_set (&down_arrow, &down_arrow_width, 0x21b3, "`->");
+  glyph_set (&empty,      &empty_width,      0x03b5, "%empty");
+
+  strncat (down_arrow, " ", sizeof down_arrow - strlen (down_arrow) - 1);
+  down_arrow_width += 1;
+}
diff --git a/src/glyphs.h b/src/glyphs.h
new file mode 100644
index 0000000..dbbd32c
--- /dev/null
+++ b/src/glyphs.h
@@ -0,0 +1,50 @@
+/* Graphical symbols.
+
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef GLYPHS_H
+# define GLYPHS_H
+
+/* Initialize the following variables.  */
+void glyphs_init (void);
+
+/* In gnulib/lib/unicodeio.h unicode_to_mb uses a buffer of 25 bytes.
+   In down_arrow, we append one space.  */
+typedef char glyph_buffer_t[26];
+
+/* "→", separates the lhs of a rule from its rhs.  */
+extern glyph_buffer_t arrow;
+extern int arrow_width;
+
+/* "•", a point in an item (aka, a dotted rule).  */
+extern glyph_buffer_t dot;
+extern int dot_width;
+
+/* "↳ ", below an lhs to announce the rhs.  */
+extern glyph_buffer_t down_arrow;
+extern int down_arrow_width;
+
+/* "ε", an empty rhs.  */
+extern glyph_buffer_t empty;
+extern int empty_width;
+
+/* " ", separate symbols in the rhs of a derivation.  */
+extern const char *derivation_separator;
+extern int derivation_separator_width;
+
+#endif /* GLYPHS_H */
diff --git a/src/gram.c b/src/gram.c
index ffae27a..36b8a9d 100644
--- a/src/gram.c
+++ b/src/gram.c
@@ -1,6 +1,6 @@
 /* Allocate input grammar variables for Bison.
 
-   Copyright (C) 1984, 1986, 1989, 2001-2003, 2005-2015, 2018-2019 Free
+   Copyright (C) 1984, 1986, 1989, 2001-2003, 2005-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,13 +16,14 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
 
 #include "complain.h"
 #include "getargs.h"
+#include "glyphs.h"
 #include "gram.h"
 #include "print-xml.h"
 #include "reader.h"
@@ -40,39 +41,31 @@
 symbol **symbols = NULL;
 int nsyms = 0;
 int ntokens = 1;
-int nvars = 0;
+int nnterms = 0;
 
 symbol_number *token_translations = NULL;
 
-int max_user_token_number = 256;
+int max_code = 256;
 
 int required_version = 0;
 
-rule const *
-item_rule (item_number const *item)
-{
-  item_number const *sp = item;
-  while (0 <= *sp)
-    ++sp;
-  rule_number r = item_number_as_rule_number (*sp);
-  return &rules[r];
-}
-
-
 void
 item_print (item_number *item, rule const *previous_rule, FILE *out)
 {
   rule const *r = item_rule (item);
   rule_lhs_print (r, previous_rule ? previous_rule->lhs : NULL, out);
 
-  for (item_number *sp = r->rhs; sp < item; sp++)
-    fprintf (out, " %s", symbols[*sp]->tag);
-  fputs (" .", out);
   if (0 <= *r->rhs)
-    for (item_number *sp = item; 0 <= *sp; ++sp)
-      fprintf (out, " %s", symbols[*sp]->tag);
+    {
+      // Non-empty rhs.
+      for (item_number *sp = r->rhs; sp < item; sp++)
+        fprintf (out, " %s", symbols[*sp]->tag);
+      fprintf (out, " %s", dot);
+      for (item_number *sp = item; 0 <= *sp; ++sp)
+        fprintf (out, " %s", symbols[*sp]->tag);
+    }
   else
-    fprintf (out, " %%empty");
+    fprintf (out, " %s %s", empty, dot);
 }
 
 
@@ -132,7 +125,7 @@
     for (item_number *rhsp = r->rhs; 0 <= *rhsp; ++rhsp)
       fprintf (out, " %s", symbols[*rhsp]->tag);
   else
-    fputs (" %empty", out);
+    fprintf (out, " %s", empty);
 }
 
 static void
@@ -165,11 +158,22 @@
 ritem_print (FILE *out)
 {
   fputs ("RITEM\n", out);
+  bool first = true;
   for (int i = 0; i < nritems; ++i)
-    if (ritem[i] >= 0)
-      fprintf (out, "  %s", symbols[ritem[i]]->tag);
-    else
-      fprintf (out, "  (rule %d)\n", item_number_as_rule_number (ritem[i]));
+    {
+      if (first)
+        {
+          fprintf (out, "  %d: ", i);
+          first = false;
+        }
+      if (ritem[i] >= 0)
+        fprintf (out, "  %s", symbols[ritem[i]]->tag);
+      else
+        {
+          fprintf (out, "  (rule %d)\n", item_number_as_rule_number (ritem[i]));
+          first = true;
+        }
+    }
   fputs ("\n\n", out);
 }
 
@@ -202,10 +206,10 @@
       if (first)
         fprintf (out, "%s\n\n", title);
       else if (previous_rule && previous_rule->lhs != rules[r].lhs)
-        fputc ('\n', out);
+        putc ('\n', out);
       first = false;
       rule_print (&rules[r], previous_rule, out);
-      fputc ('\n', out);
+      putc ('\n', out);
       previous_rule = &rules[r];
     }
   if (!first)
@@ -251,15 +255,25 @@
    xml_puts (out, level + 1, "<rules/>");
 }
 
+static void
+section (FILE *out, const char *s)
+{
+  fprintf (out, "%s\n", s);
+  for (int i = strlen (s); 0 < i; --i)
+    putc ('-', out);
+  putc ('\n', out);
+  putc ('\n', out);
+}
+
 void
 grammar_dump (FILE *out, const char *title)
 {
   fprintf (out, "%s\n\n", title);
   fprintf (out,
-           "ntokens = %d, nvars = %d, nsyms = %d, nrules = %d, nritems = %d\n\n",
-           ntokens, nvars, nsyms, nrules, nritems);
+           "ntokens = %d, nnterms = %d, nsyms = %d, nrules = %d, nritems = %d\n\n",
+           ntokens, nnterms, nsyms, nrules, nritems);
 
-  fprintf (out, "Tokens\n------\n\n");
+  section (out, "Tokens");
   {
     fprintf (out, "Value  Sprec  Sassoc  Tag\n");
 
@@ -271,7 +285,7 @@
     fprintf (out, "\n\n");
   }
 
-  fprintf (out, "Non terminals\n-------------\n\n");
+  section (out, "Nonterminals");
   {
     fprintf (out, "Value  Tag\n");
 
@@ -281,7 +295,7 @@
     fprintf (out, "\n\n");
   }
 
-  fprintf (out, "Rules\n-----\n\n");
+  section (out, "Rules");
   {
     fprintf (out,
              "Num (Prec, Assoc, Useful, UselessChain) Lhs"
@@ -303,17 +317,17 @@
         /* Dumped the RHS. */
         for (item_number *rhsp = rule_i->rhs; 0 <= *rhsp; ++rhsp)
           fprintf (out, " %3d", *rhsp);
-        fputc ('\n', out);
+        putc ('\n', out);
       }
   }
   fprintf (out, "\n\n");
 
-  fprintf (out, "Rules interpreted\n-----------------\n\n");
+  section (out, "Rules interpreted");
   for (rule_number r = 0; r < nrules + nuseless_productions; ++r)
     {
       fprintf (out, "%-5d  %s:", r, rules[r].lhs->symbol->tag);
       rule_rhs_print (&rules[r], out);
-      fputc ('\n', out);
+      putc ('\n', out);
     }
   fprintf (out, "\n\n");
 }
diff --git a/src/gram.h b/src/gram.h
index 0f9ce3b..6e8a98d 100644
--- a/src/gram.h
+++ b/src/gram.h
@@ -1,6 +1,6 @@
 /* Data definitions for internal representation of Bison's input.
 
-   Copyright (C) 1984, 1986, 1989, 1992, 2001-2007, 2009-2015, 2018-2019
+   Copyright (C) 1984, 1986, 1989, 1992, 2001-2007, 2009-2015, 2018-2021
    Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,20 +16,20 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef GRAM_H_
 # define GRAM_H_
 
 /* Representation of the grammar rules:
 
-   NTOKENS is the number of tokens, and NVARS is the number of
-   variables (nonterminals).  NSYMS is the total number, ntokens +
-   nvars.
+   NTOKENS is the number of tokens, and NNTERMS is the number of
+   nonterminals (aka variables).  NSYMS is the total number, NTOKENS +
+   NNTERMS.
 
-   Each symbol (either token or variable) receives a symbol number.
+   Each symbol (either token or nterm) receives a symbol number.
    Numbers 0 to NTOKENS - 1 are for tokens, and NTOKENS to NSYMS - 1
-   are for variables.  Symbol number zero is the end-of-input token.
+   are for nterms.  Symbol number zero is the end-of-input token.
    This token is counted in ntokens.  The true number of token values
    assigned is NTOKENS reduced by one for each alias declaration.
 
@@ -41,10 +41,10 @@
    are 0, 1, 2...
 
    Internally, we cannot use the number 0 for a rule because for
-   instance RITEM stores both symbol (the RHS) and rule numbers: the
-   symbols are shorts >= 0, and rule number are stored negative.
+   instance RITEM stores both symbols (the RHS) and rule numbers: the
+   symbols are integers >= 0, and rule numbers are stored negative.
    Therefore 0 cannot be used, since it would be both the rule number
-   0, and the token $end).
+   0, and the token $end.
 
    Actions are accessed via the rule number.
 
@@ -55,8 +55,7 @@
 
    RULES[R].lhs -- the symbol of the left hand side of rule R.
 
-   RULES[R].rhs -- the index in RITEM of the beginning of the portion
-   for rule R.
+   RULES[R].rhs -- the beginning of the portion of RITEM for rule R.
 
    RULES[R].prec -- the symbol providing the precedence level of R.
 
@@ -75,20 +74,21 @@
 
    RULES[R].line -- the line where R was defined.
 
-   RULES[R].useful -- whether the rule is used (i.e., false if thrown
-   away by reduce).
+   RULES[R].useful -- whether the rule is used.  False if thrown away
+   by reduce().
 
-   The right hand side is stored as symbol numbers in a portion of
-   RITEM.
+   The right hand side of rules is stored as symbol numbers in a
+   portion of RITEM.
 
    The length of the portion is one greater than the number of symbols
    in the rule's right hand side.  The last element in the portion
-   contains minus R, which identifies it as the end of a portion and
-   says which rule it is for.
+   contains -R, which identifies it as the end of a portion and says
+   which rule it is for.
 
    The portions of RITEM come in order of increasing rule number.
    NRITEMS is the total length of RITEM.  Each element of RITEM is
-   called an "item" and its index in RITEM is an item number.
+   called an "item" of type item_number and its index in RITEM is an
+   item_index.
 
    Item numbers are used in the finite state machine to represent
    places that parsing can get to.
@@ -102,6 +102,8 @@
 
    Associativities are recorded similarly in SYMBOLS[I]->assoc.  */
 
+# include "system.h"
+
 # include "location.h"
 # include "symtab.h"
 
@@ -110,13 +112,17 @@
 
 extern int nsyms;
 extern int ntokens;
-extern int nvars;
+extern int nnterms;
 
+/* Elements of ritem. */
 typedef int item_number;
 # define ITEM_NUMBER_MAX INT_MAX
 extern item_number *ritem;
 extern int nritems;
 
+/* Indices into ritem. */
+typedef unsigned int item_index;
+
 /* There is weird relationship between OT1H item_number and OTOH
    symbol_number and rule_number: we store the latter in
    item_number.  symbol_number values are stored as-is, while
@@ -174,7 +180,7 @@
 {
   /* The number of the rule in the source.  It is usually the index in
      RULES too, except if there are useless rules.  */
-  rule_number user_number;
+  rule_number code;
 
   /* The index in RULES.  Usually the rule number in the source,
      except if some rules are useless.  */
@@ -211,7 +217,15 @@
 extern rule_number nrules;
 
 /* Get the rule associated to this item.  ITEM points inside RITEM.  */
-rule const *item_rule (item_number const *item);
+static inline rule const *
+item_rule (item_number const *item)
+{
+  item_number const *sp = item;
+  while (!item_number_is_rule_number (*sp))
+    ++sp;
+  rule_number r = item_number_as_rule_number (*sp);
+  return &rules[r];
+}
 
 /* Pretty-print this ITEM (as in the report).  ITEM points inside
    RITEM.  PREVIOUS_RULE is used to see if the lhs is common, in which
@@ -219,9 +233,24 @@
 void item_print (item_number *item, rule const *previous_rule,
                  FILE *out);
 
+/*--------.
+| Rules.  |
+`--------*/
+
 /* A function that selects a rule.  */
 typedef bool (*rule_filter) (rule const *);
 
+/* Whether is an accepting rule (i.e., its reduction terminates
+   parsing with success). */
+static inline bool
+rule_is_initial (rule const *r)
+{
+  /* In the case of multistart, we need to check whether the LHS is
+     $accept.  In the case of "unistart", it would suffice to
+     check whether this is rule number 0.  */
+  return r->lhs == acceptsymbol->content;
+}
+
 /* Whether the rule has a 'number' smaller than NRULES.  That is, it
    is useful in the grammar.  */
 bool rule_useful_in_grammar_p (rule const *r);
@@ -263,7 +292,7 @@
    by the user's yylex routine, it yields the internal token number
    used by the parser and throughout bison.  */
 extern symbol_number *token_translations;
-extern int max_user_token_number;
+extern int max_code;
 
 
 
diff --git a/src/graphviz.c b/src/graphviz.c
index 4a826cb..32dcf71 100644
--- a/src/graphviz.c
+++ b/src/graphviz.c
@@ -1,6 +1,6 @@
 /* Output Graphviz specification of a state machine generated by Bison.
 
-   Copyright (C) 2006-2007, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2006-2007, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Paul Eggert and Satya Kiran Popuri.  */
 
@@ -72,18 +72,20 @@
 {
   fprintf (fout, "  %d -> %d [style=%s", source, destination, style);
   if (label)
-    fprintf (fout, " label=%s", quote (label));
+    {
+      fputs (" label=\"", fout);
+      for (const char *cp = label; *cp; ++cp)
+        switch (*cp)
+        {
+        case '"':  fputs ("\\\"", fout); break;
+        case '\\': fputs ("\\\\", fout); break;
+        default:   fputc (*cp,    fout); break;
+        }
+      fputc ('"', fout);
+    }
   fputs ("]\n", fout);
 }
 
-char const *
-escape (char const *name)
-{
-  char *q = quote (name);
-  q[strlen (q) - 1] = '\0';
-  return q + 1;
-}
-
 static void
 no_reduce_bitset_init (state const *s, bitset *no_reduce_set)
 {
@@ -99,6 +101,7 @@
       bitset_set (*no_reduce_set, s->errs->symbols[n]->content->number);
 }
 
+/* Show the reductions from state SOURCE on rule RULENO. */
 static void
 conclude_red (struct obstack *out, int source, rule_number ruleno,
               bool enabled, bool first, FILE *fout)
@@ -110,8 +113,6 @@
   else
     {
       char const *ed = enabled ? "" : "d";
-      char const *color = enabled ? ruleno ? "3" : "1" : "5";
-
       /* First, build the edge's head. The name of reduction nodes is "nRm",
          with n the source state and m the rule number. This is because we
          don't want all the reductions bearing a same rule number to point to
@@ -134,11 +135,16 @@
       /* Build the associated diamond representation of the target rule. */
       fprintf (fout, " \"%dR%d%s\" [label=\"",
                source, ruleno, ed);
-      if (ruleno)
-        fprintf (fout, "R%d", ruleno);
-      else
+      bool const final = rule_is_initial (&rules[ruleno]);
+      if (final)
         fprintf (fout, "Acc");
+      else
+        fprintf (fout, "R%d", ruleno);
 
+      char const *color
+        = !enabled ? "5"
+        : final    ? "1"
+        :            "3";
       fprintf (fout, "\", fillcolor=%s, shape=diamond, style=filled]\n",
                color);
     }
@@ -149,7 +155,7 @@
 {
   if (! first)
     obstack_sgrow (out, ", ");
-  obstack_sgrow (out, escape (tok));
+  obstack_backslash (out, tok);
   return false;
 }
 
@@ -182,9 +188,9 @@
       bool firste = true;
       rule_number ruleno = reds->rules[j]->number;
 
-      if (reds->lookahead_tokens)
+      if (reds->lookaheads)
         for (int i = 0; i < ntokens; i++)
-          if (bitset_test (reds->lookahead_tokens[j], i))
+          if (bitset_test (reds->lookaheads[j], i))
             {
               if (bitset_test (no_reduce_set, i))
                 firstd = print_token (&dout, firstd, symbols[i]->tag);
diff --git a/src/graphviz.h b/src/graphviz.h
index cceb1fb..51fd65d 100644
--- a/src/graphviz.h
+++ b/src/graphviz.h
@@ -1,6 +1,6 @@
 /* Output Graphviz specification of a state machine generated by Bison.
 
-   Copyright (C) 2006, 2010-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 2006, 2010-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* Written by Paul Eggert and Satya Kiran Popuri.  */
 
@@ -63,10 +63,4 @@
  */
 void finish_graph (FILE *fout);
 
-/** Escape a lookahead token.
- *
- * \param name         the token.
- */
-char const *escape (char const *name);
-
 #endif /* ! GRAPHVIZ_H_ */
diff --git a/src/i18n-strings.c b/src/i18n-strings.c
new file mode 100644
index 0000000..05dee48
--- /dev/null
+++ b/src/i18n-strings.c
@@ -0,0 +1,37 @@
+/* This file is not compiled in, it is used only to expose more
+   strings to gettextize.
+
+   Why is this needed?
+
+   Bison emits strings to translate in the generated code, for builtin
+   tokens.  So they appear only in generated parsers, which are not
+   shipped, so they are not in the src tree, so we cannot use them in
+   our POTFILE.
+
+   Except src/parse-gram.c, which is in the source tree.  And even in
+   the git repo.  But to avoid useless diffs in the repo, we do not
+   keep the #line directives in the src tree.  Yet, for the user, we
+   ship a src/parse-gram.c _with_ the #lines.  This is done in a
+   dist-hook which regenerates src/parse-gram.c when we run "make
+   dist".
+
+   Unfortunately, then, update-po traverses the whole tree and sees
+   that the location of the strings to translate in src/parse-gram.c
+   have changed, so the bison.pot is to be updated.  And that is not
+   possible in the "make dist" which is run within "make distcheck"
+   (not the one preparing the dist for distcheck, the one run by
+   distcheck to check that a distributed tarball can build a tarball)
+   because then the src tree is read-only.
+
+   So let's not put src/parse-gram.c in the POTFILE, and expose these
+   strings to gettextize by hand.
+  */
+
+// Please syntax-check.
+#include <config.h>
+
+static const char *const msgid[] =
+  {
+    N_("end of file"),
+    N_("invalid token")
+  }
diff --git a/src/ielr.c b/src/ielr.c
index 24f6088..44c6e7a 100644
--- a/src/ielr.c
+++ b/src/ielr.c
@@ -1,6 +1,6 @@
 /* IELR main implementation.
 
-   Copyright (C) 2009-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,13 +15,14 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
-#include "system.h"
 
 #include "ielr.h"
 
+#include "system.h"
+
 #include <bitset.h>
 #include <timevar.h>
 
@@ -82,19 +83,22 @@
   while (0 < i)
     {
       --i;
+      // Walk the RHS right to left, as long as it's symbol,
+      // nonterminal, nullable.
       while (!item_number_is_rule_number (ritem[i])
              && ISVAR (ritem[i])
              && nullable [item_number_as_symbol_number (ritem[i]) - ntokens])
         bitset_set (result, i--);
       if (!item_number_is_rule_number (ritem[i]) && ISVAR (ritem[i]))
         bitset_set (result, i--);
+      // Flush the remainder of the RHS.
       while (!item_number_is_rule_number (ritem[i]) && 0 < i)
         --i;
     }
   if (trace_flag & trace_ielr)
     {
-      fprintf (stderr, "ritem_sees_lookahead_set:\n");
-      debug_bitset (result);
+      fprintf (stderr, "ritem_sees_lookahead_set (indexes of ritems): ");
+      bitset_dump (stderr, result);
       fprintf (stderr, "\n");
     }
   return result;
@@ -230,7 +234,7 @@
   for (goto_number i = 0; i < ngotos; ++i)
     {
       size_t nitems = states[from_state[i]]->nitems;
-      item_number *items = states[from_state[i]]->items;
+      item_index *items = states[from_state[i]]->items;
       for (size_t j = 0; j < nitems; ++j)
         /* If this item has this goto and if all subsequent symbols in this
            RHS (if any) are nullable nonterminals, then record this item as
@@ -318,7 +322,7 @@
 ielr_compute_predecessors (void)
 {
   int *predecessor_counts = xnmalloc (nstates, sizeof *predecessor_counts);
-  state ***result = xnmalloc (nstates, sizeof *result);
+  state ***res = xnmalloc (nstates, sizeof *res);
   for (state_number i = 0; i < nstates; ++i)
     predecessor_counts[i] = 0;
   for (state_number i = 0; i < nstates; ++i)
@@ -326,18 +330,18 @@
       ++predecessor_counts[states[i]->transitions->states[j]->number];
   for (state_number i = 0; i < nstates; ++i)
     {
-      result[i] = xnmalloc (predecessor_counts[i]+1, sizeof *result[i]);
-      result[i][predecessor_counts[i]] = NULL;
+      res[i] = xnmalloc (predecessor_counts[i]+1, sizeof *res[i]);
+      res[i][predecessor_counts[i]] = NULL;
       predecessor_counts[i] = 0;
     }
   for (state_number i = 0; i < nstates; ++i)
     for (int j = 0; j < states[i]->transitions->num; ++j)
       {
         state_number k = states[i]->transitions->states[j]->number;
-        result[k][predecessor_counts[k]++] = states[i];
+        res[k][predecessor_counts[k]++] = states[i];
       }
   free (predecessor_counts);
-  return result;
+  return res;
 }
 
 /**
@@ -412,24 +416,21 @@
          didn't change this test to an aver just in case the usage of this
          function evolves to need those two cases.  In both cases, the current
          implementation returns the right result.  */
-      if (s->items[item] > 1)
+      const rule *r = item_rule (&ritem[s->items[item]]);
+      const bool is_successor_of_initial_item
+        = rule_is_initial (r) && &ritem[s->items[item]] == r->rhs + 1;
+      aver (!is_successor_of_initial_item);
+      if (!is_successor_of_initial_item)
         {
           /* If the LHS symbol of this item isn't known (because this is a
              top-level invocation), go get it.  */
           if (!lhs)
-            {
-              int i;
-              for (i = s->items[item];
-                   !item_number_is_rule_number (ritem[i]);
-                   ++i)
-                continue;
-              lhs = rules[item_number_as_rule_number (ritem[i])].lhs->number;
-            }
+            lhs = r->lhs->number;
           /* If this kernel item is next to the beginning of the RHS, then
              check all predecessors' goto follows for the LHS.  */
           if (item_number_is_rule_number (ritem[s->items[item] - 2]))
             {
-              aver (lhs != accept->content->number);
+              aver (lhs != acceptsymbol->content->number);
               for (state **predecessor = predecessors[s->number];
                    *predecessor;
                    ++predecessor)
@@ -571,6 +572,24 @@
   struct state_list *nextIsocore;
 } state_list;
 
+MAYBE_UNUSED static void
+state_list_print_ (const state_list *s, FILE *out, const char *sep)
+{
+  if (s)
+    {
+      fprintf (out, "%s%d", sep, s->state->number);
+      state_list_print_ (s->next, out, " ");
+    }
+}
+
+MAYBE_UNUSED static void
+state_list_print (const state_list *s, FILE *out)
+{
+  fprintf (out, "{");
+  state_list_print_ (s, out, "");
+  fprintf (out, "}");
+}
+
 /**
  * \pre
  *   - \c follow_kernel_items and \c always_follows were computed by
@@ -628,21 +647,18 @@
          a special case to avoid the - 2 below, but the next successor can be
          handled fine without special casing it.  */
       aver (t->items[t_item] != 0);
-      if (t->items[t_item] > 1
+      const rule *r = item_rule (&ritem[t->items[t_item]]);
+      const bool is_successor_of_initial_item
+        = rule_is_initial (r) && &ritem[t->items[t_item]] == r->rhs + 1;
+      if (!is_successor_of_initial_item
           && !bitset_empty_p (lookahead_filter[t_item]))
         {
+          /* Is this kernel item next to the beginning of the RHS?  */
           if (item_number_is_rule_number (ritem[t->items[t_item] - 2]))
-            {
-              int rule_item;
-              for (rule_item = t->items[t_item];
-                   !item_number_is_rule_number (ritem[rule_item]);
-                   ++rule_item)
-                ;
-              ielr_compute_goto_follow_set (
-                follow_kernel_items, always_follows, s,
-                rules[item_number_as_rule_number (ritem[rule_item])].lhs,
-                lookaheads[t_item]);
-            }
+            ielr_compute_goto_follow_set (
+              follow_kernel_items, always_follows, s,
+              r->lhs,
+              lookaheads[t_item]);
           else if (s->lookaheads)
             {
               /* We don't have to start the s item search at the beginning
@@ -709,15 +725,17 @@
   /* Determine whether there's an isocore of t with which these lookaheads can
      be merged.  */
   {
-    AnnotationIndex ai;
-    AnnotationList *a;
     if (annotation_lists)
-      for (ai = 0, a = annotation_lists[lr0_isocore->state->number];
-           a;
-           ++ai, a = a->next)
+      {
+        AnnotationIndex ai;
+        AnnotationList *a;
+        for (ai = 0, a = annotation_lists[lr0_isocore->state->number];
+             a;
+             ++ai, a = a->next)
         work1[ai] =
           AnnotationList__computeDominantContribution (
             a, lr0_isocore->state->nitems, lookaheads, false);
+      }
     for (this_isocorep = &t->state_list;
          this_isocorep == &t->state_list || *this_isocorep != t->state_list;
          this_isocorep = &(*this_isocorep)->nextIsocore)
@@ -726,6 +744,8 @@
           break;
         if (annotation_lists)
           {
+            AnnotationIndex ai;
+            AnnotationList *a;
             for (ai = 0, a = annotation_lists[lr0_isocore->state->number];
                  a;
                  ++ai, a = a->next)
@@ -789,15 +809,14 @@
          actually new.  */
       if (has_lookaheads)
         {
-          size_t i;
           if (!(*this_isocorep)->lookaheads)
             {
               (*this_isocorep)->lookaheads =
                 xnmalloc (t->nitems, sizeof (*this_isocorep)->lookaheads);
-              for (i = 0; i < t->nitems; ++i)
+              for (size_t i = 0; i < t->nitems; ++i)
                 (*this_isocorep)->lookaheads[i] = NULL;
             }
-          for (i = 0; i < t->nitems; ++i)
+          for (size_t i = 0; i < t->nitems; ++i)
             if (!bitset_empty_p (lookaheads[i]))
               {
                 if (!(*this_isocorep)->lookaheads[i])
@@ -992,7 +1011,7 @@
          this_state;
          this_state = this_state->next)
       {
-        state *s = this_state->state;
+        const state *s = this_state->state;
         for (int i = 0; i < s->transitions->num; ++i)
           {
             state *t = s->transitions->states[i];
@@ -1030,12 +1049,12 @@
         if (!node->state->consistent)
           {
             size_t i = 0;
-            item_number *itemset = node->state->items;
+            item_index *itemset = node->state->items;
             for (size_t r = 0; r < node->state->reductions->num; ++r)
               {
                 rule *this_rule = node->state->reductions->rules[r];
                 bitset lookahead_set =
-                  node->state->reductions->lookahead_tokens[r];
+                  node->state->reductions->lookaheads[r];
                 if (item_number_is_rule_number (*this_rule->rhs))
                   ielr_compute_goto_follow_set (follow_kernel_items,
                                                 always_follows, node,
diff --git a/src/ielr.h b/src/ielr.h
index 17dcb2c..e0dcf64 100644
--- a/src/ielr.h
+++ b/src/ielr.h
@@ -1,6 +1,6 @@
 /* IELR main implementation.
 
-   Copyright (C) 2009-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,7 +15,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef IELR_H_
 # define IELR_H_
diff --git a/src/lalr.c b/src/lalr.c
index bb9491e..7dda0a2 100644
--- a/src/lalr.c
+++ b/src/lalr.c
@@ -1,6 +1,6 @@
 /* Compute lookahead criteria for Bison.
 
-   Copyright (C) 1984, 1986, 1989, 2000-2015, 2018-2019 Free Software
+   Copyright (C) 1984, 1986, 1989, 2000-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 
 /* Find which rules need lookahead in each state, and which lookahead
@@ -40,7 +40,6 @@
 #include "relation.h"
 #include "symtab.h"
 
-/* goto_map[nterm - NTOKENS] -> number of gotos.  */
 goto_number *goto_map = NULL;
 goto_number ngotos = 0;
 state_number *from_state = NULL;
@@ -92,14 +91,16 @@
   const state_number dst = to_state[i];
   symbol_number var = states[dst]->accessing_symbol;
   fprintf (out,
-           "goto[%ld] = (%d, %s, %d)", i, src, symbols[var]->tag, dst);
+           "goto[%zu] = (%d, %s, %d)", i, src, symbols[var]->tag, dst);
 }
 
 void
 set_goto_map (void)
 {
   /* Count the number of gotos (ngotos) per nterm (goto_map). */
-  goto_map = xcalloc (nvars + 1, sizeof *goto_map);
+  if (trace_flag & trace_automaton)
+    fprintf (stderr, "nnterms: %d\n", nnterms);
+  goto_map = xcalloc (nnterms + 1, sizeof *goto_map);
   ngotos = 0;
   for (state_number s = 0; s < nstates; ++s)
     {
@@ -113,7 +114,7 @@
         }
     }
 
-  goto_number *temp_map = xnmalloc (nvars + 1, sizeof *temp_map);
+  goto_number *temp_map = xnmalloc (nnterms + 1, sizeof *temp_map);
   {
     goto_number k = 0;
     for (symbol_number i = ntokens; i < nsyms; ++i)
@@ -146,11 +147,17 @@
   free (temp_map);
 
   if (trace_flag & trace_automaton)
-    for (int i = 0; i < ngotos; ++i)
-      {
-        goto_print (i, stderr);
-        fputc ('\n', stderr);
-      }
+    {
+      for (int i = 0; i < nnterms; ++i)
+        fprintf (stderr, "goto_map[%d (%s)] = %ld .. %ld\n",
+                 i, symbols[ntokens + i]->tag,
+                 goto_map[i], goto_map[i+1] - 1);
+      for (int i = 0; i < ngotos; ++i)
+        {
+          goto_print (i, stderr);
+          fputc ('\n', stderr);
+        }
+    }
 }
 
 
@@ -158,6 +165,7 @@
 map_goto (state_number src, symbol_number sym)
 {
   goto_number low = goto_map[sym - ntokens];
+  assert (goto_map[sym - ntokens] != goto_map[sym - ntokens + 1]);
   goto_number high = goto_map[sym - ntokens + 1] - 1;
 
   for (;;)
@@ -256,9 +264,9 @@
   state *res = NULL;
   for (int j = 0; j < nstates; ++j)
     if (states[j]->reductions
-        && states[j]->reductions->lookahead_tokens)
+        && states[j]->reductions->lookaheads)
       {
-        if (states[j]->reductions->lookahead_tokens - LA > lookback_index)
+        if (states[j]->reductions->lookaheads - LA > lookback_index)
           /* Went too far. */
           break;
         else
@@ -280,7 +288,7 @@
     {
       fprintf (out, "   %3d = ", i);
       const state *s = lookback_find_state (i);
-      int rnum = i - (s->reductions->lookahead_tokens - LA);
+      int rnum = i - (s->reductions->lookaheads - LA);
       const rule *r = s->reductions->rules[rnum];
       fprintf (out, "(%3d, ", s->number);
       rule_print (r, NULL, out);
@@ -305,7 +313,7 @@
 add_lookback_edge (state *s, rule const *r, goto_number gotono)
 {
   int ri = state_reduction_find (s, r);
-  int idx = (s->reductions->lookahead_tokens - LA) + ri;
+  int idx = (s->reductions->lookaheads - LA) + ri;
   lookback[idx] = goto_list_new (gotono, lookback[idx]);
 }
 
@@ -421,7 +429,7 @@
 
 
 static void
-compute_lookahead_tokens (void)
+compute_lookaheads (void)
 {
   if (trace_flag & trace_automaton)
       lookback_print (stderr);
@@ -437,13 +445,12 @@
 }
 
 
-/*----------------------------------------------------.
-| Count the number of lookahead tokens required for S |
-| (N_LOOKAHEAD_TOKENS member).                        |
-`----------------------------------------------------*/
+/*------------------------------------------------------.
+| Count the number of lookahead tokens required for S.  |
+`------------------------------------------------------*/
 
 static int
-state_lookahead_tokens_count (state *s, bool default_reduction_only_for_accept)
+state_lookaheads_count (state *s, bool default_reduction_only_for_accept)
 {
   const reductions *reds = s->reductions;
   const transitions *trans = s->transitions;
@@ -466,16 +473,16 @@
   s->consistent =
     !(reds->num > 1
       || (reds->num == 1 && trans->num && TRANSITION_IS_SHIFT (trans, 0))
-      || (reds->num == 1 && reds->rules[0]->number != 0
+      || (reds->num == 1 && !rule_is_initial (reds->rules[0])
           && default_reduction_only_for_accept));
 
   return s->consistent ? 0 : reds->num;
 }
 
 
-/*----------------------------------------------------.
-| Compute LA, NLA, and the lookahead_tokens members.  |
-`----------------------------------------------------*/
+/*----------------------------------------------.
+| Compute LA, NLA, and the lookaheads members.  |
+`----------------------------------------------*/
 
 void
 initialize_LA (void)
@@ -491,25 +498,23 @@
   /* Compute the total number of reductions requiring a lookahead.  */
   nLA = 0;
   for (state_number i = 0; i < nstates; ++i)
-    nLA +=
-      state_lookahead_tokens_count (states[i],
-                                    default_reduction_only_for_accept);
+    nLA += state_lookaheads_count (states[i],
+                                   default_reduction_only_for_accept);
   /* Avoid having to special case 0.  */
   if (!nLA)
     nLA = 1;
 
   bitsetv pLA = LA = bitsetv_create (nLA, ntokens, BITSET_FIXED);
 
-  /* Initialize the members LOOKAHEAD_TOKENS for each state whose reductions
+  /* Initialize the members LOOKAHEADS for each state whose reductions
      require lookahead tokens.  */
   for (state_number i = 0; i < nstates; ++i)
     {
-      int count =
-        state_lookahead_tokens_count (states[i],
-                                      default_reduction_only_for_accept);
+      int count = state_lookaheads_count (states[i],
+                                          default_reduction_only_for_accept);
       if (count)
         {
-          states[i]->reductions->lookahead_tokens = pLA;
+          states[i]->reductions->lookaheads = pLA;
           pLA += count;
         }
     }
@@ -521,7 +526,7 @@
 `---------------------------------------------*/
 
 static void
-lookahead_tokens_print (FILE *out)
+lookaheads_print (FILE *out)
 {
   fputs ("Lookaheads:\n", out);
   for (state_number i = 0; i < nstates; ++i)
@@ -533,11 +538,11 @@
           for (int j = 0; j < reds->num; ++j)
             {
               fprintf (out, "    rule %d:", reds->rules[j]->number);
-              if (reds->lookahead_tokens)
+              if (reds->lookaheads)
               {
                 bitset_iterator iter;
                 int k;
-                BITSET_FOR_EACH (iter, reds->lookahead_tokens[j], k, 0)
+                BITSET_FOR_EACH (iter, reds->lookaheads[j], k, 0)
                   fprintf (out, " %s", symbols[k]->tag);
               }
               fputc ('\n', out);
@@ -564,10 +569,10 @@
   lookback = xcalloc (nLA, sizeof *lookback);
   build_relations ();
   compute_follows ();
-  compute_lookahead_tokens ();
+  compute_lookaheads ();
 
   if (trace_flag & trace_sets)
-    lookahead_tokens_print (stderr);
+    lookaheads_print (stderr);
   if (trace_flag & trace_automaton)
     {
       begin_use_class ("trace0", stderr);
@@ -583,7 +588,7 @@
 {
   goto_number ngotos_reachable = 0;
   symbol_number nonterminal = 0;
-  aver (nsyms == nvars + ntokens);
+  aver (nsyms == nnterms + ntokens);
 
   for (goto_number i = 0; i < ngotos; ++i)
     {
@@ -601,7 +606,7 @@
           ++ngotos_reachable;
         }
     }
-  while (nonterminal <= nvars)
+  while (nonterminal <= nnterms)
     {
       aver (ngotos == goto_map[nonterminal]);
       goto_map[nonterminal++] = ngotos_reachable;
@@ -614,6 +619,6 @@
 lalr_free (void)
 {
   for (state_number s = 0; s < nstates; ++s)
-    states[s]->reductions->lookahead_tokens = NULL;
+    states[s]->reductions->lookaheads = NULL;
   bitsetv_free (LA);
 }
diff --git a/src/lalr.h b/src/lalr.h
index 1ef3c40..548c382 100644
--- a/src/lalr.h
+++ b/src/lalr.h
@@ -1,7 +1,7 @@
 /* Compute lookahead criteria for bison,
 
    Copyright (C) 1984, 1986, 1989, 2000, 2002, 2004, 2006-2007,
-   2009-2015, 2018-2019 Free Software Foundation, Inc.
+   2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef LALR_H_
 # define LALR_H_
diff --git a/src/local.mk b/src/local.mk
index ee8ec03..6aba0af 100644
--- a/src/local.mk
+++ b/src/local.mk
@@ -1,4 +1,4 @@
-## Copyright (C) 2001-2015, 2018-2019 Free Software Foundation, Inc.
+## Copyright (C) 2001-2015, 2018-2021 Free Software Foundation, Inc.
 ##
 ## This program is free software: you can redistribute it and/or modify
 ## it under the terms of the GNU General Public License as published by
@@ -11,7 +11,7 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 CLEANDIRS += %D%/*.dSYM
 
@@ -40,6 +40,10 @@
   src/complain.h                                \
   src/conflicts.c                               \
   src/conflicts.h                               \
+  src/counterexample.c                          \
+  src/counterexample.h                          \
+  src/derivation.c                              \
+  src/derivation.h                              \
   src/derives.c                                 \
   src/derives.h                                 \
   src/files.c                                   \
@@ -49,6 +53,8 @@
   src/flex-scanner.h                            \
   src/getargs.c                                 \
   src/getargs.h                                 \
+  src/glyphs.c                                  \
+  src/glyphs.h                                  \
   src/gram.c                                    \
   src/gram.h                                    \
   src/graphviz.c                                \
@@ -61,6 +67,8 @@
   src/location.h                                \
   src/lr0.c                                     \
   src/lr0.h                                     \
+  src/lssi.c                                    \
+  src/lssi.h                                    \
   src/main.c                                    \
   src/muscle-tab.c                              \
   src/muscle-tab.h                              \
@@ -71,6 +79,8 @@
   src/output.c                                  \
   src/output.h                                  \
   src/parse-gram.y                              \
+  src/parse-simulation.c                        \
+  src/parse-simulation.h                        \
   src/print-graph.c                             \
   src/print-graph.h                             \
   src/print-xml.c                               \
@@ -91,6 +101,10 @@
   src/scan-skel.h                               \
   src/state.c                                   \
   src/state.h                                   \
+  src/state-item.c                              \
+  src/state-item.h                              \
+  src/strversion.c                              \
+  src/strversion.h                              \
   src/symlist.c                                 \
   src/symlist.h                                 \
   src/symtab.c                                  \
@@ -117,19 +131,24 @@
 # definition of libbison, beware that they might expand as flags such as
 # `-lm`.  Keep them here.  Or use a Libtool convenience library.
 src_bison_LDADD =                               \
+  lib/libbison.a                                \
   $(ISNAND_LIBM)                                \
   $(ISNANF_LIBM)                                \
   $(ISNANL_LIBM)                                \
   $(LDEXPL_LIBM)                                \
   $(LDEXP_LIBM)                                 \
-  $(LIBINTL)                                    \
   $(LIBTHREAD)                                  \
   $(LIB_CLOCK_GETTIME)                          \
   $(LIB_GETHRXTIME)                             \
-  $(LIBTEXTSTYLE)                               \
-  lib/libbison.a
+  $(LIB_HARD_LOCALE)                            \
+  $(LIB_MBRTOWC)                                \
+  $(LIB_SETLOCALE_NULL)                         \
+  $(LIBICONV)                                   \
+  $(LIBINTL)                                    \
+  $(LIBTEXTSTYLE)
 
 
+EXTRA_DIST += %D%/i18n-strings.c
 
 
 ## ------ ##
diff --git a/src/location.c b/src/location.c
index 357cce7..5edce82 100644
--- a/src/location.c
+++ b/src/location.c
@@ -1,6 +1,6 @@
 /* Locations for Bison
 
-   Copyright (C) 2002, 2005-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 2002, 2005-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
@@ -40,18 +40,6 @@
 
 location const empty_loc = EMPTY_LOCATION_INIT;
 
-static int
-min_int (int a, int b)
-{
-  return a < b ? a : b;
-}
-
-static int
-max_int (int a, int b)
-{
-  return a >= b ? a : b;
-}
-
 /* The terminal width.  Not less than 40.  */
 static int
 columns (void)
@@ -167,7 +155,9 @@
 location_print (location loc, FILE *out)
 {
   int res = 0;
-  if (trace_flag & trace_locations)
+  if (location_empty (loc))
+    res += fprintf (out, "(empty location)");
+  else if (trace_flag & trace_locations)
     {
       res += boundary_print (&loc.start, out);
       res += fprintf (out, "-");
@@ -175,6 +165,8 @@
     }
   else
     {
+      aver (loc.start.file);
+      aver (loc.end.file);
       int end_col = 0 != loc.end.column ? loc.end.column - 1 : 0;
       res += fprintf (out, "%s",
                       quotearg_n_style (3, escape_quoting_style, loc.start.file));
@@ -317,7 +309,7 @@
 
 /* Move CARET_INFO (which has a valid FILE) to the line number LINE.
    Compute and cache that line's length in CARET_INFO.LINE_LEN.
-   Return whether succesful.*/
+   Return whether successful.  */
 static bool
 caret_set_line (int line)
 {
@@ -400,6 +392,8 @@
 void
 location_caret (location loc, const char *style, FILE *out)
 {
+  if (!(feature_flag & feature_caret))
+    return;
   if (!loc.start.line)
     return;
   if (!caret_set_file (loc.start.file))
@@ -421,12 +415,14 @@
       {
         /* The last column to highlight.  Only the first line of
            multiline locations are quoted, in which case the ending
-           column is the end of line.  Single point locations (with
-           equal boundaries) denote the character that they
-           follow.  */
-        int col_end
+           column is the end of line.
+
+           We used to work with byte offsets, and that was much
+           easier.  However, we went back to using (visual) columns to
+           support truncating of long lines.  */
+        const int col_end
           = loc.start.line == loc.end.line
-          ? loc.end.column + (loc.start.column == loc.end.column)
+          ? loc.end.column
           : caret_info.line_len;
         /* Quote the file (at most the first line in the case of
            multiline locations).  */
@@ -436,24 +432,28 @@
              expected (maybe the file was changed since the scanner
              ran), we might reach the end before we actually saw the
              opening column.  */
-          bool opened = false;
+          enum { before, inside, after } state = before;
           while (!mb_iseof (c) && !mb_iseq (c, '\n'))
             {
-              if (caret_info.pos.column == loc.start.column)
+              // We might have already opened (and even closed!) the
+              // style and yet have the equality of the columns if we
+              // just saw zero-width characters.
+              if (state == before
+                  && caret_info.pos.column == loc.start.column)
                 {
                   begin_use_class (style, out);
-                  opened = true;
+                  state = inside;
                 }
               if (skip < caret_info.pos.column)
                 mb_putc (c, out);
               boundary_compute (&caret_info.pos, mb_ptr (c), mb_len (c));
               caret_getc (c);
-              if (opened
+              if (state == inside
                   && (caret_info.pos.column == col_end
                       || width < caret_info.pos.column - skip))
                 {
                   end_use_class (style, out);
-                  opened = false;
+                  state = after;
                 }
               if (width < caret_info.pos.column - skip)
                 {
@@ -461,6 +461,12 @@
                   break;
                 }
             }
+          if (state == inside)
+            {
+              // The line is shorter than expected.
+              end_use_class (style, out);
+              state = after;
+            }
           putc ('\n', out);
         }
 
@@ -486,6 +492,8 @@
 void
 location_caret_suggestion (location loc, const char *s, FILE *out)
 {
+  if (!(feature_flag & feature_caret))
+    return;
   const char *style = "fixit-insert";
   fprintf (out, "      | %*s",
            loc.start.column - 1 - caret_info.skip
@@ -504,22 +512,28 @@
     && !loc.end.file && !loc.end.line && !loc.end.column;
 }
 
+static inline int
+str_to_int (const char *s)
+{
+  long l = strtol (s, NULL, 10);
+  return l < 0 ? -1 : l <= INT_MAX ? l : INT_MAX;
+}
+
 void
 boundary_set_from_string (boundary *bound, char *str)
 {
-  /* Must search in reverse since the file name field may contain '.'
-     or ':'.  */
+  /* Search backwards: the file name may contain '.'  or ':'.  */
   char *at = strrchr (str, '@');
   if (at)
     {
       *at = '\0';
-      bound->byte = atoi (at+1);
+      bound->byte = str_to_int (at + 1);
     }
   {
     char *dot = strrchr (str, '.');
     aver (dot);
     *dot = '\0';
-    bound->column = atoi (dot+1);
+    bound->column = str_to_int (dot + 1);
     if (!at)
       bound->byte = bound->column;
   }
@@ -527,7 +541,7 @@
     char *colon = strrchr (str, ':');
     aver (colon);
     *colon = '\0';
-    bound->line = atoi (colon+1);
+    bound->line = str_to_int (colon + 1);
   }
   bound->file = uniqstr_new (str);
 }
diff --git a/src/location.h b/src/location.h
index 24fba60..6e356b8 100644
--- a/src/location.h
+++ b/src/location.h
@@ -1,6 +1,6 @@
 /* Locations for Bison
 
-   Copyright (C) 2002, 2004-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 2002, 2004-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef LOCATION_H_
 # define LOCATION_H_
@@ -42,16 +42,14 @@
 
   /* If positive, the column (starting at 1) just after the boundary.
      This is neither a byte count, nor a character count; it is a
-     column count.  If this is INT_MAX, the column number has
+     (visual) column count.  If this is INT_MAX, the column number has
      overflowed.
 
-     Meaningless and not displayed if nonpositive.
-  */
+     Meaningless and not displayed if nonpositive.  */
   int column;
 
-  /* If nonnegative, the byte number (starting at 0) in the current line.
-     Never displayed, used when printing error messages with colors to
-     know where colors start and end.  */
+  /* If nonnegative, the byte number (starting at 0) in the current
+     line.  Not displayed (unless --trace=location).  */
   int byte;
 
 } boundary;
@@ -126,12 +124,12 @@
    left-over by the usage of location_caret.  */
 void caret_free (void);
 
-/* Quote the line containing LOC onto OUT.  Highlight the part of LOC
-   with the color STYLE.  */
+/* If -fcaret is enabled, quote the line containing LOC onto OUT.
+   Highlight the part of LOC with the color STYLE.  */
 void location_caret (location loc, const char* style, FILE *out);
 
-/* Display a suggestion of replacement for LOC with S.  To call after
-   location_caret.  */
+/* If -fcaret is enabled, display a suggestion of replacement for LOC
+   with S.  To call after location_caret.  */
 void location_caret_suggestion (location loc, const char *s, FILE *out);
 
 /* Return -1, 0, 1, depending whether a is before, equal, or
@@ -148,8 +146,9 @@
 /* Whether this is the empty location.  */
 bool location_empty (location loc);
 
-/* STR must be formatted as 'file:line.column@byte' or 'file:line.column',
-   it will be modified.  */
+/* STR must be formatted as 'file:line.column@byte' or 'file:line.column'.
+   It may be '<command line>:3.-1@-1', with -1 to denote no-column/no-byte.
+   STR will be modified.  */
 void boundary_set_from_string (boundary *bound, char *str);
 
 #endif /* ! defined LOCATION_H_ */
diff --git a/src/lr0.c b/src/lr0.c
index 58df9d7..be5085e 100644
--- a/src/lr0.c
+++ b/src/lr0.c
@@ -1,6 +1,6 @@
 /* Generate the LR(0) parser states for Bison.
 
-   Copyright (C) 1984, 1986, 1989, 2000-2002, 2004-2015, 2018-2019 Free
+   Copyright (C) 1984, 1986, 1989, 2000-2002, 2004-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 
 /* See comments in state.h for the data structures that represent it.
@@ -49,7 +49,7 @@
 
 /* Print CORE for debugging. */
 static void
-core_print (size_t core_size, item_number *core, FILE *out)
+core_print (size_t core_size, item_index *core, FILE *out)
 {
   for (int i = 0; i < core_size; ++i)
     {
@@ -58,13 +58,14 @@
     }
 }
 
-/*------------------------------------------------------------------.
-| A state was just discovered from another state.  Queue it for     |
-| later examination, in order to find its transitions.  Return it.  |
-`------------------------------------------------------------------*/
+/*-----------------------------------------------------------------.
+| A state was just discovered by transitioning on SYM from another |
+| state.  Queue this state for later examination, in order to find |
+| its outgoing transitions.  Return it.                            |
+`-----------------------------------------------------------------*/
 
 static state *
-state_list_append (symbol_number sym, size_t core_size, item_number *core)
+state_list_append (symbol_number sym, size_t core_size, item_index *core)
 {
   state_list *node = xmalloc (sizeof *node);
   state *res = state_new (sym, core_size, core);
@@ -85,7 +86,7 @@
   return res;
 }
 
-/* Symbols that can be "shifted" (including non terminals) from the
+/* Symbols that can be "shifted" (including nonterminals) from the
    current state.  */
 bitset shift_symbol;
 
@@ -97,14 +98,14 @@
 static state **shiftset;
 
 
-/* KERNEL_BASE[symbol-number] -> list of item numbers (offsets inside
-   RITEM) of lenngth KERNEL_SIZE[symbol-number]. */
-static item_number **kernel_base;
+/* KERNEL_BASE[symbol-number] -> list of item indices (offsets inside
+   RITEM) of length KERNEL_SIZE[symbol-number]. */
+static item_index **kernel_base;
 static int *kernel_size;
 
 /* A single dimension array that serves as storage for
    KERNEL_BASE.  */
-static item_number *kernel_items;
+static item_index *kernel_items;
 
 
 static void
@@ -256,7 +257,7 @@
 `--------------------------------------------------------------*/
 
 static state *
-get_state (symbol_number sym, size_t core_size, item_number *core)
+get_state (symbol_number sym, size_t core_size, item_index *core)
 {
   if (trace_flag & trace_automaton)
     {
@@ -391,10 +392,15 @@
   allocate_storage ();
   closure_new (nritems);
 
-  /* Create the initial state.  The 0 at the lhs is the index of the
-     item of this initial rule.  */
-  item_number initial_core = 0;
-  state_list_append (0, 1, &initial_core);
+  /* Create the initial state, whose accessing symbol (by convention)
+     is 0, aka $end.  */
+  {
+    /* The items of its core: beginning of all the rules of $accept.  */
+    kernel_size[0] = 0;
+    for (rule_number r = 0; r < nrules && rules[r].lhs->symbol == acceptsymbol; ++r)
+      kernel_base[0][kernel_size[0]++] = rules[r].rhs - ritem;
+    state_list_append (0, kernel_size[0], kernel_base[0]);
+  }
 
   /* States are queued when they are created; process them all.  */
   for (state_list *list = first_state; list; list = list->next)
diff --git a/src/lr0.h b/src/lr0.h
index 3197ee9..d105d6c 100644
--- a/src/lr0.h
+++ b/src/lr0.h
@@ -1,6 +1,6 @@
 /* Generate the LR(0) parser states for Bison.
 
-   Copyright (C) 1984, 1986, 1989, 2000-2002, 2009-2015, 2018-2019 Free
+   Copyright (C) 1984, 1986, 1989, 2000-2002, 2009-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,13 +16,11 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef LR0_H_
 # define LR0_H_
 
-# include "state.h"
-
 void generate_states (void);
 
 #endif /* !LR0_H_ */
diff --git a/src/lssi.c b/src/lssi.c
new file mode 100644
index 0000000..9b607a2
--- /dev/null
+++ b/src/lssi.c
@@ -0,0 +1,373 @@
+/* Lookahead sensitive state item searches for counterexample generation
+
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "lssi.h"
+
+#include <gl_linked_list.h>
+#include <gl_xlist.h>
+#include <stdlib.h>
+
+#include "getargs.h"
+#include "nullable.h"
+
+// Lookahead sensitive state item.
+typedef struct lssi
+{
+  state_item_number si;
+  struct lssi *parent;
+  // this is the precise lookahead set (follow_L from the CupEx paper)
+  bitset lookahead;
+  bool free_lookahead;
+} lssi;
+
+static lssi *
+new_lssi (state_item_number si, lssi *p, bitset l, bool free_l)
+{
+  lssi *res = xmalloc (sizeof *res);
+  res->si = si;
+  res->parent = p;
+  res->lookahead = l;
+  res->free_lookahead = free_l;
+  return res;
+}
+
+static void
+lssi_free (lssi *sn)
+{
+  if (sn == NULL)
+    return;
+  if (sn->free_lookahead)
+    bitset_free (sn->lookahead);
+  free (sn);
+}
+
+static size_t
+lssi_hasher (lssi *sn, size_t max)
+{
+  size_t hash = sn->si;
+  bitset_iterator biter;
+  symbol_number syn;
+  BITSET_FOR_EACH (biter, sn->lookahead, syn, 0)
+    hash += syn;
+  return hash % max;
+}
+
+static bool
+lssi_comparator (lssi *s1, lssi *s2)
+{
+  if (s1->si == s2->si)
+    {
+      if (s1->lookahead == s2->lookahead)
+        return true;
+      return bitset_equal_p (s1->lookahead, s2->lookahead);
+    }
+  return false;
+}
+
+typedef gl_list_t lssi_list;
+
+static inline bool
+append_lssi (lssi *sn, Hash_table *visited, lssi_list queue)
+{
+  if (hash_lookup (visited, sn))
+    {
+      sn->free_lookahead = false;
+      lssi_free (sn);
+      return false;
+    }
+  hash_xinsert (visited, sn);
+  gl_list_add_last (queue, sn);
+  return true;
+}
+
+#if 0
+static void
+lssi_print (lssi *l)
+{
+  FILE *out = stderr;
+  print_state_item (&state_items[l->si], out);
+  if (l->lookahead)
+    {
+      fprintf (out, "FOLLOWL = { ");
+      bitset_iterator biter;
+      symbol_number sin;
+      BITSET_FOR_EACH (biter, l->lookahead, sin, 0)
+        fprintf (out, "%s, \n", symbols[sin]->tag);
+      fprintf (out, "}\n");
+    }
+}
+#endif
+
+/**
+ * Compute the set of state-items that can reach the given conflict item via
+ * a combination of transitions or production steps.
+ */
+static bitset
+eligible_state_items (state_item *target)
+{
+  bitset result = bitset_create (nstate_items, BITSET_FIXED);
+  state_item_list queue =
+    gl_list_create (GL_LINKED_LIST, NULL, NULL, NULL, true, 1,
+                    (const void **) &target);
+  while (gl_list_size (queue) > 0)
+    {
+      state_item *si = (state_item *) gl_list_get_at (queue, 0);
+      gl_list_remove_at (queue, 0);
+      if (bitset_test (result, si - state_items))
+        continue;
+      bitset_set (result, si - state_items);
+      // search all reverse edges.
+      bitset rsi = si->revs;
+      bitset_iterator biter;
+      state_item_number sin;
+      BITSET_FOR_EACH (biter, rsi, sin, 0)
+        gl_list_add_last (queue, &state_items[sin]);
+    }
+  gl_list_free (queue);
+  return result;
+}
+
+/**
+ * Compute the shortest lookahead-sensitive path from the start state to
+ * this conflict. If optimized is true, only consider parser states
+ * that can reach the conflict state.
+ */
+state_item_list
+shortest_path_from_start (state_item_number target, symbol_number next_sym)
+{
+  bitset eligible = eligible_state_items (&state_items[target]);
+  Hash_table *visited = hash_initialize (32,
+                                         NULL,
+                                         (Hash_hasher) lssi_hasher,
+                                         (Hash_comparator) lssi_comparator,
+                                         (Hash_data_freer) lssi_free);
+  bitset il = bitset_create (nsyms, BITSET_FIXED);
+  bitset_set (il, 0);
+  lssi *init = new_lssi (0, NULL, il, true);
+  lssi_list queue = gl_list_create_empty (GL_LINKED_LIST, NULL, NULL,
+                                          NULL, true);
+  append_lssi (init, visited, queue);
+  // breadth-first search
+  bool finished = false;
+  lssi *n;
+  while (gl_list_size (queue) > 0)
+    {
+      n = (lssi *) gl_list_get_at (queue, 0);
+      gl_list_remove_at (queue, 0);
+      state_item_number last = n->si;
+      if (target == last && bitset_test (n->lookahead, next_sym))
+        {
+          finished = true;
+          break;
+        }
+      state_item *si = &state_items[last];
+      // Transitions don't change follow_L
+      if (si->trans >= 0)
+        {
+          if (bitset_test (eligible, si->trans))
+            {
+              lssi *next = new_lssi (si->trans, n, n->lookahead, false);
+              append_lssi (next, visited, queue);
+            }
+        }
+      // For production steps, follow_L is based on the symbol after the
+      // nonterminal being produced.
+      // if no such symbol exists, follow_L is unchanged
+      // if the symbol is a terminal, follow_L only contains that terminal
+      // if the symbol is not nullable, follow_L is its FIRSTS set
+      // if the symbol is nullable, follow_L is its FIRSTS set unioned with
+      // this logic applied to the next symbol in the rule
+      if (si->prods)
+        {
+          // Compute follow_L as above
+          bitset lookahead = bitset_create (nsyms, BITSET_FIXED);
+          item_number *pos = si->item + 1;
+          for (; !item_number_is_rule_number (*pos); ++pos)
+            {
+              item_number it = *pos;
+              if (ISTOKEN (it))
+                {
+                  bitset_set (lookahead, it);
+                  break;
+                }
+              else
+                {
+                  bitset_union (lookahead, lookahead, FIRSTS (it));
+                  if (!nullable[it - ntokens])
+                    break;
+                }
+            }
+          if (item_number_is_rule_number (*pos))
+            bitset_union (lookahead, n->lookahead, lookahead);
+
+          bool lookahead_used = false;
+          // Try all possible production steps within this parser state.
+          bitset_iterator biter;
+          state_item_number nextSI;
+          BITSET_FOR_EACH (biter, si->prods, nextSI, 0)
+            {
+              if (!bitset_test (eligible, nextSI))
+                continue;
+              lssi *next = new_lssi (nextSI, n, lookahead,
+                                     !lookahead_used);
+              lookahead_used = append_lssi (next, visited, queue)
+                               || lookahead_used;
+            }
+          if (!lookahead_used)
+            bitset_free (lookahead);
+        }
+    }
+
+  bitset_free (eligible);
+  if (!finished)
+    {
+      gl_list_free (queue);
+      fputs ("Cannot find shortest path to conflict state.", stderr);
+      abort ();
+    }
+  state_item_list res =
+    gl_list_create_empty (GL_LINKED_LIST, NULL, NULL, NULL, true);
+  for (lssi *sn = n; sn != NULL; sn = sn->parent)
+    gl_list_add_first (res, &state_items[sn->si]);
+
+  hash_free (visited);
+  gl_list_free (queue);
+
+  if (trace_flag & trace_cex)
+    {
+      fputs ("REDUCE ITEM PATH:\n", stderr);
+      gl_list_iterator_t it = gl_list_iterator (res);
+      const void *sip;
+      while (gl_list_iterator_next (&it, &sip, NULL))
+        state_item_print ((state_item *) sip, stderr, "");
+    }
+  return res;
+}
+
+/**
+ * Determine if the given terminal is in the given symbol set or can begin
+ * a nonterminal in the given symbol set.
+ */
+bool
+intersect_symbol (symbol_number sym, bitset syms)
+{
+  if (!syms)
+    return true;
+  bitset_iterator biter;
+  symbol_number sn;
+  BITSET_FOR_EACH (biter, syms, sn, 0)
+    {
+      if (sym == sn)
+        return true;
+      if (ISVAR (sn) && bitset_test (FIRSTS (sn), sym))
+        return true;
+    }
+  return false;
+}
+
+/**
+ * Determine if any symbol in ts is in syms
+ * or can begin a nonterminal syms.
+ */
+bool
+intersect (bitset ts, bitset syms)
+{
+  if (!syms || !ts)
+    return true;
+  bitset_iterator biter;
+  symbol_number sn;
+  BITSET_FOR_EACH (biter, syms, sn, 0)
+    {
+      if (bitset_test (ts, sn))
+        return true;
+      if (ISVAR (sn) && !bitset_disjoint_p (ts, FIRSTS (sn)))
+        return true;
+    }
+  return false;
+}
+
+
+/**
+ * Compute a list of state_items that have a production to n with respect
+ * to its lookahead
+ */
+state_item_list
+lssi_reverse_production (const state_item *si, bitset lookahead)
+{
+  state_item_list result =
+    gl_list_create_empty (GL_LINKED_LIST, NULL, NULL, NULL, true);
+  if (SI_TRANSITION (si))
+    return result;
+  // A production step was made to the current lalr_item.
+  // Check that the next symbol in the parent lalr_item is
+  // compatible with the lookahead.
+  bitset_iterator biter;
+  state_item_number sin;
+  BITSET_FOR_EACH (biter, si->revs, sin, 0)
+  {
+    state_item *prevsi = &state_items[sin];
+    if (!production_allowed (prevsi, si))
+      continue;
+    bitset prev_lookahead = prevsi->lookahead;
+    if (item_number_is_rule_number (*(prevsi->item)))
+      {
+        // reduce item
+        // Check that some lookaheads can be preserved.
+        if (!intersect (prev_lookahead, lookahead))
+          continue;
+      }
+    else
+      {
+        // shift item
+        if (lookahead)
+          {
+            // Check that lookahead is compatible with the first
+            // possible symbols in the rest of the production.
+            // Alternatively, if the rest of the production is
+            // nullable, the lookahead must be compatible with
+            // the lookahead of the corresponding item.
+            bool applicable = false;
+            bool nlable = true;
+            for (item_number *pos = prevsi->item + 1;
+                 !applicable && nlable && item_number_is_symbol_number (*pos);
+                 ++pos)
+              {
+                symbol_number next_sym = item_number_as_symbol_number (*pos);
+                if (ISTOKEN (next_sym))
+                  {
+                    applicable = intersect_symbol (next_sym, lookahead);
+                    nlable = false;
+                  }
+                else
+                  {
+                    applicable = intersect (FIRSTS (next_sym), lookahead);
+                    if (!applicable)
+                      nlable = nullable[next_sym - ntokens];
+                  }
+              }
+            if (!applicable && !nlable)
+              continue;
+          }
+      }
+    gl_list_add_last (result, prevsi);
+  }
+  return result;
+}
diff --git a/src/lssi.h b/src/lssi.h
new file mode 100644
index 0000000..e7feba3
--- /dev/null
+++ b/src/lssi.h
@@ -0,0 +1,57 @@
+/* Lookahead sensitive state item searches for counterexample generation
+
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef LSSI_H
+# define LSSI_H
+
+# include "state-item.h"
+
+/*
+  All state-item graph nodes should also include a precise follow set (follow_L).
+  However, ignoring follow_L saves a lot of memory and is a pretty good approximation.
+  These functions exist to enforce restrictions caused by follow_L sets.
+ */
+
+/*
+ * find shortest lookahead-sensitive path of state-items to target such that
+ * next_sym is in the follow_L set of target in that position.
+*/
+state_item_list shortest_path_from_start (state_item_number target,
+                                          symbol_number next_sym);
+
+/**
+ * Determine if the given terminal is in the given symbol set or can begin
+ * a nonterminal in the given symbol set.
+ */
+bool intersect_symbol (symbol_number sym, bitset syms);
+
+/**
+ * Determine if any symbol in ts is in syms
+ * or can begin with a nonterminal in syms.
+ */
+bool intersect (bitset ts, bitset syms);
+
+/**
+ * Compute a set of sequences of state-items that can make production steps
+ * to this state-item such that the resulting possible lookahead symbols are
+ * as given.
+ */
+state_item_list lssi_reverse_production (const state_item *si, bitset lookahead);
+
+#endif /* LSSI_H */
diff --git a/src/main.c b/src/main.c
index 258a6d1..1185bf2 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,7 +1,7 @@
 /* Top level entry point of Bison.
 
    Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000-2002, 2004-2015,
-   2018-2019 Free Software Foundation, Inc.
+   2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
@@ -33,10 +33,12 @@
 
 #include "complain.h"
 #include "conflicts.h"
+#include "counterexample.h"
 #include "derives.h"
 #include "files.h"
 #include "fixits.h"
 #include "getargs.h"
+#include "glyphs.h"
 #include "gram.h"
 #include "ielr.h"
 #include "lalr.h"
@@ -44,6 +46,7 @@
 #include "muscle-tab.h"
 #include "nullable.h"
 #include "output.h"
+#include "parse-gram.h"
 #include "print-graph.h"
 #include "print-xml.h"
 #include "print.h"
@@ -60,6 +63,12 @@
 int
 main (int argc, char *argv[])
 {
+  {
+    char *cp = getenv ("BISON_PROGRAM_NAME");
+    if (cp)
+      argv[0] = cp;
+  }
+
 #define DEPENDS_ON_LIBINTL 1
   set_program_name (argv[0]);
   setlocale (LC_ALL, "");
@@ -83,12 +92,17 @@
 
   atexit (close_stdout);
 
+  glyphs_init ();
   uniqstrs_new ();
   muscle_init ();
   complain_init ();
+  code_scanner_init ();
 
   getargs (argc, argv);
 
+  if (trace_flag)
+    fprintf (stderr, "bison (GNU Bison) %s\n", VERSION);
+
   timevar_enabled = trace_flag & trace_time;
   timevar_init ();
   timevar_start (tv_total);
@@ -144,6 +158,9 @@
       conflicts_update_state_numbers (old_to_new, nstates_old);
       free (old_to_new);
     }
+  if (report_flag & report_cex
+      || warning_is_enabled (Wcounterexamples))
+    counterexample_init ();
   conflicts_print ();
   timevar_pop (tv_conflicts);
 
@@ -181,12 +198,20 @@
         }
 
       /* Output xml.  */
-      if (xml_flag)
+      if (html_flag || xml_flag)
         {
           timevar_push (tv_xml);
           print_xml ();
           timevar_pop (tv_xml);
         }
+
+      /* Output html.  */
+      if (html_flag)
+        {
+          timevar_push (tv_html);
+          print_html ();
+          timevar_pop (tv_html);
+        }
     }
 
   /* Stop if there were errors, to avoid trashing previous output
@@ -217,11 +242,15 @@
   reduce_free ();
   conflicts_free ();
   grammar_free ();
+  counterexample_free ();
   output_file_names_free ();
 
-  /* The scanner memory cannot be released right after parsing, as it
-     contains things such as user actions, prologue, epilogue etc.  */
+  /* The scanner and parser memory cannot be released right after
+     parsing, as it contains things such as user actions, prologue,
+     epilogue etc.  */
   gram_scanner_free ();
+  parser_free ();
+
   muscle_free ();
   code_scanner_free ();
   skel_scanner_free ();
diff --git a/src/muscle-tab.c b/src/muscle-tab.c
index cc7dbdf..3d3baf1 100644
--- a/src/muscle-tab.c
+++ b/src/muscle-tab.c
@@ -1,6 +1,6 @@
 /* Muscle table manager for Bison.
 
-   Copyright (C) 2001-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,7 +15,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
@@ -107,8 +107,7 @@
   res->key = key;
   res->value = NULL;
   res->storage = NULL;
-  if (!hash_insert (muscle_table, res))
-    xalloc_die ();
+  hash_xinsert (muscle_table, res);
   return res;
 }
 
@@ -128,9 +127,6 @@
 
   muscle_table = hash_xinitialize (HT_INITIAL_CAPACITY, NULL, hash_muscle,
                                    hash_compare_muscles, muscle_entry_free);
-
-  /* Version and input file.  */
-  MUSCLE_INSERT_STRING ("version", VERSION);
 }
 
 
@@ -142,8 +138,7 @@
 }
 
 /* Look for the muscle named KEY.  Return NULL if does not exist.  */
-static
-muscle_entry *
+static muscle_entry *
 muscle_lookup (char const *key)
 {
   muscle_entry probe;
@@ -210,7 +205,7 @@
 {
   obstack_printf (&muscle_obstack, "]b4_syncline(%d, ", loc.start.line);
   obstack_quote (&muscle_obstack,
-                 quotearg_style (c_quoting_style, loc.start.file));
+                 quotearg_style (c_quoting_style, map_file_name (loc.start.file)));
   obstack_sgrow (&muscle_obstack, ")dnl\n[");
   char const *extension = obstack_finish0 (&muscle_obstack);
   muscle_grow (key, extension, "", "");
@@ -292,7 +287,6 @@
 
 #define COMMON_DECODE(Value)                                    \
   case '$':                                                     \
-    ++(Value); aver (*(Value) == '[');                          \
     ++(Value); aver (*(Value) == ']');                          \
     ++(Value); aver (*(Value) == '[');                          \
     obstack_sgrow (&muscle_obstack, "$");                       \
@@ -450,6 +444,7 @@
     { "api.push_pull",              "api.push-pull",             muscle_keyword },
     { "api.tokens.prefix",          "api.token.prefix",          muscle_code },
     { "extends",                    "api.parser.extends",        muscle_keyword },
+    { "filename_type",              "api.filename.type",         muscle_code },
     { "final",                      "api.parser.final",          muscle_keyword },
     { "implements",                 "api.parser.implements",     muscle_keyword },
     { "lex_symbol",                 "api.token.constructor",     -1 },
@@ -458,6 +453,7 @@
     { "lr.keep-unreachable-states", "lr.keep-unreachable-state", muscle_keyword },
     { "lr.keep_unreachable_states", "lr.keep-unreachable-state", muscle_keyword },
     { "namespace",                  "api.namespace",             muscle_code },
+    { "package",                    "api.package",               muscle_code },
     { "parser_class_name",          "api.parser.class",          muscle_code },
     { "public",                     "api.parser.public",         muscle_keyword },
     { "strictfp",                   "api.parser.strictfp",       muscle_keyword },
@@ -521,19 +517,18 @@
       char const *current_value = muscle_find_const (name);
       if (current_value)
         {
+          long l = strtol (muscle_find_const (how_name), NULL, 10);
           muscle_percent_define_how how_old
-            = atoi (muscle_find_const (how_name));
+            = 0 <= l && l <= INT_MAX ? l : INT_MAX;
           if (how_old == MUSCLE_PERCENT_DEFINE_F)
             goto end;
-          int i = 0;
           /* If assigning the same value, make it a warning.  */
           warnings warn = STREQ (value, current_value) ? Wother : complaint;
-          complain_indent (&variable_loc, warn, &i,
-                           _("%%define variable %s redefined"),
-                           quote (variable));
-          i += SUB_INDENT;
+          complain (&variable_loc, warn,
+                    _("%%define variable %s redefined"),
+                    quote (variable));
           location loc = muscle_percent_define_get_loc (variable);
-          complain_indent (&loc, warn, &i, _("previous definition"));
+          subcomplain (&loc, warn, _("previous definition"));
           fixits_register (&variable_loc, "");
           warned = true;
         }
@@ -739,14 +734,12 @@
           if (!*values)
             {
               location loc = muscle_percent_define_get_loc (*variablep);
-              int i = 0;
-              complain_indent (&loc, complaint, &i,
-                               _("invalid value for %%define variable %s: %s"),
-                               quote (*variablep), quote_n (1, value));
-              i += SUB_INDENT;
+              complain (&loc, complaint,
+                        _("invalid value for %%define variable %s: %s"),
+                        quote (*variablep), quote_n (1, value));
               for (values = variablep + 1; *values; ++values)
-                complain_indent (&loc, complaint | no_caret | silent, &i,
-                                 _("accepted value: %s"), quote (*values));
+                subcomplain (&loc, complaint | no_caret | silent,
+                             _("accepted value: %s"), quote (*values));
             }
           else
             while (*values)
diff --git a/src/muscle-tab.h b/src/muscle-tab.h
index 1aefdf3..881782e 100644
--- a/src/muscle-tab.h
+++ b/src/muscle-tab.h
@@ -1,6 +1,6 @@
 /* Muscle table manager for Bison,
 
-   Copyright (C) 2001-2003, 2006-2015, 2018-2019 Free Software
+   Copyright (C) 2001-2003, 2006-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef MUSCLE_TAB_H_
 # define MUSCLE_TAB_H_
diff --git a/src/named-ref.c b/src/named-ref.c
index b9f49c4..7524519 100644
--- a/src/named-ref.c
+++ b/src/named-ref.c
@@ -1,6 +1,6 @@
 /* Named symbol references for Bison
 
-   Copyright (C) 2009-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,7 +15,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
diff --git a/src/named-ref.h b/src/named-ref.h
index bc9f99f..73429ba 100644
--- a/src/named-ref.h
+++ b/src/named-ref.h
@@ -1,6 +1,6 @@
 /* Named symbol references for Bison
 
-   Copyright (C) 2009-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,7 +15,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef NAMED_REF_H_
 # define NAMED_REF_H_
diff --git a/src/nullable.c b/src/nullable.c
index 7d6cf9c..7f0405d 100644
--- a/src/nullable.c
+++ b/src/nullable.c
@@ -1,6 +1,6 @@
 /* Calculate which nonterminals can expand into the null string for Bison.
 
-   Copyright (C) 1984, 1989, 2000-2006, 2009-2015, 2018-2019 Free
+   Copyright (C) 1984, 1989, 2000-2006, 2009-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 
 /* Set up NULLABLE, a vector saying which nonterminals can expand into
@@ -36,7 +36,7 @@
 typedef struct rule_list
 {
   struct rule_list *next;
-  rule *value;
+  const rule *value;
 } rule_list;
 
 bool *nullable = NULL;
@@ -44,9 +44,8 @@
 static void
 nullable_print (FILE *out)
 {
-  int i;
   fputs ("NULLABLE\n", out);
-  for (i = ntokens; i < nsyms; i++)
+  for (int i = ntokens; i < nsyms; i++)
     fprintf (out, "  %s: %s\n", symbols[i]->tag,
              nullable[i - ntokens] ? "yes" : "no");
   fputs ("\n\n", out);
@@ -55,68 +54,62 @@
 void
 nullable_compute (void)
 {
-  rule_number ruleno;
-  symbol_number *s1;
-  symbol_number *s2;
-  rule_list *p;
+  nullable = xcalloc (nnterms, sizeof *nullable);
 
-  symbol_number *squeue = xnmalloc (nvars, sizeof *squeue);
   size_t *rcount = xcalloc (nrules, sizeof *rcount);
   /* RITEM contains all the rules, including useless productions.
      Hence we must allocate room for useless nonterminals too.  */
-  rule_list **rsets = xcalloc (nvars, sizeof *rsets);
+  rule_list **rsets = xcalloc (nnterms, sizeof *rsets);
   /* This is said to be more elements than we actually use.
      Supposedly NRITEMS - NRULES is enough.  But why take the risk?  */
-  rule_list *relts = xnmalloc (nritems + nvars + 1, sizeof *relts);
+  rule_list *relts = xnmalloc (nritems + nnterms + 1, sizeof *relts);
 
-  nullable = xcalloc (nvars, sizeof *nullable);
+  symbol_number *squeue = xnmalloc (nnterms, sizeof *squeue);
+  symbol_number *s2 = squeue;
+  {
+    rule_list *p = relts;
+    for (rule_number ruleno = 0; ruleno < nrules; ++ruleno)
+      if (rules[ruleno].useful)
+        {
+          const rule *r = &rules[ruleno];
+          if (r->rhs[0] >= 0)
+            {
+              /* This rule has a non empty RHS. */
+              bool any_tokens = false;
+              for (item_number *rp = r->rhs; *rp >= 0; ++rp)
+                if (ISTOKEN (*rp))
+                  any_tokens = true;
 
-  s1 = s2 = squeue;
-  p = relts;
-
-  for (ruleno = 0; ruleno < nrules; ++ruleno)
-    if (rules[ruleno].useful)
-      {
-        rule *rules_ruleno = &rules[ruleno];
-        if (rules_ruleno->rhs[0] >= 0)
-          {
-            /* This rule has a non empty RHS. */
-            item_number *rp = NULL;
-            bool any_tokens = false;
-            for (rp = rules_ruleno->rhs; *rp >= 0; ++rp)
-              if (ISTOKEN (*rp))
-                any_tokens = true;
-
-            /* This rule has only nonterminals: schedule it for the second
-               pass.  */
-            if (!any_tokens)
-              for (rp = rules_ruleno->rhs; *rp >= 0; ++rp)
+              /* This rule has only nonterminals: schedule it for the second
+                 pass.  */
+              if (!any_tokens)
+                for (item_number *rp = r->rhs; *rp >= 0; ++rp)
+                  {
+                    rcount[ruleno]++;
+                    p->next = rsets[*rp - ntokens];
+                    p->value = r;
+                    rsets[*rp - ntokens] = p;
+                    p++;
+                  }
+            }
+          else
+            {
+              /* This rule has an empty RHS. */
+              if (r->useful
+                  && ! nullable[r->lhs->number - ntokens])
                 {
-                  rcount[ruleno]++;
-                  p->next = rsets[*rp - ntokens];
-                  p->value = rules_ruleno;
-                  rsets[*rp - ntokens] = p;
-                  p++;
+                  nullable[r->lhs->number - ntokens] = true;
+                  *s2++ = r->lhs->number;
                 }
-          }
-        else
-          {
-            /* This rule has an empty RHS. */
-            aver (item_number_as_rule_number (rules_ruleno->rhs[0])
-                  == ruleno);
-            if (rules_ruleno->useful
-                && ! nullable[rules_ruleno->lhs->number - ntokens])
-              {
-                nullable[rules_ruleno->lhs->number - ntokens] = true;
-                *s2++ = rules_ruleno->lhs->number;
-              }
-          }
-      }
+            }
+        }
+  }
 
+  symbol_number *s1 = squeue;
   while (s1 < s2)
-    for (p = rsets[*s1++ - ntokens]; p; p = p->next)
+    for (rule_list *p = rsets[*s1++ - ntokens]; p; p = p->next)
       {
-        rule *r = p->value;
+        const rule *r = p->value;
         if (--rcount[r->number] == 0)
           if (r->useful && ! nullable[r->lhs->number - ntokens])
             {
diff --git a/src/nullable.h b/src/nullable.h
index 60caf3d..3827173 100644
--- a/src/nullable.h
+++ b/src/nullable.h
@@ -1,6 +1,6 @@
 /* Part of the bison parser generator,
 
-   Copyright (C) 2000, 2002, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2000, 2002, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef NULLABLE_H_
 # define NULLABLE_H_
diff --git a/src/output.c b/src/output.c
index c5ebe75..4b1bb0d 100644
--- a/src/output.c
+++ b/src/output.c
@@ -1,6 +1,6 @@
 /* Output the generated parsing program for Bison.
 
-   Copyright (C) 1984, 1986, 1989, 1992, 2000-2015, 2018-2019 Free
+   Copyright (C) 1984, 1986, 1989, 1992, 2000-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,13 +16,14 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
 
 #include <filename.h> /* IS_PATH_WITH_DIR */
 #include <get-errno.h>
+#include <mbswidth.h>
 #include <path-join.h>
 #include <quotearg.h>
 #include <spawn-pipe.h>
@@ -41,6 +42,7 @@
 #include "scan-skel.h"
 #include "symtab.h"
 #include "tables.h"
+#include "strversion.h"
 
 static struct obstack format_obstack;
 
@@ -50,6 +52,10 @@
 | result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of |
 | TYPE), and to the muscle NAME_max, the max value of the            |
 | TABLE_DATA.                                                        |
+|                                                                    |
+| For the typical case of outputting a complete table from 0, pass   |
+| TABLE[0] as FIRST, and 1 as BEGIN.  For instance                   |
+| muscle_insert_base_table ("pact", base, base[0], 1, nstates);      |
 `-------------------------------------------------------------------*/
 
 
@@ -103,10 +109,8 @@
 `----------------------------------------------------------------*/
 
 static void
-quoted_output (FILE *out, char const *cp)
+output_escaped (FILE *out, const char *cp)
 {
-  fprintf (out, "[[");
-
   for (; *cp; cp++)
     switch (*cp)
       {
@@ -116,7 +120,13 @@
       case ']': fputs ("@}",  out); break;
       default:  fputc (*cp,   out); break;
       }
+}
 
+static void
+output_quoted (FILE *out, char const *cp)
+{
+  fprintf (out, "[[");
+  output_escaped (out, cp);
   fprintf (out, "]]");
 }
 
@@ -128,46 +138,134 @@
 static void
 string_output (FILE *out, char const *string)
 {
-  quoted_output (out, quotearg_style (c_quoting_style, string));
+  output_quoted (out, quotearg_style (c_quoting_style, string));
 }
 
 
+/* Store in BUFFER a copy of SRC where trigraphs are escaped, return
+   the size of the result (including the final NUL).  If called with
+   BUFFERSIZE = 0, returns the needed size for BUFFER.  */
+static ptrdiff_t
+escape_trigraphs (char *buffer, ptrdiff_t buffersize, const char *src)
+{
+#define STORE(c)                                \
+  do                                            \
+    {                                           \
+      if (res < buffersize)                     \
+        buffer[res] = (c);                      \
+      ++res;                                    \
+    }                                           \
+  while (0)
+  ptrdiff_t res = 0;
+  for (ptrdiff_t i = 0, len = strlen (src); i < len; ++i)
+    {
+      if (i + 2 < len
+          && src[i] == '?' && src[i+1] == '?')
+        {
+          switch (src[i+2])
+            {
+            case '!': case '\'':
+            case '(': case ')': case '-': case '/':
+            case '<': case '=': case '>':
+              i += 1;
+              STORE ('?');
+              STORE ('"');
+              STORE ('"');
+              STORE ('?');
+              continue;
+            }
+        }
+      STORE (src[i]);
+    }
+  STORE ('\0');
+#undef STORE
+  return res;
+}
+
+/* Same as xstrdup, except that trigraphs are escaped.  */
+static char *
+xescape_trigraphs (const char *src)
+{
+  ptrdiff_t bufsize = escape_trigraphs (NULL, 0, src);
+  char *buf = xcharalloc (bufsize);
+  escape_trigraphs (buf, bufsize, src);
+  return buf;
+}
+
+/* The tag to show in the generated parsers.  Use "end of file" rather
+   than "$end".  But keep "$end" in the reports, it's shorter and more
+   consistent.  Support i18n if the user already uses it.  */
+static const char *
+symbol_tag (const symbol *sym)
+{
+  const bool eof_is_user_defined
+    = !eoftoken->alias || STRNEQ (eoftoken->alias->tag, "$end");
+
+  if (!eof_is_user_defined && sym->content == eoftoken->content)
+    return "\"end of file\"";
+  else if (sym->content == undeftoken->content)
+    return "\"invalid token\"";
+  else
+    return sym->tag;
+}
+
 /* Generate the b4_<MUSCLE_NAME> (e.g., b4_tname) table with the
    symbol names (aka tags). */
 
 static void
 prepare_symbol_names (char const *muscle_name)
 {
+  // Whether to add a pair of quotes around the name.
+  const bool quote = STREQ (muscle_name, "tname");
+  bool has_translations = false;
+
   /* We assume that the table will be output starting at column 2. */
-  int j = 2;
+  int col = 2;
   struct quoting_options *qo = clone_quoting_options (0);
   set_quoting_style (qo, c_quoting_style);
   set_quoting_flags (qo, QA_SPLIT_TRIGRAPHS);
   for (int i = 0; i < nsyms; i++)
     {
-      char *cp = quotearg_alloc (symbols[i]->tag, -1, qo);
+      const char *tag = symbol_tag (symbols[i]);
+      bool translatable = !quote && symbols[i]->translatable;
+      if (translatable)
+        has_translations = true;
+
+      char *cp
+        = tag[0] == '"' && !quote
+        ? xescape_trigraphs (tag)
+        : quotearg_alloc (tag, -1, qo);
       /* Width of the next token, including the two quotes, the
          comma and the space.  */
-      int width = strlen (cp) + 2;
+      int width
+        = mbswidth (cp, 0) + 2
+        + (translatable ? strlen ("N_()") : 0);
 
-      if (j + width > 75)
+      if (col + width > 75)
         {
           obstack_sgrow (&format_obstack, "\n ");
-          j = 1;
+          col = 1;
         }
 
       if (i)
         obstack_1grow (&format_obstack, ' ');
+      if (translatable)
+        obstack_sgrow (&format_obstack, "]b4_symbol_translate""([");
       obstack_escape (&format_obstack, cp);
+      if (translatable)
+        obstack_sgrow (&format_obstack, "])[");
       free (cp);
       obstack_1grow (&format_obstack, ',');
-      j += width;
+      col += width;
     }
   free (qo);
   obstack_sgrow (&format_obstack, " ]b4_null[");
 
   /* Finish table and store. */
   muscle_insert (muscle_name, obstack_finish0 (&format_obstack));
+
+  /* Announce whether translation support is needed.  */
+  MUSCLE_INSERT_BOOL ("has_translations_flag", has_translations);
 }
 
 
@@ -180,24 +278,44 @@
 prepare_symbols (void)
 {
   MUSCLE_INSERT_INT ("tokens_number", ntokens);
-  MUSCLE_INSERT_INT ("nterms_number", nvars);
+  MUSCLE_INSERT_INT ("nterms_number", nnterms);
   MUSCLE_INSERT_INT ("symbols_number", nsyms);
-  MUSCLE_INSERT_INT ("undef_token_number", undeftoken->content->number);
-  MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number);
+  MUSCLE_INSERT_INT ("code_max", max_code);
 
   muscle_insert_symbol_number_table ("translate",
                                      token_translations,
                                      token_translations[0],
-                                     1, max_user_token_number + 1);
+                                     1, max_code + 1);
 
   /* tname -- token names.  */
   prepare_symbol_names ("tname");
+  prepare_symbol_names ("symbol_names");
+
+  /* translatable -- whether a token is translatable. */
+  {
+    bool translatable = false;
+    for (int i = 0; i < ntokens; ++i)
+      if (symbols[i]->translatable)
+        {
+          translatable = true;
+          break;
+        }
+    if (translatable)
+      {
+        int *values = xnmalloc (nsyms, sizeof *values);
+        for (int i = 0; i < ntokens; ++i)
+          values[i] = symbols[i]->translatable;
+        muscle_insert_int_table ("translatable", values,
+                                 values[0], 1, ntokens);
+        free (values);
+      }
+  }
 
   /* Output YYTOKNUM. */
   {
     int *values = xnmalloc (ntokens, sizeof *values);
     for (int i = 0; i < ntokens; ++i)
-      values[i] = symbols[i]->content->user_token_number;
+      values[i] = symbols[i]->content->code;
     muscle_insert_int_table ("toknum", values,
                              values[0], 1, ntokens);
     free (values);
@@ -344,6 +462,27 @@
 }
 
 
+/* Define the list of start symbols *if* there are several.  Define
+   them by pairs: [START-SYMBOL-NUM, SWITCHING-TOKEN-SYMBOL-NUM]. */
+static void
+start_symbols_output (FILE *out)
+{
+  if (start_symbols && start_symbols->next)
+    {
+      fputs ("m4_define([b4_start_symbols],\n[", out);
+      for (symbol_list *list = start_symbols; list; list = list->next)
+        {
+          const symbol *start = list->content.sym;
+          const symbol *swtok = switching_token (start);
+          fprintf (out, "%s[%d, %d]",
+                   list == start_symbols ? "" : ", ",
+                   start->content->number, swtok->content->number);
+        }
+      fputs ("])\n\n", out);
+    }
+}
+
+
 /*-------------------------------------.
 | The list of all the symbol numbers.  |
 `-------------------------------------*/
@@ -363,6 +502,21 @@
 `-------------------------------------------*/
 
 static void
+rule_output (const rule *r, FILE *out)
+{
+  output_escaped (out, r->lhs->symbol->tag);
+  fputc (':', out);
+  if (0 <= *r->rhs)
+    for (item_number *rhsp = r->rhs; 0 <= *rhsp; ++rhsp)
+      {
+        fputc (' ', out);
+        output_escaped (out, symbols[*rhsp]->tag);
+      }
+  else
+    fputs (" %empty", out);
+}
+
+static void
 user_actions_output (FILE *out)
 {
   fputs ("m4_define([b4_actions], \n[", out);
@@ -377,12 +531,14 @@
           {
             fprintf (out, "b4_syncline(%d, ",
                      rules[r].action_loc.start.line);
-            string_output (out, rules[r].action_loc.start.file);
+            string_output (out, map_file_name (rules[r].action_loc.start.file));
             fprintf (out, ")dnl\n");
           }
-        fprintf (out, "[%*s%s]])\n\n",
+        fprintf (out, "[%*s%s]],\n[[",
                  rules[r].action_loc.start.column - 1, "",
                  rules[r].action);
+        rule_output (&rules[r], out);
+        fprintf (out, "]])\n\n");
       }
   fputs ("])\n\n", out);
 }
@@ -398,14 +554,8 @@
   int n;
   merger_list* p;
   for (n = 1, p = merge_functions; p != NULL; n += 1, p = p->next)
-    {
-      if (p->type[0] == '\0')
-        fprintf (out, "  case %d: *yy0 = %s (*yy0, *yy1); break;\n",
-                 n, p->name);
-      else
-        fprintf (out, "  case %d: yy0->%s = %s (*yy0, *yy1); break;\n",
-                 n, p->type, p->name);
-    }
+    fprintf (out, "]b4_call_merger""([%d], [%s], [%d])[\n",
+             n, p->name, p->sym->content->number);
   fputs ("]])\n\n", out);
 }
 
@@ -420,7 +570,7 @@
   /* Map "orig NUM" to new numbers.  See data/README.  */
   for (symbol_number i = ntokens; i < nsyms + nuseless_nonterminals; ++i)
     {
-      obstack_printf (&format_obstack, "symbol(orig %d, number)", i);
+      obstack_printf (&format_obstack, "symbol""(orig %d, number)", i);
       const char *key = obstack_finish0 (&format_obstack);
       MUSCLE_INSERT_INT (key, nterm_map ? nterm_map[i - ntokens] : i);
     }
@@ -431,12 +581,12 @@
       const char *key;
 
 #define SET_KEY(Entry)                                          \
-      obstack_printf (&format_obstack, "symbol(%d, %s)",        \
+      obstack_printf (&format_obstack, "symbol""(%d, %s)",        \
                       i, Entry);                                \
       key = obstack_finish0 (&format_obstack);
 
 #define SET_KEY2(Entry, Suffix)                                 \
-      obstack_printf (&format_obstack, "symbol(%d, %s_%s)",     \
+      obstack_printf (&format_obstack, "symbol""(%d, %s_%s)",     \
                       i, Entry, Suffix);                        \
       key = obstack_finish0 (&format_obstack);
 
@@ -451,14 +601,13 @@
 
       /* Its tag.  Typically for documentation purpose.  */
       SET_KEY ("tag");
-      MUSCLE_INSERT_STRING (key, sym->tag);
+      MUSCLE_INSERT_STRING (key, symbol_tag (sym));
 
-      SET_KEY ("user_number");
-      MUSCLE_INSERT_INT (key, sym->content->user_token_number);
+      SET_KEY ("code");
+      MUSCLE_INSERT_INT (key, sym->content->code);
 
       SET_KEY ("is_token");
-      MUSCLE_INSERT_INT (key,
-                         i < ntokens && sym != errtoken && sym != undeftoken);
+      MUSCLE_INSERT_INT (key, i < ntokens);
 
       SET_KEY ("number");
       MUSCLE_INSERT_INT (key, sym->content->number);
@@ -481,7 +630,7 @@
           if (p->code)
             {
               SET_KEY2 (pname, "file");
-              MUSCLE_INSERT_C_STRING (key, p->location.start.file);
+              MUSCLE_INSERT_C_STRING (key, map_file_name (p->location.start.file));
 
               SET_KEY2 (pname, "line");
               MUSCLE_INSERT_INT (key, p->location.start.line);
@@ -504,9 +653,7 @@
 static void
 prepare_actions (void)
 {
-  /* Figure out the actions for the specified state, indexed by
-     lookahead token type.  */
-
+  /* Figure out the actions for the specified state.  */
   muscle_insert_rule_number_table ("defact", yydefact,
                                    yydefact[0], 1, nstates);
 
@@ -560,6 +707,7 @@
   merger_output (out);
   symbol_numbers_output (out);
   type_names_output (out);
+  start_symbols_output (out);
   user_actions_output (out);
   /* Must be last.  */
   muscles_m4_output (out);
@@ -573,11 +721,12 @@
 output_skeleton (void)
 {
   /* Compute the names of the package data dir and skeleton files.  */
-  char const *m4 = (m4 = getenv ("M4")) ? m4 : M4;
+  char const *m4 = m4path ();
   char const *datadir = pkgdatadir ();
   char *skeldir = xpath_join (datadir, "skeletons");
   char *m4sugar = xpath_join (datadir, "m4sugar/m4sugar.m4");
   char *m4bison = xpath_join (skeldir, "bison.m4");
+  char *traceon = xpath_join (skeldir, "traceon.m4");
   char *skel = (IS_PATH_WITH_DIR (skeleton)
                 ? xstrdup (skeleton)
                 : xpath_join (skeldir, skeleton));
@@ -589,21 +738,10 @@
 
   /* Create an m4 subprocess connected to us via two pipes.  */
 
-  if (trace_flag & trace_tools)
-    fprintf (stderr, "running: %s %s - %s %s\n",
-             m4, m4sugar, m4bison, skel);
-
-  /* Some future version of GNU M4 (most likely 1.6) may treat the -dV in a
-     position-dependent manner.  Keep it as the first argument so that all
-     files are traced.
-
-     See the thread starting at
-     <http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html>
-     for details.  */
   int filter_fd[2];
   pid_t pid;
   {
-    char const *argv[10];
+    char const *argv[11];
     int i = 0;
     argv[i++] = m4;
 
@@ -614,30 +752,48 @@
        extensions even when POSIXLY_CORRECT is set.
 
        See the thread starting at
-       <http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html>
+       <https://lists.gnu.org/r/bug-bison/2008-07/msg00000.html>
        for details.  */
     if (*M4_GNU_OPTION)
       argv[i++] = M4_GNU_OPTION;
 
     argv[i++] = "-I";
     argv[i++] = datadir;
-    if (trace_flag & trace_m4)
+    /* Some future version of GNU M4 (most likely 1.6) may treat the
+       -dV in a position-dependent manner.  See the thread starting at
+       <https://lists.gnu.org/r/bug-bison/2008-07/msg00000.html>
+       for details.  */
+    if (trace_flag & trace_m4_early)
       argv[i++] = "-dV";
     argv[i++] = m4sugar;
     argv[i++] = "-";
     argv[i++] = m4bison;
+    if (trace_flag & trace_m4)
+      argv[i++] = traceon;
     argv[i++] = skel;
     argv[i++] = NULL;
     aver (i <= ARRAY_CARDINALITY (argv));
 
-    /* The ugly cast is because gnulib gets the const-ness wrong.  */
-    pid = create_pipe_bidi ("m4", m4, (char **)(void*)argv, false, true,
-                            true, filter_fd);
+    if (trace_flag & trace_tools)
+      {
+        fputs ("running:", stderr);
+        for (int j = 0; argv[j]; ++j)
+          fprintf (stderr, " %s", argv[j]);
+        fputc ('\n', stderr);
+      }
+
+    pid = create_pipe_bidi ("m4", m4, argv,
+                            /* directory */ NULL,
+                            /* null_stderr */ false,
+                            /* slave_process */ true,
+                            /* exit_on_error */ true,
+                            filter_fd);
   }
 
   free (skeldir);
   free (m4sugar);
   free (m4bison);
+  free (traceon);
   free (skel);
 
   if (trace_flag & trace_muscles)
@@ -671,10 +827,13 @@
   char const *cp = getenv ("BISON_USE_PUSH_FOR_PULL");
   bool use_push_for_pull_flag = cp && *cp && strtol (cp, 0, 10);
 
+  /* Versions.  */
+  MUSCLE_INSERT_STRING ("version_string", VERSION);
+  MUSCLE_INSERT_INT ("version", strversion_to_int (VERSION));
   MUSCLE_INSERT_INT ("required_version", required_version);
 
   /* Flags. */
-  MUSCLE_INSERT_BOOL ("defines_flag", defines_flag);
+  MUSCLE_INSERT_BOOL ("header_flag", header_flag);
   MUSCLE_INSERT_BOOL ("glr_flag", glr_parser);
   MUSCLE_INSERT_BOOL ("nondeterministic_flag", nondeterministic_parser);
   MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag);
@@ -689,10 +848,15 @@
 
   MUSCLE_INSERT_STRING ("file_name_all_but_ext", all_but_ext);
 
+  const char *spec_mapped_header_file = map_file_name (spec_header_file);
+  const char *mapped_dir_prefix = map_file_name (dir_prefix);
+
 #define DEFINE(Name) MUSCLE_INSERT_STRING (#Name, Name ? Name : "")
   DEFINE (dir_prefix);
+  DEFINE (mapped_dir_prefix);
   DEFINE (parser_file_name);
   DEFINE (spec_header_file);
+  DEFINE (spec_mapped_header_file);
   DEFINE (spec_file_prefix);
   DEFINE (spec_graph_file);
   DEFINE (spec_name_prefix);
diff --git a/src/output.h b/src/output.h
index c8b8831..ed32fdc 100644
--- a/src/output.h
+++ b/src/output.h
@@ -1,6 +1,6 @@
 /* Output the generated parsing program for bison,
 
-   Copyright (C) 2000-2003, 2006-2007, 2009-2015, 2018-2019 Free
+   Copyright (C) 2000-2003, 2006-2007, 2009-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef OUTPUT_H_
 # define OUTPUT_H_
diff --git a/src/parse-gram.c b/src/parse-gram.c
index 1c0e59f..3c1d822 100644
--- a/src/parse-gram.c
+++ b/src/parse-gram.c
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 3.5.  */
+/* A Bison parser, made by GNU Bison 3.8.2.  */
 
 /* Bison implementation for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* As a special exception, you may create a larger work that contains
    part or all of the Bison parser skeleton and distribute that work
@@ -34,6 +34,10 @@
 /* C LALR(1) parser skeleton written by Richard Stallman, by
    simplifying the original so-called "semantic" parser.  */
 
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+   especially those whose name start with YY_ or yy_.  They are
+   private implementation details that can be changed or removed.  */
+
 /* All symbols defined below should begin with yy or YY, to avoid
    infringing on user name space.  This should be done even for local
    variables, as they might otherwise be expanded by user macros.
@@ -41,14 +45,11 @@
    define necessary library symbols; they are noted "INFRINGES ON
    USER NAME SPACE" below.  */
 
-/* Undocumented macros, especially those whose name start with YY_,
-   are private implementation details.  Do not rely on them.  */
+/* Identify Bison output, and Bison version.  */
+#define YYBISON 30802
 
-/* Identify Bison output.  */
-#define YYBISON 1
-
-/* Bison version.  */
-#define YYBISON_VERSION "3.5"
+/* Bison version string.  */
+#define YYBISON_VERSION "3.8.2"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -63,12 +64,12 @@
 #define YYPULL 1
 
 /* "%code top" blocks.  */
-#line 27 "src/parse-gram.y"
+#line 35 "src/parse-gram.y"
 
   /* On column 0 to please syntax-check.  */
 #include <config.h>
 
-#line 72 "src/parse-gram.c"
+#line 73 "src/parse-gram.c"
 /* Substitute the type names.  */
 #define YYSTYPE         GRAM_STYPE
 #define YYLTYPE         GRAM_LTYPE
@@ -101,25 +102,127 @@
 #  endif
 # endif
 
-/* Enabling verbose error messages.  */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE 1
-#endif
-
 #include "parse-gram.h"
+/* Symbol kind.  */
+enum yysymbol_kind_t
+{
+  YYSYMBOL_YYEMPTY = -2,
+  YYSYMBOL_YYEOF = 0,                      /* "end of file"  */
+  YYSYMBOL_YYerror = 1,                    /* error  */
+  YYSYMBOL_YYUNDEF = 2,                    /* "invalid token"  */
+  YYSYMBOL_STRING = 3,                     /* "string"  */
+  YYSYMBOL_TSTRING = 4,                    /* "translatable string"  */
+  YYSYMBOL_PERCENT_TOKEN = 5,              /* "%token"  */
+  YYSYMBOL_PERCENT_NTERM = 6,              /* "%nterm"  */
+  YYSYMBOL_PERCENT_TYPE = 7,               /* "%type"  */
+  YYSYMBOL_PERCENT_DESTRUCTOR = 8,         /* "%destructor"  */
+  YYSYMBOL_PERCENT_PRINTER = 9,            /* "%printer"  */
+  YYSYMBOL_PERCENT_LEFT = 10,              /* "%left"  */
+  YYSYMBOL_PERCENT_RIGHT = 11,             /* "%right"  */
+  YYSYMBOL_PERCENT_NONASSOC = 12,          /* "%nonassoc"  */
+  YYSYMBOL_PERCENT_PRECEDENCE = 13,        /* "%precedence"  */
+  YYSYMBOL_PERCENT_PREC = 14,              /* "%prec"  */
+  YYSYMBOL_PERCENT_DPREC = 15,             /* "%dprec"  */
+  YYSYMBOL_PERCENT_MERGE = 16,             /* "%merge"  */
+  YYSYMBOL_PERCENT_CODE = 17,              /* "%code"  */
+  YYSYMBOL_PERCENT_DEFAULT_PREC = 18,      /* "%default-prec"  */
+  YYSYMBOL_PERCENT_DEFINE = 19,            /* "%define"  */
+  YYSYMBOL_PERCENT_ERROR_VERBOSE = 20,     /* "%error-verbose"  */
+  YYSYMBOL_PERCENT_EXPECT = 21,            /* "%expect"  */
+  YYSYMBOL_PERCENT_EXPECT_RR = 22,         /* "%expect-rr"  */
+  YYSYMBOL_PERCENT_FILE_PREFIX = 23,       /* "%file-prefix"  */
+  YYSYMBOL_PERCENT_FLAG = 24,              /* "%<flag>"  */
+  YYSYMBOL_PERCENT_GLR_PARSER = 25,        /* "%glr-parser"  */
+  YYSYMBOL_PERCENT_HEADER = 26,            /* "%header"  */
+  YYSYMBOL_PERCENT_INITIAL_ACTION = 27,    /* "%initial-action"  */
+  YYSYMBOL_PERCENT_LANGUAGE = 28,          /* "%language"  */
+  YYSYMBOL_PERCENT_NAME_PREFIX = 29,       /* "%name-prefix"  */
+  YYSYMBOL_PERCENT_NO_DEFAULT_PREC = 30,   /* "%no-default-prec"  */
+  YYSYMBOL_PERCENT_NO_LINES = 31,          /* "%no-lines"  */
+  YYSYMBOL_PERCENT_NONDETERMINISTIC_PARSER = 32, /* "%nondeterministic-parser"  */
+  YYSYMBOL_PERCENT_OUTPUT = 33,            /* "%output"  */
+  YYSYMBOL_PERCENT_PURE_PARSER = 34,       /* "%pure-parser"  */
+  YYSYMBOL_PERCENT_REQUIRE = 35,           /* "%require"  */
+  YYSYMBOL_PERCENT_SKELETON = 36,          /* "%skeleton"  */
+  YYSYMBOL_PERCENT_START = 37,             /* "%start"  */
+  YYSYMBOL_PERCENT_TOKEN_TABLE = 38,       /* "%token-table"  */
+  YYSYMBOL_PERCENT_VERBOSE = 39,           /* "%verbose"  */
+  YYSYMBOL_PERCENT_YACC = 40,              /* "%yacc"  */
+  YYSYMBOL_BRACED_CODE = 41,               /* "{...}"  */
+  YYSYMBOL_BRACED_PREDICATE = 42,          /* "%?{...}"  */
+  YYSYMBOL_BRACKETED_ID = 43,              /* "[identifier]"  */
+  YYSYMBOL_CHAR_LITERAL = 44,              /* "character literal"  */
+  YYSYMBOL_COLON = 45,                     /* ":"  */
+  YYSYMBOL_EPILOGUE = 46,                  /* "epilogue"  */
+  YYSYMBOL_EQUAL = 47,                     /* "="  */
+  YYSYMBOL_ID = 48,                        /* "identifier"  */
+  YYSYMBOL_ID_COLON = 49,                  /* "identifier:"  */
+  YYSYMBOL_PERCENT_PERCENT = 50,           /* "%%"  */
+  YYSYMBOL_PIPE = 51,                      /* "|"  */
+  YYSYMBOL_PROLOGUE = 52,                  /* "%{...%}"  */
+  YYSYMBOL_SEMICOLON = 53,                 /* ";"  */
+  YYSYMBOL_TAG = 54,                       /* "<tag>"  */
+  YYSYMBOL_TAG_ANY = 55,                   /* "<*>"  */
+  YYSYMBOL_TAG_NONE = 56,                  /* "<>"  */
+  YYSYMBOL_INT_LITERAL = 57,               /* "integer literal"  */
+  YYSYMBOL_PERCENT_PARAM = 58,             /* "%param"  */
+  YYSYMBOL_PERCENT_UNION = 59,             /* "%union"  */
+  YYSYMBOL_PERCENT_EMPTY = 60,             /* "%empty"  */
+  YYSYMBOL_YYACCEPT = 61,                  /* $accept  */
+  YYSYMBOL_input = 62,                     /* input  */
+  YYSYMBOL_prologue_declarations = 63,     /* prologue_declarations  */
+  YYSYMBOL_prologue_declaration = 64,      /* prologue_declaration  */
+  YYSYMBOL_65_1 = 65,                      /* $@1  */
+  YYSYMBOL_params = 66,                    /* params  */
+  YYSYMBOL_grammar_declaration = 67,       /* grammar_declaration  */
+  YYSYMBOL_code_props_type = 68,           /* code_props_type  */
+  YYSYMBOL_union_name = 69,                /* union_name  */
+  YYSYMBOL_symbol_declaration = 70,        /* symbol_declaration  */
+  YYSYMBOL_71_2 = 71,                      /* $@2  */
+  YYSYMBOL_72_3 = 72,                      /* $@3  */
+  YYSYMBOL_73_4 = 73,                      /* $@4  */
+  YYSYMBOL_precedence_declarator = 74,     /* precedence_declarator  */
+  YYSYMBOL_75_string_opt = 75,             /* string.opt  */
+  YYSYMBOL_76_tag_opt = 76,                /* tag.opt  */
+  YYSYMBOL_generic_symlist = 77,           /* generic_symlist  */
+  YYSYMBOL_generic_symlist_item = 78,      /* generic_symlist_item  */
+  YYSYMBOL_tag = 79,                       /* tag  */
+  YYSYMBOL_nterm_decls = 80,               /* nterm_decls  */
+  YYSYMBOL_token_decls = 81,               /* token_decls  */
+  YYSYMBOL_82_token_decl_1 = 82,           /* token_decl.1  */
+  YYSYMBOL_token_decl = 83,                /* token_decl  */
+  YYSYMBOL_84_int_opt = 84,                /* int.opt  */
+  YYSYMBOL_alias = 85,                     /* alias  */
+  YYSYMBOL_token_decls_for_prec = 86,      /* token_decls_for_prec  */
+  YYSYMBOL_87_token_decl_for_prec_1 = 87,  /* token_decl_for_prec.1  */
+  YYSYMBOL_token_decl_for_prec = 88,       /* token_decl_for_prec  */
+  YYSYMBOL_symbol_decls = 89,              /* symbol_decls  */
+  YYSYMBOL_90_symbols_1 = 90,              /* symbols.1  */
+  YYSYMBOL_grammar = 91,                   /* grammar  */
+  YYSYMBOL_rules_or_grammar_declaration = 92, /* rules_or_grammar_declaration  */
+  YYSYMBOL_rules = 93,                     /* rules  */
+  YYSYMBOL_94_5 = 94,                      /* $@5  */
+  YYSYMBOL_95_rhses_1 = 95,                /* rhses.1  */
+  YYSYMBOL_rhs = 96,                       /* rhs  */
+  YYSYMBOL_97_named_ref_opt = 97,          /* named_ref.opt  */
+  YYSYMBOL_variable = 98,                  /* variable  */
+  YYSYMBOL_value = 99,                     /* value  */
+  YYSYMBOL_id = 100,                       /* id  */
+  YYSYMBOL_id_colon = 101,                 /* id_colon  */
+  YYSYMBOL_symbol = 102,                   /* symbol  */
+  YYSYMBOL_string_as_id = 103,             /* string_as_id  */
+  YYSYMBOL_104_epilogue_opt = 104          /* epilogue.opt  */
+};
+typedef enum yysymbol_kind_t yysymbol_kind_t;
+
 
 
 /* Unqualified %code blocks.  */
-#line 33 "src/parse-gram.y"
+#line 41 "src/parse-gram.y"
 
   #include "system.h"
 
   #include <c-ctype.h>
-  #include <errno.h>
-  #include <intprops.h>
   #include <quotearg.h>
   #include <vasnprintf.h>
   #include <xmemdup0.h>
@@ -133,6 +236,11 @@
   #include "reader.h"
   #include "scan-code.h"
   #include "scan-gram.h"
+  #include "strversion.h"
+
+  /* Pretend to be at least that version, to check features published
+     in that version while developping it.  */
+  static const char* api_version = "3.8";
 
   static int current_prec = 0;
   static location current_lhs_loc;
@@ -157,17 +265,20 @@
   static char *strip_braces (char *code);
 
   /* Convert CODE by calling code_props_plain_init if PLAIN, otherwise
-     code_props_symbol_action_init.  Call
+     code_props_symbol_action_init.  Calls
      gram_scanner_last_string_free to release the latest string from
      the scanner (should be CODE). */
   static char const *translate_code (char *code, location loc, bool plain);
 
   /* Convert CODE by calling code_props_plain_init after having
      stripped the first and last characters (expected to be '{', and
-     '}').  Call gram_scanner_last_string_free to release the latest
+     '}').  Calls gram_scanner_last_string_free to release the latest
      string from the scanner (should be CODE). */
   static char const *translate_code_braceless (char *code, location loc);
 
+  /* Handle a %header directive.  */
+  static void handle_header (char const *value);
+
   /* Handle a %error-verbose directive.  */
   static void handle_error_verbose (location const *loc, char const *directive);
 
@@ -176,6 +287,9 @@
                                   location const *dir_loc,
                                   char const *directive, char const *value);
 
+  /* Handle a %language directive.  */
+  static void handle_language (location const *loc, char const *lang);
+
   /* Handle a %name-prefix directive.  */
   static void handle_name_prefix (location const *loc,
                                   char const *directive, char const *value);
@@ -201,7 +315,14 @@
   /* Add style to semantic values in traces.  */
   static void tron (FILE *yyo);
   static void troff (FILE *yyo);
-#line 261 "src/parse-gram.y"
+
+  /* Interpret a quoted string (such as `"Hello, \"World\"\n\""`).
+     Manages the memory of the result.  */
+  static char *unquote (const char *str);
+
+  /* Discard the latest unquoted string.  */
+  static void unquote_free (char *last_string);
+#line 278 "src/parse-gram.y"
 
   /** Add a lex-param and/or a parse-param.
    *
@@ -212,7 +333,7 @@
   static void add_param (param_type type, char *decl, location loc);
   static param_type current_param = param_none;
 
-#line 216 "src/parse-gram.c"
+#line 337 "src/parse-gram.c"
 
 #ifdef short
 # undef short
@@ -251,6 +372,18 @@
 typedef short yytype_int16;
 #endif
 
+/* Work around bug in HP-UX 11.23, which defines these macros
+   incorrectly for preprocessor constants.  This workaround can likely
+   be removed in 2023, as HPE has promised support for HP-UX 11.23
+   (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
+   <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>.  */
+#ifdef __hpux
+# undef UINT_LEAST8_MAX
+# undef UINT_LEAST16_MAX
+# define UINT_LEAST8_MAX 255
+# define UINT_LEAST16_MAX 65535
+#endif
+
 #if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
 typedef __UINT_LEAST8_TYPE__ yytype_uint8;
 #elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
@@ -310,6 +443,7 @@
 
 #define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
 
+
 /* Stored state numbers (used for stacks). */
 typedef yytype_uint8 yy_state_t;
 
@@ -328,6 +462,11 @@
 # endif
 #endif
 
+#ifndef N_
+# define N_(Msgid) Msgid
+#endif
+
+
 #ifndef YY_ATTRIBUTE_PURE
 # if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
 #  define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
@@ -346,17 +485,23 @@
 
 /* Suppress unused-variable warnings by "using" E.  */
 #if ! defined lint || defined __GNUC__
-# define YYUSE(E) ((void) (E))
+# define YY_USE(E) ((void) (E))
 #else
-# define YYUSE(E) /* empty */
+# define YY_USE(E) /* empty */
 #endif
 
-#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
 /* Suppress an incorrect diagnostic about yylval being uninitialized.  */
-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN                            \
+#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__
+# if __GNUC__ * 100 + __GNUC_MINOR__ < 407
+#  define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN                           \
+    _Pragma ("GCC diagnostic push")                                     \
+    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")
+# else
+#  define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN                           \
     _Pragma ("GCC diagnostic push")                                     \
     _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")              \
     _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# endif
 # define YY_IGNORE_MAYBE_UNINITIALIZED_END      \
     _Pragma ("GCC diagnostic pop")
 #else
@@ -427,8 +572,7 @@
 #  endif
 # endif
 # define YYCOPY_NEEDED 1
-#endif
-
+#endif /* 1 */
 
 #if (! defined yyoverflow \
      && (! defined __cplusplus \
@@ -496,303 +640,313 @@
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   234
+#define YYLAST   240
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  60
+#define YYNTOKENS  61
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  42
+#define YYNNTS  44
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  122
+#define YYNRULES  125
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  166
+#define YYNSTATES  169
 
-#define YYUNDEFTOK  2
-#define YYMAXUTOK   314
+/* YYMAXUTOK -- Last valid token kind.  */
+#define YYMAXUTOK   315
 
 
 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
    as returned by yylex, with out-of-bounds checking.  */
-#define YYTRANSLATE(YYX) (YYX)
+#define YYTRANSLATE(YYX) YY_CAST (yysymbol_kind_t, YYX)
 
 #if GRAM_DEBUG
-  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
+/* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   293,   293,   302,   303,   307,   308,   314,   318,   323,
-     324,   329,   330,   331,   332,   333,   338,   343,   344,   345,
-     346,   347,   348,   348,   349,   350,   351,   352,   353,   354,
-     355,   356,   360,   361,   370,   371,   375,   386,   390,   394,
-     402,   412,   413,   423,   424,   430,   443,   443,   448,   448,
-     453,   457,   467,   468,   469,   470,   474,   475,   480,   481,
-     485,   486,   490,   491,   492,   505,   514,   518,   522,   530,
-     531,   535,   548,   549,   561,   565,   569,   577,   579,   584,
-     591,   601,   605,   609,   617,   622,   634,   635,   641,   642,
-     643,   650,   650,   658,   659,   660,   665,   668,   670,   672,
-     674,   676,   678,   680,   682,   684,   689,   690,   699,   723,
-     724,   725,   726,   738,   740,   767,   772,   773,   778,   787,
-     788,   792,   793
+       0,   310,   310,   319,   320,   324,   325,   331,   335,   340,
+     341,   342,   343,   344,   345,   350,   355,   356,   357,   358,
+     359,   360,   360,   361,   362,   363,   364,   365,   366,   367,
+     368,   372,   373,   382,   383,   387,   398,   402,   406,   414,
+     424,   425,   435,   436,   442,   455,   455,   460,   460,   465,
+     465,   470,   480,   481,   482,   483,   488,   489,   493,   494,
+     499,   500,   504,   505,   509,   510,   511,   524,   533,   537,
+     541,   549,   550,   554,   567,   568,   573,   574,   575,   593,
+     597,   601,   609,   611,   616,   623,   633,   637,   641,   649,
+     655,   668,   669,   675,   676,   677,   684,   684,   692,   693,
+     694,   699,   702,   704,   706,   708,   710,   712,   714,   716,
+     718,   723,   724,   733,   757,   758,   759,   760,   772,   774,
+     798,   803,   804,   809,   817,   818
 };
 #endif
 
-#if GRAM_DEBUG || YYERROR_VERBOSE || 1
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
-static const char *const yytname[] =
+/** Accessing symbol of state STATE.  */
+#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
+
+#if 1
+/* The user-facing name of the symbol whose (internal) number is
+   YYSYMBOL.  No bounds checking.  */
+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
+
+static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
 {
-  "\"end of file\"", "error", "$undefined", "\"string\"", "\"%token\"",
-  "\"%nterm\"", "\"%type\"", "\"%destructor\"", "\"%printer\"",
-  "\"%left\"", "\"%right\"", "\"%nonassoc\"", "\"%precedence\"",
-  "\"%prec\"", "\"%dprec\"", "\"%merge\"", "\"%code\"",
-  "\"%default-prec\"", "\"%define\"", "\"%defines\"", "\"%error-verbose\"",
-  "\"%expect\"", "\"%expect-rr\"", "\"%<flag>\"", "\"%file-prefix\"",
-  "\"%glr-parser\"", "\"%initial-action\"", "\"%language\"",
-  "\"%name-prefix\"", "\"%no-default-prec\"", "\"%no-lines\"",
-  "\"%nondeterministic-parser\"", "\"%output\"", "\"%pure-parser\"",
-  "\"%require\"", "\"%skeleton\"", "\"%start\"", "\"%token-table\"",
-  "\"%verbose\"", "\"%yacc\"", "\"{...}\"", "\"%?{...}\"",
-  "\"[identifier]\"", "\"character literal\"", "\":\"", "\"epilogue\"",
-  "\"=\"", "\"identifier\"", "\"identifier:\"", "\"%%\"", "\"|\"",
-  "\"%{...%}\"", "\";\"", "\"<tag>\"", "\"<*>\"", "\"<>\"", "\"integer\"",
-  "\"%param\"", "\"%union\"", "\"%empty\"", "$accept", "input",
+  static const char *const yy_sname[] =
+  {
+  N_("end of file"), N_("error"), N_("invalid token"), N_("string"),
+  N_("translatable string"), "%token", "%nterm", "%type", "%destructor",
+  "%printer", "%left", "%right", "%nonassoc", "%precedence", "%prec",
+  "%dprec", "%merge", "%code", "%default-prec", "%define",
+  "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>",
+  "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix",
+  "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output",
+  "%pure-parser", "%require", "%skeleton", "%start", "%token-table",
+  "%verbose", "%yacc", "{...}", "%?{...}", N_("[identifier]"),
+  N_("character literal"), ":", N_("epilogue"), "=", N_("identifier"),
+  N_("identifier:"), "%%", "|", "%{...%}", ";", N_("<tag>"), "<*>", "<>",
+  N_("integer literal"), "%param", "%union", "%empty", "$accept", "input",
   "prologue_declarations", "prologue_declaration", "$@1", "params",
   "grammar_declaration", "code_props_type", "union_name",
-  "symbol_declaration", "$@2", "$@3", "precedence_declarator", "tag.opt",
-  "generic_symlist", "generic_symlist_item", "tag", "nterm_decls",
-  "token_decls", "token_decl.1", "token_decl", "int.opt",
-  "token_decls_for_prec", "token_decl_for_prec.1", "token_decl_for_prec",
-  "symbol_decls", "symbol_decl.1", "grammar",
-  "rules_or_grammar_declaration", "rules", "$@4", "rhses.1", "rhs",
+  "symbol_declaration", "$@2", "$@3", "$@4", "precedence_declarator",
+  "string.opt", "tag.opt", "generic_symlist", "generic_symlist_item",
+  "tag", "nterm_decls", "token_decls", "token_decl.1", "token_decl",
+  "int.opt", "alias", "token_decls_for_prec", "token_decl_for_prec.1",
+  "token_decl_for_prec", "symbol_decls", "symbols.1", "grammar",
+  "rules_or_grammar_declaration", "rules", "$@5", "rhses.1", "rhs",
   "named_ref.opt", "variable", "value", "id", "id_colon", "symbol",
-  "string_as_id", "string_as_id.opt", "epilogue.opt", YY_NULLPTR
-};
+  "string_as_id", "epilogue.opt", YY_NULLPTR
+  };
+  /* YYTRANSLATABLE[SYMBOL-NUM] -- Whether YY_SNAME[SYMBOL-NUM] is
+     internationalizable.  */
+  static yytype_int8 yytranslatable[] =
+  {
+       1,     1,     1,     1,     1,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     1,     1,     0,     1,     0,     1,     1,
+       0,     0,     0,     0,     1,     0,     0,     1,     0,     0,
+       0
+  };
+  return (yysymbol < YYNTOKENS && yytranslatable[yysymbol]
+          ? _(yy_sname[yysymbol])
+          : yy_sname[yysymbol]);
+}
 #endif
 
-# ifdef YYPRINT
-/* YYTOKNUM[NUM] -- (External) token number corresponding to the
-   (internal) symbol number NUM (which must be that of a token).  */
-static const yytype_int16 yytoknum[] =
-{
-       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
-     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
-     305,   306,   307,   308,   309,   310,   311,   312,   313,   314
-};
-# endif
-
-#define YYPACT_NINF (-130)
+#define YYPACT_NINF (-148)
 
 #define yypact_value_is_default(Yyn) \
   ((Yyn) == YYPACT_NINF)
 
-#define YYTABLE_NINF (-122)
+#define YYTABLE_NINF (-125)
 
 #define yytable_value_is_error(Yyn) \
   0
 
-  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-     STATE-NUM.  */
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    -130,    36,   110,  -130,   -22,  -130,  -130,     2,  -130,  -130,
-    -130,  -130,  -130,  -130,   -19,  -130,    -9,    40,  -130,   -17,
-      -2,  -130,    57,  -130,    21,    66,    77,  -130,  -130,  -130,
-      78,  -130,    87,    92,    44,  -130,  -130,  -130,   165,  -130,
-    -130,  -130,    50,  -130,  -130,    58,  -130,    29,  -130,    15,
-      15,  -130,  -130,  -130,    44,    47,    44,  -130,  -130,  -130,
-    -130,    61,  -130,    30,  -130,  -130,  -130,  -130,  -130,  -130,
-    -130,  -130,  -130,  -130,  -130,    51,  -130,    53,     8,  -130,
-    -130,    64,    67,  -130,    68,    20,    44,    56,    44,  -130,
-      69,  -130,   -37,    59,   -37,  -130,    69,  -130,    59,    44,
-      44,  -130,  -130,  -130,  -130,  -130,  -130,  -130,  -130,    79,
-    -130,  -130,  -130,  -130,  -130,   111,  -130,  -130,  -130,  -130,
-      20,  -130,  -130,  -130,    44,    44,  -130,  -130,  -130,   -37,
-     -37,  -130,   147,    44,  -130,   108,  -130,  -130,    44,   -37,
-    -130,  -130,  -130,   -21,   175,  -130,  -130,    44,    97,   101,
-      99,   100,  -130,  -130,  -130,   117,    64,   175,  -130,  -130,
-    -130,  -130,  -130,    64,  -130,  -130
+    -148,    13,   113,  -148,   -27,  -148,  -148,  -148,  -148,  -148,
+    -148,  -148,  -148,  -148,   -33,  -148,   -21,  -148,   -29,   -26,
+      26,  -148,  -148,    27,    -9,    30,    31,  -148,  -148,  -148,
+      32,  -148,    34,    36,   112,  -148,  -148,  -148,   168,  -148,
+    -148,  -148,    -3,  -148,  -148,    19,  -148,     7,  -148,   -37,
+     -37,   164,  -148,    33,  -148,     2,  -148,  -148,  -148,  -148,
+    -148,  -148,  -148,  -148,  -148,  -148,  -148,  -148,  -148,  -148,
+     112,  -148,  -148,  -148,     9,  -148,    20,    58,  -148,  -148,
+      37,    38,  -148,    40,   155,   112,    35,   112,  -148,    41,
+    -148,   -28,    43,   -28,  -148,    41,  -148,    43,   112,    46,
+     112,  -148,  -148,  -148,  -148,  -148,  -148,  -148,  -148,    44,
+    -148,  -148,  -148,  -148,  -148,    50,  -148,  -148,  -148,  -148,
+     155,  -148,  -148,  -148,   112,   112,  -148,  -148,  -148,   -28,
+     -28,  -148,    21,   112,   112,  -148,    59,  -148,  -148,   112,
+     -28,  -148,  -148,  -148,   112,  -148,   -30,   180,  -148,  -148,
+     112,    48,    49,    52,    53,  -148,  -148,  -148,    65,    37,
+     180,  -148,  -148,  -148,  -148,  -148,    37,  -148,  -148
 };
 
-  /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
-     Performed when YYTABLE does not specify something else to do.  Zero
-     means the default is an error.  */
+/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+   Performed when YYTABLE does not specify something else to do.  Zero
+   means the default is an error.  */
 static const yytype_int8 yydefact[] =
 {
-       3,     0,     0,     1,     0,    48,    46,     0,    41,    42,
-      52,    53,    54,    55,     0,    37,     0,     9,    11,     0,
-       0,     7,     0,    15,     0,     0,     0,    38,    19,    20,
-       0,    24,     0,     0,     0,    27,    28,    29,     0,     6,
-      31,    22,    43,     4,     5,     0,    34,     0,    30,     0,
-       0,   118,   114,   113,     0,    50,    81,   116,    84,   117,
-      39,     0,   108,   109,    10,    12,    13,    14,    16,    17,
-      18,    21,    25,    26,    35,     0,   115,     0,     0,    86,
-      88,   106,     0,    44,     0,     0,     0,    51,    74,    77,
-      72,    80,     0,    49,    66,    69,    72,    47,    65,    82,
-       0,    85,    40,   111,   112,   110,     8,    90,    89,     0,
-      87,     2,   107,    91,    33,    23,    45,    62,    63,    64,
-      36,    58,    61,    60,    75,     0,    78,    73,    79,    67,
-       0,    70,   119,    83,   122,     0,    32,    59,    76,    68,
-     120,    71,    96,    92,    93,    96,    95,     0,     0,     0,
-       0,     0,    99,    57,   100,     0,   106,    94,   101,   102,
-     103,   104,   105,   106,    97,    98
+       3,     0,     0,     1,     0,    47,    45,    49,    40,    41,
+      52,    53,    54,    55,     0,    36,     0,    10,     0,     0,
+       0,     7,    14,    56,     0,     0,     0,    37,    18,    19,
+       0,    23,     0,     0,     0,    26,    27,    28,     0,     6,
+      30,    21,    42,     4,     5,     0,    33,     0,    29,     0,
+       0,     0,    38,     0,   113,   114,    11,    12,    13,    57,
+       9,    15,    16,    17,    20,    24,    25,   123,   119,   118,
+      34,   121,    89,   122,     0,   120,     0,     0,    91,    93,
+     111,     0,    43,     0,     0,     0,    51,    79,    82,    74,
+      85,     0,    48,    68,    71,    74,    46,    67,     0,    50,
+      86,    39,   116,   117,   115,     8,    90,    95,    94,     0,
+      92,     2,   112,    96,    32,    22,    44,    64,    65,    66,
+      35,    60,    63,    62,    80,     0,    83,    75,    84,    69,
+       0,    72,    76,    87,     0,   125,     0,    31,    61,    81,
+      70,    78,    73,    77,    88,   101,    97,    98,   101,   100,
+       0,     0,     0,     0,     0,   104,    59,   105,     0,   111,
+      99,   106,   107,   108,   109,   110,   111,   102,   103
 };
 
-  /* YYPGOTO[NTERM-NUM].  */
+/* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -130,  -130,  -130,  -130,  -130,  -130,   156,  -130,  -130,  -130,
-    -130,  -130,  -130,  -130,  -130,    43,  -130,  -130,   114,   -66,
-     -35,    83,  -130,   -84,   -53,  -130,   -47,  -130,    82,  -130,
-    -130,  -130,    35,  -129,  -130,  -130,   -46,  -130,   -34,   -36,
-    -130,  -130
+    -148,  -148,  -148,  -148,  -148,  -148,   109,  -148,  -148,  -148,
+    -148,  -148,  -148,  -148,  -148,  -148,  -148,    -7,  -148,  -148,
+      66,   -73,   -87,    60,  -148,  -148,   -71,   -83,  -148,   -50,
+    -148,    51,  -148,  -148,  -148,   -19,  -147,  -148,  -148,   -47,
+    -148,   -48,   -38,  -148
 };
 
-  /* YYDEFGOTO[NTERM-NUM].  */
-static const yytype_int16 yydefgoto[] =
+/* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_uint8 yydefgoto[] =
 {
-      -1,     1,     2,    43,    82,   115,    77,    45,    84,    46,
-      50,    49,    47,   155,   120,   121,   122,    97,    93,    94,
-      95,   128,    87,    88,    89,    55,    56,    78,    79,    80,
-     135,   143,   144,   113,    63,   106,    57,    81,    58,    59,
-     141,   111
+       0,     1,     2,    43,    81,   115,    76,    45,    83,    46,
+      50,    49,    51,    47,    60,   158,   120,   121,   122,    96,
+      92,    93,    94,   128,   142,    86,    87,    88,    99,    70,
+      77,    78,    79,   136,   146,   147,   113,    55,   105,    71,
+      80,    72,    73,   111
 };
 
-  /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
-     positive, shift that token.  If negative, reduce the rule whose
-     number is the opposite.  If YYTABLE_NINF, syntax error.  */
+/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule whose
+   number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      74,    90,   124,    96,    96,    51,    52,    99,  -121,    75,
-      53,    91,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    60,   101,    51,    14,    15,   129,   164,    61,   145,
-      48,   146,    51,   103,   165,   126,     3,    27,    62,    65,
-      90,   138,    90,    64,    34,    52,    96,    51,    96,    53,
-      91,   123,    91,   133,    66,    54,    76,   109,    52,   131,
-      67,    68,    53,    52,   139,   101,    42,    53,    92,    69,
-     104,   126,    52,   117,   118,   119,    53,   105,    90,    90,
-      70,    71,    86,    96,    96,   126,   123,    52,    91,    91,
-      72,    53,    90,    96,   131,    73,   140,    83,    85,   101,
-     100,   102,    91,   107,   131,   108,   112,   114,   116,   125,
-     156,     4,   130,   158,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,   156,   134,   127,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      51,   136,   142,   159,   160,   161,   162,   163,    44,    38,
-     110,    39,    40,   137,    98,     0,    75,    41,    42,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    51,   132,
-     157,    14,    15,     0,     0,     0,     0,     0,   147,   148,
-     149,     0,     0,     0,    27,     0,   150,   151,     0,     0,
-       0,    34,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    76,     0,   -56,   152,     0,    52,     0,
-       0,     0,    53,    42,     0,     0,     0,     0,   153,     0,
-       0,     0,     0,     0,   154
+      89,   100,    95,    95,   126,   102,   131,    68,    52,    90,
+      67,    69,   167,     3,   124,    53,    68,    91,   129,   168,
+      69,   148,   106,   149,    67,   141,    48,    54,    56,    58,
+      59,    57,    61,    62,    63,    64,   123,    65,    89,    66,
+      89,   126,   131,   103,    95,    82,    95,    90,   133,    90,
+     104,    68,   106,   131,   139,    69,   126,   140,  -124,    74,
+      84,    85,   107,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,   123,   108,   101,    14,    15,    89,    89,   114,
+     112,   116,    95,    95,   144,   106,    90,    90,    27,   125,
+     135,   137,    89,    95,   143,    34,   106,   130,   127,   159,
+     134,    90,   161,   163,   145,   162,   166,    75,   109,   164,
+     165,    44,   159,   138,     4,    67,    97,    42,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,     0,   110,   160,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,     0,   132,    68,     0,    67,     0,
+      69,     0,     0,    38,     0,    39,    40,    67,     0,    74,
+       0,    41,    42,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,     0,    67,     0,    14,    15,     0,     0,     0,
+       0,     0,     0,     0,   150,   151,   152,     0,    27,    68,
+       0,   153,   154,    69,     0,    34,     0,     0,    68,   117,
+     118,   119,    69,     0,     0,     0,     0,    75,    98,     0,
+       0,   -58,   155,     0,    68,     0,     0,    42,    69,     0,
+       0,     0,     0,     0,   156,     0,     0,     0,     0,     0,
+     157
 };
 
 static const yytype_int16 yycheck[] =
 {
-      34,    47,    86,    49,    50,     3,    43,    54,     0,     1,
-      47,    47,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    40,    56,     3,    16,    17,    92,   156,    47,    50,
-      52,    52,     3,     3,   163,    88,     0,    29,    47,    56,
-      86,   125,    88,     3,    36,    43,    92,     3,    94,    47,
-      86,    85,    88,   100,    56,    53,    48,    49,    43,    94,
-       3,    40,    47,    43,   130,    99,    58,    47,    53,     3,
-      40,   124,    43,    53,    54,    55,    47,    47,   124,   125,
-       3,     3,    53,   129,   130,   138,   120,    43,   124,   125,
-       3,    47,   138,   139,   129,     3,   132,    47,    40,   133,
-      53,    40,   138,    52,   139,    52,    42,    40,    40,    53,
-     144,     1,    53,   147,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,   157,    45,    56,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-       3,    40,    44,    56,    53,    56,    56,    40,     2,    49,
-      78,    51,    52,   120,    50,    -1,     1,    57,    58,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,     3,    96,
-     145,    16,    17,    -1,    -1,    -1,    -1,    -1,    13,    14,
-      15,    -1,    -1,    -1,    29,    -1,    21,    22,    -1,    -1,
-      -1,    36,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    48,    -1,    40,    41,    -1,    43,    -1,
-      -1,    -1,    47,    58,    -1,    -1,    -1,    -1,    53,    -1,
-      -1,    -1,    -1,    -1,    59
+      47,    51,    49,    50,    87,     3,    93,    44,    41,    47,
+       3,    48,   159,     0,    85,    48,    44,    54,    91,   166,
+      48,    51,    70,    53,     3,     4,    53,    48,    57,     3,
+       3,    57,    41,     3,     3,     3,    84,     3,    85,     3,
+      87,   124,   129,    41,    91,    48,    93,    85,    98,    87,
+      48,    44,   100,   140,   125,    48,   139,   130,     0,     1,
+      41,    54,    53,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,   120,    53,    41,    17,    18,   124,   125,    41,
+      43,    41,   129,   130,   134,   133,   124,   125,    30,    54,
+      46,    41,   139,   140,   132,    37,   144,    54,    57,   147,
+      54,   139,   150,    54,    45,    57,    41,    49,    50,    57,
+      57,     2,   160,   120,     1,     3,    50,    59,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    -1,    77,   148,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    -1,    95,    44,    -1,     3,    -1,
+      48,    -1,    -1,    50,    -1,    52,    53,     3,    -1,     1,
+      -1,    58,    59,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    -1,     3,    -1,    17,    18,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    14,    15,    16,    -1,    30,    44,
+      -1,    21,    22,    48,    -1,    37,    -1,    -1,    44,    54,
+      55,    56,    48,    -1,    -1,    -1,    -1,    49,    54,    -1,
+      -1,    41,    42,    -1,    44,    -1,    -1,    59,    48,    -1,
+      -1,    -1,    -1,    -1,    54,    -1,    -1,    -1,    -1,    -1,
+      60
 };
 
-  /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-     symbol of state STATE-NUM.  */
+/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
+   state STATE-NUM.  */
 static const yytype_int8 yystos[] =
 {
-       0,    61,    62,     0,     1,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    49,    51,
-      52,    57,    58,    63,    66,    67,    69,    72,    52,    71,
-      70,     3,    43,    47,    53,    85,    86,    96,    98,    99,
-      40,    47,    47,    94,     3,    56,    56,     3,    40,     3,
-       3,     3,     3,     3,    98,     1,    48,    66,    87,    88,
-      89,    97,    64,    47,    68,    40,    53,    82,    83,    84,
-      96,    99,    53,    78,    79,    80,    96,    77,    78,    86,
-      53,    98,    40,     3,    40,    47,    95,    52,    52,    49,
-      88,   101,    42,    93,    40,    65,    40,    53,    54,    55,
-      74,    75,    76,    98,    83,    53,    84,    56,    81,    79,
-      53,    80,    81,    86,    45,    90,    40,    75,    83,    79,
-      99,   100,    44,    91,    92,    50,    52,    13,    14,    15,
-      21,    22,    41,    53,    59,    73,    98,    92,    98,    56,
-      53,    56,    56,    40,    93,    93
+       0,    62,    63,     0,     1,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    50,    52,
+      53,    58,    59,    64,    67,    68,    70,    74,    53,    72,
+      71,    73,    41,    48,    48,    98,    57,    57,     3,     3,
+      75,    41,     3,     3,     3,     3,     3,     3,    44,    48,
+      90,   100,   102,   103,     1,    49,    67,    91,    92,    93,
+     101,    65,    48,    69,    41,    54,    86,    87,    88,   100,
+     103,    54,    81,    82,    83,   100,    80,    81,    54,    89,
+      90,    41,     3,    41,    48,    99,   102,    53,    53,    50,
+      92,   104,    43,    97,    41,    66,    41,    54,    55,    56,
+      77,    78,    79,   102,    87,    54,    88,    57,    84,    82,
+      54,    83,    84,    90,    54,    46,    94,    41,    78,    87,
+      82,     4,    85,   103,    90,    45,    95,    96,    51,    53,
+      14,    15,    16,    21,    22,    42,    54,    60,    76,   102,
+      96,   102,    57,    54,    57,    57,    41,    97,    97
 };
 
-  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM.  */
 static const yytype_int8 yyr1[] =
 {
-       0,    60,    61,    62,    62,    63,    63,    63,    63,    63,
-      63,    63,    63,    63,    63,    63,    63,    63,    63,    63,
-      63,    63,    64,    63,    63,    63,    63,    63,    63,    63,
-      63,    63,    65,    65,    66,    66,    66,    66,    66,    66,
-      66,    67,    67,    68,    68,    66,    70,    69,    71,    69,
-      69,    69,    72,    72,    72,    72,    73,    73,    74,    74,
-      75,    75,    76,    76,    76,    77,    78,    78,    78,    79,
-      79,    80,    81,    81,    82,    82,    82,    83,    83,    84,
-      84,    85,    85,    85,    86,    86,    87,    87,    88,    88,
-      88,    90,    89,    91,    91,    91,    92,    92,    92,    92,
-      92,    92,    92,    92,    92,    92,    93,    93,    94,    95,
-      95,    95,    95,    96,    96,    97,    98,    98,    99,   100,
-     100,   101,   101
+       0,    61,    62,    63,    63,    64,    64,    64,    64,    64,
+      64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
+      64,    65,    64,    64,    64,    64,    64,    64,    64,    64,
+      64,    66,    66,    67,    67,    67,    67,    67,    67,    67,
+      68,    68,    69,    69,    67,    71,    70,    72,    70,    73,
+      70,    70,    74,    74,    74,    74,    75,    75,    76,    76,
+      77,    77,    78,    78,    79,    79,    79,    80,    81,    81,
+      81,    82,    82,    83,    84,    84,    85,    85,    85,    86,
+      86,    86,    87,    87,    88,    88,    89,    89,    89,    90,
+      90,    91,    91,    92,    92,    92,    94,    93,    95,    95,
+      95,    96,    96,    96,    96,    96,    96,    96,    96,    96,
+      96,    97,    97,    98,    99,    99,    99,    99,   100,   100,
+     101,   102,   102,   103,   104,   104
 };
 
-  /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
+/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM.  */
 static const yytype_int8 yyr2[] =
 {
-       0,     2,     4,     0,     2,     1,     1,     1,     3,     1,
-       2,     1,     2,     2,     2,     1,     2,     2,     2,     1,
-       1,     2,     0,     3,     1,     2,     2,     1,     1,     1,
-       2,     1,     2,     1,     1,     2,     3,     1,     1,     2,
-       3,     1,     1,     0,     1,     3,     0,     3,     0,     3,
-       2,     2,     1,     1,     1,     1,     0,     1,     1,     2,
-       1,     1,     1,     1,     1,     1,     1,     2,     3,     1,
-       2,     3,     0,     1,     1,     2,     3,     1,     2,     2,
-       1,     1,     2,     3,     1,     2,     1,     2,     1,     2,
-       2,     0,     5,     1,     3,     2,     0,     3,     4,     2,
-       2,     3,     3,     3,     3,     3,     0,     1,     1,     0,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     0,
-       1,     0,     2
+       0,     2,     4,     0,     2,     1,     1,     1,     3,     2,
+       1,     2,     2,     2,     1,     2,     2,     2,     1,     1,
+       2,     0,     3,     1,     2,     2,     1,     1,     1,     2,
+       1,     2,     1,     1,     2,     3,     1,     1,     2,     3,
+       1,     1,     0,     1,     3,     0,     3,     0,     3,     0,
+       3,     2,     1,     1,     1,     1,     0,     1,     0,     1,
+       1,     2,     1,     1,     1,     1,     1,     1,     1,     2,
+       3,     1,     2,     3,     0,     1,     0,     1,     1,     1,
+       2,     3,     1,     2,     2,     1,     1,     2,     3,     1,
+       2,     1,     2,     1,     2,     2,     0,     5,     1,     3,
+       2,     0,     3,     4,     2,     2,     3,     3,     3,     3,
+       3,     0,     1,     1,     0,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     0,     2
 };
 
 
+enum { YYENOMEM = -2 };
+
 #define yyerrok         (yyerrstatus = 0)
-#define yyclearin       (yychar = YYEMPTY)
-#define YYEMPTY         (-2)
-#define YYEOF           0
+#define yyclearin       (yychar = GRAM_EMPTY)
 
 #define YYACCEPT        goto yyacceptlab
 #define YYABORT         goto yyabortlab
 #define YYERROR         goto yyerrorlab
+#define YYNOMEM         goto yyexhaustedlab
 
 
 #define YYRECOVERING()  (!!yyerrstatus)
 
 #define YYBACKUP(Token, Value)                                    \
   do                                                              \
-    if (yychar == YYEMPTY)                                        \
+    if (yychar == GRAM_EMPTY)                                        \
       {                                                           \
         yychar = (Token);                                         \
         yylval = (Value);                                         \
@@ -808,10 +962,9 @@
       }                                                           \
   while (0)
 
-/* Error token number */
-#define YYTERROR        1
-#define YYERRCODE       256
-
+/* Backward compatibility with an undocumented macro.
+   Use GRAM_error or GRAM_UNDEF. */
+#define YYERRCODE GRAM_UNDEF
 
 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
    If N is 0, then set CURRENT to the empty location which ends
@@ -855,12 +1008,19 @@
 } while (0)
 
 
-/* YY_LOCATION_PRINT -- Print the location on the stream.
+/* YYLOCATION_PRINT -- Print the location on the stream.
    This macro was not mandated originally: define only if we know
    we won't break user code: when these are the locations we know.  */
 
-#ifndef YY_LOCATION_PRINT
-# if defined GRAM_LTYPE_IS_TRIVIAL && GRAM_LTYPE_IS_TRIVIAL
+# ifndef YYLOCATION_PRINT
+
+#  if defined YY_LOCATION_PRINT
+
+   /* Temporary convenience wrapper in case some people defined the
+      undocumented and private YY_LOCATION_PRINT macros.  */
+#   define YYLOCATION_PRINT(File, Loc)  YY_LOCATION_PRINT(File, *(Loc))
+
+#  elif defined GRAM_LTYPE_IS_TRIVIAL && GRAM_LTYPE_IS_TRIVIAL
 
 /* Print *YYLOCP on YYO.  Private, do not rely on its existence. */
 
@@ -888,24 +1048,32 @@
         res += YYFPRINTF (yyo, "-%d", end_col);
     }
   return res;
- }
+}
 
-#  define YY_LOCATION_PRINT(File, Loc)          \
-  yy_location_print_ (File, &(Loc))
+#   define YYLOCATION_PRINT  yy_location_print_
 
-# else
-#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-# endif
-#endif
+    /* Temporary convenience wrapper in case some people defined the
+       undocumented and private YY_LOCATION_PRINT macros.  */
+#   define YY_LOCATION_PRINT(File, Loc)  YYLOCATION_PRINT(File, &(Loc))
+
+#  else
+
+#   define YYLOCATION_PRINT(File, Loc) ((void) 0)
+    /* Temporary convenience wrapper in case some people defined the
+       undocumented and private YY_LOCATION_PRINT macros.  */
+#   define YY_LOCATION_PRINT  YYLOCATION_PRINT
+
+#  endif
+# endif /* !defined YYLOCATION_PRINT */
 
 
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)                    \
 do {                                                                      \
   if (yydebug)                                                            \
     {                                                                     \
       YYFPRINTF (stderr, "%s ", Title);                                   \
       yy_symbol_print (stderr,                                            \
-                  Type, Value, Location); \
+                  Kind, Value, Location); \
       YYFPRINTF (stderr, "\n");                                           \
     }                                                                     \
 } while (0)
@@ -916,123 +1084,126 @@
 `-----------------------------------*/
 
 static void
-yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
+yy_symbol_value_print (FILE *yyo,
+                       yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
 {
   FILE *yyoutput = yyo;
-  YYUSE (yyoutput);
-  YYUSE (yylocationp);
+  YY_USE (yyoutput);
+  YY_USE (yylocationp);
   if (!yyvaluep)
     return;
-# ifdef YYPRINT
-  if (yytype < YYNTOKENS)
-    YYPRINT (yyo, yytoknum[yytype], *yyvaluep);
-# endif
 /* "%code pre-printer" blocks.  */
-#line 213 "src/parse-gram.y"
+#line 230 "src/parse-gram.y"
 tron (yyo);
 
-#line 935 "src/parse-gram.c"
+#line 1100 "src/parse-gram.c"
   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-  switch (yytype)
+  switch (yykind)
     {
-    case 3: /* "string"  */
-#line 220 "src/parse-gram.y"
+    case YYSYMBOL_STRING: /* "string"  */
+#line 237 "src/parse-gram.y"
          { fputs (((*yyvaluep).STRING), yyo); }
-#line 942 "src/parse-gram.c"
+#line 1107 "src/parse-gram.c"
         break;
 
-    case 20: /* "%error-verbose"  */
-#line 227 "src/parse-gram.y"
+    case YYSYMBOL_TSTRING: /* "translatable string"  */
+#line 237 "src/parse-gram.y"
+         { fputs (((*yyvaluep).TSTRING), yyo); }
+#line 1113 "src/parse-gram.c"
+        break;
+
+    case YYSYMBOL_PERCENT_ERROR_VERBOSE: /* "%error-verbose"  */
+#line 244 "src/parse-gram.y"
          { fputs (((*yyvaluep).PERCENT_ERROR_VERBOSE), yyo); }
-#line 948 "src/parse-gram.c"
+#line 1119 "src/parse-gram.c"
         break;
 
-    case 23: /* "%<flag>"  */
-#line 230 "src/parse-gram.y"
-         { fprintf (yyo, "%%%s", ((*yyvaluep).PERCENT_FLAG)); }
-#line 954 "src/parse-gram.c"
-        break;
-
-    case 24: /* "%file-prefix"  */
-#line 227 "src/parse-gram.y"
+    case YYSYMBOL_PERCENT_FILE_PREFIX: /* "%file-prefix"  */
+#line 244 "src/parse-gram.y"
          { fputs (((*yyvaluep).PERCENT_FILE_PREFIX), yyo); }
-#line 960 "src/parse-gram.c"
+#line 1125 "src/parse-gram.c"
         break;
 
-    case 28: /* "%name-prefix"  */
-#line 227 "src/parse-gram.y"
+    case YYSYMBOL_PERCENT_FLAG: /* "%<flag>"  */
+#line 247 "src/parse-gram.y"
+         { fprintf (yyo, "%%%s", ((*yyvaluep).PERCENT_FLAG)); }
+#line 1131 "src/parse-gram.c"
+        break;
+
+    case YYSYMBOL_PERCENT_NAME_PREFIX: /* "%name-prefix"  */
+#line 244 "src/parse-gram.y"
          { fputs (((*yyvaluep).PERCENT_NAME_PREFIX), yyo); }
-#line 966 "src/parse-gram.c"
+#line 1137 "src/parse-gram.c"
         break;
 
-    case 33: /* "%pure-parser"  */
-#line 227 "src/parse-gram.y"
+    case YYSYMBOL_PERCENT_PURE_PARSER: /* "%pure-parser"  */
+#line 244 "src/parse-gram.y"
          { fputs (((*yyvaluep).PERCENT_PURE_PARSER), yyo); }
-#line 972 "src/parse-gram.c"
+#line 1143 "src/parse-gram.c"
         break;
 
-    case 40: /* "{...}"  */
-#line 220 "src/parse-gram.y"
+    case YYSYMBOL_BRACED_CODE: /* "{...}"  */
+#line 237 "src/parse-gram.y"
          { fputs (((*yyvaluep).BRACED_CODE), yyo); }
-#line 978 "src/parse-gram.c"
+#line 1149 "src/parse-gram.c"
         break;
 
-    case 41: /* "%?{...}"  */
-#line 220 "src/parse-gram.y"
+    case YYSYMBOL_BRACED_PREDICATE: /* "%?{...}"  */
+#line 237 "src/parse-gram.y"
          { fputs (((*yyvaluep).BRACED_PREDICATE), yyo); }
-#line 984 "src/parse-gram.c"
+#line 1155 "src/parse-gram.c"
         break;
 
-    case 42: /* "[identifier]"  */
-#line 228 "src/parse-gram.y"
+    case YYSYMBOL_BRACKETED_ID: /* "[identifier]"  */
+#line 245 "src/parse-gram.y"
          { fprintf (yyo, "[%s]", ((*yyvaluep).BRACKETED_ID)); }
-#line 990 "src/parse-gram.c"
+#line 1161 "src/parse-gram.c"
         break;
 
-    case 43: /* "character literal"  */
-#line 217 "src/parse-gram.y"
-         { fputs (char_name (((*yyvaluep).CHAR)), yyo); }
-#line 996 "src/parse-gram.c"
-        break;
-
-    case 45: /* "epilogue"  */
-#line 220 "src/parse-gram.y"
-         { fputs (((*yyvaluep).EPILOGUE), yyo); }
-#line 1002 "src/parse-gram.c"
-        break;
-
-    case 47: /* "identifier"  */
-#line 227 "src/parse-gram.y"
-         { fputs (((*yyvaluep).ID), yyo); }
-#line 1008 "src/parse-gram.c"
-        break;
-
-    case 48: /* "identifier:"  */
-#line 229 "src/parse-gram.y"
-         { fprintf (yyo, "%s:", ((*yyvaluep).ID_COLON)); }
-#line 1014 "src/parse-gram.c"
-        break;
-
-    case 51: /* "%{...%}"  */
-#line 220 "src/parse-gram.y"
-         { fputs (((*yyvaluep).PROLOGUE), yyo); }
-#line 1020 "src/parse-gram.c"
-        break;
-
-    case 53: /* "<tag>"  */
-#line 231 "src/parse-gram.y"
-         { fprintf (yyo, "<%s>", ((*yyvaluep).TAG)); }
-#line 1026 "src/parse-gram.c"
-        break;
-
-    case 56: /* "integer"  */
+    case YYSYMBOL_CHAR_LITERAL: /* "character literal"  */
 #line 234 "src/parse-gram.y"
-         { fprintf (yyo, "%d", ((*yyvaluep).INT)); }
-#line 1032 "src/parse-gram.c"
+         { fputs (char_name (((*yyvaluep).CHAR_LITERAL)), yyo); }
+#line 1167 "src/parse-gram.c"
         break;
 
-    case 57: /* "%param"  */
-#line 273 "src/parse-gram.y"
+    case YYSYMBOL_EPILOGUE: /* "epilogue"  */
+#line 237 "src/parse-gram.y"
+         { fputs (((*yyvaluep).EPILOGUE), yyo); }
+#line 1173 "src/parse-gram.c"
+        break;
+
+    case YYSYMBOL_ID: /* "identifier"  */
+#line 244 "src/parse-gram.y"
+         { fputs (((*yyvaluep).ID), yyo); }
+#line 1179 "src/parse-gram.c"
+        break;
+
+    case YYSYMBOL_ID_COLON: /* "identifier:"  */
+#line 246 "src/parse-gram.y"
+         { fprintf (yyo, "%s:", ((*yyvaluep).ID_COLON)); }
+#line 1185 "src/parse-gram.c"
+        break;
+
+    case YYSYMBOL_PROLOGUE: /* "%{...%}"  */
+#line 237 "src/parse-gram.y"
+         { fputs (((*yyvaluep).PROLOGUE), yyo); }
+#line 1191 "src/parse-gram.c"
+        break;
+
+    case YYSYMBOL_TAG: /* "<tag>"  */
+#line 248 "src/parse-gram.y"
+         { fprintf (yyo, "<%s>", ((*yyvaluep).TAG)); }
+#line 1197 "src/parse-gram.c"
+        break;
+
+    case YYSYMBOL_INT_LITERAL: /* "integer literal"  */
+#line 251 "src/parse-gram.y"
+         { fprintf (yyo, "%d", ((*yyvaluep).INT_LITERAL)); }
+#line 1203 "src/parse-gram.c"
+        break;
+
+    case YYSYMBOL_PERCENT_PARAM: /* "%param"  */
+#line 290 "src/parse-gram.y"
 {
   switch (((*yyvaluep).PERCENT_PARAM))
     {
@@ -1045,107 +1216,119 @@
       case param_none: aver (false); break;
     }
 }
-#line 1049 "src/parse-gram.c"
+#line 1220 "src/parse-gram.c"
         break;
 
-    case 67: /* code_props_type  */
-#line 410 "src/parse-gram.y"
+    case YYSYMBOL_code_props_type: /* code_props_type  */
+#line 422 "src/parse-gram.y"
          { fprintf (yyo, "%s", code_props_type_string (((*yyvaluep).code_props_type))); }
-#line 1055 "src/parse-gram.c"
+#line 1226 "src/parse-gram.c"
         break;
 
-    case 73: /* tag.opt  */
-#line 227 "src/parse-gram.y"
-         { fputs (((*yyvaluep).yytype_73), yyo); }
-#line 1061 "src/parse-gram.c"
+    case YYSYMBOL_75_string_opt: /* string.opt  */
+#line 237 "src/parse-gram.y"
+         { fputs (((*yyvaluep).yykind_75), yyo); }
+#line 1232 "src/parse-gram.c"
         break;
 
-    case 74: /* generic_symlist  */
-#line 243 "src/parse-gram.y"
+    case YYSYMBOL_76_tag_opt: /* tag.opt  */
+#line 244 "src/parse-gram.y"
+         { fputs (((*yyvaluep).yykind_76), yyo); }
+#line 1238 "src/parse-gram.c"
+        break;
+
+    case YYSYMBOL_generic_symlist: /* generic_symlist  */
+#line 260 "src/parse-gram.y"
          { symbol_list_syms_print (((*yyvaluep).generic_symlist), yyo); }
-#line 1067 "src/parse-gram.c"
+#line 1244 "src/parse-gram.c"
         break;
 
-    case 75: /* generic_symlist_item  */
-#line 243 "src/parse-gram.y"
+    case YYSYMBOL_generic_symlist_item: /* generic_symlist_item  */
+#line 260 "src/parse-gram.y"
          { symbol_list_syms_print (((*yyvaluep).generic_symlist_item), yyo); }
-#line 1073 "src/parse-gram.c"
+#line 1250 "src/parse-gram.c"
         break;
 
-    case 76: /* tag  */
-#line 231 "src/parse-gram.y"
+    case YYSYMBOL_tag: /* tag  */
+#line 248 "src/parse-gram.y"
          { fprintf (yyo, "<%s>", ((*yyvaluep).tag)); }
-#line 1079 "src/parse-gram.c"
+#line 1256 "src/parse-gram.c"
         break;
 
-    case 77: /* nterm_decls  */
-#line 243 "src/parse-gram.y"
+    case YYSYMBOL_nterm_decls: /* nterm_decls  */
+#line 260 "src/parse-gram.y"
          { symbol_list_syms_print (((*yyvaluep).nterm_decls), yyo); }
-#line 1085 "src/parse-gram.c"
+#line 1262 "src/parse-gram.c"
         break;
 
-    case 78: /* token_decls  */
-#line 243 "src/parse-gram.y"
+    case YYSYMBOL_token_decls: /* token_decls  */
+#line 260 "src/parse-gram.y"
          { symbol_list_syms_print (((*yyvaluep).token_decls), yyo); }
-#line 1091 "src/parse-gram.c"
+#line 1268 "src/parse-gram.c"
         break;
 
-    case 79: /* token_decl.1  */
-#line 243 "src/parse-gram.y"
-         { symbol_list_syms_print (((*yyvaluep).yytype_79), yyo); }
-#line 1097 "src/parse-gram.c"
+    case YYSYMBOL_82_token_decl_1: /* token_decl.1  */
+#line 260 "src/parse-gram.y"
+         { symbol_list_syms_print (((*yyvaluep).yykind_82), yyo); }
+#line 1274 "src/parse-gram.c"
         break;
 
-    case 80: /* token_decl  */
-#line 237 "src/parse-gram.y"
+    case YYSYMBOL_token_decl: /* token_decl  */
+#line 254 "src/parse-gram.y"
          { fprintf (yyo, "%s", ((*yyvaluep).token_decl) ? ((*yyvaluep).token_decl)->tag : "<NULL>"); }
-#line 1103 "src/parse-gram.c"
+#line 1280 "src/parse-gram.c"
         break;
 
-    case 81: /* int.opt  */
-#line 234 "src/parse-gram.y"
-         { fprintf (yyo, "%d", ((*yyvaluep).yytype_81)); }
-#line 1109 "src/parse-gram.c"
+    case YYSYMBOL_84_int_opt: /* int.opt  */
+#line 251 "src/parse-gram.y"
+         { fprintf (yyo, "%d", ((*yyvaluep).yykind_84)); }
+#line 1286 "src/parse-gram.c"
         break;
 
-    case 82: /* token_decls_for_prec  */
-#line 243 "src/parse-gram.y"
+    case YYSYMBOL_alias: /* alias  */
+#line 254 "src/parse-gram.y"
+         { fprintf (yyo, "%s", ((*yyvaluep).alias) ? ((*yyvaluep).alias)->tag : "<NULL>"); }
+#line 1292 "src/parse-gram.c"
+        break;
+
+    case YYSYMBOL_token_decls_for_prec: /* token_decls_for_prec  */
+#line 260 "src/parse-gram.y"
          { symbol_list_syms_print (((*yyvaluep).token_decls_for_prec), yyo); }
-#line 1115 "src/parse-gram.c"
+#line 1298 "src/parse-gram.c"
         break;
 
-    case 83: /* token_decl_for_prec.1  */
-#line 243 "src/parse-gram.y"
-         { symbol_list_syms_print (((*yyvaluep).yytype_83), yyo); }
-#line 1121 "src/parse-gram.c"
+    case YYSYMBOL_87_token_decl_for_prec_1: /* token_decl_for_prec.1  */
+#line 260 "src/parse-gram.y"
+         { symbol_list_syms_print (((*yyvaluep).yykind_87), yyo); }
+#line 1304 "src/parse-gram.c"
         break;
 
-    case 84: /* token_decl_for_prec  */
-#line 237 "src/parse-gram.y"
+    case YYSYMBOL_token_decl_for_prec: /* token_decl_for_prec  */
+#line 254 "src/parse-gram.y"
          { fprintf (yyo, "%s", ((*yyvaluep).token_decl_for_prec) ? ((*yyvaluep).token_decl_for_prec)->tag : "<NULL>"); }
-#line 1127 "src/parse-gram.c"
+#line 1310 "src/parse-gram.c"
         break;
 
-    case 85: /* symbol_decls  */
-#line 243 "src/parse-gram.y"
+    case YYSYMBOL_symbol_decls: /* symbol_decls  */
+#line 260 "src/parse-gram.y"
          { symbol_list_syms_print (((*yyvaluep).symbol_decls), yyo); }
-#line 1133 "src/parse-gram.c"
+#line 1316 "src/parse-gram.c"
         break;
 
-    case 86: /* symbol_decl.1  */
-#line 243 "src/parse-gram.y"
-         { symbol_list_syms_print (((*yyvaluep).yytype_86), yyo); }
-#line 1139 "src/parse-gram.c"
+    case YYSYMBOL_90_symbols_1: /* symbols.1  */
+#line 260 "src/parse-gram.y"
+         { symbol_list_syms_print (((*yyvaluep).yykind_90), yyo); }
+#line 1322 "src/parse-gram.c"
         break;
 
-    case 94: /* variable  */
-#line 227 "src/parse-gram.y"
+    case YYSYMBOL_variable: /* variable  */
+#line 244 "src/parse-gram.y"
          { fputs (((*yyvaluep).variable), yyo); }
-#line 1145 "src/parse-gram.c"
+#line 1328 "src/parse-gram.c"
         break;
 
-    case 95: /* value  */
-#line 713 "src/parse-gram.y"
+    case YYSYMBOL_value: /* value  */
+#line 747 "src/parse-gram.y"
 {
   switch (((*yyvaluep).value).kind)
     {
@@ -1154,37 +1337,31 @@
     case muscle_string:  fprintf (yyo, "\"%s\"", ((*yyvaluep).value).chars); break;
     }
 }
-#line 1158 "src/parse-gram.c"
+#line 1341 "src/parse-gram.c"
         break;
 
-    case 96: /* id  */
-#line 237 "src/parse-gram.y"
+    case YYSYMBOL_id: /* id  */
+#line 254 "src/parse-gram.y"
          { fprintf (yyo, "%s", ((*yyvaluep).id) ? ((*yyvaluep).id)->tag : "<NULL>"); }
-#line 1164 "src/parse-gram.c"
+#line 1347 "src/parse-gram.c"
         break;
 
-    case 97: /* id_colon  */
-#line 238 "src/parse-gram.y"
+    case YYSYMBOL_id_colon: /* id_colon  */
+#line 255 "src/parse-gram.y"
          { fprintf (yyo, "%s:", ((*yyvaluep).id_colon)->tag); }
-#line 1170 "src/parse-gram.c"
+#line 1353 "src/parse-gram.c"
         break;
 
-    case 98: /* symbol  */
-#line 237 "src/parse-gram.y"
+    case YYSYMBOL_symbol: /* symbol  */
+#line 254 "src/parse-gram.y"
          { fprintf (yyo, "%s", ((*yyvaluep).symbol) ? ((*yyvaluep).symbol)->tag : "<NULL>"); }
-#line 1176 "src/parse-gram.c"
+#line 1359 "src/parse-gram.c"
         break;
 
-    case 99: /* string_as_id  */
-#line 237 "src/parse-gram.y"
+    case YYSYMBOL_string_as_id: /* string_as_id  */
+#line 254 "src/parse-gram.y"
          { fprintf (yyo, "%s", ((*yyvaluep).string_as_id) ? ((*yyvaluep).string_as_id)->tag : "<NULL>"); }
-#line 1182 "src/parse-gram.c"
-        break;
-
-    case 100: /* string_as_id.opt  */
-#line 237 "src/parse-gram.y"
-         { fprintf (yyo, "%s", ((*yyvaluep).yytype_100) ? ((*yyvaluep).yytype_100)->tag : "<NULL>"); }
-#line 1188 "src/parse-gram.c"
+#line 1365 "src/parse-gram.c"
         break;
 
       default:
@@ -1192,10 +1369,10 @@
     }
   YY_IGNORE_MAYBE_UNINITIALIZED_END
 /* "%code post-printer" blocks.  */
-#line 214 "src/parse-gram.y"
+#line 231 "src/parse-gram.y"
 troff (yyo);
 
-#line 1199 "src/parse-gram.c"
+#line 1376 "src/parse-gram.c"
 }
 
 
@@ -1204,14 +1381,15 @@
 `---------------------------*/
 
 static void
-yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
+yy_symbol_print (FILE *yyo,
+                 yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
 {
   YYFPRINTF (yyo, "%s %s (",
-             yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
+             yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
 
-  YY_LOCATION_PRINT (yyo, *yylocationp);
+  YYLOCATION_PRINT (yyo, yylocationp);
   YYFPRINTF (yyo, ": ");
-  yy_symbol_value_print (yyo, yytype, yyvaluep, yylocationp);
+  yy_symbol_value_print (yyo, yykind, yyvaluep, yylocationp);
   YYFPRINTF (yyo, ")");
 }
 
@@ -1244,7 +1422,8 @@
 `------------------------------------------------*/
 
 static void
-yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule)
+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp,
+                 int yyrule)
 {
   int yylno = yyrline[yyrule];
   int yynrhs = yyr2[yyrule];
@@ -1256,9 +1435,9 @@
     {
       YYFPRINTF (stderr, "   $%d = ", yyi + 1);
       yy_symbol_print (stderr,
-                       yystos[yyssp[yyi + 1 - yynrhs]],
-                       &yyvsp[(yyi + 1) - (yynrhs)]
-                       , &(yylsp[(yyi + 1) - (yynrhs)])                       );
+                       YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
+                       &yyvsp[(yyi + 1) - (yynrhs)],
+                       &(yylsp[(yyi + 1) - (yynrhs)]));
       YYFPRINTF (stderr, "\n");
     }
 }
@@ -1273,8 +1452,8 @@
    multiple parsers can coexist.  */
 int yydebug;
 #else /* !GRAM_DEBUG */
-# define YYDPRINTF(Args)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YYDPRINTF(Args) ((void) 0)
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
 # define YY_STACK_PRINT(Bottom, Top)
 # define YY_REDUCE_PRINT(Rule)
 #endif /* !GRAM_DEBUG */
@@ -1296,6 +1475,7 @@
 # define YYMAXDEPTH 10000
 #endif
 
+
 /* Given a state stack such that *YYBOTTOM is its bottom, such that
    *YYTOP is either its top or is YYTOP_EMPTY to indicate an empty
    stack, and such that *YYCAPACITY is the maximum number of elements it
@@ -1305,7 +1485,7 @@
    *YYTOP, and *YYCAPACITY to reflect the new capacity and memory
    location.  If *YYBOTTOM != YYBOTTOM_NO_FREE, then free the old stack
    using YYSTACK_FREE.  Return 0 if successful or if no reallocation is
-   required.  Return 1 if memory is exhausted.  */
+   required.  Return YYENOMEM if memory is exhausted.  */
 static int
 yy_lac_stack_realloc (YYPTRDIFF_T *yycapacity, YYPTRDIFF_T yyadd,
 #if GRAM_DEBUG
@@ -1330,7 +1510,7 @@
         {
           YYDPRINTF ((stderr, "%smax size exceeded%s", yydebug_prefix,
                       yydebug_suffix));
-          return 1;
+          return YYENOMEM;
         }
       if (YYMAXDEPTH < yyalloc)
         yyalloc = YYMAXDEPTH;
@@ -1342,7 +1522,7 @@
         {
           YYDPRINTF ((stderr, "%srealloc failed%s", yydebug_prefix,
                       yydebug_suffix));
-          return 1;
+          return YYENOMEM;
         }
       if (*yytop != yytop_empty)
         {
@@ -1383,23 +1563,22 @@
    current lookahead, then check if that lookahead can eventually be
    shifted if syntactic actions continue from the current context.
    Report a syntax error if it cannot.  */
-#define YY_LAC_ESTABLISH                                         \
-do {                                                             \
-  if (!yy_lac_established)                                       \
-    {                                                            \
-      YYDPRINTF ((stderr,                                        \
-                  "LAC: initial context established for %s\n",   \
-                  yytname[yytoken]));                            \
-      yy_lac_established = 1;                                    \
-      {                                                          \
-        int yy_lac_status =                                      \
-          yy_lac (yyesa, &yyes, &yyes_capacity, yyssp, yytoken); \
-        if (yy_lac_status == 2)                                  \
-          goto yyexhaustedlab;                                   \
-        if (yy_lac_status == 1)                                  \
-          goto yyerrlab;                                         \
-      }                                                          \
-    }                                                            \
+#define YY_LAC_ESTABLISH                                                \
+do {                                                                    \
+  if (!yy_lac_established)                                              \
+    {                                                                   \
+      YYDPRINTF ((stderr,                                               \
+                  "LAC: initial context established for %s\n",          \
+                  yysymbol_name (yytoken)));                            \
+      yy_lac_established = 1;                                           \
+      switch (yy_lac (yyesa, &yyes, &yyes_capacity, yyssp, yytoken))    \
+        {                                                               \
+        case YYENOMEM:                                                  \
+          YYNOMEM;                                                      \
+        case 1:                                                         \
+          goto yyerrlab;                                                \
+        }                                                               \
+    }                                                                   \
 } while (0)
 
 /* Discard any previous initial lookahead context because of Event,
@@ -1418,9 +1597,8 @@
 do {                                                                     \
   if (yy_lac_established)                                                \
     {                                                                    \
-      if (yydebug)                                                       \
-        YYFPRINTF (stderr, "LAC: initial context discarded due to "      \
-                   Event "\n");                                          \
+      YYDPRINTF ((stderr, "LAC: initial context discarded due to "       \
+                  Event "\n"));                                          \
       yy_lac_established = 0;                                            \
     }                                                                    \
 } while (0)
@@ -1430,7 +1608,7 @@
 
 /* Given the stack whose top is *YYSSP, return 0 iff YYTOKEN can
    eventually (after perhaps some reductions) be shifted, return 1 if
-   not, or return 2 if memory is exhausted.  As preconditions and
+   not, or return YYENOMEM if memory is exhausted.  As preconditions and
    postconditions: *YYES_CAPACITY is the allocated size of the array to
    which *YYES points, and either *YYES = YYESA or *YYES points to an
    array allocated with YYSTACK_ALLOC.  yy_lac may overwrite the
@@ -1438,24 +1616,26 @@
    any old *YYES other than YYESA.  */
 static int
 yy_lac (yy_state_t *yyesa, yy_state_t **yyes,
-        YYPTRDIFF_T *yyes_capacity, yy_state_t *yyssp, int yytoken)
+        YYPTRDIFF_T *yyes_capacity, yy_state_t *yyssp, yysymbol_kind_t yytoken)
 {
   yy_state_t *yyes_prev = yyssp;
   yy_state_t *yyesp = yyes_prev;
-  YYDPRINTF ((stderr, "LAC: checking lookahead %s:", yytname[yytoken]));
-  if (yytoken == YYUNDEFTOK)
+  /* Reduce until we encounter a shift and thereby accept the token.  */
+  YYDPRINTF ((stderr, "LAC: checking lookahead %s:", yysymbol_name (yytoken)));
+  if (yytoken == YYSYMBOL_YYUNDEF)
     {
       YYDPRINTF ((stderr, " Always Err\n"));
       return 1;
     }
   while (1)
     {
-      int yyrule = yypact[*yyesp];
+      int yyrule = yypact[+*yyesp];
       if (yypact_value_is_default (yyrule)
           || (yyrule += yytoken) < 0 || YYLAST < yyrule
           || yycheck[yyrule] != yytoken)
         {
-          yyrule = yydefact[*yyesp];
+          /* Use the default action.  */
+          yyrule = yydefact[+*yyesp];
           if (yyrule == 0)
             {
               YYDPRINTF ((stderr, " Err\n"));
@@ -1464,6 +1644,7 @@
         }
       else
         {
+          /* Use the action from yytable.  */
           yyrule = yytable[yyrule];
           if (yytable_value_is_error (yyrule))
             {
@@ -1477,9 +1658,12 @@
             }
           yyrule = -yyrule;
         }
+      /* By now we know we have to simulate a reduce.  */
+      YYDPRINTF ((stderr, " R%d", yyrule - 1));
       {
+        /* Pop the corresponding number of values from the stack.  */
         YYPTRDIFF_T yylen = yyr2[yyrule];
-        YYDPRINTF ((stderr, " R%d", yyrule - 1));
+        /* First pop from the LAC stack as many tokens as possible.  */
         if (yyesp != yyes_prev)
           {
             YYPTRDIFF_T yysize = yyesp - *yyes + 1;
@@ -1490,13 +1674,15 @@
               }
             else
               {
-                yylen -= yysize;
                 yyesp = yyes_prev;
+                yylen -= yysize;
               }
           }
+        /* Only afterwards look at the main stack.  */
         if (yylen)
           yyesp = yyes_prev -= yylen;
       }
+      /* Push the resulting state of the reduction.  */
       {
         yy_state_fast_t yystate;
         {
@@ -1522,7 +1708,7 @@
                                       yyes, yyesa, &yyesp, yyes_prev))
               {
                 YYDPRINTF ((stderr, "\n"));
-                return 2;
+                return YYENOMEM;
               }
             YY_IGNORE_USELESS_CAST_BEGIN
             *++yyesp = YY_CAST (yy_state_t, yystate);
@@ -1533,312 +1719,151 @@
     }
 }
 
-
-#if YYERROR_VERBOSE
-
-# ifndef yystrlen
-#  if defined __GLIBC__ && defined _STRING_H
-#   define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S)))
-#  else
-/* Return the length of YYSTR.  */
-static YYPTRDIFF_T
-yystrlen (const char *yystr)
+/* Context of a parse error.  */
+typedef struct
 {
-  YYPTRDIFF_T yylen;
-  for (yylen = 0; yystr[yylen]; yylen++)
-    continue;
-  return yylen;
-}
-#  endif
-# endif
+  yy_state_t *yyssp;
+  yy_state_t *yyesa;
+  yy_state_t **yyes;
+  YYPTRDIFF_T *yyes_capacity;
+  yysymbol_kind_t yytoken;
+  YYLTYPE *yylloc;
+} yypcontext_t;
 
-# ifndef yystpcpy
-#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-#   define yystpcpy stpcpy
-#  else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
-   YYDEST.  */
-static char *
-yystpcpy (char *yydest, const char *yysrc)
-{
-  char *yyd = yydest;
-  const char *yys = yysrc;
-
-  while ((*yyd++ = *yys++) != '\0')
-    continue;
-
-  return yyd - 1;
-}
-#  endif
-# endif
-
-# ifndef yytnamerr
-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
-   quotes and backslashes, so that it's suitable for yyerror.  The
-   heuristic is that double-quoting is unnecessary unless the string
-   contains an apostrophe, a comma, or backslash (other than
-   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
-   null, do not copy; instead, return the length of what the result
-   would have been.  */
-static YYPTRDIFF_T
-yytnamerr (char *yyres, const char *yystr)
-{
-  if (*yystr == '"')
-    {
-      YYPTRDIFF_T yyn = 0;
-      char const *yyp = yystr;
-
-      for (;;)
-        switch (*++yyp)
-          {
-          case '\'':
-          case ',':
-            goto do_not_strip_quotes;
-
-          case '\\':
-            if (*++yyp != '\\')
-              goto do_not_strip_quotes;
-            else
-              goto append;
-
-          append:
-          default:
-            if (yyres)
-              yyres[yyn] = *yyp;
-            yyn++;
-            break;
-
-          case '"':
-            if (yyres)
-              yyres[yyn] = '\0';
-            return yyn;
-          }
-    do_not_strip_quotes: ;
-    }
-
-  if (yyres)
-    return yystpcpy (yyres, yystr) - yyres;
-  else
-    return yystrlen (yystr);
-}
-# endif
-
-/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
-   about the unexpected token YYTOKEN for the state stack whose top is
-   YYSSP.  In order to see if a particular token T is a
-   valid looakhead, invoke yy_lac (YYESA, YYES, YYES_CAPACITY, YYSSP, T).
-
-   Return 0 if *YYMSG was successfully written.  Return 1 if *YYMSG is
-   not large enough to hold the message.  In that case, also set
-   *YYMSG_ALLOC to the required number of bytes.  Return 2 if the
-   required number of bytes is too large to store or if
-   yy_lac returned 2.  */
+/* Put in YYARG at most YYARGN of the expected tokens given the
+   current YYCTX, and return the number of tokens stored in YYARG.  If
+   YYARG is null, return the number of expected tokens (guaranteed to
+   be less than YYNTOKENS).  Return YYENOMEM on memory exhaustion.
+   Return 0 if there are more than YYARGN expected tokens, yet fill
+   YYARG up to YYARGN. */
 static int
-yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg,
-                yy_state_t *yyesa, yy_state_t **yyes,
-                YYPTRDIFF_T *yyes_capacity, yy_state_t *yyssp, int yytoken)
+yypcontext_expected_tokens (const yypcontext_t *yyctx,
+                            yysymbol_kind_t yyarg[], int yyargn)
 {
-  enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
-  /* Internationalized format string. */
-  const char *yyformat = YY_NULLPTR;
-  /* Arguments of yyformat: reported tokens (one for the "unexpected",
-     one per "expected"). */
-  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
   /* Actual size of YYARG. */
   int yycount = 0;
-  /* Cumulated lengths of YYARG.  */
-  YYPTRDIFF_T yysize = 0;
 
-  /* There are many possibilities here to consider:
-     - If this state is a consistent state with a default action, then
-       the only way this function was invoked is if the default action
-       is an error action.  In that case, don't check for expected
-       tokens because there are none.
-     - The only way there can be no lookahead present (in yychar) is if
-       this state is a consistent state with a default action.  Thus,
-       detecting the absence of a lookahead is sufficient to determine
-       that there is no unexpected or expected token to report.  In that
-       case, just report a simple "syntax error".
-     - Don't assume there isn't a lookahead just because this state is a
-       consistent state with a default action.  There might have been a
-       previous inconsistent state, consistent state with a non-default
-       action, or user semantic action that manipulated yychar.
-       In the first two cases, it might appear that the current syntax
-       error should have been detected in the previous state when yy_lac
-       was invoked.  However, at that time, there might have been a
-       different syntax error that discarded a different initial context
-       during error recovery, leaving behind the current lookahead.
-  */
-  if (yytoken != YYEMPTY)
+  int yyx;
+  for (yyx = 0; yyx < YYNTOKENS; ++yyx)
     {
-      int yyn = yypact[*yyssp];
-      YYPTRDIFF_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
-      yysize = yysize0;
-      YYDPRINTF ((stderr, "Constructing syntax error message\n"));
-      yyarg[yycount++] = yytname[yytoken];
-      if (!yypact_value_is_default (yyn))
-        {
-          int yyx;
-
-          for (yyx = 0; yyx < YYNTOKENS; ++yyx)
-            if (yyx != YYTERROR && yyx != YYUNDEFTOK)
-              {
-                {
-                  int yy_lac_status = yy_lac (yyesa, yyes, yyes_capacity,
-                                              yyssp, yyx);
-                  if (yy_lac_status == 2)
-                    return 2;
-                  if (yy_lac_status == 1)
-                    continue;
-                }
-                if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-                  {
-                    yycount = 1;
-                    yysize = yysize0;
-                    break;
-                  }
-                yyarg[yycount++] = yytname[yyx];
-                {
-                  YYPTRDIFF_T yysize1
-                    = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
-                  if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
-                    yysize = yysize1;
-                  else
-                    return 2;
-                }
-              }
-        }
-# if GRAM_DEBUG
-      else if (yydebug)
-        YYFPRINTF (stderr, "No expected tokens.\n");
-# endif
+      yysymbol_kind_t yysym = YY_CAST (yysymbol_kind_t, yyx);
+      if (yysym != YYSYMBOL_YYerror && yysym != YYSYMBOL_YYUNDEF)
+        switch (yy_lac (yyctx->yyesa, yyctx->yyes, yyctx->yyes_capacity, yyctx->yyssp, yysym))
+          {
+          case YYENOMEM:
+            return YYENOMEM;
+          case 1:
+            continue;
+          default:
+            if (!yyarg)
+              ++yycount;
+            else if (yycount == yyargn)
+              return 0;
+            else
+              yyarg[yycount++] = yysym;
+          }
     }
-
-  switch (yycount)
-    {
-# define YYCASE_(N, S)                      \
-      case N:                               \
-        yyformat = S;                       \
-      break
-    default: /* Avoid compiler warnings. */
-      YYCASE_(0, YY_("syntax error"));
-      YYCASE_(1, YY_("syntax error, unexpected %s"));
-      YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
-      YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
-      YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
-      YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
-# undef YYCASE_
-    }
-
-  {
-    /* Don't count the "%s"s in the final size, but reserve room for
-       the terminator.  */
-    YYPTRDIFF_T yysize1 = yysize + (yystrlen (yyformat) - 2 * yycount) + 1;
-    if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
-      yysize = yysize1;
-    else
-      return 2;
-  }
-
-  if (*yymsg_alloc < yysize)
-    {
-      *yymsg_alloc = 2 * yysize;
-      if (! (yysize <= *yymsg_alloc
-             && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
-        *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
-      return 1;
-    }
-
-  /* Avoid sprintf, as that infringes on the user's name space.
-     Don't have undefined behavior even if the translation
-     produced a string with the wrong number of "%s"s.  */
-  {
-    char *yyp = *yymsg;
-    int yyi = 0;
-    while ((*yyp = *yyformat) != '\0')
-      if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
-        {
-          yyp += yytnamerr (yyp, yyarg[yyi++]);
-          yyformat += 2;
-        }
-      else
-        {
-          ++yyp;
-          ++yyformat;
-        }
-  }
-  return 0;
+  if (yyarg && yycount == 0 && 0 < yyargn)
+    yyarg[0] = YYSYMBOL_YYEMPTY;
+  return yycount;
 }
-#endif /* YYERROR_VERBOSE */
+
+
+
+
+/* The kind of the lookahead of this context.  */
+static yysymbol_kind_t
+yypcontext_token (const yypcontext_t *yyctx) YY_ATTRIBUTE_UNUSED;
+
+static yysymbol_kind_t
+yypcontext_token (const yypcontext_t *yyctx)
+{
+  return yyctx->yytoken;
+}
+
+/* The location of the lookahead of this context.  */
+static YYLTYPE *
+yypcontext_location (const yypcontext_t *yyctx) YY_ATTRIBUTE_UNUSED;
+
+static YYLTYPE *
+yypcontext_location (const yypcontext_t *yyctx)
+{
+  return yyctx->yylloc;
+}
+
+/* User defined function to report a syntax error.  */
+static int
+yyreport_syntax_error (const yypcontext_t *yyctx);
 
 /*-----------------------------------------------.
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
 static void
-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)
+yydestruct (const char *yymsg,
+            yysymbol_kind_t yykind, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)
 {
-  YYUSE (yyvaluep);
-  YYUSE (yylocationp);
+  YY_USE (yyvaluep);
+  YY_USE (yylocationp);
   if (!yymsg)
     yymsg = "Deleting";
-  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+  YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
 
   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-  switch (yytype)
+  switch (yykind)
     {
-    case 74: /* generic_symlist  */
-#line 242 "src/parse-gram.y"
+    case YYSYMBOL_generic_symlist: /* generic_symlist  */
+#line 259 "src/parse-gram.y"
             { symbol_list_free (((*yyvaluep).generic_symlist)); }
-#line 1794 "src/parse-gram.c"
+#line 1819 "src/parse-gram.c"
         break;
 
-    case 75: /* generic_symlist_item  */
-#line 242 "src/parse-gram.y"
+    case YYSYMBOL_generic_symlist_item: /* generic_symlist_item  */
+#line 259 "src/parse-gram.y"
             { symbol_list_free (((*yyvaluep).generic_symlist_item)); }
-#line 1800 "src/parse-gram.c"
+#line 1825 "src/parse-gram.c"
         break;
 
-    case 77: /* nterm_decls  */
-#line 242 "src/parse-gram.y"
+    case YYSYMBOL_nterm_decls: /* nterm_decls  */
+#line 259 "src/parse-gram.y"
             { symbol_list_free (((*yyvaluep).nterm_decls)); }
-#line 1806 "src/parse-gram.c"
+#line 1831 "src/parse-gram.c"
         break;
 
-    case 78: /* token_decls  */
-#line 242 "src/parse-gram.y"
+    case YYSYMBOL_token_decls: /* token_decls  */
+#line 259 "src/parse-gram.y"
             { symbol_list_free (((*yyvaluep).token_decls)); }
-#line 1812 "src/parse-gram.c"
+#line 1837 "src/parse-gram.c"
         break;
 
-    case 79: /* token_decl.1  */
-#line 242 "src/parse-gram.y"
-            { symbol_list_free (((*yyvaluep).yytype_79)); }
-#line 1818 "src/parse-gram.c"
+    case YYSYMBOL_82_token_decl_1: /* token_decl.1  */
+#line 259 "src/parse-gram.y"
+            { symbol_list_free (((*yyvaluep).yykind_82)); }
+#line 1843 "src/parse-gram.c"
         break;
 
-    case 82: /* token_decls_for_prec  */
-#line 242 "src/parse-gram.y"
+    case YYSYMBOL_token_decls_for_prec: /* token_decls_for_prec  */
+#line 259 "src/parse-gram.y"
             { symbol_list_free (((*yyvaluep).token_decls_for_prec)); }
-#line 1824 "src/parse-gram.c"
+#line 1849 "src/parse-gram.c"
         break;
 
-    case 83: /* token_decl_for_prec.1  */
-#line 242 "src/parse-gram.y"
-            { symbol_list_free (((*yyvaluep).yytype_83)); }
-#line 1830 "src/parse-gram.c"
+    case YYSYMBOL_87_token_decl_for_prec_1: /* token_decl_for_prec.1  */
+#line 259 "src/parse-gram.y"
+            { symbol_list_free (((*yyvaluep).yykind_87)); }
+#line 1855 "src/parse-gram.c"
         break;
 
-    case 85: /* symbol_decls  */
-#line 242 "src/parse-gram.y"
+    case YYSYMBOL_symbol_decls: /* symbol_decls  */
+#line 259 "src/parse-gram.y"
             { symbol_list_free (((*yyvaluep).symbol_decls)); }
-#line 1836 "src/parse-gram.c"
+#line 1861 "src/parse-gram.c"
         break;
 
-    case 86: /* symbol_decl.1  */
-#line 242 "src/parse-gram.y"
-            { symbol_list_free (((*yyvaluep).yytype_86)); }
-#line 1842 "src/parse-gram.c"
+    case YYSYMBOL_90_symbols_1: /* symbols.1  */
+#line 259 "src/parse-gram.y"
+            { symbol_list_free (((*yyvaluep).yykind_90)); }
+#line 1867 "src/parse-gram.c"
         break;
 
       default:
@@ -1850,6 +1875,8 @@
 
 
 
+
+
 /*----------.
 | yyparse.  |
 `----------*/
@@ -1857,7 +1884,7 @@
 int
 yyparse (void)
 {
-/* The lookahead symbol.  */
+/* Lookahead token kind.  */
 int yychar;
 
 
@@ -1876,60 +1903,53 @@
 YYLTYPE yylloc = yyloc_default;
 
     /* Number of syntax errors so far.  */
-    int yynerrs;
+    int yynerrs = 0;
 
-    yy_state_fast_t yystate;
+    yy_state_fast_t yystate = 0;
     /* Number of tokens to shift before error messages enabled.  */
-    int yyerrstatus;
+    int yyerrstatus = 0;
 
-    /* The stacks and their tools:
-       'yyss': related to states.
-       'yyvs': related to semantic values.
-       'yyls': related to locations.
-
-       Refer to the stacks through separate pointers, to allow yyoverflow
+    /* Refer to the stacks through separate pointers, to allow yyoverflow
        to reallocate them elsewhere.  */
 
-    /* The state stack.  */
+    /* Their size.  */
+    YYPTRDIFF_T yystacksize = YYINITDEPTH;
+
+    /* The state stack: array, bottom, top.  */
     yy_state_t yyssa[YYINITDEPTH];
-    yy_state_t *yyss;
-    yy_state_t *yyssp;
+    yy_state_t *yyss = yyssa;
+    yy_state_t *yyssp = yyss;
 
-    /* The semantic value stack.  */
+    /* The semantic value stack: array, bottom, top.  */
     YYSTYPE yyvsa[YYINITDEPTH];
-    YYSTYPE *yyvs;
-    YYSTYPE *yyvsp;
+    YYSTYPE *yyvs = yyvsa;
+    YYSTYPE *yyvsp = yyvs;
 
-    /* The location stack.  */
+    /* The location stack: array, bottom, top.  */
     YYLTYPE yylsa[YYINITDEPTH];
-    YYLTYPE *yyls;
-    YYLTYPE *yylsp;
-
-    /* The locations where the error started and ended.  */
-    YYLTYPE yyerror_range[3];
-
-    YYPTRDIFF_T yystacksize;
+    YYLTYPE *yyls = yylsa;
+    YYLTYPE *yylsp = yyls;
 
     yy_state_t yyesa[20];
-    yy_state_t *yyes;
-    YYPTRDIFF_T yyes_capacity;
+    yy_state_t *yyes = yyesa;
+    YYPTRDIFF_T yyes_capacity = 20 < YYMAXDEPTH ? 20 : YYMAXDEPTH;
 
+  /* Whether LAC context is established.  A Boolean.  */
   int yy_lac_established = 0;
   int yyn;
+  /* The return value of yyparse.  */
   int yyresult;
-  /* Lookahead token as an internal (translated) token number.  */
-  int yytoken = 0;
+  /* Lookahead symbol kind.  */
+  yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;
   YYLTYPE yyloc;
 
-#if YYERROR_VERBOSE
-  /* Buffer for error messages, and its allocated size.  */
-  char yymsgbuf[128];
-  char *yymsg = yymsgbuf;
-  YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf;
-#endif
+  /* The locations where the error started and ended.  */
+  YYLTYPE yyerror_range[3];
+
+
 
 #define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
 
@@ -1937,25 +1957,13 @@
      Keep to zero when no symbol should be popped.  */
   int yylen = 0;
 
-  yyssp = yyss = yyssa;
-  yyvsp = yyvs = yyvsa;
-  yylsp = yyls = yylsa;
-  yystacksize = YYINITDEPTH;
-
-  yyes = yyesa;
-  yyes_capacity = 20;
-  if (YYMAXDEPTH < yyes_capacity)
-    yyes_capacity = YYMAXDEPTH;
-
   YYDPRINTF ((stderr, "Starting parse\n"));
 
-  yystate = 0;
-  yyerrstatus = 0;
-  yynerrs = 0;
-  yychar = YYEMPTY; /* Cause a token to be read.  */
+  yychar = GRAM_EMPTY; /* Cause a token to be read.  */
+
 
 /* User initialization code.  */
-#line 136 "src/parse-gram.y"
+#line 160 "src/parse-gram.y"
 {
   /* Bison's grammar can initial empty locations, hence a default
      location is needed. */
@@ -1963,7 +1971,7 @@
   boundary_set (&yylloc.end, grammar_file, 1, 1, 1);
 }
 
-#line 1967 "src/parse-gram.c"
+#line 1975 "src/parse-gram.c"
 
   yylsp[0] = yylloc;
   goto yysetstate;
@@ -1987,10 +1995,11 @@
   YY_IGNORE_USELESS_CAST_BEGIN
   *yyssp = YY_CAST (yy_state_t, yystate);
   YY_IGNORE_USELESS_CAST_END
+  YY_STACK_PRINT (yyss, yyssp);
 
   if (yyss + yystacksize - 1 <= yyssp)
 #if !defined yyoverflow && !defined YYSTACK_RELOCATE
-    goto yyexhaustedlab;
+    YYNOMEM;
 #else
     {
       /* Get the current used size of the three stacks, in elements.  */
@@ -2021,7 +2030,7 @@
 # else /* defined YYSTACK_RELOCATE */
       /* Extend the stack our own way.  */
       if (YYMAXDEPTH <= yystacksize)
-        goto yyexhaustedlab;
+        YYNOMEM;
       yystacksize *= 2;
       if (YYMAXDEPTH < yystacksize)
         yystacksize = YYMAXDEPTH;
@@ -2032,11 +2041,11 @@
           YY_CAST (union yyalloc *,
                    YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
         if (! yyptr)
-          goto yyexhaustedlab;
+          YYNOMEM;
         YYSTACK_RELOCATE (yyss_alloc, yyss);
         YYSTACK_RELOCATE (yyvs_alloc, yyvs);
         YYSTACK_RELOCATE (yyls_alloc, yyls);
-# undef YYSTACK_RELOCATE
+#  undef YYSTACK_RELOCATE
         if (yyss1 != yyssa)
           YYSTACK_FREE (yyss1);
       }
@@ -2056,6 +2065,7 @@
     }
 #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
 
+
   if (yystate == YYFINAL)
     YYACCEPT;
 
@@ -2076,18 +2086,30 @@
 
   /* Not known => get a lookahead token if don't already have one.  */
 
-  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
-  if (yychar == YYEMPTY)
+  /* YYCHAR is either empty, or end-of-input, or a valid lookahead.  */
+  if (yychar == GRAM_EMPTY)
     {
-      YYDPRINTF ((stderr, "Reading a token: "));
+      YYDPRINTF ((stderr, "Reading a token\n"));
       yychar = yylex (&yylval, &yylloc);
     }
 
-  if (yychar <= YYEOF)
+  if (yychar <= GRAM_EOF)
     {
-      yychar = yytoken = YYEOF;
+      yychar = GRAM_EOF;
+      yytoken = YYSYMBOL_YYEOF;
       YYDPRINTF ((stderr, "Now at end of input.\n"));
     }
+  else if (yychar == GRAM_error)
+    {
+      /* The scanner already issued an error message, process directly
+         to error recovery.  But do not keep the error token as
+         lookahead, it is too special and may lead us to an endless
+         loop in error recovery. */
+      yychar = GRAM_UNDEF;
+      yytoken = YYSYMBOL_YYerror;
+      yyerror_range[1] = yylloc;
+      goto yyerrlab1;
+    }
   else
     {
       yytoken = YYTRANSLATE (yychar);
@@ -2107,8 +2129,8 @@
     {
       if (yytable_value_is_error (yyn))
         goto yyerrlab;
-      YY_LAC_ESTABLISH;
       yyn = -yyn;
+      YY_LAC_ESTABLISH;
       goto yyreduce;
     }
 
@@ -2126,7 +2148,7 @@
   *++yylsp = yylloc;
 
   /* Discard the shifted token.  */
-  yychar = YYEMPTY;
+  yychar = GRAM_EMPTY;
   YY_LAC_DISCARD ("shift");
   goto yynewstate;
 
@@ -2166,196 +2188,187 @@
     int yychar_backup = yychar;
     switch (yyn)
       {
-  case 6:
-#line 309 "src/parse-gram.y"
+  case 6: /* prologue_declaration: "%{...%}"  */
+#line 326 "src/parse-gram.y"
     {
       muscle_code_grow (union_seen ? "post_prologue" : "pre_prologue",
                         translate_code ((yyvsp[0].PROLOGUE), (yylsp[0]), true), (yylsp[0]));
       code_scanner_last_string_free ();
     }
-#line 2177 "src/parse-gram.c"
+#line 2199 "src/parse-gram.c"
     break;
 
-  case 7:
-#line 315 "src/parse-gram.y"
+  case 7: /* prologue_declaration: "%<flag>"  */
+#line 332 "src/parse-gram.y"
     {
       muscle_percent_define_ensure ((yyvsp[0].PERCENT_FLAG), (yylsp[0]), true);
     }
-#line 2185 "src/parse-gram.c"
+#line 2207 "src/parse-gram.c"
     break;
 
-  case 8:
-#line 319 "src/parse-gram.y"
+  case 8: /* prologue_declaration: "%define" variable value  */
+#line 336 "src/parse-gram.y"
     {
       muscle_percent_define_insert ((yyvsp[-1].variable), (yyloc), (yyvsp[0].value).kind, (yyvsp[0].value).chars,
                                     MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
     }
-#line 2194 "src/parse-gram.c"
+#line 2216 "src/parse-gram.c"
     break;
 
-  case 9:
-#line 323 "src/parse-gram.y"
-                                   { defines_flag = true; }
-#line 2200 "src/parse-gram.c"
+  case 9: /* prologue_declaration: "%header" string.opt  */
+#line 340 "src/parse-gram.y"
+                                   { handle_header ((yyvsp[0].yykind_75)); }
+#line 2222 "src/parse-gram.c"
     break;
 
-  case 10:
-#line 325 "src/parse-gram.y"
-    {
-      defines_flag = true;
-      spec_header_file = xstrdup ((yyvsp[0].STRING));
-    }
-#line 2209 "src/parse-gram.c"
-    break;
-
-  case 11:
-#line 329 "src/parse-gram.y"
+  case 10: /* prologue_declaration: "%error-verbose"  */
+#line 341 "src/parse-gram.y"
                                    { handle_error_verbose (&(yyloc), (yyvsp[0].PERCENT_ERROR_VERBOSE)); }
-#line 2215 "src/parse-gram.c"
+#line 2228 "src/parse-gram.c"
     break;
 
-  case 12:
-#line 330 "src/parse-gram.y"
-                                   { expected_sr_conflicts = (yyvsp[0].INT); }
-#line 2221 "src/parse-gram.c"
+  case 11: /* prologue_declaration: "%expect" "integer literal"  */
+#line 342 "src/parse-gram.y"
+                                   { expected_sr_conflicts = (yyvsp[0].INT_LITERAL); }
+#line 2234 "src/parse-gram.c"
     break;
 
-  case 13:
-#line 331 "src/parse-gram.y"
-                                   { expected_rr_conflicts = (yyvsp[0].INT); }
-#line 2227 "src/parse-gram.c"
+  case 12: /* prologue_declaration: "%expect-rr" "integer literal"  */
+#line 343 "src/parse-gram.y"
+                                   { expected_rr_conflicts = (yyvsp[0].INT_LITERAL); }
+#line 2240 "src/parse-gram.c"
     break;
 
-  case 14:
-#line 332 "src/parse-gram.y"
+  case 13: /* prologue_declaration: "%file-prefix" "string"  */
+#line 344 "src/parse-gram.y"
                                    { handle_file_prefix (&(yyloc), &(yylsp[-1]), (yyvsp[-1].PERCENT_FILE_PREFIX), (yyvsp[0].STRING)); }
-#line 2233 "src/parse-gram.c"
+#line 2246 "src/parse-gram.c"
     break;
 
-  case 15:
-#line 334 "src/parse-gram.y"
+  case 14: /* prologue_declaration: "%glr-parser"  */
+#line 346 "src/parse-gram.y"
     {
       nondeterministic_parser = true;
       glr_parser = true;
     }
-#line 2242 "src/parse-gram.c"
+#line 2255 "src/parse-gram.c"
     break;
 
-  case 16:
-#line 339 "src/parse-gram.y"
+  case 15: /* prologue_declaration: "%initial-action" "{...}"  */
+#line 351 "src/parse-gram.y"
     {
       muscle_code_grow ("initial_action", translate_code ((yyvsp[0].BRACED_CODE), (yylsp[0]), false), (yylsp[0]));
       code_scanner_last_string_free ();
     }
-#line 2251 "src/parse-gram.c"
+#line 2264 "src/parse-gram.c"
     break;
 
-  case 17:
-#line 343 "src/parse-gram.y"
-                                { language_argmatch ((yyvsp[0].STRING), grammar_prio, (yylsp[-1])); }
-#line 2257 "src/parse-gram.c"
-    break;
-
-  case 18:
-#line 344 "src/parse-gram.y"
-                                { handle_name_prefix (&(yyloc), (yyvsp[-1].PERCENT_NAME_PREFIX), (yyvsp[0].STRING)); }
-#line 2263 "src/parse-gram.c"
-    break;
-
-  case 19:
-#line 345 "src/parse-gram.y"
-                                { no_lines_flag = true; }
-#line 2269 "src/parse-gram.c"
-    break;
-
-  case 20:
-#line 346 "src/parse-gram.y"
-                                { nondeterministic_parser = true; }
-#line 2275 "src/parse-gram.c"
-    break;
-
-  case 21:
-#line 347 "src/parse-gram.y"
-                                { spec_outfile = (yyvsp[0].STRING); }
-#line 2281 "src/parse-gram.c"
-    break;
-
-  case 22:
-#line 348 "src/parse-gram.y"
-           { current_param = (yyvsp[0].PERCENT_PARAM); }
-#line 2287 "src/parse-gram.c"
-    break;
-
-  case 23:
-#line 348 "src/parse-gram.y"
-                                          { current_param = param_none; }
-#line 2293 "src/parse-gram.c"
-    break;
-
-  case 24:
-#line 349 "src/parse-gram.y"
-                                { handle_pure_parser (&(yyloc), (yyvsp[0].PERCENT_PURE_PARSER)); }
-#line 2299 "src/parse-gram.c"
-    break;
-
-  case 25:
-#line 350 "src/parse-gram.y"
-                                { handle_require (&(yylsp[0]), (yyvsp[0].STRING)); }
-#line 2305 "src/parse-gram.c"
-    break;
-
-  case 26:
-#line 351 "src/parse-gram.y"
-                                { handle_skeleton (&(yylsp[0]), (yyvsp[0].STRING)); }
-#line 2311 "src/parse-gram.c"
-    break;
-
-  case 27:
-#line 352 "src/parse-gram.y"
-                                { token_table_flag = true; }
-#line 2317 "src/parse-gram.c"
-    break;
-
-  case 28:
-#line 353 "src/parse-gram.y"
-                                { report_flag |= report_states; }
-#line 2323 "src/parse-gram.c"
-    break;
-
-  case 29:
-#line 354 "src/parse-gram.y"
-                                { handle_yacc (&(yyloc)); }
-#line 2329 "src/parse-gram.c"
-    break;
-
-  case 30:
+  case 16: /* prologue_declaration: "%language" "string"  */
 #line 355 "src/parse-gram.y"
-                                { current_class = unknown_sym; yyerrok; }
-#line 2335 "src/parse-gram.c"
+                                { handle_language (&(yylsp[-1]), (yyvsp[0].STRING)); }
+#line 2270 "src/parse-gram.c"
     break;
 
-  case 32:
+  case 17: /* prologue_declaration: "%name-prefix" "string"  */
+#line 356 "src/parse-gram.y"
+                                { handle_name_prefix (&(yyloc), (yyvsp[-1].PERCENT_NAME_PREFIX), (yyvsp[0].STRING)); }
+#line 2276 "src/parse-gram.c"
+    break;
+
+  case 18: /* prologue_declaration: "%no-lines"  */
+#line 357 "src/parse-gram.y"
+                                { no_lines_flag = true; }
+#line 2282 "src/parse-gram.c"
+    break;
+
+  case 19: /* prologue_declaration: "%nondeterministic-parser"  */
+#line 358 "src/parse-gram.y"
+                                { nondeterministic_parser = true; }
+#line 2288 "src/parse-gram.c"
+    break;
+
+  case 20: /* prologue_declaration: "%output" "string"  */
+#line 359 "src/parse-gram.y"
+                                { spec_outfile = unquote ((yyvsp[0].STRING)); gram_scanner_last_string_free (); }
+#line 2294 "src/parse-gram.c"
+    break;
+
+  case 21: /* $@1: %empty  */
 #line 360 "src/parse-gram.y"
-                   { add_param (current_param, (yyvsp[0].BRACED_CODE), (yylsp[0])); }
-#line 2341 "src/parse-gram.c"
+           { current_param = (yyvsp[0].PERCENT_PARAM); }
+#line 2300 "src/parse-gram.c"
     break;
 
-  case 33:
+  case 22: /* prologue_declaration: "%param" $@1 params  */
+#line 360 "src/parse-gram.y"
+                                          { current_param = param_none; }
+#line 2306 "src/parse-gram.c"
+    break;
+
+  case 23: /* prologue_declaration: "%pure-parser"  */
 #line 361 "src/parse-gram.y"
-                   { add_param (current_param, (yyvsp[0].BRACED_CODE), (yylsp[0])); }
-#line 2347 "src/parse-gram.c"
+                                { handle_pure_parser (&(yyloc), (yyvsp[0].PERCENT_PURE_PARSER)); }
+#line 2312 "src/parse-gram.c"
     break;
 
-  case 35:
+  case 24: /* prologue_declaration: "%require" "string"  */
+#line 362 "src/parse-gram.y"
+                                { handle_require (&(yylsp[0]), (yyvsp[0].STRING)); }
+#line 2318 "src/parse-gram.c"
+    break;
+
+  case 25: /* prologue_declaration: "%skeleton" "string"  */
+#line 363 "src/parse-gram.y"
+                                { handle_skeleton (&(yylsp[0]), (yyvsp[0].STRING)); }
+#line 2324 "src/parse-gram.c"
+    break;
+
+  case 26: /* prologue_declaration: "%token-table"  */
+#line 364 "src/parse-gram.y"
+                                { token_table_flag = true; }
+#line 2330 "src/parse-gram.c"
+    break;
+
+  case 27: /* prologue_declaration: "%verbose"  */
+#line 365 "src/parse-gram.y"
+                                { report_flag |= report_states; }
+#line 2336 "src/parse-gram.c"
+    break;
+
+  case 28: /* prologue_declaration: "%yacc"  */
+#line 366 "src/parse-gram.y"
+                                { handle_yacc (&(yyloc)); }
+#line 2342 "src/parse-gram.c"
+    break;
+
+  case 29: /* prologue_declaration: error ";"  */
+#line 367 "src/parse-gram.y"
+                                { current_class = unknown_sym; yyerrok; }
+#line 2348 "src/parse-gram.c"
+    break;
+
+  case 31: /* params: params "{...}"  */
 #line 372 "src/parse-gram.y"
-    {
-      grammar_start_symbol_set ((yyvsp[0].symbol), (yylsp[0]));
-    }
-#line 2355 "src/parse-gram.c"
+                   { add_param (current_param, (yyvsp[0].BRACED_CODE), (yylsp[0])); }
+#line 2354 "src/parse-gram.c"
     break;
 
-  case 36:
-#line 376 "src/parse-gram.y"
+  case 32: /* params: "{...}"  */
+#line 373 "src/parse-gram.y"
+                   { add_param (current_param, (yyvsp[0].BRACED_CODE), (yylsp[0])); }
+#line 2360 "src/parse-gram.c"
+    break;
+
+  case 34: /* grammar_declaration: "%start" symbols.1  */
+#line 384 "src/parse-gram.y"
+    {
+      grammar_start_symbols_add ((yyvsp[0].yykind_90));
+    }
+#line 2368 "src/parse-gram.c"
+    break;
+
+  case 35: /* grammar_declaration: code_props_type "{...}" generic_symlist  */
+#line 388 "src/parse-gram.y"
     {
       code_props code;
       code_props_symbol_action_init (&code, (yyvsp[-1].BRACED_CODE), (yylsp[-1]));
@@ -2366,27 +2379,27 @@
         symbol_list_free ((yyvsp[0].generic_symlist));
       }
     }
-#line 2370 "src/parse-gram.c"
+#line 2383 "src/parse-gram.c"
     break;
 
-  case 37:
-#line 387 "src/parse-gram.y"
+  case 36: /* grammar_declaration: "%default-prec"  */
+#line 399 "src/parse-gram.y"
     {
       default_prec = true;
     }
-#line 2378 "src/parse-gram.c"
+#line 2391 "src/parse-gram.c"
     break;
 
-  case 38:
-#line 391 "src/parse-gram.y"
+  case 37: /* grammar_declaration: "%no-default-prec"  */
+#line 403 "src/parse-gram.y"
     {
       default_prec = false;
     }
-#line 2386 "src/parse-gram.c"
+#line 2399 "src/parse-gram.c"
     break;
 
-  case 39:
-#line 395 "src/parse-gram.y"
+  case 38: /* grammar_declaration: "%code" "{...}"  */
+#line 407 "src/parse-gram.y"
     {
       /* Do not invoke muscle_percent_code_grow here since it invokes
          muscle_user_name_list_grow.  */
@@ -2394,453 +2407,496 @@
                         translate_code_braceless ((yyvsp[0].BRACED_CODE), (yylsp[0])), (yylsp[0]));
       code_scanner_last_string_free ();
     }
-#line 2398 "src/parse-gram.c"
+#line 2411 "src/parse-gram.c"
     break;
 
-  case 40:
-#line 403 "src/parse-gram.y"
+  case 39: /* grammar_declaration: "%code" "identifier" "{...}"  */
+#line 415 "src/parse-gram.y"
     {
       muscle_percent_code_grow ((yyvsp[-1].ID), (yylsp[-1]), translate_code_braceless ((yyvsp[0].BRACED_CODE), (yylsp[0])), (yylsp[0]));
       code_scanner_last_string_free ();
     }
-#line 2407 "src/parse-gram.c"
+#line 2420 "src/parse-gram.c"
     break;
 
-  case 41:
-#line 412 "src/parse-gram.y"
-                 { (yyval.code_props_type) = destructor; }
-#line 2413 "src/parse-gram.c"
-    break;
-
-  case 42:
-#line 413 "src/parse-gram.y"
-                 { (yyval.code_props_type) = printer; }
-#line 2419 "src/parse-gram.c"
-    break;
-
-  case 43:
-#line 423 "src/parse-gram.y"
-         {}
-#line 2425 "src/parse-gram.c"
-    break;
-
-  case 44:
+  case 40: /* code_props_type: "%destructor"  */
 #line 424 "src/parse-gram.y"
+                 { (yyval.code_props_type) = destructor; }
+#line 2426 "src/parse-gram.c"
+    break;
+
+  case 41: /* code_props_type: "%printer"  */
+#line 425 "src/parse-gram.y"
+                 { (yyval.code_props_type) = printer; }
+#line 2432 "src/parse-gram.c"
+    break;
+
+  case 42: /* union_name: %empty  */
+#line 435 "src/parse-gram.y"
+         {}
+#line 2438 "src/parse-gram.c"
+    break;
+
+  case 43: /* union_name: "identifier"  */
+#line 436 "src/parse-gram.y"
          { muscle_percent_define_insert ("api.value.union.name",
                                          (yylsp[0]), muscle_keyword, (yyvsp[0].ID),
                                          MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE); }
-#line 2433 "src/parse-gram.c"
+#line 2446 "src/parse-gram.c"
     break;
 
-  case 45:
-#line 431 "src/parse-gram.y"
+  case 44: /* grammar_declaration: "%union" union_name "{...}"  */
+#line 443 "src/parse-gram.y"
     {
       union_seen = true;
       muscle_code_grow ("union_members", translate_code_braceless ((yyvsp[0].BRACED_CODE), (yylsp[0])), (yylsp[0]));
       code_scanner_last_string_free ();
     }
-#line 2443 "src/parse-gram.c"
+#line 2456 "src/parse-gram.c"
     break;
 
-  case 46:
-#line 443 "src/parse-gram.y"
+  case 45: /* $@2: %empty  */
+#line 455 "src/parse-gram.y"
            { current_class = nterm_sym; }
-#line 2449 "src/parse-gram.c"
+#line 2462 "src/parse-gram.c"
     break;
 
-  case 47:
-#line 444 "src/parse-gram.y"
+  case 46: /* symbol_declaration: "%nterm" $@2 nterm_decls  */
+#line 456 "src/parse-gram.y"
     {
       current_class = unknown_sym;
       symbol_list_free ((yyvsp[0].nterm_decls));
     }
-#line 2458 "src/parse-gram.c"
+#line 2471 "src/parse-gram.c"
     break;
 
-  case 48:
-#line 448 "src/parse-gram.y"
+  case 47: /* $@3: %empty  */
+#line 460 "src/parse-gram.y"
            { current_class = token_sym; }
-#line 2464 "src/parse-gram.c"
+#line 2477 "src/parse-gram.c"
     break;
 
-  case 49:
-#line 449 "src/parse-gram.y"
+  case 48: /* symbol_declaration: "%token" $@3 token_decls  */
+#line 461 "src/parse-gram.y"
     {
       current_class = unknown_sym;
       symbol_list_free ((yyvsp[0].token_decls));
     }
-#line 2473 "src/parse-gram.c"
+#line 2486 "src/parse-gram.c"
     break;
 
-  case 50:
-#line 454 "src/parse-gram.y"
+  case 49: /* $@4: %empty  */
+#line 465 "src/parse-gram.y"
+          { current_class = pct_type_sym; }
+#line 2492 "src/parse-gram.c"
+    break;
+
+  case 50: /* symbol_declaration: "%type" $@4 symbol_decls  */
+#line 466 "src/parse-gram.y"
     {
+      current_class = unknown_sym;
       symbol_list_free ((yyvsp[0].symbol_decls));
     }
-#line 2481 "src/parse-gram.c"
+#line 2501 "src/parse-gram.c"
     break;
 
-  case 51:
-#line 458 "src/parse-gram.y"
+  case 51: /* symbol_declaration: precedence_declarator token_decls_for_prec  */
+#line 471 "src/parse-gram.y"
     {
       ++current_prec;
       for (symbol_list *list = (yyvsp[0].token_decls_for_prec); list; list = list->next)
         symbol_precedence_set (list->content.sym, current_prec, (yyvsp[-1].precedence_declarator), (yylsp[-1]));
       symbol_list_free ((yyvsp[0].token_decls_for_prec));
     }
-#line 2492 "src/parse-gram.c"
+#line 2512 "src/parse-gram.c"
     break;
 
-  case 52:
-#line 467 "src/parse-gram.y"
+  case 52: /* precedence_declarator: "%left"  */
+#line 480 "src/parse-gram.y"
                 { (yyval.precedence_declarator) = left_assoc; }
-#line 2498 "src/parse-gram.c"
+#line 2518 "src/parse-gram.c"
     break;
 
-  case 53:
-#line 468 "src/parse-gram.y"
-                { (yyval.precedence_declarator) = right_assoc; }
-#line 2504 "src/parse-gram.c"
-    break;
-
-  case 54:
-#line 469 "src/parse-gram.y"
-                { (yyval.precedence_declarator) = non_assoc; }
-#line 2510 "src/parse-gram.c"
-    break;
-
-  case 55:
-#line 470 "src/parse-gram.y"
-                { (yyval.precedence_declarator) = precedence_assoc; }
-#line 2516 "src/parse-gram.c"
-    break;
-
-  case 56:
-#line 474 "src/parse-gram.y"
-         { (yyval.yytype_73) = NULL; }
-#line 2522 "src/parse-gram.c"
-    break;
-
-  case 57:
-#line 475 "src/parse-gram.y"
-         { (yyval.yytype_73) = (yyvsp[0].TAG); }
-#line 2528 "src/parse-gram.c"
-    break;
-
-  case 59:
+  case 53: /* precedence_declarator: "%right"  */
 #line 481 "src/parse-gram.y"
+                { (yyval.precedence_declarator) = right_assoc; }
+#line 2524 "src/parse-gram.c"
+    break;
+
+  case 54: /* precedence_declarator: "%nonassoc"  */
+#line 482 "src/parse-gram.y"
+                { (yyval.precedence_declarator) = non_assoc; }
+#line 2530 "src/parse-gram.c"
+    break;
+
+  case 55: /* precedence_declarator: "%precedence"  */
+#line 483 "src/parse-gram.y"
+                { (yyval.precedence_declarator) = precedence_assoc; }
+#line 2536 "src/parse-gram.c"
+    break;
+
+  case 56: /* string.opt: %empty  */
+#line 488 "src/parse-gram.y"
+          { (yyval.yykind_75) = NULL; }
+#line 2542 "src/parse-gram.c"
+    break;
+
+  case 57: /* string.opt: "string"  */
+#line 489 "src/parse-gram.y"
+          { (yyval.yykind_75) = (yyvsp[0].STRING); }
+#line 2548 "src/parse-gram.c"
+    break;
+
+  case 58: /* tag.opt: %empty  */
+#line 493 "src/parse-gram.y"
+         { (yyval.yykind_76) = NULL; }
+#line 2554 "src/parse-gram.c"
+    break;
+
+  case 59: /* tag.opt: "<tag>"  */
+#line 494 "src/parse-gram.y"
+         { (yyval.yykind_76) = (yyvsp[0].TAG); }
+#line 2560 "src/parse-gram.c"
+    break;
+
+  case 61: /* generic_symlist: generic_symlist generic_symlist_item  */
+#line 500 "src/parse-gram.y"
                                          { (yyval.generic_symlist) = symbol_list_append ((yyvsp[-1].generic_symlist), (yyvsp[0].generic_symlist_item)); }
-#line 2534 "src/parse-gram.c"
-    break;
-
-  case 60:
-#line 485 "src/parse-gram.y"
-            { (yyval.generic_symlist_item) = symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0])); }
-#line 2540 "src/parse-gram.c"
-    break;
-
-  case 61:
-#line 486 "src/parse-gram.y"
-            { (yyval.generic_symlist_item) = symbol_list_type_new ((yyvsp[0].tag), (yylsp[0])); }
-#line 2546 "src/parse-gram.c"
-    break;
-
-  case 63:
-#line 491 "src/parse-gram.y"
-        { (yyval.tag) = uniqstr_new ("*"); }
-#line 2552 "src/parse-gram.c"
-    break;
-
-  case 64:
-#line 492 "src/parse-gram.y"
-        { (yyval.tag) = uniqstr_new (""); }
-#line 2558 "src/parse-gram.c"
-    break;
-
-  case 66:
-#line 515 "src/parse-gram.y"
-    {
-      (yyval.token_decls) = (yyvsp[0].yytype_79);
-    }
 #line 2566 "src/parse-gram.c"
     break;
 
-  case 67:
-#line 519 "src/parse-gram.y"
+  case 62: /* generic_symlist_item: symbol  */
+#line 504 "src/parse-gram.y"
+            { (yyval.generic_symlist_item) = symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0])); }
+#line 2572 "src/parse-gram.c"
+    break;
+
+  case 63: /* generic_symlist_item: tag  */
+#line 505 "src/parse-gram.y"
+            { (yyval.generic_symlist_item) = symbol_list_type_new ((yyvsp[0].tag), (yylsp[0])); }
+#line 2578 "src/parse-gram.c"
+    break;
+
+  case 65: /* tag: "<*>"  */
+#line 510 "src/parse-gram.y"
+        { (yyval.tag) = uniqstr_new ("*"); }
+#line 2584 "src/parse-gram.c"
+    break;
+
+  case 66: /* tag: "<>"  */
+#line 511 "src/parse-gram.y"
+        { (yyval.tag) = uniqstr_new (""); }
+#line 2590 "src/parse-gram.c"
+    break;
+
+  case 68: /* token_decls: token_decl.1  */
+#line 534 "src/parse-gram.y"
     {
-      (yyval.token_decls) = symbol_list_type_set ((yyvsp[0].yytype_79), (yyvsp[-1].TAG), (yylsp[-1]));
+      (yyval.token_decls) = (yyvsp[0].yykind_82);
     }
-#line 2574 "src/parse-gram.c"
+#line 2598 "src/parse-gram.c"
     break;
 
-  case 68:
-#line 523 "src/parse-gram.y"
+  case 69: /* token_decls: "<tag>" token_decl.1  */
+#line 538 "src/parse-gram.y"
     {
-      (yyval.token_decls) = symbol_list_append ((yyvsp[-2].token_decls), symbol_list_type_set ((yyvsp[0].yytype_79), (yyvsp[-1].TAG), (yylsp[-1])));
+      (yyval.token_decls) = symbol_list_type_set ((yyvsp[0].yykind_82), (yyvsp[-1].TAG));
     }
-#line 2582 "src/parse-gram.c"
+#line 2606 "src/parse-gram.c"
     break;
 
-  case 69:
-#line 530 "src/parse-gram.y"
-                            { (yyval.yytype_79) = symbol_list_sym_new ((yyvsp[0].token_decl), (yylsp[0])); }
-#line 2588 "src/parse-gram.c"
+  case 70: /* token_decls: token_decls "<tag>" token_decl.1  */
+#line 542 "src/parse-gram.y"
+    {
+      (yyval.token_decls) = symbol_list_append ((yyvsp[-2].token_decls), symbol_list_type_set ((yyvsp[0].yykind_82), (yyvsp[-1].TAG)));
+    }
+#line 2614 "src/parse-gram.c"
     break;
 
-  case 70:
-#line 531 "src/parse-gram.y"
-                            { (yyval.yytype_79) = symbol_list_append ((yyvsp[-1].yytype_79), symbol_list_sym_new ((yyvsp[0].token_decl), (yylsp[0]))); }
-#line 2594 "src/parse-gram.c"
+  case 71: /* token_decl.1: token_decl  */
+#line 549 "src/parse-gram.y"
+                            { (yyval.yykind_82) = symbol_list_sym_new ((yyvsp[0].token_decl), (yylsp[0])); }
+#line 2620 "src/parse-gram.c"
     break;
 
-  case 71:
-#line 536 "src/parse-gram.y"
+  case 72: /* token_decl.1: token_decl.1 token_decl  */
+#line 550 "src/parse-gram.y"
+                            { (yyval.yykind_82) = symbol_list_append ((yyvsp[-1].yykind_82), symbol_list_sym_new ((yyvsp[0].token_decl), (yylsp[0]))); }
+#line 2626 "src/parse-gram.c"
+    break;
+
+  case 73: /* token_decl: id int.opt alias  */
+#line 555 "src/parse-gram.y"
     {
       (yyval.token_decl) = (yyvsp[-2].id);
       symbol_class_set ((yyvsp[-2].id), current_class, (yylsp[-2]), true);
-      if (0 <= (yyvsp[-1].yytype_81))
-        symbol_user_token_number_set ((yyvsp[-2].id), (yyvsp[-1].yytype_81), (yylsp[-1]));
-      if ((yyvsp[0].yytype_100))
-        symbol_make_alias ((yyvsp[-2].id), (yyvsp[0].yytype_100), (yylsp[0]));
+      if (0 <= (yyvsp[-1].yykind_84))
+        symbol_code_set ((yyvsp[-2].id), (yyvsp[-1].yykind_84), (yylsp[-1]));
+      if ((yyvsp[0].alias))
+        symbol_make_alias ((yyvsp[-2].id), (yyvsp[0].alias), (yylsp[0]));
     }
-#line 2607 "src/parse-gram.c"
+#line 2639 "src/parse-gram.c"
     break;
 
-  case 72:
-#line 548 "src/parse-gram.y"
-          { (yyval.yytype_81) = -1; }
-#line 2613 "src/parse-gram.c"
+  case 74: /* int.opt: %empty  */
+#line 567 "src/parse-gram.y"
+          { (yyval.yykind_84) = -1; }
+#line 2645 "src/parse-gram.c"
     break;
 
-  case 74:
-#line 562 "src/parse-gram.y"
+  case 76: /* alias: %empty  */
+#line 573 "src/parse-gram.y"
+                 { (yyval.alias) = NULL; }
+#line 2651 "src/parse-gram.c"
+    break;
+
+  case 77: /* alias: string_as_id  */
+#line 574 "src/parse-gram.y"
+                 { (yyval.alias) = (yyvsp[0].string_as_id); }
+#line 2657 "src/parse-gram.c"
+    break;
+
+  case 78: /* alias: "translatable string"  */
+#line 576 "src/parse-gram.y"
     {
-      (yyval.token_decls_for_prec) = (yyvsp[0].yytype_83);
+      (yyval.alias) = symbol_get ((yyvsp[0].TSTRING), (yylsp[0]));
+      symbol_class_set ((yyval.alias), token_sym, (yylsp[0]), false);
+      (yyval.alias)->translatable = true;
     }
-#line 2621 "src/parse-gram.c"
+#line 2667 "src/parse-gram.c"
     break;
 
-  case 75:
-#line 566 "src/parse-gram.y"
+  case 79: /* token_decls_for_prec: token_decl_for_prec.1  */
+#line 594 "src/parse-gram.y"
     {
-      (yyval.token_decls_for_prec) = symbol_list_type_set ((yyvsp[0].yytype_83), (yyvsp[-1].TAG), (yylsp[-1]));
+      (yyval.token_decls_for_prec) = (yyvsp[0].yykind_87);
     }
-#line 2629 "src/parse-gram.c"
+#line 2675 "src/parse-gram.c"
     break;
 
-  case 76:
-#line 570 "src/parse-gram.y"
+  case 80: /* token_decls_for_prec: "<tag>" token_decl_for_prec.1  */
+#line 598 "src/parse-gram.y"
     {
-      (yyval.token_decls_for_prec) = symbol_list_append ((yyvsp[-2].token_decls_for_prec), symbol_list_type_set ((yyvsp[0].yytype_83), (yyvsp[-1].TAG), (yylsp[-1])));
+      (yyval.token_decls_for_prec) = symbol_list_type_set ((yyvsp[0].yykind_87), (yyvsp[-1].TAG));
     }
-#line 2637 "src/parse-gram.c"
+#line 2683 "src/parse-gram.c"
     break;
 
-  case 77:
-#line 578 "src/parse-gram.y"
-    { (yyval.yytype_83) = symbol_list_sym_new ((yyvsp[0].token_decl_for_prec), (yylsp[0])); }
-#line 2643 "src/parse-gram.c"
+  case 81: /* token_decls_for_prec: token_decls_for_prec "<tag>" token_decl_for_prec.1  */
+#line 602 "src/parse-gram.y"
+    {
+      (yyval.token_decls_for_prec) = symbol_list_append ((yyvsp[-2].token_decls_for_prec), symbol_list_type_set ((yyvsp[0].yykind_87), (yyvsp[-1].TAG)));
+    }
+#line 2691 "src/parse-gram.c"
     break;
 
-  case 78:
-#line 580 "src/parse-gram.y"
-    { (yyval.yytype_83) = symbol_list_append ((yyvsp[-1].yytype_83), symbol_list_sym_new ((yyvsp[0].token_decl_for_prec), (yylsp[0]))); }
-#line 2649 "src/parse-gram.c"
+  case 82: /* token_decl_for_prec.1: token_decl_for_prec  */
+#line 610 "src/parse-gram.y"
+    { (yyval.yykind_87) = symbol_list_sym_new ((yyvsp[0].token_decl_for_prec), (yylsp[0])); }
+#line 2697 "src/parse-gram.c"
     break;
 
-  case 79:
-#line 585 "src/parse-gram.y"
+  case 83: /* token_decl_for_prec.1: token_decl_for_prec.1 token_decl_for_prec  */
+#line 612 "src/parse-gram.y"
+    { (yyval.yykind_87) = symbol_list_append ((yyvsp[-1].yykind_87), symbol_list_sym_new ((yyvsp[0].token_decl_for_prec), (yylsp[0]))); }
+#line 2703 "src/parse-gram.c"
+    break;
+
+  case 84: /* token_decl_for_prec: id int.opt  */
+#line 617 "src/parse-gram.y"
     {
       (yyval.token_decl_for_prec) = (yyvsp[-1].id);
       symbol_class_set ((yyvsp[-1].id), token_sym, (yylsp[-1]), false);
-      if (0 <= (yyvsp[0].yytype_81))
-        symbol_user_token_number_set ((yyvsp[-1].id), (yyvsp[0].yytype_81), (yylsp[0]));
+      if (0 <= (yyvsp[0].yykind_84))
+        symbol_code_set ((yyvsp[-1].id), (yyvsp[0].yykind_84), (yylsp[0]));
     }
-#line 2660 "src/parse-gram.c"
+#line 2714 "src/parse-gram.c"
     break;
 
-  case 81:
-#line 602 "src/parse-gram.y"
+  case 86: /* symbol_decls: symbols.1  */
+#line 634 "src/parse-gram.y"
     {
-      (yyval.symbol_decls) = (yyvsp[0].yytype_86);
+      (yyval.symbol_decls) = (yyvsp[0].yykind_90);
     }
-#line 2668 "src/parse-gram.c"
+#line 2722 "src/parse-gram.c"
     break;
 
-  case 82:
-#line 606 "src/parse-gram.y"
+  case 87: /* symbol_decls: "<tag>" symbols.1  */
+#line 638 "src/parse-gram.y"
     {
-      (yyval.symbol_decls) = symbol_list_type_set ((yyvsp[0].yytype_86), (yyvsp[-1].TAG), (yylsp[-1]));
+      (yyval.symbol_decls) = symbol_list_type_set ((yyvsp[0].yykind_90), (yyvsp[-1].TAG));
     }
-#line 2676 "src/parse-gram.c"
+#line 2730 "src/parse-gram.c"
     break;
 
-  case 83:
-#line 610 "src/parse-gram.y"
+  case 88: /* symbol_decls: symbol_decls "<tag>" symbols.1  */
+#line 642 "src/parse-gram.y"
     {
-      (yyval.symbol_decls) = symbol_list_append ((yyvsp[-2].symbol_decls), symbol_list_type_set ((yyvsp[0].yytype_86), (yyvsp[-1].TAG), (yylsp[-1])));
+      (yyval.symbol_decls) = symbol_list_append ((yyvsp[-2].symbol_decls), symbol_list_type_set ((yyvsp[0].yykind_90), (yyvsp[-1].TAG)));
     }
-#line 2684 "src/parse-gram.c"
+#line 2738 "src/parse-gram.c"
     break;
 
-  case 84:
-#line 618 "src/parse-gram.y"
+  case 89: /* symbols.1: symbol  */
+#line 650 "src/parse-gram.y"
     {
-      symbol_class_set ((yyvsp[0].symbol), pct_type_sym, (yylsp[0]), false);
-      (yyval.yytype_86) = symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0]));
+      if (current_class != unknown_sym)
+        symbol_class_set ((yyvsp[0].symbol), current_class, (yylsp[0]), false);
+      (yyval.yykind_90) = symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0]));
     }
-#line 2693 "src/parse-gram.c"
+#line 2748 "src/parse-gram.c"
     break;
 
-  case 85:
-#line 623 "src/parse-gram.y"
+  case 90: /* symbols.1: symbols.1 symbol  */
+#line 656 "src/parse-gram.y"
     {
-      symbol_class_set ((yyvsp[0].symbol), pct_type_sym, (yylsp[0]), false);
-      (yyval.yytype_86) = symbol_list_append ((yyvsp[-1].yytype_86), symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0])));
+      if (current_class != unknown_sym)
+        symbol_class_set ((yyvsp[0].symbol), current_class, (yylsp[0]), false);
+      (yyval.yykind_90) = symbol_list_append ((yyvsp[-1].yykind_90), symbol_list_sym_new ((yyvsp[0].symbol), (yylsp[0])));
     }
-#line 2702 "src/parse-gram.c"
+#line 2758 "src/parse-gram.c"
     break;
 
-  case 90:
-#line 644 "src/parse-gram.y"
+  case 95: /* rules_or_grammar_declaration: error ";"  */
+#line 678 "src/parse-gram.y"
     {
       yyerrok;
     }
-#line 2710 "src/parse-gram.c"
+#line 2766 "src/parse-gram.c"
     break;
 
-  case 91:
-#line 650 "src/parse-gram.y"
-                         { current_lhs ((yyvsp[-1].id_colon), (yylsp[-1]), (yyvsp[0].yytype_93)); }
-#line 2716 "src/parse-gram.c"
+  case 96: /* $@5: %empty  */
+#line 684 "src/parse-gram.y"
+                         { current_lhs ((yyvsp[-1].id_colon), (yylsp[-1]), (yyvsp[0].yykind_97)); }
+#line 2772 "src/parse-gram.c"
     break;
 
-  case 92:
-#line 651 "src/parse-gram.y"
+  case 97: /* rules: id_colon named_ref.opt $@5 ":" rhses.1  */
+#line 685 "src/parse-gram.y"
     {
       /* Free the current lhs. */
       current_lhs (0, (yylsp[-4]), 0);
     }
-#line 2725 "src/parse-gram.c"
+#line 2781 "src/parse-gram.c"
     break;
 
-  case 93:
-#line 658 "src/parse-gram.y"
+  case 98: /* rhses.1: rhs  */
+#line 692 "src/parse-gram.y"
                      { grammar_current_rule_end ((yylsp[0])); }
-#line 2731 "src/parse-gram.c"
+#line 2787 "src/parse-gram.c"
     break;
 
-  case 94:
-#line 659 "src/parse-gram.y"
+  case 99: /* rhses.1: rhses.1 "|" rhs  */
+#line 693 "src/parse-gram.y"
                      { grammar_current_rule_end ((yylsp[0])); }
-#line 2737 "src/parse-gram.c"
+#line 2793 "src/parse-gram.c"
     break;
 
-  case 96:
-#line 666 "src/parse-gram.y"
+  case 101: /* rhs: %empty  */
+#line 700 "src/parse-gram.y"
     { grammar_current_rule_begin (current_lhs_symbol, current_lhs_loc,
                                   current_lhs_named_ref); }
-#line 2744 "src/parse-gram.c"
+#line 2800 "src/parse-gram.c"
     break;
 
-  case 97:
-#line 669 "src/parse-gram.y"
-    { grammar_current_rule_symbol_append ((yyvsp[-1].symbol), (yylsp[-1]), (yyvsp[0].yytype_93)); }
-#line 2750 "src/parse-gram.c"
+  case 102: /* rhs: rhs symbol named_ref.opt  */
+#line 703 "src/parse-gram.y"
+    { grammar_current_rule_symbol_append ((yyvsp[-1].symbol), (yylsp[-1]), (yyvsp[0].yykind_97)); }
+#line 2806 "src/parse-gram.c"
     break;
 
-  case 98:
-#line 671 "src/parse-gram.y"
-    { grammar_current_rule_action_append ((yyvsp[-1].BRACED_CODE), (yylsp[-1]), (yyvsp[0].yytype_93), (yyvsp[-2].yytype_73)); }
-#line 2756 "src/parse-gram.c"
+  case 103: /* rhs: rhs tag.opt "{...}" named_ref.opt  */
+#line 705 "src/parse-gram.y"
+    { grammar_current_rule_action_append ((yyvsp[-1].BRACED_CODE), (yylsp[-1]), (yyvsp[0].yykind_97), (yyvsp[-2].yykind_76)); }
+#line 2812 "src/parse-gram.c"
     break;
 
-  case 99:
-#line 673 "src/parse-gram.y"
+  case 104: /* rhs: rhs "%?{...}"  */
+#line 707 "src/parse-gram.y"
     { grammar_current_rule_predicate_append ((yyvsp[0].BRACED_PREDICATE), (yylsp[0])); }
-#line 2762 "src/parse-gram.c"
+#line 2818 "src/parse-gram.c"
     break;
 
-  case 100:
-#line 675 "src/parse-gram.y"
+  case 105: /* rhs: rhs "%empty"  */
+#line 709 "src/parse-gram.y"
     { grammar_current_rule_empty_set ((yylsp[0])); }
-#line 2768 "src/parse-gram.c"
+#line 2824 "src/parse-gram.c"
     break;
 
-  case 101:
-#line 677 "src/parse-gram.y"
+  case 106: /* rhs: rhs "%prec" symbol  */
+#line 711 "src/parse-gram.y"
     { grammar_current_rule_prec_set ((yyvsp[0].symbol), (yylsp[0])); }
-#line 2774 "src/parse-gram.c"
+#line 2830 "src/parse-gram.c"
     break;
 
-  case 102:
-#line 679 "src/parse-gram.y"
-    { grammar_current_rule_dprec_set ((yyvsp[0].INT), (yylsp[0])); }
-#line 2780 "src/parse-gram.c"
+  case 107: /* rhs: rhs "%dprec" "integer literal"  */
+#line 713 "src/parse-gram.y"
+    { grammar_current_rule_dprec_set ((yyvsp[0].INT_LITERAL), (yylsp[0])); }
+#line 2836 "src/parse-gram.c"
     break;
 
-  case 103:
-#line 681 "src/parse-gram.y"
+  case 108: /* rhs: rhs "%merge" "<tag>"  */
+#line 715 "src/parse-gram.y"
     { grammar_current_rule_merge_set ((yyvsp[0].TAG), (yylsp[0])); }
-#line 2786 "src/parse-gram.c"
+#line 2842 "src/parse-gram.c"
     break;
 
-  case 104:
-#line 683 "src/parse-gram.y"
-    { grammar_current_rule_expect_sr ((yyvsp[0].INT), (yylsp[0])); }
-#line 2792 "src/parse-gram.c"
+  case 109: /* rhs: rhs "%expect" "integer literal"  */
+#line 717 "src/parse-gram.y"
+    { grammar_current_rule_expect_sr ((yyvsp[0].INT_LITERAL), (yylsp[0])); }
+#line 2848 "src/parse-gram.c"
     break;
 
-  case 105:
-#line 685 "src/parse-gram.y"
-    { grammar_current_rule_expect_rr ((yyvsp[0].INT), (yylsp[0])); }
-#line 2798 "src/parse-gram.c"
+  case 110: /* rhs: rhs "%expect-rr" "integer literal"  */
+#line 719 "src/parse-gram.y"
+    { grammar_current_rule_expect_rr ((yyvsp[0].INT_LITERAL), (yylsp[0])); }
+#line 2854 "src/parse-gram.c"
     break;
 
-  case 106:
-#line 689 "src/parse-gram.y"
-                 { (yyval.yytype_93) = NULL; }
-#line 2804 "src/parse-gram.c"
-    break;
-
-  case 107:
-#line 690 "src/parse-gram.y"
-                 { (yyval.yytype_93) = named_ref_new ((yyvsp[0].BRACKETED_ID), (yylsp[0])); }
-#line 2810 "src/parse-gram.c"
-    break;
-
-  case 109:
+  case 111: /* named_ref.opt: %empty  */
 #line 723 "src/parse-gram.y"
-          { (yyval.value).kind = muscle_keyword; (yyval.value).chars = ""; }
-#line 2816 "src/parse-gram.c"
+                 { (yyval.yykind_97) = NULL; }
+#line 2860 "src/parse-gram.c"
     break;
 
-  case 110:
+  case 112: /* named_ref.opt: "[identifier]"  */
 #line 724 "src/parse-gram.y"
+                 { (yyval.yykind_97) = named_ref_new ((yyvsp[0].BRACKETED_ID), (yylsp[0])); }
+#line 2866 "src/parse-gram.c"
+    break;
+
+  case 114: /* value: %empty  */
+#line 757 "src/parse-gram.y"
+          { (yyval.value).kind = muscle_keyword; (yyval.value).chars = ""; }
+#line 2872 "src/parse-gram.c"
+    break;
+
+  case 115: /* value: "identifier"  */
+#line 758 "src/parse-gram.y"
           { (yyval.value).kind = muscle_keyword; (yyval.value).chars = (yyvsp[0].ID); }
-#line 2822 "src/parse-gram.c"
+#line 2878 "src/parse-gram.c"
     break;
 
-  case 111:
-#line 725 "src/parse-gram.y"
-          { (yyval.value).kind = muscle_string;  (yyval.value).chars = (yyvsp[0].STRING); }
-#line 2828 "src/parse-gram.c"
+  case 116: /* value: "string"  */
+#line 759 "src/parse-gram.y"
+          { (yyval.value).kind = muscle_string;  (yyval.value).chars = unquote ((yyvsp[0].STRING)); gram_scanner_last_string_free ();}
+#line 2884 "src/parse-gram.c"
     break;
 
-  case 112:
-#line 726 "src/parse-gram.y"
-          { (yyval.value).kind = muscle_code;    (yyval.value).chars = strip_braces ((yyvsp[0].BRACED_CODE)); }
-#line 2834 "src/parse-gram.c"
+  case 117: /* value: "{...}"  */
+#line 760 "src/parse-gram.y"
+          { (yyval.value).kind = muscle_code;    (yyval.value).chars = strip_braces ((yyvsp[0].BRACED_CODE)); gram_scanner_last_string_free (); }
+#line 2890 "src/parse-gram.c"
     break;
 
-  case 113:
-#line 739 "src/parse-gram.y"
+  case 118: /* id: "identifier"  */
+#line 773 "src/parse-gram.y"
     { (yyval.id) = symbol_from_uniqstr ((yyvsp[0].ID), (yylsp[0])); }
-#line 2840 "src/parse-gram.c"
+#line 2896 "src/parse-gram.c"
     break;
 
-  case 114:
-#line 741 "src/parse-gram.y"
+  case 119: /* id: "character literal"  */
+#line 775 "src/parse-gram.y"
     {
       const char *var = "api.token.raw";
       if (current_class == nterm_sym)
@@ -2851,54 +2907,45 @@
         }
       if (muscle_percent_define_ifdef (var))
         {
-          int indent = 0;
-          complain_indent (&(yylsp[0]), complaint, &indent,
-                           _("character literals cannot be used together"
-                             " with %s"), var);
-          indent += SUB_INDENT;
+          complain (&(yylsp[0]), complaint,
+                    _("character literals cannot be used together"
+                    " with %s"), var);
           location loc = muscle_percent_define_get_loc (var);
-          complain_indent (&loc, complaint, &indent,
-                           _("definition of %s"), var);
+          subcomplain (&loc, complaint, _("definition of %s"), var);
         }
-      (yyval.id) = symbol_get (char_name ((yyvsp[0].CHAR)), (yylsp[0]));
+      (yyval.id) = symbol_get (char_name ((yyvsp[0].CHAR_LITERAL)), (yylsp[0]));
       symbol_class_set ((yyval.id), token_sym, (yylsp[0]), false);
-      symbol_user_token_number_set ((yyval.id), (yyvsp[0].CHAR), (yylsp[0]));
+      symbol_code_set ((yyval.id), (yyvsp[0].CHAR_LITERAL), (yylsp[0]));
     }
-#line 2868 "src/parse-gram.c"
+#line 2921 "src/parse-gram.c"
     break;
 
-  case 115:
-#line 767 "src/parse-gram.y"
+  case 120: /* id_colon: "identifier:"  */
+#line 798 "src/parse-gram.y"
            { (yyval.id_colon) = symbol_from_uniqstr ((yyvsp[0].ID_COLON), (yylsp[0])); }
-#line 2874 "src/parse-gram.c"
+#line 2927 "src/parse-gram.c"
     break;
 
-  case 118:
-#line 779 "src/parse-gram.y"
+  case 123: /* string_as_id: "string"  */
+#line 810 "src/parse-gram.y"
     {
-      (yyval.string_as_id) = symbol_get (quotearg_style (c_quoting_style, (yyvsp[0].STRING)), (yylsp[0]));
+      (yyval.string_as_id) = symbol_get ((yyvsp[0].STRING), (yylsp[0]));
       symbol_class_set ((yyval.string_as_id), token_sym, (yylsp[0]), false);
     }
-#line 2883 "src/parse-gram.c"
+#line 2936 "src/parse-gram.c"
     break;
 
-  case 119:
-#line 787 "src/parse-gram.y"
-                     { (yyval.yytype_100) = NULL; }
-#line 2889 "src/parse-gram.c"
-    break;
-
-  case 122:
-#line 794 "src/parse-gram.y"
+  case 125: /* epilogue.opt: "%%" "epilogue"  */
+#line 819 "src/parse-gram.y"
     {
       muscle_code_grow ("epilogue", translate_code ((yyvsp[0].EPILOGUE), (yylsp[0]), true), (yylsp[0]));
       code_scanner_last_string_free ();
     }
-#line 2898 "src/parse-gram.c"
+#line 2945 "src/parse-gram.c"
     break;
 
 
-#line 2902 "src/parse-gram.c"
+#line 2949 "src/parse-gram.c"
 
         default: break;
       }
@@ -2916,11 +2963,10 @@
      case of YYERROR or YYBACKUP, subsequent parser actions might lead
      to an incorrect destructor call or verbose syntax error message
      before the lookahead is translated.  */
-  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+  YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
 
   YYPOPSTACK (yylen);
   yylen = 0;
-  YY_STACK_PRINT (yyss, yyssp);
 
   *++yyvsp = yyval;
   *++yylsp = yyloc;
@@ -2945,69 +2991,38 @@
 yyerrlab:
   /* Make sure we have latest lookahead translation.  See comments at
      user semantic actions for why this is necessary.  */
-  yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
-
+  yytoken = yychar == GRAM_EMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
   /* If not already recovering from an error, report this error.  */
   if (!yyerrstatus)
     {
       ++yynerrs;
-#if ! YYERROR_VERBOSE
-      yyerror (&yylloc, YY_("syntax error"));
-#else
-# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
-                                        yyesa, &yyes, &yyes_capacity, \
-                                        yyssp, yytoken)
       {
-        char const *yymsgp = YY_("syntax error");
-        int yysyntax_error_status;
-        if (yychar != YYEMPTY)
+        yypcontext_t yyctx
+          = {yyssp, yyesa, &yyes, &yyes_capacity, yytoken, &yylloc};
+        if (yychar != GRAM_EMPTY)
           YY_LAC_ESTABLISH;
-        yysyntax_error_status = YYSYNTAX_ERROR;
-        if (yysyntax_error_status == 0)
-          yymsgp = yymsg;
-        else if (yysyntax_error_status == 1)
-          {
-            if (yymsg != yymsgbuf)
-              YYSTACK_FREE (yymsg);
-            yymsg = YY_CAST (char *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc)));
-            if (!yymsg)
-              {
-                yymsg = yymsgbuf;
-                yymsg_alloc = sizeof yymsgbuf;
-                yysyntax_error_status = 2;
-              }
-            else
-              {
-                yysyntax_error_status = YYSYNTAX_ERROR;
-                yymsgp = yymsg;
-              }
-          }
-        yyerror (&yylloc, yymsgp);
-        if (yysyntax_error_status == 2)
-          goto yyexhaustedlab;
+        if (yyreport_syntax_error (&yyctx) == 2)
+          YYNOMEM;
       }
-# undef YYSYNTAX_ERROR
-#endif
     }
 
   yyerror_range[1] = yylloc;
-
   if (yyerrstatus == 3)
     {
       /* If just tried and failed to reuse lookahead token after an
          error, discard it.  */
 
-      if (yychar <= YYEOF)
+      if (yychar <= GRAM_EOF)
         {
           /* Return failure if at end of input.  */
-          if (yychar == YYEOF)
+          if (yychar == GRAM_EOF)
             YYABORT;
         }
       else
         {
           yydestruct ("Error: discarding",
                       yytoken, &yylval, &yylloc);
-          yychar = YYEMPTY;
+          yychar = GRAM_EMPTY;
         }
     }
 
@@ -3024,6 +3039,7 @@
      label yyerrorlab therefore never appears in user code.  */
   if (0)
     YYERROR;
+  ++yynerrs;
 
   /* Do not reclaim the symbols of the rule whose action triggered
      this YYERROR.  */
@@ -3040,13 +3056,14 @@
 yyerrlab1:
   yyerrstatus = 3;      /* Each real token shifted decrements this.  */
 
+  /* Pop stack until we find a state that shifts the error token.  */
   for (;;)
     {
       yyn = yypact[yystate];
       if (!yypact_value_is_default (yyn))
         {
-          yyn += YYTERROR;
-          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+          yyn += YYSYMBOL_YYerror;
+          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
             {
               yyn = yytable[yyn];
               if (0 < yyn)
@@ -3060,7 +3077,7 @@
 
       yyerror_range[1] = *yylsp;
       yydestruct ("Error: popping",
-                  yystos[yystate], yyvsp, yylsp);
+                  YY_ACCESSING_SYMBOL (yystate), yyvsp, yylsp);
       YYPOPSTACK (1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
@@ -3075,13 +3092,11 @@
   YY_IGNORE_MAYBE_UNINITIALIZED_END
 
   yyerror_range[2] = yylloc;
-  /* Using YYLLOC is tempting, but would change the location of
-     the lookahead.  YYLOC is available though.  */
-  YYLLOC_DEFAULT (yyloc, yyerror_range, 2);
-  *++yylsp = yyloc;
+  ++yylsp;
+  YYLLOC_DEFAULT (*yylsp, yyerror_range, 2);
 
   /* Shift the error token.  */
-  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+  YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
 
   yystate = yyn;
   goto yynewstate;
@@ -3092,7 +3107,7 @@
 `-------------------------------------*/
 yyacceptlab:
   yyresult = 0;
-  goto yyreturn;
+  goto yyreturnlab;
 
 
 /*-----------------------------------.
@@ -3100,25 +3115,23 @@
 `-----------------------------------*/
 yyabortlab:
   yyresult = 1;
-  goto yyreturn;
+  goto yyreturnlab;
 
 
-#if 1
-/*-------------------------------------------------.
-| yyexhaustedlab -- memory exhaustion comes here.  |
-`-------------------------------------------------*/
+/*-----------------------------------------------------------.
+| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here.  |
+`-----------------------------------------------------------*/
 yyexhaustedlab:
   yyerror (&yylloc, YY_("memory exhausted"));
   yyresult = 2;
-  /* Fall through.  */
-#endif
+  goto yyreturnlab;
 
 
-/*-----------------------------------------------------.
-| yyreturn -- parsing is finished, return the result.  |
-`-----------------------------------------------------*/
-yyreturn:
-  if (yychar != YYEMPTY)
+/*----------------------------------------------------------.
+| yyreturnlab -- parsing is finished, clean up and return.  |
+`----------------------------------------------------------*/
+yyreturnlab:
+  if (yychar != GRAM_EMPTY)
     {
       /* Make sure we have latest lookahead translation.  See comments at
          user semantic actions for why this is necessary.  */
@@ -3133,7 +3146,7 @@
   while (yyssp != yyss)
     {
       yydestruct ("Cleanup: popping",
-                  yystos[*yyssp], yyvsp, yylsp);
+                  YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, yylsp);
       YYPOPSTACK (1);
     }
 #ifndef yyoverflow
@@ -3142,13 +3155,37 @@
 #endif
   if (yyes != yyesa)
     YYSTACK_FREE (yyes);
-#if YYERROR_VERBOSE
-  if (yymsg != yymsgbuf)
-    YYSTACK_FREE (yymsg);
-#endif
+
   return yyresult;
 }
-#line 800 "src/parse-gram.y"
+
+#line 825 "src/parse-gram.y"
+
+
+int
+yyreport_syntax_error (const yypcontext_t *ctx)
+{
+  int res = 0;
+  /* Arguments of format: reported tokens (one for the "unexpected",
+     one per "expected"). */
+  enum { ARGS_MAX = 5 };
+  const char *argv[ARGS_MAX];
+  int argc = 0;
+  yysymbol_kind_t unexpected = yypcontext_token (ctx);
+  if (unexpected != YYSYMBOL_YYEMPTY)
+    {
+      argv[argc++] = yysymbol_name (unexpected);
+      yysymbol_kind_t expected[ARGS_MAX - 1];
+      int nexpected = yypcontext_expected_tokens (ctx, expected, ARGS_MAX - 1);
+      if (nexpected < 0)
+        res = nexpected;
+      else
+        for (int i = 0; i < nexpected; ++i)
+          argv[argc++] = yysymbol_name (expected[i]);
+    }
+  syntax_error (*yypcontext_location (ctx), argc, argv);
+  return res;
+}
 
 
 /* Return the location of the left-hand side of a rule whose
@@ -3254,6 +3291,20 @@
 
 
 static void
+handle_header (char const *value)
+{
+  header_flag = true;
+  if (value)
+    {
+      char *file = unquote (value);
+      spec_header_file = xstrdup (file);
+      gram_scanner_last_string_free ();
+      unquote_free (file);
+    }
+}
+
+
+static void
 handle_error_verbose (location const *loc, char const *directive)
 {
   bison_directive (loc, directive);
@@ -3265,8 +3316,9 @@
 static void
 handle_file_prefix (location const *loc,
                     location const *dir_loc,
-                    char const *directive, char const *value)
+                    char const *directive, char const *value_quoted)
 {
+  char *value = unquote (value_quoted);
   bison_directive (loc, directive);
   bool warned = false;
 
@@ -3286,11 +3338,18 @@
     deprecated_directive (dir_loc, directive, "%file-prefix");
 }
 
+static void
+handle_language (location const *loc, char const *lang)
+{
+  language_argmatch (unquote (lang), grammar_prio, *loc);
+}
+
 
 static void
 handle_name_prefix (location const *loc,
-                    char const *directive, char const *value)
+                    char const *directive, char const *value_quoted)
 {
+  char *value = unquote (value_quoted);
   bison_directive (loc, directive);
 
   char buf1[1024];
@@ -3331,65 +3390,37 @@
 }
 
 
-/* Convert VERSION into an int (MAJOR * 100 + MINOR).  Return -1 on
-   errors.
-
-   Changes of behavior are only on minor version changes, so "3.0.5"
-   is the same as "3.0": 300. */
-static int
-str_to_version (char const *version)
-{
-  IGNORE_TYPE_LIMITS_BEGIN
-  int res = 0;
-  errno = 0;
-  char *cp = NULL;
-  long major = strtol (version, &cp, 10);
-  if (errno || cp == version || *cp != '.' || major < 0
-      || INT_MULTIPLY_WRAPV (major, 100, &res))
-    return -1;
-
-  ++cp;
-  char *cp1 = NULL;
-  long minor = strtol (cp, &cp1, 10);
-  if (errno || cp1 == cp || (*cp1 != '\0' && *cp1 != '.')
-      || ! (0 <= minor && minor < 100)
-      || INT_ADD_WRAPV (minor, res, &res))
-    return -1;
-
-  IGNORE_TYPE_LIMITS_END
-  return res;
-}
-
-
 static void
-handle_require (location const *loc, char const *version)
+handle_require (location const *loc, char const *version_quoted)
 {
-  required_version = str_to_version (version);
+  char *version = unquote (version_quoted);
+  required_version = strversion_to_int (version);
   if (required_version == -1)
     {
       complain (loc, complaint, _("invalid version requirement: %s"),
                 version);
       required_version = 0;
-      return;
     }
-
-  /* Pretend to be at least 3.5, to check features published in that
-     version while developping it.  */
-  const char* api_version = "3.5";
-  const char* package_version =
-    0 < strverscmp (api_version, PACKAGE_VERSION)
-    ? api_version : PACKAGE_VERSION;
-  if (0 < strverscmp (version, package_version))
+  else
     {
-      complain (loc, complaint, _("require bison %s, but have %s"),
-                version, package_version);
-      exit (EX_MISMATCH);
+      const char* package_version =
+        0 < strverscmp (api_version, PACKAGE_VERSION)
+        ? api_version : PACKAGE_VERSION;
+      if (0 < strverscmp (version, package_version))
+        {
+          complain (loc, complaint, _("require bison %s, but have %s"),
+                    version, package_version);
+          exit (EX_MISMATCH);
+        }
     }
+  unquote_free (version);
+  gram_scanner_last_string_free ();
 }
 
 static void
-handle_skeleton (location const *loc, char const *skel)
+handle_skeleton (location const *loc, char const *skel_quoted)
 {
+  char *skel = unquote (skel_quoted);
   char const *skeleton_user = skel;
   if (strchr (skeleton_user, '/'))
     {
@@ -3419,7 +3450,7 @@
   const char *directive = "%yacc";
   bison_directive (loc, directive);
   if (location_empty (yacc_loc))
-    yacc_loc = *loc;
+    set_yacc (*loc);
   else
     duplicate_directive (directive, yacc_loc, *loc);
 }
@@ -3444,8 +3475,7 @@
     }
 }
 
-static
-void
+static void
 current_lhs (symbol *sym, location loc, named_ref *ref)
 {
   current_lhs_symbol = sym;
@@ -3470,3 +3500,95 @@
 {
   end_use_class ("value", yyo);
 }
+
+
+/*----------.
+| Unquote.  |
+`----------*/
+
+struct obstack obstack_for_unquote;
+
+void
+parser_init (void)
+{
+  obstack_init (&obstack_for_unquote);
+}
+
+void
+parser_free (void)
+{
+  obstack_free (&obstack_for_unquote, 0);
+}
+
+static void
+unquote_free (char *last_string)
+{
+  obstack_free (&obstack_for_unquote, last_string);
+}
+
+static char *
+unquote (const char *cp)
+{
+#define GROW(Char)                              \
+  obstack_1grow (&obstack_for_unquote, Char);
+  for (++cp; *cp && *cp != '"'; ++cp)
+    switch (*cp)
+      {
+      case '"':
+        break;
+      case '\\':
+        ++cp;
+        switch (*cp)
+          {
+          case '0': case '1': case '2': case '3': case '4':
+          case '5': case '6': case '7': case '8': case '9':
+            {
+              int c = cp[0] - '0';
+              if (c_isdigit (cp[1]))
+                {
+                  ++cp;
+                  c = c * 8 + cp[0] - '0';
+                }
+              if (c_isdigit (cp[1]))
+                {
+                  ++cp;
+                  c = c * 8 + cp[0] - '0';
+                }
+              GROW (c);
+            }
+            break;
+
+          case 'a': GROW ('\a'); break;
+          case 'b': GROW ('\b'); break;
+          case 'f': GROW ('\f'); break;
+          case 'n': GROW ('\n'); break;
+          case 'r': GROW ('\r'); break;
+          case 't': GROW ('\t'); break;
+          case 'v': GROW ('\v'); break;
+
+          case 'x':
+            {
+              int c = 0;
+              while (c_isxdigit (cp[1]))
+                {
+                  ++cp;
+                  c = (c * 16 + (c_isdigit (cp[0]) ? cp[0] - '0'
+                                 : c_isupper (cp[0]) ? cp[0] - 'A'
+                                 : cp[0] - '0'));
+                }
+              GROW (c);
+              break;
+            }
+          }
+        break;
+
+      default:
+        GROW (*cp);
+        break;
+      }
+  assert (*cp == '"');
+  ++cp;
+  assert (*cp == '\0');
+#undef GROW
+  return obstack_finish0 (&obstack_for_unquote);
+}
diff --git a/src/parse-gram.h b/src/parse-gram.h
index 2677735..5887db0 100644
--- a/src/parse-gram.h
+++ b/src/parse-gram.h
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 3.5.  */
+/* A Bison parser, made by GNU Bison 3.8.2.  */
 
 /* Bison interface for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /* As a special exception, you may create a larger work that contains
    part or all of the Bison parser skeleton and distribute that work
@@ -31,8 +31,9 @@
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
-/* Undocumented macros, especially those whose name start with YY_,
-   are private implementation details.  Do not rely on them.  */
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+   especially those whose name start with YY_ or yy_.  They are
+   private implementation details that can be changed or removed.  */
 
 #ifndef YY_GRAM_SRC_PARSE_GRAM_H_INCLUDED
 # define YY_GRAM_SRC_PARSE_GRAM_H_INCLUDED
@@ -56,7 +57,7 @@
 
   #include "symlist.h"
   #include "symtab.h"
-#line 251 "src/parse-gram.y"
+#line 268 "src/parse-gram.y"
 
   typedef enum
   {
@@ -65,7 +66,7 @@
     param_parse  = 1 << 1,
     param_both   = param_lex | param_parse
   } param_type;
-#line 703 "src/parse-gram.y"
+#line 737 "src/parse-gram.y"
 
   #include "muscle-tab.h"
   typedef struct
@@ -74,162 +75,128 @@
     muscle_kind kind;
   } value_type;
 
-#line 78 "src/parse-gram.h"
+#line 79 "src/parse-gram.h"
 
-/* Token type.  */
+/* Token kinds.  */
 #ifndef GRAM_TOKENTYPE
 # define GRAM_TOKENTYPE
   enum gram_tokentype
   {
-    GRAM_EOF = 0,
-    STRING = 3,
-    PERCENT_TOKEN = 4,
-    PERCENT_NTERM = 5,
-    PERCENT_TYPE = 6,
-    PERCENT_DESTRUCTOR = 7,
-    PERCENT_PRINTER = 8,
-    PERCENT_LEFT = 9,
-    PERCENT_RIGHT = 10,
-    PERCENT_NONASSOC = 11,
-    PERCENT_PRECEDENCE = 12,
-    PERCENT_PREC = 13,
-    PERCENT_DPREC = 14,
-    PERCENT_MERGE = 15,
-    PERCENT_CODE = 16,
-    PERCENT_DEFAULT_PREC = 17,
-    PERCENT_DEFINE = 18,
-    PERCENT_DEFINES = 19,
-    PERCENT_ERROR_VERBOSE = 20,
-    PERCENT_EXPECT = 21,
-    PERCENT_EXPECT_RR = 22,
-    PERCENT_FLAG = 23,
-    PERCENT_FILE_PREFIX = 24,
-    PERCENT_GLR_PARSER = 25,
-    PERCENT_INITIAL_ACTION = 26,
-    PERCENT_LANGUAGE = 27,
-    PERCENT_NAME_PREFIX = 28,
-    PERCENT_NO_DEFAULT_PREC = 29,
-    PERCENT_NO_LINES = 30,
-    PERCENT_NONDETERMINISTIC_PARSER = 31,
-    PERCENT_OUTPUT = 32,
-    PERCENT_PURE_PARSER = 33,
-    PERCENT_REQUIRE = 34,
-    PERCENT_SKELETON = 35,
-    PERCENT_START = 36,
-    PERCENT_TOKEN_TABLE = 37,
-    PERCENT_VERBOSE = 38,
-    PERCENT_YACC = 39,
-    BRACED_CODE = 40,
-    BRACED_PREDICATE = 41,
-    BRACKETED_ID = 42,
-    CHAR = 43,
-    COLON = 44,
-    EPILOGUE = 45,
-    EQUAL = 46,
-    ID = 47,
-    ID_COLON = 48,
-    PERCENT_PERCENT = 49,
-    PIPE = 50,
-    PROLOGUE = 51,
-    SEMICOLON = 52,
-    TAG = 53,
-    TAG_ANY = 54,
-    TAG_NONE = 55,
-    INT = 56,
-    PERCENT_PARAM = 57,
-    PERCENT_UNION = 58,
-    PERCENT_EMPTY = 59
+    GRAM_EMPTY = -2,
+    GRAM_EOF = 0,                  /* "end of file"  */
+    GRAM_error = 1,                /* error  */
+    GRAM_UNDEF = 2,                /* "invalid token"  */
+    STRING = 3,                    /* "string"  */
+    TSTRING = 4,                   /* "translatable string"  */
+    PERCENT_TOKEN = 5,             /* "%token"  */
+    PERCENT_NTERM = 6,             /* "%nterm"  */
+    PERCENT_TYPE = 7,              /* "%type"  */
+    PERCENT_DESTRUCTOR = 8,        /* "%destructor"  */
+    PERCENT_PRINTER = 9,           /* "%printer"  */
+    PERCENT_LEFT = 10,             /* "%left"  */
+    PERCENT_RIGHT = 11,            /* "%right"  */
+    PERCENT_NONASSOC = 12,         /* "%nonassoc"  */
+    PERCENT_PRECEDENCE = 13,       /* "%precedence"  */
+    PERCENT_PREC = 14,             /* "%prec"  */
+    PERCENT_DPREC = 15,            /* "%dprec"  */
+    PERCENT_MERGE = 16,            /* "%merge"  */
+    PERCENT_CODE = 17,             /* "%code"  */
+    PERCENT_DEFAULT_PREC = 18,     /* "%default-prec"  */
+    PERCENT_DEFINE = 19,           /* "%define"  */
+    PERCENT_ERROR_VERBOSE = 20,    /* "%error-verbose"  */
+    PERCENT_EXPECT = 21,           /* "%expect"  */
+    PERCENT_EXPECT_RR = 22,        /* "%expect-rr"  */
+    PERCENT_FILE_PREFIX = 23,      /* "%file-prefix"  */
+    PERCENT_FLAG = 24,             /* "%<flag>"  */
+    PERCENT_GLR_PARSER = 25,       /* "%glr-parser"  */
+    PERCENT_HEADER = 26,           /* "%header"  */
+    PERCENT_INITIAL_ACTION = 27,   /* "%initial-action"  */
+    PERCENT_LANGUAGE = 28,         /* "%language"  */
+    PERCENT_NAME_PREFIX = 29,      /* "%name-prefix"  */
+    PERCENT_NO_DEFAULT_PREC = 30,  /* "%no-default-prec"  */
+    PERCENT_NO_LINES = 31,         /* "%no-lines"  */
+    PERCENT_NONDETERMINISTIC_PARSER = 32, /* "%nondeterministic-parser"  */
+    PERCENT_OUTPUT = 33,           /* "%output"  */
+    PERCENT_PURE_PARSER = 34,      /* "%pure-parser"  */
+    PERCENT_REQUIRE = 35,          /* "%require"  */
+    PERCENT_SKELETON = 36,         /* "%skeleton"  */
+    PERCENT_START = 37,            /* "%start"  */
+    PERCENT_TOKEN_TABLE = 38,      /* "%token-table"  */
+    PERCENT_VERBOSE = 39,          /* "%verbose"  */
+    PERCENT_YACC = 40,             /* "%yacc"  */
+    BRACED_CODE = 41,              /* "{...}"  */
+    BRACED_PREDICATE = 42,         /* "%?{...}"  */
+    BRACKETED_ID = 43,             /* "[identifier]"  */
+    CHAR_LITERAL = 44,             /* "character literal"  */
+    COLON = 45,                    /* ":"  */
+    EPILOGUE = 46,                 /* "epilogue"  */
+    EQUAL = 47,                    /* "="  */
+    ID = 48,                       /* "identifier"  */
+    ID_COLON = 49,                 /* "identifier:"  */
+    PERCENT_PERCENT = 50,          /* "%%"  */
+    PIPE = 51,                     /* "|"  */
+    PROLOGUE = 52,                 /* "%{...%}"  */
+    SEMICOLON = 53,                /* ";"  */
+    TAG = 54,                      /* "<tag>"  */
+    TAG_ANY = 55,                  /* "<*>"  */
+    TAG_NONE = 56,                 /* "<>"  */
+    INT_LITERAL = 57,              /* "integer literal"  */
+    PERCENT_PARAM = 58,            /* "%param"  */
+    PERCENT_UNION = 59,            /* "%union"  */
+    PERCENT_EMPTY = 60             /* "%empty"  */
   };
+  typedef enum gram_tokentype gram_token_kind_t;
 #endif
 
 /* Value type.  */
 #if ! defined GRAM_STYPE && ! defined GRAM_STYPE_IS_DECLARED
 union GRAM_STYPE
 {
+  assoc precedence_declarator;             /* precedence_declarator  */
+  char* STRING;                            /* "string"  */
+  char* TSTRING;                           /* "translatable string"  */
+  char* BRACED_CODE;                       /* "{...}"  */
+  char* BRACED_PREDICATE;                  /* "%?{...}"  */
+  char* EPILOGUE;                          /* "epilogue"  */
+  char* PROLOGUE;                          /* "%{...%}"  */
+  char* yykind_75;                         /* string.opt  */
+  code_props_type code_props_type;         /* code_props_type  */
+  int INT_LITERAL;                         /* "integer literal"  */
+  int yykind_84;                           /* int.opt  */
+  named_ref* yykind_97;                    /* named_ref.opt  */
+  param_type PERCENT_PARAM;                /* "%param"  */
+  symbol* token_decl;                      /* token_decl  */
+  symbol* alias;                           /* alias  */
+  symbol* token_decl_for_prec;             /* token_decl_for_prec  */
+  symbol* id;                              /* id  */
+  symbol* id_colon;                        /* id_colon  */
+  symbol* symbol;                          /* symbol  */
+  symbol* string_as_id;                    /* string_as_id  */
+  symbol_list* generic_symlist;            /* generic_symlist  */
+  symbol_list* generic_symlist_item;       /* generic_symlist_item  */
+  symbol_list* nterm_decls;                /* nterm_decls  */
+  symbol_list* token_decls;                /* token_decls  */
+  symbol_list* yykind_82;                  /* token_decl.1  */
+  symbol_list* token_decls_for_prec;       /* token_decls_for_prec  */
+  symbol_list* yykind_87;                  /* token_decl_for_prec.1  */
+  symbol_list* symbol_decls;               /* symbol_decls  */
+  symbol_list* yykind_90;                  /* symbols.1  */
+  uniqstr PERCENT_ERROR_VERBOSE;           /* "%error-verbose"  */
+  uniqstr PERCENT_FILE_PREFIX;             /* "%file-prefix"  */
+  uniqstr PERCENT_FLAG;                    /* "%<flag>"  */
+  uniqstr PERCENT_NAME_PREFIX;             /* "%name-prefix"  */
+  uniqstr PERCENT_PURE_PARSER;             /* "%pure-parser"  */
+  uniqstr BRACKETED_ID;                    /* "[identifier]"  */
+  uniqstr ID;                              /* "identifier"  */
+  uniqstr ID_COLON;                        /* "identifier:"  */
+  uniqstr TAG;                             /* "<tag>"  */
+  uniqstr yykind_76;                       /* tag.opt  */
+  uniqstr tag;                             /* tag  */
+  uniqstr variable;                        /* variable  */
+  unsigned char CHAR_LITERAL;              /* "character literal"  */
+  value_type value;                        /* value  */
 
-  /* precedence_declarator  */
-  assoc precedence_declarator;
-  /* "string"  */
-  char* STRING;
-  /* "{...}"  */
-  char* BRACED_CODE;
-  /* "%?{...}"  */
-  char* BRACED_PREDICATE;
-  /* "epilogue"  */
-  char* EPILOGUE;
-  /* "%{...%}"  */
-  char* PROLOGUE;
-  /* code_props_type  */
-  code_props_type code_props_type;
-  /* "integer"  */
-  int INT;
-  /* int.opt  */
-  int yytype_81;
-  /* named_ref.opt  */
-  named_ref* yytype_93;
-  /* "%param"  */
-  param_type PERCENT_PARAM;
-  /* token_decl  */
-  symbol* token_decl;
-  /* token_decl_for_prec  */
-  symbol* token_decl_for_prec;
-  /* id  */
-  symbol* id;
-  /* id_colon  */
-  symbol* id_colon;
-  /* symbol  */
-  symbol* symbol;
-  /* string_as_id  */
-  symbol* string_as_id;
-  /* string_as_id.opt  */
-  symbol* yytype_100;
-  /* generic_symlist  */
-  symbol_list* generic_symlist;
-  /* generic_symlist_item  */
-  symbol_list* generic_symlist_item;
-  /* nterm_decls  */
-  symbol_list* nterm_decls;
-  /* token_decls  */
-  symbol_list* token_decls;
-  /* token_decl.1  */
-  symbol_list* yytype_79;
-  /* token_decls_for_prec  */
-  symbol_list* token_decls_for_prec;
-  /* token_decl_for_prec.1  */
-  symbol_list* yytype_83;
-  /* symbol_decls  */
-  symbol_list* symbol_decls;
-  /* symbol_decl.1  */
-  symbol_list* yytype_86;
-  /* "%error-verbose"  */
-  uniqstr PERCENT_ERROR_VERBOSE;
-  /* "%<flag>"  */
-  uniqstr PERCENT_FLAG;
-  /* "%file-prefix"  */
-  uniqstr PERCENT_FILE_PREFIX;
-  /* "%name-prefix"  */
-  uniqstr PERCENT_NAME_PREFIX;
-  /* "%pure-parser"  */
-  uniqstr PERCENT_PURE_PARSER;
-  /* "[identifier]"  */
-  uniqstr BRACKETED_ID;
-  /* "identifier"  */
-  uniqstr ID;
-  /* "identifier:"  */
-  uniqstr ID_COLON;
-  /* "<tag>"  */
-  uniqstr TAG;
-  /* tag.opt  */
-  uniqstr yytype_73;
-  /* tag  */
-  uniqstr tag;
-  /* variable  */
-  uniqstr variable;
-  /* "character literal"  */
-  unsigned char CHAR;
-  /* value  */
-  value_type value;
-#line 233 "src/parse-gram.h"
+#line 200 "src/parse-gram.h"
 
 };
 typedef union GRAM_STYPE GRAM_STYPE;
@@ -253,6 +220,17 @@
 
 
 
+
 int gram_parse (void);
 
+/* "%code provides" blocks.  */
+#line 27 "src/parse-gram.y"
+
+  /* Initialize unquote.  */
+  void parser_init (void);
+  /* Deallocate storage for unquote.  */
+  void parser_free (void);
+
+#line 235 "src/parse-gram.h"
+
 #endif /* !YY_GRAM_SRC_PARSE_GRAM_H_INCLUDED  */
diff --git a/src/parse-gram.output b/src/parse-gram.output
index 2403bfc..e247814 100644
--- a/src/parse-gram.output
+++ b/src/parse-gram.output
@@ -5,7 +5,7 @@
 
 Grammar
 
-    0 $accept: input "end of file"
+    0 $accept: input $end
 
     1 input: prologue_declarations "%%" grammar epilogue.opt
 
@@ -16,59 +16,61 @@
     5                     | "%{...%}"
     6                     | "%<flag>"
     7                     | "%define" variable value
-    8                     | "%defines"
-    9                     | "%defines" "string"
-   10                     | "%error-verbose"
-   11                     | "%expect" "integer"
-   12                     | "%expect-rr" "integer"
-   13                     | "%file-prefix" "string"
-   14                     | "%glr-parser"
-   15                     | "%initial-action" "{...}"
-   16                     | "%language" "string"
-   17                     | "%name-prefix" "string"
-   18                     | "%no-lines"
-   19                     | "%nondeterministic-parser"
-   20                     | "%output" "string"
+    8                     | "%header" string.opt
+    9                     | "%error-verbose"
+   10                     | "%expect" "integer literal"
+   11                     | "%expect-rr" "integer literal"
+   12                     | "%file-prefix" "string"
+   13                     | "%glr-parser"
+   14                     | "%initial-action" "{...}"
+   15                     | "%language" "string"
+   16                     | "%name-prefix" "string"
+   17                     | "%no-lines"
+   18                     | "%nondeterministic-parser"
+   19                     | "%output" "string"
 
-   21 $@1: %empty
+   20 $@1: %empty
 
-   22 prologue_declaration: "%param" $@1 params
-   23                     | "%pure-parser"
-   24                     | "%require" "string"
-   25                     | "%skeleton" "string"
-   26                     | "%token-table"
-   27                     | "%verbose"
-   28                     | "%yacc"
-   29                     | error ";"
-   30                     | ";"
+   21 prologue_declaration: "%param" $@1 params
+   22                     | "%pure-parser"
+   23                     | "%require" "string"
+   24                     | "%skeleton" "string"
+   25                     | "%token-table"
+   26                     | "%verbose"
+   27                     | "%yacc"
+   28                     | error ";"
+   29                     | ";"
 
-   31 params: params "{...}"
-   32       | "{...}"
+   30 params: params "{...}"
+   31       | "{...}"
 
-   33 grammar_declaration: symbol_declaration
-   34                    | "%start" symbol
-   35                    | code_props_type "{...}" generic_symlist
-   36                    | "%default-prec"
-   37                    | "%no-default-prec"
-   38                    | "%code" "{...}"
-   39                    | "%code" "identifier" "{...}"
+   32 grammar_declaration: symbol_declaration
+   33                    | "%start" symbols.1
+   34                    | code_props_type "{...}" generic_symlist
+   35                    | "%default-prec"
+   36                    | "%no-default-prec"
+   37                    | "%code" "{...}"
+   38                    | "%code" "identifier" "{...}"
 
-   40 code_props_type: "%destructor"
-   41                | "%printer"
+   39 code_props_type: "%destructor"
+   40                | "%printer"
 
-   42 union_name: %empty
-   43           | "identifier"
+   41 union_name: %empty
+   42           | "identifier"
 
-   44 grammar_declaration: "%union" union_name "{...}"
+   43 grammar_declaration: "%union" union_name "{...}"
 
-   45 $@2: %empty
+   44 $@2: %empty
 
-   46 symbol_declaration: "%nterm" $@2 nterm_decls
+   45 symbol_declaration: "%nterm" $@2 nterm_decls
 
-   47 $@3: %empty
+   46 $@3: %empty
 
-   48 symbol_declaration: "%token" $@3 token_decls
-   49                   | "%type" symbol_decls
+   47 symbol_declaration: "%token" $@3 token_decls
+
+   48 $@4: %empty
+
+   49 symbol_declaration: "%type" $@4 symbol_decls
    50                   | precedence_declarator token_decls_for_prec
 
    51 precedence_declarator: "%left"
@@ -76,300 +78,311 @@
    53                      | "%nonassoc"
    54                      | "%precedence"
 
-   55 tag.opt: %empty
-   56        | "<tag>"
+   55 string.opt: %empty
+   56           | "string"
 
-   57 generic_symlist: generic_symlist_item
-   58                | generic_symlist generic_symlist_item
+   57 tag.opt: %empty
+   58        | "<tag>"
 
-   59 generic_symlist_item: symbol
-   60                     | tag
+   59 generic_symlist: generic_symlist_item
+   60                | generic_symlist generic_symlist_item
 
-   61 tag: "<tag>"
-   62    | "<*>"
-   63    | "<>"
+   61 generic_symlist_item: symbol
+   62                     | tag
 
-   64 nterm_decls: token_decls
+   63 tag: "<tag>"
+   64    | "<*>"
+   65    | "<>"
 
-   65 token_decls: token_decl.1
-   66            | "<tag>" token_decl.1
-   67            | token_decls "<tag>" token_decl.1
+   66 nterm_decls: token_decls
 
-   68 token_decl.1: token_decl
-   69             | token_decl.1 token_decl
+   67 token_decls: token_decl.1
+   68            | "<tag>" token_decl.1
+   69            | token_decls "<tag>" token_decl.1
 
-   70 token_decl: id int.opt string_as_id.opt
+   70 token_decl.1: token_decl
+   71             | token_decl.1 token_decl
 
-   71 int.opt: %empty
-   72        | "integer"
+   72 token_decl: id int.opt alias
 
-   73 token_decls_for_prec: token_decl_for_prec.1
-   74                     | "<tag>" token_decl_for_prec.1
-   75                     | token_decls_for_prec "<tag>" token_decl_for_prec.1
+   73 int.opt: %empty
+   74        | "integer literal"
 
-   76 token_decl_for_prec.1: token_decl_for_prec
-   77                      | token_decl_for_prec.1 token_decl_for_prec
+   75 alias: %empty
+   76      | string_as_id
+   77      | "translatable string"
 
-   78 token_decl_for_prec: id int.opt
-   79                    | string_as_id
+   78 token_decls_for_prec: token_decl_for_prec.1
+   79                     | "<tag>" token_decl_for_prec.1
+   80                     | token_decls_for_prec "<tag>" token_decl_for_prec.1
 
-   80 symbol_decls: symbol_decl.1
-   81             | "<tag>" symbol_decl.1
-   82             | symbol_decls "<tag>" symbol_decl.1
+   81 token_decl_for_prec.1: token_decl_for_prec
+   82                      | token_decl_for_prec.1 token_decl_for_prec
 
-   83 symbol_decl.1: symbol
-   84              | symbol_decl.1 symbol
+   83 token_decl_for_prec: id int.opt
+   84                    | string_as_id
 
-   85 grammar: rules_or_grammar_declaration
-   86        | grammar rules_or_grammar_declaration
+   85 symbol_decls: symbols.1
+   86             | "<tag>" symbols.1
+   87             | symbol_decls "<tag>" symbols.1
 
-   87 rules_or_grammar_declaration: rules
-   88                             | grammar_declaration ";"
-   89                             | error ";"
+   88 symbols.1: symbol
+   89          | symbols.1 symbol
 
-   90 $@4: %empty
+   90 grammar: rules_or_grammar_declaration
+   91        | grammar rules_or_grammar_declaration
 
-   91 rules: id_colon named_ref.opt $@4 ":" rhses.1
+   92 rules_or_grammar_declaration: rules
+   93                             | grammar_declaration ";"
+   94                             | error ";"
 
-   92 rhses.1: rhs
-   93        | rhses.1 "|" rhs
-   94        | rhses.1 ";"
+   95 $@5: %empty
 
-   95 rhs: %empty
-   96    | rhs symbol named_ref.opt
-   97    | rhs tag.opt "{...}" named_ref.opt
-   98    | rhs "%?{...}"
-   99    | rhs "%empty"
-  100    | rhs "%prec" symbol
-  101    | rhs "%dprec" "integer"
-  102    | rhs "%merge" "<tag>"
-  103    | rhs "%expect" "integer"
-  104    | rhs "%expect-rr" "integer"
+   96 rules: id_colon named_ref.opt $@5 ":" rhses.1
 
-  105 named_ref.opt: %empty
-  106              | "[identifier]"
+   97 rhses.1: rhs
+   98        | rhses.1 "|" rhs
+   99        | rhses.1 ";"
 
-  107 variable: "identifier"
+  100 rhs: %empty
+  101    | rhs symbol named_ref.opt
+  102    | rhs tag.opt "{...}" named_ref.opt
+  103    | rhs "%?{...}"
+  104    | rhs "%empty"
+  105    | rhs "%prec" symbol
+  106    | rhs "%dprec" "integer literal"
+  107    | rhs "%merge" "<tag>"
+  108    | rhs "%expect" "integer literal"
+  109    | rhs "%expect-rr" "integer literal"
 
-  108 value: %empty
-  109      | "identifier"
-  110      | "string"
-  111      | "{...}"
+  110 named_ref.opt: %empty
+  111              | "[identifier]"
 
-  112 id: "identifier"
-  113   | "character literal"
+  112 variable: "identifier"
 
-  114 id_colon: "identifier:"
+  113 value: %empty
+  114      | "identifier"
+  115      | "string"
+  116      | "{...}"
 
-  115 symbol: id
-  116       | string_as_id
+  117 id: "identifier"
+  118   | "character literal"
 
-  117 string_as_id: "string"
+  119 id_colon: "identifier:"
 
-  118 string_as_id.opt: %empty
-  119                 | string_as_id
+  120 symbol: id
+  121       | string_as_id
 
-  120 epilogue.opt: %empty
-  121             | "%%" "epilogue"
+  122 string_as_id: "string"
+
+  123 epilogue.opt: %empty
+  124             | "%%" "epilogue"
 
 
 Terminals, with rules where they appear
 
-    "end of file" (0) 0
-    error (256) 29 89
-    "string" <char*> (258) 9 13 16 17 20 24 25 110 117
-    "%token" (259) 48
-    "%nterm" (260) 46
-    "%type" (261) 49
-    "%destructor" (262) 40
-    "%printer" (263) 41
-    "%left" (264) 51
-    "%right" (265) 52
-    "%nonassoc" (266) 53
-    "%precedence" (267) 54
-    "%prec" (268) 100
-    "%dprec" (269) 101
-    "%merge" (270) 102
-    "%code" (271) 38 39
-    "%default-prec" (272) 36
-    "%define" (273) 7
-    "%defines" (274) 8 9
-    "%error-verbose" <uniqstr> (275) 10
-    "%expect" (276) 11 103
-    "%expect-rr" (277) 12 104
-    "%<flag>" <uniqstr> (278) 6
-    "%file-prefix" <uniqstr> (279) 13
-    "%glr-parser" (280) 14
-    "%initial-action" (281) 15
-    "%language" (282) 16
-    "%name-prefix" <uniqstr> (283) 17
-    "%no-default-prec" (284) 37
-    "%no-lines" (285) 18
-    "%nondeterministic-parser" (286) 19
-    "%output" (287) 20
-    "%pure-parser" <uniqstr> (288) 23
-    "%require" (289) 24
-    "%skeleton" (290) 25
-    "%start" (291) 34
-    "%token-table" (292) 26
-    "%verbose" (293) 27
-    "%yacc" (294) 28
-    "{...}" <char*> (295) 15 31 32 35 38 39 44 97 111
-    "%?{...}" <char*> (296) 98
-    "[identifier]" <uniqstr> (297) 106
-    "character literal" <unsigned char> (298) 113
-    ":" (299) 91
-    "epilogue" <char*> (300) 121
-    "=" (301)
-    "identifier" <uniqstr> (302) 39 43 107 109 112
-    "identifier:" <uniqstr> (303) 114
-    "%%" (304) 1 121
-    "|" (305) 93
-    "%{...%}" <char*> (306) 5
-    ";" (307) 29 30 88 89 94
-    "<tag>" <uniqstr> (308) 56 61 66 67 74 75 81 82 102
-    "<*>" (309) 62
-    "<>" (310) 63
-    "integer" <int> (311) 11 12 72 101 103 104
-    "%param" <param_type> (312) 22
-    "%union" (313) 44
-    "%empty" (314) 99
+    $end (0) 0
+    error (256) 28 94
+    "string" <char*> (258) 12 15 16 19 23 24 56 115 122
+    "translatable string" <char*> (259) 77
+    "%token" (260) 47
+    "%nterm" (261) 45
+    "%type" (262) 49
+    "%destructor" (263) 39
+    "%printer" (264) 40
+    "%left" (265) 51
+    "%right" (266) 52
+    "%nonassoc" (267) 53
+    "%precedence" (268) 54
+    "%prec" (269) 105
+    "%dprec" (270) 106
+    "%merge" (271) 107
+    "%code" (272) 37 38
+    "%default-prec" (273) 35
+    "%define" (274) 7
+    "%error-verbose" <uniqstr> (275) 9
+    "%expect" (276) 10 108
+    "%expect-rr" (277) 11 109
+    "%file-prefix" <uniqstr> (278) 12
+    "%<flag>" <uniqstr> (279) 6
+    "%glr-parser" (280) 13
+    "%header" (281) 8
+    "%initial-action" (282) 14
+    "%language" (283) 15
+    "%name-prefix" <uniqstr> (284) 16
+    "%no-default-prec" (285) 36
+    "%no-lines" (286) 17
+    "%nondeterministic-parser" (287) 18
+    "%output" (288) 19
+    "%pure-parser" <uniqstr> (289) 22
+    "%require" (290) 23
+    "%skeleton" (291) 24
+    "%start" (292) 33
+    "%token-table" (293) 25
+    "%verbose" (294) 26
+    "%yacc" (295) 27
+    "{...}" <char*> (296) 14 30 31 34 37 38 43 102 116
+    "%?{...}" <char*> (297) 103
+    "[identifier]" <uniqstr> (298) 111
+    "character literal" <unsigned char> (299) 118
+    ":" (300) 96
+    "epilogue" <char*> (301) 124
+    "=" (302)
+    "identifier" <uniqstr> (303) 38 42 112 114 117
+    "identifier:" <uniqstr> (304) 119
+    "%%" (305) 1 124
+    "|" (306) 98
+    "%{...%}" <char*> (307) 5
+    ";" (308) 28 29 93 94 99
+    "<tag>" <uniqstr> (309) 58 63 68 69 79 80 86 87 107
+    "<*>" (310) 64
+    "<>" (311) 65
+    "integer literal" <int> (312) 10 11 74 106 108 109
+    "%param" <param_type> (313) 21
+    "%union" (314) 43
+    "%empty" (315) 104
 
 
 Nonterminals, with rules where they appear
 
-    $accept (60)
+    $accept (61)
         on left: 0
-    input (61)
+    input (62)
         on left: 1
         on right: 0
-    prologue_declarations (62)
+    prologue_declarations (63)
         on left: 2 3
         on right: 1 3
-    prologue_declaration (63)
-        on left: 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25 26 27 28 29 30
+    prologue_declaration (64)
+        on left: 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 21 22 23 24 25 26 27 28 29
         on right: 3
-    $@1 (64)
-        on left: 21
-        on right: 22
-    params (65)
-        on left: 31 32
-        on right: 22 31
-    grammar_declaration (66)
-        on left: 33 34 35 36 37 38 39 44
-        on right: 4 88
-    code_props_type <code_props_type> (67)
-        on left: 40 41
-        on right: 35
-    union_name (68)
-        on left: 42 43
-        on right: 44
-    symbol_declaration (69)
-        on left: 46 48 49 50
-        on right: 33
-    $@2 (70)
-        on left: 45
-        on right: 46
-    $@3 (71)
-        on left: 47
-        on right: 48
-    precedence_declarator <assoc> (72)
+    $@1 (65)
+        on left: 20
+        on right: 21
+    params (66)
+        on left: 30 31
+        on right: 21 30
+    grammar_declaration (67)
+        on left: 32 33 34 35 36 37 38 43
+        on right: 4 93
+    code_props_type <code_props_type> (68)
+        on left: 39 40
+        on right: 34
+    union_name (69)
+        on left: 41 42
+        on right: 43
+    symbol_declaration (70)
+        on left: 45 47 49 50
+        on right: 32
+    $@2 (71)
+        on left: 44
+        on right: 45
+    $@3 (72)
+        on left: 46
+        on right: 47
+    $@4 (73)
+        on left: 48
+        on right: 49
+    precedence_declarator <assoc> (74)
         on left: 51 52 53 54
         on right: 50
-    tag.opt <uniqstr> (73)
+    string.opt <char*> (75)
         on left: 55 56
-        on right: 97
-    generic_symlist <symbol_list*> (74)
+        on right: 8
+    tag.opt <uniqstr> (76)
         on left: 57 58
-        on right: 35 58
-    generic_symlist_item <symbol_list*> (75)
+        on right: 102
+    generic_symlist <symbol_list*> (77)
         on left: 59 60
-        on right: 57 58
-    tag <uniqstr> (76)
-        on left: 61 62 63
-        on right: 60
-    nterm_decls <symbol_list*> (77)
-        on left: 64
-        on right: 46
-    token_decls <symbol_list*> (78)
-        on left: 65 66 67
-        on right: 48 64 67
-    token_decl.1 <symbol_list*> (79)
-        on left: 68 69
-        on right: 65 66 67 69
-    token_decl <symbol*> (80)
-        on left: 70
-        on right: 68 69
-    int.opt <int> (81)
-        on left: 71 72
-        on right: 70 78
-    token_decls_for_prec <symbol_list*> (82)
-        on left: 73 74 75
-        on right: 50 75
-    token_decl_for_prec.1 <symbol_list*> (83)
-        on left: 76 77
-        on right: 73 74 75 77
-    token_decl_for_prec <symbol*> (84)
-        on left: 78 79
-        on right: 76 77
-    symbol_decls <symbol_list*> (85)
-        on left: 80 81 82
-        on right: 49 82
-    symbol_decl.1 <symbol_list*> (86)
+        on right: 34 60
+    generic_symlist_item <symbol_list*> (78)
+        on left: 61 62
+        on right: 59 60
+    tag <uniqstr> (79)
+        on left: 63 64 65
+        on right: 62
+    nterm_decls <symbol_list*> (80)
+        on left: 66
+        on right: 45
+    token_decls <symbol_list*> (81)
+        on left: 67 68 69
+        on right: 47 66 69
+    token_decl.1 <symbol_list*> (82)
+        on left: 70 71
+        on right: 67 68 69 71
+    token_decl <symbol*> (83)
+        on left: 72
+        on right: 70 71
+    int.opt <int> (84)
+        on left: 73 74
+        on right: 72 83
+    alias <symbol*> (85)
+        on left: 75 76 77
+        on right: 72
+    token_decls_for_prec <symbol_list*> (86)
+        on left: 78 79 80
+        on right: 50 80
+    token_decl_for_prec.1 <symbol_list*> (87)
+        on left: 81 82
+        on right: 78 79 80 82
+    token_decl_for_prec <symbol*> (88)
         on left: 83 84
-        on right: 80 81 82 84
-    grammar (87)
-        on left: 85 86
-        on right: 1 86
-    rules_or_grammar_declaration (88)
-        on left: 87 88 89
-        on right: 85 86
-    rules (89)
-        on left: 91
-        on right: 87
-    $@4 (90)
-        on left: 90
-        on right: 91
-    rhses.1 (91)
+        on right: 81 82
+    symbol_decls <symbol_list*> (89)
+        on left: 85 86 87
+        on right: 49 87
+    symbols.1 <symbol_list*> (90)
+        on left: 88 89
+        on right: 33 85 86 87 89
+    grammar (91)
+        on left: 90 91
+        on right: 1 91
+    rules_or_grammar_declaration (92)
         on left: 92 93 94
-        on right: 91 93 94
-    rhs (92)
-        on left: 95 96 97 98 99 100 101 102 103 104
-        on right: 92 93 96 97 98 99 100 101 102 103 104
-    named_ref.opt <named_ref*> (93)
-        on left: 105 106
-        on right: 91 96 97
-    variable <uniqstr> (94)
-        on left: 107
+        on right: 90 91
+    rules (93)
+        on left: 96
+        on right: 92
+    $@5 (94)
+        on left: 95
+        on right: 96
+    rhses.1 (95)
+        on left: 97 98 99
+        on right: 96 98 99
+    rhs (96)
+        on left: 100 101 102 103 104 105 106 107 108 109
+        on right: 97 98 101 102 103 104 105 106 107 108 109
+    named_ref.opt <named_ref*> (97)
+        on left: 110 111
+        on right: 96 101 102
+    variable <uniqstr> (98)
+        on left: 112
         on right: 7
-    value <value_type> (95)
-        on left: 108 109 110 111
+    value <value_type> (99)
+        on left: 113 114 115 116
         on right: 7
-    id <symbol*> (96)
-        on left: 112 113
-        on right: 70 78 115
-    id_colon <symbol*> (97)
-        on left: 114
-        on right: 91
-    symbol <symbol*> (98)
-        on left: 115 116
-        on right: 34 59 83 84 96 100
-    string_as_id <symbol*> (99)
-        on left: 117
-        on right: 79 116 119
-    string_as_id.opt <symbol*> (100)
-        on left: 118 119
-        on right: 70
-    epilogue.opt (101)
+    id <symbol*> (100)
+        on left: 117 118
+        on right: 72 83 120
+    id_colon <symbol*> (101)
+        on left: 119
+        on right: 96
+    symbol <symbol*> (102)
         on left: 120 121
+        on right: 61 88 89 101 105
+    string_as_id <symbol*> (103)
+        on left: 122
+        on right: 76 84 121
+    epilogue.opt (104)
+        on left: 123 124
         on right: 1
 
 
 State 0
 
-    0 $accept: . input "end of file"
+    0 $accept: . input $end
     1 input: . prologue_declarations "%%" grammar epilogue.opt
-    2 prologue_declarations: . %empty
+    2 prologue_declarations: %empty .
     3                      | . prologue_declarations prologue_declaration
 
     $default  reduce using rule 2 (prologue_declarations)
@@ -380,9 +393,9 @@
 
 State 1
 
-    0 $accept: input . "end of file"
+    0 $accept: input . $end
 
-    "end of file"  shift, and go to state 3
+    $end  shift, and go to state 3
 
 
 State 2
@@ -393,41 +406,40 @@
     5                     | . "%{...%}"
     6                     | . "%<flag>"
     7                     | . "%define" variable value
-    8                     | . "%defines"
-    9                     | . "%defines" "string"
-   10                     | . "%error-verbose"
-   11                     | . "%expect" "integer"
-   12                     | . "%expect-rr" "integer"
-   13                     | . "%file-prefix" "string"
-   14                     | . "%glr-parser"
-   15                     | . "%initial-action" "{...}"
-   16                     | . "%language" "string"
-   17                     | . "%name-prefix" "string"
-   18                     | . "%no-lines"
-   19                     | . "%nondeterministic-parser"
-   20                     | . "%output" "string"
-   22                     | . "%param" $@1 params
-   23                     | . "%pure-parser"
-   24                     | . "%require" "string"
-   25                     | . "%skeleton" "string"
-   26                     | . "%token-table"
-   27                     | . "%verbose"
-   28                     | . "%yacc"
-   29                     | . error ";"
-   30                     | . ";"
-   33 grammar_declaration: . symbol_declaration
-   34                    | . "%start" symbol
-   35                    | . code_props_type "{...}" generic_symlist
-   36                    | . "%default-prec"
-   37                    | . "%no-default-prec"
-   38                    | . "%code" "{...}"
-   39                    | . "%code" "identifier" "{...}"
-   40 code_props_type: . "%destructor"
-   41                | . "%printer"
-   44 grammar_declaration: . "%union" union_name "{...}"
-   46 symbol_declaration: . "%nterm" $@2 nterm_decls
-   48                   | . "%token" $@3 token_decls
-   49                   | . "%type" symbol_decls
+    8                     | . "%header" string.opt
+    9                     | . "%error-verbose"
+   10                     | . "%expect" "integer literal"
+   11                     | . "%expect-rr" "integer literal"
+   12                     | . "%file-prefix" "string"
+   13                     | . "%glr-parser"
+   14                     | . "%initial-action" "{...}"
+   15                     | . "%language" "string"
+   16                     | . "%name-prefix" "string"
+   17                     | . "%no-lines"
+   18                     | . "%nondeterministic-parser"
+   19                     | . "%output" "string"
+   21                     | . "%param" $@1 params
+   22                     | . "%pure-parser"
+   23                     | . "%require" "string"
+   24                     | . "%skeleton" "string"
+   25                     | . "%token-table"
+   26                     | . "%verbose"
+   27                     | . "%yacc"
+   28                     | . error ";"
+   29                     | . ";"
+   32 grammar_declaration: . symbol_declaration
+   33                    | . "%start" symbols.1
+   34                    | . code_props_type "{...}" generic_symlist
+   35                    | . "%default-prec"
+   36                    | . "%no-default-prec"
+   37                    | . "%code" "{...}"
+   38                    | . "%code" "identifier" "{...}"
+   39 code_props_type: . "%destructor"
+   40                | . "%printer"
+   43 grammar_declaration: . "%union" union_name "{...}"
+   45 symbol_declaration: . "%nterm" $@2 nterm_decls
+   47                   | . "%token" $@3 token_decls
+   49                   | . "%type" $@4 symbol_decls
    50                   | . precedence_declarator token_decls_for_prec
    51 precedence_declarator: . "%left"
    52                      | . "%right"
@@ -447,13 +459,13 @@
     "%code"                     shift, and go to state 14
     "%default-prec"             shift, and go to state 15
     "%define"                   shift, and go to state 16
-    "%defines"                  shift, and go to state 17
-    "%error-verbose"            shift, and go to state 18
-    "%expect"                   shift, and go to state 19
-    "%expect-rr"                shift, and go to state 20
+    "%error-verbose"            shift, and go to state 17
+    "%expect"                   shift, and go to state 18
+    "%expect-rr"                shift, and go to state 19
+    "%file-prefix"              shift, and go to state 20
     "%<flag>"                   shift, and go to state 21
-    "%file-prefix"              shift, and go to state 22
-    "%glr-parser"               shift, and go to state 23
+    "%glr-parser"               shift, and go to state 22
+    "%header"                   shift, and go to state 23
     "%initial-action"           shift, and go to state 24
     "%language"                 shift, and go to state 25
     "%name-prefix"              shift, and go to state 26
@@ -483,76 +495,60 @@
 
 State 3
 
-    0 $accept: input "end of file" .
+    0 $accept: input $end .
 
     $default  accept
 
 
 State 4
 
-   29 prologue_declaration: error . ";"
+   28 prologue_declaration: error . ";"
 
     ";"  shift, and go to state 48
 
 
 State 5
 
-   47 $@3: . %empty
-   48 symbol_declaration: "%token" . $@3 token_decls
+   46 $@3: %empty .
+   47 symbol_declaration: "%token" . $@3 token_decls
 
-    $default  reduce using rule 47 ($@3)
+    $default  reduce using rule 46 ($@3)
 
     $@3  go to state 49
 
 
 State 6
 
-   45 $@2: . %empty
-   46 symbol_declaration: "%nterm" . $@2 nterm_decls
+   44 $@2: %empty .
+   45 symbol_declaration: "%nterm" . $@2 nterm_decls
 
-    $default  reduce using rule 45 ($@2)
+    $default  reduce using rule 44 ($@2)
 
     $@2  go to state 50
 
 
 State 7
 
-   49 symbol_declaration: "%type" . symbol_decls
-   80 symbol_decls: . symbol_decl.1
-   81             | . "<tag>" symbol_decl.1
-   82             | . symbol_decls "<tag>" symbol_decl.1
-   83 symbol_decl.1: . symbol
-   84              | . symbol_decl.1 symbol
-  112 id: . "identifier"
-  113   | . "character literal"
-  115 symbol: . id
-  116       | . string_as_id
-  117 string_as_id: . "string"
+   48 $@4: %empty .
+   49 symbol_declaration: "%type" . $@4 symbol_decls
 
-    "string"             shift, and go to state 51
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-    "<tag>"              shift, and go to state 54
+    $default  reduce using rule 48 ($@4)
 
-    symbol_decls   go to state 55
-    symbol_decl.1  go to state 56
-    id             go to state 57
-    symbol         go to state 58
-    string_as_id   go to state 59
+    $@4  go to state 51
 
 
 State 8
 
-   40 code_props_type: "%destructor" .
+   39 code_props_type: "%destructor" .
 
-    $default  reduce using rule 40 (code_props_type)
+    $default  reduce using rule 39 (code_props_type)
 
 
 State 9
 
-   41 code_props_type: "%printer" .
+   40 code_props_type: "%printer" .
 
-    $default  reduce using rule 41 (code_props_type)
+    $default  reduce using rule 40 (code_props_type)
 
 
 State 10
@@ -585,59 +581,56 @@
 
 State 14
 
-   38 grammar_declaration: "%code" . "{...}"
-   39                    | "%code" . "identifier" "{...}"
+   37 grammar_declaration: "%code" . "{...}"
+   38                    | "%code" . "identifier" "{...}"
 
-    "{...}"       shift, and go to state 60
-    "identifier"  shift, and go to state 61
+    "{...}"       shift, and go to state 52
+    "identifier"  shift, and go to state 53
 
 
 State 15
 
-   36 grammar_declaration: "%default-prec" .
+   35 grammar_declaration: "%default-prec" .
 
-    $default  reduce using rule 36 (grammar_declaration)
+    $default  reduce using rule 35 (grammar_declaration)
 
 
 State 16
 
     7 prologue_declaration: "%define" . variable value
-  107 variable: . "identifier"
+  112 variable: . "identifier"
 
-    "identifier"  shift, and go to state 62
+    "identifier"  shift, and go to state 54
 
-    variable  go to state 63
+    variable  go to state 55
 
 
 State 17
 
-    8 prologue_declaration: "%defines" .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
-    9                     | "%defines" . "string"
+    9 prologue_declaration: "%error-verbose" .
 
-    "string"  shift, and go to state 64
-
-    $default  reduce using rule 8 (prologue_declaration)
+    $default  reduce using rule 9 (prologue_declaration)
 
 
 State 18
 
-   10 prologue_declaration: "%error-verbose" .
+   10 prologue_declaration: "%expect" . "integer literal"
 
-    $default  reduce using rule 10 (prologue_declaration)
+    "integer literal"  shift, and go to state 56
 
 
 State 19
 
-   11 prologue_declaration: "%expect" . "integer"
+   11 prologue_declaration: "%expect-rr" . "integer literal"
 
-    "integer"  shift, and go to state 65
+    "integer literal"  shift, and go to state 57
 
 
 State 20
 
-   12 prologue_declaration: "%expect-rr" . "integer"
+   12 prologue_declaration: "%file-prefix" . "string"
 
-    "integer"  shift, and go to state 66
+    "string"  shift, and go to state 58
 
 
 State 21
@@ -649,157 +642,166 @@
 
 State 22
 
-   13 prologue_declaration: "%file-prefix" . "string"
+   13 prologue_declaration: "%glr-parser" .
 
-    "string"  shift, and go to state 67
+    $default  reduce using rule 13 (prologue_declaration)
 
 
 State 23
 
-   14 prologue_declaration: "%glr-parser" .
+    8 prologue_declaration: "%header" . string.opt
+   55 string.opt: %empty .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
+   56           | . "string"
 
-    $default  reduce using rule 14 (prologue_declaration)
+    "string"  shift, and go to state 59
+
+    $default  reduce using rule 55 (string.opt)
+
+    string.opt  go to state 60
 
 
 State 24
 
-   15 prologue_declaration: "%initial-action" . "{...}"
+   14 prologue_declaration: "%initial-action" . "{...}"
 
-    "{...}"  shift, and go to state 68
+    "{...}"  shift, and go to state 61
 
 
 State 25
 
-   16 prologue_declaration: "%language" . "string"
+   15 prologue_declaration: "%language" . "string"
 
-    "string"  shift, and go to state 69
+    "string"  shift, and go to state 62
 
 
 State 26
 
-   17 prologue_declaration: "%name-prefix" . "string"
+   16 prologue_declaration: "%name-prefix" . "string"
 
-    "string"  shift, and go to state 70
+    "string"  shift, and go to state 63
 
 
 State 27
 
-   37 grammar_declaration: "%no-default-prec" .
+   36 grammar_declaration: "%no-default-prec" .
 
-    $default  reduce using rule 37 (grammar_declaration)
+    $default  reduce using rule 36 (grammar_declaration)
 
 
 State 28
 
-   18 prologue_declaration: "%no-lines" .
+   17 prologue_declaration: "%no-lines" .
 
-    $default  reduce using rule 18 (prologue_declaration)
+    $default  reduce using rule 17 (prologue_declaration)
 
 
 State 29
 
-   19 prologue_declaration: "%nondeterministic-parser" .
+   18 prologue_declaration: "%nondeterministic-parser" .
 
-    $default  reduce using rule 19 (prologue_declaration)
+    $default  reduce using rule 18 (prologue_declaration)
 
 
 State 30
 
-   20 prologue_declaration: "%output" . "string"
+   19 prologue_declaration: "%output" . "string"
 
-    "string"  shift, and go to state 71
+    "string"  shift, and go to state 64
 
 
 State 31
 
-   23 prologue_declaration: "%pure-parser" .
+   22 prologue_declaration: "%pure-parser" .
 
-    $default  reduce using rule 23 (prologue_declaration)
+    $default  reduce using rule 22 (prologue_declaration)
 
 
 State 32
 
-   24 prologue_declaration: "%require" . "string"
+   23 prologue_declaration: "%require" . "string"
 
-    "string"  shift, and go to state 72
+    "string"  shift, and go to state 65
 
 
 State 33
 
-   25 prologue_declaration: "%skeleton" . "string"
+   24 prologue_declaration: "%skeleton" . "string"
 
-    "string"  shift, and go to state 73
+    "string"  shift, and go to state 66
 
 
 State 34
 
-   34 grammar_declaration: "%start" . symbol
-  112 id: . "identifier"
-  113   | . "character literal"
-  115 symbol: . id
-  116       | . string_as_id
-  117 string_as_id: . "string"
+   33 grammar_declaration: "%start" . symbols.1
+   88 symbols.1: . symbol
+   89          | . symbols.1 symbol
+  117 id: . "identifier"
+  118   | . "character literal"
+  120 symbol: . id
+  121       | . string_as_id
+  122 string_as_id: . "string"
 
-    "string"             shift, and go to state 51
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
 
-    id            go to state 57
-    symbol        go to state 74
-    string_as_id  go to state 59
+    symbols.1     go to state 70
+    id            go to state 71
+    symbol        go to state 72
+    string_as_id  go to state 73
 
 
 State 35
 
-   26 prologue_declaration: "%token-table" .
+   25 prologue_declaration: "%token-table" .
 
-    $default  reduce using rule 26 (prologue_declaration)
+    $default  reduce using rule 25 (prologue_declaration)
 
 
 State 36
 
-   27 prologue_declaration: "%verbose" .
+   26 prologue_declaration: "%verbose" .
 
-    $default  reduce using rule 27 (prologue_declaration)
+    $default  reduce using rule 26 (prologue_declaration)
 
 
 State 37
 
-   28 prologue_declaration: "%yacc" .
+   27 prologue_declaration: "%yacc" .
 
-    $default  reduce using rule 28 (prologue_declaration)
+    $default  reduce using rule 27 (prologue_declaration)
 
 
 State 38
 
     1 input: prologue_declarations "%%" . grammar epilogue.opt
-   33 grammar_declaration: . symbol_declaration
-   34                    | . "%start" symbol
-   35                    | . code_props_type "{...}" generic_symlist
-   36                    | . "%default-prec"
-   37                    | . "%no-default-prec"
-   38                    | . "%code" "{...}"
-   39                    | . "%code" "identifier" "{...}"
-   40 code_props_type: . "%destructor"
-   41                | . "%printer"
-   44 grammar_declaration: . "%union" union_name "{...}"
-   46 symbol_declaration: . "%nterm" $@2 nterm_decls
-   48                   | . "%token" $@3 token_decls
-   49                   | . "%type" symbol_decls
+   32 grammar_declaration: . symbol_declaration
+   33                    | . "%start" symbols.1
+   34                    | . code_props_type "{...}" generic_symlist
+   35                    | . "%default-prec"
+   36                    | . "%no-default-prec"
+   37                    | . "%code" "{...}"
+   38                    | . "%code" "identifier" "{...}"
+   39 code_props_type: . "%destructor"
+   40                | . "%printer"
+   43 grammar_declaration: . "%union" union_name "{...}"
+   45 symbol_declaration: . "%nterm" $@2 nterm_decls
+   47                   | . "%token" $@3 token_decls
+   49                   | . "%type" $@4 symbol_decls
    50                   | . precedence_declarator token_decls_for_prec
    51 precedence_declarator: . "%left"
    52                      | . "%right"
    53                      | . "%nonassoc"
    54                      | . "%precedence"
-   85 grammar: . rules_or_grammar_declaration
-   86        | . grammar rules_or_grammar_declaration
-   87 rules_or_grammar_declaration: . rules
-   88                             | . grammar_declaration ";"
-   89                             | . error ";"
-   91 rules: . id_colon named_ref.opt $@4 ":" rhses.1
-  114 id_colon: . "identifier:"
+   90 grammar: . rules_or_grammar_declaration
+   91        | . grammar rules_or_grammar_declaration
+   92 rules_or_grammar_declaration: . rules
+   93                             | . grammar_declaration ";"
+   94                             | . error ";"
+   96 rules: . id_colon named_ref.opt $@5 ":" rhses.1
+  119 id_colon: . "identifier:"
 
-    error               shift, and go to state 75
+    error               shift, and go to state 74
     "%token"            shift, and go to state 5
     "%nterm"            shift, and go to state 6
     "%type"             shift, and go to state 7
@@ -813,17 +815,17 @@
     "%default-prec"     shift, and go to state 15
     "%no-default-prec"  shift, and go to state 27
     "%start"            shift, and go to state 34
-    "identifier:"       shift, and go to state 76
+    "identifier:"       shift, and go to state 75
     "%union"            shift, and go to state 42
 
-    grammar_declaration           go to state 77
+    grammar_declaration           go to state 76
     code_props_type               go to state 45
     symbol_declaration            go to state 46
     precedence_declarator         go to state 47
-    grammar                       go to state 78
-    rules_or_grammar_declaration  go to state 79
-    rules                         go to state 80
-    id_colon                      go to state 81
+    grammar                       go to state 77
+    rules_or_grammar_declaration  go to state 78
+    rules                         go to state 79
+    id_colon                      go to state 80
 
 
 State 39
@@ -835,32 +837,32 @@
 
 State 40
 
-   30 prologue_declaration: ";" .
+   29 prologue_declaration: ";" .
 
-    $default  reduce using rule 30 (prologue_declaration)
+    $default  reduce using rule 29 (prologue_declaration)
 
 
 State 41
 
-   21 $@1: . %empty
-   22 prologue_declaration: "%param" . $@1 params
+   20 $@1: %empty .
+   21 prologue_declaration: "%param" . $@1 params
 
-    $default  reduce using rule 21 ($@1)
+    $default  reduce using rule 20 ($@1)
 
-    $@1  go to state 82
+    $@1  go to state 81
 
 
 State 42
 
-   42 union_name: . %empty  ["{...}"]
-   43           | . "identifier"
-   44 grammar_declaration: "%union" . union_name "{...}"
+   41 union_name: %empty .  ["{...}"]
+   42           | . "identifier"
+   43 grammar_declaration: "%union" . union_name "{...}"
 
-    "identifier"  shift, and go to state 83
+    "identifier"  shift, and go to state 82
 
-    $default  reduce using rule 42 (union_name)
+    $default  reduce using rule 41 (union_name)
 
-    union_name  go to state 84
+    union_name  go to state 83
 
 
 State 43
@@ -879,358 +881,353 @@
 
 State 45
 
-   35 grammar_declaration: code_props_type . "{...}" generic_symlist
+   34 grammar_declaration: code_props_type . "{...}" generic_symlist
 
-    "{...}"  shift, and go to state 85
+    "{...}"  shift, and go to state 84
 
 
 State 46
 
-   33 grammar_declaration: symbol_declaration .
+   32 grammar_declaration: symbol_declaration .
 
-    $default  reduce using rule 33 (grammar_declaration)
+    $default  reduce using rule 32 (grammar_declaration)
 
 
 State 47
 
    50 symbol_declaration: precedence_declarator . token_decls_for_prec
-   73 token_decls_for_prec: . token_decl_for_prec.1
-   74                     | . "<tag>" token_decl_for_prec.1
-   75                     | . token_decls_for_prec "<tag>" token_decl_for_prec.1
-   76 token_decl_for_prec.1: . token_decl_for_prec
-   77                      | . token_decl_for_prec.1 token_decl_for_prec
-   78 token_decl_for_prec: . id int.opt
-   79                    | . string_as_id
-  112 id: . "identifier"
-  113   | . "character literal"
-  117 string_as_id: . "string"
+   78 token_decls_for_prec: . token_decl_for_prec.1
+   79                     | . "<tag>" token_decl_for_prec.1
+   80                     | . token_decls_for_prec "<tag>" token_decl_for_prec.1
+   81 token_decl_for_prec.1: . token_decl_for_prec
+   82                      | . token_decl_for_prec.1 token_decl_for_prec
+   83 token_decl_for_prec: . id int.opt
+   84                    | . string_as_id
+  117 id: . "identifier"
+  118   | . "character literal"
+  122 string_as_id: . "string"
 
-    "string"             shift, and go to state 51
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-    "<tag>"              shift, and go to state 86
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+    "<tag>"              shift, and go to state 85
 
-    token_decls_for_prec   go to state 87
-    token_decl_for_prec.1  go to state 88
-    token_decl_for_prec    go to state 89
-    id                     go to state 90
-    string_as_id           go to state 91
+    token_decls_for_prec   go to state 86
+    token_decl_for_prec.1  go to state 87
+    token_decl_for_prec    go to state 88
+    id                     go to state 89
+    string_as_id           go to state 90
 
 
 State 48
 
-   29 prologue_declaration: error ";" .
+   28 prologue_declaration: error ";" .
 
-    $default  reduce using rule 29 (prologue_declaration)
+    $default  reduce using rule 28 (prologue_declaration)
 
 
 State 49
 
-   48 symbol_declaration: "%token" $@3 . token_decls
-   65 token_decls: . token_decl.1
-   66            | . "<tag>" token_decl.1
-   67            | . token_decls "<tag>" token_decl.1
-   68 token_decl.1: . token_decl
-   69             | . token_decl.1 token_decl
-   70 token_decl: . id int.opt string_as_id.opt
-  112 id: . "identifier"
-  113   | . "character literal"
+   47 symbol_declaration: "%token" $@3 . token_decls
+   67 token_decls: . token_decl.1
+   68            | . "<tag>" token_decl.1
+   69            | . token_decls "<tag>" token_decl.1
+   70 token_decl.1: . token_decl
+   71             | . token_decl.1 token_decl
+   72 token_decl: . id int.opt alias
+  117 id: . "identifier"
+  118   | . "character literal"
 
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-    "<tag>"              shift, and go to state 92
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+    "<tag>"              shift, and go to state 91
 
-    token_decls   go to state 93
-    token_decl.1  go to state 94
-    token_decl    go to state 95
-    id            go to state 96
+    token_decls   go to state 92
+    token_decl.1  go to state 93
+    token_decl    go to state 94
+    id            go to state 95
 
 
 State 50
 
-   46 symbol_declaration: "%nterm" $@2 . nterm_decls
-   64 nterm_decls: . token_decls
-   65 token_decls: . token_decl.1
-   66            | . "<tag>" token_decl.1
-   67            | . token_decls "<tag>" token_decl.1
-   68 token_decl.1: . token_decl
-   69             | . token_decl.1 token_decl
-   70 token_decl: . id int.opt string_as_id.opt
-  112 id: . "identifier"
-  113   | . "character literal"
+   45 symbol_declaration: "%nterm" $@2 . nterm_decls
+   66 nterm_decls: . token_decls
+   67 token_decls: . token_decl.1
+   68            | . "<tag>" token_decl.1
+   69            | . token_decls "<tag>" token_decl.1
+   70 token_decl.1: . token_decl
+   71             | . token_decl.1 token_decl
+   72 token_decl: . id int.opt alias
+  117 id: . "identifier"
+  118   | . "character literal"
 
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-    "<tag>"              shift, and go to state 92
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+    "<tag>"              shift, and go to state 91
 
-    nterm_decls   go to state 97
-    token_decls   go to state 98
-    token_decl.1  go to state 94
-    token_decl    go to state 95
-    id            go to state 96
+    nterm_decls   go to state 96
+    token_decls   go to state 97
+    token_decl.1  go to state 93
+    token_decl    go to state 94
+    id            go to state 95
 
 
 State 51
 
-  117 string_as_id: "string" .
+   49 symbol_declaration: "%type" $@4 . symbol_decls
+   85 symbol_decls: . symbols.1
+   86             | . "<tag>" symbols.1
+   87             | . symbol_decls "<tag>" symbols.1
+   88 symbols.1: . symbol
+   89          | . symbols.1 symbol
+  117 id: . "identifier"
+  118   | . "character literal"
+  120 symbol: . id
+  121       | . string_as_id
+  122 string_as_id: . "string"
 
-    $default  reduce using rule 117 (string_as_id)
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+    "<tag>"              shift, and go to state 98
+
+    symbol_decls  go to state 99
+    symbols.1     go to state 100
+    id            go to state 71
+    symbol        go to state 72
+    string_as_id  go to state 73
 
 
 State 52
 
-  113 id: "character literal" .
+   37 grammar_declaration: "%code" "{...}" .
 
-    $default  reduce using rule 113 (id)
+    $default  reduce using rule 37 (grammar_declaration)
 
 
 State 53
 
-  112 id: "identifier" .
+   38 grammar_declaration: "%code" "identifier" . "{...}"
 
-    $default  reduce using rule 112 (id)
+    "{...}"  shift, and go to state 101
 
 
 State 54
 
-   81 symbol_decls: "<tag>" . symbol_decl.1
-   83 symbol_decl.1: . symbol
-   84              | . symbol_decl.1 symbol
-  112 id: . "identifier"
-  113   | . "character literal"
-  115 symbol: . id
-  116       | . string_as_id
-  117 string_as_id: . "string"
+  112 variable: "identifier" .
 
-    "string"             shift, and go to state 51
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-
-    symbol_decl.1  go to state 99
-    id             go to state 57
-    symbol         go to state 58
-    string_as_id   go to state 59
+    $default  reduce using rule 112 (variable)
 
 
 State 55
 
-   49 symbol_declaration: "%type" symbol_decls .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
-   82 symbol_decls: symbol_decls . "<tag>" symbol_decl.1
+    7 prologue_declaration: "%define" variable . value
+  113 value: %empty .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
+  114      | . "identifier"
+  115      | . "string"
+  116      | . "{...}"
 
-    "<tag>"  shift, and go to state 100
+    "string"      shift, and go to state 102
+    "{...}"       shift, and go to state 103
+    "identifier"  shift, and go to state 104
 
-    $default  reduce using rule 49 (symbol_declaration)
+    $default  reduce using rule 113 (value)
+
+    value  go to state 105
 
 
 State 56
 
-   80 symbol_decls: symbol_decl.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
-   84 symbol_decl.1: symbol_decl.1 . symbol
-  112 id: . "identifier"
-  113   | . "character literal"
-  115 symbol: . id
-  116       | . string_as_id
-  117 string_as_id: . "string"
+   10 prologue_declaration: "%expect" "integer literal" .
 
-    "string"             shift, and go to state 51
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-
-    $default  reduce using rule 80 (symbol_decls)
-
-    id            go to state 57
-    symbol        go to state 101
-    string_as_id  go to state 59
+    $default  reduce using rule 10 (prologue_declaration)
 
 
 State 57
 
-  115 symbol: id .
-
-    $default  reduce using rule 115 (symbol)
-
-
-State 58
-
-   83 symbol_decl.1: symbol .
-
-    $default  reduce using rule 83 (symbol_decl.1)
-
-
-State 59
-
-  116 symbol: string_as_id .
-
-    $default  reduce using rule 116 (symbol)
-
-
-State 60
-
-   38 grammar_declaration: "%code" "{...}" .
-
-    $default  reduce using rule 38 (grammar_declaration)
-
-
-State 61
-
-   39 grammar_declaration: "%code" "identifier" . "{...}"
-
-    "{...}"  shift, and go to state 102
-
-
-State 62
-
-  107 variable: "identifier" .
-
-    $default  reduce using rule 107 (variable)
-
-
-State 63
-
-    7 prologue_declaration: "%define" variable . value
-  108 value: . %empty  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
-  109      | . "identifier"
-  110      | . "string"
-  111      | . "{...}"
-
-    "string"      shift, and go to state 103
-    "{...}"       shift, and go to state 104
-    "identifier"  shift, and go to state 105
-
-    $default  reduce using rule 108 (value)
-
-    value  go to state 106
-
-
-State 64
-
-    9 prologue_declaration: "%defines" "string" .
-
-    $default  reduce using rule 9 (prologue_declaration)
-
-
-State 65
-
-   11 prologue_declaration: "%expect" "integer" .
+   11 prologue_declaration: "%expect-rr" "integer literal" .
 
     $default  reduce using rule 11 (prologue_declaration)
 
 
-State 66
+State 58
 
-   12 prologue_declaration: "%expect-rr" "integer" .
+   12 prologue_declaration: "%file-prefix" "string" .
 
     $default  reduce using rule 12 (prologue_declaration)
 
 
-State 67
+State 59
 
-   13 prologue_declaration: "%file-prefix" "string" .
+   56 string.opt: "string" .
 
-    $default  reduce using rule 13 (prologue_declaration)
+    $default  reduce using rule 56 (string.opt)
 
 
-State 68
+State 60
 
-   15 prologue_declaration: "%initial-action" "{...}" .
+    8 prologue_declaration: "%header" string.opt .
+
+    $default  reduce using rule 8 (prologue_declaration)
+
+
+State 61
+
+   14 prologue_declaration: "%initial-action" "{...}" .
+
+    $default  reduce using rule 14 (prologue_declaration)
+
+
+State 62
+
+   15 prologue_declaration: "%language" "string" .
 
     $default  reduce using rule 15 (prologue_declaration)
 
 
-State 69
+State 63
 
-   16 prologue_declaration: "%language" "string" .
+   16 prologue_declaration: "%name-prefix" "string" .
 
     $default  reduce using rule 16 (prologue_declaration)
 
 
-State 70
+State 64
 
-   17 prologue_declaration: "%name-prefix" "string" .
+   19 prologue_declaration: "%output" "string" .
 
-    $default  reduce using rule 17 (prologue_declaration)
+    $default  reduce using rule 19 (prologue_declaration)
 
 
-State 71
+State 65
 
-   20 prologue_declaration: "%output" "string" .
+   23 prologue_declaration: "%require" "string" .
 
-    $default  reduce using rule 20 (prologue_declaration)
+    $default  reduce using rule 23 (prologue_declaration)
 
 
-State 72
+State 66
 
-   24 prologue_declaration: "%require" "string" .
+   24 prologue_declaration: "%skeleton" "string" .
 
     $default  reduce using rule 24 (prologue_declaration)
 
 
+State 67
+
+  122 string_as_id: "string" .
+
+    $default  reduce using rule 122 (string_as_id)
+
+
+State 68
+
+  118 id: "character literal" .
+
+    $default  reduce using rule 118 (id)
+
+
+State 69
+
+  117 id: "identifier" .
+
+    $default  reduce using rule 117 (id)
+
+
+State 70
+
+   33 grammar_declaration: "%start" symbols.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
+   89 symbols.1: symbols.1 . symbol
+  117 id: . "identifier"
+  118   | . "character literal"
+  120 symbol: . id
+  121       | . string_as_id
+  122 string_as_id: . "string"
+
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+
+    $default  reduce using rule 33 (grammar_declaration)
+
+    id            go to state 71
+    symbol        go to state 106
+    string_as_id  go to state 73
+
+
+State 71
+
+  120 symbol: id .
+
+    $default  reduce using rule 120 (symbol)
+
+
+State 72
+
+   88 symbols.1: symbol .
+
+    $default  reduce using rule 88 (symbols.1)
+
+
 State 73
 
-   25 prologue_declaration: "%skeleton" "string" .
+  121 symbol: string_as_id .
 
-    $default  reduce using rule 25 (prologue_declaration)
+    $default  reduce using rule 121 (symbol)
 
 
 State 74
 
-   34 grammar_declaration: "%start" symbol .
-
-    $default  reduce using rule 34 (grammar_declaration)
-
-
-State 75
-
-   89 rules_or_grammar_declaration: error . ";"
+   94 rules_or_grammar_declaration: error . ";"
 
     ";"  shift, and go to state 107
 
 
+State 75
+
+  119 id_colon: "identifier:" .
+
+    $default  reduce using rule 119 (id_colon)
+
+
 State 76
 
-  114 id_colon: "identifier:" .
-
-    $default  reduce using rule 114 (id_colon)
-
-
-State 77
-
-   88 rules_or_grammar_declaration: grammar_declaration . ";"
+   93 rules_or_grammar_declaration: grammar_declaration . ";"
 
     ";"  shift, and go to state 108
 
 
-State 78
+State 77
 
     1 input: prologue_declarations "%%" grammar . epilogue.opt
-   33 grammar_declaration: . symbol_declaration
-   34                    | . "%start" symbol
-   35                    | . code_props_type "{...}" generic_symlist
-   36                    | . "%default-prec"
-   37                    | . "%no-default-prec"
-   38                    | . "%code" "{...}"
-   39                    | . "%code" "identifier" "{...}"
-   40 code_props_type: . "%destructor"
-   41                | . "%printer"
-   44 grammar_declaration: . "%union" union_name "{...}"
-   46 symbol_declaration: . "%nterm" $@2 nterm_decls
-   48                   | . "%token" $@3 token_decls
-   49                   | . "%type" symbol_decls
+   32 grammar_declaration: . symbol_declaration
+   33                    | . "%start" symbols.1
+   34                    | . code_props_type "{...}" generic_symlist
+   35                    | . "%default-prec"
+   36                    | . "%no-default-prec"
+   37                    | . "%code" "{...}"
+   38                    | . "%code" "identifier" "{...}"
+   39 code_props_type: . "%destructor"
+   40                | . "%printer"
+   43 grammar_declaration: . "%union" union_name "{...}"
+   45 symbol_declaration: . "%nterm" $@2 nterm_decls
+   47                   | . "%token" $@3 token_decls
+   49                   | . "%type" $@4 symbol_decls
    50                   | . precedence_declarator token_decls_for_prec
    51 precedence_declarator: . "%left"
    52                      | . "%right"
    53                      | . "%nonassoc"
    54                      | . "%precedence"
-   86 grammar: grammar . rules_or_grammar_declaration
-   87 rules_or_grammar_declaration: . rules
-   88                             | . grammar_declaration ";"
-   89                             | . error ";"
-   91 rules: . id_colon named_ref.opt $@4 ":" rhses.1
-  114 id_colon: . "identifier:"
-  120 epilogue.opt: . %empty  ["end of file"]
-  121             | . "%%" "epilogue"
+   91 grammar: grammar . rules_or_grammar_declaration
+   92 rules_or_grammar_declaration: . rules
+   93                             | . grammar_declaration ";"
+   94                             | . error ";"
+   96 rules: . id_colon named_ref.opt $@5 ":" rhses.1
+  119 id_colon: . "identifier:"
+  123 epilogue.opt: %empty .  [$end]
+  124             | . "%%" "epilogue"
 
-    error               shift, and go to state 75
+    error               shift, and go to state 74
     "%token"            shift, and go to state 5
     "%nterm"            shift, and go to state 6
     "%type"             shift, and go to state 7
@@ -1244,93 +1241,93 @@
     "%default-prec"     shift, and go to state 15
     "%no-default-prec"  shift, and go to state 27
     "%start"            shift, and go to state 34
-    "identifier:"       shift, and go to state 76
+    "identifier:"       shift, and go to state 75
     "%%"                shift, and go to state 109
     "%union"            shift, and go to state 42
 
-    "end of file"  reduce using rule 120 (epilogue.opt)
+    $end  reduce using rule 123 (epilogue.opt)
 
-    grammar_declaration           go to state 77
+    grammar_declaration           go to state 76
     code_props_type               go to state 45
     symbol_declaration            go to state 46
     precedence_declarator         go to state 47
     rules_or_grammar_declaration  go to state 110
-    rules                         go to state 80
-    id_colon                      go to state 81
+    rules                         go to state 79
+    id_colon                      go to state 80
     epilogue.opt                  go to state 111
 
 
+State 78
+
+   90 grammar: rules_or_grammar_declaration .
+
+    $default  reduce using rule 90 (grammar)
+
+
 State 79
 
-   85 grammar: rules_or_grammar_declaration .
+   92 rules_or_grammar_declaration: rules .
 
-    $default  reduce using rule 85 (grammar)
+    $default  reduce using rule 92 (rules_or_grammar_declaration)
 
 
 State 80
 
-   87 rules_or_grammar_declaration: rules .
-
-    $default  reduce using rule 87 (rules_or_grammar_declaration)
-
-
-State 81
-
-   91 rules: id_colon . named_ref.opt $@4 ":" rhses.1
-  105 named_ref.opt: . %empty  [":"]
-  106              | . "[identifier]"
+   96 rules: id_colon . named_ref.opt $@5 ":" rhses.1
+  110 named_ref.opt: %empty .  [":"]
+  111              | . "[identifier]"
 
     "[identifier]"  shift, and go to state 112
 
-    $default  reduce using rule 105 (named_ref.opt)
+    $default  reduce using rule 110 (named_ref.opt)
 
     named_ref.opt  go to state 113
 
 
-State 82
+State 81
 
-   22 prologue_declaration: "%param" $@1 . params
-   31 params: . params "{...}"
-   32       | . "{...}"
+   21 prologue_declaration: "%param" $@1 . params
+   30 params: . params "{...}"
+   31       | . "{...}"
 
     "{...}"  shift, and go to state 114
 
     params  go to state 115
 
 
+State 82
+
+   42 union_name: "identifier" .
+
+    $default  reduce using rule 42 (union_name)
+
+
 State 83
 
-   43 union_name: "identifier" .
-
-    $default  reduce using rule 43 (union_name)
-
-
-State 84
-
-   44 grammar_declaration: "%union" union_name . "{...}"
+   43 grammar_declaration: "%union" union_name . "{...}"
 
     "{...}"  shift, and go to state 116
 
 
-State 85
+State 84
 
-   35 grammar_declaration: code_props_type "{...}" . generic_symlist
-   57 generic_symlist: . generic_symlist_item
-   58                | . generic_symlist generic_symlist_item
-   59 generic_symlist_item: . symbol
-   60                     | . tag
-   61 tag: . "<tag>"
-   62    | . "<*>"
-   63    | . "<>"
-  112 id: . "identifier"
-  113   | . "character literal"
-  115 symbol: . id
-  116       | . string_as_id
-  117 string_as_id: . "string"
+   34 grammar_declaration: code_props_type "{...}" . generic_symlist
+   59 generic_symlist: . generic_symlist_item
+   60                | . generic_symlist generic_symlist_item
+   61 generic_symlist_item: . symbol
+   62                     | . tag
+   63 tag: . "<tag>"
+   64    | . "<*>"
+   65    | . "<>"
+  117 id: . "identifier"
+  118   | . "character literal"
+  120 symbol: . id
+  121       | . string_as_id
+  122 string_as_id: . "string"
 
-    "string"             shift, and go to state 51
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
     "<tag>"              shift, and go to state 117
     "<*>"                shift, and go to state 118
     "<>"                 shift, and go to state 119
@@ -1338,281 +1335,291 @@
     generic_symlist       go to state 120
     generic_symlist_item  go to state 121
     tag                   go to state 122
-    id                    go to state 57
+    id                    go to state 71
     symbol                go to state 123
-    string_as_id          go to state 59
+    string_as_id          go to state 73
+
+
+State 85
+
+   79 token_decls_for_prec: "<tag>" . token_decl_for_prec.1
+   81 token_decl_for_prec.1: . token_decl_for_prec
+   82                      | . token_decl_for_prec.1 token_decl_for_prec
+   83 token_decl_for_prec: . id int.opt
+   84                    | . string_as_id
+  117 id: . "identifier"
+  118   | . "character literal"
+  122 string_as_id: . "string"
+
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+
+    token_decl_for_prec.1  go to state 124
+    token_decl_for_prec    go to state 88
+    id                     go to state 89
+    string_as_id           go to state 90
 
 
 State 86
 
-   74 token_decls_for_prec: "<tag>" . token_decl_for_prec.1
-   76 token_decl_for_prec.1: . token_decl_for_prec
-   77                      | . token_decl_for_prec.1 token_decl_for_prec
-   78 token_decl_for_prec: . id int.opt
-   79                    | . string_as_id
-  112 id: . "identifier"
-  113   | . "character literal"
-  117 string_as_id: . "string"
-
-    "string"             shift, and go to state 51
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-
-    token_decl_for_prec.1  go to state 124
-    token_decl_for_prec    go to state 89
-    id                     go to state 90
-    string_as_id           go to state 91
-
-
-State 87
-
-   50 symbol_declaration: precedence_declarator token_decls_for_prec .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
-   75 token_decls_for_prec: token_decls_for_prec . "<tag>" token_decl_for_prec.1
+   50 symbol_declaration: precedence_declarator token_decls_for_prec .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
+   80 token_decls_for_prec: token_decls_for_prec . "<tag>" token_decl_for_prec.1
 
     "<tag>"  shift, and go to state 125
 
     $default  reduce using rule 50 (symbol_declaration)
 
 
-State 88
+State 87
 
-   73 token_decls_for_prec: token_decl_for_prec.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
-   77 token_decl_for_prec.1: token_decl_for_prec.1 . token_decl_for_prec
-   78 token_decl_for_prec: . id int.opt
-   79                    | . string_as_id
-  112 id: . "identifier"
-  113   | . "character literal"
-  117 string_as_id: . "string"
+   78 token_decls_for_prec: token_decl_for_prec.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
+   82 token_decl_for_prec.1: token_decl_for_prec.1 . token_decl_for_prec
+   83 token_decl_for_prec: . id int.opt
+   84                    | . string_as_id
+  117 id: . "identifier"
+  118   | . "character literal"
+  122 string_as_id: . "string"
 
-    "string"             shift, and go to state 51
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
 
-    $default  reduce using rule 73 (token_decls_for_prec)
+    $default  reduce using rule 78 (token_decls_for_prec)
 
     token_decl_for_prec  go to state 126
-    id                   go to state 90
-    string_as_id         go to state 91
+    id                   go to state 89
+    string_as_id         go to state 90
+
+
+State 88
+
+   81 token_decl_for_prec.1: token_decl_for_prec .
+
+    $default  reduce using rule 81 (token_decl_for_prec.1)
 
 
 State 89
 
-   76 token_decl_for_prec.1: token_decl_for_prec .
+   73 int.opt: %empty .  [error, "string", "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "character literal", "identifier", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
+   74        | . "integer literal"
+   83 token_decl_for_prec: id . int.opt
 
-    $default  reduce using rule 76 (token_decl_for_prec.1)
+    "integer literal"  shift, and go to state 127
 
-
-State 90
-
-   71 int.opt: . %empty  [error, "string", "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "character literal", "identifier", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
-   72        | . "integer"
-   78 token_decl_for_prec: id . int.opt
-
-    "integer"  shift, and go to state 127
-
-    $default  reduce using rule 71 (int.opt)
+    $default  reduce using rule 73 (int.opt)
 
     int.opt  go to state 128
 
 
+State 90
+
+   84 token_decl_for_prec: string_as_id .
+
+    $default  reduce using rule 84 (token_decl_for_prec)
+
+
 State 91
 
-   79 token_decl_for_prec: string_as_id .
+   68 token_decls: "<tag>" . token_decl.1
+   70 token_decl.1: . token_decl
+   71             | . token_decl.1 token_decl
+   72 token_decl: . id int.opt alias
+  117 id: . "identifier"
+  118   | . "character literal"
 
-    $default  reduce using rule 79 (token_decl_for_prec)
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+
+    token_decl.1  go to state 129
+    token_decl    go to state 94
+    id            go to state 95
 
 
 State 92
 
-   66 token_decls: "<tag>" . token_decl.1
-   68 token_decl.1: . token_decl
-   69             | . token_decl.1 token_decl
-   70 token_decl: . id int.opt string_as_id.opt
-  112 id: . "identifier"
-  113   | . "character literal"
+   47 symbol_declaration: "%token" $@3 token_decls .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
+   69 token_decls: token_decls . "<tag>" token_decl.1
 
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
+    "<tag>"  shift, and go to state 130
 
-    token_decl.1  go to state 129
-    token_decl    go to state 95
-    id            go to state 96
+    $default  reduce using rule 47 (symbol_declaration)
 
 
 State 93
 
-   48 symbol_declaration: "%token" $@3 token_decls .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
-   67 token_decls: token_decls . "<tag>" token_decl.1
+   67 token_decls: token_decl.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
+   71 token_decl.1: token_decl.1 . token_decl
+   72 token_decl: . id int.opt alias
+  117 id: . "identifier"
+  118   | . "character literal"
 
-    "<tag>"  shift, and go to state 130
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
 
-    $default  reduce using rule 48 (symbol_declaration)
+    $default  reduce using rule 67 (token_decls)
+
+    token_decl  go to state 131
+    id          go to state 95
 
 
 State 94
 
-   65 token_decls: token_decl.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
-   69 token_decl.1: token_decl.1 . token_decl
-   70 token_decl: . id int.opt string_as_id.opt
-  112 id: . "identifier"
-  113   | . "character literal"
+   70 token_decl.1: token_decl .
 
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-
-    $default  reduce using rule 65 (token_decls)
-
-    token_decl  go to state 131
-    id          go to state 96
+    $default  reduce using rule 70 (token_decl.1)
 
 
 State 95
 
-   68 token_decl.1: token_decl .
+   72 token_decl: id . int.opt alias
+   73 int.opt: %empty .  [error, "string", "translatable string", "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "character literal", "identifier", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
+   74        | . "integer literal"
 
-    $default  reduce using rule 68 (token_decl.1)
+    "integer literal"  shift, and go to state 127
 
-
-State 96
-
-   70 token_decl: id . int.opt string_as_id.opt
-   71 int.opt: . %empty  [error, "string", "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "character literal", "identifier", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
-   72        | . "integer"
-
-    "integer"  shift, and go to state 127
-
-    $default  reduce using rule 71 (int.opt)
+    $default  reduce using rule 73 (int.opt)
 
     int.opt  go to state 132
 
 
+State 96
+
+   45 symbol_declaration: "%nterm" $@2 nterm_decls .
+
+    $default  reduce using rule 45 (symbol_declaration)
+
+
 State 97
 
-   46 symbol_declaration: "%nterm" $@2 nterm_decls .
+   66 nterm_decls: token_decls .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
+   69 token_decls: token_decls . "<tag>" token_decl.1
 
-    $default  reduce using rule 46 (symbol_declaration)
+    "<tag>"  shift, and go to state 130
+
+    $default  reduce using rule 66 (nterm_decls)
 
 
 State 98
 
-   64 nterm_decls: token_decls .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
-   67 token_decls: token_decls . "<tag>" token_decl.1
+   86 symbol_decls: "<tag>" . symbols.1
+   88 symbols.1: . symbol
+   89          | . symbols.1 symbol
+  117 id: . "identifier"
+  118   | . "character literal"
+  120 symbol: . id
+  121       | . string_as_id
+  122 string_as_id: . "string"
 
-    "<tag>"  shift, and go to state 130
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
 
-    $default  reduce using rule 64 (nterm_decls)
+    symbols.1     go to state 133
+    id            go to state 71
+    symbol        go to state 72
+    string_as_id  go to state 73
 
 
 State 99
 
-   81 symbol_decls: "<tag>" symbol_decl.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
-   84 symbol_decl.1: symbol_decl.1 . symbol
-  112 id: . "identifier"
-  113   | . "character literal"
-  115 symbol: . id
-  116       | . string_as_id
-  117 string_as_id: . "string"
+   49 symbol_declaration: "%type" $@4 symbol_decls .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
+   87 symbol_decls: symbol_decls . "<tag>" symbols.1
 
-    "string"             shift, and go to state 51
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
+    "<tag>"  shift, and go to state 134
 
-    $default  reduce using rule 81 (symbol_decls)
-
-    id            go to state 57
-    symbol        go to state 101
-    string_as_id  go to state 59
+    $default  reduce using rule 49 (symbol_declaration)
 
 
 State 100
 
-   82 symbol_decls: symbol_decls "<tag>" . symbol_decl.1
-   83 symbol_decl.1: . symbol
-   84              | . symbol_decl.1 symbol
-  112 id: . "identifier"
-  113   | . "character literal"
-  115 symbol: . id
-  116       | . string_as_id
-  117 string_as_id: . "string"
+   85 symbol_decls: symbols.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
+   89 symbols.1: symbols.1 . symbol
+  117 id: . "identifier"
+  118   | . "character literal"
+  120 symbol: . id
+  121       | . string_as_id
+  122 string_as_id: . "string"
 
-    "string"             shift, and go to state 51
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
 
-    symbol_decl.1  go to state 133
-    id             go to state 57
-    symbol         go to state 58
-    string_as_id   go to state 59
+    $default  reduce using rule 85 (symbol_decls)
+
+    id            go to state 71
+    symbol        go to state 106
+    string_as_id  go to state 73
 
 
 State 101
 
-   84 symbol_decl.1: symbol_decl.1 symbol .
+   38 grammar_declaration: "%code" "identifier" "{...}" .
 
-    $default  reduce using rule 84 (symbol_decl.1)
+    $default  reduce using rule 38 (grammar_declaration)
 
 
 State 102
 
-   39 grammar_declaration: "%code" "identifier" "{...}" .
+  115 value: "string" .
 
-    $default  reduce using rule 39 (grammar_declaration)
+    $default  reduce using rule 115 (value)
 
 
 State 103
 
-  110 value: "string" .
+  116 value: "{...}" .
 
-    $default  reduce using rule 110 (value)
+    $default  reduce using rule 116 (value)
 
 
 State 104
 
-  111 value: "{...}" .
+  114 value: "identifier" .
 
-    $default  reduce using rule 111 (value)
+    $default  reduce using rule 114 (value)
 
 
 State 105
 
-  109 value: "identifier" .
-
-    $default  reduce using rule 109 (value)
-
-
-State 106
-
     7 prologue_declaration: "%define" variable value .
 
     $default  reduce using rule 7 (prologue_declaration)
 
 
+State 106
+
+   89 symbols.1: symbols.1 symbol .
+
+    $default  reduce using rule 89 (symbols.1)
+
+
 State 107
 
-   89 rules_or_grammar_declaration: error ";" .
+   94 rules_or_grammar_declaration: error ";" .
 
-    $default  reduce using rule 89 (rules_or_grammar_declaration)
+    $default  reduce using rule 94 (rules_or_grammar_declaration)
 
 
 State 108
 
-   88 rules_or_grammar_declaration: grammar_declaration ";" .
+   93 rules_or_grammar_declaration: grammar_declaration ";" .
 
-    $default  reduce using rule 88 (rules_or_grammar_declaration)
+    $default  reduce using rule 93 (rules_or_grammar_declaration)
 
 
 State 109
 
-  121 epilogue.opt: "%%" . "epilogue"
+  124 epilogue.opt: "%%" . "epilogue"
 
-    "epilogue"  shift, and go to state 134
+    "epilogue"  shift, and go to state 135
 
 
 State 110
 
-   86 grammar: grammar rules_or_grammar_declaration .
+   91 grammar: grammar rules_or_grammar_declaration .
 
-    $default  reduce using rule 86 (grammar)
+    $default  reduce using rule 91 (grammar)
 
 
 State 111
@@ -1624,625 +1631,676 @@
 
 State 112
 
-  106 named_ref.opt: "[identifier]" .
+  111 named_ref.opt: "[identifier]" .
 
-    $default  reduce using rule 106 (named_ref.opt)
+    $default  reduce using rule 111 (named_ref.opt)
 
 
 State 113
 
-   90 $@4: . %empty
-   91 rules: id_colon named_ref.opt . $@4 ":" rhses.1
+   95 $@5: %empty .
+   96 rules: id_colon named_ref.opt . $@5 ":" rhses.1
 
-    $default  reduce using rule 90 ($@4)
+    $default  reduce using rule 95 ($@5)
 
-    $@4  go to state 135
+    $@5  go to state 136
 
 
 State 114
 
-   32 params: "{...}" .
-
-    $default  reduce using rule 32 (params)
-
-
-State 115
-
-   22 prologue_declaration: "%param" $@1 params .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
-   31 params: params . "{...}"
-
-    "{...}"  shift, and go to state 136
-
-    $default  reduce using rule 22 (prologue_declaration)
-
-
-State 116
-
-   44 grammar_declaration: "%union" union_name "{...}" .
-
-    $default  reduce using rule 44 (grammar_declaration)
-
-
-State 117
-
-   61 tag: "<tag>" .
-
-    $default  reduce using rule 61 (tag)
-
-
-State 118
-
-   62 tag: "<*>" .
-
-    $default  reduce using rule 62 (tag)
-
-
-State 119
-
-   63 tag: "<>" .
-
-    $default  reduce using rule 63 (tag)
-
-
-State 120
-
-   35 grammar_declaration: code_props_type "{...}" generic_symlist .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
-   58 generic_symlist: generic_symlist . generic_symlist_item
-   59 generic_symlist_item: . symbol
-   60                     | . tag
-   61 tag: . "<tag>"
-   62    | . "<*>"
-   63    | . "<>"
-  112 id: . "identifier"
-  113   | . "character literal"
-  115 symbol: . id
-  116       | . string_as_id
-  117 string_as_id: . "string"
-
-    "string"             shift, and go to state 51
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-    "<tag>"              shift, and go to state 117
-    "<*>"                shift, and go to state 118
-    "<>"                 shift, and go to state 119
-
-    $default  reduce using rule 35 (grammar_declaration)
-
-    generic_symlist_item  go to state 137
-    tag                   go to state 122
-    id                    go to state 57
-    symbol                go to state 123
-    string_as_id          go to state 59
-
-
-State 121
-
-   57 generic_symlist: generic_symlist_item .
-
-    $default  reduce using rule 57 (generic_symlist)
-
-
-State 122
-
-   60 generic_symlist_item: tag .
-
-    $default  reduce using rule 60 (generic_symlist_item)
-
-
-State 123
-
-   59 generic_symlist_item: symbol .
-
-    $default  reduce using rule 59 (generic_symlist_item)
-
-
-State 124
-
-   74 token_decls_for_prec: "<tag>" token_decl_for_prec.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
-   77 token_decl_for_prec.1: token_decl_for_prec.1 . token_decl_for_prec
-   78 token_decl_for_prec: . id int.opt
-   79                    | . string_as_id
-  112 id: . "identifier"
-  113   | . "character literal"
-  117 string_as_id: . "string"
-
-    "string"             shift, and go to state 51
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-
-    $default  reduce using rule 74 (token_decls_for_prec)
-
-    token_decl_for_prec  go to state 126
-    id                   go to state 90
-    string_as_id         go to state 91
-
-
-State 125
-
-   75 token_decls_for_prec: token_decls_for_prec "<tag>" . token_decl_for_prec.1
-   76 token_decl_for_prec.1: . token_decl_for_prec
-   77                      | . token_decl_for_prec.1 token_decl_for_prec
-   78 token_decl_for_prec: . id int.opt
-   79                    | . string_as_id
-  112 id: . "identifier"
-  113   | . "character literal"
-  117 string_as_id: . "string"
-
-    "string"             shift, and go to state 51
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-
-    token_decl_for_prec.1  go to state 138
-    token_decl_for_prec    go to state 89
-    id                     go to state 90
-    string_as_id           go to state 91
-
-
-State 126
-
-   77 token_decl_for_prec.1: token_decl_for_prec.1 token_decl_for_prec .
-
-    $default  reduce using rule 77 (token_decl_for_prec.1)
-
-
-State 127
-
-   72 int.opt: "integer" .
-
-    $default  reduce using rule 72 (int.opt)
-
-
-State 128
-
-   78 token_decl_for_prec: id int.opt .
-
-    $default  reduce using rule 78 (token_decl_for_prec)
-
-
-State 129
-
-   66 token_decls: "<tag>" token_decl.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
-   69 token_decl.1: token_decl.1 . token_decl
-   70 token_decl: . id int.opt string_as_id.opt
-  112 id: . "identifier"
-  113   | . "character literal"
-
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-
-    $default  reduce using rule 66 (token_decls)
-
-    token_decl  go to state 131
-    id          go to state 96
-
-
-State 130
-
-   67 token_decls: token_decls "<tag>" . token_decl.1
-   68 token_decl.1: . token_decl
-   69             | . token_decl.1 token_decl
-   70 token_decl: . id int.opt string_as_id.opt
-  112 id: . "identifier"
-  113   | . "character literal"
-
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-
-    token_decl.1  go to state 139
-    token_decl    go to state 95
-    id            go to state 96
-
-
-State 131
-
-   69 token_decl.1: token_decl.1 token_decl .
-
-    $default  reduce using rule 69 (token_decl.1)
-
-
-State 132
-
-   70 token_decl: id int.opt . string_as_id.opt
-  117 string_as_id: . "string"
-  118 string_as_id.opt: . %empty  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "character literal", "identifier", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
-  119                 | . string_as_id
-
-    "string"  shift, and go to state 51
-
-    $default  reduce using rule 118 (string_as_id.opt)
-
-    string_as_id      go to state 140
-    string_as_id.opt  go to state 141
-
-
-State 133
-
-   82 symbol_decls: symbol_decls "<tag>" symbol_decl.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
-   84 symbol_decl.1: symbol_decl.1 . symbol
-  112 id: . "identifier"
-  113   | . "character literal"
-  115 symbol: . id
-  116       | . string_as_id
-  117 string_as_id: . "string"
-
-    "string"             shift, and go to state 51
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-
-    $default  reduce using rule 82 (symbol_decls)
-
-    id            go to state 57
-    symbol        go to state 101
-    string_as_id  go to state 59
-
-
-State 134
-
-  121 epilogue.opt: "%%" "epilogue" .
-
-    $default  reduce using rule 121 (epilogue.opt)
-
-
-State 135
-
-   91 rules: id_colon named_ref.opt $@4 . ":" rhses.1
-
-    ":"  shift, and go to state 142
-
-
-State 136
-
-   31 params: params "{...}" .
+   31 params: "{...}" .
 
     $default  reduce using rule 31 (params)
 
 
+State 115
+
+   21 prologue_declaration: "%param" $@1 params .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
+   30 params: params . "{...}"
+
+    "{...}"  shift, and go to state 137
+
+    $default  reduce using rule 21 (prologue_declaration)
+
+
+State 116
+
+   43 grammar_declaration: "%union" union_name "{...}" .
+
+    $default  reduce using rule 43 (grammar_declaration)
+
+
+State 117
+
+   63 tag: "<tag>" .
+
+    $default  reduce using rule 63 (tag)
+
+
+State 118
+
+   64 tag: "<*>" .
+
+    $default  reduce using rule 64 (tag)
+
+
+State 119
+
+   65 tag: "<>" .
+
+    $default  reduce using rule 65 (tag)
+
+
+State 120
+
+   34 grammar_declaration: code_props_type "{...}" generic_symlist .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "%param", "%union"]
+   60 generic_symlist: generic_symlist . generic_symlist_item
+   61 generic_symlist_item: . symbol
+   62                     | . tag
+   63 tag: . "<tag>"
+   64    | . "<*>"
+   65    | . "<>"
+  117 id: . "identifier"
+  118   | . "character literal"
+  120 symbol: . id
+  121       | . string_as_id
+  122 string_as_id: . "string"
+
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+    "<tag>"              shift, and go to state 117
+    "<*>"                shift, and go to state 118
+    "<>"                 shift, and go to state 119
+
+    $default  reduce using rule 34 (grammar_declaration)
+
+    generic_symlist_item  go to state 138
+    tag                   go to state 122
+    id                    go to state 71
+    symbol                go to state 123
+    string_as_id          go to state 73
+
+
+State 121
+
+   59 generic_symlist: generic_symlist_item .
+
+    $default  reduce using rule 59 (generic_symlist)
+
+
+State 122
+
+   62 generic_symlist_item: tag .
+
+    $default  reduce using rule 62 (generic_symlist_item)
+
+
+State 123
+
+   61 generic_symlist_item: symbol .
+
+    $default  reduce using rule 61 (generic_symlist_item)
+
+
+State 124
+
+   79 token_decls_for_prec: "<tag>" token_decl_for_prec.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
+   82 token_decl_for_prec.1: token_decl_for_prec.1 . token_decl_for_prec
+   83 token_decl_for_prec: . id int.opt
+   84                    | . string_as_id
+  117 id: . "identifier"
+  118   | . "character literal"
+  122 string_as_id: . "string"
+
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+
+    $default  reduce using rule 79 (token_decls_for_prec)
+
+    token_decl_for_prec  go to state 126
+    id                   go to state 89
+    string_as_id         go to state 90
+
+
+State 125
+
+   80 token_decls_for_prec: token_decls_for_prec "<tag>" . token_decl_for_prec.1
+   81 token_decl_for_prec.1: . token_decl_for_prec
+   82                      | . token_decl_for_prec.1 token_decl_for_prec
+   83 token_decl_for_prec: . id int.opt
+   84                    | . string_as_id
+  117 id: . "identifier"
+  118   | . "character literal"
+  122 string_as_id: . "string"
+
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+
+    token_decl_for_prec.1  go to state 139
+    token_decl_for_prec    go to state 88
+    id                     go to state 89
+    string_as_id           go to state 90
+
+
+State 126
+
+   82 token_decl_for_prec.1: token_decl_for_prec.1 token_decl_for_prec .
+
+    $default  reduce using rule 82 (token_decl_for_prec.1)
+
+
+State 127
+
+   74 int.opt: "integer literal" .
+
+    $default  reduce using rule 74 (int.opt)
+
+
+State 128
+
+   83 token_decl_for_prec: id int.opt .
+
+    $default  reduce using rule 83 (token_decl_for_prec)
+
+
+State 129
+
+   68 token_decls: "<tag>" token_decl.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
+   71 token_decl.1: token_decl.1 . token_decl
+   72 token_decl: . id int.opt alias
+  117 id: . "identifier"
+  118   | . "character literal"
+
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+
+    $default  reduce using rule 68 (token_decls)
+
+    token_decl  go to state 131
+    id          go to state 95
+
+
+State 130
+
+   69 token_decls: token_decls "<tag>" . token_decl.1
+   70 token_decl.1: . token_decl
+   71             | . token_decl.1 token_decl
+   72 token_decl: . id int.opt alias
+  117 id: . "identifier"
+  118   | . "character literal"
+
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+
+    token_decl.1  go to state 140
+    token_decl    go to state 94
+    id            go to state 95
+
+
+State 131
+
+   71 token_decl.1: token_decl.1 token_decl .
+
+    $default  reduce using rule 71 (token_decl.1)
+
+
+State 132
+
+   72 token_decl: id int.opt . alias
+   75 alias: %empty .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "character literal", "identifier", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
+   76      | . string_as_id
+   77      | . "translatable string"
+  122 string_as_id: . "string"
+
+    "string"               shift, and go to state 67
+    "translatable string"  shift, and go to state 141
+
+    $default  reduce using rule 75 (alias)
+
+    alias         go to state 142
+    string_as_id  go to state 143
+
+
+State 133
+
+   86 symbol_decls: "<tag>" symbols.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
+   89 symbols.1: symbols.1 . symbol
+  117 id: . "identifier"
+  118   | . "character literal"
+  120 symbol: . id
+  121       | . string_as_id
+  122 string_as_id: . "string"
+
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+
+    $default  reduce using rule 86 (symbol_decls)
+
+    id            go to state 71
+    symbol        go to state 106
+    string_as_id  go to state 73
+
+
+State 134
+
+   87 symbol_decls: symbol_decls "<tag>" . symbols.1
+   88 symbols.1: . symbol
+   89          | . symbols.1 symbol
+  117 id: . "identifier"
+  118   | . "character literal"
+  120 symbol: . id
+  121       | . string_as_id
+  122 string_as_id: . "string"
+
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+
+    symbols.1     go to state 144
+    id            go to state 71
+    symbol        go to state 72
+    string_as_id  go to state 73
+
+
+State 135
+
+  124 epilogue.opt: "%%" "epilogue" .
+
+    $default  reduce using rule 124 (epilogue.opt)
+
+
+State 136
+
+   96 rules: id_colon named_ref.opt $@5 . ":" rhses.1
+
+    ":"  shift, and go to state 145
+
+
 State 137
 
-   58 generic_symlist: generic_symlist generic_symlist_item .
+   30 params: params "{...}" .
 
-    $default  reduce using rule 58 (generic_symlist)
+    $default  reduce using rule 30 (params)
 
 
 State 138
 
-   75 token_decls_for_prec: token_decls_for_prec "<tag>" token_decl_for_prec.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
-   77 token_decl_for_prec.1: token_decl_for_prec.1 . token_decl_for_prec
-   78 token_decl_for_prec: . id int.opt
-   79                    | . string_as_id
-  112 id: . "identifier"
-  113   | . "character literal"
-  117 string_as_id: . "string"
+   60 generic_symlist: generic_symlist generic_symlist_item .
 
-    "string"             shift, and go to state 51
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-
-    $default  reduce using rule 75 (token_decls_for_prec)
-
-    token_decl_for_prec  go to state 126
-    id                   go to state 90
-    string_as_id         go to state 91
+    $default  reduce using rule 60 (generic_symlist)
 
 
 State 139
 
-   67 token_decls: token_decls "<tag>" token_decl.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%defines", "%error-verbose", "%expect", "%expect-rr", "%<flag>", "%file-prefix", "%glr-parser", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
-   69 token_decl.1: token_decl.1 . token_decl
-   70 token_decl: . id int.opt string_as_id.opt
-  112 id: . "identifier"
-  113   | . "character literal"
+   80 token_decls_for_prec: token_decls_for_prec "<tag>" token_decl_for_prec.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
+   82 token_decl_for_prec.1: token_decl_for_prec.1 . token_decl_for_prec
+   83 token_decl_for_prec: . id int.opt
+   84                    | . string_as_id
+  117 id: . "identifier"
+  118   | . "character literal"
+  122 string_as_id: . "string"
 
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
 
-    $default  reduce using rule 67 (token_decls)
+    $default  reduce using rule 80 (token_decls_for_prec)
 
-    token_decl  go to state 131
-    id          go to state 96
+    token_decl_for_prec  go to state 126
+    id                   go to state 89
+    string_as_id         go to state 90
 
 
 State 140
 
-  119 string_as_id.opt: string_as_id .
+   69 token_decls: token_decls "<tag>" token_decl.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
+   71 token_decl.1: token_decl.1 . token_decl
+   72 token_decl: . id int.opt alias
+  117 id: . "identifier"
+  118   | . "character literal"
 
-    $default  reduce using rule 119 (string_as_id.opt)
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+
+    $default  reduce using rule 69 (token_decls)
+
+    token_decl  go to state 131
+    id          go to state 95
 
 
 State 141
 
-   70 token_decl: id int.opt string_as_id.opt .
+   77 alias: "translatable string" .
 
-    $default  reduce using rule 70 (token_decl)
+    $default  reduce using rule 77 (alias)
 
 
 State 142
 
-   91 rules: id_colon named_ref.opt $@4 ":" . rhses.1
-   92 rhses.1: . rhs
-   93        | . rhses.1 "|" rhs
-   94        | . rhses.1 ";"
-   95 rhs: . %empty
-   96    | . rhs symbol named_ref.opt
-   97    | . rhs tag.opt "{...}" named_ref.opt
-   98    | . rhs "%?{...}"
-   99    | . rhs "%empty"
-  100    | . rhs "%prec" symbol
-  101    | . rhs "%dprec" "integer"
-  102    | . rhs "%merge" "<tag>"
-  103    | . rhs "%expect" "integer"
-  104    | . rhs "%expect-rr" "integer"
+   72 token_decl: id int.opt alias .
 
-    $default  reduce using rule 95 (rhs)
-
-    rhses.1  go to state 143
-    rhs      go to state 144
+    $default  reduce using rule 72 (token_decl)
 
 
 State 143
 
-   91 rules: id_colon named_ref.opt $@4 ":" rhses.1 .  ["end of file", error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%no-default-prec", "%start", "identifier:", "%%", "%union"]
-   93 rhses.1: rhses.1 . "|" rhs
-   94        | rhses.1 . ";"
+   76 alias: string_as_id .
 
-    "|"  shift, and go to state 145
-    ";"  shift, and go to state 146
-
-    $default  reduce using rule 91 (rules)
+    $default  reduce using rule 76 (alias)
 
 
 State 144
 
-   55 tag.opt: . %empty  ["{...}"]
-   56        | . "<tag>"
-   92 rhses.1: rhs .  ["end of file", error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%no-default-prec", "%start", "identifier:", "%%", "|", ";", "%union"]
-   96 rhs: rhs . symbol named_ref.opt
-   97    | rhs . tag.opt "{...}" named_ref.opt
-   98    | rhs . "%?{...}"
-   99    | rhs . "%empty"
-  100    | rhs . "%prec" symbol
-  101    | rhs . "%dprec" "integer"
-  102    | rhs . "%merge" "<tag>"
-  103    | rhs . "%expect" "integer"
-  104    | rhs . "%expect-rr" "integer"
-  112 id: . "identifier"
-  113   | . "character literal"
-  115 symbol: . id
-  116       | . string_as_id
-  117 string_as_id: . "string"
+   87 symbol_decls: symbol_decls "<tag>" symbols.1 .  [error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%define", "%error-verbose", "%expect", "%expect-rr", "%file-prefix", "%<flag>", "%glr-parser", "%header", "%initial-action", "%language", "%name-prefix", "%no-default-prec", "%no-lines", "%nondeterministic-parser", "%output", "%pure-parser", "%require", "%skeleton", "%start", "%token-table", "%verbose", "%yacc", "%%", "%{...%}", ";", "<tag>", "%param", "%union"]
+   89 symbols.1: symbols.1 . symbol
+  117 id: . "identifier"
+  118   | . "character literal"
+  120 symbol: . id
+  121       | . string_as_id
+  122 string_as_id: . "string"
 
-    "string"             shift, and go to state 51
-    "%prec"              shift, and go to state 147
-    "%dprec"             shift, and go to state 148
-    "%merge"             shift, and go to state 149
-    "%expect"            shift, and go to state 150
-    "%expect-rr"         shift, and go to state 151
-    "%?{...}"            shift, and go to state 152
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-    "<tag>"              shift, and go to state 153
-    "%empty"             shift, and go to state 154
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
 
-    "{...}"   reduce using rule 55 (tag.opt)
-    $default  reduce using rule 92 (rhses.1)
+    $default  reduce using rule 87 (symbol_decls)
 
-    tag.opt       go to state 155
-    id            go to state 57
-    symbol        go to state 156
-    string_as_id  go to state 59
+    id            go to state 71
+    symbol        go to state 106
+    string_as_id  go to state 73
 
 
 State 145
 
-   93 rhses.1: rhses.1 "|" . rhs
-   95 rhs: . %empty
-   96    | . rhs symbol named_ref.opt
-   97    | . rhs tag.opt "{...}" named_ref.opt
-   98    | . rhs "%?{...}"
-   99    | . rhs "%empty"
-  100    | . rhs "%prec" symbol
-  101    | . rhs "%dprec" "integer"
-  102    | . rhs "%merge" "<tag>"
-  103    | . rhs "%expect" "integer"
-  104    | . rhs "%expect-rr" "integer"
+   96 rules: id_colon named_ref.opt $@5 ":" . rhses.1
+   97 rhses.1: . rhs
+   98        | . rhses.1 "|" rhs
+   99        | . rhses.1 ";"
+  100 rhs: %empty .
+  101    | . rhs symbol named_ref.opt
+  102    | . rhs tag.opt "{...}" named_ref.opt
+  103    | . rhs "%?{...}"
+  104    | . rhs "%empty"
+  105    | . rhs "%prec" symbol
+  106    | . rhs "%dprec" "integer literal"
+  107    | . rhs "%merge" "<tag>"
+  108    | . rhs "%expect" "integer literal"
+  109    | . rhs "%expect-rr" "integer literal"
 
-    $default  reduce using rule 95 (rhs)
+    $default  reduce using rule 100 (rhs)
 
-    rhs  go to state 157
+    rhses.1  go to state 146
+    rhs      go to state 147
 
 
 State 146
 
-   94 rhses.1: rhses.1 ";" .
+   96 rules: id_colon named_ref.opt $@5 ":" rhses.1 .  [$end, error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%no-default-prec", "%start", "identifier:", "%%", "%union"]
+   98 rhses.1: rhses.1 . "|" rhs
+   99        | rhses.1 . ";"
 
-    $default  reduce using rule 94 (rhses.1)
+    "|"  shift, and go to state 148
+    ";"  shift, and go to state 149
+
+    $default  reduce using rule 96 (rules)
 
 
 State 147
 
-  100 rhs: rhs "%prec" . symbol
-  112 id: . "identifier"
-  113   | . "character literal"
-  115 symbol: . id
-  116       | . string_as_id
-  117 string_as_id: . "string"
+   57 tag.opt: %empty .  ["{...}"]
+   58        | . "<tag>"
+   97 rhses.1: rhs .  [$end, error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%no-default-prec", "%start", "identifier:", "%%", "|", ";", "%union"]
+  101 rhs: rhs . symbol named_ref.opt
+  102    | rhs . tag.opt "{...}" named_ref.opt
+  103    | rhs . "%?{...}"
+  104    | rhs . "%empty"
+  105    | rhs . "%prec" symbol
+  106    | rhs . "%dprec" "integer literal"
+  107    | rhs . "%merge" "<tag>"
+  108    | rhs . "%expect" "integer literal"
+  109    | rhs . "%expect-rr" "integer literal"
+  117 id: . "identifier"
+  118   | . "character literal"
+  120 symbol: . id
+  121       | . string_as_id
+  122 string_as_id: . "string"
 
-    "string"             shift, and go to state 51
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
+    "string"             shift, and go to state 67
+    "%prec"              shift, and go to state 150
+    "%dprec"             shift, and go to state 151
+    "%merge"             shift, and go to state 152
+    "%expect"            shift, and go to state 153
+    "%expect-rr"         shift, and go to state 154
+    "%?{...}"            shift, and go to state 155
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+    "<tag>"              shift, and go to state 156
+    "%empty"             shift, and go to state 157
 
-    id            go to state 57
-    symbol        go to state 158
-    string_as_id  go to state 59
+    "{...}"   reduce using rule 57 (tag.opt)
+    $default  reduce using rule 97 (rhses.1)
+
+    tag.opt       go to state 158
+    id            go to state 71
+    symbol        go to state 159
+    string_as_id  go to state 73
 
 
 State 148
 
-  101 rhs: rhs "%dprec" . "integer"
+   98 rhses.1: rhses.1 "|" . rhs
+  100 rhs: %empty .
+  101    | . rhs symbol named_ref.opt
+  102    | . rhs tag.opt "{...}" named_ref.opt
+  103    | . rhs "%?{...}"
+  104    | . rhs "%empty"
+  105    | . rhs "%prec" symbol
+  106    | . rhs "%dprec" "integer literal"
+  107    | . rhs "%merge" "<tag>"
+  108    | . rhs "%expect" "integer literal"
+  109    | . rhs "%expect-rr" "integer literal"
 
-    "integer"  shift, and go to state 159
+    $default  reduce using rule 100 (rhs)
+
+    rhs  go to state 160
 
 
 State 149
 
-  102 rhs: rhs "%merge" . "<tag>"
+   99 rhses.1: rhses.1 ";" .
 
-    "<tag>"  shift, and go to state 160
+    $default  reduce using rule 99 (rhses.1)
 
 
 State 150
 
-  103 rhs: rhs "%expect" . "integer"
+  105 rhs: rhs "%prec" . symbol
+  117 id: . "identifier"
+  118   | . "character literal"
+  120 symbol: . id
+  121       | . string_as_id
+  122 string_as_id: . "string"
 
-    "integer"  shift, and go to state 161
+    "string"             shift, and go to state 67
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+
+    id            go to state 71
+    symbol        go to state 161
+    string_as_id  go to state 73
 
 
 State 151
 
-  104 rhs: rhs "%expect-rr" . "integer"
+  106 rhs: rhs "%dprec" . "integer literal"
 
-    "integer"  shift, and go to state 162
+    "integer literal"  shift, and go to state 162
 
 
 State 152
 
-   98 rhs: rhs "%?{...}" .
+  107 rhs: rhs "%merge" . "<tag>"
 
-    $default  reduce using rule 98 (rhs)
+    "<tag>"  shift, and go to state 163
 
 
 State 153
 
-   56 tag.opt: "<tag>" .
+  108 rhs: rhs "%expect" . "integer literal"
 
-    $default  reduce using rule 56 (tag.opt)
+    "integer literal"  shift, and go to state 164
 
 
 State 154
 
-   99 rhs: rhs "%empty" .
+  109 rhs: rhs "%expect-rr" . "integer literal"
 
-    $default  reduce using rule 99 (rhs)
+    "integer literal"  shift, and go to state 165
 
 
 State 155
 
-   97 rhs: rhs tag.opt . "{...}" named_ref.opt
-
-    "{...}"  shift, and go to state 163
-
-
-State 156
-
-   96 rhs: rhs symbol . named_ref.opt
-  105 named_ref.opt: . %empty  ["end of file", error, "string", "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%prec", "%dprec", "%merge", "%code", "%default-prec", "%expect", "%expect-rr", "%no-default-prec", "%start", "{...}", "%?{...}", "character literal", "identifier", "identifier:", "%%", "|", ";", "<tag>", "%union", "%empty"]
-  106              | . "[identifier]"
-
-    "[identifier]"  shift, and go to state 112
-
-    $default  reduce using rule 105 (named_ref.opt)
-
-    named_ref.opt  go to state 164
-
-
-State 157
-
-   55 tag.opt: . %empty  ["{...}"]
-   56        | . "<tag>"
-   93 rhses.1: rhses.1 "|" rhs .  ["end of file", error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%no-default-prec", "%start", "identifier:", "%%", "|", ";", "%union"]
-   96 rhs: rhs . symbol named_ref.opt
-   97    | rhs . tag.opt "{...}" named_ref.opt
-   98    | rhs . "%?{...}"
-   99    | rhs . "%empty"
-  100    | rhs . "%prec" symbol
-  101    | rhs . "%dprec" "integer"
-  102    | rhs . "%merge" "<tag>"
-  103    | rhs . "%expect" "integer"
-  104    | rhs . "%expect-rr" "integer"
-  112 id: . "identifier"
-  113   | . "character literal"
-  115 symbol: . id
-  116       | . string_as_id
-  117 string_as_id: . "string"
-
-    "string"             shift, and go to state 51
-    "%prec"              shift, and go to state 147
-    "%dprec"             shift, and go to state 148
-    "%merge"             shift, and go to state 149
-    "%expect"            shift, and go to state 150
-    "%expect-rr"         shift, and go to state 151
-    "%?{...}"            shift, and go to state 152
-    "character literal"  shift, and go to state 52
-    "identifier"         shift, and go to state 53
-    "<tag>"              shift, and go to state 153
-    "%empty"             shift, and go to state 154
-
-    "{...}"   reduce using rule 55 (tag.opt)
-    $default  reduce using rule 93 (rhses.1)
-
-    tag.opt       go to state 155
-    id            go to state 57
-    symbol        go to state 156
-    string_as_id  go to state 59
-
-
-State 158
-
-  100 rhs: rhs "%prec" symbol .
-
-    $default  reduce using rule 100 (rhs)
-
-
-State 159
-
-  101 rhs: rhs "%dprec" "integer" .
-
-    $default  reduce using rule 101 (rhs)
-
-
-State 160
-
-  102 rhs: rhs "%merge" "<tag>" .
-
-    $default  reduce using rule 102 (rhs)
-
-
-State 161
-
-  103 rhs: rhs "%expect" "integer" .
+  103 rhs: rhs "%?{...}" .
 
     $default  reduce using rule 103 (rhs)
 
 
-State 162
+State 156
 
-  104 rhs: rhs "%expect-rr" "integer" .
+   58 tag.opt: "<tag>" .
+
+    $default  reduce using rule 58 (tag.opt)
+
+
+State 157
+
+  104 rhs: rhs "%empty" .
 
     $default  reduce using rule 104 (rhs)
 
 
-State 163
+State 158
 
-   97 rhs: rhs tag.opt "{...}" . named_ref.opt
-  105 named_ref.opt: . %empty  ["end of file", error, "string", "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%prec", "%dprec", "%merge", "%code", "%default-prec", "%expect", "%expect-rr", "%no-default-prec", "%start", "{...}", "%?{...}", "character literal", "identifier", "identifier:", "%%", "|", ";", "<tag>", "%union", "%empty"]
-  106              | . "[identifier]"
+  102 rhs: rhs tag.opt . "{...}" named_ref.opt
+
+    "{...}"  shift, and go to state 166
+
+
+State 159
+
+  101 rhs: rhs symbol . named_ref.opt
+  110 named_ref.opt: %empty .  [$end, error, "string", "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%prec", "%dprec", "%merge", "%code", "%default-prec", "%expect", "%expect-rr", "%no-default-prec", "%start", "{...}", "%?{...}", "character literal", "identifier", "identifier:", "%%", "|", ";", "<tag>", "%union", "%empty"]
+  111              | . "[identifier]"
 
     "[identifier]"  shift, and go to state 112
 
-    $default  reduce using rule 105 (named_ref.opt)
+    $default  reduce using rule 110 (named_ref.opt)
 
-    named_ref.opt  go to state 165
+    named_ref.opt  go to state 167
+
+
+State 160
+
+   57 tag.opt: %empty .  ["{...}"]
+   58        | . "<tag>"
+   98 rhses.1: rhses.1 "|" rhs .  [$end, error, "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%code", "%default-prec", "%no-default-prec", "%start", "identifier:", "%%", "|", ";", "%union"]
+  101 rhs: rhs . symbol named_ref.opt
+  102    | rhs . tag.opt "{...}" named_ref.opt
+  103    | rhs . "%?{...}"
+  104    | rhs . "%empty"
+  105    | rhs . "%prec" symbol
+  106    | rhs . "%dprec" "integer literal"
+  107    | rhs . "%merge" "<tag>"
+  108    | rhs . "%expect" "integer literal"
+  109    | rhs . "%expect-rr" "integer literal"
+  117 id: . "identifier"
+  118   | . "character literal"
+  120 symbol: . id
+  121       | . string_as_id
+  122 string_as_id: . "string"
+
+    "string"             shift, and go to state 67
+    "%prec"              shift, and go to state 150
+    "%dprec"             shift, and go to state 151
+    "%merge"             shift, and go to state 152
+    "%expect"            shift, and go to state 153
+    "%expect-rr"         shift, and go to state 154
+    "%?{...}"            shift, and go to state 155
+    "character literal"  shift, and go to state 68
+    "identifier"         shift, and go to state 69
+    "<tag>"              shift, and go to state 156
+    "%empty"             shift, and go to state 157
+
+    "{...}"   reduce using rule 57 (tag.opt)
+    $default  reduce using rule 98 (rhses.1)
+
+    tag.opt       go to state 158
+    id            go to state 71
+    symbol        go to state 159
+    string_as_id  go to state 73
+
+
+State 161
+
+  105 rhs: rhs "%prec" symbol .
+
+    $default  reduce using rule 105 (rhs)
+
+
+State 162
+
+  106 rhs: rhs "%dprec" "integer literal" .
+
+    $default  reduce using rule 106 (rhs)
+
+
+State 163
+
+  107 rhs: rhs "%merge" "<tag>" .
+
+    $default  reduce using rule 107 (rhs)
 
 
 State 164
 
-   96 rhs: rhs symbol named_ref.opt .
+  108 rhs: rhs "%expect" "integer literal" .
 
-    $default  reduce using rule 96 (rhs)
+    $default  reduce using rule 108 (rhs)
 
 
 State 165
 
-   97 rhs: rhs tag.opt "{...}" named_ref.opt .
+  109 rhs: rhs "%expect-rr" "integer literal" .
 
-    $default  reduce using rule 97 (rhs)
+    $default  reduce using rule 109 (rhs)
+
+
+State 166
+
+  102 rhs: rhs tag.opt "{...}" . named_ref.opt
+  110 named_ref.opt: %empty .  [$end, error, "string", "%token", "%nterm", "%type", "%destructor", "%printer", "%left", "%right", "%nonassoc", "%precedence", "%prec", "%dprec", "%merge", "%code", "%default-prec", "%expect", "%expect-rr", "%no-default-prec", "%start", "{...}", "%?{...}", "character literal", "identifier", "identifier:", "%%", "|", ";", "<tag>", "%union", "%empty"]
+  111              | . "[identifier]"
+
+    "[identifier]"  shift, and go to state 112
+
+    $default  reduce using rule 110 (named_ref.opt)
+
+    named_ref.opt  go to state 168
+
+
+State 167
+
+  101 rhs: rhs symbol named_ref.opt .
+
+    $default  reduce using rule 101 (rhs)
+
+
+State 168
+
+  102 rhs: rhs tag.opt "{...}" named_ref.opt .
+
+    $default  reduce using rule 102 (rhs)
diff --git a/src/parse-gram.y b/src/parse-gram.y
index 5815abc..15180cb 100644
--- a/src/parse-gram.y
+++ b/src/parse-gram.y
@@ -1,6 +1,6 @@
 /* Bison Grammar Parser                             -*- C -*-
 
-   Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,7 +15,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 %code requires
 {
@@ -23,6 +23,14 @@
   #include "symtab.h"
 }
 
+%code provides
+{
+  /* Initialize unquote.  */
+  void parser_init (void);
+  /* Deallocate storage for unquote.  */
+  void parser_free (void);
+}
+
 %code top
 {
   /* On column 0 to please syntax-check.  */
@@ -34,8 +42,6 @@
   #include "system.h"
 
   #include <c-ctype.h>
-  #include <errno.h>
-  #include <intprops.h>
   #include <quotearg.h>
   #include <vasnprintf.h>
   #include <xmemdup0.h>
@@ -49,6 +55,11 @@
   #include "reader.h"
   #include "scan-code.h"
   #include "scan-gram.h"
+  #include "strversion.h"
+
+  /* Pretend to be at least that version, to check features published
+     in that version while developping it.  */
+  static const char* api_version = "3.8";
 
   static int current_prec = 0;
   static location current_lhs_loc;
@@ -73,17 +84,20 @@
   static char *strip_braces (char *code);
 
   /* Convert CODE by calling code_props_plain_init if PLAIN, otherwise
-     code_props_symbol_action_init.  Call
+     code_props_symbol_action_init.  Calls
      gram_scanner_last_string_free to release the latest string from
      the scanner (should be CODE). */
   static char const *translate_code (char *code, location loc, bool plain);
 
   /* Convert CODE by calling code_props_plain_init after having
      stripped the first and last characters (expected to be '{', and
-     '}').  Call gram_scanner_last_string_free to release the latest
+     '}').  Calls gram_scanner_last_string_free to release the latest
      string from the scanner (should be CODE). */
   static char const *translate_code_braceless (char *code, location loc);
 
+  /* Handle a %header directive.  */
+  static void handle_header (char const *value);
+
   /* Handle a %error-verbose directive.  */
   static void handle_error_verbose (location const *loc, char const *directive);
 
@@ -92,6 +106,9 @@
                                   location const *dir_loc,
                                   char const *directive, char const *value);
 
+  /* Handle a %language directive.  */
+  static void handle_language (location const *loc, char const *lang);
+
   /* Handle a %name-prefix directive.  */
   static void handle_name_prefix (location const *loc,
                                   char const *directive, char const *value);
@@ -117,6 +134,13 @@
   /* Add style to semantic values in traces.  */
   static void tron (FILE *yyo);
   static void troff (FILE *yyo);
+
+  /* Interpret a quoted string (such as `"Hello, \"World\"\n\""`).
+     Manages the memory of the result.  */
+  static char *unquote (const char *str);
+
+  /* Discard the latest unquoted string.  */
+  static void unquote_free (char *last_string);
 }
 
 %define api.header.include {"parse-gram.h"}
@@ -125,10 +149,10 @@
 %define api.token.raw
 %define api.value.type union
 %define locations
-%define parse.error verbose
+%define parse.error custom
 %define parse.lac full
 %define parse.trace
-%defines
+%header
 %expect 0
 %verbose
 
@@ -140,48 +164,42 @@
   boundary_set (&@$.end, grammar_file, 1, 1, 1);
 }
 
-/* Define the tokens together with their human representation.  */
-%token GRAM_EOF 0 "end of file"
-%token STRING     "string"
-
-%token PERCENT_TOKEN       "%token"
-%token PERCENT_NTERM       "%nterm"
-
-%token PERCENT_TYPE        "%type"
-%token PERCENT_DESTRUCTOR  "%destructor"
-%token PERCENT_PRINTER     "%printer"
-
-%token PERCENT_LEFT        "%left"
-%token PERCENT_RIGHT       "%right"
-%token PERCENT_NONASSOC    "%nonassoc"
-%token PERCENT_PRECEDENCE  "%precedence"
-
-%token PERCENT_PREC          "%prec"
-%token PERCENT_DPREC         "%dprec"
-%token PERCENT_MERGE         "%merge"
-
-/*----------------------.
-| Global Declarations.  |
-`----------------------*/
-
 %token
+  STRING              _("string")
+  TSTRING             _("translatable string")
+
+  PERCENT_TOKEN       "%token"
+  PERCENT_NTERM       "%nterm"
+
+  PERCENT_TYPE        "%type"
+  PERCENT_DESTRUCTOR  "%destructor"
+  PERCENT_PRINTER     "%printer"
+
+  PERCENT_LEFT        "%left"
+  PERCENT_RIGHT       "%right"
+  PERCENT_NONASSOC    "%nonassoc"
+  PERCENT_PRECEDENCE  "%precedence"
+
+  PERCENT_PREC        "%prec"
+  PERCENT_DPREC       "%dprec"
+  PERCENT_MERGE       "%merge"
+
   PERCENT_CODE            "%code"
   PERCENT_DEFAULT_PREC    "%default-prec"
   PERCENT_DEFINE          "%define"
-  PERCENT_DEFINES         "%defines"
   PERCENT_ERROR_VERBOSE   "%error-verbose"
   PERCENT_EXPECT          "%expect"
   PERCENT_EXPECT_RR       "%expect-rr"
-  PERCENT_FLAG            "%<flag>"
   PERCENT_FILE_PREFIX     "%file-prefix"
+  PERCENT_FLAG            "%<flag>"
   PERCENT_GLR_PARSER      "%glr-parser"
+  PERCENT_HEADER          "%header"
   PERCENT_INITIAL_ACTION  "%initial-action"
   PERCENT_LANGUAGE        "%language"
   PERCENT_NAME_PREFIX     "%name-prefix"
   PERCENT_NO_DEFAULT_PREC "%no-default-prec"
   PERCENT_NO_LINES        "%no-lines"
-  PERCENT_NONDETERMINISTIC_PARSER
-                          "%nondeterministic-parser"
+  PERCENT_NONDETERMINISTIC_PARSER "%nondeterministic-parser"
   PERCENT_OUTPUT          "%output"
   PERCENT_PURE_PARSER     "%pure-parser"
   PERCENT_REQUIRE         "%require"
@@ -190,34 +208,33 @@
   PERCENT_TOKEN_TABLE     "%token-table"
   PERCENT_VERBOSE         "%verbose"
   PERCENT_YACC            "%yacc"
-;
 
-%token BRACED_CODE     "{...}"
-%token BRACED_PREDICATE "%?{...}"
-%token BRACKETED_ID    "[identifier]"
-%token CHAR            "character literal"
-%token COLON           ":"
-%token EPILOGUE        "epilogue"
-%token EQUAL           "="
-%token ID              "identifier"
-%token ID_COLON        "identifier:"
-%token PERCENT_PERCENT "%%"
-%token PIPE            "|"
-%token PROLOGUE        "%{...%}"
-%token SEMICOLON       ";"
-%token TAG             "<tag>"
-%token TAG_ANY         "<*>"
-%token TAG_NONE        "<>"
+  BRACED_CODE       "{...}"
+  BRACED_PREDICATE  "%?{...}"
+  BRACKETED_ID      _("[identifier]")
+  CHAR_LITERAL      _("character literal")
+  COLON             ":"
+  EPILOGUE          _("epilogue")
+  EQUAL             "="
+  ID                _("identifier")
+  ID_COLON          _("identifier:")
+  PERCENT_PERCENT   "%%"
+  PIPE              "|"
+  PROLOGUE          "%{...%}"
+  SEMICOLON         ";"
+  TAG               _("<tag>")
+  TAG_ANY           "<*>"
+  TAG_NONE          "<>"
 
  /* Experimental feature, don't rely on it.  */
 %code pre-printer  {tron (yyo);}
 %code post-printer {troff (yyo);}
 
-%type <unsigned char> CHAR
+%type <unsigned char> CHAR_LITERAL
 %printer { fputs (char_name ($$), yyo); } <unsigned char>
 
-%type <char*> "{...}" "%?{...}" "%{...%}" EPILOGUE STRING
-%printer { fputs ($$, yyo); }  <char*>
+%type <char*> "{...}" "%?{...}" "%{...%}" EPILOGUE STRING TSTRING
+%printer { fputs ($$, yyo); } <char*>
 
 %type <uniqstr>
   BRACKETED_ID ID ID_COLON
@@ -230,7 +247,7 @@
 %printer { fprintf (yyo, "%%%s", $$); } PERCENT_FLAG
 %printer { fprintf (yyo, "<%s>", $$); } TAG tag
 
-%token <int> INT "integer"
+%token <int> INT_LITERAL _("integer literal")
 %printer { fprintf (yyo, "%d", $$); } <int>
 
 %type <symbol*> id id_colon string_as_id symbol token_decl token_decl_for_prec
@@ -320,15 +337,10 @@
       muscle_percent_define_insert ($2, @$, $3.kind, $3.chars,
                                     MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
     }
-| "%defines"                       { defines_flag = true; }
-| "%defines" STRING
-    {
-      defines_flag = true;
-      spec_header_file = xstrdup ($2);
-    }
+| "%header" string.opt             { handle_header ($2); }
 | "%error-verbose"                 { handle_error_verbose (&@$, $1); }
-| "%expect" INT                    { expected_sr_conflicts = $2; }
-| "%expect-rr" INT                 { expected_rr_conflicts = $2; }
+| "%expect" INT_LITERAL            { expected_sr_conflicts = $2; }
+| "%expect-rr" INT_LITERAL         { expected_rr_conflicts = $2; }
 | "%file-prefix" STRING            { handle_file_prefix (&@$, &@1, $1, $2); }
 | "%glr-parser"
     {
@@ -340,11 +352,11 @@
       muscle_code_grow ("initial_action", translate_code ($2, @2, false), @2);
       code_scanner_last_string_free ();
     }
-| "%language" STRING            { language_argmatch ($2, grammar_prio, @1); }
+| "%language" STRING            { handle_language (&@1, $2); }
 | "%name-prefix" STRING         { handle_name_prefix (&@$, $1, $2); }
 | "%no-lines"                   { no_lines_flag = true; }
 | "%nondeterministic-parser"    { nondeterministic_parser = true; }
-| "%output" STRING              { spec_outfile = $2; }
+| "%output" STRING              { spec_outfile = unquote ($2); gram_scanner_last_string_free (); }
 | "%param" { current_param = $1; } params { current_param = param_none; }
 | "%pure-parser"                { handle_pure_parser (&@$, $1); }
 | "%require" STRING             { handle_require (&@2, $2); }
@@ -368,9 +380,9 @@
 
 grammar_declaration:
   symbol_declaration
-| "%start" symbol
+| "%start" symbols.1
     {
-      grammar_start_symbol_set ($2, @2);
+      grammar_start_symbols_add ($2);
     }
 | code_props_type "{...}" generic_symlist
     {
@@ -436,7 +448,7 @@
 ;
 
 
-%type <symbol_list*> nterm_decls symbol_decls symbol_decl.1
+%type <symbol_list*> nterm_decls symbol_decls symbols.1
       token_decls token_decls_for_prec
       token_decl.1 token_decl_for_prec.1;
 symbol_declaration:
@@ -450,8 +462,9 @@
       current_class = unknown_sym;
       symbol_list_free ($syms);
     }
-| "%type" symbol_decls[syms]
+| "%type" { current_class = pct_type_sym; } symbol_decls[syms]
     {
+      current_class = unknown_sym;
       symbol_list_free ($syms);
     }
 | precedence_declarator token_decls_for_prec[syms]
@@ -470,6 +483,12 @@
 | "%precedence" { $$ = precedence_assoc; }
 ;
 
+%type <char*> string.opt;
+string.opt:
+  %empty  { $$ = NULL; }
+| STRING  { $$ = $1; }
+;
+
 tag.opt:
   %empty { $$ = NULL; }
 | TAG    { $$ = $1; }
@@ -499,7 +518,7 @@
 // A non empty list of possibly tagged symbols for %nterm.
 //
 // Can easily be defined like symbol_decls but restricted to ID, but
-// using token_decls allows to reudce the number of rules, and also to
+// using token_decls allows to reduce the number of rules, and also to
 // make nicer error messages on "%nterm 'a'" or '%nterm FOO "foo"'.
 nterm_decls:
   token_decls
@@ -517,11 +536,11 @@
     }
 | TAG token_decl.1[syms]
     {
-      $$ = symbol_list_type_set ($syms, $TAG, @TAG);
+      $$ = symbol_list_type_set ($syms, $TAG);
     }
 | token_decls TAG token_decl.1[syms]
     {
-      $$ = symbol_list_append ($1, symbol_list_type_set ($syms, $TAG, @TAG));
+      $$ = symbol_list_append ($1, symbol_list_type_set ($syms, $TAG));
     }
 ;
 
@@ -532,12 +551,12 @@
 
 // One symbol declaration for %token or %nterm.
 token_decl:
-  id int.opt[num] string_as_id.opt[alias]
+  id int.opt[num] alias
     {
       $$ = $id;
       symbol_class_set ($id, current_class, @id, true);
       if (0 <= $num)
-        symbol_user_token_number_set ($id, $num, @num);
+        symbol_code_set ($id, $num, @num);
       if ($alias)
         symbol_make_alias ($id, $alias, @alias);
     }
@@ -546,9 +565,22 @@
 %type <int> int.opt;
 int.opt:
   %empty  { $$ = -1; }
-| INT
+| INT_LITERAL
 ;
 
+%type <symbol*> alias;
+alias:
+  %empty         { $$ = NULL; }
+| string_as_id   { $$ = $1; }
+| TSTRING
+    {
+      $$ = symbol_get ($1, @1);
+      symbol_class_set ($$, token_sym, @1, false);
+      $$->translatable = true;
+    }
+;
+
+
 /*-------------------------------------.
 | token_decls_for_prec (%left, etc.).  |
 `-------------------------------------*/
@@ -564,11 +596,11 @@
     }
 | TAG token_decl_for_prec.1[syms]
     {
-      $$ = symbol_list_type_set ($syms, $TAG, @TAG);
+      $$ = symbol_list_type_set ($syms, $TAG);
     }
 | token_decls_for_prec TAG token_decl_for_prec.1[syms]
     {
-      $$ = symbol_list_append ($1, symbol_list_type_set ($syms, $TAG, @TAG));
+      $$ = symbol_list_append ($1, symbol_list_type_set ($syms, $TAG));
     }
 ;
 
@@ -586,7 +618,7 @@
       $$ = $id;
       symbol_class_set ($id, token_sym, @id, false);
       if (0 <= $num)
-        symbol_user_token_number_set ($id, $num, @num);
+        symbol_code_set ($id, $num, @num);
     }
 | string_as_id
 ;
@@ -598,30 +630,32 @@
 
 // A non empty list of typed symbols (for %type).
 symbol_decls:
-  symbol_decl.1[syms]
+  symbols.1[syms]
     {
       $$ = $syms;
     }
-| TAG symbol_decl.1[syms]
+| TAG symbols.1[syms]
     {
-      $$ = symbol_list_type_set ($syms, $TAG, @TAG);
+      $$ = symbol_list_type_set ($syms, $TAG);
     }
-| symbol_decls TAG symbol_decl.1[syms]
+| symbol_decls TAG symbols.1[syms]
     {
-      $$ = symbol_list_append ($1, symbol_list_type_set ($syms, $TAG, @TAG));
+      $$ = symbol_list_append ($1, symbol_list_type_set ($syms, $TAG));
     }
 ;
 
-// One or more token declarations (for %type).
-symbol_decl.1:
+// One or more symbols.
+symbols.1:
   symbol
     {
-      symbol_class_set ($symbol, pct_type_sym, @symbol, false);
+      if (current_class != unknown_sym)
+        symbol_class_set ($symbol, current_class, @symbol, false);
       $$ = symbol_list_sym_new ($symbol, @symbol);
     }
-  | symbol_decl.1 symbol
+  | symbols.1 symbol
     {
-      symbol_class_set ($symbol, pct_type_sym, @symbol, false);
+      if (current_class != unknown_sym)
+        symbol_class_set ($symbol, current_class, @symbol, false);
       $$ = symbol_list_append ($1, symbol_list_sym_new ($symbol, @symbol));
     }
 ;
@@ -667,21 +701,21 @@
                                   current_lhs_named_ref); }
 | rhs symbol named_ref.opt
     { grammar_current_rule_symbol_append ($2, @2, $3); }
-| rhs tag.opt "{...}"[act] named_ref.opt[name]
-    { grammar_current_rule_action_append ($act, @act, $name, $[tag.opt]); }
+| rhs tag.opt "{...}"[action] named_ref.opt[name]
+    { grammar_current_rule_action_append ($action, @action, $name, $[tag.opt]); }
 | rhs "%?{...}"
     { grammar_current_rule_predicate_append ($2, @2); }
 | rhs "%empty"
     { grammar_current_rule_empty_set (@2); }
 | rhs "%prec" symbol
     { grammar_current_rule_prec_set ($3, @3); }
-| rhs "%dprec" INT
+| rhs "%dprec" INT_LITERAL
     { grammar_current_rule_dprec_set ($3, @3); }
 | rhs "%merge" TAG
     { grammar_current_rule_merge_set ($3, @3); }
-| rhs "%expect" INT
+| rhs "%expect" INT_LITERAL
     { grammar_current_rule_expect_sr ($3, @3); }
-| rhs "%expect-rr" INT
+| rhs "%expect-rr" INT_LITERAL
     { grammar_current_rule_expect_rr ($3, @3); }
 ;
 
@@ -722,8 +756,8 @@
 value:
   %empty  { $$.kind = muscle_keyword; $$.chars = ""; }
 | ID      { $$.kind = muscle_keyword; $$.chars = $1; }
-| STRING  { $$.kind = muscle_string;  $$.chars = $1; }
-| "{...}" { $$.kind = muscle_code;    $$.chars = strip_braces ($1); }
+| STRING  { $$.kind = muscle_string;  $$.chars = unquote ($1); gram_scanner_last_string_free ();}
+| "{...}" { $$.kind = muscle_code;    $$.chars = strip_braces ($1); gram_scanner_last_string_free (); }
 ;
 
 
@@ -737,7 +771,7 @@
 id:
   ID
     { $$ = symbol_from_uniqstr ($1, @1); }
-| CHAR
+| CHAR_LITERAL
     {
       const char *var = "api.token.raw";
       if (current_class == nterm_sym)
@@ -748,18 +782,15 @@
         }
       if (muscle_percent_define_ifdef (var))
         {
-          int indent = 0;
-          complain_indent (&@1, complaint, &indent,
-                           _("character literals cannot be used together"
-                             " with %s"), var);
-          indent += SUB_INDENT;
+          complain (&@1, complaint,
+                    _("character literals cannot be used together"
+                    " with %s"), var);
           location loc = muscle_percent_define_get_loc (var);
-          complain_indent (&loc, complaint, &indent,
-                           _("definition of %s"), var);
+          subcomplain (&loc, complaint, _("definition of %s"), var);
         }
       $$ = symbol_get (char_name ($1), @1);
       symbol_class_set ($$, token_sym, @1, false);
-      symbol_user_token_number_set ($$, $1, @1);
+      symbol_code_set ($$, $1, @1);
     }
 ;
 
@@ -773,21 +804,15 @@
 | string_as_id
 ;
 
-/* A string used as an ID: quote it.  */
+/* A string used as an ID.  */
 string_as_id:
   STRING
     {
-      $$ = symbol_get (quotearg_style (c_quoting_style, $1), @1);
+      $$ = symbol_get ($1, @1);
       symbol_class_set ($$, token_sym, @1, false);
     }
 ;
 
-%type <symbol*> string_as_id.opt;
-string_as_id.opt:
-  %empty             { $$ = NULL; }
-| string_as_id
-;
-
 epilogue.opt:
   %empty
 | "%%" EPILOGUE
@@ -799,6 +824,32 @@
 
 %%
 
+int
+yyreport_syntax_error (const yypcontext_t *ctx)
+{
+  int res = 0;
+  /* Arguments of format: reported tokens (one for the "unexpected",
+     one per "expected"). */
+  enum { ARGS_MAX = 5 };
+  const char *argv[ARGS_MAX];
+  int argc = 0;
+  yysymbol_kind_t unexpected = yypcontext_token (ctx);
+  if (unexpected != YYSYMBOL_YYEMPTY)
+    {
+      argv[argc++] = yysymbol_name (unexpected);
+      yysymbol_kind_t expected[ARGS_MAX - 1];
+      int nexpected = yypcontext_expected_tokens (ctx, expected, ARGS_MAX - 1);
+      if (nexpected < 0)
+        res = nexpected;
+      else
+        for (int i = 0; i < nexpected; ++i)
+          argv[argc++] = yysymbol_name (expected[i]);
+    }
+  syntax_error (*yypcontext_location (ctx), argc, argv);
+  return res;
+}
+
+
 /* Return the location of the left-hand side of a rule whose
    right-hand side is RHS[1] ... RHS[N].  Ignore empty nonterminals in
    the right-hand side, and return an empty location equal to the end
@@ -902,6 +953,20 @@
 
 
 static void
+handle_header (char const *value)
+{
+  header_flag = true;
+  if (value)
+    {
+      char *file = unquote (value);
+      spec_header_file = xstrdup (file);
+      gram_scanner_last_string_free ();
+      unquote_free (file);
+    }
+}
+
+
+static void
 handle_error_verbose (location const *loc, char const *directive)
 {
   bison_directive (loc, directive);
@@ -913,8 +978,9 @@
 static void
 handle_file_prefix (location const *loc,
                     location const *dir_loc,
-                    char const *directive, char const *value)
+                    char const *directive, char const *value_quoted)
 {
+  char *value = unquote (value_quoted);
   bison_directive (loc, directive);
   bool warned = false;
 
@@ -934,11 +1000,18 @@
     deprecated_directive (dir_loc, directive, "%file-prefix");
 }
 
+static void
+handle_language (location const *loc, char const *lang)
+{
+  language_argmatch (unquote (lang), grammar_prio, *loc);
+}
+
 
 static void
 handle_name_prefix (location const *loc,
-                    char const *directive, char const *value)
+                    char const *directive, char const *value_quoted)
 {
+  char *value = unquote (value_quoted);
   bison_directive (loc, directive);
 
   char buf1[1024];
@@ -979,65 +1052,37 @@
 }
 
 
-/* Convert VERSION into an int (MAJOR * 100 + MINOR).  Return -1 on
-   errors.
-
-   Changes of behavior are only on minor version changes, so "3.0.5"
-   is the same as "3.0": 300. */
-static int
-str_to_version (char const *version)
-{
-  IGNORE_TYPE_LIMITS_BEGIN
-  int res = 0;
-  errno = 0;
-  char *cp = NULL;
-  long major = strtol (version, &cp, 10);
-  if (errno || cp == version || *cp != '.' || major < 0
-      || INT_MULTIPLY_WRAPV (major, 100, &res))
-    return -1;
-
-  ++cp;
-  char *cp1 = NULL;
-  long minor = strtol (cp, &cp1, 10);
-  if (errno || cp1 == cp || (*cp1 != '\0' && *cp1 != '.')
-      || ! (0 <= minor && minor < 100)
-      || INT_ADD_WRAPV (minor, res, &res))
-    return -1;
-
-  IGNORE_TYPE_LIMITS_END
-  return res;
-}
-
-
 static void
-handle_require (location const *loc, char const *version)
+handle_require (location const *loc, char const *version_quoted)
 {
-  required_version = str_to_version (version);
+  char *version = unquote (version_quoted);
+  required_version = strversion_to_int (version);
   if (required_version == -1)
     {
       complain (loc, complaint, _("invalid version requirement: %s"),
                 version);
       required_version = 0;
-      return;
     }
-
-  /* Pretend to be at least 3.5, to check features published in that
-     version while developping it.  */
-  const char* api_version = "3.5";
-  const char* package_version =
-    0 < strverscmp (api_version, PACKAGE_VERSION)
-    ? api_version : PACKAGE_VERSION;
-  if (0 < strverscmp (version, package_version))
+  else
     {
-      complain (loc, complaint, _("require bison %s, but have %s"),
-                version, package_version);
-      exit (EX_MISMATCH);
+      const char* package_version =
+        0 < strverscmp (api_version, PACKAGE_VERSION)
+        ? api_version : PACKAGE_VERSION;
+      if (0 < strverscmp (version, package_version))
+        {
+          complain (loc, complaint, _("require bison %s, but have %s"),
+                    version, package_version);
+          exit (EX_MISMATCH);
+        }
     }
+  unquote_free (version);
+  gram_scanner_last_string_free ();
 }
 
 static void
-handle_skeleton (location const *loc, char const *skel)
+handle_skeleton (location const *loc, char const *skel_quoted)
 {
+  char *skel = unquote (skel_quoted);
   char const *skeleton_user = skel;
   if (strchr (skeleton_user, '/'))
     {
@@ -1067,7 +1112,7 @@
   const char *directive = "%yacc";
   bison_directive (loc, directive);
   if (location_empty (yacc_loc))
-    yacc_loc = *loc;
+    set_yacc (*loc);
   else
     duplicate_directive (directive, yacc_loc, *loc);
 }
@@ -1092,8 +1137,7 @@
     }
 }
 
-static
-void
+static void
 current_lhs (symbol *sym, location loc, named_ref *ref)
 {
   current_lhs_symbol = sym;
@@ -1118,3 +1162,95 @@
 {
   end_use_class ("value", yyo);
 }
+
+
+/*----------.
+| Unquote.  |
+`----------*/
+
+struct obstack obstack_for_unquote;
+
+void
+parser_init (void)
+{
+  obstack_init (&obstack_for_unquote);
+}
+
+void
+parser_free (void)
+{
+  obstack_free (&obstack_for_unquote, 0);
+}
+
+static void
+unquote_free (char *last_string)
+{
+  obstack_free (&obstack_for_unquote, last_string);
+}
+
+static char *
+unquote (const char *cp)
+{
+#define GROW(Char)                              \
+  obstack_1grow (&obstack_for_unquote, Char);
+  for (++cp; *cp && *cp != '"'; ++cp)
+    switch (*cp)
+      {
+      case '"':
+        break;
+      case '\\':
+        ++cp;
+        switch (*cp)
+          {
+          case '0': case '1': case '2': case '3': case '4':
+          case '5': case '6': case '7': case '8': case '9':
+            {
+              int c = cp[0] - '0';
+              if (c_isdigit (cp[1]))
+                {
+                  ++cp;
+                  c = c * 8 + cp[0] - '0';
+                }
+              if (c_isdigit (cp[1]))
+                {
+                  ++cp;
+                  c = c * 8 + cp[0] - '0';
+                }
+              GROW (c);
+            }
+            break;
+
+          case 'a': GROW ('\a'); break;
+          case 'b': GROW ('\b'); break;
+          case 'f': GROW ('\f'); break;
+          case 'n': GROW ('\n'); break;
+          case 'r': GROW ('\r'); break;
+          case 't': GROW ('\t'); break;
+          case 'v': GROW ('\v'); break;
+
+          case 'x':
+            {
+              int c = 0;
+              while (c_isxdigit (cp[1]))
+                {
+                  ++cp;
+                  c = (c * 16 + (c_isdigit (cp[0]) ? cp[0] - '0'
+                                 : c_isupper (cp[0]) ? cp[0] - 'A'
+                                 : cp[0] - '0'));
+                }
+              GROW (c);
+              break;
+            }
+          }
+        break;
+
+      default:
+        GROW (*cp);
+        break;
+      }
+  assert (*cp == '"');
+  ++cp;
+  assert (*cp == '\0');
+#undef GROW
+  return obstack_finish0 (&obstack_for_unquote);
+}
diff --git a/src/parse-simulation.c b/src/parse-simulation.c
new file mode 100644
index 0000000..57b0951
--- /dev/null
+++ b/src/parse-simulation.c
@@ -0,0 +1,600 @@
+/* Parser simulator for unifying counterexample search
+
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "parse-simulation.h"
+
+#include <gl_linked_list.h>
+#include <gl_xlist.h>
+#include <stdlib.h>
+
+#include "lssi.h"
+#include "nullable.h"
+
+struct parse_state
+{
+  // Path of state-items the parser has traversed.
+  struct si_chunk
+  {
+    // Elements newly added in this chunk.
+    state_item_list contents;
+    // Properties of the linked list this chunk represents.
+    const state_item *head_elt;
+    const state_item *tail_elt;
+    size_t total_size;
+  } state_items;
+  // List of derivations of the symbols.
+  struct deriv_chunk
+  {
+    derivation_list contents;
+    const derivation *head_elt;
+    const derivation *tail_elt;
+    size_t total_size;
+  } derivs;
+  struct parse_state *parent;
+  int reference_count;
+  // Incremented during productions, decremented during reductions.
+  int depth;
+  // Whether the contents of the chunks should be prepended or
+  // appended to the list the chunks represent.
+  bool prepend;
+  // Causes chunk contents to be freed when the reference count is
+  // one. Used when only the chunk metadata will be needed.
+  bool free_contents_early;
+};
+
+
+static void
+ps_si_prepend (parse_state *ps, const state_item *si)
+{
+  struct si_chunk *sic = &ps->state_items;
+  gl_list_add_first (sic->contents, si);
+  sic->head_elt = si;
+  ++sic->total_size;
+  if (!sic->tail_elt)
+    sic->tail_elt = si;
+}
+
+static void
+ps_si_append (parse_state *ps, const state_item *si)
+{
+  struct si_chunk *sic = &ps->state_items;
+  gl_list_add_last (sic->contents, si);
+  sic->tail_elt = si;
+  ++sic->total_size;
+  if (!sic->head_elt)
+    sic->head_elt = si;
+}
+
+static void
+ps_derivs_prepend (parse_state *ps, derivation *d)
+{
+  struct deriv_chunk *dc = &ps->derivs;
+  derivation_list_prepend (dc->contents, d);
+  dc->head_elt = d;
+  ++dc->total_size;
+  if (!dc->tail_elt)
+    dc->tail_elt = d;
+}
+
+static void
+ps_derivs_append (parse_state *ps, derivation *d)
+{
+  struct deriv_chunk *dc = &ps->derivs;
+  derivation_list_append (dc->contents, d);
+  dc->tail_elt = d;
+  ++dc->total_size;
+  if (!dc->head_elt)
+    dc->head_elt = d;
+}
+
+static int allocs = 0;
+static int frees = 0;
+
+static parse_state *
+empty_parse_state (void)
+{
+  parse_state *res = xcalloc (1, sizeof *res);
+  res->state_items.contents
+    = gl_list_create_empty (GL_LINKED_LIST, NULL, NULL, NULL, true);
+  res->derivs.contents = derivation_list_new ();
+  ++allocs;
+  return res;
+}
+
+parse_state *
+new_parse_state (const state_item *si)
+{
+  parse_state *res = empty_parse_state ();
+  ps_si_append (res, si);
+  ps_derivs_append (res, derivation_dot ());
+  return res;
+}
+
+static parse_state *
+copy_parse_state (bool prepend, parse_state *parent)
+{
+  parse_state *res = xmalloc (sizeof *res);
+  *res = *parent;
+  res->state_items.contents
+    = gl_list_create_empty (GL_LINKED_LIST, NULL, NULL, NULL, true);
+  res->derivs.contents = derivation_list_new ();
+  res->parent = parent;
+  res->prepend = prepend;
+  res->reference_count = 0;
+  res->free_contents_early = false;
+  parse_state_retain (parent);
+  ++allocs;
+  return res;
+}
+
+bool
+parse_state_derivation_completed (const parse_state *ps)
+{
+  return ps->derivs.total_size == 1;
+}
+
+derivation *
+parse_state_derivation (const parse_state *ps)
+{
+  return (derivation *) ps->derivs.head_elt;
+}
+
+const state_item *
+parse_state_head (const parse_state *ps)
+{
+  return ps->state_items.head_elt;
+}
+
+const state_item *
+parse_state_tail (const parse_state *ps)
+{
+  return ps->state_items.tail_elt;
+}
+
+int
+parse_state_length (const parse_state *ps)
+{
+  return ps->state_items.total_size;
+}
+
+int
+parse_state_depth (const parse_state *ps)
+{
+  return ps->depth;
+}
+
+void
+parse_state_retain (parse_state *ps)
+{
+  ++ps->reference_count;
+}
+
+void
+parse_state_free_contents_early (parse_state *ps)
+{
+  ps->free_contents_early = true;
+}
+
+void
+free_parse_state (parse_state *original_ps)
+{
+  bool free_contents = true;
+  parse_state *parent_ps = NULL;
+  for (parse_state *ps = original_ps; ps && free_contents; ps = parent_ps)
+    {
+      --ps->reference_count;
+      free_contents = (ps->reference_count == 1 && ps->free_contents_early)
+        || (ps->reference_count == 0 && !ps->free_contents_early);
+      // need to keep the parse state around for visited hash set,
+      // but its contents and parent can be freed
+      if (free_contents)
+        {
+          if (ps->state_items.contents)
+            gl_list_free (ps->state_items.contents);
+          if (ps->derivs.contents)
+            derivation_list_free (ps->derivs.contents);
+        }
+      parent_ps = ps->parent;
+      if (ps->reference_count <= 0)
+        {
+          free (ps);
+          ++frees;
+        }
+    }
+}
+
+size_t
+parse_state_hasher (const parse_state *ps, size_t max)
+{
+  const struct si_chunk *sis = &ps->state_items;
+  return ((state_item *) sis->head_elt - state_items +
+          (state_item *) sis->tail_elt - state_items + sis->total_size) % max;
+}
+
+bool
+parse_state_comparator (const parse_state *ps1, const parse_state *ps2)
+{
+  const struct si_chunk *sis1 = &ps1->state_items;
+  const struct si_chunk *sis2 = &ps2->state_items;
+  return sis1->head_elt == sis2->head_elt
+    && sis1->tail_elt == sis2->tail_elt
+    && sis1->total_size == sis2->total_size;
+}
+
+
+void
+parse_state_completed_steps (const parse_state *ps, int *shifts, int *productions)
+{
+  // traverse to the root parse_state,
+  // which will have a list of all completed productions.
+  const parse_state *root_ps = ps;
+  while (root_ps->parent)
+    root_ps = root_ps->parent;
+
+  state_item_list sis = root_ps->state_items.contents;
+  int count = 0;
+
+  state_item *last = NULL;
+  state_item *next = NULL;
+  for (gl_list_iterator_t it = gl_list_iterator (sis);
+       state_item_list_next (&it, &next);
+       )
+    {
+      if (last && last->state == next->state)
+        ++count;
+      last = next;
+    }
+  *productions = count;
+  *shifts = root_ps->state_items.total_size - count;
+}
+
+typedef void (*chunk_append_fn) (gl_list_t, const void *);
+
+// A version of gl_list_add_last which has the chunk_append_fn
+// signature.
+static void
+list_add_last (gl_list_t list, const void *elt)
+{
+  gl_list_add_last (list, elt);
+}
+
+// takes an array of n gl_lists and flattens them into two list
+// based off of the index split
+static void
+list_flatten_and_split (gl_list_t *list, gl_list_t *rets, int split, int n,
+                        chunk_append_fn append_fn)
+{
+  int ret_index = 0;
+  int ret_array = 0;
+  for (int i = 0; i < n; ++i)
+    {
+      const void *p = NULL;
+      gl_list_iterator_t it = gl_list_iterator (list[i]);
+      while (gl_list_iterator_next (&it, &p, NULL))
+        if (p)
+          {
+            gl_list_t l = (gl_list_t) p;
+            const void *si = NULL;
+            gl_list_iterator_t it2 = gl_list_iterator (l);
+            while (gl_list_iterator_next (&it2, &si, NULL))
+              {
+                if (ret_index++ == split)
+                  ++ret_array;
+                if (rets[ret_array])
+                  append_fn (rets[ret_array], si);
+              }
+            gl_list_iterator_free (&it2);
+          }
+      gl_list_iterator_free (&it);
+    }
+}
+
+static parse_state_list
+parse_state_list_new (void)
+{
+  return gl_list_create_empty (GL_LINKED_LIST, NULL, NULL,
+                               (gl_listelement_dispose_fn)free_parse_state,
+                               true);
+}
+
+static void
+parse_state_list_append (parse_state_list pl, parse_state *ps)
+{
+  parse_state_retain (ps);
+  gl_list_add_last (pl, ps);
+}
+
+// Emulates a reduction on a parse state by popping some amount of
+// derivations and state_items off of the parse_state and returning
+// the result in ret. Returns the derivation of what's popped.
+static derivation_list
+parser_pop (parse_state *ps, int deriv_index,
+            int si_index, parse_state *ret)
+{
+  // prepend sis, append sis, prepend derivs, append derivs
+  gl_list_t chunks[4];
+  for (int i = 0; i < 4; ++i)
+    chunks[i] = gl_list_create_empty (GL_LINKED_LIST, NULL, NULL, NULL, true);
+  for (parse_state *pn = ps; pn != NULL; pn = pn->parent)
+    if (pn->prepend)
+      {
+        gl_list_add_last (chunks[0], pn->state_items.contents);
+        gl_list_add_last (chunks[2], pn->derivs.contents);
+      }
+    else
+      {
+        gl_list_add_first (chunks[1], pn->state_items.contents);
+        gl_list_add_first (chunks[3], pn->derivs.contents);
+      }
+  derivation_list popped_derivs = derivation_list_new ();
+  gl_list_t ret_chunks[4] = { ret->state_items.contents, NULL,
+    ret->derivs.contents, popped_derivs
+  };
+  list_flatten_and_split (chunks, ret_chunks, si_index, 2,
+                          list_add_last);
+  list_flatten_and_split (chunks + 2, ret_chunks + 2, deriv_index, 2,
+                          (chunk_append_fn)derivation_list_append);
+  size_t s_size = gl_list_size (ret->state_items.contents);
+  ret->state_items.total_size = s_size;
+  if (s_size > 0)
+    {
+      ret->state_items.tail_elt = gl_list_get_at (ret->state_items.contents,
+                                                  s_size - 1);
+      ret->state_items.head_elt =
+        gl_list_get_at (ret->state_items.contents, 0);
+    }
+  else
+    {
+      ret->state_items.tail_elt = NULL;
+      ret->state_items.head_elt = NULL;
+    }
+  size_t d_size = gl_list_size (ret->derivs.contents);
+  ret->derivs.total_size = d_size;
+  if (d_size > 0)
+    {
+      ret->derivs.tail_elt = gl_list_get_at (ret->derivs.contents,
+                                             d_size - 1);
+      ret->derivs.head_elt = gl_list_get_at (ret->derivs.contents, 0);
+    }
+  else
+    {
+      ret->derivs.tail_elt = NULL;
+      ret->derivs.head_elt = NULL;
+    }
+  for (int i = 0; i < 4; ++i)
+    gl_list_free (chunks[i]);
+  return popped_derivs;
+}
+
+void
+parse_state_lists (parse_state *ps, state_item_list *sitems,
+                   derivation_list *derivs)
+{
+  parse_state *temp = empty_parse_state ();
+  size_t si_size = ps->state_items.total_size;
+  size_t deriv_size = ps->derivs.total_size;
+  derivation_list dl = parser_pop (ps, si_size, deriv_size, temp);
+  *sitems = temp->state_items.contents;
+  *derivs = temp->derivs.contents;
+  // prevent the return lists from being freed
+  temp->state_items.contents = NULL;
+  temp->derivs.contents = NULL;
+  free_parse_state (temp);
+  derivation_list_free (dl);
+}
+
+/**
+ * Compute the parse states that result from taking a transition on
+ * nullable symbols whenever possible from the given state_item.
+ */
+static void
+nullable_closure (parse_state *ps, state_item *si, parse_state_list state_list)
+{
+  parse_state *current_ps = ps;
+  state_item_number prev_sin = si - state_items;
+  for (state_item_number sin = si->trans; sin != -1;
+       prev_sin = sin, sin = state_items[sin].trans)
+    {
+      state_item *psi = &state_items[prev_sin];
+      symbol_number sp = item_number_as_symbol_number (*psi->item);
+      if (ISTOKEN (sp) || !nullable[sp - ntokens])
+        break;
+
+      state_item *nsi = &state_items[sin];
+      current_ps = copy_parse_state (false, current_ps);
+      ps_si_append (current_ps, nsi);
+      ps_derivs_append (current_ps,
+                        derivation_new (sp, derivation_list_new (),
+                                        state_item_rule (nsi)));
+      parse_state_list_append (state_list, current_ps);
+    }
+}
+
+parse_state_list
+simulate_transition (parse_state *ps)
+{
+  const state_item *si = ps->state_items.tail_elt;
+  symbol_number sym = item_number_as_symbol_number (*si->item);
+  // Transition on the same next symbol, taking nullable
+  // symbols into account.
+  parse_state_list result = parse_state_list_new ();
+  state_item_number si_next = si->trans;
+  // Check for disabled transition, shouldn't happen as any
+  // state_items that lead to these should be disabled.
+  if (si_next < 0)
+    return result;
+  parse_state *next_ps = copy_parse_state (false, ps);
+  ps_si_append (next_ps, &state_items[si_next]);
+  ps_derivs_append (next_ps, derivation_new_leaf (sym));
+  parse_state_list_append (result, next_ps);
+
+  nullable_closure (next_ps, &state_items[si_next], result);
+  return result;
+}
+
+/**
+ * Determine if the given symbols are equal or their first sets
+ * intersect.
+ */
+static bool
+compatible (symbol_number sym1, symbol_number sym2)
+{
+  if (sym1 == sym2)
+    return true;
+  if (ISTOKEN (sym1) && ISVAR (sym2))
+    return bitset_test (FIRSTS (sym2), sym1);
+  else if (ISVAR (sym1) && ISTOKEN (sym2))
+    return bitset_test (FIRSTS (sym1), sym2);
+  else if (ISVAR (sym1) && ISVAR (sym2))
+    return !bitset_disjoint_p (FIRSTS (sym1), FIRSTS (sym2));
+  else
+    return false;
+}
+
+parse_state_list
+simulate_production (parse_state *ps, symbol_number compat_sym)
+{
+  parse_state_list result = parse_state_list_new ();
+  const state_item *si = parse_state_tail (ps);
+  if (si->prods)
+    {
+      bitset_iterator biter;
+      state_item_number sin;
+      BITSET_FOR_EACH (biter, si->prods, sin, 0)
+        {
+          // Take production step only if lhs is not nullable and
+          // if first rhs symbol is compatible with compat_sym
+          state_item *next = &state_items[sin];
+          item_number *itm1 = next->item;
+          if (!compatible (*itm1, compat_sym) || !production_allowed (si, next))
+            continue;
+          parse_state *next_ps = copy_parse_state (false, ps);
+          ps_si_append (next_ps, next);
+          parse_state_list_append (result, next_ps);
+          if (next_ps->depth >= 0)
+            ++next_ps->depth;
+          nullable_closure (next_ps, next, result);
+        }
+    }
+  return result;
+}
+
+// simulates a reduction on the given parse state, conflict_item is the
+// item associated with ps's conflict. symbol_set is a lookahead set this
+// reduction must be compatible with
+parse_state_list
+simulate_reduction (parse_state *ps, int rule_len, bitset symbol_set)
+{
+  parse_state_list result = parse_state_list_new ();
+
+  int s_size = ps->state_items.total_size;
+  int d_size = ps->derivs.total_size;
+  if (ps->depth >= 0)
+    d_size--;                   // account for dot
+  parse_state *new_root = empty_parse_state ();
+  derivation_list popped_derivs =
+    parser_pop (ps, d_size - rule_len,
+                s_size - rule_len - 1, new_root);
+
+  // update derivation
+  state_item *si = (state_item *) ps->state_items.tail_elt;
+  const rule *r = item_rule (si->item);
+  symbol_number lhs = r->lhs->number;
+  derivation *deriv = derivation_new (lhs, popped_derivs, state_item_rule (si));
+  --new_root->depth;
+  ps_derivs_append (new_root, deriv);
+
+  if (s_size != rule_len + 1)
+    {
+      state_item *tail = (state_item *) new_root->state_items.tail_elt;
+      ps_si_append (new_root, &state_items[tail->trans]);
+      parse_state_list_append (result, new_root);
+    }
+  else
+    {
+      // The head state_item is a production item, so we need to prepend
+      // with possible source state-items.
+      const state_item *head = ps->state_items.head_elt;
+      state_item_list prev = lssi_reverse_production (head, symbol_set);
+      // TODO: better understand what causes this case.
+      if (gl_list_size (prev) == 0)
+        {
+          // new_root needs to have an RC of 1 to be freed correctly here.
+          parse_state_retain (new_root);
+          free_parse_state (new_root);
+        }
+      else
+        {
+          state_item *psis = NULL;
+          for (gl_list_iterator_t it = gl_list_iterator (prev);
+               state_item_list_next (&it, &psis);
+               )
+            {
+              // Prepend the result from the reverse production.
+              parse_state *copy = copy_parse_state (true, new_root);
+              ps_si_prepend (copy, psis);
+
+              // Append the left hand side to the end of the parser state
+              copy = copy_parse_state (false, copy);
+              struct si_chunk *sis = &copy->state_items;
+              const state_item *tail = sis->tail_elt;
+              ps_si_append (copy, &state_items[tail->trans]);
+              parse_state_list_append (result, copy);
+              nullable_closure (copy, (state_item *) sis->tail_elt, result);
+            }
+        }
+      gl_list_free (prev);
+    }
+  return result;
+}
+
+parse_state_list
+parser_prepend (parse_state *ps)
+{
+  parse_state_list res = parse_state_list_new ();
+  const state_item *head = ps->state_items.head_elt;
+  symbol_number prepend_sym =
+    item_number_as_symbol_number (*(head->item - 1));
+  bitset_iterator biter;
+  state_item_number sin;
+  BITSET_FOR_EACH (biter, head->revs, sin, 0)
+  {
+    parse_state *copy = copy_parse_state (true, ps);
+    ps_si_prepend (copy, &state_items[sin]);
+    if (SI_TRANSITION (head))
+      ps_derivs_prepend (copy, derivation_new_leaf (prepend_sym));
+    parse_state_list_append (res, copy);
+  }
+  return res;
+}
+
+void
+print_parse_state (parse_state *ps)
+{
+  FILE *out = stderr;
+  fprintf (out, "(size %zu depth %d rc %d)\n",
+          ps->state_items.total_size, ps->depth, ps->reference_count);
+  state_item_print (ps->state_items.head_elt, out, "");
+  state_item_print (ps->state_items.tail_elt, out, "");
+  if (ps->derivs.total_size > 0)
+    derivation_print (ps->derivs.head_elt, out, "");
+  putc ('\n', out);
+}
diff --git a/src/parse-simulation.h b/src/parse-simulation.h
new file mode 100644
index 0000000..aa8f84e
--- /dev/null
+++ b/src/parse-simulation.h
@@ -0,0 +1,146 @@
+/* Parser simulator for unifying counterexample search
+
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef PARSE_SIMULATION_H
+# define PARSE_SIMULATION_H
+
+# include <stdio.h>
+# include <gl_xlist.h>
+
+# include "derivation.h"
+# include "state-item.h"
+
+/*
+  Simulating states of the parser:
+  Each state is an array of state-items and an array of derivations.
+  Each consecutive state-item represents a transition/goto or production,
+  and the derivations are the derivation trees associated with the symbols
+  transitioned on each step. In more detail:
+
+  Parse states are stored as a tree. Each new parse state contains two "chunks,"
+  one corresponding to its state-items and the other corresponding to its derivations.
+  Chunks only have new elements which weren't present in its parent.
+  Each chunk also stores the head, tail, and total_size of the list it represents.
+  So if a parse state was to be copied it retains the list metadata but its
+  contents are empty.
+
+  A transition gets the state-item which the last state-item of the parse state
+  transitions to. This is appended to the state-item list, and a derivation with
+  just the symbol being transitioned on is appended to the derivation list.
+  A production appends the new state-item, but does not have a derivation
+  associated with it.
+
+  A reduction looks at the rule of the last state-item in the state, and pops
+  the last few state-items that make up the rhs of the rule along with their
+  derivations. The derivations become the derivation of the lhs which is then
+  shifted over.
+
+  Effectively, every time a derivation is appended, it represents a shift in
+  the parser. So a parse state that contains
+   start: A . B C D
+   start: A B C D .
+  and the state-items in between will represent a parser that has BCD on the
+  parse stack.
+
+  However, the above example cannot be reduced, as it's missing A.
+  Since we start at a state-item that can have a dot in the middle of a rule,
+  it's necessary to support a prepend operation. Luckily the prepend operations
+  are very similar to transitions and productions with the difference being that
+  they operate on the head of the state-item list instead of the tail.
+
+  A production
+  A transition gets the state-item which the last state-item of the parse state
+  transitions to. This is appended to the state-item list, and a derivation with
+  just the symbol being transitioned on is appended to the derivation list.
+
+ */
+
+typedef struct parse_state parse_state;
+typedef gl_list_t parse_state_list;
+
+static inline bool
+parse_state_list_next (gl_list_iterator_t *it, parse_state **ps)
+{
+  const void *p = NULL;
+  bool res = gl_list_iterator_next (it, &p, NULL);
+  if (res)
+    *ps = (parse_state *) p;
+  else
+    gl_list_iterator_free (it);
+  return res;
+}
+
+parse_state *new_parse_state (const state_item *conflict);
+
+size_t parse_state_hasher (const parse_state *ps, size_t max);
+
+bool parse_state_comparator (const parse_state *ps1, const parse_state *ps2);
+
+/* Memory management */
+
+void parse_state_retain (parse_state *ps);
+/* This allows a parse_state to free its contents list
+ * when its reference count reaches 1. This is used to
+ * free memory while the parse state is in a hash set. */
+void parse_state_free_contents_early (parse_state *ps);
+void free_parse_state (parse_state *ps);
+
+/* counts the amount of shift and production steps in this parse state */
+void parse_state_completed_steps (const parse_state *ps, int *shifts, int *productions);
+
+/* parse state getters */
+bool parse_state_derivation_completed (const parse_state *ps);
+derivation *parse_state_derivation (const parse_state *ps);
+const state_item *parse_state_head (const parse_state *ps);
+const state_item *parse_state_tail (const parse_state *ps);
+int parse_state_length (const parse_state *ps);
+int parse_state_depth (const parse_state *ps);
+
+/* returns the linked lists that the parse state is supposed to represent */
+void parse_state_lists (parse_state *ps, state_item_list *state_items,
+                        derivation_list *derivs);
+
+/* various functions that return a list of states based off of
+ * whatever operation is simulated. After whatever operation, every possible
+ * transition on nullable nonterminals will be added to the returned list. */
+
+/* Look at the tail state-item of the parse state and transition on the symbol
+ * after its dot. The symbol gets added to derivs, and the resulting state-item
+ * is appended to state-items. */
+parse_state_list simulate_transition (parse_state *ps);
+
+/* Look at all of the productions for the nonterminal following the dot in the tail
+ * state-item. Appends to state-items each production state-item which may start with
+ * compat_sym. */
+parse_state_list simulate_production (parse_state *ps, symbol_number compat_sym);
+
+/* Removes the last rule_len state-items along with their derivations. A new state-item is
+ * appended representing the goto after the reduction. A derivation for the nonterminal that
+ * was just reduced is appended which consists of the list of derivations that were just removed. */
+parse_state_list simulate_reduction (parse_state *ps, int rule_len,
+                              bitset symbol_set);
+
+/* Generate states with a state-item prepended for each state-item that has a
+ * transition or production step to ps's head. */
+parse_state_list parser_prepend (parse_state *ps);
+
+/* For debugging traces.  */
+void print_parse_state (parse_state *ps);
+
+#endif /* PARSE_SIMULATION_H */
diff --git a/src/print-graph.c b/src/print-graph.c
index 5295268..3ddf6a5 100644
--- a/src/print-graph.c
+++ b/src/print-graph.c
@@ -1,6 +1,6 @@
 /* Output a graph of the generated parser, for Bison.
 
-   Copyright (C) 2001-2007, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2001-2007, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "print-graph.h"
@@ -47,7 +47,7 @@
 static void
 print_core (struct obstack *oout, state *s)
 {
-  item_number const *sitems = s->items;
+  item_index const *sitems = s->items;
   sym_content *previous_lhs = NULL;
   size_t snritems = s->nitems;
 
@@ -72,22 +72,31 @@
         obstack_printf (oout, "%*s| ",
                         (int) strlen (previous_lhs->symbol->tag), "");
       else
-        obstack_printf (oout, "%s: ", escape (r->lhs->symbol->tag));
+        {
+          obstack_backslash (oout, r->lhs->symbol->tag);
+          obstack_printf (oout, ": ");
+        }
       previous_lhs = r->lhs;
 
       for (item_number const *sp = r->rhs; sp < sp1; sp++)
-        obstack_printf (oout, "%s ", escape (symbols[*sp]->tag));
+        {
+          obstack_backslash (oout, symbols[*sp]->tag);
+          obstack_1grow (oout, ' ');
+        }
 
-      obstack_1grow (oout, '.');
+      obstack_sgrow (oout, "•");
 
       if (0 <= *r->rhs)
         for (item_number const *sp = sp1; 0 <= *sp; ++sp)
-          obstack_printf (oout, " %s", escape (symbols[*sp]->tag));
+          {
+            obstack_1grow (oout, ' ');
+            obstack_backslash (oout, symbols[*sp]->tag);
+          }
       else
-        obstack_printf (oout, " %%empty");
+        obstack_sgrow (oout, " %empty");
 
       /* Experimental feature: display the lookahead tokens. */
-      if (report_flag & report_lookahead_tokens
+      if (report_flag & report_lookaheads
           && item_number_is_rule_number (*sp1))
         {
           /* Find the reduction we are handling.  */
@@ -95,16 +104,16 @@
           int redno = state_reduction_find (s, r);
 
           /* Print them if there are.  */
-          if (reds->lookahead_tokens && redno != -1)
+          if (reds->lookaheads && redno != -1)
             {
               bitset_iterator biter;
               int k;
               char const *sep = "";
               obstack_sgrow (oout, "  [");
-              BITSET_FOR_EACH (biter, reds->lookahead_tokens[redno], k, 0)
+              BITSET_FOR_EACH (biter, reds->lookaheads[redno], k, 0)
                 {
                   obstack_sgrow (oout, sep);
-                  obstack_sgrow (oout, escape (symbols[k]->tag));
+                  obstack_backslash (oout, symbols[k]->tag);
                   sep = ", ";
                 }
               obstack_1grow (oout, ']');
diff --git a/src/print-graph.h b/src/print-graph.h
index a3e2b67..6aa3420 100644
--- a/src/print-graph.h
+++ b/src/print-graph.h
@@ -1,6 +1,6 @@
 /* Output a graph of the generated parser, for Bison.
 
-   Copyright (C) 2000, 2006, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2000, 2006, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef PRINT_GRAPH_H_
 # define PRINT_GRAPH_H_
diff --git a/src/print-xml.c b/src/print-xml.c
index c4dac10..78801db 100644
--- a/src/print-xml.c
+++ b/src/print-xml.c
@@ -1,6 +1,6 @@
 /* Print an xml on generated parser, for Bison,
 
-   Copyright (C) 2007, 2009-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 2007, 2009-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "print-xml.h"
@@ -27,12 +27,16 @@
 #include <stdarg.h>
 
 #include "closure.h"
+#include "complain.h"
 #include "conflicts.h"
+#include "execute.h"
 #include "files.h"
 #include "getargs.h"
 #include "gram.h"
 #include "lalr.h"
 #include "lr0.h"
+#include "muscle-tab.h"
+#include "path-join.h"
 #include "print.h"
 #include "reader.h"
 #include "reduce.h"
@@ -57,7 +61,7 @@
 static void
 print_core (FILE *out, int level, state *s)
 {
-  item_number *sitems = s->items;
+  item_index *sitems = s->items;
   size_t snritems = s->nitems;
 
   /* Output all the items of a state, not only its kernel.  */
@@ -86,12 +90,12 @@
           reductions *reds = s->reductions;
           int red = state_reduction_find (s, r);
           /* Print item with lookaheads if there are. */
-          if (reds->lookahead_tokens && red != -1)
+          if (reds->lookaheads && red != -1)
             {
               xml_printf (out, level + 1,
-                          "<item rule-number=\"%d\" point=\"%d\">",
+                          "<item rule-number=\"%d\" dot=\"%d\">",
                           r->number, sp1 - sp);
-              state_rule_lookahead_tokens_print_xml (s, r,
+              state_rule_lookaheads_print_xml (s, r,
                                                      out, level + 2);
               xml_puts (out, level + 1, "</item>");
               printed = true;
@@ -100,7 +104,7 @@
 
       if (!printed)
         xml_printf (out, level + 1,
-                    "<item rule-number=\"%d\" point=\"%d\"/>",
+                    "<item rule-number=\"%d\" dot=\"%d\"/>",
                     r->number,
                     sp1 - sp);
     }
@@ -202,26 +206,26 @@
 }
 
 
-/*-------------------------------------------------------------------------.
-| Report a reduction of RULE on LOOKAHEAD_TOKEN (which can be 'default').  |
-| If not ENABLED, the rule is masked by a shift or a reduce (S/R and       |
-| R/R conflicts).                                                          |
-`-------------------------------------------------------------------------*/
+/*-------------------------------------------------------------------.
+| Report a reduction of RULE on LOOKAHEAD (which can be 'default').  |
+| If not ENABLED, the rule is masked by a shift or a reduce (S/R and |
+| R/R conflicts).                                                    |
+`-------------------------------------------------------------------*/
 
 static void
-print_reduction (FILE *out, int level, char const *lookahead_token,
+print_reduction (FILE *out, int level, char const *lookahead,
                  rule *r, bool enabled)
 {
-  if (r->number)
+  if (rule_is_initial (r))
     xml_printf (out, level,
-                "<reduction symbol=\"%s\" rule=\"%d\" enabled=\"%s\"/>",
-                xml_escape (lookahead_token),
-                r->number,
+                "<reduction symbol=\"%s\" rule=\"accept\" enabled=\"%s\"/>",
+                xml_escape (lookahead),
                 enabled ? "true" : "false");
   else
     xml_printf (out, level,
-                "<reduction symbol=\"%s\" rule=\"accept\" enabled=\"%s\"/>",
-                xml_escape (lookahead_token),
+                "<reduction symbol=\"%s\" rule=\"%d\" enabled=\"%s\"/>",
+                xml_escape (lookahead),
+                r->number,
                 enabled ? "true" : "false");
 }
 
@@ -258,13 +262,13 @@
   if (default_reduction)
     report = true;
 
-  if (reds->lookahead_tokens)
+  if (reds->lookaheads)
     for (i = 0; i < ntokens; i++)
       {
         bool count = bitset_test (no_reduce_set, i);
 
         for (j = 0; j < reds->num; ++j)
-          if (bitset_test (reds->lookahead_tokens[j], i))
+          if (bitset_test (reds->lookaheads[j], i))
             {
               if (! count)
                 {
@@ -289,14 +293,14 @@
   xml_puts (out, level, "<reductions>");
 
   /* Report lookahead tokens (or $default) and reductions.  */
-  if (reds->lookahead_tokens)
+  if (reds->lookaheads)
     for (i = 0; i < ntokens; i++)
       {
         bool defaulted = false;
         bool count = bitset_test (no_reduce_set, i);
 
         for (j = 0; j < reds->num; ++j)
-          if (bitset_test (reds->lookahead_tokens[j], i))
+          if (bitset_test (reds->lookaheads[j], i))
             {
               if (! count)
                 {
@@ -329,7 +333,7 @@
 
 /*--------------------------------------------------------------.
 | Report on OUT all the actions (shifts, gotos, reductions, and |
-| explicit erros from %nonassoc) of S.                          |
+| explicit errors from %nonassoc) of S.                         |
 `--------------------------------------------------------------*/
 
 static void
@@ -379,17 +383,20 @@
 
   /* Terminals */
   xml_puts (out, level + 1, "<terminals>");
-  for (symbol_number i = 0; i < max_user_token_number + 1; i++)
+  for (int i = 0; i < max_code + 1; i++)
     if (token_translations[i] != undeftoken->content->number)
       {
-        char const *tag = symbols[token_translations[i]]->tag;
-        int precedence = symbols[token_translations[i]]->content->prec;
-        assoc associativity = symbols[token_translations[i]]->content->assoc;
+        symbol const *sym = symbols[token_translations[i]];
+        char const *tag = sym->tag;
+        char const *type = sym->content->type_name;
+        int precedence = sym->content->prec;
+        assoc associativity = sym->content->assoc;
         xml_indent (out, level + 2);
         fprintf (out,
                  "<terminal symbol-number=\"%d\" token-number=\"%d\""
-                 " name=\"%s\" usefulness=\"%s\"",
-                 token_translations[i], i, xml_escape (tag),
+                 " name=\"%s\" type=\"%s\" usefulness=\"%s\"",
+                 token_translations[i], i, xml_escape_n (0, tag),
+                 type ? xml_escape_n (1, type) : "",
                  reduce_token_unused_in_grammar (token_translations[i])
                    ? "unused-in-grammar" : "useful");
         if (precedence)
@@ -404,12 +411,16 @@
   xml_puts (out, level + 1, "<nonterminals>");
   for (symbol_number i = ntokens; i < nsyms + nuseless_nonterminals; i++)
     {
-      char const *tag = symbols[i]->tag;
+      symbol const *sym = symbols[i];
+      char const *tag = sym->tag;
+      char const *type = sym->content->type_name;
       xml_printf (out, level + 2,
                   "<nonterminal symbol-number=\"%d\" name=\"%s\""
+                  " type=\"%s\""
                   " usefulness=\"%s\"/>",
-                  i, xml_escape (tag),
-                  reduce_nonterminal_useless_in_grammar (symbols[i]->content)
+                  i, xml_escape_n (0, tag),
+                  type ? xml_escape_n (1, type) : "",
+                  reduce_nonterminal_useless_in_grammar (sym->content)
                     ? "useless-in-grammar" : "useful");
     }
   xml_puts (out, level + 1, "</nonterminals>");
@@ -524,3 +535,43 @@
 
   xfclose (out);
 }
+
+
+void
+print_html (void)
+{
+  assert (xml_flag);
+
+  char *xml2html = xpath_join (pkgdatadir (), "xslt/xml2xhtml.xsl");
+  char *xsltproc = muscle_percent_define_get ("tool.xsltproc");
+  char const *argv[11];
+  int i = 0;
+  argv[i++] = xsltproc;
+  argv[i++] = "-o";
+  argv[i++] = spec_html_file;
+  argv[i++] = xml2html;
+  argv[i++] = spec_xml_file;
+  argv[i++] = NULL;
+  aver (i <= ARRAY_CARDINALITY (argv));
+
+  if (trace_flag & trace_tools)
+    {
+      fputs ("running:", stderr);
+      for (int j = 0; argv[j]; ++j)
+        fprintf (stderr, " %s", argv[j]);
+      fputc ('\n', stderr);
+    }
+
+  int status
+    = execute (argv[0],
+               argv[0], argv,
+               /* directory */ NULL,
+               /* ignore_sigpipe */ false,
+               /* null_stdin, null_stdout, null_stderr */ true, true, true,
+               /* slave_process */ true, /* exit_on_error */ false,
+               /* termsigp */ NULL);
+  if (status)
+    complain (NULL, complaint, _("%s failed with status %d"), argv[0], status);
+  free (xsltproc);
+  free (xml2html);
+}
diff --git a/src/print-xml.h b/src/print-xml.h
index 162963f..b0d7330 100644
--- a/src/print-xml.h
+++ b/src/print-xml.h
@@ -1,6 +1,6 @@
 /* Output an xml of the generated parser, for Bison.
 
-   Copyright (C) 2007, 2009-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 2007, 2009-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,13 +16,11 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef PRINT_XML_H_
 # define PRINT_XML_H_
 
-# include <config.h>
-
 # include <stdio.h>
 
 void xml_indent (FILE *out, int level);
@@ -32,4 +30,7 @@
 char const *xml_escape (char const *str);
 void print_xml (void);
 
+/* Use xsltproc to generate HTML from XML output.  */
+void print_html (void);
+
 #endif /* !PRINT_XML_H_ */
diff --git a/src/print.c b/src/print.c
index 97dd18f..55825b3 100644
--- a/src/print.c
+++ b/src/print.c
@@ -1,6 +1,6 @@
 /* Print information on generated parser, for bison,
 
-   Copyright (C) 1984, 1986, 1989, 2000-2005, 2007, 2009-2015, 2018-2019
+   Copyright (C) 1984, 1986, 1989, 2000-2005, 2007, 2009-2015, 2018-2021
    Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,28 +16,35 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
+
+#include "print.h"
+
 #include "system.h"
 
 #include <bitset.h>
+#include <mbswidth.h>
 
 #include "closure.h"
+#include "complain.h"
 #include "conflicts.h"
+#include "counterexample.h"
 #include "files.h"
 #include "getargs.h"
 #include "gram.h"
 #include "lalr.h"
 #include "lr0.h"
 #include "muscle-tab.h"
-#include "print.h"
 #include "reader.h"
 #include "reduce.h"
 #include "state.h"
 #include "symtab.h"
 #include "tables.h"
 
+/* For a given state, the symbol numbers of the lookahead tokens for
+   shifts and errors (i.e. not reduce).  */
 static bitset no_reduce_set;
 
 
@@ -49,7 +56,7 @@
 static void
 max_length (size_t *width, const char *str)
 {
-  size_t len = strlen (str);
+  size_t len = mbswidth (str, 0);
   if (len > *width)
     *width = len;
 }
@@ -59,9 +66,9 @@
 `--------------------------------*/
 
 static void
-print_core (FILE *out, state *s)
+print_core (FILE *out, const state *s)
 {
-  item_number *sitems = s->items;
+  const item_index *sitems = s->items;
   size_t snritems = s->nitems;
   /* Output all the items of a state, not only its kernel.  */
   if (report_flag & report_itemsets)
@@ -85,9 +92,9 @@
       previous_rule = r;
 
       /* Display the lookahead tokens?  */
-      if (report_flag & report_lookahead_tokens
+      if (report_flag & report_lookaheads
           && item_number_is_rule_number (*sp1))
-        state_rule_lookahead_tokens_print (s, r, out);
+        state_rule_lookaheads_print (s, r, out);
       fputc ('\n', out);
     }
 }
@@ -99,7 +106,7 @@
 `------------------------------------------------------------*/
 
 static void
-print_transitions (state *s, FILE *out, bool display_transitions_p)
+print_transitions (const state *s, FILE *out, bool display_transitions_p)
 {
   transitions *trans = s->transitions;
   size_t width = 0;
@@ -127,10 +134,10 @@
       {
         symbol *sym = symbols[TRANSITION_SYMBOL (trans, i)];
         const char *tag = sym->tag;
-        state *s1 = trans->states[i];
+        const state *s1 = trans->states[i];
 
         fprintf (out, "    %s", tag);
-        for (int j = width - strlen (tag); j > 0; --j)
+        for (int j = width - mbswidth (tag, 0); j > 0; --j)
           fputc (' ', out);
         if (display_transitions_p)
           fprintf (out, _("shift, and go to state %d\n"), s1->number);
@@ -145,7 +152,7 @@
 `--------------------------------------------------------*/
 
 static void
-print_errs (FILE *out, state *s)
+print_errs (FILE *out, const state *s)
 {
   errs *errp = s->errs;
   size_t width = 0;
@@ -168,34 +175,34 @@
       {
         const char *tag = errp->symbols[i]->tag;
         fprintf (out, "    %s", tag);
-        for (int j = width - strlen (tag); j > 0; --j)
+        for (int j = width - mbswidth (tag, 0); j > 0; --j)
           fputc (' ', out);
         fputs (_("error (nonassociative)\n"), out);
       }
 }
 
 
-/*-------------------------------------------------------------------------.
-| Report a reduction of RULE on LOOKAHEAD_TOKEN (which can be 'default').  |
-| If not ENABLED, the rule is masked by a shift or a reduce (S/R and       |
-| R/R conflicts).                                                          |
-`-------------------------------------------------------------------------*/
+/*-------------------------------------------------------------------.
+| Report a reduction of RULE on LOOKAHEAD (which can be 'default').  |
+| If not ENABLED, the rule is masked by a shift or a reduce (S/R and |
+| R/R conflicts).                                                    |
+`-------------------------------------------------------------------*/
 
 static void
 print_reduction (FILE *out, size_t width,
-                 const char *lookahead_token,
+                 const char *lookahead,
                  rule *r, bool enabled)
 {
-  fprintf (out, "    %s", lookahead_token);
-  for (int j = width - strlen (lookahead_token); j > 0; --j)
+  fprintf (out, "    %s", lookahead);
+  for (int j = width - mbswidth (lookahead, 0); j > 0; --j)
     fputc (' ', out);
   if (!enabled)
     fputc ('[', out);
-  if (r->number)
+  if (rule_is_initial (r))
+    fprintf (out, _("accept"));
+  else
     fprintf (out, _("reduce using rule %d (%s)"), r->number,
              r->lhs->symbol->tag);
-  else
-    fprintf (out, _("accept"));
   if (!enabled)
     fputc (']', out);
   fputc ('\n', out);
@@ -207,7 +214,7 @@
 `-------------------------------------------*/
 
 static void
-print_reductions (FILE *out, state *s)
+print_reductions (FILE *out, const state *s)
 {
   reductions *reds = s->reductions;
   if (reds->num == 0)
@@ -232,15 +239,15 @@
   /* Compute the width of the lookahead token column.  */
   size_t width = 0;
   if (default_reduction)
-    width = strlen (_("$default"));
+    width = mbswidth (_("$default"), 0);
 
-  if (reds->lookahead_tokens)
+  if (reds->lookaheads)
     for (int i = 0; i < ntokens; i++)
       {
         bool count = bitset_test (no_reduce_set, i);
 
         for (int j = 0; j < reds->num; ++j)
-          if (bitset_test (reds->lookahead_tokens[j], i))
+          if (bitset_test (reds->lookaheads[j], i))
             {
               if (! count)
                 {
@@ -263,7 +270,7 @@
   bool default_reduction_only = true;
 
   /* Report lookahead tokens (or $default) and reductions.  */
-  if (reds->lookahead_tokens)
+  if (reds->lookaheads)
     for (int i = 0; i < ntokens; i++)
       {
         bool defaulted = false;
@@ -272,7 +279,7 @@
           default_reduction_only = false;
 
         for (int j = 0; j < reds->num; ++j)
-          if (bitset_test (reds->lookahead_tokens[j], i))
+          if (bitset_test (reds->lookaheads[j], i))
             {
               if (! count)
                 {
@@ -310,7 +317,7 @@
       aver (STREQ (default_reductions, "most")
             || (STREQ (default_reductions, "consistent")
                 && default_reduction_only)
-            || (reds->num == 1 && reds->rules[0]->number == 0));
+            || (reds->num == 1 && rule_is_initial (reds->rules[0])));
       (void) default_reduction_only;
       free (default_reductions);
     }
@@ -319,11 +326,11 @@
 
 /*--------------------------------------------------------------.
 | Report on OUT all the actions (shifts, gotos, reductions, and |
-| explicit erros from %nonassoc) of S.                          |
+| explicit errors from %nonassoc) of S.                         |
 `--------------------------------------------------------------*/
 
 static void
-print_actions (FILE *out, state *s)
+print_actions (FILE *out, const state *s)
 {
   /* Print shifts.  */
   print_transitions (s, out, true);
@@ -339,7 +346,7 @@
 `----------------------------------*/
 
 static void
-print_state (FILE *out, state *s)
+print_state (FILE *out, const state *s)
 {
   fputs ("\n\n", out);
   fprintf (out, _("State %d"), s->number);
@@ -351,6 +358,13 @@
       fputc ('\n', out);
       fputs (s->solved_conflicts, out);
     }
+  if (has_conflicts (s)
+      && (report_flag & report_cex
+          || warning_is_enabled (Wcounterexamples)))
+    {
+      fputc ('\n', out);
+      counterexample_report_state (s, out, "    ");
+    }
 }
 
 /*-----------------------------------------.
@@ -362,14 +376,14 @@
 {
   /* TERMINAL (type #) : rule #s terminal is on RHS */
   fprintf (out, "%s\n\n", _("Terminals, with rules where they appear"));
-  for (symbol_number i = 0; i < max_user_token_number + 1; i++)
+  for (int i = 0; i < max_code + 1; ++i)
     if (token_translations[i] != undeftoken->content->number)
       {
-        const char *tag = symbols[token_translations[i]]->tag;
+        const symbol *sym = symbols[token_translations[i]];
+        const char *tag = sym->tag;
         fprintf (out, "%4s%s", "", tag);
-        if (symbols[token_translations[i]]->content->type_name)
-          fprintf (out, " <%s>",
-                   symbols[token_translations[i]]->content->type_name);
+        if (sym->content->type_name)
+          fprintf (out, " <%s>", sym->content->type_name);
         fprintf (out, " (%d)", i);
 
         for (rule_number r = 0; r < nrules; r++)
@@ -391,7 +405,8 @@
   fprintf (out, "%s\n\n", _("Nonterminals, with rules where they appear"));
   for (symbol_number i = ntokens; i < nsyms; i++)
     {
-      const char *tag = symbols[i]->tag;
+      const symbol *sym = symbols[i];
+      const char *tag = sym->tag;
       bool on_left = false;
       bool on_right = false;
 
@@ -404,11 +419,11 @@
             break;
         }
 
-      int column = 4 + strlen (tag);
+      int column = 4 + mbswidth (tag, 0);
       fprintf (out, "%4s%s", "", tag);
-      if (symbols[i]->content->type_name)
+      if (sym->content->type_name)
         column += fprintf (out, " <%s>",
-                           symbols[i]->content->type_name);
+                           sym->content->type_name);
       fprintf (out, " (%d)\n", i);
 
       if (on_left)
@@ -445,7 +460,7 @@
   reduce_output (out);
   grammar_rules_partial_print (out,
                                _("Rules useless in parser due to conflicts"),
-                                 rule_useless_in_parser_p);
+                               rule_useless_in_parser_p);
   conflicts_output (out);
 
   grammar_rules_print (out);
diff --git a/src/print.h b/src/print.h
index 8352006..3f20d6d 100644
--- a/src/print.h
+++ b/src/print.h
@@ -1,6 +1,6 @@
 /* Print information on generated parser, for bison,
 
-   Copyright (C) 2000, 2009-2015, 2018-2019 Free Software Foundation,
+   Copyright (C) 2000, 2009-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef PRINT_H_
 # define PRINT_H_
diff --git a/src/reader.c b/src/reader.c
index fc6a27e..024606d 100644
--- a/src/reader.c
+++ b/src/reader.c
@@ -1,7 +1,7 @@
 /* Input parser for Bison
 
    Copyright (C) 1984, 1986, 1989, 1992, 1998, 2000-2003, 2005-2007,
-   2009-2015, 2018-2019 Free Software Foundation, Inc.
+   2009-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -16,12 +16,13 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
 
 #include <quote.h>
+#include <vasnprintf.h>
 
 #include "complain.h"
 #include "conflicts.h"
@@ -40,8 +41,8 @@
 static void check_and_convert_grammar (void);
 
 static symbol_list *grammar = NULL;
-static bool start_flag = false;
-merger_list *merge_functions;
+symbol_list *start_symbols = NULL;
+merger_list *merge_functions = NULL;
 
 /* Was %union seen?  */
 bool union_seen = false;
@@ -49,20 +50,40 @@
 /* Should rules have a default precedence?  */
 bool default_prec = true;
 
-/*-----------------------.
-| Set the start symbol.  |
-`-----------------------*/
 
 void
-grammar_start_symbol_set (symbol *sym, location loc)
+grammar_start_symbols_add (symbol_list *syms)
 {
-  if (start_flag)
-    complain (&loc, complaint, _("multiple %s declarations"), "%start");
-  else
+  /* Report and ignore duplicates.  Append the others to START_SYMBOLS.  */
+  symbol_list *last = symbol_list_last (start_symbols);
+  for (symbol_list *l = syms; l && l->content.sym; /* nothing */)
     {
-      start_flag = true;
-      startsymbol = sym;
-      startsymbol_loc = loc;
+      /* Is there a previous definition?  */
+      symbol_list *first = symbol_list_find_symbol (start_symbols, l->content.sym);
+      if (first)
+        {
+          duplicate_directive ("%start", first->sym_loc, l->sym_loc);
+          symbol_list *dupl = l;
+          l = l->next;
+          dupl->next = NULL;
+          symbol_list_free (dupl);
+        }
+      else
+        {
+          if (last)
+            {
+              last->next = l;
+              last = l;
+            }
+          else
+            {
+              last = l;
+              start_symbols = last;
+            }
+          symbol_list *next = l->next;
+          l->next = NULL;
+          l = next;
+        }
     }
 }
 
@@ -93,27 +114,27 @@
       syms->next->name = uniqstr_new (name);
       /* After all symbol type declarations have been parsed, packgram invokes
          record_merge_function_type to set the type.  */
-      syms->next->type = NULL;
+      syms->next->sym = NULL;
       syms->next->next = NULL;
       merge_functions = head.next;
     }
   return n;
 }
 
-/*-------------------------------------------------------------------------.
-| For the existing merging function with index MERGER, record the result   |
-| type as TYPE as required by the lhs of the rule whose %merge declaration |
-| is at DECLARATION_LOC.                                                   |
-`-------------------------------------------------------------------------*/
+/*-------------------------------------------------------------------.
+| For the existing merging function with index MERGER, record that   |
+| the result type is that of SYM, as required by the lhs (i.e., SYM) |
+| of the rule whose %merge declaration is at DECLARATION_LOC.        |
+`-------------------------------------------------------------------*/
 
 static void
-record_merge_function_type (int merger, uniqstr type, location declaration_loc)
+record_merge_function_type (int merger, symbol *sym, location declaration_loc)
 {
   if (merger <= 0)
     return;
 
-  if (type == NULL)
-    type = uniqstr_new ("");
+  uniqstr type
+    = sym->content->type_name ? sym->content->type_name : uniqstr_new ("");
 
   merger_list *merge_function;
   int merger_find = 1;
@@ -122,21 +143,24 @@
        merge_function = merge_function->next)
     merger_find += 1;
   aver (merge_function != NULL && merger_find == merger);
-  if (merge_function->type != NULL && !UNIQSTR_EQ (merge_function->type, type))
+  if (merge_function->sym && merge_function->sym->content->type_name)
     {
-      int indent = 0;
-      complain_indent (&declaration_loc, complaint, &indent,
-                       _("result type clash on merge function %s: "
-                         "<%s> != <%s>"),
-                       quote (merge_function->name), type,
-                       merge_function->type);
-      indent += SUB_INDENT;
-      complain_indent (&merge_function->type_declaration_loc, complaint,
-                       &indent,
+      if (!UNIQSTR_EQ (merge_function->sym->content->type_name, type))
+        {
+          complain (&declaration_loc, complaint,
+                    _("result type clash on merge function %s: "
+                      "<%s> != <%s>"),
+                    quote (merge_function->name), type,
+                    merge_function->sym->content->type_name);
+          subcomplain (&merge_function->type_declaration_loc, complaint,
                        _("previous declaration"));
+        }
     }
-  merge_function->type = uniqstr_new (type);
-  merge_function->type_declaration_loc = declaration_loc;
+  else
+    {
+      merge_function->sym = sym;
+      merge_function->type_declaration_loc = declaration_loc;
+    }
 }
 
 /*--------------------------------------.
@@ -274,6 +298,9 @@
 static void
 grammar_rule_check_and_complete (symbol_list *r)
 {
+  const symbol *lhs = r->content.sym;
+  const symbol *first_rhs = r->next->content.sym;
+
   /* Type check.
 
      If there is an action, then there is nothing we can do: the user
@@ -281,13 +308,12 @@
 
      Don't worry about the default action if $$ is untyped, since $$'s
      value can't be used.  */
-  if (!r->action_props.code && r->content.sym->content->type_name)
+  if (!r->action_props.code && lhs->content->type_name)
     {
-      symbol *first_rhs = r->next->content.sym;
       /* If $$ is being set in default way, report if any type mismatch.  */
       if (first_rhs)
         {
-          char const *lhs_type = r->content.sym->content->type_name;
+          char const *lhs_type = lhs->content->type_name;
           char const *rhs_type =
             first_rhs->content->type_name ? first_rhs->content->type_name : "";
           if (!UNIQSTR_EQ (lhs_type, rhs_type))
@@ -300,6 +326,7 @@
               const bool is_cxx =
                 STREQ (language->language, "c++")
                 || (skeleton && (STREQ (skeleton, "glr.cc")
+                                 || STREQ (skeleton, "glr2.cc")
                                  || STREQ (skeleton, "lalr1.cc")));
               if (is_cxx)
                 {
@@ -318,25 +345,53 @@
                   _("empty rule for typed nonterminal, and no action"));
     }
 
-  /* Check that symbol values that should be used are in fact used.  */
-  {
-    int n = 0;
-    for (symbol_list const *l = r; l && l->content.sym; l = l->next, ++n)
-      {
-        bool midrule_warning = false;
-        if (!l->action_props.is_value_used
-            && symbol_should_be_used (l, &midrule_warning)
-            /* The default action, $$ = $1, 'uses' both.  */
-            && (r->action_props.code || (n != 0 && n != 1)))
-          {
-            warnings warn_flag = midrule_warning ? Wmidrule_values : Wother;
-            if (n)
-              complain (&l->sym_loc, warn_flag, _("unused value: $%d"), n);
-            else
-              complain (&l->rhs_loc, warn_flag, _("unset value: $$"));
-          }
-      }
-  }
+  /* For each start symbol, build the action of its start rule.  Use
+     the same obstack as the one used by scan-code, which is in charge
+     of actions. */
+  const bool multistart = start_symbols && start_symbols->next;
+  if (multistart && lhs == acceptsymbol)
+    {
+      const symbol *start = r->next->next->content.sym;
+      if (start->content->type_name)
+        obstack_printf (obstack_for_actions,
+                        "{ ]b4_accept""([%s%d])[; }",
+                        start->content->class == nterm_sym ? "orig " : "",
+                        start->content->number);
+      else
+        obstack_printf (obstack_for_actions,
+                        "{ ]b4_accept[; }");
+      code_props_rule_action_init (&r->action_props,
+                                   obstack_finish0 (obstack_for_actions),
+                                   r->rhs_loc, r,
+                                   /* name */ NULL,
+                                   /* type */ NULL,
+                                   /* is_predicate */ false);
+    }
+
+
+  /* Check that symbol values that should be used are in fact used.
+     Don't check the generated start rules.  It has no action, so some
+     rhs symbols may appear unused, but the parsing algorithm ensures
+     that %destructor's are invoked appropriately.  */
+  if (lhs != acceptsymbol)
+    {
+      int n = 0;
+      for (symbol_list const *l = r; l && l->content.sym; l = l->next, ++n)
+        {
+          bool midrule_warning = false;
+          if (!l->action_props.is_value_used
+              && symbol_should_be_used (l, &midrule_warning)
+              /* The default action, $$ = $1, 'uses' both.  */
+              && (r->action_props.code || (n != 0 && n != 1)))
+            {
+              warnings warn_flag = midrule_warning ? Wmidrule_values : Wother;
+              if (n)
+                complain (&l->sym_loc, warn_flag, _("unused value: $%d"), n);
+              else
+                complain (&l->rhs_loc, warn_flag, _("unset value: $$"));
+            }
+        }
+    }
 
   /* Check that %empty => empty rule.  */
   if (r->percent_empty_loc.start.file
@@ -409,8 +464,8 @@
      action.  Create the MIDRULE.  */
   location dummy_loc = current_rule->action_props.location;
   symbol *dummy = dummy_symbol_get (dummy_loc);
-  symbol_type_set(dummy,
-                  current_rule->action_props.type, current_rule->action_props.location);
+  symbol_type_set (dummy,
+                   current_rule->action_props.type, current_rule->action_props.location);
   symbol_list *midrule = symbol_list_sym_new (dummy, dummy_loc);
 
   /* Remember named_ref of previous action. */
@@ -579,8 +634,8 @@
                                /* is_predicate */ true);
 }
 
-/* Set the expected number of shift-reduce (reduce-reduce) conflicts for
- * the current rule.  If a midrule is encountered later, the count
+/* Set the expected number of shift/reduce (reduce/reduce) conflicts
+ * for the current rule.  If a midrule is encountered later, the count
  * is transferred to it and reset in the current rule to -1. */
 
 void
@@ -610,7 +665,7 @@
 {
   int itemno = 0;
   ritem = xnmalloc (nritems + 1, sizeof *ritem);
-  /* This sentinel is used by build_relations in gram.c.  */
+  /* This sentinel is used by build_relations() in lalr.c.  */
   *ritem++ = 0;
 
   rule_number ruleno = 0;
@@ -619,7 +674,7 @@
   for (symbol_list *p = grammar; p; p = p->next)
     {
       symbol_list *lhs = p;
-      record_merge_function_type (lhs->merger, lhs->content.sym->content->type_name,
+      record_merge_function_type (lhs->merger, lhs->content.sym,
                                   lhs->merger_declaration_loc);
       /* If the midrule's $$ is set or its $n is used, remove the '$' from the
          symbol name so that it's a user-defined symbol so that the default
@@ -631,13 +686,9 @@
                   ->action_props.is_value_used)))
         lhs->content.sym->tag += 1;
 
-      /* Don't check the generated rule 0.  It has no action, so some rhs
-         symbols may appear unused, but the parsing algorithm ensures that
-         %destructor's are invoked appropriately.  */
-      if (lhs != grammar)
-        grammar_rule_check_and_complete (lhs);
+      grammar_rule_check_and_complete (lhs);
 
-      rules[ruleno].user_number = ruleno;
+      rules[ruleno].code = ruleno;
       rules[ruleno].number = ruleno;
       rules[ruleno].lhs = lhs->content.sym->content;
       rules[ruleno].rhs = ritem + itemno;
@@ -698,12 +749,10 @@
 }
 
 
-/*------------------------------------------------------------------.
-| Read in the grammar specification and record it in the format     |
-| described in gram.h.  All actions are copied into ACTION_OBSTACK, |
-| in each case forming the body of a C function (YYACTION) which    |
-| contains a switch statement to decide which action to execute.    |
-`------------------------------------------------------------------*/
+/*--------------------------------------------------------------.
+| Read in the grammar specification and record it in the format |
+| described in gram.h.                                          |
+`--------------------------------------------------------------*/
 
 void
 reader (const char *gram)
@@ -713,6 +762,7 @@
   symbols_new ();
 
   gram_scanner_open (gram);
+  parser_init ();
   gram_parse ();
   gram_scanner_close ();
 
@@ -738,6 +788,7 @@
       muscle_percent_define_default ("lr.default-reduction", "accepting");
     free (lr_type);
   }
+  muscle_percent_define_default ("tool.xsltproc", "xsltproc");
 
   /* Check %define front-end variables.  */
   {
@@ -766,6 +817,127 @@
 }
 
 
+/* Insert an initial rule, whose location is that of the first rule
+   (not that of the start symbol):
+
+   $accept: SWITCHING_TOKEN START $end.  */
+static void
+create_start_rule (symbol *swtok, symbol *start)
+{
+  symbol_list *initial_rule = symbol_list_sym_new (acceptsymbol, empty_loc);
+  initial_rule->rhs_loc = grammar->rhs_loc;
+  symbol_list *p = initial_rule;
+  if (swtok)
+    {
+      // Cannot create the action now, as the symbols have not yet
+      // been assigned their number (by symbol_pack), which we need to
+      // know the type name.  So the action is created in
+      // grammar_rule_check_and_complete, which is run after
+      // symbol_pack.
+      p->next = symbol_list_sym_new (swtok, empty_loc);
+      p = p->next;
+    }
+  p->next = symbol_list_sym_new (start, empty_loc);
+  p = p->next;
+  p->next = symbol_list_sym_new (eoftoken, empty_loc);
+  p = p->next;
+  p->next = symbol_list_sym_new (NULL, empty_loc);
+  p = p->next;
+  p->next = grammar;
+  nrules += 1;
+  nritems += 3 + !!swtok;
+  grammar = initial_rule;
+}
+
+/* Fetch (or create) a token "YY_PARSE_foo" for start symbol "foo".
+
+   We don't use the simple "YY_FOO" because (i) we might get clashes
+   with some of our symbols (e.g., cast => YY_CAST), and (ii) upcasing
+   introduces possible clashes between terminal FOO and nonterminal
+   foo.  */
+symbol *
+switching_token (const symbol *start)
+{
+  char buf[100];
+  size_t len = sizeof buf;
+  char *name = asnprintf (buf, &len, "YY_PARSE_%s", symbol_id_get (start));
+  if (!name)
+    xalloc_die ();
+  // Setting the location ensures deterministic symbol numbers.
+  symbol *res = symbol_get (name, start->location);
+  if (name != buf)
+    free (name);
+  symbol_class_set (res, token_sym, start->location, false);
+  return res;
+}
+
+/* Create the start rules in reverse order, since they are inserted at
+   the top of the grammar.  That way the rules follow the order of
+   declaration to %start.  */
+
+static void
+create_multiple_start_rules (symbol_list *start_syms)
+{
+  if (start_syms)
+    {
+      create_multiple_start_rules (start_syms->next);
+      assert (start_syms->content_type == SYMLIST_SYMBOL);
+      symbol *start = start_syms->content.sym;
+      symbol *swtok = switching_token (start);
+      create_start_rule (swtok, start);
+    }
+}
+
+/* For each start symbol "foo", create the rule "$accept: YY_FOO
+   foo $end". */
+static void
+create_start_rules (void)
+{
+  if (!start_symbols)
+    {
+      symbol *start = find_start_symbol ();
+      start_symbols = symbol_list_sym_new (start, start->location);
+    }
+
+  const bool several = start_symbols->next;
+  if (several)
+    create_multiple_start_rules (start_symbols);
+  else
+    {
+      symbol *start = start_symbols->content.sym;
+      create_start_rule (NULL, start);
+    }
+}
+
+static void
+check_start_symbols (void)
+{
+  const bool multistart = start_symbols && start_symbols->next;
+  // Sanity checks on the start symbols.
+  for (symbol_list *list = start_symbols; list; list = list->next)
+    {
+      const symbol *start = list->content.sym;
+      if (start->content->class == unknown_sym)
+        {
+          complain (&start->location, complaint,
+                    _("the start symbol %s is undefined"),
+                    start->tag);
+          // I claim this situation is unreachable.  This is caught
+          // before, and we get "symbol 'foo' is used, but is not
+          // defined as a token and has no rules".
+          abort ();
+        }
+      // If your only start symbol is a token, you're weird.
+      if (!multistart && start->content->class == token_sym)
+        complain (&start->location, complaint,
+                  _("the start symbol %s is a token"),
+                  start->tag);
+    }
+  if (complaint_status == status_complaint)
+    exit (EXIT_FAILURE);
+}
+
+
 /*-------------------------------------------------------------.
 | Check the grammar that has just been read, and convert it to |
 | internal form.                                               |
@@ -778,51 +950,41 @@
   if (nrules == 0)
     complain (NULL, fatal, _("no rules in the input grammar"));
 
-  /* If the user did not define her ENDTOKEN, do it now. */
-  if (!endtoken)
+  /* If the user did not define her EOFTOKEN, do it now. */
+  if (!eoftoken)
     {
-      endtoken = symbol_get ("$end", empty_loc);
-      endtoken->content->class = token_sym;
-      endtoken->content->number = 0;
+      eoftoken = symbol_get ("YYEOF", empty_loc);
+      eoftoken->content->class = token_sym;
+      eoftoken->content->number = 0;
       /* Value specified by POSIX.  */
-      endtoken->content->user_token_number = 0;
+      eoftoken->content->code = 0;
+      {
+        symbol *alias = symbol_get ("$end", empty_loc);
+        symbol_class_set (alias, token_sym, empty_loc, false);
+        symbol_make_alias (eoftoken, alias, empty_loc);
+      }
     }
 
+  /* Insert the initial rule(s).  */
+  create_start_rules ();
+
   /* Report any undefined symbols and consider them nonterminals.  */
   symbols_check_defined ();
 
-  /* Find the start symbol if no %start.  */
-  if (!start_flag)
-    {
-      symbol *start = find_start_symbol ();
-      grammar_start_symbol_set (start, start->location);
-    }
+  if (SYMBOL_NUMBER_MAXIMUM - nnterms < ntokens)
+    complain (NULL, fatal, "too many symbols in input grammar (limit is %d)",
+              SYMBOL_NUMBER_MAXIMUM);
 
-  /* Insert the initial rule, whose line is that of the first rule
-     (not that of the start symbol):
-
-     $accept: %start $end.  */
-  {
-    symbol_list *p = symbol_list_sym_new (accept, empty_loc);
-    p->rhs_loc = grammar->rhs_loc;
-    p->next = symbol_list_sym_new (startsymbol, empty_loc);
-    p->next->next = symbol_list_sym_new (endtoken, empty_loc);
-    p->next->next->next = symbol_list_sym_new (NULL, empty_loc);
-    p->next->next->next->next = grammar;
-    nrules += 1;
-    nritems += 3;
-    grammar = p;
-  }
-
-  aver (nsyms <= SYMBOL_NUMBER_MAXIMUM);
-  aver (nsyms == ntokens + nvars);
+  nsyms = ntokens + nnterms;
 
   /* Assign the symbols their symbol numbers.  */
   symbols_pack ();
 
-  /* Scan rule actions after invoking symbol_check_alias_consistency (in
-     symbols_pack above) so that token types are set correctly before the rule
-     action type checking.
+  check_start_symbols ();
+
+  /* Scan rule actions after invoking symbol_check_alias_consistency
+     (in symbols_pack above) so that token types are set correctly
+     before the rule action type checking.
 
      Before invoking grammar_rule_check_and_complete (in packgram
      below) on any rule, make sure all actions have already been
diff --git a/src/reader.h b/src/reader.h
index 8538015..6b2f29a 100644
--- a/src/reader.h
+++ b/src/reader.h
@@ -1,6 +1,6 @@
 /* Input parser for Bison
 
-   Copyright (C) 2000-2003, 2005-2007, 2009-2015, 2018-2019 Free
+   Copyright (C) 2000-2003, 2005-2007, 2009-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef READER_H_
 # define READER_H_
@@ -31,17 +31,29 @@
 {
   struct merger_list* next;
   uniqstr name;
-  uniqstr type;
+  /* One symbol whose type is the one used by all the symbols on which
+     this merging function is used.  */
+  symbol *sym;
+  /* Where SYM was bound to this merging function.  */
   location type_declaration_loc;
 } merger_list;
 
-/* From the parser.  */
-extern int gram_debug;
-int gram_parse (void);
+void free_merger_functions (void);
+extern merger_list *merge_functions;
 
+/* List of the start symbols.  */
+extern symbol_list *start_symbols;
 
-/* From reader.c. */
-void grammar_start_symbol_set (symbol *sym, location loc);
+/* Fetch (or create) a token "YY_PARSE_foo" for start symbol "foo".
+
+   We don't use the simple "YY_FOO" because (i) we might get clashes
+   with some of our symbols (e.g., cast => YY_CAST), and (ii) upcasing
+   introduces possible clashes between terminal FOO and nonterminal
+   foo.  */
+symbol *switching_token (const symbol *start);
+
+void grammar_start_symbols_add (symbol_list *syms);
+
 void grammar_current_rule_begin (symbol *lhs, location loc,
                                  named_ref *lhs_named_ref);
 void grammar_current_rule_end (location loc);
@@ -60,10 +72,9 @@
                                          named_ref *nref, uniqstr tag);
 /* Attach a PREDICATE to the current rule.  */
 void grammar_current_rule_predicate_append (const char *predicate, location loc);
-void reader (const char *gram);
-void free_merger_functions (void);
 
-extern merger_list *merge_functions;
+/* Read in the grammar specification.  */
+void reader (const char *gram);
 
 /* Was %union seen?  */
 extern bool union_seen;
diff --git a/src/reduce.c b/src/reduce.c
index 7dcfacf..112915b 100644
--- a/src/reduce.c
+++ b/src/reduce.c
@@ -1,6 +1,6 @@
 /* Grammar reduction for Bison.
 
-   Copyright (C) 1988-1989, 2000-2003, 2005-2015, 2018-2019 Free
+   Copyright (C) 1988-1989, 2000-2003, 2005-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 
 /* Reduce the grammar: Find and eliminate unreachable terminals,
@@ -93,7 +93,7 @@
   /* N is set as built.  Np is set being built this iteration. P is
      set of all productions which have a RHS all in N.  */
 
-  bitset Np = bitset_create (nvars, BITSET_FIXED);
+  bitset Np = bitset_create (nnterms, BITSET_FIXED);
 
   /* The set being computed is a set of nonterminals which can derive
      the empty string or strings consisting of all terminals. At each
@@ -160,9 +160,9 @@
   bitset Pp = bitset_create (nrules, BITSET_FIXED);
 
   /* If the start symbol isn't useful, then nothing will be useful. */
-  if (bitset_test (N, accept->content->number - ntokens))
+  if (bitset_test (N, acceptsymbol->content->number - ntokens))
     {
-      bitset_set (V, accept->content->number);
+      bitset_set (V, acceptsymbol->content->number);
 
       while (1)
         {
@@ -188,7 +188,7 @@
 
   /* These tokens (numbered 0, 1, and 2) are internal to Bison.
      Consider them useful. */
-  bitset_set (V, endtoken->content->number);   /* end-of-input token */
+  bitset_set (V, eoftoken->content->number);   /* end-of-input token */
   bitset_set (V, errtoken->content->number);   /* error token */
   bitset_set (V, undeftoken->content->number); /* some undefined token */
 
@@ -201,7 +201,7 @@
   int nuseful_nonterminals = 0;
   for (symbol_number i = ntokens; i < nsyms; ++i)
     nuseful_nonterminals += bitset_test (V, i);
-  nuseless_nonterminals = nvars - nuseful_nonterminals;
+  nuseless_nonterminals = nnterms - nuseful_nonterminals;
 
   /* A token that was used in %prec should not be warned about.  */
   for (rule_number r = 0; r < nrules; ++r)
@@ -263,7 +263,7 @@
 static void
 nonterminals_reduce (void)
 {
-  nterm_map = xnmalloc (nvars, sizeof *nterm_map);
+  nterm_map = xnmalloc (nnterms, sizeof *nterm_map);
   /* Map the nonterminals to their new index: useful first, useless
      afterwards.  Kept for later report.  */
   {
@@ -275,7 +275,8 @@
       if (!bitset_test (V, i))
         {
           nterm_map[i - ntokens] = n++;
-          if (symbols[i]->content->status != used)
+          if (symbols[i]->content->status != used
+              && symbols[i] != acceptsymbol)
             complain (&symbols[i]->location, Wother,
                       _("nonterminal useless in grammar: %s"),
                       symbols[i]->tag);
@@ -284,7 +285,7 @@
 
   /* Shuffle elements of tables indexed by symbol number.  */
   {
-    symbol **symbols_sorted = xnmalloc (nvars, sizeof *symbols_sorted);
+    symbol **symbols_sorted = xnmalloc (nnterms, sizeof *symbols_sorted);
     for (symbol_number i = ntokens; i < nsyms; ++i)
       symbols[i]->content->number = nterm_map[i - ntokens];
     for (symbol_number i = ntokens; i < nsyms; ++i)
@@ -301,11 +302,11 @@
       for (item_number *rhsp = rules[r].rhs; 0 <= *rhsp; ++rhsp)
         if (ISVAR (*rhsp))
           *rhsp = symbol_number_as_item_number (nterm_map[*rhsp - ntokens]);
-    accept->content->number = nterm_map[accept->content->number - ntokens];
+    acceptsymbol->content->number = nterm_map[acceptsymbol->content->number - ntokens];
   }
 
   nsyms -= nuseless_nonterminals;
-  nvars -= nuseless_nonterminals;
+  nnterms -= nuseless_nonterminals;
 }
 
 
@@ -368,7 +369,7 @@
 {
   /* Allocate the global sets used to compute the reduced grammar */
 
-  N = bitset_create (nvars, BITSET_FIXED);
+  N = bitset_create (nnterms, BITSET_FIXED);
   P =  bitset_create (nrules, BITSET_FIXED);
   V = bitset_create (nsyms, BITSET_FIXED);
   V1 = bitset_create (nsyms, BITSET_FIXED);
@@ -381,10 +382,18 @@
     {
       reduce_print ();
 
-      if (!bitset_test (N, accept->content->number - ntokens))
-        complain (&startsymbol_loc, fatal,
-                  _("start symbol %s does not derive any sentence"),
-                  startsymbol->tag);
+      // Check that start symbols have non-empty languages.
+      bool failure = false;
+      for (symbol_list *list = start_symbols; list; list = list->next)
+        if (!bitset_test (N, list->content.sym->content->number - ntokens))
+          {
+            failure = true;
+            complain (&list->sym_loc, complaint,
+                      _("start symbol %s does not derive any sentence"),
+                      list->content.sym->tag);
+          }
+      if (failure)
+        exit (EXIT_FAILURE);
 
       /* First reduce the nonterminals, as they renumber themselves in the
          whole grammar.  If you change the order, nonterms would be
@@ -401,7 +410,7 @@
 
       fprintf (stderr, "reduced %s defines %d terminals, %d nonterminals"
                ", and %d productions.\n",
-               grammar_file, ntokens, nvars, nrules);
+               grammar_file, ntokens, nnterms, nrules);
     }
 }
 
diff --git a/src/reduce.h b/src/reduce.h
index 6810555..63d6bf1 100644
--- a/src/reduce.h
+++ b/src/reduce.h
@@ -1,6 +1,6 @@
 /* Grammar reduction for Bison.
 
-   Copyright (C) 2000-2002, 2007, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2000-2002, 2007, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef REDUCE_H_
 # define REDUCE_H_
@@ -33,7 +33,7 @@
 void reduce_free (void);
 
 /** Map initial nterm numbers to the new ones.  Built by
- * reduce_grammar.  Size nvars + nuseless_nonterminals.  */
+ * reduce_grammar.  Size nnterms + nuseless_nonterminals.  */
 extern symbol_number *nterm_map;
 
 extern int nuseless_nonterminals;
diff --git a/src/relation.c b/src/relation.c
index ebd3f21..1a38c86 100644
--- a/src/relation.c
+++ b/src/relation.c
@@ -1,6 +1,6 @@
 /* Binary relations.
 
-   Copyright (C) 2002, 2004-2005, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2002, 2004-2005, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
diff --git a/src/relation.h b/src/relation.h
index 81d766c..eab6b33 100644
--- a/src/relation.h
+++ b/src/relation.h
@@ -1,6 +1,6 @@
 /* Binary relations.
 
-   Copyright (C) 2002, 2004, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2002, 2004, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 
 #ifndef RELATION_H_
diff --git a/src/scan-code.c b/src/scan-code.c
index d8567eb..03ab85c 100644
--- a/src/scan-code.c
+++ b/src/scan-code.c
@@ -700,7 +700,7 @@
 	flex_int32_t yy_verify;
 	flex_int32_t yy_nxt;
 	};
-static const flex_int16_t yy_accept[91] =
+static const flex_int16_t yy_accept[82] =
     {   0,
         0,    0,    0,    0,    3,    3,    4,    4,    4,    4,
         0,    0,    0,    0,   19,   17,   16,   17,    2,   17,
@@ -708,9 +708,9 @@
         1,    0,    0,    3,    4,    4,    4,    4,   12,    0,
        12,   12,    0,    0,    9,   10,    0,   13,    0,   13,
        13,    0,   14,    0,   15,    0,    0,    0,    0,    0,
-        0,    0,   12,    0,    0,    0,    0,    0,   13,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,   12,    0,
-       12,   12,    0,   14,   12,   12,    0,    0,    0,    0
+        0,    0,   12,    0,    0,    0,    0,    0,    0,   13,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -747,89 +747,85 @@
 
 static const YY_CHAR yy_meta[19] =
     {   0,
-        1,    1,    2,    1,    1,    1,    1,    3,    3,    1,
-        3,    1,    2,    1,    1,    1,    1,    2
+        1,    1,    1,    1,    1,    1,    1,    2,    2,    1,
+        2,    1,    1,    1,    1,    1,    1,    1
     } ;
 
-static const flex_int16_t yy_base[97] =
+static const flex_int16_t yy_base[88] =
     {   0,
-        0,   13,  121,  120,    0,    3,    4,    5,    6,    7,
-       27,    0,   20,   21,  125,  178,  178,   26,  178,    8,
-      178,   41,  178,  178,   53,  178,   62,   74,   33,  119,
-      178,   37,   44,  105,  178,   46,  101,   48,  178,   99,
-        0,   96,   98,   91,  178,  178,   50,  178,   87,    0,
-       86,   87,  178,   76,  178,   52,   50,   68,   71,   73,
-       78,   74,    0,   16,   78,   84,   85,    0,    0,   94,
-       86,   96,   55,  107,    0,    0,   58,  118,  100,  124,
-      130,  136,  142,  106,   46,    0,  148,   43,    0,  178,
-      165,  168,    4,  171,    1,  174
-
+        0,   13,  101,  100,    0,    3,    4,    5,    6,    7,
+       27,    0,   20,   21,  104,  182,  182,   26,  182,    8,
+      182,   41,  182,  182,   53,  182,   62,   74,   33,   98,
+      182,   37,   44,   86,  182,   46,   85,   48,  182,   88,
+        0,   87,   87,   87,  182,  182,   50,  182,   83,    0,
+       82,   79,  182,  103,  182,   52,   50,   68,   71,   73,
+       78,   81,    0,  119,   64,   50,  130,   84,    0,    0,
+      140,  155,   43,   16,   79,   12,    0,    0,   54,    2,
+      182,  173,  175,    2,  177,    0,  179
     } ;
 
-static const flex_int16_t yy_def[97] =
+static const flex_int16_t yy_def[88] =
     {   0,
-       91,   91,    2,    2,    2,    2,    2,    2,    2,    2,
-        2,   11,   11,   11,   90,   90,   90,   90,   90,   90,
-       90,   92,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       93,   90,   94,   90,   90,   90,   90,   90,   90,   95,
-       90,   90,   90,   96,   90,   90,   90,   90,   90,   90,
-       90,   92,   93,   94,   94,   90,   90,   27,   95,   90,
-       96,   96,   25,   94,   66,   70,   90,   96,   94,   94,
-       94,   94,   94,   96,   81,   81,   81,   87,   87,    0,
-       90,   90,   90,   90,   90,   90
-
+       82,   82,    2,    2,    2,    2,    2,    2,    2,    2,
+        2,   11,   11,   11,   81,   81,   81,   81,   81,   81,
+       81,   83,   81,   81,   81,   81,   81,   81,   81,   81,
+       81,   81,   81,   81,   81,   81,   81,   81,   81,   81,
+       84,   81,   85,   81,   81,   81,   81,   81,   81,   86,
+       81,   81,   81,   87,   81,   81,   81,   81,   81,   81,
+       81,   83,   84,   85,   81,   64,   81,   81,   27,   86,
+       81,   87,   81,   72,   25,   25,   67,   71,   81,   81,
+        0,   81,   81,   81,   81,   81,   81
     } ;
 
-static const flex_int16_t yy_nxt[197] =
+static const flex_int16_t yy_nxt[201] =
     {   0,
-       90,   90,   19,   69,   17,   19,   63,   21,   21,   33,
+       81,   70,   19,   63,   17,   19,   53,   21,   21,   33,
        34,   23,   23,   17,   17,   20,   17,   17,   20,   22,
-       22,   22,   22,   65,   29,   29,   17,   17,   73,   17,
+       22,   22,   22,   81,   29,   29,   17,   17,   72,   17,
        24,   25,   26,   30,   30,   31,   27,   53,   56,   57,
        28,   32,   36,   37,   54,   33,   34,   59,   37,   61,
-       62,   67,   68,   56,   57,   74,   38,   39,   74,   31,
-       40,   41,   53,   42,   43,   32,   90,   44,   45,   33,
-       34,   46,   59,   37,   59,   37,   90,   47,   48,   61,
-       62,   49,   50,   72,   51,   65,   67,   68,   52,   38,
-       74,   75,   75,   72,   75,   70,   51,   51,   77,   66,
+       62,   68,   69,   56,   57,   80,   38,   39,   53,   31,
+       40,   41,   64,   42,   43,   32,   80,   44,   45,   33,
+       34,   46,   59,   37,   59,   37,   76,   47,   48,   61,
+       62,   49,   50,   81,   51,   68,   69,   71,   52,   65,
+       81,   76,   51,   51,   66,   67,   38,   42,   42,   65,
 
-       39,   76,   76,   72,   76,   65,   42,   65,   78,   42,
-       48,   79,   73,   72,   80,   81,   60,   82,   77,   73,
-       58,   83,   84,   55,   90,   72,   18,   18,   90,   90,
-       77,   65,   90,   90,   82,   90,   74,   85,   86,   90,
-       86,   90,   73,   65,   90,   90,   82,   90,   73,   65,
-       87,   90,   90,   90,   73,   88,   89,   90,   89,   90,
-       90,   90,   90,   90,   79,   16,   16,   16,   35,   35,
-       35,   64,   90,   64,   71,   90,   71,   15,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90
+       60,   58,   55,   81,   65,   73,   18,   18,   81,   81,
+       74,   81,   81,   81,   81,   73,   81,   81,   81,   81,
+       73,   65,   81,   81,   81,   81,   66,   81,   81,   81,
+       81,   75,   81,   81,   81,   81,   65,   77,   77,   81,
+       77,   81,   81,   81,   81,   81,   39,   78,   78,   81,
+       78,   81,   81,   81,   81,   81,   48,   73,   81,   81,
+       81,   81,   74,   81,   81,   81,   81,   79,   81,   81,
+       81,   81,   73,   16,   16,   35,   35,   64,   64,   72,
+       72,   15,   81,   81,   81,   81,   81,   81,   81,   81,
+       81,   81,   81,   81,   81,   81,   81,   81,   81,   81
 
     } ;
 
-static const flex_int16_t yy_chk[197] =
+static const flex_int16_t yy_chk[201] =
     {   0,
-        0,    0,    5,   95,    1,    6,   93,    7,    8,   20,
+        0,   86,    5,   84,    1,    6,   80,    7,    8,   20,
        20,    9,   10,    1,    1,    5,    1,    2,    6,    7,
-        8,    9,   10,   64,   13,   14,    2,    2,   64,    2,
+        8,    9,   10,   76,   13,   14,    2,    2,   74,    2,
        11,   11,   11,   13,   14,   18,   11,   29,   32,   32,
        11,   18,   22,   22,   29,   33,   33,   36,   36,   38,
-       38,   47,   47,   56,   56,   88,   22,   25,   85,   57,
-       25,   25,   77,   25,   25,   57,   73,   25,   27,   58,
-       58,   27,   59,   59,   60,   60,   62,   27,   28,   61,
-       61,   28,   28,   54,   28,   65,   67,   67,   28,   62,
-       65,   66,   66,   71,   66,   52,   51,   49,   71,   44,
+       38,   47,   47,   56,   56,   73,   22,   25,   79,   57,
+       25,   25,   66,   25,   25,   57,   79,   25,   27,   58,
+       58,   27,   59,   59,   60,   60,   65,   27,   28,   61,
+       61,   28,   28,   62,   28,   68,   68,   52,   28,   43,
+       75,   75,   51,   49,   43,   44,   62,   42,   40,   43,
 
-       66,   70,   70,   72,   70,   43,   42,   79,   72,   40,
-       70,   74,   79,   84,   74,   74,   37,   74,   84,   74,
-       34,   74,   78,   30,   15,   78,    4,    3,    0,    0,
-       78,   80,    0,    0,   80,    0,   80,   81,   81,    0,
-       81,    0,   81,   82,    0,    0,   82,    0,   82,   83,
-       83,    0,    0,    0,   83,   87,   87,    0,   87,    0,
-        0,    0,    0,    0,   87,   91,   91,   91,   92,   92,
-       92,   94,    0,   94,   96,    0,   96,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90
+       37,   34,   30,   15,   43,   54,    4,    3,    0,    0,
+       54,    0,    0,    0,    0,   54,    0,    0,    0,    0,
+       54,   64,    0,    0,    0,    0,   64,    0,    0,    0,
+        0,   64,    0,    0,    0,    0,   64,   67,   67,    0,
+       67,    0,    0,    0,    0,    0,   67,   71,   71,    0,
+       71,    0,    0,    0,    0,    0,   71,   72,    0,    0,
+        0,    0,   72,    0,    0,    0,    0,   72,    0,    0,
+        0,    0,   72,   82,   82,   83,   83,   85,   85,   87,
+       87,   81,   81,   81,   81,   81,   81,   81,   81,   81,
+       81,   81,   81,   81,   81,   81,   81,   81,   81,   81
 
     } ;
 
@@ -841,8 +837,8 @@
 
 static const flex_int16_t yy_rule_linenum[18] =
     {   0,
-      116,  126,  127,  137,  142,  147,  153,  154,  155,  156,
-      158,  166,  172,  182,  190,  200,  203
+      118,  128,  129,  139,  144,  149,  155,  156,  157,  158,
+      160,  168,  174,  184,  192,  202,  205
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -856,7 +852,7 @@
 #line 1 "/Users/akim/src/gnu/bison/src/scan-code.l"
 /* Bison Action Scanner                             -*- C -*-
 
-   Copyright (C) 2006-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -871,28 +867,30 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 #define YY_NO_INPUT 1
 #line 24 "/Users/akim/src/gnu/bison/src/scan-code.l"
 #include <c-ctype.h>
 #include <get-errno.h>
 #include <quote.h>
 
-#include <src/complain.h>
-#include <src/getargs.h>
-#include <src/muscle-tab.h>
-#include <src/reader.h>
-#include <src/scan-code.h>
-#include <src/symlist.h>
+#include "src/complain.h"
+#include "src/getargs.h"
+#include "src/muscle-tab.h"
+#include "src/reader.h"
+#include "src/scan-code.h"
+#include "src/symlist.h"
 
 #define FLEX_PREFIX(Id) code_ ## Id
-#include <src/flex-scanner.h>
+#include "src/flex-scanner.h"
 
 /* Work around a bug in flex 2.5.31.  See Debian bug 333231
-   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
+   <https://bugs.debian.org/333231>.  */
 #undef code_wrap
 #define code_wrap() 1
 
+struct obstack *obstack_for_actions = &obstack_for_string;
+
 /* The current calling start condition: SC_RULE_ACTION or
    SC_SYMBOL_ACTION. */
 # define YY_DECL static char *code_lex (code_props *self, int sc_context)
@@ -920,8 +918,8 @@
 /* True if an untyped $$ or $n was seen.  */
 static bool untyped_var_seen;
 
-#line 923 "src/scan-code.c"
-#line 72 "/Users/akim/src/gnu/bison/src/scan-code.l"
+#line 921 "src/scan-code.c"
+#line 74 "/Users/akim/src/gnu/bison/src/scan-code.l"
  /* C and C++ comments in code. */
 
  /* Strings and characters in code. */
@@ -938,7 +936,7 @@
 /* C style identifier. Must start with letter. Will be used for
    named symbol references. Shall be kept synchronized with
    scan-gram.l "letter" and "id". */
-#line 941 "src/scan-code.c"
+#line 939 "src/scan-code.c"
 
 #define INITIAL 0
 #define SC_COMMENT 1
@@ -1222,7 +1220,7 @@
 
 	{
 /* %% [7.0] user's declarations go here */
-#line 98 "/Users/akim/src/gnu/bison/src/scan-code.l"
+#line 100 "/Users/akim/src/gnu/bison/src/scan-code.l"
 
 
 
@@ -1239,7 +1237,7 @@
   | Scanning a C comment.  The initial '/ *' is already eaten.  |
   `------------------------------------------------------------*/
 
-#line 1242 "src/scan-code.c"
+#line 1240 "src/scan-code.c"
 
 	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
 		{
@@ -1268,13 +1266,13 @@
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 91 )
+				if ( yy_current_state >= 82 )
 					yy_c = yy_meta[yy_c];
 				}
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
 			++yy_cp;
 			}
-		while ( yy_current_state != 90 );
+		while ( yy_current_state != 81 );
 		yy_cp = (yy_last_accepting_cpos);
 		yy_current_state = (yy_last_accepting_state);
 
@@ -1318,8 +1316,8 @@
 case 1:
 /* rule 1 can match eol */
 YY_RULE_SETUP
-#line 116 "/Users/akim/src/gnu/bison/src/scan-code.l"
-STRING_GROW; BEGIN sc_context;
+#line 118 "/Users/akim/src/gnu/bison/src/scan-code.l"
+STRING_GROW (); BEGIN sc_context;
 	YY_BREAK
 
 /*--------------------------------------------------------------.
@@ -1330,14 +1328,14 @@
 case 2:
 /* rule 2 can match eol */
 YY_RULE_SETUP
-#line 126 "/Users/akim/src/gnu/bison/src/scan-code.l"
-STRING_GROW; BEGIN sc_context;
+#line 128 "/Users/akim/src/gnu/bison/src/scan-code.l"
+STRING_GROW (); BEGIN sc_context;
 	YY_BREAK
 case 3:
 /* rule 3 can match eol */
 YY_RULE_SETUP
-#line 127 "/Users/akim/src/gnu/bison/src/scan-code.l"
-STRING_GROW;
+#line 129 "/Users/akim/src/gnu/bison/src/scan-code.l"
+STRING_GROW ();
 	YY_BREAK
 
 /*--------------------------------------------.
@@ -1348,53 +1346,53 @@
 case 4:
 /* rule 4 can match eol */
 YY_RULE_SETUP
-#line 137 "/Users/akim/src/gnu/bison/src/scan-code.l"
-STRING_GROW;
+#line 139 "/Users/akim/src/gnu/bison/src/scan-code.l"
+STRING_GROW ();
 	YY_BREAK
 
 
 
 case 5:
 YY_RULE_SETUP
-#line 142 "/Users/akim/src/gnu/bison/src/scan-code.l"
-STRING_GROW; BEGIN sc_context;
+#line 144 "/Users/akim/src/gnu/bison/src/scan-code.l"
+STRING_GROW (); BEGIN sc_context;
 	YY_BREAK
 
 
 
 case 6:
 YY_RULE_SETUP
-#line 147 "/Users/akim/src/gnu/bison/src/scan-code.l"
-STRING_GROW; BEGIN sc_context;
+#line 149 "/Users/akim/src/gnu/bison/src/scan-code.l"
+STRING_GROW (); BEGIN sc_context;
 	YY_BREAK
 
 
 
 case 7:
 YY_RULE_SETUP
-#line 153 "/Users/akim/src/gnu/bison/src/scan-code.l"
-STRING_GROW; BEGIN SC_CHARACTER;
+#line 155 "/Users/akim/src/gnu/bison/src/scan-code.l"
+STRING_GROW (); BEGIN SC_CHARACTER;
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 154 "/Users/akim/src/gnu/bison/src/scan-code.l"
-STRING_GROW; BEGIN SC_STRING;
+#line 156 "/Users/akim/src/gnu/bison/src/scan-code.l"
+STRING_GROW (); BEGIN SC_STRING;
 	YY_BREAK
 case 9:
 /* rule 9 can match eol */
 YY_RULE_SETUP
-#line 155 "/Users/akim/src/gnu/bison/src/scan-code.l"
-STRING_GROW; BEGIN SC_COMMENT;
+#line 157 "/Users/akim/src/gnu/bison/src/scan-code.l"
+STRING_GROW (); BEGIN SC_COMMENT;
 	YY_BREAK
 case 10:
 /* rule 10 can match eol */
 YY_RULE_SETUP
-#line 156 "/Users/akim/src/gnu/bison/src/scan-code.l"
-STRING_GROW; BEGIN SC_LINE_COMMENT;
+#line 158 "/Users/akim/src/gnu/bison/src/scan-code.l"
+STRING_GROW (); BEGIN SC_LINE_COMMENT;
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 158 "/Users/akim/src/gnu/bison/src/scan-code.l"
+#line 160 "/Users/akim/src/gnu/bison/src/scan-code.l"
 {
     complain (loc, Wother, _("stray '%s'"), yytext);
     obstack_escape (&obstack_for_string, yytext);
@@ -1404,8 +1402,9 @@
 
 
 case 12:
+/* rule 12 can match eol */
 YY_RULE_SETUP
-#line 166 "/Users/akim/src/gnu/bison/src/scan-code.l"
+#line 168 "/Users/akim/src/gnu/bison/src/scan-code.l"
 {
     ref_tail_fields = NULL;
     handle_action_dollar (self->rule, yytext, loc);
@@ -1415,7 +1414,7 @@
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 172 "/Users/akim/src/gnu/bison/src/scan-code.l"
+#line 174 "/Users/akim/src/gnu/bison/src/scan-code.l"
 {
     ref_tail_fields = NULL;
     handle_action_at (self->rule, yytext, loc);
@@ -1427,8 +1426,9 @@
 
 
 case 14:
+/* rule 14 can match eol */
 YY_RULE_SETUP
-#line 182 "/Users/akim/src/gnu/bison/src/scan-code.l"
+#line 184 "/Users/akim/src/gnu/bison/src/scan-code.l"
 {
     const char *type_name = NULL;
     fetch_type_name (yytext + 1, &type_name, loc)[-1] = 0;
@@ -1440,7 +1440,7 @@
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 190 "/Users/akim/src/gnu/bison/src/scan-code.l"
+#line 192 "/Users/akim/src/gnu/bison/src/scan-code.l"
 {
     obstack_sgrow (&obstack_for_string, "]b4_at_dollar[");
     muscle_percent_define_ensure("locations", *loc, true);
@@ -1452,15 +1452,15 @@
 /* Escape M4 quoting characters in C code.  */
 case 16:
 YY_RULE_SETUP
-#line 200 "/Users/akim/src/gnu/bison/src/scan-code.l"
+#line 202 "/Users/akim/src/gnu/bison/src/scan-code.l"
 obstack_escape (&obstack_for_string, yytext);
 	YY_BREAK
 /* By default, grow the string obstack with the input.  */
 case 17:
 /* rule 17 can match eol */
 YY_RULE_SETUP
-#line 203 "/Users/akim/src/gnu/bison/src/scan-code.l"
-STRING_GROW;
+#line 205 "/Users/akim/src/gnu/bison/src/scan-code.l"
+STRING_GROW ();
 	YY_BREAK
 /* End of processing. */
 case YY_STATE_EOF(INITIAL):
@@ -1470,13 +1470,13 @@
 case YY_STATE_EOF(SC_CHARACTER):
 case YY_STATE_EOF(SC_RULE_ACTION):
 case YY_STATE_EOF(SC_SYMBOL_ACTION):
-#line 206 "/Users/akim/src/gnu/bison/src/scan-code.l"
-STRING_FINISH; return last_string;
+#line 208 "/Users/akim/src/gnu/bison/src/scan-code.l"
+STRING_FINISH (); return last_string;
 	YY_BREAK
 
 case 18:
 YY_RULE_SETUP
-#line 209 "/Users/akim/src/gnu/bison/src/scan-code.l"
+#line 211 "/Users/akim/src/gnu/bison/src/scan-code.l"
 YY_FATAL_ERROR( "flex scanner jammed" );
 	YY_BREAK
 #line 1482 "src/scan-code.c"
@@ -1798,7 +1798,7 @@
 		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 91 )
+			if ( yy_current_state >= 82 )
 				yy_c = yy_meta[yy_c];
 			}
 		yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -1831,11 +1831,11 @@
 	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 91 )
+		if ( yy_current_state >= 82 )
 			yy_c = yy_meta[yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
-	yy_is_jam = (yy_current_state == 90);
+	yy_is_jam = (yy_current_state == 81);
 
 		return yy_is_jam ? 0 : yy_current_state;
 }
@@ -2584,7 +2584,7 @@
 
 /* %ok-for-header */
 
-#line 209 "/Users/akim/src/gnu/bison/src/scan-code.l"
+#line 211 "/Users/akim/src/gnu/bison/src/scan-code.l"
 
 
 static inline bool
@@ -2701,14 +2701,14 @@
 show_sub_message (warnings warning,
                   const char* cp, bool explicit_bracketing,
                   int midrule_rhs_index, char dollar_or_at,
-                  int indent, const variant *var)
+                  const variant *var)
 {
   const char *at_spec = get_at_spec (var->symbol_index);
 
   if (var->err == 0)
-    complain_indent (&var->loc, warning, &indent,
-                     _("refers to: %c%s at %s"), dollar_or_at,
-                     var->id, at_spec);
+    subcomplain (&var->loc, warning,
+                 _("refers to: %c%s at %s"), dollar_or_at,
+                 var->id, at_spec);
   else
     {
       const char *id;
@@ -2755,8 +2755,8 @@
                         _(", cannot be accessed from midrule action at $%d"),
                         midrule_rhs_index);
 
-      complain_indent (&id_loc, warning, &indent, "%s",
-                        obstack_finish0 (&msg_buf));
+      subcomplain (&id_loc, warning, "%s",
+                   obstack_finish0 (&msg_buf));
       obstack_free (&msg_buf, 0);
     }
 }
@@ -2764,14 +2764,13 @@
 static void
 show_sub_messages (warnings warning,
                    const char* cp, bool explicit_bracketing,
-                   int midrule_rhs_index, char dollar_or_at,
-                   int indent)
+                   int midrule_rhs_index, char dollar_or_at)
 {
   for (int i = 0; i < variant_count; ++i)
     show_sub_message (warning | silent,
                       cp, explicit_bracketing,
                       midrule_rhs_index, dollar_or_at,
-                      indent, &variant_table[i]);
+                      &variant_table[i]);
 }
 
 /* Returned from "parse_ref" when the reference
@@ -2782,6 +2781,23 @@
    points to LHS ($$) of the current rule or midrule. */
 #define LHS_REF (INT_MIN + 1)
 
+/* Parse a positional reference in RULE.  */
+static long
+parse_positional_ref (char *cp, int rule_length,
+                      char *text, const location *text_loc)
+{
+  long num = strtol (cp, &cp, 10);
+  if (1 - INT_MAX + rule_length <= num && num <= rule_length)
+    return num;
+  else
+    {
+      complain (text_loc, complaint, _("integer out of range: %s"),
+                quote (text));
+      return INVALID_REF;
+    }
+}
+
+
 /* Parse named or positional reference. In case of positional
    references, can return negative values for $-n "deep" stack
    accesses. */
@@ -2793,18 +2809,8 @@
   if ('$' == *cp)
     return LHS_REF;
 
-  if (c_isdigit (*cp) || (*cp == '-' && c_isdigit (* (cp + 1))))
-    {
-      long num = strtol (cp, &cp, 10);
-      if (1 - INT_MAX + rule_length <= num && num <= rule_length)
-        return num;
-      else
-        {
-          complain (text_loc, complaint, _("integer out of range: %s"),
-                    quote (text));
-          return INVALID_REF;
-        }
-    }
+  if (c_isdigit (*cp) || (*cp == '-' && c_isdigit (cp[1])))
+    return parse_positional_ref (cp, rule_length, text, text_loc);
 
   bool const explicit_bracketing = *cp == '[';
 
@@ -2872,47 +2878,44 @@
       {
         int len = (explicit_bracketing || !ref_tail_fields) ?
           cp_end - cp : ref_tail_fields - cp;
-        int indent = 0;
 
-        complain_indent (text_loc, complaint, &indent,
-                         _("invalid reference: %s"), quote (text));
-        indent += SUB_INDENT;
+        complain (text_loc, complaint,
+                  _("invalid reference: %s"), quote (text));
         if (len == 0)
           {
             location sym_loc = *text_loc;
             sym_loc.start.column += 1;
             sym_loc.end = sym_loc.start;
-            complain_indent (&sym_loc, complaint, &indent,
-                             _("syntax error after '%c', expecting integer, "
-                               "letter, '_', '[', or '$'"),
-                             dollar_or_at);
+            subcomplain (&sym_loc, complaint,
+                         _("syntax error after '%c', expecting integer, "
+                         "letter, '_', '[', or '$'"),
+                         dollar_or_at);
           }
         else if (midrule_rhs_index)
-          complain_indent (&rule->rhs_loc, complaint, &indent,
-                           _("symbol not found in production before $%d: "
-                             "%.*s"),
-                           midrule_rhs_index, len, cp);
+          subcomplain (&rule->rhs_loc, complaint,
+                       _("symbol not found in production before $%d: "
+                       "%.*s"),
+                       midrule_rhs_index, len, cp);
         else
-          complain_indent (&rule->rhs_loc, complaint, &indent,
-                           _("symbol not found in production: %.*s"),
-                           len, cp);
+          subcomplain (&rule->rhs_loc, complaint,
+                       _("symbol not found in production: %.*s"),
+                       len, cp);
 
         if (variant_count > 0)
           show_sub_messages (complaint,
                              cp, explicit_bracketing, midrule_rhs_index,
-                             dollar_or_at, indent);
+                             dollar_or_at);
         return INVALID_REF;
       }
     case 1:
       {
-        int indent = 0;
         if (variant_count > 1)
           {
-            complain_indent (text_loc, Wother, &indent,
-                             _("misleading reference: %s"), quote (text));
+            complain (text_loc, Wother,
+                      _("misleading reference: %s"), quote (text));
             show_sub_messages (Wother,
                                cp, explicit_bracketing, midrule_rhs_index,
-                               dollar_or_at, indent + SUB_INDENT);
+                               dollar_or_at);
           }
         {
           int symbol_index =
@@ -2923,12 +2926,11 @@
     case 2:
     default:
       {
-        int indent = 0;
-        complain_indent (text_loc, complaint, &indent,
-                         _("ambiguous reference: %s"), quote (text));
+        complain (text_loc, complaint,
+                  _("ambiguous reference: %s"), quote (text));
         show_sub_messages (complaint,
                            cp, explicit_bracketing, midrule_rhs_index,
-                           dollar_or_at, indent + SUB_INDENT);
+                           dollar_or_at);
         return INVALID_REF;
       }
     }
@@ -2970,7 +2972,7 @@
 /*------------------------------------------------------------------.
 | TEXT is pointing to a wannabee semantic value (i.e., a '$').      |
 |                                                                   |
-| Possible inputs: $[<TYPENAME>]($|integer)                         |
+| Possible inputs: $[<TYPENAME>]($|INTEGER)                         |
 |                                                                   |
 | Output to OBSTACK_FOR_STRING a reference to this semantic value.  |
 `------------------------------------------------------------------*/
@@ -2997,7 +2999,7 @@
   char *cp = fetch_type_name (text + 1, &type_name, dollar_loc);
   int n = parse_ref (cp, effective_rule, effective_rule_length,
                      rule->midrule_parent_rhs_index, text, dollar_loc, '$');
-  /* End type_name.  Don't do it ealier: parse_ref depends on TEXT.  */
+  /* End type_name.  Don't do it earlier: parse_ref depends on TEXT.  */
   if (type_name)
     cp[-1] = '\0';
 
@@ -3134,19 +3136,10 @@
 static char const *
 translate_action (code_props *self, int sc_context)
 {
-  static bool initialized = false;
-  if (!initialized)
-    {
-      obstack_init (&obstack_for_string);
-      yy_flex_debug = 0;
-      initialized = true;
-    }
-
   loc->start = loc->end = self->location.start;
   yy_switch_to_buffer (yy_scan_string (self->code));
   char *res = code_lex (self, sc_context);
   yy_delete_buffer (YY_CURRENT_BUFFER);
-
   return res;
 }
 
@@ -3220,7 +3213,14 @@
 void
 code_scanner_last_string_free (void)
 {
-  STRING_FREE;
+  STRING_FREE ();
+}
+
+void
+code_scanner_init (void)
+{
+  obstack_init (&obstack_for_string);
+  yy_flex_debug = 0;
 }
 
 void
diff --git a/src/scan-code.h b/src/scan-code.h
index 483fe9b..05b2d23 100644
--- a/src/scan-code.h
+++ b/src/scan-code.h
@@ -1,6 +1,6 @@
 /* Bison code properties structure and scanner.
 
-   Copyright (C) 2006-2007, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2006-2007, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef SCAN_CODE_H_
 # define SCAN_CODE_H_
@@ -35,6 +35,11 @@
 extern int max_left_semantic_context;
 
 /**
+ * The obstack used to store the translated actions.
+ */
+extern struct obstack *obstack_for_actions;
+
+/**
  * A code passage captured from the grammar file and possibly translated,
  * and/or properties associated with such a code passage.  Don't break
  * encapsulation by modifying the fields directly.  Use the provided interface
@@ -145,6 +150,7 @@
                                     location code_loc);
 
 /**
+ * \param  type   type for midrule actions
  * \pre
  *   - <tt>self != NULL</tt>.
  *   - <tt>code != NULL</tt>.
@@ -190,6 +196,8 @@
  */
 void code_scanner_last_string_free (void);
 
+void code_scanner_init (void);
+
 /**
  * \pre
  *   - None.
diff --git a/src/scan-code.l b/src/scan-code.l
index 563baf5..fced37d 100644
--- a/src/scan-code.l
+++ b/src/scan-code.l
@@ -1,6 +1,6 @@
 /* Bison Action Scanner                             -*- C -*-
 
-   Copyright (C) 2006-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2006-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,7 +15,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 %option debug nodefault noinput nounput noyywrap never-interactive
 %option prefix="code_" outfile="lex.yy.c"
@@ -25,21 +25,23 @@
 #include <get-errno.h>
 #include <quote.h>
 
-#include <src/complain.h>
-#include <src/getargs.h>
-#include <src/muscle-tab.h>
-#include <src/reader.h>
-#include <src/scan-code.h>
-#include <src/symlist.h>
+#include "src/complain.h"
+#include "src/getargs.h"
+#include "src/muscle-tab.h"
+#include "src/reader.h"
+#include "src/scan-code.h"
+#include "src/symlist.h"
 
 #define FLEX_PREFIX(Id) code_ ## Id
-#include <src/flex-scanner.h>
+#include "src/flex-scanner.h"
 
 /* Work around a bug in flex 2.5.31.  See Debian bug 333231
-   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
+   <https://bugs.debian.org/333231>.  */
 #undef code_wrap
 #define code_wrap() 1
 
+struct obstack *obstack_for_actions = &obstack_for_string;
+
 /* The current calling start condition: SC_RULE_ACTION or
    SC_SYMBOL_ACTION. */
 # define YY_DECL static char *code_lex (code_props *self, int sc_context)
@@ -81,7 +83,7 @@
    historically almost any character is allowed in a tag.  We disallow
    NUL and newline, as this simplifies our implementation.  We allow
    "->" as a means to dereference a pointer.  */
-tag      ([^\0\n>]|->)+
+tag      ([^\0\n>]|->)*[^-]
 
 /* Zero or more instances of backslash-newline.  Following GCC, allow
    white space between the backslash and the newline.  */
@@ -90,8 +92,8 @@
 /* C style identifier. Must start with letter. Will be used for
    named symbol references. Shall be kept synchronized with
    scan-gram.l "letter" and "id". */
-letter    [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]
-id        {letter}({letter}|[-0-9])*
+letter   [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]
+id       {letter}({letter}|[-0-9])*
 ref      -?[0-9]+|{id}|"["{id}"]"|"$"
 
 %%
@@ -112,7 +114,7 @@
 
 <SC_COMMENT>
 {
-  "*"{splice}"/"  STRING_GROW; BEGIN sc_context;
+  "*"{splice}"/"  STRING_GROW (); BEGIN sc_context;
 }
 
 
@@ -122,8 +124,8 @@
 
 <SC_LINE_COMMENT>
 {
-  "\n"           STRING_GROW; BEGIN sc_context;
-  {splice}       STRING_GROW;
+  "\n"           STRING_GROW (); BEGIN sc_context;
+  {splice}       STRING_GROW ();
 }
 
 
@@ -133,26 +135,26 @@
 
 <SC_CHARACTER,SC_STRING>
 {
-  {splice}|\\{splice}.  STRING_GROW;
+  {splice}|\\{splice}.  STRING_GROW ();
 }
 
 <SC_CHARACTER>
 {
-  "'"           STRING_GROW; BEGIN sc_context;
+  "'"           STRING_GROW (); BEGIN sc_context;
 }
 
 <SC_STRING>
 {
-  "\""          STRING_GROW; BEGIN sc_context;
+  "\""          STRING_GROW (); BEGIN sc_context;
 }
 
 
 <SC_RULE_ACTION,SC_SYMBOL_ACTION>
 {
-  "'"              STRING_GROW; BEGIN SC_CHARACTER;
-  "\""             STRING_GROW; BEGIN SC_STRING;
-  "/"{splice}"*"   STRING_GROW; BEGIN SC_COMMENT;
-  "/"{splice}"/"   STRING_GROW; BEGIN SC_LINE_COMMENT;
+  "'"              STRING_GROW (); BEGIN SC_CHARACTER;
+  "\""             STRING_GROW (); BEGIN SC_STRING;
+  "/"{splice}"*"   STRING_GROW (); BEGIN SC_COMMENT;
+  "/"{splice}"/"   STRING_GROW (); BEGIN SC_LINE_COMMENT;
 
   [$@]  {
     complain (loc, Wother, _("stray '%s'"), yytext);
@@ -199,10 +201,10 @@
   [$@\[\]]    obstack_escape (&obstack_for_string, yytext);
 
   /* By default, grow the string obstack with the input.  */
-  .|\n        STRING_GROW;
+  .|\n        STRING_GROW ();
 
- /* End of processing. */
-  <<EOF>>     STRING_FINISH; return last_string;
+  /* End of processing. */
+  <<EOF>>     STRING_FINISH (); return last_string;
 }
 
 %%
@@ -321,14 +323,14 @@
 show_sub_message (warnings warning,
                   const char* cp, bool explicit_bracketing,
                   int midrule_rhs_index, char dollar_or_at,
-                  int indent, const variant *var)
+                  const variant *var)
 {
   const char *at_spec = get_at_spec (var->symbol_index);
 
   if (var->err == 0)
-    complain_indent (&var->loc, warning, &indent,
-                     _("refers to: %c%s at %s"), dollar_or_at,
-                     var->id, at_spec);
+    subcomplain (&var->loc, warning,
+                 _("refers to: %c%s at %s"), dollar_or_at,
+                 var->id, at_spec);
   else
     {
       const char *id;
@@ -375,8 +377,8 @@
                         _(", cannot be accessed from midrule action at $%d"),
                         midrule_rhs_index);
 
-      complain_indent (&id_loc, warning, &indent, "%s",
-                        obstack_finish0 (&msg_buf));
+      subcomplain (&id_loc, warning, "%s",
+                   obstack_finish0 (&msg_buf));
       obstack_free (&msg_buf, 0);
     }
 }
@@ -384,14 +386,13 @@
 static void
 show_sub_messages (warnings warning,
                    const char* cp, bool explicit_bracketing,
-                   int midrule_rhs_index, char dollar_or_at,
-                   int indent)
+                   int midrule_rhs_index, char dollar_or_at)
 {
   for (int i = 0; i < variant_count; ++i)
     show_sub_message (warning | silent,
                       cp, explicit_bracketing,
                       midrule_rhs_index, dollar_or_at,
-                      indent, &variant_table[i]);
+                      &variant_table[i]);
 }
 
 /* Returned from "parse_ref" when the reference
@@ -402,6 +403,23 @@
    points to LHS ($$) of the current rule or midrule. */
 #define LHS_REF (INT_MIN + 1)
 
+/* Parse a positional reference in RULE.  */
+static long
+parse_positional_ref (char *cp, int rule_length,
+                      char *text, const location *text_loc)
+{
+  long num = strtol (cp, &cp, 10);
+  if (1 - INT_MAX + rule_length <= num && num <= rule_length)
+    return num;
+  else
+    {
+      complain (text_loc, complaint, _("integer out of range: %s"),
+                quote (text));
+      return INVALID_REF;
+    }
+}
+
+
 /* Parse named or positional reference. In case of positional
    references, can return negative values for $-n "deep" stack
    accesses. */
@@ -413,18 +431,8 @@
   if ('$' == *cp)
     return LHS_REF;
 
-  if (c_isdigit (*cp) || (*cp == '-' && c_isdigit (* (cp + 1))))
-    {
-      long num = strtol (cp, &cp, 10);
-      if (1 - INT_MAX + rule_length <= num && num <= rule_length)
-        return num;
-      else
-        {
-          complain (text_loc, complaint, _("integer out of range: %s"),
-                    quote (text));
-          return INVALID_REF;
-        }
-    }
+  if (c_isdigit (*cp) || (*cp == '-' && c_isdigit (cp[1])))
+    return parse_positional_ref (cp, rule_length, text, text_loc);
 
   bool const explicit_bracketing = *cp == '[';
 
@@ -492,47 +500,44 @@
       {
         int len = (explicit_bracketing || !ref_tail_fields) ?
           cp_end - cp : ref_tail_fields - cp;
-        int indent = 0;
 
-        complain_indent (text_loc, complaint, &indent,
-                         _("invalid reference: %s"), quote (text));
-        indent += SUB_INDENT;
+        complain (text_loc, complaint,
+                  _("invalid reference: %s"), quote (text));
         if (len == 0)
           {
             location sym_loc = *text_loc;
             sym_loc.start.column += 1;
             sym_loc.end = sym_loc.start;
-            complain_indent (&sym_loc, complaint, &indent,
-                             _("syntax error after '%c', expecting integer, "
-                               "letter, '_', '[', or '$'"),
-                             dollar_or_at);
+            subcomplain (&sym_loc, complaint,
+                         _("syntax error after '%c', expecting integer, "
+                         "letter, '_', '[', or '$'"),
+                         dollar_or_at);
           }
         else if (midrule_rhs_index)
-          complain_indent (&rule->rhs_loc, complaint, &indent,
-                           _("symbol not found in production before $%d: "
-                             "%.*s"),
-                           midrule_rhs_index, len, cp);
+          subcomplain (&rule->rhs_loc, complaint,
+                       _("symbol not found in production before $%d: "
+                       "%.*s"),
+                       midrule_rhs_index, len, cp);
         else
-          complain_indent (&rule->rhs_loc, complaint, &indent,
-                           _("symbol not found in production: %.*s"),
-                           len, cp);
+          subcomplain (&rule->rhs_loc, complaint,
+                       _("symbol not found in production: %.*s"),
+                       len, cp);
 
         if (variant_count > 0)
           show_sub_messages (complaint,
                              cp, explicit_bracketing, midrule_rhs_index,
-                             dollar_or_at, indent);
+                             dollar_or_at);
         return INVALID_REF;
       }
     case 1:
       {
-        int indent = 0;
         if (variant_count > 1)
           {
-            complain_indent (text_loc, Wother, &indent,
-                             _("misleading reference: %s"), quote (text));
+            complain (text_loc, Wother,
+                      _("misleading reference: %s"), quote (text));
             show_sub_messages (Wother,
                                cp, explicit_bracketing, midrule_rhs_index,
-                               dollar_or_at, indent + SUB_INDENT);
+                               dollar_or_at);
           }
         {
           int symbol_index =
@@ -543,12 +548,11 @@
     case 2:
     default:
       {
-        int indent = 0;
-        complain_indent (text_loc, complaint, &indent,
-                         _("ambiguous reference: %s"), quote (text));
+        complain (text_loc, complaint,
+                  _("ambiguous reference: %s"), quote (text));
         show_sub_messages (complaint,
                            cp, explicit_bracketing, midrule_rhs_index,
-                           dollar_or_at, indent + SUB_INDENT);
+                           dollar_or_at);
         return INVALID_REF;
       }
     }
@@ -590,7 +594,7 @@
 /*------------------------------------------------------------------.
 | TEXT is pointing to a wannabee semantic value (i.e., a '$').      |
 |                                                                   |
-| Possible inputs: $[<TYPENAME>]($|integer)                         |
+| Possible inputs: $[<TYPENAME>]($|INTEGER)                         |
 |                                                                   |
 | Output to OBSTACK_FOR_STRING a reference to this semantic value.  |
 `------------------------------------------------------------------*/
@@ -617,7 +621,7 @@
   char *cp = fetch_type_name (text + 1, &type_name, dollar_loc);
   int n = parse_ref (cp, effective_rule, effective_rule_length,
                      rule->midrule_parent_rhs_index, text, dollar_loc, '$');
-  /* End type_name.  Don't do it ealier: parse_ref depends on TEXT.  */
+  /* End type_name.  Don't do it earlier: parse_ref depends on TEXT.  */
   if (type_name)
     cp[-1] = '\0';
 
@@ -754,19 +758,10 @@
 static char const *
 translate_action (code_props *self, int sc_context)
 {
-  static bool initialized = false;
-  if (!initialized)
-    {
-      obstack_init (&obstack_for_string);
-      yy_flex_debug = 0;
-      initialized = true;
-    }
-
   loc->start = loc->end = self->location.start;
   yy_switch_to_buffer (yy_scan_string (self->code));
   char *res = code_lex (self, sc_context);
   yy_delete_buffer (YY_CURRENT_BUFFER);
-
   return res;
 }
 
@@ -840,7 +835,14 @@
 void
 code_scanner_last_string_free (void)
 {
-  STRING_FREE;
+  STRING_FREE ();
+}
+
+void
+code_scanner_init (void)
+{
+  obstack_init (&obstack_for_string);
+  yy_flex_debug = 0;
 }
 
 void
diff --git a/src/scan-gram.c b/src/scan-gram.c
index 91a94c5..ab42939 100644
--- a/src/scan-gram.c
+++ b/src/scan-gram.c
@@ -691,8 +691,8 @@
 /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\
 	(yy_c_buf_p) = yy_cp;
 /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */
-#define YY_NUM_RULES 127
-#define YY_END_OF_BUFFER 128
+#define YY_NUM_RULES 132
+#define YY_END_OF_BUFFER 133
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -700,74 +700,76 @@
 	flex_int32_t yy_verify;
 	flex_int32_t yy_nxt;
 	};
-static const flex_int16_t yy_accept[600] =
+static const flex_int16_t yy_accept[612] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   91,   91,  111,  111,  111,  111,    0,    0,
-        0,    0,  128,   78,    2,    2,    2,   69,   78,   68,
-       78,    1,   64,   78,   65,   65,   60,   63,   75,   61,
-       64,   77,   71,   62,   78,   88,   88,   88,  126,  126,
-       93,  126,   92,  126,  126,  126,  126,  126,  126,  126,
-      126,   79,   95,  126,   94,   82,    2,    2,    1,   82,
-       81,   80,   82,   97,   97,   98,   96,   79,  117,  126,
-      116,  126,  126,  126,  120,  123,  124,  126,   90,  126,
+        0,    0,    0,    0,   93,   93,  116,  116,  116,  116,
+        0,    0,    0,    0,  133,   80,    2,    2,    2,   70,
+       80,   69,   80,    1,   65,   80,   66,   66,   61,   64,
+       77,   62,   65,   79,   65,   73,   63,   80,   90,   90,
+       90,  131,  131,   99,  131,   98,  115,  131,  131,  131,
+      131,  131,  131,  131,   81,   95,   94,   97,  131,   84,
+        2,    2,    1,   84,   83,   82,   84,  101,  101,  102,
+      100,   81,  122,  131,  121,  131,  131,  131,  125,  128,
 
-      126,  115,  126,  114,  126,  113,  126,  112,   85,    2,
-        2,    1,   83,   85,   85,   84,   85,   86,    2,    2,
-        1,   86,   86,   78,    2,   76,   59,    0,   59,   59,
-       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-       59,   59,   59,   59,   59,   59,   70,   64,   64,    4,
-        3,   67,   65,   67,    0,   74,    0,   88,   87,   93,
-      110,  110,  108,   99,  110,  101,  102,  103,  104,  105,
-      106,  110,  107,  110,  126,    0,    0,    0,    0,    0,
-        0,   95,   97,   97,   98,  125,  118,  119,    0,  121,
-        0,  120,  122,    0,   89,    0,   90,    0,   91,    0,
+      129,  131,   92,  131,  131,  120,  131,  119,  131,  118,
+      131,  117,   87,    2,    2,    1,   85,   87,   87,   86,
+       87,   88,    2,    2,    1,   88,   88,   80,    2,   78,
+       60,    0,   60,   60,   60,   60,   60,   60,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       60,   72,   65,   65,    4,    3,   68,   66,   68,    0,
+       76,    0,    0,   90,   89,   99,  114,  114,  112,  103,
+      114,  105,  106,  107,  108,  109,  110,  114,  111,  114,
+      131,    0,    0,    0,    0,    0,    0,   96,  101,  101,
+      102,  130,  123,  124,    0,  126,    0,  125,  127,    0,
 
-      115,  111,  111,  111,  111,  111,  113,   85,   83,   59,
-        0,    0,   72,   59,   59,   59,   59,   59,   59,   59,
-       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-       59,   59,   59,   59,    3,   67,   66,   73,    0,   99,
-        0,    0,  100,    0,    0,    0,    0,    0,    0,    0,
+       91,    0,   92,    0,   93,    0,  120,  116,  116,  116,
+      116,  116,  118,   87,   85,   60,    0,    0,   74,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       60,    3,   68,   67,   75,   71,    0,  103,    0,    0,
+      104,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,   59,   59,   59,   59,   59,
-       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
+        0,    0,    0,   60,   60,   60,   60,   60,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
 
-       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-       59,   59,   59,    0,   99,    0,    0,   59,    7,   59,
-       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-       59,   59,   21,   59,   59,   59,   59,   59,   59,   59,
-       59,   59,   59,   59,   59,   59,   59,   33,   59,   59,
-       59,   59,   59,   59,   40,   59,   43,   59,   59,   46,
-        0,    0,    0,   59,    8,   59,   59,   59,   13,   14,
-       59,   59,   59,   59,   59,   59,   59,   59,   59,   24,
-       59,   59,   59,   59,   59,   59,   59,   29,   59,   31,
-       59,   59,   59,   59,   59,   37,   59,   39,   41,   44,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       60,   60,    0,  103,    0,    0,   60,    7,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       60,   60,   22,   60,   60,   60,   60,   60,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   34,   60,   60,
+       60,   60,   60,   60,   41,   60,   44,   60,   60,   47,
+        0,    0,    0,   60,    8,   60,   60,   60,   13,   14,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       25,   60,   60,   60,   60,   60,   60,   60,   30,   60,
 
-       59,    0,    0,  109,    6,   59,   10,   59,   59,   59,
-       15,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-       59,   59,   59,   59,   59,   30,   59,   59,   59,   59,
-       59,   59,   59,   59,   59,    0,   59,   11,   59,   59,
-       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-       59,   59,   59,   59,   59,   59,   59,    0,   57,   59,
-       59,   35,   59,   36,   59,   59,   59,   45,    5,    0,
-        0,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-       59,   59,   20,   59,   59,   59,   59,   26,   59,   56,
-       27,   59,   59,   59,   59,   38,   59,   59,    0,   59,
+       32,   60,   60,   60,   60,   60,   38,   60,   40,   42,
+       45,   60,    0,    0,  113,    6,   60,   10,   60,   60,
+       60,   15,   60,   60,   60,   19,   60,   60,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   31,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,    0,   60,   11,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,    0,
+       58,   60,   60,   36,   60,   37,   60,   60,   60,   46,
+        5,    0,    0,   60,   60,   60,   60,   60,   60,   60,
+       60,   60,   60,   60,   21,   60,   60,   60,   60,   27,
 
-       59,   59,   59,   59,   16,   52,   59,   59,   59,   59,
-       22,   23,   59,   59,   59,   59,   59,   59,   59,   59,
-       59,    0,    0,   59,   59,   12,   59,   59,   59,   59,
-       19,   59,   59,   59,   59,   59,   59,   34,   59,   59,
-       59,    0,   59,   59,   59,   59,   17,   59,   59,   49,
-       59,   59,   59,   32,   47,   42,   58,    9,   50,   59,
-       59,    0,   53,   59,   59,   49,   49,   59,   59,   59,
-       48,   51,   59,   59,   49,   59,   59,   59,   59,   18,
-       59,   59,   59,   59,   25,   55,   59,   59,   59,   59,
-       59,   54,   59,   59,   59,   59,   59,   28,    0
+       60,   57,   28,   60,   60,   60,   60,   39,   60,   60,
+        0,   60,   60,   60,   60,   60,   16,   53,   60,   60,
+       60,   60,   23,   24,   60,   60,   60,   60,   60,   60,
+       60,   60,   60,    0,    0,   60,   60,   12,   60,   60,
+       60,   60,   18,   60,   60,   60,   60,   60,   60,   35,
+       60,   60,   60,    0,   60,   60,   60,   60,   17,   60,
+       60,   50,   60,   60,   60,   33,   48,   43,   59,    9,
+       51,   60,   60,    0,   54,   60,   60,   50,   50,   60,
+       60,   60,   49,   52,   60,   60,   50,   60,   60,   60,
+       60,   20,   60,   60,   60,   60,   26,   56,   60,   60,
 
+       60,   60,   60,   55,   60,   60,   60,   60,   60,   29,
+        0
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -775,17 +777,17 @@
         1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
         4,    4,    5,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    6,    7,    8,    9,    7,   10,    7,   11,    7,
-        7,   12,    7,   13,   14,   15,   16,   17,   18,   18,
-       18,   18,   18,   18,   18,   19,   19,   20,   21,   22,
-       23,   24,   25,   26,   27,   27,   27,   27,   27,   27,
-       28,   28,   28,   28,   28,   28,   28,   28,   28,   28,
-       28,   28,   28,   28,   29,   28,   28,   30,   28,   28,
-       31,   32,   33,   26,   34,   26,   35,   36,   37,   38,
+        1,    6,    7,    8,    9,    7,   10,    7,   11,   12,
+       13,   14,    7,   15,   16,   17,   18,   19,   20,   20,
+       20,   20,   20,   20,   20,   21,   21,   22,   23,   24,
+       25,   26,   27,    7,   28,   28,   28,   28,   28,   28,
+       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
+       29,   29,   29,   29,   30,   29,   29,   31,   29,   29,
+       32,   33,   34,    7,   35,    7,   36,   37,   38,   39,
 
-       39,   40,   41,   42,   43,   28,   44,   45,   46,   47,
-       48,   49,   50,   51,   52,   53,   54,   55,   28,   56,
-       57,   28,   58,   59,   60,   26,   61,   62,   62,   62,
+       40,   41,   42,   43,   44,   29,   45,   46,   47,   48,
+       49,   50,   51,   52,   53,   54,   55,   56,   29,   57,
+       58,   29,   59,   60,   61,    7,    1,   62,   62,   62,
        62,   62,   62,   62,   62,   62,   62,   62,   62,   62,
        62,   62,   62,   63,   63,   63,   63,   63,   63,   63,
        63,   63,   63,   63,   63,   63,   63,   63,   63,   64,
@@ -805,321 +807,321 @@
 static const YY_CHAR yy_meta[73] =
     {   0,
         1,    2,    3,    2,    2,    2,    1,    4,    1,    4,
-        4,    4,    4,    5,    6,    2,    7,    7,    7,    8,
-        9,   10,    9,   10,    8,    8,    7,    7,    7,    7,
-       11,    8,   12,    7,    7,    7,    7,    7,    7,    7,
+        4,    1,    1,    4,    4,    5,    6,    2,    7,    7,
+        7,    1,    4,    8,    4,    8,    1,    7,    7,    7,
+        7,    9,    1,   10,    7,    7,    7,    7,    7,    7,
         7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
-        7,    7,    7,    7,    7,    7,    7,    9,    9,    9,
-        8,    8,    8,    8,    1,    1,    1,    1,    1,    1,
-        1,    8
+        7,    7,    7,    7,    7,    7,    7,    7,    4,    4,
+        4,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1
     } ;
 
-static const flex_int16_t yy_base[618] =
+static const flex_int16_t yy_base[629] =
     {   0,
-        0, 1341,   68,   69,   81,  153,   85,   89,   99,  105,
-      102,  109,  157,  161,  231,  301,  179,  194,  371,  441,
-      195,  247,  241,  253,  266,  267,  273,  319,  513, 1340,
-      344,  362, 1348,    0, 1351, 1351, 1344, 1351,  576, 1351,
-     1351, 1351,  634,   63,  278,   59,    0, 1351,   71, 1351,
-        0, 1351, 1351, 1351, 1301, 1351, 1342, 1328, 1351, 1351,
-     1351, 1340, 1351,  702,   65, 1278,   75,   36,    0,  116,
-     1279, 1351, 1351, 1337, 1351, 1351, 1351, 1336, 1351,   75,
-     1351, 1351, 1293, 1323,  108, 1314, 1351, 1321, 1351, 1274,
-     1351,  143,  159,  255, 1351, 1351, 1351,  154, 1351, 1330,
+        0, 1327,   68,   69,   83,  155,   87,   88,   97,   98,
+      108,  159,  101,  108,  179,  195,  265,  335,  227,  228,
+      405,  475,  238,  239,  251,  275,  282,  298,  302,  309,
+      547, 1326,  346,  373, 1334,    0, 1337, 1337, 1330, 1337,
+      610, 1337, 1337, 1337,  669,   61,  100,   57,    0, 1337,
+       71, 1337,    0, 1337, 1320, 1337, 1337, 1285, 1337, 1327,
+     1311, 1337, 1337, 1337, 1325, 1337,  737,   73, 1263,   79,
+       18,   65,  107, 1264, 1337, 1337, 1337, 1337, 1312, 1337,
+     1337, 1321, 1337,  104, 1337, 1337, 1277, 1306,  159, 1297,
+     1337, 1304, 1337, 1258, 1337,  178,  146,  183, 1337, 1337,
 
-      338, 1351, 1329, 1351,  392, 1351, 1328, 1351,    0, 1351,
-     1327,    0,    0,  176, 1351, 1351, 1284, 1351, 1351, 1325,
-     1351,  192, 1282,    0, 1351, 1351,    0,  350, 1283, 1277,
-      157,  184, 1281, 1278, 1275,  253, 1282,  267, 1266,  177,
-      170,  201,  344, 1272, 1279, 1282, 1351,    0,    0, 1351,
-        0,    0,  318,  398, 1292, 1351, 1272, 1351, 1351, 1351,
-     1351, 1311, 1351,  117,  441, 1351, 1351, 1351, 1351, 1351,
-     1351,  447, 1351,  471, 1351,  322,  326,  342,  347,  350,
-      356, 1351, 1299,  224, 1290, 1351, 1351, 1351,  489, 1351,
-      590, 1351, 1351,  634, 1351,  712, 1351,  719, 1279, 1307,
+     1337,   71, 1337, 1315,  381, 1337, 1314, 1337,  395, 1337,
+     1313, 1337,    0, 1337, 1312,    0,    0,  181, 1337, 1337,
+     1268, 1337, 1337, 1310, 1337,  190, 1266,    0, 1337, 1337,
+        0,  400, 1267, 1261,  136,  212, 1265, 1262, 1267, 1258,
+      255, 1265,  243, 1249,  211,  170,  203,  276, 1255, 1262,
+     1265, 1337,    0,    0, 1337,    0,    0,  298,  405, 1274,
+     1337, 1291, 1254, 1337, 1337, 1337, 1337, 1294, 1337,  119,
+      411, 1337, 1337, 1337, 1337, 1337, 1337,  434, 1337,  475,
+     1337,  265,  293,  303,  309,  355,  358, 1337, 1280,  239,
+     1271, 1337, 1337, 1337,  485, 1337,  515, 1337, 1337,  520,
 
-     1351, 1351,  741, 1277, 1305,  757, 1351,    0,    0,    0,
-      762, 1304, 1351, 1259, 1267,  228, 1253, 1254, 1251, 1252,
-       61, 1249, 1256, 1251,  254, 1260, 1245, 1249,  393, 1255,
-     1240, 1241,  243, 1240, 1240, 1248, 1249, 1252, 1235, 1241,
-     1235, 1240, 1231, 1244,    0,    0,    0, 1351, 1233,  123,
-      752,  758,  786,  359,  391,  407,  778,  416, 1276,  804,
-      294, 1275,  812,  348, 1274,  825,  284, 1273,  830,  835,
-     1272,  840,  845,  464, 1271, 1238, 1233, 1217,  286, 1217,
-     1230, 1215, 1219, 1227, 1226, 1225, 1249, 1209, 1220, 1207,
-     1245, 1223, 1216, 1217,  156,  245,  222, 1204, 1205,  279,
+     1337,  525, 1337,  535, 1261, 1290, 1337, 1337,  540, 1259,
+     1288,  619, 1337,    0,    0,    0,  628, 1287, 1337, 1241,
+     1249,  426, 1235, 1236, 1233, 1234,   87, 1231, 1246, 1237,
+     1232,  126, 1241, 1226, 1230,  379, 1236, 1221, 1222,  237,
+     1221, 1221, 1229, 1230, 1233, 1216, 1222, 1216, 1221, 1212,
+     1225,    0,    0,    0, 1337, 1337, 1214,  182,  760,  783,
+      789,  372,  394,  438,  669,  451, 1258,  747,  306, 1257,
+      756,  744, 1256,  810,  176, 1255,  829,  834, 1254,  839,
+      844,  255, 1253, 1219, 1214, 1198,   71, 1198, 1211, 1196,
+     1200, 1208, 1207, 1206, 1229, 1205, 1189, 1200, 1187, 1224,
 
-     1216, 1205, 1212, 1196, 1207, 1203, 1196, 1200, 1206, 1205,
-     1195, 1206, 1204, 1201, 1351,  835,  841, 1188,    0, 1197,
-     1183, 1189, 1184, 1197, 1176, 1181, 1194, 1216, 1191, 1179,
-     1184, 1172,    0, 1176, 1171, 1184,  416, 1183, 1178, 1181,
-     1176, 1166, 1178, 1170, 1161, 1168, 1174, 1173, 1158,  427,
-     1167, 1156, 1169, 1154,    0, 1159,    0, 1158, 1156,    0,
-     1197,  865,  871, 1145,    0, 1156, 1161, 1145,    0,    0,
-      428, 1145, 1148,  573, 1161, 1160, 1159, 1158, 1149,    0,
-     1142, 1150, 1142, 1148, 1140, 1134, 1132,    0, 1131,    0,
-     1169, 1144, 1142, 1131, 1128,    0, 1125,    0,  574,    0,
+     1203, 1196, 1197,  323,  422,  198, 1184, 1185,  305, 1196,
+     1185, 1192, 1176, 1187, 1183, 1176, 1180, 1186, 1185, 1175,
+     1186, 1184, 1181, 1337,  832,  838, 1168,    0, 1177, 1163,
+     1169, 1164, 1177, 1156, 1161, 1174, 1195, 1171, 1159, 1168,
+     1163, 1151,    0, 1155, 1150, 1163,  286, 1162, 1157, 1160,
+     1155, 1145, 1157, 1149, 1140, 1147, 1153, 1152, 1137,  328,
+     1146, 1135, 1148, 1133,    0, 1138,    0, 1137, 1135,    0,
+     1177,  861,  867, 1124,    0, 1135, 1140, 1124,    0,    0,
+      374, 1124, 1127,  376, 1140, 1123, 1138, 1137, 1136, 1127,
+        0, 1120, 1128, 1120, 1126, 1118, 1112, 1110,    0, 1109,
 
-     1125,  485,  895, 1351,    0, 1123, 1123, 1137, 1118, 1117,
-      575, 1120, 1122, 1118, 1123, 1126, 1115, 1117, 1113, 1128,
-     1123, 1126, 1121, 1111, 1119,  913, 1108, 1117, 1104, 1119,
-     1114, 1104, 1098, 1097, 1110,  639,  678,    0, 1095, 1108,
-     1107, 1094, 1093, 1104, 1088, 1080, 1103, 1065, 1068, 1053,
-     1060, 1031,  999,  996,  997, 1010,  993,  921, 1351, 1008,
-      995,    0,  928,    0,  931,  942,  941,    0, 1351,  972,
-      966,  924,  923,  922,  918,  917,  916,  914,  924,  904,
-      917,  920,    0,  897,  890,  889,  883,    0,  876,    0,
-        0,  874,  848,  854,  835,    0,  850,  849,  861,  810,
+        0, 1146, 1122, 1120, 1109, 1106,    0, 1103,    0,  377,
+        0, 1103,  485,  890, 1337,    0, 1101, 1101, 1115, 1096,
+     1095,  712, 1098, 1100, 1096,    0, 1101, 1104, 1093, 1095,
+     1091, 1106, 1101, 1104, 1099, 1089, 1097,  859, 1086, 1095,
+     1082, 1097, 1092, 1082, 1076, 1075, 1088,  623,  728,    0,
+     1073, 1086, 1085, 1072, 1071, 1082, 1066, 1067, 1103, 1078,
+     1081, 1068, 1075, 1059, 1060, 1057, 1058, 1072, 1057,  888,
+     1337, 1072, 1059,    0, 1054,    0, 1057, 1068, 1067,    0,
+     1337, 1099, 1093, 1050, 1049, 1049, 1038, 1025, 1014, 1013,
+     1021, 1007, 1009,  989,    0,  977,  970,  979,  973,    0,
 
-      806,  805,  819,  783,    0,    0,  769,  762,  751,  764,
-        0,    0,  757,  746,  733,  735,  739,  734,  733,  709,
-      707,  743,  594,  709,  702,    0,  692,  691,  680,  681,
-        0,  680,  676,  694,  695,  679,  665,    0,  643,  654,
-      626,  229,  618,  613,  595,  594,  935,  547,  555,  943,
-      541,  463,  462,    0,    0,    0,    0,    0,    0,  461,
-      458,  948, 1351,  716,  427,  957,  861,  421,  405,  395,
-        0,    0,  405,  392,  891,  387,  363,  347,  356,    0,
-      340,  335,  326,  318,    0,    0,  325,  293,  314,  255,
-      244,    0,  227,  192,  124,  124,   69,    0, 1351,  980,
+      972,    0,    0,  912,  906,  919,  903,    0,  917,  916,
+      917,  872,  865,  864,  878,  877,    0,    0,  868,  846,
+      833,  845,    0,    0,  823,  802,  801,  810,  782,  767,
+      766,  759,  740,  775,  779,  735,  732,    0,  720,  717,
+      698,  688,    0,  676,  672,  730,  755,  653,  648,    0,
+      642,  653,  652,  473,  646,  645,  627,  626,  917,  623,
+      592,  930,  585,  485,  489,    0,    0,    0,    0,    0,
+        0,  492,  470,  935, 1337,  760,  460,  941,  946,  455,
+      446,  444,    0,    0,  451,  434,  959,  420,  400,  383,
+      345,    0,  342,  322,  292,  287,    0,    0,  292,  282,
 
-      992, 1004, 1016, 1028, 1040, 1047, 1050, 1057, 1063, 1075,
-     1087, 1097, 1104, 1107, 1114, 1122, 1129
+      280,  241,  232,    0,  238,  188,  176,  175,  126,    0,
+     1337,  966,  976,  986,  996, 1006, 1016, 1021, 1024, 1031,
+     1041, 1051, 1059, 1064, 1067, 1074, 1080, 1087
     } ;
 
-static const flex_int16_t yy_def[618] =
+static const flex_int16_t yy_def[629] =
     {   0,
-      599,    1,  600,  600,  601,  601,    6,    6,  602,  602,
-      603,  603,    6,    6,    6,    6,    6,    6,    6,    6,
-        6,    6,    6,    6,    6,    6,    6,    6,  599,   29,
-      604,  604,  599,  605,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  599,  606,  606,  605,  599,  599,  599,
-      607,  599,  599,  599,  605,  599,  599,  599,  599,  599,
-      599,  599,  599,  608,  599,  599,  599,  599,  609,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  610,  610,  599,  599,  610,  599,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
+      611,    1,  612,  612,  613,  613,    6,    6,    6,    6,
+      614,  614,  615,  615,    6,    6,    6,    6,    6,    6,
+        6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
+      611,   31,  616,  616,  611,  617,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  618,  618,  617,  611,
+      611,  611,  619,  611,  619,  611,  611,  617,  611,  611,
+      611,  611,  611,  611,  611,  611,  620,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  621,  621,  611,
+      611,  621,  611,  611,  611,  611,  611,  611,  611,  611,
 
-      599,  599,  599,  599,  611,  599,  599,  599,  612,  599,
-      599,  612,  613,  599,  599,  599,  612,  599,  599,  599,
-      599,  599,  599,  605,  599,  599,  614,  599,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  599,   43,  607,  599,
-      615,  616,  606,  616,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  610,  610,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
+      611,  611,  611,  611,  611,  611,  611,  611,  622,  611,
+      611,  611,  623,  611,  611,  623,  624,  611,  611,  611,
+      623,  611,  611,  611,  611,  611,  611,  617,  611,  611,
+      625,  611,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  611,   45,  619,  611,  626,  627,  618,  627,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  621,  621,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
 
-      599,  599,  599,  599,  599,  599,  599,  612,  613,  614,
-      599,  599,  599,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  615,  616,  154,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  611,  599,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  623,  624,  625,  611,  611,  611,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  626,  627,  159,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  622,  611,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
 
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  599,  599,  599,  599,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      599,  599,  599,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  611,  611,  611,  611,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      611,  611,  611,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
 
-      614,  599,  599,  599,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  599,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  599,  599,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  599,  599,
-      599,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  617,  614,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  611,  611,  611,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  611,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  611,
+      611,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      611,  611,  611,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
 
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  617,  617,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  617,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  599,  599,  614,  614,  599,  599,  614,  614,  614,
-      614,  614,  614,  614,  599,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
-      614,  614,  614,  614,  614,  614,  614,  614,    0,  599,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      628,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  628,  628,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  628,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  611,  611,  625,  625,  611,  611,  625,
+      625,  625,  625,  625,  625,  625,  611,  625,  625,  625,
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
 
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  599
+      625,  625,  625,  625,  625,  625,  625,  625,  625,  625,
+        0,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611
     } ;
 
-static const flex_int16_t yy_nxt[1424] =
+static const flex_int16_t yy_nxt[1410] =
     {   0,
-       34,   35,   36,   35,   37,   35,   34,   38,   34,   39,
-       40,   41,   42,   34,   43,   44,   45,   46,   46,   47,
-       48,   49,   50,   41,   34,   34,   51,   51,   51,   51,
-       52,   34,   34,   51,   51,   51,   51,   51,   51,   51,
-       51,   51,   51,   51,   51,   51,   51,   51,   51,   51,
-       51,   51,   51,   51,   51,   51,   51,   53,   54,   41,
-       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
-       34,   34,   57,   57,  150,  153,  153,  153,  151,   58,
-       58,   59,  155,   61,   59,   62,  150,   73,   63,   74,
-      151,   73,   60,   74,  156,   75,   60,  178,  178,   75,
+       36,   37,   38,   37,   39,   37,   36,   40,   36,   41,
+       42,   36,   36,   43,   44,   36,   45,   46,   47,   48,
+       48,   49,   50,   51,   52,   43,   36,   53,   53,   53,
+       53,   54,   36,   36,   55,   53,   53,   53,   53,   53,
+       53,   53,   53,   53,   53,   53,   53,   53,   53,   53,
+       53,   53,   53,   53,   53,   53,   53,   53,   56,   57,
+       43,   36,   36,   36,   36,   36,   36,   36,   36,   36,
+       36,   36,   60,   60,  155,  158,  158,  158,  156,  184,
+      184,   61,   61,   62,  160,   64,   62,   65,  201,   76,
+       76,   63,   63,   66,   77,   77,  161,   63,   63,   78,
 
-       77,   36,   77,   78,   77,  285,   77,   36,   77,   78,
-       77,   79,   64,   83,   80,   85,  286,   79,   81,  598,
-       80,  184,   85,   86,   81,   87,  175,  175,  175,   82,
-       86,  183,   87,  250,  250,   82,  177,  177,  177,  315,
-      315,   59,   59,   59,   59,   65,   66,   67,   68,   69,
-       70,   71,   72,   59,  187,   61,   59,   62,  188,   59,
-       63,   60,  597,   59,   89,   60,   90,   91,   89,  195,
-       90,   91,   92,   88,  189,  596,   92,  180,  180,  180,
-       88,   59,  190,   60,   64,  196,   89,  150,   60,   91,
-      191,  151,   60,  338,   92,  216,   59,   59,   60,   60,
+       78,   63,   63,  202,   79,   79,  330,   63,   63,   81,
+       38,   81,   82,   81,  331,   67,   89,  155,  158,  158,
+      158,  156,   83,   89,   90,   84,   91,  185,  185,   85,
+      159,   90,  293,   91,  181,  181,  181,  258,  258,   86,
+      183,  183,  183,  294,   62,   62,   62,   68,   69,   70,
+       71,   72,   73,   74,   75,   62,  159,   64,   62,   65,
+       81,   38,   81,   82,   81,   66,  299,   87,  186,  186,
+      186,  196,   92,   83,  190,  222,   84,  610,  197,   92,
+       85,   62,  300,   63,  189,  223,   93,   67,   94,   95,
+       86,  193,  198,  201,  155,  194,   96,   62,  156,   63,
 
-      339,   89,   60,  150,   91,  217,   98,  151,  235,   92,
-       60,  232,  236,   59,   59,   59,   59,   65,   66,   67,
-       68,   69,   70,   71,   72,   60,   60,  233,   59,  218,
-      234,  469,   59,   59,  219,   60,  523,  184,   89,  220,
-       93,   91,  595,   99,  237,  100,   92,  183,   60,   59,
-       59,   60,   94,  238,   60,   99,  342,  100,   98,  343,
-       60,  594,   60,  278,  192,   59,   59,  279,  102,  102,
-      103,  103,  101,  104,  104,  106,  193,  107,   60,  280,
-       60,  301,  340,  108,  101,  302,  194,  224,   95,  341,
-       96,  225,  593,  290,  153,  153,  153,  105,  105,  195,
+      324,  324,   93,  155,   94,   95,  199,  156,  202,  242,
+      195,   63,   96,  243,  609,  200,   62,   62,   62,   68,
+       69,   70,   71,   72,   73,   74,   75,   63,  608,   62,
+       62,   63,   63,  352,   93,   93,  353,   95,   95,  607,
+       62,   62,   63,   63,   96,   96,  239,  244,   63,   63,
+       62,  102,  102,  103,  190,  104,  245,  611,  224,   63,
+       63,   63,  240,  225,  189,  241,   62,   62,  226,   63,
+       63,   63,   93,  606,   97,   95,  310,  103,  235,  104,
+      311,  605,   96,  105,  106,   63,  107,  212,   98,  108,
+      231,  236,   63,  604,  232,  603,  237,   63,   62,   62,
 
-      226,  228,   59,   59,  105,   60,  592,  154,   89,  291,
-       93,   91,   59,  346,  229,  196,   92,  190,   59,  230,
-      321,  106,   94,  107,   59,  191,   60,  591,  322,  108,
-      347,  590,   60,  154,  153,  153,  153,   59,   59,  198,
-      199,  198,  200,  198,   59,  119,   36,  119,  120,  119,
-      105,  211,  211,  211,  212,  211,  121,  192,   95,  122,
-       96,  589,  588,  119,   36,  119,  120,  119,  587,  193,
-      123,  586,   59,   59,  121,   60,  585,  122,   89,  194,
-       93,   91,  239,  175,  175,  175,   92,  175,  175,  175,
-       59,  240,   94,  203,  204,  203,  205,  203,  584,  583,
+      106,  392,  107,  233,  110,  108,  111,  105,   63,   62,
+       62,  110,  112,  111,  109,  246,  158,  158,  158,  112,
+      392,  602,   62,   99,  247,  100,  181,  181,  181,  601,
+      109,  196,  600,  248,  109,  599,   62,   62,  197,   63,
+      356,  109,   93,  405,   97,   95,   62,  123,   38,  123,
+      124,  123,   96,   62,  181,  181,  181,  357,   98,  598,
+      125,  348,  405,  126,  181,  181,  181,   63,  349,   62,
+      262,  262,  262,   62,  123,   38,  123,  124,  123,  597,
+       62,  127,  204,  205,  204,  206,  204,  125,  596,  420,
+      126,  424,  445,   99,  304,  100,  209,  210,  209,  211,
 
-      241,  582,   60,  175,  175,  175,  295,  213,  254,  254,
-      254,  255,  255,  255,  247,  247,  247,  256,  256,  256,
-      175,  175,  175,  206,  247,  581,  296,  187,   95,  381,
-       97,  188,  247,  247,  247,  247,  247,  247,  580,  297,
-      394,  409,   59,   59,  579,   60,  578,  189,   89,  381,
-       93,   91,  175,  175,  175,  577,   92,  251,  251,  251,
-      394,  410,   94,  252,  252,  252,  599,  251,  175,  175,
-      175,  576,   60,  252,  574,  251,  251,  251,  251,  251,
-      251,  252,  252,  252,  252,  252,  252,  253,  253,  253,
-      257,  258,  257,  259,  257,  206,  572,  253,   95,  571,
+      209,  217,  217,  217,  218,  217,   62,   62,  421,   63,
+      424,  446,   93,  305,   97,   95,  263,  263,  263,  264,
+      264,  264,   96,  254,  254,  254,  306,  212,   98,  259,
+      259,  259,  254,  181,  181,  181,  595,   63,  259,  594,
+      254,  254,  254,  254,  254,  254,  259,  259,  259,  259,
+      259,  259,  260,  260,  260,  181,  181,  181,  219,  593,
+      350,  260,  286,   99,  193,  101,  287,  351,  194,  260,
+      260,  260,  260,  260,  260,  481,   62,   62,  288,   63,
+      535,  592,   93,  195,   97,   95,  265,  266,  265,  267,
+      265,  591,   96,  261,  261,  261,  590,  589,   98,  181,
 
-       97,  436,  436,  436,  570,  253,  253,  253,  253,  253,
-      253,  569,   59,  109,  110,   36,  110,  111,  110,  109,
-      109,  109,  109,  109,  109,  112,  109,  113,  114,  115,
-      115,  115,  109,  109,  109,  109,  109,  109,  109,  113,
-      113,  113,  113,  109,  109,  116,  113,  113,  113,  113,
-      113,  113,  113,  113,  113,  113,  113,  113,  113,  113,
-      113,  113,  113,  113,  113,  113,  113,  113,  113,  113,
-      109,  109,  109,  109,  109,  109,  109,  109,  109,  109,
-      109,  109,  109,  109,  109,  126,  413,  433,  442,  568,
-      127,  260,  261,  260,  262,  260,  469,  565,  542,  564,
+      181,  181,  261,  448,  448,  448,  588,   63,  586,  584,
+      261,  261,  261,  261,  261,  261,  268,  269,  268,  270,
+      268,  271,  272,  271,  273,  271,  274,  275,  274,  276,
+      274,  583,  582,   99,  581,  101,  204,  205,  204,  206,
+      204,  278,  210,  278,  279,  278,   62,  113,  114,   38,
+      114,  115,  114,  113,  113,  113,  113,  113,  113,  113,
+      113,  116,  113,  117,  118,  119,  119,  119,  113,  113,
+      113,  113,  113,  113,  117,  117,  117,  117,  113,  113,
+      120,  117,  117,  117,  117,  117,  117,  117,  117,  117,
+      117,  117,  117,  117,  117,  117,  117,  117,  117,  117,
 
-      128,  523,  127,  127,  127,  127,  413,  434,  443,  127,
-      127,  129,  130,  131,  132,  133,  134,  127,  135,  127,
-      136,  137,  138,  139,  140,  127,  141,  142,  143,  144,
-      145,  127,  146,  147,  124,  263,  264,  263,  265,  263,
-      124,  469,  124,  470,  471,  561,  560,  148,  148,  559,
-      149,  149,  149,  124,  558,  436,  436,  436,  124,  124,
-      149,  149,  149,  149,  557,  124,  124,  149,  149,  149,
-      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
-      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
-      149,  472,  556,  555,  124,  124,  124,  124,  124,  124,
+      117,  117,  117,  117,  117,  113,  113,  113,  113,  113,
+      113,  113,  113,  113,  113,  113,  113,  113,  113,  130,
+      281,  282,  281,  283,  281,  481,  131,  482,  483,  217,
+      217,  217,  218,  217,  580,  577,  132,  131,  131,  131,
+      131,  448,  448,  448,  131,  131,  133,  134,  135,  136,
+      137,  138,  139,  140,  131,  141,  142,  143,  144,  145,
+      131,  146,  147,  148,  149,  150,  131,  151,  152,  128,
+      265,  266,  265,  267,  265,  128,  576,  128,  573,  572,
+      128,  128,  571,  570,  153,  153,  219,  154,  154,  154,
+      128,  569,  568,  567,  566,  128,  154,  154,  154,  154,
 
-      124,  124,  124,  124,  124,  124,  162,  551,  552,  163,
-      554,  473,  163,  266,  267,  266,  268,  266,  164,  164,
-      198,  199,  198,  200,  198,  553,  163,  552,  552,  573,
-      165,  550,  549,  163,  548,  547,  166,  167,  546,  545,
-      544,  168,  270,  204,  270,  271,  270,  543,  169,  573,
-      523,  541,  170,  540,  171,  172,  173,  174,  273,  274,
-      273,  275,  273,  211,  211,  211,  212,  211,  316,  316,
-      316,  539,  538,  537,  317,  317,  317,  536,  316,  257,
-      258,  257,  259,  257,  317,  535,  316,  316,  316,  316,
-      316,  316,  317,  317,  317,  317,  317,  317,  534,  533,
+      565,  128,  128,  154,  154,  154,  154,  154,  154,  154,
+      154,  154,  154,  154,  154,  154,  154,  154,  154,  154,
+      154,  154,  154,  154,  154,  154,  154,  454,  562,  561,
+      128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
+      128,  168,  560,  484,  169,  563,  455,  169,  268,  269,
+      268,  270,  268,  198,  559,  170,  170,  271,  272,  271,
+      273,  271,  485,  169,  564,  558,  171,  199,  557,  169,
+      564,  556,  172,  173,  555,  585,  200,  174,  325,  325,
+      325,  481,  535,  554,  175,  553,  535,  325,  176,  564,
+      177,  178,  179,  180,  585,  325,  325,  325,  325,  325,
 
-      532,  531,  253,  253,  253,  260,  261,  260,  262,  260,
-      530,  529,  253,  263,  264,  263,  265,  263,  528,  213,
-      253,  253,  253,  253,  253,  253,  266,  267,  266,  268,
-      266,  198,  199,  198,  200,  198,  270,  204,  270,  271,
-      270,  270,  204,  270,  271,  270,  273,  274,  273,  275,
-      273,  362,  362,  362,  527,  526,  525,  363,  363,  363,
-      524,  362,  575,  575,  575,  575,  575,  363,  523,  362,
-      362,  362,  362,  362,  362,  363,  363,  363,  363,  363,
-      363,  403,  403,  403,  521,  520,  519,  404,  404,  404,
-      518,  403,  575,  575,  575,  575,  575,  404,  517,  403,
+      325,  326,  326,  326,  552,  551,  550,  261,  261,  261,
+      326,  274,  275,  274,  276,  274,  261,  549,  326,  326,
+      326,  326,  326,  326,  261,  261,  261,  261,  261,  261,
+      204,  205,  204,  206,  204,  278,  210,  278,  279,  278,
+      278,  210,  278,  279,  278,  281,  282,  281,  283,  281,
+      372,  372,  372,  548,  547,  546,  373,  373,  373,  372,
+      470,  470,  470,  470,  470,  373,  545,  372,  372,  372,
+      372,  372,  372,  373,  373,  373,  373,  373,  373,  414,
+      414,  414,  544,  471,  543,  415,  415,  415,  414,  470,
+      470,  470,  470,  470,  415,  542,  414,  414,  414,  414,
 
-      403,  403,  403,  403,  403,  404,  404,  404,  404,  404,
-      404,  252,  252,  252,  458,  458,  458,  458,  458,  516,
-      515,  252,  458,  458,  458,  458,  458,  514,  513,  252,
-      252,  252,  252,  252,  252,  459,  562,  562,  562,  562,
-      562,  512,  511,  459,  566,  566,  566,  566,  566,  562,
-      562,  562,  562,  562,  510,  509,  508,  563,  566,  566,
-      566,  566,  566,  507,  506,  567,  505,  504,  503,  502,
-      563,  501,  500,  499,  469,  498,  497,  496,  495,  567,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   60,   60,   60,   60,   60,   60,   60,   60,
+      414,  414,  415,  415,  415,  415,  415,  415,  260,  260,
+      260,  541,  471,  540,  539,  538,  537,  260,  574,  574,
+      574,  574,  574,  536,  535,  260,  260,  260,  260,  260,
+      260,  578,  578,  578,  578,  578,  574,  574,  574,  574,
+      574,  575,  578,  578,  578,  578,  578,  587,  587,  587,
+      587,  587,  533,  532,  579,  531,  530,  529,  528,  575,
+      587,  587,  587,  587,  587,  579,   59,   59,   59,   59,
+       59,   59,   59,   59,   59,   59,   63,   63,   63,   63,
+       63,   63,   63,   63,   63,   63,   80,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,   88,   88,   88,   88,
 
-       60,   60,   60,   60,   76,   76,   76,   76,   76,   76,
-       76,   76,   76,   76,   76,   76,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,   84,   84,  118,  118,
-      118,  118,  118,  118,  118,  118,  118,  118,  118,  118,
-      124,  494,  493,  492,  124,  124,  491,  124,  490,  489,
-      488,  124,  152,  152,  149,  149,  149,  161,  161,  161,
-      161,  161,  161,  161,  161,  161,  161,  161,  161,  179,
-      179,  179,  179,  179,  179,  183,  183,  183,  183,  183,
-      183,  183,  183,  183,  487,  183,  183,  202,  202,  202,
-      202,  202,  202,  202,  202,  202,  202,  208,  486,  485,
+       88,   88,   88,   88,   88,   88,  122,  122,  122,  122,
+      122,  122,  122,  122,  122,  122,  128,  527,  526,  525,
+      128,  128,  524,  523,  522,  128,  157,  157,  154,  154,
+      154,  167,  167,  167,  167,  167,  167,  167,  167,  167,
+      167,  189,  189,  189,  189,  189,  189,  189,  521,  189,
+      189,  208,  208,  208,  208,  208,  208,  208,  208,  214,
+      520,  519,  214,  214,  518,  517,  214,  214,  215,  215,
+      215,  216,  216,  216,  252,  252,  516,  252,  252,  252,
+      252,  252,  252,  252,  253,  253,  253,  534,  534,  515,
+      534,  534,  534,  534,  534,  534,  534,  514,  513,  512,
 
-      208,  208,  484,  483,  208,  208,  208,  208,  209,  209,
-      209,  210,  210,  210,  245,  245,  482,  245,  245,  245,
-      245,  245,  245,  245,  245,  245,  246,  246,  246,  522,
-      522,  481,  522,  522,  522,  522,  522,  522,  522,  522,
-      522,  480,  479,  478,  477,  476,  475,  474,  468,  467,
-      466,  465,  464,  463,  462,  461,  460,  457,  456,  455,
-      454,  453,  452,  451,  450,  449,  448,  447,  446,  445,
-      444,  441,  440,  439,  438,  437,  435,  432,  431,  430,
-      429,  428,  427,  426,  425,  424,  423,  422,  421,  420,
-      419,  418,  417,  416,  415,  414,  412,  411,  408,  407,
+      511,  481,  510,  509,  508,  507,  506,  505,  504,  503,
+      502,  501,  500,  499,  498,  497,  496,  495,  494,  493,
+      492,  491,  490,  489,  488,  487,  486,  480,  479,  478,
+      477,  476,  475,  474,  473,  472,  469,  468,  467,  466,
+      465,  464,  463,  462,  461,  460,  459,  458,  457,  456,
+      453,  452,  451,  450,  449,  447,  444,  443,  442,  441,
+      440,  439,  438,  437,  436,  435,  434,  433,  432,  431,
+      430,  429,  428,  427,  426,  425,  423,  422,  419,  418,
+      417,  416,  413,  412,  411,  410,  409,  408,  407,  406,
+      404,  403,  402,  401,  400,  399,  398,  397,  396,  395,
 
-      406,  405,  402,  401,  400,  399,  398,  397,  396,  395,
-      393,  392,  391,  390,  389,  388,  387,  386,  385,  384,
-      383,  382,  380,  379,  378,  377,  376,  375,  374,  373,
-      372,  371,  370,  369,  368,  367,  366,  365,  364,  361,
-      360,  359,  358,  357,  356,  355,  354,  353,  352,  351,
-      350,  349,  348,  345,  344,  337,  336,  335,  334,  333,
-      332,  331,  330,  329,  328,  327,  326,  325,  324,  323,
-      320,  319,  318,  274,  204,  267,  264,  261,  258,  314,
-      313,  312,  311,  310,  309,  308,  307,  306,  305,  304,
-      303,  300,  299,  298,  294,  293,  292,  289,  288,  287,
+      394,  393,  391,  390,  389,  388,  387,  386,  385,  384,
+      383,  382,  381,  380,  379,  378,  377,  376,  375,  374,
+      371,  370,  369,  368,  367,  366,  365,  364,  363,  362,
+      361,  360,  359,  358,  355,  354,  347,  346,  345,  344,
+      343,  342,  341,  340,  339,  338,  337,  336,  335,  334,
+      333,  332,  329,  328,  327,  282,  210,  275,  272,  269,
+      266,  323,  322,  321,  320,  319,  318,  317,  316,  315,
+      314,  313,  312,  309,  308,  307,  303,  302,  301,  298,
+      297,  296,  295,  292,  291,  290,  289,  285,  284,  217,
+      210,  280,  205,  277,  191,  190,  167,  257,  256,  255,
 
-      284,  283,  282,  281,  277,  276,  211,  204,  272,  199,
-      269,  185,  184,  161,  249,  248,  244,  243,  242,  231,
-      227,  223,  222,  221,  215,  214,  157,  125,  157,  125,
-      207,  201,  197,  186,  184,  185,  184,  157,  125,  182,
-      181,  176,  160,  159,  158,  157,  125,  599,  117,   55,
-       33,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
+      251,  250,  249,  238,  234,  230,  229,  228,  227,  221,
+      220,  163,  129,  163,  129,  213,  207,  203,  192,  190,
+      191,  190,  163,  129,  188,  187,  182,  166,  165,  164,
+      163,  162,  129,  611,  121,   58,   35,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
 
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599
+      611,  611,  611,  611,  611,  611,  611,  611,  611
     } ;
 
-static const flex_int16_t yy_chk[1424] =
+static const flex_int16_t yy_chk[1410] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -1128,156 +1130,154 @@
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    3,    4,   44,   46,   46,   46,   44,    3,
-        4,    5,   49,    5,    5,    5,   80,    7,    5,    7,
-       80,    8,    7,    8,   49,    7,    8,   68,   68,    8,
+        1,    1,    3,    4,   46,   48,   48,   48,   46,   71,
+       71,    3,    4,    5,   51,    5,    5,    5,  102,    7,
+        8,    7,    8,    5,    7,    8,   51,    7,    8,    9,
 
-        9,    9,    9,    9,    9,  221,   10,   10,   10,   10,
-       10,    9,    5,   10,    9,   11,  221,   10,    9,  597,
-       10,   85,   12,   11,   10,   11,   65,   65,   65,    9,
-       12,   85,   12,  164,  164,   10,   67,   67,   67,  250,
-      250,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-        5,    5,    5,    6,   92,    6,    6,    6,   92,   13,
-        6,   13,  596,   14,   13,   14,   13,   13,   14,   98,
-       14,   14,   13,   11,   92,  595,   14,   70,   70,   70,
-       12,   17,   93,   17,    6,   98,   17,  114,   13,   17,
-       93,  114,   14,  295,   17,  131,   18,   21,   18,   21,
+       10,    9,   10,  102,    9,   10,  287,    9,   10,   11,
+       11,   11,   11,   11,  287,    5,   13,   84,   47,   47,
+       47,   84,   11,   14,   13,   11,   13,   72,   72,   11,
+       47,   14,  227,   14,   68,   68,   68,  170,  170,   11,
+       70,   70,   70,  227,    5,    5,    5,    5,    5,    5,
+        5,    5,    5,    5,    5,    6,   47,    6,    6,    6,
+       12,   12,   12,   12,   12,    6,  232,   12,   73,   73,
+       73,   97,   13,   12,   89,  135,   12,  609,   97,   14,
+       12,   15,  232,   15,   89,  135,   15,    6,   15,   15,
+       12,   96,   98,  275,  118,   96,   15,   16,  118,   16,
 
-      295,   18,   21,  122,   18,  131,   21,  122,  141,   18,
-       17,  140,  141,    6,    6,    6,    6,    6,    6,    6,
-        6,    6,    6,    6,    6,   18,   21,  140,   13,  132,
-      140,  542,   14,   15,  132,   15,  542,  184,   15,  132,
-       15,   15,  594,   23,  142,   23,   15,  184,   23,   22,
-       17,   22,   15,  142,   22,   24,  297,   24,   22,  297,
-       24,  593,   15,  216,   94,   18,   21,  216,   25,   26,
-       25,   26,   23,   25,   26,   27,   94,   27,   22,  216,
-       27,  233,  296,   27,   24,  233,   94,  136,   15,  296,
-       15,  136,  591,  225,   45,   45,   45,   25,   26,  267,
+      258,  258,   16,  126,   16,   16,   98,  126,  275,  146,
+       96,   15,   16,  146,  608,   98,    6,    6,    6,    6,
+        6,    6,    6,    6,    6,    6,    6,   16,  607,   19,
+       20,   19,   20,  306,   19,   20,  306,   19,   20,  606,
+       23,   24,   23,   24,   19,   20,  145,  147,   23,   24,
+       15,   23,   24,   25,  190,   25,  147,  282,  136,   19,
+       20,   25,  145,  136,  190,  145,   16,   17,  136,   17,
+       23,   24,   17,  605,   17,   17,  240,   26,  143,   26,
+      240,  603,   17,   25,   27,   26,   27,  282,   17,   27,
+      141,  143,   27,  602,  141,  601,  143,   17,   19,   20,
 
-      136,  138,   15,   16,   27,   16,  590,   45,   16,  225,
-       16,   16,   23,  300,  138,  267,   16,  261,   22,  138,
-      279,   28,   16,   28,   24,  261,   28,  589,  279,   28,
-      300,  588,   16,   45,  153,  153,  153,   25,   26,  101,
-      101,  101,  101,  101,   27,   31,   31,   31,   31,   31,
-       28,  128,  128,  128,  128,  128,   31,  264,   16,   31,
-       16,  587,  584,   32,   32,   32,   32,   32,  583,  264,
-       32,  582,   16,   19,   32,   19,  581,   32,   19,  264,
-       19,   19,  143,  176,  176,  176,   19,  177,  177,  177,
-       28,  143,   19,  105,  105,  105,  105,  105,  579,  578,
+       28,  347,   28,  141,   29,   28,   29,   26,   28,   23,
+       24,   30,   29,   30,   27,  148,  158,  158,  158,   30,
+      347,  600,   25,   17,  148,   17,  182,  182,  182,  599,
+       28,  269,  596,  148,   29,  595,   17,   18,  269,   18,
+      309,   30,   18,  360,   18,   18,   26,   33,   33,   33,
+       33,   33,   18,   27,  183,  183,  183,  309,   18,  594,
+       33,  304,  360,   33,  184,  184,  184,   18,  304,   28,
+      185,  185,  185,   29,   34,   34,   34,   34,   34,  593,
+       30,   34,  105,  105,  105,  105,  105,   34,  591,  381,
+       34,  384,  410,   18,  236,   18,  109,  109,  109,  109,
 
-      143,  577,   19,  178,  178,  178,  229,  128,  179,  179,
-      179,  180,  180,  180,  154,  154,  154,  181,  181,  181,
-      254,  254,  254,  105,  154,  576,  229,  258,   19,  337,
-       19,  258,  154,  154,  154,  154,  154,  154,  574,  229,
-      350,  371,   19,   20,  573,   20,  570,  258,   20,  337,
-       20,   20,  255,  255,  255,  569,   20,  165,  165,  165,
-      350,  371,   20,  172,  172,  172,  274,  165,  256,  256,
-      256,  568,   20,  172,  565,  165,  165,  165,  165,  165,
-      165,  172,  172,  172,  172,  172,  172,  174,  174,  174,
-      189,  189,  189,  189,  189,  274,  561,  174,   20,  560,
+      109,  132,  132,  132,  132,  132,   18,   21,  381,   21,
+      384,  410,   21,  236,   21,   21,  186,  186,  186,  187,
+      187,  187,   21,  159,  159,  159,  236,  109,   21,  171,
+      171,  171,  159,  262,  262,  262,  590,   21,  171,  589,
+      159,  159,  159,  159,  159,  159,  171,  171,  171,  171,
+      171,  171,  178,  178,  178,  263,  263,  263,  132,  588,
+      305,  178,  222,   21,  266,   21,  222,  305,  266,  178,
+      178,  178,  178,  178,  178,  554,   21,   22,  222,   22,
+      554,  586,   22,  266,   22,   22,  195,  195,  195,  195,
+      195,  585,   22,  180,  180,  180,  582,  581,   22,  264,
 
-       20,  402,  402,  402,  553,  174,  174,  174,  174,  174,
-      174,  552,   20,   29,   29,   29,   29,   29,   29,   29,
-       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
-       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
-       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
-       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
-       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
-       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
-       29,   29,   29,   29,   29,   39,  374,  399,  411,  551,
-       39,  191,  191,  191,  191,  191,  523,  549,  523,  548,
+      264,  264,  180,  413,  413,  413,  580,   22,  577,  573,
+      180,  180,  180,  180,  180,  180,  197,  197,  197,  197,
+      197,  200,  200,  200,  200,  200,  202,  202,  202,  202,
+      202,  572,  565,   22,  564,   22,  204,  204,  204,  204,
+      204,  209,  209,  209,  209,  209,   22,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
 
-       39,  523,   39,   39,   39,   39,  374,  399,  411,   39,
-       39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
-       39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
-       39,   39,   39,   39,   43,  194,  194,  194,  194,  194,
-       43,  436,   43,  436,  436,  546,  545,   43,   43,  544,
-       43,   43,   43,   43,  543,  436,  436,  436,   43,   43,
-       43,   43,   43,   43,  541,   43,   43,   43,   43,   43,
-       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
-       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
-       43,  437,  540,  539,   43,   43,   43,   43,   43,   43,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   41,
+      212,  212,  212,  212,  212,  448,   41,  448,  448,  217,
+      217,  217,  217,  217,  563,  561,   41,   41,   41,   41,
+       41,  448,  448,  448,   41,   41,   41,   41,   41,   41,
+       41,   41,   41,   41,   41,   41,   41,   41,   41,   41,
+       41,   41,   41,   41,   41,   41,   41,   41,   41,   45,
+      265,  265,  265,  265,  265,   45,  560,   45,  558,  557,
+       45,   45,  556,  555,   45,   45,  217,   45,   45,   45,
+       45,  553,  552,  551,  549,   45,   45,   45,   45,   45,
 
-       43,   43,   43,   43,   43,   43,   64,  534,  535,   64,
-      537,  437,   64,  196,  196,  196,  196,  196,   64,   64,
-      198,  198,  198,  198,  198,  536,   64,  534,  535,  564,
-       64,  533,  532,   64,  530,  529,   64,   64,  528,  527,
-      525,   64,  203,  203,  203,  203,  203,  524,   64,  564,
-      522,  521,   64,  520,   64,   64,   64,   64,  206,  206,
-      206,  206,  206,  211,  211,  211,  211,  211,  251,  251,
-      251,  519,  518,  517,  252,  252,  252,  516,  251,  257,
-      257,  257,  257,  257,  252,  515,  251,  251,  251,  251,
-      251,  251,  252,  252,  252,  252,  252,  252,  514,  513,
+      548,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,  422,  545,  544,
+       45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   67,  542,  449,   67,  546,  422,   67,  268,  268,
+      268,  268,  268,  272,  541,   67,   67,  271,  271,  271,
+      271,  271,  449,   67,  546,  540,   67,  272,  539,   67,
+      547,  537,   67,   67,  536,  576,  272,   67,  259,  259,
+      259,  535,  534,  535,   67,  533,  535,  259,   67,  547,
+       67,   67,   67,   67,  576,  259,  259,  259,  259,  259,
 
-      510,  509,  253,  253,  253,  260,  260,  260,  260,  260,
-      508,  507,  253,  263,  263,  263,  263,  263,  504,  211,
-      253,  253,  253,  253,  253,  253,  266,  266,  266,  266,
-      266,  269,  269,  269,  269,  269,  270,  270,  270,  270,
-      270,  272,  272,  272,  272,  272,  273,  273,  273,  273,
-      273,  316,  316,  316,  503,  502,  501,  317,  317,  317,
-      500,  316,  567,  567,  567,  567,  567,  317,  499,  316,
-      316,  316,  316,  316,  316,  317,  317,  317,  317,  317,
-      317,  362,  362,  362,  498,  497,  495,  363,  363,  363,
-      494,  362,  575,  575,  575,  575,  575,  363,  493,  362,
+      259,  260,  260,  260,  532,  531,  530,  261,  261,  261,
+      260,  274,  274,  274,  274,  274,  261,  529,  260,  260,
+      260,  260,  260,  260,  261,  261,  261,  261,  261,  261,
+      277,  277,  277,  277,  277,  278,  278,  278,  278,  278,
+      280,  280,  280,  280,  280,  281,  281,  281,  281,  281,
+      325,  325,  325,  528,  527,  526,  326,  326,  326,  325,
+      438,  438,  438,  438,  438,  326,  525,  325,  325,  325,
+      325,  325,  325,  326,  326,  326,  326,  326,  326,  372,
+      372,  372,  522,  438,  521,  373,  373,  373,  372,  470,
+      470,  470,  470,  470,  373,  520,  372,  372,  372,  372,
 
-      362,  362,  362,  362,  362,  363,  363,  363,  363,  363,
-      363,  403,  403,  403,  426,  426,  426,  426,  426,  492,
-      489,  403,  458,  458,  458,  458,  458,  487,  486,  403,
-      403,  403,  403,  403,  403,  426,  547,  547,  547,  547,
-      547,  485,  484,  458,  550,  550,  550,  550,  550,  562,
-      562,  562,  562,  562,  482,  481,  480,  547,  566,  566,
-      566,  566,  566,  479,  478,  550,  477,  476,  475,  474,
-      562,  473,  472,  471,  470,  467,  466,  465,  463,  566,
-      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
-      600,  600,  601,  601,  601,  601,  601,  601,  601,  601,
+      372,  372,  373,  373,  373,  373,  373,  373,  414,  414,
+      414,  519,  470,  516,  515,  514,  513,  414,  559,  559,
+      559,  559,  559,  512,  511,  414,  414,  414,  414,  414,
+      414,  562,  562,  562,  562,  562,  574,  574,  574,  574,
+      574,  559,  578,  578,  578,  578,  578,  579,  579,  579,
+      579,  579,  510,  509,  562,  507,  506,  505,  504,  574,
+      587,  587,  587,  587,  587,  578,  612,  612,  612,  612,
+      612,  612,  612,  612,  612,  612,  613,  613,  613,  613,
+      613,  613,  613,  613,  613,  613,  614,  614,  614,  614,
+      614,  614,  614,  614,  614,  614,  615,  615,  615,  615,
 
-      601,  601,  601,  601,  602,  602,  602,  602,  602,  602,
-      602,  602,  602,  602,  602,  602,  603,  603,  603,  603,
-      603,  603,  603,  603,  603,  603,  603,  603,  604,  604,
-      604,  604,  604,  604,  604,  604,  604,  604,  604,  604,
-      605,  461,  460,  457,  605,  605,  456,  605,  455,  454,
-      453,  605,  606,  606,  607,  607,  607,  608,  608,  608,
-      608,  608,  608,  608,  608,  608,  608,  608,  608,  609,
-      609,  609,  609,  609,  609,  610,  610,  610,  610,  610,
-      610,  610,  610,  610,  452,  610,  610,  611,  611,  611,
-      611,  611,  611,  611,  611,  611,  611,  612,  451,  450,
+      615,  615,  615,  615,  615,  615,  616,  616,  616,  616,
+      616,  616,  616,  616,  616,  616,  617,  501,  499,  498,
+      617,  617,  497,  496,  494,  617,  618,  618,  619,  619,
+      619,  620,  620,  620,  620,  620,  620,  620,  620,  620,
+      620,  621,  621,  621,  621,  621,  621,  621,  493,  621,
+      621,  622,  622,  622,  622,  622,  622,  622,  622,  623,
+      492,  491,  623,  623,  490,  489,  623,  623,  624,  624,
+      624,  625,  625,  625,  626,  626,  488,  626,  626,  626,
+      626,  626,  626,  626,  627,  627,  627,  628,  628,  487,
+      628,  628,  628,  628,  628,  628,  628,  486,  485,  484,
 
-      612,  612,  449,  448,  612,  612,  612,  612,  613,  613,
-      613,  614,  614,  614,  615,  615,  447,  615,  615,  615,
-      615,  615,  615,  615,  615,  615,  616,  616,  616,  617,
-      617,  446,  617,  617,  617,  617,  617,  617,  617,  617,
-      617,  445,  444,  443,  442,  441,  440,  439,  435,  434,
+      483,  482,  479,  478,  477,  475,  473,  472,  469,  468,
+      467,  466,  465,  464,  463,  462,  461,  460,  459,  458,
+      457,  456,  455,  454,  453,  452,  451,  447,  446,  445,
+      444,  443,  442,  441,  440,  439,  437,  436,  435,  434,
       433,  432,  431,  430,  429,  428,  427,  425,  424,  423,
-      422,  421,  420,  419,  418,  417,  416,  415,  414,  413,
-      412,  410,  409,  408,  407,  406,  401,  397,  395,  394,
-      393,  392,  391,  389,  387,  386,  385,  384,  383,  382,
-      381,  379,  378,  377,  376,  375,  373,  372,  368,  367,
+      421,  420,  419,  418,  417,  412,  408,  406,  405,  404,
+      403,  402,  400,  398,  397,  396,  395,  394,  393,  392,
+      390,  389,  388,  387,  386,  385,  383,  382,  378,  377,
+      376,  374,  371,  369,  368,  366,  364,  363,  362,  361,
+      359,  358,  357,  356,  355,  354,  353,  352,  351,  350,
 
-      366,  364,  361,  359,  358,  356,  354,  353,  352,  351,
-      349,  348,  347,  346,  345,  344,  343,  342,  341,  340,
-      339,  338,  336,  335,  334,  332,  331,  330,  329,  328,
-      327,  326,  325,  324,  323,  322,  321,  320,  318,  314,
-      313,  312,  311,  310,  309,  308,  307,  306,  305,  304,
-      303,  302,  301,  299,  298,  294,  293,  292,  291,  290,
-      289,  288,  287,  286,  285,  284,  283,  282,  281,  280,
-      278,  277,  276,  275,  271,  268,  265,  262,  259,  249,
-      244,  243,  242,  241,  240,  239,  238,  237,  236,  235,
-      234,  232,  231,  230,  228,  227,  226,  224,  223,  222,
+      349,  348,  346,  345,  344,  342,  341,  340,  339,  338,
+      337,  336,  335,  334,  333,  332,  331,  330,  329,  327,
+      323,  322,  321,  320,  319,  318,  317,  316,  315,  314,
+      313,  312,  311,  310,  308,  307,  303,  302,  301,  300,
+      299,  298,  297,  296,  295,  294,  293,  292,  291,  290,
+      289,  288,  286,  285,  284,  283,  279,  276,  273,  270,
+      267,  257,  251,  250,  249,  248,  247,  246,  245,  244,
+      243,  242,  241,  239,  238,  237,  235,  234,  233,  231,
+      230,  229,  228,  226,  225,  224,  223,  221,  220,  218,
+      211,  210,  206,  205,  191,  189,  168,  163,  162,  160,
 
-      220,  219,  218,  217,  215,  214,  212,  205,  204,  200,
-      199,  185,  183,  162,  157,  155,  146,  145,  144,  139,
-      137,  135,  134,  133,  130,  129,  123,  120,  117,  111,
-      107,  103,  100,   90,   88,   86,   84,   83,   78,   74,
-       71,   66,   62,   58,   57,   55,   37,   33,   30,    2,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
+      151,  150,  149,  144,  142,  140,  139,  138,  137,  134,
+      133,  127,  124,  121,  115,  111,  107,  104,   94,   92,
+       90,   88,   87,   82,   79,   74,   69,   65,   61,   60,
+       58,   55,   39,   35,   32,    2,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
+      611,  611,  611,  611,  611,  611,  611,  611,  611,  611,
 
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
-      599,  599,  599
+      611,  611,  611,  611,  611,  611,  611,  611,  611
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -1286,22 +1286,23 @@
 extern int yy_flex_debug;
 int yy_flex_debug = 1;
 
-static const flex_int16_t yy_rule_linenum[127] =
+static const flex_int16_t yy_rule_linenum[132] =
     {   0,
-      198,  201,  202,  203,  209,  227,  228,  229,  230,  231,
-      232,  233,  234,  235,  236,  237,  238,  239,  240,  241,
-      242,  243,  244,  245,  246,  247,  248,  249,  250,  251,
-      252,  253,  254,  255,  256,  257,  258,  259,  260,  261,
-      262,  263,  264,  265,  266,  267,  271,  275,  279,  282,
-      283,  284,  285,  286,  287,  288,  289,  290,  292,  296,
-      297,  298,  299,  301,  308,  309,  313,  318,  321,  324,
-      327,  335,  342,  343,  344,  350,  357,  364,  384,  394,
-      409,  415,  434,  447,  463,  478,  495,  496,  507,  518,
-      519,  531,  540,  550,  569,  581,  595,  596,  607,  617,
+      214,  217,  218,  219,  225,  243,  244,  245,  246,  247,
+      248,  249,  250,  251,  252,  253,  254,  255,  256,  257,
+      258,  259,  260,  261,  262,  263,  264,  265,  266,  267,
+      268,  269,  270,  271,  272,  273,  274,  275,  276,  277,
+      278,  279,  280,  281,  282,  283,  284,  288,  292,  296,
+      299,  300,  301,  302,  303,  304,  305,  306,  307,  309,
+      314,  315,  316,  317,  319,  326,  327,  331,  337,  340,
+      341,  344,  347,  355,  362,  363,  364,  370,  377,  384,
+      405,  420,  435,  441,  460,  474,  493,  509,  526,  527,
+      538,  549,  550,  562,  572,  577,  587,  599,  623,  635,
 
-      627,  628,  629,  630,  631,  632,  633,  636,  638,  646,
-      664,  669,  670,  676,  677,  688,  694,  700,  706,  722,
-      723,  727,  734,  750,  770,  809
+      649,  650,  661,  665,  669,  670,  671,  672,  673,  674,
+      675,  678,  680,  684,  696,  712,  717,  718,  724,  725,
+      736,  742,  748,  754,  770,  771,  775,  782,  798,  818,
+      857
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -1315,7 +1316,7 @@
 #line 1 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 /* Bison Grammar Scanner                             -*- C -*-
 
-   Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -1330,29 +1331,28 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 #define YY_NO_INPUT 1
 #line 24 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-#include <errno.h>
-
 #include <c-ctype.h>
+#include <errno.h>
 #include <mbswidth.h>
 #include <quote.h>
 #include <quotearg.h>
 
-#include <src/complain.h>
-#include <src/files.h>
-#include <src/getargs.h>
-#include <src/gram.h>
-#include <src/reader.h>
-#include <src/scan-gram.h>
-#include <src/uniqstr.h>
+#include "src/complain.h"
+#include "src/files.h"
+#include "src/getargs.h"
+#include "src/gram.h"
+#include "src/reader.h"
+#include "src/scan-gram.h"
+#include "src/uniqstr.h"
 
 #define FLEX_PREFIX(Id) gram_ ## Id
-#include <src/flex-scanner.h>
+#include "src/flex-scanner.h"
 
 /* Work around a bug in flex 2.5.31.  See Debian bug 333231
-   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
+   <https://bugs.debian.org/333231>.  */
 #undef gram_wrap
 #define gram_wrap() 1
 
@@ -1363,7 +1363,7 @@
 
 #define YY_USER_ACTION  location_compute (loc, &scanner_cursor, yytext, yyleng);
 
-/* Report that yytext is an extension, and evaluate to its token type.  */
+/* Report that yytext is an extension, and evaluate to its token kind.  */
 #define BISON_DIRECTIVE(Directive)                              \
   (bison_directive (loc, yytext), PERCENT_ ## Directive)
 
@@ -1386,7 +1386,7 @@
     yyless (0);                                                 \
   } while (0)
 
-#define DEPRECATED(Msg)                                         \
+#define DEPRECATED_DIRECTIVE(Msg)                               \
   do {                                                          \
     deprecated_directive (loc, yytext, Msg);                    \
     scanner_cursor.column -= mbsnwidth (Msg, strlen (Msg), 0);  \
@@ -1395,6 +1395,23 @@
       unput (Msg[i - 1]);                                       \
   } while (0)
 
+
+#define STRING_GROW_ESCAPE(Char)                                \
+  do {                                                          \
+    verify (UCHAR_MAX < ULONG_MAX);                             \
+    long c = Char;                                              \
+    bool valid = 0 < c && c <= UCHAR_MAX;                       \
+    if (!valid)                                                 \
+      complain (loc, complaint,                                 \
+                _("invalid number after \\-escape: %s"),        \
+                yytext + 1);                                    \
+    if (YY_START == SC_ESCAPED_CHARACTER)                       \
+      STRING_1GROW (valid ? c : '?');                           \
+    else                                                        \
+      STRING_GROW ();                                           \
+  } while (0)
+
+
 /* The current file name.  Might change with #line.  */
 static uniqstr current_file = NULL;
 
@@ -1410,7 +1427,7 @@
 void
 gram_scanner_last_string_free (void)
 {
-  STRING_FREE;
+  STRING_FREE ();
 }
 
 static void handle_syncline (char *, location);
@@ -1419,11 +1436,11 @@
 static void unexpected_eof (boundary, char const *);
 static void unexpected_newline (boundary, char const *);
 
-#line 1422 "src/scan-gram.c"
-#line 112 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 1439 "src/scan-gram.c"
+#line 128 "/Users/akim/src/gnu/bison/src/scan-gram.l"
  /* A C-like comment in directives/rules. */
 
- /* Strings and characters in directives/rules. */
+ /* Characters and strings in directives/rules. */
 
  /* A identifier was just read in directives/rules.  Special state
     to capture the sequence 'identifier :'. */
@@ -1451,24 +1468,25 @@
    white space between the backslash and the newline.  */
 /* An equal sign, with optional leading whitespaces. This is used in some
    deprecated constructs. */
-#line 1454 "src/scan-gram.c"
+#line 1471 "src/scan-gram.c"
 
 #define INITIAL 0
 #define SC_YACC_COMMENT 1
-#define SC_ESCAPED_STRING 2
-#define SC_ESCAPED_CHARACTER 3
-#define SC_AFTER_IDENTIFIER 4
-#define SC_TAG 5
-#define SC_PROLOGUE 6
-#define SC_BRACED_CODE 7
-#define SC_EPILOGUE 8
-#define SC_PREDICATE 9
-#define SC_COMMENT 10
-#define SC_LINE_COMMENT 11
-#define SC_STRING 12
-#define SC_CHARACTER 13
-#define SC_BRACKETED_ID 14
-#define SC_RETURN_BRACKETED_ID 15
+#define SC_ESCAPED_CHARACTER 2
+#define SC_ESCAPED_STRING 3
+#define SC_ESCAPED_TSTRING 4
+#define SC_AFTER_IDENTIFIER 5
+#define SC_TAG 6
+#define SC_PROLOGUE 7
+#define SC_BRACED_CODE 8
+#define SC_EPILOGUE 9
+#define SC_PREDICATE 10
+#define SC_COMMENT 11
+#define SC_LINE_COMMENT 12
+#define SC_STRING 13
+#define SC_CHARACTER 14
+#define SC_BRACKETED_ID 15
+#define SC_RETURN_BRACKETED_ID 16
 
 #ifndef YY_NO_UNISTD_H
 /* Special case for "unistd.h", since it is non-ANSI. We include it way
@@ -1749,7 +1767,7 @@
 
 	{
 /* %% [7.0] user's declarations go here */
-#line 159 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 175 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 
 
   /* Nesting level.  Either for nested braces, or nested angle brackets
@@ -1786,7 +1804,7 @@
   | Scanning white space.  |
   `-----------------------*/
 
-#line 1789 "src/scan-gram.c"
+#line 1807 "src/scan-gram.c"
 
 	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
 		{
@@ -1816,13 +1834,13 @@
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 600 )
+				if ( yy_current_state >= 612 )
 					yy_c = yy_meta[yy_c];
 				}
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
 			++yy_cp;
 			}
-		while ( yy_current_state != 599 );
+		while ( yy_current_state != 611 );
 		yy_cp = (yy_last_accepting_cpos);
 		yy_current_state = (yy_last_accepting_state);
 
@@ -1841,13 +1859,13 @@
 			{
 			if ( yy_act == 0 )
 				fprintf( stderr, "--scanner backing up\n" );
-			else if ( yy_act < 127 )
+			else if ( yy_act < 132 )
 				fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
 				         (long)yy_rule_linenum[yy_act], yytext );
-			else if ( yy_act == 127 )
+			else if ( yy_act == 132 )
 				fprintf( stderr, "--accepting default rule (\"%s\")\n",
 				         yytext );
-			else if ( yy_act == 128 )
+			else if ( yy_act == 133 )
 				fprintf( stderr, "--(end of buffer or a NUL)\n" );
 			else
 				fprintf( stderr, "--EOF (start condition %d)\n", YY_START );
@@ -1866,23 +1884,23 @@
 /* Comments and white space.  */
 case 1:
 YY_RULE_SETUP
-#line 198 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 214 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
      complain (loc, Wother, _("stray ',' treated as white space"));
   }
 	YY_BREAK
 case 2:
 /* rule 2 can match eol */
-#line 202 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 218 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 case 3:
 /* rule 3 can match eol */
 YY_RULE_SETUP
-#line 202 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 218 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 continue;
 	YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 203 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 219 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     token_start = loc->start;
     context_state = YY_START;
@@ -1892,7 +1910,7 @@
 case 5:
 /* rule 5 can match eol */
 YY_RULE_SETUP
-#line 209 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 225 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     handle_syncline (yytext + sizeof "#line " - 1, *loc);
   }
@@ -1910,309 +1928,315 @@
 
 case 6:
 YY_RULE_SETUP
-#line 227 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 243 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 return BISON_DIRECTIVE (NONASSOC);
 	YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 228 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 244 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 return BISON_DIRECTIVE (CODE);
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 229 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 245 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 RETURN_PERCENT_FLAG ("parse.trace");
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 230 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 246 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 return BISON_DIRECTIVE (DEFAULT_PREC);
 	YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 231 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 247 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 return BISON_DIRECTIVE (DEFINE);
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 232 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (DEFINES);
+#line 248 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (HEADER); // Deprecated in 3.8.
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 233 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 249 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 return BISON_DIRECTIVE (DESTRUCTOR);
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 234 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 250 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 return BISON_DIRECTIVE (DPREC);
 	YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 235 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 251 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 return BISON_DIRECTIVE (EMPTY);
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 236 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 252 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 return BISON_DIRECTIVE (EXPECT);
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 237 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 253 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 return BISON_DIRECTIVE (EXPECT_RR);
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 238 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 254 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 RETURN_VALUE (PERCENT_FILE_PREFIX, uniqstr_new (yytext));
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 239 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (INITIAL_ACTION);
+#line 255 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (GLR_PARSER);
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 240 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (GLR_PARSER);
+#line 256 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (HEADER);
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 241 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (LANGUAGE);
+#line 257 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (INITIAL_ACTION);
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 242 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return PERCENT_LEFT;
+#line 258 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (LANGUAGE);
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 243 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-RETURN_PERCENT_PARAM (lex);
+#line 259 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return PERCENT_LEFT;
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 244 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-RETURN_PERCENT_FLAG ("locations");
+#line 260 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+RETURN_PERCENT_PARAM (lex);
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 245 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (MERGE);
+#line 261 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+RETURN_PERCENT_FLAG ("locations");
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 246 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (NO_DEFAULT_PREC);
+#line 262 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (MERGE);
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 247 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (NO_LINES);
+#line 263 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (NO_DEFAULT_PREC);
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 248 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return PERCENT_NONASSOC;
+#line 264 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (NO_LINES);
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 249 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (NONDETERMINISTIC_PARSER);
+#line 265 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return PERCENT_NONASSOC;
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 250 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (NTERM);
+#line 266 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (NONDETERMINISTIC_PARSER);
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 251 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (OUTPUT);
+#line 267 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (NTERM);
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 252 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-RETURN_PERCENT_PARAM (both);
+#line 268 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (OUTPUT);
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 253 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-RETURN_PERCENT_PARAM (parse);
+#line 269 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+RETURN_PERCENT_PARAM (both);
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 254 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return PERCENT_PREC;
+#line 270 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+RETURN_PERCENT_PARAM (parse);
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 255 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (PRECEDENCE);
+#line 271 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return PERCENT_PREC;
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 256 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (PRINTER);
+#line 272 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (PRECEDENCE);
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 257 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (REQUIRE);
+#line 273 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (PRINTER);
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 258 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return PERCENT_RIGHT;
+#line 274 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (REQUIRE);
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 259 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (SKELETON);
+#line 275 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return PERCENT_RIGHT;
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 260 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return PERCENT_START;
+#line 276 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (SKELETON);
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 261 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (TOKEN);
+#line 277 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return PERCENT_START;
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 262 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return PERCENT_TOKEN;
+#line 278 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (TOKEN);
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 263 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (TOKEN_TABLE);
+#line 279 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return PERCENT_TOKEN;
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 264 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return PERCENT_TYPE;
+#line 280 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (TOKEN_TABLE);
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 265 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return PERCENT_UNION;
+#line 281 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return PERCENT_TYPE;
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 266 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return BISON_DIRECTIVE (VERBOSE);
+#line 282 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return PERCENT_UNION;
 	YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 267 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 283 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return BISON_DIRECTIVE (VERBOSE);
+	YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 284 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 return PERCENT_YACC;
 	YY_BREAK
 /* Deprecated since Bison 2.3b (2008-05-27), but the warning is
      issued only since Bison 3.4. */
-case 47:
+case 48:
 YY_RULE_SETUP
-#line 271 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 288 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 RETURN_VALUE (PERCENT_PURE_PARSER, uniqstr_new (yytext));
 	YY_BREAK
 /* Deprecated since Bison 3.0 (2013-07-25), but the warning is
      issued only since Bison 3.3. */
-case 48:
+case 49:
 YY_RULE_SETUP
-#line 275 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 292 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 RETURN_VALUE (PERCENT_ERROR_VERBOSE, uniqstr_new (yytext));
 	YY_BREAK
 /* Deprecated since Bison 2.6 (2012-07-19), but the warning is
      issued only since Bison 3.3. */
-case 49:
-/* rule 49 can match eol */
+case 50:
+/* rule 50 can match eol */
 YY_RULE_SETUP
-#line 279 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 296 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 RETURN_VALUE (PERCENT_NAME_PREFIX, uniqstr_new (yytext));
 	YY_BREAK
 /* Deprecated since Bison 2.7.90, 2012. */
-case 50:
-YY_RULE_SETUP
-#line 282 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-DEPRECATED ("%default-prec");
-	YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 283 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-RETURN_VALUE (PERCENT_ERROR_VERBOSE, uniqstr_new (yytext));
+#line 299 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+DEPRECATED_DIRECTIVE ("%default-prec");
 	YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 284 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-DEPRECATED ("%expect-rr");
+#line 300 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+RETURN_VALUE (PERCENT_ERROR_VERBOSE, uniqstr_new (yytext));
 	YY_BREAK
 case 53:
-/* rule 53 can match eol */
 YY_RULE_SETUP
-#line 285 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-RETURN_VALUE (PERCENT_FILE_PREFIX, uniqstr_new (yytext));
+#line 301 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+DEPRECATED_DIRECTIVE ("%expect-rr");
 	YY_BREAK
 case 54:
+/* rule 54 can match eol */
 YY_RULE_SETUP
-#line 286 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-DEPRECATED ("%output \"y.tab.c\"");
+#line 302 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+RETURN_VALUE (PERCENT_FILE_PREFIX, uniqstr_new (yytext));
 	YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 287 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-DEPRECATED ("%no-default-prec");
+#line 303 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+DEPRECATED_DIRECTIVE ("%output \"y.tab.c\"");
 	YY_BREAK
 case 56:
 YY_RULE_SETUP
-#line 288 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-DEPRECATED ("%no-lines");
+#line 304 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+DEPRECATED_DIRECTIVE ("%no-default-prec");
 	YY_BREAK
 case 57:
-/* rule 57 can match eol */
 YY_RULE_SETUP
-#line 289 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-DEPRECATED ("%output");
+#line 305 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+DEPRECATED_DIRECTIVE ("%no-lines");
 	YY_BREAK
 case 58:
+/* rule 58 can match eol */
 YY_RULE_SETUP
-#line 290 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-DEPRECATED ("%token-table");
+#line 306 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+DEPRECATED_DIRECTIVE ("%output");
 	YY_BREAK
 case 59:
 YY_RULE_SETUP
-#line 292 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-{
-    complain (loc, complaint, _("invalid directive: %s"), quote (yytext));
-  }
+#line 307 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+DEPRECATED_DIRECTIVE ("%token-table");
 	YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 296 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return COLON;
+#line 309 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+{
+    complain (loc, complaint, _("invalid directive: %s"), quote (yytext));
+    return GRAM_error;
+  }
 	YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 297 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return EQUAL;
+#line 314 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return COLON;
 	YY_BREAK
 case 62:
 YY_RULE_SETUP
-#line 298 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return PIPE;
+#line 315 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return EQUAL;
 	YY_BREAK
 case 63:
 YY_RULE_SETUP
-#line 299 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return SEMICOLON;
+#line 316 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return PIPE;
 	YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 301 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 317 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return SEMICOLON;
+	YY_BREAK
+case 65:
+YY_RULE_SETUP
+#line 319 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     val->ID = uniqstr_new (yytext);
     id_loc = *loc;
@@ -2220,59 +2244,65 @@
     BEGIN SC_AFTER_IDENTIFIER;
   }
 	YY_BREAK
-case 65:
-YY_RULE_SETUP
-#line 308 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-RETURN_VALUE (INT, scan_integer (yytext, 10, *loc));
-	YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 309 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-RETURN_VALUE (INT, scan_integer (yytext, 16, *loc));
+#line 326 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+RETURN_VALUE (INT_LITERAL, scan_integer (yytext, 10, *loc));
+	YY_BREAK
+case 67:
+YY_RULE_SETUP
+#line 327 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+RETURN_VALUE (INT_LITERAL, scan_integer (yytext, 16, *loc));
 	YY_BREAK
 /* Identifiers may not start with a digit.  Yet, don't silently
      accept "1FOO" as "1 FOO".  */
-case 67:
+case 68:
 YY_RULE_SETUP
-#line 313 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 331 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     complain (loc, complaint, _("invalid identifier: %s"), quote (yytext));
+    return GRAM_error;
   }
 	YY_BREAK
 /* Characters.  */
-case 68:
+case 69:
 YY_RULE_SETUP
-#line 318 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 337 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER;
 	YY_BREAK
 /* Strings. */
-case 69:
-YY_RULE_SETUP
-#line 321 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-token_start = loc->start; BEGIN SC_ESCAPED_STRING;
-	YY_BREAK
-/* Prologue. */
 case 70:
 YY_RULE_SETUP
-#line 324 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 340 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+token_start = loc->start; STRING_1GROW ('"'); BEGIN SC_ESCAPED_STRING;
+	YY_BREAK
+case 71:
+YY_RULE_SETUP
+#line 341 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+token_start = loc->start; STRING_1GROW ('"'); BEGIN SC_ESCAPED_TSTRING;
+	YY_BREAK
+/* Prologue. */
+case 72:
+YY_RULE_SETUP
+#line 344 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 code_start = loc->start; BEGIN SC_PROLOGUE;
 	YY_BREAK
 /* Code in between braces.  */
-case 71:
+case 73:
 YY_RULE_SETUP
-#line 327 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 347 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
-    STRING_GROW;
+    STRING_GROW ();
     nesting = 0;
     code_start = loc->start;
     BEGIN SC_BRACED_CODE;
   }
 	YY_BREAK
 /* Semantic predicate. */
-case 72:
-/* rule 72 can match eol */
+case 74:
+/* rule 74 can match eol */
 YY_RULE_SETUP
-#line 335 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 355 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     nesting = 0;
     code_start = loc->start;
@@ -2280,28 +2310,28 @@
   }
 	YY_BREAK
 /* A type. */
-case 73:
-YY_RULE_SETUP
-#line 342 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return TAG_ANY;
-	YY_BREAK
-case 74:
-YY_RULE_SETUP
-#line 343 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-return TAG_NONE;
-	YY_BREAK
 case 75:
 YY_RULE_SETUP
-#line 344 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 362 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return TAG_ANY;
+	YY_BREAK
+case 76:
+YY_RULE_SETUP
+#line 363 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+return TAG_NONE;
+	YY_BREAK
+case 77:
+YY_RULE_SETUP
+#line 364 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     nesting = 0;
     token_start = loc->start;
     BEGIN SC_TAG;
   }
 	YY_BREAK
-case 76:
+case 78:
 YY_RULE_SETUP
-#line 350 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 370 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     static int percent_percent_count;
     if (++percent_percent_count == 2)
@@ -2309,9 +2339,9 @@
     return PERCENT_PERCENT;
   }
 	YY_BREAK
-case 77:
+case 79:
 YY_RULE_SETUP
-#line 357 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 377 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     bracketed_id_str = NULL;
     bracketed_id_start = loc->start;
@@ -2319,17 +2349,18 @@
     BEGIN SC_BRACKETED_ID;
   }
 	YY_BREAK
-case 78:
+case 80:
 YY_RULE_SETUP
-#line 364 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 384 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     complain (loc, complaint, "%s: %s",
               ngettext ("invalid character", "invalid characters", yyleng),
               quote_mem (yytext, yyleng));
+    return GRAM_error;
   }
 	YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 370 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 391 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     loc->start = loc->end = scanner_cursor;
     yyterminate ();
@@ -2342,10 +2373,15 @@
   `--------------------------------------------------------------*/
 
 
-case 79:
+case 81:
 YY_RULE_SETUP
-#line 384 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-complain (loc, complaint, _("invalid null character"));
+#line 405 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+{
+    complain (loc, complaint, _("invalid null character"));
+    STRING_FINISH ();
+    STRING_FREE ();
+    return GRAM_error;
+  }
 	YY_BREAK
 
 /*-----------------------------------------------------------------.
@@ -2353,9 +2389,9 @@
   `-----------------------------------------------------------------*/
 
 
-case 80:
+case 82:
 YY_RULE_SETUP
-#line 394 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 420 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     if (bracketed_id_str)
       {
@@ -2372,9 +2408,9 @@
       }
   }
 	YY_BREAK
-case 81:
+case 83:
 YY_RULE_SETUP
-#line 409 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 435 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     ROLLBACK_CURRENT_TOKEN;
     BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL);
@@ -2382,9 +2418,9 @@
     return ID_COLON;
   }
 	YY_BREAK
-case 82:
+case 84:
 YY_RULE_SETUP
-#line 415 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 441 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     ROLLBACK_CURRENT_TOKEN;
     BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL);
@@ -2393,7 +2429,7 @@
   }
 	YY_BREAK
 case YY_STATE_EOF(SC_AFTER_IDENTIFIER):
-#line 421 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 447 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL);
     *loc = id_loc;
@@ -2406,15 +2442,16 @@
   `--------------------------------*/
 
 
-case 83:
+case 85:
 YY_RULE_SETUP
-#line 434 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 460 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     if (bracketed_id_str)
       {
         complain (loc, complaint,
                   _("unexpected identifier in bracketed name: %s"),
                   quote (yytext));
+        return GRAM_error;
       }
     else
       {
@@ -2423,9 +2460,9 @@
       }
   }
 	YY_BREAK
-case 84:
+case 86:
 YY_RULE_SETUP
-#line 447 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 474 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     BEGIN bracketed_id_context_state;
     if (bracketed_id_str)
@@ -2439,21 +2476,25 @@
           }
       }
     else
-      complain (loc, complaint, _("an identifier expected"));
+      {
+        complain (loc, complaint, _("an identifier expected"));
+        return GRAM_error;
+      }
   }
 	YY_BREAK
-case 85:
+case 87:
 YY_RULE_SETUP
-#line 463 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 493 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     complain (loc, complaint, "%s: %s",
               ngettext ("invalid character in bracketed name",
                         "invalid characters in bracketed name", yyleng),
               quote_mem (yytext, yyleng));
+    return GRAM_error;
   }
 	YY_BREAK
 case YY_STATE_EOF(SC_BRACKETED_ID):
-#line 470 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 501 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     BEGIN bracketed_id_context_state;
     unexpected_eof (bracketed_id_start, "]");
@@ -2462,9 +2503,9 @@
 
 
 
-case 86:
+case 88:
 YY_RULE_SETUP
-#line 478 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 509 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     ROLLBACK_CURRENT_TOKEN;
     val->BRACKETED_ID = bracketed_id_str;
@@ -2480,19 +2521,19 @@
   `---------------------------------------------------------------*/
 
 
-case 87:
+case 89:
 YY_RULE_SETUP
-#line 495 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 526 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 BEGIN context_state;
 	YY_BREAK
-case 88:
-/* rule 88 can match eol */
+case 90:
+/* rule 90 can match eol */
 YY_RULE_SETUP
-#line 496 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 527 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 continue;
 	YY_BREAK
 case YY_STATE_EOF(SC_YACC_COMMENT):
-#line 497 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 528 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 unexpected_eof (token_start, "*/"); BEGIN context_state;
 	YY_BREAK
 
@@ -2501,14 +2542,14 @@
   `------------------------------------------------------------*/
 
 
-case 89:
-/* rule 89 can match eol */
+case 91:
+/* rule 91 can match eol */
 YY_RULE_SETUP
-#line 507 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-STRING_GROW; BEGIN context_state;
+#line 538 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW (); BEGIN context_state;
 	YY_BREAK
 case YY_STATE_EOF(SC_COMMENT):
-#line 508 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 539 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 unexpected_eof (token_start, "*/"); BEGIN context_state;
 	YY_BREAK
 
@@ -2517,20 +2558,20 @@
   `--------------------------------------------------------------*/
 
 
-case 90:
-/* rule 90 can match eol */
+case 92:
+/* rule 92 can match eol */
 YY_RULE_SETUP
-#line 518 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-STRING_GROW; BEGIN context_state;
+#line 549 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW (); BEGIN context_state;
 	YY_BREAK
-case 91:
-/* rule 91 can match eol */
+case 93:
+/* rule 93 can match eol */
 YY_RULE_SETUP
-#line 519 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-STRING_GROW;
+#line 550 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW ();
 	YY_BREAK
 case YY_STATE_EOF(SC_LINE_COMMENT):
-#line 520 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 551 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 BEGIN context_state;
 	YY_BREAK
 
@@ -2540,11 +2581,12 @@
   `------------------------------------------------*/
 
 
-case 92:
+case 94:
 YY_RULE_SETUP
-#line 531 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 562 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
-    STRING_FINISH;
+    STRING_1GROW ('"');
+    STRING_FINISH ();
     BEGIN INITIAL;
     loc->start = token_start;
     complain (loc, Wyacc,
@@ -2553,53 +2595,84 @@
   }
 	YY_BREAK
 case YY_STATE_EOF(SC_ESCAPED_STRING):
-#line 539 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 571 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 unexpected_eof (token_start, "\"");
 	YY_BREAK
-case 93:
-/* rule 93 can match eol */
+case 95:
+/* rule 95 can match eol */
 YY_RULE_SETUP
-#line 540 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 572 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 unexpected_newline (token_start, "\"");
 	YY_BREAK
 
+
+
+case 96:
+YY_RULE_SETUP
+#line 577 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+{
+    STRING_1GROW ('"');
+    STRING_FINISH ();
+    BEGIN INITIAL;
+    loc->start = token_start;
+    complain (loc, Wyacc,
+              _("POSIX Yacc does not support string literals"));
+    RETURN_VALUE (TSTRING, last_string);
+  }
+	YY_BREAK
+case YY_STATE_EOF(SC_ESCAPED_TSTRING):
+#line 586 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+unexpected_eof (token_start, "\")");
+	YY_BREAK
+case 97:
+/* rule 97 can match eol */
+YY_RULE_SETUP
+#line 587 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+unexpected_newline (token_start, "\")");
+	YY_BREAK
+
 /*----------------------------------------------------------.
   | Scanning a Bison character literal, decoding its escapes. |
   | The initial quote is already eaten.                       |
   `----------------------------------------------------------*/
 
 
-case 94:
+case 98:
 YY_RULE_SETUP
-#line 550 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 599 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
-    STRING_FINISH;
-    loc->start = token_start;
-    val->CHAR = last_string[0];
-
-    /* FIXME: Eventually, make these errors.  */
-    if (last_string[0] == '\0')
-    {
-      complain (loc, Wother, _("empty character literal"));
-      /* '\0' seems dangerous even if we are about to complain.  */
-      val->CHAR = '\'';
-    }
-    else if (last_string[1] != '\0')
-      complain (loc, Wother,
-                _("extra characters in character literal"));
-    STRING_FREE;
+    STRING_FINISH ();
     BEGIN INITIAL;
-    return CHAR;
+    loc->start = token_start;
+
+    if (last_string[0] == '\0')
+      {
+        complain (loc, complaint, _("empty character literal"));
+        STRING_FREE ();
+        return GRAM_error;
+      }
+    else if (last_string[1] != '\0')
+      {
+        complain (loc, complaint, _("extra characters in character literal"));
+        STRING_FREE ();
+        return GRAM_error;
+      }
+    else
+      {
+        val->CHAR_LITERAL = last_string[0];
+        STRING_FREE ();
+        return CHAR_LITERAL;
+      }
   }
 	YY_BREAK
-case 95:
-/* rule 95 can match eol */
+case 99:
+/* rule 99 can match eol */
 YY_RULE_SETUP
-#line 569 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 623 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 unexpected_newline (token_start, "'");
 	YY_BREAK
 case YY_STATE_EOF(SC_ESCAPED_CHARACTER):
-#line 570 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 624 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 unexpected_eof (token_start, "'");
 	YY_BREAK
 
@@ -2608,36 +2681,36 @@
   `--------------------------------------------------------------*/
 
 
-case 96:
+case 100:
 YY_RULE_SETUP
-#line 581 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 635 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     --nesting;
     if (nesting < 0)
       {
-        STRING_FINISH;
+        STRING_FINISH ();
         loc->start = token_start;
         val->TAG = uniqstr_new (last_string);
-        STRING_FREE;
+        STRING_FREE ();
         BEGIN INITIAL;
         return TAG;
       }
-    STRING_GROW;
+    STRING_GROW ();
   }
 	YY_BREAK
-case 97:
-/* rule 97 can match eol */
+case 101:
+/* rule 101 can match eol */
 YY_RULE_SETUP
-#line 595 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-STRING_GROW;
+#line 649 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW ();
 	YY_BREAK
-case 98:
+case 102:
 YY_RULE_SETUP
-#line 596 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-STRING_GROW; nesting += yyleng;
+#line 650 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW (); nesting += yyleng;
 	YY_BREAK
 case YY_STATE_EOF(SC_TAG):
-#line 598 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 652 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 unexpected_eof (token_start, ">");
 	YY_BREAK
 
@@ -2646,89 +2719,72 @@
   `----------------------------*/
 
 
-case 99:
-YY_RULE_SETUP
-#line 607 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-{
-    verify (UCHAR_MAX < ULONG_MAX);
-    long c = strtol (yytext + 1, NULL, 8);
-    if (0 < c && c <= UCHAR_MAX)
-      obstack_1grow (&obstack_for_string, c);
-    else
-      complain (loc, complaint, _("invalid number after \\-escape: %s"),
-                yytext+1);
-  }
-	YY_BREAK
-case 100:
-YY_RULE_SETUP
-#line 617 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-{
-    verify (UCHAR_MAX < ULONG_MAX);
-    long c = strtol (yytext + 2, NULL, 16);
-    if (0 < c && c <= UCHAR_MAX)
-      obstack_1grow (&obstack_for_string, c);
-    else
-      complain (loc, complaint, _("invalid number after \\-escape: %s"),
-                yytext+1);
-  }
-	YY_BREAK
-case 101:
-YY_RULE_SETUP
-#line 627 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\a');
-	YY_BREAK
-case 102:
-YY_RULE_SETUP
-#line 628 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\b');
-	YY_BREAK
 case 103:
 YY_RULE_SETUP
-#line 629 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\f');
+#line 661 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+{
+    STRING_GROW_ESCAPE (strtol (yytext + 1, NULL, 8));
+  }
 	YY_BREAK
 case 104:
 YY_RULE_SETUP
-#line 630 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\n');
+#line 665 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+{
+    STRING_GROW_ESCAPE (strtol (yytext + 2, NULL, 16));
+  }
 	YY_BREAK
 case 105:
 YY_RULE_SETUP
-#line 631 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\r');
+#line 669 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW_ESCAPE ('\a');
 	YY_BREAK
 case 106:
 YY_RULE_SETUP
-#line 632 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\t');
+#line 670 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW_ESCAPE ('\b');
 	YY_BREAK
 case 107:
 YY_RULE_SETUP
-#line 633 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-obstack_1grow (&obstack_for_string, '\v');
+#line 671 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW_ESCAPE ('\f');
 	YY_BREAK
-/* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
 case 108:
 YY_RULE_SETUP
-#line 636 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-obstack_1grow (&obstack_for_string, yytext[1]);
+#line 672 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW_ESCAPE ('\n');
 	YY_BREAK
 case 109:
 YY_RULE_SETUP
-#line 638 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-{
-    int c = convert_ucn_to_byte (yytext);
-    if (c <= 0)
-      complain (loc, complaint, _("invalid number after \\-escape: %s"),
-                yytext+1);
-    else
-      obstack_1grow (&obstack_for_string, c);
-  }
+#line 673 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW_ESCAPE ('\r');
 	YY_BREAK
 case 110:
-/* rule 110 can match eol */
 YY_RULE_SETUP
-#line 646 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 674 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW_ESCAPE ('\t');
+	YY_BREAK
+case 111:
+YY_RULE_SETUP
+#line 675 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW_ESCAPE ('\v');
+	YY_BREAK
+/* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
+case 112:
+YY_RULE_SETUP
+#line 678 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW_ESCAPE (yytext[1]);
+	YY_BREAK
+case 113:
+YY_RULE_SETUP
+#line 680 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+{
+    STRING_GROW_ESCAPE (convert_ucn_to_byte (yytext));
+  }
+	YY_BREAK
+case 114:
+/* rule 114 can match eol */
+YY_RULE_SETUP
+#line 684 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     char const *p = yytext + 1;
     /* Quote only if escaping won't make the character visible.  */
@@ -2738,6 +2794,19 @@
       p = quotearg_style_mem (escape_quoting_style, p, 1);
     complain (loc, complaint, _("invalid character after \\-escape: %s"),
               p);
+    STRING_1GROW ('?');
+  }
+	YY_BREAK
+case 115:
+YY_RULE_SETUP
+#line 696 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+{
+    // None of the other rules matched: the last character of this
+    // file is "\".  But Flex does not support "\\<<EOF>>".
+    unexpected_eof (token_start,
+                    YY_START == SC_ESCAPED_CHARACTER ? "?'"
+                    : YY_START == SC_ESCAPED_STRING ? "?\""
+                    : "?\")");
   }
 	YY_BREAK
 
@@ -2746,46 +2815,46 @@
   `--------------------------------------------*/
 
 
-case 111:
-/* rule 111 can match eol */
+case 116:
+/* rule 116 can match eol */
 YY_RULE_SETUP
-#line 664 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-STRING_GROW;
+#line 712 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW ();
 	YY_BREAK
 
 
 
-case 112:
+case 117:
 YY_RULE_SETUP
-#line 669 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-STRING_GROW; BEGIN context_state;
+#line 717 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW (); BEGIN context_state;
 	YY_BREAK
-case 113:
-/* rule 113 can match eol */
+case 118:
+/* rule 118 can match eol */
 YY_RULE_SETUP
-#line 670 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 718 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 unexpected_newline (token_start, "'");
 	YY_BREAK
 case YY_STATE_EOF(SC_CHARACTER):
-#line 671 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 719 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 unexpected_eof (token_start, "'");
 	YY_BREAK
 
 
 
-case 114:
+case 119:
 YY_RULE_SETUP
-#line 676 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-STRING_GROW; BEGIN context_state;
+#line 724 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW (); BEGIN context_state;
 	YY_BREAK
-case 115:
-/* rule 115 can match eol */
+case 120:
+/* rule 120 can match eol */
 YY_RULE_SETUP
-#line 677 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 725 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 unexpected_newline (token_start, "\"");
 	YY_BREAK
 case YY_STATE_EOF(SC_STRING):
-#line 678 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 726 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 unexpected_eof (token_start, "\"");
 	YY_BREAK
 
@@ -2794,43 +2863,43 @@
   `---------------------------------------------------*/
 
 
-case 116:
+case 121:
 YY_RULE_SETUP
-#line 688 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 736 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
-    STRING_GROW;
+    STRING_GROW ();
     context_state = YY_START;
     token_start = loc->start;
     BEGIN SC_CHARACTER;
   }
 	YY_BREAK
-case 117:
+case 122:
 YY_RULE_SETUP
-#line 694 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 742 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
-    STRING_GROW;
+    STRING_GROW ();
     context_state = YY_START;
     token_start = loc->start;
     BEGIN SC_STRING;
   }
 	YY_BREAK
-case 118:
-/* rule 118 can match eol */
+case 123:
+/* rule 123 can match eol */
 YY_RULE_SETUP
-#line 700 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 748 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
-    STRING_GROW;
+    STRING_GROW ();
     context_state = YY_START;
     token_start = loc->start;
     BEGIN SC_COMMENT;
   }
 	YY_BREAK
-case 119:
-/* rule 119 can match eol */
+case 124:
+/* rule 124 can match eol */
 YY_RULE_SETUP
-#line 706 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 754 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
-    STRING_GROW;
+    STRING_GROW ();
     context_state = YY_START;
     BEGIN SC_LINE_COMMENT;
   }
@@ -2842,44 +2911,44 @@
   `-----------------------------------------------------------*/
 
 
-case 120:
-/* rule 120 can match eol */
+case 125:
+/* rule 125 can match eol */
 YY_RULE_SETUP
-#line 722 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-STRING_GROW; nesting++;
+#line 770 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW (); nesting++;
 	YY_BREAK
-case 121:
-/* rule 121 can match eol */
+case 126:
+/* rule 126 can match eol */
 YY_RULE_SETUP
-#line 723 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-STRING_GROW; nesting--;
+#line 771 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW (); nesting--;
 	YY_BREAK
 /* Tokenize '<<%' correctly (as '<<' '%') rather than incorrectly
      (as '<' '<%').  */
-case 122:
-/* rule 122 can match eol */
+case 127:
+/* rule 127 can match eol */
 YY_RULE_SETUP
-#line 727 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-STRING_GROW;
+#line 775 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW ();
 	YY_BREAK
 case YY_STATE_EOF(SC_BRACED_CODE):
 case YY_STATE_EOF(SC_PREDICATE):
-#line 729 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 777 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 unexpected_eof (code_start, "}");
 	YY_BREAK
 
 
 
-case 123:
+case 128:
 YY_RULE_SETUP
-#line 734 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 782 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
-    obstack_1grow (&obstack_for_string, '}');
+    STRING_1GROW ('}');
 
     --nesting;
     if (nesting < 0)
       {
-        STRING_FINISH;
+        STRING_FINISH ();
         loc->start = code_start;
         BEGIN INITIAL;
         RETURN_VALUE (BRACED_CODE, last_string);
@@ -2889,20 +2958,20 @@
 
 
 
-case 124:
+case 129:
 YY_RULE_SETUP
-#line 750 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 798 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
     --nesting;
     if (nesting < 0)
       {
-        STRING_FINISH;
+        STRING_FINISH ();
         loc->start = code_start;
         BEGIN INITIAL;
         RETURN_VALUE (BRACED_PREDICATE, last_string);
       }
     else
-      obstack_1grow (&obstack_for_string, '}');
+      STRING_1GROW ('}');
   }
 	YY_BREAK
 
@@ -2911,18 +2980,18 @@
   `--------------------------------------------------------------*/
 
 
-case 125:
+case 130:
 YY_RULE_SETUP
-#line 770 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 818 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
-    STRING_FINISH;
+    STRING_FINISH ();
     loc->start = code_start;
     BEGIN INITIAL;
     RETURN_VALUE (PROLOGUE, last_string);
   }
 	YY_BREAK
 case YY_STATE_EOF(SC_PROLOGUE):
-#line 777 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 825 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 unexpected_eof (code_start, "%}");
 	YY_BREAK
 
@@ -2933,9 +3002,9 @@
 
 
 case YY_STATE_EOF(SC_EPILOGUE):
-#line 788 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 836 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 {
-    STRING_FINISH;
+    STRING_FINISH ();
     loc->start = code_start;
     BEGIN INITIAL;
     RETURN_VALUE (EPILOGUE, last_string);
@@ -2953,19 +3022,19 @@
 
      Add a fallthrough "|." so that non UTF-8 input is still accepted
      and does not jam the scanner.  */
-case 126:
-/* rule 126 can match eol */
+case 131:
+/* rule 131 can match eol */
 YY_RULE_SETUP
-#line 809 "/Users/akim/src/gnu/bison/src/scan-gram.l"
-STRING_GROW;
+#line 857 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+STRING_GROW ();
 	YY_BREAK
 
-case 127:
+case 132:
 YY_RULE_SETUP
-#line 812 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 860 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 YY_FATAL_ERROR( "flex scanner jammed" );
 	YY_BREAK
-#line 2968 "src/scan-gram.c"
+#line 3037 "src/scan-gram.c"
 case YY_STATE_EOF(SC_RETURN_BRACKETED_ID):
 	yyterminate();
 
@@ -3287,7 +3356,7 @@
 		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 600 )
+			if ( yy_current_state >= 612 )
 				yy_c = yy_meta[yy_c];
 			}
 		yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -3320,11 +3389,11 @@
 	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 600 )
+		if ( yy_current_state >= 612 )
 			yy_c = yy_meta[yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
-	yy_is_jam = (yy_current_state == 599);
+	yy_is_jam = (yy_current_state == 611);
 
 		return yy_is_jam ? 0 : yy_current_state;
 }
@@ -4117,7 +4186,7 @@
 
 /* %ok-for-header */
 
-#line 812 "/Users/akim/src/gnu/bison/src/scan-gram.l"
+#line 860 "/Users/akim/src/gnu/bison/src/scan-gram.l"
 
 
 
@@ -4204,9 +4273,9 @@
 }
 
 
-/*---------------------------------------------------------------------.
-| Handle '#line INT( "FILE")?\n'.  ARGS has already skipped '#line '.  |
-`---------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------.
+| Handle '#line INT_LITERAL( "FILE")?\n'.  ARGS has already skipped '#line '. |
+`----------------------------------------------------------------------------*/
 
 static void
 handle_syncline (char *args, location loc)
@@ -4296,7 +4365,7 @@
 
 
 void
-gram_scanner_close ()
+gram_scanner_close (void)
 {
   xfclose (gram_in);
   /* Reclaim Flex's buffers.  */
@@ -4304,7 +4373,6 @@
 }
 
 
-
 void
 gram_scanner_free (void)
 {
diff --git a/src/scan-gram.h b/src/scan-gram.h
index 0b16e76..f187f32 100644
--- a/src/scan-gram.h
+++ b/src/scan-gram.h
@@ -1,6 +1,6 @@
 /* Bison Grammar Scanner
 
-   Copyright (C) 2006-2007, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2006-2007, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef SCAN_GRAM_H_
 # define SCAN_GRAM_H_
diff --git a/src/scan-gram.l b/src/scan-gram.l
index 7fc23ab..f55429e 100644
--- a/src/scan-gram.l
+++ b/src/scan-gram.l
@@ -1,6 +1,6 @@
 /* Bison Grammar Scanner                             -*- C -*-
 
-   Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,32 +15,31 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 %option debug nodefault noinput noyywrap never-interactive
 %option prefix="gram_" outfile="lex.yy.c"
 
 %{
-#include <errno.h>
-
 #include <c-ctype.h>
+#include <errno.h>
 #include <mbswidth.h>
 #include <quote.h>
 #include <quotearg.h>
 
-#include <src/complain.h>
-#include <src/files.h>
-#include <src/getargs.h>
-#include <src/gram.h>
-#include <src/reader.h>
-#include <src/scan-gram.h>
-#include <src/uniqstr.h>
+#include "src/complain.h"
+#include "src/files.h"
+#include "src/getargs.h"
+#include "src/gram.h"
+#include "src/reader.h"
+#include "src/scan-gram.h"
+#include "src/uniqstr.h"
 
 #define FLEX_PREFIX(Id) gram_ ## Id
-#include <src/flex-scanner.h>
+#include "src/flex-scanner.h"
 
 /* Work around a bug in flex 2.5.31.  See Debian bug 333231
-   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
+   <https://bugs.debian.org/333231>.  */
 #undef gram_wrap
 #define gram_wrap() 1
 
@@ -51,7 +50,7 @@
 
 #define YY_USER_ACTION  location_compute (loc, &scanner_cursor, yytext, yyleng);
 
-/* Report that yytext is an extension, and evaluate to its token type.  */
+/* Report that yytext is an extension, and evaluate to its token kind.  */
 #define BISON_DIRECTIVE(Directive)                              \
   (bison_directive (loc, yytext), PERCENT_ ## Directive)
 
@@ -74,7 +73,7 @@
     yyless (0);                                                 \
   } while (0)
 
-#define DEPRECATED(Msg)                                         \
+#define DEPRECATED_DIRECTIVE(Msg)                               \
   do {                                                          \
     deprecated_directive (loc, yytext, Msg);                    \
     scanner_cursor.column -= mbsnwidth (Msg, strlen (Msg), 0);  \
@@ -83,6 +82,23 @@
       unput (Msg[i - 1]);                                       \
   } while (0)
 
+
+#define STRING_GROW_ESCAPE(Char)                                \
+  do {                                                          \
+    verify (UCHAR_MAX < ULONG_MAX);                             \
+    long c = Char;                                              \
+    bool valid = 0 < c && c <= UCHAR_MAX;                       \
+    if (!valid)                                                 \
+      complain (loc, complaint,                                 \
+                _("invalid number after \\-escape: %s"),        \
+                yytext + 1);                                    \
+    if (YY_START == SC_ESCAPED_CHARACTER)                       \
+      STRING_1GROW (valid ? c : '?');                           \
+    else                                                        \
+      STRING_GROW ();                                           \
+  } while (0)
+
+
 /* The current file name.  Might change with #line.  */
 static uniqstr current_file = NULL;
 
@@ -98,7 +114,7 @@
 void
 gram_scanner_last_string_free (void)
 {
-  STRING_FREE;
+  STRING_FREE ();
 }
 
 static void handle_syncline (char *, location);
@@ -110,8 +126,8 @@
 %}
  /* A C-like comment in directives/rules. */
 %x SC_YACC_COMMENT
- /* Strings and characters in directives/rules. */
-%x SC_ESCAPED_STRING SC_ESCAPED_CHARACTER
+ /* Characters and strings in directives/rules. */
+%x SC_ESCAPED_CHARACTER SC_ESCAPED_STRING SC_ESCAPED_TSTRING
  /* A identifier was just read in directives/rules.  Special state
     to capture the sequence 'identifier :'. */
 %x SC_AFTER_IDENTIFIER
@@ -144,7 +160,7 @@
 eol       \n|\r\n
 
  /* UTF-8 Encoded Unicode Code Point, from Flex's documentation. */
-mbchar    [\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF]([\x80-\xBF]{2})|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x\90-\xBF]([\x80-\xBF]{2})|[\xF1-\xF3]([\x80-\xBF]{3})|\xF4[\x80-\x8F]([\x80-\xBF]{2})
+mbchar    [\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF]([\x80-\xBF]{2})|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF]([\x80-\xBF]{2})|[\xF1-\xF3]([\x80-\xBF]{3})|\xF4[\x80-\x8F]([\x80-\xBF]{2})
 
 /* Zero or more instances of backslash-newline.  Following GCC, allow
    white space between the backslash and the newline.  */
@@ -228,15 +244,16 @@
   "%debug"                          RETURN_PERCENT_FLAG ("parse.trace");
   "%default-prec"                   return BISON_DIRECTIVE (DEFAULT_PREC);
   "%define"                         return BISON_DIRECTIVE (DEFINE);
-  "%defines"                        return BISON_DIRECTIVE (DEFINES);
+  "%defines"                        return BISON_DIRECTIVE (HEADER); // Deprecated in 3.8.
   "%destructor"                     return BISON_DIRECTIVE (DESTRUCTOR);
   "%dprec"                          return BISON_DIRECTIVE (DPREC);
   "%empty"                          return BISON_DIRECTIVE (EMPTY);
   "%expect"                         return BISON_DIRECTIVE (EXPECT);
   "%expect-rr"                      return BISON_DIRECTIVE (EXPECT_RR);
   "%file-prefix"                    RETURN_VALUE (PERCENT_FILE_PREFIX, uniqstr_new (yytext));
-  "%initial-action"                 return BISON_DIRECTIVE (INITIAL_ACTION);
   "%glr-parser"                     return BISON_DIRECTIVE (GLR_PARSER);
+  "%header"                         return BISON_DIRECTIVE (HEADER);
+  "%initial-action"                 return BISON_DIRECTIVE (INITIAL_ACTION);
   "%language"                       return BISON_DIRECTIVE (LANGUAGE);
   "%left"                           return PERCENT_LEFT;
   "%lex-param"                      RETURN_PERCENT_PARAM (lex);
@@ -278,18 +295,19 @@
   "%name"[-_]"prefix"{eqopt}{sp}    RETURN_VALUE (PERCENT_NAME_PREFIX, uniqstr_new (yytext));
 
   /* Deprecated since Bison 2.7.90, 2012. */
-  "%default"[-_]"prec"              DEPRECATED ("%default-prec");
+  "%default"[-_]"prec"              DEPRECATED_DIRECTIVE ("%default-prec");
   "%error"[-_]"verbose"             RETURN_VALUE (PERCENT_ERROR_VERBOSE, uniqstr_new (yytext));
-  "%expect"[-_]"rr"                 DEPRECATED ("%expect-rr");
+  "%expect"[-_]"rr"                 DEPRECATED_DIRECTIVE ("%expect-rr");
   "%file-prefix"{eqopt}             RETURN_VALUE (PERCENT_FILE_PREFIX, uniqstr_new (yytext));
-  "%fixed"[-_]"output"[-_]"files"   DEPRECATED ("%output \"y.tab.c\"");
-  "%no"[-_]"default"[-_]"prec"      DEPRECATED ("%no-default-prec");
-  "%no"[-_]"lines"                  DEPRECATED ("%no-lines");
-  "%output"{eqopt}                  DEPRECATED ("%output");
-  "%token"[-_]"table"               DEPRECATED ("%token-table");
+  "%fixed"[-_]"output"[-_]"files"   DEPRECATED_DIRECTIVE ("%output \"y.tab.c\"");
+  "%no"[-_]"default"[-_]"prec"      DEPRECATED_DIRECTIVE ("%no-default-prec");
+  "%no"[-_]"lines"                  DEPRECATED_DIRECTIVE ("%no-lines");
+  "%output"{eqopt}                  DEPRECATED_DIRECTIVE ("%output");
+  "%token"[-_]"table"               DEPRECATED_DIRECTIVE ("%token-table");
 
   "%"{id} {
     complain (loc, complaint, _("invalid directive: %s"), quote (yytext));
+    return GRAM_error;
   }
 
   ":"                     return COLON;
@@ -304,27 +322,29 @@
     BEGIN SC_AFTER_IDENTIFIER;
   }
 
-  {int}      RETURN_VALUE (INT, scan_integer (yytext, 10, *loc));
-  {xint}     RETURN_VALUE (INT, scan_integer (yytext, 16, *loc));
+  {int}      RETURN_VALUE (INT_LITERAL, scan_integer (yytext, 10, *loc));
+  {xint}     RETURN_VALUE (INT_LITERAL, scan_integer (yytext, 16, *loc));
 
   /* Identifiers may not start with a digit.  Yet, don't silently
      accept "1FOO" as "1 FOO".  */
   {int}{id} {
     complain (loc, complaint, _("invalid identifier: %s"), quote (yytext));
+    return GRAM_error;
   }
 
   /* Characters.  */
   "'"         token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER;
 
   /* Strings. */
-  "\""        token_start = loc->start; BEGIN SC_ESCAPED_STRING;
+  "\""        token_start = loc->start; STRING_1GROW ('"'); BEGIN SC_ESCAPED_STRING;
+  "_(\""      token_start = loc->start; STRING_1GROW ('"'); BEGIN SC_ESCAPED_TSTRING;
 
   /* Prologue. */
   "%{"        code_start = loc->start; BEGIN SC_PROLOGUE;
 
   /* Code in between braces.  */
   "{" {
-    STRING_GROW;
+    STRING_GROW ();
     nesting = 0;
     code_start = loc->start;
     BEGIN SC_BRACED_CODE;
@@ -360,10 +380,11 @@
     BEGIN SC_BRACKETED_ID;
   }
 
-  [^\[%A-Za-z0-9_<>{}\"\'*;|=/, \f\r\n\t\v]+|. {
+  [^\[%A-Za-z0-9_<>{}""''*;|=/, \f\r\n\t\v]+|. {
     complain (loc, complaint, "%s: %s",
               ngettext ("invalid character", "invalid characters", yyleng),
               quote_mem (yytext, yyleng));
+    return GRAM_error;
   }
 
   <<EOF>> {
@@ -378,9 +399,14 @@
   | added value.                                                  |
   `--------------------------------------------------------------*/
 
-<SC_ESCAPED_CHARACTER,SC_ESCAPED_STRING,SC_TAG>
+<SC_ESCAPED_CHARACTER,SC_ESCAPED_STRING,SC_ESCAPED_TSTRING,SC_TAG>
 {
-  \0        complain (loc, complaint, _("invalid null character"));
+  \0         {
+    complain (loc, complaint, _("invalid null character"));
+    STRING_FINISH ();
+    STRING_FREE ();
+    return GRAM_error;
+  }
 }
 
 
@@ -436,6 +462,7 @@
         complain (loc, complaint,
                   _("unexpected identifier in bracketed name: %s"),
                   quote (yytext));
+        return GRAM_error;
       }
     else
       {
@@ -456,7 +483,10 @@
           }
       }
     else
-      complain (loc, complaint, _("an identifier expected"));
+      {
+        complain (loc, complaint, _("an identifier expected"));
+        return GRAM_error;
+      }
   }
 
   [^\].A-Za-z0-9_/ \f\r\n\t\v]+|. {
@@ -464,6 +494,7 @@
               ngettext ("invalid character in bracketed name",
                         "invalid characters in bracketed name", yyleng),
               quote_mem (yytext, yyleng));
+    return GRAM_error;
   }
 
   <<EOF>> {
@@ -503,7 +534,7 @@
 
 <SC_COMMENT>
 {
-  "*"{splice}"/"  STRING_GROW; BEGIN context_state;
+  "*"{splice}"/"  STRING_GROW (); BEGIN context_state;
   <<EOF>>         unexpected_eof (token_start, "*/"); BEGIN context_state;
 }
 
@@ -514,8 +545,8 @@
 
 <SC_LINE_COMMENT>
 {
-  {eol}          STRING_GROW; BEGIN context_state;
-  {splice}       STRING_GROW;
+  {eol}          STRING_GROW (); BEGIN context_state;
+  {splice}       STRING_GROW ();
   <<EOF>>        BEGIN context_state;
 }
 
@@ -528,7 +559,8 @@
 <SC_ESCAPED_STRING>
 {
   "\"" {
-    STRING_FINISH;
+    STRING_1GROW ('"');
+    STRING_FINISH ();
     BEGIN INITIAL;
     loc->start = token_start;
     complain (loc, Wyacc,
@@ -536,9 +568,26 @@
     RETURN_VALUE (STRING, last_string);
   }
   <<EOF>>   unexpected_eof (token_start, "\"");
-  {eol}     unexpected_newline (token_start, "\"");
+  "\n"      unexpected_newline (token_start, "\"");
 }
 
+<SC_ESCAPED_TSTRING>
+{
+  "\")" {
+    STRING_1GROW ('"');
+    STRING_FINISH ();
+    BEGIN INITIAL;
+    loc->start = token_start;
+    complain (loc, Wyacc,
+              _("POSIX Yacc does not support string literals"));
+    RETURN_VALUE (TSTRING, last_string);
+  }
+  <<EOF>>   unexpected_eof (token_start, "\")");
+  "\n"      unexpected_newline (token_start, "\")");
+}
+
+
+
   /*----------------------------------------------------------.
   | Scanning a Bison character literal, decoding its escapes. |
   | The initial quote is already eaten.                       |
@@ -547,23 +596,28 @@
 <SC_ESCAPED_CHARACTER>
 {
   "'" {
-    STRING_FINISH;
-    loc->start = token_start;
-    val->CHAR = last_string[0];
-
-    /* FIXME: Eventually, make these errors.  */
-    if (last_string[0] == '\0')
-    {
-      complain (loc, Wother, _("empty character literal"));
-      /* '\0' seems dangerous even if we are about to complain.  */
-      val->CHAR = '\'';
-    }
-    else if (last_string[1] != '\0')
-      complain (loc, Wother,
-                _("extra characters in character literal"));
-    STRING_FREE;
+    STRING_FINISH ();
     BEGIN INITIAL;
-    return CHAR;
+    loc->start = token_start;
+
+    if (last_string[0] == '\0')
+      {
+        complain (loc, complaint, _("empty character literal"));
+        STRING_FREE ();
+        return GRAM_error;
+      }
+    else if (last_string[1] != '\0')
+      {
+        complain (loc, complaint, _("extra characters in character literal"));
+        STRING_FREE ();
+        return GRAM_error;
+      }
+    else
+      {
+        val->CHAR_LITERAL = last_string[0];
+        STRING_FREE ();
+        return CHAR_LITERAL;
+      }
   }
   {eol}     unexpected_newline (token_start, "'");
   <<EOF>>   unexpected_eof (token_start, "'");
@@ -581,18 +635,18 @@
     --nesting;
     if (nesting < 0)
       {
-        STRING_FINISH;
+        STRING_FINISH ();
         loc->start = token_start;
         val->TAG = uniqstr_new (last_string);
-        STRING_FREE;
+        STRING_FREE ();
         BEGIN INITIAL;
         return TAG;
       }
-    STRING_GROW;
+    STRING_GROW ();
   }
 
-  ([^<>]|->)+ STRING_GROW;
-  "<"+   STRING_GROW; nesting += yyleng;
+  ([^<>]|->)+ STRING_GROW ();
+  "<"+   STRING_GROW (); nesting += yyleng;
 
   <<EOF>>   unexpected_eof (token_start, ">");
 }
@@ -601,47 +655,31 @@
   | Decode escaped characters.  |
   `----------------------------*/
 
-<SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>
+<SC_ESCAPED_CHARACTER,SC_ESCAPED_STRING,SC_ESCAPED_TSTRING>
 {
   \\[0-7]{1,3} {
-    verify (UCHAR_MAX < ULONG_MAX);
-    long c = strtol (yytext + 1, NULL, 8);
-    if (0 < c && c <= UCHAR_MAX)
-      obstack_1grow (&obstack_for_string, c);
-    else
-      complain (loc, complaint, _("invalid number after \\-escape: %s"),
-                yytext+1);
+    STRING_GROW_ESCAPE (strtol (yytext + 1, NULL, 8));
   }
 
   \\x[0-9abcdefABCDEF]+ {
-    verify (UCHAR_MAX < ULONG_MAX);
-    long c = strtol (yytext + 2, NULL, 16);
-    if (0 < c && c <= UCHAR_MAX)
-      obstack_1grow (&obstack_for_string, c);
-    else
-      complain (loc, complaint, _("invalid number after \\-escape: %s"),
-                yytext+1);
+    STRING_GROW_ESCAPE (strtol (yytext + 2, NULL, 16));
   }
 
-  \\a   obstack_1grow (&obstack_for_string, '\a');
-  \\b   obstack_1grow (&obstack_for_string, '\b');
-  \\f   obstack_1grow (&obstack_for_string, '\f');
-  \\n   obstack_1grow (&obstack_for_string, '\n');
-  \\r   obstack_1grow (&obstack_for_string, '\r');
-  \\t   obstack_1grow (&obstack_for_string, '\t');
-  \\v   obstack_1grow (&obstack_for_string, '\v');
+  \\a   STRING_GROW_ESCAPE ('\a');
+  \\b   STRING_GROW_ESCAPE ('\b');
+  \\f   STRING_GROW_ESCAPE ('\f');
+  \\n   STRING_GROW_ESCAPE ('\n');
+  \\r   STRING_GROW_ESCAPE ('\r');
+  \\t   STRING_GROW_ESCAPE ('\t');
+  \\v   STRING_GROW_ESCAPE ('\v');
 
   /* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
-  \\("\""|"'"|"?"|"\\")  obstack_1grow (&obstack_for_string, yytext[1]);
+  \\("\""|"'"|"?"|"\\")  STRING_GROW_ESCAPE (yytext[1]);
 
   \\(u|U[0-9abcdefABCDEF]{4})[0-9abcdefABCDEF]{4} {
-    int c = convert_ucn_to_byte (yytext);
-    if (c <= 0)
-      complain (loc, complaint, _("invalid number after \\-escape: %s"),
-                yytext+1);
-    else
-      obstack_1grow (&obstack_for_string, c);
+    STRING_GROW_ESCAPE (convert_ucn_to_byte (yytext));
   }
+
   \\(.|{eol})      {
     char const *p = yytext + 1;
     /* Quote only if escaping won't make the character visible.  */
@@ -651,6 +689,16 @@
       p = quotearg_style_mem (escape_quoting_style, p, 1);
     complain (loc, complaint, _("invalid character after \\-escape: %s"),
               p);
+    STRING_1GROW ('?');
+  }
+
+  "\\"             {
+    // None of the other rules matched: the last character of this
+    // file is "\".  But Flex does not support "\\<<EOF>>".
+    unexpected_eof (token_start,
+                    YY_START == SC_ESCAPED_CHARACTER ? "?'"
+                    : YY_START == SC_ESCAPED_STRING ? "?\""
+                    : "?\")");
   }
 }
 
@@ -660,19 +708,19 @@
 
 <SC_CHARACTER,SC_STRING>
 {
-  {splice}|\\{splice}[^\n\[\]]  STRING_GROW;
+  {splice}|\\{splice}[^\n\[\]]  STRING_GROW ();
 }
 
 <SC_CHARACTER>
 {
-  "'"           STRING_GROW; BEGIN context_state;
+  "'"           STRING_GROW (); BEGIN context_state;
   {eol}         unexpected_newline (token_start, "'");
   <<EOF>>       unexpected_eof (token_start, "'");
 }
 
 <SC_STRING>
 {
-  "\""          STRING_GROW; BEGIN context_state;
+  "\""          STRING_GROW (); BEGIN context_state;
   {eol}         unexpected_newline (token_start, "\"");
   <<EOF>>       unexpected_eof (token_start, "\"");
 }
@@ -685,25 +733,25 @@
 <SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE,SC_PREDICATE>
 {
   "'" {
-    STRING_GROW;
+    STRING_GROW ();
     context_state = YY_START;
     token_start = loc->start;
     BEGIN SC_CHARACTER;
   }
   "\"" {
-    STRING_GROW;
+    STRING_GROW ();
     context_state = YY_START;
     token_start = loc->start;
     BEGIN SC_STRING;
   }
   "/"{splice}"*" {
-    STRING_GROW;
+    STRING_GROW ();
     context_state = YY_START;
     token_start = loc->start;
     BEGIN SC_COMMENT;
   }
   "/"{splice}"/" {
-    STRING_GROW;
+    STRING_GROW ();
     context_state = YY_START;
     BEGIN SC_LINE_COMMENT;
   }
@@ -718,12 +766,12 @@
 
 <SC_BRACED_CODE,SC_PREDICATE>
 {
-  "{"|"<"{splice}"%"  STRING_GROW; nesting++;
-  "%"{splice}">"      STRING_GROW; nesting--;
+  "{"|"<"{splice}"%"  STRING_GROW (); nesting++;
+  "%"{splice}">"      STRING_GROW (); nesting--;
 
   /* Tokenize '<<%' correctly (as '<<' '%') rather than incorrectly
      (as '<' '<%').  */
-  "<"{splice}"<"  STRING_GROW;
+  "<"{splice}"<"  STRING_GROW ();
 
   <<EOF>>   unexpected_eof (code_start, "}");
 }
@@ -731,12 +779,12 @@
 <SC_BRACED_CODE>
 {
   "}" {
-    obstack_1grow (&obstack_for_string, '}');
+    STRING_1GROW ('}');
 
     --nesting;
     if (nesting < 0)
       {
-        STRING_FINISH;
+        STRING_FINISH ();
         loc->start = code_start;
         BEGIN INITIAL;
         RETURN_VALUE (BRACED_CODE, last_string);
@@ -750,13 +798,13 @@
     --nesting;
     if (nesting < 0)
       {
-        STRING_FINISH;
+        STRING_FINISH ();
         loc->start = code_start;
         BEGIN INITIAL;
         RETURN_VALUE (BRACED_PREDICATE, last_string);
       }
     else
-      obstack_1grow (&obstack_for_string, '}');
+      STRING_1GROW ('}');
   }
 }
 
@@ -767,7 +815,7 @@
 <SC_PROLOGUE>
 {
   "%}" {
-    STRING_FINISH;
+    STRING_FINISH ();
     loc->start = code_start;
     BEGIN INITIAL;
     RETURN_VALUE (PROLOGUE, last_string);
@@ -785,7 +833,7 @@
 <SC_EPILOGUE>
 {
   <<EOF>> {
-    STRING_FINISH;
+    STRING_FINISH ();
     loc->start = code_start;
     BEGIN INITIAL;
     RETURN_VALUE (EPILOGUE, last_string);
@@ -797,7 +845,7 @@
   | By default, grow the string obstack with the input.  |
   `-----------------------------------------------------*/
 
-<SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PREDICATE,SC_PROLOGUE,SC_EPILOGUE,SC_STRING,SC_CHARACTER,SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>
+<SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PREDICATE,SC_PROLOGUE,SC_EPILOGUE,SC_STRING,SC_CHARACTER,SC_ESCAPED_CHARACTER,SC_ESCAPED_STRING,SC_ESCAPED_TSTRING>
 {
   /* Accept multibyte characters in one block instead of byte after
      byte, so that add_column_width and mbsnwidth can compute correct
@@ -805,7 +853,7 @@
 
      Add a fallthrough "|." so that non UTF-8 input is still accepted
      and does not jam the scanner.  */
-  {mbchar}|.   STRING_GROW;
+  {mbchar}|.   STRING_GROW ();
 }
 
 %%
@@ -894,9 +942,9 @@
 }
 
 
-/*---------------------------------------------------------------------.
-| Handle '#line INT( "FILE")?\n'.  ARGS has already skipped '#line '.  |
-`---------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------.
+| Handle '#line INT_LITERAL( "FILE")?\n'.  ARGS has already skipped '#line '. |
+`----------------------------------------------------------------------------*/
 
 static void
 handle_syncline (char *args, location loc)
@@ -986,7 +1034,7 @@
 
 
 void
-gram_scanner_close ()
+gram_scanner_close (void)
 {
   xfclose (gram_in);
   /* Reclaim Flex's buffers.  */
@@ -994,7 +1042,6 @@
 }
 
 
-
 void
 gram_scanner_free (void)
 {
diff --git a/src/scan-skel.c b/src/scan-skel.c
index cfd1da6..919ad00 100644
--- a/src/scan-skel.c
+++ b/src/scan-skel.c
@@ -691,8 +691,8 @@
 /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\
 	(yy_c_buf_p) = yy_cp;
 /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */
-#define YY_NUM_RULES 24
-#define YY_END_OF_BUFFER 25
+#define YY_NUM_RULES 26
+#define YY_END_OF_BUFFER 27
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -700,15 +700,15 @@
 	flex_int32_t yy_verify;
 	flex_int32_t yy_nxt;
 	};
-static const flex_int16_t yy_accept[67] =
+static const flex_int16_t yy_accept[71] =
     {   0,
-        0,    0,    0,    0,    0,    0,   25,   13,   12,   11,
-       14,   21,   23,   22,   22,   13,   11,    5,    4,    1,
-       11,   11,   11,    2,    3,   14,   21,   19,   18,   20,
-       15,   16,   17,   11,   11,   11,   11,   11,   11,   11,
-       11,   11,   11,   11,   11,   11,   11,   11,   11,   11,
-       11,   11,   11,   11,   11,    7,    6,   11,   11,   11,
-       10,   11,   11,    8,    9,    0
+        0,    0,    0,    0,    0,    0,   27,   13,   12,   11,
+       15,   16,   23,   25,   24,   24,   13,   11,    5,    4,
+        1,   11,   11,   11,    2,    3,    0,   16,   23,   21,
+       20,   22,   17,   18,   19,   11,   11,   11,   11,   11,
+       14,   11,   11,   11,   11,   11,   14,   11,   11,   11,
+       11,   11,   11,   11,   11,   11,   11,   11,   11,    7,
+        6,   11,   11,   11,   10,   11,   11,    8,    9,    0
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -717,16 +717,16 @@
         1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    2,    1,    1,    1,    1,    1,    1,    4,    5,
-        6,    1,    1,    6,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    7,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    8,    9,   10,    1,
+        6,    1,    1,    6,    1,    1,    1,    7,    7,    7,
+        7,    8,    7,    7,    7,    7,    7,    1,    1,    1,
+        1,    1,    1,    9,    7,    7,    7,    7,    7,    7,
+        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
+        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
+        1,    1,    1,    1,   10,    1,   11,   12,   13,    7,
 
-       11,   12,    1,    1,   13,    1,    1,   14,   15,   16,
-       17,   18,    1,    1,   19,   20,   21,    1,    1,    1,
-        1,    1,   22,    1,   23,    1,    1,    1,    1,    1,
+       14,   15,    7,    7,   16,    7,    7,   17,   18,   19,
+       20,   21,    7,    7,   22,   23,   24,    7,    7,    7,
+        7,    7,   25,    1,   26,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -743,71 +743,81 @@
         1,    1,    1,    1,    1
     } ;
 
-static const YY_CHAR yy_meta[24] =
+static const YY_CHAR yy_meta[27] =
     {   0,
-        1,    1,    2,    1,    3,    1,    4,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1
+        1,    1,    2,    1,    3,    1,    4,    4,    5,    4,
+        4,    6,    4,    4,    4,    4,    4,    6,    4,    4,
+        4,    4,    4,    4,    1,    1
     } ;
 
-static const flex_int16_t yy_base[74] =
+static const flex_int16_t yy_base[79] =
     {   0,
-        0,    1,   55,   54,    3,    7,   60,    0,  100,    8,
-        0,   29,  100,  100,  100,    0,   50,  100,  100,  100,
-       51,   41,    2,  100,  100,    0,  100,  100,  100,  100,
-      100,  100,  100,   37,   40,   37,   36,   28,   36,   28,
-       31,   28,   25,   26,   27,   29,   28,   17,   29,   26,
-       22,   21,    7,   11,   11,  100,  100,   17,   10,    4,
-      100,   14,    8,  100,  100,  100,   73,   77,   81,   85,
-       88,   92,   95
+        0,   16,   58,   57,    2,    4,   64,    0,  150,   32,
+       55,    0,   56,  150,  150,  150,    0,   80,  150,  150,
+      150,   50,   36,    0,  150,  150,   45,    0,  150,  150,
+      150,  150,  150,  150,  150,   32,   35,   35,   34,   26,
+        0,   34,   26,   29,   24,   21,    0,   21,   22,   24,
+       23,    9,   21,   20,   21,   20,    4,    8,    7,  150,
+      150,   17,    7,    1,  150,    5,    3,  150,  150,  150,
+      106,  112,  118,  124,  128,  134,  140,  143
     } ;
 
-static const flex_int16_t yy_def[74] =
+static const flex_int16_t yy_def[79] =
     {   0,
-       67,   67,   68,   68,   69,   69,   66,   70,   66,   71,
-       72,   73,   66,   66,   66,   70,   71,   66,   66,   66,
-       17,   17,   17,   66,   66,   72,   66,   66,   66,   66,
-       66,   66,   66,   17,   17,   17,   17,   17,   17,   17,
-       17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
-       17,   17,   17,   17,   17,   66,   66,   17,   17,   17,
-       66,   17,   17,   66,   66,    0,   66,   66,   66,   66,
-       66,   66,   66
+       71,   71,   72,   72,   73,   73,   70,   74,   70,   75,
+       70,   76,   77,   70,   70,   70,   74,   75,   70,   70,
+       70,   18,   18,   18,   70,   70,   70,   76,   70,   70,
+       70,   70,   70,   70,   70,   18,   18,   18,   18,   18,
+       78,   18,   18,   18,   18,   18,   78,   18,   18,   18,
+       18,   18,   18,   18,   18,   18,   18,   18,   18,   70,
+       70,   18,   18,   18,   70,   18,   18,   70,   70,    0,
+       70,   70,   70,   70,   70,   70,   70,   70
     } ;
 
-static const flex_int16_t yy_nxt[124] =
+static const flex_int16_t yy_nxt[177] =
     {   0,
-       66,   66,    9,    9,   14,   15,   10,   10,   14,   15,
-       18,   19,   65,   36,   20,   37,   21,   22,   64,   63,
-       62,   61,   38,   60,   23,   59,   58,   57,   56,   24,
-       25,   28,   29,   55,   30,   31,   54,   53,   52,   51,
-       50,   49,   48,   47,   46,   45,   44,   43,   42,   41,
-       32,   33,   66,   66,   40,   39,   66,   35,   34,   66,
-       12,   12,   66,   66,   66,   66,   66,   66,   66,   66,
-       66,   66,   66,    8,    8,    8,    8,   11,   11,   11,
-       11,   13,   13,   13,   13,   16,   66,   16,   17,   17,
-       66,   17,   26,   26,   26,   27,   27,   27,   27,    7,
+       70,   70,    9,   15,   16,   15,   16,   69,   10,   68,
+       70,   11,   70,   70,   38,   70,   39,   11,    9,   67,
+       66,   65,   64,   40,   10,   63,   62,   11,   61,   60,
+       59,   58,   57,   11,   19,   20,   56,   55,   54,   53,
+       21,   52,   51,   22,   23,   50,   49,   48,   46,   45,
+       44,   24,   43,   42,   41,   37,   25,   26,   30,   31,
+       36,   32,   27,   70,   33,   13,   13,   70,   70,   70,
+       70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
+       34,   35,   70,   70,   70,   70,   70,   70,   70,   70,
+       70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
 
-       66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
-       66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
-       66,   66,   66
+       70,   70,   70,   70,   70,   70,    8,    8,    8,    8,
+        8,    8,   12,   12,   12,   12,   12,   12,   14,   14,
+       14,   14,   14,   14,   17,   70,   17,   17,   18,   18,
+       70,   18,   18,   18,   28,   28,   28,   28,   70,   28,
+       29,   29,   29,   29,   29,   29,   47,   70,   47,    7,
+       70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
+       70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
+       70,   70,   70,   70,   70,   70
     } ;
 
-static const flex_int16_t yy_chk[124] =
+static const flex_int16_t yy_chk[177] =
     {   0,
-        0,    0,    1,    2,    5,    5,    1,    2,    6,    6,
-       10,   10,   63,   23,   10,   23,   10,   10,   62,   60,
-       59,   58,   23,   55,   10,   54,   53,   52,   51,   10,
-       10,   12,   12,   50,   12,   12,   49,   48,   47,   46,
-       45,   44,   43,   42,   41,   40,   39,   38,   37,   36,
-       12,   12,   17,   17,   35,   34,   17,   22,   21,    7,
-        4,    3,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,   17,   17,   67,   67,   67,   67,   68,   68,   68,
-       68,   69,   69,   69,   69,   70,    0,   70,   71,   71,
-        0,   71,   72,   72,   72,   73,   73,   73,   73,   66,
+        0,    0,    1,    5,    5,    6,    6,   67,    1,   66,
+        0,    1,    0,    0,   24,    0,   24,    1,    2,   64,
+       63,   62,   59,   24,    2,   58,   57,    2,   56,   55,
+       54,   53,   52,    2,   10,   10,   51,   50,   49,   48,
+       10,   46,   45,   10,   10,   44,   43,   42,   40,   39,
+       38,   10,   37,   36,   27,   23,   10,   10,   13,   13,
+       22,   13,   11,    7,   13,    4,    3,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       13,   13,   18,   18,    0,    0,    0,    0,   18,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
-       66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
-       66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
-       66,   66,   66
+        0,    0,    0,    0,   18,   18,   71,   71,   71,   71,
+       71,   71,   72,   72,   72,   72,   72,   72,   73,   73,
+       73,   73,   73,   73,   74,    0,   74,   74,   75,   75,
+        0,   75,   75,   75,   76,   76,   76,   76,    0,   76,
+       77,   77,   77,   77,   77,   77,   78,    0,   78,   70,
+       70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
+       70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
+       70,   70,   70,   70,   70,   70
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -816,11 +826,11 @@
 extern int yy_flex_debug;
 int yy_flex_debug = 1;
 
-static const flex_int16_t yy_rule_linenum[24] =
+static const flex_int16_t yy_rule_linenum[26] =
     {   0,
-       74,   75,   76,   77,   78,   80,   81,   83,   84,   85,
-       88,   89,   90,  103,  105,  106,  107,  108,  109,  111,
-      130,  135,  136
+       78,   79,   80,   81,   82,   84,   85,   87,   88,   89,
+       92,   93,   94,   99,  108,  121,  123,  124,  125,  126,
+      127,  129,  148,  153,  154
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -834,7 +844,7 @@
 #line 1 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 /* Scan Bison Skeletons.                                       -*- C -*-
 
-   Copyright (C) 2001-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -849,7 +859,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 #define YY_NO_INPUT 1
 #line 24 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 #include <dirname.h>
@@ -857,16 +867,16 @@
 #include <path-join.h>
 #include <quotearg.h>
 
-#include <src/complain.h>
-#include <src/files.h>
-#include <src/getargs.h>
-#include <src/scan-skel.h>
+#include "src/complain.h"
+#include "src/files.h"
+#include "src/getargs.h"
+#include "src/scan-skel.h"
 
 #define FLEX_PREFIX(Id) skel_ ## Id
-#include <src/flex-scanner.h>
+#include "src/flex-scanner.h"
 
 /* Work around a bug in flex 2.5.31.  See Debian bug 333231
-   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
+   <https://bugs.debian.org/333231>.  */
 #undef skel_wrap
 #define skel_wrap() 1
 
@@ -881,9 +891,11 @@
 static void fail_for_at_directive_too_many_args (char const *at_directive_name);
 static void fail_for_at_directive_too_few_args (char const *at_directive_name);
 static void fail_for_invalid_at (char const *at);
-#line 884 "src/scan-skel.c"
+static void output_mapped_file (char const *name);
+#line 895 "src/scan-skel.c"
+/* Identifiers of our M4 macros.  */
 
-#line 886 "src/scan-skel.c"
+#line 898 "src/scan-skel.c"
 
 #define INITIAL 0
 #define SC_AT_DIRECTIVE_ARGS 1
@@ -1163,11 +1175,11 @@
 
 	{
 /* %% [7.0] user's declarations go here */
-#line 58 "/Users/akim/src/gnu/bison/src/scan-skel.l"
-
-
-
 #line 62 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+
+
+
+#line 66 "/Users/akim/src/gnu/bison/src/scan-skel.l"
   int out_lineno PACIFY_CC (= 0);
   char *out_name = NULL;
 
@@ -1180,7 +1192,7 @@
   at_directive at_ptr = NULL;
 
 
-#line 1183 "src/scan-skel.c"
+#line 1195 "src/scan-skel.c"
 
 	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
 		{
@@ -1209,13 +1221,13 @@
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 67 )
+				if ( yy_current_state >= 71 )
 					yy_c = yy_meta[yy_c];
 				}
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
 			++yy_cp;
 			}
-		while ( yy_current_state != 66 );
+		while ( yy_current_state != 70 );
 		yy_cp = (yy_last_accepting_cpos);
 		yy_current_state = (yy_last_accepting_state);
 
@@ -1234,13 +1246,13 @@
 			{
 			if ( yy_act == 0 )
 				fprintf( stderr, "--scanner backing up\n" );
-			else if ( yy_act < 24 )
+			else if ( yy_act < 26 )
 				fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
 				         (long)yy_rule_linenum[yy_act], yytext );
-			else if ( yy_act == 24 )
+			else if ( yy_act == 26 )
 				fprintf( stderr, "--accepting default rule (\"%s\")\n",
 				         yytext );
-			else if ( yy_act == 25 )
+			else if ( yy_act == 27 )
 				fprintf( stderr, "--(end of buffer or a NUL)\n" );
 			else
 				fprintf( stderr, "--EOF (start condition %d)\n", YY_START );
@@ -1258,74 +1270,95 @@
 
 case 1:
 YY_RULE_SETUP
-#line 74 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 78 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 fputc ('@', yyout);
 	YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 75 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 79 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 fputc ('[', yyout);
 	YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 76 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 80 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 fputc (']', yyout);
 	YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 77 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 81 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 continue;  /* Used by b4_cat in ../data/bison.m4.  */
 	YY_BREAK
 case 5:
 /* rule 5 can match eol */
 YY_RULE_SETUP
-#line 78 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 82 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 continue;
 	YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 80 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 84 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 fprintf (yyout, "%d", out_lineno + 1);
 	YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 81 "/Users/akim/src/gnu/bison/src/scan-skel.l"
-fputs (quotearg_style (c_quoting_style, out_name), yyout);
+#line 85 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+output_mapped_file (out_name);
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 83 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 87 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 at_init (&argc, argv, &at_ptr, &at_basename);
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 84 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 88 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 at_init (&argc, argv, &at_ptr, &at_complain);
 	YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 85 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 89 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 at_init (&argc, argv, &at_ptr, &at_output);
 	YY_BREAK
 /* This pattern must not match more than the previous @ patterns. */
 case 11:
 YY_RULE_SETUP
-#line 88 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 92 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 fail_for_invalid_at (yytext);
 	YY_BREAK
 case 12:
 /* rule 12 can match eol */
 YY_RULE_SETUP
-#line 89 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 93 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 out_lineno++; ECHO;
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 90 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 94 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+ECHO;
+	YY_BREAK
+/* If there are still identifiers that look like macros, such as
+     b4_synbol, this probably an error, say a typo in M4, or
+     overquotation.  */
+case 14:
+YY_RULE_SETUP
+#line 99 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+{
+                  location loc = empty_loc;
+                  loc.start.file = map_file_name (out_name);
+                  loc.start.line = out_lineno;
+                  loc.end = loc.start;
+                  complain (&loc, Wother,
+                            "suspicious sequence in the output: %s", yytext);
+                  ECHO;
+                }
+	YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 108 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 ECHO;
 	YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 92 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 110 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 {
   if (out_name)
     {
@@ -1337,41 +1370,41 @@
 	YY_BREAK
 
 
-case 14:
-/* rule 14 can match eol */
-YY_RULE_SETUP
-#line 103 "/Users/akim/src/gnu/bison/src/scan-skel.l"
-STRING_GROW;
-	YY_BREAK
-case 15:
-YY_RULE_SETUP
-#line 105 "/Users/akim/src/gnu/bison/src/scan-skel.l"
-obstack_1grow (&obstack_for_string, '@');
-	YY_BREAK
 case 16:
+/* rule 16 can match eol */
 YY_RULE_SETUP
-#line 106 "/Users/akim/src/gnu/bison/src/scan-skel.l"
-obstack_1grow (&obstack_for_string, '[');
+#line 121 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+STRING_GROW ();
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 107 "/Users/akim/src/gnu/bison/src/scan-skel.l"
-obstack_1grow (&obstack_for_string, ']');
+#line 123 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+STRING_1GROW ('@');
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 108 "/Users/akim/src/gnu/bison/src/scan-skel.l"
-continue; /* For starting an argument that begins with whitespace. */
+#line 124 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+STRING_1GROW ('[');
 	YY_BREAK
 case 19:
-/* rule 19 can match eol */
 YY_RULE_SETUP
-#line 109 "/Users/akim/src/gnu/bison/src/scan-skel.l"
-continue;
+#line 125 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+STRING_1GROW (']');
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 111 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 126 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+continue; /* For starting an argument that begins with whitespace. */
+	YY_BREAK
+case 21:
+/* rule 21 can match eol */
+YY_RULE_SETUP
+#line 127 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+continue;
+	YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 129 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 {
     if (argc >= ARGC_MAX)
       fail_for_at_directive_too_many_args (argv[0]);
@@ -1391,23 +1424,23 @@
       }
   }
 	YY_BREAK
-case 21:
+case 23:
 YY_RULE_SETUP
-#line 130 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 148 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 fail_for_invalid_at (yytext);
 	YY_BREAK
 
 
 
-case 22:
-/* rule 22 can match eol */
+case 24:
+/* rule 24 can match eol */
 YY_RULE_SETUP
-#line 135 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 153 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 continue;
 	YY_BREAK
-case 23:
+case 25:
 YY_RULE_SETUP
-#line 136 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 154 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 yyless (0); BEGIN SC_AT_DIRECTIVE_ARGS;
 	YY_BREAK
 
@@ -1415,16 +1448,16 @@
 
 case YY_STATE_EOF(SC_AT_DIRECTIVE_ARGS):
 case YY_STATE_EOF(SC_AT_DIRECTIVE_SKIP_WS):
-#line 141 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 159 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 complain (NULL, fatal, _("unclosed %s directive in skeleton"), argv[0]);
 	YY_BREAK
 
-case 24:
+case 26:
 YY_RULE_SETUP
-#line 144 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 162 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 YY_FATAL_ERROR( "flex scanner jammed" );
 	YY_BREAK
-#line 1427 "src/scan-skel.c"
+#line 1460 "src/scan-skel.c"
 
 	case YY_END_OF_BUFFER:
 		{
@@ -1743,7 +1776,7 @@
 		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 67 )
+			if ( yy_current_state >= 71 )
 				yy_c = yy_meta[yy_c];
 			}
 		yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -1776,11 +1809,11 @@
 	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 67 )
+		if ( yy_current_state >= 71 )
 			yy_c = yy_meta[yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
-	yy_is_jam = (yy_current_state == 66);
+	yy_is_jam = (yy_current_state == 70);
 
 		return yy_is_jam ? 0 : yy_current_state;
 }
@@ -2529,7 +2562,7 @@
 
 /* %ok-for-header */
 
-#line 144 "/Users/akim/src/gnu/bison/src/scan-skel.l"
+#line 162 "/Users/akim/src/gnu/bison/src/scan-skel.l"
 
 
 static void
@@ -2579,7 +2612,7 @@
   else if (STREQ (arg, "fatal"))
     return fatal;
   else if (STREQ (arg, "note"))
-    return silent | complaint | no_caret;
+    return silent | complaint | no_caret | note;
   else if (STREQ (arg, "warn"))
     return Wother;
   else
@@ -2615,14 +2648,7 @@
       boundary_set_from_string (&loc.end, argv[3]);
       locp = &loc;
     }
-  static int indent;
-  if (w & silent)
-    indent += SUB_INDENT;
-  else
-    indent = 0;
-  complain_args (locp, w, &indent, argc - 4, argv + 4);
-  if (w & silent)
-    indent -= SUB_INDENT;
+  complain_args (locp, w, argc - 4, argv + 4);
 }
 
 static void
@@ -2662,3 +2688,9 @@
   complain (NULL, fatal, "invalid @ in skeleton: %s", at);
 }
 
+static void
+output_mapped_file (char const *name)
+{
+  fputs (quotearg_style (c_quoting_style, map_file_name (name)), yyout);
+}
+
diff --git a/src/scan-skel.h b/src/scan-skel.h
index 20fa09d..e347907 100644
--- a/src/scan-skel.h
+++ b/src/scan-skel.h
@@ -1,6 +1,6 @@
 /* Scan Bison Skeletons.
 
-   Copyright (C) 2005-2007, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2005-2007, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 void scan_skel (FILE *);
 
diff --git a/src/scan-skel.l b/src/scan-skel.l
index 121aac0..60232a2 100644
--- a/src/scan-skel.l
+++ b/src/scan-skel.l
@@ -1,6 +1,6 @@
 /* Scan Bison Skeletons.                                       -*- C -*-
 
-   Copyright (C) 2001-2015, 2018-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2015, 2018-2021 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -15,7 +15,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 %option nodefault noyywrap noinput nounput never-interactive debug
 %option prefix="skel_" outfile="lex.yy.c"
@@ -26,16 +26,16 @@
 #include <path-join.h>
 #include <quotearg.h>
 
-#include <src/complain.h>
-#include <src/files.h>
-#include <src/getargs.h>
-#include <src/scan-skel.h>
+#include "src/complain.h"
+#include "src/files.h"
+#include "src/getargs.h"
+#include "src/scan-skel.h"
 
 #define FLEX_PREFIX(Id) skel_ ## Id
-#include <src/flex-scanner.h>
+#include "src/flex-scanner.h"
 
 /* Work around a bug in flex 2.5.31.  See Debian bug 333231
-   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
+   <https://bugs.debian.org/333231>.  */
 #undef skel_wrap
 #define skel_wrap() 1
 
@@ -50,8 +50,12 @@
 static void fail_for_at_directive_too_many_args (char const *at_directive_name);
 static void fail_for_at_directive_too_few_args (char const *at_directive_name);
 static void fail_for_invalid_at (char const *at);
+static void output_mapped_file (char const *name);
 %}
 
+/* Identifiers of our M4 macros.  */
+macro    [bm]4_[a-zA-Z_0-9]*
+
 %x SC_AT_DIRECTIVE_ARGS
 %x SC_AT_DIRECTIVE_SKIP_WS
 
@@ -77,16 +81,30 @@
 @\n  continue;
 
 "@oline@"  fprintf (yyout, "%d", out_lineno + 1);
-"@ofile@"  fputs (quotearg_style (c_quoting_style, out_name), yyout);
+"@ofile@"  output_mapped_file (out_name);
 
 "@basename("    at_init (&argc, argv, &at_ptr, &at_basename);
 "@complain("    at_init (&argc, argv, &at_ptr, &at_complain);
 "@output("      at_init (&argc, argv, &at_ptr, &at_output);
 
   /* This pattern must not match more than the previous @ patterns. */
-@[^@{}\'(\n]*   fail_for_invalid_at (yytext);
+@[^@{}''(\n]*   fail_for_invalid_at (yytext);
 \n              out_lineno++; ECHO;
-[^@\n]+         ECHO;
+[^bm@\n]+       ECHO;
+
+  /* If there are still identifiers that look like macros, such as
+     b4_synbol, this probably an error, say a typo in M4, or
+     overquotation.  */
+{macro}         {
+                  location loc = empty_loc;
+                  loc.start.file = map_file_name (out_name);
+                  loc.start.line = out_lineno;
+                  loc.end = loc.start;
+                  complain (&loc, Wother,
+                            "suspicious sequence in the output: %s", yytext);
+                  ECHO;
+                }
+.               ECHO;
 
 <INITIAL><<EOF>> {
   if (out_name)
@@ -99,11 +117,11 @@
 
 <SC_AT_DIRECTIVE_ARGS>
 {
-  [^@]+  STRING_GROW;
+  [^@]+  STRING_GROW ();
 
-  "@@"   obstack_1grow (&obstack_for_string, '@');
-  "@{"   obstack_1grow (&obstack_for_string, '[');
-  "@}"   obstack_1grow (&obstack_for_string, ']');
+  "@@"   STRING_1GROW ('@');
+  "@{"   STRING_1GROW ('[');
+  "@}"   STRING_1GROW (']');
   "@'"   continue; /* For starting an argument that begins with whitespace. */
   @\n    continue;
 
@@ -189,7 +207,7 @@
   else if (STREQ (arg, "fatal"))
     return fatal;
   else if (STREQ (arg, "note"))
-    return silent | complaint | no_caret;
+    return silent | complaint | no_caret | note;
   else if (STREQ (arg, "warn"))
     return Wother;
   else
@@ -225,14 +243,7 @@
       boundary_set_from_string (&loc.end, argv[3]);
       locp = &loc;
     }
-  static int indent;
-  if (w & silent)
-    indent += SUB_INDENT;
-  else
-    indent = 0;
-  complain_args (locp, w, &indent, argc - 4, argv + 4);
-  if (w & silent)
-    indent -= SUB_INDENT;
+  complain_args (locp, w, argc - 4, argv + 4);
 }
 
 static void
@@ -271,3 +282,9 @@
 {
   complain (NULL, fatal, "invalid @ in skeleton: %s", at);
 }
+
+static void
+output_mapped_file (char const *name)
+{
+  fputs (quotearg_style (c_quoting_style, map_file_name (name)), yyout);
+}
diff --git a/src/state-item.c b/src/state-item.c
new file mode 100644
index 0000000..47986e0
--- /dev/null
+++ b/src/state-item.c
@@ -0,0 +1,586 @@
+/* Counterexample Generation Search Nodes
+
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "state-item.h"
+
+#include <assert.h>
+#include <gl_linked_list.h>
+#include <gl_xlist.h>
+#include <stdlib.h>
+#include <time.h>
+
+#include "closure.h"
+#include "getargs.h"
+#include "nullable.h"
+
+size_t nstate_items;
+state_item_number *state_item_map;
+state_item *state_items;
+
+// Hash functions for index -> bitset hash maps.
+typedef struct
+{
+  int key;
+  bitset l;
+} hash_pair;
+
+static size_t
+hash_pair_hasher (const hash_pair *sl, size_t max)
+{
+  return sl->key % max;
+}
+
+static bool
+hash_pair_comparator (const hash_pair *l, const hash_pair *r)
+{
+  return l->key == r->key;
+}
+
+static void
+hash_pair_free (hash_pair *hp)
+{
+  bitset_free (hp->l);
+  free (hp);
+}
+
+static Hash_table *
+hash_pair_table_create (int size)
+{
+  return hash_xinitialize (size,
+                           NULL,
+                           (Hash_hasher) hash_pair_hasher,
+                           (Hash_comparator) hash_pair_comparator,
+                           (Hash_data_freer) hash_pair_free);
+}
+
+static bitset
+hash_pair_lookup (Hash_table *tab, int key)
+{
+  hash_pair probe;
+  probe.key = key;
+  hash_pair *hp = hash_lookup (tab, &probe);
+  return hp ? hp->l : NULL;
+}
+
+static void
+hash_pair_insert (Hash_table *tab, int key, bitset val)
+{
+  hash_pair *hp = xmalloc (sizeof *hp);
+  hp->key = key;
+  hp->l = val;
+  hash_pair *res = hash_xinsert (tab, hp);
+  // This must be the first insertion.
+  (void) res;
+  assert (res == hp);
+}
+
+/* A state_item from a state's id and the offset of the item within
+   the state. */
+state_item *
+state_item_lookup (state_number s, state_item_number off)
+{
+  return &state_items[state_item_index_lookup (s, off)];
+}
+
+static inline void
+state_item_set (state_item_number sidx, const state *s, item_number off)
+{
+  state_items[sidx].state = s;
+  state_items[sidx].item = &ritem[off];
+  state_items[sidx].lookahead = NULL;
+  state_items[sidx].trans = -1;
+  state_items[sidx].prods = NULL;
+  state_items[sidx].revs = bitset_create (nstate_items, BITSET_SPARSE);
+}
+
+/**
+ * Initialize state_items set
+ */
+static void
+init_state_items (void)
+{
+  nstate_items = 0;
+  bitsetv production_items = bitsetv_create (nstates, nritems, BITSET_SPARSE);
+  for (int i = 0; i < nstates; ++i)
+    {
+      const state *s = states[i];
+      nstate_items += s->nitems;
+      closure (s->items, s->nitems);
+      for (size_t j = 0; j < nitemset; ++j)
+        if (0 < itemset[j]
+            && item_number_is_rule_number (ritem[itemset[j] - 1]))
+          {
+            bitset_set (production_items[i], itemset[j]);
+            ++nstate_items;
+          }
+    }
+  state_item_map = xnmalloc (nstates + 1, sizeof (state_item_number));
+  state_items = xnmalloc (nstate_items, sizeof (state_item));
+  state_item_number sidx = 0;
+  for (int i = 0; i < nstates; ++i)
+    {
+      state_item_map[i] = sidx;
+      int rule_search_idx = 0;
+      const state *s = states[i];
+      const reductions *red = s->reductions;
+      for (int j = 0; j < s->nitems; ++j)
+        {
+          state_item_set (sidx, s, s->items[j]);
+          state_item *si = &state_items[sidx];
+          const rule *r = item_rule (si->item);
+          if (rule_search_idx < red->num && red->rules[rule_search_idx] < r)
+            ++rule_search_idx;
+          if (rule_search_idx < red->num && r == red->rules[rule_search_idx])
+            {
+              bitsetv lookahead = red->lookaheads;
+              if (lookahead)
+                si->lookahead = lookahead[rule_search_idx];
+            }
+          ++sidx;
+        }
+      bitset_iterator biter;
+      item_number off;
+      BITSET_FOR_EACH (biter, production_items[i], off, 0)
+        {
+          state_item_set (sidx, s, off);
+          if (item_number_is_rule_number (ritem[off]))
+            {
+              bitsetv lookahead = red->lookaheads;
+              if (lookahead)
+                state_items[sidx].lookahead = lookahead[rule_search_idx];
+              ++rule_search_idx;
+            }
+          ++sidx;
+        }
+
+    }
+  state_item_map[nstates] = nstate_items;
+  bitsetv_free (production_items);
+}
+
+static size_t
+state_sym_hasher (const void *st, size_t max)
+{
+  return ((state *) st)->accessing_symbol % max;
+}
+
+static bool
+state_sym_comparator (const void *s1, const void *s2)
+{
+  return ((state *) s1)->accessing_symbol == ((state *) s2)->accessing_symbol;
+}
+
+static state *
+state_sym_lookup (symbol_number sym, Hash_table *h)
+{
+  state probe;
+  probe.accessing_symbol = sym;
+  return hash_lookup (h, &probe);
+}
+
+static void
+init_trans (void)
+{
+  for (state_number i = 0; i < nstates; ++i)
+    {
+      // Generate a hash set that maps from accepting symbols to the states
+      // this state transitions to.
+      state *s = states[i];
+      transitions *t = s->transitions;
+      Hash_table *transition_set
+        = hash_xinitialize (t->num, NULL, (Hash_hasher) state_sym_hasher,
+                            (Hash_comparator) state_sym_comparator, NULL);
+      for (int j = 0; j < t->num; ++j)
+        if (!TRANSITION_IS_DISABLED (t, j))
+          hash_xinsert (transition_set, t->states[j]);
+      for (state_item_number j = state_item_map[i]; j < state_item_map[i + 1]; ++j)
+        {
+          item_number *item = state_items[j].item;
+          if (item_number_is_rule_number (*item))
+            continue;
+          state *dst = state_sym_lookup (*item, transition_set);
+          if (!dst)
+            continue;
+          // find the item in the destination state that corresponds
+          // to the transition of item
+          for (int k = 0; k < dst->nitems; ++k)
+            if (item + 1 == ritem + dst->items[k])
+              {
+                state_item_number dstSI =
+                  state_item_index_lookup (dst->number, k);
+
+                state_items[j].trans = dstSI;
+                bitset_set (state_items[dstSI].revs, j);
+                break;
+            }
+        }
+      hash_free (transition_set);
+    }
+}
+
+static void
+init_prods (void)
+{
+  for (int i = 0; i < nstates; ++i)
+    {
+      state *s = states[i];
+      // closure_map is a hash map from nonterminals to a set
+      // of the items that produce those nonterminals
+      Hash_table *closure_map = hash_pair_table_create (nsyms - ntokens);
+
+      // Add the nitems of state to skip to the production portion
+      // of that state's state_items
+      for (state_item_number j = state_item_map[i] + s->nitems;
+           j < state_item_map[i + 1]; ++j)
+        {
+          state_item *src = &state_items[j];
+          item_number *item = src->item;
+          symbol_number lhs = item_rule (item)->lhs->number;
+          bitset itms = hash_pair_lookup (closure_map, lhs);
+          if (!itms)
+            {
+              itms = bitset_create (nstate_items, BITSET_SPARSE);
+              hash_pair_insert (closure_map, lhs, itms);
+            }
+          bitset_set (itms, j);
+        }
+      // For each item with a dot followed by a nonterminal,
+      // try to create a production edge.
+      for (state_item_number j = state_item_map[i]; j < state_item_map[i + 1]; ++j)
+        {
+          state_item *src = &state_items[j];
+          item_number item = *(src->item);
+          // Skip reduce items and items with terminals after the dot
+          if (item_number_is_rule_number (item) || ISTOKEN (item))
+            continue;
+          symbol_number sym = item_number_as_symbol_number (item);
+          bitset lb = hash_pair_lookup (closure_map, sym);
+          if (lb)
+            {
+              bitset copy = bitset_create (nstate_items, BITSET_SPARSE);
+              bitset_copy (copy, lb);
+              // update prods.
+              state_items[j].prods = copy;
+
+              // update revs.
+              bitset_iterator biter;
+              state_item_number prod;
+              BITSET_FOR_EACH (biter, copy, prod, 0)
+                bitset_set (state_items[prod].revs, j);
+            }
+        }
+      hash_free (closure_map);
+    }
+}
+
+/* Since lookaheads are only generated for reductions, we need to
+   propagate lookahead sets backwards as the searches require each
+   state_item to have a lookahead. */
+static inline void
+gen_lookaheads (void)
+{
+  for (state_item_number i = 0; i < nstate_items; ++i)
+    {
+      state_item *si = &state_items[i];
+      if (item_number_is_symbol_number (*(si->item)) || !si->lookahead)
+        continue;
+
+      bitset lookahead = si->lookahead;
+      state_item_list queue =
+        gl_list_create (GL_LINKED_LIST, NULL, NULL, NULL, true, 1,
+                        (const void **) &si);
+
+      // For each reduction item, traverse through all state_items
+      // accessible through reverse transition steps, and set their
+      // lookaheads to the reduction items lookahead
+      while (gl_list_size (queue) > 0)
+        {
+          state_item *prev = (state_item *) gl_list_get_at (queue, 0);
+          gl_list_remove_at (queue, 0);
+          prev->lookahead = lookahead;
+          if (SI_TRANSITION (prev))
+            {
+              bitset rsi = state_items[prev - state_items].revs;
+              bitset_iterator biter;
+              state_item_number sin;
+              BITSET_FOR_EACH (biter, rsi, sin, 0)
+                gl_list_add_first (queue, &state_items[sin]);
+            }
+        }
+      gl_list_free (queue);
+    }
+}
+
+bitsetv firsts = NULL;
+
+static void
+init_firsts (void)
+{
+  firsts = bitsetv_create (nnterms, nsyms, BITSET_FIXED);
+  for (rule_number i = 0; i < nrules; ++i)
+    {
+      rule *r = &rules[i];
+      item_number *n = r->rhs;
+      // Iterate through nullable nonterminals to try to find a terminal.
+      while (item_number_is_symbol_number (*n) && ISVAR (*n)
+             && nullable[*n - ntokens])
+        ++n;
+      if (item_number_is_rule_number (*n) || ISVAR (*n))
+        continue;
+
+      symbol_number lhs = r->lhs->number;
+      bitset_set (FIRSTS (lhs), *n);
+    }
+  bool change = true;
+  while (change)
+    {
+      change = false;
+      for (rule_number i = 0; i < nrules; ++i)
+        {
+          rule *r = &rules[i];
+          symbol_number lhs = r->lhs->number;
+          bitset f_lhs = FIRSTS (lhs);
+          for (item_number *n = r->rhs;
+               item_number_is_symbol_number (*n) && ISVAR (*n);
+               ++n)
+            {
+              bitset f = FIRSTS (*n);
+              if (!bitset_subset_p (f_lhs, f))
+                {
+                  change = true;
+                  bitset_union (f_lhs, f_lhs, f);
+                }
+              if (!nullable[*n - ntokens])
+                break;
+            }
+        }
+    }
+}
+
+static inline void
+disable_state_item (state_item *si)
+{
+  si->trans = -2;
+  bitset_free (si->revs);
+  if (si->prods)
+    bitset_free (si->prods);
+}
+
+/* Disable all state_item paths that lead to/from SI and nowhere
+   else.  */
+static void
+prune_state_item (const state_item *si)
+{
+  state_item_list queue =
+    gl_list_create (GL_LINKED_LIST, NULL, NULL, NULL, true, 1,
+                    (const void **) &si);
+
+  while (gl_list_size (queue) > 0)
+    {
+      state_item *dsi = (state_item *) gl_list_get_at (queue, 0);
+      gl_list_remove_at (queue, 0);
+      if (SI_DISABLED (dsi - state_items))
+        continue;
+
+      if (dsi->trans >= 0 && !SI_DISABLED (dsi->trans))
+      {
+        const state_item *trans = &state_items[dsi->trans];
+        bitset_reset (trans->revs, dsi - state_items);
+        if (bitset_empty_p (trans->revs))
+          gl_list_add_last (queue, trans);
+      }
+
+      if (dsi->prods)
+        {
+          bitset_iterator biter;
+          state_item_number sin;
+          BITSET_FOR_EACH (biter, dsi->prods, sin, 0)
+            {
+              if (SI_DISABLED (sin))
+                continue;
+              const state_item *prod = &state_items[sin];
+              bitset_reset (prod->revs, dsi - state_items);
+              if (bitset_empty_p (prod->revs))
+                gl_list_add_last (queue, prod);
+            }
+        }
+
+      bitset_iterator biter;
+      state_item_number sin;
+      BITSET_FOR_EACH (biter, dsi->revs, sin, 0)
+        {
+          if (SI_DISABLED (sin))
+            continue;
+          state_item *rev = &state_items[sin];
+          if (&state_items[rev->trans] == dsi)
+            gl_list_add_last (queue, rev);
+          else if (rev->prods)
+            {
+              bitset_reset (rev->prods, dsi - state_items);
+              if (bitset_empty_p (rev->prods))
+                gl_list_add_last (queue, rev);
+            }
+          else
+            gl_list_add_last (queue, rev);
+        }
+      disable_state_item (dsi);
+    }
+  gl_list_free (queue);
+}
+
+/* To make searches more efficient, prune away paths that are caused
+   by disabled transitions.  */
+static void
+prune_disabled_paths (void)
+{
+  for (int i = nstate_items - 1; i >= 0; --i)
+    {
+      state_item *si = &state_items[i];
+      if (si->trans == -1 && item_number_is_symbol_number (*si->item))
+        prune_state_item (si);
+    }
+}
+
+void
+state_item_print (const state_item *si, FILE *out, const char *prefix)
+{
+  fputs (prefix, out);
+  item_print (si->item, NULL, out);
+  putc ('\n', out);
+}
+
+const rule*
+state_item_rule (const state_item *si)
+{
+  return item_rule (si->item);
+}
+
+/**
+ * Report the state_item graph
+ */
+static void
+state_items_report (FILE *out)
+{
+  fprintf (out, "# state items: %zu\n", nstate_items);
+  for (state_number i = 0; i < nstates; ++i)
+    {
+      fprintf (out, "State %d:\n", i);
+      for (state_item_number j = state_item_map[i]; j < state_item_map[i + 1]; ++j)
+        {
+          const state_item *si = &state_items[j];
+          item_print (si->item, NULL, out);
+          if (SI_DISABLED (j))
+            fputs ("  DISABLED\n", out);
+          else
+            {
+              putc ('\n', out);
+              if (si->trans >= 0)
+                {
+                  fputs ("    -> ", out);
+                  state_item_print (&state_items[si->trans], out, "");
+                }
+
+              bitset sets[2] = { si->prods, si->revs };
+              const char *txt[2] = { "    => ", "    <- " };
+              for (int seti = 0; seti < 2; ++seti)
+                {
+                  bitset b = sets[seti];
+                  if (b)
+                    {
+                      bitset_iterator biter;
+                      state_item_number sin;
+                      BITSET_FOR_EACH (biter, b, sin, 0)
+                        {
+                          fputs (txt[seti], out);
+                          state_item_print (&state_items[sin], out, "");
+                        }
+                    }
+                }
+            }
+          putc ('\n', out);
+        }
+    }
+  fprintf (out, "FIRSTS\n");
+  for (symbol_number i = ntokens; i < nsyms; ++i)
+    {
+      fprintf (out, "  %s firsts\n", symbols[i]->tag);
+      bitset_iterator iter;
+      symbol_number j;
+      BITSET_FOR_EACH (iter, FIRSTS (i), j, 0)
+        fprintf (out, "    %s\n", symbols[j]->tag);
+    }
+  fputs ("\n\n", out);
+}
+
+void
+state_items_init (void)
+{
+  time_t start = time (NULL);
+  init_state_items ();
+  init_trans ();
+  init_prods ();
+  gen_lookaheads ();
+  init_firsts ();
+  prune_disabled_paths ();
+  if (trace_flag & trace_cex)
+    {
+      fprintf (stderr, "init: %f\n", difftime (time (NULL), start));
+      state_items_report (stderr);
+    }
+}
+
+void
+state_items_free (void)
+{
+  for (state_item_number i = 0; i < nstate_items; ++i)
+    if (!SI_DISABLED (i))
+      {
+        state_item *si = &state_items[i];
+        if (si->prods)
+          bitset_free (si->prods);
+        bitset_free (si->revs);
+      }
+  free (state_items);
+  bitsetv_free (firsts);
+}
+
+/**
+ * Determine, using precedence and associativity, whether the next
+ * production is allowed from the current production.
+ */
+bool
+production_allowed (const state_item *si, const state_item *next)
+{
+  sym_content *s1 = item_rule (si->item)->lhs;
+  sym_content *s2 = item_rule (next->item)->lhs;
+  int prec1 = s1->prec;
+  int prec2 = s2->prec;
+  if (prec1 >= 0 && prec2 >= 0)
+    {
+      // Do not expand if lower precedence.
+      if (prec1 > prec2)
+        return false;
+      // Do not expand if same precedence, but left-associative.
+      if (prec1 == prec2 && s1->assoc == left_assoc)
+        return false;
+    }
+  return true;
+}
diff --git a/src/state-item.h b/src/state-item.h
new file mode 100644
index 0000000..4aa061e
--- /dev/null
+++ b/src/state-item.h
@@ -0,0 +1,114 @@
+/* Counterexample Generation Search Nodes
+
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef STATE_ITEM_H
+# define STATE_ITEM_H
+
+# include <bitsetv.h>
+# include <gl_list.h>
+# include <hash.h>
+
+# include "gram.h"
+# include "state.h"
+
+/* Initializes a graph connecting (state, production item) pairs to
+   pairs they can make a transition or production step to.  This graph
+   is used to search for paths that represent counterexamples of some
+   conflict.
+
+   state_items is an array of state state-item pairs ordered by state.
+   state_item_map maps state numbers to the first item which
+   corresponds to it in the array.  A state's portion in state_items
+   begins with its items in the same order as it was in the state.
+   This is then followed by productions from the closure of the state
+   in order by rule.
+
+   There are two type of edges in this graph transitions and
+   productions.  Transitions are the same as transitions from the
+   parser except edges are only between items from the same
+   rule.
+
+   Productions are edges from items with a nonterminal after the dot to
+   the production of that nonterminal in the same state. These edges are
+   stored as a bitset in a state-item.
+
+   The inverses of these edges are stored in a bitset in the state-item,
+   "revs."  A state-item that begins with a dot will have reverse
+   production edges, and all others will have reverse transition
+   edges. */
+
+# define SI_DISABLED(Sin) (state_items[Sin].trans == -2)
+# define SI_PRODUCTION(Si) ((Si) == state_items || *((Si)->item - 1) < 0)
+# define SI_TRANSITION(Si) ((Si) != state_items && *((Si)->item - 1) >= 0)
+
+typedef int state_item_number;
+
+typedef struct
+{
+  const state *state;
+  item_number *item;
+  state_item_number trans;
+  bitset prods;
+  bitset revs;
+  bitset lookahead;
+} state_item;
+
+// A path of state-items.
+typedef gl_list_t state_item_list;
+
+extern bitsetv firsts;
+# define FIRSTS(sym) firsts[(sym) - ntokens]
+
+extern size_t nstate_items;
+extern state_item_number *state_item_map;
+
+/** Array mapping state_item_numbers to state_items */
+extern state_item *state_items;
+
+state_item *state_item_lookup (state_number s, state_item_number off);
+
+static inline state_item_number
+state_item_index_lookup (state_number s, state_item_number off)
+{
+  return state_item_map[s] + off;
+}
+
+void state_items_init (void);
+void state_items_free (void);
+
+void state_item_print (const state_item *si, FILE *out, const char *prefix);
+const rule *state_item_rule (const state_item *si);
+
+bool production_allowed (const state_item *si, const state_item *next);
+
+// Iterating on a state_item_list.
+static inline bool
+state_item_list_next (gl_list_iterator_t *it, state_item **si)
+{
+  const void *p = NULL;
+  bool res = gl_list_iterator_next (it, &p, NULL);
+  if (res)
+    *si = (state_item *) p;
+  else
+    gl_list_iterator_free (it);
+  return res;
+}
+
+
+#endif /* STATE_ITEM_H */
diff --git a/src/state.c b/src/state.c
index 418f3fa..79ab43b 100644
--- a/src/state.c
+++ b/src/state.c
@@ -1,6 +1,6 @@
 /* Type definitions for the finite state machine for Bison.
 
-   Copyright (C) 2001-2007, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2001-2007, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "state.h"
@@ -101,7 +101,7 @@
   size_t rules_size = num * sizeof *reds;
   reductions *res = xmalloc (offsetof (reductions, rules) + rules_size);
   res->num = num;
-  res->lookahead_tokens = NULL;
+  res->lookaheads = NULL;
   memcpy (res->rules, reds, rules_size);
   return res;
 }
@@ -126,7 +126,7 @@
 
 state *
 state_new (symbol_number accessing_symbol,
-           size_t nitems, item_number *core)
+           size_t nitems, item_index *core)
 {
   aver (nstates < STATE_NUMBER_MAXIMUM);
 
@@ -231,7 +231,7 @@
 
 
 int
-state_reduction_find (state *s, rule const *r)
+state_reduction_find (state const *s, rule const *r)
 {
   reductions *reds = s->reductions;
   for (int i = 0; i < reds->num; ++i)
@@ -260,20 +260,20 @@
 `--------------------------------------------------*/
 
 void
-state_rule_lookahead_tokens_print (state *s, rule const *r, FILE *out)
+state_rule_lookaheads_print (state const *s, rule const *r, FILE *out)
 {
   /* Find the reduction we are handling.  */
   reductions *reds = s->reductions;
   int red = state_reduction_find (s, r);
 
   /* Print them if there are.  */
-  if (reds->lookahead_tokens && red != -1)
+  if (reds->lookaheads && red != -1)
     {
       bitset_iterator biter;
       int k;
       char const *sep = "";
       fprintf (out, "  [");
-      BITSET_FOR_EACH (biter, reds->lookahead_tokens[red], k, 0)
+      BITSET_FOR_EACH (biter, reds->lookaheads[red], k, 0)
         {
           fprintf (out, "%s%s", sep, symbols[k]->tag);
           sep = ", ";
@@ -283,7 +283,7 @@
 }
 
 void
-state_rule_lookahead_tokens_print_xml (state *s, rule const *r,
+state_rule_lookaheads_print_xml (state const *s, rule const *r,
                                        FILE *out, int level)
 {
   /* Find the reduction we are handling.  */
@@ -291,12 +291,12 @@
   int red = state_reduction_find (s, r);
 
   /* Print them if there are.  */
-  if (reds->lookahead_tokens && red != -1)
+  if (reds->lookaheads && red != -1)
     {
       bitset_iterator biter;
       int k;
       xml_puts (out, level, "<lookaheads>");
-      BITSET_FOR_EACH (biter, reds->lookahead_tokens[red], k, 0)
+      BITSET_FOR_EACH (biter, reds->lookaheads[red], k, 0)
         {
           xml_printf (out, level + 1, "<symbol>%s</symbol>",
                       xml_escape (symbols[k]->tag));
@@ -385,8 +385,7 @@
 void
 state_hash_insert (state *s)
 {
-  if (!hash_insert (state_table, s))
-    xalloc_die ();
+  hash_xinsert (state_table, s);
 }
 
 
@@ -396,7 +395,7 @@
 `------------------------------------------------------------------*/
 
 state *
-state_hash_lookup (size_t nitems, item_number *core)
+state_hash_lookup (size_t nitems, const item_index *core)
 {
   size_t items_size = nitems * sizeof *core;
   state *probe = xmalloc (offsetof (state, items) + items_size);
diff --git a/src/state.h b/src/state.h
index 031d959..72a5e7b 100644
--- a/src/state.h
+++ b/src/state.h
@@ -1,6 +1,6 @@
 /* Type definitions for the finite state machine for Bison.
 
-   Copyright (C) 1984, 1989, 2000-2004, 2007, 2009-2015, 2018-2019 Free
+   Copyright (C) 1984, 1989, 2000-2004, 2007, 2009-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 
 /* These type definitions are used to represent a nondeterministic
@@ -62,12 +62,15 @@
 
    Each reductions structure describes the possible reductions at the
    state whose number is in the number field.  rules is an array of
-   num rules.  lookahead_tokens is an array of bitsets, one per rule.
+   num rules.  lookaheads is an array of bitsets, one per rule.
 
    Conflict resolution can decide that certain tokens in certain
    states should explicitly be errors (for implementing %nonassoc).
    For each state, the tokens that are errors for this reason are
-   recorded in an errs structure, which holds the token numbers.
+   recorded in an errs structure.  The generated parser does not
+   depend on this errs structure, it is used only in the reports
+   (*.output, etc.) to describe conflicted actions that have been
+   discarded.
 
    There is at least one goto transition present in state zero.  It
    leads to a next-to-final state whose accessing_symbol is the
@@ -184,7 +187,7 @@
 typedef struct
 {
   int num;
-  bitset *lookahead_tokens;
+  bitset *lookaheads;
   /* Sorted ascendingly on rule number.  */
   rule *rules[1];
 } reductions;
@@ -222,7 +225,7 @@
   /* Its items.  Must be last, since ITEMS can be arbitrarily large.  Sorted
      ascendingly on item index in RITEM, which is sorted on rule number.  */
   size_t nitems;
-  item_number items[1];
+  item_index items[1];
 };
 
 extern state_number nstates;
@@ -230,7 +233,9 @@
 
 /* Create a new state with ACCESSING_SYMBOL for those items.  */
 state *state_new (symbol_number accessing_symbol,
-                  size_t core_size, item_number *core);
+                  size_t core_size, item_index *core);
+/* Create a new state with the same kernel as S (same accessing
+   symbol, transitions, reductions, consistency and items).  */
 state *state_new_isocore (state const *s);
 
 /* Record that from S we can reach all the DST states (NUM of them).  */
@@ -244,16 +249,16 @@
 
 /* The index of the reduction of state S that corresponds to rule R.
    Aborts if there is no reduction of R in S.  */
-int state_reduction_find (state *s, rule const *r);
+int state_reduction_find (state const *s, rule const *r);
 
 /* Set the errs of STATE.  */
 void state_errs_set (state *s, int num, symbol **errors);
 
 /* Print on OUT all the lookahead tokens such that this STATE wants to
    reduce R.  */
-void state_rule_lookahead_tokens_print (state *s, rule const *r, FILE *out);
-void state_rule_lookahead_tokens_print_xml (state *s, rule const *r,
-                                            FILE *out, int level);
+void state_rule_lookaheads_print (state const *s, rule const *r, FILE *out);
+void state_rule_lookaheads_print_xml (state const *s, rule const *r,
+                                      FILE *out, int level);
 
 /* Create/destroy the states hash table.  */
 void state_hash_new (void);
@@ -261,7 +266,7 @@
 
 /* Find the state associated to the CORE, and return it.  If it does
    not exist yet, return NULL.  */
-state *state_hash_lookup (size_t core_size, item_number *core);
+state *state_hash_lookup (size_t core_size, const item_index *core);
 
 /* Insert STATE in the state hash table.  */
 void state_hash_insert (state *s);
diff --git a/src/strversion.c b/src/strversion.c
new file mode 100644
index 0000000..4100cde
--- /dev/null
+++ b/src/strversion.c
@@ -0,0 +1,67 @@
+/* Convert version string to int.
+
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+#include "system.h"
+
+#include "strversion.h"
+
+#include <errno.h>
+#include <intprops.h>
+
+int
+strversion_to_int (char const *version)
+{
+  IGNORE_TYPE_LIMITS_BEGIN
+  int res = 0;
+  errno = 0;
+  char *cp = NULL;
+
+  {
+    long major = strtol (version, &cp, 10);
+    if (errno || cp == version || *cp != '.' || major < 0
+        || INT_MULTIPLY_WRAPV (major, 10000, &res))
+      return -1;
+  }
+
+  {
+    ++cp;
+    char *prev = cp;
+    long minor = strtol (cp, &cp, 10);
+    if (errno || cp == prev || (*cp != '\0' && *cp != '.')
+        || ! (0 <= minor && minor < 100)
+        || INT_MULTIPLY_WRAPV (minor, 100, &minor)
+        || INT_ADD_WRAPV (minor, res, &res))
+      return -1;
+  }
+
+  if (*cp == '.')
+    {
+      ++cp;
+      char *prev = cp;
+      long micro = strtol (cp, &cp, 10);
+      if (errno || cp == prev || (*cp != '\0' && *cp != '.')
+          || ! (0 <= micro && micro < 100)
+          || INT_ADD_WRAPV (micro, res, &res))
+        return -1;
+    }
+
+  IGNORE_TYPE_LIMITS_END
+  return res;
+}
diff --git a/src/strversion.h b/src/strversion.h
new file mode 100644
index 0000000..80b39e3
--- /dev/null
+++ b/src/strversion.h
@@ -0,0 +1,28 @@
+/* Convert version string to int.
+
+   Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef STRVERSION_H_
+# define STRVERSION_H_
+
+/* Convert VERSION into an int (MAJOR * 10000 + MINOR * 100 + MICRO).
+   E.g., "3.7.4" => 30704, "3.8" => 30800.
+   Return -1 on errors. */
+int strversion_to_int (char const *version);
+
+#endif
diff --git a/src/symlist.c b/src/symlist.c
index 12751c8..0272469 100644
--- a/src/symlist.c
+++ b/src/symlist.c
@@ -1,6 +1,6 @@
 /* Lists of symbols for Bison
 
-   Copyright (C) 2002, 2005-2007, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2002, 2005-2007, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
@@ -83,36 +83,47 @@
 
 
 symbol_list *
-symbol_list_type_set (symbol_list *syms, uniqstr type_name, location loc)
+symbol_list_type_set (symbol_list *syms, uniqstr type_name)
 {
   for (symbol_list *l = syms; l; l = l->next)
-    symbol_type_set (l->content.sym, type_name, loc);
+    symbol_type_set (l->content.sym, type_name, l->sym_loc);
   return syms;
 }
 
 
+symbol_list *
+symbol_list_find_symbol (symbol_list *l, const symbol *sym)
+{
+  for (/* Nothing. */; l && l->content.sym; l = l->next)
+    if (l->content.sym == sym)
+      return l;
+  return NULL;
+}
+
+
 /*-----------------------------------------------------------------------.
 | Print this list, for which every content_type must be SYMLIST_SYMBOL.  |
 `-----------------------------------------------------------------------*/
 
 void
-symbol_list_syms_print (const symbol_list *l, FILE *f)
+symbol_list_syms_print (const symbol_list *l, FILE *out)
 {
-  fputc ('[', f);
+  fputc ('[', out);
   char const *sep = "";
   for (/* Nothing. */; l && l->content.sym; l = l->next)
     {
-      fputs (sep, f);
-      fputs (l->content_type == SYMLIST_SYMBOL ? "symbol: "
-             : l->content_type == SYMLIST_TYPE ? "type: "
-             : "invalid content_type: ",
-             f);
+      fputs (sep, out);
+      fputs (l->content_type == SYMLIST_SYMBOL ? "symbol{"
+             : l->content_type == SYMLIST_TYPE ? "type{"
+             : "invalid content_type{",
+             out);
       if (l->content_type == SYMLIST_SYMBOL)
-        symbol_print (l->content.sym, f);
-      fputs (l->action_props.is_value_used ? " (used)" : " (unused)", f);
+        symbol_print (l->content.sym, out);
+      fputs (l->action_props.is_value_used ? " (used)" : " (unused)", out);
+      putc ('}', out);
       sep = ", ";
     }
-  fputc (']', f);
+  fputc (']', out);
 }
 
 
@@ -128,23 +139,29 @@
 }
 
 
-/*-------------------------.
-| Append NODE to the LIST. |
-`-------------------------*/
+symbol_list *
+symbol_list_last (symbol_list *list)
+{
+  if (!list)
+    return NULL;
+  symbol_list *next = list;
+  while (next->next)
+    next = next->next;
+  return next;
+}
 
 symbol_list *
 symbol_list_append (symbol_list *list, symbol_list *node)
 {
-  if (!list)
-    return node;
-  symbol_list *next = list;
-  while (next->next)
-    next = next->next;
-  next->next = node;
+  if (list)
+    symbol_list_last (list)->next = node;
+  else
+    list = node;
   return list;
 }
 
 
+
 /*-----------------------------------------------.
 | Free the LIST, but not the items it contains.  |
 `-----------------------------------------------*/
diff --git a/src/symlist.h b/src/symlist.h
index a7225e1..1577993 100644
--- a/src/symlist.h
+++ b/src/symlist.h
@@ -1,6 +1,6 @@
 /* Lists of symbols for Bison
 
-   Copyright (C) 2002, 2005-2007, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2002, 2005-2007, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef SYMLIST_H_
 # define SYMLIST_H_
@@ -110,8 +110,10 @@
 
 /** Assign the type \c type_name to all the members of \c syms.
  ** \returns \c syms */
-symbol_list *symbol_list_type_set (symbol_list *syms,
-                                   uniqstr type_name, location loc);
+symbol_list *symbol_list_type_set (symbol_list *syms, uniqstr type_name);
+
+/** Find a symbol with the same content as \c sym within \c syms.  */
+symbol_list *symbol_list_find_symbol (symbol_list *syms, const symbol *sym);
 
 /** Print this list.
 
@@ -122,6 +124,9 @@
 /** Prepend \c node to \c list.  */
 symbol_list *symbol_list_prepend (symbol_list *list, symbol_list *node);
 
+/** The last node of this list. */
+symbol_list *symbol_list_last (symbol_list *list);
+
 /** Append \c node to \c list.  */
 symbol_list *symbol_list_append (symbol_list *list, symbol_list *node);
 
@@ -137,11 +142,11 @@
  **/
 symbol_list *symbol_list_n_get (symbol_list *l, int n);
 
-/* Get the data type (alternative in the union) of the value for
-   symbol N in rule RULE.  */
+/** Get the data type (alternative in the union) of the value for
+    symbol N in rule RULE.  */
 uniqstr symbol_list_n_type_name_get (symbol_list *l, int n);
 
-/* Check whether the node is a border element of a rule. */
+/** Check whether the node is a border element of a rule. */
 bool symbol_list_null (symbol_list *node);
 
 /** Set the \c \%destructor or \c \%printer for \c node as \c cprops.  */
diff --git a/src/symtab.c b/src/symtab.c
index 589da0a..8aea627 100644
--- a/src/symtab.c
+++ b/src/symtab.c
@@ -1,6 +1,6 @@
 /* Symbol table manager for Bison.
 
-   Copyright (C) 1984, 1989, 2000-2002, 2004-2015, 2018-2019 Free
+   Copyright (C) 1984, 1989, 2000-2002, 2004-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "symtab.h"
@@ -33,6 +33,13 @@
 #include "gram.h"
 #include "intprops.h"
 
+/** Undefined token code.  */
+#define CODE_UNDEFINED (-1)
+
+/* Undefined symbol number.  */
+#define NUMBER_UNDEFINED (-1)
+
+
 static struct hash_table *symbol_table = NULL;
 static struct hash_table *semantic_type_table = NULL;
 
@@ -51,10 +58,8 @@
 
 symbol *errtoken = NULL;
 symbol *undeftoken = NULL;
-symbol *endtoken = NULL;
-symbol *accept = NULL;
-symbol *startsymbol = NULL;
-location startsymbol_loc;
+symbol *eoftoken = NULL;
+symbol *acceptsymbol = NULL;
 
 /* Precedence relation graph. */
 static symgraph **prec_nodes;
@@ -65,6 +70,20 @@
 bool tag_seen = false;
 
 
+/* Whether SYM was defined by the user.  */
+
+static bool
+symbol_is_user_defined (symbol *sym)
+{
+  const bool eof_is_user_defined
+    = !eoftoken->alias || STRNEQ (eoftoken->alias->tag, "$end");
+  return sym->tag[0] != '$'
+    && (eof_is_user_defined || (sym != eoftoken && sym->alias != errtoken))
+    && sym != errtoken && sym->alias != errtoken
+    && sym != undeftoken && sym->alias != undeftoken;
+}
+
+
 /*--------------------------.
 | Create a new sym_content. |
 `--------------------------*/
@@ -77,13 +96,15 @@
   res->symbol = s;
 
   res->type_name = NULL;
+  res->type_loc = empty_loc;
   for (int i = 0; i < CODE_PROPS_SIZE; ++i)
     code_props_none_init (&res->props[i]);
 
   res->number = NUMBER_UNDEFINED;
+  res->prec_loc = empty_loc;
   res->prec = 0;
   res->assoc = undef_assoc;
-  res->user_token_number = USER_NUMBER_UNDEFINED;
+  res->code = CODE_UNDEFINED;
 
   res->class = unknown_sym;
   res->status = undeclared;
@@ -109,15 +130,11 @@
 
   res->tag = tag;
   res->location = loc;
+  res->translatable = false;
   res->location_of_lhs = false;
   res->alias = NULL;
   res->content = sym_content_new (res);
   res->is_alias = false;
-
-  if (nsyms == SYMBOL_NUMBER_MAXIMUM)
-    complain (NULL, fatal, _("too many symbols in input grammar (limit is %d)"),
-              SYMBOL_NUMBER_MAXIMUM);
-  nsyms++;
   return res;
 }
 
@@ -149,20 +166,20 @@
 /* If needed, swap first and second so that first has the earliest
    location (according to location_cmp).
 
-   Many symbol features (e.g., user token numbers) are not assigned
-   during the parsing, but in a second step, via a traversal of the
-   symbol table sorted on tag.
+   Many symbol features (e.g., token codes) are not assigned during
+   parsing, but in a second step, via a traversal of the symbol table
+   sorted on tag.
 
    However, error messages make more sense if we keep the first
    declaration first.
 */
 
 static void
-symbols_sort (symbol **first, symbol **second)
+symbols_sort (const symbol **first, const symbol **second)
 {
   if (0 < location_cmp ((*first)->location, (*second)->location))
     {
-      symbol* tmp = *first;
+      const symbol* tmp = *first;
       *first = *second;
       *second = tmp;
     }
@@ -219,7 +236,11 @@
 | Print a symbol.  |
 `-----------------*/
 
-#define SYMBOL_ATTR_PRINT(Attr)                         \
+#define SYMBOL_INT_ATTR_PRINT(Attr)                     \
+  if (s->content)                                       \
+    fprintf (f, " %s = %d", #Attr, s->content->Attr)
+
+#define SYMBOL_STR_ATTR_PRINT(Attr)                     \
   if (s->content && s->content->Attr)                   \
     fprintf (f, " %s { %s }", #Attr, s->content->Attr)
 
@@ -240,7 +261,11 @@
                : c == nterm_sym    ? "nterm"
                : NULL, /* abort.  */
                s->tag);
-      SYMBOL_ATTR_PRINT (type_name);
+      putc (' ', f);
+      location_print (s->location, f);
+      SYMBOL_INT_ATTR_PRINT (code);
+      SYMBOL_INT_ATTR_PRINT (number);
+      SYMBOL_STR_ATTR_PRINT (type_name);
       SYMBOL_CODE_PRINT (destructor);
       SYMBOL_CODE_PRINT (printer);
     }
@@ -276,12 +301,18 @@
 /*-----------------------------------------------.
 | Get the identifier associated to this symbol.  |
 `-----------------------------------------------*/
+
 uniqstr
 symbol_id_get (symbol const *sym)
 {
-  if (sym->alias)
-    sym = sym->alias;
-  return is_identifier (sym->tag) ? sym->tag : 0;
+  // There's one weird case: YYerror is the alias, and error is the
+  // base symbol.  Return YYerror in that case.
+  if (sym->alias && is_identifier (sym->alias->tag))
+    return sym->alias->tag;
+  else if (is_identifier (sym->tag))
+    return sym->tag;
+  else
+    return NULL;
 }
 
 
@@ -294,42 +325,29 @@
 complain_symbol_redeclared (symbol *s, const char *what, location first,
                             location second)
 {
-  int i = 0;
   locations_sort (&first, &second);
-  complain_indent (&second, complaint, &i,
-                   _("%s redeclaration for %s"), what, s->tag);
-  i += SUB_INDENT;
-  complain_indent (&first, complaint, &i,
-                   _("previous declaration"));
+  complain (&second, complaint, _("%s redeclaration for %s"), what, s->tag);
+  subcomplain (&first, complaint, _("previous declaration"));
 }
 
 static void
 complain_semantic_type_redeclared (semantic_type *s, const char *what, location first,
                                    location second)
 {
-  int i = 0;
   locations_sort (&first, &second);
-  complain_indent (&second, complaint, &i,
-                   _("%s redeclaration for <%s>"), what, s->tag);
-  i += SUB_INDENT;
-  complain_indent (&first, complaint, &i,
-                   _("previous declaration"));
+  complain (&second, complaint, _("%s redeclaration for <%s>"), what, s->tag);
+  subcomplain (&first, complaint, _("previous declaration"));
 }
 
 static void
 complain_class_redeclared (symbol *sym, symbol_class class, location second)
 {
-  int i = 0;
-  complain_indent (&second, complaint, &i,
-                   class == token_sym
-                   ? _("symbol %s redeclared as a token")
-                   : _("symbol %s redeclared as a nonterminal"), sym->tag);
+  complain (&second, complaint,
+            class == token_sym
+            ? _("symbol %s redeclared as a token")
+            : _("symbol %s redeclared as a nonterminal"), sym->tag);
   if (!location_empty (sym->location))
-    {
-      i += SUB_INDENT;
-      complain_indent (&sym->location, complaint, &i,
-                       _("previous definition"));
-    }
+    subcomplain (&sym->location, complaint, _("previous definition"));
 }
 
 static const symbol *
@@ -359,7 +377,7 @@
 }
 
 static void
-complain_symbol_undeclared (symbol *sym)
+complain_symbol_undeclared (const symbol *sym)
 {
   assert (sym->content->status != declared);
   const symbol *best = symbol_from_uniqstr_fuzzy (sym->tag);
@@ -386,7 +404,10 @@
 symbol_location_as_lhs_set (symbol *sym, location loc)
 {
   if (!sym->location_of_lhs)
-    sym->location = loc;
+    {
+      sym->location = loc;
+      sym->location_of_lhs = true;
+    }
 }
 
 
@@ -429,6 +450,7 @@
     sym->content->props[kind] = *code;
 }
 
+
 /*-----------------------------------------------------.
 | Set the DESTRUCTOR or PRINTER associated with TYPE.  |
 `-----------------------------------------------------*/
@@ -467,7 +489,7 @@
     }
 
   /* Apply default code props's only to user-defined symbols.  */
-  if (sym->tag[0] != '$' && sym != errtoken)
+  if (symbol_is_user_defined (sym))
     {
       code_props *code = &semantic_type_get (sym->content->type_name ? "*" : "",
                                              NULL)->props[kind];
@@ -535,60 +557,53 @@
       if (class == token_sym && s->class == pct_type_sym)
         complain_pct_type_on_token (&sym->location);
 
-      if (class == nterm_sym && s->class != nterm_sym)
-        s->number = nvars++;
-      else if (class == token_sym && s->number == NUMBER_UNDEFINED)
-        s->number = ntokens++;
       s->class = class;
 
       if (declaring)
         {
           if (s->status == declared)
             {
-              int i = 0;
-              complain_indent (&loc, Wother, &i,
-                               _("symbol %s redeclared"), sym->tag);
-              i += SUB_INDENT;
-              complain_indent (&sym->location, Wother, &i,
-                               _("previous declaration"));
+              complain (&loc, Wother,
+                        _("symbol %s redeclared"), sym->tag);
+              subcomplain (&sym->location, Wother,
+                           _("previous declaration"));
             }
           else
-            s->status = declared;
+            {
+              sym->location = loc;
+              s->status = declared;
+            }
         }
     }
 }
 
 
-/*------------------------------------------------.
-| Set the USER_TOKEN_NUMBER associated with SYM.  |
-`------------------------------------------------*/
+/*----------------------------.
+| Set the token code of SYM.  |
+`----------------------------*/
 
 void
-symbol_user_token_number_set (symbol *sym, int user_token_number, location loc)
+symbol_code_set (symbol *sym, int code, location loc)
 {
-  int *user_token_numberp = &sym->content->user_token_number;
+  int *codep = &sym->content->code;
   if (sym->content->class != token_sym)
     complain (&loc, complaint,
-              _("nonterminals cannot be given an explicit number"));
-  else if (*user_token_numberp != USER_NUMBER_UNDEFINED
-           && *user_token_numberp != user_token_number)
-    complain (&loc, complaint, _("redefining user token number of %s"),
+              _("nonterminals cannot be given a token code"));
+  else if (*codep != CODE_UNDEFINED
+           && *codep != code)
+    complain (&loc, complaint, _("redefining code of token %s"),
               sym->tag);
-  else if (user_token_number == INT_MAX)
-    complain (&loc, complaint, _("user token number of %s too large"),
+  else if (code == INT_MAX)
+    complain (&loc, complaint, _("code of token %s too large"),
               sym->tag);
   else
     {
-      *user_token_numberp = user_token_number;
+      *codep = code;
       /* User defined $end token? */
-      if (user_token_number == 0 && !endtoken)
+      if (code == 0 && !eoftoken)
         {
-          endtoken = sym->content->symbol;
-          /* It is always mapped to 0, so it was already counted in
-             NTOKENS.  */
-          if (endtoken->content->number != NUMBER_UNDEFINED)
-            --ntokens;
-          endtoken->content->number = 0;
+          eoftoken = sym->content->symbol;
+          eoftoken->content->number = 0;
         }
     }
 }
@@ -607,9 +622,11 @@
     {
       complain_symbol_undeclared (sym);
       s->class = nterm_sym;
-      s->number = nvars++;
     }
 
+  if (s->number == NUMBER_UNDEFINED)
+    s->number = s->class == token_sym ? ntokens++ : nnterms++;
+
   if (s->class == token_sym
       && sym->tag[0] == '"'
       && !sym->is_alias)
@@ -718,49 +735,45 @@
 `-------------------------------------------------------------------*/
 
 static void
-symbol_pack (symbol *this)
+symbol_pack (symbol *sym)
 {
-  aver (this->content->number != NUMBER_UNDEFINED);
-  if (this->content->class == nterm_sym)
-    this->content->number += ntokens;
+  aver (sym->content->number != NUMBER_UNDEFINED);
+  if (sym->content->class == nterm_sym)
+    sym->content->number += ntokens;
 
-  symbols[this->content->number] = this->content->symbol;
+  symbols[sym->content->number] = sym->content->symbol;
 }
 
 static void
-complain_user_token_number_redeclared (int num, symbol *first, symbol *second)
+complain_code_redeclared (int num, const symbol *first, const symbol *second)
 {
-  int i = 0;
   symbols_sort (&first, &second);
-  complain_indent (&second->location, complaint, &i,
-                   _("user token number %d redeclaration for %s"),
-                   num, second->tag);
-  i += SUB_INDENT;
-  complain_indent (&first->location, complaint, &i,
-                   _("previous declaration for %s"),
-                   first->tag);
+  complain (&second->location, complaint,
+            _("code %d reassigned to token %s"),
+            num, second->tag);
+  subcomplain (&first->location, complaint,
+               _("previous declaration for %s"),
+               first->tag);
 }
 
-/*--------------------------------------------------.
-| Put THIS in TOKEN_TRANSLATIONS if it is a token.  |
-`--------------------------------------------------*/
+/*-------------------------------------------------.
+| Put SYM in TOKEN_TRANSLATIONS if it is a token.  |
+`-------------------------------------------------*/
 
 static void
-symbol_translation (symbol *this)
+symbol_translation (const symbol *sym)
 {
-  /* Nonterminal? */
-  if (this->content->class == token_sym
-      && !this->is_alias)
+  if (sym->content->class == token_sym && !sym->is_alias)
     {
-      /* A token which translation has already been set?*/
-      if (token_translations[this->content->user_token_number]
+      /* A token whose translation has already been set? */
+      if (token_translations[sym->content->code]
           != undeftoken->content->number)
-        complain_user_token_number_redeclared
-          (this->content->user_token_number,
-           symbols[token_translations[this->content->user_token_number]], this);
+        complain_code_redeclared
+          (sym->content->code,
+           symbols[token_translations[sym->content->code]], sym);
       else
-        token_translations[this->content->user_token_number]
-          = this->content->number;
+        token_translations[sym->content->code]
+          = sym->content->number;
     }
 }
 
@@ -837,21 +850,31 @@
                                    hash_symbol_comparator,
                                    symbol_free);
 
-  /* Construct the accept symbol. */
-  accept = symbol_get ("$accept", empty_loc);
-  accept->content->class = nterm_sym;
-  accept->content->number = nvars++;
+  /* Construct the acceptsymbol symbol. */
+  acceptsymbol = symbol_get ("$accept", empty_loc);
+  acceptsymbol->content->class = nterm_sym;
+  acceptsymbol->content->number = nnterms++;
 
-  /* Construct the error token */
-  errtoken = symbol_get ("error", empty_loc);
+  /* Construct the YYerror/"error" token */
+  errtoken = symbol_get ("YYerror", empty_loc);
   errtoken->content->class = token_sym;
   errtoken->content->number = ntokens++;
+  {
+    symbol *alias = symbol_get ("error", empty_loc);
+    symbol_class_set (alias, token_sym, empty_loc, false);
+    symbol_make_alias (errtoken, alias, empty_loc);
+  }
 
-  /* Construct a token that represents all undefined literal tokens.
-     It is always token number 2.  */
-  undeftoken = symbol_get ("$undefined", empty_loc);
+  /* Construct the YYUNDEF/"$undefined" token that represents all
+     undefined literal tokens.  It is always symbol number 2.  */
+  undeftoken = symbol_get ("YYUNDEF", empty_loc);
   undeftoken->content->class = token_sym;
   undeftoken->content->number = ntokens++;
+  {
+    symbol *alias = symbol_get ("$undefined", empty_loc);
+    symbol_class_set (alias, token_sym, empty_loc, false);
+    symbol_make_alias (undeftoken, alias, empty_loc);
+  }
 
   semantic_type_table = hash_xinitialize (HT_INITIAL_CAPACITY,
                                           NULL,
@@ -872,17 +895,16 @@
   symbol probe;
 
   probe.tag = key;
-  symbol *entry = hash_lookup (symbol_table, &probe);
+  symbol *res = hash_lookup (symbol_table, &probe);
 
-  if (!entry)
+  if (!res)
     {
       /* First insertion in the hash. */
       aver (!symbols_sorted);
-      entry = symbol_new (key, loc);
-      if (!hash_insert (symbol_table, entry))
-        xalloc_die ();
+      res = symbol_new (key, loc);
+      hash_xinsert (symbol_table, res);
     }
-  return entry;
+  return res;
 }
 
 
@@ -897,16 +919,15 @@
   semantic_type probe;
 
   probe.tag = key;
-  semantic_type *entry = hash_lookup (semantic_type_table, &probe);
+  semantic_type *res = hash_lookup (semantic_type_table, &probe);
 
-  if (!entry)
+  if (!res)
     {
       /* First insertion in the hash. */
-      entry = semantic_type_new (key, loc);
-      if (!hash_insert (semantic_type_table, entry))
-        xalloc_die ();
+      res = semantic_type_new (key, loc);
+      hash_xinsert (semantic_type_table, res);
     }
-  return entry;
+  return res;
 }
 
 
@@ -949,12 +970,11 @@
   assure (len < sizeof buf);
   symbol *sym = symbol_get (buf, loc);
   sym->content->class = nterm_sym;
-  sym->content->number = nvars++;
   return sym;
 }
 
 bool
-symbol_is_dummy (const symbol *sym)
+symbol_is_dummy (symbol const *sym)
 {
   return sym->tag[0] == '@' || (sym->tag[0] == '$' && sym->tag[1] == '@');
 }
@@ -982,7 +1002,7 @@
 }
 
 /* Store in *SORTED an array of pointers to the symbols contained in
-   TABLE, sorted (alphabetically) by tag. */
+   TABLE, sorted by order of appearance (i.e., by location). */
 
 static void
 table_sort (struct hash_table *table, symbol ***sorted)
@@ -1027,59 +1047,74 @@
 static void
 symbols_token_translations_init (void)
 {
-  bool num_256_available_p = true;
+  bool code_256_available_p = true;
 
-  /* Find the highest user token number, and whether 256, the POSIX
-     preferred user token number for the error token, is used.  */
-  max_user_token_number = 0;
+  /* Find the highest token code, and whether 256, the POSIX preferred
+     token code for the error token, is used.  */
+  max_code = 0;
   for (int i = 0; i < ntokens; ++i)
     {
-      sym_content *this = symbols[i]->content;
-      if (this->user_token_number != USER_NUMBER_UNDEFINED)
+      sym_content *sym = symbols[i]->content;
+      if (sym->code != CODE_UNDEFINED)
         {
-          if (this->user_token_number > max_user_token_number)
-            max_user_token_number = this->user_token_number;
-          if (this->user_token_number == 256)
-            num_256_available_p = false;
+          if (sym->code > max_code)
+            max_code = sym->code;
+          if (sym->code == 256)
+            code_256_available_p = false;
         }
     }
 
   /* If 256 is not used, assign it to error, to follow POSIX.  */
-  if (num_256_available_p
-      && errtoken->content->user_token_number == USER_NUMBER_UNDEFINED)
-    errtoken->content->user_token_number = 256;
+  if (code_256_available_p
+      && errtoken->content->code == CODE_UNDEFINED)
+    errtoken->content->code = 256;
 
-  /* Set the missing user numbers. */
-  if (max_user_token_number < 256)
-    max_user_token_number = 256;
+  /* Set the missing codes. */
+  if (max_code < 256)
+    max_code = 256;
 
   for (int i = 0; i < ntokens; ++i)
     {
-      sym_content *this = symbols[i]->content;
-      if (this->user_token_number == USER_NUMBER_UNDEFINED)
+      sym_content *sym = symbols[i]->content;
+      if (sym->code == CODE_UNDEFINED)
         {
           IGNORE_TYPE_LIMITS_BEGIN
-          if (INT_ADD_WRAPV (max_user_token_number, 1, &max_user_token_number))
+          if (INT_ADD_WRAPV (max_code, 1, &max_code))
             complain (NULL, fatal, _("token number too large"));
           IGNORE_TYPE_LIMITS_END
-          this->user_token_number = max_user_token_number;
+          sym->code = max_code;
         }
-      if (this->user_token_number > max_user_token_number)
-        max_user_token_number = this->user_token_number;
+      if (sym->code > max_code)
+        max_code = sym->code;
     }
 
-  token_translations = xnmalloc (max_user_token_number + 1,
+  token_translations = xnmalloc (max_code + 1,
                                  sizeof *token_translations);
 
   /* Initialize all entries for literal tokens to the internal token
      number for $undefined, which represents all invalid inputs.  */
-  for (int i = 0; i < max_user_token_number + 1; ++i)
+  for (int i = 0; i < max_code + 1; ++i)
     token_translations[i] = undeftoken->content->number;
   for (int i = 0; symbols_sorted[i]; ++i)
     symbol_translation (symbols_sorted[i]);
 }
 
 
+/* Whether some symbol requires internationalization.  */
+static bool
+has_translations (void)
+{
+  for (const void *entry = hash_get_first (symbol_table);
+       entry;
+       entry = hash_get_next (symbol_table, entry))
+    {
+      const symbol *sym = (const symbol *) entry;
+      if (sym->translatable)
+        return true;
+    }
+  return false;
+}
+
 /*----------------------------------------------------------------.
 | Assign symbol numbers, and write definition of token names into |
 | FDEFINES.  Set up vectors SYMBOL_TABLE, TAGS of symbols.        |
@@ -1114,14 +1149,17 @@
 
   symbols_token_translations_init ();
 
-  if (startsymbol->content->class == unknown_sym)
-    complain (&startsymbol_loc, fatal,
-              _("the start symbol %s is undefined"),
-              startsymbol->tag);
-  else if (startsymbol->content->class == token_sym)
-    complain (&startsymbol_loc, fatal,
-              _("the start symbol %s is a token"),
-              startsymbol->tag);
+  // If some user tokens are internationalized, the internal ones
+  // should be too.
+  if (has_translations ())
+    {
+      const bool eof_is_user_defined
+        = !eoftoken->alias || STRNEQ (eoftoken->alias->tag, "$end");
+      if (!eof_is_user_defined)
+        eoftoken->alias->translatable = true;
+      undeftoken->alias->translatable = true;
+      errtoken->alias->translatable = true;
+    }
 }
 
 /*---------------------------------.
@@ -1149,10 +1187,10 @@
 static symgraphlink *
 symgraphlink_new (graphid id, symgraphlink *next)
 {
-  symgraphlink *l = xmalloc (sizeof *l);
-  l->id = id;
-  l->next = next;
-  return l;
+  symgraphlink *res = xmalloc (sizeof *res);
+  res->id = id;
+  res->next = next;
+  return res;
 }
 
 
diff --git a/src/symtab.h b/src/symtab.h
index 729f1fb..11a3a6f 100644
--- a/src/symtab.h
+++ b/src/symtab.h
@@ -1,6 +1,6 @@
 /* Definitions for symtab.c and callers, part of Bison.
 
-   Copyright (C) 1984, 1989, 1992, 2000-2002, 2004-2015, 2018-2019 Free
+   Copyright (C) 1984, 1989, 1992, 2000-2002, 2004-2015, 2018-2021 Free
    Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 /**
  * \file symtab.h
@@ -97,6 +97,9 @@
   /** The "defining" location.  */
   location location;
 
+  /** Whether this symbol is translatable. */
+  bool translatable;
+
   /** Whether \a location is about the first uses as left-hand side
       symbol of a rule (true), or simply the first occurrence (e.g.,
       in a %type, or as a rhs symbol of a rule).  The former type of
@@ -117,6 +120,8 @@
 
 struct sym_content
 {
+  /** The main symbol that denotes this content (it contains the
+      possible alias). */
   symbol *symbol;
 
   /** Its \c \%type.
@@ -130,7 +135,7 @@
   /** Its \c \%type's location.  */
   location type_loc;
 
-  /** Any \c \%destructor (resp. \%printer) declared specificially for this
+  /** Any \c \%destructor (resp. \%printer) declared specifically for this
       symbol.
 
       Access this field only through <tt>symbol</tt>'s interface functions. For
@@ -144,21 +149,13 @@
   int prec;
   assoc assoc;
 
-  /** The user specified token number.
-
-      E.g., %token FOO 42.*/
-  int user_token_number;
+  /** Token code, possibly specified by the user (%token FOO 42).  */
+  int code;
 
   symbol_class class;
   declaration_status status;
 };
 
-/** Undefined user number.  */
-# define USER_NUMBER_UNDEFINED -1
-
-/* Undefined internal token number.  */
-# define NUMBER_UNDEFINED (-1)
-
 /** Fetch (or create) the symbol associated to KEY.  */
 symbol *symbol_from_uniqstr (const uniqstr key, location loc);
 
@@ -179,7 +176,7 @@
 void symbol_print (symbol const *s, FILE *f);
 
 /** Is this a dummy nonterminal?  */
-bool symbol_is_dummy (const symbol *sym);
+bool symbol_is_dummy (symbol const *sym);
 
 /** The name of the code_props type: "\%destructor" or "\%printer".  */
 char const *code_props_type_string (code_props_type kind);
@@ -225,12 +222,13 @@
 /** Set the \c class associated with \c sym.
 
     Whether \c declaring means whether this class definition comes
-    from %nterm or %token (but not %type, prec/assoc, etc.).  */
+    from %nterm or %token (but not %type, prec/assoc, etc.).  A symbol
+    can have "declaring" set only at most once.  */
 void symbol_class_set (symbol *sym, symbol_class class, location loc,
                        bool declaring);
 
-/** Set the \c user_token_number associated with \c sym.  */
-void symbol_user_token_number_set (symbol *sym, int user_number, location loc);
+/** Set the token \c code of \c sym, specified by the user at \c loc.  */
+void symbol_code_set (symbol *sym, int code, location loc);
 
 
 
@@ -243,16 +241,11 @@
 /** The token for unknown tokens.  */
 extern symbol *undeftoken;
 /** The end of input token.  */
-extern symbol *endtoken;
+extern symbol *eoftoken;
 /** The genuine start symbol.
 
    $accept: start-symbol $end */
-extern symbol *accept;
-
-/** The user start symbol. */
-extern symbol *startsymbol;
-/** The location of the \c \%start declaration.  */
-extern location startsymbol_loc;
+extern symbol *acceptsymbol;
 
 /** Whether a symbol declared with a type tag.  */
 extern bool tag_seen;
diff --git a/src/system.h b/src/system.h
index 35d39f4..bbdf9fd 100644
--- a/src/system.h
+++ b/src/system.h
@@ -1,6 +1,6 @@
 /* System-dependent definitions for Bison.
 
-   Copyright (C) 2000-2007, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2000-2007, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef BISON_SYSTEM_H
 # define BISON_SYSTEM_H
@@ -73,9 +73,14 @@
 # include <verify.h>
 # include <xalloc.h>
 
+// Clang and ICC like to pretend they are GCC.
+# if defined __GNUC__ && !defined __clang__ && !defined __ICC
+#  define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
+# endif
 
-/* See https://lists.gnu.org/archive/html/bug-bison/2019-10/msg00061.html. */
-# if defined __GNUC__ && ! defined __clang__ && ! defined __ICC && __GNUC__ < 5
+// See https://lists.gnu.org/r/bug-bison/2019-10/msg00061.html
+// and https://trac.macports.org/ticket/59927.
+# if defined GCC_VERSION && 405 <= GCC_VERSION
 #  define IGNORE_TYPE_LIMITS_BEGIN \
      _Pragma ("GCC diagnostic push") \
      _Pragma ("GCC diagnostic ignored \"-Wtype-limits\"")
@@ -105,28 +110,7 @@
    Bison's performance anyway.  */
 # define PACIFY_CC(Code) Code
 
-# ifndef __attribute__
-/* This feature is available in gcc versions 2.5 and later.  */
-#  if (! defined __GNUC__ || __GNUC__ < 2 \
-       || (__GNUC__ == 2 && __GNUC_MINOR__ < 5))
-#   define __attribute__(Spec) /* empty */
-#  endif
-# endif
-
-/* The __-protected variants of 'format' and 'printf' attributes
-   are accepted by gcc versions 2.6.4 (effectively 2.7) and later.  */
-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
-#  define __format__ format
-#  define __printf__ printf
-# endif
-
-# ifndef ATTRIBUTE_NORETURN
-#  define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
-# endif
-
-# ifndef ATTRIBUTE_UNUSED
-#  define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
-# endif
+# include <attribute.h>
 
 
 /*------.
@@ -147,6 +131,22 @@
 # include <stdbool.h>
 
 
+/*-----------.
+| Integers.  |
+`-----------*/
+
+static inline int
+min_int (int a, int b)
+{
+  return a < b ? a : b;
+}
+
+static inline int
+max_int (int a, int b)
+{
+  return a >= b ? a : b;
+}
+
 
 /*-------------.
 | Assertions.  |
@@ -156,8 +156,8 @@
    a failed assertion.  The rationale was that <assert.h>'s assertions
    were too heavyweight and could be disabled too easily.  See
    discussions at
-   <http://lists.gnu.org/archive/html/bison-patches/2006-01/msg00080.html>
-   <http://lists.gnu.org/archive/html/bison-patches/2006-09/msg00111.html>.
+   <https://lists.gnu.org/r/bison-patches/2006-01/msg00080.html>
+   <https://lists.gnu.org/r/bison-patches/2006-09/msg00111.html>.
 
    However, normal assert output can be helpful during development and
    in bug reports from users.  Moreover, it's not clear now that
@@ -165,7 +165,7 @@
    users want to experiment with disabling assertions, it's debatable
    whether it's our responsibility to stop them.  See discussion
    starting at
-   <http://lists.gnu.org/archive/html/bison-patches/2009-09/msg00013.html>.
+   <https://lists.gnu.org/r/bison-patches/2009-09/msg00013.html>.
 
    For now, we use assert but we call it aver throughout Bison in case
    we later wish to try another scheme.
@@ -187,6 +187,23 @@
 # define obstack_sgrow(Obs, Str) \
   obstack_grow (Obs, Str, strlen (Str))
 
+/* Output Str escaped to be a string.
+
+   For instance "\"foo\"" -> "\\\"foo\\\"".  */
+
+# define obstack_backslash(Obs, Str)                    \
+  do {                                                  \
+    char const *p__;                                    \
+    for (p__ = Str; *p__; p__++)                        \
+      switch (*p__)                                     \
+        {                                               \
+        case '"':  obstack_sgrow (Obs, "\\\""); break;  \
+        case '\\': obstack_sgrow (Obs, "\\\\"); break;  \
+        default:   obstack_1grow (Obs, *p__);   break;  \
+        }                                               \
+  } while (0)
+
+
 /* Output Str escaped for our postprocessing (i.e., escape M4 special
    characters).
 
@@ -209,10 +226,10 @@
 
 /* Output Str both quoted for M4 (i.e., embed in [[...]]), and escaped
    for our postprocessing (i.e., escape M4 special characters).  If
-   Str is empty (or NULL), output "[]" instead of "[[]]" as it make M4
-   programming easier (m4_ifval can be used).
+   Str is empty (or NULL), output "[]" instead of "[[]]" as it makes
+   M4 programming easier (m4_ifval can be used).
 
-   For instance "[foo]" -> "[[@{foo@}]]", "$$" -> "[[$][$][]]". */
+   For instance "[foo]" -> "[[@{foo@}]]", "$$" -> "[[$][$][]]".  */
 
 # define obstack_quote(Obs, Str)                \
   do {                                          \
diff --git a/src/tables.c b/src/tables.c
index ec89b3e..23a879c 100644
--- a/src/tables.c
+++ b/src/tables.c
@@ -1,6 +1,6 @@
 /* Output the generated parsing program for Bison.
 
-   Copyright (C) 1984, 1986, 1989, 1992, 2000-2006, 2009-2015, 2018-2019
+   Copyright (C) 1984, 1986, 1989, 1992, 2000-2006, 2009-2015, 2018-2021
    Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
@@ -111,9 +111,13 @@
    computation equals to BASE_MINIMUM, later mapped to BASE_NINF to
    keep parser tables small.  */
 base_number base_ninf = 0;
+
 /* Bitset representing an integer set in the range
-   -nstates..table_size (as an upper bound) */
+   POS_SET_OFFSET..(POS_SET_OFFSET + SIZE).  POS_SET_OFFSET is
+   nonpositive. */
 static bitset pos_set = NULL;
+/* The integer denoted by bitno 0 in pos_set.  */
+static int pos_set_base = 0;
 
 static int *conflrow;
 int *conflict_table;
@@ -138,6 +142,76 @@
 state_number *yydefgoto;
 rule_number *yydefact;
 
+
+/*----------.
+| pos_set.  |
+`----------*/
+
+#if 0
+static void
+pos_set_dump (void)
+{
+  fprintf (stderr, "pos_set (%ld, %d) =", bitset_size (pos_set), pos_set_base);
+  bitset_iterator biter;
+  int i;
+  BITSET_FOR_EACH (biter, pos_set, i, 0)
+    fprintf (stderr, " %d", i + pos_set_base);
+  putc ('\n', stderr);
+}
+#endif
+
+
+/* The size and base of POS_SET are not known, we need to be able to
+   move the base farther "on the left", and grow "on the right".
+
+   It would be nice to be able to predict the base accurately, but it
+   seems difficult (-nstates seems to work most of the time, except
+   when there are useless tokens).
+
+   FIXME: The current approach is correct, but with poor performances.
+   Bitsets need to support 'assign' and 'shift'.  And instead of
+   extending POS_SET just for the out-of-range new values, we need
+   something like doubling the size.
+  */
+
+static void
+pos_set_set (int pos)
+{
+  int bitno = pos - pos_set_base;
+  if (bitno < 0)
+    {
+      // Need more room on the left.
+      // DELTA is positive.  Run 'pos_set >> delta'.
+      const int delta = pos_set_base - pos;
+      const int old_size = bitset_size (pos_set);
+      const int new_size = old_size + delta;
+      bitset_resize (pos_set, new_size);
+      // Right-shift all the bits by DELTA.  Be sure to reset the new
+      // bits on the left.
+      //
+      // FIXME: add bitset_assign, and bitset_shift?
+      for (int i = new_size - 1; 0 <= i ; --i)
+        if (delta <= i && bitset_test (pos_set, i - delta))
+          bitset_set (pos_set, i);
+        else
+          bitset_reset (pos_set, i);
+      pos_set_base = pos;
+      bitno = 0;
+    }
+  else if (bitset_size (pos_set) <= bitno)
+    // Need more room on the right.
+    bitset_resize (pos_set, bitno + 1);
+  bitset_set (pos_set, bitno);
+}
+
+static bool
+pos_set_test (int pos)
+{
+  const int bitno = pos - pos_set_base;
+  return bitset_test (pos_set, bitno);
+}
+
+
 /*-------------------------------------------------------------------.
 | If TABLE, CONFLICT_TABLE, and CHECK are too small to be addressed  |
 | at DESIRED, grow them.  TABLE[DESIRED] can be used, so the desired |
@@ -168,8 +242,6 @@
   check = xnrealloc (check, table_size, sizeof *check);
   for (int i = old_size; i < table_size; ++i)
     check[i] = -1;
-
-  bitset_resize (pos_set, table_size + nstates);
 }
 
 
@@ -200,7 +272,7 @@
         /* Find all reductions for token J, and record all that do not
            match ACTROW[J].  */
         for (int i = 0; i < reds->num; i += 1)
-          if (bitset_test (reds->lookahead_tokens[i], j)
+          if (bitset_test (reds->lookaheads[i], j)
               && (actrow[j]
                   != rule_number_as_item_number (reds->rules[i]->number)))
             {
@@ -247,7 +319,7 @@
 
   reductions *reds = s->reductions;
   bool conflicted = false;
-  if (reds->lookahead_tokens)
+  if (reds->lookaheads)
     /* loop over all the rules available here which require
        lookahead (in reverse order to give precedence to the first
        rule) */
@@ -257,7 +329,7 @@
       {
         bitset_iterator biter;
         int j;
-        BITSET_FOR_EACH (biter, reds->lookahead_tokens[i], j, 0)
+        BITSET_FOR_EACH (biter, reds->lookaheads[i], j, 0)
           {
             /* and record this rule as the rule to use if that
                token follows.  */
@@ -308,7 +380,7 @@
     }
 
   /* Turn off default reductions where requested by the user.  See
-     state_lookahead_tokens_count in lalr.c to understand when states are
+     state_lookaheads_count in lalr.c to understand when states are
      labeled as consistent.  */
   {
     char *default_reductions =
@@ -412,7 +484,7 @@
 
 /*------------------------------------------------------------------.
 | Figure out the actions for the specified state, indexed by        |
-| lookahead token type.                                             |
+| lookahead token kind.                                             |
 |                                                                   |
 | The YYDEFACT table is output now.  The detailed info is saved for |
 | putting into YYTABLE later.                                       |
@@ -512,7 +584,14 @@
 {
   const goto_number begin = goto_map[sym - ntokens];
   const goto_number end = goto_map[sym - ntokens + 1];
-  state_number res = -1;
+
+  /* In the case this symbol is never reduced to ($accept), use state
+     0.  We used to use -1, but as a result the yydefgoto table must
+     be signed, which (1) might trigger compiler warnings when storing
+     a value from yydefgoto into a state number (nonnegative), and (2)
+     wastes bits which might result in using a int16 where a uint8
+     suffices. */
+  state_number res = 0;
 
   if (begin != end)
     {
@@ -547,7 +626,7 @@
 goto_actions (void)
 {
   size_t *state_count = xnmalloc (nstates, sizeof *state_count);
-  yydefgoto = xnmalloc (nvars, sizeof *yydefgoto);
+  yydefgoto = xnmalloc (nnterms, sizeof *yydefgoto);
 
   /* For a given nterm I, STATE_COUNT[S] is the number of times there
      is a GOTO to S on I.  */
@@ -665,7 +744,7 @@
               ok = false;
           }
 
-        if (ok && bitset_test (pos_set, nstates + res))
+        if (ok && pos_set_test (res))
           ok = false;
       }
 
@@ -725,6 +804,7 @@
 {
   base = xnmalloc (nvectors, sizeof *base);
   pos_set = bitset_create (table_size + nstates, BITSET_FRUGAL);
+  pos_set_base = -nstates;
   table = xcalloc (table_size, sizeof *table);
   conflict_table = xcalloc (table_size, sizeof *conflict_table);
   check = xnmalloc (table_size, sizeof *check);
@@ -750,12 +830,7 @@
         /* Action of I were already coded for S.  */
         place = base[s];
 
-      /* Store PLACE into POS_SET.  PLACE might not belong to the set
-         of possible values for instance with useless tokens.  It
-         would be more satisfying to eliminate the need for this
-         'if'.  */
-      if (0 <= nstates + place)
-        bitset_set (pos_set, nstates + place);
+      pos_set_set (place);
       base[order[i]] = place;
     }
 
@@ -780,9 +855,9 @@
      correlated.  In particular the signedness is not taken into
      account.  But it's not useless.  */
   verify (sizeof nstates <= sizeof nvectors);
-  verify (sizeof nvars <= sizeof nvectors);
+  verify (sizeof nnterms <= sizeof nvectors);
 
-  nvectors = state_number_as_int (nstates) + nvars;
+  nvectors = state_number_as_int (nstates) + nnterms;
 
   froms = xcalloc (nvectors, sizeof *froms);
   tos = xcalloc (nvectors, sizeof *tos);
diff --git a/src/tables.h b/src/tables.h
index fe12952..2194a81 100644
--- a/src/tables.h
+++ b/src/tables.h
@@ -1,6 +1,6 @@
 /* Prepare the LALR and GLR parser tables.
 
-   Copyright (C) 2002, 2004, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2002, 2004, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef TABLES_H_
 # define TABLES_H_
diff --git a/src/uniqstr.c b/src/uniqstr.c
index 3833b84..e7dbd5d 100644
--- a/src/uniqstr.c
+++ b/src/uniqstr.c
@@ -1,6 +1,6 @@
 /* Keep a unique copy of strings.
 
-   Copyright (C) 2002-2005, 2009-2015, 2018-2019 Free Software
+   Copyright (C) 2002-2005, 2009-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,11 +16,12 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
 
+#include <attribute.h>
 #include <error.h>
 #include <hash.h>
 #include <quotearg.h>
@@ -49,8 +50,7 @@
     {
       /* First insertion in the hash. */
       res = xstrdup (str);
-      if (!hash_insert (uniqstrs_table, res))
-        xalloc_die ();
+      hash_xinsert (uniqstrs_table, res);
     }
   return res;
 }
@@ -80,9 +80,7 @@
   va_end (args);
 
   *p = '\0';
-  uniqstr res = hash_insert (uniqstrs_table, str);
-  if (!res)
-    xalloc_die ();
+  uniqstr res = hash_xinsert (uniqstrs_table, str);
   if (res != str)
     free (str);
   return res;
@@ -117,12 +115,11 @@
 }
 
 static bool
-uniqstr_print_processor (void *ustr, void *null ATTRIBUTE_UNUSED)
+uniqstr_print_processor (void *ustr, void *null MAYBE_UNUSED)
 {
   return uniqstr_print (ustr);
 }
 
-
 int
 uniqstr_cmp (uniqstr l, uniqstr r)
 {
diff --git a/src/uniqstr.h b/src/uniqstr.h
index 1fd7318..0a1c506 100644
--- a/src/uniqstr.h
+++ b/src/uniqstr.h
@@ -1,6 +1,6 @@
 /* Keeping a unique copy of strings.
 
-   Copyright (C) 2002-2003, 2008-2015, 2018-2019 Free Software
+   Copyright (C) 2002-2003, 2008-2015, 2018-2021 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -16,7 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef UNIQSTR_H_
 # define UNIQSTR_H_
diff --git a/tests/README.md b/tests/README.md
new file mode 100644
index 0000000..7039d0a
--- /dev/null
+++ b/tests/README.md
@@ -0,0 +1,38 @@
+# AT_BISON_OPTION_PUSHDEFS/AT_BISON_OPTION_POPDEFS
+
+These two macros must be given the (main) directives so that they
+define a number of other macros to:
+- what the language is (so what compiler tool chain to use, what
+  definition of yylex/yyerror, etc.)
+- what skeleton is used
+
+# Keywords
+The following keywords are used to label tests (with
+AT_KEYWORDS([[category]])).  Please follow them and avoid creating
+synonyms.
+- action
+- api.value.type
+- c++: c++ language
+- cex: counterexamples.
+- d: d language
+- deprec: deprecated features.
+- diagnostics
+- glr
+- graph
+- html: html reports
+- java
+- lac
+- %merge
+- multistart
+- push
+- report: for automaton dumps
+- %union
+- variant
+- yacc: POSIX yacc (%yacc)
+
+# Calculator
+The grammar features several special directives:
+- `!!` YYERROR
+- `!+` YYACCEPT
+- `!-` YYABORT
+- `!*` YYNOMEM
diff --git a/tests/actions.at b/tests/actions.at
index e22e259..b7b4c03 100644
--- a/tests/actions.at
+++ b/tests/actions.at
@@ -1,6 +1,6 @@
 # Executing Actions.                               -*- Autotest -*-
 
-# Copyright (C) 2001-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2001-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[User Actions.]])
 
@@ -183,7 +183,7 @@
 [[one.y:11.13-18: error: only one %empty allowed per rule
    11 |   %empty {} %empty
       |             ^~~~~~
-one.y:11.3-8:       previous declaration
+one.y:11.3-8: note: previous declaration
    11 |   %empty {} %empty
       |   ^~~~~~
 one.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
@@ -193,7 +193,7 @@
 [[one.y:11.13-18: error: only one %empty allowed per rule
    11 |   %empty {} %empty
       |             ^~~~~~
-one.y:11.3-8:       previous declaration
+one.y:11.3-8: note: previous declaration
    11 |   %empty {} %empty
       |   ^~~~~~
 bison: file 'one.y' was updated (backup: 'one.y~')
@@ -334,10 +334,10 @@
 
 ]AT_YYLEX_PROTOTYPE[
 {]AT_PURE_IF([
-  YYUSE(lvalp);
-  YYUSE(llocp);], [AT_CXX_IF([
-  YYUSE(lvalp);
-  YYUSE(llocp);])])[
+  YY_USE (lvalp);
+  YY_USE (llocp);], [AT_CXX_IF([
+  YY_USE (lvalp);
+  YY_USE (llocp);])])[
   return 'x';
 }
 
@@ -371,10 +371,11 @@
 AT_TEST([glr.c], [%define api.pure])
 AT_TEST([lalr1.cc])
 AT_TEST([glr.cc])
+AT_TEST([glr2.cc])
 
 ## A very different test, based on PostgreSQL's implementation of the
 ## locations.  See
-## http://lists.gnu.org/archive/html/bug-bison/2012-11/msg00023.html
+## https://lists.gnu.org/r/bug-bison/2012-11/msg00023.html
 ##
 ## Weirdly enough, to trigger the warning with GCC 4.7, we must not
 ## use fprintf, so run the test twice: once to check the warning
@@ -474,7 +475,7 @@
 ])
 
 ## FIXME: test Java and D.
-m4_map_args([AT_TEST], [yacc.c], [glr.c], [lalr1.cc], [glr.cc])
+m4_map_args([AT_TEST], [yacc.c], [glr.c], [lalr1.cc], [glr.cc], [glr2.cc])
 
 m4_popdef([AT_TEST])
 
@@ -607,7 +608,6 @@
 {
   int ival;
 }])
-AT_LALR1_CC_IF([%define global_tokens_and_yystype])
 m4_ifval([$6], [[%code provides {]], [[%code {]])
 AT_LALR1_CC_IF([typedef yy::location YYLTYPE;])[
 ]AT_YYLEX_DECLARE[
@@ -975,7 +975,7 @@
 # -------------------------------------
 # Upon stack overflow, all symbols on the stack should be destroyed.
 # Only check for yacc.c.
-AT_YACC_IF([
+AT_YACC_C_IF([
 AT_PARSER_CHECK([input '(x)(x)(x)(x)(x)(x)(x)'], 2, [],
 [[sending: '(' (0@0-9)
 sending: 'x' (1@10-19)
@@ -1050,11 +1050,14 @@
 AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser])
 AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [ with union])
 
-AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"])
-AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"], [ with union])
+AT_CHECK_PRINTER_AND_DESTRUCTOR([%header %skeleton "lalr1.cc"])
+AT_CHECK_PRINTER_AND_DESTRUCTOR([%header %skeleton "lalr1.cc"], [ with union])
 
-AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "glr.cc"])
-AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "glr.cc"], [ with union])
+AT_CHECK_PRINTER_AND_DESTRUCTOR([%header %skeleton "glr.cc"])
+AT_CHECK_PRINTER_AND_DESTRUCTOR([%header %skeleton "glr.cc"], [ with union])
+
+AT_CHECK_PRINTER_AND_DESTRUCTOR([%header %skeleton "glr2.cc"])
+AT_CHECK_PRINTER_AND_DESTRUCTOR([%header %skeleton "glr2.cc"], [ with union])
 
 
 
@@ -1123,20 +1126,30 @@
 ]],
 [[Starting parse
 Entering state 0
-Reading a token: Next token is token 'a' (1.1: <> printer for 'a' @ 1)
+Stack now 0
+Reading a token
+Next token is token 'a' (1.1: <> printer for 'a' @ 1)
 Shifting token 'a' (1.1: <> printer for 'a' @ 1)
 Entering state 1
-Reading a token: Next token is token 'b' (1.2: 'b'/'c' printer for 'b' @ 2)
+Stack now 0 1
+Reading a token
+Next token is token 'b' (1.2: 'b'/'c' printer for 'b' @ 2)
 Shifting token 'b' (1.2: 'b'/'c' printer for 'b' @ 2)
 Entering state 3
-Reading a token: Next token is token 'c' (1.3: 'b'/'c' printer for 'c' @ 3)
+Stack now 0 1 3
+Reading a token
+Next token is token 'c' (1.3: 'b'/'c' printer for 'c' @ 3)
 Shifting token 'c' (1.3: 'b'/'c' printer for 'c' @ 3)
 Entering state 5
-Reading a token: Next token is token 'd' (1.4: <> printer for 'd' @ 4)
+Stack now 0 1 3 5
+Reading a token
+Next token is token 'd' (1.4: <> printer for 'd' @ 4)
 Shifting token 'd' (1.4: <> printer for 'd' @ 4)
 Entering state 6
-Reading a token: Now at end of input.
-1.5: syntax error, unexpected $end, expecting 'e'
+Stack now 0 1 3 5 6
+Reading a token
+Now at end of input.
+1.5: syntax error, unexpected end of file, expecting 'e'
 Error: popping token 'd' (1.4: <> printer for 'd' @ 4)
 Stack now 0 1 3 5
 Error: popping token 'c' (1.3: 'b'/'c' printer for 'c' @ 3)
@@ -1145,7 +1158,7 @@
 Stack now 0 1
 Error: popping token 'a' (1.1: <> printer for 'a' @ 1)
 Stack now 0
-Cleanup: discarding lookahead token $end (1.5: )
+Cleanup: discarding lookahead token "end of file" (1.5: )
 Stack now 0
 ]])
 
@@ -1232,26 +1245,40 @@
 ]],
 [[Starting parse
 Entering state 0
-Reading a token: Next token is token 'a' (<*>/<field2>/e printer)
+Stack now 0
+Reading a token
+Next token is token 'a' (<*>/<field2>/e printer)
 Shifting token 'a' (<*>/<field2>/e printer)
 Entering state 1
-Reading a token: Next token is token 'b' (<field1> printer)
+Stack now 0 1
+Reading a token
+Next token is token 'b' (<field1> printer)
 Shifting token 'b' (<field1> printer)
 Entering state 3
-Reading a token: Next token is token 'c' ('c' printer)
+Stack now 0 1 3
+Reading a token
+Next token is token 'c' ('c' printer)
 Shifting token 'c' ('c' printer)
 Entering state 5
-Reading a token: Next token is token 'd' ('d' printer)
+Stack now 0 1 3 5
+Reading a token
+Next token is token 'd' ('d' printer)
 Shifting token 'd' ('d' printer)
 Entering state 6
-Reading a token: Next token is token 'e' (<*>/<field2>/e printer)
+Stack now 0 1 3 5 6
+Reading a token
+Next token is token 'e' (<*>/<field2>/e printer)
 Shifting token 'e' (<*>/<field2>/e printer)
 Entering state 7
-Reading a token: Next token is token 'f' (<*>/<field2>/e printer)
+Stack now 0 1 3 5 6 7
+Reading a token
+Next token is token 'f' (<*>/<field2>/e printer)
 Shifting token 'f' (<*>/<field2>/e printer)
 Entering state 8
-Reading a token: Now at end of input.
-syntax error, unexpected $end, expecting 'g'
+Stack now 0 1 3 5 6 7 8
+Reading a token
+Now at end of input.
+syntax error, unexpected end of file, expecting 'g'
 Error: popping token 'f' (<*>/<field2>/e printer)
 Stack now 0 1 3 5 6 7
 Error: popping token 'e' (<*>/<field2>/e printer)
@@ -1264,7 +1291,7 @@
 Stack now 0 1
 Error: popping token 'a' (<*>/<field2>/e printer)
 Stack now 0
-Cleanup: discarding lookahead token $end ()
+Cleanup: discarding lookahead token "end of file" ()
 Stack now 0
 ]])
 
@@ -1279,6 +1306,15 @@
 
 AT_SETUP([Default %printer and %destructor for user-defined end token])
 
+# Enable declaration of default %printer/%destructor.  Make the parser
+# use these for all user-declared grammar symbols for which the user
+# does not declare a specific %printer/%destructor.  Thus, the parser
+# uses it for token 0 if the user declares it but not if Bison
+# generates it as $end.  Discussed starting at
+# <https://lists.gnu.org/r/bison-patches/2006-02/msg00064.html>,
+# <https://lists.gnu.org/r/bison-patches/2006-06/msg00091.html>, and
+# <https://lists.gnu.org/r/bison-patches/2006-07/msg00019.html>.
+
 # AT_TEST(TYPED)
 # --------------
 m4_pushdef([AT_TEST],
@@ -1358,14 +1394,17 @@
 ]],
 [[Starting parse
 Entering state 0
+Stack now 0
 Reducing stack by rule 1 (line 49):
 -> $$ = nterm start (1.1: <]]kind[[> for 'S' @ 1)
-Stack now 0
 Entering state 1
-Reading a token: Now at end of input.
+Stack now 0 1
+Reading a token
+Now at end of input.
 Shifting token END (1.1: <]]kind[[> for 'E' @ 1)
 Entering state 2
 Stack now 0 1 2
+Stack now 0 1 2
 Cleanup: popping token END (1.1: <]]kind[[> for 'E' @ 1)
 Cleanup: popping nterm start (1.1: <]]kind[[> for 'S' @ 1)
 ]])
@@ -1440,17 +1479,24 @@
 AT_PARSER_CHECK([input --debug], [1], [],
 [[Starting parse
 Entering state 0
-Reading a token: Next token is token 'a' ('a')
+Stack now 0
+Reading a token
+Next token is token 'a' ('a')
 Shifting token 'a' ('a')
 Entering state 1
-Reading a token: Next token is token 'b' ('b')
+Stack now 0 1
+Reading a token
+Next token is token 'b' ('b')
 syntax error
 Shifting token error ()
 Entering state 3
+Stack now 0 1 3
 Next token is token 'b' ('b')
 Shifting token 'b' ('b')
 Entering state 5
-Reading a token: Next token is token $undefined ()
+Stack now 0 1 3 5
+Reading a token
+Next token is token "invalid token" ()
 Error: popping token 'b' ('b')
 DESTROY 'b'
 Stack now 0 1 3
@@ -1458,14 +1504,17 @@
 Stack now 0 1
 Shifting token error ()
 Entering state 3
-Next token is token $undefined ()
-Error: discarding token $undefined ()
+Stack now 0 1 3
+Next token is token "invalid token" ()
+Error: discarding token "invalid token" ()
 Error: popping token error ()
 Stack now 0 1
 Shifting token error ()
 Entering state 3
-Reading a token: Now at end of input.
-Cleanup: discarding lookahead token $end ()
+Stack now 0 1 3
+Reading a token
+Now at end of input.
+Cleanup: discarding lookahead token "end of file" ()
 Stack now 0 1 3
 Cleanup: popping token error ()
 Cleanup: popping token 'a' ('a')
@@ -1608,23 +1657,25 @@
 AT_PARSER_CHECK([input --debug], 1,,
 [[Starting parse
 Entering state 0
+Stack now 0
 Reducing stack by rule 1 (line 30):
 -> $$ = nterm $@1 (: )
-Stack now 0
 Entering state 2
+Stack now 0 2
 Reducing stack by rule 2 (line 31):
 -> $$ = nterm @2 (: 2)
-Stack now 0 2
 Entering state 4
+Stack now 0 2 4
 Reducing stack by rule 3 (line 32):
 -> $$ = nterm @3 (: 3)
-Stack now 0 2 4
 Entering state 5
+Stack now 0 2 4 5
 Reducing stack by rule 4 (line 33):
 -> $$ = nterm @4 (: 4)
-Stack now 0 2 4 5
 Entering state 6
-Reading a token: Now at end of input.
+Stack now 0 2 4 5 6
+Reading a token
+Now at end of input.
 syntax error
 Error: popping nterm @4 (: 4)
 DESTROY 4
@@ -1637,7 +1688,7 @@
 Stack now 0 2
 Error: popping nterm $@1 (: )
 Stack now 0
-Cleanup: discarding lookahead token $end (: )
+Cleanup: discarding lookahead token "end of file" (: )
 Stack now 0
 ]])
 
@@ -1726,8 +1777,6 @@
     float fval;
   } sem_type;
 
-# define YYSTYPE sem_type
-
 ]AT_CXX_IF([[
 # include <cstdio> // EOF.
 # include <iostream>
@@ -1749,6 +1798,8 @@
 ]])[
 }
 
+%define api.value.type {sem_type}
+
 %code
 {
   ]AT_YYERROR_DECLARE[
@@ -1776,10 +1827,7 @@
 };
 %%
 ]AT_YYERROR_DEFINE[
-]AT_YYLEX_DEFINE(AT_CXX_IF([[{yy::parser::token::UNTYPED,
-                                 yy::parser::token::INT,
-                                  EOF}]],
-                               [[{UNTYPED, INT, EOF}]]),
+]AT_YYLEX_DEFINE([[{]AT_TOKEN([UNTYPED])[, ]AT_TOKEN([INT])[, EOF}]],
                  [AT_VAL.ival = toknum * 10;
                   AT_VAL.fval = YY_CAST (float, toknum) / 10.0f;])[
 ]AT_MAIN_DEFINE[
@@ -1790,9 +1838,9 @@
 # Don't be too picky on the traces, GLR is not exactly the same.  Keep
 # only the lines from the printer.
 AT_CHECK([[sed -ne '/ival:/p' stderr]], 0,
-[[Reading a token: Next token is token UNTYPED (ival: 10, fval: 0.1)
+[[Next token is token UNTYPED (ival: 10, fval: 0.1)
 Shifting token UNTYPED (ival: 10, fval: 0.1)
-Reading a token: Next token is token INT (ival: 20, fval: 0.2)
+Next token is token INT (ival: 20, fval: 0.2)
 Shifting token INT (ival: 20, fval: 0.2)
    $][1 = token UNTYPED (ival: 10, fval: 0.1)
    $][2 = token INT (ival: 20, fval: 0.2)
@@ -1805,7 +1853,7 @@
 AT_CLEANUP
 ])
 
-m4_map_args([AT_TEST], [yacc.c], [glr.c], [lalr1.cc], [glr.cc])
+m4_map_args([AT_TEST], [yacc.c], [glr.c], [lalr1.cc], [glr.cc], [glr2.cc])
 m4_popdef([AT_TEST])
 
 ## -------------------------------------------------- ##
diff --git a/tests/atlocal.in b/tests/atlocal.in
index 8f2c64c..eabff45 100644
--- a/tests/atlocal.in
+++ b/tests/atlocal.in
@@ -1,7 +1,7 @@
 # @configure_input@                                     -*- shell-script -*-
 # Configurable variable values for Bison test suite.
 
-# Copyright (C) 2000-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2000-2015, 2018-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -14,7 +14,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 # We need 'testsuite.h' (srcdir/test).
 CPPFLAGS="-I$abs_top_srcdir/tests @CPPFLAGS@"
@@ -60,33 +60,8 @@
 : ${CXX11_CXXFLAGS='@CXX11_CXXFLAGS@'}
 : ${CXX14_CXXFLAGS='@CXX14_CXXFLAGS@'}
 : ${CXX17_CXXFLAGS='@CXX17_CXXFLAGS@'}
-: ${CXX2A_CXXFLAGS='@CXX2A_CXXFLAGS@'}
-
-# Be sure that the C++ compiler is not broken because of gnulib.  This
-# cannot be checked in configure (gnulib is not parameterized yet),
-# and checking this in every C++ test in AC_COMPILE_CXX is too costly.
-#
-# http://lists.gnu.org/archive/html/bug-bison/2013-06/msg00001.html
-#
-# FIXME: Check (say 2014) whether this is still needed.
-if $BISON_CXX_WORKS; then
-  # See AT_DATA_SOURCE_PROLOGUE.
-  cat >conftest.cc <<EOF
-#include <testsuite.h>
-#include <iostream>
-
-int main ()
-{
-  std::cout << "Works\n";
-}
-EOF
-  $CXX $CXXFLAGS $CPPFLAGS $LDFLAGS $LIBS -o conftest conftest.cc
-  case $? in
-   0);;
-   *) BISON_CXX_WORKS="as_fn_error 77 cannot-compile-simple-program";;
-  esac
-  rm -fr conftest*
-fi
+: ${CXX20_CXXFLAGS='@CXX20_CXXFLAGS@'}
+: ${CXX2B_CXXFLAGS='@CXX2B_CXXFLAGS@'}
 
 # Whether the compiler supports POSIXLY_CORRECT defined.
 : ${C_COMPILER_POSIXLY_CORRECT='@C_COMPILER_POSIXLY_CORRECT@'}
@@ -133,6 +108,7 @@
 : ${PERL='@PERL@'}
 
 # Use simple quotes (lib/quote.c).
+# We have an LC_ALL=C pushed onto us via maint.mk.
 LC_CTYPE=C
 export LC_CTYPE
 
@@ -144,3 +120,44 @@
 
 # Empty if no xsltproc was found
 : ${XSLTPROC='@XSLTPROC@'}
+
+
+# Some tests expect a precise diff format.  See AT_DIFF_U_CHECK.
+# See https://lists.gnu.org/r/bug-bison/2020-05/msg00049.html.
+cat >conftest.1 <<EOF
+1
+2
+3
+4
+5
+6
+EOF
+
+cat >conftest.2 <<EOF
+1
+22
+3
+4
+55
+6
+EOF
+
+cat >conftest.expected <<EOF
+@@ -1,6 +1,6 @@
+ 1
+-2
++22
+ 3
+ 4
+-5
++55
+ 6
+EOF
+
+diff -u conftest.1 conftest.2 2>/dev/null | sed -n '/^@@/,$p' | sed 's/^ $//' >conftest.diff
+if diff conftest.expected conftest.diff >/dev/null; then
+    DIFF_U_WORKS=true
+else
+    DIFF_U_WORKS=false
+fi
+rm conftest.*
diff --git a/tests/bison.in b/tests/bison.in
index 98be011..7732edd 100644
--- a/tests/bison.in
+++ b/tests/bison.in
@@ -2,7 +2,7 @@
 # @configure_input@
 # Wrapper around a non installed bison to make it work as an installed one.
 
-# Copyright (C) 2001-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2001-2015, 2018-2021 Free Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -15,7 +15,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 abs_top_srcdir='@abs_top_srcdir@'
 abs_top_builddir='@abs_top_builddir@'
@@ -25,27 +25,13 @@
 BISON_PKGDATADIR=$abs_top_srcdir/data
 export BISON_PKGDATADIR
 
-stderr=tmp-bison.$$
-
-# If stderr is a tty, force --color=yes to simulate --color=auto
-# although we save and modify stderr.
-if test -t 2; then
-    set x --color=yes ${1+"$@"}
-    shift
-fi
-
-# We redirect stderr, which breaks the computation of the terminal
-# screen width.  So export COLUMNS to Bison, hoping for the shell to
-# have defined it.
-: ${COLUMNS=`(tput cols) 2>/dev/null || echo 132`}
-export COLUMNS
-$PREBISON "$abs_top_builddir/src/bison" ${1+"$@"} 2>"$stderr"
-status=$?
-
 # Neutralize path differences in error messages so that check and
 # installcheck behave the same way.
-sed -e "s,$abs_top_builddir/src/,,g" <"$stderr" >&2
-rm -f "$stderr"
+BISON_PROGRAM_NAME=bison
+export BISON_PROGRAM_NAME
+
+$PREBISON "$abs_top_builddir/src/bison" ${1+"$@"}
+status=$?
 
 # As a special dark magic, if we are actually using this wrapper to
 # compile Bison's src/parse-gram.y, post-process the synclines to
diff --git a/tests/c++.at b/tests/c++.at
index 84735d8..a2c46c2 100644
--- a/tests/c++.at
+++ b/tests/c++.at
@@ -1,6 +1,6 @@
 # Checking the C++ Features.                    -*- Autotest -*-
 
-# Copyright (C) 2004-2005, 2007-2015, 2018-2019 Free Software
+# Copyright (C) 2004-2005, 2007-2015, 2018-2021 Free Software
 # Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[C++ Features.]])
 
@@ -46,38 +46,45 @@
 bool
 check (const T& in, const std::string& s)
 {
+  const static bool verbose = getenv ("DEBUG");
   std::stringstream os;
   os << in;
-  if (os.str () != s)
+  if (os.str () == s)
+    {
+      if (verbose)
+        std::cerr << os.str () << '\n';
+      return true;
+    }
+  else
     {
       std::cerr << "fail: " << os.str () << ", expected: " << s << '\n';
       return false;
     }
-  return true;
 }
 
 int
 main (void)
 {
+  const std::string fn = "foo.txt";
   int fail = 0;
-  ]AT_YYLTYPE[ loc;  fail += check (loc, "1.1");
-                     fail += check (loc + 10, "1.1-10");
-  loc += 10;         fail += check (loc, "1.1-10");
-  loc += -5;         fail += check (loc, "1.1-5");
-                     fail += check (loc - 5, "1.1");
-  loc -= 5;          fail += check (loc, "1.1");
+  ]AT_YYLTYPE[ loc (&fn);  fail += check (loc, "foo.txt:1.1");
+                           fail += check (loc + 10, "foo.txt:1.1-10");
+  loc += 10;               fail += check (loc, "foo.txt:1.1-10");
+  loc += -5;               fail += check (loc, "foo.txt:1.1-5");
+                           fail += check (loc - 5, "foo.txt:1.1");
+  loc -= 5;                fail += check (loc, "foo.txt:1.1");
   // Check that we don't go below.
-  // http://lists.gnu.org/archive/html/bug-bison/2013-02/msg00000.html
-  loc -= 10;         fail += check (loc, "1.1");
+  // https://lists.gnu.org/r/bug-bison/2013-02/msg00000.html
+  loc -= 10;         fail += check (loc, "foo.txt:1.1");
 
-  loc.columns (10); loc.lines (10); fail += check (loc, "1.1-11.0");
-  loc.lines (-2);                   fail += check (loc, "1.1-9.0");
-  loc.lines (-10);                  fail += check (loc, "1.1");
+  loc.columns (10); loc.lines (10); fail += check (loc, "foo.txt:1.1-11.0");
+  loc.lines (-2);                   fail += check (loc, "foo.txt:1.1-9.0");
+  loc.lines (-10);                  fail += check (loc, "foo.txt:1.1");
 
   ]AT_YYLTYPE[ loc2 (YY_NULLPTR, 5, 10);
                    fail += check (loc2, "5.10");
-                   fail += check (loc + loc2, "1.1-5.9");
-  loc += loc2;     fail += check (loc, "1.1-5.9");
+                   fail += check (loc + loc2, "foo.txt:1.1-5.9");
+  loc += loc2;     fail += check (loc, "foo.txt:1.1-5.9");
   return !fail;
 }
 ]])
@@ -109,11 +116,6 @@
 %define parse.assert
 %debug
 
-%code top
-{
-  // Get access to stack_symbol_type for the tests.
-# define private public
-}
 %code provides
 {
   ]AT_YYLEX_DECLARE[
@@ -136,6 +138,14 @@
 %code requires { #include <vector> }
 %code { int yylex (yy::parser::semantic_type* lvalp); }
 
+// A hack which relies on internal hooks to check stack_symbol_type,
+// which is private.
+%code yy_bison_internal_hook {
+  public:
+    typedef stack_symbol_type yy_stack_symbol_type;
+    typedef stack_type yy_stack_type;
+}
+
 %%
 exp: "int" { $$.push_back ($1); }
 %%
@@ -157,6 +167,9 @@
   // symbol_type: construction, accessor.
   {
     parser::symbol_type s = parser::make_INT (12);
+    assert_eq (s.kind (), parser::symbol_kind::S_INT);
+    assert_eq (parser::symbol_name (s.kind ()), std::string ("\"int\""));
+    assert_eq (s.name (), std::string ("\"int\""));
     assert_eq (s.value.as<int> (), 12);
   }
 
@@ -180,12 +193,13 @@
   }
 
   // stack_symbol_type: construction, accessor.
+  typedef parser::yy_stack_symbol_type stack_symbol_type;
   {
 #if 201103L <= YY_CPLUSPLUS
-    auto ss = parser::stack_symbol_type(1, parser::make_INT(123));
+    auto ss = stack_symbol_type (1, parser::make_INT(123));
 #else
     parser::symbol_type s = parser::make_INT (123);
-    parser::stack_symbol_type ss(1, s);
+    stack_symbol_type ss(1, s);
 #endif
     assert_eq (ss.value.as<int> (), 123);
   }
@@ -194,17 +208,17 @@
   // Sufficiently many so that it will be resized.
   // Probably 3 times (starting at 200).
   {
-    parser::stack_type st;
+    parser::yy_stack_type st;
     const int mucho = 1700;
     const int int_reduction_state = 1; // Read list.output to find it.
     for (int i = 0; i < mucho; ++i)
       {
 #if 201103L <= YY_CPLUSPLUS
-        st.push(parser::stack_symbol_type{int_reduction_state,
-                                          parser::make_INT (i)});
+        st.push(stack_symbol_type{int_reduction_state,
+                                  parser::make_INT (i)});
 #else
         parser::symbol_type s = parser::make_INT (i);
-        parser::stack_symbol_type ss (int_reduction_state, s);
+        stack_symbol_type ss (int_reduction_state, s);
         st.push (ss);
 #endif
       }
@@ -385,7 +399,7 @@
 // Starting with :: to ensure we don't output "<::" which starts by the
 // digraph for the left square bracket.
 %type <::string> item;
-// Using the template type to exercize its parsing.
+// Using the template type to exercise its parsing.
 %type <::std::vector<string>> list;
 
 %printer { yyo << $$; } <int> <::string> <::std::vector<string>>;
@@ -423,7 +437,7 @@
   {
     // The 5 is a syntax error whose recovery requires that we discard
     // the lookahead.  This tests a regression, see
-    // <http://savannah.gnu.org/support/?108481>.
+    // <https://savannah.gnu.org/support/?108481>.
     static char const *input = "0,1,2,3,45,6";
     switch (int stage = *input++)
     {
@@ -431,13 +445,13 @@
         return parser::make_END_OF_FILE (]AT_LOCATION_IF([location ()])[);]],
 [AT_LOCATION_IF([
         *llocp = location ();])[
-        return parser::token::END_OF_FILE;]])[
+        return ]AT_TOKEN([END_OF_FILE])[;]])[
 
       case ',':]AT_TOKEN_CTOR_IF([[
         return parser::make_COMMA (]AT_LOCATION_IF([location ()])[);]],
 [AT_LOCATION_IF([
         *llocp = location ();])[
-        return parser::token::COMMA;]])[
+        return ]AT_TOKEN([COMMA])[;]])[
 
       default:
         stage = stage - '0';
@@ -446,14 +460,14 @@
            return parser::make_NUMBER (stage]AT_LOCATION_IF([, location ()])[);]], [[
            lvalp->BUILD (int, stage);]AT_LOCATION_IF([
            *llocp = location ();])[
-           return parser::token::NUMBER;]])[
+           return ]AT_TOKEN(NUMBER)[;]])[
          }
        else
          {]AT_TOKEN_CTOR_IF([[
            return parser::make_TEXT (to_string (stage)]AT_LOCATION_IF([, location ()])[);]], [[
            lvalp->BUILD (string, to_string (stage));]AT_LOCATION_IF([
            *llocp = location ();])[
-           return parser::token::TEXT;]])[
+           return ]AT_TOKEN([TEXT])[;]])[
          }
     }
   }
@@ -569,7 +583,7 @@
 
 AT_SETUP([Variants and Typed Midrule Actions])
 
-# See http://lists.gnu.org/archive/html/bug-bison/2017-06/msg00000.html.
+# See https://lists.gnu.org/r/bug-bison/2017-06/msg00000.html.
 #
 # Check that typed midrule actions behave properly (pre-construction
 # of $$ before the user action, support of %printer and %destructor,
@@ -579,7 +593,7 @@
 
 AT_DATA_GRAMMAR([[input.y]],
 [[%skeleton "lalr1.cc"
-%defines
+%header
 
 %debug
 %define parse.assert
@@ -648,23 +662,28 @@
 AT_PARSER_CHECK([[input]], [[0]], [[]],
 [[Starting parse
 Entering state 0
-Reading a token: Next token is token NUMBER (1)
+Stack now 0
+Reading a token
+Next token is token NUMBER (1)
 Shifting token NUMBER (1)
 Entering state 1
+Stack now 0 1
 Reducing stack by rule 1 (line 34):
    $1 = token NUMBER (1)
 -> $$ = nterm expr (10)
 destroy: 1
-Stack now 0
 Entering state 2
-Reading a token: Next token is token NUMBER (30)
+Stack now 0 2
+Reading a token
+Next token is token NUMBER (30)
 Reducing stack by rule 2 (line 35):
 -> $$ = nterm @1 (20)
-Stack now 2 0
 Entering state 4
+Stack now 0 2 4
 Next token is token NUMBER (30)
 Shifting token NUMBER (30)
 Entering state 5
+Stack now 0 2 4 5
 Reducing stack by rule 3 (line 35):
    $1 = nterm expr (10)
    $2 = nterm @1 (20)
@@ -674,11 +693,14 @@
 destroy: 30
 destroy: 20
 destroy: 10
-Stack now 0
 Entering state 2
-Reading a token: Next token is token EOI ()
+Stack now 0 2
+Reading a token
+Next token is token EOI ()
 Shifting token EOI ()
 Entering state 3
+Stack now 0 2 3
+Stack now 0 2 3
 Cleanup: popping token EOI ()
 Cleanup: popping nterm expr (40)
 destroy: 40
@@ -705,7 +727,7 @@
 [[%require "3.2"
 %skeleton "lalr1.cc"
 %locations
-%defines
+%header
 %debug
 %%
 exp: %empty;
@@ -788,12 +810,10 @@
 [[%language "C++"
 %define api.namespace {]$1[}
 %union { int i; }
-%define global_tokens_and_yystype
 %locations
 
 %code {
-  // YYSTYPE contains a namespace reference.
-  int yylex (YYSTYPE *lval, const ]$1[::parser::location_type*) {
+  int yylex (]$1[::parser::semantic_type *lval, const ]$1[::parser::location_type*) {
     lval->i = 3;
     return 0;
   }
@@ -944,12 +964,12 @@
 
 AT_DATA_GRAMMAR([[input.yy]],
 [[$1
-%defines
+%header
 
 %code
 {
   #include <cstdlib>
-  int yylex (yy::parser::semantic_type *);
+  int yylex (yy::parser::value_type *);
 }
 
 %define parse.error verbose
@@ -993,7 +1013,7 @@
 
 // 'a': valid item, 's': syntax error, 'l': lexical error.
 int
-yylex (yy::parser::semantic_type *lval)
+yylex (yy::parser::value_type *lval)
 {
   switch (int res = getchar ())
   {
@@ -1011,6 +1031,7 @@
 AT_BISON_CHECK([[-o input.cc input.yy]])
 
 AT_FOR_EACH_CXX([
+  AT_GLR2_CC_IF([AT_REQUIRE_CXX_STD(11, [echo "$at_std not supported"; continue])])
   AT_LANG_COMPILE([[input]], [[input.cc scan.cc]])
 
   # Leave enough valid tokens to make sure we recovered from the
@@ -1042,6 +1063,7 @@
 
 AT_TEST([%skeleton "lalr1.cc"])
 AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
 
 m4_popdef([AT_TEST])
 
@@ -1212,10 +1234,10 @@
 
 item:
   'a'     { $$ = $][1; }
-| 'e'     { YYUSE ($$); YYUSE ($][1); error ("syntax error"); }
+| 'e'     { YY_USE ($$); YY_USE ($][1); error ("syntax error"); }
 // Not just 'E', otherwise we reduce when 'E' is the lookahead, and
 // then the stack is emptied, defeating the point of the test.
-| 'E' 'a' { YYUSE ($][1); $$ = $][2; }
+| 'E' 'a' { YY_USE ($][1); $$ = $][2; }
 | 'R'     { ]AT_VARIANT_IF([], [$$ = YY_NULLPTR; delete $][1]; )[YYERROR; }
 | 'p'     { $$ = $][1; }
 | 's'     { $$ = $][1; throw std::runtime_error ("reduction"); }
@@ -1322,7 +1344,7 @@
 ]])
 
 AT_PARSER_CHECK([[input aaaaE]], [[2]], [[]],
-[[exception caught: syntax error, unexpected $end, expecting 'a'
+[[exception caught: syntax error, unexpected end of file, expecting 'a'
 ]])
 
 AT_PARSER_CHECK([[input aaaaT]], [[1]])
@@ -1348,7 +1370,7 @@
 
 AT_SETUP([[C++ GLR parser identifier shadowing]])
 
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%skeleton "glr.cc"])
 AT_DATA_GRAMMAR([input.yy], [
 %skeleton "glr.cc"
 
@@ -1374,8 +1396,8 @@
   // Note: this argument is unused, but named on purpose.  There used to be a
   // bug with a macro that erroneously expanded this identifier to
   // yystackp->yyval.
-  YYUSE (lvalp);
-  return yy::parser::token::ZERO;
+  YY_USE (lvalp);
+  return ]AT_TOKEN([ZERO])[;
 }
 
 void yy::parser::error (std::string const&)
@@ -1432,7 +1454,7 @@
 mkdir -p include/ast
 
 AT_TEST([x1],
-        [%defines
+        [%header
          %locations
          %define api.location.file "include/ast/loc.hh"
          %define api.location.include {<ast/loc.hh>}])
@@ -1447,7 +1469,7 @@
 ]])
 
 AT_TEST([x2],
-        [%defines
+        [%header
          %locations
          %code requires {#include <ast/loc.hh>}
          %define api.location.type {x1::location}])
diff --git a/tests/calc.at b/tests/calc.at
index 4d15b73..5e46304 100644
--- a/tests/calc.at
+++ b/tests/calc.at
@@ -1,6 +1,6 @@
 # Simple calculator.                         -*- Autotest -*-
 
-# Copyright (C) 2000-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2000-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,20 +13,52 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 ## ---------------------------------------------------- ##
 ## Compile the grammar described in the documentation.  ##
 ## ---------------------------------------------------- ##
 
+
+m4_pushdef([AT_CALC_MAIN],  [AT_LANG_DISPATCH([$0], $@)])
+m4_pushdef([AT_CALC_YYLEX], [AT_LANG_DISPATCH([$0], $@)])
+
 # -------------- #
-# AT_CALC_MAIN.  #
+# AT_DATA_CALC.  #
 # -------------- #
 
-m4_pushdef([AT_CALC_MAIN],   [AT_LANG_DISPATCH([$0], $@)])
 
+# _AT_DATA_CALC_Y($1, $2, $3, [BISON-DIRECTIVES])
+# -----------------------------------------------
+# Produce 'calc.y' and, if %header was specified, 'calc-lex.c' or
+# 'calc-lex.cc'.
+#
+# Don't call this macro directly, because it contains some occurrences
+# of '$1' etc. which will be interpreted by m4.  So you should call it
+# with $1, $2, and $3 as arguments, which is what AT_DATA_CALC_Y does.
+#
+# When %header is not passed, generate a single self-contained file.
+# Otherwise, generate three: calc.y with the parser, calc-lex.c with
+# the scanner, and calc-main.c with "main()".  This is in order to
+# stress the use of the generated parser header.  To avoid code
+# duplication, AT_CALC_YYLEX and AT_CALC_MAIN contain the body of these
+# two later files.
+m4_pushdef([_AT_DATA_CALC_Y],
+[m4_if([$1$2$3], $[1]$[2]$[3], [],
+       [m4_fatal([$0: Invalid arguments: $@])])dnl
+AT_LANG_DISPATCH([$0], $@)])
+
+
+
+## ----------- ##
+## Calc in C.  ##
+## ----------- ##
+
+# AT_CALC_MAIN(c).
 m4_define([AT_CALC_MAIN(c)],
 [[#include <assert.h>
+#include <stdlib.h> /* exit */
+#include <string.h> /* strcmp */
 #include <unistd.h>
 
 ]AT_CXX_IF([[
@@ -34,9 +66,9 @@
 {
   /* A C++ ]AT_NAME_PREFIX[parse that simulates the C signature.  */
   int
-  ]AT_NAME_PREFIX[parse (]AT_PARAM_IF([semantic_value *result, int *count]))[
+  ]AT_NAME_PREFIX[parse (]AT_PARAM_IF([semantic_value *result, int *count, int *nerrs]))[
   {
-    ]AT_NAME_PREFIX[::parser parser]AT_PARAM_IF([ (result, count)])[;
+    ]AT_NAME_PREFIX[::parser parser]AT_PARAM_IF([ (result, count, nerrs)])[;
   #if ]AT_API_PREFIX[DEBUG
     parser.set_debug_level (1);
   #endif
@@ -45,16 +77,37 @@
 }
 ]])[
 
+/* Value of the last computation.  */
 semantic_value global_result = 0;
+/* Total number of computations.  */
 int global_count = 0;
+/* Total number of errors.  */
+int global_nerrs = 0;
+
+#ifndef EX_NOINPUT
+# define EX_NOINPUT 66
+#endif
+
+static FILE *
+open_file (const char *file)
+{
+  FILE *res = (file && *file && strcmp (file, "-")) ? fopen (file, "r") : stdin;
+  if (!res)
+    {
+      perror (file);
+      exit (EX_NOINPUT);
+    }
+  return res;
+}
 
 /* A C main function.  */
 int
 main (int argc, const char **argv)
-{
+{]AT_PARAM_IF([[
   semantic_value result = 0;
   int count = 0;
-  int status;
+  int nerrs = 0;]])[
+  int status = 0;
 
   /* This used to be alarm (10), but that isn't enough time for a July
      1995 vintage DEC Alphastation 200 4/100 system, according to
@@ -63,51 +116,53 @@
 
   alarm (200);
 
-  if (argc == 2)
-    input = fopen (argv[1], "r");
-  else
-    input = stdin;
-
-  if (!input)
-    {
-      perror (argv[1]);
-      return 3;
-    }
-
 ]AT_CXX_IF([], [AT_DEBUG_IF([  ]AT_NAME_PREFIX[debug = 1;])])[
-  status = ]AT_NAME_PREFIX[parse (]AT_PARAM_IF([[&result, &count]])[);
-  if (fclose (input))
-    perror ("fclose");
+
+  {
+    int i;
+    for (i = 1; i < argc; ++i)
+      {
+]AT_MULTISTART_IF([[
+        if (!strcmp (argv[i], "--exp") && i+1 < argc)
+          {
+            input = open_file (argv[i+1]);
+            ignore_eol = 1;
+            ]AT_NAME_PREFIX[parse_exp_t res = ]AT_NAME_PREFIX[parse_exp ();
+            printf ("exp => %d (status: %d, errors: %d)\n",
+                    res.yystatus == 0 ? res.yyvalue : 0, res.yystatus, res.yynerrs);
+            status = res.yystatus;
+            ++i;
+          }
+        else if (!strcmp (argv[i], "--num") && i+1 < argc)
+          {
+            input = open_file (argv[i+1]);
+            ignore_eol = 1;
+            ]AT_NAME_PREFIX[parse_NUM_t res = ]AT_NAME_PREFIX[parse_NUM ();
+            printf ("NUM => %d (status: %d, errors: %d)\n",
+                    res.yystatus == 0 ? res.yyvalue : 0, res.yystatus, res.yynerrs);
+            status = res.yystatus;
+            ++i;
+          }
+        else]])[
+          {
+            input = open_file (argv[i]);
+            status = ]AT_NAME_PREFIX[parse (]AT_PARAM_IF([[&result, &count, &nerrs]])[);
+          }
+        if (input != stdin && fclose (input))
+          perror ("fclose");
+      }
+  }
+]AT_PARAM_IF([[
   assert (global_result == result); (void) result;
-  assert (global_count == count);   (void) count;
+  assert (global_count  == count);  (void) count;
+  assert (global_nerrs  == nerrs);  (void) nerrs;
+  printf ("final: %d %d %d\n", global_result, global_count, global_nerrs);]])[
   return status;
 }
 ]])
 
-m4_copy([AT_CALC_MAIN(c)], [AT_CALC_MAIN(c++)])
 
-m4_define([AT_CALC_MAIN(d)],
-[[int main (string[] args)
-{
-  semantic_value result = 0;
-  int count = 0;
-
-  File input = args.length == 2 ? File (args[1], "r") : stdin;
-  auto l = calcLexer (input);
-  auto p = new YYParser (l);
-  return !p.parse ();
-}
-]])
-
-
-
-# --------------- #
-# AT_CALC_YYLEX.  #
-# --------------- #
-
-m4_pushdef([AT_CALC_YYLEX],   [AT_LANG_DISPATCH([$0], $@)])
-
-
+# AT_CALC_YYLEX(c).
 m4_define([AT_CALC_YYLEX(c)],
 [[#include <ctype.h>
 
@@ -176,169 +231,46 @@
   /* Skip white spaces.  */
   do
     {
-]AT_LOCATION_IF(
-[     AT_LOC_FIRST_COLUMN = AT_LOC_LAST_COLUMN;
+]AT_LOCATION_IF([
+      AT_LOC_FIRST_COLUMN = AT_LOC_LAST_COLUMN;
       AT_LOC_FIRST_LINE   = AT_LOC_LAST_LINE;
 ])[
     }
-  while ((c = get_char (]AT_YYLEX_ARGS[)) == ' ' || c == '\t');
+  while ((c = get_char (]AT_YYLEX_ARGS[)) == ' '
+         || c == '\t'
+         || (ignore_eol && c == '\n'));
 
   /* Process numbers.   */
   if (isdigit (c))
     {
       unget_char (]AT_YYLEX_PRE_ARGS[ c);
-      ]AT_VAL[.ival = read_integer (]AT_YYLEX_ARGS[);
-      return ]AT_TOKEN_PREFIX[NUM;
+      ]AT_VAL[.]AT_VALUE_UNION_IF([NUM], [ival])[ = read_integer (]AT_YYLEX_ARGS[);
+      return ]AT_TOKEN([NUM])[;
     }
 
   /* Return end-of-file.  */
   if (c == EOF)
-    return ]AT_TOKEN_PREFIX[CALC_EOF;
+    return ]AT_TOKEN([CALC_EOF])[;
+
+  /* An explicit error raised by the scanner. */
+  if (c == '#')
+    {]AT_LOCATION_IF([
+      fprintf (stderr, "%d.%d: ",
+               AT_LOC_FIRST_LINE, AT_LOC_FIRST_COLUMN);])[
+      fputs ("syntax error: invalid character: '#'\n", stderr);
+      return ]AT_TOKEN(AT_API_PREFIX[][error])[;
+    }
 
   /* Return single chars. */
   return c;
 }
 ]])
 
-m4_copy([AT_CALC_YYLEX(c)], [AT_CALC_YYLEX(c++)])
 
-m4_define([AT_CALC_YYLEX(d)],
-[[import std.range.primitives;
-import std.stdio;
-
-auto calcLexer(R)(R range)
-  if (isInputRange!R && is (ElementType!R : dchar))
-{
-  return new CalcLexer!R(range);
-}
-
-auto calcLexer (File f)
-{
-  import std.algorithm : map, joiner;
-  import std.utf : byDchar;
-
-  return f.byChunk(1024)        // avoid making a syscall roundtrip per char
-          .map!(chunk => cast(char[]) chunk) // because byChunk returns ubyte[]
-          .joiner               // combine chunks into a single virtual range of char
-          .calcLexer;           // forward to other overload
-}
-
-class CalcLexer(R) : Lexer
-  if (isInputRange!R && is (ElementType!R : dchar))
-{
-  R input;
-
-  this(R r) {
-    input = r;
-  }
-
-  ]AT_YYERROR_DEFINE[
-
-  YYSemanticType semanticVal_;]AT_LOCATION_IF([[
-  YYLocation location = new YYLocation;
-
-  public final @property YYPosition startPos()
-  {
-    return location.begin;
-  }
-
-  public final @property YYPosition endPos()
-  {
-    return location.end;
-  }
-]])[
-  public final @property YYSemanticType semanticVal()
-  {
-    return semanticVal_;
-  }
-
-  int parseInt ()
-  {
-    auto res = 0;
-    import std.uni : isNumber;
-    while (input.front.isNumber)
-      {
-        res = res * 10 + (input.front - '0');]AT_LOCATION_IF([[
-        location.end.column += 1;]])[
-        input.popFront;
-      }
-    return res;
-  }
-
-  int yylex ()
-  {]AT_LOCATION_IF([[
-    location.begin = location.end;]])[
-
-    import std.uni : isWhite, isNumber;
-
-    // Skip initial spaces
-    while (!input.empty && input.front != '\n' && isWhite (input.front))
-      {
-        input.popFront;]AT_LOCATION_IF([[
-        location.begin.column += 1;
-        location.end.column += 1;]])[
-      }
-
-    // Handle EOF.
-    if (input.empty)
-      return YYTokenType.EOF;
-
-    // Numbers.
-    if (input.front.isNumber)
-      {
-        semanticVal_.ival = parseInt;
-        return YYTokenType.NUM;
-      }
-
-    // Individual characters
-    auto c = input.front;]AT_LOCATION_IF([[
-    if (c == '\n')
-      {
-        location.end.line += 1;
-        location.end.column = 1;
-      }
-    else
-      location.end.column += 1;]])[
-    input.popFront;
-    return c;
-  }
-}
-]])
-
-
-# -------------- #
-# AT_DATA_CALC.  #
-# -------------- #
-
-
-# _AT_DATA_CALC_Y($1, $2, $3, [BISON-DIRECTIVES])
-# -----------------------------------------------
-# Produce 'calc.y' and, if %defines was specified, 'calc-lex.c' or
-# 'calc-lex.cc'.
-#
-# Don't call this macro directly, because it contains some occurrences
-# of '$1' etc. which will be interpreted by m4.  So you should call it
-# with $1, $2, and $3 as arguments, which is what AT_DATA_CALC_Y does.
-#
-# When %defines is not passed, generate a single self-contained file.
-# Otherwise, generate three: calc.y with the parser, calc-lex.c with
-# the scanner, and calc-main.c with "main()".  This is in order to
-# stress the use of the generated parser header.  To avoid code
-# duplication, AT_CALC_YYLEX and AT_CALC_MAIN contain the body of these
-# two later files.
-m4_define([_AT_DATA_CALC_Y],
-[m4_if([$1$2$3], $[1]$[2]$[3], [],
-       [m4_fatal([$0: Invalid arguments: $@])])dnl
-
-AT_DATA_GRAMMAR([calc.y],
+m4_define([_AT_DATA_CALC_Y(c)],
+[AT_DATA_GRAMMAR([calc.y.tmp],
 [[/* Infix notation calculator--calc */
 ]$4[
-]AT_CXX_IF([%define global_tokens_and_yystype])[
-]AT_D_IF([[
-%code imports {
-  alias semantic_value = int;
-}
-]], [[
 %code requires
 {
 ]AT_LOCATION_TYPE_SPAN_IF([[
@@ -377,24 +309,26 @@
   /* Exercise pre-prologue dependency to %union.  */
   typedef int semantic_value;
 }
-]])[
 
-/* Exercise %union. */
+]AT_VALUE_UNION_IF([],
+[[/* Exercise %union. */
 %union
 {
   semantic_value ival;
-};
+};]])[
 %printer { ]AT_CXX_IF([[yyo << $$]],
-                      [[fprintf (yyo, "%d", $$)]])[; } <ival>;
+                      [[fprintf (yyo, "%d", $$)]])[; } <]AT_VALUE_UNION_IF([int], [ival])[>;
 
-]AT_D_IF([], [[
 %code provides
 {
   #include <stdio.h>
   /* The input.  */
   extern FILE *input;
+  /* Whether \n is a blank.  */
+  extern int ignore_eol;
   extern semantic_value global_result;
   extern int global_count;
+  extern int global_nerrs;
 }
 
 %code
@@ -404,12 +338,27 @@
   #define USE(Var)
 
   FILE *input;
+  int ignore_eol = 0;
   static int power (int base, int exponent);
 
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE_EXTERN[
+
+  ]AT_TOKEN_TRANSLATE_IF([[
+#define N_
+    static
+    const char *
+    _ (const char *cp)
+    {
+      if (strcmp (cp, "end of input") == 0)
+        return "end of file";
+      else if (strcmp (cp, "number") == 0)
+        return "nombre";
+      else
+        return cp;
+    }
+  ]])[
 }
-]])[
 
 ]AT_LOCATION_TYPE_SPAN_IF([[
 %initial-action
@@ -419,9 +368,9 @@
 }]])[
 
 /* Bison Declarations */
-%token CALC_EOF 0 "end of input"
-%token <ival> NUM "number"
-%type  <ival> exp
+%token CALC_EOF 0 ]AT_TOKEN_TRANSLATE_IF([_("end of file")], ["end of input"])[
+%token <]AT_VALUE_UNION_IF([int], [ival])[> NUM   "number"
+%type  <]AT_VALUE_UNION_IF([int], [ival])[> exp
 
 %nonassoc '='   /* comparison          */
 %left '-' '+'
@@ -438,29 +387,68 @@
 
 line:
   '\n'
-| exp '\n'           { ]AT_PARAM_IF([*result = global_result = $1;], [AT_D_IF([], [USE ($1);])])[ }
+| exp '\n'           { ]AT_PARAM_IF([*result = global_result = $1;], [USE ($1);])[ }
 ;
 
 exp:
   NUM
 | exp '=' exp
   {
-    if ($1 != $3)]AT_D_IF([
-      stderr.writefln ("calc: error: %d != %d", $1, $3);], [
-      fprintf (stderr, "calc: error: %d != %d\n", $1, $3);], [
-      ])[
+    if ($1 != $3)]AT_LANG_CASE(
+      [c], [[
+      {
+        char buf[1024];
+        snprintf (buf, sizeof buf, "error: %d != %d", $1, $3);]AT_YYERROR_ARG_LOC_IF([[
+        yyerror (&@$, ]AT_PARAM_IF([result, count, nerrs, ])[buf);]], [[
+        {
+          YYLTYPE old_yylloc = yylloc;
+          yylloc = @$;
+          yyerror (]AT_PARAM_IF([result, count, nerrs, ])[buf);
+          yylloc = old_yylloc;
+        }
+        ]])[
+      }]],
+      [c++], [[
+      {
+        char buf[1024];
+        snprintf (buf, sizeof buf, "error: %d != %d", $1, $3);
+        ]AT_GLR_IF([[yyparser.]])[error (]AT_LOCATION_IF([[@$, ]])[buf);
+      }]])[
     $$ = $1;
   }
-| exp '+' exp        { $$ = $1 + $3;        }
-| exp '-' exp        { $$ = $1 - $3;        }
-| exp '*' exp        { $$ = $1 * $3;        }
-| exp '/' exp        { $$ = $1 / $3;        }
-| '-' exp  %prec NEG { $$ = -$2;            }
+| exp '+' exp        { $$ = $1 + $3; }
+| exp '-' exp        { $$ = $1 - $3; }
+| exp '*' exp        { $$ = $1 * $3; }
+| exp '/' exp
+  {
+    if ($3 == 0)]AT_LANG_CASE(
+      [c], [[
+      {]AT_YYERROR_ARG_LOC_IF([[
+        yyerror (&@3, ]AT_PARAM_IF([result, count, nerrs, ])["error: null divisor");]], [[
+        {
+          YYLTYPE old_yylloc = yylloc;
+          yylloc = @3;
+          yyerr][or (]AT_PARAM_IF([result, count, nerrs, ])["error: null divisor");
+          yylloc = old_yylloc;
+        }
+        ]])[
+      }]],
+      [c++], [[
+      {
+        ]AT_GLR_IF([[yyparser.]])[err][or (]AT_LOCATION_IF([[@3, ]])["error: null divisor");
+      }]])[
+    else
+      $$ = $1 / $3;
+  }
+| '-' exp  %prec NEG { $$ = -$2; }
 | exp '^' exp        { $$ = power ($1, $3); }
-| '(' exp ')'        { $$ = $2;             }
-| '(' error ')'      { $$ = 1111; ]AT_D_IF([], [yyerrok;])[  }
-| '!'                { $$ = 0; ]AT_D_IF([return YYERROR], [YYERROR])[;     }
-| '-' error          { $$ = 0; ]AT_D_IF([return YYERROR], [YYERROR])[;     }
+| '(' exp ')'        { $$ = $2; }
+| '(' error ')'      { $$ = 1111; yyerrok; }
+| '-' error          { $$ = 0; YYERROR; }
+| '!' '!'            { $$ = 0; YYERROR; }
+| '!' '+'            { $$ = 0; YYACCEPT; }
+| '!' '-'            { $$ = 0; YYABORT; }]AT_C_IF([[
+| '!' '*'            { $$ = 0; YYNOMEM; }]])[
 ;
 %%
 
@@ -501,11 +489,23 @@
 }
 ]])])[
 ]AT_YYERROR_DEFINE[
-]AT_DEFINES_IF([],
+]AT_HEADER_IF([],
 [AT_CALC_YYLEX
 AT_CALC_MAIN])])
 
-AT_DEFINES_IF([AT_DATA_SOURCE([[calc-lex.]AT_LANG_EXT],
+# Remove the generated prototypes.
+AT_CHECK(
+  [AT_YACC_IF([[
+    if "$POSIXLY_CORRECT_IS_EXPORTED"; then
+      sed -e '/\/\* !POSIX \*\//d' calc.y.tmp >calc.y
+    else
+      mv calc.y.tmp calc.y
+    fi
+  ]],
+  [[mv calc.y.tmp calc.y]])
+])
+
+AT_HEADER_IF([AT_DATA_SOURCE([[calc-lex.]AT_LANG_EXT],
 [[#include "calc.]AT_LANG_HDR["
 
 ]AT_CALC_YYLEX])
@@ -514,21 +514,452 @@
 
 ]AT_CALC_MAIN])
 ])
-])# _AT_DATA_CALC_Y
+])# _AT_DATA_CALC_Y(c)
+
+
+
+## ------------- ##
+## Calc in C++.  ##
+## ------------- ##
+
+m4_copy([AT_CALC_MAIN(c)], [AT_CALC_MAIN(c++)])
+m4_copy([AT_CALC_YYLEX(c)], [AT_CALC_YYLEX(c++)])
+m4_copy([_AT_DATA_CALC_Y(c)], [_AT_DATA_CALC_Y(c++)])
+
+
+## ----------- ##
+## Calc in D.  ##
+## ----------- ##
+
+# AT_YYLEX_RETURN_VAL
+# -------------------
+# Produce the return value for yylex().
+m4_define([AT_YYLEX_RETURN_VAL],
+[return dnl
+AT_TOKEN_CTOR_IF(
+  [[Symbol.]AT_TOKEN_PREFIX[$1](m4_ifval([$2], [$2])[]AT_LOCATION_IF([m4_ifval([$2], [, ])[location]])[);]],
+  [[Symbol(TokenKind.]AT_TOKEN_PREFIX[$1]m4_ifval([$2], [, $2])[]AT_LOCATION_IF([[, location]])[);]])]
+)
+
+# AT_CALC_MAIN(d).
+m4_define([AT_CALC_MAIN(d)],
+[[int main (string[] args)
+{]AT_PARAM_IF([[
+  semantic_value result = 0;
+  int count = 0;]])[
+
+  File input = args.length == 2 ? File (args[1], "r") : stdin;
+  auto l = calcLexer (input);
+  auto p = new YYParser (l);]AT_DEBUG_IF([[
+  p.setDebugLevel (1);]])[
+  return !p.parse();
+}
+]])
+
+m4_define([AT_CALC_YYLEX(d)],
+[[import std.range.primitives;
+import std.stdio;
+
+auto calcLexer(R)(R range)
+if (isInputRange!R && is (ElementType!R : dchar))
+{
+  return new CalcLexer!R(range);
+}
+
+auto calcLexer (File f)
+{
+  import std.algorithm : map, joiner;
+  import std.utf : byDchar;
+
+  return f.byChunk(1024)        // avoid making a syscall roundtrip per char
+          .map!(chunk => cast(char[]) chunk) // because byChunk returns ubyte[]
+          .joiner               // combine chunks into a single virtual range of char
+          .calcLexer;           // forward to other overload
+}
+
+class CalcLexer(R) : Lexer
+if (isInputRange!R && is (ElementType!R : dchar))
+{
+  R input;
+
+  this(R r) { input = r; }
+
+  ]AT_YYERROR_DEFINE[
+]AT_LOCATION_IF([[
+  Location location;
+]])[
+  int parseInt ()
+  {
+    auto res = 0;
+    import std.uni : isNumber;
+    while (input.front.isNumber)
+    {
+      res = res * 10 + (input.front - '0');]AT_LOCATION_IF([[
+      location.end.column += 1;]])[
+      input.popFront;
+    }
+    return res;
+  }
+
+  Symbol yylex ()
+  {]AT_LOCATION_IF([[
+    location.step();]])[
+
+    import std.uni : isWhite, isNumber;
+
+    // Skip initial spaces
+    while (!input.empty && input.front != '\n' && isWhite (input.front))
+    {
+      input.popFront;]AT_LOCATION_IF([[
+      location.end.column += 1;]])[
+    }]AT_LOCATION_IF([[
+    location.step();]])[
+
+    // EOF.
+    if (input.empty)
+      ]AT_YYLEX_RETURN_VAL([EOF])[
+    // Numbers.
+    if (input.front.isNumber)
+      ]AT_YYLEX_RETURN_VAL([NUM], [parseInt])[
+
+    // Individual characters
+    auto c = input.front;]AT_LOCATION_IF([[
+    if (c == '\n')
+    {
+      location.end.line += 1;
+      location.end.column = 1;
+    }
+    else
+      location.end.column += 1;]])[
+    input.popFront;
+
+    // An explicit error raised by the scanner. */
+    if (c == '#')
+    {
+      stderr.writeln (]AT_LOCATION_IF([location, ": ", ])["syntax error: invalid character: '#'");
+      ]AT_YYLEX_RETURN_VAL([YYerror])[
+    }
+
+    switch (c)
+    {
+      case '+':  ]AT_YYLEX_RETURN_VAL([PLUS])[
+      case '-':  ]AT_YYLEX_RETURN_VAL([MINUS])[
+      case '*':  ]AT_YYLEX_RETURN_VAL([STAR])[
+      case '/':  ]AT_YYLEX_RETURN_VAL([SLASH])[
+      case '(':  ]AT_YYLEX_RETURN_VAL([LPAR])[
+      case ')':  ]AT_YYLEX_RETURN_VAL([RPAR])[
+      case '\n': ]AT_YYLEX_RETURN_VAL([EOL])[
+      case '=':  ]AT_YYLEX_RETURN_VAL([EQUAL])[
+      case '^':  ]AT_YYLEX_RETURN_VAL([POW])[
+      case '!':  ]AT_YYLEX_RETURN_VAL([NOT])[
+      default:   ]AT_YYLEX_RETURN_VAL([YYUNDEF])[
+    }
+  }
+}
+]])
+
+m4_define([_AT_DATA_CALC_Y(d)],
+[AT_DATA_GRAMMAR([calc.y],
+[[/* Infix notation calculator--calc */
+]$4[
+%code imports {
+  alias semantic_value = int;
+}
+/* Exercise %union. */
+]AT_UNION_IF([[]], [[%union
+{
+  semantic_value ival;
+};]])[
+%printer { yyo.write($$); } <]AT_UNION_IF([[int]], [[ival]])[>;
+
+%code {
+]AT_TOKEN_TRANSLATE_IF([[
+  static string _(string s)
+  {
+    switch (s)
+    {
+      case "end of input":
+        return "end of file";
+      case "number":
+        return "nombre";
+      default:
+        return s;
+    }
+  }
+]])[
+}
+
+/* Bison Declarations */
+%token EOF 0 ]AT_TOKEN_TRANSLATE_IF([_("end of file")], ["end of input"])[
+%token <]AT_UNION_IF([[int]], [[ival]])[> NUM   "number"
+%type  <]AT_UNION_IF([[int]], [[ival]])[> exp
+
+%token EQUAL  "="
+       MINUS  "-"
+       PLUS   "+"
+       STAR   "*"
+       SLASH  "/"
+       POW    "^"
+       EOL    "'\\n'"
+       LPAR   "("
+       RPAR   ")"
+       NOT    "!"
+
+%nonassoc "="   /* comparison          */
+%left "-" "+"
+%left "*" "/"
+%precedence NEG /* negation--unary minus */
+%right "^"      /* exponentiation        */
+
+/* Grammar follows */
+%%
+input:
+  line
+| input line         { ]AT_PARAM_IF([++*count; ++global_count;])[ }
+;
+
+line:
+  EOL
+| exp EOL            { ]AT_PARAM_IF([*result = global_result = $1;])[ }
+;
+
+exp:
+  NUM
+| exp "=" exp
+  {
+    if ($1 != $3)
+      yyerror (]AT_LOCATION_IF([[@$, ]])[format ("error: %d != %d", $1, $3));
+    $$ = $1;
+  }
+| exp "+" exp        { $$ = $1 + $3; }
+| exp "-" exp        { $$ = $1 - $3; }
+| exp "*" exp        { $$ = $1 * $3; }
+| exp "/" exp
+  {
+    if ($3 == 0)
+      yyerror (]AT_LOCATION_IF([[@3, ]])["error: null divisor");
+    else
+      $$ = $1 / $3;
+  }
+| "-" exp  %prec NEG { $$ = -$2; }
+| exp "^" exp        { $$ = power ($1, $3); }
+| "(" exp ")"        { $$ = $2; }
+| "(" error ")"      { $$ = 1111; yyerrok(); }
+| "-" error          { $$ = 0; return YYERROR; }
+| "!" "!"            { $$ = 0; return YYERROR; }
+| "!" "+"            { $$ = 0; return YYACCEPT; }
+| "!" "-"            { $$ = 0; return YYABORT; }
+;
+%%
+
+int
+power (int base, int exponent)
+{
+  int res = 1;
+  assert (0 <= exponent);
+  for (/* Niente */; exponent; --exponent)
+    res *= base;
+  return res;
+}
+
+]AT_CALC_YYLEX[
+]AT_CALC_MAIN])
+])# _AT_DATA_CALC_Y(d)
+
+
+
+## -------------- ##
+## Calc in Java.  ##
+## -------------- ##
+
+m4_define([AT_CALC_MAIN(java)],
+[[public static void main (String[] args) throws IOException
+  {]AT_LEXPARAM_IF([[
+    Calc p = new Calc (System.in);]], [[
+    CalcLexer l = new CalcLexer (System.in);
+    Calc p = new Calc (l);]])AT_DEBUG_IF([[
+    p.setDebugLevel (1);]])[
+    boolean success = p.parse ();
+    if (!success)
+      System.exit (1);
+  }
+]])
+
+m4_define([AT_CALC_YYLEX(java)],
+[AT_LEXPARAM_IF([[%code lexer {]],
+                [[%code epilogue { class CalcLexer implements Calc.Lexer {]])[
+  StreamTokenizer st;]AT_LOCATION_IF([[
+  PositionReader reader;]])[
+
+  public ]AT_LEXPARAM_IF([[YYLexer]], [[CalcLexer]])[ (InputStream is)
+  {]AT_LOCATION_IF([[
+    reader = new PositionReader (new InputStreamReader (is));
+    st = new StreamTokenizer (reader);]], [[
+    st = new StreamTokenizer (new InputStreamReader (is));]])[
+    st.resetSyntax ();
+    st.eolIsSignificant (true);
+    st.wordChars ('0', '9');
+  }
+
+]AT_LOCATION_IF([[
+  Position start = new Position (1, 0);
+  Position end = new Position (1, 0);
+
+  public Position getStartPos () {
+    return new Position (start);
+  }
+
+  public Position getEndPos () {
+    return new Position (end);
+  }
+
+]])[
+  ]AT_YYERROR_DEFINE[
+
+  Integer yylval;
+
+  public Object getLVal () {
+    return yylval;
+  }
+
+  public int yylex() throws IOException {;]AT_LOCATION_IF([[
+    start.set(reader.getPosition());]])[
+    int tkind = st.nextToken();]AT_LOCATION_IF([[
+    end.set(reader.getPosition());]])[
+    switch (tkind)
+      {
+      case StreamTokenizer.TT_EOF:
+        return CALC_EOF;
+      case StreamTokenizer.TT_EOL:;]AT_LOCATION_IF([[
+        end.line += 1;
+        end.column = 0;]])[
+        return (int) '\n';
+      case StreamTokenizer.TT_WORD:
+        yylval = Integer.parseInt(st.sval);]AT_LOCATION_IF([[
+        end.set(reader.getPreviousPosition());]])[
+        return NUM;
+      case ' ': case '\t':
+        return yylex();
+      case '#':
+        System.err.println(]AT_LOCATION_IF([[start + ": " + ]])["syntax error: invalid character: '#'");
+        return YYerror;
+      default:
+        return tkind;
+      }
+  }
+]AT_LEXPARAM_IF([], [[}]])[
+};
+]])
+
+m4_define([_AT_DATA_CALC_Y(java)],
+[AT_DATA_GRAMMAR([Calc.y],
+[[/* Infix notation calculator--calc */
+%define api.prefix {Calc}
+%define api.parser.class {Calc}
+%define public
+
+]$4[
+
+%code imports {]AT_LOCATION_IF([[
+  import java.io.BufferedReader;]])[
+  import java.io.IOException;
+  import java.io.InputStream;
+  import java.io.InputStreamReader;
+  import java.io.Reader;
+  import java.io.StreamTokenizer;
+}
+
+%code {
+  ]AT_CALC_MAIN[
+
+  ]AT_TOKEN_TRANSLATE_IF([[
+    static String i18n(String s)
+    {
+      if (s.equals ("end of input"))
+        return "end of file";
+      else if (s.equals ("number"))
+        return "nombre";
+      else
+        return s;
+    }
+  ]])[
+}
+
+/* Bison Declarations */
+%token CALC_EOF 0 ]AT_TOKEN_TRANSLATE_IF([_("end of file")], ["end of input"])[
+%token <Integer> NUM "number"
+%type  <Integer> exp
+
+%nonassoc '='       /* comparison            */
+%left '-' '+'
+%left '*' '/'
+%precedence NEG     /* negation--unary minus */
+%right '^'          /* exponentiation        */
+
+/* Grammar follows */
+%%
+input:
+  line
+| input line
+;
+
+line:
+  '\n'
+| exp '\n'
+;
+
+exp:
+  NUM
+| exp '=' exp
+  {
+    if ($1.intValue () != $3.intValue ())
+      yyerror (]AT_LOCATION_IF([[@$, ]])["error: " + $1 + " != " + $3);
+  }
+| exp '+' exp        { $$ = $1 + $3; }
+| exp '-' exp        { $$ = $1 - $3; }
+| exp '*' exp        { $$ = $1 * $3; }
+| exp '/' exp
+  {
+    if ($3.intValue () == 0)
+      yyerror (]AT_LOCATION_IF([[@3, ]])["error: null divisor");
+    else
+      $$ = $1 / $3;
+  }
+| '-' exp  %prec NEG { $$ = -$2; }
+| exp '^' exp        { $$ = (int) Math.pow ($1, $3); }
+| '(' exp ')'        { $$ = $2; }
+| '(' error ')'      { $$ = 1111; }
+| '-' error          { $$ = 0; return YYERROR; }
+| '!' '!'            { $$ = 0; return YYERROR; }
+| '!' '+'            { $$ = 0; return YYACCEPT; }
+| '!' '-'            { $$ = 0; return YYABORT; }
+;
+]AT_CALC_YYLEX[
+]AT_LOCATION_IF([[
+%%
+]AT_JAVA_POSITION_DEFINE])[
+]])
+])# _AT_DATA_JAVA_CALC_Y
+
+
+
+
+## ------------------ ##
+## Calculator tests.  ##
+## ------------------ ##
 
 
 # AT_DATA_CALC_Y([BISON-OPTIONS])
 # -------------------------------
-# Produce 'calc.y' and, if %defines was specified, 'calc-lex.c' or
+# Produce 'calc.y' and, if %header was specified, 'calc-lex.c' or
 # 'calc-lex.cc'.
 m4_define([AT_DATA_CALC_Y],
 [_AT_DATA_CALC_Y($[1], $[2], $[3], [$1])
 ])
 
 
-
-# _AT_CHECK_CALC(BISON-OPTIONS, INPUT, [NUM-STDERR-LINES])
-# --------------------------------------------------------
+# _AT_CHECK_CALC(CALC-OPTIONS, INPUT, [STDOUT], [NUM-STDERR-LINES])
+# -----------------------------------------------------------------
 # Run 'calc' on INPUT and expect no STDOUT nor STDERR.
 #
 # If BISON-OPTIONS contains '%debug' but not '%glr-parser', then
@@ -536,80 +967,116 @@
 # Currently this is ignored, though, since the output format is fluctuating.
 #
 # We don't count GLR's traces yet, since its traces are somewhat
-# different from LALR's.
+# different from LALR's.  Likewise for D.
+#
+# The push traces are the same, except for "Return for a new token", don't
+# count them.
 m4_define([_AT_CHECK_CALC],
 [AT_DATA([[input]],
-[[$2
-]])
-AT_PARSER_CHECK([calc input], 0, [], [stderr])
+[$2
+])
+echo "input:"
+sed -e 's/^/  | /' <input
+AT_JAVA_IF(
+  [AT_JAVA_PARSER_CHECK([Calc $1 < input], 0, [m4_ifvaln(m4_quote($3), [$3])], [stderr])],
+  [AT_PARSER_CHECK([calc $1 input],        0, [m4_ifvaln(m4_quote($3), [$3])], [stderr])])
+AT_LANG_MATCH([c\|c++\|java],
+  [AT_GLR_IF([],
+    [AT_CHECK([$EGREP -c -v 'Return for a new token:|LAC:' stderr],
+              [ignore],
+              [m4_n([AT_DEBUG_IF([$4], [0])])])])])
 ])
 
 
-# _AT_CHECK_CALC_ERROR(BISON-OPTIONS, EXIT-STATUS, INPUT,
-#                      [NUM-STDERR-LINES],
-#                      [VERBOSE-AND-LOCATED-ERROR-MESSAGE])
-# ---------------------------------------------------------
+# _AT_CHECK_CALC_ERROR($1 = BISON-OPTIONS, $2 = EXIT-STATUS, $3 = INPUT,
+#                      $4 = [STDOUT],
+#                      $5 = [NUM-STDERR-LINES],
+#                      $6 = [CUSTOM-ERROR-MESSAGE])
+#                      $7 = [CALC-OPTIONS])
+# ----------------------------------------------------------------------
 # Run 'calc' on INPUT, and expect a 'syntax error' message.
 #
 # If INPUT starts with a slash, it is used as absolute input file name,
 # otherwise as contents.
 #
 # NUM-STDERR-LINES is the number of expected lines on stderr.
-# Currently this is ignored, though, since the output format is fluctuating.
-#
-# If BISON-OPTIONS contains '%location', then make sure the ERROR-LOCATION
-# is correctly output on stderr.
-#
-# If BISON-OPTIONS contains '%define parse.error verbose', then make sure the
-# IF-YYERROR-VERBOSE message is properly output after 'syntax error, '
-# on STDERR.
-#
 # If BISON-OPTIONS contains '%debug' but not '%glr', then NUM-STDERR-LINES
 # is the number of expected lines on stderr.
+#
+# CUSTOM-ERROR-MESSAGE is the expected error message when parse.error
+# is 'custom' and locations are enabled.  Other expected formats are
+# computed from it.
 m4_define([_AT_CHECK_CALC_ERROR],
 [m4_bmatch([$3], [^/],
-           [AT_PARSER_CHECK([calc $3], $2, [], [stderr])],
-           [AT_DATA([[input]],
+  [AT_JAVA_IF(
+    [AT_JAVA_PARSER_CHECK([Calc $7 < $3], $2, [m4_ifvaln(m4_quote($4), [$4])], [stderr])],
+    [AT_PARSER_CHECK([calc $7 $3],        $2, [m4_ifvaln(m4_quote($4), [$4])], [stderr])])],
+  [AT_DATA([[input]],
 [[$3
 ]])
-AT_PARSER_CHECK([calc input], $2, [], [stderr])])
+  echo "input:"
+  sed -e 's/^/  | /' <input
+  AT_JAVA_IF(
+    [AT_JAVA_PARSER_CHECK([Calc $7 < input], $2, [m4_ifvaln(m4_quote($4), [$4])], [stderr])],
+    [AT_PARSER_CHECK([calc $7 input],        $2, [m4_ifvaln(m4_quote($4), [$4])], [stderr])])
+])
 
 # Normalize the observed and expected error messages, depending upon the
 # options.
 # 1. Remove the traces from observed.
-sed '/^Starting/d
+sed '
+/ \$[[0-9$]]* = /d
+/^Cleanup:/d
+/^Discarding/d
 /^Entering/d
-/^Stack/d
+/^Error:/d
+/^LAC:/d
+/^Next/d
+/^Now/d
 /^Reading/d
 /^Reducing/d
 /^Return/d
 /^Shifting/d
+/^Stack/d
+/^Starting/d
 /^state/d
-/^Cleanup:/d
-/^Error:/d
-/^Next/d
-/^Now/d
-/^Discarding/d
-/ \$[[0-9$]]* = /d
-/^yydestructor:/d' stderr >at-stderr
+/^yydestructor:/d
+' stderr >at-stderr
 mv at-stderr stderr
 
 # 2. Create the reference error message.
 AT_DATA([[expout]],
-[$5
-])
+[m4_n([$6])])
 
 # 3. If locations are not used, remove them.
 AT_YYERROR_SEES_LOC_IF([],
 [[sed 's/^[-0-9.]*: //' expout >at-expout
 mv at-expout expout]])
 
-# 4. If error-verbose is not used, strip the', unexpected....' part.
-m4_bmatch([$1], [%define parse.error verbose], [],
+# 4. If parse.error is not custom, turn the expected message to
+# the traditional one.
+AT_ERROR_CUSTOM_IF([], [
+AT_PERL_REQUIRE([[-pi -e 'use strict;
+  s{syntax error on token \[(.*?)\] \(expected: (.*)\)}
+  {
+    my $unexp = $][1;
+    my @exps = $][2 =~ /\[(.*?)\]/g;]AT_D_IF([[
+    # In the case of D, there are no single quotes around the symbols.
+    $unexp =~ s/'"'(.)'"'/$][1/g;
+    s/'"'(.)'"'/$][1/g for @exps;]])[
+    ($][#exps && $][#exps < 4)
+    ? "syntax error, unexpected $unexp, expecting @{[join(\" or \", @exps)]}"
+    : "syntax error, unexpected $unexp";
+  }eg
+' expout]])
+])
+
+# 5. If parse.error is simple, strip the', unexpected....' part.
+AT_ERROR_SIMPLE_IF(
 [[sed 's/syntax error, .*$/syntax error/' expout >at-expout
 mv at-expout expout]])
 
-# 5. Check
+# 6. Actually check.
 AT_CHECK([cat stderr], 0, [expout])
 ])
 
@@ -617,7 +1084,7 @@
 # AT_CHECK_SPACES([FILES])
 # ------------------------
 # Make sure we did not introduce bad spaces.  Checked here because all
-# the skeletons are (or should be) exercized here.
+# the skeletons are (or should be) exercised here.
 m4_define([AT_CHECK_SPACES],
 [AT_PERL_CHECK([-ne '
   chomp;
@@ -633,6 +1100,15 @@
 ])
 
 
+# AT_CHECK_JAVA_GREP(FILE, [LINE], [COUNT=1])
+# -------------------------------------------
+# Check that FILE contains exactly COUNT lines matching ^LINE$
+# with grep.  Unquoted so that COUNT can be a shell expression.
+m4_define([AT_CHECK_JAVA_GREP],
+[AT_CHECK_UNQUOTED([grep -c '^$2$' $1], [ignore], [m4_default([$3], [1])
+])])
+
+
 # AT_CHECK_CALC([BISON-OPTIONS], [COMPILER-OPTIONS])
 # --------------------------------------------------
 # Start a testing chunk which compiles 'calc' grammar with
@@ -646,12 +1122,25 @@
 AT_BISON_OPTION_PUSHDEFS([$1])
 
 AT_DATA_CALC_Y([$1])
-AT_FULL_COMPILE([calc], AT_DEFINES_IF([[lex], [main]], [[], []]), [$2], [-Wno-deprecated])
-AT_CHECK_SPACES([calc.AT_LANG_EXT AT_DEFINES_IF([calc.AT_LANG_HDR])])
+AT_FULL_COMPILE(AT_JAVA_IF([[Calc]], [[calc]]), AT_HEADER_IF([[lex], [main]], [[], []]), [$2], [-Wno-deprecated])
+
+AT_YACC_C_IF(
+  [# No direct calls to malloc/free.
+  AT_CHECK([[$EGREP '(malloc|free) *\(' calc.[ch] | $EGREP -v 'INFRINGES ON USER NAME SPACE']],
+           [1])])
+
+AT_PUSH_IF([AT_JAVA_IF(
+ [# Verify that this is a push parser.
+  AT_CHECK_JAVA_GREP([[Calc.java]],
+                     [[.*public void push_parse_initialize ().*]])])])
+
+AT_CHECK_SPACES([AT_JAVA_IF([Calc], [calc]).AT_LANG_EXT AT_HEADER_IF([AT_JAVA_IF([Calc], [calc]).AT_LANG_HDR])])
 
 # Test the precedences.
-_AT_CHECK_CALC([$1],
-[1 + 2 * 3 = 7
+# The Java traces do not show the clean up sequence at the end,
+# since it does not support %destructor.
+_AT_CHECK_CALC([],
+[[1 + 2 * 3 = 7
 1 + 2 * -3 = -5
 
 -1^2 = -1
@@ -663,26 +1152,40 @@
 1 - (2 - 3) = 2
 
 2^2^3 = 256
-(2^2)^3 = 64],
-               [842])
+(2^2)^3 = 64]],
+[AT_PARAM_IF([final: 64 12 0])],
+               [AT_JAVA_IF([1014], [1017])])
 
 # Some syntax errors.
-_AT_CHECK_CALC_ERROR([$1], [1], [1 2], [15],
-                     [1.3: syntax error, unexpected number])
-_AT_CHECK_CALC_ERROR([$1], [1], [1//2], [20],
-                     [1.3: syntax error, unexpected '/', expecting number or '-' or '(' or '!'])
-_AT_CHECK_CALC_ERROR([$1], [1], [error], [5],
-                     [1.1: syntax error, unexpected $undefined])
-_AT_CHECK_CALC_ERROR([$1], [1], [1 = 2 = 3], [30],
-                     [1.7: syntax error, unexpected '='])
+_AT_CHECK_CALC_ERROR([$1], [1], [1 2],
+                     [AT_PARAM_IF([final: 0 0 1])],
+                     [15],
+                     [AT_JAVA_IF([1.3-1.4], [1.3])[: syntax error on token [number] (expected: ['='] ['-'] ['+'] ['*'] ['/'] ['^'] ['\n'])]])
+_AT_CHECK_CALC_ERROR([$1], [1], [1//2],
+                     [AT_PARAM_IF([final: 0 0 1])],
+                     [20],
+                     [AT_JAVA_IF([1.3-1.4], [1.3])[: syntax error on token ['/'] (expected: [number] ['-'] ['('] ['!'])]])
+_AT_CHECK_CALC_ERROR([$1], [1], [error],
+                     [AT_PARAM_IF([final: 0 0 1])],
+                     [5],
+                     [AT_JAVA_IF([1.1-1.2], [1.1])[: syntax error on token [invalid token] (expected: [number] ['-'] ['\n'] ['('] ['!'])]])
+_AT_CHECK_CALC_ERROR([$1], [1], [1 = 2 = 3],
+                     [AT_PARAM_IF([final: 0 0 1])],
+                     [30],
+                     [AT_LAC_IF(
+                       [AT_JAVA_IF([1.7-1.8], [1.7])[: syntax error on token ['='] (expected: ['-'] ['+'] ['*'] ['/'] ['^'] ['\n'])]],
+                       [AT_JAVA_IF([1.7-1.8], [1.7])[: syntax error on token ['='] (expected: ['-'] ['+'] ['*'] ['/'] ['^'])]])])
 _AT_CHECK_CALC_ERROR([$1], [1],
                      [
 +1],
+                     [AT_PARAM_IF([final: 0 0 1])],
                      [20],
-                     [2.1: syntax error, unexpected '+'])
+                     [AT_JAVA_IF([2.1-2.2], [2.1])[: syntax error on token ['+'] (expected: ]AT_TOKEN_TRANSLATE_IF([[[end of file]]], [[[end of input]]])[ [number] ['-'] ['\n'] ['('] ['!'])]])
 # Exercise error messages with EOF: work on an empty file.
-_AT_CHECK_CALC_ERROR([$1], [1], [/dev/null], [4],
-                     [1.1: syntax error, unexpected end of input])
+_AT_CHECK_CALC_ERROR([$1], [1], [/dev/null],
+                     [AT_PARAM_IF([final: 0 0 1])],
+                     [4],
+                     [[1.1: syntax error on token ]AT_TOKEN_TRANSLATE_IF([[[end of file]]], [[[end of input]]])[ (expected: [number] ['-'] ['\n'] ['('] ['!'])]])
 
 # Exercise the error token: without it, we die at the first error,
 # hence be sure to
@@ -702,29 +1205,110 @@
 #
 _AT_CHECK_CALC_ERROR([$1], [0],
                      [() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1],
+                     [AT_PARAM_IF([final: 4444 0 5])],
                      [250],
-[1.2: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.18: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.23: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.41: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-calc: error: 4444 != 1])
+[AT_JAVA_IF([1.2-1.3], [1.2])[: syntax error on token [')'] (expected: [number] ['-'] ['('] ['!'])
+]AT_JAVA_IF([1.18-1.19], [1.18])[: syntax error on token [')'] (expected: [number] ['-'] ['('] ['!'])
+]AT_JAVA_IF([1.23-1.24], [1.23])[: syntax error on token ['*'] (expected: [number] ['-'] ['('] ['!'])
+]AT_JAVA_IF([1.41-1.42], [1.41])[: syntax error on token ['*'] (expected: [number] ['-'] ['('] ['!'])
+]AT_JAVA_IF([1.1-1.47], [1.1-46])[: error: 4444 != 1]])
 
 # The same, but this time exercising explicitly triggered syntax errors.
 # POSIX says the lookahead causing the error should not be discarded.
-_AT_CHECK_CALC_ERROR([$1], [0], [(!) + (1 2) = 1], [102],
-[1.10: syntax error, unexpected number
-calc: error: 2222 != 1])
-_AT_CHECK_CALC_ERROR([$1], [0], [(- *) + (1 2) = 1], [113],
-[1.4: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.12: syntax error, unexpected number
-calc: error: 2222 != 1])
+_AT_CHECK_CALC_ERROR([$1], [0], [(!!) + (1 2) = 1],
+                     [AT_PARAM_IF([final: 2222 0 2])],
+                     [102],
+[AT_JAVA_IF([1.11-1.12], [1.11])[: syntax error on token [number] (expected: ['='] ['-'] ['+'] ['*'] ['/'] ['^'] [')'])
+]AT_JAVA_IF([1.1-1.17], [1.1-16])[: error: 2222 != 1]])
+
+_AT_CHECK_CALC_ERROR([$1], [0], [(- *) + (1 2) = 1],
+                     [AT_PARAM_IF([final: 2222 0 3])],
+                     [113],
+[AT_JAVA_IF([1.4-1.5], [1.4])[: syntax error on token ['*'] (expected: [number] ['-'] ['('] ['!'])
+]AT_JAVA_IF([1.12-1.13], [1.12])[: syntax error on token [number] (expected: ['='] ['-'] ['+'] ['*'] ['/'] ['^'] [')'])
+]AT_JAVA_IF([1.1-1.18], [1.1-17])[: error: 2222 != 1]])
 
 # Check that yyerrok works properly: second error is not reported,
-# third and fourth are.  Parse status is succesful.
-_AT_CHECK_CALC_ERROR([$1], [0], [(* *) + (*) + (*)], [113],
-[1.2: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.10: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.16: syntax error, unexpected '*', expecting number or '-' or '(' or '!'])
+# third and fourth are.  Parse status is successful.
+_AT_CHECK_CALC_ERROR([$1], [0], [(* *) + (*) + (*)],
+                     [AT_PARAM_IF([final: 3333 0 3])],
+                     [113],
+[AT_JAVA_IF([1.2-1.3], [1.2])[: syntax error on token ['*'] (expected: [number] ['-'] ['('] ['!'])
+]AT_JAVA_IF([1.10-1.11], [1.10])[: syntax error on token ['*'] (expected: [number] ['-'] ['('] ['!'])
+]AT_JAVA_IF([1.16-1.17], [1.16])[: syntax error on token ['*'] (expected: [number] ['-'] ['('] ['!'])]])
+
+
+# Special actions.
+# ----------------
+# !+ => YYACCEPT, !- => YYABORT, !! => YYERROR, !* => YYNOMEM.
+
+# YYACCEPT.
+# Java lacks the traces at the end for cleaning the stack
+# -Stack now 0 8 20
+# -Cleanup: popping token '+' (1.1: )
+# -Cleanup: popping nterm exp (1.1: 7)
+_AT_CHECK_CALC([], [1 + 2 * 3 + !+ ++],
+               [AT_PARAM_IF([final: 0 0 0])],
+               [AT_JAVA_IF([77], [80])])
+# YYABORT.
+_AT_CHECK_CALC_ERROR([$1], [1], [1 + 2 * 3 + !- ++],
+                     [AT_PARAM_IF([final: 0 0 0])],
+                     [102])
+AT_C_IF(
+[# YYNOMEM.
+_AT_CHECK_CALC_ERROR([$1], [2], [1 + 2 * 3 + !* ++],
+                     [AT_PARAM_IF([final: 0 0 1])],
+                     [102],
+                     [1.14: memory exhausted])])
+
+
+# YYerror.
+# --------
+# Check that returning YYerror from the scanner properly enters
+# error-recovery without issuing a second error message.
+
+_AT_CHECK_CALC_ERROR([$1], [0], [(#) + (#) = 2222],
+                     [AT_PARAM_IF([final: 2222 0 0])],
+                     [102],
+[[1.2: syntax error: invalid character: '#'
+1.8: syntax error: invalid character: '#']])
+
+_AT_CHECK_CALC_ERROR([$1], [0], [(1 + #) = 1111],
+                     [AT_PARAM_IF([final: 1111 0 0])],
+                     [102],
+[[1.6: syntax error: invalid character: '#']])
+
+_AT_CHECK_CALC_ERROR([$1], [0], [(# + 1) = 1111],
+                     [AT_PARAM_IF([final: 1111 0 0])],
+                     [102],
+[[1.2: syntax error: invalid character: '#']])
+
+_AT_CHECK_CALC_ERROR([$1], [0], [(1 + # + 1) = 1111],
+                     [AT_PARAM_IF([final: 1111 0 0])],
+                     [102],
+[[1.6: syntax error: invalid character: '#']])
+
+_AT_CHECK_CALC_ERROR([$1], [0], [(1 + 1) / (1 - 1)],
+                     [AT_PARAM_IF([final: 2 0 1])],
+                     [102],
+[AT_JAVA_IF([1.11-1.18], [1.11-17])[: error: null divisor]])
+
+# Multiple start symbols.
+AT_MULTISTART_IF([
+_AT_CHECK_CALC([--num], [[123]],
+               [[NUM => 123 (status: 0, errors: 0)]],
+               [AT_JAVA_IF([1014], [1017])])
+_AT_CHECK_CALC_ERROR([$1], [1], [1 + 2 * 3],
+                     [NUM => 0 (status: 1, errors: 1)],
+                     [102],
+                     [[1.3: syntax error, unexpected '+', expecting end of file]],
+                     [--num])
+
+_AT_CHECK_CALC([--exp], [[1 + 2 * 3]],
+               [[exp => 7 (status: 0, errors: 0)]],
+               [AT_JAVA_IF([1014], [1017])])
+])
+
 
 AT_BISON_OPTION_POPDEFS
 
@@ -734,11 +1318,11 @@
 
 
 
-# ------------------------ #
-# Simple LALR Calculator.  #
-# ------------------------ #
+# ----------------- #
+# LALR Calculator.  #
+# ----------------- #
 
-AT_BANNER([[Simple LALR(1) Calculator.]])
+AT_BANNER([[LALR(1) Calculator.]])
 
 # AT_CHECK_CALC_LALR([BISON-OPTIONS])
 # -----------------------------------
@@ -747,90 +1331,100 @@
 m4_define([AT_CHECK_CALC_LALR],
 [AT_CHECK_CALC($@)])
 
-AT_CHECK_CALC_LALR()
+AT_CHECK_CALC_LALR([%define parse.trace])
 
-AT_CHECK_CALC_LALR([%defines])
-AT_CHECK_CALC_LALR([%locations])
+AT_CHECK_CALC_LALR([%header])
+AT_CHECK_CALC_LALR([%debug %locations])
 AT_CHECK_CALC_LALR([%locations %define api.location.type {Span}])
 
 AT_CHECK_CALC_LALR([%name-prefix "calc"])
 AT_CHECK_CALC_LALR([%verbose])
 AT_CHECK_CALC_LALR([%yacc])
+AT_CHECK_CALC_LALR([%define parse.error detailed])
 AT_CHECK_CALC_LALR([%define parse.error verbose])
 
 AT_CHECK_CALC_LALR([%define api.pure full %locations])
 AT_CHECK_CALC_LALR([%define api.push-pull both %define api.pure full %locations])
-AT_CHECK_CALC_LALR([%define parse.error verbose %locations])
+AT_CHECK_CALC_LALR([%define parse.error detailed %locations])
 
-AT_CHECK_CALC_LALR([%define parse.error verbose %locations %defines %define api.prefix {calc} %verbose %yacc])
-AT_CHECK_CALC_LALR([%define parse.error verbose %locations %defines %name-prefix "calc" %define api.token.prefix {TOK_} %verbose %yacc])
+AT_CHECK_CALC_LALR([%define parse.error detailed %locations %header %define api.prefix {calc} %verbose %yacc])
+AT_CHECK_CALC_LALR([%define parse.error detailed %locations %header %name-prefix "calc" %define api.token.prefix {TOK_} %verbose %yacc])
 
 AT_CHECK_CALC_LALR([%debug])
-AT_CHECK_CALC_LALR([%define parse.error verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
-AT_CHECK_CALC_LALR([%define parse.error verbose %debug %locations %defines %define api.prefix {calc} %verbose %yacc])
+AT_CHECK_CALC_LALR([%define parse.error detailed %debug %locations %header %name-prefix "calc" %verbose %yacc])
+AT_CHECK_CALC_LALR([%define parse.error detailed %debug %locations %header %define api.prefix {calc} %verbose %yacc])
 
-AT_CHECK_CALC_LALR([%define api.pure full %define parse.error verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
-AT_CHECK_CALC_LALR([%define api.push-pull both %define api.pure full %define parse.error verbose %debug %locations %defines %define api.prefix {calc} %verbose %yacc])
+AT_CHECK_CALC_LALR([%define api.pure full %define parse.error detailed %debug %locations %header %name-prefix "calc" %verbose %yacc])
+AT_CHECK_CALC_LALR([%define api.push-pull both %define api.pure full %define parse.error detailed %debug %locations %header %define api.prefix {calc} %verbose %yacc])
 
-AT_CHECK_CALC_LALR([%define api.pure %define parse.error verbose %debug %locations %defines %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
+AT_CHECK_CALC_LALR([%define api.pure %define parse.error detailed %debug %locations %header %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result}{int *count}{int *nerrs}])
 
-AT_CHECK_CALC_LALR([%no-lines %define api.pure %define parse.error verbose %debug %locations %defines %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
+AT_CHECK_CALC_LALR([%no-lines %define api.pure %define parse.error detailed %debug %locations %header %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result}{int *count}{int *nerrs}])
+AT_CHECK_CALC_LALR([%no-lines %define api.pure %define parse.error verbose %debug %locations %header %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result}{int *count}{int *nerrs}])
+AT_CHECK_CALC_LALR([%no-lines %define api.pure %define parse.error verbose %debug %locations %defines %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result}{int *count}{int *nerrs}])
 
-# ----------------------- #
-# Simple GLR Calculator.  #
-# ----------------------- #
+# parse.error custom.
+AT_CHECK_CALC_LALR([%define parse.error custom])
+AT_CHECK_CALC_LALR([%define parse.error custom %locations %define api.prefix {calc}])
+AT_CHECK_CALC_LALR([%define parse.error custom %locations %define api.prefix {calc} %parse-param {semantic_value *result}{int *count}{int *nerrs}])
+AT_CHECK_CALC_LALR([%define parse.error custom %locations %define api.prefix {calc} %parse-param {semantic_value *result}{int *count}{int *nerrs} %define api.push-pull both %define api.pure full])
+AT_CHECK_CALC_LALR([%define parse.error custom %locations %define api.prefix {calc} %parse-param {semantic_value *result}{int *count}{int *nerrs} %define api.push-pull both %define api.pure full %define parse.lac full])
 
-AT_BANNER([[Simple GLR Calculator.]])
+# multistart.
+AT_CHECK_CALC_LALR([%start input exp NUM %define api.value.type union])
+AT_CHECK_CALC_LALR([%start input exp NUM %define api.value.type union %locations %define parse.error detailed])
 
-# AT_CHECK_CALC_GLR([BISON-OPTIONS])
-# ----------------------------------
-# Start a testing chunk which compiles 'calc' grammar with
-# BISON-OPTIONS and %glr-parser, and performs several tests over the parser.
+
+# ---------------- #
+# GLR Calculator.  #
+# ---------------- #
+
+AT_BANNER([[GLR Calculator.]])
+
 m4_define([AT_CHECK_CALC_GLR],
 [AT_CHECK_CALC([%glr-parser] $@)])
 
-
 AT_CHECK_CALC_GLR()
 
-AT_CHECK_CALC_GLR([%defines])
+AT_CHECK_CALC_GLR([%header])
 AT_CHECK_CALC_GLR([%locations])
 AT_CHECK_CALC_GLR([%locations %define api.location.type {Span}])
 AT_CHECK_CALC_GLR([%name-prefix "calc"])
 AT_CHECK_CALC_GLR([%define api.prefix {calc}])
 AT_CHECK_CALC_GLR([%verbose])
-AT_CHECK_CALC_GLR([%yacc])
 AT_CHECK_CALC_GLR([%define parse.error verbose])
 
 AT_CHECK_CALC_GLR([%define api.pure %locations])
 AT_CHECK_CALC_GLR([%define parse.error verbose %locations])
 
-AT_CHECK_CALC_GLR([%define parse.error verbose %locations %defines %name-prefix "calc" %verbose %yacc])
+AT_CHECK_CALC_GLR([%define parse.error custom %locations %header %name-prefix "calc" %verbose])
+AT_CHECK_CALC_GLR([%define parse.error custom %locations %header %name-prefix "calc" %verbose %define api.pure])
+AT_CHECK_CALC_GLR([%define parse.error detailed %locations %header %name-prefix "calc" %verbose])
+AT_CHECK_CALC_GLR([%define parse.error verbose %locations %header %name-prefix "calc" %verbose])
+
+AT_CHECK_CALC_GLR([%define parse.error custom %locations %header %name-prefix "calc" %verbose])
 
 AT_CHECK_CALC_GLR([%debug])
-AT_CHECK_CALC_GLR([%define parse.error verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
-AT_CHECK_CALC_GLR([%define parse.error verbose %debug %locations %defines %define api.prefix {calc} %define api.token.prefix {TOK_} %verbose %yacc])
+AT_CHECK_CALC_GLR([%define parse.error verbose %debug %locations %header %name-prefix "calc" %verbose])
+AT_CHECK_CALC_GLR([%define parse.error verbose %debug %locations %header %define api.prefix {calc} %define api.token.prefix {TOK_} %verbose])
 
-AT_CHECK_CALC_GLR([%define api.pure %define parse.error verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
+AT_CHECK_CALC_GLR([%define api.pure %define parse.error verbose %debug %locations %header %name-prefix "calc" %verbose])
 
-AT_CHECK_CALC_GLR([%define api.pure %define parse.error verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
-AT_CHECK_CALC_GLR([%define api.pure %define parse.error verbose %debug %locations %defines %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
+AT_CHECK_CALC_GLR([%define api.pure %define parse.error verbose %debug %locations %header %name-prefix "calc" %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}])
+AT_CHECK_CALC_GLR([%define api.pure %define parse.error verbose %debug %locations %header %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}])
 
-AT_CHECK_CALC_GLR([%no-lines %define api.pure %define parse.error verbose %debug %locations %defines %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
+AT_CHECK_CALC_GLR([%no-lines %define api.pure %define parse.error verbose %debug %locations %header %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}])
 
 
-# ----------------------------- #
-# Simple LALR1 C++ Calculator.  #
-# ----------------------------- #
+# ---------------------- #
+# LALR1 C++ Calculator.  #
+# ---------------------- #
 
-AT_BANNER([[Simple LALR(1) C++ Calculator.]])
+AT_BANNER([[LALR(1) C++ Calculator.]])
 
 # First let's try using %skeleton
-AT_CHECK_CALC([%skeleton "lalr1.cc" %defines])
+AT_CHECK_CALC([%skeleton "lalr1.cc" %header])
 
-# AT_CHECK_CALC_LALR1_CC([BISON-OPTIONS])
-# ---------------------------------------
-# Start a testing chunk which compiles 'calc' grammar with
-# the C++ skeleton, and performs several tests over the parser.
 m4_define([AT_CHECK_CALC_LALR1_CC],
 [AT_CHECK_CALC([%language "C++" $1], [$2])])
 
@@ -838,86 +1432,134 @@
 AT_CHECK_CALC_LALR1_CC([%locations])
 AT_CHECK_CALC_LALR1_CC([%locations], [$NO_EXCEPTIONS_CXXFLAGS])
 AT_CHECK_CALC_LALR1_CC([%locations %define api.location.type {Span}])
-AT_CHECK_CALC_LALR1_CC([%defines %locations %define parse.error verbose %name-prefix "calc" %verbose %yacc])
+AT_CHECK_CALC_LALR1_CC([%header %locations %define parse.error verbose %name-prefix "calc" %verbose])
 
-AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %define api.prefix {calc} %verbose %yacc])
-AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %debug %name-prefix "calc" %verbose %yacc])
+AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %define api.prefix {calc} %verbose])
+AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %debug %name-prefix "calc" %verbose])
 
-AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %debug %define api.prefix {calc} %verbose %yacc])
-AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %debug %define api.prefix {calc} %define api.token.prefix {TOK_} %verbose %yacc])
+AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %debug %define api.prefix {calc} %verbose])
+AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %debug %define api.prefix {calc} %define api.token.prefix {TOK_} %verbose])
 
-AT_CHECK_CALC_LALR1_CC([%defines %locations %define parse.error verbose %debug %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
+AT_CHECK_CALC_LALR1_CC([%header %locations %define parse.error verbose %debug %name-prefix "calc" %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}])
 
-AT_CHECK_CALC_LALR1_CC([%define parse.error verbose %debug %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
-AT_CHECK_CALC_LALR1_CC([%defines %locations %define parse.error verbose %debug %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
+AT_CHECK_CALC_LALR1_CC([%define parse.error verbose %debug %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}])
+AT_CHECK_CALC_LALR1_CC([%header %locations %define parse.error verbose %debug %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}])
 
-AT_CHECK_CALC_LALR1_CC([%defines %locations %define api.location.file none])
-AT_CHECK_CALC_LALR1_CC([%defines %locations %define api.location.file "my-location.hh"])
+AT_CHECK_CALC_LALR1_CC([%header %locations %define api.location.file none])
+AT_CHECK_CALC_LALR1_CC([%header %locations %define api.location.file "my-location.hh"])
 
-AT_CHECK_CALC_LALR1_CC([%no-lines %defines %locations %define api.location.file "my-location.hh"])
+AT_CHECK_CALC_LALR1_CC([%no-lines %header %locations %define api.location.file "my-location.hh"])
 
+AT_CHECK_CALC_LALR1_CC([%locations %define parse.lac full %define parse.error verbose])
+AT_CHECK_CALC_LALR1_CC([%locations %define parse.lac full %define parse.error detailed])
+AT_CHECK_CALC_LALR1_CC([%locations %define parse.lac full %define parse.error detailed %define parse.trace])
 
-# --------------------------- #
-# Simple GLR C++ Calculator.  #
-# --------------------------- #
+AT_CHECK_CALC_LALR1_CC([%define parse.error custom])
+AT_CHECK_CALC_LALR1_CC([%define parse.error custom %locations %define api.prefix {calc} %parse-param {semantic_value *result}{int *count}{int *nerrs}])
+AT_CHECK_CALC_LALR1_CC([%define parse.error custom %locations %define api.prefix {calc} %parse-param {semantic_value *result}{int *count}{int *nerrs} %define parse.lac full])
 
-AT_BANNER([[Simple GLR C++ Calculator.]])
+# -------------------- #
+# GLR C++ Calculator.  #
+# -------------------- #
+
+AT_BANNER([[GLR C++ Calculator.]])
 
 # Again, we try also using %skeleton.
 AT_CHECK_CALC([%skeleton "glr.cc"])
+AT_CHECK_CALC([%skeleton "glr2.cc"])
 
-# AT_CHECK_CALC_GLR_CC([BISON-OPTIONS])
-# -------------------------------------
-# Start a testing chunk which compiles 'calc' grammar with
-# the GLR C++ skeleton, and performs several tests over the parser.
 m4_define([AT_CHECK_CALC_GLR_CC],
-[AT_CHECK_CALC([%language "C++" %glr-parser] $@)])
+[AT_CHECK_CALC([%language "C++" %glr-parser] $@) # glr.cc
+AT_CHECK_CALC([%skeleton "glr2.cc"] $@)
+])
 
 AT_CHECK_CALC_GLR_CC([])
 AT_CHECK_CALC_GLR_CC([%locations])
 AT_CHECK_CALC_GLR_CC([%locations %define api.location.type {Span}])
-AT_CHECK_CALC_GLR_CC([%defines %define parse.error verbose %name-prefix "calc" %verbose %yacc])
-AT_CHECK_CALC_GLR_CC([%define parse.error verbose %define api.prefix {calc} %verbose %yacc])
+AT_CHECK_CALC_GLR_CC([%header %define parse.error verbose %name-prefix "calc" %verbose])
+AT_CHECK_CALC_GLR_CC([%define parse.error verbose %define api.prefix {calc} %verbose])
 
 AT_CHECK_CALC_GLR_CC([%debug])
 
-AT_CHECK_CALC_GLR_CC([%define parse.error verbose %debug %name-prefix "calc" %verbose %yacc])
-AT_CHECK_CALC_GLR_CC([%define parse.error verbose %debug %name-prefix "calc" %define api.token.prefix {TOK_} %verbose %yacc])
+# parse.error.
+AT_CHECK_CALC_GLR_CC([%define parse.error detailed %debug %name-prefix "calc" %verbose])
+AT_CHECK_CALC_GLR_CC([%define parse.error verbose %debug %name-prefix "calc" %verbose])
+AT_CHECK_CALC([%skeleton "glr2.cc" %define parse.error custom %debug %name-prefix "calc" %verbose]) # Only glr2.cc.
 
-AT_CHECK_CALC_GLR_CC([%locations %defines %define parse.error verbose %debug %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
-AT_CHECK_CALC_GLR_CC([%locations %defines %define parse.error verbose %debug %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
+AT_CHECK_CALC_GLR_CC([%define parse.error verbose %debug %name-prefix "calc" %define api.token.prefix {TOK_} %verbose])
 
-AT_CHECK_CALC_GLR_CC([%no-lines %locations %defines %define parse.error verbose %debug %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
+AT_CHECK_CALC_GLR_CC([%locations %header %define parse.error verbose %debug %name-prefix "calc" %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}])
+AT_CHECK_CALC_GLR_CC([%locations %header %define parse.error verbose %debug %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}])
+
+AT_CHECK_CALC_GLR_CC([%no-lines %locations %header %define parse.error verbose %debug %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}])
 
 
-# --------------------------- #
-# Simple LALR1 D Calculator.  #
-# --------------------------- #
+# -------------------- #
+# LALR1 D Calculator.  #
+# -------------------- #
 
-AT_BANNER([[Simple LALR(1) D Calculator.]])
+AT_BANNER([[LALR(1) D Calculator.]])
 
 # First let's try using %skeleton
 AT_CHECK_CALC([%skeleton "lalr1.d"])
 
-# AT_CHECK_CALC_LALR1_D([BISON-OPTIONS])
-# ---------------------------------------
-# Start a testing chunk which compiles 'calc' grammar with
-# the C++ skeleton, and performs several tests over the parser.
 m4_define([AT_CHECK_CALC_LALR1_D],
 [AT_CHECK_CALC([%language "D" $1], [$2])])
 
 AT_CHECK_CALC_LALR1_D([])
 AT_CHECK_CALC_LALR1_D([%locations])
 #AT_CHECK_CALC_LALR1_D([%locations %define api.location.type {Span}])
-AT_CHECK_CALC_LALR1_D([%define parse.error verbose %define api.prefix {calc} %verbose])
+AT_CHECK_CALC_LALR1_D([%define parse.error detailed %define api.prefix {calc} %verbose])
 
 AT_CHECK_CALC_LALR1_D([%debug])
 
-AT_CHECK_CALC_LALR1_D([%define parse.error verbose %debug %verbose])
-#AT_CHECK_CALC_LALR1_D([%define parse.error verbose %debug %define api.token.prefix {TOK_} %verbose])
+AT_CHECK_CALC_LALR1_D([%define parse.error custom])
+AT_CHECK_CALC_LALR1_D([%locations %define parse.error custom])
+AT_CHECK_CALC_LALR1_D([%locations %define parse.error detailed])
+AT_CHECK_CALC_LALR1_D([%locations %define parse.error simple])
+AT_CHECK_CALC_LALR1_D([%define parse.error detailed %debug %verbose])
+AT_CHECK_CALC_LALR1_D([%define parse.error detailed %debug %define api.symbol.prefix {SYMB_} %define api.token.prefix {TOK_} %verbose])
 
-#AT_CHECK_CALC_LALR1_D([%locations %define parse.error verbose %debug %verbose %parse-param {semantic_value *result} %parse-param {int *count}])
-#AT_CHECK_CALC_LALR1_D([%locations %define parse.error verbose %debug %define api.prefix {calc} %verbose %parse-param {semantic_value *result} %parse-param {int *count}])
+AT_CHECK_CALC_LALR1_D([%locations %define parse.lac full %define parse.error detailed])
+AT_CHECK_CALC_LALR1_D([%locations %define parse.lac full %define parse.error custom])
+AT_CHECK_CALC_LALR1_D([%locations %define parse.lac full %define parse.error detailed %define parse.trace])
+
+#AT_CHECK_CALC_LALR1_D([%locations %define parse.error detailed %debug %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}])
+#AT_CHECK_CALC_LALR1_D([%locations %define parse.error detailed %debug %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}])
+
+AT_CHECK_CALC_LALR1_D([%define api.token.constructor %locations %define parse.error custom %define api.value.type union])
+AT_CHECK_CALC_LALR1_D([%define api.token.constructor %locations %define parse.error detailed])
+AT_CHECK_CALC_LALR1_D([%define api.push-pull both])
+AT_CHECK_CALC_LALR1_D([%define parse.trace %define parse.error custom %locations %define api.push-pull both %define parse.lac full])
+
+# ----------------------- #
+# LALR1 Java Calculator.  #
+# ----------------------- #
+
+AT_BANNER([[LALR(1) Java Calculator.]])
+
+m4_define([AT_CHECK_CALC_LALR1_JAVA],
+[AT_CHECK_CALC([%language "Java" $1], [$2])])
+
+AT_CHECK_CALC_LALR1_JAVA
+AT_CHECK_CALC_LALR1_JAVA([%define parse.error custom])
+AT_CHECK_CALC_LALR1_JAVA([%define parse.error detailed])
+AT_CHECK_CALC_LALR1_JAVA([%define parse.error verbose])
+AT_CHECK_CALC_LALR1_JAVA([%locations %define parse.error custom])
+AT_CHECK_CALC_LALR1_JAVA([%locations %define parse.error detailed])
+AT_CHECK_CALC_LALR1_JAVA([%locations %define parse.error verbose])
+AT_CHECK_CALC_LALR1_JAVA([%define parse.trace %define parse.error verbose])
+AT_CHECK_CALC_LALR1_JAVA([%define parse.trace %define parse.error verbose %locations %lex-param {InputStream is}])
+
+AT_CHECK_CALC_LALR1_JAVA([%define api.push-pull both])
+AT_CHECK_CALC_LALR1_JAVA([%define api.push-pull both %define parse.error detailed %locations])
+AT_CHECK_CALC_LALR1_JAVA([%define parse.trace %define parse.error custom %locations %lex-param {InputStream is} %define api.push-pull both])
+AT_CHECK_CALC_LALR1_JAVA([%define parse.trace %define parse.error verbose %locations %lex-param {InputStream is} %define api.push-pull both])
+
+# parse.lac.
+AT_CHECK_CALC_LALR1_JAVA([%define parse.trace %define parse.error custom %locations %define parse.lac full])
+AT_CHECK_CALC_LALR1_JAVA([%define parse.trace %define parse.error custom %locations %define api.push-pull both %define parse.lac full])
+
 
 m4_popdef([AT_CALC_MAIN])
 m4_popdef([AT_CALC_YYLEX])
diff --git a/tests/conflicts.at b/tests/conflicts.at
index 92050fb..4e5b395 100644
--- a/tests/conflicts.at
+++ b/tests/conflicts.at
@@ -1,6 +1,6 @@
 # Exercising Bison on conflicts.                         -*- Autotest -*-
 
-# Copyright (C) 2002-2005, 2007-2015, 2018-2019 Free Software
+# Copyright (C) 2002-2005, 2007-2015, 2018-2021 Free Software
 # Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[Conflicts.]])
 
@@ -309,7 +309,6 @@
 #include <string.h>
 #include <assert.h>
 
-#define YYERROR_VERBOSE 1
 ]AT_YYERROR_DEFINE[
 /* The current argument. */
 static const char *input;
@@ -324,6 +323,8 @@
 
 %}
 
+%define parse.error verbose
+
 %nonassoc '<' '>'
 
 %%
@@ -345,7 +346,7 @@
 [AT_BISON_CHECK([$1[ -o input.c input.y]])
 AT_COMPILE([input])
 
-m4_pushdef([AT_EXPECTING], [m4_if($2, [correct], [[, expecting $end]])])
+m4_pushdef([AT_EXPECTING], [m4_if($2, [correct], [[, expecting end of file]])])
 
 AT_PARSER_CHECK([input '0<0'])
 AT_PARSER_CHECK([input '0<0<0'], [1], [],
@@ -404,7 +405,7 @@
 
 AT_SETUP([[parse.error=verbose and consistent errors: ]$1])
 
-AT_BISON_OPTION_PUSHDEFS([$1 AT_CXX_IF([[%defines]], [[%define api.pure]])])
+AT_BISON_OPTION_PUSHDEFS([$1 AT_CXX_IF([[%header]], [[%define api.pure]])])
 
 AT_DATA_GRAMMAR([input.y],
 [AT_JAVA_IF([[
@@ -420,9 +421,9 @@
   #define USE(Var)
 }
 
-]AT_CXX_IF([[%defines]], [[%define api.pure]])])[
+]AT_CXX_IF([[%header]], [[%define api.pure]])])[
 
-]AT_YACC_IF([[
+]AT_YACC_C_IF([[
 %code {
   #if defined __GNUC__ && 8 <= __GNUC__
   # pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
@@ -439,7 +440,7 @@
 ]$2[
 
 ]AT_JAVA_IF([[%code lexer {
-  ]AT_YYLEX_DEFINE([$3], [[return new Integer(1)]])[
+  ]AT_YYLEX_DEFINE(["$3"], [[return new Integer(1)]])[
   ]AT_YYERROR_DEFINE[
 };
 %%
@@ -508,50 +509,50 @@
 AT_CONSISTENT_ERRORS_CHECK([[%define lr.type ielr]],
                            [AT_PREVIOUS_STATE_GRAMMAR],
                            [AT_PREVIOUS_STATE_INPUT],
-                           [[$end]], [[none]])
+                           [[end of file]], [[none]])
 AT_CONSISTENT_ERRORS_CHECK([[%define lr.type ielr
                              %glr-parser]],
                            [AT_PREVIOUS_STATE_GRAMMAR],
                            [AT_PREVIOUS_STATE_INPUT],
-                           [[$end]], [[none]])
+                           [[end of file]], [[none]])
 AT_CONSISTENT_ERRORS_CHECK([[%define lr.type ielr
                              %language "c++"]],
                            [AT_PREVIOUS_STATE_GRAMMAR],
                            [AT_PREVIOUS_STATE_INPUT],
-                           [[$end]], [[none]])
+                           [[end of file]], [[none]])
 AT_CONSISTENT_ERRORS_CHECK([[%define lr.type ielr
                              %language "java"]],
                            [AT_PREVIOUS_STATE_GRAMMAR],
                            [AT_PREVIOUS_STATE_INPUT],
-                           [[end of input]], [[none]])
+                           [[end of file]], [[none]])
 
 # Even canonical LR doesn't foresee the error for 'a'!
 AT_CONSISTENT_ERRORS_CHECK([[%define lr.type ielr
                              %define lr.default-reduction consistent]],
                            [AT_PREVIOUS_STATE_GRAMMAR],
                            [AT_PREVIOUS_STATE_INPUT],
-                           [[$end]], [[ab]])
+                           [[end of file]], [[ab]])
 AT_CONSISTENT_ERRORS_CHECK([[%define lr.type ielr
                              %define lr.default-reduction accepting]],
                            [AT_PREVIOUS_STATE_GRAMMAR],
                            [AT_PREVIOUS_STATE_INPUT],
-                           [[$end]], [[ab]])
+                           [[end of file]], [[ab]])
 AT_CONSISTENT_ERRORS_CHECK([[%define lr.type canonical-lr]],
                            [AT_PREVIOUS_STATE_GRAMMAR],
                            [AT_PREVIOUS_STATE_INPUT],
-                           [[$end]], [[ab]])
+                           [[end of file]], [[ab]])
 
 # Only LAC gets it right.  In C.
 AT_CONSISTENT_ERRORS_CHECK([[%define lr.type canonical-lr
                              %define parse.lac full]],
                            [AT_PREVIOUS_STATE_GRAMMAR],
                            [AT_PREVIOUS_STATE_INPUT],
-                           [[$end]], [[b]])
+                           [[end of file]], [[b]])
 AT_CONSISTENT_ERRORS_CHECK([[%define lr.type ielr
                              %define parse.lac full]],
                            [AT_PREVIOUS_STATE_GRAMMAR],
                            [AT_PREVIOUS_STATE_INPUT],
-                           [[$end]], [[b]])
+                           [[end of file]], [[b]])
 
 # Only LAC gets it right.  In C++.
 AT_CONSISTENT_ERRORS_CHECK([[%language "c++"
@@ -559,13 +560,13 @@
                              %define parse.lac full]],
                            [AT_PREVIOUS_STATE_GRAMMAR],
                            [AT_PREVIOUS_STATE_INPUT],
-                           [[$end]], [[b]])
+                           [[end of file]], [[b]])
 AT_CONSISTENT_ERRORS_CHECK([[%language "c++"
                              %define lr.type ielr
                              %define parse.lac full]],
                            [AT_PREVIOUS_STATE_GRAMMAR],
                            [AT_PREVIOUS_STATE_INPUT],
-                           [[$end]], [[b]])
+                           [[end of file]], [[b]])
 
 m4_popdef([AT_PREVIOUS_STATE_GRAMMAR])
 m4_popdef([AT_PREVIOUS_STATE_INPUT])
@@ -637,11 +638,11 @@
 AT_CONSISTENT_ERRORS_CHECK([[%define lr.default-reduction accepting]],
                            [AT_USER_ACTION_GRAMMAR],
                            [AT_USER_ACTION_INPUT],
-                           [[$end]], [[a]])
+                           [[end of file]], [[a]])
 AT_CONSISTENT_ERRORS_CHECK([[%define lr.type canonical-lr]],
                            [AT_USER_ACTION_GRAMMAR],
                            [AT_USER_ACTION_INPUT],
-                           [[$end]], [[a]])
+                           [[end of file]], [[a]])
 
 AT_CONSISTENT_ERRORS_CHECK([[%define parse.lac full]],
                            [AT_USER_ACTION_GRAMMAR],
@@ -651,7 +652,7 @@
                              %define lr.default-reduction accepting]],
                            [AT_USER_ACTION_GRAMMAR],
                            [AT_USER_ACTION_INPUT],
-                           [[$end]], [[none]])
+                           [[end of file]], [[none]])
 
 m4_popdef([AT_USER_ACTION_GRAMMAR])
 m4_popdef([AT_USER_ACTION_INPUT])
@@ -725,6 +726,7 @@
 AT_BISON_CHECK([[-Dlr.type=canonical-lr -o input.c input.y]],
                [[0]], [[]],
 [[input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
+input.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 ]])
 AT_COMPILE([[input]])
 AT_PARSER_CHECK([[input]], [[1]], [[]],
@@ -735,6 +737,7 @@
 AT_BISON_CHECK([[-Dlr.type=canonical-lr -Dparse.lac=full \
                  -o input.c input.y]], [[0]], [[]],
 [[input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
+input.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 ]])
 AT_COMPILE([[input]])
 AT_PARSER_CHECK([[input]], [[1]], [[]],
@@ -745,6 +748,7 @@
 AT_BISON_CHECK([[-Dlr.type=ielr -Dparse.lac=full -o input.c input.y]],
                [[0]], [[]],
 [[input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
+input.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 ]])
 AT_COMPILE([[input]])
 AT_PARSER_CHECK([[input]], [[1]], [[]],
@@ -759,7 +763,7 @@
 
 AT_SETUP([Unresolved SR Conflicts])
 
-AT_KEYWORDS([report])
+AT_KEYWORDS([cex report])
 
 AT_DATA([input.y],
 [[%token NUM OP
@@ -769,6 +773,7 @@
 
 AT_BISON_CHECK([-o input.c --report=all input.y], 0, [],
 [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 ]])
 
 # Check the contents of the report.
@@ -855,6 +860,20 @@
 
     OP        [reduce using rule 1 (exp)]
     $default  reduce using rule 1 (exp)
+
+    shift/reduce conflict on token OP:
+        1 exp: exp OP exp .
+        1 exp: exp . OP exp
+      Example: exp OP exp . OP exp
+      Shift derivation
+        exp
+        `-> 1: exp OP exp
+                      `-> 1: exp . OP exp
+      Reduce derivation
+        exp
+        `-> 1: exp                 OP exp
+               `-> 1: exp OP exp .
+
 ]])
 
 AT_CLEANUP
@@ -1013,6 +1032,7 @@
 
 AT_BISON_CHECK([-o input.c input.y], 0, [],
 [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 input.y:12.3-18: warning: rule useless in parser due to conflicts [-Wother]
 ]])
 
@@ -1073,7 +1093,7 @@
 ])
 
 ## FIXME: test Java and D.
-m4_map_args([AT_TEST], [yacc.c], [glr.c], [lalr1.cc], [glr.cc])
+m4_map_args([AT_TEST], [yacc.c], [glr.c], [lalr1.cc], [glr.cc], [glr2.cc])
 
 m4_popdef([AT_TEST])
 
@@ -1105,7 +1125,7 @@
 # else.
 
 AT_SETUP([Defaulted Conflicted Reduction])
-AT_KEYWORDS([report])
+AT_KEYWORDS([cex report])
 
 AT_DATA([input.y],
 [[%%
@@ -1117,6 +1137,7 @@
 
 AT_BISON_CHECK([-o input.c --report=all input.y], 0, [],
 [[input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
+input.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 input.y:4.6-8: warning: rule useless in parser due to conflicts [-Wother]
 ]])
 
@@ -1188,6 +1209,20 @@
     $end      [reduce using rule 4 (id)]
     $default  reduce using rule 3 (num)
 
+    reduce/reduce conflict on token $end:
+        3 num: '0' .
+        4 id: '0' .
+      Example: '0' .
+      First reduce derivation
+        exp
+        `-> 1: num
+               `-> 3: '0' .
+      Second reduce derivation
+        exp
+        `-> 2: id
+               `-> 4: '0' .
+
+
 
 State 2
 
@@ -1237,6 +1272,7 @@
 
 AT_BISON_CHECK([-o input.c input.y], 1, [],
 [[input.y: error: shift/reduce conflicts: 1 found, 0 expected
+input.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 ]])
 AT_CLEANUP
 
@@ -1273,6 +1309,7 @@
 
 AT_BISON_CHECK([-o input.c input.y], 1, [],
 [[input.y: error: shift/reduce conflicts: 1 found, 2 expected
+input.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 ]])
 AT_CLEANUP
 
@@ -1292,6 +1329,7 @@
 
 AT_BISON_CHECK([-o input.c input.y], 1, [],
 [[input.y: error: reduce/reduce conflicts: 1 found, 0 expected
+input.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 ]])
 AT_CLEANUP
 
@@ -1492,6 +1530,7 @@
 
 AT_BISON_CHECK([-Wall -o input.c input.y], 0, [],
 [[input.y: warning: 4 shift/reduce conflicts [-Wconflicts-sr]
+input.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 input.y:1.1-5: warning: useless precedence and associativity for '+' [-Wprecedence]
 input.y:2.1-5: warning: useless precedence and associativity for '*' [-Wprecedence]
 ]])
@@ -1552,6 +1591,8 @@
 
 AT_SETUP([[Unreachable States After Conflict Resolution]])
 
+AT_KEYWORDS([cex report])
+
 # If conflict resolution makes states unreachable, remove those states, report
 # rules that are then unused, and don't report conflicts in those states.  Test
 # what happens when a nonterminal becomes useless as a result of state removal
@@ -1597,6 +1638,7 @@
 AT_BISON_CHECK([[--report=all input.y]], 0, [],
 [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
 input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
+input.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 input.y:12.5-20: warning: rule useless in parser due to conflicts [-Wother]
 input.y:20.5-20: warning: rule useless in parser due to conflicts [-Wother]
 input.y:21.4: warning: rule useless in parser due to conflicts [-Wother]
@@ -1678,7 +1720,7 @@
     0 $accept: . start $end
     1 start: . resolved_conflict 'a' reported_conflicts 'a'
     2 resolved_conflict: . 'a' unreachable1
-    3                  | . %empty  ['a']
+    3                  | %empty .  ['a']
 
     $default  reduce using rule 3 (resolved_conflict)
 
@@ -1714,7 +1756,7 @@
     1 start: resolved_conflict 'a' . reported_conflicts 'a'
     8 reported_conflicts: . 'a'
     9                   | . 'a'
-   10                   | . %empty  ['a']
+   10                   | %empty .  ['a']
 
     'a'  shift, and go to state 5
 
@@ -1722,6 +1764,35 @@
 
     reported_conflicts  go to state 6
 
+    shift/reduce conflict on token 'a':
+       10 reported_conflicts: %empty .
+        8 reported_conflicts: . 'a'
+      First example: resolved_conflict . 'a' 'a'
+      Shift derivation
+        start
+        `-> 1: resolved_conflict reported_conflicts 'a'
+                                 `-> 8: . 'a'
+      Second example: resolved_conflict . 'a'
+      Reduce derivation
+        start
+        `-> 1: resolved_conflict reported_conflicts 'a'
+                                 `-> 10: %empty .
+
+    shift/reduce conflict on token 'a':
+       10 reported_conflicts: %empty .
+        9 reported_conflicts: . 'a'
+      First example: resolved_conflict . 'a' 'a'
+      Shift derivation
+        start
+        `-> 1: resolved_conflict reported_conflicts 'a'
+                                 `-> 9: . 'a'
+      Second example: resolved_conflict . 'a'
+      Reduce derivation
+        start
+        `-> 1: resolved_conflict reported_conflicts 'a'
+                                 `-> 10: %empty .
+
+
 
 State 5
 
@@ -1732,6 +1803,18 @@
     'a'       [reduce using rule 9 (reported_conflicts)]
     $default  reduce using rule 8 (reported_conflicts)
 
+    reduce/reduce conflict on token 'a':
+        8 reported_conflicts: 'a' .
+        9 reported_conflicts: 'a' .
+      Example: 'a' .
+      First reduce derivation
+        reported_conflicts
+        `-> 8: 'a' .
+      Second reduce derivation
+        reported_conflicts
+        `-> 9: 'a' .
+
+
 
 State 6
 
@@ -1755,6 +1838,7 @@
 AT_BISON_CHECK([[input-keep.y]], 0, [],
 [[input-keep.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
 input-keep.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
+input-keep.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 input-keep.y:22.4: warning: rule useless in parser due to conflicts [-Wother]
 input-keep.y:26.16: warning: rule useless in parser due to conflicts [-Wother]
 input-keep.y:32.5-7: warning: rule useless in parser due to conflicts [-Wother]
@@ -1807,11 +1891,11 @@
     6      | . empty_c1 'c'
     7      | . empty_c2 'c'
     8      | . empty_c3 'c'
-    9 empty_a: . %empty  ['a']
-   10 empty_b: . %empty  []
-   11 empty_c1: . %empty  []
-   12 empty_c2: . %empty  []
-   13 empty_c3: . %empty  ['c']
+    9 empty_a: %empty .  ['a']
+   10 empty_b: %empty .  []
+   11 empty_c1: %empty .  []
+   12 empty_c2: %empty .  []
+   13 empty_c3: %empty .  ['c']
 
     'b'  shift, and go to state 1
 
@@ -1850,6 +1934,8 @@
 
 AT_SETUP([[%nonassoc error actions for multiple reductions in a state]])
 
+AT_KEYWORDS([cex report])
+
 AT_DATA([[input.y]],
 [[%nonassoc 'a' 'b' 'c'
 %%
@@ -1870,7 +1956,286 @@
 empty_c3: %prec 'c' ;
 ]])
 
-AT_BISON_CHECK([[--report=all -o input.c input.y]], 0, [], [ignore])
+AT_BISON_CHECK([[--trace=cex -fcaret --report=all -o input.c input.y]], 0, [],
+[[bison (GNU Bison) ]AT_PACKAGE_VERSION[
+init: 0.000000
+# state items: 26
+State 0:
+    0 $accept: . start $end
+    ->     0 $accept: start . $end
+    =>     2 start: . empty_a 'a'
+    =>     4 start: . empty_b 'b'
+    =>     6 start: . empty_c1 'c'
+    =>     7 start: . empty_c2 'c'
+    =>     8 start: . empty_c3 'c'
+
+    1 start: . 'a'  DISABLED
+
+    2 start: . empty_a 'a'
+    ->     2 start: empty_a . 'a'
+    =>     9 empty_a: %empty .
+    <-     0 $accept: . start $end
+
+    3 start: . 'b'  DISABLED
+
+    4 start: . empty_b 'b'
+    ->     4 start: empty_b . 'b'
+    =>    10 empty_b: %empty .
+    <-     0 $accept: . start $end
+
+    5 start: . 'c'  DISABLED
+
+    6 start: . empty_c1 'c'
+    ->     6 start: empty_c1 . 'c'
+    =>    11 empty_c1: %empty .
+    <-     0 $accept: . start $end
+
+    7 start: . empty_c2 'c'
+    ->     7 start: empty_c2 . 'c'
+    =>    12 empty_c2: %empty .
+    <-     0 $accept: . start $end
+
+    8 start: . empty_c3 'c'
+    ->     8 start: empty_c3 . 'c'
+    =>    13 empty_c3: %empty .
+    <-     0 $accept: . start $end
+
+    9 empty_a: %empty .
+    <-     2 start: . empty_a 'a'
+
+   10 empty_b: %empty .
+    <-     4 start: . empty_b 'b'
+
+   11 empty_c1: %empty .
+    <-     6 start: . empty_c1 'c'
+
+   12 empty_c2: %empty .
+    <-     7 start: . empty_c2 'c'
+
+   13 empty_c3: %empty .
+    <-     8 start: . empty_c3 'c'
+
+State 1:
+    0 $accept: start . $end
+    ->     0 $accept: start $end .
+    <-     0 $accept: . start $end
+
+State 2:
+    2 start: empty_a . 'a'
+    ->     2 start: empty_a 'a' .
+    <-     2 start: . empty_a 'a'
+
+State 3:
+    4 start: empty_b . 'b'
+    ->     4 start: empty_b 'b' .
+    <-     4 start: . empty_b 'b'
+
+State 4:
+    6 start: empty_c1 . 'c'
+    ->     6 start: empty_c1 'c' .
+    <-     6 start: . empty_c1 'c'
+
+State 5:
+    7 start: empty_c2 . 'c'
+    ->     7 start: empty_c2 'c' .
+    <-     7 start: . empty_c2 'c'
+
+State 6:
+    8 start: empty_c3 . 'c'
+    ->     8 start: empty_c3 'c' .
+    <-     8 start: . empty_c3 'c'
+
+State 7:
+    0 $accept: start $end .
+    <-     0 $accept: start . $end
+
+State 8:
+    2 start: empty_a 'a' .
+    <-     2 start: empty_a . 'a'
+
+State 9:
+    4 start: empty_b 'b' .
+    <-     4 start: empty_b . 'b'
+
+State 10:
+    6 start: empty_c1 'c' .
+    <-     6 start: empty_c1 . 'c'
+
+State 11:
+    7 start: empty_c2 'c' .
+    <-     7 start: empty_c2 . 'c'
+
+State 12:
+    8 start: empty_c3 'c' .
+    <-     8 start: empty_c3 . 'c'
+
+FIRSTS
+  $accept firsts
+    'a'
+    'b'
+    'c'
+  start firsts
+    'a'
+    'b'
+    'c'
+  empty_a firsts
+  empty_b firsts
+  empty_c1 firsts
+  empty_c2 firsts
+  empty_c3 firsts
+
+
+input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
+input.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
+input.y:4.5-7: warning: rule useless in parser due to conflicts [-Wother]
+    4 |     'a'
+      |     ^~~
+input.y:6.5-7: warning: rule useless in parser due to conflicts [-Wother]
+    6 |   | 'b'
+      |     ^~~
+input.y:8.5-7: warning: rule useless in parser due to conflicts [-Wother]
+    8 |   | 'c'
+      |     ^~~
+input.y:13.10-18: warning: rule useless in parser due to conflicts [-Wother]
+   13 | empty_a: %prec 'a' ;
+      |          ^~~~~~~~~
+input.y:14.10-18: warning: rule useless in parser due to conflicts [-Wother]
+   14 | empty_b: %prec 'b' ;
+      |          ^~~~~~~~~
+input.y:15.11-19: warning: rule useless in parser due to conflicts [-Wother]
+   15 | empty_c1: %prec 'c' ;
+      |           ^~~~~~~~~
+input.y:16.11-19: warning: rule useless in parser due to conflicts [-Wother]
+   16 | empty_c2: %prec 'c' ;
+      |           ^~~~~~~~~
+input.y:17.11-19: warning: rule useless in parser due to conflicts [-Wother]
+   17 | empty_c3: %prec 'c' ;
+      |           ^~~~~~~~~
+REDUCE ITEM PATH:
+    0 $accept: . start $end
+    7 start: . empty_c2 'c'
+   12 empty_c2: %empty .
+CONFLICT 1 (size 1 depth 0 rc 2)
+   12 empty_c2: %empty .
+   12 empty_c2: %empty .
+
+    .
+
+CONFLICT 2 (size 1 depth 0 rc 2)
+   13 empty_c3: %empty .
+   13 empty_c3: %empty .
+
+    .
+
+
+CONFLICT 1 (size 2 depth -1 rc 4)
+    7 start: . empty_c2 'c'
+    7 start: empty_c2 . 'c'
+
+    empty_c2
+    `-> 12: %empty .
+
+CONFLICT 2 (size 1 depth 0 rc 3)
+   13 empty_c3: %empty .
+   13 empty_c3: %empty .
+
+    .
+
+
+CONFLICT 1 (size 1 depth 0 rc 3)
+   12 empty_c2: %empty .
+   12 empty_c2: %empty .
+
+    .
+
+CONFLICT 2 (size 2 depth -1 rc 2)
+    8 start: . empty_c3 'c'
+    8 start: empty_c3 . 'c'
+
+    empty_c3
+    `-> 13: %empty .
+
+
+CONFLICT 1 (size 2 depth -1 rc 3)
+    7 start: . empty_c2 'c'
+    7 start: empty_c2 . 'c'
+
+    empty_c2
+    `-> 12: %empty .
+
+CONFLICT 2 (size 2 depth -1 rc 2)
+    8 start: . empty_c3 'c'
+    8 start: empty_c3 . 'c'
+
+    empty_c3
+    `-> 13: %empty .
+
+
+CONFLICT 1 (size 3 depth -1 rc 2)
+    7 start: . empty_c2 'c'
+    7 start: empty_c2 'c' .
+
+    empty_c2
+    `-> 12: %empty .
+
+CONFLICT 2 (size 3 depth -1 rc 2)
+    8 start: . empty_c3 'c'
+    8 start: empty_c3 'c' .
+
+    empty_c3
+    `-> 13: %empty .
+
+
+CONFLICT 1 (size 2 depth -1 rc 4)
+    0 $accept: . start $end
+    0 $accept: start . $end
+
+    start
+    `-> 7: empty_c2         'c'
+           `-> 12: %empty .
+
+CONFLICT 2 (size 3 depth -1 rc 3)
+    8 start: . empty_c3 'c'
+    8 start: empty_c3 'c' .
+
+    empty_c3
+    `-> 13: %empty .
+
+
+CONFLICT 1 (size 3 depth -1 rc 3)
+    7 start: . empty_c2 'c'
+    7 start: empty_c2 'c' .
+
+    empty_c2
+    `-> 12: %empty .
+
+CONFLICT 2 (size 2 depth -1 rc 2)
+    0 $accept: . start $end
+    0 $accept: start . $end
+
+    start
+    `-> 8: empty_c3         'c'
+           `-> 13: %empty .
+
+
+CONFLICT 1 (size 2 depth -1 rc 3)
+    0 $accept: . start $end
+    0 $accept: start . $end
+
+    start
+    `-> 7: empty_c2         'c'
+           `-> 12: %empty .
+
+CONFLICT 2 (size 2 depth -1 rc 2)
+    0 $accept: . start $end
+    0 $accept: start . $end
+
+    start
+    `-> 8: empty_c3         'c'
+           `-> 13: %empty .
+
+
+]])
 AT_CHECK([[cat input.output | sed -n '/^State 0$/,/^State 1$/p']], 0,
 [[State 0
 
@@ -1883,11 +2248,11 @@
     6      | . empty_c1 'c'
     7      | . empty_c2 'c'
     8      | . empty_c3 'c'
-    9 empty_a: . %empty  []
-   10 empty_b: . %empty  []
-   11 empty_c1: . %empty  []
-   12 empty_c2: . %empty  ['c']
-   13 empty_c3: . %empty  ['c']
+    9 empty_a: %empty .  []
+   10 empty_b: %empty .  []
+   11 empty_c1: %empty .  []
+   12 empty_c2: %empty .  ['c']
+   13 empty_c3: %empty .  ['c']
 
     'a'  error (nonassociative)
     'b'  error (nonassociative)
@@ -1907,6 +2272,20 @@
     Conflict between rule 10 and token 'b' resolved as an error (%nonassoc 'b').
     Conflict between rule 11 and token 'c' resolved as an error (%nonassoc 'c').
 
+    reduce/reduce conflict on token 'c':
+       12 empty_c2: %empty .
+       13 empty_c3: %empty .
+      Example: . 'c'
+      First reduce derivation
+        start
+        `-> 7: empty_c2         'c'
+               `-> 12: %empty .
+      Second reduce derivation
+        start
+        `-> 8: empty_c3         'c'
+               `-> 13: %empty .
+
+
 
 State 1
 ]])
@@ -1938,6 +2317,7 @@
 AT_BISON_CHECK([[2.y]], [[0]], [],
 [[2.y: warning: %expect-rr applies only to GLR parsers [-Wother]
 2.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
+2.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 2.y:3.12-14: warning: rule useless in parser due to conflicts [-Wother]
 ]])
 
@@ -1974,9 +2354,11 @@
 AT_BISON_CHECK([[sr-rr.y]], [[0]], [[]],
 [[sr-rr.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
 sr-rr.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
+sr-rr.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 ]])
 AT_BISON_CHECK([[-Wno-conflicts-sr sr-rr.y]], [[0]], [[]],
 [[sr-rr.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
+sr-rr.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 ]])
 AT_BISON_CHECK([[-Wno-conflicts-rr sr-rr.y]], [[0]], [[]],
 [[sr-rr.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
@@ -2036,15 +2418,27 @@
         ]AT_BISON_CHECK([[-Werror $file]])[
       else
         {
+          issue_note=false
           if test -z "$sr_exp_i" && test "$sr_count" -ne 0; then
             echo "warning: $sr_count shift/reduce conflicts"
+            issue_note=true
           elif test "$sr_exp_i" -ne "$sr_count"; then
             echo "error: shift/reduce conflicts: $sr_count found, $sr_exp_i expected"
+            if test "$sr_count" -ne 0; then
+              issue_note=true
+            fi
           fi
           if test -z "$rr_exp_i" && test "$rr_count" -ne 0; then
             echo "warning: $rr_count reduce/reduce conflicts"
+            issue_note=true
           elif test "$rr_exp_i" -ne "$rr_count"; then
             echo "error: reduce/reduce conflicts: $rr_count found, $rr_exp_i expected"
+            if test "$rr_count" -ne 0; then
+              issue_note=true
+            fi
+          fi
+          if $issue_note; then
+            echo "note: rerun with option '-Wcounterexamples' to generate conflict counterexamples"
           fi
         } | sed -e "s/^/$file: /" > experr
         ]AT_BISON_CHECK([[-Wnone $file]], [[1]], [[]], [[experr]])[
diff --git a/tests/counterexample.at b/tests/counterexample.at
new file mode 100644
index 0000000..88f1a47
--- /dev/null
+++ b/tests/counterexample.at
@@ -0,0 +1,922 @@
+# Exercising Bison on counterexamples.                         -*- Autotest -*-
+
+# Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+AT_BANNER([[Counterexamples.]])
+
+# AT_BISON_CHECK_CEX(TREE, FLAT)
+# ------------------------------
+m4_define([AT_BISON_CHECK_CEX],
+[AT_KEYWORDS([cex])
+
+AT_BISON_CHECK([-Wcounterexamples input.y], [0], [], [stderr])
+# FIXME: Avoid trailing white spaces.
+AT_CHECK([[sed -e 's/time limit exceeded: [0-9][.0-9]*/time limit exceeded: XXX/g;s/ *$//;' stderr]],
+         [], [$1])
+
+m4_pushdef([AT_SET_ENV_IF],
+           [[YYFLAT=1; export YYFLAT;]]m4_defn([AT_SET_ENV_IF]))
+AT_BISON_CHECK([-Wcounterexamples input.y], [0], [], [stderr])
+AT_CHECK([[sed -e 's/time limit exceeded: [0-9][.0-9]*/time limit exceeded: XXX/g' stderr]],
+         [], [$2])
+m4_popdef([AT_SET_ENV_IF])
+
+])
+
+## --------------------- ##
+## Simple Unifying S/R.  ##
+## --------------------- ##
+
+AT_SETUP([Unifying S/R])
+
+AT_DATA([[input.y]],
+[[%token A B C
+%%
+s: a x | y c;
+a: A;
+c: C;
+x: B | B C;
+y: A | A B;
+]])
+
+AT_BISON_CHECK_CEX(
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token B [-Wcounterexamples]
+  Example: A . B C
+  Shift derivation
+    s
+    `-> 2: y            c
+           `-> 8: A . B `-> 4: C
+  Reduce derivation
+    s
+    `-> 1: a          x
+           `-> 3: A . `-> 6: B C
+input.y:4.4: warning: rule useless in parser due to conflicts [-Wother]
+]],
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token B [-Wcounterexamples]
+  Example           A . B C
+  Shift derivation  s -> [ y -> [ A . B ] c -> [ C ] ]
+  Reduce derivation s -> [ a -> [ A . ] x -> [ B C ] ]
+input.y:4.4: warning: rule useless in parser due to conflicts [-Wother]
+]])
+
+AT_CLEANUP
+
+## ------------------- ##
+## Deep Unifying S/R.  ##
+## ------------------- ##
+
+AT_SETUP([Deep Unifying S/R])
+
+AT_DATA([[input.y]],
+[[%token A B C
+%%
+s: ac | a bc;
+ac: A ac C | b;
+b: B | B b;
+a: A | A a;
+bc: B bc C | B C;
+]])
+
+AT_BISON_CHECK_CEX(
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token B [-Wcounterexamples]
+  Example: A . B C
+  Shift derivation
+    s
+    `-> 1: ac
+           `-> 3: A ac                C
+                    `-> 4: b
+                           `-> 5: . B
+  Reduce derivation
+    s
+    `-> 2: a          bc
+           `-> 7: A . `-> 10: B C
+input.y: warning: shift/reduce conflict on token B [-Wcounterexamples]
+  Example: A A . B B C C
+  Shift derivation
+    s
+    `-> 1: ac
+           `-> 3: A ac                                    C
+                    `-> 3: A ac                         C
+                             `-> 4: b
+                                    `-> 6: . b
+                                             `-> 5: B B
+  Reduce derivation
+    s
+    `-> 2: a                   bc
+           `-> 8: A a          `-> 9: B bc          C
+                    `-> 7: A .          `-> 10: B C
+input.y:6.4: warning: rule useless in parser due to conflicts [-Wother]
+]],
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token B [-Wcounterexamples]
+  Example           A . B C
+  Shift derivation  s -> [ ac -> [ A ac -> [ b -> [ . B ] ] C ] ]
+  Reduce derivation s -> [ a -> [ A . ] bc -> [ B C ] ]
+input.y: warning: shift/reduce conflict on token B [-Wcounterexamples]
+  Example           A A . B B C C
+  Shift derivation  s -> [ ac -> [ A ac -> [ A ac -> [ b -> [ . b -> [ B B ] ] ] C ] C ] ]
+  Reduce derivation s -> [ a -> [ A a -> [ A . ] ] bc -> [ B bc -> [ B C ] C ] ]
+input.y:6.4: warning: rule useless in parser due to conflicts [-Wother]
+]])
+
+AT_CLEANUP
+
+## ------------------------------------ ##
+## S/R Conflict with Nullable Symbols.  ##
+## ------------------------------------ ##
+
+AT_SETUP([S/R Conflict with Nullable Symbols])
+
+AT_DATA([[input.y]],
+[[%token A B X Y
+%%
+s: ax by | A xby;
+ax: A x;
+x: %empty | X x;
+by: B y;
+y: %empty | Y y;
+xby: B | X xby Y;
+]])
+
+AT_BISON_CHECK_CEX(
+[[input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token B [-Wcounterexamples]
+  Example: A . B
+  Shift derivation
+    s
+    `-> 2: A xby
+             `-> 9: . B
+  Reduce derivation
+    s
+    `-> 1: ax                       by
+           `-> 3: A x               `-> 6: B y
+                    `-> 4: %empty .          `-> 6: %empty
+input.y: warning: shift/reduce conflict on token B [-Wcounterexamples]
+  First example: A X . B Y $end
+  Shift derivation
+    $accept
+    `-> 0: s                               $end
+           `-> 2: A xby
+                    `-> 10: X xby        Y
+                              `-> 9: . B
+  Second example: A X . B y $end
+  Reduce derivation
+    $accept
+    `-> 0: s                                                   $end
+           `-> 1: ax                                by
+                  `-> 3: A x                        `-> 6: B y
+                           `-> 5: X x
+                                    `-> 4: %empty .
+input.y:5.4-9: warning: rule useless in parser due to conflicts [-Wother]
+]],
+[[input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token B [-Wcounterexamples]
+  Example           A . B
+  Shift derivation  s -> [ A xby -> [ . B ] ]
+  Reduce derivation s -> [ ax -> [ A x -> [ . ] ] by -> [ B y -> [ ] ] ]
+input.y: warning: shift/reduce conflict on token B [-Wcounterexamples]
+  First example     A X . B Y $end
+  Shift derivation  $accept -> [ s -> [ A xby -> [ X xby -> [ . B ] Y ] ] $end ]
+  Second example    A X . B y $end
+  Reduce derivation $accept -> [ s -> [ ax -> [ A x -> [ X x -> [ . ] ] ] by -> [ B y ] ] $end ]
+input.y:5.4-9: warning: rule useless in parser due to conflicts [-Wother]
+]])
+
+AT_CLEANUP
+
+## ---------------------------- ##
+## Non-unifying Ambiguous S/R.  ##
+## ---------------------------- ##
+
+AT_SETUP([Non-unifying Ambiguous S/R])
+
+AT_DATA([[input.y]],
+[[%token A B C D E
+%%
+g: s | x;
+s: A x E | A x D E;
+x: b cd | bc;
+b: B;
+cd: C D;
+bc: B C;
+]])
+
+AT_BISON_CHECK_CEX(
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token C [-Wcounterexamples]
+  First example: B . C $end
+  Shift derivation
+    $accept
+    `-> 0: g                          $end
+           `-> 2: x
+                  `-> 6: bc
+                         `-> 9: B . C
+  Second example: B . C D $end
+  Reduce derivation
+    $accept
+    `-> 0: g                                   $end
+           `-> 2: x
+                  `-> 5: b          cd
+                         `-> 7: B . `-> 8: C D
+input.y:6.4: warning: rule useless in parser due to conflicts [-Wother]
+]],
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token C [-Wcounterexamples]
+  First example     B . C $end
+  Shift derivation  $accept -> [ g -> [ x -> [ bc -> [ B . C ] ] ] $end ]
+  Second example    B . C D $end
+  Reduce derivation $accept -> [ g -> [ x -> [ b -> [ B . ] cd -> [ C D ] ] ] $end ]
+input.y:6.4: warning: rule useless in parser due to conflicts [-Wother]
+]])
+
+AT_CLEANUP
+
+## ------------------------------ ##
+## Non-unifying Unambiguous S/R.  ##
+## ------------------------------ ##
+
+AT_SETUP([Non-unifying Unambiguous S/R])
+
+AT_DATA([[input.y]],
+[[%token A B
+%%
+s: t | s t;
+t: x | y;
+x: A;
+y: A A B;
+]])
+
+AT_BISON_CHECK_CEX(
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token A [-Wcounterexamples]
+  First example: A . A B $end
+  Shift derivation
+    $accept
+    `-> 0: s                            $end
+           `-> 1: t
+                  `-> 4: y
+                         `-> 6: A . A B
+  Second example: A . A $end
+  Reduce derivation
+    $accept
+    `-> 0: s                                               $end
+           `-> 2: s                        t
+                  `-> 1: t                 `-> 3: x
+                         `-> 3: x                 `-> 5: A
+                                `-> 5: A .
+]],
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token A [-Wcounterexamples]
+  First example     A . A B $end
+  Shift derivation  $accept -> [ s -> [ t -> [ y -> [ A . A B ] ] ] $end ]
+  Second example    A . A $end
+  Reduce derivation $accept -> [ s -> [ s -> [ t -> [ x -> [ A . ] ] ] t -> [ x -> [ A ] ] ] $end ]
+]])
+
+AT_CLEANUP
+
+## ----------------------- ##
+## S/R after first token.  ##
+## ----------------------- ##
+
+AT_SETUP([S/R after first token])
+
+AT_DATA([[input.y]],
+[[%token A B X Y
+%%
+a: r t | s;
+r: b;
+b: B;
+t: A xx | A x xy;
+s: b A xx y;
+x: X;
+xx: X X;
+xy: X Y;
+y: Y;
+]])
+
+AT_BISON_CHECK_CEX(
+[[input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token A [-Wcounterexamples]
+  Example: b . A X X Y
+  Shift derivation
+    a
+    `-> 2: s
+           `-> 7: b . xx           y
+                      `-> 9: A X X `-> 11: Y
+  Reduce derivation
+    a
+    `-> 1: r          t
+           `-> 3: b . `-> 6: A x        xy
+                               `-> 8: X `-> 10: X Y
+input.y: warning: shift/reduce conflict on token X [-Wcounterexamples]
+  First example: A X . X
+  Shift derivation
+    a
+    `-> 1: t
+           `-> 5: A xx
+                    `-> 9: X . X
+  Second example: X . X xy
+  Reduce derivation
+    a
+    `-> 1: x          t
+           `-> 8: X . `-> 6: X xy
+input.y:4.4: warning: rule useless in parser due to conflicts [-Wother]
+input.y:8.4: warning: rule useless in parser due to conflicts [-Wother]
+]],
+[[input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token A [-Wcounterexamples]
+  Example           b . A X X Y
+  Shift derivation  a -> [ s -> [ b . xx -> [ A X X ] y -> [ Y ] ] ]
+  Reduce derivation a -> [ r -> [ b . ] t -> [ A x -> [ X ] xy -> [ X Y ] ] ]
+input.y: warning: shift/reduce conflict on token X [-Wcounterexamples]
+  First example     A X . X
+  Shift derivation  a -> [ t -> [ A xx -> [ X . X ] ] ]
+  Second example    X . X xy
+  Reduce derivation a -> [ x -> [ X . ] t -> [ X xy ] ]
+input.y:4.4: warning: rule useless in parser due to conflicts [-Wother]
+input.y:8.4: warning: rule useless in parser due to conflicts [-Wother]
+]])
+
+AT_CLEANUP
+
+## ----------------------------- ##
+## Unifying R/R counterexample.  ##
+## ----------------------------- ##
+
+AT_SETUP([Unifying R/R counterexample])
+
+AT_DATA([[input.y]],
+[[%token A
+%%
+a : A b ;
+b : A | b;
+]])
+
+AT_BISON_CHECK_CEX(
+[[input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
+input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples]
+  Example: A b .
+  First reduce derivation
+    a
+    `-> 1: A b .
+  Second reduce derivation
+    a
+    `-> 1: A b
+             `-> 3: b .
+input.y:4.9: warning: rule useless in parser due to conflicts [-Wother]
+]],
+[[input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
+input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples]
+  Example                  A b .
+  First reduce derivation  a -> [ A b . ]
+  Second reduce derivation a -> [ A b -> [ b . ] ]
+input.y:4.9: warning: rule useless in parser due to conflicts [-Wother]
+]])
+
+AT_CLEANUP
+
+## --------------------------------- ##
+## Non-unifying R/R LR(1) conflict.  ##
+## --------------------------------- ##
+
+AT_SETUP([Non-unifying R/R LR(1) conflict])
+
+AT_DATA([[input.y]],
+[[%token A B C D
+%%
+s: a A | B a C | b C | B b A;
+a: D;
+b: D;
+]])
+
+AT_BISON_CHECK_CEX(
+[[input.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
+input.y: warning: reduce/reduce conflict on tokens A, C [-Wcounterexamples]
+  First example: D . A $end
+  First reduce derivation
+    $accept
+    `-> 0: s                   $end
+           `-> 1: a          A
+                  `-> 5: D .
+  Second example: B D . A $end
+  Second reduce derivation
+    $accept
+    `-> 0: s                     $end
+           `-> 4: B b          A
+                    `-> 6: D .
+input.y:5.4: warning: rule useless in parser due to conflicts [-Wother]
+]],
+[[input.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
+input.y: warning: reduce/reduce conflict on tokens A, C [-Wcounterexamples]
+  First example            D . A $end
+  First reduce derivation  $accept -> [ s -> [ a -> [ D . ] A ] $end ]
+  Second example           B D . A $end
+  Second reduce derivation $accept -> [ s -> [ B b -> [ D . ] A ] $end ]
+input.y:5.4: warning: rule useless in parser due to conflicts [-Wother]
+]])
+
+AT_CLEANUP
+
+## --------------------------------- ##
+## Non-unifying R/R LR(2) conflict.  ##
+## --------------------------------- ##
+
+AT_SETUP([Non-unifying R/R LR(2) conflict])
+
+AT_DATA([[input.y]],
+[[%token H J K X
+%%
+s: a J;
+a: H i;
+i: X | i J K;
+]])
+
+AT_BISON_CHECK_CEX(
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token J [-Wcounterexamples]
+time limit exceeded: XXX
+  First example: H i . J K $end
+  Shift derivation
+    $accept
+    `-> 0: a                       $end
+           `-> 2: H i
+                    `-> 4: i . J K
+  Second example: H i . J $end
+  Reduce derivation
+    $accept
+    `-> 0: s                     $end
+           `-> 1: a            J
+                  `-> 2: H i .
+input.y:4.4-6: warning: rule useless in parser due to conflicts [-Wother]
+]],
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token J [-Wcounterexamples]
+time limit exceeded: XXX
+  First example     H i . J K $end
+  Shift derivation  $accept -> [ a -> [ H i -> [ i . J K ] ] $end ]
+  Second example    H i . J $end
+  Reduce derivation $accept -> [ s -> [ a -> [ H i . ] J ] $end ]
+input.y:4.4-6: warning: rule useless in parser due to conflicts [-Wother]
+]])
+
+AT_CLEANUP
+
+## -------------------- ##
+## Cex Search Prepend.  ##
+## -------------------- ##
+
+# Tests prepend steps in uniying counterexample
+# graph search
+
+AT_SETUP([Cex Search Prepend])
+
+AT_DATA([[input.y]],
+[[%token N A B C D
+%%
+s: n | n C;
+n: N n D | N n C | N a B | N b;
+a: A;
+b: A B C | A B D;
+]])
+
+AT_BISON_CHECK_CEX(
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token B [-Wcounterexamples]
+  Example: N A . B C
+  Shift derivation
+    s
+    `-> 1: n
+           `-> 6: N b
+                    `-> 8: A . B C
+  Reduce derivation
+    s
+    `-> 2: n                     C
+           `-> 5: N a          B
+                    `-> 7: A .
+input.y: warning: shift/reduce conflict on token B [-Wcounterexamples]
+  Example: N N A . B D C
+  Shift derivation
+    s
+    `-> 1: n
+           `-> 4: N n                       C
+                    `-> 6: N b
+                             `-> 9: A . B D
+  Reduce derivation
+    s
+    `-> 2: n                                C
+           `-> 3: N n                     D
+                    `-> 5: N a          B
+                             `-> 7: A .
+input.y:5.4: warning: rule useless in parser due to conflicts [-Wother]
+]],
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token B [-Wcounterexamples]
+  Example           N A . B C
+  Shift derivation  s -> [ n -> [ N b -> [ A . B C ] ] ]
+  Reduce derivation s -> [ n -> [ N a -> [ A . ] B ] C ]
+input.y: warning: shift/reduce conflict on token B [-Wcounterexamples]
+  Example           N N A . B D C
+  Shift derivation  s -> [ n -> [ N n -> [ N b -> [ A . B D ] ] C ] ]
+  Reduce derivation s -> [ n -> [ N n -> [ N a -> [ A . ] B ] D ] C ]
+input.y:5.4: warning: rule useless in parser due to conflicts [-Wother]
+]])
+
+AT_CLEANUP
+
+## ------------------- ##
+## R/R cex with prec.  ##
+## ------------------- ##
+
+# Tests that counterexamples containing rules using
+# precedence/associativity directives work.
+
+AT_SETUP([R/R cex with prec])
+
+AT_DATA([[input.y]],
+[[%left b
+%right c
+%%
+S: B C | C B;
+A : B  | C  | %empty;
+B : A b A;
+C : A c A;
+]])
+
+AT_BISON_CHECK_CEX(
+[[input.y: warning: 4 reduce/reduce conflicts [-Wconflicts-rr]
+input.y: warning: reduce/reduce conflict on tokens b, c [-Wcounterexamples]
+  Example: B . b c
+  First reduce derivation
+    S
+    `-> 1: B                                 C
+           `-> 6: A          b A             `-> 7: A             c A
+                  `-> 3: B .   `-> 6: %empty        `-> 7: %empty   `-> 7: %empty
+  Second reduce derivation
+    S
+    `-> 1: B C
+             `-> 7: A                                             c A
+                    `-> 3: B                                        `-> 7: %empty
+                           `-> 6: A               b A
+                                  `-> 5: %empty .   `-> 6: %empty
+input.y: warning: reduce/reduce conflict on tokens b, c [-Wcounterexamples]
+  Example: C . c b
+  First reduce derivation
+    S
+    `-> 2: C                                 B
+           `-> 7: A          c A             `-> 6: A             b A
+                  `-> 4: C .   `-> 7: %empty        `-> 6: %empty   `-> 6: %empty
+  Second reduce derivation
+    S
+    `-> 2: C B
+             `-> 6: A                                             b A
+                    `-> 4: C                                        `-> 6: %empty
+                           `-> 7: A               c A
+                                  `-> 5: %empty .   `-> 7: %empty
+]],
+[[input.y: warning: 4 reduce/reduce conflicts [-Wconflicts-rr]
+input.y: warning: reduce/reduce conflict on tokens b, c [-Wcounterexamples]
+  Example                  B . b c
+  First reduce derivation  S -> [ B -> [ A -> [ B . ] b A -> [ ] ] C -> [ A -> [ ] c A -> [ ] ] ]
+  Second reduce derivation S -> [ B C -> [ A -> [ B -> [ A -> [ . ] b A -> [ ] ] ] c A -> [ ] ] ]
+input.y: warning: reduce/reduce conflict on tokens b, c [-Wcounterexamples]
+  Example                  C . c b
+  First reduce derivation  S -> [ C -> [ A -> [ C . ] c A -> [ ] ] B -> [ A -> [ ] b A -> [ ] ] ]
+  Second reduce derivation S -> [ C B -> [ A -> [ C -> [ A -> [ . ] c A -> [ ] ] ] b A -> [ ] ] ]
+]])
+
+AT_CLEANUP
+
+## ------------------- ##
+## Null nonterminals.  ##
+## ------------------- ##
+
+AT_SETUP([Null nonterminals])
+
+AT_DATA([[input.y]],
+[[%token A
+%%
+a : b d | c d ;
+b : ;
+c : ;
+d : a | c A | d;
+]])
+
+AT_BISON_CHECK_CEX(
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: 6 reduce/reduce conflicts [-Wconflicts-rr]
+input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples]
+  First example: . c A A $end
+  First reduce derivation
+    $accept
+    `-> 0: a                                   $end
+           `-> 1: b               d
+                  `-> 3: %empty . `-> 6: c A A
+  Second example: . c A A $end
+  Second reduce derivation
+    $accept
+    `-> 0: a                                   $end
+           `-> 2: c               d
+                  `-> 4: %empty . `-> 6: c A A
+input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples]
+time limit exceeded: XXX
+  First example: b . c A A $end
+  First reduce derivation
+    $accept
+    `-> 0: a                                                   $end
+           `-> 1: b d
+                    `-> 5: a
+                           `-> 1: b               d
+                                  `-> 3: %empty . `-> 6: c A A
+  Second example: b . A $end
+  Second reduce derivation
+    $accept
+    `-> 0: a                                 $end
+           `-> 1: b d
+                    `-> 6: c               A
+                           `-> 4: %empty .
+input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples]
+time limit exceeded: XXX
+  First example: c . c A A $end
+  First reduce derivation
+    $accept
+    `-> 0: a                                                   $end
+           `-> 2: c d
+                    `-> 5: a
+                           `-> 1: b               d
+                                  `-> 3: %empty . `-> 6: c A A
+  Second example: c . A $end
+  Second reduce derivation
+    $accept
+    `-> 0: a                                 $end
+           `-> 2: c d
+                    `-> 6: c               A
+                           `-> 4: %empty .
+input.y: warning: shift/reduce conflict on token A [-Wcounterexamples]
+time limit exceeded: XXX
+  First example: b c . A
+  Shift derivation
+    a
+    `-> 1: b d
+             `-> 6: c . A
+  Second example: b c . c A A $end
+  Reduce derivation
+    $accept
+    `-> 0: a                                                                   $end
+           `-> 1: b d
+                    `-> 5: a
+                           `-> 2: c d
+                                    `-> 5: a
+                                           `-> 1: b               d
+                                                  `-> 3: %empty . `-> 6: c A A
+input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples]
+  First example: b c . c A A $end
+  First reduce derivation
+    $accept
+    `-> 0: a                                                                   $end
+           `-> 1: b d
+                    `-> 5: a
+                           `-> 2: c d
+                                    `-> 5: a
+                                           `-> 1: b               d
+                                                  `-> 3: %empty . `-> 6: c A A
+  Second example: b c . A $end
+  Second reduce derivation
+    $accept
+    `-> 0: a                                                 $end
+           `-> 1: b d
+                    `-> 5: a
+                           `-> 2: c d
+                                    `-> 6: c               A
+                                           `-> 4: %empty .
+input.y: warning: shift/reduce conflict on token A [-Wcounterexamples]
+  First example: b c . A
+  Shift derivation
+    a
+    `-> 1: b d
+             `-> 6: c . A
+  Second example: b c . A $end
+  Reduce derivation
+    $accept
+    `-> 0: a                                                 $end
+           `-> 1: b d
+                    `-> 5: a
+                           `-> 2: c d
+                                    `-> 6: c               A
+                                           `-> 4: %empty .
+input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples]
+  Example: b d .
+  First reduce derivation
+    a
+    `-> 1: b d .
+  Second reduce derivation
+    a
+    `-> 1: b d
+             `-> 7: d .
+input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples]
+  Example: c d .
+  First reduce derivation
+    a
+    `-> 2: c d .
+  Second reduce derivation
+    a
+    `-> 2: c d
+             `-> 7: d .
+input.y:5.4: warning: rule useless in parser due to conflicts [-Wother]
+input.y:6.15: warning: rule useless in parser due to conflicts [-Wother]
+]],
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: 6 reduce/reduce conflicts [-Wconflicts-rr]
+input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples]
+  First example            . c A A $end
+  First reduce derivation  $accept -> [ a -> [ b -> [ . ] d -> [ c A A ] ] $end ]
+  Second example           . c A A $end
+  Second reduce derivation $accept -> [ a -> [ c -> [ . ] d -> [ c A A ] ] $end ]
+input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples]
+time limit exceeded: XXX
+  First example            b . c A A $end
+  First reduce derivation  $accept -> [ a -> [ b d -> [ a -> [ b -> [ . ] d -> [ c A A ] ] ] ] $end ]
+  Second example           b . A $end
+  Second reduce derivation $accept -> [ a -> [ b d -> [ c -> [ . ] A ] ] $end ]
+input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples]
+time limit exceeded: XXX
+  First example            c . c A A $end
+  First reduce derivation  $accept -> [ a -> [ c d -> [ a -> [ b -> [ . ] d -> [ c A A ] ] ] ] $end ]
+  Second example           c . A $end
+  Second reduce derivation $accept -> [ a -> [ c d -> [ c -> [ . ] A ] ] $end ]
+input.y: warning: shift/reduce conflict on token A [-Wcounterexamples]
+time limit exceeded: XXX
+  First example     b c . A
+  Shift derivation  a -> [ b d -> [ c . A ] ]
+  Second example    b c . c A A $end
+  Reduce derivation $accept -> [ a -> [ b d -> [ a -> [ c d -> [ a -> [ b -> [ . ] d -> [ c A A ] ] ] ] ] ] $end ]
+input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples]
+  First example            b c . c A A $end
+  First reduce derivation  $accept -> [ a -> [ b d -> [ a -> [ c d -> [ a -> [ b -> [ . ] d -> [ c A A ] ] ] ] ] ] $end ]
+  Second example           b c . A $end
+  Second reduce derivation $accept -> [ a -> [ b d -> [ a -> [ c d -> [ c -> [ . ] A ] ] ] ] $end ]
+input.y: warning: shift/reduce conflict on token A [-Wcounterexamples]
+  First example     b c . A
+  Shift derivation  a -> [ b d -> [ c . A ] ]
+  Second example    b c . A $end
+  Reduce derivation $accept -> [ a -> [ b d -> [ a -> [ c d -> [ c -> [ . ] A ] ] ] ] $end ]
+input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples]
+  Example                  b d .
+  First reduce derivation  a -> [ b d . ]
+  Second reduce derivation a -> [ b d -> [ d . ] ]
+input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples]
+  Example                  c d .
+  First reduce derivation  a -> [ c d . ]
+  Second reduce derivation a -> [ c d -> [ d . ] ]
+input.y:5.4: warning: rule useless in parser due to conflicts [-Wother]
+input.y:6.15: warning: rule useless in parser due to conflicts [-Wother]
+]])
+
+AT_CLEANUP
+
+## --------------------------- ##
+## Non-unifying Prefix Share.  ##
+## --------------------------- ##
+
+AT_SETUP([Non-unifying Prefix Share])
+
+# Tests for a counterexample which should start its derivation
+# at a shared symbol rather than the start symbol.
+
+AT_DATA([[input.y]],
+[[%token H J
+%%
+s: a | a J;
+a: H i J J
+i: %empty | i J;
+]])
+
+AT_BISON_CHECK_CEX(
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token J [-Wcounterexamples]
+  Example: H i J . J J
+  Shift derivation
+    s
+    `-> 2: a                J
+           `-> 3: H i J . J
+  Reduce derivation
+    s
+    `-> 1: a
+           `-> 3: H i            J J
+                    `-> 5: i J .
+input.y:5.13-15: warning: rule useless in parser due to conflicts [-Wother]
+]],
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token J [-Wcounterexamples]
+  Example           H i J . J J
+  Shift derivation  s -> [ a -> [ H i J . J ] J ]
+  Reduce derivation s -> [ a -> [ H i -> [ i J . ] J J ] ]
+input.y:5.13-15: warning: rule useless in parser due to conflicts [-Wother]
+]])
+
+AT_CLEANUP
+
+## -------------------- ##
+## Deep Null Unifying.  ##
+## ---------------------##
+
+# Tests that nested nullable nonterminals
+# are derived correctly.
+
+AT_SETUP([Deep Null Unifying])
+
+AT_DATA([[input.y]],
+[[%token A D
+%%
+s: A a d | A a a d;
+a: b;
+b: c
+c: %empty
+d: D;
+]])
+
+AT_BISON_CHECK_CEX(
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token D [-Wcounterexamples]
+  Example: A a . D
+  Shift derivation
+    s
+    `-> 1: A a d
+               `-> 6: . D
+  Reduce derivation
+    s
+    `-> 2: A a a                             d
+               `-> 3: b                      `-> 6: D
+                      `-> 4: c
+                             `-> 5: %empty .
+]],
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token D [-Wcounterexamples]
+  Example           A a . D
+  Shift derivation  s -> [ A a d -> [ . D ] ]
+  Reduce derivation s -> [ A a a -> [ b -> [ c -> [ . ] ] ] d -> [ D ] ]
+]])
+
+AT_CLEANUP
+
+## ------------------------ ##
+## Deep Null Non-unifying.  ##
+## -------------------------##
+
+# Tests that expand_to_conflict works with nullable sybols
+
+AT_SETUP([Deep Null Non-unifying])
+
+AT_DATA([[input.y]],
+[[%token A D E
+%%
+s: A a d | A a a d E;
+a: b;
+b: c
+c: %empty
+d: D;
+]])
+
+AT_BISON_CHECK_CEX(
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token D [-Wcounterexamples]
+  First example: A a . D $end
+  Shift derivation
+    $accept
+    `-> 0: s                     $end
+           `-> 1: A a d
+                      `-> 6: . D
+  Second example: A a . D E $end
+  Reduce derivation
+    $accept
+    `-> 0: s                                                   $end
+           `-> 2: A a a                             d        E
+                      `-> 3: b                      `-> 6: D
+                             `-> 4: c
+                                    `-> 5: %empty .
+]],
+[[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y: warning: shift/reduce conflict on token D [-Wcounterexamples]
+  First example     A a . D $end
+  Shift derivation  $accept -> [ s -> [ A a d -> [ . D ] ] $end ]
+  Second example    A a . D E $end
+  Reduce derivation $accept -> [ s -> [ A a a -> [ b -> [ c -> [ . ] ] ] d -> [ D ] E ] $end ]
+]])
+
+AT_CLEANUP
diff --git a/tests/cxx-type.at b/tests/cxx-type.at
index 9240117..2537d52 100644
--- a/tests/cxx-type.at
+++ b/tests/cxx-type.at
@@ -1,6 +1,6 @@
 # Checking GLR Parsing.                         -*- Autotest -*-
 
-# Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[C++ Type Syntax (GLR).]])
 
@@ -28,6 +28,7 @@
 AT_DATA_GRAMMAR([types.y],
 [[/* Simplified C++ Type and Expression Grammar.  */
 
+%define parse.trace
 $1
 
 %code requires
@@ -60,8 +61,8 @@
   static Node *new_term (char *);
   static void free_node (Node *);
   static char *node_to_string (Node *);
-]m4_bmatch([$2], [stmtMerge],
-[ static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);])[
+]m4_bmatch([$2], [stmt_merge],
+[ static YYSTYPE stmt_merge (YYSTYPE x0, YYSTYPE x1);])[
   #define YYINITDEPTH 10
   #define YYSTACKEXPANDABLE 1
   ]AT_YYERROR_DECLARE[
@@ -127,10 +128,21 @@
 int
 main (int argc, char **argv)
 {
-  assert (argc == 2); (void) argc;
-  if (!freopen (argv[1], "r", stdin))
-    return 3;
-  return yyparse ();
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
+  for (int i = 1; i < argc; ++i)
+    // Enable parse traces on option -p.
+    if (strcmp (argv[i], "-p") == 0)
+      yydebug = 1;
+    else
+      {
+        if (!freopen (argv[i], "r", stdin))
+          return 3;
+        int status = yyparse ();
+        if (!status)
+          return status;
+      }
+  return 0;
 }
 
 ]AT_YYERROR_DEFINE[
@@ -196,7 +208,7 @@
                 tok = c;
                 yylval = YY_NULLPTR;
               }]AT_LOCATION_IF([[
-            yylloc.last_column = colNum-1;]])[
+            yylloc.last_column = colNum;]])[
             return tok;
           }
         }
@@ -279,9 +291,9 @@
 }
 
 ]]
-m4_bmatch([$2], [stmtMerge],
+m4_bmatch([$2], [stmt_merge],
 [[static YYSTYPE
-stmtMerge (YYSTYPE x0, YYSTYPE x1)
+stmt_merge (YYSTYPE x0, YYSTYPE x1)
 {
   return new_nterm ("<OR>(%s,%s)", x0, x1, YY_NULLPTR);
 }
@@ -332,15 +344,15 @@
 ]])
 
 m4_define([_AT_RESOLVED_GLR_OUTPUT_WITH_LOC],
-[[3.0-3.5: +(z,q)
-5.0-5.3: <declare>(T,x)
-7.0-7.7: <init-declare>(T,x,y)
-9.0-9.5: =(x,y)
-11.0-11.9: +(<cast>(x,T),y)
-13.0-13.5: <declare>(T,x)
-15.0-15.13: <init-declare>(T,y,+(z,q))
-17.0-17.15: <error>
-19.0-19.5: +(z,q)
+[[3.0-3.6: +(z,q)
+5.0-5.4: <declare>(T,x)
+7.0-7.8: <init-declare>(T,x,y)
+9.0-9.6: =(x,y)
+11.0-11.10: +(<cast>(x,T),y)
+13.0-13.6: <declare>(T,x)
+15.0-15.14: <init-declare>(T,y,+(z,q))
+17.0-17.16: <error>
+19.0-19.6: +(z,q)
 ]])
 
 m4_define([_AT_AMBIG_GLR_OUTPUT],
@@ -356,15 +368,15 @@
 ]])
 
 m4_define([_AT_AMBIG_GLR_OUTPUT_WITH_LOC],
-[[3.0-3.5: +(z,q)
-5.0-5.3: <declare>(T,x)
-7.0-7.7: <init-declare>(T,x,y)
-9.0-9.5: =(x,y)
-11.0-11.9: +(<cast>(x,T),y)
-13.0-13.5: <OR>(<declare>(T,x),<cast>(x,T))
-15.0-15.13: <OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
-17.0-17.15: <error>
-19.0-19.5: +(z,q)
+[[3.0-3.6: +(z,q)
+5.0-5.4: <declare>(T,x)
+7.0-7.8: <init-declare>(T,x,y)
+9.0-9.6: =(x,y)
+11.0-11.10: +(<cast>(x,T),y)
+13.0-13.6: <OR>(<declare>(T,x),<cast>(x,T))
+15.0-15.14: <OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
+17.0-17.16: <error>
+19.0-19.6: +(z,q)
 ]])
 
 m4_define([_AT_GLR_STDERR],
@@ -383,67 +395,67 @@
 [[17.5: syntax error, unexpected ID, expecting '=' or '+' or ')'
 ]])
 
+
 ## ---------------------------------------------------- ##
 ## Compile the grammar described in the documentation.  ##
 ## ---------------------------------------------------- ##
 
+# AT_TEST([STDOUT], [STDERR])
+m4_pushdef([AT_TEST],
+[AT_PARSER_CHECK([[types test-input]],   0, [$1], [$2])
+AT_PARSER_CHECK([[types -p test-input]], 0, [$1], [ignore])
+])
+
 AT_SETUP([GLR: Resolve ambiguity, impure, no locations])
 _AT_TEST_GLR_CXXTYPES([],
                       [%dprec 1], [%dprec 2])
-AT_PARSER_CHECK([[types test-input]], 0,
-                [_AT_RESOLVED_GLR_OUTPUT], [_AT_GLR_STDERR])
+AT_TEST([_AT_RESOLVED_GLR_OUTPUT], [_AT_GLR_STDERR])
 AT_CLEANUP
 
 AT_SETUP([GLR: Resolve ambiguity, impure, locations])
 _AT_TEST_GLR_CXXTYPES([%locations],[%dprec 1],[%dprec 2])
-AT_PARSER_CHECK([[types test-input]], 0,
-                [_AT_RESOLVED_GLR_OUTPUT_WITH_LOC], [_AT_GLR_STDERR_WITH_LOC])
+AT_TEST([_AT_RESOLVED_GLR_OUTPUT_WITH_LOC], [_AT_GLR_STDERR_WITH_LOC])
 AT_CLEANUP
 
 AT_SETUP([GLR: Resolve ambiguity, pure, no locations])
 _AT_TEST_GLR_CXXTYPES([%define api.pure],
                       [%dprec 1], [%dprec 2])
-AT_PARSER_CHECK([[types test-input]], 0,
-                [_AT_RESOLVED_GLR_OUTPUT], [_AT_GLR_STDERR])
+AT_TEST([_AT_RESOLVED_GLR_OUTPUT], [_AT_GLR_STDERR])
 AT_CLEANUP
 
 AT_SETUP([GLR: Resolve ambiguity, pure, locations])
 _AT_TEST_GLR_CXXTYPES([%define api.pure %locations],
                       [%dprec 1], [%dprec 2])
-AT_PARSER_CHECK([[types test-input]], 0,
-                [_AT_RESOLVED_GLR_OUTPUT_WITH_LOC], [_AT_GLR_STDERR_WITH_LOC])
+AT_TEST([_AT_RESOLVED_GLR_OUTPUT_WITH_LOC], [_AT_GLR_STDERR_WITH_LOC])
 AT_CLEANUP
 
 AT_SETUP([GLR: Merge conflicting parses, impure, no locations])
 _AT_TEST_GLR_CXXTYPES([],
-                      [%merge <stmtMerge>], [%merge <stmtMerge>])
-AT_PARSER_CHECK([[types test-input]], 0,
-                [_AT_AMBIG_GLR_OUTPUT], [_AT_GLR_STDERR])
+                      [%merge <stmt_merge>], [%merge <stmt_merge>])
+AT_TEST([_AT_AMBIG_GLR_OUTPUT], [_AT_GLR_STDERR])
 AT_CLEANUP
 
 AT_SETUP([GLR: Merge conflicting parses, impure, locations])
 _AT_TEST_GLR_CXXTYPES([%locations],
-                      [%merge <stmtMerge>], [%merge <stmtMerge>])
-AT_PARSER_CHECK([[types test-input]], 0,
-                [_AT_AMBIG_GLR_OUTPUT_WITH_LOC], [_AT_GLR_STDERR_WITH_LOC])
+                      [%merge <stmt_merge>], [%merge <stmt_merge>])
+AT_TEST([_AT_AMBIG_GLR_OUTPUT_WITH_LOC], [_AT_GLR_STDERR_WITH_LOC])
 AT_CLEANUP
 
 AT_SETUP([GLR: Merge conflicting parses, pure, no locations])
 _AT_TEST_GLR_CXXTYPES([%define api.pure],
-                      [%merge <stmtMerge>], [%merge <stmtMerge>])
-AT_PARSER_CHECK([[types test-input]], 0,
-                [_AT_AMBIG_GLR_OUTPUT], [_AT_GLR_STDERR])
+                      [%merge <stmt_merge>], [%merge <stmt_merge>])
+AT_TEST([_AT_AMBIG_GLR_OUTPUT], [_AT_GLR_STDERR])
 AT_CLEANUP
 AT_SETUP([GLR: Merge conflicting parses, pure, locations])
 _AT_TEST_GLR_CXXTYPES([%define api.pure %locations],
-                      [%merge <stmtMerge>],[%merge <stmtMerge>])
-AT_PARSER_CHECK([[types test-input]], 0,
-                [_AT_AMBIG_GLR_OUTPUT_WITH_LOC], [_AT_GLR_STDERR_WITH_LOC])
+                      [%merge <stmt_merge>],[%merge <stmt_merge>])
+AT_TEST([_AT_AMBIG_GLR_OUTPUT_WITH_LOC], [_AT_GLR_STDERR_WITH_LOC])
 AT_CLEANUP
 
 AT_SETUP([GLR: Verbose messages, resolve ambiguity, impure, no locations])
 _AT_TEST_GLR_CXXTYPES([%define parse.error verbose],
-                      [%merge <stmtMerge>], [%merge <stmtMerge>])
-AT_PARSER_CHECK([[types test-input]], 0,
-                [_AT_AMBIG_GLR_OUTPUT], [_AT_VERBOSE_GLR_STDERR])
+                      [%merge <stmt_merge>], [%merge <stmt_merge>])
+AT_TEST([_AT_AMBIG_GLR_OUTPUT], [_AT_VERBOSE_GLR_STDERR])
 AT_CLEANUP
+
+m4_popdef([AT_TEST])
diff --git a/tests/d.at b/tests/d.at
new file mode 100644
index 0000000..d37effb
--- /dev/null
+++ b/tests/d.at
@@ -0,0 +1,155 @@
+# D features tests.                      -*- Autotest -*-
+
+# Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+AT_BANNER([[D Features.]])
+
+# AT_CHECK_D_MINIMAL([DIRECTIVES], [PARSER_ACTION], [POSITION_CLASS], [EXTRA_USER_CODE])
+# ----------------------------------------------------------------------
+# Check that a minimal parser with DIRECTIVES compiles in D.
+# Put the D code in YYParser.d.
+m4_define([AT_CHECK_D_MINIMAL],
+[
+AT_DATA([[YYParser.y]], [
+%language "D"
+%token END "end"
+[$1]
+%%
+start: END {$2};
+%%
+[$4]
+void main() {}
+])
+AT_BISON_CHECK([[-Wno-deprecated YYParser.y]])
+AT_CHECK([[grep '[mb]4_' YYParser.y]], [1], [ignore])
+AT_COMPILE_D([[YYParser]])
+])
+
+# AT_CHECK_D_MINIMAL_W_LEXER([1:DIRECTIVES],
+#       [2:YYLEX_ACTION], [3:LEXER_BODY], [4:PARSER_ACTION], [5:VALUE_TYPE],
+#       [6:POSITION_TYPE], [7:LOCATION_TYPE])
+# ---------------------------------------------------------------------
+# Check that a minimal parser with DIRECTIVES and a body for yylex()
+# compiles in D.
+m4_define([AT_CHECK_D_MINIMAL_W_LEXER],
+[AT_CHECK_D_MINIMAL([$1], [], [], [
+
+import std.range.primitives;
+import std.stdio;
+
+auto calcLexer(R)(R range)
+  if (isInputRange!R && is (ElementType!R : dchar))
+{
+  return new CalcLexer!R(range);
+}
+
+auto calcLexer (File f)
+{
+  import std.algorithm : map, joiner;
+  import std.utf : byDchar;
+
+  return f.byChunk(1024)        // avoid making a syscall roundtrip per char
+          .map!(chunk => cast(char[]) chunk) // because byChunk returns ubyte[]
+          .joiner               // combine chunks into a single virtual range of char
+          .calcLexer;           // forward to other overload
+}
+
+class CalcLexer(R) : Lexer
+  if (isInputRange!R && is (ElementType!R : dchar))
+{
+  R input;
+
+  this(R r) {
+    input = r;
+  }
+
+  void yyerror(string s) {}
+
+  Symbol yylex()
+  {
+    $2
+  }
+}
+]
+[
+  $3
+], [$4], [$6])])
+
+# AT_CHECK_D_GREP([LINE], [COUNT=1])
+# -------------------------------------
+# Check that YYParser.d contains exactly COUNT lines matching ^LINE$
+# with grep.
+m4_define([AT_CHECK_D_GREP],
+[AT_CHECK([grep -c '^$1$' YYParser.d], [ignore], [m4_default([$2], [1])
+])])
+
+## -------------------------------------- ##
+## D parser class extends and implements. ##
+## -------------------------------------- ##
+
+AT_SETUP([D parser class extends and implements])
+AT_KEYWORDS([d])
+
+AT_CHECK_D_MINIMAL([])
+AT_CHECK_D_GREP([[class YYParser]])
+
+AT_CHECK_D_MINIMAL([%define api.parser.extends {BaseClass}], [], [], [class BaseClass {}])
+AT_CHECK_D_GREP([[class YYParser : BaseClass]])
+
+AT_CHECK_D_MINIMAL([%define api.parser.extends {Interface}], [], [], [interface Interface {}])
+AT_CHECK_D_GREP([[class YYParser : Interface]])
+
+AT_CHECK_D_MINIMAL(
+[%define api.parser.extends {BaseClass}
+%define api.parser.implements {Interface}], [], [],
+[class BaseClass {}
+interface Interface {}
+])
+AT_CHECK_D_GREP([[class YYParser : BaseClass, Interface]])
+
+AT_CHECK_D_MINIMAL(
+[%define api.parser.extends {BaseClass}
+%define api.parser.implements {Interface1, Interface2}], [], [],
+[class BaseClass {}
+interface Interface1 {}
+interface Interface2 {}
+])
+AT_CHECK_D_GREP([[class YYParser : BaseClass, Interface1, Interface2]])
+
+AT_CLEANUP
+
+## --------------------------------------------- ##
+## D parser class api.token.raw true by default. ##
+## --------------------------------------------- ##
+
+AT_SETUP([D parser class api.token.raw true by default])
+AT_KEYWORDS([d])
+
+AT_CHECK_D_MINIMAL_W_LEXER([
+%define api.token.raw true
+%union { int ival; }], [return Symbol(TokenKind.END);])
+AT_CHECK_D_GREP([[  END = 3,]])
+
+AT_CHECK_D_MINIMAL_W_LEXER([
+%define api.token.raw false
+%union { int ival; }], [return Symbol(TokenKind.END);])
+AT_CHECK_D_GREP([[  END = 258,]])
+
+AT_CHECK_D_MINIMAL_W_LEXER([
+%union { int ival; }], [return Symbol(TokenKind.END);])
+AT_CHECK_D_GREP([[  END = 3,]])
+
+AT_CLEANUP
diff --git a/tests/diagnostics.at b/tests/diagnostics.at
index cd596be..7b15ff0 100644
--- a/tests/diagnostics.at
+++ b/tests/diagnostics.at
Binary files differ
diff --git a/tests/existing.at b/tests/existing.at
index 018178b..280a754 100644
--- a/tests/existing.at
+++ b/tests/existing.at
@@ -1,6 +1,6 @@
 # Exercising Bison on actual grammars.                   -*- Autotest -*-
 
-# Copyright (C) 1989-1992, 2000-2005, 2007, 2009-2015, 2018-2019 Free
+# Copyright (C) 1989-1992, 2000-2005, 2007, 2009-2015, 2018-2021 Free
 # Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[Existing Grammars.]])
 
@@ -35,14 +35,9 @@
 dnl support is rapidly evolving, let's keep that information to be careful.
 dnl However, we don't do diffs for canonical LR(1) because the diff is huge.
 m4_pushdef([AT_LALR1_DIFF_CHECK],
-[dnl We need diff -u, which is not portable.
-AT_CHECK([diff -u /dev/null /dev/null || exit 77], [0], [ignore])
-
-AT_CHECK([[sed 's/^%define lr.type .*$//' input.y > input-lalr.y]])
-AT_BISON_CHECK([[--report=all input-lalr.y]], [[0]], [ignore], [ignore])
-AT_CHECK([[diff -u input-lalr.output input.output \
-           | sed -n '/^@@/,$p' | sed 's/^ $//']],
-         [[0]], [$1])])
+[AT_CHECK([[sed 's/^%define lr.type .*$//' input.y > input-lalr.y]])
+AT_BISON_CHECK([[--report=all,no-cex input-lalr.y]], [[0]], [ignore], [ignore])
+AT_DIFF_U_CHECK([[input-lalr.output input.output]], [$1])])
 
 AT_TEST_TABLES_AND_PARSE([$2[: LALR(1)]], [[LALR]], [[last-state]],
                          [[%define lr.type lalr
@@ -419,7 +414,7 @@
 dnl getline rule, '*' actually is a valid lookahead.  Solaris /usr/xpg4/bin/awk
 dnl and the Open Group awk specification seem to agree:
 dnl
-dnl   http://www.opengroup.org/pubs/online/7908799/xcu/awk.html
+dnl   https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html
 dnl
 dnl /bin/nawk and /bin/awk on Solaris 10 report it as a syntax error, but they
 dnl don't like even 'print $!4;'.
@@ -439,6 +434,7 @@
 ]AT_COND_CASE([[canonical LR]],
 [[input.y: warning: 265 shift/reduce conflicts [-Wconflicts-sr]]],
 [[input.y: warning: 65 shift/reduce conflicts [-Wconflicts-sr]]])[
+input.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 input.y:39.1-5: warning: useless associativity for FUNC_CALL, use %precedence [-Wprecedence]
 input.y:44.1-5: warning: useless associativity for YNUMBER, use %precedence [-Wprecedence]
 input.y:44.1-5: warning: useless associativity for YSTRING, use %precedence [-Wprecedence]
@@ -1423,6 +1419,7 @@
 input.y: warning: 144 reduce/reduce conflicts [-Wconflicts-rr]]],
 [[input.y: warning: 78 shift/reduce conflicts [-Wconflicts-sr]
 input.y: warning: 10 reduce/reduce conflicts [-Wconflicts-rr]]])[
+input.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 input.y:72.1-5: warning: useless associativity for HQUA, use %precedence [-Wprecedence]
 input.y:53.1-6: warning: useless associativity for HASSIGN, use %precedence [-Wprecedence]
 input.y:54.1-5: warning: useless associativity for HORELSE, use %precedence [-Wprecedence]
diff --git a/tests/glr-regression.at b/tests/glr-regression.at
index 8cf9846..2cd0946 100644
--- a/tests/glr-regression.at
+++ b/tests/glr-regression.at
@@ -1,6 +1,6 @@
 # Checking GLR Parsing: Regression Tests           -*- Autotest -*-
 
-# Copyright (C) 2002-2003, 2005-2007, 2009-2015, 2018-2019 Free Software
+# Copyright (C) 2002-2003, 2005-2007, 2009-2015, 2018-2021 Free Software
 # Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -14,35 +14,131 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[GLR Regression Tests]])
 
+# You might wonder what's the point of having names different for each
+# test case.  When some endlessly loop, it is nice to see their "name"
+# in ps.
+
+# AT_YYPARSE_DEFINE
+# -----------------
+# Wrap the C++ parser in a C-like function interface.
+m4_pushdef([AT_YYPARSE_DEFINE],
+[AT_CXX_IF([[
+static int
+yyparse ()
+{
+  ]AT_NAMESPACE[::]AT_PARSER_CLASS[ p;]AT_DEBUG_IF([[
+  int debug = !!getenv ("YYDEBUG");
+  p.set_debug_level (debug);]])[
+  return p.parse ();
+}
+]])])
+
+
+# AT_PRINT_LOOKAHEAD_DECLARE
+# --------------------------
+m4_define([AT_PRINT_LOOKAHEAD_DECLARE],
+[AT_GLR2_CC_IF(
+[[static void
+  print_lookahead (yy::parser::symbol_type yylookahead, char const *reduction);
+#define PRINT_LOOKAHEAD(Msg) \
+  print_lookahead (yyla, Msg)
+]],
+[[static void
+  print_lookahead (int yychr, ]AT_YYSTYPE[ *yylvalp, ]AT_YYLTYPE[ *yyllocp,
+                   char const *reduction);
+#define PRINT_LOOKAHEAD(Msg) \
+  print_lookahead (yychar, &yylval, &yylloc, Msg)
+]])])
+
+# AT_PRINT_LOOKAHEAD_DEFINE
+# -------------------------
+m4_define([AT_PRINT_LOOKAHEAD_DEFINE],
+[AT_GLR2_CC_IF(
+[[static void
+print_lookahead (yy::parser::symbol_type yylookahead, char const *reduction)
+]],
+[[static void
+print_lookahead (int yychr, ]AT_YYSTYPE[ *yylvalp, ]AT_YYLTYPE[ *yyllocp,
+                 char const *reduction)
+]])[
+{
+]AT_GLR2_CC_IF([[
+  // We use -2 and 0 to avoid this warning:
+  //
+  // glr-regr13.y:114:53: error: enumeral and non-enumeral type in conditional expression [-Werror=extra]
+  //   114 |     : yytoken == yy::parser::symbol_kind::S_YYEOF   ? yy::parser::token::YYEOF
+  //       |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
+  //   115 |     : yytoken == yy::parser::yytranslate_ ('a')     ? 'a'
+  //       |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  //   116 |     : yytoken == yy::parser::yytranslate_ ('b')     ? 'b'
+  //       |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  //   117 |     : '?';
+  //       |     ~~~~~
+  int yytoken = yylookahead.kind ();
+  int yychr
+    = yytoken == yy::parser::symbol_kind::S_YYEMPTY ? -2
+    : yytoken == yy::parser::symbol_kind::S_YYEOF   ? 0
+    : yytoken == yy::parser::symbol_kind::S_3_a_    ? 'a'
+    : yytoken == yy::parser::symbol_kind::S_4_b_    ? 'b'
+    : '?';
+]])[
+  printf ("%s:\n  yychar=", reduction);
+  if (yychr == ]AT_TOKEN([YYEMPTY])[)
+    printf ("YYEMPTY");
+  else if (yychr == ]AT_TOKEN([YYEOF])[)
+    printf ("YYEOF");
+  else
+    {
+      printf ("'%c', yylval='", yychr);]AT_GLR2_CC_IF([[
+      if (yylookahead.value.value > ' ')
+        printf ("%c", yylookahead.value.value);
+      printf ("', yylloc=(%d,%d),(%d,%d)",
+              yylookahead.location.]AT_FIRST_LINE[, yylookahead.location.]AT_FIRST_COLUMN[,
+              yylookahead.location.]AT_LAST_LINE[,  yylookahead.location.]AT_LAST_COLUMN[);]], [[
+      if (yylvalp->value > ' ')
+        printf ("%c", yylvalp->value);
+      printf ("', yylloc=(%d,%d),(%d,%d)",
+              yyllocp->]AT_FIRST_LINE[, yyllocp->]AT_FIRST_COLUMN[,
+              yyllocp->]AT_LAST_LINE[, yyllocp->]AT_LAST_COLUMN[);]])[
+    }
+  printf ("\n");
+}
+]])
+
+
 ## ---------------------------- ##
 ## Badly Collapsed GLR States.  ##
 ## ---------------------------- ##
 
-AT_SETUP([Badly Collapsed GLR States])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Badly Collapsed GLR States: $1])
 
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
+AT_KEYWORDS([%merge])
+
 AT_DATA_GRAMMAR([glr-regr1.y],
 [[/* Regression Test: Improper state compression */
 /* Reported by Scott McPeak */
 
-%{
-#include <stdio.h>
-#include <stdlib.h>
+%define api.value.type {int}
+
+%code {
 #include <assert.h>
 
-#define YYSTYPE int
-static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1);
+static ]AT_YYSTYPE[ exprMerge (]AT_YYSTYPE[ x0, ]AT_YYSTYPE[ x1);
 ]AT_YYERROR_DECLARE[
 ]AT_YYLEX_DECLARE[
-%}
-
+}
 
 %define parse.assert
+%define parse.trace
 %glr-parser
+%expect 1
+]$1[
 
 /* -------- productions ------ */
 %%
@@ -59,7 +155,7 @@
 /* ---------- C code ----------- */
 %%
 
-static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1)
+static ]AT_YYSTYPE[ exprMerge (]AT_YYSTYPE[ x0, ]AT_YYSTYPE[ x1)
 {
   (void) x0;
   (void) x1;
@@ -67,30 +163,29 @@
   return 0;
 }
 
+]AT_YYERROR_DEFINE[
+]AT_YYPARSE_DEFINE[
+
 const char *input = YY_NULLPTR;
 
+]AT_YYLEX_PROTOTYPE[
+{
+  ]AT_USE_LEX_ARGS[
+  return *input++;
+}
+
 int
 main (int argc, const char* argv[])
 {
   assert (argc == 2); (void) argc;
   input = argv[1];
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
   return yyparse ();
 }
-
-]AT_YYERROR_DEFINE[
-
-int
-yylex (void)
-{
-  return *input++;
-}
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr1.c -rall glr-regr1.y]], 0, [],
-[[glr-regr1.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
-]])
-AT_COMPILE([glr-regr1])
+AT_FULL_COMPILE([glr-regr1])
 AT_PARSER_CHECK([[glr-regr1 BPBPB]], 0,
 [[E -> 'B'
 E -> 'B'
@@ -101,24 +196,35 @@
 E -> E 'P' E
 E -> E 'P' E
 <OR>
-]], [])
+]])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
+
+
 
 ## -------------------------------------------------------------- ##
 ## Improper handling of embedded actions and $-N in GLR parsers.  ##
 ## -------------------------------------------------------------- ##
 
-AT_SETUP([Improper handling of embedded actions and dollar(-N) in GLR parsers])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Improper handling of embedded actions and dollar(-N) in GLR parsers: $1])
 
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
+
 AT_DATA_GRAMMAR([glr-regr2a.y],
 [[/* Regression Test: Improper handling of embedded actions and $-N  */
 /* Reported by S. Eken */
 
-%{
-  #define YYSTYPE char *
-
+%define api.value.type {char *}
+%code {
   #include <ctype.h>
   #include <stdio.h>
   #include <stdlib.h>
@@ -126,38 +232,41 @@
   #include <assert.h>
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
-%}
+}
 
 %define parse.assert
+%define parse.trace
 %glr-parser
+%expect 2
+]$1[
 
 %%
 
 command:
     's' var 't'
-       { printf ("Variable: '%s'\n", $2); }
+       { printf ("Variable: '%s'\n", $][2); }
     'v' 'x' 'q'
-       { free ($2); }
+       { free ($][2); }
   | 's' var_list 't' 'e'
-       { printf ("Varlist: '%s'\n", $2); free ($2); }
+       { printf ("Varlist: '%s'\n", $][2); free ($][2); }
   | 's' var 't' var_printer 'x'
-       { free ($2); }
+       { free ($][2); }
   ;
 
 var:
   'V'
-     { $$ = $1; }
+     { $$ = $][1; }
   ;
 
 var_list:
   var
-    { $$ = $1; }
+    { $$ = $][1; }
   | var ',' var_list
     {
-      char *s = YY_CAST (char *, realloc ($1, strlen ($1) + 1 + strlen ($3) + 1));
+      char *s = YY_CAST (char *, realloc ($][1, strlen ($][1) + 1 + strlen ($][3) + 1));
       strcat (s, ",");
-      strcat (s, $3);
-      free ($3);
+      strcat (s, $][3);
+      free ($][3);
       $$ = s;
     }
   ;
@@ -169,10 +278,10 @@
 ]AT_YYERROR_DEFINE[
 FILE *input;
 
-int
-yylex (void)
+]AT_YYLEX_PROTOTYPE[
 {
   char buf[50];
+  ]AT_USE_LEX_ARGS[
   assert (!feof (stdin));
   switch (fscanf (input, " %1[a-z,]", buf))
   {
@@ -189,13 +298,15 @@
         assert (strlen (buf) < sizeof buf - 1);
         s = YY_CAST (char *, malloc (strlen (buf) + 1));
         strcpy (s, buf);
-        yylval = s;
+        ]AT_VAL[ = s;
         return 'V';
       }
     break;
   }
 }
 
+]AT_YYPARSE_DEFINE[
+
 int
 main (int argc, char **argv)
 {
@@ -203,18 +314,16 @@
   input = stdin;
   if (argc == 2 && !(input = fopen (argv[1], "r")))
     return 3;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
   res = yyparse ();
   if (argc == 2 && fclose (input))
     return 4;
   return res;
 }
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr2a.c -rall glr-regr2a.y]], 0, [],
-[[glr-regr2a.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
-]])
-AT_COMPILE([glr-regr2a])
+AT_FULL_COMPILE([glr-regr2a],,,,[-rall])
 
 AT_DATA([input1.txt],
 [[s VARIABLE_1 t v x q
@@ -238,23 +347,32 @@
 [[Variable: 'VARIABLE_3'
 ]])
 
-
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
+
 
 ## --------------------------------------------- ##
 ## Improper merging of GLR delayed action sets.  ##
 ## --------------------------------------------- ##
 
-AT_SETUP([Improper merging of GLR delayed action sets])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Improper merging of GLR delayed action sets: $1])
+AT_KEYWORDS([%merge])
 
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
+
 AT_DATA_GRAMMAR([glr-regr3.y],
 [[/* Regression Test: Improper merging of GLR delayed action sets.  */
 /* Reported by M. Rosien */
 
-%{
-#include <stdio.h>
-#include <stdlib.h>
+%code {
 #include <stdarg.h>
 #include <assert.h>
 
@@ -264,17 +382,21 @@
 
 #define RULE(x) (1 << (x))
 
-%}
+}
 
 %define parse.assert
+%define parse.trace
 %glr-parser
+%expect 1
+%expect-rr 2
+]$1[
 
 %token BAD_CHAR
 %token P1 P2 T1 T2 T3 T4 O1 O2
 
 %%
 
-S : P1 T4 O2 NT6 P2  { printf ("Result: %x\n", $4); }
+S : P1 T4 O2 NT6 P2  { printf ("Result: %x\n", $][4); }
 ;
 
 NT1 : P1 T1 O1 T2 P2 { $$ = RULE(2); }  %merge<MergeRule>
@@ -296,8 +418,8 @@
 NT5 : NT4              { $$ = RULE(10); } %merge<MergeRule>
 ;
 
-NT6 : P1 NT1 O1 T3 P2  { $$ = RULE(11) | $2; } %merge<MergeRule>
-    | NT5              { $$ = RULE(12) | $1; } %merge<MergeRule>
+NT6 : P1 NT1 O1 T3 P2  { $$ = RULE(11) | $][2; } %merge<MergeRule>
+    | NT5              { $$ = RULE(12) | $][1; } %merge<MergeRule>
 ;
 
 %%
@@ -311,13 +433,14 @@
 
 FILE *input = YY_NULLPTR;
 
-int P[] = { P1, P2 };
-int O[] = { O1, O2 };
-int T[] = { T1, T2, T3, T4 };
+int P[] = { ]AT_TOKEN([P1])[, ]AT_TOKEN([P2])[ };
+int O[] = { ]AT_TOKEN([O1])[, ]AT_TOKEN([O2])[ };
+int T[] = { ]AT_TOKEN([T1])[, ]AT_TOKEN([T2])[, ]AT_TOKEN([T3])[, ]AT_TOKEN([T4])[ };
 
-int yylex (void)
+]AT_YYLEX_PROTOTYPE[
 {
   char inp[3];
+  ]AT_USE_LEX_ARGS[
   assert (!feof (stdin));
   if (fscanf (input, "%2s", inp) == EOF)
     return 0;
@@ -327,9 +450,11 @@
     case 't': return T[inp[1] - '1'];
     case 'o': return O[inp[1] - '1'];
     }
-  return BAD_CHAR;
+  return ]AT_TOKEN([BAD_CHAR])[;
 }
 
+]AT_YYPARSE_DEFINE[
+
 int
 main (int argc, char* argv[])
 {
@@ -337,19 +462,16 @@
   input = stdin;
   if (argc == 2 && !(input = fopen (argv[1], "r")))
     return 3;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
   res = yyparse ();
   if (argc == 2 && fclose (input))
     return 4;
   return res;
 }
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr3.c -rall glr-regr3.y]], 0, [],
-[[glr-regr3.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
-glr-regr3.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
-]])
-AT_COMPILE([glr-regr3])
+AT_FULL_COMPILE([glr-regr3],,,,[-rall])
 
 AT_DATA([input.txt],
 [[p1 t4 o2 p1 p1 t1 o1 t2 p2 o1 t3 p2 p2
@@ -359,48 +481,57 @@
 [[Result: 1c04
 ]])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
 
 
-## ---------------------------------------------------------------------- ##
-## Duplicate representation of merged trees.  See                         ##
-## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00013.html>.  ##
-## ---------------------------------------------------------------------- ##
+## ------------------------------------------------------------ ##
+## Duplicate representation of merged trees.  See               ##
+## <https://lists.gnu.org/r/help-bison/2005-07/msg00013.html>.  ##
+## ------------------------------------------------------------ ##
 
-AT_SETUP([Duplicate representation of merged trees])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Duplicate representation of merged trees: $1])
+AT_KEYWORDS([%merge])
 
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
+
 AT_DATA_GRAMMAR([glr-regr4.y],
 [[
 %define parse.assert
-%union { char *ptr; }
-%type <ptr> S A A1 A2 B
+%define parse.trace
+%type <]AT_VALUE_UNION_IF([char*], [ptr])[> S A A1 A2 B
 %glr-parser
+%expect-rr 2
+]$1[
 
-%{
-  #include <stdio.h>
-  #include <stdlib.h>
+%code {
   #include <string.h>
-  static char *merge (YYSTYPE, YYSTYPE);
+  static char *merge (]AT_YYSTYPE[, ]AT_YYSTYPE[);
   static char *make_value (char const *, char const *);
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
   static char *ptrs[100];
   static char **ptrs_next = ptrs;
-%}
+}
 
 %%
 
-tree: S { printf ("%s\n", $1); } ;
+tree: S { printf ("%s\n", $][1); } ;
 
-S:
-  A   %merge<merge> { $$ = make_value ("S", $1); }
-  | B %merge<merge> { $$ = make_value ("S", $1); }
+S : A %merge<merge> { $$ = make_value ("S", $][1); }
+  | B %merge<merge> { $$ = make_value ("S", $][1); }
   ;
 
-A:
-  A1   %merge<merge> { $$ = make_value ("A", $1); }
-  | A2 %merge<merge> { $$ = make_value ("A", $1); }
+A : A1 %merge<merge> { $$ = make_value ("A", $][1); }
+  | A2 %merge<merge> { $$ = make_value ("A", $][1); }
   ;
 
 A1: 'a' { $$ = make_value ("A1", "'a'"); } ;
@@ -409,12 +540,16 @@
 
 %%
 ]AT_YYERROR_DEFINE[
+]AT_YYPARSE_DEFINE[
 ]AT_YYLEX_DEFINE(["a"])[
 
 int
 main (void)
 {
-  int status = yyparse ();
+  int status = -1;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
+  status = yyparse ();
   while (ptrs_next != ptrs)
     free (*--ptrs_next);
   return status;
@@ -431,49 +566,64 @@
 }
 
 static char *
-merge (YYSTYPE s1, YYSTYPE s2)
+merge (]AT_YYSTYPE[ s1, ]AT_YYSTYPE[ s2)
 {
-  char const format[] = "merge{ %s and %s }";
-  char *value = *ptrs_next++ =
+  char const format[] = "merge{ %s and %s }";]AT_VALUE_UNION_IF([[
+  char *res = *ptrs_next++ =
+    YY_CAST (char *, malloc (strlen (s1.S) + strlen (s2.S) + sizeof format));
+  sprintf (res, format, s1.S, s2.S);]], [[
+  char *res = *ptrs_next++ =
     YY_CAST (char *, malloc (strlen (s1.ptr) + strlen (s2.ptr) + sizeof format));
-  sprintf (value, format, s1.ptr, s2.ptr);
-  return value;
+  sprintf (res, format, s1.ptr, s2.ptr);]])[
+  return res;
 }
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr4.c -rall glr-regr4.y]], 0, [],
-[[glr-regr4.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
-]])
-AT_COMPILE([glr-regr4])
+AT_FULL_COMPILE([glr-regr4],,,,[-rall])
 
 AT_PARSER_CHECK([[glr-regr4]], 0,
 [[merge{ S <- merge{ A <- A1 <- 'a' and A <- A2 <- 'a' } and S <- B <- 'a' }
 ]], [])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%union { char *ptr; } %skeleton "glr.c"])
+AT_TEST([%union { char *ptr; } %skeleton "glr.cc"])
+AT_TEST([%union { char *ptr; } %skeleton "glr2.cc"])
+
+AT_TEST([%define api.value.type union %skeleton "glr.c"])
+AT_TEST([%define api.value.type union %skeleton "glr.cc"])
+AT_TEST([%define api.value.type union %skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
 
 
-## ------------------------------------------------------------------------- ##
-## User destructor for unresolved GLR semantic value.  See                   ##
-## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00016.html>.  ##
-## ------------------------------------------------------------------------- ##
+## --------------------------------------------------------------- ##
+## User destructor for unresolved GLR semantic value.  See         ##
+## <https://lists.gnu.org/r/bison-patches/2005-08/msg00016.html>.  ##
+## --------------------------------------------------------------- ##
 
-AT_SETUP([User destructor for unresolved GLR semantic value])
+m4_pushdef([AT_TEST],
+[AT_SETUP([User destructor for unresolved GLR semantic value: $1])
 
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
 AT_DATA_GRAMMAR([glr-regr5.y],
 [[
-%{
-  #include <stdio.h>
-  #include <stdlib.h>
+%code {
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
   enum { MAGIC_VALUE = -1057808125 }; /* originally chosen at random */
-%}
+}
 
 %define parse.assert
+%define parse.trace
 %glr-parser
+%expect 0
+%expect-rr 1
+]$1[
+
 %union { int value; }
 %type <value> start
 
@@ -497,39 +647,56 @@
 ]AT_YYLEX_DEFINE(["a"])[
 ]AT_MAIN_DEFINE[
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr5.c -rall glr-regr5.y]], 0, [],
-[[glr-regr5.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
-]])
-AT_COMPILE([glr-regr5])
+AT_FULL_COMPILE([glr-regr5],,,, [-rall])
 
 AT_PARSER_CHECK([[glr-regr5]], 1, [],
-[syntax is ambiguous
+[Ambiguity detected.
+Option 1,
+  start -> <Rule 1, tokens 1 .. 1>
+    'a' <tokens 1 .. 1>
+
+Option 2,
+  start -> <Rule 2, tokens 1 .. 1>
+    'a' <tokens 1 .. 1>
+
+syntax is ambiguous
 ])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
 
 
-## ------------------------------------------------------------------------- ##
-## User destructor after an error during a split parse.  See                 ##
-## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00029.html>.  ##
-## ------------------------------------------------------------------------- ##
 
-AT_SETUP([User destructor after an error during a split parse])
+## --------------------------------------------------------------- ##
+## User destructor after an error during a split parse.  See       ##
+## <https://lists.gnu.org/r/bison-patches/2005-08/msg00029.html>.  ##
+## --------------------------------------------------------------- ##
 
-AT_BISON_OPTION_PUSHDEFS
+m4_pushdef([AT_TEST],
+[AT_SETUP([User destructor after an error during a split parse: $1])
+
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
 AT_DATA_GRAMMAR([glr-regr6.y],
 [[
-%{
-  #include <stdio.h>
-  #include <stdlib.h>
+%code {
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
-%}
+}
 
 %define parse.assert
+%define parse.trace
 %glr-parser
+%expect-rr 1
+]$1[
+
 %union { int value; }
 %type <value> 'a'
 
@@ -546,47 +713,68 @@
 ]AT_YYLEX_DEFINE(["a"])[
 ]AT_MAIN_DEFINE[
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr6.c -rall glr-regr6.y]], 0, [],
-[[glr-regr6.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
-]])
-AT_COMPILE([glr-regr6])
+AT_FULL_COMPILE([glr-regr6],,,, [-rall])
 
 AT_PARSER_CHECK([[glr-regr6]], 1,
 [Destructor called.
 ],
-[syntax is ambiguous
+[Ambiguity detected.
+Option 1,
+  start -> <Rule 1, tokens 1 .. 1>
+    'a' <tokens 1 .. 1>
+
+Option 2,
+  start -> <Rule 2, tokens 1 .. 1>
+    'a' <tokens 1 .. 1>
+
+syntax is ambiguous
 ])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
 
 
-## ------------------------------------------------------------------------- ##
-## Duplicated user destructor for lookahead.  See                            ##
-## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00035.html>.  ##
-## ------------------------------------------------------------------------- ##
 
-AT_SETUP([Duplicated user destructor for lookahead])
+## --------------------------------------------------------------- ##
+## Duplicated user destructor for lookahead.  See                  ##
+## <https://lists.gnu.org/r/bison-patches/2005-08/msg00035.html>.  ##
+## --------------------------------------------------------------- ##
 
-AT_BISON_OPTION_PUSHDEFS
+m4_pushdef([AT_TEST],
+[AT_SETUP([Duplicated user destructor for lookahead: $1])
+
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
+
 AT_DATA_GRAMMAR([glr-regr7.y],
 [[
-%{
-  #include <stdio.h>
-  #include <stdlib.h>
-  ]AT_YYERROR_DECLARE[
-  ]AT_YYLEX_DECLARE[
-  #define YYSTACKEXPANDABLE 0
+%code requires {
   typedef struct count_node {
     int count;
     struct count_node *prev;
   } count_node;
+}
+
+%code {
+  ]AT_YYERROR_DECLARE[
+  ]AT_YYLEX_DECLARE[
+  #define YYSTACKEXPANDABLE 0
   static count_node *tail;
-%}
+}
 
 %define parse.assert
+%define parse.trace
 %glr-parser
+%expect-rr 2
+]$1[
+
 %union { count_node *node; }
 %type <node> 'a'
 
@@ -607,26 +795,31 @@
 
 %%
 
-static int
-yylex (void)
+]AT_YYLEX_PROTOTYPE[
 {
-  yylval.node = YY_CAST (count_node*, malloc (sizeof *yylval.node));
-  if (!yylval.node)
+  ]AT_USE_LEX_ARGS[
+  ]AT_VAL[.node = YY_CAST (count_node*, malloc (sizeof *]AT_VAL[.node));
+  if (!]AT_VAL[.node)
     {
       fprintf (stderr, "Test inconclusive.\n");
       exit (EXIT_FAILURE);
     }
-  yylval.node->count = 0;
-  yylval.node->prev = tail;
-  tail = yylval.node;
+  ]AT_VAL[.node->count = 0;
+  ]AT_VAL[.node->prev = tail;
+  tail = ]AT_VAL[.node;
   return 'a';
 }
 
 ]AT_YYERROR_DEFINE[
+]AT_YYPARSE_DEFINE[
+
 int
 main (void)
 {
-  int status = yyparse ();
+  int status;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
+  status = yyparse ();
   while (tail)
     {
       count_node *prev = tail->prev;
@@ -636,54 +829,62 @@
   return status;
 }
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr7.c -rall glr-regr7.y]], 0, [],
-[[glr-regr7.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
-]])
-AT_COMPILE([glr-regr7])
+AT_FULL_COMPILE([glr-regr7],,,, [-rall])
 
 AT_PARSER_CHECK([[glr-regr7]], 2, [],
 [memory exhausted
 ])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
+
 
 
 ## ------------------------------------------------------------------------- ##
 ## Incorrect default location for empty right-hand sides.  Adapted from bug  ##
 ## report by Claudia Hermann.                                                ##
-## See http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00069.html and ##
-## http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00072.html         ##
+## See https://lists.gnu.org/r/bug-bison/2005-10/msg00069.html and           ##
+## https://lists.gnu.org/r/bug-bison/2005-10/msg00072.html                   ##
 ## ------------------------------------------------------------------------- ##
 
-AT_SETUP([Incorrectly initialized location for empty right-hand side in GLR])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Incorrectly initialized location for empty right-hand side in GLR: $1])
 
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%glr-parser %locations $1])
+
 AT_DATA_GRAMMAR([glr-regr8.y],
 [[
-%{
-  #include <stdio.h>
-  #include <stdlib.h>
+%code {
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
-%}
+}
+
+%define parse.assert
+%define parse.trace
+%glr-parser
+%expect-rr 1
+]$1[
 
 %token T_CONSTANT
 %token T_PORT
 %token T_SIGNAL
 
-%define parse.assert
-%glr-parser
-
 %%
 
 
 PortClause      : T_PORT InterfaceDeclaration T_PORT
                 { printf("%d/%d - %d/%d - %d/%d\n",
-                         @1.first_column, @1.last_column,
-                         @2.first_column, @2.last_column,
-                         @3.first_column, @3.last_column); }
+                         @1.]AT_FIRST_COLUMN[, @1.]AT_LAST_COLUMN[,
+                         @2.]AT_FIRST_COLUMN[, @2.]AT_LAST_COLUMN[,
+                         @3.]AT_FIRST_COLUMN[, @3.]AT_LAST_COLUMN[); }
         ;
 
 InterfaceDeclaration    : OptConstantWord       %dprec 1
@@ -695,7 +896,7 @@
         ;
 
 OptSignalWord   : %empty
-                { printf("empty: %d/%d\n", @$.first_column, @$.last_column); }
+                { printf("empty: %d/%d\n", @$.]AT_FIRST_COLUMN[, @$.]AT_LAST_COLUMN[); }
         | T_SIGNAL
         ;
 
@@ -704,21 +905,22 @@
 ]AT_YYERROR_DEFINE[
 static int lexIndex;
 
-int yylex (void)
+]AT_YYLEX_PROTOTYPE[
 {
+  ]AT_USE_LEX_ARGS[
   lexIndex += 1;
   switch (lexIndex)
     {
     default:
       abort ();
     case 1:
-      yylloc.first_column = 1;
-      yylloc.last_column = 9;
-      return T_PORT;
+      ]AT_LOC_FIRST_COLUMN[ = 1;
+      ]AT_LOC_LAST_COLUMN[ = 9;
+      return ]AT_TOKEN([T_PORT])[;
     case 2:
-      yylloc.first_column = 13;
-      yylloc.last_column = 17;
-      return T_PORT;
+      ]AT_LOC_FIRST_COLUMN[ = 13;
+      ]AT_LOC_LAST_COLUMN[ = 17;
+      return ]AT_TOKEN([T])[_PORT;
     case 3:
       return 0;
     }
@@ -726,12 +928,8 @@
 
 ]AT_MAIN_DEFINE[
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr8.c -rall glr-regr8.y]], 0, [],
-[[glr-regr8.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
-]])
-AT_COMPILE([glr-regr8])
+AT_FULL_COMPILE([glr-regr8],,,, [-rall])
 
 AT_PARSER_CHECK([[glr-regr8]], 0,
 [empty: 9/9
@@ -739,32 +937,44 @@
 ],
 [])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
 
 
-## ------------------------------------------------------------------------- ##
-## No users destructors if stack 0 deleted.  See                             ##
-## <http://lists.gnu.org/archive/html/bison-patches/2005-09/msg00109.html>.  ##
-## ------------------------------------------------------------------------- ##
 
-AT_SETUP([No users destructors if stack 0 deleted])
+## --------------------------------------------------------------- ##
+## No users destructors if stack 0 deleted.  See                   ##
+## <https://lists.gnu.org/r/bison-patches/2005-09/msg00109.html>.  ##
+## --------------------------------------------------------------- ##
 
-AT_BISON_OPTION_PUSHDEFS
+m4_pushdef([AT_TEST],
+[AT_SETUP([No users destructors if stack 0 deleted: $1])
+
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
 AT_DATA_GRAMMAR([glr-regr9.y],
 [[
-%{
-# include <stdio.h>
-# include <stdlib.h>
+%code {
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
 # define YYSTACKEXPANDABLE 0
   static int tokens = 0;
   static int destructors = 0;
 # define USE(Var)
-%}
+}
 
 %define parse.assert
+%define parse.trace
 %glr-parser
+%expect-rr 2
+]$1[
+
 %union { int dummy; }
 %type <dummy> 'a'
 
@@ -775,7 +985,7 @@
 %%
 
 start:
-    ambig0 'a'   { destructors += 2; USE ($2); }
+    ambig0 'a'   { destructors += 2; USE ($][2); }
   | ambig1 start { destructors += 1; }
   | ambig2 start { destructors += 1; }
   ;
@@ -786,61 +996,74 @@
 
 %%
 
-static int
-yylex (void)
+]AT_YYLEX_PROTOTYPE[
 {
+  ]AT_USE_LEX_ARGS[
   tokens += 1;
   return 'a';
 }
 
 ]AT_YYERROR_DEFINE[
+]AT_YYPARSE_DEFINE[
+
 int
 main (void)
 {
-  int exit_status;
-  exit_status = yyparse ();
+  int status;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
+  status = yyparse ();
   if (tokens != destructors)
     {
       fprintf (stderr, "Tokens = %d, Destructors = %d\n", tokens, destructors);
-      return 1;
+      return 10;
     }
-  return !exit_status;
+  return status;
 }
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr9.c -rall glr-regr9.y]], 0, [],
-[[glr-regr9.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
-]])
-AT_COMPILE([glr-regr9])
+AT_FULL_COMPILE([glr-regr9],,,, [-rall])
 
-AT_PARSER_CHECK([[glr-regr9]], 0, [],
+# Exit 2: memory exhausted.
+AT_PARSER_CHECK([[glr-regr9]], 2, [],
 [memory exhausted
 ])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
+
 
 
 ## ------------------------------------------------------ ##
 ## Corrupted semantic options if user action cuts parse.  ##
 ## ------------------------------------------------------ ##
 
-AT_SETUP([Corrupted semantic options if user action cuts parse])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Corrupted semantic options if user action cuts parse: $1])
 
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
 AT_DATA_GRAMMAR([glr-regr10.y],
 [[
-%{
-# include <stdlib.h>
-# include <stdio.h>
+%code {
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
   #define GARBAGE_SIZE 50
   static char garbage[GARBAGE_SIZE];
-%}
+}
 
 %define parse.assert
+%define parse.trace
 %glr-parser
+%expect-rr 1
+]$1[
+
 %union { char *ptr; }
 %type <ptr> start
 
@@ -853,6 +1076,7 @@
 
 %%
 ]AT_YYERROR_DEFINE[
+]AT_YYPARSE_DEFINE[
 ]AT_YYLEX_DEFINE[
 
 int
@@ -861,40 +1085,51 @@
   int i;
   for (i = 0; i < GARBAGE_SIZE; i+=1)
     garbage[i] = 108;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
   return yyparse ();
 }
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr10.c -rall glr-regr10.y]], 0, [],
-[[glr-regr10.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
-]])
-AT_COMPILE([glr-regr10])
+AT_FULL_COMPILE([glr-regr10],,,, [-rall])
 
 AT_PARSER_CHECK([[glr-regr10]], 0, [], [])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
+
 
 
 ## --------------------------------------------------- ##
 ## Undesirable destructors if user action cuts parse.  ##
 ## --------------------------------------------------- ##
 
-AT_SETUP([Undesirable destructors if user action cuts parse])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Undesirable destructors if user action cuts parse: $1])
 
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
 AT_DATA_GRAMMAR([glr-regr11.y],
 [[
-%{
-# include <stdlib.h>
+%code {
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
   static int destructors = 0;
 # define USE(val)
-%}
+}
 
 %define parse.assert
+%define parse.trace
 %glr-parser
+%expect-rr 1
+]$1[
+
 %union { int dummy; }
 %type <int> 'a'
 %destructor { destructors += 1; } 'a'
@@ -902,50 +1137,66 @@
 %%
 
 start:
-    'a' %dprec 2 { USE ($1); destructors += 1; YYACCEPT; }
-  | 'a' %dprec 1 { USE ($1); destructors += 1; YYACCEPT; }
+    'a' %dprec 2 { USE ($][1); destructors += 1; YYACCEPT; }
+  | 'a' %dprec 1 { USE ($][1); destructors += 1; YYACCEPT; }
   ;
 
 %%
 
 ]AT_YYERROR_DEFINE[
+]AT_YYPARSE_DEFINE[
 ]AT_YYLEX_DEFINE(["a"])[
 
 int
 main (void)
 {
-  int exit_status = yyparse ();
+  int status;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
+  status = yyparse ();
   if (destructors != 1)
     {
       fprintf (stderr, "Destructor calls: %d\n", destructors);
       return 1;
     }
-  return exit_status;
+  return status;
 }
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr11.c -rall glr-regr11.y]], 0, [],
-[[glr-regr11.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
-]])
-AT_COMPILE([glr-regr11])
+AT_FULL_COMPILE([glr-regr11],,,, [-rall])
 
 AT_PARSER_CHECK([[glr-regr11]], 0, [], [])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
+
 
 
 ## -------------------------------------------------- ##
 ## Leaked semantic values if user action cuts parse.  ##
 ## -------------------------------------------------- ##
 
-AT_SETUP([Leaked semantic values if user action cuts parse])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Leaked semantic values if user action cuts parse: $1])
+AT_KEYWORDS([%merge])
 
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
 AT_DATA_GRAMMAR([glr-regr12.y],
 [[
 %define parse.assert
+%define parse.trace
 %glr-parser
+%expect 1
+%expect-rr 1
+]$1[
+
 %union { int dummy; }
 %token PARENT_RHS_AFTER
 %type <dummy> parent_rhs_before merged PARENT_RHS_AFTER
@@ -953,17 +1204,16 @@
 %destructor { merged_value = 0; } merged
 %destructor { parent_rhs_after_value = 0; } PARENT_RHS_AFTER
 
-%{
-# include <stdlib.h>
+%code {
 # include <assert.h>
-  static int merge (YYSTYPE, YYSTYPE);
+  static int merge (]AT_YYSTYPE[, ]AT_YYSTYPE[);
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
   static int parent_rhs_before_value = 0;
   static int merged_value = 0;
   static int parent_rhs_after_value = 0;
 # define USE(val)
-%}
+}
 
 %%
 
@@ -974,14 +1224,14 @@
 
 alt1:
   PARENT_RHS_AFTER {
-    USE ($1);
+    USE ($][1);
     parent_rhs_after_value = 0;
   }
   ;
 
 alt2:
   parent_rhs_before merged PARENT_RHS_AFTER {
-    USE (($1, $2, $3));
+    USE (($][1, $][2, $][3));
     parent_rhs_before_value = 0;
     merged_value = 0;
     parent_rhs_after_value = 0;
@@ -1011,61 +1261,70 @@
 %%
 
 static int
-merge (YYSTYPE s1, YYSTYPE s2)
+merge (]AT_YYSTYPE[ s1, ]AT_YYSTYPE[ s2)
 {
   /* Not invoked. */
   return s1.dummy + s2.dummy;
 }
 
 ]AT_YYERROR_DEFINE[
-]AT_YYLEX_DEFINE([{ PARENT_RHS_AFTER, 0 }],
- [if (res == PARENT_RHS_AFTER)
+]AT_YYPARSE_DEFINE[
+]AT_YYLEX_DEFINE([{ ]AT_TOKEN([PARENT_RHS_AFTER])[, 0 }],
+ [if (res == ]AT_TOKEN([PARENT_RHS_AFTER])[)
     parent_rhs_after_value = 1;])[
 
 int
 main (void)
 {
-  int exit_status = yyparse ();
+  int status;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
+  status = yyparse ();
   if (parent_rhs_before_value)
     {
       fprintf (stderr, "'parent_rhs_before' destructor not called.\n");
-      exit_status = 1;
+      status = 1;
     }
   if (merged_value)
     {
       fprintf (stderr, "'merged' destructor not called.\n");
-      exit_status = 1;
+      status = 1;
     }
   if (parent_rhs_after_value)
     {
       fprintf (stderr, "'PARENT_RHS_AFTER' destructor not called.\n");
-      exit_status = 1;
+      status = 1;
     }
-  return exit_status;
+  return status;
 }
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr12.c -rall glr-regr12.y]], 0, [],
-[[glr-regr12.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
-glr-regr12.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
-]])
-AT_COMPILE([glr-regr12])
+AT_FULL_COMPILE([glr-regr12],,,, [-rall])
 
 AT_PARSER_CHECK([[glr-regr12]], 0, [], [])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
 
 
-## ------------------------------------------------------------------------- ##
-## Incorrect lookahead during deterministic GLR.  See                        ##
-## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00017.html> and  ##
-## <http://lists.gnu.org/archive/html/bison-patches/2006-01/msg00060.html>.  ##
-## ------------------------------------------------------------------------- ##
 
-AT_SETUP([Incorrect lookahead during deterministic GLR])
+## --------------------------------------------------------------- ##
+## Incorrect lookahead during deterministic GLR.  See              ##
+## <https://lists.gnu.org/r/help-bison/2005-07/msg00017.html> and  ##
+## <https://lists.gnu.org/r/bison-patches/2006-01/msg00060.html>.  ##
+## --------------------------------------------------------------- ##
 
-AT_BISON_OPTION_PUSHDEFS
+m4_pushdef([AT_TEST],
+[AT_SETUP([Incorrect lookahead during deterministic GLR: $1])
+
+AT_BISON_OPTION_PUSHDEFS([%glr-parser %locations $1])
 AT_DATA_GRAMMAR([glr-regr13.y],
 [[
 /* Tests:
@@ -1075,98 +1334,96 @@
      - Defaulted state after shift: yychar == YYEMPTY.
      - User action changing the lookahead.  */
 
-%{
-  #include <stdio.h>
+%code {
   #include <assert.h>
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
-  static void print_lookahead (char const *);
+  ]AT_PRINT_LOOKAHEAD_DECLARE[
   #define USE(value)
-%}
+}
 
 %define parse.assert
+%define parse.trace
+%locations
+%glr-parser
+]$1[
+
 %union { char value; }
 %type <value> 'a' 'b'
-%glr-parser
-%locations
 
 %%
 
 start:
-  defstate_init defstate_shift 'b' change_lookahead 'a' {
-    USE ($3);
-    print_lookahead ("start <- defstate_init defstate_shift 'b'");
-  }
-  ;
+  defstate_init defstate_shift 'b' change_lookahead 'a'
+    {
+      USE ($][3);
+      PRINT_LOOKAHEAD ("start <- defstate_init defstate_shift 'b'");
+    }
+;
+
 defstate_init:
-  {
-    print_lookahead ("defstate_init <- empty string");
-  }
-  ;
+  %empty
+    {
+      PRINT_LOOKAHEAD ("defstate_init <- empty string");
+    }
+;
+
 defstate_shift:
-  nondefstate defstate_look 'a' {
-    USE ($3);
-    print_lookahead ("defstate_shift <- nondefstate defstate_look 'a'");
-  }
-  ;
+  nondefstate defstate_look 'a'
+    {
+      USE ($][3);
+      PRINT_LOOKAHEAD ("defstate_shift <- nondefstate defstate_look 'a'");
+    }
+;
+
 defstate_look:
-  {
-    print_lookahead ("defstate_look <- empty string");
-  }
-  ;
+  %empty
+    {
+      PRINT_LOOKAHEAD ("defstate_look <- empty string");
+    }
+;
+
 nondefstate:
-  {
-    print_lookahead ("nondefstate <- empty string");
-  }
-  | 'b' {
-    USE ($1);
-    print_lookahead ("nondefstate <- 'b'");
-  }
-  ;
+  %empty
+    {
+      PRINT_LOOKAHEAD ("nondefstate <- empty string");
+    }
+| 'b'
+    {
+      USE ($][1);
+      PRINT_LOOKAHEAD ("nondefstate <- 'b'");
+    }
+;
+
 change_lookahead:
-  {
-    yychar = 'a';
-  }
-  ;
+  %empty
+    {
+      ]AT_GLR2_CC_IF([[yytoken = yy::parser::yytranslate_ ('a')]], [[yychar = 'a']])[;
+    }
+;
 
 %%
 
 ]AT_YYERROR_DEFINE[
+]AT_YYPARSE_DEFINE[
+]AT_PRINT_LOOKAHEAD_DEFINE[
 ]AT_YYLEX_DEFINE(["ab"],
-                 [yylval.value = YY_CAST (char, res + 'A' - 'a')])[
-
-static void
-print_lookahead (char const *reduction)
-{
-  printf ("%s:\n  yychar=", reduction);
-  if (yychar == YYEMPTY)
-    printf ("YYEMPTY");
-  else if (yychar == YYEOF)
-    printf ("YYEOF");
-  else
-    {
-      printf ("'%c', yylval='", yychar);
-      if (yylval.value > ' ')
-        printf ("%c", yylval.value);
-      printf ("', yylloc=(%d,%d),(%d,%d)",
-              yylloc.first_line, yylloc.first_column,
-              yylloc.last_line, yylloc.last_column);
-    }
-  printf ("\n");
-}
+                 []AT_VAL[.value = YY_CAST (char, res + 'A' - 'a')])[
 
 int
 main (void)
 {
+]AT_CXX_IF([], [[
   yychar = '#'; /* Not a token in the grammar.  */
   yylval.value = '!';
+]])[
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
   return yyparse ();
 }
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr13.c -rall glr-regr13.y]], 0, [], [])
-AT_COMPILE([glr-regr13])
+AT_FULL_COMPILE([glr-regr13],,,, [-rall])
 
 AT_PARSER_CHECK([[glr-regr13]], 0,
 [defstate_init <- empty string:
@@ -1181,16 +1438,28 @@
   yychar=YYEMPTY
 ], [])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
+
 
 
 ## ------------------------------------------------- ##
 ## Incorrect lookahead during nondeterministic GLR.  ##
 ## ------------------------------------------------- ##
 
-AT_SETUP([Incorrect lookahead during nondeterministic GLR])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Incorrect lookahead during nondeterministic GLR: $1])
+AT_KEYWORDS([%merge])
 
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%glr-parser %locations $1])
+
 AT_DATA_GRAMMAR([glr-regr14.y],
 [[
 /* Tests:
@@ -1212,158 +1481,162 @@
      - If only defaulted states are entered, there are no conflicts, so
        nondeterministic operation does not start.  */
 
+%define parse.assert
+%define parse.trace
+%type <value> 'a' 'b' 'c' 'd' stack_explosion
+%glr-parser
+%expect 0
+%expect-rr 5
+]$1[
+%locations
+
 %union { char value; }
 
-%{
-  #include <stdlib.h>
-  #include <stdio.h>
+%code {
   #include <assert.h>
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
-  static void print_lookahead (char const *);
-  static char merge (union YYSTYPE, union YYSTYPE);
+  ]AT_PRINT_LOOKAHEAD_DECLARE[
+  static char merge (]AT_YYSTYPE[, ]AT_YYSTYPE[);
   #define USE(value)
-%}
-
-%define parse.assert
-%type <value> 'a' 'b' 'c' 'd' stack_explosion
-%glr-parser
-%locations
+}
 
 %%
 
 start:
-  merge 'c' stack_explosion {
-    USE ($2); USE ($3);
-    print_lookahead ("start <- merge 'c' stack_explosion");
-  }
-  ;
+  merge 'c' stack_explosion
+    {
+      USE ($][2); USE ($][3);
+      PRINT_LOOKAHEAD ("start <- merge 'c' stack_explosion");
+    }
+;
 
 /* When merging the 2 deferred actions, the lookahead needs are different.  */
 merge:
-  nonconflict1 'a' 'b' nonconflict2 %dprec 1 {
-    USE ($2); USE ($3);
-    print_lookahead ("merge <- nonconflict1 'a' 'b' nonconflict2");
-  }
-  | conflict defstate_look 'a' nonconflict2 'b' defstate_shift %dprec 2 {
-    USE ($3); USE ($5);
-    print_lookahead ("merge <- conflict defstate_look 'a' nonconflict2 'b'"
-                      " defstate_shift");
-  }
-  ;
+  nonconflict1 'a' 'b' nonconflict2 %dprec 1
+    {
+      USE ($][2); USE ($][3);
+      PRINT_LOOKAHEAD ("merge <- nonconflict1 'a' 'b' nonconflict2");
+    }
+| conflict defstate_look 'a' nonconflict2 'b' defstate_shift %dprec 2
+    {
+      USE ($][3); USE ($][5);
+      PRINT_LOOKAHEAD ("merge <- conflict defstate_look 'a' nonconflict2 'b'"
+                       " defstate_shift");
+    }
+;
 
 nonconflict1:
-  {
-    print_lookahead ("nonconflict1 <- empty string");
-  }
-  ;
+  %empty
+    {
+      PRINT_LOOKAHEAD ("nonconflict1 <- empty string");
+    }
+;
+
 nonconflict2:
-  {
-    print_lookahead ("nonconflict2 <- empty string");
-  }
-  | 'a' {
-    USE ($1);
-    print_lookahead ("nonconflict2 <- 'a'");
-  }
-  ;
+  %empty
+    {
+      PRINT_LOOKAHEAD ("nonconflict2 <- empty string");
+    }
+| 'a'
+    {
+      USE ($][1);
+      PRINT_LOOKAHEAD ("nonconflict2 <- 'a'");
+    }
+;
+
 conflict:
+  %empty
   {
-    print_lookahead ("conflict <- empty string");
+    PRINT_LOOKAHEAD ("conflict <- empty string");
   }
-  ;
+;
+
 defstate_look:
+  %empty
   {
-    print_lookahead ("defstate_look <- empty string");
+    PRINT_LOOKAHEAD ("defstate_look <- empty string");
   }
-  ;
+;
 
 /* yychar != YYEMPTY but lookahead need is yyfalse.  */
 defstate_shift:
+  %empty
   {
-    print_lookahead ("defstate_shift <- empty string");
+    PRINT_LOOKAHEAD ("defstate_shift <- empty string");
   }
-  ;
+;
 
 stack_explosion:
-  { $$ = '\0'; }
-  | alt1 stack_explosion %merge<merge> { $$ = $2; }
-  | alt2 stack_explosion %merge<merge> { $$ = $2; }
-  | alt3 stack_explosion %merge<merge> { $$ = $2; }
-  ;
+  %empty { $$ = '\0'; }
+| alt1 stack_explosion %merge<merge> { $$ = $][2; }
+| alt2 stack_explosion %merge<merge> { $$ = $][2; }
+| alt3 stack_explosion %merge<merge> { $$ = $][2; }
+;
+
 alt1:
-  'd' no_look {
-    USE ($1);
-    if (yychar != 'd' && yychar != YYEOF)
-      {
-        fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
-      }
-  }
-  ;
+  'd' no_look
+    {
+      USE ($][1);
+      if (]AT_GLR2_CC_IF(
+        [[yytoken != yy::parser::yytranslate_ ('d') && yytoken != symbol_kind::S_YYEOF]],
+        [[yychar != 'd' && yychar != ]AT_GLR2_CC_IF([token::])[YYEOF]])[)
+        PRINT_LOOKAHEAD ("Incorrect lookahead during stack explosion.");
+    }
+;
+
 alt2:
-  'd' no_look {
-    USE ($1);
-    if (yychar != 'd' && yychar != YYEOF)
-      {
-        fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
-      }
-  }
-  ;
+  'd' no_look
+    {
+      USE ($][1);
+      if (]AT_GLR2_CC_IF(
+        [[yytoken != yy::parser::yytranslate_ ('d') && yytoken != symbol_kind::S_YYEOF]],
+        [[yychar != 'd' && yychar != ]AT_GLR2_CC_IF([token::])[YYEOF]])[)
+        PRINT_LOOKAHEAD ("Incorrect lookahead during stack explosion.");
+    }
+;
+
 alt3:
-  'd' no_look {
-    USE ($1);
-    if (yychar != 'd' && yychar != YYEOF)
-      {
-        fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
-      }
-  }
-  ;
+  'd' no_look
+    {
+      USE ($][1);
+        if (]AT_GLR2_CC_IF(
+          [[yytoken != yy::parser::yytranslate_ ('d') && yytoken != symbol_kind::S_YYEOF]],
+          [[yychar != 'd' && yychar != ]AT_GLR2_CC_IF([token::])[YYEOF]])[)
+        PRINT_LOOKAHEAD ("Incorrect lookahead during stack explosion.");
+    }
+;
+
 no_look:
-  {
-    if (yychar != YYEMPTY)
-      {
-        fprintf (stderr,
-                 "Found lookahead where shouldn't during stack explosion.\n");
-      }
-  }
-  ;
+  %empty
+    {
+      if (]AT_GLR2_CC_IF(
+        [[yytoken != symbol_kind::S_YYEMPTY]],
+        [[yychar != ]AT_GLR2_CC_IF([token::])[YYEMPTY]])[)
+        PRINT_LOOKAHEAD ("Found lookahead where shouldn't during stack explosion.");
+    }
+;
 
 %%
 
 ]AT_YYERROR_DEFINE[
-static int
-yylex (void)
+]AT_YYPARSE_DEFINE[
+]AT_PRINT_LOOKAHEAD_DEFINE[
+
+]AT_YYLEX_PROTOTYPE[
 {
+  ]AT_USE_LEX_ARGS[
   static char const input[] = "abcdddd";
   static int toknum = 0;
   assert (toknum < YY_CAST (int, sizeof input));
-  yylloc.first_line = yylloc.last_line = 1;
-  yylloc.first_column = yylloc.last_column = toknum + 1;
-  yylval.value = YY_CAST (char, input[toknum] + 'A' - 'a');
+  ]AT_LOC_FIRST_LINE[ = ]AT_LOC_LAST_LINE[ = 1;
+  ]AT_LOC_FIRST_COLUMN[ = ]AT_LOC_LAST_COLUMN[ = toknum + 1;
+  ]AT_VAL[.value = YY_CAST (char, input[toknum] + 'A' - 'a');
   return input[toknum++];
 }
 
-static void
-print_lookahead (char const *reduction)
-{
-  printf ("%s:\n  yychar=", reduction);
-  if (yychar == YYEMPTY)
-    printf ("YYEMPTY");
-  else if (yychar == YYEOF)
-    printf ("YYEOF");
-  else
-    {
-      printf ("'%c', yylval='", yychar);
-      if (yylval.value > ' ')
-        printf ("%c", yylval.value);
-      printf ("', yylloc=(%d,%d),(%d,%d)",
-              yylloc.first_line, yylloc.first_column,
-              yylloc.last_line, yylloc.last_column);
-    }
-  printf ("\n");
-}
-
 static char
-merge (union YYSTYPE s1, union YYSTYPE s2)
+merge (]AT_YYSTYPE[ s1, ]AT_YYSTYPE[ s2)
 {
   return YY_CAST (char, s1.value + s2.value);
 }
@@ -1371,17 +1644,17 @@
 int
 main (void)
 {
+]AT_CXX_IF([], [[
   yychar = '#'; /* Not a token in the grammar.  */
   yylval.value = '!';
+]])[
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
   return yyparse ();
 }
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr14.c -rall glr-regr14.y]], 0, [],
-[[glr-regr14.y: warning: 5 reduce/reduce conflicts [-Wconflicts-rr]
-]])
-AT_COMPILE([glr-regr14])
+AT_FULL_COMPILE([glr-regr14],,,, [-rall])
 
 AT_PARSER_CHECK([[glr-regr14]], 0,
 [conflict <- empty string:
@@ -1398,29 +1671,44 @@
   yychar=YYEOF
 ], [])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
+
 
 
 ## ------------------------------------------------- ##
 ## Leaked semantic values when reporting ambiguity.  ##
 ## ------------------------------------------------- ##
 
-AT_SETUP([Leaked semantic values when reporting ambiguity])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Leaked semantic values when reporting ambiguity: $1])
 
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
+
 AT_DATA_GRAMMAR([glr-regr15.y],
 [[
 %define parse.assert
+%define parse.trace
 %glr-parser
+%expect 0
+%expect-rr 2
+]$1[
+
 %destructor { parent_rhs_before_value = 0; } parent_rhs_before
 
-%{
-# include <stdlib.h>
+%code {
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
   static int parent_rhs_before_value = 0;
 # define USE(val)
-%}
+}
 
 %%
 
@@ -1438,7 +1726,7 @@
 
 alt2:
   parent_rhs_before ambiguity {
-    USE ($1);
+    USE ($][1);
     parent_rhs_before_value = 0;
   }
   ;
@@ -1456,55 +1744,78 @@
 
 %%
 ]AT_YYERROR_DEFINE[
+]AT_YYPARSE_DEFINE[
 ]AT_YYLEX_DEFINE[
 
 int
 main (void)
 {
-  int exit_status = yyparse () != 1;
+  int status;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
+  status = yyparse () != 1;
   if (parent_rhs_before_value)
     {
       fprintf (stderr, "'parent_rhs_before' destructor not called.\n");
-      exit_status = 1;
+      status = 1;
     }
-  return exit_status;
+  return status;
 }
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr15.c -rall glr-regr15.y]], 0, [],
-[[glr-regr15.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
-]])
-AT_COMPILE([glr-regr15])
+AT_FULL_COMPILE([glr-regr15],,,, [-rall])
 
 AT_PARSER_CHECK([[glr-regr15]], 0, [],
-[syntax is ambiguous
+[Ambiguity detected.
+Option 1,
+  ambiguity -> <Rule 6, empty>
+    ambiguity1 -> <Rule 8, empty>
+
+Option 2,
+  ambiguity -> <Rule 7, empty>
+    ambiguity2 -> <Rule 9, empty>
+
+syntax is ambiguous
 ])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
+
 
 
 ## ------------------------------------------------------------ ##
 ## Leaked lookahead after nondeterministic parse syntax error.  ##
 ## ------------------------------------------------------------ ##
 
-AT_SETUP([Leaked lookahead after nondeterministic parse syntax error])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Leaked lookahead after nondeterministic parse syntax error: $1])
 
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
 AT_DATA_GRAMMAR([glr-regr16.y],
 [[
 %define parse.assert
+%define parse.trace
 %glr-parser
+%expect 0
+%expect-rr 1
+]$1[
+
 %destructor { lookahead_value = 0; } 'b'
 
-%{
-# include <stdlib.h>
+%code {
 # include <assert.h>
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
   static int lookahead_value = 0;
 # define USE(val)
-%}
+}
 
 %%
 
@@ -1515,6 +1826,7 @@
 %%
 
 ]AT_YYERROR_DEFINE[
+]AT_YYPARSE_DEFINE[
 ]AT_YYLEX_DEFINE(["ab"],
   [if (res == 'b')
     lookahead_value = 1])[
@@ -1522,51 +1834,63 @@
 int
 main (void)
 {
-  int exit_status = yyparse () != 1;
+  int status;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
+  status = yyparse () != 1;
   if (lookahead_value)
     {
       fprintf (stderr, "Lookahead destructor not called.\n");
-      exit_status = 1;
+      status = 1;
     }
-  return exit_status;
+  return status;
 }
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr16.c -rall glr-regr16.y]], 0, [],
-[[glr-regr16.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
-]])
-AT_COMPILE([glr-regr16])
+AT_FULL_COMPILE([glr-regr16],,,, [-rall])
 
 AT_PARSER_CHECK([[glr-regr16]], 0, [],
 [syntax error
 ])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
+
 
 
 ## ------------------------------------------------- ##
 ## Uninitialized location when reporting ambiguity.  ##
 ## ------------------------------------------------- ##
 
-AT_SETUP([Uninitialized location when reporting ambiguity])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Uninitialized location when reporting ambiguity: $1])
 
-AT_BISON_OPTION_PUSHDEFS([%glr-parser %locations %define api.pure])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser %locations $1])
 
 AT_DATA_GRAMMAR([glr-regr17.y],
 [[
 %define parse.assert
+%define parse.trace
 %glr-parser
+%expect 0
+%expect-rr 3
+]$1[
 %locations
-%define api.pure
 %define parse.error verbose
 
 %union { int dummy; }
 
-%{
+%code {
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
-%}
+}
 
 %%
 
@@ -1591,61 +1915,92 @@
 # include <assert.h>
 
 ]AT_YYERROR_DEFINE[
-static int
-yylex (YYSTYPE *lvalp, YYLTYPE *llocp)
+
+]AT_YYLEX_PROTOTYPE[
 {
   static char const input[] = "ab";
   static int toknum = 0;
+  ]AT_USE_LEX_ARGS[
   assert (toknum < YY_CAST (int, sizeof input));
   lvalp->dummy = 0;
-  llocp->first_line = llocp->last_line = 2;
-  llocp->first_column = toknum + 1;
-  llocp->last_column = llocp->first_column + 1;
+  ]AT_LOC_FIRST_LINE[ = ]AT_LOC_LAST_LINE[ = 2;
+  ]AT_LOC_FIRST_COLUMN[ = toknum + 1;
+  ]AT_LOC_LAST_COLUMN[ = ]AT_LOC_FIRST_COLUMN[ + 1;
   return input[toknum++];
 }
 
 ]AT_MAIN_DEFINE[
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr17.c -rall glr-regr17.y]], 0, [],
-[[glr-regr17.y: warning: 3 reduce/reduce conflicts [-Wconflicts-rr]
-]])
-AT_COMPILE([glr-regr17])
+AT_FULL_COMPILE([glr-regr17],,,, [-rall])
 
 AT_PARSER_CHECK([[glr-regr17]], 1, [],
-[1.1-2.2: syntax is ambiguous
+[Ambiguity detected.
+Option 1,
+  start -> <Rule 1, tokens 1 .. 2>
+    ambig1 -> <Rule 4, tokens 1 .. 2>
+      sub_ambig2 -> <Rule 8, tokens 1 .. 2>
+        empty2 -> <Rule 10, empty>
+        'a' <tokens 1 .. 1>
+        'b' <tokens 2 .. 2>
+    empty1 -> <Rule 9, empty>
+
+Option 2,
+  start -> <Rule 2, tokens 1 .. 2>
+    ambig2 -> <Rule 6, tokens 1 .. 2>
+      sub_ambig2 -> <Rule 8, tokens 1 .. 2>
+        empty2 -> <Rule 10, empty>
+        'a' <tokens 1 .. 1>
+        'b' <tokens 2 .. 2>
+    empty2 -> <Rule 10, empty>
+
+1.1-2.2: syntax is ambiguous
 ])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c" %define api.pure])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
+
 
 
 ## ------------------------------------------------------------- ##
 ## Missed %merge type warnings when LHS type is declared later.  ##
 ## ------------------------------------------------------------- ##
 
-AT_SETUP([Missed %merge type warnings when LHS type is declared later])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Missed %merge type warnings when LHS type is declared later: $1])
+AT_KEYWORDS([%merge])
 
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
 AT_DATA_GRAMMAR([glr-regr18.y],
 [[%define parse.assert
+%define parse.trace
 %glr-parser
+]$1[
 
-%{
-  #include <stdlib.h>
+%code {
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
-%}
+}
 
 %union {
   int type1;
   int type2;
   int type3;
 }
+]AT_CXX_IF([[
+// In C++ we need one more line for the line numbers to match.
+]])[
 %%
 
-sym1: sym2 %merge<merge> { $$ = $1; } ;
-sym2: sym3 %merge<merge> { $$ = $1; } ;
+sym1: sym2 %merge<merge> { $$ = $][1; } ;
+sym2: sym3 %merge<merge> { $$ = $][1; } ;
 sym3: %merge<merge> { $$ = 0; } ;
 
 %type <type1> sym1;
@@ -1657,90 +2012,112 @@
 ]AT_YYLEX_DEFINE[
 ]AT_MAIN_DEFINE[
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o glr-regr18.c -rall glr-regr18.y]], 1, [],
-[[glr-regr18.y:28.18-24: error: result type clash on merge function 'merge': <type2> != <type1>
-glr-regr18.y:27.18-24:     previous declaration
-glr-regr18.y:29.13-19: error: result type clash on merge function 'merge': <type3> != <type2>
-glr-regr18.y:28.18-24:     previous declaration
+AT_BISON_CHECK([[-o glr-regr18.c -rall -fcaret glr-regr18.y]], 1, [],
+[[glr-regr18.y:30.18-24: error: result type clash on merge function 'merge': <type2> != <type1>
+   30 | sym2: sym3 %merge<merge> { $$ = $][1; } ;
+      |                  ^~~~~~~
+glr-regr18.y:29.18-24: note: previous declaration
+   29 | sym1: sym2 %merge<merge> { $$ = $][1; } ;
+      |                  ^~~~~~~
+glr-regr18.y:31.13-19: error: result type clash on merge function 'merge': <type3> != <type1>
+   31 | sym3: %merge<merge> { $$ = 0; } ;
+      |             ^~~~~~~
+glr-regr18.y:29.18-24: note: previous declaration
+   29 | sym1: sym2 %merge<merge> { $$ = $][1; } ;
+      |                  ^~~~~~~
 ]])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
+
 
 
 ## ------------------- ##
 ## Ambiguity reports.  ##
 ## ------------------- ##
 
-AT_SETUP([Ambiguity reports])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Ambiguity reports: $1])
 
-AT_BISON_OPTION_PUSHDEFS([%debug])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser %debug $1])
 AT_DATA_GRAMMAR([input.y],
-[[%{
-  #include <stdio.h>
-  #include <stdlib.h>
+[[%code {
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
-%}
+}
 
 %define parse.assert
+%define parse.trace
 %debug
 %glr-parser
-
+%expect 0
+%expect-rr 1
+]$1[
+]AT_CXX_IF([[
+// In C++ we need two more lines for the line numbers in the trace to match.
+]])[
 %%
+
 start:
   'a' b 'c' d
 | 'a' b 'c' d
 ;
 b: 'b';
-d: /* nada.  */;
+d: %empty;
 %%
 ]AT_YYERROR_DEFINE[
 ]AT_YYLEX_DEFINE(["abc"])[
 ]AT_MAIN_DEFINE[
 ]])
-AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([[-o input.c input.y]], 0, [],
-[[input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
-]])
-AT_COMPILE([input])
+AT_FULL_COMPILE([input])
 
 AT_PARSER_CHECK([[input --debug]], 1, [],
 [Starting parse
 Entering state 0
-Reading a token: Next token is token 'a' ()
+Reading a token
+Next token is token 'a' ()
 Shifting token 'a' ()
 Entering state 1
-Reading a token: Next token is token 'b' ()
+Reading a token
+Next token is token 'b' ()
 Shifting token 'b' ()
 Entering state 3
-Reducing stack 0 by rule 3 (line 27):
-   $1 = token 'b' ()
--> $$ = nterm b ()
+Reducing stack 0 by rule 3 (line 30):
+   $][1 = token 'b' ()
+-> $][$ = nterm b ()
 Entering state 4
-Reading a token: Next token is token 'c' ()
+Reading a token
+Next token is token 'c' ()
 Shifting token 'c' ()
 Entering state 6
-Reducing stack 0 by rule 4 (line 28):
--> $$ = nterm d ()
+Reducing stack 0 by rule 4 (line 31):
+-> $][$ = nterm d ()
 Entering state 7
-Reading a token: Now at end of input.
+Reading a token
+Now at end of input.
 Stack 0 Entering state 7
 Now at end of input.
 Splitting off stack 1 from 0.
-Reduced stack 1 by rule 2 (line 24); action deferred.  Now in state 2.
+Reduced stack 1 by rule 2 (line 28); action deferred.  Now in state 2.
 Stack 1 Entering state 2
 Now at end of input.
-Reduced stack 0 by rule 1 (line 24); action deferred.  Now in state 2.
+Reduced stack 0 by rule 1 (line 27); action deferred.  Now in state 2.
 Merging stack 0 into stack 1.
 Stack 1 Entering state 2
 Now at end of input.
 Removing dead stacks.
 Rename stack 1 -> 0.
-On stack 0, shifting token $end ()
-Stack 0 now in state #5
+On stack 0, shifting token "end of file" ()
+Stack 0 now in state 5
 Ambiguity detected.
 Option 1,
   start -> <Rule 1, tokens 1 .. 3>
@@ -1757,7 +2134,7 @@
     d <empty>
 
 syntax is ambiguous
-Cleanup: popping token $end ()
+Cleanup: popping token "end of file" ()
 Cleanup: popping unresolved nterm start ()
 Cleanup: popping nterm d ()
 Cleanup: popping token 'c' ()
@@ -1765,24 +2142,38 @@
 Cleanup: popping token 'a' ()
 ])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
 
 
-## ----------------------------------------------------------------- ##
-## Predicates.                                                       ##
-##                                                                   ##
-## http://lists.gnu.org/archive/html/bug-bison/2013-10/msg00004.html ##
-## http://lists.gnu.org/archive/html/bug-bison/2018-05/msg00033.html ##
-## ----------------------------------------------------------------- ##
 
-AT_SETUP([Predicates])
+## ------------------------------------------------------- ##
+## Predicates.                                             ##
+##                                                         ##
+## https://lists.gnu.org/r/bug-bison/2013-10/msg00004.html ##
+## https://lists.gnu.org/r/bug-bison/2018-05/msg00033.html ##
+## ------------------------------------------------------- ##
 
+m4_pushdef([AT_TEST],
+[AT_SETUP([Predicates: $1])
+
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
 AT_DATA_GRAMMAR([input.y],
 [[%define parse.assert
+%define parse.trace
 %glr-parser
 %define parse.error verbose
 %expect-rr 1
-%code requires
+]$1[
+
+%code
 {
   #include <assert.h>
   #include <stdbool.h>
@@ -1801,10 +2192,11 @@
 old_args: 'o';
 %%
 ]AT_YYERROR_DEFINE[
+]AT_YYPARSE_DEFINE[
 
-int
-yylex (void)
+]AT_YYLEX_PROTOTYPE[
 {
+  ]AT_USE_LEX_ARGS[
   return *input++;
 }
 
@@ -1816,12 +2208,13 @@
   // Then the input.
   new_syntax = argv[1][0] == 'N';
   input = argv[1] + 1;
+  if (getenv ("YYDEBUG"))
+    yydebug = 1;
   return yyparse ();
 }
 ]])
 
-AT_BISON_CHECK([[-o input.c input.y]])
-AT_COMPILE([input])
+AT_FULL_COMPILE([input])
 AT_PARSER_CHECK([[input Nwin]], [0], [new])
 AT_PARSER_CHECK([[input Owin]], [1], [], [[syntax error, unexpected 'n', expecting 'o'
 ]])
@@ -1829,4 +2222,15 @@
 AT_PARSER_CHECK([[input Nwio]], [1], [], [[syntax error, unexpected 'o', expecting 'n'
 ]])
 
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+AT_TEST([%skeleton "glr.cc"])
+AT_TEST([%skeleton "glr2.cc"])
+
+m4_popdef([AT_TEST])
+
+
+m4_popdef([AT_YYPARSE_DEFINE])
diff --git a/tests/headers.at b/tests/headers.at
index 3142743..766d33f 100644
--- a/tests/headers.at
+++ b/tests/headers.at
@@ -1,6 +1,6 @@
 # Bison Parser Headers.                               -*- Autotest -*-
 
-# Copyright (C) 2001-2002, 2006-2007, 2009-2015, 2018-2019 Free Software
+# Copyright (C) 2001-2002, 2006-2007, 2009-2015, 2018-2021 Free Software
 # Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[Parser Headers.]])
 
@@ -47,7 +47,6 @@
 ])
 
 AT_BISON_CHECK([--defines=$1.h --output=$1.c $1.y])
-
 AT_COMPILE([$1.o], [-I. -c $1.c])
 
 AT_BISON_OPTION_POPDEFS
@@ -83,7 +82,7 @@
 exp: %empty;
 ]])
 
-AT_BISON_CHECK([--defines -o input.c input.y], [], [],
+AT_BISON_CHECK([--header -o input.c input.y], [], [],
 [[input.y:11.1-18: warning: deprecated directive: '%name-prefix "my_"', use '%define api.prefix {my_}' [-Wdeprecated]
 input.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
 ]])
@@ -115,7 +114,7 @@
 
 # AT_TEST([DIRECTIVES], [COMPILER-FLAGS])
 # ---------------------------------------
-# Check that headers are self-contained and protected againt multiple
+# Check that headers are self-contained and protected against multiple
 # inclusions.
 
 m4_pushdef([AT_TEST],
@@ -125,7 +124,9 @@
 AT_DATA_GRAMMAR([input.y],
 [[$1
 %define parse.error verbose
-]AT_VARIANT_IF([%token <int> 'x'], [%union {int integer;}])[
+]AT_VARIANT_IF([%token <int> X],
+[%union {int integer;}
+%token <integer> X])[
 %code {
 #include <stdio.h> /* printf. */
 ]AT_PUSH_IF([[
@@ -138,12 +139,12 @@
 }
 %%
 exp:
-  'x' { printf ("x\n"); }
+  X { printf ("x\n"); }
 ;
 
 %%
 ]AT_YYERROR_DEFINE[
-]AT_YYLEX_DEFINE(["x"])[
+]AT_YYLEX_DEFINE([{AT_CXX_IF([yy::parser::token::])X, 0}])[
 ]])
 
 AT_BISON_CHECK([-d -o input.AT_LANG_EXT input.y])
@@ -202,17 +203,20 @@
 # Generate and compile to *.o.  Make sure there is no (allowed) YY*
 # nor yy* identifiers in the header after applying api.prefix.  Check
 # that headers can be compiled by a C++ compiler.
+#
+# They should all use parse.assert to make sure that we don't even
+# conflict of YY_ASSERT.
 m4_pushdef([AT_TEST],
-[AT_BISON_OPTION_PUSHDEFS([%define api.prefix {$1_} $2])
+[AT_BISON_OPTION_PUSHDEFS([%define api.prefix {$1_} %define parse.assert $2])
 AT_DATA_GRAMMAR([$1.y],
 [[%define api.prefix {$1_}
+%define parse.assert
 $2
 %define parse.error verbose
-%union
-{
-  int integer;
-}
-%{
+]AT_VARIANT_IF([],
+[%union {int integer;}])[
+
+%code {
 #include <stdio.h> /* printf. */
 ]AT_PUSH_IF([[
 #if defined __GNUC__ && (7 == __GNUC__ || 9 == __GNUC__)
@@ -221,8 +225,10 @@
 ]])[
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
-%}
+}
+
 %%
+
 exp:
   'x' '1' { printf ("x1\n"); }
 | 'x' '2' { printf ("x2\n"); }
@@ -233,9 +239,14 @@
 | 'x' '7' { printf ("x7\n"); }
 | 'x' '8' { printf ("x8\n"); }
 | 'x' '9' { printf ("x9\n"); }
+| 'x' 'a' { printf ("xa\n"); }
+| 'x' 'b' { printf ("xb\n"); }
+| 'x' 'c' { printf ("xc\n"); }
+| 'x' 'd' { printf ("xd\n"); }
 ;
 
 %%
+
 ]AT_YYERROR_DEFINE[
 ]AT_YYLEX_DEFINE(["$1"])[
 ]])
@@ -268,6 +279,10 @@
 #endif
 #include "x5.hh"
 #include "x9.hh"
+#include "xa.hh"
+#include "xb.hh"
+#include "xc.hh"
+#include "xd.hh"
 
 #define RUN(S)                                  \
   do {                                          \
@@ -290,6 +305,14 @@
   RUN(x8_parse());
   x9_::parser p9;
   RUN(p9.parse());
+  xa_::parser pa;
+  RUN(pa.parse());
+  xb_::parser pb;
+  RUN(pb.parse());
+  xc_::parser pc;
+  RUN(pc.parse());
+  xd_::parser pd;
+  RUN(pd.parse());
   return 0;
 }
 ]])# main.cc
@@ -302,8 +325,11 @@
 AT_TEST([x6], [%define api.pure])
 AT_TEST([x7], [%define api.push-pull both])
 AT_TEST([x8], [%define api.pure %define api.push-pull both])
-AT_TEST([x9], [%locations %code requires {#include "location.hh"} %define api.location.type {x5_::location} %debug %language "c++"])
-#AT_TEST([x5], [%locations %language "c++" %glr-parser])
+AT_TEST([x9], [%locations %code requires {#include "location.hh"} %define api.location.type {::x5_::location} %debug %language "c++"])
+AT_TEST([xa], [%locations %code requires {#include "location.hh"} %define api.location.type {::x5_::location} %language "c++" %define api.value.type variant])
+AT_TEST([xb], [%locations %define api.location.file none %language "c++" %define api.value.type variant])
+AT_TEST([xc], [%locations %code requires {#include "location.hh"} %define api.location.type {::x5_::location} %skeleton "glr2.cc"])
+AT_TEST([xd], [%locations %define api.location.file none %skeleton "glr2.cc"])
 
 # Check that api.prefix works properly:
 #
@@ -311,18 +337,22 @@
 #   C++ output relies on namespaces and still uses yy a lot.
 #
 # - no 'YY' left.
-#   Ignore comments, YYChar (template parameter), YYPUSH_MORE(_DEFINED)?
-#   (constant definition), YY_\w+_INCLUDED (header guards).
+#   Ignore YYPUSH_MORE(_DEFINED)? (constant definition),
 #   YYDEBUG (not renamed) can be read, but not changed.
 AT_PERL_CHECK([[-n -0777 -e '
+  # Ignore comments.
   s{/\*.*?\*/}{}gs;
   s{//.*}{}g;
+  # Ignore warnings.
+  s{# *pragma .* message ".*"}{}g;
+
   s{\b((defined|if)\ YYDEBUG
-      |YYChar
+      |YYChar     # Template parameter.
+      |YYNTOKENS  # This is actually scoped in a C++ class.
       |YYPUSH_MORE(?:_DEFINED)?
-      |YYUSE
-      |YY_ATTRIBUTE(?:_PURE|_UNUSED)
+      |S_(YY(ACCEPT|EMPTY|EOF|error|UNDEF))  # These guys are scoped.
       |YY(?:_REINTERPRET)?_CAST
+      |YY_ATTRIBUTE(?:_PURE|_UNUSED)
       |YY_CONSTEXPR
       |YY_COPY
       |YY_CPLUSPLUS
@@ -335,7 +365,10 @@
       |YY_NOTHROW
       |YY_NULLPTR
       |YY_RVREF
-      |YY_\w+_INCLUDED
+      |YY_USE
+      |YY_\w+_INCLUDED  # Header guards.
+      |FILE\ \*yyo      # Function argument.
+      |const\ yylocp    # Function argument.
       )\b}{}gx;
   while (/^(.*YY.*)$/gm)
   {
@@ -353,7 +386,11 @@
 # Do this late, so that other checks have been performed.
 AT_SKIP_IF_CANNOT_LINK_C_AND_CXX
 
-AT_COMPILE_CXX([parser], [[x[1-9].o -DCC_IS_CXX=$CC_IS_CXX main.cc]])
+# The header generated by glr2.cc requires C++11.  Push the options to
+# prepare AT_COMPILE_CXX.
+AT_BISON_OPTION_PUSHDEFS([%skeleton "glr2.cc"])
+AT_COMPILE_CXX([parser], [[x[1-9a-d].o -DCC_IS_CXX=$CC_IS_CXX main.cc]])
+AT_BISON_OPTION_POPDEFS
 AT_PARSER_CHECK([parser], [0], [[expout]])
 
 m4_popdef([AT_TEST])
diff --git a/tests/input.at b/tests/input.at
index 96e20a7..632be1a 100644
--- a/tests/input.at
+++ b/tests/input.at
@@ -1,6 +1,6 @@
-# Checking the Bison scanner.                    -*- Autotest -*-
+# Checking the Bison reader.                    -*- Autotest -*-
 
-# Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[Input Processing.]])
 
@@ -38,7 +38,7 @@
 
 # For some reason, on some systems we use the system's getopt, not the
 # one we ship in gnulib.  So we can get two different error messages.
-# See https://lists.gnu.org/archive/html/bison-patches/2018-10/msg00154.html
+# See https://lists.gnu.org/r/bison-patches/2018-10/msg00154.html
 AT_BISON_CHECK([--skeleton], [1], [], [stderr])
 AT_CHECK([[sed -e \
   "s/requires an argument -- skeleton/'--skeleton' requires an argument/" \
@@ -78,10 +78,14 @@
 ## Invalid inputs.  ##
 ## ---------------- ##
 
+# The truly bad guys no human would write, but easily uncovered by
+# fuzzers.
 AT_SETUP([Invalid inputs])
 
 AT_DATA([input.y],
-[[\000\001\002\377?
+[[%header "\360\000\200\210"
+\000\001\002\377?
+"\000"
 %%
 ?
 default: 'a' }
@@ -92,26 +96,58 @@
 ]])
 AT_PERL_REQUIRE([[-pi -e 's/\\(\d{3})/chr(oct($1))/ge' input.y]])
 
-AT_BISON_CHECK([input.y], [1], [],
-[[input.y:1.1-2: error: invalid characters: '\0\001\002\377?'
-input.y:3.1: error: invalid character: '?'
-input.y:4.14: error: invalid character: '}'
-input.y:5.1: error: invalid character: '%'
-input.y:5.2: error: invalid character: '&'
-input.y:6.1-17: error: invalid directive: '%a-does-not-exist'
+AT_BISON_CHECK([-fcaret input.y], [1], [], [stderr])
+
+# Autotest's diffing, when there are NUL bytes, just reports "binary
+# files differ".  So don't leave NUL bytes.  And don't leave invalid
+# mbchars either: escape raw binary.
+AT_PERL_CHECK([[-p -e 's{([\0\200\210\360\377])}{sprintf "\\x%02x", ord($1)}ge' stderr]], [],
+[[input.y:1.11: error: invalid null character
+    1 | %header "\xf0\x00\x80\x88"
+      |           ^
+input.y:2.1-2: error: invalid characters: '\0\001\002\377?'
+    2 | \x00\xff?
+      | ^~
+input.y:3.2: error: invalid null character
+    3 | "\x00"
+      |  ^
+input.y:5.1: error: invalid character: '?'
+    5 | ?
+      | ^
+input.y:6.14: error: invalid character: '}'
+    6 | default: 'a' }
+      |              ^
 input.y:7.1: error: invalid character: '%'
-input.y:7.2: error: invalid character: '-'
-input.y:8.1-9.0: error: missing '%}' at end of file
-input.y:8.1-9.0: error: syntax error, unexpected %{...%}
+    7 | %&
+      | ^
+input.y:7.2: error: invalid character: '&'
+    7 | %&
+      |  ^
+input.y:8.1-17: error: invalid directive: '%a-does-not-exist'
+    8 | %a-does-not-exist
+      | ^~~~~~~~~~~~~~~~~
+input.y:9.1: error: invalid character: '%'
+    9 | %-
+      | ^
+input.y:9.2: error: invalid character: '-'
+    9 | %-
+      |  ^
+input.y:10.1-11.0: error: missing '%}' at end of file
+   10 | %{
+      | ^~
 ]])
 
 AT_CLEANUP
 
 
+## ------------------------ ##
+## Invalid inputs with {}.  ##
+## ------------------------ ##
+
 AT_SETUP([Invalid inputs with {}])
 
 # We used to SEGV here.  See
-# http://lists.gnu.org/archive/html/bug-bison/2005-07/msg00053.html
+# https://lists.gnu.org/r/bug-bison/2005-07/msg00053.html
 
 AT_DATA([input.y],
 [[
@@ -124,7 +160,7 @@
 ]])
 
 AT_BISON_CHECK([input.y], [1], [],
-[[input.y:3.1-15: error: syntax error, unexpected %initial-action, expecting {...}
+[[input.y:3.1-15: error: expected {...} before %initial-action
 ]])
 
 AT_CLEANUP
@@ -269,10 +305,10 @@
 [[input.y:1.13-24: error: nonterminals cannot be given a string alias
     1 | %nterm expr "expression";
       |             ^~~~~~~~~~~~
-input.y:2.13-15: error: nonterminals cannot be given an explicit number
+input.y:2.13-15: error: nonterminals cannot be given a token code
     2 | %nterm term 123;
       |             ^~~
-input.y:3.13-15: error: nonterminals cannot be given an explicit number
+input.y:3.13-15: error: nonterminals cannot be given a token code
     3 | %nterm fact 124 "factor";
       |             ^~~
 input.y:3.17-24: error: nonterminals cannot be given a string alias
@@ -281,16 +317,16 @@
 input.y:4.8-10: error: character literals cannot be nonterminals
     4 | %nterm '+' '*';
       |        ^~~
-input.y:5.8-15: error: syntax error, unexpected string, expecting character literal or identifier or <tag>
+input.y:5.8-15: error: expected character literal or identifier or <tag> before string
     5 | %nterm "number";
       |        ^~~~~~~~
-input.y:6.8-13: error: syntax error, unexpected string, expecting character literal or identifier or <tag>
+input.y:6.8-13: error: expected character literal or identifier or <tag> before string
     6 | %token "tok1" 1;
       |        ^~~~~~
-input.y:7.14: error: syntax error, unexpected integer
+input.y:7.14: error: unexpected integer literal
     7 | %left "tok2" 2;
       |              ^
-input.y:8.14: error: syntax error, unexpected integer
+input.y:8.14: error: unexpected integer literal
     8 | %type "tok3" 3;
       |              ^
 ]])
@@ -298,6 +334,66 @@
 AT_CLEANUP
 
 
+## ---------------------------- ##
+## Redefining the error token.  ##
+## ---------------------------- ##
+
+AT_SETUP([Redefining the error token])
+
+# We used to crash when trying to display the original definition of
+# "error", which is a builtin without any location.
+AT_BISON_OPTION_PUSHDEFS
+
+AT_DATA([input.y],
+[[%token error 123
+%token error 124
+%%
+exp:
+]])
+
+AT_BISON_CHECK([-fcaret input.y], [1], [],
+[[input.y:2.8-12: warning: symbol error redeclared [-Wother]
+    2 | %token error 124
+      |        ^~~~~
+input.y:1.8-12: note: previous declaration
+    1 | %token error 123
+      |        ^~~~~
+input.y:2.14-16: error: redefining code of token error
+    2 | %token error 124
+      |              ^~~
+]])
+
+# While at it, make sure we properly used the user's number for
+# "error".  I don't see what it buys us, but...
+AT_DATA([input.y],
+[[%{
+#include <assert.h>
+#include <stdio.h>
+]AT_YYERROR_DEFINE[
+]AT_YYLEX_DEFINE[
+%}
+
+%token error 123
+%%
+exp:
+%%
+int main (void)
+{
+  assert (YYerror == 123);
+  assert (YYTRANSLATE (YYEOF) == YYSYMBOL_YYEOF);
+  assert (YYTRANSLATE (YYerror) == YYSYMBOL_YYerror);
+  assert (YYTRANSLATE (YYUNDEF) == YYSYMBOL_YYUNDEF);
+  return 0;
+}
+]])
+
+AT_FULL_COMPILE([input])
+AT_PARSER_CHECK([input], 0)
+
+AT_BISON_OPTION_POPDEFS
+AT_CLEANUP
+
+
 ## ------------------ ##
 ## Dangling aliases.  ##
 ## ------------------ ##
@@ -331,17 +427,19 @@
 AT_SETUP([Symbol declarations])
 
 AT_DATA([dump-symbols.m4],
-[[m4@&t@_define([b4_symbol_dump],
+[[m4@&t@_define([b4_api_PREFIX], [YY])
+
+m4@&t@_define([b4_symbol_dump],
 [$1, d@&t@nl
 b4_symbol_if([$1], [is_token], [Token], [Nonterminal]), d@&t@nl
 b4_symbol([$1], [tag]), d@&t@nl
 b4_symbol([$1], [id]), d@&t@nl
-b4_symbol([$1], [user_number]), d@&t@nl
+b4_symbol([$1], [code]), d@&t@nl
 b4_symbol([$1], [type]),
 ])
 
 b4_output_begin([symbols.csv])
-number, class, tag, id, user_number, type,
+number, class, tag, id, code, type,
 b4_symbol_foreach([b4_symbol_dump])d@&t@nl
 b4_output_end
 ]])
@@ -368,10 +466,10 @@
 
 AT_BISON_CHECK([-Wno-other -S./dump-symbols.m4 input.y])
 AT_CHECK([cat symbols.csv], [],
-[[number, class, tag, id, user_number, type,
-0, Token, $end, , 0, ,
-1, Nonterminal, error, error, 256, ,
-2, Nonterminal, $undefined, , 257, ,
+[[number, class, tag, id, code, type,
+0, Token, "end of file", YYEOF, 0, ,
+1, Token, error, YYerror, 256, ,
+2, Token, "invalid token", YYUNDEF, 257, ,
 3, Token, 'a', , 97, ,
 4, Token, "A1", A1, 1, ,
 5, Token, A2, A2, 258, ,
@@ -707,19 +805,19 @@
 [[input.y:1.12-14: warning: symbol FOO redeclared [-Wother]
     1 | %token FOO FOO
       |            ^~~
-input.y:1.8-10:      previous declaration
+input.y:1.8-10: note: previous declaration
     1 | %token FOO FOO
       |        ^~~
 input.y:2.15-17: warning: symbol BAR redeclared [-Wother]
     2 | %token BAR 12 BAR 12
       |               ^~~
-input.y:2.8-10:      previous declaration
+input.y:2.8-10: note: previous declaration
     2 | %token BAR 12 BAR 12
       |        ^~~
 input.y:3.14-16: warning: symbol EOF redeclared [-Wother]
     3 | %token EOF 0 EOF 0
       |              ^~~
-input.y:3.8-10:      previous declaration
+input.y:3.8-10: note: previous declaration
     3 | %token EOF 0 EOF 0
       |        ^~~
 ]])
@@ -727,6 +825,33 @@
 AT_CLEANUP
 
 
+## ---------------- ##
+## EOF redeclared.  ##
+## ---------------- ##
+
+AT_SETUP([EOF redeclared])
+
+# We used to crash when redefining a token after having defined EOF.
+# See https://lists.gnu.org/r/bug-bison/2020-08/msg00008.html.
+
+AT_DATA([[input.y]],
+[[%token FOO BAR FOO 0
+%%
+input: %empty
+]])
+
+AT_BISON_CHECK([-fcaret input.y], [0], [],
+[[input.y:1.16-18: warning: symbol FOO redeclared [-Wother]
+    1 | %token FOO BAR FOO 0
+      |                ^~~
+input.y:1.8-10: note: previous declaration
+    1 | %token FOO BAR FOO 0
+      |        ^~~
+]])
+
+AT_CLEANUP
+
+
 ## --------------------------- ##
 ## Symbol class redefinition.  ##
 ## --------------------------- ##
@@ -747,13 +872,13 @@
 [[input.y:2.8-10: error: symbol FOO redeclared as a nonterminal
     2 | %nterm FOO BAR
       |        ^~~
-input.y:1.8-10:     previous definition
+input.y:1.8-10: note: previous definition
     1 | %token FOO
       |        ^~~
 input.y:3.8-10: error: symbol BAR redeclared as a token
     3 | %token BAR
       |        ^~~
-input.y:2.12-14:    previous definition
+input.y:2.12-14: note: previous definition
     2 | %nterm FOO BAR
       |            ^~~
 input.y:4.8-12: error: symbol error redeclared as a nonterminal
@@ -795,37 +920,37 @@
 [[input.y:1.13-29: error: %destructor redeclaration for <>
     1 | %destructor { destroy ($$); } <> <>
       |             ^~~~~~~~~~~~~~~~~
-input.y:1.13-29:     previous declaration
+input.y:1.13-29: note: previous declaration
     1 | %destructor { destroy ($$); } <> <>
       |             ^~~~~~~~~~~~~~~~~
 input.y:2.10-24: error: %printer redeclaration for <>
     2 | %printer { print ($$); } <> <>
       |          ^~~~~~~~~~~~~~~
-input.y:2.10-24:     previous declaration
+input.y:2.10-24: note: previous declaration
     2 | %printer { print ($$); } <> <>
       |          ^~~~~~~~~~~~~~~
 input.y:4.13-29: error: %destructor redeclaration for <>
     4 | %destructor { destroy ($$); } <>
       |             ^~~~~~~~~~~~~~~~~
-input.y:1.13-29:     previous declaration
+input.y:1.13-29: note: previous declaration
     1 | %destructor { destroy ($$); } <> <>
       |             ^~~~~~~~~~~~~~~~~
 input.y:5.10-24: error: %printer redeclaration for <>
     5 | %printer { print ($$); } <>
       |          ^~~~~~~~~~~~~~~
-input.y:2.10-24:     previous declaration
+input.y:2.10-24: note: previous declaration
     2 | %printer { print ($$); } <> <>
       |          ^~~~~~~~~~~~~~~
 input.y:11.13-29: error: %destructor redeclaration for <>
    11 | %destructor { destroy ($$); } <>;
       |             ^~~~~~~~~~~~~~~~~
-input.y:1.13-29:      previous declaration
+input.y:1.13-29: note: previous declaration
     1 | %destructor { destroy ($$); } <> <>
       |             ^~~~~~~~~~~~~~~~~
 input.y:12.10-24: error: %printer redeclaration for <>
    12 | %printer { print ($$); } <>;
       |          ^~~~~~~~~~~~~~~
-input.y:2.10-24:      previous declaration
+input.y:2.10-24: note: previous declaration
     2 | %printer { print ($$); } <> <>
       |          ^~~~~~~~~~~~~~~
 ]])
@@ -861,21 +986,21 @@
 
 AT_BISON_CHECK([input.y], [1], [],
 [[input.y:4.13-29: error: %destructor redeclaration for <field1>
-input.y:1.13-29:     previous declaration
+input.y:1.13-29: note: previous declaration
 input.y:4.13-29: error: %destructor redeclaration for <field1>
-input.y:1.13-29:     previous declaration
+input.y:1.13-29: note: previous declaration
 input.y:5.10-24: error: %printer redeclaration for <field2>
-input.y:2.10-24:     previous declaration
+input.y:2.10-24: note: previous declaration
 input.y:5.10-24: error: %printer redeclaration for <field2>
-input.y:2.10-24:     previous declaration
+input.y:2.10-24: note: previous declaration
 input.y:11.13-29: error: %destructor redeclaration for <field2>
-input.y:1.13-29:      previous declaration
+input.y:1.13-29: note: previous declaration
 input.y:11.13-29: error: %destructor redeclaration for <field1>
-input.y:1.13-29:      previous declaration
+input.y:1.13-29: note: previous declaration
 input.y:12.10-24: error: %printer redeclaration for <field2>
-input.y:2.10-24:      previous declaration
+input.y:2.10-24: note: previous declaration
 input.y:12.10-24: error: %printer redeclaration for <field1>
-input.y:2.10-24:      previous declaration
+input.y:2.10-24: note: previous declaration
 ]])
 
 AT_CLEANUP
@@ -1132,10 +1257,10 @@
 [[input.y:2.17-21: warning: symbol "foo" used more than once as a literal string [-Wother]
     2 |          BAR 42 "foo"
       |                 ^~~~~
-input.y:2.10-12: error: user token number 42 redeclaration for BAR
+input.y:2.10-12: error: code 42 reassigned to token BAR
     2 |          BAR 42 "foo"
       |          ^~~
-input.y:1.15-19:     previous declaration for "foo"
+input.y:1.15-19: note: previous declaration for "foo"
     1 | %token FOO 42 "foo"
       |               ^~~~~
 ]])
@@ -1163,12 +1288,12 @@
 %%
 exp: foo;
 ]],
-[[input.y:3.7-11: error: %type redeclaration for foo
+[[input.y:3.13-15: error: %type redeclaration for foo
     3 | %type <baz> foo
-      |       ^~~~~
-input.y:2.7-11:     previous declaration
+      |             ^~~
+input.y:2.13-17: note: previous declaration
     2 | %type <bar> "foo"
-      |       ^~~~~
+      |             ^~~~~
 ]])
 
 AT_TEST([[%token foo "foo"
@@ -1180,7 +1305,7 @@
 [[input.y:3.10-14: error: %printer redeclaration for foo
     3 | %printer {baz} foo
       |          ^~~~~
-input.y:2.10-14:     previous declaration
+input.y:2.10-14: note: previous declaration
     2 | %printer {bar} "foo"
       |          ^~~~~
 ]])
@@ -1194,7 +1319,7 @@
 [[input.y:3.13-17: error: %destructor redeclaration for foo
     3 | %destructor {baz} foo
       |             ^~~~~
-input.y:2.13-17:     previous declaration
+input.y:2.13-17: note: previous declaration
     2 | %destructor {bar} "foo"
       |             ^~~~~
 ]])
@@ -1208,7 +1333,7 @@
 [[input.y:3.1-5: error: %left redeclaration for foo
     3 | %left foo
       | ^~~~~
-input.y:2.1-5:     previous declaration
+input.y:2.1-5: note: previous declaration
     2 | %left "foo"
       | ^~~~~
 ]])
@@ -1225,7 +1350,7 @@
 [[input.y:2.1-5: error: %left redeclaration for foo
     2 | %left foo
       | ^~~~~
-input.y:1.1-5:     previous declaration
+input.y:1.1-5: note: previous declaration
     1 | %left "foo"
       | ^~~~~
 ]])
@@ -1240,7 +1365,7 @@
 [[input.y:2.10-11: error: %printer redeclaration for foo
     2 | %printer {} foo
       |          ^~
-input.y:1.10-11:     previous declaration
+input.y:1.10-11: note: previous declaration
     1 | %printer {} "foo"
       |          ^~
 ]])
@@ -1255,7 +1380,7 @@
 [[input.y:2.13-14: error: %destructor redeclaration for foo
     2 | %destructor {} foo
       |             ^~
-input.y:1.13-14:     previous declaration
+input.y:1.13-14: note: previous declaration
     1 | %destructor {} "foo"
       |             ^~
 ]])
@@ -1275,24 +1400,31 @@
 AT_SETUP([Torturing the Scanner])
 
 AT_BISON_OPTION_PUSHDEFS
-AT_DATA([input.y], [])
-AT_BISON_CHECK([input.y], [1], [],
-[[input.y:1.1: error: syntax error, unexpected end of file
-]])
-
 
 AT_DATA([input.y],
 [{}
 ])
 AT_BISON_CHECK([-fcaret  input.y], [1], [],
-[[input.y:1.1-2: error: syntax error, unexpected {...}
+[[input.y:1.1-2: error: unexpected {...}
     1 | {}
       | ^~
 ]])
 
 
+# Clang chokes on some of our comments, because it tries to "parse"
+# some documentation directives in the comments:
+#
+# input.c:166:50: error: '\a' command does not have a valid word argument [-Werror,-Wdocumentation]
+#     FAKE = 258                     /* "fake [] \a\b\f\n\r\t\v\"'?\\[\\ ??!??'??(??)??-??/??<??=??> \001\001"  */
+#                                                ~~^
 AT_DATA_GRAMMAR([input.y],
-[[%{
+[[%code requires {
+#if defined __clang__ && 10 <= __clang_major__
+# pragma clang diagnostic ignored "-Wdocumentation"
+#endif
+}
+
+%{
 /* This is seen in GCC: a %{ and %} in middle of a comment. */
 const char *foo = "So %{ and %} can be here too.";
 
@@ -1363,6 +1495,11 @@
 /* Exercise quotes in strings.  */
 %token FAKE "fake @<:@@:>@ \a\b\f\n\r\t\v\"\'\?\\\u005B\U0000005c ??!??'??(??)??-??/??<??=??> \x1\1"
 
+/* Beware of the generated comments that embed string aliases that
+   might close the comment.  */
+%token COMMENT_CLOSE "*/"
+%token COMMENT       "/* comment */"
+
 %%
 /* Exercise M4 quoting: '@:>@@:>@', @<:@, 1.  */
 exp: '@<:@' '\1' two '$' '@' '{' oline output.or.oline.opt
@@ -1482,7 +1619,7 @@
 AT_SETUP([String aliases for character tokens])
 
 # Bison once thought a character token and its alias were different
-# symbols with the same user token number.
+# symbols with the same code.
 
 AT_BISON_OPTION_PUSHDEFS
 AT_DATA_GRAMMAR([input.y],
@@ -1581,10 +1718,10 @@
 ]])
 
 AT_BISON_CHECK([redecl.y], [1], [],
-[[redecl.y:10.10-22: error: user token number 11259375 redeclaration for HEXADECIMAL_1
-redecl.y:9.8-16:       previous declaration for DECIMAL_1
-redecl.y:12.10-18: error: user token number 16702650 redeclaration for DECIMAL_2
-redecl.y:11.10-22:     previous declaration for HEXADECIMAL_2
+[[redecl.y:10.10-22: error: code 11259375 reassigned to token HEXADECIMAL_1
+redecl.y:9.8-16: note: previous declaration for DECIMAL_1
+redecl.y:12.10-18: error: code 16702650 reassigned to token DECIMAL_2
+redecl.y:11.10-22: note: previous declaration for HEXADECIMAL_2
 ]])
 
 AT_DATA_GRAMMAR([too-large.y],
@@ -1597,9 +1734,9 @@
 
 AT_BISON_CHECK([too-large.y], [1], [],
 [[too-large.y:9.22-42: error: integer out of range: '999999999999999999999'
-too-large.y:9.22-42: error: user token number of TOO_LARGE_DEC too large
+too-large.y:9.22-42: error: code of token TOO_LARGE_DEC too large
 too-large.y:10.24-44: error: integer out of range: '0xFFFFFFFFFFFFFFFFFFF'
-too-large.y:10.24-44: error: user token number of TOO_LARGE_HEX too large
+too-large.y:10.24-44: error: code of token TOO_LARGE_HEX too large
 ]])
 
 AT_BISON_OPTION_POPDEFS
@@ -1612,8 +1749,8 @@
 
 AT_SETUP([Unclosed constructs])
 
-# Bison's scan-gram.l once forgot to STRING_FINISH some unclosed
-# constructs, so they were prepended to whatever it STRING_GROW'ed
+# Bison's scan-gram.l once forgot to STRING_FINISH () some unclosed
+# constructs, so they were prepended to whatever it STRING_GROW ()'ed
 # next.  It also threw them away rather than returning them to the
 # parser.  The effect was confusing subsequent error messages.
 
@@ -1655,7 +1792,7 @@
 input.y:19.13-20.0: error: missing '}' at end of file
    19 | %destructor { free ($$)
       |             ^~~~~~~~~~~
-input.y:20.1: error: syntax error, unexpected end of file
+input.y:20.1: error: unexpected end of file
 ]])
 
 AT_CLEANUP
@@ -1682,6 +1819,75 @@
 AT_CLEANUP
 
 
+## ------------------------- ##
+## Duplicate %start symbol.  ##
+## ------------------------- ##
+
+AT_SETUP([Duplicate %start symbol])
+
+AT_KEYWORDS([multistart])
+
+AT_DATA([input.y],
+[[%start exp exp exp
+%%
+exp: %empty;
+]])
+
+AT_BISON_CHECK([-fcaret input.y], [0], [],
+[[input.y:1.12-14: warning: duplicate directive [-Wother]
+    1 | %start exp exp exp
+      |            ^~~
+input.y:1.8-10: note: previous declaration
+    1 | %start exp exp exp
+      |        ^~~
+input.y:1.16-18: warning: duplicate directive [-Wother]
+    1 | %start exp exp exp
+      |                ^~~
+input.y:1.8-10: note: previous declaration
+    1 | %start exp exp exp
+      |        ^~~
+input.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
+]])
+
+AT_DATA([input.y],
+[[%start exp foo exp
+%%
+exp: foo;
+foo: %empty;
+]])
+
+AT_BISON_CHECK([-fcaret input.y], [0], [],
+[[input.y:1.16-18: warning: duplicate directive [-Wother]
+    1 | %start exp foo exp
+      |                ^~~
+input.y:1.8-10: note: previous declaration
+    1 | %start exp foo exp
+      |        ^~~
+input.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
+]])
+
+AT_DATA([input.y],
+[[%start exp foo
+%start exp
+%%
+exp: foo;
+foo: %empty;
+]])
+
+AT_BISON_CHECK([-fcaret input.y], [0], [],
+[[input.y:2.8-10: warning: duplicate directive [-Wother]
+    2 | %start exp
+      |        ^~~
+input.y:1.8-10: note: previous declaration
+    1 | %start exp foo
+      |        ^~~
+input.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
+]])
+
+
+AT_CLEANUP
+
+
 ## --------------------- ##
 ## %prec takes a token.  ##
 ## --------------------- ##
@@ -1870,9 +2076,9 @@
 
 AT_BISON_CHECK([[input-redefined.y]], [[1]], [],
 [[input-redefined.y:2.1-20: warning: %define variable 'var' redefined [-Wother]
-input-redefined.y:1.1-20:     previous definition
+input-redefined.y:1.1-20: note: previous definition
 input-redefined.y:3.2-21: error: %define variable 'var' redefined
-input-redefined.y:2.1-20:     previous definition
+input-redefined.y:2.1-20: note: previous definition
 input-redefined.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
 ]])
 
@@ -1928,7 +2134,7 @@
 ]])
 AT_BISON_CHECK([[-Dvar=cmd-d input-dg.y]], [[1]], [],
 [[input-dg.y:1.1-18: error: %define variable 'var' redefined
-<command line>:3:      previous definition
+<command line>:3: note: previous definition
 input-dg.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
 ]])
 
@@ -1941,7 +2147,7 @@
 [[input-dg.y:1.1-18: error: %define variable 'var' redefined
     1 | %define var "gram"
       | ^~~~~~~~~~~~~~~~~~
-<command line>:4:      previous definition
+<command line>:4: note: previous definition
 input-dg.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
 ]])
 
@@ -2064,11 +2270,30 @@
 [[input.y:1.1-34: error: invalid value for %define variable 'lr.default-reduction': 'bogus'
     1 | %define lr.default-reduction bogus
       | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-input.y:1.1-34:     accepted value: 'most'
-input.y:1.1-34:     accepted value: 'consistent'
-input.y:1.1-34:     accepted value: 'accepting'
+input.y:1.1-34: note: accepted value: 'most'
+input.y:1.1-34: note: accepted value: 'consistent'
+input.y:1.1-34: note: accepted value: 'accepting'
 ]])
 
+# Check escapes.
+AT_DATA([[input.y]],
+[[%define lr.default-reduction {[$@]}
+%%
+start: %empty;
+]])
+AT_BISON_CHECK([[-fcaret input.y]], [[1]], [[]],
+[[input.y:1.1-35: warning: %define variable 'lr.default-reduction' requires keyword values [-Wdeprecated]
+    1 | %define lr.default-reduction {[$@]}
+      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+input.y:1.1-35: error: invalid value for %define variable 'lr.default-reduction': '[$@]'
+    1 | %define lr.default-reduction {[$@]}
+      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+input.y:1.1-35: note: accepted value: 'most'
+input.y:1.1-35: note: accepted value: 'consistent'
+input.y:1.1-35: note: accepted value: 'accepting'
+]])
+
+
 # Back-end.
 AT_DATA([[input.y]],
 [[%define api.push-pull neither
@@ -2079,9 +2304,9 @@
 [[input.y:1.1-29: error: invalid value for %define variable 'api.push-pull': 'neither'
     1 | %define api.push-pull neither
       | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-input.y:1.1-29:     accepted value: 'pull'
-input.y:1.1-29:     accepted value: 'push'
-input.y:1.1-29:     accepted value: 'both'
+input.y:1.1-29: note: accepted value: 'pull'
+input.y:1.1-29: note: accepted value: 'push'
+input.y:1.1-29: note: accepted value: 'both'
 ]])
 
 AT_CLEANUP
@@ -2123,6 +2348,7 @@
 %define namespace "foo"
 %define variant
 %define parser_class_name {parser}
+%define filename_type {filename}
 %%
 start: %empty;
 ]])
@@ -2147,6 +2373,10 @@
     5 | %define parser_class_name {parser}
       | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       | %define api.parser.class {parser}
+input.y:6.1-32: warning: deprecated directive: '%define filename_type {filename}', use '%define api.filename.type {filename}' [-Wdeprecated]
+    6 | %define filename_type {filename}
+      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+      | %define api.filename.type {filename}
 input.y:2.1-40: error: invalid value for %define Boolean variable 'lr.keep-unreachable-state'
     2 | %define lr.keep_unreachable_states maybe
       | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -2205,7 +2435,7 @@
 [
 AT_DATA([[input.y]],
 [[%language "C++"
-%defines
+%header
 %define api.namespace {]$1[}
 %%
 start: %empty;
@@ -2258,19 +2488,19 @@
 start: ']])
 
 AT_BISON_CHECK([-fcaret empty.y], [1], [],
-[[empty.y:2.8-9: warning: empty character literal [-Wother]
+[[empty.y:2.8-9: error: empty character literal
     2 | start: '';
       |        ^~
 empty.y:3.8-4.0: error: missing "'" at end of line
     3 | start: '
       |        ^
-empty.y:3.8-4.0: warning: empty character literal [-Wother]
+empty.y:3.8-4.0: error: empty character literal
     3 | start: '
       |        ^
 empty.y:4.8: error: missing "'" at end of file
     4 | start: '
       |        ^
-empty.y:4.8: warning: empty character literal [-Wother]
+empty.y:4.8: error: empty character literal
     4 | start: '
       |        ^
 ]])
@@ -2282,11 +2512,11 @@
 start: 'ab]])
 
 AT_BISON_CHECK([two.y], [1], [],
-[[two.y:2.8-11: warning: extra characters in character literal [-Wother]
+[[two.y:2.8-11: error: extra characters in character literal
 two.y:3.8-4.0: error: missing "'" at end of line
-two.y:3.8-4.0: warning: extra characters in character literal [-Wother]
+two.y:3.8-4.0: error: extra characters in character literal
 two.y:4.8-10: error: missing "'" at end of file
-two.y:4.8-10: warning: extra characters in character literal [-Wother]
+two.y:4.8-10: error: extra characters in character literal
 ]])
 
 AT_DATA_NO_FINAL_EOL([three.y],
@@ -2296,11 +2526,11 @@
 start: 'abc]])
 
 AT_BISON_CHECK([three.y], [1], [],
-[[three.y:2.8-12: warning: extra characters in character literal [-Wother]
+[[three.y:2.8-12: error: extra characters in character literal
 three.y:3.8-4.0: error: missing "'" at end of line
-three.y:3.8-4.0: warning: extra characters in character literal [-Wother]
+three.y:3.8-4.0: error: extra characters in character literal
 three.y:4.8-11: error: missing "'" at end of file
-three.y:4.8-11: warning: extra characters in character literal [-Wother]
+three.y:4.8-11: error: extra characters in character literal
 ]])
 
 AT_CLEANUP
@@ -2327,25 +2557,15 @@
 
 AT_BISON_CHECK([input.y], [1], [],
 [[input.y:2.9-12: error: invalid number after \-escape: 777
-input.y:2.8-13: warning: empty character literal [-Wother]
 input.y:2.16-17: error: invalid number after \-escape: 0
-input.y:2.15-18: warning: empty character literal [-Wother]
 input.y:2.21-25: error: invalid number after \-escape: xfff
-input.y:2.20-26: warning: empty character literal [-Wother]
 input.y:2.29-31: error: invalid number after \-escape: x0
-input.y:2.28-32: warning: empty character literal [-Wother]
 input.y:3.9-14: error: invalid number after \-escape: uffff
-input.y:3.8-15: warning: empty character literal [-Wother]
 input.y:3.18-23: error: invalid number after \-escape: u0000
-input.y:3.17-24: warning: empty character literal [-Wother]
 input.y:3.27-36: error: invalid number after \-escape: Uffffffff
-input.y:3.26-37: warning: empty character literal [-Wother]
 input.y:3.40-49: error: invalid number after \-escape: U00000000
-input.y:3.39-50: warning: empty character literal [-Wother]
 input.y:4.9-10: error: invalid character after \-escape: ' '
-input.y:4.8-11: warning: empty character literal [-Wother]
 input.y:4.14-15: error: invalid character after \-escape: A
-input.y:4.13-16: warning: empty character literal [-Wother]
 input.y:5.9-16: error: invalid character after \-escape: \t
 input.y:5.17: error: invalid character after \-escape: \f
 input.y:5.18: error: invalid character after \-escape: \0
@@ -2355,6 +2575,99 @@
 AT_CLEANUP
 
 
+## ------------------------ ##
+## Unexpected end of file.  ##
+## ------------------------ ##
+
+AT_SETUP([[Unexpected end of file]])
+
+
+AT_DATA([input.y], [])
+AT_BISON_CHECK([-fcaret input.y], [1], [],
+[[input.y:1.1: error: unexpected end of file
+]])
+
+
+AT_DATA_NO_FINAL_EOL([char.y],
+[[%token FOO ']])
+
+AT_BISON_CHECK([-fcaret char.y], [1], [],
+[[char.y:1.12: error: missing "'" at end of file
+    1 | %token FOO '
+      |            ^
+char.y:1.12: error: empty character literal
+    1 | %token FOO '
+      |            ^
+]])
+
+
+AT_DATA_NO_FINAL_EOL([escape-in-char.y],
+[[%token FOO '\]])
+
+AT_BISON_CHECK([-fcaret escape-in-char.y], [1], [],
+[[escape-in-char.y:1.12-13: error: missing '?\'' at end of file
+    1 | %token FOO '\
+      |            ^~
+escape-in-char.y:1.14: error: unexpected end of file
+    1 | %token FOO '\
+      |              ^
+]])
+
+
+AT_DATA_NO_FINAL_EOL([string.y],
+[[%token FOO "]])
+
+AT_BISON_CHECK([-fcaret string.y], [1], [],
+[[string.y:1.12: error: missing '"' at end of file
+    1 | %token FOO "
+      |            ^
+string.y:1.13: error: unexpected end of file
+    1 | %token FOO "
+      |             ^
+]])
+
+
+AT_DATA_NO_FINAL_EOL([escape-in-string.y],
+[[%token FOO "\]])
+
+AT_BISON_CHECK([-fcaret escape-in-string.y], [1], [],
+[[escape-in-string.y:1.12-13: error: missing '?"' at end of file
+    1 | %token FOO "\
+      |            ^~
+escape-in-string.y:1.14: error: unexpected end of file
+    1 | %token FOO "\
+      |              ^
+]])
+
+
+AT_DATA_NO_FINAL_EOL([tstring.y],
+[[%token FOO _("]])
+
+AT_BISON_CHECK([-fcaret tstring.y], [1], [],
+[[tstring.y:1.12-14: error: missing '")' at end of file
+    1 | %token FOO _("
+      |            ^~~
+tstring.y:1.15: error: unexpected end of file
+    1 | %token FOO _("
+      |               ^
+]])
+
+
+AT_DATA_NO_FINAL_EOL([escape-in-tstring.y],
+[[%token FOO _("\]])
+
+AT_BISON_CHECK([-fcaret escape-in-tstring.y], [1], [],
+[[escape-in-tstring.y:1.12-15: error: missing '?")' at end of file
+    1 | %token FOO _("\
+      |            ^~~~
+escape-in-tstring.y:1.16: error: unexpected end of file
+    1 | %token FOO _("\
+      |                ^
+]])
+
+AT_CLEANUP
+
+
 ## ------------------------- ##
 ## LAC: Errors for %define.  ##
 ## ------------------------- ##
@@ -2367,25 +2680,34 @@
 start: %empty;
 ]])
 
+# Only "full" and "none" are accepted for parse.lac
+# Unknown values (such as "unsupported") are rejected
+m4_foreach([b4_skel], [[yacc.c], [lalr1.cc], [lalr1.d], [lalr1.java]],
+[AT_BISON_CHECK([[-S]b4_skel[ -Dparse.lac=none input.y]])
+AT_BISON_CHECK([[-S]b4_skel[ -Dparse.lac=full input.y]])
+AT_BISON_CHECK([[-S]b4_skel[ -Dparse.lac=unsupported input.y]],
+               [[1]], [],
+[[<command line>:4: error: invalid value for %define variable 'parse.lac': 'unsupported'
+<command line>:4: note: accepted value: 'full'
+<command line>:4: note: accepted value: 'none'
+]])
+])
+
 # parse.lac.* options are useless if LAC isn't actually activated.
-AT_BISON_CHECK([[-Dparse.lac.es-capacity-initial=1 input.y]],
+AT_BISON_CHECK([[-Dparse.lac.es-capacity-initial=1 -Dparse.lac.memory-trace=full input.y]],
                [[1]], [],
 [[<command line>:3: error: %define variable 'parse.lac.es-capacity-initial' is not used
-]])
-AT_BISON_CHECK([[-Dparse.lac.memory-trace=full input.y]],
-               [[1]], [],
-[[<command line>:3: error: %define variable 'parse.lac.memory-trace' is not used
+<command line>:4: error: %define variable 'parse.lac.memory-trace' is not used
 ]])
 
-# parse.lac.* options are useless in C++ even if LAC isn't actually activated.
-AT_BISON_CHECK([[-Dparse.lac.es-capacity-initial=1 -L C++ -Dparse.lac input.y]],
+# parse.lac.* options are useless in C++/Java even if LAC is actually activated.
+m4_foreach([b4_skel], [[lalr1.cc], [lalr1.java]],
+[AT_BISON_CHECK([[-S]b4_skel[ -Dparse.lac=full -Dparse.lac.es-capacity-initial=1 -Dparse.lac.memory-trace=full input.y]],
                [[1]], [],
-[[<command line>:3: error: %define variable 'parse.lac.es-capacity-initial' is not used
+[[<command line>:5: error: %define variable 'parse.lac.es-capacity-initial' is not used
+<command line>:6: error: %define variable 'parse.lac.memory-trace' is not used
 ]])
-AT_BISON_CHECK([[-Dparse.lac.memory-trace=full -L C++ -Dparse.lac  input.y]],
-               [[1]], [],
-[[<command line>:3: error: %define variable 'parse.lac.memory-trace' is not used
-]])
+])
 
 AT_CLEANUP
 
@@ -2489,9 +2811,9 @@
 %define api.value.union.name foo]],
 [0],
 [[input.y:3.8-10: warning: %define variable 'api.value.union.name' redefined [-Wother]
-input.y:1.8-10:     previous definition
+input.y:1.8-10: note: previous definition
 input.y:4.1-32: warning: %define variable 'api.value.union.name' redefined [-Wother]
-input.y:3.8-10:     previous definition
+input.y:3.8-10: note: previous definition
 input.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
 ]])
 
@@ -2529,7 +2851,9 @@
 %printer        { $%; @%; } <*> exp TOK;
 %{ $ @ %} // Should not warn.
 %%
-exp: TOK        { $%; @%; $$ = $1; };
+exp: TOK        { $%; @%; $$ = $1; }
+   | 'a'        { $<->1; $$ = 1; }
+   | 'b'        { $<foo->bar>$; }
 %%
 $ @ // Should not warn.
 ]])
@@ -2543,6 +2867,7 @@
 input.y:13.23: warning: stray '@' [-Wother]
 input.y:16.19: warning: stray '$' [-Wother]
 input.y:16.23: warning: stray '@' [-Wother]
+input.y:17.19: warning: stray '$' [-Wother]
 ]])
 
 AT_BISON_OPTION_POPDEFS
@@ -2564,26 +2889,26 @@
 # Try to have MACRO be run by bison.
 m4_pushdef([AT_TEST],
 [AT_DATA([[input.y]],
-[[%type <$1(DEAD %type)> exp
-%token <$1(DEAD %token)> a
+[[%type <$1(%type)> exp
+%token <$1(%token)> a
 %token b
 %initial-action
 {
   $$;
-  $<$1(DEAD %initial-action)>$
+  $<$1(%initial-action)>$
 };
 %printer
 {
   $$
-  $<$1(DEAD %printer)>$
+  $<$1(%printer)>$
 } <> <*>;
 %lex-param
 {
-  $1(DEAD %lex-param)
+  $1(%lex-param)
 };
 %parse-param
 {
-  $1(DEAD %parse-param)
+  $1(%parse-param)
 };
 %%
 exp:
@@ -2591,24 +2916,23 @@
   {
     $$;
     $][1;
-    $<$1(DEAD action 1)>$
-    $<$1(DEAD action 2)>1
-    $<$1(DEAD action 3)>name
-    $<$1(DEAD action 4)>0
+    $<$1(action 1)>$
+    $<$1(action 2)>1
+    $<$1(action 3)>name
+    $<$1(action 4)>0
     ;
   };
 ]])
 
-# FIXME: Provide a means to iterate over all the skeletons.
-AT_BISON_CHECK([[-d               input.y]])
-AT_BISON_CHECK([[-d -S glr.c      input.y]])
-AT_BISON_CHECK([[-d -S lalr1.cc   input.y]])
-AT_BISON_CHECK([[-d -S glr.cc     input.y]])
-AT_BISON_CHECK([[   -S lalr1.java input.y]])
+# Disable -Wother to avoid the warnings about the suspicious presence
+# of `b4_canary` in the output.
+AT_FOR_EACH_SKEL(
+[AT_BISON_CHECK([[-Wno-other -S ]b4_skel[ ]m4_bmatch(b4_skel, [.*\.\(d\|java\)$], [], [-d])[ input.y]])
+])
 ])
 
-AT_TEST([m4_errprintn])
-AT_TEST([@:>@m4_errprintn])
+AT_TEST([b4_canary])
+AT_TEST([@:>@b4_canary])
 
 m4_popdef([AT_TEST])
 
@@ -2646,6 +2970,7 @@
 %error-verbose
 %glr-parser
 %name-prefix "bar"
+%defines "header.h"
 %%
 exp : '0'
 ]])
@@ -2660,7 +2985,7 @@
 input.y:13.1-14: warning: deprecated directive: '%file-prefix =', use '%file-prefix' [-Wdeprecated]
 fix-it:"input.y":{13:1-13:15}:"%file-prefix"
 input.y:14.1-16.5: warning: duplicate directive: '%file-prefix\n =' [-Wother]
-input.y:13.1-20:       previous declaration
+input.y:13.1-20: note: previous declaration
 fix-it:"input.y":{14:1-16:6}:""
 input.y:17.9-27: warning: deprecated directive: '%fixed-output_files', use '%output "y.tab.c"' [-Wdeprecated]
 fix-it:"input.y":{17:2-17:21}:"%output \"y.tab.c\""
@@ -2683,10 +3008,10 @@
 input.y:26.1-12: warning: deprecated directive: '%token_table', use '%token-table' [-Wdeprecated]
 fix-it:"input.y":{26:1-26:13}:"%token-table"
 input.y:27.1-14: warning: %define variable 'parse.error' redefined [-Wother]
-input.y:11.1-14:     previous definition
+input.y:11.1-14: note: previous definition
 fix-it:"input.y":{27:1-27:15}:""
 input.y:29.1-18: warning: duplicate directive: '%name-prefix "bar"' [-Wother]
-input.y:13.1-20:     previous declaration
+input.y:13.1-20: note: previous declaration
 fix-it:"input.y":{29:1-29:19}:""
 input.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
 ]])
@@ -2729,6 +3054,7 @@
 %define api.pure
 %token-table
 %glr-parser
+%defines "header.h"
 %%
 exp : '0'
 ]])
@@ -2769,9 +3095,9 @@
 input.y:12.15-24: warning: deprecated directive: '%expect_rr', use '%expect-rr' [-Wdeprecated]
 input.y:13.1-14: warning: deprecated directive: '%error_verbose', use '%define parse.error verbose' [-Wdeprecated]
 input.y:13.16-29: warning: %define variable 'parse.error' redefined [-Wother]
-input.y:13.1-14:      previous definition
+input.y:13.1-14: note: previous definition
 input.y:14.16-29: warning: %define variable 'parse.error' redefined [-Wother]
-input.y:13.16-29:     previous definition
+input.y:13.16-29: note: previous definition
 input.y: error: reduce/reduce conflicts: 0 found, 42 expected
 input.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
 ]])
@@ -2806,7 +3132,7 @@
 
 AT_BISON_CHECK([[input.y]], [[0]], [[]],
 [[input.y:14.1-15.5: warning: duplicate directive: '%file-prefix' [-Wother]
-input.y:13.1-18:       previous declaration
+input.y:13.1-18: note: previous declaration
 input.y: warning: %expect-rr applies only to GLR parsers [-Wother]
 input.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
 ]])
@@ -2856,16 +3182,72 @@
 [[input.y:10.8-10: error: character literals cannot be used together with api.token.raw
    10 | %token 'a'
       |        ^~~
-input.y:9.1-21:      definition of api.token.raw
+input.y:9.1-21: note: definition of api.token.raw
     9 | %define api.token.raw
       | ^~~~~~~~~~~~~~~~~~~~~
 input.y:12.6-8: error: character literals cannot be used together with api.token.raw
    12 | exp: 'b' "c" {}
       |      ^~~
-input.y:9.1-21:     definition of api.token.raw
+input.y:9.1-21: note: definition of api.token.raw
     9 | %define api.token.raw
       | ^~~~~~~~~~~~~~~~~~~~~
 ]])
 
 AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+
+
+
+## ------------------------------ ##
+## %token-table and parse.error.  ##
+## ------------------------------ ##
+
+AT_SETUP([[%token-table and parse.error]])
+
+# AT_TEST(DIRECTIVES, ERROR-LOCATION)
+# -----------------------------------
+m4_pushdef([AT_TEST],
+[AT_DATA([[input.y]],
+[[$1
+%%
+exp: %empty;
+]])
+AT_BISON_CHECK([[input.y]], [[1]], [[]],
+[$2: error: '%token-table' and '%define parse.error (custom|detailed)' cannot be used together
+])
+])
+
+AT_TEST([%define parse.error custom %token-table],  [[input.y:1.1-26]])
+AT_TEST([%define parse.error detailed %token-table],[[input.y:1.1-28]])
+
+m4_popdef([AT_TEST])
+
+AT_CLEANUP
+
+## --------------------------------------- ##
+## Invalid file prefix mapping arguments.  ##
+## --------------------------------------- ##
+
+AT_SETUP([[Invalid file prefix mapping arguments]])
+
+# AT_TEST(DIRECTIVES, OPTIONS, ERROR-LOCATION)
+# --------------------------------------------
+m4_pushdef([AT_TEST],
+[AT_DATA([[input.y]],
+[[
+%%
+exp: %empty;
+]])
+AT_BISON_CHECK([[$1 input.y]], [[1]], [[]],
+[[$3: error: invalid argument for '--file-prefix-map': $2
+]])
+])
+
+AT_TEST([-M foo], [foo], [<command line>:4])
+AT_TEST([--file-prefix-map foo], [foo], [<command line>:4])
+AT_TEST([-M foo=bar -M baz], [baz], [<command line>:6])
+AT_TEST([-M foo= -M baz], [baz], [<command line>:6])
+
+m4_popdef([AT_TEST])
+
+AT_CLEANUP
diff --git a/tests/java.at b/tests/java.at
index 2fbfe6d..b8b4dd8 100644
--- a/tests/java.at
+++ b/tests/java.at
@@ -1,6 +1,6 @@
 # Java tests for simple calculator.           -*- Autotest -*-
 
-# Copyright (C) 2007-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2007-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,19 +13,34 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[Java Calculator.]])
 
 
-# ------------------------- #
-# Java invalid directives.  #
-# ------------------------- #
+## ------------------------- ##
+## Java invalid directives.  ##
+## ------------------------- ##
 
 AT_SETUP([Java invalid directives])
 
 AT_DATA([[YYParser.y]], [
 %language "Java"
+%header
+%destructor { /* Nothing. */ } exp
+%%
+exp:
+])
+
+AT_BISON_CHECK([[-fcaret YYParser.y]], [1], [],
+[[YYParser.y: error: %header/%defines does not make sense in Java
+YYParser.y:4.13-30: error: %destructor does not make sense in Java
+    4 | %destructor { /* Nothing. */ } exp
+      |             ^~~~~~~~~~~~~~~~~~
+]])
+
+AT_DATA([[YYParser.y]], [
+%language "Java"
 %defines
 %destructor { /* Nothing. */ } exp
 %%
@@ -33,7 +48,7 @@
 ])
 
 AT_BISON_CHECK([[-fcaret YYParser.y]], [1], [],
-[[YYParser.y: error: %defines does not make sense in Java
+[[YYParser.y: error: %header/%defines does not make sense in Java
 YYParser.y:4.13-30: error: %destructor does not make sense in Java
     4 | %destructor { /* Nothing. */ } exp
       |             ^~~~~~~~~~~~~~~~~~
@@ -42,326 +57,58 @@
 AT_CLEANUP
 
 
-# ------------------------- #
-# Helping Autotest macros.  #
-# ------------------------- #
+## ------------------------- ##
+## Helping Autotest macros.  ##
+## ------------------------- ##
 
 
-# _AT_DATA_JAVA_CALC_Y($1, $2, $3, [BISON-DIRECTIVES])
-# ----------------------------------------------------
-# Produce 'calc.y'.  Don't call this macro directly, because it contains
-# some occurrences of '$1' etc. which will be interpreted by m4.  So
-# you should call it with $1, $2, and $3 as arguments, which is what
-# AT_DATA_JAVA_CALC_Y does.
-m4_define([_AT_DATA_JAVA_CALC_Y],
-[m4_if([$1$2$3], $[1]$[2]$[3], [],
-       [m4_fatal([$0: Invalid arguments: $@])])dnl
-AT_BISON_OPTION_PUSHDEFS([%language "Java" $4])
-AT_DATA_GRAMMAR([Calc.y],
-[[/* Infix notation calculator--calc */
-%language "Java"
-%define api.prefix {Calc}
-%define api.parser.class {Calc}
-%define public
+# AT_JAVA_POSITION_DEFINE_OLD
+# -----------------------
+m4_define([AT_JAVA_POSITION_DEFINE_OLD],
+[[class Position {
+  public int line;
+  public int token;
 
-]$4[
-
-%code imports {
-  import java.io.StreamTokenizer;
-  import java.io.InputStream;
-  import java.io.InputStreamReader;
-  import java.io.Reader;
-  import java.io.IOException;
-}
-
-/* Bison Declarations */
-%token <Integer> NUM "number"
-%type  <Integer> exp
-
-%nonassoc '='       /* comparison            */
-%left '-' '+'
-%left '*' '/'
-%precedence NEG     /* negation--unary minus */
-%right '^'          /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line
-;
-
-line:
-  '\n'
-| exp '\n'
-| error '\n'
-;
-
-exp:
-  NUM                { $$ = $1;                                             }
-| exp '=' exp
+  public Position ()
   {
-    if ($1.intValue () != $3.intValue ())
-      yyerror (]AT_LOCATION_IF([[@$,]])[ "calc: error: " + $1 + " != " + $3);
+    line = 0;
+    token = 0;
   }
-| exp '+' exp        { $$ = new Integer ($1.intValue () + $3.intValue ());  }
-| exp '-' exp        { $$ = new Integer ($1.intValue () - $3.intValue ());  }
-| exp '*' exp        { $$ = new Integer ($1.intValue () * $3.intValue ());  }
-| exp '/' exp        { $$ = new Integer ($1.intValue () / $3.intValue ());  }
-| '-' exp  %prec NEG { $$ = new Integer (-$2.intValue ());                  }
-| exp '^' exp        { $$ = new Integer ((int)
-                                         Math.pow ($1.intValue (),
-                                                   $3.intValue ()));        }
-| '(' exp ')'        { $$ = $2;                                             }
-| '(' error ')'      { $$ = new Integer (1111);                             }
-| '!'                { $$ = new Integer (0); return YYERROR;                }
-| '-' error          { $$ = new Integer (0); return YYERROR;                }
-;
 
-]AT_LEXPARAM_IF([[
-%code lexer {
-]],
-[[
-%%
-class CalcLexer implements Calc.Lexer {
-]])[
-  StreamTokenizer st;
-
-  public ]AT_LEXPARAM_IF([[YYLexer]], [[CalcLexer]])[ (InputStream is)
+  public Position (int l, int t)
   {
-    st = new StreamTokenizer (new InputStreamReader (is));
-    st.resetSyntax ();
-    st.eolIsSignificant (true);
-    st.whitespaceChars ('\t', '\t');
-    st.whitespaceChars (' ', ' ');
-    st.wordChars ('0', '9');
+    line = l;
+    token = t;
   }
 
-]AT_LOCATION_IF([[
-  Position yypos = new Position (1, 0);
-
-  public Position getStartPos() {
-    return yypos;
-  }
-
-  public Position getEndPos() {
-    return yypos;
-  }
-]])[
-  ]AT_YYERROR_DEFINE[
-
-  Integer yylval;
-
-  public Object getLVal() {
-    return yylval;
-  }
-
-  public int yylex () throws IOException {
-    int ttype = st.nextToken ();]AT_LOCATION_IF([[
-    yypos = new Position (yypos.lineno (), yypos.token () + 1);]])[
-    if (ttype == st.TT_EOF)
-      return EOF;
-
-    else if (ttype == st.TT_EOL)
-      {]AT_LOCATION_IF([[
-        yypos = new Position (yypos.lineno () + 1, 0);]])[
-        return (int) '\n';
-      }
-
-    else if (ttype == st.TT_WORD)
-      {
-        yylval = new Integer (st.sval);
-        return NUM;
-      }
-
-    else
-      return st.ttype;
-  }
-]AT_LEXPARAM_IF([[
-};
-%%]], [[
-}]])[
-]AT_JAVA_POSITION_DEFINE[
-]])
-
-AT_BISON_OPTION_POPDEFS
-])# _AT_DATA_JAVA_CALC_Y
-
-
-# AT_DATA_CALC_Y([BISON-OPTIONS])
-# -------------------------------
-# Produce 'calc.y'.
-m4_define([AT_DATA_JAVA_CALC_Y],
-[_AT_DATA_JAVA_CALC_Y($[1], $[2], $[3], [$1])
-])
-
-
-# _AT_CHECK_JAVA_CALC_ERROR(BISON-OPTIONS, INPUT,
-#                           [VERBOSE-AND-LOCATED-ERROR-MESSAGE])
-# --------------------------------------------------------------
-# Run 'calc' on INPUT, and expect a 'syntax error' message.
-#
-# If INPUT starts with a slash, it is used as absolute input file name,
-# otherwise as contents.
-#
-# The VERBOSE-AND-LOCATED-ERROR-MESSAGE is stripped of locations
-# and expected tokens if necessary, and compared with the output.
-m4_define([_AT_CHECK_JAVA_CALC_ERROR],
-[m4_bmatch([$2], [^/],
-           [AT_JAVA_PARSER_CHECK([Calc < $2], 0, [], [stderr])],
-           [AT_DATA([[input]],
-[[$2
-]])
-AT_JAVA_PARSER_CHECK([Calc < input], 0, [], [stderr])])
-
-# Normalize the observed and expected error messages, depending upon the
-# options.
-# 1. Create the reference error message.
-AT_DATA([[expout]],
-[$3
-])
-# 2. If locations are not used, remove them.
-AT_YYERROR_SEES_LOC_IF([],
-[[sed 's/^[-0-9.]*: //' expout >at-expout
-mv at-expout expout]])
-# 3. If error-verbose is not used, strip the', unexpected....' part.
-m4_bmatch([$1], [%define parse.error verbose], [],
-[[sed 's/syntax error, .*$/syntax error/' expout >at-expout
-mv at-expout expout]])
-# 4. Check
-AT_CHECK([cat stderr], 0, [expout])
-])
-
-# _AT_CHECK_JAVA_CALC([BISON-DIRECTIVES], [BISON-CODE])
-# -----------------------------------------------------
-# Start a testing chunk which compiles 'calc' grammar with
-# BISON-DIRECTIVES, and performs several tests over the parser.
-m4_define([_AT_CHECK_JAVA_CALC],
-[# We use integers to avoid dependencies upon the precision of doubles.
-AT_SETUP([Calculator $1])
-
-AT_BISON_OPTION_PUSHDEFS([$1])
-
-AT_DATA_JAVA_CALC_Y([$1
-%code {
-$2
-}])
-
-AT_BISON_CHECK([-Wno-deprecated -o Calc.java Calc.y])
-AT_JAVA_COMPILE([Calc.java])
-
-# Test the precedences.
-AT_DATA([[input]],
-[[1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-]])
-AT_JAVA_PARSER_CHECK([Calc < input], 0, [], [stderr])
-
-
-# Some syntax errors.
-_AT_CHECK_JAVA_CALC_ERROR([$1], [0 0],
-                          [1.2: syntax error, unexpected number])
-_AT_CHECK_JAVA_CALC_ERROR([$1], [1//2],
-                          [1.3: syntax error, unexpected '/', expecting number or '-' or '(' or '!'])
-_AT_CHECK_JAVA_CALC_ERROR([$1], [error],
-                          [1.1: syntax error, unexpected $undefined])
-_AT_CHECK_JAVA_CALC_ERROR([$1], [1 = 2 = 3],
-                          [1.4: syntax error, unexpected '='])
-_AT_CHECK_JAVA_CALC_ERROR([$1], [
-+1],
-                          [2.1: syntax error, unexpected '+'])
-# Exercise error messages with EOF: work on an empty file.
-_AT_CHECK_JAVA_CALC_ERROR([$1], [/dev/null],
-                          [1.1: syntax error, unexpected end of input])
-
-# Exercise the error token: without it, we die at the first error,
-# hence be sure to
-#
-# - have several errors which exercise different shift/discardings
-#   - (): nothing to pop, nothing to discard
-#   - (1 + 1 + 1 +): a lot to pop, nothing to discard
-#   - (* * *): nothing to pop, a lot to discard
-#   - (1 + 2 * *): some to pop and discard
-#
-# - test the action associated to 'error'
-#
-# - check the lookahead that triggers an error is not discarded
-#   when we enter error recovery.  Below, the lookahead causing the
-#   first error is ")", which is needed to recover from the error and
-#   produce the "0" that triggers the "0 != 1" error.
-#
-_AT_CHECK_JAVA_CALC_ERROR([$1],
-                          [() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1],
-[1.2: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.11: syntax error, unexpected ')', expecting number or '-' or '(' or '!'
-1.14: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.24: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.1-1.27: calc: error: 4444 != 1])
-
-# The same, but this time exercising explicitly triggered syntax errors.
-# POSIX says the lookahead causing the error should not be discarded.
-_AT_CHECK_JAVA_CALC_ERROR([$1], [(!) + (0 0) = 1],
-[1.7: syntax error, unexpected number
-1.1-1.10: calc: error: 2222 != 1])
-_AT_CHECK_JAVA_CALC_ERROR([$1], [(- *) + (0 0) = 1],
-[1.3: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
-1.8: syntax error, unexpected number
-1.1-1.11: calc: error: 2222 != 1])
-AT_BISON_OPTION_POPDEFS
-
-AT_CLEANUP
-])# _AT_CHECK_JAVA_CALC
-
-
-# AT_CHECK_JAVA_CALC([BISON-DIRECTIVES])
-# --------------------------------------
-# Start a testing chunk which compiles 'calc' grammar with
-# BISON-DIRECTIVES, and performs several tests over the parser.
-# Run the test with and without %define parse.error verbose.
-m4_define([AT_CHECK_JAVA_CALC],
-[_AT_CHECK_JAVA_CALC([$1], [$2])
-_AT_CHECK_JAVA_CALC([%define parse.error verbose $1], [$2])
-_AT_CHECK_JAVA_CALC([%locations $1], [$2])
-_AT_CHECK_JAVA_CALC([%define parse.error verbose %locations $1], [$2])
-])# AT_CHECK_JAVA_CALC
-
-
-# ------------------------ #
-# Simple LALR Calculator.  #
-# ------------------------ #
-
-AT_CHECK_JAVA_CALC([], [[
-  public static void main (String args[]) throws IOException
+  public boolean equals (Position l)
   {
-    CalcLexer l = new CalcLexer (System.in);
-    Calc p = new Calc (l);
-    p.parse ();
+    return l.line == line && l.token == token;
   }
-]])
 
-AT_CHECK_JAVA_CALC([%lex-param { InputStream is } ], [[
-  public static void main (String args[]) throws IOException
+  public String toString ()
   {
-    new Calc (System.in).parse ();
+    return Integer.toString (line) + "." + Integer.toString (token);
   }
-]])
+
+  public int lineno ()
+  {
+    return line;
+  }
+
+  public int token ()
+  {
+    return token;
+  }
+}]])
 
 
 
-# -----------------#
-# Java Directives. #
-# -----------------#
+
+
+## ----------------- ##
+## Java Parameters.  ##
+## ----------------- ##
 
 AT_BANNER([Java Parameters.])
 
@@ -414,7 +161,7 @@
     System.err.println (loc + ": " + s);
   }
 
-  public int yylex ()$2
+  public int yylex()$2
   {
     $3
   }
@@ -432,9 +179,9 @@
 ])])
 
 
-# ------------------------------------- #
-# Java parser class and package names.  #
-# ------------------------------------- #
+## ------------------------------------- ##
+## Java parser class and package names.  ##
+## ------------------------------------- ##
 
 AT_SETUP([Java parser class and package names])
 
@@ -453,15 +200,19 @@
 AT_CHECK_JAVA_MINIMAL([[%define api.parser.class {ParserClassName}]])
 AT_CHECK_JAVA_GREP([[class ParserClassName]])
 
+AT_CHECK_JAVA_MINIMAL([[%define api.package {user_java_package}]])
+AT_CHECK_JAVA_GREP([[package user_java_package;]])
+
+# Backward compatibility.
 AT_CHECK_JAVA_MINIMAL([[%define package {user_java_package}]])
 AT_CHECK_JAVA_GREP([[package user_java_package;]])
 
 AT_CLEANUP
 
 
-# ----------------------------- #
-# Java parser class modifiers.  #
-# ----------------------------- #
+## ----------------------------- ##
+## Java parser class modifiers.  ##
+## ----------------------------- ##
 
 AT_SETUP([Java parser class modifiers])
 
@@ -514,6 +265,12 @@
 %define strictfp]])
 AT_CHECK_JAVA_GREP([[public final strictfp class YYParser]])
 
+AT_CHECK_JAVA_MINIMAL([[
+%define api.parser.public
+%define api.parser.final
+%define api.parser.strictfp]])
+AT_CHECK_JAVA_GREP([[public final strictfp class YYParser]])
+
 # FIXME: Can't do a Java compile because javacomp.sh is configured for 1.3
 AT_CHECK_JAVA_MINIMAL([[
 %define annotations {/*@Deprecated @SuppressWarnings("unchecked") @SuppressWarnings({"unchecked", "deprecation"}) @SuppressWarnings(value={"unchecked", "deprecation"})*/}
@@ -523,9 +280,9 @@
 AT_CLEANUP
 
 
-# ---------------------------------------- #
-# Java parser class extends and implements #
-# ---------------------------------------- #
+## ---------------------------------------- ##
+## Java parser class extends and implements ##
+## ---------------------------------------- ##
 
 AT_SETUP([Java parser class extends and implements])
 
@@ -543,18 +300,18 @@
 AT_CLEANUP
 
 
-# -------------------------------- #
-# Java %parse-param and %lex-param #
-# -------------------------------- #
+## -------------------------------- ##
+## Java %parse-param and %lex-param ##
+## -------------------------------- ##
 
 AT_SETUP([Java %parse-param and %lex-param])
 
 AT_CHECK_JAVA_MINIMAL([])
-AT_CHECK_JAVA_GREP([[ *public YYParser (Lexer yylexer) *]])
+AT_CHECK_JAVA_GREP([[ *public YYParser(Lexer yylexer) *]])
 
 AT_CHECK_JAVA_MINIMAL([[%parse-param {int parse_param1}]])
 AT_CHECK_JAVA_GREP([[ *protected final int parse_param1;]])
-AT_CHECK_JAVA_GREP([[ *public YYParser (Lexer yylexer, *int parse_param1) *]])
+AT_CHECK_JAVA_GREP([[ *public YYParser(Lexer yylexer, *int parse_param1) *]])
 AT_CHECK_JAVA_GREP([[ *this.parse_param1 = parse_param1;]])
 
 AT_CHECK_JAVA_MINIMAL([[
@@ -562,19 +319,19 @@
 %parse-param {long parse_param2}]])
 AT_CHECK_JAVA_GREP([[ *protected final int parse_param1;]])
 AT_CHECK_JAVA_GREP([[ *protected final long parse_param2;]])
-AT_CHECK_JAVA_GREP([[ *public YYParser (Lexer yylexer, *int parse_param1, *long parse_param2) *]])
+AT_CHECK_JAVA_GREP([[ *public YYParser(Lexer yylexer, *int parse_param1, *long parse_param2) *]])
 AT_CHECK_JAVA_GREP([[ *this.parse_param1 = parse_param1;]])
 AT_CHECK_JAVA_GREP([[ *this.parse_param2 = parse_param2;]])
 
 AT_CHECK_JAVA_MINIMAL_W_LEXER([], [], [[return EOF;]])
-AT_CHECK_JAVA_GREP([[ *public YYParser () *]])
-AT_CHECK_JAVA_GREP([[ *protected YYParser (Lexer yylexer) *]])
+AT_CHECK_JAVA_GREP([[ *public YYParser() *]])
+AT_CHECK_JAVA_GREP([[ *protected YYParser(Lexer yylexer) *]])
 
 AT_CHECK_JAVA_MINIMAL_W_LEXER([[%parse-param {int parse_param1}]],
     [], [[return EOF;]])
 AT_CHECK_JAVA_GREP([[ *protected final int parse_param1;]])
-AT_CHECK_JAVA_GREP([[ *public YYParser (int parse_param1) *]])
-AT_CHECK_JAVA_GREP([[ *protected YYParser (Lexer yylexer, *int parse_param1) *]])
+AT_CHECK_JAVA_GREP([[ *public YYParser(int parse_param1) *]])
+AT_CHECK_JAVA_GREP([[ *protected YYParser(Lexer yylexer, *int parse_param1) *]])
 AT_CHECK_JAVA_GREP([[ *this.parse_param1 = parse_param1;]], [2])
 
 AT_CHECK_JAVA_MINIMAL_W_LEXER([[
@@ -583,21 +340,21 @@
     [], [[return EOF;]])
 AT_CHECK_JAVA_GREP([[ *protected final int parse_param1;]])
 AT_CHECK_JAVA_GREP([[ *protected final long parse_param2;]])
-AT_CHECK_JAVA_GREP([[ *public YYParser (int parse_param1, *long parse_param2) *]])
-AT_CHECK_JAVA_GREP([[ *protected YYParser (Lexer yylexer, *int parse_param1, *long parse_param2) *]])
+AT_CHECK_JAVA_GREP([[ *public YYParser(int parse_param1, *long parse_param2) *]])
+AT_CHECK_JAVA_GREP([[ *protected YYParser(Lexer yylexer, *int parse_param1, *long parse_param2) *]])
 AT_CHECK_JAVA_GREP([[ *this.parse_param1 = parse_param1;]], [2])
 AT_CHECK_JAVA_GREP([[ *this.parse_param2 = parse_param2;]], [2])
 
 AT_CHECK_JAVA_MINIMAL_W_LEXER([[%lex-param {char lex_param1}]],
     [], [[return EOF;]], [[YYLexer (char lex_param1) {}]])
-AT_CHECK_JAVA_GREP([[ *public YYParser (char lex_param1) *]])
+AT_CHECK_JAVA_GREP([[ *public YYParser(char lex_param1) *]])
 AT_CHECK_JAVA_GREP([[.* = new YYLexer *(lex_param1);]])
 
 AT_CHECK_JAVA_MINIMAL_W_LEXER([[
 %lex-param {char lex_param1}
 %lex-param {short lex_param2}]],
     [], [[return EOF;]], [[YYLexer (char lex_param1, short lex_param2) {}]])
-AT_CHECK_JAVA_GREP([[ *public YYParser (char lex_param1, *short lex_param2) *]])
+AT_CHECK_JAVA_GREP([[ *public YYParser(char lex_param1, *short lex_param2) *]])
 AT_CHECK_JAVA_GREP([[.* = new YYLexer *(lex_param1, *lex_param2);]])
 
 AT_CHECK_JAVA_MINIMAL_W_LEXER([[
@@ -608,18 +365,18 @@
     [], [[return EOF;]], [[YYLexer (char lex_param1, short lex_param2) {}]])
 AT_CHECK_JAVA_GREP([[ *protected final int parse_param1;]])
 AT_CHECK_JAVA_GREP([[ *protected final long parse_param2;]])
-AT_CHECK_JAVA_GREP([[ *public YYParser (char lex_param1, *short lex_param2, *int parse_param1, *long parse_param2) *]])
+AT_CHECK_JAVA_GREP([[ *public YYParser(char lex_param1, *short lex_param2, *int parse_param1, *long parse_param2) *]])
 AT_CHECK_JAVA_GREP([[.* = new YYLexer *(lex_param1, *lex_param2);]])
-AT_CHECK_JAVA_GREP([[ *protected YYParser (Lexer yylexer, *int parse_param1, *long parse_param2) *]])
+AT_CHECK_JAVA_GREP([[ *protected YYParser(Lexer yylexer, *int parse_param1, *long parse_param2) *]])
 AT_CHECK_JAVA_GREP([[ *this.parse_param1 = parse_param1;]], [2])
 AT_CHECK_JAVA_GREP([[ *this.parse_param2 = parse_param2;]], [2])
 
 AT_CLEANUP
 
 
-# ------------------------- #
-# Java throw specifications #
-# ------------------------- #
+## --------------------------- ##
+## Java throw specifications.  ##
+## --------------------------- ##
 
 AT_SETUP([Java throws specifications])
 
@@ -698,17 +455,17 @@
 [AT_JT_yylex_action],
 [],
 [AT_JT_parse_action])])
-AT_CHECK_JAVA_GREP([[ *int yylex ()]AT_JT_yylex_throws *[;]])
-AT_CHECK_JAVA_GREP([[ *private int yyaction ([^)]*)]AT_JT_yyaction_throws[ *]])
-AT_CHECK_JAVA_GREP([[ *public boolean parse ()]AT_JT_parse_throws[ *]])
+AT_CHECK_JAVA_GREP([[ *int yylex()]AT_JT_yylex_throws *[;]])
+AT_CHECK_JAVA_GREP([[ *private int yyaction([^)]*)]AT_JT_yyaction_throws[ *]])
+AT_CHECK_JAVA_GREP([[ *public boolean parse()]AT_JT_parse_throws[ *]])
 ])])])
 
 AT_CLEANUP
 
 
-# ------------------------------------- #
-# Java constructor init and init_throws #
-# ------------------------------------- #
+## --------------------------------------- ##
+## Java constructor init and init_throws.  ##
+## --------------------------------------- ##
 
 AT_SETUP([Java constructor init and init_throws])
 
@@ -733,9 +490,9 @@
 AT_CLEANUP
 
 
-# ------------------------------------------ #
-# Java value, position, and location types.  #
-# ------------------------------------------ #
+## ------------------------------------------ ##
+## Java value, position, and location types.  ##
+## ------------------------------------------ ##
 
 AT_SETUP([Java value, position, and location types])
 
@@ -746,8 +503,8 @@
 %define api.position.type {MyPos}
 %code { class MyPos {} }]], [[$$ = $<java.awt.Color>1;]], [[MyPos]])
 AT_CHECK([[grep 'java.awt.Color' YYParser.java]], [0], [ignore])
-AT_CHECK([[$EGREP -v ' */?\*' YYParser.java | grep 'Position']], [1], [ignore])
-AT_CHECK([[$EGREP -v ' */?\*' YYParser.java | grep 'Location']], [1], [ignore])
+AT_CHECK([[$EGREP -v ' */?\*' YYParser.java | grep -w 'Position']], [1], [ignore])
+AT_CHECK([[$EGREP -v ' */?\*' YYParser.java | grep -w 'Location']], [1], [ignore])
 
 AT_CHECK_JAVA_MINIMAL_W_LEXER([[
 %define api.value.type {java.awt.Color}
@@ -758,15 +515,15 @@
 [[$$ = $<java.awt.Color>1;]],
 [[java.awt.Color]], [[MyPos]], [[MyLoc]])
 AT_CHECK([[grep 'java.awt.Color' YYParser.java]], [0], [ignore])
-AT_CHECK([[$EGREP -v ' */?\*' YYParser.java | grep 'Position']], [1], [ignore])
-AT_CHECK([[$EGREP -v ' */?\*' YYParser.java | grep 'Location']], [1], [ignore])
+AT_CHECK([[$EGREP -v ' */?\*' YYParser.java | grep -w 'Position']], [1], [ignore])
+AT_CHECK([[$EGREP -v ' */?\*' YYParser.java | grep -w 'Location']], [1], [ignore])
 
 AT_CLEANUP
 
 
-# ----------------------------------------------- #
-# Java syntax error handling without error token. #
-# ----------------------------------------------- #
+## ------------------------------------------------ ##
+## Java syntax error handling without error token.  ##
+## ------------------------------------------------ ##
 
 AT_SETUP([Java syntax error handling without error token])
 
@@ -782,23 +539,23 @@
   String Input;
   int Position;
 
-  public YYLexer (String s)
+  public YYLexer(String s)
   {
     Input    = s;
     Position = 0;
   }
 
-  public void yyerror (String s)
+  public void yyerror(String s)
   {
     System.err.println (s);
   }
 
-  public Object getLVal ()
+  public Object getLVal()
   {
     return null;
   }
 
-  public int yylex () throws IOException
+  public int yylex() throws IOException
   {
     if (Position >= Input.length ())
       return EOF;
@@ -808,10 +565,10 @@
 }
 
 %code {
-  public static void main (String args []) throws IOException
+  public static void main(String args []) throws IOException
   {
-    YYParser p = new YYParser (args [0]);
-    p.parse ();
+    YYParser p = new YYParser(args[0]);
+    p.parse();
   }
 }
 %%
diff --git a/tests/javapush.at b/tests/javapush.at
index 0271296..70915bc 100644
--- a/tests/javapush.at
+++ b/tests/javapush.at
@@ -1,6 +1,6 @@
 # Checking Java Push Parsing.                            -*- Autotest -*-
 
-# Copyright (C) 2013-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2013-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 # The Java push parser tests are intended primarily
 # to verify that the sequence of states that the parser
@@ -36,6 +36,7 @@
 [AT_CHECK_UNQUOTED([grep -c '^$2$' $1], [ignore], [m4_default([$3], [1])
 ])])
 
+
 ##################################################
 
 AT_BANNER([[Java Push Parsing Tests]])
@@ -61,7 +62,7 @@
 %%
 ]])
 
-# Define comon code across to be included in
+# Define common code across to be included in
 # class Main for the trivial parser tests.
 m4_define([AT_TRIVIAL_COMMON],[[
   static class YYerror implements YYParser.Lexer
@@ -179,28 +180,28 @@
 # Verify that the proper procedure(s) are generated for each case.
 AT_BISON_CHECK([[-Dapi.push-pull=pull -o Main.java input.y]])
 AT_CHECK_JAVA_GREP([[Main.java]],
-                   [[.*public boolean parse ().*]],
+                   [[.*public boolean parse().*]],
                    [1])
 # If BISON_USE_PUSH_FOR_PULL is set, then we have one occurrence of
 # this function, otherwise it should not be there.
 AT_CHECK_JAVA_GREP([[Main.java]],
-        [[.*public int push_parse (int yylextoken, Object yylexval).*]],
+        [[.*public int push_parse(int yylextoken, Object yylexval).*]],
         [${BISON_USE_PUSH_FOR_PULL-0}])
 
 AT_BISON_CHECK([[-Dapi.push-pull=both -o Main.java input.y]])
 AT_CHECK_JAVA_GREP([[Main.java]],
-                   [[.*public boolean parse ().*]],
+                   [[.*public boolean parse().*]],
                    [1])
 AT_CHECK_JAVA_GREP([[Main.java]],
-        [[.*public int push_parse (int yylextoken, Object yylexval).*]],
+        [[.*public int push_parse(int yylextoken, Object yylexval).*]],
         [1])
 
 AT_BISON_CHECK([[-Dapi.push-pull=push -o Main.java input.y]])
 AT_CHECK_JAVA_GREP([[Main.java]],
-                   [[.*public boolean parse ().*]],
+                   [[.*public boolean parse().*]],
                    [0])
 AT_CHECK_JAVA_GREP([[Main.java]],
-        [[.*public int push_parse (int yylextoken, Object yylexval).*]],
+        [[.*public int push_parse(int yylextoken, Object yylexval).*]],
         [1])
 
 AT_JAVA_COMPILE([[Main.java]])
@@ -234,634 +235,3 @@
         [[Initial action invoked]],
         [1])
 AT_CLEANUP
-
-# Define a single copy of the Calculator grammar.
-m4_define([AT_CALC_BODY],[
-%code imports {
-  import java.io.*;
-}
-
-%code {
-  static StringReader
-  getinput(String filename) throws IOException
-  {
-    // Yes, there are better alternatives to StringBuffer.  But we
-    // don't really care about performances here, while portability
-    // to older Java matters.
-    StringBuffer buf = new StringBuffer();
-    FileReader file = new FileReader(filename);
-    int c;
-    while (0 < (c = file.read()))
-      buf.append((char)c);
-    file.close();
-    return new StringReader(buf.toString());
-  }
-}
-
-/* Bison Declarations */
-%token <Integer> NUM "number"
-%type  <Integer> exp
-
-%nonassoc '=' /* comparison            */
-%left '-' '+'
-%left '*' '/'
-%left NEG     /* negation--unary minus */
-%right '^'    /* exponentiation        */
-
-/* Grammar follows */
-%%
-input:
-  line
-| input line
-;
-
-line:
-  '\n'
-| exp '\n'    { System.out.println("total = "+$[]1); }
-| error '\n'
-;
-
-exp:
-  NUM                { $[]$ = $[]1;}
-| exp '=' exp
-  {
-    if ($[]1.intValue() != $[]3.intValue())
-      yyerror (]AT_LOCATION_IF([[@$,]])[ "calc: error: " + $[]1 + " != " + $[]3);
-  }
-| exp '+' exp
-    { $[]$ = new Integer ($[]1.intValue () + $[]3.intValue ());  }
-| exp '-' exp
-    { $[]$ = new Integer ($[]1.intValue () - $[]3.intValue ());  }
-| exp '*' exp
-    { $[]$ = new Integer ($[]1.intValue () * $[]3.intValue ());  }
-| exp '/' exp
-    { $[]$ = new Integer ($[]1.intValue () / $[]3.intValue ());  }
-| '-' exp  %prec NEG
-    { $[]$ = new Integer (-$[]2.intValue ());                    }
-| exp '^' exp
-    { $[]$ = new Integer ((int)Math.pow ($[]1.intValue (),
-                                         $[]3.intValue ()));     }
-| '(' exp ')'        { $[]$ = $[]2;}
-| '(' error ')'      { $[]$ = new Integer (1111);}
-| '!'                { $[]$ = new Integer (0); return YYERROR;}
-| '-' error          { $[]$ = new Integer (0); return YYERROR;}
-;
-])
-
-
-
-## ------------------------------------- ##
-## Calc parser with api.push-pull both.  ##
-## ------------------------------------- ##
-
-
-# Test that the states transitioned by the push parser are the
-# same as for the pull parser.  This test is assumed to work
-# if it produces the same partial trace of stack states as is
-# produced when using pull parsing.  The output is verbose,
-# but seems essential for verifying push parsing.
-
-AT_SETUP([Calc parser with api.push-pull both])
-AT_BISON_OPTION_PUSHDEFS
-
-# Define the calculator input.
-# Warning: if you changes the input file
-# then the locations test file position numbers
-# may be incorrect and you will have
-# to modify that file as well.
-
-AT_DATA([input],
-[[1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-]])
-
-# Compose pieces to build the actual .y file.
-AT_DATA([Calc.y],
-[[/* Infix notation calculator--calc */
-%language "Java"
-
-%define api.parser.class {Calc}
-%define parse.trace
-
-%code {
-  static class UserLexer implements Calc.Lexer
-  {
-    StreamTokenizer st;
-    StringReader rdr;
-
-    public UserLexer(StringReader reader)
-    {
-      rdr = reader;
-      st = new StreamTokenizer(rdr);
-      st.resetSyntax();
-      st.eolIsSignificant(true);
-      st.whitespaceChars('\t', '\t');
-      st.whitespaceChars(' ', ' ');
-      st.wordChars('0', '9');
-    }
-
-    Integer yylval;
-
-    public Object getLVal() { return yylval; }
-
-    public void yyerror(String msg) { System.err.println(msg); }
-
-    public int yylex () throws IOException
-    {
-      switch (st.nextToken()) {
-      case StreamTokenizer.TT_EOF: return EOF;
-      case StreamTokenizer.TT_EOL: return (int) '\n';
-      case StreamTokenizer.TT_WORD:
-          yylval = new Integer (st.sval);
-          return NUM;
-      default: return st.ttype;
-      }
-    }
-  }
-}
-
-%code {
-  public static void main (String[] args)
-        throws IOException
-  {
-      StringReader reader = getinput(args[0]);
-      UserLexer lexer = new UserLexer(reader);
-      Calc calc = new Calc(lexer);
-      calc.setDebugLevel(1);
-      calc.parse();
-  }//main
-}
-
-]AT_CALC_BODY[
-
-]])
-
-# This data was captured from running a pull parser.
-AT_DATA([[expout]],[[Stack now 0
-Stack now 0 2
-Stack now 0 9
-Stack now 0 9 19
-Stack now 0 9 19 2
-Stack now 0 9 19 28
-Stack now 0 9 19 28 20
-Stack now 0 9 19 28 20 2
-Stack now 0 9 19 28 20 29
-Stack now 0 9 19 28
-Stack now 0 9
-Stack now 0 9 17
-Stack now 0 9 17 2
-Stack now 0 9 17 26
-Stack now 0 9
-Stack now 0 9 23
-Stack now 0 8
-Stack now 0 7
-Stack now 0 7 2
-Stack now 0 7 9
-Stack now 0 7 9 19
-Stack now 0 7 9 19 2
-Stack now 0 7 9 19 28
-Stack now 0 7 9 19 28 20
-Stack now 0 7 9 19 28 20 3
-Stack now 0 7 9 19 28 20 3 2
-Stack now 0 7 9 19 28 20 3 12
-Stack now 0 7 9 19 28 20 29
-Stack now 0 7 9 19 28
-Stack now 0 7 9
-Stack now 0 7 9 17
-Stack now 0 7 9 17 3
-Stack now 0 7 9 17 3 2
-Stack now 0 7 9 17 3 12
-Stack now 0 7 9 17 26
-Stack now 0 7 9
-Stack now 0 7 9 23
-Stack now 0 7 16
-Stack now 0 7
-Stack now 0 7 4
-Stack now 0 7 16
-Stack now 0 7
-Stack now 0 7 3
-Stack now 0 7 3 2
-Stack now 0 7 3 12
-Stack now 0 7 3 12 22
-Stack now 0 7 3 12 22 2
-Stack now 0 7 3 12 22 31
-Stack now 0 7 3 12
-Stack now 0 7 9
-Stack now 0 7 9 17
-Stack now 0 7 9 17 3
-Stack now 0 7 9 17 3 2
-Stack now 0 7 9 17 3 12
-Stack now 0 7 9 17 26
-Stack now 0 7 9
-Stack now 0 7 9 23
-Stack now 0 7 16
-Stack now 0 7
-Stack now 0 7 5
-Stack now 0 7 5 3
-Stack now 0 7 5 3 2
-Stack now 0 7 5 3 12
-Stack now 0 7 5 14
-Stack now 0 7 5 14 25
-Stack now 0 7 9
-Stack now 0 7 9 22
-Stack now 0 7 9 22 2
-Stack now 0 7 9 22 31
-Stack now 0 7 9
-Stack now 0 7 9 17
-Stack now 0 7 9 17 2
-Stack now 0 7 9 17 26
-Stack now 0 7 9
-Stack now 0 7 9 23
-Stack now 0 7 16
-Stack now 0 7
-Stack now 0 7 4
-Stack now 0 7 16
-Stack now 0 7
-Stack now 0 7 3
-Stack now 0 7 3 3
-Stack now 0 7 3 3 3
-Stack now 0 7 3 3 3 2
-Stack now 0 7 3 3 3 12
-Stack now 0 7 3 3 12
-Stack now 0 7 3 12
-Stack now 0 7 9
-Stack now 0 7 9 17
-Stack now 0 7 9 17 3
-Stack now 0 7 9 17 3 2
-Stack now 0 7 9 17 3 12
-Stack now 0 7 9 17 26
-Stack now 0 7 9
-Stack now 0 7 9 23
-Stack now 0 7 16
-Stack now 0 7
-Stack now 0 7 4
-Stack now 0 7 16
-Stack now 0 7
-Stack now 0 7 2
-Stack now 0 7 9
-Stack now 0 7 9 18
-Stack now 0 7 9 18 2
-Stack now 0 7 9 18 27
-Stack now 0 7 9
-Stack now 0 7 9 18
-Stack now 0 7 9 18 2
-Stack now 0 7 9 18 27
-Stack now 0 7 9
-Stack now 0 7 9 17
-Stack now 0 7 9 17 3
-Stack now 0 7 9 17 3 2
-Stack now 0 7 9 17 3 12
-Stack now 0 7 9 17 26
-Stack now 0 7 9
-Stack now 0 7 9 23
-Stack now 0 7 16
-Stack now 0 7
-Stack now 0 7 2
-Stack now 0 7 9
-Stack now 0 7 9 18
-Stack now 0 7 9 18 5
-Stack now 0 7 9 18 5 2
-Stack now 0 7 9 18 5 14
-Stack now 0 7 9 18 5 14 18
-Stack now 0 7 9 18 5 14 18 2
-Stack now 0 7 9 18 5 14 18 27
-Stack now 0 7 9 18 5 14
-Stack now 0 7 9 18 5 14 25
-Stack now 0 7 9 18 27
-Stack now 0 7 9
-Stack now 0 7 9 17
-Stack now 0 7 9 17 2
-Stack now 0 7 9 17 26
-Stack now 0 7 9
-Stack now 0 7 9 23
-Stack now 0 7 16
-Stack now 0 7
-Stack now 0 7 4
-Stack now 0 7 16
-Stack now 0 7
-Stack now 0 7 2
-Stack now 0 7 9
-Stack now 0 7 9 22
-Stack now 0 7 9 22 2
-Stack now 0 7 9 22 31
-Stack now 0 7 9 22 31 22
-Stack now 0 7 9 22 31 22 2
-Stack now 0 7 9 22 31 22 31
-Stack now 0 7 9 22 31
-Stack now 0 7 9
-Stack now 0 7 9 17
-Stack now 0 7 9 17 2
-Stack now 0 7 9 17 26
-Stack now 0 7 9
-Stack now 0 7 9 23
-Stack now 0 7 16
-Stack now 0 7
-Stack now 0 7 5
-Stack now 0 7 5 2
-Stack now 0 7 5 14
-Stack now 0 7 5 14 22
-Stack now 0 7 5 14 22 2
-Stack now 0 7 5 14 22 31
-Stack now 0 7 5 14
-Stack now 0 7 5 14 25
-Stack now 0 7 9
-Stack now 0 7 9 22
-Stack now 0 7 9 22 2
-Stack now 0 7 9 22 31
-Stack now 0 7 9
-Stack now 0 7 9 17
-Stack now 0 7 9 17 2
-Stack now 0 7 9 17 26
-Stack now 0 7 9
-Stack now 0 7 9 23
-Stack now 0 7 16
-Stack now 0 7
-Stack now 0 7 15
-]])
-
-AT_BISON_CHECK([PUSHPULLFLAG [-o Calc.java Calc.y]])
-
-AT_JAVA_COMPILE([[Calc.java]])
-# Verify that this is a push parser.
-AT_CHECK_JAVA_GREP([[Calc.java]],
-                   [[.*public void push_parse_initialize().*]])
-# Capture stderr output for comparison purposes.
-AT_JAVA_PARSER_CHECK([Calc input], 0, [ignore-nolog], [stderr-nolog])
-# Extract the "Stack Now" lines from the error output,
-# send them to stdout (via the sed command) and compare to expout.
-# NOTE: because the target is "expout", this macro automatically
-# compares the output of the sed command with the contents of
-# the file "expout" (defined above).
-AT_CHECK([[sed -e '/^Stack now.*$/p' -e d ./stderr]],
-         [ignore], [expout], [ignore-nolog])
-AT_BISON_OPTION_POPDEFS
-AT_CLEANUP
-
-
-
-## ---------------------------------------------------------------- ##
-## Calc parser with %locations %code lexer and api.push-pull both.  ##
-## ---------------------------------------------------------------- ##
-
-
-# This test looks for location reporting by looking
-# at the lexer output with locations enabled.
-# It defines a lexer that reports location info.
-AT_SETUP([Calc parser with %locations %code lexer and api.push-pull both])
-AT_BISON_OPTION_PUSHDEFS
-
-AT_DATA([Calc.y],
-[[/* Infix notation calculator--calc.  */
-%language "Java"
-
-%define api.parser.class {Calc}
-%define parse.trace
-%lex-param { Reader rdr }
-%locations
-
-%code imports {
-  import java.io.*;
-}
-
-%code lexer {
-  StreamTokenizer st;
-  Integer yylval;
-
-  public YYLexer(Reader rdr)
-  {
-    st = new StreamTokenizer(rdr);
-    st.resetSyntax();
-    st.eolIsSignificant(true);
-    st.whitespaceChars('\t', '\t');
-    st.whitespaceChars(' ', ' ');
-    st.wordChars('0', '9');
-  }
-
-  Position yypos = new Position (1, 0);
-
-  public Position getStartPos() { return yypos; }
-
-  public Position getEndPos() { return yypos; }
-
-  public Object getLVal() { return yylval; }
-
-  public void yyerror(Location loc, String msg)
-  {
-    System.err.println(loc+":"+msg);
-  }
-
-  public int yylex () throws IOException
-  {
-    yypos = new Position (yypos.lineno (),yypos.token () + 1);
-    switch (st.nextToken()) {
-    case StreamTokenizer.TT_EOF:
-        return EOF;
-    case StreamTokenizer.TT_EOL:
-        yypos = new Position (yypos.lineno () + 1, 0);
-        return (int) '\n';
-    case StreamTokenizer.TT_WORD:
-        yylval = new Integer (st.sval);
-        return NUM;
-    default:
-      return st.ttype;
-    }
-  }
-}
-
-%code { ]AT_JAVA_POSITION_DEFINE[ }
-
-%code {
-  public static void main (String[] args)
-          throws IOException
-  {
-    StringReader reader = getinput(args[0]);
-    Calc calc = new Calc(reader);
-    calc.setDebugLevel(1);
-    calc.parse();
-  }
-}
-
-]AT_CALC_BODY[
-
-]])
-
-# Define the expected calculator output.
-# This should match the output from a pull parser.
-AT_DATA([output],[[total = 7
-total = -5
-total = -1
-total = 1
-total = -1
-total = -4
-total = 2
-total = 256
-total = 64
-]])
-
-AT_DATA([locations],[[Next token is token "number" (1.1: 1)
-Next token is token '+' (1.2: 1)
-Next token is token "number" (1.3: 2)
-Next token is token '*' (1.4: 2)
-Next token is token "number" (1.5: 3)
-Next token is token '=' (1.6: 3)
-Next token is token '=' (1.6: 3)
-Next token is token '=' (1.6: 3)
-Next token is token "number" (1.7: 7)
-Next token is token '\n' (2.0: 7)
-Next token is token '\n' (2.0: 7)
-Next token is token "number" (2.1: 1)
-Next token is token '+' (2.2: 1)
-Next token is token "number" (2.3: 2)
-Next token is token '*' (2.4: 2)
-Next token is token '-' (2.5: 2)
-Next token is token "number" (2.6: 3)
-Next token is token '=' (2.7: 3)
-Next token is token '=' (2.7: 3)
-Next token is token '=' (2.7: 3)
-Next token is token '=' (2.7: 3)
-Next token is token '-' (2.8: 3)
-Next token is token "number" (2.9: 5)
-Next token is token '\n' (3.0: 5)
-Next token is token '\n' (3.0: 5)
-Next token is token '\n' (3.0: 5)
-Next token is token '\n' (4.0: 5)
-Next token is token '-' (4.1: 5)
-Next token is token "number" (4.2: 1)
-Next token is token '^' (4.3: 1)
-Next token is token "number" (4.4: 2)
-Next token is token '=' (4.5: 2)
-Next token is token '=' (4.5: 2)
-Next token is token '=' (4.5: 2)
-Next token is token '-' (4.6: 2)
-Next token is token "number" (4.7: 1)
-Next token is token '\n' (5.0: 1)
-Next token is token '\n' (5.0: 1)
-Next token is token '\n' (5.0: 1)
-Next token is token '(' (5.1: 1)
-Next token is token '-' (5.2: 1)
-Next token is token "number" (5.3: 1)
-Next token is token ')' (5.4: 1)
-Next token is token ')' (5.4: 1)
-Next token is token '^' (5.5: 1)
-Next token is token "number" (5.6: 2)
-Next token is token '=' (5.7: 2)
-Next token is token '=' (5.7: 2)
-Next token is token "number" (5.8: 1)
-Next token is token '\n' (6.0: 1)
-Next token is token '\n' (6.0: 1)
-Next token is token '\n' (7.0: 1)
-Next token is token '-' (7.1: 1)
-Next token is token '-' (7.2: 1)
-Next token is token '-' (7.3: 1)
-Next token is token "number" (7.4: 1)
-Next token is token '=' (7.5: 1)
-Next token is token '=' (7.5: 1)
-Next token is token '=' (7.5: 1)
-Next token is token '=' (7.5: 1)
-Next token is token '-' (7.6: 1)
-Next token is token "number" (7.7: 1)
-Next token is token '\n' (8.0: 1)
-Next token is token '\n' (8.0: 1)
-Next token is token '\n' (8.0: 1)
-Next token is token '\n' (9.0: 1)
-Next token is token "number" (9.1: 1)
-Next token is token '-' (9.2: 1)
-Next token is token "number" (9.3: 2)
-Next token is token '-' (9.4: 2)
-Next token is token '-' (9.4: 2)
-Next token is token "number" (9.5: 3)
-Next token is token '=' (9.6: 3)
-Next token is token '=' (9.6: 3)
-Next token is token '-' (9.7: 3)
-Next token is token "number" (9.8: 4)
-Next token is token '\n' (10.0: 4)
-Next token is token '\n' (10.0: 4)
-Next token is token '\n' (10.0: 4)
-Next token is token "number" (10.1: 1)
-Next token is token '-' (10.2: 1)
-Next token is token '(' (10.3: 1)
-Next token is token "number" (10.4: 2)
-Next token is token '-' (10.5: 2)
-Next token is token "number" (10.6: 3)
-Next token is token ')' (10.7: 3)
-Next token is token ')' (10.7: 3)
-Next token is token '=' (10.8: 3)
-Next token is token '=' (10.8: 3)
-Next token is token "number" (10.9: 2)
-Next token is token '\n' (11.0: 2)
-Next token is token '\n' (11.0: 2)
-Next token is token '\n' (12.0: 2)
-Next token is token "number" (12.1: 2)
-Next token is token '^' (12.2: 2)
-Next token is token "number" (12.3: 2)
-Next token is token '^' (12.4: 2)
-Next token is token "number" (12.5: 3)
-Next token is token '=' (12.6: 3)
-Next token is token '=' (12.6: 3)
-Next token is token '=' (12.6: 3)
-Next token is token "number" (12.7: 256)
-Next token is token '\n' (13.0: 256)
-Next token is token '\n' (13.0: 256)
-Next token is token '(' (13.1: 256)
-Next token is token "number" (13.2: 2)
-Next token is token '^' (13.3: 2)
-Next token is token "number" (13.4: 2)
-Next token is token ')' (13.5: 2)
-Next token is token ')' (13.5: 2)
-Next token is token '^' (13.6: 2)
-Next token is token "number" (13.7: 3)
-Next token is token '=' (13.8: 3)
-Next token is token '=' (13.8: 3)
-Next token is token "number" (13.9: 64)
-Next token is token '\n' (14.0: 64)
-Next token is token '\n' (14.0: 64)
-Next token is token $end (14.1: 64)
-]])
-
-# Define the calculator input.
-# Warning: if you changes the input file
-# then the locations test file position numbers
-# may be incorrect and you will have
-# to modify that file as well.
-
-AT_DATA([input],
-[[1 + 2 * 3 = 7
-1 + 2 * -3 = -5
-
--1^2 = -1
-(-1)^2 = 1
-
----1 = -1
-
-1 - 2 - 3 = -4
-1 - (2 - 3) = 2
-
-2^2^3 = 256
-(2^2)^3 = 64
-]])
-
-AT_BISON_CHECK([PUSHPULLFLAG [-o Calc.java Calc.y]])
-AT_JAVA_COMPILE([[Calc.java]])
-# Verify that this is a push parser
-AT_CHECK_JAVA_GREP([[Calc.java]],
-                   [[.*public void push_parse_initialize().*]])
-# Capture the  stdout and stderr output for comparison purposes.
-AT_JAVA_PARSER_CHECK([Calc input], 0, [stdout-nolog], [stderr-nolog])
-# 1. Check that the token locations are correct
-AT_CHECK([[cp -f ./locations ./expout]],[ignore],[ignore-nolog],[ignore-nolog])
-AT_CHECK([[sed -e '/^Next token.*$/p' -e d ./stderr]],[ignore],[expout],[ignore-nolog])
-# 2. Check that the calculator output matches that of a pull parser
-AT_CHECK([[rm -f ./expout; cp -f ./output ./expout]],[ignore],[ignore-nolog],[ignore-nolog])
-AT_CHECK([[cat ./stdout]],[ignore],[expout],[ignore-nolog])
-AT_CLEANUP
diff --git a/tests/linear b/tests/linear
index fb5512b..18a4f90 100755
--- a/tests/linear
+++ b/tests/linear
@@ -3,6 +3,23 @@
 # Build a grammar whose LALR(1) parser has a given number of states.
 # Useful to test edge cases (e.g., 256 and 257 states, etc.).
 
+# Copyright (C) 2020-2021 Free Software Foundation, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+#
+# Written by Akim Demaille.
+
 class Linear
   def initialize(states)
     @states = states - 4
diff --git a/tests/local.at b/tests/local.at
index 152c462..3ba67a5 100644
--- a/tests/local.at
+++ b/tests/local.at
@@ -2,7 +2,7 @@
 
 # Macros for the GNU Bison Test suite.
 
-# Copyright (C) 2003-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2003-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -15,7 +15,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 m4_version_prereq([2.58])
 
@@ -30,6 +30,18 @@
          [$3])])
 
 
+# m4_rpatsubst(STRING, PATTERN, REPLACEMENT)
+# ------------------------------------------
+# As long as PATTERN matches STRING, replace occurrences of PATTERN by
+# REPLACEMENT.
+#
+# Contrary to m4_bpatsubst, matches PATTERN from previous replacements.
+m4_define([m4_rpatsubst],
+[m4_if(m4_bregexp([$1], [$2]),
+       [-1], [$1],
+       [m4_rpatsubst(m4_quote(m4_bpatsubst([$1], [$2], [$3])), [$2], [$3])])])
+
+
 # AT_SETUP_STRIP(TITLE)
 # ---------------------
 # Abbreviate the TITLE to be passed to AT_SETUP.  Remove new-lines
@@ -53,7 +65,7 @@
 #
 # FIXME: AT_DATA or some variant of AT_DATA may eventually permit
 # the final newline to be omitted.  See the threads starting at
-# <http://lists.gnu.org/archive/html/bison-patches/2009-07/msg00019.html>.
+# <https://lists.gnu.org/r/bison-patches/2009-07/msg00019.html>.
 m4_define([AT_DATA_NO_FINAL_EOL],
 [AT_DATA([$1], [$2
 ])
@@ -71,6 +83,16 @@
 ## ------------- ##
 
 
+# AT_DIFF_U_CHECK(DIFF-ARGS, EXPECTED-DIFF)
+# -----------------------------------------
+# If diff -u works as we expect, use it, with headers stripped.
+m4_define([AT_DIFF_U_CHECK],
+[if $DIFF_U_WORKS; then
+  AT_CHECK([diff -u $1 | sed -n '/^@@/,$p' | sed 's/^ $//'], [0], [$2])
+fi
+])
+
+
 # AT_PERL_CHECK(PERL-ARGS, ...)
 # -----------------------------
 # If Perl is available, run this test.
@@ -135,6 +157,15 @@
 m4_define([AT_RESTORE_SPECIAL_FILES], [at_restore_special_files])
 
 
+# AT_FOR_EACH_SKEL(BODY)
+# ----------------------
+m4_define([AT_FOR_EACH_SKEL],
+[m4_foreach([b4_skel],
+        [[yacc.c], [glr.c], [lalr1.cc], [glr.cc], [glr2.cc], [lalr1.d], [lalr1.java]],
+        [$1])
+])
+
+
 
 ## ------------------------------- ##
 ## Macros decoding Bison options.  ##
@@ -188,16 +219,25 @@
        [m4_fatal([$0: invalid arguments: $@])])dnl
 m4_pushdef([AT_AUTOMOVE_IF],
 [m4_bmatch([$3], [%define api\.value\.automove], [$1], [$2])])
-m4_pushdef([AT_DEFINES_IF],
-[m4_bmatch([$3], [%defines], [$1], [$2])])
+m4_pushdef([AT_HEADER_IF],
+[m4_bmatch([$3], [%defines\|%header], [$1], [$2])])
 m4_pushdef([AT_DEBUG_IF],
-[m4_bmatch([$3], [%debug\|%define parse.trace], [$1], [$2])])
+           [m4_bmatch([$3], [%debug\|%define parse.trace], [$1], [$2])])
+m4_pushdef([AT_ERROR_CUSTOM_IF],
+           [m4_bmatch([$3], [%define parse\.error custom], [$1], [$2])])
+m4_pushdef([AT_ERROR_DETAILED_IF],
+           [m4_bmatch([$3], [%define parse\.error detailed], [$1], [$2])])
+m4_pushdef([AT_ERROR_VERBOSE_IF],
+           [m4_bmatch([$3], [%define parse\.error verbose], [$1], [$2])])
+m4_pushdef([AT_ERROR_SIMPLE_IF],
+           [AT_ERROR_CUSTOM_IF([$2], [AT_ERROR_DETAILED_IF([$2], [AT_ERROR_VERBOSE_IF([$2], [$1])], [$1])], [$1])])
+
 m4_pushdef([AT_CXX_IF],
-[m4_bmatch([$3], [%language "[Cc]\+\+"\|%skeleton "[a-z0-9]+\.cc"], [$1], [$2])])
+           [m4_bmatch([$3], [%language "[Cc]\+\+"\|%skeleton "[a-z0-9]+\.cc"], [$1], [$2])])
 m4_pushdef([AT_D_IF],
-[m4_bmatch([$3], [%language "[Dd]"\|%skeleton "[a-z0-9]+\.d"], [$1], [$2])])
+           [m4_bmatch([$3], [%language "[Dd]"\|%skeleton "[a-z0-9]+\.d"], [$1], [$2])])
 m4_pushdef([AT_JAVA_IF],
-[m4_bmatch([$3], [%language "[Jj][Aa][Vv][Aa]"\|%skeleton "[a-z0-9]+\.java"], [$1], [$2])])
+           [m4_bmatch([$3], [%language "[Jj][Aa][Vv][Aa]"\|%skeleton "[a-z0-9]+\.java"], [$1], [$2])])
 # The target language: "c", "c++", or "java".
 m4_pushdef([AT_LANG],
 [AT_JAVA_IF([java],
@@ -206,15 +246,22 @@
                                 [c])])])])
 m4_pushdef([AT_C_IF],
 [m4_if(AT_LANG, [c], [$1], [$2])])
+
 m4_pushdef([AT_GLR_IF],
-[m4_bmatch([$3], [%glr-parser\|%skeleton "glr\..*"], [$1], [$2])])
+           [m4_bmatch([$3], [%glr-parser\|%skeleton "glr.*"], [$1], [$2])])
 m4_pushdef([AT_LALR1_CC_IF],
-[AT_CXX_IF([AT_GLR_IF([$2], [$1])], [$2])])
+           [AT_CXX_IF([AT_GLR_IF([$2], [$1])], [$2])])
 m4_pushdef([AT_GLR_CC_IF],
-[AT_CXX_IF([AT_GLR_IF([$1], [$2])], [$2])])
+           [AT_CXX_IF([AT_GLR_IF([$1], [$2])], [$2])])
+m4_pushdef([AT_GLR2_CC_IF],
+           [m4_bmatch([$3], [%skeleton "glr2\.cc"], [$1], [$2])])
 # Using yacc.c?
-m4_pushdef([AT_YACC_IF],
+m4_pushdef([AT_YACC_C_IF],
 [m4_bmatch([$3], [%language\|%glr-parser\|%skeleton], [$2], [$1])])
+
+
+m4_pushdef([AT_LAC_IF],
+[m4_bmatch([$3], [%define parse.lac full], [$1], [$2])])
 m4_pushdef([AT_LEXPARAM_IF],
 [m4_bmatch([$3], [%lex-param], [$1], [$2])])
 m4_pushdef([AT_LOCATION_IF],
@@ -224,14 +271,28 @@
 # sure we can use a user type).
 m4_pushdef([AT_LOCATION_TYPE_SPAN_IF],
 [m4_bmatch([$3], [%define \(api\.location\.type\|location_type\) \{Span\}], [$1], [$2])])
+m4_pushdef([AT_MULTISTART_IF],
+[m4_bmatch([$3], [%start [_a-zA-Z]+ [_a-zA-Z]+], [$1], [$2])])
 m4_pushdef([AT_PARAM_IF],
 [m4_bmatch([$3], [%parse-param], [$1], [$2])])
+m4_pushdef([AT_YACC_IF],
+[m4_bmatch([$3], [%yacc], [$1], [$2])])
+
 # Comma-terminated list of formals parse-parameters.
 # E.g., %parse-param { int x } %parse-param {int y} -> "int x, int y, ".
-# FIXME: Support grouped parse-param.
-m4_pushdef([AT_PARSE_PARAMS])
-m4_bpatsubst([$3], [%parse-param { *\([^{}]*[^{} ]\) *}],
-             [m4_append([AT_PARSE_PARAMS], [\1, ])])
+m4_bpatsubst([$3], [%parse-param { *\([^{}]*[^{} ]\) *}{ *\([^{}]*[^{} ]\) *}{ *\([^{}]*[^{} ]\) *}],
+             [m4_append([AT_PARSE_PARAMS], [\1, \2, \3], [, ])])
+m4_bpatsubst([$3], [%parse-param { *\([^{}]*[^{} ]\) *}{ *\([^{}]*[^{} ]\) *}\([^{].*\)?$],
+             [m4_append([AT_PARSE_PARAMS], [\1, \2], [, ])])
+m4_rpatsubst([$3], [%parse-param { *\([^{}]*[^{} ]\) *}\([^{}].*\)?$],
+             [m4_append([AT_PARSE_PARAMS], [\1], [, ])\2])
+m4_ifndef([AT_PARSE_PARAMS],
+          [m4_define([AT_PARSE_PARAMS])])
+
+m4_pushdef([AT_PARSER_CLASS],
+[m4_bmatch([$3], [%define  *api\.parser\.class {\([^\}]*\)}],
+           [m4_bregexp([$3], [%define  *api\.parser\.class {\([^\}]*\)}], [\1])],
+           [AT_JAVA_IF([AT_API_PREFIX[]Parser], [parser])])])
 
 m4_pushdef([AT_PURE_IF],
 [m4_bmatch([$3], [%define  *api\.pure\|%pure-parser],
@@ -239,6 +300,11 @@
            [$2])])
 m4_pushdef([AT_PUSH_IF],
 [m4_bmatch([$3], [%define api.push-pull \(both\|pull\)], [$1], [$2])])
+# Whether we use %define api.value.type union
+m4_pushdef([AT_VALUE_UNION_IF],
+[m4_bmatch([$3], [%define api\.value\.type union], [$1], [$2])])
+
+
 # AT_NAME_PREFIX.
 m4_pushdef([AT_NAME_PREFIX],
 [m4_bmatch([$3], [\(%define api\.prefix\|%name-prefix\) .*],
@@ -260,8 +326,12 @@
            [m4_bregexp([$3], [%define api\.token\.prefix {\(.*\)}], [\1])])])
 m4_pushdef([AT_TOKEN_RAW_IF],
 [m4_bmatch([$3], [%define api\.token\.raw], [$1], [$2])])
+m4_pushdef([AT_UNION_IF],
+[m4_bmatch([$3], [%define api\.value\.type union], [$1], [$2])])
 m4_pushdef([AT_VARIANT_IF],
 [m4_bmatch([$3], [%define api\.value\.type variant], [$1], [$2])])
+m4_pushdef([AT_UNION_IF],
+[m4_bmatch([$3], [%define api\.value\.type union], [$1], [$2])])
 m4_pushdef([AT_API_prefix],
 [m4_bmatch([$3], [%define api\.prefix {.*}],
            [m4_bregexp([$3], [%define api\.prefix {\([^\}]*\)}], [\1])],
@@ -287,7 +357,7 @@
 # When the parser is pure, yyerror sees the location if it is received as an
 # argument.
 m4_pushdef([AT_YYERROR_SEES_LOC_IF],
-[AT_LOCATION_IF([AT_YACC_IF([AT_PURE_IF([AT_YYERROR_ARG_LOC_IF([$1], [$2])],
+[AT_LOCATION_IF([AT_YACC_C_IF([AT_PURE_IF([AT_YYERROR_ARG_LOC_IF([$1], [$2])],
                                         [$1])],
                             [$1])],
                 [$2])])
@@ -298,18 +368,27 @@
 [AT_PURE_IF([$1],
             [AT_CXX_IF([$1], [$2])])])
 
+# Whether token translation is supported.
+m4_pushdef([AT_TOKEN_TRANSLATE_IF],
+[AT_ERROR_CUSTOM_IF([$1], [AT_ERROR_DETAILED_IF([$1], [$2])])])
+
+m4_pushdef([AT_TOKEN],
+           [AT_CXX_IF([AT_CXX_IF([AT_NAMESPACE::AT_PARSER_CLASS::token::])[]AT_TOKEN_PREFIX[$1]],
+                      [AT_TOKEN_PREFIX[$1]])])
+
+
 m4_pushdef([AT_YYSTYPE],
-[AT_CXX_IF([AT_NAMESPACE[::parser::semantic_type]],
+[AT_CXX_IF([AT_NAMESPACE[::]AT_PARSER_CLASS[::value_type]],
                [AT_API_PREFIX[STYPE]])])
 m4_pushdef([AT_YYLTYPE],
-[AT_CXX_IF([AT_NAMESPACE[::parser::location_type]],
+[AT_CXX_IF([AT_NAMESPACE[::]AT_PARSER_CLASS[::location_type]],
                [AT_API_PREFIX[LTYPE]])])
 
 AT_TOKEN_CTOR_IF(
 [m4_pushdef([AT_LOC], [[(]AT_NAME_PREFIX[lloc)]])
  m4_pushdef([AT_VAL], [[(]AT_NAME_PREFIX[lval)]])
  m4_pushdef([AT_YYLEX_FORMALS],     [])
- m4_pushdef([AT_YYLEX_RETURN],      [yy::parser::symbol_type])
+ m4_pushdef([AT_YYLEX_RETURN],      [AT_NAMESPACE::AT_PARSER_CLASS::symbol_type])
  m4_pushdef([AT_YYLEX_ARGS],        [])
  m4_pushdef([AT_USE_LEX_ARGS],      [])
  m4_pushdef([AT_YYLEX_PRE_FORMALS], [])
@@ -348,6 +427,9 @@
 
 
 AT_GLR_IF([AT_KEYWORDS([glr])])
+AT_MULTISTART_IF([AT_KEYWORDS([multistart])])
+AT_PUSH_IF([AT_KEYWORDS([push])])
+AT_YACC_IF([AT_KEYWORDS([yacc])])
 ])# _AT_BISON_OPTION_PUSHDEFS
 
 
@@ -366,12 +448,15 @@
 m4_popdef([AT_YYSTYPE])
 m4_popdef([AT_VAL])
 m4_popdef([AT_LOC])
+m4_popdef([AT_TOKEN])
+m4_popdef([AT_TOKEN_TRANSLATE_IF])
 m4_popdef([AT_PURE_LEX_IF])
 m4_popdef([AT_YYERROR_SEES_LOC_IF])
 m4_popdef([AT_YYERROR_ARG_LOC_IF])
 m4_popdef([AT_API_PREFIX])
 m4_popdef([AT_API_prefix])
 m4_popdef([AT_VARIANT_IF])
+m4_popdef([AT_UNION_IF])
 m4_popdef([AT_TOKEN_RAW_IF])
 m4_popdef([AT_TOKEN_PREFIX])
 m4_popdef([AT_TOKEN_CTOR_IF])
@@ -379,21 +464,32 @@
 m4_popdef([AT_NAME_PREFIX])
 m4_popdef([AT_LOCATION_TYPE_SPAN_IF])
 m4_popdef([AT_LOCATION_IF])
-m4_popdef([AT_PARSE_PARAMS])
+m4_undefine([AT_PARSE_PARAMS])
+m4_popdef([AT_VALUE_UNION_IF])
 m4_popdef([AT_PUSH_IF])
 m4_popdef([AT_PURE_IF])
-m4_popdef([AT_PARAM_IF])
-m4_popdef([AT_LEXPARAM_IF])
+m4_popdef([AT_PARSER_CLASS])
 m4_popdef([AT_YACC_IF])
+m4_popdef([AT_PARAM_IF])
+m4_popdef([AT_MULTISTART_IF])
+m4_popdef([AT_LEXPARAM_IF])
+m4_popdef([AT_LAC_IF])
+m4_popdef([AT_YACC_C_IF])
 m4_popdef([AT_GLR_IF])
 m4_popdef([AT_CXX_IF])
 m4_popdef([AT_C_IF])
 m4_popdef([AT_LANG])
 m4_popdef([AT_JAVA_IF])
+m4_popdef([AT_GLR2_CC_IF])
 m4_popdef([AT_GLR_CC_IF])
 m4_popdef([AT_LALR1_CC_IF])
-m4_popdef([AT_DEFINES_IF])
+m4_popdef([AT_ERROR_SIMPLE_IF])
+m4_popdef([AT_ERROR_VERBOSE_IF])
+m4_popdef([AT_ERROR_DETAILED_IF])
+m4_popdef([AT_ERROR_CUSTOM_IF])
 m4_popdef([AT_DEBUG_IF])
+m4_popdef([AT_HEADER_IF])
+m4_popdef([AT_AUTOMOVE_IF])
 AT_LOC_POPDEF])dnl
 ])# AT_BISON_OPTION_POPDEFS
 
@@ -409,6 +505,12 @@
 [m4_case(AT_LANG, $@)])
 
 
+# AT_LANG_MATCH(LANG1, IF-LANG1, LANG2, IF-LANG2, ..., DEFAULT)
+# ------------------------------------------------------------
+m4_define([AT_LANG_MATCH],
+[m4_bmatch(AT_LANG, $@)])
+
+
 # _AT_LANG_DISPATCH(LANG, MACRO, ARGS)
 # ------------------------------------
 # Call the specialization of MACRO for LANG with ARGS.  Complain if
@@ -445,7 +547,7 @@
 # The prologue that should be included in any grammar whose parser is
 # meant to be compiled.
 m4_define([AT_DATA_GRAMMAR_PROLOGUE],
-[[%code top {
+[[%code top { /* -*- ]AT_LANG[ -*- */
 ]AT_DATA_SOURCE_PROLOGUE[]dnl
 [}
 ]])
@@ -474,7 +576,7 @@
 # AT_YYLEX_DEFINE([INPUT], [ACTION])
 # ----------------------------------
 # INPUT can be empty, or in double quotes, or a list (in braces).
-# ACTION may compute yylval for instance, using "res" as token type,
+# ACTION may compute yylval for instance, using "res" as token kind,
 # and "toknum" as the number of calls to yylex (starting at 0).
 m4_define([AT_YYLEX_PROTOTYPE],
 [AT_YYLEX_RETURN AT_NAME_PREFIX[]lex (]AT_YYLEX_FORMALS[)[]dnl
@@ -500,11 +602,11 @@
 # AT_YYERROR_DEFINE
 # -------------------------
 # Must be called inside a AT_BISON_OPTION_PUSHDEFS/POPDEFS pair.
-m4_define([AT_YYERROR_FORMALS],  [AT_LANG_DISPATCH([$0], $@)])
-m4_define([AT_YYERROR_PROTOTYPE],[AT_LANG_DISPATCH([$0], $@)])
+m4_define([AT_YYERROR_FORMALS],        [AT_LANG_DISPATCH([$0], $@)])
+m4_define([AT_YYERROR_PROTOTYPE],      [AT_LANG_DISPATCH([$0], $@)])
 m4_define([AT_YYERROR_DECLARE_EXTERN], [AT_LANG_DISPATCH([$0], $@)])
-m4_define([AT_YYERROR_DECLARE],  [AT_LANG_DISPATCH([$0], $@)])
-m4_define([AT_YYERROR_DEFINE],   [AT_LANG_DISPATCH([$0], $@)])
+m4_define([AT_YYERROR_DECLARE],        [AT_LANG_DISPATCH([$0], $@)])
+m4_define([AT_YYERROR_DEFINE],         [AT_LANG_DISPATCH([$0], $@)])
 
 # AT_MAIN_DEFINE
 # --------------
@@ -525,31 +627,23 @@
 $2])
 ])
 
-m4_define([AT_YYERROR_FORMALS(c)],
-[AT_YYERROR_ARG_LOC_IF([AT_YYLTYPE const * const llocp, ])AT_PARSE_PARAMS[const char *msg]])
-
-m4_define([AT_YYERROR_PROTOTYPE(c)],
-[[void ]AT_NAME_PREFIX[error (]AT_YYERROR_FORMALS[)]])
-
-m4_define([AT_YYERROR_DECLARE_EXTERN(c)],
-[AT_YYERROR_PROTOTYPE;])
-
-m4_define([AT_YYERROR_DECLARE(c)],
-[#include <stdio.h>
-]AT_LOCATION_IF([[
+# AT_LOCATION_PRINT_DECLARE
+# -------------------------
+m4_define([AT_LOCATION_PRINT_DECLARE],
+[AT_LOCATION_IF([[
 #if defined ]AT_YYLTYPE[_IS_TRIVIAL && ]AT_YYLTYPE[_IS_TRIVIAL
 static int location_print (FILE *yyo, ]AT_YYLTYPE[ const * const yylocp);
 # ifndef LOCATION_PRINT
 #  define LOCATION_PRINT(File, Loc) location_print (File, &(Loc))
 # endif
 #endif
-]])[
-static AT_YYERROR_DECLARE_EXTERN])
+]])dnl
+])
 
-
-m4_define([AT_YYERROR_DEFINE(c)],
-[[
-]AT_LOCATION_IF([[
+# AT_LOCATION_PRINT_DEFINE
+# ------------------------
+m4_define([AT_LOCATION_PRINT_DEFINE],
+[AT_LOCATION_IF([[
 # if defined ]AT_YYLTYPE[_IS_TRIVIAL && ]AT_YYLTYPE[_IS_TRIVIAL
 /* Print *YYLOCP on YYO. */
 __attribute__((__unused__))
@@ -578,18 +672,79 @@
   return res;
 }
 #endif
+]])])
+
+
+m4_define([AT_YYERROR_FORMALS(c)],
+[AT_YYERROR_ARG_LOC_IF([AT_YYLTYPE const * const llocp, ])AT_PARAM_IF([AT_PARSE_PARAMS, ])[const char *msg]])
+
+m4_define([AT_YYERROR_PROTOTYPE(c)],
+[[void ]AT_NAME_PREFIX[error (]AT_YYERROR_FORMALS[)]])
+
+m4_define([AT_YYERROR_DECLARE_EXTERN(c)],
+[AT_YYERROR_PROTOTYPE;])
+
+m4_define([AT_YYERROR_DECLARE(c)],
+[[#include <stdio.h>
+]AT_LOCATION_PRINT_DECLARE[
+/* !POSIX */ static ]AT_YYERROR_DECLARE_EXTERN[]dnl
+])
+
+# "%define parse.error custom" uses a different format, easy to check.
+# The "verbose" one can be computed from it (see _AT_CHECK_CALC_ERROR).
+m4_define([AT_YYERROR_DEFINE(c)],
+[AT_LOCATION_PRINT_DEFINE[
+
+]AT_ERROR_CUSTOM_IF([[
+int
+yyreport_syntax_error (const yypcontext_t *ctx]AT_PARAM_IF([, AT_PARSE_PARAMS])[)
+{
+  int res = 0;]AT_PARAM_IF([m4_bpatsubst(m4_defn([AT_PARSE_PARAMS]),
+              [[^,]+[^A-Za-z_0-9]\([A-Za-z_][A-Za-z_0-9]*\),* *], [
+  YY_USE (\1);])])[]m4_bmatch(m4_defn([AT_PARSE_PARAMS]), [nerrs], [[
+  ++global_nerrs;
+  ++*nerrs;]])[]AT_LOCATION_IF([[
+  LOCATION_PRINT (stderr, *yypcontext_location (ctx));
+  fprintf (stderr, ": ");]])[
+  fprintf (stderr, "syntax error");
+  {
+    yysymbol_kind_t la = yypcontext_token (ctx);
+    if (la != YYSYMBOL_YYEMPTY)
+      fprintf (stderr, " on token [%s]", yysymbol_name (la));
+  }
+  {
+    enum { TOKENMAX = 10 };
+    yysymbol_kind_t expected[TOKENMAX];
+    int n = yypcontext_expected_tokens (ctx, expected, TOKENMAX);
+    /* Forward errors to yyparse.  */
+    if (n <= 0)
+      res = n;
+    else
+      {
+        fprintf (stderr, " (expected:");
+        for (int i = 0; i < n; ++i)
+          fprintf (stderr, " [%s]", yysymbol_name (expected[i]));
+        fprintf (stderr, ")");
+      }
+  }
+  fprintf (stderr, "\n");
+  return res;
+}
 ]])[
+
 /* A C error reporting function.  */
-static
+/* !POSIX */ static
 ]AT_YYERROR_PROTOTYPE[
 {]m4_bpatsubst(m4_defn([AT_PARSE_PARAMS]),
-              [[^,]+[^A-Za-z_0-9]\([A-Za-z_][A-Za-z_0-9]*\), *], [
-  YYUSE(\1);])dnl
+              [[^,]+[^A-Za-z_0-9]\([A-Za-z_][A-Za-z_0-9]*\),* *], [
+  YY_USE (\1);])dnl
 AT_YYERROR_SEES_LOC_IF([[
   LOCATION_PRINT (stderr, ]AT_LOC[);
   fprintf (stderr, ": ");]])[
-  fprintf (stderr, "%s\n", msg);
-}]])
+  fprintf (stderr, "%s\n", msg);]m4_bmatch(m4_defn([AT_PARSE_PARAMS]), [nerrs], [[
+  ++global_nerrs;
+  ++*nerrs;]])[
+}]])])
 
 
 m4_define([AT_YYLEX_DEFINE(c)],
@@ -653,14 +808,41 @@
 m4_define([AT_YYERROR_DEFINE(c++)],
 [[/* A C++ error reporting function.  */
 void
-]AT_NAMESPACE[::parser::error (]AT_LOCATION_IF([[const location_type& l, ]])[const std::string& m)
-{
+]AT_NAMESPACE[::]AT_PARSER_CLASS[::error (]AT_LOCATION_IF([[const location_type& l, ]])[const std::string& m)
+{]m4_bmatch(m4_defn([AT_PARSE_PARAMS]), [nerrs], [[
+  ++global_nerrs;
+  ++*nerrs;]])[
   std::cerr << ]AT_LOCATION_IF([l << ": " << ])[m << '\n';
-}]])
+}]AT_ERROR_CUSTOM_IF([[
+void
+]AT_NAMESPACE[::]AT_PARSER_CLASS[::report_syntax_error (const context& ctx) const
+{]AT_PARAM_IF([m4_bpatsubst(m4_defn([AT_PARSE_PARAMS]),
+              [[^,]+[^A-Za-z_0-9]\([A-Za-z_][A-Za-z_0-9]*\),* *], [
+  YY_USE (\1);])])[]m4_bmatch(m4_defn([AT_PARSE_PARAMS]), [nerrs], [[
+  ++global_nerrs;
+  ++*nerrs;]])[]AT_LOCATION_IF([[
+  std::cerr << ctx.location () << ": ";]])[
+  std::cerr << "syntax error";
+  if (!ctx.lookahead ().empty ())
+    std::cerr << " on token [" << ctx.lookahead ().name () << ']';
+  {
+    enum { TOKENMAX = 10 };
+    symbol_kind_type expected[TOKENMAX];
+    int n = ctx.expected_tokens (expected, TOKENMAX);
+    if (0 < n)
+      {
+        std::cerr << " (expected:";
+        for (int i = 0; i < n; ++i)
+          std::cerr << " [" << symbol_name (expected[i]) << ']';
+        std::cerr << ')';
+      }
+  }
+  std::cerr << '\n';
+}]])])
 
 
-# AT_YYERROR_DEFINE(c++)([INPUT], [ACTION])
-# -----------------------------------------
+# AT_YYLEX_DEFINE(c++)([INPUT], [ACTION])
+# ---------------------------------------
 # Same as in C.
 m4_copy([AT_YYLEX_DEFINE(c)], [AT_YYLEX_DEFINE(c++)])
 
@@ -671,7 +853,7 @@
 int
 main (int argc, char const* argv[])
 {
-  ]AT_NAMESPACE[::parser p;]AT_DEBUG_IF([[
+  ]AT_NAMESPACE[::]AT_PARSER_CLASS[ p;]AT_DEBUG_IF([[
   int debug = !!getenv ("YYDEBUG");
   for (int i = 1; i < argc; ++i)
     if (!strcmp (argv[i], "-p")
@@ -696,7 +878,8 @@
               ${CXX11_CXXFLAGS:+"$CXX11_CXXFLAGS"} \
               ${CXX14_CXXFLAGS:+"$CXX14_CXXFLAGS"} \
               ${CXX17_CXXFLAGS:+"$CXX17_CXXFLAGS"} \
-              ${CXX2A_CXXFLAGS:+"$CXX2A_CXXFLAGS"}
+              ${CXX20_CXXFLAGS:+"$CXX20_CXXFLAGS"} \
+              ${CXX2B_CXXFLAGS:+"$CXX2B_CXXFLAGS"}
 do
   ]AS_ECHO(["======== Testing with C++ standard flags: '$at_cxx_std'"])[
   CXXFLAGS="$at_for_each_std_CXXFLAGS_save $at_std"
@@ -722,11 +905,75 @@
 
 m4_define([AT_YYERROR_DEFINE(d)],
 [[/* An error reporting function.  */
-public void yyerror (]AT_LOCATION_IF([[YYLocation l, ]])[string m)
+public void yyerror (]AT_LOCATION_IF([[const YYLocation l, ]])[string m)
 {
   stderr.writeln (]AT_LOCATION_IF([[l, ": ", ]])[m);
-}]])
+}
+]AT_ERROR_CUSTOM_IF([[
+// In the case of D, there are no single quotes around the symbols
+// so they need to be added here
+public string transformToken(]AT_API_PREFIX[Parser.SymbolKind token)
+{
+  string res;
+  foreach (i; format("%s", token))
+  {
+    if (i == '\"')
+      res ~= '\'';
+    else
+      res ~= i;
+  }
+  if (res.length == 1)
+    return '\'' ~ res ~ '\'';
+  else
+    return res;
+}
 
+public void reportSyntaxError(]AT_API_PREFIX[Parser.Context ctx)
+{
+  // Buffer and print the message at the end, to avoid being intertwined
+  // with debug traces from getExpectedTokens.
+  string msg;
+  msg ~=]AT_LOCATION_IF([[ ctx.getLocation().toString() ~ ": " ~]])[ "syntax error";
+  {
+    ]AT_API_PREFIX[Parser.SymbolKind token = ctx.getToken();
+    msg ~= " on token @<:@" ~ transformToken(token) ~ "@:>@";
+  }
+  {
+    immutable int argmax = 7;
+    ]AT_API_PREFIX[Parser.SymbolKind[] arg = new ]AT_API_PREFIX[Parser.SymbolKind[argmax];
+    int n = ctx.getExpectedTokens(arg, argmax);
+    if (0 < n)
+    {
+      msg ~= " (expected:";
+      for (int i = 0; i < n; ++i)
+        msg ~= " @<:@" ~ transformToken(arg[i]) ~ "@:>@";
+      msg ~= ")";
+    }
+  }
+  stderr.writeln(msg);
+}
+]])[]])
+
+
+# FIXME: this does not work.  It is a stub copied blindly from Java.
+m4_define([AT_YYLEX_DEFINE(d)],
+[[
+  /*--------.
+  | yylex.  |
+  `--------*/
+
+  public string input = ]$1[;
+  public int index = 0;
+  public int yylex() {
+    if (index < input.length())
+      return input.charAt(index++);
+    else
+      return 0;
+  }
+  public Object getLVal() {
+    ]m4_ifval([$2], [$2], [return null])[;
+  }
+]])
 
 m4_define([AT_MAIN_DEFINE(d)],
 [[int main ()
@@ -747,61 +994,140 @@
 # ------------------------------
 m4_copy([AT_DATA], [AT_DATA_GRAMMAR(java)])
 
+# No need to declare, it's part of the class interface.
+m4_define([AT_YYERROR_DECLARE(java)],        [])
+m4_define([AT_YYERROR_DECLARE_EXTERN(java)], [])
 
 # AT_JAVA_POSITION_DEFINE
 # -----------------------
 m4_define([AT_JAVA_POSITION_DEFINE],
 [[class Position {
-  public int line;
-  public int token;
+  public int line = 1;
+  public int column = 1;
 
   public Position ()
   {
-    line = 0;
-    token = 0;
+    line = 1;
+    column = 1;
   }
 
   public Position (int l, int t)
   {
     line = l;
-    token = t;
+    column = t;
+  }
+
+  public Position (Position p)
+  {
+    line = p.line;
+    column = p.column;
+  }
+
+  public void set (Position p)
+  {
+    line = p.line;
+    column = p.column;
   }
 
   public boolean equals (Position l)
   {
-    return l.line == line && l.token == token;
+    return l.line == line && l.column == column;
   }
 
   public String toString ()
   {
-    return Integer.toString (line) + "." + Integer.toString(token);
+    return Integer.toString (line) + "." + Integer.toString (column);
   }
 
-  public int lineno ()
+  public int line ()
   {
     return line;
   }
 
-  public int token ()
+  public int column ()
   {
-    return token;
+    return column;
+  }
+}
+
+class PositionReader extends BufferedReader {
+
+  private Position position = new Position ();
+  private Position previousPosition = new Position ();
+
+  public PositionReader (Reader reader) {
+    super (reader);
+  }
+
+  public int read () throws IOException {
+    int res = super.read ();
+    previousPosition.set (position);
+    if (res > -1) {
+      char c = (char)res;
+      if (c == '\r' || c == '\n') {
+        position.line += 1;
+        position.column = 1;
+      } else {
+        position.column += 1;
+      }
+    }
+    return res;
+  }
+
+  public Position getPosition () {
+    return position;
+  }
+
+  public Position getPreviousPosition () {
+    return previousPosition;
   }
 }]])
 
 
+# AT_YYERROR_DEFINE(java)
+# -----------------------
+# FIXME: We should not hard-code "Calc".
 m4_define([AT_YYERROR_DEFINE(java)],
 [AT_LOCATION_IF([[public void yyerror (Calc.Location l, String m)
-{
-  if (l == null)
-    System.err.println (m);
-  else
-    System.err.println (l + ": " + m);
+  {]m4_bmatch(m4_defn([AT_PARSE_PARAMS]), [nerrs], [[
+    ++global_nerrs;
+    ++*nerrs;]])[
+    if (l == null)
+      System.err.println(m);
+    else
+      System.err.println(l + ": " + m);
   }
 ]], [[
   public void yyerror (String m)
-  {
+  {]m4_bmatch(m4_defn([AT_PARSE_PARAMS]), [nerrs], [[
+    ++global_nerrs;
+    ++*nerrs;]])[
     System.err.println (m);
   }
+]])[
+
+]AT_ERROR_CUSTOM_IF([[
+  public void reportSyntaxError(Calc.Context ctx) {
+    // Buffer and print the message at the end, to avoid being intertwined
+    // with debug traces from getExpectedTokens.
+    String msg = ]AT_LOCATION_IF([[ctx.getLocation() + ": " + ]])["syntax error";
+    {
+      Calc.SymbolKind token = ctx.getToken();
+      if (token != null)
+        msg += " on token @<:@" + token.getName() + "@:>@";
+    }
+    {
+      Calc.SymbolKind[] arg = new Calc.SymbolKind[ctx.NTOKENS];
+      int n = ctx.getExpectedTokens(arg, ctx.NTOKENS);
+      if (0 < n) {
+        msg += " (expected:";
+        for (int i = 0; i < n; ++i)
+          msg += " @<:@" + arg[i].getName() + "@:>@";
+        msg += ")";
+      }
+    }
+    System.err.println(msg);
+  }
 ]])
 ])
 
@@ -811,34 +1137,35 @@
   | yylex.  |
   `--------*/
 
-  public String input = "]$1[";
+  public String input = ]$1[;
   public int index = 0;
-  public int yylex ()
-  {
-    if (index < input.length ())
-      return input.charAt (index++);
+  public int yylex() {
+    if (index < input.length())
+      return input.charAt(index++);
     else
       return 0;
   }
-  public Object getLVal ()
-  {
-    ]$2[;
+  public Object getLVal() {
+    ]m4_ifval([$2], [$2], [return null])[;
   }
 ]])
 
 m4_define([AT_MAIN_DEFINE(java)],
 [[class input
 {
-  public static void main (String args[]) throws IOException
-  {
-    ]AT_API_prefix[Parser p = new ]AT_API_prefix[Parser ();
-    System.exit (p.parse () ? 0 : 1);
+  public static void main(String[] args) throws IOException {
+    ]AT_API_prefix[Parser p = new ]AT_API_prefix[Parser();
+    boolean success = p.parse();
+    if (!success)
+      System.exit(1);
   }
 }]])
 
 m4_define([AT_LANG_FOR_EACH_STD(java)],
 [$1])
 
+
+
 ## --------------- ##
 ## Running Bison.  ##
 ## --------------- ##
@@ -894,7 +1221,7 @@
 # added after the grammar file name, so skip these checks in that
 # case.
 if test "$POSIXLY_CORRECT_IS_EXPORTED" = false; then
-          ]AT_SAVE_SPECIAL_FILES[
+  ]AT_SAVE_SPECIAL_FILES[
 
   # To avoid expanding it repeatedly, store specified stdout.
   ]AT_DATA([expout], [$3])[
@@ -961,11 +1288,16 @@
   [cp xml-tests/test.output expout]
   AT_CHECK([[$XSLTPROC \
              `]]AT_SET_ENV[[ bison --print-datadir`/xslt/xml2text.xsl \
-             xml-tests/test.xml]], [[0]], [expout])
+             xml-tests/test.xml]], [[0]], [stdout])
+  # xml2text and xml2dot always use '•', while --report uses '•' or '.'
+  # depending on the locale, and the test suite is run with the plain
+  # C locale.
+  AT_CHECK([[sed -e 's/•/./g' stdout]], [], [expout])
   [sort xml-tests/test.gv > expout]
   AT_CHECK([[$XSLTPROC \
              `]]AT_SET_ENV[[ bison --print-datadir`/xslt/xml2dot.xsl \
-             xml-tests/test.xml | sort]], [[0]], [expout])
+             xml-tests/test.xml | sort | sed -e 's/•/./g']],
+           [[0]], [stdout])
   [rm -rf xml-tests expout]
   AT_RESTORE_SPECIAL_FILES
 [fi]])
@@ -974,7 +1306,7 @@
 # AT_SET_ENV_IF(EXIT-STATUS)
 # --------------------------
 # Put this before a Bison invocation to set the environment to:
-# - define COLUMNS to make the test suite independant of the user's
+# - define COLUMNS to make the test suite independent of the user's
 #   environment;
 # - keep Valgrind from complaining about reachable memory (when
 #   EXIT-STATUS is not 0).
@@ -986,7 +1318,7 @@
 # The testsuite verbose output, at least, will be incorrect, but nothing may
 # fail to make sure you notice.
 m4_define([AT_SET_ENV_IF],
-[[[COLUMNS=1000; export COLUMNS;]] m4_null_if($1, [], [[[VALGRIND_OPTS="$VALGRIND_OPTS --leak-check=summary --show-reachable=no"; export VALGRIND_OPTS; ]]])])
+[[[COLUMNS=1000; export COLUMNS; NO_TERM_HYPERLINKS=1; export NO_TERM_HYPERLINKS;]] m4_null_if($1, [], [[[VALGRIND_OPTS="$VALGRIND_OPTS --leak-check=summary --show-reachable=no"; export VALGRIND_OPTS; ]]])])
 
 
 # AT_SET_ENV
@@ -1026,11 +1358,19 @@
 # If OUTPUT does not contain '.', assume that we are linking too,
 # otherwise pass "-c"; this is a hack.  The default SOURCES is OUTPUT
 # with trailing ".o" removed, and ".cc" appended.
+#
+# glr2.cc require C++11.
 m4_define([AT_COMPILE_CXX],
-[AT_KEYWORDS(c++)
+[AT_KEYWORDS([c++])
 AT_SKIP_IF([[! $BISON_CXX_WORKS]])
+m4_ifdef([AT_GLR2_CC_IF],
+  [AT_GLR2_CC_IF([AT_SKIP_IF([[test x"$CXX11_CXXFLAGS" == x]])])])
 AT_CHECK(m4_join([ ],
-                 [$CXX $CXXFLAGS $CPPFLAGS $3],
+                 [$CXX],
+                 [$CPPFLAGS],
+                 [m4_ifdef([AT_GLR2_CC_IF], [AT_GLR2_CC_IF([$CXX11_CXXFLAGS])])],
+                 [$CXXFLAGS],
+                 [$3],
                  [m4_bmatch([$1], [[.]], [-c], [$LDFLAGS])],
                  [-o $1],
                  [m4_default([$2], [m4_bpatsubst([$1], [\.o$]).cc])],
@@ -1107,8 +1447,8 @@
 
 
 # AT_FULL_COMPILE(OUTPUT, [OTHER1], [OTHER2],
-#                 [$4: EXTRA-COMPILER-FLAGS, [$5: EXTRA-BISON-FLAGS])
-# -------------------------------------------------------------------
+#                 [$4: EXTRA-COMPILER-FLAGS], [$5: EXTRA-BISON-FLAGS])
+# --------------------------------------------------------------------
 # Compile OUTPUT.y to OUTPUT.c, OUTPUT.cc, or OUTPUT.java, and then
 # compile it to OUTPUT or OUTPUT.class.  If OTHER is specified, compile
 # OUTPUT-OTHER.c, OUTPUT-OTHER.cc, or OUTPUT-OTHER.java to OUTPUT or
@@ -1176,7 +1516,8 @@
     [11], [201103],
     [14], [201402],
     [17], [201703],
-    [2a], [201709],
+    [20], [202002],
+    [2b], [202100],
     [m4_fatal([$0: invalid arguments: $@])])[
   return 1;
 #else
@@ -1292,7 +1633,7 @@
 #
 # If TEST-SPEC contains the attribute no-xml, then invoke bison using
 # AT_BISON_CHECK_NO_XML.  Otherwise, invoke bison using AT_BISON_CHECK.
-# On the bison command-line, specify `--report=all --defines'.  Check
+# On the bison command-line, specify `--report=all --header'.  Check
 # that Bison exits with value 0, has no stdout, and has stderr
 # BISON-STDERR.
 #
@@ -1386,7 +1727,7 @@
 
 m4_if(m4_index(m4_quote($3), [no-xml]), -1,
       [AT_BISON_CHECK],
-      [AT_BISON_CHECK_NO_XML])([[-Wall --report=all --defines -o input.c input.y]],
+      [AT_BISON_CHECK_NO_XML])([[-Wall --report=all,no-cex --header -o input.c input.y]],
                                [0], [], m4_dquote($7))
 
 m4_if(m4_index(m4_quote($3), [last-state]), -1,
@@ -1403,7 +1744,7 @@
 # (C90 and C++98) guarantee: 32767.  In that case, GCC's -pedantic
 # will issue an error.
 #
-# There is no "" around `wc` since some indent the result.
+# There is no "" around `wc` since some wc indent the result.
 m4_bmatch([$4], [%define lr.type canonical-lr],
 [if test 32767 -lt `wc -l < input.c`; then
   CFLAGS=`echo " $CFLAGS " | sed -e 's/ -pedantic / /'`
diff --git a/tests/local.mk b/tests/local.mk
index 91fd324..3efc69d 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -1,6 +1,6 @@
 ## Makefile for Bison testsuite.
 
-## Copyright (C) 2000-2015, 2018-2019 Free Software Foundation, Inc.
+## Copyright (C) 2000-2015, 2018-2021 Free Software Foundation, Inc.
 ##
 ## This program is free software: you can redistribute it and/or modify
 ## it under the terms of the GNU General Public License as published by
@@ -13,9 +13,11 @@
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+## along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
-EXTRA_DIST += %D%/linear $(TESTSUITE_AT) %D%/testsuite %D%/testsuite.h
+EXTRA_DIST +=					\
+  %D%/README.md %D%/linear			\
+  $(TESTSUITE_AT) %D%/testsuite %D%/testsuite.h
 
 DISTCLEANFILES       += %D%/atconfig $(check_SCRIPTS)
 MAINTAINERCLEANFILES += $(TESTSUITE)
@@ -36,6 +38,14 @@
 	} >$@.tmp
 	$(AM_V_at)mv $@.tmp $@
 
+
+# Update the test cases.  Consider the latest test results to be the
+# correct expectations, and change the test cases to match them.
+.PHONY: update-tests
+update-tests:
+	$(AM_V_GEN)cd $(top_srcdir) \
+	  && build-aux/update-test $(abs_builddir)/%D%/testsuite.dir/*/testsuite.log
+
 ## ------------------------- ##
 ## Generate the test suite.  ##
 ## ------------------------- ##
@@ -47,7 +57,9 @@
   %D%/c++.at                                  \
   %D%/calc.at                                 \
   %D%/conflicts.at                            \
+  %D%/counterexample.at                       \
   %D%/cxx-type.at                             \
+  %D%/d.at                                    \
   %D%/diagnostics.at                          \
   %D%/existing.at                             \
   %D%/glr-regression.at                       \
@@ -56,6 +68,7 @@
   %D%/java.at                                 \
   %D%/javapush.at                             \
   %D%/local.at                                \
+  %D%/m4.at                                   \
   %D%/named-refs.at                           \
   %D%/output.at                               \
   %D%/package.m4                              \
@@ -96,12 +109,15 @@
 
 .PHONY: recheck
 recheck: $(RUN_TESTSUITE_deps)
-	$(RUN_TESTSUITE)							\
-	  $$(perl -n								\
-	     -e 'if (/Summary of the failures/../Detailed failed tests/)'	\
-	     -e '{ /^ *[0-9]+:/ && s/:.*//s && print }' %D%/testsuite.log)
+	$(RUN_TESTSUITE)					\
+	  $$(perl -n						\
+	     -e 'eof && /^(\d+).*: FAILED/ && print "$$1 "'	\
+		%D%/testsuite.dir/*/testsuite.log)
 
-check-local: $(RUN_TESTSUITE_deps)
+check-local: check-tests
+
+.PHONY: check-tests
+check-tests: $(RUN_TESTSUITE_deps)
 	$(RUN_TESTSUITE)
 
 # Run the test suite on the *installed* tree.
@@ -121,7 +137,7 @@
 VALGRIND_OPTS = --leak-check=full --show-reachable=yes --gen-suppressions=all \
   $(VALGRIND_OPTS_SUPPRESSION)
 maintainer-check-valgrind: $(RUN_TESTSUITE_deps)
-	test 'x$(VALGRIND)' == x ||					\
+	test 'x$(VALGRIND)' = x ||					\
 	  $(RUN_TESTSUITE)						\
 	    PREBISON='$(VALGRIND) -q' PREPARSER='$(VALGRIND) -q'	\
 	    VALGRIND_OPTS="$(VALGRIND_OPTS)"
diff --git a/tests/m4.at b/tests/m4.at
new file mode 100644
index 0000000..7a4a2af
--- /dev/null
+++ b/tests/m4.at
@@ -0,0 +1,72 @@
+# Basic m4 macros.                               -*- Autotest -*-
+
+# Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+AT_BANNER([[M4 Macros.]])
+
+
+AT_SETUP([Generating Comments])
+
+AT_DATA([input.y],
+[%%
+exp:
+])
+
+AT_DATA([input.m4],
+[[m4@&t@_include(b4_skeletonsdir/[c.m4])
+
+b4_output_begin([output.txt])
+
+b4_gsub([[abcd]],
+  [a], [b])
+b4_gsub([[abcd]],
+  [a], [b],
+  [b], [c],
+  [c], [d])
+
+_b4_comment([["/* () */"]])
+_b4_comment([["/* (  */"]])
+_b4_comment([["/*  ) */"]])
+_b4_comment([["/* [] */"]])
+
+b4_comment([["/* () */"]])
+b4_comment([["/* (  */"]])
+b4_comment([["/*  ) */"]])
+b4_comment([["/* [] */"]])
+
+b4_output_end([output.txt])
+]])
+
+AT_BISON_CHECK([-S ./input.m4 input.y])
+
+AT_CHECK([cat output.txt], [],
+[[
+[bbcd]
+[dddd]
+
+"/\* () *\/"
+"/\* (  *\/"
+"/\*  ) *\/"
+"/\* [] *\/"
+
+/* "/\* () *\/"  */
+/* "/\* (  *\/"  */
+/* "/\*  ) *\/"  */
+/* "/\* [] *\/"  */
+
+]])
+
+AT_CLEANUP
diff --git a/tests/named-refs.at b/tests/named-refs.at
index e6a3656..07ce433 100644
--- a/tests/named-refs.at
+++ b/tests/named-refs.at
@@ -1,6 +1,6 @@
 # Named references test.                           -*- Autotest -*-
 
-# Copyright (C) 2009-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2009-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 # FIXME: Duplication with calc.at.
 AT_BANNER([[Named references tests.]])
@@ -255,19 +255,19 @@
 [[test.y:52.51-60: error: invalid reference: '$<ival>lo9'
    52 | | exp[x] '+' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>lo9 + $r; }
       |                                                   ^~~~~~~~~~
-test.y:52.3-68:      symbol not found in production: lo9
+test.y:52.3-68: note: symbol not found in production: lo9
    52 | | exp[x] '+' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>lo9 + $r; }
       |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 test.y:53.51-60: warning: misleading reference: '$<ival>exp' [-Wother]
    53 | | exp[x] '-' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>exp - $r; }
       |                                                   ^~~~~~~~~~
-test.y:44.1-3:       refers to: $exp at $$
+test.y:44.1-3: note: refers to: $exp at $$
    44 | exp:
       | ^~~
-test.y:53.7:         possibly meant: $x, hiding $exp at $1
+test.y:53.7: note: possibly meant: $x, hiding $exp at $1
    53 | | exp[x] '-' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>exp - $r; }
       |       ^
-test.y:53.41:        possibly meant: $r, hiding $exp at $4
+test.y:53.41: note: possibly meant: $r, hiding $exp at $4
    53 | | exp[x] '-' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>exp - $r; }
       |                                         ^
 test.y:54.51-52: error: $l of 'exp' has no declared type
@@ -276,13 +276,13 @@
 test.y:57.40-43: error: invalid reference: '$r12'
    57 | | exp[l] '^' exp[r]  { $$ = power ($l, $r12); }
       |                                        ^~~~
-test.y:57.3-47:      symbol not found in production: r12
+test.y:57.3-47: note: symbol not found in production: r12
    57 | | exp[l] '^' exp[r]  { $$ = power ($l, $r12); }
       |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 test.y:58.29-33: error: invalid reference: '$expo'
    58 | | '(' exp ')'        { $$ = $expo;           }
       |                             ^~~~~
-test.y:58.3-46:      symbol not found in production: expo
+test.y:58.3-46: note: symbol not found in production: expo
    58 | | '(' exp ')'        { $$ = $expo;           }
       |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ]])
@@ -305,8 +305,8 @@
 ]])
 AT_BISON_CHECK([-o test.c test.y], 0, [],
 [[test.y:11.22-29: warning: misleading reference: '$foo.bar' [-Wother]
-test.y:11.8-10:      refers to: $foo at $1
-test.y:11.12-18:     possibly meant: $[foo.bar] at $2
+test.y:11.8-10: note: refers to: $foo at $1
+test.y:11.12-18: note: possibly meant: $[foo.bar] at $2
 ]])
 AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
@@ -383,162 +383,162 @@
 ]])
 AT_BISON_CHECK([-o test.c test.y], 1, [],
 [[test.y:24.36-41: error: invalid reference: '$cond1'
-test.y:23.11-24.62:  symbol not found in production: cond1
+test.y:23.11-24.62: note: symbol not found in production: cond1
 test.y:26.43-53: error: invalid reference: '$stmt.field'
-test.y:25.11-26.60:  symbol not found in production: stmt
-test.y:25.35-38:     possibly meant: $then.field, hiding $stmt.field at $4
+test.y:25.11-26.60: note: symbol not found in production: stmt
+test.y:25.35-38: note: possibly meant: $then.field, hiding $stmt.field at $4
 test.y:28.43-52: error: invalid reference: '$stmt.list'
-test.y:27.11-28.59:  symbol not found in production: stmt
-test.y:27.30-38:     possibly meant: $[stmt.list] at $4
+test.y:27.11-28.59: note: symbol not found in production: stmt
+test.y:27.30-38: note: possibly meant: $[stmt.list] at $4
 test.y:30.43-46: error: ambiguous reference: '$xyz'
-test.y:29.35-37:     refers to: $xyz at $4
-test.y:29.50-52:     refers to: $xyz at $6
+test.y:29.35-37: note: refers to: $xyz at $4
+test.y:29.50-52: note: refers to: $xyz at $6
 test.y:32.43-52: error: invalid reference: '$stmt.list'
-test.y:31.11-32.63:  symbol not found in production: stmt
-test.y:31.40-43:     possibly meant: $then, hiding $[stmt.list] at $4
-test.y:31.61-64:     possibly meant: $else, hiding $[stmt.list] at $6
+test.y:31.11-32.63: note: symbol not found in production: stmt
+test.y:31.40-43: note: possibly meant: $then, hiding $[stmt.list] at $4
+test.y:31.61-64: note: possibly meant: $else, hiding $[stmt.list] at $6
 test.y:34.43-58: error: invalid reference: '$stmt.list.field'
-test.y:33.11-34.69:  symbol not found in production: stmt
-test.y:33.40-43:     possibly meant: $then.field, hiding $[stmt.list].field at $4
-test.y:33.61-64:     possibly meant: $else.field, hiding $[stmt.list].field at $6
+test.y:33.11-34.69: note: symbol not found in production: stmt
+test.y:33.40-43: note: possibly meant: $then.field, hiding $[stmt.list].field at $4
+test.y:33.61-64: note: possibly meant: $else.field, hiding $[stmt.list].field at $6
 test.y:36.43-54: error: invalid reference: '$[stmt.list]'
-test.y:35.11-36.71:  symbol not found in production: stmt.list
-test.y:35.40-43:     possibly meant: $then, hiding $[stmt.list] at $4
-test.y:35.61-64:     possibly meant: $else, hiding $[stmt.list] at $6
+test.y:35.11-36.71: note: symbol not found in production: stmt.list
+test.y:35.40-43: note: possibly meant: $then, hiding $[stmt.list] at $4
+test.y:35.61-64: note: possibly meant: $else, hiding $[stmt.list] at $6
 test.y:38.43-49: error: invalid reference: '$then.1'
-test.y:37.11-38.60:  symbol not found in production: then
-test.y:37.40-45:     possibly meant: $[then.1] at $4
+test.y:37.11-38.60: note: symbol not found in production: then
+test.y:37.40-45: note: possibly meant: $[then.1] at $4
 test.y:40.43-55: error: invalid reference: '$then.1.field'
-test.y:39.11-40.66:  symbol not found in production: then
-test.y:39.40-45:     possibly meant: $[then.1].field at $4
+test.y:39.11-40.66: note: symbol not found in production: then
+test.y:39.40-45: note: possibly meant: $[then.1].field at $4
 test.y:42.44-50: error: invalid reference: '$stmt.x'
-test.y:41.12-42.57:  symbol not found in production: stmt
-test.y:41.36-41:     possibly meant: $[stmt.x].x, hiding $stmt.x at $4
-test.y:41.36-41:     possibly meant: $[stmt.x] at $4
+test.y:41.12-42.57: note: symbol not found in production: stmt
+test.y:41.36-41: note: possibly meant: $[stmt.x].x, hiding $stmt.x at $4
+test.y:41.36-41: note: possibly meant: $[stmt.x] at $4
 test.y:44.13-22: error: invalid reference: '$if-stmt-a'
-test.y:43.12-44.59:  symbol not found in production: if
-test.y:43.1-9:       possibly meant: $[if-stmt-a] at $$
+test.y:43.12-44.59: note: symbol not found in production: if
+test.y:43.1-9: note: possibly meant: $[if-stmt-a] at $$
 test.y:46.46-54: error: invalid reference: '$then-a.f'
-test.y:45.12-46.65:  symbol not found in production: then
-test.y:45.41-46:     possibly meant: $[then-a].f at $4
+test.y:45.12-46.65: note: symbol not found in production: then
+test.y:45.41-46: note: possibly meant: $[then-a].f at $4
 ]])
 
 AT_BISON_CHECK([-fcaret -o test.c test.y], 1, [],
 [[test.y:24.36-41: error: invalid reference: '$cond1'
    24 |           { $if_stmt1 = new IfStmt($cond1, $then.f1, $else); };
       |                                    ^~~~~~
-test.y:23.11-24.62:  symbol not found in production: cond1
+test.y:23.11-24.62: note: symbol not found in production: cond1
    23 | if_stmt1: IF expr[cond] THEN stmt[then] ELSE stmt.list[else] FI
       |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 test.y:26.43-53: error: invalid reference: '$stmt.field'
    26 |           { $if_stmt2 = new IfStmt($cond, $stmt.field, 0); };
       |                                           ^~~~~~~~~~~
-test.y:25.11-26.60:  symbol not found in production: stmt
+test.y:25.11-26.60: note: symbol not found in production: stmt
    25 | if_stmt2: IF expr[cond] THEN stmt[then] FI
       |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:25.35-38:     possibly meant: $then.field, hiding $stmt.field at $4
+test.y:25.35-38: note: possibly meant: $then.field, hiding $stmt.field at $4
    25 | if_stmt2: IF expr[cond] THEN stmt[then] FI
       |                                   ^~~~
 test.y:28.43-52: error: invalid reference: '$stmt.list'
    28 |           { $if_stmt3 = new IfStmt($cond, $stmt.list, 0); };
       |                                           ^~~~~~~~~~
-test.y:27.11-28.59:  symbol not found in production: stmt
+test.y:27.11-28.59: note: symbol not found in production: stmt
    27 | if_stmt3: IF expr[cond] THEN stmt.list FI
       |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:27.30-38:     possibly meant: $[stmt.list] at $4
+test.y:27.30-38: note: possibly meant: $[stmt.list] at $4
    27 | if_stmt3: IF expr[cond] THEN stmt.list FI
       |                              ^~~~~~~~~
 test.y:30.43-46: error: ambiguous reference: '$xyz'
    30 |           { $if_stmt4 = new IfStmt($cond, $xyz, $cond); };
       |                                           ^~~~
-test.y:29.35-37:     refers to: $xyz at $4
+test.y:29.35-37: note: refers to: $xyz at $4
    29 | if_stmt4: IF expr[cond] THEN stmt[xyz] ELSE stmt[xyz] FI
       |                                   ^~~
-test.y:29.50-52:     refers to: $xyz at $6
+test.y:29.50-52: note: refers to: $xyz at $6
    29 | if_stmt4: IF expr[cond] THEN stmt[xyz] ELSE stmt[xyz] FI
       |                                                  ^~~
 test.y:32.43-52: error: invalid reference: '$stmt.list'
    32 |           { $if_stmt5 = new IfStmt($cond, $stmt.list, $else); };
       |                                           ^~~~~~~~~~
-test.y:31.11-32.63:  symbol not found in production: stmt
+test.y:31.11-32.63: note: symbol not found in production: stmt
    31 | if_stmt5: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:31.40-43:     possibly meant: $then, hiding $[stmt.list] at $4
+test.y:31.40-43: note: possibly meant: $then, hiding $[stmt.list] at $4
    31 | if_stmt5: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |                                        ^~~~
-test.y:31.61-64:     possibly meant: $else, hiding $[stmt.list] at $6
+test.y:31.61-64: note: possibly meant: $else, hiding $[stmt.list] at $6
    31 | if_stmt5: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |                                                             ^~~~
 test.y:34.43-58: error: invalid reference: '$stmt.list.field'
    34 |           { $if_stmt6 = new IfStmt($cond, $stmt.list.field, $else); };
       |                                           ^~~~~~~~~~~~~~~~
-test.y:33.11-34.69:  symbol not found in production: stmt
+test.y:33.11-34.69: note: symbol not found in production: stmt
    33 | if_stmt6: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:33.40-43:     possibly meant: $then.field, hiding $[stmt.list].field at $4
+test.y:33.40-43: note: possibly meant: $then.field, hiding $[stmt.list].field at $4
    33 | if_stmt6: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |                                        ^~~~
-test.y:33.61-64:     possibly meant: $else.field, hiding $[stmt.list].field at $6
+test.y:33.61-64: note: possibly meant: $else.field, hiding $[stmt.list].field at $6
    33 | if_stmt6: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |                                                             ^~~~
 test.y:36.43-54: error: invalid reference: '$[stmt.list]'
    36 |           { $if_stmt7 = new IfStmt($cond, $[stmt.list].field, $else); };
       |                                           ^~~~~~~~~~~~
-test.y:35.11-36.71:  symbol not found in production: stmt.list
+test.y:35.11-36.71: note: symbol not found in production: stmt.list
    35 | if_stmt7: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:35.40-43:     possibly meant: $then, hiding $[stmt.list] at $4
+test.y:35.40-43: note: possibly meant: $then, hiding $[stmt.list] at $4
    35 | if_stmt7: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |                                        ^~~~
-test.y:35.61-64:     possibly meant: $else, hiding $[stmt.list] at $6
+test.y:35.61-64: note: possibly meant: $else, hiding $[stmt.list] at $6
    35 | if_stmt7: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |                                                             ^~~~
 test.y:38.43-49: error: invalid reference: '$then.1'
    38 |           { $if_stmt8 = new IfStmt($cond, $then.1, $else); };
       |                                           ^~~~~~~
-test.y:37.11-38.60:  symbol not found in production: then
+test.y:37.11-38.60: note: symbol not found in production: then
    37 | if_stmt8: IF expr[cond] THEN stmt.list[then.1] ELSE stmt.list[else] FI
       |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:37.40-45:     possibly meant: $[then.1] at $4
+test.y:37.40-45: note: possibly meant: $[then.1] at $4
    37 | if_stmt8: IF expr[cond] THEN stmt.list[then.1] ELSE stmt.list[else] FI
       |                                        ^~~~~~
 test.y:40.43-55: error: invalid reference: '$then.1.field'
    40 |           { $if_stmt9 = new IfStmt($cond, $then.1.field, $else); };
       |                                           ^~~~~~~~~~~~~
-test.y:39.11-40.66:  symbol not found in production: then
+test.y:39.11-40.66: note: symbol not found in production: then
    39 | if_stmt9: IF expr[cond] THEN stmt.list[then.1] ELSE stmt.list[else] FI
       |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:39.40-45:     possibly meant: $[then.1].field at $4
+test.y:39.40-45: note: possibly meant: $[then.1].field at $4
    39 | if_stmt9: IF expr[cond] THEN stmt.list[then.1] ELSE stmt.list[else] FI
       |                                        ^~~~~~
 test.y:42.44-50: error: invalid reference: '$stmt.x'
    42 |           { $if_stmt10 = new IfStmt($cond, $stmt.x, 0); };
       |                                            ^~~~~~~
-test.y:41.12-42.57:  symbol not found in production: stmt
+test.y:41.12-42.57: note: symbol not found in production: stmt
    41 | if_stmt10: IF expr[cond] THEN stmt[stmt.x] FI
       |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:41.36-41:     possibly meant: $[stmt.x].x, hiding $stmt.x at $4
+test.y:41.36-41: note: possibly meant: $[stmt.x].x, hiding $stmt.x at $4
    41 | if_stmt10: IF expr[cond] THEN stmt[stmt.x] FI
       |                                    ^~~~~~
-test.y:41.36-41:     possibly meant: $[stmt.x] at $4
+test.y:41.36-41: note: possibly meant: $[stmt.x] at $4
    41 | if_stmt10: IF expr[cond] THEN stmt[stmt.x] FI
       |                                    ^~~~~~
 test.y:44.13-22: error: invalid reference: '$if-stmt-a'
    44 |           { $if-stmt-a = new IfStmt($cond, $then, $else); };
       |             ^~~~~~~~~~
-test.y:43.12-44.59:  symbol not found in production: if
+test.y:43.12-44.59: note: symbol not found in production: if
    43 | if-stmt-a: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:43.1-9:       possibly meant: $[if-stmt-a] at $$
+test.y:43.1-9: note: possibly meant: $[if-stmt-a] at $$
    43 | if-stmt-a: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       | ^~~~~~~~~
 test.y:46.46-54: error: invalid reference: '$then-a.f'
    46 |           { $[if-stmt-b] = new IfStmt($cond, $then-a.f, $else); };
       |                                              ^~~~~~~~~
-test.y:45.12-46.65:  symbol not found in production: then
+test.y:45.12-46.65: note: symbol not found in production: then
    45 | if-stmt-b: IF expr[cond] THEN if-stmt-a[then-a] ELSE stmt.list[else] FI
       |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:45.41-46:     possibly meant: $[then-a].f at $4
+test.y:45.41-46: note: possibly meant: $[then-a].f at $4
    45 | if-stmt-b: IF expr[cond] THEN if-stmt-a[then-a] ELSE stmt.list[else] FI
       |                                         ^~~~~~
 ]])
@@ -675,37 +675,37 @@
 ]])
 AT_BISON_CHECK([-o test.c test.y], 1, [],
 [[test.y:12.22-31: error: invalid reference: '$sym.field'
-test.y:12.3-35:      symbol not found in production: sym
+test.y:12.3-35: note: symbol not found in production: sym
 test.y:13.22-35: error: invalid reference: '$<aa>sym.field'
-test.y:13.3-39:      symbol not found in production: sym
+test.y:13.3-39: note: symbol not found in production: sym
 test.y:14.22-33: error: invalid reference: '$[sym.field]'
-test.y:14.3-37:      symbol not found in production: sym.field
+test.y:14.3-37: note: symbol not found in production: sym.field
 test.y:15.22-37: error: invalid reference: '$<aa>[sym.field]'
-test.y:15.3-41:      symbol not found in production: sym.field
+test.y:15.3-41: note: symbol not found in production: sym.field
 test.y:16.22-25: error: invalid reference: '$sym'
-test.y:16.3-29:      symbol not found in production: sym
+test.y:16.3-29: note: symbol not found in production: sym
 test.y:17.22-29: error: invalid reference: '$<aa>sym'
-test.y:17.3-33:      symbol not found in production: sym
+test.y:17.3-33: note: symbol not found in production: sym
 test.y:18.22-27: error: invalid reference: '$[sym]'
-test.y:18.3-65:      symbol not found in production before $3: sym
+test.y:18.3-65: note: symbol not found in production before $3: sym
 test.y:18.52-61: error: invalid reference: '$<aa>[sym]'
-test.y:18.3-65:      symbol not found in production: sym
+test.y:18.3-65: note: symbol not found in production: sym
 test.y:22.22-31: error: invalid reference: '$sym-field'
-test.y:22.3-35:      symbol not found in production: sym
+test.y:22.3-35: note: symbol not found in production: sym
 test.y:23.22-35: error: invalid reference: '$<aa>sym-field'
-test.y:23.3-39:      symbol not found in production: sym
+test.y:23.3-39: note: symbol not found in production: sym
 test.y:24.22-33: error: invalid reference: '$[sym-field]'
-test.y:24.3-37:      symbol not found in production: sym-field
+test.y:24.3-37: note: symbol not found in production: sym-field
 test.y:25.22-37: error: invalid reference: '$<aa>[sym-field]'
-test.y:25.3-41:      symbol not found in production: sym-field
+test.y:25.3-41: note: symbol not found in production: sym-field
 test.y:26.22-25: error: invalid reference: '$sym'
-test.y:26.3-29:      symbol not found in production: sym
+test.y:26.3-29: note: symbol not found in production: sym
 test.y:27.22-29: error: invalid reference: '$<aa>sym'
-test.y:27.3-33:      symbol not found in production: sym
+test.y:27.3-33: note: symbol not found in production: sym
 test.y:28.22-27: error: invalid reference: '$[sym]'
-test.y:28.3-65:      symbol not found in production before $3: sym
+test.y:28.3-65: note: symbol not found in production before $3: sym
 test.y:28.52-61: error: invalid reference: '$<aa>[sym]'
-test.y:28.3-65:      symbol not found in production: sym
+test.y:28.3-65: note: symbol not found in production: sym
 ]])
 AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
@@ -724,10 +724,10 @@
 ]])
 AT_BISON_CHECK([[test.y]], [[1]], [],
 [[test.y:4.12-18: error: invalid reference: '$.field'
-test.y:4.13:        syntax error after '$', expecting integer, letter, '_', '@<:@', or '$'
-test.y:4.3-8:       possibly meant: $[.field] at $1
+test.y:4.13: note: syntax error after '$', expecting integer, letter, '_', '@<:@', or '$'
+test.y:4.3-8: note: possibly meant: $[.field] at $1
 test.y:5.12-18: error: invalid reference: '@.field'
-test.y:5.13:        syntax error after '@', expecting integer, letter, '_', '@<:@', or '$'
+test.y:5.13: note: syntax error after '@', expecting integer, letter, '_', '@<:@', or '$'
 ]])
 AT_DATA([[test.y]],
 [[
diff --git a/tests/output.at b/tests/output.at
index c945149..e261516 100644
--- a/tests/output.at
+++ b/tests/output.at
@@ -1,6 +1,6 @@
 # Checking the output filenames.                    -*- Autotest -*-
 
-# Copyright (C) 2000-2002, 2005-2015, 2018-2019 Free Software
+# Copyright (C) 2000-2002, 2005-2015, 2018-2021 Free Software
 # Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[Output file names.]])
 
@@ -30,11 +30,14 @@
           [], [$1
 ])])
 
-# AT_CHECK_OUTPUT(INPUT-FILE, [DIRECTIVES], [FLAGS], EXPECTED-FILES, [STATUS],
-#                 [ADDITIONAL-TESTS], [PRE-TESTS])
-# -----------------------------------------------------------------------------
+# AT_CHECK_OUTPUT($1 = INPUT-FILE, $2 = [DIRECTIVES], $3 = [FLAGS],
+#                 $4 = EXPECTED-FILES, $5 = [STATUS],
+#                 $6 = [ADDITIONAL-TESTS], $7 = [PRE-TESTS])
+# -----------------------------------------------------------------
 m4_define([AT_CHECK_OUTPUT],
 [AT_SETUP([[Output files: ]$2 $3])[
+]m4_bmatch([$3], [--html],
+           [AT_SKIP_IF([[test x"$XSLTPROC" = x]])])[
 ]$7[
 for file in ]$1 $4[; do
   case $file in
@@ -73,58 +76,78 @@
                 [], [],
                 [AT_CHECK([[case "$PREBISON" in *valgrind*) exit 77;; esac]])])
 
+
+# Check how api.header.include.
 AT_CHECK_OUTPUT([foo.y], [], [-dv -o foo.c],
-                [foo.c foo.h foo.output])
+                [foo.c foo.h foo.output], [],
+                [AT_CHECK([grep '#include "foo.h"' foo.c], [0], [ignore])])
+AT_CHECK_OUTPUT([foo.y], [], [-dv -y],
+                [y.output y.tab.c y.tab.h], [],
+                [AT_CHECK([grep '#include "y.tab.h"' y.tab.c], [1], [ignore])])
+AT_CHECK_OUTPUT([foo.y], [%define api.header.include {"./foo.h"}], [-dv -y],
+                [y.output y.tab.c y.tab.h], [],
+                [AT_CHECK([grep '#include "./foo.h"' y.tab.c], [0], [ignore])])
+
+
 AT_CHECK_OUTPUT([foo.y], [], [-dv -o foo.tab.c],
                 [foo.output foo.tab.c foo.tab.h])
 
+AT_CHECK_OUTPUT([foo.y], [], [--fixed-output-files -dv -g --html],
+                [y.gv y.html y.output y.tab.c y.tab.h y.xml])
+AT_CHECK_OUTPUT([foo.y], [], [-Hfoo.header -v -gfoo.gv --html=foo.html],
+                [foo.gv foo.header foo.html foo.output foo.tab.c foo.xml])
+
 AT_CHECK_OUTPUT([foo.y], [], [-dv -g --xml --fixed-output-files],
-                [y.dot y.output y.tab.c y.tab.h y.xml])
+                [y.gv y.output y.tab.c y.tab.h y.xml])
 AT_CHECK_OUTPUT([foo.y], [], [-dv -g --xml -y],
-                [y.dot y.output y.tab.c y.tab.h y.xml])
+                [y.gv y.output y.tab.c y.tab.h y.xml])
 AT_CHECK_OUTPUT([foo.y], [%require "3.4"], [-dv -g --xml -y],
                 [y.gv y.output y.tab.c y.tab.h y.xml])
 # With '-o y.tab.c', we expect 'y.output' etc. (for compatibility with Yacc).
 AT_CHECK_OUTPUT([foo.y], [], [-dv -g --xml -o y.tab.c],
-                [y.dot y.output y.tab.c y.tab.h y.xml])
+                [y.gv y.output y.tab.c y.tab.h y.xml])
 
 AT_CHECK_OUTPUT([foo.y], [], [-dv -b bar],
                 [bar.output bar.tab.c bar.tab.h])
 AT_CHECK_OUTPUT([foo.y], [], [-dv -g -o foo.c],
-                [foo.c foo.dot foo.h foo.output])
+                [foo.c foo.gv foo.h foo.output])
 
 
-AT_CHECK_OUTPUT([foo.y], [%defines %verbose],      [],
+AT_CHECK_OUTPUT([foo.y], [%header %verbose],      [],
                 [foo.output foo.tab.c foo.tab.h])
-AT_CHECK_OUTPUT([foo.y], [%defines %verbose %yacc],[],
+AT_CHECK_OUTPUT([foo.y], [%header %verbose %yacc],[],
                 [y.output y.tab.c y.tab.h])
 
-AT_CHECK_OUTPUT([foo.yy], [%defines %verbose %yacc],[],
+AT_CHECK_OUTPUT([foo.yy], [%header %verbose %yacc],[],
                 [y.output y.tab.c y.tab.h])
 
 # Exercise %output and %file-prefix including deprecated '='
-AT_CHECK_OUTPUT([foo.y], [%file-prefix "bar" %defines %verbose],      [],
+AT_CHECK_OUTPUT([foo.y], [%file-prefix "bar" %header %verbose],      [],
                 [bar.output bar.tab.c bar.tab.h])
-AT_CHECK_OUTPUT([foo.y], [%output "bar.c" %defines %verbose %yacc],[],
+AT_CHECK_OUTPUT([foo.y], [%output "bar.c" %header %verbose %yacc],[],
                 [bar.c bar.h bar.output])
 AT_CHECK_OUTPUT([foo.y],
-                [%file-prefix "baz" %output "bar.c" %defines %verbose %yacc],
+                [%file-prefix "baz" %output "bar.c" %header %verbose %yacc],
                 [],
                 [bar.c bar.h bar.output])
 
 
 # Check priorities of extension control.
-AT_CHECK_OUTPUT([foo.yy], [%defines %verbose], [],
+AT_CHECK_OUTPUT([foo.yy], [%header %verbose], [],
                 [foo.output foo.tab.cc foo.tab.hh])
 
-AT_CHECK_OUTPUT([foo.yy], [%defines %verbose ], [-o foo.c],
+AT_CHECK_OUTPUT([foo.yy], [%header %verbose ], [-o foo.c],
                 [foo.c foo.h foo.output])
 
 AT_CHECK_OUTPUT([foo.yy], [],
-                [--defines=foo.hpp -o foo.c++],
+                [--header=foo.hpp -o foo.c++],
                 [foo.c++ foo.hpp])
 
-AT_CHECK_OUTPUT([foo.yy], [%defines "foo.hpp"],
+AT_CHECK_OUTPUT([foo.yy], [],
+                [--header=foo.hpp -o foo.c++],
+                [foo.c++ foo.hpp])
+
+AT_CHECK_OUTPUT([foo.yy], [%header "foo.hpp"],
                 [-o foo.c++],
                 [foo.c++ foo.hpp])
 
@@ -135,17 +158,25 @@
 # Do not generate code when there are early errors (even warnings as
 # errors).
 AT_CHECK_OUTPUT([foo.y], [%type <foo> useless],
-                [--defines --graph --xml --report=all -Wall -Werror],
-                [foo.dot foo.output foo.xml],
+                [--header --graph --xml --report=all -Wall -Werror],
+                [foo.gv foo.output foo.xml],
                 [1])
 
 # Do not generate code when there are late errors (even warnings as
 # errors).
 AT_CHECK_OUTPUT([foo.y], [%define useless],
-                [--defines --graph --xml --report=all -Wall -Werror],
-                [foo.dot foo.output foo.xml],
+                [--header --graph --xml --report=all -Wall -Werror],
+                [foo.gv foo.output foo.xml],
                 [1])
 
+# %header was spelled %defines before.
+AT_CHECK_OUTPUT([foo.yy], [%defines],
+                [-o foo.c++],
+                [foo.c++ foo.h++])
+AT_CHECK_OUTPUT([foo.yy], [%defines "foo.hpp"],
+                [-o foo.c++],
+                [foo.c++ foo.hpp])
+
 
 ## ------------ ##
 ## C++ output.  ##
@@ -163,48 +194,48 @@
 AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %verbose], [],
                 [foo.output foo.tab.cc])
 
-AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %defines %verbose], [],
+AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %header %verbose], [],
                 [foo.output foo.tab.cc foo.tab.hh stack.hh])
 
 AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %verbose %locations], [],
                 [foo.output foo.tab.cc])
 
-AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %defines %verbose %locations], [],
+AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %header %verbose %locations], [],
                 [foo.output foo.tab.cc foo.tab.hh location.hh position.hh stack.hh])
 
-AT_CHECK_OUTPUT([subdir/foo.yy], [%skeleton "lalr1.cc" %defines %verbose], [],
+AT_CHECK_OUTPUT([subdir/foo.yy], [%skeleton "lalr1.cc" %header %verbose], [],
                 [foo.output foo.tab.cc foo.tab.hh stack.hh],
                 [], [AT_CHECK_NO_SUBDIR_PART([foo.tab])])
 
-AT_CHECK_OUTPUT([subdir/foo.yy], [%skeleton "lalr1.cc" %defines %verbose %locations],
+AT_CHECK_OUTPUT([subdir/foo.yy], [%skeleton "lalr1.cc" %header %verbose %locations],
                 [-o subdir/foo.cc],
                 [subdir/foo.cc subdir/foo.hh subdir/foo.output subdir/location.hh subdir/position.hh subdir/stack.hh],
                 [], [AT_CHECK_NO_SUBDIR_PART([subdir/foo])])
 
 AT_CHECK_OUTPUT([gram_dir/foo.yy],
-                [%skeleton "lalr1.cc" %defines %verbose %file-prefix "output_dir/foo"],
+                [%skeleton "lalr1.cc" %header %verbose %file-prefix "output_dir/foo"],
                 [],
                 [output_dir/foo.output output_dir/foo.tab.cc output_dir/foo.tab.hh output_dir/stack.hh])
 
 AT_CHECK_OUTPUT([gram_dir/foo.yy],
-                [%skeleton "lalr1.cc" %defines %locations %verbose %file-prefix "output_dir/foo"],
+                [%skeleton "lalr1.cc" %header %locations %verbose %file-prefix "output_dir/foo"],
                 [],
                 [output_dir/foo.output output_dir/foo.tab.cc output_dir/foo.tab.hh output_dir/location.hh output_dir/position.hh output_dir/stack.hh])
 
 # %require "3.2" => no position.hh not stack.hh.
 AT_CHECK_OUTPUT([foo.yy],
-                [%skeleton "lalr1.cc" %defines %locations %define api.location.file none %require "3.2"],
+                [%skeleton "lalr1.cc" %header %locations %define api.location.file none %require "3.2"],
                 [],
                 [foo.tab.cc foo.tab.hh])
 
 AT_CHECK_OUTPUT([foo.yy],
-                [%skeleton "lalr1.cc" %defines %locations %define api.location.file "foo.loc.hh" %require "3.2"],
+                [%skeleton "lalr1.cc" %header %locations %define api.location.file "foo.loc.hh" %require "3.2"],
                 [],
                 [foo.loc.hh foo.tab.cc foo.tab.hh])
 
 # Absolute paths.
 AT_CHECK_OUTPUT([foo.yy],
-                [%skeleton "lalr1.cc" %defines %locations %define api.location.file "$at_dir/foo.loc.hh" %require "3.2"],
+                [%skeleton "lalr1.cc" %header %locations %define api.location.file "$at_dir/foo.loc.hh" %require "3.2"],
                 [],
                 [foo.loc.hh foo.tab.cc foo.tab.hh])
 
@@ -239,12 +270,12 @@
 ]])
 
 AT_CHECK_CONFLICTING_OUTPUT([foo.y],
-[%defines "foo.output"], [-v],
+[%header "foo.output"], [-v],
 [[foo.y: warning: conflicting outputs to file 'foo.output' [-Wother]
 ]])
 
 AT_CHECK_CONFLICTING_OUTPUT([foo.y],
-[%skeleton "lalr1.cc" %defines %locations], [--graph="location.hh"],
+[%skeleton "lalr1.cc" %header %locations], [--graph="location.hh"],
 [[foo.y: warning: conflicting outputs to file 'location.hh' [-Wother]
 ]])
 
@@ -272,7 +303,7 @@
 %%
 start: {};
 ]])
-AT_BISON_CHECK([-o "AS_ESCAPE([$1.c])" --defines="AS_ESCAPE([$1.h])" glr.y])
+AT_BISON_CHECK([-o "AS_ESCAPE([$1.c])" --header="AS_ESCAPE([$1.h])" glr.y])
 AT_CHECK([ls "AS_ESCAPE([$1.c])" "AS_ESCAPE([$1.h])"], [], [ignore])
 AT_COMPILE([glr.o], [-c "AS_ESCAPE([$1.c])"])
 $2
@@ -283,7 +314,7 @@
 %%
 start: {};
 ]])
-AT_BISON_CHECK([-o "AS_ESCAPE([$1.cc])" --defines="AS_ESCAPE([$1.hh])" cxx.y])
+AT_BISON_CHECK([-o "AS_ESCAPE([$1.cc])" --header="AS_ESCAPE([$1.hh])" cxx.y])
 AT_CHECK([ls "AS_ESCAPE([$1.cc])" "AS_ESCAPE([$1.hh])"], [], [ignore])
 AT_COMPILE_CXX([cxx.o], [-c "AS_ESCAPE([$1.cc])"])
 $2
@@ -319,14 +350,8 @@
 AT_KEYWORDS([[graph]])
 AT_DATA([[input.y]], [$2])
 AT_BISON_CHECK([[-rall --graph input.y]], [0], [[]], [[ignore]])
-AT_CHECK([[grep -v // input.dot]], [0],
-[[
-digraph "input.y"
-{
-  node [fontname = courier, shape = box, colorscheme = paired6]
-  edge [fontname = courier]
-  ]$3[}
-]])
+AT_CHECK([[grep -v // input.gv]], [0],
+[$3])
 AT_CLEANUP
 ])
 
@@ -342,27 +367,33 @@
 b: 'b';
 ]],
 [[
-  0 [label="State 0\n\l  0 $accept: . exp $end\l  1 exp: . a '?' b\l  2 a: . %empty\l"]
+digraph "input.y"
+{
+  node [fontname = courier, shape = box, colorscheme = paired6]
+  edge [fontname = courier]
+
+  0 [label="State 0\n\l  0 $accept: • exp $end\l  1 exp: • a '?' b\l  2 a: • %empty\l"]
   0 -> 1 [style=dashed label="exp"]
   0 -> 2 [style=dashed label="a"]
   0 -> "0R2" [style=solid]
  "0R2" [label="R2", fillcolor=3, shape=diamond, style=filled]
-  1 [label="State 1\n\l  0 $accept: exp . $end\l"]
+  1 [label="State 1\n\l  0 $accept: exp • $end\l"]
   1 -> 3 [style=solid label="$end"]
-  2 [label="State 2\n\l  1 exp: a . '?' b\l"]
+  2 [label="State 2\n\l  1 exp: a • '?' b\l"]
   2 -> 4 [style=solid label="'?'"]
-  3 [label="State 3\n\l  0 $accept: exp $end .\l"]
+  3 [label="State 3\n\l  0 $accept: exp $end •\l"]
   3 -> "3R0" [style=solid]
  "3R0" [label="Acc", fillcolor=1, shape=diamond, style=filled]
-  4 [label="State 4\n\l  1 exp: a '?' . b\l  3 b: . 'b'\l"]
+  4 [label="State 4\n\l  1 exp: a '?' • b\l  3 b: • 'b'\l"]
   4 -> 5 [style=solid label="'b'"]
   4 -> 6 [style=dashed label="b"]
-  5 [label="State 5\n\l  3 b: 'b' .\l"]
+  5 [label="State 5\n\l  3 b: 'b' •\l"]
   5 -> "5R3" [style=solid]
  "5R3" [label="R3", fillcolor=3, shape=diamond, style=filled]
-  6 [label="State 6\n\l  1 exp: a '?' b .\l"]
+  6 [label="State 6\n\l  1 exp: a '?' b •\l"]
   6 -> "6R1" [style=solid]
  "6R1" [label="R1", fillcolor=3, shape=diamond, style=filled]
+}
 ]])
 
 ## ------------------------ ##
@@ -384,7 +415,12 @@
 empty_c: %prec 'c';
 ]],
 [[
-  0 [label="State 0\n\l  0 $accept: . start $end\l  1 start: . 'a'\l  2      | . empty_a 'a'\l  3      | . 'b'\l  4      | . empty_b 'b'\l  5      | . 'c'\l  6      | . empty_c 'c'\l  7 empty_a: . %empty  ['a']\l  8 empty_b: . %empty  ['b']\l  9 empty_c: . %empty  ['c']\l"]
+digraph "input.y"
+{
+  node [fontname = courier, shape = box, colorscheme = paired6]
+  edge [fontname = courier]
+
+  0 [label="State 0\n\l  0 $accept: • start $end\l  1 start: • 'a'\l  2      | • empty_a 'a'\l  3      | • 'b'\l  4      | • empty_b 'b'\l  5      | • 'c'\l  6      | • empty_c 'c'\l  7 empty_a: • %empty  ['a']\l  8 empty_b: • %empty  ['b']\l  9 empty_c: • %empty  ['c']\l"]
   0 -> 1 [style=solid label="'a'"]
   0 -> 2 [style=solid label="'b'"]
   0 -> 3 [style=solid label="'c'"]
@@ -398,35 +434,36 @@
  "0R8d" [label="R8", fillcolor=5, shape=diamond, style=filled]
   0 -> "0R9d" [label="['c']", style=solid]
  "0R9d" [label="R9", fillcolor=5, shape=diamond, style=filled]
-  1 [label="State 1\n\l  1 start: 'a' .\l"]
+  1 [label="State 1\n\l  1 start: 'a' •\l"]
   1 -> "1R1" [style=solid]
  "1R1" [label="R1", fillcolor=3, shape=diamond, style=filled]
-  2 [label="State 2\n\l  3 start: 'b' .\l"]
+  2 [label="State 2\n\l  3 start: 'b' •\l"]
   2 -> "2R3" [style=solid]
  "2R3" [label="R3", fillcolor=3, shape=diamond, style=filled]
-  3 [label="State 3\n\l  5 start: 'c' .\l"]
+  3 [label="State 3\n\l  5 start: 'c' •\l"]
   3 -> "3R5" [style=solid]
  "3R5" [label="R5", fillcolor=3, shape=diamond, style=filled]
-  4 [label="State 4\n\l  0 $accept: start . $end\l"]
+  4 [label="State 4\n\l  0 $accept: start • $end\l"]
   4 -> 8 [style=solid label="$end"]
-  5 [label="State 5\n\l  2 start: empty_a . 'a'\l"]
+  5 [label="State 5\n\l  2 start: empty_a • 'a'\l"]
   5 -> 9 [style=solid label="'a'"]
-  6 [label="State 6\n\l  4 start: empty_b . 'b'\l"]
+  6 [label="State 6\n\l  4 start: empty_b • 'b'\l"]
   6 -> 10 [style=solid label="'b'"]
-  7 [label="State 7\n\l  6 start: empty_c . 'c'\l"]
+  7 [label="State 7\n\l  6 start: empty_c • 'c'\l"]
   7 -> 11 [style=solid label="'c'"]
-  8 [label="State 8\n\l  0 $accept: start $end .\l"]
+  8 [label="State 8\n\l  0 $accept: start $end •\l"]
   8 -> "8R0" [style=solid]
  "8R0" [label="Acc", fillcolor=1, shape=diamond, style=filled]
-  9 [label="State 9\n\l  2 start: empty_a 'a' .\l"]
+  9 [label="State 9\n\l  2 start: empty_a 'a' •\l"]
   9 -> "9R2" [style=solid]
  "9R2" [label="R2", fillcolor=3, shape=diamond, style=filled]
-  10 [label="State 10\n\l  4 start: empty_b 'b' .\l"]
+  10 [label="State 10\n\l  4 start: empty_b 'b' •\l"]
   10 -> "10R4" [style=solid]
  "10R4" [label="R4", fillcolor=3, shape=diamond, style=filled]
-  11 [label="State 11\n\l  6 start: empty_c 'c' .\l"]
+  11 [label="State 11\n\l  6 start: empty_c 'c' •\l"]
   11 -> "11R6" [style=solid]
  "11R6" [label="R6", fillcolor=3, shape=diamond, style=filled]
+}
 ]])
 
 ## ---------------------- ##
@@ -451,7 +488,12 @@
 empty_c: %prec 'c';
 ]],
 [[
-  0 [label="State 0\n\l  0 $accept: . start $end\l  1 start: . 'a'\l  2      | . empty_a 'a'\l  3      | . 'b'\l  4      | . empty_b 'b'\l  5      | . 'c'\l  6      | . empty_c 'c'\l  7 empty_a: . %empty  ['a']\l  8 empty_b: . %empty  []\l  9 empty_c: . %empty  []\l"]
+digraph "input.y"
+{
+  node [fontname = courier, shape = box, colorscheme = paired6]
+  edge [fontname = courier]
+
+  0 [label="State 0\n\l  0 $accept: • start $end\l  1 start: • 'a'\l  2      | • empty_a 'a'\l  3      | • 'b'\l  4      | • empty_b 'b'\l  5      | • 'c'\l  6      | • empty_c 'c'\l  7 empty_a: • %empty  ['a']\l  8 empty_b: • %empty  []\l  9 empty_c: • %empty  []\l"]
   0 -> 1 [style=solid label="'b'"]
   0 -> 2 [style=solid label="'c'"]
   0 -> 3 [style=dashed label="start"]
@@ -460,32 +502,33 @@
   0 -> 6 [style=dashed label="empty_c"]
   0 -> "0R7" [style=solid]
  "0R7" [label="R7", fillcolor=3, shape=diamond, style=filled]
-  1 [label="State 1\n\l  3 start: 'b' .\l"]
+  1 [label="State 1\n\l  3 start: 'b' •\l"]
   1 -> "1R3" [style=solid]
  "1R3" [label="R3", fillcolor=3, shape=diamond, style=filled]
-  2 [label="State 2\n\l  5 start: 'c' .\l"]
+  2 [label="State 2\n\l  5 start: 'c' •\l"]
   2 -> "2R5" [style=solid]
  "2R5" [label="R5", fillcolor=3, shape=diamond, style=filled]
-  3 [label="State 3\n\l  0 $accept: start . $end\l"]
+  3 [label="State 3\n\l  0 $accept: start • $end\l"]
   3 -> 7 [style=solid label="$end"]
-  4 [label="State 4\n\l  2 start: empty_a . 'a'\l"]
+  4 [label="State 4\n\l  2 start: empty_a • 'a'\l"]
   4 -> 8 [style=solid label="'a'"]
-  5 [label="State 5\n\l  4 start: empty_b . 'b'\l"]
+  5 [label="State 5\n\l  4 start: empty_b • 'b'\l"]
   5 -> 9 [style=solid label="'b'"]
-  6 [label="State 6\n\l  6 start: empty_c . 'c'\l"]
+  6 [label="State 6\n\l  6 start: empty_c • 'c'\l"]
   6 -> 10 [style=solid label="'c'"]
-  7 [label="State 7\n\l  0 $accept: start $end .\l"]
+  7 [label="State 7\n\l  0 $accept: start $end •\l"]
   7 -> "7R0" [style=solid]
  "7R0" [label="Acc", fillcolor=1, shape=diamond, style=filled]
-  8 [label="State 8\n\l  2 start: empty_a 'a' .\l"]
+  8 [label="State 8\n\l  2 start: empty_a 'a' •\l"]
   8 -> "8R2" [style=solid]
  "8R2" [label="R2", fillcolor=3, shape=diamond, style=filled]
-  9 [label="State 9\n\l  4 start: empty_b 'b' .\l"]
+  9 [label="State 9\n\l  4 start: empty_b 'b' •\l"]
   9 -> "9R4" [style=solid]
  "9R4" [label="R4", fillcolor=3, shape=diamond, style=filled]
-  10 [label="State 10\n\l  6 start: empty_c 'c' .\l"]
+  10 [label="State 10\n\l  6 start: empty_c 'c' •\l"]
   10 -> "10R6" [style=solid]
  "10R6" [label="R6", fillcolor=3, shape=diamond, style=filled]
+}
 ]])
 
 ## ---------------- ##
@@ -499,7 +542,12 @@
 b: ;
 ]],
 [[
-  0 [label="State 0\n\l  0 $accept: . exp $end\l  1 exp: . a\l  2    | . b\l  3 a: . %empty  [$end]\l  4 b: . %empty  [$end]\l"]
+digraph "input.y"
+{
+  node [fontname = courier, shape = box, colorscheme = paired6]
+  edge [fontname = courier]
+
+  0 [label="State 0\n\l  0 $accept: • exp $end\l  1 exp: • a\l  2    | • b\l  3 a: • %empty  [$end]\l  4 b: • %empty  [$end]\l"]
   0 -> 1 [style=dashed label="exp"]
   0 -> 2 [style=dashed label="a"]
   0 -> 3 [style=dashed label="b"]
@@ -507,17 +555,18 @@
  "0R3" [label="R3", fillcolor=3, shape=diamond, style=filled]
   0 -> "0R4d" [label="[$end]", style=solid]
  "0R4d" [label="R4", fillcolor=5, shape=diamond, style=filled]
-  1 [label="State 1\n\l  0 $accept: exp . $end\l"]
+  1 [label="State 1\n\l  0 $accept: exp • $end\l"]
   1 -> 4 [style=solid label="$end"]
-  2 [label="State 2\n\l  1 exp: a .\l"]
+  2 [label="State 2\n\l  1 exp: a •\l"]
   2 -> "2R1" [style=solid]
  "2R1" [label="R1", fillcolor=3, shape=diamond, style=filled]
-  3 [label="State 3\n\l  2 exp: b .\l"]
+  3 [label="State 3\n\l  2 exp: b •\l"]
   3 -> "3R2" [style=solid]
  "3R2" [label="R2", fillcolor=3, shape=diamond, style=filled]
-  4 [label="State 4\n\l  0 $accept: exp $end .\l"]
+  4 [label="State 4\n\l  0 $accept: exp $end •\l"]
   4 -> "4R0" [style=solid]
  "4R0" [label="Acc", fillcolor=1, shape=diamond, style=filled]
+}
 ]])
 
 ## ---------------------------------------- ##
@@ -532,7 +581,12 @@
 c: ;
 ]],
 [[
-  0 [label="State 0\n\l  0 $accept: . exp $end\l  1 exp: . a ';'\l  2    | . a ';'\l  3    | . a '.'\l  4    | . b '?'\l  5    | . b '!'\l  6    | . c '?'\l  7    | . c ';'\l  8 a: . %empty  [';', '.']\l  9 b: . %empty  ['?', '!']\l 10 c: . %empty  [';', '?']\l"]
+digraph "input.y"
+{
+  node [fontname = courier, shape = box, colorscheme = paired6]
+  edge [fontname = courier]
+
+  0 [label="State 0\n\l  0 $accept: • exp $end\l  1 exp: • a ';'\l  2    | • a ';'\l  3    | • a '.'\l  4    | • b '?'\l  5    | • b '!'\l  6    | • c '?'\l  7    | • c ';'\l  8 a: • %empty  [';', '.']\l  9 b: • %empty  ['?', '!']\l 10 c: • %empty  [';', '?']\l"]
   0 -> 1 [style=dashed label="exp"]
   0 -> 2 [style=dashed label="a"]
   0 -> 3 [style=dashed label="b"]
@@ -543,40 +597,41 @@
  "0R9" [label="R9", fillcolor=3, shape=diamond, style=filled]
   0 -> "0R10d" [label="[';', '?']", style=solid]
  "0R10d" [label="R10", fillcolor=5, shape=diamond, style=filled]
-  1 [label="State 1\n\l  0 $accept: exp . $end\l"]
+  1 [label="State 1\n\l  0 $accept: exp • $end\l"]
   1 -> 5 [style=solid label="$end"]
-  2 [label="State 2\n\l  1 exp: a . ';'\l  2    | a . ';'\l  3    | a . '.'\l"]
+  2 [label="State 2\n\l  1 exp: a • ';'\l  2    | a • ';'\l  3    | a • '.'\l"]
   2 -> 6 [style=solid label="';'"]
   2 -> 7 [style=solid label="'.'"]
-  3 [label="State 3\n\l  4 exp: b . '?'\l  5    | b . '!'\l"]
+  3 [label="State 3\n\l  4 exp: b • '?'\l  5    | b • '!'\l"]
   3 -> 8 [style=solid label="'?'"]
   3 -> 9 [style=solid label="'!'"]
-  4 [label="State 4\n\l  6 exp: c . '?'\l  7    | c . ';'\l"]
+  4 [label="State 4\n\l  6 exp: c • '?'\l  7    | c • ';'\l"]
   4 -> 10 [style=solid label="';'"]
   4 -> 11 [style=solid label="'?'"]
-  5 [label="State 5\n\l  0 $accept: exp $end .\l"]
+  5 [label="State 5\n\l  0 $accept: exp $end •\l"]
   5 -> "5R0" [style=solid]
  "5R0" [label="Acc", fillcolor=1, shape=diamond, style=filled]
-  6 [label="State 6\n\l  1 exp: a ';' .  [$end]\l  2    | a ';' .  [$end]\l"]
+  6 [label="State 6\n\l  1 exp: a ';' •  [$end]\l  2    | a ';' •  [$end]\l"]
   6 -> "6R1" [style=solid]
  "6R1" [label="R1", fillcolor=3, shape=diamond, style=filled]
   6 -> "6R2d" [label="[$end]", style=solid]
  "6R2d" [label="R2", fillcolor=5, shape=diamond, style=filled]
-  7 [label="State 7\n\l  3 exp: a '.' .\l"]
+  7 [label="State 7\n\l  3 exp: a '.' •\l"]
   7 -> "7R3" [style=solid]
  "7R3" [label="R3", fillcolor=3, shape=diamond, style=filled]
-  8 [label="State 8\n\l  4 exp: b '?' .\l"]
+  8 [label="State 8\n\l  4 exp: b '?' •\l"]
   8 -> "8R4" [style=solid]
  "8R4" [label="R4", fillcolor=3, shape=diamond, style=filled]
-  9 [label="State 9\n\l  5 exp: b '!' .\l"]
+  9 [label="State 9\n\l  5 exp: b '!' •\l"]
   9 -> "9R5" [style=solid]
  "9R5" [label="R5", fillcolor=3, shape=diamond, style=filled]
-  10 [label="State 10\n\l  7 exp: c ';' .\l"]
+  10 [label="State 10\n\l  7 exp: c ';' •\l"]
   10 -> "10R7" [style=solid]
  "10R7" [label="R7", fillcolor=3, shape=diamond, style=filled]
-  11 [label="State 11\n\l  6 exp: c '?' .\l"]
+  11 [label="State 11\n\l  6 exp: c '?' •\l"]
   11 -> "11R6" [style=solid]
  "11R6" [label="R6", fillcolor=3, shape=diamond, style=filled]
+}
 ]])
 
 ## ------------------------------------------------------ ##
@@ -592,62 +647,67 @@
 imm: '0';
 ]],
 [[
-  0 [label="State 0\n\l  0 $accept: . exp $end\l  1 exp: . ifexp\l  2    | . opexp\l  3    | . imm\l  4 ifexp: . \"if\" exp \"then\" exp elseexp\l  7 opexp: . exp '+' exp\l  8 imm: . '0'\l"]
+digraph "input.y"
+{
+  node [fontname = courier, shape = box, colorscheme = paired6]
+  edge [fontname = courier]
+
+  0 [label="State 0\n\l  0 $accept: • exp $end\l  1 exp: • ifexp\l  2    | • opexp\l  3    | • imm\l  4 ifexp: • \"if\" exp \"then\" exp elseexp\l  7 opexp: • exp '+' exp\l  8 imm: • '0'\l"]
   0 -> 1 [style=solid label="\"if\""]
   0 -> 2 [style=solid label="'0'"]
   0 -> 3 [style=dashed label="exp"]
   0 -> 4 [style=dashed label="ifexp"]
   0 -> 5 [style=dashed label="opexp"]
   0 -> 6 [style=dashed label="imm"]
-  1 [label="State 1\n\l  1 exp: . ifexp\l  2    | . opexp\l  3    | . imm\l  4 ifexp: . \"if\" exp \"then\" exp elseexp\l  4      | \"if\" . exp \"then\" exp elseexp\l  7 opexp: . exp '+' exp\l  8 imm: . '0'\l"]
+  1 [label="State 1\n\l  1 exp: • ifexp\l  2    | • opexp\l  3    | • imm\l  4 ifexp: • \"if\" exp \"then\" exp elseexp\l  4      | \"if\" • exp \"then\" exp elseexp\l  7 opexp: • exp '+' exp\l  8 imm: • '0'\l"]
   1 -> 1 [style=solid label="\"if\""]
   1 -> 2 [style=solid label="'0'"]
   1 -> 7 [style=dashed label="exp"]
   1 -> 4 [style=dashed label="ifexp"]
   1 -> 5 [style=dashed label="opexp"]
   1 -> 6 [style=dashed label="imm"]
-  2 [label="State 2\n\l  8 imm: '0' .\l"]
+  2 [label="State 2\n\l  8 imm: '0' •\l"]
   2 -> "2R8" [style=solid]
  "2R8" [label="R8", fillcolor=3, shape=diamond, style=filled]
-  3 [label="State 3\n\l  0 $accept: exp . $end\l  7 opexp: exp . '+' exp\l"]
+  3 [label="State 3\n\l  0 $accept: exp • $end\l  7 opexp: exp • '+' exp\l"]
   3 -> 8 [style=solid label="$end"]
   3 -> 9 [style=solid label="'+'"]
-  4 [label="State 4\n\l  1 exp: ifexp .\l"]
+  4 [label="State 4\n\l  1 exp: ifexp •\l"]
   4 -> "4R1" [style=solid]
  "4R1" [label="R1", fillcolor=3, shape=diamond, style=filled]
-  5 [label="State 5\n\l  2 exp: opexp .\l"]
+  5 [label="State 5\n\l  2 exp: opexp •\l"]
   5 -> "5R2" [style=solid]
  "5R2" [label="R2", fillcolor=3, shape=diamond, style=filled]
-  6 [label="State 6\n\l  3 exp: imm .\l"]
+  6 [label="State 6\n\l  3 exp: imm •\l"]
   6 -> "6R3" [style=solid]
  "6R3" [label="R3", fillcolor=3, shape=diamond, style=filled]
-  7 [label="State 7\n\l  4 ifexp: \"if\" exp . \"then\" exp elseexp\l  7 opexp: exp . '+' exp\l"]
+  7 [label="State 7\n\l  4 ifexp: \"if\" exp • \"then\" exp elseexp\l  7 opexp: exp • '+' exp\l"]
   7 -> 10 [style=solid label="\"then\""]
   7 -> 9 [style=solid label="'+'"]
-  8 [label="State 8\n\l  0 $accept: exp $end .\l"]
+  8 [label="State 8\n\l  0 $accept: exp $end •\l"]
   8 -> "8R0" [style=solid]
  "8R0" [label="Acc", fillcolor=1, shape=diamond, style=filled]
-  9 [label="State 9\n\l  1 exp: . ifexp\l  2    | . opexp\l  3    | . imm\l  4 ifexp: . \"if\" exp \"then\" exp elseexp\l  7 opexp: . exp '+' exp\l  7      | exp '+' . exp\l  8 imm: . '0'\l"]
+  9 [label="State 9\n\l  1 exp: • ifexp\l  2    | • opexp\l  3    | • imm\l  4 ifexp: • \"if\" exp \"then\" exp elseexp\l  7 opexp: • exp '+' exp\l  7      | exp '+' • exp\l  8 imm: • '0'\l"]
   9 -> 1 [style=solid label="\"if\""]
   9 -> 2 [style=solid label="'0'"]
   9 -> 11 [style=dashed label="exp"]
   9 -> 4 [style=dashed label="ifexp"]
   9 -> 5 [style=dashed label="opexp"]
   9 -> 6 [style=dashed label="imm"]
-  10 [label="State 10\n\l  1 exp: . ifexp\l  2    | . opexp\l  3    | . imm\l  4 ifexp: . \"if\" exp \"then\" exp elseexp\l  4      | \"if\" exp \"then\" . exp elseexp\l  7 opexp: . exp '+' exp\l  8 imm: . '0'\l"]
+  10 [label="State 10\n\l  1 exp: • ifexp\l  2    | • opexp\l  3    | • imm\l  4 ifexp: • \"if\" exp \"then\" exp elseexp\l  4      | \"if\" exp \"then\" • exp elseexp\l  7 opexp: • exp '+' exp\l  8 imm: • '0'\l"]
   10 -> 1 [style=solid label="\"if\""]
   10 -> 2 [style=solid label="'0'"]
   10 -> 12 [style=dashed label="exp"]
   10 -> 4 [style=dashed label="ifexp"]
   10 -> 5 [style=dashed label="opexp"]
   10 -> 6 [style=dashed label="imm"]
-  11 [label="State 11\n\l  7 opexp: exp . '+' exp\l  7      | exp '+' exp .  [$end, \"then\", \"else\", '+']\l"]
+  11 [label="State 11\n\l  7 opexp: exp • '+' exp\l  7      | exp '+' exp •  [$end, \"then\", \"else\", '+']\l"]
   11 -> 9 [style=solid label="'+'"]
   11 -> "11R7d" [label="['+']", style=solid]
  "11R7d" [label="R7", fillcolor=5, shape=diamond, style=filled]
   11 -> "11R7" [style=solid]
  "11R7" [label="R7", fillcolor=3, shape=diamond, style=filled]
-  12 [label="State 12\n\l  4 ifexp: \"if\" exp \"then\" exp . elseexp\l  5 elseexp: . \"else\" exp\l  6        | . %empty  [$end, \"then\", \"else\", '+']\l  7 opexp: exp . '+' exp\l"]
+  12 [label="State 12\n\l  4 ifexp: \"if\" exp \"then\" exp • elseexp\l  5 elseexp: • \"else\" exp\l  6        | • %empty  [$end, \"then\", \"else\", '+']\l  7 opexp: exp • '+' exp\l"]
   12 -> 13 [style=solid label="\"else\""]
   12 -> 9 [style=solid label="'+'"]
   12 -> 14 [style=dashed label="elseexp"]
@@ -655,22 +715,124 @@
  "12R6d" [label="R6", fillcolor=5, shape=diamond, style=filled]
   12 -> "12R6" [style=solid]
  "12R6" [label="R6", fillcolor=3, shape=diamond, style=filled]
-  13 [label="State 13\n\l  1 exp: . ifexp\l  2    | . opexp\l  3    | . imm\l  4 ifexp: . \"if\" exp \"then\" exp elseexp\l  5 elseexp: \"else\" . exp\l  7 opexp: . exp '+' exp\l  8 imm: . '0'\l"]
+  13 [label="State 13\n\l  1 exp: • ifexp\l  2    | • opexp\l  3    | • imm\l  4 ifexp: • \"if\" exp \"then\" exp elseexp\l  5 elseexp: \"else\" • exp\l  7 opexp: • exp '+' exp\l  8 imm: • '0'\l"]
   13 -> 1 [style=solid label="\"if\""]
   13 -> 2 [style=solid label="'0'"]
   13 -> 15 [style=dashed label="exp"]
   13 -> 4 [style=dashed label="ifexp"]
   13 -> 5 [style=dashed label="opexp"]
   13 -> 6 [style=dashed label="imm"]
-  14 [label="State 14\n\l  4 ifexp: \"if\" exp \"then\" exp elseexp .\l"]
+  14 [label="State 14\n\l  4 ifexp: \"if\" exp \"then\" exp elseexp •\l"]
   14 -> "14R4" [style=solid]
  "14R4" [label="R4", fillcolor=3, shape=diamond, style=filled]
-  15 [label="State 15\n\l  5 elseexp: \"else\" exp .  [$end, \"then\", \"else\", '+']\l  7 opexp: exp . '+' exp\l"]
+  15 [label="State 15\n\l  5 elseexp: \"else\" exp •  [$end, \"then\", \"else\", '+']\l  7 opexp: exp • '+' exp\l"]
   15 -> 9 [style=solid label="'+'"]
   15 -> "15R5d" [label="['+']", style=solid]
  "15R5d" [label="R5", fillcolor=5, shape=diamond, style=filled]
   15 -> "15R5" [style=solid]
  "15R5" [label="R5", fillcolor=3, shape=diamond, style=filled]
+}
 ]])
 
 m4_popdef([AT_TEST])
+
+
+## -------------------------------- ##
+## C++ Output File Prefix Mapping.  ##
+## -------------------------------- ##
+
+AT_SETUP([C++ Output File Prefix Mapping])
+
+# AT_TEST([PREFIX], [DIRECTIVES])
+# -------------------------------
+m4_pushdef([AT_TEST],
+[AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc" %define api.namespace {$1} $2])
+AT_LOC_PUSHDEF([begin.line], [begin.column], [end.line], [end.column])
+AT_DATA_GRAMMAR([$1.yy],
+[[%skeleton "lalr1.cc"
+%define api.namespace {$1}
+$2
+%code {
+  ]AT_YYERROR_DECLARE[
+  ]AT_YYLEX_DECLARE[
+}
+%%
+exp: '0';
+%%
+]AT_YYERROR_DEFINE[
+]AT_YYLEX_DEFINE(["0"])[
+]])
+
+AT_BISON_CHECK([-fcaret -o out/$1.cc -M out/=bar/ $1.yy])
+AT_LANG_COMPILE([out/$1.o], [], [-Iout/include])
+
+AT_LOC_POPDEF
+AT_BISON_OPTION_POPDEFS
+])
+
+mkdir -p out/include/ast
+
+AT_TEST([x1],
+        [%header
+         %locations
+         %define api.location.file "include/ast/loc.hh"
+         ])
+
+# Check the CPP guard and Doxyen comments.
+AT_CHECK([[sed -ne 's/#line [0-9][0-9]* "/#line "/p;/INCLUDED/p;/\\file/{p;n;p;}' out/include/ast/loc.hh]], [],
+[[ ** \file bar/include/ast/loc.hh
+ ** Define the x1::location class.
+#ifndef YY_YY_BAR_INCLUDE_AST_LOC_HH_INCLUDED
+# define YY_YY_BAR_INCLUDE_AST_LOC_HH_INCLUDED
+#line "x1.yy"
+#line "bar/include/ast/loc.hh"
+#line "x1.yy"
+#line "bar/include/ast/loc.hh"
+#endif // !YY_YY_BAR_INCLUDE_AST_LOC_HH_INCLUDED
+]])
+
+AT_CHECK([[sed -ne 's/^#line [0-9][0-9]* "/#line "/p;/INCLUDED/p;/\\file/{p;n;p;}' out/x1.hh]], [],
+[[ ** \file bar/x1.hh
+ ** Define the x1::parser class.
+#ifndef YY_YY_BAR_X1_HH_INCLUDED
+# define YY_YY_BAR_X1_HH_INCLUDED
+#line "x1.yy"
+#line "bar/x1.hh"
+#line "x1.yy"
+#line "bar/x1.hh"
+#endif // !YY_YY_BAR_X1_HH_INCLUDED
+]])
+
+AT_TEST([x2],
+        [%header
+         %locations
+         %code requires {#include "include/ast/loc.hh"}
+         %define api.location.type {x1::location}])
+
+m4_popdef([AT_TEST])
+
+AT_DATA([main.cc],
+[AT_DATA_SOURCE_PROLOGUE
+[#include "x1.hh"
+#include "x2.hh"
+
+#define RUN(S)                                  \
+  do {                                          \
+    S::parser parser;                           \
+    int res = parser.parse();                   \
+    if (res)                                    \
+      std::cerr << #S": " << res << '\n';       \
+  } while (false)
+
+int
+main (void)
+{
+  RUN(x1);
+  RUN(x2);
+}
+]])# main.cc
+
+AT_COMPILE_CXX([parser], [[out/x[12].o main.cc]], [-Iout/])
+AT_PARSER_CHECK([parser], [0])
+
+AT_CLEANUP
diff --git a/tests/package.m4 b/tests/package.m4
index 5d7afeb..105e0a7 100644
--- a/tests/package.m4
+++ b/tests/package.m4
@@ -1,6 +1,6 @@
 # Signature of the current package.
 m4_define([AT_PACKAGE_NAME],      [GNU Bison])
 m4_define([AT_PACKAGE_TARNAME],   [bison])
-m4_define([AT_PACKAGE_VERSION],   [3.5])
-m4_define([AT_PACKAGE_STRING],    [GNU Bison 3.5])
+m4_define([AT_PACKAGE_VERSION],   [3.8.2])
+m4_define([AT_PACKAGE_STRING],    [GNU Bison 3.8.2])
 m4_define([AT_PACKAGE_BUGREPORT], [bug-bison@gnu.org])
diff --git a/tests/push.at b/tests/push.at
index bf47774..0cfb346 100644
--- a/tests/push.at
+++ b/tests/push.at
@@ -1,6 +1,6 @@
 # Checking Push Parsing.                            -*- Autotest -*-
 
-# Copyright (C) 2007, 2009-2015, 2018-2019 Free Software Foundation,
+# Copyright (C) 2007, 2009-2015, 2018-2021 Free Software Foundation,
 # Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[Push Parsing Tests]])
 
@@ -25,7 +25,7 @@
 AT_SETUP([[Memory Leak for Early Deletion]])
 
 # Requires Valgrind.
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%define api.push-pull push])
 AT_DATA_GRAMMAR([[input.y]],
 [[
 %{
@@ -144,7 +144,7 @@
 
 AT_SETUP([[Unsupported Skeletons]])
 
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%define api.push-pull push])
 AT_DATA([[input.y]],
 [[%glr-parser
 %define api.push-pull push
@@ -158,3 +158,126 @@
 ]])
 
 AT_CLEANUP
+
+
+## -------------- ##
+## Pstate reuse.  ##
+## -------------- ##
+
+AT_SETUP([[Pstate reuse]])
+
+# Make sure that when a single pstate is used for multiple successive
+# parses, no state from a previous run leaks into the following one.
+#
+# See https://lists.gnu.org/r/bug-bison/2021-03/msg00000.html.
+
+AT_BISON_OPTION_PUSHDEFS([%define api.push-pull push])
+AT_DATA_GRAMMAR([[input.y]],
+[[%code top {
+  #include <stdlib.h>
+  #include <string.h>
+
+  static char *string_concat (char *a, char *b);
+  ]AT_YYERROR_DECLARE[
+}
+
+%define parse.trace
+%define api.pure full
+%define api.push-pull push
+%expect 0
+
+%union {
+  char *sval;
+};
+%destructor { free ($$); } <sval>
+%printer { fprintf (yyo, "%s", $$); } <sval>
+
+%token <sval> RAW
+%token EOL
+
+%type <sval> text
+
+%%
+
+line
+  : text EOL  { printf ("text: %s\n", $1); free ($1); YYACCEPT; };
+
+text
+  : RAW       { $$ = $1; }
+  | text RAW  { $$ = string_concat ($1, $2); }
+  ;
+
+%%
+]AT_YYERROR_DEFINE[
+
+static char *
+string_concat (char *a, char *b)
+{
+  size_t la = strlen (a);
+  size_t lb = strlen (b);
+  char *res = YY_CAST (char *, malloc (la + lb + 1));
+  strcpy (res, a);
+  strcpy (res + la, b);
+  free (a);
+  free (b);
+  return res;
+}
+
+static int
+push (yypstate *ps, yytoken_kind_t kind, const char *str)
+{
+  YYSTYPE lval;
+  lval.sval = str ? strdup (str) :  YY_NULLPTR;
+  switch (yypush_parse (ps, kind, &lval))
+    {
+    case 0:
+      return 0;
+    case YYPUSH_MORE:
+      // parsing incomplete, but valid; parser not reset
+      return 0;
+    case 1:
+      // YYABORT or syntax invalid; parser is reset
+      fprintf (stderr, "invalid input, but no error was thrown\n");
+      return 1;
+    case 2:
+      // memory exhaustion; parser is reset
+      fprintf (stderr, "memory exhaustion during yypush_parse\n");
+      return 1;
+    }
+  return 1;
+}
+
+int
+main (void)
+{
+  yydebug = !!getenv ("YYDEBUG");
+  yypstate *ps = yypstate_new ();
+
+#define PUSH(Kind, Val)                         \
+  do {                                          \
+    if (push (ps, Kind, Val))                   \
+      return 1;                                 \
+  } while (0)
+
+  PUSH (RAW, "te");
+  PUSH (RAW, "xt");
+  PUSH (EOL,  YY_NULLPTR);
+
+  PUSH (RAW, "te");
+  PUSH (RAW, "xt");
+  PUSH (EOL,  YY_NULLPTR);
+
+  yypstate_delete (ps);
+
+  return 0;
+}
+]])
+
+AT_FULL_COMPILE([input])
+AT_CHECK([./input], 0,
+[[text: text
+text: text
+]])
+
+AT_BISON_OPTION_POPDEFS
+AT_CLEANUP
diff --git a/tests/reduce.at b/tests/reduce.at
index fb098a6..db8ec07 100644
--- a/tests/reduce.at
+++ b/tests/reduce.at
@@ -1,6 +1,6 @@
 # Exercising Bison Grammar Reduction.                      -*- Autotest -*-
 
-# Copyright (C) 2001-2002, 2007-2015, 2018-2019 Free Software
+# Copyright (C) 2001-2002, 2007-2015, 2018-2021 Free Software
 # Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[Grammar Reduction.]])
 
@@ -228,7 +228,7 @@
 # symbols.  As a result, the evaluation of the skeleton failed because
 # it used non existing symbol numbers.  Which is the happy scenario:
 # we could use numbers of other existing symbols...
-# http://lists.gnu.org/archive/html/bug-bison/2019-01/msg00044.html
+# https://lists.gnu.org/r/bug-bison/2019-01/msg00044.html
 
 AT_BISON_OPTION_PUSHDEFS
 AT_DATA([[input.y]],
@@ -445,23 +445,70 @@
 
 
 
-## ---------------- ##
-## Empty Language.  ##
-## ---------------- ##
+## ------------------- ##
+## Bad start symbols.  ##
+## ------------------- ##
 
-AT_SETUP([Empty Language])
+AT_SETUP([Bad start symbols])
 
+m4_pushdef([AT_TEST],
+[AT_BISON_OPTION_PUSHDEFS([$1])
 AT_DATA([[input.y]],
-[[%output "input.c"
-%%
-exp: exp;
-]])
+[%%
+$1
+])
 
 AT_BISON_CHECK([[input.y]], 1, [],
+[$2
+])
+AT_BISON_OPTION_POPDEFS([$1])
+])
+
+AT_TEST(
+[[exp: exp;]],
 [[input.y: warning: 2 nonterminals useless in grammar [-Wother]
 input.y: warning: 2 rules useless in grammar [-Wother]
-input.y:3.1-3: fatal error: start symbol exp does not derive any sentence
-]])
+input.y:2.1-3: error: start symbol exp does not derive any sentence]])
+
+AT_TEST(
+[[%start exp;
+exp: exp;]],
+[[input.y: warning: 2 nonterminals useless in grammar [-Wother]
+input.y: warning: 2 rules useless in grammar [-Wother]
+input.y:2.8-10: error: start symbol exp does not derive any sentence]])
+
+AT_TEST(
+[[%start exp stmt;
+exp: exp;
+stmt: "stmt"]],
+[[input.y: warning: 1 nonterminal useless in grammar [-Wother]
+input.y: warning: 2 rules useless in grammar [-Wother]
+input.y:2.8-10: error: start symbol exp does not derive any sentence]])
+
+AT_TEST(
+[[%start exp stmt;
+exp: exp;
+stmt: stmt]],
+[[input.y: warning: 3 nonterminals useless in grammar [-Wother]
+input.y: warning: 4 rules useless in grammar [-Wother]
+input.y:2.8-10: error: start symbol exp does not derive any sentence
+input.y:2.12-15: error: start symbol stmt does not derive any sentence]])
+
+AT_TEST(
+[[%start exp;
+stmt: stmt]],
+[[input.y:2.8-10: warning: symbol 'exp' is used, but is not defined as a token and has no rules [-Wother]
+input.y: warning: 3 nonterminals useless in grammar [-Wother]
+input.y: warning: 2 rules useless in grammar [-Wother]
+input.y:2.8-10: error: start symbol exp does not derive any sentence]])
+
+AT_TEST(
+[[%token FOO;
+%start FOO;
+stmt: FOO]],
+[[input.y:2.8-10: error: the start symbol FOO is a token]])
+
+m4_popdef([AT_TEST])
 
 AT_CLEANUP
 
@@ -1118,7 +1165,7 @@
 
     4 A: 'a' 'a' . B
     5 B: . 'a'
-    6  | . %empty  ]AT_COND_CASE([[LALR]], [[['a', 'b']]], [[['a']]])[
+    6  | %empty .  ]AT_COND_CASE([[LALR]], [[['a', 'b']]], [[['a']]])[
 
     ]AT_COND_CASE([[canonical LR]], [['a']],
                   [[$default]])[  reduce using rule 6 (B)
@@ -1148,7 +1195,7 @@
 
     4 A: 'a' 'a' . B
     5 B: . 'a'
-    6  | . %empty  [$end]
+    6  | %empty .  [$end]
     7 c: 'a' 'a' . 'b'
 
     'a'  shift, and go to state ]AT_COND_CASE([[canonical LR]], [[20]],
@@ -1211,7 +1258,7 @@
 
     4 A: 'a' 'a' . B
     5 B: . 'a'
-    6  | . %empty  ['b']
+    6  | %empty .  ['b']
 
     'a'  shift, and go to state ]AT_COND_CASE([[canonical LR]], [[23]],
                                               [[16]])[
@@ -1300,6 +1347,7 @@
 dnl BISON-STDERR
 [AT_COND_CASE([[LALR]],
 [[input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
+input.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 ]], [])],
 
 dnl TABLES
@@ -1636,8 +1684,8 @@
     1 start: a . b
     2      | a . b 'a'
     3      | a . c 'b'
-    5 b: . %empty  [$end, 'a']
-    6 c: . %empty  ['b']]AT_COND_CASE([[most]], [[
+    5 b: %empty .  [$end, 'a']
+    6 c: %empty .  ['b']]AT_COND_CASE([[most]], [[
 
     'b'       reduce using rule 6 (c)
     $default  reduce using rule 5 (b)]], [[
diff --git a/tests/regression.at b/tests/regression.at
index a1a85e1..1a796a9 100644
--- a/tests/regression.at
+++ b/tests/regression.at
@@ -1,6 +1,6 @@
 # Bison Regressions.                               -*- Autotest -*-
 
-# Copyright (C) 2001-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2001-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[Regression tests.]])
 
@@ -87,7 +87,7 @@
 # Found in GCJ: they expect the tokens to be defined before the user
 # prologue, so that they can use the token definitions in it.
 
-AT_BISON_OPTION_PUSHDEFS
+AT_BISON_OPTION_PUSHDEFS([%yacc])
 
 # Not AT_DATA_GRAMMAR, which uses %code, which is not supported by Yacc.
 AT_DATA([input.y],
@@ -112,7 +112,7 @@
 ]])
 AT_BISON_OPTION_POPDEFS
 
-AT_BISON_CHECK([-y -o input.c input.y])
+AT_BISON_CHECK([--yacc -o input.c input.y])
 AT_COMPILE([input.o])
 
 AT_CLEANUP
@@ -146,8 +146,9 @@
 void
 print_my_token (void)
 {
-  enum yytokentype my_token = MY_TOKEN;
-  printf ("%d\n", my_token);
+  enum yytokentype tok1 = MY_TOKEN;
+  yytoken_kind_t   tok2 = MY_TOKEN;
+  printf ("%d, %d\n", tok1, tok2);
 }
 %}
 %token MY_TOKEN
@@ -366,17 +367,28 @@
 ## Token definitions.  ##
 ## ------------------- ##
 
+m4_pushdef([AT_TEST],
+[AT_SETUP([Token definitions: $1])
 
-AT_SETUP([Token definitions])
+AT_BISON_OPTION_PUSHDEFS([$1])
 
-AT_BISON_OPTION_PUSHDEFS
 
+# Clang chokes on some of our comments, because it tries to "parse"
+# some documentation directives in the comments:
+#
+# input.c:131:48: error: '\a' command does not have a valid word argument [-Werror,-Wdocumentation]
+#     SPECIAL = 261                  /* "\\'?\"\a\b\f\n\r\t\v\001\201\001\201??!"  */
+#                                              ~~^
 AT_DATA_GRAMMAR([input.y],
 [%{
+#if defined __clang__ && 10 <= __clang_major__
+# pragma clang diagnostic ignored "-Wdocumentation"
+#endif
+
 ]AT_YYERROR_DECLARE[
 ]AT_YYLEX_DECLARE[
 %}
-[%define parse.error verbose
+[$1
 %token MYEOF 0 "end of file"
 %token 'a' "a"  // Bison managed, when fed with '%token 'f' "f"' to #define 'f'!
 %token B_TOKEN "b"
@@ -385,27 +397,26 @@
 %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
 %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
 %%
-exp: "a" "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!";
+exp: ]AT_ERROR_VERBOSE_IF(["\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"], ["∃¬∩∪∀"])[;
 %%
 ]AT_YYERROR_DEFINE[
-]AT_YYLEX_DEFINE([{ SPECIAL }])[
+]AT_YYLEX_DEFINE(["a"])[
 ]AT_MAIN_DEFINE[
 ]])
-AT_BISON_OPTION_POPDEFS
 
 # Checking the warning message guarantees that the trigraph "??!" isn't
 # unnecessarily escaped here even though it would need to be if encoded in a
 # C-string literal.  Also notice that unnecessary escaping, such as "\?", from
 # the user specification is eliminated.
 AT_BISON_CHECK([-fcaret -o input.c input.y], [[0]], [[]],
-[[input.y:22.8-14: warning: symbol SPECIAL redeclared [-Wother]
-   22 | %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
+[[input.y:26.8-14: warning: symbol SPECIAL redeclared [-Wother]
+   26 | %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
       |        ^~~~~~~
-input.y:21.8-14:     previous declaration
-   21 | %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
+input.y:25.8-14: note: previous declaration
+   25 | %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
       |        ^~~~~~~
-input.y:22.16-63: warning: symbol "\\'?\"\a\b\f\n\r\t\v\001\201\001\201??!" used more than once as a literal string [-Wother]
-   22 | %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
+input.y:26.16-63: warning: symbol "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!" used more than once as a literal string [-Wother]
+   26 | %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
       |                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ]])
 
@@ -415,13 +426,18 @@
 # C-string literals, does have the trigraph escaped correctly.  Thus, the
 # symbol name reported by the parser is exactly the same as that reported by
 # Bison itself.
-AT_DATA([experr],
-[[syntax error, unexpected "\\'?\"\a\b\f\n\r\t\v\001\201\001\201??!", expecting a
+AT_PARSER_CHECK([input], 1, [],
+[[syntax error, unexpected a, expecting ]AT_ERROR_VERBOSE_IF([["\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"]], [[∃¬∩∪∀]])[
 ]])
-AT_PARSER_CHECK([input], 1, [], [experr])
+
+AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
+])
 
+AT_TEST([%define parse.error detailed])
+AT_TEST([%define parse.error verbose])
 
+m4_popdef([AT_TEST])
 
 ## -------------------- ##
 ## Characters Escapes.  ##
@@ -628,7 +644,7 @@
 # extremely specific situations.  web2c.y exhibits this situation.
 # Below is a stripped version of the grammar.  It looks like one can
 # simplify it further, but just don't: it is tuned to exhibit a bug,
-# which disapears when applying sane grammar transformations.
+# which disappears when applying sane grammar transformations.
 #
 # It used to be wrong on yydefact only:
 #
@@ -658,7 +674,7 @@
 AT_BISON_CHECK([-v -o input.c input.y])
 
 # Check only the tables.
-[sed -n 's/  *$//;/^static const.*\[\] =/,/^}/p' input.c >tables.c]
+[sed -n 's/  *$//;/^static const.*\[\] =/,/^}/p;/#define YY.*NINF/p' input.c >tables.c]
 
 AT_CHECK([[cat tables.c]], 0,
 [[static const yytype_int8 yytranslate[] =
@@ -697,13 +713,12 @@
 };
 static const char *const yytname[] =
 {
-  "$end", "error", "$undefined", "\"if\"", "\"const\"", "\"then\"",
-  "\"else\"", "$accept", "statement", "struct_stat", "if", "else", YY_NULLPTR
+  "\"end of file\"", "error", "\"invalid token\"", "\"if\"", "\"const\"",
+  "\"then\"", "\"else\"", "$accept", "statement", "struct_stat", "if",
+  "else", YY_NULLPTR
 };
-static const yytype_int16 yytoknum[] =
-{
-       0,   256,   257,   258,   259,   260,   261
-};
+#define YYPACT_NINF (-8)
+#define YYTABLE_NINF (-1)
 static const yytype_int8 yypact[] =
 {
       -2,    -1,     4,    -8,     0,     2,    -8,    -2,    -8,    -2,
@@ -720,7 +735,7 @@
 };
 static const yytype_int8 yydefgoto[] =
 {
-      -1,     2,     3,     4,     8
+       0,     2,     3,     4,     8
 };
 static const yytype_int8 yytable[] =
 {
@@ -748,6 +763,300 @@
 AT_CLEANUP
 
 
+## ---------------- ##
+## Useless Tokens.  ##
+## ---------------- ##
+
+# In some extreme situations, with lots of useless tokens, Bison was
+# numbering them incorrectly, which resulted in a broken grammar.
+# <https://lists.gnu.org/r/bison-patches/2021-03/msg00001.html>
+# commit a774839ca873d1082f79ba3c4eecc1e242a28ce1.
+#
+# To track this failure, compare the tables between an incorrect
+# version of Bison (e.g., 3.7.5), and a correct one:
+#
+# LC_ALL=C /usr/local/stow/bison-3.7.5/bin/bison input.y -o old.c &&
+# LC_ALL=C                                 bison input.y -o new.c &&
+# sed -n 's/  *$//;/^static const.*\[\] =/,/^}/p' old.c >old.tables &&
+# sed -n 's/  *$//;/^static const.*\[\] =/,/^}/p' new.c >new.tables &&
+# diff old.tables new.tables
+#
+# The following Ruby script normalizes token and nterm names.
+#
+# #! /usr/bin/env ruby
+#
+# require 'strscan'
+#
+# tokens = {}
+# nterms = {}
+#
+# ARGV.each do |file|
+#   s = StringScanner.new File.read(file)
+#   while !s.eos?
+#     $stdout <<
+#       case
+#       when s.scan(/%\w+/)
+#         s.matched
+#       when s.scan(/[A-Z_0-9]+/)
+#         tokens[s.matched] ||= 'T%02d' % tokens.size
+#       when s.scan(/[a-z_0-9]+/)
+#         nterms[s.matched] ||= 'n%02d' % nterms.size
+#       when s.scan(/.|\n/)
+#         s.matched
+#       else
+#         raise "error: #{s.rest}"
+#       end
+#   end
+# end
+
+AT_SETUP([Useless Tokens])
+
+AT_DATA([input.y],
+[[%token
+  T00 T01 T02 T03 T04 T05 T06 T07 T08 T09 T10 T11 T12 T13 T14 T15 T16
+  T17 T18 T19 T20 T21 T22 T23 T24 T25 T26 T27 T28 T29 T30 T31 T32 T33
+  T34 T35 T36 T37 T38 T39 T40 T41 T42 T43 T44 T45 T46 T47 T48 T49 T50
+  T51 T52 T53 T54 T55 T56 T57 T58 T59 T60 T61 T62 T63 T64 T65 T66 T67
+  T68 T69 T70 T71 T72 T73 T74 T75 T76 T77 T78 T79 T80 T81 T82 T83 T84
+  T85 T86 T87 T88 T89 T90
+
+%%
+
+n00: T00 n01;
+n01: T77 T88 n02 T89;
+n02: n03 n02 | %empty;
+n03: T16 T88 n04 T89 | T79 T88 n05 T89 | T78 T88 n06 T89 | T81 T88 n07 T89 | T82 T88 n05 T89 | T83 T88 n05 T89 | T84 T88 n05 T89 | T80 T88 n08 T89 | n09;
+n04: n10 n04 | %empty;
+n05: T58 | T61;
+n06: n10
+n07: n05 | n11;
+n08: n12;
+n09: T30 T88 n05 T89;
+n11: n13 n11 | %empty;
+n13: T85 T88 n05 T89 | T86 T88 n08 T89;
+n10: n05;
+n14: %empty;
+n15: n16 T90 n15;
+n16: n17;
+n18: T58;
+n17: T07 T88 n19 T89;
+n19: n20;
+n20: n21 n20;
+n21: T13 T88 n22 T89;
+n22: n23;
+n24: n25;
+n25: n26 T90 n25 | n27 T90 n25;
+n26: n28;
+n28: T58;
+n29: n30 T90 n29;
+n30: T02 T88 n05 T89;
+n31: T04 T88 n32 T89;
+n33: n32;
+n32: n27 T90 n32;
+n27: T03 T88 n34 T89;
+n35: n36;
+n36: T05 T88 n34 T89 | n36 T06 T88 n34 T89;
+n34: n29 n33 n37;
+n37: T16 T88 n38 T89 T90;
+n38: n10 n38;
+n39: n05 | T58 T88 n05 T89;
+n40: n39;
+n41: n40 n41;
+n42: T48;
+n43: n42;
+n44: T59;
+n45: n44;
+n23: T59;
+n46: T60;
+n47: T60;
+n48: n05;
+n49: n05;
+n50: n49;
+n51: n49;
+n52: n05;
+n12: n05 n12 | %empty;
+n53: n05;
+n54: n05;
+n55: T15 T88 n05 T89;
+n56: T58;
+n57: n56;
+n58: T58;
+n59: T13 T88 n22 T89;
+n60: T75 T88 n22 T89;
+n61: T18 T88 n05 T89;
+n62: T76 T88 n46 T89;
+n63: n05 n63;
+n64: T14 T88 n22 T89;
+n65: T10 T88 n42 T89;
+n66: n05 n66;
+n67: T08 T88 n05 T89;
+n68: T11 T88 n42 T89;
+n69: T17 T88 n05 T89;
+n70: n71 n70;
+n71: T16 T88 n72 T89;
+n72: n10 n72;
+n73: T24 T88 n48 T89;
+n74: T12 T88 n05 T89;
+n75: T09 T88 n05 T89;
+n76: n05 n76;
+n77: T64 T88 n78 T89;
+n78: n79 n78;
+n79: T66 T88 n05 n40 T89;
+n80: n05 n80;
+n81: n82 n81;
+n82: T69 T88 n22 T89;
+n83: T47 T88 n05 T89;
+n84: T46 T88 T89;
+]])
+
+AT_BISON_CHECK([-Wno-other -o input.c input.y])
+
+# Check only the tables.
+[sed -n 's/  *$//;/^static const.*\[\] =/,/^}/p;/#define YY.*NINF/p' input.c >tables.c]
+
+AT_CHECK([[cat tables.c]], 0,
+[[static const yytype_int8 yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+      85,    86,    87,    88,    89,    90,    91,    92,    93
+};
+static const yytype_int8 yyrline[] =
+{
+       0,    11,    11,    12,    13,    13,    14,    14,    14,    14,
+      14,    14,    14,    14,    14,    15,    15,    16,    16,    17,
+      18,    18,    19,    20,    21,    21,    22,    22,    23,    63,
+      63
+};
+static const char *const yytname[] =
+{
+  "\"end of file\"", "error", "\"invalid token\"", "T00", "T01", "T02",
+  "T03", "T04", "T05", "T06", "T07", "T08", "T09", "T10", "T11", "T12",
+  "T13", "T14", "T15", "T16", "T17", "T18", "T19", "T20", "T21", "T22",
+  "T23", "T24", "T25", "T26", "T27", "T28", "T29", "T30", "T31", "T32",
+  "T33", "T34", "T35", "T36", "T37", "T38", "T39", "T40", "T41", "T42",
+  "T43", "T44", "T45", "T46", "T47", "T48", "T49", "T50", "T51", "T52",
+  "T53", "T54", "T55", "T56", "T57", "T58", "T59", "T60", "T61", "T62",
+  "T63", "T64", "T65", "T66", "T67", "T68", "T69", "T70", "T71", "T72",
+  "T73", "T74", "T75", "T76", "T77", "T78", "T79", "T80", "T81", "T82",
+  "T83", "T84", "T85", "T86", "T87", "T88", "T89", "T90", "$accept", "n00",
+  "n01", "n02", "n03", "n04", "n05", "n06", "n07", "n08", "n09", "n11",
+  "n13", "n10", "n12", YY_NULLPTR
+};
+#define YYPACT_NINF (-78)
+#define YYTABLE_NINF (-1)
+static const yytype_int8 yypact[] =
+{
+      -2,   -77,    11,   -73,   -78,   -78,   -19,   -71,   -69,   -68,
+     -67,   -66,   -65,   -64,   -63,   -62,   -61,   -19,   -78,   -49,
+     -49,   -49,   -49,   -49,   -51,   -49,   -49,   -49,   -78,   -78,
+     -78,   -78,   -60,   -78,   -49,   -59,   -58,   -78,   -57,   -49,
+     -56,   -78,   -52,   -48,   -78,   -50,   -78,   -72,   -47,   -46,
+     -45,   -78,   -78,   -78,   -78,   -78,   -78,   -78,   -49,   -49,
+     -78,   -78,   -78,   -78,   -78,   -44,   -43,   -78,   -78
+};
+static const yytype_int8 yydefact[] =
+{
+       0,     0,     0,     0,     2,     1,     5,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     5,    14,    16,
+       0,     0,     0,    30,    25,     0,     0,     0,     3,     4,
+      17,    18,     0,    28,    16,     0,     0,    19,     0,    30,
+       0,    22,     0,     0,    20,     0,    21,    25,     0,     0,
+       0,     6,    15,    23,     8,     7,    29,    13,     0,    30,
+       9,    24,    10,    11,    12,     0,     0,    26,    27
+};
+static const yytype_int8 yypgoto[] =
+{
+     -78,   -78,   -78,     2,   -78,    -4,   -18,   -78,   -78,   -15,
+     -78,     3,   -78,    30,    13
+};
+static const yytype_int8 yydefgoto[] =
+{
+       0,     2,     4,    16,    17,    32,    33,    36,    45,    40,
+      18,    46,    47,    34,    41
+};
+static const yytype_int8 yytable[] =
+{
+       7,     1,    35,     3,    38,    39,    44,    48,    49,    50,
+      30,     5,    30,    31,     8,    31,    42,    43,     6,    29,
+      19,    39,    20,    21,    22,    23,    24,    25,    26,    27,
+      52,    28,    51,    53,    54,    55,    57,    42,    43,    58,
+      65,    39,    60,    59,    66,    62,    63,    64,    67,    68,
+      61,    37,    56,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     9,    10,    11,    12,    13,    14,    15
+};
+static const yytype_int8 yycheck[] =
+{
+      19,     3,    20,    80,    22,    23,    24,    25,    26,    27,
+      61,     0,    61,    64,    33,    64,    88,    89,    91,    17,
+      91,    39,    91,    91,    91,    91,    91,    91,    91,    91,
+      34,    92,    92,    92,    92,    92,    92,    88,    89,    91,
+      58,    59,    92,    91,    59,    92,    92,    92,    92,    92,
+      47,    21,    39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    81,    82,    83,    84,    85,    86,    87
+};
+static const yytype_int8 yystos[] =
+{
+       0,     3,    95,    80,    96,     0,    91,    19,    33,    81,
+      82,    83,    84,    85,    86,    87,    97,    98,   104,    91,
+      91,    91,    91,    91,    91,    91,    91,    91,    92,    97,
+      61,    64,    99,   100,   107,   100,   101,   107,   100,   100,
+     103,   108,    88,    89,   100,   102,   105,   106,   100,   100,
+     100,    92,    99,    92,    92,    92,   108,    92,    91,    91,
+      92,   105,    92,    92,    92,   100,   103,    92,    92
+};
+static const yytype_int8 yyr1[] =
+{
+       0,    94,    95,    96,    97,    97,    98,    98,    98,    98,
+      98,    98,    98,    98,    98,    99,    99,   100,   100,   101,
+     102,   102,   103,   104,   105,   105,   106,   106,   107,   108,
+     108
+};
+static const yytype_int8 yyr2[] =
+{
+       0,     2,     2,     4,     2,     0,     4,     4,     4,     4,
+       4,     4,     4,     4,     1,     2,     0,     1,     1,     1,
+       1,     1,     1,     4,     2,     0,     4,     4,     1,     2,
+       0
+};
+]])
+
+AT_CLEANUP
+
+
+
 ## ------------------------- ##
 ## yycheck Bound Violation.  ##
 ## ------------------------- ##
@@ -956,12 +1265,14 @@
 ]],
 [[Starting parse
 Entering state 0
+Stack now 0
 Reducing stack by rule 1 (line 20):
 -> $$ = nterm start ()
-Stack now 0
 Entering state 1
-Reading a token: Next token is token 'a' (PRINTER)
-syntax error, unexpected 'a', expecting $end
+Stack now 0 1
+Reading a token
+Next token is token 'a' (PRINTER)
+syntax error, unexpected 'a', expecting end of file
 Error: popping nterm start ()
 Stack now 0
 Cleanup: discarding lookahead token 'a' (PRINTER)
@@ -1171,7 +1482,7 @@
 AT_COMPILE([[input]])
 AT_PARSER_CHECK([[input]], [[1]], [],
 [[syntax error, unexpected 'a', expecting 123456789112345678921234567893123456789412345678951234567896123A or 123456789112345678921234567893123456789412345678951234567896123B
-syntax error, unexpected $end, expecting 123456789112345678921234567893123456789412345678951234567896123A or 123456789112345678921234567893123456789412345678951234567896123B
+syntax error, unexpected end of file, expecting 123456789112345678921234567893123456789412345678951234567896123A or 123456789112345678921234567893123456789412345678951234567896123B
 ]])
 
 AT_CLEANUP
@@ -1219,7 +1530,7 @@
 
 %%
 
-start: syntax_error1 check syntax_error2 ;
+start: syntax_error1 check syntax_error2 check syntax_error3;
 
 // Induce a syntax error message whose total length causes yymsg in
 // yyparse to be reallocated to size YYSTACK_ALLOC_MAXIMUM, which
@@ -1251,13 +1562,26 @@
 }
 ;
 
-// Now overflow.
+// We used to overflow memory here because the first four "expected"
+// tokens plus rest of the error message is greater that 255 bytes.
+// However there are *five* expected tokens here, so anyway we will
+// *not* display these tokens.  So the message fits, no overflow.
 syntax_error2:
   "123456789112345678921234567893123456789412345678951234567896123A"
 | "123456789112345678921234567893123456789412345678951234567896123B"
 | "123456789112345678921234567893123456789412345678951234567896123C"
 | "123456789112345678921234567893123456789412345678951234567896123D"
 | "123456789112345678921234567893123456789412345678951234567896123E"
+| error 'd' 'e' 'f'
+;
+
+
+// Now overflow.
+syntax_error3:
+  "123456789112345678921234567893123456789412345678951234567896123A"
+| "123456789112345678921234567893123456789412345678951234567896123B"
+| "123456789112345678921234567893123456789412345678951234567896123C"
+| "123456789112345678921234567893123456789412345678951234567896123D"
 ;
 
 %%
@@ -1265,7 +1589,7 @@
 ]AT_YYERROR_DEFINE[
   /* Induce two syntax error messages (which requires full error
      recovery by shifting 3 tokens).  */
-]AT_YYLEX_DEFINE(["abc"])[
+]AT_YYLEX_DEFINE(["abcdef"])[
 int
 main (void)
 {
@@ -1288,6 +1612,7 @@
 
 AT_PARSER_CHECK([[input]], [[2]], [],
 [[syntax error, unexpected 'a', expecting 123456789112345678921234567893123456789412345678951234567896123A or 123456789112345678921234567893123456789412345678951234567896123B or 123456789112345678921234567893123456789412345678951234567896123C
+syntax error, unexpected 'd'
 syntax error
 memory exhausted
 ]])
@@ -1308,11 +1633,24 @@
 AT_BISON_OPTION_PUSHDEFS([%debug $1])
 
 AT_DATA_GRAMMAR([input.y],
+[AT_LANG_CASE(
+[d], [[%define api.symbol.prefix {SYM_}
+]],
+[java], [[%code imports {
+  import java.io.IOException;
+}
+
+%code lexer {
+]AT_YYERROR_DEFINE[
+]AT_YYLEX_DEFINE(["bbbbc"])[
+};
+]],
 [[%code {
 #include <stdio.h> /* printf */
   ]AT_YYERROR_DECLARE[
   ]AT_YYLEX_DECLARE[
 }
+]])[
 %debug
 ]$1[
 %define parse.error verbose
@@ -1326,13 +1664,15 @@
 //       ^                     ^                               ^
 // LAC reallocs
 
-A: 'a' | %empty { printf ("inconsistent default reduction\n"); } ;
+A: 'a' | %empty { ]AT_JAVA_IF([System.out.print], [printf])[ ("inconsistent default reduction\n"); } ;
 B: 'b' ;
-C: %empty { printf ("consistent default reduction\n"); } ;
+C: %empty { ]AT_JAVA_IF([System.out.print], [printf])[ ("consistent default reduction\n"); } ;
 
 %%
-]AT_YYERROR_DEFINE[
-]AT_YYLEX_DEFINE(["bbbbc"])[
+]AT_JAVA_IF([], [[
+  ]AT_YYERROR_DEFINE[
+  ]AT_YYLEX_DEFINE(["bbbbc"])[
+]])[
 
 ]AT_MAIN_DEFINE[
 ]])
@@ -1369,13 +1709,23 @@
 AT_BISON_OPTION_POPDEFS
 ])
 
+# C.
 AT_LAC_CHECK([[%define api.push-pull pull]])
 AT_LAC_CHECK([[%define api.push-pull pull %define api.pure]])
 AT_LAC_CHECK([[%define api.push-pull both]])
 AT_LAC_CHECK([[%define api.push-pull both %define api.pure]])
 
+# C++.
 AT_LAC_CHECK([[%skeleton "lalr1.cc"]])
 
+# D.
+# FIXME: does not work.  lalr1.d cannot work with literal chars,
+# and AT_YYLEX_DEFINE(d) is incorrect.
+# AT_LAC_CHECK([[%skeleton "lalr1.d"]])
+
+# Java.
+AT_LAC_CHECK([[%skeleton "lalr1.java"]])
+
 m4_popdef([AT_LAC_CHECK])
 
 AT_CLEANUP
@@ -1422,11 +1772,13 @@
 AT_PARSER_CHECK([[input --debug]], [[2]], [],
 [[Starting parse
 Entering state 0
-Reading a token: Now at end of input.
-LAC: initial context established for $end
-LAC: checking lookahead $end: R2 G3 R2 G5 R2 G6 R2 G7 R2 G8 R2 G9 R2 G10 R2 G11 R2 (max size exceeded)
+Stack now 0
+Reading a token
+Now at end of input.
+LAC: initial context established for "end of file"
+LAC: checking lookahead "end of file": R2 G3 R2 G5 R2 G6 R2 G7 R2 G8 R2 G9 R2 G10 R2 G11 R2 (max size exceeded)
 memory exhausted
-Cleanup: discarding lookahead token $end ()
+Cleanup: discarding lookahead token "end of file" ()
 Stack now 0
 ]])
 
@@ -1436,14 +1788,16 @@
 AT_PARSER_CHECK([[input --debug]], [[2]], [],
 [[Starting parse
 Entering state 0
-Reading a token: Next token is token $undefined ()
-LAC: initial context established for $undefined
-LAC: checking lookahead $undefined: Always Err
+Stack now 0
+Reading a token
+Next token is token "invalid token" ()
+LAC: initial context established for "invalid token"
+LAC: checking lookahead "invalid token": Always Err
 Constructing syntax error message
-LAC: checking lookahead $end: R2 G3 R2 G5 R2 G6 R2 G7 R2 G8 R2 G9 R2 G10 R2 G11 R2 (max size exceeded)
+LAC: checking lookahead "end of file": R2 G3 R2 G5 R2 G6 R2 G7 R2 G8 R2 G9 R2 G10 R2 G11 R2 (max size exceeded)
 syntax error
 memory exhausted
-Cleanup: discarding lookahead token $undefined ()
+Cleanup: discarding lookahead token "invalid token" ()
 Stack now 0
 ]])
 
@@ -1468,7 +1822,8 @@
 AT_BISON_OPTION_PUSHDEFS([%locations %skeleton "$1" %parse-param { int x } %parse-param { int y }])
 
 AT_DATA_GRAMMAR([input.y],
-[[%locations
+[[%header
+%locations
 %skeleton "$1"
 %union { int ival; }
 %parse-param { int x }
@@ -1520,6 +1875,7 @@
 AT_TEST([glr.c])
 AT_TEST([lalr1.cc])
 AT_TEST([glr.cc])
+AT_TEST([glr2.cc])
 
 m4_popdef([AT_TEST])
 
diff --git a/tests/report.at b/tests/report.at
index ebc80e1..83c418f 100644
--- a/tests/report.at
+++ b/tests/report.at
@@ -1,6 +1,6 @@
 # Bison Reports.                               -*- Autotest -*-
 
-# Copyright (C) 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,10 +13,23 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[Test reports.]])
 
+
+# AT_CHECK_HTML(FILE, EXPECTED-CONTENT)
+# -------------------------------------
+# Old versions of xsltproc emit 'content="text/html; charset=UTF-8"'
+# instead of 'content="text/html;charset=UTF-8"'.
+# <https://trac.macports.org/raw-attachment/ticket/59927/bison-test-results-20210811-95b72.log.xz>
+m4_define([AT_CHECK_HTML],
+[AT_KEYWORDS([html])
+AT_CHECK([sed -e 's|content="text/html; charset=UTF-8"|content="text/html;charset=UTF-8"|g' $1],
+          [],
+          [$2])])
+
+
 ## --------- ##
 ## Reports.  ##
 ## --------- ##
@@ -59,7 +72,8 @@
 | "number"      { std::swap ($$, $1); };
 ]])
 
-AT_BISON_CHECK([-o input.cc -v --graph=input.gv --xml input.yy])
+AT_SKIP_IF([[test x"$XSLTPROC" = x]])
+AT_BISON_CHECK([-o input.cc -v --graph=input.gv --html --xml input.yy])
 
 # Check the contents of the report.
 AT_CHECK([cat input.output], [],
@@ -304,7 +318,8 @@
 
 
 # Now generate verbose reports.
-AT_BISON_CHECK([-o input.cc -rall --graph=input.gv --xml input.yy])
+AT_SKIP_IF([[test x"$XSLTPROC" = x]])
+AT_BISON_CHECK([-o input.cc -rall --graph=input.gv --html --xml input.yy])
 
 # Check the contents of the report.
 AT_CHECK([cat input.output], [],
@@ -374,7 +389,7 @@
 
     0 $accept: . unit "end of file"
     1 unit: . assignments exp
-    2 assignments: . %empty
+    2 assignments: %empty .
     3            | . assignments assignment
 
     $default  reduce using rule 2 (assignments)
@@ -496,7 +511,7 @@
 
 State 12
 
-    6 @1: . %empty
+    6 @1: %empty .
     8 exp: "incr" exp . @1 @2 exp
 
     $default  reduce using rule 6 (@1)
@@ -529,7 +544,7 @@
 
 State 15
 
-    7 @2: . %empty
+    7 @2: %empty .
     8 exp: "incr" exp @1 . @2 exp
 
     $default  reduce using rule 7 (@2)
@@ -576,24 +591,24 @@
 
 
 
-AT_CHECK([sed -e '1s/GNU Bison .*\.$/GNU Bison VERSION./' input.gv], [],
-[[// Generated by GNU Bison VERSION.
+AT_CHECK([cat input.gv], [],
+[[// Generated by GNU Bison ]AT_PACKAGE_VERSION[.
 // Report bugs to <bug-bison@gnu.org>.
-// Home page: <http://www.gnu.org/software/bison/>.
+// Home page: <https://www.gnu.org/software/bison/>.
 
 digraph "input.yy"
 {
   node [fontname = courier, shape = box, colorscheme = paired6]
   edge [fontname = courier]
 
-  0 [label="State 0\n\l  0 $accept: . unit \"end of file\"\l  1 unit: . assignments exp\l  2 assignments: . %empty\l  3            | . assignments assignment\l"]
+  0 [label="State 0\n\l  0 $accept: • unit \"end of file\"\l  1 unit: • assignments exp\l  2 assignments: • %empty\l  3            | • assignments assignment\l"]
   0 -> 1 [style=dashed label="unit"]
   0 -> 2 [style=dashed label="assignments"]
   0 -> "0R2" [style=solid]
  "0R2" [label="R2", fillcolor=3, shape=diamond, style=filled]
-  1 [label="State 1\n\l  0 $accept: unit . \"end of file\"\l"]
+  1 [label="State 1\n\l  0 $accept: unit • \"end of file\"\l"]
   1 -> 3 [style=solid label="\"end of file\""]
-  2 [label="State 2\n\l  1 unit: assignments . exp\l  3 assignments: assignments . assignment\l  4 assignment: . id \":=\" exp\l  5 id: . \"identifier\"\l  8 exp: . \"incr\" exp @1 @2 exp\l  9    | . \"(\" exp \")\"\l 10    | . \"identifier\"\l 11    | . \"number\"\l"]
+  2 [label="State 2\n\l  1 unit: assignments • exp\l  3 assignments: assignments • assignment\l  4 assignment: • id \":=\" exp\l  5 id: • \"identifier\"\l  8 exp: • \"incr\" exp @1 @2 exp\l  9    | • \"(\" exp \")\"\l 10    | • \"identifier\"\l 11    | • \"number\"\l"]
   2 -> 4 [style=solid label="\"incr\""]
   2 -> 5 [style=solid label="\"identifier\""]
   2 -> 6 [style=solid label="\"number\""]
@@ -601,79 +616,79 @@
   2 -> 8 [style=dashed label="assignment"]
   2 -> 9 [style=dashed label="id"]
   2 -> 10 [style=dashed label="exp"]
-  3 [label="State 3\n\l  0 $accept: unit \"end of file\" .\l"]
+  3 [label="State 3\n\l  0 $accept: unit \"end of file\" •\l"]
   3 -> "3R0" [style=solid]
  "3R0" [label="Acc", fillcolor=1, shape=diamond, style=filled]
-  4 [label="State 4\n\l  8 exp: . \"incr\" exp @1 @2 exp\l  8    | \"incr\" . exp @1 @2 exp\l  9    | . \"(\" exp \")\"\l 10    | . \"identifier\"\l 11    | . \"number\"\l"]
+  4 [label="State 4\n\l  8 exp: • \"incr\" exp @1 @2 exp\l  8    | \"incr\" • exp @1 @2 exp\l  9    | • \"(\" exp \")\"\l 10    | • \"identifier\"\l 11    | • \"number\"\l"]
   4 -> 4 [style=solid label="\"incr\""]
   4 -> 11 [style=solid label="\"identifier\""]
   4 -> 6 [style=solid label="\"number\""]
   4 -> 7 [style=solid label="\"(\""]
   4 -> 12 [style=dashed label="exp"]
-  5 [label="State 5\n\l  5 id: \"identifier\" .  [\":=\"]\l 10 exp: \"identifier\" .  [\"end of file\"]\l"]
+  5 [label="State 5\n\l  5 id: \"identifier\" •  [\":=\"]\l 10 exp: \"identifier\" •  [\"end of file\"]\l"]
   5 -> "5R5" [style=solid]
  "5R5" [label="R5", fillcolor=3, shape=diamond, style=filled]
   5 -> "5R10" [label="[\"end of file\"]", style=solid]
  "5R10" [label="R10", fillcolor=3, shape=diamond, style=filled]
-  6 [label="State 6\n\l 11 exp: \"number\" .\l"]
+  6 [label="State 6\n\l 11 exp: \"number\" •\l"]
   6 -> "6R11" [style=solid]
  "6R11" [label="R11", fillcolor=3, shape=diamond, style=filled]
-  7 [label="State 7\n\l  8 exp: . \"incr\" exp @1 @2 exp\l  9    | . \"(\" exp \")\"\l  9    | \"(\" . exp \")\"\l 10    | . \"identifier\"\l 11    | . \"number\"\l"]
+  7 [label="State 7\n\l  8 exp: • \"incr\" exp @1 @2 exp\l  9    | • \"(\" exp \")\"\l  9    | \"(\" • exp \")\"\l 10    | • \"identifier\"\l 11    | • \"number\"\l"]
   7 -> 4 [style=solid label="\"incr\""]
   7 -> 11 [style=solid label="\"identifier\""]
   7 -> 6 [style=solid label="\"number\""]
   7 -> 7 [style=solid label="\"(\""]
   7 -> 13 [style=dashed label="exp"]
-  8 [label="State 8\n\l  3 assignments: assignments assignment .\l"]
+  8 [label="State 8\n\l  3 assignments: assignments assignment •\l"]
   8 -> "8R3" [style=solid]
  "8R3" [label="R3", fillcolor=3, shape=diamond, style=filled]
-  9 [label="State 9\n\l  4 assignment: id . \":=\" exp\l"]
+  9 [label="State 9\n\l  4 assignment: id • \":=\" exp\l"]
   9 -> 14 [style=solid label="\":=\""]
-  10 [label="State 10\n\l  1 unit: assignments exp .\l"]
+  10 [label="State 10\n\l  1 unit: assignments exp •\l"]
   10 -> "10R1" [style=solid]
  "10R1" [label="R1", fillcolor=3, shape=diamond, style=filled]
-  11 [label="State 11\n\l 10 exp: \"identifier\" .\l"]
+  11 [label="State 11\n\l 10 exp: \"identifier\" •\l"]
   11 -> "11R10" [style=solid]
  "11R10" [label="R10", fillcolor=3, shape=diamond, style=filled]
-  12 [label="State 12\n\l  6 @1: . %empty\l  8 exp: \"incr\" exp . @1 @2 exp\l"]
+  12 [label="State 12\n\l  6 @1: • %empty\l  8 exp: \"incr\" exp • @1 @2 exp\l"]
   12 -> 15 [style=dashed label="@1"]
   12 -> "12R6" [style=solid]
  "12R6" [label="R6", fillcolor=3, shape=diamond, style=filled]
-  13 [label="State 13\n\l  9 exp: \"(\" exp . \")\"\l"]
+  13 [label="State 13\n\l  9 exp: \"(\" exp • \")\"\l"]
   13 -> 16 [style=solid label="\")\""]
-  14 [label="State 14\n\l  4 assignment: id \":=\" . exp\l  8 exp: . \"incr\" exp @1 @2 exp\l  9    | . \"(\" exp \")\"\l 10    | . \"identifier\"\l 11    | . \"number\"\l"]
+  14 [label="State 14\n\l  4 assignment: id \":=\" • exp\l  8 exp: • \"incr\" exp @1 @2 exp\l  9    | • \"(\" exp \")\"\l 10    | • \"identifier\"\l 11    | • \"number\"\l"]
   14 -> 4 [style=solid label="\"incr\""]
   14 -> 11 [style=solid label="\"identifier\""]
   14 -> 6 [style=solid label="\"number\""]
   14 -> 7 [style=solid label="\"(\""]
   14 -> 17 [style=dashed label="exp"]
-  15 [label="State 15\n\l  7 @2: . %empty\l  8 exp: \"incr\" exp @1 . @2 exp\l"]
+  15 [label="State 15\n\l  7 @2: • %empty\l  8 exp: \"incr\" exp @1 • @2 exp\l"]
   15 -> 18 [style=dashed label="@2"]
   15 -> "15R7" [style=solid]
  "15R7" [label="R7", fillcolor=3, shape=diamond, style=filled]
-  16 [label="State 16\n\l  9 exp: \"(\" exp \")\" .\l"]
+  16 [label="State 16\n\l  9 exp: \"(\" exp \")\" •\l"]
   16 -> "16R9" [style=solid]
  "16R9" [label="R9", fillcolor=3, shape=diamond, style=filled]
-  17 [label="State 17\n\l  4 assignment: id \":=\" exp .\l"]
+  17 [label="State 17\n\l  4 assignment: id \":=\" exp •\l"]
   17 -> "17R4" [style=solid]
  "17R4" [label="R4", fillcolor=3, shape=diamond, style=filled]
-  18 [label="State 18\n\l  8 exp: . \"incr\" exp @1 @2 exp\l  8    | \"incr\" exp @1 @2 . exp\l  9    | . \"(\" exp \")\"\l 10    | . \"identifier\"\l 11    | . \"number\"\l"]
+  18 [label="State 18\n\l  8 exp: • \"incr\" exp @1 @2 exp\l  8    | \"incr\" exp @1 @2 • exp\l  9    | • \"(\" exp \")\"\l 10    | • \"identifier\"\l 11    | • \"number\"\l"]
   18 -> 4 [style=solid label="\"incr\""]
   18 -> 11 [style=solid label="\"identifier\""]
   18 -> 6 [style=solid label="\"number\""]
   18 -> 7 [style=solid label="\"(\""]
   18 -> 19 [style=dashed label="exp"]
-  19 [label="State 19\n\l  8 exp: \"incr\" exp @1 @2 exp .\l"]
+  19 [label="State 19\n\l  8 exp: \"incr\" exp @1 @2 exp •\l"]
   19 -> "19R8" [style=solid]
  "19R8" [label="R8", fillcolor=3, shape=diamond, style=filled]
 }
 ]])
 
 
-AT_CHECK([[sed -e 's/bison-xml-report version="[^"]*"/bison-xml-report version="VERSION"/g' input.xml]], [],
+AT_CHECK([[cat input.xml]], [],
 [[<?xml version="1.0"?>
 
-<bison-xml-report version="VERSION" bug-report="bug-bison@gnu.org" url="http://www.gnu.org/software/bison/">
+<bison-xml-report version="]AT_PACKAGE_VERSION[" bug-report="bug-bison@gnu.org" url="https://www.gnu.org/software/bison/">
 
   <filename>input.yy</filename>
 
@@ -764,24 +779,24 @@
       </rule>
     </rules>
     <terminals>
-      <terminal symbol-number="0" token-number="0" name="&quot;end of file&quot;" usefulness="useful"/>
-      <terminal symbol-number="1" token-number="256" name="error" usefulness="useful"/>
-      <terminal symbol-number="3" token-number="258" name="&quot;:=&quot;" usefulness="useful"/>
-      <terminal symbol-number="4" token-number="259" name="&quot;incr&quot;" usefulness="useful"/>
-      <terminal symbol-number="5" token-number="260" name="&quot;identifier&quot;" usefulness="useful"/>
-      <terminal symbol-number="6" token-number="261" name="&quot;number&quot;" usefulness="useful"/>
-      <terminal symbol-number="7" token-number="262" name="&quot;(&quot;" usefulness="useful"/>
-      <terminal symbol-number="8" token-number="263" name="&quot;)&quot;" usefulness="useful"/>
+      <terminal symbol-number="0" token-number="0" name="&quot;end of file&quot;" type="" usefulness="useful"/>
+      <terminal symbol-number="1" token-number="256" name="error" type="" usefulness="useful"/>
+      <terminal symbol-number="3" token-number="258" name="&quot;:=&quot;" type="" usefulness="useful"/>
+      <terminal symbol-number="4" token-number="259" name="&quot;incr&quot;" type="" usefulness="useful"/>
+      <terminal symbol-number="5" token-number="260" name="&quot;identifier&quot;" type="std::string" usefulness="useful"/>
+      <terminal symbol-number="6" token-number="261" name="&quot;number&quot;" type="int" usefulness="useful"/>
+      <terminal symbol-number="7" token-number="262" name="&quot;(&quot;" type="" usefulness="useful"/>
+      <terminal symbol-number="8" token-number="263" name="&quot;)&quot;" type="" usefulness="useful"/>
     </terminals>
     <nonterminals>
-      <nonterminal symbol-number="9" name="$accept" usefulness="useful"/>
-      <nonterminal symbol-number="10" name="unit" usefulness="useful"/>
-      <nonterminal symbol-number="11" name="assignments" usefulness="useful"/>
-      <nonterminal symbol-number="12" name="assignment" usefulness="useful"/>
-      <nonterminal symbol-number="13" name="id" usefulness="useful"/>
-      <nonterminal symbol-number="14" name="exp" usefulness="useful"/>
-      <nonterminal symbol-number="15" name="@1" usefulness="useful"/>
-      <nonterminal symbol-number="16" name="@2" usefulness="useful"/>
+      <nonterminal symbol-number="9" name="$accept" type="" usefulness="useful"/>
+      <nonterminal symbol-number="10" name="unit" type="" usefulness="useful"/>
+      <nonterminal symbol-number="11" name="assignments" type="" usefulness="useful"/>
+      <nonterminal symbol-number="12" name="assignment" type="" usefulness="useful"/>
+      <nonterminal symbol-number="13" name="id" type="std::string" usefulness="useful"/>
+      <nonterminal symbol-number="14" name="exp" type="int" usefulness="useful"/>
+      <nonterminal symbol-number="15" name="@1" type="int" usefulness="useful"/>
+      <nonterminal symbol-number="16" name="@2" type="int" usefulness="useful"/>
     </nonterminals>
   </grammar>
 
@@ -789,10 +804,10 @@
 
     <state number="0">
       <itemset>
-        <item rule-number="0" point="0"/>
-        <item rule-number="1" point="0"/>
-        <item rule-number="2" point="0"/>
-        <item rule-number="3" point="0"/>
+        <item rule-number="0" dot="0"/>
+        <item rule-number="1" dot="0"/>
+        <item rule-number="2" dot="0"/>
+        <item rule-number="3" dot="0"/>
       </itemset>
       <actions>
         <transitions>
@@ -809,7 +824,7 @@
 
     <state number="1">
       <itemset>
-        <item rule-number="0" point="1"/>
+        <item rule-number="0" dot="1"/>
       </itemset>
       <actions>
         <transitions>
@@ -823,14 +838,14 @@
 
     <state number="2">
       <itemset>
-        <item rule-number="1" point="1"/>
-        <item rule-number="3" point="1"/>
-        <item rule-number="4" point="0"/>
-        <item rule-number="5" point="0"/>
-        <item rule-number="8" point="0"/>
-        <item rule-number="9" point="0"/>
-        <item rule-number="10" point="0"/>
-        <item rule-number="11" point="0"/>
+        <item rule-number="1" dot="1"/>
+        <item rule-number="3" dot="1"/>
+        <item rule-number="4" dot="0"/>
+        <item rule-number="5" dot="0"/>
+        <item rule-number="8" dot="0"/>
+        <item rule-number="9" dot="0"/>
+        <item rule-number="10" dot="0"/>
+        <item rule-number="11" dot="0"/>
       </itemset>
       <actions>
         <transitions>
@@ -850,7 +865,7 @@
 
     <state number="3">
       <itemset>
-        <item rule-number="0" point="2"/>
+        <item rule-number="0" dot="2"/>
       </itemset>
       <actions>
         <transitions/>
@@ -864,11 +879,11 @@
 
     <state number="4">
       <itemset>
-        <item rule-number="8" point="0"/>
-        <item rule-number="8" point="1"/>
-        <item rule-number="9" point="0"/>
-        <item rule-number="10" point="0"/>
-        <item rule-number="11" point="0"/>
+        <item rule-number="8" dot="0"/>
+        <item rule-number="8" dot="1"/>
+        <item rule-number="9" dot="0"/>
+        <item rule-number="10" dot="0"/>
+        <item rule-number="11" dot="0"/>
       </itemset>
       <actions>
         <transitions>
@@ -886,12 +901,12 @@
 
     <state number="5">
       <itemset>
-        <item rule-number="5" point="1">
+        <item rule-number="5" dot="1">
           <lookaheads>
             <symbol>&quot;:=&quot;</symbol>
           </lookaheads>
         </item>
-        <item rule-number="10" point="1">
+        <item rule-number="10" dot="1">
           <lookaheads>
             <symbol>&quot;end of file&quot;</symbol>
           </lookaheads>
@@ -910,7 +925,7 @@
 
     <state number="6">
       <itemset>
-        <item rule-number="11" point="1"/>
+        <item rule-number="11" dot="1"/>
       </itemset>
       <actions>
         <transitions/>
@@ -924,11 +939,11 @@
 
     <state number="7">
       <itemset>
-        <item rule-number="8" point="0"/>
-        <item rule-number="9" point="0"/>
-        <item rule-number="9" point="1"/>
-        <item rule-number="10" point="0"/>
-        <item rule-number="11" point="0"/>
+        <item rule-number="8" dot="0"/>
+        <item rule-number="9" dot="0"/>
+        <item rule-number="9" dot="1"/>
+        <item rule-number="10" dot="0"/>
+        <item rule-number="11" dot="0"/>
       </itemset>
       <actions>
         <transitions>
@@ -946,7 +961,7 @@
 
     <state number="8">
       <itemset>
-        <item rule-number="3" point="2"/>
+        <item rule-number="3" dot="2"/>
       </itemset>
       <actions>
         <transitions/>
@@ -960,7 +975,7 @@
 
     <state number="9">
       <itemset>
-        <item rule-number="4" point="1"/>
+        <item rule-number="4" dot="1"/>
       </itemset>
       <actions>
         <transitions>
@@ -974,7 +989,7 @@
 
     <state number="10">
       <itemset>
-        <item rule-number="1" point="2"/>
+        <item rule-number="1" dot="2"/>
       </itemset>
       <actions>
         <transitions/>
@@ -988,7 +1003,7 @@
 
     <state number="11">
       <itemset>
-        <item rule-number="10" point="1"/>
+        <item rule-number="10" dot="1"/>
       </itemset>
       <actions>
         <transitions/>
@@ -1002,8 +1017,8 @@
 
     <state number="12">
       <itemset>
-        <item rule-number="6" point="0"/>
-        <item rule-number="8" point="2"/>
+        <item rule-number="6" dot="0"/>
+        <item rule-number="8" dot="2"/>
       </itemset>
       <actions>
         <transitions>
@@ -1019,7 +1034,7 @@
 
     <state number="13">
       <itemset>
-        <item rule-number="9" point="2"/>
+        <item rule-number="9" dot="2"/>
       </itemset>
       <actions>
         <transitions>
@@ -1033,11 +1048,11 @@
 
     <state number="14">
       <itemset>
-        <item rule-number="4" point="2"/>
-        <item rule-number="8" point="0"/>
-        <item rule-number="9" point="0"/>
-        <item rule-number="10" point="0"/>
-        <item rule-number="11" point="0"/>
+        <item rule-number="4" dot="2"/>
+        <item rule-number="8" dot="0"/>
+        <item rule-number="9" dot="0"/>
+        <item rule-number="10" dot="0"/>
+        <item rule-number="11" dot="0"/>
       </itemset>
       <actions>
         <transitions>
@@ -1055,8 +1070,8 @@
 
     <state number="15">
       <itemset>
-        <item rule-number="7" point="0"/>
-        <item rule-number="8" point="3"/>
+        <item rule-number="7" dot="0"/>
+        <item rule-number="8" dot="3"/>
       </itemset>
       <actions>
         <transitions>
@@ -1072,7 +1087,7 @@
 
     <state number="16">
       <itemset>
-        <item rule-number="9" point="3"/>
+        <item rule-number="9" dot="3"/>
       </itemset>
       <actions>
         <transitions/>
@@ -1086,7 +1101,7 @@
 
     <state number="17">
       <itemset>
-        <item rule-number="4" point="3"/>
+        <item rule-number="4" dot="3"/>
       </itemset>
       <actions>
         <transitions/>
@@ -1100,11 +1115,11 @@
 
     <state number="18">
       <itemset>
-        <item rule-number="8" point="0"/>
-        <item rule-number="8" point="4"/>
-        <item rule-number="9" point="0"/>
-        <item rule-number="10" point="0"/>
-        <item rule-number="11" point="0"/>
+        <item rule-number="8" dot="0"/>
+        <item rule-number="8" dot="4"/>
+        <item rule-number="9" dot="0"/>
+        <item rule-number="10" dot="0"/>
+        <item rule-number="11" dot="0"/>
       </itemset>
       <actions>
         <transitions>
@@ -1122,7 +1137,7 @@
 
     <state number="19">
       <itemset>
-        <item rule-number="8" point="5"/>
+        <item rule-number="8" dot="5"/>
       </itemset>
       <actions>
         <transitions/>
@@ -1137,6 +1152,2847 @@
 </bison-xml-report>
 ]])
 
+# Check HTML output.
+AT_CHECK_HTML([input.html],
+[[<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:bison="https://www.gnu.org/software/bison/">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
+    <title>input.yy - GNU Bison XML Automaton Report</title>
+    <style type="text/css">
+      body {
+        font-family: "Nimbus Sans L", Arial, sans-serif;
+        font-size: 9pt;
+      }
+      a:link {
+        color: #1f00ff;
+        text-decoration: none;
+      }
+      a:visited {
+        color: #1f00ff;
+        text-decoration: none;
+      }
+      a:hover {
+        color: red;
+      }
+      #menu a {
+        text-decoration: underline;
+      }
+      .i {
+        font-style: italic;
+      }
+      .pre {
+        font-family: monospace;
+        white-space: pre;
+      }
+      ol.decimal {
+        list-style-type: decimal;
+      }
+      ol.lower-alpha {
+        list-style-type: lower-alpha;
+      }
+      .dot {
+        color: #cc0000;
+      }
+      #footer {
+        margin-top: 3.5em;
+        font-size: 7pt;
+      }
+      </style>
+  </head>
+  <body><h1>GNU Bison XML Automaton Report</h1><p>
+    input grammar: <span class="i">input.yy</span></p>
+
+<h3>Table of Contents</h3><ul id="menu"><li><a href="#reductions">Reductions</a><ul class="lower-alpha"><li><a href="#nonterminals_useless_in_grammar">Nonterminals useless in grammar</a></li><li><a href="#terminals_unused_in_grammar">Terminals unused in grammar</a></li><li><a href="#rules_useless_in_grammar">Rules useless in grammar</a></li></ul></li><li><a href="#conflicts">Conflicts</a></li><li><a href="#grammar">Grammar</a><ul class="lower-alpha"><li><a href="#grammar">Itemset</a></li><li><a href="#terminals">Terminal symbols</a></li><li><a href="#nonterminals">Nonterminal symbols</a></li></ul></li><li><a href="#automaton">Automaton</a></li></ul><h2><a name="reductions" id="reductions"></a> Reductions</h2><h3><a name="nonterminals_useless_in_grammar" id="nonterminals_useless_in_grammar"></a> Nonterminals useless in grammar</h3>
+
+<h3><a name="terminals_unused_in_grammar" id="terminals_unused_in_grammar"></a> Terminals unused in grammar</h3>
+
+<h3><a name="rules_useless_in_grammar" id="rules_useless_in_grammar"></a> Rules useless in grammar</h3>
+<h2><a name="conflicts" id="conflicts"></a> Conflicts</h2>
+
+<h2><a name="grammar" id="grammar"></a> Grammar</h2>
+<p class="pre">
+  <a name="rule_0" id="rule_0">  0</a> <span class="i">$accept</span> → <span class="i">unit</span> <b>"end of file"</b>
+
+  <a name="rule_1" id="rule_1">  1</a> <span class="i">unit</span> → <span class="i">assignments</span> <span class="i">exp</span>
+
+  <a name="rule_2" id="rule_2">  2</a> <span class="i">assignments</span> → %empty
+  <a name="rule_3" id="rule_3">  3</a>             | <span class="i">assignments</span> <span class="i">assignment</span>
+
+  <a name="rule_4" id="rule_4">  4</a> <span class="i">assignment</span> → <span class="i">id</span> <b>":="</b> <span class="i">exp</span>
+
+  <a name="rule_5" id="rule_5">  5</a> <span class="i">id</span> → <b>"identifier"</b>
+
+  <a name="rule_6" id="rule_6">  6</a> <span class="i">@1</span> → %empty
+
+  <a name="rule_7" id="rule_7">  7</a> <span class="i">@2</span> → %empty
+
+  <a name="rule_8" id="rule_8">  8</a> <span class="i">exp</span> → <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+  <a name="rule_9" id="rule_9">  9</a>     | <b>"("</b> <span class="i">exp</span> <b>")"</b>
+  <a name="rule_10" id="rule_10"> 10</a>     | <b>"identifier"</b>
+  <a name="rule_11" id="rule_11"> 11</a>     | <b>"number"</b>
+</p>
+
+<h3><a name="terminals" id="terminals"></a> Terminals, with rules where they appear</h3>
+
+<ul>
+  <li><b>"end of file"</b> (0) <a href="#rule_0">0</a></li>
+  <li><b>error</b> (256)</li>
+  <li><b>":="</b> (258) <a href="#rule_4">4</a></li>
+  <li><b>"incr"</b> (259) <a href="#rule_8">8</a></li>
+  <li><b>"identifier"</b> &lt;std::string&gt; (260) <a href="#rule_5">5</a> <a href="#rule_10">10</a></li>
+  <li><b>"number"</b> &lt;int&gt; (261) <a href="#rule_11">11</a></li>
+  <li><b>"("</b> (262) <a href="#rule_9">9</a></li>
+  <li><b>")"</b> (263) <a href="#rule_9">9</a></li>
+</ul>
+
+<h3><a name="nonterminals" id="nonterminals"></a> Nonterminals, with rules where they appear</h3>
+
+<ul>
+  <li><b>$accept</b> (9)
+    <ul>
+      <li>on left: <a href="#rule_0">0</a></li>
+    </ul>
+  </li>
+  <li><b>unit</b> (10)
+    <ul>
+      <li>on left: <a href="#rule_1">1</a></li>
+      <li>on right: <a href="#rule_0">0</a></li>
+    </ul>
+  </li>
+  <li><b>assignments</b> (11)
+    <ul>
+      <li>on left: <a href="#rule_2">2</a> <a href="#rule_3">3</a></li>
+      <li>on right: <a href="#rule_1">1</a> <a href="#rule_3">3</a></li>
+    </ul>
+  </li>
+  <li><b>assignment</b> (12)
+    <ul>
+      <li>on left: <a href="#rule_4">4</a></li>
+      <li>on right: <a href="#rule_3">3</a></li>
+    </ul>
+  </li>
+  <li><b>id</b> &lt;std::string&gt; (13)
+    <ul>
+      <li>on left: <a href="#rule_5">5</a></li>
+      <li>on right: <a href="#rule_4">4</a></li>
+    </ul>
+  </li>
+  <li><b>exp</b> &lt;int&gt; (14)
+    <ul>
+      <li>on left: <a href="#rule_8">8</a> <a href="#rule_9">9</a> <a href="#rule_10">10</a> <a href="#rule_11">11</a></li>
+      <li>on right: <a href="#rule_1">1</a> <a href="#rule_4">4</a> <a href="#rule_8">8</a> <a href="#rule_9">9</a></li>
+    </ul>
+  </li>
+  <li><b>@1</b> &lt;int&gt; (15)
+    <ul>
+      <li>on left: <a href="#rule_6">6</a></li>
+      <li>on right: <a href="#rule_8">8</a></li>
+    </ul>
+  </li>
+  <li><b>@2</b> &lt;int&gt; (16)
+    <ul>
+      <li>on left: <a href="#rule_7">7</a></li>
+      <li>on right: <a href="#rule_8">8</a></li>
+    </ul>
+  </li>
+</ul><h2><a name="automaton" id="automaton"></a> Automaton</h2>
+
+<h3><a name="state_0" id="state_0"></a>State 0</h3>
+
+<p class="pre">  <a href="#rule_0">  0</a> <span class="i">$accept</span> → <span class="dot">•</span> <span class="i">unit</span> <b>"end of file"</b>
+  <a href="#rule_1">  1</a> <span class="i">unit</span> → <span class="dot">•</span> <span class="i">assignments</span> <span class="i">exp</span>
+  <a href="#rule_2">  2</a> <span class="i">assignments</span> → <span class="dot">•</span> %empty
+  <a href="#rule_3">  3</a>             | <span class="dot">•</span> <span class="i">assignments</span> <span class="i">assignment</span>
+
+    $default  <a href="#rule_2">reduce using rule 2</a> (assignments)
+
+    unit         <a href="#state_1">go to state 1</a>
+    assignments  <a href="#state_2">go to state 2</a>
+</p>
+
+<h3><a name="state_1" id="state_1"></a>State 1</h3>
+
+<p class="pre">  <a href="#rule_0">  0</a> <span class="i">$accept</span> → <span class="i">unit</span> <span class="dot">•</span> <b>"end of file"</b>
+
+    "end of file"  <a href="#state_3">shift, and go to state 3</a>
+</p>
+
+<h3><a name="state_2" id="state_2"></a>State 2</h3>
+
+<p class="pre">  <a href="#rule_1">  1</a> <span class="i">unit</span> → <span class="i">assignments</span> <span class="dot">•</span> <span class="i">exp</span>
+  <a href="#rule_3">  3</a> <span class="i">assignments</span> → <span class="i">assignments</span> <span class="dot">•</span> <span class="i">assignment</span>
+  <a href="#rule_4">  4</a> <span class="i">assignment</span> → <span class="dot">•</span> <span class="i">id</span> <b>":="</b> <span class="i">exp</span>
+  <a href="#rule_5">  5</a> <span class="i">id</span> → <span class="dot">•</span> <b>"identifier"</b>
+  <a href="#rule_8">  8</a> <span class="i">exp</span> → <span class="dot">•</span> <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+  <a href="#rule_9">  9</a>     | <span class="dot">•</span> <b>"("</b> <span class="i">exp</span> <b>")"</b>
+  <a href="#rule_10"> 10</a>     | <span class="dot">•</span> <b>"identifier"</b>
+  <a href="#rule_11"> 11</a>     | <span class="dot">•</span> <b>"number"</b>
+
+    "incr"        <a href="#state_4">shift, and go to state 4</a>
+    "identifier"  <a href="#state_5">shift, and go to state 5</a>
+    "number"      <a href="#state_6">shift, and go to state 6</a>
+    "("           <a href="#state_7">shift, and go to state 7</a>
+
+    assignment  <a href="#state_8">go to state 8</a>
+    id          <a href="#state_9">go to state 9</a>
+    exp         <a href="#state_10">go to state 10</a>
+</p>
+
+<h3><a name="state_3" id="state_3"></a>State 3</h3>
+
+<p class="pre">  <a href="#rule_0">  0</a> <span class="i">$accept</span> → <span class="i">unit</span> <b>"end of file"</b> <span class="dot">•</span>
+
+    $default  accept
+</p>
+
+<h3><a name="state_4" id="state_4"></a>State 4</h3>
+
+<p class="pre">  <a href="#rule_8">  8</a> <span class="i">exp</span> → <span class="dot">•</span> <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+  <a href="#rule_8">  8</a>     | <b>"incr"</b> <span class="dot">•</span> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+  <a href="#rule_9">  9</a>     | <span class="dot">•</span> <b>"("</b> <span class="i">exp</span> <b>")"</b>
+  <a href="#rule_10"> 10</a>     | <span class="dot">•</span> <b>"identifier"</b>
+  <a href="#rule_11"> 11</a>     | <span class="dot">•</span> <b>"number"</b>
+
+    "incr"        <a href="#state_4">shift, and go to state 4</a>
+    "identifier"  <a href="#state_11">shift, and go to state 11</a>
+    "number"      <a href="#state_6">shift, and go to state 6</a>
+    "("           <a href="#state_7">shift, and go to state 7</a>
+
+    exp  <a href="#state_12">go to state 12</a>
+</p>
+
+<h3><a name="state_5" id="state_5"></a>State 5</h3>
+
+<p class="pre">  <a href="#rule_5">  5</a> <span class="i">id</span> → <b>"identifier"</b> <span class="dot">•</span>  [":="]
+  <a href="#rule_10"> 10</a> <span class="i">exp</span> → <b>"identifier"</b> <span class="dot">•</span>  ["end of file"]
+
+    "end of file"  <a href="#rule_10">reduce using rule 10</a> (exp)
+    $default       <a href="#rule_5">reduce using rule 5</a> (id)
+</p>
+
+<h3><a name="state_6" id="state_6"></a>State 6</h3>
+
+<p class="pre">  <a href="#rule_11"> 11</a> <span class="i">exp</span> → <b>"number"</b> <span class="dot">•</span>
+
+    $default  <a href="#rule_11">reduce using rule 11</a> (exp)
+</p>
+
+<h3><a name="state_7" id="state_7"></a>State 7</h3>
+
+<p class="pre">  <a href="#rule_8">  8</a> <span class="i">exp</span> → <span class="dot">•</span> <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+  <a href="#rule_9">  9</a>     | <span class="dot">•</span> <b>"("</b> <span class="i">exp</span> <b>")"</b>
+  <a href="#rule_9">  9</a>     | <b>"("</b> <span class="dot">•</span> <span class="i">exp</span> <b>")"</b>
+  <a href="#rule_10"> 10</a>     | <span class="dot">•</span> <b>"identifier"</b>
+  <a href="#rule_11"> 11</a>     | <span class="dot">•</span> <b>"number"</b>
+
+    "incr"        <a href="#state_4">shift, and go to state 4</a>
+    "identifier"  <a href="#state_11">shift, and go to state 11</a>
+    "number"      <a href="#state_6">shift, and go to state 6</a>
+    "("           <a href="#state_7">shift, and go to state 7</a>
+
+    exp  <a href="#state_13">go to state 13</a>
+</p>
+
+<h3><a name="state_8" id="state_8"></a>State 8</h3>
+
+<p class="pre">  <a href="#rule_3">  3</a> <span class="i">assignments</span> → <span class="i">assignments</span> <span class="i">assignment</span> <span class="dot">•</span>
+
+    $default  <a href="#rule_3">reduce using rule 3</a> (assignments)
+</p>
+
+<h3><a name="state_9" id="state_9"></a>State 9</h3>
+
+<p class="pre">  <a href="#rule_4">  4</a> <span class="i">assignment</span> → <span class="i">id</span> <span class="dot">•</span> <b>":="</b> <span class="i">exp</span>
+
+    ":="  <a href="#state_14">shift, and go to state 14</a>
+</p>
+
+<h3><a name="state_10" id="state_10"></a>State 10</h3>
+
+<p class="pre">  <a href="#rule_1">  1</a> <span class="i">unit</span> → <span class="i">assignments</span> <span class="i">exp</span> <span class="dot">•</span>
+
+    $default  <a href="#rule_1">reduce using rule 1</a> (unit)
+</p>
+
+<h3><a name="state_11" id="state_11"></a>State 11</h3>
+
+<p class="pre">  <a href="#rule_10"> 10</a> <span class="i">exp</span> → <b>"identifier"</b> <span class="dot">•</span>
+
+    $default  <a href="#rule_10">reduce using rule 10</a> (exp)
+</p>
+
+<h3><a name="state_12" id="state_12"></a>State 12</h3>
+
+<p class="pre">  <a href="#rule_6">  6</a> <span class="i">@1</span> → <span class="dot">•</span> %empty
+  <a href="#rule_8">  8</a> <span class="i">exp</span> → <b>"incr"</b> <span class="i">exp</span> <span class="dot">•</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+
+    $default  <a href="#rule_6">reduce using rule 6</a> (@1)
+
+    @1  <a href="#state_15">go to state 15</a>
+</p>
+
+<h3><a name="state_13" id="state_13"></a>State 13</h3>
+
+<p class="pre">  <a href="#rule_9">  9</a> <span class="i">exp</span> → <b>"("</b> <span class="i">exp</span> <span class="dot">•</span> <b>")"</b>
+
+    ")"  <a href="#state_16">shift, and go to state 16</a>
+</p>
+
+<h3><a name="state_14" id="state_14"></a>State 14</h3>
+
+<p class="pre">  <a href="#rule_4">  4</a> <span class="i">assignment</span> → <span class="i">id</span> <b>":="</b> <span class="dot">•</span> <span class="i">exp</span>
+  <a href="#rule_8">  8</a> <span class="i">exp</span> → <span class="dot">•</span> <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+  <a href="#rule_9">  9</a>     | <span class="dot">•</span> <b>"("</b> <span class="i">exp</span> <b>")"</b>
+  <a href="#rule_10"> 10</a>     | <span class="dot">•</span> <b>"identifier"</b>
+  <a href="#rule_11"> 11</a>     | <span class="dot">•</span> <b>"number"</b>
+
+    "incr"        <a href="#state_4">shift, and go to state 4</a>
+    "identifier"  <a href="#state_11">shift, and go to state 11</a>
+    "number"      <a href="#state_6">shift, and go to state 6</a>
+    "("           <a href="#state_7">shift, and go to state 7</a>
+
+    exp  <a href="#state_17">go to state 17</a>
+</p>
+
+<h3><a name="state_15" id="state_15"></a>State 15</h3>
+
+<p class="pre">  <a href="#rule_7">  7</a> <span class="i">@2</span> → <span class="dot">•</span> %empty
+  <a href="#rule_8">  8</a> <span class="i">exp</span> → <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="dot">•</span> <span class="i">@2</span> <span class="i">exp</span>
+
+    $default  <a href="#rule_7">reduce using rule 7</a> (@2)
+
+    @2  <a href="#state_18">go to state 18</a>
+</p>
+
+<h3><a name="state_16" id="state_16"></a>State 16</h3>
+
+<p class="pre">  <a href="#rule_9">  9</a> <span class="i">exp</span> → <b>"("</b> <span class="i">exp</span> <b>")"</b> <span class="dot">•</span>
+
+    $default  <a href="#rule_9">reduce using rule 9</a> (exp)
+</p>
+
+<h3><a name="state_17" id="state_17"></a>State 17</h3>
+
+<p class="pre">  <a href="#rule_4">  4</a> <span class="i">assignment</span> → <span class="i">id</span> <b>":="</b> <span class="i">exp</span> <span class="dot">•</span>
+
+    $default  <a href="#rule_4">reduce using rule 4</a> (assignment)
+</p>
+
+<h3><a name="state_18" id="state_18"></a>State 18</h3>
+
+<p class="pre">  <a href="#rule_8">  8</a> <span class="i">exp</span> → <span class="dot">•</span> <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+  <a href="#rule_8">  8</a>     | <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="dot">•</span> <span class="i">exp</span>
+  <a href="#rule_9">  9</a>     | <span class="dot">•</span> <b>"("</b> <span class="i">exp</span> <b>")"</b>
+  <a href="#rule_10"> 10</a>     | <span class="dot">•</span> <b>"identifier"</b>
+  <a href="#rule_11"> 11</a>     | <span class="dot">•</span> <b>"number"</b>
+
+    "incr"        <a href="#state_4">shift, and go to state 4</a>
+    "identifier"  <a href="#state_11">shift, and go to state 11</a>
+    "number"      <a href="#state_6">shift, and go to state 6</a>
+    "("           <a href="#state_7">shift, and go to state 7</a>
+
+    exp  <a href="#state_19">go to state 19</a>
+</p>
+
+<h3><a name="state_19" id="state_19"></a>State 19</h3>
+
+<p class="pre">  <a href="#rule_8">  8</a> <span class="i">exp</span> → <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span> <span class="dot">•</span>
+
+    $default  <a href="#rule_8">reduce using rule 8</a> (exp)
+</p>
+
+<div id="footer"><hr />This document was generated using
+      <a href="https://www.gnu.org/software/bison/" title="GNU Bison">
+      GNU Bison ]AT_PACKAGE_VERSION[</a>
+      XML Automaton Report.<br />
+      Verbatim copying and distribution of this entire page is
+      permitted in any medium, provided this notice is preserved.</div></body>
+</html>
+]])
+
+AT_BISON_OPTION_POPDEFS
+AT_CLEANUP
+
+
+dnl Disable because aborts on some architectures.  Not scheduled for 3.8 anyway.
+dnl <https://lists.gnu.org/r/bug-bison/2021-08/msg00027.html>
+dnl
+dnl ## -------------------- ##
+dnl ## Multistart reports.  ##
+dnl ## -------------------- ##
+dnl
+dnl AT_SETUP([Multistart reports])
+dnl
+dnl AT_KEYWORDS([multistart report])
+dnl
+dnl AT_BISON_OPTION_PUSHDEFS
+dnl AT_DATA([input.yy],
+dnl [[%token
+dnl   END  0  "end of file"
+dnl   ASSIGN  ":="
+dnl   INCR    "incr"
+dnl ;
+dnl
+dnl %token <std::string> IDENTIFIER "identifier"
+dnl %type <std::string> id
+dnl %token <int> NUMBER "number"
+dnl %type  <int> exp
+dnl
+dnl %%
+dnl %start unit assignments exp;
+dnl unit: assignments exp  { driver.result = $2; };
+dnl
+dnl assignments:
+dnl   %empty                 {}
+dnl | assignments assignment {};
+dnl
+dnl assignment:
+dnl   id ":=" exp { driver.variables[$id] = $exp; };
+dnl
+dnl id:
+dnl   "identifier";
+dnl
+dnl exp:
+dnl   "incr" exp <int>{ $$ = 1; } <int>{ $$ = 10; } exp   { $$ = $2 + $3 + $4 + $5; }
+dnl | "(" exp ")"   { std::swap ($$, $2); }
+dnl | "identifier"  { $$ = driver.variables[$1]; }
+dnl | "number"      { std::swap ($$, $1); };
+dnl ]])
+dnl
+dnl AT_BISON_CHECK([-o input.cc -rall --graph=input.gv --xml input.yy])
+dnl
+dnl # Check the contents of the report.
+dnl AT_CHECK([cat input.output], [],
+dnl [[Grammar
+dnl
+dnl     0 $accept: YY_PARSE_unit unit "end of file"
+dnl     1        | YY_PARSE_assignments assignments "end of file"
+dnl     2        | YY_PARSE_exp exp "end of file"
+dnl
+dnl     3 unit: assignments exp
+dnl
+dnl     4 assignments: %empty
+dnl     5            | assignments assignment
+dnl
+dnl     6 assignment: id ":=" exp
+dnl
+dnl     7 id: "identifier"
+dnl
+dnl     8 @1: %empty
+dnl
+dnl     9 @2: %empty
+dnl
+dnl    10 exp: "incr" exp @1 @2 exp
+dnl    11    | "(" exp ")"
+dnl    12    | "identifier"
+dnl    13    | "number"
+dnl
+dnl
+dnl Terminals, with rules where they appear
+dnl
+dnl     "end of file" (0) 0 1 2
+dnl     error (256)
+dnl     ":=" (258) 6
+dnl     "incr" (259) 10
+dnl     "identifier" <std::string> (260) 7 12
+dnl     "number" <int> (261) 13
+dnl     YY_PARSE_unit (262) 0
+dnl     YY_PARSE_assignments (263) 1
+dnl     YY_PARSE_exp (264) 2
+dnl     "(" (265) 11
+dnl     ")" (266) 11
+dnl
+dnl
+dnl Nonterminals, with rules where they appear
+dnl
+dnl     $accept (12)
+dnl         on left: 0 1 2
+dnl     unit (13)
+dnl         on left: 3
+dnl         on right: 0
+dnl     assignments (14)
+dnl         on left: 4 5
+dnl         on right: 1 3 5
+dnl     assignment (15)
+dnl         on left: 6
+dnl         on right: 5
+dnl     id <std::string> (16)
+dnl         on left: 7
+dnl         on right: 6
+dnl     exp <int> (17)
+dnl         on left: 10 11 12 13
+dnl         on right: 2 3 6 10 11
+dnl     @1 <int> (18)
+dnl         on left: 8
+dnl         on right: 10
+dnl     @2 <int> (19)
+dnl         on left: 9
+dnl         on right: 10
+dnl
+dnl
+dnl State 0
+dnl
+dnl     0 $accept: . YY_PARSE_unit unit "end of file"
+dnl     1        | . YY_PARSE_assignments assignments "end of file"
+dnl     2        | . YY_PARSE_exp exp "end of file"
+dnl
+dnl     YY_PARSE_unit         shift, and go to state 1
+dnl     YY_PARSE_assignments  shift, and go to state 2
+dnl     YY_PARSE_exp          shift, and go to state 3
+dnl
+dnl
+dnl State 1
+dnl
+dnl     0 $accept: YY_PARSE_unit . unit "end of file"
+dnl     3 unit: . assignments exp
+dnl     4 assignments: %empty .
+dnl     5            | . assignments assignment
+dnl
+dnl     $default  reduce using rule 4 (assignments)
+dnl
+dnl     unit         go to state 4
+dnl     assignments  go to state 5
+dnl
+dnl
+dnl State 2
+dnl
+dnl     1 $accept: YY_PARSE_assignments . assignments "end of file"
+dnl     4 assignments: %empty .
+dnl     5            | . assignments assignment
+dnl
+dnl     $default  reduce using rule 4 (assignments)
+dnl
+dnl     assignments  go to state 6
+dnl
+dnl
+dnl State 3
+dnl
+dnl     2 $accept: YY_PARSE_exp . exp "end of file"
+dnl    10 exp: . "incr" exp @1 @2 exp
+dnl    11    | . "(" exp ")"
+dnl    12    | . "identifier"
+dnl    13    | . "number"
+dnl
+dnl     "incr"        shift, and go to state 7
+dnl     "identifier"  shift, and go to state 8
+dnl     "number"      shift, and go to state 9
+dnl     "("           shift, and go to state 10
+dnl
+dnl     exp  go to state 11
+dnl
+dnl
+dnl State 4
+dnl
+dnl     0 $accept: YY_PARSE_unit unit . "end of file"
+dnl
+dnl     "end of file"  shift, and go to state 12
+dnl
+dnl
+dnl State 5
+dnl
+dnl     3 unit: assignments . exp
+dnl     5 assignments: assignments . assignment
+dnl     6 assignment: . id ":=" exp
+dnl     7 id: . "identifier"
+dnl    10 exp: . "incr" exp @1 @2 exp
+dnl    11    | . "(" exp ")"
+dnl    12    | . "identifier"
+dnl    13    | . "number"
+dnl
+dnl     "incr"        shift, and go to state 7
+dnl     "identifier"  shift, and go to state 13
+dnl     "number"      shift, and go to state 9
+dnl     "("           shift, and go to state 10
+dnl
+dnl     assignment  go to state 14
+dnl     id          go to state 15
+dnl     exp         go to state 16
+dnl
+dnl
+dnl State 6
+dnl
+dnl     1 $accept: YY_PARSE_assignments assignments . "end of file"
+dnl     5 assignments: assignments . assignment
+dnl     6 assignment: . id ":=" exp
+dnl     7 id: . "identifier"
+dnl
+dnl     "end of file"  shift, and go to state 17
+dnl     "identifier"   shift, and go to state 18
+dnl
+dnl     assignment  go to state 14
+dnl     id          go to state 15
+dnl
+dnl
+dnl State 7
+dnl
+dnl    10 exp: . "incr" exp @1 @2 exp
+dnl    10    | "incr" . exp @1 @2 exp
+dnl    11    | . "(" exp ")"
+dnl    12    | . "identifier"
+dnl    13    | . "number"
+dnl
+dnl     "incr"        shift, and go to state 7
+dnl     "identifier"  shift, and go to state 8
+dnl     "number"      shift, and go to state 9
+dnl     "("           shift, and go to state 10
+dnl
+dnl     exp  go to state 19
+dnl
+dnl
+dnl State 8
+dnl
+dnl    12 exp: "identifier" .
+dnl
+dnl     $default  reduce using rule 12 (exp)
+dnl
+dnl
+dnl State 9
+dnl
+dnl    13 exp: "number" .
+dnl
+dnl     $default  reduce using rule 13 (exp)
+dnl
+dnl
+dnl State 10
+dnl
+dnl    10 exp: . "incr" exp @1 @2 exp
+dnl    11    | . "(" exp ")"
+dnl    11    | "(" . exp ")"
+dnl    12    | . "identifier"
+dnl    13    | . "number"
+dnl
+dnl     "incr"        shift, and go to state 7
+dnl     "identifier"  shift, and go to state 8
+dnl     "number"      shift, and go to state 9
+dnl     "("           shift, and go to state 10
+dnl
+dnl     exp  go to state 20
+dnl
+dnl
+dnl State 11
+dnl
+dnl     2 $accept: YY_PARSE_exp exp . "end of file"
+dnl
+dnl     "end of file"  shift, and go to state 21
+dnl
+dnl
+dnl State 12
+dnl
+dnl     0 $accept: YY_PARSE_unit unit "end of file" .
+dnl
+dnl     $default  accept
+dnl
+dnl
+dnl State 13
+dnl
+dnl     7 id: "identifier" .  [":="]
+dnl    12 exp: "identifier" .  ["end of file"]
+dnl
+dnl     "end of file"  reduce using rule 12 (exp)
+dnl     $default       reduce using rule 7 (id)
+dnl
+dnl
+dnl State 14
+dnl
+dnl     5 assignments: assignments assignment .
+dnl
+dnl     $default  reduce using rule 5 (assignments)
+dnl
+dnl
+dnl State 15
+dnl
+dnl     6 assignment: id . ":=" exp
+dnl
+dnl     ":="  shift, and go to state 22
+dnl
+dnl
+dnl State 16
+dnl
+dnl     3 unit: assignments exp .
+dnl
+dnl     $default  reduce using rule 3 (unit)
+dnl
+dnl
+dnl State 17
+dnl
+dnl     1 $accept: YY_PARSE_assignments assignments "end of file" .
+dnl
+dnl     $default  accept
+dnl
+dnl
+dnl State 18
+dnl
+dnl     7 id: "identifier" .
+dnl
+dnl     $default  reduce using rule 7 (id)
+dnl
+dnl
+dnl State 19
+dnl
+dnl     8 @1: %empty .
+dnl    10 exp: "incr" exp . @1 @2 exp
+dnl
+dnl     $default  reduce using rule 8 (@1)
+dnl
+dnl     @1  go to state 23
+dnl
+dnl
+dnl State 20
+dnl
+dnl    11 exp: "(" exp . ")"
+dnl
+dnl     ")"  shift, and go to state 24
+dnl
+dnl
+dnl State 21
+dnl
+dnl     2 $accept: YY_PARSE_exp exp "end of file" .
+dnl
+dnl     $default  accept
+dnl
+dnl
+dnl State 22
+dnl
+dnl     6 assignment: id ":=" . exp
+dnl    10 exp: . "incr" exp @1 @2 exp
+dnl    11    | . "(" exp ")"
+dnl    12    | . "identifier"
+dnl    13    | . "number"
+dnl
+dnl     "incr"        shift, and go to state 7
+dnl     "identifier"  shift, and go to state 8
+dnl     "number"      shift, and go to state 9
+dnl     "("           shift, and go to state 10
+dnl
+dnl     exp  go to state 25
+dnl
+dnl
+dnl State 23
+dnl
+dnl     9 @2: %empty .
+dnl    10 exp: "incr" exp @1 . @2 exp
+dnl
+dnl     $default  reduce using rule 9 (@2)
+dnl
+dnl     @2  go to state 26
+dnl
+dnl
+dnl State 24
+dnl
+dnl    11 exp: "(" exp ")" .
+dnl
+dnl     $default  reduce using rule 11 (exp)
+dnl
+dnl
+dnl State 25
+dnl
+dnl     6 assignment: id ":=" exp .
+dnl
+dnl     $default  reduce using rule 6 (assignment)
+dnl
+dnl
+dnl State 26
+dnl
+dnl    10 exp: . "incr" exp @1 @2 exp
+dnl    10    | "incr" exp @1 @2 . exp
+dnl    11    | . "(" exp ")"
+dnl    12    | . "identifier"
+dnl    13    | . "number"
+dnl
+dnl     "incr"        shift, and go to state 7
+dnl     "identifier"  shift, and go to state 8
+dnl     "number"      shift, and go to state 9
+dnl     "("           shift, and go to state 10
+dnl
+dnl     exp  go to state 27
+dnl
+dnl
+dnl State 27
+dnl
+dnl    10 exp: "incr" exp @1 @2 exp .
+dnl
+dnl     $default  reduce using rule 10 (exp)
+dnl ]])
+dnl
+dnl
+dnl
+dnl AT_CHECK([cat input.gv], [],
+dnl [[// Generated by GNU Bison ]AT_PACKAGE_VERSION[.
+dnl // Report bugs to <bug-bison@gnu.org>.
+dnl // Home page: <https://www.gnu.org/software/bison/>.
+dnl
+dnl digraph "input.yy"
+dnl {
+dnl   node [fontname = courier, shape = box, colorscheme = paired6]
+dnl   edge [fontname = courier]
+dnl
+dnl   0 [label="State 0\n\l  0 $accept: • YY_PARSE_unit unit \"end of file\"\l  1        | • YY_PARSE_assignments assignments \"end of file\"\l  2        | • YY_PARSE_exp exp \"end of file\"\l"]
+dnl   0 -> 1 [style=solid label="YY_PARSE_unit"]
+dnl   0 -> 2 [style=solid label="YY_PARSE_assignments"]
+dnl   0 -> 3 [style=solid label="YY_PARSE_exp"]
+dnl   1 [label="State 1\n\l  0 $accept: YY_PARSE_unit • unit \"end of file\"\l  3 unit: • assignments exp\l  4 assignments: • %empty\l  5            | • assignments assignment\l"]
+dnl   1 -> 4 [style=dashed label="unit"]
+dnl   1 -> 5 [style=dashed label="assignments"]
+dnl   1 -> "1R4" [style=solid]
+dnl  "1R4" [label="R4", fillcolor=3, shape=diamond, style=filled]
+dnl   2 [label="State 2\n\l  1 $accept: YY_PARSE_assignments • assignments \"end of file\"\l  4 assignments: • %empty\l  5            | • assignments assignment\l"]
+dnl   2 -> 6 [style=dashed label="assignments"]
+dnl   2 -> "2R4" [style=solid]
+dnl  "2R4" [label="R4", fillcolor=3, shape=diamond, style=filled]
+dnl   3 [label="State 3\n\l  2 $accept: YY_PARSE_exp • exp \"end of file\"\l 10 exp: • \"incr\" exp @1 @2 exp\l 11    | • \"(\" exp \")\"\l 12    | • \"identifier\"\l 13    | • \"number\"\l"]
+dnl   3 -> 7 [style=solid label="\"incr\""]
+dnl   3 -> 8 [style=solid label="\"identifier\""]
+dnl   3 -> 9 [style=solid label="\"number\""]
+dnl   3 -> 10 [style=solid label="\"(\""]
+dnl   3 -> 11 [style=dashed label="exp"]
+dnl   4 [label="State 4\n\l  0 $accept: YY_PARSE_unit unit • \"end of file\"\l"]
+dnl   4 -> 12 [style=solid label="\"end of file\""]
+dnl   5 [label="State 5\n\l  3 unit: assignments • exp\l  5 assignments: assignments • assignment\l  6 assignment: • id \":=\" exp\l  7 id: • \"identifier\"\l 10 exp: • \"incr\" exp @1 @2 exp\l 11    | • \"(\" exp \")\"\l 12    | • \"identifier\"\l 13    | • \"number\"\l"]
+dnl   5 -> 7 [style=solid label="\"incr\""]
+dnl   5 -> 13 [style=solid label="\"identifier\""]
+dnl   5 -> 9 [style=solid label="\"number\""]
+dnl   5 -> 10 [style=solid label="\"(\""]
+dnl   5 -> 14 [style=dashed label="assignment"]
+dnl   5 -> 15 [style=dashed label="id"]
+dnl   5 -> 16 [style=dashed label="exp"]
+dnl   6 [label="State 6\n\l  1 $accept: YY_PARSE_assignments assignments • \"end of file\"\l  5 assignments: assignments • assignment\l  6 assignment: • id \":=\" exp\l  7 id: • \"identifier\"\l"]
+dnl   6 -> 17 [style=solid label="\"end of file\""]
+dnl   6 -> 18 [style=solid label="\"identifier\""]
+dnl   6 -> 14 [style=dashed label="assignment"]
+dnl   6 -> 15 [style=dashed label="id"]
+dnl   7 [label="State 7\n\l 10 exp: • \"incr\" exp @1 @2 exp\l 10    | \"incr\" • exp @1 @2 exp\l 11    | • \"(\" exp \")\"\l 12    | • \"identifier\"\l 13    | • \"number\"\l"]
+dnl   7 -> 7 [style=solid label="\"incr\""]
+dnl   7 -> 8 [style=solid label="\"identifier\""]
+dnl   7 -> 9 [style=solid label="\"number\""]
+dnl   7 -> 10 [style=solid label="\"(\""]
+dnl   7 -> 19 [style=dashed label="exp"]
+dnl   8 [label="State 8\n\l 12 exp: \"identifier\" •\l"]
+dnl   8 -> "8R12" [style=solid]
+dnl  "8R12" [label="R12", fillcolor=3, shape=diamond, style=filled]
+dnl   9 [label="State 9\n\l 13 exp: \"number\" •\l"]
+dnl   9 -> "9R13" [style=solid]
+dnl  "9R13" [label="R13", fillcolor=3, shape=diamond, style=filled]
+dnl   10 [label="State 10\n\l 10 exp: • \"incr\" exp @1 @2 exp\l 11    | • \"(\" exp \")\"\l 11    | \"(\" • exp \")\"\l 12    | • \"identifier\"\l 13    | • \"number\"\l"]
+dnl   10 -> 7 [style=solid label="\"incr\""]
+dnl   10 -> 8 [style=solid label="\"identifier\""]
+dnl   10 -> 9 [style=solid label="\"number\""]
+dnl   10 -> 10 [style=solid label="\"(\""]
+dnl   10 -> 20 [style=dashed label="exp"]
+dnl   11 [label="State 11\n\l  2 $accept: YY_PARSE_exp exp • \"end of file\"\l"]
+dnl   11 -> 21 [style=solid label="\"end of file\""]
+dnl   12 [label="State 12\n\l  0 $accept: YY_PARSE_unit unit \"end of file\" •\l"]
+dnl   12 -> "12R0" [style=solid]
+dnl  "12R0" [label="Acc", fillcolor=1, shape=diamond, style=filled]
+dnl   13 [label="State 13\n\l  7 id: \"identifier\" •  [\":=\"]\l 12 exp: \"identifier\" •  [\"end of file\"]\l"]
+dnl   13 -> "13R7" [style=solid]
+dnl  "13R7" [label="R7", fillcolor=3, shape=diamond, style=filled]
+dnl   13 -> "13R12" [label="[\"end of file\"]", style=solid]
+dnl  "13R12" [label="R12", fillcolor=3, shape=diamond, style=filled]
+dnl   14 [label="State 14\n\l  5 assignments: assignments assignment •\l"]
+dnl   14 -> "14R5" [style=solid]
+dnl  "14R5" [label="R5", fillcolor=3, shape=diamond, style=filled]
+dnl   15 [label="State 15\n\l  6 assignment: id • \":=\" exp\l"]
+dnl   15 -> 22 [style=solid label="\":=\""]
+dnl   16 [label="State 16\n\l  3 unit: assignments exp •\l"]
+dnl   16 -> "16R3" [style=solid]
+dnl  "16R3" [label="R3", fillcolor=3, shape=diamond, style=filled]
+dnl   17 [label="State 17\n\l  1 $accept: YY_PARSE_assignments assignments \"end of file\" •\l"]
+dnl   17 -> "17R1" [style=solid]
+dnl  "17R1" [label="Acc", fillcolor=1, shape=diamond, style=filled]
+dnl   18 [label="State 18\n\l  7 id: \"identifier\" •\l"]
+dnl   18 -> "18R7" [style=solid]
+dnl  "18R7" [label="R7", fillcolor=3, shape=diamond, style=filled]
+dnl   19 [label="State 19\n\l  8 @1: • %empty\l 10 exp: \"incr\" exp • @1 @2 exp\l"]
+dnl   19 -> 23 [style=dashed label="@1"]
+dnl   19 -> "19R8" [style=solid]
+dnl  "19R8" [label="R8", fillcolor=3, shape=diamond, style=filled]
+dnl   20 [label="State 20\n\l 11 exp: \"(\" exp • \")\"\l"]
+dnl   20 -> 24 [style=solid label="\")\""]
+dnl   21 [label="State 21\n\l  2 $accept: YY_PARSE_exp exp \"end of file\" •\l"]
+dnl   21 -> "21R2" [style=solid]
+dnl  "21R2" [label="Acc", fillcolor=1, shape=diamond, style=filled]
+dnl   22 [label="State 22\n\l  6 assignment: id \":=\" • exp\l 10 exp: • \"incr\" exp @1 @2 exp\l 11    | • \"(\" exp \")\"\l 12    | • \"identifier\"\l 13    | • \"number\"\l"]
+dnl   22 -> 7 [style=solid label="\"incr\""]
+dnl   22 -> 8 [style=solid label="\"identifier\""]
+dnl   22 -> 9 [style=solid label="\"number\""]
+dnl   22 -> 10 [style=solid label="\"(\""]
+dnl   22 -> 25 [style=dashed label="exp"]
+dnl   23 [label="State 23\n\l  9 @2: • %empty\l 10 exp: \"incr\" exp @1 • @2 exp\l"]
+dnl   23 -> 26 [style=dashed label="@2"]
+dnl   23 -> "23R9" [style=solid]
+dnl  "23R9" [label="R9", fillcolor=3, shape=diamond, style=filled]
+dnl   24 [label="State 24\n\l 11 exp: \"(\" exp \")\" •\l"]
+dnl   24 -> "24R11" [style=solid]
+dnl  "24R11" [label="R11", fillcolor=3, shape=diamond, style=filled]
+dnl   25 [label="State 25\n\l  6 assignment: id \":=\" exp •\l"]
+dnl   25 -> "25R6" [style=solid]
+dnl  "25R6" [label="R6", fillcolor=3, shape=diamond, style=filled]
+dnl   26 [label="State 26\n\l 10 exp: • \"incr\" exp @1 @2 exp\l 10    | \"incr\" exp @1 @2 • exp\l 11    | • \"(\" exp \")\"\l 12    | • \"identifier\"\l 13    | • \"number\"\l"]
+dnl   26 -> 7 [style=solid label="\"incr\""]
+dnl   26 -> 8 [style=solid label="\"identifier\""]
+dnl   26 -> 9 [style=solid label="\"number\""]
+dnl   26 -> 10 [style=solid label="\"(\""]
+dnl   26 -> 27 [style=dashed label="exp"]
+dnl   27 [label="State 27\n\l 10 exp: \"incr\" exp @1 @2 exp •\l"]
+dnl   27 -> "27R10" [style=solid]
+dnl  "27R10" [label="R10", fillcolor=3, shape=diamond, style=filled]
+dnl }
+dnl ]])
+dnl
+dnl
+dnl AT_CHECK([[cat input.xml]], [],
+dnl [[<?xml version="1.0"?>
+dnl
+dnl <bison-xml-report version="]AT_PACKAGE_VERSION[" bug-report="bug-bison@gnu.org" url="https://www.gnu.org/software/bison/">
+dnl
+dnl   <filename>input.yy</filename>
+dnl
+dnl   <grammar>
+dnl     <rules>
+dnl       <rule number="0" usefulness="useful">
+dnl         <lhs>$accept</lhs>
+dnl         <rhs>
+dnl           <symbol>YY_PARSE_unit</symbol>
+dnl           <symbol>unit</symbol>
+dnl           <symbol>&quot;end of file&quot;</symbol>
+dnl         </rhs>
+dnl       </rule>
+dnl       <rule number="1" usefulness="useful">
+dnl         <lhs>$accept</lhs>
+dnl         <rhs>
+dnl           <symbol>YY_PARSE_assignments</symbol>
+dnl           <symbol>assignments</symbol>
+dnl           <symbol>&quot;end of file&quot;</symbol>
+dnl         </rhs>
+dnl       </rule>
+dnl       <rule number="2" usefulness="useful">
+dnl         <lhs>$accept</lhs>
+dnl         <rhs>
+dnl           <symbol>YY_PARSE_exp</symbol>
+dnl           <symbol>exp</symbol>
+dnl           <symbol>&quot;end of file&quot;</symbol>
+dnl         </rhs>
+dnl       </rule>
+dnl       <rule number="3" usefulness="useful">
+dnl         <lhs>unit</lhs>
+dnl         <rhs>
+dnl           <symbol>assignments</symbol>
+dnl           <symbol>exp</symbol>
+dnl         </rhs>
+dnl       </rule>
+dnl       <rule number="4" usefulness="useful">
+dnl         <lhs>assignments</lhs>
+dnl         <rhs>
+dnl           <empty/>
+dnl         </rhs>
+dnl       </rule>
+dnl       <rule number="5" usefulness="useful">
+dnl         <lhs>assignments</lhs>
+dnl         <rhs>
+dnl           <symbol>assignments</symbol>
+dnl           <symbol>assignment</symbol>
+dnl         </rhs>
+dnl       </rule>
+dnl       <rule number="6" usefulness="useful">
+dnl         <lhs>assignment</lhs>
+dnl         <rhs>
+dnl           <symbol>id</symbol>
+dnl           <symbol>&quot;:=&quot;</symbol>
+dnl           <symbol>exp</symbol>
+dnl         </rhs>
+dnl       </rule>
+dnl       <rule number="7" usefulness="useful">
+dnl         <lhs>id</lhs>
+dnl         <rhs>
+dnl           <symbol>&quot;identifier&quot;</symbol>
+dnl         </rhs>
+dnl       </rule>
+dnl       <rule number="8" usefulness="useful">
+dnl         <lhs>@1</lhs>
+dnl         <rhs>
+dnl           <empty/>
+dnl         </rhs>
+dnl       </rule>
+dnl       <rule number="9" usefulness="useful">
+dnl         <lhs>@2</lhs>
+dnl         <rhs>
+dnl           <empty/>
+dnl         </rhs>
+dnl       </rule>
+dnl       <rule number="10" usefulness="useful">
+dnl         <lhs>exp</lhs>
+dnl         <rhs>
+dnl           <symbol>&quot;incr&quot;</symbol>
+dnl           <symbol>exp</symbol>
+dnl           <symbol>@1</symbol>
+dnl           <symbol>@2</symbol>
+dnl           <symbol>exp</symbol>
+dnl         </rhs>
+dnl       </rule>
+dnl       <rule number="11" usefulness="useful">
+dnl         <lhs>exp</lhs>
+dnl         <rhs>
+dnl           <symbol>&quot;(&quot;</symbol>
+dnl           <symbol>exp</symbol>
+dnl           <symbol>&quot;)&quot;</symbol>
+dnl         </rhs>
+dnl       </rule>
+dnl       <rule number="12" usefulness="useful">
+dnl         <lhs>exp</lhs>
+dnl         <rhs>
+dnl           <symbol>&quot;identifier&quot;</symbol>
+dnl         </rhs>
+dnl       </rule>
+dnl       <rule number="13" usefulness="useful">
+dnl         <lhs>exp</lhs>
+dnl         <rhs>
+dnl           <symbol>&quot;number&quot;</symbol>
+dnl         </rhs>
+dnl       </rule>
+dnl     </rules>
+dnl     <terminals>
+dnl       <terminal symbol-number="0" token-number="0" name="&quot;end of file&quot;" type="" usefulness="useful"/>
+dnl       <terminal symbol-number="1" token-number="256" name="error" type="" usefulness="useful"/>
+dnl       <terminal symbol-number="3" token-number="258" name="&quot;:=&quot;" type="" usefulness="useful"/>
+dnl       <terminal symbol-number="4" token-number="259" name="&quot;incr&quot;" type="" usefulness="useful"/>
+dnl       <terminal symbol-number="5" token-number="260" name="&quot;identifier&quot;" type="std::string" usefulness="useful"/>
+dnl       <terminal symbol-number="6" token-number="261" name="&quot;number&quot;" type="int" usefulness="useful"/>
+dnl       <terminal symbol-number="7" token-number="262" name="YY_PARSE_unit" type="" usefulness="useful"/>
+dnl       <terminal symbol-number="8" token-number="263" name="YY_PARSE_assignments" type="" usefulness="useful"/>
+dnl       <terminal symbol-number="9" token-number="264" name="YY_PARSE_exp" type="" usefulness="useful"/>
+dnl       <terminal symbol-number="10" token-number="265" name="&quot;(&quot;" type="" usefulness="useful"/>
+dnl       <terminal symbol-number="11" token-number="266" name="&quot;)&quot;" type="" usefulness="useful"/>
+dnl     </terminals>
+dnl     <nonterminals>
+dnl       <nonterminal symbol-number="12" name="$accept" type="" usefulness="useful"/>
+dnl       <nonterminal symbol-number="13" name="unit" type="" usefulness="useful"/>
+dnl       <nonterminal symbol-number="14" name="assignments" type="" usefulness="useful"/>
+dnl       <nonterminal symbol-number="15" name="assignment" type="" usefulness="useful"/>
+dnl       <nonterminal symbol-number="16" name="id" type="std::string" usefulness="useful"/>
+dnl       <nonterminal symbol-number="17" name="exp" type="int" usefulness="useful"/>
+dnl       <nonterminal symbol-number="18" name="@1" type="int" usefulness="useful"/>
+dnl       <nonterminal symbol-number="19" name="@2" type="int" usefulness="useful"/>
+dnl     </nonterminals>
+dnl   </grammar>
+dnl
+dnl   <automaton>
+dnl
+dnl     <state number="0">
+dnl       <itemset>
+dnl         <item rule-number="0" dot="0"/>
+dnl         <item rule-number="1" dot="0"/>
+dnl         <item rule-number="2" dot="0"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions>
+dnl           <transition type="shift" symbol="YY_PARSE_unit" state="1"/>
+dnl           <transition type="shift" symbol="YY_PARSE_assignments" state="2"/>
+dnl           <transition type="shift" symbol="YY_PARSE_exp" state="3"/>
+dnl         </transitions>
+dnl         <errors/>
+dnl         <reductions/>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="1">
+dnl       <itemset>
+dnl         <item rule-number="0" dot="1"/>
+dnl         <item rule-number="3" dot="0"/>
+dnl         <item rule-number="4" dot="0"/>
+dnl         <item rule-number="5" dot="0"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions>
+dnl           <transition type="goto" symbol="unit" state="4"/>
+dnl           <transition type="goto" symbol="assignments" state="5"/>
+dnl         </transitions>
+dnl         <errors/>
+dnl         <reductions>
+dnl           <reduction symbol="$default" rule="4" enabled="true"/>
+dnl         </reductions>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="2">
+dnl       <itemset>
+dnl         <item rule-number="1" dot="1"/>
+dnl         <item rule-number="4" dot="0"/>
+dnl         <item rule-number="5" dot="0"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions>
+dnl           <transition type="goto" symbol="assignments" state="6"/>
+dnl         </transitions>
+dnl         <errors/>
+dnl         <reductions>
+dnl           <reduction symbol="$default" rule="4" enabled="true"/>
+dnl         </reductions>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="3">
+dnl       <itemset>
+dnl         <item rule-number="2" dot="1"/>
+dnl         <item rule-number="10" dot="0"/>
+dnl         <item rule-number="11" dot="0"/>
+dnl         <item rule-number="12" dot="0"/>
+dnl         <item rule-number="13" dot="0"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions>
+dnl           <transition type="shift" symbol="&quot;incr&quot;" state="7"/>
+dnl           <transition type="shift" symbol="&quot;identifier&quot;" state="8"/>
+dnl           <transition type="shift" symbol="&quot;number&quot;" state="9"/>
+dnl           <transition type="shift" symbol="&quot;(&quot;" state="10"/>
+dnl           <transition type="goto" symbol="exp" state="11"/>
+dnl         </transitions>
+dnl         <errors/>
+dnl         <reductions/>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="4">
+dnl       <itemset>
+dnl         <item rule-number="0" dot="2"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions>
+dnl           <transition type="shift" symbol="&quot;end of file&quot;" state="12"/>
+dnl         </transitions>
+dnl         <errors/>
+dnl         <reductions/>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="5">
+dnl       <itemset>
+dnl         <item rule-number="3" dot="1"/>
+dnl         <item rule-number="5" dot="1"/>
+dnl         <item rule-number="6" dot="0"/>
+dnl         <item rule-number="7" dot="0"/>
+dnl         <item rule-number="10" dot="0"/>
+dnl         <item rule-number="11" dot="0"/>
+dnl         <item rule-number="12" dot="0"/>
+dnl         <item rule-number="13" dot="0"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions>
+dnl           <transition type="shift" symbol="&quot;incr&quot;" state="7"/>
+dnl           <transition type="shift" symbol="&quot;identifier&quot;" state="13"/>
+dnl           <transition type="shift" symbol="&quot;number&quot;" state="9"/>
+dnl           <transition type="shift" symbol="&quot;(&quot;" state="10"/>
+dnl           <transition type="goto" symbol="assignment" state="14"/>
+dnl           <transition type="goto" symbol="id" state="15"/>
+dnl           <transition type="goto" symbol="exp" state="16"/>
+dnl         </transitions>
+dnl         <errors/>
+dnl         <reductions/>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="6">
+dnl       <itemset>
+dnl         <item rule-number="1" dot="2"/>
+dnl         <item rule-number="5" dot="1"/>
+dnl         <item rule-number="6" dot="0"/>
+dnl         <item rule-number="7" dot="0"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions>
+dnl           <transition type="shift" symbol="&quot;end of file&quot;" state="17"/>
+dnl           <transition type="shift" symbol="&quot;identifier&quot;" state="18"/>
+dnl           <transition type="goto" symbol="assignment" state="14"/>
+dnl           <transition type="goto" symbol="id" state="15"/>
+dnl         </transitions>
+dnl         <errors/>
+dnl         <reductions/>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="7">
+dnl       <itemset>
+dnl         <item rule-number="10" dot="0"/>
+dnl         <item rule-number="10" dot="1"/>
+dnl         <item rule-number="11" dot="0"/>
+dnl         <item rule-number="12" dot="0"/>
+dnl         <item rule-number="13" dot="0"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions>
+dnl           <transition type="shift" symbol="&quot;incr&quot;" state="7"/>
+dnl           <transition type="shift" symbol="&quot;identifier&quot;" state="8"/>
+dnl           <transition type="shift" symbol="&quot;number&quot;" state="9"/>
+dnl           <transition type="shift" symbol="&quot;(&quot;" state="10"/>
+dnl           <transition type="goto" symbol="exp" state="19"/>
+dnl         </transitions>
+dnl         <errors/>
+dnl         <reductions/>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="8">
+dnl       <itemset>
+dnl         <item rule-number="12" dot="1"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions/>
+dnl         <errors/>
+dnl         <reductions>
+dnl           <reduction symbol="$default" rule="12" enabled="true"/>
+dnl         </reductions>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="9">
+dnl       <itemset>
+dnl         <item rule-number="13" dot="1"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions/>
+dnl         <errors/>
+dnl         <reductions>
+dnl           <reduction symbol="$default" rule="13" enabled="true"/>
+dnl         </reductions>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="10">
+dnl       <itemset>
+dnl         <item rule-number="10" dot="0"/>
+dnl         <item rule-number="11" dot="0"/>
+dnl         <item rule-number="11" dot="1"/>
+dnl         <item rule-number="12" dot="0"/>
+dnl         <item rule-number="13" dot="0"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions>
+dnl           <transition type="shift" symbol="&quot;incr&quot;" state="7"/>
+dnl           <transition type="shift" symbol="&quot;identifier&quot;" state="8"/>
+dnl           <transition type="shift" symbol="&quot;number&quot;" state="9"/>
+dnl           <transition type="shift" symbol="&quot;(&quot;" state="10"/>
+dnl           <transition type="goto" symbol="exp" state="20"/>
+dnl         </transitions>
+dnl         <errors/>
+dnl         <reductions/>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="11">
+dnl       <itemset>
+dnl         <item rule-number="2" dot="2"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions>
+dnl           <transition type="shift" symbol="&quot;end of file&quot;" state="21"/>
+dnl         </transitions>
+dnl         <errors/>
+dnl         <reductions/>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="12">
+dnl       <itemset>
+dnl         <item rule-number="0" dot="3"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions/>
+dnl         <errors/>
+dnl         <reductions>
+dnl           <reduction symbol="$default" rule="accept" enabled="true"/>
+dnl         </reductions>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="13">
+dnl       <itemset>
+dnl         <item rule-number="7" dot="1">
+dnl           <lookaheads>
+dnl             <symbol>&quot;:=&quot;</symbol>
+dnl           </lookaheads>
+dnl         </item>
+dnl         <item rule-number="12" dot="1">
+dnl           <lookaheads>
+dnl             <symbol>&quot;end of file&quot;</symbol>
+dnl           </lookaheads>
+dnl         </item>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions/>
+dnl         <errors/>
+dnl         <reductions>
+dnl           <reduction symbol="&quot;end of file&quot;" rule="12" enabled="true"/>
+dnl           <reduction symbol="$default" rule="7" enabled="true"/>
+dnl         </reductions>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="14">
+dnl       <itemset>
+dnl         <item rule-number="5" dot="2"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions/>
+dnl         <errors/>
+dnl         <reductions>
+dnl           <reduction symbol="$default" rule="5" enabled="true"/>
+dnl         </reductions>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="15">
+dnl       <itemset>
+dnl         <item rule-number="6" dot="1"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions>
+dnl           <transition type="shift" symbol="&quot;:=&quot;" state="22"/>
+dnl         </transitions>
+dnl         <errors/>
+dnl         <reductions/>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="16">
+dnl       <itemset>
+dnl         <item rule-number="3" dot="2"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions/>
+dnl         <errors/>
+dnl         <reductions>
+dnl           <reduction symbol="$default" rule="3" enabled="true"/>
+dnl         </reductions>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="17">
+dnl       <itemset>
+dnl         <item rule-number="1" dot="3"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions/>
+dnl         <errors/>
+dnl         <reductions>
+dnl           <reduction symbol="$default" rule="accept" enabled="true"/>
+dnl         </reductions>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="18">
+dnl       <itemset>
+dnl         <item rule-number="7" dot="1"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions/>
+dnl         <errors/>
+dnl         <reductions>
+dnl           <reduction symbol="$default" rule="7" enabled="true"/>
+dnl         </reductions>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="19">
+dnl       <itemset>
+dnl         <item rule-number="8" dot="0"/>
+dnl         <item rule-number="10" dot="2"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions>
+dnl           <transition type="goto" symbol="@1" state="23"/>
+dnl         </transitions>
+dnl         <errors/>
+dnl         <reductions>
+dnl           <reduction symbol="$default" rule="8" enabled="true"/>
+dnl         </reductions>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="20">
+dnl       <itemset>
+dnl         <item rule-number="11" dot="2"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions>
+dnl           <transition type="shift" symbol="&quot;)&quot;" state="24"/>
+dnl         </transitions>
+dnl         <errors/>
+dnl         <reductions/>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="21">
+dnl       <itemset>
+dnl         <item rule-number="2" dot="3"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions/>
+dnl         <errors/>
+dnl         <reductions>
+dnl           <reduction symbol="$default" rule="accept" enabled="true"/>
+dnl         </reductions>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="22">
+dnl       <itemset>
+dnl         <item rule-number="6" dot="2"/>
+dnl         <item rule-number="10" dot="0"/>
+dnl         <item rule-number="11" dot="0"/>
+dnl         <item rule-number="12" dot="0"/>
+dnl         <item rule-number="13" dot="0"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions>
+dnl           <transition type="shift" symbol="&quot;incr&quot;" state="7"/>
+dnl           <transition type="shift" symbol="&quot;identifier&quot;" state="8"/>
+dnl           <transition type="shift" symbol="&quot;number&quot;" state="9"/>
+dnl           <transition type="shift" symbol="&quot;(&quot;" state="10"/>
+dnl           <transition type="goto" symbol="exp" state="25"/>
+dnl         </transitions>
+dnl         <errors/>
+dnl         <reductions/>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="23">
+dnl       <itemset>
+dnl         <item rule-number="9" dot="0"/>
+dnl         <item rule-number="10" dot="3"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions>
+dnl           <transition type="goto" symbol="@2" state="26"/>
+dnl         </transitions>
+dnl         <errors/>
+dnl         <reductions>
+dnl           <reduction symbol="$default" rule="9" enabled="true"/>
+dnl         </reductions>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="24">
+dnl       <itemset>
+dnl         <item rule-number="11" dot="3"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions/>
+dnl         <errors/>
+dnl         <reductions>
+dnl           <reduction symbol="$default" rule="11" enabled="true"/>
+dnl         </reductions>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="25">
+dnl       <itemset>
+dnl         <item rule-number="6" dot="3"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions/>
+dnl         <errors/>
+dnl         <reductions>
+dnl           <reduction symbol="$default" rule="6" enabled="true"/>
+dnl         </reductions>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="26">
+dnl       <itemset>
+dnl         <item rule-number="10" dot="0"/>
+dnl         <item rule-number="10" dot="4"/>
+dnl         <item rule-number="11" dot="0"/>
+dnl         <item rule-number="12" dot="0"/>
+dnl         <item rule-number="13" dot="0"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions>
+dnl           <transition type="shift" symbol="&quot;incr&quot;" state="7"/>
+dnl           <transition type="shift" symbol="&quot;identifier&quot;" state="8"/>
+dnl           <transition type="shift" symbol="&quot;number&quot;" state="9"/>
+dnl           <transition type="shift" symbol="&quot;(&quot;" state="10"/>
+dnl           <transition type="goto" symbol="exp" state="27"/>
+dnl         </transitions>
+dnl         <errors/>
+dnl         <reductions/>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl
+dnl     <state number="27">
+dnl       <itemset>
+dnl         <item rule-number="10" dot="5"/>
+dnl       </itemset>
+dnl       <actions>
+dnl         <transitions/>
+dnl         <errors/>
+dnl         <reductions>
+dnl           <reduction symbol="$default" rule="10" enabled="true"/>
+dnl         </reductions>
+dnl       </actions>
+dnl       <solved-conflicts/>
+dnl     </state>
+dnl   </automaton>
+dnl </bison-xml-report>
+dnl ]])
+dnl
+dnl if test x"$XSLTPROC" != x""; then
+dnl   AT_CHECK([[$XSLTPROC \
+dnl              `]]AT_SET_ENV[[ bison --print-datadir`/xslt/xml2xhtml.xsl \
+dnl              input.xml >input.html]])
+dnl   AT_CHECK_HTML([input.html],
+dnl [[<?xml version="1.0" encoding="UTF-8"?>
+dnl <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+dnl <html xmlns="http://www.w3.org/1999/xhtml" xmlns:bison="https://www.gnu.org/software/bison/">
+dnl   <head>
+dnl     <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
+dnl     <title>input.yy - GNU Bison XML Automaton Report</title>
+dnl     <style type="text/css">
+dnl       body {
+dnl         font-family: "Nimbus Sans L", Arial, sans-serif;
+dnl         font-size: 9pt;
+dnl       }
+dnl       a:link {
+dnl         color: #1f00ff;
+dnl         text-decoration: none;
+dnl       }
+dnl       a:visited {
+dnl         color: #1f00ff;
+dnl         text-decoration: none;
+dnl       }
+dnl       a:hover {
+dnl         color: red;
+dnl       }
+dnl       #menu a {
+dnl         text-decoration: underline;
+dnl       }
+dnl       .i {
+dnl         font-style: italic;
+dnl       }
+dnl       .pre {
+dnl         font-family: monospace;
+dnl         white-space: pre;
+dnl       }
+dnl       ol.decimal {
+dnl         list-style-type: decimal;
+dnl       }
+dnl       ol.lower-alpha {
+dnl         list-style-type: lower-alpha;
+dnl       }
+dnl       .dot {
+dnl         color: #cc0000;
+dnl       }
+dnl       #footer {
+dnl         margin-top: 3.5em;
+dnl         font-size: 7pt;
+dnl       }
+dnl       </style>
+dnl   </head>
+dnl   <body><h1>GNU Bison XML Automaton Report</h1><p>
+dnl     input grammar: <span class="i">input.yy</span></p>
+dnl
+dnl <h3>Table of Contents</h3><ul id="menu"><li><a href="#reductions">Reductions</a><ul class="lower-alpha"><li><a href="#nonterminals_useless_in_grammar">Nonterminals useless in grammar</a></li><li><a href="#terminals_unused_in_grammar">Terminals unused in grammar</a></li><li><a href="#rules_useless_in_grammar">Rules useless in grammar</a></li></ul></li><li><a href="#conflicts">Conflicts</a></li><li><a href="#grammar">Grammar</a><ul class="lower-alpha"><li><a href="#grammar">Itemset</a></li><li><a href="#terminals">Terminal symbols</a></li><li><a href="#nonterminals">Nonterminal symbols</a></li></ul></li><li><a href="#automaton">Automaton</a></li></ul><h2><a name="reductions" id="reductions"></a> Reductions</h2><h3><a name="nonterminals_useless_in_grammar" id="nonterminals_useless_in_grammar"></a> Nonterminals useless in grammar</h3>
+dnl
+dnl <h3><a name="terminals_unused_in_grammar" id="terminals_unused_in_grammar"></a> Terminals unused in grammar</h3>
+dnl
+dnl <h3><a name="rules_useless_in_grammar" id="rules_useless_in_grammar"></a> Rules useless in grammar</h3>
+dnl <h2><a name="conflicts" id="conflicts"></a> Conflicts</h2>
+dnl
+dnl <h2><a name="grammar" id="grammar"></a> Grammar</h2>
+dnl <p class="pre">
+dnl   <a name="rule_0" id="rule_0">  0</a> <span class="i">$accept</span> → <b>YY_PARSE_unit</b> <span class="i">unit</span> <b>"end of file"</b>
+dnl   <a name="rule_1" id="rule_1">  1</a>         | <b>YY_PARSE_assignments</b> <span class="i">assignments</span> <b>"end of file"</b>
+dnl   <a name="rule_2" id="rule_2">  2</a>         | <b>YY_PARSE_exp</b> <span class="i">exp</span> <b>"end of file"</b>
+dnl
+dnl   <a name="rule_3" id="rule_3">  3</a> <span class="i">unit</span> → <span class="i">assignments</span> <span class="i">exp</span>
+dnl
+dnl   <a name="rule_4" id="rule_4">  4</a> <span class="i">assignments</span> → %empty
+dnl   <a name="rule_5" id="rule_5">  5</a>             | <span class="i">assignments</span> <span class="i">assignment</span>
+dnl
+dnl   <a name="rule_6" id="rule_6">  6</a> <span class="i">assignment</span> → <span class="i">id</span> <b>":="</b> <span class="i">exp</span>
+dnl
+dnl   <a name="rule_7" id="rule_7">  7</a> <span class="i">id</span> → <b>"identifier"</b>
+dnl
+dnl   <a name="rule_8" id="rule_8">  8</a> <span class="i">@1</span> → %empty
+dnl
+dnl   <a name="rule_9" id="rule_9">  9</a> <span class="i">@2</span> → %empty
+dnl
+dnl   <a name="rule_10" id="rule_10"> 10</a> <span class="i">exp</span> → <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+dnl   <a name="rule_11" id="rule_11"> 11</a>     | <b>"("</b> <span class="i">exp</span> <b>")"</b>
+dnl   <a name="rule_12" id="rule_12"> 12</a>     | <b>"identifier"</b>
+dnl   <a name="rule_13" id="rule_13"> 13</a>     | <b>"number"</b>
+dnl </p>
+dnl
+dnl <h3><a name="terminals" id="terminals"></a> Terminals, with rules where they appear</h3>
+dnl
+dnl <ul>
+dnl   <li><b>"end of file"</b> (0) <a href="#rule_0">0</a> <a href="#rule_1">1</a> <a href="#rule_2">2</a></li>
+dnl   <li><b>error</b> (256)</li>
+dnl   <li><b>":="</b> (258) <a href="#rule_6">6</a></li>
+dnl   <li><b>"incr"</b> (259) <a href="#rule_10">10</a></li>
+dnl   <li><b>"identifier"</b> &lt;std::string&gt; (260) <a href="#rule_7">7</a> <a href="#rule_12">12</a></li>
+dnl   <li><b>"number"</b> &lt;int&gt; (261) <a href="#rule_13">13</a></li>
+dnl   <li><b>YY_PARSE_unit</b> (262) <a href="#rule_0">0</a></li>
+dnl   <li><b>YY_PARSE_assignments</b> (263) <a href="#rule_1">1</a></li>
+dnl   <li><b>YY_PARSE_exp</b> (264) <a href="#rule_2">2</a></li>
+dnl   <li><b>"("</b> (265) <a href="#rule_11">11</a></li>
+dnl   <li><b>")"</b> (266) <a href="#rule_11">11</a></li>
+dnl </ul>
+dnl
+dnl <h3><a name="nonterminals" id="nonterminals"></a> Nonterminals, with rules where they appear</h3>
+dnl
+dnl <ul>
+dnl   <li><b>$accept</b> (12)
+dnl     <ul>
+dnl       <li>on left: <a href="#rule_0">0</a> <a href="#rule_1">1</a> <a href="#rule_2">2</a></li>
+dnl     </ul>
+dnl   </li>
+dnl   <li><b>unit</b> (13)
+dnl     <ul>
+dnl       <li>on left: <a href="#rule_3">3</a></li>
+dnl       <li>on right: <a href="#rule_0">0</a></li>
+dnl     </ul>
+dnl   </li>
+dnl   <li><b>assignments</b> (14)
+dnl     <ul>
+dnl       <li>on left: <a href="#rule_4">4</a> <a href="#rule_5">5</a></li>
+dnl       <li>on right: <a href="#rule_1">1</a> <a href="#rule_3">3</a> <a href="#rule_5">5</a></li>
+dnl     </ul>
+dnl   </li>
+dnl   <li><b>assignment</b> (15)
+dnl     <ul>
+dnl       <li>on left: <a href="#rule_6">6</a></li>
+dnl       <li>on right: <a href="#rule_5">5</a></li>
+dnl     </ul>
+dnl   </li>
+dnl   <li><b>id</b> &lt;std::string&gt; (16)
+dnl     <ul>
+dnl       <li>on left: <a href="#rule_7">7</a></li>
+dnl       <li>on right: <a href="#rule_6">6</a></li>
+dnl     </ul>
+dnl   </li>
+dnl   <li><b>exp</b> &lt;int&gt; (17)
+dnl     <ul>
+dnl       <li>on left: <a href="#rule_10">10</a> <a href="#rule_11">11</a> <a href="#rule_12">12</a> <a href="#rule_13">13</a></li>
+dnl       <li>on right: <a href="#rule_2">2</a> <a href="#rule_3">3</a> <a href="#rule_6">6</a> <a href="#rule_10">10</a> <a href="#rule_11">11</a></li>
+dnl     </ul>
+dnl   </li>
+dnl   <li><b>@1</b> &lt;int&gt; (18)
+dnl     <ul>
+dnl       <li>on left: <a href="#rule_8">8</a></li>
+dnl       <li>on right: <a href="#rule_10">10</a></li>
+dnl     </ul>
+dnl   </li>
+dnl   <li><b>@2</b> &lt;int&gt; (19)
+dnl     <ul>
+dnl       <li>on left: <a href="#rule_9">9</a></li>
+dnl       <li>on right: <a href="#rule_10">10</a></li>
+dnl     </ul>
+dnl   </li>
+dnl </ul><h2><a name="automaton" id="automaton"></a> Automaton</h2>
+dnl
+dnl <h3><a name="state_0" id="state_0"></a>State 0</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_0">  0</a> <span class="i">$accept</span> → <span class="dot">•</span> <b>YY_PARSE_unit</b> <span class="i">unit</span> <b>"end of file"</b>
+dnl   <a href="#rule_1">  1</a>         | <span class="dot">•</span> <b>YY_PARSE_assignments</b> <span class="i">assignments</span> <b>"end of file"</b>
+dnl   <a href="#rule_2">  2</a>         | <span class="dot">•</span> <b>YY_PARSE_exp</b> <span class="i">exp</span> <b>"end of file"</b>
+dnl
+dnl     YY_PARSE_unit         <a href="#state_1">shift, and go to state 1</a>
+dnl     YY_PARSE_assignments  <a href="#state_2">shift, and go to state 2</a>
+dnl     YY_PARSE_exp          <a href="#state_3">shift, and go to state 3</a>
+dnl </p>
+dnl
+dnl <h3><a name="state_1" id="state_1"></a>State 1</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_0">  0</a> <span class="i">$accept</span> → <b>YY_PARSE_unit</b> <span class="dot">•</span> <span class="i">unit</span> <b>"end of file"</b>
+dnl   <a href="#rule_3">  3</a> <span class="i">unit</span> → <span class="dot">•</span> <span class="i">assignments</span> <span class="i">exp</span>
+dnl   <a href="#rule_4">  4</a> <span class="i">assignments</span> → <span class="dot">•</span> %empty
+dnl   <a href="#rule_5">  5</a>             | <span class="dot">•</span> <span class="i">assignments</span> <span class="i">assignment</span>
+dnl
+dnl     $default  <a href="#rule_4">reduce using rule 4</a> (assignments)
+dnl
+dnl     unit         <a href="#state_4">go to state 4</a>
+dnl     assignments  <a href="#state_5">go to state 5</a>
+dnl </p>
+dnl
+dnl <h3><a name="state_2" id="state_2"></a>State 2</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_1">  1</a> <span class="i">$accept</span> → <b>YY_PARSE_assignments</b> <span class="dot">•</span> <span class="i">assignments</span> <b>"end of file"</b>
+dnl   <a href="#rule_4">  4</a> <span class="i">assignments</span> → <span class="dot">•</span> %empty
+dnl   <a href="#rule_5">  5</a>             | <span class="dot">•</span> <span class="i">assignments</span> <span class="i">assignment</span>
+dnl
+dnl     $default  <a href="#rule_4">reduce using rule 4</a> (assignments)
+dnl
+dnl     assignments  <a href="#state_6">go to state 6</a>
+dnl </p>
+dnl
+dnl <h3><a name="state_3" id="state_3"></a>State 3</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_2">  2</a> <span class="i">$accept</span> → <b>YY_PARSE_exp</b> <span class="dot">•</span> <span class="i">exp</span> <b>"end of file"</b>
+dnl   <a href="#rule_10"> 10</a> <span class="i">exp</span> → <span class="dot">•</span> <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+dnl   <a href="#rule_11"> 11</a>     | <span class="dot">•</span> <b>"("</b> <span class="i">exp</span> <b>")"</b>
+dnl   <a href="#rule_12"> 12</a>     | <span class="dot">•</span> <b>"identifier"</b>
+dnl   <a href="#rule_13"> 13</a>     | <span class="dot">•</span> <b>"number"</b>
+dnl
+dnl     "incr"        <a href="#state_7">shift, and go to state 7</a>
+dnl     "identifier"  <a href="#state_8">shift, and go to state 8</a>
+dnl     "number"      <a href="#state_9">shift, and go to state 9</a>
+dnl     "("           <a href="#state_10">shift, and go to state 10</a>
+dnl
+dnl     exp  <a href="#state_11">go to state 11</a>
+dnl </p>
+dnl
+dnl <h3><a name="state_4" id="state_4"></a>State 4</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_0">  0</a> <span class="i">$accept</span> → <b>YY_PARSE_unit</b> <span class="i">unit</span> <span class="dot">•</span> <b>"end of file"</b>
+dnl
+dnl     "end of file"  <a href="#state_12">shift, and go to state 12</a>
+dnl </p>
+dnl
+dnl <h3><a name="state_5" id="state_5"></a>State 5</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_3">  3</a> <span class="i">unit</span> → <span class="i">assignments</span> <span class="dot">•</span> <span class="i">exp</span>
+dnl   <a href="#rule_5">  5</a> <span class="i">assignments</span> → <span class="i">assignments</span> <span class="dot">•</span> <span class="i">assignment</span>
+dnl   <a href="#rule_6">  6</a> <span class="i">assignment</span> → <span class="dot">•</span> <span class="i">id</span> <b>":="</b> <span class="i">exp</span>
+dnl   <a href="#rule_7">  7</a> <span class="i">id</span> → <span class="dot">•</span> <b>"identifier"</b>
+dnl   <a href="#rule_10"> 10</a> <span class="i">exp</span> → <span class="dot">•</span> <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+dnl   <a href="#rule_11"> 11</a>     | <span class="dot">•</span> <b>"("</b> <span class="i">exp</span> <b>")"</b>
+dnl   <a href="#rule_12"> 12</a>     | <span class="dot">•</span> <b>"identifier"</b>
+dnl   <a href="#rule_13"> 13</a>     | <span class="dot">•</span> <b>"number"</b>
+dnl
+dnl     "incr"        <a href="#state_7">shift, and go to state 7</a>
+dnl     "identifier"  <a href="#state_13">shift, and go to state 13</a>
+dnl     "number"      <a href="#state_9">shift, and go to state 9</a>
+dnl     "("           <a href="#state_10">shift, and go to state 10</a>
+dnl
+dnl     assignment  <a href="#state_14">go to state 14</a>
+dnl     id          <a href="#state_15">go to state 15</a>
+dnl     exp         <a href="#state_16">go to state 16</a>
+dnl </p>
+dnl
+dnl <h3><a name="state_6" id="state_6"></a>State 6</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_1">  1</a> <span class="i">$accept</span> → <b>YY_PARSE_assignments</b> <span class="i">assignments</span> <span class="dot">•</span> <b>"end of file"</b>
+dnl   <a href="#rule_5">  5</a> <span class="i">assignments</span> → <span class="i">assignments</span> <span class="dot">•</span> <span class="i">assignment</span>
+dnl   <a href="#rule_6">  6</a> <span class="i">assignment</span> → <span class="dot">•</span> <span class="i">id</span> <b>":="</b> <span class="i">exp</span>
+dnl   <a href="#rule_7">  7</a> <span class="i">id</span> → <span class="dot">•</span> <b>"identifier"</b>
+dnl
+dnl     "end of file"  <a href="#state_17">shift, and go to state 17</a>
+dnl     "identifier"   <a href="#state_18">shift, and go to state 18</a>
+dnl
+dnl     assignment  <a href="#state_14">go to state 14</a>
+dnl     id          <a href="#state_15">go to state 15</a>
+dnl </p>
+dnl
+dnl <h3><a name="state_7" id="state_7"></a>State 7</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_10"> 10</a> <span class="i">exp</span> → <span class="dot">•</span> <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+dnl   <a href="#rule_10"> 10</a>     | <b>"incr"</b> <span class="dot">•</span> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+dnl   <a href="#rule_11"> 11</a>     | <span class="dot">•</span> <b>"("</b> <span class="i">exp</span> <b>")"</b>
+dnl   <a href="#rule_12"> 12</a>     | <span class="dot">•</span> <b>"identifier"</b>
+dnl   <a href="#rule_13"> 13</a>     | <span class="dot">•</span> <b>"number"</b>
+dnl
+dnl     "incr"        <a href="#state_7">shift, and go to state 7</a>
+dnl     "identifier"  <a href="#state_8">shift, and go to state 8</a>
+dnl     "number"      <a href="#state_9">shift, and go to state 9</a>
+dnl     "("           <a href="#state_10">shift, and go to state 10</a>
+dnl
+dnl     exp  <a href="#state_19">go to state 19</a>
+dnl </p>
+dnl
+dnl <h3><a name="state_8" id="state_8"></a>State 8</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_12"> 12</a> <span class="i">exp</span> → <b>"identifier"</b> <span class="dot">•</span>
+dnl
+dnl     $default  <a href="#rule_12">reduce using rule 12</a> (exp)
+dnl </p>
+dnl
+dnl <h3><a name="state_9" id="state_9"></a>State 9</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_13"> 13</a> <span class="i">exp</span> → <b>"number"</b> <span class="dot">•</span>
+dnl
+dnl     $default  <a href="#rule_13">reduce using rule 13</a> (exp)
+dnl </p>
+dnl
+dnl <h3><a name="state_10" id="state_10"></a>State 10</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_10"> 10</a> <span class="i">exp</span> → <span class="dot">•</span> <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+dnl   <a href="#rule_11"> 11</a>     | <span class="dot">•</span> <b>"("</b> <span class="i">exp</span> <b>")"</b>
+dnl   <a href="#rule_11"> 11</a>     | <b>"("</b> <span class="dot">•</span> <span class="i">exp</span> <b>")"</b>
+dnl   <a href="#rule_12"> 12</a>     | <span class="dot">•</span> <b>"identifier"</b>
+dnl   <a href="#rule_13"> 13</a>     | <span class="dot">•</span> <b>"number"</b>
+dnl
+dnl     "incr"        <a href="#state_7">shift, and go to state 7</a>
+dnl     "identifier"  <a href="#state_8">shift, and go to state 8</a>
+dnl     "number"      <a href="#state_9">shift, and go to state 9</a>
+dnl     "("           <a href="#state_10">shift, and go to state 10</a>
+dnl
+dnl     exp  <a href="#state_20">go to state 20</a>
+dnl </p>
+dnl
+dnl <h3><a name="state_11" id="state_11"></a>State 11</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_2">  2</a> <span class="i">$accept</span> → <b>YY_PARSE_exp</b> <span class="i">exp</span> <span class="dot">•</span> <b>"end of file"</b>
+dnl
+dnl     "end of file"  <a href="#state_21">shift, and go to state 21</a>
+dnl </p>
+dnl
+dnl <h3><a name="state_12" id="state_12"></a>State 12</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_0">  0</a> <span class="i">$accept</span> → <b>YY_PARSE_unit</b> <span class="i">unit</span> <b>"end of file"</b> <span class="dot">•</span>
+dnl
+dnl     $default  accept
+dnl </p>
+dnl
+dnl <h3><a name="state_13" id="state_13"></a>State 13</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_7">  7</a> <span class="i">id</span> → <b>"identifier"</b> <span class="dot">•</span>  [":="]
+dnl   <a href="#rule_12"> 12</a> <span class="i">exp</span> → <b>"identifier"</b> <span class="dot">•</span>  ["end of file"]
+dnl
+dnl     "end of file"  <a href="#rule_12">reduce using rule 12</a> (exp)
+dnl     $default       <a href="#rule_7">reduce using rule 7</a> (id)
+dnl </p>
+dnl
+dnl <h3><a name="state_14" id="state_14"></a>State 14</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_5">  5</a> <span class="i">assignments</span> → <span class="i">assignments</span> <span class="i">assignment</span> <span class="dot">•</span>
+dnl
+dnl     $default  <a href="#rule_5">reduce using rule 5</a> (assignments)
+dnl </p>
+dnl
+dnl <h3><a name="state_15" id="state_15"></a>State 15</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_6">  6</a> <span class="i">assignment</span> → <span class="i">id</span> <span class="dot">•</span> <b>":="</b> <span class="i">exp</span>
+dnl
+dnl     ":="  <a href="#state_22">shift, and go to state 22</a>
+dnl </p>
+dnl
+dnl <h3><a name="state_16" id="state_16"></a>State 16</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_3">  3</a> <span class="i">unit</span> → <span class="i">assignments</span> <span class="i">exp</span> <span class="dot">•</span>
+dnl
+dnl     $default  <a href="#rule_3">reduce using rule 3</a> (unit)
+dnl </p>
+dnl
+dnl <h3><a name="state_17" id="state_17"></a>State 17</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_1">  1</a> <span class="i">$accept</span> → <b>YY_PARSE_assignments</b> <span class="i">assignments</span> <b>"end of file"</b> <span class="dot">•</span>
+dnl
+dnl     $default  accept
+dnl </p>
+dnl
+dnl <h3><a name="state_18" id="state_18"></a>State 18</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_7">  7</a> <span class="i">id</span> → <b>"identifier"</b> <span class="dot">•</span>
+dnl
+dnl     $default  <a href="#rule_7">reduce using rule 7</a> (id)
+dnl </p>
+dnl
+dnl <h3><a name="state_19" id="state_19"></a>State 19</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_8">  8</a> <span class="i">@1</span> → <span class="dot">•</span> %empty
+dnl   <a href="#rule_10"> 10</a> <span class="i">exp</span> → <b>"incr"</b> <span class="i">exp</span> <span class="dot">•</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+dnl
+dnl     $default  <a href="#rule_8">reduce using rule 8</a> (@1)
+dnl
+dnl     @1  <a href="#state_23">go to state 23</a>
+dnl </p>
+dnl
+dnl <h3><a name="state_20" id="state_20"></a>State 20</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_11"> 11</a> <span class="i">exp</span> → <b>"("</b> <span class="i">exp</span> <span class="dot">•</span> <b>")"</b>
+dnl
+dnl     ")"  <a href="#state_24">shift, and go to state 24</a>
+dnl </p>
+dnl
+dnl <h3><a name="state_21" id="state_21"></a>State 21</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_2">  2</a> <span class="i">$accept</span> → <b>YY_PARSE_exp</b> <span class="i">exp</span> <b>"end of file"</b> <span class="dot">•</span>
+dnl
+dnl     $default  accept
+dnl </p>
+dnl
+dnl <h3><a name="state_22" id="state_22"></a>State 22</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_6">  6</a> <span class="i">assignment</span> → <span class="i">id</span> <b>":="</b> <span class="dot">•</span> <span class="i">exp</span>
+dnl   <a href="#rule_10"> 10</a> <span class="i">exp</span> → <span class="dot">•</span> <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+dnl   <a href="#rule_11"> 11</a>     | <span class="dot">•</span> <b>"("</b> <span class="i">exp</span> <b>")"</b>
+dnl   <a href="#rule_12"> 12</a>     | <span class="dot">•</span> <b>"identifier"</b>
+dnl   <a href="#rule_13"> 13</a>     | <span class="dot">•</span> <b>"number"</b>
+dnl
+dnl     "incr"        <a href="#state_7">shift, and go to state 7</a>
+dnl     "identifier"  <a href="#state_8">shift, and go to state 8</a>
+dnl     "number"      <a href="#state_9">shift, and go to state 9</a>
+dnl     "("           <a href="#state_10">shift, and go to state 10</a>
+dnl
+dnl     exp  <a href="#state_25">go to state 25</a>
+dnl </p>
+dnl
+dnl <h3><a name="state_23" id="state_23"></a>State 23</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_9">  9</a> <span class="i">@2</span> → <span class="dot">•</span> %empty
+dnl   <a href="#rule_10"> 10</a> <span class="i">exp</span> → <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="dot">•</span> <span class="i">@2</span> <span class="i">exp</span>
+dnl
+dnl     $default  <a href="#rule_9">reduce using rule 9</a> (@2)
+dnl
+dnl     @2  <a href="#state_26">go to state 26</a>
+dnl </p>
+dnl
+dnl <h3><a name="state_24" id="state_24"></a>State 24</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_11"> 11</a> <span class="i">exp</span> → <b>"("</b> <span class="i">exp</span> <b>")"</b> <span class="dot">•</span>
+dnl
+dnl     $default  <a href="#rule_11">reduce using rule 11</a> (exp)
+dnl </p>
+dnl
+dnl <h3><a name="state_25" id="state_25"></a>State 25</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_6">  6</a> <span class="i">assignment</span> → <span class="i">id</span> <b>":="</b> <span class="i">exp</span> <span class="dot">•</span>
+dnl
+dnl     $default  <a href="#rule_6">reduce using rule 6</a> (assignment)
+dnl </p>
+dnl
+dnl <h3><a name="state_26" id="state_26"></a>State 26</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_10"> 10</a> <span class="i">exp</span> → <span class="dot">•</span> <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span>
+dnl   <a href="#rule_10"> 10</a>     | <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="dot">•</span> <span class="i">exp</span>
+dnl   <a href="#rule_11"> 11</a>     | <span class="dot">•</span> <b>"("</b> <span class="i">exp</span> <b>")"</b>
+dnl   <a href="#rule_12"> 12</a>     | <span class="dot">•</span> <b>"identifier"</b>
+dnl   <a href="#rule_13"> 13</a>     | <span class="dot">•</span> <b>"number"</b>
+dnl
+dnl     "incr"        <a href="#state_7">shift, and go to state 7</a>
+dnl     "identifier"  <a href="#state_8">shift, and go to state 8</a>
+dnl     "number"      <a href="#state_9">shift, and go to state 9</a>
+dnl     "("           <a href="#state_10">shift, and go to state 10</a>
+dnl
+dnl     exp  <a href="#state_27">go to state 27</a>
+dnl </p>
+dnl
+dnl <h3><a name="state_27" id="state_27"></a>State 27</h3>
+dnl
+dnl <p class="pre">  <a href="#rule_10"> 10</a> <span class="i">exp</span> → <b>"incr"</b> <span class="i">exp</span> <span class="i">@1</span> <span class="i">@2</span> <span class="i">exp</span> <span class="dot">•</span>
+dnl
+dnl     $default  <a href="#rule_10">reduce using rule 10</a> (exp)
+dnl </p>
+dnl
+dnl <div id="footer"><hr />This document was generated using
+dnl       <a href="https://www.gnu.org/software/bison/" title="GNU Bison">
+dnl       GNU Bison ]AT_PACKAGE_VERSION[</a>
+dnl       XML Automaton Report.<br />
+dnl       Verbatim copying and distribution of this entire page is
+dnl       permitted in any medium, provided this notice is preserved.</div></body>
+dnl </html>
+dnl ]])
+dnl fi
+dnl
+dnl AT_BISON_OPTION_POPDEFS
+dnl AT_CLEANUP
+
+
+## ------------------------ ##
+## Reports with conflicts.  ##
+## ------------------------ ##
+
+AT_SETUP([Reports with conflicts])
+
+AT_KEYWORDS([cex report])
+
+# We need UTF-8 support for correct screen-width computation of UTF-8
+# characters.  Skip the test if not available.
+locale=`locale -a | $EGREP '^en_US\.(UTF-8|utf8)$' | sed 1q`
+AT_SKIP_IF([[test x = x"$locale"]])
+
+AT_SKIP_IF([[test x"$XSLTPROC" = x]])
+
+AT_BISON_OPTION_PUSHDEFS
+AT_DATA([input.y],
+[[%left "+"
+%%
+exp
+: exp "⊕" exp
+| exp "+" exp
+| exp "+" exp
+| "number"
+| "Ñùṃéℝô"
+]])
+
+AT_CHECK([LC_ALL="$locale" bison -fno-caret -o input.cc -rall -Wcex --graph=input.gv --html --xml input.y], [], [],
+[[input.y: warning: 3 shift/reduce conflicts [-Wconflicts-sr]
+input.y: warning: 3 reduce/reduce conflicts [-Wconflicts-rr]
+input.y: warning: shift/reduce conflict on token "⊕" [-Wcounterexamples]
+  Example: exp "+" exp • "⊕" exp
+  Shift derivation
+    exp
+    ↳ 2: exp "+" exp
+                 ↳ 1: exp • "⊕" exp
+  Reduce derivation
+    exp
+    ↳ 1: exp                "⊕" exp
+         ↳ 2: exp "+" exp •
+input.y: warning: reduce/reduce conflict on tokens $end, "+", "⊕" [-Wcounterexamples]
+  Example: exp "+" exp •
+  First reduce derivation
+    exp
+    ↳ 2: exp "+" exp •
+  Second reduce derivation
+    exp
+    ↳ 3: exp "+" exp •
+input.y: warning: shift/reduce conflict on token "⊕" [-Wcounterexamples]
+  Example: exp "+" exp • "⊕" exp
+  Shift derivation
+    exp
+    ↳ 2: exp "+" exp
+                 ↳ 1: exp • "⊕" exp
+  Reduce derivation
+    exp
+    ↳ 1: exp                "⊕" exp
+         ↳ 3: exp "+" exp •
+input.y: warning: shift/reduce conflict on token "⊕" [-Wcounterexamples]
+  Example: exp "⊕" exp • "⊕" exp
+  Shift derivation
+    exp
+    ↳ 1: exp "⊕" exp
+                 ↳ 1: exp • "⊕" exp
+  Reduce derivation
+    exp
+    ↳ 1: exp                "⊕" exp
+         ↳ 1: exp "⊕" exp •
+input.y: warning: shift/reduce conflict on token "+" [-Wcounterexamples]
+  Example: exp "⊕" exp • "+" exp
+  Shift derivation
+    exp
+    ↳ 1: exp "⊕" exp
+                 ↳ 2: exp • "+" exp
+  Reduce derivation
+    exp
+    ↳ 2: exp                "+" exp
+         ↳ 1: exp "⊕" exp •
+input.y: warning: shift/reduce conflict on token "+" [-Wcounterexamples]
+  Example: exp "⊕" exp • "+" exp
+  Shift derivation
+    exp
+    ↳ 1: exp "⊕" exp
+                 ↳ 3: exp • "+" exp
+  Reduce derivation
+    exp
+    ↳ 2: exp                "+" exp
+         ↳ 1: exp "⊕" exp •
+input.y:6.3-13: warning: rule useless in parser due to conflicts [-Wother]
+]])
+
+# Check the contents of the report.
+# FIXME: Avoid trailing white spaces.
+AT_CHECK([sed -e 's/ *$//' input.output], [],
+[[Rules useless in parser due to conflicts
+
+    3 exp: exp "+" exp
+
+
+State 7 conflicts: 1 shift/reduce, 3 reduce/reduce
+State 8 conflicts: 2 shift/reduce
+
+
+Grammar
+
+    0 $accept: exp $end
+
+    1 exp: exp "⊕" exp
+    2    | exp "+" exp
+    3    | exp "+" exp
+    4    | "number"
+    5    | "Ñùṃéℝô"
+
+
+Terminals, with rules where they appear
+
+    $end (0) 0
+    error (256)
+    "+" (258) 2 3
+    "⊕" (259) 1
+    "number" (260) 4
+    "Ñùṃéℝô" (261) 5
+
+
+Nonterminals, with rules where they appear
+
+    $accept (7)
+        on left: 0
+    exp (8)
+        on left: 1 2 3 4 5
+        on right: 0 1 2 3
+
+
+State 0
+
+    0 $accept: • exp $end
+    1 exp: • exp "⊕" exp
+    2    | • exp "+" exp
+    3    | • exp "+" exp
+    4    | • "number"
+    5    | • "Ñùṃéℝô"
+
+    "number"  shift, and go to state 1
+    "Ñùṃéℝô"  shift, and go to state 2
+
+    exp  go to state 3
+
+
+State 1
+
+    4 exp: "number" •
+
+    $default  reduce using rule 4 (exp)
+
+
+State 2
+
+    5 exp: "Ñùṃéℝô" •
+
+    $default  reduce using rule 5 (exp)
+
+
+State 3
+
+    0 $accept: exp • $end
+    1 exp: exp • "⊕" exp
+    2    | exp • "+" exp
+    3    | exp • "+" exp
+
+    $end  shift, and go to state 4
+    "+"   shift, and go to state 5
+    "⊕"   shift, and go to state 6
+
+
+State 4
+
+    0 $accept: exp $end •
+
+    $default  accept
+
+
+State 5
+
+    1 exp: • exp "⊕" exp
+    2    | • exp "+" exp
+    2    | exp "+" • exp
+    3    | • exp "+" exp
+    3    | exp "+" • exp
+    4    | • "number"
+    5    | • "Ñùṃéℝô"
+
+    "number"  shift, and go to state 1
+    "Ñùṃéℝô"  shift, and go to state 2
+
+    exp  go to state 7
+
+
+State 6
+
+    1 exp: • exp "⊕" exp
+    1    | exp "⊕" • exp
+    2    | • exp "+" exp
+    3    | • exp "+" exp
+    4    | • "number"
+    5    | • "Ñùṃéℝô"
+
+    "number"  shift, and go to state 1
+    "Ñùṃéℝô"  shift, and go to state 2
+
+    exp  go to state 8
+
+
+State 7
+
+    1 exp: exp • "⊕" exp
+    2    | exp • "+" exp
+    2    | exp "+" exp •  [$end, "+", "⊕"]
+    3    | exp • "+" exp
+    3    | exp "+" exp •  [$end, "+", "⊕"]
+
+    "⊕"  shift, and go to state 6
+
+    $end      reduce using rule 2 (exp)
+    $end      [reduce using rule 3 (exp)]
+    "+"       reduce using rule 2 (exp)
+    "+"       [reduce using rule 3 (exp)]
+    "⊕"       [reduce using rule 2 (exp)]
+    "⊕"       [reduce using rule 3 (exp)]
+    $default  reduce using rule 2 (exp)
+
+    Conflict between rule 2 and token "+" resolved as reduce (%left "+").
+
+    shift/reduce conflict on token "⊕":
+        2 exp: exp "+" exp •
+        1 exp: exp • "⊕" exp
+      Example: exp "+" exp • "⊕" exp
+      Shift derivation
+        exp
+        ↳ 2: exp "+" exp
+                     ↳ 1: exp • "⊕" exp
+      Reduce derivation
+        exp
+        ↳ 1: exp                "⊕" exp
+             ↳ 2: exp "+" exp •
+
+    reduce/reduce conflict on tokens $end, "+", "⊕":
+        2 exp: exp "+" exp •
+        3 exp: exp "+" exp •
+      Example: exp "+" exp •
+      First reduce derivation
+        exp
+        ↳ 2: exp "+" exp •
+      Second reduce derivation
+        exp
+        ↳ 3: exp "+" exp •
+
+    shift/reduce conflict on token "⊕":
+        3 exp: exp "+" exp •
+        1 exp: exp • "⊕" exp
+      Example: exp "+" exp • "⊕" exp
+      Shift derivation
+        exp
+        ↳ 2: exp "+" exp
+                     ↳ 1: exp • "⊕" exp
+      Reduce derivation
+        exp
+        ↳ 1: exp                "⊕" exp
+             ↳ 3: exp "+" exp •
+
+
+
+State 8
+
+    1 exp: exp • "⊕" exp
+    1    | exp "⊕" exp •  [$end, "+", "⊕"]
+    2    | exp • "+" exp
+    3    | exp • "+" exp
+
+    "+"  shift, and go to state 5
+    "⊕"  shift, and go to state 6
+
+    "+"       [reduce using rule 1 (exp)]
+    "⊕"       [reduce using rule 1 (exp)]
+    $default  reduce using rule 1 (exp)
+
+    shift/reduce conflict on token "⊕":
+        1 exp: exp "⊕" exp •
+        1 exp: exp • "⊕" exp
+      Example: exp "⊕" exp • "⊕" exp
+      Shift derivation
+        exp
+        ↳ 1: exp "⊕" exp
+                     ↳ 1: exp • "⊕" exp
+      Reduce derivation
+        exp
+        ↳ 1: exp                "⊕" exp
+             ↳ 1: exp "⊕" exp •
+
+    shift/reduce conflict on token "+":
+        1 exp: exp "⊕" exp •
+        2 exp: exp • "+" exp
+      Example: exp "⊕" exp • "+" exp
+      Shift derivation
+        exp
+        ↳ 1: exp "⊕" exp
+                     ↳ 2: exp • "+" exp
+      Reduce derivation
+        exp
+        ↳ 2: exp                "+" exp
+             ↳ 1: exp "⊕" exp •
+
+    shift/reduce conflict on token "+":
+        1 exp: exp "⊕" exp •
+        3 exp: exp • "+" exp
+      Example: exp "⊕" exp • "+" exp
+      Shift derivation
+        exp
+        ↳ 1: exp "⊕" exp
+                     ↳ 3: exp • "+" exp
+      Reduce derivation
+        exp
+        ↳ 2: exp                "+" exp
+             ↳ 1: exp "⊕" exp •
+
+]])
+
+
+
+
+AT_CHECK([cat input.gv], [],
+[[// Generated by GNU Bison ]AT_PACKAGE_VERSION[.
+// Report bugs to <bug-bison@gnu.org>.
+// Home page: <https://www.gnu.org/software/bison/>.
+
+digraph "input.y"
+{
+  node [fontname = courier, shape = box, colorscheme = paired6]
+  edge [fontname = courier]
+
+  0 [label="State 0\n\l  0 $accept: • exp $end\l  1 exp: • exp \"⊕\" exp\l  2    | • exp \"+\" exp\l  3    | • exp \"+\" exp\l  4    | • \"number\"\l  5    | • \"Ñùṃéℝô\"\l"]
+  0 -> 1 [style=solid label="\"number\""]
+  0 -> 2 [style=solid label="\"Ñùṃéℝô\""]
+  0 -> 3 [style=dashed label="exp"]
+  1 [label="State 1\n\l  4 exp: \"number\" •\l"]
+  1 -> "1R4" [style=solid]
+ "1R4" [label="R4", fillcolor=3, shape=diamond, style=filled]
+  2 [label="State 2\n\l  5 exp: \"Ñùṃéℝô\" •\l"]
+  2 -> "2R5" [style=solid]
+ "2R5" [label="R5", fillcolor=3, shape=diamond, style=filled]
+  3 [label="State 3\n\l  0 $accept: exp • $end\l  1 exp: exp • \"⊕\" exp\l  2    | exp • \"+\" exp\l  3    | exp • \"+\" exp\l"]
+  3 -> 4 [style=solid label="$end"]
+  3 -> 5 [style=solid label="\"+\""]
+  3 -> 6 [style=solid label="\"⊕\""]
+  4 [label="State 4\n\l  0 $accept: exp $end •\l"]
+  4 -> "4R0" [style=solid]
+ "4R0" [label="Acc", fillcolor=1, shape=diamond, style=filled]
+  5 [label="State 5\n\l  1 exp: • exp \"⊕\" exp\l  2    | • exp \"+\" exp\l  2    | exp \"+\" • exp\l  3    | • exp \"+\" exp\l  3    | exp \"+\" • exp\l  4    | • \"number\"\l  5    | • \"Ñùṃéℝô\"\l"]
+  5 -> 1 [style=solid label="\"number\""]
+  5 -> 2 [style=solid label="\"Ñùṃéℝô\""]
+  5 -> 7 [style=dashed label="exp"]
+  6 [label="State 6\n\l  1 exp: • exp \"⊕\" exp\l  1    | exp \"⊕\" • exp\l  2    | • exp \"+\" exp\l  3    | • exp \"+\" exp\l  4    | • \"number\"\l  5    | • \"Ñùṃéℝô\"\l"]
+  6 -> 1 [style=solid label="\"number\""]
+  6 -> 2 [style=solid label="\"Ñùṃéℝô\""]
+  6 -> 8 [style=dashed label="exp"]
+  7 [label="State 7\n\l  1 exp: exp • \"⊕\" exp\l  2    | exp • \"+\" exp\l  2    | exp \"+\" exp •  [$end, \"+\", \"⊕\"]\l  3    | exp • \"+\" exp\l  3    | exp \"+\" exp •  [$end, \"+\", \"⊕\"]\l"]
+  7 -> 6 [style=solid label="\"⊕\""]
+  7 -> "7R2d" [label="[\"⊕\"]", style=solid]
+ "7R2d" [label="R2", fillcolor=5, shape=diamond, style=filled]
+  7 -> "7R2" [style=solid]
+ "7R2" [label="R2", fillcolor=3, shape=diamond, style=filled]
+  7 -> "7R3d" [label="[$end, \"+\", \"⊕\"]", style=solid]
+ "7R3d" [label="R3", fillcolor=5, shape=diamond, style=filled]
+  8 [label="State 8\n\l  1 exp: exp • \"⊕\" exp\l  1    | exp \"⊕\" exp •  [$end, \"+\", \"⊕\"]\l  2    | exp • \"+\" exp\l  3    | exp • \"+\" exp\l"]
+  8 -> 5 [style=solid label="\"+\""]
+  8 -> 6 [style=solid label="\"⊕\""]
+  8 -> "8R1d" [label="[\"+\", \"⊕\"]", style=solid]
+ "8R1d" [label="R1", fillcolor=5, shape=diamond, style=filled]
+  8 -> "8R1" [style=solid]
+ "8R1" [label="R1", fillcolor=3, shape=diamond, style=filled]
+}
+]])
+
+
+AT_CHECK([[cat input.xml]], [],
+[[<?xml version="1.0"?>
+
+<bison-xml-report version="]AT_PACKAGE_VERSION[" bug-report="bug-bison@gnu.org" url="https://www.gnu.org/software/bison/">
+
+  <filename>input.y</filename>
+
+  <grammar>
+    <rules>
+      <rule number="0" usefulness="useful">
+        <lhs>$accept</lhs>
+        <rhs>
+          <symbol>exp</symbol>
+          <symbol>$end</symbol>
+        </rhs>
+      </rule>
+      <rule number="1" usefulness="useful">
+        <lhs>exp</lhs>
+        <rhs>
+          <symbol>exp</symbol>
+          <symbol>&quot;⊕&quot;</symbol>
+          <symbol>exp</symbol>
+        </rhs>
+      </rule>
+      <rule number="2" usefulness="useful">
+        <lhs>exp</lhs>
+        <rhs>
+          <symbol>exp</symbol>
+          <symbol>&quot;+&quot;</symbol>
+          <symbol>exp</symbol>
+        </rhs>
+      </rule>
+      <rule number="3" usefulness="useless-in-parser">
+        <lhs>exp</lhs>
+        <rhs>
+          <symbol>exp</symbol>
+          <symbol>&quot;+&quot;</symbol>
+          <symbol>exp</symbol>
+        </rhs>
+      </rule>
+      <rule number="4" usefulness="useful">
+        <lhs>exp</lhs>
+        <rhs>
+          <symbol>&quot;number&quot;</symbol>
+        </rhs>
+      </rule>
+      <rule number="5" usefulness="useful">
+        <lhs>exp</lhs>
+        <rhs>
+          <symbol>&quot;Ñùṃéℝô&quot;</symbol>
+        </rhs>
+      </rule>
+    </rules>
+    <terminals>
+      <terminal symbol-number="0" token-number="0" name="$end" type="" usefulness="useful"/>
+      <terminal symbol-number="1" token-number="256" name="error" type="" usefulness="useful"/>
+      <terminal symbol-number="3" token-number="258" name="&quot;+&quot;" type="" usefulness="useful" prec="1" assoc="left"/>
+      <terminal symbol-number="4" token-number="259" name="&quot;⊕&quot;" type="" usefulness="useful"/>
+      <terminal symbol-number="5" token-number="260" name="&quot;number&quot;" type="" usefulness="useful"/>
+      <terminal symbol-number="6" token-number="261" name="&quot;Ñùṃéℝô&quot;" type="" usefulness="useful"/>
+    </terminals>
+    <nonterminals>
+      <nonterminal symbol-number="7" name="$accept" type="" usefulness="useful"/>
+      <nonterminal symbol-number="8" name="exp" type="" usefulness="useful"/>
+    </nonterminals>
+  </grammar>
+
+  <automaton>
+
+    <state number="0">
+      <itemset>
+        <item rule-number="0" dot="0"/>
+        <item rule-number="1" dot="0"/>
+        <item rule-number="2" dot="0"/>
+        <item rule-number="3" dot="0"/>
+        <item rule-number="4" dot="0"/>
+        <item rule-number="5" dot="0"/>
+      </itemset>
+      <actions>
+        <transitions>
+          <transition type="shift" symbol="&quot;number&quot;" state="1"/>
+          <transition type="shift" symbol="&quot;Ñùṃéℝô&quot;" state="2"/>
+          <transition type="goto" symbol="exp" state="3"/>
+        </transitions>
+        <errors/>
+        <reductions/>
+      </actions>
+      <solved-conflicts/>
+    </state>
+
+    <state number="1">
+      <itemset>
+        <item rule-number="4" dot="1"/>
+      </itemset>
+      <actions>
+        <transitions/>
+        <errors/>
+        <reductions>
+          <reduction symbol="$default" rule="4" enabled="true"/>
+        </reductions>
+      </actions>
+      <solved-conflicts/>
+    </state>
+
+    <state number="2">
+      <itemset>
+        <item rule-number="5" dot="1"/>
+      </itemset>
+      <actions>
+        <transitions/>
+        <errors/>
+        <reductions>
+          <reduction symbol="$default" rule="5" enabled="true"/>
+        </reductions>
+      </actions>
+      <solved-conflicts/>
+    </state>
+
+    <state number="3">
+      <itemset>
+        <item rule-number="0" dot="1"/>
+        <item rule-number="1" dot="1"/>
+        <item rule-number="2" dot="1"/>
+        <item rule-number="3" dot="1"/>
+      </itemset>
+      <actions>
+        <transitions>
+          <transition type="shift" symbol="$end" state="4"/>
+          <transition type="shift" symbol="&quot;+&quot;" state="5"/>
+          <transition type="shift" symbol="&quot;⊕&quot;" state="6"/>
+        </transitions>
+        <errors/>
+        <reductions/>
+      </actions>
+      <solved-conflicts/>
+    </state>
+
+    <state number="4">
+      <itemset>
+        <item rule-number="0" dot="2"/>
+      </itemset>
+      <actions>
+        <transitions/>
+        <errors/>
+        <reductions>
+          <reduction symbol="$default" rule="accept" enabled="true"/>
+        </reductions>
+      </actions>
+      <solved-conflicts/>
+    </state>
+
+    <state number="5">
+      <itemset>
+        <item rule-number="1" dot="0"/>
+        <item rule-number="2" dot="0"/>
+        <item rule-number="2" dot="2"/>
+        <item rule-number="3" dot="0"/>
+        <item rule-number="3" dot="2"/>
+        <item rule-number="4" dot="0"/>
+        <item rule-number="5" dot="0"/>
+      </itemset>
+      <actions>
+        <transitions>
+          <transition type="shift" symbol="&quot;number&quot;" state="1"/>
+          <transition type="shift" symbol="&quot;Ñùṃéℝô&quot;" state="2"/>
+          <transition type="goto" symbol="exp" state="7"/>
+        </transitions>
+        <errors/>
+        <reductions/>
+      </actions>
+      <solved-conflicts/>
+    </state>
+
+    <state number="6">
+      <itemset>
+        <item rule-number="1" dot="0"/>
+        <item rule-number="1" dot="2"/>
+        <item rule-number="2" dot="0"/>
+        <item rule-number="3" dot="0"/>
+        <item rule-number="4" dot="0"/>
+        <item rule-number="5" dot="0"/>
+      </itemset>
+      <actions>
+        <transitions>
+          <transition type="shift" symbol="&quot;number&quot;" state="1"/>
+          <transition type="shift" symbol="&quot;Ñùṃéℝô&quot;" state="2"/>
+          <transition type="goto" symbol="exp" state="8"/>
+        </transitions>
+        <errors/>
+        <reductions/>
+      </actions>
+      <solved-conflicts/>
+    </state>
+
+    <state number="7">
+      <itemset>
+        <item rule-number="1" dot="1"/>
+        <item rule-number="2" dot="1"/>
+        <item rule-number="2" dot="3">
+          <lookaheads>
+            <symbol>$end</symbol>
+            <symbol>&quot;+&quot;</symbol>
+            <symbol>&quot;⊕&quot;</symbol>
+          </lookaheads>
+        </item>
+        <item rule-number="3" dot="1"/>
+        <item rule-number="3" dot="3">
+          <lookaheads>
+            <symbol>$end</symbol>
+            <symbol>&quot;+&quot;</symbol>
+            <symbol>&quot;⊕&quot;</symbol>
+          </lookaheads>
+        </item>
+      </itemset>
+      <actions>
+        <transitions>
+          <transition type="shift" symbol="&quot;⊕&quot;" state="6"/>
+        </transitions>
+        <errors/>
+        <reductions>
+          <reduction symbol="$end" rule="2" enabled="true"/>
+          <reduction symbol="$end" rule="3" enabled="false"/>
+          <reduction symbol="&quot;+&quot;" rule="2" enabled="true"/>
+          <reduction symbol="&quot;+&quot;" rule="3" enabled="false"/>
+          <reduction symbol="&quot;⊕&quot;" rule="2" enabled="false"/>
+          <reduction symbol="&quot;⊕&quot;" rule="3" enabled="false"/>
+          <reduction symbol="$default" rule="2" enabled="true"/>
+        </reductions>
+      </actions>
+      <solved-conflicts>
+        <resolution rule="2" symbol="&quot;+&quot;" type="reduce">%left &quot;+&quot;</resolution>
+      </solved-conflicts>
+    </state>
+
+    <state number="8">
+      <itemset>
+        <item rule-number="1" dot="1"/>
+        <item rule-number="1" dot="3">
+          <lookaheads>
+            <symbol>$end</symbol>
+            <symbol>&quot;+&quot;</symbol>
+            <symbol>&quot;⊕&quot;</symbol>
+          </lookaheads>
+        </item>
+        <item rule-number="2" dot="1"/>
+        <item rule-number="3" dot="1"/>
+      </itemset>
+      <actions>
+        <transitions>
+          <transition type="shift" symbol="&quot;+&quot;" state="5"/>
+          <transition type="shift" symbol="&quot;⊕&quot;" state="6"/>
+        </transitions>
+        <errors/>
+        <reductions>
+          <reduction symbol="&quot;+&quot;" rule="1" enabled="false"/>
+          <reduction symbol="&quot;⊕&quot;" rule="1" enabled="false"/>
+          <reduction symbol="$default" rule="1" enabled="true"/>
+        </reductions>
+      </actions>
+      <solved-conflicts/>
+    </state>
+  </automaton>
+</bison-xml-report>
+]])
+
+
+AT_CHECK_HTML([input.html],
+[[<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:bison="https://www.gnu.org/software/bison/">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
+    <title>input.y - GNU Bison XML Automaton Report</title>
+    <style type="text/css">
+      body {
+        font-family: "Nimbus Sans L", Arial, sans-serif;
+        font-size: 9pt;
+      }
+      a:link {
+        color: #1f00ff;
+        text-decoration: none;
+      }
+      a:visited {
+        color: #1f00ff;
+        text-decoration: none;
+      }
+      a:hover {
+        color: red;
+      }
+      #menu a {
+        text-decoration: underline;
+      }
+      .i {
+        font-style: italic;
+      }
+      .pre {
+        font-family: monospace;
+        white-space: pre;
+      }
+      ol.decimal {
+        list-style-type: decimal;
+      }
+      ol.lower-alpha {
+        list-style-type: lower-alpha;
+      }
+      .dot {
+        color: #cc0000;
+      }
+      #footer {
+        margin-top: 3.5em;
+        font-size: 7pt;
+      }
+      </style>
+  </head>
+  <body><h1>GNU Bison XML Automaton Report</h1><p>
+    input grammar: <span class="i">input.y</span></p>
+
+<h3>Table of Contents</h3><ul id="menu"><li><a href="#reductions">Reductions</a><ul class="lower-alpha"><li><a href="#nonterminals_useless_in_grammar">Nonterminals useless in grammar</a></li><li><a href="#terminals_unused_in_grammar">Terminals unused in grammar</a></li><li><a href="#rules_useless_in_grammar">Rules useless in grammar</a></li><li><a href="#rules_useless_in_parser">Rules useless in parser due to conflicts</a></li></ul></li><li><a href="#conflicts">Conflicts</a></li><li><a href="#grammar">Grammar</a><ul class="lower-alpha"><li><a href="#grammar">Itemset</a></li><li><a href="#terminals">Terminal symbols</a></li><li><a href="#nonterminals">Nonterminal symbols</a></li></ul></li><li><a href="#automaton">Automaton</a></li></ul><h2><a name="reductions" id="reductions"></a> Reductions</h2><h3><a name="nonterminals_useless_in_grammar" id="nonterminals_useless_in_grammar"></a> Nonterminals useless in grammar</h3>
+
+<h3><a name="terminals_unused_in_grammar" id="terminals_unused_in_grammar"></a> Terminals unused in grammar</h3>
+
+<h3><a name="rules_useless_in_grammar" id="rules_useless_in_grammar"></a> Rules useless in grammar</h3>
+<h2><a name="rules_useless_in_parser" id="rules_useless_in_parser"></a> Rules useless in parser due to conflicts</h2>
+<p class="pre">
+  <a href="#rule_3">  3</a> <span class="i">exp</span> → <span class="i">exp</span> <b>"+"</b> <span class="i">exp</span>
+</p>
+
+<h2><a name="conflicts" id="conflicts"></a> Conflicts</h2>
+
+<p class="pre"><a href="#state_7">State 7</a> conflicts: 1 shift/reduce, 3 reduce/reduce
+<a href="#state_8">State 8</a> conflicts: 2 shift/reduce
+
+
+</p><h2><a name="grammar" id="grammar"></a> Grammar</h2>
+<p class="pre">
+  <a name="rule_0" id="rule_0">  0</a> <span class="i">$accept</span> → <span class="i">exp</span> <b>$end</b>
+
+  <a name="rule_1" id="rule_1">  1</a> <span class="i">exp</span> → <span class="i">exp</span> <b>"⊕"</b> <span class="i">exp</span>
+  <a name="rule_2" id="rule_2">  2</a>     | <span class="i">exp</span> <b>"+"</b> <span class="i">exp</span>
+  <a name="rule_3" id="rule_3">  3</a>     | <span class="i">exp</span> <b>"+"</b> <span class="i">exp</span>
+  <a name="rule_4" id="rule_4">  4</a>     | <b>"number"</b>
+  <a name="rule_5" id="rule_5">  5</a>     | <b>"Ñùṃéℝô"</b>
+</p>
+
+<h3><a name="terminals" id="terminals"></a> Terminals, with rules where they appear</h3>
+
+<ul>
+  <li><b>$end</b> (0) <a href="#rule_0">0</a></li>
+  <li><b>error</b> (256)</li>
+  <li><b>"+"</b> (258) <a href="#rule_2">2</a> <a href="#rule_3">3</a></li>
+  <li><b>"⊕"</b> (259) <a href="#rule_1">1</a></li>
+  <li><b>"number"</b> (260) <a href="#rule_4">4</a></li>
+  <li><b>"Ñùṃéℝô"</b> (261) <a href="#rule_5">5</a></li>
+</ul>
+
+<h3><a name="nonterminals" id="nonterminals"></a> Nonterminals, with rules where they appear</h3>
+
+<ul>
+  <li><b>$accept</b> (7)
+    <ul>
+      <li>on left: <a href="#rule_0">0</a></li>
+    </ul>
+  </li>
+  <li><b>exp</b> (8)
+    <ul>
+      <li>on left: <a href="#rule_1">1</a> <a href="#rule_2">2</a> <a href="#rule_3">3</a> <a href="#rule_4">4</a> <a href="#rule_5">5</a></li>
+      <li>on right: <a href="#rule_0">0</a> <a href="#rule_1">1</a> <a href="#rule_2">2</a> <a href="#rule_3">3</a></li>
+    </ul>
+  </li>
+</ul><h2><a name="automaton" id="automaton"></a> Automaton</h2>
+
+<h3><a name="state_0" id="state_0"></a>State 0</h3>
+
+<p class="pre">  <a href="#rule_0">  0</a> <span class="i">$accept</span> → <span class="dot">•</span> <span class="i">exp</span> <b>$end</b>
+  <a href="#rule_1">  1</a> <span class="i">exp</span> → <span class="dot">•</span> <span class="i">exp</span> <b>"⊕"</b> <span class="i">exp</span>
+  <a href="#rule_2">  2</a>     | <span class="dot">•</span> <span class="i">exp</span> <b>"+"</b> <span class="i">exp</span>
+  <a href="#rule_3">  3</a>     | <span class="dot">•</span> <span class="i">exp</span> <b>"+"</b> <span class="i">exp</span>
+  <a href="#rule_4">  4</a>     | <span class="dot">•</span> <b>"number"</b>
+  <a href="#rule_5">  5</a>     | <span class="dot">•</span> <b>"Ñùṃéℝô"</b>
+
+    "number"  <a href="#state_1">shift, and go to state 1</a>
+    "Ñùṃéℝô"  <a href="#state_2">shift, and go to state 2</a>
+
+    exp  <a href="#state_3">go to state 3</a>
+</p>
+
+<h3><a name="state_1" id="state_1"></a>State 1</h3>
+
+<p class="pre">  <a href="#rule_4">  4</a> <span class="i">exp</span> → <b>"number"</b> <span class="dot">•</span>
+
+    $default  <a href="#rule_4">reduce using rule 4</a> (exp)
+</p>
+
+<h3><a name="state_2" id="state_2"></a>State 2</h3>
+
+<p class="pre">  <a href="#rule_5">  5</a> <span class="i">exp</span> → <b>"Ñùṃéℝô"</b> <span class="dot">•</span>
+
+    $default  <a href="#rule_5">reduce using rule 5</a> (exp)
+</p>
+
+<h3><a name="state_3" id="state_3"></a>State 3</h3>
+
+<p class="pre">  <a href="#rule_0">  0</a> <span class="i">$accept</span> → <span class="i">exp</span> <span class="dot">•</span> <b>$end</b>
+  <a href="#rule_1">  1</a> <span class="i">exp</span> → <span class="i">exp</span> <span class="dot">•</span> <b>"⊕"</b> <span class="i">exp</span>
+  <a href="#rule_2">  2</a>     | <span class="i">exp</span> <span class="dot">•</span> <b>"+"</b> <span class="i">exp</span>
+  <a href="#rule_3">  3</a>     | <span class="i">exp</span> <span class="dot">•</span> <b>"+"</b> <span class="i">exp</span>
+
+    $end  <a href="#state_4">shift, and go to state 4</a>
+    "+"   <a href="#state_5">shift, and go to state 5</a>
+    "⊕"   <a href="#state_6">shift, and go to state 6</a>
+</p>
+
+<h3><a name="state_4" id="state_4"></a>State 4</h3>
+
+<p class="pre">  <a href="#rule_0">  0</a> <span class="i">$accept</span> → <span class="i">exp</span> <b>$end</b> <span class="dot">•</span>
+
+    $default  accept
+</p>
+
+<h3><a name="state_5" id="state_5"></a>State 5</h3>
+
+<p class="pre">  <a href="#rule_1">  1</a> <span class="i">exp</span> → <span class="dot">•</span> <span class="i">exp</span> <b>"⊕"</b> <span class="i">exp</span>
+  <a href="#rule_2">  2</a>     | <span class="dot">•</span> <span class="i">exp</span> <b>"+"</b> <span class="i">exp</span>
+  <a href="#rule_2">  2</a>     | <span class="i">exp</span> <b>"+"</b> <span class="dot">•</span> <span class="i">exp</span>
+  <a href="#rule_3">  3</a>     | <span class="dot">•</span> <span class="i">exp</span> <b>"+"</b> <span class="i">exp</span>
+  <a href="#rule_3">  3</a>     | <span class="i">exp</span> <b>"+"</b> <span class="dot">•</span> <span class="i">exp</span>
+  <a href="#rule_4">  4</a>     | <span class="dot">•</span> <b>"number"</b>
+  <a href="#rule_5">  5</a>     | <span class="dot">•</span> <b>"Ñùṃéℝô"</b>
+
+    "number"  <a href="#state_1">shift, and go to state 1</a>
+    "Ñùṃéℝô"  <a href="#state_2">shift, and go to state 2</a>
+
+    exp  <a href="#state_7">go to state 7</a>
+</p>
+
+<h3><a name="state_6" id="state_6"></a>State 6</h3>
+
+<p class="pre">  <a href="#rule_1">  1</a> <span class="i">exp</span> → <span class="dot">•</span> <span class="i">exp</span> <b>"⊕"</b> <span class="i">exp</span>
+  <a href="#rule_1">  1</a>     | <span class="i">exp</span> <b>"⊕"</b> <span class="dot">•</span> <span class="i">exp</span>
+  <a href="#rule_2">  2</a>     | <span class="dot">•</span> <span class="i">exp</span> <b>"+"</b> <span class="i">exp</span>
+  <a href="#rule_3">  3</a>     | <span class="dot">•</span> <span class="i">exp</span> <b>"+"</b> <span class="i">exp</span>
+  <a href="#rule_4">  4</a>     | <span class="dot">•</span> <b>"number"</b>
+  <a href="#rule_5">  5</a>     | <span class="dot">•</span> <b>"Ñùṃéℝô"</b>
+
+    "number"  <a href="#state_1">shift, and go to state 1</a>
+    "Ñùṃéℝô"  <a href="#state_2">shift, and go to state 2</a>
+
+    exp  <a href="#state_8">go to state 8</a>
+</p>
+
+<h3><a name="state_7" id="state_7"></a>State 7</h3>
+
+<p class="pre">  <a href="#rule_1">  1</a> <span class="i">exp</span> → <span class="i">exp</span> <span class="dot">•</span> <b>"⊕"</b> <span class="i">exp</span>
+  <a href="#rule_2">  2</a>     | <span class="i">exp</span> <span class="dot">•</span> <b>"+"</b> <span class="i">exp</span>
+  <a href="#rule_2">  2</a>     | <span class="i">exp</span> <b>"+"</b> <span class="i">exp</span> <span class="dot">•</span>  [$end, "+", "⊕"]
+  <a href="#rule_3">  3</a>     | <span class="i">exp</span> <span class="dot">•</span> <b>"+"</b> <span class="i">exp</span>
+  <a href="#rule_3">  3</a>     | <span class="i">exp</span> <b>"+"</b> <span class="i">exp</span> <span class="dot">•</span>  [$end, "+", "⊕"]
+
+    "⊕"  <a href="#state_6">shift, and go to state 6</a>
+
+    $end      <a href="#rule_2">reduce using rule 2</a> (exp)
+    $end      [<a href="#rule_3">reduce using rule 3</a> (exp)]
+    "+"       <a href="#rule_2">reduce using rule 2</a> (exp)
+    "+"       [<a href="#rule_3">reduce using rule 3</a> (exp)]
+    "⊕"       [<a href="#rule_2">reduce using rule 2</a> (exp)]
+    "⊕"       [<a href="#rule_3">reduce using rule 3</a> (exp)]
+    $default  <a href="#rule_2">reduce using rule 2</a> (exp)
+
+    Conflict between <a href="#rule_2">rule 2</a> and token "+" resolved as reduce (%left "+").
+</p>
+
+<h3><a name="state_8" id="state_8"></a>State 8</h3>
+
+<p class="pre">  <a href="#rule_1">  1</a> <span class="i">exp</span> → <span class="i">exp</span> <span class="dot">•</span> <b>"⊕"</b> <span class="i">exp</span>
+  <a href="#rule_1">  1</a>     | <span class="i">exp</span> <b>"⊕"</b> <span class="i">exp</span> <span class="dot">•</span>  [$end, "+", "⊕"]
+  <a href="#rule_2">  2</a>     | <span class="i">exp</span> <span class="dot">•</span> <b>"+"</b> <span class="i">exp</span>
+  <a href="#rule_3">  3</a>     | <span class="i">exp</span> <span class="dot">•</span> <b>"+"</b> <span class="i">exp</span>
+
+    "+"  <a href="#state_5">shift, and go to state 5</a>
+    "⊕"  <a href="#state_6">shift, and go to state 6</a>
+
+    "+"       [<a href="#rule_1">reduce using rule 1</a> (exp)]
+    "⊕"       [<a href="#rule_1">reduce using rule 1</a> (exp)]
+    $default  <a href="#rule_1">reduce using rule 1</a> (exp)
+</p>
+
+<div id="footer"><hr />This document was generated using
+      <a href="https://www.gnu.org/software/bison/" title="GNU Bison">
+      GNU Bison ]AT_PACKAGE_VERSION[</a>
+      XML Automaton Report.<br />
+      Verbatim copying and distribution of this entire page is
+      permitted in any medium, provided this notice is preserved.</div></body>
+</html>
+]])
 
 AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
diff --git a/tests/scanner.at b/tests/scanner.at
index c03dbbb..44bae6e 100644
--- a/tests/scanner.at
+++ b/tests/scanner.at
@@ -1,6 +1,6 @@
 # Interface with the scanner.                           -*- Autotest -*-
 
-# Copyright (C) 2019 Free Software Foundation, Inc.
+# Copyright (C) 2019-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[Interface with the scanner.]])
 
@@ -94,7 +94,7 @@
 import std.stdio;
 
 auto yyLexer(R)(R range)
-  if (isInputRange!R && is (ElementType!R : dchar))
+if (isInputRange!R && is (ElementType!R : dchar))
 {
   return new YYLexer!R(range);
 }
@@ -105,28 +105,20 @@
 }
 
 class YYLexer(R) : Lexer
-  if (isInputRange!R && is (ElementType!R : dchar))
+if (isInputRange!R && is (ElementType!R : dchar))
 {
   R input;
 
-  this(R r) {
-    input = r;
-  }
+  this(R r) { input = r; }
 
   ]AT_YYERROR_DEFINE[
 
-  YYSemanticType semanticVal_;
-  public final @property YYSemanticType semanticVal ()
-  {
-    return semanticVal_;
-  }
-
-  int yylex ()
+  Symbol yylex ()
   {
     import std.uni : isNumber;
     // Handle EOF.
     if (input.empty)
-      return YYTokenType.EOF;
+      return Symbol(TokenKind.END);
 
     auto c = input.front;
     input.popFront;
@@ -135,14 +127,13 @@
     switch (c)
     {
     case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
-      semanticVal_.val = c - '0';
-      return YYTokenType.NUM;
-    case '+': return YYTokenType.PLUS;
-    case '-': return YYTokenType.MINUS;
-    case '*': return YYTokenType.STAR;
-    case '/': return YYTokenType.SLASH;
-    case '(': return YYTokenType.LPAR;
-    case ')': return YYTokenType.RPAR;
+      return Symbol(TokenKind.NUM, c - '0');
+    case '+': return Symbol(TokenKind.PLUS);
+    case '-': return Symbol(TokenKind.MINUS);
+    case '*': return Symbol(TokenKind.STAR);
+    case '/': return Symbol(TokenKind.SLASH);
+    case '(': return Symbol(TokenKind.LPAR);
+    case ')': return Symbol(TokenKind.RPAR);
     default: assert(0);
     }
   }
@@ -158,6 +149,76 @@
 }]])
 
 
+m4_pushdef([AT_MAIN_DEFINE(java)],
+[[class input
+{
+  public static void main (String[] args) throws IOException
+  {]AT_LEXPARAM_IF([[
+    ]AT_PARSER_CLASS[ p = new ]AT_PARSER_CLASS[ (System.in);]], [[
+    ]AT_API_prefix[Lexer l = new ]AT_API_prefix[Lexer (System.in);
+    ]AT_PARSER_CLASS[ p = new ]AT_PARSER_CLASS[ (l);]])AT_DEBUG_IF([[
+    //p.setDebugLevel (1);]])[
+    boolean success = p.parse ();
+    if (!success)
+      System.exit (1);
+  }
+}]])
+
+m4_define([AT_RAW_YYLEX(java)],
+[[class CalcLexer implements Calc.Lexer {
+
+  StreamTokenizer st;
+
+  public CalcLexer(InputStream is) {
+    st = new StreamTokenizer(new StringReader("0-(1+2)*3/9"));
+    st.resetSyntax();
+    st.eolIsSignificant(true);
+    st.whitespaceChars('\t', '\t');
+    st.whitespaceChars(' ', ' ');
+    st.wordChars('0', '9');
+  }
+
+  public void yyerror(String s) {
+    System.err.println(s);
+  }
+
+  Integer yylval;
+
+  public Object getLVal() {
+    return yylval;
+  }
+
+  public int yylex() throws IOException {
+    int ttype = st.nextToken();
+    switch (ttype)
+      {
+      case StreamTokenizer.TT_EOF:
+        return EOF;
+      case StreamTokenizer.TT_EOL:
+        return (int) '\n';
+      case StreamTokenizer.TT_WORD:
+        yylval = Integer.parseInt(st.sval);
+        return NUM;
+      case '+':
+        return PLUS;
+      case '-':
+        return MINUS;
+      case '*':
+        return STAR;
+      case '/':
+        return SLASH;
+      case '(':
+        return LPAR;
+      case ')':
+        return RPAR;
+      default:
+        throw new AssertionError("invalid character: " + ttype);
+      }
+  }
+}
+]])
+
+
 ## ------------------- ##
 ## Raw token numbers.  ##
 ## ------------------- ##
@@ -166,19 +227,31 @@
 [
 AT_SETUP([Token numbers: $1])
 
-AT_BISON_OPTION_PUSHDEFS([%debug $1])
+AT_BISON_OPTION_PUSHDEFS([%debug ]m4_bmatch([$1], [java], [[%define api.prefix {Calc} %define api.parser.class {Calc}]])[ $1])
 AT_DATA_GRAMMAR([[input.y]],
 [[$1
 %debug
-]AT_D_IF([], [[
+]AT_LANG_MATCH([[c\|c++]], [[
 %code
 {
 #include <stdio.h>
 ]AT_YYERROR_DECLARE[
 ]AT_YYLEX_DECLARE[
-}]])[
+}]],
+  [java], [[
+%define api.prefix {Calc}
+%define api.parser.class {Calc}
+%code imports {
+  import java.io.IOException;
+  import java.io.InputStream;
+  import java.io.StringReader;
+  import java.io.Reader;
+  import java.io.StreamTokenizer;
+}
+]])[
 
-]AT_VARIANT_IF([[
+]AT_LANG_MATCH([c\|c++\|d],
+[AT_VARIANT_IF([[
 %token <int> NUM "number"
 %nterm <int> exp
 ]], [[
@@ -187,6 +260,10 @@
 }
 %token <val> NUM "number"
 %nterm <val> exp
+]])],
+    [java],
+[[%token <Integer> NUM "number"
+%type  <Integer> exp
 ]])[
 
 %token
@@ -204,7 +281,7 @@
 %%
 
 input
-: exp         { printf ("%d\n", $][1); }
+: exp         { ]AT_JAVA_IF([[System.out.println ($][1)]], [[printf ("%d\n", $][1)]])[; }
 ;
 
 exp
@@ -217,21 +294,27 @@
 ;
 
 %%
-]AT_YYERROR_DEFINE[
+]AT_LANG_MATCH([c\|c++\|d],
+               [AT_YYERROR_DEFINE])[
 ]AT_RAW_YYLEX[
 ]AT_MAIN_DEFINE[
 ]])
 
 AT_FULL_COMPILE([input])
 
+# When api.token.raw, the yytranslate table should not be included.
+#
 # yacc.c, glr.c and glr.cc use 'yytranslate' (and YYTRANSLATE).
 # lalr1.cc uses 'translate_table' (and yytranslate_).
 # lalr1.d uses 'byte[] translate_table =' (and yytranslate_).
-AT_CHECK([[$EGREP -c 'yytranslate\[\]|translate_table\[\]|translate_table =' input.]AT_LANG_EXT],
+# lalr1.java uses 'byte[] translate_table_ =' (and yytranslate_).
+AT_CHECK([[$EGREP -c 'yytranslate\[\]|translate_table\[\]|translate_table =|translate_table_ =' input.]AT_LANG_EXT],
          [ignore],
-         [AT_TOKEN_RAW_IF([0], [1])[
+         [AT_D_IF([AT_TOKEN_RAW_IF([0], [0])],
+                  [AT_TOKEN_RAW_IF([0], [1])])[
 ]])
 
+
 AT_PARSER_CHECK([input], 0,
 [[-1
 ]])
@@ -240,11 +323,12 @@
 AT_CLEANUP
 ])
 
-m4_foreach([b4_skel], [[yacc.c], [glr.c], [lalr1.cc], [glr.cc], [lalr1.d]],
+AT_FOR_EACH_SKEL(
 [AT_TEST([%skeleton "]b4_skel["])
  AT_TEST([%skeleton "]b4_skel[" %define api.token.raw])])
 
 AT_TEST([%skeleton "lalr1.cc" %define api.token.raw %define api.value.type variant %define api.token.constructor])])
 
+m4_popdef([AT_MAIN_DEFINE(java)])
 m4_popdef([AT_MAIN_DEFINE(d)])
 m4_popdef([AT_TEST])
diff --git a/tests/sets.at b/tests/sets.at
index a694cc9..2de00d5 100644
--- a/tests/sets.at
+++ b/tests/sets.at
@@ -1,6 +1,6 @@
 # Exercising Bison Grammar Sets.                      -*- Autotest -*-
 
-# Copyright (C) 2001-2002, 2005, 2007, 2009-2015, 2018-2019 Free
+# Copyright (C) 2001-2002, 2005, 2007, 2009-2015, 2018-2021 Free
 # Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 
 AT_BANNER([[Grammar Sets (Firsts etc.).]])
@@ -275,7 +275,7 @@
 # So we can "register" way more images than ngotos, leading to a crash
 # (heap buffer overflow).
 #
-# http://lists.gnu.org/archive/html/bug-bison/2019-03/msg00007.html
+# https://lists.gnu.org/r/bug-bison/2019-03/msg00007.html
 
 AT_DATA([input.y],
 [[%%
@@ -285,6 +285,7 @@
 
 AT_BISON_CHECK([[-fcaret input.y]], [], [],
 [[input.y: warning: 5 reduce/reduce conflicts [-Wconflicts-rr]
+input.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples
 input.y:2.14-17: warning: rule useless in parser due to conflicts [-Wother]
     2 | expr: term | term | term | term | term | term
       |              ^~~~
@@ -322,12 +323,13 @@
 ]])
 
 AT_BISON_CHECK([[--trace=grammar -o input.c input.y]], [], [],
-[[input.y: warning: 1 nonterminal useless in grammar [-Wother]
+[[bison (GNU Bison) ]AT_PACKAGE_VERSION[
+input.y: warning: 1 nonterminal useless in grammar [-Wother]
 input.y: warning: 1 rule useless in grammar [-Wother]
 input.y:4.1-7: warning: nonterminal useless in grammar: useless [-Wother]
 Reduced Grammar
 
-ntokens = 7, nvars = 4, nsyms = 11, nrules = 6, nritems = 17
+ntokens = 7, nnterms = 4, nsyms = 11, nrules = 6, nritems = 17
 
 Tokens
 ------
@@ -342,8 +344,8 @@
     6      0       0  "num"
 
 
-Non terminals
--------------
+Nonterminals
+------------
 
 Value  Tag
     7  $accept
@@ -408,9 +410,10 @@
 ]])
 
 AT_BISON_CHECK([[--trace=grammar -o input.c input.y]], [], [],
-[[Reduced Grammar
+[[bison (GNU Bison) ]AT_PACKAGE_VERSION[
+Reduced Grammar
 
-ntokens = 10, nvars = 2, nsyms = 12, nrules = 8, nritems = 29
+ntokens = 10, nnterms = 2, nsyms = 12, nrules = 8, nritems = 29
 
 Tokens
 ------
@@ -428,8 +431,8 @@
     9      0       0  "exp"
 
 
-Non terminals
--------------
+Nonterminals
+------------
 
 Value  Tag
    10  $accept
diff --git a/tests/skeletons.at b/tests/skeletons.at
index 7dbf2ba..0ed1102 100644
--- a/tests/skeletons.at
+++ b/tests/skeletons.at
@@ -1,6 +1,6 @@
 # Checking skeleton support.                     -*- Autotest -*-
 
-# Copyright (C) 2007, 2009-2015, 2018-2019 Free Software Foundation,
+# Copyright (C) 2007, 2009-2015, 2018-2021 Free Software Foundation,
 # Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[Skeleton Support.]])
 
@@ -120,13 +120,13 @@
 AT_BISON_CHECK([[--skeleton=yacc.c -o input-cmd-line.c input-cmd-line.y]])
 AT_COMPILE([[input-cmd-line]])
 AT_PARSER_CHECK([[input-cmd-line]], [[1]], [],
-[[syntax error, unexpected 'a', expecting $end
+[[syntax error, unexpected 'a', expecting end of file
 ]])
 
 AT_BISON_CHECK([[-o input-gram.c input-gram.y]])
 AT_COMPILE([[input-gram]])
 AT_PARSER_CHECK([[input-gram]], [[1]], [],
-[[syntax error, unexpected 'a', expecting $end
+[[syntax error, unexpected 'a', expecting end of file
 ]])
 
 m4_popdef([AT_GRAM])
diff --git a/tests/synclines.at b/tests/synclines.at
index 9b58560..47afae5 100644
--- a/tests/synclines.at
+++ b/tests/synclines.at
@@ -1,6 +1,6 @@
 # Executing Actions.                               -*- Autotest -*-
 
-# Copyright (C) 2002, 2004-2005, 2007, 2009-2015, 2018-2019 Free
+# Copyright (C) 2002, 2004-2005, 2007, 2009-2015, 2018-2021 Free
 # Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[Sync Lines.]])
 
@@ -25,9 +25,7 @@
 # normalized output.  Ignore the exit status, since some compilers
 # (e.g. c89 on IRIX 6.5) trigger warnings on '#error', instead of
 # errors.
-m4_define([_AT_SYNCLINES_COMPILE],
-[AT_CHECK([$CC $CFLAGS $CPPFLAGS -c $1], [ignore], [], [stderr])
-
+#
 # Transform the file 'stderr' into something like this:
 #
 #   input.y:4: #error "4"
@@ -97,6 +95,8 @@
 #    syncline.c:4:2: error: #error "4"
 #        4 | #error "4"
 #          |  ^~~~~
+m4_define([_AT_SYNCLINES_COMPILE],
+[AT_CHECK([$CC $CFLAGS $CPPFLAGS -c $1], [ignore], [], [stderr])
 AT_CHECK([["$PERL" -p -0777 - stderr <<\EOF || exit 77
   # Remove left-hand margin.
   s/^[\d ]{6}\| //gm;
@@ -437,7 +437,7 @@
 AT_CLEANUP
 ])
 
-m4_map_args([AT_TEST], [yacc.c], [glr.c], [lalr1.cc], [glr.cc])
+m4_map_args([AT_TEST], [yacc.c], [glr.c], [lalr1.cc], [glr.cc], [glr2.cc])
 
 m4_popdef([AT_TEST])
 
@@ -452,9 +452,9 @@
 m4_pushdef([AT_TEST],
 [AT_SETUP([%no-lines: $1])
 
-AT_BISON_OPTION_PUSHDEFS([%skeleton "$1" %defines])
+AT_BISON_OPTION_PUSHDEFS([%skeleton "$1" %header])
 AT_DATA_GRAMMAR([input.y],
-[[%skeleton "$1" %defines
+[[%skeleton "$1" %header
 %{
 ]AT_YYERROR_DECLARE_EXTERN[
 ]AT_YYLEX_DECLARE_EXTERN[
@@ -494,7 +494,7 @@
 AT_CLEANUP
 ])
 
-m4_map_args([AT_TEST], [yacc.c], [glr.c], [lalr1.cc], [glr.cc])
+m4_map_args([AT_TEST], [yacc.c], [glr.c], [lalr1.cc], [glr.cc], [glr2.cc])
 
 m4_popdef([AT_TEST])
 
diff --git a/tests/testsuite b/tests/testsuite
index d04c654..f23681b 100755
--- a/tests/testsuite
+++ b/tests/testsuite
Binary files differ
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 4ccbfd1..56c54c1 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -1,6 +1,6 @@
 # Test suite for GNU Bison.                             -*- Autotest -*-
 
-# Copyright (C) 2000-2004, 2006-2007, 2009-2015, 2018-2019 Free Software
+# Copyright (C) 2000-2004, 2006-2007, 2009-2015, 2018-2021 Free Software
 # Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -14,8 +14,10 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
+# Basic M4 macros.
+m4_include([m4.at])
 
 # Resistance to user bugs.
 m4_include([input.at])
@@ -26,7 +28,7 @@
 # Output file names.
 m4_include([output.at])
 
-# Diagnostics.
+# Bison diagnostics.
 m4_include([diagnostics.at])
 
 # Skeleton support.
@@ -44,6 +46,9 @@
 # Conflicts detection and resolution.
 m4_include([conflicts.at])
 
+# Counterexaple generation.
+m4_include([counterexample.at])
+
 # Support for #lines.
 m4_include([synclines.at])
 
@@ -82,6 +87,9 @@
 m4_include([java.at])
 m4_include([javapush.at])
 
+# Parsers in D
+m4_include([d.at])
+
 # GLR.
 # C++ types, simplified
 m4_include([cxx-type.at])
diff --git a/tests/torture.at b/tests/torture.at
index a8ba0cc..9afc085 100644
--- a/tests/torture.at
+++ b/tests/torture.at
@@ -1,6 +1,6 @@
 # Torturing Bison.                                    -*- Autotest -*-
 
-# Copyright (C) 2001-2002, 2004-2007, 2009-2015, 2018-2019 Free Software
+# Copyright (C) 2001-2002, 2004-2007, 2009-2015, 2018-2021 Free Software
 # Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[Torture Tests.]])
 
@@ -283,11 +283,11 @@
 ## Many lookahead tokens.   ##
 ## ------------------------ ##
 
-# AT_DATA_LOOKAHEAD_TOKENS_GRAMMAR(FILE-NAME, SIZE)
-# --------------------------------------------------
+# AT_DATA_LOOKAHEADS_GRAMMAR(FILE-NAME, SIZE)
+# -------------------------------------------
 # Create FILE-NAME, containing a self checking parser for a grammar
 # requiring SIZE lookahead tokens.
-m4_define([AT_DATA_LOOKAHEAD_TOKENS_GRAMMAR],
+m4_define([AT_DATA_LOOKAHEADS_GRAMMAR],
 [AT_BISON_OPTION_PUSHDEFS
 AT_DATA([[gengram.pl]],
 [[#! /usr/bin/perl -w
@@ -384,7 +384,7 @@
 
 AT_SETUP([Many lookahead tokens])
 
-AT_DATA_LOOKAHEAD_TOKENS_GRAMMAR([input.y], [1000])
+AT_DATA_LOOKAHEADS_GRAMMAR([input.y], [1000])
 
 # GNU m4 requires about 70 MiB for this test on a 32-bit host.
 # Ask for 200 MiB, which should be plenty even on a 64-bit host.
@@ -404,7 +404,6 @@
 m4_define([AT_DATA_STACK_TORTURE],
 [AT_BISON_OPTION_PUSHDEFS([$2])
 # A grammar of parens growing the stack thanks to right recursion.
-# exp:
 AT_DATA_GRAMMAR([input.y],
 [[%{
 #include <errno.h>
@@ -417,10 +416,9 @@
 %}
 ]$2[
 %define parse.error verbose
-%debug
 %token WAIT_FOR_EOF
 %%
-exp: WAIT_FOR_EOF exp | ;
+exp: WAIT_FOR_EOF exp | %empty;
 %%
 ]AT_YYERROR_DEFINE[
 #include <assert.h>
@@ -457,7 +455,7 @@
   int count;
 ]m4_bmatch([$2], [api.push-pull both],
 [[  yypstate *ps = yypstate_new ();
-]])[  yydebug = 1;
+]])[
   for (count = 0; count < 2; ++count)
     {
       int new_status;
@@ -469,7 +467,7 @@
         status = new_status;
       else
         assert (new_status == status);
-    }]m4_bmatch([$2], [api.push-pull both],[[
+    }]m4_bmatch([$2], [api.push-pull both], [[
   yypstate_delete (ps);]])[
   return status;
 }
diff --git a/tests/types.at b/tests/types.at
index 1c41293..dcdf3fe 100644
--- a/tests/types.at
+++ b/tests/types.at
@@ -1,6 +1,6 @@
 # Value type.                                     -*- Autotest -*-
 
-# Copyright (C) 2013-2015, 2018-2019 Free Software Foundation, Inc.
+# Copyright (C) 2013-2015, 2018-2021 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -13,7 +13,7 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 AT_BANNER([[Value type tests.]])
 
@@ -105,6 +105,7 @@
 ]])
 
 AT_LANG_FOR_EACH_STD([
+  AT_GLR2_CC_IF([AT_REQUIRE_CXX_STD(11, [echo "$at_std not supported"; continue])])
   $7
   AT_FULL_COMPILE([[test]])
   AT_PARSER_CHECK([[test]], 0, [[$6
@@ -123,7 +124,7 @@
 #         $6: RESULT,
 #         $7: REQUIREMENT)
 # --------------------------------------
-# Check with and without %defines, to avoid regressions.  It turns out
+# Check with and without %header, to avoid regressions.  It turns out
 # that in that case yacc.c calls the set-up of the %union twice,
 # because YYSTYPE is defined once in the header, and once in the
 # implementation file (eventually it'd be better to include the header
@@ -131,11 +132,11 @@
 # a second time doubled the side-effects and resulted in a double
 # definition of the union members.
 m4_pushdef([AT_TEST],
-[_AT_TEST([$1],          [$2], [$3], [$4], [$5], [$6], [$7])
- _AT_TEST([$1 %defines], [$2], [$3], [$4], [$5], [$6], [$7])
+[_AT_TEST([$1],         [$2], [$3], [$4], [$5], [$6], [$7])
+ _AT_TEST([$1 %header], [$2], [$3], [$4], [$5], [$6], [$7])
 ])
 
-m4_foreach([b4_skel], [[yacc.c], [glr.c], [lalr1.cc], [glr.cc]],
+m4_foreach([b4_skel], [[yacc.c], [glr.c], [lalr1.cc], [glr.cc], [glr2.cc]],
  [# A built-in type.
   AT_TEST([%skeleton "]b4_skel["
            %define api.value.type {double}],
@@ -235,8 +236,8 @@
             [10 0.2])])
 
   # A Bison-defined union.
-  # The tokens names are not available directly in C++, we use their
-  # user number to keep it simple between C and C++.
+  # The token names are not available directly in C++, we use their
+  # codes to keep it simple between C and C++.
   AT_TEST([%skeleton "]b4_skel["
            %define api.value.type union],
           [%token <int> ONE 101;